From 8a405729f5d39ba49d99dff5b82eaa1d202e80e5 Mon Sep 17 00:00:00 2001 From: Francis Russell Date: Fri, 3 Aug 2012 12:58:46 +0100 Subject: [PATCH] Add laplacian FFC-generated headers. --- laplacian_2d/laplacian_f1_p1_q1_quadrature.h | 1464 +++ laplacian_2d/laplacian_f1_p1_q1_tensor.h | 1415 +++ laplacian_2d/laplacian_f1_p1_q2_quadrature.h | 3392 +++++++ laplacian_2d/laplacian_f1_p1_q2_tensor.h | 3350 +++++++ laplacian_2d/laplacian_f1_p1_q3_quadrature.h | 4595 +++++++++ laplacian_2d/laplacian_f1_p1_q3_tensor.h | 4614 +++++++++ laplacian_2d/laplacian_f1_p1_q4_quadrature.h | 6475 +++++++++++++ laplacian_2d/laplacian_f1_p1_q4_tensor.h | 6592 +++++++++++++ laplacian_2d/laplacian_f1_p2_q1_quadrature.h | 3378 +++++++ laplacian_2d/laplacian_f1_p2_q1_tensor.h | 3323 +++++++ laplacian_2d/laplacian_f1_p2_q2_quadrature.h | 2248 +++++ laplacian_2d/laplacian_f1_p2_q2_tensor.h | 2218 +++++ laplacian_2d/laplacian_f1_p2_q3_quadrature.h | 5374 +++++++++++ laplacian_2d/laplacian_f1_p2_q3_tensor.h | 5390 +++++++++++ laplacian_2d/laplacian_f1_p2_q4_quadrature.h | 7266 ++++++++++++++ laplacian_2d/laplacian_f1_p2_q4_tensor.h | 7368 ++++++++++++++ laplacian_2d/laplacian_f1_p3_q1_quadrature.h | 4584 +++++++++ laplacian_2d/laplacian_f1_p3_q1_tensor.h | 4551 +++++++++ laplacian_2d/laplacian_f1_p3_q2_quadrature.h | 5359 +++++++++++ laplacian_2d/laplacian_f1_p3_q2_tensor.h | 5342 +++++++++++ laplacian_2d/laplacian_f1_p3_q3_quadrature.h | 3478 +++++++ laplacian_2d/laplacian_f1_p3_q3_tensor.h | 3498 +++++++ laplacian_2d/laplacian_f1_p3_q4_quadrature.h | 8466 +++++++++++++++++ laplacian_2d/laplacian_f1_p3_q4_tensor.h | 8584 +++++++++++++++++ laplacian_2d/laplacian_f2_p1_q1_quadrature.h | 1482 +++ laplacian_2d/laplacian_f2_p1_q1_tensor.h | 1449 +++ laplacian_2d/laplacian_f2_p1_q2_quadrature.h | 3404 +++++++ laplacian_2d/laplacian_f2_p1_q2_tensor.h | 3384 +++++++ laplacian_2d/laplacian_f2_p1_q3_quadrature.h | 4622 +++++++++ laplacian_2d/laplacian_f2_p1_q3_tensor.h | 4648 +++++++++ laplacian_2d/laplacian_f2_p1_q4_quadrature.h | 6514 +++++++++++++ laplacian_2d/laplacian_f2_p1_q4_tensor.h | 6626 +++++++++++++ laplacian_2d/laplacian_f2_p2_q1_quadrature.h | 3396 +++++++ laplacian_2d/laplacian_f2_p2_q1_tensor.h | 3417 +++++++ laplacian_2d/laplacian_f2_p2_q2_quadrature.h | 2278 +++++ laplacian_2d/laplacian_f2_p2_q2_tensor.h | 2348 +++++ laplacian_2d/laplacian_f2_p2_q3_quadrature.h | 5425 +++++++++++ laplacian_2d/laplacian_f2_p2_q3_tensor.h | 5520 +++++++++++ laplacian_2d/laplacian_f2_p2_q4_quadrature.h | 7311 ++++++++++++++ laplacian_2d/laplacian_f2_p2_q4_tensor.h | 7498 +++++++++++++++ laplacian_2d/laplacian_f2_p3_q1_quadrature.h | 4608 +++++++++ laplacian_2d/laplacian_f2_p3_q1_tensor.h | 4873 ++++++++++ laplacian_2d/laplacian_f2_p3_q2_quadrature.h | 5425 +++++++++++ laplacian_2d/laplacian_f2_p3_q2_tensor.h | 5712 +++++++++++ laplacian_2d/laplacian_f2_p3_q3_quadrature.h | 3550 +++++++ laplacian_2d/laplacian_f2_p3_q3_tensor.h | 3868 ++++++++ laplacian_2d/laplacian_f2_p3_q4_quadrature.h | 8550 +++++++++++++++++ laplacian_2d/laplacian_f2_p3_q4_tensor.h | 8954 ++++++++++++++++++ laplacian_2d/laplacian_f3_p1_q1_quadrature.h | 1500 +++ laplacian_2d/laplacian_f3_p1_q1_tensor.h | 1531 +++ laplacian_2d/laplacian_f3_p1_q2_quadrature.h | 3419 +++++++ laplacian_2d/laplacian_f3_p1_q2_tensor.h | 3466 +++++++ laplacian_2d/laplacian_f3_p1_q3_quadrature.h | 4646 +++++++++ laplacian_2d/laplacian_f3_p1_q3_tensor.h | 4730 +++++++++ laplacian_2d/laplacian_f3_p1_q4_quadrature.h | 6526 +++++++++++++ laplacian_2d/laplacian_f3_p1_q4_tensor.h | 6708 +++++++++++++ laplacian_2d/laplacian_f3_p2_q1_quadrature.h | 3420 +++++++ laplacian_2d/laplacian_f3_p2_q1_tensor.h | 3907 ++++++++ laplacian_2d/laplacian_f3_p2_q2_quadrature.h | 2329 +++++ laplacian_2d/laplacian_f3_p2_q2_tensor.h | 3078 ++++++ laplacian_2d/laplacian_f3_p2_q3_quadrature.h | 5470 +++++++++++ laplacian_2d/laplacian_f3_p2_q3_tensor.h | 6250 ++++++++++++ 62 files changed, 284166 insertions(+) create mode 100644 laplacian_2d/laplacian_f1_p1_q1_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p1_q1_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p1_q2_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p1_q2_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p1_q3_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p1_q3_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p1_q4_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p1_q4_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p2_q1_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p2_q1_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p2_q2_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p2_q2_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p2_q3_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p2_q3_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p2_q4_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p2_q4_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p3_q1_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p3_q1_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p3_q2_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p3_q2_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p3_q3_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p3_q3_tensor.h create mode 100644 laplacian_2d/laplacian_f1_p3_q4_quadrature.h create mode 100644 laplacian_2d/laplacian_f1_p3_q4_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p1_q1_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p1_q1_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p1_q2_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p1_q2_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p1_q3_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p1_q3_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p1_q4_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p1_q4_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p2_q1_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p2_q1_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p2_q2_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p2_q2_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p2_q3_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p2_q3_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p2_q4_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p2_q4_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p3_q1_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p3_q1_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p3_q2_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p3_q2_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p3_q3_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p3_q3_tensor.h create mode 100644 laplacian_2d/laplacian_f2_p3_q4_quadrature.h create mode 100644 laplacian_2d/laplacian_f2_p3_q4_tensor.h create mode 100644 laplacian_2d/laplacian_f3_p1_q1_quadrature.h create mode 100644 laplacian_2d/laplacian_f3_p1_q1_tensor.h create mode 100644 laplacian_2d/laplacian_f3_p1_q2_quadrature.h create mode 100644 laplacian_2d/laplacian_f3_p1_q2_tensor.h create mode 100644 laplacian_2d/laplacian_f3_p1_q3_quadrature.h create mode 100644 laplacian_2d/laplacian_f3_p1_q3_tensor.h create mode 100644 laplacian_2d/laplacian_f3_p1_q4_quadrature.h create mode 100644 laplacian_2d/laplacian_f3_p1_q4_tensor.h create mode 100644 laplacian_2d/laplacian_f3_p2_q1_quadrature.h create mode 100644 laplacian_2d/laplacian_f3_p2_q1_tensor.h create mode 100644 laplacian_2d/laplacian_f3_p2_q2_quadrature.h create mode 100644 laplacian_2d/laplacian_f3_p2_q2_tensor.h create mode 100644 laplacian_2d/laplacian_f3_p2_q3_quadrature.h create mode 100644 laplacian_2d/laplacian_f3_p2_q3_tensor.h diff --git a/laplacian_2d/laplacian_f1_p1_q1_quadrature.h b/laplacian_2d/laplacian_f1_p1_q1_quadrature.h new file mode 100644 index 0000000..4f97dd2 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p1_q1_quadrature.h @@ -0,0 +1,1464 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P1_Q1_QUADRATURE_H +#define __LAPLACIAN_F1_P1_Q1_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q1_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q1_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q1_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q1_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q1_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q1_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q1_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q1_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p1_q1_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p1_q1_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q1_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W1 = 0.5; + // Quadrature points on the UFC reference element: (0.333333333333333, 0.333333333333333) + + // Value of basis functions at quadrature points. + static const double FE0[1][3] = \ + {{0.333333333333333, 0.333333333333333, 0.333333333333333}}; + + static const double FE0_D01[1][2] = \ + {{-1.0, 1.0}}; + + // Array of non-zero columns + static const unsigned int nzc1[2] = {0, 1}; + + // Array of non-zero columns + static const unsigned int nzc0[2] = {0, 2}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 9; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 15. + double G[3]; + G[0] = W1*det*(K_10*K_10 + K_11*K_11); + G[1] = W1*det*(K_00*K_10 + K_01*K_11); + G[2] = W1*det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 57 + // Only 1 integration point, omitting IP loop. + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 6 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[0][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 3 + double I[3]; + // Number of operations: 1 + I[0] = F0*G[0]; + + // Number of operations: 1 + I[1] = F0*G[1]; + + // Number of operations: 1 + I[2] = F0*G[2]; + + + // Number of operations for primary indices: 48 + for (unsigned int j = 0; j < 2; j++) + { + for (unsigned int k = 0; k < 2; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc0[k]] += FE0_D01[0][j]*FE0_D01[0][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc1[k]] += FE0_D01[0][j]*FE0_D01[0][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc0[k]] += FE0_D01[0][j]*FE0_D01[0][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc1[k]] += FE0_D01[0][j]*FE0_D01[0][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p1_q1_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p1_q1_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q1_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q1_quadrature_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f1_p1_q1_quadrature_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f1_p1_q1_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q1_quadrature_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f1_p1_q1_quadrature_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f1_p1_q1_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q1_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p1_q1_tensor.h b/laplacian_2d/laplacian_f1_p1_q1_tensor.h new file mode 100644 index 0000000..56f4f23 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p1_q1_tensor.h @@ -0,0 +1,1415 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P1_Q1_TENSOR_H +#define __LAPLACIAN_F1_P1_Q1_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q1_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q1_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q1_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q1_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q1_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q1_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q1_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q1_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p1_q1_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p1_q1_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q1_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 30 + // Number of operations (multiply-add pairs) for tensor contraction: 30 + // Total number of operations (multiply-add pairs): 71 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[1] = -0.166666666666667*G0_0_0_0 - 0.166666666666667*G0_0_1_0 - 0.166666666666667*G0_1_0_0 - 0.166666666666667*G0_1_1_0 - 0.166666666666667*G0_2_0_0 - 0.166666666666667*G0_2_1_0; + A[5] = 0.166666666666667*G0_0_0_1 + 0.166666666666667*G0_1_0_1 + 0.166666666666667*G0_2_0_1; + A[0] = -A[1] + 0.166666666666667*G0_0_0_1 + 0.166666666666667*G0_0_1_1 + 0.166666666666667*G0_1_0_1 + 0.166666666666667*G0_1_1_1 + 0.166666666666667*G0_2_0_1 + 0.166666666666667*G0_2_1_1; + A[7] = 0.166666666666667*G0_0_1_0 + 0.166666666666667*G0_1_1_0 + 0.166666666666667*G0_2_1_0; + A[6] = -A[7] - 0.166666666666667*G0_0_1_1 - 0.166666666666667*G0_1_1_1 - 0.166666666666667*G0_2_1_1; + A[8] = 0.166666666666667*G0_0_1_1 + 0.166666666666667*G0_1_1_1 + 0.166666666666667*G0_2_1_1; + A[2] = -A[8] - 0.166666666666667*G0_0_0_1 - 0.166666666666667*G0_1_0_1 - 0.166666666666667*G0_2_0_1; + A[4] = 0.166666666666667*G0_0_0_0 + 0.166666666666667*G0_1_0_0 + 0.166666666666667*G0_2_0_0; + A[3] = -A[4] - 0.166666666666667*G0_0_0_1 - 0.166666666666667*G0_1_0_1 - 0.166666666666667*G0_2_0_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p1_q1_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p1_q1_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q1_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q1_tensor_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f1_p1_q1_tensor_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f1_p1_q1_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q1_tensor_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f1_p1_q1_tensor_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f1_p1_q1_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q1_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p1_q2_quadrature.h b/laplacian_2d/laplacian_f1_p1_q2_quadrature.h new file mode 100644 index 0000000..56631f0 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p1_q2_quadrature.h @@ -0,0 +1,3392 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P1_Q2_QUADRATURE_H +#define __LAPLACIAN_F1_P1_Q2_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q2_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q2_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q2_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q2_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q2_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q2_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q2_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q2_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q2_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q2_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q2_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q2_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p1_q2_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p1_q2_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W6[6] = {0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333}; + // Quadrature points on the UFC reference element: (0.659027622374092, 0.231933368553031), (0.659027622374092, 0.109039009072877), (0.231933368553031, 0.659027622374092), (0.231933368553031, 0.109039009072877), (0.109039009072877, 0.659027622374092), (0.109039009072877, 0.231933368553031) + + // Value of basis functions at quadrature points. + static const double FE0[6][3] = \ + {{0.109039009072877, 0.659027622374092, 0.231933368553031}, + {0.231933368553031, 0.659027622374092, 0.109039009072877}, + {0.109039009072877, 0.231933368553031, 0.659027622374092}, + {0.659027622374092, 0.231933368553031, 0.109039009072877}, + {0.231933368553031, 0.109039009072877, 0.659027622374092}, + {0.659027622374092, 0.109039009072877, 0.231933368553031}}; + + static const double FE1_D01[6][5] = \ + {{0.563843963708492, -0.0722665257878755, 2.63611048949637, -0.491577437920616, -2.63611048949637}, + {0.0722665257878762, -0.563843963708492, 2.63611048949637, 0.491577437920617, -2.63611048949637}, + {0.563843963708492, 1.63611048949637, 0.927733474212124, -2.19995445320486, -0.927733474212124}, + {-1.63611048949637, -0.563843963708492, 0.927733474212123, 2.19995445320486, -0.927733474212124}, + {0.0722665257878759, 1.63611048949637, 0.436156036291507, -1.70837701528424, -0.436156036291507}, + {-1.63611048949637, -0.0722665257878757, 0.436156036291508, 1.70837701528424, -0.436156036291507}}; + + // Array of non-zero columns + static const unsigned int nzc0[5] = {0, 2, 3, 4, 5}; + + static const double FE1_D10[6][5] = \ + {{0.563843963708492, 1.63611048949637, 0.927733474212124, -0.927733474212124, -2.19995445320486}, + {0.0722665257878758, 1.63611048949637, 0.436156036291507, -0.436156036291507, -1.70837701528424}, + {0.563843963708492, -0.0722665257878758, 2.63611048949637, -2.63611048949637, -0.491577437920616}, + {-1.63611048949637, -0.0722665257878757, 0.436156036291507, -0.436156036291507, 1.70837701528424}, + {0.0722665257878762, -0.563843963708492, 2.63611048949637, -2.63611048949637, 0.491577437920617}, + {-1.63611048949637, -0.563843963708492, 0.927733474212124, -0.927733474212124, 2.19995445320486}}; + + // Array of non-zero columns + static const unsigned int nzc1[5] = {0, 1, 3, 4, 5}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 36; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 1872 + for (unsigned int ip = 0; ip < 6; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 6 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W6[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W6[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W6[ip]; + + + // Number of operations for primary indices: 300 + for (unsigned int j = 0; j < 5; j++) + { + for (unsigned int k = 0; k < 5; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p1_q2_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p1_q2_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q2_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q2_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q2_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q2_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q2_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q2_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q2_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p1_q2_tensor.h b/laplacian_2d/laplacian_f1_p1_q2_tensor.h new file mode 100644 index 0000000..9b4b785 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p1_q2_tensor.h @@ -0,0 +1,3350 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P1_Q2_TENSOR_H +#define __LAPLACIAN_F1_P1_Q2_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q2_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q2_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q2_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q2_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q2_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q2_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q2_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q2_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q2_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q2_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q2_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q2_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p1_q2_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p1_q2_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 30 + // Number of operations (multiply-add pairs) for tensor contraction: 173 + // Total number of operations (multiply-add pairs): 214 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[9] = -0.0333333333333335*G0_0_0_0 + 0.1*G0_0_0_1 + 0.1*G0_1_0_0 + 0.466666666666666*G0_1_0_1 - 0.0666666666666664*G0_2_0_0 + 0.1*G0_2_0_1; + A[18] = -A[9] - 0.133333333333333*G0_0_0_0 - 0.1*G0_0_1_0 - 0.1*G0_0_1_1 + 0.133333333333333*G0_1_0_0 + 0.5*G0_1_0_1 + 0.0666666666666664*G0_1_1_0 + 0.0666666666666665*G0_1_1_1 + 0.166666666666666*G0_2_0_1 + 0.0333333333333334*G0_2_1_0 + 0.0333333333333334*G0_2_1_1; + A[13] = -0.0333333333333335*G0_0_1_0 - 0.0666666666666664*G0_1_1_0 - 0.0666666666666665*G0_2_1_0; + A[3] = A[18] + 0.0333333333333329*G0_1_0_1 - 0.0333333333333329*G0_1_1_0 - 0.033333333333333*G0_2_0_1 + 0.033333333333333*G0_2_1_0; + A[17] = -0.0333333333333329*G0_0_1_0 + 0.0333333333333334*G0_0_1_1 + 0.0333333333333329*G0_1_1_0 + 0.0666666666666663*G0_1_1_1 - 0.1*G0_2_1_1; + A[24] = -A[18] - 0.466666666666666*G0_0_1_0 - 0.466666666666666*G0_0_1_1 - 0.0666666666666671*G0_1_1_0 - 0.066666666666667*G0_1_1_1 - 0.133333333333333*G0_2_1_0 - 0.133333333333333*G0_2_1_1; + A[8] = -0.0333333333333335*G0_0_0_1 - 0.0666666666666664*G0_1_0_1 - 0.0666666666666665*G0_2_0_1; + A[11] = -A[9] - 0.2*G0_0_0_0 - 0.266666666666666*G0_1_0_0 - 0.2*G0_2_0_0; + A[30] = -A[18] - 0.466666666666666*G0_0_0_0 - 0.466666666666666*G0_0_0_1 - 0.133333333333333*G0_1_0_0 - 0.133333333333333*G0_1_0_1 - 0.066666666666667*G0_2_0_0 - 0.0666666666666671*G0_2_0_1; + A[4] = -A[3] - 0.466666666666666*G0_0_0_1 - 0.466666666666666*G0_0_1_1 - 0.0666666666666671*G0_1_0_1 - 0.066666666666667*G0_1_1_1 - 0.133333333333333*G0_2_0_1 - 0.133333333333333*G0_2_1_1; + A[7] = 0.1*G0_0_0_0 + 0.3*G0_1_0_0 + 0.1*G0_2_0_0; + A[34] = -0.133333333333333*G0_0_0_0 + 0.399999999999999*G0_0_0_1 + 0.133333333333333*G0_0_1_0 - 0.133333333333333*G0_0_1_1 + 0.133333333333333*G0_1_0_0 + 0.133333333333333*G0_1_0_1 + 0.266666666666666*G0_1_1_0 + 0.133333333333333*G0_2_0_1 + 0.266666666666666*G0_2_1_0 + 0.133333333333333*G0_2_1_1; + A[33] = -A[34] + 0.399999999999999*G0_0_0_1 - 0.4*G0_0_1_1 - 0.399999999999999*G0_1_0_1 - 0.799999999999999*G0_1_1_1 - 0.133333333333333*G0_2_1_1; + A[21] = -A[33] + 0.4*G0_0_0_0 + 0.133333333333333*G0_0_0_1 + 0.133333333333333*G0_1_0_0 - 0.266666666666666*G0_1_0_1 + 0.799999999999998*G0_2_0_0 + 0.133333333333333*G0_2_0_1; + A[0] = A[9] + 0.333333333333333*G0_0_0_0 + 0.2*G0_0_0_1 + 0.3*G0_0_1_0 + 0.3*G0_0_1_1 - 0.366666666666666*G0_1_0_1 + 0.1*G0_1_1_0 + 0.1*G0_1_1_1 + 0.166666666666666*G0_2_0_0 + 0.1*G0_2_1_0 + 0.1*G0_2_1_1; + A[14] = 0.1*G0_0_1_1 + 0.1*G0_1_1_1 + 0.3*G0_2_1_1; + A[10] = -A[9] + 0.066666666666667*G0_0_0_1 + 0.466666666666666*G0_1_0_1 + 0.133333333333333*G0_2_0_1; + A[25] = A[10] + 0.033333333333333*G0_0_0_1 - 0.033333333333333*G0_0_1_0 - 0.033333333333333*G0_2_0_1 + 0.033333333333333*G0_2_1_0; + A[1] = A[25] + 0.033333333333333*G0_0_0_0 + 0.1*G0_0_1_0 + 0.166666666666666*G0_1_0_0 + 0.0666666666666664*G0_1_1_0 - 0.033333333333333*G0_2_0_0; + A[5] = -A[3] - 0.466666666666666*G0_0_0_0 - 0.466666666666666*G0_0_1_0 - 0.133333333333333*G0_1_0_0 - 0.133333333333333*G0_1_1_0 - 0.066666666666667*G0_2_0_0 - 0.0666666666666671*G0_2_1_0; + A[6] = A[10] + 0.033333333333333*G0_0_0_0 + 0.1*G0_0_0_1 + 0.166666666666666*G0_1_0_0 + 0.0666666666666664*G0_1_0_1 - 0.033333333333333*G0_2_0_0; + A[35] = -A[33] + 0.666666666666666*G0_0_0_0 - 0.133333333333333*G0_0_1_0 + 0.399999999999999*G0_1_0_0 + 0.266666666666666*G0_1_1_0 + 0.266666666666667*G0_2_0_0 - 0.133333333333333*G0_2_1_0; + A[23] = A[33] - 0.133333333333333*G0_0_0_1 + 0.133333333333333*G0_0_1_0 + 0.266666666666666*G0_1_0_1 - 0.266666666666666*G0_1_1_0 - 0.133333333333333*G0_2_0_1 + 0.133333333333333*G0_2_1_0; + A[29] = -A[23] + 0.399999999999999*G0_0_1_0 - 0.4*G0_0_1_1 - 0.399999999999999*G0_1_1_0 - 0.799999999999999*G0_1_1_1 - 0.133333333333333*G0_2_1_1; + A[22] = -A[34] - 0.4*G0_0_0_0 + 0.399999999999999*G0_0_0_1 - 0.133333333333333*G0_1_0_0 - 0.799999999999998*G0_2_0_0 - 0.399999999999998*G0_2_0_1; + A[28] = -A[22] - 0.133333333333333*G0_0_1_0 + 0.666666666666666*G0_0_1_1 - 0.133333333333333*G0_1_1_0 + 0.266666666666667*G0_1_1_1 + 0.266666666666666*G0_2_1_0 + 0.399999999999999*G0_2_1_1; + A[19] = -A[25] + 0.066666666666667*G0_0_1_0 + 0.466666666666666*G0_1_1_0 + 0.133333333333333*G0_2_1_0; + A[31] = -A[19] - 0.2*G0_0_0_0 - 0.266666666666666*G0_1_0_0 - 0.2*G0_2_0_0; + A[12] = -A[13] + 0.033333333333333*G0_0_1_0 + 0.0666666666666664*G0_0_1_1 - 0.0333333333333329*G0_1_1_0 + 0.0333333333333335*G0_1_1_1 + 0.0666666666666665*G0_2_1_1; + A[27] = -A[29] - 0.4*G0_0_0_0 + 0.399999999999999*G0_0_1_0 - 0.133333333333333*G0_1_0_0 - 0.799999999999998*G0_2_0_0 - 0.399999999999998*G0_2_1_0; + A[15] = -A[17] + 0.0666666666666671*G0_0_1_0 + 0.133333333333333*G0_1_1_0 + 0.466666666666666*G0_2_1_0; + A[16] = -A[15] - 0.2*G0_0_1_1 - 0.2*G0_1_1_1 - 0.266666666666666*G0_2_1_1; + A[32] = A[17] - 0.0333333333333329*G0_0_0_1 + 0.0333333333333329*G0_0_1_0 + 0.0333333333333329*G0_1_0_1 - 0.0333333333333329*G0_1_1_0; + A[20] = -A[32] + 0.0666666666666671*G0_0_0_1 + 0.133333333333333*G0_1_0_1 + 0.466666666666666*G0_2_0_1; + A[26] = -A[20] - 0.2*G0_0_1_1 - 0.2*G0_1_1_1 - 0.266666666666666*G0_2_1_1; + A[2] = A[32] + 0.1*G0_0_0_1 + 0.033333333333333*G0_0_1_1 - 0.0333333333333328*G0_1_1_1 + 0.0666666666666665*G0_2_0_1 + 0.166666666666666*G0_2_1_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p1_q2_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p1_q2_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q2_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q2_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q2_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q2_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q2_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q2_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q2_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q2_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p1_q3_quadrature.h b/laplacian_2d/laplacian_f1_p1_q3_quadrature.h new file mode 100644 index 0000000..0f1af03 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p1_q3_quadrature.h @@ -0,0 +1,4595 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P1_Q3_QUADRATURE_H +#define __LAPLACIAN_F1_P1_Q3_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q3_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q3_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q3_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q3_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q3_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q3_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q3_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q3_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q3_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q3_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q3_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q3_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p1_q3_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p1_q3_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W7[7] = {0.1125, 0.0629695902724136, 0.0629695902724136, 0.0629695902724136, 0.0661970763942531, 0.0661970763942531, 0.0661970763942531}; + // Quadrature points on the UFC reference element: (0.333333333333333, 0.333333333333333), (0.797426985353087, 0.101286507323456), (0.101286507323456, 0.797426985353087), (0.101286507323456, 0.101286507323456), (0.0597158717897698, 0.470142064105115), (0.470142064105115, 0.0597158717897698), (0.470142064105115, 0.470142064105115) + + // Value of basis functions at quadrature points. + static const double FE0[7][3] = \ + {{0.333333333333333, 0.333333333333333, 0.333333333333333}, + {0.101286507323456, 0.797426985353087, 0.101286507323456}, + {0.101286507323457, 0.101286507323456, 0.797426985353087}, + {0.797426985353087, 0.101286507323456, 0.101286507323456}, + {0.470142064105115, 0.0597158717897698, 0.470142064105115}, + {0.470142064105115, 0.470142064105115, 0.0597158717897697}, + {0.0597158717897699, 0.470142064105115, 0.470142064105115}}; + + static const double FE1_D01[7][9] = \ + {{0.5, -0.5, 0.0, 1.5, -1.5, 1.5, -1.5, 0.0, 0.0}, + {-0.226917347726984, 0.226917347726984, 4.99609082499683, -1.40766939090794, -0.138495913638092, 0.138495913638091, 1.40766939090794, -4.99609082499683, 0.0}, + {-0.226917347726985, 2.40766939090794, -0.317293369317461, 1.7249627602254, 1.09037602159048, -3.27112806477143, 0.178797455679371, 0.317293369317461, -1.90376021590477}, + {-2.40766939090794, 0.226917347726985, -0.317293369317461, -0.178797455679372, 3.27112806477143, -1.09037602159048, -1.7249627602254, 0.317293369317461, 1.90376021590477}, + {0.247325510992291, -0.247325510992291, -0.220580620915199, 0.489302043969162, -2.98395306595374, 2.98395306595375, -0.489302043969162, 0.2205806209152, 0.0}, + {0.24732551099229, 0.510697956030836, 0.868313777480728, -1.35761582144989, 0.379011733511564, -1.13703520053469, -3.85226684343447, -0.868313777480728, 5.20988266488437}, + {-0.510697956030836, -0.247325510992291, 0.868313777480726, 3.85226684343447, 1.13703520053469, -0.379011733511561, 1.35761582144989, -0.868313777480726, -5.20988266488436}}; + + // Array of non-zero columns + static const unsigned int nzc0[9] = {0, 2, 3, 4, 5, 6, 7, 8, 9}; + + static const double FE1_D10[7][9] = \ + {{0.5, -0.5, 1.5, 0.0, -1.5, 0.0, -1.5, 1.5, 0.0}, + {-0.226917347726985, 2.40766939090794, 1.7249627602254, -0.317293369317461, 0.178797455679369, 0.317293369317462, 1.09037602159047, -3.27112806477143, -1.90376021590477}, + {-0.226917347726985, 0.226917347726985, -1.40766939090794, 4.99609082499683, 1.40766939090794, -4.99609082499683, -0.138495913638092, 0.13849591363809, 0.0}, + {-2.40766939090794, 0.226917347726985, -0.178797455679371, -0.317293369317462, -1.7249627602254, 0.317293369317462, 3.27112806477143, -1.09037602159048, 1.90376021590477}, + {0.24732551099229, 0.510697956030837, -1.35761582144989, 0.868313777480726, -3.85226684343447, -0.868313777480727, 0.379011733511565, -1.13703520053469, 5.20988266488436}, + {0.247325510992291, -0.247325510992291, 0.489302043969163, -0.2205806209152, -0.489302043969163, 0.2205806209152, -2.98395306595375, 2.98395306595375, 0.0}, + {-0.510697956030836, -0.247325510992291, 3.85226684343447, 0.86831377748073, 1.35761582144989, -0.868313777480728, 1.13703520053469, -0.379011733511563, -5.20988266488436}}; + + // Array of non-zero columns + static const unsigned int nzc1[9] = {0, 1, 3, 4, 5, 6, 7, 8, 9}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 100; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 6888 + for (unsigned int ip = 0; ip < 7; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 6 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W7[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W7[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W7[ip]; + + + // Number of operations for primary indices: 972 + for (unsigned int j = 0; j < 9; j++) + { + for (unsigned int k = 0; k < 9; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p1_q3_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p1_q3_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q3_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q3_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q3_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q3_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q3_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q3_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q3_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p1_q3_tensor.h b/laplacian_2d/laplacian_f1_p1_q3_tensor.h new file mode 100644 index 0000000..5d08911 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p1_q3_tensor.h @@ -0,0 +1,4614 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P1_Q3_TENSOR_H +#define __LAPLACIAN_F1_P1_Q3_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q3_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q3_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q3_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q3_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q3_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q3_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q3_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q3_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q3_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q3_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q3_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q3_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p1_q3_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p1_q3_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 30 + // Number of operations (multiply-add pairs) for tensor contraction: 580 + // Total number of operations (multiply-add pairs): 621 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[73] = -0.144642857142857*G0_0_0_0 - 0.0964285714285714*G0_0_0_1 - 0.0723214285714285*G0_0_1_0 - 0.0241071428571432*G0_0_1_1 + 0.0964285714285709*G0_1_0_0 + 0.216964285714285*G0_1_0_1 + 0.144642857142857*G0_1_1_0 + 0.289285714285713*G0_1_1_1 + 0.0482142857142854*G0_2_0_0 + 0.0482142857142855*G0_2_0_1 + 0.096428571428571*G0_2_1_0 + 0.0723214285714283*G0_2_1_1; + A[7] = -A[73] - 0.591964285714286*G0_0_0_0 + 0.0455357142857144*G0_0_0_1 - 0.519642857142857*G0_0_1_0 + 0.117857142857143*G0_0_1_1 - 0.034821428571429*G0_1_0_0 + 0.147321428571428*G0_1_0_1 + 0.0133928571428567*G0_1_1_0 + 0.219642857142856*G0_1_1_1 - 0.0482142857142859*G0_2_0_0 + 0.0133928571428571*G0_2_0_1 + 0.0374999999999999*G0_2_1_1; + A[16] = -0.0133928571428572*G0_0_0_0 + 0.0133928571428571*G0_0_0_1 + 0.0348214285714286*G0_1_0_0 - 0.0589285714285716*G0_2_0_0 - 0.0133928571428572*G0_2_0_1; + A[37] = A[73] + 0.024107142857143*G0_0_0_1 - 0.024107142857143*G0_0_1_0 - 0.072321428571428*G0_1_0_1 + 0.072321428571428*G0_1_1_0 + 0.0482142857142855*G0_2_0_1 - 0.0482142857142855*G0_2_1_0; + A[25] = 0.0508928571428572*G0_0_1_0 + 0.109821428571429*G0_0_1_1 + 0.0348214285714286*G0_1_1_0 + 0.0482142857142857*G0_1_1_1 + 0.214285714285714*G0_2_1_0 + 0.179464285714286*G0_2_1_1; + A[55] = A[73] + 0.867857142857143*G0_0_0_0 + 0.265178571428571*G0_0_0_1 + 0.241071428571428*G0_0_1_0 + 0.940178571428572*G0_0_1_1 + 0.144642857142857*G0_1_0_0 - 0.0723214285714278*G0_1_0_1 - 0.0482142857142848*G0_1_1_1 + 0.675*G0_2_0_0 + 0.482142857142857*G0_2_0_1 + 0.433928571428571*G0_2_1_0 + 0.458035714285714*G0_2_1_1; + A[11] = 0.0595238095238095*G0_0_0_0 + 0.305952380952381*G0_1_0_0 + 0.0595238095238095*G0_2_0_0; + A[93] = -0.3375*G0_0_0_0 - 0.144642857142857*G0_0_0_1 + 0.0964285714285718*G0_0_1_1 - 0.819642857142856*G0_1_0_0 - 0.626785714285714*G0_1_0_1 - 0.530357142857142*G0_1_1_0 - 0.867857142857142*G0_2_0_0 - 0.241071428571428*G0_2_0_1 - 0.482142857142856*G0_2_1_0 - 0.0964285714285712*G0_2_1_1; + A[75] = A[37] - 0.0482142857142858*G0_0_0_0 + 0.626785714285714*G0_0_0_1 + 0.458035714285714*G0_0_1_0 - 0.16875*G0_0_1_1 + 0.048214285714286*G0_1_0_0 + 0.0241071428571437*G0_1_1_0 - 0.241071428571428*G0_1_1_1 + 0.0482142857142858*G0_2_0_1 + 0.192857142857143*G0_2_1_0 + 0.0723214285714285*G0_2_1_1; + A[1] = -0.0380952380952382*G0_0_0_0 - 0.0380952380952381*G0_0_1_0 - 0.0380952380952381*G0_1_0_0 - 0.038095238095238*G0_1_1_0 - 0.0113095238095238*G0_2_0_0 - 0.0113095238095238*G0_2_1_0; + A[78] = -A[73] - 0.723214285714286*G0_0_0_0 - 0.433928571428572*G0_0_1_0 - 0.482142857142857*G0_1_0_0 - 0.530357142857143*G0_1_1_0 - 0.144642857142857*G0_2_0_0 - 0.0482142857142859*G0_2_1_0; + A[21] = 0.0113095238095238*G0_0_1_0 + 0.038095238095238*G0_1_1_0 + 0.0380952380952381*G0_2_1_0; + A[15] = A[16] - 0.0321428571428572*G0_0_0_0 + 0.0321428571428573*G0_2_0_0; + A[51] = A[15] - 0.0133928571428573*G0_0_0_1 + 0.0133928571428573*G0_0_1_0 + 0.0133928571428571*G0_2_0_1 - 0.0133928571428571*G0_2_1_0; + A[22] = 0.0595238095238096*G0_0_1_1 + 0.0595238095238095*G0_1_1_1 + 0.305952380952381*G0_2_1_1; + A[10] = -0.0380952380952382*G0_0_0_0 - 0.0380952380952381*G0_0_0_1 - 0.0380952380952381*G0_1_0_0 - 0.038095238095238*G0_1_0_1 - 0.0113095238095238*G0_2_0_0 - 0.0113095238095238*G0_2_0_1; + A[35] = A[37] + 0.241071428571429*G0_0_0_0 + 0.0964285714285712*G0_0_0_1 + 0.144642857142857*G0_0_1_0 - 0.0964285714285713*G0_1_0_1 - 0.144642857142857*G0_1_1_0 - 0.289285714285713*G0_1_1_1 + 0.0964285714285716*G0_2_0_0 - 0.0482142857142855*G0_2_1_1; + A[85] = -A[35] + 0.192857142857143*G0_0_0_0 - 0.0964285714285713*G0_0_0_1 - 0.0482142857142858*G0_1_0_0 + 0.192857142857143*G0_2_0_0 + 0.0964285714285712*G0_2_0_1; + A[58] = A[85] + 0.0723214285714284*G0_0_0_1 - 0.0723214285714284*G0_0_1_0 - 0.0241071428571426*G0_1_0_1 + 0.0241071428571426*G0_1_1_0 - 0.0482142857142858*G0_2_0_1 + 0.0482142857142858*G0_2_1_0; + A[36] = A[35] - 0.024107142857143*G0_0_0_0 - 0.0482142857142854*G0_0_0_1 - 0.0241071428571426*G0_0_1_0 - 0.120535714285714*G0_1_0_0 + 0.144642857142857*G0_2_0_0 + 0.0482142857142863*G0_2_0_1 + 0.0241071428571427*G0_2_1_0; + A[86] = -A[36] + 0.0964285714285717*G0_0_0_0 - 0.0964285714285715*G0_0_0_1 - 0.0482142857142855*G0_1_0_0 + 0.289285714285715*G0_2_0_0 + 0.096428571428572*G0_2_0_1; + A[92] = -0.0160714285714286*G0_0_0_1 + 0.0803571428571428*G0_0_1_1 + 0.0160714285714286*G0_1_0_1 + 0.0964285714285714*G0_1_1_1 - 0.176785714285714*G0_2_1_1; + A[61] = A[51] + 0.0321428571428572*G0_0_0_0 - 0.0321428571428573*G0_2_0_0; + A[41] = -A[61] - 0.0214285714285714*G0_0_1_0 - 0.214285714285714*G0_1_1_0 - 0.0642857142857143*G0_2_1_0; + A[71] = -A[41] + 0.123214285714286*G0_0_0_0 + 0.0160714285714286*G0_0_1_0 + 0.144642857142857*G0_1_0_0 + 0.107142857142857*G0_2_0_0 - 0.0160714285714285*G0_2_1_0; + A[57] = A[75] - 0.192857142857143*G0_0_0_1 + 0.192857142857143*G0_0_1_0 + 0.0964285714285714*G0_1_0_1 - 0.0964285714285714*G0_1_1_0 + 0.0964285714285714*G0_2_0_1 - 0.0964285714285714*G0_2_1_0; + A[98] = -A[93] - 0.578571428571429*G0_0_0_0 + 0.385714285714286*G0_0_1_0 - 0.482142857142857*G0_1_0_0 - 0.964285714285714*G0_2_0_0 - 0.385714285714285*G0_2_1_0; + A[89] = A[98] + 0.241071428571429*G0_0_0_1 - 0.241071428571429*G0_0_1_0 - 0.0964285714285709*G0_1_0_1 + 0.0964285714285708*G0_1_1_0 - 0.144642857142857*G0_2_0_1 + 0.144642857142857*G0_2_1_0; + A[62] = -A[92] - 0.0776785714285715*G0_0_0_1 - 0.0508928571428573*G0_0_1_1 - 0.0455357142857143*G0_1_0_1 - 0.589285714285714*G0_2_0_1 - 0.624107142857143*G0_2_1_1; + A[14] = -A[16] - 0.0214285714285714*G0_0_0_1 - 0.214285714285714*G0_1_0_1 - 0.0642857142857143*G0_2_0_1; + A[39] = -A[89] - 0.578571428571429*G0_0_0_0 + 0.385714285714286*G0_0_0_1 - 0.482142857142857*G0_1_0_0 - 0.964285714285714*G0_2_0_0 - 0.385714285714285*G0_2_0_1; + A[23] = -A[25] + 0.0160714285714286*G0_0_1_0 + 0.123214285714286*G0_0_1_1 - 0.0160714285714286*G0_1_1_0 + 0.107142857142857*G0_1_1_1 + 0.144642857142857*G0_2_1_1; + A[28] = -A[23] - 0.0214285714285715*G0_0_1_0 - 0.0642857142857142*G0_1_1_0 - 0.214285714285714*G0_2_1_0; + A[82] = A[28] + 0.0133928571428571*G0_0_0_1 - 0.0133928571428571*G0_0_1_0 - 0.0133928571428571*G0_1_0_1 + 0.0133928571428571*G0_1_1_0; + A[32] = -A[82] - 0.0214285714285715*G0_0_0_1 - 0.0642857142857143*G0_1_0_1 - 0.214285714285714*G0_2_0_1; + A[72] = A[82] - 0.0321428571428571*G0_0_1_1 + 0.032142857142857*G0_1_1_1; + A[40] = A[72] + 0.0348214285714286*G0_0_0_0 + 0.0214285714285715*G0_0_0_1 + 0.0348214285714288*G0_0_1_0 + 0.080357142857143*G0_0_1_1 - 0.0133928571428571*G0_1_0_0 - 0.0267857142857142*G0_1_1_0 - 0.0589285714285714*G0_2_0_0 - 0.0589285714285714*G0_2_0_1 - 0.0455357142857142*G0_2_1_0 - 0.0803571428571428*G0_2_1_1; + A[4] = A[40] - 0.013392857142857*G0_1_0_1 + 0.013392857142857*G0_1_1_0 + 0.0133928571428572*G0_2_0_1 - 0.0133928571428572*G0_2_1_0; + A[60] = -A[40] + 0.214285714285714*G0_0_1_0 + 0.214285714285715*G0_0_1_1 + 0.0214285714285715*G0_1_1_0 + 0.0214285714285715*G0_1_1_1 + 0.0642857142857143*G0_2_1_0 + 0.0642857142857144*G0_2_1_1; + A[27] = A[28] - 0.0321428571428571*G0_0_1_1 + 0.032142857142857*G0_1_1_1; + A[30] = A[40] - 0.032142857142857*G0_1_0_0 - 0.0321428571428569*G0_1_0_1 - 0.0321428571428572*G0_1_1_0 - 0.032142857142857*G0_1_1_1 + 0.0321428571428573*G0_2_0_0 + 0.0321428571428573*G0_2_0_1 + 0.032142857142857*G0_2_1_0 + 0.0321428571428571*G0_2_1_1; + A[80] = -A[30] + 0.214285714285714*G0_0_0_0 + 0.214285714285714*G0_0_0_1 + 0.0642857142857144*G0_1_0_0 + 0.0642857142857143*G0_1_0_1 + 0.0214285714285716*G0_2_0_0 + 0.0214285714285715*G0_2_0_1; + A[19] = 0.0803571428571429*G0_0_0_0 - 0.0160714285714285*G0_0_0_1 - 0.176785714285714*G0_1_0_0 + 0.0964285714285715*G0_2_0_0 + 0.0160714285714285*G0_2_0_1; + A[87] = -A[37] - 0.723214285714286*G0_0_0_0 - 0.433928571428572*G0_0_0_1 - 0.482142857142857*G0_1_0_0 - 0.530357142857143*G0_1_0_1 - 0.144642857142857*G0_2_0_0 - 0.0482142857142859*G0_2_0_1; + A[42] = -A[62] - 0.166071428571429*G0_0_1_1 - 0.166071428571428*G0_1_1_1 - 0.305357142857143*G0_2_1_1; + A[53] = -A[58] + 0.192857142857143*G0_0_0_0 - 0.0964285714285713*G0_0_1_0 - 0.0482142857142858*G0_1_0_0 + 0.192857142857143*G0_2_0_0 + 0.0964285714285712*G0_2_1_0; + A[70] = A[7] - 0.589285714285715*G0_0_0_1 + 0.589285714285714*G0_0_1_0 - 0.0616071428571428*G0_1_0_1 + 0.0616071428571428*G0_1_1_0 - 0.0616071428571429*G0_2_0_1 + 0.0616071428571429*G0_2_1_0; + A[90] = -A[70] - 0.624107142857143*G0_0_0_0 - 0.624107142857143*G0_0_0_1 - 0.0348214285714289*G0_0_1_0 - 0.0348214285714289*G0_0_1_1 - 0.0508928571428574*G0_1_0_0 - 0.0508928571428573*G0_1_0_1 + 0.0267857142857141*G0_1_1_0 + 0.0267857142857142*G0_1_1_1 + 0.0455357142857141*G0_2_1_0 + 0.0455357142857141*G0_2_1_1; + A[5] = A[70] + 0.589285714285715*G0_0_0_0 - 0.589285714285715*G0_0_1_1 + 0.0964285714285715*G0_1_0_0 + 0.0348214285714285*G0_1_0_1 + 0.0348214285714286*G0_1_1_0 - 0.0267857142857145*G0_1_1_1 + 0.0267857142857144*G0_2_0_0 - 0.0348214285714285*G0_2_0_1 - 0.0348214285714286*G0_2_1_0 - 0.0964285714285714*G0_2_1_1; + A[50] = A[5] + 0.589285714285715*G0_0_0_1 - 0.589285714285715*G0_0_1_0 + 0.0616071428571429*G0_1_0_1 - 0.0616071428571429*G0_1_1_0 + 0.0616071428571428*G0_2_0_1 - 0.0616071428571428*G0_2_1_0; + A[6] = -A[4] + 0.214285714285714*G0_0_0_1 + 0.214285714285715*G0_0_1_1 + 0.0214285714285715*G0_1_0_1 + 0.0214285714285715*G0_1_1_1 + 0.0642857142857143*G0_2_0_1 + 0.0642857142857143*G0_2_1_1; + A[17] = -A[14] + 0.123214285714286*G0_0_0_0 + 0.0160714285714286*G0_0_0_1 + 0.144642857142857*G0_1_0_0 + 0.107142857142857*G0_2_0_0 - 0.0160714285714285*G0_2_0_1; + A[9] = A[90] + 0.0160714285714286*G0_1_0_1 - 0.0160714285714287*G0_1_1_0 - 0.0160714285714286*G0_2_0_1 + 0.0160714285714286*G0_2_1_0; + A[34] = -A[36] + 0.0482142857142858*G0_0_0_1 - 0.0964285714285714*G0_0_1_1 + 0.433928571428572*G0_1_0_1 - 0.289285714285714*G0_1_1_1 + 0.530357142857143*G0_2_0_1 + 0.0482142857142858*G0_2_1_1; + A[97] = -A[34] + 0.265178571428572*G0_0_0_0 - 0.216964285714286*G0_0_0_1 - 0.216964285714286*G0_0_1_0 - 0.891964285714287*G0_0_1_1 - 0.216964285714285*G0_1_0_0 - 0.699107142857143*G0_1_1_0 - 1.15714285714286*G0_1_1_1 - 0.385714285714285*G0_2_0_0 + 0.0482142857142861*G0_2_0_1 - 0.265178571428571*G0_2_1_0 - 0.313392857142857*G0_2_1_1; + A[99] = -A[97] + 1.49464285714286*G0_0_0_0 + 0.0964285714285717*G0_0_1_0 + 0.337500000000001*G0_0_1_1 + 0.916071428571428*G0_1_0_0 + 0.482142857142857*G0_1_0_1 + 0.241071428571427*G0_1_1_0 + 0.867857142857144*G0_1_1_1 + 1.63928571428571*G0_2_0_0 + 0.530357142857142*G0_2_0_1 + 0.674999999999999*G0_2_1_0 + 0.819642857142857*G0_2_1_1; + A[84] = -A[86] - 0.0964285714285718*G0_0_0_1 + 0.0964285714285715*G0_0_1_1 + 0.0964285714285708*G0_1_0_1 + 0.289285714285714*G0_1_1_1 - 0.0482142857142857*G0_2_1_1; + A[48] = A[84] + 0.0482142857142859*G0_0_0_1 - 0.0482142857142859*G0_0_1_0 - 0.0723214285714279*G0_1_0_1 + 0.0723214285714278*G0_1_1_0 + 0.0241071428571428*G0_2_0_1 - 0.0241071428571428*G0_2_1_0; + A[67] = -A[48] - 0.0241071428571431*G0_0_0_1 - 0.144642857142857*G0_0_1_0 + 0.16875*G0_0_1_1 + 0.0241071428571425*G0_1_0_1 + 0.144642857142856*G0_1_1_0 + 0.337499999999999*G0_1_1_1 - 0.16875*G0_2_1_1; + A[76] = A[67] - 0.0723214285714281*G0_0_0_1 + 0.0723214285714281*G0_0_1_0 + 0.048214285714286*G0_1_0_1 - 0.048214285714286*G0_1_1_0 + 0.0241071428571433*G0_2_0_1 - 0.0241071428571433*G0_2_1_0; + A[74] = -A[76] - 0.0964285714285714*G0_0_0_1 + 0.192857142857143*G0_0_1_1 + 0.0964285714285717*G0_1_0_1 + 0.192857142857143*G0_1_1_1 - 0.0482142857142857*G0_2_1_1; + A[68] = -A[48] - 0.0964285714285718*G0_0_1_0 + 0.0964285714285715*G0_0_1_1 + 0.0964285714285707*G0_1_1_0 + 0.289285714285714*G0_1_1_1 - 0.0482142857142856*G0_2_1_1; + A[59] = A[97] - 1.15714285714286*G0_0_0_0 + 1.15714285714286*G0_0_1_1 - 0.0964285714285716*G0_1_0_0 + 0.0482142857142852*G0_1_0_1 + 0.433928571428572*G0_1_1_0 + 0.771428571428572*G0_1_1_1 - 0.771428571428571*G0_2_0_0 - 0.0482142857142859*G0_2_0_1 - 0.433928571428571*G0_2_1_0 + 0.0964285714285718*G0_2_1_1; + A[47] = -A[67] - 0.0964285714285713*G0_0_1_0 + 0.192857142857143*G0_0_1_1 + 0.0964285714285718*G0_1_1_0 + 0.192857142857143*G0_1_1_1 - 0.0482142857142857*G0_2_1_1; + A[69] = A[47] - 0.0723214285714285*G0_0_0_0 + 0.0964285714285718*G0_0_0_1 + 0.361607142857143*G0_0_1_0 - 0.337500000000001*G0_0_1_1 + 0.0723214285714285*G0_1_0_0 + 0.192857142857143*G0_1_0_1 - 0.241071428571429*G0_1_1_1 + 0.554464285714286*G0_2_0_1 + 0.482142857142857*G0_2_1_0 + 0.241071428571428*G0_2_1_1; + A[45] = A[47] - 0.144642857142857*G0_0_0_1 - 0.096428571428571*G0_0_1_0 - 0.241071428571429*G0_0_1_1 + 0.0482142857142856*G0_1_0_0 - 0.0964285714285722*G0_1_1_1 + 0.289285714285714*G0_2_0_0 + 0.144642857142857*G0_2_0_1 + 0.0964285714285714*G0_2_1_0; + A[64] = A[45] - 0.16875*G0_0_0_0 + 0.0723214285714281*G0_0_1_0 + 0.289285714285714*G0_0_1_1 - 0.265178571428572*G0_1_0_0 - 0.241071428571429*G0_1_0_1 - 0.192857142857143*G0_1_1_0 - 1.59107142857143*G0_2_0_0 - 0.771428571428572*G0_2_0_1 - 0.891964285714285*G0_2_1_0 - 0.289285714285714*G0_2_1_1; + A[54] = A[45] + 0.0241071428571433*G0_0_0_1 - 0.0241071428571433*G0_0_1_0 + 0.0482142857142857*G0_1_0_1 - 0.0482142857142858*G0_1_1_0 - 0.0723214285714284*G0_2_0_1 + 0.0723214285714284*G0_2_1_0; + A[46] = A[64] + 0.0964285714285716*G0_0_0_1 - 0.0964285714285716*G0_0_1_0 + 0.0964285714285718*G0_1_0_1 - 0.0964285714285718*G0_1_1_0 - 0.192857142857142*G0_2_0_1 + 0.192857142857142*G0_2_1_0; + A[83] = A[46] + 0.3375*G0_0_0_0 - 0.3375*G0_0_1_1 - 0.650892857142855*G0_1_0_1 - 0.361607142857142*G0_1_1_0 - 1.35*G0_1_1_1 + 1.35*G0_2_0_0 + 0.650892857142857*G0_2_0_1 + 0.361607142857144*G0_2_1_0; + A[65] = -A[45] - 0.433928571428571*G0_0_1_0 - 0.723214285714286*G0_0_1_1 - 0.0482142857142856*G0_1_1_0 - 0.144642857142857*G0_1_1_1 - 0.530357142857143*G0_2_1_0 - 0.482142857142857*G0_2_1_1; + A[91] = A[19] + 0.0160714285714286*G0_0_0_1 - 0.0160714285714286*G0_0_1_0 - 0.0160714285714285*G0_2_0_1 + 0.0160714285714285*G0_2_1_0; + A[66] = -A[64] - 0.0964285714285716*G0_0_0_1 + 0.675*G0_0_1_1 - 0.0964285714285718*G0_1_0_1 + 0.289285714285715*G0_1_1_1 + 0.192857142857142*G0_2_0_1 + 0.723214285714286*G0_2_1_1; + A[56] = -A[54] - 0.433928571428571*G0_0_0_1 - 0.723214285714286*G0_0_1_1 - 0.0482142857142856*G0_1_0_1 - 0.144642857142857*G0_1_1_1 - 0.530357142857143*G0_2_0_1 - 0.482142857142857*G0_2_1_1; + A[77] = A[55] + 0.192857142857143*G0_0_0_0 - 0.192857142857142*G0_0_1_1 + 0.289285714285714*G0_1_0_0 + 0.385714285714286*G0_1_0_1 + 0.385714285714286*G0_1_1_0 + 0.482142857142857*G0_1_1_1 - 0.482142857142857*G0_2_0_0 - 0.385714285714285*G0_2_0_1 - 0.385714285714285*G0_2_1_0 - 0.289285714285714*G0_2_1_1; + A[3] = A[30] - 0.0133928571428573*G0_1_0_1 + 0.0133928571428573*G0_1_1_0 + 0.013392857142857*G0_2_0_1 - 0.013392857142857*G0_2_1_0; + A[8] = -A[3] + 0.214285714285714*G0_0_0_0 + 0.214285714285714*G0_0_1_0 + 0.0642857142857144*G0_1_0_0 + 0.0642857142857143*G0_1_1_0 + 0.0214285714285716*G0_2_0_0 + 0.0214285714285715*G0_2_1_0; + A[12] = 0.0113095238095238*G0_0_0_1 + 0.038095238095238*G0_1_0_1 + 0.0380952380952381*G0_2_0_1; + A[2] = -A[12] - 0.0267857142857143*G0_0_0_1 - 0.0380952380952381*G0_0_1_1 + 0.0267857142857142*G0_1_0_1 - 0.0113095238095238*G0_1_1_1 - 0.0380952380952381*G0_2_1_1; + A[49] = -A[69] + 0.385714285714285*G0_0_1_0 - 0.57857142857143*G0_0_1_1 - 0.385714285714286*G0_1_1_0 - 0.964285714285715*G0_1_1_1 - 0.482142857142858*G0_2_1_1; + A[94] = A[49] + 0.144642857142857*G0_0_0_1 - 0.144642857142857*G0_0_1_0 - 0.241071428571428*G0_1_0_1 + 0.241071428571428*G0_1_1_0 + 0.0964285714285729*G0_2_0_1 - 0.0964285714285728*G0_2_1_0; + A[96] = -A[94] + 0.385714285714285*G0_0_0_1 - 0.57857142857143*G0_0_1_1 - 0.385714285714286*G0_1_0_1 - 0.964285714285715*G0_1_1_1 - 0.482142857142858*G0_2_1_1; + A[33] = -A[83] + 0.385714285714286*G0_0_0_0 + 0.0964285714285717*G0_0_0_1 + 0.530357142857143*G0_1_0_0 - 0.192857142857142*G0_1_0_1 + 0.771428571428571*G0_2_0_0 + 0.0964285714285715*G0_2_0_1; + A[29] = A[92] + 0.0160714285714286*G0_0_0_1 - 0.0160714285714286*G0_0_1_0 - 0.0160714285714286*G0_1_0_1 + 0.0160714285714286*G0_1_1_0; + A[26] = -A[29] - 0.0776785714285715*G0_0_1_0 - 0.0508928571428573*G0_0_1_1 - 0.0455357142857143*G0_1_1_0 - 0.589285714285714*G0_2_1_0 - 0.624107142857143*G0_2_1_1; + A[24] = -A[26] - 0.166071428571429*G0_0_1_1 - 0.166071428571428*G0_1_1_1 - 0.305357142857143*G0_2_1_1; + A[81] = -A[91] - 0.0508928571428571*G0_0_0_0 - 0.0776785714285714*G0_0_1_0 - 0.624107142857142*G0_1_0_0 - 0.589285714285713*G0_1_1_0 - 0.0455357142857142*G0_2_1_0; + A[31] = -A[81] - 0.166071428571429*G0_0_0_0 - 0.305357142857142*G0_1_0_0 - 0.166071428571428*G0_2_0_0; + A[44] = -A[64] + 0.0964285714285716*G0_0_1_0 + 0.385714285714286*G0_0_1_1 + 0.096428571428572*G0_1_1_0 + 0.771428571428572*G0_1_1_1 - 0.192857142857142*G0_2_1_0 + 0.530357142857143*G0_2_1_1; + A[63] = -A[68] + 0.0964285714285717*G0_0_0_0 - 0.0964285714285715*G0_0_1_0 - 0.0482142857142855*G0_1_0_0 + 0.289285714285715*G0_2_0_0 + 0.0964285714285719*G0_2_1_0; + A[0] = A[22] + 0.305952380952381*G0_0_0_0 + 0.305952380952381*G0_0_0_1 + 0.305952380952381*G0_0_1_0 + 0.246428571428572*G0_0_1_1 + 0.0595238095238095*G0_1_0_0 + 0.0595238095238095*G0_1_0_1 + 0.0595238095238095*G0_1_1_0 + 0.0595238095238095*G0_2_0_0 + 0.0595238095238094*G0_2_0_1 + 0.0595238095238094*G0_2_1_0 - 0.246428571428571*G0_2_1_1; + A[79] = A[97] + 0.0964285714285714*G0_0_0_1 - 0.0964285714285714*G0_0_1_0 - 0.241071428571429*G0_1_0_1 + 0.241071428571429*G0_1_1_0 + 0.144642857142857*G0_2_0_1 - 0.144642857142857*G0_2_1_0; + A[38] = A[83] - 0.0964285714285717*G0_0_0_1 + 0.0964285714285717*G0_0_1_0 + 0.192857142857142*G0_1_0_1 - 0.192857142857142*G0_1_1_0 - 0.0964285714285715*G0_2_0_1 + 0.0964285714285715*G0_2_1_0; + A[20] = -A[21] - 0.0267857142857143*G0_0_1_0 - 0.0380952380952381*G0_0_1_1 + 0.0267857142857142*G0_1_1_0 - 0.0113095238095238*G0_1_1_1 - 0.0380952380952381*G0_2_1_1; + A[18] = -A[19] - 0.0508928571428571*G0_0_0_0 - 0.0776785714285714*G0_0_0_1 - 0.624107142857142*G0_1_0_0 - 0.589285714285713*G0_1_0_1 - 0.0455357142857142*G0_2_0_1; + A[13] = -A[18] - 0.166071428571429*G0_0_0_0 - 0.305357142857142*G0_1_0_0 - 0.166071428571428*G0_2_0_0; + A[88] = -A[83] + 0.675*G0_0_0_0 - 0.0964285714285717*G0_0_1_0 + 0.723214285714285*G0_1_0_0 + 0.192857142857142*G0_1_1_0 + 0.289285714285714*G0_2_0_0 - 0.0964285714285715*G0_2_1_0; + A[43] = -A[48] - 0.0964285714285715*G0_0_0_0 + 0.0482142857142855*G0_0_1_0 + 0.0482142857142858*G0_1_0_0 + 0.530357142857142*G0_1_1_0 - 0.289285714285715*G0_2_0_0 + 0.433928571428571*G0_2_1_0; + A[95] = A[59] + 0.096428571428572*G0_0_0_1 - 0.0964285714285722*G0_0_1_0 + 0.144642857142858*G0_1_0_1 - 0.144642857142858*G0_1_1_0 - 0.241071428571428*G0_2_0_1 + 0.241071428571428*G0_2_1_0; + A[52] = -A[32] + 0.0160714285714286*G0_0_0_1 + 0.123214285714286*G0_0_1_1 - 0.0160714285714286*G0_1_0_1 + 0.107142857142857*G0_1_1_1 + 0.144642857142857*G0_2_1_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p1_q3_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p1_q3_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q3_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q3_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q3_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q3_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q3_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q3_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q3_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q3_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p1_q4_quadrature.h b/laplacian_2d/laplacian_f1_p1_q4_quadrature.h new file mode 100644 index 0000000..f5907a2 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p1_q4_quadrature.h @@ -0,0 +1,6475 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P1_Q4_QUADRATURE_H +#define __LAPLACIAN_F1_P1_Q4_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q4_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q4_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q4_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q4_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q4_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q4_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q4_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q4_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q4_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q4_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q4_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q4_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p1_q4_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p1_q4_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W16[16] = {0.0235683681933823, 0.0353880678980859, 0.0225840492823699, 0.00542322591052525, 0.0441850885223617, 0.0663442161070497, 0.0423397245217463, 0.0101672595644788, 0.0441850885223617, 0.0663442161070497, 0.0423397245217463, 0.0101672595644788, 0.0235683681933823, 0.0353880678980859, 0.0225840492823699, 0.00542322591052525}; + // Quadrature points on the UFC reference element: (0.0654669945550145, 0.0571041961145177), (0.0502101232113698, 0.276843013638124), (0.028912084224389, 0.583590432368917), (0.00970378512694614, 0.860240135656219), (0.311164552244357, 0.0571041961145177), (0.238648659731443, 0.276843013638124), (0.137419104134574, 0.583590432368917), (0.0461220799064521, 0.860240135656219), (0.631731251641125, 0.0571041961145177), (0.484508326630433, 0.276843013638124), (0.278990463496509, 0.583590432368917), (0.0936377844373285, 0.860240135656219), (0.877428809330468, 0.0571041961145177), (0.672946863150506, 0.276843013638124), (0.387497483406694, 0.583590432368917), (0.130056079216834, 0.860240135656219) + + // Value of basis functions at quadrature points. + static const double FE0[16][3] = \ + {{0.877428809330468, 0.0654669945550145, 0.0571041961145176}, + {0.672946863150506, 0.0502101232113698, 0.276843013638124}, + {0.387497483406694, 0.028912084224389, 0.583590432368917}, + {0.130056079216834, 0.0097037851269462, 0.860240135656219}, + {0.631731251641125, 0.311164552244357, 0.0571041961145176}, + {0.484508326630433, 0.238648659731443, 0.276843013638124}, + {0.278990463496509, 0.137419104134574, 0.583590432368917}, + {0.0936377844373285, 0.0461220799064521, 0.860240135656219}, + {0.311164552244357, 0.631731251641125, 0.0571041961145176}, + {0.238648659731443, 0.484508326630433, 0.276843013638124}, + {0.137419104134574, 0.278990463496509, 0.583590432368917}, + {0.0461220799064521, 0.0936377844373286, 0.860240135656219}, + {0.0654669945550145, 0.877428809330468, 0.0571041961145176}, + {0.0502101232113698, 0.672946863150506, 0.276843013638124}, + {0.028912084224389, 0.387497483406694, 0.583590432368917}, + {0.00970378512694609, 0.130056079216835, 0.860240135656219}}; + + static const double FE1_D01[16][14] = \ + {{-3.73667068880549, -0.311049493080665, 0.223979331051489, 0.104990345117057, 0.137222657043635, 6.14026988141177, -3.72353966515001, 1.6309899656244, -3.12426160441429, 1.1635146186775, -0.223979331051489, 3.89316339902554, -1.26850496379455, -0.906124451654892}, + {-0.135353153966954, 0.286839134679349, 0.192514372389236, -0.194970789566955, -0.129262778980056, -3.50043481058447, 5.01065174007844, -1.66170291020636, -1.01577547644434, 0.703579506158886, -0.192514372389235, -0.12063127175725, -0.508608716591934, 1.26566952718165}, + {0.0415749950107144, -0.308068880728994, 0.128479868913391, -0.375214285885602, 0.334729745719718, -0.111745376126847, -3.41368229886306, 3.79192156070819, 0.00713420856908595, 0.21477291899535, -0.128479868913389, -0.936666822030393, 0.160441366890248, 0.594802867741591}, + {-0.189449171833466, 3.25735599136755, 0.0487792767304758, -0.219445802063643, 0.436666840246954, 0.95608648483319, -1.80781257328652, -2.21618073108076, 0.00800745691652438, 0.00150907887808238, -0.0487792767304776, -0.0301805673092463, 0.217936723185553, -0.414493729854227}, + {0.133791234088099, -0.311049493080665, -0.153342364114824, -0.165402786473892, 0.652219136176813, 0.442570807553647, -1.3813060350523, 1.11599348649123, -4.97406902858338, -1.23446157521331, 0.153342364114824, 7.29981484256821, 1.3998643616872, -2.97796495016165}, + {0.308996527150275, 0.286839134679349, 0.0302078341708109, -0.0526515215640031, -0.614385844601294, -1.28562081113318, 1.86636499388868, -1.17657984458512, -1.04351159908944, 0.124659409468331, -0.0302078341708105, -2.60973956167772, -0.0720078879043259, 4.26763700536846}, + {-0.282271801510133, -0.308068880728994, 0.239334576747593, -0.908127385775844, 1.59097010879606, 1.41719178937472, -3.36253230476743, 2.53568119763184, 0.351667780172716, 0.304940851746767, -0.239334576747592, -3.01920386250499, 0.603186534029077, 1.07656597353622}, + {0.0124813340807398, 3.25735599136756, 0.18209870160566, -0.884949023586165, 2.07547700561112, -0.144284842667495, 0.72943841366413, -3.85499089644493, -0.0213463855701444, -0.0377481596742715, -0.182098701605662, 0.23211087524138, 0.922697183260432, -2.28624149528236}, + {-0.201686066324276, -0.311049493080666, 1.3554004060624, -2.0957669272062, 1.32414572376389, -0.0284094867612285, 0.0970781472620237, 0.444066898904147, 1.38210514028492, -5.746415673492, -1.3554004060624, -0.180265872305136, 7.8421826006982, -2.52598499174367}, + {-0.346344400331788, 0.28683913467935, -0.0751011451800905, 2.20833165141887, -1.24733596999111, 0.763889850402159, -0.160754865554418, -0.543629719195304, 1.2840311239631, -1.65285136545305, 0.0751011451800913, -4.07046884580067, -0.555480285965825, 4.03377369182868}, + {-0.219768719105238, -0.308068880728994, -0.0762683315720014, 0.474765854519233, 3.23001296550025, 0.848799090920449, -1.21759983201387, 0.896638340927649, 0.29135979252359, -0.0128571513285976, 0.0762683315720014, -1.07011301851141, -0.461908703190635, -2.45125973951242}, + {0.421464492679141, 3.25735599136756, 0.253854565960165, -1.37791402619754, 4.21366661803254, -2.10081322861208, 4.41517325343173, -5.99318050886635, -0.248496677091294, -0.147825162397021, -0.253854565960168, 1.51384139149734, 1.52573918859456, -5.47901133243858}, + {0.233570224452106, -0.311049493080667, 8.86543618214378, -4.7844194839011, 1.83914220289708, 0.127356496601796, 0.0210523522557917, -0.0709295802290264, -1.48464849089744, 4.19511744299535, -8.86543618214378, -0.593187071957072, 0.589302040905737, 0.238693359957438}, + {0.379194714537726, 0.286839134679351, 2.10023545454793, 5.53186235862513, -1.73245903561235, -0.483697023102141, -0.123830172540867, -0.0585066535740698, -1.64372700413302, 2.72470424750157, -2.10023545454793, 2.70286774813649, -8.25656660612669, 0.673318291608882}, + {0.615048549486148, -0.308068880728992, -0.255749379128854, 3.12750919457463, 4.48625332857659, -1.96658424863585, 2.0192066020274, -0.359602022148699, -1.39109901070619, 0.655303335752943, 0.255749379128853, 5.24565519573868, -3.78281253032758, -8.34080951360908}, + {0.862158677217334, 3.25735599136756, 0.246225772336431, -1.46807443034702, 5.85247678339671, -4.01529105210979, 7.52776705775542, -7.63199067423052, -0.614429658327018, -0.230215159323225, -0.246225772336434, 3.2633976075431, 1.69828958967025, -8.5014447326128}}; + + // Array of non-zero columns + static const unsigned int nzc0[14] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + static const double FE1_D10[16][14] = \ + {{-3.73667068880549, -0.233570224452107, 0.0966228344496946, 0.0839379928612569, 0.208152237272668, -2.725166300732, 1.06087981875107, -0.208152237272668, 5.74117457772949, -3.03160282431785, 1.26066915984596, 3.30386135811979, -0.675317891837485, -1.14481781161233}, + {-0.135353153966955, -0.379194714537727, 0.676211395491376, -0.0711406170260824, -0.0707561254059923, -5.6006702651324, -0.521210618546693, 0.070756125405991, 1.08445997810359, -2.02112474134269, 1.45121263174378, 8.13593533436945, -3.21147646472843, 0.592351235572778}, + {0.0415749950107149, -0.615048549486149, 2.09506411754924, -2.39442088791299, 0.694331767868412, 0.144004003002005, -6.54119149343769, -0.694331767868411, -0.248615170559768, -0.440530416757595, 1.2626191417928, 2.84614570829718, -5.08521382884843, 8.93561238135068}, + {-0.189449171833467, -0.86215867721733, 4.06407032884026, -7.74721285981905, 8.06865751447747, 0.709860712496763, -0.339738142939498, -8.06865751447746, 0.254233229252959, 0.231724238201303, 0.565650381596535, -1.7284701569795, -3.04546088435752, 8.08695100275854}, + {0.133791234088098, 0.201686066324276, -0.124932877353594, -0.262480933735916, 0.208152237272667, -0.912829598508755, 0.714460892153898, -0.208152237272667, -3.61866862252097, 4.51195409827869, -1.22876277617009, -0.542367758129989, 1.58013023399234, -0.451979958417981}, + {0.308996527150275, 0.346344400331788, -0.733682016231347, 0.108103343990414, -0.0707561254059911, -1.21051966595309, -0.341966657530196, 0.0707561254059907, -1.11861274426953, 1.77751077492138, -1.31423895813391, -2.0542592757119, 3.99846095789633, 0.233863313539781}, + {-0.282271801510132, 0.219768719105237, -0.609464514172856, 0.309472446238023, 0.694331767868412, 1.49346012094672, -3.83729815928667, -0.694331767868411, 0.275399448600715, 0.317798003075364, -0.530694369271184, -2.55729515931436, 1.67329955254049, 3.52782571304864}, + {0.0124813340807383, -0.421464492679139, 2.28291193021773, -5.30012227701789, 8.06865751447747, -0.398139408627658, 2.10735243986167, -8.06865751447747, 0.232508180390025, 0.110077002722745, 0.06639797548563, -1.29362831335318, -0.591144208236892, 3.19276983715621}, + {-0.201686066324277, -0.133791234088099, 0.912829598508756, -0.714460892153894, 0.208152237272666, 0.124932877353596, 0.262480933735919, -0.208152237272666, 1.22876277617009, -4.51195409827869, 3.61866862252098, -1.58013023399234, 0.542367758129989, 0.451979958417975}, + {-0.346344400331789, -0.308996527150274, 1.21051966595309, 0.341966657530194, -0.0707561254059904, 0.733682016231346, -0.108103343990415, 0.0707561254059907, 1.31423895813391, -1.77751077492138, 1.11861274426953, -3.99846095789633, 2.0542592757119, -0.23386331353978}, + {-0.219768719105238, 0.282271801510132, -1.49346012094673, 3.83729815928666, 0.694331767868412, 0.609464514172855, -0.309472446238026, -0.694331767868411, 0.530694369271184, -0.317798003075364, -0.275399448600715, -1.67329955254049, 2.55729515931436, -3.52782571304864}, + {0.42146449267914, -0.012481334080738, 0.398139408627662, -2.10735243986166, 8.06865751447747, -2.28291193021774, 5.30012227701789, -8.06865751447747, -0.0663979754856289, -0.110077002722752, -0.232508180390022, 0.591144208236898, 1.29362831335318, -3.19276983715624}, + {0.233570224452107, 3.73667068880549, 2.725166300732, -1.06087981875107, 0.208152237272666, -0.0966228344496921, -0.0839379928612601, -0.208152237272666, -1.26066915984595, 3.03160282431785, -5.74117457772949, 0.675317891837489, -3.3038613581198, 1.14481781161233}, + {0.379194714537727, 0.135353153966955, 5.6006702651324, 0.521210618546686, -0.070756125405989, -0.676211395491381, 0.0711406170260862, 0.0707561254059894, -1.45121263174378, 2.02112474134268, -1.08445997810359, 3.21147646472842, -8.13593533436944, -0.592351235572775}, + {0.615048549486148, -0.0415749950107151, -0.144004003002004, 6.54119149343768, 0.694331767868413, -2.09506411754925, 2.394420887913, -0.694331767868413, -1.2626191417928, 0.440530416757598, 0.248615170559768, 5.08521382884843, -2.84614570829718, -8.93561238135068}, + {0.862158677217332, 0.189449171833466, -0.709860712496757, 0.339738142939503, 8.06865751447747, -4.06407032884026, 7.74721285981907, -8.06865751447747, -0.565650381596537, -0.231724238201309, -0.254233229252954, 3.04546088435754, 1.72847015697949, -8.08695100275858}}; + + // Array of non-zero columns + static const unsigned int nzc1[14] = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 225; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 37824 + for (unsigned int ip = 0; ip < 16; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 6 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W16[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W16[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W16[ip]; + + + // Number of operations for primary indices: 2352 + for (unsigned int j = 0; j < 14; j++) + { + for (unsigned int k = 0; k < 14; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p1_q4_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p1_q4_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q4_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q4_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q4_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q4_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q4_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q4_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q4_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p1_q4_tensor.h b/laplacian_2d/laplacian_f1_p1_q4_tensor.h new file mode 100644 index 0000000..0e10a14 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p1_q4_tensor.h @@ -0,0 +1,6592 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P1_Q4_TENSOR_H +#define __LAPLACIAN_F1_P1_Q4_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q4_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q4_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q4_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p1_q4_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p1_q4_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p1_q4_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q4_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q4_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q4_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p1_q4_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p1_q4_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p1_q4_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p1_q4_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p1_q4_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 30 + // Number of operations (multiply-add pairs) for tensor contraction: 1405 + // Total number of operations (multiply-add pairs): 1446 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[108] = -0.0846560846560843*G0_0_0_0 - 0.0141093474426808*G0_0_0_1 + 0.00282186948853588*G0_0_1_1 + 0.0169312169312173*G0_1_0_0 - 0.0112874779541456*G0_1_0_1 - 0.0084656084656088*G0_1_1_0 - 0.0846560846560842*G0_2_0_0 - 0.0169312169312172*G0_2_0_1 - 0.0338624338624338*G0_2_1_0 - 0.00282186948853641*G0_2_1_1; + A[176] = 0.451499118165785*G0_0_0_0 + 0.158024691358024*G0_0_1_1 + 1.17389770723104*G0_1_0_0 + 0.970723104056436*G0_1_0_1 + 0.970723104056436*G0_1_1_0 + 1.78342151675485*G0_1_1_1 + 0.203174603174603*G0_2_0_0 + 0.0790123456790121*G0_2_0_1 + 0.0790123456790121*G0_2_1_0 + 0.158024691358024*G0_2_1_1; + A[21] = 0.0444444444444442*G0_0_0_0 - 0.00776014109347461*G0_0_0_1 - 0.0176366843033508*G0_1_0_0 + 0.0155202821869488*G0_2_0_0 + 0.00776014109347443*G0_2_0_1; + A[52] = A[108] + 0.0141093474426805*G0_0_0_1 - 0.0141093474426805*G0_0_1_0 + 0.00282186948853676*G0_1_0_1 - 0.00282186948853676*G0_1_1_0 - 0.0169312169312166*G0_2_0_1 + 0.0169312169312166*G0_2_1_0; + A[35] = 0.0458553791887125*G0_0_1_0 - 0.0246913580246913*G0_0_1_1 + 0.0458553791887126*G0_1_1_0 - 0.0493827160493827*G0_1_1_1 + 0.687125220458554*G0_2_1_0 + 0.201058201058201*G0_2_1_1; + A[26] = -0.0952380952380951*G0_0_0_0 - 0.0458553791887124*G0_0_0_1 - 0.486067019400353*G0_1_0_0 - 0.687125220458553*G0_1_0_1 - 0.0705467372134037*G0_2_0_0 - 0.0458553791887124*G0_2_0_1; + A[135] = A[35] - 0.486067019400353*G0_0_0_0 - 0.486067019400353*G0_0_0_1 + 0.155202821869488*G0_0_1_0 + 0.225749559082892*G0_0_1_1 - 0.0952380952380951*G0_1_0_0 - 0.0952380952380951*G0_1_0_1 - 0.0952380952380953*G0_1_1_0 - 0.0705467372134037*G0_2_0_0 - 0.0705467372134038*G0_2_0_1 - 0.711816578483245*G0_2_1_0 - 0.225749559082893*G0_2_1_1; + A[97] = A[108] - 0.561552028218695*G0_0_0_1 + 0.129805996472664*G0_0_1_0 - 1.05820105820106*G0_0_1_1 - 0.135449735449736*G0_1_0_0 - 0.149559082892415*G0_1_0_1 - 0.0790123456790121*G0_1_1_0 - 0.220105820105819*G0_1_1_1 - 0.372486772486773*G0_2_0_0 - 0.728042328042328*G0_2_0_1 - 0.372486772486773*G0_2_1_0 - 0.668783068783068*G0_2_1_1; + A[170] = 0.0112874779541445*G0_0_0_0 + 0.0225749559082892*G0_0_0_1 - 0.0112874779541445*G0_0_1_0 - 0.0451499118165786*G0_0_1_1 - 0.0112874779541445*G0_1_0_0 - 0.0902998236331577*G0_1_0_1 - 0.045149911816578*G0_1_1_0 - 0.293474426807761*G0_1_1_1 - 0.0338624338624339*G0_2_0_1 - 0.0451499118165783*G0_2_1_0; + A[111] = A[97] + 0.70546737213404*G0_0_0_1 - 0.70546737213404*G0_0_1_0 + 0.0733686067019401*G0_1_0_1 - 0.07336860670194*G0_1_1_0 + 0.338624338624338*G0_2_0_1 - 0.338624338624338*G0_2_1_0; + A[202] = A[108] + 0.304761904761904*G0_0_0_0 - 0.070546737213404*G0_0_0_1 - 0.0366843033509704*G0_0_1_1 - 0.101587301587303*G0_1_0_0 - 0.00564373897707156*G0_1_0_1 - 0.00846560846560943*G0_1_1_0 - 0.0338624338624331*G0_1_1_1 + 0.355555555555554*G0_2_0_0 + 0.0677248677248673*G0_2_0_1 - 0.0310405643738976*G0_2_1_1; + A[117] = A[202] - 0.270899470899471*G0_0_0_0 + 0.558730158730159*G0_0_0_1 + 0.660317460317461*G0_0_1_0 - 0.54179894179894*G0_0_1_1 + 0.270899470899472*G0_1_0_0 + 0.33862433862434*G0_1_0_1 + 0.203174603174605*G0_1_1_0 + 0.72804232804233*G0_2_0_1 + 0.761904761904763*G0_2_1_0 + 0.541798941798943*G0_2_1_1; + A[16] = 0.0379188712522045*G0_0_0_0 + 0.297178130511464*G0_1_0_0 + 0.0379188712522045*G0_2_0_0; + A[122] = -0.0458553791887125*G0_0_0_1 - 0.0952380952380952*G0_0_1_1 - 0.0458553791887126*G0_1_0_1 - 0.070546737213404*G0_1_1_1 - 0.687125220458553*G0_2_0_1 - 0.486067019400353*G0_2_1_1; + A[86] = A[170] - 0.0338624338624338*G0_0_0_1 + 0.0338624338624338*G0_0_1_0 + 0.0451499118165796*G0_1_0_1 - 0.0451499118165796*G0_1_1_0 - 0.0112874779541444*G0_2_0_1 + 0.0112874779541444*G0_2_1_0; + A[138] = A[170] + 0.0677248677248679*G0_0_0_0 + 0.0225749559082897*G0_0_0_1 + 0.0451499118165785*G0_0_1_0 + 0.0451499118165785*G0_0_1_1 - 0.158024691358024*G0_1_0_0 - 0.158024691358024*G0_1_0_1 - 0.158024691358025*G0_1_1_0 - 0.045149911816578*G0_2_0_0 - 0.0225749559082892*G0_2_1_0 - 0.0451499118165784*G0_2_1_1; + A[212] = 0.00705467372134031*G0_0_0_1 + 0.0917107583774249*G0_0_1_1 - 0.00705467372134068*G0_1_0_1 + 0.0846560846560844*G0_1_1_1 - 0.261022927689595*G0_2_1_1; + A[46] = -0.0246913580246913*G0_0_0_0 + 0.0458553791887125*G0_0_1_0 + 0.2010582010582*G0_1_0_0 + 0.687125220458553*G0_1_1_0 - 0.0493827160493827*G0_2_0_0 + 0.0458553791887124*G0_2_1_0; + A[41] = -0.00776014109347449*G0_0_1_0 + 0.00776014109347451*G0_0_1_1 + 0.00776014109347461*G0_1_1_0 + 0.0522045855379193*G0_1_1_1 - 0.0176366843033509*G0_2_1_1; + A[89] = 0.112874779541446*G0_0_0_0 - 0.090299823633157*G0_0_0_1 - 0.338624338624338*G0_0_1_1 - 0.112874779541447*G0_1_0_0 - 0.203174603174603*G0_1_0_1 - 0.406349206349207*G0_1_1_0 - 0.812698412698413*G0_1_1_1 - 0.993298059964728*G0_2_0_1 - 0.880423280423281*G0_2_1_0 - 1.28677248677249*G0_2_1_1; + A[164] = A[108] + 0.0507936507936506*G0_0_0_0 - 0.0705467372134032*G0_0_0_1 + 0.217283950617285*G0_0_1_1 - 0.0507936507936509*G0_1_0_0 + 0.0620811287477966*G0_1_0_1 - 0.0253968253968246*G0_1_1_0 + 0.270899470899473*G0_1_1_1 + 0.050793650793651*G0_2_0_0 + 0.0169312169312179*G0_2_1_0 - 0.081834215167548*G0_2_1_1; + A[56] = -A[176] + 0.575661375661375*G0_0_0_0 - 0.0790123456790123*G0_0_0_1 + 0.869135802469137*G0_1_0_0 + 0.158024691358026*G0_1_0_1 + 0.248324514991181*G0_2_0_0 - 0.0790123456790121*G0_2_0_1; + A[125] = A[56] - 0.282186948853615*G0_0_0_0 + 0.282186948853615*G0_0_1_1 + 0.146737213403878*G0_1_0_0 + 0.654673721340385*G0_1_0_1 + 0.891710758377424*G0_1_1_0 + 1.82857142857143*G0_1_1_1 - 1.82857142857143*G0_2_0_0 - 0.654673721340388*G0_2_0_1 - 0.891710758377425*G0_2_1_0 - 0.14673721340388*G0_2_1_1; + A[83] = A[125] + 0.0790123456790124*G0_0_0_1 - 0.0790123456790124*G0_0_1_0 + 0.0790123456790121*G0_1_0_1 - 0.0790123456790121*G0_1_1_0 - 0.158024691358025*G0_2_0_1 + 0.158024691358025*G0_2_1_0; + A[80] = -A[125] + 0.0790123456790124*G0_0_1_0 + 0.327336860670194*G0_0_1_1 + 0.0790123456790121*G0_1_1_0 + 0.654673721340388*G0_1_1_1 - 0.158024691358025*G0_2_1_0 + 0.711111111111111*G0_2_1_1; + A[208] = A[80] + 1.19647266313933*G0_0_0_0 + 0.191887125220459*G0_0_0_1 + 0.191887125220459*G0_0_1_0 + 0.88042328042328*G0_0_1_1 + 2.28007054673721*G0_1_0_0 + 1.60282186948853*G0_1_0_1 + 1.60282186948853*G0_1_1_0 + 2.91216931216931*G0_1_1_1 + 0.112874779541443*G0_2_0_0 + 0.0677248677248654*G0_2_1_1; + A[31] = -0.00511463844797177*G0_0_1_0 - 0.0257495590828926*G0_1_1_0 - 0.0257495590828924*G0_2_1_0; + A[129] = -A[86] + 0.0225749559082892*G0_0_0_1 + 0.101587301587302*G0_0_1_0 - 0.214462081128748*G0_0_1_1 - 0.0225749559082888*G0_1_0_1 - 0.101587301587302*G0_1_1_0 - 0.338624338624339*G0_1_1_1 + 0.0790123456790125*G0_2_1_1; + A[72] = A[108] - 0.0536155202821859*G0_0_0_1 - 0.0677248677248682*G0_0_1_0 - 0.0874779541446197*G0_0_1_1 + 0.203174603174603*G0_1_0_0 + 0.231393298059966*G0_1_0_1 + 0.313227513227512*G0_1_1_0 + 0.270899470899472*G0_1_1_1 + 0.355555555555555*G0_2_0_0 + 0.321693121693122*G0_2_0_1 + 0.253968253968253*G0_2_1_0 + 0.222927689594357*G0_2_1_1; + A[107] = 0.0255731922398589*G0_0_0_1 + 0.115520282186949*G0_0_1_1 + 0.0326278659611994*G0_1_0_1 + 0.052910052910053*G0_1_1_1 + 0.367195767195767*G0_2_0_1 + 0.299294532627866*G0_2_1_1; + A[7] = A[107] - 0.0679012345679015*G0_0_0_0 + 0.273721340388006*G0_0_0_1 - 0.0679012345679015*G0_0_1_0 + 0.183774250440917*G0_0_1_1 + 0.0202821869488536*G0_1_0_0 + 0.0202821869488534*G0_1_0_1 + 0.0202821869488536*G0_1_1_0 + 0.0899470899470899*G0_2_0_0 - 0.251675485008818*G0_2_0_1 + 0.0899470899470901*G0_2_1_0 - 0.183774250440917*G0_2_1_1; + A[182] = A[212] - 0.203174603174603*G0_0_1_1 - 0.135449735449735*G0_1_1_1 + 0.33862433862434*G0_2_1_1; + A[42] = A[182] - 0.00705467372134038*G0_0_0_1 + 0.00705467372134037*G0_0_1_0 + 0.00705467372134018*G0_1_0_1 - 0.00705467372134018*G0_1_1_0; + A[198] = -0.338624338624338*G0_0_0_0 - 0.0902998236331573*G0_0_0_1 + 0.112874779541446*G0_0_1_1 - 1.28677248677248*G0_1_0_0 - 0.993298059964725*G0_1_0_1 - 0.880423280423279*G0_1_1_0 - 0.812698412698411*G0_2_0_0 - 0.203174603174603*G0_2_0_1 - 0.406349206349206*G0_2_1_0 - 0.112874779541446*G0_2_1_1; + A[193] = -A[208] - 0.135449735449735*G0_0_0_1 + 1.21904761904762*G0_0_1_1 + 1.08359788359788*G0_1_0_0 + 0.677248677248675*G0_1_0_1 + 0.81269841269841*G0_1_1_0 + 2.97989417989418*G0_1_1_1 + 0.541798941798941*G0_2_0_0 + 0.27089947089947*G0_2_0_1 + 0.677248677248675*G0_2_1_1; + A[192] = -A[193] + 1.08359788359788*G0_0_0_0 + 0.27089947089947*G0_0_0_1 + 0.406349206349205*G0_0_1_0 + 2.57354497354497*G0_0_1_1 + 0.135449735449736*G0_1_1_0 + 1.35449735449736*G0_1_1_1 + 0.541798941798942*G0_2_0_0 + 0.541798941798942*G0_2_0_1 + 0.270899470899471*G0_2_1_0 + 0.948148148148148*G0_2_1_1; + A[32] = 0.0379188712522046*G0_0_1_1 + 0.0379188712522046*G0_1_1_1 + 0.297178130511464*G0_2_1_1; + A[25] = 0.115520282186949*G0_0_0_0 + 0.0255731922398589*G0_0_0_1 + 0.299294532627866*G0_1_0_0 + 0.367195767195767*G0_1_0_1 + 0.0529100529100528*G0_2_0_0 + 0.0326278659611992*G0_2_0_1; + A[61] = 0.0202821869488536*G0_0_0_0 - 0.0326278659611993*G0_0_1_0 - 0.0679012345679009*G0_1_0_0 - 0.367195767195768*G0_1_1_0 + 0.0899470899470897*G0_2_0_0 - 0.0255731922398589*G0_2_1_0; + A[159] = A[97] - 0.970723104056437*G0_0_0_0 + 0.970723104056436*G0_0_1_1 - 0.553086419753086*G0_1_0_0 - 0.584126984126983*G0_1_0_1 - 0.318871252204585*G0_1_1_0 - 0.237037037037036*G0_1_1_1 + 0.237037037037037*G0_2_0_0 + 0.584126984126984*G0_2_0_1 + 0.318871252204586*G0_2_1_0 + 0.553086419753087*G0_2_1_1; + A[106] = 0.0234567901234567*G0_0_0_0 - 0.0051146384479716*G0_0_1_0 - 0.0097001763668435*G0_1_0_0 + 0.0285714285714285*G0_2_0_0 + 0.00511463844797178*G0_2_1_0; + A[60] = A[106] - 0.0331569664903*G0_0_0_0 - 0.00970017636684333*G0_0_0_1 - 0.0045855379188717*G0_0_1_0 - 0.00970017636684337*G0_0_1_1 + 0.0331569664903001*G0_1_0_0 + 0.0234567901234566*G0_1_0_1 + 0.0285714285714288*G0_1_1_0 + 0.0285714285714282*G0_1_1_1 + 0.0285714285714281*G0_2_0_1 + 0.0183421516754848*G0_2_1_0 + 0.0234567901234565*G0_2_1_1; + A[4] = A[60] + 0.00511463844797156*G0_1_0_1 - 0.00511463844797157*G0_1_1_0 - 0.00511463844797156*G0_2_0_1 + 0.00511463844797156*G0_2_1_0; + A[1] = A[106] + 0.00229276895943574*G0_0_0_0 + 0.030864197530864*G0_0_1_0 + 0.0354497354497359*G0_1_0_0 + 0.025749559082893*G0_1_1_0 - 0.0234567901234567*G0_2_0_0; + A[187] = A[117] + 0.186243386243387*G0_0_0_1 - 0.186243386243387*G0_0_1_0 - 0.135449735449736*G0_1_0_1 + 0.135449735449735*G0_1_1_0 - 0.0507936507936511*G0_2_0_1 + 0.0507936507936512*G0_2_1_0; + A[50] = -A[170] + 0.0564373897707229*G0_0_0_0 - 0.0112874779541446*G0_0_0_1 - 0.0112874779541446*G0_1_0_0 - 0.293474426807761*G0_1_0_1 + 0.293474426807759*G0_2_0_0 - 0.237037037037037*G0_2_0_1; + A[99] = -A[50] - 0.259611992945326*G0_0_0_0 + 0.474074074074073*G0_0_0_1 + 0.677248677248677*G0_0_1_0 - 0.259611992945325*G0_0_1_1 + 0.124162257495591*G0_1_0_0 + 0.169312169312169*G0_1_1_0 + 0.338624338624339*G0_1_1_1 + 0.338624338624338*G0_2_0_0 + 0.169312169312168*G0_2_1_0 + 0.124162257495591*G0_2_1_1; + A[37] = 0.0255731922398589*G0_0_1_0 + 0.115520282186949*G0_0_1_1 + 0.0326278659611994*G0_1_1_0 + 0.052910052910053*G0_1_1_1 + 0.367195767195767*G0_2_1_0 + 0.299294532627866*G0_2_1_1; + A[85] = -A[212] + 0.00282186948853613*G0_0_0_0 - 0.00705467372134028*G0_0_0_1 + 0.00705467372134039*G0_0_1_1 - 0.00282186948853616*G0_1_0_0 - 0.0239858906525574*G0_1_0_1 - 0.0338624338624334*G0_1_1_0 - 0.011287477954146*G0_2_0_1 - 0.00846560846560879*G0_2_1_0 - 0.244091710758378*G0_2_1_1; + A[160] = 1.31216931216931*G0_0_0_0 + 0.177777777777778*G0_0_0_1 + 0.177777777777778*G0_0_1_0 + 0.622222222222222*G0_0_1_1 + 1.31216931216931*G0_1_0_0 + 1.13439153439153*G0_1_0_1 + 1.13439153439153*G0_1_1_0 + 1.57883597883598*G0_1_1_1 + 0.334391534391534*G0_2_0_0 + 0.167195767195767*G0_2_0_1 + 0.167195767195767*G0_2_1_0 + 0.249735449735449*G0_2_1_1; + A[91] = A[21] + 0.00776014109347462*G0_0_0_1 - 0.00776014109347462*G0_0_1_0 - 0.00776014109347444*G0_2_0_1 + 0.00776014109347444*G0_2_1_0; + A[168] = -A[176] + 0.575661375661375*G0_0_0_0 - 0.0790123456790123*G0_0_1_0 + 0.869135802469137*G0_1_0_0 + 0.158024691358026*G0_1_1_0 + 0.248324514991181*G0_2_0_0 - 0.0790123456790121*G0_2_1_0; + A[222] = A[193] + 1.48994708994709*G0_0_0_0 - 1.48994708994709*G0_0_1_1 + 0.948148148148145*G0_1_0_0 + 0.541798941798939*G0_1_0_1 + 0.135449735449735*G0_1_1_0 - 0.812698412698415*G0_1_1_1 + 0.81269841269841*G0_2_0_0 - 0.541798941798944*G0_2_0_1 - 0.135449735449737*G0_2_1_0 - 0.948148148148149*G0_2_1_1; + A[184] = A[72] + 0.0846560846560831*G0_1_0_1 - 0.0846560846560832*G0_1_1_0 - 0.0846560846560859*G0_2_0_1 + 0.0846560846560859*G0_2_1_0; + A[18] = -A[26] - 0.119929453262786*G0_0_0_0 - 0.285008818342152*G0_1_0_0 - 0.119929453262786*G0_2_0_0; + A[38] = -A[35] - 0.119929453262786*G0_0_1_1 - 0.119929453262787*G0_1_1_1 - 0.285008818342152*G0_2_1_1; + A[143] = A[129] + 0.0451499118165786*G0_0_0_1 - 0.0451499118165786*G0_0_1_0 - 0.0338624338624338*G0_1_0_1 + 0.0338624338624338*G0_1_1_0 - 0.0112874779541448*G0_2_0_1 + 0.0112874779541448*G0_2_1_0; + A[116] = -A[108] - 0.121340388007054*G0_0_0_0 + 0.0310405643738968*G0_0_1_0 + 0.0536155202821878*G0_1_0_0 - 0.152380952380951*G0_2_0_0 - 0.0310405643738976*G0_2_1_0; + A[139] = -A[116] + 0.0423280423280423*G0_0_0_1 + 0.0564373897707219*G0_0_1_0 + 0.0141093474426809*G0_0_1_1 - 0.0564373897707215*G0_1_0_1 - 0.042328042328042*G0_1_1_0 - 0.0846560846560833*G0_1_1_1 - 0.135449735449735*G0_2_0_0 - 0.0536155202821869*G0_2_0_1 - 0.0818342151675487*G0_2_1_0 - 0.0818342151675485*G0_2_1_1; + A[65] = A[139] - 0.126984126984127*G0_0_0_0 + 0.0141093474426808*G0_0_0_1 - 0.0564373897707223*G0_0_1_0 - 0.135449735449735*G0_0_1_1 + 0.0592592592592596*G0_1_0_0 + 0.355555555555555*G0_1_0_1 - 0.372486772486772*G0_1_1_1 - 0.626455026455024*G0_2_0_0 + 0.561552028218695*G0_2_0_1 - 0.129805996472662*G0_2_1_0; + A[110] = -A[65] - 0.112874779541446*G0_0_0_0 - 0.104409171075838*G0_0_1_0 - 0.279365079365079*G0_0_1_1 + 0.112874779541447*G0_1_0_0 + 0.406349206349206*G0_1_0_1 + 0.00846560846560922*G0_1_1_0 - 0.423280423280424*G0_1_1_1 + 0.88042328042328*G0_2_0_1 + 0.2652557319224*G0_2_1_0 + 0.143915343915344*G0_2_1_1; + A[113] = -A[110] - 0.307583774250441*G0_0_0_1 - 0.832451499118165*G0_0_1_1 - 0.0141093474426815*G0_1_0_1 - 0.186243386243387*G0_1_1_1 - 0.795767195767197*G0_2_0_1 - 0.826807760141095*G0_2_1_1; + A[79] = A[65] - 0.07336860670194*G0_0_0_1 + 0.07336860670194*G0_0_1_0 - 0.338624338624338*G0_1_0_1 + 0.338624338624338*G0_1_1_0 - 0.705467372134038*G0_2_0_1 + 0.705467372134038*G0_2_1_0; + A[70] = A[79] + 0.0966490299823631*G0_0_0_0 + 0.0839506172839501*G0_0_0_1 + 0.224338624338624*G0_0_1_1 + 0.00493827160493769*G0_1_0_0 + 0.13121693121693*G0_1_0_1 - 0.186243386243388*G0_1_1_0 + 0.639153439153438*G0_1_1_1 + 0.711111111111109*G0_2_0_0 + 0.277954144620809*G0_2_0_1 - 0.438095238095239*G0_2_1_0 + 0.190476190476189*G0_2_1_1; + A[157] = A[70] + 0.0211640211640206*G0_0_0_0 - 0.126984126984126*G0_0_0_1 - 0.0952380952380957*G0_0_1_0 - 0.0783068783068773*G0_0_1_1 - 0.0211640211640211*G0_1_0_0 - 0.116402116402116*G0_1_0_1 - 0.148148148148147*G0_1_1_0 - 0.165079365079364*G0_1_1_1 - 0.0994708994708992*G0_2_0_1 - 0.0994708994708995*G0_2_1_0 - 0.099470899470899*G0_2_1_1; + A[169] = A[116] - 0.0169312169312172*G0_0_0_0 - 0.0423280423280422*G0_0_0_1 + 0.0931216931216928*G0_0_1_1 + 0.0169312169312161*G0_1_0_0 + 0.293474426807761*G0_1_0_1 + 0.205996472663138*G0_1_1_0 + 0.694179894179893*G0_1_1_1 + 0.00282186948853662*G0_2_0_1 + 0.0479717813051144*G0_2_1_0 - 0.0253968253968252*G0_2_1_1; + A[154] = A[70] - 0.0105820105820102*G0_0_0_1 + 0.0105820105820102*G0_0_1_0 + 0.0211640211640201*G0_1_0_1 - 0.02116402116402*G0_1_1_0 - 0.0105820105820104*G0_2_0_1 + 0.0105820105820104*G0_2_1_0; + A[71] = A[169] + 0.0592592592592591*G0_0_0_1 - 0.0592592592592591*G0_0_1_0 - 0.0902998236331591*G0_1_0_1 + 0.0902998236331589*G0_1_1_0 + 0.0310405643738974*G0_2_0_1 - 0.0310405643738974*G0_2_1_0; + A[82] = A[110] - 0.0310405643738975*G0_0_0_1 + 0.0310405643738975*G0_0_1_0 - 0.0592592592592587*G0_1_0_1 + 0.0592592592592587*G0_1_1_0 + 0.0902998236331576*G0_2_0_1 - 0.0902998236331578*G0_2_1_0; + A[153] = A[82] - 0.138271604938271*G0_0_0_0 + 0.138271604938272*G0_0_1_1 + 0.138271604938271*G0_1_0_0 + 0.420458553791887*G0_1_0_1 + 0.27089947089947*G0_1_1_0 + 0.66031746031746*G0_1_1_1 - 0.66031746031746*G0_2_0_0 - 0.420458553791887*G0_2_0_1 - 0.27089947089947*G0_2_1_0 - 0.138271604938271*G0_2_1_1; + A[109] = A[70] + 0.0994708994708994*G0_0_0_0 - 0.0994708994709*G0_0_1_1 + 0.0783068783068788*G0_1_0_0 - 0.0169312169312151*G0_1_0_1 - 0.0486772486772472*G0_1_1_0 - 0.165079365079363*G0_1_1_1 + 0.165079365079367*G0_2_0_0 + 0.016931216931219*G0_2_0_1 + 0.0486772486772496*G0_2_1_0 - 0.0783068783068773*G0_2_1_1; + A[68] = -A[65] + 0.0141093474426811*G0_0_0_1 - 0.172134038800705*G0_0_1_1 + 0.307583774250441*G0_1_0_1 - 0.524867724867726*G0_1_1_1 + 0.795767195767195*G0_2_0_1 - 0.0310405643738978*G0_2_1_1; + A[100] = -A[68] + 0.318871252204585*G0_0_0_0 - 0.189065255731922*G0_0_0_1 - 0.220105820105821*G0_0_1_0 - 0.183421516754851*G0_1_0_0 - 0.098765432098766*G0_1_0_1 - 0.0366843033509705*G0_1_1_0 - 0.135449735449736*G0_1_1_1 + 0.728042328042325*G0_2_0_0 + 0.220105820105819*G0_2_0_1 + 0.189065255731921*G0_2_1_0; + A[207] = A[193] + 0.135449735449735*G0_0_0_1 - 0.135449735449735*G0_0_1_0 + 0.135449735449735*G0_1_0_1 - 0.135449735449735*G0_1_1_0 - 0.270899470899471*G0_2_0_1 + 0.270899470899471*G0_2_1_0; + A[55] = A[153] + 0.031040564373898*G0_0_0_1 - 0.031040564373898*G0_0_1_0 - 0.090299823633159*G0_1_0_1 + 0.090299823633159*G0_1_1_0 + 0.0592592592592592*G0_2_0_1 - 0.0592592592592592*G0_2_1_0; + A[175] = -A[55] - 0.832451499118165*G0_0_0_0 - 0.307583774250441*G0_0_0_1 - 0.826807760141094*G0_1_0_0 - 0.795767195767197*G0_1_0_1 - 0.186243386243386*G0_2_0_0 - 0.0141093474426807*G0_2_0_1; + A[130] = -A[85] + 0.0310405643738975*G0_0_1_0 - 0.121340388007055*G0_0_1_1 - 0.0310405643738971*G0_1_1_0 - 0.152380952380952*G0_1_1_1 + 0.0536155202821873*G0_2_1_1; + A[158] = A[130] + 0.0169312169312171*G0_0_0_1 - 0.0169312169312171*G0_0_1_0 - 0.0141093474426804*G0_1_0_1 + 0.0141093474426804*G0_1_1_0 - 0.00282186948853516*G0_2_0_1 + 0.00282186948853515*G0_2_1_0; + A[94] = -A[130] + 0.0141093474426806*G0_0_0_0 + 0.0395061728395063*G0_0_0_1 + 0.0592592592592597*G0_0_1_0 - 0.0818342151675487*G0_1_0_0 - 0.0677248677248686*G0_1_0_1 - 0.0677248677248674*G0_1_1_0 - 0.135449735449735*G0_1_1_1 - 0.0846560846560849*G0_2_0_0 - 0.0395061728395069*G0_2_0_1 - 0.0592592592592587*G0_2_1_0; + A[66] = A[94] + 0.00282186948853623*G0_0_0_1 - 0.00282186948853625*G0_0_1_0 + 0.0141093474426816*G0_1_0_1 - 0.0141093474426816*G0_1_1_0 - 0.0169312169312166*G0_2_0_1 + 0.0169312169312166*G0_2_1_0; + A[43] = A[42] + 0.0677248677248674*G0_0_1_1 - 0.0677248677248682*G0_1_1_1; + A[146] = -A[138] + 0.530511463844797*G0_0_0_0 + 0.237037037037037*G0_0_1_0 + 0.282186948853616*G0_1_0_0 + 0.29347442680776*G0_1_1_0 + 0.0677248677248678*G0_2_0_0 + 0.0112874779541446*G0_2_1_0; + A[144] = A[146] + 0.722398589065255*G0_0_0_0 + 0.248324514991182*G0_0_0_1 + 1.01587301587301*G0_0_1_1 + 0.203174603174603*G0_1_0_1 - 0.0451499118165781*G0_1_1_0 + 0.31604938271605*G0_1_1_1 + 0.090299823633157*G0_2_0_0 + 0.090299823633157*G0_2_0_1 + 0.0451499118165786*G0_2_1_0 + 0.158024691358025*G0_2_1_1; + A[174] = A[146] + 0.248324514991182*G0_0_0_1 - 0.248324514991182*G0_0_1_0 + 0.248324514991181*G0_1_0_1 - 0.248324514991181*G0_1_1_0 + 0.0451499118165785*G0_2_0_1 - 0.0451499118165785*G0_2_1_0; + A[220] = A[164] + 0.0846560846560849*G0_0_0_1 - 0.0846560846560849*G0_0_1_0 - 0.0846560846560844*G0_1_0_1 + 0.0846560846560843*G0_1_1_0; + A[197] = A[182] + 0.0677248677248674*G0_0_1_1 - 0.0677248677248683*G0_1_1_1; + A[194] = A[222] + 0.135449735449737*G0_0_0_1 - 0.135449735449737*G0_0_1_0 - 0.270899470899469*G0_1_0_1 + 0.270899470899469*G0_1_1_0 + 0.135449735449737*G0_2_0_1 - 0.135449735449736*G0_2_1_0; + A[19] = -A[25] + 0.135802469135802*G0_0_0_0 - 0.00705467372134037*G0_0_0_1 + 0.231393298059965*G0_1_0_0 + 0.142857142857142*G0_2_0_0 + 0.00705467372134028*G0_2_0_1; + A[12] = -A[139] - 0.224338624338623*G0_0_0_0 - 0.232804232804232*G0_0_0_1 - 0.235626102292769*G0_0_1_0 - 0.244091710758377*G0_0_1_1 + 0.055026455026455*G0_1_0_0 + 0.0169312169312175*G0_1_0_1 + 0.0409171075837736*G0_1_1_0 + 0.016931216931217*G0_2_0_0 + 0.0211640211640214*G0_2_0_1 + 0.00705467372134035*G0_2_1_1; + A[54] = A[138] - 0.0112874779541449*G0_0_0_1 + 0.0112874779541449*G0_0_1_0 + 0.0451499118165787*G0_1_0_1 - 0.0451499118165787*G0_1_1_0 - 0.0338624338624339*G0_2_0_1 + 0.0338624338624339*G0_2_1_0; + A[33] = -A[41] + 0.00987654320987642*G0_0_1_0 + 0.0395061728395063*G0_1_1_0 + 0.15379188712522*G0_2_1_0; + A[36] = -A[33] - 0.0141093474426807*G0_0_1_0 - 0.091710758377425*G0_0_1_1 + 0.0141093474426806*G0_1_1_0 - 0.0776014109347448*G0_1_1_1 - 0.118518518518519*G0_2_1_1; + A[165] = A[33] - 0.13615520282187*G0_0_0_0 - 0.13615520282187*G0_0_0_1 + 0.0253968253968257*G0_0_1_1 - 0.0839506172839506*G0_1_0_0 - 0.0839506172839504*G0_1_0_1 - 0.0839506172839504*G0_1_1_0 - 0.0253968253968253*G0_2_0_0 - 0.0253968253968253*G0_2_0_1 - 0.161552028218695*G0_2_1_0 - 0.0253968253968251*G0_2_1_1; + A[11] = A[165] + 0.153791887125221*G0_0_0_1 - 0.153791887125221*G0_0_1_0 + 0.0317460317460317*G0_1_0_1 - 0.0317460317460317*G0_1_1_0 + 0.0176366843033509*G0_2_0_1 - 0.0176366843033509*G0_2_1_0; + A[45] = -A[165] - 0.153791887125221*G0_0_0_0 - 0.153791887125221*G0_0_0_1 - 0.0395061728395065*G0_1_0_0 - 0.0395061728395064*G0_1_0_1 - 0.00987654320987653*G0_2_0_0 - 0.00987654320987648*G0_2_0_1; + A[5] = A[45] - 0.0366843033509697*G0_1_0_0 - 0.0289241622574952*G0_1_0_1 - 0.0444444444444443*G0_1_1_0 - 0.0366843033509698*G0_1_1_1 + 0.0366843033509702*G0_2_0_0 + 0.0289241622574955*G0_2_0_1 + 0.0444444444444449*G0_2_1_0 + 0.0366843033509701*G0_2_1_1; + A[8] = -A[5] - 0.15379188712522*G0_0_0_1 - 0.15379188712522*G0_0_1_1 - 0.00987654320987654*G0_1_0_1 - 0.00987654320987659*G0_1_1_1 - 0.0395061728395063*G0_2_0_1 - 0.0395061728395065*G0_2_1_1; + A[75] = A[5] - 0.00776014109347442*G0_1_0_1 + 0.00776014109347441*G0_1_1_0 + 0.00776014109347493*G0_2_0_1 - 0.00776014109347493*G0_2_1_0; + A[120] = -A[75] - 0.15379188712522*G0_0_1_0 - 0.15379188712522*G0_0_1_1 - 0.00987654320987655*G0_1_1_0 - 0.00987654320987659*G0_1_1_1 - 0.0395061728395063*G0_2_1_0 - 0.0395061728395065*G0_2_1_1; + A[127] = A[113] + 0.338624338624339*G0_0_0_1 - 0.338624338624339*G0_0_1_0 + 0.0733686067019402*G0_1_0_1 - 0.0733686067019402*G0_1_1_0 + 0.705467372134039*G0_2_0_1 - 0.705467372134039*G0_2_1_0; + A[62] = -A[107] - 0.00705467372134036*G0_0_0_1 + 0.135802469135802*G0_0_1_1 + 0.00705467372134062*G0_1_0_1 + 0.142857142857143*G0_1_1_1 + 0.231393298059965*G0_2_1_1; + A[44] = A[42] + 0.203174603174603*G0_0_1_1 + 0.135449735449735*G0_1_1_1 - 0.33862433862434*G0_2_1_1; + A[141] = A[99] + 0.158024691358026*G0_0_0_1 - 0.158024691358026*G0_0_1_0 - 0.0790123456790125*G0_1_0_1 + 0.0790123456790125*G0_1_1_0 - 0.0790123456790126*G0_2_0_1 + 0.0790123456790126*G0_2_1_0; + A[78] = -A[86] + 0.0564373897707229*G0_0_0_0 - 0.0112874779541446*G0_0_1_0 - 0.0112874779541446*G0_1_0_0 - 0.293474426807761*G0_1_1_0 + 0.293474426807759*G0_2_0_0 - 0.237037037037037*G0_2_1_0; + A[172] = -A[52] - 0.121340388007054*G0_0_0_0 + 0.0310405643738968*G0_0_0_1 + 0.0536155202821878*G0_1_0_0 - 0.152380952380951*G0_2_0_0 - 0.0310405643738976*G0_2_0_1; + A[155] = -A[158] + 0.0310405643738975*G0_0_0_1 - 0.121340388007055*G0_0_1_1 - 0.0310405643738971*G0_1_0_1 - 0.152380952380952*G0_1_1_1 + 0.0536155202821873*G0_2_1_1; + A[105] = A[7] - 0.367195767195767*G0_0_0_1 + 0.367195767195767*G0_0_1_0 - 0.0326278659611993*G0_1_0_1 + 0.0326278659611993*G0_1_1_0 - 0.0255731922398587*G0_2_0_1 + 0.0255731922398587*G0_2_1_0; + A[10] = A[105] + 0.367195767195768*G0_0_0_0 - 0.367195767195766*G0_0_1_1 + 0.0952380952380952*G0_1_0_0 + 0.0696649029982362*G0_1_0_1 + 0.0626102292768958*G0_1_1_0 + 0.0370370370370367*G0_1_1_1 - 0.0370370370370371*G0_2_0_0 - 0.0696649029982366*G0_2_0_1 - 0.062610229276896*G0_2_1_0 - 0.0952380952380955*G0_2_1_1; + A[150] = A[10] + 0.367195767195767*G0_0_0_1 - 0.367195767195767*G0_0_1_0 + 0.0255731922398588*G0_1_0_1 - 0.0255731922398588*G0_1_1_0 + 0.0326278659611992*G0_2_0_1 - 0.0326278659611992*G0_2_1_0; + A[180] = A[12] + 0.0070546737213403*G0_1_0_1 - 0.00705467372134028*G0_1_1_0 - 0.00705467372134033*G0_2_0_1 + 0.00705467372134033*G0_2_1_0; + A[173] = -A[170] + 0.0564373897707232*G0_0_0_1 - 0.0564373897707234*G0_0_1_1 - 0.0564373897707244*G0_1_0_1 - 0.293474426807762*G0_1_1_1 + 0.0112874779541446*G0_2_1_1; + A[51] = -A[173] - 0.0790123456790118*G0_0_0_0 + 0.0112874779541451*G0_0_0_1 - 0.0225749559082895*G0_0_1_0 - 0.0564373897707232*G0_1_0_0 - 0.0677248677248673*G0_2_0_0 - 0.0112874779541446*G0_2_0_1 + 0.0225749559082891*G0_2_1_0; + A[191] = A[51] + 0.428924162257494*G0_0_0_0 - 0.0225749559082899*G0_0_0_1 - 0.0790123456790118*G0_0_1_0 + 0.0112874779541436*G0_0_1_1 - 0.29347442680776*G0_1_0_0 - 0.191887125220459*G0_1_0_1 - 0.158024691358025*G0_1_1_0 + 0.203174603174603*G0_2_0_0 - 0.0225749559082895*G0_2_0_1 - 0.0112874779541452*G0_2_1_1; + A[213] = -A[191] + 0.564373897707229*G0_0_0_0 - 0.112874779541446*G0_0_1_0 - 0.293474426807761*G0_1_0_0 + 0.677248677248675*G0_2_0_0 + 0.112874779541447*G0_2_1_0; + A[183] = A[213] + 0.27089947089947*G0_1_0_0 - 0.27089947089947*G0_2_0_0; + A[57] = A[183] - 0.0451499118165789*G0_0_0_1 + 0.0451499118165789*G0_0_1_0 - 0.0225749559082896*G0_1_0_1 + 0.0225749559082896*G0_1_1_0 + 0.0677248677248676*G0_2_0_1 - 0.0677248677248675*G0_2_1_0; + A[103] = A[57] + 0.135449735449736*G0_0_0_0 + 0.135449735449735*G0_0_0_1 + 0.0677248677248671*G0_0_1_0 - 0.0677248677248668*G0_0_1_1 - 0.135449735449734*G0_1_0_0 - 0.0677248677248688*G0_1_1_0 + 0.135449735449735*G0_1_1_1 + 0.135449735449735*G0_2_1_0 + 0.0677248677248675*G0_2_1_1; + A[104] = A[103] - 0.270899470899471*G0_0_0_0 - 0.27089947089947*G0_0_0_1 - 0.270899470899472*G0_0_1_0 - 0.270899470899473*G0_0_1_1 + 0.270899470899472*G0_2_0_0 + 0.270899470899471*G0_2_0_1 + 0.270899470899471*G0_2_1_0 + 0.270899470899471*G0_2_1_1; + A[216] = A[104] - 0.0225749559082903*G0_0_0_1 + 0.0225749559082903*G0_0_1_0 - 0.0451499118165783*G0_1_0_1 + 0.0451499118165782*G0_1_1_0 + 0.0677248677248682*G0_2_0_1 - 0.0677248677248683*G0_2_1_0; + A[186] = -A[216] - 1.21904761904762*G0_0_0_0 - 0.451499118165787*G0_0_0_1 - 0.541798941798941*G0_0_1_0 + 0.22574955908289*G0_0_1_1 - 0.135449735449735*G0_1_0_0 - 0.0902998236331568*G0_1_0_1 - 0.135449735449736*G0_1_1_0 - 0.27089947089947*G0_2_0_0 - 0.135449735449735*G0_2_0_1 + 0.0451499118165781*G0_2_1_1; + A[201] = A[103] - 0.0225749559082888*G0_0_0_1 + 0.0225749559082888*G0_0_1_0 - 0.0451499118165801*G0_1_0_1 + 0.0451499118165801*G0_1_1_0 + 0.0677248677248672*G0_2_0_1 - 0.0677248677248673*G0_2_1_0; + A[133] = -A[103] + 0.361199294532628*G0_0_0_0 + 0.0902998236331571*G0_0_0_1 + 0.180599647266315*G0_1_0_0 + 0.135449735449737*G0_1_0_1 + 0.135449735449735*G0_1_1_0 + 0.270899470899472*G0_1_1_1 + 0.270899470899472*G0_2_0_0 - 0.0902998236331543*G0_2_0_1; + A[132] = A[133] + 0.27089947089947*G0_0_1_1 - 0.270899470899473*G0_2_1_1; + A[188] = A[132] - 0.067724867724868*G0_0_0_1 + 0.0677248677248681*G0_0_1_0 + 0.0451499118165782*G0_1_0_1 - 0.0451499118165782*G0_1_1_0 + 0.0225749559082893*G0_2_0_1 - 0.0225749559082893*G0_2_1_0; + A[88] = -A[133] - 0.112874779541446*G0_0_1_0 + 0.29347442680776*G0_0_1_1 + 0.112874779541446*G0_1_1_0 + 0.677248677248677*G0_1_1_1 - 0.0225749559082894*G0_2_1_1; + A[179] = -A[57] + 0.293474426807759*G0_0_0_0 - 0.112874779541446*G0_0_0_1 + 0.24832451499118*G0_1_0_0 + 0.406349206349205*G0_2_0_0 + 0.112874779541446*G0_2_0_1; + A[149] = -A[179] + 0.0902998236331581*G0_0_1_0 + 0.361199294532629*G0_0_1_1 - 0.090299823633156*G0_1_1_0 + 0.270899470899472*G0_1_1_1 + 0.27089947089947*G0_2_0_0 + 0.135449735449735*G0_2_0_1 + 0.135449735449737*G0_2_1_0 + 0.180599647266315*G0_2_1_1; + A[148] = A[149] - 0.27089947089947*G0_0_0_0 - 0.270899470899469*G0_0_0_1 - 0.270899470899471*G0_0_1_0 - 0.270899470899473*G0_0_1_1 + 0.27089947089947*G0_1_0_0 + 0.27089947089947*G0_1_0_1 + 0.27089947089947*G0_1_1_0 + 0.27089947089947*G0_1_1_1; + A[204] = A[148] + 0.0225749559082887*G0_0_0_1 - 0.0225749559082887*G0_0_1_0 - 0.0677248677248672*G0_1_0_1 + 0.0677248677248672*G0_1_1_0 + 0.045149911816579*G0_2_0_1 - 0.045149911816579*G0_2_1_0; + A[219] = A[149] + 0.0225749559082913*G0_0_0_1 - 0.0225749559082911*G0_0_1_0 - 0.0677248677248669*G0_1_0_1 + 0.0677248677248669*G0_1_1_0 + 0.0451499118165797*G0_2_0_1 - 0.0451499118165797*G0_2_1_0; + A[189] = -A[204] + 0.225749559082892*G0_0_0_0 - 0.541798941798941*G0_0_0_1 - 0.451499118165784*G0_0_1_0 - 1.21904761904762*G0_0_1_1 + 0.0451499118165776*G0_1_0_0 - 0.135449735449736*G0_1_1_0 - 0.270899470899471*G0_1_1_1 - 0.135449735449736*G0_2_0_1 - 0.0902998236331573*G0_2_1_0 - 0.135449735449736*G0_2_1_1; + A[118] = A[202] + 0.084656084656085*G0_0_0_1 - 0.084656084656085*G0_0_1_0 - 0.0846560846560847*G0_2_0_1 + 0.0846560846560847*G0_2_1_0; + A[199] = A[118] - 0.0338624338624338*G0_0_0_0 - 0.05079365079365*G0_0_1_0 - 0.321693121693121*G0_0_1_1 + 0.0338624338624355*G0_1_0_0 - 0.69417989417989*G0_1_0_1 - 0.507936507936506*G0_1_1_0 - 1.72698412698412*G0_1_1_1 - 0.423280423280421*G0_2_0_1 - 0.558730158730156*G0_2_1_0 - 0.694179894179892*G0_2_1_1; + A[163] = A[199] + 0.321693121693121*G0_0_0_0 - 0.220105820105821*G0_0_0_1 - 0.135449735449736*G0_0_1_0 - 0.372486772486772*G0_0_1_1 - 0.524867724867724*G0_1_0_0 - 0.524867724867726*G0_1_0_1 - 0.524867724867724*G0_1_1_0 - 0.304761904761905*G0_2_0_0 + 0.237037037037036*G0_2_0_1 + 0.152380952380951*G0_2_1_0 + 0.372486772486772*G0_2_1_1; + A[205] = A[163] - 0.0507936507936504*G0_0_0_1 + 0.0507936507936505*G0_0_1_0 + 0.186243386243388*G0_1_0_1 - 0.186243386243388*G0_1_1_0 - 0.135449735449735*G0_2_0_1 + 0.135449735449735*G0_2_1_0; + A[73] = A[199] - 0.135449735449735*G0_0_0_1 + 0.135449735449735*G0_0_1_0 + 0.186243386243386*G0_1_0_1 - 0.186243386243386*G0_1_1_0 - 0.0507936507936504*G0_2_0_1 + 0.0507936507936504*G0_2_1_0; + A[214] = A[73] - 0.541798941798941*G0_0_0_0 + 0.541798941798941*G0_0_1_1 - 0.677248677248678*G0_1_0_0 + 0.0169312169312145*G0_1_0_1 + 0.253968253968251*G0_1_1_0 + 2.03174603174603*G0_1_1_1 - 2.03174603174603*G0_2_0_0 - 0.0169312169312198*G0_2_0_1 - 0.253968253968257*G0_2_1_0 + 0.677248677248675*G0_2_1_1; + A[119] = A[205] - 1.23597883597884*G0_0_0_0 + 1.23597883597884*G0_0_1_1 + 0.220105820105818*G0_1_0_0 + 0.694179894179891*G0_1_0_1 + 1.01587301587301*G0_1_1_0 + 1.72698412698412*G0_1_1_1 - 1.72698412698413*G0_2_0_0 - 0.694179894179895*G0_2_0_1 - 1.01587301587302*G0_2_1_0 - 0.220105820105822*G0_2_1_1; + A[217] = A[119] + 0.0507936507936515*G0_0_0_1 - 0.0507936507936514*G0_0_1_0 + 0.135449735449735*G0_1_0_1 - 0.135449735449735*G0_1_1_0 - 0.186243386243388*G0_2_0_1 + 0.186243386243388*G0_2_1_0; + A[200] = -A[188] - 0.112874779541447*G0_0_0_1 + 0.56437389770723*G0_0_1_1 + 0.112874779541445*G0_1_0_1 + 0.677248677248676*G0_1_1_1 - 0.293474426807763*G0_2_1_1; + A[22] = A[106] - 0.00511463844797165*G0_0_0_1 + 0.00511463844797164*G0_0_1_0 + 0.00511463844797165*G0_2_0_1 - 0.00511463844797165*G0_2_1_0; + A[15] = A[22] + 0.00229276895943575*G0_0_0_0 + 0.0308641975308641*G0_0_0_1 + 0.0354497354497359*G0_1_0_0 + 0.025749559082893*G0_1_0_1 - 0.0234567901234567*G0_2_0_0; + A[9] = A[135] + 0.687125220458553*G0_0_0_1 - 0.687125220458553*G0_0_1_0 + 0.0458553791887124*G0_1_0_1 - 0.0458553791887124*G0_1_1_0 + 0.0458553791887123*G0_2_0_1 - 0.0458553791887123*G0_2_1_0; + A[90] = A[9] + 0.687125220458553*G0_0_0_0 - 0.687125220458553*G0_0_1_1 + 0.0705467372134038*G0_1_0_0 + 0.0246913580246913*G0_1_0_1 + 0.0246913580246913*G0_1_1_0 - 0.0211640211640212*G0_1_1_1 + 0.021164021164021*G0_2_0_0 - 0.0246913580246915*G0_2_0_1 - 0.0246913580246914*G0_2_1_0 - 0.0705467372134038*G0_2_1_1; + A[6] = A[90] - 0.687125220458553*G0_0_0_1 + 0.687125220458553*G0_0_1_0 - 0.0458553791887124*G0_1_0_1 + 0.0458553791887124*G0_1_1_0 - 0.0458553791887123*G0_2_0_1 + 0.0458553791887123*G0_2_1_0; + A[49] = -A[169] - 0.172134038800705*G0_0_0_0 + 0.0141093474426808*G0_0_0_1 - 0.0310405643738983*G0_1_0_0 + 0.795767195767197*G0_1_0_1 - 0.524867724867724*G0_2_0_0 + 0.307583774250441*G0_2_0_1; + A[34] = -A[37] - 0.00705467372134036*G0_0_1_0 + 0.135802469135802*G0_0_1_1 + 0.00705467372134061*G0_1_1_0 + 0.142857142857143*G0_1_1_1 + 0.231393298059965*G0_2_1_1; + A[147] = A[189] + 0.112874779541446*G0_0_0_1 - 0.112874779541446*G0_0_1_0 - 0.203174603174603*G0_1_0_1 + 0.203174603174603*G0_1_1_0 + 0.0902998236331573*G0_2_0_1 - 0.0902998236331574*G0_2_1_0; + A[124] = -A[79] + 0.0141093474426811*G0_0_1_0 - 0.172134038800705*G0_0_1_1 + 0.307583774250441*G0_1_1_0 - 0.524867724867726*G0_1_1_1 + 0.795767195767195*G0_2_1_0 - 0.0310405643738978*G0_2_1_1; + A[84] = -A[129] + 0.0564373897707232*G0_0_1_0 - 0.237037037037037*G0_0_1_1 - 0.0564373897707231*G0_1_1_0 - 0.112874779541446*G0_1_1_1 + 0.0112874779541447*G0_2_1_1; + A[67] = A[109] - 0.0105820105820117*G0_0_0_1 + 0.0105820105820117*G0_0_1_0 - 0.010582010582012*G0_1_0_1 + 0.010582010582012*G0_1_1_0 + 0.0211640211640202*G0_2_0_1 - 0.0211640211640202*G0_2_1_0; + A[161] = -A[153] - 0.832451499118165*G0_0_0_0 - 0.307583774250441*G0_0_1_0 - 0.826807760141094*G0_1_0_0 - 0.795767195767197*G0_1_1_0 - 0.186243386243386*G0_2_0_0 - 0.0141093474426807*G0_2_1_0; + A[96] = A[144] - 0.158024691358026*G0_0_0_0 + 0.158024691358025*G0_0_1_1 - 0.248324514991181*G0_1_0_0 - 0.327336860670194*G0_1_0_1 - 0.327336860670194*G0_1_1_0 - 0.406349206349206*G0_1_1_1 + 0.406349206349206*G0_2_0_0 + 0.327336860670194*G0_2_0_1 + 0.327336860670194*G0_2_1_0 + 0.248324514991181*G0_2_1_1; + A[156] = A[100] - 0.0902998236331573*G0_0_0_1 + 0.0902998236331573*G0_0_1_0 + 0.0310405643738982*G0_1_0_1 - 0.0310405643738982*G0_1_1_0 + 0.0592592592592594*G0_2_0_1 - 0.0592592592592594*G0_2_1_0; + A[142] = A[156] - 0.174955908289241*G0_0_0_0 + 0.174955908289242*G0_0_1_1 + 0.107231040564374*G0_1_0_0 + 0.0620811287477952*G0_1_0_1 + 0.0338624338624339*G0_1_1_0 + 0.101587301587301*G0_1_1_1 - 0.101587301587302*G0_2_0_0 - 0.0620811287477954*G0_2_0_1 - 0.0338624338624341*G0_2_1_0 - 0.107231040564374*G0_2_1_1; + A[112] = A[160] - 0.689947089947089*G0_0_0_0 + 0.689947089947089*G0_0_1_1 - 1.06243386243386*G0_1_0_0 - 0.967195767195767*G0_1_0_1 - 0.967195767195767*G0_1_1_0 - 1.24444444444444*G0_1_1_1 + 1.24444444444444*G0_2_0_0 + 0.967195767195768*G0_2_0_1 + 0.967195767195768*G0_2_1_0 + 1.06243386243386*G0_2_1_1; + A[223] = -A[204] - 0.767548500881834*G0_0_0_0 + 0.248324514991182*G0_0_1_0 - 0.338624338624339*G0_0_1_1 + 0.496649029982362*G0_1_0_0 + 0.948148148148147*G0_1_0_1 + 0.880423280423279*G0_1_1_0 - 0.406349206349206*G0_2_0_0 + 0.744973544973544*G0_2_0_1 + 0.56437389770723*G0_2_1_0 + 0.338624338624339*G0_2_1_1; + A[185] = A[200] - 0.27089947089947*G0_1_1_1 + 0.270899470899473*G0_2_1_1; + A[203] = A[188] - 0.27089947089947*G0_0_1_1 + 0.270899470899473*G0_2_1_1; + A[3] = A[45] + 0.00776014109347471*G0_1_0_1 - 0.00776014109347471*G0_1_1_0 - 0.00776014109347449*G0_2_0_1 + 0.00776014109347449*G0_2_1_0; + A[59] = A[57] - 0.27089947089947*G0_1_0_0 + 0.27089947089947*G0_2_0_0; + A[17] = -0.00511463844797177*G0_0_0_1 - 0.0257495590828926*G0_1_0_1 - 0.0257495590828924*G0_2_0_1; + A[2] = -A[17] + 0.0206349206349206*G0_0_0_1 + 0.0257495590828924*G0_0_1_1 - 0.0206349206349208*G0_1_0_1 + 0.00511463844797179*G0_1_1_1 + 0.0257495590828927*G0_2_1_1; + A[134] = -A[89] + 0.29347442680776*G0_0_1_0 - 0.654673721340388*G0_0_1_1 - 0.29347442680776*G0_1_1_0 - 0.948148148148148*G0_1_1_1 - 0.699823633156966*G0_2_1_1; + A[218] = A[134] + 0.203174603174603*G0_0_0_1 - 0.203174603174603*G0_0_1_0 - 0.0902998236331566*G0_1_0_1 + 0.0902998236331566*G0_1_1_0 - 0.112874779541444*G0_2_0_1 + 0.112874779541444*G0_2_1_0; + A[215] = -A[218] + 0.29347442680776*G0_0_0_1 - 0.654673721340388*G0_0_1_1 - 0.29347442680776*G0_1_0_1 - 0.948148148148148*G0_1_1_1 - 0.699823633156966*G0_2_1_1; + A[69] = A[139] - 0.00282186948853693*G0_0_0_1 + 0.00282186948853693*G0_0_1_0 + 0.0169312169312158*G0_1_0_1 - 0.0169312169312158*G0_1_1_0 - 0.0141093474426813*G0_2_0_1 + 0.0141093474426814*G0_2_1_0; + A[48] = -A[56] + 0.327336860670193*G0_0_0_0 + 0.0790123456790122*G0_0_1_0 + 0.71111111111111*G0_1_0_0 - 0.158024691358027*G0_1_1_0 + 0.654673721340387*G0_2_0_0 + 0.0790123456790121*G0_2_1_0; + A[39] = A[41] + 0.03668430335097*G0_0_1_1 - 0.0366843033509704*G0_1_1_1; + A[137] = A[39] - 0.00776014109347438*G0_0_0_1 + 0.00776014109347439*G0_0_1_0 + 0.00776014109347446*G0_1_0_1 - 0.00776014109347447*G0_1_1_0; + A[167] = A[137] - 0.03668430335097*G0_0_1_1 + 0.0366843033509704*G0_1_1_1; + A[47] = -A[167] + 0.00987654320987642*G0_0_0_1 + 0.0395061728395063*G0_1_0_1 + 0.15379188712522*G0_2_0_1; + A[92] = -A[47] - 0.0141093474426807*G0_0_0_1 - 0.091710758377425*G0_0_1_1 + 0.0141093474426806*G0_1_0_1 - 0.0776014109347448*G0_1_1_1 - 0.118518518518519*G0_2_1_1; + A[121] = A[91] - 0.0366843033509698*G0_0_0_0 + 0.03668430335097*G0_2_0_0; + A[76] = -A[121] + 0.00987654320987649*G0_0_1_0 + 0.153791887125221*G0_1_1_0 + 0.0395061728395061*G0_2_1_0; + A[136] = -A[76] - 0.0917107583774251*G0_0_0_0 - 0.0141093474426808*G0_0_1_0 - 0.118518518518519*G0_1_0_0 - 0.0776014109347442*G0_2_0_0 + 0.0141093474426807*G0_2_1_0; + A[87] = A[88] - 0.27089947089947*G0_1_1_1 + 0.270899470899473*G0_2_1_1; + A[64] = A[160] - 1.06243386243386*G0_0_0_0 - 0.0952380952380957*G0_0_0_1 - 0.0952380952380957*G0_0_1_0 - 0.372486772486772*G0_0_1_1 - 0.689947089947091*G0_1_0_0 - 0.689947089947091*G0_1_0_1 - 0.689947089947091*G0_1_1_0 + 1.24444444444444*G0_2_0_0 + 0.277248677248677*G0_2_0_1 + 0.277248677248677*G0_2_1_0 + 0.372486772486772*G0_2_1_1; + A[162] = A[187] - 0.524867724867723*G0_0_0_0 + 0.524867724867722*G0_0_1_1 + 0.321693121693121*G0_1_0_0 + 0.54179894179894*G0_1_0_1 + 0.457142857142855*G0_1_1_0 + 0.304761904761902*G0_1_1_1 - 0.304761904761906*G0_2_0_0 - 0.541798941798943*G0_2_0_1 - 0.457142857142859*G0_2_1_0 - 0.321693121693123*G0_2_1_1; + A[166] = -A[46] - 0.119929453262786*G0_0_0_0 - 0.285008818342152*G0_1_0_0 - 0.119929453262786*G0_2_0_0; + A[115] = A[157] + 0.0211640211640203*G0_0_0_1 - 0.0211640211640204*G0_0_1_0 - 0.0105820105820107*G0_1_0_1 + 0.0105820105820107*G0_1_1_0 - 0.0105820105820108*G0_2_0_1 + 0.0105820105820107*G0_2_1_0; + A[224] = -A[222] + 1.21904761904762*G0_0_0_0 - 0.135449735449736*G0_0_0_1 + 0.677248677248678*G0_1_0_0 + 0.270899470899471*G0_1_0_1 + 0.541798941798942*G0_1_1_1 + 2.97989417989418*G0_2_0_0 + 0.677248677248678*G0_2_0_1 + 0.812698412698415*G0_2_1_0 + 1.08359788359788*G0_2_1_1; + A[190] = A[162] - 0.186243386243386*G0_0_0_1 + 0.186243386243386*G0_0_1_0 + 0.0507936507936506*G0_1_0_1 - 0.0507936507936507*G0_1_1_0 + 0.135449735449735*G0_2_0_1 - 0.135449735449735*G0_2_1_0; + A[206] = -A[198] - 0.654673721340387*G0_0_0_0 + 0.29347442680776*G0_0_1_0 - 0.699823633156965*G0_1_0_0 - 0.948148148148147*G0_2_0_0 - 0.29347442680776*G0_2_1_0; + A[178] = A[206] + 0.203174603174603*G0_0_0_1 - 0.203174603174603*G0_0_1_0 - 0.112874779541445*G0_1_0_1 + 0.112874779541445*G0_1_1_0 - 0.0902998236331572*G0_2_0_1 + 0.0902998236331572*G0_2_1_0; + A[0] = A[16] + 0.259259259259259*G0_0_0_0 + 0.297178130511464*G0_0_0_1 + 0.297178130511464*G0_0_1_0 + 0.297178130511464*G0_0_1_1 - 0.259259259259259*G0_1_0_0 + 0.0379188712522045*G0_1_0_1 + 0.0379188712522045*G0_1_1_0 + 0.0379188712522045*G0_1_1_1 + 0.0379188712522045*G0_2_0_1 + 0.0379188712522045*G0_2_1_0 + 0.0379188712522045*G0_2_1_1; + A[58] = -A[178] - 0.654673721340387*G0_0_0_0 + 0.29347442680776*G0_0_0_1 - 0.699823633156965*G0_1_0_0 - 0.948148148148147*G0_2_0_0 - 0.29347442680776*G0_2_0_1; + A[28] = 0.0917107583774248*G0_0_0_0 + 0.00705467372134039*G0_0_0_1 - 0.261022927689594*G0_1_0_0 + 0.0846560846560846*G0_2_0_0 - 0.0070546737213402*G0_2_0_1; + A[27] = A[28] - 0.203174603174603*G0_0_0_0 + 0.338624338624338*G0_1_0_0 - 0.135449735449735*G0_2_0_0; + A[181] = A[27] - 0.00705467372134047*G0_0_0_1 + 0.00705467372134047*G0_0_1_0 + 0.00705467372134035*G0_2_0_1 - 0.00705467372134034*G0_2_1_0; + A[211] = A[181] + 0.0677248677248674*G0_0_0_0 - 0.0677248677248674*G0_2_0_0; + A[195] = A[27] + 0.189065255731922*G0_0_0_0 + 0.0705467372134038*G0_0_0_1 + 0.0776014109347436*G0_0_1_0 + 0.0776014109347436*G0_0_1_1 - 0.189065255731922*G0_1_0_0 - 0.111463844797178*G0_1_0_1 - 0.118518518518518*G0_1_1_0 - 0.118518518518518*G0_1_1_1 - 0.0437389770723102*G0_2_0_1 - 0.0437389770723101*G0_2_1_0 - 0.0437389770723101*G0_2_1_1; + A[14] = A[195] + 0.0677248677248673*G0_1_0_0 + 0.0606701940035268*G0_1_0_1 + 0.0747795414462078*G0_1_1_0 + 0.0677248677248673*G0_1_1_1 - 0.0677248677248676*G0_2_0_0 - 0.0606701940035273*G0_2_0_1 - 0.0747795414462082*G0_2_1_0 - 0.0677248677248679*G0_2_1_1; + A[29] = A[27] + 0.0677248677248674*G0_0_0_0 - 0.0677248677248674*G0_2_0_0; + A[210] = A[14] + 0.00705467372134036*G0_1_0_1 - 0.00705467372134034*G0_1_1_0 - 0.00705467372134043*G0_2_0_1 + 0.00705467372134044*G0_2_1_0; + A[131] = -A[86] + 0.0564373897707232*G0_0_1_0 - 0.0564373897707234*G0_0_1_1 - 0.0564373897707244*G0_1_1_0 - 0.293474426807762*G0_1_1_1 + 0.0112874779541446*G0_2_1_1; + A[123] = -A[131] - 0.0564373897707229*G0_0_0_0 + 0.0564373897707233*G0_0_1_0 + 0.0112874779541446*G0_1_0_0 - 0.293474426807759*G0_2_0_0 - 0.0564373897707233*G0_2_1_0; + A[74] = A[214] + 0.135449735449735*G0_0_0_1 - 0.135449735449735*G0_0_1_0 + 0.0507936507936507*G0_1_0_1 - 0.0507936507936506*G0_1_1_0 - 0.186243386243386*G0_2_0_1 + 0.186243386243386*G0_2_1_0; + A[40] = -0.00511463844797175*G0_0_1_0 + 0.0234567901234569*G0_0_1_1 + 0.00511463844797171*G0_1_1_0 + 0.0285714285714286*G0_1_1_1 - 0.00970017636684292*G0_2_1_1; + A[145] = A[159] + 0.705467372134037*G0_0_0_1 - 0.705467372134038*G0_0_1_0 + 0.338624338624338*G0_1_0_1 - 0.338624338624338*G0_1_1_0 + 0.07336860670194*G0_2_0_1 - 0.07336860670194*G0_2_1_0; + A[151] = -A[61] + 0.135802469135802*G0_0_0_0 - 0.00705467372134038*G0_0_1_0 + 0.231393298059965*G0_1_0_0 + 0.142857142857143*G0_2_0_0 + 0.00705467372134027*G0_2_1_0; + A[102] = A[186] - 0.112874779541444*G0_0_0_1 + 0.112874779541444*G0_0_1_0 - 0.0902998236331571*G0_1_0_1 + 0.0902998236331571*G0_1_1_0 + 0.203174603174603*G0_2_0_1 - 0.203174603174603*G0_2_1_0; + A[177] = A[179] + 0.27089947089947*G0_0_0_0 - 0.270899470899471*G0_1_0_0; + A[114] = A[142] + 0.0902998236331564*G0_0_0_1 - 0.0902998236331564*G0_0_1_0 - 0.0592592592592595*G0_1_0_1 + 0.0592592592592595*G0_1_1_0 - 0.0310405643738982*G0_2_0_1 + 0.0310405643738981*G0_2_1_0; + A[221] = A[191] - 0.27089947089947*G0_0_0_0 + 0.270899470899471*G0_1_0_0; + A[196] = A[181] + 0.203174603174603*G0_0_0_0 - 0.338624338624338*G0_1_0_0 + 0.135449735449735*G0_2_0_0; + A[209] = A[223] + 0.270899470899471*G0_0_0_1 - 0.270899470899471*G0_0_1_0 - 0.135449735449736*G0_1_0_1 + 0.135449735449736*G0_1_1_0 - 0.135449735449734*G0_2_0_1 + 0.135449735449735*G0_2_1_0; + A[13] = A[195] - 0.00705467372134065*G0_1_0_1 + 0.00705467372134067*G0_1_1_0 + 0.0070546737213404*G0_2_0_1 - 0.00705467372134041*G0_2_1_0; + A[53] = -A[173] - 0.0564373897707229*G0_0_0_0 + 0.0564373897707233*G0_0_0_1 + 0.0112874779541446*G0_1_0_0 - 0.293474426807759*G0_2_0_0 - 0.0564373897707233*G0_2_0_1; + A[30] = -A[31] + 0.0206349206349206*G0_0_1_0 + 0.0257495590828924*G0_0_1_1 - 0.0206349206349208*G0_1_1_0 + 0.00511463844797179*G0_1_1_1 + 0.0257495590828927*G0_2_1_1; + A[23] = A[21] - 0.0366843033509698*G0_0_0_0 + 0.0366843033509701*G0_2_0_0; + A[20] = -A[23] + 0.00987654320987649*G0_0_0_1 + 0.153791887125221*G0_1_0_1 + 0.0395061728395061*G0_2_0_1; + A[24] = -A[20] - 0.0917107583774251*G0_0_0_0 - 0.0141093474426808*G0_0_0_1 - 0.118518518518519*G0_1_0_0 - 0.0776014109347442*G0_2_0_0 + 0.0141093474426807*G0_2_0_1; + A[128] = -A[125] - 0.0790123456790123*G0_0_0_1 + 0.575661375661376*G0_0_1_1 - 0.0790123456790121*G0_1_0_1 + 0.248324514991182*G0_1_1_1 + 0.158024691358025*G0_2_0_1 + 0.869135802469137*G0_2_1_1; + A[126] = A[128] - 0.158024691358025*G0_0_0_0 - 0.0451499118165785*G0_0_0_1 + 0.203174603174603*G0_0_1_0 - 0.112874779541446*G0_1_0_0 - 0.0451499118165785*G0_1_0_1 - 0.0902998236331569*G0_1_1_1 - 1.48994708994709*G0_2_0_0 - 0.722398589065255*G0_2_0_1 - 0.474074074074074*G0_2_1_0 - 0.722398589065256*G0_2_1_1; + A[98] = A[126] + 0.248324514991182*G0_0_0_1 - 0.248324514991182*G0_0_1_0 + 0.0451499118165786*G0_1_0_1 - 0.0451499118165786*G0_1_1_0 + 0.248324514991181*G0_2_0_1 - 0.248324514991181*G0_2_1_0; + A[95] = -A[98] + 0.237037037037037*G0_0_0_1 + 0.530511463844797*G0_0_1_1 + 0.0112874779541451*G0_1_0_1 + 0.0677248677248681*G0_1_1_1 + 0.29347442680776*G0_2_0_1 + 0.282186948853616*G0_2_1_1; + A[81] = -A[126] + 0.237037037037037*G0_0_1_0 + 0.530511463844797*G0_0_1_1 + 0.0112874779541451*G0_1_1_0 + 0.0677248677248681*G0_1_1_1 + 0.29347442680776*G0_2_1_0 + 0.282186948853616*G0_2_1_1; + A[63] = -A[71] - 0.172134038800705*G0_0_0_0 + 0.0141093474426808*G0_0_1_0 - 0.0310405643738983*G0_1_0_0 + 0.795767195767196*G0_1_1_0 - 0.524867724867724*G0_2_0_0 + 0.307583774250441*G0_2_1_0; + A[140] = -A[143] + 0.0564373897707232*G0_0_0_1 - 0.237037037037037*G0_0_1_1 - 0.0564373897707231*G0_1_0_1 - 0.112874779541446*G0_1_1_1 + 0.0112874779541447*G0_2_1_1; + A[77] = -A[122] - 0.119929453262786*G0_0_1_1 - 0.119929453262787*G0_1_1_1 - 0.285008818342152*G0_2_1_1; + A[171] = -A[51] - 0.237037037037036*G0_0_0_0 + 0.0564373897707241*G0_0_0_1 + 0.0112874779541446*G0_1_0_0 - 0.112874779541446*G0_2_0_0 - 0.0564373897707229*G0_2_0_1; + A[101] = A[171] - 0.0451499118165792*G0_0_0_1 + 0.0451499118165792*G0_0_1_0 + 0.0112874779541446*G0_1_0_1 - 0.0112874779541446*G0_1_1_0 + 0.0338624338624338*G0_2_0_1 - 0.0338624338624338*G0_2_1_0; + A[93] = -A[101] - 0.237037037037036*G0_0_0_0 + 0.0564373897707241*G0_0_1_0 + 0.0112874779541446*G0_1_0_0 - 0.112874779541446*G0_2_0_0 - 0.0564373897707229*G0_2_1_0; + A[152] = A[40] - 0.00511463844797179*G0_0_0_1 + 0.00511463844797178*G0_0_1_0 + 0.00511463844797168*G0_1_0_1 - 0.00511463844797167*G0_1_1_0; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p1_q4_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p1_q4_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p1_q4_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q4_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q4_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q4_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q4_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p1_q4_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p1_q4_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p1_q4_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p2_q1_quadrature.h b/laplacian_2d/laplacian_f1_p2_q1_quadrature.h new file mode 100644 index 0000000..2b21363 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p2_q1_quadrature.h @@ -0,0 +1,3378 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P2_Q1_QUADRATURE_H +#define __LAPLACIAN_F1_P2_Q1_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q1_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q1_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q1_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q1_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q1_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q1_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q1_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q1_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q1_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q1_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q1_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q1_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p2_q1_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p2_q1_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W3[3] = {0.166666666666667, 0.166666666666667, 0.166666666666667}; + // Quadrature points on the UFC reference element: (0.166666666666667, 0.166666666666667), (0.166666666666667, 0.666666666666667), (0.666666666666667, 0.166666666666667) + + // Value of basis functions at quadrature points. + static const double FE0_D01[3][2] = \ + {{-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}}; + + // Array of non-zero columns + static const unsigned int nzc1[2] = {0, 1}; + + // Array of non-zero columns + static const unsigned int nzc0[2] = {0, 2}; + + static const double FE1[3][6] = \ + {{0.222222222222222, -0.111111111111111, -0.111111111111111, 0.111111111111111, 0.444444444444444, 0.444444444444444}, + {-0.111111111111111, -0.111111111111111, 0.222222222222222, 0.444444444444444, 0.444444444444444, 0.111111111111111}, + {-0.111111111111111, 0.222222222222222, -0.111111111111111, 0.444444444444444, 0.111111111111111, 0.444444444444444}}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 9; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 198 + for (unsigned int ip = 0; ip < 3; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 12 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE1[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W3[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W3[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W3[ip]; + + + // Number of operations for primary indices: 48 + for (unsigned int j = 0; j < 2; j++) + { + for (unsigned int k = 0; k < 2; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p2_q1_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p2_q1_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q1_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q1_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q1_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q1_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q1_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q1_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q1_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p2_q1_tensor.h b/laplacian_2d/laplacian_f1_p2_q1_tensor.h new file mode 100644 index 0000000..d97269d --- /dev/null +++ b/laplacian_2d/laplacian_f1_p2_q1_tensor.h @@ -0,0 +1,3323 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P2_Q1_TENSOR_H +#define __LAPLACIAN_F1_P2_Q1_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q1_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q1_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q1_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q1_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q1_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q1_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q1_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q1_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q1_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q1_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q1_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q1_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p2_q1_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p2_q1_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 30 + // Number of operations (multiply-add pairs) for tensor contraction: 30 + // Total number of operations (multiply-add pairs): 71 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_3_0_0 = det*(w[0][3]*((K_00*K_00 + K_01*K_01))); + const double G0_3_0_1 = det*(w[0][3]*((K_00*K_10 + K_01*K_11))); + const double G0_3_1_0 = det*(w[0][3]*((K_10*K_00 + K_11*K_01))); + const double G0_3_1_1 = det*(w[0][3]*((K_10*K_10 + K_11*K_11))); + const double G0_4_0_0 = det*(w[0][4]*((K_00*K_00 + K_01*K_01))); + const double G0_4_0_1 = det*(w[0][4]*((K_00*K_10 + K_01*K_11))); + const double G0_4_1_0 = det*(w[0][4]*((K_10*K_00 + K_11*K_01))); + const double G0_4_1_1 = det*(w[0][4]*((K_10*K_10 + K_11*K_11))); + const double G0_5_0_0 = det*(w[0][5]*((K_00*K_00 + K_01*K_01))); + const double G0_5_0_1 = det*(w[0][5]*((K_00*K_10 + K_01*K_11))); + const double G0_5_1_0 = det*(w[0][5]*((K_10*K_00 + K_11*K_01))); + const double G0_5_1_1 = det*(w[0][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[1] = -0.166666666666667*G0_3_0_0 - 0.166666666666667*G0_3_1_0 - 0.166666666666667*G0_4_0_0 - 0.166666666666667*G0_4_1_0 - 0.166666666666667*G0_5_0_0 - 0.166666666666667*G0_5_1_0; + A[5] = 0.166666666666667*G0_3_0_1 + 0.166666666666667*G0_4_0_1 + 0.166666666666667*G0_5_0_1; + A[0] = -A[1] + 0.166666666666666*G0_3_0_1 + 0.166666666666666*G0_3_1_1 + 0.166666666666667*G0_4_0_1 + 0.166666666666667*G0_4_1_1 + 0.166666666666667*G0_5_0_1 + 0.166666666666667*G0_5_1_1; + A[7] = 0.166666666666667*G0_3_1_0 + 0.166666666666667*G0_4_1_0 + 0.166666666666667*G0_5_1_0; + A[6] = -A[7] - 0.166666666666666*G0_3_1_1 - 0.166666666666667*G0_4_1_1 - 0.166666666666667*G0_5_1_1; + A[8] = 0.166666666666666*G0_3_1_1 + 0.166666666666667*G0_4_1_1 + 0.166666666666667*G0_5_1_1; + A[2] = -A[8] - 0.166666666666667*G0_3_0_1 - 0.166666666666667*G0_4_0_1 - 0.166666666666667*G0_5_0_1; + A[4] = 0.166666666666667*G0_3_0_0 + 0.166666666666667*G0_4_0_0 + 0.166666666666667*G0_5_0_0; + A[3] = -A[4] - 0.166666666666666*G0_3_0_1 - 0.166666666666667*G0_4_0_1 - 0.166666666666667*G0_5_0_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p2_q1_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p2_q1_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q1_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q1_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q1_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q1_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q1_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q1_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q1_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q1_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p2_q2_quadrature.h b/laplacian_2d/laplacian_f1_p2_q2_quadrature.h new file mode 100644 index 0000000..a81f203 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p2_q2_quadrature.h @@ -0,0 +1,2248 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P2_Q2_QUADRATURE_H +#define __LAPLACIAN_F1_P2_Q2_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q2_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q2_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q2_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q2_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q2_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q2_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q2_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q2_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p2_q2_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p2_q2_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q2_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W6[6] = {0.054975871827661, 0.054975871827661, 0.054975871827661, 0.111690794839005, 0.111690794839005, 0.111690794839005}; + // Quadrature points on the UFC reference element: (0.816847572980459, 0.091576213509771), (0.091576213509771, 0.816847572980459), (0.091576213509771, 0.091576213509771), (0.10810301816807, 0.445948490915965), (0.445948490915965, 0.10810301816807), (0.445948490915965, 0.445948490915965) + + // Value of basis functions at quadrature points. + static const double FE0[6][6] = \ + {{-0.0748038077481959, 0.517632341987674, -0.0748038077481967, 0.299215230992787, 0.0335448115231483, 0.299215230992784}, + {-0.0748038077481959, -0.0748038077481966, 0.517632341987674, 0.299215230992787, 0.299215230992784, 0.0335448115231484}, + {0.517632341987671, -0.0748038077481966, -0.0748038077481967, 0.0335448115231487, 0.299215230992787, 0.299215230992787}, + {-0.0482083778155119, -0.0847304930939778, -0.0482083778155119, 0.192833511262048, 0.795480226200906, 0.192833511262048}, + {-0.0482083778155119, -0.0482083778155119, -0.0847304930939778, 0.192833511262048, 0.192833511262048, 0.795480226200906}, + {-0.0847304930939777, -0.0482083778155119, -0.0482083778155119, 0.795480226200906, 0.192833511262048, 0.192833511262048}}; + + static const double FE0_D01[6][5] = \ + {{0.63369514596092, -0.633695145960916, 3.26739029192183, 0.0, -3.26739029192184}, + {0.63369514596092, 2.26739029192184, 0.366304854039083, -2.90108543788276, -0.366304854039083}, + {-2.26739029192183, -0.633695145960916, 0.366304854039083, 2.90108543788275, -0.366304854039084}, + {-0.78379396366386, 0.78379396366386, 0.43241207267228, 0.0, -0.43241207267228}, + {-0.78379396366386, -0.567587927327719, 1.78379396366386, 1.35138189099158, -1.78379396366386}, + {0.56758792732772, 0.78379396366386, 1.78379396366386, -1.35138189099158, -1.78379396366386}}; + + // Array of non-zero columns + static const unsigned int nzc0[5] = {0, 2, 3, 4, 5}; + + static const double FE0_D10[6][5] = \ + {{0.633695145960919, 2.26739029192183, 0.366304854039083, -0.366304854039083, -2.90108543788275}, + {0.633695145960921, -0.633695145960916, 3.26739029192183, -3.26739029192183, 0.0}, + {-2.26739029192183, -0.633695145960916, 0.366304854039083, -0.366304854039083, 2.90108543788275}, + {-0.78379396366386, -0.56758792732772, 1.78379396366386, -1.78379396366386, 1.35138189099158}, + {-0.78379396366386, 0.78379396366386, 0.432412072672279, -0.432412072672279, 0.0}, + {0.56758792732772, 0.78379396366386, 1.78379396366386, -1.78379396366386, -1.35138189099158}}; + + // Array of non-zero columns + static const unsigned int nzc1[5] = {0, 1, 3, 4, 5}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 36; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 1908 + for (unsigned int ip = 0; ip < 6; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 12 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE0[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W6[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W6[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W6[ip]; + + + // Number of operations for primary indices: 300 + for (unsigned int j = 0; j < 5; j++) + { + for (unsigned int k = 0; k < 5; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc1[k]] += FE0_D01[ip][j]*FE0_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc0[k]] += FE0_D01[ip][k]*FE0_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc1[k]] += FE0_D10[ip][j]*FE0_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p2_q2_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p2_q2_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q2_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q2_quadrature_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f1_p2_q2_quadrature_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f1_p2_q2_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q2_quadrature_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f1_p2_q2_quadrature_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f1_p2_q2_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q2_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p2_q2_tensor.h b/laplacian_2d/laplacian_f1_p2_q2_tensor.h new file mode 100644 index 0000000..d6ad484 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p2_q2_tensor.h @@ -0,0 +1,2218 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P2_Q2_TENSOR_H +#define __LAPLACIAN_F1_P2_Q2_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q2_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q2_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q2_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q2_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q2_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q2_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q2_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q2_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p2_q2_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p2_q2_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q2_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 60 + // Number of operations (multiply-add pairs) for tensor contraction: 327 + // Total number of operations (multiply-add pairs): 398 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + const double G0_3_0_0 = det*(w[0][3]*((K_00*K_00 + K_01*K_01))); + const double G0_3_0_1 = det*(w[0][3]*((K_00*K_10 + K_01*K_11))); + const double G0_3_1_0 = det*(w[0][3]*((K_10*K_00 + K_11*K_01))); + const double G0_3_1_1 = det*(w[0][3]*((K_10*K_10 + K_11*K_11))); + const double G0_4_0_0 = det*(w[0][4]*((K_00*K_00 + K_01*K_01))); + const double G0_4_0_1 = det*(w[0][4]*((K_00*K_10 + K_01*K_11))); + const double G0_4_1_0 = det*(w[0][4]*((K_10*K_00 + K_11*K_01))); + const double G0_4_1_1 = det*(w[0][4]*((K_10*K_10 + K_11*K_11))); + const double G0_5_0_0 = det*(w[0][5]*((K_00*K_00 + K_01*K_01))); + const double G0_5_0_1 = det*(w[0][5]*((K_00*K_10 + K_01*K_11))); + const double G0_5_1_0 = det*(w[0][5]*((K_10*K_00 + K_11*K_01))); + const double G0_5_1_1 = det*(w[0][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[9] = -0.0111111111111111*G0_0_0_0 - 0.0555555555555553*G0_0_0_1 + 0.0333333333333334*G0_1_0_0 + 0.2*G0_1_0_1 - 0.0666666666666668*G0_2_0_0 - 0.0555555555555556*G0_2_0_1 + 0.0888888888888887*G0_3_0_0 + 0.266666666666667*G0_3_0_1 - 0.0888888888888888*G0_4_0_0 + 0.0444444444444442*G0_4_0_1 + 0.0444444444444441*G0_5_0_0 + 0.266666666666666*G0_5_0_1; + A[13] = 0.0222222222222221*G0_0_1_0 - 0.0333333333333334*G0_1_1_0 - 0.0333333333333335*G0_2_1_0 - 0.0111111111111112*G0_3_1_0 - 0.0555555555555554*G0_4_1_0 - 0.0555555555555554*G0_5_1_0; + A[17] = -0.0555555555555553*G0_0_1_0 + 0.0111111111111111*G0_0_1_1 + 0.0555555555555557*G0_1_1_0 + 0.0666666666666667*G0_1_1_1 - 0.0333333333333335*G0_2_1_1 - 0.0444444444444445*G0_3_1_0 - 0.0888888888888888*G0_3_1_1 + 0.0444444444444443*G0_4_1_0 - 0.0444444444444442*G0_4_1_1 + 0.0888888888888887*G0_5_1_1; + A[8] = 0.0222222222222221*G0_0_0_1 - 0.0333333333333334*G0_1_0_1 - 0.0333333333333335*G0_2_0_1 - 0.0111111111111112*G0_3_0_1 - 0.0555555555555554*G0_4_0_1 - 0.0555555555555554*G0_5_0_1; + A[11] = -A[9] - 0.0222222222222222*G0_0_0_0 - 0.133333333333334*G0_1_0_0 - 0.0222222222222222*G0_2_0_0 - 0.133333333333334*G0_3_0_0 - 0.222222222222222*G0_4_0_0 - 0.133333333333333*G0_5_0_0; + A[7] = -0.0222222222222221*G0_0_0_0 + 0.133333333333334*G0_1_0_0 - 0.0222222222222223*G0_2_0_0 + 0.166666666666667*G0_3_0_0 + 0.0777777777777777*G0_4_0_0 + 0.166666666666666*G0_5_0_0; + A[34] = -0.0444444444444444*G0_0_0_0 + 0.222222222222222*G0_0_0_1 - 0.0444444444444441*G0_0_1_0 - 0.0444444444444445*G0_0_1_1 + 0.0444444444444445*G0_1_0_0 - 0.0444444444444443*G0_1_0_1 - 0.0444444444444442*G0_2_0_1 + 0.0444444444444446*G0_2_1_1 + 0.177777777777778*G0_3_0_0 + 0.177777777777778*G0_3_0_1 + 0.355555555555555*G0_3_1_0 + 0.177777777777778*G0_3_1_1 - 0.177777777777778*G0_4_0_0 + 0.177777777777778*G0_4_0_1 + 0.177777777777777*G0_4_1_0 + 0.177777777777778*G0_5_0_1 + 0.177777777777777*G0_5_1_0 - 0.177777777777778*G0_5_1_1; + A[0] = A[7] + 0.155555555555555*G0_0_0_0 + 0.133333333333333*G0_0_0_1 + 0.133333333333333*G0_0_1_0 + 0.133333333333333*G0_0_1_1 - 0.155555555555556*G0_1_0_0 - 0.0222222222222221*G0_1_0_1 - 0.0222222222222221*G0_1_1_0 - 0.0222222222222221*G0_1_1_1 - 0.0222222222222221*G0_2_0_1 - 0.0222222222222221*G0_2_1_0 - 0.0222222222222221*G0_2_1_1 - 0.0888888888888891*G0_3_0_0 + 0.077777777777778*G0_3_0_1 + 0.077777777777778*G0_3_1_0 + 0.077777777777778*G0_3_1_1 + 0.0888888888888891*G0_4_0_0 + 0.166666666666667*G0_4_0_1 + 0.166666666666667*G0_4_1_0 + 0.166666666666667*G0_4_1_1 + 0.166666666666667*G0_5_0_1 + 0.166666666666667*G0_5_1_0 + 0.166666666666667*G0_5_1_1; + A[29] = A[34] - 0.266666666666666*G0_0_0_1 + 0.266666666666666*G0_0_1_0 + 0.0444444444444445*G0_1_0_1 - 0.0444444444444445*G0_1_1_0 + 0.0444444444444445*G0_2_0_1 - 0.0444444444444445*G0_2_1_0 + 0.177777777777777*G0_3_0_1 - 0.177777777777777*G0_3_1_0; + A[14] = -0.0222222222222221*G0_0_1_1 - 0.0222222222222223*G0_1_1_1 + 0.133333333333334*G0_2_1_1 + 0.166666666666667*G0_3_1_1 + 0.166666666666666*G0_4_1_1 + 0.0777777777777777*G0_5_1_1; + A[10] = -A[9] - 0.111111111111111*G0_0_0_1 + 0.2*G0_1_0_1 + 0.222222222222222*G0_3_0_1 + 0.044444444444444*G0_4_0_1 + 0.31111111111111*G0_5_0_1; + A[18] = -A[10] - 0.0222222222222222*G0_0_0_0 - 0.0888888888888886*G0_0_0_1 - 0.0333333333333333*G0_0_1_0 - 0.0333333333333333*G0_0_1_1 - 0.0222222222222224*G0_1_0_0 + 0.0111111111111109*G0_1_0_1 + 0.066666666666667*G0_1_1_0 + 0.0666666666666671*G0_1_1_1 + 0.133333333333334*G0_2_0_0 + 0.122222222222223*G0_2_0_1 + 0.0111111111111111*G0_2_1_0 + 0.0111111111111111*G0_2_1_1 + 0.044444444444445*G0_3_0_1 + 0.0888888888888893*G0_3_1_0 + 0.0888888888888894*G0_3_1_1 - 0.0888888888888891*G0_4_0_1 - 0.0444444444444443*G0_4_1_0 - 0.0444444444444443*G0_4_1_1 - 0.0888888888888884*G0_5_0_0 - 0.0888888888888889*G0_5_1_0 - 0.0888888888888888*G0_5_1_1; + A[3] = A[18] + 0.055555555555556*G0_1_0_1 - 0.055555555555556*G0_1_1_0 - 0.0555555555555561*G0_2_0_1 + 0.0555555555555561*G0_2_1_0 + 0.0444444444444445*G0_4_0_1 - 0.0444444444444445*G0_4_1_0 - 0.0444444444444446*G0_5_0_1 + 0.0444444444444446*G0_5_1_0; + A[24] = -A[18] - 0.2*G0_0_1_0 - 0.2*G0_0_1_1 + 0.111111111111112*G0_1_1_0 + 0.111111111111112*G0_1_1_1 - 0.0444444444444444*G0_3_1_0 - 0.0444444444444443*G0_3_1_1 - 0.222222222222222*G0_4_1_0 - 0.222222222222222*G0_4_1_1 - 0.311111111111111*G0_5_1_0 - 0.311111111111111*G0_5_1_1; + A[30] = -A[18] - 0.2*G0_0_0_0 - 0.2*G0_0_0_1 + 0.111111111111112*G0_2_0_0 + 0.111111111111112*G0_2_0_1 - 0.0444444444444443*G0_3_0_0 - 0.0444444444444443*G0_3_0_1 - 0.311111111111111*G0_4_0_0 - 0.311111111111111*G0_4_0_1 - 0.222222222222222*G0_5_0_0 - 0.222222222222222*G0_5_0_1; + A[4] = -A[3] - 0.2*G0_0_0_1 - 0.2*G0_0_1_1 + 0.111111111111112*G0_1_0_1 + 0.111111111111112*G0_1_1_1 - 0.0444444444444444*G0_3_0_1 - 0.0444444444444443*G0_3_1_1 - 0.222222222222222*G0_4_0_1 - 0.222222222222222*G0_4_1_1 - 0.311111111111111*G0_5_0_1 - 0.311111111111111*G0_5_1_1; + A[25] = A[10] + 0.0555555555555553*G0_0_0_1 - 0.0555555555555553*G0_0_1_0 - 0.0555555555555558*G0_2_0_1 + 0.0555555555555558*G0_2_1_0 + 0.0444444444444444*G0_3_0_1 - 0.0444444444444444*G0_3_1_0 - 0.0444444444444444*G0_5_0_1 + 0.0444444444444444*G0_5_1_0; + A[1] = -A[25] + 0.0444444444444443*G0_0_0_0 - 0.0222222222222221*G0_0_1_0 + 0.0333333333333335*G0_1_1_0 + 0.0444444444444444*G0_2_0_0 + 0.0333333333333334*G0_2_1_0 - 0.033333333333333*G0_3_0_0 + 0.0111111111111113*G0_3_1_0 + 0.144444444444444*G0_4_0_0 + 0.0555555555555554*G0_4_1_0 - 0.0333333333333331*G0_5_0_0 + 0.0555555555555555*G0_5_1_0; + A[5] = -A[3] - 0.2*G0_0_0_0 - 0.2*G0_0_1_0 + 0.111111111111112*G0_2_0_0 + 0.111111111111112*G0_2_1_0 - 0.0444444444444443*G0_3_0_0 - 0.0444444444444443*G0_3_1_0 - 0.311111111111111*G0_4_0_0 - 0.311111111111111*G0_4_1_0 - 0.222222222222222*G0_5_0_0 - 0.222222222222222*G0_5_1_0; + A[6] = A[9] + 0.0444444444444443*G0_0_0_0 + 0.0888888888888885*G0_0_0_1 - 0.166666666666667*G0_1_0_1 + 0.0444444444444444*G0_2_0_0 + 0.0333333333333332*G0_2_0_1 - 0.033333333333333*G0_3_0_0 - 0.211111111111111*G0_3_0_1 + 0.144444444444444*G0_4_0_0 + 0.0111111111111114*G0_4_0_1 - 0.0333333333333331*G0_5_0_0 - 0.255555555555555*G0_5_0_1; + A[23] = -A[29] + 0.31111111111111*G0_0_1_0 + 0.0444444444444438*G0_0_1_1 - 0.311111111111112*G0_1_1_0 - 0.266666666666668*G0_1_1_1 + 0.133333333333333*G0_2_1_1 - 0.177777777777778*G0_3_1_0 - 0.355555555555555*G0_3_1_1 + 0.177777777777778*G0_4_1_0 - 0.177777777777777*G0_4_1_1 - 0.711111111111109*G0_5_1_1; + A[21] = -A[23] - 0.044444444444444*G0_0_0_0 + 0.0444444444444444*G0_0_1_0 - 0.133333333333333*G0_1_0_0 - 0.266666666666668*G0_1_1_0 + 0.266666666666667*G0_2_0_0 + 0.0444444444444448*G0_2_1_0 + 0.355555555555555*G0_3_0_0 + 0.711111111111109*G0_4_0_0 + 0.177777777777777*G0_4_1_0 + 0.177777777777777*G0_5_0_0; + A[33] = A[23] + 0.0444444444444444*G0_0_0_1 - 0.0444444444444444*G0_0_1_0 - 0.266666666666668*G0_1_0_1 + 0.266666666666668*G0_1_1_0 + 0.0444444444444448*G0_2_0_1 - 0.0444444444444448*G0_2_1_0 + 0.177777777777777*G0_4_0_1 - 0.177777777777777*G0_4_1_0; + A[35] = -A[23] + 0.222222222222222*G0_0_0_0 - 0.0444444444444445*G0_0_0_1 + 0.133333333333335*G0_1_0_0 + 0.266666666666668*G0_1_0_1 - 0.0888888888888894*G0_2_0_0 - 0.0444444444444448*G0_2_0_1 + 0.177777777777778*G0_3_0_0 + 0.533333333333333*G0_4_0_0 - 0.177777777777777*G0_4_0_1 + 0.355555555555555*G0_5_0_0; + A[19] = -A[25] - 0.111111111111111*G0_0_1_0 + 0.2*G0_1_1_0 + 0.222222222222223*G0_3_1_0 + 0.044444444444444*G0_4_1_0 + 0.31111111111111*G0_5_1_0; + A[31] = -A[19] - 0.0222222222222222*G0_0_0_0 - 0.133333333333334*G0_1_0_0 - 0.0222222222222222*G0_2_0_0 - 0.133333333333334*G0_3_0_0 - 0.222222222222222*G0_4_0_0 - 0.133333333333333*G0_5_0_0; + A[12] = -A[13] + 0.0555555555555553*G0_0_1_0 + 0.0333333333333332*G0_0_1_1 - 0.0555555555555557*G0_1_1_0 - 0.0222222222222223*G0_1_1_1 + 0.0333333333333337*G0_2_1_1 + 0.0444444444444446*G0_3_1_0 + 0.0555555555555558*G0_3_1_1 - 0.0444444444444443*G0_4_1_0 + 0.0111111111111111*G0_4_1_1 + 0.0555555555555556*G0_5_1_1; + A[27] = -A[29] + 0.044444444444444*G0_0_0_0 + 0.31111111111111*G0_0_1_0 + 0.133333333333333*G0_1_0_0 - 0.266666666666667*G0_2_0_0 - 0.311111111111112*G0_2_1_0 - 0.355555555555555*G0_3_0_0 - 0.177777777777778*G0_3_1_0 - 0.711111111111109*G0_4_0_0 - 0.177777777777777*G0_5_0_0 + 0.177777777777778*G0_5_1_0; + A[28] = -A[27] - 0.0444444444444444*G0_0_0_1 + 0.222222222222222*G0_0_1_1 - 0.0444444444444447*G0_1_0_1 - 0.0888888888888893*G0_1_1_1 + 0.266666666666668*G0_2_0_1 + 0.133333333333335*G0_2_1_1 + 0.177777777777779*G0_3_1_1 + 0.355555555555555*G0_4_1_1 - 0.177777777777777*G0_5_0_1 + 0.533333333333334*G0_5_1_1; + A[22] = A[27] + 0.0444444444444444*G0_0_0_1 - 0.0444444444444444*G0_0_1_0 + 0.0444444444444447*G0_1_0_1 - 0.0444444444444448*G0_1_1_0 - 0.266666666666668*G0_2_0_1 + 0.266666666666668*G0_2_1_0 + 0.177777777777777*G0_5_0_1 - 0.177777777777777*G0_5_1_0; + A[15] = -A[17] - 0.111111111111111*G0_0_1_0 + 0.2*G0_2_1_0 + 0.222222222222223*G0_3_1_0 + 0.31111111111111*G0_4_1_0 + 0.0444444444444442*G0_5_1_0; + A[16] = -A[15] - 0.0222222222222222*G0_0_1_1 - 0.0222222222222221*G0_1_1_1 - 0.133333333333334*G0_2_1_1 - 0.133333333333334*G0_3_1_1 - 0.133333333333333*G0_4_1_1 - 0.222222222222222*G0_5_1_1; + A[32] = A[17] - 0.0555555555555553*G0_0_0_1 + 0.0555555555555553*G0_0_1_0 + 0.0555555555555557*G0_1_0_1 - 0.0555555555555557*G0_1_1_0 - 0.0444444444444445*G0_3_0_1 + 0.0444444444444445*G0_3_1_0 + 0.0444444444444443*G0_4_0_1 - 0.0444444444444443*G0_4_1_0; + A[20] = -A[32] - 0.111111111111111*G0_0_0_1 + 0.2*G0_2_0_1 + 0.222222222222223*G0_3_0_1 + 0.31111111111111*G0_4_0_1 + 0.0444444444444441*G0_5_0_1; + A[26] = -A[20] - 0.0222222222222223*G0_0_1_1 - 0.0222222222222221*G0_1_1_1 - 0.133333333333334*G0_2_1_1 - 0.133333333333334*G0_3_1_1 - 0.133333333333333*G0_4_1_1 - 0.222222222222222*G0_5_1_1; + A[2] = -A[8] + 0.0555555555555553*G0_0_0_1 + 0.0333333333333332*G0_0_1_1 - 0.0555555555555557*G0_1_0_1 - 0.0222222222222223*G0_1_1_1 + 0.0333333333333337*G0_2_1_1 + 0.0444444444444446*G0_3_0_1 + 0.0555555555555558*G0_3_1_1 - 0.0444444444444443*G0_4_0_1 + 0.0111111111111111*G0_4_1_1 + 0.0555555555555556*G0_5_1_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p2_q2_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p2_q2_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q2_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q2_tensor_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f1_p2_q2_tensor_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f1_p2_q2_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q2_tensor_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f1_p2_q2_tensor_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f1_p2_q2_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q2_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p2_q3_quadrature.h b/laplacian_2d/laplacian_f1_p2_q3_quadrature.h new file mode 100644 index 0000000..9cfe8c1 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p2_q3_quadrature.h @@ -0,0 +1,5374 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P2_Q3_QUADRATURE_H +#define __LAPLACIAN_F1_P2_Q3_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q3_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q3_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q3_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q3_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q3_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q3_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q3_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q3_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q3_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q3_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q3_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q3_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p2_q3_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p2_q3_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W12[12] = {0.0254224531851035, 0.0254224531851035, 0.0254224531851035, 0.0583931378631895, 0.0583931378631895, 0.0583931378631895, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187}; + // Quadrature points on the UFC reference element: (0.873821971016996, 0.063089014491502), (0.063089014491502, 0.873821971016996), (0.063089014491502, 0.063089014491502), (0.501426509658179, 0.24928674517091), (0.24928674517091, 0.501426509658179), (0.24928674517091, 0.24928674517091), (0.636502499121399, 0.310352451033785), (0.636502499121399, 0.053145049844816), (0.310352451033785, 0.636502499121399), (0.310352451033785, 0.053145049844816), (0.053145049844816, 0.636502499121399), (0.053145049844816, 0.310352451033785) + + // Value of basis functions at quadrature points. + static const double FE0[12][6] = \ + {{-0.055128566992484, 0.65330770304706, -0.0551285669924841, 0.220514267969936, 0.0159208949980358, 0.220514267969936}, + {-0.055128566992484, -0.055128566992484, 0.65330770304706, 0.220514267969936, 0.220514267969936, 0.015920894998036}, + {0.65330770304706, -0.0551285669924841, -0.0551285669924841, 0.0159208949980358, 0.220514267969936, 0.220514267969936}, + {-0.124998982535097, 0.00143057951778883, -0.124998982535098, 0.499995930140389, 0.248575525271626, 0.499995930140391}, + {-0.124998982535097, -0.124998982535098, 0.00143057951778883, 0.499995930140389, 0.499995930140391, 0.248575525271626}, + {0.00143057951778989, -0.124998982535098, -0.124998982535098, 0.248575525271625, 0.49999593014039, 0.49999593014039}, + {-0.0474962571988, 0.173768363654174, -0.117715163308429, 0.790160442765823, 0.0659747859186053, 0.135307828168627}, + {-0.117715163308429, 0.173768363654174, -0.0474962571988, 0.135307828168627, 0.0659747859186052, 0.790160442765823}, + {-0.0474962571987999, -0.117715163308429, 0.173768363654174, 0.790160442765823, 0.135307828168627, 0.0659747859186054}, + {0.173768363654174, -0.117715163308429, -0.0474962571988, 0.0659747859186052, 0.135307828168627, 0.790160442765823}, + {-0.117715163308429, -0.0474962571988, 0.173768363654174, 0.135307828168627, 0.790160442765823, 0.0659747859186054}, + {0.173768363654174, -0.0474962571988001, -0.117715163308429, 0.0659747859186053, 0.790160442765823, 0.135307828168627}}; + + static const double FE1_D01[12][9] = \ + {{-0.485931890194853, 0.485931890194852, 6.37592643035589, -2.44372756077941, -0.0537330206183708, 0.0537330206183713, 2.44372756077941, -6.37592643035589, 0.0}, + {-0.485931890194854, 3.44372756077941, -0.230167544593386, 1.20457074358531, 2.21356001618603, -5.17135568677059, 0.176434523975019, 0.230167544593386, -1.38100526756033}, + {-3.44372756077941, 0.485931890194852, -0.230167544593387, -0.17643452397502, 5.17135568677058, -2.21356001618602, -1.20457074358531, 0.230167544593386, 1.38100526756034}, + {0.404638308746458, -0.404638308746456, 1.13786605847598, 1.11855323498582, -0.838942397791738, 0.838942397791737, -1.11855323498583, -1.13786605847598, 1.19348975147204e-14}, + {0.404638308746458, -0.118553234985829, -0.28284795547736, 2.25318217517853, -1.40140119046319, 1.11531611670256, -0.556094442314379, 0.282847955477361, -1.69708773286415}, + {0.118553234985824, -0.404638308746456, -0.28284795547736, 0.556094442314372, -1.11531611670255, 1.40140119046319, -2.25318217517854, 0.282847955477361, 1.69708773286417}, + {-0.559823901757263, -0.492870367157913, 2.60506707768882, 2.46932174262301, 0.750232850760382, 0.302461418154795, 1.95093340590806, -2.60506707768882, -4.42025514853108}, + {0.492870367157913, 0.559823901757263, 2.60506707768882, -1.95093340590806, -0.302461418154795, -0.750232850760382, -2.46932174262301, -2.60506707768882, 4.42025514853108}, + {-0.559823901757264, 0.740805831642528, -0.0962843375058819, 3.93699695901727, 1.749910031967, -1.93089196185226, 0.951256224701445, 0.096284337505882, -4.88825318371872}, + {-0.740805831642527, 0.559823901757263, -0.0962843375058788, -0.951256224701449, 1.93089196185226, -1.749910031967, -3.93699695901728, 0.09628433750588, 4.88825318371872}, + {0.492870367157913, 0.740805831642527, -0.201023373941063, 0.674175115836558, -2.56560608012889, 1.33192988132845, -0.206177080648912, 0.201023373941063, -0.467998035187647}, + {-0.740805831642527, -0.492870367157913, -0.201023373941065, 0.206177080648914, -1.33192988132845, 2.56560608012889, -0.674175115836559, 0.201023373941066, 0.467998035187645}}; + + // Array of non-zero columns + static const unsigned int nzc0[9] = {0, 2, 3, 4, 5, 6, 7, 8, 9}; + + static const double FE1_D10[12][9] = \ + {{-0.485931890194853, 3.44372756077941, 1.20457074358531, -0.230167544593389, 0.176434523975015, 0.230167544593389, 2.21356001618602, -5.17135568677058, -1.38100526756033}, + {-0.485931890194854, 0.485931890194854, -2.44372756077941, 6.3759264303559, 2.44372756077941, -6.3759264303559, -0.0537330206183701, 0.0537330206183679, 0.0}, + {-3.44372756077941, 0.485931890194852, -0.176434523975019, -0.23016754459339, -1.20457074358531, 0.230167544593389, 5.17135568677058, -2.21356001618602, 1.38100526756033}, + {0.404638308746458, -0.118553234985828, 2.25318217517853, -0.28284795547736, -0.556094442314379, 0.282847955477361, -1.40140119046319, 1.11531611670256, -1.69708773286415}, + {0.404638308746458, -0.404638308746456, 1.11855323498582, 1.13786605847598, -1.11855323498584, -1.13786605847598, -0.838942397791738, 0.838942397791735, 1.45710757386118e-14}, + {0.118553234985824, -0.404638308746456, 0.556094442314372, -0.282847955477361, -2.25318217517854, 0.282847955477361, -1.11531611670255, 1.40140119046318, 1.69708773286417}, + {-0.559823901757263, 0.740805831642528, 3.93699695901727, -0.0962843375058778, 0.951256224701447, 0.0962843375058791, 1.749910031967, -1.93089196185226, -4.88825318371872}, + {0.492870367157913, 0.740805831642527, 0.674175115836558, -0.201023373941065, -0.206177080648914, 0.201023373941066, -2.56560608012889, 1.33192988132845, -0.467998035187644}, + {-0.559823901757263, -0.492870367157914, 2.46932174262301, 2.60506707768883, 1.95093340590806, -2.60506707768882, 0.750232850760382, 0.302461418154794, -4.42025514853107}, + {-0.740805831642527, -0.492870367157913, 0.206177080648913, -0.201023373941065, -0.674175115836559, 0.201023373941066, -1.33192988132845, 2.56560608012889, 0.467998035187646}, + {0.492870367157913, 0.559823901757263, -1.95093340590806, 2.60506707768882, -2.46932174262301, -2.60506707768882, -0.302461418154794, -0.750232850760383, 4.42025514853107}, + {-0.740805831642527, 0.559823901757263, -0.951256224701447, -0.0962843375058804, -3.93699695901727, 0.0962843375058801, 1.93089196185226, -1.749910031967, 4.88825318371872}}; + + // Array of non-zero columns + static const unsigned int nzc1[9] = {0, 1, 3, 4, 5, 6, 7, 8, 9}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 100; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 11880 + for (unsigned int ip = 0; ip < 12; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 12 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE0[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W12[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W12[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W12[ip]; + + + // Number of operations for primary indices: 972 + for (unsigned int j = 0; j < 9; j++) + { + for (unsigned int k = 0; k < 9; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p2_q3_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p2_q3_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q3_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q3_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q3_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q3_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q3_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q3_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q3_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p2_q3_tensor.h b/laplacian_2d/laplacian_f1_p2_q3_tensor.h new file mode 100644 index 0000000..1448deb --- /dev/null +++ b/laplacian_2d/laplacian_f1_p2_q3_tensor.h @@ -0,0 +1,5390 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P2_Q3_TENSOR_H +#define __LAPLACIAN_F1_P2_Q3_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q3_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q3_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q3_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q3_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q3_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q3_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q3_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q3_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q3_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q3_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q3_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q3_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p2_q3_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p2_q3_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 60 + // Number of operations (multiply-add pairs) for tensor contraction: 1161 + // Total number of operations (multiply-add pairs): 1232 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + const double G0_3_0_0 = det*(w[0][3]*((K_00*K_00 + K_01*K_01))); + const double G0_3_0_1 = det*(w[0][3]*((K_00*K_10 + K_01*K_11))); + const double G0_3_1_0 = det*(w[0][3]*((K_10*K_00 + K_11*K_01))); + const double G0_3_1_1 = det*(w[0][3]*((K_10*K_10 + K_11*K_11))); + const double G0_4_0_0 = det*(w[0][4]*((K_00*K_00 + K_01*K_01))); + const double G0_4_0_1 = det*(w[0][4]*((K_00*K_10 + K_01*K_11))); + const double G0_4_1_0 = det*(w[0][4]*((K_10*K_00 + K_11*K_01))); + const double G0_4_1_1 = det*(w[0][4]*((K_10*K_10 + K_11*K_11))); + const double G0_5_0_0 = det*(w[0][5]*((K_00*K_00 + K_01*K_01))); + const double G0_5_0_1 = det*(w[0][5]*((K_00*K_10 + K_01*K_11))); + const double G0_5_1_0 = det*(w[0][5]*((K_10*K_00 + K_11*K_01))); + const double G0_5_1_1 = det*(w[0][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[73] = -0.0160714285714294*G0_0_0_0 - 0.00803571428571405*G0_0_0_1 + 0.0080357142857142*G0_0_1_0 + 0.0160714285714288*G0_0_1_1 + 0.0883928571428582*G0_1_0_0 + 0.216964285714288*G0_1_0_1 + 0.0964285714285725*G0_1_1_0 + 0.241071428571431*G0_1_1_1 + 0.0241071428571426*G0_2_0_0 - 0.0160714285714291*G0_2_0_1 - 0.0321428571428575*G0_2_1_1 + 0.160714285714293*G0_3_0_0 + 0.152678571428575*G0_3_0_1 + 0.225000000000007*G0_3_1_0 + 0.192857142857146*G0_3_1_1 - 0.112500000000001*G0_4_0_0 - 0.0241071428571429*G0_4_0_1 - 0.0321428571428565*G0_4_1_0 + 0.0160714285714283*G0_4_1_1 - 0.144642857142856*G0_5_0_0 - 0.152678571428574*G0_5_0_1 - 0.128571428571428*G0_5_1_0 - 0.0964285714285749*G0_5_1_1; + A[69] = 0.0482142857142865*G0_0_0_0 - 0.0482142857142853*G0_0_0_1 - 0.0964285714285732*G0_0_1_1 - 0.0482142857142862*G0_1_0_0 - 0.0964285714285718*G0_1_0_1 - 0.0964285714285721*G0_1_1_0 - 0.0482142857142863*G0_1_1_1 + 0.241071428571431*G0_2_0_1 + 0.048214285714287*G0_2_1_0 + 0.192857142857145*G0_2_1_1 + 0.28928571428572*G0_3_0_0 + 0.530357142857148*G0_3_0_1 + 0.289285714285721*G0_3_1_0 + 0.241071428571435*G0_3_1_1 - 0.289285714285721*G0_4_0_0 + 0.241071428571428*G0_4_0_1 + 0.67500000000001*G0_4_1_0 + 0.0482142857142853*G0_4_1_1 + 0.144642857142857*G0_5_0_1 + 0.0964285714285718*G0_5_1_0 - 0.33750000000001*G0_5_1_1; + A[37] = A[73] + 0.0160714285714282*G0_0_0_1 - 0.0160714285714282*G0_0_1_0 - 0.120535714285715*G0_1_0_1 + 0.120535714285715*G0_1_1_0 + 0.0160714285714285*G0_2_0_1 - 0.0160714285714285*G0_2_1_0 + 0.0723214285714321*G0_3_0_1 - 0.0723214285714322*G0_3_1_0 - 0.00803571428571356*G0_4_0_1 + 0.00803571428571356*G0_4_1_0 + 0.0241071428571465*G0_5_0_1 - 0.0241071428571465*G0_5_1_0; + A[11] = -0.0160714285714285*G0_0_0_0 + 0.198214285714287*G0_1_0_0 - 0.0160714285714285*G0_2_0_0 + 0.107738095238096*G0_3_0_0 + 0.0434523809523815*G0_4_0_0 + 0.107738095238096*G0_5_0_0; + A[82] = 0.00267857142857165*G0_0_0_1 + 0.00535714285714304*G0_0_1_1 - 0.0321428571428574*G0_1_0_1 - 0.0535714285714291*G0_1_1_1 + 0.0133928571428571*G0_2_1_1 + 0.0080357142857148*G0_3_0_1 + 0.0348214285714288*G0_3_1_1 - 0.00803571428571421*G0_4_0_1 + 0.0080357142857141*G0_4_1_1 + 0.0294642857142875*G0_5_0_1 - 0.0455357142857155*G0_5_1_1; + A[32] = -A[82] + 0.0294642857142861*G0_0_0_1 - 0.0267857142857147*G0_1_0_1 - 0.123214285714288*G0_2_0_1 - 0.0776785714285706*G0_3_0_1 - 0.104464285714286*G0_4_0_1 + 0.00267857142857354*G0_5_0_1; + A[99] = 1.73571428571431*G0_3_0_0 + 1.4464285714286*G0_3_0_1 + 1.4464285714286*G0_3_1_0 + 1.73571428571431*G0_3_1_1 + 1.73571428571431*G0_4_0_0 + 0.289285714285713*G0_4_0_1 + 0.289285714285713*G0_4_1_0 + 0.578571428571427*G0_4_1_1 + 0.578571428571427*G0_5_0_0 + 0.289285714285713*G0_5_0_1 + 0.289285714285713*G0_5_1_0 + 1.73571428571431*G0_5_1_1; + A[78] = -A[73] - 0.200892857142861*G0_0_0_0 + 0.0401785714285705*G0_0_1_0 - 0.096428571428573*G0_1_0_0 - 0.0964285714285728*G0_1_1_0 + 0.128571428571429*G0_2_0_0 + 0.0883928571428569*G0_2_1_0 - 0.136607142857138*G0_3_0_0 - 0.0964285714285672*G0_3_1_0 - 0.409821428571432*G0_4_0_0 - 0.176785714285713*G0_4_1_0 - 0.634821428571432*G0_5_0_0 - 0.771428571428578*G0_5_1_0; + A[21] = -0.00803571428571443*G0_0_1_0 + 0.0267857142857146*G0_1_1_0 + 0.0267857142857148*G0_2_1_0 + 0.0032738095238093*G0_3_1_0 + 0.0193452380952383*G0_4_1_0 + 0.0193452380952382*G0_5_1_0; + A[1] = -A[21] - 0.0267857142857146*G0_0_0_0 - 0.034821428571429*G0_0_1_0 - 0.0267857142857147*G0_1_0_0 + 0.00803571428571441*G0_2_0_0 + 0.0348214285714292*G0_2_1_0 - 0.0193452380952383*G0_3_0_0 - 0.0160714285714289*G0_3_1_0 - 0.0193452380952382*G0_4_0_0 - 0.00327380952380928*G0_5_0_0 + 0.016071428571429*G0_5_1_0; + A[72] = A[82] + 0.0294642857142857*G0_0_0_1 - 0.0267857142857148*G0_0_1_1 + 0.0294642857142857*G0_1_0_1 + 0.0562500000000005*G0_1_1_1 - 0.0187500000000004*G0_3_1_1 + 0.01875*G0_4_1_1 - 0.058928571428575*G0_5_0_1 - 0.0294642857142874*G0_5_1_1; + A[22] = -0.0160714285714285*G0_0_1_1 - 0.0160714285714286*G0_1_1_1 + 0.198214285714288*G0_2_1_1 + 0.107738095238096*G0_3_1_1 + 0.107738095238096*G0_4_1_1 + 0.0434523809523816*G0_5_1_1; + A[41] = -A[1] - 0.0321428571428577*G0_0_0_0 - 0.0401785714285719*G0_1_0_0 - 0.150000000000001*G0_1_1_0 + 0.0616071428571438*G0_2_0_0 + 0.0133928571428571*G0_2_1_0 - 0.054166666666667*G0_3_0_0 - 0.105059523809523*G0_3_1_0 + 0.0261904761904773*G0_4_0_0 - 0.0461309523809521*G0_4_1_0 - 0.0113095238095235*G0_5_0_0 - 0.0997023809523813*G0_5_1_0; + A[40] = -A[41] + 0.00803571428571421*G0_0_0_0 + 0.0133928571428573*G0_0_0_1 + 0.040178571428572*G0_0_1_0 + 0.0133928571428576*G0_0_1_1 - 0.00803571428571421*G0_1_0_0 + 0.00535714285714305*G0_1_0_1 - 0.120535714285715*G0_1_1_0 + 0.00267857142857143*G0_1_1_1 - 0.0535714285714295*G0_2_0_1 - 0.0160714285714291*G0_2_1_0 - 0.0214285714285718*G0_2_1_1 - 0.0803571428571443*G0_3_0_0 - 0.0455357142857157*G0_3_0_1 - 0.160714285714288*G0_3_1_0 - 0.075000000000003*G0_3_1_1 + 0.0803571428571444*G0_4_0_0 + 0.0348214285714289*G0_4_0_1 + 0.0267857142857141*G0_4_1_1 + 0.00803571428571427*G0_5_0_1 - 0.0803571428571436*G0_5_1_0 + 0.0160714285714285*G0_5_1_1; + A[4] = A[40] - 0.0026785714285716*G0_1_0_1 + 0.0026785714285716*G0_1_1_0 + 0.0321428571428576*G0_2_0_1 - 0.0321428571428576*G0_2_1_0 - 0.0294642857142874*G0_3_0_1 + 0.0294642857142873*G0_3_1_0 - 0.00803571428571483*G0_4_0_1 + 0.00803571428571484*G0_4_1_0 + 0.00803571428571414*G0_5_0_1 - 0.00803571428571416*G0_5_1_0; + A[60] = -A[40] + 0.123214285714287*G0_0_1_0 + 0.123214285714287*G0_0_1_1 - 0.0294642857142861*G0_1_1_0 - 0.0294642857142861*G0_1_1_1 + 0.0267857142857149*G0_2_1_0 + 0.0267857142857149*G0_2_1_1 - 0.00267857142857345*G0_3_1_0 - 0.00267857142857345*G0_3_1_1 + 0.0776785714285709*G0_4_1_0 + 0.0776785714285709*G0_4_1_1 + 0.104464285714286*G0_5_1_0 + 0.104464285714287*G0_5_1_1; + A[31] = A[41] - 0.0723214285714288*G0_0_1_0 + 0.123214285714286*G0_1_0_0 + 0.514285714285719*G0_1_1_0 - 0.104464285714287*G0_2_0_0 - 0.0508928571428571*G0_2_1_0 + 0.0776785714285726*G0_3_0_0 + 0.283928571428572*G0_3_1_0 - 0.12589285714286*G0_4_0_0 + 0.0428571428571423*G0_4_1_0 + 0.0294642857142856*G0_5_0_0 + 0.294642857142859*G0_5_1_0; + A[71] = -A[41] + 0.0428571428571434*G0_0_0_0 + 0.0214285714285718*G0_0_1_0 + 0.0964285714285725*G0_1_0_0 + 0.0214285714285719*G0_2_0_0 - 0.0214285714285717*G0_2_1_0 + 0.0535714285714292*G0_3_0_0 + 0.0107142857142869*G0_3_1_0 + 0.117857142857145*G0_4_0_0 + 0.0428571428571424*G0_5_0_0 - 0.0107142857142865*G0_5_1_0; + A[27] = A[72] - 0.0321428571428574*G0_0_0_1 + 0.0321428571428574*G0_0_1_0 + 0.00267857142857163*G0_1_0_1 - 0.00267857142857162*G0_1_1_0 - 0.00803571428571414*G0_3_0_1 + 0.00803571428571414*G0_3_1_0 + 0.00803571428571486*G0_4_0_1 - 0.00803571428571486*G0_4_1_0 + 0.0294642857142875*G0_5_0_1 - 0.0294642857142875*G0_5_1_0; + A[92] = -0.0214285714285718*G0_0_0_1 + 0.0267857142857146*G0_0_1_1 + 0.0214285714285718*G0_1_0_1 + 0.0482142857142864*G0_1_1_1 - 0.123214285714287*G0_2_1_1 - 0.0107142857142869*G0_3_0_1 - 0.0589285714285722*G0_3_1_1 + 0.0107142857142864*G0_4_0_1 - 0.0482142857142854*G0_4_1_1 + 0.155357142857147*G0_5_1_1; + A[61] = -A[41] + 0.029464285714286*G0_0_1_0 - 0.123214285714287*G0_1_1_0 - 0.026785714285715*G0_2_1_0 - 0.0776785714285704*G0_3_1_0 + 0.00267857142857343*G0_4_1_0 - 0.104464285714286*G0_5_1_0; + A[16] = A[61] + 0.00267857142857163*G0_0_0_1 - 0.00267857142857163*G0_0_1_0 - 0.0321428571428578*G0_2_0_1 + 0.0321428571428578*G0_2_1_0 + 0.00803571428571477*G0_3_0_1 - 0.00803571428571476*G0_3_1_0 + 0.0294642857142873*G0_4_0_1 - 0.0294642857142873*G0_4_1_0 - 0.0080357142857141*G0_5_0_1 + 0.00803571428571411*G0_5_1_0; + A[51] = A[61] - 0.0267857142857148*G0_0_0_0 + 0.0294642857142858*G0_0_1_0 + 0.056250000000001*G0_2_0_0 + 0.0294642857142862*G0_2_1_0 - 0.0187500000000004*G0_3_0_0 - 0.0294642857142872*G0_4_0_0 - 0.0589285714285746*G0_4_1_0 + 0.0187499999999998*G0_5_0_0; + A[15] = A[16] - 0.0267857142857148*G0_0_0_0 + 0.0294642857142858*G0_0_0_1 + 0.056250000000001*G0_2_0_0 + 0.0294642857142862*G0_2_0_1 - 0.0187500000000003*G0_3_0_0 - 0.0294642857142872*G0_4_0_0 - 0.0589285714285747*G0_4_0_1 + 0.0187499999999998*G0_5_0_0; + A[74] = A[73] - 0.0964285714285728*G0_1_0_0 - 0.24107142857143*G0_1_0_1 - 0.120535714285716*G0_1_1_0 - 0.289285714285716*G0_1_1_1 - 0.0241071428571421*G0_2_0_0 + 0.0241071428571435*G0_2_0_1 + 0.0241071428571441*G0_2_1_0 + 0.0482142857142861*G0_2_1_1 - 0.12053571428572*G0_3_0_0 - 0.0241071428571396*G0_3_0_1 - 0.144642857142862*G0_3_1_0 + 0.0723214285714296*G0_4_0_0 - 0.0241071428571418*G0_4_0_1 + 0.0482142857142851*G0_4_1_0 - 0.0482142857142846*G0_4_1_1 + 0.168749999999999*G0_5_0_0 + 0.265178571428579*G0_5_0_1 + 0.192857142857142*G0_5_1_0 + 0.289285714285725*G0_5_1_1; + A[76] = -A[74] - 0.136607142857144*G0_0_0_1 + 0.104464285714287*G0_0_1_1 + 0.0160714285714291*G0_1_0_1 - 0.024107142857143*G0_1_1_1 + 0.0401785714285773*G0_3_0_1 + 0.0803571428571483*G0_3_1_1 - 0.0401785714285674*G0_4_0_1 - 0.176785714285713*G0_4_1_1 + 0.120535714285723*G0_5_0_1 + 0.353571428571443*G0_5_1_1; + A[75] = A[76] - 0.192857142857145*G0_0_0_0 + 0.506250000000004*G0_0_0_1 + 0.0482142857142858*G0_0_1_0 - 0.265178571428574*G0_0_1_1 - 0.0723214285714286*G0_1_0_1 - 0.0723214285714284*G0_1_1_0 + 0.0241071428571442*G0_2_0_0 - 0.0241071428571417*G0_2_0_1 - 0.0241071428571417*G0_2_1_0 + 0.024107142857144*G0_2_1_1 + 0.21696428571429*G0_3_0_0 + 0.265178571428575*G0_3_0_1 + 0.337500000000004*G0_3_1_0 + 0.289285714285718*G0_3_1_1 - 0.168750000000005*G0_4_0_0 + 0.168749999999995*G0_4_0_1 + 0.337499999999999*G0_4_1_0 + 0.241071428571427*G0_4_1_1 + 0.120535714285714*G0_5_0_0 + 0.168749999999995*G0_5_0_1 + 0.385714285714285*G0_5_1_0 - 0.289285714285727*G0_5_1_1; + A[64] = A[75] + 0.289285714285716*G0_0_0_0 - 0.321428571428575*G0_0_0_1 + 0.184821428571431*G0_0_1_1 + 0.104464285714286*G0_1_0_0 + 0.104464285714285*G0_1_0_1 + 0.104464285714286*G0_1_1_0 - 0.795535714285723*G0_2_0_0 - 0.184821428571431*G0_2_0_1 - 0.506250000000007*G0_2_1_0 - 0.184821428571431*G0_2_1_1 - 0.707142857142863*G0_3_0_0 - 0.62678571428572*G0_3_0_1 - 0.562500000000006*G0_3_1_0 - 0.305357142857151*G0_3_1_1 - 0.401785714285712*G0_4_0_0 - 0.401785714285712*G0_4_0_1 - 0.401785714285712*G0_4_1_0 - 0.176785714285714*G0_5_0_0 - 0.257142857142856*G0_5_0_1 - 0.321428571428571*G0_5_1_0 + 0.305357142857151*G0_5_1_1; + A[46] = A[64] - 0.0160714285714281*G0_0_0_1 + 0.0160714285714281*G0_0_1_0 - 0.0160714285714281*G0_1_0_1 + 0.0160714285714281*G0_1_1_0 - 0.337500000000005*G0_2_0_1 + 0.337500000000005*G0_2_1_0 + 0.144642857142857*G0_3_0_1 - 0.144642857142857*G0_3_1_0 + 0.144642857142857*G0_4_0_1 - 0.144642857142857*G0_4_1_0 + 0.0803571428571429*G0_5_0_1 - 0.0803571428571429*G0_5_1_0; + A[57] = A[75] - 0.337500000000003*G0_0_0_1 + 0.337500000000003*G0_0_1_0 - 0.0160714285714284*G0_1_0_1 + 0.0160714285714284*G0_1_1_0 - 0.0160714285714284*G0_2_0_1 + 0.0160714285714284*G0_2_1_0 + 0.0803571428571428*G0_3_0_1 - 0.0803571428571428*G0_3_1_0 + 0.144642857142858*G0_4_0_1 - 0.144642857142857*G0_4_1_0 + 0.144642857142858*G0_5_0_1 - 0.144642857142858*G0_5_1_0; + A[13] = -A[16] - 0.0428571428571428*G0_0_0_1 + 0.123214285714286*G0_1_0_0 + 0.391071428571431*G0_1_0_1 - 0.104464285714287*G0_2_0_0 - 0.0776785714285721*G0_2_0_1 + 0.0776785714285726*G0_3_0_0 + 0.206250000000002*G0_3_0_1 - 0.12589285714286*G0_4_0_0 + 0.0455357142857157*G0_4_0_1 + 0.0294642857142856*G0_5_0_0 + 0.190178571428573*G0_5_0_1; + A[30] = A[4] - 0.0267857142857148*G0_1_0_0 - 0.0241071428571432*G0_1_0_1 - 0.0589285714285722*G0_1_1_0 - 0.0562500000000006*G0_1_1_1 + 0.0562500000000009*G0_2_0_0 + 0.0241071428571433*G0_2_0_1 + 0.0589285714285724*G0_2_1_0 + 0.0267857142857148*G0_2_1_1 - 0.0294642857142872*G0_3_0_0 + 0.0294642857142876*G0_3_1_1 - 0.0187500000000005*G0_4_0_0 - 0.0107142857142857*G0_4_0_1 - 0.0267857142857146*G0_4_1_0 - 0.0187499999999998*G0_4_1_1 + 0.0187499999999998*G0_5_0_0 + 0.0107142857142856*G0_5_0_1 + 0.0267857142857146*G0_5_1_0 + 0.0187500000000004*G0_5_1_1; + A[28] = A[27] - 0.0294642857142857*G0_0_1_0 + 0.0267857142857148*G0_0_1_1 - 0.0294642857142857*G0_1_1_0 - 0.0562500000000005*G0_1_1_1 + 0.0187500000000004*G0_3_1_1 - 0.01875*G0_4_1_1 + 0.058928571428575*G0_5_1_0 + 0.0294642857142874*G0_5_1_1; + A[26] = -A[28] + 0.0482142857142861*G0_0_1_0 + 0.0133928571428571*G0_1_1_0 - 0.0133928571428575*G0_1_1_1 - 0.391071428571433*G0_2_1_0 - 0.267857142857146*G0_2_1_1 - 0.190178571428572*G0_3_1_0 - 0.141964285714287*G0_3_1_1 - 0.206250000000001*G0_4_1_0 - 0.147321428571429*G0_4_1_1 + 0.013392857142859*G0_5_1_0 - 0.141964285714288*G0_5_1_1; + A[80] = -A[30] + 0.123214285714287*G0_0_0_0 + 0.123214285714287*G0_0_0_1 + 0.0267857142857148*G0_1_0_0 + 0.0267857142857148*G0_1_0_1 - 0.0294642857142859*G0_2_0_0 - 0.0294642857142859*G0_2_0_1 - 0.00267857142857342*G0_3_0_0 - 0.00267857142857345*G0_3_0_1 + 0.104464285714286*G0_4_0_0 + 0.104464285714286*G0_4_0_1 + 0.0776785714285707*G0_5_0_0 + 0.0776785714285706*G0_5_0_1; + A[62] = -A[82] + 0.0482142857142861*G0_0_0_1 + 0.0133928571428571*G0_1_0_1 - 0.0133928571428575*G0_1_1_1 - 0.391071428571433*G0_2_0_1 - 0.267857142857146*G0_2_1_1 - 0.190178571428572*G0_3_0_1 - 0.141964285714287*G0_3_1_1 - 0.206250000000001*G0_4_0_1 - 0.147321428571429*G0_4_1_1 + 0.013392857142859*G0_5_0_1 - 0.141964285714288*G0_5_1_1; + A[14] = -A[16] + 0.029464285714286*G0_0_0_1 - 0.123214285714287*G0_1_0_1 - 0.026785714285715*G0_2_0_1 - 0.0776785714285704*G0_3_0_1 + 0.00267857142857343*G0_4_0_1 - 0.104464285714286*G0_5_0_1; + A[10] = -A[14] - 0.0321428571428577*G0_0_0_0 - 0.0401785714285719*G0_1_0_0 - 0.150000000000001*G0_1_0_1 + 0.0616071428571438*G0_2_0_0 + 0.0133928571428571*G0_2_0_1 - 0.054166666666667*G0_3_0_0 - 0.105059523809523*G0_3_0_1 + 0.0261904761904773*G0_4_0_0 - 0.0461309523809521*G0_4_0_1 - 0.0113095238095235*G0_5_0_0 - 0.0997023809523813*G0_5_0_1; + A[23] = -A[28] + 0.0294642857142861*G0_0_1_0 - 0.0267857142857147*G0_1_1_0 - 0.123214285714288*G0_2_1_0 - 0.0776785714285706*G0_3_1_0 - 0.104464285714286*G0_4_1_0 + 0.00267857142857354*G0_5_1_0; + A[25] = -A[23] + 0.0214285714285717*G0_0_1_0 + 0.0428571428571434*G0_0_1_1 - 0.0214285714285718*G0_1_1_0 + 0.0214285714285716*G0_1_1_1 + 0.0964285714285731*G0_2_1_1 + 0.0107142857142869*G0_3_1_0 + 0.0535714285714293*G0_3_1_1 - 0.0107142857142864*G0_4_1_0 + 0.0428571428571427*G0_4_1_1 + 0.117857142857145*G0_5_1_1; + A[19] = 0.0267857142857145*G0_0_0_0 - 0.0214285714285718*G0_0_0_1 - 0.123214285714287*G0_1_0_0 + 0.0482142857142863*G0_2_0_0 + 0.0214285714285717*G0_2_0_1 - 0.0589285714285722*G0_3_0_0 - 0.0107142857142869*G0_3_0_1 + 0.155357142857147*G0_4_0_0 - 0.0482142857142854*G0_5_0_0 + 0.0107142857142866*G0_5_0_1; + A[87] = -A[37] - 0.200892857142861*G0_0_0_0 + 0.0401785714285705*G0_0_0_1 - 0.096428571428573*G0_1_0_0 - 0.0964285714285728*G0_1_0_1 + 0.128571428571429*G0_2_0_0 + 0.0883928571428569*G0_2_0_1 - 0.136607142857138*G0_3_0_0 - 0.0964285714285672*G0_3_0_1 - 0.409821428571432*G0_4_0_0 - 0.176785714285713*G0_4_0_1 - 0.634821428571432*G0_5_0_0 - 0.771428571428578*G0_5_0_1; + A[42] = -A[62] - 0.0107142857142862*G0_0_1_1 - 0.0107142857142861*G0_1_1_1 - 0.171428571428574*G0_2_1_1 - 0.133928571428572*G0_3_1_1 - 0.133928571428572*G0_4_1_1 - 0.176785714285717*G0_5_1_1; + A[6] = -A[4] + 0.123214285714287*G0_0_0_1 + 0.123214285714287*G0_0_1_1 - 0.0294642857142861*G0_1_0_1 - 0.0294642857142861*G0_1_1_1 + 0.0267857142857149*G0_2_0_1 + 0.0267857142857149*G0_2_1_1 - 0.00267857142857342*G0_3_0_1 - 0.00267857142857346*G0_3_1_1 + 0.0776785714285708*G0_4_0_1 + 0.0776785714285709*G0_4_1_1 + 0.104464285714286*G0_5_0_1 + 0.104464285714286*G0_5_1_1; + A[7] = A[6] - 0.267857142857145*G0_0_0_0 - 0.267857142857145*G0_0_1_0 - 0.0187500000000003*G0_1_0_1 - 0.0187500000000003*G0_1_1_1 - 0.0133928571428578*G0_2_0_0 - 0.0535714285714296*G0_2_0_1 - 0.0133928571428578*G0_2_1_0 - 0.0535714285714296*G0_2_1_1 - 0.141964285714288*G0_3_0_0 - 0.152678571428574*G0_3_0_1 - 0.141964285714288*G0_3_1_0 - 0.152678571428574*G0_3_1_1 - 0.141964285714287*G0_4_0_0 - 0.0294642857142854*G0_4_0_1 - 0.141964285714287*G0_4_1_0 - 0.0294642857142854*G0_4_1_1 - 0.147321428571429*G0_5_0_0 - 0.0455357142857143*G0_5_0_1 - 0.147321428571429*G0_5_1_0 - 0.0455357142857142*G0_5_1_1; + A[70] = A[7] - 0.391071428571432*G0_0_0_1 + 0.391071428571432*G0_0_1_0 + 0.0455357142857146*G0_1_0_1 - 0.0455357142857146*G0_1_1_0 + 0.0455357142857145*G0_2_0_1 - 0.0455357142857145*G0_2_1_0 - 0.0160714285714284*G0_3_0_1 + 0.0160714285714284*G0_3_1_0 - 0.198214285714287*G0_4_0_1 + 0.198214285714287*G0_4_1_0 - 0.198214285714287*G0_5_0_1 + 0.198214285714287*G0_5_1_0; + A[5] = A[70] + 0.391071428571432*G0_0_0_0 - 0.391071428571432*G0_0_1_1 + 0.0455357142857149*G0_1_0_1 + 0.045535714285715*G0_1_1_0 + 0.0910714285714295*G0_1_1_1 - 0.0910714285714295*G0_2_0_0 - 0.045535714285715*G0_2_0_1 - 0.045535714285715*G0_2_1_0 + 0.0160714285714285*G0_3_0_0 - 0.0160714285714286*G0_3_1_1 + 0.219642857142859*G0_4_0_0 + 0.0214285714285722*G0_4_0_1 + 0.0214285714285722*G0_4_1_0 - 0.176785714285715*G0_4_1_1 + 0.176785714285715*G0_5_0_0 - 0.0214285714285724*G0_5_0_1 - 0.0214285714285723*G0_5_1_0 - 0.219642857142859*G0_5_1_1; + A[50] = A[5] + 0.391071428571432*G0_0_0_1 - 0.391071428571432*G0_0_1_0 - 0.0455357142857145*G0_1_0_1 + 0.0455357142857145*G0_1_1_0 - 0.0455357142857145*G0_2_0_1 + 0.0455357142857145*G0_2_1_0 + 0.0160714285714285*G0_3_0_1 - 0.0160714285714285*G0_3_1_0 + 0.198214285714287*G0_4_0_1 - 0.198214285714287*G0_4_1_0 + 0.198214285714287*G0_5_0_1 - 0.198214285714287*G0_5_1_0; + A[17] = -A[14] + 0.0428571428571434*G0_0_0_0 + 0.0214285714285718*G0_0_0_1 + 0.0964285714285725*G0_1_0_0 + 0.0214285714285719*G0_2_0_0 - 0.0214285714285718*G0_2_0_1 + 0.0535714285714292*G0_3_0_0 + 0.010714285714287*G0_3_0_1 + 0.117857142857145*G0_4_0_0 + 0.0428571428571424*G0_5_0_0 - 0.0107142857142865*G0_5_0_1; + A[24] = -A[26] - 0.0107142857142862*G0_0_1_1 - 0.0107142857142861*G0_1_1_1 - 0.171428571428574*G0_2_1_1 - 0.133928571428572*G0_3_1_1 - 0.133928571428572*G0_4_1_1 - 0.176785714285717*G0_5_1_1; + A[47] = A[74] + 0.0160714285714293*G0_0_0_1 - 0.0160714285714293*G0_0_1_0 + 0.0160714285714291*G0_2_0_1 - 0.0160714285714291*G0_2_1_0 - 0.0482142857142907*G0_3_0_1 + 0.0482142857142907*G0_3_1_0 + 0.0642857142857134*G0_4_0_1 - 0.0642857142857134*G0_4_1_0 - 0.0482142857142905*G0_5_0_1 + 0.0482142857142905*G0_5_1_0; + A[67] = -A[47] - 0.136607142857145*G0_0_1_0 + 0.104464285714287*G0_0_1_1 + 0.016071428571429*G0_1_1_0 - 0.024107142857143*G0_1_1_1 + 0.0401785714285773*G0_3_1_0 + 0.0803571428571483*G0_3_1_1 - 0.0401785714285674*G0_4_1_0 - 0.176785714285713*G0_4_1_1 + 0.120535714285723*G0_5_1_0 + 0.353571428571443*G0_5_1_1; + A[48] = A[47] + 0.0241071428571435*G0_0_0_0 - 0.0241071428571427*G0_0_0_1 - 0.024107142857142*G0_0_1_0 - 0.0482142857142864*G0_0_1_1 + 0.0241071428571434*G0_1_0_0 + 0.0482142857142861*G0_1_0_1 + 0.168750000000001*G0_1_1_0 + 0.289285714285716*G0_1_1_1 - 0.0241071428571453*G0_3_0_1 - 0.0964285714285826*G0_3_1_0 - 0.289285714285723*G0_3_1_1 + 0.0241071428571424*G0_4_0_1 + 0.0964285714285693*G0_4_1_0 + 0.0482142857142848*G0_4_1_1 - 0.0482142857142861*G0_5_0_0 - 0.0241071428571432*G0_5_0_1 - 0.144642857142866*G0_5_1_0; + A[68] = -A[48] - 0.0160714285714289*G0_0_1_0 - 0.0401785714285721*G0_0_1_1 + 0.136607142857144*G0_1_1_0 + 0.241071428571431*G0_1_1_1 + 0.0401785714285666*G0_3_1_0 - 0.136607142857145*G0_3_1_1 - 0.040178571428577*G0_4_1_0 + 0.0401785714285717*G0_4_1_1 - 0.120535714285723*G0_5_1_0 + 0.23303571428572*G0_5_1_1; + A[86] = A[68] + 0.0160714285714291*G0_1_0_1 - 0.0160714285714291*G0_1_1_0 + 0.016071428571429*G0_2_0_1 - 0.016071428571429*G0_2_1_0 + 0.0642857142857133*G0_3_0_1 - 0.0642857142857133*G0_3_1_0 - 0.0482142857142903*G0_4_0_1 + 0.0482142857142903*G0_4_1_0 - 0.0482142857142904*G0_5_0_1 + 0.0482142857142904*G0_5_1_0; + A[36] = -A[86] - 0.0401785714285723*G0_0_0_0 - 0.016071428571429*G0_0_0_1 + 0.241071428571432*G0_2_0_0 + 0.136607142857145*G0_2_0_1 - 0.136607142857145*G0_3_0_0 + 0.0401785714285672*G0_3_0_1 + 0.23303571428572*G0_4_0_0 - 0.120535714285722*G0_4_0_1 + 0.0401785714285718*G0_5_0_0 - 0.040178571428577*G0_5_0_1; + A[35] = A[36] + 0.0482142857142864*G0_0_0_0 + 0.0241071428571422*G0_0_0_1 + 0.0241071428571427*G0_0_1_0 - 0.0241071428571431*G0_0_1_1 - 0.289285714285717*G0_2_0_0 - 0.168750000000002*G0_2_0_1 - 0.0482142857142857*G0_2_1_0 - 0.0241071428571431*G0_2_1_1 + 0.289285714285723*G0_3_0_0 + 0.0964285714285816*G0_3_0_1 + 0.0241071428571448*G0_3_1_0 + 0.144642857142865*G0_4_0_1 + 0.0241071428571431*G0_4_1_0 + 0.0482142857142859*G0_4_1_1 - 0.048214285714285*G0_5_0_0 - 0.0964285714285696*G0_5_0_1 - 0.0241071428571431*G0_5_1_0; + A[85] = -A[35] + 0.104464285714287*G0_0_0_0 - 0.136607142857144*G0_0_0_1 - 0.0241071428571437*G0_2_0_0 + 0.0160714285714285*G0_2_0_1 + 0.080357142857148*G0_3_0_0 + 0.0401785714285771*G0_3_0_1 + 0.353571428571442*G0_4_0_0 + 0.120535714285722*G0_4_0_1 - 0.176785714285713*G0_5_0_0 - 0.040178571428567*G0_5_0_1; + A[45] = A[35] - 0.0482142857142862*G0_1_0_0 - 0.0241071428571435*G0_1_0_1 - 0.0241071428571434*G0_1_1_0 + 0.0241071428571423*G0_1_1_1 + 0.289285714285718*G0_2_0_0 + 0.241071428571432*G0_2_0_1 + 0.120535714285716*G0_2_1_0 + 0.096428571428573*G0_2_1_1 + 0.0241071428571404*G0_3_0_1 + 0.144642857142863*G0_3_1_0 + 0.12053571428572*G0_3_1_1 - 0.289285714285723*G0_4_0_0 - 0.265178571428578*G0_4_0_1 - 0.192857142857142*G0_4_1_0 - 0.168749999999999*G0_4_1_1 + 0.0482142857142849*G0_5_0_0 + 0.0241071428571419*G0_5_0_1 - 0.0482142857142845*G0_5_1_0 - 0.0723214285714298*G0_5_1_1; + A[54] = A[45] + 0.0160714285714286*G0_0_0_1 - 0.0160714285714286*G0_0_1_0 + 0.0160714285714288*G0_1_0_1 - 0.0160714285714288*G0_1_1_0 - 0.120535714285716*G0_2_0_1 + 0.120535714285716*G0_2_1_0 + 0.0723214285714317*G0_3_0_1 - 0.0723214285714317*G0_3_1_0 + 0.0241071428571458*G0_4_0_1 - 0.0241071428571458*G0_4_1_0 - 0.00803571428571336*G0_5_0_1 + 0.00803571428571334*G0_5_1_0; + A[65] = -A[45] + 0.0401785714285708*G0_0_1_0 - 0.200892857142861*G0_0_1_1 + 0.0883928571428572*G0_1_1_0 + 0.128571428571429*G0_1_1_1 - 0.0964285714285734*G0_2_1_0 - 0.0964285714285734*G0_2_1_1 - 0.0964285714285673*G0_3_1_0 - 0.136607142857138*G0_3_1_1 - 0.771428571428578*G0_4_1_0 - 0.634821428571432*G0_4_1_1 - 0.176785714285713*G0_5_1_0 - 0.409821428571433*G0_5_1_1; + A[53] = A[35] + 0.0160714285714292*G0_0_0_1 - 0.0160714285714292*G0_0_1_0 + 0.0160714285714288*G0_1_0_1 - 0.0160714285714288*G0_1_1_0 - 0.0482142857142907*G0_3_0_1 + 0.0482142857142907*G0_3_1_0 - 0.0482142857142904*G0_4_0_1 + 0.0482142857142904*G0_4_1_0 + 0.0642857142857131*G0_5_0_1 - 0.0642857142857131*G0_5_1_0; + A[58] = -A[53] + 0.104464285714287*G0_0_0_0 - 0.136607142857144*G0_0_1_0 - 0.0241071428571437*G0_2_0_0 + 0.0160714285714285*G0_2_1_0 + 0.080357142857148*G0_3_0_0 + 0.040178571428577*G0_3_1_0 + 0.353571428571442*G0_4_0_0 + 0.120535714285722*G0_4_1_0 - 0.176785714285713*G0_5_0_0 - 0.040178571428567*G0_5_1_0; + A[34] = -A[36] - 0.0883928571428565*G0_0_0_1 + 0.0401785714285721*G0_0_1_1 - 0.0401785714285704*G0_1_0_1 - 0.241071428571431*G0_1_1_1 + 0.0964285714285735*G0_2_0_1 + 0.771428571428576*G0_3_0_1 + 0.136607142857145*G0_3_1_1 + 0.0964285714285664*G0_4_0_1 - 0.0401785714285715*G0_4_1_1 + 0.176785714285712*G0_5_0_1 - 0.23303571428572*G0_5_1_1; + A[84] = -A[86] - 0.0160714285714289*G0_0_0_1 - 0.0401785714285721*G0_0_1_1 + 0.136607142857144*G0_1_0_1 + 0.241071428571431*G0_1_1_1 + 0.0401785714285666*G0_3_0_1 - 0.136607142857145*G0_3_1_1 - 0.0401785714285769*G0_4_0_1 + 0.0401785714285717*G0_4_1_1 - 0.120535714285723*G0_5_0_1 + 0.23303571428572*G0_5_1_1; + A[91] = A[19] + 0.0214285714285718*G0_0_0_1 - 0.0214285714285718*G0_0_1_0 - 0.0214285714285717*G0_2_0_1 + 0.0214285714285717*G0_2_1_0 + 0.0107142857142868*G0_3_0_1 - 0.0107142857142868*G0_3_1_0 - 0.0107142857142866*G0_5_0_1 + 0.0107142857142866*G0_5_1_0; + A[66] = -A[64] + 0.016071428571428*G0_0_0_1 + 0.0883928571428597*G0_0_1_1 + 0.0160714285714281*G0_1_0_1 - 0.0883928571428571*G0_1_1_1 + 0.337500000000005*G0_2_0_1 + 0.241071428571433*G0_2_1_1 - 0.144642857142857*G0_3_0_1 + 0.273214285714284*G0_3_1_1 - 0.144642857142857*G0_4_0_1 + 0.691071428571434*G0_4_1_1 - 0.0803571428571429*G0_5_0_1 + 0.482142857142864*G0_5_1_1; + A[55] = A[66] + 0.192857142857144*G0_0_0_0 - 0.0964285714285716*G0_0_0_1 - 0.0964285714285716*G0_0_1_0 + 0.337500000000003*G0_0_1_1 - 0.723214285714292*G0_2_0_0 - 0.433928571428576*G0_2_0_1 - 0.433928571428575*G0_2_1_0 - 0.337500000000004*G0_2_1_1 - 0.144642857142857*G0_3_0_0 - 0.0964285714285715*G0_3_1_1 + 0.433928571428579*G0_4_0_0 + 0.433928571428578*G0_4_0_1 + 0.433928571428578*G0_4_1_0 + 0.241071428571428*G0_5_0_0 + 0.0964285714285712*G0_5_0_1 + 0.0964285714285712*G0_5_1_0 + 0.096428571428571*G0_5_1_1; + A[56] = -A[54] + 0.0401785714285708*G0_0_0_1 - 0.200892857142861*G0_0_1_1 + 0.0883928571428572*G0_1_0_1 + 0.128571428571429*G0_1_1_1 - 0.0964285714285734*G0_2_0_1 - 0.0964285714285734*G0_2_1_1 - 0.0964285714285672*G0_3_0_1 - 0.136607142857138*G0_3_1_1 - 0.771428571428578*G0_4_0_1 - 0.634821428571432*G0_4_1_1 - 0.176785714285713*G0_5_0_1 - 0.409821428571433*G0_5_1_1; + A[3] = A[30] - 0.0321428571428575*G0_1_0_1 + 0.0321428571428575*G0_1_1_0 + 0.00267857142857153*G0_2_0_1 - 0.00267857142857153*G0_2_1_0 + 0.0294642857142875*G0_3_0_1 - 0.0294642857142875*G0_3_1_0 - 0.00803571428571411*G0_4_0_1 + 0.00803571428571411*G0_4_1_0 + 0.00803571428571483*G0_5_0_1 - 0.00803571428571483*G0_5_1_0; + A[8] = -A[3] + 0.123214285714287*G0_0_0_0 + 0.123214285714287*G0_0_1_0 + 0.0267857142857148*G0_1_0_0 + 0.0267857142857148*G0_1_1_0 - 0.0294642857142859*G0_2_0_0 - 0.0294642857142859*G0_2_1_0 - 0.00267857142857342*G0_3_0_0 - 0.00267857142857345*G0_3_1_0 + 0.104464285714286*G0_4_0_0 + 0.104464285714286*G0_4_1_0 + 0.0776785714285707*G0_5_0_0 + 0.0776785714285707*G0_5_1_0; + A[12] = -0.00803571428571443*G0_0_0_1 + 0.0267857142857146*G0_1_0_1 + 0.0267857142857148*G0_2_0_1 + 0.0032738095238093*G0_3_0_1 + 0.0193452380952383*G0_4_0_1 + 0.0193452380952383*G0_5_0_1; + A[2] = -A[12] - 0.034821428571429*G0_0_0_1 - 0.0267857142857146*G0_0_1_1 + 0.034821428571429*G0_1_0_1 + 0.00803571428571444*G0_1_1_1 - 0.0267857142857148*G0_2_1_1 - 0.016071428571429*G0_3_0_1 - 0.0193452380952384*G0_3_1_1 + 0.016071428571429*G0_4_0_1 - 0.00327380952380935*G0_4_1_1 - 0.0193452380952383*G0_5_1_1; + A[49] = -A[69] + 0.0482142857142858*G0_0_1_0 - 0.0482142857142868*G0_1_1_0 - 0.0482142857142884*G0_1_1_1 + 0.0964285714285728*G0_2_1_1 - 0.675000000000008*G0_3_1_0 - 0.916071428571437*G0_3_1_1 + 0.675000000000011*G0_4_1_0 - 0.241071428571428*G0_4_1_1 - 0.916071428571449*G0_5_1_1; + A[93] = A[49] + 0.144642857142857*G0_0_0_0 - 0.144642857142857*G0_0_1_1 - 0.144642857142859*G0_1_0_0 - 0.337500000000002*G0_1_0_1 - 0.0964285714285726*G0_1_1_0 + 0.337500000000003*G0_2_0_1 + 0.0964285714285731*G0_2_1_0 + 0.144642857142859*G0_2_1_1 - 0.86785714285715*G0_3_0_0 + 0.867857142857152*G0_3_1_1 - 0.867857142857158*G0_4_0_0 + 0.096428571428571*G0_4_0_1 - 0.0964285714285714*G0_4_1_0 + 0.289285714285713*G0_4_1_1 - 0.289285714285713*G0_5_0_0 - 0.0964285714285699*G0_5_0_1 + 0.0964285714285718*G0_5_1_0 + 0.86785714285716*G0_5_1_1; + A[94] = A[49] - 0.0482142857142864*G0_1_0_1 + 0.0482142857142864*G0_1_1_0 + 0.192857142857144*G0_2_0_1 - 0.192857142857144*G0_2_1_0 - 0.433928571428581*G0_3_0_1 + 0.433928571428581*G0_3_1_0 + 0.241071428571428*G0_4_0_1 - 0.241071428571428*G0_4_1_0 + 0.0482142857142863*G0_5_0_1 - 0.0482142857142863*G0_5_1_0; + A[97] = -A[94] + 0.144642857142859*G0_0_0_0 + 0.192857142857144*G0_0_1_0 - 0.0482142857142867*G0_1_0_0 - 0.0482142857142864*G0_2_0_0 - 0.192857142857145*G0_2_1_0 - 0.626785714285731*G0_3_0_0 - 1.4464285714286*G0_3_0_1 - 0.96428571428573*G0_3_1_0 - 1.73571428571431*G0_3_1_1 + 0.530357142857155*G0_4_0_0 - 0.289285714285713*G0_4_0_1 - 0.289285714285714*G0_4_1_0 - 0.578571428571427*G0_4_1_1 + 0.0482142857142853*G0_5_0_0 - 0.289285714285714*G0_5_0_1 - 0.771428571428583*G0_5_1_0 - 1.73571428571431*G0_5_1_1; + A[98] = -A[93] + 0.0482142857142858*G0_0_1_0 + 0.0964285714285721*G0_1_0_0 - 0.048214285714288*G0_2_0_0 - 0.0482142857142861*G0_2_1_0 - 0.916071428571436*G0_3_0_0 - 0.675000000000008*G0_3_1_0 - 0.916071428571446*G0_4_0_0 - 0.241071428571427*G0_5_0_0 + 0.675000000000012*G0_5_1_0; + A[89] = A[98] + 0.0482142857142859*G0_0_0_1 - 0.0482142857142859*G0_0_1_0 - 0.192857142857143*G0_1_0_1 + 0.192857142857143*G0_1_1_0 - 0.241071428571426*G0_3_0_1 + 0.241071428571426*G0_3_1_0 - 0.0482142857142849*G0_4_0_1 + 0.0482142857142849*G0_4_1_0 + 0.433928571428584*G0_5_0_1 - 0.433928571428584*G0_5_1_0; + A[39] = -A[89] + 0.0482142857142858*G0_0_0_1 + 0.0964285714285721*G0_1_0_0 - 0.048214285714288*G0_2_0_0 - 0.0482142857142861*G0_2_0_1 - 0.916071428571436*G0_3_0_0 - 0.675000000000008*G0_3_0_1 - 0.916071428571446*G0_4_0_0 - 0.241071428571427*G0_5_0_0 + 0.675000000000012*G0_5_0_1; + A[96] = -A[94] + 0.0482142857142859*G0_0_0_1 - 0.0482142857142868*G0_1_0_1 - 0.0482142857142884*G0_1_1_1 + 0.0964285714285728*G0_2_1_1 - 0.675000000000008*G0_3_0_1 - 0.916071428571437*G0_3_1_1 + 0.675000000000011*G0_4_0_1 - 0.241071428571428*G0_4_1_1 - 0.916071428571449*G0_5_1_1; + A[59] = -A[39] + 0.192857142857143*G0_0_1_0 + 0.144642857142859*G0_0_1_1 - 0.192857142857144*G0_1_1_0 - 0.0482142857142861*G0_1_1_1 - 0.0482142857142869*G0_2_1_1 - 1.73571428571431*G0_3_0_0 - 1.4464285714286*G0_3_0_1 - 0.964285714285729*G0_3_1_0 - 0.62678571428573*G0_3_1_1 - 1.73571428571431*G0_4_0_0 - 0.289285714285713*G0_4_0_1 - 0.771428571428581*G0_4_1_0 + 0.0482142857142859*G0_4_1_1 - 0.578571428571427*G0_5_0_0 - 0.289285714285714*G0_5_0_1 - 0.289285714285713*G0_5_1_0 + 0.530357142857157*G0_5_1_1; + A[29] = A[92] + 0.0214285714285718*G0_0_0_1 - 0.0214285714285718*G0_0_1_0 - 0.0214285714285718*G0_1_0_1 + 0.0214285714285718*G0_1_1_0 + 0.0107142857142869*G0_3_0_1 - 0.0107142857142869*G0_3_1_0 - 0.0107142857142865*G0_4_0_1 + 0.0107142857142865*G0_4_1_0; + A[81] = -A[31] - 0.0107142857142862*G0_0_0_0 - 0.171428571428573*G0_1_0_0 - 0.0107142857142863*G0_2_0_0 - 0.133928571428572*G0_3_0_0 - 0.176785714285717*G0_4_0_0 - 0.133928571428572*G0_5_0_0; + A[44] = -A[64] - 0.0160714285714281*G0_0_1_0 - 0.104464285714285*G0_0_1_1 - 0.0160714285714281*G0_1_1_0 + 0.0723214285714313*G0_1_1_1 - 0.337500000000005*G0_2_1_0 - 0.096428571428572*G0_2_1_1 + 0.144642857142857*G0_3_1_0 + 0.835714285714289*G0_3_1_1 + 0.144642857142857*G0_4_1_0 + 0.41785714285714*G0_4_1_1 + 0.0803571428571429*G0_5_1_0 + 0.562500000000006*G0_5_1_1; + A[33] = A[44] + 0.192857142857144*G0_1_0_0 + 0.289285714285716*G0_1_0_1 + 0.289285714285716*G0_1_1_0 + 0.72321428571429*G0_1_1_1 - 0.723214285714291*G0_2_0_0 - 0.289285714285716*G0_2_0_1 - 0.289285714285716*G0_2_1_0 - 0.192857142857144*G0_2_1_1 + 0.433928571428576*G0_3_0_0 - 0.433928571428578*G0_3_1_1 - 0.144642857142858*G0_4_0_0 - 0.144642857142857*G0_4_0_1 - 0.144642857142857*G0_4_1_0 - 0.241071428571427*G0_4_1_1 + 0.241071428571426*G0_5_0_0 + 0.144642857142856*G0_5_0_1 + 0.144642857142856*G0_5_1_0 + 0.144642857142857*G0_5_1_1; + A[83] = -A[33] - 0.104464285714285*G0_0_0_0 - 0.0160714285714283*G0_0_0_1 - 0.0964285714285716*G0_1_0_0 - 0.337500000000003*G0_1_0_1 + 0.0723214285714317*G0_2_0_0 - 0.0160714285714284*G0_2_0_1 + 0.835714285714288*G0_3_0_0 + 0.144642857142857*G0_3_0_1 + 0.562500000000005*G0_4_0_0 + 0.0803571428571427*G0_4_0_1 + 0.41785714285714*G0_5_0_0 + 0.144642857142858*G0_5_0_1; + A[63] = -A[68] - 0.0401785714285723*G0_0_0_0 - 0.016071428571429*G0_0_1_0 + 0.241071428571432*G0_2_0_0 + 0.136607142857145*G0_2_1_0 - 0.136607142857145*G0_3_0_0 + 0.0401785714285673*G0_3_1_0 + 0.23303571428572*G0_4_0_0 - 0.120535714285722*G0_4_1_0 + 0.0401785714285718*G0_5_0_0 - 0.040178571428577*G0_5_1_0; + A[0] = -A[48] + 0.206250000000002*G0_0_0_0 + 0.182142857142859*G0_0_0_1 + 0.166071428571431*G0_0_1_0 + 0.16607142857143*G0_0_1_1 + 0.00803571428571445*G0_1_0_1 + 0.12857142857143*G0_1_1_0 + 0.225000000000002*G0_1_1_1 - 0.0160714285714293*G0_2_0_0 + 0.00803571428571421*G0_2_0_1 - 0.00803571428571391*G0_2_1_0 + 0.0836309523809523*G0_3_0_0 + 0.0997023809523809*G0_3_0_1 + 0.0755952380952343*G0_3_1_0 - 0.0529761904761925*G0_3_1_1 + 0.0675595238095224*G0_4_0_0 + 0.147916666666667*G0_4_0_1 + 0.15595238095238*G0_4_1_0 + 0.123809523809524*G0_4_1_1 + 0.0836309523809528*G0_5_0_0 + 0.147916666666667*G0_5_0_1 + 0.0755952380952345*G0_5_1_0 + 0.300595238095243*G0_5_1_1; + A[79] = A[97] + 0.192857142857144*G0_0_0_1 - 0.192857142857144*G0_0_1_0 - 0.0482142857142863*G0_1_0_1 + 0.0482142857142863*G0_1_1_0 + 0.048214285714285*G0_3_0_1 - 0.048214285714285*G0_3_1_0 + 0.241071428571428*G0_4_0_1 - 0.241071428571428*G0_4_1_0 - 0.433928571428583*G0_5_0_1 + 0.433928571428583*G0_5_1_0; + A[90] = -A[79] + 0.0696428571428583*G0_0_0_0 + 0.0214285714285714*G0_0_0_1 - 0.171428571428573*G0_0_1_0 - 0.21964285714286*G0_0_1_1 - 0.0696428571428583*G0_1_0_0 - 0.0696428571428589*G0_1_0_1 + 0.0482142857142849*G0_1_1_1 + 0.0964285714285721*G0_2_0_1 + 0.0750000000000004*G0_2_1_0 + 0.123214285714286*G0_2_1_1 - 0.182142857142863*G0_3_0_0 - 0.278571428571434*G0_3_0_1 - 0.326785714285719*G0_3_1_0 - 0.423214285714291*G0_3_1_1 + 0.182142857142862*G0_4_0_0 - 0.107142857142858*G0_4_0_1 - 0.337499999999999*G0_4_1_0 - 0.3375*G0_4_1_1 - 0.675000000000011*G0_5_0_1 - 0.251785714285715*G0_5_1_0 - 1.21607142857145*G0_5_1_1; + A[9] = A[90] + 0.0214285714285718*G0_1_0_1 - 0.0214285714285718*G0_1_1_0 - 0.0214285714285717*G0_2_0_1 + 0.0214285714285717*G0_2_1_0 + 0.0107142857142864*G0_4_0_1 - 0.0107142857142864*G0_4_1_0 - 0.0107142857142868*G0_5_0_1 + 0.0107142857142867*G0_5_1_0; + A[38] = -A[33] - 0.104464285714285*G0_0_0_0 - 0.0160714285714282*G0_0_1_0 - 0.0964285714285716*G0_1_0_0 - 0.337500000000003*G0_1_1_0 + 0.0723214285714317*G0_2_0_0 - 0.0160714285714284*G0_2_1_0 + 0.835714285714288*G0_3_0_0 + 0.144642857142857*G0_3_1_0 + 0.562500000000005*G0_4_0_0 + 0.0803571428571427*G0_4_1_0 + 0.41785714285714*G0_5_0_0 + 0.144642857142858*G0_5_1_0; + A[20] = -A[21] - 0.034821428571429*G0_0_1_0 - 0.0267857142857146*G0_0_1_1 + 0.034821428571429*G0_1_1_0 + 0.00803571428571444*G0_1_1_1 - 0.0267857142857148*G0_2_1_1 - 0.016071428571429*G0_3_1_0 - 0.0193452380952384*G0_3_1_1 + 0.016071428571429*G0_4_1_0 - 0.00327380952380935*G0_4_1_1 - 0.0193452380952383*G0_5_1_1; + A[18] = -A[13] - 0.0107142857142863*G0_0_0_0 - 0.171428571428573*G0_1_0_0 - 0.0107142857142863*G0_2_0_0 - 0.133928571428572*G0_3_0_0 - 0.176785714285717*G0_4_0_0 - 0.133928571428572*G0_5_0_0; + A[88] = -A[83] + 0.0883928571428596*G0_0_0_0 + 0.0160714285714283*G0_0_1_0 + 0.241071428571431*G0_1_0_0 + 0.337500000000003*G0_1_1_0 - 0.0883928571428568*G0_2_0_0 + 0.0160714285714283*G0_2_1_0 + 0.273214285714283*G0_3_0_0 - 0.144642857142857*G0_3_1_0 + 0.482142857142863*G0_4_0_0 - 0.0803571428571427*G0_4_1_0 + 0.691071428571433*G0_5_0_0 - 0.144642857142857*G0_5_1_0; + A[77] = A[88] + 0.337500000000002*G0_0_0_0 - 0.0964285714285717*G0_0_0_1 - 0.0964285714285717*G0_0_1_0 + 0.192857142857144*G0_0_1_1 - 0.337500000000002*G0_1_0_0 - 0.433928571428574*G0_1_0_1 - 0.433928571428574*G0_1_1_0 - 0.72321428571429*G0_1_1_1 - 0.0964285714285711*G0_3_0_0 - 0.144642857142856*G0_3_1_1 + 0.0964285714285713*G0_4_0_0 + 0.0964285714285713*G0_4_0_1 + 0.0964285714285713*G0_4_1_0 + 0.241071428571428*G0_4_1_1 + 0.433928571428579*G0_5_0_1 + 0.433928571428579*G0_5_1_0 + 0.43392857142858*G0_5_1_1; + A[43] = -A[48] + 0.0401785714285723*G0_0_0_0 - 0.0883928571428564*G0_0_1_0 + 0.0964285714285731*G0_1_1_0 - 0.241071428571432*G0_2_0_0 - 0.0401785714285707*G0_2_1_0 + 0.136607142857145*G0_3_0_0 + 0.771428571428575*G0_3_1_0 - 0.23303571428572*G0_4_0_0 + 0.176785714285712*G0_4_1_0 - 0.0401785714285716*G0_5_0_0 + 0.0964285714285658*G0_5_1_0; + A[95] = A[59] + 0.192857142857144*G0_0_0_1 - 0.192857142857144*G0_0_1_0 - 0.0482142857142861*G0_2_0_1 + 0.0482142857142861*G0_2_1_0 + 0.048214285714285*G0_3_0_1 - 0.048214285714285*G0_3_1_0 - 0.433928571428583*G0_4_0_1 + 0.433928571428583*G0_4_1_0 + 0.241071428571428*G0_5_0_1 - 0.241071428571428*G0_5_1_0; + A[52] = -A[32] + 0.0214285714285718*G0_0_0_1 + 0.0428571428571434*G0_0_1_1 - 0.0214285714285718*G0_1_0_1 + 0.0214285714285716*G0_1_1_1 + 0.0964285714285731*G0_2_1_1 + 0.0107142857142869*G0_3_0_1 + 0.0535714285714293*G0_3_1_1 - 0.0107142857142864*G0_4_0_1 + 0.0428571428571427*G0_4_1_1 + 0.117857142857145*G0_5_1_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p2_q3_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p2_q3_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q3_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q3_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q3_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q3_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q3_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q3_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q3_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q3_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p2_q4_quadrature.h b/laplacian_2d/laplacian_f1_p2_q4_quadrature.h new file mode 100644 index 0000000..6c4c97c --- /dev/null +++ b/laplacian_2d/laplacian_f1_p2_q4_quadrature.h @@ -0,0 +1,7266 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P2_Q4_QUADRATURE_H +#define __LAPLACIAN_F1_P2_Q4_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q4_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q4_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q4_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q4_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q4_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q4_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q4_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q4_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q4_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q4_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q4_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q4_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p2_q4_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p2_q4_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W25[25] = {0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0275289856644697, 0.0475518970579538, 0.0416389652151948, 0.021022967487322, 0.00447940679728133, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783}; + // Quadrature points on the UFC reference element: (0.0450425935698037, 0.0398098570514687), (0.0376212523451112, 0.198013417873608), (0.0263646449444709, 0.437974810247386), (0.0142857943955714, 0.695464273353636), (0.00462228846504642, 0.901464914201174), (0.221578609552379, 0.0398098570514687), (0.185070710267389, 0.198013417873608), (0.129695936782254, 0.437974810247386), (0.0702762920082817, 0.695464273353636), (0.022738483063764, 0.901464914201174), (0.480095071474266, 0.0398098570514687), (0.400993291063196, 0.198013417873608), (0.281012594876307, 0.437974810247386), (0.152267863323182, 0.695464273353636), (0.0492675428994132, 0.901464914201174), (0.738611533396152, 0.0398098570514687), (0.616915871859002, 0.198013417873608), (0.43232925297036, 0.437974810247386), (0.234259434638082, 0.695464273353636), (0.0757966027350624, 0.901464914201174), (0.915147549378728, 0.0398098570514687), (0.764365329781281, 0.198013417873608), (0.535660544808143, 0.437974810247386), (0.290249932250792, 0.695464273353636), (0.09391279733378, 0.901464914201174) + + // Value of basis functions at quadrature points. + static const double FE0[25][6] = \ + {{0.759842524889054, -0.0409849230988147, -0.036640207614552, 0.00717255684496523, 0.145727572487076, 0.164882476492272}, + {0.404143384962011, -0.0347905350890822, -0.119594790557632, 0.0297980510461639, 0.605418365816316, 0.115025523822223}, + {0.0382038937201701, -0.0249744559383749, -0.0543309414249183, 0.0461882014671774, 0.938423301877431, 0.0564900002985142}, + {-0.121759885907613, -0.0138776265525463, 0.271876837668966, 0.0397410384743819, 0.807433832894958, 0.0165858034218535}, + {-0.0762735703276686, -0.00457955736373816, 0.723813068870285, 0.0166673234982246, 0.338636367163553, 0.00173636815934486}, + {0.352482461135478, -0.123384449130048, -0.036640207614552, 0.0352840510877737, 0.117616078244268, 0.65464206627708}, + {0.144254514044104, -0.116568374669637, -0.119594790557632, 0.146585935553368, 0.488630481309112, 0.456692234320686}, + {-0.0585120870225411, -0.0960538647466012, -0.0543309414249183, 0.227214213208259, 0.75739729013635, 0.224285389849452}, + {-0.124504469204174, -0.0603987775714151, 0.271876837668966, 0.19549860142211, 0.65167626994723, 0.0658515377372835}, + {-0.0643063527627086, -0.0217044058396818, 0.723813068870285, 0.0819917787365634, 0.273311911925214, 0.00689399907032842}, + {-0.0191125161665051, -0.0191125161665051, -0.036640207614552, 0.0764500646660207, 0.0764500646660208, 0.921965110615521}, + {-0.0794020521078099, -0.07940205210781, -0.119594790557632, 0.31760820843124, 0.31760820843124, 0.643182477910772}, + {-0.123076437918076, -0.123076437918076, -0.0543309414249183, 0.492305751672304, 0.492305751672304, 0.315872313916462}, + {-0.105896858921167, -0.105896858921167, 0.271876837668966, 0.42358743568467, 0.42358743568467, 0.092742008804029}, + {-0.0444129613327221, -0.0444129613327221, 0.723813068870285, 0.177651845330889, 0.177651845330889, 0.00970916313338224}, + {-0.123384449130048, 0.352482461135478, -0.036640207614552, 0.117616078244268, 0.0352840510877737, 0.65464206627708}, + {-0.116568374669637, 0.144254514044104, -0.119594790557632, 0.488630481309112, 0.146585935553368, 0.456692234320686}, + {-0.0960538647466011, -0.0585120870225411, -0.0543309414249183, 0.75739729013635, 0.227214213208259, 0.224285389849452}, + {-0.0603987775714151, -0.124504469204174, 0.271876837668966, 0.651676269947229, 0.19549860142211, 0.0658515377372836}, + {-0.0217044058396817, -0.0643063527627086, 0.723813068870285, 0.273311911925214, 0.0819917787365632, 0.00689399907032842}, + {-0.0409849230988146, 0.759842524889054, -0.036640207614552, 0.145727572487076, 0.00717255684496521, 0.164882476492272}, + {-0.034790535089082, 0.404143384962011, -0.119594790557632, 0.605418365816316, 0.0297980510461639, 0.115025523822223}, + {-0.0249744559383748, 0.03820389372017, -0.0543309414249183, 0.938423301877431, 0.0461882014671775, 0.0564900002985144}, + {-0.0138776265525463, -0.121759885907613, 0.271876837668966, 0.807433832894958, 0.0397410384743822, 0.0165858034218536}, + {-0.00457955736373805, -0.0762735703276686, 0.723813068870285, 0.338636367163553, 0.0166673234982244, 0.00173636815934486}}; + + static const double FE1_D01[25][14] = \ + {{-4.92348092472479, -0.489501772856739, 0.179203488876249, 0.100666813761961, 0.134603486992305, 8.63375492668695, -5.79126584504057, 2.57049361593515, -2.43064495934601, 0.933695301413292, -0.179203488876251, 3.14676539989352, -1.03436211517524, -0.850723927539827}, + {-1.22072339702365, 0.353412468851741, 0.157627099145873, -0.0746718571074941, -0.0873088916887541, -1.74300688822412, 4.51684211570302, -1.90652429930699, -1.17372701640678, 0.653887982994551, -0.157627099145872, 0.673966720836549, -0.579216125887057, 0.587069187258981}, + {0.358599061347387, -0.199260154242238, 0.11915032151674, -0.236201006974522, 0.0489368169731712, -3.17391758456232, 1.80243660692675, 1.21214207053042, -0.205074293683275, 0.309924093033935, -0.119150321516738, -0.697548150238492, -0.0737230860594163, 0.853685626948599}, + {-0.256528017544188, 0.335981245709448, 0.0697846126615126, -0.245883039206206, 0.324765406089899, 1.6058038662832, -5.69992944155756, 4.01467234710911, 0.0351330450820346, 0.0712264684545085, -0.0697846126615112, -0.398938571740192, 0.174656570751691, 0.0390401205682623}, + {0.0106140386976448, 4.47094346923701, 0.023972721189482, -0.112725965267303, 0.238775264288607, -0.15332389817035, 0.879973096214445, -5.20820670597875, -0.00208846471084578, -0.00451319159940933, -0.0239727211894847, 0.0244881945022275, 0.117239156866706, -0.261174994079983}, + {-0.839131599831696, -0.48950177285674, 0.0748108288829812, 0.0686708574696078, 0.662156663835007, 2.56379098442514, -3.27809805082916, 2.04294043909245, -6.18031729659934, 0.494625653780274, -0.0748108288829797, 8.85005639822322, -0.563296511249881, -3.33189576545889}, + {0.202323839685595, 0.353412468851741, 0.161465637815132, -0.112302905481113, -0.429499753205215, -1.75503086478979, 2.76362799404298, -1.56433343779053, -2.69567005199158, 0.756622320539373, -0.161465637815132, 0.747255447904154, -0.644319415058259, 2.37791435729265}, + {0.183058222345733, -0.199260154242238, 0.246520964624723, -0.625066207389066, 0.240735512799229, -0.923343083643203, -0.080798359164653, 1.02034337470436, -0.206029746712401, 0.613791028172696, -0.246520964624722, -3.16049155954138, 0.0112751792163715, 3.12578579345455}, + {-0.350190108838501, 0.335981245709448, 0.231575301617104, -0.922258421214661, 1.59762263690684, 1.87432390421406, -4.60193015737717, 2.74181511629217, 0.1851747050734, 0.176637588713045, -0.231575301617103, -1.40021356037656, 0.745620832501613, -0.38258378160367}, + {0.145502825089315, 4.47094346923701, 0.105228292166946, -0.513593117920688, 1.17461022697504, -0.858753730257821, 2.38634910459668, -6.14404166866518, -0.0276892592294179, -0.0325456124950437, -0.105228292166949, 0.219762882063215, 0.546138730415726, -1.36668384980883}, + {0.300790618534486, -0.48950177285674, -0.0938175098322176, -1.20457509757173, 1.43469692987617, -0.25744128910517, -0.824247729623862, 1.27040017305129, -1.97325425970202, -5.02098794019842, 0.0938175098322148, 5.0510574614487, 6.22556303777016, -4.51250013162285}, + {0.0858949745717573, 0.353412468851741, -0.255769112851834, 0.565857929720685, -0.9305984685516, -0.305589684505477, 0.92951696352612, -1.06323472244414, -0.100890713389922, -2.13896290361542, 0.255769112851833, -2.50237537066618, 1.57310497389473, 3.5338645526077}, + {-0.277867342742944, -0.199260154242238, -0.0814276204367423, 0.349126846459827, 0.521602394099412, 1.03258701566852, -1.29493601208752, 0.739476493404178, 0.714772028659139, -0.174033767171633, 0.0814276204367425, -4.60210481528708, -0.175093079288193, 3.36573039252853}, + {-0.270988583314474, 0.335981245709448, 0.22078989418089, -1.08663594700873, 3.46157400122766, 1.2250859535242, -2.16794236789051, 0.877863751971334, 0.219884789139037, 0.0519405716871661, -0.22078989418089, -1.02926474507045, 1.03469537532157, -2.65219404529625}, + {0.388816964556487, 4.47094346923701, 0.190189287582516, -0.982902206430993, 2.54503167978712, -2.05527310001484, 4.70997578769861, -7.51446312147727, -0.122720710220877, -0.0958673055551886, -0.19018928758252, 0.798690474834211, 1.07876951198618, -3.22100144440045}, + {-0.3573245679932, -0.489501772856741, 3.67417591105398, -3.93531150769328, 2.20723719591734, 0.176854297338599, 0.172112136501218, 0.497859907010124, 1.89326182738164, -4.4613954198682, -3.67417591105398, -1.32237543567259, 8.39670692756148, -2.77812358762638}, + {-0.340773582195419, 0.353412468851741, 1.12915777685523, 2.11546133033649, -1.43169718389799, 0.582648622018157, -0.033151501576722, -0.562136007097758, 1.31220636814439, -1.74046453867549, -1.12915777685523, -2.82743880134114, -0.374996791661011, 2.94692961709474}, + {-0.187879798307207, -0.199260154242237, -0.227593922486541, 3.15784151189363, 0.802469275399596, 0.603082393870928, -0.674552053425481, 0.458609612103994, 0.351965301970183, -0.0473808869682165, 0.227593922486542, -1.09106634580247, -3.11046062492541, -0.063368231567311}, + {0.191532755133864, 0.335981245709449, 0.0418084423543278, -0.269250078420215, 5.32552536554849, -0.789235204472549, 1.24780881597873, -0.986087612349495, -0.343848708253603, -0.0258287211950972, -0.0418084423543293, 1.90365444045913, 0.295078799615313, -6.88533109775401}, + {0.690818483697246, 4.47094346923701, 0.238984215828931, -1.3123152230897, 3.9154531325992, -3.45037592129704, 7.17349854265214, -8.88488457428935, -0.298960853390353, -0.172833753280059, -0.238984215828935, 1.73861890348643, 1.48514897636976, -5.35511118269528}, + {0.432860334906831, -0.489501772856743, 10.7820243913322, -6.63755958969328, 2.73479037276005, 0.0713069027774886, 0.0150278050049932, -0.0296932698325705, -2.4803228061571, 6.22985279104878, -10.7820243913322, -0.335676392472756, 0.40770679864449, 0.081208825869822}, + {0.513886950347987, 0.353412468851742, 4.43471670367803, 3.6743905576189, -1.77388804541445, -0.457548926037692, -0.189805347580739, -0.219945145581301, -2.37468364726229, 4.39732387101058, -4.43471670367803, 2.60391745686038, -8.07171442862948, 1.54465423581636}, + {0.645901171050298, -0.199260154242236, 0.232818028669783, 6.1299830446049, 0.994267971225654, -1.51667164669493, 0.803219713608937, 0.266810916277931, -2.0006750758256, 1.93189047262638, -0.232818028669786, 5.51968863591294, -8.06187351723128, -4.51328153131299}, + {0.800146649057353, 0.33598124570945, -0.104550979384442, 0.853052384530374, 6.59838259636543, -3.02166899671853, 4.14448594511816, -2.25894484316643, -1.29020890800348, 0.165558162892518, 0.10455097938444, 5.59613700148209, -1.01861054742289, -10.904310689844}, + {0.933227768613883, 4.47094346923701, 0.253980335569297, -1.45688033140528, 4.85128809528563, -4.51962829624728, 8.93617659537217, -9.82071953697578, -0.473343193721761, -0.225864578124923, -0.253980335569301, 2.59527922553586, 1.6827449095302, -6.97322412709974}}; + + // Array of non-zero columns + static const unsigned int nzc0[14] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + static const double FE1_D10[25][14] = \ + {{-4.92348092472479, -0.432860334906833, 0.107896586098764, 0.0856390087569554, 0.164296756824886, -2.14826946464529, 0.846293744652697, -0.164296756824886, 8.35137943198624, -5.29615748963549, 2.30111931728087, 2.73905860124902, -0.698685722702495, -0.931932753409652}, + {-1.22072339702365, -0.513886950347988, 0.61517602518356, 0.115133490473251, 0.132636253892541, -6.17772359190216, 0.842451558084123, -0.132636253892543, 3.26098968727126, -3.74343588801603, 2.21705654811641, 8.74568114946603, -3.18313358274743, -0.957585048557372}, + {0.358599061347386, -0.645901171050299, 1.63582196821167, -1.03942072058345, -0.217874099304767, -3.4067356132321, -4.32754643767815, 0.217874099304766, 0.0277437349865084, -1.62196637959246, 1.88152475430886, 7.3643253669928, -5.59341172197236, 5.3669671582616}, + {-0.256528017544188, -0.800146649057355, 3.09145360938005, -4.39036898432437, 2.58371024925633, 1.71035484566764, -6.55298182608794, -2.58371024925633, -0.0694179343024073, -0.0943316944380133, 1.22042429534196, 0.619671975682703, -5.42148043073039, 10.9433508104123}, + {0.0106140386976428, -0.93322776861388, 4.54360101743677, -9.04890256063947, 10.0594948012644, -0.407304233739641, 2.33685342761973, -10.0594948012644, 0.251891870858455, 0.221351386525507, 0.449370472532274, -1.65825671502798, -2.47804006866914, 6.71204913301973}, + {-0.839131599831697, 0.357324567993201, -0.102043468455618, -0.103441279031611, 0.164296756824885, -1.11038492662884, 0.657213456864125, -0.164296756824885, -2.50614138554535, 4.95602107364847, -1.96807265626462, 0.453349470661745, 0.759078924422711, -0.553772177832514}, + {0.202323839685595, 0.340773582195419, -0.421182984203023, -0.0791514039043915, 0.132636253892542, -2.88418864164502, 0.648166663706482, -0.132636253892543, -1.56651227513635, 2.49708685921486, -1.47367200595952, 1.12225223956517, 2.18311938628288, -0.56901525980209}, + {0.183058222345733, 0.187879798307206, -0.356561429246204, 0.0494858460364144, -0.217874099304766, -0.695749161156662, -3.23863987105828, 0.217874099304766, -0.433623669198942, 0.661171915140911, -0.598486266594907, -0.0500309346159661, 1.10234152501883, 3.18915402502186}, + {-0.350190108838501, -0.191532755133865, 1.02081050608965, -2.17006723719339, 2.58371024925633, 1.83251546185973, -4.33268007895696, -2.58371024925633, 0.22698314742773, 0.202466309908141, 0.112273406636495, -1.69529235999188, -1.15803360795751, 6.50274731615034}, + {0.145502825089312, -0.690818483697242, 3.55560421346399, -7.68709166057282, 10.0594948012644, -1.09773794608675, 3.69866432768638, -10.0594948012644, 0.211294956599518, 0.140288140785009, 0.193732561223402, -1.26538609430655, -1.19248017307069, 3.98842733288643}, + {0.300790618534486, -0.300790618534487, 0.163623779272956, -0.380327367947866, 0.164296756824884, -0.163623779272954, 0.38032736794787, -0.164296756824884, -2.06707176953424, 0.0, 2.06707176953424, -1.17450557632146, 1.17450557632145, 0.0}, + {0.085894974571757, -0.0858949745717575, 0.0498205716536449, -0.363659033805437, 0.132636253892543, -0.0498205716536459, 0.363659033805436, -0.132636253892543, -0.356659826241754, 0.0, 0.356659826241756, -4.07548034456091, 4.07548034456091, 0.0}, + {-0.277867342742944, 0.277867342742944, -1.11401463610527, 1.64406285854735, -0.217874099304766, 1.11401463610526, -1.64406285854735, 0.217874099304766, 0.633344408222398, 0.0, -0.633344408222397, -4.42701173599888, 4.42701173599888, 0.0}, + {-0.270988583314474, 0.270988583314474, -1.00429605934332, 1.08130642088178, 2.58371024925633, 1.00429605934331, -1.08130642088178, -2.58371024925633, 0.440674683319929, 0.0, -0.44067468331993, -2.06396012039201, 2.06396012039201, 0.0}, + {0.388816964556484, -0.388816964556484, 2.24546238759736, -5.6928779941296, 10.0594948012644, -2.24546238759735, 5.6928779941296, -10.0594948012644, 0.0674685773616459, 0.0, -0.0674685773616422, -0.280079037151977, 0.280079037151975, -1.6970983117735e-14}, + {-0.357324567993201, 0.839131599831695, 1.11038492662884, -0.657213456864119, 0.164296756824883, 0.102043468455623, 0.103441279031613, -0.164296756824883, 1.96807265626462, -4.95602107364847, 2.50614138554536, -0.759078924422717, -0.453349470661745, 0.553772177832506}, + {-0.340773582195419, -0.202323839685595, 2.88418864164502, -0.648166663706484, 0.132636253892543, 0.421182984203023, 0.0791514039043915, -0.132636253892543, 1.47367200595952, -2.49708685921486, 1.56651227513635, -2.18311938628288, -1.12225223956516, 0.569015259802091}, + {-0.187879798307206, -0.183058222345732, 0.695749161156661, 3.23863987105828, -0.217874099304765, 0.356561429246203, -0.0494858460364157, 0.217874099304765, 0.598486266594908, -0.661171915140912, 0.433623669198941, -1.10234152501884, 0.0500309346159713, -3.18915402502186}, + {0.191532755133864, 0.3501901088385, -1.83251546185973, 4.33268007895695, 2.58371024925633, -1.02081050608966, 2.17006723719339, -2.58371024925633, -0.112273406636495, -0.202466309908141, -0.22698314742773, 1.15803360795751, 1.69529235999188, -6.50274731615035}, + {0.690818483697243, -0.145502825089313, 1.09773794608676, -3.69866432768638, 10.0594948012644, -3.55560421346399, 7.68709166057283, -10.0594948012644, -0.1937325612234, -0.140288140785019, -0.211294956599513, 1.1924801730707, 1.26538609430654, -3.98842733288646}, + {0.432860334906832, 4.92348092472478, 2.14826946464528, -0.846293744652684, 0.164296756824883, -0.10789658609876, -0.0856390087569605, -0.164296756824883, -2.30111931728086, 5.29615748963548, -8.35137943198624, 0.6986857227025, -2.73905860124902, 0.931932753409644}, + {0.513886950347989, 1.22072339702365, 6.17772359190216, -0.84245155808413, 0.132636253892544, -0.615176025183567, -0.115133490473247, -0.132636253892544, -2.21705654811641, 3.74343588801603, -3.26098968727125, 3.18313358274743, -8.74568114946602, 0.957585048557374}, + {0.645901171050299, -0.358599061347386, 3.40673561323211, 4.32754643767814, -0.217874099304764, -1.63582196821167, 1.03942072058346, 0.217874099304764, -1.88152475430886, 1.62196637959245, -0.0277437349865067, 5.59341172197235, -7.36432536699278, -5.3669671582616}, + {0.800146649057353, 0.256528017544187, -1.71035484566764, 6.55298182608793, 2.58371024925633, -3.09145360938005, 4.39036898432437, -2.58371024925633, -1.22042429534196, 0.0943316944380134, 0.0694179343024074, 5.42148043073038, -0.619671975682697, -10.9433508104123}, + {0.93322776861388, -0.0106140386976432, 0.407304233739652, -2.33685342761973, 10.0594948012644, -4.54360101743676, 9.04890256063948, -10.0594948012644, -0.449370472532272, -0.221351386525517, -0.25189187085845, 2.47804006866915, 1.65825671502797, -6.71204913301977}}; + + // Array of non-zero columns + static const unsigned int nzc1[14] = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 225; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 59250 + for (unsigned int ip = 0; ip < 25; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 12 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE0[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W25[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W25[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W25[ip]; + + + // Number of operations for primary indices: 2352 + for (unsigned int j = 0; j < 14; j++) + { + for (unsigned int k = 0; k < 14; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p2_q4_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p2_q4_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q4_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q4_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q4_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q4_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q4_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q4_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q4_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p2_q4_tensor.h b/laplacian_2d/laplacian_f1_p2_q4_tensor.h new file mode 100644 index 0000000..9495de1 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p2_q4_tensor.h @@ -0,0 +1,7368 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P2_Q4_TENSOR_H +#define __LAPLACIAN_F1_P2_Q4_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q4_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q4_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q4_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p2_q4_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p2_q4_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p2_q4_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q4_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q4_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q4_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p2_q4_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p2_q4_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p2_q4_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p2_q4_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p2_q4_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 60 + // Number of operations (multiply-add pairs) for tensor contraction: 3004 + // Total number of operations (multiply-add pairs): 3075 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + const double G0_3_0_0 = det*(w[0][3]*((K_00*K_00 + K_01*K_01))); + const double G0_3_0_1 = det*(w[0][3]*((K_00*K_10 + K_01*K_11))); + const double G0_3_1_0 = det*(w[0][3]*((K_10*K_00 + K_11*K_01))); + const double G0_3_1_1 = det*(w[0][3]*((K_10*K_10 + K_11*K_11))); + const double G0_4_0_0 = det*(w[0][4]*((K_00*K_00 + K_01*K_01))); + const double G0_4_0_1 = det*(w[0][4]*((K_00*K_10 + K_01*K_11))); + const double G0_4_1_0 = det*(w[0][4]*((K_10*K_00 + K_11*K_01))); + const double G0_4_1_1 = det*(w[0][4]*((K_10*K_10 + K_11*K_11))); + const double G0_5_0_0 = det*(w[0][5]*((K_00*K_00 + K_01*K_01))); + const double G0_5_0_1 = det*(w[0][5]*((K_00*K_10 + K_01*K_11))); + const double G0_5_1_0 = det*(w[0][5]*((K_10*K_00 + K_11*K_01))); + const double G0_5_1_1 = det*(w[0][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[108] = 0.0101587301587301*G0_0_0_0 + 0.00620811287477962*G0_0_0_1 + 0.0304761904761901*G0_0_1_0 - 0.000564373897707235*G0_0_1_1 + 0.00338624338624338*G0_1_0_0 - 0.00564373897707311*G0_1_0_1 - 0.00169312169312171*G0_1_1_0 + 0.0169312169312164*G0_2_0_0 + 0.00677248677248637*G0_2_0_1 + 0.00338624338624324*G0_2_1_0 + 0.000564373897706956*G0_2_1_1 + 0.00677248677248746*G0_3_0_0 - 0.00902998236331574*G0_3_0_1 - 0.0135449735449731*G0_3_1_0 - 0.00677248677248687*G0_3_1_1 - 0.209947089947089*G0_4_0_0 - 0.0383774250440917*G0_4_0_1 - 0.060952380952381*G0_4_1_0 + 0.0203174603174603*G0_5_0_0 - 0.00225749559082931*G0_5_0_1 + 0.00677248677248635*G0_5_1_1; + A[181] = -0.0454320987654318*G0_0_0_0 + 0.018906525573192*G0_0_1_0 + 0.0634920634920635*G0_1_0_0 + 0.01015873015873*G0_2_0_0 - 0.000846560846560894*G0_2_1_0 + 0.0191887125220458*G0_3_0_0 + 0.00564373897707234*G0_3_1_0 - 0.141093474426807*G0_4_0_0 - 0.0180599647266313*G0_4_1_0 + 0.00902998236331586*G0_5_0_0 - 0.00564373897707221*G0_5_1_0; + A[176] = 0.0541798941798941*G0_0_0_0 - 0.0225749559082892*G0_0_0_1 - 0.0225749559082892*G0_0_1_0 - 0.112874779541445*G0_0_1_1 + 0.722398589065253*G0_1_0_0 + 0.812698412698409*G0_1_0_1 + 0.812698412698409*G0_1_1_0 + 1.28677248677248*G0_1_1_1 - 0.10384479717813*G0_2_0_0 - 0.0564373897707228*G0_2_0_1 - 0.0564373897707228*G0_2_1_0 - 0.112874779541446*G0_2_1_1 + 0.361199294532626*G0_3_0_0 + 0.270899470899469*G0_3_0_1 + 0.270899470899469*G0_3_1_0 + 0.49664902998236*G0_3_1_1 + 0.252839506172838*G0_4_0_0 + 0.0451499118165783*G0_4_1_1 + 0.54179894179894*G0_5_0_0 + 0.0451499118165784*G0_5_0_1 + 0.0451499118165783*G0_5_1_0 + 0.496649029982361*G0_5_1_1; + A[21] = 0.0272310405643737*G0_0_0_0 - 0.0193298059964728*G0_0_0_1 - 0.00776014109347432*G0_1_0_0 - 0.00366843033509697*G0_2_0_0 + 0.000141093474426862*G0_2_0_1 - 0.00790123456790119*G0_3_0_0 - 0.00395061728395056*G0_3_0_1 + 0.0462786596119925*G0_4_0_0 + 0.0191887125220456*G0_4_0_1 - 0.0118518518518517*G0_5_0_0 + 0.00395061728395055*G0_5_0_1; + A[52] = A[108] + 0.0242680776014105*G0_0_0_1 - 0.0242680776014105*G0_0_1_0 + 0.0039506172839514*G0_1_0_1 - 0.0039506172839514*G0_1_1_0 - 0.00338624338624314*G0_2_0_1 + 0.00338624338624313*G0_2_1_0 - 0.00451499118165733*G0_3_0_1 + 0.00451499118165732*G0_3_1_0 - 0.0225749559082894*G0_4_0_1 + 0.0225749559082894*G0_4_1_0 + 0.00225749559082916*G0_5_0_1 - 0.00225749559082916*G0_5_1_0; + A[35] = -0.0373897707231038*G0_0_1_0 - 0.00634920634920624*G0_0_1_1 - 0.0373897707231038*G0_1_1_0 - 0.0437389770723103*G0_1_1_1 + 0.529100529100526*G0_2_1_0 + 0.162962962962962*G0_2_1_1 + 0.158024691358024*G0_3_1_0 + 0.0507936507936504*G0_3_1_1 + 0.158024691358024*G0_4_1_0 + 0.0253968253968252*G0_4_1_1 + 0.0084656084656086*G0_5_1_0 - 0.0620811287477951*G0_5_1_1; + A[26] = -0.00634920634920638*G0_0_0_0 + 0.0373897707231038*G0_0_0_1 - 0.366137566137565*G0_1_0_0 - 0.529100529100526*G0_1_0_1 + 0.0310405643738976*G0_2_0_0 + 0.0373897707231038*G0_2_0_1 - 0.132627865961199*G0_3_0_0 - 0.158024691358024*G0_3_0_1 - 0.0705467372134035*G0_4_0_0 - 0.00846560846560843*G0_4_0_1 - 0.107231040564374*G0_5_0_0 - 0.158024691358024*G0_5_0_1; + A[135] = A[26] - 0.359788359788358*G0_0_0_0 - 0.403527336860669*G0_0_0_1 + 0.162962962962962*G0_0_1_0 + 0.162962962962962*G0_0_1_1 + 0.359788359788358*G0_1_0_0 + 0.52275132275132*G0_1_0_1 - 0.0437389770723101*G0_1_1_0 - 0.04373897707231*G0_1_1_1 - 0.00634920634920624*G0_2_0_1 - 0.0063492063492063*G0_2_1_0 - 0.00634920634920632*G0_2_1_1 + 0.0620811287477952*G0_3_0_0 + 0.0874779541446203*G0_3_0_1 - 0.062081128747795*G0_3_1_0 - 0.062081128747795*G0_3_1_1 - 0.0620811287477952*G0_4_0_0 - 0.12416225749559*G0_4_0_1 + 0.0253968253968252*G0_4_1_0 + 0.0253968253968252*G0_4_1_1 + 0.0507936507936503*G0_5_0_1 + 0.0507936507936504*G0_5_1_0 + 0.0507936507936505*G0_5_1_1; + A[157] = -A[181] - 0.0610934744268077*G0_0_0_0 + 0.0393650793650798*G0_0_0_1 + 0.0455731922398586*G0_0_1_0 - 0.015661375661375*G0_0_1_1 + 0.0452910052910053*G0_1_0_0 + 0.00296296296296273*G0_1_0_1 - 0.00507936507936501*G0_1_1_0 - 0.0101587301587303*G0_1_1_1 + 0.00296296296296246*G0_2_0_1 - 0.00592592592592607*G0_2_1_0 - 0.0182010582010584*G0_2_1_1 + 0.0276543209876542*G0_3_0_0 + 0.0355555555555555*G0_3_0_1 + 0.00225749559082905*G0_3_1_0 + 0.00846560846560853*G0_3_1_1 - 0.0953791887125217*G0_4_0_0 - 0.113439153439152*G0_4_0_1 - 0.0976366843033514*G0_4_1_0 + 0.0406349206349206*G0_4_1_1 + 0.0496649029982364*G0_5_0_0 - 0.113439153439152*G0_5_0_1 - 0.0852204585537912*G0_5_1_0 + 0.045714285714286*G0_5_1_1; + A[211] = A[181] + 0.0564373897707228*G0_0_0_0 - 0.0180599647266311*G0_0_1_0 - 0.0744973544973539*G0_2_0_0 - 0.0180599647266312*G0_2_1_0 - 0.00451499118165773*G0_3_0_0 + 0.0180599647266311*G0_4_0_0 + 0.0361199294532626*G0_4_1_0 + 0.00451499118165759*G0_5_0_0; + A[16] = -0.0109347442680775*G0_0_0_0 + 0.226455026455025*G0_1_0_0 - 0.0109347442680776*G0_2_0_0 + 0.070723104056437*G0_3_0_0 + 0.0269841269841268*G0_4_0_0 + 0.070723104056437*G0_5_0_0; + A[36] = -0.00606701940035273*G0_0_1_0 - 0.0526278659611991*G0_0_1_1 + 0.0136860670194002*G0_1_1_0 + 0.017495590828924*G0_1_1_1 - 0.108641975308641*G0_2_1_0 - 0.100881834215167*G0_2_1_1 - 0.0507936507936505*G0_3_1_0 - 0.0468430335097*G0_3_1_1 - 0.0395061728395057*G0_4_1_0 - 0.0237037037037035*G0_4_1_1 - 0.0118518518518519*G0_5_1_0 - 0.0389417989417988*G0_5_1_1; + A[122] = 0.0373897707231037*G0_0_0_1 - 0.0063492063492064*G0_0_1_1 + 0.0373897707231038*G0_1_0_1 + 0.0310405643738975*G0_1_1_1 - 0.529100529100526*G0_2_0_1 - 0.366137566137564*G0_2_1_1 - 0.158024691358024*G0_3_0_1 - 0.132627865961199*G0_3_1_1 - 0.158024691358024*G0_4_0_1 - 0.107231040564373*G0_4_1_1 - 0.0084656084656086*G0_5_0_1 - 0.0705467372134037*G0_5_1_1; + A[212] = -0.0126984126984125*G0_0_0_1 + 0.0245502645502645*G0_0_1_1 + 0.0126984126984127*G0_1_0_1 + 0.0372486772486771*G0_1_1_1 - 0.218694885361551*G0_2_1_1 - 0.0395061728395064*G0_3_0_1 - 0.0620811287477953*G0_3_1_1 + 0.0395061728395055*G0_4_0_1 - 0.0225749559082892*G0_4_1_1 + 0.156895943562609*G0_5_1_1; + A[1] = 0.0206349206349206*G0_0_0_0 + 0.0206349206349206*G0_0_1_0 + 0.0206349206349206*G0_1_0_0 + 0.0206349206349205*G0_1_1_0 - 0.00416225749559083*G0_2_0_0 - 0.00416225749559083*G0_2_1_0 + 0.00927689594356255*G0_3_0_0 + 0.00927689594356254*G0_3_1_0 + 0.00927689594356256*G0_4_0_0 + 0.00927689594356255*G0_4_1_0 + 0.000952380952380999*G0_5_0_0 + 0.000952380952380999*G0_5_1_0; + A[27] = A[181] + 0.0189065255731921*G0_0_0_1 - 0.0189065255731921*G0_0_1_0 - 0.000846560846560887*G0_2_0_1 + 0.000846560846560887*G0_2_1_0 + 0.00564373897707235*G0_3_0_1 - 0.00564373897707235*G0_3_1_0 - 0.0180599647266313*G0_4_0_1 + 0.0180599647266313*G0_4_1_0 - 0.00564373897707217*G0_5_0_1 + 0.00564373897707217*G0_5_1_0; + A[46] = -0.00634920634920625*G0_0_0_0 - 0.0373897707231038*G0_0_1_0 + 0.162962962962962*G0_1_0_0 + 0.529100529100526*G0_1_1_0 - 0.0437389770723101*G0_2_0_0 - 0.0373897707231038*G0_2_1_0 + 0.0507936507936504*G0_3_0_0 + 0.158024691358024*G0_3_1_0 - 0.062081128747795*G0_4_0_0 + 0.00846560846560842*G0_4_1_0 + 0.025396825396825*G0_5_0_0 + 0.158024691358024*G0_5_1_0; + A[144] = A[176] + 0.668218694885359*G0_0_0_0 - 0.0677248677248673*G0_0_0_1 - 0.0677248677248674*G0_0_1_0 + 0.49664902998236*G0_0_1_1 - 0.668218694885359*G0_1_0_0 - 0.735943562610226*G0_1_0_1 - 0.735943562610226*G0_1_1_0 - 1.30031746031745*G0_1_1_1 + 0.00902998236331559*G0_2_0_1 + 0.00902998236331559*G0_2_1_0 + 0.00902998236331559*G0_2_1_1 - 0.108359788359788*G0_3_0_0 - 0.0180599647266311*G0_3_0_1 - 0.0180599647266311*G0_3_1_0 - 0.198659611992944*G0_3_1_1 + 0.108359788359788*G0_4_0_0 + 0.0902998236331567*G0_4_0_1 + 0.0902998236331567*G0_4_1_0 + 0.27089947089947*G0_4_1_1 + 0.451499118165782*G0_5_0_1 + 0.451499118165782*G0_5_1_0 + 0.451499118165783*G0_5_1_1; + A[89] = -0.0677248677248673*G0_0_0_0 + 0.0541798941798938*G0_0_0_1 + 0.0270899470899468*G0_0_1_0 + 0.0948148148148143*G0_0_1_1 + 0.0677248677248676*G0_1_0_0 + 0.121904761904761*G0_1_0_1 + 0.162539682539682*G0_1_1_0 + 0.108359788359788*G0_1_1_1 - 0.586948853615517*G0_2_0_1 - 0.338624338624338*G0_2_1_0 - 0.474074074074072*G0_2_1_1 - 0.361199294532627*G0_3_0_0 - 0.586948853615518*G0_3_0_1 - 1.08359788359788*G0_3_1_0 - 1.30031746031745*G0_3_1_1 + 0.361199294532626*G0_4_0_0 - 0.225749559082891*G0_4_0_1 - 0.325079365079364*G0_4_1_1 - 0.0632098765432094*G0_5_0_1 - 0.0541798941798945*G0_5_1_0 - 0.541798941798939*G0_5_1_1; + A[195] = A[181] + 0.108924162257495*G0_0_0_0 + 0.0634920634920633*G0_0_0_1 + 0.0445855379188707*G0_0_1_0 + 0.0634920634920627*G0_0_1_1 - 0.108924162257495*G0_1_0_0 - 0.0454320987654317*G0_1_0_1 - 0.0643386243386241*G0_1_1_0 - 0.0643386243386238*G0_1_1_1 + 0.01015873015873*G0_2_0_1 + 0.0118518518518518*G0_2_1_0 + 0.0110052910052909*G0_2_1_1 - 0.160282186948853*G0_3_0_0 - 0.141093474426806*G0_3_0_1 - 0.128677248677248*G0_3_1_0 - 0.123033509700175*G0_3_1_1 + 0.160282186948852*G0_4_0_0 + 0.0191887125220457*G0_4_0_1 + 0.0316049382716047*G0_4_1_0 + 0.0135449735449735*G0_4_1_1 + 0.00902998236331586*G0_5_0_1 + 0.0203174603174601*G0_5_1_0 + 0.0146737213403882*G0_5_1_1; + A[14] = A[195] + 0.0564373897707227*G0_1_0_0 + 0.0555908289241617*G0_1_0_1 + 0.0753439153439148*G0_1_1_0 + 0.0744973544973537*G0_1_1_1 - 0.074497354497354*G0_2_0_0 - 0.0555908289241618*G0_2_0_1 - 0.075343915343915*G0_2_1_0 - 0.0564373897707228*G0_2_1_1 + 0.0180599647266313*G0_3_0_0 - 0.0180599647266315*G0_3_1_1 - 0.00451499118165746*G0_4_0_0 - 0.0101587301587298*G0_4_0_1 + 0.00112874779541472*G0_4_1_0 - 0.00451499118165761*G0_4_1_1 + 0.00451499118165788*G0_5_0_0 + 0.0101587301587301*G0_5_0_1 - 0.00112874779541429*G0_5_1_0 + 0.00451499118165771*G0_5_1_1; + A[56] = -A[176] + 0.056437389770723*G0_0_0_0 + 0.0338624338624334*G0_0_0_1 + 0.440211640211639*G0_1_0_0 + 0.338624338624339*G0_1_0_1 - 0.0677248677248675*G0_2_0_0 + 0.0338624338624337*G0_2_0_1 + 0.225749559082892*G0_3_0_0 - 0.180599647266313*G0_3_0_1 + 0.406349206349204*G0_4_0_0 - 0.0451499118165782*G0_4_0_1 + 0.632098765432096*G0_5_0_0 - 0.180599647266313*G0_5_0_1; + A[125] = A[56] + 0.110617283950617*G0_0_0_0 - 0.110617283950617*G0_0_1_1 + 0.395061728395059*G0_1_0_0 + 0.564373897707227*G0_1_0_1 + 0.869135802469132*G0_1_1_0 + 1.32289241622574*G0_1_1_1 - 1.32289241622574*G0_2_0_0 - 0.564373897707228*G0_2_0_1 - 0.869135802469131*G0_2_1_0 - 0.395061728395059*G0_2_1_1 - 0.361199294532626*G0_3_0_0 + 0.361199294532626*G0_3_1_1 - 0.650158730158726*G0_4_0_0 - 0.180599647266313*G0_4_0_1 - 0.0451499118165774*G0_4_1_0 + 0.135449735449736*G0_4_1_1 - 0.135449735449735*G0_5_0_0 + 0.180599647266313*G0_5_0_1 + 0.0451499118165783*G0_5_1_0 + 0.650158730158726*G0_5_1_1; + A[83] = A[125] - 0.0338624338624339*G0_0_0_1 + 0.0338624338624338*G0_0_1_0 - 0.0338624338624339*G0_1_0_1 + 0.0338624338624339*G0_1_1_0 - 0.338624338624337*G0_2_0_1 + 0.338624338624337*G0_2_1_0 + 0.180599647266313*G0_3_0_1 - 0.180599647266313*G0_3_1_0 + 0.180599647266314*G0_4_0_1 - 0.180599647266314*G0_4_1_0 + 0.0451499118165779*G0_5_0_1 - 0.0451499118165779*G0_5_1_0; + A[80] = -A[125] - 0.0338624338624339*G0_0_1_0 - 0.101587301587301*G0_0_1_1 - 0.0338624338624339*G0_1_1_0 + 0.0225749559082898*G0_1_1_1 - 0.338624338624336*G0_2_1_0 + 0.101587301587302*G0_2_1_1 + 0.180599647266313*G0_3_1_0 + 0.81269841269841*G0_3_1_1 + 0.180599647266314*G0_4_1_0 + 0.406349206349206*G0_4_1_1 + 0.0451499118165779*G0_5_1_0 + 0.451499118165783*G0_5_1_1; + A[31] = 0.00416225749559083*G0_0_1_0 - 0.0206349206349207*G0_1_1_0 - 0.0206349206349205*G0_2_1_0 - 0.000952380952380989*G0_3_1_0 - 0.00927689594356254*G0_4_1_0 - 0.00927689594356261*G0_5_1_0; + A[42] = 0.018906525573192*G0_0_1_0 - 0.045432098765432*G0_0_1_1 - 0.000846560846560914*G0_1_1_0 + 0.0101587301587301*G0_1_1_1 + 0.0634920634920633*G0_2_1_1 + 0.00564373897707269*G0_3_1_0 + 0.0191887125220462*G0_3_1_1 - 0.00564373897707229*G0_4_1_0 + 0.00902998236331582*G0_4_1_1 - 0.0180599647266312*G0_5_1_0 - 0.141093474426807*G0_5_1_1; + A[107] = -0.0135802469135802*G0_0_0_1 + 0.0492768959435624*G0_0_1_1 - 0.0262786596119927*G0_1_0_1 - 0.0334391534391532*G0_1_1_1 + 0.278306878306876*G0_2_0_1 + 0.219929453262785*G0_2_1_1 + 0.108641975308641*G0_3_0_1 + 0.0994708994708989*G0_3_1_1 + 0.0691358024691355*G0_4_0_1 + 0.0592592592592588*G0_4_1_1 + 0.0091710758377426*G0_5_0_1 + 0.0732275132275129*G0_5_1_1; + A[7] = A[107] - 0.0583774250440917*G0_0_0_0 + 0.233509700176366*G0_0_0_1 - 0.0583774250440917*G0_0_1_0 + 0.170652557319223*G0_0_1_1 - 0.00716049382716043*G0_1_0_0 - 0.00716049382716055*G0_1_0_1 - 0.00716049382716044*G0_1_1_0 + 0.0628571428571426*G0_2_0_0 - 0.229029982363314*G0_2_0_1 + 0.0628571428571427*G0_2_1_0 - 0.170652557319223*G0_2_1_1 + 0.0640564373897703*G0_3_0_0 - 0.0354144620811286*G0_3_0_1 + 0.0640564373897704*G0_3_1_0 - 0.026243386243386*G0_3_1_1 - 0.00987654320987657*G0_4_0_0 - 0.00987654320987646*G0_4_0_1 - 0.0098765432098766*G0_4_1_0 - 0.00917107583774248*G0_5_0_0 + 0.0902998236331564*G0_5_0_1 - 0.00917107583774248*G0_5_1_0 + 0.0262433862433861*G0_5_1_1; + A[182] = A[42] + 0.0189065255731921*G0_0_0_1 - 0.018906525573192*G0_0_1_0 - 0.00084656084656092*G0_1_0_1 + 0.000846560846560915*G0_1_1_0 + 0.00564373897707262*G0_3_0_1 - 0.00564373897707261*G0_3_1_0 - 0.00564373897707229*G0_4_0_1 + 0.00564373897707229*G0_4_1_0 - 0.0180599647266312*G0_5_0_1 + 0.0180599647266312*G0_5_1_0; + A[198] = A[89] + 0.162539682539682*G0_0_0_0 - 0.162539682539682*G0_0_1_1 - 0.541798941798939*G0_1_0_0 - 0.708853615520278*G0_1_0_1 - 0.501164021164019*G0_1_1_0 - 0.108359788359788*G0_1_1_1 + 0.10835978835979*G0_2_0_0 + 0.708853615520279*G0_2_0_1 + 0.501164021164019*G0_2_1_0 + 0.541798941798939*G0_2_1_1 - 0.939118165784827*G0_3_0_0 + 0.939118165784828*G0_3_1_1 - 0.902998236331565*G0_4_0_0 + 0.162539682539681*G0_4_0_1 - 0.0541798941798949*G0_4_1_0 + 0.325079365079364*G0_4_1_1 - 0.325079365079364*G0_5_0_0 - 0.162539682539683*G0_5_0_1 + 0.0541798941798935*G0_5_1_0 + 0.902998236331564*G0_5_1_1; + A[32] = -0.0109347442680775*G0_0_1_1 - 0.0109347442680775*G0_1_1_1 + 0.226455026455025*G0_2_1_1 + 0.0707231040564369*G0_3_1_1 + 0.0707231040564369*G0_4_1_1 + 0.0269841269841269*G0_5_1_1; + A[25] = 0.0492768959435624*G0_0_0_0 - 0.0135802469135802*G0_0_0_1 + 0.219929453262786*G0_1_0_0 + 0.278306878306877*G0_1_0_1 - 0.0334391534391533*G0_2_0_0 - 0.0262786596119928*G0_2_0_1 + 0.0994708994708991*G0_3_0_0 + 0.108641975308641*G0_3_0_1 + 0.0732275132275128*G0_4_0_0 + 0.00917107583774246*G0_4_0_1 + 0.0592592592592592*G0_5_0_0 + 0.0691358024691357*G0_5_0_1; + A[61] = -0.00716049382716048*G0_0_0_0 + 0.0262786596119928*G0_0_1_0 - 0.0583774250440911*G0_1_0_0 - 0.278306878306877*G0_1_1_0 + 0.0628571428571424*G0_2_0_0 + 0.0135802469135802*G0_2_1_0 - 0.00987654320987655*G0_3_0_0 - 0.0691358024691356*G0_3_1_0 + 0.0640564373897704*G0_4_0_0 - 0.00917107583774244*G0_4_1_0 - 0.00917107583774229*G0_5_0_0 - 0.108641975308641*G0_5_1_0; + A[106] = -0.00384479717813049*G0_0_0_0 - 0.00532627865961178*G0_0_1_0 - 0.00511463844797213*G0_1_0_0 + 0.0014814814814815*G0_2_0_0 + 0.00532627865961193*G0_2_1_0 - 0.00479717813051157*G0_3_0_0 - 0.000423280423280515*G0_3_1_0 + 0.0589770723104054*G0_4_0_0 - 0.00437389770723118*G0_5_0_0 + 0.000423280423280397*G0_5_1_0; + A[60] = A[106] - 0.00126984126984147*G0_0_0_0 - 0.00511463844797192*G0_0_0_1 + 0.000211640211639635*G0_0_1_0 - 0.0051146384479722*G0_0_1_1 + 0.00126984126984168*G0_1_0_0 - 0.00384479717813044*G0_1_0_1 + 0.00148148148148166*G0_1_1_0 + 0.00148148148148134*G0_1_1_1 + 0.00148148148148123*G0_2_0_1 - 0.00917107583774232*G0_2_1_0 - 0.00384479717813048*G0_2_1_1 + 0.0637742504409166*G0_3_0_0 + 0.0589770723104049*G0_3_0_1 + 0.0594003527336856*G0_3_1_0 + 0.0589770723104049*G0_3_1_1 - 0.0637742504409169*G0_4_0_0 - 0.00479717813051167*G0_4_0_1 - 0.00437389770723134*G0_4_1_0 - 0.0043738977072312*G0_4_1_1 - 0.00437389770723117*G0_5_0_1 - 0.00522045855379201*G0_5_1_0 - 0.00479717813051173*G0_5_1_1; + A[4] = A[60] + 0.00532627865961179*G0_1_0_1 - 0.00532627865961179*G0_1_1_0 - 0.00532627865961172*G0_2_0_1 + 0.00532627865961172*G0_2_1_0 + 0.000423280423280463*G0_4_0_1 - 0.000423280423280467*G0_4_1_0 - 0.000423280423280452*G0_5_0_1 + 0.00042328042328045*G0_5_1_0; + A[15] = 0.0206349206349206*G0_0_0_0 + 0.0206349206349206*G0_0_0_1 + 0.0206349206349206*G0_1_0_0 + 0.0206349206349205*G0_1_0_1 - 0.00416225749559083*G0_2_0_0 - 0.00416225749559083*G0_2_0_1 + 0.00927689594356255*G0_3_0_0 + 0.00927689594356254*G0_3_0_1 + 0.00927689594356256*G0_4_0_0 + 0.00927689594356255*G0_4_0_1 + 0.000952380952380998*G0_5_0_0 + 0.000952380952380997*G0_5_0_1; + A[37] = -0.0135802469135802*G0_0_1_0 + 0.0492768959435624*G0_0_1_1 - 0.0262786596119927*G0_1_1_0 - 0.0334391534391532*G0_1_1_1 + 0.278306878306876*G0_2_1_0 + 0.219929453262785*G0_2_1_1 + 0.108641975308641*G0_3_1_0 + 0.0994708994708989*G0_3_1_1 + 0.0691358024691355*G0_4_1_0 + 0.0592592592592588*G0_4_1_1 + 0.00917107583774259*G0_5_1_0 + 0.0732275132275129*G0_5_1_1; + A[91] = A[21] + 0.0193298059964728*G0_0_0_1 - 0.0193298059964728*G0_0_1_0 - 0.000141093474426905*G0_2_0_1 + 0.000141093474426906*G0_2_1_0 + 0.00395061728395056*G0_3_0_1 - 0.00395061728395056*G0_3_1_0 - 0.0191887125220456*G0_4_0_1 + 0.0191887125220456*G0_4_1_0 - 0.00395061728395053*G0_5_0_1 + 0.00395061728395053*G0_5_1_0; + A[168] = -A[176] + 0.056437389770723*G0_0_0_0 + 0.0338624338624334*G0_0_1_0 + 0.440211640211639*G0_1_0_0 + 0.338624338624339*G0_1_1_0 - 0.0677248677248675*G0_2_0_0 + 0.0338624338624337*G0_2_1_0 + 0.225749559082892*G0_3_0_0 - 0.180599647266313*G0_3_1_0 + 0.406349206349204*G0_4_0_0 - 0.0451499118165782*G0_4_1_0 + 0.632098765432096*G0_5_0_0 - 0.180599647266313*G0_5_1_0; + A[18] = -A[26] - 0.0126984126984126*G0_0_0_0 - 0.203174603174603*G0_1_0_0 - 0.0126984126984126*G0_2_0_0 - 0.0818342151675483*G0_3_0_0 - 0.132627865961198*G0_4_0_0 - 0.0818342151675485*G0_5_0_0; + A[38] = -A[35] - 0.0126984126984126*G0_0_1_1 - 0.0126984126984129*G0_1_1_1 - 0.203174603174602*G0_2_1_1 - 0.0818342151675481*G0_3_1_1 - 0.081834215167548*G0_4_1_1 - 0.132627865961199*G0_5_1_1; + A[116] = -A[108] + 0.0174955908289241*G0_0_0_0 + 0.0276543209876533*G0_0_1_0 + 0.0141093474426811*G0_1_0_0 - 0.0101587301587305*G0_2_0_0 - 0.0276543209876541*G0_2_1_0 + 0.0361199294532634*G0_3_0_0 - 0.00677248677248632*G0_3_1_0 - 0.320564373897705*G0_4_0_0 + 0.0428924162257495*G0_5_0_0 + 0.00677248677248622*G0_5_1_0; + A[139] = A[116] + 0.00338624338624344*G0_0_0_0 + 0.0152380952380958*G0_0_0_1 + 0.00790123456790146*G0_0_1_0 + 0.00282186948853568*G0_0_1_1 - 0.0033862433862438*G0_1_0_0 + 0.00451499118165728*G0_1_0_1 + 0.0118518518518515*G0_1_1_0 + 0.0169312169312162*G0_1_1_1 + 0.0107231040564371*G0_2_0_1 + 0.0107231040564368*G0_2_1_0 + 0.0107231040564373*G0_2_1_1 - 0.139964726631392*G0_3_0_0 - 0.180599647266312*G0_3_0_1 - 0.155767195767195*G0_3_1_0 - 0.216719576719576*G0_3_1_1 + 0.139964726631392*G0_4_0_0 - 0.0158024691358021*G0_4_0_1 - 0.0406349206349202*G0_4_1_0 + 0.0203174603174602*G0_4_1_1 + 0.013544973544973*G0_5_0_1 + 0.0135449735449732*G0_5_1_0 + 0.0135449735449726*G0_5_1_1; + A[29] = A[27] + 0.0564373897707228*G0_0_0_0 - 0.0180599647266311*G0_0_0_1 - 0.0744973544973539*G0_2_0_0 - 0.0180599647266312*G0_2_0_1 - 0.00451499118165773*G0_3_0_0 + 0.0180599647266311*G0_4_0_0 + 0.0361199294532626*G0_4_0_1 + 0.00451499118165759*G0_5_0_0; + A[43] = A[42] - 0.0180599647266311*G0_0_1_0 + 0.056437389770723*G0_0_1_1 - 0.0180599647266311*G0_1_1_0 - 0.0744973544973542*G0_1_1_1 - 0.00451499118165868*G0_3_1_1 + 0.00451499118165742*G0_4_1_1 + 0.0361199294532624*G0_5_1_0 + 0.018059964726631*G0_5_1_1; + A[197] = A[182] - 0.0180599647266311*G0_0_0_1 + 0.056437389770723*G0_0_1_1 - 0.0180599647266311*G0_1_0_1 - 0.0744973544973542*G0_1_1_1 - 0.00451499118165869*G0_3_1_1 + 0.00451499118165742*G0_4_1_1 + 0.0361199294532625*G0_5_0_1 + 0.018059964726631*G0_5_1_1; + A[19] = -A[25] + 0.042116402116402*G0_0_0_0 + 0.0126984126984126*G0_0_0_1 + 0.161552028218695*G0_1_0_0 + 0.0294179894179892*G0_2_0_0 - 0.0126984126984126*G0_2_0_1 + 0.0895943562610225*G0_3_0_0 + 0.0395061728395058*G0_3_0_1 + 0.137283950617283*G0_4_0_0 + 0.0500881834215169*G0_5_0_0 - 0.0395061728395058*G0_5_0_1; + A[33] = -A[36] - 0.019753086419753*G0_0_1_0 - 0.0488183421516752*G0_0_1_1 + 0.019753086419753*G0_1_1_0 - 0.0290652557319226*G0_1_1_1 - 0.0931216931216929*G0_2_1_1 - 0.0112874779541444*G0_3_1_0 - 0.0310405643738977*G0_3_1_1 + 0.0112874779541447*G0_4_1_0 - 0.019753086419753*G0_4_1_1 - 0.0660317460317459*G0_5_1_1; + A[41] = -A[33] - 0.0138271604938271*G0_0_1_0 + 0.0253968253968255*G0_1_1_0 + 0.108641975308641*G0_2_1_0 + 0.0355555555555555*G0_3_1_0 + 0.054744268077601*G0_4_1_0 - 0.00733686067019398*G0_5_1_0; + A[62] = -A[107] + 0.0126984126984125*G0_0_0_1 + 0.0421164021164018*G0_0_1_1 - 0.0126984126984126*G0_1_0_1 + 0.0294179894179896*G0_1_1_1 + 0.161552028218694*G0_2_1_1 + 0.0395061728395062*G0_3_0_1 + 0.0895943562610227*G0_3_1_1 - 0.0395061728395057*G0_4_0_1 + 0.0500881834215165*G0_4_1_1 + 0.137283950617283*G0_5_1_1; + A[44] = A[212] + 0.0126984126984125*G0_0_0_1 - 0.0126984126984125*G0_0_1_0 - 0.0126984126984127*G0_1_0_1 + 0.0126984126984127*G0_1_1_0 + 0.0395061728395064*G0_3_0_1 - 0.0395061728395064*G0_3_1_0 - 0.0395061728395055*G0_4_0_1 + 0.0395061728395055*G0_4_1_0; + A[172] = -A[52] + 0.0174955908289242*G0_0_0_0 + 0.0276543209876533*G0_0_0_1 + 0.0141093474426811*G0_1_0_0 - 0.0101587301587305*G0_2_0_0 - 0.0276543209876541*G0_2_0_1 + 0.0361199294532634*G0_3_0_0 - 0.00677248677248633*G0_3_0_1 - 0.320564373897705*G0_4_0_0 + 0.0428924162257495*G0_5_0_0 + 0.00677248677248621*G0_5_0_1; + A[158] = A[172] - 0.00677248677248673*G0_0_0_0 + 0.00677248677248634*G0_0_1_1 - 0.0112874779541451*G0_1_0_0 - 0.0327336860670195*G0_1_0_1 - 0.0124162257495598*G0_1_1_0 - 0.0270899470899474*G0_1_1_1 + 0.0270899470899475*G0_2_0_0 + 0.0327336860670196*G0_2_0_1 + 0.0124162257495588*G0_2_1_0 + 0.0112874779541446*G0_2_1_1 - 0.0225749559082892*G0_3_0_0 + 0.0225749559082891*G0_3_1_1 + 0.10384479717813*G0_4_0_0 - 0.0541798941798935*G0_4_0_1 - 0.0361199294532627*G0_4_1_0 + 0.0225749559082894*G0_4_1_1 - 0.0225749559082893*G0_5_0_0 + 0.054179894179894*G0_5_0_1 + 0.0361199294532617*G0_5_1_0 - 0.10384479717813*G0_5_1_1; + A[155] = -A[158] + 0.0276543209876539*G0_0_0_1 + 0.0174955908289237*G0_0_1_1 - 0.0276543209876535*G0_1_0_1 - 0.0101587301587295*G0_1_1_1 + 0.0141093474426809*G0_2_1_1 - 0.00677248677248714*G0_3_0_1 + 0.0361199294532626*G0_3_1_1 + 0.00677248677248662*G0_4_0_1 + 0.0428924162257499*G0_4_1_1 - 0.320564373897705*G0_5_1_1; + A[85] = A[155] - 0.024268077601411*G0_0_0_1 + 0.024268077601411*G0_0_1_0 + 0.00338624338624278*G0_1_0_1 - 0.00338624338624275*G0_1_1_0 - 0.00395061728395023*G0_2_0_1 + 0.00395061728395023*G0_2_1_0 + 0.00451499118165839*G0_3_0_1 - 0.00451499118165841*G0_3_1_0 - 0.00225749559082854*G0_4_0_1 + 0.00225749559082854*G0_4_1_0 + 0.0225749559082899*G0_5_0_1 - 0.0225749559082899*G0_5_1_0; + A[130] = -A[85] + 0.0276543209876539*G0_0_1_0 + 0.0174955908289237*G0_0_1_1 - 0.0276543209876535*G0_1_1_0 - 0.0101587301587295*G0_1_1_1 + 0.0141093474426809*G0_2_1_1 - 0.00677248677248716*G0_3_1_0 + 0.0361199294532626*G0_3_1_1 + 0.00677248677248664*G0_4_1_0 + 0.0428924162257499*G0_4_1_1 - 0.320564373897705*G0_5_1_1; + A[100] = A[130] + 0.211075837742503*G0_0_0_0 - 0.0530511463844795*G0_0_0_1 - 0.248324514991181*G0_0_1_0 + 0.0632098765432092*G0_0_1_1 - 0.00790123456790143*G0_1_0_0 - 0.0135449735449737*G0_1_0_1 + 0.00451499118165779*G0_1_1_0 - 0.00677248677248705*G0_2_0_0 + 0.0349911816578485*G0_2_0_1 + 0.0270899470899467*G0_2_1_0 + 0.00902998236331572*G0_2_1_1 - 0.135449735449735*G0_3_0_0 - 0.130934744268077*G0_3_0_1 - 0.121904761904761*G0_3_1_0 - 0.126419753086419*G0_3_1_1 + 0.216719576719575*G0_4_0_0 - 0.130934744268077*G0_4_0_1 - 0.0722398589065261*G0_4_1_1 - 0.176084656084655*G0_5_0_0 - 0.112874779541446*G0_5_0_1 - 0.0677248677248677*G0_5_1_0 + 0.126419753086418*G0_5_1_1; + A[105] = A[7] - 0.278306878306877*G0_0_0_1 + 0.278306878306877*G0_0_1_0 + 0.0262786596119928*G0_1_0_1 - 0.0262786596119928*G0_1_1_0 + 0.0135802469135804*G0_2_0_1 - 0.0135802469135804*G0_2_1_0 - 0.00917107583774245*G0_3_0_1 + 0.00917107583774245*G0_3_1_0 - 0.0691358024691356*G0_4_0_1 + 0.0691358024691356*G0_4_1_0 - 0.108641975308641*G0_5_0_1 + 0.108641975308641*G0_5_1_0; + A[10] = A[105] + 0.278306878306878*G0_0_0_0 - 0.278306878306877*G0_0_1_1 + 0.0564373897707228*G0_1_0_0 + 0.070017636684303*G0_1_0_1 + 0.0827160493827155*G0_1_1_0 + 0.0962962962962957*G0_1_1_1 - 0.0962962962962959*G0_2_0_0 - 0.0700176366843032*G0_2_0_1 - 0.0827160493827156*G0_2_1_0 - 0.0564373897707229*G0_2_1_1 + 0.00917107583774245*G0_3_0_0 - 0.00917107583774276*G0_3_1_1 + 0.109347442680776*G0_4_0_0 + 0.00070546737213417*G0_4_0_1 + 0.04021164021164*G0_4_1_0 - 0.0684303350970016*G0_4_1_1 + 0.0684303350970017*G0_5_0_0 - 0.000705467372133912*G0_5_0_1 - 0.0402116402116399*G0_5_1_0 - 0.109347442680776*G0_5_1_1; + A[150] = A[10] + 0.278306878306877*G0_0_0_1 - 0.278306878306877*G0_0_1_0 - 0.0135802469135803*G0_1_0_1 + 0.0135802469135803*G0_1_1_0 - 0.0262786596119928*G0_2_0_1 + 0.0262786596119928*G0_2_1_0 + 0.00917107583774243*G0_3_0_1 - 0.00917107583774245*G0_3_1_0 + 0.108641975308641*G0_4_0_1 - 0.108641975308641*G0_4_1_0 + 0.0691358024691355*G0_5_0_1 - 0.0691358024691355*G0_5_1_0; + A[173] = -A[181] - 0.043174603174603*G0_0_0_0 - 0.00225749559082862*G0_0_0_1 + 0.0121340388007054*G0_0_1_0 + 0.0022574955908288*G0_0_1_1 + 0.07026455026455*G0_1_0_0 + 0.015802469135802*G0_1_0_1 + 0.0225749559082889*G0_1_1_0 + 0.01015873015873*G0_2_0_0 + 0.0158024691358023*G0_2_0_1 + 0.0217283950617281*G0_2_1_0 + 0.00677248677248671*G0_2_1_1 + 0.0372486772486772*G0_3_0_0 + 0.0327336860670192*G0_3_1_0 + 0.0180599647266313*G0_3_1_1 - 0.159153439153438*G0_4_0_0 + 0.0361199294532627*G0_4_0_1 - 0.00902998236331567*G0_4_1_1 + 0.0361199294532626*G0_5_0_1 + 0.0124162257495588*G0_5_1_0 - 0.0180599647266316*G0_5_1_1; + A[170] = -A[173] - 0.00225749559082854*G0_0_0_1 + 0.0293474426807758*G0_0_1_1 - 0.0970723104056444*G0_1_0_1 - 0.248324514991182*G0_1_1_1 - 0.0112874779541445*G0_2_1_1 - 0.0180599647266315*G0_3_0_1 + 0.0632098765432096*G0_3_1_1 + 0.0180599647266314*G0_4_0_1 - 0.0180599647266313*G0_4_1_1 + 0.099329805996472*G0_5_0_1 - 0.153509700176367*G0_5_1_1; + A[86] = A[170] + 0.00677248677248661*G0_0_0_1 - 0.00677248677248661*G0_0_1_0 + 0.0902998236331576*G0_1_0_1 - 0.0902998236331577*G0_1_1_0 - 0.00677248677248663*G0_2_0_1 + 0.00677248677248663*G0_2_1_0 - 0.0090299823633154*G0_3_0_1 + 0.00902998236331538*G0_3_1_0 - 0.0812698412698404*G0_5_0_1 + 0.0812698412698404*G0_5_1_0; + A[138] = A[86] + 0.0225749559082892*G0_0_0_0 - 0.00225749559082867*G0_0_0_1 - 0.00225749559082902*G0_0_1_0 - 0.0451499118165784*G0_0_1_1 - 0.112874779541446*G0_1_0_0 - 0.203174603174603*G0_1_0_1 - 0.0225749559082881*G0_1_1_0 + 0.0180599647266314*G0_2_0_0 + 0.0428924162257492*G0_2_0_1 + 0.0428924162257494*G0_2_1_0 + 0.0451499118165782*G0_2_1_1 - 0.153509700176366*G0_3_0_0 - 0.0902998236331566*G0_3_0_1 - 0.180599647266313*G0_3_1_0 - 0.180599647266313*G0_3_1_1 + 0.0270899470899471*G0_4_0_0 + 0.0270899470899469*G0_4_0_1 + 0.0270899470899471*G0_4_1_0 + 0.0632098765432098*G0_5_0_0 + 0.0902998236331563*G0_5_0_1 + 0.180599647266313*G0_5_1_1; + A[51] = -A[173] - 0.0293474426807759*G0_0_0_0 - 0.011287477954144*G0_0_0_1 - 0.0225749559082892*G0_0_1_0 + 0.00902998236331575*G0_0_1_1 - 0.0248324514991183*G0_1_0_0 + 0.0135449735449738*G0_2_0_0 + 0.02031746031746*G0_2_0_1 + 0.0316049382716048*G0_2_1_0 + 0.00902998236331572*G0_2_1_1 - 0.0632098765432099*G0_3_0_0 - 0.0541798941798939*G0_3_0_1 - 0.0090299823633158*G0_3_1_0 - 0.0993298059964716*G0_4_0_0 - 0.00902998236331528*G0_4_0_1 - 0.00902998236331584*G0_4_1_0 - 0.0180599647266313*G0_4_1_1 + 0.0541798941798941*G0_5_0_1 + 0.00902998236331566*G0_5_1_0; + A[50] = -A[170] - 0.0293474426807757*G0_0_0_0 + 0.029347442680776*G0_0_0_1 + 0.0112874779541447*G0_1_0_0 - 0.112874779541447*G0_1_0_1 + 0.24832451499118*G0_2_0_0 - 0.0158024691358025*G0_2_0_1 - 0.0632098765432097*G0_3_0_0 - 0.361199294532627*G0_3_0_1 + 0.153509700176366*G0_4_0_0 - 0.081269841269841*G0_4_0_1 + 0.0180599647266311*G0_5_0_0; + A[99] = -A[50] - 0.309276895943561*G0_0_0_0 + 0.221234567901233*G0_0_0_1 + 0.523738977072309*G0_0_1_0 - 0.309276895943561*G0_0_1_1 + 0.0203174603174604*G0_1_0_0 - 0.0541798941798941*G0_1_0_1 + 0.00225749559082853*G0_1_1_0 + 0.284444444444444*G0_1_1_1 + 0.284444444444443*G0_2_0_0 - 0.0541798941798941*G0_2_0_1 + 0.00225749559082819*G0_2_1_0 + 0.0203174603174599*G0_2_1_1 + 0.108359788359788*G0_3_0_0 - 0.144479717813051*G0_3_0_1 + 0.180599647266313*G0_3_1_0 + 0.108359788359788*G0_3_1_1 + 0.252839506172839*G0_4_0_1 + 0.153509700176366*G0_4_1_0 + 0.0993298059964726*G0_4_1_1 + 0.0993298059964721*G0_5_0_0 + 0.252839506172838*G0_5_0_1 + 0.153509700176366*G0_5_1_0; + A[133] = -A[170] - 0.0158024691358025*G0_0_0_0 + 0.0270899470899467*G0_0_0_1 + 0.0474074074074069*G0_0_1_0 + 0.024832451499118*G0_1_0_0 - 0.0993298059964728*G0_1_0_1 + 0.00902998236331604*G0_1_1_0 - 0.194144620811287*G0_1_1_1 - 0.151252204585536*G0_2_0_1 - 0.0902998236331558*G0_2_1_0 - 0.0993298059964713*G0_2_1_1 - 0.108359788359787*G0_3_0_0 - 0.117389770723103*G0_3_0_1 - 0.0632098765432084*G0_3_1_0 + 0.108359788359788*G0_4_0_0 - 0.0993298059964713*G0_4_0_1 - 0.252839506172839*G0_4_1_0 + 0.0180599647266313*G0_4_1_1 - 0.00902998236331564*G0_5_0_0 - 0.0902998236331567*G0_5_1_0 + 0.0722398589065252*G0_5_1_1; + A[132] = A[133] - 0.018059964726631*G0_0_0_0 - 0.0451499118165778*G0_0_0_1 - 0.0993298059964722*G0_0_1_0 + 0.252839506172838*G0_0_1_1 - 0.0180599647266311*G0_1_0_0 + 0.0270899470899467*G0_1_0_1 + 0.00902998236331564*G0_1_1_0 - 0.0541798941798943*G0_1_1_1 - 0.108359788359789*G0_2_1_1 - 0.0722398589065269*G0_3_0_1 - 0.10835978835979*G0_3_1_0 - 0.126419753086421*G0_3_1_1 + 0.0722398589065243*G0_4_0_1 + 0.108359788359789*G0_4_1_0 - 0.198659611992945*G0_4_1_1 + 0.0361199294532622*G0_5_0_0 + 0.0180599647266307*G0_5_0_1 + 0.0902998236331568*G0_5_1_0 + 0.234779541446207*G0_5_1_1; + A[191] = A[132] + 0.257354497354496*G0_0_0_0 - 0.257354497354496*G0_0_1_1 - 0.203174603174603*G0_1_0_0 - 0.176084656084656*G0_1_0_1 - 0.108359788359788*G0_1_1_0 + 0.176084656084656*G0_2_0_1 + 0.108359788359788*G0_2_1_0 + 0.203174603174603*G0_2_1_1 - 0.0812698412698399*G0_3_0_0 + 0.081269841269841*G0_3_1_1 + 0.35216931216931*G0_4_0_0 - 0.0361199294532629*G0_4_0_1 + 0.14447971781305*G0_4_1_0 + 0.189629629629629*G0_4_1_1 - 0.189629629629629*G0_5_0_0 + 0.0361199294532617*G0_5_0_1 - 0.14447971781305*G0_5_1_0 - 0.352169312169311*G0_5_1_1; + A[188] = A[132] - 0.0406349206349208*G0_0_0_1 + 0.0406349206349208*G0_0_1_0 + 0.0677248677248673*G0_2_0_1 - 0.0677248677248672*G0_2_1_0 + 0.0270899470899468*G0_3_0_1 - 0.0270899470899468*G0_3_1_0 - 0.117389770723103*G0_4_0_1 + 0.117389770723103*G0_4_1_0 + 0.0632098765432091*G0_5_0_1 - 0.0632098765432091*G0_5_1_0; + A[104] = -A[132] - 0.0180599647266313*G0_0_0_0 - 0.0722398589065252*G0_0_0_1 - 0.180599647266314*G0_0_1_0 + 0.0361199294532619*G0_0_1_1 - 0.0541798941798939*G0_1_0_0 + 0.27089947089947*G0_2_0_0 + 0.108359788359787*G0_2_0_1 + 0.216719576719576*G0_2_1_0 + 0.0361199294532621*G0_2_1_1 + 0.397319223985888*G0_3_0_0 + 0.316049382716047*G0_3_0_1 + 0.279929453262784*G0_3_1_0 + 0.270899470899468*G0_3_1_1 + 0.14447971781305*G0_4_0_0 - 0.171569664902998*G0_4_0_1 - 0.171569664902997*G0_4_1_0 - 0.343139329805996*G0_4_1_1 + 0.0722398589065252*G0_5_0_0 - 0.0451499118165787*G0_5_0_1 - 0.00902998236331612*G0_5_1_0 + 0.270899470899469*G0_5_1_1; + A[216] = A[104] - 0.0677248677248683*G0_0_0_1 + 0.0677248677248683*G0_0_1_0 + 0.0406349206349211*G0_2_0_1 - 0.0406349206349211*G0_2_1_0 - 0.0632098765432098*G0_3_0_1 + 0.0632098765432097*G0_3_1_0 + 0.117389770723104*G0_4_0_1 - 0.117389770723104*G0_4_1_0 - 0.0270899470899466*G0_5_0_1 + 0.0270899470899466*G0_5_1_0; + A[148] = A[216] - 0.203174603174602*G0_0_0_0 + 0.203174603174603*G0_0_1_1 + 0.293474426807759*G0_1_0_0 + 0.325079365079363*G0_1_0_1 + 0.284444444444443*G0_1_1_0 + 0.270899470899469*G0_1_1_1 - 0.27089947089947*G0_2_0_0 - 0.325079365079364*G0_2_0_1 - 0.284444444444443*G0_2_1_0 - 0.293474426807759*G0_2_1_1 - 0.0451499118165791*G0_3_0_0 + 0.045149911816579*G0_3_1_1 - 0.225749559082891*G0_4_0_0 + 0.0180599647266314*G0_4_0_1 + 0.162539682539682*G0_4_1_0 + 0.225749559082892*G0_4_1_1 - 0.225749559082891*G0_5_0_0 - 0.0180599647266305*G0_5_0_1 - 0.16253968253968*G0_5_1_0 + 0.225749559082892*G0_5_1_1; + A[213] = -A[191] + 0.158024691358024*G0_0_0_0 - 0.0451499118165783*G0_0_0_1 - 0.0857848324514986*G0_0_1_0 - 0.0180599647266312*G0_0_1_1 - 0.176084656084656*G0_1_0_0 + 0.27089947089947*G0_2_0_0 + 0.0270899470899471*G0_2_0_1 + 0.0677248677248675*G0_2_1_0 - 0.0180599647266308*G0_2_1_1 - 0.117389770723103*G0_3_0_0 - 0.0722398589065254*G0_3_0_1 + 0.0722398589065263*G0_3_1_0 + 0.930088183421511*G0_4_0_0 + 0.018059964726631*G0_4_0_1 + 0.0180599647266314*G0_4_1_0 + 0.036119929453262*G0_4_1_1 - 0.117389770723104*G0_5_0_0 + 0.0722398589065245*G0_5_0_1 - 0.0722398589065246*G0_5_1_0; + A[204] = A[148] + 0.0677248677248669*G0_0_0_1 - 0.0677248677248669*G0_0_1_0 - 0.0406349206349209*G0_1_0_1 + 0.0406349206349209*G0_1_1_0 + 0.0632098765432104*G0_3_0_1 - 0.0632098765432104*G0_3_1_0 + 0.0270899470899472*G0_4_0_1 - 0.0270899470899472*G0_4_1_0 - 0.117389770723103*G0_5_0_1 + 0.117389770723103*G0_5_1_0; + A[193] = -A[204] - 0.243809523809523*G0_0_0_0 - 0.0541798941798936*G0_0_0_1 + 0.0677248677248678*G0_0_1_0 - 0.0135449735449735*G0_0_1_1 + 0.171569664902998*G0_1_0_0 + 0.230264550264549*G0_1_1_0 + 0.325079365079363*G0_2_0_0 + 0.0948148148148145*G0_2_0_1 + 0.148994708994708*G0_2_1_0 + 0.0135449735449734*G0_2_1_1 - 1.23710758377424*G0_3_0_0 - 0.623068783068779*G0_3_0_1 - 1.01135802469135*G0_3_1_0 - 0.43343915343915*G0_3_1_1 - 1.85114638447971*G0_4_0_0 - 0.243809523809523*G0_4_0_1 - 0.595978835978834*G0_4_1_0 - 1.09262786596119*G0_5_0_0 - 0.731428571428568*G0_5_0_1 - 0.39731922398589*G0_5_1_0 + 0.433439153439151*G0_5_1_1; + A[222] = A[193] + 0.027089947089947*G0_0_0_0 - 0.0270899470899478*G0_0_1_1 + 0.135449735449734*G0_1_0_0 + 0.379259259259258*G0_1_0_1 + 0.243809523809523*G0_1_1_0 + 0.595978835978833*G0_1_1_1 - 0.595978835978833*G0_2_0_0 - 0.379259259259258*G0_2_0_1 - 0.243809523809523*G0_2_1_0 - 0.135449735449735*G0_2_1_1 + 0.758518518518514*G0_3_0_0 - 0.758518518518516*G0_3_1_1 + 2.05883597883597*G0_4_0_0 - 0.325079365079363*G0_4_0_1 + 0.216719576719577*G0_4_1_0 - 0.866878306878303*G0_4_1_1 + 0.866878306878304*G0_5_0_0 + 0.325079365079362*G0_5_0_1 - 0.216719576719574*G0_5_1_0 - 2.05883597883597*G0_5_1_1; + A[88] = -A[133] + 0.0135449735449733*G0_0_1_0 - 0.094814814814814*G0_0_1_1 + 0.0586948853615518*G0_1_1_0 + 0.325079365079364*G0_1_1_1 - 0.0677248677248672*G0_2_1_1 + 0.180599647266314*G0_3_1_0 + 0.00902998236331626*G0_3_1_1 - 0.180599647266315*G0_4_1_0 + 0.0812698412698404*G0_4_1_1 - 0.0722398589065258*G0_5_1_0 + 0.695308641975305*G0_5_1_1; + A[214] = -A[88] + 0.193015873015872*G0_0_0_0 + 0.0406349206349207*G0_0_0_1 - 0.145608465608465*G0_0_1_1 + 0.11400352733686*G0_1_0_0 - 0.0338624338624339*G0_1_0_1 + 0.118518518518518*G0_1_1_0 + 0.406349206349205*G0_1_1_1 - 0.54179894179894*G0_2_0_0 + 0.15238095238095*G0_2_0_1 - 0.0677248677248687*G0_2_1_0 + 0.0237037037037023*G0_2_1_1 - 1.46737213403879*G0_3_0_0 - 0.726913580246912*G0_3_0_1 - 0.880423280423276*G0_3_1_0 - 0.135449735449735*G0_3_1_1 - 0.970723104056433*G0_4_0_0 - 0.176084656084657*G0_4_0_1 + 0.12190476190476*G0_4_1_1 - 0.171569664902998*G0_5_0_0 - 0.0857848324514998*G0_5_0_1 + 0.948148148148143*G0_5_1_1; + A[207] = A[193] + 0.189629629629628*G0_0_0_1 - 0.189629629629628*G0_0_1_0 + 0.189629629629629*G0_1_0_1 - 0.189629629629629*G0_1_1_0 + 0.0541798941798939*G0_2_0_1 - 0.0541798941798939*G0_2_1_0 - 0.325079365079364*G0_3_0_1 + 0.325079365079364*G0_3_1_0 - 0.325079365079364*G0_4_0_1 + 0.325079365079364*G0_4_1_0 + 0.216719576719574*G0_5_0_1 - 0.216719576719574*G0_5_1_0; + A[146] = -A[138] + 0.264126984126984*G0_0_0_0 + 0.0158024691358023*G0_0_1_0 + 0.124162257495591*G0_1_0_0 + 0.112874779541446*G0_1_1_0 - 0.0586948853615517*G0_2_0_0 - 0.0293474426807758*G0_2_1_0 + 0.0180599647266314*G0_3_0_0 + 0.234779541446207*G0_4_0_0 + 0.0812698412698411*G0_4_1_0 + 0.297989417989417*G0_5_0_0 + 0.361199294532626*G0_5_1_0; + A[183] = -A[191] + 0.266384479717811*G0_0_0_0 - 0.0586948853615515*G0_0_1_0 - 0.0677248677248679*G0_1_0_0 - 0.108359788359787*G0_2_0_0 - 0.0135449735449736*G0_2_1_0 + 0.261869488536154*G0_3_0_0 + 0.180599647266314*G0_3_1_0 + 0.76754850088183*G0_4_0_0 + 0.072239858906526*G0_4_1_0 - 0.171569664902998*G0_5_0_0 - 0.180599647266312*G0_5_1_0; + A[186] = A[183] - 0.514708994708992*G0_0_0_0 + 0.0948148148148135*G0_0_0_1 - 0.135449735449734*G0_0_1_0 + 0.419894179894178*G0_0_1_1 - 0.0270899470899469*G0_1_0_0 - 0.0948148148148148*G0_1_0_1 - 0.0541798941798944*G0_1_1_1 + 0.216719576719575*G0_2_0_0 + 0.0270899470899471*G0_2_0_1 - 0.0948148148148143*G0_2_1_1 - 0.975238095238091*G0_3_0_0 - 0.650158730158727*G0_3_0_1 - 0.812698412698409*G0_3_1_0 - 0.514708994708992*G0_3_1_1 - 1.62539682539682*G0_4_0_0 - 0.758518518518517*G0_4_0_1 - 0.27089947089947*G0_4_1_0 + 0.0270899470899462*G0_4_1_1 - 0.325079365079365*G0_5_0_0 - 0.108359788359789*G0_5_0_1 - 0.270899470899469*G0_5_1_0 + 0.35216931216931*G0_5_1_1; + A[194] = A[222] + 0.189629629629629*G0_0_0_1 - 0.189629629629629*G0_0_1_0 + 0.0541798941798937*G0_1_0_1 - 0.0541798941798937*G0_1_1_0 + 0.189629629629629*G0_2_0_1 - 0.189629629629629*G0_2_1_0 - 0.325079365079362*G0_3_0_1 + 0.325079365079362*G0_3_1_0 + 0.216719576719576*G0_4_0_1 - 0.216719576719576*G0_4_1_0 - 0.325079365079363*G0_5_0_1 + 0.325079365079363*G0_5_1_0; + A[54] = A[138] - 0.00677248677248696*G0_0_0_1 + 0.00677248677248696*G0_0_1_0 + 0.0902998236331571*G0_1_0_1 - 0.0902998236331571*G0_1_1_0 + 0.00677248677248681*G0_2_0_1 - 0.00677248677248681*G0_2_1_0 - 0.0812698412698408*G0_3_0_1 + 0.0812698412698408*G0_3_1_0 - 0.00902998236331563*G0_5_0_1 + 0.00902998236331562*G0_5_1_0; + A[174] = -A[54] + 0.264126984126984*G0_0_0_0 + 0.0158024691358023*G0_0_0_1 + 0.124162257495591*G0_1_0_0 + 0.112874779541446*G0_1_0_1 - 0.0586948853615517*G0_2_0_0 - 0.0293474426807758*G0_2_0_1 + 0.0180599647266314*G0_3_0_0 + 0.234779541446207*G0_4_0_0 + 0.0812698412698411*G0_4_0_1 + 0.297989417989417*G0_5_0_0 + 0.361199294532626*G0_5_0_1; + A[141] = A[99] + 0.338624338624338*G0_0_0_1 - 0.338624338624338*G0_0_1_0 + 0.0338624338624335*G0_1_0_1 - 0.0338624338624335*G0_1_1_0 + 0.0338624338624336*G0_2_0_1 - 0.0338624338624336*G0_2_1_0 - 0.0451499118165787*G0_3_0_1 + 0.0451499118165787*G0_3_1_0 - 0.180599647266313*G0_4_0_1 + 0.180599647266313*G0_4_1_0 - 0.180599647266313*G0_5_0_1 + 0.180599647266313*G0_5_1_0; + A[95] = A[54] - 0.0383774250440917*G0_0_0_0 + 0.0383774250440912*G0_0_1_1 + 0.146737213403879*G0_1_0_0 + 0.162539682539682*G0_1_0_1 + 0.246067019400352*G0_1_1_0 + 0.266384479717811*G0_1_1_1 - 0.266384479717811*G0_2_0_0 - 0.162539682539681*G0_2_0_1 - 0.246067019400351*G0_2_1_0 - 0.146737213403879*G0_2_1_1 + 0.0361199294532628*G0_3_0_0 - 0.0361199294532621*G0_3_1_1 + 0.054179894179894*G0_4_0_1 + 0.0632098765432098*G0_4_1_0 + 0.081269841269841*G0_4_1_1 - 0.0812698412698409*G0_5_0_0 - 0.0541798941798936*G0_5_0_1 - 0.0632098765432096*G0_5_1_0; + A[78] = -A[86] - 0.0293474426807757*G0_0_0_0 + 0.029347442680776*G0_0_1_0 + 0.0112874779541447*G0_1_0_0 - 0.112874779541447*G0_1_1_0 + 0.24832451499118*G0_2_0_0 - 0.0158024691358025*G0_2_1_0 - 0.0632098765432097*G0_3_0_0 - 0.361199294532627*G0_3_1_0 + 0.153509700176366*G0_4_0_0 - 0.0812698412698411*G0_4_1_0 + 0.0180599647266311*G0_5_0_0; + A[123] = -A[78] + 0.029347442680776*G0_0_1_0 - 0.0293474426807759*G0_0_1_1 - 0.0158024691358028*G0_1_1_0 + 0.248324514991182*G0_1_1_1 - 0.112874779541445*G0_2_1_0 + 0.0112874779541447*G0_2_1_1 - 0.361199294532627*G0_3_1_0 - 0.0632098765432098*G0_3_1_1 + 0.0180599647266314*G0_4_1_1 - 0.0812698412698413*G0_5_1_0 + 0.153509700176366*G0_5_1_1; + A[98] = -A[95] + 0.0158024691358026*G0_0_0_1 + 0.264126984126983*G0_0_1_1 - 0.0293474426807758*G0_1_0_1 - 0.0586948853615517*G0_1_1_1 + 0.112874779541445*G0_2_0_1 + 0.12416225749559*G0_2_1_1 + 0.018059964726632*G0_3_1_1 + 0.361199294532627*G0_4_0_1 + 0.297989417989417*G0_4_1_1 + 0.0812698412698418*G0_5_0_1 + 0.234779541446207*G0_5_1_1; + A[200] = A[88] + 0.0406349206349207*G0_1_0_1 - 0.0406349206349206*G0_1_1_0 - 0.0677248677248663*G0_2_0_1 + 0.0677248677248663*G0_2_1_0 + 0.117389770723105*G0_3_0_1 - 0.117389770723105*G0_3_1_0 - 0.0270899470899466*G0_4_0_1 + 0.0270899470899466*G0_4_1_0 - 0.0632098765432089*G0_5_0_1 + 0.0632098765432089*G0_5_1_0; + A[22] = A[106] - 0.00532627865961175*G0_0_0_1 + 0.00532627865961175*G0_0_1_0 + 0.00532627865961183*G0_2_0_1 - 0.00532627865961183*G0_2_1_0 - 0.000423280423280529*G0_3_0_1 + 0.000423280423280531*G0_3_1_0 + 0.000423280423280397*G0_5_0_1 - 0.000423280423280394*G0_5_1_0; + A[9] = A[135] + 0.529100529100527*G0_0_0_1 - 0.529100529100527*G0_0_1_0 - 0.0373897707231039*G0_1_0_1 + 0.0373897707231039*G0_1_1_0 - 0.0373897707231039*G0_2_0_1 + 0.0373897707231039*G0_2_1_0 + 0.00846560846560837*G0_3_0_1 - 0.00846560846560837*G0_3_1_0 + 0.158024691358024*G0_4_0_1 - 0.158024691358024*G0_4_1_0 + 0.158024691358024*G0_5_0_1 - 0.158024691358024*G0_5_1_0; + A[90] = A[9] + 0.529100529100527*G0_0_0_0 - 0.529100529100527*G0_0_1_1 + 0.0373897707231038*G0_1_0_1 + 0.0373897707231038*G0_1_1_0 + 0.0747795414462077*G0_1_1_1 - 0.0747795414462077*G0_2_0_0 - 0.0373897707231039*G0_2_0_1 - 0.0373897707231039*G0_2_1_0 + 0.00846560846560841*G0_3_0_0 - 0.00846560846560847*G0_3_1_1 + 0.183421516754849*G0_4_0_0 + 0.025396825396825*G0_4_0_1 + 0.0253968253968253*G0_4_1_0 - 0.132627865961199*G0_4_1_1 + 0.132627865961199*G0_5_0_0 - 0.0253968253968254*G0_5_0_1 - 0.0253968253968252*G0_5_1_0 - 0.183421516754849*G0_5_1_1; + A[6] = A[90] - 0.529100529100527*G0_0_0_1 + 0.529100529100526*G0_0_1_0 + 0.0373897707231039*G0_1_0_1 - 0.0373897707231039*G0_1_1_0 + 0.0373897707231039*G0_2_0_1 - 0.0373897707231039*G0_2_1_0 - 0.00846560846560839*G0_3_0_1 + 0.00846560846560841*G0_3_1_0 - 0.158024691358024*G0_4_0_1 + 0.158024691358024*G0_4_1_0 - 0.158024691358024*G0_5_0_1 + 0.158024691358024*G0_5_1_0; + A[34] = -A[37] + 0.0126984126984125*G0_0_1_0 + 0.0421164021164018*G0_0_1_1 - 0.0126984126984126*G0_1_1_0 + 0.0294179894179896*G0_1_1_1 + 0.161552028218694*G0_2_1_1 + 0.0395061728395062*G0_3_1_0 + 0.0895943562610228*G0_3_1_1 - 0.0395061728395057*G0_4_1_0 + 0.0500881834215165*G0_4_1_1 + 0.137283950617283*G0_5_1_1; + A[96] = A[144] - 0.338624338624338*G0_0_0_0 + 0.338624338624337*G0_0_1_1 - 0.158024691358024*G0_1_0_0 - 0.12416225749559*G0_1_0_1 - 0.12416225749559*G0_1_1_0 - 0.0902998236331564*G0_1_1_1 + 0.0902998236331561*G0_2_0_0 + 0.12416225749559*G0_2_0_1 + 0.12416225749559*G0_2_1_0 + 0.158024691358024*G0_2_1_1 + 0.0451499118165783*G0_3_0_0 - 0.0451499118165786*G0_3_1_1 + 0.586948853615518*G0_4_0_0 + 0.406349206349205*G0_4_0_1 + 0.406349206349205*G0_4_1_0 + 0.225749559082891*G0_4_1_1 - 0.225749559082891*G0_5_0_0 - 0.406349206349203*G0_5_0_1 - 0.406349206349203*G0_5_1_0 - 0.586948853615517*G0_5_1_1; + A[81] = A[95] + 0.00677248677248667*G0_0_0_1 - 0.00677248677248668*G0_0_1_0 - 0.00677248677248691*G0_1_0_1 + 0.0067724867724869*G0_1_1_0 - 0.0902998236331568*G0_2_0_1 + 0.0902998236331568*G0_2_1_0 + 0.0812698412698406*G0_3_0_1 - 0.0812698412698406*G0_3_1_0 + 0.0090299823633158*G0_4_0_1 - 0.00902998236331577*G0_4_1_0; + A[126] = -A[81] + 0.0158024691358026*G0_0_1_0 + 0.264126984126983*G0_0_1_1 - 0.0293474426807758*G0_1_1_0 - 0.0586948853615517*G0_1_1_1 + 0.112874779541445*G0_2_1_0 + 0.12416225749559*G0_2_1_1 + 0.018059964726632*G0_3_1_1 + 0.361199294532627*G0_4_1_0 + 0.297989417989417*G0_4_1_1 + 0.0812698412698418*G0_5_1_0 + 0.234779541446207*G0_5_1_1; + A[156] = A[100] - 0.191887125220459*G0_0_0_1 + 0.191887125220459*G0_0_1_0 - 0.00620811287477919*G0_1_0_1 + 0.00620811287477919*G0_1_1_0 - 0.0118518518518517*G0_2_0_1 + 0.0118518518518517*G0_2_1_0 + 0.00677248677248701*G0_3_0_1 - 0.006772486772487*G0_3_1_0 + 0.135449735449735*G0_4_0_1 - 0.135449735449735*G0_4_1_0 + 0.0677248677248676*G0_5_0_1 - 0.0677248677248675*G0_5_1_0; + A[142] = A[156] - 0.141093474426807*G0_0_0_0 + 0.141093474426807*G0_0_1_1 + 0.0282186948853618*G0_1_0_0 + 0.0553086419753084*G0_1_0_1 + 0.060952380952381*G0_1_1_0 + 0.0203174603174603*G0_1_1_1 - 0.0203174603174603*G0_2_0_0 - 0.0553086419753084*G0_2_0_1 - 0.0609523809523808*G0_2_1_0 - 0.0282186948853614*G0_2_1_1 + 0.0316049382716049*G0_3_0_0 - 0.0316049382716053*G0_3_1_1 - 0.194144620811286*G0_4_0_0 - 0.0135449735449733*G0_4_0_1 + 0.0541798941798943*G0_4_1_0 - 0.126419753086419*G0_4_1_1 + 0.126419753086419*G0_5_0_0 + 0.0135449735449735*G0_5_0_1 - 0.0541798941798934*G0_5_1_0 + 0.194144620811286*G0_5_1_1; + A[223] = -A[200] + 0.0948148148148146*G0_0_0_0 - 0.0812698412698406*G0_0_0_1 - 0.135449735449734*G0_0_1_0 + 0.0135449735449736*G0_0_1_1 - 0.0586948853615515*G0_1_0_0 - 0.23026455026455*G0_1_1_0 - 0.270899470899471*G0_2_0_0 + 0.0406349206349196*G0_2_0_1 - 0.0812698412698421*G0_2_1_0 - 0.0135449735449734*G0_2_1_1 + 0.469559082892413*G0_3_0_0 + 1.16486772486772*G0_3_0_1 + 0.830758377425038*G0_3_1_0 + 0.43343915343915*G0_3_1_1 - 1.01135802469136*G0_4_0_0 + 0.243809523809521*G0_4_0_1 + 0.595978835978833*G0_4_1_0 - 0.036119929453263*G0_5_0_0 + 0.189629629629628*G0_5_0_1 + 0.577918871252202*G0_5_1_0 - 0.433439153439151*G0_5_1_1; + A[208] = A[223] - 0.243809523809523*G0_0_0_0 - 0.027089947089947*G0_0_0_1 + 0.0270899470899469*G0_0_1_0 - 0.406349206349204*G0_0_1_1 + 0.514708994708991*G0_1_0_0 + 0.568888888888886*G0_1_0_1 + 0.758518518518515*G0_1_1_0 + 1.35449735449735*G0_1_1_1 - 0.0541798941798937*G0_2_0_0 - 0.216719576719575*G0_2_0_1 - 0.0270899470899474*G0_2_1_0 - 0.297989417989418*G0_2_1_1 + 2.27555555555554*G0_3_0_0 + 0.975238095238089*G0_3_0_1 + 1.19195767195766*G0_3_1_0 + 2.05883597883597*G0_3_1_1 + 2.7089947089947*G0_4_0_0 - 0.325079365079363*G0_4_1_0 + 0.433439153439151*G0_4_1_1 + 1.30031746031746*G0_5_0_0 + 0.325079365079365*G0_5_0_1 + 3.35915343915342*G0_5_1_1; + A[185] = -A[188] - 0.058694885361552*G0_0_0_1 + 0.266384479717812*G0_0_1_1 - 0.0135449735449733*G0_1_0_1 - 0.108359788359788*G0_1_1_1 - 0.0677248677248676*G0_2_1_1 + 0.180599647266312*G0_3_0_1 + 0.261869488536153*G0_3_1_1 - 0.180599647266312*G0_4_0_1 - 0.171569664902998*G0_4_1_1 + 0.0722398589065253*G0_5_0_1 + 0.76754850088183*G0_5_1_1; + A[210] = A[14] + 0.000846560846560903*G0_1_0_1 - 0.000846560846560899*G0_1_1_0 - 0.0189065255731923*G0_2_0_1 + 0.0189065255731923*G0_2_1_0 + 0.0180599647266313*G0_3_0_1 - 0.0180599647266313*G0_3_1_0 + 0.00564373897707232*G0_4_0_1 - 0.00564373897707233*G0_4_1_0 - 0.00564373897707233*G0_5_0_1 + 0.00564373897707234*G0_5_1_0; + A[203] = -A[200] + 0.0135449735449734*G0_0_0_1 - 0.094814814814814*G0_0_1_1 + 0.0586948853615518*G0_1_0_1 + 0.325079365079364*G0_1_1_1 - 0.0677248677248672*G0_2_1_1 + 0.180599647266314*G0_3_0_1 + 0.00902998236331623*G0_3_1_1 - 0.180599647266315*G0_4_0_1 + 0.0812698412698404*G0_4_1_1 - 0.0722398589065258*G0_5_0_1 + 0.695308641975305*G0_5_1_1; + A[59] = A[213] - 0.0677248677248672*G0_1_0_1 + 0.0677248677248672*G0_1_1_0 + 0.0406349206349205*G0_2_0_1 - 0.0406349206349205*G0_2_1_0 + 0.117389770723104*G0_3_0_1 - 0.117389770723104*G0_3_1_0 - 0.0632098765432098*G0_4_0_1 + 0.0632098765432099*G0_4_1_0 - 0.0270899470899467*G0_5_0_1 + 0.0270899470899468*G0_5_1_0; + A[179] = -A[59] - 0.0948148148148143*G0_0_0_0 + 0.013544973544973*G0_0_0_1 - 0.0677248677248677*G0_1_0_0 + 0.325079365079363*G0_2_0_0 + 0.0586948853615519*G0_2_0_1 + 0.00902998236331529*G0_3_0_0 + 0.180599647266314*G0_3_0_1 + 0.695308641975304*G0_4_0_0 - 0.0722398589065256*G0_4_0_1 + 0.0812698412698406*G0_5_0_0 - 0.180599647266313*G0_5_0_1; + A[17] = 0.00416225749559083*G0_0_0_1 - 0.0206349206349207*G0_1_0_1 - 0.0206349206349205*G0_2_0_1 - 0.000952380952380988*G0_3_0_1 - 0.00927689594356254*G0_4_0_1 - 0.00927689594356261*G0_5_0_1; + A[2] = -A[17] + 0.0247971781305114*G0_0_0_1 + 0.0206349206349206*G0_0_1_1 - 0.0247971781305115*G0_1_0_1 - 0.00416225749559085*G0_1_1_1 + 0.0206349206349207*G0_2_1_1 + 0.00832451499118159*G0_3_0_1 + 0.00927689594356263*G0_3_1_1 - 0.00832451499118159*G0_4_0_1 + 0.000952380952381003*G0_4_1_1 + 0.00927689594356256*G0_5_1_1; + A[134] = -A[89] - 0.0677248677248682*G0_0_1_0 - 0.0135449735449739*G0_0_1_1 + 0.0677248677248676*G0_1_1_0 + 0.0541798941798938*G0_1_1_1 - 0.0225749559082891*G0_2_1_1 - 0.722398589065252*G0_3_1_0 - 1.0384479717813*G0_3_1_1 + 0.722398589065255*G0_4_1_0 - 0.316049382716049*G0_4_1_1 - 0.966208112874775*G0_5_1_1; + A[218] = A[134] - 0.0406349206349212*G0_0_0_1 + 0.0406349206349212*G0_0_1_0 + 0.0270899470899469*G0_1_0_1 - 0.0270899470899469*G0_1_1_0 - 0.248324514991178*G0_2_0_1 + 0.248324514991178*G0_2_1_0 - 0.225749559082891*G0_3_0_1 + 0.225749559082891*G0_3_1_0 + 0.496649029982363*G0_4_0_1 - 0.496649029982363*G0_4_1_0 - 0.00902998236331552*G0_5_0_1 + 0.00902998236331552*G0_5_1_0; + A[215] = -A[218] - 0.0677248677248682*G0_0_0_1 - 0.0135449735449739*G0_0_1_1 + 0.0677248677248676*G0_1_0_1 + 0.0541798941798938*G0_1_1_1 - 0.0225749559082891*G0_2_1_1 - 0.722398589065252*G0_3_0_1 - 1.0384479717813*G0_3_1_1 + 0.722398589065255*G0_4_0_1 - 0.316049382716049*G0_4_1_1 - 0.966208112874775*G0_5_1_1; + A[69] = A[139] - 0.00395061728395148*G0_0_0_1 + 0.00395061728395148*G0_0_1_0 + 0.00338624338624313*G0_1_0_1 - 0.00338624338624313*G0_1_1_0 - 0.024268077601411*G0_2_0_1 + 0.024268077601411*G0_2_1_0 + 0.0225749559082886*G0_3_0_1 - 0.0225749559082886*G0_3_1_0 - 0.0022574955908292*G0_4_0_1 + 0.00225749559082922*G0_4_1_0 + 0.00451499118165726*G0_5_0_1 - 0.00451499118165727*G0_5_1_0; + A[94] = A[69] - 0.00733686067019412*G0_0_0_0 + 0.00733686067019519*G0_0_1_1 + 0.00282186948853621*G0_1_0_0 - 0.0338624338624341*G0_1_0_1 - 0.00620811287477993*G0_1_1_0 - 0.0440211640211641*G0_1_1_1 + 0.044021164021163*G0_2_0_0 + 0.0338624338624336*G0_2_0_1 + 0.00620811287477937*G0_2_1_0 - 0.00282186948853647*G0_2_1_1 - 0.0993298059964731*G0_3_0_0 + 0.0993298059964725*G0_3_1_1 - 0.0225749559082896*G0_4_0_0 - 0.00677248677248683*G0_4_1_0 + 0.00225749559082933*G0_4_1_1 - 0.00225749559082888*G0_5_0_0 + 0.00677248677248718*G0_5_1_0 + 0.0225749559082899*G0_5_1_1; + A[66] = A[94] + 0.00395061728395099*G0_0_0_1 - 0.00395061728395099*G0_0_1_0 + 0.0242680776014111*G0_1_0_1 - 0.0242680776014111*G0_1_1_0 - 0.00338624338624322*G0_2_0_1 + 0.00338624338624321*G0_2_1_0 - 0.0225749559082879*G0_3_0_1 + 0.0225749559082879*G0_3_1_0 - 0.00451499118165812*G0_4_0_1 + 0.00451499118165813*G0_4_1_0 + 0.00225749559082962*G0_5_0_1 - 0.00225749559082962*G0_5_1_0; + A[48] = -A[56] - 0.101587301587301*G0_0_0_0 - 0.0338624338624335*G0_0_1_0 + 0.101587301587302*G0_1_0_0 - 0.338624338624339*G0_1_1_0 + 0.0225749559082888*G0_2_0_0 - 0.0338624338624338*G0_2_1_0 + 0.81269841269841*G0_3_0_0 + 0.180599647266313*G0_3_1_0 + 0.451499118165782*G0_4_0_0 + 0.0451499118165783*G0_4_1_0 + 0.406349206349205*G0_5_0_0 + 0.180599647266312*G0_5_1_0; + A[39] = A[41] - 0.0191887125220458*G0_0_1_0 + 0.0310405643738976*G0_0_1_1 - 0.0191887125220459*G0_1_1_0 - 0.0502292768959436*G0_1_1_1 + 0.00790123456790105*G0_3_1_1 - 0.00790123456790121*G0_4_1_1 + 0.0383774250440915*G0_5_1_0 + 0.0191887125220456*G0_5_1_1; + A[137] = A[39] - 0.0193298059964726*G0_0_0_1 + 0.0193298059964726*G0_0_1_0 + 0.000141093474426832*G0_1_0_1 - 0.000141093474426835*G0_1_1_0 - 0.00395061728395062*G0_3_0_1 + 0.00395061728395061*G0_3_1_0 + 0.00395061728395065*G0_4_0_1 - 0.00395061728395064*G0_4_1_0 + 0.0191887125220457*G0_5_0_1 - 0.0191887125220457*G0_5_1_0; + A[167] = A[137] + 0.0191887125220458*G0_0_0_1 - 0.0310405643738976*G0_0_1_1 + 0.0191887125220459*G0_1_0_1 + 0.0502292768959436*G0_1_1_1 - 0.00790123456790105*G0_3_1_1 + 0.00790123456790121*G0_4_1_1 - 0.0383774250440915*G0_5_0_1 - 0.0191887125220456*G0_5_1_1; + A[47] = -A[167] - 0.0138271604938271*G0_0_0_1 + 0.0253968253968255*G0_1_0_1 + 0.108641975308641*G0_2_0_1 + 0.0355555555555555*G0_3_0_1 + 0.054744268077601*G0_4_0_1 - 0.00733686067019398*G0_5_0_1; + A[92] = -A[47] - 0.019753086419753*G0_0_0_1 - 0.0488183421516752*G0_0_1_1 + 0.019753086419753*G0_1_0_1 - 0.0290652557319226*G0_1_1_1 - 0.0931216931216929*G0_2_1_1 - 0.0112874779541445*G0_3_0_1 - 0.0310405643738977*G0_3_1_1 + 0.0112874779541447*G0_4_0_1 - 0.019753086419753*G0_4_1_1 - 0.0660317460317459*G0_5_1_1; + A[121] = A[91] - 0.0310405643738975*G0_0_0_0 + 0.0191887125220459*G0_0_1_0 + 0.0502292768959433*G0_2_0_0 + 0.0191887125220457*G0_2_1_0 - 0.00790123456790112*G0_3_0_0 - 0.0191887125220456*G0_4_0_0 - 0.0383774250440915*G0_4_1_0 + 0.00790123456790123*G0_5_0_0; + A[76] = -A[121] - 0.0138271604938272*G0_0_1_0 + 0.108641975308642*G0_1_1_0 + 0.0253968253968252*G0_2_1_0 + 0.0355555555555554*G0_3_1_0 - 0.00733686067019412*G0_4_1_0 + 0.0547442680776013*G0_5_1_0; + A[136] = -A[76] - 0.0488183421516754*G0_0_0_0 - 0.019753086419753*G0_0_1_0 - 0.093121693121693*G0_1_0_0 - 0.0290652557319223*G0_2_0_0 + 0.0197530864197529*G0_2_1_0 - 0.0310405643738977*G0_3_0_0 - 0.0112874779541445*G0_3_1_0 - 0.0660317460317457*G0_4_0_0 - 0.0197530864197531*G0_5_0_0 + 0.0112874779541447*G0_5_1_0; + A[87] = -A[132] - 0.058694885361552*G0_0_1_0 + 0.266384479717812*G0_0_1_1 - 0.0135449735449733*G0_1_1_0 - 0.108359788359788*G0_1_1_1 - 0.0677248677248676*G0_2_1_1 + 0.180599647266312*G0_3_1_0 + 0.261869488536153*G0_3_1_1 - 0.180599647266312*G0_4_1_0 - 0.171569664902998*G0_4_1_1 + 0.0722398589065253*G0_5_1_0 + 0.76754850088183*G0_5_1_1; + A[149] = A[87] - 0.112874779541446*G0_0_0_0 - 0.0316049382716054*G0_0_0_1 + 0.0541798941798944*G0_0_1_0 + 0.0812698412698412*G0_0_1_1 - 0.0135449735449734*G0_1_0_0 - 0.0270899470899468*G0_1_0_1 + 0.054179894179893*G0_2_0_0 - 0.112874779541446*G0_2_0_1 - 0.027089947089947*G0_2_1_0 - 0.081269841269841*G0_2_1_1 + 0.117389770723102*G0_3_0_0 + 0.108359788359786*G0_3_0_1 - 0.0541798941798935*G0_3_1_0 - 0.108359788359788*G0_3_1_1 + 0.0451499118165781*G0_4_0_0 - 0.0180599647266314*G0_4_0_1 + 0.108359788359788*G0_4_1_0 + 0.0451499118165783*G0_5_0_0 + 0.216719576719575*G0_5_0_1 + 0.0541798941798945*G0_5_1_0 + 0.108359788359788*G0_5_1_1; + A[219] = A[149] + 0.0677248677248686*G0_0_0_1 - 0.0677248677248686*G0_0_1_0 + 0.0135449735449731*G0_1_0_1 - 0.0135449735449731*G0_1_1_0 + 0.0180599647266318*G0_2_0_1 - 0.0180599647266318*G0_2_1_0 - 0.00902998236331448*G0_3_0_1 + 0.00902998236331448*G0_3_1_0 + 0.06320987654321*G0_4_0_1 - 0.0632098765432101*G0_4_1_0 - 0.153509700176365*G0_5_0_1 + 0.153509700176365*G0_5_1_0; + A[103] = A[219] + 0.203174603174603*G0_0_0_0 - 0.203174603174602*G0_0_1_1 + 0.0677248677248675*G0_1_0_0 + 0.0948148148148151*G0_1_0_1 + 0.0902998236331563*G0_1_1_0 + 0.162539682539682*G0_1_1_1 - 0.162539682539682*G0_2_0_0 - 0.0948148148148144*G0_2_0_1 - 0.090299823633156*G0_2_1_0 - 0.0677248677248673*G0_2_1_1 + 0.117389770723105*G0_3_0_0 - 0.117389770723104*G0_3_1_1 + 0.47858906525573*G0_4_0_0 + 0.0541798941798938*G0_4_0_1 + 0.27089947089947*G0_4_1_0 + 0.0270899470899471*G0_4_1_1 - 0.0270899470899467*G0_5_0_0 - 0.0541798941798938*G0_5_0_1 - 0.270899470899469*G0_5_1_0 - 0.478589065255729*G0_5_1_1; + A[201] = A[103] - 0.0677248677248673*G0_0_0_1 + 0.0677248677248673*G0_0_1_0 - 0.018059964726632*G0_1_0_1 + 0.018059964726632*G0_1_1_0 - 0.0135449735449734*G0_2_0_1 + 0.0135449735449734*G0_2_1_0 + 0.00902998236331487*G0_3_0_1 - 0.00902998236331487*G0_3_1_0 + 0.153509700176366*G0_4_0_1 - 0.153509700176366*G0_4_1_0 - 0.0632098765432107*G0_5_0_1 + 0.0632098765432107*G0_5_1_0; + A[166] = -A[46] - 0.0126984126984126*G0_0_0_0 - 0.203174603174603*G0_1_0_0 - 0.0126984126984126*G0_2_0_0 - 0.0818342151675483*G0_3_0_0 - 0.132627865961199*G0_4_0_0 - 0.0818342151675485*G0_5_0_0; + A[115] = A[157] - 0.0126984126984133*G0_0_0_1 + 0.0126984126984133*G0_0_1_0 - 0.00804232804232793*G0_1_0_1 + 0.00804232804232793*G0_1_1_0 - 0.00804232804232764*G0_2_0_1 + 0.00804232804232765*G0_2_1_0 - 0.0389417989417988*G0_3_0_1 + 0.0389417989417988*G0_3_1_0 + 0.0338624338624323*G0_4_0_1 - 0.0338624338624322*G0_4_1_0 + 0.033862433862433*G0_5_0_1 - 0.033862433862433*G0_5_1_0; + A[70] = A[115] - 0.00253968253968217*G0_0_0_0 - 0.0397883597883595*G0_0_0_1 - 0.0605291005291011*G0_0_1_0 - 0.010582010582011*G0_0_1_1 + 0.00253968253968255*G0_1_0_0 - 0.0372486772486768*G0_1_0_1 - 0.0579894179894183*G0_1_1_0 - 0.087195767195767*G0_1_1_1 - 0.0160846560846554*G0_2_1_0 - 0.00804232804232769*G0_2_1_1 + 0.0372486772486762*G0_3_0_0 + 0.128677248677247*G0_3_0_1 + 0.123597883597882*G0_3_1_0 + 0.270899470899469*G0_3_1_1 - 0.0372486772486767*G0_4_0_0 + 0.0914285714285716*G0_4_0_1 + 0.0863492063492054*G0_4_1_0 - 0.0558730158730161*G0_4_1_1 + 0.199788359788358*G0_5_0_1 + 0.267513227513225*G0_5_1_0 + 0.233650793650791*G0_5_1_1; + A[154] = A[70] - 0.00804232804232831*G0_0_0_1 + 0.00804232804232831*G0_0_1_0 - 0.0126984126984136*G0_1_0_1 + 0.0126984126984136*G0_1_1_0 - 0.00804232804232781*G0_2_0_1 + 0.00804232804232781*G0_2_1_0 + 0.0338624338624335*G0_3_0_1 - 0.0338624338624335*G0_3_1_0 - 0.0389417989417985*G0_4_0_1 + 0.0389417989417985*G0_4_1_0 + 0.0338624338624345*G0_5_0_1 - 0.0338624338624346*G0_5_1_0; + A[109] = A[70] - 0.00804232804232818*G0_0_0_0 + 0.00804232804232705*G0_0_1_1 - 0.0105820105820105*G0_1_0_0 + 0.0372486772486777*G0_1_0_1 + 0.0419047619047627*G0_1_1_0 + 0.0871957671957679*G0_1_1_1 - 0.0871957671957655*G0_2_0_0 - 0.0372486772486762*G0_2_0_1 - 0.0419047619047607*G0_2_1_0 + 0.0105820105820112*G0_2_1_1 + 0.233650793650794*G0_3_0_0 - 0.233650793650791*G0_3_1_1 + 0.27089947089947*G0_4_0_0 + 0.108359788359789*G0_4_0_1 + 0.181164021164021*G0_4_1_0 + 0.0558730158730158*G0_4_1_1 - 0.0558730158730156*G0_5_0_0 - 0.108359788359786*G0_5_0_1 - 0.181164021164021*G0_5_1_0 - 0.270899470899469*G0_5_1_1; + A[67] = A[109] - 0.00804232804232835*G0_0_0_1 + 0.00804232804232834*G0_0_1_0 - 0.00804232804232856*G0_1_0_1 + 0.00804232804232857*G0_1_1_0 - 0.0126984126984122*G0_2_0_1 + 0.0126984126984122*G0_2_1_0 + 0.0338624338624321*G0_3_0_1 - 0.033862433862432*G0_3_1_0 + 0.0338624338624329*G0_4_0_1 - 0.0338624338624328*G0_4_1_0 - 0.0389417989417999*G0_5_0_1 + 0.0389417989417999*G0_5_1_0; + A[224] = A[208] - 0.162539682539682*G0_0_0_0 + 0.162539682539682*G0_0_1_1 - 0.812698412698408*G0_1_0_0 - 0.785608465608462*G0_1_0_1 - 0.785608465608462*G0_1_1_0 - 1.40867724867724*G0_1_1_1 + 1.40867724867724*G0_2_0_0 + 0.785608465608463*G0_2_0_1 + 0.785608465608463*G0_2_1_0 + 0.81269841269841*G0_2_1_1 - 0.216719576719572*G0_3_0_0 + 0.216719576719576*G0_3_1_1 + 0.650158730158727*G0_4_0_0 + 0.325079365079363*G0_4_0_1 + 0.325079365079363*G0_4_1_0 + 0.866878306878303*G0_4_1_1 - 0.866878306878303*G0_5_0_0 - 0.325079365079363*G0_5_0_1 - 0.325079365079363*G0_5_1_0 - 0.650158730158727*G0_5_1_1; + A[206] = -A[198] - 0.0135449735449733*G0_0_0_0 - 0.067724867724867*G0_0_1_0 - 0.0225749559082892*G0_1_0_0 + 0.0541798941798938*G0_2_0_0 + 0.0677248677248672*G0_2_1_0 - 1.0384479717813*G0_3_0_0 - 0.722398589065254*G0_3_1_0 - 0.966208112874775*G0_4_0_0 - 0.316049382716048*G0_5_0_0 + 0.722398589065252*G0_5_1_0; + A[178] = A[206] - 0.0406349206349203*G0_0_0_1 + 0.0406349206349203*G0_0_1_0 - 0.24832451499118*G0_1_0_1 + 0.24832451499118*G0_1_1_0 + 0.027089947089947*G0_2_0_1 - 0.027089947089947*G0_2_1_0 - 0.225749559082892*G0_3_0_1 + 0.225749559082892*G0_3_1_0 - 0.00902998236331624*G0_4_0_1 + 0.00902998236331623*G0_4_1_0 + 0.496649029982361*G0_5_0_1 - 0.496649029982361*G0_5_1_0; + A[0] = A[16] + 0.237389770723103*G0_0_0_0 + 0.226455026455025*G0_0_0_1 + 0.226455026455025*G0_0_1_0 + 0.226455026455025*G0_0_1_1 - 0.237389770723103*G0_1_0_0 - 0.0109347442680776*G0_1_0_1 - 0.0109347442680776*G0_1_1_0 - 0.0109347442680776*G0_1_1_1 - 0.0109347442680775*G0_2_0_1 - 0.0109347442680775*G0_2_1_0 - 0.0109347442680775*G0_2_1_1 - 0.0437389770723102*G0_3_0_0 + 0.0269841269841268*G0_3_0_1 + 0.0269841269841268*G0_3_1_0 + 0.0269841269841268*G0_3_1_1 + 0.0437389770723102*G0_4_0_0 + 0.0707231040564371*G0_4_0_1 + 0.0707231040564371*G0_4_1_0 + 0.0707231040564371*G0_4_1_1 + 0.0707231040564371*G0_5_0_1 + 0.0707231040564371*G0_5_1_0 + 0.0707231040564371*G0_5_1_1; + A[58] = -A[178] - 0.0135449735449733*G0_0_0_0 - 0.067724867724867*G0_0_0_1 - 0.0225749559082891*G0_1_0_0 + 0.0541798941798938*G0_2_0_0 + 0.0677248677248672*G0_2_0_1 - 1.0384479717813*G0_3_0_0 - 0.722398589065254*G0_3_0_1 - 0.966208112874775*G0_4_0_0 - 0.316049382716048*G0_5_0_0 + 0.722398589065252*G0_5_0_1; + A[28] = 0.0245502645502644*G0_0_0_0 - 0.0126984126984126*G0_0_0_1 - 0.218694885361551*G0_1_0_0 + 0.0372486772486771*G0_2_0_0 + 0.0126984126984127*G0_2_0_1 - 0.062081128747795*G0_3_0_0 - 0.0395061728395059*G0_3_0_1 + 0.156895943562609*G0_4_0_0 - 0.0225749559082892*G0_5_0_0 + 0.0395061728395057*G0_5_0_1; + A[12] = A[28] - 0.243245149911815*G0_0_0_0 - 0.205996472663138*G0_0_0_1 - 0.218694885361551*G0_0_1_0 - 0.218694885361551*G0_0_1_1 + 0.243245149911815*G0_1_0_0 + 0.0372486772486772*G0_1_0_1 + 0.0245502645502644*G0_1_1_0 + 0.0372486772486769*G0_1_1_1 + 0.0118518518518517*G0_2_0_1 + 0.0372486772486771*G0_2_1_0 + 0.0245502645502645*G0_2_1_1 + 0.218977072310404*G0_3_0_0 + 0.196402116402115*G0_3_0_1 + 0.156895943562609*G0_3_1_0 + 0.156895943562609*G0_3_1_1 - 0.218977072310404*G0_4_0_0 - 0.0225749559082892*G0_4_0_1 - 0.0620811287477947*G0_4_1_0 - 0.0225749559082891*G0_4_1_1 - 0.101587301587301*G0_5_0_1 - 0.022574955908289*G0_5_1_0 - 0.0620811287477954*G0_5_1_1; + A[180] = A[12] - 0.0126984126984127*G0_1_0_1 + 0.0126984126984127*G0_1_1_0 + 0.0126984126984126*G0_2_0_1 - 0.0126984126984126*G0_2_1_0 - 0.0395061728395056*G0_4_0_1 + 0.0395061728395056*G0_4_1_0 + 0.0395061728395061*G0_5_0_1 - 0.0395061728395061*G0_5_1_0; + A[131] = -A[86] - 0.00225749559082854*G0_0_1_0 + 0.0293474426807758*G0_0_1_1 - 0.0970723104056445*G0_1_1_0 - 0.248324514991182*G0_1_1_1 - 0.0112874779541445*G0_2_1_1 - 0.0180599647266316*G0_3_1_0 + 0.0632098765432096*G0_3_1_1 + 0.0180599647266314*G0_4_1_0 - 0.0180599647266313*G0_4_1_1 + 0.099329805996472*G0_5_1_0 - 0.153509700176367*G0_5_1_1; + A[84] = -A[131] + 0.00902998236331554*G0_0_0_0 - 0.0225749559082889*G0_0_0_1 - 0.0112874779541445*G0_0_1_0 - 0.0293474426807757*G0_0_1_1 + 0.00902998236331542*G0_1_0_0 + 0.0316049382716043*G0_1_0_1 + 0.0203174603174595*G0_1_1_0 + 0.0135449735449727*G0_1_1_1 - 0.0248324514991181*G0_2_1_1 - 0.00902998236331586*G0_3_0_1 - 0.0541798941798934*G0_3_1_0 - 0.0632098765432096*G0_3_1_1 + 0.00902998236331576*G0_4_0_1 + 0.0541798941798941*G0_4_1_0 - 0.018059964726631*G0_5_0_0 - 0.00902998236331568*G0_5_0_1 - 0.00902998236331532*G0_5_1_0 - 0.0993298059964721*G0_5_1_1; + A[129] = -A[84] + 0.0970723104056433*G0_0_1_0 - 0.151252204585537*G0_0_1_1 + 0.00225749559082852*G0_1_1_0 + 0.0316049382716046*G0_1_1_1 - 0.0112874779541448*G0_2_1_1 - 0.0180599647266306*G0_3_1_0 - 0.0361199294532624*G0_3_1_1 + 0.0180599647266315*G0_4_1_0 + 0.0812698412698412*G0_4_1_1 - 0.0993298059964715*G0_5_1_0 - 0.252839506172838*G0_5_1_1; + A[143] = A[129] + 0.0902998236331568*G0_0_0_1 - 0.0902998236331568*G0_0_1_0 + 0.00677248677248665*G0_1_0_1 - 0.00677248677248665*G0_1_1_0 - 0.00677248677248684*G0_2_0_1 + 0.00677248677248684*G0_2_1_0 - 0.00902998236331549*G0_4_0_1 + 0.00902998236331549*G0_4_1_0 - 0.0812698412698404*G0_5_0_1 + 0.0812698412698404*G0_5_1_0; + A[74] = A[214] - 0.0406349206349204*G0_0_0_1 + 0.0406349206349204*G0_0_1_0 + 0.111746031746031*G0_1_0_1 - 0.111746031746031*G0_1_1_0 - 0.152380952380952*G0_2_0_1 + 0.152380952380952*G0_2_1_0 - 0.270899470899469*G0_3_0_1 + 0.270899470899469*G0_3_1_0 + 0.203174603174603*G0_4_0_1 - 0.203174603174603*G0_4_1_0 + 0.148994708994707*G0_5_0_1 - 0.148994708994707*G0_5_1_0; + A[199] = A[74] - 0.257354497354496*G0_0_0_0 + 0.257354497354496*G0_0_1_1 - 0.135449735449735*G0_1_0_0 - 0.226878306878306*G0_1_0_1 + 0.0372486772486779*G0_1_1_0 - 0.677248677248675*G0_1_1_1 + 0.677248677248674*G0_2_0_0 + 0.226878306878307*G0_2_0_1 - 0.0372486772486761*G0_2_1_0 + 0.135449735449736*G0_2_1_1 + 1.36804232804232*G0_3_0_0 - 1.36804232804232*G0_3_1_1 + 1.34095238095238*G0_4_0_0 + 0.0541798941798954*G0_4_0_1 + 0.10835978835979*G0_4_1_0 - 0.257354497354496*G0_4_1_1 + 0.257354497354497*G0_5_0_0 - 0.0541798941798923*G0_5_0_1 - 0.108359788359786*G0_5_1_0 - 1.34095238095237*G0_5_1_1; + A[202] = A[199] + 0.0744973544973542*G0_0_0_0 - 0.118518518518517*G0_0_0_1 - 0.0812698412698403*G0_0_1_0 - 0.145608465608465*G0_0_1_1 + 0.00677248677248664*G0_1_0_0 + 0.145608465608465*G0_1_0_1 - 0.00677248677248809*G0_1_1_0 + 0.562116402116399*G0_1_1_1 + 0.0338624338624332*G0_2_0_1 + 0.0677248677248661*G0_2_1_0 - 0.111746031746032*G0_2_1_1 + 0.988783068783062*G0_3_0_1 + 0.704338624338618*G0_3_1_0 + 1.50349206349206*G0_3_1_1 - 0.0406349206349205*G0_4_0_1 + 0.108359788359787*G0_4_1_0 + 0.108359788359788*G0_4_1_1 - 0.0812698412698415*G0_5_0_0 + 0.108359788359788*G0_5_0_1 + 0.325079365079362*G0_5_1_0 + 0.826243386243382*G0_5_1_1; + A[163] = A[199] + 0.287830687830686*G0_0_0_0 + 0.138835978835978*G0_0_0_1 - 0.0135449735449732*G0_0_1_0 - 0.0338624338624334*G0_0_1_1 - 0.423280423280421*G0_1_0_0 - 0.423280423280421*G0_1_0_1 - 0.423280423280421*G0_1_1_0 - 0.128677248677249*G0_2_0_0 + 0.0203174603174599*G0_2_0_1 + 0.172698412698411*G0_2_1_0 + 0.0338624338624335*G0_2_1_1 - 0.311534391534391*G0_3_0_0 + 0.474074074074072*G0_3_0_1 + 0.677248677248675*G0_3_1_1 - 0.0406349206349218*G0_4_0_0 - 0.040634920634921*G0_4_0_1 - 0.040634920634922*G0_4_1_0 + 0.108359788359787*G0_5_0_0 - 0.677248677248675*G0_5_0_1 - 0.203174603174604*G0_5_1_0 - 0.677248677248675*G0_5_1_1; + A[192] = -A[163] + 0.697566137566134*G0_0_0_0 + 0.11174603174603*G0_0_0_1 + 0.63322751322751*G0_0_1_1 - 0.575661375661373*G0_1_0_0 - 0.639999999999997*G0_1_0_1 - 0.487619047619045*G0_1_1_0 - 0.866878306878303*G0_1_1_1 - 0.318306878306877*G0_2_0_0 + 0.0304761904761903*G0_2_0_1 + 0.0711111111111108*G0_2_1_0 + 0.016931216931217*G0_2_1_1 + 1.28677248677248*G0_3_0_0 + 0.975238095238091*G0_3_0_1 + 0.772063492063489*G0_3_1_0 + 0.907513227513224*G0_3_1_1 + 3.07470899470898*G0_4_0_0 + 0.690793650793648*G0_4_0_1 + 0.541798941798939*G0_4_1_0 + 1.05650793650793*G0_4_1_1 + 1.42222222222222*G0_5_0_0 + 0.27089947089947*G0_5_1_0 + 1.09714285714285*G0_5_1_1; + A[205] = A[163] - 0.111746031746031*G0_0_0_1 + 0.111746031746031*G0_0_1_0 + 0.152380952380952*G0_1_0_1 - 0.152380952380952*G0_1_1_0 + 0.0406349206349204*G0_2_0_1 - 0.0406349206349204*G0_2_1_0 - 0.203174603174602*G0_3_0_1 + 0.203174603174602*G0_3_1_0 - 0.148994708994709*G0_4_0_1 + 0.148994708994709*G0_4_1_0 + 0.27089947089947*G0_5_0_1 - 0.27089947089947*G0_5_1_0; + A[164] = A[202] + 0.0372486772486771*G0_0_0_0 - 0.0372486772486763*G0_0_1_1 + 0.016931216931217*G0_1_0_0 + 0.115132275132274*G0_1_0_1 + 0.0372486772486776*G0_1_1_0 + 0.115132275132275*G0_1_1_1 - 0.115132275132274*G0_2_0_0 - 0.115132275132274*G0_2_0_1 - 0.0372486772486763*G0_2_1_0 - 0.0169312169312166*G0_2_1_1 + 0.135449735449737*G0_3_0_0 - 0.135449735449734*G0_3_1_1 - 0.514708994708993*G0_4_0_0 + 0.094814814814814*G0_4_0_1 + 0.108359788359789*G0_4_1_0 + 0.0677248677248674*G0_4_1_1 - 0.0677248677248673*G0_5_0_0 - 0.0948148148148139*G0_5_0_1 - 0.108359788359786*G0_5_1_0 + 0.514708994708992*G0_5_1_1; + A[72] = A[202] + 0.0203174603174604*G0_0_0_0 + 0.098201058201058*G0_0_0_1 + 0.0203174603174602*G0_0_1_0 - 0.0169312169312156*G0_0_1_1 - 0.0203174603174604*G0_1_0_0 + 0.0778835978835977*G0_1_1_0 + 0.115132275132275*G0_1_1_1 - 0.0372486772486765*G0_2_0_1 - 0.0372486772486763*G0_2_1_0 - 0.0372486772486765*G0_2_1_1 + 0.650158730158727*G0_3_0_0 + 0.609523809523807*G0_3_0_1 + 0.62306878306878*G0_3_1_0 + 0.514708994708992*G0_3_1_1 - 0.650158730158729*G0_4_0_0 - 0.0270899470899473*G0_4_0_1 - 0.0406349206349219*G0_4_1_0 + 0.0677248677248676*G0_4_1_1 - 0.135449735449734*G0_5_0_1 - 0.135449735449734*G0_5_1_0 - 0.135449735449733*G0_5_1_1; + A[117] = A[72] - 0.00677248677248699*G0_0_0_0 - 0.0135449735449739*G0_0_0_1 + 0.138835978835979*G0_0_1_0 - 0.430052910052908*G0_0_1_1 - 0.074497354497354*G0_1_0_0 - 0.155767195767194*G0_1_0_1 - 0.193015873015872*G0_1_1_0 - 0.128677248677248*G0_1_1_1 + 0.0677248677248676*G0_2_0_1 + 0.0338624338624336*G0_2_1_0 + 0.213333333333332*G0_2_1_1 + 0.108359788359789*G0_3_0_1 - 0.040634920634919*G0_3_1_0 - 0.0406349206349196*G0_3_1_1 + 0.704338624338621*G0_4_0_1 + 0.988783068783066*G0_4_1_0 + 0.18962962962963*G0_4_1_1 + 0.0812698412698412*G0_5_0_0 + 0.406349206349204*G0_5_0_1 + 0.18962962962963*G0_5_1_0 - 0.31153439153439*G0_5_1_1; + A[187] = A[117] + 0.152380952380952*G0_0_0_1 - 0.152380952380952*G0_0_1_0 + 0.0406349206349203*G0_1_0_1 - 0.0406349206349203*G0_1_1_0 - 0.111746031746032*G0_2_0_1 + 0.111746031746032*G0_2_1_0 - 0.148994708994709*G0_3_0_1 + 0.148994708994709*G0_3_1_0 + 0.270899470899469*G0_4_0_1 - 0.270899470899469*G0_4_1_0 - 0.203174603174602*G0_5_0_1 + 0.203174603174602*G0_5_1_0; + A[160] = A[164] + 0.435132275132274*G0_0_0_0 - 0.0533333333333334*G0_0_0_1 - 0.13121693121693*G0_0_1_0 - 0.115978835978836*G0_0_1_1 + 0.435132275132274*G0_1_0_0 + 0.488465608465606*G0_1_0_1 + 0.566349206349204*G0_1_1_0 + 0.503703703703701*G0_1_1_1 - 0.217566137566137*G0_2_0_0 - 0.108783068783068*G0_2_0_1 - 0.108783068783068*G0_2_1_0 - 0.170158730158729*G0_2_1_1 + 0.585820105820102*G0_3_0_0 + 0.572275132275128*G0_3_0_1 + 0.585820105820102*G0_3_1_0 + 0.790687830687826*G0_3_1_1 + 0.585820105820102*G0_4_0_0 + 0.0135449735449733*G0_4_0_1 + 0.218412698412698*G0_4_1_1 + 1.23597883597883*G0_5_0_0 + 0.617989417989415*G0_5_0_1 + 0.617989417989415*G0_5_1_0 + 0.817777777777774*G0_5_1_1; + A[184] = A[72] + 0.0778835978835975*G0_1_0_1 - 0.0778835978835975*G0_1_1_0 - 0.0778835978835976*G0_2_0_1 + 0.0778835978835975*G0_2_1_0 - 0.0135449735449748*G0_4_0_1 + 0.0135449735449748*G0_4_1_0 + 0.0135449735449719*G0_5_0_1 - 0.0135449735449718*G0_5_1_0; + A[73] = A[199] + 0.0406349206349202*G0_0_0_1 - 0.0406349206349201*G0_0_1_0 + 0.152380952380952*G0_1_0_1 - 0.152380952380952*G0_1_1_0 - 0.111746031746031*G0_2_0_1 + 0.111746031746031*G0_2_1_0 + 0.27089947089947*G0_3_0_1 - 0.27089947089947*G0_3_1_0 - 0.148994708994708*G0_4_0_1 + 0.148994708994708*G0_4_1_0 - 0.203174603174601*G0_5_0_1 + 0.203174603174601*G0_5_1_0; + A[119] = A[205] - 0.0643386243386236*G0_0_0_0 + 0.0643386243386248*G0_0_1_1 + 0.59259259259259*G0_1_0_0 + 0.558730158730156*G0_1_0_1 + 0.670476190476187*G0_1_1_0 + 0.548571428571426*G0_1_1_1 - 0.548571428571428*G0_2_0_0 - 0.558730158730156*G0_2_0_1 - 0.670476190476189*G0_2_1_0 - 0.59259259259259*G0_2_1_1 - 0.379259259259259*G0_3_0_0 + 0.379259259259257*G0_3_1_1 - 1.97756613756613*G0_4_0_0 - 0.270899470899468*G0_4_0_1 - 0.690793650793649*G0_4_1_0 + 0.365714285714284*G0_4_1_1 - 0.365714285714284*G0_5_0_0 + 0.27089947089947*G0_5_0_1 + 0.690793650793648*G0_5_1_0 + 1.97756613756613*G0_5_1_1; + A[110] = -A[119] + 0.15689594356261*G0_0_0_0 + 0.0660317460317456*G0_0_0_1 + 0.183985890652558*G0_0_1_0 + 0.201481481481482*G0_0_1_1 + 0.123033509700176*G0_1_0_0 + 0.104973544973544*G0_1_0_1 + 0.0761904761904758*G0_1_1_0 + 0.0507936507936472*G0_2_0_0 - 0.135449735449735*G0_2_0_1 - 0.0959435626102313*G0_2_1_0 - 0.201481481481481*G0_2_1_1 - 0.598236331569663*G0_3_0_0 - 0.487619047619046*G0_3_0_1 - 0.419894179894178*G0_3_1_0 - 0.29121693121693*G0_3_1_1 - 1.63668430335097*G0_4_0_0 - 0.5621164021164*G0_4_0_1 - 0.900740740740739*G0_4_1_0 - 0.178342151675485*G0_5_0_0 - 0.196402116402116*G0_5_0_1 - 0.0541798941798936*G0_5_1_0 + 0.29121693121693*G0_5_1_1; + A[65] = -A[110] + 0.0677248677248675*G0_0_0_0 - 0.0270899470899468*G0_0_0_1 + 0.0389417989417989*G0_0_1_0 + 0.0491005291005293*G0_0_1_1 - 0.0677248677248674*G0_1_0_0 - 0.162539682539682*G0_1_0_1 - 0.0287830687830683*G0_1_1_0 - 0.294603174603174*G0_1_1_1 + 0.338624338624337*G0_2_0_1 + 0.332980599647265*G0_2_1_0 + 0.194708994708994*G0_2_1_1 + 0.361199294532627*G0_3_0_0 + 1.08359788359788*G0_3_0_1 + 0.112874779541446*G0_3_1_0 + 0.148994708994708*G0_3_1_1 - 0.361199294532626*G0_4_0_0 - 0.248324514991181*G0_4_1_0 - 0.25058201058201*G0_4_1_1 + 0.0541798941798945*G0_5_0_1 - 0.038377425044091*G0_5_1_0 - 0.406349206349204*G0_5_1_1; + A[113] = -A[110] + 0.115696649029982*G0_0_0_1 - 0.199223985890651*G0_0_1_1 + 0.0479717813051142*G0_1_0_1 + 0.125291005291005*G0_1_1_1 - 0.389417989417988*G0_2_0_1 - 0.335802469135801*G0_2_1_1 - 0.0451499118165793*G0_3_0_1 - 0.16931216931217*G0_3_1_1 - 0.767548500881833*G0_4_0_1 - 0.812698412698411*G0_4_1_1 - 0.0790123456790127*G0_5_0_1 - 0.453756613756612*G0_5_1_1; + A[97] = A[113] - 0.00564373897707191*G0_0_0_0 - 0.188500881834215*G0_0_0_1 + 0.130934744268078*G0_0_1_0 - 0.356684303350968*G0_0_1_1 + 0.00112874779541458*G0_1_0_0 + 0.00112874779541459*G0_1_0_1 + 0.00112874779541447*G0_1_1_0 + 0.304761904761902*G0_2_0_0 + 0.487619047619045*G0_2_0_1 + 0.168183421516753*G0_2_1_0 + 0.356684303350968*G0_2_1_1 + 0.00451499118165716*G0_3_0_0 + 0.0451499118165785*G0_3_0_1 - 0.0496649029982366*G0_3_1_0 + 0.0541798941798941*G0_3_1_1 - 0.139964726631394*G0_4_0_0 - 0.139964726631392*G0_4_0_1 - 0.139964726631393*G0_4_1_0 - 0.0632098765432096*G0_5_0_0 - 0.103844797178131*G0_5_0_1 - 0.00902998236331546*G0_5_1_0 - 0.0541798941798939*G0_5_1_1; + A[111] = A[97] + 0.197530864197531*G0_0_0_1 - 0.197530864197531*G0_0_1_0 - 0.0598236331569664*G0_1_0_1 + 0.0598236331569664*G0_1_1_0 - 0.121904761904762*G0_2_0_1 + 0.121904761904762*G0_2_1_0 + 0.0857848324514988*G0_3_0_1 - 0.0857848324514988*G0_3_1_0 + 0.835273368606698*G0_4_0_1 - 0.835273368606698*G0_4_1_0 + 0.180599647266314*G0_5_0_1 - 0.180599647266314*G0_5_1_0; + A[159] = A[97] - 0.530511463844795*G0_0_0_0 + 0.530511463844795*G0_0_1_1 - 0.248324514991181*G0_1_0_0 - 0.269206349206348*G0_1_0_1 - 0.331287477954143*G0_1_1_0 - 0.419894179894177*G0_1_1_1 + 0.419894179894177*G0_2_0_0 + 0.269206349206347*G0_2_0_1 + 0.331287477954143*G0_2_1_0 + 0.24832451499118*G0_2_1_1 - 0.0474074074074071*G0_3_0_0 + 0.0474074074074072*G0_3_1_1 - 0.318306878306876*G0_4_0_0 + 0.629841269841267*G0_4_0_1 - 0.024832451499118*G0_4_1_0 + 0.5621164021164*G0_4_1_1 - 0.562116402116399*G0_5_0_0 - 0.629841269841265*G0_5_0_1 + 0.0248324514991176*G0_5_1_0 + 0.318306878306877*G0_5_1_1; + A[79] = A[65] + 0.0598236331569661*G0_0_0_1 - 0.0598236331569661*G0_0_1_0 + 0.121904761904761*G0_1_0_1 - 0.121904761904761*G0_1_1_0 - 0.19753086419753*G0_2_0_1 + 0.19753086419753*G0_2_1_0 - 0.835273368606698*G0_3_0_1 + 0.835273368606698*G0_3_1_0 - 0.180599647266313*G0_4_0_1 + 0.180599647266313*G0_4_1_0 - 0.0857848324514992*G0_5_0_1 + 0.0857848324514992*G0_5_1_0; + A[82] = A[110] + 0.00620811287477947*G0_0_0_1 - 0.00620811287477948*G0_0_1_0 + 0.0118518518518521*G0_1_0_1 - 0.0118518518518521*G0_1_1_0 + 0.191887125220457*G0_2_0_1 - 0.191887125220457*G0_2_1_0 - 0.135449735449734*G0_3_0_1 + 0.135449735449734*G0_3_1_0 - 0.0677248677248672*G0_4_0_1 + 0.0677248677248672*G0_4_1_0 - 0.00677248677248626*G0_5_0_1 + 0.00677248677248626*G0_5_1_0; + A[153] = A[82] - 0.0197530864197533*G0_0_0_0 + 0.0197530864197526*G0_0_1_1 + 0.268077601410933*G0_1_0_0 + 0.498342151675483*G0_1_0_1 + 0.318306878306876*G0_1_1_0 + 0.599365079365076*G0_1_1_1 - 0.599365079365075*G0_2_0_0 - 0.498342151675482*G0_2_0_1 - 0.318306878306876*G0_2_1_0 - 0.268077601410933*G0_2_1_1 - 0.072239858906525*G0_3_0_0 + 0.0722398589065261*G0_3_1_1 - 0.0496649029982349*G0_4_0_0 + 0.155767195767196*G0_4_0_1 + 0.0948148148148157*G0_4_1_0 + 0.187372134038801*G0_4_1_1 - 0.1873721340388*G0_5_0_0 - 0.155767195767195*G0_5_0_1 - 0.0948148148148139*G0_5_1_0 + 0.0496649029982367*G0_5_1_1; + A[68] = -A[65] - 0.0479717813051141*G0_0_0_1 + 0.0773192239858908*G0_0_1_1 - 0.115696649029982*G0_1_0_1 - 0.314920634920635*G0_1_1_1 + 0.389417989417987*G0_2_0_1 + 0.0536155202821864*G0_2_1_1 + 0.767548500881831*G0_3_0_1 - 0.0451499118165787*G0_3_1_1 + 0.0451499118165779*G0_4_0_1 - 0.124162257495591*G0_4_1_1 + 0.0790123456790133*G0_5_0_1 - 0.374744268077599*G0_5_1_1; + A[169] = A[68] + 0.0761904761904756*G0_0_0_0 - 0.0761904761904763*G0_0_1_1 + 0.0592592592592585*G0_1_0_0 + 0.322257495590828*G0_1_0_1 + 0.136578483245149*G0_1_1_0 + 0.619682539682538*G0_1_1_1 - 0.619682539682534*G0_2_0_0 - 0.322257495590826*G0_2_0_1 - 0.136578483245148*G0_2_1_0 - 0.0592592592592582*G0_2_1_1 + 0.0948148148148155*G0_3_0_0 - 0.0948148148148134*G0_3_1_1 - 0.379259259259256*G0_4_0_0 + 0.074497354497355*G0_4_0_1 - 0.0541798941798937*G0_4_1_0 + 0.0609523809523812*G0_4_1_1 - 0.0609523809523805*G0_5_0_0 - 0.0744973544973543*G0_5_0_1 + 0.0541798941798939*G0_5_1_0 + 0.379259259259257*G0_5_1_1; + A[71] = A[169] - 0.0118518518518518*G0_0_0_1 + 0.0118518518518518*G0_0_1_0 - 0.191887125220459*G0_1_0_1 + 0.191887125220459*G0_1_1_0 - 0.00620811287477953*G0_2_0_1 + 0.00620811287477953*G0_2_1_0 + 0.0677248677248668*G0_3_0_1 - 0.0677248677248668*G0_3_1_0 + 0.0067724867724867*G0_4_0_1 - 0.0067724867724867*G0_4_1_0 + 0.135449735449734*G0_5_0_1 - 0.135449735449734*G0_5_1_0; + A[55] = A[153] - 0.0062081128747793*G0_0_0_1 + 0.0062081128747793*G0_0_1_0 - 0.191887125220459*G0_1_0_1 + 0.191887125220459*G0_1_1_0 - 0.0118518518518516*G0_2_0_1 + 0.0118518518518516*G0_2_1_0 + 0.135449735449734*G0_3_0_1 - 0.135449735449734*G0_3_1_0 + 0.006772486772487*G0_4_0_1 - 0.00677248677248699*G0_4_1_0 + 0.067724867724867*G0_5_0_1 - 0.067724867724867*G0_5_1_0; + A[175] = -A[55] - 0.199223985890652*G0_0_0_0 + 0.115696649029982*G0_0_0_1 - 0.335802469135802*G0_1_0_0 - 0.389417989417988*G0_1_0_1 + 0.125291005291005*G0_2_0_0 + 0.0479717813051145*G0_2_0_1 - 0.169312169312169*G0_3_0_0 - 0.0451499118165785*G0_3_0_1 - 0.453756613756611*G0_4_0_0 - 0.0790123456790118*G0_4_0_1 - 0.812698412698409*G0_5_0_0 - 0.767548500881831*G0_5_0_1; + A[220] = A[164] + 0.0778835978835968*G0_0_0_1 - 0.0778835978835968*G0_0_1_0 - 0.0778835978835974*G0_1_0_1 + 0.0778835978835974*G0_1_1_0 - 0.0135449735449737*G0_3_0_1 + 0.0135449735449737*G0_3_1_0 + 0.0135449735449746*G0_4_0_1 - 0.0135449735449746*G0_4_1_0; + A[127] = A[113] - 0.121904761904762*G0_0_0_1 + 0.121904761904762*G0_0_1_0 - 0.0598236331569663*G0_1_0_1 + 0.0598236331569663*G0_1_1_0 + 0.197530864197531*G0_2_0_1 - 0.197530864197531*G0_2_1_0 + 0.180599647266314*G0_3_0_1 - 0.180599647266314*G0_3_1_0 + 0.8352733686067*G0_4_0_1 - 0.8352733686067*G0_4_1_0 + 0.0857848324514989*G0_5_0_1 - 0.0857848324514989*G0_5_1_0; + A[118] = A[202] + 0.0778835978835974*G0_0_0_1 - 0.0778835978835973*G0_0_1_0 - 0.0778835978835977*G0_2_0_1 + 0.0778835978835978*G0_2_1_0 - 0.0135449735449738*G0_3_0_1 + 0.0135449735449738*G0_3_1_0 + 0.0135449735449726*G0_5_0_1 - 0.0135449735449727*G0_5_1_0; + A[217] = A[119] + 0.111746031746033*G0_0_0_1 - 0.111746031746033*G0_0_1_0 - 0.0406349206349207*G0_1_0_1 + 0.0406349206349207*G0_1_1_0 - 0.152380952380953*G0_2_0_1 + 0.152380952380953*G0_2_1_0 + 0.203174603174602*G0_3_0_1 - 0.203174603174602*G0_3_1_0 - 0.270899470899472*G0_4_0_1 + 0.270899470899472*G0_4_1_0 + 0.148994708994709*G0_5_0_1 - 0.148994708994709*G0_5_1_0; + A[49] = -A[169] + 0.0773192239858902*G0_0_0_0 - 0.0479717813051144*G0_0_0_1 + 0.0536155202821864*G0_1_0_0 + 0.389417989417989*G0_1_0_1 - 0.314920634920633*G0_2_0_0 - 0.115696649029982*G0_2_0_1 - 0.0451499118165789*G0_3_0_0 + 0.767548500881832*G0_3_0_1 - 0.374744268077599*G0_4_0_0 + 0.079012345679012*G0_4_0_1 - 0.12416225749559*G0_5_0_0 + 0.0451499118165792*G0_5_0_1; + A[124] = -A[79] - 0.0479717813051141*G0_0_1_0 + 0.0773192239858908*G0_0_1_1 - 0.115696649029982*G0_1_1_0 - 0.314920634920635*G0_1_1_1 + 0.389417989417987*G0_2_1_0 + 0.0536155202821864*G0_2_1_1 + 0.767548500881831*G0_3_1_0 - 0.0451499118165787*G0_3_1_1 + 0.0451499118165779*G0_4_1_0 - 0.124162257495591*G0_4_1_1 + 0.0790123456790133*G0_5_1_0 - 0.374744268077599*G0_5_1_1; + A[161] = -A[153] - 0.199223985890652*G0_0_0_0 + 0.115696649029982*G0_0_1_0 - 0.335802469135802*G0_1_0_0 - 0.389417989417988*G0_1_1_0 + 0.125291005291005*G0_2_0_0 + 0.0479717813051145*G0_2_1_0 - 0.169312169312169*G0_3_0_0 - 0.0451499118165785*G0_3_1_0 - 0.453756613756611*G0_4_0_0 - 0.0790123456790118*G0_4_1_0 - 0.812698412698409*G0_5_0_0 - 0.767548500881831*G0_5_1_0; + A[112] = A[160] - 0.588359788359786*G0_0_0_0 + 0.588359788359785*G0_0_1_1 - 0.62222222222222*G0_1_0_0 - 0.712380952380949*G0_1_0_1 - 0.712380952380949*G0_1_1_0 - 0.836402116402112*G0_1_1_1 + 0.836402116402112*G0_2_0_0 + 0.712380952380949*G0_2_0_1 + 0.712380952380949*G0_2_1_0 + 0.622222222222219*G0_2_1_1 + 0.0694179894179894*G0_3_0_0 - 0.0694179894179889*G0_3_1_1 + 0.746666666666666*G0_4_0_0 + 0.509629629629629*G0_4_0_1 + 0.509629629629629*G0_4_1_0 + 0.949841269841266*G0_4_1_1 - 0.949841269841265*G0_5_0_0 - 0.509629629629628*G0_5_0_1 - 0.509629629629628*G0_5_1_0 - 0.746666666666663*G0_5_1_1; + A[64] = A[160] - 0.622222222222219*G0_0_0_0 + 0.0901587301587298*G0_0_0_1 + 0.0901587301587298*G0_0_1_0 - 0.0338624338624335*G0_0_1_1 - 0.588359788359786*G0_1_0_0 - 0.588359788359786*G0_1_0_1 - 0.588359788359786*G0_1_1_0 + 0.836402116402111*G0_2_0_0 + 0.124021164021163*G0_2_0_1 + 0.124021164021163*G0_2_1_0 + 0.0338624338624334*G0_2_1_1 + 0.746666666666663*G0_3_0_0 + 0.237037037037036*G0_3_0_1 + 0.237037037037036*G0_3_1_0 + 0.677248677248675*G0_3_1_1 + 0.0694179894179893*G0_4_0_0 + 0.0694179894179891*G0_4_0_1 + 0.069417989417989*G0_4_1_0 - 0.949841269841265*G0_5_0_0 - 0.440211640211639*G0_5_0_1 - 0.440211640211639*G0_5_1_0 - 0.677248677248674*G0_5_1_1; + A[162] = A[187] - 0.423280423280421*G0_0_0_0 + 0.423280423280421*G0_0_1_1 + 0.287830687830687*G0_1_0_0 + 0.148994708994708*G0_1_0_1 + 0.30137566137566*G0_1_1_0 + 0.128677248677248*G0_1_1_1 - 0.128677248677249*G0_2_0_0 - 0.148994708994708*G0_2_0_1 - 0.301375661375661*G0_2_1_0 - 0.287830687830687*G0_2_1_1 - 0.0406349206349215*G0_3_0_0 + 0.0406349206349192*G0_3_1_1 - 0.311534391534388*G0_4_0_0 - 0.785608465608462*G0_4_0_1 - 0.31153439153439*G0_4_1_0 - 0.108359788359789*G0_4_1_1 + 0.108359788359788*G0_5_0_0 + 0.78560846560846*G0_5_0_1 + 0.31153439153439*G0_5_1_0 + 0.311534391534389*G0_5_1_1; + A[190] = A[162] - 0.152380952380951*G0_0_0_1 + 0.152380952380951*G0_0_1_0 + 0.111746031746031*G0_1_0_1 - 0.111746031746031*G0_1_1_0 - 0.0406349206349206*G0_2_0_1 + 0.0406349206349206*G0_2_1_0 + 0.148994708994708*G0_3_0_1 - 0.148994708994708*G0_3_1_0 + 0.203174603174603*G0_4_0_1 - 0.203174603174603*G0_4_1_0 - 0.270899470899467*G0_5_0_1 + 0.270899470899467*G0_5_1_0; + A[40] = -0.0053262786596119*G0_0_1_0 - 0.00384479717813048*G0_0_1_1 + 0.0053262786596119*G0_1_1_0 + 0.00148148148148138*G0_1_1_1 - 0.0051146384479717*G0_2_1_1 - 0.000423280423280402*G0_3_1_0 - 0.00479717813051135*G0_3_1_1 + 0.00042328042328041*G0_4_1_0 - 0.00437389770723098*G0_4_1_1 + 0.0589770723104055*G0_5_1_1; + A[145] = A[159] + 0.197530864197529*G0_0_0_1 - 0.197530864197529*G0_0_1_0 - 0.121904761904761*G0_1_0_1 + 0.121904761904761*G0_1_1_0 - 0.0598236331569662*G0_2_0_1 + 0.0598236331569662*G0_2_1_0 + 0.0857848324514987*G0_3_0_1 - 0.0857848324514987*G0_3_1_0 + 0.180599647266313*G0_4_0_1 - 0.180599647266313*G0_4_1_0 + 0.835273368606697*G0_5_0_1 - 0.835273368606697*G0_5_1_0; + A[151] = -A[61] + 0.042116402116402*G0_0_0_0 + 0.0126984126984126*G0_0_1_0 + 0.161552028218695*G0_1_0_0 + 0.0294179894179892*G0_2_0_0 - 0.0126984126984126*G0_2_1_0 + 0.0895943562610225*G0_3_0_0 + 0.0395061728395058*G0_3_1_0 + 0.137283950617283*G0_4_0_0 + 0.0500881834215169*G0_5_0_0 - 0.0395061728395058*G0_5_1_0; + A[102] = A[186] - 0.248324514991179*G0_0_0_1 + 0.248324514991179*G0_0_1_0 + 0.0270899470899466*G0_1_0_1 - 0.0270899470899466*G0_1_1_0 - 0.0406349206349206*G0_2_0_1 + 0.0406349206349206*G0_2_1_0 - 0.00902998236331615*G0_3_0_1 + 0.00902998236331615*G0_3_1_0 + 0.496649029982362*G0_4_0_1 - 0.496649029982362*G0_4_1_0 - 0.22574955908289*G0_5_0_1 + 0.22574955908289*G0_5_1_0; + A[189] = A[102] + 0.925573192239854*G0_0_0_0 - 0.925573192239854*G0_0_1_1 - 0.203174603174602*G0_1_0_0 - 0.121904761904761*G0_1_0_1 - 0.0541798941798941*G0_1_1_0 + 0.162539682539682*G0_1_1_1 - 0.162539682539682*G0_2_0_0 + 0.121904761904761*G0_2_0_1 + 0.0541798941798939*G0_2_1_0 + 0.203174603174602*G0_2_1_1 + 0.117389770723104*G0_3_0_0 - 0.117389770723104*G0_3_1_1 + 1.56218694885361*G0_4_0_0 - 0.108359788359788*G0_4_0_1 + 0.614038800705465*G0_4_1_0 - 0.334109347442679*G0_4_1_1 + 0.334109347442679*G0_5_0_0 + 0.108359788359787*G0_5_0_1 - 0.614038800705463*G0_5_1_0 - 1.56218694885361*G0_5_1_1; + A[147] = A[189] + 0.248324514991181*G0_0_0_1 - 0.248324514991181*G0_0_1_0 + 0.0406349206349203*G0_1_0_1 - 0.0406349206349203*G0_1_1_0 - 0.027089947089947*G0_2_0_1 + 0.027089947089947*G0_2_1_0 + 0.0090299823633162*G0_3_0_1 - 0.0090299823633162*G0_3_1_0 + 0.225749559082892*G0_4_0_1 - 0.225749559082892*G0_4_1_0 - 0.49664902998236*G0_5_0_1 + 0.49664902998236*G0_5_1_0; + A[177] = A[191] - 0.0406349206349202*G0_0_0_1 + 0.0406349206349202*G0_0_1_0 + 0.0677248677248677*G0_1_0_1 - 0.0677248677248677*G0_1_1_0 + 0.0270899470899478*G0_3_0_1 - 0.0270899470899478*G0_3_1_0 + 0.0632098765432102*G0_4_0_1 - 0.0632098765432102*G0_4_1_0 - 0.117389770723102*G0_5_0_1 + 0.117389770723102*G0_5_1_0; + A[57] = -A[177] + 0.266384479717811*G0_0_0_0 - 0.0586948853615515*G0_0_0_1 - 0.0677248677248679*G0_1_0_0 - 0.108359788359787*G0_2_0_0 - 0.0135449735449736*G0_2_0_1 + 0.261869488536154*G0_3_0_0 + 0.180599647266314*G0_3_0_1 + 0.76754850088183*G0_4_0_0 + 0.0722398589065259*G0_4_0_1 - 0.171569664902998*G0_5_0_0 - 0.180599647266312*G0_5_0_1; + A[114] = A[142] + 0.191887125220458*G0_0_0_1 - 0.191887125220458*G0_0_1_0 + 0.0118518518518518*G0_1_0_1 - 0.0118518518518518*G0_1_1_0 + 0.00620811287477932*G0_2_0_1 - 0.00620811287477932*G0_2_1_0 - 0.00677248677248699*G0_3_0_1 + 0.00677248677248699*G0_3_1_0 - 0.0677248677248673*G0_4_0_1 + 0.0677248677248673*G0_4_1_0 - 0.135449735449734*G0_5_0_1 + 0.135449735449734*G0_5_1_0; + A[221] = -A[213] - 0.0948148148148142*G0_0_0_0 + 0.0135449735449731*G0_0_1_0 - 0.0677248677248677*G0_1_0_0 + 0.325079365079363*G0_2_0_0 + 0.0586948853615519*G0_2_1_0 + 0.00902998236331527*G0_3_0_0 + 0.180599647266314*G0_3_1_0 + 0.695308641975304*G0_4_0_0 - 0.0722398589065256*G0_4_1_0 + 0.0812698412698406*G0_5_0_0 - 0.180599647266313*G0_5_1_0; + A[196] = A[28] + 0.0126984126984126*G0_0_0_1 - 0.0126984126984126*G0_0_1_0 - 0.0126984126984127*G0_2_0_1 + 0.0126984126984127*G0_2_1_0 + 0.0395061728395059*G0_3_0_1 - 0.0395061728395059*G0_3_1_0 - 0.0395061728395057*G0_5_0_1 + 0.0395061728395057*G0_5_1_0; + A[209] = A[223] - 0.054179894179894*G0_0_0_1 + 0.054179894179894*G0_0_1_0 - 0.189629629629629*G0_1_0_1 + 0.189629629629629*G0_1_1_0 - 0.189629629629628*G0_2_0_1 + 0.189629629629628*G0_2_1_0 - 0.216719576719577*G0_3_0_1 + 0.216719576719577*G0_3_1_0 + 0.325079365079365*G0_4_0_1 - 0.325079365079365*G0_4_1_0 + 0.325079365079365*G0_5_0_1 - 0.325079365079365*G0_5_1_0; + A[13] = A[195] - 0.0189065255731922*G0_1_0_1 + 0.0189065255731922*G0_1_1_0 + 0.000846560846560917*G0_2_0_1 - 0.000846560846560922*G0_2_1_0 + 0.0180599647266311*G0_3_0_1 - 0.0180599647266311*G0_3_1_0 - 0.0056437389770722*G0_4_0_1 + 0.0056437389770722*G0_4_1_0 + 0.0056437389770721*G0_5_0_1 - 0.0056437389770721*G0_5_1_0; + A[53] = A[123] - 0.00677248677248656*G0_0_0_1 + 0.00677248677248656*G0_0_1_0 + 0.00677248677248634*G0_1_0_1 - 0.00677248677248634*G0_1_1_0 - 0.0902998236331568*G0_2_0_1 + 0.0902998236331568*G0_2_1_0 + 0.0090299823633149*G0_3_0_1 - 0.0090299823633149*G0_3_1_0 + 0.081269841269841*G0_4_0_1 - 0.081269841269841*G0_4_1_0; + A[30] = -A[31] + 0.0247971781305114*G0_0_1_0 + 0.0206349206349206*G0_0_1_1 - 0.0247971781305115*G0_1_1_0 - 0.00416225749559085*G0_1_1_1 + 0.0206349206349207*G0_2_1_1 + 0.00832451499118159*G0_3_1_0 + 0.00927689594356262*G0_3_1_1 - 0.00832451499118159*G0_4_1_0 + 0.000952380952381002*G0_4_1_1 + 0.00927689594356256*G0_5_1_1; + A[23] = A[21] - 0.0310405643738975*G0_0_0_0 + 0.0191887125220459*G0_0_0_1 + 0.0502292768959433*G0_2_0_0 + 0.0191887125220457*G0_2_0_1 - 0.00790123456790113*G0_3_0_0 - 0.0191887125220456*G0_4_0_0 - 0.0383774250440915*G0_4_0_1 + 0.00790123456790123*G0_5_0_0; + A[20] = -A[23] - 0.0138271604938272*G0_0_0_1 + 0.108641975308642*G0_1_0_1 + 0.0253968253968252*G0_2_0_1 + 0.0355555555555554*G0_3_0_1 - 0.00733686067019413*G0_4_0_1 + 0.0547442680776013*G0_5_0_1; + A[5] = -A[20] - 0.00395061728395054*G0_0_0_0 - 0.0214462081128745*G0_0_0_1 - 0.00776014109347436*G0_0_1_0 - 0.00776014109347425*G0_0_1_1 + 0.00395061728395047*G0_1_0_0 + 0.104973544973545*G0_1_0_1 - 0.00380952380952379*G0_1_1_0 - 0.00366843033509682*G0_1_1_1 + 0.0332980599647263*G0_2_0_1 + 0.0465608465608467*G0_2_1_0 + 0.0272310405643737*G0_2_1_1 + 0.0428924162257492*G0_3_0_0 + 0.0857848324514984*G0_3_0_1 + 0.027089947089947*G0_3_1_0 + 0.0462786596119925*G0_3_1_1 - 0.0428924162257493*G0_4_0_0 - 0.0158024691358023*G0_4_1_0 - 0.0118518518518518*G0_4_1_1 + 0.0428924162257494*G0_5_0_1 - 0.00395061728395056*G0_5_1_0 - 0.00790123456790104*G0_5_1_1; + A[8] = -A[5] - 0.108641975308641*G0_0_0_1 - 0.108641975308641*G0_0_1_1 + 0.0138271604938272*G0_1_0_1 + 0.0138271604938273*G0_1_1_1 - 0.0253968253968254*G0_2_0_1 - 0.0253968253968255*G0_2_1_1 + 0.00733686067019371*G0_3_0_1 + 0.00733686067019363*G0_3_1_1 - 0.0355555555555554*G0_4_0_1 - 0.0355555555555555*G0_4_1_1 - 0.0547442680776012*G0_5_0_1 - 0.0547442680776011*G0_5_1_1; + A[45] = A[5] + 0.0310405643738975*G0_1_0_0 + 0.0308994708994705*G0_1_0_1 + 0.0503703703703702*G0_1_1_0 + 0.0502292768959432*G0_1_1_1 - 0.0502292768959432*G0_2_0_0 - 0.0308994708994705*G0_2_0_1 - 0.0503703703703704*G0_2_1_0 - 0.0310405643738975*G0_2_1_1 + 0.0191887125220457*G0_3_0_0 - 0.0191887125220457*G0_3_1_1 + 0.00790123456790125*G0_4_0_0 + 0.00395061728395067*G0_4_0_1 + 0.0118518518518517*G0_4_1_0 + 0.00790123456790121*G0_4_1_1 - 0.00790123456790126*G0_5_0_0 - 0.00395061728395068*G0_5_0_1 - 0.0118518518518518*G0_5_1_0 - 0.00790123456790124*G0_5_1_1; + A[165] = -A[45] - 0.108641975308642*G0_0_0_0 - 0.108641975308642*G0_0_0_1 - 0.0253968253968254*G0_1_0_0 - 0.0253968253968253*G0_1_0_1 + 0.0138271604938272*G0_2_0_0 + 0.0138271604938272*G0_2_0_1 + 0.00733686067019391*G0_3_0_0 + 0.00733686067019386*G0_3_0_1 - 0.0547442680776011*G0_4_0_0 - 0.0547442680776011*G0_4_0_1 - 0.0355555555555556*G0_5_0_0 - 0.0355555555555555*G0_5_0_1; + A[75] = A[5] - 0.000141093474426915*G0_1_0_1 + 0.000141093474426914*G0_1_1_0 + 0.0193298059964729*G0_2_0_1 - 0.0193298059964729*G0_2_1_0 - 0.0191887125220455*G0_3_0_1 + 0.0191887125220455*G0_3_1_0 - 0.00395061728395055*G0_4_0_1 + 0.00395061728395055*G0_4_1_0 + 0.00395061728395058*G0_5_0_1 - 0.00395061728395059*G0_5_1_0; + A[120] = -A[75] - 0.108641975308641*G0_0_1_0 - 0.108641975308641*G0_0_1_1 + 0.0138271604938272*G0_1_1_0 + 0.0138271604938272*G0_1_1_1 - 0.0253968253968254*G0_2_1_0 - 0.0253968253968255*G0_2_1_1 + 0.00733686067019369*G0_3_1_0 + 0.00733686067019363*G0_3_1_1 - 0.0355555555555554*G0_4_1_0 - 0.0355555555555555*G0_4_1_1 - 0.0547442680776012*G0_5_1_0 - 0.0547442680776011*G0_5_1_1; + A[24] = -A[20] - 0.0488183421516754*G0_0_0_0 - 0.019753086419753*G0_0_0_1 - 0.093121693121693*G0_1_0_0 - 0.0290652557319223*G0_2_0_0 + 0.0197530864197529*G0_2_0_1 - 0.0310405643738976*G0_3_0_0 - 0.0112874779541446*G0_3_0_1 - 0.0660317460317456*G0_4_0_0 - 0.0197530864197531*G0_5_0_0 + 0.0112874779541446*G0_5_0_1; + A[3] = A[45] + 0.0193298059964728*G0_1_0_1 - 0.0193298059964728*G0_1_1_0 - 0.000141093474426964*G0_2_0_1 + 0.000141093474426962*G0_2_1_0 - 0.0191887125220456*G0_3_0_1 + 0.0191887125220456*G0_3_1_0 + 0.00395061728395053*G0_4_0_1 - 0.00395061728395053*G0_4_1_0 - 0.00395061728395055*G0_5_0_1 + 0.00395061728395055*G0_5_1_0; + A[11] = -A[3] - 0.108641975308642*G0_0_0_0 - 0.108641975308642*G0_0_1_0 - 0.0253968253968254*G0_1_0_0 - 0.0253968253968253*G0_1_1_0 + 0.0138271604938272*G0_2_0_0 + 0.0138271604938272*G0_2_1_0 + 0.00733686067019391*G0_3_0_0 + 0.00733686067019385*G0_3_1_0 - 0.0547442680776011*G0_4_0_0 - 0.0547442680776011*G0_4_1_0 - 0.0355555555555556*G0_5_0_0 - 0.0355555555555555*G0_5_1_0; + A[128] = -A[125] + 0.0338624338624339*G0_0_0_1 + 0.0564373897707227*G0_0_1_1 + 0.0338624338624339*G0_1_0_1 - 0.0677248677248672*G0_1_1_1 + 0.338624338624336*G0_2_0_1 + 0.440211640211638*G0_2_1_1 - 0.180599647266313*G0_3_0_1 + 0.225749559082892*G0_3_1_1 - 0.180599647266314*G0_4_0_1 + 0.632098765432098*G0_4_1_1 - 0.0451499118165779*G0_5_0_1 + 0.406349206349205*G0_5_1_1; + A[63] = -A[71] + 0.0773192239858902*G0_0_0_0 - 0.0479717813051144*G0_0_1_0 + 0.0536155202821864*G0_1_0_0 + 0.389417989417989*G0_1_1_0 - 0.314920634920633*G0_2_0_0 - 0.115696649029982*G0_2_1_0 - 0.0451499118165788*G0_3_0_0 + 0.767548500881832*G0_3_1_0 - 0.374744268077599*G0_4_0_0 + 0.079012345679012*G0_4_1_0 - 0.12416225749559*G0_5_0_0 + 0.0451499118165792*G0_5_1_0; + A[140] = -A[143] + 0.0970723104056433*G0_0_0_1 - 0.151252204585537*G0_0_1_1 + 0.00225749559082854*G0_1_0_1 + 0.0316049382716046*G0_1_1_1 - 0.0112874779541448*G0_2_1_1 - 0.0180599647266306*G0_3_0_1 - 0.0361199294532623*G0_3_1_1 + 0.0180599647266315*G0_4_0_1 + 0.0812698412698412*G0_4_1_1 - 0.0993298059964715*G0_5_0_1 - 0.252839506172838*G0_5_1_1; + A[77] = -A[122] - 0.0126984126984126*G0_0_1_1 - 0.0126984126984129*G0_1_1_1 - 0.203174603174602*G0_2_1_1 - 0.0818342151675481*G0_3_1_1 - 0.081834215167548*G0_4_1_1 - 0.132627865961199*G0_5_1_1; + A[171] = -A[51] - 0.151252204585537*G0_0_0_0 + 0.0970723104056442*G0_0_0_1 - 0.0112874779541446*G0_1_0_0 + 0.0316049382716049*G0_2_0_0 + 0.00225749559082866*G0_2_0_1 - 0.0361199294532629*G0_3_0_0 - 0.0180599647266313*G0_3_0_1 - 0.252839506172837*G0_4_0_0 - 0.0993298059964714*G0_4_0_1 + 0.0812698412698412*G0_5_0_0 + 0.0180599647266319*G0_5_0_1; + A[101] = A[171] - 0.0902998236331571*G0_0_0_1 + 0.0902998236331571*G0_0_1_0 + 0.00677248677248678*G0_1_0_1 - 0.00677248677248678*G0_1_1_0 - 0.00677248677248665*G0_2_0_1 + 0.00677248677248665*G0_2_1_0 + 0.0812698412698404*G0_4_0_1 - 0.0812698412698404*G0_4_1_0 + 0.00902998236331496*G0_5_0_1 - 0.00902998236331496*G0_5_1_0; + A[93] = -A[101] - 0.151252204585537*G0_0_0_0 + 0.0970723104056442*G0_0_1_0 - 0.0112874779541446*G0_1_0_0 + 0.0316049382716049*G0_2_0_0 + 0.00225749559082866*G0_2_1_0 - 0.0361199294532629*G0_3_0_0 - 0.0180599647266313*G0_3_1_0 - 0.252839506172837*G0_4_0_0 - 0.0993298059964715*G0_4_1_0 + 0.0812698412698412*G0_5_0_0 + 0.0180599647266318*G0_5_1_0; + A[152] = A[40] - 0.0053262786596119*G0_0_0_1 + 0.0053262786596119*G0_0_1_0 + 0.00532627865961191*G0_1_0_1 - 0.0053262786596119*G0_1_1_0 - 0.000423280423280435*G0_3_0_1 + 0.000423280423280434*G0_3_1_0 + 0.000423280423280383*G0_4_0_1 - 0.000423280423280387*G0_4_1_0; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p2_q4_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p2_q4_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p2_q4_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q4_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q4_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q4_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q4_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p2_q4_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p2_q4_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p2_q4_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p3_q1_quadrature.h b/laplacian_2d/laplacian_f1_p3_q1_quadrature.h new file mode 100644 index 0000000..a87e6ea --- /dev/null +++ b/laplacian_2d/laplacian_f1_p3_q1_quadrature.h @@ -0,0 +1,4584 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P3_Q1_QUADRATURE_H +#define __LAPLACIAN_F1_P3_Q1_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q1_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q1_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q1_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q1_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q1_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q1_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q1_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q1_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q1_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q1_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q1_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q1_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p3_q1_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p3_q1_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W6[6] = {0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333}; + // Quadrature points on the UFC reference element: (0.659027622374092, 0.231933368553031), (0.659027622374092, 0.109039009072877), (0.231933368553031, 0.659027622374092), (0.231933368553031, 0.109039009072877), (0.109039009072877, 0.659027622374092), (0.109039009072877, 0.231933368553031) + + // Value of basis functions at quadrature points. + static const double FE0_D01[6][2] = \ + {{-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}}; + + // Array of non-zero columns + static const unsigned int nzc1[2] = {0, 1}; + + // Array of non-zero columns + static const unsigned int nzc0[2] = {0, 2}; + + static const double FE1[6][10] = \ + {{0.0613701238658904, -0.0073784527967617, 0.0460083289308709, 0.672064205803564, -0.209236971883332, -0.0765767947279695, -0.0346191742212244, -0.21758931573084, 0.315958050759803, 0.45}, + {0.0460083289308711, -0.00737845279676174, 0.0613701238658902, 0.315958050759803, -0.21758931573084, -0.0346191742212244, -0.0765767947279694, -0.209236971883333, 0.672064205803564, 0.45}, + {0.0613701238658904, 0.0460083289308711, -0.00737845279676169, -0.209236971883333, 0.672064205803564, -0.21758931573084, 0.315958050759803, -0.0765767947279695, -0.0346191742212244, 0.45}, + {-0.00737845279676174, 0.046008328930871, 0.0613701238658903, -0.0346191742212245, -0.0765767947279696, 0.315958050759803, -0.21758931573084, 0.672064205803564, -0.209236971883333, 0.45}, + {0.0460083289308712, 0.0613701238658904, -0.00737845279676172, -0.217589315730839, 0.315958050759803, -0.209236971883333, 0.672064205803564, -0.0346191742212243, -0.0765767947279695, 0.45}, + {-0.00737845279676172, 0.0613701238658903, 0.046008328930871, -0.0765767947279695, -0.0346191742212245, 0.672064205803564, -0.209236971883332, 0.315958050759803, -0.21758931573084, 0.45}}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 9; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 444 + for (unsigned int ip = 0; ip < 6; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 20 + for (unsigned int r = 0; r < 10; r++) + { + F0 += FE1[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W6[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W6[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W6[ip]; + + + // Number of operations for primary indices: 48 + for (unsigned int j = 0; j < 2; j++) + { + for (unsigned int k = 0; k < 2; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p3_q1_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p3_q1_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q1_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q1_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q1_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q1_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q1_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q1_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q1_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p3_q1_tensor.h b/laplacian_2d/laplacian_f1_p3_q1_tensor.h new file mode 100644 index 0000000..c108854 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p3_q1_tensor.h @@ -0,0 +1,4551 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P3_Q1_TENSOR_H +#define __LAPLACIAN_F1_P3_Q1_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q1_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q1_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q1_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q1_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q1_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q1_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q1_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q1_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q1_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q1_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q1_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q1_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p3_q1_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p3_q1_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 100 + // Number of operations (multiply-add pairs) for tensor contraction: 107 + // Total number of operations (multiply-add pairs): 218 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + const double G0_3_0_0 = det*(w[0][3]*((K_00*K_00 + K_01*K_01))); + const double G0_3_0_1 = det*(w[0][3]*((K_00*K_10 + K_01*K_11))); + const double G0_3_1_0 = det*(w[0][3]*((K_10*K_00 + K_11*K_01))); + const double G0_3_1_1 = det*(w[0][3]*((K_10*K_10 + K_11*K_11))); + const double G0_4_0_0 = det*(w[0][4]*((K_00*K_00 + K_01*K_01))); + const double G0_4_0_1 = det*(w[0][4]*((K_00*K_10 + K_01*K_11))); + const double G0_4_1_0 = det*(w[0][4]*((K_10*K_00 + K_11*K_01))); + const double G0_4_1_1 = det*(w[0][4]*((K_10*K_10 + K_11*K_11))); + const double G0_5_0_0 = det*(w[0][5]*((K_00*K_00 + K_01*K_01))); + const double G0_5_0_1 = det*(w[0][5]*((K_00*K_10 + K_01*K_11))); + const double G0_5_1_0 = det*(w[0][5]*((K_10*K_00 + K_11*K_01))); + const double G0_5_1_1 = det*(w[0][5]*((K_10*K_10 + K_11*K_11))); + const double G0_6_0_0 = det*(w[0][6]*((K_00*K_00 + K_01*K_01))); + const double G0_6_0_1 = det*(w[0][6]*((K_00*K_10 + K_01*K_11))); + const double G0_6_1_0 = det*(w[0][6]*((K_10*K_00 + K_11*K_01))); + const double G0_6_1_1 = det*(w[0][6]*((K_10*K_10 + K_11*K_11))); + const double G0_7_0_0 = det*(w[0][7]*((K_00*K_00 + K_01*K_01))); + const double G0_7_0_1 = det*(w[0][7]*((K_00*K_10 + K_01*K_11))); + const double G0_7_1_0 = det*(w[0][7]*((K_10*K_00 + K_11*K_01))); + const double G0_7_1_1 = det*(w[0][7]*((K_10*K_10 + K_11*K_11))); + const double G0_8_0_0 = det*(w[0][8]*((K_00*K_00 + K_01*K_01))); + const double G0_8_0_1 = det*(w[0][8]*((K_00*K_10 + K_01*K_11))); + const double G0_8_1_0 = det*(w[0][8]*((K_10*K_00 + K_11*K_01))); + const double G0_8_1_1 = det*(w[0][8]*((K_10*K_10 + K_11*K_11))); + const double G0_9_0_0 = det*(w[0][9]*((K_00*K_00 + K_01*K_01))); + const double G0_9_0_1 = det*(w[0][9]*((K_00*K_10 + K_01*K_11))); + const double G0_9_1_0 = det*(w[0][9]*((K_10*K_00 + K_11*K_01))); + const double G0_9_1_1 = det*(w[0][9]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[1] = -0.0166666666666666*G0_0_0_0 - 0.0166666666666666*G0_0_1_0 - 0.0166666666666666*G0_1_0_0 - 0.0166666666666666*G0_1_1_0 - 0.0166666666666666*G0_2_0_0 - 0.0166666666666666*G0_2_1_0 - 0.0375*G0_3_0_0 - 0.0375*G0_3_1_0 - 0.0375000000000001*G0_4_0_0 - 0.0375000000000001*G0_4_1_0 - 0.0375*G0_5_0_0 - 0.0375*G0_5_1_0 - 0.0375000000000001*G0_6_0_0 - 0.0375000000000001*G0_6_1_0 - 0.0375*G0_7_0_0 - 0.0375*G0_7_1_0 - 0.0375*G0_8_0_0 - 0.0375*G0_8_1_0 - 0.225*G0_9_0_0 - 0.225*G0_9_1_0; + A[5] = 0.0166666666666666*G0_0_0_1 + 0.0166666666666666*G0_1_0_1 + 0.0166666666666666*G0_2_0_1 + 0.0375*G0_3_0_1 + 0.0375*G0_4_0_1 + 0.0375*G0_5_0_1 + 0.0375000000000001*G0_6_0_1 + 0.0375*G0_7_0_1 + 0.0375*G0_8_0_1 + 0.225*G0_9_0_1; + A[0] = -A[1] + 0.0166666666666666*G0_0_0_1 + 0.0166666666666666*G0_0_1_1 + 0.0166666666666666*G0_1_0_1 + 0.0166666666666666*G0_1_1_1 + 0.0166666666666666*G0_2_0_1 + 0.0166666666666666*G0_2_1_1 + 0.0375*G0_3_0_1 + 0.0375*G0_3_1_1 + 0.0375*G0_4_0_1 + 0.0375*G0_4_1_1 + 0.0375*G0_5_0_1 + 0.0375*G0_5_1_1 + 0.0375000000000001*G0_6_0_1 + 0.0375000000000001*G0_6_1_1 + 0.0375*G0_7_0_1 + 0.0375*G0_7_1_1 + 0.0375*G0_8_0_1 + 0.0375*G0_8_1_1 + 0.225*G0_9_0_1 + 0.225*G0_9_1_1; + A[7] = 0.0166666666666666*G0_0_1_0 + 0.0166666666666666*G0_1_1_0 + 0.0166666666666666*G0_2_1_0 + 0.0375*G0_3_1_0 + 0.0375*G0_4_1_0 + 0.0375*G0_5_1_0 + 0.0375000000000001*G0_6_1_0 + 0.0375*G0_7_1_0 + 0.0375*G0_8_1_0 + 0.225*G0_9_1_0; + A[6] = -A[7] - 0.0166666666666666*G0_0_1_1 - 0.0166666666666666*G0_1_1_1 - 0.0166666666666666*G0_2_1_1 - 0.0375*G0_3_1_1 - 0.0375*G0_4_1_1 - 0.0375*G0_5_1_1 - 0.0375000000000001*G0_6_1_1 - 0.0375*G0_7_1_1 - 0.0375*G0_8_1_1 - 0.225*G0_9_1_1; + A[8] = 0.0166666666666666*G0_0_1_1 + 0.0166666666666666*G0_1_1_1 + 0.0166666666666666*G0_2_1_1 + 0.0375*G0_3_1_1 + 0.0375*G0_4_1_1 + 0.0375*G0_5_1_1 + 0.0375000000000001*G0_6_1_1 + 0.0375*G0_7_1_1 + 0.0375*G0_8_1_1 + 0.225*G0_9_1_1; + A[2] = -A[8] - 0.0166666666666666*G0_0_0_1 - 0.0166666666666666*G0_1_0_1 - 0.0166666666666666*G0_2_0_1 - 0.0375*G0_3_0_1 - 0.0375*G0_4_0_1 - 0.0375*G0_5_0_1 - 0.0375000000000001*G0_6_0_1 - 0.0375*G0_7_0_1 - 0.0375*G0_8_0_1 - 0.225*G0_9_0_1; + A[4] = 0.0166666666666666*G0_0_0_0 + 0.0166666666666666*G0_1_0_0 + 0.0166666666666666*G0_2_0_0 + 0.0375*G0_3_0_0 + 0.0375000000000001*G0_4_0_0 + 0.0375*G0_5_0_0 + 0.0375000000000001*G0_6_0_0 + 0.0375*G0_7_0_0 + 0.0375*G0_8_0_0 + 0.225*G0_9_0_0; + A[3] = -A[4] - 0.0166666666666666*G0_0_0_1 - 0.0166666666666666*G0_1_0_1 - 0.0166666666666666*G0_2_0_1 - 0.0375*G0_3_0_1 - 0.0375*G0_4_0_1 - 0.0375*G0_5_0_1 - 0.0375000000000001*G0_6_0_1 - 0.0375*G0_7_0_1 - 0.0375*G0_8_0_1 - 0.225*G0_9_0_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p3_q1_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p3_q1_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q1_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q1_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q1_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q1_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q1_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q1_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q1_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q1_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p3_q2_quadrature.h b/laplacian_2d/laplacian_f1_p3_q2_quadrature.h new file mode 100644 index 0000000..9131545 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p3_q2_quadrature.h @@ -0,0 +1,5359 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P3_Q2_QUADRATURE_H +#define __LAPLACIAN_F1_P3_Q2_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q2_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q2_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q2_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q2_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q2_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q2_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q2_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q2_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q2_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q2_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q2_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q2_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p3_q2_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p3_q2_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W7[7] = {0.1125, 0.0629695902724136, 0.0629695902724136, 0.0629695902724136, 0.0661970763942531, 0.0661970763942531, 0.0661970763942531}; + // Quadrature points on the UFC reference element: (0.333333333333333, 0.333333333333333), (0.797426985353087, 0.101286507323456), (0.101286507323456, 0.797426985353087), (0.101286507323456, 0.101286507323456), (0.0597158717897698, 0.470142064105115), (0.470142064105115, 0.0597158717897698), (0.470142064105115, 0.470142064105115) + + // Value of basis functions at quadrature points. + static const double FE0_D01[7][5] = \ + {{-0.333333333333333, 0.333333333333334, 1.33333333333333, 0.0, -1.33333333333333}, + {0.594853970706174, -0.594853970706174, 3.18970794141235, 0.0, -3.18970794141235}, + {0.594853970706175, 2.18970794141235, 0.405146029293824, -2.78456191211852, -0.405146029293825}, + {-2.18970794141235, -0.594853970706174, 0.405146029293825, 2.78456191211852, -0.405146029293825}, + {-0.880568256420461, 0.88056825642046, 0.238863487159079, 0.0, -0.238863487159079}, + {-0.88056825642046, -0.761136512840921, 1.88056825642046, 1.64170476926138, -1.88056825642046}, + {0.761136512840921, 0.88056825642046, 1.88056825642046, -1.64170476926138, -1.88056825642046}}; + + // Array of non-zero columns + static const unsigned int nzc0[5] = {0, 2, 3, 4, 5}; + + static const double FE0_D10[7][5] = \ + {{-0.333333333333333, 0.333333333333333, 1.33333333333333, -1.33333333333333, 0.0}, + {0.594853970706174, 2.18970794141235, 0.405146029293824, -0.405146029293824, -2.78456191211852}, + {0.594853970706175, -0.594853970706175, 3.18970794141235, -3.18970794141235, 0.0}, + {-2.18970794141235, -0.594853970706175, 0.405146029293824, -0.405146029293824, 2.78456191211852}, + {-0.880568256420461, -0.761136512840922, 1.88056825642046, -1.88056825642046, 1.64170476926138}, + {-0.88056825642046, 0.88056825642046, 0.238863487159078, -0.238863487159078, 0.0}, + {0.761136512840921, 0.88056825642046, 1.88056825642046, -1.88056825642046, -1.64170476926138}}; + + // Array of non-zero columns + static const unsigned int nzc1[5] = {0, 1, 3, 4, 5}; + + static const double FE1[7][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}, + {0.0597971252344169, 0.217763476154296, 0.0597971252344168, 0.506036589934694, -0.253018294967347, -0.0321375371750572, -0.0321375371750572, -0.253018294967347, 0.506036589934695, 0.22088075779229}, + {0.0597971252344171, 0.059797125234417, 0.217763476154296, -0.253018294967347, 0.506036589934694, -0.253018294967348, 0.506036589934695, -0.0321375371750572, -0.0321375371750573, 0.22088075779229}, + {0.217763476154296, 0.0597971252344169, 0.0597971252344169, -0.0321375371750572, -0.0321375371750573, 0.506036589934694, -0.253018294967347, 0.506036589934694, -0.253018294967347, 0.22088075779229}, + {-0.0568816733393731, 0.0446271943996399, -0.0568816733393731, -0.103704228418659, 0.0518521142093297, 0.408230831635699, 0.408230831635699, 0.0518521142093298, -0.10370422841866, 0.356378717426369}, + {-0.0568816733393731, -0.0568816733393731, 0.0446271943996398, 0.0518521142093297, -0.10370422841866, 0.0518521142093298, -0.10370422841866, 0.408230831635699, 0.408230831635699, 0.356378717426369}, + {0.04462719439964, -0.056881673339373, -0.0568816733393731, 0.408230831635698, 0.408230831635699, -0.10370422841866, 0.0518521142093299, -0.10370422841866, 0.0518521142093297, 0.356378717426369}}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 36; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 2282 + for (unsigned int ip = 0; ip < 7; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 20 + for (unsigned int r = 0; r < 10; r++) + { + F0 += FE1[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W7[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W7[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W7[ip]; + + + // Number of operations for primary indices: 300 + for (unsigned int j = 0; j < 5; j++) + { + for (unsigned int k = 0; k < 5; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc1[k]] += FE0_D01[ip][j]*FE0_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc0[k]] += FE0_D01[ip][k]*FE0_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc1[k]] += FE0_D10[ip][j]*FE0_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p3_q2_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p3_q2_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q2_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q2_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q2_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q2_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q2_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q2_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q2_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p3_q2_tensor.h b/laplacian_2d/laplacian_f1_p3_q2_tensor.h new file mode 100644 index 0000000..0e30a05 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p3_q2_tensor.h @@ -0,0 +1,5342 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P3_Q2_TENSOR_H +#define __LAPLACIAN_F1_P3_Q2_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q2_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q2_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q2_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q2_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q2_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q2_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q2_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q2_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q2_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q2_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q2_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q2_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p3_q2_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p3_q2_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 100 + // Number of operations (multiply-add pairs) for tensor contraction: 613 + // Total number of operations (multiply-add pairs): 724 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + const double G0_3_0_0 = det*(w[0][3]*((K_00*K_00 + K_01*K_01))); + const double G0_3_0_1 = det*(w[0][3]*((K_00*K_10 + K_01*K_11))); + const double G0_3_1_0 = det*(w[0][3]*((K_10*K_00 + K_11*K_01))); + const double G0_3_1_1 = det*(w[0][3]*((K_10*K_10 + K_11*K_11))); + const double G0_4_0_0 = det*(w[0][4]*((K_00*K_00 + K_01*K_01))); + const double G0_4_0_1 = det*(w[0][4]*((K_00*K_10 + K_01*K_11))); + const double G0_4_1_0 = det*(w[0][4]*((K_10*K_00 + K_11*K_01))); + const double G0_4_1_1 = det*(w[0][4]*((K_10*K_10 + K_11*K_11))); + const double G0_5_0_0 = det*(w[0][5]*((K_00*K_00 + K_01*K_01))); + const double G0_5_0_1 = det*(w[0][5]*((K_00*K_10 + K_01*K_11))); + const double G0_5_1_0 = det*(w[0][5]*((K_10*K_00 + K_11*K_01))); + const double G0_5_1_1 = det*(w[0][5]*((K_10*K_10 + K_11*K_11))); + const double G0_6_0_0 = det*(w[0][6]*((K_00*K_00 + K_01*K_01))); + const double G0_6_0_1 = det*(w[0][6]*((K_00*K_10 + K_01*K_11))); + const double G0_6_1_0 = det*(w[0][6]*((K_10*K_00 + K_11*K_01))); + const double G0_6_1_1 = det*(w[0][6]*((K_10*K_10 + K_11*K_11))); + const double G0_7_0_0 = det*(w[0][7]*((K_00*K_00 + K_01*K_01))); + const double G0_7_0_1 = det*(w[0][7]*((K_00*K_10 + K_01*K_11))); + const double G0_7_1_0 = det*(w[0][7]*((K_10*K_00 + K_11*K_01))); + const double G0_7_1_1 = det*(w[0][7]*((K_10*K_10 + K_11*K_11))); + const double G0_8_0_0 = det*(w[0][8]*((K_00*K_00 + K_01*K_01))); + const double G0_8_0_1 = det*(w[0][8]*((K_00*K_10 + K_01*K_11))); + const double G0_8_1_0 = det*(w[0][8]*((K_10*K_00 + K_11*K_01))); + const double G0_8_1_1 = det*(w[0][8]*((K_10*K_10 + K_11*K_11))); + const double G0_9_0_0 = det*(w[0][9]*((K_00*K_00 + K_01*K_01))); + const double G0_9_0_1 = det*(w[0][9]*((K_00*K_10 + K_01*K_11))); + const double G0_9_1_0 = det*(w[0][9]*((K_10*K_00 + K_11*K_01))); + const double G0_9_1_1 = det*(w[0][9]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[9] = 0.00238095238095237*G0_0_0_0 + 0.0214285714285714*G0_0_0_1 - 0.00714285714285719*G0_1_0_0 + 0.0809523809523807*G0_1_0_1 - 0.0238095238095238*G0_2_0_0 + 0.0214285714285714*G0_2_0_1 + 0.114285714285714*G0_3_0_0 + 0.278571428571428*G0_3_0_1 - 0.0357142857142856*G0_4_0_0 - 0.0857142857142854*G0_4_0_1 - 0.0285714285714286*G0_5_0_0 - 0.0285714285714285*G0_5_0_1 - 0.0928571428571429*G0_6_0_0 - 0.0285714285714285*G0_6_0_1 - 0.0285714285714286*G0_7_0_0 - 0.0857142857142856*G0_7_0_1 + 0.057142857142857*G0_8_0_0 + 0.278571428571428*G0_8_0_1 + 0.0428571428571428*G0_9_0_0 + 0.214285714285714*G0_9_0_1; + A[13] = 0.00238095238095237*G0_0_1_0 - 0.0238095238095238*G0_1_1_0 - 0.0238095238095238*G0_2_1_0 + 0.00178571428571435*G0_3_1_0 + 0.00178571428571422*G0_4_1_0 + 0.00892857142857143*G0_5_1_0 - 0.055357142857143*G0_6_1_0 + 0.00892857142857138*G0_7_1_0 - 0.0553571428571428*G0_8_1_0 - 0.0321428571428571*G0_9_1_0; + A[17] = -0.0261904761904762*G0_0_1_0 - 0.0023809523809524*G0_0_1_1 + 0.0261904761904761*G0_1_1_0 + 0.0238095238095237*G0_1_1_1 + 0.00714285714285716*G0_2_1_1 + 0.00714285714285707*G0_3_1_0 + 0.0357142857142856*G0_3_1_1 - 0.057142857142857*G0_4_1_0 - 0.114285714285714*G0_4_1_1 - 0.0071428571428571*G0_5_1_0 + 0.0285714285714286*G0_5_1_1 + 0.0571428571428572*G0_6_1_0 - 0.0571428571428571*G0_6_1_1 - 0.0642857142857142*G0_7_1_0 + 0.0285714285714286*G0_7_1_1 + 0.0642857142857142*G0_8_1_0 + 0.0928571428571428*G0_8_1_1 - 0.0428571428571429*G0_9_1_1; + A[24] = A[9] - 0.00952380952380955*G0_0_0_0 - 0.0285714285714286*G0_0_0_1 - 0.0880952380952382*G0_0_1_0 - 0.0880952380952381*G0_0_1_1 + 0.00952380952380956*G0_1_0_0 - 0.0785714285714283*G0_1_0_1 - 0.0190476190476191*G0_1_1_0 - 0.0190476190476191*G0_1_1_1 - 0.0452380952380951*G0_2_0_1 - 0.0452380952380952*G0_2_1_0 - 0.0452380952380952*G0_2_1_1 - 0.142857142857143*G0_3_0_0 - 0.307142857142857*G0_3_0_1 - 0.0571428571428572*G0_4_0_0 - 0.00714285714285737*G0_4_0_1 - 0.0642857142857142*G0_4_1_0 - 0.0642857142857142*G0_4_1_1 + 0.142857142857143*G0_5_0_0 + 0.142857142857143*G0_5_0_1 - 0.164285714285714*G0_5_1_0 - 0.164285714285714*G0_5_1_1 + 0.0571428571428572*G0_6_0_0 - 0.00714285714285718*G0_6_0_1 + 0.0499999999999999*G0_6_1_0 + 0.0499999999999999*G0_6_1_1 + 0.0857142857142856*G0_7_0_0 + 0.142857142857143*G0_7_0_1 - 0.221428571428571*G0_7_1_0 - 0.221428571428571*G0_7_1_1 - 0.0857142857142855*G0_8_0_0 - 0.307142857142857*G0_8_0_1 + 0.0571428571428572*G0_8_1_0 + 0.0571428571428571*G0_8_1_1 - 0.171428571428571*G0_9_0_1 - 0.171428571428572*G0_9_1_0 - 0.171428571428572*G0_9_1_1; + A[18] = -A[24] - 0.080952380952381*G0_0_1_0 - 0.080952380952381*G0_0_1_1 + 0.00476190476190466*G0_1_1_0 + 0.00476190476190471*G0_1_1_1 - 0.0476190476190476*G0_2_1_0 - 0.0476190476190476*G0_2_1_1 + 0.0928571428571427*G0_3_1_0 + 0.0928571428571427*G0_3_1_1 - 0.0357142857142856*G0_4_1_0 - 0.0357142857142856*G0_4_1_1 - 0.221428571428571*G0_5_1_0 - 0.221428571428571*G0_5_1_1 + 0.0785714285714284*G0_6_1_0 + 0.0785714285714284*G0_6_1_1 - 0.335714285714286*G0_7_1_0 - 0.335714285714286*G0_7_1_1 + 0.0928571428571428*G0_8_1_0 + 0.0928571428571428*G0_8_1_1 - 0.214285714285714*G0_9_1_0 - 0.214285714285714*G0_9_1_1; + A[3] = A[18] + 0.0261904761904761*G0_1_0_1 - 0.0261904761904761*G0_1_1_0 - 0.0261904761904762*G0_2_0_1 + 0.0261904761904762*G0_2_1_0 + 0.0642857142857141*G0_3_0_1 - 0.0642857142857141*G0_3_1_0 - 0.0642857142857141*G0_4_0_1 + 0.0642857142857141*G0_4_1_0 + 0.0571428571428571*G0_5_0_1 - 0.0571428571428571*G0_5_1_0 - 0.00714285714285712*G0_6_0_1 + 0.00714285714285712*G0_6_1_0 - 0.0571428571428571*G0_7_0_1 + 0.0571428571428571*G0_7_1_0 + 0.00714285714285708*G0_8_0_1 - 0.00714285714285708*G0_8_1_0; + A[8] = 0.00238095238095237*G0_0_0_1 - 0.0238095238095238*G0_1_0_1 - 0.0238095238095238*G0_2_0_1 + 0.00178571428571434*G0_3_0_1 + 0.00178571428571423*G0_4_0_1 + 0.00892857142857143*G0_5_0_1 - 0.055357142857143*G0_6_0_1 + 0.00892857142857138*G0_7_0_1 - 0.0553571428571428*G0_8_0_1 - 0.0321428571428571*G0_9_0_1; + A[11] = -A[9] - 0.0428571428571429*G0_0_0_0 - 0.0952380952380951*G0_1_0_0 - 0.0428571428571428*G0_2_0_0 - 0.107142857142857*G0_3_0_0 + 0.0214285714285713*G0_4_0_0 - 0.092857142857143*G0_5_0_0 - 0.092857142857143*G0_6_0_0 + 0.0214285714285713*G0_7_0_0 - 0.107142857142857*G0_8_0_0 - 0.128571428571429*G0_9_0_0; + A[30] = -A[18] - 0.080952380952381*G0_0_0_0 - 0.0809523809523809*G0_0_0_1 - 0.0476190476190476*G0_1_0_0 - 0.0476190476190476*G0_1_0_1 + 0.00476190476190474*G0_2_0_0 + 0.00476190476190473*G0_2_0_1 - 0.0357142857142856*G0_3_0_0 - 0.0357142857142857*G0_3_0_1 + 0.0928571428571428*G0_4_0_0 + 0.0928571428571428*G0_4_0_1 - 0.335714285714286*G0_5_0_0 - 0.335714285714286*G0_5_0_1 + 0.0928571428571428*G0_6_0_0 + 0.0928571428571427*G0_6_0_1 - 0.221428571428571*G0_7_0_0 - 0.221428571428571*G0_7_0_1 + 0.0785714285714286*G0_8_0_0 + 0.0785714285714285*G0_8_0_1 - 0.214285714285714*G0_9_0_0 - 0.214285714285714*G0_9_0_1; + A[4] = A[24] - 0.080952380952381*G0_0_0_1 + 0.080952380952381*G0_0_1_0 - 0.0214285714285714*G0_1_0_1 + 0.0214285714285714*G0_1_1_0 - 0.0214285714285714*G0_2_0_1 + 0.0214285714285714*G0_2_1_0 + 0.0285714285714286*G0_3_0_1 - 0.0285714285714286*G0_3_1_0 + 0.0285714285714286*G0_4_0_1 - 0.0285714285714286*G0_4_1_0 - 0.278571428571428*G0_5_0_1 + 0.278571428571428*G0_5_1_0 + 0.0857142857142856*G0_6_0_1 - 0.0857142857142856*G0_6_1_0 - 0.278571428571428*G0_7_0_1 + 0.278571428571428*G0_7_1_0 + 0.0857142857142857*G0_8_0_1 - 0.0857142857142857*G0_8_1_0 - 0.214285714285714*G0_9_0_1 + 0.214285714285714*G0_9_1_0; + A[7] = 0.0214285714285714*G0_0_0_0 + 0.0642857142857142*G0_1_0_0 + 0.0214285714285714*G0_2_0_0 + 0.166071428571428*G0_3_0_0 - 0.0482142857142855*G0_4_0_0 + 0.00892857142857148*G0_5_0_0 + 0.00892857142857153*G0_6_0_0 - 0.0482142857142856*G0_7_0_0 + 0.166071428571429*G0_8_0_0 + 0.139285714285714*G0_9_0_0; + A[1] = -A[13] + 0.0238095238095238*G0_0_0_0 + 0.0261904761904762*G0_0_1_0 + 0.0238095238095238*G0_1_0_0 - 0.0023809523809524*G0_2_0_0 - 0.0261904761904762*G0_2_1_0 + 0.0553571428571427*G0_3_0_0 + 0.0571428571428571*G0_3_1_0 - 0.00892857142857139*G0_4_0_0 - 0.0071428571428572*G0_4_1_0 + 0.0553571428571429*G0_5_0_0 + 0.0642857142857143*G0_5_1_0 - 0.00892857142857142*G0_6_0_0 - 0.0642857142857144*G0_6_1_0 - 0.00178571428571427*G0_7_0_0 + 0.00714285714285708*G0_7_1_0 - 0.00178571428571435*G0_8_0_0 - 0.0571428571428571*G0_8_1_0 + 0.0321428571428572*G0_9_0_0; + A[0] = A[7] + 0.0428571428571429*G0_0_0_0 + 0.0642857142857143*G0_0_0_1 + 0.0642857142857143*G0_0_1_0 + 0.0642857142857143*G0_0_1_1 - 0.0428571428571427*G0_1_0_0 + 0.0214285714285714*G0_1_0_1 + 0.0214285714285714*G0_1_1_0 + 0.0214285714285714*G0_1_1_1 + 0.0214285714285714*G0_2_0_1 + 0.0214285714285714*G0_2_1_0 + 0.0214285714285714*G0_2_1_1 - 0.157142857142857*G0_3_0_0 + 0.00892857142857139*G0_3_0_1 + 0.00892857142857139*G0_3_1_0 + 0.00892857142857142*G0_3_1_1 + 0.057142857142857*G0_4_0_0 + 0.00892857142857143*G0_4_0_1 + 0.00892857142857143*G0_4_1_0 + 0.00892857142857141*G0_4_1_1 + 0.157142857142857*G0_5_0_0 + 0.166071428571429*G0_5_0_1 + 0.166071428571429*G0_5_1_0 + 0.166071428571429*G0_5_1_1 - 0.0571428571428572*G0_6_0_0 - 0.0482142857142856*G0_6_0_1 - 0.0482142857142856*G0_6_1_0 - 0.0482142857142856*G0_6_1_1 + 0.214285714285714*G0_7_0_0 + 0.166071428571429*G0_7_0_1 + 0.166071428571429*G0_7_1_0 + 0.166071428571428*G0_7_1_1 - 0.214285714285714*G0_8_0_0 - 0.0482142857142857*G0_8_0_1 - 0.0482142857142857*G0_8_1_0 - 0.0482142857142857*G0_8_1_1 + 0.139285714285714*G0_9_0_1 + 0.139285714285714*G0_9_1_0 + 0.139285714285714*G0_9_1_1; + A[14] = 0.0214285714285715*G0_0_1_1 + 0.0214285714285714*G0_1_1_1 + 0.0642857142857142*G0_2_1_1 - 0.0482142857142857*G0_3_1_1 + 0.166071428571428*G0_4_1_1 - 0.0482142857142858*G0_5_1_1 + 0.166071428571429*G0_6_1_1 + 0.00892857142857144*G0_7_1_1 + 0.00892857142857141*G0_8_1_1 + 0.139285714285714*G0_9_1_1; + A[10] = -A[9] - 0.00476190476190473*G0_0_0_1 + 0.0809523809523808*G0_1_0_1 + 0.0476190476190475*G0_2_0_1 + 0.221428571428571*G0_3_0_1 - 0.0785714285714283*G0_4_0_1 - 0.0928571428571428*G0_5_0_1 + 0.0357142857142858*G0_6_0_1 - 0.0928571428571427*G0_7_0_1 + 0.335714285714286*G0_8_0_1 + 0.214285714285714*G0_9_0_1; + A[25] = A[10] + 0.0261904761904762*G0_0_0_1 - 0.0261904761904762*G0_0_1_0 - 0.0261904761904762*G0_2_0_1 + 0.0261904761904762*G0_2_1_0 + 0.057142857142857*G0_3_0_1 - 0.057142857142857*G0_3_1_0 - 0.00714285714285709*G0_4_0_1 + 0.00714285714285709*G0_4_1_0 + 0.0642857142857143*G0_5_0_1 - 0.0642857142857143*G0_5_1_0 - 0.0642857142857143*G0_6_0_1 + 0.0642857142857143*G0_6_1_0 + 0.00714285714285711*G0_7_0_1 - 0.00714285714285712*G0_7_1_0 - 0.0571428571428573*G0_8_0_1 + 0.0571428571428573*G0_8_1_0; + A[5] = -A[3] - 0.080952380952381*G0_0_0_0 - 0.080952380952381*G0_0_1_0 - 0.0476190476190476*G0_1_0_0 - 0.0476190476190476*G0_1_1_0 + 0.00476190476190474*G0_2_0_0 + 0.00476190476190473*G0_2_1_0 - 0.0357142857142856*G0_3_0_0 - 0.0357142857142857*G0_3_1_0 + 0.0928571428571428*G0_4_0_0 + 0.0928571428571428*G0_4_1_0 - 0.335714285714286*G0_5_0_0 - 0.335714285714286*G0_5_1_0 + 0.0928571428571428*G0_6_0_0 + 0.0928571428571427*G0_6_1_0 - 0.221428571428571*G0_7_0_0 - 0.221428571428571*G0_7_1_0 + 0.0785714285714286*G0_8_0_0 + 0.0785714285714286*G0_8_1_0 - 0.214285714285714*G0_9_0_0 - 0.214285714285714*G0_9_1_0; + A[6] = -A[8] + 0.0238095238095238*G0_0_0_0 + 0.0261904761904762*G0_0_0_1 + 0.0238095238095237*G0_1_0_0 - 0.0023809523809524*G0_2_0_0 - 0.0261904761904762*G0_2_0_1 + 0.0553571428571428*G0_3_0_0 + 0.0571428571428571*G0_3_0_1 - 0.00892857142857139*G0_4_0_0 - 0.00714285714285718*G0_4_0_1 + 0.0553571428571429*G0_5_0_0 + 0.0642857142857143*G0_5_0_1 - 0.00892857142857142*G0_6_0_0 - 0.0642857142857144*G0_6_0_1 - 0.00178571428571427*G0_7_0_0 + 0.00714285714285707*G0_7_0_1 - 0.00178571428571435*G0_8_0_0 - 0.0571428571428571*G0_8_0_1 + 0.0321428571428572*G0_9_0_0; + A[19] = -A[25] - 0.00476190476190473*G0_0_1_0 + 0.0809523809523808*G0_1_1_0 + 0.0476190476190475*G0_2_1_0 + 0.221428571428571*G0_3_1_0 - 0.0785714285714283*G0_4_1_0 - 0.0928571428571429*G0_5_1_0 + 0.0357142857142858*G0_6_1_0 - 0.0928571428571427*G0_7_1_0 + 0.335714285714286*G0_8_1_0 + 0.214285714285714*G0_9_1_0; + A[31] = -A[19] - 0.0428571428571429*G0_0_0_0 - 0.0952380952380951*G0_1_0_0 - 0.0428571428571428*G0_2_0_0 - 0.107142857142857*G0_3_0_0 + 0.0214285714285713*G0_4_0_0 - 0.092857142857143*G0_5_0_0 - 0.092857142857143*G0_6_0_0 + 0.0214285714285713*G0_7_0_0 - 0.107142857142857*G0_8_0_0 - 0.128571428571429*G0_9_0_0; + A[12] = -A[13] + 0.0261904761904762*G0_0_1_0 + 0.0238095238095238*G0_0_1_1 - 0.0261904761904761*G0_1_1_0 - 0.00238095238095236*G0_1_1_1 + 0.0238095238095238*G0_2_1_1 - 0.00714285714285708*G0_3_1_0 - 0.00892857142857144*G0_3_1_1 + 0.0571428571428571*G0_4_1_0 + 0.0553571428571428*G0_4_1_1 + 0.00714285714285709*G0_5_1_0 - 0.00178571428571434*G0_5_1_1 - 0.0571428571428572*G0_6_1_0 - 0.00178571428571423*G0_6_1_1 + 0.0642857142857142*G0_7_1_0 + 0.0553571428571428*G0_7_1_1 - 0.0642857142857143*G0_8_1_0 - 0.00892857142857142*G0_8_1_1 + 0.0321428571428572*G0_9_1_1; + A[15] = -A[17] - 0.00476190476190467*G0_0_1_0 + 0.0476190476190476*G0_1_1_0 + 0.0809523809523808*G0_2_1_0 - 0.0785714285714285*G0_3_1_0 + 0.221428571428571*G0_4_1_0 - 0.0928571428571428*G0_5_1_0 + 0.335714285714286*G0_6_1_0 - 0.0928571428571427*G0_7_1_0 + 0.0357142857142857*G0_8_1_0 + 0.214285714285714*G0_9_1_0; + A[16] = -A[15] - 0.0428571428571429*G0_0_1_1 - 0.0428571428571428*G0_1_1_1 - 0.0952380952380951*G0_2_1_1 + 0.0214285714285715*G0_3_1_1 - 0.107142857142857*G0_4_1_1 + 0.0214285714285715*G0_5_1_1 - 0.107142857142857*G0_6_1_1 - 0.0928571428571428*G0_7_1_1 - 0.0928571428571428*G0_8_1_1 - 0.128571428571429*G0_9_1_1; + A[32] = A[17] - 0.0261904761904762*G0_0_0_1 + 0.0261904761904762*G0_0_1_0 + 0.0261904761904761*G0_1_0_1 - 0.0261904761904761*G0_1_1_0 + 0.00714285714285707*G0_3_0_1 - 0.00714285714285707*G0_3_1_0 - 0.057142857142857*G0_4_0_1 + 0.057142857142857*G0_4_1_0 - 0.0071428571428571*G0_5_0_1 + 0.0071428571428571*G0_5_1_0 + 0.0571428571428572*G0_6_0_1 - 0.0571428571428572*G0_6_1_0 - 0.0642857142857142*G0_7_0_1 + 0.0642857142857142*G0_7_1_0 + 0.0642857142857143*G0_8_0_1 - 0.0642857142857142*G0_8_1_0; + A[20] = -A[32] - 0.00476190476190467*G0_0_0_1 + 0.0476190476190476*G0_1_0_1 + 0.0809523809523808*G0_2_0_1 - 0.0785714285714285*G0_3_0_1 + 0.221428571428571*G0_4_0_1 - 0.0928571428571428*G0_5_0_1 + 0.335714285714286*G0_6_0_1 - 0.0928571428571427*G0_7_0_1 + 0.0357142857142857*G0_8_0_1 + 0.214285714285714*G0_9_0_1; + A[26] = -A[20] - 0.0428571428571429*G0_0_1_1 - 0.0428571428571428*G0_1_1_1 - 0.0952380952380951*G0_2_1_1 + 0.0214285714285715*G0_3_1_1 - 0.107142857142857*G0_4_1_1 + 0.0214285714285715*G0_5_1_1 - 0.107142857142857*G0_6_1_1 - 0.0928571428571429*G0_7_1_1 - 0.0928571428571428*G0_8_1_1 - 0.128571428571429*G0_9_1_1; + A[23] = -A[20] - 0.00952380952380955*G0_0_0_0 + 0.00238095238095242*G0_0_0_1 - 0.0285714285714286*G0_0_1_0 - 0.0357142857142858*G0_0_1_1 + 0.00952380952380957*G0_1_0_0 + 0.011904761904762*G0_1_0_1 - 0.104761904761904*G0_1_1_0 - 0.138095238095238*G0_1_1_1 + 0.0714285714285713*G0_2_0_1 - 0.019047619047619*G0_2_1_0 - 0.0452380952380951*G0_2_1_1 - 0.142857142857143*G0_3_0_0 - 0.2*G0_3_0_1 - 0.371428571428571*G0_3_1_0 - 0.464285714285714*G0_3_1_1 - 0.0571428571428572*G0_4_0_0 + 0.164285714285714*G0_4_0_1 + 0.0571428571428568*G0_4_1_0 + 0.2*G0_4_1_1 + 0.142857142857143*G0_5_0_0 - 0.0571428571428571*G0_5_0_1 + 0.0857142857142856*G0_5_1_0 + 0.0571428571428573*G0_6_0_0 + 0.221428571428571*G0_6_0_1 + 0.0857142857142855*G0_6_1_1 + 0.0857142857142856*G0_7_0_0 + 0.2*G0_7_1_0 + 0.0571428571428571*G0_7_1_1 - 0.0857142857142855*G0_8_0_0 - 0.0857142857142855*G0_8_0_1 - 0.314285714285714*G0_8_1_0 - 0.521428571428571*G0_8_1_1 - 0.128571428571429*G0_9_0_1 - 0.171428571428571*G0_9_1_0 - 0.471428571428572*G0_9_1_1; + A[21] = -A[23] + 0.0285714285714287*G0_0_0_0 - 0.00952380952380949*G0_0_1_0 + 0.0476190476190477*G0_1_0_0 - 0.095238095238095*G0_1_1_0 + 0.114285714285714*G0_2_0_0 - 0.00952380952380956*G0_2_1_0 - 0.228571428571428*G0_3_0_0 - 0.257142857142857*G0_3_1_0 + 0.371428571428571*G0_4_0_0 + 0.171428571428571*G0_4_1_0 + 0.0571428571428572*G0_5_0_0 + 0.0571428571428571*G0_5_1_0 + 0.485714285714286*G0_6_0_0 + 0.057142857142857*G0_6_1_0 + 0.057142857142857*G0_7_0_0 + 0.171428571428571*G0_7_1_0 - 0.114285714285714*G0_8_0_0 - 0.257142857142857*G0_8_1_0 + 0.514285714285714*G0_9_0_0 + 0.171428571428571*G0_9_1_0; + A[29] = -A[23] + 0.0857142857142858*G0_0_1_0 - 0.0285714285714286*G0_0_1_1 - 0.0857142857142855*G0_1_1_0 - 0.114285714285714*G0_1_1_1 - 0.0476190476190475*G0_2_1_1 - 0.314285714285714*G0_3_1_0 - 0.371428571428571*G0_3_1_1 + 0.114285714285714*G0_4_1_0 + 0.228571428571428*G0_4_1_1 + 0.314285714285714*G0_5_1_0 - 0.0571428571428571*G0_5_1_1 - 0.114285714285714*G0_6_1_0 + 0.114285714285714*G0_6_1_1 + 0.428571428571428*G0_7_1_0 - 0.0571428571428572*G0_7_1_1 - 0.428571428571428*G0_8_1_0 - 0.485714285714286*G0_8_1_1 - 0.514285714285715*G0_9_1_1; + A[35] = -A[23] + 0.123809523809524*G0_0_0_0 + 0.00952380952380949*G0_0_0_1 + 0.142857142857143*G0_1_0_0 + 0.095238095238095*G0_1_0_1 + 0.0380952380952381*G0_2_0_0 + 0.00952380952380954*G0_2_0_1 + 0.142857142857143*G0_3_0_0 + 0.257142857142857*G0_3_0_1 - 0.114285714285714*G0_4_0_0 - 0.171428571428571*G0_4_0_1 + 0.428571428571429*G0_5_0_0 - 0.0571428571428571*G0_5_0_1 - 0.0571428571428571*G0_6_0_1 + 0.2*G0_7_0_0 - 0.171428571428571*G0_7_0_1 + 0.0285714285714285*G0_8_0_0 + 0.257142857142857*G0_8_0_1 + 0.342857142857143*G0_9_0_0 - 0.171428571428571*G0_9_0_1; + A[33] = -A[35] + 0.123809523809524*G0_0_0_0 + 0.00952380952380949*G0_0_1_0 + 0.142857142857143*G0_1_0_0 + 0.095238095238095*G0_1_1_0 + 0.0380952380952381*G0_2_0_0 + 0.00952380952380954*G0_2_1_0 + 0.142857142857143*G0_3_0_0 + 0.257142857142857*G0_3_1_0 - 0.114285714285714*G0_4_0_0 - 0.171428571428571*G0_4_1_0 + 0.428571428571429*G0_5_0_0 - 0.0571428571428571*G0_5_1_0 - 0.0571428571428571*G0_6_1_0 + 0.2*G0_7_0_0 - 0.171428571428571*G0_7_1_0 + 0.0285714285714285*G0_8_0_0 + 0.257142857142857*G0_8_1_0 + 0.342857142857143*G0_9_0_0 - 0.171428571428571*G0_9_1_0; + A[34] = -A[33] + 0.0857142857142858*G0_0_0_1 - 0.0285714285714286*G0_0_1_1 - 0.0857142857142854*G0_1_0_1 - 0.114285714285714*G0_1_1_1 - 0.0476190476190475*G0_2_1_1 - 0.314285714285714*G0_3_0_1 - 0.371428571428571*G0_3_1_1 + 0.114285714285714*G0_4_0_1 + 0.228571428571428*G0_4_1_1 + 0.314285714285714*G0_5_0_1 - 0.0571428571428572*G0_5_1_1 - 0.114285714285714*G0_6_0_1 + 0.114285714285714*G0_6_1_1 + 0.428571428571428*G0_7_0_1 - 0.0571428571428572*G0_7_1_1 - 0.428571428571428*G0_8_0_1 - 0.485714285714286*G0_8_1_1 - 0.514285714285714*G0_9_1_1; + A[22] = -A[34] - 0.0285714285714287*G0_0_0_0 + 0.0857142857142857*G0_0_0_1 - 0.0476190476190477*G0_1_0_0 - 0.114285714285714*G0_2_0_0 - 0.0857142857142854*G0_2_0_1 + 0.228571428571428*G0_3_0_0 + 0.114285714285714*G0_3_0_1 - 0.371428571428571*G0_4_0_0 - 0.314285714285714*G0_4_0_1 - 0.0571428571428572*G0_5_0_0 + 0.428571428571428*G0_5_0_1 - 0.485714285714286*G0_6_0_0 - 0.428571428571428*G0_6_0_1 - 0.057142857142857*G0_7_0_0 + 0.314285714285714*G0_7_0_1 + 0.114285714285714*G0_8_0_0 - 0.114285714285714*G0_8_0_1 - 0.514285714285714*G0_9_0_0; + A[27] = -A[29] - 0.0285714285714287*G0_0_0_0 + 0.0857142857142857*G0_0_1_0 - 0.0476190476190477*G0_1_0_0 - 0.114285714285714*G0_2_0_0 - 0.0857142857142854*G0_2_1_0 + 0.228571428571428*G0_3_0_0 + 0.114285714285714*G0_3_1_0 - 0.371428571428571*G0_4_0_0 - 0.314285714285714*G0_4_1_0 - 0.0571428571428572*G0_5_0_0 + 0.428571428571428*G0_5_1_0 - 0.485714285714286*G0_6_0_0 - 0.428571428571428*G0_6_1_0 - 0.057142857142857*G0_7_0_0 + 0.314285714285714*G0_7_1_0 + 0.114285714285714*G0_8_0_0 - 0.114285714285714*G0_8_1_0 - 0.514285714285714*G0_9_0_0; + A[28] = -A[27] + 0.0095238095238096*G0_0_0_1 + 0.123809523809524*G0_0_1_1 + 0.00952380952380959*G0_1_0_1 + 0.0380952380952382*G0_1_1_1 + 0.0952380952380951*G0_2_0_1 + 0.142857142857143*G0_2_1_1 - 0.171428571428571*G0_3_0_1 - 0.114285714285714*G0_3_1_1 + 0.257142857142857*G0_4_0_1 + 0.142857142857142*G0_4_1_1 - 0.171428571428571*G0_5_0_1 + 0.2*G0_5_1_1 + 0.257142857142857*G0_6_0_1 + 0.0285714285714287*G0_6_1_1 - 0.0571428571428569*G0_7_0_1 + 0.428571428571429*G0_7_1_1 - 0.0571428571428569*G0_8_0_1 - 0.171428571428571*G0_9_0_1 + 0.342857142857143*G0_9_1_1; + A[2] = -A[8] + 0.0261904761904762*G0_0_0_1 + 0.0238095238095238*G0_0_1_1 - 0.0261904761904761*G0_1_0_1 - 0.00238095238095236*G0_1_1_1 + 0.0238095238095238*G0_2_1_1 - 0.00714285714285709*G0_3_0_1 - 0.00892857142857143*G0_3_1_1 + 0.0571428571428571*G0_4_0_1 + 0.0553571428571428*G0_4_1_1 + 0.00714285714285708*G0_5_0_1 - 0.00178571428571435*G0_5_1_1 - 0.0571428571428572*G0_6_0_1 - 0.00178571428571423*G0_6_1_1 + 0.0642857142857142*G0_7_0_1 + 0.0553571428571428*G0_7_1_1 - 0.0642857142857143*G0_8_0_1 - 0.00892857142857142*G0_8_1_1 + 0.0321428571428572*G0_9_1_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p3_q2_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p3_q2_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q2_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q2_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q2_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q2_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q2_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q2_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q2_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q2_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p3_q3_quadrature.h b/laplacian_2d/laplacian_f1_p3_q3_quadrature.h new file mode 100644 index 0000000..41ac7b9 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p3_q3_quadrature.h @@ -0,0 +1,3478 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P3_Q3_QUADRATURE_H +#define __LAPLACIAN_F1_P3_Q3_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q3_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q3_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q3_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q3_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q3_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q3_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q3_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q3_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p3_q3_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p3_q3_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q3_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W16[16] = {0.0235683681933823, 0.0353880678980859, 0.0225840492823699, 0.00542322591052525, 0.0441850885223617, 0.0663442161070497, 0.0423397245217463, 0.0101672595644788, 0.0441850885223617, 0.0663442161070497, 0.0423397245217463, 0.0101672595644788, 0.0235683681933823, 0.0353880678980859, 0.0225840492823699, 0.00542322591052525}; + // Quadrature points on the UFC reference element: (0.0654669945550145, 0.0571041961145177), (0.0502101232113698, 0.276843013638124), (0.028912084224389, 0.583590432368917), (0.00970378512694614, 0.860240135656219), (0.311164552244357, 0.0571041961145177), (0.238648659731443, 0.276843013638124), (0.137419104134574, 0.583590432368917), (0.0461220799064521, 0.860240135656219), (0.631731251641125, 0.0571041961145177), (0.484508326630433, 0.276843013638124), (0.278990463496509, 0.583590432368917), (0.0936377844373285, 0.860240135656219), (0.877428809330468, 0.0571041961145177), (0.672946863150506, 0.276843013638124), (0.387497483406694, 0.583590432368917), (0.130056079216834, 0.860240135656219) + + // Value of basis functions at quadrature points. + static const double FE0[16][10] = \ + {{0.452785096544089, 0.0474429618915808, 0.0432681417093323, -0.0135189305273306, -0.0139409921109051, 0.368034723276116, -0.186845725726384, 0.421932692589788, -0.207723773787635, 0.0885658061413498}, + {0.00645879502307903, 0.0394349905858879, 0.0274339473899979, -0.0531293004470147, -0.0106006539207501, 0.854147931483282, -0.142076464805357, 0.1549140515302, -0.129146101999649, 0.252562805160324}, + {-0.0263670054419038, 0.0252592508316565, -0.0545988990428341, -0.0693419891600487, 0.0570043158923522, 0.165357063338021, 0.764006800069202, 0.00819207628699495, -0.0460423009076121, 0.176530688134173}, + {0.0638397523745611, 0.00928416145919292, 0.394831554211582, -0.0364705915852904, 0.0593783938998503, -0.307024415063853, 0.795825649453315, -0.00346333404943167, -0.00551383497665217, 0.029312664276727}, + {-0.0296351119176842, 0.0110353632465608, 0.0432681417093322, -0.00531782108849548, -0.0662615199844948, 0.145321523295419, -0.134525197852795, 0.791866619346228, -0.0588298934372823, 0.303077896683211}, + {-0.0600402894008984, 0.0435224405021434, 0.0274339473899979, -0.0844512384591528, -0.050384896285038, 0.273746477720596, -0.102292222441069, 0.235979334120451, -0.147799750082179, 0.864286196935148}, + {0.0264492636219919, 0.0641186652464315, -0.0545988990428341, -0.212107011291982, 0.270941449981089, -0.119446618596469, 0.550069665980465, -0.0281263132652843, -0.101399594834004, 0.604099392200595}, + {0.0578762154363198, 0.0369909803572858, 0.394831554211582, -0.153838064046657, 0.282225440107984, -0.260654104682365, 0.572978603245181, -0.0139750622480943, -0.0167453887378413, 0.100309826356606}, + {0.0110353632465609, -0.0296351119176842, 0.0432681417093322, 0.145321523295419, -0.134525197852795, -0.00531782108849538, -0.0662615199844948, -0.0588298934372823, 0.791866619346228, 0.303077896683211}, + {0.0435224405021434, -0.0600402894008984, 0.0274339473899979, 0.273746477720596, -0.102292222441069, -0.0844512384591528, -0.0503848962850379, -0.147799750082178, 0.235979334120451, 0.864286196935148}, + {0.0641186652464316, 0.0264492636219918, -0.054598899042834, -0.119446618596468, 0.550069665980465, -0.212107011291982, 0.270941449981089, -0.101399594834004, -0.0281263132652844, 0.604099392200595}, + {0.0369909803572858, 0.0578762154363198, 0.394831554211582, -0.260654104682365, 0.572978603245181, -0.153838064046657, 0.282225440107983, -0.0167453887378413, -0.0139750622480943, 0.100309826356606}, + {0.0474429618915808, 0.452785096544088, 0.0432681417093322, 0.368034723276116, -0.186845725726384, -0.0135189305273305, -0.013940992110905, -0.207723773787635, 0.421932692589788, 0.0885658061413497}, + {0.039434990585888, 0.00645879502307897, 0.0274339473899978, 0.854147931483282, -0.142076464805356, -0.0531293004470148, -0.0106006539207499, -0.129146101999649, 0.1549140515302, 0.252562805160324}, + {0.0252592508316565, -0.0263670054419038, -0.054598899042834, 0.165357063338021, 0.764006800069202, -0.0693419891600488, 0.0570043158923523, -0.0460423009076122, 0.00819207628699482, 0.176530688134173}, + {0.00928416145919284, 0.063839752374561, 0.394831554211582, -0.307024415063853, 0.795825649453315, -0.0364705915852904, 0.0593783938998498, -0.00551383497665225, -0.00346333404943167, 0.0293126642767269}}; + + static const double FE0_D01[16][9] = \ + {{-3.4965384745074, 0.530084239356792, -0.236741455920669, -0.193663592902933, 5.3491055952874, -2.38265136013679, -1.2563494557394, 0.236741455920668, 1.45001304864234}, + {-1.05705422007088, -0.456919391039896, -0.191911292067001, 0.149363134823218, -0.699008549928808, 2.21298216103958, -0.686350558213112, 0.191911292067002, 0.536987423389894}, + {0.460394305432211, 0.345486310839029, -0.118819612718074, 0.325461645786587, -3.19627392928782, 2.39039331301657, -0.172386337669062, 0.118819612718075, -0.153075308117525}, + {-0.057842167555441, 3.24801550751074, -0.0423958265530895, 0.181717773646284, 0.493429735317233, -3.68360307527254, 0.00959205439758343, 0.0423958265530895, -0.191309828043865}, + {-0.70205778828072, 0.530084239356792, -0.0931248743582835, -0.920482841487917, 1.82780566047573, -1.6558321115518, -3.9072135604037, 0.0931248743582843, 4.82769640189162}, + {0.191472638921894, -0.456919391039896, -0.305051001104703, 0.709922813548805, -1.38697573019599, 1.652422482314, -2.04801712624359, 0.305051001104704, 1.33809431269478}, + {0.460132508721622, 0.345486310839029, -0.363451831160072, 1.54691884013084, -1.97455493823297, 1.16893611867232, -0.416756759400472, 0.363451831160073, -1.13016208073037}, + {-0.275628408167522, 3.24801550751074, -0.178831535137919, 0.863704375858747, 1.39320257814178, -4.365589677485, 0.0909425864248334, 0.17883153513792, -0.954646962283579}, + {0.493365359457892, 0.530084239356792, 2.54484842066578, -1.86877898967968, -0.315913635454648, -0.707535963360036, -2.46466341311824, -2.54484842066578, 4.33344240279792}, + {0.378969969896197, -0.456919391039896, 0.988814830915056, 1.44129665264566, -0.843099222073445, 0.921048643217145, -0.94164862519813, -0.988814830915056, -0.499648027447527}, + {-0.0181622002343421, 0.345486310839029, -0.204675422987332, 3.14057937517148, 0.0974003057636252, -0.424724416368311, 0.220314357728232, 0.204675422987333, -3.36089373289971}, + {-0.613619105283045, 3.24801550751074, -0.303001561864499, 1.75350644047874, 2.62099533987729, -5.25539174210499, 0.304763256813776, 0.3030015618645, -2.05826969729251}, + {-0.468657068581765, 0.530084239356792, 6.44496811649451, -2.59559823826466, -0.0807104559999763, 0.0192832852249485, 2.39747871075014, -6.44496811649451, 0.19811952751453}, + {-0.582143153481834, -0.456919391039896, 3.08531510424816, 2.00185633137125, 0.678573580030173, 0.360488964491556, 2.115964771513, -3.08531510424816, -4.11782110288425}, + {-0.751076008272174, 0.345486310839029, 0.283344369897911, 4.36203656951573, 2.05177130814571, -1.64618161071257, 1.44124795865131, -0.283344369897911, -5.80328452816704}, + {-0.913937140375651, 3.24801550751074, -0.356905475968805, 2.4354930426912, 3.60329997718236, -5.93737834431745, 0.551177377802077, 0.356905475968805, -2.98667042049328}}; + + // Array of non-zero columns + static const unsigned int nzc0[9] = {0, 2, 3, 4, 5, 6, 7, 8, 9}; + + static const double FE0_D10[16][9] = \ + {{-3.4965384745074, 0.468657068581765, -0.156030999920696, -0.21294687812788, -1.09586252120711, 0.21294687812788, 5.18861866075511, -2.16073725482947, 1.25189352112781}, + {-1.05705422007088, 0.582143153481835, -0.870484872097176, -0.211125829668338, -3.78432365417697, 0.211125829668338, 2.39896454603505, -1.924053479446, 4.65480852627414}, + {0.460394305432211, 0.751076008272174, -2.17059092086379, 1.97164325649915, -3.47961829918573, -1.97164325649915, 0.110958032228849, -1.32242834593323, 5.65020922004951}, + {-0.0578421675554415, 0.913937140375651, -3.64569580373545, 6.11909611796373, 0.85033521128604, -6.11909611796373, -0.347313421571225, -0.508781551248987, 2.79536059244941}, + {-0.702057788280719, -0.493365359457892, 0.222788761096362, -0.212946878127879, -0.717042760190054, 0.21294687812788, -1.36236513973792, 2.55778828747653, 0.494253999093691}, + {0.191472638921894, -0.378969969896196, 0.53804822096874, -0.211125829668338, -2.37579056111105, 0.211125829668338, -1.05920229532853, 1.24669962630283, 1.83774234014231}, + {0.460132508721622, 0.0181622002343421, -0.460852136923699, 1.97164325649915, -1.76987951524564, -1.97164325649915, -0.621432182387805, 0.14313747343184, 2.23073165216934}, + {-0.275628408167522, 0.613619105283045, -2.79982687501521, 6.11909611796373, 1.69620414000628, -6.11909611796374, -0.212058975439669, -0.125931721675855, 1.10362273500893}, + {0.493365359457892, 0.70205778828072, 0.717042760190053, -0.212946878127879, -0.222788761096363, 0.212946878127879, -2.55778828747653, 1.36236513973792, -0.49425399909369}, + {0.378969969896197, -0.191472638921894, 2.37579056111105, -0.211125829668337, -0.538048220968741, 0.211125829668338, -1.24669962630283, 1.05920229532853, -1.83774234014231}, + {-0.0181622002343423, -0.460132508721622, 1.76987951524564, 1.97164325649916, 0.460852136923698, -1.97164325649916, -0.143137473431841, 0.621432182387805, -2.23073165216934}, + {-0.613619105283045, 0.275628408167522, -1.69620414000628, 6.11909611796373, 2.79982687501521, -6.11909611796374, 0.125931721675853, 0.212058975439669, -1.10362273500893}, + {-0.468657068581766, 3.4965384745074, 1.09586252120711, -0.212946878127879, 0.156030999920692, 0.212946878127879, 2.16073725482947, -5.18861866075511, -1.2518935211278}, + {-0.582143153481834, 1.05705422007088, 3.78432365417697, -0.211125829668336, 0.870484872097176, 0.211125829668337, 1.924053479446, -2.39896454603504, -4.65480852627414}, + {-0.751076008272174, -0.460394305432211, 3.47961829918573, 1.97164325649916, 2.17059092086379, -1.97164325649916, 1.32242834593323, -0.110958032228849, -5.65020922004951}, + {-0.913937140375651, 0.0578421675554404, -0.850335211286036, 6.11909611796373, 3.64569580373545, -6.11909611796374, 0.508781551248985, 0.347313421571224, -2.79536059244941}}; + + // Array of non-zero columns + static const unsigned int nzc1[9] = {0, 1, 3, 4, 5, 6, 7, 8, 9}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 100; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 15968 + for (unsigned int ip = 0; ip < 16; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 20 + for (unsigned int r = 0; r < 10; r++) + { + F0 += FE0[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W16[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W16[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W16[ip]; + + + // Number of operations for primary indices: 972 + for (unsigned int j = 0; j < 9; j++) + { + for (unsigned int k = 0; k < 9; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc1[k]] += FE0_D01[ip][j]*FE0_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc0[k]] += FE0_D01[ip][k]*FE0_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc1[k]] += FE0_D10[ip][j]*FE0_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p3_q3_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p3_q3_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q3_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q3_quadrature_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f1_p3_q3_quadrature_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f1_p3_q3_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q3_quadrature_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f1_p3_q3_quadrature_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f1_p3_q3_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q3_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p3_q3_tensor.h b/laplacian_2d/laplacian_f1_p3_q3_tensor.h new file mode 100644 index 0000000..a4cb7c5 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p3_q3_tensor.h @@ -0,0 +1,3498 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P3_Q3_TENSOR_H +#define __LAPLACIAN_F1_P3_Q3_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q3_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q3_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q3_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q3_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q3_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q3_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q3_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q3_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p3_q3_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p3_q3_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q3_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 100 + // Number of operations (multiply-add pairs) for tensor contraction: 1972 + // Total number of operations (multiply-add pairs): 2083 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + const double G0_3_0_0 = det*(w[0][3]*((K_00*K_00 + K_01*K_01))); + const double G0_3_0_1 = det*(w[0][3]*((K_00*K_10 + K_01*K_11))); + const double G0_3_1_0 = det*(w[0][3]*((K_10*K_00 + K_11*K_01))); + const double G0_3_1_1 = det*(w[0][3]*((K_10*K_10 + K_11*K_11))); + const double G0_4_0_0 = det*(w[0][4]*((K_00*K_00 + K_01*K_01))); + const double G0_4_0_1 = det*(w[0][4]*((K_00*K_10 + K_01*K_11))); + const double G0_4_1_0 = det*(w[0][4]*((K_10*K_00 + K_11*K_01))); + const double G0_4_1_1 = det*(w[0][4]*((K_10*K_10 + K_11*K_11))); + const double G0_5_0_0 = det*(w[0][5]*((K_00*K_00 + K_01*K_01))); + const double G0_5_0_1 = det*(w[0][5]*((K_00*K_10 + K_01*K_11))); + const double G0_5_1_0 = det*(w[0][5]*((K_10*K_00 + K_11*K_01))); + const double G0_5_1_1 = det*(w[0][5]*((K_10*K_10 + K_11*K_11))); + const double G0_6_0_0 = det*(w[0][6]*((K_00*K_00 + K_01*K_01))); + const double G0_6_0_1 = det*(w[0][6]*((K_00*K_10 + K_01*K_11))); + const double G0_6_1_0 = det*(w[0][6]*((K_10*K_00 + K_11*K_01))); + const double G0_6_1_1 = det*(w[0][6]*((K_10*K_10 + K_11*K_11))); + const double G0_7_0_0 = det*(w[0][7]*((K_00*K_00 + K_01*K_01))); + const double G0_7_0_1 = det*(w[0][7]*((K_00*K_10 + K_01*K_11))); + const double G0_7_1_0 = det*(w[0][7]*((K_10*K_00 + K_11*K_01))); + const double G0_7_1_1 = det*(w[0][7]*((K_10*K_10 + K_11*K_11))); + const double G0_8_0_0 = det*(w[0][8]*((K_00*K_00 + K_01*K_01))); + const double G0_8_0_1 = det*(w[0][8]*((K_00*K_10 + K_01*K_11))); + const double G0_8_1_0 = det*(w[0][8]*((K_10*K_00 + K_11*K_01))); + const double G0_8_1_1 = det*(w[0][8]*((K_10*K_10 + K_11*K_11))); + const double G0_9_0_0 = det*(w[0][9]*((K_00*K_00 + K_01*K_01))); + const double G0_9_0_1 = det*(w[0][9]*((K_00*K_10 + K_01*K_11))); + const double G0_9_1_0 = det*(w[0][9]*((K_10*K_00 + K_11*K_01))); + const double G0_9_1_1 = det*(w[0][9]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[73] = 0.00301339285714297*G0_0_0_1 + 0.0180803571428572*G0_0_1_0 + 0.02109375*G0_0_1_1 + 0.0331473214285713*G0_1_0_0 + 0.162723214285714*G0_1_0_1 + 0.0361607142857142*G0_1_1_0 + 0.180803571428571*G0_1_1_1 - 0.00602678571428576*G0_2_0_0 + 0.0030133928571428*G0_2_0_1 - 0.0120535714285715*G0_2_1_0 + 0.00904017857142849*G0_2_1_1 + 0.198883928571428*G0_3_0_0 + 0.235044642857142*G0_3_0_1 + 0.235044642857142*G0_3_1_0 + 0.271205357142856*G0_3_1_1 + 0.06328125*G0_4_0_0 - 0.0361607142857141*G0_4_0_1 + 0.0723214285714284*G0_4_1_0 - 0.0542410714285712*G0_4_1_1 - 0.0904017857142857*G0_5_0_0 - 0.0271205357142856*G0_5_0_1 - 0.018080357142857*G0_5_1_0 + 0.00904017857142848*G0_5_1_1 + 0.0452008928571428*G0_6_0_0 + 0.0271205357142857*G0_6_0_1 + 0.036160714285714*G0_6_1_0 + 0.00904017857142863*G0_6_1_1 - 0.0542410714285714*G0_7_0_0 - 0.0723214285714284*G0_7_0_1 - 0.0723214285714283*G0_7_1_0 - 0.0542410714285715*G0_7_1_1 - 0.0271205357142857*G0_8_0_0 - 0.0723214285714287*G0_8_0_1 - 0.0180803571428572*G0_8_1_0 - 0.0542410714285716*G0_8_1_1 - 0.162723214285714*G0_9_0_0 - 0.0542410714285716*G0_9_0_1 - 0.108482142857143*G0_9_1_0; + A[69] = 0.0120535714285714*G0_0_0_0 + 0.0361607142857144*G0_0_0_1 - 0.0482142857142856*G0_0_1_0 - 0.0241071428571429*G0_0_1_1 - 0.0120535714285714*G0_1_0_0 + 0.024107142857143*G0_1_0_1 + 0.0421875*G0_1_1_0 + 0.0120535714285715*G0_1_1_1 + 0.0843750000000003*G0_2_0_1 - 0.0120535714285712*G0_2_1_0 + 0.0662946428571432*G0_2_1_1 - 0.108482142857143*G0_3_0_1 - 0.162723214285714*G0_3_1_0 - 0.108482142857143*G0_3_1_1 + 0.325446428571428*G0_4_0_0 + 0.542410714285714*G0_4_0_1 + 0.325446428571428*G0_4_1_0 + 0.3796875*G0_4_1_1 - 0.108482142857143*G0_5_0_1 + 0.379687499999999*G0_5_1_0 - 0.0542410714285716*G0_5_1_1 - 0.325446428571428*G0_6_0_0 + 0.216964285714286*G0_6_0_1 + 0.216964285714285*G0_6_1_0 + 0.108482142857143*G0_6_1_1 + 0.0542410714285714*G0_7_1_0 - 0.271205357142857*G0_7_1_1 - 0.108482142857143*G0_8_1_0 - 0.108482142857143*G0_8_1_1 + 0.325446428571429*G0_9_0_1 + 0.325446428571428*G0_9_1_0; + A[16] = 0.00167410714285713*G0_0_0_0 - 0.0137276785714286*G0_0_0_1 + 0.00468750000000001*G0_1_0_0 - 0.0348214285714287*G0_2_0_0 - 0.0284598214285715*G0_2_0_1 + 0.0271205357142857*G0_3_0_0 + 0.0150669642857143*G0_3_0_1 + 0.00602678571428559*G0_4_0_0 + 0.00301339285714272*G0_4_0_1 + 0.00904017857142863*G0_5_0_0 + 0.0421875*G0_5_0_1 - 0.066294642857143*G0_6_0_0 - 0.0120535714285715*G0_7_0_0 + 0.0150669642857143*G0_7_0_1 + 0.0150669642857143*G0_8_0_0 - 0.0150669642857142*G0_8_0_1 + 0.0120535714285714*G0_9_0_0 - 0.0180803571428571*G0_9_0_1; + A[37] = A[73] + 0.0150669642857142*G0_0_0_1 - 0.0150669642857142*G0_0_1_0 - 0.1265625*G0_1_0_1 + 0.1265625*G0_1_1_0 - 0.0150669642857143*G0_2_0_1 + 0.0150669642857143*G0_2_1_0 + 0.108482142857142*G0_4_0_1 - 0.108482142857142*G0_4_1_0 + 0.00904017857142863*G0_5_0_1 - 0.00904017857142863*G0_5_1_0 + 0.00904017857142835*G0_6_0_1 - 0.00904017857142835*G0_6_1_0 + 0.0542410714285715*G0_8_0_1 - 0.0542410714285715*G0_8_1_0 - 0.0542410714285709*G0_9_0_1 + 0.0542410714285709*G0_9_1_0; + A[40] = A[16] + 0.0030133928571429*G0_0_0_0 + 0.0184151785714286*G0_0_0_1 + 0.00468750000000009*G0_0_1_0 + 0.00468750000000011*G0_0_1_1 - 0.00301339285714288*G0_1_0_0 + 0.00167410714285714*G0_1_0_1 + 0.0154017857142857*G0_1_1_0 + 0.0154017857142857*G0_1_1_1 - 0.00636160714285717*G0_2_0_1 - 0.00636160714285721*G0_2_1_0 - 0.0063616071428572*G0_2_1_1 - 0.0180803571428571*G0_3_0_0 - 0.00602678571428573*G0_3_0_1 - 0.0331473214285713*G0_3_1_0 - 0.0331473214285713*G0_3_1_1 - 0.0723214285714286*G0_4_0_0 - 0.0693080357142857*G0_4_0_1 - 0.066294642857143*G0_4_1_0 - 0.0662946428571429*G0_4_1_1 + 0.0180803571428572*G0_5_0_0 - 0.0150669642857142*G0_5_0_1 + 0.0120535714285716*G0_5_1_0 + 0.0120535714285715*G0_5_1_1 + 0.0723214285714285*G0_6_0_0 + 0.00602678571428575*G0_6_0_1 + 0.00301339285714269*G0_6_1_0 + 0.00301339285714273*G0_6_1_1 + 0.0271205357142858*G0_7_0_0 + 0.0301339285714287*G0_7_1_0 + 0.0301339285714287*G0_7_1_1 - 0.0271205357142858*G0_8_0_0 + 0.00301339285714278*G0_8_0_1 - 0.0271205357142857*G0_8_1_0 - 0.0271205357142857*G0_8_1_1 + 0.0301339285714285*G0_9_0_1 + 0.0301339285714285*G0_9_1_0 + 0.0301339285714285*G0_9_1_1; + A[4] = A[40] + 0.0137276785714286*G0_1_0_1 - 0.0137276785714286*G0_1_1_0 + 0.0284598214285715*G0_2_0_1 - 0.0284598214285715*G0_2_1_0 - 0.0421874999999999*G0_3_0_1 + 0.0421874999999999*G0_3_1_0 - 0.0150669642857143*G0_5_0_1 + 0.0150669642857143*G0_5_1_0 - 0.00301339285714284*G0_6_0_1 + 0.00301339285714284*G0_6_1_0 + 0.0150669642857143*G0_7_0_1 - 0.0150669642857143*G0_7_1_0 - 0.0150669642857142*G0_8_0_1 + 0.0150669642857142*G0_8_1_0 + 0.0180803571428571*G0_9_0_1 - 0.0180803571428571*G0_9_1_0; + A[11] = 0.0180059523809524*G0_0_0_0 + 0.131845238095238*G0_1_0_0 + 0.0180059523809524*G0_2_0_0 + 0.139955357142857*G0_3_0_0 - 0.0529017857142855*G0_4_0_0 + 0.00736607142857138*G0_5_0_0 + 0.00736607142857149*G0_6_0_0 - 0.0529017857142857*G0_7_0_0 + 0.139955357142857*G0_8_0_0 + 0.0683035714285714*G0_9_0_0; + A[82] = -0.0137276785714285*G0_0_0_1 + 0.00167410714285712*G0_0_1_1 - 0.0284598214285713*G0_1_0_1 - 0.0348214285714285*G0_1_1_1 + 0.00468749999999993*G0_2_1_1 + 0.00301339285714293*G0_3_0_1 + 0.00602678571428577*G0_3_1_1 + 0.0150669642857142*G0_4_0_1 + 0.0271205357142856*G0_4_1_1 + 0.0150669642857143*G0_5_0_1 - 0.0120535714285714*G0_5_1_1 - 0.0150669642857144*G0_6_0_1 + 0.0150669642857141*G0_6_1_1 + 0.0421874999999999*G0_7_0_1 + 0.00904017857142852*G0_7_1_1 - 0.0662946428571427*G0_8_1_1 - 0.0180803571428571*G0_9_0_1 + 0.0120535714285714*G0_9_1_1; + A[32] = -A[82] - 0.0274553571428571*G0_0_0_1 - 0.028125*G0_1_0_1 - 0.0937500000000001*G0_2_0_1 - 0.0210937499999998*G0_3_0_1 - 0.0150669642857145*G0_4_0_1 + 0.0753348214285715*G0_5_0_1 - 0.141629464285714*G0_6_0_1 + 0.0572544642857142*G0_7_0_1 - 0.00301339285714284*G0_8_0_1 - 0.102455357142857*G0_9_0_1; + A[60] = -A[40] + 0.09375*G0_0_1_0 + 0.09375*G0_0_1_1 + 0.0274553571428572*G0_1_1_0 + 0.0274553571428571*G0_1_1_1 + 0.0281250000000001*G0_2_1_0 + 0.0281250000000001*G0_2_1_1 - 0.0572544642857143*G0_3_1_0 - 0.0572544642857143*G0_3_1_1 + 0.0030133928571429*G0_4_1_0 + 0.00301339285714293*G0_4_1_1 + 0.0150669642857142*G0_5_1_0 + 0.0150669642857143*G0_5_1_1 + 0.02109375*G0_6_1_0 + 0.02109375*G0_6_1_1 + 0.141629464285714*G0_7_1_0 + 0.141629464285714*G0_7_1_1 - 0.0753348214285714*G0_8_1_0 - 0.0753348214285714*G0_8_1_1 + 0.102455357142857*G0_9_1_0 + 0.102455357142857*G0_9_1_1; + A[75] = -A[73] - 0.0662946428571428*G0_0_0_0 + 0.304352678571428*G0_0_0_1 + 0.0180803571428572*G0_0_1_0 - 0.0452008928571427*G0_0_1_1 + 0.0241071428571427*G0_1_0_0 + 0.18984375*G0_1_0_1 + 0.060267857142857*G0_1_1_0 + 0.174776785714285*G0_1_1_1 - 0.0120535714285715*G0_2_0_0 + 0.0301339285714285*G0_2_0_1 + 0.0120535714285714*G0_2_1_0 + 0.271205357142856*G0_3_0_0 + 0.280245535714285*G0_3_0_1 + 0.271205357142857*G0_3_1_0 + 0.316406249999999*G0_3_1_1 + 0.108482142857143*G0_4_0_0 + 0.00904017857142875*G0_4_0_1 + 0.108482142857143*G0_4_1_0 + 0.0180803571428573*G0_4_1_1 - 0.3796875*G0_5_0_0 + 0.153683035714285*G0_5_0_1 + 0.162723214285714*G0_5_1_0 - 0.0452008928571429*G0_5_1_1 + 0.108482142857143*G0_6_0_0 - 0.0632812499999998*G0_6_0_1 + 0.0904017857142856*G0_6_1_1 - 0.108482142857143*G0_7_0_0 + 0.108482142857143*G0_7_0_1 + 0.108482142857143*G0_7_1_0 - 0.343526785714286*G0_7_1_1 + 0.0542410714285713*G0_8_0_0 - 0.162723214285714*G0_8_0_1 - 0.0542410714285716*G0_8_1_0 + 0.00904017857142839*G0_8_1_1 + 0.162723214285714*G0_9_0_1 + 0.325446428571429*G0_9_1_0 + 0.162723214285714*G0_9_1_1; + A[99] = 0.0723214285714289*G0_0_0_0 + 0.0723214285714288*G0_0_0_1 + 0.0723214285714288*G0_0_1_0 + 0.072321428571429*G0_0_1_1 + 0.0723214285714286*G0_1_0_0 + 0.0723214285714287*G0_2_1_1 + 0.650892857142856*G0_3_0_0 + 0.650892857142856*G0_3_0_1 + 0.650892857142856*G0_3_1_0 + 0.650892857142856*G0_3_1_1 + 0.650892857142856*G0_4_0_0 + 0.650892857142856*G0_4_0_1 + 0.650892857142856*G0_4_1_0 + 0.650892857142856*G0_4_1_1 + 0.650892857142857*G0_5_0_0 + 0.650892857142856*G0_6_0_0 + 0.650892857142858*G0_7_1_1 + 0.650892857142857*G0_8_1_1 + 1.30178571428571*G0_9_0_0 + 0.650892857142857*G0_9_0_1 + 0.650892857142856*G0_9_1_0 + 1.30178571428571*G0_9_1_1; + A[78] = -A[73] - 0.135602678571428*G0_0_0_0 + 0.0452008928571428*G0_0_1_0 - 0.102455357142857*G0_1_0_0 - 0.0964285714285712*G0_1_1_0 - 0.0542410714285714*G0_2_0_0 - 0.0572544642857142*G0_2_1_0 - 0.0632812499999998*G0_3_0_0 - 0.0542410714285711*G0_3_1_0 + 0.180803571428571*G0_4_0_0 + 0.216964285714285*G0_4_1_0 - 0.352566964285714*G0_5_0_0 - 0.0452008928571428*G0_5_1_0 + 0.162723214285714*G0_6_0_0 + 0.117522321428571*G0_6_1_0 - 0.235044642857143*G0_7_0_0 - 0.325446428571429*G0_7_1_0 - 0.207924107142857*G0_8_0_0 - 0.271205357142857*G0_8_1_0 - 0.542410714285714*G0_9_0_0 - 0.542410714285714*G0_9_1_0; + A[21] = 0.00595238095238096*G0_0_1_0 + 0.0206845238095238*G0_1_1_0 + 0.0206845238095239*G0_2_1_0 - 0.00167410714285721*G0_3_1_0 - 0.00167410714285706*G0_4_1_0 - 0.0137276785714286*G0_5_1_0 + 0.0284598214285715*G0_6_1_0 - 0.0137276785714285*G0_7_1_0 + 0.0284598214285714*G0_8_1_0 + 0.0140625*G0_9_1_0; + A[1] = -A[21] - 0.0206845238095238*G0_0_0_0 - 0.0147321428571428*G0_0_1_0 - 0.0206845238095238*G0_1_0_0 - 0.00595238095238096*G0_2_0_0 + 0.0147321428571429*G0_2_1_0 - 0.0284598214285714*G0_3_0_0 - 0.0301339285714286*G0_3_1_0 + 0.0137276785714286*G0_4_0_0 + 0.0120535714285715*G0_4_1_0 - 0.0284598214285714*G0_5_0_0 - 0.0421875*G0_5_1_0 + 0.0137276785714285*G0_6_0_0 + 0.0421875*G0_6_1_0 + 0.00167410714285718*G0_7_0_0 - 0.0120535714285714*G0_7_1_0 + 0.00167410714285709*G0_8_0_0 + 0.0301339285714285*G0_8_1_0 - 0.0140625*G0_9_0_0; + A[72] = A[82] + 0.0421874999999999*G0_0_0_1 - 0.00803571428571425*G0_0_1_1 + 0.0421874999999999*G0_1_0_1 + 0.0502232142857141*G0_1_1_1 - 0.0180803571428572*G0_3_0_1 - 0.0331473214285715*G0_3_1_1 + 0.00301339285714295*G0_4_1_1 - 0.0180803571428573*G0_5_0_1 + 0.0150669642857142*G0_5_1_1 - 0.00301339285714262*G0_6_1_1 - 0.0421875*G0_7_0_1 - 0.0753348214285713*G0_7_1_1 - 0.0421875*G0_8_0_1 + 0.0331473214285713*G0_8_1_1 + 0.0361607142857142*G0_9_0_1 + 0.0180803571428571*G0_9_1_1; + A[15] = A[16] - 0.00803571428571427*G0_0_0_0 + 0.0421874999999999*G0_0_0_1 + 0.0502232142857144*G0_2_0_0 + 0.0421875000000001*G0_2_0_1 + 0.00301339285714269*G0_3_0_0 - 0.0331473214285712*G0_4_0_0 - 0.0180803571428569*G0_4_0_1 - 0.0753348214285715*G0_5_0_0 - 0.0421875000000001*G0_5_0_1 + 0.0331473214285717*G0_6_0_0 - 0.0421874999999997*G0_6_0_1 + 0.0150669642857143*G0_7_0_0 - 0.0180803571428571*G0_7_0_1 - 0.00301339285714301*G0_8_0_0 + 0.018080357142857*G0_9_0_0 + 0.0361607142857142*G0_9_0_1; + A[51] = A[15] - 0.0284598214285714*G0_0_0_1 + 0.0284598214285714*G0_0_1_0 - 0.0137276785714286*G0_2_0_1 + 0.0137276785714286*G0_2_1_0 - 0.0150669642857142*G0_3_0_1 + 0.0150669642857142*G0_3_1_0 + 0.0150669642857142*G0_4_0_1 - 0.0150669642857142*G0_4_1_0 + 0.0421874999999999*G0_6_0_1 - 0.0421874999999999*G0_6_1_0 + 0.00301339285714285*G0_7_0_1 - 0.00301339285714285*G0_7_1_0 + 0.0150669642857143*G0_8_0_1 - 0.0150669642857143*G0_8_1_0 - 0.0180803571428571*G0_9_0_1 + 0.0180803571428571*G0_9_1_0; + A[31] = A[51] + 0.0107142857142857*G0_0_0_0 + 0.0348214285714285*G0_1_0_0 + 0.239732142857142*G0_1_1_0 - 0.0187500000000001*G0_2_0_0 + 0.0147321428571427*G0_2_1_0 + 0.1265625*G0_3_0_0 + 0.286272321428571*G0_3_1_0 - 0.0662946428571428*G0_4_0_0 - 0.111495535714285*G0_4_1_0 + 0.0542410714285714*G0_5_0_0 - 0.0150669642857143*G0_5_1_0 - 0.0301339285714287*G0_6_0_0 + 0.0271205357142857*G0_6_1_0 - 0.0421875*G0_7_0_0 - 0.123549107142857*G0_7_1_0 + 0.0662946428571428*G0_8_0_0 + 0.31640625*G0_8_1_0 - 0.0602678571428568*G0_9_0_0 + 0.0783482142857143*G0_9_1_0; + A[22] = 0.0180059523809524*G0_0_1_1 + 0.0180059523809524*G0_1_1_1 + 0.131845238095238*G0_2_1_1 - 0.0529017857142858*G0_3_1_1 + 0.139955357142857*G0_4_1_1 - 0.0529017857142858*G0_5_1_1 + 0.139955357142857*G0_6_1_1 + 0.0073660714285714*G0_7_1_1 + 0.00736607142857142*G0_8_1_1 + 0.0683035714285713*G0_9_1_1; + A[27] = A[72] - 0.0284598214285713*G0_0_0_1 + 0.0284598214285713*G0_0_1_0 - 0.0137276785714285*G0_1_0_1 + 0.0137276785714285*G0_1_1_0 + 0.0150669642857143*G0_3_0_1 - 0.0150669642857143*G0_3_1_0 - 0.0150669642857143*G0_4_0_1 + 0.0150669642857143*G0_4_1_0 + 0.00301339285714292*G0_5_0_1 - 0.00301339285714292*G0_5_1_0 + 0.0150669642857142*G0_6_0_1 - 0.0150669642857142*G0_6_1_0 + 0.0421875*G0_8_0_1 - 0.0421875*G0_8_1_0 - 0.0180803571428571*G0_9_0_1 + 0.0180803571428571*G0_9_1_0; + A[26] = -A[27] - 0.0381696428571429*G0_0_1_1 - 0.014732142857143*G0_1_1_0 - 0.00870535714285726*G0_1_1_1 - 0.239732142857143*G0_2_1_0 - 0.195535714285715*G0_2_1_1 + 0.111495535714286*G0_3_1_0 + 0.0602678571428573*G0_3_1_1 - 0.286272321428572*G0_4_1_0 - 0.192857142857143*G0_4_1_1 + 0.123549107142857*G0_5_1_0 + 0.0361607142857145*G0_5_1_1 - 0.31640625*G0_6_1_0 - 0.132589285714286*G0_6_1_1 + 0.0150669642857142*G0_7_1_0 - 0.114508928571428*G0_7_1_1 - 0.0271205357142857*G0_8_1_0 - 0.0301339285714285*G0_8_1_1 - 0.0783482142857142*G0_9_1_0 - 0.0964285714285714*G0_9_1_1; + A[92] = 0.0140625*G0_0_0_1 + 0.00200892857142857*G0_0_1_1 - 0.0140625*G0_1_0_1 - 0.0120535714285714*G0_1_1_1 - 0.0441964285714287*G0_2_1_1 + 0.0843749999999999*G0_3_0_1 + 0.120535714285714*G0_3_1_1 - 0.0964285714285714*G0_4_0_1 - 0.186830357142857*G0_4_1_1 - 0.0843749999999999*G0_5_0_1 + 0.0361607142857144*G0_5_1_1 + 0.0964285714285712*G0_6_0_1 - 0.0904017857142858*G0_6_1_1 - 0.0180803571428571*G0_7_0_1 + 0.0783482142857142*G0_7_1_1 + 0.0180803571428572*G0_8_0_1 + 0.0964285714285713*G0_8_1_1; + A[61] = A[16] + 0.0137276785714286*G0_0_0_1 - 0.0137276785714286*G0_0_1_0 + 0.0284598214285716*G0_2_0_1 - 0.0284598214285716*G0_2_1_0 - 0.0150669642857144*G0_3_0_1 + 0.0150669642857144*G0_3_1_0 - 0.00301339285714267*G0_4_0_1 + 0.00301339285714267*G0_4_1_0 - 0.0421875000000001*G0_5_0_1 + 0.0421875000000001*G0_5_1_0 - 0.0150669642857143*G0_7_0_1 + 0.0150669642857143*G0_7_1_0 + 0.0150669642857142*G0_8_0_1 - 0.0150669642857142*G0_8_1_0 + 0.0180803571428571*G0_9_0_1 - 0.0180803571428571*G0_9_1_0; + A[41] = -A[61] - 0.0274553571428572*G0_0_1_0 - 0.0937499999999998*G0_1_1_0 - 0.028125*G0_2_1_0 - 0.015066964285714*G0_3_1_0 - 0.0210937500000002*G0_4_1_0 + 0.0572544642857143*G0_5_1_0 - 0.00301339285714307*G0_6_1_0 + 0.0753348214285714*G0_7_1_0 - 0.141629464285714*G0_8_1_0 - 0.102455357142857*G0_9_1_0; + A[71] = -A[41] + 0.0328125*G0_0_0_0 - 0.0140625*G0_0_1_0 + 0.0843749999999998*G0_1_0_0 + 0.0468750000000001*G0_2_0_0 + 0.0140625*G0_2_1_0 + 0.0843749999999997*G0_3_0_0 + 0.0964285714285713*G0_3_1_0 - 0.0542410714285712*G0_4_0_0 - 0.0843749999999998*G0_4_1_0 + 0.060267857142857*G0_5_0_0 + 0.0180803571428571*G0_5_1_0 + 0.0421875000000001*G0_6_0_0 - 0.0180803571428571*G0_6_1_0 + 0.0301339285714286*G0_7_0_0 + 0.084375*G0_7_1_0 - 0.0120535714285715*G0_8_0_0 - 0.0964285714285714*G0_8_1_0 + 0.060267857142857*G0_9_0_0; + A[57] = A[75] - 0.301339285714285*G0_0_0_1 + 0.301339285714285*G0_0_1_0 - 0.00301339285714288*G0_1_0_1 + 0.00301339285714288*G0_1_1_0 - 0.00301339285714278*G0_2_0_1 + 0.00301339285714278*G0_2_1_0 - 0.00904017857142847*G0_3_0_1 + 0.00904017857142845*G0_3_1_0 - 0.00904017857142869*G0_4_0_1 + 0.00904017857142868*G0_4_1_0 + 0.0542410714285711*G0_6_0_1 - 0.0542410714285712*G0_6_1_0 + 0.0542410714285712*G0_8_0_1 - 0.0542410714285712*G0_8_1_0 + 0.216964285714286*G0_9_0_1 - 0.216964285714286*G0_9_1_0; + A[13] = -A[16] + 0.00602678571428569*G0_0_0_0 + 0.0147321428571429*G0_0_0_1 + 0.0441964285714284*G0_1_0_0 + 0.239732142857142*G0_1_0_1 - 0.0381696428571431*G0_2_0_0 + 0.183816964285714*G0_3_0_0 + 0.316406249999999*G0_3_0_1 - 0.0873883928571428*G0_4_0_0 - 0.123549107142857*G0_4_0_1 - 0.00301339285714278*G0_5_0_0 + 0.0271205357142857*G0_5_0_1 - 0.129575892857143*G0_6_0_0 - 0.0150669642857143*G0_6_0_1 - 0.0512276785714286*G0_7_0_0 - 0.111495535714286*G0_7_0_1 + 0.0934151785714285*G0_8_0_0 + 0.286272321428571*G0_8_0_1 - 0.0180803571428569*G0_9_0_0 + 0.0783482142857143*G0_9_0_1; + A[48] = A[37] + 0.0120535714285715*G0_0_0_0 - 0.0120535714285715*G0_0_0_1 + 0.0180803571428571*G0_0_1_0 - 0.0120535714285714*G0_0_1_1 - 0.018080357142857*G0_1_0_0 - 0.018080357142857*G0_1_0_1 - 0.0180803571428572*G0_1_1_0 + 0.00602678571428559*G0_2_0_0 + 0.0301339285714285*G0_2_0_1 + 0.0120535714285714*G0_2_1_1 - 0.18984375*G0_3_0_0 - 0.216964285714285*G0_3_0_1 - 0.271205357142857*G0_3_1_0 - 0.325446428571428*G0_3_1_1 - 0.0271205357142859*G0_4_0_0 - 0.0542410714285713*G0_4_0_1 + 0.0542410714285713*G0_4_1_0 + 0.0813616071428573*G0_5_0_0 - 0.0813616071428573*G0_6_0_0 + 0.0271205357142856*G0_7_0_0 + 0.0542410714285712*G0_7_0_1 - 0.0542410714285716*G0_7_1_0 + 0.0271205357142857*G0_8_0_0 + 0.0542410714285716*G0_8_0_1 + 0.108482142857143*G0_8_1_0 + 0.325446428571429*G0_8_1_1 + 0.162723214285714*G0_9_0_0 + 0.162723214285714*G0_9_0_1 + 0.162723214285714*G0_9_1_0; + A[30] = A[4] - 0.00803571428571426*G0_1_0_0 - 0.0217633928571428*G0_1_0_1 - 0.0364955357142857*G0_1_1_0 - 0.0502232142857142*G0_1_1_1 + 0.0502232142857145*G0_2_0_0 + 0.0217633928571429*G0_2_0_1 + 0.0364955357142858*G0_2_1_0 + 0.00803571428571431*G0_2_1_1 - 0.0753348214285713*G0_3_0_0 - 0.0331473214285713*G0_3_0_1 - 0.0753348214285713*G0_3_1_0 - 0.0331473214285713*G0_3_1_1 + 0.0331473214285717*G0_4_0_0 + 0.0331473214285716*G0_4_0_1 + 0.0753348214285716*G0_4_1_0 + 0.0753348214285714*G0_4_1_1 + 0.00301339285714279*G0_5_0_0 + 0.0180803571428571*G0_5_0_1 - 0.0120535714285716*G0_5_1_0 + 0.00301339285714269*G0_5_1_1 - 0.0331473214285712*G0_6_0_0 - 0.0301339285714284*G0_6_0_1 - 0.018080357142857*G0_6_1_0 - 0.0150669642857141*G0_6_1_1 - 0.00301339285714289*G0_7_0_0 - 0.0180803571428572*G0_7_0_1 + 0.0120535714285712*G0_7_1_0 - 0.00301339285714314*G0_7_1_1 + 0.0150669642857143*G0_8_0_0 + 0.0301339285714285*G0_8_0_1 + 0.0180803571428571*G0_8_1_0 + 0.0331473214285715*G0_8_1_1 + 0.0180803571428571*G0_9_0_0 - 0.0180803571428571*G0_9_1_1; + A[28] = A[82] + 0.0137276785714285*G0_0_0_1 - 0.0137276785714285*G0_0_1_0 + 0.0284598214285713*G0_1_0_1 - 0.0284598214285713*G0_1_1_0 - 0.0030133928571429*G0_3_0_1 + 0.0030133928571429*G0_3_1_0 - 0.0150669642857142*G0_4_0_1 + 0.0150669642857142*G0_4_1_0 - 0.0150669642857144*G0_5_0_1 + 0.0150669642857143*G0_5_1_0 + 0.0150669642857144*G0_6_0_1 - 0.0150669642857144*G0_6_1_0 - 0.0421874999999999*G0_7_0_1 + 0.0421874999999999*G0_7_1_0 + 0.0180803571428571*G0_9_0_1 - 0.0180803571428571*G0_9_1_0; + A[80] = -A[30] + 0.0937499999999999*G0_0_0_0 + 0.0937499999999999*G0_0_0_1 + 0.028125*G0_1_0_0 + 0.028125*G0_1_0_1 + 0.0274553571428572*G0_2_0_0 + 0.0274553571428572*G0_2_0_1 + 0.00301339285714287*G0_3_0_0 + 0.00301339285714285*G0_3_0_1 - 0.0572544642857142*G0_4_0_0 - 0.0572544642857141*G0_4_0_1 + 0.141629464285714*G0_5_0_0 + 0.141629464285714*G0_5_0_1 - 0.0753348214285713*G0_6_0_0 - 0.0753348214285713*G0_6_0_1 + 0.0150669642857142*G0_7_0_0 + 0.0150669642857142*G0_7_0_1 + 0.02109375*G0_8_0_0 + 0.02109375*G0_8_0_1 + 0.102455357142857*G0_9_0_0 + 0.102455357142857*G0_9_0_1; + A[62] = A[82] - 0.014732142857143*G0_0_0_1 - 0.0334821428571429*G0_0_1_1 + 0.0107142857142855*G0_1_1_1 - 0.239732142857143*G0_2_0_1 - 0.204910714285715*G0_2_1_1 + 0.123549107142857*G0_3_0_1 + 0.0813616071428572*G0_3_1_1 - 0.31640625*G0_4_0_1 - 0.250111607142857*G0_4_1_1 + 0.111495535714286*G0_5_0_1 + 0.045200892857143*G0_5_1_1 - 0.286272321428571*G0_6_0_1 - 0.159709821428572*G0_6_1_1 - 0.0271205357142856*G0_7_0_1 - 0.0572544642857141*G0_7_1_1 + 0.0150669642857142*G0_8_0_1 + 0.0693080357142856*G0_8_1_1 - 0.0783482142857142*G0_9_0_1 - 0.138616071428571*G0_9_1_1; + A[14] = -A[16] - 0.0274553571428571*G0_0_0_1 - 0.0937499999999998*G0_1_0_1 - 0.028125*G0_2_0_1 - 0.015066964285714*G0_3_0_1 - 0.0210937500000002*G0_4_0_1 + 0.0572544642857143*G0_5_0_1 - 0.00301339285714306*G0_6_0_1 + 0.0753348214285714*G0_7_0_1 - 0.141629464285714*G0_8_0_1 - 0.102455357142857*G0_9_0_1; + A[23] = -A[28] - 0.0274553571428571*G0_0_1_0 - 0.028125*G0_1_1_0 - 0.0937500000000001*G0_2_1_0 - 0.0210937499999998*G0_3_1_0 - 0.0150669642857145*G0_4_1_0 + 0.0753348214285715*G0_5_1_0 - 0.141629464285714*G0_6_1_0 + 0.0572544642857142*G0_7_1_0 - 0.00301339285714284*G0_8_1_0 - 0.102455357142857*G0_9_1_0; + A[25] = -A[23] - 0.0140625*G0_0_1_0 + 0.0328125*G0_0_1_1 + 0.0140625*G0_1_1_0 + 0.0468749999999999*G0_1_1_1 + 0.0843750000000003*G0_2_1_1 - 0.084375*G0_3_1_0 - 0.0542410714285716*G0_3_1_1 + 0.0964285714285714*G0_4_1_0 + 0.0843750000000003*G0_4_1_1 + 0.0843749999999999*G0_5_1_0 + 0.0301339285714283*G0_5_1_1 - 0.0964285714285712*G0_6_1_0 - 0.012053571428571*G0_6_1_1 + 0.0180803571428571*G0_7_1_0 + 0.0602678571428571*G0_7_1_1 - 0.0180803571428572*G0_8_1_0 + 0.0421874999999999*G0_8_1_1 + 0.0602678571428571*G0_9_1_1; + A[87] = -A[37] - 0.135602678571428*G0_0_0_0 + 0.0452008928571428*G0_0_0_1 - 0.102455357142857*G0_1_0_0 - 0.0964285714285712*G0_1_0_1 - 0.0542410714285714*G0_2_0_0 - 0.0572544642857142*G0_2_0_1 - 0.0632812499999998*G0_3_0_0 - 0.0542410714285711*G0_3_0_1 + 0.180803571428571*G0_4_0_0 + 0.216964285714285*G0_4_0_1 - 0.352566964285714*G0_5_0_0 - 0.0452008928571428*G0_5_0_1 + 0.162723214285714*G0_6_0_0 + 0.117522321428571*G0_6_0_1 - 0.235044642857143*G0_7_0_0 - 0.325446428571429*G0_7_0_1 - 0.207924107142857*G0_8_0_0 - 0.271205357142857*G0_8_0_1 - 0.542410714285714*G0_9_0_0 - 0.542410714285714*G0_9_0_1; + A[42] = -A[62] - 0.0274553571428572*G0_0_1_1 - 0.0274553571428571*G0_1_1_1 - 0.160714285714286*G0_2_1_1 - 0.00602678571428548*G0_3_1_1 - 0.0662946428571431*G0_4_1_1 - 0.00602678571428556*G0_5_1_1 - 0.0662946428571431*G0_6_1_1 - 0.0602678571428571*G0_7_1_1 - 0.060267857142857*G0_8_1_1 - 0.156696428571428*G0_9_1_1; + A[96] = A[69] - 0.084375*G0_0_0_1 + 0.084375*G0_0_1_0 + 0.0180803571428571*G0_1_0_1 - 0.0180803571428571*G0_1_1_0 - 0.0964285714285716*G0_2_0_1 + 0.0964285714285716*G0_2_1_0 - 0.0542410714285713*G0_3_0_1 + 0.0542410714285713*G0_3_1_0 - 0.216964285714286*G0_4_0_1 + 0.216964285714286*G0_4_1_0 + 0.488169642857142*G0_5_0_1 - 0.488169642857142*G0_5_1_0 + 0.0542410714285711*G0_7_0_1 - 0.0542410714285711*G0_7_1_0 - 0.108482142857143*G0_8_0_1 + 0.108482142857143*G0_8_1_0; + A[94] = -A[96] - 0.102455357142857*G0_0_0_1 - 0.090401785714286*G0_0_1_1 + 0.102455357142857*G0_1_0_1 + 0.0120535714285713*G0_1_1_1 + 0.0602678571428573*G0_2_1_1 - 0.542410714285714*G0_3_0_1 - 0.433928571428571*G0_3_1_1 - 0.216964285714286*G0_4_0_1 - 0.271205357142857*G0_4_1_1 + 0.542410714285713*G0_5_0_1 + 0.108482142857142*G0_5_1_1 + 0.216964285714285*G0_6_0_1 - 0.0542410714285712*G0_6_1_1 + 0.162723214285714*G0_7_0_1 - 0.271205357142858*G0_7_1_1 - 0.162723214285714*G0_8_0_1 - 0.433928571428571*G0_8_1_1 - 0.650892857142857*G0_9_1_1; + A[93] = A[94] - 0.0542410714285716*G0_0_0_0 + 0.0180803571428572*G0_0_0_1 - 0.018080357142857*G0_0_1_0 + 0.0542410714285717*G0_0_1_1 - 0.0180803571428571*G0_1_0_0 - 0.144642857142856*G0_1_0_1 + 0.0361607142857144*G0_1_1_0 - 0.0361607142857141*G0_2_0_1 + 0.144642857142857*G0_2_1_0 + 0.0180803571428573*G0_2_1_1 - 0.650892857142856*G0_3_0_0 - 0.162723214285714*G0_3_0_1 - 0.650892857142856*G0_3_1_0 + 0.650892857142856*G0_4_0_1 + 0.162723214285715*G0_4_1_0 + 0.650892857142856*G0_4_1_1 - 0.162723214285714*G0_5_0_1 - 0.162723214285714*G0_5_1_1 - 0.650892857142856*G0_6_0_0 + 0.162723214285715*G0_6_1_0 + 0.162723214285714*G0_6_1_1 + 0.162723214285714*G0_7_0_0 + 0.162723214285714*G0_7_1_0 - 0.162723214285714*G0_8_0_0 - 0.162723214285714*G0_8_0_1 + 0.650892857142857*G0_8_1_1 - 0.650892857142856*G0_9_0_0 + 0.650892857142857*G0_9_1_1; + A[97] = -A[94] + 0.0542410714285714*G0_0_0_0 - 0.0723214285714287*G0_0_0_1 + 0.0421874999999999*G0_0_1_0 - 0.072321428571429*G0_0_1_1 - 0.0120535714285713*G0_1_0_0 + 0.0120535714285713*G0_2_0_0 - 0.114508928571429*G0_2_1_0 - 0.0723214285714287*G0_2_1_1 - 0.271205357142857*G0_3_0_0 - 0.650892857142856*G0_3_0_1 - 0.216964285714285*G0_3_1_0 - 0.650892857142856*G0_3_1_1 - 0.433928571428571*G0_4_0_0 - 0.650892857142856*G0_4_0_1 - 0.542410714285714*G0_4_1_0 - 0.650892857142857*G0_4_1_1 + 0.3796875*G0_5_0_0 + 0.162723214285714*G0_5_1_0 + 0.216964285714285*G0_6_0_0 - 0.162723214285715*G0_6_1_0 + 0.108482142857143*G0_7_0_0 - 0.108482142857143*G0_7_1_0 - 0.650892857142858*G0_7_1_1 - 0.0542410714285713*G0_8_0_0 - 0.433928571428571*G0_8_1_0 - 0.650892857142856*G0_8_1_1 - 0.650892857142857*G0_9_0_1 - 0.650892857142857*G0_9_1_0 - 1.30178571428571*G0_9_1_1; + A[39] = A[93] - 0.0180803571428572*G0_0_0_1 + 0.0180803571428572*G0_0_1_0 + 0.096428571428571*G0_1_0_1 - 0.096428571428571*G0_1_1_0 + 0.0843749999999999*G0_2_0_1 - 0.0843749999999999*G0_2_1_0 - 0.488169642857142*G0_4_0_1 + 0.488169642857142*G0_4_1_0 + 0.108482142857142*G0_5_0_1 - 0.108482142857143*G0_5_1_0 - 0.0542410714285713*G0_6_0_1 + 0.0542410714285713*G0_6_1_0 + 0.0542410714285712*G0_7_0_1 - 0.0542410714285712*G0_7_1_0 + 0.216964285714285*G0_8_0_1 - 0.216964285714285*G0_8_1_0; + A[89] = -A[39] - 0.0904017857142859*G0_0_0_0 - 0.102455357142857*G0_0_0_1 + 0.0602678571428568*G0_1_0_0 + 0.0120535714285714*G0_2_0_0 + 0.102455357142857*G0_2_0_1 - 0.271205357142857*G0_3_0_0 - 0.216964285714286*G0_3_0_1 - 0.43392857142857*G0_4_0_0 - 0.542410714285713*G0_4_0_1 - 0.271205357142857*G0_5_0_0 + 0.162723214285714*G0_5_0_1 - 0.433928571428571*G0_6_0_0 - 0.162723214285714*G0_6_0_1 + 0.108482142857143*G0_7_0_0 + 0.542410714285714*G0_7_0_1 - 0.0542410714285714*G0_8_0_0 + 0.216964285714286*G0_8_0_1 - 0.650892857142857*G0_9_0_0; + A[98] = A[89] + 0.0843750000000001*G0_0_0_1 - 0.0843750000000001*G0_0_1_0 + 0.0964285714285713*G0_1_0_1 - 0.0964285714285713*G0_1_1_0 - 0.0180803571428572*G0_2_0_1 + 0.0180803571428572*G0_2_1_0 + 0.216964285714285*G0_3_0_1 - 0.216964285714285*G0_3_1_0 + 0.0542410714285714*G0_4_0_1 - 0.0542410714285713*G0_4_1_0 - 0.0542410714285713*G0_5_0_1 + 0.0542410714285713*G0_5_1_0 + 0.108482142857143*G0_6_0_1 - 0.108482142857143*G0_6_1_0 - 0.488169642857143*G0_7_0_1 + 0.488169642857143*G0_7_1_0; + A[6] = -A[4] + 0.09375*G0_0_0_1 + 0.09375*G0_0_1_1 + 0.0274553571428572*G0_1_0_1 + 0.0274553571428571*G0_1_1_1 + 0.0281250000000001*G0_2_0_1 + 0.0281250000000001*G0_2_1_1 - 0.0572544642857143*G0_3_0_1 - 0.0572544642857143*G0_3_1_1 + 0.0030133928571429*G0_4_0_1 + 0.00301339285714293*G0_4_1_1 + 0.0150669642857142*G0_5_0_1 + 0.0150669642857143*G0_5_1_1 + 0.02109375*G0_6_0_1 + 0.02109375*G0_6_1_1 + 0.141629464285714*G0_7_0_1 + 0.141629464285714*G0_7_1_1 - 0.0753348214285713*G0_8_0_1 - 0.0753348214285714*G0_8_1_1 + 0.102455357142857*G0_9_0_1 + 0.102455357142857*G0_9_1_1; + A[17] = -A[14] + 0.0328125*G0_0_0_0 - 0.0140625*G0_0_0_1 + 0.0843749999999998*G0_1_0_0 + 0.0468750000000001*G0_2_0_0 + 0.0140625*G0_2_0_1 + 0.0843749999999997*G0_3_0_0 + 0.0964285714285713*G0_3_0_1 - 0.0542410714285712*G0_4_0_0 - 0.0843749999999998*G0_4_0_1 + 0.060267857142857*G0_5_0_0 + 0.0180803571428571*G0_5_0_1 + 0.0421875000000001*G0_6_0_0 - 0.0180803571428571*G0_6_0_1 + 0.0301339285714286*G0_7_0_0 + 0.084375*G0_7_0_1 - 0.0120535714285715*G0_8_0_0 - 0.0964285714285714*G0_8_0_1 + 0.060267857142857*G0_9_0_0; + A[24] = -A[26] - 0.0274553571428572*G0_0_1_1 - 0.0274553571428571*G0_1_1_1 - 0.160714285714286*G0_2_1_1 - 0.00602678571428551*G0_3_1_1 - 0.0662946428571431*G0_4_1_1 - 0.00602678571428555*G0_5_1_1 - 0.0662946428571431*G0_6_1_1 - 0.0602678571428571*G0_7_1_1 - 0.060267857142857*G0_8_1_1 - 0.156696428571428*G0_9_1_1; + A[84] = A[48] + 0.0150669642857143*G0_0_0_1 - 0.0150669642857143*G0_0_1_0 + 0.1265625*G0_1_0_1 - 0.1265625*G0_1_1_0 - 0.0150669642857142*G0_2_0_1 + 0.0150669642857142*G0_2_1_0 - 0.0542410714285715*G0_3_0_1 + 0.0542410714285715*G0_3_1_0 - 0.00904017857142863*G0_5_0_1 + 0.00904017857142863*G0_5_1_0 - 0.0090401785714283*G0_6_0_1 + 0.0090401785714283*G0_6_1_0 - 0.108482142857143*G0_7_0_1 + 0.108482142857143*G0_7_1_0 + 0.054241071428571*G0_9_0_1 - 0.054241071428571*G0_9_1_0; + A[86] = -A[84] + 0.0753348214285713*G0_0_0_1 - 0.00301339285714277*G0_0_1_1 + 0.141629464285714*G0_1_0_1 + 0.180803571428571*G0_1_1_1 + 0.00602678571428576*G0_2_1_1 - 0.0452008928571431*G0_3_0_1 - 0.0904017857142859*G0_3_1_1 + 0.00904017857142876*G0_4_0_1 - 0.0632812499999998*G0_4_1_1 - 0.117522321428571*G0_5_0_1 + 0.0361607142857143*G0_5_1_1 - 0.00904017857142835*G0_6_0_1 + 0.00904017857142868*G0_6_1_1 - 0.216964285714286*G0_7_0_1 - 0.0452008928571426*G0_7_1_1 + 0.307366071428571*G0_8_1_1 + 0.162723214285714*G0_9_0_1; + A[36] = -A[86] - 0.00301339285714279*G0_0_0_0 + 0.0753348214285713*G0_0_0_1 + 0.00602678571428575*G0_1_0_0 + 0.180803571428572*G0_2_0_0 + 0.141629464285715*G0_2_0_1 - 0.0632812500000002*G0_3_0_0 + 0.00904017857142837*G0_3_0_1 - 0.0904017857142852*G0_4_0_0 - 0.0452008928571422*G0_4_0_1 - 0.045200892857143*G0_5_0_0 - 0.216964285714286*G0_5_0_1 + 0.307366071428572*G0_6_0_0 + 0.0361607142857144*G0_7_0_0 - 0.117522321428571*G0_7_0_1 + 0.00904017857142863*G0_8_0_0 - 0.00904017857142848*G0_8_0_1 + 0.162723214285714*G0_9_0_1; + A[45] = A[36] + 0.0120535714285714*G0_0_0_0 - 0.0180803571428572*G0_0_0_1 + 0.0120535714285715*G0_0_1_0 - 0.0120535714285715*G0_0_1_1 - 0.0120535714285714*G0_1_0_0 - 0.0301339285714285*G0_1_1_0 - 0.00602678571428567*G0_1_1_1 + 0.0180803571428573*G0_2_0_1 + 0.0180803571428574*G0_2_1_0 + 0.0180803571428574*G0_2_1_1 - 0.0542410714285714*G0_3_0_1 + 0.0542410714285713*G0_3_1_0 + 0.0271205357142855*G0_3_1_1 + 0.325446428571428*G0_4_0_0 + 0.271205357142857*G0_4_0_1 + 0.216964285714286*G0_4_1_0 + 0.18984375*G0_4_1_1 + 0.0542410714285713*G0_5_0_1 - 0.0542410714285713*G0_5_1_0 - 0.0271205357142858*G0_5_1_1 - 0.325446428571428*G0_6_0_0 - 0.108482142857143*G0_6_0_1 - 0.054241071428571*G0_6_1_0 - 0.0271205357142853*G0_6_1_1 - 0.0813616071428572*G0_7_1_1 + 0.0813616071428571*G0_8_1_1 - 0.162723214285714*G0_9_0_1 - 0.162723214285714*G0_9_1_0 - 0.162723214285714*G0_9_1_1; + A[55] = -A[45] + 0.0210937500000002*G0_0_0_0 - 0.0632812499999998*G0_0_0_1 - 0.0482142857142854*G0_0_1_0 + 0.301339285714285*G0_0_1_1 + 0.0693080357142859*G0_1_0_0 + 0.0301339285714287*G0_1_0_1 + 0.0150669642857145*G0_1_1_0 + 0.0542410714285715*G0_1_1_1 + 0.253125*G0_2_0_0 + 0.204910714285715*G0_2_0_1 + 0.0783482142857146*G0_2_1_0 + 0.111495535714286*G0_2_1_1 - 0.162723214285714*G0_3_0_0 - 0.108482142857143*G0_3_0_1 - 0.00904017857142893*G0_3_1_1 + 0.488169642857143*G0_4_0_0 + 0.461049107142857*G0_4_0_1 + 0.461049107142857*G0_4_1_0 + 0.397767857142857*G0_4_1_1 + 0.488169642857142*G0_5_0_0 + 0.253124999999999*G0_5_1_1 + 0.162723214285715*G0_6_0_0 + 0.244084821428572*G0_6_0_1 + 0.298325892857143*G0_6_1_0 + 0.117522321428572*G0_6_1_1 + 0.18984375*G0_7_0_0 - 0.0813616071428573*G0_7_0_1 - 0.0723214285714284*G0_7_1_0 + 0.325446428571428*G0_7_1_1 - 0.135602678571428*G0_8_0_0 + 0.00904017857142865*G0_8_1_0 - 0.135602678571428*G0_8_1_1 + 0.650892857142857*G0_9_0_0 + 0.325446428571428*G0_9_0_1 + 0.271205357142857*G0_9_1_0 + 0.271205357142857*G0_9_1_1; + A[54] = A[45] + 0.0150669642857144*G0_0_0_1 - 0.0150669642857144*G0_0_1_0 - 0.0150669642857142*G0_1_0_1 + 0.0150669642857142*G0_1_1_0 - 0.1265625*G0_2_0_1 + 0.1265625*G0_2_1_0 + 0.108482142857143*G0_3_0_1 - 0.108482142857143*G0_3_1_0 + 0.054241071428571*G0_6_0_1 - 0.054241071428571*G0_6_1_0 + 0.00904017857142887*G0_7_0_1 - 0.00904017857142888*G0_7_1_0 + 0.00904017857142854*G0_8_0_1 - 0.00904017857142855*G0_8_1_0 - 0.0542410714285711*G0_9_0_1 + 0.0542410714285711*G0_9_1_0; + A[35] = -A[86] - 0.00602678571428567*G0_0_0_0 + 0.0421874999999998*G0_0_0_1 - 0.00301339285714286*G0_0_1_0 - 0.0271205357142855*G0_0_1_1 - 0.00904017857142861*G0_1_0_0 - 0.0723214285714285*G0_2_0_0 - 0.0693080357142857*G0_2_0_1 - 0.0241071428571427*G0_2_1_0 - 0.0271205357142855*G0_2_1_1 + 0.0994419642857142*G0_3_0_0 + 0.0632812499999999*G0_3_0_1 + 0.0542410714285712*G0_3_1_0 + 0.0723214285714283*G0_4_0_0 + 0.0904017857142855*G0_4_0_1 - 0.0271205357142856*G0_4_1_0 + 0.117522321428571*G0_5_0_0 - 0.0542410714285716*G0_5_0_1 + 0.0542410714285712*G0_5_1_0 + 0.0271205357142858*G0_5_1_1 + 0.144642857142857*G0_6_0_0 + 0.0813616071428571*G0_6_0_1 - 0.0271205357142855*G0_6_1_0 + 0.0271205357142857*G0_6_1_1 + 0.0090401785714288*G0_7_0_0 - 0.0904017857142859*G0_7_0_1 + 0.0271205357142857*G0_7_1_0 - 0.0180803571428572*G0_8_0_0 - 0.0632812499999999*G0_8_0_1 - 0.0542410714285717*G0_8_1_0; + A[85] = -A[35] + 0.0391741071428571*G0_0_0_0 - 0.141629464285714*G0_0_0_1 + 0.00602678571428583*G0_1_0_0 - 0.0783482142857144*G0_2_0_0 - 0.0753348214285715*G0_2_0_1 + 0.0180803571428574*G0_3_0_0 + 0.00904017857142866*G0_3_0_1 + 0.153683035714285*G0_4_0_0 + 0.117522321428571*G0_4_0_1 + 0.307366071428571*G0_5_0_0 + 0.171763392857142*G0_6_0_0 + 0.216964285714285*G0_6_0_1 - 0.0452008928571429*G0_7_0_0 + 0.0452008928571431*G0_7_0_1 - 0.0723214285714284*G0_8_0_0 - 0.00904017857142861*G0_8_0_1 - 0.162723214285714*G0_9_0_0 - 0.162723214285714*G0_9_0_1; + A[58] = A[85] + 0.1265625*G0_0_0_1 - 0.1265625*G0_0_1_0 - 0.0150669642857141*G0_1_0_1 + 0.0150669642857141*G0_1_1_0 + 0.0150669642857143*G0_2_0_1 - 0.0150669642857143*G0_2_1_0 - 0.00904017857142854*G0_3_0_1 + 0.00904017857142855*G0_3_1_0 - 0.00904017857142854*G0_4_0_1 + 0.00904017857142854*G0_4_1_0 - 0.108482142857143*G0_6_0_1 + 0.108482142857143*G0_6_1_0 - 0.0542410714285717*G0_7_0_1 + 0.0542410714285717*G0_7_1_0 + 0.0542410714285711*G0_9_0_1 - 0.0542410714285711*G0_9_1_0; + A[74] = -A[86] - 0.0271205357142858*G0_0_0_0 + 0.0421874999999997*G0_0_0_1 - 0.00301339285714282*G0_0_1_0 - 0.00602678571428557*G0_0_1_1 - 0.0271205357142857*G0_1_0_0 - 0.0693080357142856*G0_1_0_1 - 0.0241071428571429*G0_1_1_0 - 0.0723214285714283*G0_1_1_1 - 0.00904017857142839*G0_2_1_1 + 0.0904017857142856*G0_3_0_1 - 0.0271205357142856*G0_3_1_0 + 0.0723214285714286*G0_3_1_1 + 0.06328125*G0_4_0_1 + 0.0542410714285715*G0_4_1_0 + 0.099441964285714*G0_4_1_1 - 0.0904017857142859*G0_5_0_1 + 0.0271205357142856*G0_5_1_0 + 0.00904017857142877*G0_5_1_1 - 0.0632812499999997*G0_6_0_1 - 0.0542410714285709*G0_6_1_0 - 0.0180803571428571*G0_6_1_1 + 0.0271205357142858*G0_7_0_0 - 0.0542410714285716*G0_7_0_1 + 0.0542410714285716*G0_7_1_0 + 0.117522321428572*G0_7_1_1 + 0.0271205357142858*G0_8_0_0 + 0.0813616071428573*G0_8_0_1 - 0.0271205357142859*G0_8_1_0 + 0.144642857142857*G0_8_1_1; + A[65] = -A[45] + 0.0452008928571427*G0_0_1_0 - 0.135602678571429*G0_0_1_1 - 0.0572544642857142*G0_1_1_0 - 0.0542410714285715*G0_1_1_1 - 0.0964285714285717*G0_2_1_0 - 0.102455357142857*G0_2_1_1 + 0.216964285714286*G0_3_1_0 + 0.180803571428571*G0_3_1_1 - 0.0542410714285715*G0_4_1_0 - 0.0632812500000001*G0_4_1_1 - 0.325446428571428*G0_5_1_0 - 0.235044642857142*G0_5_1_1 - 0.271205357142857*G0_6_1_0 - 0.207924107142857*G0_6_1_1 - 0.0452008928571427*G0_7_1_0 - 0.352566964285714*G0_7_1_1 + 0.117522321428571*G0_8_1_0 + 0.162723214285714*G0_8_1_1 - 0.542410714285714*G0_9_1_0 - 0.542410714285714*G0_9_1_1; + A[53] = A[35] + 0.0150669642857143*G0_0_0_1 - 0.0150669642857143*G0_0_1_0 + 0.0150669642857141*G0_1_0_1 - 0.0150669642857141*G0_1_1_0 + 0.0602678571428573*G0_2_0_1 - 0.0602678571428573*G0_2_1_0 - 0.108482142857142*G0_4_0_1 + 0.108482142857142*G0_4_1_0 - 0.108482142857143*G0_6_0_1 + 0.108482142857143*G0_6_1_0 + 0.00904017857142861*G0_7_0_1 - 0.0090401785714286*G0_7_1_0 + 0.0090401785714284*G0_8_0_1 - 0.0090401785714284*G0_8_1_0 + 0.108482142857142*G0_9_0_1 - 0.108482142857142*G0_9_1_0; + A[68] = A[86] - 0.060267857142857*G0_0_0_1 + 0.060267857142857*G0_0_1_0 - 0.0150669642857143*G0_1_0_1 + 0.0150669642857143*G0_1_1_0 - 0.0150669642857143*G0_2_0_1 + 0.0150669642857143*G0_2_1_0 - 0.00904017857142854*G0_3_0_1 + 0.00904017857142854*G0_3_1_0 - 0.00904017857142863*G0_4_0_1 + 0.00904017857142863*G0_4_1_0 + 0.108482142857143*G0_5_0_1 - 0.108482142857143*G0_5_1_0 + 0.108482142857143*G0_7_0_1 - 0.108482142857143*G0_7_1_0 - 0.108482142857143*G0_9_0_1 + 0.108482142857143*G0_9_1_0; + A[34] = -A[84] + 0.00301339285714282*G0_0_0_0 + 0.0572544642857144*G0_0_0_1 - 0.00602678571428576*G0_1_0_0 + 0.0964285714285712*G0_1_0_1 - 0.180803571428572*G0_2_0_0 - 0.045200892857143*G0_2_0_1 + 0.0632812500000003*G0_3_0_0 + 0.271205357142857*G0_3_0_1 + 0.0904017857142852*G0_4_0_0 + 0.325446428571428*G0_4_0_1 + 0.045200892857143*G0_5_0_0 - 0.117522321428571*G0_5_0_1 - 0.307366071428572*G0_6_0_0 + 0.0452008928571428*G0_6_0_1 - 0.0361607142857144*G0_7_0_0 - 0.216964285714286*G0_7_0_1 - 0.00904017857142856*G0_8_0_0 + 0.0542410714285711*G0_8_0_1 + 0.542410714285713*G0_9_0_1; + A[59] = A[69] - 0.0180803571428573*G0_0_0_0 - 0.0542410714285717*G0_0_0_1 + 0.1265625*G0_0_1_0 + 0.0904017857142859*G0_0_1_1 - 0.0542410714285715*G0_1_0_0 - 0.0361607142857145*G0_1_0_1 - 0.0723214285714286*G0_1_1_0 - 0.144642857142858*G0_2_0_1 + 0.036160714285714*G0_2_1_0 - 0.0904017857142861*G0_2_1_1 + 0.162723214285714*G0_3_1_0 - 0.650892857142856*G0_4_0_0 - 0.813616071428571*G0_4_0_1 - 0.650892857142856*G0_4_1_0 - 0.650892857142857*G0_4_1_1 - 0.650892857142857*G0_5_0_0 - 0.488169642857142*G0_5_1_0 + 0.162723214285715*G0_5_1_1 - 0.162723214285715*G0_6_0_1 - 0.650892857142856*G0_6_1_0 - 0.162723214285715*G0_6_1_1 - 0.162723214285714*G0_7_0_0 - 0.162723214285715*G0_7_0_1 + 0.650892857142857*G0_7_1_1 + 0.162723214285714*G0_8_0_0 + 0.162723214285714*G0_8_1_0 - 0.650892857142857*G0_9_0_0 - 0.650892857142857*G0_9_0_1 - 0.650892857142856*G0_9_1_0; + A[47] = A[74] + 0.0150669642857145*G0_0_0_1 - 0.0150669642857145*G0_0_1_0 + 0.060267857142857*G0_1_0_1 - 0.060267857142857*G0_1_1_0 + 0.0150669642857144*G0_2_0_1 - 0.0150669642857144*G0_2_1_0 - 0.108482142857143*G0_3_0_1 + 0.108482142857143*G0_3_1_0 + 0.00904017857142862*G0_5_0_1 - 0.00904017857142862*G0_5_1_0 + 0.00904017857142875*G0_6_0_1 - 0.00904017857142875*G0_6_1_0 - 0.108482142857143*G0_8_0_1 + 0.108482142857143*G0_8_1_0 + 0.108482142857143*G0_9_0_1 - 0.108482142857143*G0_9_1_0; + A[67] = -A[47] - 0.141629464285714*G0_0_1_0 + 0.0391741071428572*G0_0_1_1 - 0.0753348214285712*G0_1_1_0 - 0.078348214285714*G0_1_1_1 + 0.00602678571428564*G0_2_1_1 + 0.117522321428571*G0_3_1_0 + 0.153683035714286*G0_3_1_1 + 0.00904017857142854*G0_4_1_0 + 0.0180803571428571*G0_4_1_1 + 0.0452008928571429*G0_5_1_0 - 0.0452008928571426*G0_5_1_1 - 0.00904017857142859*G0_6_1_0 - 0.0723214285714286*G0_6_1_1 + 0.307366071428572*G0_7_1_1 + 0.216964285714286*G0_8_1_0 + 0.171763392857143*G0_8_1_1 - 0.162723214285714*G0_9_1_0 - 0.162723214285714*G0_9_1_1; + A[76] = A[67] - 0.1265625*G0_0_0_1 + 0.1265625*G0_0_1_0 - 0.0150669642857143*G0_1_0_1 + 0.0150669642857143*G0_1_1_0 + 0.0150669642857144*G0_2_0_1 - 0.0150669642857144*G0_2_1_0 + 0.00904017857142859*G0_3_0_1 - 0.00904017857142859*G0_3_1_0 + 0.00904017857142858*G0_4_0_1 - 0.00904017857142859*G0_4_1_0 + 0.0542410714285715*G0_5_0_1 - 0.0542410714285715*G0_5_1_0 + 0.108482142857143*G0_8_0_1 - 0.108482142857143*G0_8_1_0 - 0.0542410714285711*G0_9_0_1 + 0.0542410714285711*G0_9_1_0; + A[91] = 0.00200892857142858*G0_0_0_0 + 0.0140625*G0_0_1_0 - 0.0441964285714284*G0_1_0_0 - 0.0120535714285714*G0_2_0_0 - 0.0140625*G0_2_1_0 - 0.186830357142857*G0_3_0_0 - 0.0964285714285712*G0_3_1_0 + 0.120535714285714*G0_4_0_0 + 0.0843749999999998*G0_4_1_0 + 0.0783482142857142*G0_5_0_0 - 0.0180803571428571*G0_5_1_0 + 0.0964285714285713*G0_6_0_0 + 0.0180803571428571*G0_6_1_0 + 0.0361607142857142*G0_7_0_0 - 0.0843750000000001*G0_7_1_0 - 0.0904017857142855*G0_8_0_0 + 0.0964285714285715*G0_8_1_0; + A[90] = A[91] - 0.0462053571428571*G0_0_0_0 - 0.0441964285714286*G0_0_0_1 - 0.0582589285714287*G0_0_1_0 - 0.0441964285714287*G0_0_1_1 + 0.0462053571428569*G0_1_0_0 + 0.00200892857142856*G0_1_0_1 - 0.0120535714285716*G0_1_1_0 - 0.0120535714285715*G0_1_1_1 - 0.0120535714285714*G0_2_0_1 + 0.0160714285714286*G0_2_1_0 + 0.00200892857142857*G0_2_1_1 + 0.265178571428571*G0_3_0_0 + 0.0783482142857141*G0_3_0_1 + 0.192857142857142*G0_3_1_0 + 0.0964285714285712*G0_3_1_1 - 0.0241071428571426*G0_4_0_0 + 0.0964285714285714*G0_4_0_1 - 0.00602678571428547*G0_4_1_0 + 0.0783482142857143*G0_4_1_1 - 0.265178571428571*G0_5_0_0 - 0.186830357142857*G0_5_0_1 - 0.0723214285714287*G0_5_1_0 - 0.0904017857142858*G0_5_1_1 + 0.0241071428571429*G0_6_0_0 + 0.120535714285714*G0_6_0_1 + 0.0180803571428573*G0_6_1_0 + 0.0361607142857144*G0_6_1_1 - 0.1265625*G0_7_0_0 - 0.0904017857142857*G0_7_0_1 - 0.102455357142857*G0_7_1_0 - 0.186830357142857*G0_7_1_1 + 0.1265625*G0_8_0_0 + 0.0361607142857143*G0_8_0_1 + 0.0241071428571427*G0_8_1_0 + 0.120535714285714*G0_8_1_1; + A[19] = A[91] + 0.0140625*G0_0_0_1 - 0.0140625*G0_0_1_0 - 0.0140625*G0_2_0_1 + 0.0140625*G0_2_1_0 - 0.0964285714285711*G0_3_0_1 + 0.0964285714285711*G0_3_1_0 + 0.0843749999999998*G0_4_0_1 - 0.0843749999999998*G0_4_1_0 - 0.0180803571428572*G0_5_0_1 + 0.0180803571428572*G0_5_1_0 + 0.0180803571428571*G0_6_0_1 - 0.0180803571428571*G0_6_1_0 - 0.0843750000000001*G0_7_0_1 + 0.0843750000000001*G0_7_1_0 + 0.0964285714285715*G0_8_0_1 - 0.0964285714285715*G0_8_1_0; + A[9] = A[90] - 0.0140625*G0_1_0_1 + 0.0140625*G0_1_1_0 + 0.0140625*G0_2_0_1 - 0.0140625*G0_2_1_0 + 0.0180803571428572*G0_3_0_1 - 0.0180803571428572*G0_3_1_0 - 0.0180803571428571*G0_4_0_1 + 0.0180803571428571*G0_4_1_0 + 0.0964285714285712*G0_5_0_1 - 0.0964285714285712*G0_5_1_0 - 0.0843749999999999*G0_6_0_1 + 0.0843749999999999*G0_6_1_0 - 0.0964285714285716*G0_7_0_1 + 0.0964285714285716*G0_7_1_0 + 0.084375*G0_8_0_1 - 0.084375*G0_8_1_0; + A[56] = -A[54] + 0.0452008928571427*G0_0_0_1 - 0.135602678571429*G0_0_1_1 - 0.0572544642857142*G0_1_0_1 - 0.0542410714285715*G0_1_1_1 - 0.0964285714285717*G0_2_0_1 - 0.102455357142857*G0_2_1_1 + 0.216964285714286*G0_3_0_1 + 0.180803571428571*G0_3_1_1 - 0.0542410714285715*G0_4_0_1 - 0.0632812500000001*G0_4_1_1 - 0.325446428571428*G0_5_0_1 - 0.235044642857142*G0_5_1_1 - 0.271205357142857*G0_6_0_1 - 0.207924107142857*G0_6_1_1 - 0.0452008928571427*G0_7_0_1 - 0.352566964285714*G0_7_1_1 + 0.117522321428571*G0_8_0_1 + 0.162723214285714*G0_8_1_1 - 0.542410714285714*G0_9_0_1 - 0.542410714285714*G0_9_1_1; + A[77] = -A[73] + 0.301339285714285*G0_0_0_0 - 0.0632812499999997*G0_0_0_1 - 0.0482142857142855*G0_0_1_0 + 0.0210937500000001*G0_0_1_1 + 0.111495535714285*G0_1_0_0 + 0.204910714285714*G0_1_0_1 + 0.078348214285714*G0_1_1_0 + 0.253124999999999*G0_1_1_1 + 0.0542410714285713*G0_2_0_0 + 0.0301339285714285*G0_2_0_1 + 0.0150669642857142*G0_2_1_0 + 0.0693080357142856*G0_2_1_1 + 0.397767857142856*G0_3_0_0 + 0.461049107142856*G0_3_0_1 + 0.461049107142856*G0_3_1_0 + 0.488169642857141*G0_3_1_1 - 0.00904017857142846*G0_4_0_0 - 0.108482142857143*G0_4_0_1 - 0.162723214285714*G0_4_1_1 + 0.325446428571428*G0_5_0_0 - 0.0813616071428569*G0_5_0_1 - 0.0723214285714283*G0_5_1_0 + 0.18984375*G0_5_1_1 - 0.135602678571428*G0_6_0_0 + 0.00904017857142832*G0_6_1_0 - 0.135602678571428*G0_6_1_1 + 0.253124999999999*G0_7_0_0 + 0.488169642857143*G0_7_1_1 + 0.117522321428571*G0_8_0_0 + 0.244084821428571*G0_8_0_1 + 0.298325892857142*G0_8_1_0 + 0.162723214285714*G0_8_1_1 + 0.271205357142857*G0_9_0_0 + 0.325446428571428*G0_9_0_1 + 0.271205357142857*G0_9_1_0 + 0.650892857142856*G0_9_1_1; + A[3] = A[30] - 0.0284598214285715*G0_1_0_1 + 0.0284598214285715*G0_1_1_0 - 0.0137276785714286*G0_2_0_1 + 0.0137276785714286*G0_2_1_0 + 0.0421874999999999*G0_4_0_1 - 0.0421874999999999*G0_4_1_0 - 0.0150669642857144*G0_5_0_1 + 0.0150669642857144*G0_5_1_0 + 0.0150669642857143*G0_6_0_1 - 0.0150669642857143*G0_6_1_0 + 0.0150669642857142*G0_7_0_1 - 0.0150669642857142*G0_7_1_0 + 0.0030133928571428*G0_8_0_1 - 0.0030133928571428*G0_8_1_0 - 0.0180803571428571*G0_9_0_1 + 0.0180803571428571*G0_9_1_0; + A[8] = -A[3] + 0.0937499999999999*G0_0_0_0 + 0.0937499999999999*G0_0_1_0 + 0.028125*G0_1_0_0 + 0.028125*G0_1_1_0 + 0.0274553571428572*G0_2_0_0 + 0.0274553571428572*G0_2_1_0 + 0.00301339285714287*G0_3_0_0 + 0.00301339285714287*G0_3_1_0 - 0.0572544642857142*G0_4_0_0 - 0.0572544642857141*G0_4_1_0 + 0.141629464285714*G0_5_0_0 + 0.141629464285714*G0_5_1_0 - 0.0753348214285713*G0_6_0_0 - 0.0753348214285713*G0_6_1_0 + 0.0150669642857141*G0_7_0_0 + 0.0150669642857142*G0_7_1_0 + 0.02109375*G0_8_0_0 + 0.02109375*G0_8_1_0 + 0.102455357142857*G0_9_0_0 + 0.102455357142857*G0_9_1_0; + A[12] = 0.00595238095238096*G0_0_0_1 + 0.0206845238095238*G0_1_0_1 + 0.0206845238095239*G0_2_0_1 - 0.00167410714285721*G0_3_0_1 - 0.00167410714285706*G0_4_0_1 - 0.0137276785714286*G0_5_0_1 + 0.0284598214285715*G0_6_0_1 - 0.0137276785714285*G0_7_0_1 + 0.0284598214285714*G0_8_0_1 + 0.0140625*G0_9_0_1; + A[10] = -A[12] - 0.0206845238095238*G0_0_0_0 - 0.0147321428571428*G0_0_0_1 - 0.0206845238095238*G0_1_0_0 - 0.00595238095238096*G0_2_0_0 + 0.0147321428571429*G0_2_0_1 - 0.0284598214285714*G0_3_0_0 - 0.0301339285714286*G0_3_0_1 + 0.0137276785714286*G0_4_0_0 + 0.0120535714285715*G0_4_0_1 - 0.0284598214285714*G0_5_0_0 - 0.0421875*G0_5_0_1 + 0.0137276785714285*G0_6_0_0 + 0.0421875*G0_6_0_1 + 0.00167410714285718*G0_7_0_0 - 0.0120535714285714*G0_7_0_1 + 0.0016741071428571*G0_8_0_0 + 0.0301339285714285*G0_8_0_1 - 0.0140625*G0_9_0_0; + A[2] = -A[12] - 0.0147321428571428*G0_0_0_1 - 0.0206845238095238*G0_0_1_1 + 0.0147321428571428*G0_1_0_1 - 0.00595238095238096*G0_1_1_1 - 0.0206845238095239*G0_2_1_1 + 0.0120535714285714*G0_3_0_1 + 0.0137276785714286*G0_3_1_1 - 0.0301339285714286*G0_4_0_1 - 0.0284598214285715*G0_4_1_1 - 0.0120535714285714*G0_5_0_1 + 0.00167410714285721*G0_5_1_1 + 0.0301339285714285*G0_6_0_1 + 0.00167410714285705*G0_6_1_1 - 0.0421874999999999*G0_7_0_1 - 0.0284598214285714*G0_7_1_1 + 0.0421874999999999*G0_8_0_1 + 0.0137276785714285*G0_8_1_1 - 0.0140625*G0_9_1_1; + A[49] = A[94] + 0.0180803571428571*G0_0_0_1 - 0.0180803571428571*G0_0_1_0 - 0.0843749999999998*G0_1_0_1 + 0.0843749999999998*G0_1_1_0 - 0.0964285714285716*G0_2_0_1 + 0.0964285714285716*G0_2_1_0 + 0.488169642857142*G0_3_0_1 - 0.488169642857142*G0_3_1_0 - 0.0542410714285709*G0_5_0_1 + 0.054241071428571*G0_5_1_0 - 0.216964285714286*G0_6_0_1 + 0.216964285714286*G0_6_1_0 - 0.108482142857143*G0_7_0_1 + 0.108482142857143*G0_7_1_0 + 0.0542410714285713*G0_8_0_1 - 0.0542410714285713*G0_8_1_0; + A[33] = -A[35] + 0.066294642857143*G0_0_0_0 + 0.02109375*G0_0_0_1 + 0.0361607142857143*G0_0_1_0 + 0.0512276785714288*G0_0_1_1 + 0.00602678571428574*G0_1_0_0 + 0.0693080357142854*G0_1_0_1 + 0.0843749999999995*G0_1_1_0 + 0.43392857142857*G0_1_1_1 - 0.0361607142857145*G0_2_0_1 + 0.0241071428571427*G0_2_1_0 + 0.0542410714285713*G0_2_1_1 + 0.650892857142856*G0_3_0_0 + 0.542410714285713*G0_3_0_1 + 0.542410714285713*G0_3_1_0 + 0.741294642857141*G0_3_1_1 + 0.325446428571428*G0_4_0_0 - 0.108482142857143*G0_4_1_0 - 0.262165178571428*G0_4_1_1 - 0.0361607142857143*G0_5_1_1 + 0.325446428571428*G0_6_0_0 + 0.108482142857142*G0_6_0_1 - 0.00904017857142856*G0_6_1_1 - 0.162723214285714*G0_7_0_0 - 0.117522321428571*G0_7_0_1 - 0.108482142857143*G0_7_1_0 - 0.280245535714285*G0_7_1_1 + 0.162723214285714*G0_8_0_0 + 0.207924107142857*G0_8_0_1 + 0.216964285714285*G0_8_1_0 + 0.668973214285713*G0_8_1_1 + 0.650892857142856*G0_9_0_0 + 0.216964285714286*G0_9_0_1 + 0.325446428571428*G0_9_1_0 + 0.325446428571428*G0_9_1_1; + A[83] = -A[33] + 0.0512276785714287*G0_0_0_0 - 0.0030133928571429*G0_0_0_1 - 0.0662946428571426*G0_1_0_0 - 0.301339285714285*G0_1_0_1 + 0.0662946428571429*G0_2_0_0 - 0.00301339285714286*G0_2_0_1 + 0.253125*G0_3_0_0 + 0.280245535714285*G0_4_0_0 + 0.0542410714285711*G0_4_0_1 - 0.0361607142857141*G0_5_0_0 - 0.00904017857142845*G0_5_0_1 + 0.262165178571428*G0_6_0_0 - 0.00904017857142884*G0_6_0_1 - 0.0632812499999999*G0_7_0_0 + 0.0542410714285714*G0_7_0_1 + 0.1265625*G0_8_0_0 + 0.81361607142857*G0_9_0_0 + 0.216964285714286*G0_9_0_1; + A[29] = A[92] - 0.0140625*G0_0_0_1 + 0.0140625*G0_0_1_0 + 0.0140625*G0_1_0_1 - 0.0140625*G0_1_1_0 - 0.0843749999999999*G0_3_0_1 + 0.0843749999999999*G0_3_1_0 + 0.0964285714285714*G0_4_0_1 - 0.0964285714285714*G0_4_1_0 + 0.0843749999999999*G0_5_0_1 - 0.0843749999999998*G0_5_1_0 - 0.0964285714285712*G0_6_0_1 + 0.0964285714285712*G0_6_1_0 + 0.0180803571428571*G0_7_0_1 - 0.0180803571428571*G0_7_1_0 - 0.0180803571428572*G0_8_0_1 + 0.0180803571428572*G0_8_1_0; + A[81] = -A[31] - 0.0274553571428572*G0_0_0_0 - 0.160714285714285*G0_1_0_0 - 0.0274553571428572*G0_2_0_0 - 0.0662946428571425*G0_3_0_0 - 0.00602678571428585*G0_4_0_0 - 0.060267857142857*G0_5_0_0 - 0.0602678571428572*G0_6_0_0 - 0.00602678571428576*G0_7_0_0 - 0.0662946428571427*G0_8_0_0 - 0.156696428571428*G0_9_0_0; + A[7] = A[81] - 0.168415178571428*G0_0_0_0 + 0.0395089285714285*G0_0_0_1 - 0.171763392857143*G0_0_1_0 + 0.0395089285714285*G0_0_1_1 + 0.168415178571428*G0_1_0_0 - 0.00334821428571429*G0_1_0_1 + 0.207924107142857*G0_1_1_0 - 0.00334821428571426*G0_1_1_1 + 0.00435267857142856*G0_2_0_1 + 0.00435267857142853*G0_2_1_0 + 0.00435267857142857*G0_2_1_1 + 0.174776785714285*G0_3_0_0 - 0.0632812499999999*G0_3_0_1 + 0.253125*G0_3_1_0 - 0.0632812499999998*G0_3_1_1 - 0.0843749999999997*G0_4_0_0 - 0.0120535714285714*G0_4_0_1 - 0.123549107142857*G0_4_1_0 - 0.0120535714285714*G0_4_1_1 - 0.174776785714285*G0_5_0_0 + 0.0783482142857142*G0_5_0_1 - 0.238058035714285*G0_5_1_0 + 0.0783482142857142*G0_5_1_1 + 0.0843749999999999*G0_6_0_0 - 0.0391741071428571*G0_6_0_1 + 0.0723214285714285*G0_6_1_0 - 0.0391741071428571*G0_6_1_1 - 0.177790178571428*G0_7_0_0 + 0.156696428571428*G0_7_0_1 - 0.271205357142857*G0_7_1_0 + 0.156696428571429*G0_7_1_1 + 0.177790178571428*G0_8_0_0 - 0.0934151785714285*G0_8_0_1 + 0.334486607142857*G0_8_1_0 - 0.0934151785714285*G0_8_1_1 - 0.0301339285714284*G0_9_0_1 - 0.0301339285714285*G0_9_1_0 - 0.0301339285714283*G0_9_1_1; + A[70] = A[7] - 0.239732142857143*G0_0_0_1 + 0.239732142857143*G0_0_1_0 - 0.0284598214285714*G0_1_0_1 + 0.0284598214285714*G0_1_1_0 - 0.0284598214285714*G0_2_0_1 + 0.0284598214285714*G0_2_1_0 + 0.0150669642857144*G0_3_0_1 - 0.0150669642857144*G0_3_1_0 + 0.0150669642857143*G0_4_0_1 - 0.0150669642857143*G0_4_1_0 - 0.301339285714285*G0_5_0_1 + 0.301339285714285*G0_5_1_0 + 0.1265625*G0_6_0_1 - 0.1265625*G0_6_1_0 - 0.301339285714285*G0_7_0_1 + 0.301339285714285*G0_7_1_0 + 0.1265625*G0_8_0_1 - 0.1265625*G0_8_1_0 - 0.0964285714285715*G0_9_0_1 + 0.0964285714285716*G0_9_1_0; + A[5] = A[70] + 0.239732142857142*G0_0_0_0 - 0.239732142857143*G0_0_1_1 + 0.0361607142857143*G0_1_0_0 + 0.00770089285714282*G0_1_0_1 + 0.00770089285714286*G0_1_1_0 - 0.0207589285714286*G0_1_1_1 + 0.0207589285714285*G0_2_0_0 - 0.00770089285714292*G0_2_0_1 - 0.0077008928571429*G0_2_1_0 - 0.0361607142857143*G0_2_1_1 + 0.0361607142857142*G0_3_0_0 + 0.0512276785714285*G0_3_0_1 + 0.0512276785714286*G0_3_1_0 + 0.0662946428571429*G0_3_1_1 - 0.0662946428571429*G0_4_0_0 - 0.0512276785714286*G0_4_0_1 - 0.0512276785714286*G0_4_1_0 - 0.0361607142857143*G0_4_1_1 + 0.3796875*G0_5_0_0 + 0.0783482142857143*G0_5_0_1 + 0.0783482142857143*G0_5_1_0 - 0.222991071428571*G0_5_1_1 - 0.180803571428571*G0_6_0_0 - 0.0542410714285714*G0_6_0_1 - 0.0542410714285715*G0_6_1_0 + 0.0723214285714284*G0_6_1_1 + 0.222991071428571*G0_7_0_0 - 0.0783482142857141*G0_7_0_1 - 0.0783482142857143*G0_7_1_0 - 0.3796875*G0_7_1_1 - 0.0723214285714286*G0_8_0_0 + 0.0542410714285713*G0_8_0_1 + 0.0542410714285714*G0_8_1_0 + 0.180803571428571*G0_8_1_1 + 0.0964285714285716*G0_9_0_0 - 0.0964285714285716*G0_9_1_1; + A[50] = A[5] + 0.239732142857142*G0_0_0_1 - 0.239732142857142*G0_0_1_0 + 0.0284598214285714*G0_1_0_1 - 0.0284598214285714*G0_1_1_0 + 0.0284598214285714*G0_2_0_1 - 0.0284598214285714*G0_2_1_0 - 0.0150669642857143*G0_3_0_1 + 0.0150669642857143*G0_3_1_0 - 0.0150669642857143*G0_4_0_1 + 0.0150669642857143*G0_4_1_0 + 0.301339285714285*G0_5_0_1 - 0.301339285714285*G0_5_1_0 - 0.1265625*G0_6_0_1 + 0.1265625*G0_6_1_0 + 0.301339285714285*G0_7_0_1 - 0.301339285714285*G0_7_1_0 - 0.1265625*G0_8_0_1 + 0.1265625*G0_8_1_0 + 0.0964285714285716*G0_9_0_1 - 0.0964285714285716*G0_9_1_0; + A[63] = A[36] - 0.0150669642857144*G0_0_0_1 + 0.0150669642857144*G0_0_1_0 + 0.0150669642857143*G0_1_0_1 - 0.0150669642857143*G0_1_1_0 - 0.1265625*G0_2_0_1 + 0.1265625*G0_2_1_0 + 0.0542410714285708*G0_4_0_1 - 0.0542410714285708*G0_4_1_0 + 0.108482142857143*G0_5_0_1 - 0.108482142857143*G0_5_1_0 + 0.00904017857142855*G0_7_0_1 - 0.00904017857142855*G0_7_1_0 + 0.00904017857142872*G0_8_0_1 - 0.00904017857142872*G0_8_1_0 - 0.0542410714285714*G0_9_0_1 + 0.0542410714285714*G0_9_1_0; + A[0] = A[11] + 0.113839285714286*G0_0_0_0 + 0.131845238095238*G0_0_0_1 + 0.131845238095238*G0_0_1_0 + 0.131845238095238*G0_0_1_1 - 0.113839285714285*G0_1_0_0 + 0.0180059523809524*G0_1_0_1 + 0.0180059523809524*G0_1_1_0 + 0.0180059523809524*G0_1_1_1 + 0.0180059523809524*G0_2_0_1 + 0.0180059523809524*G0_2_1_0 + 0.0180059523809524*G0_2_1_1 - 0.132589285714285*G0_3_0_0 + 0.00736607142857132*G0_3_0_1 + 0.00736607142857132*G0_3_1_0 + 0.00736607142857132*G0_3_1_1 + 0.060267857142857*G0_4_0_0 + 0.00736607142857145*G0_4_0_1 + 0.00736607142857145*G0_4_1_0 + 0.00736607142857145*G0_4_1_1 + 0.132589285714286*G0_5_0_0 + 0.139955357142857*G0_5_0_1 + 0.139955357142857*G0_5_1_0 + 0.139955357142857*G0_5_1_1 - 0.0602678571428571*G0_6_0_0 - 0.0529017857142856*G0_6_0_1 - 0.0529017857142856*G0_6_1_0 - 0.0529017857142856*G0_6_1_1 + 0.192857142857143*G0_7_0_0 + 0.139955357142857*G0_7_0_1 + 0.139955357142857*G0_7_1_0 + 0.139955357142857*G0_7_1_1 - 0.192857142857143*G0_8_0_0 - 0.0529017857142857*G0_8_0_1 - 0.0529017857142857*G0_8_1_0 - 0.0529017857142857*G0_8_1_1 + 0.0683035714285714*G0_9_0_1 + 0.0683035714285714*G0_9_1_0 + 0.0683035714285715*G0_9_1_1; + A[79] = A[97] + 0.0964285714285716*G0_0_0_1 - 0.0964285714285716*G0_0_1_0 + 0.0843749999999999*G0_1_0_1 - 0.0843749999999999*G0_1_1_0 - 0.0180803571428571*G0_2_0_1 + 0.0180803571428571*G0_2_1_0 - 0.0542410714285714*G0_3_0_1 + 0.0542410714285714*G0_3_1_0 + 0.108482142857142*G0_4_0_1 - 0.108482142857142*G0_4_1_0 + 0.216964285714286*G0_5_0_1 - 0.216964285714286*G0_5_1_0 + 0.054241071428571*G0_6_0_1 - 0.054241071428571*G0_6_1_0 - 0.488169642857143*G0_8_0_1 + 0.488169642857143*G0_8_1_0; + A[38] = A[83] + 0.0030133928571429*G0_0_0_1 - 0.0030133928571429*G0_0_1_0 + 0.301339285714285*G0_1_0_1 - 0.301339285714285*G0_1_1_0 + 0.00301339285714284*G0_2_0_1 - 0.00301339285714285*G0_2_1_0 - 0.0542410714285711*G0_4_0_1 + 0.0542410714285711*G0_4_1_0 + 0.00904017857142844*G0_5_0_1 - 0.00904017857142842*G0_5_1_0 + 0.0090401785714288*G0_6_0_1 - 0.00904017857142881*G0_6_1_0 - 0.0542410714285714*G0_7_0_1 + 0.0542410714285714*G0_7_1_0 - 0.216964285714286*G0_9_0_1 + 0.216964285714286*G0_9_1_0; + A[64] = A[38] - 0.0572544642857146*G0_0_0_0 + 0.0572544642857145*G0_0_1_1 + 0.0361607142857139*G0_1_0_1 + 0.334486607142856*G0_1_1_0 + 0.427901785714285*G0_1_1_1 - 0.427901785714286*G0_2_0_0 - 0.0361607142857147*G0_2_0_1 - 0.334486607142858*G0_2_1_0 + 0.560491071428571*G0_3_0_0 + 0.569531249999999*G0_3_0_1 + 0.62377232142857*G0_3_1_0 + 0.768415178571427*G0_3_1_1 - 0.768415178571429*G0_4_0_0 - 0.56953125*G0_4_0_1 - 0.623772321428572*G0_4_1_0 - 0.560491071428571*G0_4_1_1 + 0.198883928571429*G0_5_0_0 + 0.0813616071428574*G0_5_0_1 + 0.144642857142857*G0_5_1_0 + 0.0452008928571428*G0_5_1_1 - 0.750334821428572*G0_6_0_0 - 0.244084821428572*G0_6_0_1 - 0.235044642857143*G0_6_1_0 - 0.0904017857142858*G0_6_1_1 - 0.0452008928571428*G0_7_0_0 - 0.081361607142857*G0_7_0_1 - 0.144642857142857*G0_7_1_0 - 0.198883928571428*G0_7_1_1 + 0.0904017857142854*G0_8_0_0 + 0.244084821428571*G0_8_0_1 + 0.235044642857142*G0_8_1_0 + 0.75033482142857*G0_8_1_1 - 0.488169642857142*G0_9_0_0 + 0.488169642857143*G0_9_1_1; + A[46] = A[64] - 0.00301339285714283*G0_0_0_1 + 0.00301339285714283*G0_0_1_0 - 0.00301339285714291*G0_1_0_1 + 0.0030133928571429*G0_1_1_0 - 0.301339285714286*G0_2_0_1 + 0.301339285714286*G0_2_1_0 + 0.0542410714285718*G0_3_0_1 - 0.0542410714285718*G0_3_1_0 + 0.0542410714285716*G0_5_0_1 - 0.0542410714285716*G0_5_1_0 - 0.00904017857142842*G0_7_0_1 + 0.00904017857142841*G0_7_1_0 - 0.00904017857142844*G0_8_0_1 + 0.00904017857142844*G0_8_1_0 + 0.216964285714286*G0_9_0_1 - 0.216964285714286*G0_9_1_0; + A[66] = -A[64] + 0.00301339285714284*G0_0_0_1 + 0.0693080357142859*G0_0_1_1 + 0.00301339285714292*G0_1_0_1 + 0.0542410714285715*G0_1_1_1 + 0.301339285714286*G0_2_0_1 + 0.235044642857143*G0_2_1_1 - 0.0542410714285719*G0_3_0_1 - 0.117522321428572*G0_3_1_1 + 0.1265625*G0_4_1_1 - 0.0542410714285716*G0_5_0_1 + 0.226004464285714*G0_5_1_1 + 0.253125*G0_6_1_1 + 0.0090401785714284*G0_7_0_1 + 0.271205357142857*G0_7_1_1 + 0.00904017857142844*G0_8_0_1 - 0.0271205357142858*G0_8_1_1 - 0.216964285714286*G0_9_0_1 + 0.596651785714285*G0_9_1_1; + A[44] = -A[64] - 0.00301339285714281*G0_0_1_0 + 0.0512276785714288*G0_0_1_1 - 0.00301339285714292*G0_1_1_0 + 0.0662946428571426*G0_1_1_1 - 0.301339285714286*G0_2_1_0 - 0.066294642857143*G0_2_1_1 + 0.054241071428572*G0_3_1_0 + 0.280245535714286*G0_3_1_1 + 0.253125*G0_4_1_1 + 0.0542410714285715*G0_5_1_0 - 0.06328125*G0_5_1_1 + 0.1265625*G0_6_1_1 - 0.00904017857142846*G0_7_1_0 - 0.0361607142857139*G0_7_1_1 - 0.00904017857142844*G0_8_1_0 + 0.262165178571428*G0_8_1_1 + 0.216964285714286*G0_9_1_0 + 0.813616071428571*G0_9_1_1; + A[20] = -A[21] - 0.0147321428571428*G0_0_1_0 - 0.0206845238095238*G0_0_1_1 + 0.0147321428571428*G0_1_1_0 - 0.00595238095238096*G0_1_1_1 - 0.0206845238095239*G0_2_1_1 + 0.0120535714285714*G0_3_1_0 + 0.0137276785714286*G0_3_1_1 - 0.0301339285714286*G0_4_1_0 - 0.0284598214285715*G0_4_1_1 - 0.0120535714285714*G0_5_1_0 + 0.00167410714285721*G0_5_1_1 + 0.0301339285714285*G0_6_1_0 + 0.00167410714285704*G0_6_1_1 - 0.0421874999999999*G0_7_1_0 - 0.0284598214285714*G0_7_1_1 + 0.0421874999999999*G0_8_1_0 + 0.0137276785714285*G0_8_1_1 - 0.0140625*G0_9_1_1; + A[18] = -A[13] - 0.0274553571428572*G0_0_0_0 - 0.160714285714285*G0_1_0_0 - 0.0274553571428572*G0_2_0_0 - 0.0662946428571425*G0_3_0_0 - 0.00602678571428585*G0_4_0_0 - 0.060267857142857*G0_5_0_0 - 0.0602678571428572*G0_6_0_0 - 0.00602678571428576*G0_7_0_0 - 0.0662946428571427*G0_8_0_0 - 0.156696428571428*G0_9_0_0; + A[88] = -A[83] + 0.0693080357142856*G0_0_0_0 + 0.00301339285714292*G0_0_1_0 + 0.235044642857142*G0_1_0_0 + 0.301339285714285*G0_1_1_0 + 0.0542410714285714*G0_2_0_0 + 0.00301339285714286*G0_2_1_0 + 0.126562499999999*G0_3_0_0 - 0.117522321428571*G0_4_0_0 - 0.0542410714285711*G0_4_1_0 + 0.271205357142857*G0_5_0_0 + 0.00904017857142839*G0_5_1_0 - 0.0271205357142854*G0_6_0_0 + 0.00904017857142878*G0_6_1_0 + 0.226004464285714*G0_7_0_0 - 0.0542410714285714*G0_7_1_0 + 0.253125*G0_8_0_0 + 0.596651785714285*G0_9_0_0 - 0.216964285714286*G0_9_1_0; + A[43] = -A[48] + 0.00301339285714282*G0_0_0_0 + 0.0572544642857144*G0_0_1_0 - 0.00602678571428576*G0_1_0_0 + 0.0964285714285712*G0_1_1_0 - 0.180803571428572*G0_2_0_0 - 0.045200892857143*G0_2_1_0 + 0.0632812500000003*G0_3_0_0 + 0.271205357142857*G0_3_1_0 + 0.0904017857142852*G0_4_0_0 + 0.325446428571428*G0_4_1_0 + 0.045200892857143*G0_5_0_0 - 0.117522321428571*G0_5_1_0 - 0.307366071428572*G0_6_0_0 + 0.0452008928571428*G0_6_1_0 - 0.0361607142857144*G0_7_0_0 - 0.216964285714286*G0_7_1_0 - 0.00904017857142856*G0_8_0_0 + 0.0542410714285711*G0_8_1_0 + 0.542410714285713*G0_9_1_0; + A[95] = A[59] + 0.0964285714285714*G0_0_0_1 - 0.0964285714285714*G0_0_1_0 - 0.0180803571428571*G0_1_0_1 + 0.0180803571428571*G0_1_1_0 + 0.084375*G0_2_0_1 - 0.084375*G0_2_1_0 + 0.108482142857143*G0_3_0_1 - 0.108482142857143*G0_3_1_0 - 0.0542410714285713*G0_4_0_1 + 0.0542410714285712*G0_4_1_0 - 0.488169642857142*G0_6_0_1 + 0.488169642857142*G0_6_1_0 + 0.216964285714286*G0_7_0_1 - 0.216964285714286*G0_7_1_0 + 0.0542410714285712*G0_8_0_1 - 0.0542410714285712*G0_8_1_0; + A[52] = -A[32] - 0.0140625*G0_0_0_1 + 0.0328125*G0_0_1_1 + 0.0140625*G0_1_0_1 + 0.0468749999999999*G0_1_1_1 + 0.0843750000000003*G0_2_1_1 - 0.0843749999999999*G0_3_0_1 - 0.0542410714285716*G0_3_1_1 + 0.0964285714285715*G0_4_0_1 + 0.0843750000000003*G0_4_1_1 + 0.0843749999999999*G0_5_0_1 + 0.0301339285714283*G0_5_1_1 - 0.0964285714285712*G0_6_0_1 - 0.012053571428571*G0_6_1_1 + 0.0180803571428571*G0_7_0_1 + 0.0602678571428571*G0_7_1_1 - 0.0180803571428572*G0_8_0_1 + 0.0421874999999999*G0_8_1_1 + 0.0602678571428571*G0_9_1_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p3_q3_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p3_q3_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q3_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q3_tensor_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f1_p3_q3_tensor_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f1_p3_q3_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q3_tensor_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f1_p3_q3_tensor_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f1_p3_q3_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q3_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p3_q4_quadrature.h b/laplacian_2d/laplacian_f1_p3_q4_quadrature.h new file mode 100644 index 0000000..41cd157 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p3_q4_quadrature.h @@ -0,0 +1,8466 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P3_Q4_QUADRATURE_H +#define __LAPLACIAN_F1_P3_Q4_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q4_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q4_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q4_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q4_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q4_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q4_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q4_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q4_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q4_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q4_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q4_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q4_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p3_q4_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p3_q4_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W25[25] = {0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0275289856644697, 0.0475518970579538, 0.0416389652151948, 0.021022967487322, 0.00447940679728133, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783}; + // Quadrature points on the UFC reference element: (0.0450425935698037, 0.0398098570514687), (0.0376212523451112, 0.198013417873608), (0.0263646449444709, 0.437974810247386), (0.0142857943955714, 0.695464273353636), (0.00462228846504642, 0.901464914201174), (0.221578609552379, 0.0398098570514687), (0.185070710267389, 0.198013417873608), (0.129695936782254, 0.437974810247386), (0.0702762920082817, 0.695464273353636), (0.022738483063764, 0.901464914201174), (0.480095071474266, 0.0398098570514687), (0.400993291063196, 0.198013417873608), (0.281012594876307, 0.437974810247386), (0.152267863323182, 0.695464273353636), (0.0492675428994132, 0.901464914201174), (0.738611533396152, 0.0398098570514687), (0.616915871859002, 0.198013417873608), (0.43232925297036, 0.437974810247386), (0.234259434638082, 0.695464273353636), (0.0757966027350624, 0.901464914201174), (0.915147549378728, 0.0398098570514687), (0.764365329781281, 0.198013417873608), (0.535660544808143, 0.437974810247386), (0.290249932250792, 0.695464273353636), (0.09391279733378, 0.901464914201174) + + // Value of basis functions at quadrature points. + static const double FE0[25][10] = \ + {{0.595361771100889, 0.0363240630142745, 0.0329620582231266, -0.00697876330105458, -0.00710543413900178, 0.286154010031837, -0.144363814874519, 0.323767019699913, -0.160427557536749, 0.0443066477812845}, + {0.144847707077251, 0.0314917525575109, 0.0565093723571961, -0.0297392974343585, -0.0136089104009563, 0.880722068301204, -0.276497422020097, 0.167331423967527, -0.114798724929776, 0.153742030524499}, + {-0.063892231857347, 0.0233191863197456, -0.0471646056404561, -0.0478518692290423, 0.0163120554591612, 0.640806423249974, 0.331418250941681, 0.0385744417985572, -0.0585247318831845, 0.167003080840912}, + {0.0211818331847308, 0.0133805365030048, 0.0326369349932555, -0.0427925717552782, 0.0485711762178745, -0.117406110387015, 0.98683910857276, -0.00241168327121202, -0.0178593517002863, 0.077860127642167}, + {0.0579517721596661, 0.00452658789692554, 0.541134376806172, -0.0184907249626245, 0.0319586608616019, -0.273633189306433, 0.649316299328904, -0.00140306240948462, -0.00192632644777793, 0.0105656060730508}, + {0.0969129145557495, 0.0495966310503563, 0.0329620582231266, -0.0133081629182569, -0.0349538534974921, 0.160876909651335, -0.116515395516028, 0.895428534283356, -0.246912783611135, 0.175913147778989}, + {-0.0391667888544834, 0.0594654509565623, 0.056509372357196, -0.0733496016702975, -0.0669464878724996, 0.467663868980969, -0.223159844548554, 0.437096058075967, -0.228522561505532, 0.610410534080673}, + {-0.0451321541833679, 0.0638185648099453, -0.0471646056404562, -0.156158924075319, 0.0802441041051713, 0.253054939278284, 0.267486202295671, 0.0749362671988722, -0.154146013447678, 0.663061619658879}, + {0.0451608187521462, 0.0496137334753149, 0.0326369349932555, -0.17356708239734, 0.238936811531546, -0.217903867034122, 0.796473473259088, -0.0220190689531466, -0.0584641485580772, 0.309132394931336}, + {0.051903114600349, 0.0204647143413337, 0.541134376806172, -0.0859485068100626, 0.157214651192224, -0.23755901477889, 0.524060308998283, -0.00599217068695453, -0.00722668705539913, 0.0419492133929459}, + {-0.0591559090807404, -0.0591559090807405, 0.0329620582231266, 0.03786731225338, -0.0757346245067601, 0.0378673122533801, -0.07573462450676, 0.456668557219904, 0.456668557219904, 0.247747270005307}, + {-0.0324361556933479, -0.032436155693348, 0.056509372357196, 0.0725265831052634, -0.145053166210527, 0.0725265831052632, -0.145053166210527, 0.146872235029605, 0.146872235029605, 0.859671635180817}, + {0.025515852626442, 0.025515852626442, -0.0471646056404562, -0.0869325766002104, 0.173865153200421, -0.0869325766002106, 0.173865153200421, -0.0557775204375564, -0.0557775204375565, 0.933822788062264}, + {0.06381993437965, 0.0638199343796499, 0.0326369349932555, -0.258852571197658, 0.517705142395317, -0.258852571197659, 0.517705142395317, -0.0566742670215314, -0.0566742670215314, 0.435366587895191}, + {0.0388828743119487, 0.0388828743119486, 0.541134376806172, -0.170318740047626, 0.340637480095253, -0.170318740047627, 0.340637480095253, -0.00930838871228418, -0.00930838871228419, 0.0590791718992465}, + {0.0495966310503563, 0.0969129145557494, 0.0329620582231266, 0.160876909651335, -0.116515395516028, -0.0133081629182568, -0.0349538534974919, -0.246912783611135, 0.895428534283356, 0.175913147778989}, + {0.0594654509565623, -0.0391667888544834, 0.056509372357196, 0.467663868980969, -0.223159844548554, -0.0733496016702975, -0.0669464878724994, -0.228522561505531, 0.437096058075966, 0.610410534080673}, + {0.0638185648099454, -0.0451321541833679, -0.0471646056404562, 0.253054939278284, 0.267486202295671, -0.156158924075319, 0.0802441041051715, -0.154146013447678, 0.0749362671988721, 0.663061619658879}, + {0.0496137334753149, 0.0451608187521461, 0.0326369349932555, -0.217903867034122, 0.796473473259088, -0.17356708239734, 0.238936811531547, -0.0584641485580773, -0.0220190689531467, 0.309132394931336}, + {0.0204647143413337, 0.0519031146003489, 0.541134376806172, -0.23755901477889, 0.524060308998282, -0.0859485068100627, 0.157214651192224, -0.00722668705539914, -0.00599217068695452, 0.0419492133929459}, + {0.0363240630142745, 0.595361771100889, 0.0329620582231266, 0.286154010031837, -0.144363814874518, -0.00697876330105453, -0.00710543413900162, -0.160427557536749, 0.323767019699913, 0.0443066477812843}, + {0.031491752557511, 0.144847707077251, 0.0565093723571959, 0.880722068301204, -0.276497422020097, -0.0297392974343585, -0.0136089104009562, -0.114798724929776, 0.167331423967527, 0.153742030524499}, + {0.0233191863197458, -0.0638922318573471, -0.0471646056404562, 0.640806423249973, 0.331418250941681, -0.0478518692290425, 0.0163120554591614, -0.0585247318831846, 0.0385744417985571, 0.167003080840912}, + {0.013380536503005, 0.0211818331847307, 0.0326369349932555, -0.117406110387015, 0.986839108572759, -0.0427925717552787, 0.0485711762178751, -0.0178593517002865, -0.0024116832712122, 0.0778601276421677}, + {0.00452658789692559, 0.057951772159666, 0.541134376806172, -0.273633189306433, 0.649316299328904, -0.0184907249626247, 0.0319586608616019, -0.00192632644777795, -0.00140306240948464, 0.0105656060730508}}; + + static const double FE1_D01[25][14] = \ + {{-4.92348092472479, -0.489501772856739, 0.179203488876249, 0.100666813761961, 0.134603486992305, 8.63375492668695, -5.79126584504057, 2.57049361593515, -2.43064495934601, 0.933695301413292, -0.179203488876251, 3.14676539989352, -1.03436211517524, -0.850723927539827}, + {-1.22072339702365, 0.353412468851741, 0.157627099145873, -0.0746718571074941, -0.0873088916887541, -1.74300688822412, 4.51684211570302, -1.90652429930699, -1.17372701640678, 0.653887982994551, -0.157627099145872, 0.673966720836549, -0.579216125887057, 0.587069187258981}, + {0.358599061347387, -0.199260154242238, 0.11915032151674, -0.236201006974522, 0.0489368169731712, -3.17391758456232, 1.80243660692675, 1.21214207053042, -0.205074293683275, 0.309924093033935, -0.119150321516738, -0.697548150238492, -0.0737230860594163, 0.853685626948599}, + {-0.256528017544188, 0.335981245709448, 0.0697846126615126, -0.245883039206206, 0.324765406089899, 1.6058038662832, -5.69992944155756, 4.01467234710911, 0.0351330450820346, 0.0712264684545085, -0.0697846126615112, -0.398938571740192, 0.174656570751691, 0.0390401205682623}, + {0.0106140386976448, 4.47094346923701, 0.023972721189482, -0.112725965267303, 0.238775264288607, -0.15332389817035, 0.879973096214445, -5.20820670597875, -0.00208846471084578, -0.00451319159940933, -0.0239727211894847, 0.0244881945022275, 0.117239156866706, -0.261174994079983}, + {-0.839131599831696, -0.48950177285674, 0.0748108288829812, 0.0686708574696078, 0.662156663835007, 2.56379098442514, -3.27809805082916, 2.04294043909245, -6.18031729659934, 0.494625653780274, -0.0748108288829797, 8.85005639822322, -0.563296511249881, -3.33189576545889}, + {0.202323839685595, 0.353412468851741, 0.161465637815132, -0.112302905481113, -0.429499753205215, -1.75503086478979, 2.76362799404298, -1.56433343779053, -2.69567005199158, 0.756622320539373, -0.161465637815132, 0.747255447904154, -0.644319415058259, 2.37791435729265}, + {0.183058222345733, -0.199260154242238, 0.246520964624723, -0.625066207389066, 0.240735512799229, -0.923343083643203, -0.080798359164653, 1.02034337470436, -0.206029746712401, 0.613791028172696, -0.246520964624722, -3.16049155954138, 0.0112751792163715, 3.12578579345455}, + {-0.350190108838501, 0.335981245709448, 0.231575301617104, -0.922258421214661, 1.59762263690684, 1.87432390421406, -4.60193015737717, 2.74181511629217, 0.1851747050734, 0.176637588713045, -0.231575301617103, -1.40021356037656, 0.745620832501613, -0.38258378160367}, + {0.145502825089315, 4.47094346923701, 0.105228292166946, -0.513593117920688, 1.17461022697504, -0.858753730257821, 2.38634910459668, -6.14404166866518, -0.0276892592294179, -0.0325456124950437, -0.105228292166949, 0.219762882063215, 0.546138730415726, -1.36668384980883}, + {0.300790618534486, -0.48950177285674, -0.0938175098322176, -1.20457509757173, 1.43469692987617, -0.25744128910517, -0.824247729623862, 1.27040017305129, -1.97325425970202, -5.02098794019842, 0.0938175098322148, 5.0510574614487, 6.22556303777016, -4.51250013162285}, + {0.0858949745717573, 0.353412468851741, -0.255769112851834, 0.565857929720685, -0.9305984685516, -0.305589684505477, 0.92951696352612, -1.06323472244414, -0.100890713389922, -2.13896290361542, 0.255769112851833, -2.50237537066618, 1.57310497389473, 3.5338645526077}, + {-0.277867342742944, -0.199260154242238, -0.0814276204367423, 0.349126846459827, 0.521602394099412, 1.03258701566852, -1.29493601208752, 0.739476493404178, 0.714772028659139, -0.174033767171633, 0.0814276204367425, -4.60210481528708, -0.175093079288193, 3.36573039252853}, + {-0.270988583314474, 0.335981245709448, 0.22078989418089, -1.08663594700873, 3.46157400122766, 1.2250859535242, -2.16794236789051, 0.877863751971334, 0.219884789139037, 0.0519405716871661, -0.22078989418089, -1.02926474507045, 1.03469537532157, -2.65219404529625}, + {0.388816964556487, 4.47094346923701, 0.190189287582516, -0.982902206430993, 2.54503167978712, -2.05527310001484, 4.70997578769861, -7.51446312147727, -0.122720710220877, -0.0958673055551886, -0.19018928758252, 0.798690474834211, 1.07876951198618, -3.22100144440045}, + {-0.3573245679932, -0.489501772856741, 3.67417591105398, -3.93531150769328, 2.20723719591734, 0.176854297338599, 0.172112136501218, 0.497859907010124, 1.89326182738164, -4.4613954198682, -3.67417591105398, -1.32237543567259, 8.39670692756148, -2.77812358762638}, + {-0.340773582195419, 0.353412468851741, 1.12915777685523, 2.11546133033649, -1.43169718389799, 0.582648622018157, -0.033151501576722, -0.562136007097758, 1.31220636814439, -1.74046453867549, -1.12915777685523, -2.82743880134114, -0.374996791661011, 2.94692961709474}, + {-0.187879798307207, -0.199260154242237, -0.227593922486541, 3.15784151189363, 0.802469275399596, 0.603082393870928, -0.674552053425481, 0.458609612103994, 0.351965301970183, -0.0473808869682165, 0.227593922486542, -1.09106634580247, -3.11046062492541, -0.063368231567311}, + {0.191532755133864, 0.335981245709449, 0.0418084423543278, -0.269250078420215, 5.32552536554849, -0.789235204472549, 1.24780881597873, -0.986087612349495, -0.343848708253603, -0.0258287211950972, -0.0418084423543293, 1.90365444045913, 0.295078799615313, -6.88533109775401}, + {0.690818483697246, 4.47094346923701, 0.238984215828931, -1.3123152230897, 3.9154531325992, -3.45037592129704, 7.17349854265214, -8.88488457428935, -0.298960853390353, -0.172833753280059, -0.238984215828935, 1.73861890348643, 1.48514897636976, -5.35511118269528}, + {0.432860334906831, -0.489501772856743, 10.7820243913322, -6.63755958969328, 2.73479037276005, 0.0713069027774886, 0.0150278050049932, -0.0296932698325705, -2.4803228061571, 6.22985279104878, -10.7820243913322, -0.335676392472756, 0.40770679864449, 0.081208825869822}, + {0.513886950347987, 0.353412468851742, 4.43471670367803, 3.6743905576189, -1.77388804541445, -0.457548926037692, -0.189805347580739, -0.219945145581301, -2.37468364726229, 4.39732387101058, -4.43471670367803, 2.60391745686038, -8.07171442862948, 1.54465423581636}, + {0.645901171050298, -0.199260154242236, 0.232818028669783, 6.1299830446049, 0.994267971225654, -1.51667164669493, 0.803219713608937, 0.266810916277931, -2.0006750758256, 1.93189047262638, -0.232818028669786, 5.51968863591294, -8.06187351723128, -4.51328153131299}, + {0.800146649057353, 0.33598124570945, -0.104550979384442, 0.853052384530374, 6.59838259636543, -3.02166899671853, 4.14448594511816, -2.25894484316643, -1.29020890800348, 0.165558162892518, 0.10455097938444, 5.59613700148209, -1.01861054742289, -10.904310689844}, + {0.933227768613883, 4.47094346923701, 0.253980335569297, -1.45688033140528, 4.85128809528563, -4.51962829624728, 8.93617659537217, -9.82071953697578, -0.473343193721761, -0.225864578124923, -0.253980335569301, 2.59527922553586, 1.6827449095302, -6.97322412709974}}; + + // Array of non-zero columns + static const unsigned int nzc0[14] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + static const double FE1_D10[25][14] = \ + {{-4.92348092472479, -0.432860334906833, 0.107896586098764, 0.0856390087569554, 0.164296756824886, -2.14826946464529, 0.846293744652697, -0.164296756824886, 8.35137943198624, -5.29615748963549, 2.30111931728087, 2.73905860124902, -0.698685722702495, -0.931932753409652}, + {-1.22072339702365, -0.513886950347988, 0.61517602518356, 0.115133490473251, 0.132636253892541, -6.17772359190216, 0.842451558084123, -0.132636253892543, 3.26098968727126, -3.74343588801603, 2.21705654811641, 8.74568114946603, -3.18313358274743, -0.957585048557372}, + {0.358599061347386, -0.645901171050299, 1.63582196821167, -1.03942072058345, -0.217874099304767, -3.4067356132321, -4.32754643767815, 0.217874099304766, 0.0277437349865084, -1.62196637959246, 1.88152475430886, 7.3643253669928, -5.59341172197236, 5.3669671582616}, + {-0.256528017544188, -0.800146649057355, 3.09145360938005, -4.39036898432437, 2.58371024925633, 1.71035484566764, -6.55298182608794, -2.58371024925633, -0.0694179343024073, -0.0943316944380133, 1.22042429534196, 0.619671975682703, -5.42148043073039, 10.9433508104123}, + {0.0106140386976428, -0.93322776861388, 4.54360101743677, -9.04890256063947, 10.0594948012644, -0.407304233739641, 2.33685342761973, -10.0594948012644, 0.251891870858455, 0.221351386525507, 0.449370472532274, -1.65825671502798, -2.47804006866914, 6.71204913301973}, + {-0.839131599831697, 0.357324567993201, -0.102043468455618, -0.103441279031611, 0.164296756824885, -1.11038492662884, 0.657213456864125, -0.164296756824885, -2.50614138554535, 4.95602107364847, -1.96807265626462, 0.453349470661745, 0.759078924422711, -0.553772177832514}, + {0.202323839685595, 0.340773582195419, -0.421182984203023, -0.0791514039043915, 0.132636253892542, -2.88418864164502, 0.648166663706482, -0.132636253892543, -1.56651227513635, 2.49708685921486, -1.47367200595952, 1.12225223956517, 2.18311938628288, -0.56901525980209}, + {0.183058222345733, 0.187879798307206, -0.356561429246204, 0.0494858460364144, -0.217874099304766, -0.695749161156662, -3.23863987105828, 0.217874099304766, -0.433623669198942, 0.661171915140911, -0.598486266594907, -0.0500309346159661, 1.10234152501883, 3.18915402502186}, + {-0.350190108838501, -0.191532755133865, 1.02081050608965, -2.17006723719339, 2.58371024925633, 1.83251546185973, -4.33268007895696, -2.58371024925633, 0.22698314742773, 0.202466309908141, 0.112273406636495, -1.69529235999188, -1.15803360795751, 6.50274731615034}, + {0.145502825089312, -0.690818483697242, 3.55560421346399, -7.68709166057282, 10.0594948012644, -1.09773794608675, 3.69866432768638, -10.0594948012644, 0.211294956599518, 0.140288140785009, 0.193732561223402, -1.26538609430655, -1.19248017307069, 3.98842733288643}, + {0.300790618534486, -0.300790618534487, 0.163623779272956, -0.380327367947866, 0.164296756824884, -0.163623779272954, 0.38032736794787, -0.164296756824884, -2.06707176953424, 0.0, 2.06707176953424, -1.17450557632146, 1.17450557632145, 0.0}, + {0.085894974571757, -0.0858949745717575, 0.0498205716536449, -0.363659033805437, 0.132636253892543, -0.0498205716536459, 0.363659033805436, -0.132636253892543, -0.356659826241754, 0.0, 0.356659826241756, -4.07548034456091, 4.07548034456091, 0.0}, + {-0.277867342742944, 0.277867342742944, -1.11401463610527, 1.64406285854735, -0.217874099304766, 1.11401463610526, -1.64406285854735, 0.217874099304766, 0.633344408222398, 0.0, -0.633344408222397, -4.42701173599888, 4.42701173599888, 0.0}, + {-0.270988583314474, 0.270988583314474, -1.00429605934332, 1.08130642088178, 2.58371024925633, 1.00429605934331, -1.08130642088178, -2.58371024925633, 0.440674683319929, 0.0, -0.44067468331993, -2.06396012039201, 2.06396012039201, 0.0}, + {0.388816964556484, -0.388816964556484, 2.24546238759736, -5.6928779941296, 10.0594948012644, -2.24546238759735, 5.6928779941296, -10.0594948012644, 0.0674685773616459, 0.0, -0.0674685773616422, -0.280079037151977, 0.280079037151975, -1.6970983117735e-14}, + {-0.357324567993201, 0.839131599831695, 1.11038492662884, -0.657213456864119, 0.164296756824883, 0.102043468455623, 0.103441279031613, -0.164296756824883, 1.96807265626462, -4.95602107364847, 2.50614138554536, -0.759078924422717, -0.453349470661745, 0.553772177832506}, + {-0.340773582195419, -0.202323839685595, 2.88418864164502, -0.648166663706484, 0.132636253892543, 0.421182984203023, 0.0791514039043915, -0.132636253892543, 1.47367200595952, -2.49708685921486, 1.56651227513635, -2.18311938628288, -1.12225223956516, 0.569015259802091}, + {-0.187879798307206, -0.183058222345732, 0.695749161156661, 3.23863987105828, -0.217874099304765, 0.356561429246203, -0.0494858460364157, 0.217874099304765, 0.598486266594908, -0.661171915140912, 0.433623669198941, -1.10234152501884, 0.0500309346159713, -3.18915402502186}, + {0.191532755133864, 0.3501901088385, -1.83251546185973, 4.33268007895695, 2.58371024925633, -1.02081050608966, 2.17006723719339, -2.58371024925633, -0.112273406636495, -0.202466309908141, -0.22698314742773, 1.15803360795751, 1.69529235999188, -6.50274731615035}, + {0.690818483697243, -0.145502825089313, 1.09773794608676, -3.69866432768638, 10.0594948012644, -3.55560421346399, 7.68709166057283, -10.0594948012644, -0.1937325612234, -0.140288140785019, -0.211294956599513, 1.1924801730707, 1.26538609430654, -3.98842733288646}, + {0.432860334906832, 4.92348092472478, 2.14826946464528, -0.846293744652684, 0.164296756824883, -0.10789658609876, -0.0856390087569605, -0.164296756824883, -2.30111931728086, 5.29615748963548, -8.35137943198624, 0.6986857227025, -2.73905860124902, 0.931932753409644}, + {0.513886950347989, 1.22072339702365, 6.17772359190216, -0.84245155808413, 0.132636253892544, -0.615176025183567, -0.115133490473247, -0.132636253892544, -2.21705654811641, 3.74343588801603, -3.26098968727125, 3.18313358274743, -8.74568114946602, 0.957585048557374}, + {0.645901171050299, -0.358599061347386, 3.40673561323211, 4.32754643767814, -0.217874099304764, -1.63582196821167, 1.03942072058346, 0.217874099304764, -1.88152475430886, 1.62196637959245, -0.0277437349865067, 5.59341172197235, -7.36432536699278, -5.3669671582616}, + {0.800146649057353, 0.256528017544187, -1.71035484566764, 6.55298182608793, 2.58371024925633, -3.09145360938005, 4.39036898432437, -2.58371024925633, -1.22042429534196, 0.0943316944380134, 0.0694179343024074, 5.42148043073038, -0.619671975682697, -10.9433508104123}, + {0.93322776861388, -0.0106140386976432, 0.407304233739652, -2.33685342761973, 10.0594948012644, -4.54360101743676, 9.04890256063948, -10.0594948012644, -0.449370472532272, -0.221351386525517, -0.25189187085845, 2.47804006866915, 1.65825671502797, -6.71204913301977}}; + + // Array of non-zero columns + static const unsigned int nzc1[14] = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 225; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 59450 + for (unsigned int ip = 0; ip < 25; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + + // Total number of operations to compute function values = 20 + for (unsigned int r = 0; r < 10; r++) + { + F0 += FE0[ip][r]*w[0][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 6 + double I[3]; + // Number of operations: 2 + I[0] = F0*G[0]*W25[ip]; + + // Number of operations: 2 + I[1] = F0*G[1]*W25[ip]; + + // Number of operations: 2 + I[2] = F0*G[2]*W25[ip]; + + + // Number of operations for primary indices: 2352 + for (unsigned int j = 0; j < 14; j++) + { + for (unsigned int k = 0; k < 14; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p3_q4_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p3_q4_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q4_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q4_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q4_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q4_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q4_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q4_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q4_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f1_p3_q4_tensor.h b/laplacian_2d/laplacian_f1_p3_q4_tensor.h new file mode 100644 index 0000000..2b25621 --- /dev/null +++ b/laplacian_2d/laplacian_f1_p3_q4_tensor.h @@ -0,0 +1,8584 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F1_P3_Q4_TENSOR_H +#define __LAPLACIAN_F1_P3_Q4_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q4_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q4_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q4_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f1_p3_q4_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f1_p3_q4_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f1_p3_q4_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q4_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q4_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q4_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f1_p3_q4_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f1_p3_q4_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f1_p3_q4_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f1_p3_q4_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f1_p3_q4_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 100 + // Number of operations (multiply-add pairs) for tensor contraction: 5315 + // Total number of operations (multiply-add pairs): 5426 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0 = det*(w[0][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1 = det*(w[0][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0 = det*(w[0][0]*((K_10*K_00 + K_11*K_01))); + const double G0_0_1_1 = det*(w[0][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_0_0 = det*(w[0][1]*((K_00*K_00 + K_01*K_01))); + const double G0_1_0_1 = det*(w[0][1]*((K_00*K_10 + K_01*K_11))); + const double G0_1_1_0 = det*(w[0][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_1 = det*(w[0][1]*((K_10*K_10 + K_11*K_11))); + const double G0_2_0_0 = det*(w[0][2]*((K_00*K_00 + K_01*K_01))); + const double G0_2_0_1 = det*(w[0][2]*((K_00*K_10 + K_01*K_11))); + const double G0_2_1_0 = det*(w[0][2]*((K_10*K_00 + K_11*K_01))); + const double G0_2_1_1 = det*(w[0][2]*((K_10*K_10 + K_11*K_11))); + const double G0_3_0_0 = det*(w[0][3]*((K_00*K_00 + K_01*K_01))); + const double G0_3_0_1 = det*(w[0][3]*((K_00*K_10 + K_01*K_11))); + const double G0_3_1_0 = det*(w[0][3]*((K_10*K_00 + K_11*K_01))); + const double G0_3_1_1 = det*(w[0][3]*((K_10*K_10 + K_11*K_11))); + const double G0_4_0_0 = det*(w[0][4]*((K_00*K_00 + K_01*K_01))); + const double G0_4_0_1 = det*(w[0][4]*((K_00*K_10 + K_01*K_11))); + const double G0_4_1_0 = det*(w[0][4]*((K_10*K_00 + K_11*K_01))); + const double G0_4_1_1 = det*(w[0][4]*((K_10*K_10 + K_11*K_11))); + const double G0_5_0_0 = det*(w[0][5]*((K_00*K_00 + K_01*K_01))); + const double G0_5_0_1 = det*(w[0][5]*((K_00*K_10 + K_01*K_11))); + const double G0_5_1_0 = det*(w[0][5]*((K_10*K_00 + K_11*K_01))); + const double G0_5_1_1 = det*(w[0][5]*((K_10*K_10 + K_11*K_11))); + const double G0_6_0_0 = det*(w[0][6]*((K_00*K_00 + K_01*K_01))); + const double G0_6_0_1 = det*(w[0][6]*((K_00*K_10 + K_01*K_11))); + const double G0_6_1_0 = det*(w[0][6]*((K_10*K_00 + K_11*K_01))); + const double G0_6_1_1 = det*(w[0][6]*((K_10*K_10 + K_11*K_11))); + const double G0_7_0_0 = det*(w[0][7]*((K_00*K_00 + K_01*K_01))); + const double G0_7_0_1 = det*(w[0][7]*((K_00*K_10 + K_01*K_11))); + const double G0_7_1_0 = det*(w[0][7]*((K_10*K_00 + K_11*K_01))); + const double G0_7_1_1 = det*(w[0][7]*((K_10*K_10 + K_11*K_11))); + const double G0_8_0_0 = det*(w[0][8]*((K_00*K_00 + K_01*K_01))); + const double G0_8_0_1 = det*(w[0][8]*((K_00*K_10 + K_01*K_11))); + const double G0_8_1_0 = det*(w[0][8]*((K_10*K_00 + K_11*K_01))); + const double G0_8_1_1 = det*(w[0][8]*((K_10*K_10 + K_11*K_11))); + const double G0_9_0_0 = det*(w[0][9]*((K_00*K_00 + K_01*K_01))); + const double G0_9_0_1 = det*(w[0][9]*((K_00*K_10 + K_01*K_11))); + const double G0_9_1_0 = det*(w[0][9]*((K_10*K_00 + K_11*K_01))); + const double G0_9_1_1 = det*(w[0][9]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[108] = 0.00815776815776807*G0_0_0_0 + 0.00286034952701614*G0_0_0_1 + 0.00161616161616148*G0_0_1_0 - 0.0067596600929935*G0_0_1_1 - 0.0100817700817701*G0_1_0_0 - 0.00897867564534297*G0_1_0_1 - 0.0047715247715248*G0_1_1_0 + 0.074651274651274*G0_2_0_0 + 0.0096200096200093*G0_2_0_1 + 0.0494853294853291*G0_2_1_0 + 0.00675966009299316*G0_2_1_1 + 0.0387878787878791*G0_3_0_0 - 0.00161616161616151*G0_3_0_1 + 0.00415584415584436*G0_3_1_0 - 0.00900432900432892*G0_3_1_1 - 0.0505627705627703*G0_4_0_0 + 0.00150072150072129*G0_4_0_1 - 0.024242424242424*G0_4_1_0 + 0.00138528138528125*G0_4_1_1 - 0.0567965367965363*G0_5_0_0 - 0.00531024531024525*G0_5_0_1 + 0.0685714285714278*G0_5_1_0 + 0.0225108225108225*G0_5_1_1 - 0.198787878787878*G0_6_0_0 - 0.0278210678210679*G0_6_0_1 - 0.141991341991341*G0_6_1_0 - 0.0225108225108225*G0_6_1_1 - 0.00831168831168832*G0_7_0_0 + 0.000115440115440341*G0_7_0_1 - 0.00484848484848498*G0_7_1_0 - 0.0013852813852813*G0_7_1_1 + 0.0117748917748916*G0_8_0_0 + 0.00738816738816669*G0_8_0_1 + 0.0090043290043285*G0_8_1_1 + 0.0387878787878792*G0_9_0_0 - 0.02008658008658*G0_9_0_1 + 0.00969696969696983*G0_9_1_0; + A[181] = -0.0142632675966008*G0_0_0_0 - 0.000795254128587482*G0_0_1_0 + 0.0279621612954947*G0_1_0_0 + 0.014083694083694*G0_2_0_0 + 0.00829886163219493*G0_2_1_0 + 0.0750360750360747*G0_3_0_0 + 0.0386724386724386*G0_3_1_0 - 0.0389033189033188*G0_4_0_0 - 0.0195093795093795*G0_4_1_0 - 0.125598845598845*G0_5_0_0 + 0.00507936507936499*G0_5_1_0 - 0.0185858585858587*G0_6_0_0 - 0.0125829725829726*G0_6_1_0 - 0.0174314574314574*G0_7_0_0 + 0.0451370851370847*G0_7_1_0 + 0.0421356421356421*G0_8_0_0 - 0.0386724386724383*G0_8_1_0 - 0.0290909090909088*G0_9_0_0 - 0.0256277056277054*G0_9_1_0; + A[176] = 0.0940965207631872*G0_0_0_0 + 0.0277056277056276*G0_0_0_1 + 0.0277056277056276*G0_0_1_0 + 0.0795254128587459*G0_0_1_1 + 0.527433060766392*G0_1_0_0 + 0.638255571588902*G0_1_0_1 + 0.638255571588902*G0_1_1_0 + 0.878371011704341*G0_1_1_1 + 0.0646464646464642*G0_2_0_0 + 0.0397627064293728*G0_2_0_1 + 0.0397627064293728*G0_2_1_0 + 0.0795254128587456*G0_2_1_1 + 0.470995670995668*G0_3_0_0 + 0.480230880230877*G0_3_0_1 + 0.480230880230877*G0_3_1_0 + 0.798845598845594*G0_3_1_1 - 0.222568542568541*G0_4_0_0 - 0.187012987012986*G0_4_0_1 - 0.187012987012986*G0_4_1_0 - 0.346320346320344*G0_4_1_1 + 0.179163059163058*G0_5_0_0 - 0.0115440115440116*G0_5_0_1 - 0.0115440115440116*G0_5_1_0 - 0.0277056277056275*G0_5_1_1 - 0.0526406926406924*G0_6_0_0 - 0.0277056277056275*G0_6_1_1 - 0.00092352092352093*G0_7_0_0 - 0.122366522366522*G0_7_0_1 - 0.122366522366522*G0_7_1_0 - 0.346320346320345*G0_7_1_1 + 0.452525252525251*G0_8_0_0 + 0.161616161616161*G0_8_0_1 + 0.161616161616161*G0_8_1_0 + 0.798845598845594*G0_8_1_1 + 0.315844155844155*G0_9_0_0 + 0.0230880230880232*G0_9_0_1 + 0.0230880230880232*G0_9_1_0 + 0.212409812409812*G0_9_1_1; + A[21] = 0.0132178932178932*G0_0_0_0 - 0.0222478755812089*G0_0_0_1 - 0.00580407247073906*G0_1_0_0 + 0.00201378868045531*G0_2_0_0 - 0.00014750681417347*G0_2_0_1 - 0.0103896103896104*G0_3_0_0 - 0.00519480519480516*G0_3_0_1 + 0.00455988455988459*G0_4_0_0 + 0.00155844155844162*G0_4_0_1 + 0.0623376623376618*G0_5_0_0 + 0.0173737373737371*G0_5_0_1 - 0.00721500721500719*G0_6_0_0 + 0.00502164502164503*G0_6_0_1 - 0.00738816738816738*G0_7_0_0 + 5.77200577199343e-05*G0_7_0_1 - 0.00288600288600277*G0_8_0_0 + 0.00519480519480527*G0_8_0_1 - 0.00611832611832611*G0_9_0_0 - 0.00161616161616166*G0_9_0_1; + A[52] = A[108] - 0.00124418791085466*G0_0_0_1 + 0.00124418791085466*G0_0_1_0 + 0.00420715087381817*G0_1_0_1 - 0.00420715087381817*G0_1_1_0 + 0.0398653198653198*G0_2_0_1 - 0.0398653198653198*G0_2_1_0 + 0.00577200577200587*G0_3_0_1 - 0.00577200577200586*G0_3_1_0 - 0.0257431457431453*G0_4_0_1 + 0.0257431457431452*G0_4_1_0 + 0.073881673881673*G0_5_0_1 - 0.073881673881673*G0_5_1_0 - 0.114170274170273*G0_6_0_1 + 0.114170274170274*G0_6_1_0 - 0.00496392496392533*G0_7_0_1 + 0.00496392496392533*G0_7_1_0 - 0.00738816738816677*G0_8_0_1 + 0.00738816738816678*G0_8_1_0 + 0.0297835497835498*G0_9_0_1 - 0.0297835497835498*G0_9_1_0; + A[35] = 0.0276735610068943*G0_0_1_0 + 0.00526535193201859*G0_0_1_1 + 0.0276735610068942*G0_1_1_0 + 0.000602853936187167*G0_1_1_1 + 0.38524931858265*G0_2_1_0 + 0.0951418951418945*G0_2_1_1 - 0.124098124098123*G0_3_1_0 - 0.087445887445887*G0_3_1_1 + 0.275036075036073*G0_4_1_0 + 0.154689754689754*G0_4_1_1 - 0.124098124098123*G0_5_1_0 - 0.0386724386724384*G0_5_1_1 + 0.275036075036074*G0_6_1_0 + 0.0773448773448769*G0_6_1_1 - 0.00865800865800858*G0_7_1_0 - 0.00992784992784978*G0_7_1_1 - 0.00865800865800855*G0_8_1_0 - 0.0498124098124097*G0_8_1_1 + 0.0536796536796534*G0_9_1_0 - 0.0202020202020202*G0_9_1_1; + A[26] = -0.027070707070707*G0_0_0_0 - 0.0276735610068942*G0_0_0_1 - 0.290107423440756*G0_1_0_0 - 0.38524931858265*G0_1_0_1 - 0.0224082090748756*G0_2_0_0 - 0.0276735610068941*G0_2_0_1 - 0.197691197691197*G0_3_0_0 - 0.275036075036073*G0_3_0_1 + 0.0854256854256849*G0_4_0_0 + 0.124098124098123*G0_4_0_1 - 0.0411544011544008*G0_5_0_0 + 0.00865800865800861*G0_5_0_1 - 0.00126984126984126*G0_6_0_0 + 0.00865800865800856*G0_6_0_1 + 0.0366522366522365*G0_7_0_0 + 0.124098124098123*G0_7_0_1 - 0.12034632034632*G0_8_0_0 - 0.275036075036074*G0_8_0_1 - 0.0738816738816738*G0_9_0_0 - 0.0536796536796535*G0_9_0_1; + A[135] = A[26] - 0.263036716370049*G0_0_0_0 - 0.262433862433861*G0_0_0_1 + 0.0951418951418946*G0_0_1_0 + 0.0951418951418946*G0_0_1_1 + 0.263036716370049*G0_1_0_0 + 0.358178611511943*G0_1_0_1 + 0.000602853936187292*G0_1_1_0 + 0.000602853936187336*G0_1_1_1 + 0.00526535193201852*G0_2_0_1 + 0.00526535193201857*G0_2_1_0 + 0.00526535193201857*G0_2_1_1 + 0.156536796536796*G0_3_0_0 + 0.233881673881673*G0_3_0_1 - 0.0498124098124095*G0_3_1_0 - 0.0498124098124094*G0_3_1_1 - 0.086695526695526*G0_4_0_0 - 0.125367965367964*G0_4_0_1 - 0.00992784992784989*G0_4_1_0 - 0.00992784992784994*G0_4_1_1 - 0.156536796536796*G0_5_0_0 - 0.206349206349205*G0_5_0_1 + 0.0773448773448768*G0_5_1_0 + 0.0773448773448768*G0_5_1_1 + 0.0866955266955262*G0_6_0_0 + 0.0767676767676764*G0_6_0_1 - 0.0386724386724384*G0_6_1_0 - 0.0386724386724384*G0_6_1_1 - 0.156998556998556*G0_7_0_0 - 0.244444444444443*G0_7_0_1 + 0.154689754689754*G0_7_1_0 + 0.154689754689754*G0_7_1_1 + 0.156998556998557*G0_8_0_0 + 0.31168831168831*G0_8_0_1 - 0.0874458874458871*G0_8_1_0 - 0.0874458874458869*G0_8_1_1 - 0.0202020202020204*G0_9_0_1 - 0.0202020202020202*G0_9_1_0 - 0.0202020202020201*G0_9_1_1; + A[211] = A[181] + 0.0200481000480999*G0_0_0_0 - 0.00750360750360743*G0_0_1_0 - 0.0275517075517073*G0_2_0_0 - 0.00750360750360747*G0_2_1_0 + 0.00577200577200553*G0_3_0_0 - 0.0236652236652232*G0_4_0_0 - 0.0256277056277051*G0_4_1_0 + 0.119595959595959*G0_5_0_0 + 0.00750360750360761*G0_5_1_0 - 0.112092352092351*G0_6_0_0 + 0.00750360750360748*G0_6_1_0 - 0.00196248196248193*G0_7_0_0 - 0.0256277056277052*G0_7_1_0 - 0.00577200577200596*G0_8_0_0 + 0.0256277056277054*G0_9_0_0 + 0.0512554112554108*G0_9_1_0; + A[202] = -0.0372101972101971*G0_0_0_0 - 0.0233573833573832*G0_0_0_1 - 0.0155844155844156*G0_0_1_0 + 0.0475228475228468*G0_0_1_1 + 0.0175084175084175*G0_1_0_0 + 0.00731120731120729*G0_1_0_1 + 0.007311207311207*G0_1_1_0 + 0.0146224146224143*G0_1_1_1 + 0.0492544492544486*G0_2_0_0 + 0.0708802308802302*G0_2_0_1 + 0.0631072631072622*G0_2_1_0 + 0.0475228475228467*G0_2_1_1 - 0.0838095238095239*G0_3_0_0 - 0.0287445887445888*G0_3_0_1 - 0.0727272727272731*G0_3_1_0 - 0.0117748917748921*G0_3_1_1 - 0.0422510822510826*G0_4_0_0 - 0.0921212121212122*G0_4_0_1 - 0.0633766233766235*G0_4_1_0 - 0.0470995670995669*G0_4_1_1 + 0.202943722943722*G0_5_0_0 - 0.244155844155842*G0_5_0_1 - 0.0446753246753248*G0_5_1_1 + 0.402424242424242*G0_6_0_0 + 0.199480519480519*G0_6_0_1 - 0.0446753246753242*G0_6_1_0 - 0.044675324675324*G0_6_1_1 + 0.0661471861471859*G0_7_0_0 + 0.0450216450216454*G0_7_0_1 + 0.0162770562770565*G0_7_1_0 - 0.0470995670995669*G0_7_1_1 + 0.00588744588744586*G0_8_0_0 + 0.0169696969696968*G0_8_0_1 + 0.0609523809523797*G0_8_1_0 - 0.0117748917748922*G0_8_1_1 - 0.174545454545454*G0_9_0_0 - 0.00207792207792285*G0_9_0_1 - 0.00207792207792251*G0_9_1_0 - 0.0041558441558441*G0_9_1_1; + A[16] = 0.0141814975148308*G0_0_0_0 + 0.172286355619688*G0_1_0_0 + 0.0141814975148308*G0_2_0_0 + 0.10777417027417*G0_3_0_0 - 0.0453282828282825*G0_4_0_0 + 0.00661976911976906*G0_5_0_0 + 0.0066197691197691*G0_6_0_0 - 0.0453282828282826*G0_7_0_0 + 0.10777417027417*G0_8_0_0 + 0.0342352092352092*G0_9_0_0; + A[36] = -0.0010966810966811*G0_0_1_0 - 0.0365624498957831*G0_0_1_1 - 0.0101907968574635*G0_1_1_0 - 0.0123520923520923*G0_1_1_1 - 0.093185826519159*G0_2_1_0 - 0.0873817540484203*G0_2_1_1 + 0.0378643578643575*G0_3_1_0 + 0.0348629148629146*G0_3_1_1 - 0.0787878787878782*G0_4_1_0 - 0.0735930735930732*G0_4_1_1 - 0.0267821067821066*G0_5_1_0 - 0.0193362193362192*G0_5_1_1 - 0.0014430014430012*G0_6_1_0 + 0.00663780663780661*G0_6_1_1 - 0.00738816738816738*G0_7_1_0 - 0.0523520923520921*G0_7_1_1 + 0.0102741702741702*G0_8_1_0 + 0.0225108225108224*G0_8_1_1 - 0.0324386724386723*G0_9_1_0 - 0.0279365079365079*G0_9_1_1; + A[122] = -0.0276735610068943*G0_0_0_1 - 0.027070707070707*G0_0_1_1 - 0.0276735610068942*G0_1_0_1 - 0.0224082090748757*G0_1_1_1 - 0.38524931858265*G0_2_0_1 - 0.290107423440755*G0_2_1_1 + 0.124098124098123*G0_3_0_1 + 0.0854256854256848*G0_3_1_1 - 0.275036075036073*G0_4_0_1 - 0.197691197691197*G0_4_1_1 + 0.124098124098123*G0_5_0_1 + 0.0366522366522364*G0_5_1_1 - 0.275036075036073*G0_6_0_1 - 0.12034632034632*G0_6_1_1 + 0.00865800865800857*G0_7_0_1 - 0.041154401154401*G0_7_1_1 + 0.00865800865800855*G0_8_0_1 - 0.00126984126984128*G0_8_1_1 - 0.0536796536796534*G0_9_0_1 - 0.0738816738816736*G0_9_1_1; + A[191] = -A[108] + 0.0816802950136278*G0_0_0_0 - 0.00488696488696504*G0_0_0_1 - 0.0156742023408689*G0_0_1_0 - 0.00681096681096701*G0_0_1_1 - 0.052204585537919*G0_1_0_0 - 0.0962000962000969*G0_1_0_1 - 0.037094757094757*G0_1_1_0 + 0.047561327561327*G0_2_0_0 - 0.0036171236171239*G0_2_0_1 + 0.0158281224947889*G0_2_1_0 + 0.00311688311688283*G0_2_1_1 - 0.277979797979796*G0_3_0_0 - 0.236652236652236*G0_3_0_1 - 0.240577200577199*G0_3_1_0 - 0.142914862914863*G0_3_1_1 + 0.0925829725829723*G0_4_0_0 + 0.0670707070707065*G0_4_0_1 + 0.0870418470418469*G0_4_1_0 + 0.0170851370851369*G0_4_1_1 + 0.420663780663778*G0_5_0_0 - 0.0473304473304471*G0_5_0_1 + 0.0537950937950933*G0_5_1_0 + 0.0174314574314574*G0_5_1_1 - 0.159076479076478*G0_6_0_0 - 0.0130447330447332*G0_6_0_1 - 0.0778066378066374*G0_6_1_0 - 0.0137373737373737*G0_6_1_1 + 0.0724963924963921*G0_7_0_0 - 0.00911976911976869*G0_7_0_1 - 0.154920634920634*G0_7_1_0 - 0.0503318903318897*G0_7_1_1 - 0.242655122655122*G0_8_0_0 + 0.0300144300144289*G0_8_0_1 + 0.0369408369408368*G0_8_1_0 + 0.142914862914861*G0_8_1_1 - 0.0671861471861478*G0_9_0_1 - 0.0484848484848481*G0_9_1_0 + 0.033246753246752*G0_9_1_1; + A[212] = 0.0124803591470258*G0_0_0_1 - 0.00421997755331084*G0_0_1_1 - 0.0124803591470258*G0_1_0_1 - 0.0167003367003366*G0_1_1_1 - 0.11729998396665*G0_2_1_1 + 0.0582972582972582*G0_3_0_1 + 0.121789321789321*G0_3_1_1 - 0.102741702741703*G0_4_0_1 - 0.219336219336218*G0_4_1_1 - 0.0582972582972578*G0_5_0_1 + 0.0634920634920632*G0_5_1_1 + 0.102741702741702*G0_6_0_1 - 0.116594516594516*G0_6_1_1 - 0.00242424242424226*G0_7_0_1 + 0.0731890331890328*G0_7_1_1 + 0.00242424242424243*G0_8_0_1 + 0.0756132756132753*G0_8_1_1 + 0.055411255411255*G0_9_1_1; + A[1] = 0.0169472502805836*G0_0_0_0 + 0.0169472502805836*G0_0_1_0 + 0.0169472502805836*G0_1_0_0 + 0.0169472502805835*G0_1_1_0 + 0.00253166586499918*G0_2_0_0 + 0.00253166586499917*G0_2_1_0 + 0.0152417027417027*G0_3_0_0 + 0.0152417027417026*G0_3_1_0 - 0.00656204906204906*G0_4_0_0 - 0.00656204906204905*G0_4_1_0 + 0.0152417027417027*G0_5_0_0 + 0.0152417027417027*G0_5_1_0 - 0.00656204906204905*G0_6_0_0 - 0.00656204906204906*G0_6_1_0 - 0.000342712842712815*G0_7_0_0 - 0.000342712842712808*G0_7_1_0 - 0.00034271284271283*G0_8_0_0 - 0.000342712842712838*G0_8_1_0 + 0.00351370851370854*G0_9_0_0 + 0.00351370851370853*G0_9_1_0; + A[27] = A[181] - 0.000795254128587467*G0_0_0_1 + 0.000795254128587465*G0_0_1_0 + 0.00829886163219493*G0_2_0_1 - 0.00829886163219493*G0_2_1_0 + 0.0386724386724386*G0_3_0_1 - 0.0386724386724386*G0_3_1_0 - 0.0195093795093795*G0_4_0_1 + 0.0195093795093795*G0_4_1_0 + 0.00507936507936501*G0_5_0_1 - 0.005079365079365*G0_5_1_0 - 0.0125829725829725*G0_6_0_1 + 0.0125829725829725*G0_6_1_0 + 0.0451370851370848*G0_7_0_1 - 0.0451370851370848*G0_7_1_0 - 0.0386724386724383*G0_8_0_1 + 0.0386724386724383*G0_8_1_0 - 0.0256277056277054*G0_9_0_1 + 0.0256277056277054*G0_9_1_0; + A[132] = A[191] - 0.0735738335738331*G0_0_0_0 + 0.0735738335738333*G0_0_1_1 + 0.0384800384800386*G0_1_0_0 + 0.0739842873176207*G0_1_0_1 - 0.001333974667308*G0_1_1_0 - 0.0270899470899469*G0_1_1_1 + 0.0270899470899464*G0_2_0_0 - 0.0739842873176205*G0_2_0_1 + 0.00133397466730749*G0_2_1_0 - 0.0384800384800385*G0_2_1_1 + 0.332467532467531*G0_3_0_0 + 0.300606060606059*G0_3_0_1 + 0.356017316017314*G0_3_1_0 + 0.277056277056276*G0_3_1_1 - 0.277056277056277*G0_4_0_0 - 0.30060606060606*G0_4_0_1 - 0.356017316017315*G0_4_1_0 - 0.332467532467531*G0_4_1_1 - 0.526406926406922*G0_5_0_0 + 0.0327849927849929*G0_5_0_1 - 0.135295815295815*G0_5_1_0 + 0.0858874458874456*G0_5_1_1 + 0.0941991341991326*G0_6_0_0 + 0.00784992784992759*G0_6_0_1 - 0.0272438672438671*G0_6_1_0 - 0.263203463203462*G0_6_1_1 - 0.0858874458874454*G0_7_0_0 - 0.0327849927849923*G0_7_0_1 + 0.135295815295814*G0_7_1_0 + 0.526406926406924*G0_7_1_1 + 0.263203463203462*G0_8_0_0 - 0.0078499278499275*G0_8_0_1 + 0.0272438672438671*G0_8_1_0 - 0.0941991341991332*G0_8_1_1 + 0.0720346320346315*G0_9_0_0 - 0.0720346320346311*G0_9_1_1; + A[46] = 0.00526535193201853*G0_0_0_0 + 0.0276735610068942*G0_0_1_0 + 0.0951418951418942*G0_1_0_0 + 0.38524931858265*G0_1_1_0 + 0.000602853936187231*G0_2_0_0 + 0.0276735610068942*G0_2_1_0 + 0.154689754689754*G0_3_0_0 + 0.275036075036073*G0_3_1_0 - 0.0874458874458868*G0_4_0_0 - 0.124098124098123*G0_4_1_0 - 0.00992784992784979*G0_5_0_0 - 0.00865800865800862*G0_5_1_0 - 0.0498124098124095*G0_6_0_0 - 0.00865800865800857*G0_6_1_0 - 0.0386724386724384*G0_7_0_0 - 0.124098124098123*G0_7_1_0 + 0.0773448773448766*G0_8_0_0 + 0.275036075036073*G0_8_1_0 - 0.0202020202020202*G0_9_0_0 + 0.0536796536796535*G0_9_1_0; + A[89] = 0.0154433221099886*G0_0_0_0 - 0.0427384960718294*G0_0_0_1 - 0.0420202020202021*G0_0_1_0 - 0.0657239057239058*G0_0_1_1 - 0.0154433221099889*G0_1_0_0 - 0.058181818181818*G0_1_0_1 - 0.00923520923520923*G0_1_1_0 - 0.0591053391053391*G0_1_1_1 - 0.309892576559242*G0_2_0_1 - 0.0815776815776816*G0_2_1_0 - 0.185473785473784*G0_2_1_1 + 0.115440115440115*G0_3_0_0 + 0.277979797979797*G0_3_0_1 + 0.0845021645021645*G0_3_1_0 + 0.0858874458874455*G0_3_1_1 - 0.521789321789321*G0_4_0_0 - 0.828860028860026*G0_4_0_1 - 1.17748917748917*G0_4_1_0 - 1.23844155844155*G0_4_1_1 - 0.115440115440114*G0_5_0_0 + 0.162539682539682*G0_5_0_1 + 0.126060606060606*G0_5_1_0 + 0.181471861471861*G0_5_1_1 + 0.521789321789319*G0_6_0_0 - 0.307070707070706*G0_6_0_1 - 0.236883116883117*G0_6_1_1 + 0.0013852813852815*G0_7_0_0 + 0.0198556998557*G0_7_0_1 + 0.0609523809523807*G0_7_1_0 - 0.0249350649350643*G0_7_1_1 - 0.00138528138528134*G0_8_0_0 + 0.0184704184704188*G0_8_0_1 + 0.0041558441558441*G0_8_1_0 - 0.274285714285713*G0_8_1_1 - 0.218874458874458*G0_9_0_1 - 0.252121212121212*G0_9_1_0 - 0.620606060606059*G0_9_1_1; + A[164] = A[202] + 0.0847330447330446*G0_0_0_0 - 0.0847330447330438*G0_0_1_1 + 0.0300144300144299*G0_1_0_0 + 0.0635690235690231*G0_1_0_1 + 0.0557960557960558*G0_1_1_0 + 0.0346320346320345*G0_1_1_1 - 0.0346320346320341*G0_2_0_0 - 0.0635690235690227*G0_2_0_1 - 0.0557960557960549*G0_2_1_0 - 0.0300144300144294*G0_2_1_1 + 0.0367099567099572*G0_3_0_0 - 0.0633766233766226*G0_3_0_1 + 0.00935064935065011*G0_3_1_0 - 0.0304761904761897*G0_3_1_1 + 0.0304761904761915*G0_4_0_0 + 0.0633766233766241*G0_4_0_1 - 0.00935064935064865*G0_4_1_0 - 0.0367099567099562*G0_4_1_1 - 0.250043290043289*G0_5_0_0 + 0.289177489177488*G0_5_0_1 + 0.0162770562770561*G0_5_1_0 + 0.110822510822511*G0_5_1_1 - 0.414199134199133*G0_6_0_0 - 0.182510822510822*G0_6_0_1 + 0.105627705627706*G0_6_1_0 + 0.0505627705627699*G0_6_1_1 - 0.110822510822511*G0_7_0_0 - 0.289177489177488*G0_7_0_1 - 0.0162770562770563*G0_7_1_0 + 0.250043290043289*G0_7_1_1 - 0.0505627705627701*G0_8_0_0 + 0.182510822510822*G0_8_0_1 - 0.105627705627704*G0_8_1_0 + 0.414199134199133*G0_8_1_1 + 0.17038961038961*G0_9_0_0 - 0.17038961038961*G0_9_1_1; + A[195] = A[181] + 0.0422254288920954*G0_0_0_0 + 0.0279621612954946*G0_0_0_1 + 0.0287574154240816*G0_0_1_0 + 0.0279621612954942*G0_0_1_1 - 0.0422254288920956*G0_1_0_0 - 0.0142632675966008*G0_1_0_1 - 0.0134680134680135*G0_1_1_0 - 0.0134680134680134*G0_1_1_1 + 0.014083694083694*G0_2_0_1 - 0.00251402918069588*G0_2_1_0 + 0.00578483245149907*G0_2_1_1 - 0.200634920634919*G0_3_0_0 - 0.125598845598844*G0_3_0_1 - 0.169350649350648*G0_3_1_0 - 0.130678210678209*G0_3_1_1 + 0.0203174603174602*G0_4_0_0 - 0.0185858585858586*G0_4_0_1 + 0.0135064935064935*G0_4_1_0 - 0.00600288600288603*G0_4_1_1 + 0.200634920634919*G0_5_0_0 + 0.0750360750360746*G0_5_0_1 + 0.031284271284271*G0_5_1_0 + 0.036363636363636*G0_5_1_1 - 0.0203174603174602*G0_6_0_0 - 0.0389033189033188*G0_6_0_1 - 0.00681096681096664*G0_6_1_0 - 0.0193939393939392*G0_6_1_1 + 0.0595670995670995*G0_7_0_0 + 0.0421356421356421*G0_7_0_1 + 0.0356709956709954*G0_7_1_0 + 0.0808080808080802*G0_7_1_1 - 0.0595670995670995*G0_8_0_0 - 0.0174314574314573*G0_8_0_1 - 0.0238961038961038*G0_8_1_0 - 0.0625685425685419*G0_8_1_1 - 0.0290909090909088*G0_9_0_1 + 0.022164502164502*G0_9_1_0 - 0.00346320346320324*G0_9_1_1; + A[188] = A[132] - 0.00954304954304967*G0_0_0_1 + 0.00954304954304967*G0_0_1_0 - 0.020420073753407*G0_1_0_1 + 0.020420073753407*G0_1_1_0 + 0.054898188231521*G0_2_0_1 - 0.054898188231521*G0_2_1_0 + 0.0457142857142853*G0_3_0_1 - 0.0457142857142853*G0_3_1_0 - 0.00969696969696959*G0_4_0_1 + 0.00969696969696957*G0_4_1_0 - 0.14083694083694*G0_5_0_1 + 0.14083694083694*G0_5_1_0 + 0.0143145743145746*G0_6_0_1 - 0.0143145743145746*G0_6_1_0 + 0.0272438672438665*G0_7_0_1 - 0.0272438672438665*G0_7_1_0 + 0.0494083694083693*G0_8_0_1 - 0.0494083694083693*G0_8_1_0 - 0.0110822510822511*G0_9_0_1 + 0.0110822510822512*G0_9_1_0; + A[14] = A[195] + 0.0200481000481*G0_1_0_0 + 0.0283469616802949*G0_1_0_1 + 0.0192528459195125*G0_1_1_0 + 0.0275517075517074*G0_1_1_1 - 0.0275517075517075*G0_2_0_0 - 0.0283469616802949*G0_2_0_1 - 0.0192528459195125*G0_2_1_0 - 0.0200481000481*G0_2_1_1 + 0.119595959595959*G0_3_0_0 + 0.107012987012986*G0_3_0_1 + 0.124675324675324*G0_3_1_0 + 0.112092352092351*G0_3_1_1 - 0.112092352092351*G0_4_0_0 - 0.107012987012986*G0_4_0_1 - 0.124675324675324*G0_4_1_0 - 0.119595959595959*G0_4_1_1 + 0.00577200577200593*G0_5_0_0 - 0.0329004329004325*G0_5_0_1 + 0.0444444444444446*G0_5_1_0 + 0.00577200577200619*G0_5_1_1 - 0.0236652236652234*G0_6_0_0 + 0.0214718614718614*G0_6_0_1 - 0.0431746031746031*G0_6_1_0 + 0.00196248196248177*G0_6_1_1 - 0.00577200577200564*G0_7_0_0 + 0.032900432900433*G0_7_0_1 - 0.0444444444444437*G0_7_1_0 - 0.00577200577200511*G0_7_1_1 - 0.00196248196248204*G0_8_0_0 - 0.0214718614718616*G0_8_0_1 + 0.0431746031746026*G0_8_1_0 + 0.0236652236652228*G0_8_1_1 + 0.0256277056277056*G0_9_0_0 - 0.0256277056277055*G0_9_1_1; + A[56] = -A[176] + 0.0921981721981721*G0_0_0_0 - 0.0120570787237453*G0_0_0_1 + 0.351964085297418*G0_1_0_0 + 0.398140131473464*G0_1_0_1 + 0.0506910373577038*G0_2_0_0 - 0.0120570787237452*G0_2_0_1 + 0.143145743145743*G0_3_0_0 - 0.156998556998556*G0_3_0_1 - 0.113131313131313*G0_4_0_0 + 0.0369408369408365*G0_4_0_1 + 0.238268398268396*G0_5_0_0 + 0.016161616161616*G0_5_0_1 - 0.00507936507936512*G0_6_0_0 + 0.0161616161616162*G0_6_0_1 + 0.0438672438672436*G0_7_0_0 + 0.0369408369408362*G0_7_0_1 + 0.443290043290042*G0_8_0_0 - 0.156998556998555*G0_8_0_1 + 0.447907647907647*G0_9_0_0 - 0.166233766233765*G0_9_0_1; + A[99] = A[56] - 0.173570626903959*G0_0_0_0 + 0.104409171075837*G0_0_0_1 + 0.490492223825555*G0_0_1_0 - 0.0959435626102285*G0_0_1_1 + 0.173570626903959*G0_1_0_0 + 0.277979797979796*G0_1_0_1 + 0.664062850729515*G0_1_1_0 + 0.86441558441558*G0_1_1_1 + 0.0896841430174757*G0_2_0_1 + 0.0655699855699851*G0_2_1_0 + 0.0776270642937304*G0_2_1_1 + 0.386955266955264*G0_3_0_0 + 0.668629148629145*G0_3_0_1 + 0.527792207792205*G0_3_1_0 + 0.846406926406922*G0_3_1_1 - 0.0618759018759014*G0_4_0_0 - 0.192554112554111*G0_4_0_1 - 0.139451659451659*G0_4_1_0 - 0.287215007215005*G0_4_1_1 - 0.386955266955264*G0_5_0_0 + 0.28167388167388*G0_5_0_1 + 0.14083694083694*G0_5_1_0 - 0.0369408369408363*G0_5_1_1 + 0.0618759018759016*G0_6_0_0 - 0.13067821067821*G0_6_0_1 - 0.0775757575757571*G0_6_1_0 + 0.017085137085137*G0_6_1_1 - 0.054025974025974*G0_7_0_0 + 0.150072150072149*G0_7_0_1 + 0.03001443001443*G0_7_1_0 - 0.674170274170271*G0_7_1_1 + 0.0540259740259737*G0_8_0_0 + 0.204098124098122*G0_8_0_1 + 0.0840404040404038*G0_8_1_0 + 0.908282828282823*G0_8_1_1 + 0.510707070707069*G0_9_0_1 + 0.178239538239538*G0_9_1_0 + 0.344473304473303*G0_9_1_1; + A[125] = A[56] - 0.0776270642937309*G0_0_0_0 + 0.0776270642937306*G0_0_1_1 + 0.095943562610228*G0_1_0_0 + 0.18829565496232*G0_1_0_1 + 0.598492865159529*G0_1_1_0 + 0.86441558441558*G0_1_1_1 - 0.864415584415579*G0_2_0_0 - 0.18829565496232*G0_2_0_1 - 0.598492865159528*G0_2_1_0 - 0.0959435626102287*G0_2_1_1 + 0.674170274170269*G0_3_0_0 + 0.861183261183256*G0_3_0_1 + 0.667243867243863*G0_3_1_0 + 0.908282828282823*G0_3_1_1 - 0.908282828282823*G0_4_0_0 - 0.861183261183256*G0_4_0_1 - 0.667243867243863*G0_4_1_0 - 0.67417027417027*G0_4_1_1 + 0.287215007215006*G0_5_0_0 + 0.131601731601731*G0_5_0_1 + 0.11082251082251*G0_5_1_0 + 0.0170851370851369*G0_5_1_1 - 0.846406926406922*G0_6_0_0 - 0.334776334776333*G0_6_0_1 - 0.16161616161616*G0_6_1_0 - 0.036940836940836*G0_6_1_1 - 0.017085137085137*G0_7_0_0 - 0.131601731601731*G0_7_0_1 - 0.110822510822511*G0_7_1_0 - 0.287215007215006*G0_7_1_1 + 0.0369408369408365*G0_8_0_0 + 0.334776334776333*G0_8_0_1 + 0.161616161616161*G0_8_1_0 + 0.846406926406922*G0_8_1_1 - 0.344473304473303*G0_9_0_0 + 0.344473304473304*G0_9_1_1; + A[83] = A[125] + 0.0120570787237454*G0_0_0_1 - 0.0120570787237454*G0_0_1_0 + 0.0120570787237453*G0_1_0_1 - 0.0120570787237453*G0_1_1_0 - 0.398140131473463*G0_2_0_1 + 0.398140131473463*G0_2_1_0 - 0.036940836940837*G0_3_0_1 + 0.036940836940837*G0_3_1_0 + 0.156998556998557*G0_4_0_1 - 0.156998556998557*G0_4_1_0 - 0.0369408369408371*G0_5_0_1 + 0.0369408369408371*G0_5_1_0 + 0.156998556998557*G0_6_0_1 - 0.156998556998557*G0_6_1_0 - 0.0161616161616162*G0_7_0_1 + 0.0161616161616162*G0_7_1_0 - 0.0161616161616164*G0_8_0_1 + 0.0161616161616164*G0_8_1_0 + 0.166233766233766*G0_9_0_1 - 0.166233766233766*G0_9_1_0; + A[80] = -A[125] + 0.0120570787237454*G0_0_1_0 + 0.0627481160814494*G0_0_1_1 + 0.0120570787237454*G0_1_1_0 + 0.104255250921918*G0_1_1_1 - 0.398140131473463*G0_2_1_0 - 0.0461760461760459*G0_2_1_1 - 0.0369408369408371*G0_3_1_0 + 0.00692640692640706*G0_3_1_1 + 0.156998556998557*G0_4_1_0 + 0.600288600288598*G0_4_1_1 - 0.0369408369408372*G0_5_1_0 - 0.15007215007215*G0_5_1_1 + 0.156998556998557*G0_6_1_0 + 0.3001443001443*G0_6_1_1 - 0.0161616161616162*G0_7_1_0 - 0.0212409812409818*G0_7_1_1 - 0.0161616161616164*G0_8_1_0 + 0.222106782106781*G0_8_1_1 + 0.166233766233766*G0_9_1_0 + 0.614141414141412*G0_9_1_1; + A[31] = -0.00253166586499919*G0_0_1_0 - 0.0169472502805836*G0_1_1_0 - 0.0169472502805835*G0_2_1_0 + 0.000342712842712797*G0_3_1_0 + 0.000342712842712848*G0_4_1_0 + 0.00656204906204905*G0_5_1_0 - 0.0152417027417027*G0_6_1_0 + 0.00656204906204907*G0_7_1_0 - 0.0152417027417027*G0_8_1_0 - 0.00351370851370853*G0_9_1_0; + A[72] = A[202] + 0.0547186147186146*G0_0_0_0 + 0.0335545935545936*G0_0_0_1 + 0.025781625781626*G0_0_1_0 - 0.030014430014429*G0_0_1_1 - 0.0547186147186145*G0_1_0_0 - 0.0289369889369888*G0_1_0_1 - 0.0211640211640211*G0_1_1_0 + 0.0346320346320347*G0_1_1_1 - 0.0847330447330438*G0_2_0_1 - 0.0847330447330437*G0_2_1_0 - 0.0847330447330437*G0_2_1_1 + 0.286753246753245*G0_3_0_0 + 0.23168831168831*G0_3_0_1 + 0.519826839826837*G0_3_1_0 + 0.414199134199132*G0_3_1_1 + 0.444675324675323*G0_4_0_0 + 0.539220779220777*G0_4_0_1 + 0.266320346320346*G0_4_1_0 + 0.250043290043289*G0_4_1_1 - 0.286753246753246*G0_5_0_0 + 0.233073593073591*G0_5_0_1 - 0.0550649350649359*G0_5_1_0 + 0.0505627705627709*G0_5_1_1 - 0.444675324675324*G0_6_0_0 - 0.178354978354978*G0_6_0_1 + 0.0945454545454537*G0_6_1_0 + 0.11082251082251*G0_6_1_1 - 0.06025974025974*G0_7_0_0 - 0.100086580086579*G0_7_0_1 - 0.0273593073593075*G0_7_1_0 - 0.0367099567099554*G0_7_1_1 + 0.0602597402597398*G0_8_0_0 + 0.0329004329004326*G0_8_0_1 - 0.0398268398268389*G0_8_1_0 - 0.0304761904761903*G0_8_1_1 - 0.170389610389608*G0_9_0_1 - 0.170389610389609*G0_9_1_0 - 0.170389610389609*G0_9_1_1; + A[42] = -0.000795254128587423*G0_0_1_0 - 0.0142632675966009*G0_0_1_1 + 0.0082988616321949*G0_1_1_0 + 0.014083694083694*G0_1_1_1 + 0.0279621612954946*G0_2_1_1 - 0.0195093795093794*G0_3_1_0 - 0.0389033189033186*G0_3_1_1 + 0.0386724386724388*G0_4_1_0 + 0.0750360750360749*G0_4_1_1 + 0.0451370851370846*G0_5_1_0 - 0.0174314574314574*G0_5_1_1 - 0.0386724386724383*G0_6_1_0 + 0.042135642135642*G0_6_1_1 + 0.00507936507936503*G0_7_1_0 - 0.125598845598845*G0_7_1_1 - 0.0125829725829725*G0_8_1_0 - 0.0185858585858584*G0_8_1_1 - 0.0256277056277052*G0_9_1_0 - 0.0290909090909087*G0_9_1_1; + A[107] = 0.0059050825717492*G0_0_0_1 + 0.0325044091710757*G0_0_1_1 + 0.018385441718775*G0_1_0_1 + 0.018047138047138*G0_1_1_1 + 0.214381914381913*G0_2_0_1 + 0.188255571588904*G0_2_1_1 - 0.0819624819624814*G0_3_0_1 - 0.0683982683982679*G0_3_1_1 + 0.180591630591629*G0_4_0_1 + 0.148268398268397*G0_4_1_1 - 0.0236652236652234*G0_5_0_1 + 0.0283549783549782*G0_5_1_1 + 0.0778499278499273*G0_6_0_1 + 0.00627705627705616*G0_6_1_1 - 0.00542568542568545*G0_7_0_1 + 0.0716450216450213*G0_7_1_1 - 0.00784992784992776*G0_8_0_1 - 0.0212987012987012*G0_8_1_1 + 0.0471861471861471*G0_9_0_1 + 0.0640692640692638*G0_9_1_1; + A[7] = A[107] - 0.0261263427930095*G0_0_0_0 + 0.182350489017155*G0_0_0_1 - 0.0261263427930095*G0_0_1_0 + 0.155751162417828*G0_0_1_1 - 0.000338303671637027*G0_1_0_0 - 0.000338303671637077*G0_1_0_1 - 0.000338303671637015*G0_1_1_0 + 0.0265993265993265*G0_2_0_0 - 0.181877505210837*G0_2_0_1 + 0.0265993265993266*G0_2_1_0 - 0.155751162417828*G0_2_1_1 - 0.0134487734487733*G0_3_0_0 + 0.0606637806637802*G0_3_0_1 - 0.0134487734487734*G0_3_1_0 + 0.0470995670995667*G0_3_1_1 + 0.0770707070707066*G0_4_0_0 - 0.108946608946608*G0_4_0_1 + 0.0770707070707067*G0_4_1_0 - 0.0766233766233761*G0_4_1_1 - 0.0715728715728713*G0_5_0_0 + 0.0299422799422796*G0_5_0_1 - 0.0715728715728715*G0_5_1_0 - 0.022077922077922*G0_5_1_1 + 0.0520202020202018*G0_6_0_0 - 0.049494949494949*G0_6_0_1 + 0.0520202020202019*G0_6_1_0 + 0.0220779220779222*G0_6_1_1 - 0.0323232323232323*G0_7_0_0 + 0.153694083694083*G0_7_0_1 - 0.0323232323232323*G0_7_1_0 + 0.0766233766233762*G0_7_1_1 + 0.0135642135642136*G0_8_0_0 - 0.0605483405483403*G0_8_0_1 + 0.0135642135642136*G0_8_1_0 - 0.0470995670995669*G0_8_1_1 + 0.0168831168831168*G0_9_0_0 + 0.0168831168831169*G0_9_0_1 + 0.0168831168831168*G0_9_1_0; + A[182] = A[42] - 0.00079525412858743*G0_0_0_1 + 0.000795254128587431*G0_0_1_0 + 0.0082988616321949*G0_1_0_1 - 0.0082988616321949*G0_1_1_0 - 0.0195093795093794*G0_3_0_1 + 0.0195093795093794*G0_3_1_0 + 0.0386724386724388*G0_4_0_1 - 0.0386724386724388*G0_4_1_0 + 0.0451370851370846*G0_5_0_1 - 0.0451370851370846*G0_5_1_0 - 0.0386724386724383*G0_6_0_1 + 0.0386724386724383*G0_6_1_0 + 0.00507936507936504*G0_7_0_1 - 0.00507936507936503*G0_7_1_0 - 0.0125829725829725*G0_8_0_1 + 0.0125829725829725*G0_8_1_0 - 0.0256277056277053*G0_9_0_1 + 0.0256277056277053*G0_9_1_0; + A[198] = A[89] - 0.0811672278338943*G0_0_0_0 + 0.0811672278338944*G0_0_1_1 - 0.170030463363795*G0_1_0_0 - 0.251710758377423*G0_1_0_1 - 0.0723424723424721*G0_1_1_0 + 0.0591053391053388*G0_1_1_1 - 0.0591053391053373*G0_2_0_0 + 0.251710758377424*G0_2_0_1 + 0.0723424723424722*G0_2_1_0 + 0.170030463363796*G0_2_1_1 - 1.35388167388167*G0_3_0_0 - 1.10683982683982*G0_3_0_1 - 1.26199134199134*G0_3_1_0 - 0.607676767676765*G0_3_1_1 + 0.607676767676766*G0_4_0_0 + 1.10683982683982*G0_4_0_1 + 1.26199134199134*G0_4_1_0 + 1.35388167388167*G0_4_1_1 + 0.0905050505050499*G0_5_0_0 - 0.142683982683982*G0_5_0_1 - 0.0651082251082253*G0_5_1_0 - 0.18008658008658*G0_5_1_1 - 0.796075036075032*G0_6_0_0 + 0.325541125541124*G0_6_0_1 + 0.00415584415584378*G0_6_1_0 + 0.235497835497835*G0_6_1_1 + 0.180086580086579*G0_7_0_0 + 0.142683982683982*G0_7_0_1 + 0.0651082251082253*G0_7_1_0 - 0.0905050505050503*G0_7_1_1 - 0.235497835497834*G0_8_0_0 - 0.325541125541124*G0_8_0_1 - 0.00415584415584512*G0_8_1_0 + 0.796075036075031*G0_8_1_1 - 0.620606060606059*G0_9_0_0 + 0.620606060606058*G0_9_1_1; + A[32] = 0.0141814975148308*G0_0_1_1 + 0.0141814975148308*G0_1_1_1 + 0.172286355619688*G0_2_1_1 - 0.0453282828282825*G0_3_1_1 + 0.10777417027417*G0_4_1_1 - 0.0453282828282826*G0_5_1_1 + 0.10777417027417*G0_6_1_1 + 0.00661976911976909*G0_7_1_1 + 0.00661976911976913*G0_8_1_1 + 0.0342352092352091*G0_9_1_1; + A[25] = 0.0325044091710758*G0_0_0_0 + 0.00590508257174922*G0_0_0_1 + 0.188255571588904*G0_1_0_0 + 0.214381914381913*G0_1_0_1 + 0.018047138047138*G0_2_0_0 + 0.0183854417187749*G0_2_0_1 + 0.148268398268398*G0_3_0_0 + 0.180591630591629*G0_3_0_1 - 0.068398268398268*G0_4_0_0 - 0.0819624819624814*G0_4_0_1 + 0.0716450216450211*G0_5_0_0 - 0.00542568542568542*G0_5_0_1 - 0.0212987012987012*G0_6_0_0 - 0.00784992784992788*G0_6_0_1 + 0.0283549783549781*G0_7_0_0 - 0.0236652236652236*G0_7_0_1 + 0.00627705627705644*G0_8_0_0 + 0.0778499278499276*G0_8_0_1 + 0.064069264069264*G0_9_0_0 + 0.0471861471861472*G0_9_0_1; + A[61] = -0.00033830367163698*G0_0_0_0 - 0.018385441718775*G0_0_1_0 - 0.0261263427930091*G0_1_0_0 - 0.214381914381914*G0_1_1_0 + 0.0265993265993264*G0_2_0_0 - 0.00590508257174922*G0_2_1_0 - 0.0715728715728711*G0_3_0_0 - 0.0778499278499275*G0_3_1_0 + 0.0520202020202016*G0_4_0_0 + 0.0236652236652235*G0_4_1_0 - 0.0134487734487734*G0_5_0_0 + 0.00784992784992785*G0_5_1_0 + 0.0770707070707066*G0_6_0_0 + 0.00542568542568539*G0_6_1_0 + 0.0135642135642134*G0_7_0_0 + 0.0819624819624816*G0_7_1_0 - 0.0323232323232319*G0_8_0_0 - 0.18059163059163*G0_8_1_0 + 0.0168831168831168*G0_9_0_0 - 0.0471861471861471*G0_9_1_0; + A[15] = 0.0169472502805836*G0_0_0_0 + 0.0169472502805836*G0_0_0_1 + 0.0169472502805836*G0_1_0_0 + 0.0169472502805835*G0_1_0_1 + 0.00253166586499918*G0_2_0_0 + 0.00253166586499917*G0_2_0_1 + 0.0152417027417027*G0_3_0_0 + 0.0152417027417026*G0_3_0_1 - 0.00656204906204906*G0_4_0_0 - 0.00656204906204904*G0_4_0_1 + 0.0152417027417027*G0_5_0_0 + 0.0152417027417027*G0_5_0_1 - 0.00656204906204905*G0_6_0_0 - 0.00656204906204906*G0_6_0_1 - 0.000342712842712813*G0_7_0_0 - 0.000342712842712809*G0_7_0_1 - 0.000342712842712828*G0_8_0_0 - 0.000342712842712838*G0_8_0_1 + 0.00351370851370854*G0_9_0_0 + 0.00351370851370854*G0_9_0_1; + A[37] = 0.0059050825717492*G0_0_1_0 + 0.0325044091710757*G0_0_1_1 + 0.018385441718775*G0_1_1_0 + 0.018047138047138*G0_1_1_1 + 0.214381914381913*G0_2_1_0 + 0.188255571588904*G0_2_1_1 - 0.0819624819624813*G0_3_1_0 - 0.0683982683982679*G0_3_1_1 + 0.180591630591629*G0_4_1_0 + 0.148268398268397*G0_4_1_1 - 0.0236652236652234*G0_5_1_0 + 0.0283549783549782*G0_5_1_1 + 0.0778499278499273*G0_6_1_0 + 0.00627705627705616*G0_6_1_1 - 0.00542568542568545*G0_7_1_0 + 0.0716450216450213*G0_7_1_1 - 0.00784992784992776*G0_8_1_0 - 0.0212987012987012*G0_8_1_1 + 0.0471861471861471*G0_9_1_0 + 0.0640692640692638*G0_9_1_1; + A[168] = -A[176] + 0.0921981721981721*G0_0_0_0 - 0.0120570787237453*G0_0_1_0 + 0.351964085297418*G0_1_0_0 + 0.398140131473464*G0_1_1_0 + 0.0506910373577038*G0_2_0_0 - 0.0120570787237452*G0_2_1_0 + 0.143145743145743*G0_3_0_0 - 0.156998556998556*G0_3_1_0 - 0.113131313131313*G0_4_0_0 + 0.0369408369408365*G0_4_1_0 + 0.238268398268396*G0_5_0_0 + 0.016161616161616*G0_5_1_0 - 0.00507936507936511*G0_6_0_0 + 0.0161616161616162*G0_6_1_0 + 0.0438672438672436*G0_7_0_0 + 0.0369408369408362*G0_7_1_0 + 0.443290043290042*G0_8_0_0 - 0.156998556998555*G0_8_1_0 + 0.447907647907647*G0_9_0_0 - 0.166233766233765*G0_9_1_0; + A[184] = A[72] + 0.00777296777296738*G0_1_0_1 - 0.00777296777296738*G0_1_1_0 - 0.00777296777296793*G0_2_0_1 + 0.00777296777296793*G0_2_1_0 + 0.244155844155843*G0_3_0_1 - 0.244155844155843*G0_3_1_0 - 0.244155844155843*G0_4_0_1 + 0.244155844155843*G0_4_1_0 - 0.0439826839826846*G0_5_0_1 + 0.0439826839826846*G0_5_1_0 + 0.0287445887445884*G0_6_0_1 - 0.0287445887445884*G0_6_1_0 + 0.0439826839826823*G0_7_0_1 - 0.0439826839826823*G0_7_1_0 - 0.0287445887445885*G0_8_0_1 + 0.0287445887445885*G0_8_1_0; + A[213] = -A[191] + 0.0896841430174759*G0_0_0_0 + 0.00184704184704169*G0_0_0_1 + 0.0127240660573996*G0_0_1_0 - 0.00369408369408382*G0_0_1_1 + 0.035299021965688*G0_1_0_0 + 0.0714189514189507*G0_2_0_0 - 0.0055411255411256*G0_2_0_1 - 0.0164181497514829*G0_2_1_0 - 0.00369408369408359*G0_2_1_1 - 0.496854256854254*G0_3_0_0 - 0.123751803751803*G0_3_0_1 - 0.147763347763346*G0_3_1_0 + 0.334314574314573*G0_4_0_0 + 0.0258585858585862*G0_4_0_1 + 0.212409812409812*G0_4_1_0 - 0.0332467532467525*G0_4_1_1 + 0.446984126984123*G0_5_0_0 - 0.0480230880230878*G0_5_0_1 - 0.0701875901875901*G0_5_1_0 + 0.00369408369408353*G0_5_1_1 + 0.568888888888886*G0_6_0_0 + 0.0517171717171716*G0_6_0_1 + 0.0738816738816739*G0_6_1_0 + 0.00369408369408379*G0_6_1_1 + 0.0627994227994226*G0_7_0_0 - 0.0591053391053387*G0_7_0_1 - 0.245656565656564*G0_7_1_0 - 0.0332467532467528*G0_7_1_1 - 0.225339105339105*G0_8_0_0 + 0.123751803751803*G0_8_0_1 + 0.147763347763348*G0_8_1_0 + 0.0609523809523801*G0_9_0_0 + 0.0332467532467522*G0_9_0_1 + 0.0332467532467531*G0_9_1_0 + 0.0664935064935049*G0_9_1_1; + A[104] = A[213] + 0.0612602212602211*G0_0_0_0 + 0.0355042488375822*G0_0_0_1 - 0.0398140131473469*G0_0_1_0 - 0.0384800384800389*G0_0_1_1 - 0.0612602212602208*G0_1_0_0 - 0.101074234407567*G0_1_0_1 - 0.0257559724226389*G0_1_1_0 - 0.0270899470899467*G0_1_1_1 + 0.073573833573833*G0_2_0_1 + 0.0735738335738335*G0_2_1_0 + 0.0735738335738331*G0_2_1_1 + 0.149610389610389*G0_3_0_0 - 0.086349206349206*G0_3_0_1 - 0.121443001443002*G0_3_1_0 - 0.0941991341991339*G0_3_1_1 + 0.338008658008657*G0_4_0_0 + 0.559191919191916*G0_4_0_1 + 0.391111111111109*G0_4_1_0 + 0.526406926406923*G0_4_1_1 - 0.14961038961039*G0_5_0_0 - 0.27105339105339*G0_5_0_1 - 0.235959595959595*G0_5_1_0 - 0.263203463203462*G0_5_1_1 - 0.338008658008655*G0_6_0_0 + 0.0531024531024531*G0_6_0_1 + 0.221183261183261*G0_6_1_0 + 0.0858874458874457*G0_6_1_1 + 0.0470995670995668*G0_7_0_0 - 0.0318614718614722*G0_7_0_1 + 0.0235497835497831*G0_7_1_0 - 0.332467532467532*G0_7_1_1 - 0.0470995670995668*G0_8_0_0 - 0.0235497835497835*G0_8_0_1 - 0.0789610389610386*G0_8_1_0 + 0.277056277056276*G0_8_1_1 - 0.072034632034632*G0_9_0_1 - 0.072034632034632*G0_9_1_0 - 0.0720346320346317*G0_9_1_1; + A[216] = A[104] - 0.054898188231522*G0_0_0_1 + 0.054898188231522*G0_0_1_0 + 0.0204200737534071*G0_1_0_1 - 0.0204200737534071*G0_1_1_0 + 0.00954304954305006*G0_2_0_1 - 0.00954304954305005*G0_2_1_0 - 0.0494083694083692*G0_3_0_1 + 0.0494083694083692*G0_3_1_0 - 0.0272438672438673*G0_4_0_1 + 0.0272438672438673*G0_4_1_0 - 0.0143145743145743*G0_5_0_1 + 0.0143145743145743*G0_5_1_0 + 0.140836940836941*G0_6_0_1 - 0.140836940836941*G0_6_1_0 + 0.00969696969696955*G0_7_0_1 - 0.00969696969696958*G0_7_1_0 - 0.045714285714285*G0_8_0_1 + 0.045714285714285*G0_8_1_0 + 0.011082251082251*G0_9_0_1 - 0.011082251082251*G0_9_1_0; + A[148] = A[216] - 0.119544652877986*G0_0_0_0 + 0.119544652877986*G0_0_1_1 + 0.0573609106942437*G0_1_0_0 + 0.0842456309122972*G0_1_0_1 + 0.0951226551226546*G0_1_1_0 + 0.125598845598845*G0_1_1_1 - 0.125598845598845*G0_2_0_0 - 0.0842456309122974*G0_2_0_1 - 0.0951226551226545*G0_2_1_0 - 0.0573609106942437*G0_2_1_1 + 0.507936507936505*G0_3_0_0 + 0.516709956709954*G0_3_0_1 + 0.494545454545452*G0_3_1_0 + 0.489466089466087*G0_3_1_1 - 0.489466089466087*G0_4_0_0 - 0.516709956709954*G0_4_0_1 - 0.494545454545452*G0_4_1_0 - 0.507936507936505*G0_4_1_1 - 0.136681096681095*G0_5_0_0 + 0.219336219336219*G0_5_0_1 + 0.195324675324675*G0_5_1_0 + 0.283520923520923*G0_5_1_1 - 0.0480230880230889*G0_6_0_0 - 0.199018759018759*G0_6_0_1 - 0.0124675324675328*G0_6_1_0 - 0.0988167388167386*G0_6_1_1 - 0.283520923520922*G0_7_0_0 - 0.219336219336217*G0_7_0_1 - 0.195324675324673*G0_7_1_0 + 0.136681096681097*G0_7_1_1 + 0.0988167388167384*G0_8_0_0 + 0.199018759018758*G0_8_0_1 + 0.0124675324675325*G0_8_1_0 + 0.0480230880230876*G0_8_1_1 - 0.138528138528138*G0_9_0_0 + 0.138528138528139*G0_9_1_1; + A[204] = A[148] + 0.0548981882315208*G0_0_0_1 - 0.0548981882315208*G0_0_1_0 - 0.00954304954304971*G0_1_0_1 + 0.00954304954304971*G0_1_1_0 - 0.0204200737534071*G0_2_0_1 + 0.0204200737534071*G0_2_1_0 + 0.0272438672438673*G0_3_0_1 - 0.0272438672438672*G0_3_1_0 + 0.0494083694083696*G0_4_0_1 - 0.0494083694083696*G0_4_1_0 - 0.0096969696969699*G0_5_0_1 + 0.00969696969696994*G0_5_1_0 + 0.0457142857142856*G0_6_0_1 - 0.0457142857142856*G0_6_1_0 + 0.0143145743145742*G0_7_0_1 - 0.0143145743145743*G0_7_1_0 - 0.14083694083694*G0_8_0_1 + 0.14083694083694*G0_8_1_0 - 0.0110822510822503*G0_9_0_1 + 0.0110822510822504*G0_9_1_0; + A[18] = -A[26] - 0.0218053551386885*G0_0_0_0 - 0.194965528298861*G0_1_0_0 - 0.0218053551386884*G0_2_0_0 - 0.043001443001443*G0_3_0_0 - 0.00202020202020192*G0_4_0_0 - 0.0510822510822506*G0_5_0_0 - 0.0510822510822508*G0_6_0_0 - 0.00202020202020186*G0_7_0_0 - 0.0430014430014432*G0_8_0_0 - 0.0940836940836939*G0_9_0_0; + A[133] = A[132] + 0.0036940836940838*G0_0_0_0 - 0.0018470418470417*G0_0_0_1 + 0.0424819624819625*G0_0_1_0 - 0.10097162097162*G0_0_1_1 + 0.00369408369408372*G0_1_0_0 + 0.00554112554112574*G0_1_0_1 + 0.0369408369408368*G0_1_1_0 + 0.0332467532467534*G0_1_1_1 - 0.0116979316979306*G0_2_1_1 + 0.0332467532467529*G0_3_0_0 - 0.0258585858585858*G0_3_0_1 - 0.0775757575757565*G0_3_1_0 - 0.114516594516593*G0_3_1_1 + 0.123751803751805*G0_4_0_1 + 0.221645021645022*G0_4_1_0 + 0.234574314574315*G0_4_1_1 + 0.0332467532467524*G0_5_0_0 + 0.0591053391053381*G0_5_0_1 + 0.12190476190476*G0_5_1_0 - 0.0461760461760463*G0_5_1_1 - 0.123751803751802*G0_6_0_1 - 0.221645021645021*G0_6_1_0 + 0.247503607503607*G0_6_1_1 - 0.00369408369408367*G0_7_0_0 + 0.0480230880230872*G0_7_0_1 - 0.0258585858585861*G0_7_1_0 - 0.422972582972581*G0_7_1_1 - 0.00369408369408361*G0_8_0_0 - 0.0517171717171706*G0_8_0_1 - 0.0535642135642134*G0_8_1_0 + 0.136681096681097*G0_8_1_1 - 0.0664935064935055*G0_9_0_0 - 0.0332467532467522*G0_9_0_1 - 0.0443290043290037*G0_9_1_0 + 0.0443290043290045*G0_9_1_1; + A[38] = -A[35] - 0.0218053551386884*G0_0_1_1 - 0.0218053551386885*G0_1_1_1 - 0.194965528298861*G0_2_1_1 - 0.00202020202020213*G0_3_1_1 - 0.0430014430014427*G0_4_1_1 - 0.00202020202020203*G0_5_1_1 - 0.0430014430014428*G0_6_1_1 - 0.0510822510822507*G0_7_1_1 - 0.051082251082251*G0_8_1_1 - 0.0940836940836938*G0_9_1_1; + A[160] = A[38] + 0.339009139009138*G0_0_0_0 + 0.0227994227994229*G0_0_0_1 + 0.0504729838063172*G0_0_1_0 + 0.0449639249639248*G0_0_1_1 + 0.339009139009138*G0_1_0_0 + 0.316209716209715*G0_1_0_1 + 0.343883277216609*G0_1_1_0 + 0.333711720378385*G0_1_1_1 + 0.112746512746512*G0_2_0_0 + 0.056373256373256*G0_2_0_1 + 0.441622574955906*G0_2_1_0 + 0.382267115600447*G0_2_1_1 + 0.536450216450214*G0_3_0_0 + 0.587705627705624*G0_3_0_1 + 0.463607503607501*G0_3_1_0 + 0.589033189033185*G0_3_1_1 - 0.265627705627704*G0_4_0_0 - 0.229437229437228*G0_4_0_1 + 0.0455988455988452*G0_4_1_0 - 0.115901875901875*G0_4_1_1 + 0.536450216450213*G0_5_0_0 - 0.051255411255411*G0_5_0_1 - 0.175353535353534*G0_5_1_0 - 0.00115440115440096*G0_5_1_1 - 0.265627705627704*G0_6_0_0 - 0.0361904761904761*G0_6_0_1 + 0.238845598845597*G0_6_1_0 + 0.485887445887443*G0_7_0_0 - 0.209523809523809*G0_7_0_1 - 0.218181818181817*G0_7_1_0 + 0.150072150072149*G0_7_1_1 + 0.485887445887444*G0_8_0_0 + 0.695411255411253*G0_8_0_1 + 0.686753246753244*G0_8_1_0 + 1.01512265512265*G0_8_1_1 + 0.654545454545453*G0_9_0_0 + 0.327272727272726*G0_9_0_1 + 0.38095238095238*G0_9_1_0 + 0.704531024531022*G0_9_1_1; + A[88] = -A[133] + 0.0552060285393617*G0_0_1_0 - 0.0112874779541443*G0_0_1_1 + 0.0205226871893535*G0_1_1_0 + 0.104665704665704*G0_1_1_1 + 0.0236010902677572*G0_2_1_1 + 0.134834054834055*G0_3_1_0 + 0.21979797979798*G0_3_1_1 + 0.073881673881674*G0_4_1_0 - 0.262279942279941*G0_4_1_1 - 0.123751803751804*G0_5_1_0 + 0.0166233766233766*G0_5_1_1 - 0.0738816738816743*G0_6_1_0 + 0.0221645021645019*G0_6_1_1 - 0.0960461760461763*G0_7_1_0 + 0.0240115440115434*G0_7_1_1 + 0.0203174603174603*G0_8_1_0 + 0.705569985569983*G0_8_1_1 - 0.011082251082251*G0_9_1_0 + 0.105281385281384*G0_9_1_1; + A[116] = -A[108] + 0.030463363796697*G0_0_0_0 - 0.0411095077761746*G0_0_1_0 - 0.00641333974667261*G0_1_0_0 + 0.071572871572871*G0_2_0_0 + 0.0411095077761741*G0_2_1_0 + 0.0521789321789323*G0_3_0_0 + 0.0131601731601732*G0_3_1_0 - 0.0555266955266951*G0_4_0_0 - 0.0207792207792203*G0_4_1_0 - 0.108282828282827*G0_5_0_0 + 0.188051948051946*G0_5_1_0 - 0.296334776334775*G0_6_0_0 - 0.188051948051947*G0_6_1_0 - 0.0347474747474747*G0_7_0_0 + 0.02077922077922*G0_7_1_0 + 0.0390187590187587*G0_8_0_0 - 0.013160173160173*G0_8_1_0 + 0.0879653679653684*G0_9_0_0; + A[139] = A[116] - 0.0186371653038317*G0_0_0_0 + 0.0017572550905889*G0_0_0_1 + 0.0374154240820907*G0_0_1_0 - 0.0168414301747638*G0_0_1_1 + 0.0186371653038313*G0_1_0_0 + 0.0560525893859221*G0_1_0_1 + 0.0203944203944198*G0_1_1_0 + 0.0746512746512737*G0_1_1_1 + 0.0149174282507614*G0_2_0_1 + 0.0149174282507613*G0_2_1_0 + 0.0149174282507614*G0_2_1_1 - 0.0648773448773439*G0_3_0_0 - 0.172582972582971*G0_3_0_1 - 0.0658008658008651*G0_3_1_0 - 0.207792207792207*G0_3_1_1 - 0.0925829725829719*G0_4_0_0 - 0.0499855699855696*G0_4_0_1 - 0.128831168831169*G0_4_1_0 - 0.0554112554112552*G0_4_1_1 + 0.0648773448773445*G0_5_0_0 - 0.000923520923520811*G0_5_0_1 - 0.107705627705626*G0_5_1_0 + 0.034285714285714*G0_5_1_1 + 0.0925829725829718*G0_6_0_0 - 0.0362481962481961*G0_6_0_1 + 0.0425974025974019*G0_6_1_0 - 0.0308225108225105*G0_6_1_1 + 0.0536796536796531*G0_7_0_0 + 0.0405194805194804*G0_7_0_1 + 0.00900432900432859*G0_7_1_0 + 0.0374025974025967*G0_7_1_1 - 0.0536796536796534*G0_8_0_0 - 0.0446753246753252*G0_8_0_1 - 0.0131601731601731*G0_8_1_0 - 0.0415584415584419*G0_8_1_1 + 0.0387878787878789*G0_9_0_1 + 0.0387878787878786*G0_9_1_0 + 0.0387878787878785*G0_9_1_1; + A[157] = -A[139] - 0.0372166105499437*G0_0_0_0 + 0.115299021965689*G0_0_0_1 + 0.0093121693121691*G0_0_1_0 - 0.0509668109668106*G0_0_1_1 + 0.0156677890011219*G0_1_0_0 + 0.0567580567580566*G0_1_0_1 + 0.017566137566137*G0_1_1_0 + 0.0673400673400668*G0_1_1_1 - 0.0103896103896108*G0_2_0_0 - 0.00297578964245648*G0_2_0_1 - 0.00105820105820119*G0_2_1_0 + 0.00151996151996156*G0_2_1_1 - 0.0391919191919181*G0_3_0_0 - 0.166291486291485*G0_3_0_1 - 0.0399999999999991*G0_3_1_0 - 0.202597402597401*G0_3_1_1 - 0.101356421356421*G0_4_0_0 - 0.0468109668109669*G0_4_0_1 - 0.108571428571428*G0_4_1_0 - 0.0445021645021647*G0_4_1_1 + 0.0481962481962479*G0_5_0_0 - 0.153708513708512*G0_5_0_1 + 0.0850216450216453*G0_5_1_1 + 0.0106204906204901*G0_6_0_0 - 0.00860028860028906*G0_6_0_1 - 0.0438095238095245*G0_6_1_0 - 0.0368831168831174*G0_6_1_1 + 0.100490620490619*G0_7_0_0 - 0.117691197691197*G0_7_0_1 + 0.0228571428571418*G0_7_1_0 + 0.0735930735930731*G0_7_1_1 - 0.0550072150072144*G0_8_0_0 - 0.0522366522366521*G0_8_0_1 - 0.0666666666666658*G0_8_1_0 - 0.0349783549783548*G0_8_1_1 + 0.0512554112554112*G0_9_0_0 + 0.12017316017316*G0_9_0_1 - 0.0457142857142859*G0_9_1_0 + 0.040865800865801*G0_9_1_1; + A[70] = A[157] + 0.0342472342472342*G0_0_0_0 - 0.115440115440115*G0_0_0_1 - 0.0129870129870132*G0_0_1_0 + 0.0428090428090424*G0_0_1_1 - 0.0342472342472336*G0_1_0_0 - 0.0472342472342465*G0_1_0_1 - 0.149687349687349*G0_1_1_0 - 0.205483405483405*G0_1_1_1 + 0.0085618085618086*G0_2_0_1 + 0.00856180856180846*G0_2_1_0 + 0.00856180856180838*G0_2_1_1 + 0.0225108225108214*G0_3_0_0 + 0.0419047619047609*G0_3_0_1 + 0.176103896103894*G0_3_1_0 + 0.2817316017316*G0_3_1_1 + 0.0193939393939394*G0_4_0_0 + 0.0512554112554113*G0_4_0_1 - 0.00103896103896089*G0_4_1_0 + 0.0152380952380955*G0_4_1_1 - 0.0225108225108223*G0_5_0_0 + 0.153593073593072*G0_5_0_1 + 0.0193939393939397*G0_5_1_0 - 0.0862337662337666*G0_5_1_1 - 0.0193939393939389*G0_6_0_0 - 0.0204329004329002*G0_6_0_1 + 0.0318614718614725*G0_6_1_0 + 0.0155844155844162*G0_6_1_1 - 0.101818181818181*G0_7_0_0 + 0.169870129870128*G0_7_0_1 - 0.0166233766233761*G0_7_1_0 - 0.00727272727272778*G0_7_1_1 + 0.101818181818181*G0_8_0_0 + 0.0851948051948042*G0_8_0_1 + 0.27168831168831*G0_8_1_0 + 0.262337662337661*G0_8_1_1 + 0.015584415584415*G0_9_0_1 + 0.0155844155844154*G0_9_1_0 + 0.0155844155844148*G0_9_1_1; + A[154] = A[70] + 0.000673400673400295*G0_0_0_1 - 0.000673400673400294*G0_0_1_0 - 0.101779701779702*G0_1_0_1 + 0.101779701779702*G0_1_1_0 + 0.000673400673400766*G0_2_0_1 - 0.000673400673400765*G0_2_1_0 + 0.146320346320345*G0_3_0_1 - 0.146320346320345*G0_3_1_0 - 0.0401731601731599*G0_4_0_1 + 0.0401731601731599*G0_4_1_0 + 0.0121212121212122*G0_5_0_1 - 0.0121212121212122*G0_5_1_0 + 0.0121212121212124*G0_6_0_1 - 0.0121212121212124*G0_6_1_0 - 0.0401731601731595*G0_7_0_1 + 0.0401731601731595*G0_7_1_0 + 0.146320346320346*G0_8_0_1 - 0.146320346320346*G0_8_1_0 - 0.136103896103896*G0_9_0_1 + 0.136103896103896*G0_9_1_0; + A[109] = A[70] + 0.00856180856180883*G0_0_0_0 - 0.00856180856180897*G0_0_1_1 + 0.0428090428090426*G0_1_0_0 + 0.0557960557960559*G0_1_0_1 + 0.158249158249158*G0_1_1_0 + 0.205483405483405*G0_1_1_1 - 0.205483405483404*G0_2_0_0 - 0.055796055796055*G0_2_0_1 - 0.158249158249157*G0_2_1_0 - 0.0428090428090421*G0_2_1_1 - 0.00727272727272698*G0_3_0_0 + 0.00935064935065025*G0_3_0_1 - 0.177142857142856*G0_3_1_0 - 0.26233766233766*G0_3_1_1 + 0.262337662337662*G0_4_0_0 - 0.00935064935064854*G0_4_0_1 + 0.177142857142856*G0_4_1_0 + 0.0072727272727276*G0_4_1_1 + 0.0152380952380947*G0_5_0_0 + 0.0162770562770562*G0_5_0_1 - 0.0360173160173164*G0_5_1_0 - 0.0155844155844163*G0_5_1_1 + 0.281731601731602*G0_6_0_0 + 0.105627705627706*G0_6_0_1 + 0.23982683982684*G0_6_1_0 + 0.0862337662337667*G0_6_1_1 + 0.015584415584415*G0_7_0_0 - 0.0162770562770562*G0_7_0_1 + 0.0360173160173149*G0_7_1_0 - 0.0152380952380958*G0_7_1_1 - 0.0862337662337653*G0_8_0_0 - 0.105627705627704*G0_8_0_1 - 0.239826839826838*G0_8_1_0 - 0.2817316017316*G0_8_1_1 + 0.0155844155844156*G0_9_0_0 - 0.0155844155844154*G0_9_1_1; + A[29] = A[27] + 0.0200481000480999*G0_0_0_0 - 0.00750360750360743*G0_0_0_1 - 0.0275517075517074*G0_2_0_0 - 0.00750360750360747*G0_2_0_1 + 0.00577200577200553*G0_3_0_0 - 0.0236652236652232*G0_4_0_0 - 0.0256277056277051*G0_4_0_1 + 0.119595959595959*G0_5_0_0 + 0.00750360750360761*G0_5_0_1 - 0.112092352092351*G0_6_0_0 + 0.00750360750360748*G0_6_0_1 - 0.00196248196248193*G0_7_0_0 - 0.0256277056277052*G0_7_0_1 - 0.00577200577200596*G0_8_0_0 + 0.0256277056277054*G0_9_0_0 + 0.0512554112554108*G0_9_0_1; + A[43] = A[42] - 0.00750360750360752*G0_0_1_0 + 0.0200481000480999*G0_0_1_1 - 0.00750360750360741*G0_1_1_0 - 0.0275517075517075*G0_1_1_1 - 0.0256277056277055*G0_3_1_0 - 0.0236652236652237*G0_3_1_1 + 0.0057720057720051*G0_4_1_1 - 0.025627705627705*G0_5_1_0 - 0.00196248196248174*G0_5_1_1 - 0.00577200577200623*G0_6_1_1 + 0.00750360750360756*G0_7_1_0 + 0.119595959595959*G0_7_1_1 + 0.00750360750360744*G0_8_1_0 - 0.112092352092352*G0_8_1_1 + 0.0512554112554105*G0_9_1_0 + 0.0256277056277051*G0_9_1_1; + A[183] = -A[191] + 0.0841430174763504*G0_0_0_0 - 0.0205226871893535*G0_0_1_0 + 0.0236010902677565*G0_1_0_0 - 0.0664935064935061*G0_2_0_0 - 0.0552060285393616*G0_2_1_0 + 0.0960461760461755*G0_3_0_0 + 0.0738816738816738*G0_3_1_0 + 0.14037518037518*G0_4_0_0 + 0.123751803751803*G0_4_1_0 + 0.68525252525252*G0_5_0_0 - 0.0203174603174599*G0_5_1_0 + 0.12005772005772*G0_6_0_0 + 0.0960461760461758*G0_6_1_0 + 0.0849639249639245*G0_7_0_0 - 0.134834054834054*G0_7_1_0 - 0.336161616161615*G0_8_0_0 - 0.0738816738816732*G0_8_1_0 + 0.116363636363636*G0_9_0_0 + 0.0110822510822517*G0_9_1_0; + A[57] = A[183] - 0.0109796376463042*G0_0_0_1 + 0.0109796376463042*G0_0_1_0 - 0.0548981882315216*G0_1_0_1 + 0.0548981882315216*G0_1_1_0 - 0.0347859547859547*G0_2_0_1 + 0.0347859547859547*G0_2_1_0 + 0.0835786435786432*G0_3_0_1 - 0.0835786435786432*G0_3_1_0 + 0.0780375180375178*G0_4_0_1 - 0.0780375180375178*G0_4_1_0 - 0.0475613275613275*G0_5_0_1 + 0.0475613275613275*G0_5_1_0 + 0.0466378066378065*G0_6_0_1 - 0.0466378066378065*G0_6_1_0 + 0.00600288600288588*G0_7_0_1 - 0.00600288600288587*G0_7_1_0 - 0.088196248196248*G0_8_0_1 + 0.088196248196248*G0_8_1_0 + 0.0221645021645019*G0_9_0_1 - 0.0221645021645019*G0_9_1_0; + A[220] = A[164] + 0.00777296777296732*G0_0_0_1 - 0.00777296777296732*G0_0_1_0 - 0.0077729677729676*G0_1_0_1 + 0.0077729677729676*G0_1_1_0 + 0.0287445887445884*G0_3_0_1 - 0.0287445887445884*G0_3_1_0 - 0.0439826839826841*G0_4_0_1 + 0.043982683982684*G0_4_1_0 - 0.0287445887445887*G0_5_0_1 + 0.0287445887445887*G0_5_1_0 + 0.0439826839826847*G0_6_0_1 - 0.0439826839826847*G0_6_1_0 + 0.244155844155843*G0_7_0_1 - 0.244155844155843*G0_7_1_0 - 0.244155844155843*G0_8_0_1 + 0.244155844155843*G0_8_1_0; + A[197] = A[182] - 0.00750360750360752*G0_0_0_1 + 0.0200481000480999*G0_0_1_1 - 0.00750360750360741*G0_1_0_1 - 0.0275517075517075*G0_1_1_1 - 0.0256277056277055*G0_3_0_1 - 0.0236652236652237*G0_3_1_1 + 0.0057720057720051*G0_4_1_1 - 0.025627705627705*G0_5_0_1 - 0.00196248196248173*G0_5_1_1 - 0.00577200577200623*G0_6_1_1 + 0.00750360750360756*G0_7_0_1 + 0.119595959595959*G0_7_1_1 + 0.00750360750360744*G0_8_0_1 - 0.112092352092352*G0_8_1_1 + 0.0512554112554105*G0_9_0_1 + 0.0256277056277051*G0_9_1_1; + A[19] = -A[25] + 0.0321661054994388*G0_0_0_0 - 0.0124803591470258*G0_0_0_1 + 0.162129228795895*G0_1_0_0 + 0.0446464646464644*G0_2_0_0 + 0.0124803591470257*G0_2_0_1 + 0.0766955266955264*G0_3_0_0 + 0.102741702741702*G0_3_0_1 - 0.0163780663780665*G0_4_0_0 - 0.0582972582972579*G0_4_0_1 + 0.0581962481962477*G0_5_0_0 + 0.00242424242424243*G0_5_0_1 + 0.0557720057720054*G0_6_0_0 - 0.00242424242424249*G0_6_0_1 + 0.0419191919191916*G0_7_0_0 + 0.0582972582972581*G0_7_0_1 - 0.0260461760461755*G0_8_0_0 - 0.102741702741702*G0_8_0_1 + 0.0809523809523808*G0_9_0_0; + A[33] = -A[36] + 0.00909411576078238*G0_0_1_0 - 0.0387237453904119*G0_0_1_1 - 0.00909411576078238*G0_1_1_0 - 0.0478178611511945*G0_1_1_1 - 0.0815776815776814*G0_2_1_1 + 0.0646464646464643*G0_3_1_0 + 0.042308802308802*G0_3_1_1 - 0.0773448773448768*G0_4_1_0 - 0.0655122655122652*G0_4_1_1 - 0.0646464646464643*G0_5_1_0 - 0.0223376623376621*G0_5_1_1 + 0.0773448773448771*G0_6_1_0 + 0.0118326118326117*G0_6_1_1 - 0.0176623376623376*G0_7_1_0 - 0.0401154401154399*G0_7_1_1 + 0.0176623376623375*G0_8_1_0 - 0.0224531024531025*G0_8_1_1 - 0.0234343434343435*G0_9_1_1; + A[41] = -A[33] + 0.0103383036716369*G0_0_1_0 + 0.0233445566778901*G0_1_1_0 + 0.0931858265191593*G0_2_1_0 + 0.0267243867243868*G0_3_1_0 - 0.00375180375180379*G0_4_1_0 - 0.0394227994227993*G0_5_1_0 + 0.0839826839826835*G0_6_1_0 - 0.0152958152958153*G0_7_1_0 - 0.00998556998556994*G0_8_1_0 + 0.0340548340548339*G0_9_1_0; + A[62] = -A[107] - 0.0124803591470258*G0_0_0_1 + 0.0321661054994387*G0_0_1_1 + 0.0124803591470258*G0_1_0_1 + 0.0446464646464647*G0_1_1_1 + 0.162129228795895*G0_2_1_1 - 0.0582972582972581*G0_3_0_1 - 0.0163780663780661*G0_3_1_1 + 0.102741702741703*G0_4_0_1 + 0.0766955266955264*G0_4_1_1 + 0.0582972582972579*G0_5_0_1 + 0.0419191919191916*G0_5_1_1 - 0.102741702741702*G0_6_0_1 - 0.0260461760461758*G0_6_1_1 + 0.00242424242424227*G0_7_0_1 + 0.0581962481962477*G0_7_1_1 - 0.00242424242424243*G0_8_0_1 + 0.0557720057720057*G0_8_1_1 + 0.0809523809523807*G0_9_1_1; + A[44] = A[212] - 0.0124803591470258*G0_0_0_1 + 0.0124803591470258*G0_0_1_0 + 0.0124803591470258*G0_1_0_1 - 0.0124803591470258*G0_1_1_0 - 0.0582972582972582*G0_3_0_1 + 0.0582972582972582*G0_3_1_0 + 0.102741702741703*G0_4_0_1 - 0.102741702741703*G0_4_1_0 + 0.0582972582972578*G0_5_0_1 - 0.0582972582972578*G0_5_1_0 - 0.102741702741702*G0_6_0_1 + 0.102741702741702*G0_6_1_0 + 0.00242424242424227*G0_7_0_1 - 0.00242424242424227*G0_7_1_0 - 0.00242424242424244*G0_8_0_1 + 0.00242424242424244*G0_8_1_0; + A[141] = A[99] + 0.398140131473463*G0_0_0_1 - 0.398140131473463*G0_0_1_0 - 0.0120570787237454*G0_1_0_1 + 0.0120570787237454*G0_1_1_0 - 0.0120570787237453*G0_2_0_1 + 0.0120570787237453*G0_2_1_0 + 0.0161616161616158*G0_3_0_1 - 0.0161616161616158*G0_3_1_0 + 0.0161616161616158*G0_4_0_1 - 0.0161616161616158*G0_4_1_0 - 0.156998556998556*G0_5_0_1 + 0.156998556998556*G0_5_1_0 + 0.0369408369408367*G0_6_0_1 - 0.0369408369408367*G0_6_1_0 - 0.156998556998555*G0_7_0_1 + 0.156998556998555*G0_7_1_0 + 0.0369408369408364*G0_8_0_1 - 0.0369408369408365*G0_8_1_0 - 0.166233766233766*G0_9_0_1 + 0.166233766233766*G0_9_1_0; + A[172] = -A[52] + 0.030463363796697*G0_0_0_0 - 0.0411095077761746*G0_0_0_1 - 0.00641333974667261*G0_1_0_0 + 0.071572871572871*G0_2_0_0 + 0.0411095077761741*G0_2_0_1 + 0.0521789321789323*G0_3_0_0 + 0.0131601731601732*G0_3_0_1 - 0.0555266955266951*G0_4_0_0 - 0.0207792207792203*G0_4_0_1 - 0.108282828282827*G0_5_0_0 + 0.188051948051946*G0_5_0_1 - 0.296334776334775*G0_6_0_0 - 0.188051948051947*G0_6_0_1 - 0.0347474747474747*G0_7_0_0 + 0.02077922077922*G0_7_0_1 + 0.0390187590187587*G0_8_0_0 - 0.013160173160173*G0_8_0_1 + 0.0879653679653684*G0_9_0_0; + A[158] = A[172] - 0.0155459355459355*G0_0_0_0 + 0.0155459355459352*G0_0_1_1 - 0.0104280904280908*G0_1_0_0 - 0.0131473464806799*G0_1_0_1 - 0.0185986852653524*G0_1_1_0 - 0.00307840307840335*G0_1_1_1 + 0.00307840307840351*G0_2_0_0 + 0.0131473464806801*G0_2_0_1 + 0.0185986852653516*G0_2_1_0 + 0.0104280904280902*G0_2_1_1 - 0.0147763347763348*G0_3_0_0 - 0.00554112554112572*G0_3_0_1 - 0.00311688311688312*G0_3_1_0 - 0.0139682539682541*G0_3_1_1 + 0.0139682539682541*G0_4_0_0 + 0.00554112554112558*G0_4_0_1 + 0.00311688311688308*G0_4_1_0 + 0.0147763347763348*G0_4_1_1 + 0.0528715728715724*G0_5_0_0 - 0.093852813852813*G0_5_0_1 - 0.00542568542568522*G0_5_1_0 - 0.0039249639249642*G0_5_1_1 + 0.0885425685425681*G0_6_0_0 + 0.0329004329004328*G0_6_0_1 - 0.0352092352092352*G0_6_1_0 + 0.00473304473304528*G0_6_1_1 + 0.0039249639249642*G0_7_0_0 + 0.0938528138528137*G0_7_0_1 + 0.00542568542568556*G0_7_1_0 - 0.0528715728715726*G0_7_1_1 - 0.00473304473304504*G0_8_0_0 - 0.032900432900433*G0_8_0_1 + 0.0352092352092339*G0_8_1_0 - 0.0885425685425685*G0_8_1_1 - 0.0491774891774892*G0_9_0_0 + 0.049177489177489*G0_9_1_1; + A[155] = -A[158] - 0.0411095077761744*G0_0_0_1 + 0.0304633637966968*G0_0_1_1 + 0.041109507776175*G0_1_0_1 + 0.0715728715728719*G0_1_1_1 - 0.00641333974667305*G0_2_1_1 - 0.0207792207792209*G0_3_0_1 - 0.0555266955266955*G0_3_1_1 + 0.013160173160173*G0_4_0_1 + 0.0521789321789319*G0_4_1_1 + 0.0207792207792202*G0_5_0_1 - 0.0347474747474749*G0_5_1_1 - 0.0131601731601728*G0_6_0_1 + 0.0390187590187594*G0_6_1_1 + 0.188051948051947*G0_7_0_1 - 0.108282828282828*G0_7_1_1 - 0.188051948051947*G0_8_0_1 - 0.296334776334775*G0_8_1_1 + 0.087965367965368*G0_9_1_1; + A[85] = A[155] + 0.00124418791085447*G0_0_0_1 - 0.00124418791085447*G0_0_1_0 - 0.0398653198653202*G0_1_0_1 + 0.0398653198653202*G0_1_1_0 - 0.00420715087381733*G0_2_0_1 + 0.00420715087381733*G0_2_1_0 + 0.0257431457431456*G0_3_0_1 - 0.0257431457431456*G0_3_1_0 - 0.00577200577200524*G0_4_0_1 + 0.00577200577200524*G0_4_1_0 + 0.00496392496392485*G0_5_0_1 - 0.00496392496392484*G0_5_1_0 + 0.00738816738816775*G0_6_0_1 - 0.00738816738816776*G0_6_1_0 - 0.0738816738816731*G0_7_0_1 + 0.0738816738816731*G0_7_1_0 + 0.114170274170274*G0_8_0_1 - 0.114170274170274*G0_8_1_0 - 0.0297835497835493*G0_9_0_1 + 0.0297835497835493*G0_9_1_0; + A[130] = -A[85] - 0.0411095077761744*G0_0_1_0 + 0.0304633637966968*G0_0_1_1 + 0.0411095077761749*G0_1_1_0 + 0.0715728715728719*G0_1_1_1 - 0.00641333974667305*G0_2_1_1 - 0.0207792207792209*G0_3_1_0 - 0.0555266955266955*G0_3_1_1 + 0.013160173160173*G0_4_1_0 + 0.0521789321789319*G0_4_1_1 + 0.0207792207792202*G0_5_1_0 - 0.0347474747474749*G0_5_1_1 - 0.0131601731601728*G0_6_1_0 + 0.0390187590187594*G0_6_1_1 + 0.188051948051947*G0_7_1_0 - 0.108282828282828*G0_7_1_1 - 0.188051948051947*G0_8_1_0 - 0.296334776334775*G0_8_1_1 + 0.0879653679653681*G0_9_1_1; + A[105] = A[7] - 0.214381914381913*G0_0_0_1 + 0.214381914381913*G0_0_1_0 - 0.018385441718775*G0_1_0_1 + 0.018385441718775*G0_1_1_0 - 0.00590508257174907*G0_2_0_1 + 0.00590508257174907*G0_2_1_0 + 0.00784992784992779*G0_3_0_1 - 0.00784992784992779*G0_3_1_0 + 0.00542568542568558*G0_4_0_1 - 0.00542568542568557*G0_4_1_0 - 0.0778499278499276*G0_5_0_1 + 0.0778499278499276*G0_5_1_0 + 0.0236652236652236*G0_6_0_1 - 0.0236652236652236*G0_6_1_0 - 0.18059163059163*G0_7_0_1 + 0.18059163059163*G0_7_1_0 + 0.0819624819624817*G0_8_0_1 - 0.0819624819624817*G0_8_1_0 - 0.0471861471861472*G0_9_0_1 + 0.0471861471861472*G0_9_1_0; + A[10] = A[105] + 0.214381914381914*G0_0_0_0 - 0.214381914381913*G0_0_1_1 + 0.0328427128427128*G0_1_0_0 + 0.0269376302709635*G0_1_0_1 + 0.0144572711239378*G0_1_1_0 + 0.00855218855218852*G0_1_1_1 - 0.00855218855218851*G0_2_0_0 - 0.0269376302709636*G0_2_0_1 - 0.0144572711239377*G0_2_1_0 - 0.0328427128427128*G0_2_1_1 + 0.0850937950937945*G0_3_0_0 + 0.0905194805194799*G0_3_0_1 + 0.0929437229437222*G0_3_1_0 + 0.0983694083694076*G0_3_1_1 - 0.0983694083694079*G0_4_0_0 - 0.0905194805194801*G0_4_0_1 - 0.0929437229437224*G0_4_1_0 - 0.0850937950937946*G0_4_1_1 + 0.219841269841269*G0_5_0_0 + 0.0392496392496394*G0_5_0_1 + 0.141991341991341*G0_5_1_0 - 0.0386002886002883*G0_5_1_1 - 0.12041847041847*G0_6_0_0 - 0.0384559884559885*G0_6_0_1 - 0.0967532467532464*G0_6_1_0 - 0.014790764790765*G0_6_1_1 + 0.0386002886002888*G0_7_0_0 - 0.0392496392496388*G0_7_0_1 - 0.141991341991341*G0_7_1_0 - 0.219841269841269*G0_7_1_1 + 0.0147907647907644*G0_8_0_0 + 0.0384559884559881*G0_8_0_1 + 0.096753246753246*G0_8_1_0 + 0.12041847041847*G0_8_1_1 + 0.0471861471861473*G0_9_0_0 - 0.0471861471861473*G0_9_1_1; + A[150] = A[10] + 0.214381914381914*G0_0_0_1 - 0.214381914381914*G0_0_1_0 + 0.00590508257174918*G0_1_0_1 - 0.00590508257174918*G0_1_1_0 + 0.0183854417187749*G0_2_0_1 - 0.0183854417187749*G0_2_1_0 - 0.00542568542568549*G0_3_0_1 + 0.00542568542568547*G0_3_1_0 - 0.00784992784992785*G0_4_0_1 + 0.00784992784992785*G0_4_1_0 + 0.18059163059163*G0_5_0_1 - 0.18059163059163*G0_5_1_0 - 0.0819624819624815*G0_6_0_1 + 0.0819624819624815*G0_6_1_0 + 0.0778499278499276*G0_7_0_1 - 0.0778499278499276*G0_7_1_0 - 0.0236652236652238*G0_8_0_1 + 0.0236652236652238*G0_8_1_0 + 0.0471861471861472*G0_9_0_1 - 0.0471861471861472*G0_9_1_0; + A[173] = -0.00205226871893538*G0_0_0_0 + 0.0107744107744109*G0_0_0_1 + 0.00482283148949811*G0_0_1_0 - 0.00205226871893547*G0_0_1_1 + 0.0126727593394258*G0_1_0_0 + 0.00477152477152437*G0_1_0_1 + 0.0174442841109504*G0_1_1_0 + 0.00477152477152473*G0_2_0_1 + 0.0174442841109506*G0_2_1_0 + 0.0126727593394258*G0_2_1_1 - 0.00184704184704187*G0_3_0_0 + 0.0106204906204905*G0_3_1_0 + 0.0217027417027416*G0_3_1_1 + 0.0217027417027416*G0_4_0_0 + 0.0106204906204906*G0_4_1_0 - 0.00184704184704174*G0_4_1_1 + 0.000923520923520865*G0_5_0_0 - 0.00600288600288565*G0_5_0_1 - 0.0106204906204905*G0_5_1_0 + 0.00184704184704181*G0_5_1_1 - 0.0217027417027414*G0_6_0_0 + 0.0466378066378063*G0_6_0_1 + 0.0217027417027415*G0_6_1_0 - 0.0124675324675324*G0_6_1_1 + 0.00184704184704181*G0_7_0_0 - 0.00600288600288576*G0_7_0_1 - 0.0106204906204904*G0_7_1_0 + 0.000923520923520999*G0_7_1_1 - 0.0124675324675322*G0_8_0_0 + 0.0466378066378062*G0_8_0_1 + 0.0217027417027412*G0_8_1_0 - 0.021702741702742*G0_8_1_1 + 0.00092352092352103*G0_9_0_0 + 0.0184704184704183*G0_9_1_0 + 0.000923520923520826*G0_9_1_1; + A[170] = -A[173] - 0.00312970979637637*G0_0_0_1 - 0.016264229597563*G0_0_1_1 - 0.127086740420074*G0_1_0_1 - 0.201122334455668*G0_1_1_1 + 0.00205226871893527*G0_2_1_1 + 0.0230880230880228*G0_3_0_1 + 0.0678787878787875*G0_3_1_1 - 0.0249350649350648*G0_4_0_1 + 0.00184704184704205*G0_4_1_1 + 0.0138528138528143*G0_5_0_1 + 0.00323232323232313*G0_5_1_1 + 0.0249350649350646*G0_6_0_1 - 0.0249350649350647*G0_6_1_1 + 0.0327849927849931*G0_7_0_1 + 0.0692640692640691*G0_7_1_1 + 0.0974314574314565*G0_8_0_1 - 0.243347763347763*G0_8_1_1 - 0.0369408369408371*G0_9_0_1 + 0.00277056277056261*G0_9_1_1; + A[86] = A[170] + 0.00908128908128915*G0_0_0_1 - 0.00908128908128915*G0_0_1_0 + 0.114413981080648*G0_1_0_1 - 0.114413981080648*G0_1_1_0 - 0.0126727593394258*G0_2_0_1 + 0.0126727593394258*G0_2_1_0 - 0.0337085137085133*G0_3_0_1 + 0.0337085137085133*G0_3_1_0 + 0.0143145743145741*G0_4_0_1 - 0.0143145743145741*G0_4_1_0 - 0.00923520923520938*G0_5_0_1 + 0.00923520923520939*G0_5_1_0 - 0.0281673881673884*G0_7_0_1 + 0.0281673881673884*G0_7_1_0 - 0.0724963924963914*G0_8_0_1 + 0.0724963924963914*G0_8_1_0 + 0.0184704184704187*G0_9_0_1 - 0.0184704184704187*G0_9_1_0; + A[129] = -A[86] - 0.0106204906204906*G0_0_0_0 + 0.105281385281385*G0_0_1_0 - 0.0787045053711717*G0_0_1_1 - 0.0106204906204905*G0_1_0_0 - 0.010569183902517*G0_1_0_1 - 0.115901875901876*G0_1_1_0 - 0.194555074555074*G0_1_1_1 + 0.000974827641494223*G0_2_1_1 + 0.000923520923521159*G0_3_0_0 - 0.0221645021645019*G0_3_0_1 + 0.00230880230880232*G0_3_1_0 + 0.0161616161616162*G0_3_1_1 + 0.0327849927849927*G0_4_0_1 + 0.0184704184704183*G0_4_1_0 + 0.0563347763347762*G0_4_1_1 + 0.000923520923521031*G0_5_0_0 + 0.0230880230880229*G0_5_0_1 - 0.00138528138528107*G0_5_1_0 + 0.036940836940837*G0_5_1_1 - 0.0327849927849927*G0_6_0_1 - 0.0184704184704186*G0_6_1_0 + 0.00507936507936499*G0_6_1_1 + 0.0106204906204904*G0_7_0_0 + 0.0447907647907641*G0_7_0_1 + 0.000461760461760885*G0_7_1_0 - 0.169927849927849*G0_7_1_1 + 0.0106204906204905*G0_8_0_0 - 0.0341702741702735*G0_8_0_1 + 0.0101587301587298*G0_8_1_0 - 0.204559884559884*G0_8_1_1 - 0.001847041847042*G0_9_0_0 - 0.000923520923520816*G0_9_0_1 - 0.000923520923520958*G0_9_1_0 + 0.0581818181818181*G0_9_1_1; + A[51] = -A[173] - 0.0115953182619849*G0_0_0_0 + 0.0186756453423122*G0_0_0_1 + 0.0106204906204906*G0_0_1_1 + 0.00312970979637627*G0_1_0_0 - 0.0197017797017794*G0_2_0_0 - 0.00805515472182135*G0_2_0_1 + 0.0105691839025172*G0_2_1_0 + 0.0106204906204906*G0_2_1_1 - 0.104357864357864*G0_3_0_0 - 0.0683405483405479*G0_3_0_1 - 0.0327849927849929*G0_3_1_0 + 0.041096681096681*G0_4_0_0 + 0.00692640692640666*G0_4_0_1 + 0.0221645021645022*G0_4_1_0 - 0.000923520923520757*G0_4_1_1 - 0.101587301587301*G0_5_0_0 - 0.0651082251082241*G0_5_0_1 - 0.0447907647907646*G0_5_1_0 - 0.0106204906204906*G0_5_1_1 - 0.00230880230880199*G0_6_0_0 + 0.054487734487734*G0_6_0_1 + 0.0341702741702739*G0_6_1_0 - 0.0106204906204905*G0_6_1_1 + 0.0110822510822511*G0_7_0_0 - 0.00784992784992745*G0_7_0_1 - 0.0230880230880229*G0_7_1_0 - 0.000923520923520757*G0_7_1_1 - 0.00323232323232306*G0_8_0_0 + 0.0683405483405478*G0_8_0_1 + 0.0327849927849926*G0_8_1_0 - 0.0156998556998556*G0_9_0_0 + 0.000923520923520891*G0_9_0_1 + 0.000923520923520819*G0_9_1_0 + 0.0018470418470418*G0_9_1_1; + A[193] = -A[51] - 0.0840404040404038*G0_0_0_0 - 0.0382748116081445*G0_0_0_1 - 0.0484848484848486*G0_0_1_0 - 0.101228154561487*G0_0_1_1 - 0.0840404040404039*G0_1_0_0 - 0.0355555555555554*G0_1_0_1 - 0.045765592432259*G0_1_1_0 - 0.0985088985088979*G0_1_1_1 - 0.0448420715087378*G0_2_0_1 + 0.044842071508738*G0_2_1_0 + 0.0182651915985249*G0_2_1_1 - 0.939220779220774*G0_3_0_0 - 1.00479076479076*G0_3_0_1 - 0.780375180375176*G0_3_1_0 - 0.847330447330442*G0_3_1_1 - 0.152380952380951*G0_4_0_0 - 0.0651082251082249*G0_4_0_1 - 0.226724386724385*G0_4_1_0 - 0.159769119769119*G0_4_1_1 - 0.939220779220774*G0_5_0_0 - 0.158845598845598*G0_5_0_1 + 0.065569985569985*G0_5_1_0 - 0.00138528138528136*G0_5_1_1 - 0.152380952380953*G0_6_0_0 + 0.0743434343434339*G0_6_0_1 - 0.0872727272727267*G0_6_1_0 - 0.0203174603174602*G0_6_1_1 - 0.0683405483405479*G0_7_0_0 - 0.0683405483405479*G0_7_0_1 + 0.24242424242424*G0_7_1_0 + 0.369408369408367*G0_7_1_1 - 0.0683405483405478*G0_8_0_0 - 0.31076479076479*G0_8_0_1 + 0.126984126984127*G0_8_1_1 - 1.77870129870129*G0_9_0_0 - 0.4811544011544*G0_9_0_1 - 1.29754689754689*G0_9_1_0 - 0.0988167388167392*G0_9_1_1; + A[192] = A[193] + 0.323848003848002*G0_0_0_0 + 0.197017797017796*G0_0_0_1 + 0.194555074555074*G0_0_1_0 + 0.363251563251562*G0_0_1_1 + 0.148994708994709*G0_1_0_0 + 0.0504858104858104*G0_1_0_1 + 0.0480230880230882*G0_1_1_0 + 0.177316017316017*G0_1_1_1 + 0.0591053391053388*G0_2_0_0 + 0.0517171717171715*G0_2_0_1 - 0.0320153920153916*G0_2_1_0 + 0.054179894179894*G0_2_1_1 + 1.28554112554112*G0_3_0_0 + 1.44069264069263*G0_3_0_1 + 1.24121212121211*G0_3_1_0 + 1.27445887445887*G0_3_1_1 + 0.620606060606057*G0_4_0_0 + 0.576277056277054*G0_4_0_1 + 0.742510822510819*G0_4_1_0 + 0.609523809523807*G0_4_1_1 + 2.70406926406925*G0_5_0_0 + 0.0664935064935064*G0_5_0_1 - 0.132987012987013*G0_5_1_0 + 0.299220779220777*G0_5_1_1 + 0.177316017316019*G0_6_0_0 + 0.166233766233766*G0_6_1_0 + 0.387878787878786*G0_7_0_0 + 0.033246753246753*G0_7_0_1 - 0.288138528138526*G0_7_1_0 + 1.49610389610389*G0_7_1_1 + 0.0554112554112546*G0_8_0_0 + 0.398961038961037*G0_8_0_1 + 0.0775757575757573*G0_8_1_0 - 0.0997402597402606*G0_8_1_1 + 3.98961038961038*G0_9_0_0 + 2.06129870129869*G0_9_0_1 + 2.85922077922077*G0_9_1_0 + 2.32727272727272*G0_9_1_1; + A[208] = -A[193] + 0.00861952861952895*G0_0_0_1 + 0.0110822510822509*G0_0_1_0 + 0.174853294853294*G0_1_0_0 + 0.0677248677248673*G0_1_0_1 + 0.0701875901875895*G0_1_1_0 + 0.0985088985088975*G0_1_1_1 + 0.0985088985088978*G0_2_0_0 + 0.0270899470899469*G0_2_0_1 + 0.11082251082251*G0_2_1_0 + 0.134218374218373*G0_2_1_1 + 1.03064935064934*G0_3_0_0 + 0.964155844155839*G0_3_0_1 + 1.16363636363636*G0_3_1_0 + 1.41852813852813*G0_3_1_1 - 0.166233766233765*G0_4_0_0 - 0.132987012987012*G0_4_0_1 - 0.299220779220777*G0_4_1_0 - 0.310303030303028*G0_4_1_1 - 0.387878787878786*G0_5_0_0 - 0.155151515151515*G0_5_0_1 + 0.0443290043290043*G0_5_1_0 - 0.0997402597402591*G0_5_1_1 + 0.277056277056276*G0_6_0_0 + 0.0110822510822515*G0_6_0_1 - 0.155151515151514*G0_6_1_0 - 0.132987012987012*G0_6_1_1 - 0.0997402597402594*G0_7_0_0 - 0.155151515151515*G0_7_0_1 + 0.166233766233764*G0_7_1_0 + 0.22164502164502*G0_7_1_1 + 0.232727272727272*G0_8_0_0 + 0.0110822510822509*G0_8_0_1 + 0.332467532467531*G0_8_1_0 + 2.34943722943722*G0_8_1_1 + 0.465454545454544*G0_9_0_0 + 0.166233766233766*G0_9_0_1 - 0.631688311688309*G0_9_1_0 + 1.19688311688311*G0_9_1_1; + A[50] = -A[170] + 0.0162642295975629*G0_0_0_0 - 0.0348372615039282*G0_0_0_1 - 0.0020522687189353*G0_1_0_0 - 0.127240660573994*G0_1_0_1 + 0.201122334455667*G0_2_0_0 - 0.000153920153920282*G0_2_0_1 - 0.00184704184704143*G0_3_0_0 - 0.12005772005772*G0_3_0_1 - 0.0678787878787879*G0_4_0_0 - 0.168080808080807*G0_4_0_1 - 0.0692640692640688*G0_5_0_0 + 0.0715728715728717*G0_5_0_1 + 0.243347763347762*G0_6_0_0 - 0.0447907647907649*G0_6_0_1 - 0.00323232323232314*G0_7_0_0 + 0.0905050505050506*G0_7_0_1 + 0.0249350649350646*G0_8_0_0 + 0.0277056277056269*G0_8_0_1 - 0.00277056277056297*G0_9_0_0 - 0.236421356421356*G0_9_0_1; + A[222] = A[193] - 0.0394035594035593*G0_0_0_0 + 0.0394035594035583*G0_0_1_1 + 0.0948148148148145*G0_1_0_0 - 0.0012313612313615*G0_1_0_1 + 0.0800384800384798*G0_1_1_0 + 0.118210678210677*G0_1_1_1 - 0.118210678210678*G0_2_0_0 + 0.00123136123136062*G0_2_0_1 - 0.0800384800384799*G0_2_1_0 - 0.0948148148148146*G0_2_1_1 + 0.676017316017312*G0_3_0_0 + 0.864415584415579*G0_3_0_1 + 0.498701298701296*G0_3_1_0 + 0.653852813852811*G0_3_1_1 - 0.653852813852812*G0_4_0_0 - 0.864415584415582*G0_4_0_1 - 0.498701298701297*G0_4_1_0 - 0.676017316017313*G0_4_1_1 + 1.20796536796536*G0_5_0_0 + 0.0332467532467541*G0_5_0_1 + 0.155151515151516*G0_5_1_0 - 0.0886580086580076*G0_5_1_1 + 0.277056277056278*G0_6_0_0 - 0.398961038961038*G0_6_0_1 + 0.0886580086580075*G0_6_1_0 - 0.0554112554112558*G0_6_1_1 + 0.0886580086580084*G0_7_0_0 - 0.0332467532467545*G0_7_0_1 - 0.155151515151513*G0_7_1_0 - 1.20796536796536*G0_7_1_1 + 0.055411255411255*G0_8_0_0 + 0.398961038961038*G0_8_0_1 - 0.0886580086580083*G0_8_1_0 - 0.277056277056276*G0_8_1_1 + 1.66233766233766*G0_9_0_0 - 1.66233766233766*G0_9_1_1; + A[143] = A[129] + 0.114413981080647*G0_0_0_1 - 0.114413981080647*G0_0_1_0 + 0.00908128908128899*G0_1_0_1 - 0.00908128908128899*G0_1_1_0 - 0.012672759339426*G0_2_0_1 + 0.0126727593394259*G0_2_1_0 - 0.00923520923520906*G0_3_0_1 + 0.00923520923520906*G0_3_1_0 - 0.0337085137085134*G0_5_0_1 + 0.0337085137085134*G0_5_1_0 + 0.0143145743145743*G0_6_0_1 - 0.0143145743145743*G0_6_1_0 - 0.0724963924963916*G0_7_0_1 + 0.0724963924963916*G0_7_1_0 - 0.0281673881673881*G0_8_0_1 + 0.0281673881673881*G0_8_1_0 + 0.0184704184704186*G0_9_0_1 - 0.0184704184704186*G0_9_1_0; + A[207] = A[193] + 0.00246272246272195*G0_0_0_1 - 0.00246272246272194*G0_0_1_0 + 0.00246272246272223*G0_1_0_1 - 0.00246272246272221*G0_1_1_0 + 0.0837325637325631*G0_2_0_1 - 0.0837325637325631*G0_2_1_0 + 0.199480519480518*G0_3_0_1 - 0.199480519480518*G0_3_1_0 - 0.166233766233765*G0_4_0_1 + 0.166233766233765*G0_4_1_0 + 0.199480519480519*G0_5_0_1 - 0.199480519480519*G0_5_1_0 - 0.166233766233765*G0_6_0_1 + 0.166233766233765*G0_6_1_0 + 0.321385281385279*G0_7_0_1 - 0.321385281385279*G0_7_1_0 + 0.32138528138528*G0_8_0_1 - 0.32138528138528*G0_8_1_0 - 0.797922077922075*G0_9_0_1 + 0.797922077922075*G0_9_1_0; + A[194] = A[222] + 0.00246272246272274*G0_0_0_1 - 0.00246272246272274*G0_0_1_0 + 0.0837325637325635*G0_1_0_1 - 0.0837325637325635*G0_1_1_0 + 0.0024627224627226*G0_2_0_1 - 0.00246272246272259*G0_2_1_0 - 0.166233766233765*G0_3_0_1 + 0.166233766233765*G0_3_1_0 + 0.19948051948052*G0_4_0_1 - 0.19948051948052*G0_4_1_0 + 0.32138528138528*G0_5_0_1 - 0.32138528138528*G0_5_1_0 + 0.32138528138528*G0_6_0_1 - 0.32138528138528*G0_6_1_0 + 0.19948051948052*G0_7_0_1 - 0.19948051948052*G0_7_1_0 - 0.166233766233766*G0_8_0_1 + 0.166233766233766*G0_8_1_0 - 0.797922077922074*G0_9_0_1 + 0.797922077922074*G0_9_1_0; + A[78] = -A[86] + 0.0162642295975629*G0_0_0_0 - 0.0348372615039282*G0_0_1_0 - 0.0020522687189353*G0_1_0_0 - 0.127240660573994*G0_1_1_0 + 0.201122334455667*G0_2_0_0 - 0.000153920153920281*G0_2_1_0 - 0.00184704184704144*G0_3_0_0 - 0.12005772005772*G0_3_1_0 - 0.0678787878787879*G0_4_0_0 - 0.168080808080807*G0_4_1_0 - 0.0692640692640688*G0_5_0_0 + 0.0715728715728717*G0_5_1_0 + 0.243347763347762*G0_6_0_0 - 0.0447907647907648*G0_6_1_0 - 0.00323232323232314*G0_7_0_0 + 0.0905050505050505*G0_7_1_0 + 0.0249350649350646*G0_8_0_0 + 0.0277056277056268*G0_8_1_0 - 0.00277056277056297*G0_9_0_0 - 0.236421356421356*G0_9_1_0; + A[138] = -A[78] + 0.0258072791406125*G0_0_0_0 + 0.0116466249799583*G0_0_0_1 - 0.0267821067821069*G0_0_1_0 + 0.00359147025813684*G0_0_1_1 - 0.0538720538720536*G0_1_0_0 - 0.166233766233766*G0_1_0_1 - 0.0646464646464643*G0_1_1_0 + 0.20768959435626*G0_2_0_0 + 0.00805515472182095*G0_2_0_1 + 0.00430976430976431*G0_2_1_0 - 0.00359147025813696*G0_2_1_1 - 0.24196248196248*G0_3_0_0 - 0.189321789321788*G0_3_0_1 - 0.415584415584414*G0_3_1_0 - 0.267821067821066*G0_3_1_1 - 0.0290909090909094*G0_4_0_0 + 0.0683405483405477*G0_4_0_1 - 0.113593073593073*G0_4_1_0 + 0.0646464646464638*G0_4_1_1 - 0.0156998556998556*G0_5_0_0 - 0.0013852813852811*G0_5_0_1 + 0.060952380952381*G0_5_1_0 - 0.0138528138528137*G0_5_1_1 + 0.19163059163059*G0_6_0_0 + 0.0124675324675321*G0_6_0_1 - 0.0415584415584415*G0_6_1_0 + 0.0138528138528137*G0_6_1_1 + 0.0161616161616163*G0_7_0_0 + 0.00369408369408409*G0_7_0_1 + 0.0803463203463203*G0_7_1_0 - 0.0646464646464644*G0_7_1_1 + 0.0480230880230877*G0_8_0_0 + 0.0784992784992775*G0_8_0_1 + 0.267821067821067*G0_8_1_1 + 0.0544877344877341*G0_9_0_0 + 0.0387878787878784*G0_9_0_1 - 0.160692640692641*G0_9_1_0; + A[144] = -A[138] + 0.539028379028378*G0_0_0_0 - 0.10399871733205*G0_0_0_1 - 0.116671476671476*G0_0_1_0 + 0.118672438672438*G0_0_1_1 + 0.029603976270643*G0_1_0_0 - 0.117287157287157*G0_1_0_1 - 0.00287317620650926*G0_1_1_0 - 0.0829116562449891*G0_1_1_1 + 0.0712137245470576*G0_2_0_0 + 0.0154946288279621*G0_2_0_1 + 0.0245759179092512*G0_2_1_0 + 0.0504345037678369*G0_2_1_1 - 0.0591053391053387*G0_3_0_0 - 0.00923520923520943*G0_3_0_1 - 0.0817316017316014*G0_3_1_0 - 0.0470995670995669*G0_3_1_1 - 0.0355555555555558*G0_4_0_0 + 0.00507936507936509*G0_4_0_1 - 0.0230880230880231*G0_4_1_0 - 0.012005772005772*G0_4_1_1 + 0.523636363636361*G0_5_0_0 + 0.296911976911975*G0_5_1_1 - 0.252582972582971*G0_6_0_0 - 0.0447907647907645*G0_6_0_1 - 0.0540259740259736*G0_6_1_0 - 0.193477633477632*G0_6_1_1 + 0.470072150072148*G0_7_0_0 + 0.305223665223664*G0_7_0_1 + 0.319538239538238*G0_7_1_0 + 0.931832611832607*G0_7_1_1 + 0.0346320346320342*G0_8_0_0 + 0.178239538239537*G0_8_0_1 + 0.144531024531024*G0_8_1_0 - 0.0563347763347763*G0_8_1_1 + 0.372178932178931*G0_9_0_0 + 0.313073593073592*G0_9_0_1 + 0.33154401154401*G0_9_1_0 + 0.483924963924962*G0_9_1_1; + A[146] = -A[138] + 0.201276254609588*G0_0_0_0 + 0.00015392015392003*G0_0_1_0 + 0.125188391855058*G0_1_0_0 + 0.127240660573993*G0_1_1_0 + 0.051101491101491*G0_2_0_0 + 0.0348372615039281*G0_2_1_0 - 0.00277056277056262*G0_3_0_0 - 0.0277056277056279*G0_3_1_0 - 0.0937373737373735*G0_4_0_0 - 0.0905050505050501*G0_4_1_0 + 0.288138528138526*G0_5_0_0 + 0.0447907647907647*G0_5_1_0 - 0.14083694083694*G0_6_0_0 - 0.0715728715728711*G0_6_1_0 + 0.10020202020202*G0_7_0_0 + 0.168080808080807*G0_7_1_0 + 0.118210678210678*G0_8_0_0 + 0.120057720057719*G0_8_1_0 + 0.233650793650793*G0_9_0_0 + 0.236421356421356*G0_9_1_0; + A[126] = A[146] - 0.179060445727112*G0_0_0_0 + 0.179060445727112*G0_0_1_1 - 0.175468975468975*G0_1_0_0 - 0.174288920955587*G0_1_0_1 - 0.161359628026294*G0_1_1_0 - 0.156588103254769*G0_1_1_1 + 0.156588103254768*G0_2_0_0 + 0.174288920955587*G0_2_0_1 + 0.161359628026293*G0_2_1_0 + 0.175468975468975*G0_2_1_1 - 0.303838383838382*G0_3_0_0 - 0.257662337662336*G0_3_0_1 - 0.364790764790762*G0_3_1_0 - 0.33246753246753*G0_3_1_1 + 0.33246753246753*G0_4_0_0 + 0.257662337662336*G0_4_0_1 + 0.364790764790763*G0_4_1_0 + 0.303838383838382*G0_4_1_1 - 0.239191919191918*G0_5_0_0 - 0.00507936507936483*G0_5_0_1 + 0.103896103896103*G0_5_1_0 + 0.0701875901875897*G0_5_1_1 + 0.0646464646464637*G0_6_0_0 - 0.0660317460317459*G0_6_0_1 + 0.150072150072149*G0_6_1_0 + 0.084040404040404*G0_6_1_1 - 0.0701875901875899*G0_7_0_0 + 0.00507936507936545*G0_7_0_1 - 0.103896103896103*G0_7_1_0 + 0.239191919191918*G0_7_1_1 - 0.0840404040404037*G0_8_0_0 + 0.0660317460317454*G0_8_0_1 - 0.150072150072149*G0_8_1_0 - 0.0646464646464645*G0_8_1_1 - 0.179163059163059*G0_9_0_0 + 0.179163059163059*G0_9_1_1; + A[54] = A[138] - 0.0126727593394261*G0_0_0_1 + 0.0126727593394261*G0_0_1_0 + 0.114413981080648*G0_1_0_1 - 0.114413981080648*G0_1_1_0 + 0.00908128908128913*G0_2_0_1 - 0.00908128908128913*G0_2_1_0 - 0.0724963924963919*G0_3_0_1 + 0.072496392496392*G0_3_1_0 - 0.0281673881673882*G0_4_0_1 + 0.0281673881673882*G0_4_1_0 - 0.0092352092352091*G0_6_0_1 + 0.00923520923520909*G0_6_1_0 + 0.0143145743145741*G0_7_0_1 - 0.0143145743145741*G0_7_1_0 - 0.0337085137085133*G0_8_0_1 + 0.0337085137085134*G0_8_1_0 + 0.0184704184704184*G0_9_0_1 - 0.0184704184704184*G0_9_1_0; + A[174] = -A[54] + 0.201276254609588*G0_0_0_0 + 0.000153920153920023*G0_0_0_1 + 0.125188391855058*G0_1_0_0 + 0.127240660573993*G0_1_0_1 + 0.0511014911014909*G0_2_0_0 + 0.0348372615039281*G0_2_0_1 - 0.00277056277056262*G0_3_0_0 - 0.0277056277056279*G0_3_0_1 - 0.0937373737373735*G0_4_0_0 - 0.0905050505050501*G0_4_0_1 + 0.288138528138526*G0_5_0_0 + 0.0447907647907647*G0_5_0_1 - 0.14083694083694*G0_6_0_0 - 0.0715728715728712*G0_6_0_1 + 0.10020202020202*G0_7_0_0 + 0.168080808080807*G0_7_0_1 + 0.118210678210678*G0_8_0_0 + 0.120057720057719*G0_8_0_1 + 0.233650793650793*G0_9_0_0 + 0.236421356421356*G0_9_0_1; + A[98] = A[126] + 0.0128266794933462*G0_0_0_1 - 0.0128266794933462*G0_0_1_0 + 0.025755972422639*G0_1_0_1 - 0.025755972422639*G0_1_1_0 + 0.0128266794933458*G0_2_0_1 - 0.0128266794933457*G0_2_1_0 - 0.0623376623376619*G0_3_0_1 + 0.0623376623376619*G0_3_1_0 + 0.0447907647907645*G0_4_0_1 - 0.0447907647907645*G0_4_1_0 + 0.153766233766233*G0_5_0_1 - 0.153766233766233*G0_5_1_0 + 0.153766233766233*G0_6_0_1 - 0.153766233766233*G0_6_1_0 + 0.0447907647907649*G0_7_0_1 - 0.0447907647907649*G0_7_1_0 - 0.0623376623376622*G0_8_0_1 + 0.0623376623376622*G0_8_1_0 + 0.217950937950937*G0_9_0_1 - 0.217950937950937*G0_9_1_0; + A[95] = -A[98] + 0.000153920153920376*G0_0_0_1 + 0.201276254609587*G0_0_1_1 + 0.0348372615039282*G0_1_0_1 + 0.051101491101491*G0_1_1_1 + 0.127240660573993*G0_2_0_1 + 0.125188391855058*G0_2_1_1 - 0.0905050505050497*G0_3_0_1 - 0.0937373737373732*G0_3_1_1 - 0.0277056277056277*G0_4_0_1 - 0.00277056277056226*G0_4_1_1 + 0.168080808080807*G0_5_0_1 + 0.100202020202019*G0_5_1_1 + 0.12005772005772*G0_6_0_1 + 0.118210678210678*G0_6_1_1 + 0.0447907647907651*G0_7_0_1 + 0.288138528138527*G0_7_1_1 - 0.0715728715728711*G0_8_0_1 - 0.14083694083694*G0_8_1_1 + 0.236421356421356*G0_9_0_1 + 0.233650793650793*G0_9_1_1; + A[118] = A[202] + 0.00777296777296755*G0_0_0_1 - 0.00777296777296755*G0_0_1_0 - 0.007772967772968*G0_2_0_1 + 0.007772967772968*G0_2_1_0 - 0.0439826839826843*G0_3_0_1 + 0.0439826839826843*G0_3_1_0 + 0.0287445887445887*G0_4_0_1 - 0.0287445887445887*G0_4_1_0 + 0.244155844155843*G0_5_0_1 - 0.244155844155843*G0_5_1_0 - 0.244155844155843*G0_6_0_1 + 0.244155844155843*G0_6_1_0 - 0.0287445887445889*G0_7_0_1 + 0.0287445887445889*G0_7_1_0 + 0.043982683982683*G0_8_0_1 - 0.043982683982683*G0_8_1_0; + A[200] = A[88] + 0.0204200737534071*G0_0_0_1 - 0.0204200737534071*G0_0_1_0 + 0.00954304954304951*G0_1_0_1 - 0.0095430495430495*G0_1_1_0 - 0.0548981882315205*G0_2_0_1 + 0.0548981882315205*G0_2_1_0 + 0.140836940836941*G0_3_0_1 - 0.140836940836941*G0_3_1_0 - 0.0143145743145735*G0_4_0_1 + 0.0143145743145735*G0_4_1_0 - 0.0457142857142862*G0_5_0_1 + 0.0457142857142862*G0_5_1_0 + 0.00969696969697045*G0_6_0_1 - 0.00969696969697045*G0_6_1_0 - 0.0494083694083696*G0_7_0_1 + 0.0494083694083696*G0_7_1_0 - 0.0272438672438663*G0_8_0_1 + 0.0272438672438662*G0_8_1_0 + 0.0110822510822516*G0_9_0_1 - 0.0110822510822516*G0_9_1_0; + A[22] = A[21] - 0.0186644219977553*G0_0_0_0 + 0.02993265993266*G0_0_0_1 + 0.00396825396825358*G0_1_0_0 - 0.0151451018117684*G0_2_0_0 - 0.00753727753727751*G0_2_0_1 + 0.00115440115440115*G0_3_0_0 + 0.00598845598845584*G0_4_0_0 + 0.00316017316017299*G0_4_0_1 - 0.0428860028860025*G0_5_0_0 - 0.0515295815295809*G0_5_0_1 + 0.0608225108225106*G0_6_0_0 + 0.029134199134199*G0_6_0_1 + 0.0132178932178933*G0_7_0_0 - 0.00477633477633444*G0_7_0_1 - 0.00115440115440147*G0_8_0_0 - 0.00730158730158734*G0_9_0_0 + 0.00161616161616165*G0_9_0_1; + A[60] = A[22] + 0.00361071027737679*G0_0_0_0 - 0.0095206028539364*G0_0_0_1 - 0.00183581850248547*G0_0_1_0 - 0.00183581850248555*G0_0_1_1 - 0.00361071027737661*G0_1_0_0 - 0.00544652877986184*G0_1_0_1 - 0.0131313131313132*G0_1_1_0 - 0.0131313131313132*G0_1_1_1 - 0.00544652877986218*G0_2_0_1 - 0.00544652877986214*G0_2_1_0 - 0.00544652877986215*G0_2_1_1 + 0.0286868686868684*G0_3_0_0 + 0.0246464646464644*G0_3_0_1 + 0.0536075036075031*G0_3_1_0 + 0.053607503607503*G0_3_1_1 + 0.0430591630591627*G0_4_0_0 + 0.0488888888888884*G0_4_0_1 + 0.0194516594516594*G0_4_1_0 + 0.0194516594516594*G0_4_1_1 - 0.0286868686868685*G0_5_0_0 + 0.0249206349206346*G0_5_0_1 - 0.00404040404040413*G0_5_1_0 - 0.00404040404040415*G0_5_1_1 - 0.0430591630591629*G0_6_0_0 - 0.0236075036075036*G0_6_0_1 + 0.00582972582972578*G0_6_1_0 + 0.00582972582972583*G0_6_1_1 - 0.00987012987013006*G0_7_0_0 + 0.000678210678210352*G0_7_0_1 - 0.00923520923520934*G0_7_1_0 - 0.0092352092352094*G0_7_1_1 + 0.0098701298701301*G0_8_0_0 + 0.000634920634920886*G0_8_0_1 + 0.0105483405483405*G0_8_1_0 + 0.0105483405483405*G0_8_1_1 - 0.0134199134199135*G0_9_0_1 - 0.0134199134199135*G0_9_1_0 - 0.0134199134199135*G0_9_1_1; + A[4] = A[60] - 0.0076847843514511*G0_1_0_1 + 0.0076847843514511*G0_1_1_0 + 0.00768478435145108*G0_2_0_1 - 0.00768478435145108*G0_2_1_0 + 0.0341558441558439*G0_3_0_1 - 0.0341558441558439*G0_3_1_0 - 0.0341558441558436*G0_4_0_1 + 0.0341558441558436*G0_4_1_0 + 0.00519480519480504*G0_5_0_1 - 0.00519480519480504*G0_5_1_0 - 0.00471861471861453*G0_6_0_1 + 0.00471861471861453*G0_6_1_0 - 0.0051948051948052*G0_7_0_1 + 0.0051948051948052*G0_7_1_0 + 0.00471861471861467*G0_8_0_1 - 0.00471861471861467*G0_8_1_0; + A[106] = A[22] - 0.00768478435145107*G0_0_0_1 + 0.00768478435145107*G0_0_1_0 + 0.00768478435145105*G0_2_0_1 - 0.00768478435145105*G0_2_1_0 + 0.00519480519480517*G0_3_0_1 - 0.00519480519480517*G0_3_1_0 - 0.00471861471861457*G0_4_0_1 + 0.00471861471861458*G0_4_1_0 + 0.0341558441558437*G0_5_0_1 - 0.0341558441558437*G0_5_1_0 - 0.0341558441558439*G0_6_0_1 + 0.0341558441558439*G0_6_1_0 + 0.00471861471861449*G0_7_0_1 - 0.00471861471861449*G0_7_1_0 - 0.00519480519480494*G0_8_0_1 + 0.00519480519480494*G0_8_1_0; + A[91] = A[106] + 0.0186644219977553*G0_0_0_0 - 0.02993265993266*G0_0_1_0 - 0.00396825396825358*G0_1_0_0 + 0.0151451018117684*G0_2_0_0 + 0.00753727753727751*G0_2_1_0 - 0.00115440115440115*G0_3_0_0 - 0.00598845598845584*G0_4_0_0 - 0.00316017316017299*G0_4_1_0 + 0.0428860028860025*G0_5_0_0 + 0.0515295815295809*G0_5_1_0 - 0.0608225108225106*G0_6_0_0 - 0.029134199134199*G0_6_1_0 - 0.0132178932178933*G0_7_0_0 + 0.00477633477633443*G0_7_1_0 + 0.00115440115440147*G0_8_0_0 + 0.00730158730158733*G0_9_0_0 - 0.00161616161616164*G0_9_1_0; + A[9] = A[135] + 0.38524931858265*G0_0_0_1 - 0.38524931858265*G0_0_1_0 + 0.0276735610068942*G0_1_0_1 - 0.0276735610068942*G0_1_1_0 + 0.0276735610068942*G0_2_0_1 - 0.0276735610068942*G0_2_1_0 - 0.0086580086580087*G0_3_0_1 + 0.0086580086580087*G0_3_1_0 - 0.00865800865800874*G0_4_0_1 + 0.00865800865800874*G0_4_1_0 + 0.275036075036074*G0_5_0_1 - 0.275036075036074*G0_5_1_0 - 0.124098124098123*G0_6_0_1 + 0.124098124098123*G0_6_1_0 + 0.275036075036074*G0_7_0_1 - 0.275036075036074*G0_7_1_0 - 0.124098124098124*G0_8_0_1 + 0.124098124098124*G0_8_1_0 + 0.0536796536796538*G0_9_0_1 - 0.0536796536796538*G0_9_1_0; + A[90] = A[9] + 0.38524931858265*G0_0_0_0 - 0.38524931858265*G0_0_1_1 + 0.0323360590027255*G0_1_0_0 + 0.00466249799583127*G0_1_0_1 + 0.00466249799583131*G0_1_1_0 - 0.0230110630110629*G0_1_1_1 + 0.0230110630110629*G0_2_0_0 - 0.00466249799583136*G0_2_0_1 - 0.00466249799583131*G0_2_1_0 - 0.0323360590027255*G0_2_1_1 + 0.031226551226551*G0_3_0_0 + 0.0398845598845596*G0_3_0_1 + 0.0398845598845596*G0_3_1_0 + 0.0485425685425682*G0_3_1_1 - 0.0485425685425683*G0_4_0_0 - 0.0398845598845596*G0_4_0_1 - 0.0398845598845596*G0_4_1_0 - 0.0312265512265509*G0_4_1_1 + 0.35238095238095*G0_5_0_0 + 0.0773448773448767*G0_5_0_1 + 0.077344877344877*G0_5_1_0 - 0.197691197691197*G0_5_1_1 - 0.172871572871572*G0_6_0_0 - 0.0487734487734486*G0_6_0_1 - 0.0487734487734486*G0_6_1_0 + 0.0753246753246748*G0_6_1_1 + 0.197691197691197*G0_7_0_0 - 0.0773448773448771*G0_7_0_1 - 0.0773448773448769*G0_7_1_0 - 0.352380952380951*G0_7_1_1 - 0.0753246753246751*G0_8_0_0 + 0.0487734487734486*G0_8_0_1 + 0.0487734487734484*G0_8_1_0 + 0.172871572871572*G0_8_1_1 + 0.0536796536796538*G0_9_0_0 - 0.0536796536796538*G0_9_1_1; + A[6] = A[90] - 0.38524931858265*G0_0_0_1 + 0.38524931858265*G0_0_1_0 - 0.0276735610068942*G0_1_0_1 + 0.0276735610068942*G0_1_1_0 - 0.0276735610068941*G0_2_0_1 + 0.0276735610068942*G0_2_1_0 + 0.00865800865800863*G0_3_0_1 - 0.00865800865800863*G0_3_1_0 + 0.00865800865800875*G0_4_0_1 - 0.00865800865800875*G0_4_1_0 - 0.275036075036073*G0_5_0_1 + 0.275036075036073*G0_5_1_0 + 0.124098124098123*G0_6_0_1 - 0.124098124098123*G0_6_1_0 - 0.275036075036074*G0_7_0_1 + 0.275036075036074*G0_7_1_0 + 0.124098124098124*G0_8_0_1 - 0.124098124098124*G0_8_1_0 - 0.0536796536796537*G0_9_0_1 + 0.0536796536796537*G0_9_1_0; + A[34] = -A[37] - 0.0124803591470258*G0_0_1_0 + 0.0321661054994387*G0_0_1_1 + 0.0124803591470258*G0_1_1_0 + 0.0446464646464647*G0_1_1_1 + 0.162129228795895*G0_2_1_1 - 0.058297258297258*G0_3_1_0 - 0.0163780663780661*G0_3_1_1 + 0.102741702741703*G0_4_1_0 + 0.0766955266955264*G0_4_1_1 + 0.0582972582972579*G0_5_1_0 + 0.0419191919191916*G0_5_1_1 - 0.102741702741702*G0_6_1_0 - 0.0260461760461758*G0_6_1_1 + 0.00242424242424227*G0_7_1_0 + 0.0581962481962477*G0_7_1_1 - 0.00242424242424243*G0_8_1_0 + 0.0557720057720057*G0_8_1_1 + 0.0809523809523807*G0_9_1_1; + A[84] = -A[129] + 0.127086740420073*G0_0_1_0 - 0.0740355940355936*G0_0_1_1 + 0.00312970979637615*G0_1_1_0 - 0.0131345198011866*G0_1_1_1 + 0.00205226871893533*G0_2_1_1 - 0.0138528138528136*G0_3_1_0 - 0.0106204906204903*G0_3_1_1 - 0.0249350649350645*G0_4_1_0 - 0.0498701298701298*G0_4_1_1 - 0.0230880230880229*G0_5_1_0 + 0.044790764790765*G0_5_1_1 + 0.0249350649350649*G0_6_1_0 + 0.0267821067821065*G0_6_1_1 - 0.0974314574314566*G0_7_1_0 - 0.340779220779219*G0_7_1_1 - 0.0327849927849926*G0_8_1_0 + 0.0364790764790763*G0_8_1_1 + 0.0369408369408372*G0_9_1_0 + 0.0397113997113998*G0_9_1_1; + A[67] = A[109] + 0.000673400673400354*G0_0_0_1 - 0.000673400673400355*G0_0_1_0 + 0.000673400673400119*G0_1_0_1 - 0.000673400673400123*G0_1_1_0 - 0.101779701779701*G0_2_0_1 + 0.101779701779701*G0_2_1_0 - 0.0401731601731607*G0_3_0_1 + 0.0401731601731606*G0_3_1_0 + 0.146320346320345*G0_4_0_1 - 0.146320346320345*G0_4_1_0 - 0.0401731601731604*G0_5_0_1 + 0.0401731601731604*G0_5_1_0 + 0.146320346320346*G0_6_0_1 - 0.146320346320346*G0_6_1_0 + 0.0121212121212117*G0_7_0_1 - 0.0121212121212117*G0_7_1_0 + 0.0121212121212117*G0_8_0_1 - 0.0121212121212117*G0_8_1_0 - 0.136103896103897*G0_9_0_1 + 0.136103896103897*G0_9_1_0; + A[96] = A[144] - 0.398140131473464*G0_0_0_0 + 0.398140131473463*G0_0_1_1 - 0.0294500561167226*G0_1_0_0 - 0.0415071348404678*G0_1_0_1 - 0.0415071348404678*G0_1_1_0 - 0.0535642135642131*G0_1_1_1 + 0.053564213564213*G0_2_0_0 + 0.0415071348404679*G0_2_0_1 + 0.041507134840468*G0_2_1_0 + 0.0294500561167227*G0_2_1_1 - 0.259509379509378*G0_3_0_0 - 0.243347763347762*G0_3_0_1 - 0.243347763347762*G0_3_1_0 - 0.227186147186146*G0_3_1_1 + 0.227186147186146*G0_4_0_0 + 0.243347763347762*G0_4_0_1 + 0.243347763347762*G0_4_1_0 + 0.259509379509378*G0_4_1_1 + 0.457142857142855*G0_5_0_0 + 0.300144300144299*G0_5_0_1 + 0.300144300144299*G0_5_1_0 + 0.143145743145743*G0_5_1_1 + 0.12005772005772*G0_6_0_0 + 0.156998556998556*G0_6_0_1 + 0.156998556998556*G0_6_1_0 + 0.193939393939393*G0_6_1_1 - 0.143145743145742*G0_7_0_0 - 0.300144300144298*G0_7_0_1 - 0.300144300144298*G0_7_1_0 - 0.457142857142854*G0_7_1_1 - 0.193939393939393*G0_8_0_0 - 0.156998556998557*G0_8_0_1 - 0.156998556998557*G0_8_1_0 - 0.120057720057719*G0_8_1_1 + 0.166233766233766*G0_9_0_0 - 0.166233766233765*G0_9_1_1; + A[81] = A[95] + 0.0126727593394258*G0_0_0_1 - 0.0126727593394258*G0_0_1_0 - 0.00908128908128912*G0_1_0_1 + 0.00908128908128913*G0_1_1_0 - 0.114413981080647*G0_2_0_1 + 0.114413981080647*G0_2_1_0 + 0.0281673881673878*G0_3_0_1 - 0.0281673881673878*G0_3_1_0 + 0.0724963924963921*G0_4_0_1 - 0.0724963924963921*G0_4_1_0 - 0.014314574314574*G0_5_0_1 + 0.014314574314574*G0_5_1_0 + 0.0337085137085136*G0_6_0_1 - 0.0337085137085135*G0_6_1_0 + 0.00923520923520894*G0_8_0_1 - 0.00923520923520893*G0_8_1_0 - 0.0184704184704185*G0_9_0_1 + 0.0184704184704185*G0_9_1_0; + A[112] = A[160] - 0.32111592111592*G0_0_0_0 + 0.321115921115919*G0_0_1_1 - 0.246849446849446*G0_1_0_0 - 0.259836459836459*G0_1_0_1 - 0.259836459836459*G0_1_1_0 - 0.198556998556997*G0_1_1_1 + 0.198556998556997*G0_2_0_0 + 0.259836459836458*G0_2_0_1 + 0.259836459836458*G0_2_1_0 + 0.246849446849445*G0_2_1_1 - 0.850043290043285*G0_3_0_0 - 0.817142857142853*G0_3_0_1 - 0.817142857142853*G0_3_1_0 - 0.940086580086574*G0_3_1_1 + 0.940086580086575*G0_4_0_0 + 0.817142857142853*G0_4_0_1 + 0.817142857142853*G0_4_1_0 + 0.850043290043285*G0_4_1_1 - 0.427532467532465*G0_5_0_0 - 0.158268398268398*G0_5_0_1 - 0.158268398268398*G0_5_1_0 + 0.450389610389608*G0_5_1_1 + 1.27948051948052*G0_6_0_0 + 0.73160173160173*G0_6_0_1 + 0.731601731601731*G0_6_1_0 + 0.606233766233765*G0_6_1_1 - 0.450389610389608*G0_7_0_0 + 0.158268398268397*G0_7_0_1 + 0.158268398268397*G0_7_1_0 + 0.427532467532465*G0_7_1_1 - 0.606233766233764*G0_8_0_0 - 0.731601731601729*G0_8_0_1 - 0.731601731601729*G0_8_1_0 - 1.27948051948051*G0_8_1_1 - 0.0238961038961037*G0_9_0_0 + 0.0238961038961039*G0_9_1_1; + A[223] = -A[213] + 0.0364790764790763*G0_0_0_0 + 0.0619272085938752*G0_0_0_1 - 0.00138528138528118*G0_0_1_0 + 0.01667468334135*G0_0_1_1 - 0.0364790764790764*G0_1_0_0 + 0.0194965528298863*G0_1_0_1 - 0.0378643578643575*G0_1_1_0 - 0.0985088985088982*G0_1_1_1 - 0.0600288600288601*G0_2_0_1 - 0.0529485329485322*G0_2_1_0 - 0.113952220618886*G0_2_1_1 + 0.19116883116883*G0_3_0_0 + 0.549033189033186*G0_3_0_1 + 0.213333333333331*G0_3_1_0 + 0.239191919191916*G0_3_1_1 + 0.296450216450215*G0_4_0_0 + 0.398037518037518*G0_4_0_1 + 0.217489177489177*G0_4_1_0 + 0.322308802308802*G0_4_1_1 - 0.191168831168831*G0_5_0_0 - 0.0946608946608943*G0_5_0_1 + 0.0221645021645017*G0_5_1_0 - 0.0133910533910536*G0_5_1_1 - 0.296450216450217*G0_6_0_0 + 0.147763347763346*G0_6_0_1 - 0.0789610389610384*G0_6_1_0 + 0.00600288600288624*G0_6_1_1 - 0.0401731601731601*G0_7_0_0 - 0.138528138528138*G0_7_0_1 - 0.0180086580086574*G0_7_1_0 - 0.144992784992784*G0_7_1_1 + 0.0401731601731599*G0_8_0_0 + 0.21194805194805*G0_8_0_1 + 0.0221645021645023*G0_8_1_0 - 0.959538239538235*G0_8_1_1 + 0.462683982683981*G0_9_0_1 + 1.27168831168831*G0_9_1_0 - 0.0664935064935055*G0_9_1_1; + A[185] = -A[188] - 0.020522687189354*G0_0_0_1 + 0.0841430174763504*G0_0_1_1 - 0.0552060285393615*G0_1_0_1 - 0.0664935064935062*G0_1_1_1 + 0.0236010902677567*G0_2_1_1 + 0.123751803751803*G0_3_0_1 + 0.140375180375179*G0_3_1_1 + 0.0738816738816733*G0_4_0_1 + 0.0960461760461754*G0_4_1_1 - 0.134834054834054*G0_5_0_1 + 0.0849639249639244*G0_5_1_1 - 0.073881673881673*G0_6_0_1 - 0.336161616161615*G0_6_1_1 - 0.0203174603174604*G0_7_0_1 + 0.685252525252521*G0_7_1_1 + 0.0960461760461758*G0_8_0_1 + 0.120057720057719*G0_8_1_1 + 0.011082251082251*G0_9_0_1 + 0.116363636363636*G0_9_1_1; + A[210] = A[14] - 0.00829886163219494*G0_1_0_1 + 0.00829886163219493*G0_1_1_0 + 0.000795254128587374*G0_2_0_1 - 0.000795254128587372*G0_2_1_0 + 0.0125829725829726*G0_3_0_1 - 0.0125829725829726*G0_3_1_0 - 0.00507936507936518*G0_4_0_1 + 0.00507936507936518*G0_4_1_0 + 0.0386724386724384*G0_5_0_1 - 0.0386724386724385*G0_5_1_0 - 0.0451370851370849*G0_6_0_1 + 0.0451370851370849*G0_6_1_0 - 0.0386724386724386*G0_7_0_1 + 0.0386724386724386*G0_7_1_0 + 0.0195093795093795*G0_8_0_1 - 0.0195093795093795*G0_8_1_0 + 0.0256277056277055*G0_9_0_1 - 0.0256277056277056*G0_9_1_0; + A[203] = -A[200] + 0.0552060285393617*G0_0_0_1 - 0.0112874779541442*G0_0_1_1 + 0.0205226871893535*G0_1_0_1 + 0.104665704665704*G0_1_1_1 + 0.0236010902677572*G0_2_1_1 + 0.134834054834055*G0_3_0_1 + 0.21979797979798*G0_3_1_1 + 0.073881673881674*G0_4_0_1 - 0.262279942279941*G0_4_1_1 - 0.123751803751804*G0_5_0_1 + 0.0166233766233766*G0_5_1_1 - 0.0738816738816743*G0_6_0_1 + 0.0221645021645019*G0_6_1_1 - 0.0960461760461763*G0_7_0_1 + 0.0240115440115434*G0_7_1_1 + 0.0203174603174603*G0_8_0_1 + 0.705569985569983*G0_8_1_1 - 0.011082251082251*G0_9_0_1 + 0.105281385281384*G0_9_1_1; + A[17] = -0.00253166586499919*G0_0_0_1 - 0.0169472502805836*G0_1_0_1 - 0.0169472502805835*G0_2_0_1 + 0.000342712842712794*G0_3_0_1 + 0.000342712842712848*G0_4_0_1 + 0.00656204906204905*G0_5_0_1 - 0.0152417027417027*G0_6_0_1 + 0.00656204906204907*G0_7_0_1 - 0.0152417027417027*G0_8_0_1 - 0.00351370851370853*G0_9_0_1; + A[2] = -A[17] + 0.0144155844155844*G0_0_0_1 + 0.0169472502805836*G0_0_1_1 - 0.0144155844155845*G0_1_0_1 + 0.00253166586499918*G0_1_1_1 + 0.0169472502805837*G0_2_1_1 - 0.00621933621933622*G0_3_0_1 - 0.00656204906204907*G0_3_1_1 + 0.0155844155844155*G0_4_0_1 + 0.0152417027417028*G0_4_1_1 + 0.00621933621933622*G0_5_0_1 - 0.00034271284271287*G0_5_1_1 - 0.0155844155844155*G0_6_0_1 - 0.000342712842712753*G0_6_1_1 + 0.0218037518037518*G0_7_0_1 + 0.0152417027417027*G0_7_1_1 - 0.0218037518037518*G0_8_0_1 - 0.00656204906204908*G0_8_1_1 + 0.00351370851370853*G0_9_1_1; + A[134] = -A[89] - 0.0482283148949816*G0_0_1_0 - 0.0728555395222064*G0_0_1_1 + 0.0482283148949816*G0_1_1_0 - 0.0246272246272248*G0_1_1_1 + 0.0205226871893538*G0_2_1_1 - 0.156998556998556*G0_3_1_0 - 0.136681096681096*G0_3_1_1 - 0.655699855699853*G0_4_1_0 - 0.646464646464644*G0_4_1_1 + 0.156998556998556*G0_5_1_0 + 0.0203174603174605*G0_5_1_1 + 0.655699855699856*G0_6_1_0 + 0.00923520923520846*G0_6_1_1 + 0.0554112554112547*G0_7_1_0 - 0.323232323232321*G0_7_1_1 - 0.0554112554112552*G0_8_1_0 - 0.378643578643577*G0_8_1_1 - 0.770216450216448*G0_9_1_1; + A[186] = A[134] - 0.170030463363796*G0_0_0_0 + 0.0816802950136271*G0_0_0_1 - 0.0976879910213238*G0_0_1_0 + 0.213128106461439*G0_0_1_1 - 0.0811672278338945*G0_1_0_0 - 0.0811672278338944*G0_1_0_1 - 0.0811672278338945*G0_1_1_0 - 0.0591053391053406*G0_2_0_0 - 0.310816097482763*G0_2_0_1 - 0.131447811447812*G0_2_1_0 - 0.213128106461439*G0_2_1_1 + 0.0905050505050506*G0_3_0_0 + 0.233189033189032*G0_3_0_1 + 0.155613275613275*G0_3_1_0 + 0.118210678210678*G0_3_1_1 - 0.796075036075034*G0_4_0_0 - 1.12161616161616*G0_4_0_1 - 0.800230880230878*G0_4_1_0 - 0.890274170274166*G0_4_1_1 - 1.35388167388167*G0_5_0_0 - 0.247041847041847*G0_5_0_1 - 0.0918903318903303*G0_5_1_0 + 0.407272727272725*G0_5_1_1 + 0.607676767676763*G0_6_0_0 - 0.499163059163057*G0_6_0_1 - 0.654314574314575*G0_6_1_0 - 0.407272727272726*G0_6_1_1 - 0.235497835497834*G0_7_0_0 + 0.0900432900432894*G0_7_0_1 - 0.231341991341989*G0_7_1_0 + 0.890274170274167*G0_7_1_1 + 0.180086580086579*G0_8_0_0 + 0.0374025974025978*G0_8_0_1 + 0.114978354978354*G0_8_1_0 - 0.118210678210678*G0_8_1_1 - 0.62060606060606*G0_9_0_0 - 0.620606060606059*G0_9_0_1 - 0.620606060606059*G0_9_1_0; + A[218] = A[134] - 0.0489466089466088*G0_0_0_1 + 0.0489466089466088*G0_0_1_0 - 0.000718294051627211*G0_1_0_1 + 0.000718294051627211*G0_1_1_0 - 0.228314894981559*G0_2_0_1 + 0.228314894981559*G0_2_1_0 + 0.0364790764790758*G0_3_0_1 - 0.0364790764790759*G0_3_1_0 - 0.307070707070705*G0_4_0_1 + 0.307070707070705*G0_4_1_0 + 0.193477633477632*G0_5_0_1 - 0.193477633477632*G0_5_1_0 + 0.34862914862915*G0_6_0_1 - 0.34862914862915*G0_6_1_0 + 0.014314574314574*G0_7_0_1 - 0.014314574314574*G0_7_1_0 - 0.0410966810966805*G0_8_0_1 + 0.0410966810966805*G0_8_1_0 + 0.0332467532467535*G0_9_0_1 - 0.0332467532467535*G0_9_1_0; + A[215] = -A[218] - 0.0482283148949816*G0_0_0_1 - 0.0728555395222064*G0_0_1_1 + 0.0482283148949816*G0_1_0_1 - 0.0246272246272248*G0_1_1_1 + 0.0205226871893538*G0_2_1_1 - 0.156998556998556*G0_3_0_1 - 0.136681096681096*G0_3_1_1 - 0.655699855699853*G0_4_0_1 - 0.646464646464644*G0_4_1_1 + 0.156998556998556*G0_5_0_1 + 0.0203174603174605*G0_5_1_1 + 0.655699855699856*G0_6_0_1 + 0.00923520923520846*G0_6_1_1 + 0.0554112554112547*G0_7_0_1 - 0.323232323232321*G0_7_1_1 - 0.0554112554112552*G0_8_0_1 - 0.378643578643577*G0_8_1_1 - 0.770216450216448*G0_9_1_1; + A[69] = A[139] - 0.00420715087381822*G0_0_0_1 + 0.00420715087381822*G0_0_1_0 - 0.0398653198653201*G0_1_0_1 + 0.0398653198653201*G0_1_1_0 + 0.00124418791085439*G0_2_0_1 - 0.00124418791085439*G0_2_1_0 + 0.114170274170273*G0_3_0_1 - 0.114170274170273*G0_3_1_0 - 0.0738816738816737*G0_4_0_1 + 0.0738816738816737*G0_4_1_0 + 0.00738816738816725*G0_5_0_1 - 0.00738816738816725*G0_5_1_0 + 0.0049639249639249*G0_6_0_1 - 0.0049639249639249*G0_6_1_0 - 0.00577200577200653*G0_7_0_1 + 0.00577200577200652*G0_7_1_0 + 0.0257431457431459*G0_8_0_1 - 0.0257431457431459*G0_8_1_0 - 0.02978354978355*G0_9_0_1 + 0.02978354978355*G0_9_1_0; + A[94] = A[69] - 0.0137502004168674*G0_0_0_0 + 0.0137502004168678*G0_0_1_1 - 0.0141478274811607*G0_1_0_0 - 0.0186243386243386*G0_1_0_1 - 0.0597338464005131*G0_1_1_0 - 0.0777296777296775*G0_1_1_1 + 0.0777296777296768*G0_2_0_0 + 0.0186243386243385*G0_2_0_1 + 0.0597338464005126*G0_2_1_0 + 0.0141478274811606*G0_2_1_1 - 0.00531024531024535*G0_3_0_0 - 0.0685714285714288*G0_3_0_1 + 0.119480519480519*G0_3_1_0 + 0.101240981240981*G0_3_1_1 - 0.101240981240982*G0_4_0_0 + 0.0685714285714281*G0_4_0_1 - 0.119480519480519*G0_4_1_0 + 0.00531024531024524*G0_4_1_1 + 0.0253968253968256*G0_5_0_0 + 0.0228571428571434*G0_5_0_1 + 0.036017316017316*G0_5_1_0 + 0.0154689754689761*G0_5_1_1 - 0.045598845598846*G0_6_0_0 - 0.0228571428571429*G0_6_0_1 - 0.0436363636363636*G0_6_1_0 - 0.0181240981240984*G0_6_1_1 - 0.0154689754689752*G0_7_0_0 - 0.0228571428571417*G0_7_0_1 - 0.0360173160173153*G0_7_1_0 - 0.0253968253968241*G0_7_1_1 + 0.018124098124098*G0_8_0_0 + 0.0228571428571419*G0_8_0_1 + 0.0436363636363633*G0_8_1_0 + 0.0455988455988449*G0_8_1_1 - 0.0103896103896105*G0_9_0_0 + 0.0103896103896106*G0_9_1_1; + A[66] = A[94] + 0.00420715087381802*G0_0_0_1 - 0.00420715087381802*G0_0_1_0 - 0.0012441879108544*G0_1_0_1 + 0.0012441879108544*G0_1_1_0 + 0.0398653198653197*G0_2_0_1 - 0.0398653198653197*G0_2_1_0 + 0.0738816738816741*G0_3_0_1 - 0.0738816738816741*G0_3_1_0 - 0.114170274170273*G0_4_0_1 + 0.114170274170273*G0_4_1_0 + 0.0057720057720053*G0_5_0_1 - 0.0057720057720053*G0_5_1_0 - 0.0257431457431456*G0_6_0_1 + 0.0257431457431456*G0_6_1_0 - 0.0073881673881671*G0_7_0_1 + 0.0073881673881671*G0_7_1_0 - 0.00496392496392455*G0_8_0_1 + 0.00496392496392455*G0_8_1_0 + 0.02978354978355*G0_9_0_1 - 0.02978354978355*G0_9_1_0; + A[48] = -A[56] + 0.0627481160814494*G0_0_0_0 + 0.0120570787237453*G0_0_1_0 - 0.0461760461760456*G0_1_0_0 - 0.398140131473464*G0_1_1_0 + 0.104255250921917*G0_2_0_0 + 0.0120570787237452*G0_2_1_0 + 0.600288600288599*G0_3_0_0 + 0.156998556998556*G0_3_1_0 + 0.00692640692640696*G0_4_0_0 - 0.0369408369408365*G0_4_1_0 - 0.0212409812409816*G0_5_0_0 - 0.0161616161616159*G0_5_1_0 + 0.222106782106781*G0_6_0_0 - 0.0161616161616161*G0_6_1_0 - 0.15007215007215*G0_7_0_0 - 0.0369408369408364*G0_7_1_0 + 0.300144300144299*G0_8_0_0 + 0.156998556998555*G0_8_1_0 + 0.614141414141412*G0_9_0_0 + 0.166233766233765*G0_9_1_0; + A[39] = A[41] - 0.0223953823953823*G0_0_1_0 + 0.0110565977232643*G0_0_1_1 - 0.0223953823953824*G0_1_1_0 - 0.0334519801186468*G0_1_1_1 + 0.00161616161616147*G0_3_1_0 + 0.0120057720057718*G0_3_1_1 - 0.00230880230880227*G0_4_1_1 + 0.0016161616161616*G0_5_1_0 - 0.0103896103896104*G0_5_1_1 + 0.00230880230880235*G0_6_1_1 + 0.0223953823953823*G0_7_1_0 + 0.0745743145743144*G0_7_1_1 + 0.0223953823953822*G0_8_1_0 - 0.0521789321789322*G0_8_1_1 - 0.00323232323232328*G0_9_1_0 - 0.00161616161616171*G0_9_1_1; + A[121] = A[91] - 0.0110565977232643*G0_0_0_0 + 0.0223953823953824*G0_0_1_0 + 0.0334519801186467*G0_2_0_0 + 0.0223953823953823*G0_2_1_0 + 0.0023088023088024*G0_3_0_0 - 0.012005772005772*G0_4_0_0 - 0.00161616161616166*G0_4_1_0 - 0.074574314574314*G0_5_0_0 - 0.0223953823953822*G0_5_1_0 + 0.0521789321789319*G0_6_0_0 - 0.0223953823953824*G0_6_1_0 + 0.0103896103896103*G0_7_0_0 - 0.0016161616161616*G0_7_1_0 - 0.00230880230880228*G0_8_0_0 + 0.00161616161616165*G0_9_0_0 + 0.00323232323232331*G0_9_1_0; + A[76] = -A[121] + 0.0103383036716369*G0_0_1_0 + 0.09318582651916*G0_1_1_0 + 0.0233445566778899*G0_2_1_0 - 0.00375180375180359*G0_3_1_0 + 0.0267243867243865*G0_4_1_0 - 0.0152958152958153*G0_5_1_0 - 0.00998556998557001*G0_6_1_0 - 0.0394227994227994*G0_7_1_0 + 0.0839826839826839*G0_8_1_0 + 0.034054834054834*G0_9_1_0; + A[136] = -A[76] - 0.038723745390412*G0_0_0_0 + 0.00909411576078244*G0_0_1_0 - 0.0815776815776814*G0_1_0_0 - 0.0478178611511943*G0_2_0_0 - 0.00909411576078237*G0_2_1_0 - 0.0655122655122653*G0_3_0_0 - 0.0773448773448768*G0_3_1_0 + 0.0423088023088021*G0_4_0_0 + 0.0646464646464641*G0_4_1_0 - 0.0401154401154399*G0_5_0_0 - 0.0176623376623376*G0_5_1_0 - 0.0224531024531023*G0_6_0_0 + 0.0176623376623376*G0_6_1_0 - 0.0223376623376622*G0_7_0_0 - 0.0646464646464644*G0_7_1_0 + 0.0118326118326116*G0_8_0_0 + 0.0773448773448771*G0_8_1_0 - 0.0234343434343435*G0_9_0_0; + A[87] = -A[132] - 0.020522687189354*G0_0_1_0 + 0.0841430174763504*G0_0_1_1 - 0.0552060285393615*G0_1_1_0 - 0.0664935064935062*G0_1_1_1 + 0.0236010902677567*G0_2_1_1 + 0.123751803751803*G0_3_1_0 + 0.140375180375179*G0_3_1_1 + 0.0738816738816733*G0_4_1_0 + 0.0960461760461754*G0_4_1_1 - 0.134834054834054*G0_5_1_0 + 0.0849639249639244*G0_5_1_1 - 0.073881673881673*G0_6_1_0 - 0.336161616161615*G0_6_1_1 - 0.0203174603174604*G0_7_1_0 + 0.685252525252521*G0_7_1_1 + 0.0960461760461758*G0_8_1_0 + 0.120057720057719*G0_8_1_1 + 0.0110822510822511*G0_9_1_0 + 0.116363636363636*G0_9_1_1; + A[64] = A[160] - 0.246849446849446*G0_0_0_0 + 0.0129870129870128*G0_0_0_1 + 0.0129870129870128*G0_0_1_0 + 0.0742664742664743*G0_0_1_1 - 0.32111592111592*G0_1_0_0 - 0.32111592111592*G0_1_0_1 - 0.32111592111592*G0_1_1_0 + 0.198556998556996*G0_2_0_0 - 0.0612794612794615*G0_2_0_1 - 0.0612794612794615*G0_2_1_0 - 0.074266474266474*G0_2_1_1 - 0.427532467532465*G0_3_0_0 - 0.269264069264068*G0_3_0_1 - 0.269264069264068*G0_3_1_0 + 0.339393939393939*G0_3_1_1 + 1.27948051948051*G0_4_0_0 + 0.547878787878786*G0_4_0_1 + 0.547878787878786*G0_4_1_0 + 0.422510822510821*G0_4_1_1 - 0.850043290043285*G0_5_0_0 - 0.0329004329004326*G0_5_0_1 - 0.0329004329004326*G0_5_1_0 - 0.155844155844155*G0_5_1_1 + 0.940086580086575*G0_6_0_0 + 0.122943722943722*G0_6_0_1 + 0.122943722943722*G0_6_1_0 + 0.155844155844155*G0_6_1_1 - 0.606233766233763*G0_7_0_0 + 0.125367965367965*G0_7_0_1 + 0.125367965367965*G0_7_1_0 - 0.422510822510821*G0_7_1_1 - 0.450389610389609*G0_8_0_0 - 0.608658008658007*G0_8_0_1 - 0.608658008658007*G0_8_1_0 - 0.339393939393938*G0_8_1_1 - 0.0238961038961044*G0_9_0_0 - 0.0238961038961046*G0_9_0_1 - 0.0238961038961046*G0_9_1_0; + A[166] = -A[46] - 0.0218053551386885*G0_0_0_0 - 0.194965528298861*G0_1_0_0 - 0.0218053551386884*G0_2_0_0 - 0.043001443001443*G0_3_0_0 - 0.00202020202020192*G0_4_0_0 - 0.0510822510822506*G0_5_0_0 - 0.0510822510822508*G0_6_0_0 - 0.00202020202020186*G0_7_0_0 - 0.0430014430014432*G0_8_0_0 - 0.094083694083694*G0_9_0_0; + A[115] = A[157] - 0.101779701779702*G0_0_0_1 + 0.101779701779702*G0_0_1_0 + 0.000673400673400504*G0_1_0_1 - 0.000673400673400503*G0_1_1_0 + 0.0006734006734009*G0_2_0_1 - 0.000673400673400899*G0_2_1_0 + 0.0121212121212122*G0_3_0_1 - 0.0121212121212122*G0_3_1_0 + 0.0121212121212122*G0_4_0_1 - 0.0121212121212122*G0_4_1_0 + 0.146320346320345*G0_5_0_1 - 0.146320346320345*G0_5_1_0 - 0.0401731601731603*G0_6_0_1 + 0.0401731601731604*G0_6_1_0 + 0.146320346320345*G0_7_0_1 - 0.146320346320345*G0_7_1_0 - 0.0401731601731597*G0_8_0_1 + 0.0401731601731597*G0_8_1_0 - 0.136103896103896*G0_9_0_1 + 0.136103896103896*G0_9_1_0; + A[224] = A[208] + 0.0394035594035599*G0_0_0_0 - 0.0394035594035585*G0_0_1_1 - 0.135449735449734*G0_1_0_0 - 0.0394035594035587*G0_1_0_1 - 0.0394035594035587*G0_1_1_0 - 0.118210678210677*G0_1_1_1 + 0.118210678210678*G0_2_0_0 + 0.0394035594035603*G0_2_0_1 + 0.0394035594035603*G0_2_1_0 + 0.135449735449736*G0_2_1_1 - 2.01696969696969*G0_3_0_0 - 1.96155844155843*G0_3_0_1 - 1.96155844155843*G0_3_1_0 - 2.23861471861471*G0_3_1_1 + 2.23861471861471*G0_4_0_0 + 1.96155844155843*G0_4_0_1 + 1.96155844155843*G0_4_1_0 + 2.01696969696969*G0_4_1_1 - 0.598441558441556*G0_5_0_0 - 0.0332467532467544*G0_5_0_1 - 0.0332467532467544*G0_5_1_0 + 0.0886580086580075*G0_5_1_1 + 1.79532467532467*G0_6_0_0 + 0.398961038961038*G0_6_0_1 + 0.398961038961038*G0_6_1_0 + 0.42112554112554*G0_6_1_1 - 0.088658008658008*G0_7_0_0 + 0.0332467532467539*G0_7_0_1 + 0.0332467532467539*G0_7_1_0 + 0.598441558441555*G0_7_1_1 - 0.421125541125539*G0_8_0_0 - 0.398961038961037*G0_8_0_1 - 0.398961038961037*G0_8_1_0 - 1.79532467532467*G0_8_1_1 - 0.930909090909088*G0_9_0_0 + 0.930909090909087*G0_9_1_1; + A[206] = -A[198] - 0.0728555395222062*G0_0_0_0 - 0.0482283148949815*G0_0_1_0 + 0.0205226871893538*G0_1_0_0 - 0.0246272246272246*G0_2_0_0 + 0.0482283148949811*G0_2_1_0 - 0.646464646464644*G0_3_0_0 - 0.655699855699854*G0_3_1_0 - 0.136681096681096*G0_4_0_0 - 0.156998556998556*G0_4_1_0 - 0.323232323232321*G0_5_0_0 + 0.0554112554112553*G0_5_1_0 - 0.378643578643577*G0_6_0_0 - 0.0554112554112558*G0_6_1_0 + 0.0203174603174605*G0_7_0_0 + 0.156998556998557*G0_7_1_0 + 0.00923520923520918*G0_8_0_0 + 0.655699855699852*G0_8_1_0 - 0.770216450216448*G0_9_0_0; + A[178] = A[206] - 0.0489466089466087*G0_0_0_1 + 0.0489466089466087*G0_0_1_0 - 0.22831489498156*G0_1_0_1 + 0.22831489498156*G0_1_1_0 - 0.000718294051627315*G0_2_0_1 + 0.000718294051627315*G0_2_1_0 - 0.307070707070706*G0_3_0_1 + 0.307070707070706*G0_3_1_0 + 0.0364790764790759*G0_4_0_1 - 0.0364790764790758*G0_4_1_0 + 0.0143145743145742*G0_5_0_1 - 0.0143145743145742*G0_5_1_0 - 0.041096681096681*G0_6_0_1 + 0.041096681096681*G0_6_1_0 + 0.193477633477633*G0_7_0_1 - 0.193477633477633*G0_7_1_0 + 0.348629148629147*G0_8_0_1 - 0.348629148629147*G0_8_1_0 + 0.0332467532467521*G0_9_0_1 - 0.0332467532467521*G0_9_1_0; + A[0] = A[16] + 0.158104858104857*G0_0_0_0 + 0.172286355619688*G0_0_0_1 + 0.172286355619688*G0_0_1_0 + 0.172286355619688*G0_0_1_1 - 0.158104858104857*G0_1_0_0 + 0.0141814975148308*G0_1_0_1 + 0.0141814975148308*G0_1_1_0 + 0.0141814975148308*G0_1_1_1 + 0.0141814975148308*G0_2_0_1 + 0.0141814975148308*G0_2_1_0 + 0.0141814975148308*G0_2_1_1 - 0.101154401154401*G0_3_0_0 + 0.006619769119769*G0_3_0_1 + 0.006619769119769*G0_3_1_0 + 0.00661976911976899*G0_3_1_1 + 0.0519480519480515*G0_4_0_0 + 0.00661976911976904*G0_4_0_1 + 0.00661976911976904*G0_4_1_0 + 0.00661976911976904*G0_4_1_1 + 0.101154401154401*G0_5_0_0 + 0.10777417027417*G0_5_0_1 + 0.10777417027417*G0_5_1_0 + 0.10777417027417*G0_5_1_1 - 0.0519480519480517*G0_6_0_0 - 0.0453282828282826*G0_6_0_1 - 0.0453282828282826*G0_6_1_0 - 0.0453282828282826*G0_6_1_1 + 0.153102453102452*G0_7_0_0 + 0.10777417027417*G0_7_0_1 + 0.10777417027417*G0_7_1_0 + 0.10777417027417*G0_7_1_1 - 0.153102453102452*G0_8_0_0 - 0.0453282828282827*G0_8_0_1 - 0.0453282828282827*G0_8_1_0 - 0.0453282828282827*G0_8_1_1 + 0.0342352092352093*G0_9_0_1 + 0.0342352092352093*G0_9_1_0 + 0.0342352092352093*G0_9_1_1; + A[58] = -A[178] - 0.0728555395222062*G0_0_0_0 - 0.0482283148949815*G0_0_0_1 + 0.0205226871893539*G0_1_0_0 - 0.0246272246272246*G0_2_0_0 + 0.0482283148949811*G0_2_0_1 - 0.646464646464644*G0_3_0_0 - 0.655699855699854*G0_3_0_1 - 0.136681096681096*G0_4_0_0 - 0.156998556998556*G0_4_0_1 - 0.323232323232321*G0_5_0_0 + 0.0554112554112553*G0_5_0_1 - 0.378643578643577*G0_6_0_0 - 0.0554112554112558*G0_6_0_1 + 0.0203174603174605*G0_7_0_0 + 0.156998556998557*G0_7_0_1 + 0.00923520923520912*G0_8_0_0 + 0.655699855699852*G0_8_0_1 - 0.770216450216448*G0_9_0_0; + A[28] = -0.00421997755331084*G0_0_0_0 + 0.0124803591470257*G0_0_0_1 - 0.11729998396665*G0_1_0_0 - 0.0167003367003366*G0_2_0_0 - 0.0124803591470257*G0_2_0_1 - 0.219336219336218*G0_3_0_0 - 0.102741702741702*G0_3_0_1 + 0.121789321789321*G0_4_0_0 + 0.058297258297258*G0_4_0_1 + 0.0731890331890326*G0_5_0_0 - 0.00242424242424241*G0_5_0_1 + 0.0756132756132754*G0_6_0_0 + 0.00242424242424259*G0_6_0_1 + 0.0634920634920632*G0_7_0_0 - 0.058297258297258*G0_7_0_1 - 0.116594516594516*G0_8_0_0 + 0.102741702741702*G0_8_0_1 + 0.0554112554112551*G0_9_0_0; + A[12] = A[28] - 0.113080006413339*G0_0_0_0 - 0.129780343113676*G0_0_0_1 - 0.11729998396665*G0_0_1_0 - 0.11729998396665*G0_0_1_1 + 0.113080006413339*G0_1_0_0 - 0.0167003367003365*G0_1_0_1 - 0.00421997755331079*G0_1_1_0 - 0.0167003367003366*G0_1_1_1 + 0.00826038159371488*G0_2_0_1 - 0.0167003367003366*G0_2_1_0 - 0.00421997755331084*G0_2_1_1 + 0.292525252525251*G0_3_0_0 + 0.178354978354977*G0_3_0_1 + 0.0731890331890324*G0_3_1_0 + 0.0756132756132749*G0_3_1_1 - 0.0461760461760459*G0_4_0_0 + 0.0148917748917747*G0_4_0_1 + 0.0756132756132752*G0_4_1_0 + 0.0731890331890328*G0_4_1_1 - 0.29252525252525*G0_5_0_0 - 0.114170274170274*G0_5_0_1 - 0.219336219336218*G0_5_1_0 - 0.116594516594516*G0_5_1_1 + 0.0461760461760458*G0_6_0_0 + 0.0610678210678206*G0_6_0_1 + 0.121789321789321*G0_6_1_0 + 0.0634920634920632*G0_6_1_1 - 0.180086580086579*G0_7_0_0 - 0.16103896103896*G0_7_0_1 - 0.116594516594516*G0_7_1_0 - 0.219336219336218*G0_7_1_1 + 0.180086580086579*G0_8_0_0 + 0.0190476190476194*G0_8_0_1 + 0.0634920634920631*G0_8_1_0 + 0.121789321789321*G0_8_1_1 + 0.0554112554112552*G0_9_0_1 + 0.0554112554112551*G0_9_1_0 + 0.055411255411255*G0_9_1_1; + A[180] = A[12] + 0.0124803591470258*G0_1_0_1 - 0.0124803591470258*G0_1_1_0 - 0.0124803591470257*G0_2_0_1 + 0.0124803591470257*G0_2_1_0 - 0.00242424242424265*G0_3_0_1 + 0.00242424242424263*G0_3_1_0 + 0.00242424242424243*G0_4_0_1 - 0.00242424242424244*G0_4_1_0 - 0.102741702741702*G0_5_0_1 + 0.102741702741702*G0_5_1_0 + 0.058297258297258*G0_6_0_1 - 0.058297258297258*G0_6_1_0 + 0.102741702741702*G0_7_0_1 - 0.102741702741702*G0_7_1_0 - 0.0582972582972581*G0_8_0_1 + 0.0582972582972581*G0_8_1_0; + A[131] = -A[86] - 0.00312970979637636*G0_0_1_0 - 0.016264229597563*G0_0_1_1 - 0.127086740420074*G0_1_1_0 - 0.201122334455668*G0_1_1_1 + 0.00205226871893528*G0_2_1_1 + 0.0230880230880228*G0_3_1_0 + 0.0678787878787875*G0_3_1_1 - 0.0249350649350648*G0_4_1_0 + 0.00184704184704204*G0_4_1_1 + 0.0138528138528143*G0_5_1_0 + 0.00323232323232313*G0_5_1_1 + 0.0249350649350646*G0_6_1_0 - 0.0249350649350647*G0_6_1_1 + 0.0327849927849931*G0_7_1_0 + 0.0692640692640691*G0_7_1_1 + 0.0974314574314565*G0_8_1_0 - 0.243347763347763*G0_8_1_1 - 0.0369408369408371*G0_9_1_0 + 0.00277056277056261*G0_9_1_1; + A[123] = -A[131] - 0.0162642295975629*G0_0_0_0 - 0.00312970979637622*G0_0_1_0 + 0.0020522687189353*G0_1_0_0 - 0.201122334455666*G0_2_0_0 - 0.127086740420073*G0_2_1_0 + 0.00184704184704147*G0_3_0_0 - 0.0249350649350653*G0_3_1_0 + 0.0678787878787879*G0_4_0_0 + 0.0230880230880229*G0_4_1_0 + 0.0692640692640687*G0_5_0_0 + 0.032784992784993*G0_5_1_0 - 0.243347763347761*G0_6_0_0 + 0.0974314574314571*G0_6_1_0 + 0.00323232323232314*G0_7_0_0 + 0.0138528138528141*G0_7_1_0 - 0.0249350649350646*G0_8_0_0 + 0.0249350649350646*G0_8_1_0 + 0.00277056277056303*G0_9_0_0 - 0.0369408369408371*G0_9_1_0; + A[40] = A[41] + 0.00753727753727757*G0_0_1_0 - 0.0076078242744909*G0_0_1_1 - 0.0299326599326601*G0_1_1_0 - 0.0485970819304154*G0_1_1_1 + 0.00396825396825393*G0_2_1_1 + 0.00477633477633481*G0_3_1_0 + 0.0179942279942278*G0_3_1_1 - 0.00115440115440105*G0_4_1_1 - 0.00316017316017293*G0_5_1_0 + 0.0028282828282828*G0_5_1_1 + 0.00115440115440116*G0_6_1_1 - 0.029134199134199*G0_7_1_0 + 0.0316883116883116*G0_7_1_1 + 0.0515295815295815*G0_8_1_0 + 0.00864357864357853*G0_8_1_1 - 0.00161616161616161*G0_9_1_0 - 0.0089177489177489*G0_9_1_1; + A[151] = -A[61] + 0.0321661054994388*G0_0_0_0 - 0.0124803591470258*G0_0_1_0 + 0.162129228795895*G0_1_0_0 + 0.0446464646464644*G0_2_0_0 + 0.0124803591470257*G0_2_1_0 + 0.0766955266955264*G0_3_0_0 + 0.102741702741702*G0_3_1_0 - 0.0163780663780665*G0_4_0_0 - 0.0582972582972579*G0_4_1_0 + 0.0581962481962477*G0_5_0_0 + 0.00242424242424243*G0_5_1_0 + 0.0557720057720054*G0_6_0_0 - 0.00242424242424249*G0_6_1_0 + 0.0419191919191916*G0_7_0_0 + 0.0582972582972581*G0_7_1_0 - 0.0260461760461755*G0_8_0_0 - 0.102741702741702*G0_8_1_0 + 0.0809523809523808*G0_9_0_0; + A[102] = A[186] - 0.22831489498156*G0_0_0_1 + 0.22831489498156*G0_0_1_0 - 0.000718294051627291*G0_1_0_1 + 0.000718294051627287*G0_1_1_0 - 0.0489466089466085*G0_2_0_1 + 0.0489466089466085*G0_2_1_0 - 0.0410966810966812*G0_3_0_1 + 0.0410966810966812*G0_3_1_0 + 0.0143145743145738*G0_4_0_1 - 0.0143145743145737*G0_4_1_0 + 0.348629148629148*G0_5_0_1 - 0.348629148629148*G0_5_1_0 + 0.193477633477632*G0_6_0_1 - 0.193477633477632*G0_6_1_0 - 0.307070707070704*G0_7_0_1 + 0.307070707070704*G0_7_1_0 + 0.0364790764790758*G0_8_0_1 - 0.0364790764790758*G0_8_1_0 + 0.0332467532467534*G0_9_0_1 - 0.0332467532467535*G0_9_1_0; + A[189] = A[102] + 0.391470258136922*G0_0_0_0 - 0.391470258136923*G0_0_1_1 + 0.058592271925605*G0_1_0_0 - 0.0261664261664261*G0_1_0_1 + 0.0220618887285554*G0_1_1_0 - 0.0935834535834531*G0_1_1_1 + 0.0935834535834533*G0_2_0_0 + 0.026166426166426*G0_2_0_1 - 0.022061888728555*G0_2_1_0 - 0.0585922719256048*G0_2_1_1 - 0.273362193362191*G0_3_0_0 - 0.192554112554111*G0_3_0_1 - 0.247965367965367*G0_3_1_0 - 0.169927849927849*G0_3_1_1 + 0.169927849927849*G0_4_0_0 + 0.192554112554112*G0_4_0_1 + 0.247965367965367*G0_4_1_0 + 0.273362193362192*G0_4_1_1 + 1.83041847041846*G0_5_0_0 - 0.175930735930736*G0_5_0_1 + 0.479769119769119*G0_5_1_0 - 0.48300144300144*G0_5_1_1 - 0.308455988455986*G0_6_0_0 + 0.0540259740259743*G0_6_0_1 + 0.21102453102453*G0_6_1_0 + 0.342626262626261*G0_6_1_1 + 0.483001443001441*G0_7_0_0 + 0.175930735930734*G0_7_0_1 - 0.479769119769116*G0_7_1_0 - 1.83041847041846*G0_7_1_1 - 0.342626262626262*G0_8_0_0 - 0.0540259740259736*G0_8_0_1 - 0.21102453102453*G0_8_1_0 + 0.308455988455987*G0_8_1_1 + 0.47099567099567*G0_9_0_0 - 0.47099567099567*G0_9_1_1; + A[147] = A[189] + 0.22831489498156*G0_0_0_1 - 0.22831489498156*G0_0_1_0 + 0.0489466089466088*G0_1_0_1 - 0.0489466089466088*G0_1_1_0 + 0.000718294051627499*G0_2_0_1 - 0.000718294051627506*G0_2_1_0 - 0.0143145743145742*G0_3_0_1 + 0.0143145743145742*G0_3_1_0 + 0.0410966810966812*G0_4_0_1 - 0.0410966810966812*G0_4_1_0 + 0.307070707070706*G0_5_0_1 - 0.307070707070706*G0_5_1_0 - 0.0364790764790765*G0_6_0_1 + 0.0364790764790765*G0_6_1_0 - 0.348629148629146*G0_7_0_1 + 0.348629148629146*G0_7_1_0 - 0.193477633477632*G0_8_0_1 + 0.193477633477633*G0_8_1_0 - 0.0332467532467522*G0_9_0_1 + 0.0332467532467522*G0_9_1_0; + A[177] = -A[57] + 0.0841430174763504*G0_0_0_0 - 0.0205226871893535*G0_0_0_1 + 0.0236010902677565*G0_1_0_0 - 0.0664935064935061*G0_2_0_0 - 0.0552060285393616*G0_2_0_1 + 0.0960461760461754*G0_3_0_0 + 0.0738816738816738*G0_3_0_1 + 0.14037518037518*G0_4_0_0 + 0.123751803751803*G0_4_0_1 + 0.68525252525252*G0_5_0_0 - 0.0203174603174599*G0_5_0_1 + 0.12005772005772*G0_6_0_0 + 0.0960461760461758*G0_6_0_1 + 0.0849639249639245*G0_7_0_0 - 0.134834054834054*G0_7_0_1 - 0.336161616161615*G0_8_0_0 - 0.0738816738816732*G0_8_0_1 + 0.116363636363636*G0_9_0_0 + 0.0110822510822517*G0_9_0_1; + A[221] = -A[213] - 0.0112874779541445*G0_0_0_0 + 0.0552060285393616*G0_0_1_0 + 0.0236010902677567*G0_1_0_0 + 0.104665704665704*G0_2_0_0 + 0.0205226871893539*G0_2_1_0 - 0.262279942279941*G0_3_0_0 + 0.0738816738816743*G0_3_1_0 + 0.219797979797979*G0_4_0_0 + 0.134834054834054*G0_4_1_0 + 0.0240115440115437*G0_5_0_0 - 0.0960461760461764*G0_5_1_0 + 0.705569985569981*G0_6_0_0 + 0.0203174603174605*G0_6_1_0 + 0.0166233766233767*G0_7_0_0 - 0.123751803751804*G0_7_1_0 + 0.0221645021645018*G0_8_0_0 - 0.0738816738816729*G0_8_1_0 + 0.105281385281384*G0_9_0_0 - 0.0110822510822509*G0_9_1_0; + A[149] = A[221] - 0.02637165303832*G0_0_0_0 - 0.0119031585698257*G0_0_0_1 + 0.00820907487574193*G0_0_1_0 + 0.0620811287477954*G0_0_1_1 + 0.0263716530383196*G0_1_0_0 + 0.0345807279140612*G0_1_0_1 + 0.0144684944684942*G0_1_1_0 - 0.0394035594035594*G0_1_1_1 + 0.010569183902517*G0_2_0_1 + 0.0105691839025173*G0_2_1_0 + 0.0105691839025171*G0_2_1_1 + 0.136681096681096*G0_3_0_0 + 0.206406926406925*G0_3_0_1 + 0.071572871572871*G0_3_1_0 + 0.214256854256853*G0_3_1_1 + 0.147763347763347*G0_4_0_0 + 0.126060606060605*G0_4_0_1 + 0.179624819624819*G0_4_1_0 + 0.158845598845599*G0_4_1_1 - 0.136681096681096*G0_5_0_0 - 0.0651082251082251*G0_5_0_1 + 0.0697258297258296*G0_5_1_0 - 0.0729581529581531*G0_5_1_1 - 0.147763347763347*G0_6_0_0 + 0.0318614718614717*G0_6_0_1 - 0.0217027417027413*G0_6_1_0 - 0.000923520923520629*G0_6_1_1 - 0.0415584415584413*G0_7_0_0 + 0.127907647907647*G0_7_0_1 + 0.122366522366523*G0_7_1_0 + 0.428513708513706*G0_7_1_1 + 0.0415584415584416*G0_8_0_0 + 0.163924963924963*G0_8_0_1 + 0.169466089466088*G0_8_1_0 - 0.136681096681096*G0_8_1_1 + 0.188398268398267*G0_9_0_1 + 0.188398268398268*G0_9_1_0 + 0.188398268398267*G0_9_1_1; + A[179] = A[221] + 0.0347859547859544*G0_0_0_1 - 0.0347859547859544*G0_0_1_0 + 0.0548981882315216*G0_1_0_1 - 0.0548981882315216*G0_1_1_0 + 0.0109796376463042*G0_2_0_1 - 0.0109796376463042*G0_2_1_0 + 0.0881962481962476*G0_3_0_1 - 0.0881962481962476*G0_3_1_0 - 0.00600288600288611*G0_4_0_1 + 0.00600288600288611*G0_4_1_0 - 0.0466378066378068*G0_5_0_1 + 0.0466378066378068*G0_5_1_0 + 0.0475613275613272*G0_6_0_1 - 0.0475613275613271*G0_6_1_0 - 0.078037518037518*G0_7_0_1 + 0.078037518037518*G0_7_1_0 - 0.083578643578643*G0_8_0_1 + 0.083578643578643*G0_8_1_0 - 0.0221645021645021*G0_9_0_1 + 0.0221645021645021*G0_9_1_0; + A[219] = A[149] + 0.0548981882315221*G0_0_0_1 - 0.0548981882315221*G0_0_1_0 + 0.0347859547859547*G0_1_0_1 - 0.0347859547859547*G0_1_1_0 + 0.0109796376463046*G0_2_0_1 - 0.0109796376463046*G0_2_1_0 - 0.0466378066378063*G0_3_0_1 + 0.0466378066378062*G0_3_1_0 + 0.0475613275613284*G0_4_0_1 - 0.0475613275613284*G0_4_1_0 + 0.088196248196248*G0_5_0_1 - 0.088196248196248*G0_5_1_0 - 0.00600288600288581*G0_6_0_1 + 0.00600288600288582*G0_6_1_0 - 0.0835786435786414*G0_7_0_1 + 0.0835786435786414*G0_7_1_0 - 0.078037518037518*G0_8_0_1 + 0.078037518037518*G0_8_1_0 - 0.0221645021645016*G0_9_0_1 + 0.0221645021645016*G0_9_1_0; + A[103] = A[219] + 0.119544652877986*G0_0_0_0 - 0.119544652877985*G0_0_1_1 + 0.0380695847362514*G0_1_0_0 + 0.0317075517075517*G0_1_0_1 + 0.0555138688472019*G0_1_1_0 + 0.0455603655603653*G0_1_1_1 - 0.0455603655603652*G0_2_0_0 - 0.0317075517075514*G0_2_0_1 - 0.0555138688472016*G0_2_1_0 - 0.0380695847362509*G0_2_1_1 + 0.153304473304473*G0_3_0_0 + 0.164848484848485*G0_3_0_1 + 0.0706493506493501*G0_3_1_0 + 0.0960461760461754*G0_3_1_1 - 0.0960461760461749*G0_4_0_0 - 0.164848484848484*G0_4_0_1 - 0.0706493506493495*G0_4_1_0 - 0.153304473304473*G0_4_1_1 + 0.495007215007212*G0_5_0_0 + 0.0651082251082249*G0_5_0_1 + 0.236883116883116*G0_5_1_0 + 0.0748051948051954*G0_5_1_1 - 0.0313997113997112*G0_6_0_0 - 0.0041558441558444*G0_6_0_1 + 0.0678787878787876*G0_6_1_0 + 0.0304761904761898*G0_6_1_1 - 0.0748051948051946*G0_7_0_0 - 0.0651082251082261*G0_7_0_1 - 0.236883116883115*G0_7_1_0 - 0.495007215007212*G0_7_1_1 - 0.0304761904761904*G0_8_0_0 + 0.00415584415584557*G0_8_0_1 - 0.0678787878787876*G0_8_1_0 + 0.0313997113997115*G0_8_1_1 + 0.14961038961039*G0_9_0_0 - 0.149610389610389*G0_9_1_1; + A[201] = A[103] - 0.0548981882315213*G0_0_0_1 + 0.0548981882315213*G0_0_1_0 - 0.0109796376463044*G0_1_0_1 + 0.0109796376463044*G0_1_1_0 - 0.0347859547859548*G0_2_0_1 + 0.0347859547859548*G0_2_1_0 - 0.0475613275613283*G0_3_0_1 + 0.0475613275613283*G0_3_1_0 + 0.0466378066378066*G0_4_0_1 - 0.0466378066378066*G0_4_1_0 + 0.083578643578643*G0_5_0_1 - 0.083578643578643*G0_5_1_0 + 0.0780375180375178*G0_6_0_1 - 0.0780375180375178*G0_6_1_0 - 0.0881962481962478*G0_7_0_1 + 0.0881962481962478*G0_7_1_0 + 0.00600288600288488*G0_8_0_1 - 0.00600288600288487*G0_8_1_0 + 0.0221645021645018*G0_9_0_1 - 0.0221645021645018*G0_9_1_0; + A[59] = -A[179] - 0.0112874779541445*G0_0_0_0 + 0.0552060285393616*G0_0_0_1 + 0.0236010902677567*G0_1_0_0 + 0.104665704665704*G0_2_0_0 + 0.0205226871893539*G0_2_0_1 - 0.262279942279941*G0_3_0_0 + 0.0738816738816743*G0_3_0_1 + 0.219797979797979*G0_4_0_0 + 0.134834054834054*G0_4_0_1 + 0.0240115440115437*G0_5_0_0 - 0.0960461760461764*G0_5_0_1 + 0.705569985569981*G0_6_0_0 + 0.0203174603174605*G0_6_0_1 + 0.0166233766233767*G0_7_0_0 - 0.123751803751804*G0_7_0_1 + 0.0221645021645018*G0_8_0_0 - 0.0738816738816729*G0_8_0_1 + 0.105281385281384*G0_9_0_0 - 0.0110822510822509*G0_9_0_1; + A[196] = A[28] - 0.0124803591470257*G0_0_0_1 + 0.0124803591470257*G0_0_1_0 + 0.0124803591470257*G0_2_0_1 - 0.0124803591470257*G0_2_1_0 + 0.102741702741702*G0_3_0_1 - 0.102741702741702*G0_3_1_0 - 0.058297258297258*G0_4_0_1 + 0.058297258297258*G0_4_1_0 + 0.00242424242424242*G0_5_0_1 - 0.00242424242424242*G0_5_1_0 - 0.00242424242424254*G0_6_0_1 + 0.00242424242424254*G0_6_1_0 + 0.058297258297258*G0_7_0_1 - 0.058297258297258*G0_7_1_0 - 0.102741702741702*G0_8_0_1 + 0.102741702741702*G0_8_1_0; + A[209] = A[223] - 0.0837325637325635*G0_0_0_1 + 0.0837325637325635*G0_0_1_0 - 0.00246272246272236*G0_1_0_1 + 0.00246272246272236*G0_1_1_0 - 0.00246272246272179*G0_2_0_1 + 0.00246272246272179*G0_2_1_0 - 0.321385281385281*G0_3_0_1 + 0.321385281385281*G0_3_1_0 - 0.321385281385281*G0_4_0_1 + 0.321385281385281*G0_4_1_0 + 0.166233766233766*G0_5_0_1 - 0.166233766233766*G0_5_1_0 - 0.199480519480518*G0_6_0_1 + 0.199480519480518*G0_6_1_0 + 0.166233766233767*G0_7_0_1 - 0.166233766233767*G0_7_1_0 - 0.199480519480518*G0_8_0_1 + 0.199480519480518*G0_8_1_0 + 0.797922077922075*G0_9_0_1 - 0.797922077922075*G0_9_1_0; + A[117] = A[209] + 0.0760750360750359*G0_0_0_0 + 0.0673785473785474*G0_0_0_1 - 0.0413660413660408*G0_0_1_0 - 0.168273208273207*G0_0_1_1 + 0.13079365079365*G0_1_0_0 + 0.123828763828763*G0_1_0_1 + 0.1202886002886*G0_1_1_0 + 0.0937373737373733*G0_1_1_1 + 0.147763347763347*G0_2_0_0 + 0.114824434824434*G0_2_0_1 + 0.117671957671958*G0_2_1_0 + 0.139413179413179*G0_2_1_1 - 0.413506493506491*G0_3_0_0 - 0.247272727272725*G0_3_0_1 - 0.557922077922075*G0_3_1_0 - 0.180779220779218*G0_3_1_1 + 0.317922077922077*G0_4_0_0 + 0.372987012987012*G0_4_0_1 - 0.0145454545454555*G0_4_1_0 + 0.0955844155844146*G0_4_1_1 - 0.126753246753247*G0_5_0_0 + 0.822510822510819*G0_5_1_0 - 0.17073593073593*G0_5_1_1 + 0.7625974025974*G0_6_0_0 + 0.4*G0_6_0_1 - 0.0387878787878777*G0_6_1_0 + 0.298874458874458*G0_6_1_1 + 0.00519480519480527*G0_7_0_0 + 0.0772294372294361*G0_7_0_1 + 0.144761904761905*G0_7_1_0 - 0.563809523809521*G0_7_1_1 - 0.0550649350649347*G0_8_0_0 - 0.0277056277056275*G0_8_0_1 - 0.244848484848483*G0_8_1_0 + 0.905281385281381*G0_8_1_1 + 0.374025974025973*G0_9_0_0 - 0.525714285714283*G0_9_0_1 + 0.0477922077922091*G0_9_1_0 + 0.261818181818181*G0_9_1_1; + A[110] = -A[117] + 0.112720859387526*G0_0_0_0 + 0.0472150072150074*G0_0_0_1 + 0.0099791566458238*G0_0_1_0 - 0.157113997113996*G0_0_1_1 + 0.0486644219977551*G0_1_0_0 + 0.0657239057239054*G0_1_0_1 + 0.0718807118807117*G0_1_1_0 + 0.528715728715726*G0_2_0_0 + 0.204329004329003*G0_2_0_1 + 0.451165624498955*G0_2_1_0 + 0.157113997113996*G0_2_1_1 - 0.200404040404039*G0_3_0_0 - 0.204329004329003*G0_3_0_1 - 0.228571428571427*G0_3_1_0 - 0.107359307359307*G0_3_1_1 + 0.891890331890327*G0_4_0_0 + 0.967272727272723*G0_4_0_1 + 0.783376623376619*G0_4_1_0 + 0.815930735930731*G0_4_1_1 - 0.330158730158729*G0_5_0_0 + 0.0422510822510816*G0_5_0_1 + 0.729350649350646*G0_5_1_0 - 0.213679653679652*G0_5_1_1 - 0.116132756132757*G0_6_0_0 + 0.255930735930735*G0_6_0_1 - 0.0907359307359315*G0_6_1_0 + 0.213679653679652*G0_6_1_1 - 0.0147763347763348*G0_7_0_0 + 0.151341991341991*G0_7_0_1 + 0.0491774891774896*G0_7_1_0 - 0.815930735930731*G0_7_1_1 - 0.0404040404040402*G0_8_0_0 - 0.0969696969696969*G0_8_0_1 - 0.119134199134199*G0_8_1_0 + 0.107359307359307*G0_8_1_1 + 0.288138528138527*G0_9_0_0 + 0.607445887445885*G0_9_0_1 + 0.383722943722944*G0_9_1_0; + A[65] = -A[110] - 0.0154433221099887*G0_0_0_0 + 0.0420202020202021*G0_0_0_1 - 0.0134423601090267*G0_0_1_0 - 0.0334776334776332*G0_0_1_1 + 0.0154433221099887*G0_1_0_0 + 0.00923520923520917*G0_1_0_1 + 0.00200096200096211*G0_1_1_0 - 0.168388648388648*G0_1_1_1 + 0.0815776815776813*G0_2_0_1 + 0.322975789642455*G0_2_1_0 + 0.0642616642616639*G0_2_1_1 - 0.115440115440115*G0_3_0_0 - 0.0845021645021641*G0_3_0_1 - 0.0701875901875895*G0_3_1_0 - 0.172467532467532*G0_3_1_1 + 0.52178932178932*G0_4_0_0 + 1.17748917748917*G0_4_0_1 + 0.250505050505049*G0_4_1_0 + 0.490389610389608*G0_4_1_1 + 0.115440115440115*G0_5_0_0 - 0.126060606060606*G0_5_0_1 + 0.045252525252525*G0_5_1_0 + 0.0055411255411258*G0_5_1_1 - 0.52178932178932*G0_6_0_0 - 0.271284271284271*G0_6_1_0 - 0.137142857142857*G0_6_1_1 - 0.00138528138528146*G0_7_0_0 - 0.0609523809523806*G0_7_0_1 + 0.00438672438672437*G0_7_1_0 - 0.00415584415584344*G0_7_1_1 + 0.00138528138528137*G0_8_0_0 - 0.00415584415584403*G0_8_0_1 + 0.00577200577200615*G0_8_1_0 - 0.302683982683982*G0_8_1_1 + 0.252121212121211*G0_9_0_1 - 0.106666666666666*G0_9_1_0 - 0.30060606060606*G0_9_1_1; + A[113] = -A[110] - 0.00224466891133567*G0_0_0_1 - 0.178483245149911*G0_0_1_1 - 0.0504729838063174*G0_1_0_1 - 0.0696488696488697*G0_1_1_1 - 0.24165464165464*G0_2_0_1 - 0.258842392175724*G0_2_1_1 + 0.175468975468975*G0_3_0_1 + 0.193593073593073*G0_3_1_1 - 0.0461760461760465*G0_4_0_1 - 0.107359307359308*G0_4_1_1 + 0.0184704184704186*G0_5_0_1 - 0.145800865800865*G0_5_1_1 - 0.701875901875901*G0_6_0_1 - 0.491774891774892*G0_6_1_1 + 0.017893217893218*G0_7_0_1 - 0.391341991341989*G0_7_1_1 + 0.0733044733044727*G0_8_0_1 + 0.157575757575757*G0_8_1_1 - 0.36017316017316*G0_9_0_1 - 0.553419913419912*G0_9_1_1; + A[97] = A[113] - 0.0510117043450376*G0_0_0_0 + 0.0242552509219171*G0_0_0_1 + 0.00991502324835675*G0_0_1_0 - 0.221119127785793*G0_0_1_1 + 0.007452300785634*G0_1_0_0 + 0.00745230078563412*G0_1_0_1 + 0.00745230078563399*G0_1_1_0 + 0.306301106301104*G0_2_0_0 + 0.23103415103415*G0_2_0_1 + 0.24537437870771*G0_2_1_0 + 0.221119127785793*G0_2_1_1 - 0.0708802308802302*G0_3_0_0 - 0.104126984126984*G0_3_0_1 - 0.0324386724386719*G0_3_1_0 - 0.0955844155844151*G0_3_1_1 + 0.138297258297257*G0_4_0_0 + 0.217258297258297*G0_4_0_1 + 0.0389033189033181*G0_4_1_0 + 0.156536796536796*G0_4_1_1 + 0.0985858585858588*G0_5_0_0 - 0.612063492063489*G0_5_0_1 + 0.246464646464646*G0_5_1_0 - 0.270476190476189*G0_5_1_1 - 0.193708513708515*G0_6_0_0 + 0.516940836940836*G0_6_0_1 - 0.341587301587301*G0_6_1_0 + 0.27047619047619*G0_6_1_1 - 0.0386724386724384*G0_7_0_0 - 0.117633477633478*G0_7_0_1 + 0.0607215007215008*G0_7_1_0 - 0.156536796536796*G0_7_1_1 + 0.0298989898989898*G0_8_0_0 + 0.0631457431457433*G0_8_0_1 - 0.00854256854256865*G0_8_1_0 + 0.0955844155844151*G0_8_1_1 - 0.124675324675325*G0_9_0_0 - 0.124675324675324*G0_9_0_1 - 0.124675324675324*G0_9_1_0; + A[111] = A[97] + 0.000128266794934129*G0_0_0_1 - 0.000128266794934139*G0_0_1_0 + 0.0432387365720698*G0_1_0_1 - 0.0432387365720698*G0_1_1_0 + 0.0144684944684942*G0_2_0_1 - 0.0144684944684942*G0_2_1_0 - 0.0688023088023083*G0_3_0_1 + 0.0688023088023083*G0_3_1_0 - 0.0144300144300147*G0_4_0_1 + 0.0144300144300147*G0_4_1_0 + 0.809235209235206*G0_5_0_1 - 0.809235209235206*G0_5_1_0 - 0.0492929292929294*G0_6_0_1 + 0.0492929292929294*G0_6_1_0 + 0.163924963924964*G0_7_0_1 - 0.163924963924964*G0_7_1_0 - 0.14049062049062*G0_8_0_1 + 0.14049062049062*G0_8_1_0 + 0.359480519480519*G0_9_0_1 - 0.359480519480519*G0_9_1_0; + A[159] = A[97] - 0.323104056437389*G0_0_0_0 + 0.323104056437388*G0_0_1_1 - 0.145005611672278*G0_1_0_0 - 0.115209235209234*G0_1_0_1 - 0.14397947731281*G0_1_1_0 - 0.0987397787397779*G0_1_1_1 + 0.0987397787397778*G0_2_0_0 + 0.115209235209234*G0_2_0_1 + 0.14397947731281*G0_2_1_0 + 0.145005611672278*G0_2_1_1 - 0.387186147186145*G0_3_0_0 - 0.451601731601729*G0_3_0_1 - 0.397229437229435*G0_3_1_0 - 0.460259740259737*G0_3_1_1 + 0.460259740259738*G0_4_0_0 + 0.451601731601729*G0_4_0_1 + 0.397229437229435*G0_4_1_0 + 0.387186147186145*G0_4_1_1 - 0.597748917748915*G0_5_0_0 + 0.46199134199134*G0_5_0_1 - 0.183318903318903*G0_5_1_0 + 0.354632034632033*G0_5_1_1 + 0.366060606060605*G0_6_0_0 + 0.246580086580085*G0_6_0_1 + 0.155382395382395*G0_6_1_0 + 0.151341991341991*G0_6_1_1 - 0.354632034632033*G0_7_0_0 - 0.461991341991338*G0_7_0_1 + 0.183318903318902*G0_7_1_0 + 0.597748917748915*G0_7_1_1 - 0.151341991341991*G0_8_0_0 - 0.246580086580086*G0_8_0_1 - 0.155382395382395*G0_8_1_0 - 0.366060606060604*G0_8_1_1 - 0.252813852813852*G0_9_0_0 + 0.252813852813852*G0_9_1_1; + A[79] = A[65] - 0.0432387365720699*G0_0_0_1 + 0.0432387365720699*G0_0_1_0 - 0.0144684944684945*G0_1_0_1 + 0.0144684944684945*G0_1_1_0 - 0.000128266794933191*G0_2_0_1 + 0.000128266794933204*G0_2_1_0 + 0.0492929292929292*G0_3_0_1 - 0.0492929292929292*G0_3_1_0 - 0.809235209235206*G0_4_0_1 + 0.809235209235206*G0_4_1_0 + 0.14049062049062*G0_5_0_1 - 0.14049062049062*G0_5_1_0 - 0.163924963924963*G0_6_0_1 + 0.163924963924963*G0_6_1_0 + 0.0688023088023084*G0_7_0_1 - 0.0688023088023084*G0_7_1_0 + 0.0144300144300144*G0_8_0_1 - 0.0144300144300144*G0_8_1_0 - 0.359480519480519*G0_9_0_1 + 0.359480519480519*G0_9_1_0; + A[187] = A[117] - 0.0250120250120247*G0_0_0_1 + 0.0250120250120247*G0_0_1_0 - 0.00107744107744114*G0_1_0_1 + 0.00107744107744114*G0_1_1_0 + 0.00531024531024547*G0_2_0_1 - 0.00531024531024547*G0_2_1_0 + 0.0107359307359308*G0_3_0_1 - 0.0107359307359308*G0_3_1_0 - 0.0661471861471865*G0_4_0_1 + 0.0661471861471865*G0_4_1_0 + 0.656277056277054*G0_5_0_1 - 0.656277056277054*G0_5_1_0 - 0.239307359307359*G0_6_0_1 + 0.239307359307359*G0_6_1_0 - 0.0987012987012977*G0_7_0_1 + 0.0987012987012977*G0_7_1_0 - 0.0176623376623378*G0_8_0_1 + 0.0176623376623377*G0_8_1_0 - 0.224415584415583*G0_9_0_1 + 0.224415584415583*G0_9_1_0; + A[82] = A[110] - 0.0122238255571588*G0_0_0_1 + 0.0122238255571588*G0_0_1_0 + 0.00723424723424742*G0_1_0_1 - 0.00723424723424743*G0_1_1_0 + 0.241526374859707*G0_2_0_1 - 0.241526374859707*G0_2_1_0 - 0.0349783549783545*G0_3_0_1 + 0.0349783549783545*G0_3_1_0 - 0.117748917748917*G0_4_0_1 + 0.117748917748917*G0_4_1_0 + 0.0308225108225107*G0_5_0_1 - 0.0308225108225107*G0_5_1_0 - 0.107359307359307*G0_6_0_1 + 0.107359307359307*G0_6_1_0 - 0.00346320346320343*G0_7_0_1 + 0.00346320346320344*G0_7_1_0 - 0.0045021645021642*G0_8_0_1 + 0.0045021645021642*G0_8_1_0 + 0.000692640692641085*G0_9_0_1 - 0.000692640692641126*G0_9_1_0; + A[153] = A[82] - 0.0254866121532787*G0_0_0_0 + 0.0254866121532786*G0_0_1_1 + 0.0998300464967124*G0_1_0_0 + 0.381901555234887*G0_1_0_1 + 0.147609427609427*G0_1_1_0 + 0.474689754689752*G0_1_1_1 - 0.474689754689752*G0_2_0_0 - 0.381901555234886*G0_2_0_1 - 0.147609427609427*G0_2_1_0 - 0.0998300464967124*G0_2_1_1 + 0.507243867243864*G0_3_0_0 + 0.468571428571426*G0_3_0_1 + 0.551341991341988*G0_3_1_0 + 0.500548340548337*G0_3_1_1 - 0.500548340548337*G0_4_0_0 - 0.468571428571426*G0_4_0_1 - 0.551341991341988*G0_4_1_0 - 0.507243867243864*G0_4_1_1 - 0.0487157287157287*G0_5_0_0 - 0.00242424242424275*G0_5_0_1 + 0.0318614718614717*G0_5_1_0 + 0.0229725829725825*G0_5_1_1 + 0.0808080808080817*G0_6_0_0 + 0.177662337662338*G0_6_0_1 + 0.0748051948051956*G0_6_1_0 + 0.0998556998557001*G0_6_1_1 - 0.022972582972583*G0_7_0_0 + 0.00242424242424191*G0_7_0_1 - 0.0318614718614718*G0_7_1_0 + 0.0487157287157281*G0_7_1_1 - 0.0998556998556992*G0_8_0_0 - 0.177662337662336*G0_8_0_1 - 0.0748051948051942*G0_8_1_0 - 0.0808080808080797*G0_8_1_1 - 0.175930735930735*G0_9_0_0 + 0.175930735930736*G0_9_1_1; + A[68] = -A[65] + 0.0504729838063172*G0_0_0_1 - 0.0191758858425523*G0_0_1_1 + 0.00224466891133576*G0_1_0_1 - 0.176238576238576*G0_1_1_1 + 0.24165464165464*G0_2_0_1 - 0.0171877505210841*G0_2_1_1 - 0.0184704184704181*G0_3_0_1 - 0.164271284271284*G0_3_1_1 + 0.701875901875899*G0_4_0_1 + 0.21010101010101*G0_4_1_1 - 0.175468975468975*G0_5_0_1 + 0.0181240981240983*G0_5_1_1 + 0.0461760461760452*G0_6_0_1 - 0.0611832611832617*G0_6_1_1 - 0.0733044733044727*G0_7_0_1 + 0.0842712842712848*G0_7_1_1 - 0.0178932178932174*G0_8_0_1 - 0.409235209235208*G0_8_1_1 + 0.36017316017316*G0_9_0_1 - 0.193246753246752*G0_9_1_1; + A[169] = A[68] - 0.0266281866281864*G0_0_0_0 + 0.0266281866281864*G0_0_1_1 + 0.0338239538239534*G0_1_0_0 + 0.314676928010261*G0_1_0_1 + 0.0609267275933936*G0_1_1_0 + 0.482539682539681*G0_1_1_1 - 0.482539682539679*G0_2_0_0 - 0.314676928010259*G0_2_0_1 - 0.0609267275933933*G0_2_1_0 - 0.0338239538239531*G0_2_1_1 + 0.11151515151515*G0_3_0_0 + 0.00969696969696993*G0_3_0_1 + 0.147878787878787*G0_3_1_0 - 0.0294372294372289*G0_3_1_1 + 0.0294372294372308*G0_4_0_0 - 0.00969696969696889*G0_4_0_1 - 0.147878787878786*G0_4_1_0 - 0.11151515151515*G0_4_1_1 + 0.155151515151514*G0_5_0_0 + 0.0689177489177479*G0_5_0_1 + 0.038441558441558*G0_5_1_0 + 0.0117748917748913*G0_5_1_1 - 0.547532467532464*G0_6_0_0 + 0.0148917748917761*G0_6_0_1 - 0.0993939393939386*G0_6_1_0 + 0.0225108225108233*G0_6_1_1 - 0.0117748917748918*G0_7_0_0 - 0.0689177489177492*G0_7_0_1 - 0.0384415584415582*G0_7_1_0 - 0.155151515151515*G0_7_1_1 - 0.0225108225108223*G0_8_0_0 - 0.0148917748917744*G0_8_0_1 + 0.0993939393939387*G0_8_1_0 + 0.547532467532465*G0_8_1_1 - 0.0685714285714278*G0_9_0_0 + 0.0685714285714287*G0_9_1_1; + A[71] = A[169] - 0.00723424723424741*G0_0_0_1 + 0.00723424723424741*G0_0_1_0 - 0.241526374859708*G0_1_0_1 + 0.241526374859708*G0_1_1_0 + 0.0122238255571587*G0_2_0_1 - 0.0122238255571587*G0_2_1_0 + 0.107359307359306*G0_3_0_1 - 0.107359307359306*G0_3_1_0 - 0.0308225108225105*G0_4_0_1 + 0.0308225108225105*G0_4_1_0 + 0.00450216450216461*G0_5_0_1 - 0.00450216450216461*G0_5_1_0 + 0.00346320346320344*G0_6_0_1 - 0.00346320346320344*G0_6_1_0 + 0.0349783549783552*G0_7_0_1 - 0.0349783549783552*G0_7_1_0 + 0.117748917748916*G0_8_0_1 - 0.117748917748916*G0_8_1_0 - 0.000692640692640932*G0_9_0_1 + 0.000692640692640974*G0_9_1_0; + A[55] = A[153] + 0.0122238255571588*G0_0_0_1 - 0.0122238255571588*G0_0_1_0 - 0.241526374859708*G0_1_0_1 + 0.241526374859708*G0_1_1_0 - 0.00723424723424722*G0_2_0_1 + 0.00723424723424722*G0_2_1_0 + 0.117748917748916*G0_3_0_1 - 0.117748917748916*G0_3_1_0 + 0.0349783549783551*G0_4_0_1 - 0.0349783549783551*G0_4_1_0 + 0.0034632034632037*G0_5_0_1 - 0.0034632034632037*G0_5_1_0 + 0.00450216450216467*G0_6_0_1 - 0.00450216450216467*G0_6_1_0 - 0.0308225108225103*G0_7_0_1 + 0.0308225108225103*G0_7_1_0 + 0.107359307359306*G0_8_0_1 - 0.107359307359306*G0_8_1_0 - 0.000692640692640877*G0_9_0_1 + 0.000692640692640877*G0_9_1_0; + A[175] = -A[55] - 0.178483245149911*G0_0_0_0 - 0.00224466891133563*G0_0_0_1 - 0.258842392175725*G0_1_0_0 - 0.241654641654641*G0_1_0_1 - 0.0696488696488694*G0_2_0_0 - 0.0504729838063168*G0_2_0_1 - 0.107359307359307*G0_3_0_0 - 0.0461760461760458*G0_3_0_1 + 0.193593073593073*G0_4_0_0 + 0.175468975468975*G0_4_0_1 - 0.391341991341989*G0_5_0_0 + 0.0178932178932179*G0_5_0_1 + 0.157575757575757*G0_6_0_0 + 0.0733044733044732*G0_6_0_1 - 0.145800865800865*G0_7_0_0 + 0.0184704184704184*G0_7_0_1 - 0.49177489177489*G0_8_0_0 - 0.701875901875899*G0_8_0_1 - 0.553419913419912*G0_9_0_0 - 0.360173160173159*G0_9_0_1; + A[127] = A[113] + 0.0144684944684945*G0_0_0_1 - 0.0144684944684945*G0_0_1_0 + 0.0432387365720699*G0_1_0_1 - 0.0432387365720699*G0_1_1_0 + 0.000128266794933551*G0_2_0_1 - 0.000128266794933662*G0_2_1_0 - 0.14049062049062*G0_3_0_1 + 0.14049062049062*G0_3_1_0 + 0.163924963924964*G0_4_0_1 - 0.163924963924964*G0_4_1_0 - 0.0492929292929294*G0_5_0_1 + 0.0492929292929294*G0_5_1_0 + 0.809235209235208*G0_6_0_1 - 0.809235209235208*G0_6_1_0 - 0.0144300144300146*G0_7_0_1 + 0.0144300144300146*G0_7_1_0 - 0.0688023088023084*G0_8_0_1 + 0.0688023088023084*G0_8_1_0 + 0.359480519480518*G0_9_0_1 - 0.359480519480519*G0_9_1_0; + A[49] = -A[169] - 0.0191758858425525*G0_0_0_0 + 0.0504729838063173*G0_0_0_1 - 0.0171877505210841*G0_1_0_0 + 0.241654641654642*G0_1_0_1 - 0.176238576238575*G0_2_0_0 + 0.00224466891133572*G0_2_0_1 + 0.210101010101008*G0_3_0_0 + 0.7018759018759*G0_3_0_1 - 0.164271284271283*G0_4_0_0 - 0.0184704184704184*G0_4_0_1 + 0.084271284271284*G0_5_0_0 - 0.0733044733044732*G0_5_0_1 - 0.409235209235207*G0_6_0_0 - 0.0178932178932179*G0_6_0_1 + 0.0181240981240981*G0_7_0_0 - 0.175468975468975*G0_7_0_1 - 0.0611832611832607*G0_8_0_0 + 0.0461760461760471*G0_8_0_1 - 0.193246753246753*G0_9_0_0 + 0.36017316017316*G0_9_0_1; + A[124] = -A[79] + 0.0504729838063172*G0_0_1_0 - 0.0191758858425523*G0_0_1_1 + 0.00224466891133576*G0_1_1_0 - 0.176238576238576*G0_1_1_1 + 0.24165464165464*G0_2_1_0 - 0.017187750521084*G0_2_1_1 - 0.0184704184704181*G0_3_1_0 - 0.164271284271284*G0_3_1_1 + 0.701875901875899*G0_4_1_0 + 0.21010101010101*G0_4_1_1 - 0.175468975468975*G0_5_1_0 + 0.0181240981240983*G0_5_1_1 + 0.0461760461760452*G0_6_1_0 - 0.0611832611832617*G0_6_1_1 - 0.0733044733044727*G0_7_1_0 + 0.0842712842712848*G0_7_1_1 - 0.0178932178932174*G0_8_1_0 - 0.409235209235208*G0_8_1_1 + 0.36017316017316*G0_9_1_0 - 0.193246753246752*G0_9_1_1; + A[161] = -A[153] - 0.178483245149911*G0_0_0_0 - 0.00224466891133563*G0_0_1_0 - 0.258842392175725*G0_1_0_0 - 0.241654641654641*G0_1_1_0 - 0.0696488696488694*G0_2_0_0 - 0.0504729838063168*G0_2_1_0 - 0.107359307359307*G0_3_0_0 - 0.0461760461760457*G0_3_1_0 + 0.193593073593073*G0_4_0_0 + 0.175468975468975*G0_4_1_0 - 0.391341991341989*G0_5_0_0 + 0.0178932178932179*G0_5_1_0 + 0.157575757575757*G0_6_0_0 + 0.0733044733044732*G0_6_1_0 - 0.145800865800865*G0_7_0_0 + 0.0184704184704183*G0_7_1_0 - 0.49177489177489*G0_8_0_0 - 0.701875901875899*G0_8_1_0 - 0.553419913419912*G0_9_0_0 - 0.360173160173159*G0_9_1_0; + A[162] = A[187] - 0.244348244348243*G0_0_0_0 + 0.244348244348243*G0_0_1_1 + 0.00861952861952884*G0_1_0_0 - 0.00261664261664281*G0_1_0_1 - 0.00900432900432897*G0_1_1_0 + 0.0540259740259736*G0_1_1_1 - 0.0540259740259742*G0_2_0_0 + 0.00261664261664205*G0_2_0_1 + 0.00900432900432872*G0_2_1_0 - 0.00861952861952881*G0_2_1_1 + 0.509090909090906*G0_3_0_0 + 0.54337662337662*G0_3_0_1 + 0.620259740259737*G0_3_1_0 + 0.498701298701296*G0_3_1_1 - 0.498701298701297*G0_4_0_0 - 0.543376623376621*G0_4_0_1 - 0.620259740259738*G0_4_1_0 - 0.509090909090907*G0_4_1_1 - 0.437056277056273*G0_5_0_0 - 0.677748917748915*G0_5_0_1 + 0.0772294372294384*G0_5_1_0 + 0.175930735930735*G0_5_1_1 + 0.142683982683982*G0_6_0_0 - 0.206060606060605*G0_6_0_1 - 0.427705627705627*G0_6_1_0 - 0.353939393939393*G0_6_1_1 - 0.175930735930735*G0_7_0_0 + 0.677748917748913*G0_7_0_1 - 0.0772294372294369*G0_7_1_0 + 0.437056277056274*G0_7_1_1 + 0.353939393939393*G0_8_0_0 + 0.206060606060605*G0_8_0_1 + 0.427705627705626*G0_8_1_0 - 0.142683982683982*G0_8_1_1 - 0.112207792207792*G0_9_0_0 + 0.112207792207791*G0_9_1_1; + A[214] = A[162] + 0.0538720538720527*G0_0_0_0 - 0.0477152477152477*G0_0_0_1 - 0.0716498316498316*G0_0_1_0 - 0.079499759499759*G0_0_1_1 - 0.0453294853294856*G0_1_0_0 - 0.0453294853294854*G0_1_0_1 - 0.0453294853294856*G0_1_1_0 - 0.0937373737373726*G0_2_0_0 + 0.00784992784992808*G0_2_0_1 + 0.0317845117845111*G0_2_1_0 + 0.0794997594997588*G0_2_1_1 - 0.603290043290039*G0_3_0_0 - 0.797575757575753*G0_3_0_1 - 0.62441558441558*G0_3_1_0 - 0.486233766233762*G0_3_1_1 - 1.21627705627705*G0_4_0_0 - 0.244848484848485*G0_4_0_1 - 0.890389610389607*G0_4_1_0 - 0.245194805194805*G0_4_1_1 + 1.01056277056276*G0_5_0_0 + 0.0162770562770565*G0_5_0_1 - 0.0647619047619049*G0_5_1_0 - 0.0270129870129869*G0_5_1_1 - 1.03203463203463*G0_6_0_0 - 0.0377489177489187*G0_6_0_1 + 0.0432900432900422*G0_6_1_0 + 0.027012987012987*G0_6_1_1 + 0.326233766233765*G0_7_0_0 - 0.645194805194801*G0_7_0_1 + 0.000346320346319942*G0_7_1_0 + 0.245194805194804*G0_7_1_1 - 0.332467532467531*G0_8_0_0 - 0.138181818181817*G0_8_0_1 - 0.311341991341991*G0_8_1_0 + 0.486233766233764*G0_8_1_1 - 0.810389610389608*G0_9_0_0 - 0.810389610389608*G0_9_0_1 - 0.810389610389609*G0_9_1_0; + A[100] = -A[162] - 0.016354016354016*G0_0_0_0 - 0.017123617123617*G0_0_0_1 - 0.2336379669713*G0_0_1_0 + 0.146544813211479*G0_0_1_1 + 0.0163540163540165*G0_1_0_0 + 0.0295526695526694*G0_1_0_1 + 0.0364662497995832*G0_1_1_0 + 0.046176046176046*G0_1_1_1 + 0.0452525252525248*G0_2_0_1 + 0.039095719095719*G0_2_1_0 + 0.0220362353695686*G0_2_1_1 + 0.375411255411253*G0_3_0_0 + 0.335238095238093*G0_3_0_1 + 0.404848484848482*G0_3_1_0 + 0.344357864357862*G0_3_1_1 - 0.0477922077922075*G0_4_0_0 - 0.111861471861471*G0_4_0_1 - 0.118095238095238*G0_4_1_0 - 0.0452525252525251*G0_4_1_1 - 0.375411255411253*G0_5_0_0 - 0.0727272727272733*G0_5_0_1 + 0.143722943722943*G0_5_1_0 - 0.0372871572871579*G0_5_1_1 + 0.0477922077922076*G0_6_0_0 - 0.0924675324675317*G0_6_0_1 - 0.0398268398268394*G0_6_1_0 - 0.0521789321789319*G0_6_1_1 - 0.289177489177487*G0_7_0_0 + 0.692987012987009*G0_7_0_1 + 0.144069264069263*G0_7_1_0 - 0.218643578643578*G0_7_1_1 + 0.289177489177488*G0_8_0_0 + 0.0865800865800853*G0_8_0_1 + 0.295064935064934*G0_8_1_0 - 0.0866955266955264*G0_8_1_1 + 0.315151515151514*G0_9_0_1 + 0.538874458874457*G0_9_1_0 + 0.219567099567099*G0_9_1_1; + A[163] = A[162] + 0.173468013468012*G0_0_0_0 - 0.0354016354016355*G0_0_0_1 - 0.0551034151034148*G0_0_1_0 - 0.116209716209715*G0_0_1_1 - 0.173468013468013*G0_1_0_0 - 0.208869648869648*G0_1_0_1 - 0.228571428571427*G0_1_1_0 - 0.147763347763347*G0_1_1_1 - 0.109898989898989*G0_2_0_1 - 0.112053872053871*G0_2_1_0 - 0.11097643097643*G0_2_1_1 - 1.19134199134198*G0_3_0_0 - 1.20380952380952*G0_3_0_1 - 1.368658008658*G0_3_1_0 - 1.37558441558441*G0_3_1_1 + 0.155151515151514*G0_4_0_0 + 0.333852813852812*G0_4_0_1 + 0.326926406926405*G0_4_1_0 + 0.328311688311687*G0_4_1_1 + 1.19134199134198*G0_5_0_0 - 0.0124675324675322*G0_5_0_1 - 0.177316017316018*G0_5_1_0 - 0.00554112554112551*G0_5_1_1 - 0.155151515151514*G0_6_0_0 + 0.178701298701298*G0_6_0_1 + 0.171774891774891*G0_6_1_0 + 0.177316017316017*G0_6_1_1 + 0.50285714285714*G0_7_0_0 - 0.495930735930733*G0_7_0_1 - 0.0789610389610385*G0_7_1_0 + 0.15099567099567*G0_7_1_1 - 0.502857142857141*G0_8_0_0 - 0.998787878787874*G0_8_0_1 - 0.581818181818179*G0_8_1_0 - 1.22874458874458*G0_8_1_1 - 0.698181818181816*G0_9_0_1 - 1.14701298701298*G0_9_1_0 - 0.922597402597399*G0_9_1_1; + A[205] = A[163] + 0.00531024531024563*G0_0_0_1 - 0.00531024531024563*G0_0_1_0 - 0.0250120250120247*G0_1_0_1 + 0.0250120250120247*G0_1_1_0 - 0.00107744107744093*G0_2_0_1 + 0.00107744107744095*G0_2_1_0 - 0.0987012987012977*G0_3_0_1 + 0.0987012987012977*G0_3_1_0 - 0.0176623376623378*G0_4_0_1 + 0.0176623376623379*G0_4_1_0 - 0.0661471861471861*G0_5_0_1 + 0.066147186147186*G0_5_1_0 + 0.0107359307359303*G0_6_0_1 - 0.0107359307359302*G0_6_1_0 - 0.239307359307358*G0_7_0_1 + 0.239307359307358*G0_7_1_0 + 0.656277056277053*G0_8_0_1 - 0.656277056277053*G0_8_1_0 - 0.224415584415584*G0_9_0_1 + 0.224415584415584*G0_9_1_0; + A[119] = A[205] - 0.0453294853294856*G0_0_0_0 + 0.0453294853294854*G0_0_1_1 + 0.0538720538720531*G0_1_0_0 + 0.125521885521885*G0_1_0_1 + 0.101587301587301*G0_1_1_0 + 0.0937373737373732*G0_1_1_1 - 0.0937373737373744*G0_2_0_0 - 0.125521885521885*G0_2_0_1 - 0.101587301587302*G0_2_1_0 - 0.0538720538720537*G0_2_1_1 + 1.01056277056276*G0_3_0_0 + 1.07532467532467*G0_3_0_1 + 0.994285714285709*G0_3_1_0 + 1.03203463203463*G0_3_1_1 - 1.03203463203463*G0_4_0_0 - 1.07532467532467*G0_4_0_1 - 0.99428571428571*G0_4_1_0 - 1.01056277056276*G0_4_1_1 - 0.603290043290039*G0_5_0_0 + 0.0211255411255417*G0_5_0_1 + 0.194285714285714*G0_5_1_0 + 0.332467532467532*G0_5_1_1 - 1.21627705627705*G0_6_0_0 - 0.325887445887444*G0_6_0_1 - 0.97142857142857*G0_6_1_0 - 0.326233766233765*G0_6_1_1 - 0.332467532467531*G0_7_0_0 - 0.0211255411255412*G0_7_0_1 - 0.194285714285712*G0_7_1_0 + 0.603290043290041*G0_7_1_1 + 0.326233766233765*G0_8_0_0 + 0.325887445887445*G0_8_0_1 + 0.971428571428567*G0_8_1_0 + 1.21627705627705*G0_8_1_1 - 0.810389610389607*G0_9_0_0 + 0.810389610389607*G0_9_1_1; + A[217] = A[119] - 0.00531024531024483*G0_0_0_1 + 0.00531024531024483*G0_0_1_0 + 0.00107744107744086*G0_1_0_1 - 0.00107744107744087*G0_1_1_0 + 0.025012025012024*G0_2_0_1 - 0.0250120250120241*G0_2_1_0 + 0.0176623376623379*G0_3_0_1 - 0.0176623376623379*G0_3_1_0 + 0.0987012987012977*G0_4_0_1 - 0.0987012987012976*G0_4_1_0 + 0.239307359307359*G0_5_0_1 - 0.239307359307359*G0_5_1_0 - 0.656277056277056*G0_6_0_1 + 0.656277056277056*G0_6_1_0 + 0.0661471861471866*G0_7_0_1 - 0.0661471861471866*G0_7_1_0 - 0.0107359307359313*G0_8_0_1 + 0.0107359307359313*G0_8_1_0 + 0.224415584415583*G0_9_0_1 - 0.224415584415583*G0_9_1_0; + A[156] = A[100] - 0.241526374859708*G0_0_0_1 + 0.241526374859708*G0_0_1_0 + 0.0122238255571589*G0_1_0_1 - 0.0122238255571589*G0_1_1_0 - 0.00723424723424707*G0_2_0_1 + 0.00723424723424707*G0_2_1_0 + 0.00346320346320381*G0_3_0_1 - 0.00346320346320382*G0_3_1_0 + 0.00450216450216448*G0_4_0_1 - 0.00450216450216448*G0_4_1_0 + 0.117748917748917*G0_5_0_1 - 0.117748917748917*G0_5_1_0 + 0.0349783549783548*G0_6_0_1 - 0.0349783549783548*G0_6_1_0 + 0.107359307359306*G0_7_0_1 - 0.107359307359306*G0_7_1_0 - 0.03082251082251*G0_8_0_1 + 0.03082251082251*G0_8_1_0 - 0.000692640692640675*G0_9_0_1 + 0.000692640692640661*G0_9_1_0; + A[142] = A[156] - 0.0814494147827473*G0_0_0_0 + 0.0814494147827478*G0_0_1_1 + 0.0143017476350811*G0_1_0_0 - 0.00637485970819297*G0_1_0_1 + 0.0130832130832131*G0_1_1_0 + 0.00784992784992778*G0_1_1_1 - 0.00784992784992772*G0_2_0_0 + 0.00637485970819307*G0_2_0_1 - 0.0130832130832129*G0_2_1_0 - 0.0143017476350809*G0_2_1_1 + 0.088427128427128*G0_3_0_0 + 0.0973160173160166*G0_3_0_1 + 0.0962770562770559*G0_3_1_0 + 0.106551226551226*G0_3_1_1 - 0.106551226551226*G0_4_0_0 - 0.0973160173160168*G0_4_0_1 - 0.0962770562770562*G0_4_1_0 - 0.0884271284271281*G0_4_1_1 - 0.280288600288598*G0_5_0_0 + 0.0775757575757576*G0_5_0_1 + 0.0879653679653681*G0_5_1_0 - 0.0759595959595955*G0_5_1_1 + 0.0081962481962479*G0_6_0_0 - 0.0928138528138526*G0_6_0_1 - 0.0270129870129872*G0_6_1_0 - 0.0125829725829727*G0_6_1_1 + 0.0759595959595953*G0_7_0_0 - 0.077575757575757*G0_7_0_1 - 0.0879653679653676*G0_7_1_0 + 0.280288600288599*G0_7_1_1 + 0.012582972582973*G0_8_0_0 + 0.0928138528138523*G0_8_0_1 + 0.0270129870129875*G0_8_1_0 - 0.00819624819624791*G0_8_1_1 + 0.107359307359307*G0_9_0_0 - 0.107359307359307*G0_9_1_1; + A[190] = A[162] + 0.0250120250120249*G0_0_0_1 - 0.0250120250120249*G0_0_1_0 - 0.00531024531024502*G0_1_0_1 + 0.00531024531024504*G0_1_1_0 + 0.0010774410774412*G0_2_0_1 - 0.0010774410774412*G0_2_1_0 + 0.0661471861471857*G0_3_0_1 - 0.0661471861471856*G0_3_1_0 - 0.0107359307359308*G0_4_0_1 + 0.0107359307359308*G0_4_1_0 + 0.0987012987012995*G0_5_0_1 - 0.0987012987012995*G0_5_1_0 + 0.0176623376623374*G0_6_0_1 - 0.0176623376623374*G0_6_1_0 - 0.656277056277052*G0_7_0_1 + 0.656277056277052*G0_7_1_0 + 0.239307359307359*G0_8_0_1 - 0.239307359307359*G0_8_1_0 + 0.224415584415584*G0_9_0_1 - 0.224415584415584*G0_9_1_0; + A[74] = A[214] + 0.00107744107744095*G0_0_0_1 - 0.00107744107744095*G0_0_1_0 - 0.00531024531024521*G0_1_0_1 + 0.00531024531024522*G0_1_1_0 + 0.0250120250120242*G0_2_0_1 - 0.0250120250120242*G0_2_1_0 + 0.239307359307359*G0_3_0_1 - 0.239307359307359*G0_3_1_0 - 0.656277056277053*G0_4_0_1 + 0.656277056277053*G0_4_1_0 + 0.0176623376623382*G0_5_0_1 - 0.0176623376623382*G0_5_1_0 + 0.0987012987012983*G0_6_0_1 - 0.0987012987012983*G0_6_1_0 - 0.0107359307359312*G0_7_0_1 + 0.0107359307359312*G0_7_1_0 + 0.0661471861471851*G0_8_0_1 - 0.0661471861471851*G0_8_1_0 + 0.224415584415583*G0_9_0_1 - 0.224415584415583*G0_9_1_0; + A[199] = A[74] + 0.110976430976431*G0_0_0_0 - 0.110976430976431*G0_0_1_1 + 0.116209716209716*G0_1_0_0 + 0.0861183261183261*G0_1_0_1 + 0.055796055796056*G0_1_1_0 - 0.147763347763347*G0_1_1_1 + 0.147763347763347*G0_2_0_0 - 0.086118326118325*G0_2_0_1 - 0.0557960557960549*G0_2_1_0 - 0.116209716209715*G0_2_1_1 - 0.150995670995669*G0_3_0_0 - 0.886233766233762*G0_3_0_1 + 0.00935064935065072*G0_3_1_0 - 1.22874458874458*G0_3_1_1 + 1.22874458874458*G0_4_0_0 + 0.886233766233763*G0_4_0_1 - 0.0093506493506485*G0_4_1_0 + 0.150995670995671*G0_4_1_1 - 0.328311688311687*G0_5_0_0 - 0.0121212121212123*G0_5_0_1 + 0.0162770562770561*G0_5_1_0 + 0.177316017316017*G0_5_1_1 + 1.37558441558441*G0_6_0_0 + 0.0730735930735939*G0_6_0_1 + 0.105627705627707*G0_6_1_0 - 0.00554112554112549*G0_6_1_1 - 0.177316017316016*G0_7_0_0 + 0.0121212121212128*G0_7_0_1 - 0.0162770562770564*G0_7_1_0 + 0.328311688311688*G0_7_1_1 + 0.00554112554112549*G0_8_0_0 - 0.0730735930735922*G0_8_0_1 - 0.105627705627704*G0_8_1_0 - 1.37558441558441*G0_8_1_1 + 0.922597402597399*G0_9_0_0 - 0.922597402597399*G0_9_1_1; + A[73] = A[199] - 0.00107744107744097*G0_0_0_1 + 0.00107744107744097*G0_0_1_0 - 0.0250120250120249*G0_1_0_1 + 0.0250120250120248*G0_1_1_0 + 0.00531024531024591*G0_2_0_1 - 0.00531024531024591*G0_2_1_0 + 0.656277056277054*G0_3_0_1 - 0.656277056277054*G0_3_1_0 - 0.239307359307359*G0_4_0_1 + 0.239307359307359*G0_4_1_0 + 0.0107359307359302*G0_5_0_1 - 0.0107359307359302*G0_5_1_0 - 0.0661471861471855*G0_6_0_1 + 0.0661471861471855*G0_6_1_0 - 0.0176623376623379*G0_7_0_1 + 0.0176623376623379*G0_7_1_0 - 0.0987012987012967*G0_8_0_1 + 0.0987012987012968*G0_8_1_0 - 0.224415584415583*G0_9_0_1 + 0.224415584415583*G0_9_1_0; + A[145] = A[159] + 0.000128266794933104*G0_0_0_1 - 0.000128266794933104*G0_0_1_0 + 0.0144684944684942*G0_1_0_1 - 0.0144684944684942*G0_1_1_0 + 0.0432387365720696*G0_2_0_1 - 0.0432387365720696*G0_2_1_0 - 0.0144300144300144*G0_3_0_1 + 0.0144300144300144*G0_3_1_0 - 0.0688023088023084*G0_4_0_1 + 0.0688023088023084*G0_4_1_0 + 0.163924963924963*G0_5_0_1 - 0.163924963924963*G0_5_1_0 - 0.14049062049062*G0_6_0_1 + 0.14049062049062*G0_6_1_0 + 0.809235209235204*G0_7_0_1 - 0.809235209235204*G0_7_1_0 - 0.0492929292929293*G0_8_0_1 + 0.0492929292929293*G0_8_1_0 + 0.359480519480518*G0_9_0_1 - 0.359480519480518*G0_9_1_0; + A[114] = A[142] + 0.241526374859707*G0_0_0_1 - 0.241526374859707*G0_0_1_0 + 0.0072342472342472*G0_1_0_1 - 0.0072342472342472*G0_1_1_0 - 0.0122238255571589*G0_2_0_1 + 0.0122238255571589*G0_2_1_0 - 0.00450216450216452*G0_3_0_1 + 0.00450216450216452*G0_3_1_0 - 0.00346320346320386*G0_4_0_1 + 0.00346320346320386*G0_4_1_0 - 0.107359307359307*G0_5_0_1 + 0.107359307359307*G0_5_1_0 + 0.0308225108225106*G0_6_0_1 - 0.0308225108225106*G0_6_1_0 - 0.117748917748917*G0_7_0_1 + 0.117748917748917*G0_7_1_0 - 0.0349783549783548*G0_8_0_1 + 0.0349783549783548*G0_8_1_0 + 0.000692640692640842*G0_9_0_1 - 0.000692640692640814*G0_9_1_0; + A[13] = A[195] + 0.000795254128587428*G0_1_0_1 - 0.000795254128587424*G0_1_1_0 - 0.00829886163219497*G0_2_0_1 + 0.00829886163219497*G0_2_1_0 - 0.00507936507936532*G0_3_0_1 + 0.00507936507936532*G0_3_1_0 + 0.0125829725829726*G0_4_0_1 - 0.0125829725829726*G0_4_1_0 - 0.0386724386724386*G0_5_0_1 + 0.0386724386724386*G0_5_1_0 + 0.0195093795093797*G0_6_0_1 - 0.0195093795093796*G0_6_1_0 + 0.0386724386724381*G0_7_0_1 - 0.0386724386724381*G0_7_1_0 - 0.0451370851370847*G0_8_0_1 + 0.0451370851370847*G0_8_1_0 + 0.0256277056277054*G0_9_0_1 - 0.0256277056277054*G0_9_1_0; + A[53] = A[123] - 0.00908128908128903*G0_0_0_1 + 0.00908128908128903*G0_0_1_0 + 0.0126727593394257*G0_1_0_1 - 0.0126727593394257*G0_1_1_0 - 0.114413981080647*G0_2_0_1 + 0.114413981080647*G0_2_1_0 - 0.0143145743145747*G0_3_0_1 + 0.0143145743145747*G0_3_1_0 + 0.0337085137085133*G0_4_0_1 - 0.0337085137085133*G0_4_1_0 + 0.0281673881673883*G0_5_0_1 - 0.0281673881673882*G0_5_1_0 + 0.0724963924963922*G0_6_0_1 - 0.0724963924963922*G0_6_1_0 + 0.00923520923520946*G0_7_0_1 - 0.00923520923520946*G0_7_1_0 - 0.0184704184704187*G0_9_0_1 + 0.0184704184704187*G0_9_1_0; + A[30] = -A[31] + 0.0144155844155844*G0_0_1_0 + 0.0169472502805836*G0_0_1_1 - 0.0144155844155845*G0_1_1_0 + 0.00253166586499918*G0_1_1_1 + 0.0169472502805837*G0_2_1_1 - 0.00621933621933622*G0_3_1_0 - 0.00656204906204907*G0_3_1_1 + 0.0155844155844155*G0_4_1_0 + 0.0152417027417028*G0_4_1_1 + 0.00621933621933622*G0_5_1_0 - 0.00034271284271287*G0_5_1_1 - 0.0155844155844155*G0_6_1_0 - 0.000342712842712754*G0_6_1_1 + 0.0218037518037518*G0_7_1_0 + 0.0152417027417027*G0_7_1_1 - 0.0218037518037518*G0_8_1_0 - 0.00656204906204908*G0_8_1_1 + 0.00351370851370853*G0_9_1_1; + A[23] = A[21] - 0.0110565977232643*G0_0_0_0 + 0.0223953823953824*G0_0_0_1 + 0.0334519801186467*G0_2_0_0 + 0.0223953823953823*G0_2_0_1 + 0.0023088023088024*G0_3_0_0 - 0.012005772005772*G0_4_0_0 - 0.00161616161616166*G0_4_0_1 - 0.074574314574314*G0_5_0_0 - 0.0223953823953822*G0_5_0_1 + 0.0521789321789319*G0_6_0_0 - 0.0223953823953824*G0_6_0_1 + 0.0103896103896103*G0_7_0_0 - 0.0016161616161616*G0_7_0_1 - 0.00230880230880228*G0_8_0_0 + 0.00161616161616164*G0_9_0_0 + 0.00323232323232331*G0_9_0_1; + A[20] = -A[23] + 0.0103383036716369*G0_0_0_1 + 0.09318582651916*G0_1_0_1 + 0.0233445566778899*G0_2_0_1 - 0.00375180375180358*G0_3_0_1 + 0.0267243867243865*G0_4_0_1 - 0.0152958152958153*G0_5_0_1 - 0.00998556998557002*G0_6_0_1 - 0.0394227994227994*G0_7_0_1 + 0.0839826839826839*G0_8_0_1 + 0.034054834054834*G0_9_0_1; + A[5] = -A[20] - 0.00796536796536792*G0_0_0_0 + 0.00438672438672452*G0_0_0_1 - 0.00580407247073906*G0_0_1_0 - 0.00580407247073899*G0_0_1_1 + 0.00796536796536781*G0_1_0_0 + 0.0951996151996151*G0_1_0_1 + 0.00216129549462883*G0_1_1_0 + 0.00201378868045542*G0_1_1_1 + 0.0143145743145742*G0_2_0_1 + 0.0354657687991023*G0_2_1_0 + 0.0132178932178932*G0_2_1_1 - 0.00415584415584414*G0_3_0_0 - 0.00577200577200558*G0_3_0_1 - 0.0122366522366522*G0_3_1_0 - 0.00721500721500709*G0_3_1_1 + 0.052409812409812*G0_4_0_0 + 0.0891197691197682*G0_4_0_1 + 0.0449639249639249*G0_4_1_0 + 0.0623376623376617*G0_4_1_1 + 0.00415584415584418*G0_5_0_0 - 0.013160173160173*G0_5_0_1 - 0.00808080808080808*G0_5_1_0 - 0.00288600288600279*G0_5_1_1 - 0.0524098124098122*G0_6_0_0 - 0.00744588744588728*G0_6_1_0 - 0.00738816738816743*G0_6_1_1 - 0.0081962481962481*G0_7_0_0 - 0.0482539682539681*G0_7_0_1 - 0.00519480519480515*G0_7_1_0 - 0.0103896103896103*G0_7_1_1 + 0.00819624819624805*G0_8_0_0 + 0.0833477633477631*G0_8_0_1 + 0.003001443001443*G0_8_1_0 + 0.00455988455988468*G0_8_1_1 + 0.0263203463203462*G0_9_0_1 - 0.00450216450216449*G0_9_1_0 - 0.00611832611832614*G0_9_1_1; + A[8] = -A[5] - 0.0931858265191594*G0_0_0_1 - 0.0931858265191594*G0_0_1_1 - 0.0103383036716369*G0_1_0_1 - 0.0103383036716369*G0_1_1_1 - 0.0233445566778899*G0_2_0_1 - 0.02334455667789*G0_2_1_1 + 0.0152958152958152*G0_3_0_1 + 0.0152958152958153*G0_3_1_1 + 0.00998556998556971*G0_4_0_1 + 0.0099855699855696*G0_4_1_1 + 0.00375180375180383*G0_5_0_1 + 0.00375180375180387*G0_5_1_1 - 0.0267243867243867*G0_6_0_1 - 0.0267243867243868*G0_6_1_1 - 0.0839826839826837*G0_7_0_1 - 0.0839826839826836*G0_7_1_1 + 0.0394227994227993*G0_8_0_1 + 0.0394227994227994*G0_8_1_1 - 0.0340548340548341*G0_9_0_1 - 0.0340548340548341*G0_9_1_1; + A[45] = A[5] + 0.0110565977232643*G0_1_0_0 + 0.0112041045374377*G0_1_0_1 + 0.0333044733044732*G0_1_1_0 + 0.0334519801186466*G0_1_1_1 - 0.0334519801186466*G0_2_0_0 - 0.0112041045374378*G0_2_0_1 - 0.0333044733044734*G0_2_1_0 - 0.0110565977232644*G0_2_1_1 + 0.0745743145743139*G0_3_0_0 + 0.0695526695526688*G0_3_0_1 + 0.0572005772005769*G0_3_1_0 + 0.0521789321789317*G0_3_1_1 - 0.0521789321789317*G0_4_0_0 - 0.0695526695526688*G0_4_0_1 - 0.057200577200577*G0_4_1_0 - 0.0745743145743139*G0_4_1_1 - 0.00230880230880235*G0_5_0_0 - 0.00750360750360756*G0_5_0_1 + 0.00288600288600283*G0_5_1_0 - 0.00230880230880242*G0_5_1_1 + 0.012005772005772*G0_6_0_0 + 0.0119480519480521*G0_6_0_1 + 0.0104473304473303*G0_6_1_0 + 0.0103896103896104*G0_6_1_1 + 0.00230880230880221*G0_7_0_0 + 0.00750360750360739*G0_7_0_1 - 0.00288600288600301*G0_7_1_0 + 0.00230880230880214*G0_7_1_1 - 0.0103896103896103*G0_8_0_0 - 0.0119480519480519*G0_8_0_1 - 0.0104473304473303*G0_8_1_0 - 0.0120057720057719*G0_8_1_1 - 0.0016161616161616*G0_9_0_0 + 0.00161616161616169*G0_9_1_1; + A[165] = -A[45] - 0.0931858265191597*G0_0_0_0 - 0.0931858265191598*G0_0_0_1 - 0.02334455667789*G0_1_0_0 - 0.02334455667789*G0_1_0_1 - 0.010338303671637*G0_2_0_0 - 0.0103383036716369*G0_2_0_1 + 0.00998556998556981*G0_3_0_0 + 0.00998556998556976*G0_3_0_1 + 0.0152958152958154*G0_4_0_0 + 0.0152958152958154*G0_4_0_1 - 0.0839826839826836*G0_5_0_0 - 0.0839826839826836*G0_5_0_1 + 0.0394227994227994*G0_6_0_0 + 0.0394227994227994*G0_6_0_1 + 0.0037518037518035*G0_7_0_0 + 0.0037518037518035*G0_7_0_1 - 0.0267243867243865*G0_8_0_0 - 0.0267243867243864*G0_8_0_1 - 0.0340548340548341*G0_9_0_0 - 0.0340548340548341*G0_9_0_1; + A[75] = A[5] + 0.000147506814173429*G0_1_0_1 - 0.00014750681417343*G0_1_1_0 + 0.022247875581209*G0_2_0_1 - 0.022247875581209*G0_2_1_0 - 0.00502164502164507*G0_3_0_1 + 0.00502164502164507*G0_3_1_0 - 0.017373737373737*G0_4_0_1 + 0.017373737373737*G0_4_1_0 - 0.00519480519480526*G0_5_0_1 + 0.00519480519480526*G0_5_1_0 + 0.00519480519480516*G0_7_0_1 - 0.00519480519480515*G0_7_1_0 - 0.00155844155844156*G0_8_0_1 + 0.00155844155844156*G0_8_1_0 + 0.00161616161616165*G0_9_0_1 - 0.00161616161616165*G0_9_1_0; + A[120] = -A[75] - 0.0931858265191594*G0_0_1_0 - 0.0931858265191594*G0_0_1_1 - 0.0103383036716369*G0_1_1_0 - 0.0103383036716369*G0_1_1_1 - 0.0233445566778899*G0_2_1_0 - 0.02334455667789*G0_2_1_1 + 0.0152958152958152*G0_3_1_0 + 0.0152958152958153*G0_3_1_1 + 0.00998556998556972*G0_4_1_0 + 0.0099855699855696*G0_4_1_1 + 0.00375180375180383*G0_5_1_0 + 0.00375180375180386*G0_5_1_1 - 0.0267243867243867*G0_6_1_0 - 0.0267243867243868*G0_6_1_1 - 0.0839826839826836*G0_7_1_0 - 0.0839826839826836*G0_7_1_1 + 0.0394227994227993*G0_8_1_0 + 0.0394227994227994*G0_8_1_1 - 0.0340548340548341*G0_9_1_0 - 0.0340548340548341*G0_9_1_1; + A[24] = -A[20] - 0.038723745390412*G0_0_0_0 + 0.00909411576078244*G0_0_0_1 - 0.0815776815776814*G0_1_0_0 - 0.0478178611511943*G0_2_0_0 - 0.00909411576078237*G0_2_0_1 - 0.0655122655122653*G0_3_0_0 - 0.0773448773448768*G0_3_0_1 + 0.0423088023088021*G0_4_0_0 + 0.0646464646464641*G0_4_0_1 - 0.0401154401154399*G0_5_0_0 - 0.0176623376623376*G0_5_0_1 - 0.0224531024531023*G0_6_0_0 + 0.0176623376623376*G0_6_0_1 - 0.0223376623376622*G0_7_0_0 - 0.0646464646464644*G0_7_0_1 + 0.0118326118326116*G0_8_0_0 + 0.0773448773448771*G0_8_0_1 - 0.0234343434343435*G0_9_0_0; + A[3] = A[45] + 0.0222478755812089*G0_1_0_1 - 0.0222478755812089*G0_1_1_0 + 0.000147506814173414*G0_2_0_1 - 0.000147506814173414*G0_2_1_0 - 0.017373737373737*G0_3_0_1 + 0.017373737373737*G0_3_1_0 - 0.00502164502164516*G0_4_0_1 + 0.00502164502164516*G0_4_1_0 + 0.00519480519480513*G0_5_0_1 - 0.00519480519480513*G0_5_1_0 - 0.00155844155844163*G0_6_0_1 + 0.00155844155844162*G0_6_1_0 - 0.00519480519480525*G0_7_0_1 + 0.00519480519480524*G0_7_1_0 + 0.00161616161616165*G0_9_0_1 - 0.00161616161616165*G0_9_1_0; + A[11] = -A[3] - 0.0931858265191598*G0_0_0_0 - 0.0931858265191598*G0_0_1_0 - 0.02334455667789*G0_1_0_0 - 0.02334455667789*G0_1_1_0 - 0.010338303671637*G0_2_0_0 - 0.0103383036716369*G0_2_1_0 + 0.00998556998556981*G0_3_0_0 + 0.00998556998556976*G0_3_1_0 + 0.0152958152958154*G0_4_0_0 + 0.0152958152958154*G0_4_1_0 - 0.0839826839826836*G0_5_0_0 - 0.0839826839826836*G0_5_1_0 + 0.0394227994227994*G0_6_0_0 + 0.0394227994227994*G0_6_1_0 + 0.00375180375180352*G0_7_0_0 + 0.0037518037518035*G0_7_1_0 - 0.0267243867243865*G0_8_0_0 - 0.0267243867243864*G0_8_1_0 - 0.0340548340548341*G0_9_0_0 - 0.034054834054834*G0_9_1_0; + A[128] = -A[125] - 0.0120570787237454*G0_0_0_1 + 0.0921981721981719*G0_0_1_1 - 0.0120570787237453*G0_1_0_1 + 0.0506910373577041*G0_1_1_1 + 0.398140131473463*G0_2_0_1 + 0.351964085297417*G0_2_1_1 + 0.0369408369408371*G0_3_0_1 - 0.113131313131313*G0_3_1_1 - 0.156998556998557*G0_4_0_1 + 0.143145743145743*G0_4_1_1 + 0.0369408369408372*G0_5_0_1 + 0.0438672438672436*G0_5_1_1 - 0.156998556998557*G0_6_0_1 + 0.443290043290043*G0_6_1_1 + 0.0161616161616162*G0_7_0_1 + 0.238268398268397*G0_7_1_1 + 0.0161616161616164*G0_8_0_1 - 0.0050793650793651*G0_8_1_1 - 0.166233766233766*G0_9_0_1 + 0.447907647907647*G0_9_1_1; + A[63] = -A[71] - 0.0191758858425525*G0_0_0_0 + 0.0504729838063173*G0_0_1_0 - 0.0171877505210841*G0_1_0_0 + 0.241654641654642*G0_1_1_0 - 0.176238576238575*G0_2_0_0 + 0.00224466891133571*G0_2_1_0 + 0.210101010101008*G0_3_0_0 + 0.7018759018759*G0_3_1_0 - 0.164271284271283*G0_4_0_0 - 0.0184704184704184*G0_4_1_0 + 0.084271284271284*G0_5_0_0 - 0.0733044733044732*G0_5_1_0 - 0.409235209235207*G0_6_0_0 - 0.0178932178932179*G0_6_1_0 + 0.0181240981240981*G0_7_0_0 - 0.175468975468975*G0_7_1_0 - 0.0611832611832607*G0_8_0_0 + 0.046176046176047*G0_8_1_0 - 0.193246753246753*G0_9_0_0 + 0.36017316017316*G0_9_1_0; + A[140] = -A[143] + 0.127086740420073*G0_0_0_1 - 0.0740355940355936*G0_0_1_1 + 0.00312970979637616*G0_1_0_1 - 0.0131345198011866*G0_1_1_1 + 0.00205226871893533*G0_2_1_1 - 0.0138528138528136*G0_3_0_1 - 0.0106204906204903*G0_3_1_1 - 0.0249350649350645*G0_4_0_1 - 0.0498701298701298*G0_4_1_1 - 0.0230880230880229*G0_5_0_1 + 0.044790764790765*G0_5_1_1 + 0.0249350649350649*G0_6_0_1 + 0.0267821067821065*G0_6_1_1 - 0.0974314574314566*G0_7_0_1 - 0.340779220779219*G0_7_1_1 - 0.0327849927849926*G0_8_0_1 + 0.0364790764790763*G0_8_1_1 + 0.0369408369408372*G0_9_0_1 + 0.0397113997113999*G0_9_1_1; + A[77] = -A[122] - 0.0218053551386884*G0_0_1_1 - 0.0218053551386885*G0_1_1_1 - 0.194965528298861*G0_2_1_1 - 0.00202020202020213*G0_3_1_1 - 0.0430014430014427*G0_4_1_1 - 0.00202020202020204*G0_5_1_1 - 0.0430014430014428*G0_6_1_1 - 0.0510822510822508*G0_7_1_1 - 0.051082251082251*G0_8_1_1 - 0.0940836940836938*G0_9_1_1; + A[171] = -A[51] - 0.0740355940355936*G0_0_0_0 + 0.127086740420074*G0_0_0_1 + 0.00205226871893533*G0_1_0_0 - 0.0131345198011862*G0_2_0_0 + 0.00312970979637647*G0_2_0_1 - 0.04987012987013*G0_3_0_0 - 0.0249350649350648*G0_3_0_1 - 0.0106204906204907*G0_4_0_0 - 0.0138528138528141*G0_4_0_1 - 0.340779220779218*G0_5_0_0 - 0.097431457431456*G0_5_0_1 + 0.0364790764790763*G0_6_0_0 - 0.0327849927849929*G0_6_0_1 + 0.0447907647907646*G0_7_0_0 - 0.0230880230880224*G0_7_0_1 + 0.026782106782107*G0_8_0_0 + 0.0249350649350647*G0_8_0_1 + 0.0397113997113996*G0_9_0_0 + 0.0369408369408371*G0_9_0_1; + A[101] = A[171] - 0.114413981080648*G0_0_0_1 + 0.114413981080648*G0_0_1_0 + 0.0126727593394259*G0_1_0_1 - 0.0126727593394259*G0_1_1_0 - 0.00908128908128908*G0_2_0_1 + 0.00908128908128908*G0_2_1_0 + 0.00923520923520933*G0_4_0_1 - 0.00923520923520933*G0_4_1_0 + 0.0724963924963915*G0_5_0_1 - 0.0724963924963915*G0_5_1_0 + 0.0281673881673883*G0_6_0_1 - 0.0281673881673883*G0_6_1_0 + 0.0337085137085132*G0_7_0_1 - 0.0337085137085132*G0_7_1_0 - 0.0143145743145745*G0_8_0_1 + 0.0143145743145745*G0_8_1_0 - 0.0184704184704187*G0_9_0_1 + 0.0184704184704187*G0_9_1_0; + A[93] = -A[101] - 0.0740355940355936*G0_0_0_0 + 0.127086740420074*G0_0_1_0 + 0.00205226871893533*G0_1_0_0 - 0.0131345198011862*G0_2_0_0 + 0.00312970979637646*G0_2_1_0 - 0.04987012987013*G0_3_0_0 - 0.0249350649350648*G0_3_1_0 - 0.0106204906204906*G0_4_0_0 - 0.0138528138528141*G0_4_1_0 - 0.340779220779218*G0_5_0_0 - 0.097431457431456*G0_5_1_0 + 0.0364790764790762*G0_6_0_0 - 0.0327849927849929*G0_6_1_0 + 0.0447907647907646*G0_7_0_0 - 0.0230880230880224*G0_7_1_0 + 0.026782106782107*G0_8_0_0 + 0.0249350649350647*G0_8_1_0 + 0.0397113997113996*G0_9_0_0 + 0.0369408369408371*G0_9_1_0; + A[152] = A[40] + 0.00768478435145101*G0_0_0_1 - 0.00768478435145101*G0_0_1_0 - 0.00768478435145112*G0_1_0_1 + 0.00768478435145112*G0_1_1_0 + 0.00471861471861479*G0_3_0_1 - 0.00471861471861479*G0_3_1_0 - 0.00519480519480527*G0_4_0_1 + 0.00519480519480527*G0_4_1_0 - 0.00471861471861456*G0_5_0_1 + 0.00471861471861456*G0_5_1_0 + 0.00519480519480502*G0_6_0_1 - 0.00519480519480502*G0_6_1_0 - 0.034155844155844*G0_7_0_1 + 0.034155844155844*G0_7_1_0 + 0.0341558441558441*G0_8_0_1 - 0.0341558441558441*G0_8_1_0; + A[137] = A[152] - 0.0299326599326598*G0_0_0_1 + 0.0186644219977552*G0_0_1_1 + 0.0075372775372777*G0_1_0_1 + 0.0151451018117686*G0_1_1_1 - 0.00396825396825391*G0_2_1_1 - 0.00316017316017335*G0_3_0_1 - 0.00598845598845604*G0_3_1_1 - 0.00115440115440122*G0_4_1_1 + 0.00477633477633452*G0_5_0_1 - 0.0132178932178932*G0_5_1_1 + 0.00115440115440119*G0_6_1_1 + 0.0515295815295813*G0_7_0_1 + 0.0428860028860027*G0_7_1_1 - 0.0291341991341992*G0_8_0_1 - 0.0608225108225107*G0_8_1_1 - 0.00161616161616167*G0_9_0_1 + 0.00730158730158718*G0_9_1_1; + A[167] = A[137] + 0.0223953823953823*G0_0_0_1 - 0.0110565977232643*G0_0_1_1 + 0.0223953823953824*G0_1_0_1 + 0.0334519801186468*G0_1_1_1 - 0.00161616161616147*G0_3_0_1 - 0.0120057720057718*G0_3_1_1 + 0.00230880230880227*G0_4_1_1 - 0.0016161616161616*G0_5_0_1 + 0.0103896103896104*G0_5_1_1 - 0.00230880230880235*G0_6_1_1 - 0.0223953823953823*G0_7_0_1 - 0.0745743145743144*G0_7_1_1 - 0.0223953823953822*G0_8_0_1 + 0.0521789321789322*G0_8_1_1 + 0.00323232323232328*G0_9_0_1 + 0.00161616161616172*G0_9_1_1; + A[47] = -A[167] + 0.0103383036716369*G0_0_0_1 + 0.0233445566778901*G0_1_0_1 + 0.0931858265191593*G0_2_0_1 + 0.0267243867243868*G0_3_0_1 - 0.00375180375180379*G0_4_0_1 - 0.0394227994227993*G0_5_0_1 + 0.0839826839826835*G0_6_0_1 - 0.0152958152958153*G0_7_0_1 - 0.00998556998556994*G0_8_0_1 + 0.0340548340548339*G0_9_0_1; + A[92] = -A[47] + 0.00909411576078238*G0_0_0_1 - 0.0387237453904119*G0_0_1_1 - 0.00909411576078238*G0_1_0_1 - 0.0478178611511945*G0_1_1_1 - 0.0815776815776814*G0_2_1_1 + 0.0646464646464643*G0_3_0_1 + 0.042308802308802*G0_3_1_1 - 0.0773448773448768*G0_4_0_1 - 0.0655122655122652*G0_4_1_1 - 0.0646464646464643*G0_5_0_1 - 0.0223376623376621*G0_5_1_1 + 0.0773448773448771*G0_6_0_1 + 0.0118326118326117*G0_6_1_1 - 0.0176623376623376*G0_7_0_1 - 0.0401154401154399*G0_7_1_1 + 0.0176623376623375*G0_8_0_1 - 0.0224531024531025*G0_8_1_1 - 0.0234343434343435*G0_9_1_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f1_p3_q4_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f1_p3_q4_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f1_p3_q4_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2}))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 1; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q4_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q4_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q4_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q4_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f1_p3_q4_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f1_p3_q4_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f1_p3_q4_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p1_q1_quadrature.h b/laplacian_2d/laplacian_f2_p1_q1_quadrature.h new file mode 100644 index 0000000..6085dbb --- /dev/null +++ b/laplacian_2d/laplacian_f2_p1_q1_quadrature.h @@ -0,0 +1,1482 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P1_Q1_QUADRATURE_H +#define __LAPLACIAN_F2_P1_Q1_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q1_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q1_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q1_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q1_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q1_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q1_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q1_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q1_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p1_q1_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p1_q1_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q1_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W3[3] = {0.166666666666667, 0.166666666666667, 0.166666666666667}; + // Quadrature points on the UFC reference element: (0.166666666666667, 0.166666666666667), (0.166666666666667, 0.666666666666667), (0.666666666666667, 0.166666666666667) + + // Value of basis functions at quadrature points. + static const double FE0[3][3] = \ + {{0.666666666666667, 0.166666666666667, 0.166666666666667}, + {0.166666666666667, 0.166666666666667, 0.666666666666667}, + {0.166666666666667, 0.666666666666667, 0.166666666666667}}; + + static const double FE0_D01[3][2] = \ + {{-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}}; + + // Array of non-zero columns + static const unsigned int nzc1[2] = {0, 1}; + + // Array of non-zero columns + static const unsigned int nzc0[2] = {0, 2}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 9; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 207 + for (unsigned int ip = 0; ip < 3; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 12 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[0][r]; + F1 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W3[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W3[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W3[ip]; + + + // Number of operations for primary indices: 48 + for (unsigned int j = 0; j < 2; j++) + { + for (unsigned int k = 0; k < 2; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p1_q1_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p1_q1_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q1_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q1_quadrature_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f2_p1_q1_quadrature_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f2_p1_q1_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q1_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q1_quadrature_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f2_p1_q1_quadrature_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f2_p1_q1_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q1_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q1_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p1_q1_tensor.h b/laplacian_2d/laplacian_f2_p1_q1_tensor.h new file mode 100644 index 0000000..8c92536 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p1_q1_tensor.h @@ -0,0 +1,1449 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P1_Q1_TENSOR_H +#define __LAPLACIAN_F2_P1_Q1_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q1_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q1_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q1_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q1_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q1_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q1_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q1_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q1_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p1_q1_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p1_q1_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q1_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 108 + // Number of operations (multiply-add pairs) for tensor contraction: 96 + // Total number of operations (multiply-add pairs): 215 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[1] = -0.0833333333333334*G0_0_0_0_0 - 0.0416666666666667*G0_0_0_0_1 - 0.0416666666666667*G0_0_0_0_2 - 0.0416666666666667*G0_0_0_1_0 - 0.0833333333333333*G0_0_0_1_1 - 0.0416666666666666*G0_0_0_1_2 - 0.0416666666666667*G0_0_0_2_0 - 0.0416666666666666*G0_0_0_2_1 - 0.0833333333333333*G0_0_0_2_2 - 0.0833333333333334*G0_1_0_0_0 - 0.0416666666666667*G0_1_0_0_1 - 0.0416666666666667*G0_1_0_0_2 - 0.0416666666666667*G0_1_0_1_0 - 0.0833333333333333*G0_1_0_1_1 - 0.0416666666666666*G0_1_0_1_2 - 0.0416666666666667*G0_1_0_2_0 - 0.0416666666666666*G0_1_0_2_1 - 0.0833333333333333*G0_1_0_2_2; + A[5] = 0.0833333333333334*G0_0_1_0_0 + 0.0416666666666667*G0_0_1_0_1 + 0.0416666666666667*G0_0_1_0_2 + 0.0416666666666667*G0_0_1_1_0 + 0.0833333333333333*G0_0_1_1_1 + 0.0416666666666666*G0_0_1_1_2 + 0.0416666666666667*G0_0_1_2_0 + 0.0416666666666666*G0_0_1_2_1 + 0.0833333333333333*G0_0_1_2_2; + A[0] = -A[1] + 0.0833333333333334*G0_0_1_0_0 + 0.0416666666666667*G0_0_1_0_1 + 0.0416666666666667*G0_0_1_0_2 + 0.0416666666666667*G0_0_1_1_0 + 0.0833333333333333*G0_0_1_1_1 + 0.0416666666666666*G0_0_1_1_2 + 0.0416666666666667*G0_0_1_2_0 + 0.0416666666666666*G0_0_1_2_1 + 0.0833333333333333*G0_0_1_2_2 + 0.0833333333333334*G0_1_1_0_0 + 0.0416666666666667*G0_1_1_0_1 + 0.0416666666666667*G0_1_1_0_2 + 0.0416666666666667*G0_1_1_1_0 + 0.0833333333333332*G0_1_1_1_1 + 0.0416666666666666*G0_1_1_1_2 + 0.0416666666666667*G0_1_1_2_0 + 0.0416666666666666*G0_1_1_2_1 + 0.0833333333333332*G0_1_1_2_2; + A[7] = 0.0833333333333334*G0_1_0_0_0 + 0.0416666666666667*G0_1_0_0_1 + 0.0416666666666667*G0_1_0_0_2 + 0.0416666666666667*G0_1_0_1_0 + 0.0833333333333333*G0_1_0_1_1 + 0.0416666666666666*G0_1_0_1_2 + 0.0416666666666667*G0_1_0_2_0 + 0.0416666666666666*G0_1_0_2_1 + 0.0833333333333333*G0_1_0_2_2; + A[6] = -A[7] - 0.0833333333333334*G0_1_1_0_0 - 0.0416666666666667*G0_1_1_0_1 - 0.0416666666666667*G0_1_1_0_2 - 0.0416666666666667*G0_1_1_1_0 - 0.0833333333333332*G0_1_1_1_1 - 0.0416666666666666*G0_1_1_1_2 - 0.0416666666666667*G0_1_1_2_0 - 0.0416666666666666*G0_1_1_2_1 - 0.0833333333333332*G0_1_1_2_2; + A[8] = 0.0833333333333334*G0_1_1_0_0 + 0.0416666666666667*G0_1_1_0_1 + 0.0416666666666667*G0_1_1_0_2 + 0.0416666666666667*G0_1_1_1_0 + 0.0833333333333333*G0_1_1_1_1 + 0.0416666666666666*G0_1_1_1_2 + 0.0416666666666667*G0_1_1_2_0 + 0.0416666666666666*G0_1_1_2_1 + 0.0833333333333333*G0_1_1_2_2; + A[2] = -A[8] - 0.0833333333333334*G0_0_1_0_0 - 0.0416666666666667*G0_0_1_0_1 - 0.0416666666666667*G0_0_1_0_2 - 0.0416666666666667*G0_0_1_1_0 - 0.0833333333333333*G0_0_1_1_1 - 0.0416666666666666*G0_0_1_1_2 - 0.0416666666666667*G0_0_1_2_0 - 0.0416666666666666*G0_0_1_2_1 - 0.0833333333333333*G0_0_1_2_2; + A[4] = 0.0833333333333334*G0_0_0_0_0 + 0.0416666666666667*G0_0_0_0_1 + 0.0416666666666667*G0_0_0_0_2 + 0.0416666666666667*G0_0_0_1_0 + 0.0833333333333333*G0_0_0_1_1 + 0.0416666666666666*G0_0_0_1_2 + 0.0416666666666667*G0_0_0_2_0 + 0.0416666666666666*G0_0_0_2_1 + 0.0833333333333333*G0_0_0_2_2; + A[3] = -A[4] - 0.0833333333333334*G0_0_1_0_0 - 0.0416666666666667*G0_0_1_0_1 - 0.0416666666666667*G0_0_1_0_2 - 0.0416666666666667*G0_0_1_1_0 - 0.0833333333333333*G0_0_1_1_1 - 0.0416666666666666*G0_0_1_1_2 - 0.0416666666666667*G0_0_1_2_0 - 0.0416666666666666*G0_0_1_2_1 - 0.0833333333333333*G0_0_1_2_2; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p1_q1_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p1_q1_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q1_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q1_tensor_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f2_p1_q1_tensor_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f2_p1_q1_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q1_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q1_tensor_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f2_p1_q1_tensor_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f2_p1_q1_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q1_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q1_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p1_q2_quadrature.h b/laplacian_2d/laplacian_f2_p1_q2_quadrature.h new file mode 100644 index 0000000..7fbbd0a --- /dev/null +++ b/laplacian_2d/laplacian_f2_p1_q2_quadrature.h @@ -0,0 +1,3404 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P1_Q2_QUADRATURE_H +#define __LAPLACIAN_F2_P1_Q2_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q2_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q2_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q2_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q2_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q2_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q2_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q2_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q2_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q2_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q2_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q2_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q2_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p1_q2_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p1_q2_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W6[6] = {0.054975871827661, 0.054975871827661, 0.054975871827661, 0.111690794839005, 0.111690794839005, 0.111690794839005}; + // Quadrature points on the UFC reference element: (0.816847572980459, 0.091576213509771), (0.091576213509771, 0.816847572980459), (0.091576213509771, 0.091576213509771), (0.10810301816807, 0.445948490915965), (0.445948490915965, 0.10810301816807), (0.445948490915965, 0.445948490915965) + + // Value of basis functions at quadrature points. + static const double FE0[6][3] = \ + {{0.09157621350977, 0.816847572980459, 0.091576213509771}, + {0.0915762135097701, 0.0915762135097711, 0.816847572980459}, + {0.816847572980458, 0.091576213509771, 0.091576213509771}, + {0.445948490915965, 0.10810301816807, 0.445948490915965}, + {0.445948490915965, 0.445948490915965, 0.10810301816807}, + {0.10810301816807, 0.445948490915965, 0.445948490915965}}; + + static const double FE1_D01[6][5] = \ + {{0.63369514596092, -0.633695145960916, 3.26739029192183, 0.0, -3.26739029192184}, + {0.63369514596092, 2.26739029192184, 0.366304854039083, -2.90108543788276, -0.366304854039083}, + {-2.26739029192183, -0.633695145960916, 0.366304854039083, 2.90108543788275, -0.366304854039084}, + {-0.78379396366386, 0.78379396366386, 0.43241207267228, 0.0, -0.43241207267228}, + {-0.78379396366386, -0.567587927327719, 1.78379396366386, 1.35138189099158, -1.78379396366386}, + {0.56758792732772, 0.78379396366386, 1.78379396366386, -1.35138189099158, -1.78379396366386}}; + + // Array of non-zero columns + static const unsigned int nzc0[5] = {0, 2, 3, 4, 5}; + + static const double FE1_D10[6][5] = \ + {{0.633695145960919, 2.26739029192183, 0.366304854039083, -0.366304854039083, -2.90108543788275}, + {0.633695145960921, -0.633695145960916, 3.26739029192183, -3.26739029192183, 0.0}, + {-2.26739029192183, -0.633695145960916, 0.366304854039083, -0.366304854039083, 2.90108543788275}, + {-0.78379396366386, -0.56758792732772, 1.78379396366386, -1.78379396366386, 1.35138189099158}, + {-0.78379396366386, 0.78379396366386, 0.432412072672279, -0.432412072672279, 0.0}, + {0.56758792732772, 0.78379396366386, 1.78379396366386, -1.78379396366386, -1.35138189099158}}; + + // Array of non-zero columns + static const unsigned int nzc1[5] = {0, 1, 3, 4, 5}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 36; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 1926 + for (unsigned int ip = 0; ip < 6; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 12 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[0][r]; + F1 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W6[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W6[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W6[ip]; + + + // Number of operations for primary indices: 300 + for (unsigned int j = 0; j < 5; j++) + { + for (unsigned int k = 0; k < 5; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p1_q2_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p1_q2_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q2_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q2_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q2_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q2_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q2_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q2_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q2_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q2_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q2_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p1_q2_tensor.h b/laplacian_2d/laplacian_f2_p1_q2_tensor.h new file mode 100644 index 0000000..b9abe0e --- /dev/null +++ b/laplacian_2d/laplacian_f2_p1_q2_tensor.h @@ -0,0 +1,3384 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P1_Q2_TENSOR_H +#define __LAPLACIAN_F2_P1_Q2_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q2_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q2_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q2_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q2_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q2_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q2_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q2_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q2_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q2_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q2_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q2_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q2_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p1_q2_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p1_q2_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 108 + // Number of operations (multiply-add pairs) for tensor contraction: 495 + // Total number of operations (multiply-add pairs): 614 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[9] = -0.0222222222222223*G0_0_0_0_0 + 0.011111111111111*G0_0_0_0_1 - 0.0222222222222222*G0_0_0_0_2 + 0.011111111111111*G0_0_0_1_0 + 0.0666666666666667*G0_0_0_1_1 + 0.0222222222222222*G0_0_0_1_2 - 0.0222222222222222*G0_0_0_2_0 + 0.0222222222222222*G0_0_0_2_1 - 0.0666666666666668*G0_0_0_2_2 + 0.0222222222222222*G0_0_1_0_0 + 0.0666666666666664*G0_0_1_0_1 + 0.0111111111111111*G0_0_1_0_2 + 0.0666666666666664*G0_0_1_1_0 + 0.333333333333334*G0_0_1_1_1 + 0.0666666666666668*G0_0_1_1_2 + 0.0111111111111111*G0_0_1_2_0 + 0.0666666666666668*G0_0_1_2_1 + 0.0222222222222222*G0_0_1_2_2; + A[13] = -0.0055555555555556*G0_1_0_0_0 - 0.0138888888888888*G0_1_0_0_1 - 0.0138888888888889*G0_1_0_0_2 - 0.0138888888888888*G0_1_0_1_0 - 0.05*G0_1_0_1_1 - 0.00277777777777782*G0_1_0_1_2 - 0.0138888888888889*G0_1_0_2_0 - 0.00277777777777782*G0_1_0_2_1 - 0.0500000000000001*G0_1_0_2_2; + A[17] = -0.0444444444444443*G0_1_0_0_0 + 0.0111111111111111*G0_1_0_0_2 + 0.0444444444444446*G0_1_0_1_1 - 0.0111111111111111*G0_1_0_1_2 + 0.0111111111111111*G0_1_0_2_0 - 0.0111111111111111*G0_1_0_2_1 + 0.0222222222222222*G0_1_1_0_0 + 0.0222222222222222*G0_1_1_0_1 - 0.0111111111111111*G0_1_1_0_2 + 0.0222222222222222*G0_1_1_1_0 + 0.0666666666666667*G0_1_1_1_1 - 0.0222222222222222*G0_1_1_1_2 - 0.0111111111111111*G0_1_1_2_0 - 0.0222222222222222*G0_1_1_2_1 - 0.0666666666666668*G0_1_1_2_2; + A[8] = -0.00555555555555559*G0_0_1_0_0 - 0.0138888888888888*G0_0_1_0_1 - 0.0138888888888889*G0_0_1_0_2 - 0.0138888888888888*G0_0_1_1_0 - 0.05*G0_0_1_1_1 - 0.00277777777777782*G0_0_1_1_2 - 0.0138888888888889*G0_0_1_2_0 - 0.00277777777777782*G0_0_1_2_1 - 0.0500000000000001*G0_0_1_2_2; + A[11] = -A[9] - 0.111111111111111*G0_0_0_0_0 - 0.0333333333333333*G0_0_0_0_1 - 0.0555555555555556*G0_0_0_0_2 - 0.0333333333333333*G0_0_0_1_0 - 0.2*G0_0_0_1_1 - 0.0333333333333335*G0_0_0_1_2 - 0.0555555555555556*G0_0_0_2_0 - 0.0333333333333335*G0_0_0_2_1 - 0.111111111111111*G0_0_0_2_2; + A[7] = 0.0388888888888888*G0_0_0_0_0 + 0.0416666666666665*G0_0_0_0_1 + 0.0194444444444444*G0_0_0_0_2 + 0.0416666666666665*G0_0_0_1_0 + 0.216666666666667*G0_0_0_1_1 + 0.0416666666666668*G0_0_0_1_2 + 0.0194444444444444*G0_0_0_2_0 + 0.0416666666666668*G0_0_0_2_1 + 0.0388888888888889*G0_0_0_2_2; + A[1] = -A[13] + 0.0499999999999999*G0_0_0_0_0 + 0.00277777777777778*G0_0_0_0_1 + 0.0138888888888889*G0_0_0_0_2 + 0.00277777777777777*G0_0_0_1_0 + 0.0500000000000004*G0_0_0_1_1 + 0.0138888888888889*G0_0_0_1_2 + 0.0138888888888889*G0_0_0_2_0 + 0.0138888888888889*G0_0_0_2_1 + 0.00555555555555548*G0_0_0_2_2 + 0.0444444444444443*G0_1_0_0_0 - 0.0111111111111111*G0_1_0_0_1 - 0.0111111111111111*G0_1_0_1_0 + 0.0111111111111111*G0_1_0_1_2 + 0.0111111111111111*G0_1_0_2_1 - 0.0444444444444446*G0_1_0_2_2; + A[0] = A[7] + 0.177777777777778*G0_0_0_0_0 + 0.0222222222222223*G0_0_0_0_2 - 0.177777777777778*G0_0_0_1_1 - 0.0222222222222223*G0_0_0_1_2 + 0.0222222222222223*G0_0_0_2_0 - 0.0222222222222223*G0_0_0_2_1 + 0.216666666666666*G0_0_1_0_0 + 0.0416666666666667*G0_0_1_0_1 + 0.0416666666666667*G0_0_1_0_2 + 0.0416666666666667*G0_0_1_1_0 + 0.0388888888888891*G0_0_1_1_1 + 0.0194444444444445*G0_0_1_1_2 + 0.0416666666666667*G0_0_1_2_0 + 0.0194444444444445*G0_0_1_2_1 + 0.0388888888888891*G0_0_1_2_2 + 0.216666666666666*G0_1_0_0_0 + 0.0416666666666667*G0_1_0_0_1 + 0.0416666666666667*G0_1_0_0_2 + 0.0416666666666667*G0_1_0_1_0 + 0.0388888888888891*G0_1_0_1_1 + 0.0194444444444445*G0_1_0_1_2 + 0.0416666666666667*G0_1_0_2_0 + 0.0194444444444445*G0_1_0_2_1 + 0.0388888888888891*G0_1_0_2_2 + 0.216666666666666*G0_1_1_0_0 + 0.0416666666666667*G0_1_1_0_1 + 0.0416666666666667*G0_1_1_0_2 + 0.0416666666666667*G0_1_1_1_0 + 0.0388888888888891*G0_1_1_1_1 + 0.0194444444444445*G0_1_1_1_2 + 0.0416666666666667*G0_1_1_2_0 + 0.0194444444444445*G0_1_1_2_1 + 0.0388888888888891*G0_1_1_2_2; + A[14] = 0.0388888888888888*G0_1_1_0_0 + 0.0194444444444444*G0_1_1_0_1 + 0.0416666666666666*G0_1_1_0_2 + 0.0194444444444444*G0_1_1_1_0 + 0.0388888888888889*G0_1_1_1_1 + 0.0416666666666668*G0_1_1_1_2 + 0.0416666666666666*G0_1_1_2_0 + 0.0416666666666668*G0_1_1_2_1 + 0.216666666666667*G0_1_1_2_2; + A[10] = -A[9] - 0.0222222222222221*G0_0_1_0_0 + 0.0777777777777775*G0_0_1_0_1 + 0.011111111111111*G0_0_1_0_2 + 0.0777777777777775*G0_0_1_1_0 + 0.333333333333334*G0_0_1_1_1 + 0.0555555555555557*G0_0_1_1_2 + 0.011111111111111*G0_0_1_2_0 + 0.0555555555555557*G0_0_1_2_1 + 0.0666666666666668*G0_0_1_2_2; + A[18] = -A[10] - 0.0444444444444443*G0_0_0_0_0 - 0.0222222222222221*G0_0_0_0_1 - 0.0222222222222221*G0_0_0_1_0 - 0.0444444444444443*G0_0_0_1_1 + 0.133333333333334*G0_0_0_2_2 - 0.111111111111111*G0_0_1_0_0 - 0.0222222222222222*G0_0_1_0_2 + 0.0222222222222221*G0_0_1_1_1 + 0.0111111111111113*G0_0_1_1_2 - 0.0222222222222222*G0_0_1_2_0 + 0.0111111111111113*G0_0_1_2_1 + 0.111111111111112*G0_0_1_2_2 - 0.0666666666666666*G0_1_0_0_0 - 0.0222222222222222*G0_1_0_0_1 - 0.0111111111111111*G0_1_0_0_2 - 0.0222222222222222*G0_1_0_1_0 + 0.0666666666666672*G0_1_0_1_1 + 0.0222222222222223*G0_1_0_1_2 - 0.0111111111111111*G0_1_0_2_0 + 0.0222222222222223*G0_1_0_2_1 + 0.0222222222222223*G0_1_0_2_2 - 0.0666666666666666*G0_1_1_0_0 - 0.0222222222222222*G0_1_1_0_1 - 0.0111111111111111*G0_1_1_0_2 - 0.0222222222222222*G0_1_1_1_0 + 0.0666666666666673*G0_1_1_1_1 + 0.0222222222222224*G0_1_1_1_2 - 0.0111111111111111*G0_1_1_2_0 + 0.0222222222222224*G0_1_1_2_1 + 0.0222222222222223*G0_1_1_2_2; + A[3] = A[18] - 0.0111111111111111*G0_0_1_0_1 + 0.0111111111111111*G0_0_1_0_2 - 0.0111111111111111*G0_0_1_1_0 + 0.0444444444444449*G0_0_1_1_1 + 0.0111111111111111*G0_0_1_2_0 - 0.044444444444445*G0_0_1_2_2 + 0.0111111111111111*G0_1_0_0_1 - 0.0111111111111111*G0_1_0_0_2 + 0.0111111111111111*G0_1_0_1_0 - 0.0444444444444448*G0_1_0_1_1 - 0.0111111111111111*G0_1_0_2_0 + 0.044444444444445*G0_1_0_2_2; + A[24] = -A[18] - 0.333333333333333*G0_1_0_0_0 - 0.0777777777777778*G0_1_0_0_1 - 0.0555555555555556*G0_1_0_0_2 - 0.0777777777777778*G0_1_0_1_0 + 0.0222222222222226*G0_1_0_1_1 - 0.0111111111111111*G0_1_0_1_2 - 0.0555555555555556*G0_1_0_2_0 - 0.0111111111111111*G0_1_0_2_1 - 0.0666666666666672*G0_1_0_2_2 - 0.333333333333333*G0_1_1_0_0 - 0.0777777777777778*G0_1_1_0_1 - 0.0555555555555556*G0_1_1_0_2 - 0.0777777777777778*G0_1_1_1_0 + 0.0222222222222227*G0_1_1_1_1 - 0.0111111111111111*G0_1_1_1_2 - 0.0555555555555556*G0_1_1_2_0 - 0.0111111111111111*G0_1_1_2_1 - 0.0666666666666672*G0_1_1_2_2; + A[30] = -A[18] - 0.333333333333333*G0_0_0_0_0 - 0.0555555555555555*G0_0_0_0_1 - 0.0777777777777778*G0_0_0_0_2 - 0.0555555555555555*G0_0_0_1_0 - 0.0666666666666671*G0_0_0_1_1 - 0.0111111111111111*G0_0_0_1_2 - 0.0777777777777778*G0_0_0_2_0 - 0.0111111111111111*G0_0_0_2_1 + 0.0222222222222228*G0_0_0_2_2 - 0.333333333333333*G0_0_1_0_0 - 0.0555555555555555*G0_0_1_0_1 - 0.0777777777777778*G0_0_1_0_2 - 0.0555555555555555*G0_0_1_1_0 - 0.0666666666666671*G0_0_1_1_1 - 0.0111111111111111*G0_0_1_1_2 - 0.0777777777777778*G0_0_1_2_0 - 0.0111111111111111*G0_0_1_2_1 + 0.0222222222222227*G0_0_1_2_2; + A[4] = -A[3] - 0.333333333333333*G0_0_1_0_0 - 0.0777777777777778*G0_0_1_0_1 - 0.0555555555555556*G0_0_1_0_2 - 0.0777777777777778*G0_0_1_1_0 + 0.0222222222222227*G0_0_1_1_1 - 0.0111111111111111*G0_0_1_1_2 - 0.0555555555555556*G0_0_1_2_0 - 0.0111111111111111*G0_0_1_2_1 - 0.0666666666666672*G0_0_1_2_2 - 0.333333333333333*G0_1_1_0_0 - 0.0777777777777778*G0_1_1_0_1 - 0.0555555555555556*G0_1_1_0_2 - 0.0777777777777778*G0_1_1_1_0 + 0.0222222222222227*G0_1_1_1_1 - 0.0111111111111111*G0_1_1_1_2 - 0.0555555555555556*G0_1_1_2_0 - 0.0111111111111111*G0_1_1_2_1 - 0.0666666666666672*G0_1_1_2_2; + A[25] = A[10] + 0.0444444444444443*G0_0_1_0_0 - 0.0111111111111111*G0_0_1_0_1 - 0.0111111111111111*G0_0_1_1_0 + 0.0111111111111111*G0_0_1_1_2 + 0.0111111111111111*G0_0_1_2_1 - 0.0444444444444446*G0_0_1_2_2 - 0.0444444444444443*G0_1_0_0_0 + 0.0111111111111111*G0_1_0_0_1 + 0.0111111111111111*G0_1_0_1_0 - 0.0111111111111111*G0_1_0_1_2 - 0.0111111111111111*G0_1_0_2_1 + 0.0444444444444446*G0_1_0_2_2; + A[5] = -A[3] - 0.333333333333333*G0_0_0_0_0 - 0.0555555555555555*G0_0_0_0_1 - 0.0777777777777778*G0_0_0_0_2 - 0.0555555555555555*G0_0_0_1_0 - 0.0666666666666671*G0_0_0_1_1 - 0.0111111111111111*G0_0_0_1_2 - 0.0777777777777778*G0_0_0_2_0 - 0.0111111111111111*G0_0_0_2_1 + 0.0222222222222228*G0_0_0_2_2 - 0.333333333333333*G0_1_0_0_0 - 0.0555555555555555*G0_1_0_0_1 - 0.0777777777777778*G0_1_0_0_2 - 0.0555555555555555*G0_1_0_1_0 - 0.0666666666666671*G0_1_0_1_1 - 0.0111111111111111*G0_1_0_1_2 - 0.0777777777777778*G0_1_0_2_0 - 0.0111111111111111*G0_1_0_2_1 + 0.0222222222222227*G0_1_0_2_2; + A[6] = -A[8] + 0.0499999999999999*G0_0_0_0_0 + 0.00277777777777777*G0_0_0_0_1 + 0.0138888888888889*G0_0_0_0_2 + 0.00277777777777777*G0_0_0_1_0 + 0.0500000000000003*G0_0_0_1_1 + 0.0138888888888889*G0_0_0_1_2 + 0.0138888888888889*G0_0_0_2_0 + 0.0138888888888889*G0_0_0_2_1 + 0.00555555555555548*G0_0_0_2_2 + 0.0444444444444443*G0_0_1_0_0 - 0.0111111111111111*G0_0_1_0_1 - 0.0111111111111111*G0_0_1_1_0 + 0.0111111111111111*G0_0_1_1_2 + 0.0111111111111111*G0_0_1_2_1 - 0.0444444444444446*G0_0_1_2_2; + A[19] = -A[25] - 0.0222222222222221*G0_1_0_0_0 + 0.0777777777777775*G0_1_0_0_1 + 0.011111111111111*G0_1_0_0_2 + 0.0777777777777775*G0_1_0_1_0 + 0.333333333333334*G0_1_0_1_1 + 0.0555555555555557*G0_1_0_1_2 + 0.011111111111111*G0_1_0_2_0 + 0.0555555555555557*G0_1_0_2_1 + 0.0666666666666668*G0_1_0_2_2; + A[31] = -A[19] - 0.111111111111111*G0_0_0_0_0 - 0.0333333333333333*G0_0_0_0_1 - 0.0555555555555556*G0_0_0_0_2 - 0.0333333333333333*G0_0_0_1_0 - 0.2*G0_0_0_1_1 - 0.0333333333333335*G0_0_0_1_2 - 0.0555555555555556*G0_0_0_2_0 - 0.0333333333333335*G0_0_0_2_1 - 0.111111111111111*G0_0_0_2_2; + A[12] = -A[13] + 0.0444444444444443*G0_1_0_0_0 - 0.0111111111111111*G0_1_0_0_2 - 0.0444444444444445*G0_1_0_1_1 + 0.0111111111111111*G0_1_0_1_2 - 0.0111111111111111*G0_1_0_2_0 + 0.0111111111111111*G0_1_0_2_1 + 0.0499999999999999*G0_1_1_0_0 + 0.0138888888888889*G0_1_1_0_1 + 0.00277777777777778*G0_1_1_0_2 + 0.0138888888888889*G0_1_1_1_0 + 0.00555555555555551*G0_1_1_1_1 + 0.013888888888889*G0_1_1_1_2 + 0.00277777777777778*G0_1_1_2_0 + 0.013888888888889*G0_1_1_2_1 + 0.0500000000000005*G0_1_1_2_2; + A[15] = -A[17] - 0.0222222222222221*G0_1_0_0_0 + 0.011111111111111*G0_1_0_0_1 + 0.0777777777777776*G0_1_0_0_2 + 0.011111111111111*G0_1_0_1_0 + 0.0666666666666668*G0_1_0_1_1 + 0.0555555555555557*G0_1_0_1_2 + 0.0777777777777776*G0_1_0_2_0 + 0.0555555555555557*G0_1_0_2_1 + 0.333333333333334*G0_1_0_2_2; + A[16] = -A[15] - 0.111111111111111*G0_1_1_0_0 - 0.0555555555555555*G0_1_1_0_1 - 0.0333333333333333*G0_1_1_0_2 - 0.0555555555555555*G0_1_1_1_0 - 0.111111111111111*G0_1_1_1_1 - 0.0333333333333335*G0_1_1_1_2 - 0.0333333333333333*G0_1_1_2_0 - 0.0333333333333335*G0_1_1_2_1 - 0.2*G0_1_1_2_2; + A[32] = A[17] - 0.0444444444444443*G0_0_1_0_0 + 0.0111111111111111*G0_0_1_0_2 + 0.0444444444444445*G0_0_1_1_1 - 0.0111111111111111*G0_0_1_1_2 + 0.0111111111111111*G0_0_1_2_0 - 0.0111111111111111*G0_0_1_2_1 + 0.0444444444444443*G0_1_0_0_0 - 0.0111111111111111*G0_1_0_0_2 - 0.0444444444444446*G0_1_0_1_1 + 0.0111111111111111*G0_1_0_1_2 - 0.0111111111111111*G0_1_0_2_0 + 0.0111111111111111*G0_1_0_2_1; + A[20] = -A[32] - 0.0222222222222221*G0_0_1_0_0 + 0.011111111111111*G0_0_1_0_1 + 0.0777777777777776*G0_0_1_0_2 + 0.011111111111111*G0_0_1_1_0 + 0.0666666666666668*G0_0_1_1_1 + 0.0555555555555557*G0_0_1_1_2 + 0.0777777777777776*G0_0_1_2_0 + 0.0555555555555557*G0_0_1_2_1 + 0.333333333333334*G0_0_1_2_2; + A[26] = -A[20] - 0.111111111111111*G0_1_1_0_0 - 0.0555555555555555*G0_1_1_0_1 - 0.0333333333333333*G0_1_1_0_2 - 0.0555555555555555*G0_1_1_1_0 - 0.111111111111111*G0_1_1_1_1 - 0.0333333333333335*G0_1_1_1_2 - 0.0333333333333333*G0_1_1_2_0 - 0.0333333333333335*G0_1_1_2_1 - 0.200000000000001*G0_1_1_2_2; + A[23] = A[26] + 0.0888888888888889*G0_0_0_0_0 + 0.0444444444444444*G0_0_0_0_2 - 0.088888888888889*G0_0_0_1_1 - 0.0444444444444445*G0_0_0_1_2 + 0.0444444444444444*G0_0_0_2_0 - 0.0444444444444445*G0_0_0_2_1 - 0.0222222222222221*G0_0_1_0_0 - 0.0333333333333331*G0_0_1_0_1 + 0.0222222222222222*G0_0_1_0_2 - 0.0333333333333331*G0_0_1_1_0 - 0.111111111111111*G0_0_1_1_1 - 0.022222222222222*G0_0_1_1_2 + 0.0222222222222222*G0_0_1_2_0 - 0.022222222222222*G0_0_1_2_1 + 0.2*G0_0_1_2_2 + 0.0444444444444445*G0_1_0_0_0 - 0.0444444444444442*G0_1_0_0_1 - 0.0444444444444442*G0_1_0_1_0 - 0.400000000000001*G0_1_0_1_1 - 0.0888888888888891*G0_1_0_1_2 - 0.0888888888888891*G0_1_0_2_1 - 0.0444444444444445*G0_1_0_2_2 - 0.1*G0_1_1_0_1 - 0.1*G0_1_1_1_0 - 0.48888888888889*G0_1_1_1_1 - 0.0777777777777777*G0_1_1_1_2 - 0.0777777777777777*G0_1_1_2_1 + 0.177777777777779*G0_1_1_2_2; + A[21] = -A[23] + 0.177777777777778*G0_0_0_0_0 + 0.0444444444444443*G0_0_0_0_1 + 0.177777777777777*G0_0_0_0_2 + 0.0444444444444443*G0_0_0_1_0 + 0.0888888888888889*G0_0_0_1_2 + 0.177777777777777*G0_0_0_2_0 + 0.0888888888888889*G0_0_0_2_1 + 0.533333333333334*G0_0_0_2_2 + 0.0888888888888887*G0_1_0_0_0 + 0.0444444444444443*G0_1_0_0_2 - 0.266666666666668*G0_1_0_1_1 + 0.0444444444444443*G0_1_0_2_0 + 0.0888888888888887*G0_1_0_2_2; + A[33] = A[23] + 0.0888888888888888*G0_0_1_0_0 + 0.0444444444444443*G0_0_1_0_2 - 0.266666666666668*G0_0_1_1_1 + 0.0444444444444443*G0_0_1_2_0 + 0.0888888888888888*G0_0_1_2_2 - 0.0888888888888888*G0_1_0_0_0 - 0.0444444444444443*G0_1_0_0_2 + 0.266666666666668*G0_1_0_1_1 - 0.0444444444444443*G0_1_0_2_0 - 0.0888888888888888*G0_1_0_2_2; + A[34] = -A[33] + 0.355555555555555*G0_0_1_0_0 + 0.0444444444444446*G0_0_1_0_2 - 0.355555555555556*G0_0_1_1_1 - 0.0444444444444446*G0_0_1_1_2 + 0.0444444444444446*G0_0_1_2_0 - 0.0444444444444446*G0_0_1_2_1 - 0.177777777777778*G0_1_1_0_0 - 0.177777777777777*G0_1_1_0_1 - 0.0444444444444443*G0_1_1_0_2 - 0.177777777777777*G0_1_1_1_0 - 0.533333333333334*G0_1_1_1_1 - 0.0888888888888889*G0_1_1_1_2 - 0.0444444444444443*G0_1_1_2_0 - 0.0888888888888889*G0_1_1_2_1; + A[29] = A[34] - 0.266666666666666*G0_0_1_0_0 + 0.0888888888888885*G0_0_1_1_1 + 0.0444444444444443*G0_0_1_1_2 + 0.0444444444444443*G0_0_1_2_1 + 0.0888888888888885*G0_0_1_2_2 + 0.266666666666666*G0_1_0_0_0 - 0.0888888888888885*G0_1_0_1_1 - 0.0444444444444443*G0_1_0_1_2 - 0.0444444444444443*G0_1_0_2_1 - 0.0888888888888885*G0_1_0_2_2; + A[35] = -A[23] + 0.444444444444444*G0_0_0_0_0 + 0.0888888888888888*G0_0_0_0_1 + 0.133333333333333*G0_0_0_0_2 + 0.0888888888888888*G0_0_0_1_0 + 0.266666666666668*G0_0_0_1_1 + 0.0444444444444446*G0_0_0_1_2 + 0.133333333333333*G0_0_0_2_0 + 0.0444444444444446*G0_0_0_2_1 + 0.0888888888888885*G0_0_0_2_2 - 0.0888888888888889*G0_0_1_0_0 - 0.0444444444444443*G0_0_1_0_2 + 0.266666666666668*G0_0_1_1_1 - 0.0444444444444443*G0_0_1_2_0 - 0.0888888888888888*G0_0_1_2_2; + A[27] = -A[21] + 0.0888888888888887*G0_1_0_0_0 + 0.0444444444444442*G0_1_0_0_1 + 0.0444444444444442*G0_1_0_1_0 + 0.0888888888888887*G0_1_0_1_1 - 0.266666666666668*G0_1_0_2_2 + 0.177777777777778*G0_1_1_0_0 + 0.177777777777777*G0_1_1_0_1 + 0.0444444444444443*G0_1_1_0_2 + 0.177777777777777*G0_1_1_1_0 + 0.533333333333334*G0_1_1_1_1 + 0.0888888888888889*G0_1_1_1_2 + 0.0444444444444443*G0_1_1_2_0 + 0.0888888888888889*G0_1_1_2_1; + A[28] = -A[27] - 0.0888888888888887*G0_0_1_0_0 - 0.0444444444444442*G0_0_1_0_1 - 0.0444444444444442*G0_0_1_1_0 - 0.0888888888888887*G0_0_1_1_1 + 0.266666666666668*G0_0_1_2_2 + 0.444444444444444*G0_1_1_0_0 + 0.133333333333333*G0_1_1_0_1 + 0.0888888888888888*G0_1_1_0_2 + 0.133333333333333*G0_1_1_1_0 + 0.0888888888888886*G0_1_1_1_1 + 0.0444444444444447*G0_1_1_1_2 + 0.0888888888888888*G0_1_1_2_0 + 0.0444444444444447*G0_1_1_2_1 + 0.266666666666668*G0_1_1_2_2; + A[22] = A[27] + 0.0888888888888887*G0_0_1_0_0 + 0.0444444444444442*G0_0_1_0_1 + 0.0444444444444442*G0_0_1_1_0 + 0.0888888888888887*G0_0_1_1_1 - 0.266666666666668*G0_0_1_2_2 - 0.0888888888888887*G0_1_0_0_0 - 0.0444444444444442*G0_1_0_0_1 - 0.0444444444444442*G0_1_0_1_0 - 0.0888888888888887*G0_1_0_1_1 + 0.266666666666668*G0_1_0_2_2; + A[2] = -A[8] + 0.0444444444444443*G0_0_1_0_0 - 0.0111111111111111*G0_0_1_0_2 - 0.0444444444444445*G0_0_1_1_1 + 0.0111111111111111*G0_0_1_1_2 - 0.0111111111111111*G0_0_1_2_0 + 0.0111111111111111*G0_0_1_2_1 + 0.0499999999999999*G0_1_1_0_0 + 0.0138888888888889*G0_1_1_0_1 + 0.00277777777777778*G0_1_1_0_2 + 0.0138888888888889*G0_1_1_1_0 + 0.00555555555555551*G0_1_1_1_1 + 0.013888888888889*G0_1_1_1_2 + 0.00277777777777778*G0_1_1_2_0 + 0.013888888888889*G0_1_1_2_1 + 0.0500000000000005*G0_1_1_2_2; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p1_q2_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p1_q2_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q2_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q2_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q2_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q2_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q2_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q2_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q2_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q2_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q2_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q2_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p1_q3_quadrature.h b/laplacian_2d/laplacian_f2_p1_q3_quadrature.h new file mode 100644 index 0000000..f563fd1 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p1_q3_quadrature.h @@ -0,0 +1,4622 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P1_Q3_QUADRATURE_H +#define __LAPLACIAN_F2_P1_Q3_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q3_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q3_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q3_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q3_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q3_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q3_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q3_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q3_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q3_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q3_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q3_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q3_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p1_q3_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p1_q3_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W12[12] = {0.0254224531851035, 0.0254224531851035, 0.0254224531851035, 0.0583931378631895, 0.0583931378631895, 0.0583931378631895, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187}; + // Quadrature points on the UFC reference element: (0.873821971016996, 0.063089014491502), (0.063089014491502, 0.873821971016996), (0.063089014491502, 0.063089014491502), (0.501426509658179, 0.24928674517091), (0.24928674517091, 0.501426509658179), (0.24928674517091, 0.24928674517091), (0.636502499121399, 0.310352451033785), (0.636502499121399, 0.053145049844816), (0.310352451033785, 0.636502499121399), (0.310352451033785, 0.053145049844816), (0.053145049844816, 0.636502499121399), (0.053145049844816, 0.310352451033785) + + // Value of basis functions at quadrature points. + static const double FE0[12][3] = \ + {{0.0630890144915021, 0.873821971016996, 0.063089014491502}, + {0.0630890144915021, 0.0630890144915021, 0.873821971016996}, + {0.873821971016996, 0.0630890144915021, 0.063089014491502}, + {0.249286745170911, 0.501426509658179, 0.24928674517091}, + {0.249286745170911, 0.24928674517091, 0.501426509658179}, + {0.50142650965818, 0.24928674517091, 0.24928674517091}, + {0.053145049844816, 0.636502499121399, 0.310352451033785}, + {0.310352451033785, 0.636502499121399, 0.053145049844816}, + {0.0531450498448161, 0.310352451033785, 0.636502499121399}, + {0.636502499121399, 0.310352451033785, 0.053145049844816}, + {0.310352451033785, 0.0531450498448161, 0.636502499121399}, + {0.636502499121399, 0.053145049844816, 0.310352451033785}}; + + static const double FE1_D01[12][9] = \ + {{-0.485931890194853, 0.485931890194852, 6.37592643035589, -2.44372756077941, -0.0537330206183708, 0.0537330206183713, 2.44372756077941, -6.37592643035589, 0.0}, + {-0.485931890194854, 3.44372756077941, -0.230167544593386, 1.20457074358531, 2.21356001618603, -5.17135568677059, 0.176434523975019, 0.230167544593386, -1.38100526756033}, + {-3.44372756077941, 0.485931890194852, -0.230167544593387, -0.17643452397502, 5.17135568677058, -2.21356001618602, -1.20457074358531, 0.230167544593386, 1.38100526756034}, + {0.404638308746458, -0.404638308746456, 1.13786605847598, 1.11855323498582, -0.838942397791738, 0.838942397791737, -1.11855323498583, -1.13786605847598, 1.19348975147204e-14}, + {0.404638308746458, -0.118553234985829, -0.28284795547736, 2.25318217517853, -1.40140119046319, 1.11531611670256, -0.556094442314379, 0.282847955477361, -1.69708773286415}, + {0.118553234985824, -0.404638308746456, -0.28284795547736, 0.556094442314372, -1.11531611670255, 1.40140119046319, -2.25318217517854, 0.282847955477361, 1.69708773286417}, + {-0.559823901757263, -0.492870367157913, 2.60506707768882, 2.46932174262301, 0.750232850760382, 0.302461418154795, 1.95093340590806, -2.60506707768882, -4.42025514853108}, + {0.492870367157913, 0.559823901757263, 2.60506707768882, -1.95093340590806, -0.302461418154795, -0.750232850760382, -2.46932174262301, -2.60506707768882, 4.42025514853108}, + {-0.559823901757264, 0.740805831642528, -0.0962843375058819, 3.93699695901727, 1.749910031967, -1.93089196185226, 0.951256224701445, 0.096284337505882, -4.88825318371872}, + {-0.740805831642527, 0.559823901757263, -0.0962843375058788, -0.951256224701449, 1.93089196185226, -1.749910031967, -3.93699695901728, 0.09628433750588, 4.88825318371872}, + {0.492870367157913, 0.740805831642527, -0.201023373941063, 0.674175115836558, -2.56560608012889, 1.33192988132845, -0.206177080648912, 0.201023373941063, -0.467998035187647}, + {-0.740805831642527, -0.492870367157913, -0.201023373941065, 0.206177080648914, -1.33192988132845, 2.56560608012889, -0.674175115836559, 0.201023373941066, 0.467998035187645}}; + + // Array of non-zero columns + static const unsigned int nzc0[9] = {0, 2, 3, 4, 5, 6, 7, 8, 9}; + + static const double FE1_D10[12][9] = \ + {{-0.485931890194853, 3.44372756077941, 1.20457074358531, -0.230167544593389, 0.176434523975015, 0.230167544593389, 2.21356001618602, -5.17135568677058, -1.38100526756033}, + {-0.485931890194854, 0.485931890194854, -2.44372756077941, 6.3759264303559, 2.44372756077941, -6.3759264303559, -0.0537330206183701, 0.0537330206183679, 0.0}, + {-3.44372756077941, 0.485931890194852, -0.176434523975019, -0.23016754459339, -1.20457074358531, 0.230167544593389, 5.17135568677058, -2.21356001618602, 1.38100526756033}, + {0.404638308746458, -0.118553234985828, 2.25318217517853, -0.28284795547736, -0.556094442314379, 0.282847955477361, -1.40140119046319, 1.11531611670256, -1.69708773286415}, + {0.404638308746458, -0.404638308746456, 1.11855323498582, 1.13786605847598, -1.11855323498584, -1.13786605847598, -0.838942397791738, 0.838942397791735, 1.45710757386118e-14}, + {0.118553234985824, -0.404638308746456, 0.556094442314372, -0.282847955477361, -2.25318217517854, 0.282847955477361, -1.11531611670255, 1.40140119046318, 1.69708773286417}, + {-0.559823901757263, 0.740805831642528, 3.93699695901727, -0.0962843375058778, 0.951256224701447, 0.0962843375058791, 1.749910031967, -1.93089196185226, -4.88825318371872}, + {0.492870367157913, 0.740805831642527, 0.674175115836558, -0.201023373941065, -0.206177080648914, 0.201023373941066, -2.56560608012889, 1.33192988132845, -0.467998035187644}, + {-0.559823901757263, -0.492870367157914, 2.46932174262301, 2.60506707768883, 1.95093340590806, -2.60506707768882, 0.750232850760382, 0.302461418154794, -4.42025514853107}, + {-0.740805831642527, -0.492870367157913, 0.206177080648913, -0.201023373941065, -0.674175115836559, 0.201023373941066, -1.33192988132845, 2.56560608012889, 0.467998035187646}, + {0.492870367157913, 0.559823901757263, -1.95093340590806, 2.60506707768882, -2.46932174262301, -2.60506707768882, -0.302461418154794, -0.750232850760383, 4.42025514853107}, + {-0.740805831642527, 0.559823901757263, -0.951256224701447, -0.0962843375058804, -3.93699695901727, 0.0962843375058801, 1.93089196185226, -1.749910031967, 4.88825318371872}}; + + // Array of non-zero columns + static const unsigned int nzc1[9] = {0, 1, 3, 4, 5, 6, 7, 8, 9}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 100; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 11916 + for (unsigned int ip = 0; ip < 12; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 12 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[0][r]; + F1 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W12[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W12[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W12[ip]; + + + // Number of operations for primary indices: 972 + for (unsigned int j = 0; j < 9; j++) + { + for (unsigned int k = 0; k < 9; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p1_q3_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p1_q3_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q3_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q3_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q3_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q3_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q3_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q3_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q3_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q3_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q3_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p1_q3_tensor.h b/laplacian_2d/laplacian_f2_p1_q3_tensor.h new file mode 100644 index 0000000..1286194 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p1_q3_tensor.h @@ -0,0 +1,4648 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P1_Q3_TENSOR_H +#define __LAPLACIAN_F2_P1_Q3_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q3_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q3_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q3_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q3_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q3_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q3_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q3_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q3_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q3_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q3_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q3_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q3_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p1_q3_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p1_q3_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 108 + // Number of operations (multiply-add pairs) for tensor contraction: 1854 + // Total number of operations (multiply-add pairs): 1973 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[73] = -0.0803571428571437*G0_0_0_0_0 - 0.0361607142857141*G0_0_0_0_1 - 0.0281250000000002*G0_0_0_0_2 - 0.0361607142857141*G0_0_0_1_0 + 0.0924107142857175*G0_0_0_1_1 + 0.0401785714285733*G0_0_0_1_2 - 0.0281250000000002*G0_0_0_2_0 + 0.0401785714285733*G0_0_0_2_1 + 0.0361607142857157*G0_0_0_2_2 - 0.0522321428571434*G0_0_1_0_0 - 0.0381696428571436*G0_0_1_0_1 - 0.00602678571428574*G0_0_1_0_2 - 0.0381696428571436*G0_0_1_1_0 + 0.216964285714288*G0_0_1_1_1 + 0.0381696428571437*G0_0_1_1_2 - 0.00602678571428574*G0_0_1_2_0 + 0.0381696428571437*G0_0_1_2_1 + 0.0160714285714289*G0_0_1_2_2 - 0.0321428571428569*G0_1_0_0_0 - 0.032142857142857*G0_1_0_0_1 - 0.00803571428571412*G0_1_0_0_2 - 0.032142857142857*G0_1_0_1_0 + 0.120535714285717*G0_1_0_1_1 + 0.0562500000000018*G0_1_0_1_2 - 0.00803571428571412*G0_1_0_2_0 + 0.0562500000000018*G0_1_0_2_1 + 0.0482142857142871*G0_1_0_2_2 - 0.00401785714285787*G0_1_1_0_0 - 0.0241071428571437*G0_1_1_0_1 + 0.00401785714285708*G0_1_1_0_2 - 0.0241071428571437*G0_1_1_1_0 + 0.265178571428573*G0_1_1_1_1 + 0.0482142857142865*G0_1_1_1_2 + 0.00401785714285708*G0_1_1_2_0 + 0.0482142857142865*G0_1_1_2_1 + 0.0200892857142861*G0_1_1_2_2; + A[69] = -0.0241071428571438*G0_0_0_0_0 - 0.0723214285714303*G0_0_0_0_2 + 0.0241071428571439*G0_0_0_1_1 + 0.0723214285714301*G0_0_0_1_2 - 0.0723214285714303*G0_0_0_2_0 + 0.0723214285714301*G0_0_0_2_1 + 0.0482142857142858*G0_0_1_0_0 + 0.0361607142857143*G0_0_1_0_1 + 0.0602678571428569*G0_0_1_0_2 + 0.0361607142857143*G0_0_1_1_0 + 0.0723214285714296*G0_0_1_1_1 + 0.132589285714287*G0_0_1_1_2 + 0.0602678571428569*G0_0_1_2_0 + 0.132589285714287*G0_0_1_2_1 + 0.433928571428575*G0_0_1_2_2 + 0.192857142857146*G0_1_0_0_0 + 0.0241071428571429*G0_1_0_0_1 + 0.168750000000003*G0_1_0_0_2 + 0.0241071428571429*G0_1_0_1_0 + 0.0723214285714302*G0_1_0_1_2 + 0.168750000000003*G0_1_0_2_0 + 0.0723214285714302*G0_1_0_2_1 + 0.28928571428572*G0_1_0_2_2 - 0.168750000000004*G0_1_1_0_0 - 0.0843750000000025*G0_1_1_0_1 + 0.0120535714285713*G0_1_1_0_2 - 0.0843750000000025*G0_1_1_1_0 - 0.0723214285714301*G0_1_1_1_1 + 0.0602678571428587*G0_1_1_1_2 + 0.0120535714285713*G0_1_1_2_0 + 0.0602678571428587*G0_1_1_2_1 + 0.265178571428575*G0_1_1_2_2; + A[16] = -0.00401785714285728*G0_0_0_0_0 + 0.00200892857142856*G0_0_0_0_1 - 0.0113839285714289*G0_0_0_0_2 + 0.00200892857142856*G0_0_0_1_0 + 0.024107142857143*G0_0_0_1_1 + 0.00870535714285718*G0_0_0_1_2 - 0.0113839285714289*G0_0_0_2_0 + 0.00870535714285718*G0_0_0_2_1 - 0.0562500000000012*G0_0_0_2_2 + 0.00803571428571493*G0_0_1_0_0 - 0.00200892857142853*G0_0_1_0_1 + 0.00736607142857182*G0_0_1_0_2 - 0.00200892857142852*G0_0_1_1_0 + 0.0020089285714287*G0_0_1_1_2 + 0.00736607142857182*G0_0_1_2_0 + 0.0020089285714287*G0_0_1_2_1 - 0.0227678571428572*G0_0_1_2_2; + A[37] = A[73] + 0.0200892857142865*G0_0_1_0_0 + 0.00602678571428659*G0_0_1_0_1 - 0.00200892857142839*G0_0_1_0_2 + 0.00602678571428658*G0_0_1_1_0 - 0.0964285714285708*G0_0_1_1_1 + 0.0180803571428581*G0_0_1_1_2 - 0.00200892857142839*G0_0_1_2_0 + 0.018080357142858*G0_0_1_2_1 + 0.0321428571428582*G0_0_1_2_2 - 0.0200892857142865*G0_1_0_0_0 - 0.00602678571428659*G0_1_0_0_1 + 0.00200892857142838*G0_1_0_0_2 - 0.00602678571428659*G0_1_0_1_0 + 0.0964285714285708*G0_1_0_1_1 - 0.0180803571428581*G0_1_0_1_2 + 0.00200892857142838*G0_1_0_2_0 - 0.0180803571428581*G0_1_0_2_1 - 0.0321428571428582*G0_1_0_2_2; + A[11] = 0.0217261904761908*G0_0_0_0_0 + 0.026934523809524*G0_0_0_0_1 + 0.0108630952380954*G0_0_0_0_2 + 0.026934523809524*G0_0_0_1_0 + 0.252083333333335*G0_0_0_1_1 + 0.026934523809524*G0_0_0_1_2 + 0.0108630952380954*G0_0_0_2_0 + 0.026934523809524*G0_0_0_2_1 + 0.0217261904761908*G0_0_0_2_2; + A[82] = 0.00803571428571495*G0_0_1_0_0 + 0.00736607142857186*G0_0_1_0_1 - 0.00200892857142855*G0_0_1_0_2 + 0.00736607142857186*G0_0_1_1_0 - 0.0227678571428568*G0_0_1_1_1 + 0.0020089285714287*G0_0_1_1_2 - 0.00200892857142855*G0_0_1_2_0 + 0.0020089285714287*G0_0_1_2_1 - 0.00401785714285731*G0_1_1_0_0 - 0.0113839285714289*G0_1_1_0_1 + 0.00200892857142853*G0_1_1_0_2 - 0.0113839285714289*G0_1_1_1_0 - 0.0562500000000008*G0_1_1_1_1 + 0.0087053571428572*G0_1_1_1_2 + 0.00200892857142853*G0_1_1_2_0 + 0.00870535714285719*G0_1_1_2_1 + 0.0241071428571428*G0_1_1_2_2; + A[32] = -A[82] + 0.00401785714285786*G0_0_1_0_0 + 0.000669642857143376*G0_0_1_0_1 - 0.0261160714285716*G0_0_1_0_2 + 0.000669642857143375*G0_0_1_1_0 - 0.045535714285714*G0_0_1_1_1 - 0.0194196428571427*G0_0_1_1_2 - 0.0261160714285716*G0_0_1_2_0 - 0.0194196428571427*G0_0_1_2_1 - 0.168750000000002*G0_0_1_2_2; + A[45] = A[73] + 0.0763392857142861*G0_0_0_0_0 + 0.0401785714285712*G0_0_0_0_1 + 0.00401785714285668*G0_0_0_0_2 + 0.0401785714285712*G0_0_0_1_0 - 0.0723214285714313*G0_0_0_1_1 + 0.00803571428571336*G0_0_0_1_2 + 0.00401785714285668*G0_0_0_2_0 + 0.00803571428571335*G0_0_0_2_1 + 0.229017857142859*G0_0_0_2_2 + 0.0321428571428578*G0_0_1_0_1 - 0.0321428571428577*G0_0_1_0_2 + 0.0321428571428578*G0_0_1_1_0 - 0.200892857142859*G0_0_1_1_1 - 0.0321428571428577*G0_0_1_2_0 + 0.20089285714286*G0_0_1_2_2 + 0.0241071428571429*G0_1_0_0_1 - 0.0241071428571429*G0_1_0_0_2 + 0.0241071428571429*G0_1_0_1_0 - 0.0723214285714299*G0_1_0_1_1 - 0.0241071428571429*G0_1_0_2_0 + 0.0723214285714302*G0_1_0_2_2 - 0.076339285714286*G0_1_1_0_0 - 0.00401785714285653*G0_1_1_0_1 - 0.0401785714285712*G0_1_1_0_2 - 0.00401785714285653*G0_1_1_1_0 - 0.229017857142858*G0_1_1_1_1 - 0.0080357142857132*G0_1_1_1_2 - 0.0401785714285712*G0_1_1_2_0 - 0.0080357142857132*G0_1_1_2_1 + 0.0723214285714316*G0_1_1_2_2; + A[1] = -0.0324404761904765*G0_0_0_0_0 - 0.000818452380952324*G0_0_0_0_1 - 0.00483630952380956*G0_0_0_0_2 - 0.000818452380952324*G0_0_0_1_0 - 0.0324404761904766*G0_0_0_1_1 - 0.00483630952380957*G0_0_0_1_2 - 0.00483630952380956*G0_0_0_2_0 - 0.00483630952380957*G0_0_0_2_1 - 0.00163690476190473*G0_0_0_2_2 - 0.0324404761904765*G0_1_0_0_0 - 0.000818452380952321*G0_1_0_0_1 - 0.00483630952380956*G0_1_0_0_2 - 0.000818452380952322*G0_1_0_1_0 - 0.0324404761904765*G0_1_0_1_1 - 0.00483630952380956*G0_1_0_1_2 - 0.00483630952380956*G0_1_0_2_0 - 0.00483630952380956*G0_1_0_2_1 - 0.00163690476190472*G0_1_0_2_2; + A[78] = -A[73] - 0.462053571428577*G0_0_0_0_0 - 0.158705357142858*G0_0_0_0_1 - 0.102455357142858*G0_0_0_0_2 - 0.158705357142858*G0_0_0_1_0 - 0.289285714285716*G0_0_0_1_1 - 0.0341517857142846*G0_0_0_1_2 - 0.102455357142858*G0_0_0_2_0 - 0.0341517857142846*G0_0_0_2_1 - 0.00803571428571341*G0_0_0_2_2 - 0.196875000000002*G0_1_0_0_0 - 0.192857142857145*G0_1_0_0_1 - 0.0441964285714283*G0_1_0_0_2 - 0.192857142857145*G0_1_0_1_0 - 0.313392857142859*G0_1_0_1_1 - 0.0241071428571418*G0_1_0_1_2 - 0.0441964285714283*G0_1_0_2_0 - 0.0241071428571418*G0_1_0_2_1 + 0.0200892857142868*G0_1_0_2_2; + A[21] = 0.0016369047619047*G0_1_0_0_0 + 0.00483630952380956*G0_1_0_0_1 + 0.00483630952380958*G0_1_0_0_2 + 0.00483630952380956*G0_1_0_1_0 + 0.0324404761904765*G0_1_0_1_1 + 0.000818452380952328*G0_1_0_1_2 + 0.00483630952380958*G0_1_0_2_0 + 0.000818452380952326*G0_1_0_2_1 + 0.0324404761904767*G0_1_0_2_2; + A[72] = A[82] + 0.0147321428571419*G0_0_1_0_0 - 0.0147321428571437*G0_0_1_0_1 - 0.0147321428571437*G0_0_1_1_0 + 0.0147321428571418*G0_0_1_1_1 - 0.0294642857142866*G0_1_1_0_0 - 0.00736607142857184*G0_1_1_0_1 + 0.00468750000000001*G0_1_1_0_2 - 0.00736607142857183*G0_1_1_1_0 + 0.0441964285714286*G0_1_1_1_1 - 0.0046875000000001*G0_1_1_1_2 + 0.00468750000000001*G0_1_1_2_0 - 0.0046875000000001*G0_1_1_2_1; + A[15] = A[16] - 0.0294642857142866*G0_0_0_0_0 + 0.00468749999999994*G0_0_0_0_1 - 0.0073660714285718*G0_0_0_0_2 + 0.00468749999999994*G0_0_0_1_0 - 0.00468750000000008*G0_0_0_1_2 - 0.00736607142857179*G0_0_0_2_0 - 0.00468750000000008*G0_0_0_2_1 + 0.0441964285714291*G0_0_0_2_2 + 0.0147321428571419*G0_0_1_0_0 - 0.0147321428571437*G0_0_1_0_2 - 0.0147321428571437*G0_0_1_2_0 + 0.0147321428571424*G0_0_1_2_2; + A[51] = A[15] - 0.0227678571428569*G0_0_1_0_0 + 0.00200892857142871*G0_0_1_0_1 + 0.00736607142857182*G0_0_1_0_2 + 0.00200892857142872*G0_0_1_1_0 - 0.00200892857142853*G0_0_1_1_2 + 0.00736607142857182*G0_0_1_2_0 - 0.00200892857142853*G0_0_1_2_1 + 0.00803571428571477*G0_0_1_2_2 + 0.0227678571428569*G0_1_0_0_0 - 0.00200892857142872*G0_1_0_0_1 - 0.00736607142857183*G0_1_0_0_2 - 0.00200892857142872*G0_1_0_1_0 + 0.00200892857142853*G0_1_0_1_2 - 0.00736607142857183*G0_1_0_2_0 + 0.00200892857142853*G0_1_0_2_1 - 0.00803571428571477*G0_1_0_2_2; + A[31] = -A[51] - 0.05357142857143*G0_0_0_0_0 + 0.0120535714285714*G0_0_0_0_1 - 0.0388392857142868*G0_0_0_0_2 + 0.0120535714285713*G0_0_0_1_0 + 0.150000000000001*G0_0_0_1_1 + 0.0147321428571431*G0_0_0_1_2 - 0.0388392857142868*G0_0_0_2_0 + 0.0147321428571431*G0_0_0_2_1 - 0.07232142857143*G0_0_0_2_2 + 0.0308035714285712*G0_1_0_0_0 + 0.047544642857143*G0_1_0_0_1 - 0.00334821428571474*G0_1_0_0_2 + 0.047544642857143*G0_1_0_1_0 + 0.490178571428575*G0_1_0_1_1 + 0.0515625000000002*G0_1_0_1_2 - 0.00334821428571474*G0_1_0_2_0 + 0.0515625000000002*G0_1_0_2_1; + A[22] = 0.0217261904761908*G0_1_1_0_0 + 0.0108630952380954*G0_1_1_0_1 + 0.026934523809524*G0_1_1_0_2 + 0.0108630952380954*G0_1_1_1_0 + 0.0217261904761908*G0_1_1_1_1 + 0.026934523809524*G0_1_1_1_2 + 0.026934523809524*G0_1_1_2_0 + 0.026934523809524*G0_1_1_2_1 + 0.252083333333336*G0_1_1_2_2; + A[54] = A[45] + 0.0200892857142867*G0_0_1_0_0 - 0.00200892857142833*G0_0_1_0_1 + 0.00602678571428644*G0_0_1_0_2 - 0.00200892857142833*G0_0_1_1_0 + 0.0321428571428585*G0_0_1_1_1 + 0.0180803571428579*G0_0_1_1_2 + 0.00602678571428644*G0_0_1_2_0 + 0.0180803571428579*G0_0_1_2_1 - 0.0964285714285717*G0_0_1_2_2 - 0.0200892857142867*G0_1_0_0_0 + 0.00200892857142833*G0_1_0_0_1 - 0.00602678571428644*G0_1_0_0_2 + 0.00200892857142833*G0_1_0_1_0 - 0.0321428571428584*G0_1_0_1_1 - 0.0180803571428579*G0_1_0_1_2 - 0.00602678571428644*G0_1_0_2_0 - 0.0180803571428579*G0_1_0_2_1 + 0.0964285714285717*G0_1_0_2_2; + A[10] = -0.0324404761904765*G0_0_0_0_0 - 0.000818452380952324*G0_0_0_0_1 - 0.00483630952380956*G0_0_0_0_2 - 0.000818452380952324*G0_0_0_1_0 - 0.0324404761904766*G0_0_0_1_1 - 0.00483630952380957*G0_0_0_1_2 - 0.00483630952380956*G0_0_0_2_0 - 0.00483630952380957*G0_0_0_2_1 - 0.00163690476190473*G0_0_0_2_2 - 0.0324404761904765*G0_0_1_0_0 - 0.000818452380952322*G0_0_1_0_1 - 0.00483630952380956*G0_0_1_0_2 - 0.000818452380952323*G0_0_1_1_0 - 0.0324404761904765*G0_0_1_1_1 - 0.00483630952380956*G0_0_1_1_2 - 0.00483630952380956*G0_0_1_2_0 - 0.00483630952380956*G0_0_1_2_1 - 0.00163690476190472*G0_0_1_2_2; + A[27] = A[72] - 0.0227678571428568*G0_0_1_0_0 + 0.00736607142857186*G0_0_1_0_1 + 0.00200892857142872*G0_0_1_0_2 + 0.00736607142857186*G0_0_1_1_0 + 0.00803571428571496*G0_0_1_1_1 - 0.00200892857142853*G0_0_1_1_2 + 0.00200892857142872*G0_0_1_2_0 - 0.00200892857142853*G0_0_1_2_1 + 0.0227678571428568*G0_1_0_0_0 - 0.00736607142857186*G0_1_0_0_1 - 0.00200892857142872*G0_1_0_0_2 - 0.00736607142857186*G0_1_0_1_0 - 0.00803571428571496*G0_1_0_1_1 + 0.00200892857142853*G0_1_0_1_2 - 0.00200892857142871*G0_1_0_2_0 + 0.00200892857142853*G0_1_0_2_1; + A[26] = A[27] - 0.0308035714285711*G0_1_0_0_0 + 0.00334821428571475*G0_1_0_0_1 - 0.0475446428571431*G0_1_0_0_2 + 0.00334821428571475*G0_1_0_1_0 - 0.0515625000000003*G0_1_0_1_2 - 0.0475446428571431*G0_1_0_2_0 - 0.0515625000000003*G0_1_0_2_1 - 0.490178571428576*G0_1_0_2_2 - 0.0348214285714284*G0_1_1_0_0 - 0.00535714285714248*G0_1_1_0_1 - 0.0455357142857144*G0_1_1_0_2 - 0.00535714285714248*G0_1_1_1_0 - 0.0160714285714282*G0_1_1_1_1 - 0.0482142857142861*G0_1_1_1_2 - 0.0455357142857144*G0_1_1_2_0 - 0.0482142857142861*G0_1_1_2_1 - 0.388392857142861*G0_1_1_2_2; + A[92] = -0.0187500000000002*G0_0_1_0_0 + 0.00267857142857161*G0_0_1_0_2 + 0.0187500000000001*G0_0_1_1_1 - 0.00267857142857171*G0_0_1_1_2 + 0.00267857142857161*G0_0_1_2_0 - 0.00267857142857171*G0_0_1_2_1 + 0.0535714285714301*G0_1_1_0_0 + 0.0388392857142868*G0_1_1_0_1 - 0.0120535714285714*G0_1_1_0_2 + 0.0388392857142868*G0_1_1_1_0 + 0.0723214285714302*G0_1_1_1_1 - 0.0147321428571431*G0_1_1_1_2 - 0.0120535714285714*G0_1_1_2_0 - 0.0147321428571431*G0_1_1_2_1 - 0.150000000000001*G0_1_1_2_2; + A[61] = A[51] + 0.0294642857142866*G0_0_0_0_0 - 0.00468749999999994*G0_0_0_0_1 + 0.00736607142857179*G0_0_0_0_2 - 0.00468749999999994*G0_0_0_1_0 + 0.00468750000000008*G0_0_0_1_2 + 0.00736607142857179*G0_0_0_2_0 + 0.00468750000000008*G0_0_0_2_1 - 0.0441964285714291*G0_0_0_2_2 - 0.0147321428571419*G0_1_0_0_0 + 0.0147321428571437*G0_1_0_0_2 + 0.0147321428571437*G0_1_0_2_0 - 0.0147321428571423*G0_1_0_2_2; + A[41] = -A[61] + 0.00401785714285786*G0_1_0_0_0 - 0.0261160714285715*G0_1_0_0_1 + 0.000669642857143349*G0_1_0_0_2 - 0.0261160714285715*G0_1_0_1_0 - 0.168750000000001*G0_1_0_1_1 - 0.0194196428571426*G0_1_0_1_2 + 0.000669642857143353*G0_1_0_2_0 - 0.0194196428571426*G0_1_0_2_1 - 0.0455357142857143*G0_1_0_2_2; + A[40] = -A[41] + 0.0281250000000003*G0_0_0_0_0 + 0.0200892857142861*G0_0_0_0_2 - 0.0281250000000003*G0_0_0_1_1 - 0.0200892857142861*G0_0_0_1_2 + 0.0200892857142861*G0_0_0_2_0 - 0.0200892857142861*G0_0_0_2_1 + 0.0241071428571431*G0_0_1_0_0 + 0.00200892857142857*G0_0_1_0_1 + 0.00870535714285721*G0_0_1_0_2 + 0.00200892857142857*G0_0_1_1_0 - 0.0040178571428573*G0_0_1_1_1 - 0.0113839285714289*G0_0_1_1_2 + 0.00870535714285721*G0_0_1_2_0 - 0.0113839285714289*G0_0_1_2_1 - 0.0562500000000012*G0_0_1_2_2 + 0.0200892857142862*G0_1_0_0_0 - 0.0200892857142859*G0_1_0_0_1 - 0.0200892857142859*G0_1_0_1_0 - 0.180803571428573*G0_1_0_1_1 - 0.0401785714285721*G0_1_0_1_2 - 0.0401785714285721*G0_1_0_2_1 - 0.0562500000000011*G0_1_0_2_2 + 0.0241071428571433*G0_1_1_0_0 + 0.00401785714285713*G0_1_1_0_1 + 0.00669642857142852*G0_1_1_0_2 + 0.00401785714285713*G0_1_1_1_0 - 0.0120535714285722*G0_1_1_1_1 - 0.0187500000000008*G0_1_1_1_2 + 0.00669642857142852*G0_1_1_2_0 - 0.0187500000000008*G0_1_1_2_1 - 0.0334821428571441*G0_1_1_2_2; + A[4] = A[40] + 0.00200892857142854*G0_0_1_0_1 - 0.0020089285714287*G0_0_1_0_2 + 0.00200892857142854*G0_0_1_1_0 - 0.00803571428571491*G0_0_1_1_1 - 0.00736607142857184*G0_0_1_1_2 - 0.0020089285714287*G0_0_1_2_0 - 0.00736607142857184*G0_0_1_2_1 + 0.0227678571428571*G0_0_1_2_2 - 0.00200892857142854*G0_1_0_0_1 + 0.0020089285714287*G0_1_0_0_2 - 0.00200892857142854*G0_1_0_1_0 + 0.00803571428571491*G0_1_0_1_1 + 0.00736607142857184*G0_1_0_1_2 + 0.0020089285714287*G0_1_0_2_0 + 0.00736607142857184*G0_1_0_2_1 - 0.0227678571428571*G0_1_0_2_2; + A[60] = -A[40] + 0.168750000000002*G0_1_0_0_0 + 0.0261160714285716*G0_1_0_0_1 + 0.0194196428571427*G0_1_0_0_2 + 0.0261160714285716*G0_1_0_1_0 - 0.00401785714285783*G0_1_0_1_1 - 0.000669642857143358*G0_1_0_1_2 + 0.0194196428571427*G0_1_0_2_0 - 0.000669642857143358*G0_1_0_2_1 + 0.0455357142857143*G0_1_0_2_2 + 0.168750000000002*G0_1_1_0_0 + 0.0261160714285716*G0_1_1_0_1 + 0.0194196428571427*G0_1_1_0_2 + 0.0261160714285716*G0_1_1_1_0 - 0.00401785714285785*G0_1_1_1_1 - 0.000669642857143365*G0_1_1_1_2 + 0.0194196428571427*G0_1_1_2_0 - 0.000669642857143361*G0_1_1_2_1 + 0.0455357142857142*G0_1_1_2_2; + A[71] = -A[41] + 0.0830357142857152*G0_0_0_0_0 + 0.0107142857142856*G0_0_0_0_1 + 0.0294642857142862*G0_0_0_0_2 + 0.0107142857142856*G0_0_0_1_0 + 0.120535714285715*G0_0_0_1_1 + 0.0133928571428573*G0_0_0_1_2 + 0.0294642857142862*G0_0_0_2_0 + 0.0133928571428573*G0_0_0_2_1 + 0.0642857142857154*G0_0_0_2_2 + 0.0187500000000002*G0_1_0_0_0 - 0.00267857142857162*G0_1_0_0_1 - 0.00267857142857163*G0_1_0_1_0 + 0.00267857142857173*G0_1_0_1_2 + 0.00267857142857173*G0_1_0_2_1 - 0.01875*G0_1_0_2_2; + A[13] = A[16] - 0.0160714285714288*G0_0_0_0_0 + 0.0033482142857143*G0_0_0_0_1 - 0.00870535714285715*G0_0_0_0_2 + 0.0033482142857143*G0_0_0_1_0 + 0.101785714285715*G0_0_0_1_1 + 0.00200892857142878*G0_0_0_1_2 - 0.00870535714285715*G0_0_0_2_0 + 0.00200892857142878*G0_0_0_2_1 - 0.00401785714285684*G0_0_0_2_2 + 0.0515625000000003*G0_0_1_0_1 - 0.00334821428571471*G0_0_1_0_2 + 0.0515625000000002*G0_0_1_1_0 + 0.490178571428575*G0_0_1_1_1 + 0.047544642857143*G0_0_1_1_2 - 0.0033482142857147*G0_0_1_2_0 + 0.047544642857143*G0_0_1_2_1 + 0.0308035714285716*G0_0_1_2_2; + A[30] = A[4] + 0.00468749999999994*G0_0_0_0_1 - 0.00468750000000011*G0_0_0_0_2 + 0.00468749999999994*G0_0_0_1_0 - 0.0294642857142867*G0_0_0_1_1 - 0.00736607142857181*G0_0_0_1_2 - 0.00468750000000011*G0_0_0_2_0 - 0.00736607142857181*G0_0_0_2_1 + 0.044196428571429*G0_0_0_2_2 + 0.0026785714285714*G0_0_1_0_1 - 0.00267857142857141*G0_0_1_0_2 + 0.0026785714285714*G0_0_1_1_0 - 0.0214285714285717*G0_0_1_1_1 - 0.00267857142857142*G0_0_1_2_0 + 0.0214285714285719*G0_0_1_2_2 + 0.00669642857142864*G0_1_0_0_1 - 0.00669642857142865*G0_1_0_0_2 + 0.00669642857142864*G0_1_0_1_0 - 0.0522321428571436*G0_1_0_1_1 - 0.00669642857142865*G0_1_0_2_0 + 0.0522321428571438*G0_1_0_2_2 + 0.0046875000000001*G0_1_1_0_1 - 0.00468749999999995*G0_1_1_0_2 + 0.00468750000000009*G0_1_1_1_0 - 0.0441964285714286*G0_1_1_1_1 + 0.00736607142857191*G0_1_1_1_2 - 0.00468749999999995*G0_1_1_2_0 + 0.00736607142857191*G0_1_1_2_1 + 0.0294642857142868*G0_1_1_2_2; + A[28] = A[27] - 0.0147321428571419*G0_1_0_0_0 + 0.0147321428571437*G0_1_0_0_1 + 0.0147321428571437*G0_1_0_1_0 - 0.0147321428571418*G0_1_0_1_1 + 0.0294642857142866*G0_1_1_0_0 + 0.00736607142857184*G0_1_1_0_1 - 0.00468750000000001*G0_1_1_0_2 + 0.00736607142857184*G0_1_1_1_0 - 0.0441964285714286*G0_1_1_1_1 + 0.0046875000000001*G0_1_1_1_2 - 0.00468750000000001*G0_1_1_2_0 + 0.0046875000000001*G0_1_1_2_1; + A[80] = -A[30] + 0.168750000000001*G0_0_0_0_0 + 0.0194196428571427*G0_0_0_0_1 + 0.0261160714285716*G0_0_0_0_2 + 0.0194196428571427*G0_0_0_1_0 + 0.0455357142857142*G0_0_0_1_1 - 0.000669642857143354*G0_0_0_1_2 + 0.0261160714285716*G0_0_0_2_0 - 0.000669642857143358*G0_0_0_2_1 - 0.00401785714285774*G0_0_0_2_2 + 0.168750000000001*G0_0_1_0_0 + 0.0194196428571427*G0_0_1_0_1 + 0.0261160714285716*G0_0_1_0_2 + 0.0194196428571427*G0_0_1_1_0 + 0.0455357142857141*G0_0_1_1_1 - 0.000669642857143368*G0_0_1_1_2 + 0.0261160714285716*G0_0_1_2_0 - 0.000669642857143368*G0_0_1_2_1 - 0.00401785714285778*G0_0_1_2_2; + A[62] = -A[82] + 0.00334821428571475*G0_0_1_0_1 - 0.0515625000000003*G0_0_1_0_2 + 0.00334821428571475*G0_0_1_1_0 - 0.0308035714285711*G0_0_1_1_1 - 0.0475446428571431*G0_0_1_1_2 - 0.0515625000000003*G0_0_1_2_0 - 0.0475446428571431*G0_0_1_2_1 - 0.490178571428576*G0_0_1_2_2 - 0.0723214285714296*G0_1_1_0_0 - 0.0354910714285721*G0_1_1_0_1 - 0.0368303571428574*G0_1_1_0_2 - 0.0354910714285721*G0_1_1_1_0 - 0.0843750000000012*G0_1_1_1_1 - 0.0354910714285718*G0_1_1_1_2 - 0.0368303571428574*G0_1_1_2_0 - 0.0354910714285718*G0_1_1_2_1 - 0.340178571428575*G0_1_1_2_2; + A[14] = -A[16] + 0.00401785714285785*G0_0_1_0_0 - 0.0261160714285715*G0_0_1_0_1 + 0.000669642857143351*G0_0_1_0_2 - 0.0261160714285715*G0_0_1_1_0 - 0.168750000000001*G0_0_1_1_1 - 0.0194196428571426*G0_0_1_1_2 + 0.00066964285714335*G0_0_1_2_0 - 0.0194196428571426*G0_0_1_2_1 - 0.0455357142857143*G0_0_1_2_2; + A[23] = -A[28] + 0.00401785714285786*G0_1_0_0_0 + 0.000669642857143374*G0_1_0_0_1 - 0.0261160714285716*G0_1_0_0_2 + 0.000669642857143375*G0_1_0_1_0 - 0.045535714285714*G0_1_0_1_1 - 0.0194196428571427*G0_1_0_1_2 - 0.0261160714285716*G0_1_0_2_0 - 0.0194196428571427*G0_1_0_2_1 - 0.168750000000002*G0_1_0_2_2; + A[25] = -A[23] + 0.0187500000000002*G0_1_0_0_0 - 0.0026785714285716*G0_1_0_0_2 - 0.0187500000000001*G0_1_0_1_1 + 0.00267857142857172*G0_1_0_1_2 - 0.00267857142857162*G0_1_0_2_0 + 0.00267857142857171*G0_1_0_2_1 + 0.0830357142857153*G0_1_1_0_0 + 0.0294642857142863*G0_1_1_0_1 + 0.0107142857142857*G0_1_1_0_2 + 0.0294642857142863*G0_1_1_1_0 + 0.0642857142857151*G0_1_1_1_1 + 0.0133928571428573*G0_1_1_1_2 + 0.0107142857142857*G0_1_1_2_0 + 0.0133928571428573*G0_1_1_2_1 + 0.120535714285716*G0_1_1_2_2; + A[19] = 0.05357142857143*G0_0_0_0_0 - 0.0120535714285714*G0_0_0_0_1 + 0.0388392857142868*G0_0_0_0_2 - 0.0120535714285714*G0_0_0_1_0 - 0.150000000000001*G0_0_0_1_1 - 0.0147321428571431*G0_0_0_1_2 + 0.0388392857142868*G0_0_0_2_0 - 0.0147321428571431*G0_0_0_2_1 + 0.07232142857143*G0_0_0_2_2 - 0.0187500000000002*G0_0_1_0_0 + 0.00267857142857165*G0_0_1_0_1 + 0.00267857142857165*G0_0_1_1_0 - 0.00267857142857172*G0_0_1_1_2 - 0.00267857142857172*G0_0_1_2_1 + 0.01875*G0_0_1_2_2; + A[87] = -A[37] - 0.462053571428577*G0_0_0_0_0 - 0.158705357142858*G0_0_0_0_1 - 0.102455357142858*G0_0_0_0_2 - 0.158705357142858*G0_0_0_1_0 - 0.289285714285716*G0_0_0_1_1 - 0.0341517857142845*G0_0_0_1_2 - 0.102455357142858*G0_0_0_2_0 - 0.0341517857142845*G0_0_0_2_1 - 0.0080357142857134*G0_0_0_2_2 - 0.196875000000002*G0_0_1_0_0 - 0.192857142857145*G0_0_1_0_1 - 0.0441964285714283*G0_0_1_0_2 - 0.192857142857145*G0_0_1_1_0 - 0.313392857142859*G0_0_1_1_1 - 0.0241071428571418*G0_0_1_1_2 - 0.0441964285714283*G0_0_1_2_0 - 0.0241071428571418*G0_0_1_2_1 + 0.0200892857142868*G0_0_1_2_2; + A[42] = -A[62] - 0.0883928571428584*G0_1_1_0_0 - 0.0441964285714293*G0_1_1_0_1 - 0.0334821428571431*G0_1_1_0_2 - 0.0441964285714293*G0_1_1_1_0 - 0.0883928571428583*G0_1_1_1_1 - 0.033482142857143*G0_1_1_1_2 - 0.0334821428571431*G0_1_1_2_0 - 0.033482142857143*G0_1_1_2_1 - 0.23839285714286*G0_1_1_2_2; + A[65] = -A[45] - 0.196875000000002*G0_1_0_0_0 - 0.0441964285714282*G0_1_0_0_1 - 0.192857142857145*G0_1_0_0_2 - 0.0441964285714282*G0_1_0_1_0 + 0.0200892857142872*G0_1_0_1_1 - 0.0241071428571419*G0_1_0_1_2 - 0.192857142857145*G0_1_0_2_0 - 0.0241071428571419*G0_1_0_2_1 - 0.31339285714286*G0_1_0_2_2 - 0.462053571428577*G0_1_1_0_0 - 0.102455357142858*G0_1_1_0_1 - 0.158705357142858*G0_1_1_0_2 - 0.102455357142858*G0_1_1_1_0 - 0.0080357142857134*G0_1_1_1_1 - 0.0341517857142846*G0_1_1_1_2 - 0.158705357142858*G0_1_1_2_0 - 0.0341517857142846*G0_1_1_2_1 - 0.289285714285716*G0_1_1_2_2; + A[6] = -A[4] + 0.168750000000002*G0_0_1_0_0 + 0.0261160714285716*G0_0_1_0_1 + 0.0194196428571427*G0_0_1_0_2 + 0.0261160714285716*G0_0_1_1_0 - 0.00401785714285784*G0_0_1_1_1 - 0.000669642857143361*G0_0_1_1_2 + 0.0194196428571427*G0_0_1_2_0 - 0.000669642857143358*G0_0_1_2_1 + 0.0455357142857143*G0_0_1_2_2 + 0.168750000000002*G0_1_1_0_0 + 0.0261160714285716*G0_1_1_0_1 + 0.0194196428571427*G0_1_1_0_2 + 0.0261160714285716*G0_1_1_1_0 - 0.00401785714285785*G0_1_1_1_1 - 0.000669642857143361*G0_1_1_1_2 + 0.0194196428571427*G0_1_1_2_0 - 0.000669642857143361*G0_1_1_2_1 + 0.0455357142857143*G0_1_1_2_2; + A[17] = -A[14] + 0.0830357142857152*G0_0_0_0_0 + 0.0107142857142856*G0_0_0_0_1 + 0.0294642857142862*G0_0_0_0_2 + 0.0107142857142856*G0_0_0_1_0 + 0.120535714285715*G0_0_0_1_1 + 0.0133928571428573*G0_0_0_1_2 + 0.0294642857142862*G0_0_0_2_0 + 0.0133928571428573*G0_0_0_2_1 + 0.0642857142857154*G0_0_0_2_2 + 0.0187500000000002*G0_0_1_0_0 - 0.00267857142857161*G0_0_1_0_1 - 0.00267857142857162*G0_0_1_1_0 + 0.00267857142857174*G0_0_1_1_2 + 0.00267857142857174*G0_0_1_2_1 - 0.01875*G0_0_1_2_2; + A[34] = -A[37] - 0.10044642857143*G0_0_0_0_0 - 0.0401785714285712*G0_0_0_0_1 - 0.0763392857142869*G0_0_0_0_2 - 0.0401785714285712*G0_0_0_1_0 + 0.0964285714285754*G0_0_0_1_1 + 0.0642857142857169*G0_0_0_1_2 - 0.0763392857142869*G0_0_0_2_0 + 0.0642857142857169*G0_0_0_2_1 - 0.229017857142859*G0_0_0_2_2 - 0.0241071428571429*G0_0_1_0_0 + 0.0241071428571426*G0_0_1_0_2 + 0.28928571428572*G0_0_1_1_1 + 0.241071428571432*G0_0_1_1_2 + 0.0241071428571426*G0_0_1_2_0 + 0.241071428571432*G0_0_1_2_1 + 0.216964285714289*G0_0_1_2_2 - 0.0562500000000005*G0_1_0_0_0 - 0.0482142857142864*G0_1_0_0_1 - 0.0160714285714285*G0_1_0_0_2 - 0.0482142857142864*G0_1_0_1_0 + 0.168750000000002*G0_1_0_1_1 + 0.0241071428571439*G0_1_0_1_2 - 0.0160714285714285*G0_1_0_2_0 + 0.0241071428571439*G0_1_0_2_1 - 0.0321428571428564*G0_1_0_2_2 - 0.024107142857144*G0_1_1_0_0 - 0.0723214285714304*G0_1_1_0_1 - 0.0723214285714304*G0_1_1_1_0 + 0.0723214285714301*G0_1_1_1_2 + 0.0723214285714301*G0_1_1_2_1 + 0.0241071428571438*G0_1_1_2_2; + A[36] = -A[34] - 0.0200892857142871*G0_0_1_0_0 + 0.044196428571428*G0_0_1_0_1 + 0.0241071428571416*G0_0_1_0_2 + 0.044196428571428*G0_0_1_1_0 + 0.196875000000002*G0_0_1_1_1 + 0.192857142857144*G0_0_1_1_2 + 0.0241071428571416*G0_0_1_2_0 + 0.192857142857144*G0_0_1_2_1 + 0.313392857142859*G0_0_1_2_2 - 0.0281250000000007*G0_1_1_0_0 - 0.05825892857143*G0_1_1_0_1 - 0.0100446428571429*G0_1_1_0_2 - 0.05825892857143*G0_1_1_1_0 - 0.265178571428575*G0_1_1_1_1 + 0.0341517857142863*G0_1_1_1_2 - 0.0100446428571429*G0_1_1_2_0 + 0.0341517857142863*G0_1_1_2_1 + 0.0241071428571433*G0_1_1_2_2; + A[86] = -A[36] + 0.0281250000000006*G0_0_0_0_0 + 0.0100446428571429*G0_0_0_0_1 + 0.0582589285714301*G0_0_0_0_2 + 0.0100446428571429*G0_0_0_1_0 - 0.0241071428571435*G0_0_0_1_1 - 0.0341517857142862*G0_0_0_1_2 + 0.0582589285714301*G0_0_0_2_0 - 0.0341517857142862*G0_0_0_2_1 + 0.265178571428576*G0_0_0_2_2 - 0.0562500000000038*G0_0_1_0_0 - 0.0100446428571442*G0_0_1_0_1 - 0.0301339285714305*G0_0_1_0_2 - 0.0100446428571442*G0_0_1_1_0 + 0.0100446428571418*G0_0_1_1_2 - 0.0301339285714305*G0_0_1_2_0 + 0.0100446428571418*G0_0_1_2_1 + 0.116517857142856*G0_0_1_2_2; + A[35] = A[36] + 0.0361607142857158*G0_0_0_0_0 - 0.0120535714285712*G0_0_0_0_1 - 0.0120535714285712*G0_0_0_1_0 + 0.0602678571428596*G0_0_0_1_1 + 0.0723214285714307*G0_0_0_1_2 + 0.0723214285714308*G0_0_0_2_1 - 0.216964285714286*G0_0_0_2_2 + 0.0361607142857162*G0_0_1_0_0 - 0.0241071428571424*G0_0_1_0_1 + 0.0361607142857163*G0_0_1_0_2 - 0.0241071428571424*G0_0_1_1_0 + 0.0241071428571454*G0_0_1_1_2 + 0.0361607142857163*G0_0_1_2_0 + 0.0241071428571454*G0_0_1_2_1 - 0.10848214285714*G0_0_1_2_2 + 0.0241071428571427*G0_1_0_0_0 - 0.00602678571428579*G0_1_0_0_1 + 0.00602678571428577*G0_1_0_0_2 - 0.00602678571428578*G0_1_0_1_0 + 0.00602678571428621*G0_1_0_1_2 + 0.00602678571428578*G0_1_0_2_0 + 0.00602678571428622*G0_1_0_2_1 - 0.0361607142857137*G0_1_0_2_2 - 0.0120535714285711*G0_1_1_0_0 + 0.0120535714285715*G0_1_1_0_2 + 0.0120535714285715*G0_1_1_2_0 - 0.0120535714285712*G0_1_1_2_2; + A[85] = -A[35] + 0.148660714285719*G0_0_0_0_0 - 0.0441964285714282*G0_0_0_0_1 + 0.0883928571428604*G0_0_0_0_2 - 0.0441964285714282*G0_0_0_1_0 - 0.0241071428571416*G0_0_0_1_1 + 0.020089285714287*G0_0_0_1_2 + 0.0883928571428605*G0_0_0_2_0 + 0.020089285714287*G0_0_0_2_1 + 0.0843750000000038*G0_0_0_2_2 - 0.116517857142855*G0_0_1_0_0 - 0.0100446428571418*G0_0_1_0_1 + 0.0301339285714306*G0_0_1_0_2 - 0.0100446428571418*G0_0_1_1_0 + 0.0100446428571443*G0_0_1_1_2 + 0.0301339285714306*G0_0_1_2_0 + 0.0100446428571443*G0_0_1_2_1 + 0.0562500000000034*G0_0_1_2_2; + A[58] = A[85] + 0.0964285714285705*G0_0_1_0_0 - 0.0060267857142865*G0_0_1_0_1 - 0.0180803571428581*G0_0_1_0_2 - 0.00602678571428651*G0_0_1_1_0 - 0.0200892857142862*G0_0_1_1_1 + 0.00200892857142841*G0_0_1_1_2 - 0.0180803571428581*G0_0_1_2_0 + 0.00200892857142841*G0_0_1_2_1 - 0.0321428571428583*G0_0_1_2_2 - 0.0964285714285705*G0_1_0_0_0 + 0.0060267857142865*G0_1_0_0_1 + 0.0180803571428581*G0_1_0_0_2 + 0.00602678571428651*G0_1_0_1_0 + 0.0200892857142861*G0_1_0_1_1 - 0.00200892857142841*G0_1_0_1_2 + 0.0180803571428581*G0_1_0_2_0 - 0.00200892857142841*G0_1_0_2_1 + 0.0321428571428583*G0_1_0_2_2; + A[67] = A[58] - 0.0723214285714314*G0_0_0_0_0 + 0.0301339285714284*G0_0_0_0_1 - 0.0301339285714304*G0_0_0_0_2 + 0.0301339285714284*G0_0_0_1_0 + 0.0723214285714289*G0_0_0_1_1 + 0.0180803571428569*G0_0_0_1_2 - 0.0301339285714304*G0_0_0_2_0 + 0.0180803571428569*G0_0_0_2_1 - 0.0361607142857166*G0_0_0_2_2 - 0.0120535714285716*G0_0_1_0_1 + 0.0120535714285714*G0_0_1_0_2 - 0.0120535714285716*G0_0_1_1_0 + 0.0361607142857147*G0_0_1_1_1 + 0.0120535714285714*G0_0_1_2_0 - 0.0361607142857152*G0_0_1_2_2 + 0.0482142857142869*G0_1_0_1_1 - 0.0482142857142869*G0_1_0_2_2 + 0.0723214285714318*G0_1_1_0_0 + 0.0301339285714304*G0_1_1_0_1 - 0.0301339285714284*G0_1_1_0_2 + 0.0301339285714304*G0_1_1_1_0 + 0.0361607142857166*G0_1_1_1_1 - 0.0180803571428569*G0_1_1_1_2 - 0.0301339285714284*G0_1_1_2_0 - 0.0180803571428569*G0_1_1_2_1 - 0.0723214285714292*G0_1_1_2_2; + A[7] = A[67] - 0.384375000000003*G0_0_0_0_0 - 0.0328125000000001*G0_0_0_0_1 - 0.0542410714285717*G0_0_0_0_2 - 0.0328125000000001*G0_0_0_1_0 - 0.0602678571428578*G0_0_0_1_1 - 0.0140624999999998*G0_0_0_1_2 - 0.0542410714285717*G0_0_0_2_0 - 0.0140624999999998*G0_0_0_2_1 - 0.0281249999999994*G0_0_0_2_2 + 0.154017857142858*G0_0_1_0_0 + 0.0267857142857146*G0_0_1_0_1 + 0.00937500000000004*G0_0_1_0_2 + 0.0267857142857146*G0_0_1_1_0 - 0.0482142857142863*G0_0_1_1_1 + 0.00937500000000004*G0_0_1_2_0 + 0.0281250000000008*G0_0_1_2_2 - 0.239732142857147*G0_1_0_0_0 - 0.0408482142857153*G0_1_0_0_1 - 0.0462053571428582*G0_1_0_0_2 - 0.0408482142857153*G0_1_0_1_0 - 0.088392857142859*G0_1_0_1_1 - 0.00200892857142866*G0_1_0_1_2 - 0.0462053571428582*G0_1_0_2_0 - 0.00200892857142867*G0_1_0_2_1 + 0.0334821428571407*G0_1_1_0_0 - 0.0294642857142873*G0_1_1_0_1 + 0.041517857142857*G0_1_1_0_2 - 0.0294642857142873*G0_1_1_1_0 - 0.0964285714285736*G0_1_1_1_1 + 0.00803571428571415*G0_1_1_1_2 + 0.041517857142857*G0_1_1_2_0 + 0.00803571428571415*G0_1_1_2_1 + 0.0602678571428576*G0_1_1_2_2; + A[76] = A[67] - 0.0964285714285706*G0_0_1_0_0 + 0.0180803571428581*G0_0_1_0_1 + 0.00602678571428655*G0_0_1_0_2 + 0.0180803571428581*G0_0_1_1_0 + 0.0321428571428584*G0_0_1_1_1 - 0.00200892857142838*G0_0_1_1_2 + 0.00602678571428655*G0_0_1_2_0 - 0.00200892857142838*G0_0_1_2_1 + 0.0200892857142866*G0_0_1_2_2 + 0.0964285714285706*G0_1_0_0_0 - 0.0180803571428581*G0_1_0_0_1 - 0.00602678571428655*G0_1_0_0_2 - 0.0180803571428581*G0_1_0_1_0 - 0.0321428571428584*G0_1_0_1_1 + 0.00200892857142838*G0_1_0_1_2 - 0.00602678571428655*G0_1_0_2_0 + 0.00200892857142837*G0_1_0_2_1 - 0.0200892857142866*G0_1_0_2_2; + A[74] = -A[76] - 0.116517857142856*G0_0_1_0_0 + 0.0301339285714307*G0_0_1_0_1 - 0.0100446428571418*G0_0_1_0_2 + 0.0301339285714307*G0_0_1_1_0 + 0.0562500000000041*G0_0_1_1_1 + 0.0100446428571443*G0_0_1_1_2 - 0.0100446428571418*G0_0_1_2_0 + 0.0100446428571443*G0_0_1_2_1 + 0.148660714285719*G0_1_1_0_0 + 0.0883928571428606*G0_1_1_0_1 - 0.0441964285714282*G0_1_1_0_2 + 0.0883928571428606*G0_1_1_1_0 + 0.0843750000000047*G0_1_1_1_1 + 0.0200892857142871*G0_1_1_1_2 - 0.0441964285714282*G0_1_1_2_0 + 0.0200892857142871*G0_1_1_2_1 - 0.0241071428571419*G0_1_1_2_2; + A[53] = -A[58] + 0.148660714285719*G0_0_0_0_0 - 0.0441964285714282*G0_0_0_0_1 + 0.0883928571428605*G0_0_0_0_2 - 0.0441964285714282*G0_0_0_1_0 - 0.0241071428571416*G0_0_0_1_1 + 0.020089285714287*G0_0_0_1_2 + 0.0883928571428605*G0_0_0_2_0 + 0.020089285714287*G0_0_0_2_1 + 0.0843750000000038*G0_0_0_2_2 - 0.116517857142855*G0_1_0_0_0 - 0.0100446428571418*G0_1_0_0_1 + 0.0301339285714306*G0_1_0_0_2 - 0.0100446428571418*G0_1_0_1_0 + 0.0100446428571443*G0_1_0_1_2 + 0.0301339285714306*G0_1_0_2_0 + 0.0100446428571443*G0_1_0_2_1 + 0.0562500000000034*G0_1_0_2_2; + A[70] = A[7] - 0.490178571428575*G0_0_1_0_0 - 0.0495535714285718*G0_0_1_0_1 - 0.0495535714285717*G0_0_1_0_2 - 0.0495535714285718*G0_0_1_1_0 - 0.00803571428571431*G0_0_1_1_1 - 0.00401785714285712*G0_0_1_1_2 - 0.0495535714285717*G0_0_1_2_0 - 0.00401785714285712*G0_0_1_2_1 - 0.00803571428571437*G0_0_1_2_2 + 0.490178571428575*G0_1_0_0_0 + 0.0495535714285717*G0_1_0_0_1 + 0.0495535714285717*G0_1_0_0_2 + 0.0495535714285717*G0_1_0_1_0 + 0.0080357142857143*G0_1_0_1_1 + 0.00401785714285712*G0_1_0_1_2 + 0.0495535714285717*G0_1_0_2_0 + 0.00401785714285712*G0_1_0_2_1 + 0.00803571428571437*G0_1_0_2_2; + A[5] = A[70] + 0.490178571428575*G0_0_0_0_0 + 0.0441964285714287*G0_0_0_0_1 + 0.0549107142857148*G0_0_0_0_2 + 0.0441964285714287*G0_0_0_1_0 + 0.0482142857142863*G0_0_0_1_1 + 0.0040178571428571*G0_0_0_1_2 + 0.0549107142857148*G0_0_0_2_0 + 0.0040178571428571*G0_0_0_2_1 - 0.0321428571428577*G0_0_0_2_2 - 0.00535714285714309*G0_0_1_0_1 + 0.00535714285714305*G0_0_1_0_2 - 0.00535714285714309*G0_0_1_1_0 + 0.0401785714285719*G0_0_1_1_1 + 0.00535714285714303*G0_0_1_2_0 - 0.040178571428572*G0_0_1_2_2 - 0.00535714285714307*G0_1_0_0_1 + 0.00535714285714304*G0_1_0_0_2 - 0.00535714285714306*G0_1_0_1_0 + 0.0401785714285719*G0_1_0_1_1 + 0.00535714285714304*G0_1_0_2_0 - 0.040178571428572*G0_1_0_2_2 - 0.490178571428576*G0_1_1_0_0 - 0.0549107142857149*G0_1_1_0_1 - 0.0441964285714287*G0_1_1_0_2 - 0.0549107142857149*G0_1_1_1_0 + 0.0321428571428575*G0_1_1_1_1 - 0.00401785714285714*G0_1_1_1_2 - 0.0441964285714287*G0_1_1_2_0 - 0.00401785714285714*G0_1_1_2_1 - 0.0482142857142864*G0_1_1_2_2; + A[50] = A[5] + 0.490178571428576*G0_0_1_0_0 + 0.0495535714285718*G0_0_1_0_1 + 0.0495535714285717*G0_0_1_0_2 + 0.0495535714285718*G0_0_1_1_0 + 0.00803571428571437*G0_0_1_1_1 + 0.00401785714285711*G0_0_1_1_2 + 0.0495535714285717*G0_0_1_2_0 + 0.00401785714285711*G0_0_1_2_1 + 0.00803571428571433*G0_0_1_2_2 - 0.490178571428576*G0_1_0_0_0 - 0.0495535714285718*G0_1_0_0_1 - 0.0495535714285717*G0_1_0_0_2 - 0.0495535714285718*G0_1_0_1_0 - 0.00803571428571438*G0_1_0_1_1 - 0.00401785714285711*G0_1_0_1_2 - 0.0495535714285717*G0_1_0_2_0 - 0.00401785714285711*G0_1_0_2_1 - 0.00803571428571433*G0_1_0_2_2; + A[24] = -A[26] - 0.0883928571428584*G0_1_1_0_0 - 0.0441964285714293*G0_1_1_0_1 - 0.0334821428571431*G0_1_1_0_2 - 0.0441964285714293*G0_1_1_1_0 - 0.0883928571428583*G0_1_1_1_1 - 0.033482142857143*G0_1_1_1_2 - 0.0334821428571431*G0_1_1_2_0 - 0.033482142857143*G0_1_1_2_1 - 0.23839285714286*G0_1_1_2_2; + A[84] = -A[86] - 0.0562500000000039*G0_0_1_0_0 - 0.0301339285714308*G0_0_1_0_1 - 0.0100446428571442*G0_0_1_0_2 - 0.0301339285714307*G0_0_1_1_0 + 0.116517857142855*G0_0_1_1_1 + 0.0100446428571416*G0_0_1_1_2 - 0.0100446428571442*G0_0_1_2_0 + 0.0100446428571416*G0_0_1_2_1 + 0.0281250000000007*G0_1_1_0_0 + 0.05825892857143*G0_1_1_0_1 + 0.0100446428571429*G0_1_1_0_2 + 0.05825892857143*G0_1_1_1_0 + 0.265178571428575*G0_1_1_1_1 - 0.0341517857142863*G0_1_1_1_2 + 0.0100446428571429*G0_1_1_2_0 - 0.0341517857142863*G0_1_1_2_1 - 0.0241071428571433*G0_1_1_2_2; + A[48] = A[84] + 0.0321428571428584*G0_0_1_0_0 + 0.0180803571428582*G0_0_1_0_1 - 0.00200892857142836*G0_0_1_0_2 + 0.0180803571428582*G0_0_1_1_0 - 0.0964285714285702*G0_0_1_1_1 + 0.00602678571428667*G0_0_1_1_2 - 0.00200892857142836*G0_0_1_2_0 + 0.00602678571428667*G0_0_1_2_1 + 0.0200892857142864*G0_0_1_2_2 - 0.0321428571428584*G0_1_0_0_0 - 0.0180803571428582*G0_1_0_0_1 + 0.00200892857142837*G0_1_0_0_2 - 0.0180803571428582*G0_1_0_1_0 + 0.0964285714285703*G0_1_0_1_1 - 0.00602678571428666*G0_1_0_1_2 + 0.00200892857142836*G0_1_0_2_0 - 0.00602678571428666*G0_1_0_2_1 - 0.0200892857142864*G0_1_0_2_2; + A[68] = -A[48] - 0.0562500000000039*G0_1_0_0_0 - 0.0301339285714308*G0_1_0_0_1 - 0.0100446428571442*G0_1_0_0_2 - 0.0301339285714308*G0_1_0_1_0 + 0.116517857142855*G0_1_0_1_1 + 0.0100446428571416*G0_1_0_1_2 - 0.0100446428571442*G0_1_0_2_0 + 0.0100446428571416*G0_1_0_2_1 + 0.0281250000000007*G0_1_1_0_0 + 0.05825892857143*G0_1_1_0_1 + 0.0100446428571429*G0_1_1_0_2 + 0.05825892857143*G0_1_1_1_0 + 0.265178571428575*G0_1_1_1_1 - 0.0341517857142863*G0_1_1_1_2 + 0.0100446428571429*G0_1_1_2_0 - 0.0341517857142863*G0_1_1_2_1 - 0.0241071428571433*G0_1_1_2_2; + A[47] = -A[67] - 0.116517857142856*G0_1_0_0_0 + 0.0301339285714307*G0_1_0_0_1 - 0.0100446428571418*G0_1_0_0_2 + 0.0301339285714307*G0_1_0_1_0 + 0.0562500000000041*G0_1_0_1_1 + 0.0100446428571443*G0_1_0_1_2 - 0.0100446428571418*G0_1_0_2_0 + 0.0100446428571443*G0_1_0_2_1 + 0.148660714285719*G0_1_1_0_0 + 0.0883928571428606*G0_1_1_0_1 - 0.0441964285714282*G0_1_1_0_2 + 0.0883928571428606*G0_1_1_1_0 + 0.0843750000000047*G0_1_1_1_1 + 0.0200892857142871*G0_1_1_1_2 - 0.0441964285714282*G0_1_1_2_0 + 0.0200892857142871*G0_1_1_2_1 - 0.0241071428571419*G0_1_1_2_2; + A[91] = A[19] + 0.0187500000000002*G0_0_1_0_0 - 0.00267857142857165*G0_0_1_0_1 - 0.00267857142857165*G0_0_1_1_0 + 0.00267857142857171*G0_0_1_1_2 + 0.00267857142857171*G0_0_1_2_1 - 0.0187499999999999*G0_0_1_2_2 - 0.0187500000000002*G0_1_0_0_0 + 0.00267857142857164*G0_1_0_0_1 + 0.00267857142857164*G0_1_0_1_0 - 0.00267857142857171*G0_1_0_1_2 - 0.0026785714285717*G0_1_0_2_1 + 0.0187499999999999*G0_1_0_2_2; + A[89] = -A[91] - 0.115178571428574*G0_0_0_0_0 - 0.0455357142857156*G0_0_0_0_2 + 0.115178571428574*G0_0_0_1_1 + 0.0455357142857157*G0_0_0_1_2 - 0.0455357142857156*G0_0_0_2_0 + 0.0455357142857157*G0_0_0_2_1 + 0.192857142857146*G0_0_1_0_0 + 0.168750000000003*G0_0_1_0_1 + 0.024107142857143*G0_0_1_0_2 + 0.168750000000003*G0_0_1_1_0 + 0.28928571428572*G0_0_1_1_1 + 0.0723214285714304*G0_0_1_1_2 + 0.024107142857143*G0_0_1_2_0 + 0.0723214285714304*G0_0_1_2_1 + 0.0294642857142855*G0_1_0_0_0 + 0.0629464285714285*G0_1_0_0_1 + 0.0361607142857142*G0_1_0_0_2 + 0.0629464285714284*G0_1_0_1_0 + 0.433928571428574*G0_1_0_1_1 + 0.129910714285715*G0_1_0_1_2 + 0.0361607142857142*G0_1_0_2_0 + 0.129910714285715*G0_1_0_2_1 + 0.0910714285714292*G0_1_0_2_2 - 0.0241071428571439*G0_1_1_0_0 - 0.0723214285714304*G0_1_1_0_1 - 0.0723214285714304*G0_1_1_1_0 + 0.07232142857143*G0_1_1_1_2 + 0.07232142857143*G0_1_1_2_1 + 0.0241071428571438*G0_1_1_2_2; + A[39] = -A[89] - 0.289285714285721*G0_0_0_0_0 - 0.0602678571428568*G0_0_0_0_1 - 0.229017857142862*G0_0_0_0_2 - 0.0602678571428568*G0_0_0_1_0 - 0.192857142857144*G0_0_0_1_1 - 0.229017857142859*G0_0_0_1_2 - 0.229017857142862*G0_0_0_2_0 - 0.229017857142859*G0_0_0_2_1 - 0.506250000000009*G0_0_0_2_2 + 0.216964285714289*G0_0_1_0_0 + 0.168750000000003*G0_0_1_0_1 + 0.168750000000003*G0_0_1_1_0 - 0.168750000000002*G0_0_1_1_2 - 0.168750000000002*G0_0_1_2_1 - 0.216964285714288*G0_0_1_2_2; + A[93] = A[39] - 0.0723214285714284*G0_0_1_0_0 - 0.060267857142857*G0_0_1_0_1 - 0.0120535714285715*G0_0_1_0_2 - 0.060267857142857*G0_0_1_1_0 - 0.144642857142854*G0_0_1_1_1 + 0.108482142857145*G0_0_1_1_2 - 0.0120535714285715*G0_0_1_2_0 + 0.108482142857145*G0_0_1_2_1 + 0.14464285714286*G0_0_1_2_2 + 0.0723214285714285*G0_1_0_0_0 + 0.060267857142857*G0_1_0_0_1 + 0.0120535714285715*G0_1_0_0_2 + 0.060267857142857*G0_1_0_1_0 + 0.144642857142854*G0_1_0_1_1 - 0.108482142857145*G0_1_0_1_2 + 0.0120535714285715*G0_1_0_2_0 - 0.108482142857145*G0_1_0_2_1 - 0.14464285714286*G0_1_0_2_2; + A[98] = -A[93] - 0.289285714285721*G0_0_0_0_0 - 0.0602678571428568*G0_0_0_0_1 - 0.229017857142862*G0_0_0_0_2 - 0.0602678571428568*G0_0_0_1_0 - 0.192857142857144*G0_0_0_1_1 - 0.229017857142859*G0_0_0_1_2 - 0.229017857142862*G0_0_0_2_0 - 0.229017857142859*G0_0_0_2_1 - 0.506250000000009*G0_0_0_2_2 + 0.216964285714289*G0_1_0_0_0 + 0.168750000000003*G0_1_0_0_1 + 0.168750000000003*G0_1_0_1_0 - 0.168750000000002*G0_1_0_1_2 - 0.168750000000002*G0_1_0_2_1 - 0.216964285714288*G0_1_0_2_2; + A[66] = 0.0401785714285718*G0_0_0_0_0 + 0.0200892857142857*G0_0_0_0_1 + 0.132589285714287*G0_0_0_0_2 + 0.0200892857142857*G0_0_0_1_0 + 0.0401785714285718*G0_0_0_1_1 + 0.132589285714287*G0_0_0_1_2 + 0.132589285714287*G0_0_0_2_0 + 0.132589285714287*G0_0_0_2_1 + 1.03660714285715*G0_0_0_2_2 - 0.0200892857142862*G0_0_1_0_0 + 0.0200892857142856*G0_0_1_0_2 + 0.020089285714286*G0_0_1_1_1 + 0.0763392857142868*G0_0_1_1_2 + 0.0200892857142856*G0_0_1_2_0 + 0.0763392857142868*G0_0_1_2_1 + 0.650892857142864*G0_0_1_2_2 - 0.0200892857142862*G0_1_0_0_0 + 0.0200892857142856*G0_1_0_0_2 + 0.020089285714286*G0_1_0_1_1 + 0.0763392857142868*G0_1_0_1_2 + 0.0200892857142856*G0_1_0_2_0 + 0.0763392857142868*G0_1_0_2_1 + 0.650892857142864*G0_1_0_2_2 + 0.305357142857147*G0_1_1_0_0 + 0.0763392857142866*G0_1_1_0_1 + 0.148660714285716*G0_1_1_0_2 + 0.0763392857142867*G0_1_1_1_0 + 0.0642857142857153*G0_1_1_1_1 + 0.10044642857143*G0_1_1_1_2 + 0.148660714285716*G0_1_1_2_0 + 0.10044642857143*G0_1_1_2_1 + 0.666964285714294*G0_1_1_2_2; + A[55] = A[66] + 0.361607142857146*G0_0_0_0_0 + 0.060267857142857*G0_0_0_0_1 + 0.108482142857145*G0_0_0_0_2 + 0.060267857142857*G0_0_0_1_0 + 0.0241071428571431*G0_0_0_1_1 - 0.0361607142857143*G0_0_0_1_2 + 0.108482142857145*G0_0_0_2_0 - 0.0361607142857143*G0_0_0_2_1 - 0.650892857142861*G0_0_0_2_2 + 0.0361607142857158*G0_0_1_0_0 + 0.0241071428571428*G0_0_1_0_1 + 0.108482142857145*G0_0_1_0_2 + 0.0241071428571428*G0_0_1_1_0 + 0.0241071428571432*G0_0_1_1_1 + 0.108482142857145*G0_0_1_2_0 - 0.325446428571431*G0_0_1_2_2 + 0.0361607142857158*G0_1_0_0_0 + 0.0241071428571428*G0_1_0_0_1 + 0.108482142857145*G0_1_0_0_2 + 0.0241071428571428*G0_1_0_1_0 + 0.0241071428571432*G0_1_0_1_1 + 0.108482142857145*G0_1_0_2_0 - 0.325446428571431*G0_1_0_2_2 + 0.361607142857145*G0_1_1_0_0 + 0.0241071428571428*G0_1_1_0_1 + 0.0241071428571428*G0_1_1_1_0 - 0.0241071428571429*G0_1_1_1_2 - 0.0241071428571429*G0_1_1_2_1 - 0.361607142857147*G0_1_1_2_2; + A[64] = -A[66] - 0.0401785714285719*G0_0_1_0_0 - 0.0200892857142858*G0_0_1_0_1 - 0.0361607142857142*G0_0_1_0_2 - 0.0200892857142858*G0_0_1_1_0 - 0.0401785714285719*G0_0_1_1_1 - 0.0361607142857142*G0_0_1_1_2 - 0.0361607142857142*G0_0_1_2_0 - 0.0361607142857142*G0_0_1_2_1 + 0.265178571428576*G0_0_1_2_2 + 0.381696428571434*G0_1_1_0_0 + 0.120535714285716*G0_1_1_0_1 + 0.172767857142858*G0_1_1_0_2 + 0.120535714285716*G0_1_1_1_0 + 0.10044642857143*G0_1_1_1_1 + 0.068303571428571*G0_1_1_1_2 + 0.172767857142858*G0_1_1_2_0 + 0.068303571428571*G0_1_1_2_1 + 0.482142857142862*G0_1_1_2_2; + A[75] = A[64] - 0.14464285714286*G0_0_0_0_0 + 0.0441964285714284*G0_0_0_0_1 + 0.100446428571428*G0_0_0_0_2 + 0.0441964285714284*G0_0_0_1_0 + 0.116517857142858*G0_0_0_1_1 + 0.176785714285716*G0_0_0_1_2 + 0.100446428571428*G0_0_0_2_0 + 0.176785714285716*G0_0_0_2_1 + 1.07276785714287*G0_0_0_2_2 + 0.486160714285717*G0_0_1_0_0 + 0.0642857142857139*G0_0_1_0_1 + 0.100446428571428*G0_0_1_0_2 + 0.0642857142857139*G0_0_1_1_0 + 0.116517857142859*G0_0_1_1_1 + 0.15669642857143*G0_0_1_1_2 + 0.100446428571428*G0_0_1_2_0 + 0.15669642857143*G0_0_1_2_1 + 0.441964285714289*G0_0_1_2_2 + 0.180803571428571*G0_1_0_0_0 + 0.0803571428571426*G0_1_0_0_1 + 0.100446428571428*G0_1_0_0_2 + 0.0803571428571426*G0_1_0_1_0 + 0.116517857142858*G0_1_0_1_1 + 0.140625000000002*G0_1_0_1_2 + 0.100446428571428*G0_1_0_2_0 + 0.140625000000002*G0_1_0_2_1 + 0.747321428571436*G0_1_0_2_2 - 0.261160714285718*G0_1_1_0_0 - 0.0763392857142877*G0_1_1_0_1 - 0.0763392857142877*G0_1_1_1_0 + 0.0763392857142877*G0_1_1_1_2 + 0.0763392857142877*G0_1_1_2_1 + 0.261160714285718*G0_1_1_2_2; + A[46] = -A[66] - 0.0401785714285719*G0_1_0_0_0 - 0.0200892857142858*G0_1_0_0_1 - 0.0361607142857142*G0_1_0_0_2 - 0.0200892857142858*G0_1_0_1_0 - 0.0401785714285719*G0_1_0_1_1 - 0.0361607142857142*G0_1_0_1_2 - 0.0361607142857142*G0_1_0_2_0 - 0.0361607142857142*G0_1_0_2_1 + 0.265178571428577*G0_1_0_2_2 + 0.381696428571434*G0_1_1_0_0 + 0.120535714285716*G0_1_1_0_1 + 0.172767857142858*G0_1_1_0_2 + 0.120535714285716*G0_1_1_1_0 + 0.10044642857143*G0_1_1_1_1 + 0.068303571428571*G0_1_1_1_2 + 0.172767857142858*G0_1_1_2_0 + 0.068303571428571*G0_1_1_2_1 + 0.482142857142862*G0_1_1_2_2; + A[83] = A[46] + 0.116517857142858*G0_0_0_0_0 + 0.0441964285714284*G0_0_0_0_1 + 0.176785714285716*G0_0_0_0_2 + 0.0441964285714284*G0_0_0_1_0 - 0.14464285714286*G0_0_0_1_1 + 0.100446428571428*G0_0_0_1_2 + 0.176785714285716*G0_0_0_2_0 + 0.100446428571428*G0_0_0_2_1 + 1.07276785714287*G0_0_0_2_2 - 0.0200892857142854*G0_0_1_0_1 + 0.0200892857142857*G0_0_1_0_2 - 0.0200892857142854*G0_0_1_1_0 - 0.630803571428576*G0_0_1_1_1 + 0.0200892857142856*G0_0_1_2_0 + 0.630803571428578*G0_0_1_2_2 - 0.036160714285714*G0_1_0_0_1 + 0.0361607142857141*G0_1_0_0_2 - 0.036160714285714*G0_1_0_1_0 - 0.32544642857143*G0_1_0_1_1 + 0.0361607142857141*G0_1_0_2_0 + 0.32544642857143*G0_1_0_2_2 - 0.116517857142859*G0_1_1_0_0 - 0.176785714285716*G0_1_1_0_1 - 0.0441964285714284*G0_1_1_0_2 - 0.176785714285716*G0_1_1_1_0 - 1.07276785714286*G0_1_1_1_1 - 0.100446428571428*G0_1_1_1_2 - 0.0441964285714284*G0_1_1_2_0 - 0.100446428571428*G0_1_1_2_1 + 0.14464285714286*G0_1_1_2_2; + A[57] = A[75] - 0.265178571428574*G0_0_1_0_0 + 0.0361607142857145*G0_0_1_0_1 + 0.0361607142857144*G0_0_1_0_2 + 0.0361607142857145*G0_0_1_1_0 + 0.0401785714285717*G0_0_1_1_1 + 0.0200892857142857*G0_0_1_1_2 + 0.0361607142857144*G0_0_1_2_0 + 0.0200892857142857*G0_0_1_2_1 + 0.0401785714285717*G0_0_1_2_2 + 0.265178571428574*G0_1_0_0_0 - 0.0361607142857145*G0_1_0_0_1 - 0.0361607142857144*G0_1_0_0_2 - 0.0361607142857145*G0_1_0_1_0 - 0.0401785714285717*G0_1_0_1_1 - 0.0200892857142857*G0_1_0_1_2 - 0.0361607142857144*G0_1_0_2_0 - 0.0200892857142857*G0_1_0_2_1 - 0.0401785714285717*G0_1_0_2_2; + A[56] = -A[54] - 0.196875000000002*G0_0_1_0_0 - 0.0441964285714282*G0_0_1_0_1 - 0.192857142857145*G0_0_1_0_2 - 0.0441964285714282*G0_0_1_1_0 + 0.0200892857142872*G0_0_1_1_1 - 0.0241071428571418*G0_0_1_1_2 - 0.192857142857145*G0_0_1_2_0 - 0.0241071428571418*G0_0_1_2_1 - 0.31339285714286*G0_0_1_2_2 - 0.462053571428577*G0_1_1_0_0 - 0.102455357142858*G0_1_1_0_1 - 0.158705357142858*G0_1_1_0_2 - 0.102455357142858*G0_1_1_1_0 - 0.0080357142857134*G0_1_1_1_1 - 0.0341517857142846*G0_1_1_1_2 - 0.158705357142858*G0_1_1_2_0 - 0.0341517857142846*G0_1_1_2_1 - 0.289285714285716*G0_1_1_2_2; + A[3] = A[30] + 0.0020089285714287*G0_0_1_0_1 - 0.00200892857142853*G0_0_1_0_2 + 0.0020089285714287*G0_0_1_1_0 - 0.022767857142857*G0_0_1_1_1 + 0.00736607142857187*G0_0_1_1_2 - 0.00200892857142853*G0_0_1_2_0 + 0.00736607142857187*G0_0_1_2_1 + 0.00803571428571489*G0_0_1_2_2 - 0.0020089285714287*G0_1_0_0_1 + 0.00200892857142853*G0_1_0_0_2 - 0.0020089285714287*G0_1_0_1_0 + 0.022767857142857*G0_1_0_1_1 - 0.00736607142857187*G0_1_0_1_2 + 0.00200892857142853*G0_1_0_2_0 - 0.00736607142857187*G0_1_0_2_1 - 0.00803571428571488*G0_1_0_2_2; + A[8] = -A[3] + 0.168750000000001*G0_0_0_0_0 + 0.0194196428571427*G0_0_0_0_1 + 0.0261160714285716*G0_0_0_0_2 + 0.0194196428571427*G0_0_0_1_0 + 0.0455357142857142*G0_0_0_1_1 - 0.000669642857143361*G0_0_0_1_2 + 0.0261160714285716*G0_0_0_2_0 - 0.000669642857143358*G0_0_0_2_1 - 0.00401785714285775*G0_0_0_2_2 + 0.168750000000001*G0_1_0_0_0 + 0.0194196428571427*G0_1_0_0_1 + 0.0261160714285716*G0_1_0_0_2 + 0.0194196428571427*G0_1_0_1_0 + 0.0455357142857141*G0_1_0_1_1 - 0.000669642857143372*G0_1_0_1_2 + 0.0261160714285716*G0_1_0_2_0 - 0.000669642857143372*G0_1_0_2_1 - 0.00401785714285777*G0_1_0_2_2; + A[12] = 0.0016369047619047*G0_0_1_0_0 + 0.00483630952380956*G0_0_1_0_1 + 0.00483630952380958*G0_0_1_0_2 + 0.00483630952380956*G0_0_1_1_0 + 0.0324404761904765*G0_0_1_1_1 + 0.000818452380952329*G0_0_1_1_2 + 0.00483630952380958*G0_0_1_2_0 + 0.000818452380952328*G0_0_1_2_1 + 0.0324404761904767*G0_0_1_2_2; + A[2] = -A[12] - 0.0308035714285718*G0_0_1_0_0 + 0.00401785714285724*G0_0_1_0_2 + 0.0308035714285718*G0_0_1_1_1 - 0.00401785714285725*G0_0_1_1_2 + 0.00401785714285724*G0_0_1_2_0 - 0.00401785714285725*G0_0_1_2_1 - 0.0324404761904765*G0_1_1_0_0 - 0.00483630952380957*G0_1_1_0_1 - 0.000818452380952339*G0_1_1_0_2 - 0.00483630952380957*G0_1_1_1_0 - 0.00163690476190471*G0_1_1_1_1 - 0.00483630952380959*G0_1_1_1_2 - 0.00081845238095234*G0_1_1_2_0 - 0.00483630952380959*G0_1_1_2_1 - 0.0324404761904767*G0_1_1_2_2; + A[49] = -A[69] + 0.216964285714289*G0_1_0_0_0 + 0.168750000000003*G0_1_0_0_2 - 0.216964285714289*G0_1_0_1_1 - 0.168750000000002*G0_1_0_1_2 + 0.168750000000003*G0_1_0_2_0 - 0.168750000000002*G0_1_0_2_1 - 0.289285714285721*G0_1_1_0_0 - 0.229017857142862*G0_1_1_0_1 - 0.0602678571428569*G0_1_1_0_2 - 0.229017857142862*G0_1_1_1_0 - 0.50625000000001*G0_1_1_1_1 - 0.229017857142859*G0_1_1_1_2 - 0.0602678571428569*G0_1_1_2_0 - 0.229017857142859*G0_1_1_2_1 - 0.192857142857144*G0_1_1_2_2; + A[94] = A[49] + 0.0723214285714286*G0_0_1_0_0 + 0.0120535714285716*G0_0_1_0_1 + 0.0602678571428572*G0_0_1_0_2 + 0.0120535714285716*G0_0_1_1_0 - 0.14464285714286*G0_0_1_1_1 - 0.108482142857145*G0_0_1_1_2 + 0.0602678571428571*G0_0_1_2_0 - 0.108482142857145*G0_0_1_2_1 + 0.144642857142855*G0_0_1_2_2 - 0.0723214285714286*G0_1_0_0_0 - 0.0120535714285716*G0_1_0_0_1 - 0.0602678571428572*G0_1_0_0_2 - 0.0120535714285716*G0_1_0_1_0 + 0.14464285714286*G0_1_0_1_1 + 0.108482142857145*G0_1_0_1_2 - 0.0602678571428572*G0_1_0_2_0 + 0.108482142857145*G0_1_0_2_1 - 0.144642857142855*G0_1_0_2_2; + A[97] = A[94] + 0.241071428571431*G0_0_0_0_0 + 0.0120535714285713*G0_0_0_0_1 - 0.0120535714285715*G0_0_0_0_2 + 0.0120535714285713*G0_0_0_1_0 - 0.14464285714286*G0_0_0_1_1 - 0.0120535714285723*G0_0_0_1_2 - 0.0120535714285715*G0_0_0_2_0 - 0.0120535714285723*G0_0_0_2_1 - 0.0723214285714302*G0_0_0_2_2 - 0.192857142857143*G0_0_1_0_0 - 0.0241071428571429*G0_0_1_0_1 - 0.0723214285714287*G0_0_1_0_2 - 0.0241071428571429*G0_0_1_1_0 + 0.120535714285716*G0_0_1_1_2 - 0.0723214285714287*G0_0_1_2_0 + 0.120535714285716*G0_0_1_2_1 + 0.14464285714286*G0_0_1_2_2 + 0.0241071428571412*G0_1_0_0_0 - 0.120535714285717*G0_1_0_0_1 + 0.0482142857142854*G0_1_0_0_2 - 0.120535714285717*G0_1_0_1_0 - 0.289285714285721*G0_1_0_1_1 + 0.0241071428571417*G0_1_0_1_2 + 0.0482142857142854*G0_1_0_2_0 + 0.0241071428571417*G0_1_0_2_1 + 0.361607142857144*G0_1_0_2_2 - 0.337500000000003*G0_1_1_0_0 - 0.144642857142859*G0_1_1_0_1 - 0.144642857142859*G0_1_1_1_0 + 0.144642857142858*G0_1_1_1_2 + 0.144642857142858*G0_1_1_2_1 + 0.337500000000002*G0_1_1_2_2; + A[99] = -A[97] + 0.843750000000012*G0_0_0_0_0 + 0.156696428571428*G0_0_0_0_1 + 0.494196428571436*G0_0_0_0_2 + 0.156696428571428*G0_0_0_1_0 + 0.409821428571431*G0_0_0_1_1 + 0.349553571428575*G0_0_0_1_2 + 0.494196428571436*G0_0_0_2_0 + 0.349553571428575*G0_0_0_2_1 + 0.795535714285728*G0_0_0_2_2 - 0.0241071428571429*G0_0_1_0_0 + 0.0241071428571427*G0_0_1_0_1 + 0.0241071428571427*G0_0_1_1_0 + 0.21696428571429*G0_0_1_1_1 + 0.241071428571432*G0_0_1_1_2 + 0.241071428571432*G0_0_1_2_1 + 0.289285714285719*G0_0_1_2_2 + 0.120535714285712*G0_1_0_0_0 - 0.084375000000003*G0_1_0_0_1 + 0.0602678571428567*G0_1_0_0_2 - 0.084375000000003*G0_1_0_1_0 + 0.0723214285714289*G0_1_0_1_1 + 0.253125000000003*G0_1_0_1_2 + 0.0602678571428567*G0_1_0_2_0 + 0.253125000000003*G0_1_0_2_1 + 0.361607142857147*G0_1_0_2_2 + 0.120535714285717*G0_1_1_0_0 + 0.14464285714286*G0_1_1_0_1 + 0.0723214285714283*G0_1_1_0_2 + 0.14464285714286*G0_1_1_1_0 + 0.43392857142858*G0_1_1_1_1 + 0.289285714285718*G0_1_1_1_2 + 0.0723214285714283*G0_1_1_2_0 + 0.289285714285718*G0_1_1_2_1 + 0.458035714285719*G0_1_1_2_2; + A[96] = -A[94] + 0.216964285714289*G0_0_1_0_0 + 0.168750000000003*G0_0_1_0_2 - 0.216964285714289*G0_0_1_1_1 - 0.168750000000002*G0_0_1_1_2 + 0.168750000000003*G0_0_1_2_0 - 0.168750000000002*G0_0_1_2_1 - 0.289285714285721*G0_1_1_0_0 - 0.229017857142862*G0_1_1_0_1 - 0.0602678571428569*G0_1_1_0_2 - 0.229017857142862*G0_1_1_1_0 - 0.50625000000001*G0_1_1_1_1 - 0.229017857142859*G0_1_1_1_2 - 0.0602678571428569*G0_1_1_2_0 - 0.229017857142859*G0_1_1_2_1 - 0.192857142857144*G0_1_1_2_2; + A[59] = A[97] - 0.723214285714295*G0_0_0_0_0 - 0.0843749999999999*G0_0_0_0_1 - 0.349553571428577*G0_0_0_0_2 - 0.0843749999999999*G0_0_0_1_0 + 0.0482142857142873*G0_0_0_1_1 - 0.060267857142857*G0_0_0_1_2 - 0.349553571428577*G0_0_0_2_0 - 0.060267857142857*G0_0_0_2_1 - 0.361607142857149*G0_0_0_2_2 - 0.0241071428571429*G0_0_1_0_1 + 0.0241071428571429*G0_0_1_0_2 - 0.0241071428571429*G0_0_1_1_0 + 0.0723214285714298*G0_0_1_1_1 + 0.0241071428571429*G0_0_1_2_0 - 0.0723214285714302*G0_0_1_2_2 + 0.14464285714286*G0_1_0_0_1 - 0.14464285714286*G0_1_0_0_2 + 0.14464285714286*G0_1_0_1_0 + 0.289285714285719*G0_1_0_1_1 - 0.14464285714286*G0_1_0_2_0 - 0.289285714285719*G0_1_0_2_2 + 0.723214285714296*G0_1_1_0_0 + 0.349553571428577*G0_1_1_0_1 + 0.084375*G0_1_1_0_2 + 0.349553571428577*G0_1_1_1_0 + 0.36160714285715*G0_1_1_1_1 + 0.0602678571428571*G0_1_1_1_2 + 0.084375*G0_1_1_2_0 + 0.0602678571428571*G0_1_1_2_1 - 0.0482142857142875*G0_1_1_2_2; + A[33] = -A[83] + 0.140625000000001*G0_0_0_0_0 + 0.104464285714285*G0_0_0_0_1 + 0.140625000000001*G0_0_0_0_2 + 0.104464285714285*G0_0_0_1_0 + 0.216964285714285*G0_0_0_1_1 + 0.208928571428572*G0_0_0_1_2 + 0.140625000000001*G0_0_0_2_0 + 0.208928571428572*G0_0_0_2_1 + 0.421875000000005*G0_0_0_2_2 + 0.0401785714285718*G0_0_1_0_0 + 0.0361607142857144*G0_0_1_0_1 + 0.0200892857142857*G0_0_1_0_2 + 0.0361607142857144*G0_0_1_1_0 - 0.265178571428575*G0_0_1_1_1 + 0.0361607142857142*G0_0_1_1_2 + 0.0200892857142857*G0_0_1_2_0 + 0.0361607142857142*G0_0_1_2_1 + 0.0401785714285715*G0_0_1_2_2; + A[29] = A[92] + 0.0187500000000002*G0_0_1_0_0 - 0.00267857142857161*G0_0_1_0_2 - 0.0187500000000001*G0_0_1_1_1 + 0.00267857142857171*G0_0_1_1_2 - 0.00267857142857161*G0_0_1_2_0 + 0.00267857142857171*G0_0_1_2_1 - 0.0187500000000002*G0_1_0_0_0 + 0.00267857142857161*G0_1_0_0_2 + 0.0187500000000001*G0_1_0_1_1 - 0.00267857142857171*G0_1_0_1_2 + 0.00267857142857161*G0_1_0_2_0 - 0.00267857142857171*G0_1_0_2_1; + A[81] = -A[31] - 0.0883928571428584*G0_0_0_0_0 - 0.033482142857143*G0_0_0_0_1 - 0.0441964285714292*G0_0_0_0_2 - 0.033482142857143*G0_0_0_1_0 - 0.238392857142859*G0_0_0_1_1 - 0.0334821428571429*G0_0_0_1_2 - 0.0441964285714292*G0_0_0_2_0 - 0.0334821428571429*G0_0_0_2_1 - 0.0883928571428584*G0_0_0_2_2; + A[44] = -A[64] + 0.0401785714285719*G0_1_0_0_0 + 0.0200892857142858*G0_1_0_0_1 + 0.0361607142857142*G0_1_0_0_2 + 0.0200892857142858*G0_1_0_1_0 + 0.040178571428572*G0_1_0_1_1 + 0.0361607142857143*G0_1_0_1_2 + 0.0361607142857142*G0_1_0_2_0 + 0.0361607142857142*G0_1_0_2_1 - 0.265178571428576*G0_1_0_2_2 + 0.140625000000002*G0_1_1_0_0 + 0.140625000000001*G0_1_1_0_1 + 0.104464285714285*G0_1_1_0_2 + 0.140625000000001*G0_1_1_1_0 + 0.421875000000005*G0_1_1_1_1 + 0.208928571428572*G0_1_1_1_2 + 0.104464285714285*G0_1_1_2_0 + 0.208928571428572*G0_1_1_2_1 + 0.216964285714285*G0_1_1_2_2; + A[63] = -A[68] + 0.0281250000000006*G0_0_0_0_0 + 0.0100446428571429*G0_0_0_0_1 + 0.0582589285714301*G0_0_0_0_2 + 0.0100446428571429*G0_0_0_1_0 - 0.0241071428571435*G0_0_0_1_1 - 0.0341517857142862*G0_0_0_1_2 + 0.0582589285714301*G0_0_0_2_0 - 0.0341517857142862*G0_0_0_2_1 + 0.265178571428576*G0_0_0_2_2 - 0.0562500000000038*G0_1_0_0_0 - 0.0100446428571442*G0_1_0_0_1 - 0.0301339285714305*G0_1_0_0_2 - 0.0100446428571442*G0_1_0_1_0 + 0.0100446428571418*G0_1_0_1_2 - 0.0301339285714305*G0_1_0_2_0 + 0.0100446428571418*G0_1_0_2_1 + 0.116517857142856*G0_1_0_2_2; + A[0] = A[22] + 0.252083333333335*G0_0_0_0_0 + 0.026934523809524*G0_0_0_0_1 + 0.026934523809524*G0_0_0_0_2 + 0.026934523809524*G0_0_0_1_0 + 0.0217261904761908*G0_0_0_1_1 + 0.0108630952380954*G0_0_0_1_2 + 0.026934523809524*G0_0_0_2_0 + 0.0108630952380954*G0_0_0_2_1 + 0.0217261904761908*G0_0_0_2_2 + 0.252083333333335*G0_0_1_0_0 + 0.026934523809524*G0_0_1_0_1 + 0.026934523809524*G0_0_1_0_2 + 0.026934523809524*G0_0_1_1_0 + 0.0217261904761908*G0_0_1_1_1 + 0.0108630952380954*G0_0_1_1_2 + 0.026934523809524*G0_0_1_2_0 + 0.0108630952380954*G0_0_1_2_1 + 0.0217261904761908*G0_0_1_2_2 + 0.252083333333335*G0_1_0_0_0 + 0.026934523809524*G0_1_0_0_1 + 0.026934523809524*G0_1_0_0_2 + 0.026934523809524*G0_1_0_1_0 + 0.0217261904761908*G0_1_0_1_1 + 0.0108630952380954*G0_1_0_1_2 + 0.026934523809524*G0_1_0_2_0 + 0.0108630952380954*G0_1_0_2_1 + 0.0217261904761908*G0_1_0_2_2 + 0.230357142857145*G0_1_1_0_0 + 0.0160714285714286*G0_1_1_0_1 + 0.0160714285714286*G0_1_1_1_0 - 0.0160714285714286*G0_1_1_1_2 - 0.0160714285714286*G0_1_1_2_1 - 0.230357142857145*G0_1_1_2_2; + A[79] = A[97] + 0.144642857142855*G0_0_1_0_0 - 0.108482142857146*G0_0_1_0_1 + 0.0602678571428569*G0_0_1_0_2 - 0.108482142857146*G0_0_1_1_0 - 0.144642857142861*G0_0_1_1_1 + 0.0120535714285712*G0_0_1_1_2 + 0.0602678571428569*G0_0_1_2_0 + 0.0120535714285712*G0_0_1_2_1 + 0.0723214285714282*G0_0_1_2_2 - 0.144642857142855*G0_1_0_0_0 + 0.108482142857146*G0_1_0_0_1 - 0.0602678571428569*G0_1_0_0_2 + 0.108482142857146*G0_1_0_1_0 + 0.144642857142861*G0_1_0_1_1 - 0.0120535714285712*G0_1_0_1_2 - 0.0602678571428569*G0_1_0_2_0 - 0.0120535714285712*G0_1_0_2_1 - 0.0723214285714281*G0_1_0_2_2; + A[90] = -A[79] + 0.115178571428574*G0_0_0_0_0 + 0.0455357142857156*G0_0_0_0_2 - 0.115178571428574*G0_0_0_1_1 - 0.0455357142857157*G0_0_0_1_2 + 0.0455357142857156*G0_0_0_2_0 - 0.0455357142857157*G0_0_0_2_1 - 0.174107142857146*G0_0_1_0_0 - 0.168750000000003*G0_0_1_0_1 - 0.0267857142857145*G0_0_1_0_2 - 0.168750000000003*G0_0_1_1_0 - 0.30803571428572*G0_0_1_1_1 - 0.0696428571428586*G0_0_1_1_2 - 0.0267857142857145*G0_0_1_2_0 - 0.0696428571428586*G0_0_1_2_1 - 0.318750000000001*G0_1_0_0_0 - 0.0629464285714287*G0_1_0_0_1 - 0.0843749999999999*G0_1_0_0_2 - 0.0629464285714287*G0_1_0_1_0 - 0.144642857142859*G0_1_0_1_1 - 0.0816964285714298*G0_1_0_1_2 - 0.0843749999999999*G0_1_0_2_0 - 0.0816964285714299*G0_1_0_2_1 - 0.0910714285714292*G0_1_0_2_2 - 0.608035714285722*G0_1_1_0_0 - 0.304017857142862*G0_1_1_0_1 - 0.084375*G0_1_1_0_2 - 0.304017857142862*G0_1_1_1_0 - 0.36160714285715*G0_1_1_1_1 - 0.105803571428573*G0_1_1_1_2 - 0.0843749999999999*G0_1_1_2_0 - 0.105803571428573*G0_1_1_2_1 - 0.0669642857142866*G0_1_1_2_2; + A[9] = A[90] - 0.00267857142857168*G0_0_1_0_1 + 0.00267857142857161*G0_0_1_0_2 - 0.00267857142857168*G0_0_1_1_0 + 0.0187500000000001*G0_0_1_1_1 + 0.00267857142857161*G0_0_1_2_0 - 0.0187500000000001*G0_0_1_2_2 + 0.00267857142857169*G0_1_0_0_1 - 0.00267857142857161*G0_1_0_0_2 + 0.00267857142857169*G0_1_0_1_0 - 0.0187500000000001*G0_1_0_1_1 - 0.00267857142857161*G0_1_0_2_0 + 0.0187500000000001*G0_1_0_2_2; + A[38] = A[83] - 0.0401785714285718*G0_0_1_0_0 - 0.0361607142857144*G0_0_1_0_1 - 0.0200892857142857*G0_0_1_0_2 - 0.0361607142857144*G0_0_1_1_0 + 0.265178571428575*G0_0_1_1_1 - 0.0361607142857142*G0_0_1_1_2 - 0.0200892857142857*G0_0_1_2_0 - 0.0361607142857142*G0_0_1_2_1 - 0.0401785714285715*G0_0_1_2_2 + 0.0401785714285718*G0_1_0_0_0 + 0.0361607142857144*G0_1_0_0_1 + 0.0200892857142857*G0_1_0_0_2 + 0.0361607142857144*G0_1_0_1_0 - 0.265178571428575*G0_1_0_1_1 + 0.0361607142857142*G0_1_0_1_2 + 0.0200892857142857*G0_1_0_2_0 + 0.0361607142857142*G0_1_0_2_1 + 0.0401785714285715*G0_1_0_2_2; + A[20] = -A[21] - 0.0308035714285718*G0_1_0_0_0 + 0.00401785714285724*G0_1_0_0_2 + 0.0308035714285718*G0_1_0_1_1 - 0.00401785714285725*G0_1_0_1_2 + 0.00401785714285724*G0_1_0_2_0 - 0.00401785714285726*G0_1_0_2_1 - 0.0324404761904765*G0_1_1_0_0 - 0.00483630952380957*G0_1_1_0_1 - 0.000818452380952342*G0_1_1_0_2 - 0.00483630952380957*G0_1_1_1_0 - 0.00163690476190472*G0_1_1_1_1 - 0.00483630952380959*G0_1_1_1_2 - 0.000818452380952341*G0_1_1_2_0 - 0.00483630952380959*G0_1_1_2_1 - 0.0324404761904767*G0_1_1_2_2; + A[18] = -A[13] - 0.0883928571428584*G0_0_0_0_0 - 0.033482142857143*G0_0_0_0_1 - 0.0441964285714292*G0_0_0_0_2 - 0.033482142857143*G0_0_0_1_0 - 0.238392857142859*G0_0_0_1_1 - 0.0334821428571429*G0_0_0_1_2 - 0.0441964285714292*G0_0_0_2_0 - 0.0334821428571429*G0_0_0_2_1 - 0.0883928571428584*G0_0_0_2_2; + A[88] = -A[83] + 0.381696428571434*G0_0_0_0_0 + 0.172767857142858*G0_0_0_0_1 + 0.120535714285716*G0_0_0_0_2 + 0.172767857142858*G0_0_0_1_0 + 0.48214285714286*G0_0_0_1_1 + 0.0683035714285708*G0_0_0_1_2 + 0.120535714285716*G0_0_0_2_0 + 0.0683035714285708*G0_0_0_2_1 + 0.10044642857143*G0_0_0_2_2 - 0.0401785714285718*G0_1_0_0_0 - 0.0361607142857143*G0_1_0_0_1 - 0.0200892857142857*G0_1_0_0_2 - 0.0361607142857143*G0_1_0_1_0 + 0.265178571428575*G0_1_0_1_1 - 0.0361607142857142*G0_1_0_1_2 - 0.0200892857142857*G0_1_0_2_0 - 0.0361607142857142*G0_1_0_2_1 - 0.0401785714285715*G0_1_0_2_2; + A[77] = A[88] + 0.361607142857145*G0_0_0_0_0 + 0.0241071428571428*G0_0_0_0_2 - 0.361607142857145*G0_0_0_1_1 - 0.0241071428571428*G0_0_0_1_2 + 0.0241071428571428*G0_0_0_2_0 - 0.0241071428571428*G0_0_0_2_1 + 0.0361607142857159*G0_0_1_0_0 + 0.108482142857145*G0_0_1_0_1 + 0.0241071428571428*G0_0_1_0_2 + 0.108482142857145*G0_0_1_1_0 - 0.325446428571429*G0_0_1_1_1 + 0.0241071428571428*G0_0_1_2_0 + 0.0241071428571431*G0_0_1_2_2 + 0.0361607142857159*G0_1_0_0_0 + 0.108482142857145*G0_1_0_0_1 + 0.0241071428571428*G0_1_0_0_2 + 0.108482142857145*G0_1_0_1_0 - 0.325446428571429*G0_1_0_1_1 + 0.0241071428571428*G0_1_0_2_0 + 0.0241071428571432*G0_1_0_2_2 + 0.361607142857146*G0_1_1_0_0 + 0.108482142857145*G0_1_1_0_1 + 0.060267857142857*G0_1_1_0_2 + 0.108482142857145*G0_1_1_1_0 - 0.65089285714286*G0_1_1_1_1 - 0.036160714285714*G0_1_1_1_2 + 0.060267857142857*G0_1_1_2_0 - 0.0361607142857141*G0_1_1_2_1 + 0.0241071428571432*G0_1_1_2_2; + A[43] = A[34] - 0.0120535714285712*G0_0_1_0_0 - 0.0421874999999996*G0_0_1_0_1 - 0.0421874999999995*G0_0_1_0_2 - 0.0421874999999996*G0_0_1_1_0 - 0.216964285714288*G0_0_1_1_1 - 0.19888392857143*G0_0_1_1_2 - 0.0421874999999995*G0_0_1_2_0 - 0.19888392857143*G0_0_1_2_1 - 0.216964285714287*G0_0_1_2_2 + 0.0120535714285712*G0_1_0_0_0 + 0.0421874999999996*G0_1_0_0_1 + 0.0421874999999995*G0_1_0_0_2 + 0.0421874999999996*G0_1_0_1_0 + 0.216964285714288*G0_1_0_1_1 + 0.19888392857143*G0_1_0_1_2 + 0.0421874999999995*G0_1_0_2_0 + 0.19888392857143*G0_1_0_2_1 + 0.216964285714287*G0_1_0_2_2; + A[95] = A[59] + 0.144642857142855*G0_0_1_0_0 + 0.060267857142857*G0_0_1_0_1 - 0.108482142857146*G0_0_1_0_2 + 0.060267857142857*G0_0_1_1_0 + 0.0723214285714285*G0_0_1_1_1 + 0.0120535714285712*G0_0_1_1_2 - 0.108482142857146*G0_0_1_2_0 + 0.0120535714285713*G0_0_1_2_1 - 0.14464285714286*G0_0_1_2_2 - 0.144642857142855*G0_1_0_0_0 - 0.060267857142857*G0_1_0_0_1 + 0.108482142857146*G0_1_0_0_2 - 0.060267857142857*G0_1_0_1_0 - 0.0723214285714285*G0_1_0_1_1 - 0.0120535714285713*G0_1_0_1_2 + 0.108482142857146*G0_1_0_2_0 - 0.0120535714285713*G0_1_0_2_1 + 0.14464285714286*G0_1_0_2_2; + A[52] = -A[32] + 0.0187500000000002*G0_0_1_0_0 - 0.0026785714285716*G0_0_1_0_2 - 0.0187500000000001*G0_0_1_1_1 + 0.00267857142857172*G0_0_1_1_2 - 0.00267857142857161*G0_0_1_2_0 + 0.00267857142857171*G0_0_1_2_1 + 0.0830357142857153*G0_1_1_0_0 + 0.0294642857142863*G0_1_1_0_1 + 0.0107142857142857*G0_1_1_0_2 + 0.0294642857142863*G0_1_1_1_0 + 0.0642857142857151*G0_1_1_1_1 + 0.0133928571428573*G0_1_1_1_2 + 0.0107142857142857*G0_1_1_2_0 + 0.0133928571428573*G0_1_1_2_1 + 0.120535714285716*G0_1_1_2_2; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p1_q3_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p1_q3_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q3_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q3_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q3_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q3_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q3_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q3_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q3_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q3_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q3_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q3_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p1_q4_quadrature.h b/laplacian_2d/laplacian_f2_p1_q4_quadrature.h new file mode 100644 index 0000000..cc65ae2 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p1_q4_quadrature.h @@ -0,0 +1,6514 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P1_Q4_QUADRATURE_H +#define __LAPLACIAN_F2_P1_Q4_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q4_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q4_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q4_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q4_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q4_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q4_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q4_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q4_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q4_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q4_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q4_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q4_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p1_q4_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p1_q4_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W25[25] = {0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0275289856644697, 0.0475518970579538, 0.0416389652151948, 0.021022967487322, 0.00447940679728133, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783}; + // Quadrature points on the UFC reference element: (0.0450425935698037, 0.0398098570514687), (0.0376212523451112, 0.198013417873608), (0.0263646449444709, 0.437974810247386), (0.0142857943955714, 0.695464273353636), (0.00462228846504642, 0.901464914201174), (0.221578609552379, 0.0398098570514687), (0.185070710267389, 0.198013417873608), (0.129695936782254, 0.437974810247386), (0.0702762920082817, 0.695464273353636), (0.022738483063764, 0.901464914201174), (0.480095071474266, 0.0398098570514687), (0.400993291063196, 0.198013417873608), (0.281012594876307, 0.437974810247386), (0.152267863323182, 0.695464273353636), (0.0492675428994132, 0.901464914201174), (0.738611533396152, 0.0398098570514687), (0.616915871859002, 0.198013417873608), (0.43232925297036, 0.437974810247386), (0.234259434638082, 0.695464273353636), (0.0757966027350624, 0.901464914201174), (0.915147549378728, 0.0398098570514687), (0.764365329781281, 0.198013417873608), (0.535660544808143, 0.437974810247386), (0.290249932250792, 0.695464273353636), (0.09391279733378, 0.901464914201174) + + // Value of basis functions at quadrature points. + static const double FE0[25][3] = \ + {{0.915147549378728, 0.0450425935698037, 0.0398098570514687}, + {0.764365329781281, 0.0376212523451112, 0.198013417873608}, + {0.535660544808143, 0.026364644944471, 0.437974810247386}, + {0.290249932250793, 0.0142857943955714, 0.695464273353636}, + {0.0939127973337801, 0.00462228846504648, 0.901464914201173}, + {0.738611533396152, 0.221578609552379, 0.0398098570514687}, + {0.616915871859002, 0.185070710267389, 0.198013417873608}, + {0.43232925297036, 0.129695936782254, 0.437974810247386}, + {0.234259434638082, 0.0702762920082818, 0.695464273353636}, + {0.0757966027350624, 0.0227384830637641, 0.901464914201173}, + {0.480095071474266, 0.480095071474266, 0.0398098570514687}, + {0.400993291063196, 0.400993291063196, 0.198013417873608}, + {0.281012594876307, 0.281012594876307, 0.437974810247386}, + {0.152267863323182, 0.152267863323182, 0.695464273353636}, + {0.0492675428994133, 0.0492675428994133, 0.901464914201173}, + {0.221578609552379, 0.738611533396152, 0.0398098570514687}, + {0.185070710267389, 0.616915871859002, 0.198013417873608}, + {0.129695936782254, 0.43232925297036, 0.437974810247386}, + {0.0702762920082818, 0.234259434638082, 0.695464273353636}, + {0.0227384830637641, 0.0757966027350624, 0.901464914201173}, + {0.0450425935698037, 0.915147549378728, 0.0398098570514687}, + {0.0376212523451112, 0.764365329781281, 0.198013417873608}, + {0.026364644944471, 0.535660544808143, 0.437974810247386}, + {0.0142857943955715, 0.290249932250793, 0.695464273353636}, + {0.00462228846504648, 0.0939127973337801, 0.901464914201173}}; + + static const double FE1_D01[25][14] = \ + {{-4.92348092472479, -0.489501772856739, 0.179203488876249, 0.100666813761961, 0.134603486992305, 8.63375492668695, -5.79126584504057, 2.57049361593515, -2.43064495934601, 0.933695301413292, -0.179203488876251, 3.14676539989352, -1.03436211517524, -0.850723927539827}, + {-1.22072339702365, 0.353412468851741, 0.157627099145873, -0.0746718571074941, -0.0873088916887541, -1.74300688822412, 4.51684211570302, -1.90652429930699, -1.17372701640678, 0.653887982994551, -0.157627099145872, 0.673966720836549, -0.579216125887057, 0.587069187258981}, + {0.358599061347387, -0.199260154242238, 0.11915032151674, -0.236201006974522, 0.0489368169731712, -3.17391758456232, 1.80243660692675, 1.21214207053042, -0.205074293683275, 0.309924093033935, -0.119150321516738, -0.697548150238492, -0.0737230860594163, 0.853685626948599}, + {-0.256528017544188, 0.335981245709448, 0.0697846126615126, -0.245883039206206, 0.324765406089899, 1.6058038662832, -5.69992944155756, 4.01467234710911, 0.0351330450820346, 0.0712264684545085, -0.0697846126615112, -0.398938571740192, 0.174656570751691, 0.0390401205682623}, + {0.0106140386976448, 4.47094346923701, 0.023972721189482, -0.112725965267303, 0.238775264288607, -0.15332389817035, 0.879973096214445, -5.20820670597875, -0.00208846471084578, -0.00451319159940933, -0.0239727211894847, 0.0244881945022275, 0.117239156866706, -0.261174994079983}, + {-0.839131599831696, -0.48950177285674, 0.0748108288829812, 0.0686708574696078, 0.662156663835007, 2.56379098442514, -3.27809805082916, 2.04294043909245, -6.18031729659934, 0.494625653780274, -0.0748108288829797, 8.85005639822322, -0.563296511249881, -3.33189576545889}, + {0.202323839685595, 0.353412468851741, 0.161465637815132, -0.112302905481113, -0.429499753205215, -1.75503086478979, 2.76362799404298, -1.56433343779053, -2.69567005199158, 0.756622320539373, -0.161465637815132, 0.747255447904154, -0.644319415058259, 2.37791435729265}, + {0.183058222345733, -0.199260154242238, 0.246520964624723, -0.625066207389066, 0.240735512799229, -0.923343083643203, -0.080798359164653, 1.02034337470436, -0.206029746712401, 0.613791028172696, -0.246520964624722, -3.16049155954138, 0.0112751792163715, 3.12578579345455}, + {-0.350190108838501, 0.335981245709448, 0.231575301617104, -0.922258421214661, 1.59762263690684, 1.87432390421406, -4.60193015737717, 2.74181511629217, 0.1851747050734, 0.176637588713045, -0.231575301617103, -1.40021356037656, 0.745620832501613, -0.38258378160367}, + {0.145502825089315, 4.47094346923701, 0.105228292166946, -0.513593117920688, 1.17461022697504, -0.858753730257821, 2.38634910459668, -6.14404166866518, -0.0276892592294179, -0.0325456124950437, -0.105228292166949, 0.219762882063215, 0.546138730415726, -1.36668384980883}, + {0.300790618534486, -0.48950177285674, -0.0938175098322176, -1.20457509757173, 1.43469692987617, -0.25744128910517, -0.824247729623862, 1.27040017305129, -1.97325425970202, -5.02098794019842, 0.0938175098322148, 5.0510574614487, 6.22556303777016, -4.51250013162285}, + {0.0858949745717573, 0.353412468851741, -0.255769112851834, 0.565857929720685, -0.9305984685516, -0.305589684505477, 0.92951696352612, -1.06323472244414, -0.100890713389922, -2.13896290361542, 0.255769112851833, -2.50237537066618, 1.57310497389473, 3.5338645526077}, + {-0.277867342742944, -0.199260154242238, -0.0814276204367423, 0.349126846459827, 0.521602394099412, 1.03258701566852, -1.29493601208752, 0.739476493404178, 0.714772028659139, -0.174033767171633, 0.0814276204367425, -4.60210481528708, -0.175093079288193, 3.36573039252853}, + {-0.270988583314474, 0.335981245709448, 0.22078989418089, -1.08663594700873, 3.46157400122766, 1.2250859535242, -2.16794236789051, 0.877863751971334, 0.219884789139037, 0.0519405716871661, -0.22078989418089, -1.02926474507045, 1.03469537532157, -2.65219404529625}, + {0.388816964556487, 4.47094346923701, 0.190189287582516, -0.982902206430993, 2.54503167978712, -2.05527310001484, 4.70997578769861, -7.51446312147727, -0.122720710220877, -0.0958673055551886, -0.19018928758252, 0.798690474834211, 1.07876951198618, -3.22100144440045}, + {-0.3573245679932, -0.489501772856741, 3.67417591105398, -3.93531150769328, 2.20723719591734, 0.176854297338599, 0.172112136501218, 0.497859907010124, 1.89326182738164, -4.4613954198682, -3.67417591105398, -1.32237543567259, 8.39670692756148, -2.77812358762638}, + {-0.340773582195419, 0.353412468851741, 1.12915777685523, 2.11546133033649, -1.43169718389799, 0.582648622018157, -0.033151501576722, -0.562136007097758, 1.31220636814439, -1.74046453867549, -1.12915777685523, -2.82743880134114, -0.374996791661011, 2.94692961709474}, + {-0.187879798307207, -0.199260154242237, -0.227593922486541, 3.15784151189363, 0.802469275399596, 0.603082393870928, -0.674552053425481, 0.458609612103994, 0.351965301970183, -0.0473808869682165, 0.227593922486542, -1.09106634580247, -3.11046062492541, -0.063368231567311}, + {0.191532755133864, 0.335981245709449, 0.0418084423543278, -0.269250078420215, 5.32552536554849, -0.789235204472549, 1.24780881597873, -0.986087612349495, -0.343848708253603, -0.0258287211950972, -0.0418084423543293, 1.90365444045913, 0.295078799615313, -6.88533109775401}, + {0.690818483697246, 4.47094346923701, 0.238984215828931, -1.3123152230897, 3.9154531325992, -3.45037592129704, 7.17349854265214, -8.88488457428935, -0.298960853390353, -0.172833753280059, -0.238984215828935, 1.73861890348643, 1.48514897636976, -5.35511118269528}, + {0.432860334906831, -0.489501772856743, 10.7820243913322, -6.63755958969328, 2.73479037276005, 0.0713069027774886, 0.0150278050049932, -0.0296932698325705, -2.4803228061571, 6.22985279104878, -10.7820243913322, -0.335676392472756, 0.40770679864449, 0.081208825869822}, + {0.513886950347987, 0.353412468851742, 4.43471670367803, 3.6743905576189, -1.77388804541445, -0.457548926037692, -0.189805347580739, -0.219945145581301, -2.37468364726229, 4.39732387101058, -4.43471670367803, 2.60391745686038, -8.07171442862948, 1.54465423581636}, + {0.645901171050298, -0.199260154242236, 0.232818028669783, 6.1299830446049, 0.994267971225654, -1.51667164669493, 0.803219713608937, 0.266810916277931, -2.0006750758256, 1.93189047262638, -0.232818028669786, 5.51968863591294, -8.06187351723128, -4.51328153131299}, + {0.800146649057353, 0.33598124570945, -0.104550979384442, 0.853052384530374, 6.59838259636543, -3.02166899671853, 4.14448594511816, -2.25894484316643, -1.29020890800348, 0.165558162892518, 0.10455097938444, 5.59613700148209, -1.01861054742289, -10.904310689844}, + {0.933227768613883, 4.47094346923701, 0.253980335569297, -1.45688033140528, 4.85128809528563, -4.51962829624728, 8.93617659537217, -9.82071953697578, -0.473343193721761, -0.225864578124923, -0.253980335569301, 2.59527922553586, 1.6827449095302, -6.97322412709974}}; + + // Array of non-zero columns + static const unsigned int nzc0[14] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + static const double FE1_D10[25][14] = \ + {{-4.92348092472479, -0.432860334906833, 0.107896586098764, 0.0856390087569554, 0.164296756824886, -2.14826946464529, 0.846293744652697, -0.164296756824886, 8.35137943198624, -5.29615748963549, 2.30111931728087, 2.73905860124902, -0.698685722702495, -0.931932753409652}, + {-1.22072339702365, -0.513886950347988, 0.61517602518356, 0.115133490473251, 0.132636253892541, -6.17772359190216, 0.842451558084123, -0.132636253892543, 3.26098968727126, -3.74343588801603, 2.21705654811641, 8.74568114946603, -3.18313358274743, -0.957585048557372}, + {0.358599061347386, -0.645901171050299, 1.63582196821167, -1.03942072058345, -0.217874099304767, -3.4067356132321, -4.32754643767815, 0.217874099304766, 0.0277437349865084, -1.62196637959246, 1.88152475430886, 7.3643253669928, -5.59341172197236, 5.3669671582616}, + {-0.256528017544188, -0.800146649057355, 3.09145360938005, -4.39036898432437, 2.58371024925633, 1.71035484566764, -6.55298182608794, -2.58371024925633, -0.0694179343024073, -0.0943316944380133, 1.22042429534196, 0.619671975682703, -5.42148043073039, 10.9433508104123}, + {0.0106140386976428, -0.93322776861388, 4.54360101743677, -9.04890256063947, 10.0594948012644, -0.407304233739641, 2.33685342761973, -10.0594948012644, 0.251891870858455, 0.221351386525507, 0.449370472532274, -1.65825671502798, -2.47804006866914, 6.71204913301973}, + {-0.839131599831697, 0.357324567993201, -0.102043468455618, -0.103441279031611, 0.164296756824885, -1.11038492662884, 0.657213456864125, -0.164296756824885, -2.50614138554535, 4.95602107364847, -1.96807265626462, 0.453349470661745, 0.759078924422711, -0.553772177832514}, + {0.202323839685595, 0.340773582195419, -0.421182984203023, -0.0791514039043915, 0.132636253892542, -2.88418864164502, 0.648166663706482, -0.132636253892543, -1.56651227513635, 2.49708685921486, -1.47367200595952, 1.12225223956517, 2.18311938628288, -0.56901525980209}, + {0.183058222345733, 0.187879798307206, -0.356561429246204, 0.0494858460364144, -0.217874099304766, -0.695749161156662, -3.23863987105828, 0.217874099304766, -0.433623669198942, 0.661171915140911, -0.598486266594907, -0.0500309346159661, 1.10234152501883, 3.18915402502186}, + {-0.350190108838501, -0.191532755133865, 1.02081050608965, -2.17006723719339, 2.58371024925633, 1.83251546185973, -4.33268007895696, -2.58371024925633, 0.22698314742773, 0.202466309908141, 0.112273406636495, -1.69529235999188, -1.15803360795751, 6.50274731615034}, + {0.145502825089312, -0.690818483697242, 3.55560421346399, -7.68709166057282, 10.0594948012644, -1.09773794608675, 3.69866432768638, -10.0594948012644, 0.211294956599518, 0.140288140785009, 0.193732561223402, -1.26538609430655, -1.19248017307069, 3.98842733288643}, + {0.300790618534486, -0.300790618534487, 0.163623779272956, -0.380327367947866, 0.164296756824884, -0.163623779272954, 0.38032736794787, -0.164296756824884, -2.06707176953424, 0.0, 2.06707176953424, -1.17450557632146, 1.17450557632145, 0.0}, + {0.085894974571757, -0.0858949745717575, 0.0498205716536449, -0.363659033805437, 0.132636253892543, -0.0498205716536459, 0.363659033805436, -0.132636253892543, -0.356659826241754, 0.0, 0.356659826241756, -4.07548034456091, 4.07548034456091, 0.0}, + {-0.277867342742944, 0.277867342742944, -1.11401463610527, 1.64406285854735, -0.217874099304766, 1.11401463610526, -1.64406285854735, 0.217874099304766, 0.633344408222398, 0.0, -0.633344408222397, -4.42701173599888, 4.42701173599888, 0.0}, + {-0.270988583314474, 0.270988583314474, -1.00429605934332, 1.08130642088178, 2.58371024925633, 1.00429605934331, -1.08130642088178, -2.58371024925633, 0.440674683319929, 0.0, -0.44067468331993, -2.06396012039201, 2.06396012039201, 0.0}, + {0.388816964556484, -0.388816964556484, 2.24546238759736, -5.6928779941296, 10.0594948012644, -2.24546238759735, 5.6928779941296, -10.0594948012644, 0.0674685773616459, 0.0, -0.0674685773616422, -0.280079037151977, 0.280079037151975, -1.6970983117735e-14}, + {-0.357324567993201, 0.839131599831695, 1.11038492662884, -0.657213456864119, 0.164296756824883, 0.102043468455623, 0.103441279031613, -0.164296756824883, 1.96807265626462, -4.95602107364847, 2.50614138554536, -0.759078924422717, -0.453349470661745, 0.553772177832506}, + {-0.340773582195419, -0.202323839685595, 2.88418864164502, -0.648166663706484, 0.132636253892543, 0.421182984203023, 0.0791514039043915, -0.132636253892543, 1.47367200595952, -2.49708685921486, 1.56651227513635, -2.18311938628288, -1.12225223956516, 0.569015259802091}, + {-0.187879798307206, -0.183058222345732, 0.695749161156661, 3.23863987105828, -0.217874099304765, 0.356561429246203, -0.0494858460364157, 0.217874099304765, 0.598486266594908, -0.661171915140912, 0.433623669198941, -1.10234152501884, 0.0500309346159713, -3.18915402502186}, + {0.191532755133864, 0.3501901088385, -1.83251546185973, 4.33268007895695, 2.58371024925633, -1.02081050608966, 2.17006723719339, -2.58371024925633, -0.112273406636495, -0.202466309908141, -0.22698314742773, 1.15803360795751, 1.69529235999188, -6.50274731615035}, + {0.690818483697243, -0.145502825089313, 1.09773794608676, -3.69866432768638, 10.0594948012644, -3.55560421346399, 7.68709166057283, -10.0594948012644, -0.1937325612234, -0.140288140785019, -0.211294956599513, 1.1924801730707, 1.26538609430654, -3.98842733288646}, + {0.432860334906832, 4.92348092472478, 2.14826946464528, -0.846293744652684, 0.164296756824883, -0.10789658609876, -0.0856390087569605, -0.164296756824883, -2.30111931728086, 5.29615748963548, -8.35137943198624, 0.6986857227025, -2.73905860124902, 0.931932753409644}, + {0.513886950347989, 1.22072339702365, 6.17772359190216, -0.84245155808413, 0.132636253892544, -0.615176025183567, -0.115133490473247, -0.132636253892544, -2.21705654811641, 3.74343588801603, -3.26098968727125, 3.18313358274743, -8.74568114946602, 0.957585048557374}, + {0.645901171050299, -0.358599061347386, 3.40673561323211, 4.32754643767814, -0.217874099304764, -1.63582196821167, 1.03942072058346, 0.217874099304764, -1.88152475430886, 1.62196637959245, -0.0277437349865067, 5.59341172197235, -7.36432536699278, -5.3669671582616}, + {0.800146649057353, 0.256528017544187, -1.71035484566764, 6.55298182608793, 2.58371024925633, -3.09145360938005, 4.39036898432437, -2.58371024925633, -1.22042429534196, 0.0943316944380134, 0.0694179343024074, 5.42148043073038, -0.619671975682697, -10.9433508104123}, + {0.93322776861388, -0.0106140386976432, 0.407304233739652, -2.33685342761973, 10.0594948012644, -4.54360101743676, 9.04890256063948, -10.0594948012644, -0.449370472532272, -0.221351386525517, -0.25189187085845, 2.47804006866915, 1.65825671502797, -6.71204913301977}}; + + // Array of non-zero columns + static const unsigned int nzc1[14] = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 225; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 59325 + for (unsigned int ip = 0; ip < 25; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 12 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[0][r]; + F1 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W25[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W25[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W25[ip]; + + + // Number of operations for primary indices: 2352 + for (unsigned int j = 0; j < 14; j++) + { + for (unsigned int k = 0; k < 14; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p1_q4_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p1_q4_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q4_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q4_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q4_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q4_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q4_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q4_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q4_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q4_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q4_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p1_q4_tensor.h b/laplacian_2d/laplacian_f2_p1_q4_tensor.h new file mode 100644 index 0000000..a89b4ec --- /dev/null +++ b/laplacian_2d/laplacian_f2_p1_q4_tensor.h @@ -0,0 +1,6626 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P1_Q4_TENSOR_H +#define __LAPLACIAN_F2_P1_Q4_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q4_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q4_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q4_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p1_q4_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p1_q4_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p1_q4_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q4_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q4_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q4_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p1_q4_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p1_q4_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p1_q4_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p1_q4_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p1_q4_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 108 + // Number of operations (multiply-add pairs) for tensor contraction: 4525 + // Total number of operations (multiply-add pairs): 4644 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[108] = -0.037248677248677*G0_0_0_0_0 + 0.00507936507936508*G0_0_0_0_1 - 0.0524867724867722*G0_0_0_0_2 + 0.00507936507936508*G0_0_0_1_0 + 0.0101587301587303*G0_0_0_1_1 + 0.00169312169312186*G0_0_0_1_2 - 0.0524867724867722*G0_0_0_2_0 + 0.00169312169312186*G0_0_0_2_1 - 0.0338624338624339*G0_0_0_2_2 - 0.00395061728395062*G0_0_1_0_0 - 0.000564373897707327*G0_0_1_0_1 - 0.00959435626102292*G0_0_1_0_2 - 0.000564373897707327*G0_0_1_1_0 - 0.00846560846560937*G0_0_1_1_1 - 0.00225749559082894*G0_0_1_1_2 - 0.00959435626102291*G0_0_1_2_0 - 0.00225749559082894*G0_0_1_2_1 - 0.00507936507936548*G0_0_1_2_2 + 0.0152380952380948*G0_1_0_0_0 - 0.0152380952380953*G0_1_0_0_2 - 0.00507936507936501*G0_1_0_1_1 - 0.00338624338624326*G0_1_0_1_2 - 0.0152380952380953*G0_1_0_2_0 - 0.00338624338624326*G0_1_0_2_1 - 0.0152380952380953*G0_1_0_2_2 + 0.00112874779541434*G0_1_1_0_0 + 0.00169312169312159*G0_1_1_0_1 + 0.00169312169312159*G0_1_1_1_0 - 0.00169312169312172*G0_1_1_1_2 - 0.00169312169312172*G0_1_1_2_1 - 0.00112874779541478*G0_1_1_2_2; + A[176] = 0.252839506172839*G0_0_0_0_0 + 0.135449735449735*G0_0_0_0_1 + 0.0632098765432095*G0_0_0_0_2 + 0.135449735449735*G0_0_0_1_0 + 0.948148148148144*G0_0_0_1_1 + 0.0902998236331565*G0_0_0_1_2 + 0.0632098765432095*G0_0_0_2_0 + 0.0902998236331565*G0_0_0_2_1 + 0.049664902998236*G0_0_0_2_2 - 0.0112874779541447*G0_0_1_0_0 + 0.0112874779541446*G0_0_1_0_1 + 0.0112874779541446*G0_0_1_1_0 + 0.891710758377421*G0_0_1_1_1 + 0.0677248677248673*G0_0_1_1_2 + 0.0677248677248673*G0_0_1_2_1 + 0.0112874779541446*G0_0_1_2_2 - 0.0112874779541447*G0_1_0_0_0 + 0.0112874779541446*G0_1_0_0_1 + 0.0112874779541446*G0_1_0_1_0 + 0.891710758377421*G0_1_0_1_1 + 0.0677248677248673*G0_1_0_1_2 + 0.0677248677248673*G0_1_0_2_1 + 0.0112874779541446*G0_1_0_2_2 + 0.0225749559082891*G0_1_1_0_0 + 0.12416225749559*G0_1_1_0_1 + 0.0112874779541446*G0_1_1_0_2 + 0.12416225749559*G0_1_1_1_0 + 1.53509700176366*G0_1_1_1_1 + 0.12416225749559*G0_1_1_1_2 + 0.0112874779541446*G0_1_1_2_0 + 0.12416225749559*G0_1_1_2_1 + 0.0225749559082891*G0_1_1_2_2; + A[52] = A[108] + 0.0191887125220454*G0_0_1_0_0 + 0.000564373897707292*G0_0_1_0_1 - 0.00564373897707235*G0_0_1_0_2 + 0.000564373897707292*G0_0_1_1_0 + 0.00338624338624436*G0_0_1_1_1 - 0.00112874779541433*G0_0_1_1_2 - 0.00564373897707235*G0_0_1_2_0 - 0.00112874779541433*G0_0_1_2_1 - 0.0101587301587298*G0_0_1_2_2 - 0.0191887125220454*G0_1_0_0_0 - 0.000564373897707292*G0_1_0_0_1 + 0.00564373897707235*G0_1_0_0_2 - 0.000564373897707293*G0_1_0_1_0 - 0.00338624338624436*G0_1_0_1_1 + 0.00112874779541433*G0_1_0_1_2 + 0.00564373897707235*G0_1_0_2_0 + 0.00112874779541433*G0_1_0_2_1 + 0.0101587301587298*G0_1_0_2_2; + A[35] = 0.00423280423280423*G0_1_0_0_0 + 0.00211640211640213*G0_1_0_0_1 + 0.039506172839506*G0_1_0_0_2 + 0.00211640211640213*G0_1_0_1_0 + 0.00423280423280425*G0_1_0_1_1 + 0.039506172839506*G0_1_0_1_2 + 0.039506172839506*G0_1_0_2_0 + 0.039506172839506*G0_1_0_2_1 + 0.608112874779538*G0_1_0_2_2 - 0.0155202821869488*G0_1_1_0_0 - 0.0155202821869488*G0_1_1_0_1 + 0.00634920634920631*G0_1_1_0_2 - 0.0155202821869488*G0_1_1_1_0 - 0.0465608465608465*G0_1_1_1_1 + 0.0126984126984126*G0_1_1_1_2 + 0.00634920634920631*G0_1_1_2_0 + 0.0126984126984126*G0_1_1_2_1 + 0.182010582010581*G0_1_1_2_2; + A[26] = -0.0507936507936506*G0_0_0_0_0 - 0.0268077601410934*G0_0_0_0_1 - 0.0176366843033509*G0_0_0_0_2 - 0.0268077601410934*G0_0_0_1_0 - 0.426102292768958*G0_0_0_1_1 - 0.0331569664902997*G0_0_0_1_2 - 0.0176366843033509*G0_0_0_2_0 - 0.0331569664902997*G0_0_0_2_1 - 0.019753086419753*G0_0_0_2_2 - 0.00423280423280418*G0_0_1_0_0 - 0.039506172839506*G0_0_1_0_1 - 0.0021164021164021*G0_0_1_0_2 - 0.039506172839506*G0_0_1_1_0 - 0.608112874779538*G0_0_1_1_1 - 0.0395061728395059*G0_0_1_1_2 - 0.0021164021164021*G0_0_1_2_0 - 0.0395061728395059*G0_0_1_2_1 - 0.00423280423280421*G0_0_1_2_2; + A[135] = A[26] - 0.375308641975307*G0_0_0_0_0 - 0.0155202821869488*G0_0_0_0_2 + 0.375308641975307*G0_0_0_1_1 + 0.0155202821869488*G0_0_0_1_2 - 0.0155202821869488*G0_0_0_2_0 + 0.0155202821869488*G0_0_0_2_1 - 0.421869488536154*G0_0_1_0_0 + 0.0126984126984126*G0_0_1_0_1 - 0.0310405643738976*G0_0_1_0_2 + 0.0126984126984126*G0_0_1_1_0 + 0.557319223985888*G0_0_1_1_1 + 0.0218694885361551*G0_0_1_1_2 - 0.0310405643738976*G0_0_1_2_0 + 0.0218694885361551*G0_0_1_2_1 - 0.0155202821869487*G0_0_1_2_2 + 0.182010582010581*G0_1_0_0_0 + 0.0126984126984126*G0_1_0_0_1 + 0.00634920634920629*G0_1_0_0_2 + 0.0126984126984126*G0_1_0_1_0 - 0.0465608465608463*G0_1_0_1_1 - 0.0155202821869488*G0_1_0_1_2 + 0.00634920634920629*G0_1_0_2_0 - 0.0155202821869488*G0_1_0_2_1 - 0.0155202821869488*G0_1_0_2_2 + 0.182010582010581*G0_1_1_0_0 + 0.0126984126984126*G0_1_1_0_1 + 0.00634920634920629*G0_1_1_0_2 + 0.0126984126984126*G0_1_1_1_0 - 0.0465608465608461*G0_1_1_1_1 - 0.0155202821869488*G0_1_1_1_2 + 0.00634920634920629*G0_1_1_2_0 - 0.0155202821869488*G0_1_1_2_1 - 0.0155202821869488*G0_1_1_2_2; + A[211] = -0.0163668430335096*G0_0_0_0_0 + 0.00338624338624337*G0_0_0_0_1 - 0.0307583774250439*G0_0_0_0_2 + 0.00338624338624337*G0_0_0_1_0 + 0.0705467372134036*G0_0_0_1_1 + 0.00366843033509702*G0_0_0_1_2 - 0.0307583774250439*G0_0_0_2_0 + 0.00366843033509702*G0_0_0_2_1 - 0.0914285714285708*G0_0_0_2_2 + 0.00395061728395068*G0_1_0_0_0 - 0.00141093474426809*G0_1_0_0_1 + 0.00451499118165783*G0_1_0_0_2 - 0.00141093474426809*G0_1_0_1_0 + 0.00141093474426808*G0_1_0_1_2 + 0.00451499118165783*G0_1_0_2_0 + 0.00141093474426808*G0_1_0_2_1 - 0.0129805996472662*G0_1_0_2_2; + A[181] = A[211] - 0.062081128747795*G0_0_0_0_0 - 0.0011287477954144*G0_0_0_0_1 - 0.00451499118165777*G0_0_0_0_2 - 0.0011287477954144*G0_0_0_1_0 + 0.00112874779541443*G0_0_0_1_2 - 0.00451499118165776*G0_0_0_2_0 + 0.00112874779541443*G0_0_0_2_1 + 0.0711111111111105*G0_0_0_2_2 + 0.00902998236331547*G0_1_0_0_0 - 0.00902998236331566*G0_1_0_0_2 - 0.00902998236331566*G0_1_0_2_0 + 0.00902998236331553*G0_1_0_2_2; + A[16] = 0.0134920634920634*G0_0_0_0_0 + 0.0176807760141093*G0_0_0_0_1 + 0.0067460317460317*G0_0_0_0_2 + 0.0176807760141093*G0_0_0_1_0 + 0.261816578483244*G0_0_0_1_1 + 0.0176807760141092*G0_0_0_1_2 + 0.0067460317460317*G0_0_0_2_0 + 0.0176807760141092*G0_0_0_2_1 + 0.0134920634920634*G0_0_0_2_2; + A[36] = -0.0189065255731921*G0_1_0_0_0 - 0.00296296296296297*G0_1_0_0_1 - 0.00987654320987645*G0_1_0_0_2 - 0.00296296296296297*G0_1_0_1_0 - 0.00197530864197538*G0_1_0_1_1 - 0.0126984126984126*G0_1_0_1_2 - 0.00987654320987645*G0_1_0_2_0 - 0.0126984126984126*G0_1_0_2_1 - 0.13121693121693*G0_1_0_2_2 - 0.0682892416225746*G0_1_1_0_0 - 0.0097354497354497*G0_1_1_0_1 - 0.00592592592592589*G0_1_1_0_2 - 0.0097354497354497*G0_1_1_1_0 - 0.00395061728395065*G0_1_1_1_1 - 0.011710758377425*G0_1_1_1_2 - 0.00592592592592589*G0_1_1_2_0 - 0.011710758377425*G0_1_1_2_1 - 0.118518518518518*G0_1_1_2_2; + A[122] = -0.00423280423280423*G0_0_1_0_0 - 0.00211640211640212*G0_0_1_0_1 - 0.039506172839506*G0_0_1_0_2 - 0.00211640211640212*G0_0_1_1_0 - 0.00423280423280425*G0_0_1_1_1 - 0.039506172839506*G0_0_1_1_2 - 0.039506172839506*G0_0_1_2_0 - 0.039506172839506*G0_0_1_2_1 - 0.608112874779537*G0_0_1_2_2 - 0.0507936507936506*G0_1_1_0_0 - 0.0176366843033509*G0_1_1_0_1 - 0.0268077601410934*G0_1_1_0_2 - 0.0176366843033509*G0_1_1_1_0 - 0.0197530864197531*G0_1_1_1_1 - 0.0331569664902997*G0_1_1_1_2 - 0.0268077601410934*G0_1_1_2_0 - 0.0331569664902997*G0_1_1_2_1 - 0.426102292768957*G0_1_1_2_2; + A[212] = -0.00282186948853607*G0_0_1_0_0 + 0.00987654320987637*G0_0_1_0_2 + 0.00282186948853606*G0_0_1_1_1 - 0.00987654320987662*G0_0_1_1_2 + 0.00987654320987637*G0_0_1_2_0 - 0.00987654320987661*G0_0_1_2_1 + 0.0581305114638446*G0_1_1_0_0 + 0.0392239858906524*G0_1_1_0_1 - 0.00564373897707232*G0_1_1_0_2 + 0.0392239858906524*G0_1_1_1_0 + 0.0609523809523807*G0_1_1_1_1 - 0.0155202821869489*G0_1_1_1_2 - 0.00564373897707232*G0_1_1_2_0 - 0.0155202821869489*G0_1_1_2_1 - 0.239858906525572*G0_1_1_2_2; + A[1] = 0.0231922398589065*G0_0_0_0_0 + 0.000238095238095249*G0_0_0_0_1 + 0.00231922398589064*G0_0_0_0_2 + 0.000238095238095248*G0_0_0_1_0 + 0.0231922398589065*G0_0_0_1_1 + 0.00231922398589064*G0_0_0_1_2 + 0.00231922398589064*G0_0_0_2_0 + 0.00231922398589064*G0_0_0_2_1 + 0.000476190476190453*G0_0_0_2_2 + 0.0231922398589065*G0_1_0_0_0 + 0.000238095238095248*G0_1_0_0_1 + 0.00231922398589064*G0_1_0_0_2 + 0.000238095238095248*G0_1_0_1_0 + 0.0231922398589064*G0_1_0_1_1 + 0.00231922398589063*G0_1_0_1_2 + 0.00231922398589064*G0_1_0_2_0 + 0.00231922398589063*G0_1_0_2_1 + 0.000476190476190441*G0_1_0_2_2; + A[27] = A[181] + 0.0129805996472662*G0_0_1_0_0 - 0.00141093474426805*G0_0_1_0_1 - 0.00451499118165782*G0_0_1_0_2 - 0.00141093474426805*G0_0_1_1_0 + 0.00141093474426808*G0_0_1_1_2 - 0.00451499118165783*G0_0_1_2_0 + 0.00141093474426808*G0_0_1_2_1 - 0.00395061728395062*G0_0_1_2_2 - 0.0129805996472662*G0_1_0_0_0 + 0.00141093474426805*G0_1_0_0_1 + 0.00451499118165782*G0_1_0_0_2 + 0.00141093474426805*G0_1_0_1_0 - 0.00141093474426808*G0_1_0_1_2 + 0.00451499118165783*G0_1_0_2_0 - 0.00141093474426808*G0_1_0_2_1 + 0.00395061728395063*G0_1_0_2_2; + A[21] = -A[27] - 0.0426102292768957*G0_0_0_0_0 - 0.000705467372133972*G0_0_0_0_1 - 0.0237037037037036*G0_0_0_0_2 - 0.000705467372133973*G0_0_0_1_0 + 0.0578483245149913*G0_0_0_1_1 + 0.00282186948853615*G0_0_0_1_2 - 0.0237037037037036*G0_0_0_2_0 + 0.00282186948853615*G0_0_0_2_1 - 0.0143915343915344*G0_0_0_2_2 - 0.000564373897707568*G0_0_1_0_0 - 0.000423280423280414*G0_0_1_0_1 + 0.000282186948853576*G0_0_1_0_2 - 0.000423280423280416*G0_0_1_1_0 + 0.00042328042328044*G0_0_1_1_2 + 0.000282186948853577*G0_0_1_2_0 + 0.000423280423280439*G0_0_1_2_1; + A[46] = -0.0155202821869488*G0_0_0_0_0 + 0.00634920634920626*G0_0_0_0_1 - 0.0155202821869488*G0_0_0_0_2 + 0.00634920634920626*G0_0_0_1_0 + 0.18201058201058*G0_0_0_1_1 + 0.0126984126984126*G0_0_0_1_2 - 0.0155202821869488*G0_0_0_2_0 + 0.0126984126984126*G0_0_0_2_1 - 0.0465608465608463*G0_0_0_2_2 + 0.00423280423280419*G0_1_0_0_0 + 0.039506172839506*G0_1_0_0_1 + 0.0021164021164021*G0_1_0_0_2 + 0.039506172839506*G0_1_0_1_0 + 0.608112874779538*G0_1_0_1_1 + 0.0395061728395059*G0_1_0_1_2 + 0.0021164021164021*G0_1_0_2_0 + 0.0395061728395059*G0_1_0_2_1 + 0.00423280423280422*G0_1_0_2_2; + A[144] = A[176] + 0.695308641975306*G0_0_0_0_0 + 0.0270899470899471*G0_0_0_0_2 - 0.695308641975306*G0_0_0_1_1 - 0.0270899470899469*G0_0_0_1_2 + 0.0270899470899471*G0_0_0_2_0 - 0.0270899470899469*G0_0_0_2_1 + 0.0677248677248675*G0_0_1_0_0 + 0.112874779541446*G0_0_1_0_1 + 0.0225749559082892*G0_0_1_0_2 + 0.112874779541446*G0_0_1_1_0 - 0.627583774250438*G0_0_1_1_1 - 0.00451499118165777*G0_0_1_1_2 + 0.0225749559082892*G0_0_1_2_0 - 0.00451499118165777*G0_0_1_2_1 + 0.027089947089947*G0_0_1_2_2 + 0.0677248677248675*G0_1_0_0_0 + 0.112874779541446*G0_1_0_0_1 + 0.0225749559082892*G0_1_0_0_2 + 0.112874779541446*G0_1_0_1_0 - 0.627583774250438*G0_1_0_1_1 - 0.00451499118165777*G0_1_0_1_2 + 0.0225749559082892*G0_1_0_2_0 - 0.00451499118165775*G0_1_0_2_1 + 0.027089947089947*G0_1_0_2_2 + 0.677248677248674*G0_1_1_0_0 + 0.112874779541446*G0_1_1_0_1 + 0.0677248677248675*G0_1_1_0_2 + 0.112874779541446*G0_1_1_1_0 - 1.23710758377424*G0_1_1_1_1 - 0.0496649029982359*G0_1_1_1_2 + 0.0677248677248675*G0_1_1_2_0 - 0.0496649029982359*G0_1_1_2_1 + 0.0270899470899471*G0_1_1_2_2; + A[89] = 0.0225749559082891*G0_0_0_0_0 + 0.0902998236331564*G0_0_0_0_2 - 0.0225749559082893*G0_0_0_1_1 - 0.0902998236331568*G0_0_0_1_2 + 0.0902998236331564*G0_0_0_2_0 - 0.0902998236331568*G0_0_0_2_1 - 0.0180599647266312*G0_0_1_0_0 - 0.0158024691358023*G0_0_1_0_1 - 0.0564373897707229*G0_0_1_0_2 - 0.0158024691358023*G0_0_1_1_0 - 0.0406349206349203*G0_0_1_1_1 - 0.14673721340388*G0_0_1_1_2 - 0.0564373897707229*G0_0_1_2_0 - 0.14673721340388*G0_0_1_2_1 - 0.79012345679012*G0_0_1_2_2 + 0.0135449735449735*G0_1_0_0_0 - 0.0135449735449736*G0_1_0_0_1 - 0.0135449735449736*G0_1_0_1_0 - 0.121904761904761*G0_1_0_1_1 - 0.27089947089947*G0_1_0_1_2 - 0.27089947089947*G0_1_0_2_1 - 0.609523809523807*G0_1_0_2_2 - 0.121904761904761*G0_1_1_0_0 - 0.135449735449735*G0_1_1_0_1 - 0.0812698412698411*G0_1_1_0_2 - 0.135449735449735*G0_1_1_1_0 - 0.352169312169311*G0_1_1_1_1 - 0.325079365079364*G0_1_1_1_2 - 0.0812698412698411*G0_1_1_2_0 - 0.325079365079364*G0_1_1_2_1 - 0.880423280423276*G0_1_1_2_2; + A[195] = A[181] + 0.148994708994708*G0_0_0_0_0 + 0.0400705467372131*G0_0_0_0_2 - 0.148994708994708*G0_0_0_1_1 - 0.0400705467372131*G0_0_0_1_2 + 0.0400705467372131*G0_0_0_2_0 - 0.0400705467372131*G0_0_0_2_1 + 0.0705467372134037*G0_0_1_0_0 + 0.00225749559082897*G0_0_1_0_1 + 0.00479717813051142*G0_0_1_0_2 + 0.00225749559082897*G0_0_1_1_0 - 0.0784479717813044*G0_0_1_1_1 - 0.0352733686067016*G0_0_1_1_2 + 0.00479717813051142*G0_0_1_2_0 - 0.0352733686067016*G0_0_1_2_1 - 0.0203174603174602*G0_0_1_2_2 + 0.0575661375661369*G0_1_0_0_0 + 0.00507936507936504*G0_1_0_0_1 + 0.00790123456790118*G0_1_0_0_2 + 0.00507936507936504*G0_1_0_1_0 - 0.091428571428571*G0_1_0_1_1 - 0.0321693121693119*G0_1_0_1_2 + 0.00790123456790119*G0_1_0_2_0 - 0.0321693121693119*G0_1_0_2_1 - 0.012416225749559*G0_1_0_2_2 + 0.0705467372134032*G0_1_1_0_0 + 0.00366843033509705*G0_1_1_0_1 + 0.00338624338624336*G0_1_1_0_2 + 0.00366843033509705*G0_1_1_1_0 - 0.0914285714285705*G0_1_1_1_1 - 0.0307583774250438*G0_1_1_1_2 + 0.00338624338624336*G0_1_1_2_0 - 0.0307583774250438*G0_1_1_2_1 - 0.0163668430335095*G0_1_1_2_2; + A[14] = A[195] + 0.00112874779541447*G0_0_0_0_1 - 0.00112874779541437*G0_0_0_0_2 + 0.00112874779541447*G0_0_0_1_0 + 0.062081128747795*G0_0_0_1_1 + 0.00451499118165783*G0_0_0_1_2 - 0.00112874779541437*G0_0_0_2_0 + 0.00451499118165783*G0_0_0_2_1 - 0.0711111111111106*G0_0_0_2_2 + 0.00253968253968254*G0_0_1_0_1 - 0.00253968253968246*G0_0_1_0_2 + 0.00253968253968254*G0_0_1_1_0 + 0.0581305114638442*G0_0_1_1_1 - 0.00253968253968246*G0_0_1_2_0 - 0.0581305114638443*G0_0_1_2_2 - 0.00028218694885357*G0_1_0_0_1 + 0.000282186948853673*G0_1_0_0_2 - 0.00028218694885357*G0_1_0_1_0 + 0.0750617283950612*G0_1_0_1_1 + 0.000282186948853674*G0_1_0_2_0 - 0.0750617283950613*G0_1_0_2_2 + 0.00112874779541443*G0_1_1_0_1 - 0.00112874779541441*G0_1_1_0_2 + 0.00112874779541444*G0_1_1_1_0 + 0.0711111111111102*G0_1_1_1_1 - 0.00451499118165789*G0_1_1_1_2 - 0.00112874779541441*G0_1_1_2_0 - 0.00451499118165789*G0_1_1_2_1 - 0.0620811287477951*G0_1_1_2_2; + A[56] = -A[176] + 0.316049382716048*G0_0_0_0_0 + 0.158024691358024*G0_0_0_0_1 + 0.101587301587301*G0_0_0_0_2 + 0.158024691358024*G0_0_0_1_0 + 0.654673721340386*G0_0_0_1_1 + 0.056437389770723*G0_0_0_1_2 + 0.101587301587301*G0_0_0_2_0 + 0.056437389770723*G0_0_0_2_1 + 0.0902998236331565*G0_0_0_2_2 - 0.0225749559082893*G0_0_1_0_0 - 0.0451499118165781*G0_0_1_0_1 - 0.0112874779541446*G0_0_1_0_2 - 0.0451499118165781*G0_0_1_1_0 + 0.248324514991182*G0_0_1_1_1 - 0.0451499118165783*G0_0_1_1_2 - 0.0112874779541446*G0_0_1_2_0 - 0.0451499118165783*G0_0_1_2_1 - 0.0225749559082891*G0_0_1_2_2; + A[125] = A[56] - 0.0857848324514986*G0_0_0_0_0 - 0.0338624338624338*G0_0_0_0_1 - 0.162539682539682*G0_0_0_0_2 - 0.0338624338624338*G0_0_0_1_0 + 0.270899470899468*G0_0_0_1_1 - 0.0902998236331567*G0_0_0_1_2 - 0.162539682539682*G0_0_0_2_0 - 0.0902998236331567*G0_0_0_2_1 - 1.57573192239858*G0_0_0_2_2 + 0.0451499118165782*G0_0_1_0_1 - 0.0451499118165783*G0_0_1_0_2 + 0.0451499118165782*G0_0_1_1_0 + 0.609523809523805*G0_0_1_1_1 - 0.0451499118165783*G0_0_1_2_0 - 0.609523809523806*G0_0_1_2_2 + 0.0112874779541446*G0_1_0_0_1 - 0.0112874779541445*G0_1_0_0_2 + 0.0112874779541446*G0_1_0_1_0 + 0.880423280423276*G0_1_0_1_1 - 0.0112874779541445*G0_1_0_2_0 - 0.880423280423275*G0_1_0_2_2 + 0.0857848324514986*G0_1_1_0_0 + 0.162539682539682*G0_1_1_0_1 + 0.0338624338624338*G0_1_1_0_2 + 0.162539682539682*G0_1_1_1_0 + 1.57573192239858*G0_1_1_1_1 + 0.0902998236331566*G0_1_1_1_2 + 0.0338624338624338*G0_1_1_2_0 + 0.0902998236331566*G0_1_1_2_1 - 0.270899470899469*G0_1_1_2_2; + A[83] = A[125] + 0.0225749559082891*G0_0_1_0_0 + 0.0112874779541445*G0_0_1_0_1 + 0.0451499118165785*G0_0_1_0_2 + 0.0112874779541445*G0_0_1_1_0 + 0.0225749559082889*G0_0_1_1_1 + 0.0451499118165783*G0_0_1_1_2 + 0.0451499118165785*G0_0_1_2_0 + 0.0451499118165783*G0_0_1_2_1 - 0.248324514991179*G0_0_1_2_2 - 0.0225749559082891*G0_1_0_0_0 - 0.0112874779541445*G0_1_0_0_1 - 0.0451499118165785*G0_1_0_0_2 - 0.0112874779541445*G0_1_0_1_0 - 0.0225749559082889*G0_1_0_1_1 - 0.0451499118165783*G0_1_0_1_2 - 0.0451499118165785*G0_1_0_2_0 - 0.0451499118165783*G0_1_0_2_1 + 0.248324514991179*G0_1_0_2_2; + A[80] = -A[125] + 0.0225749559082891*G0_1_0_0_0 + 0.0112874779541445*G0_1_0_0_1 + 0.0451499118165785*G0_1_0_0_2 + 0.0112874779541445*G0_1_0_1_0 + 0.0225749559082889*G0_1_0_1_1 + 0.0451499118165783*G0_1_0_1_2 + 0.0451499118165785*G0_1_0_2_0 + 0.0451499118165784*G0_1_0_2_1 - 0.248324514991179*G0_1_0_2_2 + 0.112874779541446*G0_1_1_0_0 + 0.112874779541446*G0_1_1_0_1 + 0.101587301587301*G0_1_1_0_2 + 0.112874779541446*G0_1_1_1_0 + 0.338624338624338*G0_1_1_1_1 + 0.203174603174603*G0_1_1_1_2 + 0.101587301587301*G0_1_1_2_0 + 0.203174603174603*G0_1_1_2_1 + 0.406349206349205*G0_1_1_2_2; + A[31] = -0.000476190476190454*G0_1_0_0_0 - 0.00231922398589065*G0_1_0_0_1 - 0.00231922398589064*G0_1_0_0_2 - 0.00231922398589065*G0_1_0_1_0 - 0.0231922398589066*G0_1_0_1_1 - 0.00023809523809525*G0_1_0_1_2 - 0.00231922398589064*G0_1_0_2_0 - 0.000238095238095249*G0_1_0_2_1 - 0.0231922398589064*G0_1_0_2_2; + A[107] = 0.00599647266313931*G0_0_1_0_0 + 0.00229276895943564*G0_0_1_0_1 + 0.0172839506172839*G0_0_1_0_2 + 0.00229276895943564*G0_0_1_1_0 + 0.00317460317460327*G0_0_1_1_1 + 0.0271604938271604*G0_0_1_1_2 + 0.0172839506172839*G0_0_1_2_0 + 0.0271604938271604*G0_0_1_2_1 + 0.322751322751321*G0_0_1_2_2 + 0.0823985890652553*G0_1_1_0_0 + 0.0183068783068782*G0_1_1_0_1 + 0.0148148148148147*G0_1_1_0_2 + 0.0183068783068782*G0_1_1_1_0 + 0.00973544973544976*G0_1_1_1_1 + 0.0248677248677248*G0_1_1_1_2 + 0.0148148148148147*G0_1_1_2_0 + 0.0248677248677248*G0_1_1_2_1 + 0.259611992945325*G0_1_1_2_2; + A[7] = A[107] - 0.0631393298059965*G0_0_0_0_0 - 0.00229276895943563*G0_0_0_0_1 - 0.00246913580246913*G0_0_0_0_2 - 0.00229276895943562*G0_0_0_1_0 + 0.00656084656084653*G0_0_0_1_1 + 0.0160141093474426*G0_0_0_1_2 - 0.00246913580246913*G0_0_0_2_0 + 0.0160141093474426*G0_0_0_2_1 + 0.076402116402116*G0_0_0_2_2 + 0.253615520282186*G0_0_1_0_0 + 0.0225749559082891*G0_0_1_0_1 - 0.00246913580246914*G0_0_1_0_2 + 0.0225749559082891*G0_0_1_1_0 + 0.00656084656084643*G0_0_1_1_1 - 0.00885361552028216*G0_0_1_1_2 - 0.00246913580246913*G0_0_1_2_0 - 0.00885361552028217*G0_0_1_2_1 - 0.240352733686065*G0_0_1_2_2 - 0.0631393298059965*G0_1_0_0_0 - 0.00229276895943562*G0_1_0_0_1 - 0.00246913580246914*G0_1_0_0_2 - 0.00229276895943562*G0_1_0_1_0 + 0.00656084656084653*G0_1_0_1_1 + 0.0160141093474426*G0_1_0_1_2 - 0.00246913580246914*G0_1_0_2_0 + 0.0160141093474426*G0_1_0_2_1 + 0.0764021164021162*G0_1_0_2_2 + 0.17721340388007*G0_1_1_0_0 + 0.00656084656084655*G0_1_1_0_1 + 0.00656084656084656*G0_1_1_1_0 - 0.00656084656084652*G0_1_1_1_2 - 0.00656084656084652*G0_1_1_2_1 - 0.177213403880069*G0_1_1_2_2; + A[198] = A[89] - 0.14447971781305*G0_0_0_0_0 - 0.0812698412698409*G0_0_0_0_1 - 0.225749559082891*G0_0_0_0_2 - 0.0812698412698409*G0_0_0_1_0 - 0.857848324514987*G0_0_0_1_1 - 0.234779541446207*G0_0_0_1_2 - 0.225749559082891*G0_0_0_2_0 - 0.234779541446207*G0_0_0_2_1 - 0.352169312169309*G0_0_0_2_2 - 0.0406349206349206*G0_0_1_0_1 + 0.0406349206349204*G0_0_1_0_2 - 0.0406349206349206*G0_0_1_1_0 - 0.749488536155199*G0_0_1_1_1 + 0.0406349206349204*G0_0_1_2_0 + 0.749488536155199*G0_0_1_2_2 + 0.0135449735449734*G0_1_0_0_1 - 0.0135449735449737*G0_1_0_0_2 + 0.0135449735449734*G0_1_0_1_0 - 0.487619047619046*G0_1_0_1_1 - 0.0135449735449737*G0_1_0_2_0 + 0.487619047619046*G0_1_0_2_2 + 0.14447971781305*G0_1_1_0_0 + 0.225749559082891*G0_1_1_0_1 + 0.081269841269841*G0_1_1_0_2 + 0.225749559082891*G0_1_1_1_0 + 0.35216931216931*G0_1_1_1_1 + 0.234779541446207*G0_1_1_1_2 + 0.081269841269841*G0_1_1_2_0 + 0.234779541446207*G0_1_1_2_1 + 0.857848324514987*G0_1_1_2_2; + A[214] = A[198] + 0.0338624338624336*G0_0_0_0_0 + 0.0338624338624337*G0_0_0_0_1 - 0.0846560846560843*G0_0_0_0_2 + 0.0338624338624337*G0_0_0_1_0 + 0.589206349206346*G0_0_0_1_1 - 0.0643386243386242*G0_0_0_1_2 - 0.0846560846560843*G0_0_0_2_0 - 0.0643386243386241*G0_0_0_2_1 - 0.799153439153435*G0_0_0_2_2 - 0.0158024691358024*G0_0_1_0_0 + 0.0191887125220458*G0_0_1_0_1 - 0.0485361552028218*G0_0_1_0_2 + 0.0191887125220458*G0_0_1_1_0 + 0.525996472663136*G0_0_1_1_1 - 0.0598236331569665*G0_0_1_1_2 - 0.0485361552028218*G0_0_1_2_0 - 0.0598236331569665*G0_0_1_2_1 - 0.213333333333333*G0_0_1_2_2 + 0.426666666666665*G0_1_0_1_1 - 0.00338624338624344*G0_1_0_1_2 - 0.00338624338624344*G0_1_0_2_1 - 0.301375661375661*G0_1_0_2_2 + 0.0316049382716045*G0_1_1_0_0 + 0.0248324514991182*G0_1_1_0_1 + 0.0169312169312168*G0_1_1_0_2 + 0.0248324514991182*G0_1_1_1_0 + 0.203174603174604*G0_1_1_1_1 + 0.0428924162257494*G0_1_1_1_2 + 0.0169312169312168*G0_1_1_2_0 + 0.0428924162257493*G0_1_1_2_1 + 0.00225749559082816*G0_1_1_2_2; + A[149] = -A[198] - 0.20768959435626*G0_0_0_0_0 - 0.0744973544973542*G0_0_0_0_1 - 0.146737213403879*G0_0_0_0_2 - 0.0744973544973542*G0_0_0_1_0 - 0.848818342151671*G0_0_0_1_1 - 0.273156966490299*G0_0_0_1_2 - 0.146737213403879*G0_0_0_2_0 - 0.273156966490299*G0_0_0_2_1 - 0.257354497354497*G0_0_0_2_2 + 0.0316049382716035*G0_0_1_0_0 + 0.0090299823633154*G0_0_1_0_1 - 0.0180599647266315*G0_0_1_0_2 + 0.0090299823633154*G0_0_1_1_0 - 0.722398589065252*G0_0_1_1_1 - 0.0767548500881833*G0_0_1_1_2 - 0.0180599647266315*G0_0_1_2_0 - 0.0767548500881833*G0_0_1_2_1 + 0.0496649029982355*G0_0_1_2_2 + 0.108359788359788*G0_1_0_0_0 + 0.027089947089947*G0_1_0_0_1 + 0.027089947089947*G0_1_0_1_0 - 0.568888888888887*G0_1_0_1_1 - 0.203174603174602*G0_1_0_1_2 - 0.203174603174602*G0_1_0_2_1 + 0.252839506172838*G0_1_1_0_0 + 0.198659611992944*G0_1_1_0_1 + 0.198659611992944*G0_1_1_1_0 + 0.0812698412698399*G0_1_1_1_1 - 0.00902998236331562*G0_1_1_1_2 - 0.00902998236331561*G0_1_1_2_1 + 0.0993298059964723*G0_1_1_2_2; + A[32] = 0.0134920634920634*G0_1_1_0_0 + 0.00674603174603172*G0_1_1_0_1 + 0.0176807760141093*G0_1_1_0_2 + 0.00674603174603172*G0_1_1_1_0 + 0.0134920634920635*G0_1_1_1_1 + 0.0176807760141093*G0_1_1_1_2 + 0.0176807760141093*G0_1_1_2_0 + 0.0176807760141093*G0_1_1_2_1 + 0.261816578483244*G0_1_1_2_2; + A[25] = 0.0823985890652554*G0_0_0_0_0 + 0.0148148148148148*G0_0_0_0_1 + 0.0183068783068782*G0_0_0_0_2 + 0.0148148148148148*G0_0_0_1_0 + 0.259611992945325*G0_0_0_1_1 + 0.0248677248677248*G0_0_0_1_2 + 0.0183068783068782*G0_0_0_2_0 + 0.0248677248677248*G0_0_0_2_1 + 0.0097354497354497*G0_0_0_2_2 + 0.00599647266313933*G0_0_1_0_0 + 0.0172839506172839*G0_0_1_0_1 + 0.00229276895943561*G0_0_1_0_2 + 0.0172839506172839*G0_0_1_1_0 + 0.322751322751321*G0_0_1_1_1 + 0.0271604938271604*G0_0_1_1_2 + 0.00229276895943561*G0_0_1_2_0 + 0.0271604938271604*G0_0_1_2_1 + 0.00317460317460313*G0_0_1_2_2; + A[61] = 0.00656084656084654*G0_0_0_0_0 - 0.00229276895943557*G0_0_0_0_1 + 0.0160141093474426*G0_0_0_0_2 - 0.00229276895943557*G0_0_0_1_0 - 0.0631393298059958*G0_0_0_1_1 - 0.00246913580246913*G0_0_0_1_2 + 0.0160141093474426*G0_0_0_2_0 - 0.00246913580246913*G0_0_0_2_1 + 0.0764021164021159*G0_0_0_2_2 - 0.00317460317460317*G0_1_0_0_0 - 0.0271604938271604*G0_1_0_0_1 - 0.00229276895943561*G0_1_0_0_2 - 0.0271604938271604*G0_1_0_1_0 - 0.322751322751322*G0_1_0_1_1 - 0.0172839506172839*G0_1_0_1_2 - 0.00229276895943561*G0_1_0_2_0 - 0.0172839506172839*G0_1_0_2_1 - 0.00599647266313932*G0_1_0_2_2; + A[106] = 0.00980599647266306*G0_0_0_0_0 - 0.00109347442680779*G0_0_0_0_1 + 0.0147442680776013*G0_0_0_0_2 - 0.00109347442680779*G0_0_0_1_0 - 0.00740740740740782*G0_0_0_1_1 - 0.00119929453262789*G0_0_0_1_2 + 0.0147442680776013*G0_0_0_2_0 - 0.00119929453262789*G0_0_0_2_1 + 0.015026455026455*G0_0_0_2_2 - 0.00522045855379163*G0_1_0_0_0 + 0.000105820105820099*G0_1_0_0_1 + 0.000105820105820099*G0_1_0_1_0 - 0.000105820105820129*G0_1_0_1_2 - 0.000105820105820129*G0_1_0_2_1 + 0.00522045855379187*G0_1_0_2_2; + A[60] = A[106] - 0.0172134038800707*G0_0_0_0_0 - 0.0159435626102292*G0_0_0_0_2 + 0.0172134038800708*G0_0_0_1_1 + 0.0159435626102292*G0_0_0_1_2 - 0.0159435626102292*G0_0_0_2_0 + 0.0159435626102292*G0_0_0_2_1 - 0.00740740740740764*G0_0_1_0_0 - 0.00109347442680779*G0_0_1_0_1 - 0.00119929453262792*G0_0_1_0_2 - 0.00109347442680779*G0_0_1_1_0 + 0.00980599647266299*G0_0_1_1_1 + 0.0147442680776012*G0_0_1_1_2 - 0.00119929453262792*G0_0_1_2_0 + 0.0147442680776012*G0_0_1_2_1 + 0.0150264550264545*G0_0_1_2_2 - 0.0021869488536162*G0_1_0_0_0 - 0.001305114638448*G0_1_0_0_1 - 0.00109347442680783*G0_1_0_0_2 - 0.00130511463844801*G0_1_0_1_0 + 0.0150264550264551*G0_1_0_1_1 + 0.0148500881834214*G0_1_0_1_2 - 0.00109347442680783*G0_1_0_2_0 + 0.0148500881834214*G0_1_0_2_1 + 0.00458553791887125*G0_1_0_2_2 - 0.00740740740740794*G0_1_1_0_0 - 0.00119929453262793*G0_1_1_0_1 - 0.0010934744268078*G0_1_1_0_2 - 0.00119929453262793*G0_1_1_1_0 + 0.0150264550264546*G0_1_1_1_1 + 0.0147442680776012*G0_1_1_1_2 - 0.0010934744268078*G0_1_1_2_0 + 0.0147442680776012*G0_1_1_2_1 + 0.00980599647266295*G0_1_1_2_2; + A[4] = A[60] - 0.000105820105820112*G0_0_1_0_1 + 0.000105820105820117*G0_0_1_0_2 - 0.000105820105820113*G0_0_1_1_0 + 0.00522045855379173*G0_0_1_1_1 + 0.000105820105820117*G0_0_1_2_0 - 0.00522045855379155*G0_0_1_2_2 + 0.000105820105820112*G0_1_0_0_1 - 0.000105820105820118*G0_1_0_0_2 + 0.000105820105820113*G0_1_0_1_0 - 0.00522045855379174*G0_1_0_1_1 - 0.000105820105820118*G0_1_0_2_0 + 0.00522045855379154*G0_1_0_2_2; + A[15] = 0.0231922398589065*G0_0_0_0_0 + 0.000238095238095248*G0_0_0_0_1 + 0.00231922398589064*G0_0_0_0_2 + 0.000238095238095248*G0_0_0_1_0 + 0.0231922398589065*G0_0_0_1_1 + 0.00231922398589064*G0_0_0_1_2 + 0.00231922398589064*G0_0_0_2_0 + 0.00231922398589064*G0_0_0_2_1 + 0.000476190476190453*G0_0_0_2_2 + 0.0231922398589065*G0_0_1_0_0 + 0.000238095238095248*G0_0_1_0_1 + 0.00231922398589064*G0_0_1_0_2 + 0.000238095238095248*G0_0_1_1_0 + 0.0231922398589064*G0_0_1_1_1 + 0.00231922398589063*G0_0_1_1_2 + 0.00231922398589064*G0_0_1_2_0 + 0.00231922398589063*G0_0_1_2_1 + 0.000476190476190442*G0_0_1_2_2; + A[37] = 0.00599647266313931*G0_1_0_0_0 + 0.00229276895943564*G0_1_0_0_1 + 0.0172839506172839*G0_1_0_0_2 + 0.00229276895943564*G0_1_0_1_0 + 0.00317460317460327*G0_1_0_1_1 + 0.0271604938271604*G0_1_0_1_2 + 0.0172839506172839*G0_1_0_2_0 + 0.0271604938271604*G0_1_0_2_1 + 0.32275132275132*G0_1_0_2_2 + 0.0823985890652553*G0_1_1_0_0 + 0.0183068783068782*G0_1_1_0_1 + 0.0148148148148147*G0_1_1_0_2 + 0.0183068783068782*G0_1_1_1_0 + 0.00973544973544976*G0_1_1_1_1 + 0.0248677248677248*G0_1_1_1_2 + 0.0148148148148147*G0_1_1_2_0 + 0.0248677248677248*G0_1_1_2_1 + 0.259611992945325*G0_1_1_2_2; + A[91] = -A[181] - 0.0426102292768957*G0_0_0_0_0 - 0.000705467372133971*G0_0_0_0_1 - 0.0237037037037036*G0_0_0_0_2 - 0.000705467372133972*G0_0_0_1_0 + 0.0578483245149913*G0_0_0_1_1 + 0.00282186948853615*G0_0_0_1_2 - 0.0237037037037036*G0_0_0_2_0 + 0.00282186948853615*G0_0_0_2_1 - 0.0143915343915344*G0_0_0_2_2 - 0.00056437389770758*G0_1_0_0_0 - 0.000423280423280419*G0_1_0_0_1 + 0.000282186948853573*G0_1_0_0_2 - 0.000423280423280418*G0_1_0_1_0 + 0.000423280423280443*G0_1_0_1_2 + 0.000282186948853574*G0_1_0_2_0 + 0.000423280423280441*G0_1_0_2_1; + A[168] = -A[176] + 0.316049382716048*G0_0_0_0_0 + 0.158024691358024*G0_0_0_0_1 + 0.101587301587301*G0_0_0_0_2 + 0.158024691358024*G0_0_0_1_0 + 0.654673721340386*G0_0_0_1_1 + 0.056437389770723*G0_0_0_1_2 + 0.101587301587301*G0_0_0_2_0 + 0.056437389770723*G0_0_0_2_1 + 0.0902998236331565*G0_0_0_2_2 - 0.0225749559082893*G0_1_0_0_0 - 0.0451499118165781*G0_1_0_0_1 - 0.0112874779541446*G0_1_0_0_2 - 0.0451499118165781*G0_1_0_1_0 + 0.248324514991182*G0_1_0_1_1 - 0.0451499118165783*G0_1_0_1_2 - 0.0112874779541446*G0_1_0_2_0 - 0.0451499118165783*G0_1_0_2_1 - 0.0225749559082891*G0_1_0_2_2; + A[18] = -A[26] - 0.0663139329805993*G0_0_0_0_0 - 0.0204585537918871*G0_0_0_0_1 - 0.0331569664902996*G0_0_0_0_2 - 0.0204585537918871*G0_0_0_1_0 - 0.244091710758377*G0_0_0_1_1 - 0.0204585537918871*G0_0_0_1_2 - 0.0331569664902996*G0_0_0_2_0 - 0.0204585537918871*G0_0_0_2_1 - 0.0663139329805993*G0_0_0_2_2; + A[38] = -A[35] - 0.0663139329805993*G0_1_1_0_0 - 0.0331569664902997*G0_1_1_0_1 - 0.020458553791887*G0_1_1_0_2 - 0.0331569664902997*G0_1_1_1_0 - 0.0663139329805996*G0_1_1_1_1 - 0.0204585537918871*G0_1_1_1_2 - 0.020458553791887*G0_1_1_2_0 - 0.0204585537918871*G0_1_1_2_1 - 0.244091710758376*G0_1_1_2_2; + A[116] = -A[108] - 0.0519223985890648*G0_0_0_0_0 + 0.0107231040564374*G0_0_0_0_1 - 0.0801410934744263*G0_0_0_0_2 + 0.0107231040564374*G0_0_0_1_0 + 0.0338624338624344*G0_0_0_1_1 + 0.00902998236331586*G0_0_0_1_2 - 0.0801410934744263*G0_0_0_2_0 + 0.00902998236331586*G0_0_0_2_1 - 0.0812698412698409*G0_0_0_2_2 + 0.0293474426807747*G0_1_0_0_0 + 0.00169312169312156*G0_1_0_0_1 + 0.00169312169312156*G0_1_0_1_0 - 0.00169312169312157*G0_1_0_1_2 - 0.00169312169312158*G0_1_0_2_1 - 0.0293474426807759*G0_1_0_2_2; + A[219] = A[149] + 0.04514991181658*G0_0_1_0_0 - 0.0383774250440912*G0_0_1_0_1 + 0.0158024691358025*G0_0_1_0_2 - 0.0383774250440912*G0_0_1_1_0 - 0.0270899470899466*G0_0_1_1_1 - 0.00225749559082862*G0_0_1_1_2 + 0.0158024691358025*G0_0_1_2_0 - 0.00225749559082862*G0_0_1_2_1 + 0.0316049382716057*G0_0_1_2_2 - 0.04514991181658*G0_1_0_0_0 + 0.0383774250440912*G0_1_0_0_1 - 0.0158024691358025*G0_1_0_0_2 + 0.0383774250440912*G0_1_0_1_0 + 0.0270899470899466*G0_1_0_1_1 + 0.00225749559082861*G0_1_0_1_2 - 0.0158024691358025*G0_1_0_2_0 + 0.00225749559082861*G0_1_0_2_1 - 0.0316049382716057*G0_1_0_2_2; + A[103] = A[219] + 0.316049382716048*G0_0_0_0_0 - 0.0067724867724867*G0_0_0_0_1 + 0.119647266313932*G0_0_0_0_2 - 0.00677248677248669*G0_0_0_1_0 + 0.0902998236331571*G0_0_0_1_1 + 0.0293474426807762*G0_0_0_1_2 + 0.119647266313932*G0_0_0_2_0 + 0.0293474426807762*G0_0_0_2_1 - 0.0135449735449729*G0_0_0_2_2 - 0.0135449735449734*G0_0_1_0_1 + 0.0135449735449734*G0_0_1_0_2 - 0.0135449735449734*G0_0_1_1_0 + 0.0812698412698418*G0_0_1_1_1 + 0.0135449735449734*G0_0_1_2_0 - 0.0812698412698409*G0_0_1_2_2 - 0.0677248677248673*G0_1_0_0_1 + 0.0677248677248675*G0_1_0_0_2 - 0.0677248677248673*G0_1_0_1_0 + 0.0225749559082892*G0_1_0_1_1 + 0.0677248677248675*G0_1_0_2_0 - 0.0225749559082884*G0_1_0_2_2 - 0.316049382716047*G0_1_1_0_0 - 0.119647266313932*G0_1_1_0_1 + 0.0067724867724868*G0_1_1_0_2 - 0.119647266313932*G0_1_1_1_0 + 0.0135449735449735*G0_1_1_1_1 - 0.029347442680776*G0_1_1_1_2 + 0.00677248677248679*G0_1_1_2_0 - 0.029347442680776*G0_1_1_2_1 - 0.0902998236331566*G0_1_1_2_2; + A[57] = -A[103] + 0.35216931216931*G0_0_0_0_0 + 0.189629629629629*G0_0_0_0_2 + 0.352169312169311*G0_0_0_1_1 + 0.189629629629629*G0_0_0_1_2 + 0.189629629629629*G0_0_0_2_0 + 0.189629629629629*G0_0_0_2_1 + 0.162539682539682*G0_0_0_2_2 + 0.0948148148148144*G0_0_1_0_0 + 0.0406349206349206*G0_0_1_0_2 + 0.257354497354498*G0_0_1_1_1 + 0.148994708994709*G0_0_1_1_2 + 0.0406349206349206*G0_0_1_2_0 + 0.148994708994709*G0_0_1_2_1 + 0.0812698412698414*G0_0_1_2_2 + 0.0812698412698409*G0_1_0_0_0 + 0.0767548500881833*G0_1_0_0_2 + 0.27089947089947*G0_1_0_1_1 + 0.112874779541446*G0_1_0_1_2 + 0.0767548500881833*G0_1_0_2_0 + 0.112874779541446*G0_1_0_2_1 + 0.0812698412698412*G0_1_0_2_2 - 0.0812698412698397*G0_1_1_0_0 - 0.0338624338624334*G0_1_1_0_1 + 0.00225749559082905*G0_1_1_0_2 - 0.0338624338624334*G0_1_1_1_0 + 0.0948148148148152*G0_1_1_1_1 + 0.0744973544973541*G0_1_1_1_2 + 0.00225749559082905*G0_1_1_2_0 + 0.0744973544973541*G0_1_1_2_1 + 0.0361199294532627*G0_1_1_2_2; + A[201] = A[103] - 0.0451499118165784*G0_0_1_0_0 - 0.0158024691358027*G0_0_1_0_1 + 0.0383774250440915*G0_0_1_0_2 - 0.0158024691358027*G0_0_1_1_0 - 0.031604938271606*G0_0_1_1_1 + 0.00225749559082872*G0_0_1_1_2 + 0.0383774250440915*G0_0_1_2_0 + 0.0022574955908287*G0_0_1_2_1 + 0.0270899470899468*G0_0_1_2_2 + 0.0451499118165785*G0_1_0_0_0 + 0.0158024691358027*G0_1_0_0_1 - 0.0383774250440915*G0_1_0_0_2 + 0.0158024691358027*G0_1_0_1_0 + 0.031604938271606*G0_1_0_1_1 - 0.00225749559082872*G0_1_0_1_2 - 0.0383774250440915*G0_1_0_2_0 - 0.00225749559082872*G0_1_0_2_1 - 0.0270899470899468*G0_1_0_2_2; + A[29] = A[27] + 0.062081128747795*G0_0_0_0_0 + 0.0011287477954144*G0_0_0_0_1 + 0.00451499118165777*G0_0_0_0_2 + 0.0011287477954144*G0_0_0_1_0 - 0.00112874779541443*G0_0_0_1_2 + 0.00451499118165776*G0_0_0_2_0 - 0.00112874779541443*G0_0_0_2_1 - 0.0711111111111105*G0_0_0_2_2 - 0.00902998236331549*G0_0_1_0_0 + 0.00902998236331566*G0_0_1_0_2 + 0.00902998236331566*G0_0_1_2_0 - 0.00902998236331553*G0_0_1_2_2; + A[19] = -A[25] + 0.0889594356261019*G0_0_0_0_0 + 0.0125220458553792*G0_0_0_0_1 + 0.0343209876543208*G0_0_0_0_2 + 0.0125220458553792*G0_0_0_1_0 + 0.19647266313933*G0_0_0_1_1 + 0.0223985890652556*G0_0_0_1_2 + 0.0343209876543208*G0_0_0_2_0 + 0.0223985890652556*G0_0_0_2_1 + 0.0861375661375656*G0_0_0_2_2 + 0.00282186948853616*G0_0_1_0_0 - 0.00987654320987646*G0_0_1_0_1 - 0.00987654320987647*G0_0_1_1_0 + 0.00987654320987645*G0_0_1_1_2 + 0.00987654320987646*G0_0_1_2_1 - 0.00282186948853619*G0_0_1_2_2; + A[33] = -A[36] - 0.0169312169312169*G0_1_0_0_0 + 0.00282186948853616*G0_1_0_0_2 + 0.0169312169312168*G0_1_0_1_1 - 0.00282186948853611*G0_1_0_1_2 + 0.00282186948853616*G0_1_0_2_0 - 0.00282186948853611*G0_1_0_2_1 - 0.0702645502645499*G0_1_1_0_0 - 0.0165079365079365*G0_1_1_0_1 - 0.00493827160493826*G0_1_1_0_2 - 0.0165079365079365*G0_1_1_1_0 - 0.0533333333333334*G0_1_1_1_1 - 0.00776014109347444*G0_1_1_1_2 - 0.00493827160493826*G0_1_1_2_0 - 0.00776014109347443*G0_1_1_2_1 - 0.105820105820106*G0_1_1_2_2; + A[41] = -A[33] - 0.00197530864197541*G0_1_0_0_0 - 0.0018342151675485*G0_1_0_0_1 + 0.0136860670194003*G0_1_0_0_2 - 0.0018342151675485*G0_1_0_1_0 + 0.0324514991181659*G0_1_0_1_1 + 0.00888888888888888*G0_1_0_1_2 + 0.0136860670194003*G0_1_0_2_0 + 0.00888888888888888*G0_1_0_2_1 + 0.13121693121693*G0_1_0_2_2; + A[62] = -A[107] + 0.00282186948853607*G0_0_1_0_0 - 0.00987654320987642*G0_0_1_0_2 - 0.00282186948853609*G0_0_1_1_1 + 0.00987654320987656*G0_0_1_1_2 - 0.00987654320987642*G0_0_1_2_0 + 0.00987654320987656*G0_0_1_2_1 + 0.0889594356261017*G0_1_1_0_0 + 0.0343209876543208*G0_1_1_0_1 + 0.0125220458553791*G0_1_1_0_2 + 0.0343209876543208*G0_1_1_1_0 + 0.0861375661375662*G0_1_1_1_1 + 0.0223985890652557*G0_1_1_1_2 + 0.0125220458553791*G0_1_1_2_0 + 0.0223985890652557*G0_1_1_2_1 + 0.196472663139329*G0_1_1_2_2; + A[44] = A[212] + 0.00282186948853608*G0_0_1_0_0 - 0.00987654320987637*G0_0_1_0_2 - 0.00282186948853609*G0_0_1_1_1 + 0.0098765432098766*G0_0_1_1_2 - 0.00987654320987637*G0_0_1_2_0 + 0.00987654320987659*G0_0_1_2_1 - 0.00282186948853608*G0_1_0_0_0 + 0.00987654320987637*G0_1_0_0_2 + 0.00282186948853609*G0_1_0_1_1 - 0.00987654320987659*G0_1_0_1_2 + 0.00987654320987637*G0_1_0_2_0 - 0.00987654320987659*G0_1_0_2_1; + A[172] = -A[52] - 0.0519223985890647*G0_0_0_0_0 + 0.0107231040564374*G0_0_0_0_1 - 0.0801410934744263*G0_0_0_0_2 + 0.0107231040564374*G0_0_0_1_0 + 0.0338624338624344*G0_0_0_1_1 + 0.00902998236331586*G0_0_0_1_2 - 0.0801410934744263*G0_0_0_2_0 + 0.00902998236331586*G0_0_0_2_1 - 0.0812698412698409*G0_0_0_2_2 + 0.0293474426807747*G0_0_1_0_0 + 0.00169312169312156*G0_0_1_0_1 + 0.00169312169312156*G0_0_1_1_0 - 0.00169312169312158*G0_0_1_1_2 - 0.00169312169312158*G0_0_1_2_1 - 0.0293474426807759*G0_0_1_2_2; + A[158] = A[172] + 0.0135449735449734*G0_0_0_0_0 - 0.00564373897707233*G0_0_0_0_1 + 0.0259611992945324*G0_0_0_0_2 - 0.00564373897707233*G0_0_0_1_0 - 0.0225749559082897*G0_0_0_1_1 - 0.0056437389770723*G0_0_0_1_2 + 0.0259611992945324*G0_0_0_2_0 - 0.0056437389770723*G0_0_0_2_1 + 0.0474074074074076*G0_0_0_2_2 + 0.0135449735449735*G0_0_1_0_1 - 0.0135449735449734*G0_0_1_0_2 + 0.0135449735449735*G0_0_1_1_0 - 0.0191887125220461*G0_0_1_1_1 - 0.0135449735449734*G0_0_1_2_0 + 0.0191887125220462*G0_0_1_2_2 + 0.00902998236331543*G0_1_0_0_1 - 0.00902998236331568*G0_1_0_0_2 + 0.00902998236331544*G0_1_0_1_0 - 0.00338624338624441*G0_1_0_1_1 - 0.00902998236331568*G0_1_0_2_0 + 0.00338624338624305*G0_1_0_2_2 - 0.0135449735449739*G0_1_1_0_0 - 0.0259611992945326*G0_1_1_0_1 + 0.00564373897707236*G0_1_1_0_2 - 0.0259611992945326*G0_1_1_1_0 - 0.0474074074074077*G0_1_1_1_1 + 0.00564373897707227*G0_1_1_1_2 + 0.00564373897707236*G0_1_1_2_0 + 0.00564373897707227*G0_1_1_2_1 + 0.0225749559082893*G0_1_1_2_2; + A[155] = -A[158] + 0.0293474426807754*G0_0_1_0_0 + 0.00169312169312164*G0_0_1_0_2 - 0.0293474426807754*G0_0_1_1_1 - 0.00169312169312179*G0_0_1_1_2 + 0.00169312169312164*G0_0_1_2_0 - 0.00169312169312178*G0_0_1_2_1 - 0.0519223985890652*G0_1_1_0_0 - 0.0801410934744263*G0_1_1_0_1 + 0.0107231040564375*G0_1_1_0_2 - 0.0801410934744263*G0_1_1_1_0 - 0.0812698412698401*G0_1_1_1_1 + 0.00902998236331567*G0_1_1_1_2 + 0.0107231040564375*G0_1_1_2_0 + 0.00902998236331566*G0_1_1_2_1 + 0.033862433862434*G0_1_1_2_2; + A[85] = A[155] - 0.0191887125220456*G0_0_1_0_0 + 0.00564373897707247*G0_0_1_0_1 - 0.000564373897707128*G0_0_1_0_2 + 0.00564373897707247*G0_0_1_1_0 + 0.0101587301587298*G0_0_1_1_1 + 0.0011287477954146*G0_0_1_1_2 - 0.00056437389770713*G0_0_1_2_0 + 0.00112874779541459*G0_0_1_2_1 - 0.00338624338624276*G0_0_1_2_2 + 0.0191887125220456*G0_1_0_0_0 - 0.00564373897707249*G0_1_0_0_1 + 0.000564373897707128*G0_1_0_0_2 - 0.00564373897707248*G0_1_0_1_0 - 0.0101587301587299*G0_1_0_1_1 - 0.00112874779541459*G0_1_0_1_2 + 0.00056437389770713*G0_1_0_2_0 - 0.00112874779541459*G0_1_0_2_1 + 0.00338624338624276*G0_1_0_2_2; + A[139] = A[85] + 0.0225749559082893*G0_0_0_0_0 + 0.00564373897707222*G0_0_0_0_1 + 0.00564373897707232*G0_0_0_0_2 + 0.00564373897707222*G0_0_0_1_0 - 0.0135449735449734*G0_0_0_1_1 - 0.0259611992945323*G0_0_0_1_2 + 0.00564373897707232*G0_0_0_2_0 - 0.0259611992945323*G0_0_0_2_1 - 0.0474074074074065*G0_0_0_2_2 + 0.0225749559082896*G0_0_1_0_0 + 0.0135449735449733*G0_0_1_0_1 + 0.00620811287477948*G0_0_1_0_2 + 0.0135449735449733*G0_0_1_1_0 - 0.0237037037037033*G0_0_1_1_1 - 0.0406349206349204*G0_0_1_1_2 + 0.00620811287477948*G0_0_1_2_0 - 0.0406349206349204*G0_0_1_2_1 - 0.0248324514991183*G0_0_1_2_2 + 0.0203174603174601*G0_1_0_0_1 + 0.00507936507936505*G0_1_0_0_2 + 0.0203174603174601*G0_1_0_1_0 - 0.00338624338624387*G0_1_0_1_1 - 0.0338624338624336*G0_1_0_1_2 + 0.00507936507936505*G0_1_0_2_0 - 0.0338624338624336*G0_1_0_2_1 - 0.0474074074074072*G0_1_0_2_2 + 0.0474074074074067*G0_1_1_0_0 + 0.0541798941798937*G0_1_1_0_1 + 0.0541798941798937*G0_1_1_1_0 - 0.054179894179894*G0_1_1_1_2 - 0.054179894179894*G0_1_1_2_1 - 0.0474074074074074*G0_1_1_2_2; + A[130] = -A[85] + 0.0293474426807753*G0_1_0_0_0 + 0.00169312169312164*G0_1_0_0_2 - 0.0293474426807754*G0_1_0_1_1 - 0.00169312169312178*G0_1_0_1_2 + 0.00169312169312164*G0_1_0_2_0 - 0.00169312169312178*G0_1_0_2_1 - 0.0519223985890652*G0_1_1_0_0 - 0.0801410934744263*G0_1_1_0_1 + 0.0107231040564375*G0_1_1_0_2 - 0.0801410934744263*G0_1_1_1_0 - 0.0812698412698402*G0_1_1_1_1 + 0.00902998236331567*G0_1_1_1_2 + 0.0107231040564375*G0_1_1_2_0 + 0.00902998236331566*G0_1_1_2_1 + 0.033862433862434*G0_1_1_2_2; + A[100] = A[130] + 0.221234567901233*G0_0_0_0_0 - 0.0440211640211638*G0_0_0_0_1 + 0.0541798941798937*G0_0_0_0_2 - 0.0440211640211638*G0_0_0_1_0 - 0.085784832451499*G0_0_0_1_1 - 0.0338624338624337*G0_0_0_1_2 + 0.0541798941798937*G0_0_0_2_0 - 0.0338624338624337*G0_0_0_2_1 + 0.0135449735449729*G0_0_0_2_2 - 0.11400352733686*G0_0_1_0_0 - 0.0282186948853615*G0_0_1_0_1 - 0.0327336860670193*G0_0_1_0_2 - 0.0282186948853615*G0_0_1_1_0 - 0.0744973544973545*G0_0_1_1_1 - 0.0327336860670192*G0_0_1_1_2 - 0.0327336860670193*G0_0_1_2_0 - 0.0327336860670192*G0_0_1_2_1 - 0.03047619047619*G0_0_1_2_2 - 0.265255731922398*G0_1_0_0_0 - 0.0169312169312169*G0_1_0_0_1 - 0.0169312169312169*G0_1_0_1_0 - 0.0428924162257494*G0_1_0_1_1 - 0.0304761904761903*G0_1_0_1_2 - 0.0304761904761903*G0_1_0_2_1 - 0.00338624338624376*G0_1_0_2_2 + 0.0767548500881823*G0_1_1_0_0 + 0.0316049382716046*G0_1_1_0_1 - 0.0180599647266315*G0_1_1_0_2 + 0.0316049382716046*G0_1_1_1_0 - 0.0316049382716047*G0_1_1_1_2 - 0.0180599647266315*G0_1_1_2_0 - 0.0316049382716047*G0_1_1_2_1 - 0.0406349206349205*G0_1_1_2_2; + A[12] = -A[139] - 0.216155202821868*G0_0_0_0_0 - 0.00818342151675469*G0_0_0_0_2 + 0.0434567901234567*G0_0_0_1_1 + 0.0115696649029983*G0_0_0_1_2 - 0.00818342151675468*G0_0_0_2_0 + 0.0115696649029983*G0_0_0_2_1 + 0.0135449735449735*G0_0_0_2_2 - 0.221234567901233*G0_0_1_0_0 - 0.0115696649029982*G0_0_1_0_1 - 0.0115696649029982*G0_0_1_1_0 + 0.0321693121693123*G0_0_1_1_1 - 0.0036684303350969*G0_0_1_1_2 - 0.00366843033509689*G0_0_1_2_1 + 0.0248324514991181*G0_0_1_2_2 - 0.224620811287477*G0_1_0_0_0 - 0.000564373897707364*G0_1_0_0_1 - 0.0104409171075836*G0_1_0_0_2 - 0.000564373897707363*G0_1_0_1_0 + 0.0395061728395057*G0_1_0_1_1 + 0.00197530864197522*G0_1_0_1_2 - 0.0104409171075836*G0_1_0_2_0 + 0.00197530864197522*G0_1_0_2_1 + 0.0084656084656081*G0_1_0_2_2 - 0.229700176366842*G0_1_1_0_0 - 0.0138271604938272*G0_1_1_0_1 - 0.000564373897707198*G0_1_1_0_2 - 0.0138271604938272*G0_1_1_1_0 + 0.0270899470899467*G0_1_1_1_1 - 0.01326278659612*G0_1_1_1_2 - 0.000564373897707196*G0_1_1_2_0 - 0.01326278659612*G0_1_1_2_1 + 0.0208818342151674*G0_1_1_2_2; + A[105] = A[7] - 0.322751322751322*G0_0_1_0_0 - 0.0271604938271604*G0_0_1_0_1 - 0.0172839506172839*G0_0_1_0_2 - 0.0271604938271604*G0_0_1_1_0 - 0.00317460317460316*G0_0_1_1_1 - 0.00229276895943561*G0_0_1_1_2 - 0.0172839506172839*G0_0_1_2_0 - 0.00229276895943561*G0_0_1_2_1 - 0.00599647266313909*G0_0_1_2_2 + 0.322751322751322*G0_1_0_0_0 + 0.0271604938271604*G0_1_0_0_1 + 0.0172839506172839*G0_1_0_0_2 + 0.0271604938271604*G0_1_0_1_0 + 0.00317460317460317*G0_1_0_1_1 + 0.00229276895943561*G0_1_0_1_2 + 0.0172839506172839*G0_1_0_2_0 + 0.00229276895943561*G0_1_0_2_1 + 0.00599647266313909*G0_1_0_2_2; + A[10] = A[105] + 0.322751322751322*G0_0_0_0_0 + 0.0171075837742504*G0_0_0_0_1 + 0.0273368606701939*G0_0_0_0_2 + 0.0171075837742504*G0_0_0_1_0 + 0.0758377425044088*G0_0_0_1_1 + 0.0022927689594356*G0_0_0_1_2 + 0.0273368606701939*G0_0_0_2_0 + 0.0022927689594356*G0_0_0_2_1 - 0.0666666666666663*G0_0_0_2_2 - 0.000176366843033476*G0_0_1_0_1 + 0.000176366843033533*G0_0_1_0_2 - 0.000176366843033478*G0_0_1_1_0 + 0.0698412698412695*G0_0_1_1_1 + 0.000176366843033533*G0_0_1_2_0 - 0.0698412698412697*G0_0_1_2_2 - 0.01005291005291*G0_1_0_0_1 + 0.01005291005291*G0_1_0_0_2 - 0.01005291005291*G0_1_0_1_0 + 0.0726631393298055*G0_1_0_1_1 + 0.01005291005291*G0_1_0_2_0 - 0.0726631393298056*G0_1_0_2_2 - 0.322751322751321*G0_1_1_0_0 - 0.0273368606701939*G0_1_1_0_1 - 0.0171075837742504*G0_1_1_0_2 - 0.0273368606701939*G0_1_1_1_0 + 0.0666666666666661*G0_1_1_1_1 - 0.00229276895943569*G0_1_1_1_2 - 0.0171075837742504*G0_1_1_2_0 - 0.0022927689594357*G0_1_1_2_1 - 0.075837742504409*G0_1_1_2_2; + A[150] = A[10] + 0.322751322751321*G0_0_1_0_0 + 0.0172839506172839*G0_0_1_0_1 + 0.0271604938271603*G0_0_1_0_2 + 0.0172839506172839*G0_0_1_1_0 + 0.00599647266313921*G0_0_1_1_1 + 0.0022927689594356*G0_0_1_1_2 + 0.0271604938271603*G0_0_1_2_0 + 0.0022927689594356*G0_0_1_2_1 + 0.00317460317460313*G0_0_1_2_2 - 0.322751322751321*G0_1_0_0_0 - 0.0172839506172839*G0_1_0_0_1 - 0.0271604938271603*G0_1_0_0_2 - 0.0172839506172839*G0_1_0_1_0 - 0.0059964726631392*G0_1_0_1_1 - 0.0022927689594356*G0_1_0_1_2 - 0.0271604938271603*G0_1_0_2_0 - 0.0022927689594356*G0_1_0_2_1 - 0.00317460317460313*G0_1_0_2_2; + A[180] = A[12] + 0.00987654320987654*G0_0_1_0_1 - 0.00987654320987639*G0_0_1_0_2 + 0.00987654320987654*G0_0_1_1_0 - 0.0028218694885362*G0_0_1_1_1 - 0.00987654320987639*G0_0_1_2_0 + 0.0028218694885362*G0_0_1_2_2 - 0.00987654320987654*G0_1_0_0_1 + 0.00987654320987639*G0_1_0_0_2 - 0.00987654320987654*G0_1_0_1_0 + 0.00282186948853621*G0_1_0_1_1 + 0.00987654320987639*G0_1_0_2_0 - 0.00282186948853617*G0_1_0_2_2; + A[173] = -A[181] - 0.0829629629629624*G0_0_0_0_0 - 0.0397883597883595*G0_0_0_0_2 + 0.0795767195767195*G0_0_0_1_1 + 0.00931216931216929*G0_0_0_1_2 - 0.0397883597883595*G0_0_0_2_0 + 0.00931216931216929*G0_0_0_2_1 - 0.0203174603174602*G0_0_0_2_2 + 0.0158024691358027*G0_0_1_0_0 + 0.00902998236331565*G0_0_1_0_1 + 0.00902998236331567*G0_0_1_0_2 + 0.00902998236331565*G0_0_1_1_0 + 0.0248324514991176*G0_0_1_1_1 + 0.00902998236331568*G0_0_1_2_0 + 0.024832451499118*G0_0_1_2_2 + 0.0152380952380951*G0_1_0_0_0 + 0.0031040564373897*G0_1_0_0_1 + 0.0031040564373897*G0_1_0_1_0 + 0.0338624338624334*G0_1_0_1_1 + 0.0081834215167548*G0_1_0_1_2 + 0.00818342151675479*G0_1_0_2_1 + 0.0299118165784829*G0_1_0_2_2 - 0.00451499118165803*G0_1_1_0_0 - 0.00451499118165791*G0_1_1_0_1 - 0.00225749559082892*G0_1_1_0_2 - 0.00451499118165791*G0_1_1_1_0 + 0.00451499118165783*G0_1_1_1_2 - 0.00225749559082892*G0_1_1_2_0 + 0.00451499118165783*G0_1_1_2_1 + 0.00902998236331561*G0_1_1_2_2; + A[170] = -A[173] + 0.0270899470899473*G0_0_1_0_0 + 0.024832451499118*G0_0_1_0_1 + 0.00451499118165784*G0_0_1_0_2 + 0.024832451499118*G0_0_1_1_0 - 0.0767548500881843*G0_0_1_1_1 - 0.00451499118165789*G0_0_1_1_2 + 0.00451499118165784*G0_0_1_2_0 - 0.00451499118165789*G0_0_1_2_1 - 0.0135449735449736*G0_1_1_0_0 - 0.0383774250440917*G0_1_1_0_1 - 0.00451499118165783*G0_1_1_0_2 - 0.0383774250440917*G0_1_1_1_0 - 0.270899470899471*G0_1_1_1_1 + 0.0158024691358024*G0_1_1_1_2 - 0.00451499118165783*G0_1_1_2_0 + 0.0158024691358024*G0_1_1_2_1; + A[86] = A[170] - 0.0135449735449735*G0_0_1_0_0 - 0.0203174603174601*G0_0_1_0_1 - 0.0203174603174601*G0_0_1_1_0 + 0.0677248677248687*G0_0_1_1_1 - 0.00225749559082884*G0_0_1_1_2 - 0.00225749559082885*G0_0_1_2_1 - 0.00902998236331543*G0_0_1_2_2 + 0.0135449735449735*G0_1_0_0_0 + 0.0203174603174601*G0_1_0_0_1 + 0.0203174603174601*G0_1_0_1_0 - 0.0677248677248687*G0_1_0_1_1 + 0.00225749559082884*G0_1_0_1_2 + 0.00225749559082884*G0_1_0_2_1 + 0.00902998236331543*G0_1_0_2_2; + A[138] = A[86] + 0.0451499118165784*G0_0_0_0_0 + 0.0158024691358025*G0_0_0_0_1 + 0.00677248677248677*G0_0_0_0_2 + 0.0158024691358025*G0_0_0_1_0 - 0.135449735449735*G0_0_0_1_1 - 0.0383774250440915*G0_0_0_1_2 + 0.00677248677248677*G0_0_0_2_0 - 0.0383774250440915*G0_0_0_2_1 - 0.0135449735449733*G0_0_0_2_2 + 0.0270899470899471*G0_0_1_0_0 + 0.0225749559082891*G0_0_1_0_1 + 0.00677248677248674*G0_0_1_0_2 + 0.0225749559082891*G0_0_1_1_0 - 0.203174603174603*G0_0_1_1_1 - 0.0225749559082891*G0_0_1_1_2 + 0.00677248677248674*G0_0_1_2_0 - 0.0225749559082891*G0_0_1_2_1 + 0.0270899470899468*G0_0_1_2_2 + 0.00451499118165784*G0_1_0_0_0 + 0.00677248677248677*G0_1_0_0_2 - 0.0677248677248663*G0_1_0_1_1 - 0.0451499118165782*G0_1_0_1_2 + 0.00677248677248678*G0_1_0_2_0 - 0.0451499118165782*G0_1_0_2_1 + 0.004514991181658*G0_1_0_2_2 + 0.0451499118165783*G0_1_1_0_1 + 0.0451499118165783*G0_1_1_1_0 - 0.0451499118165782*G0_1_1_1_2 - 0.0451499118165782*G0_1_1_2_1; + A[51] = -A[173] - 0.0541798941798937*G0_0_0_0_0 - 0.0248324514991179*G0_0_0_0_2 - 0.0406349206349208*G0_0_0_1_1 - 0.0158024691358025*G0_0_0_1_2 - 0.0248324514991179*G0_0_0_2_0 - 0.0158024691358025*G0_0_0_2_1 - 0.0270899470899466*G0_0_0_2_2 + 0.0135449735449735*G0_0_1_0_1 - 0.00225749559082882*G0_0_1_0_2 + 0.0135449735449735*G0_0_1_1_0 - 0.0135449735449735*G0_0_1_1_2 - 0.00225749559082881*G0_0_1_2_0 - 0.0135449735449735*G0_0_1_2_1 + 0.00451499118165775*G0_0_1_2_2 - 0.0225749559082892*G0_1_0_0_0 + 0.00225749559082892*G0_1_0_0_1 - 0.00225749559082896*G0_1_0_0_2 + 0.00225749559082892*G0_1_0_1_0 - 0.00225749559082895*G0_1_0_1_2 - 0.00225749559082896*G0_1_0_2_0 - 0.00225749559082895*G0_1_0_2_1 + 0.0270899470899469*G0_1_0_2_2 + 0.00451499118165789*G0_1_1_0_0 - 0.00451499118165783*G0_1_1_0_2 - 0.00451499118165783*G0_1_1_2_0 + 0.00451499118165791*G0_1_1_2_2; + A[50] = -A[170] + 0.0135449735449734*G0_0_0_0_0 + 0.00451499118165777*G0_0_0_0_1 + 0.0383774250440914*G0_0_0_0_2 + 0.00451499118165777*G0_0_0_1_0 - 0.0158024691358024*G0_0_0_1_2 + 0.0383774250440914*G0_0_0_2_0 - 0.0158024691358024*G0_0_0_2_1 + 0.270899470899469*G0_0_0_2_2 + 0.00902998236331568*G0_0_1_0_0 - 0.0203174603174603*G0_0_1_0_2 - 0.203174603174604*G0_0_1_1_1 - 0.0902998236331568*G0_0_1_1_2 - 0.0203174603174603*G0_0_1_2_0 - 0.0902998236331568*G0_0_1_2_1 - 0.12641975308642*G0_0_1_2_2; + A[99] = -A[50] - 0.284444444444443*G0_0_0_0_0 + 0.024832451499118*G0_0_0_0_1 + 0.024832451499118*G0_0_0_1_0 + 0.0722398589065254*G0_0_0_1_1 + 0.027089947089947*G0_0_0_1_2 + 0.027089947089947*G0_0_0_2_1 + 0.311534391534389*G0_0_0_2_2 + 0.347654320987652*G0_0_1_0_0 + 0.0632098765432094*G0_0_1_0_1 + 0.0632098765432096*G0_0_1_0_2 + 0.0632098765432094*G0_0_1_1_0 - 0.0270899470899473*G0_0_1_1_1 - 0.0361199294532627*G0_0_1_1_2 + 0.0632098765432096*G0_0_1_2_0 - 0.0361199294532627*G0_0_1_2_1 - 0.0270899470899472*G0_0_1_2_2 + 0.600493827160492*G0_1_0_0_0 + 0.0383774250440916*G0_1_0_0_1 + 0.0383774250440916*G0_1_0_0_2 + 0.0383774250440916*G0_1_0_1_0 + 0.0857848324514983*G0_1_0_1_1 + 0.0451499118165782*G0_1_0_1_2 + 0.0383774250440916*G0_1_0_2_0 + 0.0451499118165782*G0_1_0_2_1 + 0.0857848324514979*G0_1_0_2_2 - 0.284444444444443*G0_1_1_0_0 + 0.0248324514991181*G0_1_1_0_2 + 0.311534391534391*G0_1_1_1_1 + 0.0270899470899469*G0_1_1_1_2 + 0.0248324514991181*G0_1_1_2_0 + 0.0270899470899469*G0_1_1_2_1 + 0.0722398589065249*G0_1_1_2_2; + A[146] = -A[138] + 0.397319223985889*G0_0_0_0_0 + 0.0744973544973542*G0_0_0_0_1 + 0.0586948853615517*G0_0_0_0_2 + 0.0744973544973542*G0_0_0_1_0 + 0.203174603174603*G0_0_0_1_1 + 0.00451499118165783*G0_0_0_1_2 + 0.0586948853615517*G0_0_0_2_0 + 0.00451499118165782*G0_0_0_2_1 + 0.00451499118165783*G0_0_0_2_2 + 0.126419753086419*G0_1_0_0_0 + 0.0902998236331565*G0_1_0_0_1 + 0.0203174603174603*G0_1_0_0_2 + 0.0902998236331565*G0_1_0_1_0 + 0.203174603174602*G0_1_0_1_1 + 0.0203174603174603*G0_1_0_2_0 - 0.00902998236331556*G0_1_0_2_2; + A[54] = A[138] - 0.00902998236331583*G0_0_1_0_0 - 0.00225749559082891*G0_0_1_0_1 - 0.0022574955908289*G0_0_1_1_0 + 0.067724867724868*G0_0_1_1_1 - 0.0203174603174602*G0_0_1_1_2 - 0.0203174603174602*G0_0_1_2_1 - 0.0135449735449734*G0_0_1_2_2 + 0.00902998236331584*G0_1_0_0_0 + 0.00225749559082891*G0_1_0_0_1 + 0.00225749559082891*G0_1_0_1_0 - 0.067724867724868*G0_1_0_1_1 + 0.0203174603174602*G0_1_0_1_2 + 0.0203174603174602*G0_1_0_2_1 + 0.0135449735449734*G0_1_0_2_2; + A[174] = -A[54] + 0.397319223985889*G0_0_0_0_0 + 0.0744973544973542*G0_0_0_0_1 + 0.0586948853615517*G0_0_0_0_2 + 0.0744973544973542*G0_0_0_1_0 + 0.203174603174603*G0_0_0_1_1 + 0.00451499118165784*G0_0_0_1_2 + 0.0586948853615517*G0_0_0_2_0 + 0.00451499118165783*G0_0_0_2_1 + 0.00451499118165783*G0_0_0_2_2 + 0.126419753086419*G0_0_1_0_0 + 0.0902998236331565*G0_0_1_0_1 + 0.0203174603174603*G0_0_1_0_2 + 0.0902998236331565*G0_0_1_1_0 + 0.203174603174602*G0_0_1_1_1 + 0.0203174603174603*G0_0_1_2_0 - 0.00902998236331555*G0_0_1_2_2; + A[141] = A[99] + 0.248324514991181*G0_0_1_0_0 - 0.0451499118165781*G0_0_1_0_1 - 0.0451499118165783*G0_0_1_0_2 - 0.0451499118165781*G0_0_1_1_0 - 0.0225749559082893*G0_0_1_1_1 - 0.0112874779541447*G0_0_1_1_2 - 0.0451499118165783*G0_0_1_2_0 - 0.0112874779541447*G0_0_1_2_1 - 0.0225749559082893*G0_0_1_2_2 - 0.248324514991181*G0_1_0_0_0 + 0.0451499118165781*G0_1_0_0_1 + 0.0451499118165783*G0_1_0_0_2 + 0.0451499118165781*G0_1_0_1_0 + 0.0225749559082893*G0_1_0_1_1 + 0.0112874779541447*G0_1_0_1_2 + 0.0451499118165783*G0_1_0_2_0 + 0.0112874779541447*G0_1_0_2_1 + 0.0225749559082893*G0_1_0_2_2; + A[95] = A[54] - 0.0586948853615516*G0_0_0_0_0 - 0.0203174603174602*G0_0_0_0_1 - 0.0203174603174602*G0_0_0_1_0 + 0.135449735449735*G0_0_0_1_1 + 0.00902998236331568*G0_0_0_1_2 + 0.00902998236331568*G0_0_0_2_1 - 0.257354497354495*G0_0_0_2_2 - 0.0135449735449734*G0_0_1_0_1 + 0.0135449735449735*G0_0_1_0_2 - 0.0135449735449734*G0_0_1_1_0 + 0.148994708994708*G0_0_1_1_1 + 0.0135449735449735*G0_0_1_2_0 - 0.148994708994708*G0_0_1_2_2 - 0.0158024691358024*G0_1_0_0_1 + 0.0158024691358024*G0_1_0_0_2 - 0.0158024691358024*G0_1_0_1_0 + 0.230264550264549*G0_1_0_1_1 + 0.0158024691358024*G0_1_0_2_0 - 0.230264550264549*G0_1_0_2_2 + 0.0586948853615515*G0_1_1_0_0 + 0.0203174603174602*G0_1_1_0_2 + 0.257354497354496*G0_1_1_1_1 - 0.00902998236331554*G0_1_1_1_2 + 0.0203174603174602*G0_1_1_2_0 - 0.00902998236331552*G0_1_1_2_1 - 0.135449735449734*G0_1_1_2_2; + A[78] = -A[86] + 0.0135449735449734*G0_0_0_0_0 + 0.00451499118165777*G0_0_0_0_1 + 0.0383774250440914*G0_0_0_0_2 + 0.00451499118165777*G0_0_0_1_0 - 0.0158024691358024*G0_0_0_1_2 + 0.0383774250440914*G0_0_0_2_0 - 0.0158024691358024*G0_0_0_2_1 + 0.270899470899469*G0_0_0_2_2 + 0.00902998236331568*G0_1_0_0_0 - 0.0203174603174603*G0_1_0_0_2 - 0.203174603174604*G0_1_0_1_1 - 0.0902998236331568*G0_1_0_1_2 - 0.0203174603174603*G0_1_0_2_0 - 0.0902998236331568*G0_1_0_2_1 - 0.12641975308642*G0_1_0_2_2; + A[123] = -A[78] + 0.00902998236331582*G0_1_0_0_0 - 0.0203174603174603*G0_1_0_0_1 - 0.0203174603174603*G0_1_0_1_0 - 0.12641975308642*G0_1_0_1_1 - 0.0902998236331568*G0_1_0_1_2 - 0.0902998236331568*G0_1_0_2_1 - 0.203174603174602*G0_1_0_2_2 + 0.0135449735449736*G0_1_1_0_0 + 0.0383774250440916*G0_1_1_0_1 + 0.00451499118165785*G0_1_1_0_2 + 0.0383774250440916*G0_1_1_1_0 + 0.270899470899471*G0_1_1_1_1 - 0.0158024691358025*G0_1_1_1_2 + 0.00451499118165785*G0_1_1_2_0 - 0.0158024691358025*G0_1_1_2_1; + A[98] = -A[95] + 0.12641975308642*G0_0_1_0_0 + 0.0203174603174604*G0_0_1_0_1 + 0.0902998236331567*G0_0_1_0_2 + 0.0203174603174604*G0_0_1_1_0 - 0.0090299823633152*G0_0_1_1_1 + 0.0902998236331567*G0_0_1_2_0 + 0.203174603174602*G0_0_1_2_2 + 0.397319223985889*G0_1_1_0_0 + 0.0586948853615518*G0_1_1_0_1 + 0.0744973544973542*G0_1_1_0_2 + 0.0586948853615518*G0_1_1_1_0 + 0.00451499118165812*G0_1_1_1_1 + 0.00451499118165801*G0_1_1_1_2 + 0.0744973544973542*G0_1_1_2_0 + 0.00451499118165802*G0_1_1_2_1 + 0.203174603174603*G0_1_1_2_2; + A[22] = A[106] - 0.00522045855379163*G0_0_1_0_0 + 0.000105820105820098*G0_0_1_0_1 + 0.000105820105820097*G0_0_1_1_0 - 0.000105820105820133*G0_0_1_1_2 - 0.000105820105820133*G0_0_1_2_1 + 0.00522045855379173*G0_0_1_2_2 + 0.00522045855379163*G0_1_0_0_0 - 0.000105820105820098*G0_1_0_0_1 - 0.000105820105820098*G0_1_0_1_0 + 0.000105820105820133*G0_1_0_1_2 + 0.000105820105820133*G0_1_0_2_1 - 0.00522045855379174*G0_1_0_2_2; + A[9] = A[135] + 0.608112874779539*G0_0_1_0_0 + 0.039506172839506*G0_0_1_0_1 + 0.039506172839506*G0_0_1_0_2 + 0.039506172839506*G0_0_1_1_0 + 0.00423280423280417*G0_0_1_1_1 + 0.00211640211640208*G0_0_1_1_2 + 0.039506172839506*G0_0_1_2_0 + 0.00211640211640208*G0_0_1_2_1 + 0.00423280423280418*G0_0_1_2_2 - 0.608112874779539*G0_1_0_0_0 - 0.039506172839506*G0_1_0_0_1 - 0.039506172839506*G0_1_0_0_2 - 0.039506172839506*G0_1_0_1_0 - 0.00423280423280417*G0_1_0_1_1 - 0.00211640211640208*G0_1_0_1_2 - 0.039506172839506*G0_1_0_2_0 - 0.00211640211640208*G0_1_0_2_1 - 0.00423280423280418*G0_1_0_2_2; + A[90] = A[9] + 0.608112874779539*G0_0_0_0_0 + 0.0331569664902997*G0_0_0_0_1 + 0.0458553791887122*G0_0_0_0_2 + 0.0331569664902997*G0_0_0_1_0 + 0.0352733686067017*G0_0_0_1_1 + 0.00211640211640209*G0_0_0_1_2 + 0.0458553791887123*G0_0_0_2_0 + 0.00211640211640209*G0_0_0_2_1 - 0.0268077601410933*G0_0_0_2_2 - 0.00634920634920636*G0_0_1_0_1 + 0.00634920634920625*G0_0_1_0_2 - 0.00634920634920636*G0_0_1_1_0 + 0.0310405643738975*G0_0_1_1_1 + 0.00634920634920625*G0_0_1_2_0 - 0.0310405643738976*G0_0_1_2_2 - 0.00634920634920631*G0_1_0_0_1 + 0.00634920634920631*G0_1_0_0_2 - 0.00634920634920631*G0_1_0_1_0 + 0.0310405643738975*G0_1_0_1_1 + 0.00634920634920631*G0_1_0_2_0 - 0.0310405643738976*G0_1_0_2_2 - 0.608112874779539*G0_1_1_0_0 - 0.0458553791887123*G0_1_1_0_1 - 0.0331569664902997*G0_1_1_0_2 - 0.0458553791887123*G0_1_1_1_0 + 0.0268077601410933*G0_1_1_1_1 - 0.00211640211640211*G0_1_1_1_2 - 0.0331569664902997*G0_1_1_2_0 - 0.00211640211640211*G0_1_1_2_1 - 0.0352733686067018*G0_1_1_2_2; + A[6] = A[90] - 0.608112874779538*G0_0_1_0_0 - 0.039506172839506*G0_0_1_0_1 - 0.0395061728395059*G0_0_1_0_2 - 0.039506172839506*G0_0_1_1_0 - 0.00423280423280418*G0_0_1_1_1 - 0.00211640211640209*G0_0_1_1_2 - 0.0395061728395059*G0_0_1_2_0 - 0.00211640211640209*G0_0_1_2_1 - 0.00423280423280412*G0_0_1_2_2 + 0.608112874779538*G0_1_0_0_0 + 0.039506172839506*G0_1_0_0_1 + 0.0395061728395059*G0_1_0_0_2 + 0.039506172839506*G0_1_0_1_0 + 0.00423280423280418*G0_1_0_1_1 + 0.00211640211640209*G0_1_0_1_2 + 0.0395061728395059*G0_1_0_2_0 + 0.00211640211640209*G0_1_0_2_1 + 0.00423280423280412*G0_1_0_2_2; + A[34] = -A[37] + 0.00282186948853607*G0_1_0_0_0 - 0.00987654320987642*G0_1_0_0_2 - 0.00282186948853609*G0_1_0_1_1 + 0.00987654320987656*G0_1_0_1_2 - 0.00987654320987642*G0_1_0_2_0 + 0.00987654320987656*G0_1_0_2_1 + 0.0889594356261017*G0_1_1_0_0 + 0.0343209876543208*G0_1_1_0_1 + 0.0125220458553791*G0_1_1_0_2 + 0.0343209876543208*G0_1_1_1_0 + 0.0861375661375662*G0_1_1_1_1 + 0.0223985890652557*G0_1_1_1_2 + 0.0125220458553791*G0_1_1_2_0 + 0.0223985890652557*G0_1_1_2_1 + 0.196472663139329*G0_1_1_2_2; + A[96] = A[144] - 0.248324514991181*G0_0_0_0_0 - 0.0564373897707228*G0_0_0_0_1 + 0.14673721340388*G0_0_0_0_2 - 0.0564373897707228*G0_0_0_1_0 - 0.203174603174602*G0_0_0_1_1 + 0.0112874779541446*G0_0_0_1_2 + 0.14673721340388*G0_0_0_2_0 + 0.0112874779541446*G0_0_0_2_1 + 0.24832451499118*G0_0_0_2_2 - 0.101587301587301*G0_0_1_0_1 + 0.101587301587301*G0_0_1_0_2 - 0.101587301587301*G0_0_1_1_0 - 0.225749559082891*G0_0_1_1_1 + 0.101587301587301*G0_0_1_2_0 + 0.225749559082891*G0_0_1_2_2 - 0.101587301587301*G0_1_0_0_1 + 0.101587301587301*G0_1_0_0_2 - 0.101587301587301*G0_1_0_1_0 - 0.225749559082891*G0_1_0_1_1 + 0.101587301587301*G0_1_0_2_0 + 0.225749559082891*G0_1_0_2_2 + 0.248324514991181*G0_1_1_0_0 - 0.146737213403879*G0_1_1_0_1 + 0.0564373897707229*G0_1_1_0_2 - 0.146737213403879*G0_1_1_1_0 - 0.24832451499118*G0_1_1_1_1 - 0.0112874779541446*G0_1_1_1_2 + 0.0564373897707229*G0_1_1_2_0 - 0.0112874779541446*G0_1_1_2_1 + 0.203174603174602*G0_1_1_2_2; + A[81] = A[95] + 0.00902998236331553*G0_0_1_0_0 + 0.00225749559082894*G0_0_1_0_2 + 0.0135449735449731*G0_0_1_1_1 + 0.0203174603174601*G0_0_1_1_2 + 0.00225749559082894*G0_0_1_2_0 + 0.0203174603174601*G0_0_1_2_1 - 0.0677248677248676*G0_0_1_2_2 - 0.00902998236331552*G0_1_0_0_0 - 0.00225749559082894*G0_1_0_0_2 - 0.0135449735449732*G0_1_0_1_1 - 0.0203174603174602*G0_1_0_1_2 - 0.00225749559082894*G0_1_0_2_0 - 0.0203174603174602*G0_1_0_2_1 + 0.0677248677248676*G0_1_0_2_2; + A[126] = -A[81] + 0.12641975308642*G0_1_0_0_0 + 0.0203174603174604*G0_1_0_0_1 + 0.0902998236331567*G0_1_0_0_2 + 0.0203174603174604*G0_1_0_1_0 - 0.00902998236331521*G0_1_0_1_1 + 0.0902998236331567*G0_1_0_2_0 + 0.203174603174602*G0_1_0_2_2 + 0.397319223985889*G0_1_1_0_0 + 0.0586948853615518*G0_1_1_0_1 + 0.0744973544973542*G0_1_1_0_2 + 0.0586948853615518*G0_1_1_1_0 + 0.00451499118165812*G0_1_1_1_1 + 0.00451499118165802*G0_1_1_1_2 + 0.0744973544973542*G0_1_1_2_0 + 0.00451499118165802*G0_1_1_2_1 + 0.203174603174603*G0_1_1_2_2; + A[156] = A[100] - 0.141093474426808*G0_0_1_0_0 + 0.0169312169312169*G0_0_1_0_1 + 0.0338624338624337*G0_0_1_0_2 + 0.0169312169312169*G0_0_1_1_0 + 0.0124162257495595*G0_0_1_1_1 + 0.00169312169312176*G0_0_1_1_2 + 0.0338624338624337*G0_0_1_2_0 + 0.00169312169312176*G0_0_1_2_1 + 0.0237037037037037*G0_0_1_2_2 + 0.141093474426808*G0_1_0_0_0 - 0.0169312169312169*G0_1_0_0_1 - 0.0338624338624337*G0_1_0_0_2 - 0.0169312169312169*G0_1_0_1_0 - 0.0124162257495595*G0_1_0_1_1 - 0.00169312169312175*G0_1_0_1_2 - 0.0338624338624337*G0_1_0_2_0 - 0.00169312169312177*G0_1_0_2_1 - 0.0237037037037037*G0_1_0_2_2; + A[142] = A[156] - 0.158024691358023*G0_0_0_0_0 + 0.0316049382716048*G0_0_0_0_1 - 0.0485361552028215*G0_0_0_0_2 + 0.0316049382716048*G0_0_0_1_0 + 0.0677248677248678*G0_0_0_1_1 + 0.00790123456790121*G0_0_0_1_2 - 0.0485361552028215*G0_0_0_2_0 + 0.00790123456790121*G0_0_0_2_1 - 0.0609523809523805*G0_0_0_2_2 + 0.00338624338624337*G0_0_1_0_1 - 0.00338624338624334*G0_0_1_0_2 + 0.00338624338624337*G0_0_1_1_0 + 0.0586948853615517*G0_0_1_1_1 - 0.00338624338624334*G0_0_1_2_0 - 0.0586948853615517*G0_0_1_2_2 - 0.0135449735449734*G0_1_0_0_1 + 0.0135449735449736*G0_1_0_0_2 - 0.0135449735449734*G0_1_0_1_0 + 0.0474074074074076*G0_1_0_1_1 + 0.0135449735449736*G0_1_0_2_0 - 0.0474074074074073*G0_1_0_2_2 + 0.158024691358024*G0_1_1_0_0 + 0.0485361552028216*G0_1_1_0_1 - 0.0316049382716048*G0_1_1_0_2 + 0.0485361552028216*G0_1_1_1_0 + 0.0609523809523806*G0_1_1_1_1 - 0.00790123456790132*G0_1_1_1_2 - 0.0316049382716048*G0_1_1_2_0 - 0.00790123456790132*G0_1_1_2_1 - 0.0677248677248675*G0_1_1_2_2; + A[210] = A[14] - 0.00141093474426808*G0_0_1_0_1 + 0.00141093474426808*G0_0_1_0_2 - 0.00141093474426808*G0_0_1_1_0 + 0.00395061728395066*G0_0_1_1_1 + 0.00451499118165784*G0_0_1_1_2 + 0.00141093474426808*G0_0_1_2_0 + 0.00451499118165782*G0_0_1_2_1 - 0.0129805996472664*G0_0_1_2_2 + 0.00141093474426808*G0_1_0_0_1 - 0.00141093474426808*G0_1_0_0_2 + 0.00141093474426808*G0_1_0_1_0 - 0.00395061728395065*G0_1_0_1_1 - 0.00451499118165783*G0_1_0_1_2 - 0.00141093474426808*G0_1_0_2_0 - 0.00451499118165782*G0_1_0_2_1 + 0.0129805996472664*G0_1_0_2_2; + A[17] = -0.000476190476190455*G0_0_1_0_0 - 0.00231922398589065*G0_0_1_0_1 - 0.00231922398589064*G0_0_1_0_2 - 0.00231922398589065*G0_0_1_1_0 - 0.0231922398589066*G0_0_1_1_1 - 0.000238095238095249*G0_0_1_1_2 - 0.00231922398589064*G0_0_1_2_0 - 0.000238095238095249*G0_0_1_2_1 - 0.0231922398589064*G0_0_1_2_2; + A[2] = -A[17] + 0.022716049382716*G0_0_1_0_0 - 0.0020811287477954*G0_0_1_0_2 - 0.0227160493827161*G0_0_1_1_1 + 0.0020811287477954*G0_0_1_1_2 - 0.0020811287477954*G0_0_1_2_0 + 0.0020811287477954*G0_0_1_2_1 + 0.0231922398589064*G0_1_1_0_0 + 0.00231922398589064*G0_1_1_0_1 + 0.000238095238095254*G0_1_1_0_2 + 0.00231922398589064*G0_1_1_1_0 + 0.000476190476190448*G0_1_1_1_1 + 0.00231922398589066*G0_1_1_1_2 + 0.000238095238095254*G0_1_1_2_0 + 0.00231922398589066*G0_1_1_2_1 + 0.0231922398589066*G0_1_1_2_2; + A[134] = -A[89] + 0.112874779541445*G0_1_0_0_0 + 0.180599647266314*G0_1_0_0_2 - 0.112874779541446*G0_1_0_1_1 - 0.180599647266313*G0_1_0_1_2 + 0.180599647266314*G0_1_0_2_0 - 0.180599647266313*G0_1_0_2_1 - 0.33410934744268*G0_1_1_0_0 - 0.241552028218694*G0_1_1_0_1 - 0.0790123456790122*G0_1_1_0_2 - 0.241552028218694*G0_1_1_1_0 - 0.446984126984125*G0_1_1_1_1 - 0.259611992945325*G0_1_1_1_2 - 0.0790123456790122*G0_1_1_2_0 - 0.259611992945325*G0_1_1_2_1 - 0.361199294532627*G0_1_1_2_2; + A[186] = A[134] - 0.857848324514987*G0_0_0_0_0 - 0.0812698412698411*G0_0_0_0_1 - 0.234779541446207*G0_0_0_0_2 - 0.0812698412698411*G0_0_0_1_0 - 0.144479717813051*G0_0_0_1_1 - 0.225749559082892*G0_0_0_1_2 - 0.234779541446207*G0_0_0_2_0 - 0.225749559082892*G0_0_0_2_1 - 0.352169312169313*G0_0_0_2_2 - 0.108359788359789*G0_0_1_0_0 - 0.0406349206349205*G0_0_1_0_1 - 0.234779541446207*G0_0_1_0_2 - 0.0406349206349205*G0_0_1_1_0 - 0.14447971781305*G0_0_1_1_1 - 0.266384479717812*G0_0_1_1_2 - 0.234779541446207*G0_0_1_2_0 - 0.266384479717812*G0_0_1_2_1 - 1.10165784832451*G0_0_1_2_2 - 0.370229276895941*G0_1_0_0_0 - 0.0948148148148142*G0_1_0_0_1 - 0.234779541446208*G0_1_0_0_2 - 0.0948148148148142*G0_1_0_1_0 - 0.144479717813051*G0_1_0_1_1 - 0.212204585537918*G0_1_0_1_2 - 0.234779541446208*G0_1_0_2_0 - 0.212204585537918*G0_1_0_2_1 - 0.839788359788359*G0_1_0_2_2 + 0.731428571428568*G0_1_1_0_0 + 0.171569664902997*G0_1_1_0_1 + 0.171569664902997*G0_1_1_1_0 - 0.171569664902997*G0_1_1_1_2 - 0.171569664902997*G0_1_1_2_1 - 0.731428571428568*G0_1_1_2_2; + A[218] = A[134] + 0.0812698412698408*G0_0_1_0_0 - 0.00225749559082887*G0_0_1_0_1 + 0.124162257495591*G0_0_1_0_2 - 0.00225749559082887*G0_0_1_1_0 - 0.0316049382716046*G0_0_1_1_1 - 0.0564373897707227*G0_0_1_1_2 + 0.124162257495591*G0_0_1_2_0 - 0.0564373897707227*G0_0_1_2_1 - 0.18059964726631*G0_0_1_2_2 - 0.0812698412698408*G0_1_0_0_0 + 0.00225749559082887*G0_1_0_0_1 - 0.124162257495591*G0_1_0_0_2 + 0.00225749559082887*G0_1_0_1_0 + 0.0316049382716046*G0_1_0_1_1 + 0.0564373897707227*G0_1_0_1_2 - 0.124162257495591*G0_1_0_2_0 + 0.0564373897707227*G0_1_0_2_1 + 0.18059964726631*G0_1_0_2_2; + A[215] = -A[218] + 0.112874779541445*G0_0_1_0_0 + 0.180599647266314*G0_0_1_0_2 - 0.112874779541446*G0_0_1_1_1 - 0.180599647266313*G0_0_1_1_2 + 0.180599647266314*G0_0_1_2_0 - 0.180599647266313*G0_0_1_2_1 - 0.33410934744268*G0_1_1_0_0 - 0.241552028218694*G0_1_1_0_1 - 0.0790123456790122*G0_1_1_0_2 - 0.241552028218694*G0_1_1_1_0 - 0.446984126984125*G0_1_1_1_1 - 0.259611992945325*G0_1_1_1_2 - 0.0790123456790122*G0_1_1_2_0 - 0.259611992945325*G0_1_1_2_1 - 0.361199294532626*G0_1_1_2_2; + A[69] = A[139] - 0.00338624338624445*G0_0_1_0_0 + 0.00112874779541432*G0_0_1_0_1 - 0.000564373897707302*G0_0_1_0_2 + 0.00112874779541432*G0_0_1_1_0 + 0.0101587301587296*G0_0_1_1_1 + 0.00564373897707215*G0_0_1_1_2 - 0.000564373897707302*G0_0_1_2_0 + 0.00564373897707214*G0_0_1_2_1 - 0.0191887125220461*G0_0_1_2_2 + 0.00338624338624445*G0_1_0_0_0 - 0.00112874779541432*G0_1_0_0_1 + 0.000564373897707305*G0_1_0_0_2 - 0.00112874779541432*G0_1_0_1_0 - 0.0101587301587296*G0_1_0_1_1 - 0.00564373897707214*G0_1_0_1_2 + 0.000564373897707306*G0_1_0_2_0 - 0.00564373897707213*G0_1_0_2_1 + 0.0191887125220461*G0_1_0_2_2; + A[94] = A[69] - 0.0135449735449737*G0_0_0_0_0 - 0.000564373897707215*G0_0_0_0_1 - 0.00564373897707238*G0_0_0_0_2 - 0.000564373897707213*G0_0_0_1_0 - 0.0225749559082893*G0_0_0_1_1 - 0.0248324514991183*G0_0_0_1_2 - 0.00564373897707238*G0_0_0_2_0 - 0.0248324514991183*G0_0_0_2_1 + 0.0135449735449723*G0_0_0_2_2 - 0.0338624338624342*G0_0_1_1_1 + 0.0338624338624335*G0_0_1_2_2 + 0.00169312169312179*G0_1_0_0_1 - 0.0016931216931217*G0_1_0_0_2 + 0.00169312169312179*G0_1_0_1_0 - 0.00451499118165807*G0_1_0_1_1 - 0.0016931216931217*G0_1_0_2_0 + 0.00451499118165763*G0_1_0_2_2 + 0.013544973544975*G0_1_1_0_0 + 0.00564373897707248*G0_1_1_0_1 + 0.000564373897707341*G0_1_1_0_2 + 0.00564373897707248*G0_1_1_1_0 - 0.0135449735449735*G0_1_1_1_1 + 0.0248324514991181*G0_1_1_1_2 + 0.000564373897707341*G0_1_1_2_0 + 0.0248324514991181*G0_1_1_2_1 + 0.022574955908289*G0_1_1_2_2; + A[66] = A[94] + 0.00338624338624387*G0_0_1_0_0 + 0.000564373897707402*G0_0_1_0_1 - 0.00112874779541452*G0_0_1_0_2 + 0.000564373897707402*G0_0_1_1_0 + 0.0191887125220465*G0_0_1_1_1 - 0.00564373897707197*G0_0_1_1_2 - 0.00112874779541453*G0_0_1_2_0 - 0.00564373897707197*G0_0_1_2_1 - 0.0101587301587297*G0_0_1_2_2 - 0.00338624338624386*G0_1_0_0_0 - 0.000564373897707402*G0_1_0_0_1 + 0.00112874779541453*G0_1_0_0_2 - 0.000564373897707402*G0_1_0_1_0 - 0.0191887125220465*G0_1_0_1_1 + 0.005643738977072*G0_1_0_1_2 + 0.00112874779541453*G0_1_0_2_0 + 0.005643738977072*G0_1_0_2_1 + 0.0101587301587298*G0_1_0_2_2; + A[48] = -A[56] + 0.112874779541446*G0_0_0_0_0 + 0.101587301587301*G0_0_0_0_1 + 0.112874779541446*G0_0_0_0_2 + 0.101587301587301*G0_0_0_1_0 + 0.406349206349206*G0_0_0_1_1 + 0.203174603174603*G0_0_0_1_2 + 0.112874779541446*G0_0_0_2_0 + 0.203174603174603*G0_0_0_2_1 + 0.338624338624337*G0_0_0_2_2 + 0.0225749559082892*G0_1_0_0_0 + 0.0451499118165781*G0_1_0_0_1 + 0.0112874779541446*G0_1_0_0_2 + 0.045149911816578*G0_1_0_1_0 - 0.248324514991182*G0_1_0_1_1 + 0.0451499118165783*G0_1_0_1_2 + 0.0112874779541446*G0_1_0_2_0 + 0.0451499118165783*G0_1_0_2_1 + 0.0225749559082891*G0_1_0_2_2; + A[39] = A[41] - 0.00959435626102287*G0_1_0_0_0 + 0.00959435626102287*G0_1_0_0_1 + 0.00959435626102287*G0_1_0_1_0 - 0.00959435626102308*G0_1_0_1_1 + 0.0338624338624337*G0_1_1_0_0 + 0.00479717813051139*G0_1_1_0_1 - 0.0019753086419753*G0_1_1_0_2 + 0.00479717813051139*G0_1_1_1_0 - 0.043456790123457*G0_1_1_1_1 + 0.00197530864197526*G0_1_1_1_2 - 0.0019753086419753*G0_1_1_2_0 + 0.00197530864197526*G0_1_1_2_1; + A[42] = -A[39] - 0.000564373897707342*G0_1_0_0_0 + 0.000282186948853624*G0_1_0_0_1 - 0.000423280423280415*G0_1_0_0_2 + 0.000282186948853624*G0_1_0_1_0 + 0.000423280423280514*G0_1_0_1_2 - 0.000423280423280417*G0_1_0_2_0 + 0.000423280423280516*G0_1_0_2_1 - 0.0426102292768958*G0_1_1_0_0 - 0.0237037037037036*G0_1_1_0_1 - 0.000705467372133972*G0_1_1_0_2 - 0.0237037037037036*G0_1_1_1_0 - 0.0143915343915342*G0_1_1_1_1 + 0.00282186948853623*G0_1_1_1_2 - 0.000705467372133973*G0_1_1_2_0 + 0.00282186948853623*G0_1_1_2_1 + 0.0578483245149913*G0_1_1_2_2; + A[182] = A[42] + 0.0129805996472662*G0_0_1_0_0 - 0.0045149911816578*G0_0_1_0_1 - 0.00141093474426807*G0_0_1_0_2 - 0.0045149911816578*G0_0_1_1_0 - 0.00395061728395056*G0_0_1_1_1 + 0.00141093474426815*G0_0_1_1_2 - 0.00141093474426807*G0_0_1_2_0 + 0.00141093474426816*G0_0_1_2_1 - 0.0129805996472662*G0_1_0_0_0 + 0.0045149911816578*G0_1_0_0_1 + 0.00141093474426807*G0_1_0_0_2 + 0.0045149911816578*G0_1_0_1_0 + 0.00395061728395056*G0_1_0_1_1 - 0.00141093474426815*G0_1_0_1_2 + 0.00141093474426807*G0_1_0_2_0 - 0.00141093474426816*G0_1_0_2_1; + A[137] = A[39] - 0.0135449735449735*G0_0_1_0_0 + 0.00479717813051142*G0_0_1_0_1 + 0.000987654320987658*G0_0_1_0_2 + 0.00479717813051143*G0_0_1_1_0 + 0.00395061728395061*G0_0_1_1_1 - 0.000987654320987653*G0_0_1_1_2 + 0.000987654320987658*G0_0_1_2_0 - 0.000987654320987652*G0_0_1_2_1 + 0.0135449735449735*G0_1_0_0_0 - 0.00479717813051142*G0_1_0_0_1 - 0.000987654320987658*G0_1_0_0_2 - 0.00479717813051142*G0_1_0_1_0 - 0.00395061728395061*G0_1_0_1_1 + 0.000987654320987652*G0_1_0_1_2 - 0.000987654320987658*G0_1_0_2_0 + 0.000987654320987652*G0_1_0_2_1; + A[43] = A[42] - 0.00902998236331552*G0_1_0_0_0 + 0.00902998236331562*G0_1_0_0_1 + 0.00902998236331562*G0_1_0_1_0 - 0.00902998236331573*G0_1_0_1_1 + 0.0620811287477951*G0_1_1_0_0 + 0.00451499118165774*G0_1_1_0_1 + 0.00112874779541435*G0_1_1_0_2 + 0.00451499118165774*G0_1_1_1_0 - 0.0711111111111111*G0_1_1_1_1 - 0.00112874779541467*G0_1_1_1_2 + 0.00112874779541435*G0_1_1_2_0 - 0.00112874779541466*G0_1_1_2_1; + A[197] = A[182] - 0.00902998236331552*G0_0_1_0_0 + 0.00902998236331562*G0_0_1_0_1 + 0.00902998236331562*G0_0_1_1_0 - 0.00902998236331574*G0_0_1_1_1 + 0.0620811287477951*G0_1_1_0_0 + 0.00451499118165774*G0_1_1_0_1 + 0.00112874779541435*G0_1_1_0_2 + 0.00451499118165774*G0_1_1_1_0 - 0.0711111111111111*G0_1_1_1_1 - 0.00112874779541467*G0_1_1_1_2 + 0.00112874779541435*G0_1_1_2_0 - 0.00112874779541467*G0_1_1_2_1; + A[167] = A[137] + 0.00959435626102286*G0_0_1_0_0 - 0.00959435626102287*G0_0_1_0_1 - 0.00959435626102288*G0_0_1_1_0 + 0.00959435626102307*G0_0_1_1_1 - 0.0338624338624337*G0_1_1_0_0 - 0.00479717813051139*G0_1_1_0_1 + 0.0019753086419753*G0_1_1_0_2 - 0.00479717813051139*G0_1_1_1_0 + 0.043456790123457*G0_1_1_1_1 - 0.00197530864197526*G0_1_1_1_2 + 0.0019753086419753*G0_1_1_2_0 - 0.00197530864197526*G0_1_1_2_1; + A[47] = -A[167] - 0.00197530864197541*G0_0_1_0_0 - 0.00183421516754851*G0_0_1_0_1 + 0.0136860670194002*G0_0_1_0_2 - 0.00183421516754851*G0_0_1_1_0 + 0.0324514991181659*G0_0_1_1_1 + 0.00888888888888888*G0_0_1_1_2 + 0.0136860670194002*G0_0_1_2_0 + 0.00888888888888888*G0_0_1_2_1 + 0.13121693121693*G0_0_1_2_2; + A[92] = -A[47] - 0.0169312169312169*G0_0_1_0_0 + 0.00282186948853616*G0_0_1_0_2 + 0.0169312169312168*G0_0_1_1_1 - 0.00282186948853611*G0_0_1_1_2 + 0.00282186948853616*G0_0_1_2_0 - 0.00282186948853611*G0_0_1_2_1 - 0.0702645502645499*G0_1_1_0_0 - 0.0165079365079365*G0_1_1_0_1 - 0.00493827160493826*G0_1_1_0_2 - 0.0165079365079365*G0_1_1_1_0 - 0.0533333333333334*G0_1_1_1_1 - 0.00776014109347443*G0_1_1_1_2 - 0.00493827160493826*G0_1_1_2_0 - 0.00776014109347443*G0_1_1_2_1 - 0.105820105820106*G0_1_1_2_2; + A[121] = A[91] - 0.0338624338624336*G0_0_0_0_0 + 0.00197530864197531*G0_0_0_0_1 - 0.0047971781305114*G0_0_0_0_2 + 0.00197530864197531*G0_0_0_1_0 - 0.00197530864197528*G0_0_0_1_2 - 0.00479717813051139*G0_0_0_2_0 - 0.00197530864197528*G0_0_0_2_1 + 0.0434567901234566*G0_0_0_2_2 + 0.00959435626102303*G0_1_0_0_0 - 0.00959435626102288*G0_1_0_0_2 - 0.00959435626102288*G0_1_0_2_0 + 0.00959435626102282*G0_1_0_2_2; + A[76] = -A[121] - 0.00197530864197541*G0_1_0_0_0 + 0.0136860670194003*G0_1_0_0_1 - 0.00183421516754853*G0_1_0_0_2 + 0.0136860670194003*G0_1_0_1_0 + 0.131216931216931*G0_1_0_1_1 + 0.00888888888888886*G0_1_0_1_2 - 0.00183421516754853*G0_1_0_2_0 + 0.00888888888888886*G0_1_0_2_1 + 0.0324514991181655*G0_1_0_2_2; + A[136] = -A[76] - 0.07026455026455*G0_0_0_0_0 - 0.00493827160493828*G0_0_0_0_1 - 0.0165079365079364*G0_0_0_0_2 - 0.00493827160493828*G0_0_0_1_0 - 0.105820105820106*G0_0_0_1_1 - 0.00776014109347441*G0_0_0_1_2 - 0.0165079365079364*G0_0_0_2_0 - 0.00776014109347441*G0_0_0_2_1 - 0.0533333333333331*G0_0_0_2_2 - 0.0169312169312168*G0_1_0_0_0 + 0.00282186948853617*G0_1_0_0_1 + 0.00282186948853617*G0_1_0_1_0 - 0.00282186948853613*G0_1_0_1_2 - 0.00282186948853613*G0_1_0_2_1 + 0.0169312169312168*G0_1_0_2_2; + A[166] = -A[46] - 0.0663139329805993*G0_0_0_0_0 - 0.0204585537918871*G0_0_0_0_1 - 0.0331569664902996*G0_0_0_0_2 - 0.0204585537918871*G0_0_0_1_0 - 0.244091710758377*G0_0_0_1_1 - 0.0204585537918871*G0_0_0_1_2 - 0.0331569664902996*G0_0_0_2_0 - 0.0204585537918871*G0_0_0_2_1 - 0.0663139329805993*G0_0_0_2_2; + A[206] = -A[198] - 0.334109347442679*G0_0_0_0_0 - 0.0790123456790121*G0_0_0_0_1 - 0.241552028218694*G0_0_0_0_2 - 0.0790123456790121*G0_0_0_1_0 - 0.361199294532627*G0_0_0_1_1 - 0.259611992945325*G0_0_0_1_2 - 0.241552028218694*G0_0_0_2_0 - 0.259611992945325*G0_0_0_2_1 - 0.446984126984125*G0_0_0_2_2 + 0.112874779541446*G0_1_0_0_0 + 0.180599647266313*G0_1_0_0_1 + 0.180599647266313*G0_1_0_1_0 - 0.180599647266313*G0_1_0_1_2 - 0.180599647266313*G0_1_0_2_1 - 0.112874779541446*G0_1_0_2_2; + A[178] = A[206] + 0.081269841269841*G0_0_1_0_0 + 0.12416225749559*G0_0_1_0_1 - 0.00225749559082905*G0_0_1_0_2 + 0.12416225749559*G0_0_1_1_0 - 0.180599647266313*G0_0_1_1_1 - 0.0564373897707231*G0_0_1_1_2 - 0.00225749559082906*G0_0_1_2_0 - 0.0564373897707231*G0_0_1_2_1 - 0.0316049382716051*G0_0_1_2_2 - 0.081269841269841*G0_1_0_0_0 - 0.12416225749559*G0_1_0_0_1 + 0.00225749559082906*G0_1_0_0_2 - 0.12416225749559*G0_1_0_1_0 + 0.180599647266313*G0_1_0_1_1 + 0.0564373897707231*G0_1_0_1_2 + 0.00225749559082906*G0_1_0_2_0 + 0.0564373897707231*G0_1_0_2_1 + 0.0316049382716051*G0_1_0_2_2; + A[0] = A[16] + 0.248324514991181*G0_0_0_0_0 + 0.0109347442680776*G0_0_0_0_2 - 0.24832451499118*G0_0_0_1_1 - 0.0109347442680775*G0_0_0_1_2 + 0.0109347442680776*G0_0_0_2_0 - 0.0109347442680775*G0_0_0_2_1 + 0.261816578483244*G0_0_1_0_0 + 0.0176807760141093*G0_0_1_0_1 + 0.0176807760141093*G0_0_1_0_2 + 0.0176807760141093*G0_0_1_1_0 + 0.0134920634920634*G0_0_1_1_1 + 0.0067460317460317*G0_0_1_1_2 + 0.0176807760141093*G0_0_1_2_0 + 0.0067460317460317*G0_0_1_2_1 + 0.0134920634920634*G0_0_1_2_2 + 0.261816578483244*G0_1_0_0_0 + 0.0176807760141093*G0_1_0_0_1 + 0.0176807760141093*G0_1_0_0_2 + 0.0176807760141093*G0_1_0_1_0 + 0.0134920634920634*G0_1_0_1_1 + 0.0067460317460317*G0_1_0_1_2 + 0.0176807760141093*G0_1_0_2_0 + 0.0067460317460317*G0_1_0_2_1 + 0.0134920634920634*G0_1_0_2_2 + 0.261816578483244*G0_1_1_0_0 + 0.0176807760141093*G0_1_1_0_1 + 0.0176807760141093*G0_1_1_0_2 + 0.0176807760141093*G0_1_1_1_0 + 0.0134920634920634*G0_1_1_1_1 + 0.0067460317460317*G0_1_1_1_2 + 0.0176807760141093*G0_1_1_2_0 + 0.0067460317460317*G0_1_1_2_1 + 0.0134920634920634*G0_1_1_2_2; + A[58] = -A[178] - 0.334109347442679*G0_0_0_0_0 - 0.0790123456790121*G0_0_0_0_1 - 0.241552028218694*G0_0_0_0_2 - 0.0790123456790121*G0_0_0_1_0 - 0.361199294532627*G0_0_0_1_1 - 0.259611992945325*G0_0_0_1_2 - 0.241552028218694*G0_0_0_2_0 - 0.259611992945325*G0_0_0_2_1 - 0.446984126984125*G0_0_0_2_2 + 0.112874779541446*G0_0_1_0_0 + 0.180599647266313*G0_0_1_0_1 + 0.180599647266313*G0_0_1_1_0 - 0.180599647266313*G0_0_1_1_2 - 0.180599647266313*G0_0_1_2_1 - 0.112874779541446*G0_0_1_2_2; + A[28] = 0.0581305114638445*G0_0_0_0_0 - 0.00564373897707229*G0_0_0_0_1 + 0.0392239858906524*G0_0_0_0_2 - 0.00564373897707229*G0_0_0_1_0 - 0.239858906525572*G0_0_0_1_1 - 0.0155202821869487*G0_0_0_1_2 + 0.0392239858906524*G0_0_0_2_0 - 0.0155202821869487*G0_0_0_2_1 + 0.0609523809523807*G0_0_0_2_2 - 0.00282186948853619*G0_0_1_0_0 + 0.00987654320987643*G0_0_1_0_1 + 0.00987654320987643*G0_0_1_1_0 - 0.00987654320987648*G0_0_1_1_2 - 0.00987654320987648*G0_0_1_2_1 + 0.00282186948853625*G0_0_1_2_2; + A[131] = -A[86] + 0.0270899470899473*G0_1_0_0_0 + 0.024832451499118*G0_1_0_0_1 + 0.00451499118165785*G0_1_0_0_2 + 0.024832451499118*G0_1_0_1_0 - 0.0767548500881843*G0_1_0_1_1 - 0.0045149911816579*G0_1_0_1_2 + 0.00451499118165785*G0_1_0_2_0 - 0.0045149911816579*G0_1_0_2_1 - 0.0135449735449736*G0_1_1_0_0 - 0.0383774250440917*G0_1_1_0_1 - 0.00451499118165783*G0_1_1_0_2 - 0.0383774250440917*G0_1_1_1_0 - 0.270899470899471*G0_1_1_1_1 + 0.0158024691358024*G0_1_1_1_2 - 0.00451499118165783*G0_1_1_2_0 + 0.0158024691358024*G0_1_1_2_1; + A[84] = -A[131] + 0.00451499118165787*G0_0_0_0_0 - 0.00451499118165775*G0_0_0_0_1 - 0.00451499118165775*G0_0_0_1_0 + 0.00451499118165771*G0_0_0_1_1 - 0.0225749559082889*G0_0_1_0_0 - 0.00225749559082892*G0_0_1_0_1 + 0.00225749559082894*G0_0_1_0_2 - 0.00225749559082892*G0_0_1_1_0 + 0.0270899470899465*G0_0_1_1_1 - 0.00225749559082897*G0_0_1_1_2 + 0.00225749559082894*G0_0_1_2_0 - 0.00225749559082897*G0_0_1_2_1 - 0.00225749559082884*G0_1_0_0_1 + 0.0135449735449736*G0_1_0_0_2 - 0.00225749559082883*G0_1_0_1_0 + 0.00451499118165731*G0_1_0_1_1 - 0.0135449735449734*G0_1_0_1_2 + 0.0135449735449736*G0_1_0_2_0 - 0.0135449735449734*G0_1_0_2_1 - 0.0541798941798937*G0_1_1_0_0 - 0.024832451499118*G0_1_1_0_1 - 0.024832451499118*G0_1_1_1_0 - 0.0270899470899477*G0_1_1_1_1 - 0.0158024691358024*G0_1_1_1_2 - 0.0158024691358024*G0_1_1_2_1 - 0.0406349206349205*G0_1_1_2_2; + A[129] = -A[84] + 0.0767548500881833*G0_1_0_0_0 - 0.0248324514991179*G0_1_0_0_1 + 0.00451499118165789*G0_1_0_0_2 - 0.0248324514991179*G0_1_0_1_0 - 0.027089947089947*G0_1_0_1_1 - 0.00451499118165766*G0_1_0_1_2 + 0.00451499118165789*G0_1_0_2_0 - 0.00451499118165766*G0_1_0_2_1 - 0.194144620811286*G0_1_1_0_0 - 0.0632098765432094*G0_1_1_0_1 + 0.0203174603174603*G0_1_1_0_2 - 0.0632098765432094*G0_1_1_1_0 - 0.0406349206349204*G0_1_1_1_1 - 0.0090299823633156*G0_1_1_1_2 + 0.0203174603174603*G0_1_1_2_0 - 0.0090299823633156*G0_1_1_2_1; + A[143] = A[129] + 0.0677248677248678*G0_0_1_0_0 - 0.0203174603174601*G0_0_1_0_1 - 0.00225749559082886*G0_0_1_0_2 - 0.0203174603174601*G0_0_1_1_0 - 0.0135449735449734*G0_0_1_1_1 - 0.00225749559082886*G0_0_1_2_0 - 0.0090299823633157*G0_0_1_2_2 - 0.0677248677248678*G0_1_0_0_0 + 0.0203174603174601*G0_1_0_0_1 + 0.00225749559082886*G0_1_0_0_2 + 0.0203174603174601*G0_1_0_1_0 + 0.0135449735449734*G0_1_0_1_1 + 0.00225749559082886*G0_1_0_2_0 + 0.0090299823633157*G0_1_0_2_2; + A[74] = A[214] + 0.047407407407407*G0_0_1_0_0 + 0.0372486772486767*G0_0_1_0_1 + 0.0507936507936506*G0_0_1_0_2 + 0.0372486772486767*G0_0_1_1_0 + 0.0812698412698409*G0_0_1_1_1 - 0.0677248677248673*G0_0_1_1_2 + 0.0507936507936506*G0_0_1_2_0 - 0.0677248677248673*G0_0_1_2_1 - 0.169312169312169*G0_0_1_2_2 - 0.047407407407407*G0_1_0_0_0 - 0.0372486772486767*G0_1_0_0_1 - 0.0507936507936506*G0_1_0_0_2 - 0.0372486772486767*G0_1_0_1_0 - 0.0812698412698409*G0_1_0_1_1 + 0.0677248677248673*G0_1_0_1_2 - 0.0507936507936506*G0_1_0_2_0 + 0.0677248677248673*G0_1_0_2_1 + 0.169312169312169*G0_1_0_2_2; + A[199] = A[74] + 0.142222222222222*G0_0_0_0_0 + 0.0643386243386242*G0_0_0_0_1 + 0.335238095238094*G0_0_0_0_2 + 0.0643386243386242*G0_0_0_1_0 + 0.27089947089947*G0_0_0_1_1 + 0.342010582010581*G0_0_0_1_2 + 0.335238095238094*G0_0_0_2_0 + 0.342010582010581*G0_0_0_2_1 + 1.35449735449735*G0_0_0_2_2 - 0.013544973544973*G0_0_1_0_1 + 0.0135449735449739*G0_0_1_0_2 - 0.013544973544973*G0_0_1_1_0 - 0.240423280423279*G0_0_1_1_1 + 0.0135449735449739*G0_0_1_2_0 + 0.240423280423281*G0_0_1_2_2 - 0.0270899470899466*G0_1_0_0_1 + 0.0270899470899474*G0_1_0_0_2 - 0.0270899470899466*G0_1_0_1_0 + 0.0101587301587318*G0_1_0_1_1 + 0.0270899470899474*G0_1_0_2_0 - 0.0101587301587281*G0_1_0_2_2 - 0.142222222222221*G0_1_1_0_0 - 0.335238095238093*G0_1_1_0_1 - 0.0643386243386239*G0_1_1_0_2 - 0.335238095238093*G0_1_1_1_0 - 1.35449735449735*G0_1_1_1_1 - 0.34201058201058*G0_1_1_1_2 - 0.0643386243386239*G0_1_1_2_0 - 0.34201058201058*G0_1_1_2_1 - 0.270899470899469*G0_1_1_2_2; + A[117] = A[199] - 0.0744973544973546*G0_0_0_0_0 - 0.162539682539682*G0_0_0_0_2 + 0.0744973544973539*G0_0_0_1_1 + 0.162539682539682*G0_0_0_1_2 - 0.162539682539682*G0_0_0_2_0 + 0.162539682539682*G0_0_0_2_1 + 0.220105820105819*G0_0_1_0_0 + 0.0948148148148144*G0_0_1_0_1 + 0.159153439153438*G0_0_1_0_2 + 0.0948148148148144*G0_0_1_1_0 + 0.511322751322749*G0_0_1_1_1 + 0.426666666666665*G0_0_1_1_2 + 0.159153439153438*G0_0_1_2_0 + 0.426666666666665*G0_0_1_2_1 + 0.650158730158727*G0_0_1_2_2 + 0.436825396825395*G0_1_0_0_0 + 0.0948148148148143*G0_1_0_0_1 + 0.264126984126983*G0_1_0_0_2 + 0.0948148148148143*G0_1_0_1_0 + 0.294603174603172*G0_1_0_1_1 + 0.32169312169312*G0_1_0_1_2 + 0.264126984126983*G0_1_0_2_0 + 0.32169312169312*G0_1_0_2_1 + 0.650158730158726*G0_1_0_2_2 - 0.406349206349204*G0_1_1_0_0 + 0.0948148148148145*G0_1_1_0_1 + 0.0914285714285713*G0_1_1_0_2 + 0.0948148148148146*G0_1_1_1_0 + 1.13777777777777*G0_1_1_1_1 + 0.494391534391532*G0_1_1_1_2 + 0.0914285714285713*G0_1_1_2_0 + 0.494391534391532*G0_1_1_2_1 + 0.650158730158727*G0_1_1_2_2; + A[202] = A[199] + 0.054179894179894*G0_0_0_0_0 - 0.0203174603174604*G0_0_0_0_1 - 0.0203174603174604*G0_0_0_1_0 - 0.0135449735449745*G0_0_0_1_1 - 0.101587301587301*G0_0_1_0_0 + 0.0270899470899469*G0_0_1_0_1 - 0.0101587301587302*G0_0_1_0_2 + 0.0270899470899469*G0_0_1_1_0 + 0.419894179894177*G0_0_1_1_1 + 0.247195767195766*G0_0_1_1_2 - 0.0101587301587301*G0_0_1_2_0 + 0.247195767195766*G0_0_1_2_1 + 0.270899470899469*G0_0_1_2_2 + 0.0270899470899469*G0_1_0_0_0 + 0.0812698412698404*G0_1_0_0_1 + 0.0270899470899469*G0_1_0_0_2 + 0.0812698412698404*G0_1_0_1_0 + 0.250582010582007*G0_1_0_1_1 + 0.176084656084655*G0_1_0_1_2 + 0.0270899470899469*G0_1_0_2_0 + 0.176084656084655*G0_1_0_2_1 + 0.270899470899468*G0_1_0_2_2 + 0.0880423280423269*G0_1_1_0_0 + 0.206560846560845*G0_1_1_0_1 + 0.027089947089947*G0_1_1_0_2 + 0.206560846560845*G0_1_1_1_0 + 1.14455026455026*G0_1_1_1_1 + 0.375873015873014*G0_1_1_1_2 + 0.027089947089947*G0_1_1_2_0 + 0.375873015873014*G0_1_1_2_1 + 0.291216931216929*G0_1_1_2_2; + A[163] = A[199] + 0.304761904761903*G0_0_0_0_0 + 0.0270899470899468*G0_0_0_0_1 - 0.0101587301587305*G0_0_0_0_2 + 0.0270899470899467*G0_0_0_1_0 - 0.474074074074072*G0_0_0_1_1 - 0.0778835978835977*G0_0_0_1_2 - 0.0101587301587304*G0_0_0_2_0 - 0.0778835978835977*G0_0_0_2_1 - 0.216719576719577*G0_0_0_2_2 - 0.0406349206349213*G0_0_1_0_0 - 0.169312169312169*G0_0_1_0_1 - 0.0101587301587303*G0_0_1_0_2 - 0.169312169312169*G0_0_1_1_0 - 0.474074074074072*G0_0_1_1_1 + 0.118518518518518*G0_0_1_1_2 - 0.0101587301587303*G0_0_1_2_0 + 0.118518518518518*G0_0_1_2_1 + 0.128677248677248*G0_0_1_2_2 - 0.0744973544973546*G0_1_0_0_0 - 0.0507936507936509*G0_1_0_0_1 - 0.0101587301587305*G0_1_0_0_2 - 0.0507936507936509*G0_1_0_1_0 - 0.474074074074072*G0_1_0_1_1 - 0.0101587301587305*G0_1_0_2_0 + 0.162539682539681*G0_1_0_2_2 - 0.203174603174602*G0_1_1_0_0 - 0.169312169312169*G0_1_1_0_1 - 0.169312169312169*G0_1_1_1_0 + 0.169312169312169*G0_1_1_1_2 + 0.169312169312169*G0_1_1_2_1 + 0.203174603174602*G0_1_1_2_2; + A[205] = A[163] - 0.0812698412698406*G0_0_1_0_0 + 0.0677248677248675*G0_0_1_0_1 - 0.0372486772486773*G0_0_1_0_2 + 0.0677248677248675*G0_0_1_1_0 + 0.169312169312169*G0_0_1_1_1 - 0.0507936507936505*G0_0_1_1_2 - 0.0372486772486773*G0_0_1_2_0 - 0.0507936507936506*G0_0_1_2_1 - 0.0474074074074074*G0_0_1_2_2 + 0.0812698412698406*G0_1_0_0_0 - 0.0677248677248676*G0_1_0_0_1 + 0.0372486772486773*G0_1_0_0_2 - 0.0677248677248676*G0_1_0_1_0 - 0.169312169312169*G0_1_0_1_1 + 0.0507936507936505*G0_1_0_1_2 + 0.0372486772486773*G0_1_0_2_0 + 0.0507936507936506*G0_1_0_2_1 + 0.0474074074074074*G0_1_0_2_2; + A[164] = A[202] - 0.108359788359788*G0_0_0_0_0 - 0.0169312169312168*G0_0_0_0_1 - 0.128677248677248*G0_0_0_0_2 - 0.0169312169312168*G0_0_0_1_0 + 0.0338624338624344*G0_0_0_1_1 + 0.0338624338624342*G0_0_0_1_2 - 0.128677248677248*G0_0_0_2_0 + 0.0338624338624342*G0_0_0_2_1 - 0.209947089947088*G0_0_0_2_2 - 0.0237037037037035*G0_0_1_0_1 + 0.0237037037037035*G0_0_1_0_2 - 0.0237037037037034*G0_0_1_1_0 + 0.0914285714285713*G0_0_1_1_1 + 0.0237037037037035*G0_0_1_2_0 - 0.0914285714285701*G0_0_1_2_2 - 0.0270899470899466*G0_1_0_0_1 + 0.0270899470899472*G0_1_0_0_2 - 0.0270899470899466*G0_1_0_1_0 + 0.0101587301587314*G0_1_0_1_1 + 0.0270899470899472*G0_1_0_2_0 - 0.0101587301587287*G0_1_0_2_2 + 0.108359788359789*G0_1_1_0_0 + 0.128677248677248*G0_1_1_0_1 + 0.0169312169312168*G0_1_1_0_2 + 0.128677248677248*G0_1_1_1_0 + 0.209947089947089*G0_1_1_1_1 - 0.0338624338624336*G0_1_1_1_2 + 0.0169312169312168*G0_1_1_2_0 - 0.0338624338624336*G0_1_1_2_1 - 0.0338624338624332*G0_1_1_2_2; + A[72] = A[117] - 0.0135449735449732*G0_0_0_0_0 - 0.0203174603174603*G0_0_0_0_1 - 0.0203174603174603*G0_0_0_1_0 + 0.0541798941798933*G0_0_0_1_1 - 0.264126984126982*G0_0_1_0_0 - 0.101587301587301*G0_0_1_0_1 - 0.176084656084655*G0_0_1_0_2 - 0.101587301587301*G0_0_1_1_0 + 0.0270899470899464*G0_0_1_1_1 - 0.0270899470899473*G0_0_1_1_2 - 0.176084656084655*G0_0_1_2_0 - 0.0270899470899473*G0_0_1_2_1 - 0.27089947089947*G0_0_1_2_2 - 0.433439153439153*G0_1_0_0_0 - 0.0474074074074075*G0_1_0_0_1 - 0.247195767195766*G0_1_0_0_2 - 0.0474074074074075*G0_1_0_1_0 + 0.155767195767194*G0_1_0_1_1 + 0.0101587301587297*G0_1_0_1_2 - 0.247195767195766*G0_1_0_2_0 + 0.0101587301587297*G0_1_0_2_1 - 0.27089947089947*G0_1_0_2_2 + 0.460529100529098*G0_1_1_0_0 + 0.0778835978835974*G0_1_1_0_1 - 0.0474074074074074*G0_1_1_0_2 + 0.0778835978835974*G0_1_1_1_0 + 0.216719576719575*G0_1_1_1_1 + 0.0101587301587299*G0_1_1_1_2 - 0.0474074074074074*G0_1_1_2_0 + 0.0101587301587299*G0_1_1_2_1 - 0.25058201058201*G0_1_1_2_2; + A[187] = A[117] + 0.169312169312169*G0_0_1_0_0 - 0.0507936507936505*G0_0_1_0_1 + 0.0677248677248674*G0_0_1_0_2 - 0.0507936507936505*G0_0_1_1_0 - 0.0474074074074073*G0_0_1_1_1 - 0.0372486772486772*G0_0_1_1_2 + 0.0677248677248674*G0_0_1_2_0 - 0.0372486772486771*G0_0_1_2_1 - 0.0812698412698413*G0_0_1_2_2 - 0.169312169312169*G0_1_0_0_0 + 0.0507936507936505*G0_1_0_0_1 - 0.0677248677248674*G0_1_0_0_2 + 0.0507936507936505*G0_1_0_1_0 + 0.0474074074074073*G0_1_0_1_1 + 0.0372486772486772*G0_1_0_1_2 - 0.0677248677248674*G0_1_0_2_0 + 0.0372486772486772*G0_1_0_2_1 + 0.0812698412698413*G0_1_0_2_2; + A[160] = A[164] + 0.890582010582007*G0_0_0_0_0 + 0.308994708994708*G0_0_0_0_1 + 0.146455026455026*G0_0_0_0_2 + 0.308994708994708*G0_0_0_1_0 + 0.890582010582007*G0_0_0_1_1 + 0.146455026455026*G0_0_0_1_2 + 0.146455026455026*G0_0_0_2_0 + 0.146455026455026*G0_0_0_2_1 + 0.0753439153439145*G0_0_0_2_2 + 0.104550264550264*G0_0_1_0_0 + 0.154497354497354*G0_0_1_0_1 + 0.00338624338624331*G0_0_1_0_2 + 0.154497354497354*G0_0_1_1_0 + 0.786031746031742*G0_0_1_1_1 + 0.143068783068782*G0_0_1_1_2 + 0.0033862433862433*G0_0_1_2_0 + 0.143068783068782*G0_0_1_2_1 + 0.037671957671957*G0_0_1_2_2 + 0.0232804232804231*G0_1_0_0_0 + 0.154497354497354*G0_1_0_0_1 + 0.154497354497354*G0_1_0_1_0 + 0.867301587301583*G0_1_0_1_1 + 0.146455026455026*G0_1_0_1_2 + 0.146455026455026*G0_1_0_2_1 + 0.0376719576719568*G0_1_0_2_2 + 0.143068783068782*G0_1_1_0_0 + 0.204444444444444*G0_1_1_0_1 + 0.0546031746031744*G0_1_1_0_2 + 0.204444444444444*G0_1_1_1_0 + 0.905820105820101*G0_1_1_1_1 + 0.197671957671957*G0_1_1_1_2 + 0.0546031746031744*G0_1_1_2_0 + 0.197671957671957*G0_1_1_2_1 + 0.0821164021164017*G0_1_1_2_2; + A[184] = A[72] + 0.00338624338624296*G0_0_1_0_1 - 0.00338624338624371*G0_0_1_0_2 + 0.00338624338624296*G0_0_1_1_0 + 0.0812698412698405*G0_0_1_1_1 - 0.00338624338624371*G0_0_1_2_0 - 0.0812698412698413*G0_0_1_2_2 - 0.00338624338624296*G0_1_0_0_1 + 0.00338624338624371*G0_1_0_0_2 - 0.00338624338624296*G0_1_0_1_0 - 0.0812698412698404*G0_1_0_1_1 + 0.0033862433862437*G0_1_0_2_0 + 0.0812698412698413*G0_1_0_2_2; + A[73] = A[199] - 0.0474074074074072*G0_0_1_0_0 - 0.0507936507936503*G0_0_1_0_1 - 0.0372486772486771*G0_0_1_0_2 - 0.0507936507936503*G0_0_1_1_0 + 0.16931216931217*G0_0_1_1_1 + 0.0677248677248675*G0_0_1_1_2 - 0.0372486772486771*G0_0_1_2_0 + 0.0677248677248675*G0_0_1_2_1 - 0.0812698412698402*G0_0_1_2_2 + 0.0474074074074072*G0_1_0_0_0 + 0.0507936507936503*G0_1_0_0_1 + 0.0372486772486771*G0_1_0_0_2 + 0.0507936507936503*G0_1_0_1_0 - 0.16931216931217*G0_1_0_1_1 - 0.0677248677248675*G0_1_0_1_2 + 0.0372486772486771*G0_1_0_2_0 - 0.0677248677248675*G0_1_0_2_1 + 0.0812698412698402*G0_1_0_2_2; + A[119] = A[205] - 0.650158730158727*G0_0_0_0_0 - 0.091428571428571*G0_0_0_0_1 - 0.494391534391533*G0_0_0_0_2 - 0.091428571428571*G0_0_0_1_0 + 0.406349206349204*G0_0_0_1_1 - 0.0948148148148149*G0_0_0_1_2 - 0.494391534391533*G0_0_0_2_0 - 0.094814814814815*G0_0_0_2_1 - 1.13777777777778*G0_0_0_2_2 + 0.0677248677248674*G0_0_1_0_1 - 0.0677248677248672*G0_0_1_0_2 + 0.0677248677248674*G0_0_1_1_0 + 0.626455026455023*G0_0_1_1_1 - 0.0677248677248672*G0_0_1_2_0 - 0.626455026455023*G0_0_1_2_2 + 0.172698412698412*G0_1_0_0_1 - 0.172698412698412*G0_1_0_0_2 + 0.172698412698412*G0_1_0_1_0 + 0.843174603174599*G0_1_0_1_1 - 0.172698412698412*G0_1_0_2_0 - 0.843174603174601*G0_1_0_2_2 + 0.650158730158728*G0_1_1_0_0 + 0.494391534391532*G0_1_1_0_1 + 0.091428571428571*G0_1_1_0_2 + 0.494391534391532*G0_1_1_1_0 + 1.13777777777777*G0_1_1_1_1 + 0.0948148148148142*G0_1_1_1_2 + 0.091428571428571*G0_1_1_2_0 + 0.0948148148148142*G0_1_1_2_1 - 0.406349206349204*G0_1_1_2_2; + A[110] = -A[119] - 0.296860670194003*G0_0_0_0_0 - 0.0445855379188712*G0_0_0_0_1 - 0.409171075837742*G0_0_0_0_2 - 0.0445855379188712*G0_0_0_1_0 - 0.071111111111111*G0_0_0_1_1 - 0.149559082892416*G0_0_0_1_2 - 0.409171075837742*G0_0_0_2_0 - 0.149559082892416*G0_0_0_2_1 - 0.50793650793651*G0_0_0_2_2 - 0.123597883597883*G0_0_1_0_0 - 0.049100529100529*G0_0_1_0_1 - 0.1405291005291*G0_0_1_0_2 - 0.049100529100529*G0_0_1_1_0 - 0.066031746031746*G0_0_1_1_1 - 0.121904761904761*G0_0_1_1_2 - 0.1405291005291*G0_0_1_2_0 - 0.121904761904761*G0_0_1_2_1 - 0.397883597883597*G0_0_1_2_2 - 0.0547442680776005*G0_1_0_0_0 - 0.0135449735449734*G0_1_0_0_1 - 0.225185185185185*G0_1_0_0_2 - 0.0135449735449734*G0_1_0_1_0 - 0.0423280423280421*G0_1_0_1_1 - 0.104973544973545*G0_1_0_1_2 - 0.225185185185185*G0_1_0_2_0 - 0.104973544973545*G0_1_0_2_1 - 0.426102292768961*G0_1_0_2_2 + 0.274285714285714*G0_1_1_0_0 + 0.0728042328042325*G0_1_1_0_1 + 0.0728042328042325*G0_1_1_1_0 - 0.0728042328042326*G0_1_1_1_2 - 0.0728042328042326*G0_1_1_2_1 - 0.274285714285714*G0_1_1_2_2; + A[65] = -A[110] - 0.0225749559082892*G0_0_0_0_0 - 0.0902998236331566*G0_0_0_0_2 + 0.0225749559082893*G0_0_0_1_1 + 0.0902998236331567*G0_0_0_1_2 - 0.0902998236331566*G0_0_0_2_0 + 0.0902998236331567*G0_0_0_2_1 - 0.0135449735449735*G0_0_1_0_0 + 0.0135449735449736*G0_0_1_0_1 + 0.0135449735449736*G0_0_1_1_0 + 0.121904761904761*G0_0_1_1_1 + 0.27089947089947*G0_0_1_1_2 + 0.27089947089947*G0_0_1_2_1 + 0.609523809523806*G0_0_1_2_2 - 0.0327336860670192*G0_1_0_0_0 - 0.00959435626102277*G0_1_0_0_1 - 0.0620811287477953*G0_1_0_0_2 - 0.00959435626102277*G0_1_0_1_0 - 0.0101587301587296*G0_1_0_1_1 + 0.0282186948853615*G0_1_0_1_2 - 0.0620811287477953*G0_1_0_2_0 + 0.0282186948853615*G0_1_0_2_1 + 0.299118165784831*G0_1_0_2_2 - 0.115132275132274*G0_1_1_0_0 - 0.101587301587301*G0_1_1_0_1 - 0.0626455026455024*G0_1_1_0_2 - 0.101587301587301*G0_1_1_1_0 - 0.358941798941798*G0_1_1_1_1 + 0.037248677248677*G0_1_1_1_2 - 0.0626455026455024*G0_1_1_2_0 + 0.037248677248677*G0_1_1_2_1 + 0.169312169312168*G0_1_1_2_2; + A[113] = -A[110] - 0.0959435626102291*G0_0_1_0_0 - 0.0197530864197532*G0_0_1_0_1 - 0.191887125220458*G0_0_1_0_2 - 0.0197530864197532*G0_0_1_1_0 + 0.0169312169312162*G0_0_1_1_1 - 0.0112874779541449*G0_0_1_1_2 - 0.191887125220458*G0_0_1_2_0 - 0.0112874779541449*G0_0_1_2_1 - 0.592592592592591*G0_0_1_2_2 - 0.515837742504406*G0_1_1_0_0 - 0.113439153439153*G0_1_1_0_1 - 0.203174603174603*G0_1_1_0_2 - 0.113439153439153*G0_1_1_1_0 - 0.0304761904761907*G0_1_1_1_1 - 0.0423280423280424*G0_1_1_1_2 - 0.203174603174603*G0_1_1_2_0 - 0.0423280423280424*G0_1_1_2_1 - 0.581305114638446*G0_1_1_2_2; + A[97] = A[113] - 0.0564373897707228*G0_0_0_0_0 - 0.0158024691358024*G0_0_0_0_1 - 0.0349911816578484*G0_0_0_0_2 - 0.0158024691358024*G0_0_0_1_0 - 0.0135449735449736*G0_0_0_1_1 + 0.00112874779541433*G0_0_0_1_2 - 0.0349911816578484*G0_0_0_2_0 + 0.00112874779541433*G0_0_0_2_1 + 0.270899470899468*G0_0_0_2_2 - 0.249453262786596*G0_0_1_0_0 - 0.0259611992945326*G0_0_1_0_1 - 0.0349911816578479*G0_0_1_0_2 - 0.0259611992945326*G0_0_1_1_0 - 0.0135449735449735*G0_0_1_1_1 + 0.0112874779541446*G0_0_1_1_2 - 0.0349911816578478*G0_0_1_2_0 + 0.0112874779541446*G0_0_1_2_1 + 0.463915343915342*G0_0_1_2_2 + 0.0936860670194005*G0_1_0_0_0 - 0.00225749559082887*G0_1_0_0_1 - 0.0349911816578483*G0_1_0_0_2 - 0.00225749559082887*G0_1_0_1_0 - 0.0135449735449735*G0_1_0_1_1 - 0.0124162257495591*G0_1_0_1_2 - 0.0349911816578484*G0_1_0_2_0 - 0.0124162257495591*G0_1_0_2_1 + 0.120776014109345*G0_1_0_2_2 - 0.370229276895941*G0_1_1_0_0 - 0.0135449735449735*G0_1_1_0_1 - 0.0135449735449735*G0_1_1_1_0 + 0.0135449735449735*G0_1_1_1_2 + 0.0135449735449735*G0_1_1_2_1 + 0.370229276895942*G0_1_1_2_2; + A[111] = A[97] + 0.451499118165784*G0_0_1_0_0 + 0.0451499118165785*G0_0_1_0_1 + 0.208818342151675*G0_0_1_0_2 + 0.0451499118165785*G0_0_1_1_0 + 0.00677248677248677*G0_0_1_1_1 + 0.0214462081128747*G0_0_1_1_2 + 0.208818342151675*G0_0_1_2_0 + 0.0214462081128747*G0_0_1_2_1 + 0.108359788359787*G0_0_1_2_2 - 0.451499118165784*G0_1_0_0_0 - 0.0451499118165785*G0_1_0_0_1 - 0.208818342151675*G0_1_0_0_2 - 0.0451499118165785*G0_1_0_1_0 - 0.00677248677248677*G0_1_0_1_1 - 0.0214462081128747*G0_1_0_1_2 - 0.208818342151675*G0_1_0_2_0 - 0.0214462081128747*G0_1_0_2_1 - 0.108359788359787*G0_1_0_2_2; + A[159] = A[97] - 0.750617283950615*G0_0_0_0_0 - 0.1405291005291*G0_0_0_0_1 - 0.0795767195767191*G0_0_0_0_2 - 0.1405291005291*G0_0_0_1_0 - 0.400705467372132*G0_0_0_1_1 - 0.0118518518518517*G0_0_0_1_2 - 0.0795767195767191*G0_0_0_2_0 - 0.0118518518518517*G0_0_0_2_1 + 0.328465608465606*G0_0_0_2_2 - 0.157460317460316*G0_0_1_0_1 + 0.157460317460317*G0_0_1_0_2 - 0.157460317460316*G0_0_1_1_0 - 0.426666666666664*G0_0_1_1_1 + 0.157460317460317*G0_0_1_2_0 + 0.426666666666664*G0_0_1_2_2 + 0.00620811287477939*G0_1_0_0_1 - 0.00620811287477945*G0_1_0_0_2 + 0.00620811287477939*G0_1_0_1_0 - 0.325079365079364*G0_1_0_1_1 - 0.00620811287477944*G0_1_0_2_0 + 0.325079365079364*G0_1_0_2_2 + 0.750617283950613*G0_1_1_0_0 + 0.0795767195767192*G0_1_1_0_1 + 0.1405291005291*G0_1_1_0_2 + 0.0795767195767192*G0_1_1_1_0 - 0.328465608465606*G0_1_1_1_1 + 0.0118518518518518*G0_1_1_1_2 + 0.1405291005291*G0_1_1_2_0 + 0.0118518518518518*G0_1_1_2_1 + 0.400705467372132*G0_1_1_2_2; + A[79] = A[65] - 0.00677248677248681*G0_0_1_0_0 - 0.0214462081128748*G0_0_1_0_1 - 0.0451499118165784*G0_0_1_0_2 - 0.0214462081128748*G0_0_1_1_0 - 0.108359788359788*G0_0_1_1_1 - 0.208818342151675*G0_0_1_1_2 - 0.0451499118165784*G0_0_1_2_0 - 0.208818342151675*G0_0_1_2_1 - 0.451499118165783*G0_0_1_2_2 + 0.00677248677248681*G0_1_0_0_0 + 0.0214462081128748*G0_1_0_0_1 + 0.0451499118165784*G0_1_0_0_2 + 0.0214462081128748*G0_1_0_1_0 + 0.108359788359788*G0_1_0_1_1 + 0.208818342151675*G0_1_0_1_2 + 0.0451499118165784*G0_1_0_2_0 + 0.208818342151675*G0_1_0_2_1 + 0.451499118165783*G0_1_0_2_2; + A[82] = A[110] - 0.0124162257495589*G0_0_1_0_0 - 0.00169312169312158*G0_0_1_0_1 - 0.0169312169312168*G0_0_1_0_2 - 0.00169312169312158*G0_0_1_1_0 - 0.0237037037037031*G0_0_1_1_1 - 0.0338624338624336*G0_0_1_1_2 - 0.0169312169312168*G0_0_1_2_0 - 0.0338624338624336*G0_0_1_2_1 + 0.141093474426807*G0_0_1_2_2 + 0.0124162257495589*G0_1_0_0_0 + 0.00169312169312158*G0_1_0_0_1 + 0.0169312169312168*G0_1_0_0_2 + 0.00169312169312157*G0_1_0_1_0 + 0.0237037037037031*G0_1_0_1_1 + 0.0338624338624336*G0_1_0_1_2 + 0.0169312169312168*G0_1_0_2_0 + 0.0338624338624336*G0_1_0_2_1 - 0.141093474426807*G0_1_0_2_2; + A[153] = A[82] - 0.0790123456790119*G0_0_0_0_0 - 0.0468430335097*G0_0_0_0_1 - 0.0124162257495588*G0_0_0_0_2 - 0.0468430335097*G0_0_0_1_0 + 0.203174603174602*G0_0_0_1_1 - 0.0180599647266313*G0_0_0_1_2 - 0.0124162257495588*G0_0_0_2_0 - 0.0180599647266313*G0_0_0_2_1 - 0.629841269841265*G0_0_0_2_2 - 0.0389417989417987*G0_0_1_0_1 + 0.0389417989417989*G0_0_1_0_2 - 0.0389417989417986*G0_0_1_1_0 + 0.459400352733685*G0_0_1_1_1 + 0.0389417989417989*G0_0_1_2_0 - 0.459400352733682*G0_0_1_2_2 - 0.0237037037037035*G0_1_0_0_1 + 0.0237037037037039*G0_1_0_0_2 - 0.0237037037037035*G0_1_0_1_0 + 0.294603174603173*G0_1_0_1_1 + 0.0237037037037039*G0_1_0_2_0 - 0.294603174603172*G0_1_0_2_2 + 0.0790123456790118*G0_1_1_0_0 + 0.0124162257495592*G0_1_1_0_1 + 0.0468430335097001*G0_1_1_0_2 + 0.0124162257495592*G0_1_1_1_0 + 0.629841269841267*G0_1_1_1_1 + 0.0180599647266315*G0_1_1_1_2 + 0.0468430335097001*G0_1_1_2_0 + 0.0180599647266315*G0_1_1_2_1 - 0.203174603174601*G0_1_1_2_2; + A[68] = -A[65] - 0.0169312169312164*G0_0_1_0_0 + 0.0197530864197533*G0_0_1_0_1 + 0.0112874779541445*G0_0_1_0_2 + 0.0197530864197533*G0_0_1_1_0 + 0.0959435626102295*G0_0_1_1_1 + 0.191887125220458*G0_0_1_1_2 + 0.0112874779541445*G0_0_1_2_0 + 0.191887125220458*G0_0_1_2_1 + 0.592592592592589*G0_0_1_2_2 - 0.0474074074074067*G0_1_1_0_0 - 0.0936860670193999*G0_1_1_0_1 - 0.0310405643738976*G0_1_1_0_2 - 0.0936860670193999*G0_1_1_1_0 - 0.419894179894179*G0_1_1_1_1 - 0.0112874779541447*G0_1_1_1_2 - 0.0310405643738976*G0_1_1_2_0 - 0.0112874779541447*G0_1_1_2_1 + 0.011287477954144*G0_1_1_2_2; + A[169] = A[68] - 0.0338624338624336*G0_0_0_0_0 - 0.0152380952380951*G0_0_0_0_1 - 0.0948148148148142*G0_0_0_0_2 - 0.0152380952380951*G0_0_0_1_0 + 0.0677248677248673*G0_0_0_1_1 + 0.0237037037037038*G0_0_0_1_2 - 0.0948148148148142*G0_0_0_2_0 + 0.0237037037037038*G0_0_0_2_1 - 0.690793650793645*G0_0_0_2_2 - 0.0186243386243386*G0_0_1_0_1 + 0.0186243386243387*G0_0_1_0_2 - 0.0186243386243386*G0_0_1_1_0 + 0.30363315696649*G0_0_1_1_1 + 0.0186243386243387*G0_0_1_2_0 - 0.303633156966487*G0_0_1_2_2 + 0.0135449735449735*G0_1_0_0_1 - 0.0135449735449734*G0_1_0_0_2 + 0.0135449735449735*G0_1_0_1_0 + 0.150123456790122*G0_1_0_1_1 - 0.0135449735449734*G0_1_0_2_0 - 0.150123456790122*G0_1_0_2_2 + 0.0338624338624333*G0_1_1_0_0 + 0.0948148148148144*G0_1_1_0_1 + 0.0152380952380953*G0_1_1_0_2 + 0.0948148148148144*G0_1_1_1_0 + 0.690793650793649*G0_1_1_1_1 - 0.0237037037037034*G0_1_1_1_2 + 0.0152380952380953*G0_1_1_2_0 - 0.0237037037037034*G0_1_1_2_1 - 0.0677248677248662*G0_1_1_2_2; + A[71] = A[169] + 0.0237037037037035*G0_0_1_0_0 + 0.0338624338624335*G0_0_1_0_1 + 0.00169312169312168*G0_0_1_0_2 + 0.0338624338624335*G0_0_1_1_0 - 0.141093474426809*G0_0_1_1_1 + 0.0169312169312167*G0_0_1_1_2 + 0.00169312169312168*G0_0_1_2_0 + 0.0169312169312167*G0_0_1_2_1 + 0.0124162257495588*G0_0_1_2_2 - 0.0237037037037035*G0_1_0_0_0 - 0.0338624338624335*G0_1_0_0_1 - 0.00169312169312168*G0_1_0_0_2 - 0.0338624338624335*G0_1_0_1_0 + 0.141093474426809*G0_1_0_1_1 - 0.0169312169312167*G0_1_0_1_2 - 0.00169312169312168*G0_1_0_2_0 - 0.0169312169312167*G0_1_0_2_1 - 0.0124162257495588*G0_1_0_2_2; + A[55] = A[153] + 0.0124162257495592*G0_0_1_0_0 + 0.0169312169312167*G0_0_1_0_1 + 0.00169312169312176*G0_0_1_0_2 + 0.0169312169312167*G0_0_1_1_0 - 0.141093474426809*G0_0_1_1_1 + 0.0338624338624335*G0_0_1_1_2 + 0.00169312169312175*G0_0_1_2_0 + 0.0338624338624336*G0_0_1_2_1 + 0.0237037037037037*G0_0_1_2_2 - 0.0124162257495592*G0_1_0_0_0 - 0.0169312169312167*G0_1_0_0_1 - 0.00169312169312176*G0_1_0_0_2 - 0.0169312169312167*G0_1_0_1_0 + 0.141093474426809*G0_1_0_1_1 - 0.0338624338624336*G0_1_0_1_2 - 0.00169312169312175*G0_1_0_2_0 - 0.0338624338624336*G0_1_0_2_1 - 0.0237037037037037*G0_1_0_2_2; + A[175] = -A[55] - 0.515837742504407*G0_0_0_0_0 - 0.203174603174602*G0_0_0_0_1 - 0.113439153439153*G0_0_0_0_2 - 0.203174603174602*G0_0_0_1_0 - 0.581305114638446*G0_0_0_1_1 - 0.0423280423280422*G0_0_0_1_2 - 0.113439153439153*G0_0_0_2_0 - 0.0423280423280422*G0_0_0_2_1 - 0.0304761904761904*G0_0_0_2_2 - 0.0959435626102289*G0_0_1_0_0 - 0.191887125220458*G0_0_1_0_1 - 0.0197530864197529*G0_0_1_0_2 - 0.191887125220458*G0_0_1_1_0 - 0.592592592592591*G0_0_1_1_1 - 0.0112874779541446*G0_0_1_1_2 - 0.0197530864197529*G0_0_1_2_0 - 0.0112874779541446*G0_0_1_2_1 + 0.0169312169312169*G0_0_1_2_2; + A[220] = A[164] + 0.0812698412698406*G0_0_1_0_0 + 0.00338624338624364*G0_0_1_0_2 - 0.0812698412698408*G0_0_1_1_1 - 0.00338624338624342*G0_0_1_1_2 + 0.00338624338624363*G0_0_1_2_0 - 0.00338624338624341*G0_0_1_2_1 - 0.0812698412698405*G0_1_0_0_0 - 0.00338624338624363*G0_1_0_0_2 + 0.0812698412698408*G0_1_0_1_1 + 0.00338624338624343*G0_1_0_1_2 - 0.00338624338624362*G0_1_0_2_0 + 0.00338624338624342*G0_1_0_2_1; + A[127] = A[113] + 0.108359788359788*G0_0_1_0_0 + 0.0214462081128747*G0_0_1_0_1 + 0.208818342151675*G0_0_1_0_2 + 0.0214462081128747*G0_0_1_1_0 + 0.00677248677248684*G0_0_1_1_1 + 0.0451499118165785*G0_0_1_1_2 + 0.208818342151675*G0_0_1_2_0 + 0.0451499118165785*G0_0_1_2_1 + 0.451499118165784*G0_0_1_2_2 - 0.108359788359788*G0_1_0_0_0 - 0.0214462081128747*G0_1_0_0_1 - 0.208818342151675*G0_1_0_0_2 - 0.0214462081128747*G0_1_0_1_0 - 0.00677248677248684*G0_1_0_1_1 - 0.0451499118165785*G0_1_0_1_2 - 0.208818342151675*G0_1_0_2_0 - 0.0451499118165785*G0_1_0_2_1 - 0.451499118165784*G0_1_0_2_2; + A[118] = A[202] + 0.0812698412698405*G0_0_1_0_0 + 0.00338624338624318*G0_0_1_0_1 + 0.00338624338624318*G0_0_1_1_0 - 0.00338624338624344*G0_0_1_1_2 - 0.00338624338624344*G0_0_1_2_1 - 0.0812698412698413*G0_0_1_2_2 - 0.0812698412698405*G0_1_0_0_0 - 0.00338624338624317*G0_1_0_0_1 - 0.00338624338624317*G0_1_0_1_0 + 0.00338624338624344*G0_1_0_1_2 + 0.00338624338624344*G0_1_0_2_1 + 0.0812698412698413*G0_1_0_2_2; + A[217] = A[119] + 0.0812698412698417*G0_0_1_0_0 + 0.0372486772486771*G0_0_1_0_1 - 0.0677248677248679*G0_0_1_0_2 + 0.0372486772486771*G0_0_1_1_0 + 0.047407407407407*G0_0_1_1_1 + 0.0507936507936505*G0_0_1_1_2 - 0.0677248677248679*G0_0_1_2_0 + 0.0507936507936505*G0_0_1_2_1 - 0.169312169312171*G0_0_1_2_2 - 0.0812698412698417*G0_1_0_0_0 - 0.0372486772486772*G0_1_0_0_1 + 0.0677248677248679*G0_1_0_0_2 - 0.0372486772486772*G0_1_0_1_0 - 0.047407407407407*G0_1_0_1_1 - 0.0507936507936505*G0_1_0_1_2 + 0.0677248677248679*G0_1_0_2_0 - 0.0507936507936505*G0_1_0_2_1 + 0.169312169312171*G0_1_0_2_2; + A[49] = -A[169] - 0.0474074074074072*G0_0_0_0_0 - 0.0310405643738976*G0_0_0_0_1 - 0.0936860670193999*G0_0_0_0_2 - 0.0310405643738976*G0_0_0_1_0 + 0.0112874779541441*G0_0_0_1_1 - 0.0112874779541447*G0_0_0_1_2 - 0.0936860670193999*G0_0_0_2_0 - 0.0112874779541447*G0_0_0_2_1 - 0.419894179894177*G0_0_0_2_2 - 0.0169312169312168*G0_0_1_0_0 + 0.0112874779541448*G0_0_1_0_1 + 0.019753086419753*G0_0_1_0_2 + 0.0112874779541448*G0_0_1_1_0 + 0.592592592592592*G0_0_1_1_1 + 0.191887125220458*G0_0_1_1_2 + 0.019753086419753*G0_0_1_2_0 + 0.191887125220458*G0_0_1_2_1 + 0.0959435626102291*G0_0_1_2_2; + A[124] = -A[79] - 0.0169312169312164*G0_1_0_0_0 + 0.0197530864197533*G0_1_0_0_1 + 0.0112874779541445*G0_1_0_0_2 + 0.0197530864197533*G0_1_0_1_0 + 0.0959435626102295*G0_1_0_1_1 + 0.191887125220458*G0_1_0_1_2 + 0.0112874779541445*G0_1_0_2_0 + 0.191887125220458*G0_1_0_2_1 + 0.592592592592589*G0_1_0_2_2 - 0.0474074074074067*G0_1_1_0_0 - 0.0936860670193999*G0_1_1_0_1 - 0.0310405643738976*G0_1_1_0_2 - 0.0936860670193999*G0_1_1_1_0 - 0.419894179894179*G0_1_1_1_1 - 0.0112874779541447*G0_1_1_1_2 - 0.0310405643738976*G0_1_1_2_0 - 0.0112874779541447*G0_1_1_2_1 + 0.011287477954144*G0_1_1_2_2; + A[161] = -A[153] - 0.515837742504407*G0_0_0_0_0 - 0.203174603174602*G0_0_0_0_1 - 0.113439153439153*G0_0_0_0_2 - 0.203174603174602*G0_0_0_1_0 - 0.581305114638446*G0_0_0_1_1 - 0.0423280423280422*G0_0_0_1_2 - 0.113439153439153*G0_0_0_2_0 - 0.0423280423280422*G0_0_0_2_1 - 0.0304761904761904*G0_0_0_2_2 - 0.0959435626102289*G0_1_0_0_0 - 0.191887125220458*G0_1_0_0_1 - 0.0197530864197529*G0_1_0_0_2 - 0.191887125220458*G0_1_0_1_0 - 0.592592592592591*G0_1_0_1_1 - 0.0112874779541446*G0_1_0_1_2 - 0.0197530864197529*G0_1_0_2_0 - 0.0112874779541446*G0_1_0_2_1 + 0.0169312169312169*G0_1_0_2_2; + A[112] = A[160] - 0.639153439153436*G0_0_0_0_0 - 0.237460317460316*G0_0_0_0_1 + 0.186666666666667*G0_0_0_0_2 - 0.237460317460316*G0_0_0_1_0 - 0.842328042328039*G0_0_0_1_1 + 0.0173544973544975*G0_0_0_1_2 + 0.186666666666667*G0_0_0_2_0 + 0.0173544973544975*G0_0_0_2_1 + 1.04042328042328*G0_0_0_2_2 - 0.127407407407407*G0_0_1_0_1 + 0.127407407407407*G0_0_1_0_2 - 0.127407407407407*G0_0_1_1_0 - 0.839788359788356*G0_0_1_1_1 + 0.127407407407407*G0_0_1_2_0 + 0.839788359788356*G0_0_1_2_2 - 0.127407407407407*G0_1_0_0_1 + 0.127407407407407*G0_1_0_0_2 - 0.127407407407407*G0_1_0_1_0 - 0.839788359788356*G0_1_0_1_1 + 0.127407407407407*G0_1_0_2_0 + 0.839788359788356*G0_1_0_2_2 + 0.639153439153435*G0_1_1_0_0 - 0.186666666666666*G0_1_1_0_1 + 0.237460317460317*G0_1_1_0_2 - 0.186666666666666*G0_1_1_1_0 - 1.04042328042328*G0_1_1_1_1 - 0.0173544973544971*G0_1_1_1_2 + 0.237460317460317*G0_1_1_2_0 - 0.0173544973544972*G0_1_1_2_1 + 0.842328042328038*G0_1_1_2_2; + A[64] = A[160] - 0.842328042328039*G0_0_0_0_0 - 0.237460317460316*G0_0_0_0_1 + 0.0173544973544974*G0_0_0_0_2 - 0.237460317460316*G0_0_0_1_0 - 0.639153439153437*G0_0_0_1_1 + 0.186666666666666*G0_0_0_1_2 + 0.0173544973544974*G0_0_0_2_0 + 0.186666666666666*G0_0_0_2_1 + 1.04042328042327*G0_0_0_2_2 - 0.00253968253968281*G0_0_1_0_0 - 0.11005291005291*G0_0_1_0_1 + 0.0173544973544973*G0_0_1_0_2 - 0.11005291005291*G0_0_1_1_0 - 0.639153439153437*G0_0_1_1_1 + 0.059259259259259*G0_0_1_1_2 + 0.0173544973544973*G0_0_1_2_0 + 0.059259259259259*G0_0_1_2_1 + 0.200634920634919*G0_0_1_2_2 - 0.00253968253968283*G0_1_0_0_0 - 0.11005291005291*G0_1_0_0_1 + 0.0173544973544973*G0_1_0_0_2 - 0.11005291005291*G0_1_0_1_0 - 0.639153439153437*G0_1_0_1_1 + 0.059259259259259*G0_1_0_1_2 + 0.0173544973544973*G0_1_0_2_0 + 0.059259259259259*G0_1_0_2_1 + 0.200634920634919*G0_1_0_2_2 - 0.203174603174602*G0_1_1_0_0 - 0.169312169312169*G0_1_1_0_1 - 0.169312169312169*G0_1_1_1_0 + 0.169312169312169*G0_1_1_1_2 + 0.169312169312169*G0_1_1_2_1 + 0.203174603174602*G0_1_1_2_2; + A[162] = A[187] - 0.474074074074071*G0_0_0_0_0 + 0.0270899470899471*G0_0_0_0_1 - 0.077883597883597*G0_0_0_0_2 + 0.0270899470899471*G0_0_0_1_0 + 0.304761904761903*G0_0_0_1_1 - 0.0101587301587304*G0_0_0_1_2 - 0.077883597883597*G0_0_0_2_0 - 0.0101587301587304*G0_0_0_2_1 - 0.216719576719576*G0_0_0_2_2 + 0.196402116402115*G0_0_1_0_1 - 0.196402116402116*G0_0_1_0_2 + 0.196402116402115*G0_0_1_1_0 + 0.345396825396823*G0_0_1_1_1 - 0.196402116402116*G0_0_1_2_0 - 0.345396825396824*G0_0_1_2_2 + 0.0778835978835975*G0_1_0_0_1 - 0.0778835978835975*G0_1_0_0_2 + 0.0778835978835975*G0_1_0_1_0 + 0.379259259259257*G0_1_0_1_1 - 0.0778835978835975*G0_1_0_2_0 - 0.379259259259258*G0_1_0_2_2 + 0.474074074074071*G0_1_1_0_0 + 0.0778835978835972*G0_1_1_0_1 - 0.0270899470899474*G0_1_1_0_2 + 0.0778835978835972*G0_1_1_1_0 + 0.216719576719575*G0_1_1_1_1 + 0.0101587301587298*G0_1_1_1_2 - 0.0270899470899473*G0_1_1_2_0 + 0.0101587301587298*G0_1_1_2_1 - 0.304761904761904*G0_1_1_2_2; + A[190] = A[162] - 0.169312169312167*G0_0_1_0_0 - 0.0677248677248669*G0_0_1_0_1 + 0.0507936507936509*G0_0_1_0_2 - 0.0677248677248669*G0_0_1_1_0 + 0.0812698412698414*G0_0_1_1_1 + 0.0372486772486771*G0_0_1_1_2 + 0.0507936507936509*G0_0_1_2_0 + 0.0372486772486771*G0_0_1_2_1 + 0.0474074074074074*G0_0_1_2_2 + 0.169312169312167*G0_1_0_0_0 + 0.0677248677248669*G0_1_0_0_1 - 0.0507936507936509*G0_1_0_0_2 + 0.0677248677248669*G0_1_0_1_0 - 0.0812698412698414*G0_1_0_1_1 - 0.0372486772486771*G0_1_0_1_2 - 0.0507936507936509*G0_1_0_2_0 - 0.0372486772486771*G0_1_0_2_1 - 0.0474074074074074*G0_1_0_2_2; + A[40] = -0.00522045855379177*G0_1_0_0_0 + 0.000105820105820104*G0_1_0_0_2 + 0.00522045855379184*G0_1_0_1_1 - 0.000105820105820103*G0_1_0_1_2 + 0.000105820105820105*G0_1_0_2_0 - 0.000105820105820102*G0_1_0_2_1 + 0.00980599647266316*G0_1_1_0_0 + 0.0147442680776014*G0_1_1_0_1 - 0.00109347442680775*G0_1_1_0_2 + 0.0147442680776014*G0_1_1_1_0 + 0.0150264550264549*G0_1_1_1_1 - 0.00119929453262784*G0_1_1_1_2 - 0.00109347442680775*G0_1_1_2_0 - 0.00119929453262784*G0_1_1_2_1 - 0.00740740740740728*G0_1_1_2_2; + A[145] = A[159] + 0.451499118165782*G0_0_1_0_0 + 0.208818342151674*G0_0_1_0_1 + 0.0451499118165783*G0_0_1_0_2 + 0.208818342151674*G0_0_1_1_0 + 0.108359788359788*G0_0_1_1_1 + 0.0214462081128747*G0_0_1_1_2 + 0.0451499118165783*G0_0_1_2_0 + 0.0214462081128747*G0_0_1_2_1 + 0.00677248677248677*G0_0_1_2_2 - 0.451499118165782*G0_1_0_0_0 - 0.208818342151674*G0_1_0_0_1 - 0.0451499118165783*G0_1_0_0_2 - 0.208818342151674*G0_1_0_1_0 - 0.108359788359788*G0_1_0_1_1 - 0.0214462081128747*G0_1_0_1_2 - 0.0451499118165783*G0_1_0_2_0 - 0.0214462081128747*G0_1_0_2_1 - 0.00677248677248677*G0_1_0_2_2; + A[151] = -A[61] + 0.0889594356261019*G0_0_0_0_0 + 0.0125220458553792*G0_0_0_0_1 + 0.0343209876543208*G0_0_0_0_2 + 0.0125220458553792*G0_0_0_1_0 + 0.19647266313933*G0_0_0_1_1 + 0.0223985890652556*G0_0_0_1_2 + 0.0343209876543208*G0_0_0_2_0 + 0.0223985890652556*G0_0_0_2_1 + 0.0861375661375656*G0_0_0_2_2 + 0.00282186948853616*G0_1_0_0_0 - 0.00987654320987647*G0_1_0_0_1 - 0.00987654320987647*G0_1_0_1_0 + 0.00987654320987646*G0_1_0_1_2 + 0.00987654320987646*G0_1_0_2_1 - 0.00282186948853619*G0_1_0_2_2; + A[102] = A[186] - 0.180599647266311*G0_0_1_0_0 - 0.0564373897707225*G0_0_1_0_1 + 0.12416225749559*G0_0_1_0_2 - 0.0564373897707225*G0_0_1_1_0 - 0.031604938271605*G0_0_1_1_1 - 0.00225749559082904*G0_0_1_1_2 + 0.12416225749559*G0_0_1_2_0 - 0.00225749559082904*G0_0_1_2_1 + 0.0812698412698408*G0_0_1_2_2 + 0.180599647266311*G0_1_0_0_0 + 0.0564373897707225*G0_1_0_0_1 - 0.12416225749559*G0_1_0_0_2 + 0.0564373897707225*G0_1_0_1_0 + 0.031604938271605*G0_1_0_1_1 + 0.00225749559082906*G0_1_0_1_2 - 0.12416225749559*G0_1_0_2_0 + 0.00225749559082906*G0_1_0_2_1 - 0.0812698412698407*G0_1_0_2_2; + A[189] = A[102] + 1.39964726631393*G0_0_0_0_0 + 0.0835273368606698*G0_0_0_0_1 + 0.390546737213402*G0_0_0_0_2 + 0.0835273368606698*G0_0_0_1_0 - 0.0902998236331564*G0_0_0_1_1 + 0.029347442680776*G0_0_0_1_2 + 0.390546737213402*G0_0_0_2_0 + 0.0293474426807761*G0_0_0_2_1 + 0.257354497354497*G0_0_0_2_2 + 0.0270899470899467*G0_0_1_0_1 - 0.027089947089947*G0_0_1_0_2 + 0.0270899470899467*G0_0_1_1_0 - 0.0948148148148144*G0_0_1_1_1 - 0.0270899470899471*G0_0_1_2_0 + 0.0948148148148144*G0_0_1_2_2 - 0.153509700176366*G0_1_0_0_1 + 0.153509700176366*G0_1_0_0_2 - 0.153509700176366*G0_1_0_1_0 - 0.20768959435626*G0_1_0_1_1 + 0.153509700176366*G0_1_0_2_0 + 0.20768959435626*G0_1_0_2_2 - 1.39964726631393*G0_1_1_0_0 - 0.390546737213402*G0_1_1_0_1 - 0.0835273368606697*G0_1_1_0_2 - 0.390546737213402*G0_1_1_1_0 - 0.257354497354496*G0_1_1_1_1 - 0.029347442680776*G0_1_1_1_2 - 0.0835273368606697*G0_1_1_2_0 - 0.029347442680776*G0_1_1_2_1 + 0.0902998236331565*G0_1_1_2_2; + A[147] = A[189] + 0.180599647266314*G0_0_1_0_0 - 0.12416225749559*G0_0_1_0_1 + 0.056437389770723*G0_0_1_0_2 - 0.12416225749559*G0_0_1_1_0 - 0.0812698412698405*G0_0_1_1_1 + 0.00225749559082906*G0_0_1_1_2 + 0.056437389770723*G0_0_1_2_0 + 0.00225749559082906*G0_0_1_2_1 + 0.0316049382716051*G0_0_1_2_2 - 0.180599647266314*G0_1_0_0_0 + 0.12416225749559*G0_1_0_0_1 - 0.056437389770723*G0_1_0_0_2 + 0.12416225749559*G0_1_0_1_0 + 0.0812698412698405*G0_1_0_1_1 - 0.00225749559082906*G0_1_0_1_2 - 0.056437389770723*G0_1_0_2_0 - 0.00225749559082906*G0_1_0_2_1 - 0.0316049382716051*G0_1_0_2_2; + A[177] = -A[57] + 0.415379188712519*G0_0_0_0_0 - 0.0428924162257494*G0_0_0_0_1 + 0.191887125220457*G0_0_0_0_2 - 0.0428924162257494*G0_0_0_1_0 - 0.0451499118165787*G0_0_0_1_1 + 0.0654673721340386*G0_0_0_1_2 + 0.191887125220457*G0_0_0_2_0 + 0.0654673721340386*G0_0_0_2_1 + 0.148994708994709*G0_0_0_2_2 - 0.0857848324514981*G0_0_1_0_0 - 0.045149911816578*G0_0_1_0_1 + 0.0180599647266315*G0_0_1_0_2 - 0.045149911816578*G0_0_1_1_0 + 0.0451499118165784*G0_0_1_1_2 + 0.0180599647266315*G0_0_1_2_0 + 0.0451499118165784*G0_0_1_2_1 + 0.0496649029982363*G0_0_1_2_2; + A[191] = A[177] + 0.0541798941798932*G0_0_1_0_0 + 0.0293474426807756*G0_0_1_0_1 - 0.0158024691358026*G0_0_1_0_2 + 0.0293474426807756*G0_0_1_1_0 - 0.0451499118165792*G0_0_1_1_1 - 0.00677248677248696*G0_0_1_1_2 - 0.0158024691358026*G0_0_1_2_0 - 0.00677248677248696*G0_0_1_2_1 - 0.0225749559082894*G0_0_1_2_2 - 0.0541798941798932*G0_1_0_0_0 - 0.0293474426807756*G0_1_0_0_1 + 0.0158024691358026*G0_1_0_0_2 - 0.0293474426807756*G0_1_0_1_0 + 0.0451499118165791*G0_1_0_1_1 + 0.00677248677248694*G0_1_0_1_2 + 0.0158024691358026*G0_1_0_2_0 + 0.00677248677248696*G0_1_0_2_1 + 0.0225749559082894*G0_1_0_2_2; + A[132] = A[191] - 0.297989417989416*G0_0_0_0_0 + 0.0474074074074073*G0_0_0_0_1 - 0.0880423280423275*G0_0_0_0_2 + 0.0474074074074073*G0_0_0_1_0 + 0.27089947089947*G0_0_0_1_1 + 0.02031746031746*G0_0_0_1_2 - 0.0880423280423275*G0_0_0_2_0 + 0.02031746031746*G0_0_0_2_1 - 0.0677248677248686*G0_0_0_2_2 - 0.00902998236331544*G0_0_1_0_1 + 0.00902998236331571*G0_0_1_0_2 - 0.00902998236331543*G0_0_1_1_0 + 0.16705467372134*G0_0_1_1_1 + 0.00902998236331571*G0_0_1_2_0 - 0.16705467372134*G0_0_1_2_2 + 0.0361199294532624*G0_1_0_0_1 - 0.0361199294532626*G0_1_0_0_2 + 0.0361199294532624*G0_1_0_1_0 + 0.14447971781305*G0_1_0_1_1 - 0.0361199294532626*G0_1_0_2_0 - 0.144479717813051*G0_1_0_2_2 + 0.297989417989417*G0_1_1_0_0 + 0.0880423280423277*G0_1_1_0_1 - 0.0474074074074072*G0_1_1_0_2 + 0.0880423280423277*G0_1_1_1_0 + 0.0677248677248679*G0_1_1_1_1 - 0.0203174603174603*G0_1_1_1_2 - 0.0474074074074072*G0_1_1_2_0 - 0.0203174603174603*G0_1_1_2_1 - 0.27089947089947*G0_1_1_2_2; + A[188] = A[132] - 0.0541798941798942*G0_0_1_0_0 + 0.0158024691358023*G0_0_1_0_1 - 0.0293474426807757*G0_0_1_0_2 + 0.0158024691358023*G0_0_1_1_0 + 0.0225749559082891*G0_0_1_1_1 + 0.00677248677248672*G0_0_1_1_2 - 0.0293474426807758*G0_0_1_2_0 + 0.00677248677248671*G0_0_1_2_1 + 0.0451499118165782*G0_0_1_2_2 + 0.0541798941798942*G0_1_0_0_0 - 0.0158024691358023*G0_1_0_0_1 + 0.0293474426807757*G0_1_0_0_2 - 0.0158024691358023*G0_1_0_1_0 - 0.0225749559082891*G0_1_0_1_1 - 0.00677248677248673*G0_1_0_1_2 + 0.0293474426807757*G0_1_0_2_0 - 0.00677248677248671*G0_1_0_2_1 - 0.0451499118165782*G0_1_0_2_2; + A[213] = -A[191] + 0.361199294532626*G0_0_0_0_0 - 0.029347442680776*G0_0_0_0_1 + 0.232522045855378*G0_0_0_0_2 - 0.029347442680776*G0_0_0_1_0 - 0.234779541446208*G0_0_0_1_1 - 0.0293474426807758*G0_0_0_1_2 + 0.232522045855378*G0_0_0_2_0 - 0.0293474426807758*G0_0_0_2_1 + 0.474074074074071*G0_0_0_2_2 - 0.0225749559082894*G0_0_1_0_0 + 0.0180599647266312*G0_0_1_0_1 + 0.00451499118165776*G0_0_1_0_2 + 0.0180599647266311*G0_0_1_1_0 - 0.0180599647266314*G0_0_1_1_2 + 0.00451499118165776*G0_0_1_2_0 - 0.0180599647266314*G0_0_1_2_1 + 0.0135449735449735*G0_0_1_2_2 - 0.0993298059964719*G0_1_0_0_0 - 0.0180599647266311*G0_1_0_0_1 + 0.00451499118165788*G0_1_0_0_2 - 0.0180599647266311*G0_1_0_1_0 + 0.0180599647266316*G0_1_0_1_2 + 0.00451499118165787*G0_1_0_2_0 + 0.0180599647266316*G0_1_0_2_1 + 0.090299823633157*G0_1_0_2_2 - 0.00902998236331595*G0_1_1_0_0 + 0.0090299823633155*G0_1_1_0_2 + 0.0090299823633155*G0_1_1_2_0 - 0.00902998236331544*G0_1_1_2_2; + A[133] = A[132] + 0.00902998236331568*G0_0_0_0_0 - 0.00902998236331556*G0_0_0_0_1 - 0.00902998236331556*G0_0_0_1_0 + 0.0090299823633159*G0_0_0_1_1 + 0.022574955908289*G0_0_1_0_0 - 0.00451499118165768*G0_0_1_0_1 - 0.0180599647266311*G0_0_1_0_2 - 0.00451499118165768*G0_0_1_1_0 - 0.0135449735449727*G0_0_1_1_1 + 0.0180599647266317*G0_0_1_1_2 - 0.0180599647266311*G0_0_1_2_0 + 0.0180599647266317*G0_0_1_2_1 + 0.0496649029982357*G0_1_0_0_0 - 0.0225749559082892*G0_1_0_0_1 - 0.0270899470899473*G0_1_0_0_2 - 0.0225749559082892*G0_1_0_1_0 - 0.00451499118165742*G0_1_0_1_1 + 0.0270899470899474*G0_1_0_1_2 - 0.0270899470899473*G0_1_0_2_0 + 0.0270899470899474*G0_1_0_2_1 - 0.261869488536154*G0_1_1_0_0 - 0.0586948853615516*G0_1_1_0_1 + 0.0496649029982362*G0_1_1_0_2 - 0.0586948853615517*G0_1_1_1_0 + 0.0270899470899478*G0_1_1_1_1 + 0.0316049382716053*G0_1_1_1_2 + 0.0496649029982362*G0_1_1_2_0 + 0.0316049382716053*G0_1_1_2_1 + 0.189629629629631*G0_1_1_2_2; + A[88] = -A[133] - 0.0496649029982368*G0_1_0_0_0 - 0.0180599647266315*G0_1_0_0_1 - 0.0451499118165787*G0_1_0_0_2 - 0.0180599647266315*G0_1_0_1_0 + 0.0857848324514989*G0_1_0_1_1 + 0.0451499118165786*G0_1_0_1_2 - 0.0451499118165787*G0_1_0_2_0 + 0.0451499118165786*G0_1_0_2_1 + 0.0993298059964723*G0_1_1_0_0 + 0.173827160493826*G0_1_1_0_1 + 0.0203174603174601*G0_1_1_0_2 + 0.173827160493826*G0_1_1_1_0 + 0.501164021164019*G0_1_1_1_1 + 0.002257495590829*G0_1_1_1_2 + 0.0203174603174601*G0_1_1_2_0 + 0.00225749559082901*G0_1_1_2_1 - 0.0451499118165781*G0_1_1_2_2; + A[193] = -A[88] - 0.70885361552028*G0_0_0_0_0 - 0.225749559082892*G0_0_0_0_1 - 0.442469135802468*G0_0_0_0_2 - 0.225749559082892*G0_0_0_1_0 - 0.708853615520279*G0_0_0_1_1 - 0.397319223985889*G0_0_0_1_2 - 0.442469135802468*G0_0_0_2_0 - 0.397319223985889*G0_0_0_2_1 - 0.514708994708994*G0_0_0_2_2 - 0.194144620811287*G0_0_1_0_0 - 0.12641975308642*G0_0_1_0_1 - 0.0406349206349208*G0_0_1_0_2 - 0.12641975308642*G0_0_1_1_0 - 0.636613756613754*G0_0_1_1_1 - 0.252839506172838*G0_0_1_1_2 - 0.0406349206349208*G0_0_1_2_0 - 0.252839506172838*G0_0_1_2_1 - 0.0225749559082908*G0_0_1_2_2 - 0.0541798941798951*G0_1_0_0_0 - 0.0880423280423282*G0_1_0_0_1 - 0.128677248677249*G0_1_0_0_2 - 0.0880423280423282*G0_1_0_1_0 - 0.419894179894178*G0_1_0_1_1 - 0.304761904761903*G0_1_0_1_2 - 0.128677248677249*G0_1_0_2_0 - 0.304761904761903*G0_1_0_2_1 - 0.176084656084656*G0_1_0_2_2 + 0.121904761904761*G0_1_1_0_0 + 0.216719576719576*G0_1_1_0_1 + 0.216719576719576*G0_1_1_1_0 - 0.216719576719576*G0_1_1_1_2 - 0.216719576719576*G0_1_1_2_1 - 0.121904761904762*G0_1_1_2_2; + A[222] = A[193] + 0.758518518518516*G0_0_0_0_0 + 0.216719576719576*G0_0_0_0_1 + 0.514708994708993*G0_0_0_0_2 + 0.216719576719576*G0_0_0_1_0 + 0.541798941798939*G0_0_0_1_1 + 0.189629629629629*G0_0_0_1_2 + 0.514708994708993*G0_0_0_2_0 + 0.189629629629629*G0_0_0_2_1 + 0.108359788359788*G0_0_0_2_2 + 0.0812698412698406*G0_0_1_0_1 - 0.0812698412698409*G0_0_1_0_2 + 0.0812698412698406*G0_0_1_1_0 + 0.460529100529098*G0_0_1_1_1 - 0.0812698412698409*G0_0_1_2_0 - 0.4605291005291*G0_0_1_2_2 - 0.0541798941798936*G0_1_0_0_1 + 0.0541798941798942*G0_1_0_0_2 - 0.0541798941798936*G0_1_0_1_0 + 0.189629629629629*G0_1_0_1_1 + 0.0541798941798941*G0_1_0_2_0 - 0.189629629629629*G0_1_0_2_2 - 0.758518518518516*G0_1_1_0_0 - 0.514708994708993*G0_1_1_0_1 - 0.216719576719576*G0_1_1_0_2 - 0.514708994708993*G0_1_1_1_0 - 0.108359788359788*G0_1_1_1_1 - 0.189629629629629*G0_1_1_1_2 - 0.216719576719576*G0_1_1_2_0 - 0.189629629629629*G0_1_1_2_1 - 0.54179894179894*G0_1_1_2_2; + A[207] = A[193] + 0.162539682539681*G0_0_1_0_0 + 0.0541798941798936*G0_0_1_0_1 - 0.081269841269841*G0_0_1_0_2 + 0.0541798941798936*G0_0_1_1_0 + 0.162539682539681*G0_0_1_1_1 - 0.0812698412698411*G0_0_1_1_2 - 0.081269841269841*G0_0_1_2_0 - 0.0812698412698411*G0_0_1_2_1 - 0.108359788359788*G0_0_1_2_2 - 0.162539682539681*G0_1_0_0_0 - 0.0541798941798936*G0_1_0_0_1 + 0.081269841269841*G0_1_0_0_2 - 0.0541798941798936*G0_1_0_1_0 - 0.162539682539681*G0_1_0_1_1 + 0.0812698412698412*G0_1_0_1_2 + 0.081269841269841*G0_1_0_2_0 + 0.0812698412698412*G0_1_0_2_1 + 0.108359788359788*G0_1_0_2_2; + A[183] = -A[191] + 0.415379188712519*G0_0_0_0_0 - 0.0428924162257494*G0_0_0_0_1 + 0.191887125220457*G0_0_0_0_2 - 0.0428924162257494*G0_0_0_1_0 - 0.0451499118165787*G0_0_0_1_1 + 0.0654673721340386*G0_0_0_1_2 + 0.191887125220457*G0_0_0_2_0 + 0.0654673721340386*G0_0_0_2_1 + 0.148994708994709*G0_0_0_2_2 - 0.0857848324514981*G0_1_0_0_0 - 0.045149911816578*G0_1_0_0_1 + 0.0180599647266315*G0_1_0_0_2 - 0.045149911816578*G0_1_0_1_0 + 0.0451499118165784*G0_1_0_1_2 + 0.0180599647266315*G0_1_0_2_0 + 0.0451499118165784*G0_1_0_2_1 + 0.0496649029982363*G0_1_0_2_2; + A[194] = A[222] + 0.162539682539683*G0_0_1_0_0 - 0.0812698412698407*G0_0_1_0_1 + 0.054179894179894*G0_0_1_0_2 - 0.0812698412698406*G0_0_1_1_0 - 0.108359788359788*G0_0_1_1_1 - 0.0812698412698406*G0_0_1_1_2 + 0.0541798941798941*G0_0_1_2_0 - 0.0812698412698406*G0_0_1_2_1 + 0.162539682539683*G0_0_1_2_2 - 0.162539682539683*G0_1_0_0_0 + 0.0812698412698407*G0_1_0_0_1 - 0.0541798941798941*G0_1_0_0_2 + 0.0812698412698407*G0_1_0_1_0 + 0.108359788359788*G0_1_0_1_1 + 0.0812698412698406*G0_1_0_1_2 - 0.054179894179894*G0_1_0_2_0 + 0.0812698412698406*G0_1_0_2_1 - 0.162539682539683*G0_1_0_2_2; + A[200] = A[88] - 0.0225749559082892*G0_0_1_0_0 - 0.0158024691358022*G0_0_1_0_1 - 0.00677248677248666*G0_0_1_0_2 - 0.0158024691358022*G0_0_1_1_0 + 0.0541798941798946*G0_0_1_1_1 + 0.0293474426807762*G0_0_1_1_2 - 0.00677248677248666*G0_0_1_2_0 + 0.0293474426807762*G0_0_1_2_1 - 0.0451499118165767*G0_0_1_2_2 + 0.0225749559082892*G0_1_0_0_0 + 0.0158024691358022*G0_1_0_0_1 + 0.00677248677248666*G0_1_0_0_2 + 0.0158024691358022*G0_1_0_1_0 - 0.0541798941798946*G0_1_0_1_1 - 0.0293474426807762*G0_1_0_1_2 + 0.00677248677248666*G0_1_0_2_0 - 0.0293474426807762*G0_1_0_2_1 + 0.0451499118165767*G0_1_0_2_2; + A[223] = -A[213] - 0.0948148148148149*G0_0_0_0_0 - 0.108359788359788*G0_0_0_0_2 + 0.0948148148148141*G0_0_0_1_1 + 0.108359788359788*G0_0_0_1_2 - 0.108359788359788*G0_0_0_2_0 + 0.108359788359788*G0_0_0_2_1 + 0.0496649029982357*G0_0_1_0_0 + 0.0677248677248672*G0_0_1_0_1 + 0.0632098765432093*G0_0_1_0_2 + 0.0677248677248672*G0_0_1_1_0 + 0.437954144620809*G0_0_1_1_1 + 0.261869488536154*G0_0_1_1_2 + 0.0632098765432093*G0_0_1_2_0 + 0.261869488536154*G0_0_1_2_1 + 0.284444444444443*G0_0_1_2_2 + 0.135449735449735*G0_1_0_0_0 + 0.142222222222222*G0_1_0_0_1 + 0.128677248677248*G0_1_0_0_2 + 0.142222222222222*G0_1_0_1_0 + 0.230264550264549*G0_1_0_1_1 + 0.237037037037036*G0_1_0_1_2 + 0.128677248677248*G0_1_0_2_0 + 0.237037037037036*G0_1_0_2_1 + 0.176084656084656*G0_1_0_2_2 - 0.16705467372134*G0_1_1_0_0 - 0.252839506172838*G0_1_1_0_1 - 0.00902998236331555*G0_1_1_0_2 - 0.252839506172838*G0_1_1_1_0 - 0.406349206349205*G0_1_1_1_1 + 0.117389770723103*G0_1_1_1_2 - 0.00902998236331554*G0_1_1_2_0 + 0.117389770723103*G0_1_1_2_1 + 0.0496649029982372*G0_1_1_2_2; + A[208] = A[223] + 0.758518518518516*G0_0_0_0_0 + 0.325079365079364*G0_0_0_0_1 + 0.677248677248675*G0_0_0_0_2 + 0.325079365079364*G0_0_0_1_0 + 1.40867724867724*G0_0_0_1_1 + 0.568888888888886*G0_0_0_1_2 + 0.677248677248675*G0_0_0_2_0 + 0.568888888888886*G0_0_0_2_1 + 1.19195767195767*G0_0_0_2_2 + 0.0541798941798946*G0_0_1_0_0 + 0.0812698412698412*G0_0_1_0_1 + 0.0812698412698412*G0_0_1_1_0 + 0.893968253968249*G0_0_1_1_1 + 0.243809523809522*G0_0_1_1_2 + 0.243809523809522*G0_0_1_2_1 + 0.0270899470899474*G0_0_1_2_2 - 0.0541798941798942*G0_1_0_0_0 - 0.0812698412698407*G0_1_0_0_2 + 1.05650793650793*G0_1_0_1_1 + 0.297989417989416*G0_1_0_1_2 - 0.0812698412698407*G0_1_0_2_0 + 0.297989417989416*G0_1_0_2_1 + 0.189629629629628*G0_1_0_2_2 + 0.541798941798939*G0_1_1_0_0 + 0.839788359788356*G0_1_1_0_1 + 0.108359788359788*G0_1_1_0_2 + 0.839788359788356*G0_1_1_1_0 + 2.7089947089947*G0_1_1_1_1 + 0.514708994708992*G0_1_1_1_2 + 0.108359788359788*G0_1_1_2_0 + 0.514708994708992*G0_1_1_2_1 + 0.325079365079362*G0_1_1_2_2; + A[192] = A[208] + 0.866878306878302*G0_0_0_0_0 + 0.216719576719576*G0_0_0_0_2 - 0.866878306878302*G0_0_0_1_1 - 0.216719576719575*G0_0_0_1_2 + 0.216719576719576*G0_0_0_2_0 - 0.216719576719575*G0_0_0_2_1 + 0.216719576719575*G0_0_1_0_0 + 0.0541798941798941*G0_0_1_0_1 + 0.135449735449735*G0_0_1_0_2 + 0.0541798941798941*G0_0_1_1_0 - 0.650158730158726*G0_0_1_1_1 - 0.0812698412698405*G0_0_1_1_2 + 0.135449735449735*G0_0_1_2_0 - 0.0812698412698405*G0_0_1_2_1 + 0.216719576719576*G0_0_1_2_2 + 0.216719576719575*G0_1_0_0_0 + 0.0541798941798941*G0_1_0_0_1 + 0.135449735449735*G0_1_0_0_2 + 0.0541798941798941*G0_1_0_1_0 - 0.650158730158726*G0_1_0_1_1 - 0.0812698412698405*G0_1_0_1_2 + 0.135449735449735*G0_1_0_2_0 - 0.0812698412698405*G0_1_0_2_1 + 0.216719576719576*G0_1_0_2_2 + 1.08359788359788*G0_1_1_0_0 + 0.0541798941798939*G0_1_1_0_1 + 0.216719576719576*G0_1_1_0_2 + 0.0541798941798938*G0_1_1_1_0 - 1.51703703703703*G0_1_1_1_1 - 0.162539682539681*G0_1_1_1_2 + 0.216719576719576*G0_1_1_2_0 - 0.162539682539681*G0_1_1_2_1 + 0.216719576719577*G0_1_1_2_2; + A[185] = -A[188] - 0.0857848324514987*G0_0_1_0_0 + 0.0180599647266313*G0_0_1_0_1 - 0.045149911816578*G0_0_1_0_2 + 0.0180599647266313*G0_0_1_1_0 + 0.0496649029982361*G0_0_1_1_1 + 0.0451499118165781*G0_0_1_1_2 - 0.045149911816578*G0_0_1_2_0 + 0.0451499118165781*G0_0_1_2_1 + 0.41537918871252*G0_1_1_0_0 + 0.191887125220457*G0_1_1_0_1 - 0.0428924162257495*G0_1_1_0_2 + 0.191887125220458*G0_1_1_1_0 + 0.148994708994708*G0_1_1_1_1 + 0.0654673721340383*G0_1_1_1_2 - 0.0428924162257495*G0_1_1_2_0 + 0.0654673721340383*G0_1_1_2_1 - 0.0451499118165788*G0_1_1_2_2; + A[203] = -A[200] - 0.0496649029982368*G0_0_1_0_0 - 0.0180599647266315*G0_0_1_0_1 - 0.0451499118165786*G0_0_1_0_2 - 0.0180599647266315*G0_0_1_1_0 + 0.085784832451499*G0_0_1_1_1 + 0.0451499118165786*G0_0_1_1_2 - 0.0451499118165787*G0_0_1_2_0 + 0.0451499118165786*G0_0_1_2_1 + 0.0993298059964723*G0_1_1_0_0 + 0.173827160493826*G0_1_1_0_1 + 0.0203174603174601*G0_1_1_0_2 + 0.173827160493826*G0_1_1_1_0 + 0.501164021164019*G0_1_1_1_1 + 0.00225749559082901*G0_1_1_1_2 + 0.0203174603174601*G0_1_1_2_0 + 0.00225749559082901*G0_1_1_2_1 - 0.045149911816578*G0_1_1_2_2; + A[87] = -A[132] - 0.0857848324514987*G0_1_0_0_0 + 0.0180599647266313*G0_1_0_0_1 - 0.045149911816578*G0_1_0_0_2 + 0.0180599647266313*G0_1_0_1_0 + 0.0496649029982361*G0_1_0_1_1 + 0.0451499118165781*G0_1_0_1_2 - 0.045149911816578*G0_1_0_2_0 + 0.0451499118165781*G0_1_0_2_1 + 0.41537918871252*G0_1_1_0_0 + 0.191887125220457*G0_1_1_0_1 - 0.0428924162257495*G0_1_1_0_2 + 0.191887125220457*G0_1_1_1_0 + 0.148994708994708*G0_1_1_1_1 + 0.0654673721340383*G0_1_1_1_2 - 0.0428924162257495*G0_1_1_2_0 + 0.0654673721340383*G0_1_1_2_1 - 0.0451499118165787*G0_1_1_2_2; + A[224] = A[208] - 0.216719576719576*G0_0_0_0_0 - 0.216719576719576*G0_0_0_0_1 + 0.162539682539682*G0_0_0_0_2 - 0.216719576719576*G0_0_0_1_0 - 1.08359788359788*G0_0_0_1_1 - 0.054179894179893*G0_0_0_1_2 + 0.162539682539682*G0_0_0_2_0 - 0.054179894179893*G0_0_0_2_1 + 1.51703703703703*G0_0_0_2_2 - 0.0812698412698406*G0_0_1_0_1 + 0.0812698412698408*G0_0_1_0_2 - 0.0812698412698407*G0_0_1_1_0 - 0.866878306878302*G0_0_1_1_1 + 0.0812698412698408*G0_0_1_2_0 + 0.866878306878305*G0_0_1_2_2 - 0.0812698412698407*G0_1_0_0_1 + 0.0812698412698408*G0_1_0_0_2 - 0.0812698412698407*G0_1_0_1_0 - 0.866878306878302*G0_1_0_1_1 + 0.0812698412698408*G0_1_0_2_0 + 0.866878306878305*G0_1_0_2_2 + 0.216719576719576*G0_1_1_0_0 - 0.162539682539682*G0_1_1_0_1 + 0.216719576719576*G0_1_1_0_2 - 0.162539682539682*G0_1_1_1_0 - 1.51703703703703*G0_1_1_1_1 + 0.0541798941798942*G0_1_1_1_2 + 0.216719576719576*G0_1_1_2_0 + 0.0541798941798942*G0_1_1_2_1 + 1.08359788359788*G0_1_1_2_2; + A[114] = A[142] + 0.141093474426807*G0_0_1_0_0 - 0.0338624338624336*G0_0_1_0_1 - 0.0169312169312168*G0_0_1_0_2 - 0.0338624338624336*G0_0_1_1_0 - 0.0237037037037036*G0_0_1_1_1 - 0.00169312169312176*G0_0_1_1_2 - 0.0169312169312168*G0_0_1_2_0 - 0.00169312169312176*G0_0_1_2_1 - 0.0124162257495593*G0_0_1_2_2 - 0.141093474426807*G0_1_0_0_0 + 0.0338624338624336*G0_1_0_0_1 + 0.0169312169312168*G0_1_0_0_2 + 0.0338624338624336*G0_1_0_1_0 + 0.0237037037037036*G0_1_0_1_1 + 0.00169312169312176*G0_1_0_1_2 + 0.0169312169312168*G0_1_0_2_0 + 0.00169312169312176*G0_1_0_2_1 + 0.0124162257495593*G0_1_0_2_2; + A[221] = -A[213] + 0.0993298059964719*G0_0_0_0_0 + 0.0203174603174602*G0_0_0_0_1 + 0.173827160493826*G0_0_0_0_2 + 0.0203174603174602*G0_0_0_1_0 - 0.0451499118165788*G0_0_0_1_1 + 0.00225749559082884*G0_0_0_1_2 + 0.173827160493826*G0_0_0_2_0 + 0.00225749559082885*G0_0_0_2_1 + 0.501164021164018*G0_0_0_2_2 - 0.0496649029982366*G0_1_0_0_0 - 0.0451499118165783*G0_1_0_0_1 - 0.0180599647266314*G0_1_0_0_2 - 0.0451499118165783*G0_1_0_1_0 + 0.0451499118165784*G0_1_0_1_2 - 0.0180599647266314*G0_1_0_2_0 + 0.0451499118165785*G0_1_0_2_1 + 0.085784832451499*G0_1_0_2_2; + A[179] = A[221] - 0.0270899470899474*G0_0_1_0_0 - 0.0383774250440916*G0_0_1_0_1 - 0.00225749559082903*G0_0_1_0_2 - 0.0383774250440916*G0_0_1_1_0 + 0.0451499118165785*G0_0_1_1_1 + 0.0158024691358023*G0_0_1_1_2 - 0.00225749559082903*G0_0_1_2_0 + 0.0158024691358023*G0_0_1_2_1 + 0.0316049382716046*G0_0_1_2_2 + 0.0270899470899474*G0_1_0_0_0 + 0.0383774250440916*G0_1_0_0_1 + 0.00225749559082903*G0_1_0_0_2 + 0.0383774250440916*G0_1_0_1_0 - 0.0451499118165785*G0_1_0_1_1 - 0.0158024691358023*G0_1_0_1_2 + 0.00225749559082903*G0_1_0_2_0 - 0.0158024691358023*G0_1_0_2_1 - 0.0316049382716046*G0_1_0_2_2; + A[59] = -A[179] + 0.0993298059964719*G0_0_0_0_0 + 0.0203174603174602*G0_0_0_0_1 + 0.173827160493826*G0_0_0_0_2 + 0.0203174603174602*G0_0_0_1_0 - 0.0451499118165788*G0_0_0_1_1 + 0.00225749559082883*G0_0_0_1_2 + 0.173827160493826*G0_0_0_2_0 + 0.00225749559082884*G0_0_0_2_1 + 0.501164021164018*G0_0_0_2_2 - 0.0496649029982366*G0_0_1_0_0 - 0.0451499118165783*G0_0_1_0_1 - 0.0180599647266314*G0_0_1_0_2 - 0.0451499118165783*G0_0_1_1_0 + 0.0451499118165784*G0_0_1_1_2 - 0.0180599647266314*G0_0_1_2_0 + 0.0451499118165784*G0_0_1_2_1 + 0.085784832451499*G0_0_1_2_2; + A[196] = A[28] + 0.0028218694885362*G0_0_1_0_0 - 0.00987654320987643*G0_0_1_0_1 - 0.00987654320987643*G0_0_1_1_0 + 0.00987654320987648*G0_0_1_1_2 + 0.00987654320987648*G0_0_1_2_1 - 0.00282186948853623*G0_0_1_2_2 - 0.0028218694885362*G0_1_0_0_0 + 0.00987654320987643*G0_1_0_0_1 + 0.00987654320987643*G0_1_0_1_0 - 0.00987654320987648*G0_1_0_1_2 - 0.00987654320987648*G0_1_0_2_1 + 0.00282186948853623*G0_1_0_2_2; + A[209] = A[223] + 0.108359788359789*G0_0_1_0_0 + 0.0812698412698414*G0_0_1_0_1 + 0.0812698412698413*G0_0_1_0_2 + 0.0812698412698414*G0_0_1_1_0 - 0.162539682539682*G0_0_1_1_1 - 0.0541798941798942*G0_0_1_1_2 + 0.0812698412698413*G0_0_1_2_0 - 0.0541798941798942*G0_0_1_2_1 - 0.162539682539681*G0_0_1_2_2 - 0.108359788359789*G0_1_0_0_0 - 0.0812698412698414*G0_1_0_0_1 - 0.0812698412698413*G0_1_0_0_2 - 0.0812698412698414*G0_1_0_1_0 + 0.162539682539682*G0_1_0_1_1 + 0.0541798941798943*G0_1_0_1_2 - 0.0812698412698413*G0_1_0_2_0 + 0.0541798941798944*G0_1_0_2_1 + 0.162539682539681*G0_1_0_2_2; + A[13] = A[195] + 0.00141093474426803*G0_0_1_0_1 - 0.00141093474426806*G0_0_1_0_2 + 0.00141093474426803*G0_0_1_1_0 - 0.0129805996472663*G0_0_1_1_1 + 0.00451499118165779*G0_0_1_1_2 - 0.00141093474426805*G0_0_1_2_0 + 0.00451499118165779*G0_0_1_2_1 + 0.00395061728395065*G0_0_1_2_2 - 0.00141093474426803*G0_1_0_0_1 + 0.00141093474426805*G0_1_0_0_2 - 0.00141093474426803*G0_1_0_1_0 + 0.0129805996472663*G0_1_0_1_1 - 0.00451499118165779*G0_1_0_1_2 + 0.00141093474426805*G0_1_0_2_0 - 0.00451499118165779*G0_1_0_2_1 - 0.00395061728395065*G0_1_0_2_2; + A[53] = A[123] + 0.0135449735449736*G0_0_1_0_0 + 0.0203174603174602*G0_0_1_0_2 + 0.00902998236331499*G0_0_1_1_1 + 0.00225749559082872*G0_0_1_1_2 + 0.0203174603174602*G0_0_1_2_0 + 0.00225749559082872*G0_0_1_2_1 - 0.0677248677248678*G0_0_1_2_2 - 0.0135449735449736*G0_1_0_0_0 - 0.0203174603174602*G0_1_0_0_2 - 0.00902998236331499*G0_1_0_1_1 - 0.00225749559082872*G0_1_0_1_2 - 0.0203174603174602*G0_1_0_2_0 - 0.00225749559082872*G0_1_0_2_1 + 0.0677248677248678*G0_1_0_2_2; + A[30] = -A[31] + 0.022716049382716*G0_1_0_0_0 - 0.0020811287477954*G0_1_0_0_2 - 0.0227160493827161*G0_1_0_1_1 + 0.0020811287477954*G0_1_0_1_2 - 0.0020811287477954*G0_1_0_2_0 + 0.0020811287477954*G0_1_0_2_1 + 0.0231922398589064*G0_1_1_0_0 + 0.00231922398589064*G0_1_1_0_1 + 0.000238095238095254*G0_1_1_0_2 + 0.00231922398589064*G0_1_1_1_0 + 0.000476190476190448*G0_1_1_1_1 + 0.00231922398589066*G0_1_1_1_2 + 0.000238095238095254*G0_1_1_2_0 + 0.00231922398589066*G0_1_1_2_1 + 0.0231922398589066*G0_1_1_2_2; + A[23] = A[21] - 0.0338624338624336*G0_0_0_0_0 + 0.00197530864197531*G0_0_0_0_1 - 0.0047971781305114*G0_0_0_0_2 + 0.00197530864197531*G0_0_0_1_0 - 0.00197530864197528*G0_0_0_1_2 - 0.00479717813051139*G0_0_0_2_0 - 0.00197530864197528*G0_0_0_2_1 + 0.0434567901234566*G0_0_0_2_2 + 0.00959435626102304*G0_0_1_0_0 - 0.00959435626102288*G0_0_1_0_2 - 0.00959435626102288*G0_0_1_2_0 + 0.00959435626102282*G0_0_1_2_2; + A[20] = -A[23] - 0.00197530864197541*G0_0_1_0_0 + 0.0136860670194003*G0_0_1_0_1 - 0.00183421516754853*G0_0_1_0_2 + 0.0136860670194003*G0_0_1_1_0 + 0.131216931216931*G0_0_1_1_1 + 0.00888888888888886*G0_0_1_1_2 - 0.00183421516754853*G0_0_1_2_0 + 0.00888888888888886*G0_0_1_2_1 + 0.0324514991181655*G0_0_1_2_2; + A[70] = A[20] - 0.00395061728395048*G0_0_0_0_0 + 0.00917107583774251*G0_0_0_0_1 + 0.00888888888888883*G0_0_0_0_2 + 0.00917107583774251*G0_0_0_1_0 - 0.00677248677248678*G0_0_0_1_1 + 0.0074779541446206*G0_0_0_1_2 + 0.00888888888888883*G0_0_0_2_0 + 0.0074779541446206*G0_0_0_2_1 + 0.052768959435626*G0_0_0_2_2 + 0.0179188712522044*G0_0_1_0_0 + 0.0173544973544971*G0_0_1_0_1 + 0.0173544973544971*G0_0_1_1_0 - 0.112169312169312*G0_0_1_1_1 + 0.0214462081128745*G0_0_1_1_2 + 0.0214462081128746*G0_0_1_2_1 + 0.0102998236331567*G0_0_1_2_2 + 0.0105820105820104*G0_1_0_0_0 + 0.0385185185185184*G0_1_0_0_1 - 0.00677248677248675*G0_1_0_0_2 + 0.0385185185185184*G0_1_0_1_0 + 0.0232804232804222*G0_1_0_1_1 + 0.0397883597883594*G0_1_0_1_2 - 0.00677248677248675*G0_1_0_2_0 + 0.0397883597883594*G0_1_0_2_1 + 0.0198941798941795*G0_1_0_2_2 + 0.0397883597883595*G0_1_1_0_0 + 0.0698412698412694*G0_1_1_0_1 - 0.00380952380952387*G0_1_1_0_2 + 0.0698412698412694*G0_1_1_1_0 + 0.0423280423280413*G0_1_1_1_1 + 0.0698412698412693*G0_1_1_1_2 - 0.00380952380952387*G0_1_1_2_0 + 0.0698412698412693*G0_1_1_2_1 + 0.0397883597883594*G0_1_1_2_2; + A[157] = A[70] + 0.0118518518518514*G0_0_0_0_0 + 0.00931216931216917*G0_0_0_0_2 - 0.0118518518518516*G0_0_0_1_1 - 0.00931216931216907*G0_0_0_1_2 + 0.00931216931216918*G0_0_0_2_0 - 0.00931216931216907*G0_0_0_2_1 - 0.037248677248676*G0_0_1_0_0 - 0.0584126984126977*G0_0_1_0_1 - 0.031322751322751*G0_0_1_0_2 - 0.0584126984126977*G0_0_1_1_0 - 0.0355555555555552*G0_0_1_1_1 - 0.0224338624338621*G0_0_1_1_2 - 0.031322751322751*G0_0_1_2_0 - 0.0224338624338621*G0_0_1_2_1 - 0.0457142857142855*G0_0_1_2_2 - 0.0237037037037036*G0_1_0_0_0 - 0.0584126984126981*G0_1_0_0_1 - 0.0131216931216933*G0_1_0_0_2 - 0.0584126984126981*G0_1_0_1_0 - 0.049100529100528*G0_1_0_1_1 - 0.0406349206349202*G0_1_0_1_2 - 0.0131216931216933*G0_1_0_2_0 - 0.0406349206349202*G0_1_0_2_1 - 0.0457142857142857*G0_1_0_2_2 - 0.0338624338624328*G0_1_1_0_0 - 0.0584126984126979*G0_1_1_0_1 + 0.013968253968254*G0_1_1_0_2 - 0.0584126984126979*G0_1_1_1_0 - 0.0389417989417981*G0_1_1_1_1 - 0.0677248677248672*G0_1_1_1_2 + 0.013968253968254*G0_1_1_2_0 - 0.0677248677248672*G0_1_1_2_1 - 0.0457142857142855*G0_1_1_2_2; + A[154] = A[70] - 0.0093121693121693*G0_0_1_0_0 + 0.00846560846560862*G0_0_1_0_1 - 0.00973544973544961*G0_0_1_0_2 + 0.00846560846560861*G0_0_1_1_0 + 0.00423280423280341*G0_0_1_1_1 + 0.00846560846560836*G0_0_1_1_2 - 0.00973544973544961*G0_0_1_2_0 + 0.00846560846560834*G0_0_1_2_1 - 0.00931216931216905*G0_0_1_2_2 + 0.0093121693121693*G0_1_0_0_0 - 0.00846560846560862*G0_1_0_0_1 + 0.00973544973544961*G0_1_0_0_2 - 0.00846560846560862*G0_1_0_1_0 - 0.00423280423280349*G0_1_0_1_1 - 0.00846560846560836*G0_1_0_1_2 + 0.00973544973544961*G0_1_0_2_0 - 0.00846560846560835*G0_1_0_2_1 + 0.00931216931216904*G0_1_0_2_2; + A[5] = -A[20] - 0.0146737213403879*G0_0_0_0_0 - 0.0107231040564373*G0_0_0_0_2 + 0.0146737213403878*G0_0_0_1_1 + 0.0107231040564373*G0_0_0_1_2 - 0.0107231040564373*G0_0_0_2_0 + 0.0107231040564373*G0_0_0_2_1 - 0.0107231040564372*G0_0_1_0_0 + 0.0107231040564374*G0_0_1_0_1 + 0.0107231040564374*G0_0_1_1_0 + 0.137142857142857*G0_0_1_1_1 + 0.0214462081128746*G0_0_1_1_2 + 0.0214462081128746*G0_0_1_2_1 + 0.0547442680776009*G0_0_1_2_2 - 0.0126984126984126*G0_1_0_0_0 - 0.000987654320987642*G0_1_0_0_1 - 0.00395061728395058*G0_1_0_0_2 - 0.000987654320987642*G0_1_0_1_0 + 0.00197530864197531*G0_1_0_1_1 + 0.00677248677248675*G0_1_0_1_2 - 0.00395061728395058*G0_1_0_2_0 + 0.00677248677248675*G0_1_0_2_1 + 0.0493827160493829*G0_1_0_2_2 - 0.0126984126984125*G0_1_1_0_0 - 0.00197530864197526*G0_1_1_0_1 - 0.00296296296296295*G0_1_1_0_2 - 0.00197530864197526*G0_1_1_1_0 + 0.00592592592592605*G0_1_1_1_1 + 0.0115696649029981*G0_1_1_1_2 - 0.00296296296296295*G0_1_1_2_0 + 0.0115696649029981*G0_1_1_2_1 + 0.0358377425044089*G0_1_1_2_2; + A[8] = -A[5] - 0.131216931216931*G0_0_1_0_0 - 0.0136860670194003*G0_0_1_0_1 - 0.00888888888888886*G0_0_1_0_2 - 0.0136860670194003*G0_0_1_1_0 + 0.00197530864197535*G0_0_1_1_1 + 0.00183421516754843*G0_0_1_1_2 - 0.00888888888888886*G0_0_1_2_0 + 0.00183421516754843*G0_0_1_2_1 - 0.0324514991181658*G0_0_1_2_2 - 0.131216931216931*G0_1_1_0_0 - 0.0136860670194003*G0_1_1_0_1 - 0.00888888888888888*G0_1_1_0_2 - 0.0136860670194003*G0_1_1_1_0 + 0.00197530864197538*G0_1_1_1_1 + 0.00183421516754841*G0_1_1_1_2 - 0.00888888888888888*G0_1_1_2_0 + 0.00183421516754841*G0_1_1_2_1 - 0.032451499118166*G0_1_1_2_2; + A[109] = A[70] + 0.0457142857142855*G0_0_0_0_0 - 0.0139682539682539*G0_0_0_0_1 + 0.0677248677248676*G0_0_0_0_2 - 0.0139682539682539*G0_0_0_1_0 + 0.033862433862434*G0_0_0_1_1 + 0.0584126984126984*G0_0_0_1_2 + 0.0677248677248676*G0_0_0_2_0 + 0.0584126984126984*G0_0_0_2_1 + 0.0389417989418006*G0_0_0_2_2 - 0.0270899470899466*G0_0_1_0_1 + 0.0270899470899473*G0_0_1_0_2 - 0.0270899470899466*G0_0_1_1_0 + 0.0101587301587315*G0_0_1_1_1 + 0.0270899470899473*G0_0_1_2_0 - 0.0101587301587284*G0_0_1_2_2 - 0.0452910052910052*G0_1_0_0_1 + 0.0452910052910051*G0_1_0_0_2 - 0.0452910052910052*G0_1_0_1_0 - 0.00338624338624253*G0_1_0_1_1 + 0.0452910052910051*G0_1_0_2_0 + 0.00338624338624464*G0_1_0_2_2 - 0.0457142857142863*G0_1_1_0_0 - 0.0677248677248674*G0_1_1_0_1 + 0.0139682539682539*G0_1_1_0_2 - 0.0677248677248674*G0_1_1_1_0 - 0.0389417989417973*G0_1_1_1_1 - 0.0584126984126979*G0_1_1_1_2 + 0.0139682539682539*G0_1_1_2_0 - 0.0584126984126979*G0_1_1_2_1 - 0.0338624338624326*G0_1_1_2_2; + A[45] = A[5] - 0.00197530864197531*G0_0_0_0_1 + 0.00197530864197531*G0_0_0_0_2 - 0.00197530864197531*G0_0_0_1_0 + 0.0338624338624336*G0_0_0_1_1 + 0.00479717813051143*G0_0_0_1_2 + 0.00197530864197531*G0_0_0_2_0 + 0.00479717813051143*G0_0_0_2_1 - 0.0434567901234565*G0_0_0_2_2 - 0.000987654320987667*G0_0_1_0_1 + 0.000987654320987666*G0_0_1_0_2 - 0.000987654320987668*G0_0_1_1_0 + 0.0299118165784829*G0_0_1_1_1 + 0.000987654320987665*G0_0_1_2_0 - 0.0299118165784828*G0_0_1_2_2 - 0.00296296296296295*G0_1_0_0_1 + 0.00296296296296293*G0_1_0_0_2 - 0.00296296296296295*G0_1_0_1_0 + 0.0474074074074073*G0_1_0_1_1 + 0.00296296296296293*G0_1_0_2_0 - 0.0474074074074074*G0_1_0_2_2 - 0.00197530864197531*G0_1_1_0_1 + 0.0019753086419753*G0_1_1_0_2 - 0.00197530864197531*G0_1_1_1_0 + 0.0434567901234565*G0_1_1_1_1 - 0.00479717813051142*G0_1_1_1_2 + 0.0019753086419753*G0_1_1_2_0 - 0.00479717813051142*G0_1_1_2_1 - 0.0338624338624336*G0_1_1_2_2; + A[165] = -A[45] - 0.131216931216931*G0_0_0_0_0 - 0.00888888888888889*G0_0_0_0_1 - 0.0136860670194003*G0_0_0_0_2 - 0.00888888888888889*G0_0_0_1_0 - 0.0324514991181658*G0_0_0_1_1 + 0.00183421516754849*G0_0_0_1_2 - 0.0136860670194003*G0_0_0_2_0 + 0.00183421516754849*G0_0_0_2_1 + 0.00197530864197539*G0_0_0_2_2 - 0.131216931216931*G0_0_1_0_0 - 0.00888888888888886*G0_0_1_0_1 - 0.0136860670194003*G0_0_1_0_2 - 0.00888888888888886*G0_0_1_1_0 - 0.0324514991181657*G0_0_1_1_1 + 0.00183421516754847*G0_0_1_1_2 - 0.0136860670194003*G0_0_1_2_0 + 0.00183421516754847*G0_0_1_2_1 + 0.00197530864197544*G0_0_1_2_2; + A[75] = A[5] + 0.000987654320987648*G0_0_1_0_1 - 0.000987654320987633*G0_0_1_0_2 + 0.000987654320987648*G0_0_1_1_0 - 0.00395061728395065*G0_0_1_1_1 - 0.00479717813051138*G0_0_1_1_2 - 0.000987654320987634*G0_0_1_2_0 - 0.00479717813051138*G0_0_1_2_1 + 0.0135449735449739*G0_0_1_2_2 - 0.000987654320987648*G0_1_0_0_1 + 0.000987654320987632*G0_1_0_0_2 - 0.000987654320987648*G0_1_0_1_0 + 0.00395061728395065*G0_1_0_1_1 + 0.00479717813051138*G0_1_0_1_2 + 0.000987654320987634*G0_1_0_2_0 + 0.00479717813051138*G0_1_0_2_1 - 0.0135449735449739*G0_1_0_2_2; + A[120] = -A[75] - 0.131216931216931*G0_1_0_0_0 - 0.0136860670194003*G0_1_0_0_1 - 0.00888888888888886*G0_1_0_0_2 - 0.0136860670194003*G0_1_0_1_0 + 0.00197530864197535*G0_1_0_1_1 + 0.00183421516754843*G0_1_0_1_2 - 0.00888888888888886*G0_1_0_2_0 + 0.00183421516754843*G0_1_0_2_1 - 0.0324514991181658*G0_1_0_2_2 - 0.131216931216931*G0_1_1_0_0 - 0.0136860670194003*G0_1_1_0_1 - 0.00888888888888888*G0_1_1_0_2 - 0.0136860670194003*G0_1_1_1_0 + 0.00197530864197538*G0_1_1_1_1 + 0.00183421516754841*G0_1_1_1_2 - 0.00888888888888888*G0_1_1_2_0 + 0.00183421516754841*G0_1_1_2_1 - 0.032451499118166*G0_1_1_2_2; + A[24] = -A[20] - 0.07026455026455*G0_0_0_0_0 - 0.00493827160493828*G0_0_0_0_1 - 0.0165079365079364*G0_0_0_0_2 - 0.00493827160493828*G0_0_0_1_0 - 0.105820105820106*G0_0_0_1_1 - 0.00776014109347441*G0_0_0_1_2 - 0.0165079365079364*G0_0_0_2_0 - 0.00776014109347441*G0_0_0_2_1 - 0.0533333333333331*G0_0_0_2_2 - 0.0169312169312168*G0_0_1_0_0 + 0.00282186948853617*G0_0_1_0_1 + 0.00282186948853617*G0_0_1_1_0 - 0.00282186948853613*G0_0_1_1_2 - 0.00282186948853613*G0_0_1_2_1 + 0.0169312169312168*G0_0_1_2_2; + A[67] = A[109] - 0.00931216931217012*G0_0_1_0_0 - 0.00973544973544998*G0_0_1_0_1 + 0.00846560846560821*G0_0_1_0_2 - 0.00973544973544998*G0_0_1_1_0 - 0.00931216931217054*G0_0_1_1_1 + 0.008465608465608*G0_0_1_1_2 + 0.0084656084656082*G0_0_1_2_0 + 0.008465608465608*G0_0_1_2_1 + 0.00423280423280406*G0_0_1_2_2 + 0.00931216931217013*G0_1_0_0_0 + 0.00973544973544998*G0_1_0_0_1 - 0.00846560846560821*G0_1_0_0_2 + 0.00973544973544998*G0_1_0_1_0 + 0.00931216931217053*G0_1_0_1_1 - 0.008465608465608*G0_1_0_1_2 - 0.00846560846560819*G0_1_0_2_0 - 0.008465608465608*G0_1_0_2_1 - 0.00423280423280403*G0_1_0_2_2; + A[3] = A[45] - 0.00098765432098764*G0_0_1_0_1 + 0.000987654320987631*G0_0_1_0_2 - 0.000987654320987638*G0_0_1_1_0 + 0.0135449735449737*G0_0_1_1_1 - 0.0047971781305114*G0_0_1_1_2 + 0.000987654320987631*G0_0_1_2_0 - 0.0047971781305114*G0_0_1_2_1 - 0.00395061728395073*G0_0_1_2_2 + 0.000987654320987638*G0_1_0_0_1 - 0.000987654320987631*G0_1_0_0_2 + 0.000987654320987638*G0_1_0_1_0 - 0.0135449735449738*G0_1_0_1_1 + 0.0047971781305114*G0_1_0_1_2 - 0.000987654320987631*G0_1_0_2_0 + 0.00479717813051141*G0_1_0_2_1 + 0.00395061728395073*G0_1_0_2_2; + A[11] = -A[3] - 0.131216931216931*G0_0_0_0_0 - 0.00888888888888889*G0_0_0_0_1 - 0.0136860670194003*G0_0_0_0_2 - 0.00888888888888889*G0_0_0_1_0 - 0.0324514991181658*G0_0_0_1_1 + 0.00183421516754849*G0_0_0_1_2 - 0.0136860670194003*G0_0_0_2_0 + 0.00183421516754849*G0_0_0_2_1 + 0.00197530864197539*G0_0_0_2_2 - 0.131216931216931*G0_1_0_0_0 - 0.00888888888888886*G0_1_0_0_1 - 0.0136860670194003*G0_1_0_0_2 - 0.00888888888888886*G0_1_0_1_0 - 0.0324514991181657*G0_1_0_1_1 + 0.00183421516754847*G0_1_0_1_2 - 0.0136860670194003*G0_1_0_2_0 + 0.00183421516754848*G0_1_0_2_1 + 0.00197530864197544*G0_1_0_2_2; + A[115] = A[157] + 0.00423280423280309*G0_0_1_0_0 + 0.00846560846560824*G0_0_1_0_1 + 0.00846560846560807*G0_0_1_0_2 + 0.00846560846560824*G0_0_1_1_0 - 0.0093121693121694*G0_0_1_1_1 - 0.00973544973544971*G0_0_1_1_2 + 0.00846560846560807*G0_0_1_2_0 - 0.00973544973544971*G0_0_1_2_1 - 0.0093121693121693*G0_0_1_2_2 - 0.00423280423280303*G0_1_0_0_0 - 0.00846560846560824*G0_1_0_0_1 - 0.00846560846560805*G0_1_0_0_2 - 0.00846560846560823*G0_1_0_1_0 + 0.0093121693121694*G0_1_0_1_1 + 0.00973544973544972*G0_1_0_1_2 - 0.00846560846560806*G0_1_0_2_0 + 0.00973544973544971*G0_1_0_2_1 + 0.00931216931216931*G0_1_0_2_2; + A[128] = -A[125] - 0.0225749559082891*G0_0_1_0_0 - 0.0112874779541445*G0_0_1_0_1 - 0.0451499118165784*G0_0_1_0_2 - 0.0112874779541445*G0_0_1_1_0 - 0.0225749559082889*G0_0_1_1_1 - 0.0451499118165783*G0_0_1_1_2 - 0.0451499118165784*G0_0_1_2_0 - 0.0451499118165783*G0_0_1_2_1 + 0.248324514991179*G0_0_1_2_2 + 0.316049382716048*G0_1_1_0_0 + 0.101587301587301*G0_1_1_0_1 + 0.158024691358024*G0_1_1_0_2 + 0.101587301587301*G0_1_1_1_0 + 0.0902998236331569*G0_1_1_1_1 + 0.056437389770723*G0_1_1_1_2 + 0.158024691358024*G0_1_1_2_0 + 0.056437389770723*G0_1_1_2_1 + 0.654673721340386*G0_1_1_2_2; + A[104] = -A[128] + 0.0632098765432094*G0_0_0_0_0 + 0.0248324514991181*G0_0_0_0_1 + 0.137707231040564*G0_0_0_0_2 + 0.0248324514991181*G0_0_0_1_0 + 0.0902998236331566*G0_0_0_1_1 + 0.246067019400352*G0_0_0_1_2 + 0.137707231040564*G0_0_0_2_0 + 0.246067019400352*G0_0_0_2_1 + 1.94144620811286*G0_0_0_2_2 - 0.106102292768959*G0_0_1_0_0 - 0.029347442680776*G0_0_1_0_2 + 0.0925573192239851*G0_0_1_1_1 + 0.189629629629629*G0_0_1_1_2 - 0.029347442680776*G0_0_1_2_0 + 0.189629629629629*G0_0_1_2_1 + 1.21679012345678*G0_0_1_2_2 - 0.151252204585538*G0_1_0_0_0 - 0.0067724867724868*G0_1_0_0_1 - 0.0067724867724868*G0_1_0_1_0 + 0.0699823633156962*G0_1_0_1_1 + 0.173827160493826*G0_1_0_1_2 + 0.173827160493826*G0_1_0_2_1 + 1.27097001763668*G0_1_0_2_2 - 0.0225749559082901*G0_1_1_0_0 + 0.0203174603174601*G0_1_1_0_1 + 0.0925573192239858*G0_1_1_0_2 + 0.0203174603174601*G0_1_1_1_0 + 0.117389770723103*G0_1_1_1_1 + 0.200917107583773*G0_1_1_1_2 + 0.0925573192239858*G0_1_1_2_0 + 0.200917107583773*G0_1_1_2_1 + 1.2416225749559*G0_1_1_2_2; + A[216] = A[104] - 0.045149911816579*G0_0_1_0_0 - 0.00677248677248667*G0_0_1_0_1 + 0.0293474426807759*G0_0_1_0_2 - 0.00677248677248666*G0_0_1_1_0 - 0.0225749559082889*G0_0_1_1_1 - 0.0158024691358025*G0_0_1_1_2 + 0.029347442680776*G0_0_1_2_0 - 0.0158024691358025*G0_0_1_2_1 + 0.0541798941798947*G0_0_1_2_2 + 0.045149911816579*G0_1_0_0_0 + 0.00677248677248667*G0_1_0_0_1 - 0.029347442680776*G0_1_0_0_2 + 0.00677248677248667*G0_1_0_1_0 + 0.0225749559082889*G0_1_0_1_1 + 0.0158024691358025*G0_1_0_1_2 - 0.029347442680776*G0_1_0_2_0 + 0.0158024691358025*G0_1_0_2_1 - 0.0541798941798945*G0_1_0_2_2; + A[148] = A[216] - 0.316049382716048*G0_0_0_0_0 - 0.0564373897707228*G0_0_0_0_1 - 0.0564373897707229*G0_0_0_0_2 - 0.0564373897707228*G0_0_0_1_0 + 0.225749559082891*G0_0_0_1_1 - 0.0112874779541448*G0_0_0_1_2 - 0.0564373897707229*G0_0_0_2_0 - 0.0112874779541448*G0_0_0_2_1 - 0.338624338624338*G0_0_0_2_2 - 0.00451499118165761*G0_0_1_0_1 + 0.00451499118165783*G0_0_1_0_2 - 0.00451499118165761*G0_0_1_1_0 + 0.320564373897706*G0_0_1_1_1 + 0.00451499118165783*G0_0_1_2_0 - 0.320564373897706*G0_0_1_2_2 - 0.0406349206349201*G0_1_0_0_1 + 0.0406349206349206*G0_1_0_0_2 - 0.0406349206349201*G0_1_0_1_0 + 0.243809523809523*G0_1_0_1_1 + 0.0406349206349206*G0_1_0_2_0 - 0.243809523809522*G0_1_0_2_2 + 0.316049382716049*G0_1_1_0_0 + 0.056437389770723*G0_1_1_0_1 + 0.0564373897707229*G0_1_1_0_2 + 0.056437389770723*G0_1_1_1_0 + 0.338624338624337*G0_1_1_1_1 + 0.0112874779541447*G0_1_1_1_2 + 0.0564373897707229*G0_1_1_2_0 + 0.0112874779541447*G0_1_1_2_1 - 0.225749559082891*G0_1_1_2_2; + A[204] = A[148] + 0.0451499118165779*G0_0_1_0_0 - 0.0293474426807758*G0_0_1_0_1 + 0.0067724867724868*G0_0_1_0_2 - 0.0293474426807758*G0_0_1_1_0 - 0.0541798941798939*G0_0_1_1_1 + 0.0158024691358026*G0_0_1_1_2 + 0.00677248677248679*G0_0_1_2_0 + 0.0158024691358026*G0_0_1_2_1 + 0.0225749559082893*G0_0_1_2_2 - 0.0451499118165779*G0_1_0_0_0 + 0.0293474426807758*G0_1_0_0_1 - 0.0067724867724868*G0_1_0_0_2 + 0.0293474426807758*G0_1_0_1_0 + 0.0541798941798939*G0_1_0_1_1 - 0.0158024691358026*G0_1_0_1_2 - 0.00677248677248679*G0_1_0_2_0 - 0.0158024691358026*G0_1_0_2_1 - 0.0225749559082893*G0_1_0_2_2; + A[63] = -A[71] - 0.0474074074074072*G0_0_0_0_0 - 0.0310405643738976*G0_0_0_0_1 - 0.0936860670193999*G0_0_0_0_2 - 0.0310405643738976*G0_0_0_1_0 + 0.0112874779541441*G0_0_0_1_1 - 0.0112874779541447*G0_0_0_1_2 - 0.0936860670193999*G0_0_0_2_0 - 0.0112874779541447*G0_0_0_2_1 - 0.419894179894177*G0_0_0_2_2 - 0.0169312169312168*G0_1_0_0_0 + 0.0112874779541448*G0_1_0_0_1 + 0.019753086419753*G0_1_0_0_2 + 0.0112874779541448*G0_1_0_1_0 + 0.592592592592592*G0_1_0_1_1 + 0.191887125220458*G0_1_0_1_2 + 0.019753086419753*G0_1_0_2_0 + 0.191887125220458*G0_1_0_2_1 + 0.0959435626102291*G0_1_0_2_2; + A[140] = -A[143] + 0.0767548500881832*G0_0_1_0_0 - 0.0248324514991179*G0_0_1_0_1 + 0.00451499118165789*G0_0_1_0_2 - 0.0248324514991179*G0_0_1_1_0 - 0.027089947089947*G0_0_1_1_1 - 0.00451499118165766*G0_0_1_1_2 + 0.00451499118165789*G0_0_1_2_0 - 0.00451499118165766*G0_0_1_2_1 - 0.194144620811286*G0_1_1_0_0 - 0.0632098765432094*G0_1_1_0_1 + 0.0203174603174603*G0_1_1_0_2 - 0.0632098765432094*G0_1_1_1_0 - 0.0406349206349205*G0_1_1_1_1 - 0.0090299823633156*G0_1_1_1_2 + 0.0203174603174603*G0_1_1_2_0 - 0.0090299823633156*G0_1_1_2_1; + A[77] = -A[122] - 0.0663139329805993*G0_1_1_0_0 - 0.0331569664902997*G0_1_1_0_1 - 0.020458553791887*G0_1_1_0_2 - 0.0331569664902997*G0_1_1_1_0 - 0.0663139329805996*G0_1_1_1_1 - 0.0204585537918871*G0_1_1_1_2 - 0.020458553791887*G0_1_1_2_0 - 0.0204585537918871*G0_1_1_2_1 - 0.244091710758376*G0_1_1_2_2; + A[171] = -A[51] - 0.194144620811286*G0_0_0_0_0 + 0.0203174603174603*G0_0_0_0_1 - 0.0632098765432093*G0_0_0_0_2 + 0.0203174603174603*G0_0_0_1_0 - 0.00902998236331574*G0_0_0_1_2 - 0.0632098765432093*G0_0_0_2_0 - 0.00902998236331574*G0_0_0_2_1 - 0.0406349206349201*G0_0_0_2_2 + 0.0767548500881844*G0_0_1_0_0 + 0.00451499118165796*G0_0_1_0_1 - 0.0248324514991179*G0_0_1_0_2 + 0.00451499118165796*G0_0_1_1_0 - 0.00451499118165784*G0_0_1_1_2 - 0.0248324514991179*G0_0_1_2_0 - 0.00451499118165784*G0_0_1_2_1 - 0.027089947089947*G0_0_1_2_2; + A[101] = A[171] - 0.0677248677248683*G0_0_1_0_0 + 0.00225749559082874*G0_0_1_0_1 + 0.0203174603174601*G0_0_1_0_2 + 0.00225749559082875*G0_0_1_1_0 + 0.00902998236331558*G0_0_1_1_1 + 0.0203174603174601*G0_0_1_2_0 + 0.0135449735449735*G0_0_1_2_2 + 0.0677248677248683*G0_1_0_0_0 - 0.00225749559082875*G0_1_0_0_1 - 0.0203174603174601*G0_1_0_0_2 - 0.00225749559082875*G0_1_0_1_0 - 0.00902998236331558*G0_1_0_1_1 - 0.0203174603174601*G0_1_0_2_0 - 0.0135449735449735*G0_1_0_2_2; + A[93] = -A[101] - 0.194144620811286*G0_0_0_0_0 + 0.0203174603174603*G0_0_0_0_1 - 0.0632098765432093*G0_0_0_0_2 + 0.0203174603174603*G0_0_0_1_0 - 0.00902998236331574*G0_0_0_1_2 - 0.0632098765432093*G0_0_0_2_0 - 0.00902998236331574*G0_0_0_2_1 - 0.0406349206349201*G0_0_0_2_2 + 0.0767548500881844*G0_1_0_0_0 + 0.00451499118165796*G0_1_0_0_1 - 0.0248324514991179*G0_1_0_0_2 + 0.00451499118165795*G0_1_0_1_0 - 0.00451499118165784*G0_1_0_1_2 - 0.0248324514991179*G0_1_0_2_0 - 0.00451499118165785*G0_1_0_2_1 - 0.027089947089947*G0_1_0_2_2; + A[152] = A[40] - 0.00522045855379179*G0_0_1_0_0 + 0.000105820105820098*G0_0_1_0_2 + 0.00522045855379182*G0_0_1_1_1 - 0.00010582010582011*G0_0_1_1_2 + 0.000105820105820099*G0_0_1_2_0 - 0.00010582010582011*G0_0_1_2_1 + 0.00522045855379178*G0_1_0_0_0 - 0.000105820105820098*G0_1_0_0_2 - 0.00522045855379182*G0_1_0_1_1 + 0.000105820105820111*G0_1_0_1_2 - 0.0001058201058201*G0_1_0_2_0 + 0.00010582010582011*G0_1_0_2_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p1_q4_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p1_q4_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p1_q4_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q4_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q4_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q4_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q4_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q4_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p1_q4_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p1_q4_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p1_q4_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p1_q4_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p2_q1_quadrature.h b/laplacian_2d/laplacian_f2_p2_q1_quadrature.h new file mode 100644 index 0000000..f5f4575 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p2_q1_quadrature.h @@ -0,0 +1,3396 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P2_Q1_QUADRATURE_H +#define __LAPLACIAN_F2_P2_Q1_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q1_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q1_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q1_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q1_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q1_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q1_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q1_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q1_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q1_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q1_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q1_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q1_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p2_q1_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p2_q1_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W6[6] = {0.054975871827661, 0.054975871827661, 0.054975871827661, 0.111690794839005, 0.111690794839005, 0.111690794839005}; + // Quadrature points on the UFC reference element: (0.816847572980459, 0.091576213509771), (0.091576213509771, 0.816847572980459), (0.091576213509771, 0.091576213509771), (0.10810301816807, 0.445948490915965), (0.445948490915965, 0.10810301816807), (0.445948490915965, 0.445948490915965) + + // Value of basis functions at quadrature points. + static const double FE0_D01[6][2] = \ + {{-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}}; + + // Array of non-zero columns + static const unsigned int nzc1[2] = {0, 1}; + + // Array of non-zero columns + static const unsigned int nzc0[2] = {0, 2}; + + static const double FE1[6][6] = \ + {{-0.0748038077481959, 0.517632341987674, -0.0748038077481967, 0.299215230992787, 0.0335448115231483, 0.299215230992784}, + {-0.0748038077481959, -0.0748038077481966, 0.517632341987674, 0.299215230992787, 0.299215230992784, 0.0335448115231484}, + {0.517632341987671, -0.0748038077481966, -0.0748038077481967, 0.0335448115231487, 0.299215230992787, 0.299215230992787}, + {-0.0482083778155119, -0.0847304930939778, -0.0482083778155119, 0.192833511262048, 0.795480226200906, 0.192833511262048}, + {-0.0482083778155119, -0.0482083778155119, -0.0847304930939778, 0.192833511262048, 0.192833511262048, 0.795480226200906}, + {-0.0847304930939777, -0.0482083778155119, -0.0482083778155119, 0.795480226200906, 0.192833511262048, 0.192833511262048}}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 9; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 486 + for (unsigned int ip = 0; ip < 6; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 24 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE1[ip][r]*w[0][r]; + F1 += FE1[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W6[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W6[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W6[ip]; + + + // Number of operations for primary indices: 48 + for (unsigned int j = 0; j < 2; j++) + { + for (unsigned int k = 0; k < 2; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p2_q1_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p2_q1_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q1_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q1_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q1_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q1_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q1_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q1_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q1_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q1_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q1_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p2_q1_tensor.h b/laplacian_2d/laplacian_f2_p2_q1_tensor.h new file mode 100644 index 0000000..13f58cd --- /dev/null +++ b/laplacian_2d/laplacian_f2_p2_q1_tensor.h @@ -0,0 +1,3417 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P2_Q1_TENSOR_H +#define __LAPLACIAN_F2_P2_Q1_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q1_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q1_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q1_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q1_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q1_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q1_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q1_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q1_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q1_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q1_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q1_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q1_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p2_q1_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p2_q1_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 288 + // Number of operations (multiply-add pairs) for tensor contraction: 261 + // Total number of operations (multiply-add pairs): 560 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[1] = -0.0166666666666666*G0_0_0_0_0 + 0.00277777777777778*G0_0_0_0_1 + 0.00277777777777778*G0_0_0_0_2 + 0.011111111111111*G0_0_0_0_3 + 0.00277777777777778*G0_0_0_1_0 - 0.0166666666666667*G0_0_0_1_1 + 0.00277777777777781*G0_0_0_1_2 + 0.0111111111111111*G0_0_0_1_4 + 0.00277777777777778*G0_0_0_2_0 + 0.00277777777777781*G0_0_0_2_1 - 0.0166666666666667*G0_0_0_2_2 + 0.0111111111111111*G0_0_0_2_5 + 0.011111111111111*G0_0_0_3_0 - 0.0888888888888888*G0_0_0_3_3 - 0.0444444444444443*G0_0_0_3_4 - 0.0444444444444443*G0_0_0_3_5 + 0.0111111111111111*G0_0_0_4_1 - 0.0444444444444443*G0_0_0_4_3 - 0.0888888888888887*G0_0_0_4_4 - 0.0444444444444443*G0_0_0_4_5 + 0.0111111111111111*G0_0_0_5_2 - 0.0444444444444443*G0_0_0_5_3 - 0.0444444444444443*G0_0_0_5_4 - 0.0888888888888888*G0_0_0_5_5 - 0.0166666666666666*G0_1_0_0_0 + 0.00277777777777778*G0_1_0_0_1 + 0.00277777777777778*G0_1_0_0_2 + 0.011111111111111*G0_1_0_0_3 + 0.00277777777777778*G0_1_0_1_0 - 0.0166666666666667*G0_1_0_1_1 + 0.00277777777777781*G0_1_0_1_2 + 0.0111111111111111*G0_1_0_1_4 + 0.00277777777777778*G0_1_0_2_0 + 0.00277777777777781*G0_1_0_2_1 - 0.0166666666666667*G0_1_0_2_2 + 0.0111111111111111*G0_1_0_2_5 + 0.011111111111111*G0_1_0_3_0 - 0.0888888888888888*G0_1_0_3_3 - 0.0444444444444443*G0_1_0_3_4 - 0.0444444444444443*G0_1_0_3_5 + 0.0111111111111111*G0_1_0_4_1 - 0.0444444444444443*G0_1_0_4_3 - 0.0888888888888887*G0_1_0_4_4 - 0.0444444444444443*G0_1_0_4_5 + 0.0111111111111111*G0_1_0_5_2 - 0.0444444444444443*G0_1_0_5_3 - 0.0444444444444443*G0_1_0_5_4 - 0.0888888888888888*G0_1_0_5_5; + A[5] = 0.0166666666666666*G0_0_1_0_0 - 0.00277777777777778*G0_0_1_0_1 - 0.00277777777777778*G0_0_1_0_2 - 0.011111111111111*G0_0_1_0_3 - 0.00277777777777778*G0_0_1_1_0 + 0.0166666666666667*G0_0_1_1_1 - 0.00277777777777781*G0_0_1_1_2 - 0.0111111111111111*G0_0_1_1_4 - 0.00277777777777778*G0_0_1_2_0 - 0.00277777777777781*G0_0_1_2_1 + 0.0166666666666667*G0_0_1_2_2 - 0.0111111111111111*G0_0_1_2_5 - 0.011111111111111*G0_0_1_3_0 + 0.0888888888888888*G0_0_1_3_3 + 0.0444444444444443*G0_0_1_3_4 + 0.0444444444444443*G0_0_1_3_5 - 0.0111111111111111*G0_0_1_4_1 + 0.0444444444444443*G0_0_1_4_3 + 0.0888888888888887*G0_0_1_4_4 + 0.0444444444444443*G0_0_1_4_5 - 0.0111111111111111*G0_0_1_5_2 + 0.0444444444444443*G0_0_1_5_3 + 0.0444444444444443*G0_0_1_5_4 + 0.0888888888888888*G0_0_1_5_5; + A[0] = -A[1] + 0.0166666666666666*G0_0_1_0_0 - 0.00277777777777778*G0_0_1_0_1 - 0.00277777777777778*G0_0_1_0_2 - 0.011111111111111*G0_0_1_0_3 - 0.00277777777777778*G0_0_1_1_0 + 0.0166666666666667*G0_0_1_1_1 - 0.00277777777777781*G0_0_1_1_2 - 0.0111111111111111*G0_0_1_1_4 - 0.00277777777777778*G0_0_1_2_0 - 0.00277777777777781*G0_0_1_2_1 + 0.0166666666666667*G0_0_1_2_2 - 0.0111111111111111*G0_0_1_2_5 - 0.011111111111111*G0_0_1_3_0 + 0.0888888888888888*G0_0_1_3_3 + 0.0444444444444443*G0_0_1_3_4 + 0.0444444444444443*G0_0_1_3_5 - 0.0111111111111111*G0_0_1_4_1 + 0.0444444444444443*G0_0_1_4_3 + 0.0888888888888887*G0_0_1_4_4 + 0.0444444444444443*G0_0_1_4_5 - 0.0111111111111111*G0_0_1_5_2 + 0.0444444444444443*G0_0_1_5_3 + 0.0444444444444443*G0_0_1_5_4 + 0.0888888888888888*G0_0_1_5_5 + 0.0166666666666666*G0_1_1_0_0 - 0.00277777777777778*G0_1_1_0_1 - 0.00277777777777778*G0_1_1_0_2 - 0.011111111111111*G0_1_1_0_3 - 0.00277777777777778*G0_1_1_1_0 + 0.0166666666666667*G0_1_1_1_1 - 0.00277777777777781*G0_1_1_1_2 - 0.0111111111111111*G0_1_1_1_4 - 0.00277777777777778*G0_1_1_2_0 - 0.00277777777777781*G0_1_1_2_1 + 0.0166666666666667*G0_1_1_2_2 - 0.0111111111111111*G0_1_1_2_5 - 0.011111111111111*G0_1_1_3_0 + 0.0888888888888888*G0_1_1_3_3 + 0.0444444444444443*G0_1_1_3_4 + 0.0444444444444443*G0_1_1_3_5 - 0.0111111111111111*G0_1_1_4_1 + 0.0444444444444443*G0_1_1_4_3 + 0.0888888888888887*G0_1_1_4_4 + 0.0444444444444443*G0_1_1_4_5 - 0.0111111111111111*G0_1_1_5_2 + 0.0444444444444443*G0_1_1_5_3 + 0.0444444444444443*G0_1_1_5_4 + 0.0888888888888888*G0_1_1_5_5; + A[7] = 0.0166666666666666*G0_1_0_0_0 - 0.00277777777777778*G0_1_0_0_1 - 0.00277777777777778*G0_1_0_0_2 - 0.011111111111111*G0_1_0_0_3 - 0.00277777777777778*G0_1_0_1_0 + 0.0166666666666667*G0_1_0_1_1 - 0.00277777777777781*G0_1_0_1_2 - 0.0111111111111111*G0_1_0_1_4 - 0.00277777777777778*G0_1_0_2_0 - 0.00277777777777781*G0_1_0_2_1 + 0.0166666666666667*G0_1_0_2_2 - 0.0111111111111111*G0_1_0_2_5 - 0.011111111111111*G0_1_0_3_0 + 0.0888888888888888*G0_1_0_3_3 + 0.0444444444444443*G0_1_0_3_4 + 0.0444444444444443*G0_1_0_3_5 - 0.0111111111111111*G0_1_0_4_1 + 0.0444444444444443*G0_1_0_4_3 + 0.0888888888888887*G0_1_0_4_4 + 0.0444444444444443*G0_1_0_4_5 - 0.0111111111111111*G0_1_0_5_2 + 0.0444444444444443*G0_1_0_5_3 + 0.0444444444444443*G0_1_0_5_4 + 0.0888888888888888*G0_1_0_5_5; + A[6] = -A[7] - 0.0166666666666666*G0_1_1_0_0 + 0.00277777777777778*G0_1_1_0_1 + 0.00277777777777778*G0_1_1_0_2 + 0.011111111111111*G0_1_1_0_3 + 0.00277777777777778*G0_1_1_1_0 - 0.0166666666666667*G0_1_1_1_1 + 0.00277777777777781*G0_1_1_1_2 + 0.0111111111111111*G0_1_1_1_4 + 0.00277777777777778*G0_1_1_2_0 + 0.00277777777777781*G0_1_1_2_1 - 0.0166666666666667*G0_1_1_2_2 + 0.0111111111111111*G0_1_1_2_5 + 0.011111111111111*G0_1_1_3_0 - 0.0888888888888888*G0_1_1_3_3 - 0.0444444444444443*G0_1_1_3_4 - 0.0444444444444443*G0_1_1_3_5 + 0.0111111111111111*G0_1_1_4_1 - 0.0444444444444443*G0_1_1_4_3 - 0.0888888888888887*G0_1_1_4_4 - 0.0444444444444443*G0_1_1_4_5 + 0.0111111111111111*G0_1_1_5_2 - 0.0444444444444443*G0_1_1_5_3 - 0.0444444444444443*G0_1_1_5_4 - 0.0888888888888888*G0_1_1_5_5; + A[8] = 0.0166666666666666*G0_1_1_0_0 - 0.00277777777777778*G0_1_1_0_1 - 0.00277777777777778*G0_1_1_0_2 - 0.011111111111111*G0_1_1_0_3 - 0.00277777777777778*G0_1_1_1_0 + 0.0166666666666667*G0_1_1_1_1 - 0.00277777777777781*G0_1_1_1_2 - 0.0111111111111111*G0_1_1_1_4 - 0.00277777777777778*G0_1_1_2_0 - 0.00277777777777781*G0_1_1_2_1 + 0.0166666666666667*G0_1_1_2_2 - 0.0111111111111111*G0_1_1_2_5 - 0.011111111111111*G0_1_1_3_0 + 0.0888888888888888*G0_1_1_3_3 + 0.0444444444444443*G0_1_1_3_4 + 0.0444444444444443*G0_1_1_3_5 - 0.0111111111111111*G0_1_1_4_1 + 0.0444444444444443*G0_1_1_4_3 + 0.0888888888888887*G0_1_1_4_4 + 0.0444444444444443*G0_1_1_4_5 - 0.0111111111111111*G0_1_1_5_2 + 0.0444444444444443*G0_1_1_5_3 + 0.0444444444444443*G0_1_1_5_4 + 0.0888888888888888*G0_1_1_5_5; + A[2] = -A[8] - 0.0166666666666666*G0_0_1_0_0 + 0.00277777777777778*G0_0_1_0_1 + 0.00277777777777778*G0_0_1_0_2 + 0.011111111111111*G0_0_1_0_3 + 0.00277777777777778*G0_0_1_1_0 - 0.0166666666666667*G0_0_1_1_1 + 0.00277777777777781*G0_0_1_1_2 + 0.0111111111111111*G0_0_1_1_4 + 0.00277777777777778*G0_0_1_2_0 + 0.00277777777777781*G0_0_1_2_1 - 0.0166666666666667*G0_0_1_2_2 + 0.0111111111111111*G0_0_1_2_5 + 0.011111111111111*G0_0_1_3_0 - 0.0888888888888888*G0_0_1_3_3 - 0.0444444444444443*G0_0_1_3_4 - 0.0444444444444443*G0_0_1_3_5 + 0.0111111111111111*G0_0_1_4_1 - 0.0444444444444443*G0_0_1_4_3 - 0.0888888888888887*G0_0_1_4_4 - 0.0444444444444443*G0_0_1_4_5 + 0.0111111111111111*G0_0_1_5_2 - 0.0444444444444443*G0_0_1_5_3 - 0.0444444444444443*G0_0_1_5_4 - 0.0888888888888888*G0_0_1_5_5; + A[4] = 0.0166666666666666*G0_0_0_0_0 - 0.00277777777777778*G0_0_0_0_1 - 0.00277777777777778*G0_0_0_0_2 - 0.011111111111111*G0_0_0_0_3 - 0.00277777777777778*G0_0_0_1_0 + 0.0166666666666667*G0_0_0_1_1 - 0.00277777777777781*G0_0_0_1_2 - 0.0111111111111111*G0_0_0_1_4 - 0.00277777777777778*G0_0_0_2_0 - 0.00277777777777781*G0_0_0_2_1 + 0.0166666666666667*G0_0_0_2_2 - 0.0111111111111111*G0_0_0_2_5 - 0.011111111111111*G0_0_0_3_0 + 0.0888888888888888*G0_0_0_3_3 + 0.0444444444444443*G0_0_0_3_4 + 0.0444444444444443*G0_0_0_3_5 - 0.0111111111111111*G0_0_0_4_1 + 0.0444444444444443*G0_0_0_4_3 + 0.0888888888888887*G0_0_0_4_4 + 0.0444444444444443*G0_0_0_4_5 - 0.0111111111111111*G0_0_0_5_2 + 0.0444444444444443*G0_0_0_5_3 + 0.0444444444444443*G0_0_0_5_4 + 0.0888888888888888*G0_0_0_5_5; + A[3] = -A[4] - 0.0166666666666666*G0_0_1_0_0 + 0.00277777777777778*G0_0_1_0_1 + 0.00277777777777778*G0_0_1_0_2 + 0.011111111111111*G0_0_1_0_3 + 0.00277777777777778*G0_0_1_1_0 - 0.0166666666666667*G0_0_1_1_1 + 0.00277777777777781*G0_0_1_1_2 + 0.0111111111111111*G0_0_1_1_4 + 0.00277777777777778*G0_0_1_2_0 + 0.00277777777777781*G0_0_1_2_1 - 0.0166666666666667*G0_0_1_2_2 + 0.0111111111111111*G0_0_1_2_5 + 0.011111111111111*G0_0_1_3_0 - 0.0888888888888888*G0_0_1_3_3 - 0.0444444444444443*G0_0_1_3_4 - 0.0444444444444443*G0_0_1_3_5 + 0.0111111111111111*G0_0_1_4_1 - 0.0444444444444443*G0_0_1_4_3 - 0.0888888888888887*G0_0_1_4_4 - 0.0444444444444443*G0_0_1_4_5 + 0.0111111111111111*G0_0_1_5_2 - 0.0444444444444443*G0_0_1_5_3 - 0.0444444444444443*G0_0_1_5_4 - 0.0888888888888888*G0_0_1_5_5; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p2_q1_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p2_q1_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q1_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q1_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q1_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q1_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q1_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q1_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q1_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q1_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q1_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q1_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p2_q2_quadrature.h b/laplacian_2d/laplacian_f2_p2_q2_quadrature.h new file mode 100644 index 0000000..57325fa --- /dev/null +++ b/laplacian_2d/laplacian_f2_p2_q2_quadrature.h @@ -0,0 +1,2278 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P2_Q2_QUADRATURE_H +#define __LAPLACIAN_F2_P2_Q2_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q2_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q2_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q2_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q2_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q2_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q2_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q2_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q2_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p2_q2_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p2_q2_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q2_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W12[12] = {0.0254224531851035, 0.0254224531851035, 0.0254224531851035, 0.0583931378631895, 0.0583931378631895, 0.0583931378631895, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187}; + // Quadrature points on the UFC reference element: (0.873821971016996, 0.063089014491502), (0.063089014491502, 0.873821971016996), (0.063089014491502, 0.063089014491502), (0.501426509658179, 0.24928674517091), (0.24928674517091, 0.501426509658179), (0.24928674517091, 0.24928674517091), (0.636502499121399, 0.310352451033785), (0.636502499121399, 0.053145049844816), (0.310352451033785, 0.636502499121399), (0.310352451033785, 0.053145049844816), (0.053145049844816, 0.636502499121399), (0.053145049844816, 0.310352451033785) + + // Value of basis functions at quadrature points. + static const double FE0[12][6] = \ + {{-0.055128566992484, 0.65330770304706, -0.0551285669924841, 0.220514267969936, 0.0159208949980358, 0.220514267969936}, + {-0.055128566992484, -0.055128566992484, 0.65330770304706, 0.220514267969936, 0.220514267969936, 0.015920894998036}, + {0.65330770304706, -0.0551285669924841, -0.0551285669924841, 0.0159208949980358, 0.220514267969936, 0.220514267969936}, + {-0.124998982535097, 0.00143057951778883, -0.124998982535098, 0.499995930140389, 0.248575525271626, 0.499995930140391}, + {-0.124998982535097, -0.124998982535098, 0.00143057951778883, 0.499995930140389, 0.499995930140391, 0.248575525271626}, + {0.00143057951778989, -0.124998982535098, -0.124998982535098, 0.248575525271625, 0.49999593014039, 0.49999593014039}, + {-0.0474962571988, 0.173768363654174, -0.117715163308429, 0.790160442765823, 0.0659747859186053, 0.135307828168627}, + {-0.117715163308429, 0.173768363654174, -0.0474962571988, 0.135307828168627, 0.0659747859186052, 0.790160442765823}, + {-0.0474962571987999, -0.117715163308429, 0.173768363654174, 0.790160442765823, 0.135307828168627, 0.0659747859186054}, + {0.173768363654174, -0.117715163308429, -0.0474962571988, 0.0659747859186052, 0.135307828168627, 0.790160442765823}, + {-0.117715163308429, -0.0474962571988, 0.173768363654174, 0.135307828168627, 0.790160442765823, 0.0659747859186054}, + {0.173768363654174, -0.0474962571988001, -0.117715163308429, 0.0659747859186053, 0.790160442765823, 0.135307828168627}}; + + static const double FE0_D01[12][5] = \ + {{0.747643942033992, -0.747643942033992, 3.49528788406798, 0.0, -3.49528788406798}, + {0.747643942033992, 2.49528788406798, 0.252356057966006, -3.24293182610197, -0.252356057966007}, + {-2.49528788406798, -0.747643942033992, 0.252356057966008, 3.24293182610198, -0.252356057966008}, + {0.0028530193163562, -0.00285301931635973, 2.00570603863272, 0.0, -2.00570603863272}, + {0.00285301931635623, 1.00570603863272, 0.99714698068364, -1.00855905794907, -0.99714698068364}, + {-1.00570603863272, -0.00285301931635984, 0.99714698068364, 1.00855905794908, -0.99714698068364}, + {0.787419800620736, 0.24140980413514, 2.5460099964856, -1.02882960475588, -2.5460099964856}, + {-0.24140980413514, -0.787419800620736, 2.54600999648559, 1.02882960475588, -2.5460099964856}, + {0.787419800620736, 1.5460099964856, 1.24140980413514, -2.33342979710633, -1.24140980413514}, + {-1.5460099964856, -0.787419800620736, 1.24140980413514, 2.33342979710633, -1.24140980413514}, + {-0.24140980413514, 1.5460099964856, 0.212580199379263, -1.30460019235046, -0.212580199379263}, + {-1.5460099964856, 0.24140980413514, 0.212580199379264, 1.30460019235046, -0.212580199379264}}; + + // Array of non-zero columns + static const unsigned int nzc0[5] = {0, 2, 3, 4, 5}; + + static const double FE0_D10[12][5] = \ + {{0.747643942033991, 2.49528788406798, 0.252356057966007, -0.252356057966007, -3.24293182610197}, + {0.747643942033993, -0.747643942033993, 3.49528788406798, -3.49528788406798, 0.0}, + {-2.49528788406798, -0.747643942033992, 0.252356057966007, -0.252356057966007, 3.24293182610198}, + {0.00285301931635623, 1.00570603863272, 0.997146980683639, -0.997146980683639, -1.00855905794907}, + {0.00285301931635651, -0.00285301931636017, 2.00570603863272, -2.00570603863272, 0.0}, + {-1.00570603863272, -0.00285301931635999, 0.997146980683639, -0.997146980683639, 1.00855905794908}, + {0.787419800620736, 1.5460099964856, 1.24140980413514, -1.24140980413514, -2.33342979710633}, + {-0.24140980413514, 1.5460099964856, 0.212580199379262, -0.212580199379262, -1.30460019235046}, + {0.787419800620737, 0.24140980413514, 2.5460099964856, -2.5460099964856, -1.02882960475588}, + {-1.5460099964856, 0.24140980413514, 0.212580199379263, -0.212580199379263, 1.30460019235046}, + {-0.24140980413514, -0.787419800620737, 2.5460099964856, -2.5460099964856, 1.02882960475588}, + {-1.5460099964856, -0.787419800620737, 1.24140980413514, -1.24140980413514, 2.33342979710633}}; + + // Array of non-zero columns + static const unsigned int nzc1[5] = {0, 1, 3, 4, 5}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 36; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 3996 + for (unsigned int ip = 0; ip < 12; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 24 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE0[ip][r]*w[0][r]; + F1 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W12[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W12[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W12[ip]; + + + // Number of operations for primary indices: 300 + for (unsigned int j = 0; j < 5; j++) + { + for (unsigned int k = 0; k < 5; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc1[k]] += FE0_D01[ip][j]*FE0_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc0[k]] += FE0_D01[ip][k]*FE0_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc1[k]] += FE0_D10[ip][j]*FE0_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p2_q2_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p2_q2_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q2_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q2_quadrature_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f2_p2_q2_quadrature_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f2_p2_q2_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q2_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q2_quadrature_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f2_p2_q2_quadrature_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f2_p2_q2_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q2_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q2_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p2_q2_tensor.h b/laplacian_2d/laplacian_f2_p2_q2_tensor.h new file mode 100644 index 0000000..e2ce81b --- /dev/null +++ b/laplacian_2d/laplacian_f2_p2_q2_tensor.h @@ -0,0 +1,2348 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P2_Q2_TENSOR_H +#define __LAPLACIAN_F2_P2_Q2_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q2_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q2_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q2_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q2_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q2_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q2_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q2_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q2_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p2_q2_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p2_q2_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q2_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 432 + // Number of operations (multiply-add pairs) for tensor contraction: 1892 + // Total number of operations (multiply-add pairs): 2335 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[9] = -0.00317460317460323*G0_0_0_0_0 - 0.00158730158730157*G0_0_0_0_1 + 0.00634920634920637*G0_0_0_0_2 - 0.00634920634920629*G0_0_0_0_3 - 0.00634920634920628*G0_0_0_0_5 - 0.00158730158730157*G0_0_0_1_0 + 0.00952380952380954*G0_0_0_1_1 + 0.0126984126984128*G0_0_0_1_3 + 0.00634920634920635*G0_0_0_1_4 + 0.0063492063492063*G0_0_0_1_5 + 0.00634920634920637*G0_0_0_2_0 - 0.0285714285714288*G0_0_0_2_2 - 0.019047619047619*G0_0_0_2_3 - 0.0190476190476192*G0_0_0_2_4 - 0.00634920634920631*G0_0_0_2_5 - 0.00634920634920629*G0_0_0_3_0 + 0.0126984126984128*G0_0_0_3_1 - 0.019047619047619*G0_0_0_3_2 + 0.076190476190477*G0_0_0_3_3 + 0.0253968253968252*G0_0_0_3_5 + 0.00634920634920635*G0_0_0_4_1 - 0.0190476190476192*G0_0_0_4_2 - 0.0761904761904775*G0_0_0_4_4 - 0.00634920634920628*G0_0_0_5_0 + 0.0063492063492063*G0_0_0_5_1 - 0.00634920634920631*G0_0_0_5_2 + 0.0253968253968252*G0_0_0_5_3 + 0.0253968253968252*G0_0_0_5_5 + 0.00317460317460315*G0_0_1_0_0 - 0.0126984126984127*G0_0_1_0_1 + 0.00476190476190472*G0_0_1_0_2 - 0.0190476190476189*G0_0_1_0_3 - 0.00634920634920629*G0_0_1_0_4 - 0.0253968253968254*G0_0_1_0_5 - 0.0126984126984127*G0_0_1_1_0 + 0.104761904761906*G0_0_1_1_1 - 0.0126984126984127*G0_0_1_1_2 + 0.0571428571428574*G0_0_1_1_3 + 0.00634920634920632*G0_0_1_1_4 + 0.0571428571428574*G0_0_1_1_5 + 0.00476190476190472*G0_0_1_2_0 - 0.0126984126984127*G0_0_1_2_1 + 0.00317460317460318*G0_0_1_2_2 - 0.0253968253968254*G0_0_1_2_3 - 0.00634920634920629*G0_0_1_2_4 - 0.0190476190476189*G0_0_1_2_5 - 0.0190476190476189*G0_0_1_3_0 + 0.0571428571428574*G0_0_1_3_1 - 0.0253968253968254*G0_0_1_3_2 + 0.152380952380953*G0_0_1_3_3 + 0.0253968253968252*G0_0_1_3_4 + 0.0761904761904757*G0_0_1_3_5 - 0.0063492063492063*G0_0_1_4_0 + 0.00634920634920632*G0_0_1_4_1 - 0.00634920634920629*G0_0_1_4_2 + 0.0253968253968252*G0_0_1_4_3 + 0.0253968253968252*G0_0_1_4_5 - 0.0253968253968254*G0_0_1_5_0 + 0.0571428571428574*G0_0_1_5_1 - 0.0190476190476189*G0_0_1_5_2 + 0.0761904761904757*G0_0_1_5_3 + 0.0253968253968252*G0_0_1_5_4 + 0.152380952380954*G0_0_1_5_5; + A[13] = 0.003968253968254*G0_1_0_0_0 + 0.001984126984127*G0_1_0_0_1 + 0.001984126984127*G0_1_0_0_2 + 0.00158730158730158*G0_1_0_0_3 + 0.00634920634920639*G0_1_0_0_4 + 0.00634920634920639*G0_1_0_0_5 + 0.001984126984127*G0_1_0_1_0 - 0.0214285714285716*G0_1_0_1_1 + 0.00357142857142857*G0_1_0_1_2 - 0.00634920634920635*G0_1_0_1_3 + 0.0015873015873016*G0_1_0_1_4 - 0.0126984126984128*G0_1_0_1_5 + 0.001984126984127*G0_1_0_2_0 + 0.00357142857142857*G0_1_0_2_1 - 0.0214285714285716*G0_1_0_2_2 - 0.00634920634920636*G0_1_0_2_3 - 0.0126984126984128*G0_1_0_2_4 + 0.00158730158730158*G0_1_0_2_5 + 0.00158730158730158*G0_1_0_3_0 - 0.00634920634920635*G0_1_0_3_1 - 0.00634920634920635*G0_1_0_3_2 + 0.0126984126984131*G0_1_0_3_3 - 0.00634920634920635*G0_1_0_3_4 - 0.00634920634920634*G0_1_0_3_5 + 0.00634920634920639*G0_1_0_4_0 + 0.00158730158730159*G0_1_0_4_1 - 0.0126984126984128*G0_1_0_4_2 - 0.00634920634920635*G0_1_0_4_3 - 0.0380952380952388*G0_1_0_4_4 - 0.00634920634920637*G0_1_0_4_5 + 0.00634920634920639*G0_1_0_5_0 - 0.0126984126984128*G0_1_0_5_1 + 0.00158730158730158*G0_1_0_5_2 - 0.00634920634920634*G0_1_0_5_3 - 0.00634920634920637*G0_1_0_5_4 - 0.0380952380952388*G0_1_0_5_5; + A[17] = -0.0253968253968256*G0_1_0_0_0 + 0.00158730158730156*G0_1_0_0_2 - 0.0126984126984128*G0_1_0_0_4 - 0.0190476190476192*G0_1_0_0_5 + 0.0253968253968256*G0_1_0_1_1 - 0.00158730158730156*G0_1_0_1_2 + 0.0126984126984127*G0_1_0_1_3 + 0.0190476190476192*G0_1_0_1_5 + 0.00158730158730156*G0_1_0_2_0 - 0.00158730158730156*G0_1_0_2_1 - 0.00634920634920647*G0_1_0_2_3 + 0.00634920634920647*G0_1_0_2_4 + 0.0126984126984127*G0_1_0_3_1 - 0.00634920634920647*G0_1_0_3_2 - 0.0507936507936518*G0_1_0_3_3 - 0.0126984126984128*G0_1_0_4_0 + 0.00634920634920648*G0_1_0_4_2 + 0.0507936507936519*G0_1_0_4_4 - 0.0190476190476192*G0_1_0_5_0 + 0.0190476190476192*G0_1_0_5_1 + 0.00317460317460324*G0_1_1_0_0 - 0.00634920634920637*G0_1_1_0_1 + 0.00158730158730157*G0_1_1_0_2 + 0.00634920634920629*G0_1_1_0_3 + 0.0063492063492063*G0_1_1_0_4 - 0.00634920634920637*G0_1_1_1_0 + 0.0285714285714288*G0_1_1_1_1 + 0.019047619047619*G0_1_1_1_3 + 0.0063492063492063*G0_1_1_1_4 + 0.0190476190476192*G0_1_1_1_5 + 0.00158730158730157*G0_1_1_2_0 - 0.00952380952380956*G0_1_1_2_2 - 0.0126984126984128*G0_1_1_2_3 - 0.0063492063492063*G0_1_1_2_4 - 0.00634920634920634*G0_1_1_2_5 + 0.00634920634920629*G0_1_1_3_0 + 0.019047619047619*G0_1_1_3_1 - 0.0126984126984128*G0_1_1_3_2 - 0.076190476190477*G0_1_1_3_3 - 0.0253968253968252*G0_1_1_3_4 + 0.0063492063492063*G0_1_1_4_0 + 0.0063492063492063*G0_1_1_4_1 - 0.0063492063492063*G0_1_1_4_2 - 0.0253968253968252*G0_1_1_4_3 - 0.0253968253968252*G0_1_1_4_4 + 0.0190476190476192*G0_1_1_5_1 - 0.00634920634920634*G0_1_1_5_2 + 0.0761904761904775*G0_1_1_5_5; + A[8] = 0.003968253968254*G0_0_1_0_0 + 0.001984126984127*G0_0_1_0_1 + 0.001984126984127*G0_0_1_0_2 + 0.00158730158730158*G0_0_1_0_3 + 0.00634920634920639*G0_0_1_0_4 + 0.00634920634920639*G0_0_1_0_5 + 0.001984126984127*G0_0_1_1_0 - 0.0214285714285716*G0_0_1_1_1 + 0.00357142857142857*G0_0_1_1_2 - 0.00634920634920635*G0_0_1_1_3 + 0.0015873015873016*G0_0_1_1_4 - 0.0126984126984128*G0_0_1_1_5 + 0.001984126984127*G0_0_1_2_0 + 0.00357142857142857*G0_0_1_2_1 - 0.0214285714285716*G0_0_1_2_2 - 0.00634920634920636*G0_0_1_2_3 - 0.0126984126984128*G0_0_1_2_4 + 0.00158730158730158*G0_0_1_2_5 + 0.00158730158730158*G0_0_1_3_0 - 0.00634920634920635*G0_0_1_3_1 - 0.00634920634920635*G0_0_1_3_2 + 0.0126984126984131*G0_0_1_3_3 - 0.00634920634920635*G0_0_1_3_4 - 0.00634920634920634*G0_0_1_3_5 + 0.00634920634920639*G0_0_1_4_0 + 0.0015873015873016*G0_0_1_4_1 - 0.0126984126984128*G0_0_1_4_2 - 0.00634920634920635*G0_0_1_4_3 - 0.0380952380952388*G0_0_1_4_4 - 0.00634920634920637*G0_0_1_4_5 + 0.00634920634920639*G0_0_1_5_0 - 0.0126984126984128*G0_0_1_5_1 + 0.00158730158730158*G0_0_1_5_2 - 0.00634920634920634*G0_0_1_5_3 - 0.00634920634920637*G0_0_1_5_4 - 0.0380952380952388*G0_0_1_5_5; + A[11] = -A[9] - 0.0349206349206352*G0_0_0_0_0 + 0.0111111111111111*G0_0_0_0_1 + 0.00793650793650803*G0_0_0_0_2 + 0.00634920634920631*G0_0_0_0_3 - 0.0126984126984129*G0_0_0_0_4 + 0.0111111111111111*G0_0_0_1_0 - 0.0857142857142864*G0_0_0_1_1 + 0.0111111111111111*G0_0_0_1_2 - 0.0380952380952383*G0_0_0_1_3 + 0.00634920634920638*G0_0_0_1_4 - 0.0380952380952384*G0_0_0_1_5 + 0.00793650793650803*G0_0_0_2_0 + 0.0111111111111111*G0_0_0_2_1 - 0.0349206349206352*G0_0_0_2_2 - 0.0126984126984129*G0_0_0_2_4 + 0.00634920634920632*G0_0_0_2_5 + 0.00634920634920631*G0_0_0_3_0 - 0.0380952380952383*G0_0_0_3_1 - 0.0507936507936512*G0_0_0_3_3 - 0.0253968253968254*G0_0_0_3_4 - 0.0253968253968253*G0_0_0_3_5 - 0.0126984126984129*G0_0_0_4_0 + 0.00634920634920638*G0_0_0_4_1 - 0.0126984126984129*G0_0_0_4_2 - 0.0253968253968254*G0_0_0_4_3 - 0.152380952380955*G0_0_0_4_4 - 0.0253968253968254*G0_0_0_4_5 - 0.0380952380952384*G0_0_0_5_1 + 0.00634920634920632*G0_0_0_5_2 - 0.0253968253968253*G0_0_0_5_3 - 0.0253968253968254*G0_0_0_5_4 - 0.0507936507936513*G0_0_0_5_5; + A[7] = 0.0103174603174604*G0_0_0_0_0 - 0.00912698412698414*G0_0_0_0_1 + 0.000396825396825354*G0_0_0_0_2 - 0.011111111111111*G0_0_0_0_3 - 0.0126984126984127*G0_0_0_0_5 - 0.00912698412698414*G0_0_0_1_0 + 0.0738095238095244*G0_0_0_1_1 - 0.00912698412698416*G0_0_0_1_2 + 0.0380952380952383*G0_0_0_1_3 + 0.00158730158730156*G0_0_0_1_4 + 0.0380952380952383*G0_0_0_1_5 + 0.000396825396825354*G0_0_0_2_0 - 0.00912698412698416*G0_0_0_2_1 + 0.0103174603174604*G0_0_0_2_2 - 0.0126984126984127*G0_0_0_2_3 - 0.0111111111111111*G0_0_0_2_5 - 0.011111111111111*G0_0_0_3_0 + 0.0380952380952383*G0_0_0_3_1 - 0.0126984126984127*G0_0_0_3_2 + 0.0888888888888895*G0_0_0_3_3 + 0.019047619047619*G0_0_0_3_4 + 0.0444444444444442*G0_0_0_3_5 + 0.00158730158730156*G0_0_0_4_1 + 0.019047619047619*G0_0_0_4_3 + 0.0380952380952387*G0_0_0_4_4 + 0.019047619047619*G0_0_0_4_5 - 0.0126984126984127*G0_0_0_5_0 + 0.0380952380952383*G0_0_0_5_1 - 0.0111111111111111*G0_0_0_5_2 + 0.0444444444444442*G0_0_0_5_3 + 0.019047619047619*G0_0_0_5_4 + 0.0888888888888896*G0_0_0_5_5; + A[1] = -A[13] + 0.0214285714285716*G0_0_0_0_0 - 0.00357142857142857*G0_0_0_0_1 - 0.00198412698412701*G0_0_0_0_2 - 0.00158730158730157*G0_0_0_0_3 + 0.0126984126984128*G0_0_0_0_4 + 0.00634920634920637*G0_0_0_0_5 - 0.00357142857142857*G0_0_0_1_0 + 0.0214285714285716*G0_0_0_1_1 - 0.001984126984127*G0_0_0_1_2 + 0.0126984126984128*G0_0_0_1_3 - 0.0015873015873016*G0_0_0_1_4 + 0.00634920634920634*G0_0_0_1_5 - 0.00198412698412701*G0_0_0_2_0 - 0.001984126984127*G0_0_0_2_1 - 0.00396825396825401*G0_0_0_2_2 - 0.00634920634920638*G0_0_0_2_3 - 0.0063492063492064*G0_0_0_2_4 - 0.00158730158730157*G0_0_0_2_5 - 0.00158730158730157*G0_0_0_3_0 + 0.0126984126984128*G0_0_0_3_1 - 0.00634920634920638*G0_0_0_3_2 + 0.0380952380952387*G0_0_0_3_3 + 0.00634920634920635*G0_0_0_3_4 + 0.0063492063492063*G0_0_0_3_5 + 0.0126984126984128*G0_0_0_4_0 - 0.0015873015873016*G0_0_0_4_1 - 0.0063492063492064*G0_0_0_4_2 + 0.00634920634920635*G0_0_0_4_3 + 0.0380952380952388*G0_0_0_4_4 + 0.00634920634920633*G0_0_0_4_5 + 0.00634920634920637*G0_0_0_5_0 + 0.00634920634920634*G0_0_0_5_1 - 0.00158730158730157*G0_0_0_5_2 + 0.0063492063492063*G0_0_0_5_3 + 0.00634920634920633*G0_0_0_5_4 - 0.0126984126984132*G0_0_0_5_5 + 0.0253968253968256*G0_1_0_0_0 - 0.00158730158730157*G0_1_0_0_1 + 0.0190476190476192*G0_1_0_0_4 + 0.0126984126984128*G0_1_0_0_5 - 0.00158730158730157*G0_1_0_1_0 + 0.00158730158730156*G0_1_0_1_2 + 0.00634920634920648*G0_1_0_1_3 - 0.00634920634920647*G0_1_0_1_5 + 0.00158730158730156*G0_1_0_2_1 - 0.0253968253968256*G0_1_0_2_2 - 0.0126984126984127*G0_1_0_2_3 - 0.0190476190476192*G0_1_0_2_4 + 0.00634920634920648*G0_1_0_3_1 - 0.0126984126984127*G0_1_0_3_2 + 0.0507936507936518*G0_1_0_3_3 + 0.0190476190476192*G0_1_0_4_0 - 0.0190476190476192*G0_1_0_4_2 + 0.0126984126984128*G0_1_0_5_0 - 0.00634920634920647*G0_1_0_5_1 - 0.0507936507936519*G0_1_0_5_5; + A[34] = -0.0126984126984128*G0_0_0_0_0 + 0.00634920634920639*G0_0_0_0_2 - 0.0126984126984126*G0_0_0_0_3 - 0.0126984126984128*G0_0_0_0_4 - 0.0126984126984126*G0_0_0_0_5 + 0.0126984126984128*G0_0_0_1_1 - 0.00634920634920639*G0_0_0_1_2 + 0.0126984126984128*G0_0_0_1_3 + 0.0126984126984127*G0_0_0_1_4 + 0.0126984126984126*G0_0_0_1_5 + 0.00634920634920639*G0_0_0_2_0 - 0.00634920634920639*G0_0_0_2_1 - 0.0126984126984126*G0_0_0_3_0 + 0.0126984126984128*G0_0_0_3_1 + 0.152380952380954*G0_0_0_3_3 + 0.0253968253968252*G0_0_0_3_5 - 0.0126984126984128*G0_0_0_4_0 + 0.0126984126984127*G0_0_0_4_1 - 0.152380952380955*G0_0_0_4_4 - 0.0253968253968254*G0_0_0_4_5 - 0.0126984126984126*G0_0_0_5_0 + 0.0126984126984126*G0_0_0_5_1 + 0.0253968253968252*G0_0_0_5_3 - 0.0253968253968254*G0_0_0_5_4 + 0.120634920634922*G0_0_1_0_0 - 0.0126984126984128*G0_0_1_0_1 - 0.0126984126984127*G0_0_1_0_2 + 0.0634920634920639*G0_0_1_0_4 + 0.063492063492064*G0_0_1_0_5 - 0.0126984126984128*G0_0_1_1_0 + 0.00634920634920636*G0_0_1_1_1 - 0.0126984126984127*G0_0_1_1_4 - 0.0253968253968256*G0_0_1_1_5 - 0.0126984126984128*G0_0_1_2_0 + 0.0063492063492064*G0_0_1_2_2 - 0.0253968253968256*G0_0_1_2_4 - 0.0126984126984126*G0_0_1_2_5 + 0.126984126984129*G0_0_1_3_3 + 0.0253968253968253*G0_0_1_3_4 + 0.0253968253968253*G0_0_1_3_5 + 0.063492063492064*G0_0_1_4_0 - 0.0126984126984127*G0_0_1_4_1 - 0.0253968253968256*G0_0_1_4_2 + 0.0253968253968253*G0_0_1_4_3 + 0.0761904761904765*G0_0_1_4_4 + 0.0507936507936506*G0_0_1_4_5 + 0.063492063492064*G0_0_1_5_0 - 0.0253968253968256*G0_0_1_5_1 - 0.0126984126984126*G0_0_1_5_2 + 0.0253968253968253*G0_0_1_5_3 + 0.0507936507936506*G0_0_1_5_4 + 0.0761904761904765*G0_0_1_5_5 + 0.00634920634920628*G0_1_0_0_0 - 0.0253968253968252*G0_1_0_0_3 - 0.0126984126984126*G0_1_0_0_4 - 0.0126984126984126*G0_1_0_0_5 + 0.0190476190476191*G0_1_0_1_1 - 0.00634920634920638*G0_1_0_1_2 - 0.0126984126984126*G0_1_0_1_4 - 0.00634920634920638*G0_1_0_2_1 + 0.0190476190476191*G0_1_0_2_2 - 0.0126984126984126*G0_1_0_2_5 - 0.0253968253968252*G0_1_0_3_0 + 0.22857142857143*G0_1_0_3_3 + 0.0761904761904755*G0_1_0_3_4 + 0.0761904761904756*G0_1_0_3_5 - 0.0126984126984126*G0_1_0_4_0 - 0.0126984126984126*G0_1_0_4_1 + 0.0761904761904756*G0_1_0_4_3 + 0.0761904761904757*G0_1_0_4_4 + 0.0507936507936504*G0_1_0_4_5 - 0.0126984126984126*G0_1_0_5_0 - 0.0126984126984126*G0_1_0_5_2 + 0.0761904761904756*G0_1_0_5_3 + 0.0507936507936504*G0_1_0_5_4 + 0.0761904761904756*G0_1_0_5_5 - 0.0126984126984128*G0_1_1_0_0 + 0.0063492063492064*G0_1_1_0_1 - 0.0126984126984126*G0_1_1_0_3 - 0.0126984126984126*G0_1_1_0_4 - 0.0126984126984128*G0_1_1_0_5 + 0.0063492063492064*G0_1_1_1_0 - 0.00634920634920639*G0_1_1_1_2 - 0.00634920634920639*G0_1_1_2_1 + 0.0126984126984128*G0_1_1_2_2 + 0.0126984126984128*G0_1_1_2_3 + 0.0126984126984126*G0_1_1_2_4 + 0.0126984126984127*G0_1_1_2_5 - 0.0126984126984126*G0_1_1_3_0 + 0.0126984126984128*G0_1_1_3_2 + 0.152380952380954*G0_1_1_3_3 + 0.0253968253968252*G0_1_1_3_4 - 0.0126984126984126*G0_1_1_4_0 + 0.0126984126984126*G0_1_1_4_2 + 0.0253968253968252*G0_1_1_4_3 - 0.0253968253968254*G0_1_1_4_5 - 0.0126984126984128*G0_1_1_5_0 + 0.0126984126984127*G0_1_1_5_2 - 0.0253968253968254*G0_1_1_5_4 - 0.152380952380955*G0_1_1_5_5; + A[0] = A[7] + 0.0634920634920641*G0_0_0_0_0 - 0.00952380952380953*G0_0_0_0_2 + 0.0126984126984126*G0_0_0_0_3 + 0.0380952380952383*G0_0_0_0_4 + 0.0507936507936511*G0_0_0_0_5 - 0.063492063492064*G0_0_0_1_1 + 0.00952380952380952*G0_0_0_1_2 - 0.0380952380952382*G0_0_0_1_3 - 0.0126984126984126*G0_0_0_1_4 - 0.0507936507936511*G0_0_0_1_5 - 0.00952380952380953*G0_0_0_2_0 + 0.00952380952380952*G0_0_0_2_1 + 0.0126984126984128*G0_0_0_2_3 - 0.0126984126984128*G0_0_0_2_4 + 0.0126984126984126*G0_0_0_3_0 - 0.0380952380952382*G0_0_0_3_1 + 0.0126984126984128*G0_0_0_3_2 - 0.0507936507936508*G0_0_0_3_3 - 0.0253968253968252*G0_0_0_3_5 + 0.0380952380952383*G0_0_0_4_0 - 0.0126984126984126*G0_0_0_4_1 - 0.0126984126984128*G0_0_0_4_2 + 0.0507936507936509*G0_0_0_4_4 + 0.0253968253968253*G0_0_0_4_5 + 0.0507936507936511*G0_0_0_5_0 - 0.0507936507936511*G0_0_0_5_1 - 0.0253968253968252*G0_0_0_5_3 + 0.0253968253968253*G0_0_0_5_4 + 0.0738095238095245*G0_0_1_0_0 - 0.00912698412698418*G0_0_1_0_1 - 0.00912698412698417*G0_0_1_0_2 + 0.00158730158730159*G0_0_1_0_3 + 0.0380952380952384*G0_0_1_0_4 + 0.0380952380952384*G0_0_1_0_5 - 0.00912698412698418*G0_0_1_1_0 + 0.0103174603174604*G0_0_1_1_1 + 0.000396825396825365*G0_0_1_1_2 - 0.0111111111111111*G0_0_1_1_4 - 0.0126984126984127*G0_0_1_1_5 - 0.00912698412698417*G0_0_1_2_0 + 0.000396825396825365*G0_0_1_2_1 + 0.0103174603174604*G0_0_1_2_2 - 0.0126984126984127*G0_0_1_2_4 - 0.0111111111111111*G0_0_1_2_5 + 0.00158730158730159*G0_0_1_3_0 + 0.0380952380952387*G0_0_1_3_3 + 0.019047619047619*G0_0_1_3_4 + 0.019047619047619*G0_0_1_3_5 + 0.0380952380952384*G0_0_1_4_0 - 0.0111111111111111*G0_0_1_4_1 - 0.0126984126984127*G0_0_1_4_2 + 0.019047619047619*G0_0_1_4_3 + 0.0888888888888896*G0_0_1_4_4 + 0.0444444444444443*G0_0_1_4_5 + 0.0380952380952384*G0_0_1_5_0 - 0.0126984126984127*G0_0_1_5_1 - 0.0111111111111111*G0_0_1_5_2 + 0.019047619047619*G0_0_1_5_3 + 0.0444444444444443*G0_0_1_5_4 + 0.0888888888888897*G0_0_1_5_5 + 0.0738095238095245*G0_1_0_0_0 - 0.00912698412698418*G0_1_0_0_1 - 0.00912698412698417*G0_1_0_0_2 + 0.00158730158730159*G0_1_0_0_3 + 0.0380952380952384*G0_1_0_0_4 + 0.0380952380952384*G0_1_0_0_5 - 0.00912698412698418*G0_1_0_1_0 + 0.0103174603174604*G0_1_0_1_1 + 0.000396825396825365*G0_1_0_1_2 - 0.0111111111111111*G0_1_0_1_4 - 0.0126984126984127*G0_1_0_1_5 - 0.00912698412698417*G0_1_0_2_0 + 0.000396825396825365*G0_1_0_2_1 + 0.0103174603174604*G0_1_0_2_2 - 0.0126984126984127*G0_1_0_2_4 - 0.0111111111111111*G0_1_0_2_5 + 0.00158730158730159*G0_1_0_3_0 + 0.0380952380952387*G0_1_0_3_3 + 0.019047619047619*G0_1_0_3_4 + 0.019047619047619*G0_1_0_3_5 + 0.0380952380952384*G0_1_0_4_0 - 0.0111111111111111*G0_1_0_4_1 - 0.0126984126984127*G0_1_0_4_2 + 0.019047619047619*G0_1_0_4_3 + 0.0888888888888896*G0_1_0_4_4 + 0.0444444444444443*G0_1_0_4_5 + 0.0380952380952384*G0_1_0_5_0 - 0.0126984126984127*G0_1_0_5_1 - 0.0111111111111111*G0_1_0_5_2 + 0.019047619047619*G0_1_0_5_3 + 0.0444444444444443*G0_1_0_5_4 + 0.0888888888888897*G0_1_0_5_5 + 0.0738095238095244*G0_1_1_0_0 - 0.00912698412698418*G0_1_1_0_1 - 0.00912698412698417*G0_1_1_0_2 + 0.00158730158730159*G0_1_1_0_3 + 0.0380952380952384*G0_1_1_0_4 + 0.0380952380952384*G0_1_1_0_5 - 0.00912698412698418*G0_1_1_1_0 + 0.0103174603174604*G0_1_1_1_1 + 0.000396825396825366*G0_1_1_1_2 - 0.0111111111111111*G0_1_1_1_4 - 0.0126984126984127*G0_1_1_1_5 - 0.00912698412698417*G0_1_1_2_0 + 0.000396825396825366*G0_1_1_2_1 + 0.0103174603174604*G0_1_1_2_2 - 0.0126984126984127*G0_1_1_2_4 - 0.0111111111111111*G0_1_1_2_5 + 0.00158730158730159*G0_1_1_3_0 + 0.0380952380952387*G0_1_1_3_3 + 0.019047619047619*G0_1_1_3_4 + 0.019047619047619*G0_1_1_3_5 + 0.0380952380952384*G0_1_1_4_0 - 0.0111111111111111*G0_1_1_4_1 - 0.0126984126984127*G0_1_1_4_2 + 0.019047619047619*G0_1_1_4_3 + 0.0888888888888896*G0_1_1_4_4 + 0.0444444444444443*G0_1_1_4_5 + 0.0380952380952384*G0_1_1_5_0 - 0.0126984126984127*G0_1_1_5_1 - 0.0111111111111111*G0_1_1_5_2 + 0.019047619047619*G0_1_1_5_3 + 0.0444444444444443*G0_1_1_5_4 + 0.0888888888888897*G0_1_1_5_5; + A[29] = A[34] - 0.114285714285715*G0_0_1_0_0 + 0.0126984126984127*G0_0_1_0_1 + 0.0126984126984127*G0_0_1_0_2 - 0.0253968253968252*G0_0_1_0_3 - 0.0761904761904765*G0_0_1_0_4 - 0.0761904761904765*G0_0_1_0_5 + 0.0126984126984127*G0_0_1_1_0 + 0.0126984126984127*G0_0_1_1_1 - 0.00634920634920631*G0_0_1_1_2 + 0.0253968253968256*G0_0_1_1_5 + 0.0126984126984127*G0_0_1_2_0 - 0.00634920634920632*G0_0_1_2_1 + 0.0126984126984127*G0_0_1_2_2 + 0.0253968253968256*G0_0_1_2_4 - 0.0253968253968252*G0_0_1_3_0 + 0.101587301587301*G0_0_1_3_3 + 0.0507936507936503*G0_0_1_3_4 + 0.0507936507936503*G0_0_1_3_5 - 0.0761904761904765*G0_0_1_4_0 + 0.0253968253968256*G0_0_1_4_2 + 0.0507936507936503*G0_0_1_4_3 - 0.0761904761904765*G0_0_1_5_0 + 0.0253968253968256*G0_0_1_5_1 + 0.0507936507936503*G0_0_1_5_3 + 0.114285714285715*G0_1_0_0_0 - 0.0126984126984127*G0_1_0_0_1 - 0.0126984126984127*G0_1_0_0_2 + 0.0253968253968252*G0_1_0_0_3 + 0.0761904761904765*G0_1_0_0_4 + 0.0761904761904765*G0_1_0_0_5 - 0.0126984126984127*G0_1_0_1_0 - 0.0126984126984127*G0_1_0_1_1 + 0.00634920634920631*G0_1_0_1_2 - 0.0253968253968256*G0_1_0_1_5 - 0.0126984126984127*G0_1_0_2_0 + 0.00634920634920632*G0_1_0_2_1 - 0.0126984126984127*G0_1_0_2_2 - 0.0253968253968256*G0_1_0_2_4 + 0.0253968253968252*G0_1_0_3_0 - 0.101587301587301*G0_1_0_3_3 - 0.0507936507936503*G0_1_0_3_4 - 0.0507936507936503*G0_1_0_3_5 + 0.0761904761904765*G0_1_0_4_0 - 0.0253968253968256*G0_1_0_4_2 - 0.0507936507936503*G0_1_0_4_3 + 0.0761904761904765*G0_1_0_5_0 - 0.0253968253968256*G0_1_0_5_1 - 0.0507936507936503*G0_1_0_5_3; + A[14] = 0.0103174603174604*G0_1_1_0_0 + 0.000396825396825354*G0_1_1_0_1 - 0.00912698412698414*G0_1_1_0_2 - 0.011111111111111*G0_1_1_0_3 - 0.0126984126984127*G0_1_1_0_4 + 0.000396825396825354*G0_1_1_1_0 + 0.0103174603174604*G0_1_1_1_1 - 0.00912698412698415*G0_1_1_1_2 - 0.0126984126984127*G0_1_1_1_3 - 0.011111111111111*G0_1_1_1_4 - 0.00912698412698414*G0_1_1_2_0 - 0.00912698412698415*G0_1_1_2_1 + 0.0738095238095244*G0_1_1_2_2 + 0.0380952380952383*G0_1_1_2_3 + 0.0380952380952383*G0_1_1_2_4 + 0.00158730158730159*G0_1_1_2_5 - 0.011111111111111*G0_1_1_3_0 - 0.0126984126984127*G0_1_1_3_1 + 0.0380952380952383*G0_1_1_3_2 + 0.0888888888888894*G0_1_1_3_3 + 0.0444444444444442*G0_1_1_3_4 + 0.019047619047619*G0_1_1_3_5 - 0.0126984126984127*G0_1_1_4_0 - 0.011111111111111*G0_1_1_4_1 + 0.0380952380952383*G0_1_1_4_2 + 0.0444444444444442*G0_1_1_4_3 + 0.0888888888888896*G0_1_1_4_4 + 0.019047619047619*G0_1_1_4_5 + 0.00158730158730159*G0_1_1_5_2 + 0.019047619047619*G0_1_1_5_3 + 0.019047619047619*G0_1_1_5_4 + 0.0380952380952387*G0_1_1_5_5; + A[10] = -A[9] - 0.0222222222222224*G0_0_1_0_0 - 0.0111111111111112*G0_0_1_0_1 + 0.00476190476190473*G0_0_1_0_2 - 0.0190476190476189*G0_0_1_0_3 - 0.0253968253968255*G0_0_1_0_4 - 0.0380952380952381*G0_0_1_0_5 - 0.0111111111111112*G0_0_1_1_0 + 0.104761904761906*G0_0_1_1_1 - 0.0142857142857143*G0_0_1_1_2 + 0.050793650793651*G0_0_1_1_3 + 0.00634920634920632*G0_0_1_1_4 + 0.0634920634920639*G0_0_1_1_5 + 0.00476190476190473*G0_0_1_2_0 - 0.0142857142857143*G0_0_1_2_1 + 0.0285714285714288*G0_0_1_2_2 - 0.0126984126984126*G0_0_1_2_3 + 0.0126984126984129*G0_0_1_2_4 - 0.019047619047619*G0_0_1_2_5 - 0.0190476190476189*G0_0_1_3_0 + 0.050793650793651*G0_0_1_3_1 - 0.0126984126984126*G0_0_1_3_2 + 0.101587301587301*G0_0_1_3_3 + 0.0253968253968252*G0_0_1_3_4 + 0.0761904761904758*G0_0_1_3_5 - 0.0253968253968255*G0_0_1_4_0 + 0.00634920634920632*G0_0_1_4_1 + 0.0126984126984129*G0_0_1_4_2 + 0.0253968253968252*G0_0_1_4_3 + 0.0253968253968253*G0_0_1_4_5 - 0.0380952380952381*G0_0_1_5_0 + 0.0634920634920639*G0_0_1_5_1 - 0.019047619047619*G0_0_1_5_2 + 0.0761904761904758*G0_0_1_5_3 + 0.0253968253968253*G0_0_1_5_4 + 0.203174603174606*G0_0_1_5_5; + A[18] = A[10] - 0.0126984126984128*G0_0_0_0_0 + 0.00634920634920639*G0_0_0_0_2 - 0.0126984126984126*G0_0_0_0_3 - 0.0126984126984128*G0_0_0_0_4 - 0.0126984126984126*G0_0_0_0_5 + 0.0126984126984128*G0_0_0_1_1 - 0.00634920634920639*G0_0_0_1_2 + 0.0126984126984128*G0_0_0_1_3 + 0.0126984126984127*G0_0_0_1_4 + 0.0126984126984126*G0_0_0_1_5 + 0.00634920634920639*G0_0_0_2_0 - 0.00634920634920639*G0_0_0_2_1 - 0.0126984126984126*G0_0_0_3_0 + 0.0126984126984128*G0_0_0_3_1 + 0.152380952380954*G0_0_0_3_3 + 0.0253968253968252*G0_0_0_3_5 - 0.0126984126984128*G0_0_0_4_0 + 0.0126984126984127*G0_0_0_4_1 - 0.152380952380955*G0_0_0_4_4 - 0.0253968253968254*G0_0_0_4_5 - 0.0126984126984126*G0_0_0_5_0 + 0.0126984126984126*G0_0_0_5_1 + 0.0253968253968252*G0_0_0_5_3 - 0.0253968253968254*G0_0_0_5_4 + 0.015873015873016*G0_0_1_0_0 - 0.0063492063492063*G0_0_1_0_3 + 0.00634920634920644*G0_0_1_0_4 + 0.00634920634920645*G0_0_1_0_5 + 0.00317460317460318*G0_0_1_1_1 - 0.00476190476190481*G0_0_1_1_2 + 0.00634920634920646*G0_0_1_1_3 + 0.00634920634920635*G0_0_1_1_4 - 0.00476190476190481*G0_0_1_2_1 + 0.0031746031746032*G0_0_1_2_2 + 0.00634920634920647*G0_0_1_2_3 + 0.00634920634920635*G0_0_1_2_5 - 0.0063492063492063*G0_0_1_3_0 + 0.00634920634920646*G0_0_1_3_1 + 0.00634920634920648*G0_0_1_3_2 + 0.126984126984129*G0_0_1_3_3 + 0.00634920634920645*G0_0_1_4_0 + 0.00634920634920634*G0_0_1_4_1 - 0.0761904761904772*G0_0_1_4_4 - 0.0253968253968254*G0_0_1_4_5 + 0.00634920634920645*G0_0_1_5_0 + 0.00634920634920635*G0_0_1_5_2 - 0.0253968253968254*G0_0_1_5_4 - 0.0761904761904772*G0_0_1_5_5 - 0.00952380952380959*G0_1_0_0_0 + 0.00158730158730158*G0_1_0_0_2 - 0.00634920634920631*G0_1_0_0_3 - 0.00634920634920632*G0_1_0_0_4 - 0.0126984126984128*G0_1_0_0_5 + 0.0285714285714288*G0_1_0_1_1 - 0.00634920634920638*G0_1_0_1_2 + 0.0190476190476192*G0_1_0_1_3 + 0.00634920634920632*G0_1_0_1_4 + 0.019047619047619*G0_1_0_1_5 + 0.00158730158730158*G0_1_0_2_0 - 0.00634920634920638*G0_1_0_2_1 + 0.00317460317460322*G0_1_0_2_2 + 0.00634920634920632*G0_1_0_2_4 + 0.00634920634920634*G0_1_0_2_5 - 0.00634920634920631*G0_1_0_3_0 + 0.0190476190476192*G0_1_0_3_1 + 0.0761904761904773*G0_1_0_3_3 - 0.00634920634920632*G0_1_0_4_0 + 0.00634920634920632*G0_1_0_4_1 + 0.00634920634920632*G0_1_0_4_2 - 0.0253968253968253*G0_1_0_4_4 - 0.0253968253968253*G0_1_0_4_5 - 0.0126984126984128*G0_1_0_5_0 + 0.019047619047619*G0_1_0_5_1 + 0.00634920634920634*G0_1_0_5_2 - 0.0253968253968253*G0_1_0_5_4 - 0.0761904761904772*G0_1_0_5_5 - 0.0095238095238096*G0_1_1_0_0 + 0.00158730158730158*G0_1_1_0_2 - 0.00634920634920631*G0_1_1_0_3 - 0.00634920634920632*G0_1_1_0_4 - 0.0126984126984128*G0_1_1_0_5 + 0.0285714285714288*G0_1_1_1_1 - 0.00634920634920638*G0_1_1_1_2 + 0.0190476190476192*G0_1_1_1_3 + 0.00634920634920632*G0_1_1_1_4 + 0.0190476190476191*G0_1_1_1_5 + 0.00158730158730158*G0_1_1_2_0 - 0.00634920634920638*G0_1_1_2_1 + 0.00317460317460322*G0_1_1_2_2 + 0.00634920634920632*G0_1_1_2_4 + 0.00634920634920634*G0_1_1_2_5 - 0.00634920634920631*G0_1_1_3_0 + 0.0190476190476192*G0_1_1_3_1 + 0.0761904761904773*G0_1_1_3_3 - 0.00634920634920632*G0_1_1_4_0 + 0.00634920634920632*G0_1_1_4_1 + 0.00634920634920632*G0_1_1_4_2 - 0.0253968253968253*G0_1_1_4_4 - 0.0253968253968253*G0_1_1_4_5 - 0.0126984126984128*G0_1_1_5_0 + 0.0190476190476191*G0_1_1_5_1 + 0.00634920634920634*G0_1_1_5_2 - 0.0253968253968253*G0_1_1_5_4 - 0.0761904761904772*G0_1_1_5_5; + A[3] = A[18] - 0.00158730158730155*G0_0_1_0_1 + 0.00158730158730156*G0_0_1_0_2 + 0.00634920634920646*G0_0_1_0_4 - 0.00634920634920648*G0_0_1_0_5 - 0.00158730158730155*G0_0_1_1_0 + 0.0253968253968256*G0_0_1_1_1 + 0.0190476190476192*G0_0_1_1_3 + 0.0126984126984127*G0_0_1_1_5 + 0.00158730158730156*G0_0_1_2_0 - 0.0253968253968256*G0_0_1_2_2 - 0.0190476190476192*G0_0_1_2_3 - 0.0126984126984127*G0_0_1_2_4 + 0.0190476190476192*G0_0_1_3_1 - 0.0190476190476192*G0_0_1_3_2 + 0.00634920634920645*G0_0_1_4_0 - 0.0126984126984127*G0_0_1_4_2 + 0.0507936507936519*G0_0_1_4_4 - 0.00634920634920648*G0_0_1_5_0 + 0.0126984126984127*G0_0_1_5_1 - 0.0507936507936519*G0_0_1_5_5 + 0.00158730158730155*G0_1_0_0_1 - 0.00158730158730156*G0_1_0_0_2 - 0.00634920634920646*G0_1_0_0_4 + 0.00634920634920648*G0_1_0_0_5 + 0.00158730158730155*G0_1_0_1_0 - 0.0253968253968256*G0_1_0_1_1 - 0.0190476190476192*G0_1_0_1_3 - 0.0126984126984127*G0_1_0_1_5 - 0.00158730158730156*G0_1_0_2_0 + 0.0253968253968256*G0_1_0_2_2 + 0.0190476190476192*G0_1_0_2_3 + 0.0126984126984127*G0_1_0_2_4 - 0.0190476190476192*G0_1_0_3_1 + 0.0190476190476192*G0_1_0_3_2 - 0.00634920634920645*G0_1_0_4_0 + 0.0126984126984127*G0_1_0_4_2 - 0.0507936507936519*G0_1_0_4_4 + 0.00634920634920648*G0_1_0_5_0 - 0.0126984126984127*G0_1_0_5_1 + 0.0507936507936519*G0_1_0_5_5; + A[24] = -A[18] - 0.104761904761906*G0_1_0_0_0 + 0.0111111111111112*G0_1_0_0_1 + 0.0142857142857143*G0_1_0_0_2 - 0.00634920634920632*G0_1_0_0_3 - 0.050793650793651*G0_1_0_0_4 - 0.063492063492064*G0_1_0_0_5 + 0.0111111111111112*G0_1_0_1_0 + 0.0222222222222224*G0_1_0_1_1 - 0.00476190476190474*G0_1_0_1_2 + 0.0253968253968255*G0_1_0_1_3 + 0.019047619047619*G0_1_0_1_4 + 0.0380952380952382*G0_1_0_1_5 + 0.0142857142857143*G0_1_0_2_0 - 0.00476190476190474*G0_1_0_2_1 - 0.0285714285714288*G0_1_0_2_2 - 0.0126984126984129*G0_1_0_2_3 + 0.0126984126984127*G0_1_0_2_4 + 0.019047619047619*G0_1_0_2_5 - 0.00634920634920632*G0_1_0_3_0 + 0.0253968253968255*G0_1_0_3_1 - 0.0126984126984129*G0_1_0_3_2 - 0.0253968253968253*G0_1_0_3_4 - 0.0253968253968254*G0_1_0_3_5 - 0.050793650793651*G0_1_0_4_0 + 0.019047619047619*G0_1_0_4_1 + 0.0126984126984127*G0_1_0_4_2 - 0.0253968253968253*G0_1_0_4_3 - 0.101587301587302*G0_1_0_4_4 - 0.076190476190476*G0_1_0_4_5 - 0.063492063492064*G0_1_0_5_0 + 0.0380952380952382*G0_1_0_5_1 + 0.019047619047619*G0_1_0_5_2 - 0.0253968253968254*G0_1_0_5_3 - 0.076190476190476*G0_1_0_5_4 - 0.203174603174606*G0_1_0_5_5 - 0.104761904761906*G0_1_1_0_0 + 0.0111111111111112*G0_1_1_0_1 + 0.0142857142857143*G0_1_1_0_2 - 0.00634920634920633*G0_1_1_0_3 - 0.0507936507936511*G0_1_1_0_4 - 0.063492063492064*G0_1_1_0_5 + 0.0111111111111112*G0_1_1_1_0 + 0.0222222222222224*G0_1_1_1_1 - 0.00476190476190474*G0_1_1_1_2 + 0.0253968253968255*G0_1_1_1_3 + 0.019047619047619*G0_1_1_1_4 + 0.0380952380952382*G0_1_1_1_5 + 0.0142857142857143*G0_1_1_2_0 - 0.00476190476190474*G0_1_1_2_1 - 0.0285714285714288*G0_1_1_2_2 - 0.0126984126984129*G0_1_1_2_3 + 0.0126984126984127*G0_1_1_2_4 + 0.019047619047619*G0_1_1_2_5 - 0.00634920634920633*G0_1_1_3_0 + 0.0253968253968255*G0_1_1_3_1 - 0.0126984126984129*G0_1_1_3_2 - 0.0253968253968253*G0_1_1_3_4 - 0.0253968253968254*G0_1_1_3_5 - 0.0507936507936511*G0_1_1_4_0 + 0.019047619047619*G0_1_1_4_1 + 0.0126984126984127*G0_1_1_4_2 - 0.0253968253968253*G0_1_1_4_3 - 0.101587301587302*G0_1_1_4_4 - 0.076190476190476*G0_1_1_4_5 - 0.063492063492064*G0_1_1_5_0 + 0.0380952380952382*G0_1_1_5_1 + 0.019047619047619*G0_1_1_5_2 - 0.0253968253968254*G0_1_1_5_3 - 0.076190476190476*G0_1_1_5_4 - 0.203174603174606*G0_1_1_5_5; + A[30] = -A[18] - 0.104761904761906*G0_0_0_0_0 + 0.0142857142857143*G0_0_0_0_1 + 0.0111111111111112*G0_0_0_0_2 - 0.00634920634920633*G0_0_0_0_3 - 0.063492063492064*G0_0_0_0_4 - 0.0507936507936511*G0_0_0_0_5 + 0.0142857142857143*G0_0_0_1_0 - 0.0285714285714288*G0_0_0_1_1 - 0.00476190476190474*G0_0_0_1_2 - 0.0126984126984129*G0_0_0_1_3 + 0.019047619047619*G0_0_0_1_4 + 0.0126984126984127*G0_0_0_1_5 + 0.0111111111111112*G0_0_0_2_0 - 0.00476190476190474*G0_0_0_2_1 + 0.0222222222222225*G0_0_0_2_2 + 0.0253968253968255*G0_0_0_2_3 + 0.0380952380952382*G0_0_0_2_4 + 0.019047619047619*G0_0_0_2_5 - 0.00634920634920633*G0_0_0_3_0 - 0.0126984126984129*G0_0_0_3_1 + 0.0253968253968255*G0_0_0_3_2 - 0.0253968253968254*G0_0_0_3_4 - 0.0253968253968253*G0_0_0_3_5 - 0.063492063492064*G0_0_0_4_0 + 0.019047619047619*G0_0_0_4_1 + 0.0380952380952382*G0_0_0_4_2 - 0.0253968253968254*G0_0_0_4_3 - 0.203174603174606*G0_0_0_4_4 - 0.076190476190476*G0_0_0_4_5 - 0.0507936507936511*G0_0_0_5_0 + 0.0126984126984127*G0_0_0_5_1 + 0.019047619047619*G0_0_0_5_2 - 0.0253968253968253*G0_0_0_5_3 - 0.076190476190476*G0_0_0_5_4 - 0.101587301587302*G0_0_0_5_5 - 0.104761904761906*G0_0_1_0_0 + 0.0142857142857143*G0_0_1_0_1 + 0.0111111111111112*G0_0_1_0_2 - 0.00634920634920632*G0_0_1_0_3 - 0.063492063492064*G0_0_1_0_4 - 0.050793650793651*G0_0_1_0_5 + 0.0142857142857143*G0_0_1_1_0 - 0.0285714285714288*G0_0_1_1_1 - 0.00476190476190474*G0_0_1_1_2 - 0.0126984126984129*G0_0_1_1_3 + 0.019047619047619*G0_0_1_1_4 + 0.0126984126984127*G0_0_1_1_5 + 0.0111111111111112*G0_0_1_2_0 - 0.00476190476190473*G0_0_1_2_1 + 0.0222222222222224*G0_0_1_2_2 + 0.0253968253968255*G0_0_1_2_3 + 0.0380952380952382*G0_0_1_2_4 + 0.019047619047619*G0_0_1_2_5 - 0.00634920634920632*G0_0_1_3_0 - 0.0126984126984129*G0_0_1_3_1 + 0.0253968253968255*G0_0_1_3_2 - 0.0253968253968254*G0_0_1_3_4 - 0.0253968253968253*G0_0_1_3_5 - 0.063492063492064*G0_0_1_4_0 + 0.019047619047619*G0_0_1_4_1 + 0.0380952380952382*G0_0_1_4_2 - 0.0253968253968254*G0_0_1_4_3 - 0.203174603174606*G0_0_1_4_4 - 0.076190476190476*G0_0_1_4_5 - 0.050793650793651*G0_0_1_5_0 + 0.0126984126984127*G0_0_1_5_1 + 0.019047619047619*G0_0_1_5_2 - 0.0253968253968253*G0_0_1_5_3 - 0.076190476190476*G0_0_1_5_4 - 0.101587301587302*G0_0_1_5_5; + A[4] = -A[3] - 0.104761904761906*G0_0_1_0_0 + 0.0111111111111112*G0_0_1_0_1 + 0.0142857142857143*G0_0_1_0_2 - 0.00634920634920632*G0_0_1_0_3 - 0.050793650793651*G0_0_1_0_4 - 0.063492063492064*G0_0_1_0_5 + 0.0111111111111112*G0_0_1_1_0 + 0.0222222222222224*G0_0_1_1_1 - 0.00476190476190474*G0_0_1_1_2 + 0.0253968253968255*G0_0_1_1_3 + 0.019047619047619*G0_0_1_1_4 + 0.0380952380952382*G0_0_1_1_5 + 0.0142857142857143*G0_0_1_2_0 - 0.00476190476190474*G0_0_1_2_1 - 0.0285714285714288*G0_0_1_2_2 - 0.0126984126984129*G0_0_1_2_3 + 0.0126984126984127*G0_0_1_2_4 + 0.019047619047619*G0_0_1_2_5 - 0.00634920634920632*G0_0_1_3_0 + 0.0253968253968255*G0_0_1_3_1 - 0.0126984126984129*G0_0_1_3_2 - 0.0253968253968253*G0_0_1_3_4 - 0.0253968253968254*G0_0_1_3_5 - 0.050793650793651*G0_0_1_4_0 + 0.019047619047619*G0_0_1_4_1 + 0.0126984126984127*G0_0_1_4_2 - 0.0253968253968253*G0_0_1_4_3 - 0.101587301587302*G0_0_1_4_4 - 0.076190476190476*G0_0_1_4_5 - 0.063492063492064*G0_0_1_5_0 + 0.0380952380952382*G0_0_1_5_1 + 0.019047619047619*G0_0_1_5_2 - 0.0253968253968254*G0_0_1_5_3 - 0.076190476190476*G0_0_1_5_4 - 0.203174603174606*G0_0_1_5_5 - 0.104761904761906*G0_1_1_0_0 + 0.0111111111111112*G0_1_1_0_1 + 0.0142857142857143*G0_1_1_0_2 - 0.00634920634920633*G0_1_1_0_3 - 0.0507936507936511*G0_1_1_0_4 - 0.063492063492064*G0_1_1_0_5 + 0.0111111111111112*G0_1_1_1_0 + 0.0222222222222224*G0_1_1_1_1 - 0.00476190476190474*G0_1_1_1_2 + 0.0253968253968255*G0_1_1_1_3 + 0.019047619047619*G0_1_1_1_4 + 0.0380952380952382*G0_1_1_1_5 + 0.0142857142857143*G0_1_1_2_0 - 0.00476190476190474*G0_1_1_2_1 - 0.0285714285714288*G0_1_1_2_2 - 0.0126984126984129*G0_1_1_2_3 + 0.0126984126984127*G0_1_1_2_4 + 0.019047619047619*G0_1_1_2_5 - 0.00634920634920633*G0_1_1_3_0 + 0.0253968253968255*G0_1_1_3_1 - 0.0126984126984129*G0_1_1_3_2 - 0.0253968253968253*G0_1_1_3_4 - 0.0253968253968254*G0_1_1_3_5 - 0.0507936507936511*G0_1_1_4_0 + 0.019047619047619*G0_1_1_4_1 + 0.0126984126984127*G0_1_1_4_2 - 0.0253968253968253*G0_1_1_4_3 - 0.101587301587302*G0_1_1_4_4 - 0.076190476190476*G0_1_1_4_5 - 0.063492063492064*G0_1_1_5_0 + 0.0380952380952382*G0_1_1_5_1 + 0.019047619047619*G0_1_1_5_2 - 0.0253968253968254*G0_1_1_5_3 - 0.076190476190476*G0_1_1_5_4 - 0.203174603174606*G0_1_1_5_5; + A[25] = A[10] + 0.0253968253968256*G0_0_1_0_0 - 0.00158730158730156*G0_0_1_0_1 + 0.0190476190476192*G0_0_1_0_4 + 0.0126984126984128*G0_0_1_0_5 - 0.00158730158730156*G0_0_1_1_0 + 0.00158730158730157*G0_0_1_1_2 + 0.00634920634920645*G0_0_1_1_3 - 0.00634920634920649*G0_0_1_1_5 + 0.00158730158730157*G0_0_1_2_1 - 0.0253968253968256*G0_0_1_2_2 - 0.0126984126984127*G0_0_1_2_3 - 0.0190476190476192*G0_0_1_2_4 + 0.00634920634920645*G0_0_1_3_1 - 0.0126984126984127*G0_0_1_3_2 + 0.0507936507936518*G0_0_1_3_3 + 0.0190476190476192*G0_0_1_4_0 - 0.0190476190476192*G0_0_1_4_2 + 0.0126984126984128*G0_0_1_5_0 - 0.00634920634920649*G0_0_1_5_1 - 0.050793650793652*G0_0_1_5_5 - 0.0253968253968256*G0_1_0_0_0 + 0.00158730158730156*G0_1_0_0_1 - 0.0190476190476192*G0_1_0_0_4 - 0.0126984126984128*G0_1_0_0_5 + 0.00158730158730156*G0_1_0_1_0 - 0.00158730158730157*G0_1_0_1_2 - 0.00634920634920646*G0_1_0_1_3 + 0.00634920634920649*G0_1_0_1_5 - 0.00158730158730157*G0_1_0_2_1 + 0.0253968253968256*G0_1_0_2_2 + 0.0126984126984127*G0_1_0_2_3 + 0.0190476190476192*G0_1_0_2_4 - 0.00634920634920646*G0_1_0_3_1 + 0.0126984126984127*G0_1_0_3_2 - 0.0507936507936518*G0_1_0_3_3 - 0.0190476190476192*G0_1_0_4_0 + 0.0190476190476192*G0_1_0_4_2 - 0.0126984126984128*G0_1_0_5_0 + 0.00634920634920649*G0_1_0_5_1 + 0.050793650793652*G0_1_0_5_5; + A[5] = -A[3] - 0.104761904761906*G0_0_0_0_0 + 0.0142857142857143*G0_0_0_0_1 + 0.0111111111111112*G0_0_0_0_2 - 0.00634920634920633*G0_0_0_0_3 - 0.063492063492064*G0_0_0_0_4 - 0.0507936507936511*G0_0_0_0_5 + 0.0142857142857143*G0_0_0_1_0 - 0.0285714285714288*G0_0_0_1_1 - 0.00476190476190474*G0_0_0_1_2 - 0.0126984126984129*G0_0_0_1_3 + 0.019047619047619*G0_0_0_1_4 + 0.0126984126984127*G0_0_0_1_5 + 0.0111111111111112*G0_0_0_2_0 - 0.00476190476190474*G0_0_0_2_1 + 0.0222222222222225*G0_0_0_2_2 + 0.0253968253968255*G0_0_0_2_3 + 0.0380952380952382*G0_0_0_2_4 + 0.019047619047619*G0_0_0_2_5 - 0.00634920634920633*G0_0_0_3_0 - 0.0126984126984129*G0_0_0_3_1 + 0.0253968253968255*G0_0_0_3_2 - 0.0253968253968254*G0_0_0_3_4 - 0.0253968253968253*G0_0_0_3_5 - 0.063492063492064*G0_0_0_4_0 + 0.019047619047619*G0_0_0_4_1 + 0.0380952380952382*G0_0_0_4_2 - 0.0253968253968254*G0_0_0_4_3 - 0.203174603174606*G0_0_0_4_4 - 0.076190476190476*G0_0_0_4_5 - 0.0507936507936511*G0_0_0_5_0 + 0.0126984126984127*G0_0_0_5_1 + 0.019047619047619*G0_0_0_5_2 - 0.0253968253968253*G0_0_0_5_3 - 0.076190476190476*G0_0_0_5_4 - 0.101587301587302*G0_0_0_5_5 - 0.104761904761906*G0_1_0_0_0 + 0.0142857142857143*G0_1_0_0_1 + 0.0111111111111112*G0_1_0_0_2 - 0.00634920634920632*G0_1_0_0_3 - 0.063492063492064*G0_1_0_0_4 - 0.0507936507936511*G0_1_0_0_5 + 0.0142857142857143*G0_1_0_1_0 - 0.0285714285714288*G0_1_0_1_1 - 0.00476190476190474*G0_1_0_1_2 - 0.0126984126984129*G0_1_0_1_3 + 0.019047619047619*G0_1_0_1_4 + 0.0126984126984127*G0_1_0_1_5 + 0.0111111111111112*G0_1_0_2_0 - 0.00476190476190473*G0_1_0_2_1 + 0.0222222222222224*G0_1_0_2_2 + 0.0253968253968255*G0_1_0_2_3 + 0.0380952380952382*G0_1_0_2_4 + 0.019047619047619*G0_1_0_2_5 - 0.00634920634920632*G0_1_0_3_0 - 0.0126984126984129*G0_1_0_3_1 + 0.0253968253968255*G0_1_0_3_2 - 0.0253968253968254*G0_1_0_3_4 - 0.0253968253968253*G0_1_0_3_5 - 0.063492063492064*G0_1_0_4_0 + 0.019047619047619*G0_1_0_4_1 + 0.0380952380952382*G0_1_0_4_2 - 0.0253968253968254*G0_1_0_4_3 - 0.203174603174606*G0_1_0_4_4 - 0.076190476190476*G0_1_0_4_5 - 0.0507936507936511*G0_1_0_5_0 + 0.0126984126984127*G0_1_0_5_1 + 0.019047619047619*G0_1_0_5_2 - 0.0253968253968253*G0_1_0_5_3 - 0.076190476190476*G0_1_0_5_4 - 0.101587301587302*G0_1_0_5_5; + A[6] = -A[8] + 0.0214285714285716*G0_0_0_0_0 - 0.00357142857142857*G0_0_0_0_1 - 0.00198412698412701*G0_0_0_0_2 - 0.00158730158730157*G0_0_0_0_3 + 0.0126984126984128*G0_0_0_0_4 + 0.00634920634920637*G0_0_0_0_5 - 0.00357142857142857*G0_0_0_1_0 + 0.0214285714285716*G0_0_0_1_1 - 0.001984126984127*G0_0_0_1_2 + 0.0126984126984128*G0_0_0_1_3 - 0.0015873015873016*G0_0_0_1_4 + 0.00634920634920634*G0_0_0_1_5 - 0.00198412698412701*G0_0_0_2_0 - 0.001984126984127*G0_0_0_2_1 - 0.00396825396825401*G0_0_0_2_2 - 0.00634920634920638*G0_0_0_2_3 - 0.0063492063492064*G0_0_0_2_4 - 0.00158730158730157*G0_0_0_2_5 - 0.00158730158730157*G0_0_0_3_0 + 0.0126984126984128*G0_0_0_3_1 - 0.00634920634920638*G0_0_0_3_2 + 0.0380952380952387*G0_0_0_3_3 + 0.00634920634920635*G0_0_0_3_4 + 0.0063492063492063*G0_0_0_3_5 + 0.0126984126984128*G0_0_0_4_0 - 0.0015873015873016*G0_0_0_4_1 - 0.0063492063492064*G0_0_0_4_2 + 0.00634920634920635*G0_0_0_4_3 + 0.0380952380952388*G0_0_0_4_4 + 0.00634920634920633*G0_0_0_4_5 + 0.00634920634920637*G0_0_0_5_0 + 0.00634920634920634*G0_0_0_5_1 - 0.00158730158730157*G0_0_0_5_2 + 0.0063492063492063*G0_0_0_5_3 + 0.00634920634920633*G0_0_0_5_4 - 0.0126984126984132*G0_0_0_5_5 + 0.0253968253968256*G0_0_1_0_0 - 0.00158730158730157*G0_0_1_0_1 + 0.0190476190476192*G0_0_1_0_4 + 0.0126984126984128*G0_0_1_0_5 - 0.00158730158730157*G0_0_1_1_0 + 0.00158730158730156*G0_0_1_1_2 + 0.00634920634920648*G0_0_1_1_3 - 0.00634920634920647*G0_0_1_1_5 + 0.00158730158730156*G0_0_1_2_1 - 0.0253968253968256*G0_0_1_2_2 - 0.0126984126984127*G0_0_1_2_3 - 0.0190476190476192*G0_0_1_2_4 + 0.00634920634920647*G0_0_1_3_1 - 0.0126984126984127*G0_0_1_3_2 + 0.0507936507936518*G0_0_1_3_3 + 0.0190476190476192*G0_0_1_4_0 - 0.0190476190476192*G0_0_1_4_2 + 0.0126984126984128*G0_0_1_5_0 - 0.00634920634920647*G0_0_1_5_1 - 0.0507936507936519*G0_0_1_5_5; + A[23] = -A[29] + 0.126984126984128*G0_1_0_0_0 - 0.019047619047619*G0_1_0_0_2 + 0.0253968253968252*G0_1_0_0_3 + 0.0761904761904766*G0_1_0_0_4 + 0.101587301587302*G0_1_0_0_5 - 0.126984126984128*G0_1_0_1_1 + 0.019047619047619*G0_1_0_1_2 - 0.0761904761904765*G0_1_0_1_3 - 0.0253968253968253*G0_1_0_1_4 - 0.101587301587302*G0_1_0_1_5 - 0.019047619047619*G0_1_0_2_0 + 0.019047619047619*G0_1_0_2_1 + 0.0253968253968255*G0_1_0_2_3 - 0.0253968253968256*G0_1_0_2_4 + 0.0253968253968252*G0_1_0_3_0 - 0.0761904761904765*G0_1_0_3_1 + 0.0253968253968255*G0_1_0_3_2 - 0.101587301587301*G0_1_0_3_3 - 0.0507936507936504*G0_1_0_3_5 + 0.0761904761904766*G0_1_0_4_0 - 0.0253968253968253*G0_1_0_4_1 - 0.0253968253968256*G0_1_0_4_2 + 0.101587301587302*G0_1_0_4_4 + 0.0507936507936507*G0_1_0_4_5 + 0.101587301587302*G0_1_0_5_0 - 0.101587301587302*G0_1_0_5_1 - 0.0507936507936504*G0_1_0_5_3 + 0.0507936507936507*G0_1_0_5_4 - 0.0253968253968255*G0_1_1_0_0 + 0.0253968253968255*G0_1_1_0_1 - 0.00634920634920628*G0_1_1_0_2 + 0.0253968253968252*G0_1_1_0_3 + 0.0253968253968252*G0_1_1_0_5 + 0.0253968253968255*G0_1_1_1_0 - 0.152380952380954*G0_1_1_1_1 + 0.0126984126984127*G0_1_1_1_2 - 0.0761904761904765*G0_1_1_1_3 - 0.0761904761904768*G0_1_1_1_5 - 0.00634920634920628*G0_1_1_2_0 + 0.0126984126984127*G0_1_1_2_1 + 0.0507936507936508*G0_1_1_2_3 + 0.0253968253968252*G0_1_1_2_4 + 0.0507936507936506*G0_1_1_2_5 + 0.0253968253968252*G0_1_1_3_0 - 0.0761904761904765*G0_1_1_3_1 + 0.0507936507936508*G0_1_1_3_2 - 0.152380952380952*G0_1_1_3_3 - 0.0507936507936504*G0_1_1_3_4 - 0.152380952380952*G0_1_1_3_5 + 0.0253968253968252*G0_1_1_4_2 - 0.0507936507936504*G0_1_1_4_3 - 0.0507936507936505*G0_1_1_4_4 - 0.101587301587301*G0_1_1_4_5 + 0.0253968253968252*G0_1_1_5_0 - 0.0761904761904768*G0_1_1_5_1 + 0.0507936507936506*G0_1_1_5_2 - 0.152380952380952*G0_1_1_5_3 - 0.101587301587301*G0_1_1_5_4 - 0.457142857142862*G0_1_1_5_5; + A[21] = -A[23] + 0.0253968253968255*G0_0_0_0_0 + 0.00634920634920628*G0_0_0_0_1 - 0.0253968253968255*G0_0_0_0_2 - 0.0253968253968251*G0_0_0_0_3 - 0.0253968253968252*G0_0_0_0_4 + 0.00634920634920628*G0_0_0_1_0 - 0.0126984126984127*G0_0_0_1_2 - 0.0507936507936507*G0_0_0_1_3 - 0.0507936507936506*G0_0_0_1_4 - 0.0253968253968252*G0_0_0_1_5 - 0.0253968253968255*G0_0_0_2_0 - 0.0126984126984127*G0_0_0_2_1 + 0.152380952380953*G0_0_0_2_2 + 0.0761904761904764*G0_0_0_2_3 + 0.0761904761904767*G0_0_0_2_4 - 0.0253968253968251*G0_0_0_3_0 - 0.0507936507936507*G0_0_0_3_1 + 0.0761904761904764*G0_0_0_3_2 + 0.152380952380952*G0_0_0_3_3 + 0.152380952380951*G0_0_0_3_4 + 0.0507936507936504*G0_0_0_3_5 - 0.0253968253968252*G0_0_0_4_0 - 0.0507936507936506*G0_0_0_4_1 + 0.0761904761904767*G0_0_0_4_2 + 0.152380952380951*G0_0_0_4_3 + 0.457142857142861*G0_0_0_4_4 + 0.101587301587301*G0_0_0_4_5 - 0.0253968253968252*G0_0_0_5_1 + 0.0507936507936504*G0_0_0_5_3 + 0.101587301587301*G0_0_0_5_4 + 0.0507936507936505*G0_0_0_5_5 + 0.0126984126984127*G0_1_0_0_0 + 0.0126984126984127*G0_1_0_0_1 - 0.00634920634920631*G0_1_0_0_2 + 0.0253968253968256*G0_1_0_0_5 + 0.0126984126984127*G0_1_0_1_0 - 0.114285714285715*G0_1_0_1_1 + 0.0126984126984127*G0_1_0_1_2 - 0.0761904761904764*G0_1_0_1_3 - 0.0253968253968252*G0_1_0_1_4 - 0.0761904761904765*G0_1_0_1_5 - 0.0063492063492063*G0_1_0_2_0 + 0.0126984126984127*G0_1_0_2_1 + 0.0126984126984127*G0_1_0_2_2 + 0.0253968253968255*G0_1_0_2_3 - 0.0761904761904764*G0_1_0_3_1 + 0.0253968253968255*G0_1_0_3_2 + 0.0507936507936503*G0_1_0_3_4 - 0.0253968253968252*G0_1_0_4_1 + 0.0507936507936503*G0_1_0_4_3 + 0.101587301587301*G0_1_0_4_4 + 0.0507936507936505*G0_1_0_4_5 + 0.0253968253968256*G0_1_0_5_0 - 0.0761904761904765*G0_1_0_5_1 + 0.0507936507936505*G0_1_0_5_4; + A[33] = A[23] + 0.0126984126984127*G0_0_1_0_0 + 0.0126984126984127*G0_0_1_0_1 - 0.00634920634920631*G0_0_1_0_2 + 0.0253968253968256*G0_0_1_0_5 + 0.0126984126984127*G0_0_1_1_0 - 0.114285714285715*G0_0_1_1_1 + 0.0126984126984127*G0_0_1_1_2 - 0.0761904761904764*G0_0_1_1_3 - 0.0253968253968252*G0_0_1_1_4 - 0.0761904761904765*G0_0_1_1_5 - 0.00634920634920631*G0_0_1_2_0 + 0.0126984126984127*G0_0_1_2_1 + 0.0126984126984127*G0_0_1_2_2 + 0.0253968253968256*G0_0_1_2_3 - 0.0761904761904764*G0_0_1_3_1 + 0.0253968253968256*G0_0_1_3_2 + 0.0507936507936504*G0_0_1_3_4 - 0.0253968253968252*G0_0_1_4_1 + 0.0507936507936503*G0_0_1_4_3 + 0.101587301587301*G0_0_1_4_4 + 0.0507936507936505*G0_0_1_4_5 + 0.0253968253968256*G0_0_1_5_0 - 0.0761904761904765*G0_0_1_5_1 + 0.0507936507936505*G0_0_1_5_4 - 0.0126984126984127*G0_1_0_0_0 - 0.0126984126984127*G0_1_0_0_1 + 0.00634920634920631*G0_1_0_0_2 - 0.0253968253968256*G0_1_0_0_5 - 0.0126984126984127*G0_1_0_1_0 + 0.114285714285715*G0_1_0_1_1 - 0.0126984126984127*G0_1_0_1_2 + 0.0761904761904764*G0_1_0_1_3 + 0.0253968253968252*G0_1_0_1_4 + 0.0761904761904765*G0_1_0_1_5 + 0.00634920634920631*G0_1_0_2_0 - 0.0126984126984127*G0_1_0_2_1 - 0.0126984126984127*G0_1_0_2_2 - 0.0253968253968256*G0_1_0_2_3 + 0.0761904761904764*G0_1_0_3_1 - 0.0253968253968256*G0_1_0_3_2 - 0.0507936507936503*G0_1_0_3_4 + 0.0253968253968252*G0_1_0_4_1 - 0.0507936507936504*G0_1_0_4_3 - 0.101587301587301*G0_1_0_4_4 - 0.0507936507936505*G0_1_0_4_5 - 0.0253968253968256*G0_1_0_5_0 + 0.0761904761904765*G0_1_0_5_1 - 0.0507936507936505*G0_1_0_5_4; + A[35] = -A[23] + 0.139682539682541*G0_0_0_0_0 - 0.0253968253968255*G0_0_0_0_1 - 0.0190476190476192*G0_0_0_0_2 + 0.0761904761904769*G0_0_0_0_4 + 0.050793650793651*G0_0_0_0_5 - 0.0253968253968255*G0_0_0_1_0 + 0.114285714285715*G0_0_0_1_1 - 0.00634920634920641*G0_0_0_1_2 + 0.0507936507936512*G0_0_0_1_3 - 0.0253968253968254*G0_0_0_1_4 + 0.0253968253968256*G0_0_0_1_5 - 0.0190476190476192*G0_0_0_2_0 - 0.00634920634920641*G0_0_0_2_1 + 0.0126984126984128*G0_0_0_2_2 - 0.0253968253968256*G0_0_0_2_3 - 0.0253968253968253*G0_0_0_2_4 - 0.0253968253968253*G0_0_0_2_5 + 0.0507936507936512*G0_0_0_3_1 - 0.0253968253968256*G0_0_0_3_2 + 0.0507936507936512*G0_0_0_3_3 + 0.0507936507936508*G0_0_0_3_4 + 0.0507936507936506*G0_0_0_3_5 + 0.0761904761904769*G0_0_0_4_0 - 0.0253968253968254*G0_0_0_4_1 - 0.0253968253968253*G0_0_0_4_2 + 0.0507936507936508*G0_0_0_4_3 + 0.355555555555561*G0_0_0_4_4 + 0.101587301587301*G0_0_0_4_5 + 0.050793650793651*G0_0_0_5_0 + 0.0253968253968256*G0_0_0_5_1 - 0.0253968253968253*G0_0_0_5_2 + 0.0507936507936506*G0_0_0_5_3 + 0.101587301587301*G0_0_0_5_4 + 0.152380952380953*G0_0_0_5_5 - 0.0126984126984127*G0_0_1_0_0 - 0.0126984126984127*G0_0_1_0_1 + 0.00634920634920631*G0_0_1_0_2 - 0.0253968253968256*G0_0_1_0_5 - 0.0126984126984127*G0_0_1_1_0 + 0.114285714285715*G0_0_1_1_1 - 0.0126984126984127*G0_0_1_1_2 + 0.0761904761904765*G0_0_1_1_3 + 0.0253968253968252*G0_0_1_1_4 + 0.0761904761904765*G0_0_1_1_5 + 0.00634920634920631*G0_0_1_2_0 - 0.0126984126984127*G0_0_1_2_1 - 0.0126984126984127*G0_0_1_2_2 - 0.0253968253968256*G0_0_1_2_3 + 0.0761904761904765*G0_0_1_3_1 - 0.0253968253968256*G0_0_1_3_2 - 0.0507936507936504*G0_0_1_3_4 + 0.0253968253968252*G0_0_1_4_1 - 0.0507936507936504*G0_0_1_4_3 - 0.101587301587301*G0_0_1_4_4 - 0.0507936507936505*G0_0_1_4_5 - 0.0253968253968256*G0_0_1_5_0 + 0.0761904761904765*G0_0_1_5_1 - 0.0507936507936505*G0_0_1_5_4; + A[19] = -A[25] - 0.0222222222222224*G0_1_0_0_0 - 0.0111111111111112*G0_1_0_0_1 + 0.00476190476190473*G0_1_0_0_2 - 0.0190476190476189*G0_1_0_0_3 - 0.0253968253968255*G0_1_0_0_4 - 0.0380952380952381*G0_1_0_0_5 - 0.0111111111111112*G0_1_0_1_0 + 0.104761904761906*G0_1_0_1_1 - 0.0142857142857143*G0_1_0_1_2 + 0.050793650793651*G0_1_0_1_3 + 0.00634920634920632*G0_1_0_1_4 + 0.0634920634920639*G0_1_0_1_5 + 0.00476190476190473*G0_1_0_2_0 - 0.0142857142857143*G0_1_0_2_1 + 0.0285714285714288*G0_1_0_2_2 - 0.0126984126984126*G0_1_0_2_3 + 0.0126984126984129*G0_1_0_2_4 - 0.019047619047619*G0_1_0_2_5 - 0.0190476190476189*G0_1_0_3_0 + 0.050793650793651*G0_1_0_3_1 - 0.0126984126984126*G0_1_0_3_2 + 0.101587301587301*G0_1_0_3_3 + 0.0253968253968252*G0_1_0_3_4 + 0.0761904761904758*G0_1_0_3_5 - 0.0253968253968255*G0_1_0_4_0 + 0.00634920634920632*G0_1_0_4_1 + 0.0126984126984129*G0_1_0_4_2 + 0.0253968253968252*G0_1_0_4_3 + 0.0253968253968253*G0_1_0_4_5 - 0.0380952380952381*G0_1_0_5_0 + 0.0634920634920639*G0_1_0_5_1 - 0.019047619047619*G0_1_0_5_2 + 0.0761904761904758*G0_1_0_5_3 + 0.0253968253968253*G0_1_0_5_4 + 0.203174603174606*G0_1_0_5_5; + A[31] = -A[19] - 0.0349206349206352*G0_0_0_0_0 + 0.0111111111111111*G0_0_0_0_1 + 0.00793650793650803*G0_0_0_0_2 + 0.00634920634920631*G0_0_0_0_3 - 0.0126984126984129*G0_0_0_0_4 + 0.0111111111111111*G0_0_0_1_0 - 0.0857142857142864*G0_0_0_1_1 + 0.0111111111111111*G0_0_0_1_2 - 0.0380952380952383*G0_0_0_1_3 + 0.00634920634920638*G0_0_0_1_4 - 0.0380952380952384*G0_0_0_1_5 + 0.00793650793650803*G0_0_0_2_0 + 0.0111111111111111*G0_0_0_2_1 - 0.0349206349206353*G0_0_0_2_2 - 0.0126984126984129*G0_0_0_2_4 + 0.00634920634920632*G0_0_0_2_5 + 0.00634920634920631*G0_0_0_3_0 - 0.0380952380952383*G0_0_0_3_1 - 0.0507936507936512*G0_0_0_3_3 - 0.0253968253968254*G0_0_0_3_4 - 0.0253968253968253*G0_0_0_3_5 - 0.0126984126984129*G0_0_0_4_0 + 0.00634920634920638*G0_0_0_4_1 - 0.0126984126984129*G0_0_0_4_2 - 0.0253968253968254*G0_0_0_4_3 - 0.152380952380955*G0_0_0_4_4 - 0.0253968253968254*G0_0_0_4_5 - 0.0380952380952384*G0_0_0_5_1 + 0.00634920634920632*G0_0_0_5_2 - 0.0253968253968253*G0_0_0_5_3 - 0.0253968253968254*G0_0_0_5_4 - 0.0507936507936513*G0_0_0_5_5; + A[12] = -A[13] + 0.0253968253968256*G0_1_0_0_0 - 0.00158730158730157*G0_1_0_0_2 + 0.0126984126984128*G0_1_0_0_4 + 0.0190476190476192*G0_1_0_0_5 - 0.0253968253968256*G0_1_0_1_1 + 0.00158730158730156*G0_1_0_1_2 - 0.0126984126984127*G0_1_0_1_3 - 0.0190476190476192*G0_1_0_1_5 - 0.00158730158730157*G0_1_0_2_0 + 0.00158730158730156*G0_1_0_2_1 + 0.00634920634920648*G0_1_0_2_3 - 0.00634920634920647*G0_1_0_2_4 - 0.0126984126984127*G0_1_0_3_1 + 0.00634920634920648*G0_1_0_3_2 + 0.0507936507936518*G0_1_0_3_3 + 0.0126984126984128*G0_1_0_4_0 - 0.00634920634920647*G0_1_0_4_2 - 0.0507936507936519*G0_1_0_4_4 + 0.0190476190476192*G0_1_0_5_0 - 0.0190476190476192*G0_1_0_5_1 + 0.0214285714285716*G0_1_1_0_0 - 0.00198412698412701*G0_1_1_0_1 - 0.00357142857142857*G0_1_1_0_2 - 0.00158730158730157*G0_1_1_0_3 + 0.00634920634920637*G0_1_1_0_4 + 0.0126984126984128*G0_1_1_0_5 - 0.00198412698412701*G0_1_1_1_0 - 0.003968253968254*G0_1_1_1_1 - 0.001984126984127*G0_1_1_1_2 - 0.00634920634920638*G0_1_1_1_3 - 0.00158730158730157*G0_1_1_1_4 - 0.00634920634920639*G0_1_1_1_5 - 0.00357142857142857*G0_1_1_2_0 - 0.001984126984127*G0_1_1_2_1 + 0.0214285714285716*G0_1_1_2_2 + 0.0126984126984128*G0_1_1_2_3 + 0.00634920634920635*G0_1_1_2_4 - 0.00158730158730158*G0_1_1_2_5 - 0.00158730158730157*G0_1_1_3_0 - 0.00634920634920638*G0_1_1_3_1 + 0.0126984126984128*G0_1_1_3_2 + 0.0380952380952387*G0_1_1_3_3 + 0.00634920634920629*G0_1_1_3_4 + 0.00634920634920635*G0_1_1_3_5 + 0.00634920634920636*G0_1_1_4_0 - 0.00158730158730156*G0_1_1_4_1 + 0.00634920634920636*G0_1_1_4_2 + 0.00634920634920629*G0_1_1_4_3 - 0.0126984126984132*G0_1_1_4_4 + 0.00634920634920632*G0_1_1_4_5 + 0.0126984126984128*G0_1_1_5_0 - 0.00634920634920639*G0_1_1_5_1 - 0.00158730158730159*G0_1_1_5_2 + 0.00634920634920635*G0_1_1_5_3 + 0.00634920634920632*G0_1_1_5_4 + 0.0380952380952387*G0_1_1_5_5; + A[27] = -A[21] + 0.0126984126984127*G0_1_0_0_0 - 0.0063492063492063*G0_1_0_0_1 + 0.0126984126984127*G0_1_0_0_2 + 0.0253968253968256*G0_1_0_0_4 - 0.0063492063492063*G0_1_0_1_0 + 0.0126984126984127*G0_1_0_1_1 + 0.0126984126984127*G0_1_0_1_2 + 0.0253968253968255*G0_1_0_1_3 + 0.0126984126984127*G0_1_0_2_0 + 0.0126984126984127*G0_1_0_2_1 - 0.114285714285715*G0_1_0_2_2 - 0.0761904761904764*G0_1_0_2_3 - 0.0761904761904765*G0_1_0_2_4 - 0.0253968253968253*G0_1_0_2_5 + 0.0253968253968255*G0_1_0_3_1 - 0.0761904761904764*G0_1_0_3_2 + 0.0507936507936503*G0_1_0_3_5 + 0.0253968253968256*G0_1_0_4_0 - 0.0761904761904765*G0_1_0_4_2 + 0.0507936507936504*G0_1_0_4_5 - 0.0253968253968253*G0_1_0_5_2 + 0.0507936507936503*G0_1_0_5_3 + 0.0507936507936504*G0_1_0_5_4 + 0.101587301587301*G0_1_0_5_5 + 0.0253968253968255*G0_1_1_0_0 - 0.0253968253968255*G0_1_1_0_1 + 0.00634920634920628*G0_1_1_0_2 - 0.0253968253968252*G0_1_1_0_3 - 0.0253968253968252*G0_1_1_0_5 - 0.0253968253968255*G0_1_1_1_0 + 0.152380952380953*G0_1_1_1_1 - 0.0126984126984127*G0_1_1_1_2 + 0.0761904761904765*G0_1_1_1_3 + 0.0761904761904768*G0_1_1_1_5 + 0.00634920634920628*G0_1_1_2_0 - 0.0126984126984127*G0_1_1_2_1 - 0.0507936507936507*G0_1_1_2_3 - 0.0253968253968252*G0_1_1_2_4 - 0.0507936507936506*G0_1_1_2_5 - 0.0253968253968252*G0_1_1_3_0 + 0.0761904761904765*G0_1_1_3_1 - 0.0507936507936507*G0_1_1_3_2 + 0.152380952380952*G0_1_1_3_3 + 0.0507936507936504*G0_1_1_3_4 + 0.152380952380952*G0_1_1_3_5 - 0.0253968253968252*G0_1_1_4_2 + 0.0507936507936504*G0_1_1_4_3 + 0.0507936507936505*G0_1_1_4_4 + 0.101587301587301*G0_1_1_4_5 - 0.0253968253968252*G0_1_1_5_0 + 0.0761904761904768*G0_1_1_5_1 - 0.0507936507936506*G0_1_1_5_2 + 0.152380952380952*G0_1_1_5_3 + 0.101587301587301*G0_1_1_5_4 + 0.457142857142862*G0_1_1_5_5; + A[28] = -A[27] - 0.0126984126984127*G0_0_1_0_0 + 0.0063492063492063*G0_0_1_0_1 - 0.0126984126984127*G0_0_1_0_2 - 0.0253968253968256*G0_0_1_0_4 + 0.0063492063492063*G0_0_1_1_0 - 0.0126984126984127*G0_0_1_1_1 - 0.0126984126984127*G0_0_1_1_2 - 0.0253968253968255*G0_0_1_1_3 - 0.0126984126984127*G0_0_1_2_0 - 0.0126984126984127*G0_0_1_2_1 + 0.114285714285715*G0_0_1_2_2 + 0.0761904761904764*G0_0_1_2_3 + 0.0761904761904765*G0_0_1_2_4 + 0.0253968253968253*G0_0_1_2_5 - 0.0253968253968255*G0_0_1_3_1 + 0.0761904761904764*G0_0_1_3_2 - 0.0507936507936503*G0_0_1_3_5 - 0.0253968253968256*G0_0_1_4_0 + 0.0761904761904765*G0_0_1_4_2 - 0.0507936507936504*G0_0_1_4_5 + 0.0253968253968253*G0_0_1_5_2 - 0.0507936507936503*G0_0_1_5_3 - 0.0507936507936504*G0_0_1_5_4 - 0.101587301587301*G0_0_1_5_5 + 0.139682539682541*G0_1_1_0_0 - 0.0190476190476192*G0_1_1_0_1 - 0.0253968253968255*G0_1_1_0_2 + 0.050793650793651*G0_1_1_0_4 + 0.0761904761904769*G0_1_1_0_5 - 0.0190476190476192*G0_1_1_1_0 + 0.0126984126984128*G0_1_1_1_1 - 0.0063492063492064*G0_1_1_1_2 - 0.0253968253968255*G0_1_1_1_3 - 0.0253968253968253*G0_1_1_1_4 - 0.0253968253968253*G0_1_1_1_5 - 0.0253968253968255*G0_1_1_2_0 - 0.0063492063492064*G0_1_1_2_1 + 0.114285714285715*G0_1_1_2_2 + 0.0507936507936512*G0_1_1_2_3 + 0.0253968253968256*G0_1_1_2_4 - 0.0253968253968254*G0_1_1_2_5 - 0.0253968253968255*G0_1_1_3_1 + 0.0507936507936512*G0_1_1_3_2 + 0.0507936507936512*G0_1_1_3_3 + 0.0507936507936505*G0_1_1_3_4 + 0.0507936507936508*G0_1_1_3_5 + 0.050793650793651*G0_1_1_4_0 - 0.0253968253968253*G0_1_1_4_1 + 0.0253968253968256*G0_1_1_4_2 + 0.0507936507936505*G0_1_1_4_3 + 0.152380952380953*G0_1_1_4_4 + 0.101587301587301*G0_1_1_4_5 + 0.0761904761904769*G0_1_1_5_0 - 0.0253968253968253*G0_1_1_5_1 - 0.0253968253968254*G0_1_1_5_2 + 0.0507936507936508*G0_1_1_5_3 + 0.101587301587301*G0_1_1_5_4 + 0.355555555555561*G0_1_1_5_5; + A[22] = A[27] + 0.0126984126984127*G0_0_1_0_0 - 0.0063492063492063*G0_0_1_0_1 + 0.0126984126984127*G0_0_1_0_2 + 0.0253968253968256*G0_0_1_0_4 - 0.0063492063492063*G0_0_1_1_0 + 0.0126984126984127*G0_0_1_1_1 + 0.0126984126984127*G0_0_1_1_2 + 0.0253968253968255*G0_0_1_1_3 + 0.0126984126984127*G0_0_1_2_0 + 0.0126984126984127*G0_0_1_2_1 - 0.114285714285715*G0_0_1_2_2 - 0.0761904761904764*G0_0_1_2_3 - 0.0761904761904765*G0_0_1_2_4 - 0.0253968253968253*G0_0_1_2_5 + 0.0253968253968255*G0_0_1_3_1 - 0.0761904761904764*G0_0_1_3_2 + 0.0507936507936503*G0_0_1_3_5 + 0.0253968253968256*G0_0_1_4_0 - 0.0761904761904765*G0_0_1_4_2 + 0.0507936507936504*G0_0_1_4_5 - 0.0253968253968253*G0_0_1_5_2 + 0.0507936507936503*G0_0_1_5_3 + 0.0507936507936504*G0_0_1_5_4 + 0.101587301587301*G0_0_1_5_5 - 0.0126984126984127*G0_1_0_0_0 + 0.0063492063492063*G0_1_0_0_1 - 0.0126984126984127*G0_1_0_0_2 - 0.0253968253968256*G0_1_0_0_4 + 0.0063492063492063*G0_1_0_1_0 - 0.0126984126984127*G0_1_0_1_1 - 0.0126984126984127*G0_1_0_1_2 - 0.0253968253968255*G0_1_0_1_3 - 0.0126984126984127*G0_1_0_2_0 - 0.0126984126984127*G0_1_0_2_1 + 0.114285714285715*G0_1_0_2_2 + 0.0761904761904764*G0_1_0_2_3 + 0.0761904761904765*G0_1_0_2_4 + 0.0253968253968253*G0_1_0_2_5 - 0.0253968253968255*G0_1_0_3_1 + 0.0761904761904764*G0_1_0_3_2 - 0.0507936507936503*G0_1_0_3_5 - 0.0253968253968256*G0_1_0_4_0 + 0.0761904761904765*G0_1_0_4_2 - 0.0507936507936504*G0_1_0_4_5 + 0.0253968253968253*G0_1_0_5_2 - 0.0507936507936503*G0_1_0_5_3 - 0.0507936507936504*G0_1_0_5_4 - 0.101587301587301*G0_1_0_5_5; + A[15] = -A[17] - 0.0222222222222225*G0_1_0_0_0 + 0.00476190476190473*G0_1_0_0_1 - 0.0111111111111112*G0_1_0_0_2 - 0.0190476190476189*G0_1_0_0_3 - 0.0380952380952381*G0_1_0_0_4 - 0.0253968253968255*G0_1_0_0_5 + 0.00476190476190473*G0_1_0_1_0 + 0.0285714285714288*G0_1_0_1_1 - 0.0142857142857143*G0_1_0_1_2 - 0.0126984126984126*G0_1_0_1_3 - 0.019047619047619*G0_1_0_1_4 + 0.0126984126984129*G0_1_0_1_5 - 0.0111111111111112*G0_1_0_2_0 - 0.0142857142857143*G0_1_0_2_1 + 0.104761904761906*G0_1_0_2_2 + 0.0507936507936509*G0_1_0_2_3 + 0.0634920634920639*G0_1_0_2_4 + 0.00634920634920634*G0_1_0_2_5 - 0.0190476190476189*G0_1_0_3_0 - 0.0126984126984126*G0_1_0_3_1 + 0.0507936507936509*G0_1_0_3_2 + 0.101587301587301*G0_1_0_3_3 + 0.0761904761904758*G0_1_0_3_4 + 0.0253968253968252*G0_1_0_3_5 - 0.0380952380952381*G0_1_0_4_0 - 0.019047619047619*G0_1_0_4_1 + 0.0634920634920639*G0_1_0_4_2 + 0.0761904761904758*G0_1_0_4_3 + 0.203174603174605*G0_1_0_4_4 + 0.0253968253968254*G0_1_0_4_5 - 0.0253968253968255*G0_1_0_5_0 + 0.0126984126984129*G0_1_0_5_1 + 0.00634920634920634*G0_1_0_5_2 + 0.0253968253968252*G0_1_0_5_3 + 0.0253968253968254*G0_1_0_5_4; + A[16] = -A[15] - 0.0349206349206352*G0_1_1_0_0 + 0.00793650793650803*G0_1_1_0_1 + 0.0111111111111111*G0_1_1_0_2 + 0.0063492063492063*G0_1_1_0_3 - 0.0126984126984129*G0_1_1_0_5 + 0.00793650793650803*G0_1_1_1_0 - 0.0349206349206352*G0_1_1_1_1 + 0.0111111111111111*G0_1_1_1_2 + 0.00634920634920631*G0_1_1_1_4 - 0.0126984126984129*G0_1_1_1_5 + 0.0111111111111111*G0_1_1_2_0 + 0.0111111111111111*G0_1_1_2_1 - 0.0857142857142865*G0_1_1_2_2 - 0.0380952380952384*G0_1_1_2_3 - 0.0380952380952384*G0_1_1_2_4 + 0.00634920634920634*G0_1_1_2_5 + 0.0063492063492063*G0_1_1_3_0 - 0.0380952380952384*G0_1_1_3_2 - 0.0507936507936512*G0_1_1_3_3 - 0.0253968253968253*G0_1_1_3_4 - 0.0253968253968254*G0_1_1_3_5 + 0.00634920634920631*G0_1_1_4_1 - 0.0380952380952384*G0_1_1_4_2 - 0.0253968253968253*G0_1_1_4_3 - 0.0507936507936512*G0_1_1_4_4 - 0.0253968253968254*G0_1_1_4_5 - 0.0126984126984129*G0_1_1_5_0 - 0.0126984126984129*G0_1_1_5_1 + 0.00634920634920634*G0_1_1_5_2 - 0.0253968253968254*G0_1_1_5_3 - 0.0253968253968254*G0_1_1_5_4 - 0.152380952380955*G0_1_1_5_5; + A[32] = A[17] - 0.0253968253968256*G0_0_1_0_0 + 0.00158730158730156*G0_0_1_0_2 - 0.0126984126984128*G0_0_1_0_4 - 0.0190476190476192*G0_0_1_0_5 + 0.0253968253968256*G0_0_1_1_1 - 0.00158730158730156*G0_0_1_1_2 + 0.0126984126984127*G0_0_1_1_3 + 0.0190476190476192*G0_0_1_1_5 + 0.00158730158730156*G0_0_1_2_0 - 0.00158730158730156*G0_0_1_2_1 - 0.00634920634920647*G0_0_1_2_3 + 0.00634920634920647*G0_0_1_2_4 + 0.0126984126984127*G0_0_1_3_1 - 0.00634920634920647*G0_0_1_3_2 - 0.0507936507936518*G0_0_1_3_3 - 0.0126984126984128*G0_0_1_4_0 + 0.00634920634920648*G0_0_1_4_2 + 0.0507936507936519*G0_0_1_4_4 - 0.0190476190476192*G0_0_1_5_0 + 0.0190476190476192*G0_0_1_5_1 + 0.0253968253968256*G0_1_0_0_0 - 0.00158730158730156*G0_1_0_0_2 + 0.0126984126984128*G0_1_0_0_4 + 0.0190476190476192*G0_1_0_0_5 - 0.0253968253968256*G0_1_0_1_1 + 0.00158730158730156*G0_1_0_1_2 - 0.0126984126984127*G0_1_0_1_3 - 0.0190476190476192*G0_1_0_1_5 - 0.00158730158730156*G0_1_0_2_0 + 0.00158730158730156*G0_1_0_2_1 + 0.00634920634920647*G0_1_0_2_3 - 0.00634920634920647*G0_1_0_2_4 - 0.0126984126984127*G0_1_0_3_1 + 0.00634920634920647*G0_1_0_3_2 + 0.0507936507936518*G0_1_0_3_3 + 0.0126984126984128*G0_1_0_4_0 - 0.00634920634920648*G0_1_0_4_2 - 0.0507936507936519*G0_1_0_4_4 + 0.0190476190476192*G0_1_0_5_0 - 0.0190476190476192*G0_1_0_5_1; + A[20] = -A[32] - 0.0222222222222224*G0_0_1_0_0 + 0.00476190476190473*G0_0_1_0_1 - 0.0111111111111112*G0_0_1_0_2 - 0.0190476190476189*G0_0_1_0_3 - 0.0380952380952381*G0_0_1_0_4 - 0.0253968253968255*G0_0_1_0_5 + 0.00476190476190473*G0_0_1_1_0 + 0.0285714285714288*G0_0_1_1_1 - 0.0142857142857143*G0_0_1_1_2 - 0.0126984126984126*G0_0_1_1_3 - 0.019047619047619*G0_0_1_1_4 + 0.0126984126984129*G0_0_1_1_5 - 0.0111111111111112*G0_0_1_2_0 - 0.0142857142857143*G0_0_1_2_1 + 0.104761904761906*G0_0_1_2_2 + 0.0507936507936509*G0_0_1_2_3 + 0.0634920634920639*G0_0_1_2_4 + 0.00634920634920634*G0_0_1_2_5 - 0.0190476190476189*G0_0_1_3_0 - 0.0126984126984126*G0_0_1_3_1 + 0.0507936507936509*G0_0_1_3_2 + 0.101587301587301*G0_0_1_3_3 + 0.0761904761904758*G0_0_1_3_4 + 0.0253968253968252*G0_0_1_3_5 - 0.0380952380952381*G0_0_1_4_0 - 0.019047619047619*G0_0_1_4_1 + 0.0634920634920639*G0_0_1_4_2 + 0.0761904761904758*G0_0_1_4_3 + 0.203174603174605*G0_0_1_4_4 + 0.0253968253968254*G0_0_1_4_5 - 0.0253968253968255*G0_0_1_5_0 + 0.0126984126984129*G0_0_1_5_1 + 0.00634920634920634*G0_0_1_5_2 + 0.0253968253968252*G0_0_1_5_3 + 0.0253968253968254*G0_0_1_5_4; + A[26] = -A[20] - 0.0349206349206352*G0_1_1_0_0 + 0.00793650793650803*G0_1_1_0_1 + 0.0111111111111111*G0_1_1_0_2 + 0.0063492063492063*G0_1_1_0_3 - 0.0126984126984129*G0_1_1_0_5 + 0.00793650793650803*G0_1_1_1_0 - 0.0349206349206352*G0_1_1_1_1 + 0.0111111111111111*G0_1_1_1_2 + 0.00634920634920631*G0_1_1_1_4 - 0.0126984126984129*G0_1_1_1_5 + 0.0111111111111111*G0_1_1_2_0 + 0.0111111111111111*G0_1_1_2_1 - 0.0857142857142865*G0_1_1_2_2 - 0.0380952380952384*G0_1_1_2_3 - 0.0380952380952384*G0_1_1_2_4 + 0.00634920634920634*G0_1_1_2_5 + 0.0063492063492063*G0_1_1_3_0 - 0.0380952380952384*G0_1_1_3_2 - 0.0507936507936512*G0_1_1_3_3 - 0.0253968253968253*G0_1_1_3_4 - 0.0253968253968254*G0_1_1_3_5 + 0.00634920634920632*G0_1_1_4_1 - 0.0380952380952384*G0_1_1_4_2 - 0.0253968253968253*G0_1_1_4_3 - 0.0507936507936512*G0_1_1_4_4 - 0.0253968253968254*G0_1_1_4_5 - 0.0126984126984129*G0_1_1_5_0 - 0.0126984126984129*G0_1_1_5_1 + 0.00634920634920634*G0_1_1_5_2 - 0.0253968253968254*G0_1_1_5_3 - 0.0253968253968254*G0_1_1_5_4 - 0.152380952380955*G0_1_1_5_5; + A[2] = -A[8] + 0.0253968253968256*G0_0_1_0_0 - 0.00158730158730157*G0_0_1_0_2 + 0.0126984126984128*G0_0_1_0_4 + 0.0190476190476192*G0_0_1_0_5 - 0.0253968253968256*G0_0_1_1_1 + 0.00158730158730156*G0_0_1_1_2 - 0.0126984126984127*G0_0_1_1_3 - 0.0190476190476192*G0_0_1_1_5 - 0.00158730158730157*G0_0_1_2_0 + 0.00158730158730156*G0_0_1_2_1 + 0.00634920634920648*G0_0_1_2_3 - 0.00634920634920647*G0_0_1_2_4 - 0.0126984126984127*G0_0_1_3_1 + 0.00634920634920648*G0_0_1_3_2 + 0.0507936507936518*G0_0_1_3_3 + 0.0126984126984128*G0_0_1_4_0 - 0.00634920634920647*G0_0_1_4_2 - 0.0507936507936519*G0_0_1_4_4 + 0.0190476190476192*G0_0_1_5_0 - 0.0190476190476192*G0_0_1_5_1 + 0.0214285714285716*G0_1_1_0_0 - 0.00198412698412701*G0_1_1_0_1 - 0.00357142857142857*G0_1_1_0_2 - 0.00158730158730157*G0_1_1_0_3 + 0.00634920634920636*G0_1_1_0_4 + 0.0126984126984128*G0_1_1_0_5 - 0.00198412698412701*G0_1_1_1_0 - 0.003968253968254*G0_1_1_1_1 - 0.001984126984127*G0_1_1_1_2 - 0.00634920634920638*G0_1_1_1_3 - 0.00158730158730156*G0_1_1_1_4 - 0.00634920634920639*G0_1_1_1_5 - 0.00357142857142857*G0_1_1_2_0 - 0.001984126984127*G0_1_1_2_1 + 0.0214285714285716*G0_1_1_2_2 + 0.0126984126984128*G0_1_1_2_3 + 0.00634920634920635*G0_1_1_2_4 - 0.00158730158730158*G0_1_1_2_5 - 0.00158730158730157*G0_1_1_3_0 - 0.00634920634920638*G0_1_1_3_1 + 0.0126984126984128*G0_1_1_3_2 + 0.0380952380952387*G0_1_1_3_3 + 0.00634920634920629*G0_1_1_3_4 + 0.00634920634920635*G0_1_1_3_5 + 0.00634920634920636*G0_1_1_4_0 - 0.00158730158730156*G0_1_1_4_1 + 0.00634920634920636*G0_1_1_4_2 + 0.00634920634920629*G0_1_1_4_3 - 0.0126984126984132*G0_1_1_4_4 + 0.00634920634920632*G0_1_1_4_5 + 0.0126984126984128*G0_1_1_5_0 - 0.00634920634920639*G0_1_1_5_1 - 0.00158730158730158*G0_1_1_5_2 + 0.00634920634920635*G0_1_1_5_3 + 0.00634920634920632*G0_1_1_5_4 + 0.0380952380952387*G0_1_1_5_5; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p2_q2_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p2_q2_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q2_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q2_tensor_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f2_p2_q2_tensor_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f2_p2_q2_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q2_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q2_tensor_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f2_p2_q2_tensor_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f2_p2_q2_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q2_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q2_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p2_q3_quadrature.h b/laplacian_2d/laplacian_f2_p2_q3_quadrature.h new file mode 100644 index 0000000..1cbdf27 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p2_q3_quadrature.h @@ -0,0 +1,5425 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P2_Q3_QUADRATURE_H +#define __LAPLACIAN_F2_P2_Q3_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q3_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q3_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q3_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q3_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q3_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q3_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q3_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q3_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q3_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q3_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q3_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q3_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p2_q3_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p2_q3_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W25[25] = {0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0275289856644697, 0.0475518970579538, 0.0416389652151948, 0.021022967487322, 0.00447940679728133, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783}; + // Quadrature points on the UFC reference element: (0.0450425935698037, 0.0398098570514687), (0.0376212523451112, 0.198013417873608), (0.0263646449444709, 0.437974810247386), (0.0142857943955714, 0.695464273353636), (0.00462228846504642, 0.901464914201174), (0.221578609552379, 0.0398098570514687), (0.185070710267389, 0.198013417873608), (0.129695936782254, 0.437974810247386), (0.0702762920082817, 0.695464273353636), (0.022738483063764, 0.901464914201174), (0.480095071474266, 0.0398098570514687), (0.400993291063196, 0.198013417873608), (0.281012594876307, 0.437974810247386), (0.152267863323182, 0.695464273353636), (0.0492675428994132, 0.901464914201174), (0.738611533396152, 0.0398098570514687), (0.616915871859002, 0.198013417873608), (0.43232925297036, 0.437974810247386), (0.234259434638082, 0.695464273353636), (0.0757966027350624, 0.901464914201174), (0.915147549378728, 0.0398098570514687), (0.764365329781281, 0.198013417873608), (0.535660544808143, 0.437974810247386), (0.290249932250792, 0.695464273353636), (0.09391279733378, 0.901464914201174) + + // Value of basis functions at quadrature points. + static const double FE0[25][6] = \ + {{0.759842524889054, -0.0409849230988147, -0.036640207614552, 0.00717255684496523, 0.145727572487076, 0.164882476492272}, + {0.404143384962011, -0.0347905350890822, -0.119594790557632, 0.0297980510461639, 0.605418365816316, 0.115025523822223}, + {0.0382038937201701, -0.0249744559383749, -0.0543309414249183, 0.0461882014671774, 0.938423301877431, 0.0564900002985142}, + {-0.121759885907613, -0.0138776265525463, 0.271876837668966, 0.0397410384743819, 0.807433832894958, 0.0165858034218535}, + {-0.0762735703276686, -0.00457955736373816, 0.723813068870285, 0.0166673234982246, 0.338636367163553, 0.00173636815934486}, + {0.352482461135478, -0.123384449130048, -0.036640207614552, 0.0352840510877737, 0.117616078244268, 0.65464206627708}, + {0.144254514044104, -0.116568374669637, -0.119594790557632, 0.146585935553368, 0.488630481309112, 0.456692234320686}, + {-0.0585120870225411, -0.0960538647466012, -0.0543309414249183, 0.227214213208259, 0.75739729013635, 0.224285389849452}, + {-0.124504469204174, -0.0603987775714151, 0.271876837668966, 0.19549860142211, 0.65167626994723, 0.0658515377372835}, + {-0.0643063527627086, -0.0217044058396818, 0.723813068870285, 0.0819917787365634, 0.273311911925214, 0.00689399907032842}, + {-0.0191125161665051, -0.0191125161665051, -0.036640207614552, 0.0764500646660207, 0.0764500646660208, 0.921965110615521}, + {-0.0794020521078099, -0.07940205210781, -0.119594790557632, 0.31760820843124, 0.31760820843124, 0.643182477910772}, + {-0.123076437918076, -0.123076437918076, -0.0543309414249183, 0.492305751672304, 0.492305751672304, 0.315872313916462}, + {-0.105896858921167, -0.105896858921167, 0.271876837668966, 0.42358743568467, 0.42358743568467, 0.092742008804029}, + {-0.0444129613327221, -0.0444129613327221, 0.723813068870285, 0.177651845330889, 0.177651845330889, 0.00970916313338224}, + {-0.123384449130048, 0.352482461135478, -0.036640207614552, 0.117616078244268, 0.0352840510877737, 0.65464206627708}, + {-0.116568374669637, 0.144254514044104, -0.119594790557632, 0.488630481309112, 0.146585935553368, 0.456692234320686}, + {-0.0960538647466011, -0.0585120870225411, -0.0543309414249183, 0.75739729013635, 0.227214213208259, 0.224285389849452}, + {-0.0603987775714151, -0.124504469204174, 0.271876837668966, 0.651676269947229, 0.19549860142211, 0.0658515377372836}, + {-0.0217044058396817, -0.0643063527627086, 0.723813068870285, 0.273311911925214, 0.0819917787365632, 0.00689399907032842}, + {-0.0409849230988146, 0.759842524889054, -0.036640207614552, 0.145727572487076, 0.00717255684496521, 0.164882476492272}, + {-0.034790535089082, 0.404143384962011, -0.119594790557632, 0.605418365816316, 0.0297980510461639, 0.115025523822223}, + {-0.0249744559383748, 0.03820389372017, -0.0543309414249183, 0.938423301877431, 0.0461882014671775, 0.0564900002985144}, + {-0.0138776265525463, -0.121759885907613, 0.271876837668966, 0.807433832894958, 0.0397410384743822, 0.0165858034218536}, + {-0.00457955736373805, -0.0762735703276686, 0.723813068870285, 0.338636367163553, 0.0166673234982244, 0.00173636815934486}}; + + static const double FE1_D01[25][9] = \ + {{-4.06985505689898, 0.663106420235969, -0.175302395384938, -0.154276912360605, 6.38350227154709, -2.97675363488409, -0.910265045258717, 0.175302395384938, 1.06454195761932}, + {-2.00814585648569, -0.252795026479633, -0.150188294074804, 0.0318412090086047, 1.25227625167256, 1.00866463129277, -0.607126650247005, 0.150188294074805, 0.575285441238399}, + {-0.0526400567928259, -0.352177177674818, -0.109257126458971, 0.193129457653329, -2.90035813312996, 3.3051753675976, -0.262666599764851, 0.109257126458972, 0.0695371421115214}, + {0.474941577440673, 1.27037403921984, -0.0615309418396494, 0.203965934922007, -2.48940602426171, 0.744090407601198, -0.0476680983174364, 0.06153094183965, -0.15629783660457}, + {-0.273849606287232, 3.85744215792178, -0.0205118631588732, 0.0917041355203092, 1.46725382984054, -5.0508463814751, 0.00907981301713612, 0.0205118631588739, -0.100783948537443}, + {-1.71738066252314, 0.663106420235969, -0.334293160134967, -0.758936398143236, 3.42636839138862, -2.37209414910146, -3.42173020438459, 0.334293160134968, 4.18066660252782}, + {-0.585657258114945, -0.252795026479634, -0.370427430918426, 0.156636868781983, -0.0454166869248133, 0.883868971519392, -2.24985438546138, 0.370427430918427, 2.09321751667939}, + {0.367697406585462, -0.352177177674818, -0.356547729279486, 0.950064223635603, -2.56376083052597, 2.54824060161532, -0.930294665963655, 0.356547729279487, -0.0197695576719498}, + {0.367488895063862, 1.27037403921984, -0.249570091588417, 1.00337224556198, -1.58254703124493, -0.0553159030387718, -0.128254565689394, 0.249570091588417, -0.875117679872583}, + {-0.395389762697828, 3.85744215792178, -0.0953431525243795, 0.451121332684868, 1.9482111834157, -5.41026357863966, 0.0557886800622256, 0.0953431525243796, -0.506910012747092}, + {0.209223394941008, 0.663106420235969, 0.951204426693189, -1.64438988513856, 0.614310846929156, -1.48664066210613, -4.06283667502057, -0.951204426693188, 5.70722656015913}, + {0.438198756619908, -0.252795026479634, 0.366271053164474, 0.339385597126489, -0.88652397331516, 0.701120243174886, -2.53701191611333, -0.366271053164474, 2.19762631898684}, + {0.463044294418704, -0.352177177674817, -0.198487617475322, 2.05850714684467, -1.55066479515014, 1.43979767840625, -0.867581441992734, 0.198487617475323, -1.19092570485194}, + {0.05740649019504, 1.27037403921984, -0.37220110524072, 2.1740098059172, -0.101827066020882, -1.225953463394, 0.059196825527124, 0.372201105240721, -2.23320663144433}, + {-0.589360539480447, 3.85744215792178, -0.188935517472192, 0.977446012936142, 2.66850664044959, -5.93658825889093, 0.156167091897032, 0.188935517472193, -1.13361310483317}, + {0.331396903120676, 0.663106420235969, 4.04113256280582, -2.52984337213388, -0.393316148245832, -0.601187175110812, -1.09508204708761, -4.04113256280582, 3.62492541922149}, + {0.203245627121679, -0.252795026479634, 2.36177868148046, 0.522134325470996, -0.468822115472425, 0.51837151483038, -0.306551158299116, -2.36177868148046, -0.215583167171879}, + {-0.0598205552003695, -0.352177177674817, 0.577784231781157, 3.16695007005374, 0.0806429776780028, 0.331354755197185, 0.431555256882819, -0.577784231781157, -3.59850532693656}, + {-0.434186594374313, 1.27037403921984, -0.313321439192493, 3.34464736627243, 1.5604035789037, -2.39659102374922, 0.609669576144705, 0.313321439192493, -3.95431694241714}, + {-0.80233367368868, 3.85744215792178, -0.263525524994391, 1.50377069318741, 3.4078044549091, -6.4629129391422, 0.294550218583066, 0.263525524994391, -1.79832091177048}, + {-0.622005933550942, 0.663106420235969, 7.18801902910325, -3.13450285791651, -0.044572797356847, 0.00347231067182019, 3.00520725588144, -7.18801902910325, 0.129295602035074}, + {-0.680516070372195, -0.252795026479634, 4.44778984050145, 0.646929985244375, 0.539735241794825, 0.393575855057002, 2.66322169821576, -4.44778984050146, -3.31015168346013}, + {-0.772101971290909, -0.352177177674817, 1.46311250842947, 3.92388483603602, 1.54985915975082, -0.42558001078509, 2.02916494962167, -1.46311250842947, -5.95304978565769}, + {-0.874182983380276, 1.27037403921984, -0.168816882312108, 4.1440536769124, 2.79980627854963, -3.19599733438919, 1.19417052203105, 0.168816882312108, -5.33822419894345}, + {-0.958687838748414, 3.85744215792179, -0.303542805710757, 1.86318789035197, 3.92357581713339, -6.82233013630676, 0.410887102926433, 0.303542805710758, -2.27407499327841}}; + + // Array of non-zero columns + static const unsigned int nzc0[9] = {0, 2, 3, 4, 5, 6, 7, 8, 9}; + + static const double FE1_D10[25][9] = \ + {{-4.06985505689897, 0.622005933550942, -0.130729598028097, -0.157749223032423, -0.804516757556157, 0.157749223032423, 6.27775398384453, -2.8299048604965, 0.935246355584253}, + {-2.00814585648569, 0.680516070372195, -0.689923535869632, -0.361734646048397, -3.1955135888289, 0.361734646048396, 3.84066319025445, -2.51303340414095, 3.88543712469853}, + {-0.0526400567928263, 0.772101971290909, -1.65911628620979, 0.61870946843842, -4.36347064155943, -0.618709468438421, 1.20044590866462, -1.9199078231627, 6.02258692776921}, + {0.474941577440673, 0.874182983380277, -2.86133722038928, 3.3999632693112, -2.3205891419496, -3.3999632693112, -0.216484980629545, -1.13263958019141, 5.18192636233889}, + {-0.273849606287233, 0.958687838748415, -3.94408768029226, 6.91403427182707, 1.7707966355513, -6.91403427182707, -0.294462992693626, -0.390375239767558, 2.17329104474096}, + {-1.71738066252313, -0.331396903120676, 0.0590229881108634, -0.157749223032423, -0.614764171417199, 0.157749223032423, 0.619402358421233, 1.42937520722258, 0.555741183306335}, + {-0.585657258114945, -0.203245627121679, 0.0983946845539977, -0.361734646048396, -2.40719536840527, 0.361734646048397, 0.11192429601908, 0.676978589217543, 2.30880068385127}, + {0.367697406585462, 0.0598205552003702, -0.43719070695749, 0.61870946843842, -3.14154506230713, -0.61870946843842, -0.352510434182498, -0.0750075276033341, 3.57873576926462}, + {0.367488895063862, 0.434186594374314, -1.80997367049212, 3.3999632693112, -1.26922559205244, -3.3999632693112, -0.441576004881888, -0.36009948455629, 3.07919926254456}, + {-0.395389762697828, 0.80233367368868, -3.50314760743348, 6.91403427182707, 2.21173670841009, -6.91403427182707, -0.20773684493217, -0.199207066058685, 1.29141089902339}, + {0.209223394941008, -0.209223394941008, 0.336893579764031, -0.157749223032423, -0.336893579764031, 0.157749223032423, -3.11163224832739, 3.11163224832739, 0.0}, + {0.438198756619908, -0.438198756619908, 1.25279502647963, -0.361734646048396, -1.25279502647963, 0.361734646048397, -2.17074086294885, 2.17074086294885, 0.0}, + {0.463044294418704, -0.463044294418704, 1.35217717767482, 0.618709468438421, -1.35217717767482, -0.61870946843842, -1.06606905946806, 1.06606905946806, 0.0}, + {0.0574064901950401, -0.05740649019504, -0.27037403921984, 3.3999632693112, 0.270374039219839, -3.3999632693112, -0.313004279713597, 0.313004279713597, 0.0}, + {-0.589360539480447, 0.589360539480448, -2.85744215792178, 6.91403427182707, 2.85744215792178, -6.91403427182707, -0.0327684255751637, 0.0327684255751611, 0.0}, + {0.331396903120676, 1.71738066252313, 0.614764171417198, -0.157749223032423, -0.0590229881108647, 0.157749223032423, -1.42937520722258, -0.619402358421231, -0.555741183306333}, + {0.203245627121679, 0.585657258114945, 2.40719536840527, -0.361734646048395, -0.098394684553998, 0.361734646048396, -0.676978589217543, -0.111924296019081, -2.30880068385127}, + {-0.0598205552003698, -0.367697406585462, 3.14154506230712, 0.618709468438422, 0.43719070695749, -0.618709468438421, 0.075007527603333, 0.352510434182498, -3.57873576926461}, + {-0.434186594374313, -0.367488895063862, 1.26922559205244, 3.3999632693112, 1.80997367049211, -3.3999632693112, 0.360099484556288, 0.441576004881886, -3.07919926254455}, + {-0.80233367368868, 0.395389762697828, -2.21173670841009, 6.91403427182707, 3.50314760743348, -6.91403427182707, 0.199207066058682, 0.207736844932168, -1.29141089902339}, + {-0.622005933550944, 4.06985505689897, 0.804516757556154, -0.157749223032423, 0.130729598028091, 0.157749223032423, 2.8299048604965, -6.27775398384453, -0.935246355584244}, + {-0.680516070372195, 2.00814585648569, 3.1955135888289, -0.361734646048395, 0.689923535869631, 0.361734646048396, 2.51303340414095, -3.84066319025445, -3.88543712469853}, + {-0.772101971290909, 0.0526400567928262, 4.36347064155942, 0.618709468438424, 1.65911628620979, -0.618709468438422, 1.9199078231627, -1.20044590866462, -6.02258692776921}, + {-0.874182983380276, -0.474941577440672, 2.3205891419496, 3.3999632693112, 2.86133722038928, -3.3999632693112, 1.1326395801914, 0.216484980629545, -5.18192636233888}, + {-0.958687838748414, 0.273849606287233, -1.7707966355513, 6.91403427182707, 3.94408768029227, -6.91403427182707, 0.390375239767556, 0.294462992693624, -2.17329104474096}}; + + // Array of non-zero columns + static const unsigned int nzc1[9] = {0, 1, 3, 4, 5, 6, 7, 8, 9}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 100; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 25125 + for (unsigned int ip = 0; ip < 25; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 24 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE0[ip][r]*w[0][r]; + F1 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W25[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W25[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W25[ip]; + + + // Number of operations for primary indices: 972 + for (unsigned int j = 0; j < 9; j++) + { + for (unsigned int k = 0; k < 9; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p2_q3_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p2_q3_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q3_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q3_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q3_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q3_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q3_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q3_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q3_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q3_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q3_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p2_q3_tensor.h b/laplacian_2d/laplacian_f2_p2_q3_tensor.h new file mode 100644 index 0000000..c29cdd5 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p2_q3_tensor.h @@ -0,0 +1,5520 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P2_Q3_TENSOR_H +#define __LAPLACIAN_F2_P2_Q3_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q3_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q3_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q3_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q3_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q3_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q3_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q3_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q3_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q3_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q3_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q3_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q3_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p2_q3_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p2_q3_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 432 + // Number of operations (multiply-add pairs) for tensor contraction: 7509 + // Total number of operations (multiply-add pairs): 7952 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[73] = -0.0160714285714286*G0_0_0_0_0 - 0.00160714285714283*G0_0_0_0_1 + 0.00160714285714287*G0_0_0_0_3 - 0.00964285714285713*G0_0_0_0_4 + 0.00964285714285707*G0_0_0_0_5 - 0.00160714285714283*G0_0_0_1_0 + 0.036160714285714*G0_0_0_1_1 - 0.0104464285714285*G0_0_0_1_2 + 0.0449999999999998*G0_0_0_1_3 + 0.00803571428571426*G0_0_0_1_4 + 0.01125*G0_0_0_1_5 - 0.0104464285714285*G0_0_0_2_1 + 0.00401785714285709*G0_0_0_2_2 - 0.00160714285714285*G0_0_0_2_3 + 0.0176785714285713*G0_0_0_2_4 + 0.0144642857142857*G0_0_0_2_5 + 0.00160714285714287*G0_0_0_3_0 + 0.0449999999999998*G0_0_0_3_1 - 0.00160714285714285*G0_0_0_3_2 + 0.167142857142856*G0_0_0_3_3 - 0.0192857142857142*G0_0_0_3_4 - 0.032142857142857*G0_0_0_3_5 - 0.00964285714285713*G0_0_0_4_0 + 0.00803571428571426*G0_0_0_4_1 + 0.0176785714285713*G0_0_0_4_2 - 0.0192857142857142*G0_0_0_4_3 - 0.064285714285714*G0_0_0_4_4 - 0.0449999999999998*G0_0_0_4_5 + 0.00964285714285707*G0_0_0_5_0 + 0.01125*G0_0_0_5_1 + 0.0144642857142857*G0_0_0_5_2 - 0.032142857142857*G0_0_0_5_3 - 0.0449999999999998*G0_0_0_5_4 - 0.102857142857142*G0_0_0_5_5 - 0.0120535714285712*G0_0_1_0_0 - 0.00281249999999996*G0_0_1_0_1 + 0.000401785714285703*G0_0_1_0_2 - 0.00160714285714282*G0_0_1_0_3 - 0.00321428571428567*G0_0_1_0_4 + 0.01125*G0_0_1_0_5 - 0.00281249999999997*G0_0_1_1_0 + 0.15267857142857*G0_0_1_1_1 - 0.0148660714285713*G0_0_1_1_2 + 0.0723214285714281*G0_0_1_1_3 + 0.00160714285714286*G0_0_1_1_4 + 0.00803571428571422*G0_0_1_1_5 + 0.000401785714285703*G0_0_1_2_0 - 0.0148660714285713*G0_0_1_2_1 + 0.00160714285714284*G0_0_1_2_2 - 0.0144642857142856*G0_0_1_2_3 + 0.0032142857142857*G0_0_1_2_4 + 0.00803571428571427*G0_0_1_2_5 - 0.00160714285714282*G0_0_1_3_0 + 0.0723214285714281*G0_0_1_3_1 - 0.0144642857142856*G0_0_1_3_2 + 0.109285714285714*G0_0_1_3_3 - 0.0128571428571428*G0_0_1_3_5 - 0.00321428571428567*G0_0_1_4_0 + 0.00160714285714286*G0_0_1_4_1 + 0.0032142857142857*G0_0_1_4_2 - 0.00642857142857145*G0_0_1_4_4 - 0.0192857142857142*G0_0_1_4_5 + 0.01125*G0_0_1_5_0 + 0.00803571428571421*G0_0_1_5_1 + 0.00803571428571427*G0_0_1_5_2 - 0.0128571428571428*G0_0_1_5_3 - 0.0192857142857142*G0_0_1_5_4 - 0.147857142857142*G0_0_1_5_5 - 0.00321428571428569*G0_1_0_0_1 - 0.00160714285714284*G0_1_0_0_2 - 0.00321428571428567*G0_1_0_0_3 + 0.00642857142857142*G0_1_0_0_4 + 0.0096428571428571*G0_1_0_0_5 - 0.00321428571428569*G0_1_0_1_0 + 0.0401785714285712*G0_1_0_1_1 - 0.0112499999999999*G0_1_0_1_2 + 0.0482142857142855*G0_1_0_1_3 + 0.0064285714285714*G0_1_0_1_4 + 0.0160714285714285*G0_1_0_1_5 - 0.00160714285714284*G0_1_0_2_0 - 0.0112499999999999*G0_1_0_2_1 - 0.00642857142857144*G0_1_0_2_3 + 0.00642857142857135*G0_1_0_2_4 + 0.0128571428571428*G0_1_0_2_5 - 0.00321428571428567*G0_1_0_3_0 + 0.0482142857142855*G0_1_0_3_1 - 0.00642857142857144*G0_1_0_3_2 + 0.212142857142856*G0_1_0_3_3 - 0.00642857142857139*G0_1_0_3_4 - 0.0192857142857142*G0_1_0_3_5 + 0.00642857142857142*G0_1_0_4_0 + 0.0064285714285714*G0_1_0_4_1 + 0.00642857142857135*G0_1_0_4_2 - 0.00642857142857139*G0_1_0_4_3 - 0.00642857142857145*G0_1_0_4_4 - 0.0385714285714284*G0_1_0_4_5 + 0.0096428571428571*G0_1_0_5_0 + 0.0160714285714285*G0_1_0_5_1 + 0.0128571428571428*G0_1_0_5_2 - 0.0192857142857142*G0_1_0_5_3 - 0.0385714285714284*G0_1_0_5_4 - 0.109285714285714*G0_1_0_5_5 + 0.00401785714285709*G0_1_1_0_0 - 0.0080357142857142*G0_1_1_0_1 - 0.000803571428571427*G0_1_1_0_2 - 0.00321428571428567*G0_1_1_0_3 + 0.00482142857142855*G0_1_1_0_4 + 0.0192857142857142*G0_1_1_0_5 - 0.0080357142857142*G0_1_1_1_0 + 0.168749999999999*G0_1_1_1_1 - 0.0160714285714285*G0_1_1_1_2 + 0.0803571428571424*G0_1_1_1_3 + 0.0160714285714284*G0_1_1_1_5 - 0.000803571428571427*G0_1_1_2_0 - 0.0160714285714285*G0_1_1_2_1 + 0.00241071428571427*G0_1_1_2_2 - 0.0192857142857142*G0_1_1_2_3 - 0.00160714285714284*G0_1_1_2_4 + 0.00321428571428572*G0_1_1_2_5 - 0.00321428571428567*G0_1_1_3_0 + 0.0803571428571424*G0_1_1_3_1 - 0.0192857142857142*G0_1_1_3_2 + 0.128571428571428*G0_1_1_3_3 + 0.00642857142857137*G0_1_1_3_4 + 0.00482142857142855*G0_1_1_4_0 - 0.00160714285714284*G0_1_1_4_2 + 0.00642857142857137*G0_1_1_4_3 + 0.0128571428571428*G0_1_1_4_4 - 0.00642857142857146*G0_1_1_4_5 + 0.0192857142857142*G0_1_1_5_0 + 0.0160714285714284*G0_1_1_5_1 + 0.00321428571428572*G0_1_1_5_2 - 0.00642857142857146*G0_1_1_5_4 - 0.128571428571428*G0_1_1_5_5; + A[37] = A[73] + 0.0120535714285713*G0_0_1_0_0 - 0.00040178571428573*G0_0_1_0_1 - 0.00200892857142855*G0_0_1_0_2 - 0.00160714285714285*G0_0_1_0_3 + 0.00964285714285709*G0_0_1_0_4 - 0.00160714285714289*G0_0_1_0_5 - 0.000401785714285727*G0_0_1_1_0 - 0.112499999999999*G0_0_1_1_1 + 0.0036160714285714*G0_0_1_1_2 - 0.0241071428571426*G0_0_1_1_3 + 0.00482142857142854*G0_0_1_1_4 + 0.00803571428571428*G0_0_1_1_5 - 0.00200892857142855*G0_0_1_2_0 + 0.0036160714285714*G0_0_1_2_1 - 0.00160714285714291*G0_0_1_2_2 + 0.00803571428571418*G0_0_1_2_3 + 0.00321428571428565*G0_0_1_2_4 + 0.00482142857142853*G0_0_1_2_5 - 0.00160714285714285*G0_0_1_3_0 - 0.0241071428571426*G0_0_1_3_1 + 0.00803571428571418*G0_0_1_3_2 + 0.102857142857142*G0_0_1_3_3 - 0.00642857142857136*G0_0_1_3_4 - 0.00642857142857132*G0_0_1_3_5 + 0.00964285714285709*G0_0_1_4_0 + 0.00482142857142854*G0_0_1_4_1 + 0.00321428571428565*G0_0_1_4_2 - 0.00642857142857136*G0_0_1_4_3 - 0.0192857142857142*G0_0_1_4_5 - 0.00160714285714289*G0_0_1_5_0 + 0.00803571428571429*G0_0_1_5_1 + 0.00482142857142853*G0_0_1_5_2 - 0.00642857142857134*G0_0_1_5_3 - 0.0192857142857142*G0_0_1_5_4 + 0.0385714285714285*G0_0_1_5_5 - 0.0120535714285713*G0_1_0_0_0 + 0.00040178571428573*G0_1_0_0_1 + 0.00200892857142855*G0_1_0_0_2 + 0.00160714285714285*G0_1_0_0_3 - 0.00964285714285709*G0_1_0_0_4 + 0.00160714285714289*G0_1_0_0_5 + 0.000401785714285726*G0_1_0_1_0 + 0.112499999999999*G0_1_0_1_1 - 0.0036160714285714*G0_1_0_1_2 + 0.0241071428571426*G0_1_0_1_3 - 0.00482142857142854*G0_1_0_1_4 - 0.00803571428571428*G0_1_0_1_5 + 0.00200892857142855*G0_1_0_2_0 - 0.0036160714285714*G0_1_0_2_1 + 0.00160714285714291*G0_1_0_2_2 - 0.00803571428571419*G0_1_0_2_3 - 0.00321428571428565*G0_1_0_2_4 - 0.00482142857142853*G0_1_0_2_5 + 0.00160714285714285*G0_1_0_3_0 + 0.0241071428571426*G0_1_0_3_1 - 0.00803571428571418*G0_1_0_3_2 - 0.102857142857142*G0_1_0_3_3 + 0.00642857142857136*G0_1_0_3_4 + 0.00642857142857132*G0_1_0_3_5 - 0.00964285714285709*G0_1_0_4_0 - 0.00482142857142854*G0_1_0_4_1 - 0.00321428571428565*G0_1_0_4_2 + 0.00642857142857136*G0_1_0_4_3 + 0.0192857142857142*G0_1_0_4_5 + 0.00160714285714289*G0_1_0_5_0 - 0.00803571428571429*G0_1_0_5_1 - 0.00482142857142853*G0_1_0_5_2 + 0.00642857142857134*G0_1_0_5_3 + 0.0192857142857142*G0_1_0_5_4 - 0.0385714285714285*G0_1_0_5_5; + A[11] = 0.00648809523809519*G0_0_0_0_0 - 0.0103670634920634*G0_0_0_0_1 - 9.9206349206373e-06*G0_0_0_0_2 - 0.00575396825396821*G0_0_0_0_3 + 0.000714285714285707*G0_0_0_0_4 - 0.00714285714285709*G0_0_0_0_5 - 0.0103670634920634*G0_0_0_1_0 + 0.131845238095237*G0_0_0_1_1 - 0.0103670634920634*G0_0_0_1_2 + 0.0428571428571426*G0_0_0_1_3 + 0.00138888888888889*G0_0_0_1_4 + 0.0428571428571426*G0_0_0_1_5 - 9.92063492063757e-06*G0_0_0_2_0 - 0.0103670634920634*G0_0_0_2_1 + 0.00648809523809523*G0_0_0_2_2 - 0.00714285714285711*G0_0_0_2_3 + 0.00071428571428572*G0_0_0_2_4 - 0.00575396825396822*G0_0_0_2_5 - 0.00575396825396821*G0_0_0_3_0 + 0.0428571428571426*G0_0_0_3_1 - 0.00714285714285711*G0_0_0_3_2 + 0.0460317460317458*G0_0_0_3_3 + 0.00873015873015869*G0_0_0_3_4 + 0.0230158730158729*G0_0_0_3_5 + 0.000714285714285707*G0_0_0_4_0 + 0.00138888888888889*G0_0_0_4_1 + 0.00071428571428572*G0_0_0_4_2 + 0.00873015873015869*G0_0_0_4_3 + 0.0231746031746031*G0_0_0_4_4 + 0.00873015873015869*G0_0_0_4_5 - 0.00714285714285709*G0_0_0_5_0 + 0.0428571428571426*G0_0_0_5_1 - 0.00575396825396822*G0_0_0_5_2 + 0.0230158730158729*G0_0_0_5_3 + 0.00873015873015869*G0_0_0_5_4 + 0.0460317460317458*G0_0_0_5_5; + A[99] = 0.0771428571428569*G0_0_0_0_0 - 0.00964285714285713*G0_0_0_0_1 - 0.0289285714285713*G0_0_0_0_2 - 0.0771428571428566*G0_0_0_0_3 + 0.0385714285714287*G0_0_0_0_4 - 0.00964285714285713*G0_0_0_1_0 + 0.0771428571428567*G0_0_0_1_1 - 0.0289285714285712*G0_0_0_1_2 + 0.0385714285714286*G0_0_0_1_3 - 0.0771428571428568*G0_0_0_1_4 - 0.0289285714285713*G0_0_0_2_0 - 0.0289285714285712*G0_0_0_2_1 + 0.0964285714285708*G0_0_0_2_2 - 0.0385714285714284*G0_0_0_2_5 - 0.0771428571428566*G0_0_0_3_0 + 0.0385714285714286*G0_0_0_3_1 + 1.23428571428571*G0_0_0_3_3 + 0.308571428571427*G0_0_0_3_4 + 0.231428571428571*G0_0_0_3_5 + 0.0385714285714287*G0_0_0_4_0 - 0.0771428571428568*G0_0_0_4_1 + 0.308571428571427*G0_0_0_4_3 + 1.23428571428571*G0_0_0_4_4 + 0.231428571428571*G0_0_0_4_5 - 0.0385714285714284*G0_0_0_5_2 + 0.231428571428571*G0_0_0_5_3 + 0.231428571428571*G0_0_0_5_4 + 0.154285714285714*G0_0_0_5_5 + 0.0289285714285714*G0_0_1_0_0 - 0.00482142857142858*G0_0_1_0_1 - 0.00482142857142855*G0_0_1_0_2 - 0.0578571428571424*G0_0_1_0_3 + 0.0192857142857143*G0_0_1_0_4 + 0.0192857142857142*G0_0_1_0_5 - 0.00482142857142858*G0_0_1_1_0 + 0.0482142857142855*G0_0_1_1_1 - 0.0241071428571427*G0_0_1_1_2 + 0.0192857142857144*G0_0_1_1_3 - 0.0192857142857142*G0_0_1_1_4 - 0.0192857142857141*G0_0_1_1_5 - 0.00482142857142855*G0_0_1_2_0 - 0.0241071428571427*G0_0_1_2_1 + 0.0482142857142854*G0_0_1_2_2 + 0.019285714285714*G0_0_1_2_3 - 0.0192857142857143*G0_0_1_2_4 - 0.0192857142857142*G0_0_1_2_5 - 0.0578571428571424*G0_0_1_3_0 + 0.0192857142857143*G0_0_1_3_1 + 0.019285714285714*G0_0_1_3_2 + 1.15714285714285*G0_0_1_3_3 + 0.154285714285714*G0_0_1_3_4 + 0.154285714285714*G0_0_1_3_5 + 0.0192857142857143*G0_0_1_4_0 - 0.0192857142857142*G0_0_1_4_1 - 0.0192857142857143*G0_0_1_4_2 + 0.154285714285714*G0_0_1_4_3 + 0.0771428571428566*G0_0_1_4_4 + 0.0771428571428569*G0_0_1_4_5 + 0.0192857142857142*G0_0_1_5_0 - 0.0192857142857141*G0_0_1_5_1 - 0.0192857142857142*G0_0_1_5_2 + 0.154285714285714*G0_0_1_5_3 + 0.0771428571428569*G0_0_1_5_4 + 0.0771428571428569*G0_0_1_5_5 + 0.0289285714285714*G0_1_0_0_0 - 0.00482142857142858*G0_1_0_0_1 - 0.00482142857142855*G0_1_0_0_2 - 0.0578571428571424*G0_1_0_0_3 + 0.0192857142857143*G0_1_0_0_4 + 0.0192857142857142*G0_1_0_0_5 - 0.00482142857142858*G0_1_0_1_0 + 0.0482142857142855*G0_1_0_1_1 - 0.0241071428571427*G0_1_0_1_2 + 0.0192857142857143*G0_1_0_1_3 - 0.0192857142857142*G0_1_0_1_4 - 0.0192857142857141*G0_1_0_1_5 - 0.00482142857142855*G0_1_0_2_0 - 0.0241071428571427*G0_1_0_2_1 + 0.0482142857142854*G0_1_0_2_2 + 0.019285714285714*G0_1_0_2_3 - 0.0192857142857143*G0_1_0_2_4 - 0.0192857142857142*G0_1_0_2_5 - 0.0578571428571424*G0_1_0_3_0 + 0.0192857142857143*G0_1_0_3_1 + 0.019285714285714*G0_1_0_3_2 + 1.15714285714285*G0_1_0_3_3 + 0.154285714285714*G0_1_0_3_4 + 0.154285714285714*G0_1_0_3_5 + 0.0192857142857143*G0_1_0_4_0 - 0.0192857142857142*G0_1_0_4_1 - 0.0192857142857143*G0_1_0_4_2 + 0.154285714285714*G0_1_0_4_3 + 0.0771428571428566*G0_1_0_4_4 + 0.0771428571428569*G0_1_0_4_5 + 0.0192857142857142*G0_1_0_5_0 - 0.0192857142857141*G0_1_0_5_1 - 0.0192857142857142*G0_1_0_5_2 + 0.154285714285714*G0_1_0_5_3 + 0.0771428571428569*G0_1_0_5_4 + 0.0771428571428569*G0_1_0_5_5 + 0.0771428571428569*G0_1_1_0_0 - 0.0289285714285713*G0_1_1_0_1 - 0.00964285714285711*G0_1_1_0_2 - 0.0771428571428567*G0_1_1_0_3 + 0.0385714285714285*G0_1_1_0_5 - 0.0289285714285713*G0_1_1_1_0 + 0.096428571428571*G0_1_1_1_1 - 0.0289285714285713*G0_1_1_1_2 - 0.0385714285714284*G0_1_1_1_4 - 0.00964285714285711*G0_1_1_2_0 - 0.0289285714285713*G0_1_1_2_1 + 0.0771428571428568*G0_1_1_2_2 + 0.0385714285714283*G0_1_1_2_3 - 0.0771428571428568*G0_1_1_2_5 - 0.0771428571428566*G0_1_1_3_0 + 0.0385714285714283*G0_1_1_3_2 + 1.23428571428571*G0_1_1_3_3 + 0.231428571428571*G0_1_1_3_4 + 0.308571428571427*G0_1_1_3_5 - 0.0385714285714284*G0_1_1_4_1 + 0.231428571428571*G0_1_1_4_3 + 0.154285714285714*G0_1_1_4_4 + 0.231428571428571*G0_1_1_4_5 + 0.0385714285714285*G0_1_1_5_0 - 0.0771428571428568*G0_1_1_5_2 + 0.308571428571427*G0_1_1_5_3 + 0.231428571428571*G0_1_1_5_4 + 1.23428571428571*G0_1_1_5_5; + A[78] = -A[73] - 0.164732142857142*G0_0_0_0_0 + 0.0124553571428571*G0_0_0_0_1 + 0.0108482142857142*G0_0_0_0_2 + 0.0128571428571428*G0_0_0_0_3 - 0.0707142857142853*G0_0_0_0_4 - 0.00160714285714283*G0_0_0_0_5 + 0.0124553571428571*G0_0_0_1_0 - 0.112499999999999*G0_0_0_1_1 + 0.000401785714285702*G0_0_0_1_2 - 0.0160714285714284*G0_0_0_1_3 + 0.0192857142857142*G0_0_0_1_4 + 0.0108482142857142*G0_0_0_2_0 + 0.000401785714285698*G0_0_0_2_1 - 0.00482142857142859*G0_0_0_2_2 + 0.0273214285714284*G0_0_0_2_3 + 0.0466071428571426*G0_0_0_2_4 + 0.0482142857142855*G0_0_0_2_5 + 0.0128571428571428*G0_0_0_3_0 - 0.0160714285714284*G0_0_0_3_1 + 0.0273214285714284*G0_0_0_3_2 + 0.0257142857142854*G0_0_0_3_3 - 0.064285714285714*G0_0_0_3_4 - 0.122142857142857*G0_0_0_3_5 - 0.0707142857142853*G0_0_0_4_0 + 0.0192857142857142*G0_0_0_4_1 + 0.0466071428571426*G0_0_0_4_2 - 0.064285714285714*G0_0_0_4_3 - 0.205714285714285*G0_0_0_4_4 - 0.134999999999999*G0_0_0_4_5 - 0.00160714285714283*G0_0_0_5_0 + 0.0482142857142855*G0_0_0_5_2 - 0.122142857142857*G0_0_0_5_3 - 0.134999999999999*G0_0_0_5_4 - 0.424285714285713*G0_0_0_5_5 + 0.0040178571428571*G0_1_0_0_0 + 0.00803571428571423*G0_1_0_0_1 - 0.00562499999999996*G0_1_0_0_2 + 0.00964285714285711*G0_1_0_0_3 + 0.0176785714285714*G0_1_0_0_4 + 0.00642857142857136*G0_1_0_0_5 + 0.00803571428571423*G0_1_0_1_0 - 0.120535714285713*G0_1_0_1_1 - 0.0160714285714284*G0_1_0_1_3 + 0.0160714285714285*G0_1_0_1_4 + 0.0160714285714285*G0_1_0_1_5 - 0.00562499999999996*G0_1_0_2_0 - 0.00723214285714292*G0_1_0_2_2 + 0.0257142857142856*G0_1_0_2_3 + 0.020892857142857*G0_1_0_2_4 + 0.0546428571428569*G0_1_0_2_5 + 0.00964285714285711*G0_1_0_3_0 - 0.0160714285714284*G0_1_0_3_1 + 0.0257142857142856*G0_1_0_3_2 + 0.0642857142857137*G0_1_0_3_3 - 0.0514285714285712*G0_1_0_3_4 - 0.128571428571428*G0_1_0_3_5 + 0.0176785714285714*G0_1_0_4_0 + 0.0160714285714285*G0_1_0_4_1 + 0.020892857142857*G0_1_0_4_2 - 0.0514285714285712*G0_1_0_4_3 - 0.0385714285714285*G0_1_0_4_4 - 0.141428571428571*G0_1_0_4_5 + 0.00642857142857136*G0_1_0_5_0 + 0.0160714285714285*G0_1_0_5_1 + 0.0546428571428569*G0_1_0_5_2 - 0.128571428571428*G0_1_0_5_3 - 0.141428571428571*G0_1_0_5_4 - 0.578571428571426*G0_1_0_5_5; + A[21] = 0.00247023809523808*G0_1_0_0_0 - 0.00157242063492062*G0_1_0_0_1 - 0.00157242063492063*G0_1_0_0_2 - 0.000932539682539675*G0_1_0_0_3 - 0.0032142857142857*G0_1_0_0_4 - 0.00321428571428569*G0_1_0_0_5 - 0.00157242063492062*G0_1_0_1_0 + 0.019345238095238*G0_1_0_1_1 - 0.00112599206349206*G0_1_0_1_2 + 0.00178571428571426*G0_1_0_1_3 - 0.000575396825396823*G0_1_0_1_4 + 0.00892857142857136*G0_1_0_1_5 - 0.00157242063492063*G0_1_0_2_0 - 0.00112599206349206*G0_1_0_2_1 + 0.0193452380952381*G0_1_0_2_2 + 0.00178571428571429*G0_1_0_2_3 + 0.0089285714285714*G0_1_0_2_4 - 0.000575396825396815*G0_1_0_2_5 - 0.000932539682539675*G0_1_0_3_0 + 0.00178571428571426*G0_1_0_3_1 + 0.00178571428571429*G0_1_0_3_2 - 0.00539682539682539*G0_1_0_3_3 + 0.003015873015873*G0_1_0_3_4 + 0.00301587301587299*G0_1_0_3_5 - 0.0032142857142857*G0_1_0_4_0 - 0.000575396825396823*G0_1_0_4_1 + 0.0089285714285714*G0_1_0_4_2 + 0.003015873015873*G0_1_0_4_3 + 0.00888888888888885*G0_1_0_4_4 + 0.00230158730158729*G0_1_0_4_5 - 0.00321428571428569*G0_1_0_5_0 + 0.00892857142857136*G0_1_0_5_1 - 0.000575396825396816*G0_1_0_5_2 + 0.00301587301587299*G0_1_0_5_3 + 0.00230158730158729*G0_1_0_5_4 + 0.00888888888888882*G0_1_0_5_5; + A[1] = -A[21] - 0.019345238095238*G0_0_0_0_0 + 0.00112599206349206*G0_0_0_0_1 + 0.00157242063492063*G0_0_0_0_2 + 0.00057539682539682*G0_0_0_0_3 - 0.00892857142857138*G0_0_0_0_4 - 0.00178571428571427*G0_0_0_0_5 + 0.00112599206349206*G0_0_0_1_0 - 0.019345238095238*G0_0_0_1_1 + 0.00157242063492063*G0_0_0_1_2 - 0.00892857142857139*G0_0_0_1_3 + 0.00057539682539682*G0_0_0_1_4 - 0.00178571428571429*G0_0_0_1_5 + 0.00157242063492063*G0_0_0_2_0 + 0.00157242063492063*G0_0_0_2_1 - 0.0024702380952381*G0_0_0_2_2 + 0.0032142857142857*G0_0_0_2_3 + 0.0032142857142857*G0_0_0_2_4 + 0.00093253968253968*G0_0_0_2_5 + 0.00057539682539682*G0_0_0_3_0 - 0.00892857142857139*G0_0_0_3_1 + 0.0032142857142857*G0_0_0_3_2 - 0.00888888888888886*G0_0_0_3_3 - 0.00230158730158729*G0_0_0_3_4 - 0.00301587301587301*G0_0_0_3_5 - 0.00892857142857138*G0_0_0_4_0 + 0.00057539682539682*G0_0_0_4_1 + 0.0032142857142857*G0_0_0_4_2 - 0.00230158730158729*G0_0_0_4_3 - 0.00888888888888883*G0_0_0_4_4 - 0.003015873015873*G0_0_0_4_5 - 0.00178571428571427*G0_0_0_5_0 - 0.00178571428571429*G0_0_0_5_1 + 0.00093253968253968*G0_0_0_5_2 - 0.00301587301587301*G0_0_0_5_3 - 0.003015873015873*G0_0_0_5_4 + 0.00539682539682535*G0_0_0_5_5 - 0.0168749999999999*G0_1_0_0_0 - 0.000446428571428565*G0_1_0_0_1 - 0.000357142857142855*G0_1_0_0_3 - 0.0121428571428571*G0_1_0_0_4 - 0.00499999999999996*G0_1_0_0_5 - 0.000446428571428565*G0_1_0_1_0 + 0.00044642857142857*G0_1_0_1_2 - 0.00714285714285712*G0_1_0_1_3 + 0.00714285714285708*G0_1_0_1_5 + 0.00044642857142857*G0_1_0_2_1 + 0.016875*G0_1_0_2_2 + 0.00499999999999999*G0_1_0_2_3 + 0.0121428571428571*G0_1_0_2_4 + 0.000357142857142864*G0_1_0_2_5 - 0.000357142857142855*G0_1_0_3_0 - 0.00714285714285712*G0_1_0_3_1 + 0.00499999999999999*G0_1_0_3_2 - 0.0142857142857142*G0_1_0_3_3 + 0.000714285714285708*G0_1_0_3_4 - 0.0121428571428571*G0_1_0_4_0 + 0.0121428571428571*G0_1_0_4_2 + 0.000714285714285708*G0_1_0_4_3 - 0.000714285714285711*G0_1_0_4_5 - 0.00499999999999996*G0_1_0_5_0 + 0.00714285714285708*G0_1_0_5_1 + 0.000357142857142863*G0_1_0_5_2 - 0.000714285714285711*G0_1_0_5_4 + 0.0142857142857142*G0_1_0_5_5; + A[22] = 0.00648809523809519*G0_1_1_0_0 - 9.92063492063439e-06*G0_1_1_0_1 - 0.0103670634920634*G0_1_1_0_2 - 0.00575396825396821*G0_1_1_0_3 - 0.0071428571428571*G0_1_1_0_4 + 0.000714285714285705*G0_1_1_0_5 - 9.92063492063436e-06*G0_1_1_1_0 + 0.00648809523809519*G0_1_1_1_1 - 0.0103670634920634*G0_1_1_1_2 - 0.0071428571428571*G0_1_1_1_3 - 0.00575396825396822*G0_1_1_1_4 + 0.000714285714285703*G0_1_1_1_5 - 0.0103670634920634*G0_1_1_2_0 - 0.0103670634920634*G0_1_1_2_1 + 0.131845238095238*G0_1_1_2_2 + 0.0428571428571426*G0_1_1_2_3 + 0.0428571428571426*G0_1_1_2_4 + 0.00138888888888891*G0_1_1_2_5 - 0.00575396825396821*G0_1_1_3_0 - 0.0071428571428571*G0_1_1_3_1 + 0.0428571428571426*G0_1_1_3_2 + 0.0460317460317458*G0_1_1_3_3 + 0.0230158730158729*G0_1_1_3_4 + 0.0087301587301587*G0_1_1_3_5 - 0.0071428571428571*G0_1_1_4_0 - 0.00575396825396822*G0_1_1_4_1 + 0.0428571428571426*G0_1_1_4_2 + 0.0230158730158729*G0_1_1_4_3 + 0.0460317460317458*G0_1_1_4_4 + 0.0087301587301587*G0_1_1_4_5 + 0.000714285714285705*G0_1_1_5_0 + 0.000714285714285703*G0_1_1_5_1 + 0.00138888888888891*G0_1_1_5_2 + 0.0087301587301587*G0_1_1_5_3 + 0.0087301587301587*G0_1_1_5_4 + 0.023174603174603*G0_1_1_5_5; + A[92] = 0.00374999999999998*G0_0_1_0_0 - 0.00267857142857141*G0_0_1_0_2 - 0.00428571428571427*G0_0_1_0_3 - 0.0171428571428571*G0_0_1_0_4 - 0.00107142857142859*G0_0_1_0_5 - 0.00374999999999993*G0_0_1_1_1 + 0.0026785714285714*G0_0_1_1_2 + 0.0171428571428571*G0_0_1_1_3 + 0.00428571428571428*G0_0_1_1_4 + 0.0010714285714286*G0_0_1_1_5 - 0.00267857142857141*G0_0_1_2_0 + 0.0026785714285714*G0_0_1_2_1 - 0.0321428571428569*G0_0_1_2_3 + 0.032142857142857*G0_0_1_2_4 - 0.00428571428571427*G0_0_1_3_0 + 0.0171428571428571*G0_0_1_3_1 - 0.0321428571428569*G0_0_1_3_2 + 0.00857142857142854*G0_0_1_3_5 - 0.0171428571428571*G0_0_1_4_0 + 0.00428571428571428*G0_0_1_4_1 + 0.032142857142857*G0_0_1_4_2 - 0.00857142857142854*G0_0_1_4_5 - 0.00107142857142859*G0_0_1_5_0 + 0.0010714285714286*G0_0_1_5_1 + 0.00857142857142854*G0_0_1_5_3 - 0.00857142857142854*G0_0_1_5_4 + 0.0117857142857142*G0_1_1_0_0 - 0.00669642857142853*G0_1_1_0_1 + 0.00562499999999997*G0_1_1_0_2 + 0.00214285714285713*G0_1_1_0_3 + 0.00535714285714283*G0_1_1_0_4 + 0.00857142857142854*G0_1_1_0_5 - 0.00669642857142853*G0_1_1_1_0 + 0.00803571428571426*G0_1_1_1_1 + 0.00830357142857138*G0_1_1_1_2 + 0.0224999999999999*G0_1_1_1_3 + 0.00642857142857141*G0_1_1_1_4 + 0.00964285714285712*G0_1_1_1_5 + 0.00562499999999997*G0_1_1_2_0 + 0.00830357142857138*G0_1_1_2_1 - 0.0535714285714284*G0_1_1_2_2 - 0.0535714285714283*G0_1_1_2_3 - 0.0214285714285713*G0_1_1_2_4 - 0.00857142857142854*G0_1_1_2_5 + 0.00214285714285713*G0_1_1_3_0 + 0.0224999999999999*G0_1_1_3_1 - 0.0535714285714283*G0_1_1_3_2 - 0.0257142857142856*G0_1_1_3_3 - 0.0171428571428571*G0_1_1_3_4 + 0.0128571428571427*G0_1_1_3_5 + 0.00535714285714283*G0_1_1_4_0 + 0.00642857142857141*G0_1_1_4_1 - 0.0214285714285713*G0_1_1_4_2 - 0.0171428571428571*G0_1_1_4_3 - 0.0257142857142856*G0_1_1_4_4 + 0.00428571428571421*G0_1_1_4_5 + 0.00857142857142854*G0_1_1_5_0 + 0.00964285714285712*G0_1_1_5_1 - 0.00857142857142854*G0_1_1_5_2 + 0.0128571428571427*G0_1_1_5_3 + 0.00428571428571421*G0_1_1_5_4 + 0.128571428571428*G0_1_1_5_5; + A[82] = -A[92] - 0.00482142857142852*G0_0_1_0_0 + 0.000937499999999984*G0_0_1_0_1 - 0.00272321428571426*G0_0_1_0_2 - 0.00303571428571428*G0_0_1_0_3 - 0.0124999999999999*G0_0_1_0_4 + 0.00339285714285711*G0_0_1_0_5 + 0.000937499999999983*G0_0_1_1_0 - 0.0291964285714283*G0_0_1_1_1 + 0.00218749999999998*G0_0_1_1_2 + 0.0167857142857142*G0_0_1_1_3 + 0.00517857142857142*G0_0_1_1_4 - 0.00660714285714274*G0_0_1_1_5 - 0.00272321428571426*G0_0_1_2_0 + 0.00218749999999998*G0_0_1_2_1 - 0.0285714285714284*G0_0_1_2_3 + 0.0285714285714284*G0_0_1_2_4 + 0.000535714285714282*G0_0_1_2_5 - 0.00303571428571428*G0_0_1_3_0 + 0.0167857142857142*G0_0_1_3_1 - 0.0285714285714284*G0_0_1_3_2 + 0.0114285714285715*G0_0_1_3_3 - 0.00428571428571428*G0_0_1_3_4 + 0.00499999999999998*G0_0_1_3_5 - 0.0124999999999999*G0_0_1_4_0 + 0.00517857142857142*G0_0_1_4_1 + 0.0285714285714284*G0_0_1_4_2 - 0.00428571428571428*G0_0_1_4_3 - 0.00285714285714294*G0_0_1_4_4 - 0.0114285714285714*G0_0_1_4_5 + 0.00339285714285711*G0_0_1_5_0 - 0.00660714285714274*G0_0_1_5_1 + 0.000535714285714283*G0_0_1_5_2 + 0.00499999999999998*G0_0_1_5_3 - 0.0114285714285714*G0_0_1_5_4 + 0.0385714285714283*G0_0_1_5_5 + 0.0125892857142857*G0_1_1_0_0 - 0.00299107142857142*G0_1_1_0_1 + 0.00486607142857141*G0_1_1_0_2 + 0.00410714285714284*G0_1_1_0_4 + 0.0135714285714285*G0_1_1_0_5 - 0.00299107142857142*G0_1_1_1_0 - 0.0267857142857141*G0_1_1_1_1 + 0.00799107142857138*G0_1_1_1_2 + 0.0198214285714285*G0_1_1_1_3 + 0.0057142857142857*G0_1_1_1_4 - 0.00910714285714274*G0_1_1_1_5 + 0.00486607142857141*G0_1_1_2_0 + 0.00799107142857138*G0_1_1_2_1 - 0.0455357142857143*G0_1_1_2_2 - 0.0517857142857141*G0_1_1_2_3 - 0.0178571428571428*G0_1_1_2_4 - 0.00749999999999998*G0_1_1_2_5 + 0.0198214285714285*G0_1_1_3_1 - 0.0517857142857141*G0_1_1_3_2 + 0.00428571428571432*G0_1_1_3_3 - 0.0114285714285714*G0_1_1_3_4 + 0.0149999999999999*G0_1_1_3_5 + 0.00410714285714284*G0_1_1_4_0 + 0.0057142857142857*G0_1_1_4_1 - 0.0178571428571428*G0_1_1_4_2 - 0.0114285714285714*G0_1_1_4_3 - 0.0242857142857143*G0_1_1_4_4 + 0.00357142857142851*G0_1_1_4_5 + 0.0135714285714285*G0_1_1_5_0 - 0.00910714285714273*G0_1_1_5_1 - 0.00749999999999998*G0_1_1_5_2 + 0.0149999999999999*G0_1_1_5_3 + 0.00357142857142851*G0_1_1_5_4 + 0.0942857142857137*G0_1_1_5_5; + A[32] = -A[82] - 0.0109821428571428*G0_0_1_0_0 + 0.00709821428571424*G0_0_1_0_2 + 0.00874999999999995*G0_0_1_0_3 + 0.0167857142857142*G0_0_1_0_4 + 0.00785714285714283*G0_0_1_0_5 - 0.0241071428571427*G0_0_1_1_1 + 0.00397321428571427*G0_0_1_1_2 - 0.00535714285714281*G0_0_1_1_3 + 0.00410714285714283*G0_0_1_1_4 - 0.0053571428571428*G0_0_1_1_5 + 0.00709821428571424*G0_0_1_2_0 + 0.00397321428571427*G0_0_1_2_1 - 0.0937499999999997*G0_0_1_2_2 - 0.00178571428571431*G0_0_1_2_3 - 0.0410714285714284*G0_0_1_2_4 + 0.00232142857142855*G0_0_1_2_5 + 0.00874999999999995*G0_0_1_3_0 - 0.00535714285714281*G0_0_1_3_1 - 0.00178571428571431*G0_0_1_3_2 - 0.0314285714285713*G0_0_1_3_3 - 0.0257142857142856*G0_0_1_3_4 - 0.0221428571428571*G0_0_1_3_5 + 0.0167857142857142*G0_0_1_4_0 + 0.00410714285714283*G0_0_1_4_1 - 0.0410714285714284*G0_0_1_4_2 - 0.0257142857142856*G0_0_1_4_3 - 0.0457142857142855*G0_0_1_4_4 - 0.0128571428571428*G0_0_1_4_5 + 0.00785714285714283*G0_0_1_5_0 - 0.0053571428571428*G0_0_1_5_1 + 0.00232142857142855*G0_0_1_5_2 - 0.0221428571428571*G0_0_1_5_3 - 0.0128571428571428*G0_0_1_5_4 + 0.0328571428571426*G0_0_1_5_5; + A[72] = A[82] + 0.0340178571428569*G0_0_1_0_0 - 0.00187499999999997*G0_0_1_0_1 + 0.000535714285714278*G0_0_1_0_2 - 0.00214285714285713*G0_0_1_0_3 - 0.0042857142857143*G0_0_1_0_4 + 0.00321428571428567*G0_0_1_0_5 - 0.00187499999999997*G0_0_1_1_0 + 0.0340178571428569*G0_0_1_1_1 + 0.000535714285714283*G0_0_1_1_2 - 0.00428571428571431*G0_0_1_1_3 - 0.00214285714285714*G0_0_1_1_4 + 0.00321428571428565*G0_0_1_1_5 + 0.000535714285714277*G0_0_1_2_0 + 0.000535714285714283*G0_0_1_2_1 - 0.00107142857142857*G0_0_1_2_5 - 0.00214285714285713*G0_0_1_3_0 - 0.00428571428571431*G0_0_1_3_1 - 0.00857142857142852*G0_0_1_3_3 + 0.00857142857142855*G0_0_1_3_4 + 0.00642857142857143*G0_0_1_3_5 - 0.0042857142857143*G0_0_1_4_0 - 0.00214285714285714*G0_0_1_4_1 + 0.00857142857142855*G0_0_1_4_3 - 0.0085714285714285*G0_0_1_4_4 + 0.00642857142857143*G0_0_1_4_5 + 0.00321428571428567*G0_0_1_5_0 + 0.00321428571428565*G0_0_1_5_1 - 0.00107142857142858*G0_0_1_5_2 + 0.00642857142857143*G0_0_1_5_3 + 0.00642857142857143*G0_0_1_5_4 - 0.0771428571428566*G0_0_1_5_5 - 0.0101785714285714*G0_1_1_0_0 - 0.000937499999999981*G0_1_1_0_1 + 0.000937499999999975*G0_1_1_0_2 + 0.000535714285714289*G0_1_1_0_3 - 0.00107142857142856*G0_1_1_0_4 - 0.0160714285714285*G0_1_1_0_5 - 0.000937499999999981*G0_1_1_1_0 + 0.0441964285714282*G0_1_1_1_1 - 0.000401785714285703*G0_1_1_1_2 - 0.00321428571428575*G0_1_1_1_3 - 0.00267857142857143*G0_1_1_1_4 + 0.0192857142857141*G0_1_1_1_5 + 0.000937499999999975*G0_1_1_2_0 - 0.000401785714285702*G0_1_1_2_1 + 0.00535714285714285*G0_1_1_2_3 - 0.00535714285714277*G0_1_1_2_4 - 0.000535714285714284*G0_1_1_2_5 + 0.000535714285714289*G0_1_1_3_0 - 0.00321428571428575*G0_1_1_3_1 + 0.00535714285714285*G0_1_1_3_2 - 0.0257142857142857*G0_1_1_3_3 + 0.00428571428571428*G0_1_1_3_4 - 0.00107142857142856*G0_1_1_4_0 - 0.00267857142857143*G0_1_1_4_1 - 0.00535714285714277*G0_1_1_4_2 + 0.00428571428571428*G0_1_1_4_3 + 0.0171428571428572*G0_1_1_4_4 + 0.00642857142857144*G0_1_1_4_5 - 0.0160714285714284*G0_1_1_5_0 + 0.0192857142857141*G0_1_1_5_1 - 0.000535714285714285*G0_1_1_5_2 + 0.00642857142857144*G0_1_1_5_4 - 0.0385714285714283*G0_1_1_5_5; + A[48] = -A[73] - 0.01125*G0_0_0_0_0 - 0.00200892857142855*G0_0_0_0_1 + 0.000401785714285738*G0_0_0_0_2 - 0.00160714285714281*G0_0_0_0_3 - 0.00321428571428571*G0_0_0_0_4 + 0.00964285714285707*G0_0_0_0_5 - 0.00200892857142855*G0_0_0_1_0 + 0.0482142857142855*G0_0_0_1_1 - 0.0140624999999999*G0_0_0_1_2 + 0.0482142857142855*G0_0_0_1_3 + 0.00803571428571426*G0_0_0_1_4 + 0.0160714285714285*G0_0_0_1_5 + 0.000401785714285738*G0_0_0_2_0 - 0.0140624999999999*G0_0_0_2_1 + 0.00401785714285688*G0_0_0_2_2 + 0.00642857142857135*G0_0_0_2_3 + 0.00964285714285702*G0_0_0_2_4 + 0.0176785714285714*G0_0_0_2_5 - 0.00160714285714281*G0_0_0_3_0 + 0.0482142857142855*G0_0_0_3_1 + 0.00642857142857134*G0_0_0_3_2 + 0.192857142857142*G0_0_0_3_3 - 0.0128571428571428*G0_0_0_3_4 - 0.032142857142857*G0_0_0_3_5 - 0.00321428571428571*G0_0_0_4_0 + 0.00803571428571426*G0_0_0_4_1 + 0.00964285714285702*G0_0_0_4_2 - 0.0128571428571428*G0_0_0_4_3 - 0.102857142857142*G0_0_0_4_4 - 0.0514285714285713*G0_0_0_4_5 + 0.00964285714285707*G0_0_0_5_0 + 0.0160714285714285*G0_0_0_5_1 + 0.0176785714285714*G0_0_0_5_2 - 0.032142857142857*G0_0_0_5_3 - 0.0514285714285713*G0_0_0_5_4 - 0.128571428571428*G0_0_0_5_5 - 0.0112499999999998*G0_0_1_0_0 - 0.0040178571428571*G0_0_1_0_1 - 0.000803571428571417*G0_0_1_0_2 - 0.00642857142857135*G0_0_1_0_3 - 0.0080357142857142*G0_0_1_0_4 + 0.00642857142857144*G0_0_1_0_5 - 0.00401785714285711*G0_0_1_1_0 + 0.168749999999999*G0_0_1_1_1 - 0.0200892857142856*G0_0_1_1_2 + 0.0803571428571424*G0_0_1_1_3 + 0.0160714285714285*G0_0_1_1_5 - 0.000803571428571417*G0_0_1_2_0 - 0.0200892857142856*G0_0_1_2_1 + 0.0176785714285712*G0_0_1_2_2 - 0.00642857142857138*G0_0_1_2_3 + 0.0112499999999999*G0_0_1_2_4 + 0.00642857142857142*G0_0_1_2_5 - 0.00642857142857135*G0_0_1_3_0 + 0.0803571428571423*G0_0_1_3_1 - 0.00642857142857138*G0_0_1_3_2 + 0.128571428571428*G0_0_1_3_3 + 0.0128571428571427*G0_0_1_3_4 - 0.0080357142857142*G0_0_1_4_0 + 0.0112499999999999*G0_0_1_4_2 + 0.0128571428571427*G0_0_1_4_3 + 0.0128571428571427*G0_0_1_4_4 - 0.0128571428571428*G0_0_1_4_5 + 0.00642857142857144*G0_0_1_5_0 + 0.0160714285714285*G0_0_1_5_1 + 0.00642857142857142*G0_0_1_5_2 - 0.0128571428571428*G0_0_1_5_4 - 0.128571428571428*G0_0_1_5_5 + 0.00241071428571433*G0_1_0_0_0 - 0.00803571428571421*G0_1_0_0_1 - 0.000803571428571422*G0_1_0_0_2 - 0.0128571428571427*G0_1_0_0_3 - 0.00160714285714279*G0_1_0_0_4 - 0.00321428571428567*G0_1_0_0_5 - 0.00803571428571421*G0_1_0_1_0 + 0.168749999999999*G0_1_0_1_1 - 0.0160714285714285*G0_1_0_1_2 + 0.0482142857142854*G0_1_0_1_3 + 0.0482142857142854*G0_1_0_1_5 - 0.000803571428571422*G0_1_0_2_0 - 0.0160714285714285*G0_1_0_2_1 + 0.00401785714285701*G0_1_0_2_2 + 0.00321428571428566*G0_1_0_2_3 + 0.00482142857142849*G0_1_0_2_4 + 0.0128571428571428*G0_1_0_2_5 - 0.0128571428571427*G0_1_0_3_0 + 0.0482142857142854*G0_1_0_3_1 + 0.00321428571428566*G0_1_0_3_2 + 0.192857142857141*G0_1_0_3_3 + 0.0257142857142856*G0_1_0_3_4 - 0.00160714285714279*G0_1_0_4_0 + 0.00482142857142849*G0_1_0_4_2 + 0.0257142857142856*G0_1_0_4_3 + 0.0128571428571427*G0_1_0_4_4 - 0.0257142857142856*G0_1_0_4_5 - 0.00321428571428567*G0_1_0_5_0 + 0.0482142857142854*G0_1_0_5_1 + 0.0128571428571428*G0_1_0_5_2 - 0.0257142857142856*G0_1_0_5_4 - 0.192857142857142*G0_1_0_5_5 + 0.00642857142857135*G0_1_1_0_0 - 0.0241071428571426*G0_1_1_0_1 - 0.00160714285714286*G0_1_1_0_2 + 0.00321428571428571*G0_1_1_0_4 - 0.0241071428571426*G0_1_1_1_0 + 0.337499999999998*G0_1_1_1_1 - 0.0241071428571427*G0_1_1_1_2 + 0.0964285714285708*G0_1_1_1_3 + 0.0964285714285708*G0_1_1_1_5 - 0.00160714285714286*G0_1_1_2_0 - 0.0241071428571427*G0_1_1_2_1 + 0.00642857142857138*G0_1_1_2_2 + 0.00321428571428571*G0_1_1_2_4 + 0.0964285714285708*G0_1_1_3_1 + 0.00321428571428571*G0_1_1_4_0 + 0.00321428571428571*G0_1_1_4_2 + 0.0257142857142855*G0_1_1_4_4 + 0.0964285714285708*G0_1_1_5_1; + A[62] = -A[82] - 0.0117857142857142*G0_0_1_0_0 - 0.00183035714285714*G0_0_1_0_1 + 0.0209374999999999*G0_0_1_0_2 + 0.0119642857142856*G0_0_1_0_3 + 0.0224999999999999*G0_0_1_0_4 + 0.00642857142857141*G0_0_1_0_5 - 0.00183035714285714*G0_0_1_1_0 - 0.0286607142857141*G0_0_1_1_1 + 0.0204910714285713*G0_0_1_1_2 + 0.0174999999999999*G0_0_1_1_3 + 0.0116071428571428*G0_0_1_1_4 - 0.00571428571428563*G0_0_1_1_5 + 0.0209374999999999*G0_0_1_2_0 + 0.0204910714285713*G0_0_1_2_1 - 0.243749999999999*G0_0_1_2_2 - 0.0874999999999996*G0_0_1_2_3 - 0.0946428571428567*G0_0_1_2_4 - 0.00660714285714289*G0_0_1_2_5 + 0.0119642857142856*G0_0_1_3_0 + 0.0174999999999999*G0_0_1_3_1 - 0.0874999999999996*G0_0_1_3_2 - 0.0742857142857139*G0_0_1_3_3 - 0.0471428571428569*G0_0_1_3_4 - 0.0107142857142857*G0_0_1_3_5 + 0.0224999999999999*G0_0_1_4_0 + 0.0116071428571428*G0_0_1_4_1 - 0.0946428571428567*G0_0_1_4_2 - 0.0471428571428569*G0_0_1_4_3 - 0.0885714285714282*G0_0_1_4_4 - 0.01*G0_0_1_4_5 + 0.00642857142857141*G0_0_1_5_0 - 0.00571428571428563*G0_0_1_5_1 - 0.00660714285714289*G0_0_1_5_2 - 0.0107142857142857*G0_0_1_5_3 - 0.01*G0_0_1_5_4 + 0.0399999999999998*G0_0_1_5_5 - 0.0198214285714285*G0_1_1_0_0 + 0.00486607142857139*G0_1_1_0_1 + 0.0126339285714285*G0_1_1_0_2 + 0.00553571428571424*G0_1_1_0_3 - 0.00321428571428571*G0_1_1_0_5 + 0.00486607142857139*G0_1_1_1_0 - 0.0404464285714283*G0_1_1_1_1 + 0.0148660714285713*G0_1_1_1_2 + 0.0121428571428571*G0_1_1_1_3 + 0.00946428571428568*G0_1_1_1_4 - 0.0142857142857142*G0_1_1_1_5 + 0.0126339285714285*G0_1_1_2_0 + 0.0148660714285713*G0_1_1_2_1 - 0.190178571428571*G0_1_1_2_2 - 0.0660714285714283*G0_1_1_2_3 - 0.0410714285714284*G0_1_1_2_4 + 0.00196428571428565*G0_1_1_2_5 + 0.00553571428571424*G0_1_1_3_0 + 0.0121428571428571*G0_1_1_3_1 - 0.0660714285714283*G0_1_1_3_2 - 0.0485714285714283*G0_1_1_3_3 - 0.0299999999999999*G0_1_1_3_4 - 0.0149999999999999*G0_1_1_3_5 + 0.00946428571428568*G0_1_1_4_1 - 0.0410714285714284*G0_1_1_4_2 - 0.0299999999999999*G0_1_1_4_3 - 0.0628571428571426*G0_1_1_4_4 - 0.0228571428571428*G0_1_1_4_5 - 0.00321428571428571*G0_1_1_5_0 - 0.0142857142857142*G0_1_1_5_1 + 0.00196428571428565*G0_1_1_5_2 - 0.0149999999999999*G0_1_1_5_3 - 0.0228571428571428*G0_1_1_5_4 - 0.088571428571428*G0_1_1_5_5; + A[19] = 0.0117857142857142*G0_0_0_0_0 + 0.00562499999999995*G0_0_0_0_1 - 0.00669642857142854*G0_0_0_0_2 + 0.00214285714285713*G0_0_0_0_3 + 0.00857142857142854*G0_0_0_0_4 + 0.00535714285714283*G0_0_0_0_5 + 0.00562499999999995*G0_0_0_1_0 - 0.0535714285714281*G0_0_0_1_1 + 0.00830357142857139*G0_0_0_1_2 - 0.0535714285714283*G0_0_0_1_3 - 0.00857142857142854*G0_0_0_1_4 - 0.0214285714285713*G0_0_0_1_5 - 0.00669642857142854*G0_0_0_2_0 + 0.00830357142857139*G0_0_0_2_1 + 0.00803571428571423*G0_0_0_2_2 + 0.0224999999999999*G0_0_0_2_3 + 0.00964285714285711*G0_0_0_2_4 + 0.00642857142857141*G0_0_0_2_5 + 0.00214285714285713*G0_0_0_3_0 - 0.0535714285714283*G0_0_0_3_1 + 0.0224999999999999*G0_0_0_3_2 - 0.0257142857142857*G0_0_0_3_3 + 0.0128571428571428*G0_0_0_3_4 - 0.0171428571428571*G0_0_0_3_5 + 0.00857142857142854*G0_0_0_4_0 - 0.00857142857142854*G0_0_0_4_1 + 0.00964285714285711*G0_0_0_4_2 + 0.0128571428571428*G0_0_0_4_3 + 0.128571428571428*G0_0_0_4_4 + 0.00428571428571428*G0_0_0_4_5 + 0.00535714285714283*G0_0_0_5_0 - 0.0214285714285713*G0_0_0_5_1 + 0.00642857142857141*G0_0_0_5_2 - 0.0171428571428571*G0_0_0_5_3 + 0.00428571428571428*G0_0_0_5_4 - 0.0257142857142855*G0_0_0_5_5 + 0.00374999999999999*G0_0_1_0_0 - 0.00267857142857142*G0_0_1_0_1 - 0.00428571428571426*G0_0_1_0_3 - 0.00107142857142856*G0_0_1_0_4 - 0.017142857142857*G0_0_1_0_5 - 0.00267857142857142*G0_0_1_1_0 + 0.00267857142857141*G0_0_1_1_2 - 0.032142857142857*G0_0_1_1_3 + 0.032142857142857*G0_0_1_1_5 + 0.00267857142857141*G0_0_1_2_1 - 0.00375000000000002*G0_0_1_2_2 + 0.0171428571428571*G0_0_1_2_3 + 0.00107142857142856*G0_0_1_2_4 + 0.00428571428571427*G0_0_1_2_5 - 0.00428571428571426*G0_0_1_3_0 - 0.032142857142857*G0_0_1_3_1 + 0.0171428571428571*G0_0_1_3_2 + 0.00857142857142852*G0_0_1_3_4 - 0.00107142857142856*G0_0_1_4_0 + 0.00107142857142856*G0_0_1_4_2 + 0.00857142857142852*G0_0_1_4_3 - 0.00857142857142854*G0_0_1_4_5 - 0.017142857142857*G0_0_1_5_0 + 0.032142857142857*G0_0_1_5_1 + 0.00428571428571427*G0_0_1_5_2 - 0.00857142857142854*G0_0_1_5_4; + A[16] = -A[19] + 0.0125892857142857*G0_0_0_0_0 + 0.00486607142857138*G0_0_0_0_1 - 0.00299107142857141*G0_0_0_0_2 + 0.0135714285714285*G0_0_0_0_4 + 0.00410714285714283*G0_0_0_0_5 + 0.00486607142857138*G0_0_0_1_0 - 0.0455357142857138*G0_0_0_1_1 + 0.00799107142857139*G0_0_0_1_2 - 0.051785714285714*G0_0_0_1_3 - 0.00749999999999997*G0_0_0_1_4 - 0.0178571428571427*G0_0_0_1_5 - 0.00299107142857141*G0_0_0_2_0 + 0.00799107142857139*G0_0_0_2_1 - 0.0267857142857143*G0_0_0_2_2 + 0.0198214285714285*G0_0_0_2_3 - 0.00910714285714284*G0_0_0_2_4 + 0.00571428571428569*G0_0_0_2_5 - 0.051785714285714*G0_0_0_3_1 + 0.0198214285714285*G0_0_0_3_2 + 0.00428571428571415*G0_0_0_3_3 + 0.0149999999999999*G0_0_0_3_4 - 0.0114285714285714*G0_0_0_3_5 + 0.0135714285714285*G0_0_0_4_0 - 0.00749999999999997*G0_0_0_4_1 - 0.00910714285714283*G0_0_0_4_2 + 0.0149999999999999*G0_0_0_4_3 + 0.0942857142857138*G0_0_0_4_4 + 0.00357142857142856*G0_0_0_4_5 + 0.00410714285714283*G0_0_0_5_0 - 0.0178571428571427*G0_0_0_5_1 + 0.00571428571428569*G0_0_0_5_2 - 0.0114285714285714*G0_0_0_5_3 + 0.00357142857142856*G0_0_0_5_4 - 0.0242857142857141*G0_0_0_5_5 - 0.00482142857142852*G0_0_1_0_0 - 0.00272321428571428*G0_0_1_0_1 + 0.000937500000000001*G0_0_1_0_2 - 0.00303571428571427*G0_0_1_0_3 + 0.00339285714285714*G0_0_1_0_4 - 0.0124999999999999*G0_0_1_0_5 - 0.00272321428571428*G0_0_1_1_0 + 0.00218749999999999*G0_0_1_1_2 - 0.0285714285714284*G0_0_1_1_3 + 0.000535714285714281*G0_0_1_1_4 + 0.0285714285714285*G0_0_1_1_5 + 0.000937500000000002*G0_0_1_2_0 + 0.00218749999999999*G0_0_1_2_1 - 0.0291964285714286*G0_0_1_2_2 + 0.0167857142857142*G0_0_1_2_3 - 0.00660714285714285*G0_0_1_2_4 + 0.00517857142857141*G0_0_1_2_5 - 0.00303571428571426*G0_0_1_3_0 - 0.0285714285714284*G0_0_1_3_1 + 0.0167857142857142*G0_0_1_3_2 + 0.0114285714285713*G0_0_1_3_3 + 0.00499999999999997*G0_0_1_3_4 - 0.00428571428571428*G0_0_1_3_5 + 0.00339285714285714*G0_0_1_4_0 + 0.000535714285714281*G0_0_1_4_1 - 0.00660714285714285*G0_0_1_4_2 + 0.00499999999999997*G0_0_1_4_3 + 0.0385714285714283*G0_0_1_4_4 - 0.0114285714285714*G0_0_1_4_5 - 0.0124999999999999*G0_0_1_5_0 + 0.0285714285714285*G0_0_1_5_1 + 0.00517857142857141*G0_0_1_5_2 - 0.00428571428571429*G0_0_1_5_3 - 0.0114285714285714*G0_0_1_5_4 - 0.0028571428571429*G0_0_1_5_5; + A[15] = A[16] - 0.0101785714285714*G0_0_0_0_0 + 0.000937500000000009*G0_0_0_0_1 - 0.000937500000000001*G0_0_0_0_2 + 0.000535714285714283*G0_0_0_0_3 - 0.0160714285714285*G0_0_0_0_4 - 0.00107142857142856*G0_0_0_0_5 + 0.000937500000000009*G0_0_0_1_0 - 0.000401785714285713*G0_0_0_1_2 + 0.00535714285714281*G0_0_0_1_3 - 0.000535714285714282*G0_0_0_1_4 - 0.00535714285714289*G0_0_0_1_5 - 0.000937500000000002*G0_0_0_2_0 - 0.000401785714285713*G0_0_0_2_1 + 0.0441964285714285*G0_0_0_2_2 - 0.00321428571428566*G0_0_0_2_3 + 0.0192857142857142*G0_0_0_2_4 - 0.0026785714285714*G0_0_0_2_5 + 0.000535714285714283*G0_0_0_3_0 + 0.0053571428571428*G0_0_0_3_1 - 0.00321428571428566*G0_0_0_3_2 - 0.0257142857142856*G0_0_0_3_3 + 0.00428571428571425*G0_0_0_3_5 - 0.0160714285714285*G0_0_0_4_0 - 0.000535714285714282*G0_0_0_4_1 + 0.0192857142857142*G0_0_0_4_2 - 0.0385714285714283*G0_0_0_4_4 + 0.00642857142857139*G0_0_0_4_5 - 0.00107142857142856*G0_0_0_5_0 - 0.00535714285714289*G0_0_0_5_1 - 0.0026785714285714*G0_0_0_5_2 + 0.00428571428571425*G0_0_0_5_3 + 0.00642857142857139*G0_0_0_5_4 + 0.017142857142857*G0_0_0_5_5 + 0.0340178571428569*G0_0_1_0_0 + 0.000535714285714289*G0_0_1_0_1 - 0.00187499999999999*G0_0_1_0_2 - 0.00214285714285713*G0_0_1_0_3 + 0.00321428571428568*G0_0_1_0_4 - 0.00428571428571427*G0_0_1_0_5 + 0.000535714285714289*G0_0_1_1_0 + 0.00053571428571428*G0_0_1_1_2 - 0.00107142857142857*G0_0_1_1_4 - 0.00187499999999999*G0_0_1_2_0 + 0.00053571428571428*G0_0_1_2_1 + 0.0340178571428572*G0_0_1_2_2 - 0.00428571428571421*G0_0_1_2_3 + 0.00321428571428572*G0_0_1_2_4 - 0.00214285714285712*G0_0_1_2_5 - 0.00214285714285713*G0_0_1_3_0 - 0.00428571428571421*G0_0_1_3_2 - 0.00857142857142852*G0_0_1_3_3 + 0.00642857142857139*G0_0_1_3_4 + 0.00857142857142852*G0_0_1_3_5 + 0.00321428571428568*G0_0_1_4_0 - 0.00107142857142857*G0_0_1_4_1 + 0.00321428571428572*G0_0_1_4_2 + 0.00642857142857139*G0_0_1_4_3 - 0.0771428571428568*G0_0_1_4_4 + 0.00642857142857139*G0_0_1_4_5 - 0.00428571428571427*G0_0_1_5_0 - 0.00214285714285712*G0_0_1_5_2 + 0.00857142857142852*G0_0_1_5_3 + 0.00642857142857139*G0_0_1_5_4 - 0.00857142857142852*G0_0_1_5_5; + A[10] = A[15] - 0.00997023809523802*G0_0_0_0_0 + 0.00094742063492062*G0_0_0_0_1 - 0.0011954365079365*G0_0_0_0_2 + 0.00218253968253967*G0_0_0_0_3 + 0.00214285714285714*G0_0_0_0_4 + 0.000535714285714282*G0_0_0_0_5 + 0.00094742063492062*G0_0_0_1_0 - 0.0273809523809522*G0_0_0_1_1 + 0.00228670634920634*G0_0_0_1_2 - 0.0160714285714285*G0_0_0_1_3 - 0.0011954365079365*G0_0_0_2_0 + 0.00228670634920634*G0_0_0_2_1 - 0.0118452380952381*G0_0_0_2_2 + 0.00910714285714279*G0_0_0_2_3 + 0.00267857142857141*G0_0_0_2_4 + 0.0043253968253968*G0_0_0_2_5 + 0.00218253968253967*G0_0_0_3_0 - 0.0160714285714285*G0_0_0_3_1 + 0.00910714285714279*G0_0_0_3_2 - 0.0131746031746031*G0_0_0_3_3 - 0.00444444444444442*G0_0_0_3_4 - 0.013015873015873*G0_0_0_3_5 + 0.00214285714285714*G0_0_0_4_0 + 0.00267857142857141*G0_0_0_4_2 - 0.00444444444444442*G0_0_0_4_3 + 0.0639682539682537*G0_0_0_4_4 - 0.00873015873015868*G0_0_0_4_5 + 0.000535714285714282*G0_0_0_5_0 + 0.0043253968253968*G0_0_0_5_2 - 0.013015873015873*G0_0_0_5_3 - 0.00873015873015868*G0_0_0_5_4 - 0.0131746031746031*G0_0_0_5_5 - 0.0447916666666664*G0_0_1_0_0 + 0.000634920634920627*G0_0_1_0_1 + 0.00250992063492062*G0_0_1_0_2 + 0.00146825396825395*G0_0_1_0_3 - 0.0166071428571428*G0_0_1_0_4 - 0.00214285714285712*G0_0_1_0_5 + 0.000634920634920627*G0_0_1_1_0 - 0.019345238095238*G0_0_1_1_1 + 0.00152777777777777*G0_0_1_1_2 - 0.0124999999999999*G0_0_1_1_3 + 0.0011111111111111*G0_0_1_1_4 + 0.00178571428571428*G0_0_1_1_5 + 0.00250992063492062*G0_0_1_2_0 + 0.00152777777777777*G0_0_1_2_1 - 0.0110416666666667*G0_0_1_2_2 + 0.00785714285714279*G0_0_1_2_3 + 0.00767857142857139*G0_0_1_2_4 + 0.00218253968253967*G0_0_1_2_5 + 0.00146825396825395*G0_0_1_3_0 - 0.0124999999999999*G0_0_1_3_1 + 0.00785714285714279*G0_0_1_3_2 - 0.0117460317460317*G0_0_1_3_3 - 0.00515873015873012*G0_0_1_3_4 - 0.00730158730158726*G0_0_1_3_5 - 0.0166071428571428*G0_0_1_4_0 + 0.0011111111111111*G0_0_1_4_1 + 0.00767857142857138*G0_0_1_4_2 - 0.00515873015873012*G0_0_1_4_3 + 0.0296825396825396*G0_0_1_4_4 - 0.00658730158730155*G0_0_1_4_5 - 0.00214285714285713*G0_0_1_5_0 + 0.00178571428571428*G0_0_1_5_1 + 0.00218253968253967*G0_0_1_5_2 - 0.00730158730158726*G0_0_1_5_3 - 0.00658730158730155*G0_0_1_5_4 + 0.0168253968253967*G0_0_1_5_5; + A[14] = -A[16] - 0.0109821428571428*G0_0_1_0_0 + 0.00709821428571422*G0_0_1_0_1 + 0.00874999999999994*G0_0_1_0_3 + 0.00785714285714282*G0_0_1_0_4 + 0.0167857142857142*G0_0_1_0_5 + 0.00709821428571422*G0_0_1_1_0 - 0.0937499999999994*G0_0_1_1_1 + 0.00397321428571426*G0_0_1_1_2 - 0.00178571428571419*G0_0_1_1_3 + 0.00232142857142856*G0_0_1_1_4 - 0.0410714285714283*G0_0_1_1_5 + 0.00397321428571426*G0_0_1_2_1 - 0.0241071428571428*G0_0_1_2_2 - 0.00535714285714287*G0_0_1_2_3 - 0.00535714285714285*G0_0_1_2_4 + 0.00410714285714282*G0_0_1_2_5 + 0.00874999999999993*G0_0_1_3_0 - 0.00178571428571419*G0_0_1_3_1 - 0.00535714285714287*G0_0_1_3_2 - 0.0314285714285712*G0_0_1_3_3 - 0.022142857142857*G0_0_1_3_4 - 0.0257142857142855*G0_0_1_3_5 + 0.00785714285714282*G0_0_1_4_0 + 0.00232142857142856*G0_0_1_4_1 - 0.00535714285714285*G0_0_1_4_2 - 0.022142857142857*G0_0_1_4_3 + 0.0328571428571427*G0_0_1_4_4 - 0.0128571428571428*G0_0_1_4_5 + 0.0167857142857142*G0_0_1_5_0 - 0.0410714285714283*G0_0_1_5_1 + 0.00410714285714282*G0_0_1_5_2 - 0.0257142857142855*G0_0_1_5_3 - 0.0128571428571428*G0_0_1_5_4 - 0.0457142857142854*G0_0_1_5_5; + A[87] = -A[37] - 0.164732142857142*G0_0_0_0_0 + 0.0124553571428571*G0_0_0_0_1 + 0.0108482142857142*G0_0_0_0_2 + 0.0128571428571428*G0_0_0_0_3 - 0.0707142857142853*G0_0_0_0_4 - 0.00160714285714284*G0_0_0_0_5 + 0.0124553571428571*G0_0_0_1_0 - 0.112499999999999*G0_0_0_1_1 + 0.0004017857142857*G0_0_0_1_2 - 0.0160714285714284*G0_0_0_1_3 + 0.0192857142857142*G0_0_0_1_4 + 0.0108482142857142*G0_0_0_2_0 + 0.0004017857142857*G0_0_0_2_1 - 0.00482142857142859*G0_0_0_2_2 + 0.0273214285714284*G0_0_0_2_3 + 0.0466071428571426*G0_0_0_2_4 + 0.0482142857142855*G0_0_0_2_5 + 0.0128571428571428*G0_0_0_3_0 - 0.0160714285714284*G0_0_0_3_1 + 0.0273214285714284*G0_0_0_3_2 + 0.0257142857142854*G0_0_0_3_3 - 0.064285714285714*G0_0_0_3_4 - 0.122142857142857*G0_0_0_3_5 - 0.0707142857142853*G0_0_0_4_0 + 0.0192857142857142*G0_0_0_4_1 + 0.0466071428571426*G0_0_0_4_2 - 0.064285714285714*G0_0_0_4_3 - 0.205714285714285*G0_0_0_4_4 - 0.134999999999999*G0_0_0_4_5 - 0.00160714285714283*G0_0_0_5_0 + 0.0482142857142855*G0_0_0_5_2 - 0.122142857142857*G0_0_0_5_3 - 0.134999999999999*G0_0_0_5_4 - 0.424285714285713*G0_0_0_5_5 + 0.0040178571428571*G0_0_1_0_0 + 0.00803571428571423*G0_0_1_0_1 - 0.00562499999999996*G0_0_1_0_2 + 0.00964285714285711*G0_0_1_0_3 + 0.0176785714285714*G0_0_1_0_4 + 0.00642857142857137*G0_0_1_0_5 + 0.00803571428571423*G0_0_1_1_0 - 0.120535714285713*G0_0_1_1_1 - 0.0160714285714284*G0_0_1_1_3 + 0.0160714285714285*G0_0_1_1_4 + 0.0160714285714285*G0_0_1_1_5 - 0.00562499999999996*G0_0_1_2_0 - 0.00723214285714292*G0_0_1_2_2 + 0.0257142857142856*G0_0_1_2_3 + 0.020892857142857*G0_0_1_2_4 + 0.0546428571428569*G0_0_1_2_5 + 0.00964285714285711*G0_0_1_3_0 - 0.0160714285714284*G0_0_1_3_1 + 0.0257142857142856*G0_0_1_3_2 + 0.0642857142857137*G0_0_1_3_3 - 0.0514285714285712*G0_0_1_3_4 - 0.128571428571428*G0_0_1_3_5 + 0.0176785714285714*G0_0_1_4_0 + 0.0160714285714285*G0_0_1_4_1 + 0.020892857142857*G0_0_1_4_2 - 0.0514285714285712*G0_0_1_4_3 - 0.0385714285714285*G0_0_1_4_4 - 0.141428571428571*G0_0_1_4_5 + 0.00642857142857137*G0_0_1_5_0 + 0.0160714285714285*G0_0_1_5_1 + 0.0546428571428569*G0_0_1_5_2 - 0.128571428571428*G0_0_1_5_3 - 0.141428571428571*G0_0_1_5_4 - 0.578571428571426*G0_0_1_5_5; + A[42] = -A[62] - 0.0230357142857142*G0_1_1_0_0 + 0.00508928571428568*G0_1_1_0_1 + 0.00758928571428567*G0_1_1_0_2 + 0.00714285714285709*G0_1_1_0_3 - 0.00178571428571429*G0_1_1_0_4 - 0.00571428571428568*G0_1_1_0_5 + 0.00508928571428568*G0_1_1_1_0 - 0.0230357142857141*G0_1_1_1_1 + 0.00758928571428566*G0_1_1_1_2 - 0.00178571428571428*G0_1_1_1_3 + 0.00714285714285711*G0_1_1_1_4 - 0.00571428571428567*G0_1_1_1_5 + 0.00758928571428567*G0_1_1_2_0 + 0.00758928571428566*G0_1_1_2_1 - 0.152678571428571*G0_1_1_2_2 - 0.0214285714285713*G0_1_1_2_3 - 0.0214285714285713*G0_1_1_2_4 + 0.00892857142857136*G0_1_1_2_5 + 0.00714285714285709*G0_1_1_3_0 - 0.00178571428571428*G0_1_1_3_1 - 0.0214285714285713*G0_1_1_3_2 - 0.0571428571428568*G0_1_1_3_3 - 0.0285714285714284*G0_1_1_3_4 - 0.032142857142857*G0_1_1_3_5 - 0.00178571428571429*G0_1_1_4_0 + 0.0071428571428571*G0_1_1_4_1 - 0.0214285714285713*G0_1_1_4_2 - 0.0285714285714284*G0_1_1_4_3 - 0.0571428571428569*G0_1_1_4_4 - 0.032142857142857*G0_1_1_4_5 - 0.00571428571428568*G0_1_1_5_0 - 0.00571428571428567*G0_1_1_5_1 + 0.00892857142857136*G0_1_1_5_2 - 0.032142857142857*G0_1_1_5_3 - 0.032142857142857*G0_1_1_5_4 - 0.109999999999999*G0_1_1_5_5; + A[7] = A[42] - 0.198214285714285*G0_0_0_0_0 + 0.0133928571428571*G0_0_0_0_1 + 0.0151785714285714*G0_0_0_0_2 + 0.000892857142857119*G0_0_0_0_3 - 0.0678571428571424*G0_0_0_0_4 - 0.0446428571428569*G0_0_0_0_5 + 0.0133928571428571*G0_0_0_1_0 - 0.0206249999999999*G0_0_0_1_1 + 0.00116071428571428*G0_0_0_1_2 - 0.00821428571428567*G0_0_0_1_3 + 0.00767857142857139*G0_0_0_1_4 + 0.00124999999999999*G0_0_0_1_5 + 0.0151785714285714*G0_0_0_2_0 + 0.00116071428571428*G0_0_0_2_1 - 0.00562500000000002*G0_0_0_2_2 + 0.00446428571428568*G0_0_0_2_3 + 0.0148214285714285*G0_0_0_2_4 + 0.0101785714285714*G0_0_0_2_5 + 0.000892857142857119*G0_0_0_3_0 - 0.00821428571428567*G0_0_0_3_1 + 0.00446428571428568*G0_0_0_3_2 - 0.0542857142857139*G0_0_0_3_3 - 0.0171428571428571*G0_0_0_3_4 - 0.0221428571428571*G0_0_0_3_5 - 0.0678571428571424*G0_0_0_4_0 + 0.00767857142857139*G0_0_0_4_1 + 0.0148214285714285*G0_0_0_4_2 - 0.0171428571428571*G0_0_0_4_3 - 0.0785714285714282*G0_0_0_4_4 - 0.0357142857142856*G0_0_0_4_5 - 0.0446428571428569*G0_0_0_5_0 + 0.00124999999999999*G0_0_0_5_1 + 0.0101785714285714*G0_0_0_5_2 - 0.0221428571428571*G0_0_0_5_3 - 0.0357142857142856*G0_0_0_5_4 - 0.064285714285714*G0_0_0_5_5 + 0.0423214285714284*G0_0_1_0_0 - 0.0103571428571428*G0_0_1_0_1 + 0.0151785714285713*G0_0_1_0_2 + 0.0187499999999999*G0_0_1_0_3 + 0.0410714285714284*G0_0_1_0_4 + 0.0483928571428569*G0_0_1_0_5 - 0.0103571428571428*G0_0_1_1_0 - 0.0206249999999999*G0_0_1_1_1 + 0.0249107142857142*G0_0_1_1_2 + 0.00767857142857139*G0_0_1_1_3 + 0.00767857142857138*G0_0_1_1_4 - 0.0146428571428571*G0_0_1_1_5 + 0.0151785714285713*G0_0_1_2_0 + 0.0249107142857142*G0_0_1_2_1 - 0.246160714285713*G0_0_1_2_2 - 0.0885714285714281*G0_0_1_2_3 - 0.0941071428571424*G0_0_1_2_4 - 0.00767857142857145*G0_0_1_2_5 + 0.0187499999999999*G0_0_1_3_0 + 0.00767857142857139*G0_0_1_3_1 - 0.0885714285714281*G0_0_1_3_2 - 0.141428571428571*G0_0_1_3_3 - 0.0528571428571426*G0_0_1_3_4 - 0.0221428571428571*G0_0_1_3_5 + 0.0410714285714284*G0_0_1_4_0 + 0.00767857142857138*G0_0_1_4_1 - 0.0941071428571424*G0_0_1_4_2 - 0.0528571428571426*G0_0_1_4_3 - 0.0785714285714281*G0_0_1_4_4 + 0.0483928571428569*G0_0_1_5_0 - 0.0146428571428571*G0_0_1_5_1 - 0.00767857142857145*G0_0_1_5_2 - 0.0221428571428571*G0_0_1_5_3 + 0.0228571428571426*G0_0_1_5_5 - 0.198214285714285*G0_1_0_0_0 + 0.0133928571428571*G0_1_0_0_1 + 0.0151785714285714*G0_1_0_0_2 + 0.000892857142857115*G0_1_0_0_3 - 0.0678571428571424*G0_1_0_0_4 - 0.0446428571428569*G0_1_0_0_5 + 0.0133928571428571*G0_1_0_1_0 - 0.0206249999999999*G0_1_0_1_1 + 0.00116071428571428*G0_1_0_1_2 - 0.00821428571428565*G0_1_0_1_3 + 0.00767857142857139*G0_1_0_1_4 + 0.00124999999999999*G0_1_0_1_5 + 0.0151785714285714*G0_1_0_2_0 + 0.00116071428571428*G0_1_0_2_1 - 0.00562499999999998*G0_1_0_2_2 + 0.00446428571428568*G0_1_0_2_3 + 0.0148214285714285*G0_1_0_2_4 + 0.0101785714285714*G0_1_0_2_5 + 0.000892857142857115*G0_1_0_3_0 - 0.00821428571428565*G0_1_0_3_1 + 0.00446428571428568*G0_1_0_3_2 - 0.0542857142857139*G0_1_0_3_3 - 0.0171428571428571*G0_1_0_3_4 - 0.022142857142857*G0_1_0_3_5 - 0.0678571428571424*G0_1_0_4_0 + 0.00767857142857139*G0_1_0_4_1 + 0.0148214285714285*G0_1_0_4_2 - 0.0171428571428571*G0_1_0_4_3 - 0.0785714285714282*G0_1_0_4_4 - 0.0357142857142856*G0_1_0_4_5 - 0.0446428571428569*G0_1_0_5_0 + 0.00124999999999999*G0_1_0_5_1 + 0.0101785714285714*G0_1_0_5_2 - 0.022142857142857*G0_1_0_5_3 - 0.0357142857142856*G0_1_0_5_4 - 0.064285714285714*G0_1_0_5_5 + 0.0479464285714284*G0_1_1_0_0 - 0.0115178571428571*G0_1_1_0_1 + 0.00857142857142853*G0_1_1_0_3 + 0.0262499999999999*G0_1_1_0_4 + 0.0439285714285713*G0_1_1_0_5 - 0.0115178571428571*G0_1_1_1_0 + 0.0115178571428571*G0_1_1_1_2 + 0.0064285714285714*G0_1_1_1_3 - 0.0064285714285714*G0_1_1_1_5 + 0.0115178571428571*G0_1_1_2_1 - 0.0479464285714284*G0_1_1_2_2 - 0.0439285714285712*G0_1_1_2_3 - 0.0262499999999999*G0_1_1_2_4 - 0.00857142857142854*G0_1_1_2_5 + 0.00857142857142853*G0_1_1_3_0 + 0.0064285714285714*G0_1_1_3_1 - 0.0439285714285712*G0_1_1_3_2 - 0.0771428571428567*G0_1_1_3_3 - 0.0171428571428571*G0_1_1_3_4 + 0.0262499999999999*G0_1_1_4_0 - 0.0262499999999999*G0_1_1_4_2 - 0.0171428571428571*G0_1_1_4_3 + 0.0171428571428571*G0_1_1_4_5 + 0.0439285714285713*G0_1_1_5_0 - 0.0064285714285714*G0_1_1_5_1 - 0.00857142857142854*G0_1_1_5_2 + 0.0171428571428571*G0_1_1_5_4 + 0.0771428571428567*G0_1_1_5_5; + A[70] = A[7] - 0.243749999999999*G0_0_1_0_0 + 0.0209821428571427*G0_0_1_0_1 + 0.0209821428571428*G0_0_1_0_2 - 0.00714285714285713*G0_0_1_0_3 - 0.0910714285714281*G0_0_1_0_4 - 0.0910714285714281*G0_0_1_0_5 + 0.0209821428571427*G0_0_1_1_0 - 0.00321428571428567*G0_0_1_1_1 - 0.00276785714285713*G0_0_1_1_2 + 0.00196428571428573*G0_0_1_1_3 + 0.0107142857142857*G0_0_1_1_4 + 0.0178571428571428*G0_0_1_1_5 + 0.0209821428571428*G0_0_1_2_0 - 0.00276785714285713*G0_0_1_2_1 - 0.0032142857142857*G0_0_1_2_2 + 0.0019642857142857*G0_0_1_2_3 + 0.0178571428571428*G0_0_1_2_4 + 0.0107142857142857*G0_0_1_2_5 - 0.00714285714285713*G0_0_1_3_0 + 0.00196428571428573*G0_0_1_3_1 + 0.0019642857142857*G0_0_1_3_2 + 0.00142857142857141*G0_0_1_3_3 - 0.00714285714285712*G0_0_1_3_4 - 0.0071428571428571*G0_0_1_3_5 - 0.0910714285714281*G0_0_1_4_0 + 0.0107142857142857*G0_0_1_4_1 + 0.0178571428571428*G0_0_1_4_2 - 0.00714285714285712*G0_0_1_4_3 - 0.0857142857142853*G0_0_1_4_4 - 0.0428571428571427*G0_0_1_4_5 - 0.0910714285714281*G0_0_1_5_0 + 0.0178571428571428*G0_0_1_5_1 + 0.0107142857142857*G0_0_1_5_2 - 0.0071428571428571*G0_0_1_5_3 - 0.0428571428571427*G0_0_1_5_4 - 0.0857142857142851*G0_0_1_5_5 + 0.243749999999999*G0_1_0_0_0 - 0.0209821428571427*G0_1_0_0_1 - 0.0209821428571428*G0_1_0_0_2 + 0.00714285714285713*G0_1_0_0_3 + 0.0910714285714281*G0_1_0_0_4 + 0.0910714285714281*G0_1_0_0_5 - 0.0209821428571427*G0_1_0_1_0 + 0.00321428571428567*G0_1_0_1_1 + 0.00276785714285713*G0_1_0_1_2 - 0.00196428571428573*G0_1_0_1_3 - 0.0107142857142857*G0_1_0_1_4 - 0.0178571428571428*G0_1_0_1_5 - 0.0209821428571428*G0_1_0_2_0 + 0.00276785714285713*G0_1_0_2_1 + 0.0032142857142857*G0_1_0_2_2 - 0.0019642857142857*G0_1_0_2_3 - 0.0178571428571428*G0_1_0_2_4 - 0.0107142857142857*G0_1_0_2_5 + 0.00714285714285713*G0_1_0_3_0 - 0.00196428571428573*G0_1_0_3_1 - 0.0019642857142857*G0_1_0_3_2 - 0.00142857142857142*G0_1_0_3_3 + 0.00714285714285712*G0_1_0_3_4 + 0.0071428571428571*G0_1_0_3_5 + 0.0910714285714281*G0_1_0_4_0 - 0.0107142857142857*G0_1_0_4_1 - 0.0178571428571428*G0_1_0_4_2 + 0.00714285714285712*G0_1_0_4_3 + 0.0857142857142853*G0_1_0_4_4 + 0.0428571428571427*G0_1_0_4_5 + 0.0910714285714281*G0_1_0_5_0 - 0.0178571428571428*G0_1_0_5_1 - 0.0107142857142857*G0_1_0_5_2 + 0.0071428571428571*G0_1_0_5_3 + 0.0428571428571427*G0_1_0_5_4 + 0.0857142857142852*G0_1_0_5_5; + A[5] = A[70] + 0.243749999999999*G0_0_0_0_0 - 0.0191964285714285*G0_0_0_0_1 - 0.022767857142857*G0_0_0_0_2 + 0.00714285714285713*G0_0_0_0_3 + 0.114285714285714*G0_0_0_0_4 + 0.0678571428571425*G0_0_0_0_5 - 0.0191964285714285*G0_0_0_1_0 + 0.0182142857142856*G0_0_0_1_1 + 0.00276785714285713*G0_0_0_1_2 + 0.0107142857142856*G0_0_0_1_3 - 0.00821428571428569*G0_0_0_1_4 - 0.00428571428571426*G0_0_0_1_5 - 0.022767857142857*G0_0_0_2_0 + 0.00276785714285713*G0_0_0_2_1 - 0.0117857142857143*G0_0_0_2_2 - 0.0146428571428571*G0_0_0_2_3 - 0.0314285714285713*G0_0_0_2_4 - 0.0132142857142857*G0_0_0_2_5 + 0.00714285714285713*G0_0_0_3_0 + 0.0107142857142856*G0_0_0_3_1 - 0.0146428571428571*G0_0_0_3_2 - 0.0014285714285714*G0_0_0_3_3 + 0.00214285714285715*G0_0_0_3_4 + 0.0121428571428571*G0_0_0_3_5 + 0.114285714285714*G0_0_0_4_0 - 0.00821428571428569*G0_0_0_4_1 - 0.0314285714285713*G0_0_0_4_2 + 0.00214285714285715*G0_0_0_4_3 + 0.1*G0_0_0_4_4 + 0.0428571428571427*G0_0_0_4_5 + 0.0678571428571425*G0_0_0_5_0 - 0.00428571428571426*G0_0_0_5_1 - 0.0132142857142857*G0_0_0_5_2 + 0.0121428571428571*G0_0_0_5_3 + 0.0428571428571427*G0_0_0_5_4 + 0.0714285714285711*G0_0_0_5_5 + 0.00178571428571428*G0_0_1_0_1 - 0.00178571428571428*G0_0_1_0_2 + 0.0232142857142856*G0_0_1_0_4 - 0.0232142857142856*G0_0_1_0_5 + 0.00178571428571428*G0_0_1_1_0 + 0.0149999999999999*G0_0_1_1_1 + 0.0126785714285713*G0_0_1_1_3 + 0.00249999999999998*G0_0_1_1_4 + 0.0135714285714285*G0_0_1_1_5 - 0.00178571428571429*G0_0_1_2_0 - 0.015*G0_0_1_2_2 - 0.0126785714285714*G0_0_1_2_3 - 0.0135714285714285*G0_0_1_2_4 - 0.0025*G0_0_1_2_5 + 0.0126785714285713*G0_0_1_3_1 - 0.0126785714285714*G0_0_1_3_2 - 0.00499999999999997*G0_0_1_3_4 + 0.00499999999999998*G0_0_1_3_5 + 0.0232142857142856*G0_0_1_4_0 + 0.00249999999999998*G0_0_1_4_1 - 0.0135714285714285*G0_0_1_4_2 - 0.00499999999999997*G0_0_1_4_3 + 0.0142857142857142*G0_0_1_4_4 - 0.0232142857142856*G0_0_1_5_0 + 0.0135714285714285*G0_0_1_5_1 - 0.0025*G0_0_1_5_2 + 0.00499999999999998*G0_0_1_5_3 - 0.0142857142857141*G0_0_1_5_5 + 0.00178571428571427*G0_1_0_0_1 - 0.00178571428571428*G0_1_0_0_2 + 0.0232142857142856*G0_1_0_0_4 - 0.0232142857142856*G0_1_0_0_5 + 0.00178571428571427*G0_1_0_1_0 + 0.015*G0_1_0_1_1 + 0.0126785714285714*G0_1_0_1_3 + 0.00249999999999998*G0_1_0_1_4 + 0.0135714285714285*G0_1_0_1_5 - 0.00178571428571428*G0_1_0_2_0 - 0.015*G0_1_0_2_2 - 0.0126785714285714*G0_1_0_2_3 - 0.0135714285714285*G0_1_0_2_4 - 0.00250000000000001*G0_1_0_2_5 + 0.0126785714285714*G0_1_0_3_1 - 0.0126785714285714*G0_1_0_3_2 - 0.00499999999999998*G0_1_0_3_4 + 0.00499999999999999*G0_1_0_3_5 + 0.0232142857142856*G0_1_0_4_0 + 0.00249999999999998*G0_1_0_4_1 - 0.0135714285714285*G0_1_0_4_2 - 0.00499999999999998*G0_1_0_4_3 + 0.0142857142857142*G0_1_0_4_4 - 0.0232142857142856*G0_1_0_5_0 + 0.0135714285714285*G0_1_0_5_1 - 0.0025*G0_1_0_5_2 + 0.00499999999999999*G0_1_0_5_3 - 0.0142857142857141*G0_1_0_5_5 - 0.243749999999999*G0_1_1_0_0 + 0.022767857142857*G0_1_1_0_1 + 0.0191964285714285*G0_1_1_0_2 - 0.00714285714285713*G0_1_1_0_3 - 0.0678571428571425*G0_1_1_0_4 - 0.114285714285714*G0_1_1_0_5 + 0.022767857142857*G0_1_1_1_0 + 0.0117857142857142*G0_1_1_1_1 - 0.00276785714285713*G0_1_1_1_2 + 0.0146428571428571*G0_1_1_1_3 + 0.0132142857142857*G0_1_1_1_4 + 0.0314285714285713*G0_1_1_1_5 + 0.0191964285714285*G0_1_1_2_0 - 0.00276785714285713*G0_1_1_2_1 - 0.0182142857142857*G0_1_1_2_2 - 0.0107142857142857*G0_1_1_2_3 + 0.00428571428571426*G0_1_1_2_4 + 0.00821428571428567*G0_1_1_2_5 - 0.00714285714285713*G0_1_1_3_0 + 0.0146428571428571*G0_1_1_3_1 - 0.0107142857142857*G0_1_1_3_2 + 0.00142857142857142*G0_1_1_3_3 - 0.0121428571428571*G0_1_1_3_4 - 0.00214285714285714*G0_1_1_3_5 - 0.0678571428571425*G0_1_1_4_0 + 0.0132142857142857*G0_1_1_4_1 + 0.00428571428571426*G0_1_1_4_2 - 0.0121428571428571*G0_1_1_4_3 - 0.0714285714285711*G0_1_1_4_4 - 0.0428571428571427*G0_1_1_4_5 - 0.114285714285714*G0_1_1_5_0 + 0.0314285714285713*G0_1_1_5_1 + 0.00821428571428567*G0_1_1_5_2 - 0.00214285714285714*G0_1_1_5_3 - 0.0428571428571427*G0_1_1_5_4 - 0.1*G0_1_1_5_5; + A[50] = A[5] + 0.243749999999999*G0_0_1_0_0 - 0.0209821428571428*G0_0_1_0_1 - 0.0209821428571428*G0_0_1_0_2 + 0.00714285714285713*G0_0_1_0_3 + 0.0910714285714281*G0_0_1_0_4 + 0.0910714285714281*G0_0_1_0_5 - 0.0209821428571428*G0_0_1_1_0 + 0.0032142857142857*G0_0_1_1_1 + 0.00276785714285713*G0_0_1_1_2 - 0.0019642857142857*G0_0_1_1_3 - 0.0107142857142857*G0_0_1_1_4 - 0.0178571428571428*G0_0_1_1_5 - 0.0209821428571428*G0_0_1_2_0 + 0.00276785714285713*G0_0_1_2_1 + 0.0032142857142857*G0_0_1_2_2 - 0.00196428571428571*G0_0_1_2_3 - 0.0178571428571428*G0_0_1_2_4 - 0.0107142857142857*G0_0_1_2_5 + 0.00714285714285713*G0_0_1_3_0 - 0.00196428571428571*G0_0_1_3_1 - 0.00196428571428571*G0_0_1_3_2 - 0.00142857142857145*G0_0_1_3_3 + 0.00714285714285711*G0_0_1_3_4 + 0.00714285714285711*G0_0_1_3_5 + 0.0910714285714281*G0_0_1_4_0 - 0.0107142857142857*G0_0_1_4_1 - 0.0178571428571428*G0_0_1_4_2 + 0.00714285714285711*G0_0_1_4_3 + 0.0857142857142853*G0_0_1_4_4 + 0.0428571428571427*G0_0_1_4_5 + 0.0910714285714281*G0_0_1_5_0 - 0.0178571428571428*G0_0_1_5_1 - 0.0107142857142857*G0_0_1_5_2 + 0.00714285714285711*G0_0_1_5_3 + 0.0428571428571427*G0_0_1_5_4 + 0.0857142857142852*G0_0_1_5_5 - 0.243749999999999*G0_1_0_0_0 + 0.0209821428571428*G0_1_0_0_1 + 0.0209821428571428*G0_1_0_0_2 - 0.00714285714285713*G0_1_0_0_3 - 0.0910714285714281*G0_1_0_0_4 - 0.0910714285714281*G0_1_0_0_5 + 0.0209821428571428*G0_1_0_1_0 - 0.0032142857142857*G0_1_0_1_1 - 0.00276785714285713*G0_1_0_1_2 + 0.0019642857142857*G0_1_0_1_3 + 0.0107142857142857*G0_1_0_1_4 + 0.0178571428571428*G0_1_0_1_5 + 0.0209821428571428*G0_1_0_2_0 - 0.00276785714285713*G0_1_0_2_1 - 0.00321428571428571*G0_1_0_2_2 + 0.00196428571428571*G0_1_0_2_3 + 0.0178571428571428*G0_1_0_2_4 + 0.0107142857142857*G0_1_0_2_5 - 0.00714285714285713*G0_1_0_3_0 + 0.0019642857142857*G0_1_0_3_1 + 0.0019642857142857*G0_1_0_3_2 + 0.00142857142857145*G0_1_0_3_3 - 0.00714285714285712*G0_1_0_3_4 - 0.00714285714285711*G0_1_0_3_5 - 0.0910714285714281*G0_1_0_4_0 + 0.0107142857142857*G0_1_0_4_1 + 0.0178571428571428*G0_1_0_4_2 - 0.00714285714285711*G0_1_0_4_3 - 0.0857142857142853*G0_1_0_4_4 - 0.0428571428571427*G0_1_0_4_5 - 0.0910714285714281*G0_1_0_5_0 + 0.0178571428571428*G0_1_0_5_1 + 0.0107142857142857*G0_1_0_5_2 - 0.00714285714285711*G0_1_0_5_3 - 0.0428571428571427*G0_1_0_5_4 - 0.0857142857142852*G0_1_0_5_5; + A[68] = -A[48] + 0.041785714285714*G0_1_0_0_0 - 0.00281249999999994*G0_1_0_0_1 + 0.00281249999999998*G0_1_0_0_2 - 0.0144642857142856*G0_1_0_0_3 - 0.0192857142857142*G0_1_0_0_4 - 0.0241071428571428*G0_1_0_0_5 - 0.00281249999999994*G0_1_0_1_0 + 0.124553571428571*G0_1_0_1_1 - 0.00120535714285712*G0_1_0_1_2 - 0.00964285714285724*G0_1_0_1_3 - 0.00803571428571425*G0_1_0_1_4 + 0.0337499999999997*G0_1_0_1_5 + 0.00281249999999998*G0_1_0_2_0 - 0.00120535714285712*G0_1_0_2_1 - 0.00160714285714285*G0_1_0_2_5 - 0.0144642857142856*G0_1_0_3_0 - 0.00964285714285724*G0_1_0_3_1 - 0.012857142857143*G0_1_0_3_3 + 0.0449999999999998*G0_1_0_3_4 + 0.032142857142857*G0_1_0_3_5 - 0.0192857142857142*G0_1_0_4_0 - 0.00803571428571425*G0_1_0_4_1 + 0.0449999999999998*G0_1_0_4_3 - 0.0771428571428569*G0_1_0_4_4 + 0.0192857142857142*G0_1_0_4_5 - 0.0241071428571428*G0_1_0_5_0 + 0.0337499999999997*G0_1_0_5_1 - 0.00160714285714285*G0_1_0_5_2 + 0.032142857142857*G0_1_0_5_3 + 0.0192857142857142*G0_1_0_5_4 - 0.179999999999999*G0_1_0_5_5 - 0.00241071428571422*G0_1_1_0_0 - 0.0164732142857142*G0_1_1_0_1 - 0.000401785714285735*G0_1_1_0_2 + 0.00642857142857143*G0_1_1_0_3 - 0.00160714285714281*G0_1_1_0_4 - 0.0257142857142855*G0_1_1_0_5 - 0.0164732142857142*G0_1_1_1_0 + 0.168749999999999*G0_1_1_1_1 - 0.00441964285714281*G0_1_1_1_2 + 0.00803571428571405*G0_1_1_1_3 - 0.00321428571428572*G0_1_1_1_4 + 0.0883928571428565*G0_1_1_1_5 - 0.000401785714285735*G0_1_1_2_0 - 0.00441964285714281*G0_1_1_2_1 - 0.00803571428571415*G0_1_1_2_2 + 0.0160714285714286*G0_1_1_2_3 - 0.00321428571428566*G0_1_1_2_5 + 0.00642857142857143*G0_1_1_3_0 + 0.00803571428571404*G0_1_1_3_1 + 0.0160714285714286*G0_1_1_3_2 - 0.154285714285714*G0_1_1_3_3 - 0.00642857142857146*G0_1_1_3_4 - 0.00642857142857161*G0_1_1_3_5 - 0.00160714285714281*G0_1_1_4_0 - 0.00321428571428572*G0_1_1_4_1 - 0.00642857142857146*G0_1_1_4_3 + 0.0385714285714285*G0_1_1_4_4 + 0.0128571428571428*G0_1_1_4_5 - 0.0257142857142855*G0_1_1_5_0 + 0.0883928571428565*G0_1_1_5_1 - 0.00321428571428566*G0_1_1_5_2 - 0.00642857142857161*G0_1_1_5_3 + 0.0128571428571428*G0_1_1_5_4 + 0.167142857142856*G0_1_1_5_5; + A[17] = -A[14] + 0.0326785714285712*G0_0_0_0_0 - 0.00339285714285711*G0_0_0_0_1 - 0.0064285714285714*G0_0_0_0_2 - 0.000357142857142846*G0_0_0_0_3 + 0.0114285714285713*G0_0_0_0_4 + 0.00892857142857139*G0_0_0_0_5 - 0.00339285714285711*G0_0_0_1_0 + 0.077678571428571*G0_0_0_1_1 - 0.00607142857142854*G0_0_0_1_2 + 0.032142857142857*G0_0_0_1_3 - 0.0039285714285714*G0_0_0_1_4 - 0.0064285714285714*G0_0_0_2_0 - 0.00607142857142854*G0_0_0_2_1 + 0.0364285714285714*G0_0_0_2_2 - 0.00821428571428565*G0_0_0_2_3 + 0.0103571428571428*G0_0_0_2_4 - 0.00464285714285712*G0_0_0_2_5 - 0.000357142857142846*G0_0_0_3_0 + 0.032142857142857*G0_0_0_3_1 - 0.00821428571428565*G0_0_0_3_2 + 0.0114285714285714*G0_0_0_3_3 + 0.00857142857142852*G0_0_0_3_4 + 0.00999999999999995*G0_0_0_3_5 + 0.0114285714285713*G0_0_0_4_0 - 0.0039285714285714*G0_0_0_4_1 + 0.0103571428571428*G0_0_0_4_2 + 0.00857142857142852*G0_0_0_4_3 + 0.0742857142857139*G0_0_0_4_4 + 0.0171428571428571*G0_0_0_4_5 + 0.00892857142857139*G0_0_0_5_0 - 0.00464285714285712*G0_0_0_5_2 + 0.00999999999999995*G0_0_0_5_3 + 0.0171428571428571*G0_0_0_5_4 + 0.0114285714285714*G0_0_0_5_5 - 0.00374999999999998*G0_0_1_0_0 + 0.00267857142857141*G0_0_1_0_1 + 0.00428571428571425*G0_0_1_0_3 + 0.00107142857142856*G0_0_1_0_4 + 0.017142857142857*G0_0_1_0_5 + 0.00267857142857141*G0_0_1_1_0 - 0.00267857142857143*G0_0_1_1_2 + 0.032142857142857*G0_0_1_1_3 - 0.032142857142857*G0_0_1_1_5 - 0.00267857142857143*G0_0_1_2_1 + 0.00375000000000003*G0_0_1_2_2 - 0.0171428571428571*G0_0_1_2_3 - 0.00107142857142855*G0_0_1_2_4 - 0.00428571428571428*G0_0_1_2_5 + 0.00428571428571425*G0_0_1_3_0 + 0.032142857142857*G0_0_1_3_1 - 0.0171428571428571*G0_0_1_3_2 - 0.00857142857142851*G0_0_1_3_4 + 0.00107142857142855*G0_0_1_4_0 - 0.00107142857142855*G0_0_1_4_2 - 0.00857142857142851*G0_0_1_4_3 + 0.00857142857142854*G0_0_1_4_5 + 0.017142857142857*G0_0_1_5_0 - 0.032142857142857*G0_0_1_5_1 - 0.00428571428571428*G0_0_1_5_2 + 0.00857142857142855*G0_0_1_5_4; + A[91] = A[19] - 0.00374999999999999*G0_0_1_0_0 + 0.00267857142857142*G0_0_1_0_1 + 0.00428571428571426*G0_0_1_0_3 + 0.00107142857142856*G0_0_1_0_4 + 0.0171428571428571*G0_0_1_0_5 + 0.00267857142857142*G0_0_1_1_0 - 0.00267857142857141*G0_0_1_1_2 + 0.032142857142857*G0_0_1_1_3 - 0.032142857142857*G0_0_1_1_5 - 0.00267857142857141*G0_0_1_2_1 + 0.00375000000000002*G0_0_1_2_2 - 0.017142857142857*G0_0_1_2_3 - 0.00107142857142857*G0_0_1_2_4 - 0.00428571428571427*G0_0_1_2_5 + 0.00428571428571426*G0_0_1_3_0 + 0.032142857142857*G0_0_1_3_1 - 0.017142857142857*G0_0_1_3_2 - 0.00857142857142852*G0_0_1_3_4 + 0.00107142857142856*G0_0_1_4_0 - 0.00107142857142857*G0_0_1_4_2 - 0.00857142857142851*G0_0_1_4_3 + 0.00857142857142856*G0_0_1_4_5 + 0.0171428571428571*G0_0_1_5_0 - 0.032142857142857*G0_0_1_5_1 - 0.00428571428571427*G0_0_1_5_2 + 0.00857142857142856*G0_0_1_5_4 + 0.00374999999999999*G0_1_0_0_0 - 0.00267857142857142*G0_1_0_0_1 - 0.00428571428571426*G0_1_0_0_3 - 0.00107142857142856*G0_1_0_0_4 - 0.0171428571428571*G0_1_0_0_5 - 0.00267857142857142*G0_1_0_1_0 + 0.00267857142857141*G0_1_0_1_2 - 0.032142857142857*G0_1_0_1_3 + 0.032142857142857*G0_1_0_1_5 + 0.00267857142857141*G0_1_0_2_1 - 0.00375000000000002*G0_1_0_2_2 + 0.017142857142857*G0_1_0_2_3 + 0.00107142857142857*G0_1_0_2_4 + 0.00428571428571428*G0_1_0_2_5 - 0.00428571428571426*G0_1_0_3_0 - 0.032142857142857*G0_1_0_3_1 + 0.017142857142857*G0_1_0_3_2 + 0.00857142857142852*G0_1_0_3_4 - 0.00107142857142856*G0_1_0_4_0 + 0.00107142857142857*G0_1_0_4_2 + 0.00857142857142851*G0_1_0_4_3 - 0.00857142857142855*G0_1_0_4_5 - 0.017142857142857*G0_1_0_5_0 + 0.032142857142857*G0_1_0_5_1 + 0.00428571428571428*G0_1_0_5_2 - 0.00857142857142855*G0_1_0_5_4; + A[61] = -A[91] + 0.0125892857142857*G0_0_0_0_0 + 0.00486607142857138*G0_0_0_0_1 - 0.00299107142857141*G0_0_0_0_2 + 0.0135714285714285*G0_0_0_0_4 + 0.00410714285714283*G0_0_0_0_5 + 0.00486607142857138*G0_0_0_1_0 - 0.0455357142857138*G0_0_0_1_1 + 0.00799107142857139*G0_0_0_1_2 - 0.051785714285714*G0_0_0_1_3 - 0.00749999999999997*G0_0_0_1_4 - 0.0178571428571427*G0_0_0_1_5 - 0.00299107142857141*G0_0_0_2_0 + 0.00799107142857139*G0_0_0_2_1 - 0.0267857142857143*G0_0_0_2_2 + 0.0198214285714285*G0_0_0_2_3 - 0.00910714285714284*G0_0_0_2_4 + 0.00571428571428569*G0_0_0_2_5 - 0.051785714285714*G0_0_0_3_1 + 0.0198214285714285*G0_0_0_3_2 + 0.00428571428571414*G0_0_0_3_3 + 0.0149999999999999*G0_0_0_3_4 - 0.0114285714285714*G0_0_0_3_5 + 0.0135714285714285*G0_0_0_4_0 - 0.00749999999999997*G0_0_0_4_1 - 0.00910714285714283*G0_0_0_4_2 + 0.0149999999999999*G0_0_0_4_3 + 0.0942857142857138*G0_0_0_4_4 + 0.00357142857142856*G0_0_0_4_5 + 0.00410714285714283*G0_0_0_5_0 - 0.0178571428571427*G0_0_0_5_1 + 0.00571428571428569*G0_0_0_5_2 - 0.0114285714285714*G0_0_0_5_3 + 0.00357142857142856*G0_0_0_5_4 - 0.0242857142857141*G0_0_0_5_5 - 0.00482142857142851*G0_1_0_0_0 - 0.00272321428571428*G0_1_0_0_1 + 0.000937500000000001*G0_1_0_0_2 - 0.00303571428571426*G0_1_0_0_3 + 0.00339285714285714*G0_1_0_0_4 - 0.0124999999999999*G0_1_0_0_5 - 0.00272321428571428*G0_1_0_1_0 + 0.00218749999999999*G0_1_0_1_2 - 0.0285714285714284*G0_1_0_1_3 + 0.000535714285714281*G0_1_0_1_4 + 0.0285714285714284*G0_1_0_1_5 + 0.000937500000000001*G0_1_0_2_0 + 0.00218749999999999*G0_1_0_2_1 - 0.0291964285714286*G0_1_0_2_2 + 0.0167857142857142*G0_1_0_2_3 - 0.00660714285714285*G0_1_0_2_4 + 0.00517857142857141*G0_1_0_2_5 - 0.00303571428571427*G0_1_0_3_0 - 0.0285714285714284*G0_1_0_3_1 + 0.0167857142857142*G0_1_0_3_2 + 0.0114285714285713*G0_1_0_3_3 + 0.00499999999999997*G0_1_0_3_4 - 0.00428571428571429*G0_1_0_3_5 + 0.00339285714285714*G0_1_0_4_0 + 0.000535714285714281*G0_1_0_4_1 - 0.00660714285714285*G0_1_0_4_2 + 0.00499999999999997*G0_1_0_4_3 + 0.0385714285714284*G0_1_0_4_4 - 0.0114285714285714*G0_1_0_4_5 - 0.0124999999999999*G0_1_0_5_0 + 0.0285714285714284*G0_1_0_5_1 + 0.00517857142857141*G0_1_0_5_2 - 0.00428571428571429*G0_1_0_5_3 - 0.0114285714285714*G0_1_0_5_4 - 0.00285714285714291*G0_1_0_5_5; + A[51] = A[61] - 0.0101785714285714*G0_0_0_0_0 + 0.000937500000000009*G0_0_0_0_1 - 0.000937500000000002*G0_0_0_0_2 + 0.000535714285714282*G0_0_0_0_3 - 0.0160714285714285*G0_0_0_0_4 - 0.00107142857142856*G0_0_0_0_5 + 0.000937500000000009*G0_0_0_1_0 - 0.000401785714285713*G0_0_0_1_2 + 0.0053571428571428*G0_0_0_1_3 - 0.000535714285714283*G0_0_0_1_4 - 0.00535714285714289*G0_0_0_1_5 - 0.000937500000000002*G0_0_0_2_0 - 0.000401785714285713*G0_0_0_2_1 + 0.0441964285714285*G0_0_0_2_2 - 0.00321428571428566*G0_0_0_2_3 + 0.0192857142857142*G0_0_0_2_4 - 0.0026785714285714*G0_0_0_2_5 + 0.000535714285714282*G0_0_0_3_0 + 0.0053571428571428*G0_0_0_3_1 - 0.00321428571428566*G0_0_0_3_2 - 0.0257142857142856*G0_0_0_3_3 + 0.00428571428571425*G0_0_0_3_5 - 0.0160714285714285*G0_0_0_4_0 - 0.000535714285714283*G0_0_0_4_1 + 0.0192857142857142*G0_0_0_4_2 - 0.0385714285714283*G0_0_0_4_4 + 0.00642857142857139*G0_0_0_4_5 - 0.00107142857142856*G0_0_0_5_0 - 0.00535714285714289*G0_0_0_5_1 - 0.0026785714285714*G0_0_0_5_2 + 0.00428571428571425*G0_0_0_5_3 + 0.00642857142857139*G0_0_0_5_4 + 0.017142857142857*G0_0_0_5_5 + 0.0340178571428569*G0_1_0_0_0 + 0.000535714285714289*G0_1_0_0_1 - 0.00187499999999999*G0_1_0_0_2 - 0.00214285714285713*G0_1_0_0_3 + 0.00321428571428568*G0_1_0_0_4 - 0.00428571428571427*G0_1_0_0_5 + 0.000535714285714289*G0_1_0_1_0 + 0.00053571428571428*G0_1_0_1_2 - 0.00107142857142857*G0_1_0_1_4 - 0.00187499999999999*G0_1_0_2_0 + 0.00053571428571428*G0_1_0_2_1 + 0.0340178571428572*G0_1_0_2_2 - 0.00428571428571421*G0_1_0_2_3 + 0.00321428571428572*G0_1_0_2_4 - 0.00214285714285712*G0_1_0_2_5 - 0.00214285714285713*G0_1_0_3_0 - 0.00428571428571421*G0_1_0_3_2 - 0.00857142857142852*G0_1_0_3_3 + 0.00642857142857139*G0_1_0_3_4 + 0.00857142857142852*G0_1_0_3_5 + 0.00321428571428568*G0_1_0_4_0 - 0.00107142857142857*G0_1_0_4_1 + 0.00321428571428572*G0_1_0_4_2 + 0.00642857142857139*G0_1_0_4_3 - 0.0771428571428568*G0_1_0_4_4 + 0.00642857142857139*G0_1_0_4_5 - 0.00428571428571427*G0_1_0_5_0 - 0.00214285714285712*G0_1_0_5_2 + 0.00857142857142852*G0_1_0_5_3 + 0.00642857142857139*G0_1_0_5_4 - 0.00857142857142851*G0_1_0_5_5; + A[41] = -A[61] - 0.0109821428571428*G0_1_0_0_0 + 0.00709821428571422*G0_1_0_0_1 + 0.00874999999999994*G0_1_0_0_3 + 0.00785714285714282*G0_1_0_0_4 + 0.0167857142857142*G0_1_0_0_5 + 0.00709821428571422*G0_1_0_1_0 - 0.0937499999999994*G0_1_0_1_1 + 0.00397321428571426*G0_1_0_1_2 - 0.00178571428571419*G0_1_0_1_3 + 0.00232142857142856*G0_1_0_1_4 - 0.0410714285714283*G0_1_0_1_5 + 0.00397321428571426*G0_1_0_2_1 - 0.0241071428571428*G0_1_0_2_2 - 0.00535714285714287*G0_1_0_2_3 - 0.00535714285714285*G0_1_0_2_4 + 0.00410714285714282*G0_1_0_2_5 + 0.00874999999999993*G0_1_0_3_0 - 0.00178571428571419*G0_1_0_3_1 - 0.00535714285714287*G0_1_0_3_2 - 0.0314285714285712*G0_1_0_3_3 - 0.022142857142857*G0_1_0_3_4 - 0.0257142857142855*G0_1_0_3_5 + 0.00785714285714282*G0_1_0_4_0 + 0.00232142857142856*G0_1_0_4_1 - 0.00535714285714285*G0_1_0_4_2 - 0.022142857142857*G0_1_0_4_3 + 0.0328571428571427*G0_1_0_4_4 - 0.0128571428571428*G0_1_0_4_5 + 0.0167857142857142*G0_1_0_5_0 - 0.0410714285714283*G0_1_0_5_1 + 0.00410714285714282*G0_1_0_5_2 - 0.0257142857142855*G0_1_0_5_3 - 0.0128571428571428*G0_1_0_5_4 - 0.0457142857142854*G0_1_0_5_5; + A[40] = -A[41] + 0.00723214285714288*G0_0_0_0_0 - 0.00401785714285713*G0_0_0_0_2 + 0.00321428571428569*G0_0_0_0_3 - 0.00321428571428569*G0_0_0_0_4 + 0.00482142857142858*G0_0_0_0_5 - 0.00723214285714286*G0_0_0_1_1 + 0.00401785714285712*G0_0_0_1_2 + 0.0032142857142857*G0_0_0_1_3 - 0.0032142857142857*G0_0_0_1_4 - 0.00482142857142857*G0_0_0_1_5 - 0.00401785714285713*G0_0_0_2_0 + 0.00401785714285712*G0_0_0_2_1 - 0.0160714285714285*G0_0_0_2_3 + 0.0160714285714285*G0_0_0_2_4 + 0.00321428571428569*G0_0_0_3_0 + 0.0032142857142857*G0_0_0_3_1 - 0.0160714285714285*G0_0_0_3_2 - 0.064285714285714*G0_0_0_3_3 - 0.00642857142857142*G0_0_0_3_5 - 0.00321428571428569*G0_0_0_4_0 - 0.0032142857142857*G0_0_0_4_1 + 0.0160714285714285*G0_0_0_4_2 + 0.064285714285714*G0_0_0_4_4 + 0.00642857142857141*G0_0_0_4_5 + 0.00482142857142858*G0_0_0_5_0 - 0.00482142857142857*G0_0_0_5_1 - 0.00642857142857142*G0_0_0_5_3 + 0.00642857142857141*G0_0_0_5_4 + 0.00803571428571431*G0_0_1_0_0 - 0.000758928571428573*G0_0_1_0_1 - 0.0003125*G0_0_1_0_2 + 0.00107142857142857*G0_0_1_0_3 + 0.00178571428571429*G0_0_1_0_4 + 0.00357142857142858*G0_0_1_0_5 - 0.000758928571428573*G0_0_1_1_0 + 0.000803571428571426*G0_0_1_1_1 + 0.00370535714285713*G0_0_1_1_2 + 0.00499999999999997*G0_0_1_1_3 - 0.00214285714285713*G0_0_1_1_4 - 0.00125*G0_0_1_1_5 - 0.0003125*G0_0_1_2_0 + 0.00370535714285713*G0_0_1_2_1 - 0.0348214285714285*G0_0_1_2_2 - 0.0187499999999999*G0_0_1_2_3 - 0.00267857142857144*G0_0_1_2_4 - 0.000714285714285725*G0_0_1_2_5 + 0.00107142857142857*G0_0_1_3_0 + 0.00499999999999997*G0_0_1_3_1 - 0.0187499999999999*G0_0_1_3_2 - 0.0342857142857142*G0_0_1_3_3 + 0.00214285714285712*G0_0_1_3_4 - 0.000714285714285721*G0_0_1_3_5 + 0.00178571428571429*G0_0_1_4_0 - 0.00214285714285713*G0_0_1_4_1 - 0.00267857142857144*G0_0_1_4_2 + 0.00214285714285712*G0_0_1_4_3 + 0.0299999999999999*G0_0_1_4_4 + 0.0057142857142857*G0_0_1_4_5 + 0.00357142857142858*G0_0_1_5_0 - 0.00125*G0_0_1_5_1 - 0.000714285714285725*G0_0_1_5_2 - 0.000714285714285721*G0_0_1_5_3 + 0.0057142857142857*G0_0_1_5_4 + 0.00142857142857145*G0_0_1_5_5 + 0.00562500000000006*G0_1_0_0_0 + 0.00642857142857137*G0_1_0_0_1 - 0.00080357142857143*G0_1_0_0_2 + 0.00803571428571422*G0_1_0_0_3 + 0.00160714285714287*G0_1_0_0_4 + 0.0192857142857142*G0_1_0_0_5 + 0.00642857142857137*G0_1_0_1_0 - 0.0843749999999995*G0_1_0_1_1 + 0.00723214285714281*G0_1_0_1_2 - 0.00482142857142849*G0_1_0_1_3 - 0.00160714285714285*G0_1_0_1_4 - 0.0433928571428569*G0_1_0_1_5 - 0.00080357142857143*G0_1_0_2_0 + 0.00723214285714281*G0_1_0_2_1 - 0.00803571428571423*G0_1_0_2_2 - 0.0160714285714285*G0_1_0_2_3 + 0.00160714285714283*G0_1_0_2_5 + 0.00803571428571422*G0_1_0_3_0 - 0.00482142857142849*G0_1_0_3_1 - 0.0160714285714285*G0_1_0_3_2 - 0.115714285714285*G0_1_0_3_3 - 0.0128571428571428*G0_1_0_3_4 - 0.0192857142857142*G0_1_0_3_5 + 0.00160714285714287*G0_1_0_4_0 - 0.00160714285714285*G0_1_0_4_1 - 0.0128571428571428*G0_1_0_4_3 + 0.0128571428571428*G0_1_0_4_4 + 0.0192857142857142*G0_1_0_5_0 - 0.0433928571428569*G0_1_0_5_1 + 0.00160714285714283*G0_1_0_5_2 - 0.0192857142857142*G0_1_0_5_3 - 0.0385714285714283*G0_1_0_5_5 + 0.00803571428571435*G0_1_1_0_0 - 0.000714285714285718*G0_1_1_0_1 + 0.000178571428571422*G0_1_1_0_2 + 0.000535714285714274*G0_1_1_0_3 - 0.00178571428571425*G0_1_1_0_4 + 0.00714285714285714*G0_1_1_0_5 - 0.000714285714285718*G0_1_1_1_0 + 0.00937499999999994*G0_1_1_1_1 + 0.00276785714285713*G0_1_1_1_2 + 0.000535714285714273*G0_1_1_1_3 - 0.00339285714285713*G0_1_1_1_4 - 0.00589285714285712*G0_1_1_1_5 + 0.000178571428571422*G0_1_1_2_0 + 0.00276785714285713*G0_1_1_2_1 - 0.00937499999999998*G0_1_1_2_2 - 0.0110714285714285*G0_1_1_2_3 - 0.00232142857142857*G0_1_1_2_4 - 0.00160714285714286*G0_1_1_2_5 + 0.000535714285714274*G0_1_1_3_0 + 0.000535714285714273*G0_1_1_3_1 - 0.0110714285714285*G0_1_1_3_2 - 0.0728571428571424*G0_1_1_3_3 + 0.00571428571428569*G0_1_1_3_4 + 0.00214285714285714*G0_1_1_3_5 - 0.00178571428571425*G0_1_1_4_0 - 0.00339285714285713*G0_1_1_4_1 - 0.00232142857142857*G0_1_1_4_2 + 0.00571428571428569*G0_1_1_4_3 + 0.0185714285714285*G0_1_1_4_4 + 0.00999999999999997*G0_1_1_4_5 + 0.00714285714285714*G0_1_1_5_0 - 0.00589285714285712*G0_1_1_5_1 - 0.00160714285714286*G0_1_1_5_2 + 0.00214285714285714*G0_1_1_5_3 + 0.00999999999999997*G0_1_1_5_4 + 0.00428571428571433*G0_1_1_5_5; + A[4] = A[40] + 0.000491071428571424*G0_0_1_0_2 - 0.00053571428571429*G0_0_1_0_3 - 0.00357142857142854*G0_0_1_0_4 + 0.00357142857142855*G0_0_1_0_5 + 0.00857142857142854*G0_0_1_1_1 - 0.0009375*G0_0_1_1_2 - 0.0044642857142857*G0_0_1_1_3 - 0.00124999999999999*G0_0_1_1_4 - 0.00464285714285711*G0_0_1_1_5 + 0.000491071428571424*G0_0_1_2_0 - 0.0009375*G0_0_1_2_1 + 0.0254464285714285*G0_0_1_2_2 + 0.00767857142857141*G0_0_1_2_3 + 0.000357142857142862*G0_0_1_2_4 - 0.000892857142857133*G0_0_1_2_5 - 0.000535714285714289*G0_0_1_3_0 - 0.0044642857142857*G0_0_1_3_1 + 0.00767857142857141*G0_0_1_3_2 - 0.0385714285714282*G0_0_1_3_3 + 0.00357142857142855*G0_0_1_3_4 + 0.00285714285714284*G0_0_1_3_5 - 0.00357142857142854*G0_0_1_4_0 - 0.00124999999999999*G0_0_1_4_1 + 0.000357142857142862*G0_0_1_4_2 + 0.00357142857142855*G0_0_1_4_3 - 0.0114285714285714*G0_0_1_4_4 + 0.00428571428571426*G0_0_1_4_5 + 0.00357142857142856*G0_0_1_5_0 - 0.00464285714285711*G0_0_1_5_1 - 0.000892857142857132*G0_0_1_5_2 + 0.00285714285714284*G0_0_1_5_3 + 0.00428571428571426*G0_0_1_5_4 + 0.00285714285714283*G0_0_1_5_5 - 0.000491071428571424*G0_1_0_0_2 + 0.00053571428571429*G0_1_0_0_3 + 0.00357142857142854*G0_1_0_0_4 - 0.00357142857142855*G0_1_0_0_5 - 0.00857142857142854*G0_1_0_1_1 + 0.0009375*G0_1_0_1_2 + 0.0044642857142857*G0_1_0_1_3 + 0.00124999999999999*G0_1_0_1_4 + 0.00464285714285711*G0_1_0_1_5 - 0.000491071428571424*G0_1_0_2_0 + 0.0009375*G0_1_0_2_1 - 0.0254464285714285*G0_1_0_2_2 - 0.00767857142857141*G0_1_0_2_3 - 0.000357142857142861*G0_1_0_2_4 + 0.000892857142857133*G0_1_0_2_5 + 0.000535714285714289*G0_1_0_3_0 + 0.0044642857142857*G0_1_0_3_1 - 0.00767857142857141*G0_1_0_3_2 + 0.0385714285714283*G0_1_0_3_3 - 0.00357142857142855*G0_1_0_3_4 - 0.00285714285714284*G0_1_0_3_5 + 0.00357142857142854*G0_1_0_4_0 + 0.00124999999999999*G0_1_0_4_1 - 0.000357142857142861*G0_1_0_4_2 - 0.00357142857142855*G0_1_0_4_3 + 0.0114285714285714*G0_1_0_4_4 - 0.00428571428571426*G0_1_0_4_5 - 0.00357142857142855*G0_1_0_5_0 + 0.00464285714285711*G0_1_0_5_1 + 0.000892857142857132*G0_1_0_5_2 - 0.00285714285714284*G0_1_0_5_3 - 0.00428571428571426*G0_1_0_5_4 - 0.00285714285714282*G0_1_0_5_5; + A[60] = -A[40] + 0.0937499999999996*G0_1_0_0_0 - 0.00709821428571425*G0_1_0_0_1 - 0.00397321428571427*G0_1_0_0_2 - 0.00232142857142856*G0_1_0_0_3 + 0.00178571428571426*G0_1_0_0_4 + 0.0410714285714284*G0_1_0_0_5 - 0.00709821428571425*G0_1_0_1_0 + 0.0109821428571428*G0_1_0_1_1 - 0.00785714285714282*G0_1_0_1_3 - 0.00874999999999995*G0_1_0_1_4 - 0.0167857142857142*G0_1_0_1_5 - 0.00397321428571427*G0_1_0_2_0 + 0.0241071428571428*G0_1_0_2_2 + 0.00535714285714283*G0_1_0_2_3 + 0.00535714285714284*G0_1_0_2_4 - 0.00410714285714283*G0_1_0_2_5 - 0.00232142857142856*G0_1_0_3_0 - 0.00785714285714282*G0_1_0_3_1 + 0.00535714285714283*G0_1_0_3_2 - 0.0328571428571427*G0_1_0_3_3 + 0.022142857142857*G0_1_0_3_4 + 0.0128571428571428*G0_1_0_3_5 + 0.00178571428571426*G0_1_0_4_0 - 0.00874999999999995*G0_1_0_4_1 + 0.00535714285714284*G0_1_0_4_2 + 0.022142857142857*G0_1_0_4_3 + 0.0314285714285713*G0_1_0_4_4 + 0.0257142857142856*G0_1_0_4_5 + 0.0410714285714284*G0_1_0_5_0 - 0.0167857142857142*G0_1_0_5_1 - 0.00410714285714283*G0_1_0_5_2 + 0.0128571428571428*G0_1_0_5_3 + 0.0257142857142856*G0_1_0_5_4 + 0.0457142857142854*G0_1_0_5_5 + 0.0937499999999996*G0_1_1_0_0 - 0.00709821428571426*G0_1_1_0_1 - 0.00397321428571427*G0_1_1_0_2 - 0.00232142857142856*G0_1_1_0_3 + 0.00178571428571427*G0_1_1_0_4 + 0.0410714285714284*G0_1_1_0_5 - 0.00709821428571426*G0_1_1_1_0 + 0.0109821428571428*G0_1_1_1_1 - 0.00785714285714283*G0_1_1_1_3 - 0.00874999999999995*G0_1_1_1_4 - 0.0167857142857142*G0_1_1_1_5 - 0.00397321428571427*G0_1_1_2_0 + 0.0241071428571428*G0_1_1_2_2 + 0.00535714285714283*G0_1_1_2_3 + 0.00535714285714284*G0_1_1_2_4 - 0.00410714285714284*G0_1_1_2_5 - 0.00232142857142856*G0_1_1_3_0 - 0.00785714285714283*G0_1_1_3_1 + 0.00535714285714283*G0_1_1_3_2 - 0.0328571428571427*G0_1_1_3_3 + 0.022142857142857*G0_1_1_3_4 + 0.0128571428571428*G0_1_1_3_5 + 0.00178571428571427*G0_1_1_4_0 - 0.00874999999999995*G0_1_1_4_1 + 0.00535714285714284*G0_1_1_4_2 + 0.022142857142857*G0_1_1_4_3 + 0.0314285714285713*G0_1_1_4_4 + 0.0257142857142856*G0_1_1_4_5 + 0.0410714285714284*G0_1_1_5_0 - 0.0167857142857142*G0_1_1_5_1 - 0.00410714285714284*G0_1_1_5_2 + 0.0128571428571428*G0_1_1_5_3 + 0.0257142857142856*G0_1_1_5_4 + 0.0457142857142855*G0_1_1_5_5; + A[71] = -A[41] + 0.0326785714285712*G0_0_0_0_0 - 0.00339285714285711*G0_0_0_0_1 - 0.0064285714285714*G0_0_0_0_2 - 0.000357142857142845*G0_0_0_0_3 + 0.0114285714285713*G0_0_0_0_4 + 0.00892857142857138*G0_0_0_0_5 - 0.00339285714285711*G0_0_0_1_0 + 0.077678571428571*G0_0_0_1_1 - 0.00607142857142854*G0_0_0_1_2 + 0.032142857142857*G0_0_0_1_3 - 0.0039285714285714*G0_0_0_1_4 - 0.0064285714285714*G0_0_0_2_0 - 0.00607142857142854*G0_0_0_2_1 + 0.0364285714285714*G0_0_0_2_2 - 0.00821428571428565*G0_0_0_2_3 + 0.0103571428571428*G0_0_0_2_4 - 0.00464285714285712*G0_0_0_2_5 - 0.000357142857142845*G0_0_0_3_0 + 0.032142857142857*G0_0_0_3_1 - 0.00821428571428565*G0_0_0_3_2 + 0.0114285714285713*G0_0_0_3_3 + 0.00857142857142852*G0_0_0_3_4 + 0.00999999999999994*G0_0_0_3_5 + 0.0114285714285713*G0_0_0_4_0 - 0.0039285714285714*G0_0_0_4_1 + 0.0103571428571428*G0_0_0_4_2 + 0.00857142857142852*G0_0_0_4_3 + 0.0742857142857139*G0_0_0_4_4 + 0.0171428571428571*G0_0_0_4_5 + 0.00892857142857139*G0_0_0_5_0 - 0.00464285714285712*G0_0_0_5_2 + 0.00999999999999994*G0_0_0_5_3 + 0.0171428571428571*G0_0_0_5_4 + 0.0114285714285714*G0_0_0_5_5 - 0.00374999999999998*G0_1_0_0_0 + 0.00267857142857141*G0_1_0_0_1 + 0.00428571428571425*G0_1_0_0_3 + 0.00107142857142856*G0_1_0_0_4 + 0.017142857142857*G0_1_0_0_5 + 0.00267857142857141*G0_1_0_1_0 - 0.00267857142857142*G0_1_0_1_2 + 0.032142857142857*G0_1_0_1_3 - 0.032142857142857*G0_1_0_1_5 - 0.00267857142857143*G0_1_0_2_1 + 0.00375000000000003*G0_1_0_2_2 - 0.0171428571428571*G0_1_0_2_3 - 0.00107142857142855*G0_1_0_2_4 - 0.00428571428571428*G0_1_0_2_5 + 0.00428571428571425*G0_1_0_3_0 + 0.032142857142857*G0_1_0_3_1 - 0.0171428571428571*G0_1_0_3_2 - 0.00857142857142851*G0_1_0_3_4 + 0.00107142857142856*G0_1_0_4_0 - 0.00107142857142855*G0_1_0_4_2 - 0.00857142857142851*G0_1_0_4_3 + 0.00857142857142855*G0_1_0_4_5 + 0.017142857142857*G0_1_0_5_0 - 0.032142857142857*G0_1_0_5_1 - 0.00428571428571428*G0_1_0_5_2 + 0.00857142857142855*G0_1_0_5_4; + A[30] = A[4] + 0.000937499999999995*G0_0_0_0_1 - 0.000401785714285714*G0_0_0_0_2 - 0.000535714285714291*G0_0_0_0_3 + 0.00535714285714284*G0_0_0_0_4 - 0.00535714285714284*G0_0_0_0_5 + 0.000937499999999995*G0_0_0_1_0 - 0.0101785714285714*G0_0_0_1_1 - 0.0009375*G0_0_0_1_2 - 0.0160714285714285*G0_0_0_1_3 + 0.00053571428571428*G0_0_0_1_4 - 0.00107142857142857*G0_0_0_1_5 - 0.000401785714285714*G0_0_0_2_0 - 0.0009375*G0_0_0_2_1 + 0.0441964285714285*G0_0_0_2_2 + 0.0192857142857142*G0_0_0_2_3 - 0.00321428571428568*G0_0_0_2_4 - 0.00267857142857141*G0_0_0_2_5 - 0.000535714285714291*G0_0_0_3_0 - 0.0160714285714285*G0_0_0_3_1 + 0.0192857142857142*G0_0_0_3_2 - 0.0385714285714282*G0_0_0_3_3 + 0.00642857142857141*G0_0_0_3_5 + 0.00535714285714284*G0_0_0_4_0 + 0.000535714285714281*G0_0_0_4_1 - 0.00321428571428568*G0_0_0_4_2 - 0.0257142857142856*G0_0_0_4_4 + 0.00428571428571427*G0_0_0_4_5 - 0.00535714285714285*G0_0_0_5_0 - 0.00107142857142857*G0_0_0_5_1 - 0.00267857142857141*G0_0_0_5_2 + 0.00642857142857141*G0_0_0_5_3 + 0.00428571428571427*G0_0_0_5_4 + 0.0171428571428571*G0_0_0_5_5 + 0.00089285714285714*G0_0_1_0_1 - 0.000892857142857136*G0_0_1_0_2 + 0.00892857142857138*G0_0_1_0_4 - 0.0089285714285714*G0_0_1_0_5 + 0.00089285714285714*G0_0_1_1_0 - 0.0187499999999999*G0_0_1_1_1 - 0.0116071428571428*G0_0_1_1_3 + 0.00178571428571427*G0_0_1_1_4 + 0.00357142857142855*G0_0_1_1_5 - 0.000892857142857136*G0_0_1_2_0 + 0.01875*G0_0_1_2_2 + 0.0116071428571428*G0_0_1_2_3 - 0.00357142857142855*G0_0_1_2_4 - 0.00178571428571428*G0_0_1_2_5 - 0.0116071428571428*G0_0_1_3_1 + 0.0116071428571428*G0_0_1_3_2 - 0.00357142857142854*G0_0_1_3_4 + 0.00357142857142857*G0_0_1_3_5 + 0.00892857142857138*G0_0_1_4_0 + 0.00178571428571427*G0_0_1_4_1 - 0.00357142857142855*G0_0_1_4_2 - 0.00357142857142854*G0_0_1_4_3 - 0.0142857142857142*G0_0_1_4_4 - 0.0089285714285714*G0_0_1_5_0 + 0.00357142857142855*G0_0_1_5_1 - 0.00178571428571428*G0_0_1_5_2 + 0.00357142857142857*G0_0_1_5_3 + 0.0142857142857142*G0_0_1_5_5 + 0.000446428571428581*G0_1_0_0_1 - 0.000446428571428559*G0_1_0_0_2 + 0.00178571428571424*G0_1_0_0_4 - 0.00178571428571434*G0_1_0_0_5 + 0.000446428571428581*G0_1_0_1_0 - 0.0356249999999999*G0_1_0_1_1 - 0.0237499999999999*G0_1_0_1_3 + 0.00142857142857142*G0_1_0_1_4 - 0.00142857142857143*G0_1_0_1_5 - 0.000446428571428559*G0_1_0_2_0 + 0.0356249999999999*G0_1_0_2_2 + 0.0237499999999999*G0_1_0_2_3 + 0.00142857142857143*G0_1_0_2_4 - 0.00142857142857141*G0_1_0_2_5 - 0.0237499999999999*G0_1_0_3_1 + 0.0237499999999999*G0_1_0_3_2 - 0.00285714285714283*G0_1_0_3_4 + 0.00285714285714285*G0_1_0_3_5 + 0.00178571428571424*G0_1_0_4_0 + 0.00142857142857142*G0_1_0_4_1 + 0.00142857142857143*G0_1_0_4_2 - 0.00285714285714283*G0_1_0_4_3 - 0.0285714285714284*G0_1_0_4_4 - 0.00178571428571434*G0_1_0_5_0 - 0.00142857142857143*G0_1_0_5_1 - 0.00142857142857141*G0_1_0_5_2 + 0.00285714285714285*G0_1_0_5_3 + 0.0285714285714284*G0_1_0_5_5 + 0.000401785714285721*G0_1_1_0_1 - 0.000937499999999982*G0_1_1_0_2 + 0.000535714285714282*G0_1_1_0_3 + 0.00535714285714278*G0_1_1_0_4 - 0.0053571428571429*G0_1_1_0_5 + 0.000401785714285721*G0_1_1_1_0 - 0.0441964285714283*G0_1_1_1_1 + 0.000937499999999988*G0_1_1_1_2 - 0.0192857142857142*G0_1_1_1_3 + 0.00267857142857141*G0_1_1_1_4 + 0.00321428571428571*G0_1_1_1_5 - 0.000937499999999982*G0_1_1_2_0 + 0.000937499999999989*G0_1_1_2_1 + 0.0101785714285714*G0_1_1_2_2 + 0.0160714285714285*G0_1_1_2_3 + 0.00107142857142857*G0_1_1_2_4 - 0.000535714285714274*G0_1_1_2_5 + 0.000535714285714282*G0_1_1_3_0 - 0.0192857142857142*G0_1_1_3_1 + 0.0160714285714285*G0_1_1_3_2 + 0.0385714285714284*G0_1_1_3_3 - 0.00642857142857138*G0_1_1_3_4 + 0.00535714285714278*G0_1_1_4_0 + 0.00267857142857141*G0_1_1_4_1 + 0.00107142857142857*G0_1_1_4_2 - 0.00642857142857138*G0_1_1_4_3 - 0.0171428571428571*G0_1_1_4_4 - 0.00428571428571428*G0_1_1_4_5 - 0.0053571428571429*G0_1_1_5_0 + 0.00321428571428571*G0_1_1_5_1 - 0.000535714285714275*G0_1_1_5_2 - 0.00428571428571428*G0_1_1_5_4 + 0.0257142857142855*G0_1_1_5_5; + A[80] = -A[30] + 0.0937499999999995*G0_0_0_0_0 - 0.00397321428571426*G0_0_0_0_1 - 0.00709821428571425*G0_0_0_0_2 - 0.00232142857142856*G0_0_0_0_3 + 0.0410714285714284*G0_0_0_0_4 + 0.00178571428571427*G0_0_0_0_5 - 0.00397321428571426*G0_0_0_1_0 + 0.0241071428571428*G0_0_0_1_1 + 0.00535714285714282*G0_0_0_1_3 - 0.00410714285714284*G0_0_0_1_4 + 0.00535714285714283*G0_0_0_1_5 - 0.00709821428571425*G0_0_0_2_0 + 0.0109821428571429*G0_0_0_2_2 - 0.0078571428571428*G0_0_0_2_3 - 0.0167857142857142*G0_0_0_2_4 - 0.00874999999999997*G0_0_0_2_5 - 0.00232142857142856*G0_0_0_3_0 + 0.00535714285714282*G0_0_0_3_1 - 0.0078571428571428*G0_0_0_3_2 - 0.0328571428571426*G0_0_0_3_3 + 0.0128571428571428*G0_0_0_3_4 + 0.0221428571428571*G0_0_0_3_5 + 0.0410714285714284*G0_0_0_4_0 - 0.00410714285714284*G0_0_0_4_1 - 0.0167857142857142*G0_0_0_4_2 + 0.0128571428571428*G0_0_0_4_3 + 0.0457142857142855*G0_0_0_4_4 + 0.0257142857142856*G0_0_0_4_5 + 0.00178571428571427*G0_0_0_5_0 + 0.00535714285714283*G0_0_0_5_1 - 0.00874999999999997*G0_0_0_5_2 + 0.0221428571428571*G0_0_0_5_3 + 0.0257142857142856*G0_0_0_5_4 + 0.0314285714285714*G0_0_0_5_5 + 0.0937499999999995*G0_0_1_0_0 - 0.00397321428571426*G0_0_1_0_1 - 0.00709821428571425*G0_0_1_0_2 - 0.00232142857142856*G0_0_1_0_3 + 0.0410714285714284*G0_0_1_0_4 + 0.00178571428571426*G0_0_1_0_5 - 0.00397321428571426*G0_0_1_1_0 + 0.0241071428571427*G0_0_1_1_1 + 0.00535714285714281*G0_0_1_1_3 - 0.00410714285714284*G0_0_1_1_4 + 0.00535714285714282*G0_0_1_1_5 - 0.00709821428571425*G0_0_1_2_0 + 0.0109821428571429*G0_0_1_2_2 - 0.00785714285714281*G0_0_1_2_3 - 0.0167857142857142*G0_0_1_2_4 - 0.00874999999999997*G0_0_1_2_5 - 0.00232142857142856*G0_0_1_3_0 + 0.00535714285714281*G0_0_1_3_1 - 0.00785714285714281*G0_0_1_3_2 - 0.0328571428571426*G0_0_1_3_3 + 0.0128571428571428*G0_0_1_3_4 + 0.0221428571428571*G0_0_1_3_5 + 0.0410714285714284*G0_0_1_4_0 - 0.00410714285714284*G0_0_1_4_1 - 0.0167857142857142*G0_0_1_4_2 + 0.0128571428571428*G0_0_1_4_3 + 0.0457142857142855*G0_0_1_4_4 + 0.0257142857142856*G0_0_1_4_5 + 0.00178571428571427*G0_0_1_5_0 + 0.00535714285714282*G0_0_1_5_1 - 0.00874999999999997*G0_0_1_5_2 + 0.0221428571428571*G0_0_1_5_3 + 0.0257142857142856*G0_0_1_5_4 + 0.0314285714285713*G0_0_1_5_5; + A[6] = -A[4] + 0.0937499999999996*G0_0_1_0_0 - 0.00709821428571425*G0_0_1_0_1 - 0.00397321428571427*G0_0_1_0_2 - 0.00232142857142856*G0_0_1_0_3 + 0.00178571428571426*G0_0_1_0_4 + 0.0410714285714284*G0_0_1_0_5 - 0.00709821428571425*G0_0_1_1_0 + 0.0109821428571428*G0_0_1_1_1 - 0.00785714285714282*G0_0_1_1_3 - 0.00874999999999995*G0_0_1_1_4 - 0.0167857142857142*G0_0_1_1_5 - 0.00397321428571427*G0_0_1_2_0 + 0.0241071428571428*G0_0_1_2_2 + 0.00535714285714284*G0_0_1_2_3 + 0.00535714285714284*G0_0_1_2_4 - 0.00410714285714283*G0_0_1_2_5 - 0.00232142857142856*G0_0_1_3_0 - 0.00785714285714283*G0_0_1_3_1 + 0.00535714285714284*G0_0_1_3_2 - 0.0328571428571427*G0_0_1_3_3 + 0.022142857142857*G0_0_1_3_4 + 0.0128571428571428*G0_0_1_3_5 + 0.00178571428571427*G0_0_1_4_0 - 0.00874999999999995*G0_0_1_4_1 + 0.00535714285714284*G0_0_1_4_2 + 0.022142857142857*G0_0_1_4_3 + 0.0314285714285713*G0_0_1_4_4 + 0.0257142857142856*G0_0_1_4_5 + 0.0410714285714284*G0_0_1_5_0 - 0.0167857142857142*G0_0_1_5_1 - 0.00410714285714283*G0_0_1_5_2 + 0.0128571428571428*G0_0_1_5_3 + 0.0257142857142856*G0_0_1_5_4 + 0.0457142857142854*G0_0_1_5_5 + 0.0937499999999996*G0_1_1_0_0 - 0.00709821428571426*G0_1_1_0_1 - 0.00397321428571427*G0_1_1_0_2 - 0.00232142857142856*G0_1_1_0_3 + 0.00178571428571427*G0_1_1_0_4 + 0.0410714285714284*G0_1_1_0_5 - 0.00709821428571426*G0_1_1_1_0 + 0.0109821428571428*G0_1_1_1_1 - 0.00785714285714283*G0_1_1_1_3 - 0.00874999999999995*G0_1_1_1_4 - 0.0167857142857142*G0_1_1_1_5 - 0.00397321428571427*G0_1_1_2_0 + 0.0241071428571428*G0_1_1_2_2 + 0.00535714285714283*G0_1_1_2_3 + 0.00535714285714284*G0_1_1_2_4 - 0.00410714285714284*G0_1_1_2_5 - 0.00232142857142856*G0_1_1_3_0 - 0.00785714285714283*G0_1_1_3_1 + 0.00535714285714283*G0_1_1_3_2 - 0.0328571428571426*G0_1_1_3_3 + 0.022142857142857*G0_1_1_3_4 + 0.0128571428571428*G0_1_1_3_5 + 0.00178571428571427*G0_1_1_4_0 - 0.00874999999999995*G0_1_1_4_1 + 0.00535714285714284*G0_1_1_4_2 + 0.022142857142857*G0_1_1_4_3 + 0.0314285714285713*G0_1_1_4_4 + 0.0257142857142856*G0_1_1_4_5 + 0.0410714285714284*G0_1_1_5_0 - 0.0167857142857142*G0_1_1_5_1 - 0.00410714285714284*G0_1_1_5_2 + 0.0128571428571428*G0_1_1_5_3 + 0.0257142857142856*G0_1_1_5_4 + 0.0457142857142855*G0_1_1_5_5; + A[3] = A[30] - 0.000491071428571413*G0_0_1_0_1 + 0.000535714285714288*G0_0_1_0_3 - 0.0035714285714286*G0_0_1_0_4 + 0.00357142857142851*G0_0_1_0_5 - 0.000491071428571413*G0_0_1_1_0 - 0.0254464285714285*G0_0_1_1_1 + 0.0009375*G0_0_1_1_2 - 0.0076785714285714*G0_0_1_1_3 + 0.000892857142857137*G0_0_1_1_4 - 0.000357142857142866*G0_0_1_1_5 + 0.000937500000000001*G0_0_1_2_1 - 0.00857142857142858*G0_0_1_2_2 + 0.00446428571428569*G0_0_1_2_3 + 0.00464285714285712*G0_0_1_2_4 + 0.00125*G0_0_1_2_5 + 0.000535714285714287*G0_0_1_3_0 - 0.0076785714285714*G0_0_1_3_1 + 0.00446428571428569*G0_0_1_3_2 + 0.0385714285714283*G0_0_1_3_3 - 0.00285714285714284*G0_0_1_3_4 - 0.00357142857142856*G0_0_1_3_5 - 0.0035714285714286*G0_0_1_4_0 + 0.000892857142857137*G0_0_1_4_1 + 0.00464285714285712*G0_0_1_4_2 - 0.00285714285714284*G0_0_1_4_3 - 0.00285714285714283*G0_0_1_4_4 - 0.00428571428571428*G0_0_1_4_5 + 0.00357142857142851*G0_0_1_5_0 - 0.000357142857142865*G0_0_1_5_1 + 0.00125*G0_0_1_5_2 - 0.00357142857142856*G0_0_1_5_3 - 0.00428571428571428*G0_0_1_5_4 + 0.0114285714285713*G0_0_1_5_5 + 0.000491071428571413*G0_1_0_0_1 - 0.000535714285714287*G0_1_0_0_3 + 0.0035714285714286*G0_1_0_0_4 - 0.00357142857142851*G0_1_0_0_5 + 0.000491071428571413*G0_1_0_1_0 + 0.0254464285714285*G0_1_0_1_1 - 0.000937500000000001*G0_1_0_1_2 + 0.0076785714285714*G0_1_0_1_3 - 0.000892857142857138*G0_1_0_1_4 + 0.000357142857142866*G0_1_0_1_5 - 0.000937500000000002*G0_1_0_2_1 + 0.00857142857142858*G0_1_0_2_2 - 0.00446428571428569*G0_1_0_2_3 - 0.00464285714285712*G0_1_0_2_4 - 0.00125*G0_1_0_2_5 - 0.000535714285714287*G0_1_0_3_0 + 0.0076785714285714*G0_1_0_3_1 - 0.00446428571428569*G0_1_0_3_2 - 0.0385714285714283*G0_1_0_3_3 + 0.00285714285714284*G0_1_0_3_4 + 0.00357142857142856*G0_1_0_3_5 + 0.0035714285714286*G0_1_0_4_0 - 0.000892857142857137*G0_1_0_4_1 - 0.00464285714285712*G0_1_0_4_2 + 0.00285714285714284*G0_1_0_4_3 + 0.00285714285714283*G0_1_0_4_4 + 0.00428571428571428*G0_1_0_4_5 - 0.00357142857142851*G0_1_0_5_0 + 0.000357142857142864*G0_1_0_5_1 - 0.00125*G0_1_0_5_2 + 0.00357142857142856*G0_1_0_5_3 + 0.00428571428571428*G0_1_0_5_4 - 0.0114285714285713*G0_1_0_5_5; + A[8] = -A[3] + 0.0937499999999995*G0_0_0_0_0 - 0.00397321428571426*G0_0_0_0_1 - 0.00709821428571425*G0_0_0_0_2 - 0.00232142857142856*G0_0_0_0_3 + 0.0410714285714284*G0_0_0_0_4 + 0.00178571428571426*G0_0_0_0_5 - 0.00397321428571426*G0_0_0_1_0 + 0.0241071428571428*G0_0_0_1_1 + 0.00535714285714282*G0_0_0_1_3 - 0.00410714285714284*G0_0_0_1_4 + 0.00535714285714284*G0_0_0_1_5 - 0.00709821428571425*G0_0_0_2_0 + 0.0109821428571429*G0_0_0_2_2 - 0.0078571428571428*G0_0_0_2_3 - 0.0167857142857142*G0_0_0_2_4 - 0.00874999999999997*G0_0_0_2_5 - 0.00232142857142856*G0_0_0_3_0 + 0.00535714285714282*G0_0_0_3_1 - 0.0078571428571428*G0_0_0_3_2 - 0.0328571428571426*G0_0_0_3_3 + 0.0128571428571428*G0_0_0_3_4 + 0.0221428571428571*G0_0_0_3_5 + 0.0410714285714284*G0_0_0_4_0 - 0.00410714285714284*G0_0_0_4_1 - 0.0167857142857142*G0_0_0_4_2 + 0.0128571428571428*G0_0_0_4_3 + 0.0457142857142855*G0_0_0_4_4 + 0.0257142857142856*G0_0_0_4_5 + 0.00178571428571427*G0_0_0_5_0 + 0.00535714285714283*G0_0_0_5_1 - 0.00874999999999997*G0_0_0_5_2 + 0.0221428571428571*G0_0_0_5_3 + 0.0257142857142856*G0_0_0_5_4 + 0.0314285714285714*G0_0_0_5_5 + 0.0937499999999995*G0_1_0_0_0 - 0.00397321428571426*G0_1_0_0_1 - 0.00709821428571425*G0_1_0_0_2 - 0.00232142857142856*G0_1_0_0_3 + 0.0410714285714284*G0_1_0_0_4 + 0.00178571428571426*G0_1_0_0_5 - 0.00397321428571426*G0_1_0_1_0 + 0.0241071428571427*G0_1_0_1_1 + 0.00535714285714281*G0_1_0_1_3 - 0.00410714285714284*G0_1_0_1_4 + 0.00535714285714282*G0_1_0_1_5 - 0.00709821428571425*G0_1_0_2_0 + 0.0109821428571429*G0_1_0_2_2 - 0.00785714285714281*G0_1_0_2_3 - 0.0167857142857142*G0_1_0_2_4 - 0.00874999999999997*G0_1_0_2_5 - 0.00232142857142856*G0_1_0_3_0 + 0.00535714285714281*G0_1_0_3_1 - 0.00785714285714281*G0_1_0_3_2 - 0.0328571428571426*G0_1_0_3_3 + 0.0128571428571428*G0_1_0_3_4 + 0.0221428571428571*G0_1_0_3_5 + 0.0410714285714284*G0_1_0_4_0 - 0.00410714285714284*G0_1_0_4_1 - 0.0167857142857142*G0_1_0_4_2 + 0.0128571428571428*G0_1_0_4_3 + 0.0457142857142855*G0_1_0_4_4 + 0.0257142857142856*G0_1_0_4_5 + 0.00178571428571426*G0_1_0_5_0 + 0.00535714285714283*G0_1_0_5_1 - 0.00874999999999997*G0_1_0_5_2 + 0.0221428571428571*G0_1_0_5_3 + 0.0257142857142856*G0_1_0_5_4 + 0.0314285714285713*G0_1_0_5_5; + A[12] = 0.00247023809523808*G0_0_1_0_0 - 0.00157242063492062*G0_0_1_0_1 - 0.00157242063492063*G0_0_1_0_2 - 0.000932539682539674*G0_0_1_0_3 - 0.0032142857142857*G0_0_1_0_4 - 0.00321428571428569*G0_0_1_0_5 - 0.00157242063492062*G0_0_1_1_0 + 0.019345238095238*G0_0_1_1_1 - 0.00112599206349206*G0_0_1_1_2 + 0.00178571428571426*G0_0_1_1_3 - 0.000575396825396823*G0_0_1_1_4 + 0.00892857142857136*G0_0_1_1_5 - 0.00157242063492063*G0_0_1_2_0 - 0.00112599206349206*G0_0_1_2_1 + 0.0193452380952381*G0_0_1_2_2 + 0.00178571428571429*G0_0_1_2_3 + 0.0089285714285714*G0_0_1_2_4 - 0.000575396825396816*G0_0_1_2_5 - 0.000932539682539674*G0_0_1_3_0 + 0.00178571428571426*G0_0_1_3_1 + 0.00178571428571429*G0_0_1_3_2 - 0.00539682539682539*G0_0_1_3_3 + 0.003015873015873*G0_0_1_3_4 + 0.00301587301587299*G0_0_1_3_5 - 0.0032142857142857*G0_0_1_4_0 - 0.000575396825396823*G0_0_1_4_1 + 0.0089285714285714*G0_0_1_4_2 + 0.003015873015873*G0_0_1_4_3 + 0.00888888888888886*G0_0_1_4_4 + 0.00230158730158729*G0_0_1_4_5 - 0.00321428571428569*G0_0_1_5_0 + 0.00892857142857136*G0_0_1_5_1 - 0.000575396825396816*G0_0_1_5_2 + 0.00301587301587299*G0_0_1_5_3 + 0.00230158730158729*G0_0_1_5_4 + 0.00888888888888882*G0_0_1_5_5; + A[2] = -A[12] - 0.0168749999999999*G0_0_1_0_0 - 0.000446428571428575*G0_0_1_0_2 - 0.000357142857142852*G0_0_1_0_3 - 0.00499999999999996*G0_0_1_0_4 - 0.0121428571428571*G0_0_1_0_5 + 0.0168749999999999*G0_0_1_1_1 + 0.000446428571428572*G0_0_1_1_2 + 0.00499999999999996*G0_0_1_1_3 + 0.000357142857142852*G0_0_1_1_4 + 0.012142857142857*G0_0_1_1_5 - 0.000446428571428574*G0_0_1_2_0 + 0.000446428571428572*G0_0_1_2_1 - 0.00714285714285709*G0_0_1_2_3 + 0.00714285714285711*G0_0_1_2_4 - 0.000357142857142853*G0_0_1_3_0 + 0.00499999999999996*G0_0_1_3_1 - 0.00714285714285709*G0_0_1_3_2 - 0.0142857142857142*G0_0_1_3_3 + 0.000714285714285692*G0_0_1_3_5 - 0.00499999999999996*G0_0_1_4_0 + 0.000357142857142852*G0_0_1_4_1 + 0.00714285714285711*G0_0_1_4_2 + 0.0142857142857142*G0_0_1_4_4 - 0.000714285714285702*G0_0_1_4_5 - 0.0121428571428571*G0_0_1_5_0 + 0.0121428571428571*G0_0_1_5_1 + 0.000714285714285691*G0_0_1_5_3 - 0.000714285714285702*G0_0_1_5_4 - 0.019345238095238*G0_1_1_0_0 + 0.00157242063492062*G0_1_1_0_1 + 0.00112599206349206*G0_1_1_0_2 + 0.000575396825396824*G0_1_1_0_3 - 0.00178571428571426*G0_1_1_0_4 - 0.00892857142857137*G0_1_1_0_5 + 0.00157242063492062*G0_1_1_1_0 - 0.00247023809523808*G0_1_1_1_1 + 0.00157242063492063*G0_1_1_1_2 + 0.0032142857142857*G0_1_1_1_3 + 0.000932539682539677*G0_1_1_1_4 + 0.00321428571428569*G0_1_1_1_5 + 0.00112599206349206*G0_1_1_2_0 + 0.00157242063492063*G0_1_1_2_1 - 0.0193452380952381*G0_1_1_2_2 - 0.0089285714285714*G0_1_1_2_3 - 0.00178571428571429*G0_1_1_2_4 + 0.000575396825396817*G0_1_1_2_5 + 0.000575396825396824*G0_1_1_3_0 + 0.0032142857142857*G0_1_1_3_1 - 0.0089285714285714*G0_1_1_3_2 - 0.00888888888888887*G0_1_1_3_3 - 0.00301587301587301*G0_1_1_3_4 - 0.0023015873015873*G0_1_1_3_5 - 0.00178571428571426*G0_1_1_4_0 + 0.000932539682539677*G0_1_1_4_1 - 0.00178571428571429*G0_1_1_4_2 - 0.00301587301587301*G0_1_1_4_3 + 0.00539682539682537*G0_1_1_4_4 - 0.003015873015873*G0_1_1_4_5 - 0.00892857142857137*G0_1_1_5_0 + 0.00321428571428569*G0_1_1_5_1 + 0.000575396825396817*G0_1_1_5_2 - 0.0023015873015873*G0_1_1_5_3 - 0.003015873015873*G0_1_1_5_4 - 0.00888888888888885*G0_1_1_5_5; + A[29] = A[92] - 0.00374999999999998*G0_0_1_0_0 + 0.00267857142857141*G0_0_1_0_2 + 0.00428571428571427*G0_0_1_0_3 + 0.0171428571428571*G0_0_1_0_4 + 0.00107142857142858*G0_0_1_0_5 + 0.00374999999999993*G0_0_1_1_1 - 0.0026785714285714*G0_0_1_1_2 - 0.0171428571428571*G0_0_1_1_3 - 0.00428571428571428*G0_0_1_1_4 - 0.0010714285714286*G0_0_1_1_5 + 0.00267857142857141*G0_0_1_2_0 - 0.0026785714285714*G0_0_1_2_1 + 0.0321428571428569*G0_0_1_2_3 - 0.032142857142857*G0_0_1_2_4 + 0.00428571428571427*G0_0_1_3_0 - 0.0171428571428571*G0_0_1_3_1 + 0.0321428571428569*G0_0_1_3_2 - 0.00857142857142854*G0_0_1_3_5 + 0.0171428571428571*G0_0_1_4_0 - 0.00428571428571428*G0_0_1_4_1 - 0.032142857142857*G0_0_1_4_2 + 0.00857142857142854*G0_0_1_4_5 + 0.00107142857142858*G0_0_1_5_0 - 0.0010714285714286*G0_0_1_5_1 - 0.00857142857142854*G0_0_1_5_3 + 0.00857142857142854*G0_0_1_5_4 + 0.00374999999999998*G0_1_0_0_0 - 0.00267857142857141*G0_1_0_0_2 - 0.00428571428571427*G0_1_0_0_3 - 0.0171428571428571*G0_1_0_0_4 - 0.00107142857142858*G0_1_0_0_5 - 0.00374999999999993*G0_1_0_1_1 + 0.0026785714285714*G0_1_0_1_2 + 0.0171428571428571*G0_1_0_1_3 + 0.00428571428571428*G0_1_0_1_4 + 0.0010714285714286*G0_1_0_1_5 - 0.00267857142857141*G0_1_0_2_0 + 0.0026785714285714*G0_1_0_2_1 - 0.0321428571428569*G0_1_0_2_3 + 0.032142857142857*G0_1_0_2_4 - 0.00428571428571427*G0_1_0_3_0 + 0.0171428571428571*G0_1_0_3_1 - 0.0321428571428569*G0_1_0_3_2 + 0.00857142857142854*G0_1_0_3_5 - 0.0171428571428571*G0_1_0_4_0 + 0.00428571428571428*G0_1_0_4_1 + 0.032142857142857*G0_1_0_4_2 - 0.00857142857142854*G0_1_0_4_5 - 0.00107142857142858*G0_1_0_5_0 + 0.0010714285714286*G0_1_0_5_1 + 0.00857142857142854*G0_1_0_5_3 - 0.00857142857142854*G0_1_0_5_4; + A[69] = -A[29] + 0.00160714285714287*G0_0_0_0_0 + 0.00803571428571425*G0_0_0_0_2 - 0.00642857142857138*G0_0_0_0_3 + 0.0385714285714284*G0_0_0_0_4 + 0.00642857142857141*G0_0_0_0_5 - 0.00160714285714285*G0_0_0_1_1 - 0.00803571428571423*G0_0_0_1_2 - 0.0385714285714283*G0_0_0_1_3 + 0.0064285714285714*G0_0_0_1_4 - 0.00642857142857141*G0_0_0_1_5 + 0.00803571428571425*G0_0_0_2_0 - 0.00803571428571423*G0_0_0_2_1 + 0.0642857142857138*G0_0_0_2_3 - 0.0642857142857139*G0_0_0_2_4 - 0.00642857142857138*G0_0_0_3_0 - 0.0385714285714283*G0_0_0_3_1 + 0.0642857142857138*G0_0_0_3_2 + 0.257142857142856*G0_0_0_3_3 + 0.0128571428571429*G0_0_0_3_5 + 0.0385714285714284*G0_0_0_4_0 + 0.0064285714285714*G0_0_0_4_1 - 0.064285714285714*G0_0_0_4_2 - 0.257142857142856*G0_0_0_4_4 - 0.0128571428571428*G0_0_0_4_5 + 0.00642857142857141*G0_0_0_5_0 - 0.00642857142857141*G0_0_0_5_1 + 0.0128571428571429*G0_0_0_5_3 - 0.0128571428571428*G0_0_0_5_4 + 0.00964285714285714*G0_0_1_0_0 + 0.0040178571428571*G0_0_1_0_1 - 0.0136607142857142*G0_0_1_0_2 - 0.0289285714285713*G0_0_1_0_3 - 0.0160714285714285*G0_0_1_0_4 - 0.00321428571428568*G0_0_1_0_5 + 0.00401785714285711*G0_0_1_1_0 + 0.00803571428571428*G0_0_1_1_1 - 0.0216964285714285*G0_0_1_1_2 - 0.0546428571428569*G0_0_1_1_3 - 0.0224999999999999*G0_0_1_1_4 - 0.00964285714285711*G0_0_1_1_5 - 0.0136607142857142*G0_0_1_2_0 - 0.0216964285714285*G0_0_1_2_1 + 0.1125*G0_0_1_2_2 + 0.112499999999999*G0_0_1_2_3 + 0.0482142857142855*G0_0_1_2_4 + 0.00321428571428572*G0_0_1_2_5 - 0.0289285714285713*G0_0_1_3_0 - 0.0546428571428569*G0_0_1_3_1 + 0.112499999999999*G0_0_1_3_2 + 0.347142857142856*G0_0_1_3_3 + 0.102857142857143*G0_0_1_3_4 + 0.0514285714285714*G0_0_1_3_5 - 0.0160714285714285*G0_0_1_4_0 - 0.0224999999999999*G0_0_1_4_1 + 0.0482142857142856*G0_0_1_4_2 + 0.102857142857143*G0_0_1_4_3 + 0.0899999999999997*G0_0_1_4_4 + 0.0385714285714285*G0_0_1_4_5 - 0.00321428571428568*G0_0_1_5_0 - 0.00964285714285711*G0_0_1_5_1 + 0.00321428571428572*G0_0_1_5_2 + 0.0514285714285714*G0_0_1_5_3 + 0.0385714285714285*G0_0_1_5_4 + 0.0642857142857143*G0_0_1_5_5 - 0.00267857142857144*G0_1_0_0_0 + 0.00321428571428568*G0_1_0_0_1 - 0.00910714285714281*G0_1_0_0_2 - 0.00749999999999992*G0_1_0_0_3 - 0.00107142857142848*G0_1_0_0_4 - 0.00428571428571424*G0_1_0_0_5 + 0.00321428571428568*G0_1_0_1_0 - 0.000535714285714259*G0_1_0_1_1 - 0.00374999999999996*G0_1_0_1_2 - 0.024642857142857*G0_1_0_1_3 - 0.0374999999999998*G0_1_0_1_4 - 0.0117857142857142*G0_1_0_1_5 - 0.00910714285714281*G0_1_0_2_0 - 0.00374999999999996*G0_1_0_2_1 + 0.0321428571428569*G0_1_0_2_2 + 0.0321428571428569*G0_1_0_2_3 - 0.0032142857142857*G0_1_0_2_5 - 0.00749999999999991*G0_1_0_3_0 - 0.024642857142857*G0_1_0_3_1 + 0.0321428571428569*G0_1_0_3_2 + 0.167142857142856*G0_1_0_3_3 + 0.0899999999999996*G0_1_0_3_4 + 0.0214285714285713*G0_1_0_3_5 - 0.00107142857142849*G0_1_0_4_0 - 0.0374999999999998*G0_1_0_4_1 + 0.0899999999999996*G0_1_0_4_3 + 0.55285714285714*G0_1_0_4_4 + 0.0814285714285712*G0_1_0_4_5 - 0.00428571428571424*G0_1_0_5_0 - 0.0117857142857142*G0_1_0_5_1 - 0.0032142857142857*G0_1_0_5_2 + 0.0214285714285713*G0_1_0_5_3 + 0.0814285714285712*G0_1_0_5_4 + 0.0128571428571429*G0_1_0_5_5 - 0.0348214285714285*G0_1_1_0_0 + 0.00696428571428568*G0_1_1_0_1 - 0.00428571428571423*G0_1_1_0_3 - 0.00107142857142856*G0_1_1_0_4 - 0.0364285714285713*G0_1_1_0_5 + 0.00696428571428568*G0_1_1_1_0 - 0.00696428571428567*G0_1_1_1_2 - 0.0128571428571428*G0_1_1_1_3 + 0.0128571428571428*G0_1_1_1_5 - 0.00696428571428567*G0_1_1_2_1 + 0.0348214285714284*G0_1_1_2_2 + 0.0364285714285712*G0_1_1_2_3 + 0.00107142857142857*G0_1_1_2_4 + 0.00428571428571426*G0_1_1_2_5 - 0.00428571428571423*G0_1_1_3_0 - 0.0128571428571428*G0_1_1_3_1 + 0.0364285714285712*G0_1_1_3_2 + 0.154285714285713*G0_1_1_3_3 + 0.00857142857142849*G0_1_1_3_4 - 0.00107142857142856*G0_1_1_4_0 + 0.00107142857142857*G0_1_1_4_2 + 0.0085714285714285*G0_1_1_4_3 - 0.00857142857142851*G0_1_1_4_5 - 0.0364285714285713*G0_1_1_5_0 + 0.0128571428571428*G0_1_1_5_1 + 0.00428571428571427*G0_1_1_5_2 - 0.00857142857142851*G0_1_1_5_4 - 0.154285714285713*G0_1_1_5_5; + A[28] = -A[29] - 0.00482142857142852*G0_1_0_0_0 + 0.000937499999999983*G0_1_0_0_1 - 0.00272321428571426*G0_1_0_0_2 - 0.00303571428571428*G0_1_0_0_3 - 0.0124999999999999*G0_1_0_0_4 + 0.00339285714285711*G0_1_0_0_5 + 0.000937499999999983*G0_1_0_1_0 - 0.0291964285714283*G0_1_0_1_1 + 0.00218749999999998*G0_1_0_1_2 + 0.0167857142857142*G0_1_0_1_3 + 0.00517857142857142*G0_1_0_1_4 - 0.00660714285714274*G0_1_0_1_5 - 0.00272321428571426*G0_1_0_2_0 + 0.00218749999999998*G0_1_0_2_1 - 0.0285714285714284*G0_1_0_2_3 + 0.0285714285714284*G0_1_0_2_4 + 0.000535714285714282*G0_1_0_2_5 - 0.00303571428571428*G0_1_0_3_0 + 0.0167857142857142*G0_1_0_3_1 - 0.0285714285714284*G0_1_0_3_2 + 0.0114285714285715*G0_1_0_3_3 - 0.00428571428571428*G0_1_0_3_4 + 0.00499999999999998*G0_1_0_3_5 - 0.0124999999999999*G0_1_0_4_0 + 0.00517857142857142*G0_1_0_4_1 + 0.0285714285714284*G0_1_0_4_2 - 0.00428571428571428*G0_1_0_4_3 - 0.00285714285714294*G0_1_0_4_4 - 0.0114285714285714*G0_1_0_4_5 + 0.00339285714285711*G0_1_0_5_0 - 0.00660714285714274*G0_1_0_5_1 + 0.000535714285714282*G0_1_0_5_2 + 0.00499999999999998*G0_1_0_5_3 - 0.0114285714285714*G0_1_0_5_4 + 0.0385714285714283*G0_1_0_5_5 + 0.0125892857142857*G0_1_1_0_0 - 0.00299107142857142*G0_1_1_0_1 + 0.00486607142857141*G0_1_1_0_2 + 0.00410714285714284*G0_1_1_0_4 + 0.0135714285714285*G0_1_1_0_5 - 0.00299107142857142*G0_1_1_1_0 - 0.0267857142857141*G0_1_1_1_1 + 0.00799107142857138*G0_1_1_1_2 + 0.0198214285714285*G0_1_1_1_3 + 0.0057142857142857*G0_1_1_1_4 - 0.00910714285714273*G0_1_1_1_5 + 0.00486607142857141*G0_1_1_2_0 + 0.00799107142857138*G0_1_1_2_1 - 0.0455357142857143*G0_1_1_2_2 - 0.0517857142857141*G0_1_1_2_3 - 0.0178571428571428*G0_1_1_2_4 - 0.00749999999999998*G0_1_1_2_5 + 0.0198214285714285*G0_1_1_3_1 - 0.051785714285714*G0_1_1_3_2 + 0.00428571428571432*G0_1_1_3_3 - 0.0114285714285714*G0_1_1_3_4 + 0.0149999999999999*G0_1_1_3_5 + 0.00410714285714284*G0_1_1_4_0 + 0.0057142857142857*G0_1_1_4_1 - 0.0178571428571428*G0_1_1_4_2 - 0.0114285714285714*G0_1_1_4_3 - 0.0242857142857143*G0_1_1_4_4 + 0.00357142857142851*G0_1_1_4_5 + 0.0135714285714285*G0_1_1_5_0 - 0.00910714285714273*G0_1_1_5_1 - 0.00749999999999998*G0_1_1_5_2 + 0.0149999999999999*G0_1_1_5_3 + 0.00357142857142851*G0_1_1_5_4 + 0.0942857142857137*G0_1_1_5_5; + A[26] = -A[28] - 0.0117857142857142*G0_1_0_0_0 - 0.00183035714285714*G0_1_0_0_1 + 0.0209374999999999*G0_1_0_0_2 + 0.0119642857142856*G0_1_0_0_3 + 0.0224999999999999*G0_1_0_0_4 + 0.00642857142857141*G0_1_0_0_5 - 0.00183035714285714*G0_1_0_1_0 - 0.0286607142857141*G0_1_0_1_1 + 0.0204910714285713*G0_1_0_1_2 + 0.0175*G0_1_0_1_3 + 0.0116071428571428*G0_1_0_1_4 - 0.00571428571428563*G0_1_0_1_5 + 0.0209374999999999*G0_1_0_2_0 + 0.0204910714285713*G0_1_0_2_1 - 0.243749999999999*G0_1_0_2_2 - 0.0874999999999996*G0_1_0_2_3 - 0.0946428571428567*G0_1_0_2_4 - 0.00660714285714289*G0_1_0_2_5 + 0.0119642857142856*G0_1_0_3_0 + 0.0174999999999999*G0_1_0_3_1 - 0.0874999999999996*G0_1_0_3_2 - 0.0742857142857139*G0_1_0_3_3 - 0.0471428571428569*G0_1_0_3_4 - 0.0107142857142857*G0_1_0_3_5 + 0.0224999999999999*G0_1_0_4_0 + 0.0116071428571428*G0_1_0_4_1 - 0.0946428571428567*G0_1_0_4_2 - 0.0471428571428569*G0_1_0_4_3 - 0.0885714285714282*G0_1_0_4_4 - 0.01*G0_1_0_4_5 + 0.00642857142857141*G0_1_0_5_0 - 0.00571428571428563*G0_1_0_5_1 - 0.00660714285714289*G0_1_0_5_2 - 0.0107142857142857*G0_1_0_5_3 - 0.01*G0_1_0_5_4 + 0.0399999999999998*G0_1_0_5_5 - 0.0198214285714285*G0_1_1_0_0 + 0.00486607142857139*G0_1_1_0_1 + 0.0126339285714285*G0_1_1_0_2 + 0.00553571428571424*G0_1_1_0_3 - 0.00321428571428571*G0_1_1_0_5 + 0.00486607142857139*G0_1_1_1_0 - 0.0404464285714283*G0_1_1_1_1 + 0.0148660714285713*G0_1_1_1_2 + 0.0121428571428571*G0_1_1_1_3 + 0.00946428571428568*G0_1_1_1_4 - 0.0142857142857142*G0_1_1_1_5 + 0.0126339285714285*G0_1_1_2_0 + 0.0148660714285713*G0_1_1_2_1 - 0.190178571428571*G0_1_1_2_2 - 0.0660714285714283*G0_1_1_2_3 - 0.0410714285714284*G0_1_1_2_4 + 0.00196428571428565*G0_1_1_2_5 + 0.00553571428571424*G0_1_1_3_0 + 0.0121428571428571*G0_1_1_3_1 - 0.0660714285714283*G0_1_1_3_2 - 0.0485714285714283*G0_1_1_3_3 - 0.0299999999999999*G0_1_1_3_4 - 0.0149999999999999*G0_1_1_3_5 + 0.00946428571428568*G0_1_1_4_1 - 0.0410714285714284*G0_1_1_4_2 - 0.0299999999999999*G0_1_1_4_3 - 0.0628571428571426*G0_1_1_4_4 - 0.0228571428571428*G0_1_1_4_5 - 0.00321428571428571*G0_1_1_5_0 - 0.0142857142857142*G0_1_1_5_1 + 0.00196428571428565*G0_1_1_5_2 - 0.0149999999999999*G0_1_1_5_3 - 0.0228571428571428*G0_1_1_5_4 - 0.088571428571428*G0_1_1_5_5; + A[27] = A[28] + 0.0340178571428569*G0_1_0_0_0 - 0.00187499999999997*G0_1_0_0_1 + 0.000535714285714278*G0_1_0_0_2 - 0.00214285714285713*G0_1_0_0_3 - 0.0042857142857143*G0_1_0_0_4 + 0.00321428571428567*G0_1_0_0_5 - 0.00187499999999997*G0_1_0_1_0 + 0.0340178571428569*G0_1_0_1_1 + 0.000535714285714283*G0_1_0_1_2 - 0.00428571428571431*G0_1_0_1_3 - 0.00214285714285714*G0_1_0_1_4 + 0.00321428571428565*G0_1_0_1_5 + 0.000535714285714277*G0_1_0_2_0 + 0.000535714285714283*G0_1_0_2_1 - 0.00107142857142858*G0_1_0_2_5 - 0.00214285714285713*G0_1_0_3_0 - 0.00428571428571431*G0_1_0_3_1 - 0.00857142857142852*G0_1_0_3_3 + 0.00857142857142855*G0_1_0_3_4 + 0.00642857142857142*G0_1_0_3_5 - 0.0042857142857143*G0_1_0_4_0 - 0.00214285714285714*G0_1_0_4_1 + 0.00857142857142855*G0_1_0_4_3 - 0.0085714285714285*G0_1_0_4_4 + 0.00642857142857143*G0_1_0_4_5 + 0.00321428571428567*G0_1_0_5_0 + 0.00321428571428565*G0_1_0_5_1 - 0.00107142857142857*G0_1_0_5_2 + 0.00642857142857143*G0_1_0_5_3 + 0.00642857142857143*G0_1_0_5_4 - 0.0771428571428566*G0_1_0_5_5 - 0.0101785714285714*G0_1_1_0_0 - 0.000937499999999982*G0_1_1_0_1 + 0.000937499999999975*G0_1_1_0_2 + 0.000535714285714289*G0_1_1_0_3 - 0.00107142857142856*G0_1_1_0_4 - 0.0160714285714284*G0_1_1_0_5 - 0.000937499999999981*G0_1_1_1_0 + 0.0441964285714282*G0_1_1_1_1 - 0.000401785714285703*G0_1_1_1_2 - 0.00321428571428575*G0_1_1_1_3 - 0.00267857142857143*G0_1_1_1_4 + 0.0192857142857141*G0_1_1_1_5 + 0.000937499999999975*G0_1_1_2_0 - 0.000401785714285702*G0_1_1_2_1 + 0.00535714285714285*G0_1_1_2_3 - 0.00535714285714277*G0_1_1_2_4 - 0.000535714285714285*G0_1_1_2_5 + 0.000535714285714289*G0_1_1_3_0 - 0.00321428571428575*G0_1_1_3_1 + 0.00535714285714285*G0_1_1_3_2 - 0.0257142857142857*G0_1_1_3_3 + 0.00428571428571428*G0_1_1_3_4 - 0.00107142857142856*G0_1_1_4_0 - 0.00267857142857143*G0_1_1_4_1 - 0.00535714285714277*G0_1_1_4_2 + 0.00428571428571428*G0_1_1_4_3 + 0.0171428571428572*G0_1_1_4_4 + 0.00642857142857144*G0_1_1_4_5 - 0.0160714285714284*G0_1_1_5_0 + 0.0192857142857141*G0_1_1_5_1 - 0.000535714285714285*G0_1_1_5_2 + 0.00642857142857144*G0_1_1_5_4 - 0.0385714285714283*G0_1_1_5_5; + A[23] = -A[28] - 0.0109821428571428*G0_1_0_0_0 + 0.00709821428571424*G0_1_0_0_2 + 0.00874999999999995*G0_1_0_0_3 + 0.0167857142857142*G0_1_0_0_4 + 0.00785714285714283*G0_1_0_0_5 - 0.0241071428571427*G0_1_0_1_1 + 0.00397321428571427*G0_1_0_1_2 - 0.00535714285714281*G0_1_0_1_3 + 0.00410714285714283*G0_1_0_1_4 - 0.0053571428571428*G0_1_0_1_5 + 0.00709821428571424*G0_1_0_2_0 + 0.00397321428571427*G0_1_0_2_1 - 0.0937499999999997*G0_1_0_2_2 - 0.00178571428571431*G0_1_0_2_3 - 0.0410714285714284*G0_1_0_2_4 + 0.00232142857142855*G0_1_0_2_5 + 0.00874999999999995*G0_1_0_3_0 - 0.00535714285714281*G0_1_0_3_1 - 0.00178571428571431*G0_1_0_3_2 - 0.0314285714285713*G0_1_0_3_3 - 0.0257142857142856*G0_1_0_3_4 - 0.0221428571428571*G0_1_0_3_5 + 0.0167857142857142*G0_1_0_4_0 + 0.00410714285714283*G0_1_0_4_1 - 0.0410714285714284*G0_1_0_4_2 - 0.0257142857142856*G0_1_0_4_3 - 0.0457142857142855*G0_1_0_4_4 - 0.0128571428571428*G0_1_0_4_5 + 0.00785714285714283*G0_1_0_5_0 - 0.0053571428571428*G0_1_0_5_1 + 0.00232142857142855*G0_1_0_5_2 - 0.0221428571428571*G0_1_0_5_3 - 0.0128571428571428*G0_1_0_5_4 + 0.0328571428571426*G0_1_0_5_5; + A[25] = -A[23] - 0.00374999999999998*G0_1_0_0_0 + 0.00267857142857141*G0_1_0_0_2 + 0.00428571428571427*G0_1_0_0_3 + 0.0171428571428571*G0_1_0_0_4 + 0.00107142857142858*G0_1_0_0_5 + 0.00374999999999993*G0_1_0_1_1 - 0.0026785714285714*G0_1_0_1_2 - 0.0171428571428571*G0_1_0_1_3 - 0.00428571428571428*G0_1_0_1_4 - 0.0010714285714286*G0_1_0_1_5 + 0.00267857142857141*G0_1_0_2_0 - 0.0026785714285714*G0_1_0_2_1 + 0.032142857142857*G0_1_0_2_3 - 0.032142857142857*G0_1_0_2_4 + 0.00428571428571427*G0_1_0_3_0 - 0.0171428571428571*G0_1_0_3_1 + 0.032142857142857*G0_1_0_3_2 - 0.00857142857142854*G0_1_0_3_5 + 0.0171428571428571*G0_1_0_4_0 - 0.00428571428571428*G0_1_0_4_1 - 0.032142857142857*G0_1_0_4_2 + 0.00857142857142855*G0_1_0_4_5 + 0.00107142857142858*G0_1_0_5_0 - 0.0010714285714286*G0_1_0_5_1 - 0.00857142857142854*G0_1_0_5_3 + 0.00857142857142855*G0_1_0_5_4 + 0.0326785714285712*G0_1_1_0_0 - 0.00642857142857138*G0_1_1_0_1 - 0.00339285714285713*G0_1_1_0_2 - 0.000357142857142843*G0_1_1_0_3 + 0.00892857142857137*G0_1_1_0_4 + 0.0114285714285714*G0_1_1_0_5 - 0.00642857142857138*G0_1_1_1_0 + 0.0364285714285712*G0_1_1_1_1 - 0.00607142857142853*G0_1_1_1_2 - 0.0082142857142857*G0_1_1_1_3 - 0.00464285714285712*G0_1_1_1_4 + 0.0103571428571428*G0_1_1_1_5 - 0.00339285714285713*G0_1_1_2_0 - 0.00607142857142853*G0_1_1_2_1 + 0.0776785714285713*G0_1_1_2_2 + 0.032142857142857*G0_1_1_2_3 - 0.00392857142857138*G0_1_1_2_5 - 0.000357142857142843*G0_1_1_3_0 - 0.0082142857142857*G0_1_1_3_1 + 0.032142857142857*G0_1_1_3_2 + 0.0114285714285713*G0_1_1_3_3 + 0.00999999999999995*G0_1_1_3_4 + 0.0085714285714285*G0_1_1_3_5 + 0.00892857142857137*G0_1_1_4_0 - 0.00464285714285712*G0_1_1_4_1 + 0.00999999999999995*G0_1_1_4_3 + 0.0114285714285714*G0_1_1_4_4 + 0.0171428571428571*G0_1_1_4_5 + 0.0114285714285714*G0_1_1_5_0 + 0.0103571428571428*G0_1_1_5_1 - 0.00392857142857138*G0_1_1_5_2 + 0.0085714285714285*G0_1_1_5_3 + 0.0171428571428571*G0_1_1_5_4 + 0.0742857142857138*G0_1_1_5_5; + A[24] = -A[26] - 0.0230357142857142*G0_1_1_0_0 + 0.00508928571428568*G0_1_1_0_1 + 0.00758928571428567*G0_1_1_0_2 + 0.00714285714285709*G0_1_1_0_3 - 0.00178571428571429*G0_1_1_0_4 - 0.00571428571428568*G0_1_1_0_5 + 0.00508928571428568*G0_1_1_1_0 - 0.0230357142857141*G0_1_1_1_1 + 0.00758928571428567*G0_1_1_1_2 - 0.00178571428571428*G0_1_1_1_3 + 0.00714285714285711*G0_1_1_1_4 - 0.00571428571428567*G0_1_1_1_5 + 0.00758928571428567*G0_1_1_2_0 + 0.00758928571428566*G0_1_1_2_1 - 0.152678571428571*G0_1_1_2_2 - 0.0214285714285713*G0_1_1_2_3 - 0.0214285714285713*G0_1_1_2_4 + 0.00892857142857136*G0_1_1_2_5 + 0.00714285714285709*G0_1_1_3_0 - 0.00178571428571428*G0_1_1_3_1 - 0.0214285714285713*G0_1_1_3_2 - 0.0571428571428568*G0_1_1_3_3 - 0.0285714285714284*G0_1_1_3_4 - 0.032142857142857*G0_1_1_3_5 - 0.00178571428571429*G0_1_1_4_0 + 0.00714285714285711*G0_1_1_4_1 - 0.0214285714285713*G0_1_1_4_2 - 0.0285714285714284*G0_1_1_4_3 - 0.0571428571428569*G0_1_1_4_4 - 0.032142857142857*G0_1_1_4_5 - 0.00571428571428568*G0_1_1_5_0 - 0.00571428571428567*G0_1_1_5_1 + 0.00892857142857136*G0_1_1_5_2 - 0.032142857142857*G0_1_1_5_3 - 0.032142857142857*G0_1_1_5_4 - 0.109999999999999*G0_1_1_5_5; + A[49] = -A[69] - 0.01125*G0_1_0_0_0 - 0.00803571428571426*G0_1_0_0_2 + 0.0449999999999998*G0_1_0_0_3 + 0.0192857142857143*G0_1_0_0_4 + 0.00321428571428575*G0_1_0_0_5 + 0.0112499999999997*G0_1_0_1_1 + 0.00803571428571429*G0_1_0_1_2 - 0.0192857142857143*G0_1_0_1_3 - 0.0449999999999998*G0_1_0_1_4 - 0.00321428571428584*G0_1_0_1_5 - 0.00803571428571426*G0_1_0_2_0 + 0.00803571428571429*G0_1_0_2_1 + 0.032142857142857*G0_1_0_2_3 - 0.032142857142857*G0_1_0_2_4 + 0.0449999999999998*G0_1_0_3_0 - 0.0192857142857143*G0_1_0_3_1 + 0.032142857142857*G0_1_0_3_2 - 0.64285714285714*G0_1_0_3_3 - 0.0899999999999999*G0_1_0_3_5 + 0.0192857142857143*G0_1_0_4_0 - 0.0449999999999998*G0_1_0_4_1 - 0.032142857142857*G0_1_0_4_2 + 0.64285714285714*G0_1_0_4_4 + 0.0899999999999996*G0_1_0_4_5 + 0.00321428571428576*G0_1_0_5_0 - 0.00321428571428584*G0_1_0_5_1 - 0.0899999999999999*G0_1_0_5_3 + 0.0899999999999996*G0_1_0_5_4 - 0.0674999999999999*G0_1_1_0_0 + 0.0200892857142856*G0_1_1_0_1 - 0.000803571428571413*G0_1_1_0_2 + 0.0578571428571425*G0_1_1_0_3 + 0.0160714285714285*G0_1_1_0_4 - 0.0257142857142857*G0_1_1_0_5 + 0.0200892857142856*G0_1_1_1_0 - 0.0562499999999999*G0_1_1_1_1 + 0.00723214285714286*G0_1_1_1_2 - 0.00321428571428575*G0_1_1_1_3 + 0.0128571428571428*G0_1_1_1_4 - 0.0289285714285714*G0_1_1_1_5 - 0.000803571428571412*G0_1_1_2_0 + 0.00723214285714286*G0_1_1_2_1 + 0.0321428571428571*G0_1_1_2_2 + 0.032142857142857*G0_1_1_2_3 + 0.0257142857142856*G0_1_1_2_5 + 0.0578571428571425*G0_1_1_3_0 - 0.00321428571428576*G0_1_1_3_1 + 0.032142857142857*G0_1_1_3_2 - 0.694285714285712*G0_1_1_3_3 - 0.141428571428571*G0_1_1_3_4 - 0.167142857142857*G0_1_1_3_5 + 0.0160714285714285*G0_1_1_4_0 + 0.0128571428571428*G0_1_1_4_1 - 0.141428571428571*G0_1_1_4_3 - 0.0514285714285713*G0_1_1_4_4 - 0.0771428571428568*G0_1_1_4_5 - 0.0257142857142857*G0_1_1_5_0 - 0.0289285714285714*G0_1_1_5_1 + 0.0257142857142856*G0_1_1_5_2 - 0.167142857142857*G0_1_1_5_3 - 0.0771428571428568*G0_1_1_5_4 - 0.64285714285714*G0_1_1_5_5; + A[94] = A[49] + 0.00482142857142857*G0_0_1_0_0 + 0.000803571428571439*G0_0_1_0_1 - 0.0152678571428571*G0_0_1_0_2 + 0.0192857142857141*G0_0_1_0_3 - 0.0128571428571428*G0_0_1_0_4 + 0.00321428571428573*G0_0_1_0_5 + 0.000803571428571439*G0_0_1_1_0 + 0.0160714285714283*G0_0_1_1_1 - 0.00723214285714283*G0_0_1_1_2 - 0.0321428571428572*G0_0_1_1_3 - 0.0257142857142856*G0_0_1_1_4 - 0.0152678571428571*G0_0_1_2_0 - 0.00723214285714283*G0_0_1_2_1 + 0.0803571428571427*G0_0_1_2_2 + 0.0803571428571426*G0_0_1_2_3 + 0.0482142857142856*G0_0_1_2_4 + 0.00642857142857145*G0_0_1_2_5 + 0.0192857142857141*G0_0_1_3_0 - 0.0321428571428572*G0_0_1_3_1 + 0.0803571428571426*G0_0_1_3_2 - 0.46285714285714*G0_0_1_3_3 + 0.0128571428571429*G0_0_1_3_4 - 0.0514285714285712*G0_0_1_3_5 - 0.0128571428571428*G0_0_1_4_0 - 0.0257142857142856*G0_0_1_4_1 + 0.0482142857142856*G0_0_1_4_2 + 0.0128571428571429*G0_0_1_4_3 + 0.179999999999999*G0_0_1_4_4 + 0.0385714285714284*G0_0_1_4_5 + 0.00321428571428573*G0_0_1_5_0 + 0.00642857142857145*G0_0_1_5_2 - 0.0514285714285712*G0_0_1_5_3 + 0.0385714285714284*G0_0_1_5_4 + 0.0514285714285713*G0_0_1_5_5 - 0.00482142857142856*G0_1_0_0_0 - 0.000803571428571439*G0_1_0_0_1 + 0.0152678571428571*G0_1_0_0_2 - 0.0192857142857141*G0_1_0_0_3 + 0.0128571428571428*G0_1_0_0_4 - 0.00321428571428573*G0_1_0_0_5 - 0.000803571428571438*G0_1_0_1_0 - 0.0160714285714283*G0_1_0_1_1 + 0.00723214285714283*G0_1_0_1_2 + 0.0321428571428571*G0_1_0_1_3 + 0.0257142857142856*G0_1_0_1_4 + 0.0152678571428571*G0_1_0_2_0 + 0.00723214285714283*G0_1_0_2_1 - 0.0803571428571427*G0_1_0_2_2 - 0.0803571428571426*G0_1_0_2_3 - 0.0482142857142856*G0_1_0_2_4 - 0.00642857142857145*G0_1_0_2_5 - 0.0192857142857141*G0_1_0_3_0 + 0.0321428571428572*G0_1_0_3_1 - 0.0803571428571426*G0_1_0_3_2 + 0.46285714285714*G0_1_0_3_3 - 0.0128571428571429*G0_1_0_3_4 + 0.0514285714285712*G0_1_0_3_5 + 0.0128571428571428*G0_1_0_4_0 + 0.0257142857142856*G0_1_0_4_1 - 0.0482142857142856*G0_1_0_4_2 - 0.0128571428571429*G0_1_0_4_3 - 0.179999999999999*G0_1_0_4_4 - 0.0385714285714284*G0_1_0_4_5 - 0.00321428571428573*G0_1_0_5_0 - 0.00642857142857145*G0_1_0_5_2 + 0.0514285714285712*G0_1_0_5_3 - 0.0385714285714284*G0_1_0_5_4 - 0.0514285714285713*G0_1_0_5_5; + A[97] = A[49] + 0.0899999999999997*G0_0_0_0_0 - 0.00562500000000001*G0_0_0_0_1 - 0.00723214285714285*G0_0_0_0_2 + 0.00642857142857136*G0_0_0_0_3 + 0.128571428571428*G0_0_0_0_4 + 0.0289285714285713*G0_0_0_0_5 - 0.00562500000000001*G0_0_0_1_0 - 0.0482142857142853*G0_0_0_1_1 + 0.00562499999999997*G0_0_0_1_2 - 0.0835714285714281*G0_0_0_1_3 - 0.0128571428571428*G0_0_0_1_5 - 0.00723214285714285*G0_0_0_2_0 + 0.00562499999999997*G0_0_0_2_1 - 0.00803571428571416*G0_0_0_2_2 + 0.0674999999999996*G0_0_0_2_3 - 0.0996428571428566*G0_0_0_2_4 - 0.00642857142857142*G0_0_0_2_5 + 0.00642857142857136*G0_0_0_3_0 - 0.0835714285714281*G0_0_0_3_1 + 0.0674999999999996*G0_0_0_3_2 - 0.0257142857142848*G0_0_0_3_3 - 0.0128571428571427*G0_0_0_3_4 + 0.128571428571428*G0_0_0_4_0 - 0.0996428571428566*G0_0_0_4_2 - 0.0128571428571427*G0_0_0_4_3 - 0.0771428571428566*G0_0_0_4_4 + 0.0128571428571429*G0_0_0_4_5 + 0.0289285714285713*G0_0_0_5_0 - 0.0128571428571428*G0_0_0_5_1 - 0.00642857142857142*G0_0_0_5_2 + 0.0128571428571429*G0_0_0_5_4 + 0.0257142857142857*G0_0_0_5_5 - 0.0144642857142856*G0_0_1_0_0 + 0.0120535714285714*G0_0_1_0_1 - 0.00723214285714281*G0_0_1_0_2 - 0.0192857142857143*G0_0_1_0_3 - 0.0385714285714285*G0_0_1_0_4 - 0.0289285714285713*G0_0_1_0_5 + 0.0120535714285714*G0_0_1_1_0 - 0.0482142857142853*G0_0_1_1_1 - 0.0120535714285714*G0_0_1_1_2 - 0.096428571428571*G0_0_1_1_3 - 0.00723214285714281*G0_0_1_2_0 - 0.0120535714285714*G0_0_1_2_1 + 0.0964285714285712*G0_0_1_2_2 + 0.125357142857142*G0_0_1_2_3 + 0.0674999999999998*G0_0_1_2_4 + 0.0192857142857142*G0_0_1_2_5 - 0.0192857142857143*G0_0_1_3_0 - 0.096428571428571*G0_0_1_3_1 + 0.125357142857142*G0_0_1_3_2 + 0.0385714285714286*G0_0_1_3_4 - 0.0385714285714285*G0_0_1_4_0 + 0.0674999999999998*G0_0_1_4_2 + 0.0385714285714286*G0_0_1_4_3 - 0.0771428571428566*G0_0_1_4_4 - 0.0385714285714284*G0_0_1_4_5 - 0.0289285714285713*G0_0_1_5_0 + 0.0192857142857142*G0_0_1_5_2 - 0.0385714285714284*G0_0_1_5_4 + 0.0610714285714286*G0_1_0_0_0 + 0.00401785714285707*G0_1_0_0_1 - 0.00723214285714283*G0_1_0_0_2 - 0.0321428571428569*G0_1_0_0_3 + 0.0225*G0_1_0_0_4 + 0.0482142857142855*G0_1_0_0_5 + 0.00401785714285707*G0_1_0_1_0 - 0.0482142857142852*G0_1_0_1_1 - 0.00401785714285715*G0_1_0_1_2 - 0.0642857142857138*G0_1_0_1_3 - 0.0321428571428569*G0_1_0_1_5 - 0.00723214285714283*G0_1_0_2_0 - 0.00401785714285714*G0_1_0_2_1 + 0.020892857142857*G0_1_0_2_2 + 0.0482142857142853*G0_1_0_2_3 + 0.00642857142857138*G0_1_0_2_4 + 0.032142857142857*G0_1_0_2_5 - 0.0321428571428569*G0_1_0_3_0 - 0.0642857142857138*G0_1_0_3_1 + 0.0482142857142853*G0_1_0_3_2 + 0.514285714285712*G0_1_0_3_3 + 0.0642857142857141*G0_1_0_3_4 + 0.0225*G0_1_0_4_0 + 0.00642857142857139*G0_1_0_4_2 + 0.0642857142857141*G0_1_0_4_3 - 0.0771428571428566*G0_1_0_4_4 - 0.064285714285714*G0_1_0_4_5 + 0.0482142857142855*G0_1_0_5_0 - 0.0321428571428569*G0_1_0_5_1 + 0.032142857142857*G0_1_0_5_2 - 0.064285714285714*G0_1_0_5_4 - 0.514285714285712*G0_1_0_5_5 - 0.0353571428571428*G0_1_1_0_0 + 0.0160714285714285*G0_1_1_0_1 - 0.0514285714285712*G0_1_1_0_3 - 0.0449999999999998*G0_1_1_0_4 - 0.0771428571428568*G0_1_1_0_5 + 0.0160714285714285*G0_1_1_1_0 - 0.0160714285714285*G0_1_1_1_2 - 0.0642857142857139*G0_1_1_1_3 + 0.064285714285714*G0_1_1_1_5 - 0.0160714285714285*G0_1_1_2_1 + 0.0353571428571427*G0_1_1_2_2 + 0.0771428571428568*G0_1_1_2_3 + 0.0449999999999998*G0_1_1_2_4 + 0.0514285714285713*G0_1_1_2_5 - 0.0514285714285712*G0_1_1_3_0 - 0.0642857142857139*G0_1_1_3_1 + 0.0771428571428568*G0_1_1_3_2 + 0.514285714285712*G0_1_1_3_3 + 0.102857142857142*G0_1_1_3_4 - 0.0449999999999998*G0_1_1_4_0 + 0.0449999999999998*G0_1_1_4_2 + 0.102857142857143*G0_1_1_4_3 - 0.102857142857142*G0_1_1_4_5 - 0.0771428571428568*G0_1_1_5_0 + 0.064285714285714*G0_1_1_5_1 + 0.0514285714285713*G0_1_1_5_2 - 0.102857142857142*G0_1_1_5_4 - 0.514285714285712*G0_1_1_5_5; + A[90] = -A[97] + 0.0348214285714285*G0_0_0_0_0 - 0.00696428571428569*G0_0_0_0_2 + 0.00428571428571424*G0_0_0_0_3 + 0.0364285714285713*G0_0_0_0_4 + 0.00107142857142857*G0_0_0_0_5 - 0.0348214285714283*G0_0_0_1_1 + 0.00696428571428567*G0_0_0_1_2 - 0.0364285714285712*G0_0_0_1_3 - 0.00428571428571427*G0_0_0_1_4 - 0.00107142857142856*G0_0_0_1_5 - 0.00696428571428569*G0_0_0_2_0 + 0.00696428571428567*G0_0_0_2_1 + 0.0128571428571428*G0_0_0_2_3 - 0.0128571428571428*G0_0_0_2_4 + 0.00428571428571424*G0_0_0_3_0 - 0.0364285714285712*G0_0_0_3_1 + 0.0128571428571428*G0_0_0_3_2 - 0.154285714285713*G0_0_0_3_3 - 0.00857142857142853*G0_0_0_3_5 + 0.0364285714285713*G0_0_0_4_0 - 0.00428571428571427*G0_0_0_4_1 - 0.0128571428571428*G0_0_0_4_2 + 0.154285714285714*G0_0_0_4_4 + 0.00857142857142857*G0_0_0_4_5 + 0.00107142857142857*G0_0_0_5_0 - 0.00107142857142856*G0_0_0_5_1 - 0.00857142857142853*G0_0_0_5_3 + 0.00857142857142857*G0_0_0_5_4 - 0.0776785714285712*G0_0_1_0_0 + 0.0136607142857142*G0_0_1_0_1 + 0.0147321428571428*G0_0_1_0_2 + 0.00107142857142851*G0_0_1_0_3 - 0.0760714285714283*G0_0_1_0_4 - 0.047142857142857*G0_0_1_0_5 + 0.0136607142857142*G0_0_1_1_0 - 0.0444642857142854*G0_0_1_1_1 + 0.00294642857142854*G0_0_1_1_2 - 0.0332142857142856*G0_0_1_1_3 + 0.024642857142857*G0_0_1_1_4 + 0.0149999999999999*G0_0_1_1_5 + 0.0147321428571428*G0_0_1_2_0 + 0.00294642857142854*G0_0_1_2_1 - 0.00803571428571421*G0_0_1_2_2 + 0.0225*G0_0_1_2_3 + 0.0417857142857142*G0_0_1_2_4 + 0.0224999999999999*G0_0_1_2_5 + 0.00107142857142851*G0_0_1_3_0 - 0.0332142857142856*G0_0_1_3_1 + 0.0225*G0_0_1_3_2 - 0.218571428571427*G0_0_1_3_3 - 0.0514285714285712*G0_0_1_3_4 - 0.047142857142857*G0_0_1_3_5 - 0.0760714285714283*G0_0_1_4_0 + 0.024642857142857*G0_0_1_4_1 + 0.0417857142857142*G0_0_1_4_2 - 0.0514285714285712*G0_0_1_4_3 - 0.192857142857142*G0_0_1_4_4 - 0.094285714285714*G0_0_1_4_5 - 0.047142857142857*G0_0_1_5_0 + 0.0149999999999999*G0_0_1_5_1 + 0.0224999999999999*G0_0_1_5_2 - 0.047142857142857*G0_0_1_5_3 - 0.094285714285714*G0_0_1_5_4 - 0.0899999999999996*G0_0_1_5_5 + 0.00267857142857147*G0_1_0_0_0 + 0.00910714285714281*G0_1_0_0_1 - 0.0032142857142857*G0_1_0_0_2 + 0.00749999999999994*G0_1_0_0_3 + 0.00428571428571428*G0_1_0_0_4 + 0.00107142857142854*G0_1_0_0_5 + 0.00910714285714281*G0_1_0_1_0 - 0.0321428571428569*G0_1_0_1_1 + 0.00374999999999997*G0_1_0_1_2 - 0.0321428571428569*G0_1_0_1_3 + 0.0032142857142857*G0_1_0_1_4 - 0.0032142857142857*G0_1_0_2_0 + 0.00374999999999997*G0_1_0_2_1 + 0.000535714285714306*G0_1_0_2_2 + 0.024642857142857*G0_1_0_2_3 + 0.0117857142857142*G0_1_0_2_4 + 0.0374999999999999*G0_1_0_2_5 + 0.00749999999999994*G0_1_0_3_0 - 0.0321428571428569*G0_1_0_3_1 + 0.024642857142857*G0_1_0_3_2 - 0.167142857142856*G0_1_0_3_3 - 0.0214285714285713*G0_1_0_3_4 - 0.0899999999999996*G0_1_0_3_5 + 0.00428571428571428*G0_1_0_4_0 + 0.0032142857142857*G0_1_0_4_1 + 0.0117857142857142*G0_1_0_4_2 - 0.0214285714285713*G0_1_0_4_3 - 0.0128571428571428*G0_1_0_4_4 - 0.0814285714285711*G0_1_0_4_5 + 0.00107142857142854*G0_1_0_5_0 + 0.0374999999999999*G0_1_0_5_2 - 0.0899999999999996*G0_1_0_5_3 - 0.0814285714285711*G0_1_0_5_4 - 0.55285714285714*G0_1_0_5_5 - 0.109821428571428*G0_1_1_0_0 + 0.0308035714285713*G0_1_1_0_1 + 0.0104464285714286*G0_1_1_0_2 + 0.00428571428571423*G0_1_1_0_3 - 0.0439285714285713*G0_1_1_0_4 - 0.111428571428571*G0_1_1_0_5 + 0.0308035714285713*G0_1_1_1_0 - 0.0401785714285712*G0_1_1_1_1 - 0.000267857142857152*G0_1_1_1_2 - 0.0224999999999999*G0_1_1_1_3 + 0.0257142857142856*G0_1_1_1_4 + 0.0546428571428568*G0_1_1_1_5 + 0.0104464285714286*G0_1_1_2_0 - 0.000267857142857152*G0_1_1_2_1 - 0.00910714285714279*G0_1_1_2_2 + 0.0278571428571428*G0_1_1_2_3 + 0.0278571428571428*G0_1_1_2_4 + 0.0664285714285712*G0_1_1_2_5 + 0.00428571428571422*G0_1_1_3_0 - 0.0224999999999999*G0_1_1_3_1 + 0.0278571428571428*G0_1_1_3_2 - 0.23142857142857*G0_1_1_3_3 - 0.0599999999999998*G0_1_1_3_4 - 0.141428571428571*G0_1_1_3_5 - 0.0439285714285713*G0_1_1_4_0 + 0.0257142857142856*G0_1_1_4_1 + 0.0278571428571428*G0_1_1_4_2 - 0.0599999999999998*G0_1_1_4_3 - 0.102857142857143*G0_1_1_4_4 - 0.184285714285714*G0_1_1_4_5 - 0.111428571428571*G0_1_1_5_0 + 0.0546428571428568*G0_1_1_5_1 + 0.0664285714285712*G0_1_1_5_2 - 0.141428571428571*G0_1_1_5_3 - 0.184285714285714*G0_1_1_5_4 - 0.899999999999996*G0_1_1_5_5; + A[96] = -A[94] - 0.01125*G0_0_1_0_0 - 0.00803571428571426*G0_0_1_0_2 + 0.0449999999999998*G0_0_1_0_3 + 0.0192857142857143*G0_0_1_0_4 + 0.00321428571428576*G0_0_1_0_5 + 0.0112499999999997*G0_0_1_1_1 + 0.00803571428571429*G0_0_1_1_2 - 0.0192857142857143*G0_0_1_1_3 - 0.0449999999999998*G0_0_1_1_4 - 0.00321428571428584*G0_0_1_1_5 - 0.00803571428571426*G0_0_1_2_0 + 0.00803571428571429*G0_0_1_2_1 + 0.032142857142857*G0_0_1_2_3 - 0.032142857142857*G0_0_1_2_4 + 0.0449999999999998*G0_0_1_3_0 - 0.0192857142857143*G0_0_1_3_1 + 0.032142857142857*G0_0_1_3_2 - 0.64285714285714*G0_0_1_3_3 - 0.0899999999999999*G0_0_1_3_5 + 0.0192857142857143*G0_0_1_4_0 - 0.0449999999999998*G0_0_1_4_1 - 0.032142857142857*G0_0_1_4_2 + 0.64285714285714*G0_0_1_4_4 + 0.0899999999999996*G0_0_1_4_5 + 0.00321428571428576*G0_0_1_5_0 - 0.00321428571428584*G0_0_1_5_1 - 0.0899999999999999*G0_0_1_5_3 + 0.0899999999999996*G0_0_1_5_4 - 0.0674999999999999*G0_1_1_0_0 + 0.0200892857142856*G0_1_1_0_1 - 0.000803571428571413*G0_1_1_0_2 + 0.0578571428571425*G0_1_1_0_3 + 0.0160714285714285*G0_1_1_0_4 - 0.0257142857142857*G0_1_1_0_5 + 0.0200892857142856*G0_1_1_1_0 - 0.0562499999999999*G0_1_1_1_1 + 0.00723214285714286*G0_1_1_1_2 - 0.00321428571428575*G0_1_1_1_3 + 0.0128571428571428*G0_1_1_1_4 - 0.0289285714285714*G0_1_1_1_5 - 0.000803571428571412*G0_1_1_2_0 + 0.00723214285714286*G0_1_1_2_1 + 0.0321428571428571*G0_1_1_2_2 + 0.032142857142857*G0_1_1_2_3 + 0.0257142857142856*G0_1_1_2_5 + 0.0578571428571425*G0_1_1_3_0 - 0.00321428571428576*G0_1_1_3_1 + 0.032142857142857*G0_1_1_3_2 - 0.694285714285712*G0_1_1_3_3 - 0.141428571428571*G0_1_1_3_4 - 0.167142857142857*G0_1_1_3_5 + 0.0160714285714285*G0_1_1_4_0 + 0.0128571428571428*G0_1_1_4_1 - 0.141428571428571*G0_1_1_4_3 - 0.0514285714285713*G0_1_1_4_4 - 0.0771428571428568*G0_1_1_4_5 - 0.0257142857142857*G0_1_1_5_0 - 0.0289285714285714*G0_1_1_5_1 + 0.0257142857142856*G0_1_1_5_2 - 0.167142857142857*G0_1_1_5_3 - 0.0771428571428568*G0_1_1_5_4 - 0.64285714285714*G0_1_1_5_5; + A[89] = A[96] - 0.0482142857142855*G0_0_0_0_0 - 0.00562499999999993*G0_0_0_0_1 + 0.00562499999999997*G0_0_0_0_2 - 0.0835714285714282*G0_0_0_0_4 - 0.0128571428571428*G0_0_0_0_5 - 0.00562499999999993*G0_0_0_1_0 + 0.0899999999999993*G0_0_0_1_1 - 0.00723214285714283*G0_0_0_1_2 + 0.128571428571428*G0_0_0_1_3 + 0.00642857142857142*G0_0_0_1_4 + 0.0289285714285713*G0_0_0_1_5 + 0.00562499999999997*G0_0_0_2_0 - 0.00723214285714283*G0_0_0_2_1 - 0.0080357142857143*G0_0_0_2_2 - 0.0996428571428565*G0_0_0_2_3 + 0.0674999999999996*G0_0_0_2_4 - 0.0064285714285714*G0_0_0_2_5 + 0.128571428571428*G0_0_0_3_1 - 0.0996428571428565*G0_0_0_3_2 - 0.0771428571428567*G0_0_0_3_3 - 0.0128571428571428*G0_0_0_3_4 + 0.0128571428571428*G0_0_0_3_5 - 0.0835714285714282*G0_0_0_4_0 + 0.00642857142857142*G0_0_0_4_1 + 0.0674999999999997*G0_0_0_4_2 - 0.0128571428571428*G0_0_0_4_3 - 0.0257142857142856*G0_0_0_4_4 - 0.0128571428571428*G0_0_0_5_0 + 0.0289285714285713*G0_0_0_5_1 - 0.0064285714285714*G0_0_0_5_2 + 0.0128571428571428*G0_0_0_5_3 + 0.0257142857142855*G0_0_0_5_5 - 0.00964285714285707*G0_0_1_0_1 + 0.00964285714285709*G0_0_1_0_2 - 0.0192857142857143*G0_0_1_0_4 + 0.0192857142857142*G0_0_1_0_5 - 0.00964285714285708*G0_0_1_1_0 + 0.0289285714285711*G0_0_1_1_1 + 0.106071428571428*G0_0_1_1_3 + 0.0385714285714284*G0_0_1_1_4 - 0.0192857142857141*G0_0_1_1_5 + 0.00964285714285709*G0_0_1_2_0 - 0.0289285714285712*G0_0_1_2_2 - 0.106071428571428*G0_0_1_2_3 + 0.0192857142857142*G0_0_1_2_4 - 0.0385714285714284*G0_0_1_2_5 + 0.106071428571428*G0_0_1_3_1 - 0.106071428571428*G0_0_1_3_2 - 0.0771428571428567*G0_0_1_3_4 + 0.0771428571428569*G0_0_1_3_5 - 0.0192857142857143*G0_0_1_4_0 + 0.0385714285714284*G0_0_1_4_1 + 0.0192857142857142*G0_0_1_4_2 - 0.0771428571428567*G0_0_1_4_3 - 0.539999999999998*G0_0_1_4_4 + 0.0192857142857142*G0_0_1_5_0 - 0.0192857142857141*G0_0_1_5_1 - 0.0385714285714284*G0_0_1_5_2 + 0.0771428571428569*G0_0_1_5_3 + 0.539999999999998*G0_0_1_5_5 - 0.0176785714285713*G0_1_0_0_1 + 0.0176785714285713*G0_1_0_0_2 + 0.0128571428571428*G0_1_0_0_4 - 0.0128571428571428*G0_1_0_0_5 - 0.0176785714285713*G0_1_0_1_0 + 0.104464285714285*G0_1_0_1_1 + 0.167142857142856*G0_1_0_1_3 + 0.0257142857142856*G0_1_0_1_4 + 0.0578571428571425*G0_1_0_1_5 + 0.0176785714285713*G0_1_0_2_0 - 0.104464285714285*G0_1_0_2_2 - 0.167142857142856*G0_1_0_2_3 - 0.0578571428571427*G0_1_0_2_4 - 0.0257142857142857*G0_1_0_2_5 + 0.167142857142856*G0_1_0_3_1 - 0.167142857142856*G0_1_0_3_2 - 0.0514285714285713*G0_1_0_3_4 + 0.0514285714285712*G0_1_0_3_5 + 0.0128571428571428*G0_1_0_4_0 + 0.0257142857142856*G0_1_0_4_1 - 0.0578571428571427*G0_1_0_4_2 - 0.0514285714285713*G0_1_0_4_3 - 0.0257142857142857*G0_1_0_4_4 - 0.0128571428571428*G0_1_0_5_0 + 0.0578571428571425*G0_1_0_5_1 - 0.0257142857142857*G0_1_0_5_2 + 0.0514285714285712*G0_1_0_5_3 + 0.0257142857142852*G0_1_0_5_5 + 0.0482142857142856*G0_1_1_0_0 - 0.00562499999999996*G0_1_1_0_1 + 0.00562499999999996*G0_1_1_0_2 + 0.0128571428571428*G0_1_1_0_4 + 0.0835714285714281*G0_1_1_0_5 - 0.00562499999999996*G0_1_1_1_0 + 0.00803571428571405*G0_1_1_1_1 + 0.0072321428571428*G0_1_1_1_2 + 0.0996428571428567*G0_1_1_1_3 + 0.00642857142857142*G0_1_1_1_4 - 0.0674999999999996*G0_1_1_1_5 + 0.00562499999999996*G0_1_1_2_0 + 0.0072321428571428*G0_1_1_2_1 - 0.0899999999999997*G0_1_1_2_2 - 0.128571428571428*G0_1_1_2_3 - 0.0289285714285713*G0_1_1_2_4 - 0.00642857142857141*G0_1_1_2_5 + 0.0996428571428567*G0_1_1_3_1 - 0.128571428571428*G0_1_1_3_2 + 0.0771428571428572*G0_1_1_3_3 - 0.0128571428571428*G0_1_1_3_4 + 0.0128571428571428*G0_1_1_3_5 + 0.0128571428571428*G0_1_1_4_0 + 0.00642857142857142*G0_1_1_4_1 - 0.0289285714285713*G0_1_1_4_2 - 0.0128571428571428*G0_1_1_4_3 - 0.0257142857142855*G0_1_1_4_4 + 0.0835714285714282*G0_1_1_5_0 - 0.0674999999999996*G0_1_1_5_1 - 0.00642857142857142*G0_1_1_5_2 + 0.0128571428571428*G0_1_1_5_3 + 0.0257142857142851*G0_1_1_5_5; + A[39] = -A[89] - 0.0674999999999997*G0_0_0_0_0 - 0.000803571428571384*G0_0_0_0_1 + 0.0200892857142856*G0_0_0_0_2 + 0.0578571428571425*G0_0_0_0_3 - 0.0257142857142857*G0_0_0_0_4 + 0.0160714285714285*G0_0_0_0_5 - 0.000803571428571384*G0_0_0_1_0 + 0.0321428571428567*G0_0_0_1_1 + 0.00723214285714282*G0_0_0_1_2 + 0.0321428571428568*G0_0_0_1_3 + 0.0257142857142856*G0_0_0_1_4 + 0.0200892857142856*G0_0_0_2_0 + 0.00723214285714282*G0_0_0_2_1 - 0.0562499999999996*G0_0_0_2_2 - 0.00321428571428555*G0_0_0_2_3 - 0.0289285714285712*G0_0_0_2_4 + 0.0128571428571428*G0_0_0_2_5 + 0.0578571428571425*G0_0_0_3_0 + 0.0321428571428568*G0_0_0_3_1 - 0.00321428571428554*G0_0_0_3_2 - 0.69428571428571*G0_0_0_3_3 - 0.167142857142856*G0_0_0_3_4 - 0.141428571428571*G0_0_0_3_5 - 0.0257142857142857*G0_0_0_4_0 + 0.0257142857142856*G0_0_0_4_1 - 0.0289285714285712*G0_0_0_4_2 - 0.167142857142856*G0_0_0_4_3 - 0.64285714285714*G0_0_0_4_4 - 0.077142857142857*G0_0_0_4_5 + 0.0160714285714285*G0_0_0_5_0 + 0.0128571428571428*G0_0_0_5_2 - 0.141428571428571*G0_0_0_5_3 - 0.077142857142857*G0_0_0_5_4 - 0.0514285714285714*G0_0_0_5_5 - 0.01125*G0_0_1_0_0 - 0.00803571428571423*G0_0_1_0_1 + 0.0449999999999997*G0_0_1_0_3 + 0.00321428571428564*G0_0_1_0_4 + 0.0192857142857142*G0_0_1_0_5 - 0.00803571428571423*G0_0_1_1_0 + 0.00803571428571425*G0_0_1_1_2 + 0.0321428571428569*G0_0_1_1_3 - 0.032142857142857*G0_0_1_1_5 + 0.00803571428571425*G0_0_1_2_1 + 0.0112500000000001*G0_0_1_2_2 - 0.0192857142857141*G0_0_1_2_3 - 0.00321428571428566*G0_0_1_2_4 - 0.0449999999999998*G0_0_1_2_5 + 0.0449999999999997*G0_0_1_3_0 + 0.0321428571428569*G0_0_1_3_1 - 0.0192857142857141*G0_0_1_3_2 - 0.642857142857139*G0_0_1_3_3 - 0.0899999999999995*G0_0_1_3_4 + 0.00321428571428564*G0_0_1_4_0 - 0.00321428571428566*G0_0_1_4_2 - 0.0899999999999995*G0_0_1_4_3 + 0.0899999999999996*G0_0_1_4_5 + 0.0192857142857142*G0_0_1_5_0 - 0.032142857142857*G0_0_1_5_1 - 0.0449999999999998*G0_0_1_5_2 + 0.0899999999999996*G0_0_1_5_4 + 0.64285714285714*G0_0_1_5_5; + A[93] = A[39] - 0.00482142857142851*G0_0_1_0_0 + 0.015267857142857*G0_0_1_0_1 - 0.000803571428571427*G0_0_1_0_2 - 0.0192857142857141*G0_0_1_0_3 - 0.0032142857142857*G0_0_1_0_4 + 0.0128571428571428*G0_0_1_0_5 + 0.015267857142857*G0_0_1_1_0 - 0.0803571428571421*G0_0_1_1_1 + 0.00723214285714282*G0_0_1_1_2 - 0.0803571428571424*G0_0_1_1_3 - 0.00642857142857141*G0_0_1_1_4 - 0.0482142857142854*G0_0_1_1_5 - 0.000803571428571426*G0_0_1_2_0 + 0.00723214285714281*G0_0_1_2_1 - 0.0160714285714286*G0_0_1_2_2 + 0.0321428571428569*G0_0_1_2_3 + 0.0257142857142856*G0_0_1_2_5 - 0.0192857142857141*G0_0_1_3_0 - 0.0803571428571424*G0_0_1_3_1 + 0.0321428571428569*G0_0_1_3_2 + 0.46285714285714*G0_0_1_3_3 + 0.0514285714285712*G0_0_1_3_4 - 0.0128571428571427*G0_0_1_3_5 - 0.0032142857142857*G0_0_1_4_0 - 0.00642857142857141*G0_0_1_4_1 + 0.0514285714285712*G0_0_1_4_3 - 0.0514285714285711*G0_0_1_4_4 - 0.0385714285714284*G0_0_1_4_5 + 0.0128571428571428*G0_0_1_5_0 - 0.0482142857142854*G0_0_1_5_1 + 0.0257142857142856*G0_0_1_5_2 - 0.0128571428571427*G0_0_1_5_3 - 0.0385714285714284*G0_0_1_5_4 - 0.179999999999999*G0_0_1_5_5 + 0.00482142857142851*G0_1_0_0_0 - 0.015267857142857*G0_1_0_0_1 + 0.000803571428571426*G0_1_0_0_2 + 0.0192857142857141*G0_1_0_0_3 + 0.0032142857142857*G0_1_0_0_4 - 0.0128571428571428*G0_1_0_0_5 - 0.015267857142857*G0_1_0_1_0 + 0.0803571428571422*G0_1_0_1_1 - 0.00723214285714282*G0_1_0_1_2 + 0.0803571428571424*G0_1_0_1_3 + 0.00642857142857141*G0_1_0_1_4 + 0.0482142857142854*G0_1_0_1_5 + 0.000803571428571426*G0_1_0_2_0 - 0.00723214285714281*G0_1_0_2_1 + 0.0160714285714286*G0_1_0_2_2 - 0.0321428571428569*G0_1_0_2_3 - 0.0257142857142856*G0_1_0_2_5 + 0.0192857142857141*G0_1_0_3_0 + 0.0803571428571424*G0_1_0_3_1 - 0.0321428571428569*G0_1_0_3_2 - 0.46285714285714*G0_1_0_3_3 - 0.0514285714285712*G0_1_0_3_4 + 0.0128571428571427*G0_1_0_3_5 + 0.0032142857142857*G0_1_0_4_0 + 0.00642857142857141*G0_1_0_4_1 - 0.0514285714285712*G0_1_0_4_3 + 0.0514285714285711*G0_1_0_4_4 + 0.0385714285714284*G0_1_0_4_5 - 0.0128571428571428*G0_1_0_5_0 + 0.0482142857142854*G0_1_0_5_1 - 0.0257142857142856*G0_1_0_5_2 + 0.0128571428571427*G0_1_0_5_3 + 0.0385714285714284*G0_1_0_5_4 + 0.179999999999999*G0_1_0_5_5; + A[98] = -A[93] - 0.0674999999999997*G0_0_0_0_0 - 0.000803571428571385*G0_0_0_0_1 + 0.0200892857142856*G0_0_0_0_2 + 0.0578571428571425*G0_0_0_0_3 - 0.0257142857142857*G0_0_0_0_4 + 0.0160714285714285*G0_0_0_0_5 - 0.000803571428571384*G0_0_0_1_0 + 0.0321428571428567*G0_0_0_1_1 + 0.00723214285714282*G0_0_0_1_2 + 0.0321428571428568*G0_0_0_1_3 + 0.0257142857142856*G0_0_0_1_4 + 0.0200892857142856*G0_0_0_2_0 + 0.00723214285714282*G0_0_0_2_1 - 0.0562499999999996*G0_0_0_2_2 - 0.00321428571428556*G0_0_0_2_3 - 0.0289285714285712*G0_0_0_2_4 + 0.0128571428571428*G0_0_0_2_5 + 0.0578571428571425*G0_0_0_3_0 + 0.0321428571428568*G0_0_0_3_1 - 0.00321428571428555*G0_0_0_3_2 - 0.69428571428571*G0_0_0_3_3 - 0.167142857142856*G0_0_0_3_4 - 0.141428571428571*G0_0_0_3_5 - 0.0257142857142857*G0_0_0_4_0 + 0.0257142857142856*G0_0_0_4_1 - 0.0289285714285712*G0_0_0_4_2 - 0.167142857142856*G0_0_0_4_3 - 0.64285714285714*G0_0_0_4_4 - 0.077142857142857*G0_0_0_4_5 + 0.0160714285714285*G0_0_0_5_0 + 0.0128571428571428*G0_0_0_5_2 - 0.141428571428571*G0_0_0_5_3 - 0.077142857142857*G0_0_0_5_4 - 0.0514285714285714*G0_0_0_5_5 - 0.01125*G0_1_0_0_0 - 0.00803571428571423*G0_1_0_0_1 + 0.0449999999999997*G0_1_0_0_3 + 0.00321428571428564*G0_1_0_0_4 + 0.0192857142857142*G0_1_0_0_5 - 0.00803571428571423*G0_1_0_1_0 + 0.00803571428571425*G0_1_0_1_2 + 0.0321428571428568*G0_1_0_1_3 - 0.032142857142857*G0_1_0_1_5 + 0.00803571428571425*G0_1_0_2_1 + 0.0112500000000001*G0_1_0_2_2 - 0.0192857142857141*G0_1_0_2_3 - 0.00321428571428566*G0_1_0_2_4 - 0.0449999999999998*G0_1_0_2_5 + 0.0449999999999997*G0_1_0_3_0 + 0.0321428571428569*G0_1_0_3_1 - 0.0192857142857141*G0_1_0_3_2 - 0.642857142857139*G0_1_0_3_3 - 0.0899999999999995*G0_1_0_3_4 + 0.00321428571428564*G0_1_0_4_0 - 0.00321428571428566*G0_1_0_4_2 - 0.0899999999999995*G0_1_0_4_3 + 0.0899999999999996*G0_1_0_4_5 + 0.0192857142857142*G0_1_0_5_0 - 0.032142857142857*G0_1_0_5_1 - 0.0449999999999998*G0_1_0_5_2 + 0.0899999999999996*G0_1_0_5_4 + 0.64285714285714*G0_1_0_5_5; + A[9] = A[90] + 0.00267857142857142*G0_0_1_0_1 - 0.00267857142857141*G0_0_1_0_2 + 0.032142857142857*G0_0_1_0_4 - 0.032142857142857*G0_0_1_0_5 + 0.00267857142857142*G0_0_1_1_0 - 0.00374999999999997*G0_0_1_1_1 + 0.00107142857142857*G0_0_1_1_3 + 0.00428571428571426*G0_0_1_1_4 + 0.0171428571428571*G0_0_1_1_5 - 0.00267857142857141*G0_0_1_2_0 + 0.00375000000000001*G0_0_1_2_2 - 0.00107142857142857*G0_0_1_2_3 - 0.0171428571428571*G0_0_1_2_4 - 0.00428571428571428*G0_0_1_2_5 + 0.00107142857142857*G0_0_1_3_1 - 0.00107142857142857*G0_0_1_3_2 - 0.00857142857142852*G0_0_1_3_4 + 0.00857142857142857*G0_0_1_3_5 + 0.032142857142857*G0_0_1_4_0 + 0.00428571428571426*G0_0_1_4_1 - 0.0171428571428571*G0_0_1_4_2 - 0.00857142857142852*G0_0_1_4_3 - 0.032142857142857*G0_0_1_5_0 + 0.0171428571428571*G0_0_1_5_1 - 0.00428571428571428*G0_0_1_5_2 + 0.00857142857142856*G0_0_1_5_3 - 0.00267857142857142*G0_1_0_0_1 + 0.00267857142857141*G0_1_0_0_2 - 0.032142857142857*G0_1_0_0_4 + 0.032142857142857*G0_1_0_0_5 - 0.00267857142857142*G0_1_0_1_0 + 0.00374999999999997*G0_1_0_1_1 - 0.00107142857142857*G0_1_0_1_3 - 0.00428571428571426*G0_1_0_1_4 - 0.017142857142857*G0_1_0_1_5 + 0.00267857142857141*G0_1_0_2_0 - 0.00375000000000002*G0_1_0_2_2 + 0.00107142857142857*G0_1_0_2_3 + 0.0171428571428571*G0_1_0_2_4 + 0.00428571428571429*G0_1_0_2_5 - 0.00107142857142857*G0_1_0_3_1 + 0.00107142857142857*G0_1_0_3_2 + 0.00857142857142852*G0_1_0_3_4 - 0.00857142857142857*G0_1_0_3_5 - 0.032142857142857*G0_1_0_4_0 - 0.00428571428571426*G0_1_0_4_1 + 0.0171428571428571*G0_1_0_4_2 + 0.00857142857142851*G0_1_0_4_3 + 0.032142857142857*G0_1_0_5_0 - 0.017142857142857*G0_1_0_5_1 + 0.00428571428571428*G0_1_0_5_2 - 0.00857142857142857*G0_1_0_5_3; + A[59] = A[93] - 0.0353571428571428*G0_0_0_0_0 + 0.0160714285714285*G0_0_0_0_2 - 0.0514285714285711*G0_0_0_0_3 - 0.0771428571428569*G0_0_0_0_4 - 0.0449999999999998*G0_0_0_0_5 + 0.0353571428571427*G0_0_0_1_1 - 0.0160714285714285*G0_0_0_1_2 + 0.0771428571428568*G0_0_0_1_3 + 0.0514285714285712*G0_0_0_1_4 + 0.0449999999999998*G0_0_0_1_5 + 0.0160714285714285*G0_0_0_2_0 - 0.0160714285714285*G0_0_0_2_1 - 0.0642857142857139*G0_0_0_2_3 + 0.064285714285714*G0_0_0_2_4 - 0.0514285714285711*G0_0_0_3_0 + 0.0771428571428568*G0_0_0_3_1 - 0.0642857142857139*G0_0_0_3_2 + 0.514285714285712*G0_0_0_3_3 + 0.102857142857142*G0_0_0_3_5 - 0.0771428571428569*G0_0_0_4_0 + 0.0514285714285712*G0_0_0_4_1 + 0.064285714285714*G0_0_0_4_2 - 0.514285714285712*G0_0_0_4_4 - 0.102857142857142*G0_0_0_4_5 - 0.0449999999999998*G0_0_0_5_0 + 0.0449999999999998*G0_0_0_5_1 + 0.102857142857143*G0_0_0_5_3 - 0.102857142857142*G0_0_0_5_4 - 0.0144642857142857*G0_0_1_0_0 - 0.00723214285714275*G0_0_1_0_1 + 0.0120535714285714*G0_0_1_0_2 - 0.0192857142857142*G0_0_1_0_3 - 0.0289285714285713*G0_0_1_0_4 - 0.0385714285714284*G0_0_1_0_5 - 0.00723214285714276*G0_0_1_1_0 + 0.0964285714285706*G0_0_1_1_1 - 0.0120535714285714*G0_0_1_1_2 + 0.125357142857142*G0_0_1_1_3 + 0.0192857142857142*G0_0_1_1_4 + 0.0674999999999996*G0_0_1_1_5 + 0.0120535714285714*G0_0_1_2_0 - 0.0120535714285714*G0_0_1_2_1 - 0.0482142857142855*G0_0_1_2_2 - 0.0964285714285709*G0_0_1_2_3 - 0.0192857142857142*G0_0_1_3_0 + 0.125357142857142*G0_0_1_3_1 - 0.0964285714285709*G0_0_1_3_2 + 0.0385714285714284*G0_0_1_3_5 - 0.0289285714285713*G0_0_1_4_0 + 0.0192857142857142*G0_0_1_4_1 - 0.0385714285714284*G0_0_1_4_5 - 0.0385714285714284*G0_0_1_5_0 + 0.0674999999999996*G0_0_1_5_1 + 0.0385714285714284*G0_0_1_5_3 - 0.0385714285714284*G0_0_1_5_4 - 0.0771428571428571*G0_0_1_5_5 + 0.0610714285714284*G0_1_0_0_0 - 0.00723214285714283*G0_1_0_0_1 + 0.00401785714285711*G0_1_0_0_2 - 0.0321428571428569*G0_1_0_0_3 + 0.0482142857142855*G0_1_0_0_4 + 0.0224999999999999*G0_1_0_0_5 - 0.00723214285714283*G0_1_0_1_0 + 0.020892857142857*G0_1_0_1_1 - 0.00401785714285715*G0_1_0_1_2 + 0.0482142857142855*G0_1_0_1_3 + 0.032142857142857*G0_1_0_1_4 + 0.00642857142857144*G0_1_0_1_5 + 0.00401785714285711*G0_1_0_2_0 - 0.00401785714285715*G0_1_0_2_1 - 0.0482142857142855*G0_1_0_2_2 - 0.0642857142857139*G0_1_0_2_3 - 0.032142857142857*G0_1_0_2_4 - 0.0321428571428569*G0_1_0_3_0 + 0.0482142857142855*G0_1_0_3_1 - 0.0642857142857139*G0_1_0_3_2 + 0.514285714285712*G0_1_0_3_3 + 0.0642857142857141*G0_1_0_3_5 + 0.0482142857142855*G0_1_0_4_0 + 0.032142857142857*G0_1_0_4_1 - 0.032142857142857*G0_1_0_4_2 - 0.514285714285712*G0_1_0_4_4 - 0.064285714285714*G0_1_0_4_5 + 0.0224999999999999*G0_1_0_5_0 + 0.00642857142857144*G0_1_0_5_1 + 0.0642857142857142*G0_1_0_5_3 - 0.064285714285714*G0_1_0_5_4 - 0.0771428571428568*G0_1_0_5_5 + 0.0899999999999998*G0_1_1_0_0 - 0.00723214285714282*G0_1_1_0_1 - 0.005625*G0_1_1_0_2 + 0.00642857142857137*G0_1_1_0_3 + 0.0289285714285713*G0_1_1_0_4 + 0.128571428571428*G0_1_1_0_5 - 0.00723214285714282*G0_1_1_1_0 - 0.00803571428571446*G0_1_1_1_1 + 0.00562499999999996*G0_1_1_1_2 + 0.0674999999999997*G0_1_1_1_3 - 0.00642857142857139*G0_1_1_1_4 - 0.0996428571428566*G0_1_1_1_5 - 0.005625*G0_1_1_2_0 + 0.00562499999999996*G0_1_1_2_1 - 0.0482142857142855*G0_1_1_2_2 - 0.0835714285714281*G0_1_1_2_3 - 0.0128571428571428*G0_1_1_2_4 + 0.00642857142857137*G0_1_1_3_0 + 0.0674999999999997*G0_1_1_3_1 - 0.0835714285714281*G0_1_1_3_2 - 0.0257142857142852*G0_1_1_3_3 - 0.0128571428571428*G0_1_1_3_5 + 0.0289285714285713*G0_1_1_4_0 - 0.00642857142857139*G0_1_1_4_1 - 0.0128571428571428*G0_1_1_4_2 + 0.0257142857142857*G0_1_1_4_4 + 0.0128571428571428*G0_1_1_4_5 + 0.128571428571428*G0_1_1_5_0 - 0.0996428571428566*G0_1_1_5_1 - 0.0128571428571428*G0_1_1_5_3 + 0.0128571428571427*G0_1_1_5_4 - 0.0771428571428574*G0_1_1_5_5; + A[55] = -A[59] - 0.00803571428571426*G0_0_0_0_0 + 0.00160714285714285*G0_0_0_0_1 + 0.0032142857142857*G0_0_0_0_2 + 0.00321428571428567*G0_0_0_0_3 - 0.00964285714285713*G0_0_0_0_4 - 0.00642857142857141*G0_0_0_0_5 + 0.00160714285714285*G0_0_0_1_0 - 0.00803571428571423*G0_0_0_1_1 + 0.00321428571428569*G0_0_0_1_2 - 0.00964285714285713*G0_0_0_1_3 + 0.00321428571428569*G0_0_0_1_4 - 0.0064285714285714*G0_0_0_1_5 + 0.0032142857142857*G0_0_0_2_0 + 0.00321428571428569*G0_0_0_2_1 + 0.0482142857142855*G0_0_0_2_2 - 0.00642857142857139*G0_0_0_2_5 + 0.00321428571428567*G0_0_0_3_0 - 0.00964285714285713*G0_0_0_3_1 - 0.179999999999999*G0_0_0_3_3 - 0.0128571428571428*G0_0_0_3_4 + 0.00642857142857141*G0_0_0_3_5 - 0.00964285714285715*G0_0_0_4_0 + 0.00321428571428569*G0_0_0_4_1 - 0.0128571428571428*G0_0_0_4_3 - 0.179999999999999*G0_0_0_4_4 + 0.00642857142857131*G0_0_0_4_5 - 0.00642857142857142*G0_0_0_5_0 - 0.0064285714285714*G0_0_0_5_1 - 0.00642857142857139*G0_0_0_5_2 + 0.00642857142857142*G0_0_0_5_3 + 0.00642857142857131*G0_0_0_5_4 + 0.0385714285714284*G0_0_0_5_5 - 0.0723214285714283*G0_0_1_0_0 + 0.0152678571428571*G0_0_1_0_1 + 0.00883928571428569*G0_0_1_0_2 - 0.00803571428571428*G0_0_1_0_3 - 0.0739285714285711*G0_0_1_0_4 - 0.0546428571428569*G0_0_1_0_5 + 0.0152678571428571*G0_0_1_1_0 - 0.00883928571428569*G0_0_1_1_1 + 0.00160714285714284*G0_0_1_1_2 - 0.00964285714285712*G0_0_1_1_3 - 0.0176785714285713*G0_0_1_1_4 + 0.0112499999999999*G0_0_1_1_5 + 0.00883928571428569*G0_0_1_2_0 + 0.00160714285714284*G0_0_1_2_1 + 0.0281249999999999*G0_0_1_2_2 - 0.0048214285714285*G0_0_1_2_3 + 0.0208928571428571*G0_0_1_2_4 + 0.0176785714285714*G0_0_1_2_5 - 0.00803571428571428*G0_0_1_3_0 - 0.00964285714285712*G0_0_1_3_1 - 0.0048214285714285*G0_0_1_3_2 - 0.18642857142857*G0_0_1_3_3 + 0.0514285714285712*G0_0_1_3_4 - 0.0192857142857142*G0_0_1_3_5 - 0.0739285714285711*G0_0_1_4_0 - 0.0176785714285713*G0_0_1_4_1 + 0.0208928571428571*G0_0_1_4_2 + 0.0514285714285712*G0_0_1_4_3 + 0.340714285714284*G0_0_1_4_4 - 0.0546428571428569*G0_0_1_5_0 + 0.0112499999999999*G0_0_1_5_1 + 0.0176785714285714*G0_0_1_5_2 - 0.0192857142857143*G0_0_1_5_3 - 0.147857142857142*G0_0_1_5_5 + 0.00803571428571428*G0_1_0_0_0 + 0.00160714285714284*G0_1_0_0_2 - 0.00160714285714288*G0_1_0_0_3 + 0.00642857142857139*G0_1_0_0_4 - 0.00642857142857138*G0_1_0_0_5 - 0.00401785714285711*G0_1_0_1_1 + 0.00241071428571426*G0_1_0_1_2 - 0.0064285714285714*G0_1_0_1_3 + 0.00160714285714283*G0_1_0_1_4 - 0.00160714285714285*G0_1_0_1_5 + 0.00160714285714285*G0_1_0_2_0 + 0.00241071428571426*G0_1_0_2_1 + 0.0441964285714284*G0_1_0_2_2 - 0.0048214285714285*G0_1_0_2_3 - 0.0112499999999999*G0_1_0_2_4 - 0.00803571428571425*G0_1_0_2_5 - 0.00160714285714288*G0_1_0_3_0 - 0.00642857142857141*G0_1_0_3_1 - 0.0048214285714285*G0_1_0_3_2 - 0.134999999999999*G0_1_0_3_3 + 0.0192857142857142*G0_1_0_3_5 + 0.00642857142857141*G0_1_0_4_0 + 0.00160714285714283*G0_1_0_4_1 - 0.0112499999999999*G0_1_0_4_2 - 0.122142857142857*G0_1_0_4_4 + 0.0128571428571428*G0_1_0_4_5 - 0.00642857142857138*G0_1_0_5_0 - 0.00160714285714285*G0_1_0_5_1 - 0.00803571428571425*G0_1_0_5_2 + 0.0192857142857142*G0_1_0_5_3 + 0.0128571428571428*G0_1_0_5_4 + 0.032142857142857*G0_1_0_5_5 + 0.401785714285713*G0_1_1_0_0 - 0.0385714285714284*G0_1_1_0_1 - 0.0289285714285713*G0_1_1_0_2 + 0.00321428571428571*G0_1_1_0_3 + 0.0707142857142853*G0_1_1_0_4 + 0.202499999999999*G0_1_1_0_5 - 0.0385714285714284*G0_1_1_1_0 + 0.00482142857142855*G0_1_1_1_1 + 0.00803571428571424*G0_1_1_1_2 - 0.0192857142857142*G0_1_1_1_3 - 0.0449999999999998*G0_1_1_1_4 - 0.0707142857142853*G0_1_1_1_5 - 0.0289285714285713*G0_1_1_2_0 + 0.00803571428571424*G0_1_1_2_1 + 0.0369642857142855*G0_1_1_2_2 - 0.00964285714285709*G0_1_1_2_3 - 0.0224999999999999*G0_1_1_2_5 + 0.00321428571428571*G0_1_1_3_0 - 0.0192857142857142*G0_1_1_3_1 - 0.00964285714285709*G0_1_1_3_2 - 0.128571428571428*G0_1_1_3_3 + 0.0835714285714282*G0_1_1_3_4 + 0.0385714285714284*G0_1_1_3_5 + 0.0707142857142853*G0_1_1_4_0 - 0.0449999999999998*G0_1_1_4_1 + 0.0835714285714282*G0_1_1_4_3 + 0.398571428571427*G0_1_1_4_4 + 0.134999999999999*G0_1_1_4_5 + 0.202499999999999*G0_1_1_5_0 - 0.0707142857142853*G0_1_1_5_1 - 0.0224999999999999*G0_1_1_5_2 + 0.0385714285714284*G0_1_1_5_3 + 0.134999999999999*G0_1_1_5_4 + 0.359999999999998*G0_1_1_5_5; + A[77] = A[55] + 0.26517857142857*G0_0_0_0_0 - 0.0200892857142856*G0_0_0_0_1 - 0.00401785714285711*G0_0_0_0_2 + 0.0642857142857136*G0_0_0_0_4 + 0.0321428571428569*G0_0_0_0_5 - 0.0200892857142856*G0_0_0_1_0 + 0.0707142857142853*G0_0_0_1_1 - 0.00241071428571429*G0_0_0_1_2 + 0.0642857142857139*G0_0_0_1_3 + 0.0449999999999998*G0_0_0_1_4 + 0.0353571428571427*G0_0_0_1_5 - 0.0040178571428571*G0_0_0_2_0 - 0.00241071428571429*G0_0_0_2_1 - 0.0835714285714282*G0_0_0_2_2 - 0.0546428571428568*G0_0_0_2_3 - 0.00321428571428564*G0_0_0_2_4 - 0.0128571428571428*G0_0_0_2_5 + 0.0642857142857139*G0_0_0_3_1 - 0.0546428571428568*G0_0_0_3_2 - 0.0257142857142855*G0_0_0_3_3 - 0.0899999999999996*G0_0_0_3_4 + 0.0257142857142856*G0_0_0_3_5 + 0.0642857142857137*G0_0_0_4_0 + 0.0449999999999998*G0_0_0_4_1 - 0.00321428571428563*G0_0_0_4_2 - 0.0899999999999996*G0_0_0_4_3 - 0.514285714285712*G0_0_0_4_4 - 0.0642857142857141*G0_0_0_4_5 + 0.0321428571428569*G0_0_0_5_0 + 0.0353571428571427*G0_0_0_5_1 - 0.0128571428571428*G0_0_0_5_2 + 0.0257142857142856*G0_0_0_5_3 - 0.0642857142857141*G0_0_0_5_4 + 0.257142857142856*G0_0_0_5_5 - 0.00803571428571423*G0_0_1_0_1 + 0.00803571428571424*G0_0_1_0_2 + 0.0160714285714285*G0_0_1_0_4 - 0.0160714285714285*G0_0_1_0_5 - 0.00803571428571423*G0_0_1_1_0 + 0.0771428571428567*G0_0_1_1_1 + 0.0594642857142853*G0_0_1_1_3 + 0.0289285714285713*G0_0_1_1_4 + 0.0192857142857142*G0_0_1_1_5 + 0.00803571428571424*G0_0_1_2_0 - 0.0771428571428568*G0_0_1_2_2 - 0.0594642857142854*G0_0_1_2_3 - 0.0192857142857142*G0_0_1_2_4 - 0.0289285714285713*G0_0_1_2_5 + 0.0594642857142853*G0_0_1_3_1 - 0.0594642857142854*G0_0_1_3_2 - 0.0578571428571425*G0_0_1_3_4 + 0.0578571428571426*G0_0_1_3_5 + 0.0160714285714285*G0_0_1_4_0 + 0.0289285714285713*G0_0_1_4_1 - 0.0192857142857142*G0_0_1_4_2 - 0.0578571428571425*G0_0_1_4_3 - 0.385714285714284*G0_0_1_4_4 - 0.0160714285714285*G0_0_1_5_0 + 0.0192857142857142*G0_0_1_5_1 - 0.0289285714285713*G0_0_1_5_2 + 0.0578571428571426*G0_0_1_5_3 + 0.385714285714284*G0_0_1_5_5 - 0.00803571428571423*G0_1_0_0_1 + 0.00803571428571424*G0_1_0_0_2 + 0.0160714285714285*G0_1_0_0_4 - 0.0160714285714285*G0_1_0_0_5 - 0.00803571428571423*G0_1_0_1_0 + 0.0771428571428567*G0_1_0_1_1 + 0.0594642857142854*G0_1_0_1_3 + 0.0289285714285713*G0_1_0_1_4 + 0.0192857142857142*G0_1_0_1_5 + 0.00803571428571424*G0_1_0_2_0 - 0.0771428571428568*G0_1_0_2_2 - 0.0594642857142854*G0_1_0_2_3 - 0.0192857142857142*G0_1_0_2_4 - 0.0289285714285713*G0_1_0_2_5 + 0.0594642857142854*G0_1_0_3_1 - 0.0594642857142854*G0_1_0_3_2 - 0.0578571428571425*G0_1_0_3_4 + 0.0578571428571426*G0_1_0_3_5 + 0.0160714285714285*G0_1_0_4_0 + 0.0289285714285713*G0_1_0_4_1 - 0.0192857142857142*G0_1_0_4_2 - 0.0578571428571425*G0_1_0_4_3 - 0.385714285714284*G0_1_0_4_4 - 0.0160714285714285*G0_1_0_5_0 + 0.0192857142857142*G0_1_0_5_1 - 0.0289285714285713*G0_1_0_5_2 + 0.0578571428571426*G0_1_0_5_3 + 0.385714285714284*G0_1_0_5_5 - 0.26517857142857*G0_1_1_0_0 + 0.00401785714285711*G0_1_1_0_1 + 0.0200892857142856*G0_1_1_0_2 - 0.0321428571428569*G0_1_1_0_4 - 0.0642857142857138*G0_1_1_0_5 + 0.00401785714285712*G0_1_1_1_0 + 0.083571428571428*G0_1_1_1_1 + 0.00241071428571428*G0_1_1_1_2 + 0.0546428571428568*G0_1_1_1_3 + 0.0128571428571428*G0_1_1_1_4 + 0.00321428571428566*G0_1_1_1_5 + 0.0200892857142856*G0_1_1_2_0 + 0.00241071428571428*G0_1_1_2_1 - 0.0707142857142854*G0_1_1_2_2 - 0.064285714285714*G0_1_1_2_3 - 0.0353571428571427*G0_1_1_2_4 - 0.0449999999999999*G0_1_1_2_5 + 0.0546428571428568*G0_1_1_3_1 - 0.064285714285714*G0_1_1_3_2 + 0.0257142857142858*G0_1_1_3_3 - 0.0257142857142855*G0_1_1_3_4 + 0.0899999999999997*G0_1_1_3_5 - 0.0321428571428569*G0_1_1_4_0 + 0.0128571428571428*G0_1_1_4_1 - 0.0353571428571427*G0_1_1_4_2 - 0.0257142857142855*G0_1_1_4_3 - 0.257142857142856*G0_1_1_4_4 + 0.0642857142857141*G0_1_1_4_5 - 0.0642857142857138*G0_1_1_5_0 + 0.00321428571428566*G0_1_1_5_1 - 0.0449999999999999*G0_1_1_5_2 + 0.0899999999999997*G0_1_1_5_3 + 0.0642857142857141*G0_1_1_5_4 + 0.514285714285712*G0_1_1_5_5; + A[33] = -A[39] - 0.00803571428571427*G0_0_0_0_0 + 0.00160714285714285*G0_0_0_0_1 + 0.00321428571428571*G0_0_0_0_2 + 0.00321428571428568*G0_0_0_0_3 - 0.00964285714285713*G0_0_0_0_4 - 0.00642857142857141*G0_0_0_0_5 + 0.00160714285714285*G0_0_0_1_0 - 0.00803571428571422*G0_0_0_1_1 + 0.00321428571428569*G0_0_0_1_2 - 0.00964285714285712*G0_0_0_1_3 + 0.00321428571428571*G0_0_0_1_4 - 0.00642857142857139*G0_0_0_1_5 + 0.00321428571428571*G0_0_0_2_0 + 0.00321428571428569*G0_0_0_2_1 + 0.0482142857142855*G0_0_0_2_2 - 0.00642857142857138*G0_0_0_2_5 + 0.00321428571428567*G0_0_0_3_0 - 0.00964285714285712*G0_0_0_3_1 - 0.179999999999999*G0_0_0_3_3 - 0.0128571428571429*G0_0_0_3_4 + 0.00642857142857131*G0_0_0_3_5 - 0.00964285714285713*G0_0_0_4_0 + 0.00321428571428571*G0_0_0_4_1 - 0.0128571428571429*G0_0_0_4_3 - 0.179999999999999*G0_0_0_4_4 + 0.00642857142857134*G0_0_0_4_5 - 0.00642857142857141*G0_0_0_5_0 - 0.0064285714285714*G0_0_0_5_1 - 0.00642857142857137*G0_0_0_5_2 + 0.00642857142857134*G0_0_0_5_3 + 0.00642857142857134*G0_0_0_5_4 + 0.0385714285714284*G0_0_0_5_5 + 0.000803571428571409*G0_0_1_0_0 - 0.0136607142857142*G0_0_1_0_1 + 0.00160714285714286*G0_0_1_0_2 + 0.020892857142857*G0_0_1_0_3 - 0.0176785714285713*G0_0_1_0_5 - 0.0136607142857142*G0_0_1_1_0 + 0.0642857142857138*G0_0_1_1_1 - 0.00562499999999997*G0_0_1_1_2 + 0.0642857142857139*G0_0_1_1_3 + 0.0112499999999999*G0_0_1_1_4 + 0.0482142857142854*G0_0_1_1_5 + 0.00160714285714286*G0_0_1_2_0 - 0.00562499999999997*G0_0_1_2_1 + 0.0200892857142856*G0_0_1_2_2 - 0.020892857142857*G0_0_1_2_3 + 0.00482142857142852*G0_0_1_2_4 - 0.0241071428571428*G0_0_1_2_5 + 0.020892857142857*G0_0_1_3_0 + 0.0642857142857139*G0_0_1_3_1 - 0.020892857142857*G0_0_1_3_2 - 0.520714285714283*G0_0_1_3_3 - 0.0642857142857139*G0_0_1_3_4 + 0.00642857142857137*G0_0_1_3_5 + 0.0112499999999999*G0_0_1_4_1 + 0.00482142857142852*G0_0_1_4_2 - 0.0642857142857139*G0_0_1_4_3 + 0.00642857142857143*G0_0_1_4_4 + 0.0257142857142856*G0_0_1_4_5 - 0.0176785714285713*G0_0_1_5_0 + 0.0482142857142854*G0_0_1_5_1 - 0.0241071428571428*G0_0_1_5_2 + 0.00642857142857137*G0_0_1_5_3 + 0.0257142857142856*G0_0_1_5_4 + 0.186428571428571*G0_0_1_5_5 - 0.0040178571428571*G0_1_0_0_0 + 0.00160714285714283*G0_1_0_0_1 + 0.000803571428571431*G0_1_0_0_2 + 0.00160714285714283*G0_1_0_0_3 - 0.00321428571428572*G0_1_0_0_4 - 0.00482142857142856*G0_1_0_0_5 + 0.00160714285714283*G0_1_0_1_0 - 0.0160714285714283*G0_1_0_1_1 + 0.00160714285714284*G0_1_0_1_2 - 0.0160714285714284*G0_1_0_1_3 + 0.00482142857142854*G0_1_0_1_4 + 0.000803571428571432*G0_1_0_2_0 + 0.00160714285714284*G0_1_0_2_1 + 0.00401785714285706*G0_1_0_2_2 + 0.0112499999999999*G0_1_0_2_3 + 0.00482142857142854*G0_1_0_2_4 + 0.00160714285714284*G0_1_0_2_5 + 0.00160714285714283*G0_1_0_3_0 - 0.0160714285714284*G0_1_0_3_1 + 0.0112499999999999*G0_1_0_3_2 - 0.0578571428571425*G0_1_0_3_3 - 0.0128571428571428*G0_1_0_3_4 - 0.00642857142857137*G0_1_0_3_5 - 0.00321428571428572*G0_1_0_4_0 + 0.00482142857142854*G0_1_0_4_1 + 0.00482142857142854*G0_1_0_4_2 - 0.0128571428571428*G0_1_0_4_3 - 0.0449999999999997*G0_1_0_4_4 - 0.0128571428571428*G0_1_0_4_5 - 0.00482142857142856*G0_1_0_5_0 + 0.00160714285714284*G0_1_0_5_2 - 0.00642857142857138*G0_1_0_5_3 - 0.0128571428571428*G0_1_0_5_4 + 0.00642857142857153*G0_1_0_5_5 + 0.00964285714285708*G0_1_1_0_0 - 0.0522321428571425*G0_1_1_0_1 + 0.00723214285714282*G0_1_1_0_2 - 0.0257142857142856*G0_1_1_0_3 - 0.0128571428571428*G0_1_1_0_4 - 0.0867857142857137*G0_1_1_0_5 - 0.0522321428571425*G0_1_1_1_0 + 0.458035714285712*G0_1_1_1_1 - 0.0361607142857141*G0_1_1_1_2 + 0.128571428571428*G0_1_1_1_3 + 0.0160714285714285*G0_1_1_1_4 + 0.257142857142856*G0_1_1_1_5 + 0.00723214285714282*G0_1_1_2_0 - 0.0361607142857141*G0_1_1_2_1 + 0.0128571428571428*G0_1_1_2_2 - 0.00964285714285709*G0_1_1_2_3 - 0.0385714285714284*G0_1_1_2_5 - 0.0257142857142856*G0_1_1_3_0 + 0.128571428571428*G0_1_1_3_1 - 0.0096428571428571*G0_1_1_3_2 + 0.0192857142857142*G0_1_1_3_4 + 0.128571428571428*G0_1_1_3_5 - 0.0128571428571428*G0_1_1_4_0 + 0.0160714285714285*G0_1_1_4_1 + 0.0192857142857142*G0_1_1_4_3 + 0.0128571428571428*G0_1_1_4_4 + 0.0449999999999998*G0_1_1_4_5 - 0.0867857142857137*G0_1_1_5_0 + 0.257142857142856*G0_1_1_5_1 - 0.0385714285714284*G0_1_1_5_2 + 0.128571428571428*G0_1_1_5_3 + 0.0449999999999998*G0_1_1_5_4 + 0.514285714285712*G0_1_1_5_5; + A[83] = -A[33] + 0.0233035714285713*G0_0_0_0_0 + 0.00401785714285709*G0_0_0_0_1 - 0.00642857142857139*G0_0_0_0_2 - 0.062678571428571*G0_0_0_0_3 - 0.0289285714285712*G0_0_0_0_4 - 0.0337499999999998*G0_0_0_0_5 + 0.00401785714285709*G0_0_0_1_0 - 0.0241071428571426*G0_0_0_1_1 - 0.00401785714285713*G0_0_0_1_2 - 0.0321428571428569*G0_0_0_1_3 - 0.0241071428571427*G0_0_0_1_4 - 0.0160714285714285*G0_0_0_1_5 - 0.00642857142857139*G0_0_0_2_0 - 0.00401785714285713*G0_0_0_2_1 + 0.100446428571428*G0_0_0_2_2 - 0.0144642857142857*G0_0_0_2_3 + 0.0305357142857141*G0_0_0_2_4 - 0.0337499999999999*G0_0_0_2_5 - 0.062678571428571*G0_0_0_3_0 - 0.0321428571428569*G0_0_0_3_1 - 0.0144642857142857*G0_0_0_3_2 + 0.578571428571425*G0_0_0_3_3 + 0.173571428571428*G0_0_0_3_4 + 0.192857142857142*G0_0_0_3_5 - 0.0289285714285712*G0_0_0_4_0 - 0.0241071428571427*G0_0_0_4_1 + 0.0305357142857141*G0_0_0_4_2 + 0.173571428571428*G0_0_0_4_3 + 0.295714285714284*G0_0_0_4_4 + 0.115714285714285*G0_0_0_4_5 - 0.0337499999999998*G0_0_0_5_0 - 0.0160714285714285*G0_0_0_5_1 - 0.0337499999999999*G0_0_0_5_2 + 0.192857142857142*G0_0_0_5_3 + 0.115714285714285*G0_0_0_5_4 + 0.192857142857142*G0_0_0_5_5 + 0.00642857142857136*G0_0_1_0_0 + 0.0120535714285713*G0_0_1_0_1 + 0.00241071428571429*G0_0_1_0_2 - 0.0160714285714285*G0_0_1_0_3 - 0.00482142857142855*G0_0_1_0_4 - 0.0160714285714285*G0_0_1_0_5 + 0.0120535714285713*G0_0_1_1_0 - 0.26517857142857*G0_0_1_1_1 + 0.0120535714285714*G0_0_1_1_2 - 0.0482142857142853*G0_0_1_1_3 - 0.0482142857142853*G0_0_1_1_5 + 0.00241071428571429*G0_0_1_2_0 + 0.0120535714285714*G0_0_1_2_1 + 0.00642857142857132*G0_0_1_2_2 - 0.0160714285714286*G0_0_1_2_3 - 0.00482142857142863*G0_0_1_2_4 - 0.0160714285714286*G0_0_1_2_5 - 0.0160714285714285*G0_0_1_3_0 - 0.0482142857142853*G0_0_1_3_1 - 0.0160714285714286*G0_0_1_3_2 + 0.128571428571428*G0_0_1_3_3 + 0.0321428571428571*G0_0_1_3_4 + 0.0642857142857142*G0_0_1_3_5 - 0.00482142857142855*G0_0_1_4_0 - 0.00482142857142863*G0_0_1_4_2 + 0.0321428571428571*G0_0_1_4_3 + 0.0257142857142856*G0_0_1_4_4 + 0.0321428571428571*G0_0_1_4_5 - 0.0160714285714285*G0_0_1_5_0 - 0.0482142857142854*G0_0_1_5_1 - 0.0160714285714286*G0_0_1_5_2 + 0.0642857142857142*G0_0_1_5_3 + 0.0321428571428571*G0_0_1_5_4 + 0.128571428571428*G0_0_1_5_5; + A[75] = A[83] - 0.0827678571428569*G0_0_0_0_0 + 0.0184821428571428*G0_0_0_0_2 - 0.0128571428571428*G0_0_0_0_3 - 0.0803571428571425*G0_0_0_0_4 - 0.0273214285714285*G0_0_0_0_5 + 0.0827678571428565*G0_0_0_1_1 - 0.0184821428571428*G0_0_0_1_2 + 0.0803571428571425*G0_0_0_1_3 + 0.0128571428571428*G0_0_0_1_4 + 0.0273214285714284*G0_0_0_1_5 + 0.0184821428571428*G0_0_0_2_0 - 0.0184821428571428*G0_0_0_2_1 - 0.0192857142857142*G0_0_0_2_3 + 0.0192857142857142*G0_0_0_2_4 - 0.0128571428571428*G0_0_0_3_0 + 0.0803571428571424*G0_0_0_3_1 - 0.0192857142857142*G0_0_0_3_2 + 0.23142857142857*G0_0_0_3_3 + 0.0257142857142857*G0_0_0_3_5 - 0.0803571428571425*G0_0_0_4_0 + 0.0128571428571428*G0_0_0_4_1 + 0.0192857142857142*G0_0_0_4_2 - 0.23142857142857*G0_0_0_4_4 - 0.0257142857142856*G0_0_0_4_5 - 0.0273214285714285*G0_0_0_5_0 + 0.0273214285714284*G0_0_0_5_1 + 0.0257142857142857*G0_0_0_5_3 - 0.0257142857142856*G0_0_0_5_4 + 0.288482142857141*G0_0_1_0_0 - 0.0409821428571426*G0_0_1_0_1 - 0.0144642857142856*G0_0_1_0_2 - 0.0176785714285713*G0_0_1_0_3 + 0.062678571428571*G0_0_1_0_4 + 0.0594642857142854*G0_0_1_0_5 - 0.0409821428571426*G0_0_1_1_0 + 0.371249999999998*G0_0_1_1_1 - 0.0329464285714284*G0_0_1_1_2 + 0.143035714285713*G0_0_1_1_3 - 0.00482142857142853*G0_0_1_1_4 + 0.0867857142857137*G0_0_1_1_5 - 0.0144642857142856*G0_0_1_2_0 - 0.0329464285714284*G0_0_1_2_1 + 0.0152678571428571*G0_0_1_2_2 - 0.0289285714285713*G0_0_1_2_3 - 0.00964285714285708*G0_0_1_2_4 - 0.0176785714285713*G0_0_1_2_5 - 0.0176785714285713*G0_0_1_3_0 + 0.143035714285713*G0_0_1_3_1 - 0.0289285714285713*G0_0_1_3_2 + 0.269999999999998*G0_0_1_3_3 + 0.0449999999999998*G0_0_1_3_4 + 0.0707142857142854*G0_0_1_3_5 + 0.062678571428571*G0_0_1_4_0 - 0.00482142857142853*G0_0_1_4_1 - 0.00964285714285708*G0_0_1_4_2 + 0.0449999999999998*G0_0_1_4_3 + 0.0385714285714283*G0_0_1_4_4 + 0.0449999999999997*G0_0_1_4_5 + 0.0594642857142854*G0_0_1_5_0 + 0.0867857142857137*G0_0_1_5_1 - 0.0176785714285713*G0_0_1_5_2 + 0.0707142857142854*G0_0_1_5_3 + 0.0449999999999997*G0_0_1_5_4 + 0.0128571428571425*G0_0_1_5_5 + 0.0297321428571427*G0_1_0_0_0 - 0.0168749999999999*G0_1_0_0_1 - 0.0337499999999998*G0_1_0_0_3 + 0.0096428571428572*G0_1_0_0_4 - 0.00482142857142849*G0_1_0_0_5 - 0.0168749999999999*G0_1_0_1_0 + 0.112499999999999*G0_1_0_1_1 - 0.0184821428571428*G0_1_0_1_2 + 0.0899999999999996*G0_1_0_1_3 - 0.020892857142857*G0_1_0_1_4 + 0.0224999999999998*G0_1_0_1_5 - 0.0184821428571428*G0_1_0_2_1 + 0.0281249999999998*G0_1_0_2_2 - 0.0498214285714284*G0_1_0_2_3 - 0.0305357142857142*G0_1_0_2_4 - 0.0498214285714284*G0_1_0_2_5 - 0.0337499999999998*G0_1_0_3_0 + 0.0899999999999996*G0_1_0_3_1 - 0.0498214285714284*G0_1_0_3_2 + 0.424285714285712*G0_1_0_3_3 + 0.109285714285714*G0_1_0_3_4 + 0.167142857142857*G0_1_0_3_5 + 0.0096428571428572*G0_1_0_4_0 - 0.0208928571428571*G0_1_0_4_1 - 0.0305357142857142*G0_1_0_4_2 + 0.109285714285714*G0_1_0_4_3 + 0.192857142857142*G0_1_0_4_4 + 0.141428571428571*G0_1_0_4_5 - 0.0048214285714285*G0_1_0_5_0 + 0.0224999999999998*G0_1_0_5_1 - 0.0498214285714284*G0_1_0_5_2 + 0.167142857142857*G0_1_0_5_3 + 0.141428571428571*G0_1_0_5_4 + 0.269999999999999*G0_1_0_5_5 - 0.0610714285714283*G0_1_1_0_0 - 0.0289285714285712*G0_1_1_0_1 + 0.0144642857142856*G0_1_1_0_2 - 0.0466071428571426*G0_1_1_0_3 - 0.0385714285714283*G0_1_1_0_4 - 0.128571428571428*G0_1_1_0_5 - 0.0289285714285712*G0_1_1_1_0 + 0.462053571428569*G0_1_1_1_1 - 0.047410714285714*G0_1_1_1_2 + 0.191249999999999*G0_1_1_1_3 + 0.00803571428571426*G0_1_1_1_4 + 0.210535714285713*G0_1_1_1_5 + 0.0144642857142856*G0_1_1_2_0 - 0.047410714285714*G0_1_1_2_1 + 0.0216964285714285*G0_1_1_2_2 - 0.0482142857142855*G0_1_1_2_3 - 0.01125*G0_1_1_2_4 - 0.0337499999999999*G0_1_1_2_5 - 0.0466071428571426*G0_1_1_3_0 + 0.191249999999999*G0_1_1_3_1 - 0.0482142857142856*G0_1_1_3_2 + 0.372857142857141*G0_1_1_3_3 + 0.0771428571428568*G0_1_1_3_4 + 0.160714285714285*G0_1_1_3_5 - 0.0385714285714283*G0_1_1_4_0 + 0.00803571428571426*G0_1_1_4_1 - 0.01125*G0_1_1_4_2 + 0.0771428571428568*G0_1_1_4_3 + 0.0899999999999995*G0_1_1_4_4 + 0.0514285714285713*G0_1_1_4_5 - 0.128571428571428*G0_1_1_5_0 + 0.210535714285713*G0_1_1_5_1 - 0.0337499999999999*G0_1_1_5_2 + 0.160714285714285*G0_1_1_5_3 + 0.0514285714285713*G0_1_1_5_4 + 0.141428571428571*G0_1_1_5_5; + A[57] = A[75] - 0.26517857142857*G0_0_1_0_0 + 0.0120535714285713*G0_0_1_0_1 + 0.0120535714285713*G0_0_1_0_2 - 0.0482142857142853*G0_0_1_0_4 - 0.0482142857142854*G0_0_1_0_5 + 0.0120535714285713*G0_0_1_1_0 + 0.00642857142857137*G0_0_1_1_1 + 0.00241071428571428*G0_0_1_1_2 - 0.00482142857142853*G0_0_1_1_3 - 0.0160714285714285*G0_0_1_1_4 - 0.0160714285714285*G0_0_1_1_5 + 0.0120535714285713*G0_0_1_2_0 + 0.00241071428571428*G0_0_1_2_1 + 0.00642857142857142*G0_0_1_2_2 - 0.00482142857142858*G0_0_1_2_3 - 0.0160714285714285*G0_0_1_2_4 - 0.0160714285714285*G0_0_1_2_5 - 0.00482142857142853*G0_0_1_3_1 - 0.00482142857142858*G0_0_1_3_2 + 0.0257142857142856*G0_0_1_3_3 + 0.032142857142857*G0_0_1_3_4 + 0.032142857142857*G0_0_1_3_5 - 0.0482142857142853*G0_0_1_4_0 - 0.0160714285714285*G0_0_1_4_1 - 0.0160714285714285*G0_0_1_4_2 + 0.032142857142857*G0_0_1_4_3 + 0.128571428571428*G0_0_1_4_4 + 0.0642857142857141*G0_0_1_4_5 - 0.0482142857142854*G0_0_1_5_0 - 0.0160714285714285*G0_0_1_5_1 - 0.0160714285714285*G0_0_1_5_2 + 0.032142857142857*G0_0_1_5_3 + 0.0642857142857141*G0_0_1_5_4 + 0.128571428571428*G0_0_1_5_5 + 0.26517857142857*G0_1_0_0_0 - 0.0120535714285713*G0_1_0_0_1 - 0.0120535714285713*G0_1_0_0_2 + 0.0482142857142853*G0_1_0_0_4 + 0.0482142857142854*G0_1_0_0_5 - 0.0120535714285713*G0_1_0_1_0 - 0.00642857142857137*G0_1_0_1_1 - 0.00241071428571428*G0_1_0_1_2 + 0.00482142857142853*G0_1_0_1_3 + 0.0160714285714285*G0_1_0_1_4 + 0.0160714285714285*G0_1_0_1_5 - 0.0120535714285713*G0_1_0_2_0 - 0.00241071428571428*G0_1_0_2_1 - 0.00642857142857142*G0_1_0_2_2 + 0.00482142857142858*G0_1_0_2_3 + 0.0160714285714285*G0_1_0_2_4 + 0.0160714285714285*G0_1_0_2_5 + 0.00482142857142853*G0_1_0_3_1 + 0.00482142857142858*G0_1_0_3_2 - 0.0257142857142856*G0_1_0_3_3 - 0.032142857142857*G0_1_0_3_4 - 0.032142857142857*G0_1_0_3_5 + 0.0482142857142853*G0_1_0_4_0 + 0.0160714285714285*G0_1_0_4_1 + 0.0160714285714285*G0_1_0_4_2 - 0.032142857142857*G0_1_0_4_3 - 0.128571428571428*G0_1_0_4_4 - 0.0642857142857141*G0_1_0_4_5 + 0.0482142857142854*G0_1_0_5_0 + 0.0160714285714285*G0_1_0_5_1 + 0.0160714285714285*G0_1_0_5_2 - 0.032142857142857*G0_1_0_5_3 - 0.0642857142857141*G0_1_0_5_4 - 0.128571428571428*G0_1_0_5_5; + A[81] = -A[61] - 0.0198214285714284*G0_0_0_0_0 + 0.0126339285714285*G0_0_0_0_1 + 0.00486607142857141*G0_0_0_0_2 + 0.00553571428571424*G0_0_0_0_3 - 0.00321428571428568*G0_0_0_0_4 + 0.0126339285714285*G0_0_0_1_0 - 0.19017857142857*G0_0_0_1_1 + 0.0148660714285713*G0_0_0_1_2 - 0.0660714285714282*G0_0_0_1_3 + 0.0019642857142857*G0_0_0_1_4 - 0.0410714285714283*G0_0_0_1_5 + 0.00486607142857141*G0_0_0_2_0 + 0.0148660714285713*G0_0_0_2_1 - 0.0404464285714285*G0_0_0_2_2 + 0.0121428571428571*G0_0_0_2_3 - 0.0142857142857143*G0_0_0_2_4 + 0.00946428571428566*G0_0_0_2_5 + 0.00553571428571424*G0_0_0_3_0 - 0.0660714285714282*G0_0_0_3_1 + 0.0121428571428571*G0_0_0_3_2 - 0.0485714285714283*G0_0_0_3_3 - 0.0149999999999999*G0_0_0_3_4 - 0.0299999999999998*G0_0_0_3_5 - 0.00321428571428568*G0_0_0_4_0 + 0.0019642857142857*G0_0_0_4_1 - 0.0142857142857143*G0_0_0_4_2 - 0.0149999999999999*G0_0_0_4_3 - 0.0885714285714282*G0_0_0_4_4 - 0.0228571428571428*G0_0_0_4_5 - 0.0410714285714283*G0_0_0_5_1 + 0.00946428571428566*G0_0_0_5_2 - 0.0299999999999998*G0_0_0_5_3 - 0.0228571428571428*G0_0_0_5_4 - 0.0628571428571425*G0_0_0_5_5 - 0.0117857142857142*G0_1_0_0_0 + 0.0209374999999998*G0_1_0_0_1 - 0.00183035714285712*G0_1_0_0_2 + 0.0119642857142856*G0_1_0_0_3 + 0.00642857142857141*G0_1_0_0_4 + 0.0224999999999999*G0_1_0_0_5 + 0.0209374999999998*G0_1_0_1_0 - 0.243749999999999*G0_1_0_1_1 + 0.0204910714285713*G0_1_0_1_2 - 0.0874999999999995*G0_1_0_1_3 - 0.00660714285714283*G0_1_0_1_4 - 0.0946428571428566*G0_1_0_1_5 - 0.00183035714285712*G0_1_0_2_0 + 0.0204910714285713*G0_1_0_2_1 - 0.0286607142857143*G0_1_0_2_2 + 0.0174999999999999*G0_1_0_2_3 - 0.00571428571428572*G0_1_0_2_4 + 0.0116071428571428*G0_1_0_2_5 + 0.0119642857142856*G0_1_0_3_0 - 0.0874999999999995*G0_1_0_3_1 + 0.0174999999999999*G0_1_0_3_2 - 0.074285714285714*G0_1_0_3_3 - 0.0107142857142857*G0_1_0_3_4 - 0.0471428571428569*G0_1_0_3_5 + 0.00642857142857141*G0_1_0_4_0 - 0.00660714285714283*G0_1_0_4_1 - 0.00571428571428572*G0_1_0_4_2 - 0.0107142857142857*G0_1_0_4_3 + 0.0399999999999998*G0_1_0_4_4 - 0.00999999999999994*G0_1_0_4_5 + 0.0224999999999999*G0_1_0_5_0 - 0.0946428571428566*G0_1_0_5_1 + 0.0116071428571428*G0_1_0_5_2 - 0.0471428571428569*G0_1_0_5_3 - 0.00999999999999994*G0_1_0_5_4 - 0.088571428571428*G0_1_0_5_5; + A[31] = -A[81] - 0.0230357142857141*G0_0_0_0_0 + 0.00758928571428565*G0_0_0_0_1 + 0.00508928571428569*G0_0_0_0_2 + 0.00714285714285708*G0_0_0_0_3 - 0.00571428571428568*G0_0_0_0_4 - 0.0017857142857143*G0_0_0_0_5 + 0.00758928571428565*G0_0_0_1_0 - 0.152678571428571*G0_0_0_1_1 + 0.00758928571428566*G0_0_0_1_2 - 0.0214285714285712*G0_0_0_1_3 + 0.00892857142857138*G0_0_0_1_4 - 0.0214285714285713*G0_0_0_1_5 + 0.00508928571428569*G0_0_0_2_0 + 0.00758928571428566*G0_0_0_2_1 - 0.0230357142857142*G0_0_0_2_2 - 0.0017857142857143*G0_0_0_2_3 - 0.00571428571428572*G0_0_0_2_4 + 0.00714285714285709*G0_0_0_2_5 + 0.00714285714285708*G0_0_0_3_0 - 0.0214285714285712*G0_0_0_3_1 - 0.0017857142857143*G0_0_0_3_2 - 0.0571428571428567*G0_0_0_3_3 - 0.032142857142857*G0_0_0_3_4 - 0.0285714285714284*G0_0_0_3_5 - 0.00571428571428568*G0_0_0_4_0 + 0.00892857142857138*G0_0_0_4_1 - 0.00571428571428572*G0_0_0_4_2 - 0.032142857142857*G0_0_0_4_3 - 0.109999999999999*G0_0_0_4_4 - 0.032142857142857*G0_0_0_4_5 - 0.0017857142857143*G0_0_0_5_0 - 0.0214285714285713*G0_0_0_5_1 + 0.00714285714285709*G0_0_0_5_2 - 0.0285714285714284*G0_0_0_5_3 - 0.032142857142857*G0_0_0_5_4 - 0.0571428571428569*G0_0_0_5_5; + A[63] = -A[68] - 0.0024107142857143*G0_0_0_0_0 - 0.000401785714285708*G0_0_0_0_1 - 0.0164732142857142*G0_0_0_0_2 + 0.00642857142857138*G0_0_0_0_3 - 0.0257142857142856*G0_0_0_0_4 - 0.00160714285714286*G0_0_0_0_5 - 0.000401785714285708*G0_0_0_1_0 - 0.0080357142857143*G0_0_0_1_1 - 0.00441964285714284*G0_0_0_1_2 + 0.0160714285714285*G0_0_0_1_3 - 0.0032142857142857*G0_0_0_1_4 - 0.0164732142857142*G0_0_0_2_0 - 0.00441964285714284*G0_0_0_2_1 + 0.168749999999999*G0_0_0_2_2 + 0.00803571428571432*G0_0_0_2_3 + 0.0883928571428568*G0_0_0_2_4 - 0.00321428571428567*G0_0_0_2_5 + 0.00642857142857138*G0_0_0_3_0 + 0.0160714285714285*G0_0_0_3_1 + 0.00803571428571433*G0_0_0_3_2 - 0.154285714285714*G0_0_0_3_3 - 0.0064285714285714*G0_0_0_3_4 - 0.00642857142857141*G0_0_0_3_5 - 0.0257142857142856*G0_0_0_4_0 - 0.0032142857142857*G0_0_0_4_1 + 0.0883928571428568*G0_0_0_4_2 - 0.0064285714285714*G0_0_0_4_3 + 0.167142857142856*G0_0_0_4_4 + 0.0128571428571429*G0_0_0_4_5 - 0.00160714285714286*G0_0_0_5_0 - 0.00321428571428567*G0_0_0_5_2 - 0.00642857142857141*G0_0_0_5_3 + 0.0128571428571429*G0_0_0_5_4 + 0.0385714285714286*G0_0_0_5_5 + 0.041785714285714*G0_1_0_0_0 + 0.0028125*G0_1_0_0_1 - 0.00281249999999998*G0_1_0_0_2 - 0.0144642857142857*G0_1_0_0_3 - 0.0241071428571428*G0_1_0_0_4 - 0.0192857142857142*G0_1_0_0_5 + 0.0028125*G0_1_0_1_0 - 0.00120535714285715*G0_1_0_1_2 - 0.00160714285714285*G0_1_0_1_4 - 0.00281249999999998*G0_1_0_2_0 - 0.00120535714285715*G0_1_0_2_1 + 0.124553571428571*G0_1_0_2_2 - 0.00964285714285701*G0_1_0_2_3 + 0.0337499999999999*G0_1_0_2_4 - 0.00803571428571425*G0_1_0_2_5 - 0.0144642857142857*G0_1_0_3_0 - 0.00964285714285701*G0_1_0_3_2 - 0.0128571428571424*G0_1_0_3_3 + 0.032142857142857*G0_1_0_3_4 + 0.0449999999999999*G0_1_0_3_5 - 0.0241071428571428*G0_1_0_4_0 - 0.00160714285714284*G0_1_0_4_1 + 0.0337499999999999*G0_1_0_4_2 + 0.032142857142857*G0_1_0_4_3 - 0.179999999999999*G0_1_0_4_4 + 0.0192857142857142*G0_1_0_4_5 - 0.0192857142857142*G0_1_0_5_0 - 0.00803571428571425*G0_1_0_5_2 + 0.0449999999999999*G0_1_0_5_3 + 0.0192857142857142*G0_1_0_5_4 - 0.0771428571428565*G0_1_0_5_5; + A[45] = -A[63] + 0.00642857142857141*G0_0_0_0_0 - 0.00160714285714286*G0_0_0_0_1 - 0.0241071428571427*G0_0_0_0_2 + 0.00321428571428571*G0_0_0_0_5 - 0.00160714285714286*G0_0_0_1_0 + 0.0064285714285714*G0_0_0_1_1 - 0.0241071428571427*G0_0_0_1_2 + 0.0032142857142857*G0_0_0_1_5 - 0.0241071428571427*G0_0_0_2_0 - 0.0241071428571427*G0_0_0_2_1 + 0.337499999999999*G0_0_0_2_2 + 0.0964285714285709*G0_0_0_2_3 + 0.0964285714285709*G0_0_0_2_4 + 0.0964285714285709*G0_0_0_3_2 + 0.0964285714285709*G0_0_0_4_2 + 0.00321428571428571*G0_0_0_5_0 + 0.0032142857142857*G0_0_0_5_1 + 0.0257142857142856*G0_0_0_5_5 - 0.0112500000000001*G0_0_1_0_0 - 0.000803571428571427*G0_0_1_0_1 - 0.00401785714285708*G0_0_1_0_2 - 0.00642857142857137*G0_0_1_0_3 + 0.00642857142857141*G0_0_1_0_4 - 0.0080357142857143*G0_0_1_0_5 - 0.000803571428571428*G0_0_1_1_0 + 0.0176785714285714*G0_0_1_1_1 - 0.0200892857142856*G0_0_1_1_2 - 0.00642857142857136*G0_0_1_1_3 + 0.00642857142857141*G0_0_1_1_4 + 0.01125*G0_0_1_1_5 - 0.00401785714285708*G0_0_1_2_0 - 0.0200892857142856*G0_0_1_2_1 + 0.168749999999999*G0_0_1_2_2 + 0.0803571428571424*G0_0_1_2_3 + 0.0160714285714284*G0_0_1_2_4 - 0.00642857142857137*G0_0_1_3_0 - 0.00642857142857137*G0_0_1_3_1 + 0.0803571428571424*G0_0_1_3_2 + 0.128571428571428*G0_0_1_3_3 + 0.0128571428571428*G0_0_1_3_5 + 0.0064285714285714*G0_0_1_4_0 + 0.00642857142857141*G0_0_1_4_1 + 0.0160714285714284*G0_0_1_4_2 - 0.128571428571428*G0_0_1_4_4 - 0.0128571428571428*G0_0_1_4_5 - 0.0080357142857143*G0_0_1_5_0 + 0.01125*G0_0_1_5_1 + 0.0128571428571428*G0_0_1_5_3 - 0.0128571428571428*G0_0_1_5_4 + 0.0128571428571428*G0_0_1_5_5 + 0.00241071428571434*G0_1_0_0_0 - 0.00080357142857144*G0_1_0_0_1 - 0.00803571428571423*G0_1_0_0_2 - 0.0128571428571428*G0_1_0_0_3 - 0.0032142857142857*G0_1_0_0_4 - 0.00160714285714286*G0_1_0_0_5 - 0.000803571428571439*G0_1_0_1_0 + 0.00401785714285723*G0_1_0_1_1 - 0.0160714285714285*G0_1_0_1_2 + 0.00321428571428575*G0_1_0_1_3 + 0.0128571428571428*G0_1_0_1_4 + 0.0048214285714286*G0_1_0_1_5 - 0.00803571428571423*G0_1_0_2_0 - 0.0160714285714285*G0_1_0_2_1 + 0.168749999999999*G0_1_0_2_2 + 0.0482142857142855*G0_1_0_2_3 + 0.0482142857142855*G0_1_0_2_4 - 0.0128571428571428*G0_1_0_3_0 + 0.00321428571428575*G0_1_0_3_1 + 0.0482142857142854*G0_1_0_3_2 + 0.192857142857142*G0_1_0_3_3 + 0.0257142857142857*G0_1_0_3_5 - 0.0032142857142857*G0_1_0_4_0 + 0.0128571428571428*G0_1_0_4_1 + 0.0482142857142855*G0_1_0_4_2 - 0.192857142857142*G0_1_0_4_4 - 0.0257142857142856*G0_1_0_4_5 - 0.00160714285714286*G0_1_0_5_0 + 0.0048214285714286*G0_1_0_5_1 + 0.0257142857142857*G0_1_0_5_3 - 0.0257142857142856*G0_1_0_5_4 + 0.0128571428571429*G0_1_0_5_5 - 0.0112500000000002*G0_1_1_0_0 + 0.000401785714285729*G0_1_1_0_1 - 0.00200892857142853*G0_1_1_0_2 - 0.00160714285714284*G0_1_1_0_3 + 0.00964285714285702*G0_1_1_0_4 - 0.00321428571428582*G0_1_1_0_5 + 0.000401785714285729*G0_1_1_1_0 + 0.00401785714285719*G0_1_1_1_1 - 0.0140624999999999*G0_1_1_1_2 + 0.00642857142857143*G0_1_1_1_3 + 0.0176785714285713*G0_1_1_1_4 + 0.00964285714285713*G0_1_1_1_5 - 0.00200892857142853*G0_1_1_2_0 - 0.0140624999999999*G0_1_1_2_1 + 0.0482142857142854*G0_1_1_2_2 + 0.0482142857142854*G0_1_1_2_3 + 0.0160714285714285*G0_1_1_2_4 + 0.00803571428571426*G0_1_1_2_5 - 0.00160714285714284*G0_1_1_3_0 + 0.00642857142857143*G0_1_1_3_1 + 0.0482142857142854*G0_1_1_3_2 + 0.192857142857142*G0_1_1_3_3 - 0.0321428571428569*G0_1_1_3_4 - 0.0128571428571427*G0_1_1_3_5 + 0.00964285714285702*G0_1_1_4_0 + 0.0176785714285713*G0_1_1_4_1 + 0.0160714285714285*G0_1_1_4_2 - 0.0321428571428569*G0_1_1_4_3 - 0.128571428571428*G0_1_1_4_4 - 0.0514285714285712*G0_1_1_4_5 - 0.00321428571428582*G0_1_1_5_0 + 0.00964285714285713*G0_1_1_5_1 + 0.00803571428571426*G0_1_1_5_2 - 0.0128571428571427*G0_1_1_5_3 - 0.0514285714285712*G0_1_1_5_4 - 0.102857142857142*G0_1_1_5_5; + A[36] = A[63] + 0.00160714285714288*G0_0_1_0_0 + 0.00200892857142857*G0_0_1_0_1 - 0.00361607142857142*G0_0_1_0_2 - 0.00482142857142857*G0_0_1_0_3 - 0.00803571428571428*G0_0_1_0_4 - 0.0032142857142857*G0_0_1_0_5 + 0.00200892857142857*G0_0_1_1_0 - 0.0120535714285714*G0_0_1_1_1 + 0.000401785714285697*G0_0_1_1_2 + 0.00160714285714283*G0_0_1_1_3 + 0.00160714285714284*G0_0_1_1_4 - 0.00964285714285713*G0_0_1_1_5 - 0.00361607142857142*G0_0_1_2_0 + 0.000401785714285697*G0_0_1_2_1 + 0.1125*G0_0_1_2_2 - 0.00803571428571419*G0_0_1_2_3 + 0.0241071428571428*G0_0_1_2_4 - 0.00482142857142853*G0_0_1_2_5 - 0.00482142857142857*G0_0_1_3_0 + 0.00160714285714283*G0_0_1_3_1 - 0.00803571428571418*G0_0_1_3_2 - 0.038571428571428*G0_0_1_3_3 + 0.00642857142857144*G0_0_1_3_4 + 0.0192857142857142*G0_0_1_3_5 - 0.00803571428571428*G0_0_1_4_0 + 0.00160714285714285*G0_0_1_4_1 + 0.0241071428571428*G0_0_1_4_2 + 0.00642857142857144*G0_0_1_4_3 - 0.102857142857142*G0_0_1_4_4 + 0.00642857142857141*G0_0_1_4_5 - 0.0032142857142857*G0_0_1_5_0 - 0.00964285714285713*G0_0_1_5_1 - 0.00482142857142853*G0_0_1_5_2 + 0.0192857142857142*G0_0_1_5_3 + 0.00642857142857141*G0_0_1_5_4 - 0.00160714285714288*G0_1_0_0_0 - 0.00200892857142857*G0_1_0_0_1 + 0.00361607142857142*G0_1_0_0_2 + 0.00482142857142857*G0_1_0_0_3 + 0.00803571428571428*G0_1_0_0_4 + 0.0032142857142857*G0_1_0_0_5 - 0.00200892857142857*G0_1_0_1_0 + 0.0120535714285714*G0_1_0_1_1 - 0.000401785714285698*G0_1_0_1_2 - 0.00160714285714283*G0_1_0_1_3 - 0.00160714285714285*G0_1_0_1_4 + 0.00964285714285713*G0_1_0_1_5 + 0.00361607142857142*G0_1_0_2_0 - 0.000401785714285698*G0_1_0_2_1 - 0.1125*G0_1_0_2_2 + 0.00803571428571419*G0_1_0_2_3 - 0.0241071428571428*G0_1_0_2_4 + 0.00482142857142853*G0_1_0_2_5 + 0.00482142857142857*G0_1_0_3_0 - 0.00160714285714283*G0_1_0_3_1 + 0.00803571428571419*G0_1_0_3_2 + 0.038571428571428*G0_1_0_3_3 - 0.00642857142857143*G0_1_0_3_4 - 0.0192857142857142*G0_1_0_3_5 + 0.00803571428571428*G0_1_0_4_0 - 0.00160714285714285*G0_1_0_4_1 - 0.0241071428571428*G0_1_0_4_2 - 0.00642857142857143*G0_1_0_4_3 + 0.102857142857142*G0_1_0_4_4 - 0.00642857142857141*G0_1_0_4_5 + 0.0032142857142857*G0_1_0_5_0 + 0.00964285714285713*G0_1_0_5_1 + 0.00482142857142853*G0_1_0_5_2 - 0.0192857142857142*G0_1_0_5_3 - 0.0064285714285714*G0_1_0_5_4; + A[86] = -A[36] - 0.0024107142857143*G0_0_0_0_0 - 0.000401785714285708*G0_0_0_0_1 - 0.0164732142857142*G0_0_0_0_2 + 0.00642857142857138*G0_0_0_0_3 - 0.0257142857142856*G0_0_0_0_4 - 0.00160714285714285*G0_0_0_0_5 - 0.000401785714285708*G0_0_0_1_0 - 0.0080357142857143*G0_0_0_1_1 - 0.00441964285714284*G0_0_0_1_2 + 0.0160714285714285*G0_0_0_1_3 - 0.0032142857142857*G0_0_0_1_4 - 0.0164732142857142*G0_0_0_2_0 - 0.00441964285714284*G0_0_0_2_1 + 0.168749999999999*G0_0_0_2_2 + 0.00803571428571432*G0_0_0_2_3 + 0.0883928571428568*G0_0_0_2_4 - 0.00321428571428567*G0_0_0_2_5 + 0.00642857142857138*G0_0_0_3_0 + 0.0160714285714285*G0_0_0_3_1 + 0.00803571428571433*G0_0_0_3_2 - 0.154285714285714*G0_0_0_3_3 - 0.0064285714285714*G0_0_0_3_4 - 0.00642857142857141*G0_0_0_3_5 - 0.0257142857142856*G0_0_0_4_0 - 0.0032142857142857*G0_0_0_4_1 + 0.0883928571428568*G0_0_0_4_2 - 0.0064285714285714*G0_0_0_4_3 + 0.167142857142856*G0_0_0_4_4 + 0.0128571428571429*G0_0_0_4_5 - 0.00160714285714286*G0_0_0_5_0 - 0.00321428571428567*G0_0_0_5_2 - 0.00642857142857141*G0_0_0_5_3 + 0.0128571428571429*G0_0_0_5_4 + 0.0385714285714286*G0_0_0_5_5 + 0.041785714285714*G0_0_1_0_0 + 0.00281249999999999*G0_0_1_0_1 - 0.00281249999999998*G0_0_1_0_2 - 0.0144642857142857*G0_0_1_0_3 - 0.0241071428571428*G0_0_1_0_4 - 0.0192857142857142*G0_0_1_0_5 + 0.00281249999999999*G0_0_1_1_0 - 0.00120535714285715*G0_0_1_1_2 - 0.00160714285714285*G0_0_1_1_4 - 0.00281249999999998*G0_0_1_2_0 - 0.00120535714285715*G0_0_1_2_1 + 0.124553571428571*G0_0_1_2_2 - 0.00964285714285701*G0_0_1_2_3 + 0.0337499999999999*G0_0_1_2_4 - 0.00803571428571425*G0_0_1_2_5 - 0.0144642857142857*G0_0_1_3_0 - 0.00964285714285701*G0_0_1_3_2 - 0.0128571428571424*G0_0_1_3_3 + 0.032142857142857*G0_0_1_3_4 + 0.0449999999999999*G0_0_1_3_5 - 0.0241071428571428*G0_0_1_4_0 - 0.00160714285714285*G0_0_1_4_1 + 0.0337499999999999*G0_0_1_4_2 + 0.032142857142857*G0_0_1_4_3 - 0.179999999999999*G0_0_1_4_4 + 0.0192857142857142*G0_0_1_4_5 - 0.0192857142857142*G0_0_1_5_0 - 0.00803571428571425*G0_0_1_5_2 + 0.0449999999999999*G0_0_1_5_3 + 0.0192857142857142*G0_0_1_5_4 - 0.0771428571428565*G0_0_1_5_5; + A[54] = A[45] + 0.0120535714285715*G0_0_1_0_0 - 0.00200892857142858*G0_0_1_0_1 - 0.000401785714285727*G0_0_1_0_2 - 0.00160714285714284*G0_0_1_0_3 - 0.00160714285714282*G0_0_1_0_4 + 0.00964285714285714*G0_0_1_0_5 - 0.00200892857142858*G0_0_1_1_0 - 0.00160714285714275*G0_0_1_1_1 + 0.00361607142857141*G0_0_1_1_2 + 0.00803571428571428*G0_0_1_1_3 + 0.00482142857142854*G0_0_1_1_4 + 0.00321428571428573*G0_0_1_1_5 - 0.000401785714285726*G0_0_1_2_0 + 0.00361607142857141*G0_0_1_2_1 - 0.1125*G0_0_1_2_2 - 0.0241071428571428*G0_0_1_2_3 + 0.00803571428571423*G0_0_1_2_4 + 0.00482142857142851*G0_0_1_2_5 - 0.00160714285714284*G0_0_1_3_0 + 0.00803571428571428*G0_0_1_3_1 - 0.0241071428571428*G0_0_1_3_2 + 0.102857142857142*G0_0_1_3_3 - 0.00642857142857136*G0_0_1_3_4 - 0.00642857142857136*G0_0_1_3_5 - 0.00160714285714282*G0_0_1_4_0 + 0.00482142857142854*G0_0_1_4_1 + 0.00803571428571423*G0_0_1_4_2 - 0.00642857142857136*G0_0_1_4_3 + 0.0385714285714285*G0_0_1_4_4 - 0.0192857142857141*G0_0_1_4_5 + 0.00964285714285714*G0_0_1_5_0 + 0.00321428571428573*G0_0_1_5_1 + 0.00482142857142851*G0_0_1_5_2 - 0.00642857142857136*G0_0_1_5_3 - 0.0192857142857141*G0_0_1_5_4 - 0.0120535714285715*G0_1_0_0_0 + 0.00200892857142858*G0_1_0_0_1 + 0.000401785714285728*G0_1_0_0_2 + 0.00160714285714284*G0_1_0_0_3 + 0.00160714285714282*G0_1_0_0_4 - 0.00964285714285714*G0_1_0_0_5 + 0.00200892857142858*G0_1_0_1_0 + 0.00160714285714275*G0_1_0_1_1 - 0.00361607142857141*G0_1_0_1_2 - 0.00803571428571428*G0_1_0_1_3 - 0.00482142857142854*G0_1_0_1_4 - 0.00321428571428573*G0_1_0_1_5 + 0.000401785714285727*G0_1_0_2_0 - 0.00361607142857141*G0_1_0_2_1 + 0.1125*G0_1_0_2_2 + 0.0241071428571428*G0_1_0_2_3 - 0.00803571428571423*G0_1_0_2_4 - 0.00482142857142851*G0_1_0_2_5 + 0.00160714285714284*G0_1_0_3_0 - 0.00803571428571428*G0_1_0_3_1 + 0.0241071428571428*G0_1_0_3_2 - 0.102857142857142*G0_1_0_3_3 + 0.00642857142857136*G0_1_0_3_4 + 0.00642857142857136*G0_1_0_3_5 + 0.00160714285714282*G0_1_0_4_0 - 0.00482142857142854*G0_1_0_4_1 - 0.00803571428571422*G0_1_0_4_2 + 0.00642857142857136*G0_1_0_4_3 - 0.0385714285714285*G0_1_0_4_4 + 0.0192857142857141*G0_1_0_4_5 - 0.00964285714285714*G0_1_0_5_0 - 0.00321428571428573*G0_1_0_5_1 - 0.00482142857142851*G0_1_0_5_2 + 0.00642857142857137*G0_1_0_5_3 + 0.0192857142857141*G0_1_0_5_4; + A[35] = -A[36] + 0.0104464285714285*G0_0_0_0_0 - 0.00241071428571428*G0_0_0_0_1 - 0.0192857142857142*G0_0_0_0_2 - 0.00964285714285705*G0_0_0_0_4 + 0.00482142857142855*G0_0_0_0_5 - 0.00241071428571428*G0_0_0_1_0 + 0.0120535714285714*G0_0_0_1_1 - 0.0112499999999999*G0_0_0_1_2 + 0.0289285714285713*G0_0_0_1_3 - 0.0064285714285714*G0_0_0_1_4 + 0.0112499999999999*G0_0_0_1_5 - 0.0192857142857142*G0_0_0_2_0 - 0.0112499999999999*G0_0_0_2_1 + 0.120535714285714*G0_0_0_2_2 + 0.0160714285714285*G0_0_0_2_3 + 0.0803571428571424*G0_0_0_2_4 + 0.00642857142857141*G0_0_0_2_5 + 0.0289285714285713*G0_0_0_3_1 + 0.0160714285714285*G0_0_0_3_2 + 0.0514285714285708*G0_0_0_3_3 + 0.0128571428571428*G0_0_0_3_4 - 0.0128571428571428*G0_0_0_3_5 - 0.00964285714285705*G0_0_0_4_0 - 0.0064285714285714*G0_0_0_4_1 + 0.0803571428571424*G0_0_0_4_2 + 0.0128571428571428*G0_0_0_4_3 + 0.308571428571427*G0_0_0_4_4 + 0.00482142857142855*G0_0_0_5_0 + 0.0112499999999999*G0_0_0_5_1 + 0.00642857142857142*G0_0_0_5_2 - 0.0128571428571428*G0_0_0_5_3 - 0.0257142857142856*G0_0_0_5_5 - 0.00562500000000003*G0_0_1_0_0 + 0.000803571428571429*G0_0_1_0_1 - 0.00642857142857138*G0_0_1_0_2 - 0.00803571428571424*G0_0_1_0_3 - 0.0192857142857142*G0_0_1_0_4 - 0.00160714285714288*G0_0_1_0_5 + 0.00080357142857143*G0_0_1_1_0 + 0.00803571428571425*G0_0_1_1_1 - 0.00723214285714282*G0_0_1_1_2 + 0.0160714285714285*G0_0_1_1_3 - 0.00160714285714284*G0_0_1_1_4 - 0.00642857142857138*G0_0_1_2_0 - 0.00723214285714282*G0_0_1_2_1 + 0.0843749999999996*G0_0_1_2_2 + 0.00482142857142855*G0_0_1_2_3 + 0.0433928571428569*G0_0_1_2_4 + 0.00160714285714286*G0_0_1_2_5 - 0.00803571428571424*G0_0_1_3_0 + 0.0160714285714285*G0_0_1_3_1 + 0.00482142857142855*G0_0_1_3_2 + 0.115714285714285*G0_0_1_3_3 + 0.0192857142857142*G0_0_1_3_4 + 0.0128571428571429*G0_0_1_3_5 - 0.0192857142857142*G0_0_1_4_0 - 0.00160714285714284*G0_0_1_4_1 + 0.0433928571428569*G0_0_1_4_2 + 0.0192857142857142*G0_0_1_4_3 + 0.0385714285714284*G0_0_1_4_4 - 0.00160714285714288*G0_0_1_5_0 + 0.00160714285714287*G0_0_1_5_2 + 0.0128571428571428*G0_0_1_5_3 - 0.0128571428571428*G0_0_1_5_5 + 0.00482142857142853*G0_1_0_0_0 - 0.00281249999999998*G0_1_0_0_1 - 0.00200892857142854*G0_1_0_0_2 - 0.00642857142857137*G0_1_0_0_3 - 0.0016071428571428*G0_1_0_0_4 - 0.00281249999999998*G0_1_0_1_0 + 0.0321428571428569*G0_1_0_1_1 - 0.0068303571428571*G0_1_0_1_2 + 0.0241071428571427*G0_1_0_1_3 - 0.00642857142857138*G0_1_0_1_4 + 0.00803571428571424*G0_1_0_1_5 - 0.00200892857142854*G0_1_0_2_0 - 0.0068303571428571*G0_1_0_2_1 + 0.0120535714285712*G0_1_0_2_2 - 0.00321428571428571*G0_1_0_2_3 + 0.00321428571428561*G0_1_0_2_4 - 0.0032142857142857*G0_1_0_2_5 - 0.00642857142857137*G0_1_0_3_0 + 0.0241071428571427*G0_1_0_3_1 - 0.00321428571428571*G0_1_0_3_2 + 0.0771428571428567*G0_1_0_3_3 + 0.0257142857142855*G0_1_0_3_4 + 0.0192857142857142*G0_1_0_3_5 - 0.0016071428571428*G0_1_0_4_0 - 0.00642857142857138*G0_1_0_4_1 + 0.00321428571428561*G0_1_0_4_2 + 0.0257142857142855*G0_1_0_4_3 + 0.0642857142857138*G0_1_0_4_4 + 0.0192857142857142*G0_1_0_4_5 + 0.00803571428571424*G0_1_0_5_1 - 0.0032142857142857*G0_1_0_5_2 + 0.0192857142857142*G0_1_0_5_3 + 0.0192857142857142*G0_1_0_5_4 + 0.0128571428571428*G0_1_0_5_5 - 0.00723214285714275*G0_1_1_0_0 + 0.00401785714285711*G0_1_1_0_1 - 0.00321428571428569*G0_1_1_0_3 - 0.00482142857142853*G0_1_1_0_4 + 0.00321428571428571*G0_1_1_0_5 + 0.00401785714285711*G0_1_1_1_0 - 0.00401785714285712*G0_1_1_1_2 + 0.0160714285714285*G0_1_1_1_3 - 0.0160714285714285*G0_1_1_1_5 - 0.00401785714285712*G0_1_1_2_1 + 0.00723214285714273*G0_1_1_2_2 - 0.00321428571428571*G0_1_1_2_3 + 0.0048214285714285*G0_1_1_2_4 + 0.00321428571428569*G0_1_1_2_5 - 0.00321428571428569*G0_1_1_3_0 + 0.0160714285714285*G0_1_1_3_1 - 0.00321428571428571*G0_1_1_3_2 + 0.0642857142857139*G0_1_1_3_3 + 0.00642857142857138*G0_1_1_3_4 - 0.00482142857142853*G0_1_1_4_0 + 0.0048214285714285*G0_1_1_4_2 + 0.00642857142857138*G0_1_1_4_3 - 0.00642857142857139*G0_1_1_4_5 + 0.00321428571428571*G0_1_1_5_0 - 0.0160714285714285*G0_1_1_5_1 + 0.00321428571428569*G0_1_1_5_2 - 0.00642857142857139*G0_1_1_5_4 - 0.0642857142857139*G0_1_1_5_5; + A[85] = -A[35] + 0.0441964285714284*G0_0_0_0_0 - 0.00321428571428572*G0_0_0_0_1 - 0.0136607142857142*G0_0_0_0_2 + 0.00482142857142857*G0_0_0_0_3 + 0.0546428571428569*G0_0_0_0_4 + 0.0176785714285714*G0_0_0_0_5 - 0.00321428571428571*G0_0_0_1_0 - 0.0080357142857141*G0_0_0_1_1 - 0.00321428571428569*G0_0_0_1_2 - 0.00160714285714286*G0_0_0_1_4 + 0.0160714285714285*G0_0_0_1_5 - 0.0136607142857142*G0_0_0_2_0 - 0.00321428571428569*G0_0_0_2_1 - 0.0441964285714285*G0_0_0_2_2 + 0.0176785714285713*G0_0_0_2_3 - 0.00160714285714287*G0_0_0_2_4 + 0.020892857142857*G0_0_0_2_5 + 0.00482142857142857*G0_0_0_3_0 + 0.0176785714285713*G0_0_0_3_2 + 0.115714285714285*G0_0_0_3_3 - 0.00642857142857136*G0_0_0_3_4 - 0.0514285714285712*G0_0_0_3_5 + 0.0546428571428569*G0_0_0_4_0 - 0.00160714285714286*G0_0_0_4_1 - 0.00160714285714287*G0_0_0_4_2 - 0.00642857142857137*G0_0_0_4_3 + 0.347142857142856*G0_0_0_4_4 - 0.0385714285714283*G0_0_0_4_5 + 0.0176785714285714*G0_0_0_5_0 + 0.0160714285714285*G0_0_0_5_1 + 0.020892857142857*G0_0_0_5_2 - 0.0514285714285712*G0_0_0_5_3 - 0.0385714285714283*G0_0_0_5_4 - 0.141428571428571*G0_0_0_5_5 - 0.124553571428571*G0_0_1_0_0 + 0.00120535714285713*G0_0_1_0_1 + 0.00281249999999998*G0_0_1_0_2 + 0.00803571428571425*G0_0_1_0_3 - 0.0337499999999998*G0_0_1_0_4 + 0.00964285714285712*G0_0_1_0_5 + 0.00120535714285713*G0_0_1_1_0 - 0.00281249999999998*G0_0_1_1_2 + 0.00160714285714285*G0_0_1_1_4 + 0.00281249999999998*G0_0_1_2_0 - 0.00281249999999998*G0_0_1_2_1 - 0.0417857142857142*G0_0_1_2_2 + 0.0192857142857141*G0_0_1_2_3 + 0.0241071428571427*G0_0_1_2_4 + 0.0144642857142857*G0_0_1_2_5 + 0.00803571428571425*G0_0_1_3_0 + 0.0192857142857141*G0_0_1_3_2 + 0.0771428571428564*G0_0_1_3_3 - 0.0192857142857142*G0_0_1_3_4 - 0.0449999999999998*G0_0_1_3_5 - 0.0337499999999998*G0_0_1_4_0 + 0.00160714285714285*G0_0_1_4_1 + 0.0241071428571427*G0_0_1_4_2 - 0.0192857142857142*G0_0_1_4_3 + 0.179999999999999*G0_0_1_4_4 - 0.032142857142857*G0_0_1_4_5 + 0.00964285714285712*G0_0_1_5_0 + 0.0144642857142857*G0_0_1_5_2 - 0.0449999999999998*G0_0_1_5_3 - 0.032142857142857*G0_0_1_5_4 + 0.0128571428571426*G0_0_1_5_5; + A[58] = A[85] + 0.112499999999999*G0_0_1_0_0 + 0.000401785714285709*G0_0_1_0_1 - 0.00361607142857139*G0_0_1_0_2 - 0.00482142857142854*G0_0_1_0_3 + 0.0241071428571426*G0_0_1_0_4 - 0.00803571428571431*G0_0_1_0_5 + 0.000401785714285709*G0_0_1_1_0 - 0.0120535714285712*G0_0_1_1_1 + 0.00200892857142856*G0_0_1_1_2 - 0.00964285714285711*G0_0_1_1_3 + 0.00160714285714286*G0_0_1_1_4 + 0.0016071428571429*G0_0_1_1_5 - 0.00361607142857139*G0_0_1_2_0 + 0.00200892857142855*G0_0_1_2_1 + 0.00160714285714287*G0_0_1_2_2 - 0.00321428571428566*G0_0_1_2_3 - 0.00803571428571423*G0_0_1_2_4 - 0.00482142857142856*G0_0_1_2_5 - 0.00482142857142854*G0_0_1_3_0 - 0.00964285714285711*G0_0_1_3_1 - 0.00321428571428566*G0_0_1_3_2 + 0.00642857142857137*G0_0_1_3_4 + 0.0192857142857142*G0_0_1_3_5 + 0.0241071428571426*G0_0_1_4_0 + 0.00160714285714286*G0_0_1_4_1 - 0.00803571428571423*G0_0_1_4_2 + 0.00642857142857137*G0_0_1_4_3 - 0.102857142857143*G0_0_1_4_4 + 0.00642857142857138*G0_0_1_4_5 - 0.00803571428571431*G0_0_1_5_0 + 0.0016071428571429*G0_0_1_5_1 - 0.00482142857142856*G0_0_1_5_2 + 0.0192857142857142*G0_0_1_5_3 + 0.00642857142857137*G0_0_1_5_4 - 0.0385714285714282*G0_0_1_5_5 - 0.112499999999999*G0_1_0_0_0 - 0.000401785714285708*G0_1_0_0_1 + 0.0036160714285714*G0_1_0_0_2 + 0.00482142857142854*G0_1_0_0_3 - 0.0241071428571427*G0_1_0_0_4 + 0.0080357142857143*G0_1_0_0_5 - 0.000401785714285708*G0_1_0_1_0 + 0.0120535714285712*G0_1_0_1_1 - 0.00200892857142856*G0_1_0_1_2 + 0.00964285714285711*G0_1_0_1_3 - 0.00160714285714286*G0_1_0_1_4 - 0.0016071428571429*G0_1_0_1_5 + 0.0036160714285714*G0_1_0_2_0 - 0.00200892857142855*G0_1_0_2_1 - 0.00160714285714287*G0_1_0_2_2 + 0.00321428571428566*G0_1_0_2_3 + 0.00803571428571423*G0_1_0_2_4 + 0.00482142857142856*G0_1_0_2_5 + 0.00482142857142854*G0_1_0_3_0 + 0.00964285714285711*G0_1_0_3_1 + 0.00321428571428566*G0_1_0_3_2 - 0.00642857142857137*G0_1_0_3_4 - 0.0192857142857142*G0_1_0_3_5 - 0.0241071428571427*G0_1_0_4_0 - 0.00160714285714286*G0_1_0_4_1 + 0.00803571428571423*G0_1_0_4_2 - 0.00642857142857137*G0_1_0_4_3 + 0.102857142857143*G0_1_0_4_4 - 0.00642857142857138*G0_1_0_4_5 + 0.00803571428571431*G0_1_0_5_0 - 0.0016071428571429*G0_1_0_5_1 + 0.00482142857142856*G0_1_0_5_2 - 0.0192857142857142*G0_1_0_5_3 - 0.00642857142857137*G0_1_0_5_4 + 0.0385714285714282*G0_1_0_5_5; + A[65] = -A[45] + 0.00401785714285716*G0_1_0_0_0 - 0.00562499999999997*G0_1_0_0_1 + 0.00803571428571424*G0_1_0_0_2 + 0.00964285714285709*G0_1_0_0_3 + 0.00642857142857132*G0_1_0_0_4 + 0.0176785714285713*G0_1_0_0_5 - 0.00562499999999997*G0_1_0_1_0 - 0.00723214285714272*G0_1_0_1_1 + 0.0257142857142856*G0_1_0_1_3 + 0.0546428571428569*G0_1_0_1_4 + 0.0208928571428571*G0_1_0_1_5 + 0.00803571428571424*G0_1_0_2_0 - 0.120535714285714*G0_1_0_2_2 - 0.0160714285714285*G0_1_0_2_3 + 0.0160714285714285*G0_1_0_2_4 + 0.0160714285714285*G0_1_0_2_5 + 0.00964285714285709*G0_1_0_3_0 + 0.0257142857142856*G0_1_0_3_1 - 0.0160714285714285*G0_1_0_3_2 + 0.0642857142857141*G0_1_0_3_3 - 0.128571428571428*G0_1_0_3_4 - 0.0514285714285712*G0_1_0_3_5 + 0.00642857142857132*G0_1_0_4_0 + 0.0546428571428569*G0_1_0_4_1 + 0.0160714285714285*G0_1_0_4_2 - 0.128571428571428*G0_1_0_4_3 - 0.578571428571426*G0_1_0_4_4 - 0.141428571428571*G0_1_0_4_5 + 0.0176785714285713*G0_1_0_5_0 + 0.0208928571428571*G0_1_0_5_1 + 0.0160714285714285*G0_1_0_5_2 - 0.0514285714285712*G0_1_0_5_3 - 0.141428571428571*G0_1_0_5_4 - 0.0385714285714284*G0_1_0_5_5 - 0.164732142857142*G0_1_1_0_0 + 0.0108482142857142*G0_1_1_0_1 + 0.0124553571428571*G0_1_1_0_2 + 0.0128571428571428*G0_1_1_0_3 - 0.00160714285714286*G0_1_1_0_4 - 0.0707142857142854*G0_1_1_0_5 + 0.0108482142857142*G0_1_1_1_0 - 0.00482142857142853*G0_1_1_1_1 + 0.000401785714285709*G0_1_1_1_2 + 0.0273214285714284*G0_1_1_1_3 + 0.0482142857142855*G0_1_1_1_4 + 0.0466071428571426*G0_1_1_1_5 + 0.0124553571428571*G0_1_1_2_0 + 0.000401785714285709*G0_1_1_2_1 - 0.1125*G0_1_1_2_2 - 0.0160714285714285*G0_1_1_2_3 + 0.0192857142857142*G0_1_1_2_5 + 0.0128571428571428*G0_1_1_3_0 + 0.0273214285714284*G0_1_1_3_1 - 0.0160714285714285*G0_1_1_3_2 + 0.0257142857142856*G0_1_1_3_3 - 0.122142857142857*G0_1_1_3_4 - 0.064285714285714*G0_1_1_3_5 - 0.00160714285714287*G0_1_1_4_0 + 0.0482142857142855*G0_1_1_4_1 - 0.122142857142857*G0_1_1_4_3 - 0.424285714285712*G0_1_1_4_4 - 0.134999999999999*G0_1_1_4_5 - 0.0707142857142854*G0_1_1_5_0 + 0.0466071428571426*G0_1_1_5_1 + 0.0192857142857142*G0_1_1_5_2 - 0.064285714285714*G0_1_1_5_3 - 0.134999999999999*G0_1_1_5_4 - 0.205714285714285*G0_1_1_5_5; + A[53] = -A[58] + 0.0441964285714284*G0_0_0_0_0 - 0.00321428571428572*G0_0_0_0_1 - 0.0136607142857142*G0_0_0_0_2 + 0.00482142857142857*G0_0_0_0_3 + 0.0546428571428569*G0_0_0_0_4 + 0.0176785714285714*G0_0_0_0_5 - 0.00321428571428571*G0_0_0_1_0 - 0.0080357142857141*G0_0_0_1_1 - 0.00321428571428569*G0_0_0_1_2 - 0.00160714285714286*G0_0_0_1_4 + 0.0160714285714285*G0_0_0_1_5 - 0.0136607142857142*G0_0_0_2_0 - 0.00321428571428569*G0_0_0_2_1 - 0.0441964285714285*G0_0_0_2_2 + 0.0176785714285713*G0_0_0_2_3 - 0.00160714285714287*G0_0_0_2_4 + 0.020892857142857*G0_0_0_2_5 + 0.00482142857142857*G0_0_0_3_0 + 0.0176785714285713*G0_0_0_3_2 + 0.115714285714285*G0_0_0_3_3 - 0.00642857142857136*G0_0_0_3_4 - 0.0514285714285712*G0_0_0_3_5 + 0.0546428571428569*G0_0_0_4_0 - 0.00160714285714286*G0_0_0_4_1 - 0.00160714285714287*G0_0_0_4_2 - 0.00642857142857136*G0_0_0_4_3 + 0.347142857142856*G0_0_0_4_4 - 0.0385714285714283*G0_0_0_4_5 + 0.0176785714285714*G0_0_0_5_0 + 0.0160714285714285*G0_0_0_5_1 + 0.020892857142857*G0_0_0_5_2 - 0.0514285714285712*G0_0_0_5_3 - 0.0385714285714283*G0_0_0_5_4 - 0.141428571428571*G0_0_0_5_5 - 0.124553571428571*G0_1_0_0_0 + 0.00120535714285713*G0_1_0_0_1 + 0.00281249999999998*G0_1_0_0_2 + 0.00803571428571425*G0_1_0_0_3 - 0.0337499999999998*G0_1_0_0_4 + 0.00964285714285712*G0_1_0_0_5 + 0.00120535714285713*G0_1_0_1_0 - 0.00281249999999998*G0_1_0_1_2 + 0.00160714285714284*G0_1_0_1_4 + 0.00281249999999998*G0_1_0_2_0 - 0.00281249999999998*G0_1_0_2_1 - 0.0417857142857142*G0_1_0_2_2 + 0.0192857142857141*G0_1_0_2_3 + 0.0241071428571427*G0_1_0_2_4 + 0.0144642857142857*G0_1_0_2_5 + 0.00803571428571425*G0_1_0_3_0 + 0.0192857142857141*G0_1_0_3_2 + 0.0771428571428564*G0_1_0_3_3 - 0.0192857142857142*G0_1_0_3_4 - 0.0449999999999998*G0_1_0_3_5 - 0.0337499999999998*G0_1_0_4_0 + 0.00160714285714284*G0_1_0_4_1 + 0.0241071428571427*G0_1_0_4_2 - 0.0192857142857142*G0_1_0_4_3 + 0.179999999999999*G0_1_0_4_4 - 0.032142857142857*G0_1_0_4_5 + 0.00964285714285712*G0_1_0_5_0 + 0.0144642857142857*G0_1_0_5_2 - 0.0449999999999998*G0_1_0_5_3 - 0.032142857142857*G0_1_0_5_4 + 0.0128571428571426*G0_1_0_5_5; + A[34] = -A[36] + 0.00723214285714285*G0_0_1_0_0 + 0.00562499999999995*G0_0_1_0_1 - 0.0546428571428568*G0_0_1_0_3 - 0.0257142857142856*G0_0_1_0_4 - 0.0208928571428571*G0_0_1_0_5 + 0.00562499999999995*G0_0_1_1_0 - 0.004017857142857*G0_0_1_1_1 - 0.00803571428571427*G0_0_1_1_2 - 0.00642857142857129*G0_0_1_1_3 - 0.00964285714285708*G0_0_1_1_4 - 0.0176785714285713*G0_0_1_1_5 - 0.00803571428571427*G0_0_1_2_1 + 0.120535714285714*G0_0_1_2_2 - 0.0160714285714285*G0_0_1_2_3 + 0.0160714285714285*G0_0_1_2_4 - 0.0160714285714285*G0_0_1_2_5 - 0.0546428571428568*G0_0_1_3_0 - 0.00642857142857129*G0_0_1_3_1 - 0.0160714285714285*G0_0_1_3_2 + 0.578571428571426*G0_0_1_3_3 + 0.128571428571428*G0_0_1_3_4 + 0.141428571428571*G0_0_1_3_5 - 0.0257142857142856*G0_0_1_4_0 - 0.00964285714285708*G0_0_1_4_1 + 0.0160714285714285*G0_0_1_4_2 + 0.128571428571428*G0_0_1_4_3 - 0.064285714285714*G0_0_1_4_4 + 0.0514285714285712*G0_0_1_4_5 - 0.0208928571428571*G0_0_1_5_0 - 0.0176785714285713*G0_0_1_5_1 - 0.0160714285714285*G0_0_1_5_2 + 0.141428571428571*G0_0_1_5_3 + 0.0514285714285712*G0_0_1_5_4 + 0.0385714285714286*G0_0_1_5_5 + 0.00241071428571422*G0_1_1_0_0 + 0.0164732142857142*G0_1_1_0_1 + 0.000401785714285735*G0_1_1_0_2 - 0.00642857142857143*G0_1_1_0_3 + 0.0016071428571428*G0_1_1_0_4 + 0.0257142857142855*G0_1_1_0_5 + 0.0164732142857142*G0_1_1_1_0 - 0.168749999999999*G0_1_1_1_1 + 0.00441964285714281*G0_1_1_1_2 - 0.00803571428571406*G0_1_1_1_3 + 0.0032142857142857*G0_1_1_1_4 - 0.0883928571428565*G0_1_1_1_5 + 0.000401785714285735*G0_1_1_2_0 + 0.00441964285714281*G0_1_1_2_1 + 0.00803571428571413*G0_1_1_2_2 - 0.0160714285714286*G0_1_1_2_3 + 0.00321428571428566*G0_1_1_2_5 - 0.00642857142857143*G0_1_1_3_0 - 0.00803571428571406*G0_1_1_3_1 - 0.0160714285714286*G0_1_1_3_2 + 0.154285714285714*G0_1_1_3_3 + 0.00642857142857151*G0_1_1_3_4 + 0.00642857142857163*G0_1_1_3_5 + 0.0016071428571428*G0_1_1_4_0 + 0.0032142857142857*G0_1_1_4_1 + 0.00642857142857151*G0_1_1_4_3 - 0.0385714285714283*G0_1_1_4_4 - 0.0128571428571427*G0_1_1_4_5 + 0.0257142857142855*G0_1_1_5_0 - 0.0883928571428565*G0_1_1_5_1 + 0.00321428571428566*G0_1_1_5_2 + 0.00642857142857162*G0_1_1_5_3 - 0.0128571428571427*G0_1_1_5_4 - 0.167142857142856*G0_1_1_5_5; + A[84] = -A[86] + 0.041785714285714*G0_0_1_0_0 - 0.00281249999999994*G0_0_1_0_1 + 0.00281249999999998*G0_0_1_0_2 - 0.0144642857142856*G0_0_1_0_3 - 0.0192857142857142*G0_0_1_0_4 - 0.0241071428571427*G0_0_1_0_5 - 0.00281249999999994*G0_0_1_1_0 + 0.124553571428571*G0_0_1_1_1 - 0.00120535714285712*G0_0_1_1_2 - 0.00964285714285724*G0_0_1_1_3 - 0.00803571428571425*G0_0_1_1_4 + 0.0337499999999997*G0_0_1_1_5 + 0.00281249999999998*G0_0_1_2_0 - 0.00120535714285712*G0_0_1_2_1 - 0.00160714285714285*G0_0_1_2_5 - 0.0144642857142856*G0_0_1_3_0 - 0.00964285714285724*G0_0_1_3_1 - 0.012857142857143*G0_0_1_3_3 + 0.0449999999999998*G0_0_1_3_4 + 0.032142857142857*G0_0_1_3_5 - 0.0192857142857142*G0_0_1_4_0 - 0.00803571428571425*G0_0_1_4_1 + 0.0449999999999998*G0_0_1_4_3 - 0.0771428571428569*G0_0_1_4_4 + 0.0192857142857142*G0_0_1_4_5 - 0.0241071428571427*G0_0_1_5_0 + 0.0337499999999997*G0_0_1_5_1 - 0.00160714285714285*G0_0_1_5_2 + 0.032142857142857*G0_0_1_5_3 + 0.0192857142857142*G0_0_1_5_4 - 0.179999999999999*G0_0_1_5_5 - 0.00241071428571422*G0_1_1_0_0 - 0.0164732142857142*G0_1_1_0_1 - 0.000401785714285735*G0_1_1_0_2 + 0.00642857142857143*G0_1_1_0_3 - 0.00160714285714281*G0_1_1_0_4 - 0.0257142857142855*G0_1_1_0_5 - 0.0164732142857142*G0_1_1_1_0 + 0.168749999999999*G0_1_1_1_1 - 0.0044196428571428*G0_1_1_1_2 + 0.00803571428571404*G0_1_1_1_3 - 0.00321428571428572*G0_1_1_1_4 + 0.0883928571428565*G0_1_1_1_5 - 0.000401785714285735*G0_1_1_2_0 - 0.0044196428571428*G0_1_1_2_1 - 0.00803571428571415*G0_1_1_2_2 + 0.0160714285714286*G0_1_1_2_3 - 0.00321428571428566*G0_1_1_2_5 + 0.00642857142857143*G0_1_1_3_0 + 0.00803571428571404*G0_1_1_3_1 + 0.0160714285714286*G0_1_1_3_2 - 0.154285714285714*G0_1_1_3_3 - 0.00642857142857146*G0_1_1_3_4 - 0.00642857142857161*G0_1_1_3_5 - 0.00160714285714281*G0_1_1_4_0 - 0.00321428571428572*G0_1_1_4_1 - 0.00642857142857146*G0_1_1_4_3 + 0.0385714285714285*G0_1_1_4_4 + 0.0128571428571428*G0_1_1_4_5 - 0.0257142857142855*G0_1_1_5_0 + 0.0883928571428565*G0_1_1_5_1 - 0.00321428571428566*G0_1_1_5_2 - 0.00642857142857162*G0_1_1_5_3 + 0.0128571428571428*G0_1_1_5_4 + 0.167142857142856*G0_1_1_5_5; + A[74] = -A[84] - 0.00723214285714288*G0_0_0_0_0 + 0.00401785714285714*G0_0_0_0_2 - 0.00321428571428568*G0_0_0_0_3 + 0.0032142857142857*G0_0_0_0_4 - 0.00482142857142858*G0_0_0_0_5 + 0.00723214285714285*G0_0_0_1_1 - 0.00401785714285711*G0_0_0_1_2 - 0.00321428571428568*G0_0_0_1_3 + 0.00321428571428571*G0_0_0_1_4 + 0.00482142857142857*G0_0_0_1_5 + 0.00401785714285714*G0_0_0_2_0 - 0.00401785714285711*G0_0_0_2_1 + 0.0160714285714284*G0_0_0_2_3 - 0.0160714285714286*G0_0_0_2_4 - 0.00321428571428568*G0_0_0_3_0 - 0.00321428571428569*G0_0_0_3_1 + 0.0160714285714284*G0_0_0_3_2 + 0.0642857142857139*G0_0_0_3_3 + 0.0064285714285714*G0_0_0_3_5 + 0.00321428571428571*G0_0_0_4_0 + 0.00321428571428571*G0_0_0_4_1 - 0.0160714285714286*G0_0_0_4_2 - 0.0642857142857141*G0_0_0_4_4 - 0.00642857142857142*G0_0_0_4_5 - 0.00482142857142858*G0_0_0_5_0 + 0.00482142857142857*G0_0_0_5_1 + 0.00642857142857141*G0_0_0_5_3 - 0.00642857142857142*G0_0_0_5_4 - 0.00562500000000007*G0_0_1_0_0 - 0.00642857142857137*G0_0_1_0_1 + 0.000803571428571433*G0_0_1_0_2 - 0.00803571428571421*G0_0_1_0_3 - 0.00160714285714286*G0_0_1_0_4 - 0.0192857142857142*G0_0_1_0_5 - 0.00642857142857137*G0_0_1_1_0 + 0.0843749999999995*G0_0_1_1_1 - 0.0072321428571428*G0_0_1_1_2 + 0.0048214285714285*G0_0_1_1_3 + 0.00160714285714285*G0_0_1_1_4 + 0.0433928571428569*G0_0_1_1_5 + 0.000803571428571433*G0_0_1_2_0 - 0.0072321428571428*G0_0_1_2_1 + 0.00803571428571421*G0_0_1_2_2 + 0.0160714285714285*G0_0_1_2_3 - 0.00160714285714283*G0_0_1_2_5 - 0.00803571428571421*G0_0_1_3_0 + 0.0048214285714285*G0_0_1_3_1 + 0.0160714285714285*G0_0_1_3_2 + 0.115714285714285*G0_0_1_3_3 + 0.0128571428571427*G0_0_1_3_4 + 0.0192857142857141*G0_0_1_3_5 - 0.00160714285714286*G0_0_1_4_0 + 0.00160714285714285*G0_0_1_4_1 + 0.0128571428571427*G0_0_1_4_3 - 0.0128571428571429*G0_0_1_4_4 - 0.0192857142857142*G0_0_1_5_0 + 0.0433928571428569*G0_0_1_5_1 - 0.00160714285714283*G0_0_1_5_2 + 0.0192857142857141*G0_0_1_5_3 + 0.0385714285714282*G0_0_1_5_5 + 0.00482142857142857*G0_1_0_0_0 - 0.00200892857142857*G0_1_0_0_1 - 0.00281249999999998*G0_1_0_0_2 - 0.00642857142857138*G0_1_0_0_3 - 0.00160714285714282*G0_1_0_0_5 - 0.00200892857142857*G0_1_0_1_0 + 0.0120535714285714*G0_1_0_1_1 - 0.0068303571428571*G0_1_0_1_2 - 0.00321428571428569*G0_1_0_1_3 - 0.0032142857142857*G0_1_0_1_4 + 0.00321428571428572*G0_1_0_1_5 - 0.00281249999999998*G0_1_0_2_0 - 0.0068303571428571*G0_1_0_2_1 + 0.0321428571428569*G0_1_0_2_2 + 0.0241071428571427*G0_1_0_2_3 + 0.00803571428571424*G0_1_0_2_4 - 0.00642857142857139*G0_1_0_2_5 - 0.00642857142857138*G0_1_0_3_0 - 0.0032142857142857*G0_1_0_3_1 + 0.0241071428571427*G0_1_0_3_2 + 0.0771428571428567*G0_1_0_3_3 + 0.0192857142857142*G0_1_0_3_4 + 0.0257142857142856*G0_1_0_3_5 - 0.0032142857142857*G0_1_0_4_1 + 0.00803571428571424*G0_1_0_4_2 + 0.0192857142857142*G0_1_0_4_3 + 0.0128571428571428*G0_1_0_4_4 + 0.0192857142857142*G0_1_0_4_5 - 0.00160714285714282*G0_1_0_5_0 + 0.00321428571428572*G0_1_0_5_1 - 0.0064285714285714*G0_1_0_5_2 + 0.0257142857142856*G0_1_0_5_3 + 0.0192857142857142*G0_1_0_5_4 + 0.0642857142857142*G0_1_0_5_5 + 0.0104464285714286*G0_1_1_0_0 - 0.0192857142857142*G0_1_1_0_1 - 0.00241071428571428*G0_1_1_0_2 + 0.00482142857142856*G0_1_1_0_4 - 0.00964285714285701*G0_1_1_0_5 - 0.0192857142857142*G0_1_1_1_0 + 0.120535714285714*G0_1_1_1_1 - 0.0112499999999999*G0_1_1_1_2 + 0.0160714285714284*G0_1_1_1_3 + 0.00642857142857138*G0_1_1_1_4 + 0.0803571428571424*G0_1_1_1_5 - 0.00241071428571428*G0_1_1_2_0 - 0.0112499999999999*G0_1_1_2_1 + 0.0120535714285714*G0_1_1_2_2 + 0.0289285714285713*G0_1_1_2_3 + 0.01125*G0_1_1_2_4 - 0.00642857142857137*G0_1_1_2_5 + 0.0160714285714284*G0_1_1_3_1 + 0.0289285714285713*G0_1_1_3_2 + 0.0514285714285709*G0_1_1_3_3 - 0.0128571428571428*G0_1_1_3_4 + 0.0128571428571427*G0_1_1_3_5 + 0.00482142857142856*G0_1_1_4_0 + 0.00642857142857138*G0_1_1_4_1 + 0.01125*G0_1_1_4_2 - 0.0128571428571428*G0_1_1_4_3 - 0.0257142857142855*G0_1_1_4_4 - 0.00964285714285701*G0_1_1_5_0 + 0.0803571428571424*G0_1_1_5_1 - 0.00642857142857137*G0_1_1_5_2 + 0.0128571428571427*G0_1_1_5_3 + 0.308571428571427*G0_1_1_5_5; + A[76] = -A[74] - 0.124553571428571*G0_0_1_0_0 + 0.00281249999999997*G0_0_1_0_1 + 0.00120535714285714*G0_0_1_0_2 + 0.00803571428571425*G0_0_1_0_3 + 0.00964285714285712*G0_0_1_0_4 - 0.0337499999999998*G0_0_1_0_5 + 0.00281249999999997*G0_0_1_1_0 - 0.041785714285714*G0_0_1_1_1 - 0.0028125*G0_0_1_1_2 + 0.0192857142857143*G0_0_1_1_3 + 0.0144642857142856*G0_0_1_1_4 + 0.0241071428571428*G0_0_1_1_5 + 0.00120535714285714*G0_0_1_2_0 - 0.0028125*G0_0_1_2_1 + 0.00160714285714287*G0_0_1_2_5 + 0.00803571428571425*G0_0_1_3_0 + 0.0192857142857143*G0_0_1_3_1 + 0.0771428571428567*G0_0_1_3_3 - 0.0449999999999998*G0_0_1_3_4 - 0.0192857142857142*G0_0_1_3_5 + 0.00964285714285712*G0_0_1_4_0 + 0.0144642857142856*G0_0_1_4_1 - 0.0449999999999998*G0_0_1_4_3 + 0.0128571428571428*G0_0_1_4_4 - 0.032142857142857*G0_0_1_4_5 - 0.0337499999999998*G0_0_1_5_0 + 0.0241071428571428*G0_0_1_5_1 + 0.00160714285714287*G0_0_1_5_2 - 0.0192857142857142*G0_0_1_5_3 - 0.032142857142857*G0_0_1_5_4 + 0.179999999999999*G0_0_1_5_5 + 0.0441964285714284*G0_1_1_0_0 - 0.0136607142857142*G0_1_1_0_1 - 0.00321428571428569*G0_1_1_0_2 + 0.00482142857142855*G0_1_1_0_3 + 0.0176785714285713*G0_1_1_0_4 + 0.0546428571428569*G0_1_1_0_5 - 0.0136607142857142*G0_1_1_1_0 - 0.0441964285714282*G0_1_1_1_1 - 0.00321428571428572*G0_1_1_1_2 + 0.0176785714285714*G0_1_1_1_3 + 0.0208928571428571*G0_1_1_1_4 - 0.00160714285714272*G0_1_1_1_5 - 0.00321428571428569*G0_1_1_2_0 - 0.00321428571428572*G0_1_1_2_1 - 0.00803571428571433*G0_1_1_2_2 + 0.0160714285714285*G0_1_1_2_4 - 0.00160714285714283*G0_1_1_2_5 + 0.00482142857142855*G0_1_1_3_0 + 0.0176785714285714*G0_1_1_3_1 + 0.115714285714285*G0_1_1_3_3 - 0.0514285714285712*G0_1_1_3_4 - 0.00642857142857142*G0_1_1_3_5 + 0.0176785714285713*G0_1_1_4_0 + 0.0208928571428571*G0_1_1_4_1 + 0.0160714285714285*G0_1_1_4_2 - 0.0514285714285712*G0_1_1_4_3 - 0.141428571428571*G0_1_1_4_4 - 0.0385714285714285*G0_1_1_4_5 + 0.0546428571428569*G0_1_1_5_0 - 0.00160714285714272*G0_1_1_5_1 - 0.00160714285714283*G0_1_1_5_2 - 0.00642857142857142*G0_1_1_5_3 - 0.0385714285714285*G0_1_1_5_4 + 0.347142857142855*G0_1_1_5_5; + A[67] = A[76] + 0.112499999999999*G0_0_1_0_0 - 0.00361607142857139*G0_0_1_0_1 + 0.000401785714285737*G0_0_1_0_2 - 0.00482142857142854*G0_0_1_0_3 - 0.00803571428571431*G0_0_1_0_4 + 0.0241071428571426*G0_0_1_0_5 - 0.00361607142857139*G0_0_1_1_0 + 0.00160714285714286*G0_0_1_1_1 + 0.00200892857142856*G0_0_1_1_2 - 0.00321428571428571*G0_0_1_1_3 - 0.00482142857142853*G0_0_1_1_4 - 0.00803571428571424*G0_0_1_1_5 + 0.000401785714285737*G0_0_1_2_0 + 0.00200892857142856*G0_0_1_2_1 - 0.0120535714285715*G0_0_1_2_2 - 0.0096428571428571*G0_0_1_2_3 + 0.0016071428571428*G0_0_1_2_4 + 0.00160714285714285*G0_0_1_2_5 - 0.00482142857142854*G0_0_1_3_0 - 0.00321428571428571*G0_0_1_3_1 - 0.0096428571428571*G0_0_1_3_2 + 0.0192857142857142*G0_0_1_3_4 + 0.00642857142857141*G0_0_1_3_5 - 0.00803571428571431*G0_0_1_4_0 - 0.00482142857142853*G0_0_1_4_1 + 0.0016071428571428*G0_0_1_4_2 + 0.0192857142857142*G0_0_1_4_3 - 0.0385714285714286*G0_0_1_4_4 + 0.00642857142857135*G0_0_1_4_5 + 0.0241071428571427*G0_0_1_5_0 - 0.00803571428571424*G0_0_1_5_1 + 0.00160714285714285*G0_0_1_5_2 + 0.00642857142857142*G0_0_1_5_3 + 0.00642857142857136*G0_0_1_5_4 - 0.102857142857142*G0_0_1_5_5 - 0.112499999999999*G0_1_0_0_0 + 0.00361607142857139*G0_1_0_0_1 - 0.000401785714285737*G0_1_0_0_2 + 0.00482142857142854*G0_1_0_0_3 + 0.00803571428571431*G0_1_0_0_4 - 0.0241071428571426*G0_1_0_0_5 + 0.00361607142857139*G0_1_0_1_0 - 0.00160714285714286*G0_1_0_1_1 - 0.00200892857142856*G0_1_0_1_2 + 0.00321428571428571*G0_1_0_1_3 + 0.00482142857142853*G0_1_0_1_4 + 0.00803571428571424*G0_1_0_1_5 - 0.000401785714285737*G0_1_0_2_0 - 0.00200892857142856*G0_1_0_2_1 + 0.0120535714285715*G0_1_0_2_2 + 0.0096428571428571*G0_1_0_2_3 - 0.0016071428571428*G0_1_0_2_4 - 0.00160714285714285*G0_1_0_2_5 + 0.00482142857142854*G0_1_0_3_0 + 0.00321428571428571*G0_1_0_3_1 + 0.0096428571428571*G0_1_0_3_2 - 0.0192857142857142*G0_1_0_3_4 - 0.00642857142857141*G0_1_0_3_5 + 0.00803571428571431*G0_1_0_4_0 + 0.00482142857142853*G0_1_0_4_1 - 0.0016071428571428*G0_1_0_4_2 - 0.0192857142857142*G0_1_0_4_3 + 0.0385714285714286*G0_1_0_4_4 - 0.00642857142857135*G0_1_0_4_5 - 0.0241071428571426*G0_1_0_5_0 + 0.00803571428571424*G0_1_0_5_1 - 0.00160714285714285*G0_1_0_5_2 - 0.00642857142857141*G0_1_0_5_3 - 0.00642857142857135*G0_1_0_5_4 + 0.102857142857142*G0_1_0_5_5; + A[47] = -A[67] - 0.124553571428571*G0_1_0_0_0 + 0.00281249999999998*G0_1_0_0_1 + 0.00120535714285714*G0_1_0_0_2 + 0.00803571428571425*G0_1_0_0_3 + 0.00964285714285712*G0_1_0_0_4 - 0.0337499999999998*G0_1_0_0_5 + 0.00281249999999997*G0_1_0_1_0 - 0.041785714285714*G0_1_0_1_1 - 0.0028125*G0_1_0_1_2 + 0.0192857142857143*G0_1_0_1_3 + 0.0144642857142856*G0_1_0_1_4 + 0.0241071428571428*G0_1_0_1_5 + 0.00120535714285714*G0_1_0_2_0 - 0.0028125*G0_1_0_2_1 + 0.00160714285714286*G0_1_0_2_5 + 0.00803571428571425*G0_1_0_3_0 + 0.0192857142857143*G0_1_0_3_1 + 0.0771428571428567*G0_1_0_3_3 - 0.0449999999999998*G0_1_0_3_4 - 0.0192857142857142*G0_1_0_3_5 + 0.00964285714285712*G0_1_0_4_0 + 0.0144642857142856*G0_1_0_4_1 - 0.0449999999999998*G0_1_0_4_3 + 0.0128571428571428*G0_1_0_4_4 - 0.032142857142857*G0_1_0_4_5 - 0.0337499999999998*G0_1_0_5_0 + 0.0241071428571428*G0_1_0_5_1 + 0.00160714285714286*G0_1_0_5_2 - 0.0192857142857142*G0_1_0_5_3 - 0.032142857142857*G0_1_0_5_4 + 0.179999999999999*G0_1_0_5_5 + 0.0441964285714284*G0_1_1_0_0 - 0.0136607142857142*G0_1_1_0_1 - 0.00321428571428569*G0_1_1_0_2 + 0.00482142857142855*G0_1_1_0_3 + 0.0176785714285713*G0_1_1_0_4 + 0.0546428571428569*G0_1_1_0_5 - 0.0136607142857142*G0_1_1_1_0 - 0.0441964285714282*G0_1_1_1_1 - 0.00321428571428572*G0_1_1_1_2 + 0.0176785714285714*G0_1_1_1_3 + 0.0208928571428571*G0_1_1_1_4 - 0.00160714285714272*G0_1_1_1_5 - 0.00321428571428569*G0_1_1_2_0 - 0.00321428571428572*G0_1_1_2_1 - 0.00803571428571433*G0_1_1_2_2 + 0.0160714285714285*G0_1_1_2_4 - 0.00160714285714283*G0_1_1_2_5 + 0.00482142857142855*G0_1_1_3_0 + 0.0176785714285714*G0_1_1_3_1 + 0.115714285714285*G0_1_1_3_3 - 0.0514285714285712*G0_1_1_3_4 - 0.00642857142857142*G0_1_1_3_5 + 0.0176785714285713*G0_1_1_4_0 + 0.0208928571428571*G0_1_1_4_1 + 0.0160714285714285*G0_1_1_4_2 - 0.0514285714285712*G0_1_1_4_3 - 0.141428571428571*G0_1_1_4_4 - 0.0385714285714285*G0_1_1_4_5 + 0.0546428571428569*G0_1_1_5_0 - 0.00160714285714272*G0_1_1_5_1 - 0.00160714285714283*G0_1_1_5_2 - 0.00642857142857142*G0_1_1_5_3 - 0.0385714285714285*G0_1_1_5_4 + 0.347142857142855*G0_1_1_5_5; + A[56] = -A[54] + 0.00401785714285716*G0_0_1_0_0 - 0.00562499999999997*G0_0_1_0_1 + 0.00803571428571424*G0_0_1_0_2 + 0.00964285714285709*G0_0_1_0_3 + 0.00642857142857132*G0_0_1_0_4 + 0.0176785714285713*G0_0_1_0_5 - 0.00562499999999997*G0_0_1_1_0 - 0.00723214285714272*G0_0_1_1_1 + 0.0257142857142856*G0_0_1_1_3 + 0.0546428571428569*G0_0_1_1_4 + 0.0208928571428571*G0_0_1_1_5 + 0.00803571428571424*G0_0_1_2_0 - 0.120535714285714*G0_0_1_2_2 - 0.0160714285714285*G0_0_1_2_3 + 0.0160714285714285*G0_0_1_2_4 + 0.0160714285714285*G0_0_1_2_5 + 0.00964285714285709*G0_0_1_3_0 + 0.0257142857142856*G0_0_1_3_1 - 0.0160714285714285*G0_0_1_3_2 + 0.064285714285714*G0_0_1_3_3 - 0.128571428571428*G0_0_1_3_4 - 0.0514285714285712*G0_0_1_3_5 + 0.00642857142857132*G0_0_1_4_0 + 0.0546428571428569*G0_0_1_4_1 + 0.0160714285714285*G0_0_1_4_2 - 0.128571428571428*G0_0_1_4_3 - 0.578571428571426*G0_0_1_4_4 - 0.141428571428571*G0_0_1_4_5 + 0.0176785714285713*G0_0_1_5_0 + 0.0208928571428571*G0_0_1_5_1 + 0.0160714285714285*G0_0_1_5_2 - 0.0514285714285712*G0_0_1_5_3 - 0.141428571428571*G0_0_1_5_4 - 0.0385714285714284*G0_0_1_5_5 - 0.164732142857142*G0_1_1_0_0 + 0.0108482142857142*G0_1_1_0_1 + 0.0124553571428571*G0_1_1_0_2 + 0.0128571428571428*G0_1_1_0_3 - 0.00160714285714286*G0_1_1_0_4 - 0.0707142857142854*G0_1_1_0_5 + 0.0108482142857142*G0_1_1_1_0 - 0.00482142857142853*G0_1_1_1_1 + 0.00040178571428571*G0_1_1_1_2 + 0.0273214285714284*G0_1_1_1_3 + 0.0482142857142855*G0_1_1_1_4 + 0.0466071428571426*G0_1_1_1_5 + 0.0124553571428571*G0_1_1_2_0 + 0.000401785714285709*G0_1_1_2_1 - 0.1125*G0_1_1_2_2 - 0.0160714285714285*G0_1_1_2_3 + 0.0192857142857142*G0_1_1_2_5 + 0.0128571428571428*G0_1_1_3_0 + 0.0273214285714284*G0_1_1_3_1 - 0.0160714285714285*G0_1_1_3_2 + 0.0257142857142856*G0_1_1_3_3 - 0.122142857142857*G0_1_1_3_4 - 0.064285714285714*G0_1_1_3_5 - 0.00160714285714288*G0_1_1_4_0 + 0.0482142857142855*G0_1_1_4_1 - 0.122142857142857*G0_1_1_4_3 - 0.424285714285712*G0_1_1_4_4 - 0.134999999999999*G0_1_1_4_5 - 0.0707142857142854*G0_1_1_5_0 + 0.0466071428571426*G0_1_1_5_1 + 0.0192857142857142*G0_1_1_5_2 - 0.064285714285714*G0_1_1_5_3 - 0.134999999999999*G0_1_1_5_4 - 0.205714285714285*G0_1_1_5_5; + A[0] = A[11] + 0.125357142857142*G0_0_0_0_0 - 0.0103571428571428*G0_0_0_0_2 + 0.00714285714285711*G0_0_0_0_3 + 0.0421428571428569*G0_0_0_0_4 + 0.0499999999999997*G0_0_0_0_5 - 0.125357142857142*G0_0_0_1_1 + 0.0103571428571428*G0_0_0_1_2 - 0.0421428571428569*G0_0_0_1_3 - 0.00714285714285712*G0_0_0_1_4 - 0.0499999999999997*G0_0_0_1_5 - 0.0103571428571428*G0_0_0_2_0 + 0.0103571428571428*G0_0_0_2_1 + 0.00785714285714281*G0_0_0_2_3 - 0.00785714285714283*G0_0_0_2_4 + 0.00714285714285711*G0_0_0_3_0 - 0.0421428571428569*G0_0_0_3_1 + 0.00785714285714281*G0_0_0_3_2 - 0.0228571428571428*G0_0_0_3_3 - 0.0142857142857142*G0_0_0_3_5 + 0.0421428571428569*G0_0_0_4_0 - 0.00714285714285711*G0_0_0_4_1 - 0.00785714285714283*G0_0_0_4_2 + 0.0228571428571428*G0_0_0_4_4 + 0.0142857142857142*G0_0_0_4_5 + 0.0499999999999997*G0_0_0_5_0 - 0.0499999999999997*G0_0_0_5_1 - 0.0142857142857142*G0_0_0_5_3 + 0.0142857142857142*G0_0_0_5_4 + 0.131845238095237*G0_0_1_0_0 - 0.0103670634920634*G0_0_1_0_1 - 0.0103670634920634*G0_0_1_0_2 + 0.0013888888888889*G0_0_1_0_3 + 0.0428571428571426*G0_0_1_0_4 + 0.0428571428571426*G0_0_1_0_5 - 0.0103670634920634*G0_0_1_1_0 + 0.0064880952380952*G0_0_1_1_1 + 0.000714285714285699*G0_0_1_1_3 - 0.00575396825396823*G0_0_1_1_4 - 0.00714285714285711*G0_0_1_1_5 - 0.0103670634920634*G0_0_1_2_0 + 0.00648809523809522*G0_0_1_2_2 + 0.000714285714285713*G0_0_1_2_3 - 0.00714285714285711*G0_0_1_2_4 - 0.00575396825396823*G0_0_1_2_5 + 0.0013888888888889*G0_0_1_3_0 + 0.0007142857142857*G0_0_1_3_1 + 0.000714285714285713*G0_0_1_3_2 + 0.023174603174603*G0_0_1_3_3 + 0.00873015873015869*G0_0_1_3_4 + 0.00873015873015869*G0_0_1_3_5 + 0.0428571428571426*G0_0_1_4_0 - 0.00575396825396823*G0_0_1_4_1 - 0.00714285714285711*G0_0_1_4_2 + 0.00873015873015869*G0_0_1_4_3 + 0.0460317460317458*G0_0_1_4_4 + 0.0230158730158729*G0_0_1_4_5 + 0.0428571428571426*G0_0_1_5_0 - 0.00714285714285711*G0_0_1_5_1 - 0.00575396825396823*G0_0_1_5_2 + 0.00873015873015869*G0_0_1_5_3 + 0.0230158730158729*G0_0_1_5_4 + 0.0460317460317458*G0_0_1_5_5 + 0.131845238095237*G0_1_0_0_0 - 0.0103670634920634*G0_1_0_0_1 - 0.0103670634920634*G0_1_0_0_2 + 0.0013888888888889*G0_1_0_0_3 + 0.0428571428571426*G0_1_0_0_4 + 0.0428571428571426*G0_1_0_0_5 - 0.0103670634920634*G0_1_0_1_0 + 0.0064880952380952*G0_1_0_1_1 + 0.000714285714285699*G0_1_0_1_3 - 0.00575396825396823*G0_1_0_1_4 - 0.00714285714285711*G0_1_0_1_5 - 0.0103670634920634*G0_1_0_2_0 + 0.00648809523809522*G0_1_0_2_2 + 0.000714285714285713*G0_1_0_2_3 - 0.00714285714285711*G0_1_0_2_4 - 0.00575396825396823*G0_1_0_2_5 + 0.0013888888888889*G0_1_0_3_0 + 0.0007142857142857*G0_1_0_3_1 + 0.000714285714285714*G0_1_0_3_2 + 0.023174603174603*G0_1_0_3_3 + 0.00873015873015869*G0_1_0_3_4 + 0.00873015873015869*G0_1_0_3_5 + 0.0428571428571426*G0_1_0_4_0 - 0.00575396825396823*G0_1_0_4_1 - 0.00714285714285711*G0_1_0_4_2 + 0.00873015873015869*G0_1_0_4_3 + 0.0460317460317458*G0_1_0_4_4 + 0.0230158730158729*G0_1_0_4_5 + 0.0428571428571426*G0_1_0_5_0 - 0.00714285714285711*G0_1_0_5_1 - 0.00575396825396823*G0_1_0_5_2 + 0.00873015873015869*G0_1_0_5_3 + 0.0230158730158729*G0_1_0_5_4 + 0.0460317460317458*G0_1_0_5_5 + 0.131845238095237*G0_1_1_0_0 - 0.0103670634920634*G0_1_1_0_1 - 0.0103670634920634*G0_1_1_0_2 + 0.0013888888888889*G0_1_1_0_3 + 0.0428571428571426*G0_1_1_0_4 + 0.0428571428571426*G0_1_1_0_5 - 0.0103670634920634*G0_1_1_1_0 + 0.0064880952380952*G0_1_1_1_1 + 0.000714285714285704*G0_1_1_1_3 - 0.00575396825396823*G0_1_1_1_4 - 0.00714285714285711*G0_1_1_1_5 - 0.0103670634920634*G0_1_1_2_0 + 0.00648809523809522*G0_1_1_2_2 + 0.000714285714285713*G0_1_1_2_3 - 0.00714285714285711*G0_1_1_2_4 - 0.00575396825396823*G0_1_1_2_5 + 0.0013888888888889*G0_1_1_3_0 + 0.000714285714285705*G0_1_1_3_1 + 0.000714285714285713*G0_1_1_3_2 + 0.023174603174603*G0_1_1_3_3 + 0.00873015873015869*G0_1_1_3_4 + 0.0087301587301587*G0_1_1_3_5 + 0.0428571428571426*G0_1_1_4_0 - 0.00575396825396823*G0_1_1_4_1 - 0.00714285714285711*G0_1_1_4_2 + 0.00873015873015869*G0_1_1_4_3 + 0.0460317460317458*G0_1_1_4_4 + 0.0230158730158729*G0_1_1_4_5 + 0.0428571428571427*G0_1_1_5_0 - 0.00714285714285711*G0_1_1_5_1 - 0.00575396825396823*G0_1_1_5_2 + 0.0087301587301587*G0_1_1_5_3 + 0.0230158730158729*G0_1_1_5_4 + 0.0460317460317458*G0_1_1_5_5; + A[79] = A[97] + 0.0803571428571428*G0_0_1_0_0 - 0.00723214285714285*G0_0_1_0_1 - 0.0152678571428571*G0_0_1_0_2 + 0.00642857142857143*G0_0_1_0_3 + 0.0482142857142856*G0_0_1_0_4 + 0.0803571428571425*G0_0_1_0_5 - 0.00723214285714285*G0_0_1_1_0 + 0.0160714285714285*G0_0_1_1_1 + 0.00080357142857143*G0_0_1_1_2 - 0.0257142857142856*G0_0_1_1_4 - 0.032142857142857*G0_0_1_1_5 - 0.0152678571428571*G0_0_1_2_0 + 0.00080357142857143*G0_0_1_2_1 + 0.0048214285714285*G0_0_1_2_2 + 0.00321428571428563*G0_0_1_2_3 - 0.0128571428571429*G0_0_1_2_4 + 0.0192857142857142*G0_0_1_2_5 + 0.00642857142857143*G0_0_1_3_0 + 0.00321428571428564*G0_0_1_3_2 + 0.051428571428571*G0_0_1_3_3 + 0.0385714285714284*G0_0_1_3_4 - 0.0514285714285712*G0_0_1_3_5 + 0.0482142857142856*G0_0_1_4_0 - 0.0257142857142856*G0_0_1_4_1 - 0.0128571428571429*G0_0_1_4_2 + 0.0385714285714284*G0_0_1_4_3 + 0.179999999999999*G0_0_1_4_4 + 0.0128571428571429*G0_0_1_4_5 + 0.0803571428571425*G0_0_1_5_0 - 0.032142857142857*G0_0_1_5_1 + 0.0192857142857142*G0_0_1_5_2 - 0.0514285714285712*G0_0_1_5_3 + 0.0128571428571429*G0_0_1_5_4 - 0.462857142857141*G0_0_1_5_5 - 0.0803571428571428*G0_1_0_0_0 + 0.00723214285714285*G0_1_0_0_1 + 0.0152678571428571*G0_1_0_0_2 - 0.00642857142857143*G0_1_0_0_3 - 0.0482142857142856*G0_1_0_0_4 - 0.0803571428571425*G0_1_0_0_5 + 0.00723214285714285*G0_1_0_1_0 - 0.0160714285714285*G0_1_0_1_1 - 0.000803571428571424*G0_1_0_1_2 + 0.0257142857142856*G0_1_0_1_4 + 0.032142857142857*G0_1_0_1_5 + 0.0152678571428571*G0_1_0_2_0 - 0.00080357142857143*G0_1_0_2_1 - 0.0048214285714285*G0_1_0_2_2 - 0.00321428571428563*G0_1_0_2_3 + 0.0128571428571429*G0_1_0_2_4 - 0.0192857142857142*G0_1_0_2_5 - 0.00642857142857143*G0_1_0_3_0 - 0.00321428571428563*G0_1_0_3_2 - 0.0514285714285712*G0_1_0_3_3 - 0.0385714285714284*G0_1_0_3_4 + 0.0514285714285712*G0_1_0_3_5 - 0.0482142857142856*G0_1_0_4_0 + 0.0257142857142856*G0_1_0_4_1 + 0.0128571428571429*G0_1_0_4_2 - 0.0385714285714284*G0_1_0_4_3 - 0.179999999999999*G0_1_0_4_4 - 0.0128571428571428*G0_1_0_4_5 - 0.0803571428571425*G0_1_0_5_0 + 0.032142857142857*G0_1_0_5_1 - 0.0192857142857142*G0_1_0_5_2 + 0.0514285714285712*G0_1_0_5_3 - 0.0128571428571429*G0_1_0_5_4 + 0.462857142857141*G0_1_0_5_5; + A[38] = A[83] - 0.00642857142857136*G0_0_1_0_0 - 0.0120535714285713*G0_0_1_0_1 - 0.00241071428571429*G0_0_1_0_2 + 0.0160714285714285*G0_0_1_0_3 + 0.00482142857142855*G0_0_1_0_4 + 0.0160714285714285*G0_0_1_0_5 - 0.0120535714285713*G0_0_1_1_0 + 0.26517857142857*G0_0_1_1_1 - 0.0120535714285713*G0_0_1_1_2 + 0.0482142857142853*G0_0_1_1_3 + 0.0482142857142853*G0_0_1_1_5 - 0.00241071428571429*G0_0_1_2_0 - 0.0120535714285713*G0_0_1_2_1 - 0.00642857142857133*G0_0_1_2_2 + 0.0160714285714286*G0_0_1_2_3 + 0.00482142857142862*G0_0_1_2_4 + 0.0160714285714286*G0_0_1_2_5 + 0.0160714285714285*G0_0_1_3_0 + 0.0482142857142853*G0_0_1_3_1 + 0.0160714285714286*G0_0_1_3_2 - 0.128571428571428*G0_0_1_3_3 - 0.0321428571428571*G0_0_1_3_4 - 0.0642857142857142*G0_0_1_3_5 + 0.00482142857142855*G0_0_1_4_0 + 0.00482142857142862*G0_0_1_4_2 - 0.0321428571428571*G0_0_1_4_3 - 0.0257142857142856*G0_0_1_4_4 - 0.0321428571428571*G0_0_1_4_5 + 0.0160714285714285*G0_0_1_5_0 + 0.0482142857142853*G0_0_1_5_1 + 0.0160714285714286*G0_0_1_5_2 - 0.0642857142857142*G0_0_1_5_3 - 0.0321428571428571*G0_0_1_5_4 - 0.128571428571428*G0_0_1_5_5 + 0.00642857142857136*G0_1_0_0_0 + 0.0120535714285713*G0_1_0_0_1 + 0.00241071428571429*G0_1_0_0_2 - 0.0160714285714285*G0_1_0_0_3 - 0.00482142857142855*G0_1_0_0_4 - 0.0160714285714285*G0_1_0_0_5 + 0.0120535714285713*G0_1_0_1_0 - 0.26517857142857*G0_1_0_1_1 + 0.0120535714285713*G0_1_0_1_2 - 0.0482142857142853*G0_1_0_1_3 - 0.0482142857142853*G0_1_0_1_5 + 0.00241071428571429*G0_1_0_2_0 + 0.0120535714285713*G0_1_0_2_1 + 0.00642857142857133*G0_1_0_2_2 - 0.0160714285714286*G0_1_0_2_3 - 0.00482142857142862*G0_1_0_2_4 - 0.0160714285714286*G0_1_0_2_5 - 0.0160714285714285*G0_1_0_3_0 - 0.0482142857142853*G0_1_0_3_1 - 0.0160714285714286*G0_1_0_3_2 + 0.128571428571428*G0_1_0_3_3 + 0.0321428571428571*G0_1_0_3_4 + 0.0642857142857142*G0_1_0_3_5 - 0.00482142857142855*G0_1_0_4_0 - 0.00482142857142862*G0_1_0_4_2 + 0.0321428571428571*G0_1_0_4_3 + 0.0257142857142856*G0_1_0_4_4 + 0.0321428571428571*G0_1_0_4_5 - 0.0160714285714285*G0_1_0_5_0 - 0.0482142857142853*G0_1_0_5_1 - 0.0160714285714286*G0_1_0_5_2 + 0.0642857142857142*G0_1_0_5_3 + 0.0321428571428571*G0_1_0_5_4 + 0.128571428571428*G0_1_0_5_5; + A[64] = A[38] - 0.0216964285714285*G0_0_0_0_0 - 0.0144642857142856*G0_0_0_0_1 + 0.047410714285714*G0_0_0_0_2 + 0.0337499999999998*G0_0_0_0_3 + 0.0482142857142855*G0_0_0_0_4 + 0.01125*G0_0_0_0_5 - 0.0144642857142856*G0_0_0_1_0 + 0.0610714285714282*G0_0_0_1_1 + 0.0289285714285713*G0_0_0_1_2 + 0.128571428571428*G0_0_0_1_3 + 0.0466071428571427*G0_0_0_1_4 + 0.0385714285714284*G0_0_0_1_5 + 0.047410714285714*G0_0_0_2_0 + 0.0289285714285713*G0_0_0_2_1 - 0.46205357142857*G0_0_0_2_2 - 0.210535714285713*G0_0_0_2_3 - 0.191249999999999*G0_0_0_2_4 - 0.00803571428571437*G0_0_0_2_5 + 0.0337499999999998*G0_0_0_3_0 + 0.128571428571428*G0_0_0_3_1 - 0.210535714285713*G0_0_0_3_2 - 0.141428571428571*G0_0_0_3_3 - 0.160714285714285*G0_0_0_3_4 - 0.0514285714285713*G0_0_0_3_5 + 0.0482142857142855*G0_0_0_4_0 + 0.0466071428571427*G0_0_0_4_1 - 0.191249999999999*G0_0_0_4_2 - 0.160714285714285*G0_0_0_4_3 - 0.372857142857141*G0_0_0_4_4 - 0.0771428571428569*G0_0_0_4_5 + 0.01125*G0_0_0_5_0 + 0.0385714285714284*G0_0_0_5_1 - 0.00803571428571437*G0_0_0_5_2 - 0.0514285714285713*G0_0_0_5_3 - 0.0771428571428569*G0_0_0_5_4 - 0.0899999999999997*G0_0_0_5_5 - 0.0168749999999999*G0_0_1_0_1 + 0.0168749999999999*G0_0_1_0_2 + 0.0144642857142857*G0_0_1_0_4 - 0.0144642857142856*G0_0_1_0_5 - 0.0168749999999999*G0_0_1_1_0 + 0.0843749999999995*G0_0_1_1_1 + 0.139821428571428*G0_0_1_1_3 + 0.0289285714285713*G0_0_1_1_4 + 0.053035714285714*G0_0_1_1_5 + 0.0168749999999999*G0_0_1_2_0 - 0.0843749999999998*G0_0_1_2_2 - 0.139821428571428*G0_0_1_2_3 - 0.0530357142857141*G0_0_1_2_4 - 0.0289285714285714*G0_0_1_2_5 + 0.139821428571428*G0_0_1_3_1 - 0.139821428571428*G0_0_1_3_2 - 0.0578571428571427*G0_0_1_3_4 + 0.0578571428571426*G0_0_1_3_5 + 0.0144642857142857*G0_0_1_4_0 + 0.0289285714285713*G0_0_1_4_1 - 0.0530357142857141*G0_0_1_4_2 - 0.0578571428571427*G0_0_1_4_3 - 0.0771428571428569*G0_0_1_4_4 - 0.0144642857142856*G0_0_1_5_0 + 0.053035714285714*G0_0_1_5_1 - 0.0289285714285714*G0_0_1_5_2 + 0.0578571428571426*G0_0_1_5_3 + 0.0771428571428567*G0_0_1_5_5 - 0.0265178571428569*G0_1_0_0_1 + 0.026517857142857*G0_1_0_0_2 + 0.00321428571428571*G0_1_0_0_4 - 0.00321428571428562*G0_1_0_0_5 - 0.0265178571428569*G0_1_0_1_0 + 0.355982142857141*G0_1_0_1_1 + 0.171964285714285*G0_1_0_1_3 + 0.0128571428571428*G0_1_0_1_4 + 0.0964285714285708*G0_1_0_1_5 + 0.026517857142857*G0_1_0_2_0 - 0.355982142857141*G0_1_0_2_2 - 0.171964285714285*G0_1_0_2_3 - 0.096428571428571*G0_1_0_2_4 - 0.0128571428571429*G0_1_0_2_5 + 0.171964285714285*G0_1_0_3_1 - 0.171964285714285*G0_1_0_3_2 - 0.0257142857142856*G0_1_0_3_4 + 0.0257142857142855*G0_1_0_3_5 + 0.00321428571428571*G0_1_0_4_0 + 0.0128571428571428*G0_1_0_4_1 - 0.096428571428571*G0_1_0_4_2 - 0.0257142857142856*G0_1_0_4_3 + 0.0257142857142856*G0_1_0_4_4 - 0.00321428571428563*G0_1_0_5_0 + 0.0964285714285708*G0_1_0_5_1 - 0.0128571428571429*G0_1_0_5_2 + 0.0257142857142855*G0_1_0_5_3 - 0.0257142857142859*G0_1_0_5_5 + 0.0216964285714285*G0_1_1_0_0 - 0.0474107142857139*G0_1_1_0_1 + 0.0144642857142856*G0_1_1_0_2 - 0.0337499999999998*G0_1_1_0_3 - 0.0112499999999999*G0_1_1_0_4 - 0.0482142857142854*G0_1_1_0_5 - 0.0474107142857139*G0_1_1_1_0 + 0.462053571428569*G0_1_1_1_1 - 0.0289285714285713*G0_1_1_1_2 + 0.210535714285713*G0_1_1_1_3 + 0.00803571428571427*G0_1_1_1_4 + 0.191249999999999*G0_1_1_1_5 + 0.0144642857142856*G0_1_1_2_0 - 0.0289285714285713*G0_1_1_2_1 - 0.0610714285714284*G0_1_1_2_2 - 0.128571428571428*G0_1_1_2_3 - 0.0385714285714284*G0_1_1_2_4 - 0.0466071428571427*G0_1_1_2_5 - 0.0337499999999998*G0_1_1_3_0 + 0.210535714285713*G0_1_1_3_1 - 0.128571428571428*G0_1_1_3_2 + 0.141428571428571*G0_1_1_3_3 + 0.0514285714285712*G0_1_1_3_4 + 0.160714285714285*G0_1_1_3_5 - 0.0112499999999999*G0_1_1_4_0 + 0.00803571428571427*G0_1_1_4_1 - 0.0385714285714284*G0_1_1_4_2 + 0.0514285714285712*G0_1_1_4_3 + 0.0899999999999995*G0_1_1_4_4 + 0.0771428571428568*G0_1_1_4_5 - 0.0482142857142854*G0_1_1_5_0 + 0.191249999999999*G0_1_1_5_1 - 0.0466071428571427*G0_1_1_5_2 + 0.160714285714285*G0_1_1_5_3 + 0.0771428571428568*G0_1_1_5_4 + 0.372857142857141*G0_1_1_5_5; + A[46] = A[64] + 0.00642857142857146*G0_0_1_0_0 + 0.00241071428571427*G0_0_1_0_1 + 0.0120535714285713*G0_0_1_0_2 - 0.0160714285714285*G0_0_1_0_3 - 0.0160714285714285*G0_0_1_0_4 - 0.00482142857142853*G0_0_1_0_5 + 0.00241071428571427*G0_0_1_1_0 + 0.00642857142857146*G0_0_1_1_1 + 0.0120535714285713*G0_0_1_1_2 - 0.0160714285714285*G0_0_1_1_3 - 0.0160714285714285*G0_0_1_1_4 - 0.00482142857142854*G0_0_1_1_5 + 0.0120535714285713*G0_0_1_2_0 + 0.0120535714285713*G0_0_1_2_1 - 0.26517857142857*G0_0_1_2_2 - 0.0482142857142854*G0_0_1_2_3 - 0.0482142857142855*G0_0_1_2_4 - 0.0160714285714285*G0_0_1_3_0 - 0.0160714285714285*G0_0_1_3_1 - 0.0482142857142854*G0_0_1_3_2 + 0.128571428571428*G0_0_1_3_3 + 0.0642857142857141*G0_0_1_3_4 + 0.0321428571428571*G0_0_1_3_5 - 0.0160714285714285*G0_0_1_4_0 - 0.0160714285714285*G0_0_1_4_1 - 0.0482142857142855*G0_0_1_4_2 + 0.0642857142857141*G0_0_1_4_3 + 0.128571428571428*G0_0_1_4_4 + 0.032142857142857*G0_0_1_4_5 - 0.00482142857142853*G0_0_1_5_0 - 0.00482142857142854*G0_0_1_5_1 + 0.0321428571428571*G0_0_1_5_3 + 0.032142857142857*G0_0_1_5_4 + 0.0257142857142858*G0_0_1_5_5 - 0.00642857142857146*G0_1_0_0_0 - 0.00241071428571427*G0_1_0_0_1 - 0.0120535714285713*G0_1_0_0_2 + 0.0160714285714285*G0_1_0_0_3 + 0.0160714285714285*G0_1_0_0_4 + 0.00482142857142853*G0_1_0_0_5 - 0.00241071428571427*G0_1_0_1_0 - 0.00642857142857146*G0_1_0_1_1 - 0.0120535714285714*G0_1_0_1_2 + 0.0160714285714285*G0_1_0_1_3 + 0.0160714285714285*G0_1_0_1_4 + 0.00482142857142854*G0_1_0_1_5 - 0.0120535714285713*G0_1_0_2_0 - 0.0120535714285713*G0_1_0_2_1 + 0.26517857142857*G0_1_0_2_2 + 0.0482142857142854*G0_1_0_2_3 + 0.0482142857142855*G0_1_0_2_4 + 0.0160714285714285*G0_1_0_3_0 + 0.0160714285714285*G0_1_0_3_1 + 0.0482142857142854*G0_1_0_3_2 - 0.128571428571428*G0_1_0_3_3 - 0.0642857142857141*G0_1_0_3_4 - 0.0321428571428571*G0_1_0_3_5 + 0.0160714285714285*G0_1_0_4_0 + 0.0160714285714285*G0_1_0_4_1 + 0.0482142857142855*G0_1_0_4_2 - 0.0642857142857141*G0_1_0_4_3 - 0.128571428571428*G0_1_0_4_4 - 0.032142857142857*G0_1_0_4_5 + 0.00482142857142853*G0_1_0_5_0 + 0.00482142857142854*G0_1_0_5_1 - 0.0321428571428571*G0_1_0_5_3 - 0.0321428571428571*G0_1_0_5_4 - 0.0257142857142858*G0_1_0_5_5; + A[66] = -A[64] - 0.00642857142857146*G0_0_1_0_0 - 0.00241071428571427*G0_0_1_0_1 - 0.0120535714285713*G0_0_1_0_2 + 0.0160714285714285*G0_0_1_0_3 + 0.0160714285714285*G0_0_1_0_4 + 0.00482142857142853*G0_0_1_0_5 - 0.00241071428571427*G0_0_1_1_0 - 0.00642857142857145*G0_0_1_1_1 - 0.0120535714285714*G0_0_1_1_2 + 0.0160714285714285*G0_0_1_1_3 + 0.0160714285714285*G0_0_1_1_4 + 0.00482142857142854*G0_0_1_1_5 - 0.0120535714285713*G0_0_1_2_0 - 0.0120535714285713*G0_0_1_2_1 + 0.26517857142857*G0_0_1_2_2 + 0.0482142857142854*G0_0_1_2_3 + 0.0482142857142855*G0_0_1_2_4 + 0.0160714285714285*G0_0_1_3_0 + 0.0160714285714285*G0_0_1_3_1 + 0.0482142857142854*G0_0_1_3_2 - 0.128571428571428*G0_0_1_3_3 - 0.0642857142857141*G0_0_1_3_4 - 0.0321428571428571*G0_0_1_3_5 + 0.0160714285714285*G0_0_1_4_0 + 0.0160714285714285*G0_0_1_4_1 + 0.0482142857142855*G0_0_1_4_2 - 0.0642857142857141*G0_0_1_4_3 - 0.128571428571428*G0_0_1_4_4 - 0.032142857142857*G0_0_1_4_5 + 0.00482142857142853*G0_0_1_5_0 + 0.00482142857142854*G0_0_1_5_1 - 0.0321428571428571*G0_0_1_5_3 - 0.032142857142857*G0_0_1_5_4 - 0.0257142857142858*G0_0_1_5_5 + 0.0940178571428568*G0_1_1_0_0 - 0.00883928571428567*G0_1_1_0_1 - 0.0160714285714285*G0_1_1_0_2 - 0.0176785714285713*G0_1_1_0_3 + 0.00160714285714289*G0_1_1_0_4 + 0.0353571428571427*G0_1_1_0_5 - 0.00883928571428568*G0_1_1_1_0 + 0.0168749999999999*G0_1_1_1_1 - 0.00803571428571423*G0_1_1_1_2 - 0.0176785714285713*G0_1_1_1_3 - 0.0466071428571426*G0_1_1_1_4 - 0.0241071428571428*G0_1_1_1_5 - 0.0160714285714285*G0_1_1_2_0 - 0.00803571428571423*G0_1_1_2_1 + 0.241071428571428*G0_1_1_2_2 + 0.032142857142857*G0_1_1_2_3 + 0.0160714285714285*G0_1_1_2_4 - 0.0241071428571427*G0_1_1_2_5 - 0.0176785714285713*G0_1_1_3_0 - 0.0176785714285713*G0_1_1_3_1 + 0.032142857142857*G0_1_1_3_2 + 0.0642857142857141*G0_1_1_3_3 + 0.128571428571428*G0_1_1_3_4 + 0.0835714285714283*G0_1_1_3_5 + 0.0016071428571429*G0_1_1_4_0 - 0.0466071428571426*G0_1_1_4_1 + 0.0160714285714285*G0_1_1_4_2 + 0.128571428571428*G0_1_1_4_3 + 0.449999999999998*G0_1_1_4_4 + 0.141428571428571*G0_1_1_4_5 + 0.0353571428571427*G0_1_1_5_0 - 0.0241071428571428*G0_1_1_5_1 - 0.0241071428571427*G0_1_1_5_2 + 0.0835714285714283*G0_1_1_5_3 + 0.141428571428571*G0_1_1_5_4 + 0.269999999999999*G0_1_1_5_5; + A[44] = -A[64] + 0.00642857142857146*G0_1_0_0_0 + 0.00241071428571427*G0_1_0_0_1 + 0.0120535714285713*G0_1_0_0_2 - 0.0160714285714285*G0_1_0_0_3 - 0.0160714285714285*G0_1_0_0_4 - 0.00482142857142853*G0_1_0_0_5 + 0.00241071428571427*G0_1_0_1_0 + 0.00642857142857146*G0_1_0_1_1 + 0.0120535714285714*G0_1_0_1_2 - 0.0160714285714285*G0_1_0_1_3 - 0.0160714285714285*G0_1_0_1_4 - 0.00482142857142854*G0_1_0_1_5 + 0.0120535714285713*G0_1_0_2_0 + 0.0120535714285713*G0_1_0_2_1 - 0.26517857142857*G0_1_0_2_2 - 0.0482142857142854*G0_1_0_2_3 - 0.0482142857142855*G0_1_0_2_4 - 0.0160714285714285*G0_1_0_3_0 - 0.0160714285714285*G0_1_0_3_1 - 0.0482142857142854*G0_1_0_3_2 + 0.128571428571429*G0_1_0_3_3 + 0.0642857142857142*G0_1_0_3_4 + 0.0321428571428571*G0_1_0_3_5 - 0.0160714285714285*G0_1_0_4_0 - 0.0160714285714285*G0_1_0_4_1 - 0.0482142857142855*G0_1_0_4_2 + 0.0642857142857142*G0_1_0_4_3 + 0.128571428571428*G0_1_0_4_4 + 0.0321428571428571*G0_1_0_4_5 - 0.00482142857142853*G0_1_0_5_0 - 0.00482142857142854*G0_1_0_5_1 + 0.0321428571428571*G0_1_0_5_3 + 0.0321428571428571*G0_1_0_5_4 + 0.0257142857142858*G0_1_0_5_5 + 0.0233035714285714*G0_1_1_0_0 - 0.00642857142857139*G0_1_1_0_1 + 0.00401785714285711*G0_1_1_0_2 - 0.0626785714285711*G0_1_1_0_3 - 0.0337499999999998*G0_1_1_0_4 - 0.0289285714285712*G0_1_1_0_5 - 0.00642857142857139*G0_1_1_1_0 + 0.100446428571428*G0_1_1_1_1 - 0.00401785714285714*G0_1_1_1_2 - 0.0144642857142857*G0_1_1_1_3 - 0.0337499999999998*G0_1_1_1_4 + 0.0305357142857141*G0_1_1_1_5 + 0.00401785714285711*G0_1_1_2_0 - 0.00401785714285713*G0_1_1_2_1 - 0.0241071428571428*G0_1_1_2_2 - 0.032142857142857*G0_1_1_2_3 - 0.0160714285714285*G0_1_1_2_4 - 0.0241071428571428*G0_1_1_2_5 - 0.0626785714285711*G0_1_1_3_0 - 0.0144642857142857*G0_1_1_3_1 - 0.032142857142857*G0_1_1_3_2 + 0.578571428571426*G0_1_1_3_3 + 0.192857142857142*G0_1_1_3_4 + 0.173571428571428*G0_1_1_3_5 - 0.0337499999999998*G0_1_1_4_0 - 0.0337499999999998*G0_1_1_4_1 - 0.0160714285714285*G0_1_1_4_2 + 0.192857142857142*G0_1_1_4_3 + 0.192857142857142*G0_1_1_4_4 + 0.115714285714285*G0_1_1_4_5 - 0.0289285714285712*G0_1_1_5_0 + 0.0305357142857141*G0_1_1_5_1 - 0.0241071428571428*G0_1_1_5_2 + 0.173571428571428*G0_1_1_5_3 + 0.115714285714285*G0_1_1_5_4 + 0.295714285714284*G0_1_1_5_5; + A[20] = -A[21] - 0.0168749999999999*G0_1_0_0_0 - 0.000446428571428574*G0_1_0_0_2 - 0.000357142857142853*G0_1_0_0_3 - 0.00499999999999996*G0_1_0_0_4 - 0.0121428571428571*G0_1_0_0_5 + 0.0168749999999999*G0_1_0_1_1 + 0.000446428571428572*G0_1_0_1_2 + 0.00499999999999996*G0_1_0_1_3 + 0.000357142857142852*G0_1_0_1_4 + 0.012142857142857*G0_1_0_1_5 - 0.000446428571428574*G0_1_0_2_0 + 0.000446428571428572*G0_1_0_2_1 - 0.00714285714285709*G0_1_0_2_3 + 0.00714285714285711*G0_1_0_2_4 - 0.000357142857142853*G0_1_0_3_0 + 0.00499999999999996*G0_1_0_3_1 - 0.00714285714285709*G0_1_0_3_2 - 0.0142857142857142*G0_1_0_3_3 + 0.000714285714285692*G0_1_0_3_5 - 0.00499999999999996*G0_1_0_4_0 + 0.000357142857142852*G0_1_0_4_1 + 0.00714285714285711*G0_1_0_4_2 + 0.0142857142857142*G0_1_0_4_4 - 0.000714285714285702*G0_1_0_4_5 - 0.0121428571428571*G0_1_0_5_0 + 0.0121428571428571*G0_1_0_5_1 + 0.000714285714285692*G0_1_0_5_3 - 0.000714285714285702*G0_1_0_5_4 - 0.019345238095238*G0_1_1_0_0 + 0.00157242063492062*G0_1_1_0_1 + 0.00112599206349206*G0_1_1_0_2 + 0.000575396825396824*G0_1_1_0_3 - 0.00178571428571426*G0_1_1_0_4 - 0.00892857142857137*G0_1_1_0_5 + 0.00157242063492062*G0_1_1_1_0 - 0.00247023809523808*G0_1_1_1_1 + 0.00157242063492063*G0_1_1_1_2 + 0.0032142857142857*G0_1_1_1_3 + 0.000932539682539677*G0_1_1_1_4 + 0.00321428571428569*G0_1_1_1_5 + 0.00112599206349206*G0_1_1_2_0 + 0.00157242063492063*G0_1_1_2_1 - 0.0193452380952381*G0_1_1_2_2 - 0.0089285714285714*G0_1_1_2_3 - 0.00178571428571429*G0_1_1_2_4 + 0.000575396825396817*G0_1_1_2_5 + 0.000575396825396824*G0_1_1_3_0 + 0.0032142857142857*G0_1_1_3_1 - 0.0089285714285714*G0_1_1_3_2 - 0.00888888888888887*G0_1_1_3_3 - 0.00301587301587301*G0_1_1_3_4 - 0.0023015873015873*G0_1_1_3_5 - 0.00178571428571426*G0_1_1_4_0 + 0.000932539682539677*G0_1_1_4_1 - 0.00178571428571429*G0_1_1_4_2 - 0.00301587301587301*G0_1_1_4_3 + 0.00539682539682537*G0_1_1_4_4 - 0.003015873015873*G0_1_1_4_5 - 0.00892857142857137*G0_1_1_5_0 + 0.00321428571428569*G0_1_1_5_1 + 0.000575396825396817*G0_1_1_5_2 - 0.0023015873015873*G0_1_1_5_3 - 0.003015873015873*G0_1_1_5_4 - 0.00888888888888885*G0_1_1_5_5; + A[18] = -A[16] - 0.0198214285714284*G0_0_0_0_0 + 0.0126339285714285*G0_0_0_0_1 + 0.00486607142857141*G0_0_0_0_2 + 0.00553571428571424*G0_0_0_0_3 - 0.00321428571428568*G0_0_0_0_4 + 0.0126339285714285*G0_0_0_1_0 - 0.19017857142857*G0_0_0_1_1 + 0.0148660714285713*G0_0_0_1_2 - 0.0660714285714282*G0_0_0_1_3 + 0.0019642857142857*G0_0_0_1_4 - 0.0410714285714283*G0_0_0_1_5 + 0.00486607142857141*G0_0_0_2_0 + 0.0148660714285714*G0_0_0_2_1 - 0.0404464285714285*G0_0_0_2_2 + 0.0121428571428571*G0_0_0_2_3 - 0.0142857142857143*G0_0_0_2_4 + 0.00946428571428566*G0_0_0_2_5 + 0.00553571428571424*G0_0_0_3_0 - 0.0660714285714282*G0_0_0_3_1 + 0.0121428571428571*G0_0_0_3_2 - 0.0485714285714283*G0_0_0_3_3 - 0.0149999999999999*G0_0_0_3_4 - 0.0299999999999998*G0_0_0_3_5 - 0.00321428571428568*G0_0_0_4_0 + 0.0019642857142857*G0_0_0_4_1 - 0.0142857142857143*G0_0_0_4_2 - 0.0149999999999999*G0_0_0_4_3 - 0.0885714285714282*G0_0_0_4_4 - 0.0228571428571428*G0_0_0_4_5 - 0.0410714285714283*G0_0_0_5_1 + 0.00946428571428566*G0_0_0_5_2 - 0.0299999999999998*G0_0_0_5_3 - 0.0228571428571427*G0_0_0_5_4 - 0.0628571428571425*G0_0_0_5_5 - 0.0117857142857142*G0_0_1_0_0 + 0.0209374999999998*G0_0_1_0_1 - 0.00183035714285712*G0_0_1_0_2 + 0.0119642857142856*G0_0_1_0_3 + 0.00642857142857141*G0_0_1_0_4 + 0.0224999999999999*G0_0_1_0_5 + 0.0209374999999998*G0_0_1_1_0 - 0.243749999999999*G0_0_1_1_1 + 0.0204910714285713*G0_0_1_1_2 - 0.0874999999999995*G0_0_1_1_3 - 0.00660714285714283*G0_0_1_1_4 - 0.0946428571428566*G0_0_1_1_5 - 0.00183035714285712*G0_0_1_2_0 + 0.0204910714285713*G0_0_1_2_1 - 0.0286607142857143*G0_0_1_2_2 + 0.0174999999999999*G0_0_1_2_3 - 0.00571428571428572*G0_0_1_2_4 + 0.0116071428571428*G0_0_1_2_5 + 0.0119642857142856*G0_0_1_3_0 - 0.0874999999999995*G0_0_1_3_1 + 0.0174999999999999*G0_0_1_3_2 - 0.074285714285714*G0_0_1_3_3 - 0.0107142857142857*G0_0_1_3_4 - 0.0471428571428569*G0_0_1_3_5 + 0.00642857142857141*G0_0_1_4_0 - 0.00660714285714283*G0_0_1_4_1 - 0.00571428571428572*G0_0_1_4_2 - 0.0107142857142857*G0_0_1_4_3 + 0.0399999999999998*G0_0_1_4_4 - 0.00999999999999994*G0_0_1_4_5 + 0.0224999999999999*G0_0_1_5_0 - 0.0946428571428566*G0_0_1_5_1 + 0.0116071428571428*G0_0_1_5_2 - 0.0471428571428569*G0_0_1_5_3 - 0.00999999999999994*G0_0_1_5_4 - 0.088571428571428*G0_0_1_5_5; + A[13] = -A[18] - 0.0230357142857141*G0_0_0_0_0 + 0.00758928571428565*G0_0_0_0_1 + 0.00508928571428569*G0_0_0_0_2 + 0.00714285714285708*G0_0_0_0_3 - 0.00571428571428568*G0_0_0_0_4 - 0.0017857142857143*G0_0_0_0_5 + 0.00758928571428565*G0_0_0_1_0 - 0.152678571428571*G0_0_0_1_1 + 0.00758928571428567*G0_0_0_1_2 - 0.0214285714285712*G0_0_0_1_3 + 0.00892857142857138*G0_0_0_1_4 - 0.0214285714285713*G0_0_0_1_5 + 0.00508928571428569*G0_0_0_2_0 + 0.00758928571428567*G0_0_0_2_1 - 0.0230357142857142*G0_0_0_2_2 - 0.0017857142857143*G0_0_0_2_3 - 0.00571428571428572*G0_0_0_2_4 + 0.00714285714285709*G0_0_0_2_5 + 0.00714285714285708*G0_0_0_3_0 - 0.0214285714285713*G0_0_0_3_1 - 0.0017857142857143*G0_0_0_3_2 - 0.0571428571428568*G0_0_0_3_3 - 0.032142857142857*G0_0_0_3_4 - 0.0285714285714284*G0_0_0_3_5 - 0.00571428571428568*G0_0_0_4_0 + 0.00892857142857138*G0_0_0_4_1 - 0.00571428571428572*G0_0_0_4_2 - 0.032142857142857*G0_0_0_4_3 - 0.109999999999999*G0_0_0_4_4 - 0.032142857142857*G0_0_0_4_5 - 0.0017857142857143*G0_0_0_5_0 - 0.0214285714285713*G0_0_0_5_1 + 0.00714285714285709*G0_0_0_5_2 - 0.0285714285714284*G0_0_0_5_3 - 0.032142857142857*G0_0_0_5_4 - 0.0571428571428569*G0_0_0_5_5; + A[88] = -A[83] + 0.0940178571428566*G0_0_0_0_0 - 0.0160714285714285*G0_0_0_0_1 - 0.00883928571428568*G0_0_0_0_2 - 0.0176785714285713*G0_0_0_0_3 + 0.0353571428571427*G0_0_0_0_4 + 0.00160714285714287*G0_0_0_0_5 - 0.0160714285714285*G0_0_0_1_0 + 0.241071428571427*G0_0_0_1_1 - 0.00803571428571422*G0_0_0_1_2 + 0.0321428571428568*G0_0_0_1_3 - 0.0241071428571427*G0_0_0_1_4 + 0.0160714285714284*G0_0_0_1_5 - 0.00883928571428568*G0_0_0_2_0 - 0.00803571428571422*G0_0_0_2_1 + 0.016875*G0_0_0_2_2 - 0.0176785714285713*G0_0_0_2_3 - 0.0241071428571427*G0_0_0_2_4 - 0.0466071428571427*G0_0_0_2_5 - 0.0176785714285713*G0_0_0_3_0 + 0.0321428571428568*G0_0_0_3_1 - 0.0176785714285713*G0_0_0_3_2 + 0.0642857142857138*G0_0_0_3_3 + 0.0835714285714282*G0_0_0_3_4 + 0.128571428571428*G0_0_0_3_5 + 0.0353571428571427*G0_0_0_4_0 - 0.0241071428571427*G0_0_0_4_1 - 0.0241071428571427*G0_0_0_4_2 + 0.0835714285714282*G0_0_0_4_3 + 0.269999999999999*G0_0_0_4_4 + 0.141428571428571*G0_0_0_4_5 + 0.00160714285714287*G0_0_0_5_0 + 0.0160714285714284*G0_0_0_5_1 - 0.0466071428571427*G0_0_0_5_2 + 0.128571428571428*G0_0_0_5_3 + 0.141428571428571*G0_0_0_5_4 + 0.449999999999998*G0_0_0_5_5 - 0.00642857142857136*G0_1_0_0_0 - 0.0120535714285713*G0_1_0_0_1 - 0.00241071428571429*G0_1_0_0_2 + 0.0160714285714285*G0_1_0_0_3 + 0.00482142857142853*G0_1_0_0_4 + 0.0160714285714285*G0_1_0_0_5 - 0.0120535714285713*G0_1_0_1_0 + 0.26517857142857*G0_1_0_1_1 - 0.0120535714285713*G0_1_0_1_2 + 0.0482142857142853*G0_1_0_1_3 + 0.0482142857142853*G0_1_0_1_5 - 0.00241071428571429*G0_1_0_2_0 - 0.0120535714285714*G0_1_0_2_1 - 0.00642857142857133*G0_1_0_2_2 + 0.0160714285714286*G0_1_0_2_3 + 0.00482142857142862*G0_1_0_2_4 + 0.0160714285714285*G0_1_0_2_5 + 0.0160714285714285*G0_1_0_3_0 + 0.0482142857142853*G0_1_0_3_1 + 0.0160714285714286*G0_1_0_3_2 - 0.128571428571428*G0_1_0_3_3 - 0.032142857142857*G0_1_0_3_4 - 0.0642857142857142*G0_1_0_3_5 + 0.00482142857142853*G0_1_0_4_0 + 0.00482142857142862*G0_1_0_4_2 - 0.032142857142857*G0_1_0_4_3 - 0.0257142857142857*G0_1_0_4_4 - 0.0321428571428571*G0_1_0_4_5 + 0.0160714285714285*G0_1_0_5_0 + 0.0482142857142853*G0_1_0_5_1 + 0.0160714285714285*G0_1_0_5_2 - 0.0642857142857142*G0_1_0_5_3 - 0.0321428571428571*G0_1_0_5_4 - 0.128571428571428*G0_1_0_5_5; + A[43] = -A[48] + 0.00241071428571431*G0_0_0_0_0 + 0.000401785714285709*G0_0_0_0_1 + 0.0164732142857142*G0_0_0_0_2 - 0.00642857142857141*G0_0_0_0_3 + 0.0257142857142856*G0_0_0_0_4 + 0.00160714285714284*G0_0_0_0_5 + 0.000401785714285709*G0_0_0_1_0 + 0.0080357142857143*G0_0_0_1_1 + 0.00441964285714284*G0_0_0_1_2 - 0.0160714285714285*G0_0_0_1_3 + 0.00321428571428569*G0_0_0_1_4 + 0.0164732142857142*G0_0_0_2_0 + 0.00441964285714284*G0_0_0_2_1 - 0.168749999999999*G0_0_0_2_2 - 0.00803571428571434*G0_0_0_2_3 - 0.0883928571428567*G0_0_0_2_4 + 0.00321428571428565*G0_0_0_2_5 - 0.00642857142857141*G0_0_0_3_0 - 0.0160714285714285*G0_0_0_3_1 - 0.00803571428571434*G0_0_0_3_2 + 0.154285714285714*G0_0_0_3_3 + 0.00642857142857147*G0_0_0_3_4 + 0.00642857142857149*G0_0_0_3_5 + 0.0257142857142856*G0_0_0_4_0 + 0.00321428571428569*G0_0_0_4_1 - 0.0883928571428567*G0_0_0_4_2 + 0.00642857142857147*G0_0_0_4_3 - 0.167142857142856*G0_0_0_4_4 - 0.0128571428571428*G0_0_0_4_5 + 0.00160714285714284*G0_0_0_5_0 + 0.00321428571428565*G0_0_0_5_2 + 0.00642857142857149*G0_0_0_5_3 - 0.0128571428571428*G0_0_0_5_4 - 0.0385714285714285*G0_0_0_5_5 + 0.00723214285714286*G0_1_0_0_0 + 0.00562499999999997*G0_1_0_0_2 - 0.0546428571428568*G0_1_0_0_3 - 0.020892857142857*G0_1_0_0_4 - 0.0257142857142856*G0_1_0_0_5 + 0.120535714285714*G0_1_0_1_1 - 0.00803571428571423*G0_1_0_1_2 - 0.0160714285714285*G0_1_0_1_3 - 0.0160714285714285*G0_1_0_1_4 + 0.0160714285714284*G0_1_0_1_5 + 0.00562499999999997*G0_1_0_2_0 - 0.00803571428571423*G0_1_0_2_1 - 0.00401785714285722*G0_1_0_2_2 - 0.00642857142857147*G0_1_0_2_3 - 0.0176785714285714*G0_1_0_2_4 - 0.00964285714285711*G0_1_0_2_5 - 0.0546428571428568*G0_1_0_3_0 - 0.0160714285714285*G0_1_0_3_1 - 0.00642857142857147*G0_1_0_3_2 + 0.578571428571426*G0_1_0_3_3 + 0.141428571428571*G0_1_0_3_4 + 0.128571428571428*G0_1_0_3_5 - 0.020892857142857*G0_1_0_4_0 - 0.0160714285714285*G0_1_0_4_1 - 0.0176785714285714*G0_1_0_4_2 + 0.141428571428571*G0_1_0_4_3 + 0.0385714285714284*G0_1_0_4_4 + 0.0514285714285712*G0_1_0_4_5 - 0.0257142857142856*G0_1_0_5_0 + 0.0160714285714284*G0_1_0_5_1 - 0.00964285714285711*G0_1_0_5_2 + 0.128571428571428*G0_1_0_5_3 + 0.0514285714285712*G0_1_0_5_4 - 0.0642857142857141*G0_1_0_5_5; + A[95] = A[59] + 0.0803571428571426*G0_0_1_0_0 - 0.0152678571428571*G0_0_1_0_1 - 0.00723214285714284*G0_0_1_0_2 + 0.0064285714285714*G0_0_1_0_3 + 0.0803571428571425*G0_0_1_0_4 + 0.0482142857142855*G0_0_1_0_5 - 0.0152678571428571*G0_0_1_1_0 + 0.00482142857142859*G0_0_1_1_1 + 0.000803571428571419*G0_0_1_1_2 + 0.00321428571428572*G0_0_1_1_3 + 0.0192857142857142*G0_0_1_1_4 - 0.0128571428571428*G0_0_1_1_5 - 0.00723214285714284*G0_0_1_2_0 + 0.000803571428571419*G0_0_1_2_1 + 0.0160714285714286*G0_0_1_2_2 - 0.032142857142857*G0_0_1_2_4 - 0.0257142857142856*G0_0_1_2_5 + 0.0064285714285714*G0_0_1_3_0 + 0.00321428571428572*G0_0_1_3_1 + 0.0514285714285715*G0_0_1_3_3 - 0.0514285714285712*G0_0_1_3_4 + 0.0385714285714285*G0_0_1_3_5 + 0.0803571428571425*G0_0_1_4_0 + 0.0192857142857142*G0_0_1_4_1 - 0.032142857142857*G0_0_1_4_2 - 0.0514285714285712*G0_0_1_4_3 - 0.462857142857141*G0_0_1_4_4 + 0.0128571428571428*G0_0_1_4_5 + 0.0482142857142855*G0_0_1_5_0 - 0.0128571428571428*G0_0_1_5_1 - 0.0257142857142856*G0_0_1_5_2 + 0.0385714285714285*G0_0_1_5_3 + 0.0128571428571428*G0_0_1_5_4 + 0.179999999999999*G0_0_1_5_5 - 0.0803571428571426*G0_1_0_0_0 + 0.0152678571428571*G0_1_0_0_1 + 0.00723214285714284*G0_1_0_0_2 - 0.00642857142857141*G0_1_0_0_3 - 0.0803571428571425*G0_1_0_0_4 - 0.0482142857142855*G0_1_0_0_5 + 0.0152678571428571*G0_1_0_1_0 - 0.00482142857142858*G0_1_0_1_1 - 0.000803571428571419*G0_1_0_1_2 - 0.00321428571428572*G0_1_0_1_3 - 0.0192857142857142*G0_1_0_1_4 + 0.0128571428571428*G0_1_0_1_5 + 0.00723214285714284*G0_1_0_2_0 - 0.000803571428571419*G0_1_0_2_1 - 0.0160714285714286*G0_1_0_2_2 + 0.032142857142857*G0_1_0_2_4 + 0.0257142857142856*G0_1_0_2_5 - 0.00642857142857141*G0_1_0_3_0 - 0.00321428571428571*G0_1_0_3_1 - 0.0514285714285714*G0_1_0_3_3 + 0.0514285714285712*G0_1_0_3_4 - 0.0385714285714285*G0_1_0_3_5 - 0.0803571428571425*G0_1_0_4_0 - 0.0192857142857142*G0_1_0_4_1 + 0.032142857142857*G0_1_0_4_2 + 0.0514285714285712*G0_1_0_4_3 + 0.462857142857141*G0_1_0_4_4 - 0.0128571428571428*G0_1_0_4_5 - 0.0482142857142855*G0_1_0_5_0 + 0.0128571428571428*G0_1_0_5_1 + 0.0257142857142856*G0_1_0_5_2 - 0.0385714285714285*G0_1_0_5_3 - 0.0128571428571428*G0_1_0_5_4 - 0.179999999999999*G0_1_0_5_5; + A[52] = -A[32] - 0.00374999999999998*G0_0_1_0_0 + 0.00267857142857141*G0_0_1_0_2 + 0.00428571428571427*G0_0_1_0_3 + 0.0171428571428571*G0_0_1_0_4 + 0.00107142857142858*G0_0_1_0_5 + 0.00374999999999993*G0_0_1_1_1 - 0.0026785714285714*G0_0_1_1_2 - 0.0171428571428571*G0_0_1_1_3 - 0.00428571428571428*G0_0_1_1_4 - 0.0010714285714286*G0_0_1_1_5 + 0.00267857142857141*G0_0_1_2_0 - 0.0026785714285714*G0_0_1_2_1 + 0.032142857142857*G0_0_1_2_3 - 0.032142857142857*G0_0_1_2_4 + 0.00428571428571427*G0_0_1_3_0 - 0.0171428571428571*G0_0_1_3_1 + 0.032142857142857*G0_0_1_3_2 - 0.00857142857142854*G0_0_1_3_5 + 0.0171428571428571*G0_0_1_4_0 - 0.00428571428571428*G0_0_1_4_1 - 0.032142857142857*G0_0_1_4_2 + 0.00857142857142855*G0_0_1_4_5 + 0.00107142857142858*G0_0_1_5_0 - 0.0010714285714286*G0_0_1_5_1 - 0.00857142857142854*G0_0_1_5_3 + 0.00857142857142855*G0_0_1_5_4 + 0.0326785714285712*G0_1_1_0_0 - 0.00642857142857138*G0_1_1_0_1 - 0.00339285714285713*G0_1_1_0_2 - 0.000357142857142842*G0_1_1_0_3 + 0.00892857142857137*G0_1_1_0_4 + 0.0114285714285714*G0_1_1_0_5 - 0.00642857142857138*G0_1_1_1_0 + 0.0364285714285712*G0_1_1_1_1 - 0.00607142857142853*G0_1_1_1_2 - 0.0082142857142857*G0_1_1_1_3 - 0.00464285714285712*G0_1_1_1_4 + 0.0103571428571428*G0_1_1_1_5 - 0.00339285714285713*G0_1_1_2_0 - 0.00607142857142853*G0_1_1_2_1 + 0.0776785714285713*G0_1_1_2_2 + 0.032142857142857*G0_1_1_2_3 - 0.00392857142857138*G0_1_1_2_5 - 0.000357142857142843*G0_1_1_3_0 - 0.0082142857142857*G0_1_1_3_1 + 0.032142857142857*G0_1_1_3_2 + 0.0114285714285713*G0_1_1_3_3 + 0.00999999999999995*G0_1_1_3_4 + 0.0085714285714285*G0_1_1_3_5 + 0.00892857142857137*G0_1_1_4_0 - 0.00464285714285712*G0_1_1_4_1 + 0.00999999999999995*G0_1_1_4_3 + 0.0114285714285714*G0_1_1_4_4 + 0.017142857142857*G0_1_1_4_5 + 0.0114285714285714*G0_1_1_5_0 + 0.0103571428571428*G0_1_1_5_1 - 0.00392857142857138*G0_1_1_5_2 + 0.0085714285714285*G0_1_1_5_3 + 0.017142857142857*G0_1_1_5_4 + 0.0742857142857138*G0_1_1_5_5; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p2_q3_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p2_q3_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q3_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q3_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q3_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q3_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q3_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q3_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q3_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q3_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q3_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q3_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p2_q4_quadrature.h b/laplacian_2d/laplacian_f2_p2_q4_quadrature.h new file mode 100644 index 0000000..ce6a2c6 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p2_q4_quadrature.h @@ -0,0 +1,7311 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P2_Q4_QUADRATURE_H +#define __LAPLACIAN_F2_P2_Q4_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q4_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q4_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q4_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q4_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q4_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q4_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q4_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q4_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q4_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q4_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q4_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q4_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p2_q4_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p2_q4_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W36[36] = {0.00619426535265906, 0.0116108747669979, 0.0120606064042655, 0.0084515357969434, 0.0037652982126918, 0.000748542561236343, 0.0130433943300833, 0.0244492622580587, 0.0253962715890485, 0.0177965759970269, 0.00792866733379675, 0.00157622175402364, 0.0169175056800133, 0.0317111115907051, 0.0329393989007878, 0.023082463651359, 0.0102836172287667, 0.00204438659154493, 0.0169175056800133, 0.0317111115907051, 0.0329393989007878, 0.023082463651359, 0.0102836172287667, 0.00204438659154493, 0.0130433943300833, 0.0244492622580587, 0.0253962715890485, 0.0177965759970269, 0.00792866733379675, 0.00157622175402364, 0.00619426535265908, 0.0116108747669979, 0.0120606064042655, 0.00845153579694342, 0.00376529821269181, 0.000748542561236345}; + // Quadrature points on the UFC reference element: (0.0327753666144599, 0.0293164271597849), (0.0287653330125591, 0.148078599668484), (0.0223868729780306, 0.336984690281154), (0.0149015633666711, 0.55867151877155), (0.00779187470128645, 0.769233862030055), (0.00246669715267023, 0.926945671319741), (0.164429241594827, 0.0293164271597849), (0.144311486950417, 0.148078599668484), (0.112311681780954, 0.336984690281154), (0.0747589734626491, 0.55867151877155), (0.0390907007328242, 0.769233862030055), (0.01237506041744, 0.926945671319741), (0.369529924372377, 0.0293164271597849), (0.324318304588776, 0.148078599668484), (0.252403568076518, 0.336984690281154), (0.168009519121192, 0.55867151877155), (0.0878504549759972, 0.769233862030055), (0.0278110821153606, 0.926945671319741), (0.601153648467838, 0.0293164271597849), (0.52760309574274, 0.148078599668484), (0.410611741642328, 0.336984690281154), (0.273318962107258, 0.55867151877155), (0.142915682993948, 0.769233862030055), (0.0452432465648983, 0.926945671319741), (0.806254331245388, 0.0293164271597849), (0.707609913381099, 0.148078599668484), (0.550703627937892, 0.336984690281154), (0.366569507765801, 0.55867151877155), (0.191675437237121, 0.769233862030055), (0.0606792682628189, 0.926945671319741), (0.937908206225755, 0.0293164271597849), (0.823156067318956, 0.148078599668484), (0.640628436740815, 0.336984690281154), (0.426426917861779, 0.55867151877155), (0.222974263268659, 0.769233862030055), (0.0705876315275886, 0.926945671319741) + + // Value of basis functions at quadrature points. + static const double FE0[36][6] = \ + {{0.821435400385472, -0.0306269173010353, -0.027597521356955, 0.00384342659195211, 0.109984470441527, 0.122961141239038}, + {0.532015755009065, -0.0271104442459123, -0.104224056308926, 0.0170381209259895, 0.487567191028831, 0.0947134335909534}, + {0.180181151181146, -0.0213845288145617, -0.109867327313383, 0.0301761338274607, 0.863527901361614, 0.0573666697577237}, + {-0.0627470853075863, -0.0144574501851293, 0.065556213001471, 0.0333003161525146, 0.952930295387644, 0.0254177109510863}, + {-0.123539219108256, -0.00767044807856531, 0.414207606957291, 0.0239750954756993, 0.686077414669827, 0.00694955008400427}, + {-0.0606224040782394, -0.00245452796298415, 0.79151088383707, 0.00914597699249758, 0.261723597972845, 0.000696473238811474}, + {0.493837762058507, -0.110355290611927, -0.027597521356955, 0.0192819115366137, 0.0945459854968658, 0.530287152876896}, + {0.293813665649314, -0.102659876418736, -0.104224056308926, 0.0854777716147777, 0.419127540340042, 0.408464955123528}, + {0.0558453437100204, -0.0870838540520213, -0.109867327313383, 0.151389269199641, 0.742314765989434, 0.247401802466309}, + {-0.0978230997184777, -0.0635811652362709, 0.065556213001471, 0.167062836984721, 0.819167774555438, 0.109617440413119}, + {-0.118196490757038, -0.0360345349652577, 0.414207606957291, 0.120279562776686, 0.58977294736884, 0.0299709086194782}, + {-0.0533153210689966, -0.0120687761767694, 0.79151088383707, 0.0458840347450652, 0.224985540220277, 0.00300363844335386}, + {0.121617769664549, -0.0964251943590678, -0.027597521356955, 0.0433331884448943, 0.0704947085885853, 0.888577049017995}, + {0.0291269575319056, -0.1139535792061, -0.104224056308926, 0.192098401561452, 0.312506910393368, 0.6844453660283}, + {-0.0734077368932362, -0.124988445721003, -0.109867327313383, 0.340224552856494, 0.55347948233258, 0.414559474738547}, + {-0.12391245201248, -0.111555122090524, 0.065556213001471, 0.375448532862056, 0.610782078678102, 0.183680749561375}, + {-0.102065898102695, -0.0724150500970177, 0.414207606957291, 0.270310179049135, 0.439742331096391, 0.0502208310968951}, + {-0.0411493438454339, -0.0262641695385059, 0.79151088383707, 0.103117448726206, 0.167752126239137, 0.0050330545815277}, + {-0.0964251943590677, 0.121617769664549, -0.027597521356955, 0.0704947085885853, 0.0433331884448943, 0.888577049017995}, + {-0.1139535792061, 0.0291269575319055, -0.104224056308926, 0.312506910393368, 0.192098401561452, 0.6844453660283}, + {-0.124988445721003, -0.0734077368932363, -0.109867327313383, 0.55347948233258, 0.340224552856494, 0.414559474738547}, + {-0.111555122090523, -0.12391245201248, 0.065556213001471, 0.610782078678102, 0.375448532862056, 0.183680749561375}, + {-0.0724150500970177, -0.102065898102695, 0.414207606957291, 0.439742331096391, 0.270310179049135, 0.0502208310968951}, + {-0.0262641695385059, -0.0411493438454339, 0.79151088383707, 0.167752126239137, 0.103117448726206, 0.0050330545815277}, + {-0.110355290611927, 0.493837762058507, -0.027597521356955, 0.094545985496866, 0.0192819115366136, 0.530287152876895}, + {-0.102659876418736, 0.293813665649314, -0.104224056308926, 0.419127540340043, 0.0854777716147776, 0.408464955123527}, + {-0.0870838540520211, 0.0558453437100205, -0.109867327313383, 0.742314765989434, 0.151389269199641, 0.247401802466309}, + {-0.0635811652362707, -0.0978230997184777, 0.065556213001471, 0.819167774555438, 0.16706283698472, 0.109617440413119}, + {-0.0360345349652576, -0.118196490757038, 0.414207606957291, 0.58977294736884, 0.120279562776686, 0.0299709086194783}, + {-0.0120687761767694, -0.0533153210689965, 0.79151088383707, 0.224985540220277, 0.0458840347450652, 0.00300363844335386}, + {-0.0306269173010353, 0.821435400385472, -0.027597521356955, 0.109984470441527, 0.00384342659195214, 0.122961141239039}, + {-0.0271104442459122, 0.532015755009064, -0.104224056308926, 0.487567191028831, 0.0170381209259895, 0.0947134335909537}, + {-0.0213845288145615, 0.180181151181146, -0.109867327313383, 0.863527901361614, 0.0301761338274607, 0.0573666697577238}, + {-0.0144574501851291, -0.0627470853075864, 0.065556213001471, 0.952930295387644, 0.0333003161525146, 0.0254177109510863}, + {-0.00767044807856519, -0.123539219108256, 0.414207606957291, 0.686077414669827, 0.0239750954756993, 0.0069495500840043}, + {-0.00245452796298426, -0.0606224040782393, 0.79151088383707, 0.261723597972845, 0.00914597699249797, 0.000696473238811501}}; + + static const double FE1_D01[36][14] = \ + {{-5.73393366515335, -0.610204441153459, 0.141928978825531, 0.0871974901142565, 0.116912746949144, 10.3572990458443, -7.22883894882422, 3.21567800928674, -1.8978641247318, 0.740812170491713, -0.141928978825534, 2.50679270630304, -0.828009660605958, -0.725841328520393}, + {-2.3465472847308, 0.257847367730429, 0.127952428898689, -0.0187993143758374, -0.0384594306090261, 0.673449897934053, 2.7424316269885, -1.32718160792217, -1.1328461724892, 0.568702416154349, -0.12795242889869, 0.975841411804115, -0.549903101778511, 0.195464191294111}, + {0.0857551569189836, 0.124373662863317, 0.103837855431975, -0.138262755216491, -0.0380168417811947, -4.181699401175, 4.85559229474557, -0.884021713352873, -0.3775529787326, 0.336308288288182, -0.103837855431973, -0.278729372677891, -0.198045533071696, 0.69429919319169}, + {0.165619957523659, -0.347867181232095, 0.072510377306201, -0.194469924524912, 0.141995968597956, -0.972226692622573, -2.47723158135629, 3.6317054976873, -0.0196331058840119, 0.135167903422399, -0.0725103773061992, -0.49890735747676, 0.0593020211025079, 0.376544494762819}, + {-0.356839190005388, 1.30015742315852, 0.0396340234519559, -0.155626727905485, 0.248113706592311, 2.05060106207073, -5.50583094064749, 2.51191164542364, 0.0200498703495983, 0.0236675140971451, -0.0396340234519549, -0.156342442976848, 0.131959213808331, -0.111821133965056}, + {0.188873864576375, 5.33445097887039, 0.0129616514903126, -0.0626764494737966, 0.13811044732955, -1.11528498337719, 3.07036702801507, -7.47840688808465, -0.00358534300978886, -0.00425262481646471, -0.0129616514903167, 0.0278512840626912, 0.0669290742902549, -0.162376388382445}, + {-1.98455741884737, -0.610204441153459, 0.201454632782633, 0.172326389118049, 0.586534226748658, 4.77733570020713, -4.92863036969353, 2.74605652948723, -6.07384355108711, 1.22694100449815, -0.201454632782632, 8.59848813099332, -1.39926739361619, -3.11117880665488}, + {-0.46128087585689, 0.257847367730429, 0.231466020022404, -0.0450555310360263, -0.192945362948927, -0.705923250082118, 2.08205243379085, -1.17269567558227, -3.48330523021268, 1.13740865612763, -0.231466020022403, 2.79415099200966, -1.0923531250916, 0.882099601151943}, + {0.354242766679419, 0.124373662863317, 0.255795827380387, -0.419600978627936, -0.190724959248966, -2.64342085705695, 2.89611802339931, -0.731313595885104, -1.00040904235439, 0.842634714097944, -0.255795827380386, -1.74397768634604, -0.423033735470007, 2.93511168794939}, + {-0.0280760756796571, -0.347867181232095, 0.237696611508161, -0.727226989542658, 0.71237309717181, 0.274813200998253, -2.96019831319994, 3.06132836911344, 0.0693273638826881, 0.405089701060974, -0.23769661150816, -2.17396875267872, 0.322137288481683, 1.39226829162422}, + {-0.348206026767365, 1.30015742315852, 0.162133728404075, -0.679865028853815, 1.24475033595064, 1.86341380962785, -4.33064022208429, 1.5152750160653, 0.0872208162208899, 0.0703631099399486, -0.162133728404075, -0.569197600591614, 0.609501918913861, -0.762773551579918}, + {0.277239567682454, 5.33445097887039, 0.0611806338099212, -0.301852143746804, 0.692880002773231, -1.5654720851747, 3.98695798215019, -8.03317644352833, -0.0237743817844828, -0.0242103068282418, -0.061180633809925, 0.170686027255808, 0.32606245057504, -0.83979164824455}, + {0.260331457253085, -0.610204441153459, -0.245881518705732, -0.540970535012731, 1.3181472246057, 0.526532720835469, -2.19110326856528, 2.01444353163019, -4.84707619781392, -2.69205137636386, 0.24588151870573, 8.66433795686056, 3.23302191137659, -5.13540898365234}, + {0.357049216215873, 0.25784736773043, -0.180668518579631, 0.0712010958780448, -0.433615606852988, -0.893293943220921, 1.21042279095283, -0.932025431678212, -2.33426757548639, -1.24209362927345, 0.180668518579631, 1.13041056526349, 1.17089253339541, 1.63747261707589}, + {0.116778864743154, 0.124373662863317, -0.0064089224121317, 0.0164613854329423, -0.428625584376669, -0.465588620781011, 0.717849063931939, -0.493412970757402, -0.160336381233156, -0.0221787948795405, 0.00640892241213224, -4.08835631774606, 0.00571740944659999, 4.67731828335589}, + {-0.294082023750131, -0.347867181232095, 0.195124439566851, -0.764659683907875, 1.6009511092405, 1.38926258806558, -2.9200637401281, 2.17275035704474, 0.436331405801299, 0.261519435271525, -0.195124439566851, -3.4268489279594, 0.503140248636351, 1.3895664129176}, + {-0.240247444556132, 1.30015742315852, 0.250497438423931, -1.17466294066941, 2.79738867031788, 1.15538829691154, -2.17793495721199, -0.0373633183019418, 0.105322517622769, 0.0326665363466911, -0.250497438423931, -0.482030283304022, 1.14199640432272, -2.42068090463662}, + {0.430734658045451, 5.33445097887039, 0.124492958056515, -0.6343007112734, 1.55714331915996, -2.32279879066969, 5.45505291366891, -8.89743975991506, -0.0750836733184909, -0.0630837814106389, -0.124492958056518, 0.493378366395208, 0.697384492684034, -1.97543801223668}, + {-0.0182266019966474, -0.61020444115346, 0.911072502106181, -2.58541357939386, 2.14437035007471, -0.221317896936322, -0.338471466074751, 1.18822040616118, 0.503694081334668, -6.60730957545079, -0.911072502106187, 2.29553331035237, 9.19272315484466, -4.94359774176174}, + {-0.163384521187537, 0.257847367730429, 0.172495649715716, 0.432664301292135, -0.7054086473105, 0.109520481762384, 0.456249062915421, -0.660232391220699, 1.03394153695203, -3.73670483601311, -0.172495649715716, -2.35871602934074, 3.30404053472098, 2.03018313969921}, + {-0.330036734124585, 0.124373662863317, -0.251523082078815, 1.78946464443993, -0.697290846776022, 0.891967726969347, -0.461556947350034, -0.224747708358047, 1.09466100773171, -1.07547474464335, 0.251523082078817, -4.48109119658656, -0.713989899796578, 4.08372103563087}, + {-0.31157810845263, -0.347867181232095, -0.0616428751593916, 0.353793500422396, 2.60443752146235, 1.20419385316233, -1.7140125083005, 1.1692639448229, 0.493667200763234, -0.0350875897141537, 0.0616428751593921, -2.16316671898532, -0.318705910708242, -0.934938003240264}, + {0.0530482208319296, 1.30015742315852, 0.23316601574264, -1.26199977704563, 4.5508098111415, -0.287020205135046, 0.724599020270164, -1.79078445912556, -0.099865209973724, -0.0727728241261709, -0.233166015742641, 0.784933444574786, 1.3347726011718, -5.23587804574256}, + {0.628312242814955, 5.33445097887039, 0.179746262437877, -0.950926419514064, 2.53317072789222, -3.26110796005244, 7.17181190701442, -9.87346716864732, -0.165247631924602, -0.115244103192671, -0.179746262437882, 1.00764820137391, 1.06617052270673, -3.37557129734152}, + {-0.303535946471151, -0.610204441153461, 5.86025374032158, -5.49278777554576, 2.87598334793176, 0.252154616288088, 0.204978363032382, 0.456607408304142, 1.39434048605402, -2.26346539748025, -5.86025374032158, -1.69065045926879, 7.75625317302601, -2.57967337471699}, + {-0.245160347306182, 0.257847367730429, 2.86831031654327, 0.956552379061568, -0.946078891214562, 0.414624255959625, -0.00774912906723612, -0.419562147316637, 0.875241822631545, -0.800414628746431, -2.86831031654327, -1.89945618532941, -0.156137750315139, 1.97029325391243}, + {-0.10221556883783, 0.124373662863318, 0.358248479083555, 4.49335852112476, -0.935191471903725, 0.336683383398316, -0.371994394193459, 0.0131529167696536, 0.13218722345201, 0.268949435511961, -0.358248479083555, -0.48726035733776, -4.76230795663672, 1.29026460578948}, + {0.153975435318139, -0.347867181232094, -0.243268065755901, 2.37198626292571, 3.49301553353105, -0.468541708480116, 0.38174752163987, 0.280685932754199, -0.463394722345444, 0.274795599027243, 0.243268065755899, 2.01926998449834, -2.64678186195295, -5.04889079568395}, + {0.497469057563429, 1.30015742315852, 0.147066851061563, -0.921873800001357, 6.10344814550873, -2.16643186123148, 3.71222817400234, -3.3434227934928, -0.580225142911448, -0.122932892601025, -0.147066851061565, 3.04041017392172, 1.04480669260238, -8.563633176519}, + {0.825769076219335, 5.33445097887039, 0.21533217274848, -1.17921617185251, 3.39743404427895, -4.16655522377696, 8.74406565372129, -10.7377304850341, -0.276753995605383, -0.165608662605669, -0.215332172748484, 1.59885524303639, 1.34482483445817, -4.71953529170996}, + {0.569355193946907, -0.610204441153462, 12.0548725932694, -7.90202099521495, 3.34560482773128, 0.043038495211825, 0.0108248234900943, -0.0130140714953648, -3.16376192751621, 7.6163647286198, -12.0548725932694, -0.205556284709518, 0.285656266595135, 0.0237133844944664}, + {0.616810239783933, 0.25784736773043, 6.50513190171137, 1.39371669109438, -1.10056482355446, -0.404873598965748, -0.204707793571877, -0.265076214976739, -2.96193358556873, 5.81161177753182, -6.50513190171137, 2.33241080273892, -7.2053284686262, 1.73008760638427}, + {0.695236750080823, 0.124373662863319, 1.50152280354243, 6.79023077769843, -1.0878995893715, -1.23221326162697, 0.246741814445408, 0.165861034237419, -2.53991461099668, 3.28687327550086, -1.50152280354243, 5.25315805979123, -10.0771040531993, -1.62534385942305}, + {0.791961270057202, -0.347867181232093, -0.236165863800056, 4.17619076948898, 4.0633926621049, -2.39014525438269, 2.23574236137724, -0.289691195819656, -1.87971395621739, 1.06023120011597, 0.236165863800054, 6.52341143609708, -5.23642196960495, -8.70709014198458}, + {0.888613225651139, 1.30015742315852, 0.0712264194477886, -0.496919222966522, 7.10008477486707, -3.68532299650722, 5.8366117705487, -4.34005942285114, -1.07973607017363, -0.0904065650403247, -0.0712264194477912, 5.09262264540676, 0.58732578800685, -11.1129713501002}, + {0.964113195268917, 5.33445097887039, 0.232030060760922, -1.29997771260216, 3.95220359972263, -4.78513489504132, 9.77907076137975, -11.2925000404777, -0.36537877195992, -0.198630117288271, -0.232030060760927, 2.04695403085604, 1.49860782989044, -5.63377885861875}}; + + // Array of non-zero columns + static const unsigned int nzc0[14] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + static const double FE1_D10[36][14] = \ + {{-5.73393366515335, -0.569355193946911, 0.0988904836137107, 0.0763726666241492, 0.129926818444522, -1.69757354742516, 0.673182046390718, -0.129926818444522, 10.1570084685376, -6.87555255812809, 3.0218329486907, 2.2211364397079, -0.622453375896457, -0.749554713014867}, + {-2.34654728473081, -0.616810239783935, 0.532826027864436, 0.185908479196042, 0.22661678436771, -5.83168200377732, 1.34871493589412, -0.226616784367711, 5.37228572922218, -5.24290936137748, 2.83398115667004, 8.18116988043032, -2.88231390451744, -1.53462341509016}, + {0.0857551569189828, -0.695236750080824, 1.33605111705894, -0.385004569661891, -0.203877876018623, -5.68322220471743, -1.93463848295286, 0.203877876018622, 1.12396982480983, -2.95056498721269, 2.4360767555647, 9.79837468052141, -5.45120359286292, 2.31964305261475}, + {0.16561995752366, -0.791961270057203, 2.46265563168889, -2.43021228590214, 0.431687164417606, -0.736060828822519, -6.65342235084527, -0.431687164417606, -0.255798969684068, -0.925063296693571, 1.80720357891118, 4.73751461212819, -6.46410941499456, 9.08363463674741}, + {-0.356839190005388, -0.888613225651139, 3.72495701995917, -5.99223849845417, 4.58817312944344, 1.97937464262294, -5.00891171768096, -4.58817312944344, 0.0912762897973873, 0.114074079137467, 1.04010204672167, -0.743668230983695, -4.96066343159841, 11.0011502161351}, + {0.188873864576372, -0.964113195268915, 4.79809654653164, -9.84174721085355, 11.4306104878073, -1.34731504413811, 4.37034474061725, -11.4306104878073, 0.22844471775114, 0.194377492471799, 0.352417120469604, -1.47075654582776, -1.98002495656577, 5.47140247023629}, + {-1.98455741884737, 0.303535946471151, -0.0506999835054528, -0.0326519739143381, 0.129926818444521, -1.08291804011444, 0.564157405852225, -0.129926818444521, -0.213589810765533, 3.4904064019784, -1.59579511883665, 0.842234957967305, 0.291383065652584, -0.531505431937887}, + {-0.46128087585689, 0.245160347306182, -0.183158235937221, -0.037306401968791, 0.22661678436771, -3.57423356662539, 1.12550005472928, -0.226616784367711, -0.614994913669407, 1.93782328487407, -1.10670784265395, 2.9502887423248, 0.807103060237811, -1.08819365276049}, + {0.354242766679419, 0.10221556883783, -0.0808875560179283, -0.0476065844344769, -0.203877876018622, -3.0016693361405, -1.59724049772544, 0.203877876018621, -0.64216056327083, 0.573685278585982, -0.387983050832401, 3.01833027029068, 0.0642266218677529, 1.64484708215992}, + {-0.0280760756796567, -0.153975435318139, 0.706238319988273, -1.10897451118252, 0.431687164417606, 0.518081266754153, -5.33218457612564, -0.431687164417605, -0.173940701873212, 0.13029410203373, 0.225698110837278, 0.472813109274225, -1.69713269601665, 6.44115908730816}, + {-0.348206026767365, -0.497469057563429, 2.32856558963556, -4.39209320285615, 4.58817312944344, 1.71634695856628, -3.40876642208293, -4.58817312944344, 0.234287667282455, 0.193296002540972, 0.418091414507367, -1.614004293194, -2.43090825500784, 7.80085962493908}, + {0.277239567682451, -0.825769076219332, 4.22773585758689, -9.0459177974681, 11.4306104878073, -1.78080425792317, 5.1661741540027, -11.4306104878073, 0.191557790964002, 0.141398355777419, 0.215573361795459, -1.17413880720237, -1.27279279246134, 3.87974364346539}, + {0.260331457253085, 0.0182266019966481, -0.0245636217694066, -0.202499068937979, 0.129926818444519, -0.384539781270716, 0.394310310828582, -0.129926818444519, -3.93600369570773, 3.91525819908694, -0.257812562628937, -0.528385197984093, 0.937488601024216, -0.191811241890604}, + {0.357049216215873, 0.163384521187537, -0.290189000342014, -0.385047967037378, 0.226616784367711, -1.06578959293664, 0.777758489660695, -0.226616784367711, -2.16177192577067, 2.49461120673966, -0.853273018372399, -2.17362996945749, 3.52960856273615, -0.392710522623318}, + {0.116778864743154, 0.330036734124585, -0.898376649381478, 0.478018332782974, -0.203877876018621, -0.214065538702195, -1.07161558050799, 0.203877876018621, -0.41185946331197, 1.05329594976381, -1.08825208531958, -3.37436641794949, 4.48680860603316, 0.593597247725016}, + {-0.294082023750131, 0.31157810845263, -1.00906941359548, 0.949352824392628, 0.431687164417606, 1.45090546322497, -3.27385724055049, -0.431687164417605, 0.374688530641909, 0.296607024985678, -0.688791640330086, -3.10814301725116, 2.66630696762167, 2.32450441615786}, + {-0.240247444556132, -0.0530482208319297, 0.537517643558975, -1.89926196093957, 4.58817312944344, 0.922222281168904, -0.915935180166359, -4.58817312944344, 0.338488533365411, 0.10543936047286, -0.150632228450211, -1.81680288447582, 0.357062959747943, 2.81519714110593}, + {0.430734658045448, -0.628312242814952, 3.38560091810896, -7.80611261828782, 11.4306104878073, -2.50254505310756, 6.40597933318298, -11.4306104878073, 0.104662589119393, 0.0521603217820244, 0.0407546738680856, -0.572792156311537, -0.310263708689863, 1.40013328510483}, + {-0.0182266019966486, -0.260331457253085, 0.384539781270718, -0.394310310828577, 0.129926818444519, 0.0245636217694101, 0.202499068937982, -0.129926818444519, 0.25781256262894, -3.91525819908694, 3.93600369570773, -0.937488601024221, 0.528385197984093, 0.191811241890594}, + {-0.163384521187537, -0.357049216215873, 1.06578959293664, -0.777758489660695, 0.226616784367711, 0.290189000342013, 0.385047967037378, -0.226616784367711, 0.8532730183724, -2.49461120673966, 2.16177192577067, -3.52960856273614, 2.17362996945749, 0.392710522623316}, + {-0.330036734124585, -0.116778864743154, 0.214065538702195, 1.07161558050799, -0.203877876018621, 0.898376649381477, -0.478018332782976, 0.203877876018621, 1.08825208531958, -1.05329594976381, 0.411859463311971, -4.48680860603316, 3.37436641794949, -0.593597247725014}, + {-0.31157810845263, 0.29408202375013, -1.45090546322497, 3.27385724055049, 0.431687164417606, 1.00906941359548, -0.94935282439263, -0.431687164417606, 0.688791640330087, -0.296607024985679, -0.374688530641908, -2.66630696762167, 3.10814301725116, -2.32450441615786}, + {0.0530482208319292, 0.240247444556132, -0.922222281168903, 0.915935180166357, 4.58817312944344, -0.537517643558977, 1.89926196093958, -4.58817312944344, 0.15063222845021, -0.105439360472862, -0.33848853336541, -0.357062959747938, 1.81680288447582, -2.81519714110594}, + {0.628312242814952, -0.430734658045449, 2.50254505310757, -6.40597933318298, 11.4306104878073, -3.38560091810895, 7.80611261828783, -11.4306104878073, -0.0407546738680803, -0.0521603217820377, -0.104662589119387, 0.310263708689857, 0.572792156311527, -1.40013328510486}, + {-0.303535946471151, 1.98455741884737, 1.08291804011444, -0.564157405852216, 0.129926818444518, 0.0506999835054597, 0.0326519739143374, -0.129926818444518, 1.59579511883665, -3.4904064019784, 0.21358981076553, -0.291383065652588, -0.842234957967307, 0.531505431937878}, + {-0.245160347306182, 0.461280875856891, 3.57423356662539, -1.12550005472928, 0.226616784367711, 0.183158235937219, 0.037306401968792, -0.226616784367711, 1.10670784265395, -1.93782328487406, 0.614994913669405, -0.807103060237807, -2.9502887423248, 1.08819365276049}, + {-0.10221556883783, -0.354242766679418, 3.0016693361405, 1.59724049772544, -0.20387787601862, 0.080887556017926, 0.0476065844344774, 0.20387787601862, 0.3879830508324, -0.573685278585981, 0.642160563270829, -0.0642266218677527, -3.01833027029068, -1.64484708215992}, + {0.15397543531814, 0.0280760756796565, -0.518081266754151, 5.33218457612564, 0.431687164417607, -0.706238319988279, 1.10897451118253, -0.431687164417607, -0.22569811083728, -0.130294102033729, 0.173940701873212, 1.69713269601666, -0.472813109274228, -6.44115908730817}, + {0.497469057563429, 0.348206026767364, -1.71634695856628, 3.40876642208293, 4.58817312944344, -2.32856558963556, 4.39209320285615, -4.58817312944344, -0.418091414507368, -0.193296002540973, -0.234287667282453, 2.43090825500785, 1.61400429319399, -7.80085962493909}, + {0.825769076219331, -0.277239567682452, 1.78080425792319, -5.1661741540027, 11.4306104878073, -4.22773585758688, 9.04591779746811, -11.4306104878073, -0.215573361795454, -0.141398355777432, -0.191557790963995, 1.27279279246133, 1.17413880720236, -3.87974364346542}, + {0.569355193946908, 5.73393366515334, 1.69757354742515, -0.673182046390701, 0.129926818444518, -0.0988904836137059, -0.0763726666241563, -0.129926818444518, -3.02183294869069, 6.87555255812808, -10.1570084685376, 0.622453375896464, -2.22113643970791, 0.749554713014856}, + {0.616810239783934, 2.3465472847308, 5.83168200377732, -1.34871493589412, 0.226616784367712, -0.532826027864441, -0.185908479196039, -0.226616784367712, -2.83398115667004, 5.24290936137748, -5.37228572922217, 2.88231390451744, -8.18116988043032, 1.53462341509016}, + {0.695236750080823, -0.0857551569189826, 5.68322220471743, 1.93463848295285, -0.203877876018619, -1.33605111705895, 0.385004569661897, 0.203877876018619, -2.4360767555647, 2.95056498721269, -1.12396982480983, 5.45120359286291, -9.7983746805214, -2.31964305261475}, + {0.791961270057203, -0.16561995752366, 0.736060828822521, 6.65342235084526, 0.431687164417608, -2.46265563168889, 2.43021228590215, -0.431687164417608, -1.80720357891118, 0.925063296693573, 0.255798969684069, 6.46410941499456, -4.73751461212818, -9.08363463674741}, + {0.888613225651138, 0.356839190005387, -1.97937464262294, 5.00891171768096, 4.58817312944344, -3.72495701995917, 5.99223849845418, -4.58817312944344, -1.04010204672167, -0.114074079137468, -0.0912762897973851, 4.96066343159842, 0.743668230983691, -11.0011502161351}, + {0.964113195268914, -0.188873864576373, 1.34731504413813, -4.37034474061725, 11.4306104878073, -4.79809654653163, 9.84174721085356, -11.4306104878073, -0.352417120469599, -0.194377492471812, -0.228444717751132, 1.98002495656577, 1.47075654582774, -5.47140247023631}}; + + // Array of non-zero columns + static const unsigned int nzc1[14] = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 225; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 85860 + for (unsigned int ip = 0; ip < 36; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 24 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE0[ip][r]*w[0][r]; + F1 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W36[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W36[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W36[ip]; + + + // Number of operations for primary indices: 2352 + for (unsigned int j = 0; j < 14; j++) + { + for (unsigned int k = 0; k < 14; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p2_q4_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p2_q4_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q4_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q4_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q4_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q4_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q4_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q4_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q4_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q4_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q4_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p2_q4_tensor.h b/laplacian_2d/laplacian_f2_p2_q4_tensor.h new file mode 100644 index 0000000..8f9c258 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p2_q4_tensor.h @@ -0,0 +1,7498 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P2_Q4_TENSOR_H +#define __LAPLACIAN_F2_P2_Q4_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q4_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q4_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q4_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p2_q4_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p2_q4_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p2_q4_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q4_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q4_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q4_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p2_q4_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p2_q4_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p2_q4_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p2_q4_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p2_q4_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 432 + // Number of operations (multiply-add pairs) for tensor contraction: 19073 + // Total number of operations (multiply-add pairs): 19516 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[108] = -0.00010261343594676*G0_0_0_0_0 + 0.000564373897707256*G0_0_0_0_1 + 0.00466891133557817*G0_0_0_0_2 - 0.00318101651434999*G0_0_0_0_3 + 0.0120057720057724*G0_0_0_0_4 - 0.00379669713003059*G0_0_0_0_5 + 0.000564373897707255*G0_0_0_1_0 - 0.00297578964245641*G0_0_0_1_1 + 0.0030270963604298*G0_0_0_1_2 + 0.00379669713003072*G0_0_0_1_3 + 0.000513067179733826*G0_0_0_1_4 - 0.00153920153920161*G0_0_0_1_5 + 0.00466891133557817*G0_0_0_2_0 + 0.0030270963604298*G0_0_0_2_1 + 0.0615680615680633*G0_0_0_2_2 - 0.0190860990860999*G0_0_0_2_3 - 0.0301683501683513*G0_0_0_2_4 - 0.00307840307840319*G0_0_0_2_5 - 0.00318101651434999*G0_0_0_3_0 + 0.00379669713003073*G0_0_0_3_1 - 0.0190860990860999*G0_0_0_3_2 + 0.00738816738816809*G0_0_0_3_3 + 0.00533589866923231*G0_0_0_3_4 + 0.0125188391855064*G0_0_0_3_5 + 0.0120057720057724*G0_0_0_4_0 + 0.000513067179733825*G0_0_0_4_1 - 0.0301683501683513*G0_0_0_4_2 + 0.00533589866923232*G0_0_0_4_3 - 0.202764149430822*G0_0_0_4_4 + 0.0051306717973387*G0_0_0_4_5 - 0.00379669713003059*G0_0_0_5_0 - 0.00153920153920161*G0_0_0_5_1 - 0.00307840307840319*G0_0_0_5_2 + 0.0125188391855064*G0_0_0_5_3 + 0.0051306717973387*G0_0_0_5_4 + 0.0110822510822515*G0_0_0_5_5 + 0.00138528138528145*G0_0_1_0_0 - 0.000461760461760435*G0_0_1_0_1 + 0.000153920153920167*G0_0_1_0_2 + 0.000718294051627409*G0_0_1_0_3 + 0.00379669713003059*G0_0_1_0_4 + 0.000615680615680676*G0_0_1_0_5 - 0.000461760461760435*G0_0_1_1_0 - 0.00692640692640779*G0_0_1_1_1 + 0.000102613435946796*G0_0_1_1_2 - 0.00184704184704189*G0_0_1_1_3 + 0.00266794933461608*G0_0_1_1_4 + 0.000820907487573975*G0_0_1_1_5 + 0.000153920153920167*G0_0_1_2_0 + 0.000102613435946796*G0_0_1_2_1 + 0.00651595318261985*G0_0_1_2_2 + 0.00215488215488212*G0_0_1_2_3 - 0.00174442841109518*G0_0_1_2_4 - 0.000410453743787089*G0_0_1_2_5 + 0.000718294051627409*G0_0_1_3_0 - 0.00184704184704189*G0_0_1_3_1 + 0.00215488215488212*G0_0_1_3_2 - 0.00266794933461604*G0_0_1_3_3 - 0.00677248677248698*G0_0_1_3_4 - 0.000615680615680642*G0_0_1_3_5 + 0.00379669713003059*G0_0_1_4_0 + 0.00266794933461608*G0_0_1_4_1 - 0.00174442841109518*G0_0_1_4_2 - 0.00677248677248698*G0_0_1_4_3 - 0.0318101651434995*G0_0_1_4_4 - 0.00451499118165799*G0_0_1_4_5 + 0.000615680615680676*G0_0_1_5_0 + 0.000820907487573975*G0_0_1_5_1 - 0.000410453743787089*G0_0_1_5_2 - 0.000615680615680642*G0_0_1_5_3 - 0.00451499118165799*G0_0_1_5_4 + 0.00184704184704173*G0_0_1_5_5 + 0.00302709636042968*G0_1_0_0_0 + 0.000359147025813728*G0_1_0_0_1 + 0.0026679493346161*G0_1_0_0_2 - 0.00143658810325482*G0_1_0_0_3 + 0.0265768799102141*G0_1_0_0_4 - 0.000718294051627429*G0_1_0_0_5 + 0.000359147025813728*G0_1_0_1_0 - 0.00312970979637664*G0_1_0_1_1 + 0.00241141574474917*G0_1_0_1_2 - 0.000615680615680605*G0_1_0_1_3 - 0.000718294051627419*G0_1_0_1_4 + 0.0026679493346161*G0_1_0_2_0 + 0.00241141574474917*G0_1_0_2_1 + 0.0460221260221272*G0_1_0_2_2 - 0.0104665704665709*G0_1_0_2_3 - 0.0379669713003059*G0_1_0_2_4 + 0.000718294051627443*G0_1_0_2_5 - 0.00143658810325482*G0_1_0_3_0 - 0.000615680615680607*G0_1_0_3_1 - 0.0104665704665709*G0_1_0_3_2 - 0.00677248677248692*G0_1_0_3_3 + 0.00430976430976447*G0_1_0_3_4 + 0.00143658810325476*G0_1_0_3_5 + 0.0265768799102141*G0_1_0_4_0 - 0.000718294051627419*G0_1_0_4_1 - 0.0379669713003059*G0_1_0_4_2 + 0.00430976430976446*G0_1_0_4_3 - 0.0531537598204284*G0_1_0_4_4 - 0.000718294051627428*G0_1_0_5_0 + 0.000718294051627443*G0_1_0_5_2 + 0.00143658810325476*G0_1_0_5_3 - 0.00143658810325496*G0_1_0_5_5 - 0.00513067179733873*G0_1_1_0_0 - 0.000564373897707193*G0_1_1_0_1 + 0.00112874779541451*G0_1_1_0_3 + 0.00554112554112573*G0_1_1_0_4 - 0.00153920153920159*G0_1_1_0_5 - 0.000564373897707193*G0_1_1_1_0 + 0.000564373897707281*G0_1_1_1_2 - 0.00266794933461614*G0_1_1_1_3 + 0.00266794933461588*G0_1_1_1_5 + 0.000564373897707281*G0_1_1_2_1 + 0.00513067179733844*G0_1_1_2_2 + 0.00153920153920153*G0_1_1_2_3 - 0.00554112554112575*G0_1_1_2_4 - 0.00112874779541448*G0_1_1_2_5 + 0.00112874779541451*G0_1_1_3_0 - 0.00266794933461614*G0_1_1_3_1 + 0.00153920153920153*G0_1_1_3_2 - 0.00451499118165805*G0_1_1_3_3 - 0.00225749559082901*G0_1_1_3_4 + 0.00554112554112573*G0_1_1_4_0 - 0.00554112554112575*G0_1_1_4_2 - 0.00225749559082901*G0_1_1_4_3 + 0.00225749559082896*G0_1_1_4_5 - 0.00153920153920159*G0_1_1_5_0 + 0.00266794933461588*G0_1_1_5_1 - 0.00112874779541448*G0_1_1_5_2 + 0.00225749559082897*G0_1_1_5_4 + 0.00451499118165781*G0_1_1_5_5; + A[181] = -0.0222158088824763*G0_0_0_0_0 - 0.00123136123136129*G0_0_0_0_1 + 0.00474587141253823*G0_0_0_0_2 - 0.000666987333654026*G0_0_0_0_3 - 0.0225236491903166*G0_0_0_0_4 - 0.00354016354016366*G0_0_0_0_5 - 0.00123136123136129*G0_0_0_1_0 + 0.0336059002725684*G0_0_0_1_1 - 0.00546416546416566*G0_0_0_1_2 + 0.0231393298059973*G0_0_0_1_3 + 0.00682379349046038*G0_0_0_1_4 + 0.00661856661856692*G0_0_0_1_5 + 0.00474587141253823*G0_0_0_2_0 - 0.00546416546416566*G0_0_0_2_1 + 0.00430976430976446*G0_0_0_2_2 - 0.00194965528298869*G0_0_0_2_3 + 0.010363957030624*G0_0_0_2_4 - 0.00184704184704193*G0_0_0_2_5 - 0.000666987333654026*G0_0_0_3_0 + 0.0231393298059973*G0_0_0_3_1 - 0.00194965528298869*G0_0_0_3_2 + 0.00595157928491277*G0_0_0_3_3 - 0.0123136123136127*G0_0_0_3_4 + 0.00502805836139191*G0_0_0_3_5 - 0.0225236491903166*G0_0_0_4_0 + 0.00682379349046038*G0_0_0_4_1 + 0.010363957030624*G0_0_0_4_2 - 0.0123136123136127*G0_0_0_4_3 - 0.11349046015713*G0_0_0_4_4 - 0.00995350328683691*G0_0_0_4_5 - 0.00354016354016366*G0_0_0_5_0 + 0.00661856661856692*G0_0_0_5_1 - 0.00184704184704193*G0_0_0_5_2 + 0.00502805836139191*G0_0_0_5_3 - 0.00995350328683691*G0_0_0_5_4 + 0.0127240660573999*G0_0_0_5_5 + 0.00107744107744111*G0_1_0_0_0 - 0.000436107102773783*G0_1_0_0_1 - 0.000461760461760478*G0_1_0_0_2 + 0.00189834856501529*G0_1_0_0_3 + 0.00354016354016366*G0_1_0_0_4 + 0.0132884399551071*G0_1_0_0_5 - 0.000436107102773782*G0_1_0_1_0 - 0.00274490941157617*G0_1_0_1_2 + 0.0128266794933466*G0_1_0_1_3 + 0.00318101651434996*G0_1_0_1_4 - 0.0128266794933466*G0_1_0_1_5 - 0.000461760461760478*G0_1_0_2_0 - 0.00274490941157617*G0_1_0_2_1 + 0.00210357543690884*G0_1_0_2_2 + 5.13067179733831e-05*G0_1_0_2_3 + 0.00148789482122821*G0_1_0_2_4 - 0.00128266794933467*G0_1_0_2_5 + 0.00189834856501529*G0_1_0_3_0 + 0.0128266794933466*G0_1_0_3_1 + 5.13067179733836e-05*G0_1_0_3_2 + 0.00225749559082891*G0_1_0_3_3 - 0.0101587301587305*G0_1_0_3_4 - 0.00123136123136126*G0_1_0_3_5 + 0.00354016354016366*G0_1_0_4_0 + 0.00318101651434996*G0_1_0_4_1 + 0.00148789482122821*G0_1_0_4_2 - 0.0101587301587305*G0_1_0_4_3 - 0.0123136123136128*G0_1_0_4_4 - 0.00379669713003058*G0_1_0_4_5 + 0.0132884399551071*G0_1_0_5_0 - 0.0128266794933466*G0_1_0_5_1 - 0.00128266794933467*G0_1_0_5_2 - 0.00123136123136126*G0_1_0_5_3 - 0.00379669713003058*G0_1_0_5_4 + 0.000205226871893577*G0_1_0_5_5; + A[21] = 0.0144428411095083*G0_0_0_0_0 + 0.000286462508684734*G0_0_0_0_1 - 0.00237721126610023*G0_0_0_0_2 - 0.000153920153920164*G0_0_0_0_3 + 0.0156656512212073*G0_0_0_0_4 - 0.00063278285500511*G0_0_0_0_5 + 0.000286462508684734*G0_0_0_1_0 - 0.0062850729517398*G0_0_0_1_1 + 0.000906418684196497*G0_0_0_1_2 - 0.00321522099299891*G0_0_0_1_3 - 0.000359147025813697*G0_0_0_1_4 + 0.000906418684196527*G0_0_0_1_5 - 0.00237721126610023*G0_0_0_2_0 + 0.000906418684196497*G0_0_0_2_1 + 0.00346320346320353*G0_0_0_2_2 - 0.000564373897707239*G0_0_0_2_3 - 0.00651595318262006*G0_0_0_2_4 + 0.00141948586393036*G0_0_0_2_5 - 0.000153920153920164*G0_0_0_3_0 - 0.00321522099299891*G0_0_0_3_1 - 0.000564373897707239*G0_0_0_3_2 - 0.00246272246272253*G0_0_0_3_3 + 0.00102613435946771*G0_0_0_3_4 - 0.0025311314200204*G0_0_0_3_5 + 0.0156656512212073*G0_0_0_4_0 - 0.000359147025813697*G0_0_0_4_1 - 0.00651595318262006*G0_0_0_4_2 + 0.00102613435946771*G0_0_0_4_3 + 0.0385826519159864*G0_0_0_4_4 - 0.00212067767623333*G0_0_0_4_5 - 0.000632782855005109*G0_0_0_5_0 + 0.000906418684196527*G0_0_0_5_1 + 0.00141948586393036*G0_0_0_5_2 - 0.0025311314200204*G0_0_0_5_3 - 0.00212067767623333*G0_0_0_5_4 - 0.00889316444872029*G0_0_0_5_5 - 0.020573993907328*G0_0_1_0_0 - 0.000269360269360286*G0_0_1_0_1 + 0.000641333974667334*G0_0_1_0_2 - 0.000307840307840318*G0_0_1_0_3 + 0.00097482764149432*G0_0_1_0_4 + 0.000205226871893525*G0_0_1_0_5 - 0.000269360269360286*G0_0_1_1_0 + 0.000457484901929355*G0_0_1_1_2 - 0.00160761049649942*G0_0_1_1_3 - 0.000188124632569077*G0_0_1_1_4 + 0.00160761049649948*G0_0_1_1_5 + 0.000641333974667334*G0_0_1_2_0 + 0.000457484901929355*G0_0_1_2_1 + 0.00256533589866931*G0_0_1_2_2 - 0.000530169419058317*G0_0_1_2_3 - 0.00372828817273273*G0_0_1_2_4 + 0.000735396290951874*G0_0_1_2_5 - 0.000307840307840318*G0_0_1_3_0 - 0.00160761049649942*G0_0_1_3_1 - 0.000530169419058317*G0_0_1_3_2 - 0.00164181497514833*G0_0_1_3_3 + 0.000991929880818793*G0_0_1_3_4 - 0.000855111966223105*G0_0_1_3_5 + 0.00097482764149432*G0_0_1_4_0 - 0.000188124632569077*G0_0_1_4_1 - 0.00372828817273273*G0_0_1_4_2 + 0.000991929880818793*G0_0_1_4_3 + 0.0222329111218007*G0_0_1_4_4 - 0.0010945433167656*G0_0_1_4_5 + 0.000205226871893525*G0_0_1_5_0 + 0.00160761049649948*G0_0_1_5_1 + 0.000735396290951874*G0_0_1_5_2 - 0.000855111966223106*G0_0_1_5_3 - 0.0010945433167656*G0_0_1_5_4 + 0.00335203890759459*G0_0_1_5_5; + A[52] = A[108] + 0.00164181497514823*G0_0_1_0_0 + 0.000820907487574163*G0_0_1_0_1 + 0.00251402918069594*G0_0_1_0_2 - 0.00215488215488223*G0_0_1_0_3 + 0.0227801827801835*G0_0_1_0_4 - 0.00133397466730811*G0_0_1_0_5 + 0.000820907487574163*G0_0_1_1_0 + 0.00379669713003115*G0_0_1_1_1 + 0.00230880230880238*G0_0_1_1_2 + 0.00123136123136129*G0_0_1_1_3 - 0.0033862433862435*G0_0_1_1_4 - 0.00082090748757402*G0_0_1_1_5 + 0.00251402918069594*G0_0_1_2_0 + 0.00230880230880238*G0_0_1_2_1 + 0.0395061728395074*G0_0_1_2_2 - 0.012621452621453*G0_0_1_2_3 - 0.0362225428892107*G0_0_1_2_4 + 0.00112874779541453*G0_0_1_2_5 - 0.00215488215488223*G0_0_1_3_0 + 0.00123136123136129*G0_0_1_3_1 - 0.012621452621453*G0_0_1_3_2 - 0.00410453743787088*G0_0_1_3_3 + 0.0110822510822514*G0_0_1_3_4 + 0.0020522687189354*G0_0_1_3_5 + 0.0227801827801835*G0_0_1_4_0 - 0.0033862433862435*G0_0_1_4_1 - 0.0362225428892107*G0_0_1_4_2 + 0.0110822510822514*G0_0_1_4_3 - 0.0213435946769289*G0_0_1_4_4 + 0.00451499118165793*G0_0_1_4_5 - 0.0013339746673081*G0_0_1_5_0 - 0.00082090748757402*G0_0_1_5_1 + 0.00112874779541453*G0_0_1_5_2 + 0.0020522687189354*G0_0_1_5_3 + 0.00451499118165792*G0_0_1_5_4 - 0.00328362995029669*G0_0_1_5_5 - 0.00164181497514823*G0_1_0_0_0 - 0.000820907487574164*G0_1_0_0_1 - 0.00251402918069594*G0_1_0_0_2 + 0.00215488215488223*G0_1_0_0_3 - 0.0227801827801835*G0_1_0_0_4 + 0.0013339746673081*G0_1_0_0_5 - 0.000820907487574163*G0_1_0_1_0 - 0.00379669713003115*G0_1_0_1_1 - 0.00230880230880238*G0_1_0_1_2 - 0.00123136123136129*G0_1_0_1_3 + 0.0033862433862435*G0_1_0_1_4 + 0.00082090748757402*G0_1_0_1_5 - 0.00251402918069594*G0_1_0_2_0 - 0.00230880230880238*G0_1_0_2_1 - 0.0395061728395074*G0_1_0_2_2 + 0.012621452621453*G0_1_0_2_3 + 0.0362225428892107*G0_1_0_2_4 - 0.00112874779541453*G0_1_0_2_5 + 0.00215488215488223*G0_1_0_3_0 - 0.00123136123136129*G0_1_0_3_1 + 0.012621452621453*G0_1_0_3_2 + 0.00410453743787088*G0_1_0_3_3 - 0.0110822510822515*G0_1_0_3_4 - 0.0020522687189354*G0_1_0_3_5 - 0.0227801827801835*G0_1_0_4_0 + 0.0033862433862435*G0_1_0_4_1 + 0.0362225428892107*G0_1_0_4_2 - 0.0110822510822514*G0_1_0_4_3 + 0.0213435946769289*G0_1_0_4_4 - 0.00451499118165792*G0_1_0_4_5 + 0.0013339746673081*G0_1_0_5_0 + 0.00082090748757402*G0_1_0_5_1 - 0.00112874779541453*G0_1_0_5_2 - 0.0020522687189354*G0_1_0_5_3 - 0.00451499118165793*G0_1_0_5_4 + 0.00328362995029669*G0_1_0_5_5; + A[35] = 0.00233445566778908*G0_1_0_0_0 + 0.00167174389396617*G0_1_0_0_1 - 0.0225322003099788*G0_1_0_0_2 - 0.0064988509432956*G0_1_0_0_3 - 0.0115440115440119*G0_1_0_0_4 - 0.000820907487574186*G0_1_0_0_5 + 0.00167174389396617*G0_1_0_1_0 + 0.00233445566778909*G0_1_0_1_1 - 0.0225322003099788*G0_1_0_1_2 - 0.0115440115440119*G0_1_0_1_3 - 0.0064988509432956*G0_1_0_1_4 - 0.000820907487574178*G0_1_0_1_5 - 0.0225322003099788*G0_1_0_2_0 - 0.0225322003099788*G0_1_0_2_1 + 0.378771845438525*G0_1_0_2_2 + 0.0951739618406317*G0_1_0_2_3 + 0.0951739618406317*G0_1_0_2_4 + 0.00504516060071639*G0_1_0_2_5 - 0.0064988509432956*G0_1_0_3_0 - 0.0115440115440119*G0_1_0_3_1 + 0.0951739618406317*G0_1_0_3_2 + 0.0519908075463649*G0_1_0_3_3 + 0.0259954037731824*G0_1_0_3_4 + 0.00290738068515858*G0_1_0_3_5 - 0.0115440115440119*G0_1_0_4_0 - 0.0064988509432956*G0_1_0_4_1 + 0.0951739618406317*G0_1_0_4_2 + 0.0259954037731824*G0_1_0_4_3 + 0.0519908075463648*G0_1_0_4_4 + 0.00290738068515858*G0_1_0_4_5 - 0.000820907487574186*G0_1_0_5_0 - 0.000820907487574178*G0_1_0_5_1 + 0.00504516060071639*G0_1_0_5_2 + 0.00290738068515858*G0_1_0_5_3 + 0.00290738068515858*G0_1_0_5_4 - 0.000752498530276287*G0_1_0_5_5 - 0.00202661535994876*G0_1_1_0_0 + 0.00304419859975427*G0_1_1_0_1 - 0.00664849553738464*G0_1_1_0_2 - 0.000359147025813703*G0_1_1_0_3 - 0.00203516647961099*G0_1_1_0_4 + 0.00167601945379729*G0_1_1_0_5 + 0.00304419859975427*G0_1_1_1_0 - 0.0145454545454552*G0_1_1_1_1 - 0.0106033883811665*G0_1_1_1_2 - 0.0111335578002249*G0_1_1_1_3 - 0.00203516647961099*G0_1_1_1_4 - 0.00846560846560883*G0_1_1_1_5 - 0.00664849553738464*G0_1_1_2_0 - 0.0106033883811665*G0_1_1_2_1 + 0.0950456950456982*G0_1_1_2_2 + 0.0531879642990772*G0_1_1_2_3 + 0.0265939821495386*G0_1_1_2_4 + 0.00538720538720559*G0_1_1_2_5 - 0.000359147025813703*G0_1_1_3_0 - 0.0111335578002249*G0_1_1_3_1 + 0.0531879642990772*G0_1_1_3_2 + 0.0143658810325482*G0_1_1_3_3 + 0.00478862701084941*G0_1_1_3_4 - 0.0100561167227837*G0_1_1_3_5 - 0.00203516647961099*G0_1_1_4_0 - 0.00203516647961099*G0_1_1_4_1 + 0.0265939821495386*G0_1_1_4_2 + 0.00478862701084941*G0_1_1_4_3 + 0.0047886270108494*G0_1_1_4_4 - 0.00670407781518913*G0_1_1_4_5 + 0.00167601945379729*G0_1_1_5_0 - 0.00846560846560883*G0_1_1_5_1 + 0.00538720538720559*G0_1_1_5_2 - 0.0100561167227837*G0_1_1_5_3 - 0.00670407781518913*G0_1_1_5_4 - 0.0439185505852188*G0_1_1_5_5; + A[26] = -0.0168799102132442*G0_0_0_0_0 + 0.0119288119288123*G0_0_0_0_1 + 0.00137245470578808*G0_0_0_0_2 + 0.00446368446368462*G0_0_0_0_3 - 0.00764470097803457*G0_0_0_0_4 + 0.000410453743787106*G0_0_0_0_5 + 0.0119288119288123*G0_0_0_1_0 - 0.283726150392827*G0_0_0_1_1 + 0.0158837047725942*G0_0_0_1_2 - 0.0685799796910932*G0_0_0_1_3 + 0.000342044786489266*G0_0_0_1_4 - 0.0419859975415548*G0_0_0_1_5 + 0.00137245470578808*G0_0_0_2_0 + 0.0158837047725942*G0_0_0_2_1 - 0.00436107102773784*G0_0_0_2_2 + 0.00950884506440094*G0_0_0_2_3 + 0.00249692694137147*G0_0_0_2_4 + 0.00613970391748192*G0_0_0_2_5 + 0.00446368446368462*G0_0_0_3_0 - 0.0685799796910932*G0_0_0_3_1 + 0.00950884506440094*G0_0_0_3_2 - 0.0472021805355155*G0_0_0_3_3 - 0.0096114585003477*G0_0_0_3_4 - 0.0212067767623331*G0_0_0_3_5 - 0.00764470097803457*G0_0_0_4_0 + 0.000342044786489265*G0_0_0_4_1 + 0.00249692694137147*G0_0_0_4_2 - 0.0096114585003477*G0_0_0_4_3 - 0.0431660520549423*G0_0_0_4_4 - 0.0129634974079423*G0_0_0_4_5 + 0.000410453743787105*G0_0_0_5_0 - 0.0419859975415548*G0_0_0_5_1 + 0.00613970391748192*G0_0_0_5_2 - 0.0212067767623331*G0_0_0_5_3 - 0.0129634974079423*G0_0_0_5_4 - 0.0376249265138168*G0_0_0_5_5 - 0.00233445566778906*G0_0_1_0_0 + 0.0225322003099789*G0_0_1_0_1 - 0.00167174389396618*G0_0_1_0_2 + 0.00649885094329561*G0_0_1_0_3 + 0.000820907487574184*G0_0_1_0_4 + 0.011544011544012*G0_0_1_0_5 + 0.0225322003099789*G0_0_1_1_0 - 0.378771845438526*G0_0_1_1_1 + 0.0225322003099789*G0_0_1_1_2 - 0.0951739618406319*G0_0_1_1_3 - 0.0050451606007163*G0_0_1_1_4 - 0.0951739618406323*G0_0_1_1_5 - 0.00167174389396618*G0_0_1_2_0 + 0.0225322003099789*G0_0_1_2_1 - 0.00233445566778909*G0_0_1_2_2 + 0.0115440115440119*G0_0_1_2_3 + 0.000820907487574178*G0_0_1_2_4 + 0.00649885094329564*G0_0_1_2_5 + 0.00649885094329561*G0_0_1_3_0 - 0.0951739618406319*G0_0_1_3_1 + 0.0115440115440119*G0_0_1_3_2 - 0.0519908075463649*G0_0_1_3_3 - 0.00290738068515856*G0_0_1_3_4 - 0.0259954037731825*G0_0_1_3_5 + 0.000820907487574184*G0_0_1_4_0 - 0.0050451606007163*G0_0_1_4_1 + 0.000820907487574178*G0_0_1_4_2 - 0.00290738068515856*G0_0_1_4_3 + 0.000752498530276327*G0_0_1_4_4 - 0.00290738068515855*G0_0_1_4_5 + 0.011544011544012*G0_0_1_5_0 - 0.0951739618406322*G0_0_1_5_1 + 0.00649885094329564*G0_0_1_5_2 - 0.0259954037731825*G0_0_1_5_3 - 0.00290738068515855*G0_0_1_5_4 - 0.0519908075463651*G0_0_1_5_5; + A[135] = A[26] - 0.266846240179583*G0_0_0_0_0 + 0.0145112500668061*G0_0_0_0_2 - 0.00412163967719534*G0_0_0_0_3 - 0.0609352787130586*G0_0_0_0_4 - 0.0423964512853418*G0_0_0_0_5 + 0.266846240179583*G0_0_0_1_1 - 0.0145112500668061*G0_0_0_1_2 + 0.0609352787130586*G0_0_0_1_3 + 0.00412163967719535*G0_0_0_1_4 + 0.0423964512853419*G0_0_0_1_5 + 0.0145112500668061*G0_0_0_2_0 - 0.0145112500668061*G0_0_0_2_1 - 0.00701191812302947*G0_0_0_2_3 + 0.00701191812302947*G0_0_0_2_4 - 0.00412163967719534*G0_0_0_3_0 + 0.0609352787130586*G0_0_0_3_1 - 0.00701191812302947*G0_0_0_3_2 + 0.00403612848057309*G0_0_0_3_3 + 0.00824327935439081*G0_0_0_3_5 - 0.0609352787130586*G0_0_0_4_0 + 0.00412163967719535*G0_0_0_4_1 + 0.00701191812302947*G0_0_0_4_2 - 0.00403612848057317*G0_0_0_4_4 - 0.00824327935439078*G0_0_0_4_5 - 0.0423964512853417*G0_0_0_5_0 + 0.0423964512853419*G0_0_0_5_1 + 0.00824327935439081*G0_0_0_5_3 - 0.00824327935439078*G0_0_0_5_4 - 0.281391694725038*G0_0_1_0_0 - 0.0106033883811665*G0_0_1_0_1 + 0.0175554486665604*G0_0_1_0_2 - 0.00615680615680634*G0_0_1_0_3 - 0.0694008871786673*G0_0_1_0_4 - 0.0535300090855666*G0_0_1_0_5 - 0.0106033883811665*G0_0_1_1_0 + 0.361891935225282*G0_0_1_1_1 - 0.0211597456041908*G0_0_1_1_2 + 0.0875292608625973*G0_0_1_1_3 + 0.00950884506440092*G0_0_1_1_4 + 0.0955844155844194*G0_0_1_1_5 + 0.0175554486665604*G0_0_1_2_0 - 0.0211597456041908*G0_0_1_2_1 - 0.00202661535994874*G0_0_1_2_2 - 0.00904708460264048*G0_0_1_2_3 + 0.00868793757682676*G0_0_1_2_4 - 0.000359147025813723*G0_0_1_2_5 - 0.00615680615680634*G0_0_1_3_0 + 0.0875292608625973*G0_0_1_3_1 - 0.00904708460264048*G0_0_1_3_2 + 0.00882475549142253*G0_0_1_3_3 - 0.00670407781518916*G0_0_1_3_4 + 0.0130319063652403*G0_0_1_3_5 - 0.0694008871786673*G0_0_1_4_0 + 0.00950884506440092*G0_0_1_4_1 + 0.00868793757682676*G0_0_1_4_2 - 0.00670407781518916*G0_0_1_4_3 - 0.0479546790657918*G0_0_1_4_4 - 0.0182993960771745*G0_0_1_4_5 - 0.0535300090855666*G0_0_1_5_0 + 0.0955844155844193*G0_0_1_5_1 - 0.000359147025813723*G0_0_1_5_2 + 0.0130319063652403*G0_0_1_5_3 - 0.0182993960771745*G0_0_1_5_4 + 0.0143658810325483*G0_0_1_5_5 + 0.0950456950456983*G0_1_0_0_0 - 0.0106033883811665*G0_1_0_0_1 - 0.00664849553738465*G0_1_0_0_2 + 0.00538720538720555*G0_1_0_0_3 + 0.0265939821495386*G0_1_0_0_4 + 0.0531879642990773*G0_1_0_0_5 - 0.0106033883811665*G0_1_0_1_0 - 0.014545454545455*G0_1_0_1_1 + 0.00304419859975426*G0_1_0_1_2 - 0.00846560846560873*G0_1_0_1_3 - 0.00203516647961099*G0_1_0_1_4 - 0.0111335578002249*G0_1_0_1_5 - 0.00664849553738465*G0_1_0_2_0 + 0.00304419859975426*G0_1_0_2_1 - 0.00202661535994876*G0_1_0_2_2 + 0.00167601945379728*G0_1_0_2_3 - 0.00203516647961099*G0_1_0_2_4 - 0.000359147025813703*G0_1_0_2_5 + 0.00538720538720555*G0_1_0_3_0 - 0.00846560846560873*G0_1_0_3_1 + 0.00167601945379728*G0_1_0_3_2 - 0.0439185505852188*G0_1_0_3_3 - 0.00670407781518916*G0_1_0_3_4 - 0.0100561167227838*G0_1_0_3_5 + 0.0265939821495386*G0_1_0_4_0 - 0.00203516647961099*G0_1_0_4_1 - 0.00203516647961099*G0_1_0_4_2 - 0.00670407781518916*G0_1_0_4_3 + 0.00478862701084936*G0_1_0_4_4 + 0.00478862701084938*G0_1_0_4_5 + 0.0531879642990773*G0_1_0_5_0 - 0.0111335578002249*G0_1_0_5_1 - 0.000359147025813703*G0_1_0_5_2 - 0.0100561167227838*G0_1_0_5_3 + 0.00478862701084938*G0_1_0_5_4 + 0.0143658810325482*G0_1_0_5_5 + 0.0950456950456983*G0_1_1_0_0 - 0.0106033883811665*G0_1_1_0_1 - 0.00664849553738465*G0_1_1_0_2 + 0.00538720538720555*G0_1_1_0_3 + 0.0265939821495386*G0_1_1_0_4 + 0.0531879642990773*G0_1_1_0_5 - 0.0106033883811665*G0_1_1_1_0 - 0.0145454545454549*G0_1_1_1_1 + 0.00304419859975425*G0_1_1_1_2 - 0.0084656084656087*G0_1_1_1_3 - 0.00203516647961098*G0_1_1_1_4 - 0.0111335578002248*G0_1_1_1_5 - 0.00664849553738465*G0_1_1_2_0 + 0.00304419859975425*G0_1_1_2_1 - 0.00202661535994876*G0_1_1_2_2 + 0.00167601945379727*G0_1_1_2_3 - 0.00203516647961099*G0_1_1_2_4 - 0.00035914702581371*G0_1_1_2_5 + 0.00538720538720555*G0_1_1_3_0 - 0.0084656084656087*G0_1_1_3_1 + 0.00167601945379727*G0_1_1_3_2 - 0.0439185505852187*G0_1_1_3_3 - 0.00670407781518916*G0_1_1_3_4 - 0.0100561167227837*G0_1_1_3_5 + 0.0265939821495386*G0_1_1_4_0 - 0.00203516647961098*G0_1_1_4_1 - 0.00203516647961099*G0_1_1_4_2 - 0.00670407781518916*G0_1_1_4_3 + 0.00478862701084934*G0_1_1_4_4 + 0.00478862701084938*G0_1_1_4_5 + 0.0531879642990773*G0_1_1_5_0 - 0.0111335578002248*G0_1_1_5_1 - 0.00035914702581371*G0_1_1_5_2 - 0.0100561167227837*G0_1_1_5_3 + 0.00478862701084938*G0_1_1_5_4 + 0.0143658810325483*G0_1_1_5_5; + A[211] = -A[181] - 0.0200096200096206*G0_0_0_0_0 - 0.00395061728395076*G0_0_0_0_1 + 0.00995350328683694*G0_0_0_0_2 - 0.00123136123136128*G0_0_0_0_3 - 0.0136475869809208*G0_0_0_0_4 - 0.00554112554112574*G0_0_0_0_5 - 0.00395061728395076*G0_0_0_1_0 + 0.0672118005451365*G0_0_0_1_1 - 0.00625941959275316*G0_0_0_1_2 + 0.0425845759179107*G0_0_0_1_3 + 0.0104665704665708*G0_0_0_1_4 + 0.0169312169312176*G0_0_0_1_5 + 0.00995350328683694*G0_0_0_2_0 - 0.00625941959275316*G0_0_0_2_1 - 0.0189834856501529*G0_0_0_2_2 - 0.0187782587782594*G0_0_0_2_3 - 0.0156998556998562*G0_0_0_2_4 - 0.00441237774571125*G0_0_0_2_5 - 0.00123136123136128*G0_0_0_3_0 + 0.0425845759179107*G0_0_0_3_1 - 0.0187782587782594*G0_0_0_3_2 + 0.0184704184704192*G0_0_0_3_3 - 0.018470418470419*G0_0_0_3_4 + 0.0112874779541451*G0_0_0_3_5 - 0.0136475869809208*G0_0_0_4_0 + 0.0104665704665708*G0_0_0_4_1 - 0.0156998556998562*G0_0_0_4_2 - 0.018470418470419*G0_0_0_4_3 - 0.214667308000648*G0_0_0_4_4 - 0.0121083854417191*G0_0_0_4_5 - 0.00554112554112574*G0_0_0_5_0 + 0.0169312169312176*G0_0_0_5_1 - 0.00441237774571125*G0_0_0_5_2 + 0.0112874779541451*G0_0_0_5_3 - 0.0121083854417191*G0_0_0_5_4 + 0.0164181497514837*G0_0_0_5_5 - 0.00102613435946771*G0_1_0_0_0 + 0.00230880230880241*G0_1_0_0_1 + 0.00318101651434995*G0_1_0_0_3 + 0.00205226871893546*G0_1_0_0_4 + 0.0132371332371337*G0_1_0_0_5 + 0.00230880230880241*G0_1_0_1_0 - 0.00230880230880238*G0_1_0_1_2 + 0.0256533589866931*G0_1_0_1_3 - 0.0256533589866933*G0_1_0_1_5 - 0.00230880230880238*G0_1_0_2_1 + 0.00102613435946774*G0_1_0_2_2 - 0.0132371332371337*G0_1_0_2_3 - 0.00205226871893545*G0_1_0_2_4 - 0.00318101651434996*G0_1_0_2_5 + 0.00318101651434995*G0_1_0_3_0 + 0.0256533589866931*G0_1_0_3_1 - 0.0132371332371337*G0_1_0_3_2 + 0.00205226871893548*G0_1_0_3_3 - 0.0063620330286999*G0_1_0_3_4 + 0.00205226871893546*G0_1_0_4_0 - 0.00205226871893545*G0_1_0_4_2 - 0.0063620330286999*G0_1_0_4_3 + 0.00636203302869993*G0_1_0_4_5 + 0.0132371332371337*G0_1_0_5_0 - 0.0256533589866933*G0_1_0_5_1 - 0.00318101651434996*G0_1_0_5_2 + 0.00636203302869993*G0_1_0_5_4 - 0.00205226871893549*G0_1_0_5_5; + A[157] = A[211] - 0.0321436588103268*G0_0_0_0_0 + 0.00102613435946772*G0_0_0_0_1 - 0.0034760301426969*G0_0_0_0_2 + 0.00387365720699068*G0_0_0_0_3 - 0.01295494628828*G0_0_0_0_4 + 0.0170081770081776*G0_0_0_0_5 + 0.00102613435946772*G0_0_0_1_0 - 0.0384543851210534*G0_0_0_1_1 + 0.00306557639890985*G0_0_0_1_2 - 0.0215231681898355*G0_0_0_1_3 - 0.00387365720699064*G0_0_0_1_4 - 0.0219336219336227*G0_0_0_1_5 - 0.0034760301426969*G0_0_0_2_0 + 0.00306557639890985*G0_0_0_2_1 + 0.0192913259579929*G0_0_0_2_2 + 0.0131345198011868*G0_0_0_2_3 + 0.022985409652077*G0_0_0_2_4 - 0.000820907487574189*G0_0_0_2_5 + 0.00387365720699068*G0_0_0_3_0 - 0.0215231681898355*G0_0_0_3_1 + 0.0131345198011868*G0_0_0_3_2 + 0.00441237774571123*G0_0_0_3_3 - 0.00610549943883297*G0_0_0_3_5 - 0.01295494628828*G0_0_0_4_0 - 0.00387365720699064*G0_0_0_4_1 + 0.022985409652077*G0_0_0_4_2 + 0.153201859868531*G0_0_0_4_4 + 0.00938912938912969*G0_0_0_4_5 + 0.0170081770081776*G0_0_0_5_0 - 0.0219336219336227*G0_0_0_5_1 - 0.000820907487574189*G0_0_0_5_2 - 0.00610549943883297*G0_0_0_5_3 + 0.00938912938912969*G0_0_0_5_4 + 0.0295526695526708*G0_0_0_5_5 + 0.10647426647427*G0_0_1_0_0 + 0.0063876863876866*G0_0_1_0_1 + 0.0063876863876866*G0_0_1_0_2 - 0.00153920153920162*G0_0_1_0_3 - 0.0391726791726804*G0_0_1_0_4 - 0.0391726791726805*G0_0_1_0_5 + 0.0063876863876866*G0_0_1_1_0 - 0.00596440596440637*G0_0_1_1_1 + 0.00277056277056287*G0_0_1_1_2 - 0.00631072631072649*G0_0_1_1_3 - 0.0037710437710439*G0_0_1_1_4 + 0.00985088985089024*G0_0_1_1_5 + 0.0063876863876866*G0_0_1_2_0 + 0.00277056277056287*G0_0_1_2_1 - 0.0059644059644064*G0_0_1_2_2 - 0.00631072631072662*G0_0_1_2_3 + 0.0098508898508901*G0_0_1_2_4 - 0.00377104377104393*G0_0_1_2_5 - 0.00153920153920162*G0_0_1_3_0 - 0.00631072631072649*G0_0_1_3_1 - 0.00631072631072662*G0_0_1_3_2 + 0.0284752284752295*G0_0_1_3_3 + 0.010620490620491*G0_0_1_3_4 + 0.0106204906204911*G0_0_1_3_5 - 0.0391726791726804*G0_0_1_4_0 - 0.0037710437710439*G0_0_1_4_1 + 0.0098508898508901*G0_0_1_4_2 + 0.010620490620491*G0_0_1_4_3 - 0.106050986050989*G0_0_1_4_4 + 0.0150841750841757*G0_0_1_4_5 - 0.0391726791726805*G0_0_1_5_0 + 0.00985088985089025*G0_0_1_5_1 - 0.00377104377104393*G0_0_1_5_2 + 0.0106204906204911*G0_0_1_5_3 + 0.0150841750841757*G0_0_1_5_4 - 0.10605098605099*G0_0_1_5_5 + 0.00968414301747665*G0_1_0_0_0 - 0.00351451018117699*G0_1_0_0_1 - 0.00123136123136125*G0_1_0_0_2 + 0.00071829405162741*G0_1_0_0_3 + 0.0108000641333979*G0_1_0_0_4 + 0.00936347603014299*G0_1_0_0_5 - 0.00351451018117699*G0_1_0_1_0 - 0.00681096681096702*G0_1_0_1_1 + 0.000910694244027591*G0_1_0_1_2 - 0.0145198011864682*G0_1_0_1_3 + 0.00772166105499469*G0_1_0_1_4 + 0.0111335578002249*G0_1_0_1_5 - 0.00123136123136125*G0_1_0_2_0 + 0.000910694244027591*G0_1_0_2_1 - 0.00573352573352596*G0_1_0_2_2 + 0.0115953182619853*G0_1_0_2_3 + 0.00184704184704183*G0_1_0_2_4 + 0.00643899310565998*G0_1_0_2_5 + 0.00071829405162741*G0_1_0_3_0 - 0.0145198011864682*G0_1_0_3_1 + 0.0115953182619853*G0_1_0_3_2 + 0.0243706910373587*G0_1_0_3_3 - 0.0168799102132442*G0_1_0_3_4 - 0.0143145743145748*G0_1_0_3_5 + 0.0108000641333979*G0_1_0_4_0 + 0.00772166105499469*G0_1_0_4_1 + 0.00184704184704183*G0_1_0_4_2 - 0.0168799102132442*G0_1_0_4_3 - 0.0728042328042361*G0_1_0_4_4 - 0.0283213083213094*G0_1_0_4_5 + 0.00936347603014299*G0_1_0_5_0 + 0.0111335578002249*G0_1_0_5_1 + 0.00643899310565998*G0_1_0_5_2 - 0.0143145743145748*G0_1_0_5_3 - 0.0283213083213094*G0_1_0_5_4 - 0.0582331248997934*G0_1_0_5_5 - 0.0299374699374706*G0_1_1_0_0 + 0.00173160173160175*G0_1_1_0_1 - 0.00169312169312175*G0_1_1_0_2 + 0.00330928330928342*G0_1_1_0_3 + 0.0150072150072156*G0_1_1_0_4 - 0.00407888407888415*G0_1_1_0_5 + 0.00173160173160175*G0_1_1_1_0 - 0.00400192400192436*G0_1_1_1_1 + 0.00227032227032235*G0_1_1_1_2 - 0.0036940836940838*G0_1_1_1_3 - 0.0033862433862435*G0_1_1_1_4 - 0.00307840307840316*G0_1_1_1_5 - 0.00169312169312174*G0_1_1_2_0 + 0.00227032227032235*G0_1_1_2_1 - 0.00484848484848501*G0_1_1_2_2 - 0.00207792207792219*G0_1_1_2_3 - 0.0116209716209721*G0_1_1_2_4 - 0.000230880230880305*G0_1_1_2_5 + 0.00330928330928342*G0_1_1_3_0 - 0.0036940836940838*G0_1_1_3_1 - 0.00207792207792219*G0_1_1_3_2 + 0.0169312169312176*G0_1_1_3_3 + 0.000153920153920154*G0_1_1_3_4 - 0.00615680615680623*G0_1_1_3_5 + 0.0150072150072156*G0_1_1_4_0 - 0.0033862433862435*G0_1_1_4_1 - 0.0116209716209721*G0_1_1_4_2 + 0.000153920153920152*G0_1_1_4_3 + 0.0332467532467542*G0_1_1_4_4 + 0.00723424723424759*G0_1_1_4_5 - 0.00407888407888415*G0_1_1_5_0 - 0.00307840307840316*G0_1_1_5_1 - 0.000230880230880305*G0_1_1_5_2 - 0.00615680615680623*G0_1_1_5_3 + 0.0072342472342476*G0_1_1_5_4 + 0.0520250120250145*G0_1_1_5_5; + A[16] = 0.00441718775052124*G0_0_0_0_0 - 0.0091697397252956*G0_0_0_0_1 - 0.000244508577841918*G0_0_0_0_2 - 0.00298754743199198*G0_0_0_0_3 + 0.000940623162845418*G0_0_0_0_4 - 0.00389075944631515*G0_0_0_0_5 - 0.0091697397252956*G0_0_0_1_0 + 0.168726952060292*G0_0_0_1_1 - 0.00916973972529561*G0_0_0_1_2 + 0.0375821709155056*G0_0_0_1_3 + 0.000903212014323143*G0_0_0_1_4 + 0.0375821709155057*G0_0_0_1_5 - 0.000244508577841918*G0_0_0_2_0 - 0.0091697397252956*G0_0_0_2_1 + 0.00441718775052123*G0_0_0_2_2 - 0.00389075944631514*G0_0_0_2_3 + 0.000940623162845417*G0_0_0_2_4 - 0.00298754743199199*G0_0_0_2_5 - 0.00298754743199198*G0_0_0_3_0 + 0.0375821709155056*G0_0_0_3_1 - 0.00389075944631514*G0_0_0_3_2 + 0.0239003794559358*G0_0_0_3_3 + 0.00416867083533764*G0_0_0_3_4 + 0.011950189727968*G0_0_0_3_5 + 0.000940623162845419*G0_0_0_4_0 + 0.000903212014323143*G0_0_0_4_1 + 0.000940623162845417*G0_0_0_4_2 + 0.00416867083533764*G0_0_0_4_3 + 0.0158623269734386*G0_0_0_4_4 + 0.00416867083533764*G0_0_0_4_5 - 0.00389075944631515*G0_0_0_5_0 + 0.0375821709155057*G0_0_0_5_1 - 0.00298754743199199*G0_0_0_5_2 + 0.011950189727968*G0_0_0_5_3 + 0.00416867083533764*G0_0_0_5_4 + 0.0239003794559359*G0_0_0_5_5; + A[70] = A[157] + 0.0250889850889861*G0_0_0_0_0 + 0.000538720538720519*G0_0_0_0_2 - 0.00354016354016363*G0_0_0_0_3 + 0.00200096200096207*G0_0_0_0_4 - 0.0266281866281874*G0_0_0_0_5 - 0.0250889850889856*G0_0_0_1_1 - 0.000538720538720559*G0_0_0_1_2 - 0.00200096200096217*G0_0_0_1_3 + 0.00354016354016363*G0_0_0_1_4 + 0.0266281866281874*G0_0_0_1_5 + 0.000538720538720519*G0_0_0_2_0 - 0.000538720538720559*G0_0_0_2_1 + 0.000615680615680771*G0_0_0_2_3 - 0.000615680615680526*G0_0_0_2_4 - 0.00354016354016363*G0_0_0_3_0 - 0.00200096200096217*G0_0_0_3_1 + 0.000615680615680771*G0_0_0_3_2 + 0.0350937950937959*G0_0_0_3_3 + 0.00708032708032724*G0_0_0_3_5 + 0.00200096200096207*G0_0_0_4_0 + 0.00354016354016363*G0_0_0_4_1 - 0.000615680615680526*G0_0_0_4_2 - 0.035093795093796*G0_0_0_4_4 - 0.0070803270803273*G0_0_0_4_5 - 0.0266281866281874*G0_0_0_5_0 + 0.0266281866281874*G0_0_0_5_1 + 0.00708032708032725*G0_0_0_5_3 - 0.0070803270803273*G0_0_0_5_4 - 0.104511784511788*G0_0_1_0_0 - 0.00731120731120754*G0_0_1_0_1 - 0.00546416546416564*G0_0_1_0_2 - 0.00323232323232328*G0_0_1_0_3 + 0.0387878787878801*G0_0_1_0_4 + 0.0292448292448303*G0_0_1_0_5 - 0.00731120731120754*G0_0_1_1_0 - 0.0315536315536323*G0_0_1_1_1 - 0.000269360269360275*G0_0_1_1_2 - 0.00708032708032742*G0_0_1_1_3 + 0.00507936507936525*G0_0_1_1_4 - 0.00415584415584445*G0_0_1_1_5 - 0.00546416546416564*G0_0_1_2_0 - 0.000269360269360276*G0_0_1_2_1 + 0.00877344877344925*G0_0_1_2_2 + 0.00492544492544522*G0_0_1_2_3 - 0.0118518518518522*G0_0_1_2_4 - 0.00415584415584425*G0_0_1_2_5 - 0.00323232323232328*G0_0_1_3_0 - 0.00708032708032742*G0_0_1_3_1 + 0.00492544492544522*G0_0_1_3_2 + 0.0840404040404066*G0_0_1_3_3 - 0.00369408369408387*G0_0_1_3_4 + 0.0147763347763351*G0_0_1_3_5 + 0.03878787878788*G0_0_1_4_0 + 0.00507936507936525*G0_0_1_4_1 - 0.0118518518518522*G0_0_1_4_2 - 0.00369408369408387*G0_0_1_4_3 + 0.0988167388167417*G0_0_1_4_4 - 0.00184704184704202*G0_0_1_4_5 + 0.0292448292448303*G0_0_1_5_0 - 0.00415584415584445*G0_0_1_5_1 - 0.00415584415584425*G0_0_1_5_2 + 0.0147763347763351*G0_0_1_5_3 - 0.00184704184704201*G0_0_1_5_4 + 0.199788359788366*G0_0_1_5_5 - 0.0064646464646468*G0_1_0_0_0 - 0.00731120731120756*G0_1_0_0_1 + 0.000269360269360255*G0_1_0_0_2 + 0.0015392015392016*G0_1_0_0_3 - 0.00507936507936525*G0_1_0_0_4 - 0.0307840307840318*G0_1_0_0_5 - 0.00731120731120757*G0_1_0_1_0 - 0.129600769600774*G0_1_0_1_1 - 0.00600288600288619*G0_1_0_1_2 + 0.036786916786918*G0_1_0_1_3 + 0.000307840307840299*G0_1_0_1_4 + 0.0558730158730177*G0_1_0_1_5 + 0.000269360269360255*G0_1_0_2_0 - 0.00600288600288619*G0_1_0_2_1 + 0.00877344877344912*G0_1_0_2_2 - 0.0112361712361716*G0_1_0_2_3 + 0.00430976430976452*G0_1_0_2_4 - 0.00415584415584431*G0_1_0_2_5 + 0.0015392015392016*G0_1_0_3_0 + 0.036786916786918*G0_1_0_3_1 - 0.0112361712361716*G0_1_0_3_2 + 0.133910533910538*G0_1_0_3_3 - 0.00369408369408374*G0_1_0_3_4 + 0.00523328523328548*G0_1_0_3_5 - 0.00507936507936525*G0_1_0_4_0 + 0.0003078403078403*G0_1_0_4_1 + 0.00430976430976452*G0_1_0_4_2 - 0.00369408369408374*G0_1_0_4_3 + 0.0489466089466115*G0_1_0_4_4 + 0.00769600769600803*G0_1_0_4_5 - 0.0307840307840318*G0_1_0_5_0 + 0.0558730158730177*G0_1_0_5_1 - 0.00415584415584431*G0_1_0_5_2 + 0.00523328523328547*G0_1_0_5_3 + 0.00769600769600802*G0_1_0_5_4 + 0.199788359788367*G0_1_0_5_5 + 0.0338624338624347*G0_1_1_0_0 - 0.0073112073112075*G0_1_1_0_1 + 0.00211640211640219*G0_1_1_0_2 - 0.00769600769600793*G0_1_1_0_3 - 0.0127753727753733*G0_1_1_0_4 - 0.0187782587782595*G0_1_1_0_5 - 0.0073112073112075*G0_1_1_1_0 - 0.169927849927856*G0_1_1_1_1 - 0.0078499278499281*G0_1_1_1_2 + 0.0444829244829259*G0_1_1_1_3 + 0.00954304954304989*G0_1_1_1_4 + 0.0438672438672452*G0_1_1_1_5 + 0.00211640211640219*G0_1_1_2_0 - 0.0078499278499281*G0_1_1_2_1 + 0.00877344877344908*G0_1_1_2_2 - 0.0207792207792215*G0_1_1_2_3 + 0.0138528138528144*G0_1_1_2_4 - 0.00415584415584426*G0_1_1_2_5 - 0.00769600769600793*G0_1_1_3_0 + 0.0444829244829259*G0_1_1_3_1 - 0.0207792207792215*G0_1_1_3_2 + 0.234882154882163*G0_1_1_3_3 - 0.00369408369408381*G0_1_1_3_4 + 0.0237037037037045*G0_1_1_3_5 - 0.0127753727753733*G0_1_1_4_0 + 0.00954304954304989*G0_1_1_4_1 + 0.0138528138528144*G0_1_1_4_2 - 0.00369408369408381*G0_1_1_4_3 - 0.0520250120250138*G0_1_1_4_4 - 0.0107744107744113*G0_1_1_4_5 - 0.0187782587782595*G0_1_1_5_0 + 0.0438672438672452*G0_1_1_5_1 - 0.00415584415584426*G0_1_1_5_2 + 0.0237037037037045*G0_1_1_5_3 - 0.0107744107744113*G0_1_1_5_4 + 0.199788359788366*G0_1_1_5_5; + A[36] = -0.000590027256693936*G0_1_0_0_0 + 2.99289188178132e-05*G0_1_0_0_1 + 0.00352306130083916*G0_1_0_0_2 + 0.000359147025813706*G0_1_0_0_3 - 0.00875634653412457*G0_1_0_0_4 - 0.000632782855005087*G0_1_0_0_5 + 2.99289188178132e-05*G0_1_0_1_0 - 0.00161616161616169*G0_1_0_1_1 + 0.00583186360964157*G0_1_0_1_2 + 0.00448078670300906*G0_1_0_1_3 + 0.00354016354016365*G0_1_0_1_4 + 0.00141948586393034*G0_1_0_1_5 + 0.00352306130083916*G0_1_0_2_0 + 0.00583186360964157*G0_1_0_2_1 - 0.0896584896584922*G0_1_0_2_2 - 0.0274490941157617*G0_1_0_2_3 - 0.00179573512906847*G0_1_0_2_4 + 0.000906418684196477*G0_1_0_2_5 + 0.000359147025813706*G0_1_0_3_0 + 0.00448078670300906*G0_1_0_3_1 - 0.0274490941157617*G0_1_0_3_2 - 0.0178547378547385*G0_1_0_3_3 - 0.00779862113195471*G0_1_0_3_4 - 0.00253113142002041*G0_1_0_3_5 - 0.00875634653412457*G0_1_0_4_0 + 0.00354016354016365*G0_1_0_4_1 - 0.00179573512906847*G0_1_0_4_2 - 0.00779862113195471*G0_1_0_4_3 - 0.0158024691358028*G0_1_0_4_4 - 0.00889316444872028*G0_1_0_4_5 - 0.000632782855005087*G0_1_0_5_0 + 0.00141948586393034*G0_1_0_5_1 + 0.000906418684196477*G0_1_0_5_2 - 0.00253113142002041*G0_1_0_5_3 - 0.00889316444872028*G0_1_0_5_4 - 0.00212067767623336*G0_1_0_5_5 - 0.0356068622735302*G0_1_1_0_0 + 0.00304847415958538*G0_1_1_0_1 + 0.00296723852279417*G0_1_1_0_2 + 0.00020522687189355*G0_1_1_0_3 - 0.00791833680722595*G0_1_1_0_4 - 0.0153236064347181*G0_1_1_0_5 + 0.00304847415958538*G0_1_1_1_0 - 0.00251402918069595*G0_1_1_1_1 + 0.00538292982737445*G0_1_1_1_2 + 0.004514991181658*G0_1_1_1_3 + 0.00285607396718517*G0_1_1_1_4 + 0.00420715087381768*G0_1_1_1_5 + 0.00296723852279417*G0_1_1_2_0 + 0.00538292982737445*G0_1_1_2_1 - 0.0833734167067527*G0_1_1_2_2 - 0.0258414836192623*G0_1_1_2_3 - 0.00109454331676558*G0_1_1_2_4 + 0.0010774410774411*G0_1_1_2_5 + 0.00020522687189355*G0_1_1_3_0 + 0.004514991181658*G0_1_1_3_1 - 0.0258414836192623*G0_1_1_3_2 - 0.0170338303671643*G0_1_1_3_3 - 0.00612260167815744*G0_1_1_3_4 - 0.00256533589866933*G0_1_1_3_5 - 0.00791833680722595*G0_1_1_4_0 + 0.00285607396718517*G0_1_1_4_1 - 0.00109454331676558*G0_1_1_4_2 - 0.00612260167815744*G0_1_1_4_3 - 0.00355726577948803*G0_1_1_4_4 - 0.00786703008925257*G0_1_1_4_5 - 0.0153236064347181*G0_1_1_5_0 + 0.00420715087381768*G0_1_1_5_1 + 0.0010774410774411*G0_1_1_5_2 - 0.00256533589866933*G0_1_1_5_3 - 0.00786703008925256*G0_1_1_5_4 - 0.0184704184704192*G0_1_1_5_5; + A[122] = -0.00233445566778907*G0_0_1_0_0 - 0.00167174389396617*G0_0_1_0_1 + 0.0225322003099788*G0_0_1_0_2 + 0.00649885094329559*G0_0_1_0_3 + 0.0115440115440119*G0_0_1_0_4 + 0.000820907487574185*G0_0_1_0_5 - 0.00167174389396617*G0_0_1_1_0 - 0.00233445566778909*G0_0_1_1_1 + 0.0225322003099788*G0_0_1_1_2 + 0.0115440115440119*G0_0_1_1_3 + 0.0064988509432956*G0_0_1_1_4 + 0.000820907487574178*G0_0_1_1_5 + 0.0225322003099788*G0_0_1_2_0 + 0.0225322003099788*G0_0_1_2_1 - 0.378771845438524*G0_0_1_2_2 - 0.0951739618406317*G0_0_1_2_3 - 0.0951739618406316*G0_0_1_2_4 - 0.00504516060071639*G0_0_1_2_5 + 0.00649885094329559*G0_0_1_3_0 + 0.0115440115440119*G0_0_1_3_1 - 0.0951739618406317*G0_0_1_3_2 - 0.0519908075463649*G0_0_1_3_3 - 0.0259954037731824*G0_0_1_3_4 - 0.00290738068515858*G0_0_1_3_5 + 0.0115440115440119*G0_0_1_4_0 + 0.0064988509432956*G0_0_1_4_1 - 0.0951739618406317*G0_0_1_4_2 - 0.0259954037731824*G0_0_1_4_3 - 0.0519908075463648*G0_0_1_4_4 - 0.00290738068515858*G0_0_1_4_5 + 0.000820907487574186*G0_0_1_5_0 + 0.000820907487574178*G0_0_1_5_1 - 0.00504516060071639*G0_0_1_5_2 - 0.00290738068515858*G0_0_1_5_3 - 0.00290738068515858*G0_0_1_5_4 + 0.000752498530276286*G0_0_1_5_5 - 0.0168799102132441*G0_1_1_0_0 + 0.0013724547057881*G0_1_1_0_1 + 0.0119288119288123*G0_1_1_0_2 + 0.00446368446368461*G0_1_1_0_3 + 0.000410453743787088*G0_1_1_0_4 - 0.00764470097803459*G0_1_1_0_5 + 0.0013724547057881*G0_1_1_1_0 - 0.00436107102773789*G0_1_1_1_1 + 0.0158837047725942*G0_1_1_1_2 + 0.00950884506440093*G0_1_1_1_3 + 0.00613970391748189*G0_1_1_1_4 + 0.00249692694137145*G0_1_1_1_5 + 0.0119288119288123*G0_1_1_2_0 + 0.0158837047725942*G0_1_1_2_1 - 0.283726150392826*G0_1_1_2_2 - 0.0685799796910931*G0_1_1_2_3 - 0.0419859975415545*G0_1_1_2_4 + 0.000342044786489195*G0_1_1_2_5 + 0.0044636844636846*G0_1_1_3_0 + 0.00950884506440093*G0_1_1_3_1 - 0.0685799796910931*G0_1_1_3_2 - 0.0472021805355155*G0_1_1_3_3 - 0.021206776762333*G0_1_1_3_4 - 0.00961145850034772*G0_1_1_3_5 + 0.000410453743787088*G0_1_1_4_0 + 0.00613970391748189*G0_1_1_4_1 - 0.0419859975415545*G0_1_1_4_2 - 0.021206776762333*G0_1_1_4_3 - 0.0376249265138167*G0_1_1_4_4 - 0.0129634974079423*G0_1_1_4_5 - 0.0076447009780346*G0_1_1_5_0 + 0.00249692694137145*G0_1_1_5_1 + 0.000342044786489195*G0_1_1_5_2 - 0.00961145850034772*G0_1_1_5_3 - 0.0129634974079423*G0_1_1_5_4 - 0.0431660520549425*G0_1_1_5_5; + A[138] = 0.0160076960076967*G0_0_0_0_0 - 0.00129977018865913*G0_0_0_0_1 - 0.00177863288974407*G0_0_0_0_2 + 0.0116295227406343*G0_0_0_0_4 - 0.00424135535246655*G0_0_0_0_5 - 0.00129977018865913*G0_0_0_1_0 - 0.0669039602372957*G0_0_0_1_1 + 0.0113558869114429*G0_0_0_1_2 - 0.0638939661161906*G0_0_0_1_3 - 0.000820907487574186*G0_0_0_1_4 + 0.00191545080433968*G0_0_0_1_5 - 0.00177863288974407*G0_0_0_2_0 + 0.0113558869114429*G0_0_0_2_1 + 0.00287317620650972*G0_0_0_2_2 + 0.0184704184704191*G0_0_0_2_3 - 0.00533589866923216*G0_0_0_2_4 - 0.00752498530276332*G0_0_0_2_5 - 0.0638939661161906*G0_0_0_3_1 + 0.0184704184704191*G0_0_0_3_2 - 0.142837902837908*G0_0_0_3_3 + 0.00164181497514834*G0_0_0_3_4 + 0.0150499706055266*G0_0_0_3_5 + 0.0116295227406343*G0_0_0_4_0 - 0.000820907487574186*G0_0_0_4_1 - 0.00533589866923216*G0_0_0_4_2 + 0.00164181497514834*G0_0_0_4_3 + 0.0213435946769287*G0_0_0_4_4 + 0.016691785580675*G0_0_0_4_5 - 0.00424135535246655*G0_0_0_5_0 + 0.00191545080433968*G0_0_0_5_1 - 0.00752498530276332*G0_0_0_5_2 + 0.0150499706055266*G0_0_0_5_3 + 0.016691785580675*G0_0_0_5_4 + 0.0503489925712165*G0_0_0_5_5 + 0.0100561167227839*G0_0_1_0_0 - 0.000615680615680659*G0_0_1_0_1 - 0.000410453743787103*G0_0_1_0_2 + 0.0020522687189355*G0_0_1_0_4 - 0.00656725990059339*G0_0_1_0_5 - 0.000615680615680659*G0_0_1_1_0 - 0.177521244187917*G0_0_1_1_1 + 0.0138186093741654*G0_0_1_1_2 - 0.0674512318956786*G0_0_1_1_3 + 0.0001368179145957*G0_0_1_1_4 + 0.00588317032761487*G0_0_1_1_5 - 0.000410453743787103*G0_0_1_2_0 + 0.0138186093741654*G0_0_1_2_1 - 0.0018470418470419*G0_0_1_2_2 + 0.012176794399017*G0_0_1_2_3 - 0.000273635829191405*G0_0_1_2_4 - 0.00314681203570103*G0_0_1_2_5 - 0.0674512318956786*G0_0_1_3_1 + 0.012176794399017*G0_0_1_3_2 - 0.0681353214686571*G0_0_1_3_3 - 0.000273635829191388*G0_0_1_3_4 + 0.00629362407140201*G0_0_1_3_5 + 0.0020522687189355*G0_0_1_4_0 + 0.0001368179145957*G0_0_1_4_1 - 0.000273635829191404*G0_0_1_4_2 - 0.000273635829191388*G0_0_1_4_3 + 0.00136817914595702*G0_0_1_4_4 + 0.00601998824221069*G0_0_1_4_5 - 0.00656725990059339*G0_0_1_5_0 + 0.00588317032761487*G0_0_1_5_1 - 0.00314681203570103*G0_0_1_5_2 + 0.006293624071402*G0_0_1_5_3 + 0.00601998824221069*G0_0_1_5_4 + 0.0637571482015949*G0_0_1_5_5 + 0.000615680615680601*G0_1_0_0_0 + 0.000410453743787079*G0_1_0_0_2 + 0.00164181497514837*G0_1_0_0_3 - 0.00123136123136126*G0_1_0_0_4 - 0.0036940836940838*G0_1_0_0_5 - 0.0728555395222084*G0_1_0_1_1 + 0.0125188391855063*G0_1_0_1_2 - 0.0714189514189539*G0_1_0_1_3 - 0.00123136123136128*G0_1_0_1_4 - 0.00246272246272262*G0_1_0_1_5 + 0.000410453743787079*G0_1_0_2_0 + 0.0125188391855063*G0_1_0_2_1 - 0.00102613435946765*G0_1_0_2_2 + 0.0229854096520772*G0_1_0_2_3 - 0.00164181497514834*G0_1_0_2_4 - 0.00615680615680635*G0_1_0_2_5 + 0.00164181497514837*G0_1_0_3_0 - 0.0714189514189539*G0_1_0_3_1 + 0.0229854096520772*G0_1_0_3_2 - 0.160076960076966*G0_1_0_3_3 - 0.000820907487574203*G0_1_0_3_4 + 0.00902998236331589*G0_1_0_3_5 - 0.00123136123136126*G0_1_0_4_0 - 0.00123136123136128*G0_1_0_4_1 - 0.00164181497514834*G0_1_0_4_2 - 0.000820907487574203*G0_1_0_4_3 - 0.000820907487574126*G0_1_0_4_4 + 0.0147763347763353*G0_1_0_4_5 - 0.00369408369408379*G0_1_0_5_0 - 0.00246272246272262*G0_1_0_5_1 - 0.00615680615680635*G0_1_0_5_2 + 0.00902998236331589*G0_1_0_5_3 + 0.0147763347763353*G0_1_0_5_4 + 0.0517171717171735*G0_1_0_5_5 - 0.00533589866923226*G0_1_1_0_0 + 0.00280476724921178*G0_1_1_0_1 + 0.000889316444872032*G0_1_1_0_2 + 0.000410453743787093*G0_1_1_0_3 - 0.00437817326706231*G0_1_1_0_4 - 0.0124504302282084*G0_1_1_0_5 + 0.00280476724921178*G0_1_1_1_0 - 0.192913259579933*G0_1_1_1_1 + 0.0151183795628245*G0_1_1_1_2 - 0.0738816738816764*G0_1_1_1_3 + 0.000547271658382798*G0_1_1_1_4 + 0.000889316444872032*G0_1_1_2_0 + 0.0151183795628245*G0_1_1_2_1 - 0.00287317620650963*G0_1_1_2_2 + 0.0138186093741654*G0_1_1_2_3 + 0.00136817914595697*G0_1_1_2_4 - 0.00123136123136126*G0_1_1_2_5 + 0.000410453743787093*G0_1_1_3_0 - 0.0738816738816764*G0_1_1_3_1 + 0.0138186093741654*G0_1_1_3_2 - 0.0755234888568248*G0_1_1_3_3 - 0.00191545080433975*G0_1_1_3_4 + 0.0016418149751483*G0_1_1_3_5 - 0.00437817326706231*G0_1_1_4_0 + 0.000547271658382798*G0_1_1_4_1 + 0.00136817914595697*G0_1_1_4_2 - 0.00191545080433976*G0_1_1_4_3 - 0.00601998824221066*G0_1_1_4_4 + 0.00136817914595697*G0_1_1_4_5 - 0.0124504302282084*G0_1_1_5_0 - 0.00123136123136126*G0_1_1_5_2 + 0.0016418149751483*G0_1_1_5_3 + 0.00136817914595697*G0_1_1_5_4 + 0.0558217091550444*G0_1_1_5_5; + A[212] = 0.00302709636042985*G0_0_1_0_0 - 0.00756774090107447*G0_0_1_0_2 - 0.00128266794933464*G0_0_1_0_3 - 0.00743947410614099*G0_0_1_0_4 + 0.00056437389770729*G0_0_1_0_5 - 0.00302709636042984*G0_0_1_1_1 + 0.00756774090107454*G0_0_1_1_2 + 0.00743947410614106*G0_0_1_1_3 + 0.00128266794933468*G0_0_1_1_4 - 0.000564373897707267*G0_0_1_1_5 - 0.00756774090107447*G0_0_1_2_0 + 0.00756774090107455*G0_0_1_2_1 - 0.0389931056597739*G0_0_1_2_3 + 0.0389931056597735*G0_0_1_2_4 - 0.00128266794933464*G0_0_1_3_0 + 0.00743947410614106*G0_0_1_3_1 - 0.0389931056597739*G0_0_1_3_2 - 0.00923520923520986*G0_0_1_3_3 + 0.00256533589866929*G0_0_1_3_5 - 0.00743947410614099*G0_0_1_4_0 + 0.00128266794933468*G0_0_1_4_1 + 0.0389931056597735*G0_0_1_4_2 + 0.00923520923520937*G0_0_1_4_4 - 0.00256533589866933*G0_0_1_4_5 + 0.00056437389770729*G0_0_1_5_0 - 0.000564373897707267*G0_0_1_5_1 + 0.00256533589866929*G0_0_1_5_3 - 0.00256533589866933*G0_0_1_5_4 + 0.00979958313291686*G0_1_1_0_0 - 0.00541285874619228*G0_1_1_0_1 + 0.00759339426006117*G0_1_1_0_2 + 0.0011800545133879*G0_1_1_0_3 + 0.00620811287477976*G0_1_1_0_4 + 0.0051819785153121*G0_1_1_0_5 - 0.00541285874619228*G0_1_1_1_0 + 0.00677248677248705*G0_1_1_1_1 + 0.0151611351611357*G0_1_1_1_2 + 0.0136475869809208*G0_1_1_1_3 + 0.00246272246272257*G0_1_1_1_4 + 0.00461760461760483*G0_1_1_1_5 + 0.00759339426006117*G0_1_1_2_0 + 0.0151611351611357*G0_1_1_2_1 - 0.122366522366527*G0_1_1_2_2 - 0.0731120731120757*G0_1_1_2_3 - 0.0341189674523019*G0_1_1_2_4 - 0.0118518518518523*G0_1_1_2_5 + 0.0011800545133879*G0_1_1_3_0 + 0.0136475869809208*G0_1_1_3_1 - 0.0731120731120757*G0_1_1_3_2 - 0.0178547378547388*G0_1_1_3_3 - 0.00728555395222096*G0_1_1_3_4 + 0.0213435946769286*G0_1_1_3_5 + 0.00620811287477976*G0_1_1_4_0 + 0.00246272246272257*G0_1_1_4_1 - 0.0341189674523019*G0_1_1_4_2 - 0.00728555395222096*G0_1_1_4_3 - 0.00861952861952901*G0_1_1_4_4 + 0.0187782587782593*G0_1_1_4_5 + 0.0051819785153121*G0_1_1_5_0 + 0.00461760461760483*G0_1_1_5_1 - 0.0118518518518523*G0_1_1_5_2 + 0.0213435946769286*G0_1_1_5_3 + 0.0187782587782593*G0_1_1_5_4 + 0.118826358826363*G0_1_1_5_5; + A[1] = 0.0161696328363001*G0_0_0_0_0 - 0.000518678852012203*G0_0_0_0_1 - 0.00119742397520179*G0_0_0_0_2 - 3.95489284378203e-05*G0_0_0_0_3 + 0.00540430762653003*G0_0_0_0_4 + 0.000816631927743074*G0_0_0_0_5 - 0.000518678852012203*G0_0_0_1_0 + 0.0161696328363001*G0_0_0_1_1 - 0.00119742397520179*G0_0_0_1_2 + 0.00540430762653003*G0_0_0_1_3 - 3.95489284378203e-05*G0_0_0_1_4 + 0.000816631927743076*G0_0_0_1_5 - 0.00119742397520179*G0_0_0_2_0 - 0.00119742397520179*G0_0_0_2_1 - 1.76366843033532e-05*G0_0_0_2_2 - 0.000654160654160679*G0_0_0_2_3 - 0.000654160654160678*G0_0_0_2_4 - 0.00044145155256268*G0_0_0_2_5 - 3.95489284378202e-05*G0_0_0_3_0 + 0.00540430762653003*G0_0_0_3_1 - 0.000654160654160678*G0_0_0_3_2 + 0.0034461012238791*G0_0_0_3_3 + 0.000158195713751273*G0_0_0_3_4 + 0.000962000962000998*G0_0_0_3_5 + 0.00540430762653003*G0_0_0_4_0 - 3.95489284378204e-05*G0_0_0_4_1 - 0.000654160654160678*G0_0_0_4_2 + 0.000158195713751273*G0_0_0_4_3 + 0.0034461012238791*G0_0_0_4_4 + 0.000962000962000997*G0_0_0_4_5 + 0.000816631927743074*G0_0_0_5_0 + 0.000816631927743076*G0_0_0_5_1 - 0.00044145155256268*G0_0_0_5_2 + 0.000962000962000998*G0_0_0_5_3 + 0.000962000962000997*G0_0_0_5_4 - 0.00216343327454445*G0_0_0_5_5 + 0.0161696328363001*G0_1_0_0_0 - 0.000518678852012202*G0_1_0_0_1 - 0.00119742397520179*G0_1_0_0_2 - 3.95489284378196e-05*G0_1_0_0_3 + 0.00540430762653003*G0_1_0_0_4 + 0.000816631927743073*G0_1_0_0_5 - 0.000518678852012202*G0_1_0_1_0 + 0.0161696328363*G0_1_0_1_1 - 0.00119742397520179*G0_1_0_1_2 + 0.00540430762653002*G0_1_0_1_3 - 3.95489284378206e-05*G0_1_0_1_4 + 0.000816631927743075*G0_1_0_1_5 - 0.00119742397520179*G0_1_0_2_0 - 0.00119742397520179*G0_1_0_2_1 - 1.76366843033628e-05*G0_1_0_2_2 - 0.000654160654160677*G0_1_0_2_3 - 0.000654160654160679*G0_1_0_2_4 - 0.00044145155256268*G0_1_0_2_5 - 3.95489284378196e-05*G0_1_0_3_0 + 0.00540430762653002*G0_1_0_3_1 - 0.000654160654160677*G0_1_0_3_2 + 0.00344610122387909*G0_1_0_3_3 + 0.000158195713751272*G0_1_0_3_4 + 0.000962000962000996*G0_1_0_3_5 + 0.00540430762653003*G0_1_0_4_0 - 3.95489284378206e-05*G0_1_0_4_1 - 0.000654160654160678*G0_1_0_4_2 + 0.000158195713751273*G0_1_0_4_3 + 0.0034461012238791*G0_1_0_4_4 + 0.000962000962000997*G0_1_0_4_5 + 0.000816631927743073*G0_1_0_5_0 + 0.000816631927743075*G0_1_0_5_1 - 0.00044145155256268*G0_1_0_5_2 + 0.000962000962000996*G0_1_0_5_3 + 0.000962000962000997*G0_1_0_5_4 - 0.00216343327454445*G0_1_0_5_5; + A[46] = -0.00202661535994877*G0_0_0_0_0 - 0.00664849553738463*G0_0_0_0_1 + 0.00304419859975425*G0_0_0_0_2 - 0.00035914702581371*G0_0_0_0_3 + 0.00167601945379728*G0_0_0_0_4 - 0.00203516647961099*G0_0_0_0_5 - 0.00664849553738463*G0_0_0_1_0 + 0.095045695045698*G0_0_0_1_1 - 0.0106033883811665*G0_0_0_1_2 + 0.0531879642990772*G0_0_0_1_3 + 0.00538720538720556*G0_0_0_1_4 + 0.0265939821495386*G0_0_0_1_5 + 0.00304419859975425*G0_0_0_2_0 - 0.0106033883811665*G0_0_0_2_1 - 0.014545454545455*G0_0_0_2_2 - 0.0111335578002248*G0_0_0_2_3 - 0.00846560846560874*G0_0_0_2_4 - 0.00203516647961101*G0_0_0_2_5 - 0.00035914702581371*G0_0_0_3_0 + 0.0531879642990772*G0_0_0_3_1 - 0.0111335578002248*G0_0_0_3_2 + 0.0143658810325482*G0_0_0_3_3 - 0.0100561167227837*G0_0_0_3_4 + 0.00478862701084944*G0_0_0_3_5 + 0.00167601945379728*G0_0_0_4_0 + 0.00538720538720556*G0_0_0_4_1 - 0.00846560846560874*G0_0_0_4_2 - 0.0100561167227837*G0_0_0_4_3 - 0.0439185505852186*G0_0_0_4_4 - 0.00670407781518916*G0_0_0_4_5 - 0.00203516647961099*G0_0_0_5_0 + 0.0265939821495386*G0_0_0_5_1 - 0.002035166479611*G0_0_0_5_2 + 0.00478862701084944*G0_0_0_5_3 - 0.00670407781518916*G0_0_0_5_4 + 0.00478862701084939*G0_0_0_5_5 + 0.00233445566778907*G0_1_0_0_0 - 0.0225322003099789*G0_1_0_0_1 + 0.00167174389396617*G0_1_0_0_2 - 0.00649885094329561*G0_1_0_0_3 - 0.000820907487574183*G0_1_0_0_4 - 0.011544011544012*G0_1_0_0_5 - 0.0225322003099789*G0_1_0_1_0 + 0.378771845438526*G0_1_0_1_1 - 0.0225322003099789*G0_1_0_1_2 + 0.0951739618406319*G0_1_0_1_3 + 0.0050451606007163*G0_1_0_1_4 + 0.0951739618406322*G0_1_0_1_5 + 0.00167174389396617*G0_1_0_2_0 - 0.0225322003099789*G0_1_0_2_1 + 0.0023344556677891*G0_1_0_2_2 - 0.0115440115440119*G0_1_0_2_3 - 0.000820907487574177*G0_1_0_2_4 - 0.00649885094329564*G0_1_0_2_5 - 0.00649885094329561*G0_1_0_3_0 + 0.0951739618406319*G0_1_0_3_1 - 0.0115440115440119*G0_1_0_3_2 + 0.0519908075463649*G0_1_0_3_3 + 0.00290738068515856*G0_1_0_3_4 + 0.0259954037731826*G0_1_0_3_5 - 0.000820907487574183*G0_1_0_4_0 + 0.0050451606007163*G0_1_0_4_1 - 0.000820907487574177*G0_1_0_4_2 + 0.00290738068515856*G0_1_0_4_3 - 0.000752498530276348*G0_1_0_4_4 + 0.00290738068515855*G0_1_0_4_5 - 0.011544011544012*G0_1_0_5_0 + 0.0951739618406322*G0_1_0_5_1 - 0.00649885094329564*G0_1_0_5_2 + 0.0259954037731826*G0_1_0_5_3 + 0.00290738068515855*G0_1_0_5_4 + 0.0519908075463651*G0_1_0_5_5; + A[89] = 0.00574635241301926*G0_0_0_0_0 - 0.0246272246272254*G0_0_0_0_2 + 0.00410453743787091*G0_0_0_0_3 - 0.0492544492544509*G0_0_0_0_4 - 0.00369408369408382*G0_0_0_0_5 - 0.00574635241301931*G0_0_0_1_1 + 0.0246272246272256*G0_0_0_1_2 + 0.0492544492544511*G0_0_0_1_3 - 0.00410453743787086*G0_0_0_1_4 + 0.00369408369408383*G0_0_0_1_5 - 0.0246272246272254*G0_0_0_2_0 + 0.0246272246272256*G0_0_0_2_1 - 0.143658810325483*G0_0_0_2_3 + 0.143658810325482*G0_0_0_2_4 + 0.00410453743787091*G0_0_0_3_0 + 0.0492544492544511*G0_0_0_3_1 - 0.143658810325483*G0_0_0_3_2 - 0.262690396023739*G0_0_0_3_3 - 0.00820907487574192*G0_0_0_3_5 - 0.0492544492544509*G0_0_0_4_0 - 0.00410453743787086*G0_0_0_4_1 + 0.143658810325482*G0_0_0_4_2 + 0.262690396023738*G0_0_0_4_4 + 0.00820907487574182*G0_0_0_4_5 - 0.00369408369408382*G0_0_0_5_0 + 0.00369408369408383*G0_0_0_5_1 - 0.00820907487574192*G0_0_0_5_3 + 0.00820907487574182*G0_0_0_5_4 - 0.00533589866923217*G0_0_1_0_0 - 0.00492544492544509*G0_0_1_0_1 + 0.0233958633958642*G0_0_1_0_2 + 0.0242167708834383*G0_0_1_0_3 + 0.0147763347763353*G0_0_1_0_4 + 0.00205226871893546*G0_0_1_0_5 - 0.0049254449254451*G0_0_1_1_0 - 0.0110822510822514*G0_0_1_1_1 + 0.0480230880230897*G0_0_1_1_2 + 0.0640307840307863*G0_0_1_1_3 + 0.0201122334455675*G0_0_1_1_4 + 0.00574635241301934*G0_0_1_1_5 + 0.0233958633958642*G0_0_1_2_0 + 0.0480230880230897*G0_0_1_2_1 - 0.326310726310738*G0_0_1_2_2 - 0.231906365239707*G0_0_1_2_3 - 0.0882475549142246*G0_0_1_2_4 - 0.0119031585698257*G0_0_1_2_5 + 0.0242167708834383*G0_0_1_3_0 + 0.0640307840307863*G0_0_1_3_1 - 0.231906365239707*G0_0_1_3_2 - 0.330004810004822*G0_0_1_3_3 - 0.0886580086580118*G0_0_1_3_4 - 0.0246272246272255*G0_0_1_3_5 + 0.0147763347763353*G0_0_1_4_0 + 0.0201122334455675*G0_0_1_4_1 - 0.0882475549142246*G0_0_1_4_2 - 0.0886580086580118*G0_0_1_4_3 - 0.0673144139810831*G0_0_1_4_4 - 0.0164181497514837*G0_0_1_4_5 + 0.00205226871893546*G0_0_1_5_0 + 0.00574635241301934*G0_0_1_5_1 - 0.0119031585698257*G0_0_1_5_2 - 0.0246272246272256*G0_0_1_5_3 - 0.0164181497514837*G0_0_1_5_4 - 0.0180599647266317*G0_0_1_5_5 - 0.000820907487574183*G0_1_0_0_0 - 0.00554112554112571*G0_1_0_0_1 + 0.00472021805355151*G0_1_0_0_2 + 0.0373512906846252*G0_1_0_0_3 - 0.00944043610710316*G0_1_0_0_4 + 0.000820907487574143*G0_1_0_0_5 - 0.00554112554112571*G0_1_0_1_0 - 0.00779862113195465*G0_1_0_1_1 + 0.0416610549943898*G0_1_0_1_2 + 0.11287477954145*G0_1_0_1_3 + 0.00944043610710309*G0_1_0_1_4 + 0.0119031585698257*G0_1_0_1_5 + 0.00472021805355151*G0_1_0_2_0 + 0.0416610549943898*G0_1_0_2_1 - 0.133397466730805*G0_1_0_2_2 - 0.242167708834384*G0_1_0_2_3 - 0.00944043610710315*G0_1_0_2_5 + 0.0373512906846252*G0_1_0_3_0 + 0.11287477954145*G0_1_0_3_1 - 0.242167708834384*G0_1_0_3_2 - 0.842251082251113*G0_1_0_3_3 - 0.0935834535834568*G0_1_0_3_4 - 0.0558217091550446*G0_1_0_3_5 - 0.00944043610710316*G0_1_0_4_0 + 0.00944043610710309*G0_1_0_4_1 - 0.0935834535834568*G0_1_0_4_3 + 0.0935834535834574*G0_1_0_4_4 + 0.000820907487574144*G0_1_0_5_0 + 0.0119031585698257*G0_1_0_5_1 - 0.00944043610710315*G0_1_0_5_2 - 0.0558217091550446*G0_1_0_5_3 - 0.00164181497514857*G0_1_0_5_5 - 0.018059964726632*G0_1_1_0_0 + 0.00410453743787095*G0_1_1_0_1 + 0.0172390572390578*G0_1_1_0_2 + 0.0566426166426184*G0_1_1_0_3 + 0.0168286034952707*G0_1_1_0_4 + 0.0180599647266319*G0_1_1_0_5 + 0.00410453743787095*G0_1_1_1_0 - 0.0566426166426188*G0_1_1_1_1 + 0.0558217091550445*G0_1_1_1_2 + 0.104255250921921*G0_1_1_1_3 + 0.0262690396023738*G0_1_1_1_4 - 0.0254481321147998*G0_1_1_1_5 + 0.0172390572390578*G0_1_1_2_0 + 0.0558217091550445*G0_1_1_2_1 - 0.2257495590829*G0_1_1_2_2 - 0.270899470899481*G0_1_1_2_3 - 0.0595157928491283*G0_1_1_2_4 + 0.00902998236331591*G0_1_1_2_5 + 0.0566426166426184*G0_1_1_3_0 + 0.104255250921921*G0_1_1_3_1 - 0.270899470899481*G0_1_1_3_2 - 0.893147346480711*G0_1_1_3_3 - 0.165823312489985*G0_1_1_3_4 - 0.131345198011869*G0_1_1_3_5 + 0.0168286034952707*G0_1_1_4_0 + 0.0262690396023738*G0_1_1_4_1 - 0.0595157928491283*G0_1_1_4_2 - 0.165823312489985*G0_1_1_4_3 - 0.072239858906528*G0_1_1_4_4 - 0.0705980439313796*G0_1_1_4_5 + 0.0180599647266319*G0_1_1_5_0 - 0.0254481321147998*G0_1_1_5_1 + 0.00902998236331591*G0_1_1_5_2 - 0.131345198011869*G0_1_1_5_3 - 0.0705980439313796*G0_1_1_5_4 - 0.34149751483086*G0_1_1_5_5; + A[99] = A[89] - 0.176084656084662*G0_0_0_0_0 + 0.00581476137031712*G0_0_0_0_1 + 0.0465180909625369*G0_0_0_0_2 - 0.0123136123136127*G0_0_0_0_3 - 0.0608839719950852*G0_0_0_0_4 - 0.0175126930682493*G0_0_0_0_5 + 0.00581476137031712*G0_0_0_1_0 + 0.0168286034952708*G0_0_0_1_1 - 0.0273635829191396*G0_0_0_1_2 - 0.0477494521938983*G0_0_0_1_3 - 0.0129977018865912*G0_0_0_1_5 + 0.0465180909625369*G0_0_0_2_0 - 0.0273635829191396*G0_0_0_2_1 + 0.00451499118165926*G0_0_0_2_2 + 0.144890171556844*G0_0_0_2_3 - 0.125188391855063*G0_0_0_2_4 - 0.00725134947357191*G0_0_0_2_5 - 0.0123136123136127*G0_0_0_3_0 - 0.0477494521938983*G0_0_0_3_1 + 0.144890171556844*G0_0_0_3_2 + 0.366124739458086*G0_0_0_3_3 + 0.0246272246272257*G0_0_0_3_4 + 0.0391299235743695*G0_0_0_3_5 - 0.0608839719950852*G0_0_0_4_0 - 0.125188391855063*G0_0_0_4_2 + 0.0246272246272257*G0_0_0_4_3 - 0.349706589706601*G0_0_0_4_4 + 0.0145026989471439*G0_0_0_4_5 - 0.0175126930682493*G0_0_0_5_0 - 0.0129977018865912*G0_0_0_5_1 - 0.00725134947357191*G0_0_0_5_2 + 0.0391299235743695*G0_0_0_5_3 + 0.0145026989471439*G0_0_0_5_4 + 0.0744289455400592*G0_0_0_5_5 + 0.0905050505050534*G0_0_1_0_0 - 0.0114927048260385*G0_0_1_0_1 - 0.0398140131473478*G0_0_1_0_2 - 0.0201122334455674*G0_0_1_0_3 + 0.0529485329485347*G0_0_1_0_4 + 0.0656725990059345*G0_0_1_0_5 - 0.0114927048260385*G0_0_1_1_0 + 0.0268847202180545*G0_0_1_1_1 - 0.0461760461760478*G0_0_1_1_2 - 0.0656725990059346*G0_0_1_1_3 - 0.0459708193041542*G0_0_1_1_4 - 0.0336572069905415*G0_0_1_1_5 - 0.0398140131473478*G0_0_1_2_0 - 0.0461760461760478*G0_0_1_2_1 + 0.342113195446541*G0_0_1_2_2 + 0.230264550264558*G0_0_1_2_3 + 0.0603367003367025*G0_0_1_2_4 - 0.013955427288761*G0_0_1_2_5 - 0.0201122334455674*G0_0_1_3_0 - 0.0656725990059346*G0_0_1_3_1 + 0.230264550264558*G0_0_1_3_2 + 0.440827320827337*G0_0_1_3_3 + 0.132166105499443*G0_0_1_3_4 + 0.0681353214686572*G0_0_1_3_5 + 0.0529485329485347*G0_0_1_4_0 - 0.0459708193041542*G0_0_1_4_1 + 0.0603367003367025*G0_0_1_4_2 + 0.132166105499443*G0_0_1_4_3 + 0.222465929132604*G0_0_1_4_4 + 0.119852493185831*G0_0_1_4_5 + 0.0656725990059345*G0_0_1_5_0 - 0.0336572069905415*G0_0_1_5_1 - 0.013955427288761*G0_0_1_5_2 + 0.0681353214686573*G0_0_1_5_3 + 0.119852493185831*G0_0_1_5_4 + 0.173211479878152*G0_0_1_5_5 + 0.449241622574972*G0_1_0_0_0 - 0.0108770242103579*G0_1_0_0_1 - 0.0211383678050352*G0_1_0_0_2 - 0.0414558281224961*G0_1_0_0_3 + 0.0689562289562314*G0_1_0_0_4 + 0.0586948853615542*G0_1_0_0_5 - 0.0108770242103579*G0_1_0_1_0 + 0.0170338303671642*G0_1_0_1_1 - 0.0433028699695382*G0_1_0_1_2 - 0.111643418310089*G0_1_0_1_3 - 0.0188808722142062*G0_1_0_1_4 - 0.0151867885201224*G0_1_0_1_5 - 0.0211383678050352*G0_1_0_2_0 - 0.0433028699695382*G0_1_0_2_1 + 0.142632675966015*G0_1_0_2_2 + 0.243399070065746*G0_1_0_2_3 - 0.00328362995029673*G0_1_0_2_4 - 0.0414558281224961*G0_1_0_3_0 - 0.111643418310089*G0_1_0_3_1 + 0.243399070065746*G0_1_0_3_2 + 0.943222703222737*G0_1_0_3_3 + 0.120673400673405*G0_1_0_3_4 + 0.0829116562449926*G0_1_0_3_5 + 0.0689562289562314*G0_1_0_4_0 - 0.0188808722142062*G0_1_0_4_1 - 0.00328362995029674*G0_1_0_4_2 + 0.120673400673405*G0_1_0_4_3 - 0.0697771364438061*G0_1_0_4_4 + 0.0377617444284124*G0_1_0_4_5 + 0.0586948853615542*G0_1_0_5_0 - 0.0151867885201224*G0_1_0_5_1 + 0.0829116562449926*G0_1_0_5_3 + 0.0377617444284124*G0_1_0_5_4 + 0.0254481321147998*G0_1_0_5_5 - 0.152278338945011*G0_1_1_0_0 + 0.0177863288974406*G0_1_1_0_1 - 0.0114242958687407*G0_1_1_0_2 - 0.0648516915183602*G0_1_1_0_3 - 0.0380353802576037*G0_1_1_0_4 - 0.128198385976168*G0_1_1_0_5 + 0.0177863288974406*G0_1_1_1_0 + 0.0611576078242768*G0_1_1_1_1 - 0.0585580674469584*G0_1_1_1_2 - 0.10302388969056*G0_1_1_1_3 - 0.0335203890759458*G0_1_1_1_4 + 0.043918550585219*G0_1_1_1_5 - 0.0114242958687407*G0_1_1_2_0 - 0.0585580674469584*G0_1_1_2_1 + 0.236831810165152*G0_1_1_2_2 + 0.272404467960033*G0_1_1_2_3 + 0.0502121746566209*G0_1_1_2_4 - 0.0131345198011868*G0_1_1_2_5 - 0.0648516915183602*G0_1_1_3_0 - 0.10302388969056*G0_1_1_3_1 + 0.272404467960033*G0_1_1_3_2 + 0.996581689915059*G0_1_1_3_3 + 0.196744161188612*G0_1_1_3_4 + 0.155972422639095*G0_1_1_3_5 - 0.0380353802576037*G0_1_1_4_0 - 0.0335203890759458*G0_1_1_4_1 + 0.0502121746566209*G0_1_1_4_2 + 0.196744161188612*G0_1_1_4_3 + 0.146668804446587*G0_1_1_4_4 + 0.0933098177542653*G0_1_1_4_5 - 0.128198385976168*G0_1_1_5_0 + 0.043918550585219*G0_1_1_5_1 - 0.0131345198011868*G0_1_1_5_2 + 0.155972422639095*G0_1_1_5_3 + 0.0933098177542653*G0_1_1_5_4 + 0.254481321147996*G0_1_1_5_5; + A[125] = A[99] + 0.16089786756454*G0_0_0_0_0 - 0.0114927048260385*G0_0_0_0_1 + 0.0386510608732843*G0_0_0_0_2 + 0.0321522099299887*G0_0_0_0_3 + 0.150499706055267*G0_0_0_0_4 + 0.0243535887980341*G0_0_0_0_5 - 0.0114927048260385*G0_0_0_1_0 - 0.0205226871893546*G0_0_0_1_1 + 0.0632782855005098*G0_0_0_1_2 + 0.0388562877451779*G0_0_0_1_3 + 0.0280476724921179*G0_0_0_1_4 + 0.0124504302282084*G0_0_0_1_5 + 0.0386510608732843*G0_0_0_2_0 + 0.0632782855005098*G0_0_0_2_1 - 0.878781465448161*G0_0_0_2_2 - 0.259817219817228*G0_0_0_2_3 - 0.277056277056286*G0_0_0_2_4 - 0.00916680027791186*G0_0_0_2_5 + 0.0321522099299887*G0_0_0_3_0 + 0.0388562877451779*G0_0_0_3_1 - 0.259817219817228*G0_0_0_3_2 - 0.294979423868323*G0_0_0_3_3 - 0.120399764844213*G0_0_0_3_4 - 0.0459708193041543*G0_0_0_3_5 + 0.150499706055267*G0_0_0_4_0 + 0.0280476724921179*G0_0_0_4_1 - 0.277056277056286*G0_0_0_4_2 - 0.120399764844213*G0_0_0_4_3 - 0.104528886751113*G0_0_0_4_4 - 0.0377617444284124*G0_0_0_4_5 + 0.0243535887980341*G0_0_0_5_0 + 0.0124504302282084*G0_0_0_5_1 - 0.00916680027791186*G0_0_0_5_2 - 0.0459708193041543*G0_0_0_5_3 - 0.0377617444284124*G0_0_0_5_4 - 0.0793543904655042*G0_0_0_5_5 - 0.0898893698893728*G0_0_1_0_0 + 0.0118347496125278*G0_0_1_0_1 + 0.0386510608732844*G0_0_1_0_2 + 0.0176495109828449*G0_0_1_0_3 - 0.0491176313398552*G0_0_1_0_4 - 0.0645780556891689*G0_0_1_0_5 + 0.0118347496125278*G0_0_1_1_0 - 0.027089947089948*G0_0_1_1_1 + 0.0364619742397533*G0_0_1_1_2 + 0.0480230880230896*G0_0_1_1_3 + 0.0444658222436015*G0_0_1_1_4 + 0.0307840307840318*G0_0_1_1_5 + 0.0386510608732844*G0_0_1_2_0 + 0.0364619742397533*G0_0_1_2_1 - 0.271309924643267*G0_0_1_2_2 - 0.176221473999258*G0_0_1_2_3 - 0.0610207899096809*G0_0_1_2_4 + 0.0135449735449739*G0_0_1_2_5 + 0.0176495109828449*G0_0_1_3_0 + 0.0480230880230896*G0_0_1_3_1 - 0.176221473999258*G0_0_1_3_2 - 0.352990219656899*G0_0_1_3_3 - 0.124230666452893*G0_0_1_3_4 - 0.0623889690556379*G0_0_1_3_5 - 0.0491176313398552*G0_0_1_4_0 + 0.0444658222436015*G0_0_1_4_1 - 0.0610207899096809*G0_0_1_4_2 - 0.124230666452893*G0_0_1_4_3 - 0.235874084762982*G0_0_1_4_4 - 0.116021591577151*G0_0_1_4_5 - 0.0645780556891689*G0_0_1_5_0 + 0.0307840307840318*G0_0_1_5_1 + 0.0135449735449739*G0_0_1_5_2 - 0.0623889690556379*G0_0_1_5_3 - 0.116021591577151*G0_0_1_5_4 - 0.162539682539688*G0_0_1_5_5 - 0.446573673240356*G0_1_0_0_0 + 0.0153236064347181*G0_1_0_0_1 + 0.0386510608732843*G0_1_0_0_2 + 0.00944043610710311*G0_1_0_0_3 - 0.0655357810913389*G0_1_0_0_4 - 0.059242157019937*G0_1_0_0_5 + 0.0153236064347181*G0_1_0_1_0 - 0.0139554272887611*G0_1_0_1_1 + 0.0399508310619435*G0_1_0_1_2 + 0.0205226871893546*G0_1_0_1_3 + 0.0116295227406342*G0_1_0_1_4 + 0.00328362995029672*G0_1_0_1_5 + 0.0386510608732843*G0_1_0_2_0 + 0.0399508310619435*G0_1_0_2_1 - 0.627994227994248*G0_1_0_2_2 - 0.170885575330026*G0_1_0_2_3 - 0.0774389396611644*G0_1_0_2_4 + 0.00533589866923209*G0_1_0_2_5 + 0.00944043610710311*G0_1_0_3_0 + 0.0205226871893546*G0_1_0_3_1 - 0.170885575330026*G0_1_0_3_2 - 0.211794131794139*G0_1_0_3_3 - 0.0421399176954747*G0_1_0_3_4 - 0.0295526695526706*G0_1_0_3_5 - 0.0655357810913389*G0_1_0_4_0 + 0.0116295227406342*G0_1_0_4_1 - 0.0774389396611644*G0_1_0_4_2 - 0.0421399176954747*G0_1_0_4_3 + 0.0268163112607568*G0_1_0_4_4 - 0.0339308428197329*G0_1_0_4_5 - 0.059242157019937*G0_1_0_5_0 + 0.00328362995029672*G0_1_0_5_1 + 0.00533589866923209*G0_1_0_5_2 - 0.0295526695526706*G0_1_0_5_3 - 0.0339308428197329*G0_1_0_5_4 - 0.0213435946769288*G0_1_0_5_5 + 0.181420554753894*G0_1_1_0_0 - 0.0246272246272255*G0_1_1_0_1 + 0.00410453743787087*G0_1_1_0_3 + 0.0119031585698256*G0_1_1_0_4 + 0.111643418310089*G0_1_1_0_5 - 0.0246272246272255*G0_1_1_1_0 + 0.0246272246272255*G0_1_1_1_2 + 0.0172390572390579*G0_1_1_1_3 - 0.0172390572390578*G0_1_1_1_5 + 0.0246272246272255*G0_1_1_2_1 - 0.181420554753894*G0_1_1_2_2 - 0.111643418310089*G0_1_1_2_3 - 0.0119031585698256*G0_1_1_2_4 - 0.00410453743787095*G0_1_1_2_5 + 0.00410453743787087*G0_1_1_3_0 + 0.0172390572390579*G0_1_1_3_1 - 0.111643418310089*G0_1_1_3_2 - 0.190450537117211*G0_1_1_3_3 - 0.00820907487574185*G0_1_1_3_4 + 0.0119031585698256*G0_1_1_4_0 - 0.0119031585698256*G0_1_1_4_2 - 0.00820907487574185*G0_1_1_4_3 + 0.00820907487574182*G0_1_1_4_5 + 0.111643418310089*G0_1_1_5_0 - 0.0172390572390578*G0_1_1_5_1 - 0.00410453743787095*G0_1_1_5_2 + 0.00820907487574182*G0_1_1_5_4 + 0.190450537117211*G0_1_1_5_5; + A[83] = A[125] + 0.00656725990059345*G0_0_1_0_0 + 0.00348885682219028*G0_0_1_0_1 - 0.0164181497514836*G0_0_1_0_3 - 0.0246272246272255*G0_0_1_0_4 - 0.00287317620650964*G0_0_1_0_5 + 0.00348885682219028*G0_0_1_1_0 + 0.00656725990059338*G0_0_1_1_1 - 0.0246272246272255*G0_0_1_1_3 - 0.0164181497514837*G0_0_1_1_4 - 0.00287317620650969*G0_0_1_1_5 - 0.363251563251575*G0_0_1_2_2 + 0.00820907487574182*G0_0_1_2_3 + 0.00820907487574199*G0_0_1_2_4 + 0.00820907487574179*G0_0_1_2_5 - 0.0164181497514836*G0_0_1_3_0 - 0.0246272246272255*G0_0_1_3_1 + 0.00820907487574182*G0_0_1_3_2 + 0.131345198011869*G0_0_1_3_3 + 0.0656725990059346*G0_0_1_3_4 + 0.0164181497514836*G0_0_1_3_5 - 0.0246272246272255*G0_0_1_4_0 - 0.0164181497514837*G0_0_1_4_1 + 0.00820907487574199*G0_0_1_4_2 + 0.0656725990059346*G0_0_1_4_3 + 0.131345198011869*G0_0_1_4_4 + 0.0164181497514837*G0_0_1_4_5 - 0.00287317620650963*G0_0_1_5_0 - 0.00287317620650969*G0_0_1_5_1 + 0.00820907487574178*G0_0_1_5_2 + 0.0164181497514836*G0_0_1_5_3 + 0.0164181497514837*G0_0_1_5_4 + 0.00985088985088991*G0_0_1_5_5 - 0.00656725990059345*G0_1_0_0_0 - 0.00348885682219028*G0_1_0_0_1 + 0.0164181497514836*G0_1_0_0_3 + 0.0246272246272255*G0_1_0_0_4 + 0.00287317620650964*G0_1_0_0_5 - 0.00348885682219029*G0_1_0_1_0 - 0.00656725990059338*G0_1_0_1_1 + 0.0246272246272255*G0_1_0_1_3 + 0.0164181497514837*G0_1_0_1_4 + 0.00287317620650969*G0_1_0_1_5 + 0.363251563251575*G0_1_0_2_2 - 0.00820907487574182*G0_1_0_2_3 - 0.00820907487574199*G0_1_0_2_4 - 0.00820907487574179*G0_1_0_2_5 + 0.0164181497514836*G0_1_0_3_0 + 0.0246272246272255*G0_1_0_3_1 - 0.00820907487574182*G0_1_0_3_2 - 0.131345198011869*G0_1_0_3_3 - 0.0656725990059346*G0_1_0_3_4 - 0.0164181497514836*G0_1_0_3_5 + 0.0246272246272255*G0_1_0_4_0 + 0.0164181497514837*G0_1_0_4_1 - 0.00820907487574199*G0_1_0_4_2 - 0.0656725990059346*G0_1_0_4_3 - 0.131345198011869*G0_1_0_4_4 - 0.0164181497514837*G0_1_0_4_5 + 0.00287317620650963*G0_1_0_5_0 + 0.00287317620650969*G0_1_0_5_1 - 0.00820907487574179*G0_1_0_5_2 - 0.0164181497514836*G0_1_0_5_3 - 0.0164181497514837*G0_1_0_5_4 - 0.00985088985088991*G0_1_0_5_5; + A[80] = -A[125] + 0.00656725990059345*G0_1_0_0_0 + 0.00348885682219029*G0_1_0_0_1 - 0.0164181497514836*G0_1_0_0_3 - 0.0246272246272255*G0_1_0_0_4 - 0.00287317620650964*G0_1_0_0_5 + 0.00348885682219029*G0_1_0_1_0 + 0.00656725990059339*G0_1_0_1_1 - 0.0246272246272255*G0_1_0_1_3 - 0.0164181497514837*G0_1_0_1_4 - 0.00287317620650969*G0_1_0_1_5 - 0.363251563251575*G0_1_0_2_2 + 0.00820907487574193*G0_1_0_2_3 + 0.00820907487574205*G0_1_0_2_4 + 0.0082090748757418*G0_1_0_2_5 - 0.0164181497514836*G0_1_0_3_0 - 0.0246272246272255*G0_1_0_3_1 + 0.00820907487574191*G0_1_0_3_2 + 0.131345198011869*G0_1_0_3_3 + 0.0656725990059346*G0_1_0_3_4 + 0.0164181497514837*G0_1_0_3_5 - 0.0246272246272255*G0_1_0_4_0 - 0.0164181497514837*G0_1_0_4_1 + 0.00820907487574205*G0_1_0_4_2 + 0.0656725990059346*G0_1_0_4_3 + 0.13134519801187*G0_1_0_4_4 + 0.0164181497514837*G0_1_0_4_5 - 0.00287317620650964*G0_1_0_5_0 - 0.00287317620650969*G0_1_0_5_1 + 0.0082090748757418*G0_1_0_5_2 + 0.0164181497514837*G0_1_0_5_3 + 0.0164181497514837*G0_1_0_5_4 + 0.00985088985088992*G0_1_0_5_5 + 0.0221645021645029*G0_1_1_0_0 - 0.00458340013895591*G0_1_1_0_1 - 0.0116295227406343*G0_1_1_0_2 - 0.0537694404361088*G0_1_1_0_3 - 0.0351622040510941*G0_1_1_0_4 - 0.0186072363850148*G0_1_1_0_5 - 0.00458340013895591*G0_1_1_1_0 + 0.101382074715412*G0_1_1_1_1 - 0.0242851798407363*G0_1_1_1_2 - 0.0496649029982379*G0_1_1_1_3 - 0.0351622040510942*G0_1_1_1_4 + 0.0348885682219031*G0_1_1_1_5 - 0.0116295227406343*G0_1_1_2_0 - 0.0242851798407363*G0_1_1_2_1 + 0.093036181925074*G0_1_1_2_3 + 0.0465180909625371*G0_1_1_2_4 - 0.00205226871893543*G0_1_1_2_5 - 0.0537694404361088*G0_1_1_3_0 - 0.0496649029982379*G0_1_1_3_1 + 0.093036181925074*G0_1_1_3_2 + 0.533589866923219*G0_1_1_3_3 + 0.177863288974406*G0_1_1_3_4 + 0.111643418310089*G0_1_1_3_5 - 0.0351622040510941*G0_1_1_4_0 - 0.0351622040510942*G0_1_1_4_1 + 0.0465180909625371*G0_1_1_4_2 + 0.177863288974406*G0_1_1_4_3 + 0.177863288974407*G0_1_1_4_4 + 0.0744289455400592*G0_1_1_4_5 - 0.0186072363850148*G0_1_1_5_0 + 0.0348885682219031*G0_1_1_5_1 - 0.00205226871893543*G0_1_1_5_2 + 0.111643418310089*G0_1_1_5_3 + 0.0744289455400592*G0_1_1_5_4 + 0.2511976911977*G0_1_1_5_5; + A[144] = A[80] + 0.524149430816116*G0_0_0_0_0 - 0.0357778846667748*G0_0_0_0_1 + 0.0270215381326501*G0_0_0_0_2 + 0.0218908663353114*G0_0_0_0_3 + 0.188808722142062*G0_0_0_0_4 + 0.109180695847367*G0_0_0_0_5 - 0.0357778846667748*G0_0_0_1_0 + 0.0742921276254635*G0_0_0_1_1 + 0.0552060285393637*G0_0_0_1_2 + 0.0766180321735904*G0_0_0_1_3 + 0.00930361819250737*G0_0_0_1_4 - 0.0125872481428041*G0_0_0_1_5 + 0.0270215381326501*G0_0_0_2_0 + 0.0552060285393637*G0_0_0_2_1 - 0.863184223184252*G0_0_0_2_2 - 0.275551279995734*G0_0_0_2_3 - 0.287591256480155*G0_0_0_2_4 - 0.0465180909625372*G0_0_0_2_5 + 0.0218908663353114*G0_0_0_3_0 + 0.0766180321735904*G0_0_0_3_1 - 0.275551279995734*G0_0_0_3_2 - 0.0536326225215133*G0_0_0_3_3 - 0.0623889690556379*G0_0_0_3_4 + 0.0492544492544509*G0_0_0_3_5 + 0.188808722142062*G0_0_0_4_0 + 0.00930361819250737*G0_0_0_4_1 - 0.287591256480155*G0_0_0_4_2 - 0.0623889690556379*G0_0_0_4_3 - 0.0580107957885756*G0_0_0_4_4 + 0.0744289455400592*G0_0_0_4_5 + 0.109180695847367*G0_0_0_5_0 - 0.0125872481428041*G0_0_0_5_1 - 0.0465180909625372*G0_0_0_5_2 + 0.0492544492544509*G0_0_0_5_3 + 0.0744289455400592*G0_0_0_5_4 + 0.322890278445846*G0_0_0_5_5 - 0.0898893698893729*G0_0_1_0_0 - 0.0124504302282084*G0_0_1_0_1 + 0.0270215381326501*G0_0_1_0_2 + 0.0155972422639095*G0_0_1_0_3 - 0.00259954037731822*G0_0_1_0_4 + 0.028458126235905*G0_0_1_0_5 - 0.0124504302282084*G0_0_1_1_0 + 0.0742921276254635*G0_0_1_1_1 + 0.0318785741007974*G0_0_1_1_2 + 0.0829116562449924*G0_0_1_1_3 + 0.0093036181925074*G0_0_1_1_4 - 0.0188808722142061*G0_0_1_1_5 + 0.0270215381326501*G0_0_1_2_0 + 0.0318785741007974*G0_0_1_2_1 - 0.249145422478764*G0_0_1_2_2 - 0.194828710384273*G0_0_1_2_3 - 0.0961829939607751*G0_0_1_2_4 - 0.040224466891135*G0_0_1_2_5 + 0.0155972422639095*G0_0_1_3_0 + 0.0829116562449924*G0_0_1_3_1 - 0.194828710384273*G0_0_1_3_2 - 0.101792528459199*G0_0_1_3_3 - 0.0498017209128337*G0_0_1_3_4 + 0.0492544492544509*G0_0_1_3_5 - 0.00259954037731822*G0_0_1_4_0 + 0.0093036181925074*G0_0_1_4_1 - 0.0961829939607751*G0_0_1_4_2 - 0.0498017209128337*G0_0_1_4_3 - 0.0580107957885756*G0_0_1_4_4 + 0.061841697397255*G0_0_1_4_5 + 0.028458126235905*G0_0_1_5_0 - 0.0188808722142061*G0_0_1_5_1 - 0.040224466891135*G0_0_1_5_2 + 0.0492544492544509*G0_0_1_5_3 + 0.0618416973972551*G0_0_1_5_4 + 0.371050184383531*G0_0_1_5_5 - 0.0898893698893729*G0_1_0_0_0 - 0.0124504302282084*G0_1_0_0_1 + 0.0270215381326501*G0_1_0_0_2 + 0.0155972422639095*G0_1_0_0_3 - 0.00259954037731822*G0_1_0_0_4 + 0.028458126235905*G0_1_0_0_5 - 0.0124504302282084*G0_1_0_1_0 + 0.0742921276254635*G0_1_0_1_1 + 0.0318785741007974*G0_1_0_1_2 + 0.0829116562449925*G0_1_0_1_3 + 0.0093036181925074*G0_1_0_1_4 - 0.0188808722142061*G0_1_0_1_5 + 0.0270215381326501*G0_1_0_2_0 + 0.0318785741007974*G0_1_0_2_1 - 0.249145422478764*G0_1_0_2_2 - 0.194828710384273*G0_1_0_2_3 - 0.0961829939607751*G0_1_0_2_4 - 0.040224466891135*G0_1_0_2_5 + 0.0155972422639095*G0_1_0_3_0 + 0.0829116562449924*G0_1_0_3_1 - 0.194828710384273*G0_1_0_3_2 - 0.101792528459199*G0_1_0_3_3 - 0.0498017209128337*G0_1_0_3_4 + 0.0492544492544509*G0_1_0_3_5 - 0.00259954037731822*G0_1_0_4_0 + 0.0093036181925074*G0_1_0_4_1 - 0.0961829939607751*G0_1_0_4_2 - 0.0498017209128337*G0_1_0_4_3 - 0.0580107957885756*G0_1_0_4_4 + 0.0618416973972551*G0_1_0_4_5 + 0.028458126235905*G0_1_0_5_0 - 0.0188808722142061*G0_1_0_5_1 - 0.040224466891135*G0_1_0_5_2 + 0.0492544492544509*G0_1_0_5_3 + 0.0618416973972551*G0_1_0_5_4 + 0.371050184383531*G0_1_0_5_5 + 0.159256052589392*G0_1_1_0_0 - 0.0443290043290058*G0_1_1_0_1 + 0.0558217091550443*G0_1_1_0_3 + 0.0935834535834568*G0_1_1_0_4 + 0.223286836620178*G0_1_1_0_5 - 0.0443290043290058*G0_1_1_1_0 + 0.0443290043290059*G0_1_1_1_2 + 0.101792528459199*G0_1_1_1_3 - 0.101792528459199*G0_1_1_1_5 + 0.0443290043290059*G0_1_1_2_1 - 0.159256052589391*G0_1_1_2_2 - 0.223286836620178*G0_1_1_2_3 - 0.0935834535834568*G0_1_1_2_4 - 0.0558217091550445*G0_1_1_2_5 + 0.0558217091550443*G0_1_1_3_0 + 0.101792528459199*G0_1_1_3_1 - 0.223286836620178*G0_1_1_3_2 - 0.472842712842729*G0_1_1_3_3 - 0.111643418310089*G0_1_1_3_4 + 0.0935834535834568*G0_1_1_4_0 - 0.0935834535834568*G0_1_1_4_2 - 0.111643418310089*G0_1_1_4_3 + 0.111643418310089*G0_1_1_4_5 + 0.223286836620178*G0_1_1_5_0 - 0.101792528459199*G0_1_1_5_1 - 0.0558217091550445*G0_1_1_5_2 + 0.111643418310089*G0_1_1_5_4 + 0.47284271284273*G0_1_1_5_5; + A[31] = 1.76366843033591e-05*G0_1_0_0_0 + 0.0011974239752018*G0_1_0_0_1 + 0.00119742397520179*G0_1_0_0_2 + 0.00044145155256268*G0_1_0_0_3 + 0.00065416065416068*G0_1_0_0_4 + 0.000654160654160682*G0_1_0_0_5 + 0.0011974239752018*G0_1_0_1_0 - 0.0161696328363002*G0_1_0_1_1 + 0.000518678852012207*G0_1_0_1_2 - 0.000816631927743088*G0_1_0_1_3 + 3.95489284378198e-05*G0_1_0_1_4 - 0.00540430762653009*G0_1_0_1_5 + 0.00119742397520179*G0_1_0_2_0 + 0.000518678852012208*G0_1_0_2_1 - 0.0161696328363*G0_1_0_2_2 - 0.000816631927743068*G0_1_0_2_3 - 0.00540430762653003*G0_1_0_2_4 + 3.95489284378183e-05*G0_1_0_2_5 + 0.00044145155256268*G0_1_0_3_0 - 0.000816631927743088*G0_1_0_3_1 - 0.000816631927743068*G0_1_0_3_2 + 0.00216343327454445*G0_1_0_3_3 - 0.000962000962000996*G0_1_0_3_4 - 0.000962000962001002*G0_1_0_3_5 + 0.00065416065416068*G0_1_0_4_0 + 3.95489284378198e-05*G0_1_0_4_1 - 0.00540430762653003*G0_1_0_4_2 - 0.000962000962000996*G0_1_0_4_3 - 0.0034461012238791*G0_1_0_4_4 - 0.000158195713751276*G0_1_0_4_5 + 0.000654160654160682*G0_1_0_5_0 - 0.00540430762653009*G0_1_0_5_1 + 3.95489284378182e-05*G0_1_0_5_2 - 0.000962000962001002*G0_1_0_5_3 - 0.000158195713751277*G0_1_0_5_4 - 0.00344610122387915*G0_1_0_5_5; + A[107] = -0.000814494147827546*G0_0_1_0_0 + 0.00109988776655447*G0_0_1_0_1 - 0.00634920634920652*G0_0_1_0_2 - 0.00365560365560377*G0_0_1_0_3 - 0.00218053551386892*G0_0_1_0_4 - 0.00168029501362843*G0_0_1_0_5 + 0.00109988776655447*G0_0_1_1_0 + 0.00221260221260234*G0_0_1_1_1 - 0.013916947250281*G0_0_1_1_2 - 0.00962000962000994*G0_0_1_1_3 - 0.00493827160493844*G0_0_1_1_4 - 0.00111592111592113*G0_0_1_1_5 - 0.00634920634920652*G0_0_1_2_0 - 0.013916947250281*G0_0_1_2_1 + 0.212698412698419*G0_0_1_2_2 + 0.0616321949655303*G0_0_1_2_3 + 0.0226390893057566*G0_0_1_2_4 + 0.00160333493666836*G0_0_1_2_5 - 0.00365560365560377*G0_0_1_3_0 - 0.00962000962000994*G0_0_1_3_1 + 0.0616321949655303*G0_0_1_3_2 + 0.0389931056597737*G0_0_1_3_3 + 0.0171877505210845*G0_0_1_3_4 + 0.00410453743787094*G0_0_1_3_5 - 0.00218053551386892*G0_0_1_4_0 - 0.00493827160493844*G0_0_1_4_1 + 0.0226390893057566*G0_0_1_4_2 + 0.0171877505210845*G0_0_1_4_3 + 0.0297578964245642*G0_0_1_4_4 + 0.00666987333654025*G0_0_1_4_5 - 0.00168029501362843*G0_0_1_5_0 - 0.00111592111592113*G0_0_1_5_1 + 0.00160333493666835*G0_0_1_5_2 + 0.00410453743787094*G0_0_1_5_3 + 0.00666987333654025*G0_0_1_5_4 - 0.000410453743787087*G0_0_1_5_5 + 0.031899951899953*G0_1_1_0_0 - 0.00297899631232975*G0_1_1_0_1 - 0.00520763187429868*G0_1_1_0_2 - 0.00164181497514836*G0_1_1_0_3 + 0.0105820105820109*G0_1_1_0_4 + 0.0166233766233772*G0_1_1_0_5 - 0.00297899631232975*G0_1_1_1_0 + 0.00247554914221593*G0_1_1_1_1 - 0.0108994708994712*G0_1_1_1_2 - 0.00947891614558313*G0_1_1_1_3 - 0.00556677890011241*G0_1_1_1_4 - 0.00699054032387388*G0_1_1_1_5 - 0.00520763187429868*G0_1_1_2_0 - 0.0108994708994712*G0_1_1_2_1 + 0.182202982202988*G0_1_1_2_2 + 0.0514349847683198*G0_1_1_2_3 + 0.00468173801507146*G0_1_1_2_4 - 0.00228314894981566*G0_1_1_2_5 - 0.00164181497514836*G0_1_1_3_0 - 0.00947891614558313*G0_1_1_3_1 + 0.0514349847683198*G0_1_1_3_2 + 0.0368895302228649*G0_1_1_3_3 + 0.0144171877505216*G0_1_1_3_4 + 0.00784992784992812*G0_1_1_3_5 + 0.0105820105820109*G0_1_1_4_0 - 0.00556677890011241*G0_1_1_4_1 + 0.00468173801507146*G0_1_1_4_2 + 0.0144171877505216*G0_1_1_4_3 + 0.0194452461119133*G0_1_1_4_4 + 0.0156998556998562*G0_1_1_4_5 + 0.0166233766233772*G0_1_1_5_0 - 0.00699054032387388*G0_1_1_5_1 - 0.00228314894981566*G0_1_1_5_2 + 0.00784992784992812*G0_1_1_5_3 + 0.0156998556998562*G0_1_1_5_4 + 0.0423280423280438*G0_1_1_5_5; + A[7] = A[107] - 0.0304954304954318*G0_0_0_0_0 + 0.0030174763508098*G0_0_0_0_1 + 0.00114157447490786*G0_0_0_0_2 - 0.00388648388648401*G0_0_0_0_3 - 0.0179573512906853*G0_0_0_0_4 - 0.0101972101972106*G0_0_0_0_5 + 0.0030174763508098*G0_0_0_1_0 + 0.000262946929613591*G0_0_0_1_1 - 0.00407888407888422*G0_0_0_1_2 - 0.00587461920795273*G0_0_0_1_3 - 0.000628507295173978*G0_0_0_1_4 + 0.000141093474426823*G0_0_0_1_5 + 0.00114157447490786*G0_0_0_2_0 - 0.00407888407888422*G0_0_0_2_1 + 0.0327144460477805*G0_0_0_2_2 + 0.0183036716370056*G0_0_0_2_3 + 0.0127625460958799*G0_0_0_2_4 + 0.00201378868045542*G0_0_0_2_5 - 0.00388648388648401*G0_0_0_3_0 - 0.00587461920795273*G0_0_0_3_1 + 0.0183036716370056*G0_0_0_3_2 + 0.0427384960718309*G0_0_0_3_3 + 0.009029982363316*G0_0_0_3_4 + 0.00374539041205722*G0_0_0_3_5 - 0.0179573512906853*G0_0_0_4_0 - 0.000628507295173978*G0_0_0_4_1 + 0.0127625460958799*G0_0_0_4_2 + 0.009029982363316*G0_0_0_4_3 - 0.0103126503126507*G0_0_0_4_4 - 0.00277056277056288*G0_0_0_4_5 - 0.0101972101972106*G0_0_0_5_0 + 0.000141093474426823*G0_0_0_5_1 + 0.00201378868045542*G0_0_0_5_2 + 0.00374539041205722*G0_0_0_5_3 - 0.00277056277056288*G0_0_0_5_4 - 0.00210357543690887*G0_0_0_5_5 + 0.183017476350816*G0_0_1_0_0 - 0.0119993586660257*G0_0_1_0_1 + 0.0011415744749078*G0_0_1_0_2 + 0.00137245470578806*G0_0_1_0_3 + 0.00686227352894043*G0_0_1_0_4 + 0.0531152797819483*G0_0_1_0_5 - 0.0119993586660257*G0_0_1_1_0 + 0.000262946929613543*G0_0_1_1_1 + 0.0109379509379513*G0_0_1_1_2 + 0.00262946929613605*G0_0_1_1_3 - 0.000628507295173976*G0_0_1_1_4 - 0.00836299502966201*G0_0_1_1_5 + 0.0011415744749078*G0_0_1_2_0 + 0.0109379509379513*G0_0_1_2_1 - 0.180798460798466*G0_0_1_2_2 - 0.0450088183421532*G0_0_1_2_3 - 0.0120570787237457*G0_0_1_2_4 - 0.00324514991181672*G0_0_1_2_5 + 0.00137245470578806*G0_0_1_3_0 + 0.00262946929613605*G0_0_1_3_1 - 0.0450088183421532*G0_0_1_3_2 + 0.00333493666827008*G0_0_1_3_3 - 0.00148789482122822*G0_0_1_3_4 + 0.0037453904120572*G0_0_1_3_5 + 0.00686227352894043*G0_0_1_4_0 - 0.000628507295173976*G0_0_1_4_1 - 0.0120570787237457*G0_0_1_4_2 - 0.00148789482122822*G0_0_1_4_3 - 0.0103126503126507*G0_0_1_4_4 + 0.00774731441398133*G0_0_1_4_5 + 0.0531152797819483*G0_0_1_5_0 - 0.00836299502966201*G0_0_1_5_1 - 0.00324514991181672*G0_0_1_5_2 + 0.0037453904120572*G0_0_1_5_3 + 0.00774731441398133*G0_0_1_5_4 + 0.037299983966652*G0_0_1_5_5 - 0.0304954304954318*G0_1_0_0_0 + 0.0030174763508098*G0_1_0_0_1 + 0.00114157447490786*G0_1_0_0_2 - 0.00388648388648401*G0_1_0_0_3 - 0.0179573512906853*G0_1_0_0_4 - 0.0101972101972106*G0_1_0_0_5 + 0.0030174763508098*G0_1_0_1_0 + 0.000262946929613593*G0_1_0_1_1 - 0.00407888407888423*G0_1_0_1_2 - 0.00587461920795273*G0_1_0_1_3 - 0.00062850729517398*G0_1_0_1_4 + 0.000141093474426823*G0_1_0_1_5 + 0.00114157447490786*G0_1_0_2_0 - 0.00407888407888423*G0_1_0_2_1 + 0.0327144460477806*G0_1_0_2_2 + 0.0183036716370056*G0_1_0_2_3 + 0.0127625460958799*G0_1_0_2_4 + 0.00201378868045543*G0_1_0_2_5 - 0.00388648388648401*G0_1_0_3_0 - 0.00587461920795273*G0_1_0_3_1 + 0.0183036716370056*G0_1_0_3_2 + 0.0427384960718309*G0_1_0_3_3 + 0.00902998236331601*G0_1_0_3_4 + 0.00374539041205722*G0_1_0_3_5 - 0.0179573512906853*G0_1_0_4_0 - 0.000628507295173979*G0_1_0_4_1 + 0.0127625460958799*G0_1_0_4_2 + 0.00902998236331601*G0_1_0_4_3 - 0.0103126503126507*G0_1_0_4_4 - 0.00277056277056288*G0_1_0_4_5 - 0.0101972101972106*G0_1_0_5_0 + 0.000141093474426823*G0_1_0_5_1 + 0.00201378868045543*G0_1_0_5_2 + 0.00374539041205722*G0_1_0_5_3 - 0.00277056277056288*G0_1_0_5_4 - 0.00210357543690886*G0_1_0_5_5 + 0.150303030303035*G0_1_1_0_0 - 0.00792047458714152*G0_1_1_0_1 - 0.000641333974667356*G0_1_1_0_3 - 0.00590027256693939*G0_1_1_0_4 + 0.0348116081449427*G0_1_1_0_5 - 0.00792047458714152*G0_1_1_1_0 + 0.0079204745871415*G0_1_1_1_2 + 0.00248837582170923*G0_1_1_1_3 - 0.00248837582170926*G0_1_1_1_5 + 0.00792047458714149*G0_1_1_2_1 - 0.150303030303035*G0_1_1_2_2 - 0.0348116081449426*G0_1_1_2_3 + 0.00590027256693949*G0_1_1_2_4 + 0.000641333974667292*G0_1_1_2_5 - 0.000641333974667357*G0_1_1_3_0 + 0.00248837582170923*G0_1_1_3_1 - 0.0348116081449426*G0_1_1_3_2 + 0.00543851210517897*G0_1_1_3_3 + 0.0012826679493347*G0_1_1_3_4 - 0.0059002725669394*G0_1_1_4_0 + 0.00590027256693949*G0_1_1_4_2 + 0.0012826679493347*G0_1_1_4_3 - 0.00128266794933459*G0_1_1_4_5 + 0.0348116081449427*G0_1_1_5_0 - 0.00248837582170926*G0_1_1_5_1 + 0.000641333974667291*G0_1_1_5_2 - 0.00128266794933459*G0_1_1_5_4 - 0.00543851210517891*G0_1_1_5_5; + A[182] = -A[212] + 0.00410453743787095*G0_0_1_0_0 - 0.00046176046176048*G0_0_1_0_1 - 0.00800384800384825*G0_0_1_0_2 + 0.000615680615680621*G0_0_1_0_3 + 0.00584896584896601*G0_0_1_0_4 + 0.00410453743787091*G0_0_1_0_5 - 0.00046176046176048*G0_0_1_1_0 - 0.00092352092352101*G0_0_1_1_1 + 0.00482283148949835*G0_0_1_1_2 + 0.00749078082411443*G0_0_1_1_3 + 0.000923520923520937*G0_0_1_1_5 - 0.00800384800384825*G0_0_1_2_0 + 0.00482283148949835*G0_0_1_2_1 - 0.0261664261664272*G0_0_1_2_3 + 0.026166426166427*G0_0_1_2_4 + 0.00318101651434993*G0_0_1_2_5 + 0.000615680615680622*G0_0_1_3_0 + 0.00749078082411443*G0_0_1_3_1 - 0.0261664261664272*G0_0_1_3_2 - 0.00697771364438055*G0_0_1_3_3 - 0.00123136123136127*G0_0_1_3_4 - 0.00759339426006111*G0_0_1_3_5 + 0.00584896584896601*G0_0_1_4_0 + 0.026166426166427*G0_0_1_4_2 - 0.00123136123136127*G0_0_1_4_3 + 0.00944043610710277*G0_0_1_4_4 - 0.00636203302869988*G0_0_1_4_5 + 0.00410453743787091*G0_0_1_5_0 + 0.000923520923520937*G0_0_1_5_1 + 0.00318101651434993*G0_0_1_5_2 - 0.00759339426006111*G0_0_1_5_3 - 0.00636203302869988*G0_0_1_5_4 - 0.0123136123136125*G0_0_1_5_5 - 0.0124162257495595*G0_1_1_0_0 - 0.000666987333654025*G0_1_1_0_1 + 0.0063620330286999*G0_1_1_0_2 + 0.000513067179733855*G0_1_1_0_3 + 0.00266794933461608*G0_1_1_0_4 - 0.0173416706750046*G0_1_1_0_5 - 0.000666987333654025*G0_1_1_1_0 + 0.0110822510822515*G0_1_1_1_1 + 0.00969696969697001*G0_1_1_1_2 + 0.0116979316979321*G0_1_1_1_3 + 0.000615680615680641*G0_1_1_1_4 + 0.0149815616482289*G0_1_1_1_5 + 0.0063620330286999*G0_1_1_2_0 + 0.00969696969697002*G0_1_1_2_1 - 0.0887606220939584*G0_1_1_2_2 - 0.0499727433060783*G0_1_1_2_3 - 0.0275004008337351*G0_1_1_2_4 - 0.00502805836139188*G0_1_1_2_5 + 0.000513067179733855*G0_1_1_3_0 + 0.0116979316979321*G0_1_1_3_1 - 0.0499727433060784*G0_1_1_3_2 - 0.0119031585698256*G0_1_1_3_3 - 0.002257495590829*G0_1_1_3_4 + 0.00902998236331601*G0_1_1_3_5 + 0.00266794933461608*G0_1_1_4_0 + 0.000615680615680642*G0_1_1_4_1 - 0.0275004008337351*G0_1_1_4_2 - 0.002257495590829*G0_1_1_4_3 + 0.00410453743787088*G0_1_1_4_4 + 0.00882475549142243*G0_1_1_4_5 - 0.0173416706750046*G0_1_1_5_0 + 0.0149815616482289*G0_1_1_5_1 - 0.00502805836139187*G0_1_1_5_2 + 0.00902998236331601*G0_1_1_5_3 + 0.00882475549142243*G0_1_1_5_4 + 0.00533589866923213*G0_1_1_5_5; + A[198] = A[89] - 0.0238063171396512*G0_0_0_0_0 + 0.0172390572390578*G0_0_0_0_1 + 0.0287317620650963*G0_0_0_0_2 + 0.0525380792047476*G0_0_0_0_3 + 0.0673144139810829*G0_0_0_0_4 + 0.0205226871893546*G0_0_0_0_5 + 0.0172390572390578*G0_0_0_1_0 - 0.220003206669881*G0_0_0_1_1 + 0.0311944845278188*G0_0_0_1_2 - 0.320153920153932*G0_0_0_1_3 + 0.0131345198011868*G0_0_0_1_4 - 0.0632098765432122*G0_0_0_1_5 + 0.0287317620650963*G0_0_0_2_0 + 0.0311944845278188*G0_0_0_2_1 - 0.0566426166426174*G0_0_0_2_2 + 0.247914061247404*G0_0_0_2_3 - 0.169106942440281*G0_0_0_2_4 + 0.0262690396023739*G0_0_0_2_5 + 0.0525380792047476*G0_0_0_3_0 - 0.320153920153932*G0_0_0_3_1 + 0.247914061247404*G0_0_0_3_2 - 0.630456950456972*G0_0_0_3_3 - 0.131345198011869*G0_0_0_3_4 - 0.157614237614243*G0_0_0_3_5 + 0.0673144139810829*G0_0_0_4_0 + 0.0131345198011868*G0_0_0_4_1 - 0.169106942440281*G0_0_0_4_2 - 0.131345198011869*G0_0_0_4_3 - 0.604187910854597*G0_0_0_4_4 - 0.0788071188071216*G0_0_0_4_5 + 0.0205226871893546*G0_0_0_5_0 - 0.0632098765432122*G0_0_0_5_1 + 0.0262690396023739*G0_0_0_5_2 - 0.157614237614243*G0_0_0_5_3 - 0.0788071188071216*G0_0_0_5_4 - 0.0722398589065283*G0_0_0_5_5 + 0.0283213083213093*G0_0_1_0_1 - 0.0283213083213092*G0_0_1_0_2 - 0.0127240660573998*G0_0_1_0_4 + 0.0127240660573998*G0_0_1_0_5 + 0.0283213083213093*G0_0_1_1_0 - 0.315228475228486*G0_0_1_1_1 - 0.295937149270493*G0_0_1_1_3 - 0.0320153920153931*G0_0_1_1_4 - 0.0939939073272443*G0_0_1_1_5 - 0.0283213083213092*G0_0_1_2_0 + 0.315228475228486*G0_0_1_2_2 + 0.295937149270493*G0_0_1_2_3 + 0.0939939073272439*G0_0_1_2_4 + 0.0320153920153933*G0_0_1_2_5 - 0.295937149270493*G0_0_1_3_1 + 0.295937149270493*G0_0_1_3_2 + 0.0640307840307862*G0_0_1_3_4 - 0.0640307840307864*G0_0_1_3_5 - 0.0127240660573998*G0_0_1_4_0 - 0.0320153920153931*G0_0_1_4_1 + 0.0939939073272439*G0_0_1_4_2 + 0.0640307840307862*G0_0_1_4_3 + 0.0492544492544508*G0_0_1_4_4 + 0.0127240660573998*G0_0_1_5_0 - 0.0939939073272443*G0_0_1_5_1 + 0.0320153920153933*G0_0_1_5_2 - 0.0640307840307864*G0_0_1_5_3 - 0.0492544492544517*G0_0_1_5_5 + 0.0102613435946773*G0_1_0_0_1 - 0.0102613435946772*G0_1_0_0_2 + 0.0102613435946774*G0_1_0_0_4 - 0.0102613435946772*G0_1_0_0_5 + 0.0102613435946773*G0_1_0_1_0 - 0.12559884559885*G0_1_0_1_1 - 0.355042488375834*G0_1_0_1_3 - 0.0188808722142062*G0_1_0_1_4 - 0.0119031585698259*G0_1_0_1_5 - 0.0102613435946772*G0_1_0_2_0 + 0.12559884559885*G0_1_0_2_2 + 0.355042488375835*G0_1_0_2_3 + 0.0119031585698255*G0_1_0_2_4 + 0.0188808722142063*G0_1_0_2_5 - 0.355042488375834*G0_1_0_3_1 + 0.355042488375835*G0_1_0_3_2 + 0.0377617444284123*G0_1_0_3_4 - 0.0377617444284126*G0_1_0_3_5 + 0.0102613435946774*G0_1_0_4_0 - 0.0188808722142062*G0_1_0_4_1 + 0.0119031585698255*G0_1_0_4_2 + 0.0377617444284124*G0_1_0_4_3 - 0.0952252685586061*G0_1_0_4_4 - 0.0102613435946772*G0_1_0_5_0 - 0.0119031585698259*G0_1_0_5_1 + 0.0188808722142063*G0_1_0_5_2 - 0.0377617444284125*G0_1_0_5_3 + 0.095225268558605*G0_1_0_5_5 + 0.0238063171396512*G0_1_1_0_0 - 0.0287317620650964*G0_1_1_0_1 - 0.0172390572390578*G0_1_1_0_2 - 0.0525380792047475*G0_1_1_0_3 - 0.0205226871893545*G0_1_1_0_4 - 0.0673144139810828*G0_1_1_0_5 - 0.0287317620650964*G0_1_1_1_0 + 0.0566426166426195*G0_1_1_1_1 - 0.031194484527819*G0_1_1_1_2 - 0.247914061247403*G0_1_1_1_3 - 0.0262690396023739*G0_1_1_1_4 + 0.169106942440282*G0_1_1_1_5 - 0.0172390572390578*G0_1_1_2_0 - 0.031194484527819*G0_1_1_2_1 + 0.220003206669881*G0_1_1_2_2 + 0.320153920153932*G0_1_1_2_3 + 0.0632098765432121*G0_1_1_2_4 - 0.0131345198011868*G0_1_1_2_5 - 0.0525380792047475*G0_1_1_3_0 - 0.247914061247403*G0_1_1_3_1 + 0.320153920153932*G0_1_1_3_2 + 0.630456950456973*G0_1_1_3_3 + 0.157614237614243*G0_1_1_3_4 + 0.131345198011869*G0_1_1_3_5 - 0.0205226871893545*G0_1_1_4_0 - 0.0262690396023739*G0_1_1_4_1 + 0.0632098765432121*G0_1_1_4_2 + 0.157614237614243*G0_1_1_4_3 + 0.0722398589065279*G0_1_1_4_4 + 0.0788071188071213*G0_1_1_4_5 - 0.0673144139810828*G0_1_1_5_0 + 0.169106942440282*G0_1_1_5_1 - 0.0131345198011868*G0_1_1_5_2 + 0.131345198011869*G0_1_1_5_3 + 0.0788071188071213*G0_1_1_5_4 + 0.604187910854597*G0_1_1_5_5; + A[32] = 0.00441718775052123*G0_1_1_0_0 - 0.000244508577841925*G0_1_1_0_1 - 0.00916973972529557*G0_1_1_0_2 - 0.00298754743199197*G0_1_1_0_3 - 0.00389075944631513*G0_1_1_0_4 + 0.00094062316284542*G0_1_1_0_5 - 0.000244508577841925*G0_1_1_1_0 + 0.00441718775052127*G0_1_1_1_1 - 0.00916973972529557*G0_1_1_1_2 - 0.00389075944631513*G0_1_1_1_3 - 0.00298754743199197*G0_1_1_1_4 + 0.000940623162845434*G0_1_1_1_5 - 0.00916973972529557*G0_1_1_2_0 - 0.00916973972529557*G0_1_1_2_1 + 0.168726952060291*G0_1_1_2_2 + 0.0375821709155055*G0_1_1_2_3 + 0.0375821709155055*G0_1_1_2_4 + 0.000903212014323184*G0_1_1_2_5 - 0.00298754743199197*G0_1_1_3_0 - 0.00389075944631513*G0_1_1_3_1 + 0.0375821709155055*G0_1_1_3_2 + 0.0239003794559358*G0_1_1_3_3 + 0.0119501897279679*G0_1_1_3_4 + 0.00416867083533765*G0_1_1_3_5 - 0.00389075944631513*G0_1_1_4_0 - 0.00298754743199197*G0_1_1_4_1 + 0.0375821709155055*G0_1_1_4_2 + 0.0119501897279679*G0_1_1_4_3 + 0.0239003794559358*G0_1_1_4_4 + 0.00416867083533764*G0_1_1_4_5 + 0.00094062316284542*G0_1_1_5_0 + 0.000940623162845434*G0_1_1_5_1 + 0.000903212014323184*G0_1_1_5_2 + 0.00416867083533765*G0_1_1_5_3 + 0.00416867083533764*G0_1_1_5_4 + 0.0158623269734387*G0_1_1_5_5; + A[25] = 0.0318999518999531*G0_0_0_0_0 - 0.00520763187429871*G0_0_0_0_1 - 0.00297899631232975*G0_0_0_0_2 - 0.00164181497514837*G0_0_0_0_3 + 0.0166233766233772*G0_0_0_0_4 + 0.0105820105820109*G0_0_0_0_5 - 0.00520763187429871*G0_0_0_1_0 + 0.182202982202989*G0_0_0_1_1 - 0.0108994708994713*G0_0_0_1_2 + 0.0514349847683199*G0_0_0_1_3 - 0.00228314894981571*G0_0_0_1_4 + 0.00468173801507162*G0_0_0_1_5 - 0.00297899631232975*G0_0_0_2_0 - 0.0108994708994713*G0_0_0_2_1 + 0.00247554914221591*G0_0_0_2_2 - 0.00947891614558313*G0_0_0_2_3 - 0.00699054032387388*G0_0_0_2_4 - 0.00556677890011243*G0_0_0_2_5 - 0.00164181497514837*G0_0_0_3_0 + 0.0514349847683199*G0_0_0_3_1 - 0.00947891614558313*G0_0_0_3_2 + 0.0368895302228648*G0_0_0_3_3 + 0.0078499278499281*G0_0_0_3_4 + 0.0144171877505216*G0_0_0_3_5 + 0.0166233766233772*G0_0_0_4_0 - 0.00228314894981571*G0_0_0_4_1 - 0.00699054032387389*G0_0_0_4_2 + 0.0078499278499281*G0_0_0_4_3 + 0.0423280423280436*G0_0_0_4_4 + 0.0156998556998562*G0_0_0_4_5 + 0.0105820105820109*G0_0_0_5_0 + 0.00468173801507162*G0_0_0_5_1 - 0.00556677890011243*G0_0_0_5_2 + 0.0144171877505216*G0_0_0_5_3 + 0.0156998556998562*G0_0_0_5_4 + 0.0194452461119135*G0_0_0_5_5 - 0.000814494147827487*G0_0_1_0_0 - 0.00634920634920656*G0_0_1_0_1 + 0.00109988776655447*G0_0_1_0_2 - 0.00365560365560378*G0_0_1_0_3 - 0.00168029501362839*G0_0_1_0_4 - 0.00218053551386894*G0_0_1_0_5 - 0.00634920634920656*G0_0_1_1_0 + 0.21269841269842*G0_0_1_1_1 - 0.0139169472502811*G0_0_1_1_2 + 0.0616321949655304*G0_0_1_1_3 + 0.0016033349366683*G0_0_1_1_4 + 0.0226390893057569*G0_0_1_1_5 + 0.00109988776655447*G0_0_1_2_0 - 0.0139169472502811*G0_0_1_2_1 + 0.00221260221260228*G0_0_1_2_2 - 0.00962000962000994*G0_0_1_2_3 - 0.00111592111592116*G0_0_1_2_4 - 0.00493827160493846*G0_0_1_2_5 - 0.00365560365560378*G0_0_1_3_0 + 0.0616321949655304*G0_0_1_3_1 - 0.00962000962000994*G0_0_1_3_2 + 0.0389931056597736*G0_0_1_3_3 + 0.00410453743787091*G0_0_1_3_4 + 0.0171877505210845*G0_0_1_3_5 - 0.00168029501362839*G0_0_1_4_0 + 0.00160333493666831*G0_0_1_4_1 - 0.00111592111592116*G0_0_1_4_2 + 0.00410453743787091*G0_0_1_4_3 - 0.000410453743787132*G0_0_1_4_4 + 0.00666987333654024*G0_0_1_4_5 - 0.00218053551386894*G0_0_1_5_0 + 0.0226390893057569*G0_0_1_5_1 - 0.00493827160493846*G0_0_1_5_2 + 0.0171877505210845*G0_0_1_5_3 + 0.00666987333654024*G0_0_1_5_4 + 0.0297578964245642*G0_0_1_5_5; + A[61] = 0.0002629469296136*G0_0_0_0_0 + 0.00301747635080977*G0_0_0_0_1 - 0.00407888407888421*G0_0_0_0_2 - 0.000628507295173977*G0_0_0_0_3 - 0.00587461920795272*G0_0_0_0_4 + 0.000141093474426812*G0_0_0_0_5 + 0.00301747635080977*G0_0_0_1_0 - 0.0304954304954314*G0_0_0_1_1 + 0.00114157447490785*G0_0_0_1_2 - 0.0179573512906852*G0_0_0_1_3 - 0.00388648388648401*G0_0_0_1_4 - 0.0101972101972105*G0_0_0_1_5 - 0.00407888407888421*G0_0_0_2_0 + 0.00114157447490785*G0_0_0_2_1 + 0.0327144460477804*G0_0_0_2_2 + 0.0127625460958799*G0_0_0_2_3 + 0.0183036716370056*G0_0_0_2_4 + 0.00201378868045542*G0_0_0_2_5 - 0.000628507295173977*G0_0_0_3_0 - 0.0179573512906852*G0_0_0_3_1 + 0.0127625460958799*G0_0_0_3_2 - 0.0103126503126508*G0_0_0_3_3 + 0.00902998236331598*G0_0_0_3_4 - 0.00277056277056288*G0_0_0_3_5 - 0.00587461920795272*G0_0_0_4_0 - 0.00388648388648401*G0_0_0_4_1 + 0.0183036716370056*G0_0_0_4_2 + 0.00902998236331598*G0_0_0_4_3 + 0.0427384960718308*G0_0_0_4_4 + 0.00374539041205721*G0_0_0_4_5 + 0.000141093474426812*G0_0_0_5_0 - 0.0101972101972105*G0_0_0_5_1 + 0.00201378868045542*G0_0_0_5_2 - 0.00277056277056288*G0_0_0_5_3 + 0.00374539041205721*G0_0_0_5_4 - 0.00210357543690882*G0_0_0_5_5 - 0.0022126022126023*G0_1_0_0_0 + 0.0139169472502811*G0_1_0_0_1 - 0.00109988776655447*G0_1_0_0_2 + 0.00493827160493844*G0_1_0_0_3 + 0.00111592111592116*G0_1_0_0_4 + 0.00962000962000997*G0_1_0_0_5 + 0.0139169472502811*G0_1_0_1_0 - 0.212698412698421*G0_1_0_1_1 + 0.0063492063492066*G0_1_0_1_2 - 0.0226390893057569*G0_1_0_1_3 - 0.0016033349366683*G0_1_0_1_4 - 0.0616321949655308*G0_1_0_1_5 - 0.00109988776655447*G0_1_0_2_0 + 0.0063492063492066*G0_1_0_2_1 + 0.000814494147827494*G0_1_0_2_2 + 0.00218053551386894*G0_1_0_2_3 + 0.0016802950136284*G0_1_0_2_4 + 0.00365560365560379*G0_1_0_2_5 + 0.00493827160493844*G0_1_0_3_0 - 0.0226390893057569*G0_1_0_3_1 + 0.00218053551386894*G0_1_0_3_2 - 0.0297578964245642*G0_1_0_3_3 - 0.00666987333654023*G0_1_0_3_4 - 0.0171877505210845*G0_1_0_3_5 + 0.00111592111592116*G0_1_0_4_0 - 0.0016033349366683*G0_1_0_4_1 + 0.0016802950136284*G0_1_0_4_2 - 0.00666987333654023*G0_1_0_4_3 + 0.000410453743787149*G0_1_0_4_4 - 0.00410453743787091*G0_1_0_4_5 + 0.00962000962000997*G0_1_0_5_0 - 0.0616321949655308*G0_1_0_5_1 + 0.00365560365560379*G0_1_0_5_2 - 0.0171877505210845*G0_1_0_5_3 - 0.00410453743787091*G0_1_0_5_4 - 0.0389931056597738*G0_1_0_5_5; + A[154] = A[70] - 0.000846560846561003*G0_0_1_0_0 - 0.00715728715728742*G0_0_1_0_1 - 0.00142376142376149*G0_0_1_0_2 + 0.00831168831168858*G0_0_1_0_3 + 0.00461760461760478*G0_0_1_0_4 - 0.011544011544012*G0_0_1_0_5 - 0.00715728715728742*G0_0_1_1_0 - 0.0988936988937028*G0_0_1_1_1 - 0.00715728715728741*G0_0_1_1_2 + 0.0484848484848502*G0_0_1_1_3 + 0.00354016354016369*G0_0_1_1_4 + 0.0484848484848501*G0_0_1_1_5 - 0.00142376142376149*G0_0_1_2_0 - 0.0071572871572874*G0_0_1_2_1 - 0.000846560846560787*G0_0_1_2_2 - 0.011544011544012*G0_0_1_2_3 + 0.00461760461760484*G0_0_1_2_4 + 0.00831168831168855*G0_0_1_2_5 + 0.00831168831168857*G0_0_1_3_0 + 0.0484848484848502*G0_0_1_3_1 - 0.011544011544012*G0_0_1_3_2 + 0.0455603655603674*G0_0_1_3_3 - 0.0237037037037045*G0_0_1_3_4 - 0.0332467532467543*G0_0_1_3_5 + 0.00461760461760478*G0_0_1_4_0 + 0.00354016354016369*G0_0_1_4_1 + 0.00461760461760484*G0_0_1_4_2 - 0.0237037037037045*G0_0_1_4_3 - 0.0043097643097641*G0_0_1_4_4 - 0.0237037037037045*G0_0_1_4_5 - 0.011544011544012*G0_0_1_5_0 + 0.0484848484848501*G0_0_1_5_1 + 0.00831168831168855*G0_0_1_5_2 - 0.0332467532467543*G0_0_1_5_3 - 0.0237037037037045*G0_0_1_5_4 + 0.045560365560368*G0_0_1_5_5 + 0.000846560846561002*G0_1_0_0_0 + 0.00715728715728742*G0_1_0_0_1 + 0.00142376142376149*G0_1_0_0_2 - 0.00831168831168857*G0_1_0_0_3 - 0.00461760461760478*G0_1_0_0_4 + 0.011544011544012*G0_1_0_0_5 + 0.00715728715728742*G0_1_0_1_0 + 0.0988936988937028*G0_1_0_1_1 + 0.00715728715728741*G0_1_0_1_2 - 0.0484848484848502*G0_1_0_1_3 - 0.00354016354016369*G0_1_0_1_4 - 0.0484848484848502*G0_1_0_1_5 + 0.00142376142376149*G0_1_0_2_0 + 0.00715728715728741*G0_1_0_2_1 + 0.000846560846560787*G0_1_0_2_2 + 0.011544011544012*G0_1_0_2_3 - 0.00461760461760484*G0_1_0_2_4 - 0.00831168831168855*G0_1_0_2_5 - 0.00831168831168857*G0_1_0_3_0 - 0.0484848484848502*G0_1_0_3_1 + 0.011544011544012*G0_1_0_3_2 - 0.0455603655603674*G0_1_0_3_3 + 0.0237037037037045*G0_1_0_3_4 + 0.0332467532467542*G0_1_0_3_5 - 0.00461760461760478*G0_1_0_4_0 - 0.00354016354016369*G0_1_0_4_1 - 0.00461760461760484*G0_1_0_4_2 + 0.0237037037037045*G0_1_0_4_3 + 0.0043097643097641*G0_1_0_4_4 + 0.0237037037037045*G0_1_0_4_5 + 0.011544011544012*G0_1_0_5_0 - 0.0484848484848501*G0_1_0_5_1 - 0.00831168831168855*G0_1_0_5_2 + 0.0332467532467543*G0_1_0_5_3 + 0.0237037037037045*G0_1_0_5_4 - 0.045560365560368*G0_1_0_5_5; + A[106] = -0.00246913580246924*G0_0_0_0_0 - 0.000298220298220291*G0_0_0_0_1 - 0.0011287477954145*G0_0_0_0_2 + 0.00119288119288124*G0_0_0_0_3 - 0.0030014430014431*G0_0_0_0_4 + 0.00185986852653527*G0_0_0_0_5 - 0.000298220298220291*G0_0_0_1_0 - 0.00311046977713685*G0_0_0_1_1 - 0.000346320346320352*G0_0_0_1_2 - 0.00148789482122821*G0_0_0_1_3 + 0.000243706910373591*G0_0_0_1_4 - 0.000115440115440203*G0_0_0_1_5 - 0.0011287477954145*G0_0_0_2_0 - 0.000346320346320352*G0_0_0_2_1 - 0.00942119608786303*G0_0_0_2_2 + 0.00406605739939086*G0_0_0_2_3 + 0.00776014109347471*G0_0_0_2_4 + 0.000551547218213905*G0_0_0_2_5 + 0.00119288119288124*G0_0_0_3_0 - 0.00148789482122821*G0_0_0_3_1 + 0.00406605739939086*G0_0_0_3_2 - 0.00220618887285565*G0_0_0_3_3 - 0.00287317620650965*G0_0_0_3_4 - 0.00348885682219028*G0_0_0_3_5 - 0.0030014430014431*G0_0_0_4_0 + 0.00024370691037359*G0_0_0_4_1 + 0.00776014109347471*G0_0_0_4_2 - 0.00287317620650965*G0_0_0_4_3 + 0.058438351771687*G0_0_0_4_4 - 0.00159050825717498*G0_0_0_4_5 + 0.00185986852653527*G0_0_0_5_0 - 0.000115440115440203*G0_0_0_5_1 + 0.000551547218213905*G0_0_0_5_2 - 0.00348885682219028*G0_0_0_5_3 - 0.00159050825717499*G0_0_0_5_4 - 0.00159050825717502*G0_0_0_5_5 + 0.00695206028539392*G0_1_0_0_0 + 4.81000481000647e-05*G0_1_0_0_1 + 0.000641333974667333*G0_1_0_0_3 - 0.0107615840949178*G0_1_0_0_4 - 0.00220618887285559*G0_1_0_0_5 + 4.81000481000647e-05*G0_1_0_1_0 - 4.81000481000407e-05*G0_1_0_1_2 - 0.00137245470578811*G0_1_0_1_3 + 0.00137245470578801*G0_1_0_1_5 - 4.81000481000405e-05*G0_1_0_2_1 - 0.00695206028539381*G0_1_0_2_2 + 0.0022061888728556*G0_1_0_2_3 + 0.0107615840949178*G0_1_0_2_4 - 0.000641333974667333*G0_1_0_2_5 + 0.000641333974667333*G0_1_0_3_0 - 0.00137245470578811*G0_1_0_3_1 + 0.0022061888728556*G0_1_0_3_2 - 0.000615680615680659*G0_1_0_3_3 - 0.00128266794933465*G0_1_0_3_4 - 0.0107615840949178*G0_1_0_4_0 + 0.0107615840949178*G0_1_0_4_2 - 0.00128266794933465*G0_1_0_4_3 + 0.00128266794933468*G0_1_0_4_5 - 0.00220618887285559*G0_1_0_5_0 + 0.00137245470578801*G0_1_0_5_1 - 0.000641333974667333*G0_1_0_5_2 + 0.00128266794933468*G0_1_0_5_4 + 0.000615680615680605*G0_1_0_5_5; + A[60] = A[106] - 0.00064133397466745*G0_0_0_0_0 + 0.00078242744909415*G0_0_0_0_2 - 0.000949174282507639*G0_0_0_0_3 + 0.00151354818021488*G0_0_0_0_4 - 0.00197530864197544*G0_0_0_0_5 + 0.000641333974667637*G0_0_0_1_1 - 0.000782427449094153*G0_0_0_1_2 - 0.0015135481802149*G0_0_0_1_3 + 0.000949174282507645*G0_0_0_1_4 + 0.00197530864197546*G0_0_0_1_5 + 0.00078242744909415*G0_0_0_2_0 - 0.000782427449094153*G0_0_0_2_1 + 0.00369408369408386*G0_0_0_2_3 - 0.00369408369408384*G0_0_0_2_4 - 0.000949174282507639*G0_0_0_3_0 - 0.0015135481802149*G0_0_0_3_1 + 0.00369408369408386*G0_0_0_3_2 + 0.0606445406445427*G0_0_0_3_3 + 0.00189834856501531*G0_0_0_3_5 + 0.00151354818021488*G0_0_0_4_0 + 0.000949174282507645*G0_0_0_4_1 - 0.00369408369408384*G0_0_0_4_2 - 0.0606445406445426*G0_0_0_4_4 - 0.00189834856501529*G0_0_0_4_5 - 0.00197530864197544*G0_0_0_5_0 + 0.00197530864197546*G0_0_0_5_1 + 0.00189834856501531*G0_0_0_5_3 - 0.00189834856501529*G0_0_0_5_4 - 0.00311046977713669*G0_0_1_0_0 - 0.000298220298220297*G0_0_1_0_1 - 0.000346320346320343*G0_0_1_0_2 + 0.000243706910373602*G0_0_1_0_3 - 0.00148789482122821*G0_0_1_0_4 - 0.000115440115440167*G0_0_1_0_5 - 0.000298220298220297*G0_0_1_1_0 - 0.0024691358024692*G0_0_1_1_1 - 0.0011287477954145*G0_0_1_1_2 - 0.0030014430014431*G0_0_1_1_3 + 0.00119288119288124*G0_0_1_1_4 + 0.00185986852653526*G0_0_1_1_5 - 0.000346320346320343*G0_0_1_2_0 - 0.0011287477954145*G0_0_1_2_1 - 0.00942119608786319*G0_0_1_2_2 + 0.00776014109347469*G0_0_1_2_3 + 0.00406605739939082*G0_0_1_2_4 + 0.000551547218213904*G0_0_1_2_5 + 0.000243706910373602*G0_0_1_3_0 - 0.0030014430014431*G0_0_1_3_1 + 0.00776014109347469*G0_0_1_3_2 + 0.058438351771687*G0_0_1_3_3 - 0.00287317620650966*G0_0_1_3_4 - 0.00159050825717498*G0_0_1_3_5 - 0.00148789482122821*G0_0_1_4_0 + 0.00119288119288124*G0_0_1_4_1 + 0.00406605739939082*G0_0_1_4_2 - 0.00287317620650966*G0_0_1_4_3 - 0.0022061888728557*G0_0_1_4_4 - 0.00348885682219028*G0_0_1_4_5 - 0.000115440115440167*G0_0_1_5_0 + 0.00185986852653526*G0_0_1_5_1 + 0.000551547218213904*G0_0_1_5_2 - 0.00159050825717498*G0_0_1_5_3 - 0.00348885682219028*G0_0_1_5_4 - 0.00159050825717503*G0_0_1_5_5 - 0.0100625300625307*G0_1_0_0_0 - 0.000394420394420408*G0_1_0_0_1 - 0.000298220298220299*G0_1_0_0_2 - 0.000397627064293738*G0_1_0_0_3 + 0.0106461439794776*G0_1_0_0_4 + 0.000718294051627327*G0_1_0_0_5 - 0.000394420394420408*G0_1_0_1_0 - 0.00942119608786284*G0_1_0_1_1 - 0.00108064774731446*G0_1_0_1_2 + 0.00913259579926278*G0_1_0_1_3 + 0.000551547218213912*G0_1_0_1_4 + 0.00269360269360286*G0_1_0_1_5 - 0.000298220298220299*G0_1_0_2_0 - 0.00108064774731446*G0_1_0_2_1 + 0.00448292448292463*G0_1_0_2_2 - 0.00520763187429867*G0_1_0_2_3 - 0.00890171556838252*G0_1_0_2_4 + 0.00183421516754857*G0_1_0_2_5 - 0.000397627064293739*G0_1_0_3_0 + 0.00913259579926278*G0_1_0_3_1 - 0.00520763187429867*G0_1_0_3_2 + 0.0590540323873678*G0_1_0_3_3 - 0.000307840307840327*G0_1_0_3_4 - 0.00287317620650963*G0_1_0_3_5 + 0.0106461439794776*G0_1_0_4_0 + 0.000551547218213912*G0_1_0_4_1 - 0.00890171556838252*G0_1_0_4_2 - 0.000307840307840328*G0_1_0_4_3 - 0.00159050825717513*G0_1_0_4_4 - 0.00477152477152497*G0_1_0_4_5 + 0.000718294051627328*G0_1_0_5_0 + 0.00269360269360286*G0_1_0_5_1 + 0.00183421516754857*G0_1_0_5_2 - 0.00287317620650963*G0_1_0_5_3 - 0.00477152477152497*G0_1_0_5_4 - 0.00282186948853623*G0_1_0_5_5 - 0.00311046977713677*G0_1_1_0_0 - 0.000346320346320337*G0_1_1_0_1 - 0.000298220298220301*G0_1_1_0_2 + 0.000243706910373598*G0_1_1_0_3 - 0.000115440115440142*G0_1_1_0_4 - 0.00148789482122827*G0_1_1_0_5 - 0.000346320346320337*G0_1_1_1_0 - 0.00942119608786312*G0_1_1_1_1 - 0.0011287477954145*G0_1_1_1_2 + 0.00776014109347466*G0_1_1_1_3 + 0.000551547218213908*G0_1_1_1_4 + 0.00406605739939085*G0_1_1_1_5 - 0.000298220298220301*G0_1_1_2_0 - 0.0011287477954145*G0_1_1_2_1 - 0.00246913580246926*G0_1_1_2_2 - 0.00300144300144309*G0_1_1_2_3 + 0.00185986852653525*G0_1_1_2_4 + 0.00119288119288124*G0_1_1_2_5 + 0.000243706910373598*G0_1_1_3_0 + 0.00776014109347466*G0_1_1_3_1 - 0.00300144300144309*G0_1_1_3_2 + 0.0584383517716871*G0_1_1_3_3 - 0.00159050825717499*G0_1_1_3_4 - 0.00287317620650965*G0_1_1_3_5 - 0.000115440115440142*G0_1_1_4_0 + 0.000551547218213908*G0_1_1_4_1 + 0.00185986852653525*G0_1_1_4_2 - 0.00159050825717499*G0_1_1_4_3 - 0.00159050825717504*G0_1_1_4_4 - 0.00348885682219029*G0_1_1_4_5 - 0.00148789482122827*G0_1_1_5_0 + 0.00406605739939085*G0_1_1_5_1 + 0.00119288119288124*G0_1_1_5_2 - 0.00287317620650964*G0_1_1_5_3 - 0.00348885682219029*G0_1_1_5_4 - 0.00220618887285567*G0_1_1_5_5; + A[4] = A[60] + 0.00137245470578808*G0_0_1_0_4 - 0.00137245470578809*G0_0_1_0_5 - 0.00695206028539391*G0_0_1_1_1 + 0.0107615840949178*G0_0_1_1_3 - 0.000641333974667331*G0_0_1_1_4 + 0.00220618887285561*G0_0_1_1_5 + 0.00695206028539394*G0_0_1_2_2 - 0.0107615840949178*G0_0_1_2_3 - 0.00220618887285557*G0_0_1_2_4 + 0.000641333974667333*G0_0_1_2_5 + 0.0107615840949178*G0_0_1_3_1 - 0.0107615840949178*G0_0_1_3_2 + 0.00128266794933467*G0_0_1_3_4 - 0.00128266794933466*G0_0_1_3_5 + 0.00137245470578808*G0_0_1_4_0 - 0.000641333974667331*G0_0_1_4_1 - 0.00220618887285557*G0_0_1_4_2 + 0.00128266794933467*G0_0_1_4_3 + 0.000615680615680646*G0_0_1_4_4 - 0.00137245470578809*G0_0_1_5_0 + 0.00220618887285561*G0_0_1_5_1 + 0.000641333974667332*G0_0_1_5_2 - 0.00128266794933466*G0_0_1_5_3 - 0.000615680615680609*G0_0_1_5_5 - 0.00137245470578808*G0_1_0_0_4 + 0.00137245470578809*G0_1_0_0_5 + 0.00695206028539391*G0_1_0_1_1 - 0.0107615840949178*G0_1_0_1_3 + 0.000641333974667331*G0_1_0_1_4 - 0.00220618887285561*G0_1_0_1_5 - 0.00695206028539394*G0_1_0_2_2 + 0.0107615840949178*G0_1_0_2_3 + 0.00220618887285558*G0_1_0_2_4 - 0.000641333974667333*G0_1_0_2_5 - 0.0107615840949178*G0_1_0_3_1 + 0.0107615840949178*G0_1_0_3_2 - 0.00128266794933467*G0_1_0_3_4 + 0.00128266794933466*G0_1_0_3_5 - 0.00137245470578808*G0_1_0_4_0 + 0.000641333974667331*G0_1_0_4_1 + 0.00220618887285558*G0_1_0_4_2 - 0.00128266794933467*G0_1_0_4_3 - 0.000615680615680649*G0_1_0_4_4 + 0.00137245470578809*G0_1_0_5_0 - 0.00220618887285561*G0_1_0_5_1 - 0.000641333974667333*G0_1_0_5_2 + 0.00128266794933466*G0_1_0_5_3 + 0.000615680615680608*G0_1_0_5_5; + A[15] = 0.0161696328363001*G0_0_0_0_0 - 0.000518678852012202*G0_0_0_0_1 - 0.00119742397520179*G0_0_0_0_2 - 3.95489284378203e-05*G0_0_0_0_3 + 0.00540430762653003*G0_0_0_0_4 + 0.000816631927743074*G0_0_0_0_5 - 0.000518678852012203*G0_0_0_1_0 + 0.0161696328363001*G0_0_0_1_1 - 0.00119742397520179*G0_0_0_1_2 + 0.00540430762653003*G0_0_0_1_3 - 3.95489284378203e-05*G0_0_0_1_4 + 0.000816631927743076*G0_0_0_1_5 - 0.00119742397520179*G0_0_0_2_0 - 0.00119742397520179*G0_0_0_2_1 - 1.76366843033533e-05*G0_0_0_2_2 - 0.000654160654160679*G0_0_0_2_3 - 0.000654160654160678*G0_0_0_2_4 - 0.00044145155256268*G0_0_0_2_5 - 3.95489284378203e-05*G0_0_0_3_0 + 0.00540430762653003*G0_0_0_3_1 - 0.000654160654160678*G0_0_0_3_2 + 0.0034461012238791*G0_0_0_3_3 + 0.000158195713751273*G0_0_0_3_4 + 0.000962000962000998*G0_0_0_3_5 + 0.00540430762653003*G0_0_0_4_0 - 3.95489284378203e-05*G0_0_0_4_1 - 0.000654160654160678*G0_0_0_4_2 + 0.000158195713751273*G0_0_0_4_3 + 0.0034461012238791*G0_0_0_4_4 + 0.000962000962000997*G0_0_0_4_5 + 0.000816631927743073*G0_0_0_5_0 + 0.000816631927743076*G0_0_0_5_1 - 0.00044145155256268*G0_0_0_5_2 + 0.000962000962000998*G0_0_0_5_3 + 0.000962000962000997*G0_0_0_5_4 - 0.00216343327454445*G0_0_0_5_5 + 0.0161696328363001*G0_0_1_0_0 - 0.000518678852012202*G0_0_1_0_1 - 0.00119742397520179*G0_0_1_0_2 - 3.95489284378197e-05*G0_0_1_0_3 + 0.00540430762653003*G0_0_1_0_4 + 0.000816631927743073*G0_0_1_0_5 - 0.000518678852012202*G0_0_1_1_0 + 0.0161696328363*G0_0_1_1_1 - 0.00119742397520179*G0_0_1_1_2 + 0.00540430762653002*G0_0_1_1_3 - 3.95489284378206e-05*G0_0_1_1_4 + 0.000816631927743075*G0_0_1_1_5 - 0.00119742397520179*G0_0_1_2_0 - 0.00119742397520179*G0_0_1_2_1 - 1.76366843033629e-05*G0_0_1_2_2 - 0.000654160654160677*G0_0_1_2_3 - 0.000654160654160679*G0_0_1_2_4 - 0.00044145155256268*G0_0_1_2_5 - 3.95489284378196e-05*G0_0_1_3_0 + 0.00540430762653002*G0_0_1_3_1 - 0.000654160654160677*G0_0_1_3_2 + 0.00344610122387909*G0_0_1_3_3 + 0.000158195713751272*G0_0_1_3_4 + 0.000962000962000996*G0_0_1_3_5 + 0.00540430762653003*G0_0_1_4_0 - 3.95489284378206e-05*G0_0_1_4_1 - 0.000654160654160679*G0_0_1_4_2 + 0.000158195713751273*G0_0_1_4_3 + 0.0034461012238791*G0_0_1_4_4 + 0.000962000962000997*G0_0_1_4_5 + 0.000816631927743073*G0_0_1_5_0 + 0.000816631927743075*G0_0_1_5_1 - 0.00044145155256268*G0_0_1_5_2 + 0.000962000962000996*G0_0_1_5_3 + 0.000962000962000997*G0_0_1_5_4 - 0.00216343327454445*G0_0_1_5_5; + A[37] = -0.000814494147827547*G0_1_0_0_0 + 0.00109988776655447*G0_1_0_0_1 - 0.00634920634920652*G0_1_0_0_2 - 0.00365560365560377*G0_1_0_0_3 - 0.00218053551386892*G0_1_0_0_4 - 0.00168029501362843*G0_1_0_0_5 + 0.00109988776655447*G0_1_0_1_0 + 0.00221260221260234*G0_1_0_1_1 - 0.013916947250281*G0_1_0_1_2 - 0.00962000962000994*G0_1_0_1_3 - 0.00493827160493844*G0_1_0_1_4 - 0.00111592111592113*G0_1_0_1_5 - 0.00634920634920652*G0_1_0_2_0 - 0.013916947250281*G0_1_0_2_1 + 0.212698412698419*G0_1_0_2_2 + 0.0616321949655303*G0_1_0_2_3 + 0.0226390893057566*G0_1_0_2_4 + 0.00160333493666835*G0_1_0_2_5 - 0.00365560365560377*G0_1_0_3_0 - 0.00962000962000994*G0_1_0_3_1 + 0.0616321949655303*G0_1_0_3_2 + 0.0389931056597737*G0_1_0_3_3 + 0.0171877505210845*G0_1_0_3_4 + 0.00410453743787094*G0_1_0_3_5 - 0.00218053551386892*G0_1_0_4_0 - 0.00493827160493844*G0_1_0_4_1 + 0.0226390893057566*G0_1_0_4_2 + 0.0171877505210845*G0_1_0_4_3 + 0.0297578964245642*G0_1_0_4_4 + 0.00666987333654025*G0_1_0_4_5 - 0.00168029501362843*G0_1_0_5_0 - 0.00111592111592113*G0_1_0_5_1 + 0.00160333493666835*G0_1_0_5_2 + 0.00410453743787094*G0_1_0_5_3 + 0.00666987333654025*G0_1_0_5_4 - 0.000410453743787087*G0_1_0_5_5 + 0.031899951899953*G0_1_1_0_0 - 0.00297899631232975*G0_1_1_0_1 - 0.00520763187429868*G0_1_1_0_2 - 0.00164181497514836*G0_1_1_0_3 + 0.0105820105820109*G0_1_1_0_4 + 0.0166233766233772*G0_1_1_0_5 - 0.00297899631232975*G0_1_1_1_0 + 0.00247554914221593*G0_1_1_1_1 - 0.0108994708994712*G0_1_1_1_2 - 0.00947891614558313*G0_1_1_1_3 - 0.00556677890011241*G0_1_1_1_4 - 0.00699054032387388*G0_1_1_1_5 - 0.00520763187429868*G0_1_1_2_0 - 0.0108994708994712*G0_1_1_2_1 + 0.182202982202988*G0_1_1_2_2 + 0.0514349847683198*G0_1_1_2_3 + 0.00468173801507146*G0_1_1_2_4 - 0.00228314894981566*G0_1_1_2_5 - 0.00164181497514836*G0_1_1_3_0 - 0.00947891614558313*G0_1_1_3_1 + 0.0514349847683198*G0_1_1_3_2 + 0.0368895302228649*G0_1_1_3_3 + 0.0144171877505216*G0_1_1_3_4 + 0.00784992784992812*G0_1_1_3_5 + 0.0105820105820109*G0_1_1_4_0 - 0.00556677890011241*G0_1_1_4_1 + 0.00468173801507145*G0_1_1_4_2 + 0.0144171877505216*G0_1_1_4_3 + 0.0194452461119133*G0_1_1_4_4 + 0.0156998556998562*G0_1_1_4_5 + 0.0166233766233772*G0_1_1_5_0 - 0.00699054032387388*G0_1_1_5_1 - 0.00228314894981566*G0_1_1_5_2 + 0.00784992784992812*G0_1_1_5_3 + 0.0156998556998562*G0_1_1_5_4 + 0.0423280423280438*G0_1_1_5_5; + A[91] = A[21] + 0.020573993907328*G0_0_1_0_0 + 0.000269360269360285*G0_0_1_0_1 - 0.000641333974667332*G0_0_1_0_2 + 0.000307840307840319*G0_0_1_0_3 - 0.000974827641494325*G0_0_1_0_4 - 0.00020522687189352*G0_0_1_0_5 + 0.000269360269360285*G0_0_1_1_0 - 0.000457484901929353*G0_0_1_1_2 + 0.00160761049649942*G0_0_1_1_3 + 0.000188124632569078*G0_0_1_1_4 - 0.00160761049649948*G0_0_1_1_5 - 0.000641333974667332*G0_0_1_2_0 - 0.000457484901929353*G0_0_1_2_1 - 0.00256533589866934*G0_0_1_2_2 + 0.000530169419058313*G0_0_1_2_3 + 0.00372828817273273*G0_0_1_2_4 - 0.000735396290951875*G0_0_1_2_5 + 0.000307840307840319*G0_0_1_3_0 + 0.00160761049649942*G0_0_1_3_1 + 0.000530169419058313*G0_0_1_3_2 + 0.00164181497514833*G0_0_1_3_3 - 0.000991929880818796*G0_0_1_3_4 + 0.000855111966223105*G0_0_1_3_5 - 0.000974827641494325*G0_0_1_4_0 + 0.000188124632569078*G0_0_1_4_1 + 0.00372828817273273*G0_0_1_4_2 - 0.000991929880818796*G0_0_1_4_3 - 0.0222329111218007*G0_0_1_4_4 + 0.0010945433167656*G0_0_1_4_5 - 0.00020522687189352*G0_0_1_5_0 - 0.00160761049649948*G0_0_1_5_1 - 0.000735396290951875*G0_0_1_5_2 + 0.000855111966223106*G0_0_1_5_3 + 0.0010945433167656*G0_0_1_5_4 - 0.00335203890759458*G0_0_1_5_5 - 0.020573993907328*G0_1_0_0_0 - 0.000269360269360285*G0_1_0_0_1 + 0.000641333974667331*G0_1_0_0_2 - 0.000307840307840319*G0_1_0_0_3 + 0.000974827641494327*G0_1_0_0_4 + 0.000205226871893521*G0_1_0_0_5 - 0.000269360269360285*G0_1_0_1_0 + 0.000457484901929353*G0_1_0_1_2 - 0.00160761049649942*G0_1_0_1_3 - 0.000188124632569078*G0_1_0_1_4 + 0.00160761049649948*G0_1_0_1_5 + 0.000641333974667332*G0_1_0_2_0 + 0.000457484901929353*G0_1_0_2_1 + 0.00256533589866934*G0_1_0_2_2 - 0.000530169419058313*G0_1_0_2_3 - 0.00372828817273273*G0_1_0_2_4 + 0.000735396290951875*G0_1_0_2_5 - 0.000307840307840319*G0_1_0_3_0 - 0.00160761049649942*G0_1_0_3_1 - 0.000530169419058313*G0_1_0_3_2 - 0.00164181497514834*G0_1_0_3_3 + 0.000991929880818795*G0_1_0_3_4 - 0.000855111966223106*G0_1_0_3_5 + 0.000974827641494327*G0_1_0_4_0 - 0.000188124632569078*G0_1_0_4_1 - 0.00372828817273273*G0_1_0_4_2 + 0.000991929880818796*G0_1_0_4_3 + 0.0222329111218007*G0_1_0_4_4 - 0.0010945433167656*G0_1_0_4_5 + 0.000205226871893521*G0_1_0_5_0 + 0.00160761049649948*G0_1_0_5_1 + 0.000735396290951875*G0_1_0_5_2 - 0.000855111966223106*G0_1_0_5_3 - 0.0010945433167656*G0_1_0_5_4 + 0.00335203890759458*G0_1_0_5_5; + A[109] = A[70] + 0.00877344877344915*G0_0_0_0_0 + 0.00211640211640218*G0_0_0_0_1 - 0.00784992784992816*G0_0_0_0_2 - 0.0041558441558443*G0_0_0_0_3 - 0.0207792207792215*G0_0_0_0_4 + 0.0138528138528142*G0_0_0_0_5 + 0.00211640211640218*G0_0_0_1_0 + 0.0338624338624349*G0_0_0_1_1 - 0.00731120731120768*G0_0_0_1_2 - 0.0187782587782595*G0_0_0_1_3 - 0.00769600769600796*G0_0_0_1_4 - 0.0127753727753731*G0_0_0_1_5 - 0.00784992784992816*G0_0_0_2_0 - 0.00731120731120768*G0_0_0_2_1 - 0.169927849927854*G0_0_0_2_2 + 0.0438672438672458*G0_0_0_2_3 + 0.0444829244829262*G0_0_0_2_4 + 0.00954304954304986*G0_0_0_2_5 - 0.00415584415584429*G0_0_0_3_0 - 0.0187782587782595*G0_0_0_3_1 + 0.0438672438672458*G0_0_0_3_2 + 0.199788359788368*G0_0_0_3_3 + 0.0237037037037046*G0_0_0_3_4 - 0.0107744107744111*G0_0_0_3_5 - 0.0207792207792215*G0_0_0_4_0 - 0.00769600769600795*G0_0_0_4_1 + 0.0444829244829262*G0_0_0_4_2 + 0.0237037037037046*G0_0_0_4_3 + 0.234882154882163*G0_0_0_4_4 - 0.00369408369408381*G0_0_0_4_5 + 0.0138528138528142*G0_0_0_5_0 - 0.0127753727753731*G0_0_0_5_1 + 0.00954304954304986*G0_0_0_5_2 - 0.0107744107744111*G0_0_0_5_3 - 0.00369408369408382*G0_0_0_5_4 - 0.0520250120250138*G0_0_0_5_5 + 0.00184704184704186*G0_0_1_0_1 - 0.00184704184704195*G0_0_1_0_2 - 0.00954304954304993*G0_0_1_0_4 + 0.00954304954304977*G0_0_1_0_5 + 0.00184704184704186*G0_0_1_1_0 + 0.0403270803270821*G0_0_1_1_1 + 0.0120057720057726*G0_0_1_1_3 - 0.00923520923520958*G0_0_1_1_4 - 0.00769600769600767*G0_0_1_1_5 - 0.00184704184704195*G0_0_1_2_0 - 0.0403270803270811*G0_0_1_2_2 - 0.0120057720057723*G0_0_1_2_3 + 0.00769600769600817*G0_0_1_2_4 + 0.00923520923520952*G0_0_1_2_5 + 0.0120057720057726*G0_0_1_3_1 - 0.0120057720057723*G0_0_1_3_2 + 0.0184704184704193*G0_0_1_3_4 - 0.0184704184704189*G0_0_1_3_5 - 0.00954304954304993*G0_0_1_4_0 - 0.00923520923520958*G0_0_1_4_1 + 0.00769600769600818*G0_0_1_4_2 + 0.0184704184704193*G0_0_1_4_3 + 0.100971620971625*G0_0_1_4_4 + 0.00954304954304977*G0_0_1_5_0 - 0.00769600769600767*G0_0_1_5_1 + 0.00923520923520952*G0_0_1_5_2 - 0.0184704184704189*G0_0_1_5_3 - 0.100971620971624*G0_0_1_5_5 + 0.00758056758056787*G0_1_0_0_1 - 0.00758056758056787*G0_1_0_0_2 - 0.0257046657046667*G0_1_0_0_4 + 0.0257046657046664*G0_1_0_0_5 + 0.00758056758056787*G0_1_0_1_0 + 0.138374218374224*G0_1_0_1_1 - 0.0480230880230897*G0_1_0_1_3 - 0.00446368446368463*G0_1_0_1_4 - 0.0515632515632532*G0_1_0_1_5 - 0.00758056758056787*G0_1_0_2_0 - 0.138374218374222*G0_1_0_2_2 + 0.0480230880230901*G0_1_0_2_3 + 0.0515632515632536*G0_1_0_2_4 + 0.00446368446368465*G0_1_0_2_5 - 0.0480230880230897*G0_1_0_3_1 + 0.0480230880230901*G0_1_0_3_2 + 0.00892736892736925*G0_1_0_3_4 - 0.0089273689273693*G0_1_0_3_5 - 0.0257046657046667*G0_1_0_4_0 - 0.00446368446368463*G0_1_0_4_1 + 0.0515632515632536*G0_1_0_4_2 + 0.00892736892736926*G0_1_0_4_3 + 0.150841750841756*G0_1_0_4_4 + 0.0257046657046664*G0_1_0_5_0 - 0.0515632515632532*G0_1_0_5_1 + 0.00446368446368464*G0_1_0_5_2 - 0.00892736892736929*G0_1_0_5_3 - 0.150841750841757*G0_1_0_5_5 - 0.0087734487734494*G0_1_1_0_0 + 0.00784992784992809*G0_1_1_0_1 - 0.0021164021164022*G0_1_1_0_2 + 0.00415584415584428*G0_1_1_0_3 - 0.0138528138528145*G0_1_1_0_4 + 0.0207792207792213*G0_1_1_0_5 + 0.00784992784992809*G0_1_1_1_0 + 0.169927849927857*G0_1_1_1_1 + 0.00731120731120747*G0_1_1_1_2 - 0.0438672438672452*G0_1_1_1_3 - 0.00954304954304988*G0_1_1_1_4 - 0.0444829244829256*G0_1_1_1_5 - 0.0021164021164022*G0_1_1_2_0 + 0.00731120731120747*G0_1_1_2_1 - 0.0338624338624346*G0_1_1_2_2 + 0.0187782587782597*G0_1_1_2_3 + 0.0127753727753734*G0_1_1_2_4 + 0.00769600769600802*G0_1_1_2_5 + 0.00415584415584427*G0_1_1_3_0 - 0.0438672438672452*G0_1_1_3_1 + 0.0187782587782597*G0_1_1_3_2 - 0.199788359788367*G0_1_1_3_3 + 0.0107744107744111*G0_1_1_3_4 - 0.0237037037037047*G0_1_1_3_5 - 0.0138528138528145*G0_1_1_4_0 - 0.00954304954304988*G0_1_1_4_1 + 0.0127753727753734*G0_1_1_4_2 + 0.0107744107744111*G0_1_1_4_3 + 0.0520250120250138*G0_1_1_4_4 + 0.00369408369408373*G0_1_1_4_5 + 0.0207792207792213*G0_1_1_5_0 - 0.0444829244829256*G0_1_1_5_1 + 0.00769600769600802*G0_1_1_5_2 - 0.0237037037037047*G0_1_1_5_3 + 0.00369408369408373*G0_1_1_5_4 - 0.234882154882163*G0_1_1_5_5; + A[18] = -A[26] - 0.0189065255731929*G0_0_0_0_0 + 0.00528031639142771*G0_0_0_0_1 + 0.00441665330554234*G0_0_0_0_2 + 0.00410453743787091*G0_0_0_0_3 - 0.00596868152423729*G0_0_0_0_4 - 0.00162471273582389*G0_0_0_0_5 + 0.00528031639142771*G0_0_0_1_0 - 0.188680455347129*G0_0_0_1_1 + 0.0052803163914277*G0_0_0_1_2 - 0.015392015392016*G0_0_0_1_3 + 0.00572925017369482*G0_0_0_1_4 - 0.0153920153920162*G0_0_0_1_5 + 0.00441665330554234*G0_0_0_2_0 + 0.0052803163914277*G0_0_0_2_1 - 0.0189065255731929*G0_0_0_2_2 - 0.0016247127358239*G0_0_0_2_3 - 0.00596868152423727*G0_0_0_2_4 + 0.00410453743787092*G0_0_0_2_5 + 0.00410453743787091*G0_0_0_3_0 - 0.015392015392016*G0_0_0_3_1 - 0.0016247127358239*G0_0_0_3_2 - 0.0328362995029673*G0_0_0_3_3 - 0.0196675752231314*G0_0_0_3_4 - 0.0164181497514837*G0_0_0_3_5 - 0.00596868152423729*G0_0_0_4_0 + 0.00572925017369482*G0_0_0_4_1 - 0.00596868152423727*G0_0_0_4_2 - 0.0196675752231314*G0_0_0_4_3 - 0.0870846026401609*G0_0_0_4_4 - 0.0196675752231315*G0_0_0_4_5 - 0.00162471273582389*G0_0_0_5_0 - 0.0153920153920162*G0_0_0_5_1 + 0.00410453743787092*G0_0_0_5_2 - 0.0164181497514837*G0_0_0_5_3 - 0.0196675752231315*G0_0_0_5_4 - 0.0328362995029674*G0_0_0_5_5; + A[38] = -A[35] - 0.0189065255731929*G0_1_1_0_0 + 0.00441665330554236*G0_1_1_0_1 + 0.00528031639142766*G0_1_1_0_2 + 0.0041045374378709*G0_1_1_0_3 - 0.0016247127358239*G0_1_1_0_4 - 0.00596868152423731*G0_1_1_0_5 + 0.00441665330554236*G0_1_1_1_0 - 0.0189065255731931*G0_1_1_1_1 + 0.00528031639142767*G0_1_1_1_2 - 0.00162471273582395*G0_1_1_1_3 + 0.0041045374378709*G0_1_1_1_4 - 0.00596868152423738*G0_1_1_1_5 + 0.00528031639142766*G0_1_1_2_0 + 0.00528031639142767*G0_1_1_2_1 - 0.188680455347128*G0_1_1_2_2 - 0.0153920153920159*G0_1_1_2_3 - 0.0153920153920159*G0_1_1_2_4 + 0.00572925017369478*G0_1_1_2_5 + 0.0041045374378709*G0_1_1_3_0 - 0.00162471273582395*G0_1_1_3_1 - 0.0153920153920159*G0_1_1_3_2 - 0.0328362995029672*G0_1_1_3_3 - 0.0164181497514836*G0_1_1_3_4 - 0.0196675752231314*G0_1_1_3_5 - 0.0016247127358239*G0_1_1_4_0 + 0.0041045374378709*G0_1_1_4_1 - 0.0153920153920159*G0_1_1_4_2 - 0.0164181497514836*G0_1_1_4_3 - 0.0328362995029673*G0_1_1_4_4 - 0.0196675752231314*G0_1_1_4_5 - 0.00596868152423731*G0_1_1_5_0 - 0.00596868152423737*G0_1_1_5_1 + 0.00572925017369478*G0_1_1_5_2 - 0.0196675752231314*G0_1_1_5_3 - 0.0196675752231314*G0_1_1_5_4 - 0.0870846026401613*G0_1_1_5_5; + A[116] = -A[108] + 0.014058040724708*G0_0_0_0_0 + 0.00164181497514836*G0_0_0_0_1 + 0.00651595318262007*G0_0_0_0_2 - 0.00769600769600799*G0_0_0_0_3 + 0.0160076960076965*G0_0_0_0_4 - 0.0130319063652401*G0_0_0_0_5 + 0.00164181497514836*G0_0_0_1_0 + 0.00410453743787135*G0_0_0_1_1 + 0.00312970979637656*G0_0_0_1_2 + 0.00410453743787102*G0_0_0_1_3 - 0.000923520923521027*G0_0_0_1_4 + 0.0020522687189355*G0_0_0_1_5 + 0.00651595318262007*G0_0_0_2_0 + 0.00312970979637656*G0_0_0_2_1 + 0.0519223985890667*G0_0_0_2_2 - 0.0243193843193852*G0_0_0_2_3 - 0.0429950296616978*G0_0_0_2_4 - 0.00441237774571123*G0_0_0_2_5 - 0.00769600769600799*G0_0_0_3_0 + 0.00410453743787102*G0_0_0_3_1 - 0.0243193843193852*G0_0_0_3_2 + 0.0225749559082905*G0_0_0_3_3 + 0.017239057239058*G0_0_0_3_4 + 0.0242167708834385*G0_0_0_3_5 + 0.0160076960076965*G0_0_0_4_0 - 0.000923520923521027*G0_0_0_4_1 - 0.0429950296616978*G0_0_0_4_2 + 0.017239057239058*G0_0_0_4_3 - 0.320564373897717*G0_0_0_4_4 + 0.0106717973384645*G0_0_0_4_5 - 0.0130319063652401*G0_0_0_5_0 + 0.0020522687189355*G0_0_0_5_1 - 0.00441237774571123*G0_0_0_5_2 + 0.0242167708834385*G0_0_0_5_3 + 0.0106717973384645*G0_0_0_5_4 + 0.0233958633958641*G0_0_0_5_5 - 0.0378643578643595*G0_1_0_0_0 - 0.00148789482122818*G0_1_0_0_1 - 0.00328362995029673*G0_1_0_0_3 + 0.0590027256693941*G0_1_0_0_4 + 0.0112874779541449*G0_1_0_0_5 - 0.00148789482122818*G0_1_0_1_0 + 0.0014878948212282*G0_1_0_1_2 + 0.00205226871893549*G0_1_0_1_3 - 0.00205226871893545*G0_1_0_1_5 + 0.0014878948212282*G0_1_0_2_1 + 0.0378643578643588*G0_1_0_2_2 - 0.011287477954145*G0_1_0_2_3 - 0.0590027256693942*G0_1_0_2_4 + 0.00328362995029679*G0_1_0_2_5 - 0.00328362995029673*G0_1_0_3_0 + 0.00205226871893549*G0_1_0_3_1 - 0.011287477954145*G0_1_0_3_2 - 0.000820907487574091*G0_1_0_3_3 + 0.00656725990059346*G0_1_0_3_4 + 0.0590027256693941*G0_1_0_4_0 - 0.0590027256693942*G0_1_0_4_2 + 0.00656725990059345*G0_1_0_4_3 - 0.0065672599005936*G0_1_0_4_5 + 0.0112874779541449*G0_1_0_5_0 - 0.00205226871893545*G0_1_0_5_1 + 0.00328362995029679*G0_1_0_5_2 - 0.0065672599005936*G0_1_0_5_4 + 0.000820907487573818*G0_1_0_5_5; + A[139] = A[116] - 0.00708032708032726*G0_0_0_0_0 - 0.00174442841109512*G0_0_0_0_2 + 0.00307840307840315*G0_0_0_0_3 - 0.00369408369408378*G0_0_0_0_4 + 0.0128266794933466*G0_0_0_0_5 + 0.00708032708032683*G0_0_0_1_1 + 0.00174442841109515*G0_0_0_1_2 + 0.00369408369408388*G0_0_0_1_3 - 0.00307840307840315*G0_0_0_1_4 - 0.0128266794933466*G0_0_0_1_5 - 0.00174442841109512*G0_0_0_2_0 + 0.00174442841109515*G0_0_0_2_1 - 0.0075933942600613*G0_0_0_2_3 + 0.00759339426006112*G0_0_0_2_4 + 0.00307840307840316*G0_0_0_3_0 + 0.00369408369408387*G0_0_0_3_1 - 0.00759339426006129*G0_0_0_3_2 - 0.132987012987018*G0_0_0_3_3 - 0.00615680615680639*G0_0_0_3_5 - 0.00369408369408378*G0_0_0_4_0 - 0.00307840307840315*G0_0_0_4_1 + 0.00759339426006111*G0_0_0_4_2 + 0.132987012987017*G0_0_0_4_4 + 0.0061568061568063*G0_0_0_4_5 + 0.0128266794933466*G0_0_0_5_0 - 0.0128266794933466*G0_0_0_5_1 - 0.00615680615680639*G0_0_0_5_3 + 0.0061568061568063*G0_0_0_5_4 + 0.00533589866923247*G0_0_1_0_0 + 0.00246272246272259*G0_0_1_0_1 + 0.00118005451338788*G0_0_1_0_2 - 0.00143658810325485*G0_0_1_0_3 + 0.00143658810325481*G0_0_1_0_4 + 0.00625941959275321*G0_0_1_0_5 + 0.00246272246272259*G0_0_1_1_0 + 0.0481257014590358*G0_0_1_1_1 + 0.00461760461760479*G0_0_1_1_2 - 0.030270963604298*G0_0_1_1_3 - 0.020420073753408*G0_0_1_1_5 + 0.00118005451338788*G0_0_1_2_0 + 0.00461760461760479*G0_0_1_2_1 + 0.0050280583613918*G0_0_1_2_2 + 0.010363957030624*G0_0_1_2_3 - 0.00615680615680637*G0_0_1_2_4 - 0.00430976430976445*G0_0_1_2_5 - 0.00143658810325485*G0_0_1_3_0 - 0.030270963604298*G0_0_1_3_1 + 0.010363957030624*G0_0_1_3_2 - 0.17362193362194*G0_0_1_3_3 + 0.00287317620650971*G0_0_1_3_4 + 0.0114927048260385*G0_0_1_3_5 + 0.00143658810325481*G0_0_1_4_0 - 0.00615680615680637*G0_0_1_4_2 + 0.00287317620650971*G0_0_1_4_3 - 0.0225749559082898*G0_0_1_4_4 + 0.00861952861952896*G0_0_1_4_5 + 0.00625941959275321*G0_0_1_5_0 - 0.020420073753408*G0_0_1_5_1 - 0.00430976430976445*G0_0_1_5_2 + 0.0114927048260385*G0_0_1_5_3 + 0.00861952861952896*G0_0_1_5_4 + 0.0119031585698253*G0_0_1_5_5 + 0.0410453743787092*G0_1_0_0_0 + 0.00246272246272257*G0_1_0_0_1 + 0.00287317620650965*G0_1_0_0_2 + 0.00307840307840316*G0_1_0_0_3 - 0.0339650472983817*G0_1_0_0_4 - 0.00759339426006128*G0_1_0_0_5 + 0.00246272246272257*G0_1_0_1_0 + 0.012416225749559*G0_1_0_1_1 + 0.00292448292448306*G0_1_0_1_2 + 0.00513067179733869*G0_1_0_1_3 - 0.00451499118165799*G0_1_0_1_4 - 0.00656725990059341*G0_1_0_1_5 + 0.00287317620650965*G0_1_0_2_0 + 0.00292448292448306*G0_1_0_2_1 + 0.00502805836139161*G0_1_0_2_2 - 0.0137502004168677*G0_1_0_2_3 + 0.0179573512906851*G0_1_0_2_4 - 0.00430976430976448*G0_1_0_2_5 + 0.00307840307840316*G0_1_0_3_0 + 0.0051306717973387*G0_1_0_3_1 - 0.0137502004168677*G0_1_0_3_2 - 0.155561968895308*G0_1_0_3_3 + 0.00287317620650959*G0_1_0_3_4 + 0.00246272246272254*G0_1_0_3_5 - 0.0339650472983817*G0_1_0_4_0 - 0.00451499118165799*G0_1_0_4_1 + 0.0179573512906851*G0_1_0_4_2 + 0.00287317620650959*G0_1_0_4_3 - 0.0406349206349218*G0_1_0_4_4 + 0.0176495109828449*G0_1_0_4_5 - 0.00759339426006128*G0_1_0_5_0 - 0.00656725990059341*G0_1_0_5_1 - 0.00430976430976448*G0_1_0_5_2 + 0.00246272246272254*G0_1_0_5_3 + 0.0176495109828449*G0_1_0_5_4 + 0.0119031585698255*G0_1_0_5_5 - 0.00810646143979536*G0_1_1_0_0 + 0.00246272246272264*G0_1_1_0_1 + 0.000564373897707255*G0_1_1_0_2 + 0.00164181497514836*G0_1_1_0_3 + 0.0040019240019241*G0_1_1_0_4 + 0.00225749559082889*G0_1_1_0_5 + 0.00246272246272264*G0_1_1_1_0 + 0.061568061568063*G0_1_1_1_1 + 0.00523328523328545*G0_1_1_1_2 - 0.0328362995029674*G0_1_1_1_3 - 0.0030784030784032*G0_1_1_1_4 - 0.0164181497514838*G0_1_1_1_5 + 0.000564373897707255*G0_1_1_2_0 + 0.00523328523328545*G0_1_1_2_1 + 0.00502805836139181*G0_1_1_2_2 + 0.013544973544974*G0_1_1_2_3 - 0.0093378226711563*G0_1_1_2_4 - 0.00430976430976442*G0_1_1_2_5 + 0.00164181497514836*G0_1_1_3_0 - 0.0328362995029674*G0_1_1_3_1 + 0.013544973544974*G0_1_1_3_2 - 0.207279140612482*G0_1_1_3_3 + 0.00287317620650961*G0_1_1_3_4 + 0.00533589866923203*G0_1_1_3_5 + 0.0040019240019241*G0_1_1_4_0 - 0.0030784030784032*G0_1_1_4_1 - 0.0093378226711563*G0_1_1_4_2 + 0.00287317620650961*G0_1_1_4_3 + 0.0110822510822515*G0_1_1_4_4 + 0.0147763347763352*G0_1_1_4_5 + 0.00225749559082889*G0_1_1_5_0 - 0.0164181497514838*G0_1_1_5_1 - 0.00430976430976442*G0_1_1_5_2 + 0.00533589866923203*G0_1_1_5_3 + 0.0147763347763352*G0_1_1_5_4 + 0.0119031585698251*G0_1_1_5_5; + A[110] = -A[139] + 0.00646464646464684*G0_0_0_0_0 + 0.00102613435946771*G0_0_0_0_1 - 0.00887606220939573*G0_0_0_0_2 - 0.00502805836139185*G0_0_0_0_3 + 0.0223697290363965*G0_0_0_0_4 + 0.00605419272085958*G0_0_0_0_5 + 0.00102613435946771*G0_0_0_1_0 + 0.0192913259579932*G0_0_0_1_1 - 0.0317588584255261*G0_0_0_1_2 - 0.0231906365239706*G0_0_0_1_3 - 0.00400192400192412*G0_0_0_1_4 - 0.0104665704665708*G0_0_0_1_5 - 0.00887606220939573*G0_0_0_2_0 - 0.0317588584255261*G0_0_0_2_1 + 0.452114798781479*G0_0_0_2_2 + 0.145198011864683*G0_0_0_2_3 + 0.00913259579926241*G0_0_0_2_4 - 0.000307840307840257*G0_0_0_2_5 - 0.00502805836139185*G0_0_0_3_0 - 0.0231906365239706*G0_0_0_3_1 + 0.145198011864683*G0_0_0_3_2 + 0.0258585858585869*G0_0_0_3_3 + 0.018059964726632*G0_0_0_3_4 + 0.0106717973384644*G0_0_0_3_5 + 0.0223697290363965*G0_0_0_4_0 - 0.00400192400192412*G0_0_0_4_1 + 0.00913259579926241*G0_0_0_4_2 + 0.018059964726632*G0_0_0_4_3 - 0.103844797178134*G0_0_0_4_4 + 0.00861952861952888*G0_0_0_4_5 + 0.00605419272085958*G0_0_0_5_0 - 0.0104665704665708*G0_0_0_5_1 - 0.000307840307840255*G0_0_0_5_2 + 0.0106717973384644*G0_0_0_5_3 + 0.00861952861952888*G0_0_0_5_4 + 0.019291325957993*G0_0_0_5_5 + 0.00215488215488247*G0_0_1_0_0 + 0.00200096200096208*G0_0_1_0_1 - 0.00287317620650958*G0_0_1_0_2 - 0.00441237774571117*G0_0_1_0_3 + 0.0141606541606547*G0_0_1_0_4 + 0.00985088985089027*G0_0_1_0_5 + 0.00200096200096208*G0_0_1_1_0 + 0.0599262465929151*G0_0_1_1_1 - 0.0206766073432747*G0_0_1_1_2 - 0.0633124899791589*G0_0_1_1_3 + 0.00441237774571126*G0_0_1_1_4 - 0.0195991662658337*G0_0_1_1_5 - 0.00287317620650958*G0_0_1_2_0 - 0.0206766073432747*G0_0_1_2_1 + 0.156793330126669*G0_0_1_2_2 + 0.141606541606547*G0_0_1_2_3 + 0.00174442841109498*G0_0_1_2_4 - 0.0017444284110951*G0_0_1_2_5 - 0.00441237774571117*G0_0_1_3_0 - 0.0633124899791589*G0_0_1_3_1 + 0.141606541606547*G0_0_1_3_2 + 0.0808593875260569*G0_0_1_3_3 + 0.0123136123136127*G0_0_1_3_5 + 0.0141606541606547*G0_0_1_4_0 + 0.00441237774571126*G0_0_1_4_1 + 0.00174442841109498*G0_0_1_4_2 - 0.0939939073272445*G0_0_1_4_4 - 0.00533589866923227*G0_0_1_4_5 + 0.00985088985089027*G0_0_1_5_0 - 0.0195991662658337*G0_0_1_5_1 - 0.0017444284110951*G0_0_1_5_2 + 0.0123136123136127*G0_0_1_5_3 - 0.00533589866923227*G0_0_1_5_4 + 0.0135449735449736*G0_0_1_5_5 - 0.00779862113195487*G0_1_0_0_0 + 0.000564373897707361*G0_1_0_0_2 + 0.00256533589866933*G0_1_0_0_3 + 0.0232932499599174*G0_1_0_0_4 + 0.00451499118165785*G0_1_0_0_5 + 0.0188808722142061*G0_1_0_1_1 - 0.024575917909252*G0_1_0_1_2 - 0.0118005451338788*G0_1_0_1_3 + 0.00297578964245644*G0_1_0_1_4 - 0.00749078082411434*G0_1_0_1_5 + 0.000564373897707361*G0_1_0_2_0 - 0.024575917909252*G0_1_0_2_1 + 0.379361872695217*G0_1_0_2_2 + 0.112669552669556*G0_1_0_2_3 - 0.0225749559082903*G0_1_0_2_4 - 0.00297578964245635*G0_1_0_2_5 + 0.00256533589866933*G0_1_0_3_0 - 0.0118005451338788*G0_1_0_3_1 + 0.112669552669556*G0_1_0_3_2 - 0.038993105659774*G0_1_0_3_3 - 0.0110822510822516*G0_1_0_3_4 + 0.000820907487574151*G0_1_0_3_5 + 0.0232932499599174*G0_1_0_4_0 + 0.00297578964245644*G0_1_0_4_1 - 0.0225749559082903*G0_1_0_4_2 - 0.0110822510822516*G0_1_0_4_3 - 0.141606541606547*G0_1_0_4_4 + 0.00451499118165785*G0_1_0_5_0 - 0.00749078082411434*G0_1_0_5_1 - 0.00297578964245635*G0_1_0_5_2 + 0.000820907487574154*G0_1_0_5_3 + 0.0119031585698253*G0_1_0_5_5 - 0.0217540484207159*G0_1_1_0_0 + 0.00359147025813708*G0_1_1_0_1 + 0.00241141574474921*G0_1_1_0_2 + 0.00533589866923222*G0_1_1_0_3 + 0.013134519801187*G0_1_1_0_4 - 0.00779862113195481*G0_1_1_0_5 + 0.00359147025813708*G0_1_1_1_0 + 0.0652621452621472*G0_1_1_1_1 - 0.0155972422639094*G0_1_1_1_2 - 0.0494596761263446*G0_1_1_1_3 + 0.0123136123136127*G0_1_1_1_4 - 0.0059515792849129*G0_1_1_1_5 + 0.00241141574474921*G0_1_1_2_0 - 0.0155972422639094*G0_1_1_2_1 + 0.127651114317785*G0_1_1_2_2 + 0.117184543851215*G0_1_1_2_3 - 0.010466570466571*G0_1_1_2_4 + 0.000615680615680655*G0_1_1_2_5 + 0.00533589866923222*G0_1_1_3_0 - 0.0494596761263446*G0_1_1_3_1 + 0.117184543851215*G0_1_1_3_2 - 0.0258585858585873*G0_1_1_3_3 - 0.0352990219656899*G0_1_1_3_4 - 0.0119031585698257*G0_1_1_3_5 + 0.013134519801187*G0_1_1_4_0 + 0.0123136123136127*G0_1_1_4_1 - 0.010466570466571*G0_1_1_4_2 - 0.0352990219656899*G0_1_1_4_3 - 0.109591149591153*G0_1_1_4_4 - 0.0258585858585867*G0_1_1_4_5 - 0.00779862113195481*G0_1_1_5_0 - 0.00595157928491291*G0_1_1_5_1 + 0.000615680615680655*G0_1_1_5_2 - 0.0119031585698257*G0_1_1_5_3 - 0.0258585858585867*G0_1_1_5_4 - 0.0710084976751671*G0_1_1_5_5; + A[117] = -A[110] + 0.0477152477152494*G0_0_0_0_0 + 0.00333493666827009*G0_0_0_0_1 - 0.0175982042648714*G0_0_0_0_2 - 0.0300657367324044*G0_0_0_0_3 + 0.0122109988776659*G0_0_0_0_4 + 0.00584896584896607*G0_0_0_0_5 + 0.00333493666827009*G0_0_0_1_0 + 0.0128266794933466*G0_0_0_1_1 - 0.0471508738175421*G0_0_0_1_2 - 0.0715215648549006*G0_0_0_1_3 - 0.0173416706750046*G0_0_0_1_4 - 0.014468494468495*G0_0_0_1_5 - 0.0175982042648714*G0_0_0_2_0 - 0.0471508738175421*G0_0_0_2_1 + 0.517171717171734*G0_0_0_2_2 + 0.230059323392665*G0_0_0_2_3 + 0.0408401475068153*G0_0_0_2_4 + 0.00472021805355162*G0_0_0_2_5 - 0.0300657367324044*G0_0_0_3_0 - 0.0715215648549006*G0_0_0_3_1 + 0.230059323392665*G0_0_0_3_2 + 0.468738175404859*G0_0_0_3_3 + 0.0948148148148181*G0_0_0_3_4 + 0.0506910373577059*G0_0_0_3_5 + 0.0122109988776659*G0_0_0_4_0 - 0.0173416706750046*G0_0_0_4_1 + 0.0408401475068153*G0_0_0_4_2 + 0.0948148148148181*G0_0_0_4_3 - 0.424409171075853*G0_0_0_4_4 + 0.0252429052429061*G0_0_0_4_5 + 0.00584896584896607*G0_0_0_5_0 - 0.014468494468495*G0_0_0_5_1 + 0.00472021805355162*G0_0_0_5_2 + 0.0506910373577059*G0_0_0_5_3 + 0.0252429052429061*G0_0_0_5_4 + 0.00697771364438062*G0_0_0_5_5 + 0.0419175885842569*G0_0_1_0_0 + 0.000461760461760431*G0_0_1_0_1 - 0.0157511624178296*G0_0_1_0_2 - 0.0327336860670204*G0_0_1_0_3 - 0.0124162257495594*G0_0_1_0_4 + 0.023601090267758*G0_0_1_0_5 + 0.000461760461760429*G0_0_1_1_0 + 0.0190347923681262*G0_0_1_1_1 - 0.0388904922238269*G0_0_1_1_2 - 0.0909155042488408*G0_0_1_1_3 - 0.0498701298701315*G0_0_1_1_4 - 0.0328362995029674*G0_0_1_1_5 - 0.0157511624178296*G0_0_1_2_0 - 0.0388904922238269*G0_0_1_2_1 + 0.249401956068631*G0_0_1_2_2 + 0.213743787077128*G0_0_1_2_3 + 0.0255507455507464*G0_0_1_2_4 - 0.0073881673881676*G0_0_1_2_5 - 0.0327336860670204*G0_0_1_3_0 - 0.0909155042488408*G0_0_1_3_1 + 0.213743787077128*G0_0_1_3_2 + 0.612602212602235*G0_0_1_3_3 + 0.165207631874304*G0_0_1_3_4 + 0.0802437069103764*G0_0_1_3_5 - 0.0124162257495594*G0_0_1_4_0 - 0.0498701298701315*G0_0_1_4_1 + 0.0255507455507464*G0_0_1_4_2 + 0.165207631874304*G0_0_1_4_3 + 0.292037838704514*G0_0_1_4_4 + 0.114516594516598*G0_0_1_4_5 + 0.023601090267758*G0_0_1_5_0 - 0.0328362995029674*G0_0_1_5_1 - 0.0073881673881676*G0_0_1_5_2 + 0.0802437069103764*G0_0_1_5_3 + 0.114516594516598*G0_0_1_5_4 + 0.140169953503292*G0_0_1_5_5 + 0.0234471701138379*G0_1_0_0_0 - 0.00138528138528148*G0_1_0_0_1 - 0.0367356100689446*G0_1_0_0_2 - 0.0125188391855062*G0_1_0_0_3 + 0.179060445727119*G0_1_0_0_4 + 0.0118005451338789*G0_1_0_0_5 - 0.00138528138528148*G0_1_0_1_0 + 0.0107231040564378*G0_1_0_1_1 - 0.0375052108385454*G0_1_0_1_2 - 0.0617732884399573*G0_1_0_1_3 - 0.041558441558443*G0_1_0_1_4 - 0.00902998236331606*G0_1_0_1_5 - 0.0367356100689446*G0_1_0_2_0 - 0.0375052108385454*G0_1_0_2_1 + 0.458220298220313*G0_1_0_2_2 + 0.199275292608633*G0_1_0_2_3 - 0.0736764470097831*G0_1_0_2_4 - 0.00277056277056286*G0_1_0_2_5 - 0.0125188391855062*G0_1_0_3_0 - 0.0617732884399573*G0_1_0_3_1 + 0.199275292608633*G0_1_0_3_2 + 0.399987173320521*G0_1_0_3_3 + 0.108154561487899*G0_1_0_3_4 + 0.0305788039121386*G0_1_0_3_5 + 0.179060445727119*G0_1_0_4_0 - 0.041558441558443*G0_1_0_4_1 - 0.0736764470097831*G0_1_0_4_2 + 0.108154561487899*G0_1_0_4_3 + 0.477562930896279*G0_1_0_4_4 + 0.0886580086580118*G0_1_0_4_5 + 0.0118005451338789*G0_1_0_5_0 - 0.00902998236331605*G0_1_0_5_1 - 0.00277056277056286*G0_1_0_5_2 + 0.0305788039121386*G0_1_0_5_3 + 0.0886580086580118*G0_1_0_5_4 - 0.0108770242103574*G0_1_0_5_5 - 0.207484367484375*G0_1_1_0_0 + 0.0393522526855874*G0_1_1_0_1 - 0.0253455186788528*G0_1_1_0_3 - 0.0379669713003058*G0_1_1_0_4 - 0.19014269680937*G0_1_1_0_5 + 0.0393522526855874*G0_1_1_1_0 - 0.0393522526855874*G0_1_1_1_2 - 0.0580792047458735*G0_1_1_1_3 + 0.0580792047458734*G0_1_1_1_5 - 0.0393522526855874*G0_1_1_2_1 + 0.207484367484375*G0_1_1_2_2 + 0.19014269680937*G0_1_1_2_3 + 0.0379669713003058*G0_1_1_2_4 + 0.0253455186788529*G0_1_1_2_5 - 0.0253455186788528*G0_1_1_3_0 - 0.0580792047458735*G0_1_1_3_1 + 0.19014269680937*G0_1_1_3_2 + 0.472432259098943*G0_1_1_3_3 + 0.0506910373577059*G0_1_1_3_4 - 0.0379669713003058*G0_1_1_4_0 + 0.0379669713003058*G0_1_1_4_2 + 0.0506910373577059*G0_1_1_4_3 - 0.0506910373577055*G0_1_1_4_5 - 0.19014269680937*G0_1_1_5_0 + 0.0580792047458734*G0_1_1_5_1 + 0.0253455186788529*G0_1_1_5_2 - 0.0506910373577055*G0_1_1_5_4 - 0.472432259098942*G0_1_1_5_5; + A[65] = -A[110] - 0.00574635241301927*G0_0_0_0_0 + 0.0246272246272255*G0_0_0_0_2 - 0.00410453743787088*G0_0_0_0_3 + 0.0492544492544509*G0_0_0_0_4 + 0.00369408369408383*G0_0_0_0_5 + 0.0057463524130193*G0_0_0_1_1 - 0.0246272246272255*G0_0_0_1_2 - 0.049254449254451*G0_0_0_1_3 + 0.0041045374378709*G0_0_0_1_4 - 0.00369408369408383*G0_0_0_1_5 + 0.0246272246272255*G0_0_0_2_0 - 0.0246272246272255*G0_0_0_2_1 + 0.143658810325482*G0_0_0_2_3 - 0.143658810325482*G0_0_0_2_4 - 0.00410453743787088*G0_0_0_3_0 - 0.049254449254451*G0_0_0_3_1 + 0.143658810325482*G0_0_0_3_2 + 0.262690396023739*G0_0_0_3_3 + 0.0082090748757419*G0_0_0_3_5 + 0.0492544492544509*G0_0_0_4_0 + 0.0041045374378709*G0_0_0_4_1 - 0.143658810325482*G0_0_0_4_2 - 0.262690396023738*G0_0_0_4_4 - 0.00820907487574185*G0_0_0_4_5 + 0.00369408369408383*G0_0_0_5_0 - 0.00369408369408383*G0_0_0_5_1 + 0.0082090748757419*G0_0_0_5_3 - 0.00820907487574185*G0_0_0_5_4 + 0.000820907487574176*G0_0_1_0_0 + 0.0055411255411257*G0_0_1_0_1 - 0.00472021805355148*G0_0_1_0_2 - 0.0373512906846251*G0_0_1_0_3 + 0.00944043610710319*G0_0_1_0_4 - 0.000820907487574141*G0_0_1_0_5 + 0.0055411255411257*G0_0_1_1_0 + 0.00779862113195462*G0_0_1_1_1 - 0.0416610549943898*G0_0_1_1_2 - 0.11287477954145*G0_0_1_1_3 - 0.00944043610710305*G0_0_1_1_4 - 0.0119031585698257*G0_0_1_1_5 - 0.00472021805355148*G0_0_1_2_0 - 0.0416610549943898*G0_0_1_2_1 + 0.133397466730805*G0_0_1_2_2 + 0.242167708834384*G0_0_1_2_3 + 0.00944043610710313*G0_0_1_2_5 - 0.0373512906846251*G0_0_1_3_0 - 0.11287477954145*G0_0_1_3_1 + 0.242167708834384*G0_0_1_3_2 + 0.842251082251112*G0_0_1_3_3 + 0.0935834535834567*G0_0_1_3_4 + 0.0558217091550445*G0_0_1_3_5 + 0.00944043610710319*G0_0_1_4_0 - 0.00944043610710305*G0_0_1_4_1 + 0.0935834535834567*G0_0_1_4_3 - 0.0935834535834575*G0_0_1_4_4 - 0.000820907487574141*G0_0_1_5_0 - 0.0119031585698257*G0_0_1_5_1 + 0.00944043610710313*G0_0_1_5_2 + 0.0558217091550445*G0_0_1_5_3 + 0.00164181497514857*G0_0_1_5_5 - 0.00974827641494339*G0_1_0_0_0 - 0.00118005451338791*G0_1_0_0_1 + 0.0073881673881677*G0_1_0_0_2 + 0.00759339426006118*G0_1_0_0_3 + 0.0324258457591802*G0_1_0_0_4 + 0.00246272246272255*G0_1_0_0_5 - 0.00118005451338791*G0_1_0_1_0 - 0.00400192400192397*G0_1_0_1_1 - 0.0172390572390578*G0_1_0_1_2 - 0.0168286034952708*G0_1_0_1_3 + 0.0116979316979321*G0_1_0_1_4 - 0.0012313612313612*G0_1_0_1_5 + 0.0073881673881677*G0_1_0_2_0 - 0.0172390572390578*G0_1_0_2_1 + 0.303222703222713*G0_1_0_2_2 + 0.0933782267115633*G0_1_0_2_3 - 0.0502805836139188*G0_1_0_2_4 - 0.00348885682219024*G0_1_0_2_5 + 0.00759339426006118*G0_1_0_3_0 - 0.0168286034952708*G0_1_0_3_1 + 0.0933782267115633*G0_1_0_3_2 + 0.0755234888568254*G0_1_0_3_3 - 0.0385826519159865*G0_1_0_3_4 - 0.00820907487574175*G0_1_0_3_5 + 0.0324258457591802*G0_1_0_4_0 + 0.0116979316979321*G0_1_0_4_1 - 0.0502805836139188*G0_1_0_4_2 - 0.0385826519159865*G0_1_0_4_3 - 0.187166907166914*G0_1_0_4_4 - 0.0164181497514837*G0_1_0_4_5 + 0.00246272246272255*G0_1_0_5_0 - 0.0012313612313612*G0_1_0_5_1 - 0.00348885682219024*G0_1_0_5_2 - 0.00820907487574175*G0_1_0_5_3 - 0.0164181497514837*G0_1_0_5_4 - 0.0114927048260383*G0_1_0_5_5 - 0.0244219977553318*G0_1_1_0_0 + 0.0184704184704192*G0_1_1_0_1 + 0.00251402918069596*G0_1_1_0_2 + 0.0153920153920159*G0_1_1_0_3 + 0.0229854096520772*G0_1_1_0_4 + 0.0141606541606547*G0_1_1_0_5 + 0.0184704184704192*G0_1_1_1_0 - 0.168696488696496*G0_1_1_1_1 - 0.00400192400192412*G0_1_1_1_2 - 0.081475068141738*G0_1_1_1_3 + 0.013544973544974*G0_1_1_1_4 - 0.0724450857784221*G0_1_1_1_5 + 0.00251402918069596*G0_1_1_2_0 - 0.00400192400192412*G0_1_1_2_1 + 0.0872214205547568*G0_1_1_2_2 + 0.11287477954145*G0_1_1_2_3 - 0.019496552829887*G0_1_1_2_4 + 0.0155972422639095*G0_1_1_2_5 + 0.0153920153920159*G0_1_1_3_0 - 0.081475068141738*G0_1_1_3_1 + 0.11287477954145*G0_1_1_3_2 + 0.222055475388817*G0_1_1_3_3 - 0.0578739778739798*G0_1_1_3_4 - 0.0619785153118507*G0_1_1_3_5 + 0.0229854096520772*G0_1_1_4_0 + 0.013544973544974*G0_1_1_4_1 - 0.019496552829887*G0_1_1_4_2 - 0.0578739778739798*G0_1_1_4_3 - 0.151457431457437*G0_1_1_4_4 - 0.0582844316177669*G0_1_1_4_5 + 0.0141606541606547*G0_1_1_5_0 - 0.0724450857784221*G0_1_1_5_1 + 0.0155972422639095*G0_1_1_5_2 - 0.0619785153118507*G0_1_1_5_3 - 0.0582844316177669*G0_1_1_5_4 - 0.243399070065745*G0_1_1_5_5; + A[113] = -A[110] - 0.00410453743787076*G0_0_1_0_0 - 0.00733686067019425*G0_0_1_0_1 + 0.0215488215488223*G0_0_1_0_2 + 0.0178547378547385*G0_0_1_0_3 + 0.0724450857784217*G0_0_1_0_4 + 0.0152894019560693*G0_0_1_0_5 - 0.00733686067019425*G0_0_1_1_0 - 0.00287317620650991*G0_0_1_1_1 + 0.00923520923520954*G0_0_1_1_2 - 0.000615680615680701*G0_0_1_1_3 + 0.0416610549943898*G0_0_1_1_4 + 0.00790123456790139*G0_0_1_1_5 + 0.0215488215488223*G0_0_1_2_0 + 0.00923520923520954*G0_0_1_2_1 - 0.278595478595487*G0_0_1_2_2 - 0.018470418470419*G0_0_1_2_3 - 0.116979316979321*G0_0_1_2_4 - 0.00615680615680643*G0_0_1_2_5 + 0.0178547378547385*G0_0_1_3_0 - 0.000615680615680701*G0_0_1_3_1 - 0.018470418470419*G0_0_1_3_2 + 0.0985088985089019*G0_0_1_3_3 - 0.119031585698257*G0_0_1_3_4 - 0.0233958633958643*G0_0_1_3_5 + 0.0724450857784217*G0_0_1_4_0 + 0.0416610549943898*G0_0_1_4_1 - 0.116979316979321*G0_0_1_4_2 - 0.119031585698257*G0_0_1_4_3 - 0.574635241301929*G0_0_1_4_4 - 0.071008497675167*G0_0_1_4_5 + 0.0152894019560693*G0_0_1_5_0 + 0.00790123456790139*G0_0_1_5_1 - 0.00615680615680643*G0_0_1_5_2 - 0.0233958633958643*G0_0_1_5_3 - 0.071008497675167*G0_0_1_5_4 - 0.00164181497514846*G0_0_1_5_5 - 0.186140772807446*G0_1_1_0_0 + 0.0126214526214531*G0_1_1_0_1 + 0.0342215808882487*G0_1_1_0_2 + 0.0181625781625788*G0_1_1_0_3 + 0.00564373897707264*G0_1_1_0_4 - 0.0837325637325666*G0_1_1_0_5 + 0.0126214526214531*G0_1_1_1_0 - 0.00790123456790172*G0_1_1_1_1 + 0.00779862113195471*G0_1_1_1_2 + 0.0156998556998562*G0_1_1_1_3 + 0.0542825076158428*G0_1_1_1_4 + 0.0427898027898042*G0_1_1_1_5 + 0.0342215808882487*G0_1_1_2_0 + 0.00779862113195471*G0_1_1_2_1 - 0.270386403719746*G0_1_1_2_2 - 0.0287317620650963*G0_1_1_2_3 - 0.0882475549142248*G0_1_1_2_4 + 0.00954304954304979*G0_1_1_2_5 + 0.0181625781625788*G0_1_1_3_0 + 0.0156998556998562*G0_1_1_3_1 - 0.0287317620650963*G0_1_1_3_2 + 0.0258585858585868*G0_1_1_3_3 - 0.144890171556843*G0_1_1_3_4 - 0.0554112554112573*G0_1_1_3_5 + 0.00564373897707264*G0_1_1_4_0 + 0.0542825076158428*G0_1_1_4_1 - 0.0882475549142249*G0_1_1_4_2 - 0.144890171556843*G0_1_1_4_3 - 0.511835818502503*G0_1_1_4_4 - 0.127651114317785*G0_1_1_4_5 - 0.0837325637325667*G0_1_1_5_0 + 0.0427898027898042*G0_1_1_5_1 + 0.00954304954304979*G0_1_1_5_2 - 0.0554112554112573*G0_1_1_5_3 - 0.127651114317785*G0_1_1_5_4 - 0.239294532627874*G0_1_1_5_5; + A[97] = A[113] - 0.0411479878146559*G0_0_0_0_0 + 0.000615680615680633*G0_0_0_0_1 + 0.00728555395222095*G0_0_0_0_2 + 0.00820907487574185*G0_0_0_0_3 + 0.0297578964245642*G0_0_0_0_4 - 0.0103639570306241*G0_0_0_0_5 + 0.000615680615680633*G0_0_0_1_0 - 0.000513067179733879*G0_0_0_1_1 - 0.0156998556998562*G0_0_0_1_2 - 0.00143658810325481*G0_0_0_1_3 + 0.0110822510822515*G0_0_0_1_4 + 0.00708032708032732*G0_0_0_1_5 + 0.00728555395222095*G0_0_0_2_0 - 0.0156998556998562*G0_0_0_2_1 + 0.289369889369898*G0_0_0_2_2 + 0.0724450857784214*G0_0_0_2_3 - 0.0478178611511964*G0_0_0_2_4 - 0.000820907487574158*G0_0_0_2_5 + 0.00820907487574185*G0_0_0_3_0 - 0.00143658810325481*G0_0_0_3_1 + 0.0724450857784214*G0_0_0_3_2 - 0.021343594676929*G0_0_0_3_3 - 0.0385826519159867*G0_0_0_3_4 - 0.0147763347763353*G0_0_0_3_5 + 0.0297578964245642*G0_0_0_4_0 + 0.0110822510822515*G0_0_0_4_1 - 0.0478178611511965*G0_0_0_4_2 - 0.0385826519159867*G0_0_0_4_3 - 0.0738816738816768*G0_0_0_4_4 - 0.0205226871893546*G0_0_0_4_5 - 0.0103639570306241*G0_0_0_5_0 + 0.00708032708032732*G0_0_0_5_1 - 0.000820907487574158*G0_0_0_5_2 - 0.0147763347763353*G0_0_0_5_3 - 0.0205226871893546*G0_0_0_5_4 - 0.0238063171396513*G0_0_0_5_5 - 0.0133397466730809*G0_0_1_0_0 + 0.00790123456790155*G0_0_1_0_1 + 0.0072855539522209*G0_0_1_0_2 - 0.0155972422639095*G0_0_1_0_3 - 0.156998556998562*G0_0_1_0_4 - 0.0177521244187919*G0_0_1_0_5 + 0.00790123456790155*G0_0_1_1_0 - 0.000513067179733846*G0_0_1_1_1 - 0.0229854096520771*G0_0_1_1_2 - 0.00348885682219028*G0_0_1_1_3 + 0.0110822510822514*G0_0_1_1_4 + 0.00913259579926283*G0_0_1_1_5 + 0.0072855539522209*G0_0_1_2_0 - 0.0229854096520771*G0_0_1_2_1 + 0.261561648228323*G0_0_1_2_2 + 0.0798332531665893*G0_0_1_2_3 + 0.13893859227193*G0_0_1_2_4 + 0.0229854096520772*G0_0_1_2_5 - 0.0155972422639095*G0_0_1_3_0 - 0.00348885682219028*G0_0_1_3_1 + 0.0798332531665893*G0_0_1_3_2 - 0.00985088985089011*G0_0_1_3_3 + 0.00902998236331612*G0_0_1_3_4 - 0.0147763347763353*G0_0_1_3_5 - 0.156998556998562*G0_0_1_4_0 + 0.0110822510822514*G0_0_1_4_1 + 0.13893859227193*G0_0_1_4_2 + 0.00902998236331611*G0_0_1_4_3 - 0.0738816738816754*G0_0_1_4_4 - 0.068135321468657*G0_0_1_4_5 - 0.0177521244187919*G0_0_1_5_0 + 0.00913259579926283*G0_0_1_5_1 + 0.0229854096520772*G0_0_1_5_2 - 0.0147763347763353*G0_0_1_5_3 - 0.068135321468657*G0_0_1_5_4 - 0.03529902196569*G0_0_1_5_5 + 0.0307840307840323*G0_1_0_0_0 - 0.00697771364438058*G0_1_0_0_1 + 0.00728555395222092*G0_1_0_0_2 + 0.0153920153920159*G0_1_0_0_3 + 0.0663908930575621*G0_1_0_0_4 + 0.0180599647266322*G0_1_0_0_5 - 0.00697771364438058*G0_1_0_1_0 - 0.00051306717973389*G0_1_0_1_1 - 0.00810646143979498*G0_1_0_1_2 + 0.0037966971300306*G0_1_0_1_3 + 0.0110822510822515*G0_1_0_1_4 + 0.00184704184704187*G0_1_0_1_5 + 0.00728555395222092*G0_1_0_2_0 - 0.00810646143979498*G0_1_0_2_1 + 0.21743787077121*G0_1_0_2_2 + 0.0440211640211654*G0_1_0_2_3 - 0.0844508577841943*G0_1_0_2_4 - 0.00800384800384827*G0_1_0_2_5 + 0.0153920153920159*G0_1_0_3_0 + 0.0037966971300306*G0_1_0_3_1 + 0.0440211640211654*G0_1_0_3_2 - 0.0451499118165802*G0_1_0_3_3 - 0.0529485329485348*G0_1_0_3_4 - 0.0147763347763353*G0_1_0_3_5 + 0.0663908930575621*G0_1_0_4_0 + 0.0110822510822515*G0_1_0_4_1 - 0.0844508577841942*G0_1_0_4_2 - 0.0529485329485348*G0_1_0_4_3 - 0.0738816738816769*G0_1_0_4_4 - 0.00615680615680641*G0_1_0_4_5 + 0.0180599647266322*G0_1_0_5_0 + 0.00184704184704187*G0_1_0_5_1 - 0.00800384800384827*G0_1_0_5_2 - 0.0147763347763353*G0_1_0_5_3 - 0.00615680615680641*G0_1_0_5_4 - 0.230777617444292*G0_1_1_0_0 + 0.0160076960076965*G0_1_1_0_1 - 0.00759339426006114*G0_1_1_0_3 - 0.0725476992143684*G0_1_1_0_4 - 0.0617732884399573*G0_1_1_0_5 + 0.0160076960076965*G0_1_1_1_0 - 0.0160076960076965*G0_1_1_1_2 - 0.00533589866923221*G0_1_1_1_3 + 0.00533589866923217*G0_1_1_1_5 - 0.0160076960076965*G0_1_1_2_1 + 0.230777617444291*G0_1_1_2_2 + 0.0617732884399572*G0_1_1_2_3 + 0.0725476992143684*G0_1_1_2_4 + 0.00759339426006124*G0_1_1_2_5 - 0.00759339426006115*G0_1_1_3_0 - 0.0053358986692322*G0_1_1_3_1 + 0.0617732884399572*G0_1_1_3_2 - 0.00985088985089014*G0_1_1_3_3 + 0.0151867885201225*G0_1_1_3_4 - 0.0725476992143684*G0_1_1_4_0 + 0.0725476992143684*G0_1_1_4_2 + 0.0151867885201225*G0_1_1_4_3 - 0.0151867885201223*G0_1_1_4_5 - 0.0617732884399573*G0_1_1_5_0 + 0.00533589866923217*G0_1_1_5_1 + 0.00759339426006124*G0_1_1_5_2 - 0.0151867885201223*G0_1_1_5_4 + 0.00985088985088997*G0_1_1_5_5; + A[111] = A[97] + 0.0543851210517903*G0_0_1_0_0 - 0.00784992784992818*G0_0_1_0_1 - 0.0258072791406134*G0_0_1_0_2 + 0.00954304954304987*G0_0_1_0_3 + 0.142632675966014*G0_0_1_0_4 + 0.0246272246272257*G0_0_1_0_5 - 0.00784992784992818*G0_0_1_1_0 + 0.00441237774571122*G0_0_1_1_1 + 0.00702902036235395*G0_0_1_1_2 - 0.00738816738816764*G0_0_1_1_3 - 0.0413532146865494*G0_0_1_1_4 - 0.0146737213403886*G0_0_1_1_5 - 0.0258072791406134*G0_0_1_2_0 + 0.00702902036235395*G0_0_1_2_1 + 0.010261343594677*G0_0_1_2_2 - 0.0111848645181983*G0_0_1_2_3 - 0.0807567740901101*G0_0_1_2_4 - 0.0214462081128755*G0_0_1_2_5 + 0.00954304954304987*G0_0_1_3_0 - 0.00738816738816764*G0_0_1_3_1 - 0.0111848645181983*G0_0_1_3_2 + 0.00738816738816761*G0_0_1_3_3 + 0.063620330286999*G0_0_1_3_4 + 0.0238063171396513*G0_0_1_3_5 + 0.142632675966014*G0_0_1_4_0 - 0.0413532146865494*G0_0_1_4_1 - 0.0807567740901101*G0_0_1_4_2 + 0.063620330286999*G0_0_1_4_3 + 0.625531505531526*G0_0_1_4_4 + 0.12559884559885*G0_0_1_4_5 + 0.0246272246272257*G0_0_1_5_0 - 0.0146737213403886*G0_0_1_5_1 - 0.0214462081128755*G0_0_1_5_2 + 0.0238063171396513*G0_0_1_5_3 + 0.12559884559885*G0_0_1_5_4 + 0.0426871893538578*G0_0_1_5_5 - 0.0543851210517903*G0_1_0_0_0 + 0.00784992784992818*G0_1_0_0_1 + 0.0258072791406134*G0_1_0_0_2 - 0.00954304954304987*G0_1_0_0_3 - 0.142632675966014*G0_1_0_0_4 - 0.0246272246272257*G0_1_0_0_5 + 0.00784992784992818*G0_1_0_1_0 - 0.00441237774571122*G0_1_0_1_1 - 0.00702902036235395*G0_1_0_1_2 + 0.00738816738816764*G0_1_0_1_3 + 0.0413532146865494*G0_1_0_1_4 + 0.0146737213403886*G0_1_0_1_5 + 0.0258072791406134*G0_1_0_2_0 - 0.00702902036235395*G0_1_0_2_1 - 0.010261343594677*G0_1_0_2_2 + 0.0111848645181983*G0_1_0_2_3 + 0.0807567740901101*G0_1_0_2_4 + 0.0214462081128755*G0_1_0_2_5 - 0.00954304954304987*G0_1_0_3_0 + 0.00738816738816764*G0_1_0_3_1 + 0.0111848645181983*G0_1_0_3_2 - 0.00738816738816764*G0_1_0_3_3 - 0.063620330286999*G0_1_0_3_4 - 0.0238063171396513*G0_1_0_3_5 - 0.142632675966014*G0_1_0_4_0 + 0.0413532146865494*G0_1_0_4_1 + 0.0807567740901101*G0_1_0_4_2 - 0.063620330286999*G0_1_0_4_3 - 0.625531505531526*G0_1_0_4_4 - 0.12559884559885*G0_1_0_4_5 - 0.0246272246272257*G0_1_0_5_0 + 0.0146737213403886*G0_1_0_5_1 + 0.0214462081128755*G0_1_0_5_2 - 0.0238063171396513*G0_1_0_5_3 - 0.12559884559885*G0_1_0_5_4 - 0.0426871893538578*G0_1_0_5_5; + A[159] = A[97] - 0.357607824274504*G0_0_0_0_0 + 0.0317075517075527*G0_0_0_0_1 + 0.0118005451338789*G0_0_0_0_2 - 0.00605419272085956*G0_0_0_0_3 - 0.141606541606547*G0_0_0_0_4 - 0.0687510020843379*G0_0_0_0_5 + 0.0317075517075527*G0_0_0_1_0 - 0.161718775052114*G0_0_0_1_1 - 0.00584896584896603*G0_0_0_1_2 - 0.0978932178932212*G0_0_0_1_3 + 0.00277056277056288*G0_0_0_1_4 - 0.0173416706750047*G0_0_0_1_5 + 0.0118005451338789*G0_0_0_2_0 - 0.00584896584896603*G0_0_0_2_1 + 0.160795254128592*G0_0_0_2_2 + 0.115234888568226*G0_0_0_2_3 + 0.0971749238415938*G0_0_0_2_4 + 0.0407375340708689*G0_0_0_2_5 - 0.00605419272085956*G0_0_0_3_0 - 0.0978932178932212*G0_0_0_3_1 + 0.115234888568226*G0_0_0_3_2 + 0.00410453743787137*G0_0_0_3_3 + 0.00656725990059356*G0_0_0_3_4 - 0.0693666827000184*G0_0_0_3_5 - 0.141606541606547*G0_0_0_4_0 + 0.00277056277056288*G0_0_0_4_1 + 0.0971749238415938*G0_0_0_4_2 + 0.00656725990059357*G0_0_0_4_3 - 0.196196889530229*G0_0_0_4_4 - 0.0870161936828633*G0_0_0_4_5 - 0.0687510020843379*G0_0_0_5_0 - 0.0173416706750047*G0_0_0_5_1 + 0.0407375340708689*G0_0_0_5_2 - 0.0693666827000184*G0_0_0_5_3 - 0.0870161936828633*G0_0_0_5_4 - 0.360378387045067*G0_0_0_5_5 + 0.0312457912457923*G0_0_1_0_1 - 0.0312457912457923*G0_0_1_0_2 + 0.0944043610710309*G0_0_1_0_4 - 0.0944043610710309*G0_0_1_0_5 + 0.0312457912457923*G0_0_1_1_0 - 0.167054673721346*G0_0_1_1_1 - 0.102818662818666*G0_0_1_1_3 - 0.0309892576559254*G0_0_1_1_4 + 0.000410453743787039*G0_0_1_1_5 - 0.0312457912457923*G0_0_1_2_0 + 0.167054673721345*G0_0_1_2_2 + 0.102818662818666*G0_0_1_2_3 - 0.00041045374378699*G0_0_1_2_4 + 0.0309892576559255*G0_0_1_2_5 - 0.102818662818666*G0_0_1_3_1 + 0.102818662818666*G0_0_1_3_2 + 0.0619785153118508*G0_0_1_3_4 - 0.0619785153118507*G0_0_1_3_5 + 0.0944043610710309*G0_0_1_4_0 - 0.0309892576559254*G0_0_1_4_1 - 0.000410453743786995*G0_0_1_4_2 + 0.0619785153118508*G0_0_1_4_3 + 0.504858104858122*G0_0_1_4_4 - 0.094404361071031*G0_0_1_5_0 + 0.00041045374378704*G0_0_1_5_1 + 0.0309892576559255*G0_0_1_5_2 - 0.0619785153118507*G0_0_1_5_3 - 0.504858104858123*G0_0_1_5_5 + 0.0132884399551071*G0_1_0_0_1 - 0.013288439955107*G0_1_0_0_2 - 0.0236010902677579*G0_1_0_0_4 + 0.0236010902677577*G0_1_0_0_5 + 0.0132884399551071*G0_1_0_1_0 - 0.16120570787238*G0_1_0_1_1 - 0.106615359948697*G0_1_0_1_3 - 0.0110822510822515*G0_1_0_1_4 - 0.0656725990059347*G0_1_0_1_5 - 0.013288439955107*G0_1_0_2_0 + 0.16120570787238*G0_1_0_2_2 + 0.106615359948697*G0_1_0_2_3 + 0.0656725990059346*G0_1_0_2_4 + 0.0110822510822515*G0_1_0_2_5 - 0.106615359948697*G0_1_0_3_1 + 0.106615359948697*G0_1_0_3_2 + 0.022164502164503*G0_1_0_3_4 - 0.0221645021645029*G0_1_0_3_5 - 0.0236010902677579*G0_1_0_4_0 - 0.0110822510822515*G0_1_0_4_1 + 0.0656725990059346*G0_1_0_4_2 + 0.022164502164503*G0_1_0_4_3 - 0.077986211319547*G0_1_0_4_4 + 0.0236010902677577*G0_1_0_5_0 - 0.0656725990059347*G0_1_0_5_1 + 0.0110822510822515*G0_1_0_5_2 - 0.0221645021645029*G0_1_0_5_3 + 0.0779862113195472*G0_1_0_5_5 + 0.357607824274503*G0_1_1_0_0 - 0.0118005451338789*G0_1_1_0_1 - 0.0317075517075528*G0_1_1_0_2 + 0.00605419272085953*G0_1_1_0_3 + 0.0687510020843377*G0_1_1_0_4 + 0.141606541606547*G0_1_1_0_5 - 0.0118005451338789*G0_1_1_1_0 - 0.160795254128593*G0_1_1_1_1 + 0.00584896584896604*G0_1_1_1_2 - 0.115234888568226*G0_1_1_1_3 - 0.0407375340708688*G0_1_1_1_4 - 0.0971749238415939*G0_1_1_1_5 - 0.0317075517075528*G0_1_1_2_0 + 0.00584896584896605*G0_1_1_2_1 + 0.161718775052114*G0_1_1_2_2 + 0.0978932178932212*G0_1_1_2_3 + 0.0173416706750047*G0_1_1_2_4 - 0.00277056277056284*G0_1_1_2_5 + 0.00605419272085953*G0_1_1_3_0 - 0.115234888568226*G0_1_1_3_1 + 0.0978932178932212*G0_1_1_3_2 - 0.00410453743787079*G0_1_1_3_3 + 0.0693666827000183*G0_1_1_3_4 - 0.00656725990059345*G0_1_1_3_5 + 0.0687510020843377*G0_1_1_4_0 - 0.0407375340708688*G0_1_1_4_1 + 0.0173416706750047*G0_1_1_4_2 + 0.0693666827000184*G0_1_1_4_3 + 0.360378387045066*G0_1_1_4_4 + 0.0870161936828633*G0_1_1_4_5 + 0.141606541606547*G0_1_1_5_0 - 0.0971749238415939*G0_1_1_5_1 - 0.00277056277056284*G0_1_1_5_2 - 0.00656725990059345*G0_1_1_5_3 + 0.0870161936828633*G0_1_1_5_4 + 0.19619688953023*G0_1_1_5_5; + A[79] = A[65] - 0.00441237774571122*G0_0_1_0_0 - 0.00702902036235392*G0_0_1_0_1 + 0.00784992784992808*G0_0_1_0_2 + 0.0413532146865493*G0_0_1_0_3 + 0.0146737213403885*G0_0_1_0_4 + 0.00738816738816761*G0_0_1_0_5 - 0.00702902036235392*G0_0_1_1_0 - 0.0102613435946772*G0_0_1_1_1 + 0.0258072791406134*G0_0_1_1_2 + 0.0807567740901102*G0_0_1_1_3 + 0.0214462081128755*G0_0_1_1_4 + 0.0111848645181983*G0_0_1_1_5 + 0.00784992784992808*G0_0_1_2_0 + 0.0258072791406134*G0_0_1_2_1 - 0.0543851210517894*G0_0_1_2_2 - 0.142632675966014*G0_0_1_2_3 - 0.0246272246272254*G0_0_1_2_4 - 0.00954304954304989*G0_0_1_2_5 + 0.0413532146865493*G0_0_1_3_0 + 0.0807567740901102*G0_0_1_3_1 - 0.142632675966014*G0_0_1_3_2 - 0.625531505531527*G0_0_1_3_3 - 0.12559884559885*G0_0_1_3_4 - 0.0636203302869992*G0_0_1_3_5 + 0.0146737213403885*G0_0_1_4_0 + 0.0214462081128755*G0_0_1_4_1 - 0.0246272246272254*G0_0_1_4_2 - 0.12559884559885*G0_0_1_4_3 - 0.0426871893538574*G0_0_1_4_4 - 0.0238063171396513*G0_0_1_4_5 + 0.00738816738816761*G0_0_1_5_0 + 0.0111848645181983*G0_0_1_5_1 - 0.00954304954304989*G0_0_1_5_2 - 0.0636203302869992*G0_0_1_5_3 - 0.0238063171396513*G0_0_1_5_4 - 0.00738816738816777*G0_0_1_5_5 + 0.00441237774571122*G0_1_0_0_0 + 0.00702902036235391*G0_1_0_0_1 - 0.00784992784992808*G0_1_0_0_2 - 0.0413532146865493*G0_1_0_0_3 - 0.0146737213403885*G0_1_0_0_4 - 0.00738816738816761*G0_1_0_0_5 + 0.00702902036235392*G0_1_0_1_0 + 0.0102613435946772*G0_1_0_1_1 - 0.0258072791406134*G0_1_0_1_2 - 0.0807567740901102*G0_1_0_1_3 - 0.0214462081128755*G0_1_0_1_4 - 0.0111848645181983*G0_1_0_1_5 - 0.00784992784992808*G0_1_0_2_0 - 0.0258072791406134*G0_1_0_2_1 + 0.0543851210517894*G0_1_0_2_2 + 0.142632675966014*G0_1_0_2_3 + 0.0246272246272254*G0_1_0_2_4 + 0.00954304954304989*G0_1_0_2_5 - 0.0413532146865493*G0_1_0_3_0 - 0.0807567740901102*G0_1_0_3_1 + 0.142632675966014*G0_1_0_3_2 + 0.625531505531527*G0_1_0_3_3 + 0.12559884559885*G0_1_0_3_4 + 0.0636203302869992*G0_1_0_3_5 - 0.0146737213403885*G0_1_0_4_0 - 0.0214462081128755*G0_1_0_4_1 + 0.0246272246272254*G0_1_0_4_2 + 0.12559884559885*G0_1_0_4_3 + 0.0426871893538574*G0_1_0_4_4 + 0.0238063171396513*G0_1_0_4_5 - 0.00738816738816761*G0_1_0_5_0 - 0.0111848645181983*G0_1_0_5_1 + 0.00954304954304989*G0_1_0_5_2 + 0.0636203302869992*G0_1_0_5_3 + 0.0238063171396513*G0_1_0_5_4 + 0.00738816738816777*G0_1_0_5_5; + A[187] = A[117] - 0.0123136123136127*G0_0_1_0_0 - 0.00215488215488221*G0_0_1_0_1 - 0.0252429052429061*G0_0_1_0_2 + 0.0166233766233771*G0_0_1_0_3 + 0.183164983164989*G0_0_1_0_4 - 0.00769600769600815*G0_0_1_0_5 - 0.00215488215488221*G0_0_1_1_0 - 0.00677248677248708*G0_0_1_1_1 + 0.00277056277056289*G0_0_1_1_2 + 0.0138528138528143*G0_0_1_1_3 + 0.00861952861952887*G0_0_1_1_4 + 0.0243193843193851*G0_0_1_1_5 - 0.0252429052429061*G0_0_1_2_0 + 0.00277056277056289*G0_0_1_2_1 - 0.015392015392016*G0_0_1_2_2 - 0.00831168831168869*G0_0_1_2_3 - 0.0735738335738362*G0_0_1_2_4 + 0.00800384800384822*G0_0_1_2_5 + 0.0166233766233772*G0_0_1_3_0 + 0.0138528138528143*G0_0_1_3_1 - 0.00831168831168867*G0_0_1_3_2 - 0.0714189514189543*G0_0_1_3_3 - 0.0504858104858122*G0_0_1_3_4 - 0.0492544492544508*G0_0_1_3_5 + 0.183164983164989*G0_0_1_4_0 + 0.00861952861952887*G0_0_1_4_1 - 0.0735738335738362*G0_0_1_4_2 - 0.0504858104858122*G0_0_1_4_3 + 0.236421356421364*G0_0_1_4_4 - 0.0332467532467543*G0_0_1_4_5 - 0.00769600769600816*G0_0_1_5_0 + 0.0243193843193851*G0_0_1_5_1 + 0.00800384800384822*G0_0_1_5_2 - 0.0492544492544508*G0_0_1_5_3 - 0.0332467532467544*G0_0_1_5_4 - 0.14530062530063*G0_0_1_5_5 + 0.0123136123136127*G0_1_0_0_0 + 0.00215488215488221*G0_1_0_0_1 + 0.0252429052429061*G0_1_0_0_2 - 0.0166233766233772*G0_1_0_0_3 - 0.183164983164989*G0_1_0_0_4 + 0.00769600769600814*G0_1_0_0_5 + 0.00215488215488221*G0_1_0_1_0 + 0.00677248677248708*G0_1_0_1_1 - 0.00277056277056289*G0_1_0_1_2 - 0.0138528138528143*G0_1_0_1_3 - 0.00861952861952887*G0_1_0_1_4 - 0.0243193843193851*G0_1_0_1_5 + 0.0252429052429061*G0_1_0_2_0 - 0.00277056277056289*G0_1_0_2_1 + 0.015392015392016*G0_1_0_2_2 + 0.00831168831168869*G0_1_0_2_3 + 0.0735738335738362*G0_1_0_2_4 - 0.00800384800384822*G0_1_0_2_5 - 0.0166233766233772*G0_1_0_3_0 - 0.0138528138528143*G0_1_0_3_1 + 0.0083116883116887*G0_1_0_3_2 + 0.0714189514189543*G0_1_0_3_3 + 0.0504858104858122*G0_1_0_3_4 + 0.0492544492544508*G0_1_0_3_5 - 0.183164983164989*G0_1_0_4_0 - 0.00861952861952887*G0_1_0_4_1 + 0.0735738335738362*G0_1_0_4_2 + 0.0504858104858122*G0_1_0_4_3 - 0.236421356421364*G0_1_0_4_4 + 0.0332467532467543*G0_1_0_4_5 + 0.00769600769600814*G0_1_0_5_0 - 0.0243193843193851*G0_1_0_5_1 - 0.00800384800384822*G0_1_0_5_2 + 0.0492544492544508*G0_1_0_5_3 + 0.0332467532467543*G0_1_0_5_4 + 0.14530062530063*G0_1_0_5_5; + A[82] = A[110] - 0.00615680615680635*G0_0_1_0_0 + 0.000307840307840302*G0_0_1_0_1 + 0.0042584575917911*G0_0_1_0_2 + 0.003591470258137*G0_0_1_0_3 + 0.00831168831168852*G0_0_1_0_4 - 0.00410453743787093*G0_0_1_0_5 + 0.000307840307840303*G0_0_1_1_0 - 0.00153920153920135*G0_0_1_1_1 - 0.0013852813852814*G0_0_1_1_2 + 0.0152894019560692*G0_0_1_1_3 - 0.00030784030784034*G0_0_1_1_4 - 0.000513067179733777*G0_0_1_1_5 + 0.0042584575917911*G0_0_1_2_0 - 0.0013852813852814*G0_0_1_2_1 + 0.224210357543697*G0_0_1_2_2 - 0.00615680615680655*G0_0_1_2_3 - 0.0256533589866933*G0_0_1_2_4 - 0.00338624338624347*G0_0_1_2_5 + 0.003591470258137*G0_0_1_3_0 + 0.0152894019560692*G0_0_1_3_1 - 0.00615680615680655*G0_0_1_3_2 - 0.14119608786276*G0_0_1_3_3 - 0.00656725990059335*G0_0_1_3_4 - 0.000410453743787053*G0_0_1_3_5 + 0.00831168831168852*G0_0_1_4_0 - 0.000307840307840339*G0_0_1_4_1 - 0.0256533589866933*G0_0_1_4_2 - 0.00656725990059336*G0_0_1_4_3 - 0.050896264229599*G0_0_1_4_4 + 0.00738816738816768*G0_0_1_4_5 - 0.00410453743787093*G0_0_1_5_0 - 0.000513067179733777*G0_0_1_5_1 - 0.00338624338624348*G0_0_1_5_2 - 0.000410453743787057*G0_0_1_5_3 + 0.00738816738816768*G0_0_1_5_4 - 0.00574635241301909*G0_0_1_5_5 + 0.00615680615680635*G0_1_0_0_0 - 0.000307840307840302*G0_1_0_0_1 - 0.0042584575917911*G0_1_0_0_2 - 0.003591470258137*G0_1_0_0_3 - 0.00831168831168852*G0_1_0_0_4 + 0.00410453743787093*G0_1_0_0_5 - 0.000307840307840303*G0_1_0_1_0 + 0.00153920153920135*G0_1_0_1_1 + 0.0013852813852814*G0_1_0_1_2 - 0.0152894019560692*G0_1_0_1_3 + 0.000307840307840335*G0_1_0_1_4 + 0.000513067179733776*G0_1_0_1_5 - 0.0042584575917911*G0_1_0_2_0 + 0.0013852813852814*G0_1_0_2_1 - 0.224210357543697*G0_1_0_2_2 + 0.00615680615680655*G0_1_0_2_3 + 0.0256533589866933*G0_1_0_2_4 + 0.00338624338624348*G0_1_0_2_5 - 0.003591470258137*G0_1_0_3_0 - 0.0152894019560692*G0_1_0_3_1 + 0.00615680615680655*G0_1_0_3_2 + 0.14119608786276*G0_1_0_3_3 + 0.00656725990059337*G0_1_0_3_4 + 0.000410453743787059*G0_1_0_3_5 - 0.00831168831168852*G0_1_0_4_0 + 0.000307840307840332*G0_1_0_4_1 + 0.0256533589866933*G0_1_0_4_2 + 0.00656725990059337*G0_1_0_4_3 + 0.050896264229599*G0_1_0_4_4 - 0.00738816738816768*G0_1_0_4_5 + 0.00410453743787093*G0_1_0_5_0 + 0.000513067179733776*G0_1_0_5_1 + 0.00338624338624348*G0_1_0_5_2 + 0.000410453743787059*G0_1_0_5_3 - 0.00738816738816768*G0_1_0_5_4 + 0.00574635241301909*G0_1_0_5_5; + A[153] = A[82] - 0.0181625781625788*G0_0_0_0_0 + 0.0018983485650153*G0_0_0_0_1 + 0.00954304954304977*G0_0_0_0_2 + 0.00841430174763531*G0_0_0_0_3 - 0.0336572069905415*G0_0_0_0_4 + 0.0122109988776659*G0_0_0_0_5 + 0.0018983485650153*G0_0_0_1_0 + 0.122623055956393*G0_0_0_1_1 + 0.0133397466730804*G0_0_0_1_2 + 0.132371332371337*G0_0_0_1_3 + 0.00328362995029672*G0_0_0_1_4 - 0.00543851210517881*G0_0_0_1_5 + 0.00954304954304977*G0_0_0_2_0 + 0.0133397466730804*G0_0_0_2_1 - 0.458066378066392*G0_0_0_2_2 - 0.177316017316023*G0_0_0_2_3 - 0.001231361231361*G0_0_0_2_4 + 0.0143658810325481*G0_0_0_2_5 + 0.00841430174763531*G0_0_0_3_0 + 0.132371332371337*G0_0_0_3_1 - 0.177316017316023*G0_0_0_3_2 + 0.0332467532467544*G0_0_0_3_3 - 0.0233958633958641*G0_0_0_3_4 - 0.045560365560367*G0_0_0_3_5 - 0.0336572069905415*G0_0_0_4_0 + 0.00328362995029672*G0_0_0_4_1 - 0.001231361231361*G0_0_0_4_2 - 0.0233958633958641*G0_0_0_4_3 + 0.0406349206349225*G0_0_0_4_4 - 0.0352990219656898*G0_0_0_4_5 + 0.0122109988776659*G0_0_0_5_0 - 0.0054385121051788*G0_0_0_5_1 + 0.0143658810325481*G0_0_0_5_2 - 0.045560365560367*G0_0_0_5_3 - 0.0352990219656898*G0_0_0_5_4 - 0.127651114317785*G0_0_0_5_5 + 0.00097482764149435*G0_0_1_0_1 - 0.000974827641494415*G0_0_1_0_2 - 0.0247298380631723*G0_0_1_0_4 + 0.0247298380631721*G0_0_1_0_5 + 0.000974827641494347*G0_0_1_1_0 + 0.379156645823326*G0_0_1_1_1 + 0.146839826839832*G0_0_1_1_3 - 0.0080038480038483*G0_0_1_1_4 - 0.020625300625301*G0_0_1_1_5 - 0.000974827641494415*G0_0_1_2_0 - 0.379156645823324*G0_0_1_2_2 - 0.146839826839832*G0_0_1_2_3 + 0.0206253006253016*G0_0_1_2_4 + 0.00800384800384819*G0_0_1_2_5 + 0.146839826839832*G0_0_1_3_1 - 0.146839826839832*G0_0_1_3_2 + 0.0160076960076966*G0_0_1_3_4 - 0.0160076960076964*G0_0_1_3_5 - 0.0247298380631723*G0_0_1_4_0 - 0.0080038480038483*G0_0_1_4_1 + 0.0206253006253016*G0_0_1_4_2 + 0.0160076960076966*G0_0_1_4_3 + 0.151867885201224*G0_0_1_4_4 + 0.0247298380631721*G0_0_1_5_0 - 0.020625300625301*G0_0_1_5_1 + 0.00800384800384819*G0_0_1_5_2 - 0.0160076960076964*G0_0_1_5_3 - 0.151867885201224*G0_0_1_5_5 - 0.00297578964245642*G0_1_0_0_1 + 0.00297578964245635*G0_1_0_0_2 - 0.0123136123136128*G0_1_0_0_4 + 0.0123136123136126*G0_1_0_0_5 - 0.00297578964245642*G0_1_0_1_0 + 0.153407086740425*G0_1_0_1_1 + 0.168286034952707*G0_1_0_1_3 - 0.00492544492544512*G0_1_0_1_4 + 0.00451499118165825*G0_1_0_1_5 + 0.00297578964245635*G0_1_0_2_0 - 0.153407086740425*G0_1_0_2_2 - 0.168286034952707*G0_1_0_2_3 - 0.00451499118165782*G0_1_0_2_4 + 0.00492544492544501*G0_1_0_2_5 + 0.168286034952707*G0_1_0_3_1 - 0.168286034952707*G0_1_0_3_2 + 0.00985088985089033*G0_1_0_3_4 - 0.00985088985088996*G0_1_0_3_5 - 0.0123136123136128*G0_1_0_4_0 - 0.00492544492544512*G0_1_0_4_1 - 0.00451499118165782*G0_1_0_4_2 + 0.00985088985089034*G0_1_0_4_3 + 0.106717973384644*G0_1_0_4_4 + 0.0123136123136126*G0_1_0_5_0 + 0.00451499118165824*G0_1_0_5_1 + 0.00492544492544501*G0_1_0_5_2 - 0.00985088985088996*G0_1_0_5_3 - 0.106717973384643*G0_1_0_5_5 + 0.0181625781625787*G0_1_1_0_0 - 0.00954304954304989*G0_1_1_0_1 - 0.00189834856501533*G0_1_1_0_2 - 0.00841430174763542*G0_1_1_0_3 - 0.012210998877666*G0_1_1_0_4 + 0.0336572069905414*G0_1_1_0_5 - 0.00954304954304989*G0_1_1_1_0 + 0.458066378066394*G0_1_1_1_1 - 0.0133397466730805*G0_1_1_1_2 + 0.177316017316023*G0_1_1_1_3 - 0.0143658810325482*G0_1_1_1_4 + 0.00123136123136181*G0_1_1_1_5 - 0.00189834856501533*G0_1_1_2_0 - 0.0133397466730805*G0_1_1_2_1 - 0.122623055956393*G0_1_1_2_2 - 0.132371332371337*G0_1_1_2_3 + 0.0054385121051791*G0_1_1_2_4 - 0.0032836299502968*G0_1_1_2_5 - 0.00841430174763542*G0_1_1_3_0 + 0.177316017316023*G0_1_1_3_1 - 0.132371332371337*G0_1_1_3_2 - 0.0332467532467547*G0_1_1_3_3 + 0.0455603655603672*G0_1_1_3_4 + 0.0233958633958644*G0_1_1_3_5 - 0.012210998877666*G0_1_1_4_0 - 0.0143658810325482*G0_1_1_4_1 + 0.00543851210517911*G0_1_1_4_2 + 0.0455603655603672*G0_1_1_4_3 + 0.127651114317786*G0_1_1_4_4 + 0.0352990219656899*G0_1_1_4_5 + 0.0336572069905414*G0_1_1_5_0 + 0.0012313612313618*G0_1_1_5_1 - 0.0032836299502968*G0_1_1_5_2 + 0.0233958633958644*G0_1_1_5_3 + 0.0352990219656899*G0_1_1_5_4 - 0.0406349206349213*G0_1_1_5_5; + A[100] = A[153] + 0.146531986531992*G0_0_0_0_0 - 0.0208305274971949*G0_0_0_0_2 - 0.00102613435946773*G0_0_0_0_3 + 0.116774090107427*G0_0_0_0_4 - 0.0213435946769285*G0_0_0_0_5 - 0.146531986531991*G0_0_0_1_1 + 0.0208305274971949*G0_0_0_1_2 - 0.116774090107428*G0_0_0_1_3 + 0.00102613435946771*G0_0_0_1_4 + 0.0213435946769285*G0_0_0_1_5 - 0.0208305274971949*G0_0_0_2_0 + 0.0208305274971949*G0_0_0_2_1 + 0.0324258457591803*G0_0_0_2_3 - 0.0324258457591801*G0_0_0_2_4 - 0.00102613435946773*G0_0_0_3_0 - 0.116774090107428*G0_0_0_3_1 + 0.0324258457591803*G0_0_0_3_2 - 0.255302228635571*G0_0_0_3_3 + 0.00205226871893523*G0_0_0_3_5 + 0.116774090107427*G0_0_0_4_0 + 0.00102613435946771*G0_0_0_4_1 - 0.0324258457591801*G0_0_0_4_2 + 0.25530222863557*G0_0_0_4_4 - 0.00205226871893551*G0_0_0_4_5 - 0.0213435946769285*G0_0_0_5_0 + 0.0213435946769284*G0_0_0_5_1 + 0.00205226871893523*G0_0_0_5_3 - 0.00205226871893551*G0_0_0_5_4 - 0.0225749559082898*G0_0_1_0_0 + 0.00538720538720558*G0_0_1_0_1 + 0.0055411255411257*G0_0_1_0_2 + 0.000307840307840333*G0_0_1_0_3 - 0.0283213083213092*G0_0_1_0_4 - 0.0376591309924654*G0_0_1_0_5 + 0.00538720538720558*G0_0_1_1_0 - 0.399474106140787*G0_0_1_1_1 + 0.0280647747314424*G0_0_1_1_2 - 0.143043129709801*G0_0_1_1_3 + 0.0083116883116886*G0_0_1_1_4 + 0.0176495109828445*G0_0_1_1_5 + 0.0055411255411257*G0_0_1_2_0 + 0.0280647747314424*G0_0_1_2_1 - 0.004514991181658*G0_0_1_2_2 + 0.0310918710918722*G0_0_1_2_3 + 0.014468494468495*G0_0_1_2_4 + 0.00153920153920165*G0_0_1_2_5 + 0.000307840307840335*G0_0_1_3_0 - 0.143043129709801*G0_0_1_3_1 + 0.0310918710918722*G0_0_1_3_2 - 0.192502805836146*G0_0_1_3_3 - 0.0172390572390578*G0_0_1_3_4 - 0.00369408369408407*G0_0_1_3_5 - 0.0283213083213092*G0_0_1_4_0 + 0.0083116883116886*G0_0_1_4_1 + 0.014468494468495*G0_0_1_4_2 - 0.0172390572390578*G0_0_1_4_3 - 0.0726503126503152*G0_0_1_4_4 - 0.0197017797017804*G0_0_1_4_5 - 0.0376591309924654*G0_0_1_5_0 + 0.0176495109828445*G0_0_1_5_1 + 0.00153920153920165*G0_0_1_5_2 - 0.00369408369408407*G0_0_1_5_3 - 0.0197017797017804*G0_0_1_5_4 + 0.136681096681101*G0_0_1_5_5 - 0.252942119608795*G0_1_0_0_0 + 0.00538720538720556*G0_1_0_0_1 + 0.0072342472342475*G0_1_0_0_2 + 0.00728555395222089*G0_1_0_0_3 - 0.0262690396023739*G0_1_0_0_4 - 0.00369408369408382*G0_1_0_0_5 + 0.00538720538720556*G0_1_0_1_0 - 0.169106942440281*G0_1_0_1_1 + 0.0263716530383206*G0_1_0_1_2 - 0.145095398428737*G0_1_0_1_3 + 0.00133397466730805*G0_1_0_1_4 - 0.0163155363155371*G0_1_0_1_5 + 0.0072342472342475*G0_1_0_2_0 + 0.0263716530383206*G0_1_0_2_1 - 0.00451499118165793*G0_1_0_2_2 + 0.0468943402276752*G0_1_0_2_3 - 0.00133397466730804*G0_1_0_2_4 + 0.00153920153920166*G0_1_0_2_5 + 0.00728555395222089*G0_1_0_3_0 - 0.145095398428737*G0_1_0_3_1 + 0.0468943402276752*G0_1_0_3_2 - 0.327952541285886*G0_1_0_3_3 - 0.0172390572390579*G0_1_0_3_4 - 0.0176495109828452*G0_1_0_3_5 - 0.0262690396023739*G0_1_0_4_0 + 0.00133397466730805*G0_1_0_4_1 - 0.00133397466730803*G0_1_0_4_2 - 0.0172390572390579*G0_1_0_4_3 + 0.0627994227994245*G0_1_0_4_4 - 0.00574635241301939*G0_1_0_4_5 - 0.00369408369408381*G0_1_0_5_0 - 0.0163155363155371*G0_1_0_5_1 + 0.00153920153920166*G0_1_0_5_2 - 0.0176495109828452*G0_1_0_5_3 - 0.00574635241301939*G0_1_0_5_4 + 0.136681096681101*G0_1_0_5_5 + 0.0493570626903972*G0_1_1_0_0 + 0.00538720538720561*G0_1_1_0_1 - 0.00205226871893544*G0_1_1_0_2 + 0.0074907808241144*G0_1_1_0_3 + 0.000102613435946657*G0_1_1_0_4 - 0.00102613435946771*G0_1_1_0_5 + 0.00538720538720561*G0_1_1_1_0 - 0.471406124739474*G0_1_1_1_1 + 0.0356581689915035*G0_1_1_1_2 - 0.171467051467057*G0_1_1_1_3 + 0.00112874779541454*G0_1_1_1_4 - 0.0189834856501534*G0_1_1_1_5 - 0.00205226871893544*G0_1_1_2_0 + 0.0356581689915035*G0_1_1_2_1 - 0.004514991181658*G0_1_1_2_2 + 0.0363251563251576*G0_1_1_2_3 + 0.00923520923520961*G0_1_1_2_4 + 0.00153920153920169*G0_1_1_2_5 + 0.0074907808241144*G0_1_1_3_0 - 0.171467051467057*G0_1_1_3_1 + 0.0363251563251576*G0_1_1_3_2 - 0.216309122975797*G0_1_1_3_3 - 0.0172390572390578*G0_1_1_3_4 - 0.0180599647266323*G0_1_1_3_5 + 0.000102613435946659*G0_1_1_4_0 + 0.00112874779541454*G0_1_1_4_1 + 0.00923520923520961*G0_1_1_4_2 - 0.0172390572390578*G0_1_1_4_3 - 0.048843995510664*G0_1_1_4_4 - 0.00533589866923235*G0_1_1_4_5 - 0.00102613435946771*G0_1_1_5_0 - 0.0189834856501534*G0_1_1_5_1 + 0.00153920153920169*G0_1_1_5_2 - 0.0180599647266323*G0_1_1_5_3 - 0.00533589866923235*G0_1_1_5_4 + 0.1366810966811*G0_1_1_5_5; + A[163] = -A[153] + 0.060952380952383*G0_0_0_0_0 - 0.0185217251883925*G0_0_0_0_2 + 0.0263716530383205*G0_0_0_0_3 + 0.0733686067019426*G0_0_0_0_4 + 0.0593105659772346*G0_0_0_0_5 - 0.0609523809523833*G0_0_0_1_1 + 0.0185217251883925*G0_0_0_1_2 - 0.0733686067019425*G0_0_0_1_3 - 0.0263716530383206*G0_0_0_1_4 - 0.0593105659772346*G0_0_0_1_5 - 0.0185217251883925*G0_0_0_2_0 + 0.0185217251883925*G0_0_0_2_1 + 0.0256533589866931*G0_0_0_2_3 - 0.0256533589866932*G0_0_0_2_4 + 0.0263716530383205*G0_0_0_3_0 - 0.0733686067019425*G0_0_0_3_1 + 0.0256533589866932*G0_0_0_3_2 - 0.217130030463371*G0_0_0_3_3 - 0.0527433060766412*G0_0_0_3_5 + 0.0733686067019426*G0_0_0_4_0 - 0.0263716530383206*G0_0_0_4_1 - 0.0256533589866932*G0_0_0_4_2 + 0.217130030463371*G0_0_0_4_4 + 0.0527433060766412*G0_0_0_4_5 + 0.0593105659772346*G0_0_0_5_0 - 0.0593105659772346*G0_0_0_5_1 - 0.0527433060766412*G0_0_0_5_3 + 0.0527433060766412*G0_0_0_5_4 - 0.0039506172839512*G0_0_1_0_0 + 0.0356068622735301*G0_0_1_0_1 - 0.00877344877344903*G0_0_1_0_2 + 0.0244219977553318*G0_0_1_0_3 + 0.01303190636524*G0_0_1_0_4 + 0.123649190315861*G0_0_1_0_5 + 0.0356068622735301*G0_0_1_1_0 + 0.162385762385768*G0_0_1_1_1 + 0.0129805996472667*G0_0_1_1_2 - 0.0630046496713184*G0_0_1_1_3 - 0.0175468975468982*G0_0_1_1_4 - 0.226365239698581*G0_0_1_1_5 - 0.00877344877344903*G0_0_1_2_0 + 0.0129805996472667*G0_0_1_2_1 - 0.00774731441398138*G0_0_1_2_2 + 0.0355042488375833*G0_0_1_2_3 + 0.00451499118165798*G0_0_1_2_4 + 0.039711399711401*G0_0_1_2_5 + 0.0244219977553318*G0_0_1_3_0 - 0.0630046496713184*G0_0_1_3_1 + 0.0355042488375833*G0_0_1_3_2 - 0.274798781465457*G0_0_1_3_3 - 0.0137502004168675*G0_0_1_3_4 - 0.128266794933466*G0_0_1_3_5 + 0.01303190636524*G0_0_1_4_0 - 0.0175468975468981*G0_0_1_4_1 + 0.00451499118165798*G0_0_1_4_2 - 0.0137502004168675*G0_0_1_4_3 + 0.00389931056597742*G0_0_1_4_4 - 0.0443290043290057*G0_0_1_4_5 + 0.123649190315861*G0_0_1_5_0 - 0.226365239698581*G0_0_1_5_1 + 0.039711399711401*G0_0_1_5_2 - 0.128266794933466*G0_0_1_5_3 - 0.0443290043290057*G0_0_1_5_4 - 0.665140291806982*G0_0_1_5_5 - 0.0131858265191603*G0_1_0_0_0 + 0.00610549943883298*G0_1_0_0_1 - 0.0063107263107265*G0_1_0_0_2 + 0.028834375501043*G0_1_0_0_3 + 0.0088247554914224*G0_1_0_0_4 + 0.0417636684303364*G0_1_0_0_5 + 0.00610549943883298*G0_1_0_1_0 - 0.0741382074715437*G0_1_0_1_1 + 0.012210998877666*G0_1_0_1_2 - 0.0645438512105201*G0_1_0_1_3 + 0.00246272246272255*G0_1_0_1_4 - 0.0175468975468982*G0_1_0_1_5 - 0.0063107263107265*G0_1_0_2_0 + 0.012210998877666*G0_1_0_2_1 - 0.0129805996472667*G0_1_0_2_2 + 0.0445342312008993*G0_1_0_2_3 + 0.0188808722142062*G0_1_0_2_4 + 0.0486387686387703*G0_1_0_2_5 + 0.028834375501043*G0_1_0_3_0 - 0.0645438512105201*G0_1_0_3_1 + 0.0445342312008993*G0_1_0_3_2 - 0.278903318903328*G0_1_0_3_3 - 0.0625941959275313*G0_1_0_3_4 - 0.154946288279627*G0_1_0_3_5 + 0.00882475549142241*G0_1_0_4_0 + 0.00246272246272255*G0_1_0_4_1 + 0.0188808722142062*G0_1_0_4_2 - 0.0625941959275313*G0_1_0_4_3 - 0.0617732884399575*G0_1_0_4_4 - 0.102202982202986*G0_1_0_4_5 + 0.0417636684303364*G0_1_0_5_0 - 0.0175468975468982*G0_1_0_5_1 + 0.0486387686387703*G0_1_0_5_2 - 0.154946288279627*G0_1_0_5_3 - 0.102202982202986*G0_1_0_5_4 - 0.377822671156017*G0_1_0_5_5 - 0.0323232323232333*G0_1_1_0_0 + 0.0295013628346971*G0_1_1_0_1 - 0.00805515472182165*G0_1_1_0_2 + 0.0327336860670204*G0_1_1_0_3 + 0.00708032708032731*G0_1_1_0_4 + 0.127958954625626*G0_1_1_0_5 + 0.0295013628346971*G0_1_1_1_0 + 0.246272246272255*G0_1_1_1_1 + 0.00795254128587485*G0_1_1_1_2 - 0.048228314894983*G0_1_1_1_3 - 0.011287477954145*G0_1_1_1_4 - 0.173416706750046*G0_1_1_1_5 - 0.00805515472182165*G0_1_1_2_0 + 0.00795254128587486*G0_1_1_2_1 - 0.0124162257495595*G0_1_1_2_2 + 0.0491518358185041*G0_1_1_2_3 + 0.0138528138528143*G0_1_1_2_4 + 0.0725476992143683*G0_1_1_2_5 + 0.0327336860670204*G0_1_1_3_0 - 0.048228314894983*G0_1_1_3_1 + 0.0491518358185041*G0_1_1_3_2 - 0.378438351771698*G0_1_1_3_3 - 0.0428924162257509*G0_1_1_3_4 - 0.210562770562778*G0_1_1_3_5 + 0.00708032708032731*G0_1_1_4_0 - 0.011287477954145*G0_1_1_4_1 + 0.0138528138528143*G0_1_1_4_2 - 0.042892416225751*G0_1_1_4_3 - 0.0225749559082899*G0_1_1_4_4 - 0.122520442520447*G0_1_1_4_5 + 0.127958954625625*G0_1_1_5_0 - 0.173416706750046*G0_1_1_5_1 + 0.0725476992143683*G0_1_1_5_2 - 0.210562770562778*G0_1_1_5_3 - 0.122520442520447*G0_1_1_5_4 - 1.33069103735775*G0_1_1_5_5; + A[205] = A[163] - 0.0153920153920155*G0_0_1_0_0 - 0.0252429052429061*G0_0_1_0_1 + 0.00277056277056286*G0_0_1_0_2 + 0.00800384800384825*G0_0_1_0_3 - 0.00831168831168852*G0_0_1_0_4 - 0.0735738335738362*G0_0_1_0_5 - 0.0252429052429061*G0_0_1_1_0 - 0.0123136123136128*G0_0_1_1_1 - 0.00215488215488222*G0_0_1_1_2 - 0.00769600769600806*G0_0_1_1_3 + 0.0166233766233772*G0_0_1_1_4 + 0.183164983164989*G0_0_1_1_5 + 0.00277056277056286*G0_0_1_2_0 - 0.00215488215488222*G0_0_1_2_1 - 0.00677248677248698*G0_0_1_2_2 + 0.0243193843193852*G0_0_1_2_3 + 0.0138528138528143*G0_0_1_2_4 + 0.00861952861952892*G0_0_1_2_5 + 0.00800384800384825*G0_0_1_3_0 - 0.00769600769600806*G0_0_1_3_1 + 0.0243193843193852*G0_0_1_3_2 - 0.14530062530063*G0_0_1_3_3 - 0.0492544492544509*G0_0_1_3_4 - 0.0332467532467545*G0_0_1_3_5 - 0.00831168831168852*G0_0_1_4_0 + 0.0166233766233772*G0_0_1_4_1 + 0.0138528138528143*G0_0_1_4_2 - 0.0492544492544509*G0_0_1_4_3 - 0.0714189514189545*G0_0_1_4_4 - 0.0504858104858123*G0_0_1_4_5 - 0.0735738335738362*G0_0_1_5_0 + 0.183164983164989*G0_0_1_5_1 + 0.00861952861952892*G0_0_1_5_2 - 0.0332467532467545*G0_0_1_5_3 - 0.0504858104858123*G0_0_1_5_4 + 0.236421356421365*G0_0_1_5_5 + 0.0153920153920155*G0_1_0_0_0 + 0.0252429052429061*G0_1_0_0_1 - 0.00277056277056286*G0_1_0_0_2 - 0.00800384800384824*G0_1_0_0_3 + 0.00831168831168852*G0_1_0_0_4 + 0.0735738335738362*G0_1_0_0_5 + 0.0252429052429061*G0_1_0_1_0 + 0.0123136123136128*G0_1_0_1_1 + 0.00215488215488223*G0_1_0_1_2 + 0.00769600769600803*G0_1_0_1_3 - 0.0166233766233772*G0_1_0_1_4 - 0.183164983164989*G0_1_0_1_5 - 0.00277056277056286*G0_1_0_2_0 + 0.00215488215488222*G0_1_0_2_1 + 0.00677248677248699*G0_1_0_2_2 - 0.0243193843193852*G0_1_0_2_3 - 0.0138528138528143*G0_1_0_2_4 - 0.00861952861952892*G0_1_0_2_5 - 0.00800384800384824*G0_1_0_3_0 + 0.00769600769600803*G0_1_0_3_1 - 0.0243193843193852*G0_1_0_3_2 + 0.14530062530063*G0_1_0_3_3 + 0.0492544492544509*G0_1_0_3_4 + 0.0332467532467545*G0_1_0_3_5 + 0.00831168831168852*G0_1_0_4_0 - 0.0166233766233772*G0_1_0_4_1 - 0.0138528138528143*G0_1_0_4_2 + 0.0492544492544509*G0_1_0_4_3 + 0.0714189514189545*G0_1_0_4_4 + 0.0504858104858123*G0_1_0_4_5 + 0.0735738335738362*G0_1_0_5_0 - 0.183164983164989*G0_1_0_5_1 - 0.00861952861952892*G0_1_0_5_2 + 0.0332467532467545*G0_1_0_5_3 + 0.0504858104858123*G0_1_0_5_4 - 0.236421356421365*G0_1_0_5_5; + A[68] = -A[65] + 0.00287317620650975*G0_0_1_0_0 + 0.0073368606701942*G0_0_1_0_1 - 0.00923520923520947*G0_0_1_0_2 - 0.0416610549943896*G0_0_1_0_3 + 0.00061568061568073*G0_0_1_0_4 - 0.00790123456790142*G0_0_1_0_5 + 0.0073368606701942*G0_0_1_1_0 + 0.00410453743787102*G0_0_1_1_1 - 0.0215488215488222*G0_0_1_1_2 - 0.0724450857784216*G0_0_1_1_3 - 0.0178547378547384*G0_0_1_1_4 - 0.0152894019560691*G0_0_1_1_5 - 0.00923520923520947*G0_0_1_2_0 - 0.0215488215488222*G0_0_1_2_1 + 0.278595478595487*G0_0_1_2_2 + 0.116979316979321*G0_0_1_2_3 + 0.0184704184704188*G0_0_1_2_4 + 0.00615680615680638*G0_0_1_2_5 - 0.0416610549943896*G0_0_1_3_0 - 0.0724450857784216*G0_0_1_3_1 + 0.116979316979321*G0_0_1_3_2 + 0.574635241301928*G0_0_1_3_3 + 0.119031585698256*G0_0_1_3_4 + 0.0710084976751669*G0_0_1_3_5 + 0.00061568061568073*G0_0_1_4_0 - 0.0178547378547384*G0_0_1_4_1 + 0.0184704184704188*G0_0_1_4_2 + 0.119031585698256*G0_0_1_4_3 - 0.0985088985089022*G0_0_1_4_4 + 0.0233958633958642*G0_0_1_4_5 - 0.00790123456790142*G0_0_1_5_0 - 0.0152894019560691*G0_0_1_5_1 + 0.00615680615680638*G0_0_1_5_2 + 0.0710084976751669*G0_0_1_5_3 + 0.0233958633958642*G0_0_1_5_4 + 0.00164181497514896*G0_0_1_5_5 - 0.0050280583613917*G0_1_1_0_0 + 0.0199583132916474*G0_1_1_0_1 - 0.00143658810325481*G0_1_1_0_2 + 0.0126214526214531*G0_1_1_0_3 + 0.0163155363155369*G0_1_1_0_4 + 0.0348885682219028*G0_1_1_0_5 + 0.0199583132916474*G0_1_1_1_0 - 0.182036235369576*G0_1_1_1_1 + 0.0126727593394265*G0_1_1_1_2 - 0.0668013468013495*G0_1_1_1_3 + 0.000307840307840323*G0_1_1_1_4 - 0.0990219656886364*G0_1_1_1_5 - 0.00143658810325481*G0_1_1_2_0 + 0.0126727593394265*G0_1_1_2_1 + 0.00820907487574147*G0_1_1_2_2 + 0.0287317620650965*G0_1_1_2_3 - 0.0102613435946774*G0_1_1_2_4 + 0.0156998556998562*G0_1_1_2_5 + 0.0126214526214531*G0_1_1_3_0 - 0.0668013468013495*G0_1_1_3_1 + 0.0287317620650965*G0_1_1_3_2 + 0.062799422799425*G0_1_1_3_3 - 0.0258585858585867*G0_1_1_3_4 - 0.0566426166426186*G0_1_1_3_5 + 0.0163155363155369*G0_1_1_4_0 + 0.000307840307840323*G0_1_1_4_1 - 0.0102613435946774*G0_1_1_4_2 - 0.0258585858585867*G0_1_1_4_3 - 0.0726503126503154*G0_1_1_4_4 - 0.032015392015393*G0_1_1_4_5 + 0.0348885682219028*G0_1_1_5_0 - 0.0990219656886364*G0_1_1_5_1 + 0.0156998556998562*G0_1_1_5_2 - 0.0566426166426186*G0_1_1_5_3 - 0.032015392015393*G0_1_1_5_4 - 0.237652717652726*G0_1_1_5_5; + A[169] = A[68] - 0.00451499118165795*G0_0_0_0_0 - 0.00205226871893545*G0_0_0_0_1 + 0.0356581689915034*G0_0_0_0_2 + 0.00153920153920157*G0_0_0_0_3 + 0.0363251563251575*G0_0_0_0_4 + 0.0092352092352095*G0_0_0_0_5 - 0.00205226871893545*G0_0_0_1_0 + 0.0493570626903975*G0_0_0_1_1 + 0.00538720538720542*G0_0_0_1_2 - 0.00102613435946778*G0_0_0_1_3 + 0.00749078082411437*G0_0_0_1_4 + 0.000102613435946835*G0_0_0_1_5 + 0.0356581689915034*G0_0_0_2_0 + 0.00538720538720542*G0_0_0_2_1 - 0.471406124739472*G0_0_0_2_2 - 0.0189834856501525*G0_0_0_2_3 - 0.171467051467057*G0_0_0_2_4 + 0.00112874779541443*G0_0_0_2_5 + 0.00153920153920157*G0_0_0_3_0 - 0.00102613435946778*G0_0_0_3_1 - 0.0189834856501525*G0_0_0_3_2 + 0.136681096681102*G0_0_0_3_3 - 0.0180599647266319*G0_0_0_3_4 - 0.0053358986692321*G0_0_0_3_5 + 0.0363251563251575*G0_0_0_4_0 + 0.00749078082411437*G0_0_0_4_1 - 0.171467051467057*G0_0_0_4_2 - 0.0180599647266319*G0_0_0_4_3 - 0.216309122975796*G0_0_0_4_4 - 0.0172390572390578*G0_0_0_4_5 + 0.00923520923520949*G0_0_0_5_0 + 0.000102613435946835*G0_0_0_5_1 + 0.00112874779541443*G0_0_0_5_2 - 0.0053358986692321*G0_0_0_5_3 - 0.0172390572390578*G0_0_0_5_4 - 0.0488439955106636*G0_0_0_5_5 - 0.00928651595318296*G0_0_1_0_1 + 0.00928651595318287*G0_0_1_0_2 - 0.0105691839025177*G0_0_1_0_4 + 0.0105691839025175*G0_0_1_0_5 - 0.00928651595318296*G0_0_1_1_0 + 0.302299182299194*G0_0_1_1_1 + 0.00266794933461623*G0_0_1_1_3 + 0.000205226871893494*G0_0_1_1_4 + 0.0263716530383211*G0_0_1_1_5 + 0.00928651595318287*G0_0_1_2_0 - 0.302299182299191*G0_0_1_2_2 - 0.00266794933461572*G0_0_1_2_3 - 0.0263716530383203*G0_0_1_2_4 - 0.000205226871893567*G0_0_1_2_5 + 0.00266794933461623*G0_0_1_3_1 - 0.00266794933461572*G0_0_1_3_2 - 0.000410453743786983*G0_0_1_3_4 + 0.000410453743787153*G0_0_1_3_5 - 0.0105691839025177*G0_0_1_4_0 + 0.000205226871893494*G0_0_1_4_1 - 0.0263716530383203*G0_0_1_4_2 - 0.000410453743786983*G0_0_1_4_3 + 0.111643418310089*G0_0_1_4_4 + 0.0105691839025175*G0_0_1_5_0 + 0.0263716530383211*G0_0_1_5_1 - 0.000205226871893566*G0_0_1_5_2 + 0.000410453743787146*G0_0_1_5_3 - 0.111643418310089*G0_0_1_5_5 - 0.00759339426006117*G0_1_0_0_1 + 0.00759339426006116*G0_1_0_0_2 + 0.0052332852332854*G0_1_0_0_4 - 0.00523328523328541*G0_1_0_0_5 - 0.00759339426006117*G0_1_0_1_0 + 0.0719320185986875*G0_1_0_1_1 + 0.0366329966329979*G0_1_0_1_3 + 0.00718294051627408*G0_1_0_1_4 + 0.0284239217572561*G0_1_0_1_5 + 0.00759339426006116*G0_1_0_2_0 - 0.0719320185986871*G0_1_0_2_2 - 0.0366329966329977*G0_1_0_2_3 - 0.028423921757256*G0_1_0_2_4 - 0.00718294051627412*G0_1_0_2_5 + 0.0366329966329979*G0_1_0_3_1 - 0.0366329966329977*G0_1_0_3_2 - 0.0143658810325481*G0_1_0_3_4 + 0.0143658810325483*G0_1_0_3_5 + 0.0052332852332854*G0_1_0_4_0 + 0.00718294051627408*G0_1_0_4_1 - 0.028423921757256*G0_1_0_4_2 - 0.0143658810325481*G0_1_0_4_3 - 0.0238063171396513*G0_1_0_4_4 - 0.00523328523328541*G0_1_0_5_0 + 0.0284239217572561*G0_1_0_5_1 - 0.00718294051627412*G0_1_0_5_2 + 0.0143658810325483*G0_1_0_5_3 + 0.0238063171396514*G0_1_0_5_5 + 0.00451499118165786*G0_1_1_0_0 - 0.0356581689915036*G0_1_1_0_1 + 0.00205226871893544*G0_1_1_0_2 - 0.00153920153920167*G0_1_1_0_3 - 0.00923520923520962*G0_1_1_0_4 - 0.0363251563251577*G0_1_1_0_5 - 0.0356581689915036*G0_1_1_1_0 + 0.471406124739476*G0_1_1_1_1 - 0.00538720538720571*G0_1_1_1_2 + 0.0189834856501533*G0_1_1_1_3 - 0.00112874779541455*G0_1_1_1_4 + 0.171467051467058*G0_1_1_1_5 + 0.00205226871893544*G0_1_1_2_0 - 0.00538720538720571*G0_1_1_2_1 - 0.0493570626903972*G0_1_1_2_2 + 0.00102613435946787*G0_1_1_2_3 - 0.000102613435946635*G0_1_1_2_4 - 0.00749078082411444*G0_1_1_2_5 - 0.00153920153920167*G0_1_1_3_0 + 0.0189834856501533*G0_1_1_3_1 + 0.00102613435946787*G0_1_1_3_2 - 0.136681096681101*G0_1_1_3_3 + 0.00533589866923226*G0_1_1_3_4 + 0.0180599647266322*G0_1_1_3_5 - 0.00923520923520962*G0_1_1_4_0 - 0.00112874779541455*G0_1_1_4_1 - 0.000102613435946636*G0_1_1_4_2 + 0.00533589866923226*G0_1_1_4_3 + 0.0488439955106641*G0_1_1_4_4 + 0.0172390572390578*G0_1_1_4_5 - 0.0363251563251577*G0_1_1_5_0 + 0.171467051467058*G0_1_1_5_1 - 0.00749078082411444*G0_1_1_5_2 + 0.0180599647266322*G0_1_1_5_3 + 0.0172390572390578*G0_1_1_5_4 + 0.216309122975797*G0_1_1_5_5; + A[71] = A[169] + 0.00153920153920152*G0_0_1_0_0 + 0.00138528138528151*G0_0_1_0_1 - 0.000307840307840316*G0_0_1_0_2 + 0.000307840307840317*G0_0_1_0_3 + 0.000513067179733889*G0_0_1_0_4 - 0.0152894019560691*G0_0_1_0_5 + 0.00138528138528151*G0_0_1_1_0 - 0.2242103575437*G0_0_1_1_1 - 0.00425845759179102*G0_0_1_1_2 + 0.025653358986693*G0_0_1_1_3 + 0.00338624338624353*G0_0_1_1_4 + 0.00615680615680585*G0_0_1_1_5 - 0.000307840307840316*G0_0_1_2_0 - 0.00425845759179102*G0_0_1_2_1 + 0.00615680615680632*G0_0_1_2_2 - 0.00831168831168862*G0_0_1_2_3 + 0.00410453743787087*G0_0_1_2_4 - 0.00359147025813705*G0_0_1_2_5 + 0.000307840307840319*G0_0_1_3_0 + 0.025653358986693*G0_0_1_3_1 - 0.00831168831168862*G0_0_1_3_2 + 0.0508962642295992*G0_0_1_3_3 - 0.00738816738816762*G0_0_1_3_4 + 0.00656725990059348*G0_0_1_3_5 + 0.000513067179733889*G0_0_1_4_0 + 0.00338624338624353*G0_0_1_4_1 + 0.00410453743787087*G0_0_1_4_2 - 0.00738816738816762*G0_0_1_4_3 + 0.00574635241301936*G0_0_1_4_4 + 0.000410453743787088*G0_0_1_4_5 - 0.0152894019560691*G0_0_1_5_0 + 0.00615680615680586*G0_0_1_5_1 - 0.00359147025813705*G0_0_1_5_2 + 0.00656725990059349*G0_0_1_5_3 + 0.000410453743787088*G0_0_1_5_4 + 0.141196087862759*G0_0_1_5_5 - 0.00153920153920152*G0_1_0_0_0 - 0.00138528138528151*G0_1_0_0_1 + 0.000307840307840316*G0_1_0_0_2 - 0.000307840307840319*G0_1_0_0_3 - 0.000513067179733889*G0_1_0_0_4 + 0.0152894019560691*G0_1_0_0_5 - 0.00138528138528151*G0_1_0_1_0 + 0.2242103575437*G0_1_0_1_1 + 0.00425845759179102*G0_1_0_1_2 - 0.025653358986693*G0_1_0_1_3 - 0.00338624338624353*G0_1_0_1_4 - 0.00615680615680585*G0_1_0_1_5 + 0.000307840307840316*G0_1_0_2_0 + 0.00425845759179102*G0_1_0_2_1 - 0.00615680615680632*G0_1_0_2_2 + 0.00831168831168862*G0_1_0_2_3 - 0.00410453743787087*G0_1_0_2_4 + 0.00359147025813705*G0_1_0_2_5 - 0.000307840307840319*G0_1_0_3_0 - 0.025653358986693*G0_1_0_3_1 + 0.00831168831168862*G0_1_0_3_2 - 0.0508962642295992*G0_1_0_3_3 + 0.00738816738816762*G0_1_0_3_4 - 0.00656725990059347*G0_1_0_3_5 - 0.000513067179733889*G0_1_0_4_0 - 0.00338624338624353*G0_1_0_4_1 - 0.00410453743787087*G0_1_0_4_2 + 0.00738816738816762*G0_1_0_4_3 - 0.00574635241301936*G0_1_0_4_4 - 0.000410453743787088*G0_1_0_4_5 + 0.0152894019560691*G0_1_0_5_0 - 0.00615680615680586*G0_1_0_5_1 + 0.00359147025813705*G0_1_0_5_2 - 0.00656725990059348*G0_1_0_5_3 - 0.000410453743787089*G0_1_0_5_4 - 0.141196087862759*G0_1_0_5_5; + A[55] = A[153] + 0.00615680615680645*G0_0_1_0_0 - 0.00425845759179107*G0_0_1_0_1 - 0.000307840307840335*G0_0_1_0_2 - 0.00359147025813703*G0_0_1_0_3 + 0.00410453743787093*G0_0_1_0_4 - 0.00831168831168855*G0_0_1_0_5 - 0.00425845759179106*G0_0_1_1_0 - 0.224210357543699*G0_0_1_1_1 + 0.00138528138528145*G0_0_1_1_2 + 0.0061568061568063*G0_0_1_1_3 + 0.00338624338624352*G0_0_1_1_4 + 0.025653358986693*G0_0_1_1_5 - 0.000307840307840336*G0_0_1_2_0 + 0.00138528138528146*G0_0_1_2_1 + 0.00153920153920162*G0_0_1_2_2 - 0.0152894019560692*G0_0_1_2_3 + 0.000513067179733888*G0_0_1_2_4 + 0.0003078403078403*G0_0_1_2_5 - 0.00359147025813703*G0_0_1_3_0 + 0.0061568061568063*G0_0_1_3_1 - 0.0152894019560692*G0_0_1_3_2 + 0.14119608786276*G0_0_1_3_3 + 0.000410453743787114*G0_0_1_3_4 + 0.0065672599005935*G0_0_1_3_5 + 0.00410453743787093*G0_0_1_4_0 + 0.00338624338624352*G0_0_1_4_1 + 0.000513067179733887*G0_0_1_4_2 + 0.000410453743787113*G0_0_1_4_3 + 0.00574635241301951*G0_0_1_4_4 - 0.00738816738816761*G0_0_1_4_5 - 0.00831168831168855*G0_0_1_5_0 + 0.025653358986693*G0_0_1_5_1 + 0.0003078403078403*G0_0_1_5_2 + 0.0065672599005935*G0_0_1_5_3 - 0.0073881673881676*G0_0_1_5_4 + 0.0508962642295993*G0_0_1_5_5 - 0.00615680615680645*G0_1_0_0_0 + 0.00425845759179106*G0_1_0_0_1 + 0.000307840307840335*G0_1_0_0_2 + 0.00359147025813703*G0_1_0_0_3 - 0.00410453743787093*G0_1_0_0_4 + 0.00831168831168855*G0_1_0_0_5 + 0.00425845759179106*G0_1_0_1_0 + 0.224210357543699*G0_1_0_1_1 - 0.00138528138528145*G0_1_0_1_2 - 0.00615680615680633*G0_1_0_1_3 - 0.00338624338624352*G0_1_0_1_4 - 0.025653358986693*G0_1_0_1_5 + 0.000307840307840336*G0_1_0_2_0 - 0.00138528138528146*G0_1_0_2_1 - 0.00153920153920162*G0_1_0_2_2 + 0.0152894019560692*G0_1_0_2_3 - 0.000513067179733887*G0_1_0_2_4 - 0.000307840307840302*G0_1_0_2_5 + 0.00359147025813703*G0_1_0_3_0 - 0.00615680615680633*G0_1_0_3_1 + 0.0152894019560692*G0_1_0_3_2 - 0.14119608786276*G0_1_0_3_3 - 0.000410453743787112*G0_1_0_3_4 - 0.0065672599005935*G0_1_0_3_5 - 0.00410453743787093*G0_1_0_4_0 - 0.00338624338624352*G0_1_0_4_1 - 0.000513067179733887*G0_1_0_4_2 - 0.000410453743787115*G0_1_0_4_3 - 0.00574635241301951*G0_1_0_4_4 + 0.00738816738816761*G0_1_0_4_5 + 0.00831168831168855*G0_1_0_5_0 - 0.025653358986693*G0_1_0_5_1 - 0.000307840307840304*G0_1_0_5_2 - 0.0065672599005935*G0_1_0_5_3 + 0.00738816738816761*G0_1_0_5_4 - 0.0508962642295993*G0_1_0_5_5; + A[175] = -A[55] - 0.186140772807446*G0_0_0_0_0 + 0.0342215808882487*G0_0_0_0_1 + 0.0126214526214531*G0_0_0_0_2 + 0.0181625781625787*G0_0_0_0_3 - 0.0837325637325666*G0_0_0_0_4 + 0.0056437389770724*G0_0_0_0_5 + 0.0342215808882487*G0_0_0_1_0 - 0.270386403719747*G0_0_0_1_1 + 0.00779862113195472*G0_0_0_1_2 - 0.0287317620650963*G0_0_0_1_3 + 0.00954304954304991*G0_0_0_1_4 - 0.0882475549142247*G0_0_0_1_5 + 0.0126214526214531*G0_0_0_2_0 + 0.00779862113195473*G0_0_0_2_1 - 0.00790123456790159*G0_0_0_2_2 + 0.0156998556998562*G0_0_0_2_3 + 0.0427898027898042*G0_0_0_2_4 + 0.0542825076158428*G0_0_0_2_5 + 0.0181625781625787*G0_0_0_3_0 - 0.0287317620650963*G0_0_0_3_1 + 0.0156998556998562*G0_0_0_3_2 + 0.0258585858585872*G0_0_0_3_3 - 0.0554112554112572*G0_0_0_3_4 - 0.144890171556843*G0_0_0_3_5 - 0.0837325637325666*G0_0_0_4_0 + 0.00954304954304991*G0_0_0_4_1 + 0.0427898027898042*G0_0_0_4_2 - 0.0554112554112572*G0_0_0_4_3 - 0.239294532627874*G0_0_0_4_4 - 0.127651114317785*G0_0_0_4_5 + 0.00564373897707239*G0_0_0_5_0 - 0.0882475549142247*G0_0_0_5_1 + 0.0542825076158428*G0_0_0_5_2 - 0.144890171556843*G0_0_0_5_3 - 0.127651114317785*G0_0_0_5_4 - 0.511835818502503*G0_0_0_5_5 - 0.00410453743787097*G0_0_1_0_0 + 0.0215488215488223*G0_0_1_0_1 - 0.00733686067019424*G0_0_1_0_2 + 0.0178547378547384*G0_0_1_0_3 + 0.0152894019560691*G0_0_1_0_4 + 0.0724450857784215*G0_0_1_0_5 + 0.0215488215488223*G0_0_1_1_0 - 0.278595478595488*G0_0_1_1_1 + 0.00923520923520954*G0_0_1_1_2 - 0.0184704184704191*G0_0_1_1_3 - 0.00615680615680631*G0_0_1_1_4 - 0.116979316979321*G0_0_1_1_5 - 0.00733686067019424*G0_0_1_2_0 + 0.00923520923520954*G0_0_1_2_1 - 0.0028731762065096*G0_0_1_2_2 - 0.000615680615680722*G0_0_1_2_3 + 0.00790123456790154*G0_0_1_2_4 + 0.0416610549943897*G0_0_1_2_5 + 0.0178547378547384*G0_0_1_3_0 - 0.018470418470419*G0_0_1_3_1 - 0.000615680615680722*G0_0_1_3_2 + 0.0985088985089023*G0_0_1_3_3 - 0.0233958633958642*G0_0_1_3_4 - 0.119031585698256*G0_0_1_3_5 + 0.0152894019560691*G0_0_1_4_0 - 0.00615680615680631*G0_0_1_4_1 + 0.00790123456790154*G0_0_1_4_2 - 0.0233958633958642*G0_0_1_4_3 - 0.0016418149751481*G0_0_1_4_4 - 0.0710084976751667*G0_0_1_4_5 + 0.0724450857784215*G0_0_1_5_0 - 0.116979316979321*G0_0_1_5_1 + 0.0416610549943897*G0_0_1_5_2 - 0.119031585698256*G0_0_1_5_3 - 0.0710084976751667*G0_0_1_5_4 - 0.574635241301928*G0_0_1_5_5; + A[146] = -A[138] + 0.199890973224314*G0_0_0_0_0 - 0.0184704184704191*G0_0_0_0_1 - 0.0152551974774202*G0_0_0_0_2 - 0.00424135535246661*G0_0_0_0_3 + 0.0809962054406527*G0_0_0_0_4 + 0.0212067767623332*G0_0_0_0_5 - 0.0184704184704191*G0_0_0_1_0 + 0.116979316979321*G0_0_0_1_1 - 0.00212067767623329*G0_0_0_1_2 + 0.00547271658382778*G0_0_0_1_3 - 0.00506226284004081*G0_0_0_1_4 + 0.0273635829191394*G0_0_0_1_5 - 0.0152551974774202*G0_0_0_2_0 - 0.00212067767623329*G0_0_0_2_1 + 0.0102613435946774*G0_0_0_2_2 - 0.00123136123136123*G0_0_0_2_3 - 0.0250376783710125*G0_0_0_2_4 - 0.0253113142002039*G0_0_0_2_5 - 0.00424135535246661*G0_0_0_3_0 + 0.00547271658382779*G0_0_0_3_1 - 0.00123136123136122*G0_0_0_3_2 - 0.0596526107637243*G0_0_0_3_3 + 0.0186072363850147*G0_0_0_3_4 + 0.0591053391053411*G0_0_0_3_5 + 0.0809962054406527*G0_0_0_4_0 - 0.00506226284004081*G0_0_0_4_1 - 0.0250376783710125*G0_0_0_4_2 + 0.0186072363850147*G0_0_0_4_3 + 0.104528886751112*G0_0_0_4_4 + 0.0607471540804895*G0_0_0_4_5 + 0.0212067767623332*G0_0_0_5_0 + 0.0273635829191394*G0_0_0_5_1 - 0.0253113142002039*G0_0_0_5_2 + 0.0591053391053411*G0_0_0_5_3 + 0.0607471540804895*G0_0_0_5_4 + 0.154877879322329*G0_0_0_5_5 + 0.00697771364438048*G0_1_0_0_0 - 0.0177863288974406*G0_1_0_0_1 + 0.000752498530276312*G0_1_0_0_2 - 0.00246272246272251*G0_1_0_0_3 + 0.000684089572978519*G0_1_0_0_4 + 0.0276372187483308*G0_1_0_0_5 - 0.0177863288974406*G0_1_0_1_0 + 0.121083854417192*G0_1_0_1_1 - 0.00136817914595695*G0_1_0_1_2 - 0.00547271658382791*G0_1_0_1_4 + 0.0164181497514836*G0_1_0_1_5 + 0.000752498530276313*G0_1_0_2_0 - 0.00136817914595695*G0_1_0_2_1 + 0.00451499118165808*G0_1_0_2_2 + 0.00300999412110544*G0_1_0_2_3 - 0.00916680027791168*G0_1_0_2_4 - 0.027089947089948*G0_1_0_2_5 - 0.00246272246272251*G0_1_0_3_0 + 0.00300999412110544*G0_1_0_3_2 - 0.0755234888568254*G0_1_0_3_3 + 0.0158708780931008*G0_1_0_3_4 + 0.059105339105341*G0_1_0_3_5 + 0.000684089572978519*G0_1_0_4_0 - 0.00547271658382791*G0_1_0_4_1 - 0.00916680027791168*G0_1_0_4_2 + 0.0158708780931008*G0_1_0_4_3 + 0.0142290631179526*G0_1_0_4_4 + 0.0651253273475518*G0_1_0_4_5 + 0.0276372187483308*G0_1_0_5_0 + 0.0164181497514836*G0_1_0_5_1 - 0.027089947089948*G0_1_0_5_2 + 0.059105339105341*G0_1_0_5_3 + 0.0651253273475518*G0_1_0_5_4 + 0.220003206669881*G0_1_0_5_5; + A[174] = A[146] + 0.0164181497514839*G0_0_1_0_0 - 0.0184020095131212*G0_0_1_0_1 - 0.00410453743787087*G0_0_1_0_3 + 0.0039677195232753*G0_0_1_0_4 + 0.0247640425418212*G0_0_1_0_5 - 0.0184020095131212*G0_0_1_1_0 + 0.0164181497514834*G0_0_1_1_1 + 0.00396771952327514*G0_0_1_1_3 - 0.00410453743787093*G0_0_1_1_4 + 0.0247640425418211*G0_0_1_1_5 + 0.00369408369408382*G0_0_1_2_2 - 0.00779862113195471*G0_0_1_2_3 - 0.00779862113195474*G0_0_1_2_4 - 0.0240799529688427*G0_0_1_2_5 - 0.00410453743787087*G0_0_1_3_0 + 0.00396771952327514*G0_0_1_3_1 - 0.00779862113195471*G0_0_1_3_2 + 0.0164181497514834*G0_0_1_3_3 + 0.0164181497514836*G0_0_1_3_4 + 0.0563689808134271*G0_0_1_3_5 + 0.00396771952327531*G0_0_1_4_0 - 0.00410453743787093*G0_0_1_4_1 - 0.00779862113195474*G0_0_1_4_2 + 0.0164181497514836*G0_0_1_4_3 + 0.0164181497514837*G0_0_1_4_4 + 0.0563689808134272*G0_0_1_4_5 + 0.0247640425418212*G0_0_1_5_0 + 0.0247640425418212*G0_0_1_5_1 - 0.0240799529688427*G0_0_1_5_2 + 0.0563689808134271*G0_0_1_5_3 + 0.0563689808134272*G0_0_1_5_4 + 0.232043183154302*G0_0_1_5_5 - 0.0164181497514839*G0_1_0_0_0 + 0.0184020095131212*G0_1_0_0_1 + 0.00410453743787087*G0_1_0_0_3 - 0.00396771952327531*G0_1_0_0_4 - 0.0247640425418212*G0_1_0_0_5 + 0.0184020095131212*G0_1_0_1_0 - 0.0164181497514835*G0_1_0_1_1 - 0.00396771952327514*G0_1_0_1_3 + 0.00410453743787093*G0_1_0_1_4 - 0.0247640425418212*G0_1_0_1_5 - 0.00369408369408383*G0_1_0_2_2 + 0.00779862113195471*G0_1_0_2_3 + 0.00779862113195474*G0_1_0_2_4 + 0.0240799529688427*G0_1_0_2_5 + 0.00410453743787087*G0_1_0_3_0 - 0.00396771952327514*G0_1_0_3_1 + 0.00779862113195471*G0_1_0_3_2 - 0.0164181497514834*G0_1_0_3_3 - 0.0164181497514836*G0_1_0_3_4 - 0.0563689808134271*G0_1_0_3_5 - 0.00396771952327531*G0_1_0_4_0 + 0.00410453743787093*G0_1_0_4_1 + 0.00779862113195475*G0_1_0_4_2 - 0.0164181497514836*G0_1_0_4_3 - 0.0164181497514837*G0_1_0_4_4 - 0.0563689808134272*G0_1_0_4_5 - 0.0247640425418212*G0_1_0_5_0 - 0.0247640425418212*G0_1_0_5_1 + 0.0240799529688427*G0_1_0_5_2 - 0.0563689808134271*G0_1_0_5_3 - 0.0563689808134272*G0_1_0_5_4 - 0.232043183154302*G0_1_0_5_5; + A[119] = A[205] - 0.111438191438195*G0_0_0_0_0 - 0.00615680615680634*G0_0_0_0_1 + 0.0575661375661396*G0_0_0_0_2 + 0.0147763347763353*G0_0_0_0_3 + 0.0209331409331415*G0_0_0_0_4 - 0.0400192400192414*G0_0_0_0_5 - 0.00615680615680633*G0_0_0_1_0 + 0.171159211159217*G0_0_0_1_1 + 0.00277056277056299*G0_0_0_1_2 + 0.254891774891784*G0_0_0_1_3 + 0.102202982202986*G0_0_0_1_4 + 0.0677248677248702*G0_0_0_1_5 + 0.0575661375661396*G0_0_0_2_0 + 0.00277056277056298*G0_0_0_2_1 - 0.21179413179414*G0_0_0_2_2 - 0.2511976911977*G0_0_0_2_3 - 0.148994708994715*G0_0_0_2_4 + 0.00307840307840307*G0_0_0_2_5 + 0.0147763347763353*G0_0_0_3_0 + 0.254891774891784*G0_0_0_3_1 - 0.2511976911977*G0_0_0_3_2 - 0.128061568061574*G0_0_0_3_3 - 0.233958633958642*G0_0_0_3_4 - 0.0357094757094769*G0_0_0_3_5 + 0.0209331409331415*G0_0_0_4_0 + 0.102202982202986*G0_0_0_4_1 - 0.148994708994715*G0_0_0_4_2 - 0.233958633958642*G0_0_0_4_3 - 1.5071861471862*G0_0_0_4_4 - 0.210562770562778*G0_0_0_4_5 - 0.0400192400192414*G0_0_0_5_0 + 0.0677248677248702*G0_0_0_5_1 + 0.00307840307840306*G0_0_0_5_2 - 0.0357094757094769*G0_0_0_5_3 - 0.210562770562778*G0_0_0_5_4 - 0.150226070226075*G0_0_0_5_5 - 0.0153920153920159*G0_0_1_0_1 + 0.0153920153920158*G0_0_1_0_2 + 0.0206253006253012*G0_0_1_0_4 - 0.0206253006253014*G0_0_1_0_5 - 0.0153920153920159*G0_0_1_1_0 + 0.214564694564702*G0_0_1_1_1 + 0.277364117364127*G0_0_1_1_3 + 0.0412506012506026*G0_0_1_1_4 + 0.0409427609427627*G0_0_1_1_5 + 0.0153920153920159*G0_0_1_2_0 - 0.214564694564702*G0_0_1_2_2 - 0.277364117364127*G0_0_1_2_3 - 0.0409427609427623*G0_0_1_2_4 - 0.0412506012506027*G0_0_1_2_5 + 0.277364117364127*G0_0_1_3_1 - 0.277364117364127*G0_0_1_3_2 - 0.0825012025012052*G0_0_1_3_4 + 0.0825012025012054*G0_0_1_3_5 + 0.0206253006253012*G0_0_1_4_0 + 0.0412506012506026*G0_0_1_4_1 - 0.0409427609427623*G0_0_1_4_2 - 0.0825012025012052*G0_0_1_4_3 - 0.209331409331415*G0_0_1_4_4 - 0.0206253006253014*G0_0_1_5_0 + 0.0409427609427627*G0_0_1_5_1 - 0.0412506012506027*G0_0_1_5_2 + 0.0825012025012054*G0_0_1_5_3 + 0.209331409331417*G0_0_1_5_5 - 0.0434054834054849*G0_1_0_0_1 + 0.0434054834054848*G0_1_0_0_2 + 0.085887445887449*G0_1_0_0_4 - 0.0858874458874486*G0_1_0_0_5 - 0.0434054834054849*G0_1_0_1_0 + 0.209023569023576*G0_1_0_1_1 + 0.245348725348734*G0_1_0_1_3 + 0.0492544492544509*G0_1_0_1_4 + 0.210254930254938*G0_1_0_1_5 + 0.0434054834054848*G0_1_0_2_0 - 0.209023569023577*G0_1_0_2_2 - 0.245348725348734*G0_1_0_2_3 - 0.210254930254938*G0_1_0_2_4 - 0.049254449254451*G0_1_0_2_5 + 0.245348725348734*G0_1_0_3_1 - 0.245348725348734*G0_1_0_3_2 - 0.0985088985089021*G0_1_0_3_4 + 0.0985088985089018*G0_1_0_3_5 + 0.085887445887449*G0_1_0_4_0 + 0.0492544492544509*G0_1_0_4_1 - 0.210254930254938*G0_1_0_4_2 - 0.0985088985089021*G0_1_0_4_3 - 0.517171717171735*G0_1_0_4_4 - 0.0858874458874486*G0_1_0_5_0 + 0.210254930254938*G0_1_0_5_1 - 0.049254449254451*G0_1_0_5_2 + 0.0985088985089018*G0_1_0_5_3 + 0.517171717171736*G0_1_0_5_5 + 0.111438191438196*G0_1_1_0_0 - 0.0575661375661395*G0_1_1_0_1 + 0.00615680615680629*G0_1_1_0_2 - 0.0147763347763352*G0_1_1_0_3 + 0.0400192400192414*G0_1_1_0_4 - 0.0209331409331412*G0_1_1_0_5 - 0.0575661375661395*G0_1_1_1_0 + 0.211794131794139*G0_1_1_1_1 - 0.00277056277056281*G0_1_1_1_2 + 0.2511976911977*G0_1_1_1_3 - 0.00307840307840319*G0_1_1_1_4 + 0.148994708994714*G0_1_1_1_5 + 0.00615680615680629*G0_1_1_2_0 - 0.00277056277056281*G0_1_1_2_1 - 0.171159211159217*G0_1_1_2_2 - 0.254891774891784*G0_1_1_2_3 - 0.06772486772487*G0_1_1_2_4 - 0.102202982202986*G0_1_1_2_5 - 0.0147763347763352*G0_1_1_3_0 + 0.2511976911977*G0_1_1_3_1 - 0.254891774891784*G0_1_1_3_2 + 0.128061568061571*G0_1_1_3_3 + 0.0357094757094767*G0_1_1_3_4 + 0.233958633958642*G0_1_1_3_5 + 0.0400192400192414*G0_1_1_4_0 - 0.00307840307840319*G0_1_1_4_1 - 0.06772486772487*G0_1_1_4_2 + 0.0357094757094767*G0_1_1_4_3 + 0.150226070226075*G0_1_1_4_4 + 0.210562770562778*G0_1_1_4_5 - 0.0209331409331412*G0_1_1_5_0 + 0.148994708994714*G0_1_1_5_1 - 0.102202982202986*G0_1_1_5_2 + 0.233958633958642*G0_1_1_5_3 + 0.210562770562778*G0_1_1_5_4 + 1.5071861471862*G0_1_1_5_5; + A[197] = -A[182] - 0.00102613435946772*G0_0_1_0_0 + 0.0023088023088024*G0_0_1_0_2 + 0.00318101651434995*G0_0_1_0_3 + 0.0132371332371336*G0_0_1_0_4 + 0.00205226871893544*G0_0_1_0_5 + 0.00102613435946775*G0_0_1_1_1 - 0.00230880230880239*G0_0_1_1_2 - 0.0132371332371337*G0_0_1_1_3 - 0.00318101651434995*G0_0_1_1_4 - 0.00205226871893543*G0_0_1_1_5 + 0.0023088023088024*G0_0_1_2_0 - 0.00230880230880239*G0_0_1_2_1 + 0.0256533589866932*G0_0_1_2_3 - 0.0256533589866932*G0_0_1_2_4 + 0.00318101651434995*G0_0_1_3_0 - 0.0132371332371337*G0_0_1_3_1 + 0.0256533589866932*G0_0_1_3_2 + 0.00205226871893548*G0_0_1_3_3 - 0.00636203302869988*G0_0_1_3_5 + 0.0132371332371336*G0_0_1_4_0 - 0.00318101651434995*G0_0_1_4_1 - 0.0256533589866932*G0_0_1_4_2 - 0.00205226871893557*G0_0_1_4_4 + 0.00636203302869988*G0_0_1_4_5 + 0.00205226871893544*G0_0_1_5_0 - 0.00205226871893543*G0_0_1_5_1 - 0.00636203302869988*G0_0_1_5_3 + 0.00636203302869989*G0_0_1_5_4 - 0.0200096200096208*G0_1_1_0_0 + 0.00995350328683699*G0_1_1_0_1 - 0.00395061728395071*G0_1_1_0_2 - 0.00123136123136128*G0_1_1_0_3 - 0.00554112554112573*G0_1_1_0_4 - 0.0136475869809209*G0_1_1_0_5 + 0.00995350328683699*G0_1_1_1_0 - 0.0189834856501531*G0_1_1_1_1 - 0.00625941959275312*G0_1_1_1_2 - 0.0187782587782595*G0_1_1_1_3 - 0.00441237774571124*G0_1_1_1_4 - 0.0156998556998563*G0_1_1_1_5 - 0.00395061728395071*G0_1_1_2_0 - 0.00625941959275312*G0_1_1_2_1 + 0.0672118005451359*G0_1_1_2_2 + 0.0425845759179107*G0_1_1_2_3 + 0.0169312169312174*G0_1_1_2_4 + 0.0104665704665708*G0_1_1_2_5 - 0.00123136123136128*G0_1_1_3_0 - 0.0187782587782595*G0_1_1_3_1 + 0.0425845759179107*G0_1_1_3_2 + 0.0184704184704192*G0_1_1_3_3 + 0.0112874779541451*G0_1_1_3_4 - 0.0184704184704191*G0_1_1_3_5 - 0.00554112554112573*G0_1_1_4_0 - 0.00441237774571124*G0_1_1_4_1 + 0.0169312169312174*G0_1_1_4_2 + 0.0112874779541451*G0_1_1_4_3 + 0.0164181497514837*G0_1_1_4_4 - 0.0121083854417191*G0_1_1_4_5 - 0.0136475869809209*G0_1_1_5_0 - 0.0156998556998563*G0_1_1_5_1 + 0.0104665704665708*G0_1_1_5_2 - 0.0184704184704191*G0_1_1_5_3 - 0.0121083854417191*G0_1_1_5_4 - 0.214667308000649*G0_1_1_5_5; + A[195] = A[197] + 0.0336059002725682*G0_0_0_0_0 - 0.00123136123136129*G0_0_0_0_1 - 0.00546416546416564*G0_0_0_0_2 + 0.00682379349046036*G0_0_0_0_3 + 0.0231393298059972*G0_0_0_0_4 + 0.00661856661856689*G0_0_0_0_5 - 0.00123136123136129*G0_0_0_1_0 - 0.0222158088824763*G0_0_0_1_1 + 0.00474587141253824*G0_0_0_1_2 - 0.0225236491903166*G0_0_0_1_3 - 0.000666987333654026*G0_0_0_1_4 - 0.00354016354016368*G0_0_0_1_5 - 0.00546416546416564*G0_0_0_2_0 + 0.00474587141253824*G0_0_0_2_1 + 0.00430976430976441*G0_0_0_2_2 + 0.010363957030624*G0_0_0_2_3 - 0.0019496552829887*G0_0_0_2_4 - 0.00184704184704192*G0_0_0_2_5 + 0.00682379349046036*G0_0_0_3_0 - 0.0225236491903166*G0_0_0_3_1 + 0.010363957030624*G0_0_0_3_2 - 0.113490460157131*G0_0_0_3_3 - 0.0123136123136127*G0_0_0_3_4 - 0.00995350328683694*G0_0_0_3_5 + 0.0231393298059972*G0_0_0_4_0 - 0.000666987333654026*G0_0_0_4_1 - 0.0019496552829887*G0_0_0_4_2 - 0.0123136123136127*G0_0_0_4_3 + 0.00595157928491275*G0_0_0_4_4 + 0.0050280583613919*G0_0_0_4_5 + 0.00661856661856689*G0_0_0_5_0 - 0.00354016354016368*G0_0_0_5_1 - 0.00184704184704192*G0_0_0_5_2 - 0.00995350328683694*G0_0_0_5_3 + 0.0050280583613919*G0_0_0_5_4 + 0.0127240660573999*G0_0_0_5_5 + 0.035709475709477*G0_0_1_0_0 - 0.00169312169312175*G0_0_1_0_1 - 0.00820907487574182*G0_0_1_0_2 + 0.00554112554112567*G0_0_1_0_3 + 0.0231906365239706*G0_0_1_0_4 + 0.00810646143979507*G0_0_1_0_5 - 0.00169312169312175*G0_0_1_1_0 - 0.0211383678050352*G0_0_1_1_1 + 0.00430976430976443*G0_0_1_1_2 - 0.00923520923520949*G0_0_1_1_3 + 0.00123136123136125*G0_0_1_1_4 - 0.00820907487574182*G0_0_1_2_0 + 0.00430976430976443*G0_0_1_2_1 + 0.00430976430976478*G0_0_1_2_2 - 0.00246272246272253*G0_0_1_2_3 + 0.010877024210358*G0_0_1_2_4 + 0.00133397466730802*G0_0_1_2_5 + 0.00554112554112567*G0_0_1_3_0 - 0.00923520923520949*G0_0_1_3_1 - 0.00246272246272253*G0_0_1_3_2 - 0.113285233285237*G0_0_1_3_3 - 0.0135449735449739*G0_0_1_3_4 - 0.0137502004168674*G0_0_1_3_5 + 0.0231906365239706*G0_0_1_4_0 + 0.00123136123136125*G0_0_1_4_1 + 0.010877024210358*G0_0_1_4_2 - 0.0135449735449739*G0_0_1_4_3 + 0.00820907487574167*G0_0_1_4_4 - 0.00513067179733853*G0_0_1_4_5 + 0.00810646143979507*G0_0_1_5_0 + 0.00133397466730802*G0_0_1_5_2 - 0.0137502004168674*G0_0_1_5_3 - 0.00513067179733853*G0_0_1_5_4 + 0.000410453743787271*G0_0_1_5_5 + 0.0336059002725677*G0_1_0_0_0 - 0.000795254128587483*G0_1_0_0_1 - 0.00271925605258946*G0_1_0_0_2 + 0.0036427769761104*G0_1_0_0_3 + 0.0103126503126506*G0_1_0_0_4 + 0.0194452461119134*G0_1_0_0_5 - 0.000795254128587482*G0_1_0_1_0 - 0.0232932499599174*G0_1_0_1_1 + 0.00520763187429871*G0_1_0_1_2 - 0.0260638127304802*G0_1_0_1_3 - 0.00256533589866931*G0_1_0_1_4 - 0.0168286034952707*G0_1_0_1_5 - 0.00271925605258946*G0_1_0_2_0 + 0.00520763187429871*G0_1_0_2_1 + 0.00220618887285558*G0_1_0_2_2 + 0.0088760622093958*G0_1_0_2_3 - 0.00200096200096206*G0_1_0_2_4 - 0.000564373897707251*G0_1_0_2_5 + 0.0036427769761104*G0_1_0_3_0 - 0.0260638127304802*G0_1_0_3_1 + 0.0088760622093958*G0_1_0_3_2 - 0.101176847843518*G0_1_0_3_3 - 0.00215488215488221*G0_1_0_3_4 - 0.00615680615680636*G0_1_0_3_5 + 0.0103126503126506*G0_1_0_4_0 - 0.00256533589866931*G0_1_0_4_1 - 0.00200096200096206*G0_1_0_4_2 - 0.00215488215488221*G0_1_0_4_3 + 0.0036940836940838*G0_1_0_4_4 + 0.00625941959275314*G0_1_0_4_5 + 0.0194452461119134*G0_1_0_5_0 - 0.0168286034952707*G0_1_0_5_1 - 0.00056437389770725*G0_1_0_5_2 - 0.00615680615680636*G0_1_0_5_3 + 0.00625941959275314*G0_1_0_5_4 + 0.0125188391855062*G0_1_0_5_5 + 0.0313997113997121*G0_1_1_0_0 - 0.00600288600288623*G0_1_1_0_1 + 0.00420715087381762*G0_1_1_0_3 + 0.0123136123136126*G0_1_1_0_4 + 0.0105691839025175*G0_1_1_0_5 - 0.00600288600288622*G0_1_1_1_0 + 0.00600288600288615*G0_1_1_1_2 - 0.00923520923520944*G0_1_1_1_3 + 0.00923520923520972*G0_1_1_1_5 + 0.00600288600288616*G0_1_1_2_1 - 0.0313997113997121*G0_1_1_2_2 - 0.0105691839025176*G0_1_1_2_3 - 0.0123136123136126*G0_1_1_2_4 - 0.00420715087381771*G0_1_1_2_5 + 0.00420715087381762*G0_1_1_3_0 - 0.00923520923520943*G0_1_1_3_1 - 0.0105691839025176*G0_1_1_3_2 - 0.113695687029024*G0_1_1_3_3 - 0.00841430174763531*G0_1_1_3_4 + 0.0123136123136126*G0_1_1_4_0 - 0.0123136123136126*G0_1_1_4_2 - 0.00841430174763531*G0_1_1_4_3 + 0.00841430174763538*G0_1_1_4_5 + 0.0105691839025175*G0_1_1_5_0 + 0.00923520923520973*G0_1_1_5_1 - 0.00420715087381771*G0_1_1_5_2 + 0.00841430174763538*G0_1_1_5_4 + 0.113695687029025*G0_1_1_5_5; + A[14] = A[195] - 0.00148789482122821*G0_0_0_0_1 + 0.00466891133557814*G0_0_0_0_2 - 0.00318101651434995*G0_0_0_0_3 - 0.00369408369408378*G0_0_0_0_4 + 0.00369408369408388*G0_0_0_0_5 - 0.00148789482122821*G0_0_0_1_0 + 0.0244219977553319*G0_0_0_1_1 + 0.000461760461760484*G0_0_0_1_2 + 0.0313997113997124*G0_0_0_1_3 + 0.000102613435946763*G0_0_0_1_4 + 0.0015392015392016*G0_0_0_1_5 + 0.00466891133557814*G0_0_0_2_0 + 0.000461760461760483*G0_0_0_2_1 - 0.0276030142696819*G0_0_0_2_2 - 0.0364277697611043*G0_0_0_2_3 - 0.014878948212282*G0_0_0_2_4 - 0.000718294051627412*G0_0_0_2_5 - 0.00318101651434995*G0_0_0_3_0 + 0.0313997113997124*G0_0_0_3_1 - 0.0364277697611043*G0_0_0_3_2 + 0.0123136123136126*G0_0_0_3_3 + 0.00615680615680637*G0_0_0_3_4 + 0.00779862113195471*G0_0_0_3_5 - 0.00369408369408378*G0_0_0_4_0 + 0.000102613435946763*G0_0_0_4_1 - 0.014878948212282*G0_0_0_4_2 + 0.00615680615680637*G0_0_0_4_3 + 0.00656725990059373*G0_0_0_4_4 + 0.00123136123136128*G0_0_0_4_5 + 0.00369408369408388*G0_0_0_5_0 + 0.0015392015392016*G0_0_0_5_1 - 0.000718294051627413*G0_0_0_5_2 + 0.00779862113195471*G0_0_0_5_3 + 0.00123136123136128*G0_0_0_5_4 - 0.00902998236331599*G0_0_0_5_5 - 0.00423280423280439*G0_0_1_0_1 + 0.00423280423280435*G0_0_1_0_2 - 0.0165207631874303*G0_0_1_0_4 + 0.0165207631874305*G0_0_1_0_5 - 0.00423280423280439*G0_0_1_1_0 + 0.0265255731922407*G0_0_1_1_1 + 0.0328876062209406*G0_0_1_1_3 - 0.0011800545133879*G0_0_1_1_4 + 0.00159050825717497*G0_0_1_1_5 + 0.00423280423280435*G0_0_1_2_0 - 0.0265255731922407*G0_0_1_2_2 - 0.0328876062209406*G0_0_1_2_3 - 0.00159050825717497*G0_0_1_2_4 + 0.00118005451338789*G0_0_1_2_5 + 0.0328876062209406*G0_0_1_3_1 - 0.0328876062209406*G0_0_1_3_2 + 0.00236010902677579*G0_0_1_3_4 - 0.00236010902677579*G0_0_1_3_5 - 0.0165207631874303*G0_0_1_4_0 - 0.0011800545133879*G0_0_1_4_1 - 0.00159050825717497*G0_0_1_4_2 + 0.00236010902677579*G0_0_1_4_3 + 0.00677248677248718*G0_0_1_4_4 + 0.0165207631874305*G0_0_1_5_0 + 0.00159050825717497*G0_0_1_5_1 + 0.00118005451338788*G0_0_1_5_2 - 0.0023601090267758*G0_0_1_5_3 - 0.00677248677248691*G0_0_1_5_5 - 0.00192400192400202*G0_1_0_0_1 + 0.00192400192400195*G0_1_0_0_2 + 0.00913259579926289*G0_1_0_0_4 - 0.00913259579926262*G0_1_0_0_5 - 0.00192400192400202*G0_1_0_1_0 + 0.025499438832773*G0_1_0_1_1 + 0.0349398749398761*G0_1_0_1_3 + 0.00200096200096205*G0_1_0_1_4 + 0.0148276414943087*G0_1_0_1_5 + 0.00192400192400195*G0_1_0_2_0 - 0.0254994388327731*G0_1_0_2_2 - 0.0349398749398761*G0_1_0_2_3 - 0.0148276414943087*G0_1_0_2_4 - 0.00200096200096208*G0_1_0_2_5 + 0.0349398749398761*G0_1_0_3_1 - 0.0349398749398761*G0_1_0_3_2 - 0.00400192400192414*G0_1_0_3_4 + 0.00400192400192413*G0_1_0_3_5 + 0.00913259579926289*G0_1_0_4_0 + 0.00200096200096205*G0_1_0_4_1 - 0.0148276414943087*G0_1_0_4_2 - 0.00400192400192414*G0_1_0_4_3 + 0.00882475549142257*G0_1_0_4_4 - 0.00913259579926262*G0_1_0_5_0 + 0.0148276414943087*G0_1_0_5_1 - 0.00200096200096208*G0_1_0_5_2 + 0.00400192400192413*G0_1_0_5_3 - 0.00882475549142233*G0_1_0_5_5 - 0.00466891133557819*G0_1_1_0_1 + 0.00148789482122817*G0_1_1_0_2 + 0.00318101651434996*G0_1_1_0_3 - 0.00369408369408367*G0_1_1_0_4 + 0.00369408369408404*G0_1_1_0_5 - 0.00466891133557819*G0_1_1_1_0 + 0.0276030142696818*G0_1_1_1_1 - 0.00046176046176045*G0_1_1_1_2 + 0.0364277697611042*G0_1_1_1_3 + 0.000718294051627379*G0_1_1_1_4 + 0.014878948212282*G0_1_1_1_5 + 0.00148789482122817*G0_1_1_2_0 - 0.000461760461760451*G0_1_1_2_1 - 0.024421997755332*G0_1_1_2_2 - 0.0313997113997125*G0_1_1_2_3 - 0.00153920153920162*G0_1_1_2_4 - 0.000102613435946786*G0_1_1_2_5 + 0.00318101651434996*G0_1_1_3_0 + 0.0364277697611042*G0_1_1_3_1 - 0.0313997113997125*G0_1_1_3_2 - 0.0123136123136129*G0_1_1_3_3 - 0.0077986211319547*G0_1_1_3_4 - 0.00615680615680637*G0_1_1_3_5 - 0.00369408369408368*G0_1_1_4_0 + 0.000718294051627378*G0_1_1_4_1 - 0.00153920153920162*G0_1_1_4_2 - 0.0077986211319547*G0_1_1_4_3 + 0.00902998236331611*G0_1_1_4_4 - 0.00123136123136121*G0_1_1_4_5 + 0.00369408369408404*G0_1_1_5_0 + 0.014878948212282*G0_1_1_5_1 - 0.000102613435946786*G0_1_1_5_2 - 0.00615680615680637*G0_1_1_5_3 - 0.00123136123136122*G0_1_1_5_4 - 0.00656725990059347*G0_1_1_5_5; + A[19] = -A[25] + 0.0321628988295667*G0_0_0_0_0 - 0.00219015552348894*G0_0_0_0_1 - 0.00705788039121396*G0_0_0_0_2 - 0.00227032227032234*G0_0_0_0_3 + 0.0107487574154245*G0_0_0_0_4 + 0.0107231040564378*G0_0_0_0_5 - 0.00219015552348894*G0_0_0_1_0 + 0.151707551707557*G0_0_0_1_1 - 0.00975789642456342*G0_0_0_1_2 + 0.0334776334776346*G0_0_0_1_3 - 0.00616963283629972*G0_0_0_1_4 - 0.0055154721821389*G0_0_0_1_5 - 0.00705788039121396*G0_0_0_2_0 - 0.00975789642456342*G0_0_0_2_1 + 0.0351899951899963*G0_0_0_2_2 + 0.00328362995029672*G0_0_0_2_3 + 0.0113131313131317*G0_0_0_2_4 - 0.00355299021965701*G0_0_0_2_5 - 0.00227032227032234*G0_0_0_3_0 + 0.0334776334776346*G0_0_0_3_1 + 0.00328362995029672*G0_0_0_3_2 + 0.026576879910214*G0_0_0_3_3 + 0.0168799102132441*G0_0_0_3_4 + 0.0116466249799587*G0_0_0_3_5 + 0.0107487574154245*G0_0_0_4_0 - 0.00616963283629972*G0_0_0_4_1 + 0.0113131313131317*G0_0_0_4_2 + 0.0168799102132441*G0_0_0_4_3 + 0.0850665383998744*G0_0_0_4_4 + 0.0194452461119134*G0_0_0_4_5 + 0.0107231040564378*G0_0_0_5_0 - 0.0055154721821389*G0_0_0_5_1 - 0.00355299021965701*G0_0_0_5_2 + 0.0116466249799587*G0_0_0_5_3 + 0.0194452461119134*G0_0_0_5_4 + 0.0173416706750047*G0_0_0_5_5 - 0.00302709636042978*G0_0_1_0_0 + 0.00756774090107453*G0_0_1_0_1 + 0.00128266794933466*G0_0_1_0_3 - 0.000564373897707238*G0_0_1_0_4 + 0.00743947410614103*G0_0_1_0_5 + 0.00756774090107454*G0_0_1_1_0 - 0.00756774090107446*G0_0_1_1_2 + 0.0389931056597735*G0_0_1_1_3 - 0.0389931056597738*G0_0_1_1_5 - 0.00756774090107446*G0_0_1_2_1 + 0.00302709636042978*G0_0_1_2_2 - 0.007439474106141*G0_0_1_2_3 + 0.00056437389770724*G0_0_1_2_4 - 0.00128266794933466*G0_0_1_2_5 + 0.00128266794933466*G0_0_1_3_0 + 0.0389931056597735*G0_0_1_3_1 - 0.007439474106141*G0_0_1_3_2 + 0.00923520923520938*G0_0_1_3_3 - 0.00256533589866932*G0_0_1_3_4 - 0.000564373897707239*G0_0_1_4_0 + 0.00056437389770724*G0_0_1_4_2 - 0.00256533589866932*G0_0_1_4_3 + 0.00256533589866933*G0_0_1_4_5 + 0.00743947410614103*G0_0_1_5_0 - 0.0389931056597738*G0_0_1_5_1 - 0.00128266794933466*G0_0_1_5_2 + 0.00256533589866933*G0_0_1_5_4 - 0.0092352092352096*G0_0_1_5_5; + A[54] = -A[174] + 0.199890973224314*G0_0_0_0_0 - 0.0184704184704191*G0_0_0_0_1 - 0.0152551974774202*G0_0_0_0_2 - 0.00424135535246661*G0_0_0_0_3 + 0.0809962054406527*G0_0_0_0_4 + 0.0212067767623332*G0_0_0_0_5 - 0.0184704184704191*G0_0_0_1_0 + 0.116979316979321*G0_0_0_1_1 - 0.00212067767623329*G0_0_0_1_2 + 0.00547271658382781*G0_0_0_1_3 - 0.00506226284004081*G0_0_0_1_4 + 0.0273635829191394*G0_0_0_1_5 - 0.0152551974774202*G0_0_0_2_0 - 0.00212067767623329*G0_0_0_2_1 + 0.0102613435946774*G0_0_0_2_2 - 0.00123136123136123*G0_0_0_2_3 - 0.0250376783710125*G0_0_0_2_4 - 0.025311314200204*G0_0_0_2_5 - 0.00424135535246661*G0_0_0_3_0 + 0.00547271658382779*G0_0_0_3_1 - 0.00123136123136123*G0_0_0_3_2 - 0.0596526107637243*G0_0_0_3_3 + 0.0186072363850147*G0_0_0_3_4 + 0.0591053391053411*G0_0_0_3_5 + 0.0809962054406527*G0_0_0_4_0 - 0.00506226284004081*G0_0_0_4_1 - 0.0250376783710125*G0_0_0_4_2 + 0.0186072363850147*G0_0_0_4_3 + 0.104528886751112*G0_0_0_4_4 + 0.0607471540804895*G0_0_0_4_5 + 0.0212067767623332*G0_0_0_5_0 + 0.0273635829191394*G0_0_0_5_1 - 0.0253113142002039*G0_0_0_5_2 + 0.0591053391053411*G0_0_0_5_3 + 0.0607471540804895*G0_0_0_5_4 + 0.154877879322329*G0_0_0_5_5 + 0.00697771364438048*G0_0_1_0_0 - 0.0177863288974406*G0_0_1_0_1 + 0.000752498530276313*G0_0_1_0_2 - 0.00246272246272251*G0_0_1_0_3 + 0.000684089572978515*G0_0_1_0_4 + 0.0276372187483308*G0_0_1_0_5 - 0.0177863288974406*G0_0_1_1_0 + 0.121083854417192*G0_0_1_1_1 - 0.00136817914595695*G0_0_1_1_2 - 0.00547271658382791*G0_0_1_1_4 + 0.0164181497514836*G0_0_1_1_5 + 0.000752498530276313*G0_0_1_2_0 - 0.00136817914595695*G0_0_1_2_1 + 0.00451499118165808*G0_0_1_2_2 + 0.00300999412110544*G0_0_1_2_3 - 0.00916680027791168*G0_0_1_2_4 - 0.027089947089948*G0_0_1_2_5 - 0.00246272246272251*G0_0_1_3_0 + 0.00300999412110544*G0_0_1_3_2 - 0.0755234888568254*G0_0_1_3_3 + 0.0158708780931008*G0_0_1_3_4 + 0.059105339105341*G0_0_1_3_5 + 0.000684089572978519*G0_0_1_4_0 - 0.00547271658382791*G0_0_1_4_1 - 0.00916680027791168*G0_0_1_4_2 + 0.0158708780931008*G0_0_1_4_3 + 0.0142290631179526*G0_0_1_4_4 + 0.0651253273475518*G0_0_1_4_5 + 0.0276372187483308*G0_0_1_5_0 + 0.0164181497514836*G0_0_1_5_1 - 0.027089947089948*G0_0_1_5_2 + 0.059105339105341*G0_0_1_5_3 + 0.0651253273475518*G0_0_1_5_4 + 0.220003206669881*G0_0_1_5_5; + A[50] = -A[54] + 0.0188808722142063*G0_0_0_0_0 - 0.00218908663353116*G0_0_0_0_1 - 0.0168970124525686*G0_0_0_0_2 + 0.00123136123136127*G0_0_0_0_3 - 0.00218908663353113*G0_0_0_0_4 - 0.00560953449842352*G0_0_0_0_5 - 0.00218908663353116*G0_0_0_1_0 - 0.0615680615680635*G0_0_0_1_1 + 0.0085511196622311*G0_0_0_1_2 - 0.0514435358879821*G0_0_0_1_3 - 0.00123136123136126*G0_0_0_1_4 + 0.00629362407140198*G0_0_0_1_5 - 0.0168970124525686*G0_0_0_2_0 + 0.0085511196622311*G0_0_0_2_1 + 0.195786435786442*G0_0_0_2_2 + 0.018470418470419*G0_0_0_2_3 + 0.0685457752124441*G0_0_0_2_4 - 0.00807225696114609*G0_0_0_2_5 + 0.00123136123136127*G0_0_0_3_0 - 0.0514435358879821*G0_0_0_3_1 + 0.018470418470419*G0_0_0_3_2 - 0.198659611992952*G0_0_0_3_3 + 0.0136817914595696*G0_0_0_3_5 - 0.00218908663353113*G0_0_0_4_0 - 0.00123136123136126*G0_0_0_4_1 + 0.0685457752124441*G0_0_0_4_2 + 0.0968670835337533*G0_0_0_4_4 + 0.0186072363850148*G0_0_0_4_5 - 0.00560953449842352*G0_0_0_5_0 + 0.00629362407140198*G0_0_0_5_1 - 0.00807225696114609*G0_0_0_5_2 + 0.0136817914595696*G0_0_0_5_3 + 0.0186072363850148*G0_0_0_5_4 + 0.0563689808134272*G0_0_0_5_5 - 0.00205226871893548*G0_0_1_0_0 - 0.00123136123136126*G0_0_1_0_1 - 0.000820907487574197*G0_0_1_0_2 + 0.0238063171396513*G0_0_1_0_3 + 0.0049254449254451*G0_0_1_0_4 + 0.00246272246272257*G0_0_1_0_5 - 0.00123136123136126*G0_0_1_1_0 - 0.0738816738816763*G0_0_1_1_1 + 0.0275004008337351*G0_0_1_1_2 - 0.0902998236331602*G0_0_1_1_3 + 0.00246272246272253*G0_0_1_1_4 - 0.000820907487574198*G0_0_1_2_0 + 0.0275004008337351*G0_0_1_2_1 - 0.00205226871893545*G0_0_1_2_2 + 0.00410453743787099*G0_0_1_2_3 + 0.000820907487574208*G0_0_1_2_4 - 0.00246272246272254*G0_0_1_2_5 + 0.0238063171396513*G0_0_1_3_0 - 0.0902998236331602*G0_0_1_3_1 + 0.00410453743787099*G0_0_1_3_2 - 0.384184704184718*G0_0_1_3_3 - 0.0525380792047477*G0_0_1_3_4 - 0.0426871893538576*G0_0_1_3_5 + 0.0049254449254451*G0_0_1_4_0 + 0.00246272246272253*G0_0_1_4_1 + 0.000820907487574207*G0_0_1_4_2 - 0.0525380792047477*G0_0_1_4_3 - 0.00985088985089003*G0_0_1_4_4 + 0.00246272246272257*G0_0_1_5_0 - 0.00246272246272254*G0_0_1_5_2 - 0.0426871893538576*G0_0_1_5_3 + 0.0426871893538574*G0_0_1_5_5 + 0.0110822510822516*G0_1_0_0_0 - 0.00191545080433976*G0_1_0_0_1 - 0.0017102239324462*G0_1_0_0_2 - 0.00191545080433974*G0_1_0_0_3 + 0.00041045374378715*G0_1_0_0_4 - 0.00820907487574173*G0_1_0_0_5 - 0.00191545080433976*G0_1_0_1_0 - 0.162129228795901*G0_1_0_1_1 + 0.010398161509273*G0_1_0_1_2 - 0.0615680615680636*G0_1_0_1_3 - 0.000273635829191387*G0_1_0_1_4 + 0.0123136123136125*G0_1_0_1_5 - 0.0017102239324462*G0_1_0_2_0 + 0.010398161509273*G0_1_0_2_1 + 0.0135449735449737*G0_1_0_2_2 + 0.0180599647266319*G0_1_0_2_3 + 0.00615680615680628*G0_1_0_2_4 - 0.00355726577948812*G0_1_0_2_5 - 0.00191545080433974*G0_1_0_3_0 - 0.0615680615680636*G0_1_0_3_1 + 0.0180599647266319*G0_1_0_3_2 - 0.0601998824221067*G0_1_0_3_3 + 0.00437817326706228*G0_1_0_3_4 + 0.0109454331676557*G0_1_0_3_5 + 0.00041045374378715*G0_1_0_4_0 - 0.000273635829191387*G0_1_0_4_1 + 0.00615680615680628*G0_1_0_4_2 + 0.00437817326706228*G0_1_0_4_3 + 0.00875634653412461*G0_1_0_4_4 + 0.00766180321735905*G0_1_0_4_5 - 0.00820907487574173*G0_1_0_5_0 + 0.0123136123136125*G0_1_0_5_1 - 0.00355726577948812*G0_1_0_5_2 + 0.0109454331676557*G0_1_0_5_3 + 0.00766180321735905*G0_1_0_5_4 + 0.0711453155897624*G0_1_0_5_5 - 0.00246272246272262*G0_1_1_0_0 - 0.0123136123136128*G0_1_1_0_1 + 0.00164181497514836*G0_1_1_0_3 - 0.00574635241301927*G0_1_1_0_4 - 0.0262690396023739*G0_1_1_0_5 - 0.0123136123136128*G0_1_1_1_0 + 0.0123136123136127*G0_1_1_1_2 - 0.0738816738816762*G0_1_1_1_3 + 0.0738816738816767*G0_1_1_1_5 + 0.0123136123136127*G0_1_1_2_1 + 0.00246272246272245*G0_1_1_2_2 + 0.0262690396023738*G0_1_1_2_3 + 0.00574635241301924*G0_1_1_2_4 - 0.00164181497514837*G0_1_1_2_5 + 0.00164181497514836*G0_1_1_3_0 - 0.0738816738816762*G0_1_1_3_1 + 0.0262690396023738*G0_1_1_3_2 - 0.131345198011869*G0_1_1_3_3 - 0.00328362995029677*G0_1_1_3_4 - 0.00574635241301927*G0_1_1_4_0 + 0.00574635241301924*G0_1_1_4_2 - 0.00328362995029677*G0_1_1_4_3 + 0.00328362995029672*G0_1_1_4_5 - 0.0262690396023739*G0_1_1_5_0 + 0.0738816738816767*G0_1_1_5_1 - 0.00164181497514837*G0_1_1_5_2 + 0.00328362995029673*G0_1_1_5_4 + 0.131345198011869*G0_1_1_5_5; + A[170] = -A[50] + 0.00574635241301926*G0_0_0_0_0 - 0.000752498530276335*G0_0_0_0_1 - 0.0160076960076965*G0_0_0_0_2 + 0.00177863288974406*G0_0_0_0_3 - 0.0158708780931008*G0_0_0_0_4 - 0.00424135535246657*G0_0_0_0_5 - 0.000752498530276335*G0_0_0_1_0 - 0.00410453743787082*G0_0_0_1_1 - 0.000684089572978451*G0_0_0_1_2 + 0.0109454331676558*G0_0_0_1_3 + 0.00041045374378711*G0_0_0_1_4 + 0.00547271658382785*G0_0_0_1_5 - 0.0160076960076965*G0_0_0_2_0 - 0.000684089572978449*G0_0_0_2_1 + 0.192913259579932*G0_0_0_2_2 - 0.00643044198599786*G0_0_0_2_3 + 0.080312115867674*G0_0_0_2_4 - 0.00177863288974404*G0_0_0_2_5 + 0.00177863288974406*G0_0_0_3_0 + 0.0109454331676558*G0_0_0_3_1 - 0.00643044198599785*G0_0_0_3_2 - 0.0651253273475517*G0_0_0_3_3 - 0.00437817326706235*G0_0_0_3_4 - 0.0158708780931008*G0_0_0_4_0 + 0.00041045374378711*G0_0_0_4_1 + 0.080312115867674*G0_0_0_4_2 - 0.00437817326706235*G0_0_0_4_3 + 0.0902998236331598*G0_0_0_4_4 + 0.00273635829191394*G0_0_0_4_5 - 0.00424135535246657*G0_0_0_5_0 + 0.00547271658382785*G0_0_0_5_1 - 0.00177863288974404*G0_0_0_5_2 + 0.00273635829191395*G0_0_0_5_4 + 0.0158708780931007*G0_0_0_5_5 - 0.004514991181658*G0_0_1_0_0 + 0.00136817914595701*G0_0_1_0_1 - 0.000752498530276339*G0_0_1_0_2 + 0.027089947089948*G0_0_1_0_3 + 0.00916680027791171*G0_0_1_0_4 - 0.00300999412110531*G0_0_1_0_5 + 0.00136817914595701*G0_0_1_1_0 - 0.121083854417193*G0_0_1_1_1 + 0.0177863288974407*G0_0_1_1_2 - 0.0164181497514838*G0_0_1_1_3 + 0.0054727165838279*G0_0_1_1_4 - 0.000752498530276339*G0_0_1_2_0 + 0.0177863288974407*G0_0_1_2_1 - 0.00697771364438061*G0_0_1_2_2 - 0.0276372187483308*G0_0_1_2_3 - 0.000684089572978498*G0_0_1_2_4 + 0.00246272246272254*G0_0_1_2_5 + 0.027089947089948*G0_0_1_3_0 - 0.0164181497514838*G0_0_1_3_1 - 0.0276372187483308*G0_0_1_3_2 - 0.220003206669881*G0_0_1_3_3 - 0.0651253273475518*G0_0_1_3_4 - 0.0591053391053412*G0_0_1_3_5 + 0.00916680027791171*G0_0_1_4_0 + 0.0054727165838279*G0_0_1_4_1 - 0.0006840895729785*G0_0_1_4_2 - 0.0651253273475518*G0_0_1_4_3 - 0.0142290631179523*G0_0_1_4_4 - 0.0158708780931009*G0_0_1_4_5 - 0.00300999412110531*G0_0_1_5_0 + 0.00246272246272254*G0_0_1_5_2 - 0.0591053391053412*G0_0_1_5_3 - 0.0158708780931009*G0_0_1_5_4 + 0.0755234888568247*G0_0_1_5_5; + A[86] = A[170] + 0.000820907487574195*G0_0_1_0_0 - 0.00129977018865917*G0_0_1_0_1 + 0.000820907487574176*G0_0_1_0_2 - 0.00300999412110534*G0_0_1_0_3 - 0.001368179145957*G0_0_1_0_4 + 0.01080861525306*G0_0_1_0_5 - 0.00129977018865917*G0_0_1_1_0 + 0.104665704665709*G0_0_1_1_1 + 0.000615680615680603*G0_0_1_1_2 - 0.0083458927903374*G0_0_1_1_3 - 0.00136817914595699*G0_0_1_1_4 - 0.00396771952327491*G0_0_1_1_5 + 0.000820907487574176*G0_0_1_2_0 + 0.000615680615680603*G0_0_1_2_1 - 0.00944043610710305*G0_0_1_2_2 + 0.00287317620650965*G0_0_1_2_3 - 0.00328362995029669*G0_0_1_2_4 + 0.00164181497514837*G0_0_1_2_5 - 0.00300999412110534*G0_0_1_3_0 - 0.0083458927903374*G0_0_1_3_1 + 0.00287317620650965*G0_0_1_3_2 - 0.0120399764844215*G0_0_1_3_3 + 0.00875634653412462*G0_0_1_3_4 + 0.00273635829191395*G0_0_1_3_5 - 0.001368179145957*G0_0_1_4_0 - 0.00136817914595699*G0_0_1_4_1 - 0.00328362995029668*G0_0_1_4_2 + 0.00875634653412462*G0_0_1_4_3 - 0.00218908663353119*G0_0_1_4_4 - 0.000547271658382774*G0_0_1_4_5 + 0.01080861525306*G0_0_1_5_0 - 0.00396771952327491*G0_0_1_5_1 + 0.00164181497514836*G0_0_1_5_2 + 0.00273635829191395*G0_0_1_5_3 - 0.000547271658382775*G0_0_1_5_4 - 0.0919416386083083*G0_0_1_5_5 - 0.000820907487574195*G0_1_0_0_0 + 0.00129977018865917*G0_1_0_0_1 - 0.000820907487574176*G0_1_0_0_2 + 0.00300999412110534*G0_1_0_0_3 + 0.00136817914595699*G0_1_0_0_4 - 0.01080861525306*G0_1_0_0_5 + 0.00129977018865917*G0_1_0_1_0 - 0.104665704665709*G0_1_0_1_1 - 0.000615680615680603*G0_1_0_1_2 + 0.0083458927903374*G0_1_0_1_3 + 0.00136817914595699*G0_1_0_1_4 + 0.00396771952327492*G0_1_0_1_5 - 0.000820907487574176*G0_1_0_2_0 - 0.000615680615680603*G0_1_0_2_1 + 0.00944043610710305*G0_1_0_2_2 - 0.00287317620650965*G0_1_0_2_3 + 0.00328362995029669*G0_1_0_2_4 - 0.00164181497514837*G0_1_0_2_5 + 0.00300999412110534*G0_1_0_3_0 + 0.0083458927903374*G0_1_0_3_1 - 0.00287317620650965*G0_1_0_3_2 + 0.0120399764844215*G0_1_0_3_3 - 0.00875634653412462*G0_1_0_3_4 - 0.00273635829191395*G0_1_0_3_5 + 0.00136817914595699*G0_1_0_4_0 + 0.00136817914595699*G0_1_0_4_1 + 0.00328362995029668*G0_1_0_4_2 - 0.00875634653412462*G0_1_0_4_3 + 0.00218908663353119*G0_1_0_4_4 + 0.000547271658382776*G0_1_0_4_5 - 0.01080861525306*G0_1_0_5_0 + 0.00396771952327491*G0_1_0_5_1 - 0.00164181497514837*G0_1_0_5_2 - 0.00273635829191395*G0_1_0_5_3 + 0.000547271658382775*G0_1_0_5_4 + 0.0919416386083083*G0_1_0_5_5; + A[33] = -A[36] + 0.00102613435946772*G0_1_0_0_0 - 0.00230880230880241*G0_1_0_0_2 - 0.00318101651434995*G0_1_0_0_3 - 0.0132371332371336*G0_1_0_0_4 - 0.00205226871893544*G0_1_0_0_5 - 0.00102613435946775*G0_1_0_1_1 + 0.00230880230880238*G0_1_0_1_2 + 0.0132371332371337*G0_1_0_1_3 + 0.00318101651434994*G0_1_0_1_4 + 0.00205226871893543*G0_1_0_1_5 - 0.00230880230880241*G0_1_0_2_0 + 0.00230880230880238*G0_1_0_2_1 - 0.0256533589866932*G0_1_0_2_3 + 0.0256533589866932*G0_1_0_2_4 - 0.00318101651434995*G0_1_0_3_0 + 0.0132371332371337*G0_1_0_3_1 - 0.0256533589866932*G0_1_0_3_2 - 0.00205226871893547*G0_1_0_3_3 + 0.00636203302869989*G0_1_0_3_5 - 0.0132371332371336*G0_1_0_4_0 + 0.00318101651434994*G0_1_0_4_1 + 0.0256533589866932*G0_1_0_4_2 + 0.00205226871893559*G0_1_0_4_4 - 0.00636203302869988*G0_1_0_4_5 - 0.00205226871893544*G0_1_0_5_0 + 0.00205226871893543*G0_1_0_5_1 + 0.00636203302869989*G0_1_0_5_3 - 0.00636203302869988*G0_1_0_5_4 - 0.0365047298380645*G0_1_1_0_0 + 0.00606701940035297*G0_1_1_0_1 + 0.00251830474052704*G0_1_1_0_2 - 0.000478862701084925*G0_1_1_0_3 - 0.00788413232857702*G0_1_1_0_4 - 0.0125359414248307*G0_1_1_0_5 + 0.00606701940035297*G0_1_1_1_0 - 0.0375308641975325*G0_1_1_1_1 + 0.00482710704932945*G0_1_1_1_2 + 0.0053530009085566*G0_1_1_1_3 + 0.00270215381326501*G0_1_1_1_4 - 0.0104836727058954*G0_1_1_1_5 + 0.00251830474052704*G0_1_1_2_0 + 0.00482710704932945*G0_1_1_2_1 - 0.077088343755013*G0_1_1_2_2 - 0.0251402918069594*G0_1_1_2_3 + 0.000513067179733834*G0_1_1_2_4 + 0.00124846347068573*G0_1_1_2_5 - 0.000478862701084926*G0_1_1_3_0 + 0.0053530009085566*G0_1_1_3_1 - 0.0251402918069594*G0_1_1_3_2 - 0.00478862701084947*G0_1_1_3_3 - 0.00444658222436016*G0_1_1_3_4 - 0.00153920153920163*G0_1_1_3_5 - 0.00788413232857702*G0_1_1_4_0 + 0.00270215381326501*G0_1_1_4_1 + 0.000513067179733835*G0_1_1_4_2 - 0.00444658222436016*G0_1_1_4_3 - 0.00273635829191387*G0_1_1_4_4 - 0.0079012345679015*G0_1_1_4_5 - 0.0125359414248307*G0_1_1_5_0 - 0.0104836727058954*G0_1_1_5_1 + 0.00124846347068573*G0_1_1_5_2 - 0.00153920153920163*G0_1_1_5_3 - 0.00790123456790149*G0_1_1_5_4 - 0.034820159264605*G0_1_1_5_5; + A[41] = -A[33] - 0.000949174282507699*G0_1_0_0_0 - 0.000671262893485141*G0_1_0_0_1 - 0.00628934851157093*G0_1_0_0_2 - 0.00427555983111552*G0_1_0_0_3 - 0.00395061728395076*G0_1_0_0_4 + 0.0023088023088024*G0_1_0_0_5 - 0.000671262893485141*G0_1_0_1_0 + 0.0211640211640221*G0_1_0_1_1 - 0.00325370103147891*G0_1_0_1_2 + 0.0085511196622311*G0_1_0_1_3 - 0.000342044786489219*G0_1_0_1_5 - 0.00628934851157093*G0_1_0_2_0 - 0.00325370103147891*G0_1_0_2_1 + 0.0896584896584926*G0_1_0_2_2 + 0.000188124632569056*G0_1_0_2_3 + 0.0290567046122611*G0_1_0_2_4 - 0.000718294051627388*G0_1_0_2_5 - 0.00427555983111552*G0_1_0_3_0 + 0.0085511196622311*G0_1_0_3_1 + 0.000188124632569057*G0_1_0_3_2 + 0.0124504302282085*G0_1_0_3_3 + 0.00865373309817784*G0_1_0_3_4 + 0.00998770776548586*G0_1_0_3_5 - 0.00395061728395076*G0_1_0_4_0 + 0.0290567046122611*G0_1_0_4_2 + 0.00865373309817784*G0_1_0_4_3 + 0.0194965528298867*G0_1_0_4_4 + 0.00153920153920159*G0_1_0_4_5 + 0.0023088023088024*G0_1_0_5_0 - 0.00034204478648922*G0_1_0_5_1 - 0.000718294051627388*G0_1_0_5_2 + 0.00998770776548586*G0_1_0_5_3 + 0.00153920153920159*G0_1_0_5_4 - 0.0201122334455676*G0_1_0_5_5; + A[127] = A[113] + 0.0102613435946771*G0_0_1_0_0 + 0.00702902036235395*G0_0_1_0_1 - 0.0258072791406134*G0_0_1_0_2 - 0.0214462081128755*G0_0_1_0_3 - 0.0807567740901102*G0_0_1_0_4 - 0.0111848645181983*G0_0_1_0_5 + 0.00702902036235395*G0_0_1_1_0 + 0.00441237774571126*G0_0_1_1_1 - 0.00784992784992816*G0_0_1_1_2 - 0.0146737213403885*G0_0_1_1_3 - 0.0413532146865495*G0_0_1_1_4 - 0.00738816738816761*G0_0_1_1_5 - 0.0258072791406134*G0_0_1_2_0 - 0.00784992784992816*G0_0_1_2_1 + 0.05438512105179*G0_0_1_2_2 + 0.0246272246272256*G0_0_1_2_3 + 0.142632675966014*G0_0_1_2_4 + 0.00954304954304991*G0_0_1_2_5 - 0.0214462081128755*G0_0_1_3_0 - 0.0146737213403885*G0_0_1_3_1 + 0.0246272246272256*G0_0_1_3_2 + 0.0426871893538577*G0_0_1_3_3 + 0.12559884559885*G0_0_1_3_4 + 0.0238063171396513*G0_0_1_3_5 - 0.0807567740901102*G0_0_1_4_0 - 0.0413532146865495*G0_0_1_4_1 + 0.142632675966014*G0_0_1_4_2 + 0.12559884559885*G0_0_1_4_3 + 0.625531505531528*G0_0_1_4_4 + 0.0636203302869992*G0_0_1_4_5 - 0.0111848645181983*G0_0_1_5_0 - 0.00738816738816761*G0_0_1_5_1 + 0.00954304954304991*G0_0_1_5_2 + 0.0238063171396513*G0_0_1_5_3 + 0.0636203302869992*G0_0_1_5_4 + 0.00738816738816754*G0_0_1_5_5 - 0.0102613435946771*G0_1_0_0_0 - 0.00702902036235395*G0_1_0_0_1 + 0.0258072791406134*G0_1_0_0_2 + 0.0214462081128755*G0_1_0_0_3 + 0.0807567740901102*G0_1_0_0_4 + 0.0111848645181983*G0_1_0_0_5 - 0.00702902036235395*G0_1_0_1_0 - 0.00441237774571126*G0_1_0_1_1 + 0.00784992784992816*G0_1_0_1_2 + 0.0146737213403885*G0_1_0_1_3 + 0.0413532146865495*G0_1_0_1_4 + 0.00738816738816761*G0_1_0_1_5 + 0.0258072791406134*G0_1_0_2_0 + 0.00784992784992816*G0_1_0_2_1 - 0.05438512105179*G0_1_0_2_2 - 0.0246272246272256*G0_1_0_2_3 - 0.142632675966014*G0_1_0_2_4 - 0.00954304954304991*G0_1_0_2_5 + 0.0214462081128755*G0_1_0_3_0 + 0.0146737213403885*G0_1_0_3_1 - 0.0246272246272256*G0_1_0_3_2 - 0.0426871893538577*G0_1_0_3_3 - 0.12559884559885*G0_1_0_3_4 - 0.0238063171396513*G0_1_0_3_5 + 0.0807567740901102*G0_1_0_4_0 + 0.0413532146865494*G0_1_0_4_1 - 0.142632675966014*G0_1_0_4_2 - 0.12559884559885*G0_1_0_4_3 - 0.625531505531528*G0_1_0_4_4 - 0.0636203302869992*G0_1_0_4_5 + 0.0111848645181983*G0_1_0_5_0 + 0.00738816738816761*G0_1_0_5_1 - 0.00954304954304991*G0_1_0_5_2 - 0.0238063171396513*G0_1_0_5_3 - 0.0636203302869992*G0_1_0_5_4 - 0.00738816738816754*G0_1_0_5_5; + A[62] = -A[107] - 0.00302709636042985*G0_0_1_0_0 + 0.0075677409010745*G0_0_1_0_2 + 0.00128266794933465*G0_0_1_0_3 + 0.007439474106141*G0_0_1_0_4 - 0.000564373897707289*G0_0_1_0_5 + 0.00302709636042983*G0_0_1_1_1 - 0.00756774090107452*G0_0_1_1_2 - 0.00743947410614105*G0_0_1_1_3 - 0.00128266794933467*G0_0_1_1_4 + 0.000564373897707267*G0_0_1_1_5 + 0.00756774090107449*G0_0_1_2_0 - 0.00756774090107452*G0_0_1_2_1 + 0.0389931056597737*G0_0_1_2_3 - 0.0389931056597737*G0_0_1_2_4 + 0.00128266794933465*G0_0_1_3_0 - 0.00743947410614105*G0_0_1_3_1 + 0.0389931056597738*G0_0_1_3_2 + 0.0092352092352098*G0_0_1_3_3 - 0.0025653358986693*G0_0_1_3_5 + 0.007439474106141*G0_0_1_4_0 - 0.00128266794933467*G0_0_1_4_1 - 0.0389931056597737*G0_0_1_4_2 - 0.00923520923520942*G0_0_1_4_4 + 0.00256533589866932*G0_0_1_4_5 - 0.000564373897707288*G0_0_1_5_0 + 0.000564373897707267*G0_0_1_5_1 - 0.0025653358986693*G0_0_1_5_3 + 0.00256533589866932*G0_0_1_5_4 + 0.0321628988295666*G0_1_1_0_0 - 0.00705788039121398*G0_1_1_0_1 - 0.00219015552348891*G0_1_1_0_2 - 0.00227032227032235*G0_1_1_0_3 + 0.0107231040564377*G0_1_1_0_4 + 0.0107487574154244*G0_1_1_0_5 - 0.00705788039121398*G0_1_1_1_0 + 0.0351899951899967*G0_1_1_1_1 - 0.00975789642456343*G0_1_1_1_2 + 0.00328362995029678*G0_1_1_1_3 - 0.003552990219657*G0_1_1_1_4 + 0.0113131313131318*G0_1_1_1_5 - 0.00219015552348891*G0_1_1_2_0 - 0.00975789642456343*G0_1_1_2_1 + 0.151707551707557*G0_1_1_2_2 + 0.0334776334776347*G0_1_1_2_3 - 0.00551547218213904*G0_1_1_2_4 - 0.00616963283629968*G0_1_1_2_5 - 0.00227032227032235*G0_1_1_3_0 + 0.00328362995029678*G0_1_1_3_1 + 0.0334776334776347*G0_1_1_3_2 + 0.0265768799102143*G0_1_1_3_3 + 0.0116466249799587*G0_1_1_3_4 + 0.0168799102132441*G0_1_1_3_5 + 0.0107231040564377*G0_1_1_4_0 - 0.003552990219657*G0_1_1_4_1 - 0.00551547218213905*G0_1_1_4_2 + 0.0116466249799587*G0_1_1_4_3 + 0.0173416706750045*G0_1_1_4_4 + 0.0194452461119134*G0_1_1_4_5 + 0.0107487574154244*G0_1_1_5_0 + 0.0113131313131318*G0_1_1_5_1 - 0.00616963283629968*G0_1_1_5_2 + 0.0168799102132441*G0_1_1_5_3 + 0.0194452461119134*G0_1_1_5_4 + 0.0850665383998747*G0_1_1_5_5; + A[44] = A[212] - 0.00302709636042985*G0_0_1_0_0 + 0.00756774090107447*G0_0_1_0_2 + 0.00128266794933465*G0_0_1_0_3 + 0.00743947410614099*G0_0_1_0_4 - 0.000564373897707287*G0_0_1_0_5 + 0.00302709636042983*G0_0_1_1_1 - 0.00756774090107454*G0_0_1_1_2 - 0.00743947410614105*G0_0_1_1_3 - 0.00128266794933468*G0_0_1_1_4 + 0.000564373897707268*G0_0_1_1_5 + 0.00756774090107447*G0_0_1_2_0 - 0.00756774090107455*G0_0_1_2_1 + 0.0389931056597739*G0_0_1_2_3 - 0.0389931056597735*G0_0_1_2_4 + 0.00128266794933465*G0_0_1_3_0 - 0.00743947410614105*G0_0_1_3_1 + 0.0389931056597739*G0_0_1_3_2 + 0.00923520923520979*G0_0_1_3_3 - 0.00256533589866931*G0_0_1_3_5 + 0.00743947410614099*G0_0_1_4_0 - 0.00128266794933468*G0_0_1_4_1 - 0.0389931056597735*G0_0_1_4_2 - 0.00923520923520935*G0_0_1_4_4 + 0.00256533589866932*G0_0_1_4_5 - 0.000564373897707287*G0_0_1_5_0 + 0.000564373897707268*G0_0_1_5_1 - 0.00256533589866931*G0_0_1_5_3 + 0.00256533589866932*G0_0_1_5_4 + 0.00302709636042985*G0_1_0_0_0 - 0.00756774090107447*G0_1_0_0_2 - 0.00128266794933465*G0_1_0_0_3 - 0.00743947410614099*G0_1_0_0_4 + 0.000564373897707287*G0_1_0_0_5 - 0.00302709636042983*G0_1_0_1_1 + 0.00756774090107454*G0_1_0_1_2 + 0.00743947410614105*G0_1_0_1_3 + 0.00128266794933468*G0_1_0_1_4 - 0.000564373897707268*G0_1_0_1_5 - 0.00756774090107447*G0_1_0_2_0 + 0.00756774090107454*G0_1_0_2_1 - 0.0389931056597739*G0_1_0_2_3 + 0.0389931056597735*G0_1_0_2_4 - 0.00128266794933465*G0_1_0_3_0 + 0.00743947410614105*G0_1_0_3_1 - 0.0389931056597739*G0_1_0_3_2 - 0.00923520923520979*G0_1_0_3_3 + 0.00256533589866931*G0_1_0_3_5 - 0.00743947410614099*G0_1_0_4_0 + 0.00128266794933468*G0_1_0_4_1 + 0.0389931056597735*G0_1_0_4_2 + 0.00923520923520936*G0_1_0_4_4 - 0.00256533589866932*G0_1_0_4_5 + 0.000564373897707287*G0_1_0_5_0 - 0.000564373897707269*G0_1_0_5_1 + 0.00256533589866931*G0_1_0_5_3 - 0.00256533589866932*G0_1_0_5_4; + A[42] = -A[44] + 0.00410453743787095*G0_1_0_0_0 - 0.00046176046176048*G0_1_0_0_1 - 0.00800384800384825*G0_1_0_0_2 + 0.000615680615680621*G0_1_0_0_3 + 0.00584896584896601*G0_1_0_0_4 + 0.00410453743787091*G0_1_0_0_5 - 0.00046176046176048*G0_1_0_1_0 - 0.000923520923521011*G0_1_0_1_1 + 0.00482283148949835*G0_1_0_1_2 + 0.00749078082411442*G0_1_0_1_3 + 0.000923520923520936*G0_1_0_1_5 - 0.00800384800384825*G0_1_0_2_0 + 0.00482283148949835*G0_1_0_2_1 - 0.0261664261664272*G0_1_0_2_3 + 0.026166426166427*G0_1_0_2_4 + 0.00318101651434993*G0_1_0_2_5 + 0.00061568061568062*G0_1_0_3_0 + 0.00749078082411442*G0_1_0_3_1 - 0.0261664261664272*G0_1_0_3_2 - 0.00697771364438055*G0_1_0_3_3 - 0.00123136123136127*G0_1_0_3_4 - 0.00759339426006111*G0_1_0_3_5 + 0.00584896584896601*G0_1_0_4_0 + 0.026166426166427*G0_1_0_4_2 - 0.00123136123136127*G0_1_0_4_3 + 0.00944043610710277*G0_1_0_4_4 - 0.00636203302869988*G0_1_0_4_5 + 0.00410453743787091*G0_1_0_5_0 + 0.000923520923520937*G0_1_0_5_1 + 0.00318101651434993*G0_1_0_5_2 - 0.00759339426006111*G0_1_0_5_3 - 0.00636203302869988*G0_1_0_5_4 - 0.0123136123136125*G0_1_0_5_5 - 0.0124162257495595*G0_1_1_0_0 - 0.000666987333654025*G0_1_1_0_1 + 0.0063620330286999*G0_1_1_0_2 + 0.000513067179733853*G0_1_1_0_3 + 0.00266794933461608*G0_1_1_0_4 - 0.0173416706750046*G0_1_1_0_5 - 0.000666987333654025*G0_1_1_1_0 + 0.0110822510822515*G0_1_1_1_1 + 0.00969696969697001*G0_1_1_1_2 + 0.0116979316979321*G0_1_1_1_3 + 0.000615680615680641*G0_1_1_1_4 + 0.0149815616482289*G0_1_1_1_5 + 0.0063620330286999*G0_1_1_2_0 + 0.00969696969697001*G0_1_1_2_1 - 0.0887606220939584*G0_1_1_2_2 - 0.0499727433060784*G0_1_1_2_3 - 0.0275004008337351*G0_1_1_2_4 - 0.00502805836139188*G0_1_1_2_5 + 0.000513067179733854*G0_1_1_3_0 + 0.0116979316979321*G0_1_1_3_1 - 0.0499727433060784*G0_1_1_3_2 - 0.0119031585698256*G0_1_1_3_3 - 0.002257495590829*G0_1_1_3_4 + 0.00902998236331601*G0_1_1_3_5 + 0.00266794933461608*G0_1_1_4_0 + 0.000615680615680641*G0_1_1_4_1 - 0.0275004008337351*G0_1_1_4_2 - 0.002257495590829*G0_1_1_4_3 + 0.00410453743787088*G0_1_1_4_4 + 0.00882475549142243*G0_1_1_4_5 - 0.0173416706750046*G0_1_1_5_0 + 0.0149815616482289*G0_1_1_5_1 - 0.00502805836139187*G0_1_1_5_2 + 0.00902998236331601*G0_1_1_5_3 + 0.00882475549142244*G0_1_1_5_4 + 0.00533589866923213*G0_1_1_5_5; + A[43] = -A[42] - 0.00102613435946772*G0_1_0_0_0 + 0.0023088023088024*G0_1_0_0_2 + 0.00318101651434995*G0_1_0_0_3 + 0.0132371332371336*G0_1_0_0_4 + 0.00205226871893544*G0_1_0_0_5 + 0.00102613435946775*G0_1_0_1_1 - 0.00230880230880239*G0_1_0_1_2 - 0.0132371332371337*G0_1_0_1_3 - 0.00318101651434995*G0_1_0_1_4 - 0.00205226871893543*G0_1_0_1_5 + 0.0023088023088024*G0_1_0_2_0 - 0.00230880230880239*G0_1_0_2_1 + 0.0256533589866932*G0_1_0_2_3 - 0.0256533589866932*G0_1_0_2_4 + 0.00318101651434995*G0_1_0_3_0 - 0.0132371332371337*G0_1_0_3_1 + 0.0256533589866932*G0_1_0_3_2 + 0.00205226871893548*G0_1_0_3_3 - 0.00636203302869988*G0_1_0_3_5 + 0.0132371332371336*G0_1_0_4_0 - 0.00318101651434995*G0_1_0_4_1 - 0.0256533589866932*G0_1_0_4_2 - 0.00205226871893557*G0_1_0_4_4 + 0.00636203302869989*G0_1_0_4_5 + 0.00205226871893544*G0_1_0_5_0 - 0.00205226871893543*G0_1_0_5_1 - 0.00636203302869988*G0_1_0_5_3 + 0.00636203302869989*G0_1_0_5_4 - 0.0200096200096208*G0_1_1_0_0 + 0.00995350328683699*G0_1_1_0_1 - 0.00395061728395071*G0_1_1_0_2 - 0.00123136123136128*G0_1_1_0_3 - 0.00554112554112573*G0_1_1_0_4 - 0.0136475869809209*G0_1_1_0_5 + 0.00995350328683699*G0_1_1_1_0 - 0.0189834856501531*G0_1_1_1_1 - 0.00625941959275312*G0_1_1_1_2 - 0.0187782587782595*G0_1_1_1_3 - 0.00441237774571124*G0_1_1_1_4 - 0.0156998556998563*G0_1_1_1_5 - 0.00395061728395071*G0_1_1_2_0 - 0.00625941959275312*G0_1_1_2_1 + 0.0672118005451359*G0_1_1_2_2 + 0.0425845759179107*G0_1_1_2_3 + 0.0169312169312174*G0_1_1_2_4 + 0.0104665704665708*G0_1_1_2_5 - 0.00123136123136128*G0_1_1_3_0 - 0.0187782587782595*G0_1_1_3_1 + 0.0425845759179107*G0_1_1_3_2 + 0.0184704184704192*G0_1_1_3_3 + 0.0112874779541451*G0_1_1_3_4 - 0.0184704184704191*G0_1_1_3_5 - 0.00554112554112573*G0_1_1_4_0 - 0.00441237774571124*G0_1_1_4_1 + 0.0169312169312174*G0_1_1_4_2 + 0.0112874779541451*G0_1_1_4_3 + 0.0164181497514837*G0_1_1_4_4 - 0.0121083854417191*G0_1_1_4_5 - 0.0136475869809209*G0_1_1_5_0 - 0.0156998556998563*G0_1_1_5_1 + 0.0104665704665708*G0_1_1_5_2 - 0.0184704184704191*G0_1_1_5_3 - 0.0121083854417191*G0_1_1_5_4 - 0.214667308000649*G0_1_1_5_5; + A[141] = A[99] + 0.363251563251576*G0_0_1_0_0 - 0.00820907487574186*G0_0_1_0_3 - 0.00820907487574173*G0_0_1_0_4 - 0.00820907487574159*G0_0_1_0_5 - 0.00656725990059354*G0_0_1_1_1 - 0.00348885682219025*G0_0_1_1_2 + 0.00287317620650958*G0_0_1_1_3 + 0.0164181497514836*G0_0_1_1_4 + 0.0246272246272254*G0_0_1_1_5 - 0.00348885682219025*G0_0_1_2_1 - 0.00656725990059351*G0_0_1_2_2 + 0.00287317620650961*G0_0_1_2_3 + 0.0246272246272254*G0_0_1_2_4 + 0.0164181497514836*G0_0_1_2_5 - 0.00820907487574186*G0_0_1_3_0 + 0.00287317620650958*G0_0_1_3_1 + 0.00287317620650961*G0_0_1_3_2 - 0.00985088985089061*G0_0_1_3_3 - 0.0164181497514837*G0_0_1_3_4 - 0.0164181497514837*G0_0_1_3_5 - 0.00820907487574173*G0_0_1_4_0 + 0.0164181497514836*G0_0_1_4_1 + 0.0246272246272254*G0_0_1_4_2 - 0.0164181497514837*G0_0_1_4_3 - 0.131345198011869*G0_0_1_4_4 - 0.0656725990059345*G0_0_1_4_5 - 0.00820907487574159*G0_0_1_5_0 + 0.0246272246272254*G0_0_1_5_1 + 0.0164181497514836*G0_0_1_5_2 - 0.0164181497514837*G0_0_1_5_3 - 0.0656725990059345*G0_0_1_5_4 - 0.131345198011869*G0_0_1_5_5 - 0.363251563251576*G0_1_0_0_0 + 0.00820907487574186*G0_1_0_0_3 + 0.00820907487574175*G0_1_0_0_4 + 0.0082090748757416*G0_1_0_0_5 + 0.00656725990059354*G0_1_0_1_1 + 0.00348885682219025*G0_1_0_1_2 - 0.00287317620650958*G0_1_0_1_3 - 0.0164181497514836*G0_1_0_1_4 - 0.0246272246272254*G0_1_0_1_5 + 0.00348885682219025*G0_1_0_2_1 + 0.00656725990059351*G0_1_0_2_2 - 0.00287317620650961*G0_1_0_2_3 - 0.0246272246272254*G0_1_0_2_4 - 0.0164181497514836*G0_1_0_2_5 + 0.00820907487574186*G0_1_0_3_0 - 0.00287317620650958*G0_1_0_3_1 - 0.00287317620650961*G0_1_0_3_2 + 0.00985088985089061*G0_1_0_3_3 + 0.0164181497514837*G0_1_0_3_4 + 0.0164181497514837*G0_1_0_3_5 + 0.00820907487574176*G0_1_0_4_0 - 0.0164181497514836*G0_1_0_4_1 - 0.0246272246272254*G0_1_0_4_2 + 0.0164181497514837*G0_1_0_4_3 + 0.131345198011869*G0_1_0_4_4 + 0.0656725990059345*G0_1_0_4_5 + 0.0082090748757416*G0_1_0_5_0 - 0.0246272246272254*G0_1_0_5_1 - 0.0164181497514836*G0_1_0_5_2 + 0.0164181497514837*G0_1_0_5_3 + 0.0656725990059345*G0_1_0_5_4 + 0.131345198011869*G0_1_0_5_5; + A[95] = A[54] - 0.0213435946769288*G0_0_0_0_0 + 0.00218908663353116*G0_0_0_0_1 + 0.00458340013895578*G0_0_0_0_2 + 0.000410453743787074*G0_0_0_0_3 - 0.0240799529688426*G0_0_0_0_4 - 0.000136817914595731*G0_0_0_0_5 + 0.00218908663353116*G0_0_0_1_0 + 0.064030784030786*G0_0_0_1_1 + 0.00376249265138162*G0_0_0_1_2 + 0.0777125754903559*G0_0_0_1_3 - 0.000410453743787111*G0_0_0_1_4 - 0.000547271658382721*G0_0_0_1_5 + 0.00458340013895578*G0_0_0_2_0 + 0.00376249265138162*G0_0_0_2_1 - 0.195786435786442*G0_0_0_2_2 - 0.0923520923520954*G0_0_0_2_3 + 0.00533589866923236*G0_0_0_2_4 + 0.00807225696114608*G0_0_0_2_5 + 0.000410453743787075*G0_0_0_3_0 + 0.077712575490356*G0_0_0_3_1 - 0.0923520923520954*G0_0_0_3_2 + 0.0673144139810831*G0_0_0_3_3 - 0.0169654214098664*G0_0_0_3_5 - 0.0240799529688426*G0_0_0_4_0 - 0.000410453743787111*G0_0_0_4_1 + 0.00533589866923235*G0_0_0_4_2 + 0.034478114478116*G0_0_0_4_4 - 0.015323606434718*G0_0_0_4_5 - 0.000136817914595731*G0_0_0_5_0 - 0.000547271658382719*G0_0_0_5_1 + 0.00807225696114608*G0_0_0_5_2 - 0.0169654214098664*G0_0_0_5_3 - 0.015323606434718*G0_0_0_5_4 - 0.0563689808134271*G0_0_0_5_5 + 0.000410453743787077*G0_0_1_0_1 - 0.000410453743787101*G0_0_1_0_2 - 0.00246272246272261*G0_0_1_0_4 + 0.00246272246272251*G0_0_1_0_5 + 0.000410453743787077*G0_0_1_1_0 + 0.0718294051627408*G0_0_1_1_1 + 0.0944043610710311*G0_0_1_1_3 - 0.00492544492544508*G0_0_1_1_4 + 0.000820907487574337*G0_0_1_1_5 - 0.0004104537437871*G0_0_1_2_0 - 0.0718294051627409*G0_0_1_2_2 - 0.0944043610710311*G0_0_1_2_3 - 0.000820907487574124*G0_0_1_2_4 + 0.00492544492544505*G0_0_1_2_5 + 0.0944043610710311*G0_0_1_3_1 - 0.0944043610710311*G0_0_1_3_2 + 0.0098508898508902*G0_0_1_3_4 - 0.00985088985089007*G0_0_1_3_5 - 0.00246272246272261*G0_0_1_4_0 - 0.00492544492544508*G0_0_1_4_1 - 0.000820907487574124*G0_0_1_4_2 + 0.0098508898508902*G0_0_1_4_3 + 0.0525380792047475*G0_0_1_4_4 + 0.00246272246272251*G0_0_1_5_0 + 0.000820907487574338*G0_0_1_5_1 + 0.00492544492544505*G0_0_1_5_2 - 0.00985088985089007*G0_0_1_5_3 - 0.0525380792047474*G0_0_1_5_5 + 0.000205226871893573*G0_1_0_0_1 - 0.000205226871893564*G0_1_0_0_2 - 0.00861952861952895*G0_1_0_0_4 + 0.00861952861952883*G0_1_0_0_5 + 0.000205226871893573*G0_1_0_1_0 + 0.175674202340875*G0_1_0_1_1 + 0.0796280262946957*G0_1_0_1_3 - 0.00328362995029674*G0_1_0_1_4 - 0.00615680615680625*G0_1_0_1_5 - 0.000205226871893565*G0_1_0_2_0 - 0.175674202340875*G0_1_0_2_2 - 0.0796280262946956*G0_1_0_2_3 + 0.00615680615680641*G0_1_0_2_4 + 0.00328362995029669*G0_1_0_2_5 + 0.0796280262946956*G0_1_0_3_1 - 0.0796280262946957*G0_1_0_3_2 + 0.00656725990059347*G0_1_0_3_4 - 0.00656725990059341*G0_1_0_3_5 - 0.00861952861952895*G0_1_0_4_0 - 0.00328362995029674*G0_1_0_4_1 + 0.00615680615680641*G0_1_0_4_2 + 0.00656725990059347*G0_1_0_4_3 + 0.062388969055638*G0_1_0_4_4 + 0.00861952861952883*G0_1_0_5_0 - 0.00615680615680626*G0_1_0_5_1 + 0.00328362995029669*G0_1_0_5_2 - 0.00656725990059341*G0_1_0_5_3 - 0.0623889690556379*G0_1_0_5_5 + 0.0213435946769287*G0_1_1_0_0 - 0.00458340013895584*G0_1_1_0_1 - 0.00218908663353117*G0_1_1_0_2 - 0.000410453743787127*G0_1_1_0_3 + 0.000136817914595662*G0_1_1_0_4 + 0.0240799529688427*G0_1_1_0_5 - 0.00458340013895584*G0_1_1_1_0 + 0.195786435786442*G0_1_1_1_1 - 0.00376249265138167*G0_1_1_1_2 + 0.0923520923520955*G0_1_1_1_3 - 0.00807225696114612*G0_1_1_1_4 - 0.00533589866923204*G0_1_1_1_5 - 0.00218908663353117*G0_1_1_2_0 - 0.00376249265138167*G0_1_1_2_1 - 0.0640307840307862*G0_1_1_2_2 - 0.077712575490356*G0_1_1_2_3 + 0.000547271658382844*G0_1_1_2_4 + 0.000410453743787066*G0_1_1_2_5 - 0.000410453743787127*G0_1_1_3_0 + 0.0923520923520955*G0_1_1_3_1 - 0.077712575490356*G0_1_1_3_2 - 0.0673144139810831*G0_1_1_3_3 + 0.0169654214098664*G0_1_1_3_4 + 0.000136817914595663*G0_1_1_4_0 - 0.00807225696114612*G0_1_1_4_1 + 0.000547271658382843*G0_1_1_4_2 + 0.0169654214098664*G0_1_1_4_3 + 0.0563689808134271*G0_1_1_4_4 + 0.0153236064347181*G0_1_1_4_5 + 0.0240799529688427*G0_1_1_5_0 - 0.00533589866923204*G0_1_1_5_1 + 0.000410453743787066*G0_1_1_5_2 + 0.0153236064347181*G0_1_1_5_4 - 0.0344781144781156*G0_1_1_5_5; + A[78] = -A[86] + 0.00574635241301926*G0_0_0_0_0 - 0.000752498530276335*G0_0_0_0_1 - 0.0160076960076965*G0_0_0_0_2 + 0.00177863288974406*G0_0_0_0_3 - 0.0158708780931008*G0_0_0_0_4 - 0.00424135535246657*G0_0_0_0_5 - 0.000752498530276335*G0_0_0_1_0 - 0.00410453743787082*G0_0_0_1_1 - 0.000684089572978451*G0_0_0_1_2 + 0.0109454331676558*G0_0_0_1_3 + 0.000410453743787109*G0_0_0_1_4 + 0.00547271658382785*G0_0_0_1_5 - 0.0160076960076965*G0_0_0_2_0 - 0.000684089572978451*G0_0_0_2_1 + 0.192913259579933*G0_0_0_2_2 - 0.00643044198599785*G0_0_0_2_3 + 0.080312115867674*G0_0_0_2_4 - 0.00177863288974404*G0_0_0_2_5 + 0.00177863288974406*G0_0_0_3_0 + 0.0109454331676558*G0_0_0_3_1 - 0.00643044198599785*G0_0_0_3_2 - 0.0651253273475517*G0_0_0_3_3 - 0.00437817326706234*G0_0_0_3_4 - 0.0158708780931008*G0_0_0_4_0 + 0.00041045374378711*G0_0_0_4_1 + 0.080312115867674*G0_0_0_4_2 - 0.00437817326706234*G0_0_0_4_3 + 0.0902998236331598*G0_0_0_4_4 + 0.00273635829191394*G0_0_0_4_5 - 0.00424135535246657*G0_0_0_5_0 + 0.00547271658382785*G0_0_0_5_1 - 0.00177863288974404*G0_0_0_5_2 + 0.00273635829191395*G0_0_0_5_4 + 0.0158708780931007*G0_0_0_5_5 - 0.004514991181658*G0_1_0_0_0 + 0.00136817914595701*G0_1_0_0_1 - 0.000752498530276339*G0_1_0_0_2 + 0.027089947089948*G0_1_0_0_3 + 0.00916680027791171*G0_1_0_0_4 - 0.00300999412110531*G0_1_0_0_5 + 0.00136817914595701*G0_1_0_1_0 - 0.121083854417193*G0_1_0_1_1 + 0.0177863288974407*G0_1_0_1_2 - 0.0164181497514838*G0_1_0_1_3 + 0.00547271658382789*G0_1_0_1_4 - 0.00075249853027634*G0_1_0_2_0 + 0.0177863288974407*G0_1_0_2_1 - 0.00697771364438061*G0_1_0_2_2 - 0.0276372187483308*G0_1_0_2_3 - 0.000684089572978499*G0_1_0_2_4 + 0.00246272246272254*G0_1_0_2_5 + 0.027089947089948*G0_1_0_3_0 - 0.0164181497514838*G0_1_0_3_1 - 0.0276372187483308*G0_1_0_3_2 - 0.220003206669881*G0_1_0_3_3 - 0.0651253273475518*G0_1_0_3_4 - 0.0591053391053412*G0_1_0_3_5 + 0.00916680027791171*G0_1_0_4_0 + 0.00547271658382789*G0_1_0_4_1 - 0.000684089572978501*G0_1_0_4_2 - 0.0651253273475518*G0_1_0_4_3 - 0.0142290631179523*G0_1_0_4_4 - 0.0158708780931009*G0_1_0_4_5 - 0.00300999412110531*G0_1_0_5_0 + 0.00246272246272254*G0_1_0_5_2 - 0.0591053391053412*G0_1_0_5_3 - 0.0158708780931009*G0_1_0_5_4 + 0.0755234888568247*G0_1_0_5_5; + A[123] = -A[78] - 0.00451499118165793*G0_1_0_0_0 - 0.000752498530276334*G0_1_0_0_1 + 0.00136817914595695*G0_1_0_0_2 + 0.027089947089948*G0_1_0_0_3 - 0.00300999412110531*G0_1_0_0_4 + 0.00916680027791171*G0_1_0_0_5 - 0.000752498530276333*G0_1_0_1_0 - 0.00697771364438062*G0_1_0_1_1 + 0.0177863288974406*G0_1_0_1_2 - 0.027637218748331*G0_1_0_1_3 + 0.00246272246272255*G0_1_0_1_4 - 0.000684089572978517*G0_1_0_1_5 + 0.00136817914595695*G0_1_0_2_0 + 0.0177863288974406*G0_1_0_2_1 - 0.121083854417192*G0_1_0_2_2 - 0.0164181497514836*G0_1_0_2_3 + 0.00547271658382785*G0_1_0_2_5 + 0.027089947089948*G0_1_0_3_0 - 0.027637218748331*G0_1_0_3_1 - 0.0164181497514836*G0_1_0_3_2 - 0.220003206669881*G0_1_0_3_3 - 0.0591053391053412*G0_1_0_3_4 - 0.0651253273475518*G0_1_0_3_5 - 0.00300999412110531*G0_1_0_4_0 + 0.00246272246272255*G0_1_0_4_1 - 0.0591053391053411*G0_1_0_4_3 + 0.0755234888568248*G0_1_0_4_4 - 0.0158708780931008*G0_1_0_4_5 + 0.00916680027791171*G0_1_0_5_0 - 0.000684089572978518*G0_1_0_5_1 + 0.00547271658382785*G0_1_0_5_2 - 0.0651253273475518*G0_1_0_5_3 - 0.0158708780931008*G0_1_0_5_4 - 0.0142290631179524*G0_1_0_5_5 + 0.00574635241301933*G0_1_1_0_0 - 0.0160076960076967*G0_1_1_0_1 - 0.000752498530276332*G0_1_1_0_2 + 0.00177863288974405*G0_1_1_0_3 - 0.0042413553524666*G0_1_1_0_4 - 0.0158708780931009*G0_1_1_0_5 - 0.0160076960076967*G0_1_1_1_0 + 0.192913259579935*G0_1_1_1_1 - 0.000684089572978537*G0_1_1_1_2 - 0.00643044198599756*G0_1_1_1_3 - 0.00177863288974408*G0_1_1_1_4 + 0.0803121158676747*G0_1_1_1_5 - 0.000752498530276332*G0_1_1_2_0 - 0.000684089572978537*G0_1_1_2_1 - 0.00410453743787073*G0_1_1_2_2 + 0.0109454331676558*G0_1_1_2_3 + 0.00547271658382789*G0_1_1_2_4 + 0.000410453743787062*G0_1_1_2_5 + 0.00177863288974405*G0_1_1_3_0 - 0.00643044198599755*G0_1_1_3_1 + 0.0109454331676558*G0_1_1_3_2 - 0.065125327347552*G0_1_1_3_3 - 0.00437817326706224*G0_1_1_3_5 - 0.0042413553524666*G0_1_1_4_0 - 0.00177863288974408*G0_1_1_4_1 + 0.00547271658382789*G0_1_1_4_2 + 0.0158708780931009*G0_1_1_4_4 + 0.00273635829191395*G0_1_1_4_5 - 0.0158708780931009*G0_1_1_5_0 + 0.0803121158676747*G0_1_1_5_1 + 0.000410453743787062*G0_1_1_5_2 - 0.00437817326706224*G0_1_1_5_3 + 0.00273635829191395*G0_1_1_5_4 + 0.0902998236331602*G0_1_1_5_5; + A[172] = -A[52] + 0.014058040724708*G0_0_0_0_0 + 0.00164181497514836*G0_0_0_0_1 + 0.00651595318262007*G0_0_0_0_2 - 0.00769600769600799*G0_0_0_0_3 + 0.0160076960076965*G0_0_0_0_4 - 0.0130319063652401*G0_0_0_0_5 + 0.00164181497514836*G0_0_0_1_0 + 0.00410453743787135*G0_0_0_1_1 + 0.00312970979637656*G0_0_0_1_2 + 0.00410453743787102*G0_0_0_1_3 - 0.000923520923521027*G0_0_0_1_4 + 0.00205226871893549*G0_0_0_1_5 + 0.00651595318262007*G0_0_0_2_0 + 0.00312970979637656*G0_0_0_2_1 + 0.0519223985890667*G0_0_0_2_2 - 0.0243193843193852*G0_0_0_2_3 - 0.0429950296616978*G0_0_0_2_4 - 0.00441237774571123*G0_0_0_2_5 - 0.00769600769600799*G0_0_0_3_0 + 0.00410453743787102*G0_0_0_3_1 - 0.0243193843193852*G0_0_0_3_2 + 0.0225749559082905*G0_0_0_3_3 + 0.017239057239058*G0_0_0_3_4 + 0.0242167708834385*G0_0_0_3_5 + 0.0160076960076965*G0_0_0_4_0 - 0.000923520923521028*G0_0_0_4_1 - 0.0429950296616978*G0_0_0_4_2 + 0.017239057239058*G0_0_0_4_3 - 0.320564373897717*G0_0_0_4_4 + 0.0106717973384645*G0_0_0_4_5 - 0.0130319063652401*G0_0_0_5_0 + 0.00205226871893549*G0_0_0_5_1 - 0.00441237774571123*G0_0_0_5_2 + 0.0242167708834385*G0_0_0_5_3 + 0.0106717973384645*G0_0_0_5_4 + 0.0233958633958641*G0_0_0_5_5 - 0.0378643578643595*G0_0_1_0_0 - 0.00148789482122818*G0_0_1_0_1 - 0.00328362995029673*G0_0_1_0_3 + 0.0590027256693941*G0_0_1_0_4 + 0.0112874779541449*G0_0_1_0_5 - 0.00148789482122818*G0_0_1_1_0 + 0.0014878948212282*G0_0_1_1_2 + 0.00205226871893549*G0_0_1_1_3 - 0.00205226871893545*G0_0_1_1_5 + 0.0014878948212282*G0_0_1_2_1 + 0.0378643578643588*G0_0_1_2_2 - 0.011287477954145*G0_0_1_2_3 - 0.0590027256693942*G0_0_1_2_4 + 0.00328362995029679*G0_0_1_2_5 - 0.00328362995029673*G0_0_1_3_0 + 0.00205226871893549*G0_0_1_3_1 - 0.011287477954145*G0_0_1_3_2 - 0.000820907487574091*G0_0_1_3_3 + 0.00656725990059346*G0_0_1_3_4 + 0.0590027256693941*G0_0_1_4_0 - 0.0590027256693942*G0_0_1_4_2 + 0.00656725990059345*G0_0_1_4_3 - 0.0065672599005936*G0_0_1_4_5 + 0.0112874779541449*G0_0_1_5_0 - 0.00205226871893545*G0_0_1_5_1 + 0.00328362995029679*G0_0_1_5_2 - 0.0065672599005936*G0_0_1_5_4 + 0.000820907487573826*G0_0_1_5_5; + A[158] = A[172] - 0.00902998236331609*G0_0_0_0_0 - 0.0010774410774411*G0_0_0_0_1 - 0.00128266794933467*G0_0_0_0_2 + 0.00338624338624351*G0_0_0_0_3 - 0.00246272246272251*G0_0_0_0_4 + 0.00369408369408387*G0_0_0_0_5 - 0.0010774410774411*G0_0_0_1_0 - 0.0122109988776663*G0_0_0_1_1 - 0.000666987333654033*G0_0_0_1_2 - 0.00184704184704191*G0_0_0_1_3 + 0.00256533589866934*G0_0_0_1_4 + 0.00194965528298855*G0_0_0_1_5 - 0.00128266794933467*G0_0_0_2_0 - 0.000666987333654033*G0_0_0_2_1 + 0.00964566297899704*G0_0_0_2_2 + 0.00790123456790156*G0_0_0_2_3 + 0.0101587301587306*G0_0_0_2_4 + 0.00133397466730806*G0_0_0_2_5 + 0.00338624338624351*G0_0_0_3_0 - 0.00184704184704191*G0_0_0_3_1 + 0.00790123456790156*G0_0_0_3_2 - 0.0106717973384644*G0_0_0_3_3 - 0.0119031585698257*G0_0_0_3_4 - 0.00944043610710314*G0_0_0_3_5 - 0.00246272246272251*G0_0_0_4_0 + 0.00256533589866934*G0_0_0_4_1 + 0.0101587301587306*G0_0_0_4_2 - 0.0119031585698257*G0_0_0_4_3 + 0.113285233285237*G0_0_0_4_4 - 0.00779862113195478*G0_0_0_4_5 + 0.00369408369408387*G0_0_0_5_0 + 0.00194965528298855*G0_0_0_5_1 + 0.00133397466730806*G0_0_0_5_2 - 0.00944043610710314*G0_0_0_5_3 - 0.00779862113195478*G0_0_0_5_4 - 0.0123136123136128*G0_0_0_5_5 - 0.000820907487574192*G0_0_1_0_1 + 0.000820907487574156*G0_0_1_0_2 - 0.0204200737534077*G0_0_1_0_4 + 0.0204200737534079*G0_0_1_0_5 - 0.000820907487574192*G0_0_1_1_0 - 0.0112874779541452*G0_0_1_1_1 - 0.00348885682219031*G0_0_1_1_3 + 0.0018470418470419*G0_0_1_1_4 - 0.0189834856501531*G0_0_1_1_5 + 0.000820907487574155*G0_0_1_2_0 + 0.0112874779541453*G0_0_1_2_2 + 0.00348885682219032*G0_0_1_2_3 + 0.018983485650153*G0_0_1_2_4 - 0.00184704184704192*G0_0_1_2_5 - 0.00348885682219031*G0_0_1_3_1 + 0.00348885682219032*G0_0_1_3_2 - 0.00369408369408381*G0_0_1_3_4 + 0.00369408369408381*G0_0_1_3_5 - 0.0204200737534077*G0_0_1_4_0 + 0.0018470418470419*G0_0_1_4_1 + 0.018983485650153*G0_0_1_4_2 - 0.00369408369408381*G0_0_1_4_3 - 0.0508962642295989*G0_0_1_4_4 + 0.0204200737534079*G0_0_1_5_0 - 0.0189834856501531*G0_0_1_5_1 - 0.00184704184704193*G0_0_1_5_2 + 0.0036940836940838*G0_0_1_5_3 + 0.0508962642295995*G0_0_1_5_5 - 0.000615680615680587*G0_1_0_0_1 + 0.000615680615680651*G0_1_0_0_2 + 0.00318101651434998*G0_1_0_0_4 - 0.00318101651434988*G0_1_0_0_5 - 0.000615680615680587*G0_1_0_1_0 - 0.0134423601090278*G0_1_0_1_1 - 0.00400192400192414*G0_1_0_1_3 + 0.00307840307840317*G0_1_0_1_4 + 0.00256533589866906*G0_1_0_1_5 + 0.000615680615680651*G0_1_0_2_0 + 0.0134423601090271*G0_1_0_2_2 + 0.00400192400192406*G0_1_0_2_3 - 0.00256533589866942*G0_1_0_2_4 - 0.00307840307840317*G0_1_0_2_5 - 0.00400192400192414*G0_1_0_3_1 + 0.00400192400192406*G0_1_0_3_2 - 0.00615680615680635*G0_1_0_3_4 + 0.00615680615680632*G0_1_0_3_5 + 0.00318101651434998*G0_1_0_4_0 + 0.00307840307840317*G0_1_0_4_1 - 0.00256533589866942*G0_1_0_4_2 - 0.00615680615680635*G0_1_0_4_3 - 0.0336572069905413*G0_1_0_4_4 - 0.00318101651434988*G0_1_0_5_0 + 0.00256533589866906*G0_1_0_5_1 - 0.00307840307840317*G0_1_0_5_2 + 0.00615680615680632*G0_1_0_5_3 + 0.0336572069905409*G0_1_0_5_5 + 0.00902998236331569*G0_1_1_0_0 + 0.00128266794933473*G0_1_1_0_1 + 0.00107744107744111*G0_1_1_0_2 - 0.00338624338624349*G0_1_1_0_3 - 0.00369408369408391*G0_1_1_0_4 + 0.00246272246272249*G0_1_1_0_5 + 0.00128266794933473*G0_1_1_1_0 - 0.00964566297899699*G0_1_1_1_1 + 0.000666987333654039*G0_1_1_1_2 - 0.00790123456790158*G0_1_1_1_3 - 0.00133397466730806*G0_1_1_1_4 - 0.0101587301587307*G0_1_1_1_5 + 0.00107744107744111*G0_1_1_2_0 + 0.000666987333654039*G0_1_1_2_1 + 0.0122109988776659*G0_1_1_2_2 + 0.00184704184704193*G0_1_1_2_3 - 0.00194965528298859*G0_1_1_2_4 - 0.00256533589866926*G0_1_1_2_5 - 0.00338624338624349*G0_1_1_3_0 - 0.00790123456790158*G0_1_1_3_1 + 0.00184704184704193*G0_1_1_3_2 + 0.0106717973384642*G0_1_1_3_3 + 0.00944043610710312*G0_1_1_3_4 + 0.0119031585698255*G0_1_1_3_5 - 0.00369408369408391*G0_1_1_4_0 - 0.00133397466730806*G0_1_1_4_1 - 0.00194965528298859*G0_1_1_4_2 + 0.00944043610710312*G0_1_1_4_3 + 0.012313612313613*G0_1_1_4_4 + 0.00779862113195466*G0_1_1_4_5 + 0.00246272246272249*G0_1_1_5_0 - 0.0101587301587307*G0_1_1_5_1 - 0.00256533589866926*G0_1_1_5_2 + 0.0119031585698255*G0_1_1_5_3 + 0.00779862113195466*G0_1_1_5_4 - 0.113285233285238*G0_1_1_5_5; + A[155] = -A[158] - 0.0378643578643593*G0_0_1_0_0 - 0.00148789482122822*G0_0_1_0_2 - 0.00328362995029669*G0_0_1_0_3 + 0.011287477954145*G0_0_1_0_4 + 0.0590027256693944*G0_0_1_0_5 + 0.0378643578643597*G0_0_1_1_1 + 0.0014878948212282*G0_0_1_1_2 - 0.011287477954145*G0_0_1_1_3 + 0.00328362995029671*G0_0_1_1_4 - 0.0590027256693944*G0_0_1_1_5 - 0.00148789482122822*G0_0_1_2_0 + 0.0014878948212282*G0_0_1_2_1 + 0.00205226871893553*G0_0_1_2_3 - 0.00205226871893538*G0_0_1_2_4 - 0.00328362995029669*G0_0_1_3_0 - 0.011287477954145*G0_0_1_3_1 + 0.00205226871893553*G0_0_1_3_2 - 0.000820907487574542*G0_0_1_3_3 + 0.00656725990059332*G0_0_1_3_5 + 0.011287477954145*G0_0_1_4_0 + 0.00328362995029671*G0_0_1_4_1 - 0.00205226871893538*G0_0_1_4_2 + 0.000820907487574185*G0_0_1_4_4 - 0.00656725990059347*G0_0_1_4_5 + 0.0590027256693944*G0_0_1_5_0 - 0.0590027256693944*G0_0_1_5_1 + 0.00656725990059332*G0_0_1_5_3 - 0.00656725990059348*G0_0_1_5_4 + 0.0140580407247077*G0_1_1_0_0 + 0.00651595318262007*G0_1_1_0_1 + 0.00164181497514835*G0_1_1_0_2 - 0.00769600769600794*G0_1_1_0_3 - 0.0130319063652402*G0_1_1_0_4 + 0.0160076960076965*G0_1_1_0_5 + 0.00651595318262008*G0_1_1_1_0 + 0.0519223985890677*G0_1_1_1_1 + 0.00312970979637655*G0_1_1_1_2 - 0.0243193843193851*G0_1_1_1_3 - 0.00441237774571126*G0_1_1_1_4 - 0.0429950296616977*G0_1_1_1_5 + 0.00164181497514835*G0_1_1_2_0 + 0.00312970979637655*G0_1_1_2_1 + 0.00410453743787095*G0_1_1_2_2 + 0.00410453743787101*G0_1_1_2_3 + 0.00205226871893556*G0_1_1_2_4 - 0.000923520923520898*G0_1_1_2_5 - 0.00769600769600794*G0_1_1_3_0 - 0.0243193843193851*G0_1_1_3_1 + 0.00410453743787101*G0_1_1_3_2 + 0.0225749559082898*G0_1_1_3_3 + 0.0242167708834384*G0_1_1_3_4 + 0.0172390572390577*G0_1_1_3_5 - 0.0130319063652402*G0_1_1_4_0 - 0.00441237774571126*G0_1_1_4_1 + 0.00205226871893556*G0_1_1_4_2 + 0.0242167708834384*G0_1_1_4_3 + 0.0233958633958646*G0_1_1_4_4 + 0.0106717973384644*G0_1_1_4_5 + 0.0160076960076965*G0_1_1_5_0 - 0.0429950296616977*G0_1_1_5_1 - 0.000923520923520896*G0_1_1_5_2 + 0.0172390572390577*G0_1_1_5_3 + 0.0106717973384644*G0_1_1_5_4 - 0.320564373897719*G0_1_1_5_5; + A[85] = A[155] - 0.0016418149751484*G0_0_1_0_0 - 0.00251402918069594*G0_0_1_0_1 - 0.000820907487574201*G0_0_1_0_2 + 0.00215488215488219*G0_0_1_0_3 + 0.00133397466730801*G0_0_1_0_4 - 0.0227801827801836*G0_0_1_0_5 - 0.00251402918069594*G0_0_1_1_0 - 0.0395061728395079*G0_0_1_1_1 - 0.00230880230880241*G0_0_1_1_2 + 0.012621452621453*G0_0_1_1_3 - 0.0011287477954145*G0_0_1_1_4 + 0.0362225428892108*G0_0_1_1_5 - 0.000820907487574201*G0_0_1_2_0 - 0.00230880230880241*G0_0_1_2_1 - 0.0037966971300304*G0_0_1_2_2 - 0.0012313612313612*G0_0_1_2_3 + 0.000820907487574289*G0_0_1_2_4 + 0.00338624338624348*G0_0_1_2_5 + 0.00215488215488219*G0_0_1_3_0 + 0.012621452621453*G0_0_1_3_1 - 0.0012313612313612*G0_0_1_3_2 + 0.00410453743787127*G0_0_1_3_3 - 0.00205226871893536*G0_0_1_3_4 - 0.0110822510822513*G0_0_1_3_5 + 0.00133397466730801*G0_0_1_4_0 - 0.0011287477954145*G0_0_1_4_1 + 0.000820907487574289*G0_0_1_4_2 - 0.00205226871893537*G0_0_1_4_3 + 0.00328362995029694*G0_0_1_4_4 - 0.00451499118165796*G0_0_1_4_5 - 0.0227801827801836*G0_0_1_5_0 + 0.0362225428892108*G0_0_1_5_1 + 0.00338624338624348*G0_0_1_5_2 - 0.0110822510822513*G0_0_1_5_3 - 0.00451499118165796*G0_0_1_5_4 + 0.0213435946769293*G0_0_1_5_5 + 0.0016418149751484*G0_1_0_0_0 + 0.00251402918069594*G0_1_0_0_1 + 0.000820907487574201*G0_1_0_0_2 - 0.00215488215488219*G0_1_0_0_3 - 0.00133397466730801*G0_1_0_0_4 + 0.0227801827801836*G0_1_0_0_5 + 0.00251402918069594*G0_1_0_1_0 + 0.0395061728395079*G0_1_0_1_1 + 0.00230880230880241*G0_1_0_1_2 - 0.012621452621453*G0_1_0_1_3 + 0.0011287477954145*G0_1_0_1_4 - 0.0362225428892108*G0_1_0_1_5 + 0.000820907487574201*G0_1_0_2_0 + 0.00230880230880241*G0_1_0_2_1 + 0.0037966971300304*G0_1_0_2_2 + 0.0012313612313612*G0_1_0_2_3 - 0.000820907487574289*G0_1_0_2_4 - 0.00338624338624348*G0_1_0_2_5 - 0.00215488215488219*G0_1_0_3_0 - 0.012621452621453*G0_1_0_3_1 + 0.0012313612313612*G0_1_0_3_2 - 0.00410453743787128*G0_1_0_3_3 + 0.00205226871893537*G0_1_0_3_4 + 0.0110822510822513*G0_1_0_3_5 - 0.00133397466730801*G0_1_0_4_0 + 0.0011287477954145*G0_1_0_4_1 - 0.000820907487574288*G0_1_0_4_2 + 0.00205226871893537*G0_1_0_4_3 - 0.00328362995029694*G0_1_0_4_4 + 0.00451499118165796*G0_1_0_4_5 + 0.0227801827801836*G0_1_0_5_0 - 0.0362225428892108*G0_1_0_5_1 - 0.00338624338624348*G0_1_0_5_2 + 0.0110822510822513*G0_1_0_5_3 + 0.00451499118165796*G0_1_0_5_4 - 0.0213435946769293*G0_1_0_5_5; + A[130] = -A[85] - 0.0378643578643593*G0_1_0_0_0 - 0.00148789482122822*G0_1_0_0_2 - 0.00328362995029669*G0_1_0_0_3 + 0.0112874779541449*G0_1_0_0_4 + 0.0590027256693944*G0_1_0_0_5 + 0.0378643578643597*G0_1_0_1_1 + 0.0014878948212282*G0_1_0_1_2 - 0.011287477954145*G0_1_0_1_3 + 0.00328362995029671*G0_1_0_1_4 - 0.0590027256693944*G0_1_0_1_5 - 0.00148789482122822*G0_1_0_2_0 + 0.0014878948212282*G0_1_0_2_1 + 0.00205226871893553*G0_1_0_2_3 - 0.00205226871893538*G0_1_0_2_4 - 0.00328362995029669*G0_1_0_3_0 - 0.011287477954145*G0_1_0_3_1 + 0.00205226871893553*G0_1_0_3_2 - 0.000820907487574544*G0_1_0_3_3 + 0.00656725990059332*G0_1_0_3_5 + 0.0112874779541449*G0_1_0_4_0 + 0.00328362995029671*G0_1_0_4_1 - 0.00205226871893538*G0_1_0_4_2 + 0.000820907487574185*G0_1_0_4_4 - 0.00656725990059347*G0_1_0_4_5 + 0.0590027256693944*G0_1_0_5_0 - 0.0590027256693944*G0_1_0_5_1 + 0.00656725990059332*G0_1_0_5_3 - 0.00656725990059348*G0_1_0_5_4 + 0.0140580407247077*G0_1_1_0_0 + 0.00651595318262008*G0_1_1_0_1 + 0.00164181497514835*G0_1_1_0_2 - 0.00769600769600794*G0_1_1_0_3 - 0.0130319063652402*G0_1_1_0_4 + 0.0160076960076965*G0_1_1_0_5 + 0.00651595318262008*G0_1_1_1_0 + 0.0519223985890677*G0_1_1_1_1 + 0.00312970979637655*G0_1_1_1_2 - 0.0243193843193851*G0_1_1_1_3 - 0.00441237774571126*G0_1_1_1_4 - 0.0429950296616977*G0_1_1_1_5 + 0.00164181497514835*G0_1_1_2_0 + 0.00312970979637655*G0_1_1_2_1 + 0.00410453743787095*G0_1_1_2_2 + 0.00410453743787101*G0_1_1_2_3 + 0.00205226871893556*G0_1_1_2_4 - 0.000923520923520897*G0_1_1_2_5 - 0.00769600769600794*G0_1_1_3_0 - 0.0243193843193851*G0_1_1_3_1 + 0.00410453743787101*G0_1_1_3_2 + 0.0225749559082898*G0_1_1_3_3 + 0.0242167708834384*G0_1_1_3_4 + 0.0172390572390577*G0_1_1_3_5 - 0.0130319063652402*G0_1_1_4_0 - 0.00441237774571126*G0_1_1_4_1 + 0.00205226871893556*G0_1_1_4_2 + 0.0242167708834384*G0_1_1_4_3 + 0.0233958633958646*G0_1_1_4_4 + 0.0106717973384644*G0_1_1_4_5 + 0.0160076960076965*G0_1_1_5_0 - 0.0429950296616977*G0_1_1_5_1 - 0.000923520923520896*G0_1_1_5_2 + 0.0172390572390577*G0_1_1_5_3 + 0.0106717973384644*G0_1_1_5_4 - 0.320564373897719*G0_1_1_5_5; + A[105] = A[7] - 0.21269841269842*G0_0_1_0_0 + 0.0139169472502811*G0_0_1_0_1 + 0.00634920634920657*G0_0_1_0_2 - 0.0016033349366683*G0_0_1_0_3 - 0.0226390893057568*G0_0_1_0_4 - 0.0616321949655305*G0_0_1_0_5 + 0.0139169472502811*G0_0_1_1_0 - 0.00221260221260229*G0_0_1_1_1 - 0.00109988776655448*G0_0_1_1_2 + 0.00111592111592115*G0_0_1_1_3 + 0.00493827160493844*G0_0_1_1_4 + 0.00962000962000996*G0_0_1_1_5 + 0.00634920634920657*G0_0_1_2_0 - 0.00109988776655448*G0_0_1_2_1 + 0.000814494147827652*G0_0_1_2_2 + 0.00168029501362844*G0_0_1_2_3 + 0.00218053551386896*G0_0_1_2_4 + 0.00365560365560379*G0_0_1_2_5 - 0.0016033349366683*G0_0_1_3_0 + 0.00111592111592115*G0_0_1_3_1 + 0.00168029501362844*G0_0_1_3_2 + 0.00041045374378712*G0_0_1_3_3 - 0.00666987333654023*G0_0_1_3_4 - 0.00410453743787091*G0_0_1_3_5 - 0.0226390893057568*G0_0_1_4_0 + 0.00493827160493844*G0_0_1_4_1 + 0.00218053551386896*G0_0_1_4_2 - 0.00666987333654023*G0_0_1_4_3 - 0.0297578964245642*G0_0_1_4_4 - 0.0171877505210845*G0_0_1_4_5 - 0.0616321949655305*G0_0_1_5_0 + 0.00962000962000996*G0_0_1_5_1 + 0.00365560365560379*G0_0_1_5_2 - 0.00410453743787091*G0_0_1_5_3 - 0.0171877505210845*G0_0_1_5_4 - 0.0389931056597738*G0_0_1_5_5 + 0.21269841269842*G0_1_0_0_0 - 0.0139169472502811*G0_1_0_0_1 - 0.00634920634920657*G0_1_0_0_2 + 0.0016033349366683*G0_1_0_0_3 + 0.0226390893057568*G0_1_0_0_4 + 0.0616321949655305*G0_1_0_0_5 - 0.0139169472502811*G0_1_0_1_0 + 0.00221260221260229*G0_1_0_1_1 + 0.00109988776655448*G0_1_0_1_2 - 0.00111592111592115*G0_1_0_1_3 - 0.00493827160493844*G0_1_0_1_4 - 0.00962000962000996*G0_1_0_1_5 - 0.00634920634920657*G0_1_0_2_0 + 0.00109988776655448*G0_1_0_2_1 - 0.000814494147827659*G0_1_0_2_2 - 0.00168029501362845*G0_1_0_2_3 - 0.00218053551386896*G0_1_0_2_4 - 0.00365560365560379*G0_1_0_2_5 + 0.0016033349366683*G0_1_0_3_0 - 0.00111592111592115*G0_1_0_3_1 - 0.00168029501362844*G0_1_0_3_2 - 0.000410453743787141*G0_1_0_3_3 + 0.00666987333654023*G0_1_0_3_4 + 0.00410453743787091*G0_1_0_3_5 + 0.0226390893057568*G0_1_0_4_0 - 0.00493827160493844*G0_1_0_4_1 - 0.00218053551386896*G0_1_0_4_2 + 0.00666987333654023*G0_1_0_4_3 + 0.0297578964245642*G0_1_0_4_4 + 0.0171877505210845*G0_1_0_4_5 + 0.0616321949655305*G0_1_0_5_0 - 0.00962000962000996*G0_1_0_5_1 - 0.00365560365560379*G0_1_0_5_2 + 0.00410453743787091*G0_1_0_5_3 + 0.0171877505210845*G0_1_0_5_4 + 0.0389931056597738*G0_1_0_5_5; + A[10] = A[105] + 0.212698412698421*G0_0_0_0_0 - 0.00822510822510851*G0_0_0_0_1 - 0.0120410453743791*G0_0_0_0_2 + 0.0016033349366683*G0_0_0_0_3 + 0.0693923360590051*G0_0_0_0_4 + 0.0148789482122822*G0_0_0_0_5 - 0.00822510822510851*G0_0_0_1_0 + 0.0316370049703394*G0_0_0_1_1 + 0.00109988776655447*G0_0_0_1_2 + 0.0224979958313299*G0_0_0_1_3 - 0.0010133076799744*G0_0_0_1_4 + 0.0104409171075841*G0_0_0_1_5 - 0.0120410453743791*G0_0_0_2_0 + 0.00109988776655447*G0_0_0_2_1 - 0.0302388969055646*G0_0_0_2_2 - 0.0252942119608795*G0_0_0_2_3 - 0.022241462241463*G0_0_0_2_4 - 0.00758056758056786*G0_0_0_2_5 + 0.0016033349366683*G0_0_0_3_0 + 0.0224979958313299*G0_0_0_3_1 - 0.0252942119608795*G0_0_0_3_2 - 0.000410453743787211*G0_0_0_3_3 - 0.00118005451338789*G0_0_0_3_4 + 0.011954465287799*G0_0_0_3_5 + 0.0693923360590051*G0_0_0_4_0 - 0.0010133076799744*G0_0_0_4_1 - 0.022241462241463*G0_0_0_4_2 - 0.00118005451338789*G0_0_0_4_3 + 0.0472021805355156*G0_0_0_4_4 + 0.0171877505210845*G0_0_0_4_5 + 0.0148789482122822*G0_0_0_5_0 + 0.0104409171075841*G0_0_0_5_1 - 0.00758056758056786*G0_0_0_5_2 + 0.011954465287799*G0_0_0_5_3 + 0.0171877505210845*G0_0_0_5_4 + 0.0215488215488224*G0_0_0_5_5 - 0.00187590187590196*G0_0_1_0_1 + 0.00187590187590192*G0_0_1_0_2 + 0.00776014109347478*G0_0_1_0_4 - 0.00776014109347459*G0_0_1_0_5 - 0.00187590187590196*G0_0_1_1_0 + 0.0324514991181669*G0_0_1_1_1 + 0.0241782908449583*G0_0_1_1_3 + 0.00264229597562939*G0_0_1_1_4 + 0.012621452621453*G0_0_1_1_5 + 0.00187590187590192*G0_0_1_2_0 - 0.032451499118167*G0_0_1_2_2 - 0.0241782908449583*G0_0_1_2_3 - 0.0126214526214531*G0_0_1_2_4 - 0.00264229597562941*G0_0_1_2_5 + 0.0241782908449583*G0_0_1_3_1 - 0.0241782908449584*G0_0_1_3_2 - 0.00528459195125881*G0_0_1_3_4 + 0.00528459195125879*G0_0_1_3_5 + 0.00776014109347478*G0_0_1_4_0 + 0.00264229597562939*G0_0_1_4_1 - 0.0126214526214531*G0_0_1_4_2 - 0.00528459195125881*G0_0_1_4_3 + 0.0082090748757419*G0_0_1_4_4 - 0.00776014109347459*G0_0_1_5_0 + 0.012621452621453*G0_0_1_5_1 - 0.00264229597562941*G0_0_1_5_2 + 0.00528459195125879*G0_0_1_5_3 - 0.00820907487574173*G0_0_1_5_5 + 0.00569183902517256*G0_1_0_0_1 - 0.00569183902517257*G0_1_0_0_2 + 0.0467532467532484*G0_1_0_0_4 - 0.0467532467532483*G0_1_0_0_5 + 0.00569183902517256*G0_1_0_1_0 + 0.029424402757737*G0_1_0_1_1 + 0.023613916947251*G0_1_0_1_3 + 0.00392496392496404*G0_1_0_1_4 + 0.0200609267275941*G0_1_0_1_5 - 0.00569183902517257*G0_1_0_2_0 - 0.029424402757737*G0_1_0_2_2 - 0.0236139169472511*G0_1_0_2_3 - 0.0200609267275941*G0_1_0_2_4 - 0.00392496392496406*G0_1_0_2_5 + 0.023613916947251*G0_1_0_3_1 - 0.0236139169472511*G0_1_0_3_2 - 0.00784992784992814*G0_1_0_3_4 + 0.00784992784992809*G0_1_0_3_5 + 0.0467532467532484*G0_1_0_4_0 + 0.00392496392496404*G0_1_0_4_1 - 0.0200609267275941*G0_1_0_4_2 - 0.00784992784992814*G0_1_0_4_3 + 0.0174442841109513*G0_1_0_4_4 - 0.0467532467532483*G0_1_0_5_0 + 0.0200609267275941*G0_1_0_5_1 - 0.00392496392496406*G0_1_0_5_2 + 0.00784992784992809*G0_1_0_5_3 - 0.0174442841109515*G0_1_0_5_5 - 0.21269841269842*G0_1_1_0_0 + 0.0120410453743791*G0_1_1_0_1 + 0.0082251082251085*G0_1_1_0_2 - 0.00160333493666828*G0_1_1_0_3 - 0.014878948212282*G0_1_1_0_4 - 0.0693923360590051*G0_1_1_0_5 + 0.0120410453743791*G0_1_1_1_0 + 0.0302388969055645*G0_1_1_1_1 - 0.00109988776655445*G0_1_1_1_2 + 0.0252942119608794*G0_1_1_1_3 + 0.00758056758056783*G0_1_1_1_4 + 0.022241462241463*G0_1_1_1_5 + 0.0082251082251085*G0_1_1_2_0 - 0.00109988776655445*G0_1_1_2_1 - 0.0316370049703395*G0_1_1_2_2 - 0.0224979958313299*G0_1_1_2_3 - 0.0104409171075841*G0_1_1_2_4 + 0.00101330767997439*G0_1_1_2_5 - 0.00160333493666828*G0_1_1_3_0 + 0.0252942119608794*G0_1_1_3_1 - 0.0224979958313299*G0_1_1_3_2 + 0.000410453743786905*G0_1_1_3_3 - 0.0119544652877991*G0_1_1_3_4 + 0.00118005451338784*G0_1_1_3_5 - 0.014878948212282*G0_1_1_4_0 + 0.00758056758056783*G0_1_1_4_1 - 0.0104409171075841*G0_1_1_4_2 - 0.0119544652877991*G0_1_1_4_3 - 0.0215488215488223*G0_1_1_4_4 - 0.0171877505210845*G0_1_1_4_5 - 0.0693923360590051*G0_1_1_5_0 + 0.022241462241463*G0_1_1_5_1 + 0.00101330767997439*G0_1_1_5_2 + 0.00118005451338784*G0_1_1_5_3 - 0.0171877505210845*G0_1_1_5_4 - 0.0472021805355157*G0_1_1_5_5; + A[150] = A[10] + 0.21269841269842*G0_0_1_0_0 - 0.00634920634920655*G0_0_1_0_1 - 0.0139169472502811*G0_0_1_0_2 + 0.0016033349366683*G0_0_1_0_3 + 0.0616321949655303*G0_0_1_0_4 + 0.0226390893057568*G0_0_1_0_5 - 0.00634920634920655*G0_0_1_1_0 - 0.000814494147827555*G0_0_1_1_1 + 0.00109988776655448*G0_0_1_1_2 - 0.00168029501362842*G0_0_1_1_3 - 0.00365560365560378*G0_0_1_1_4 - 0.00218053551386895*G0_0_1_1_5 - 0.0139169472502811*G0_0_1_2_0 + 0.00109988776655448*G0_0_1_2_1 + 0.00221260221260227*G0_0_1_2_2 - 0.00111592111592116*G0_0_1_2_3 - 0.00962000962000993*G0_0_1_2_4 - 0.00493827160493844*G0_0_1_2_5 + 0.0016033349366683*G0_0_1_3_0 - 0.00168029501362842*G0_0_1_3_1 - 0.00111592111592116*G0_0_1_3_2 - 0.000410453743787093*G0_0_1_3_3 + 0.00410453743787091*G0_0_1_3_4 + 0.00666987333654022*G0_0_1_3_5 + 0.0616321949655304*G0_0_1_4_0 - 0.00365560365560378*G0_0_1_4_1 - 0.00962000962000993*G0_0_1_4_2 + 0.00410453743787091*G0_0_1_4_3 + 0.0389931056597736*G0_0_1_4_4 + 0.0171877505210845*G0_0_1_4_5 + 0.0226390893057568*G0_0_1_5_0 - 0.00218053551386895*G0_0_1_5_1 - 0.00493827160493844*G0_0_1_5_2 + 0.00666987333654022*G0_0_1_5_3 + 0.0171877505210845*G0_0_1_5_4 + 0.029757896424564*G0_0_1_5_5 - 0.21269841269842*G0_1_0_0_0 + 0.00634920634920655*G0_1_0_0_1 + 0.0139169472502811*G0_1_0_0_2 - 0.0016033349366683*G0_1_0_0_3 - 0.0616321949655304*G0_1_0_0_4 - 0.0226390893057568*G0_1_0_0_5 + 0.00634920634920655*G0_1_0_1_0 + 0.000814494147827555*G0_1_0_1_1 - 0.00109988776655448*G0_1_0_1_2 + 0.00168029501362842*G0_1_0_1_3 + 0.00365560365560378*G0_1_0_1_4 + 0.00218053551386895*G0_1_0_1_5 + 0.0139169472502811*G0_1_0_2_0 - 0.00109988776655448*G0_1_0_2_1 - 0.00221260221260227*G0_1_0_2_2 + 0.00111592111592116*G0_1_0_2_3 + 0.00962000962000993*G0_1_0_2_4 + 0.00493827160493844*G0_1_0_2_5 - 0.0016033349366683*G0_1_0_3_0 + 0.00168029501362842*G0_1_0_3_1 + 0.00111592111592116*G0_1_0_3_2 + 0.000410453743787099*G0_1_0_3_3 - 0.00410453743787091*G0_1_0_3_4 - 0.00666987333654022*G0_1_0_3_5 - 0.0616321949655304*G0_1_0_4_0 + 0.00365560365560378*G0_1_0_4_1 + 0.00962000962000993*G0_1_0_4_2 - 0.00410453743787091*G0_1_0_4_3 - 0.0389931056597736*G0_1_0_4_4 - 0.0171877505210845*G0_1_0_4_5 - 0.0226390893057568*G0_1_0_5_0 + 0.00218053551386895*G0_1_0_5_1 + 0.00493827160493844*G0_1_0_5_2 - 0.00666987333654022*G0_1_0_5_3 - 0.0171877505210845*G0_1_0_5_4 - 0.029757896424564*G0_1_0_5_5; + A[98] = -A[95] + 0.00697771364438066*G0_0_1_0_0 + 0.0007524985302763*G0_0_1_0_1 - 0.0177863288974406*G0_0_1_0_2 - 0.00246272246272257*G0_0_1_0_3 + 0.0276372187483307*G0_0_1_0_4 + 0.000684089572978497*G0_0_1_0_5 + 0.0007524985302763*G0_0_1_1_0 + 0.00451499118165812*G0_0_1_1_1 - 0.00136817914595696*G0_0_1_1_2 + 0.00300999412110543*G0_0_1_1_3 - 0.027089947089948*G0_0_1_1_4 - 0.00916680027791161*G0_0_1_1_5 - 0.0177863288974406*G0_0_1_2_0 - 0.00136817914595696*G0_0_1_2_1 + 0.121083854417191*G0_0_1_2_2 + 0.0164181497514837*G0_0_1_2_4 - 0.00547271658382787*G0_0_1_2_5 - 0.00246272246272257*G0_0_1_3_0 + 0.00300999412110543*G0_0_1_3_1 - 0.0755234888568249*G0_0_1_3_3 + 0.0591053391053411*G0_0_1_3_4 + 0.0158708780931009*G0_0_1_3_5 + 0.0276372187483307*G0_0_1_4_0 - 0.027089947089948*G0_0_1_4_1 + 0.0164181497514837*G0_0_1_4_2 + 0.0591053391053411*G0_0_1_4_3 + 0.220003206669881*G0_0_1_4_4 + 0.0651253273475518*G0_0_1_4_5 + 0.000684089572978502*G0_0_1_5_0 - 0.00916680027791161*G0_0_1_5_1 - 0.00547271658382787*G0_0_1_5_2 + 0.0158708780931009*G0_0_1_5_3 + 0.0651253273475518*G0_0_1_5_4 + 0.0142290631179529*G0_0_1_5_5 + 0.199890973224313*G0_1_1_0_0 - 0.0152551974774202*G0_1_1_0_1 - 0.0184704184704191*G0_1_1_0_2 - 0.00424135535246665*G0_1_1_0_3 + 0.021206776762333*G0_1_1_0_4 + 0.0809962054406528*G0_1_1_0_5 - 0.0152551974774202*G0_1_1_1_0 + 0.0102613435946774*G0_1_1_1_1 - 0.0021206776762333*G0_1_1_1_2 - 0.00123136123136124*G0_1_1_1_3 - 0.0253113142002039*G0_1_1_1_4 - 0.0250376783710125*G0_1_1_1_5 - 0.0184704184704191*G0_1_1_2_0 - 0.0021206776762333*G0_1_1_2_1 + 0.116979316979321*G0_1_1_2_2 + 0.00547271658382785*G0_1_1_2_3 + 0.0273635829191395*G0_1_1_2_4 - 0.00506226284004077*G0_1_1_2_5 - 0.00424135535246665*G0_1_1_3_0 - 0.00123136123136124*G0_1_1_3_1 + 0.00547271658382785*G0_1_1_3_2 - 0.0596526107637239*G0_1_1_3_3 + 0.0591053391053411*G0_1_1_3_4 + 0.0186072363850148*G0_1_1_3_5 + 0.021206776762333*G0_1_1_4_0 - 0.0253113142002039*G0_1_1_4_1 + 0.0273635829191395*G0_1_1_4_2 + 0.0591053391053411*G0_1_1_4_3 + 0.154877879322329*G0_1_1_4_4 + 0.0607471540804895*G0_1_1_4_5 + 0.0809962054406528*G0_1_1_5_0 - 0.0250376783710125*G0_1_1_5_1 - 0.00506226284004077*G0_1_1_5_2 + 0.0186072363850148*G0_1_1_5_3 + 0.0607471540804895*G0_1_1_5_4 + 0.104528886751113*G0_1_1_5_5; + A[126] = A[98] - 0.0164181497514837*G0_0_1_0_0 + 0.0184020095131212*G0_0_1_0_2 + 0.00410453743787091*G0_0_1_0_3 - 0.0247640425418211*G0_0_1_0_4 - 0.00396771952327523*G0_0_1_0_5 - 0.00369408369408384*G0_0_1_1_1 + 0.00779862113195473*G0_0_1_1_3 + 0.0240799529688427*G0_0_1_1_4 + 0.00779862113195472*G0_0_1_1_5 + 0.0184020095131212*G0_0_1_2_0 - 0.0164181497514833*G0_0_1_2_2 - 0.00396771952327521*G0_0_1_2_3 - 0.0247640425418212*G0_0_1_2_4 + 0.00410453743787091*G0_0_1_2_5 + 0.00410453743787091*G0_0_1_3_0 + 0.00779862113195473*G0_0_1_3_1 - 0.00396771952327521*G0_0_1_3_2 - 0.0164181497514838*G0_0_1_3_3 - 0.0563689808134272*G0_0_1_3_4 - 0.0164181497514837*G0_0_1_3_5 - 0.0247640425418211*G0_0_1_4_0 + 0.0240799529688427*G0_0_1_4_1 - 0.0247640425418212*G0_0_1_4_2 - 0.0563689808134272*G0_0_1_4_3 - 0.232043183154302*G0_0_1_4_4 - 0.0563689808134272*G0_0_1_4_5 - 0.00396771952327524*G0_0_1_5_0 + 0.00779862113195472*G0_0_1_5_1 + 0.00410453743787091*G0_0_1_5_2 - 0.0164181497514837*G0_0_1_5_3 - 0.0563689808134272*G0_0_1_5_4 - 0.0164181497514838*G0_0_1_5_5 + 0.0164181497514837*G0_1_0_0_0 - 0.0184020095131212*G0_1_0_0_2 - 0.00410453743787091*G0_1_0_0_3 + 0.0247640425418211*G0_1_0_0_4 + 0.00396771952327523*G0_1_0_0_5 + 0.00369408369408384*G0_1_0_1_1 - 0.00779862113195472*G0_1_0_1_3 - 0.0240799529688427*G0_1_0_1_4 - 0.00779862113195472*G0_1_0_1_5 - 0.0184020095131212*G0_1_0_2_0 + 0.0164181497514833*G0_1_0_2_2 + 0.0039677195232752*G0_1_0_2_3 + 0.0247640425418212*G0_1_0_2_4 - 0.00410453743787091*G0_1_0_2_5 - 0.00410453743787091*G0_1_0_3_0 - 0.00779862113195473*G0_1_0_3_1 + 0.00396771952327521*G0_1_0_3_2 + 0.0164181497514838*G0_1_0_3_3 + 0.0563689808134272*G0_1_0_3_4 + 0.0164181497514837*G0_1_0_3_5 + 0.0247640425418211*G0_1_0_4_0 - 0.0240799529688427*G0_1_0_4_1 + 0.0247640425418212*G0_1_0_4_2 + 0.0563689808134272*G0_1_0_4_3 + 0.232043183154302*G0_1_0_4_4 + 0.0563689808134272*G0_1_0_4_5 + 0.00396771952327523*G0_1_0_5_0 - 0.00779862113195472*G0_1_0_5_1 - 0.00410453743787091*G0_1_0_5_2 + 0.0164181497514837*G0_1_0_5_3 + 0.0563689808134272*G0_1_0_5_4 + 0.0164181497514838*G0_1_0_5_5; + A[173] = -A[170] + 0.0143658810325483*G0_0_1_0_0 + 0.00280476724921183*G0_0_1_0_1 + 0.000684089572978482*G0_0_1_0_2 + 0.00738816738816764*G0_0_1_0_3 - 0.00766180321735896*G0_0_1_0_4 - 0.019838597616376*G0_0_1_0_5 + 0.00280476724921183*G0_0_1_1_0 - 0.114106140772813*G0_0_1_1_1 + 0.0017786328897441*G0_0_1_1_2 + 0.00574635241301914*G0_0_1_1_3 + 0.000547271658382813*G0_0_1_1_4 + 0.0061568061568061*G0_0_1_1_5 + 0.000684089572978481*G0_0_1_2_0 + 0.0017786328897441*G0_0_1_2_1 - 0.0054727165838279*G0_0_1_2_3 + 0.00547271658382784*G0_0_1_2_4 - 0.00246272246272256*G0_0_1_2_5 + 0.00738816738816764*G0_0_1_3_0 + 0.00574635241301914*G0_0_1_3_1 - 0.0054727165838279*G0_0_1_3_2 - 0.0158708780931009*G0_0_1_3_4 - 0.00985088985089017*G0_0_1_3_5 - 0.00766180321735897*G0_0_1_4_0 + 0.000547271658382813*G0_0_1_4_1 + 0.00547271658382784*G0_0_1_4_2 - 0.0158708780931009*G0_0_1_4_3 + 0.0317417561862018*G0_0_1_4_4 + 0.00383090160867952*G0_0_1_4_5 - 0.019838597616376*G0_0_1_5_0 + 0.0061568061568061*G0_0_1_5_1 - 0.00246272246272256*G0_0_1_5_2 - 0.00985088985089016*G0_0_1_5_3 + 0.00383090160867952*G0_0_1_5_4 + 0.121494308160979*G0_0_1_5_5 - 0.00574635241301937*G0_1_1_0_0 + 0.0160076960076967*G0_1_1_0_1 + 0.000752498530276327*G0_1_1_0_2 - 0.00177863288974404*G0_1_1_0_3 + 0.00424135535246658*G0_1_1_0_4 + 0.0158708780931009*G0_1_1_0_5 + 0.0160076960076967*G0_1_1_1_0 - 0.192913259579935*G0_1_1_1_1 + 0.000684089572978536*G0_1_1_1_2 + 0.00643044198599756*G0_1_1_1_3 + 0.00177863288974407*G0_1_1_1_4 - 0.0803121158676748*G0_1_1_1_5 + 0.000752498530276327*G0_1_1_2_0 + 0.000684089572978535*G0_1_1_2_1 + 0.00410453743787088*G0_1_1_2_2 - 0.0109454331676558*G0_1_1_2_3 - 0.00547271658382786*G0_1_1_2_4 - 0.000410453743787047*G0_1_1_2_5 - 0.00177863288974404*G0_1_1_3_0 + 0.00643044198599757*G0_1_1_3_1 - 0.0109454331676558*G0_1_1_3_2 + 0.0651253273475519*G0_1_1_3_3 + 0.0043781732670622*G0_1_1_3_5 + 0.00424135535246658*G0_1_1_4_0 + 0.00177863288974407*G0_1_1_4_1 - 0.00547271658382785*G0_1_1_4_2 - 0.0158708780931008*G0_1_1_4_4 - 0.00273635829191398*G0_1_1_4_5 + 0.0158708780931009*G0_1_1_5_0 - 0.0803121158676748*G0_1_1_5_1 - 0.000410453743787047*G0_1_1_5_2 + 0.0043781732670622*G0_1_1_5_3 - 0.00273635829191398*G0_1_1_5_4 - 0.0902998236331606*G0_1_1_5_5; + A[217] = A[119] + 0.0153920153920166*G0_0_1_0_0 - 0.00277056277056293*G0_0_1_0_1 + 0.0252429052429061*G0_0_1_0_2 - 0.0080038480038482*G0_0_1_0_3 + 0.0735738335738363*G0_0_1_0_4 + 0.00831168831168899*G0_0_1_0_5 - 0.00277056277056293*G0_0_1_1_0 + 0.00677248677248688*G0_0_1_1_1 + 0.00215488215488228*G0_0_1_1_2 - 0.0243193843193852*G0_0_1_1_3 - 0.00861952861952885*G0_0_1_1_4 - 0.0138528138528145*G0_0_1_1_5 + 0.0252429052429061*G0_0_1_2_0 + 0.00215488215488228*G0_0_1_2_1 + 0.0123136123136119*G0_0_1_2_2 + 0.00769600769600776*G0_0_1_2_3 - 0.18316498316499*G0_0_1_2_4 - 0.0166233766233772*G0_0_1_2_5 - 0.00800384800384821*G0_0_1_3_0 - 0.0243193843193852*G0_0_1_3_1 + 0.00769600769600778*G0_0_1_3_2 + 0.14530062530063*G0_0_1_3_3 + 0.0332467532467541*G0_0_1_3_4 + 0.0492544492544509*G0_0_1_3_5 + 0.0735738335738363*G0_0_1_4_0 - 0.00861952861952885*G0_0_1_4_1 - 0.18316498316499*G0_0_1_4_2 + 0.0332467532467541*G0_0_1_4_3 - 0.236421356421366*G0_0_1_4_4 + 0.0504858104858121*G0_0_1_4_5 + 0.00831168831168899*G0_0_1_5_0 - 0.0138528138528145*G0_0_1_5_1 - 0.0166233766233772*G0_0_1_5_2 + 0.0492544492544509*G0_0_1_5_3 + 0.0504858104858121*G0_0_1_5_4 + 0.0714189514189542*G0_0_1_5_5 - 0.0153920153920166*G0_1_0_0_0 + 0.00277056277056293*G0_1_0_0_1 - 0.0252429052429061*G0_1_0_0_2 + 0.0080038480038482*G0_1_0_0_3 - 0.0735738335738363*G0_1_0_0_4 - 0.008311688311689*G0_1_0_0_5 + 0.00277056277056293*G0_1_0_1_0 - 0.00677248677248688*G0_1_0_1_1 - 0.00215488215488228*G0_1_0_1_2 + 0.0243193843193852*G0_1_0_1_3 + 0.00861952861952885*G0_1_0_1_4 + 0.0138528138528145*G0_1_0_1_5 - 0.0252429052429061*G0_1_0_2_0 - 0.00215488215488228*G0_1_0_2_1 - 0.0123136123136119*G0_1_0_2_2 - 0.00769600769600776*G0_1_0_2_3 + 0.18316498316499*G0_1_0_2_4 + 0.0166233766233772*G0_1_0_2_5 + 0.00800384800384821*G0_1_0_3_0 + 0.0243193843193852*G0_1_0_3_1 - 0.00769600769600778*G0_1_0_3_2 - 0.14530062530063*G0_1_0_3_3 - 0.0332467532467541*G0_1_0_3_4 - 0.0492544492544509*G0_1_0_3_5 - 0.0735738335738363*G0_1_0_4_0 + 0.00861952861952885*G0_1_0_4_1 + 0.18316498316499*G0_1_0_4_2 - 0.0332467532467541*G0_1_0_4_3 + 0.236421356421366*G0_1_0_4_4 - 0.0504858104858121*G0_1_0_4_5 - 0.008311688311689*G0_1_0_5_0 + 0.0138528138528145*G0_1_0_5_1 + 0.0166233766233772*G0_1_0_5_2 - 0.0492544492544509*G0_1_0_5_3 - 0.0504858104858121*G0_1_0_5_4 - 0.0714189514189542*G0_1_0_5_5; + A[22] = A[106] + 0.00695206028539393*G0_0_1_0_0 + 0.000641333974667334*G0_0_1_0_3 - 0.0107615840949178*G0_0_1_0_4 - 0.00220618887285558*G0_0_1_0_5 - 0.00137245470578811*G0_0_1_1_3 + 0.001372454705788*G0_0_1_1_5 - 0.00695206028539388*G0_0_1_2_2 + 0.00220618887285559*G0_0_1_2_3 + 0.0107615840949178*G0_0_1_2_4 - 0.000641333974667334*G0_0_1_2_5 + 0.000641333974667335*G0_0_1_3_0 - 0.00137245470578811*G0_0_1_3_1 + 0.00220618887285559*G0_0_1_3_2 - 0.000615680615680648*G0_0_1_3_3 - 0.00128266794933466*G0_0_1_3_4 - 0.0107615840949178*G0_0_1_4_0 + 0.0107615840949178*G0_0_1_4_2 - 0.00128266794933466*G0_0_1_4_3 + 0.00128266794933468*G0_0_1_4_5 - 0.00220618887285559*G0_0_1_5_0 + 0.001372454705788*G0_0_1_5_1 - 0.000641333974667334*G0_0_1_5_2 + 0.00128266794933468*G0_0_1_5_4 + 0.0006156806156806*G0_0_1_5_5 - 0.00695206028539393*G0_1_0_0_0 - 0.000641333974667334*G0_1_0_0_3 + 0.0107615840949178*G0_1_0_0_4 + 0.00220618887285558*G0_1_0_0_5 + 0.00137245470578811*G0_1_0_1_3 - 0.001372454705788*G0_1_0_1_5 + 0.00695206028539388*G0_1_0_2_2 - 0.00220618887285559*G0_1_0_2_3 - 0.0107615840949178*G0_1_0_2_4 + 0.000641333974667334*G0_1_0_2_5 - 0.000641333974667335*G0_1_0_3_0 + 0.00137245470578811*G0_1_0_3_1 - 0.00220618887285559*G0_1_0_3_2 + 0.000615680615680649*G0_1_0_3_3 + 0.00128266794933466*G0_1_0_3_4 + 0.0107615840949178*G0_1_0_4_0 - 0.0107615840949178*G0_1_0_4_2 + 0.00128266794933466*G0_1_0_4_3 - 0.00128266794933468*G0_1_0_4_5 + 0.00220618887285559*G0_1_0_5_0 - 0.001372454705788*G0_1_0_5_1 + 0.000641333974667334*G0_1_0_5_2 - 0.00128266794933468*G0_1_0_5_4 - 0.0006156806156806*G0_1_0_5_5; + A[9] = A[135] + 0.378771845438526*G0_0_1_0_0 - 0.0225322003099789*G0_0_1_0_1 - 0.0225322003099789*G0_0_1_0_2 + 0.00504516060071628*G0_0_1_0_3 + 0.0951739618406317*G0_0_1_0_4 + 0.0951739618406319*G0_0_1_0_5 - 0.0225322003099789*G0_0_1_1_0 + 0.00233445566778907*G0_0_1_1_1 + 0.00167174389396618*G0_0_1_1_2 - 0.000820907487574189*G0_0_1_1_3 - 0.00649885094329561*G0_0_1_1_4 - 0.011544011544012*G0_0_1_1_5 - 0.0225322003099789*G0_0_1_2_0 + 0.00167174389396618*G0_0_1_2_1 + 0.00233445566778907*G0_0_1_2_2 - 0.000820907487574186*G0_0_1_2_3 - 0.0115440115440119*G0_0_1_2_4 - 0.00649885094329562*G0_0_1_2_5 + 0.00504516060071628*G0_0_1_3_0 - 0.000820907487574189*G0_0_1_3_1 - 0.000820907487574184*G0_0_1_3_2 - 0.000752498530276417*G0_0_1_3_3 + 0.00290738068515855*G0_0_1_3_4 + 0.00290738068515855*G0_0_1_3_5 + 0.0951739618406317*G0_0_1_4_0 - 0.00649885094329561*G0_0_1_4_1 - 0.0115440115440119*G0_0_1_4_2 + 0.00290738068515855*G0_0_1_4_3 + 0.0519908075463648*G0_0_1_4_4 + 0.0259954037731825*G0_0_1_4_5 + 0.095173961840632*G0_0_1_5_0 - 0.011544011544012*G0_0_1_5_1 - 0.00649885094329562*G0_0_1_5_2 + 0.00290738068515855*G0_0_1_5_3 + 0.0259954037731825*G0_0_1_5_4 + 0.051990807546365*G0_0_1_5_5 - 0.378771845438526*G0_1_0_0_0 + 0.0225322003099789*G0_1_0_0_1 + 0.0225322003099789*G0_1_0_0_2 - 0.00504516060071628*G0_1_0_0_3 - 0.0951739618406317*G0_1_0_0_4 - 0.0951739618406319*G0_1_0_0_5 + 0.0225322003099789*G0_1_0_1_0 - 0.00233445566778907*G0_1_0_1_1 - 0.00167174389396618*G0_1_0_1_2 + 0.00082090748757419*G0_1_0_1_3 + 0.00649885094329561*G0_1_0_1_4 + 0.011544011544012*G0_1_0_1_5 + 0.0225322003099789*G0_1_0_2_0 - 0.00167174389396618*G0_1_0_2_1 - 0.00233445566778907*G0_1_0_2_2 + 0.000820907487574185*G0_1_0_2_3 + 0.0115440115440119*G0_1_0_2_4 + 0.00649885094329562*G0_1_0_2_5 - 0.00504516060071628*G0_1_0_3_0 + 0.000820907487574192*G0_1_0_3_1 + 0.000820907487574185*G0_1_0_3_2 + 0.000752498530276417*G0_1_0_3_3 - 0.00290738068515855*G0_1_0_3_4 - 0.00290738068515855*G0_1_0_3_5 - 0.0951739618406317*G0_1_0_4_0 + 0.00649885094329561*G0_1_0_4_1 + 0.0115440115440119*G0_1_0_4_2 - 0.00290738068515855*G0_1_0_4_3 - 0.0519908075463648*G0_1_0_4_4 - 0.0259954037731825*G0_1_0_4_5 - 0.0951739618406319*G0_1_0_5_0 + 0.011544011544012*G0_1_0_5_1 + 0.00649885094329562*G0_1_0_5_2 - 0.00290738068515855*G0_1_0_5_3 - 0.0259954037731825*G0_1_0_5_4 - 0.051990807546365*G0_1_0_5_5; + A[90] = A[9] + 0.378771845438526*G0_0_0_0_0 - 0.018577307466197*G0_0_0_0_1 - 0.0264870931537607*G0_0_0_0_2 + 0.00504516060071628*G0_0_0_0_3 + 0.12176794399017*G0_0_0_0_4 + 0.0685799796910933*G0_0_0_0_5 - 0.018577307466197*G0_0_0_1_0 + 0.0148532948532953*G0_0_0_1_1 + 0.00167174389396617*G0_0_0_1_2 + 0.00932072043183184*G0_0_0_1_3 - 0.00482283148949832*G0_0_0_1_4 - 0.00244562022339809*G0_0_0_1_5 - 0.0264870931537607*G0_0_0_2_0 + 0.00167174389396618*G0_0_0_2_1 - 0.0101843835177172*G0_0_0_2_2 - 0.0109625354069802*G0_0_0_2_3 - 0.0206424028646258*G0_0_0_2_4 - 0.00817487039709291*G0_0_0_2_5 + 0.00504516060071628*G0_0_0_3_0 + 0.00932072043183184*G0_0_0_3_1 - 0.0109625354069802*G0_0_0_3_2 - 0.000752498530276396*G0_0_0_3_3 - 0.00044465822243603*G0_0_0_3_4 + 0.00625941959275313*G0_0_0_3_5 + 0.12176794399017*G0_0_0_4_0 - 0.00482283148949832*G0_0_0_4_1 - 0.0206424028646258*G0_0_0_4_2 - 0.000444658222436028*G0_0_0_4_3 + 0.0615680615680635*G0_0_0_4_4 + 0.0259954037731825*G0_0_0_4_5 + 0.0685799796910933*G0_0_0_5_0 - 0.00244562022339809*G0_0_0_5_1 - 0.00817487039709291*G0_0_0_5_2 + 0.00625941959275313*G0_0_0_5_3 + 0.0259954037731824*G0_0_0_5_4 + 0.0424135535246661*G0_0_0_5_5 + 0.0039548928437819*G0_0_1_0_1 - 0.00395489284378185*G0_0_1_0_2 + 0.0265939821495385*G0_0_1_0_4 - 0.0265939821495387*G0_0_1_0_5 + 0.0039548928437819*G0_0_1_1_0 + 0.0125188391855062*G0_0_1_1_1 + 0.010141627919406*G0_0_1_1_3 + 0.0016760194537973*G0_0_1_1_4 + 0.00909839132061387*G0_0_1_1_5 - 0.00395489284378185*G0_0_1_2_0 - 0.0125188391855063*G0_0_1_2_2 - 0.010141627919406*G0_0_1_2_3 - 0.00909839132061383*G0_0_1_2_4 - 0.00167601945379728*G0_0_1_2_5 + 0.010141627919406*G0_0_1_3_1 - 0.010141627919406*G0_0_1_3_2 - 0.00335203890759459*G0_0_1_3_4 + 0.00335203890759457*G0_0_1_3_5 + 0.0265939821495385*G0_0_1_4_0 + 0.0016760194537973*G0_0_1_4_1 - 0.00909839132061383*G0_0_1_4_2 - 0.00335203890759459*G0_0_1_4_3 + 0.00957725402169863*G0_0_1_4_4 - 0.0265939821495387*G0_0_1_5_0 + 0.00909839132061387*G0_0_1_5_1 - 0.00167601945379728*G0_0_1_5_2 + 0.00335203890759457*G0_0_1_5_3 - 0.00957725402169891*G0_0_1_5_5 + 0.00395489284378188*G0_1_0_0_1 - 0.00395489284378186*G0_1_0_0_2 + 0.0265939821495386*G0_1_0_0_4 - 0.0265939821495387*G0_1_0_0_5 + 0.00395489284378188*G0_1_0_1_0 + 0.0125188391855063*G0_1_0_1_1 + 0.010141627919406*G0_1_0_1_3 + 0.00167601945379728*G0_1_0_1_4 + 0.00909839132061385*G0_1_0_1_5 - 0.00395489284378186*G0_1_0_2_0 - 0.0125188391855063*G0_1_0_2_2 - 0.010141627919406*G0_1_0_2_3 - 0.00909839132061384*G0_1_0_2_4 - 0.00167601945379729*G0_1_0_2_5 + 0.010141627919406*G0_1_0_3_1 - 0.010141627919406*G0_1_0_3_2 - 0.00335203890759457*G0_1_0_3_4 + 0.00335203890759458*G0_1_0_3_5 + 0.0265939821495386*G0_1_0_4_0 + 0.00167601945379728*G0_1_0_4_1 - 0.00909839132061384*G0_1_0_4_2 - 0.00335203890759458*G0_1_0_4_3 + 0.00957725402169873*G0_1_0_4_4 - 0.0265939821495387*G0_1_0_5_0 + 0.00909839132061385*G0_1_0_5_1 - 0.00167601945379729*G0_1_0_5_2 + 0.00335203890759458*G0_1_0_5_3 - 0.00957725402169884*G0_1_0_5_5 - 0.378771845438525*G0_1_1_0_0 + 0.0264870931537607*G0_1_1_0_1 + 0.018577307466197*G0_1_1_0_2 - 0.00504516060071628*G0_1_1_0_3 - 0.0685799796910931*G0_1_1_0_4 - 0.121767943990171*G0_1_1_0_5 + 0.0264870931537607*G0_1_1_1_0 + 0.0101843835177172*G0_1_1_1_1 - 0.00167174389396617*G0_1_1_1_2 + 0.0109625354069802*G0_1_1_1_3 + 0.00817487039709289*G0_1_1_1_4 + 0.0206424028646258*G0_1_1_1_5 + 0.018577307466197*G0_1_1_2_0 - 0.00167174389396617*G0_1_1_2_1 - 0.0148532948532954*G0_1_1_2_2 - 0.00932072043183186*G0_1_1_2_3 + 0.00244562022339808*G0_1_1_2_4 + 0.00482283148949833*G0_1_1_2_5 - 0.00504516060071628*G0_1_1_3_0 + 0.0109625354069802*G0_1_1_3_1 - 0.00932072043183186*G0_1_1_3_2 + 0.000752498530276362*G0_1_1_3_3 - 0.00625941959275313*G0_1_1_3_4 + 0.000444658222436023*G0_1_1_3_5 - 0.0685799796910931*G0_1_1_4_0 + 0.00817487039709289*G0_1_1_4_1 + 0.00244562022339808*G0_1_1_4_2 - 0.00625941959275313*G0_1_1_4_3 - 0.0424135535246661*G0_1_1_4_4 - 0.0259954037731825*G0_1_1_4_5 - 0.121767943990171*G0_1_1_5_0 + 0.0206424028646258*G0_1_1_5_1 + 0.00482283148949833*G0_1_1_5_2 + 0.000444658222436027*G0_1_1_5_3 - 0.0259954037731825*G0_1_1_5_4 - 0.0615680615680638*G0_1_1_5_5; + A[6] = A[90] - 0.378771845438525*G0_0_1_0_0 + 0.0225322003099788*G0_0_1_0_1 + 0.0225322003099789*G0_0_1_0_2 - 0.00504516060071627*G0_0_1_0_3 - 0.0951739618406317*G0_0_1_0_4 - 0.0951739618406319*G0_0_1_0_5 + 0.0225322003099788*G0_0_1_1_0 - 0.00233445566778906*G0_0_1_1_1 - 0.00167174389396618*G0_0_1_1_2 + 0.000820907487574187*G0_0_1_1_3 + 0.0064988509432956*G0_0_1_1_4 + 0.0115440115440119*G0_0_1_1_5 + 0.0225322003099789*G0_0_1_2_0 - 0.00167174389396618*G0_0_1_2_1 - 0.00233445566778904*G0_0_1_2_2 + 0.000820907487574189*G0_0_1_2_3 + 0.0115440115440119*G0_0_1_2_4 + 0.00649885094329561*G0_0_1_2_5 - 0.00504516060071627*G0_0_1_3_0 + 0.000820907487574187*G0_0_1_3_1 + 0.000820907487574189*G0_0_1_3_2 + 0.000752498530276396*G0_0_1_3_3 - 0.00290738068515853*G0_0_1_3_4 - 0.00290738068515855*G0_0_1_3_5 - 0.0951739618406317*G0_0_1_4_0 + 0.0064988509432956*G0_0_1_4_1 + 0.0115440115440119*G0_0_1_4_2 - 0.00290738068515854*G0_0_1_4_3 - 0.0519908075463647*G0_0_1_4_4 - 0.0259954037731824*G0_0_1_4_5 - 0.0951739618406319*G0_0_1_5_0 + 0.0115440115440119*G0_0_1_5_1 + 0.00649885094329561*G0_0_1_5_2 - 0.00290738068515855*G0_0_1_5_3 - 0.0259954037731824*G0_0_1_5_4 - 0.051990807546365*G0_0_1_5_5 + 0.378771845438525*G0_1_0_0_0 - 0.0225322003099788*G0_1_0_0_1 - 0.0225322003099789*G0_1_0_0_2 + 0.00504516060071627*G0_1_0_0_3 + 0.0951739618406317*G0_1_0_0_4 + 0.0951739618406319*G0_1_0_0_5 - 0.0225322003099788*G0_1_0_1_0 + 0.00233445566778906*G0_1_0_1_1 + 0.00167174389396618*G0_1_0_1_2 - 0.000820907487574187*G0_1_0_1_3 - 0.0064988509432956*G0_1_0_1_4 - 0.0115440115440119*G0_1_0_1_5 - 0.0225322003099789*G0_1_0_2_0 + 0.00167174389396618*G0_1_0_2_1 + 0.00233445566778904*G0_1_0_2_2 - 0.000820907487574189*G0_1_0_2_3 - 0.0115440115440119*G0_1_0_2_4 - 0.00649885094329561*G0_1_0_2_5 + 0.00504516060071627*G0_1_0_3_0 - 0.000820907487574187*G0_1_0_3_1 - 0.000820907487574189*G0_1_0_3_2 - 0.000752498530276396*G0_1_0_3_3 + 0.00290738068515853*G0_1_0_3_4 + 0.00290738068515855*G0_1_0_3_5 + 0.0951739618406317*G0_1_0_4_0 - 0.0064988509432956*G0_1_0_4_1 - 0.0115440115440119*G0_1_0_4_2 + 0.00290738068515854*G0_1_0_4_3 + 0.0519908075463647*G0_1_0_4_4 + 0.0259954037731824*G0_1_0_4_5 + 0.0951739618406319*G0_1_0_5_0 - 0.0115440115440119*G0_1_0_5_1 - 0.00649885094329561*G0_1_0_5_2 + 0.00290738068515854*G0_1_0_5_3 + 0.0259954037731824*G0_1_0_5_4 + 0.051990807546365*G0_1_0_5_5; + A[49] = -A[169] - 0.00502805836139182*G0_0_0_0_0 - 0.0014365881032548*G0_0_0_0_1 + 0.0199583132916472*G0_0_0_0_2 + 0.0126214526214531*G0_0_0_0_3 + 0.0348885682219026*G0_0_0_0_4 + 0.0163155363155368*G0_0_0_0_5 - 0.0014365881032548*G0_0_0_1_0 + 0.00820907487574159*G0_0_0_1_1 + 0.0126727593394264*G0_0_0_1_2 + 0.0287317620650963*G0_0_0_1_3 + 0.0156998556998562*G0_0_0_1_4 - 0.0102613435946772*G0_0_0_1_5 + 0.0199583132916472*G0_0_0_2_0 + 0.0126727593394264*G0_0_0_2_1 - 0.182036235369575*G0_0_0_2_2 - 0.066801346801349*G0_0_0_2_3 - 0.0990219656886356*G0_0_0_2_4 + 0.000307840307840296*G0_0_0_2_5 + 0.0126214526214531*G0_0_0_3_0 + 0.0287317620650963*G0_0_0_3_1 - 0.066801346801349*G0_0_0_3_2 + 0.062799422799425*G0_0_0_3_3 - 0.0566426166426186*G0_0_0_3_4 - 0.0258585858585868*G0_0_0_3_5 + 0.0348885682219026*G0_0_0_4_0 + 0.0156998556998562*G0_0_0_4_1 - 0.0990219656886356*G0_0_0_4_2 - 0.0566426166426186*G0_0_0_4_3 - 0.237652717652725*G0_0_0_4_4 - 0.0320153920153931*G0_0_0_4_5 + 0.0163155363155368*G0_0_0_5_0 - 0.0102613435946772*G0_0_0_5_1 + 0.000307840307840295*G0_0_0_5_2 - 0.0258585858585868*G0_0_0_5_3 - 0.0320153920153931*G0_0_0_5_4 - 0.0726503126503149*G0_0_0_5_5 + 0.00287317620650968*G0_0_1_0_0 - 0.00923520923520961*G0_0_1_0_1 + 0.00733686067019424*G0_0_1_0_2 - 0.0416610549943897*G0_0_1_0_3 - 0.00790123456790152*G0_0_1_0_4 + 0.000615680615680598*G0_0_1_0_5 - 0.00923520923520961*G0_0_1_1_0 + 0.27859547859549*G0_0_1_1_1 - 0.0215488215488224*G0_0_1_1_2 + 0.116979316979321*G0_0_1_1_3 + 0.00615680615680635*G0_0_1_1_4 + 0.0184704184704196*G0_0_1_1_5 + 0.00733686067019424*G0_0_1_2_0 - 0.0215488215488224*G0_0_1_2_1 + 0.00410453743787103*G0_0_1_2_2 - 0.0724450857784217*G0_0_1_2_3 - 0.0152894019560691*G0_0_1_2_4 - 0.0178547378547385*G0_0_1_2_5 - 0.0416610549943897*G0_0_1_3_0 + 0.116979316979321*G0_0_1_3_1 - 0.0724450857784217*G0_0_1_3_2 + 0.574635241301929*G0_0_1_3_3 + 0.0710084976751667*G0_0_1_3_4 + 0.119031585698257*G0_0_1_3_5 - 0.00790123456790152*G0_0_1_4_0 + 0.00615680615680635*G0_0_1_4_1 - 0.0152894019560691*G0_0_1_4_2 + 0.0710084976751667*G0_0_1_4_3 + 0.00164181497514809*G0_0_1_4_4 + 0.0233958633958642*G0_0_1_4_5 + 0.0006156806156806*G0_0_1_5_0 + 0.0184704184704196*G0_0_1_5_1 - 0.0178547378547385*G0_0_1_5_2 + 0.119031585698257*G0_0_1_5_3 + 0.0233958633958642*G0_0_1_5_4 - 0.0985088985089018*G0_0_1_5_5; + A[34] = -A[37] - 0.00302709636042985*G0_1_0_0_0 + 0.00756774090107449*G0_1_0_0_2 + 0.00128266794933465*G0_1_0_0_3 + 0.007439474106141*G0_1_0_0_4 - 0.000564373897707288*G0_1_0_0_5 + 0.00302709636042983*G0_1_0_1_1 - 0.00756774090107452*G0_1_0_1_2 - 0.00743947410614105*G0_1_0_1_3 - 0.00128266794933467*G0_1_0_1_4 + 0.000564373897707267*G0_1_0_1_5 + 0.00756774090107449*G0_1_0_2_0 - 0.00756774090107452*G0_1_0_2_1 + 0.0389931056597738*G0_1_0_2_3 - 0.0389931056597737*G0_1_0_2_4 + 0.00128266794933465*G0_1_0_3_0 - 0.00743947410614105*G0_1_0_3_1 + 0.0389931056597738*G0_1_0_3_2 + 0.0092352092352098*G0_1_0_3_3 - 0.0025653358986693*G0_1_0_3_5 + 0.007439474106141*G0_1_0_4_0 - 0.00128266794933467*G0_1_0_4_1 - 0.0389931056597737*G0_1_0_4_2 - 0.00923520923520942*G0_1_0_4_4 + 0.00256533589866932*G0_1_0_4_5 - 0.000564373897707288*G0_1_0_5_0 + 0.000564373897707268*G0_1_0_5_1 - 0.0025653358986693*G0_1_0_5_3 + 0.00256533589866932*G0_1_0_5_4 + 0.0321628988295666*G0_1_1_0_0 - 0.00705788039121398*G0_1_1_0_1 - 0.00219015552348891*G0_1_1_0_2 - 0.00227032227032235*G0_1_1_0_3 + 0.0107231040564377*G0_1_1_0_4 + 0.0107487574154244*G0_1_1_0_5 - 0.00705788039121398*G0_1_1_1_0 + 0.0351899951899967*G0_1_1_1_1 - 0.00975789642456343*G0_1_1_1_2 + 0.00328362995029679*G0_1_1_1_3 - 0.003552990219657*G0_1_1_1_4 + 0.0113131313131318*G0_1_1_1_5 - 0.00219015552348891*G0_1_1_2_0 - 0.00975789642456343*G0_1_1_2_1 + 0.151707551707557*G0_1_1_2_2 + 0.0334776334776347*G0_1_1_2_3 - 0.00551547218213905*G0_1_1_2_4 - 0.00616963283629968*G0_1_1_2_5 - 0.00227032227032235*G0_1_1_3_0 + 0.00328362995029679*G0_1_1_3_1 + 0.0334776334776347*G0_1_1_3_2 + 0.0265768799102143*G0_1_1_3_3 + 0.0116466249799587*G0_1_1_3_4 + 0.0168799102132441*G0_1_1_3_5 + 0.0107231040564377*G0_1_1_4_0 - 0.003552990219657*G0_1_1_4_1 - 0.00551547218213905*G0_1_1_4_2 + 0.0116466249799587*G0_1_1_4_3 + 0.0173416706750045*G0_1_1_4_4 + 0.0194452461119134*G0_1_1_4_5 + 0.0107487574154244*G0_1_1_5_0 + 0.0113131313131318*G0_1_1_5_1 - 0.00616963283629968*G0_1_1_5_2 + 0.0168799102132441*G0_1_1_5_3 + 0.0194452461119134*G0_1_1_5_4 + 0.0850665383998747*G0_1_1_5_5; + A[124] = -A[79] + 0.00287317620650975*G0_1_0_0_0 + 0.00733686067019419*G0_1_0_0_1 - 0.00923520923520947*G0_1_0_0_2 - 0.0416610549943896*G0_1_0_0_3 + 0.00061568061568073*G0_1_0_0_4 - 0.00790123456790142*G0_1_0_0_5 + 0.0073368606701942*G0_1_0_1_0 + 0.00410453743787102*G0_1_0_1_1 - 0.0215488215488222*G0_1_0_1_2 - 0.0724450857784216*G0_1_0_1_3 - 0.0178547378547384*G0_1_0_1_4 - 0.0152894019560691*G0_1_0_1_5 - 0.00923520923520947*G0_1_0_2_0 - 0.0215488215488222*G0_1_0_2_1 + 0.278595478595487*G0_1_0_2_2 + 0.116979316979321*G0_1_0_2_3 + 0.0184704184704188*G0_1_0_2_4 + 0.00615680615680639*G0_1_0_2_5 - 0.0416610549943896*G0_1_0_3_0 - 0.0724450857784216*G0_1_0_3_1 + 0.116979316979321*G0_1_0_3_2 + 0.574635241301928*G0_1_0_3_3 + 0.119031585698256*G0_1_0_3_4 + 0.0710084976751669*G0_1_0_3_5 + 0.000615680615680728*G0_1_0_4_0 - 0.0178547378547384*G0_1_0_4_1 + 0.0184704184704188*G0_1_0_4_2 + 0.119031585698256*G0_1_0_4_3 - 0.0985088985089022*G0_1_0_4_4 + 0.0233958633958642*G0_1_0_4_5 - 0.00790123456790142*G0_1_0_5_0 - 0.0152894019560691*G0_1_0_5_1 + 0.00615680615680638*G0_1_0_5_2 + 0.0710084976751669*G0_1_0_5_3 + 0.0233958633958642*G0_1_0_5_4 + 0.00164181497514895*G0_1_0_5_5 - 0.0050280583613917*G0_1_1_0_0 + 0.0199583132916474*G0_1_1_0_1 - 0.00143658810325481*G0_1_1_0_2 + 0.0126214526214531*G0_1_1_0_3 + 0.0163155363155369*G0_1_1_0_4 + 0.0348885682219028*G0_1_1_0_5 + 0.0199583132916474*G0_1_1_1_0 - 0.182036235369576*G0_1_1_1_1 + 0.0126727593394265*G0_1_1_1_2 - 0.0668013468013495*G0_1_1_1_3 + 0.000307840307840324*G0_1_1_1_4 - 0.0990219656886364*G0_1_1_1_5 - 0.00143658810325481*G0_1_1_2_0 + 0.0126727593394265*G0_1_1_2_1 + 0.00820907487574147*G0_1_1_2_2 + 0.0287317620650965*G0_1_1_2_3 - 0.0102613435946774*G0_1_1_2_4 + 0.0156998556998562*G0_1_1_2_5 + 0.0126214526214531*G0_1_1_3_0 - 0.0668013468013495*G0_1_1_3_1 + 0.0287317620650965*G0_1_1_3_2 + 0.062799422799425*G0_1_1_3_3 - 0.0258585858585867*G0_1_1_3_4 - 0.0566426166426186*G0_1_1_3_5 + 0.0163155363155369*G0_1_1_4_0 + 0.000307840307840324*G0_1_1_4_1 - 0.0102613435946774*G0_1_1_4_2 - 0.0258585858585867*G0_1_1_4_3 - 0.0726503126503154*G0_1_1_4_4 - 0.032015392015393*G0_1_1_4_5 + 0.0348885682219028*G0_1_1_5_0 - 0.0990219656886364*G0_1_1_5_1 + 0.0156998556998562*G0_1_1_5_2 - 0.0566426166426185*G0_1_1_5_3 - 0.032015392015393*G0_1_1_5_4 - 0.237652717652726*G0_1_1_5_5; + A[67] = A[109] - 0.000846560846561161*G0_0_1_0_0 - 0.00142376142376141*G0_0_1_0_1 - 0.0071572871572874*G0_0_1_0_2 + 0.00831168831168863*G0_0_1_0_3 - 0.011544011544012*G0_0_1_0_4 + 0.00461760461760465*G0_0_1_0_5 - 0.00142376142376141*G0_0_1_1_0 - 0.000846560846561397*G0_0_1_1_1 - 0.00715728715728742*G0_0_1_1_2 - 0.0115440115440121*G0_0_1_1_3 + 0.00831168831168863*G0_0_1_1_4 + 0.00461760461760464*G0_0_1_1_5 - 0.0071572871572874*G0_0_1_2_0 - 0.00715728715728742*G0_0_1_2_1 - 0.0988936988937014*G0_0_1_2_2 + 0.0484848484848503*G0_0_1_2_3 + 0.0484848484848502*G0_0_1_2_4 + 0.00354016354016367*G0_0_1_2_5 + 0.00831168831168863*G0_0_1_3_0 - 0.0115440115440121*G0_0_1_3_1 + 0.0484848484848503*G0_0_1_3_2 + 0.0455603655603667*G0_0_1_3_3 - 0.0332467532467545*G0_0_1_3_4 - 0.0237037037037046*G0_0_1_3_5 - 0.011544011544012*G0_0_1_4_0 + 0.00831168831168863*G0_0_1_4_1 + 0.0484848484848502*G0_0_1_4_2 - 0.0332467532467545*G0_0_1_4_3 + 0.0455603655603665*G0_0_1_4_4 - 0.0237037037037046*G0_0_1_4_5 + 0.00461760461760465*G0_0_1_5_0 + 0.00461760461760464*G0_0_1_5_1 + 0.00354016354016367*G0_0_1_5_2 - 0.0237037037037046*G0_0_1_5_3 - 0.0237037037037046*G0_0_1_5_4 - 0.00430976430976493*G0_0_1_5_5 + 0.000846560846561162*G0_1_0_0_0 + 0.00142376142376141*G0_1_0_0_1 + 0.0071572871572874*G0_1_0_0_2 - 0.00831168831168863*G0_1_0_0_3 + 0.011544011544012*G0_1_0_0_4 - 0.00461760461760465*G0_1_0_0_5 + 0.00142376142376141*G0_1_0_1_0 + 0.000846560846561397*G0_1_0_1_1 + 0.00715728715728742*G0_1_0_1_2 + 0.0115440115440121*G0_1_0_1_3 - 0.00831168831168863*G0_1_0_1_4 - 0.00461760461760464*G0_1_0_1_5 + 0.0071572871572874*G0_1_0_2_0 + 0.00715728715728742*G0_1_0_2_1 + 0.0988936988937014*G0_1_0_2_2 - 0.0484848484848503*G0_1_0_2_3 - 0.0484848484848502*G0_1_0_2_4 - 0.00354016354016368*G0_1_0_2_5 - 0.00831168831168863*G0_1_0_3_0 + 0.0115440115440121*G0_1_0_3_1 - 0.0484848484848503*G0_1_0_3_2 - 0.0455603655603666*G0_1_0_3_3 + 0.0332467532467545*G0_1_0_3_4 + 0.0237037037037046*G0_1_0_3_5 + 0.011544011544012*G0_1_0_4_0 - 0.00831168831168863*G0_1_0_4_1 - 0.0484848484848502*G0_1_0_4_2 + 0.0332467532467545*G0_1_0_4_3 - 0.0455603655603665*G0_1_0_4_4 + 0.0237037037037046*G0_1_0_4_5 - 0.00461760461760465*G0_1_0_5_0 - 0.00461760461760464*G0_1_0_5_1 - 0.00354016354016368*G0_1_0_5_2 + 0.0237037037037046*G0_1_0_5_3 + 0.0237037037037046*G0_1_0_5_4 + 0.00430976430976493*G0_1_0_5_5; + A[161] = -A[153] - 0.186140772807446*G0_0_0_0_0 + 0.0342215808882487*G0_0_0_0_1 + 0.0126214526214531*G0_0_0_0_2 + 0.0181625781625787*G0_0_0_0_3 - 0.0837325637325666*G0_0_0_0_4 + 0.0056437389770724*G0_0_0_0_5 + 0.0342215808882487*G0_0_0_1_0 - 0.270386403719747*G0_0_0_1_1 + 0.00779862113195472*G0_0_0_1_2 - 0.0287317620650963*G0_0_0_1_3 + 0.00954304954304991*G0_0_0_1_4 - 0.0882475549142247*G0_0_0_1_5 + 0.0126214526214531*G0_0_0_2_0 + 0.00779862113195472*G0_0_0_2_1 - 0.00790123456790159*G0_0_0_2_2 + 0.0156998556998562*G0_0_0_2_3 + 0.0427898027898042*G0_0_0_2_4 + 0.0542825076158428*G0_0_0_2_5 + 0.0181625781625787*G0_0_0_3_0 - 0.0287317620650963*G0_0_0_3_1 + 0.0156998556998562*G0_0_0_3_2 + 0.0258585858585872*G0_0_0_3_3 - 0.0554112554112572*G0_0_0_3_4 - 0.144890171556843*G0_0_0_3_5 - 0.0837325637325666*G0_0_0_4_0 + 0.00954304954304991*G0_0_0_4_1 + 0.0427898027898042*G0_0_0_4_2 - 0.0554112554112572*G0_0_0_4_3 - 0.239294532627873*G0_0_0_4_4 - 0.127651114317785*G0_0_0_4_5 + 0.00564373897707239*G0_0_0_5_0 - 0.0882475549142247*G0_0_0_5_1 + 0.0542825076158428*G0_0_0_5_2 - 0.144890171556843*G0_0_0_5_3 - 0.127651114317785*G0_0_0_5_4 - 0.511835818502503*G0_0_0_5_5 - 0.00410453743787097*G0_1_0_0_0 + 0.0215488215488223*G0_1_0_0_1 - 0.00733686067019424*G0_1_0_0_2 + 0.0178547378547384*G0_1_0_0_3 + 0.0152894019560691*G0_1_0_0_4 + 0.0724450857784215*G0_1_0_0_5 + 0.0215488215488223*G0_1_0_1_0 - 0.278595478595488*G0_1_0_1_1 + 0.00923520923520954*G0_1_0_1_2 - 0.018470418470419*G0_1_0_1_3 - 0.00615680615680631*G0_1_0_1_4 - 0.116979316979321*G0_1_0_1_5 - 0.00733686067019424*G0_1_0_2_0 + 0.00923520923520954*G0_1_0_2_1 - 0.0028731762065096*G0_1_0_2_2 - 0.000615680615680729*G0_1_0_2_3 + 0.00790123456790154*G0_1_0_2_4 + 0.0416610549943897*G0_1_0_2_5 + 0.0178547378547384*G0_1_0_3_0 - 0.018470418470419*G0_1_0_3_1 - 0.000615680615680722*G0_1_0_3_2 + 0.0985088985089023*G0_1_0_3_3 - 0.0233958633958642*G0_1_0_3_4 - 0.119031585698256*G0_1_0_3_5 + 0.0152894019560691*G0_1_0_4_0 - 0.00615680615680631*G0_1_0_4_1 + 0.00790123456790154*G0_1_0_4_2 - 0.0233958633958642*G0_1_0_4_3 - 0.00164181497514811*G0_1_0_4_4 - 0.0710084976751667*G0_1_0_4_5 + 0.0724450857784215*G0_1_0_5_0 - 0.116979316979321*G0_1_0_5_1 + 0.0416610549943897*G0_1_0_5_2 - 0.119031585698256*G0_1_0_5_3 - 0.0710084976751667*G0_1_0_5_4 - 0.574635241301928*G0_1_0_5_5; + A[96] = A[144] - 0.363251563251577*G0_0_0_0_0 + 0.012655657100102*G0_0_0_0_1 - 0.0126556571001019*G0_0_0_0_2 + 0.00820907487574186*G0_0_0_0_3 + 0.0547271658382786*G0_0_0_0_4 - 0.0383090160867955*G0_0_0_0_5 + 0.012655657100102*G0_0_0_1_0 - 0.0726503126503151*G0_0_0_1_1 + 0.00348885682219028*G0_0_0_1_2 - 0.0563689808134271*G0_0_0_1_3 - 0.0350253861364984*G0_0_0_1_4 - 0.0101245256800816*G0_0_0_1_5 - 0.0126556571001019*G0_0_0_2_0 + 0.00348885682219028*G0_0_0_2_1 + 0.0857848324515016*G0_0_0_2_2 + 0.0506226284004079*G0_0_0_2_3 - 0.0391299235743692*G0_0_0_2_4 + 0.00218908663353121*G0_0_0_2_5 + 0.00820907487574185*G0_0_0_3_0 - 0.0563689808134272*G0_0_0_3_1 + 0.0506226284004079*G0_0_0_3_2 + 0.00985088985089047*G0_0_0_3_3 + 0.0536326225215132*G0_0_0_3_4 - 0.020796323018546*G0_0_0_3_5 + 0.0547271658382786*G0_0_0_4_0 - 0.0350253861364984*G0_0_0_4_1 - 0.0391299235743692*G0_0_0_4_2 + 0.0536326225215132*G0_0_0_4_3 + 0.487071775960681*G0_0_0_4_4 + 0.0656725990059345*G0_0_0_4_5 - 0.0383090160867955*G0_0_0_5_0 - 0.0101245256800816*G0_0_0_5_1 + 0.00218908663353121*G0_0_0_5_2 - 0.020796323018546*G0_0_0_5_3 + 0.0656725990059345*G0_0_0_5_4 - 0.224381379936944*G0_0_0_5_5 + 0.0126556571001019*G0_0_1_0_1 - 0.012655657100102*G0_0_1_0_2 + 0.0465180909625371*G0_0_1_0_4 - 0.046518090962537*G0_0_1_0_5 + 0.0126556571001019*G0_0_1_1_0 - 0.0792175725509085*G0_0_1_1_1 - 0.0534958046069175*G0_0_1_1_3 - 0.0186072363850148*G0_0_1_1_4 + 0.0145026989471439*G0_0_1_1_5 - 0.012655657100102*G0_0_1_2_0 + 0.0792175725509083*G0_0_1_2_2 + 0.0534958046069175*G0_0_1_2_3 - 0.0145026989471439*G0_0_1_2_4 + 0.0186072363850148*G0_0_1_2_5 - 0.0534958046069175*G0_0_1_3_1 + 0.0534958046069175*G0_0_1_3_2 + 0.0372144727700295*G0_0_1_3_4 - 0.0372144727700296*G0_0_1_3_5 + 0.0465180909625371*G0_0_1_4_0 - 0.0186072363850148*G0_0_1_4_1 - 0.0145026989471439*G0_0_1_4_2 + 0.0372144727700295*G0_0_1_4_3 + 0.355726577948812*G0_0_1_4_4 - 0.046518090962537*G0_0_1_5_0 + 0.0145026989471439*G0_0_1_5_1 + 0.0186072363850148*G0_0_1_5_2 - 0.0372144727700296*G0_0_1_5_3 - 0.355726577948813*G0_0_1_5_5 + 0.0126556571001019*G0_1_0_0_1 - 0.012655657100102*G0_1_0_0_2 + 0.0465180909625371*G0_1_0_0_4 - 0.046518090962537*G0_1_0_0_5 + 0.0126556571001019*G0_1_0_1_0 - 0.0792175725509085*G0_1_0_1_1 - 0.0534958046069175*G0_1_0_1_3 - 0.0186072363850148*G0_1_0_1_4 + 0.0145026989471439*G0_1_0_1_5 - 0.012655657100102*G0_1_0_2_0 + 0.0792175725509083*G0_1_0_2_2 + 0.0534958046069175*G0_1_0_2_3 - 0.0145026989471439*G0_1_0_2_4 + 0.0186072363850148*G0_1_0_2_5 - 0.0534958046069175*G0_1_0_3_1 + 0.0534958046069175*G0_1_0_3_2 + 0.0372144727700295*G0_1_0_3_4 - 0.0372144727700296*G0_1_0_3_5 + 0.0465180909625371*G0_1_0_4_0 - 0.0186072363850148*G0_1_0_4_1 - 0.0145026989471439*G0_1_0_4_2 + 0.0372144727700295*G0_1_0_4_3 + 0.355726577948812*G0_1_0_4_4 - 0.046518090962537*G0_1_0_5_0 + 0.0145026989471439*G0_1_0_5_1 + 0.0186072363850148*G0_1_0_5_2 - 0.0372144727700296*G0_1_0_5_3 - 0.355726577948813*G0_1_0_5_5 + 0.363251563251576*G0_1_1_0_0 + 0.012655657100102*G0_1_1_0_1 - 0.012655657100102*G0_1_1_0_2 - 0.00820907487574188*G0_1_1_0_3 + 0.0383090160867951*G0_1_1_0_4 - 0.0547271658382789*G0_1_1_0_5 + 0.012655657100102*G0_1_1_1_0 - 0.0857848324515019*G0_1_1_1_1 - 0.00348885682219028*G0_1_1_1_2 - 0.0506226284004079*G0_1_1_1_3 - 0.00218908663353112*G0_1_1_1_4 + 0.0391299235743694*G0_1_1_1_5 - 0.012655657100102*G0_1_1_2_0 - 0.00348885682219027*G0_1_1_2_1 + 0.072650312650315*G0_1_1_2_2 + 0.0563689808134272*G0_1_1_2_3 + 0.0101245256800816*G0_1_1_2_4 + 0.0350253861364985*G0_1_1_2_5 - 0.00820907487574188*G0_1_1_3_0 - 0.0506226284004079*G0_1_1_3_1 + 0.0563689808134272*G0_1_1_3_2 - 0.00985088985089055*G0_1_1_3_3 + 0.0207963230185458*G0_1_1_3_4 - 0.0536326225215133*G0_1_1_3_5 + 0.0383090160867952*G0_1_1_4_0 - 0.00218908663353113*G0_1_1_4_1 + 0.0101245256800816*G0_1_1_4_2 + 0.0207963230185458*G0_1_1_4_3 + 0.224381379936943*G0_1_1_4_4 - 0.0656725990059347*G0_1_1_4_5 - 0.0547271658382789*G0_1_1_5_0 + 0.0391299235743694*G0_1_1_5_1 + 0.0350253861364985*G0_1_1_5_2 - 0.0536326225215133*G0_1_1_5_3 - 0.0656725990059347*G0_1_1_5_4 - 0.487071775960682*G0_1_1_5_5; + A[81] = -A[126] + 0.00697771364438066*G0_1_0_0_0 + 0.0007524985302763*G0_1_0_0_1 - 0.0177863288974406*G0_1_0_0_2 - 0.00246272246272257*G0_1_0_0_3 + 0.0276372187483307*G0_1_0_0_4 + 0.000684089572978497*G0_1_0_0_5 + 0.0007524985302763*G0_1_0_1_0 + 0.00451499118165812*G0_1_0_1_1 - 0.00136817914595696*G0_1_0_1_2 + 0.00300999412110543*G0_1_0_1_3 - 0.027089947089948*G0_1_0_1_4 - 0.00916680027791161*G0_1_0_1_5 - 0.0177863288974406*G0_1_0_2_0 - 0.00136817914595696*G0_1_0_2_1 + 0.121083854417191*G0_1_0_2_2 + 0.0164181497514837*G0_1_0_2_4 - 0.00547271658382787*G0_1_0_2_5 - 0.00246272246272257*G0_1_0_3_0 + 0.00300999412110543*G0_1_0_3_1 - 0.0755234888568249*G0_1_0_3_3 + 0.0591053391053411*G0_1_0_3_4 + 0.0158708780931009*G0_1_0_3_5 + 0.0276372187483307*G0_1_0_4_0 - 0.027089947089948*G0_1_0_4_1 + 0.0164181497514837*G0_1_0_4_2 + 0.0591053391053411*G0_1_0_4_3 + 0.220003206669881*G0_1_0_4_4 + 0.0651253273475518*G0_1_0_4_5 + 0.000684089572978498*G0_1_0_5_0 - 0.00916680027791161*G0_1_0_5_1 - 0.00547271658382787*G0_1_0_5_2 + 0.0158708780931009*G0_1_0_5_3 + 0.0651253273475518*G0_1_0_5_4 + 0.0142290631179529*G0_1_0_5_5 + 0.199890973224313*G0_1_1_0_0 - 0.0152551974774202*G0_1_1_0_1 - 0.0184704184704191*G0_1_1_0_2 - 0.00424135535246665*G0_1_1_0_3 + 0.021206776762333*G0_1_1_0_4 + 0.0809962054406528*G0_1_1_0_5 - 0.0152551974774202*G0_1_1_1_0 + 0.0102613435946774*G0_1_1_1_1 - 0.0021206776762333*G0_1_1_1_2 - 0.00123136123136124*G0_1_1_1_3 - 0.0253113142002039*G0_1_1_1_4 - 0.0250376783710125*G0_1_1_1_5 - 0.0184704184704191*G0_1_1_2_0 - 0.0021206776762333*G0_1_1_2_1 + 0.116979316979321*G0_1_1_2_2 + 0.00547271658382785*G0_1_1_2_3 + 0.0273635829191395*G0_1_1_2_4 - 0.00506226284004077*G0_1_1_2_5 - 0.00424135535246665*G0_1_1_3_0 - 0.00123136123136124*G0_1_1_3_1 + 0.00547271658382785*G0_1_1_3_2 - 0.0596526107637239*G0_1_1_3_3 + 0.0591053391053411*G0_1_1_3_4 + 0.0186072363850148*G0_1_1_3_5 + 0.021206776762333*G0_1_1_4_0 - 0.0253113142002039*G0_1_1_4_1 + 0.0273635829191395*G0_1_1_4_2 + 0.0591053391053411*G0_1_1_4_3 + 0.154877879322329*G0_1_1_4_4 + 0.0607471540804895*G0_1_1_4_5 + 0.0809962054406528*G0_1_1_5_0 - 0.0250376783710125*G0_1_1_5_1 - 0.00506226284004077*G0_1_1_5_2 + 0.0186072363850148*G0_1_1_5_3 + 0.0607471540804895*G0_1_1_5_4 + 0.104528886751113*G0_1_1_5_5; + A[129] = A[81] - 0.00410453743787099*G0_0_0_0_0 - 0.000752498530276336*G0_0_0_0_1 - 0.000684089572978381*G0_0_0_0_2 + 0.000410453743787111*G0_0_0_0_3 + 0.0109454331676557*G0_0_0_0_4 + 0.00547271658382784*G0_0_0_0_5 - 0.000752498530276336*G0_0_0_1_0 + 0.00574635241301925*G0_0_0_1_1 - 0.0160076960076965*G0_0_0_1_2 - 0.0158708780931008*G0_0_0_1_3 + 0.00177863288974409*G0_0_0_1_4 - 0.00424135535246657*G0_0_0_1_5 - 0.000684089572978381*G0_0_0_2_0 - 0.0160076960076965*G0_0_0_2_1 + 0.192913259579931*G0_0_0_2_2 + 0.080312115867674*G0_0_0_2_3 - 0.00643044198599805*G0_0_0_2_4 - 0.00177863288974403*G0_0_0_2_5 + 0.000410453743787111*G0_0_0_3_0 - 0.0158708780931008*G0_0_0_3_1 + 0.080312115867674*G0_0_0_3_2 + 0.0902998236331602*G0_0_0_3_3 - 0.00437817326706238*G0_0_0_3_4 + 0.00273635829191396*G0_0_0_3_5 + 0.0109454331676557*G0_0_0_4_0 + 0.0017786328897441*G0_0_0_4_1 - 0.00643044198599804*G0_0_0_4_2 - 0.00437817326706238*G0_0_0_4_3 - 0.0651253273475521*G0_0_0_4_4 + 0.00547271658382783*G0_0_0_5_0 - 0.00424135535246657*G0_0_0_5_1 - 0.00177863288974403*G0_0_0_5_2 + 0.00273635829191396*G0_0_0_5_3 + 0.0158708780931007*G0_0_0_5_5 - 0.00410453743787091*G0_0_1_0_0 - 0.000752498530276339*G0_0_1_0_1 - 0.000684089572978437*G0_0_1_0_2 + 0.000410453743787102*G0_0_1_0_3 + 0.0109454331676558*G0_0_1_0_4 + 0.00547271658382786*G0_0_1_0_5 - 0.00075249853027634*G0_0_1_1_0 + 0.00574635241301925*G0_0_1_1_1 - 0.0160076960076965*G0_0_1_1_2 - 0.0158708780931009*G0_0_1_1_3 + 0.00177863288974407*G0_0_1_1_4 - 0.00424135535246658*G0_0_1_1_5 - 0.000684089572978436*G0_0_1_2_0 - 0.0160076960076965*G0_0_1_2_1 + 0.192913259579932*G0_0_1_2_2 + 0.0803121158676742*G0_0_1_2_3 - 0.00643044198599786*G0_0_1_2_4 - 0.00177863288974403*G0_0_1_2_5 + 0.000410453743787103*G0_0_1_3_0 - 0.0158708780931009*G0_0_1_3_1 + 0.0803121158676742*G0_0_1_3_2 + 0.0902998236331603*G0_0_1_3_3 - 0.00437817326706231*G0_0_1_3_4 + 0.00273635829191397*G0_0_1_3_5 + 0.0109454331676558*G0_0_1_4_0 + 0.00177863288974407*G0_0_1_4_1 - 0.00643044198599786*G0_0_1_4_2 - 0.00437817326706231*G0_0_1_4_3 - 0.065125327347552*G0_0_1_4_4 + 0.00547271658382786*G0_0_1_5_0 - 0.00424135535246658*G0_0_1_5_1 - 0.00177863288974403*G0_0_1_5_2 + 0.00273635829191397*G0_0_1_5_3 + 0.0158708780931008*G0_0_1_5_5 + 0.110001603334941*G0_1_0_0_0 - 0.00287317620650962*G0_1_0_0_1 - 0.000684089572978455*G0_1_0_0_2 - 0.00259954037731823*G0_1_0_0_3 - 0.000273635829191341*G0_1_0_0_4 + 0.00478862701084942*G0_1_0_0_5 - 0.00287317620650962*G0_1_0_1_0 + 0.00574635241301909*G0_1_0_1_1 - 0.0138870183314632*G0_1_0_1_2 - 0.028047672492118*G0_1_0_1_3 + 0.00177863288974406*G0_1_0_1_4 + 0.00793543904655037*G0_1_0_1_5 - 0.000684089572978455*G0_1_0_2_0 - 0.0138870183314632*G0_1_0_2_1 + 0.0788071188071211*G0_1_0_2_2 + 0.0809962054406527*G0_1_0_2_3 + 0.00478862701084927*G0_1_0_2_4 + 0.00123136123136129*G0_1_0_2_5 - 0.00259954037731823*G0_1_0_3_0 - 0.028047672492118*G0_1_0_3_1 + 0.0809962054406527*G0_1_0_3_2 + 0.180052375607938*G0_1_0_3_3 + 0.00164181497514838*G0_1_0_3_4 + 0.00273635829191398*G0_1_0_3_5 - 0.000273635829191339*G0_1_0_4_0 + 0.00177863288974406*G0_1_0_4_1 + 0.00478862701084928*G0_1_0_4_2 + 0.00164181497514839*G0_1_0_4_3 - 0.0651253273475517*G0_1_0_4_4 - 0.00601998824221066*G0_1_0_4_5 + 0.00478862701084942*G0_1_0_5_0 + 0.00793543904655037*G0_1_0_5_1 + 0.00123136123136129*G0_1_0_5_2 + 0.00273635829191398*G0_1_0_5_3 - 0.00601998824221066*G0_1_0_5_4 - 0.0738816738816767*G0_1_0_5_5 - 0.0829116562449924*G0_1_1_0_0 + 0.0131345198011869*G0_1_1_0_1 - 0.000820907487574155*G0_1_1_0_3 + 0.0061568061568064*G0_1_1_0_4 - 0.075523488856825*G0_1_1_0_5 + 0.0131345198011869*G0_1_1_1_0 - 0.0131345198011869*G0_1_1_1_2 - 0.0238063171396513*G0_1_1_1_3 + 0.0238063171396513*G0_1_1_1_5 - 0.0131345198011869*G0_1_1_2_1 + 0.0829116562449922*G0_1_1_2_2 + 0.0755234888568248*G0_1_1_2_3 - 0.00615680615680643*G0_1_1_2_4 + 0.000820907487574206*G0_1_1_2_5 - 0.000820907487574155*G0_1_1_3_0 - 0.0238063171396513*G0_1_1_3_1 + 0.0755234888568248*G0_1_1_3_2 + 0.164181497514837*G0_1_1_3_3 + 0.0016418149751484*G0_1_1_3_4 + 0.0061568061568064*G0_1_1_4_0 - 0.00615680615680643*G0_1_1_4_2 + 0.0016418149751484*G0_1_1_4_3 - 0.00164181497514836*G0_1_1_4_5 - 0.075523488856825*G0_1_1_5_0 + 0.0238063171396513*G0_1_1_5_1 + 0.000820907487574205*G0_1_1_5_2 - 0.00164181497514836*G0_1_1_5_4 - 0.164181497514837*G0_1_1_5_5; + A[143] = A[129] + 0.104665704665708*G0_0_1_0_0 - 0.00129977018865912*G0_0_1_0_1 + 0.000615680615680627*G0_0_1_0_2 - 0.00136817914595699*G0_0_1_0_3 - 0.00834589279033752*G0_0_1_0_4 - 0.00396771952327518*G0_0_1_0_5 - 0.00129977018865912*G0_0_1_1_0 + 0.000820907487574121*G0_0_1_1_1 + 0.000820907487574193*G0_0_1_1_2 - 0.00136817914595694*G0_0_1_1_3 - 0.00300999412110534*G0_0_1_1_4 + 0.0108086152530601*G0_0_1_1_5 + 0.000615680615680628*G0_0_1_2_0 + 0.000820907487574192*G0_0_1_2_1 - 0.00944043610710316*G0_0_1_2_2 - 0.00328362995029681*G0_0_1_2_3 + 0.00287317620650966*G0_0_1_2_4 + 0.00164181497514836*G0_0_1_2_5 - 0.00136817914595699*G0_0_1_3_0 - 0.00136817914595694*G0_0_1_3_1 - 0.00328362995029681*G0_0_1_3_2 - 0.00218908663353115*G0_0_1_3_3 + 0.00875634653412462*G0_0_1_3_4 - 0.000547271658382767*G0_0_1_3_5 - 0.00834589279033751*G0_0_1_4_0 - 0.00300999412110534*G0_0_1_4_1 + 0.00287317620650966*G0_0_1_4_2 + 0.00875634653412462*G0_0_1_4_3 - 0.0120399764844213*G0_0_1_4_4 + 0.00273635829191395*G0_0_1_4_5 - 0.00396771952327518*G0_0_1_5_0 + 0.0108086152530601*G0_0_1_5_1 + 0.00164181497514836*G0_0_1_5_2 - 0.000547271658382766*G0_0_1_5_3 + 0.00273635829191395*G0_0_1_5_4 - 0.0919416386083084*G0_0_1_5_5 - 0.104665704665708*G0_1_0_0_0 + 0.00129977018865912*G0_1_0_0_1 - 0.000615680615680627*G0_1_0_0_2 + 0.00136817914595699*G0_1_0_0_3 + 0.00834589279033752*G0_1_0_0_4 + 0.00396771952327517*G0_1_0_0_5 + 0.00129977018865912*G0_1_0_1_0 - 0.00082090748757412*G0_1_0_1_1 - 0.000820907487574193*G0_1_0_1_2 + 0.00136817914595694*G0_1_0_1_3 + 0.00300999412110534*G0_1_0_1_4 - 0.0108086152530601*G0_1_0_1_5 - 0.000615680615680628*G0_1_0_2_0 - 0.000820907487574193*G0_1_0_2_1 + 0.00944043610710316*G0_1_0_2_2 + 0.00328362995029681*G0_1_0_2_3 - 0.00287317620650966*G0_1_0_2_4 - 0.00164181497514836*G0_1_0_2_5 + 0.00136817914595699*G0_1_0_3_0 + 0.00136817914595694*G0_1_0_3_1 + 0.00328362995029681*G0_1_0_3_2 + 0.00218908663353115*G0_1_0_3_3 - 0.00875634653412461*G0_1_0_3_4 + 0.000547271658382765*G0_1_0_3_5 + 0.00834589279033751*G0_1_0_4_0 + 0.00300999412110534*G0_1_0_4_1 - 0.00287317620650966*G0_1_0_4_2 - 0.00875634653412462*G0_1_0_4_3 + 0.0120399764844213*G0_1_0_4_4 - 0.00273635829191396*G0_1_0_4_5 + 0.00396771952327517*G0_1_0_5_0 - 0.0108086152530601*G0_1_0_5_1 - 0.00164181497514836*G0_1_0_5_2 + 0.000547271658382766*G0_1_0_5_3 - 0.00273635829191395*G0_1_0_5_4 + 0.0919416386083084*G0_1_0_5_5; + A[84] = -A[129] + 0.114106140772811*G0_1_0_0_0 - 0.00280476724921179*G0_1_0_0_1 - 0.00177863288974406*G0_1_0_0_2 - 0.000547271658382844*G0_1_0_0_3 - 0.00574635241301928*G0_1_0_0_4 - 0.00615680615680639*G0_1_0_0_5 - 0.00280476724921179*G0_1_0_1_0 - 0.0143658810325484*G0_1_0_1_1 - 0.000684089572978489*G0_1_0_1_2 + 0.00766180321735905*G0_1_0_1_3 - 0.00738816738816764*G0_1_0_1_4 + 0.0198385976163761*G0_1_0_1_5 - 0.00177863288974406*G0_1_0_2_0 - 0.000684089572978491*G0_1_0_2_1 - 0.00547271658382792*G0_1_0_2_3 + 0.00547271658382787*G0_1_0_2_4 + 0.00246272246272254*G0_1_0_2_5 - 0.000547271658382843*G0_1_0_3_0 + 0.00766180321735906*G0_1_0_3_1 - 0.00547271658382792*G0_1_0_3_2 - 0.0317417561862014*G0_1_0_3_3 + 0.0158708780931009*G0_1_0_3_4 - 0.00383090160867943*G0_1_0_3_5 - 0.00574635241301927*G0_1_0_4_0 - 0.00738816738816764*G0_1_0_4_1 + 0.00547271658382787*G0_1_0_4_2 + 0.0158708780931009*G0_1_0_4_3 + 0.00985088985089021*G0_1_0_4_5 - 0.00615680615680639*G0_1_0_5_0 + 0.0198385976163761*G0_1_0_5_1 + 0.00246272246272254*G0_1_0_5_2 - 0.00383090160867943*G0_1_0_5_3 + 0.00985088985089021*G0_1_0_5_4 - 0.121494308160979*G0_1_0_5_5 - 0.0788071188071216*G0_1_1_0_0 + 0.0132029287584848*G0_1_1_0_1 - 0.00109454331676556*G0_1_1_0_2 + 0.00123136123136125*G0_1_1_0_3 + 0.000684089572978477*G0_1_1_0_4 - 0.0864689220244808*G0_1_1_0_5 + 0.0132029287584848*G0_1_1_1_0 - 0.0201122334455676*G0_1_1_1_1 + 0.0119031585698257*G0_1_1_1_3 - 0.0091668002779117*G0_1_1_1_4 + 0.035709475709477*G0_1_1_1_5 - 0.00109454331676556*G0_1_1_2_0 + 0.00410453743787078*G0_1_1_2_2 - 0.0109454331676559*G0_1_1_2_3 - 0.00547271658382789*G0_1_1_2_4 + 0.00205226871893546*G0_1_1_2_5 + 0.00123136123136125*G0_1_1_3_0 + 0.0119031585698257*G0_1_1_3_1 - 0.0109454331676559*G0_1_1_3_2 - 0.0476126342793026*G0_1_1_3_3 + 0.0158708780931009*G0_1_1_3_4 - 0.00656725990059339*G0_1_1_3_5 + 0.000684089572978477*G0_1_1_4_0 - 0.0091668002779117*G0_1_1_4_1 - 0.00547271658382789*G0_1_1_4_2 + 0.0158708780931009*G0_1_1_4_3 + 0.0651253273475517*G0_1_1_4_4 + 0.0142290631179525*G0_1_1_4_5 - 0.0864689220244808*G0_1_1_5_0 + 0.035709475709477*G0_1_1_5_1 + 0.00205226871893545*G0_1_1_5_2 - 0.00656725990059339*G0_1_1_5_3 + 0.0142290631179525*G0_1_1_5_4 - 0.211794131794139*G0_1_1_5_5; + A[156] = A[100] - 0.224210357543699*G0_0_1_0_0 - 0.00425845759179108*G0_0_1_0_1 + 0.00138528138528146*G0_0_1_0_2 + 0.00338624338624353*G0_0_1_0_3 + 0.00615680615680629*G0_0_1_0_4 + 0.0256533589866931*G0_0_1_0_5 - 0.00425845759179108*G0_0_1_1_0 + 0.00615680615680653*G0_0_1_1_1 - 0.000307840307840349*G0_0_1_1_2 + 0.00410453743787104*G0_0_1_1_3 - 0.00359147025813703*G0_0_1_1_4 - 0.00831168831168853*G0_0_1_1_5 + 0.00138528138528146*G0_0_1_2_0 - 0.000307840307840349*G0_0_1_2_1 + 0.0015392015392017*G0_0_1_2_2 + 0.000513067179733869*G0_0_1_2_3 - 0.0152894019560692*G0_0_1_2_4 + 0.000307840307840307*G0_0_1_2_5 + 0.00338624338624353*G0_0_1_3_0 + 0.00410453743787104*G0_0_1_3_1 + 0.000513067179733869*G0_0_1_3_2 + 0.00574635241301953*G0_0_1_3_3 + 0.000410453743787065*G0_0_1_3_4 - 0.00738816738816761*G0_0_1_3_5 + 0.00615680615680631*G0_0_1_4_0 - 0.00359147025813704*G0_0_1_4_1 - 0.0152894019560692*G0_0_1_4_2 + 0.000410453743787065*G0_0_1_4_3 + 0.141196087862759*G0_0_1_4_4 + 0.00656725990059343*G0_0_1_4_5 + 0.0256533589866931*G0_0_1_5_0 - 0.00831168831168853*G0_0_1_5_1 + 0.000307840307840307*G0_0_1_5_2 - 0.00738816738816761*G0_0_1_5_3 + 0.00656725990059343*G0_0_1_5_4 + 0.0508962642295998*G0_0_1_5_5 + 0.224210357543699*G0_1_0_0_0 + 0.00425845759179108*G0_1_0_0_1 - 0.00138528138528146*G0_1_0_0_2 - 0.00338624338624353*G0_1_0_0_3 - 0.0061568061568063*G0_1_0_0_4 - 0.0256533589866931*G0_1_0_0_5 + 0.00425845759179108*G0_1_0_1_0 - 0.00615680615680654*G0_1_0_1_1 + 0.000307840307840349*G0_1_0_1_2 - 0.00410453743787104*G0_1_0_1_3 + 0.00359147025813704*G0_1_0_1_4 + 0.00831168831168853*G0_1_0_1_5 - 0.00138528138528146*G0_1_0_2_0 + 0.000307840307840349*G0_1_0_2_1 - 0.0015392015392017*G0_1_0_2_2 - 0.000513067179733869*G0_1_0_2_3 + 0.0152894019560692*G0_1_0_2_4 - 0.000307840307840307*G0_1_0_2_5 - 0.00338624338624353*G0_1_0_3_0 - 0.00410453743787104*G0_1_0_3_1 - 0.000513067179733869*G0_1_0_3_2 - 0.00574635241301953*G0_1_0_3_3 - 0.000410453743787065*G0_1_0_3_4 + 0.00738816738816761*G0_1_0_3_5 - 0.0061568061568063*G0_1_0_4_0 + 0.00359147025813704*G0_1_0_4_1 + 0.0152894019560692*G0_1_0_4_2 - 0.000410453743787061*G0_1_0_4_3 - 0.141196087862759*G0_1_0_4_4 - 0.00656725990059343*G0_1_0_4_5 - 0.0256533589866931*G0_1_0_5_0 + 0.00831168831168853*G0_1_0_5_1 - 0.000307840307840306*G0_1_0_5_2 + 0.00738816738816761*G0_1_0_5_3 - 0.00656725990059343*G0_1_0_5_4 - 0.0508962642295998*G0_1_0_5_5; + A[142] = A[156] - 0.0790123456790146*G0_0_0_0_0 - 0.00395061728395076*G0_0_0_0_1 + 0.0166746833413506*G0_0_0_0_2 + 0.000102613435946786*G0_0_0_0_3 - 0.0841430174763536*G0_0_0_0_4 + 0.0092352092352095*G0_0_0_0_5 - 0.00395061728395076*G0_0_0_1_0 + 0.0193939393939402*G0_0_0_1_1 + 0.00148789482122819*G0_0_0_1_2 + 0.0207279140612482*G0_0_0_1_3 - 0.00277056277056286*G0_0_0_1_4 - 0.00666987333654009*G0_0_0_1_5 + 0.0166746833413506*G0_0_0_2_0 + 0.00148789482122819*G0_0_0_2_1 - 0.0133397466730804*G0_0_0_2_2 - 0.0265768799102142*G0_0_0_2_3 + 0.0146737213403884*G0_0_0_2_4 - 0.0132371332371337*G0_0_0_2_5 + 0.000102613435946786*G0_0_0_3_0 + 0.0207279140612482*G0_0_0_3_1 - 0.0265768799102142*G0_0_0_3_2 + 0.00574635241301918*G0_0_0_3_3 + 0.00533589866923219*G0_0_0_3_4 + 0.0262690396023738*G0_0_0_3_5 - 0.0841430174763536*G0_0_0_4_0 - 0.00277056277056285*G0_0_0_4_1 + 0.0146737213403884*G0_0_0_4_2 + 0.00533589866923219*G0_0_0_4_3 - 0.159256052589391*G0_0_0_4_4 + 0.0320153920153931*G0_0_0_4_5 + 0.0092352092352095*G0_0_0_5_0 - 0.00666987333654009*G0_0_0_5_1 - 0.0132371332371337*G0_0_0_5_2 + 0.0262690396023738*G0_0_0_5_3 + 0.0320153920153931*G0_0_0_5_4 + 0.0788071188071215*G0_0_0_5_5 + 0.00482283148949831*G0_0_1_0_1 - 0.00482283148949834*G0_0_1_0_2 + 0.0348885682219028*G0_0_1_0_4 - 0.0348885682219027*G0_0_1_0_5 + 0.00482283148949831*G0_0_1_1_0 + 0.0111848645181982*G0_0_1_1_1 + 0.0237037037037045*G0_0_1_1_3 + 0.00513067179733863*G0_0_1_1_4 + 0.0104665704665709*G0_0_1_1_5 - 0.00482283148949833*G0_0_1_2_0 - 0.0111848645181982*G0_0_1_2_2 - 0.0237037037037045*G0_0_1_2_3 - 0.0104665704665709*G0_0_1_2_4 - 0.00513067179733865*G0_0_1_2_5 + 0.0237037037037045*G0_0_1_3_1 - 0.0237037037037045*G0_0_1_3_2 - 0.0102613435946773*G0_0_1_3_4 + 0.0102613435946773*G0_0_1_3_5 + 0.0348885682219028*G0_0_1_4_0 + 0.00513067179733863*G0_0_1_4_1 - 0.0104665704665709*G0_0_1_4_2 - 0.0102613435946773*G0_0_1_4_3 - 0.0328362995029671*G0_0_1_4_4 - 0.0348885682219027*G0_0_1_5_0 + 0.0104665704665709*G0_0_1_5_1 - 0.00513067179733865*G0_0_1_5_2 + 0.0102613435946773*G0_0_1_5_3 + 0.0328362995029672*G0_0_1_5_5 - 0.000820907487574162*G0_1_0_0_1 + 0.000820907487574201*G0_1_0_0_2 + 0.0153920153920159*G0_1_0_0_4 - 0.0153920153920161*G0_1_0_0_5 - 0.000820907487574162*G0_1_0_1_0 + 0.0158024691358032*G0_1_0_1_1 + 0.0272951739618417*G0_1_0_1_3 + 0.00123136123136129*G0_1_0_1_4 + 0.0174442841109515*G0_1_0_1_5 + 0.000820907487574201*G0_1_0_2_0 - 0.015802469135803*G0_1_0_2_2 - 0.0272951739618416*G0_1_0_2_3 - 0.0174442841109514*G0_1_0_2_4 - 0.00123136123136129*G0_1_0_2_5 + 0.0272951739618417*G0_1_0_3_1 - 0.0272951739618416*G0_1_0_3_2 - 0.00246272246272261*G0_1_0_3_4 + 0.00246272246272254*G0_1_0_3_5 + 0.0153920153920159*G0_1_0_4_0 + 0.00123136123136129*G0_1_0_4_1 - 0.0174442841109514*G0_1_0_4_2 - 0.00246272246272261*G0_1_0_4_3 + 0.0574635241301928*G0_1_0_4_4 - 0.0153920153920161*G0_1_0_5_0 + 0.0174442841109515*G0_1_0_5_1 - 0.00123136123136129*G0_1_0_5_2 + 0.00246272246272254*G0_1_0_5_3 - 0.0574635241301926*G0_1_0_5_5 + 0.0790123456790155*G0_1_1_0_0 - 0.0166746833413506*G0_1_1_0_1 + 0.00395061728395074*G0_1_1_0_2 - 0.000102613435946754*G0_1_1_0_3 - 0.00923520923520946*G0_1_1_0_4 + 0.0841430174763539*G0_1_1_0_5 - 0.0166746833413506*G0_1_1_1_0 + 0.0133397466730804*G0_1_1_1_1 - 0.00148789482122818*G0_1_1_1_2 + 0.0265768799102141*G0_1_1_1_3 + 0.0132371332371337*G0_1_1_1_4 - 0.0146737213403885*G0_1_1_1_5 + 0.00395061728395074*G0_1_1_2_0 - 0.00148789482122818*G0_1_1_2_1 - 0.01939393939394*G0_1_1_2_2 - 0.0207279140612481*G0_1_1_2_3 + 0.00666987333654015*G0_1_1_2_4 + 0.00277056277056283*G0_1_1_2_5 - 0.000102613435946754*G0_1_1_3_0 + 0.0265768799102141*G0_1_1_3_1 - 0.0207279140612482*G0_1_1_3_2 - 0.00574635241301967*G0_1_1_3_3 - 0.0262690396023739*G0_1_1_3_4 - 0.00533589866923222*G0_1_1_3_5 - 0.00923520923520947*G0_1_1_4_0 + 0.0132371332371337*G0_1_1_4_1 + 0.00666987333654015*G0_1_1_4_2 - 0.0262690396023739*G0_1_1_4_3 - 0.0788071188071214*G0_1_1_4_4 - 0.0320153920153931*G0_1_1_4_5 + 0.0841430174763539*G0_1_1_5_0 - 0.0146737213403885*G0_1_1_5_1 + 0.00277056277056283*G0_1_1_5_2 - 0.00533589866923222*G0_1_1_5_3 - 0.0320153920153931*G0_1_1_5_4 + 0.159256052589392*G0_1_1_5_5; + A[223] = 0.00123136123136129*G0_0_0_0_1 + 0.0258585858585867*G0_0_0_0_2 + 0.0541798941798959*G0_0_0_0_4 + 0.00123136123136129*G0_0_0_1_0 - 0.0492544492544509*G0_0_0_1_1 + 0.0160076960076965*G0_0_0_1_2 - 0.00492544492544509*G0_0_0_1_3 + 0.0197017797017803*G0_0_0_1_4 - 0.00985088985089022*G0_0_0_1_5 + 0.0258585858585867*G0_0_0_2_0 + 0.0160076960076965*G0_0_0_2_1 - 0.110822510822515*G0_0_0_2_2 - 0.0591053391053409*G0_0_0_2_3 - 0.137912457912463*G0_0_0_2_4 - 0.0049254449254451*G0_0_0_2_5 - 0.00492544492544509*G0_0_0_3_1 - 0.0591053391053409*G0_0_0_3_2 + 0.472842712842731*G0_0_0_3_3 - 0.0394035594035606*G0_0_0_3_4 + 0.00985088985089028*G0_0_0_3_5 + 0.0541798941798959*G0_0_0_4_0 + 0.0197017797017803*G0_0_0_4_1 - 0.137912457912463*G0_0_0_4_2 - 0.0394035594035606*G0_0_0_4_3 - 0.788071188071215*G0_0_0_4_4 - 0.0295526695526706*G0_0_0_4_5 - 0.00985088985089022*G0_0_0_5_1 - 0.0049254449254451*G0_0_0_5_2 + 0.00985088985089028*G0_0_0_5_3 - 0.0295526695526706*G0_0_0_5_4 - 0.0197017797017806*G0_0_0_5_5 + 0.0160076960076965*G0_0_1_0_0 - 0.00184704184704191*G0_0_1_0_1 - 0.00184704184704185*G0_0_1_0_2 - 0.0418662818662831*G0_0_1_0_3 - 0.0123136123136126*G0_0_1_0_4 - 0.0123136123136127*G0_0_1_0_5 - 0.00184704184704191*G0_0_1_1_0 - 0.00861952861952875*G0_0_1_1_1 + 0.000615680615680589*G0_0_1_1_2 - 0.0221645021645029*G0_0_1_1_3 - 0.00738816738816761*G0_0_1_1_4 + 0.0123136123136127*G0_0_1_1_5 - 0.00184704184704185*G0_0_1_2_0 + 0.00061568061568059*G0_0_1_2_1 - 0.00861952861952912*G0_0_1_2_2 - 0.0221645021645028*G0_0_1_2_3 + 0.0123136123136124*G0_0_1_2_4 - 0.0073881673881676*G0_0_1_2_5 - 0.0418662818662831*G0_0_1_3_0 - 0.0221645021645029*G0_0_1_3_1 - 0.0221645021645028*G0_0_1_3_2 + 0.837325637325668*G0_0_1_3_3 + 0.0985088985089018*G0_0_1_3_4 + 0.0985088985089019*G0_0_1_3_5 - 0.0123136123136126*G0_0_1_4_0 - 0.00738816738816761*G0_0_1_4_1 + 0.0123136123136124*G0_0_1_4_2 + 0.0985088985089018*G0_0_1_4_3 + 0.0689562289562302*G0_0_1_4_4 + 0.0295526695526704*G0_0_1_4_5 - 0.0123136123136127*G0_0_1_5_0 + 0.0123136123136127*G0_0_1_5_1 - 0.0073881673881676*G0_0_1_5_2 + 0.0985088985089019*G0_0_1_5_3 + 0.0295526695526704*G0_0_1_5_4 + 0.0689562289562305*G0_0_1_5_5 + 0.0061568061568064*G0_1_0_0_0 + 0.0153920153920159*G0_1_0_0_1 + 0.0153920153920159*G0_1_0_0_2 - 0.0418662818662831*G0_1_0_0_3 - 0.0517171717171734*G0_1_0_0_4 - 0.0517171717171733*G0_1_0_0_5 + 0.0153920153920159*G0_1_0_1_0 - 0.0332467532467543*G0_1_0_1_1 + 0.0350937950937962*G0_1_0_1_2 - 0.0911207311207343*G0_1_0_1_3 - 0.0664935064935087*G0_1_0_1_4 - 0.0763443963443989*G0_1_0_1_5 + 0.0153920153920159*G0_1_0_2_0 + 0.0350937950937962*G0_1_0_2_1 - 0.0332467532467541*G0_1_0_2_2 - 0.0911207311207338*G0_1_0_2_3 - 0.0763443963443988*G0_1_0_2_4 - 0.0664935064935087*G0_1_0_2_5 - 0.0418662818662831*G0_1_0_3_0 - 0.0911207311207343*G0_1_0_3_1 - 0.0911207311207338*G0_1_0_3_2 + 0.52209716209718*G0_1_0_3_3 + 0.216719576719584*G0_1_0_3_4 + 0.216719576719584*G0_1_0_3_5 - 0.0517171717171734*G0_1_0_4_0 - 0.0664935064935087*G0_1_0_4_1 - 0.0763443963443988*G0_1_0_4_2 + 0.216719576719584*G0_1_0_4_3 + 0.226570466570474*G0_1_0_4_4 + 0.265974025974035*G0_1_0_4_5 - 0.0517171717171733*G0_1_0_5_0 - 0.0763443963443989*G0_1_0_5_1 - 0.0664935064935087*G0_1_0_5_2 + 0.216719576719584*G0_1_0_5_3 + 0.265974025974035*G0_1_0_5_4 + 0.226570466570474*G0_1_0_5_5 + 0.0258585858585868*G0_1_1_0_1 + 0.00123136123136123*G0_1_1_0_2 + 0.054179894179896*G0_1_1_0_5 + 0.0258585858585868*G0_1_1_1_0 - 0.110822510822515*G0_1_1_1_1 + 0.0160076960076965*G0_1_1_1_2 - 0.0591053391053414*G0_1_1_1_3 - 0.00492544492544515*G0_1_1_1_4 - 0.137912457912463*G0_1_1_1_5 + 0.00123136123136123*G0_1_1_2_0 + 0.0160076960076965*G0_1_1_2_1 - 0.0492544492544506*G0_1_1_2_2 - 0.00492544492544471*G0_1_1_2_3 - 0.00985088985089011*G0_1_1_2_4 + 0.0197017797017804*G0_1_1_2_5 - 0.0591053391053414*G0_1_1_3_1 - 0.0049254449254447*G0_1_1_3_2 + 0.47284271284273*G0_1_1_3_3 + 0.00985088985089039*G0_1_1_3_4 - 0.0394035594035607*G0_1_1_3_5 - 0.00492544492544515*G0_1_1_4_1 - 0.00985088985089011*G0_1_1_4_2 + 0.00985088985089039*G0_1_1_4_3 - 0.0197017797017802*G0_1_1_4_4 - 0.0295526695526704*G0_1_1_4_5 + 0.054179894179896*G0_1_1_5_0 - 0.137912457912463*G0_1_1_5_1 + 0.0197017797017804*G0_1_1_5_2 - 0.0394035594035607*G0_1_1_5_3 - 0.0295526695526704*G0_1_1_5_4 - 0.788071188071216*G0_1_1_5_5; + A[192] = A[223] + 0.325079365079376*G0_0_0_0_0 - 0.0147763347763353*G0_0_0_0_1 - 0.0911207311207342*G0_0_0_0_2 - 0.0886580086580114*G0_0_0_0_3 + 0.275824915824925*G0_0_0_0_4 - 0.0147763347763353*G0_0_0_1_0 + 0.118210678210682*G0_0_0_1_1 - 0.0221645021645029*G0_0_0_1_2 - 0.0197017797017803*G0_0_0_1_3 - 0.147763347763353*G0_0_0_1_4 - 0.0492544492544508*G0_0_0_1_5 - 0.0911207311207342*G0_0_0_2_0 - 0.0221645021645029*G0_0_0_2_1 + 0.206868686868694*G0_0_0_2_2 + 0.0197017797017806*G0_0_0_2_3 - 0.059105339105341*G0_0_0_2_4 - 0.108359788359792*G0_0_0_2_5 - 0.0886580086580114*G0_0_0_3_0 - 0.0197017797017803*G0_0_0_3_1 + 0.0197017797017806*G0_0_0_3_2 + 0.630456950456971*G0_0_0_3_3 + 0.472842712842728*G0_0_0_3_4 + 0.394035594035607*G0_0_0_3_5 + 0.275824915824925*G0_0_0_4_0 - 0.147763347763353*G0_0_0_4_1 - 0.059105339105341*G0_0_0_4_2 + 0.472842712842728*G0_0_0_4_3 + 2.52182780182789*G0_0_0_4_4 + 0.512246272246289*G0_0_0_4_5 - 0.0492544492544508*G0_0_0_5_1 - 0.108359788359792*G0_0_0_5_2 + 0.394035594035607*G0_0_0_5_3 + 0.512246272246289*G0_0_0_5_4 + 0.55164983164985*G0_0_0_5_5 + 0.0935834535834567*G0_0_1_0_0 + 0.00246272246272253*G0_0_1_0_1 + 0.00246272246272246*G0_0_1_0_2 - 0.059105339105341*G0_0_1_0_3 - 0.0197017797017803*G0_0_1_0_4 - 0.0197017797017802*G0_0_1_0_5 + 0.00246272246272253*G0_0_1_1_0 + 0.0664935064935086*G0_0_1_1_1 - 0.0147763347763353*G0_0_1_1_2 - 0.0591053391053411*G0_0_1_1_4 - 0.0492544492544509*G0_0_1_1_5 + 0.00246272246272246*G0_0_1_2_0 - 0.0147763347763353*G0_0_1_2_1 + 0.0664935064935092*G0_0_1_2_2 - 0.0492544492544506*G0_0_1_2_4 - 0.0591053391053411*G0_0_1_2_5 - 0.059105339105341*G0_0_1_3_0 + 0.236421356421364*G0_0_1_3_3 + 0.236421356421364*G0_0_1_3_4 + 0.236421356421364*G0_0_1_3_5 - 0.0197017797017803*G0_0_1_4_0 - 0.0591053391053411*G0_0_1_4_1 - 0.0492544492544506*G0_0_1_4_2 + 0.236421356421364*G0_0_1_4_3 + 0.197017797017805*G0_0_1_4_4 + 0.236421356421365*G0_0_1_4_5 - 0.0197017797017803*G0_0_1_5_0 - 0.0492544492544509*G0_0_1_5_1 - 0.0591053391053411*G0_0_1_5_2 + 0.236421356421364*G0_0_1_5_3 + 0.236421356421365*G0_0_1_5_4 + 0.197017797017804*G0_0_1_5_5 + 0.103434343434347*G0_1_0_0_0 - 0.0147763347763353*G0_1_0_0_1 - 0.0147763347763353*G0_1_0_0_2 - 0.059105339105341*G0_1_0_0_3 + 0.0197017797017804*G0_1_0_0_4 + 0.0197017797017804*G0_1_0_0_5 - 0.0147763347763353*G0_1_0_1_0 + 0.0911207311207341*G0_1_0_1_1 - 0.0492544492544509*G0_1_0_1_2 + 0.0689562289562314*G0_1_0_1_3 + 0.0394035594035607*G0_1_0_1_5 - 0.0147763347763353*G0_1_0_2_0 - 0.0492544492544509*G0_1_0_2_1 + 0.0911207311207342*G0_1_0_2_2 + 0.0689562289562313*G0_1_0_2_3 + 0.0394035594035607*G0_1_0_2_4 - 0.059105339105341*G0_1_0_3_0 + 0.0689562289562314*G0_1_0_3_1 + 0.0689562289562313*G0_1_0_3_2 + 0.551649831649851*G0_1_0_3_3 + 0.118210678210682*G0_1_0_3_4 + 0.118210678210682*G0_1_0_3_5 + 0.0197017797017804*G0_1_0_4_0 + 0.0394035594035607*G0_1_0_4_2 + 0.118210678210682*G0_1_0_4_3 + 0.0394035594035608*G0_1_0_4_4 + 0.0197017797017804*G0_1_0_5_0 + 0.0394035594035607*G0_1_0_5_1 + 0.118210678210682*G0_1_0_5_3 + 0.0394035594035604*G0_1_0_5_5 + 0.325079365079377*G0_1_1_0_0 - 0.0911207311207344*G0_1_1_0_1 - 0.0147763347763353*G0_1_1_0_2 - 0.0886580086580115*G0_1_1_0_3 + 0.275824915824927*G0_1_1_0_5 - 0.0911207311207344*G0_1_1_1_0 + 0.206868686868694*G0_1_1_1_1 - 0.022164502164503*G0_1_1_1_2 + 0.0197017797017807*G0_1_1_1_3 - 0.108359788359792*G0_1_1_1_4 - 0.0591053391053409*G0_1_1_1_5 - 0.0147763347763353*G0_1_1_2_0 - 0.022164502164503*G0_1_1_2_1 + 0.118210678210682*G0_1_1_2_2 - 0.0197017797017803*G0_1_1_2_3 - 0.0492544492544509*G0_1_1_2_4 - 0.147763347763353*G0_1_1_2_5 - 0.0886580086580115*G0_1_1_3_0 + 0.0197017797017806*G0_1_1_3_1 - 0.0197017797017803*G0_1_1_3_2 + 0.630456950456972*G0_1_1_3_3 + 0.394035594035607*G0_1_1_3_4 + 0.472842712842729*G0_1_1_3_5 - 0.108359788359792*G0_1_1_4_1 - 0.0492544492544509*G0_1_1_4_2 + 0.394035594035607*G0_1_1_4_3 + 0.55164983164985*G0_1_1_4_4 + 0.512246272246289*G0_1_1_4_5 + 0.275824915824927*G0_1_1_5_0 - 0.0591053391053409*G0_1_1_5_1 - 0.147763347763353*G0_1_1_5_2 + 0.472842712842729*G0_1_1_5_3 + 0.512246272246289*G0_1_1_5_4 + 2.52182780182789*G0_1_1_5_5; + A[208] = A[192] - 0.256123136123145*G0_0_0_0_0 + 0.0591053391053411*G0_0_0_0_2 - 0.0394035594035607*G0_0_0_0_3 - 0.354632034632047*G0_0_0_0_4 - 0.0591053391053412*G0_0_0_0_5 + 0.256123136123145*G0_0_0_1_1 - 0.0591053391053411*G0_0_0_1_2 + 0.354632034632047*G0_0_0_1_3 + 0.0394035594035607*G0_0_0_1_4 + 0.0591053391053414*G0_0_0_1_5 + 0.0591053391053411*G0_0_0_2_0 - 0.0591053391053411*G0_0_0_2_1 - 0.157614237614244*G0_0_0_2_3 + 0.157614237614243*G0_0_0_2_4 - 0.0394035594035607*G0_0_0_3_0 + 0.354632034632047*G0_0_0_3_1 - 0.157614237614244*G0_0_0_3_2 + 0.630456950456972*G0_0_0_3_3 + 0.0788071188071219*G0_0_0_3_5 - 0.354632034632047*G0_0_0_4_0 + 0.0394035594035607*G0_0_0_4_1 + 0.157614237614243*G0_0_0_4_2 - 0.630456950456973*G0_0_0_4_4 - 0.0788071188071212*G0_0_0_4_5 - 0.0591053391053412*G0_0_0_5_0 + 0.0591053391053414*G0_0_0_5_1 + 0.0788071188071219*G0_0_0_5_3 - 0.0788071188071212*G0_0_0_5_4 - 0.0985088985089018*G0_0_1_0_0 - 0.0147763347763352*G0_0_1_0_1 + 0.00738816738816765*G0_0_1_0_2 + 0.0394035594035607*G0_0_1_0_3 + 0.0295526695526704*G0_0_1_0_4 + 0.00985088985089008*G0_0_1_0_5 - 0.0147763347763352*G0_0_1_1_0 + 0.157614237614243*G0_0_1_1_1 - 0.0517171717171734*G0_0_1_1_2 + 0.384184704184717*G0_0_1_1_3 + 0.0788071188071214*G0_0_1_1_4 + 0.0689562289562314*G0_0_1_1_5 + 0.00738816738816764*G0_0_1_2_0 - 0.0517171717171734*G0_0_1_2_1 - 0.0197017797017806*G0_0_1_2_2 - 0.137912457912463*G0_0_1_2_3 + 0.0197017797017804*G0_0_1_2_4 + 0.0197017797017802*G0_0_1_2_5 + 0.0394035594035607*G0_0_1_3_0 + 0.384184704184717*G0_0_1_3_1 - 0.137912457912463*G0_0_1_3_2 + 0.394035594035608*G0_0_1_3_3 - 0.236421356421364*G0_0_1_3_4 - 0.118210678210682*G0_0_1_3_5 + 0.0295526695526704*G0_0_1_4_0 + 0.0788071188071214*G0_0_1_4_1 + 0.0197017797017804*G0_0_1_4_2 - 0.236421356421364*G0_0_1_4_3 - 0.236421356421364*G0_0_1_4_4 - 0.197017797017804*G0_0_1_4_5 + 0.00985088985089009*G0_0_1_5_0 + 0.0689562289562314*G0_0_1_5_1 + 0.0197017797017802*G0_0_1_5_2 - 0.118210678210682*G0_0_1_5_3 - 0.197017797017804*G0_0_1_5_4 - 0.0985088985089018*G0_1_0_0_0 - 0.0147763347763352*G0_1_0_0_1 + 0.00738816738816764*G0_1_0_0_2 + 0.0394035594035607*G0_1_0_0_3 + 0.0295526695526704*G0_1_0_0_4 + 0.00985088985089008*G0_1_0_0_5 - 0.0147763347763352*G0_1_0_1_0 + 0.157614237614243*G0_1_0_1_1 - 0.0517171717171734*G0_1_0_1_2 + 0.384184704184717*G0_1_0_1_3 + 0.0788071188071214*G0_1_0_1_4 + 0.0689562289562314*G0_1_0_1_5 + 0.00738816738816764*G0_1_0_2_0 - 0.0517171717171734*G0_1_0_2_1 - 0.0197017797017807*G0_1_0_2_2 - 0.137912457912463*G0_1_0_2_3 + 0.0197017797017804*G0_1_0_2_4 + 0.0197017797017802*G0_1_0_2_5 + 0.0394035594035607*G0_1_0_3_0 + 0.384184704184717*G0_1_0_3_1 - 0.137912457912463*G0_1_0_3_2 + 0.394035594035608*G0_1_0_3_3 - 0.236421356421364*G0_1_0_3_4 - 0.118210678210682*G0_1_0_3_5 + 0.0295526695526704*G0_1_0_4_0 + 0.0788071188071214*G0_1_0_4_1 + 0.0197017797017804*G0_1_0_4_2 - 0.236421356421364*G0_1_0_4_3 - 0.236421356421364*G0_1_0_4_4 - 0.197017797017804*G0_1_0_4_5 + 0.00985088985089009*G0_1_0_5_0 + 0.0689562289562314*G0_1_0_5_1 + 0.0197017797017802*G0_1_0_5_2 - 0.118210678210682*G0_1_0_5_3 - 0.197017797017804*G0_1_0_5_4 - 0.275824915824926*G0_1_1_0_0 - 0.0147763347763351*G0_1_1_0_1 + 0.0295526695526706*G0_1_1_0_2 - 0.0197017797017804*G0_1_1_0_3 - 0.0197017797017806*G0_1_1_0_4 - 0.512246272246291*G0_1_1_0_5 - 0.0147763347763351*G0_1_1_1_0 + 0.334930254930267*G0_1_1_1_1 - 0.0738816738816763*G0_1_1_1_2 + 0.433439153439168*G0_1_1_1_3 + 0.137912457912463*G0_1_1_1_4 + 0.591053391053412*G0_1_1_1_5 + 0.0295526695526706*G0_1_1_2_0 - 0.0738816738816763*G0_1_1_2_1 - 0.0197017797017808*G0_1_1_2_2 - 0.157614237614244*G0_1_1_2_3 + 0.0394035594035606*G0_1_1_2_4 + 0.0197017797017803*G0_1_1_2_5 - 0.0197017797017804*G0_1_1_3_0 + 0.433439153439168*G0_1_1_3_1 - 0.157614237614244*G0_1_1_3_2 + 0.630456950456972*G0_1_1_3_3 - 0.236421356421364*G0_1_1_3_4 - 0.0197017797017806*G0_1_1_4_0 + 0.137912457912463*G0_1_1_4_1 + 0.0394035594035606*G0_1_1_4_2 - 0.236421356421364*G0_1_1_4_3 - 0.472842712842728*G0_1_1_4_4 - 0.315228475228486*G0_1_1_4_5 - 0.512246272246291*G0_1_1_5_0 + 0.591053391053412*G0_1_1_5_1 + 0.0197017797017802*G0_1_1_5_2 - 0.315228475228486*G0_1_1_5_4; + A[193] = A[223] - 0.118210678210682*G0_0_0_0_0 - 0.00492544492544507*G0_0_0_0_1 - 0.0123136123136127*G0_0_0_0_2 + 0.0886580086580114*G0_0_0_0_3 - 0.137912457912463*G0_0_0_0_4 + 0.0492544492544508*G0_0_0_0_5 - 0.00492544492544507*G0_0_0_1_0 - 0.0689562289562316*G0_0_0_1_1 - 0.00246272246272243*G0_0_0_1_2 - 0.0788071188071218*G0_0_0_1_3 + 0.0689562289562312*G0_0_0_1_4 + 0.059105339105341*G0_0_0_1_5 - 0.0123136123136127*G0_0_0_2_0 - 0.00246272246272244*G0_0_0_2_1 + 0.0886580086580116*G0_0_0_2_2 + 0.177316017316023*G0_0_0_2_3 + 0.256123136123145*G0_0_0_2_4 + 0.0886580086580117*G0_0_0_2_5 + 0.0886580086580114*G0_0_0_3_0 - 0.0788071188071218*G0_0_0_3_1 + 0.177316017316023*G0_0_0_3_2 - 1.57614237614243*G0_0_0_3_3 - 0.315228475228486*G0_0_0_3_4 - 0.354632034632047*G0_0_0_3_5 - 0.137912457912463*G0_0_0_4_0 + 0.0689562289562312*G0_0_0_4_1 + 0.256123136123145*G0_0_0_4_2 - 0.315228475228486*G0_0_0_4_3 - 0.315228475228487*G0_0_0_4_4 - 0.315228475228486*G0_0_0_4_5 + 0.0492544492544508*G0_0_0_5_0 + 0.059105339105341*G0_0_0_5_1 + 0.0886580086580117*G0_0_0_5_2 - 0.354632034632047*G0_0_0_5_3 - 0.315228475228486*G0_0_0_5_4 - 0.394035594035607*G0_0_0_5_5 - 0.0566426166426182*G0_0_1_0_0 + 0.0172390572390578*G0_0_1_0_1 + 0.004925444925445*G0_0_1_0_2 + 0.068956228956231*G0_0_1_0_3 - 0.00985088985089019*G0_0_1_0_4 + 0.0295526695526705*G0_0_1_0_5 + 0.0172390572390578*G0_0_1_1_0 - 0.0935834535834569*G0_0_1_1_1 + 0.0270899470899481*G0_0_1_1_2 - 0.128061568061573*G0_0_1_1_3 + 0.00985088985089016*G0_0_1_1_4 - 0.049254449254451*G0_0_1_1_5 + 0.004925444925445*G0_0_1_2_0 + 0.0270899470899481*G0_0_1_2_1 - 0.00738816738816737*G0_0_1_2_2 + 0.0886580086580115*G0_0_1_2_3 + 0.0492544492544509*G0_0_1_2_5 + 0.068956228956231*G0_0_1_3_0 - 0.128061568061573*G0_0_1_3_1 + 0.0886580086580115*G0_0_1_3_2 - 1.69435305435311*G0_0_1_3_3 - 0.157614237614243*G0_0_1_3_4 - 0.236421356421365*G0_0_1_3_5 - 0.00985088985089019*G0_0_1_4_0 + 0.00985088985089016*G0_0_1_4_1 - 0.157614237614243*G0_0_1_4_3 - 0.157614237614242*G0_0_1_4_4 - 0.118210678210682*G0_0_1_4_5 + 0.0295526695526705*G0_0_1_5_0 - 0.049254449254451*G0_0_1_5_1 + 0.0492544492544509*G0_0_1_5_2 - 0.236421356421365*G0_0_1_5_3 - 0.118210678210682*G0_0_1_5_4 - 0.433439153439168*G0_0_1_5_5 - 0.0221645021645031*G0_1_0_0_0 - 0.0344781144781156*G0_1_0_0_1 - 0.0295526695526705*G0_1_0_0_2 + 0.128061568061572*G0_1_0_0_3 + 0.118210678210682*G0_1_0_0_4 + 0.137912457912462*G0_1_0_0_5 - 0.0344781144781156*G0_1_0_1_0 - 0.044329004329006*G0_1_0_1_1 - 0.0246272246272253*G0_1_0_1_2 + 0.0295526695526704*G0_1_0_1_3 + 0.128061568061572*G0_1_0_1_4 + 0.108359788359792*G0_1_0_1_5 - 0.0295526695526705*G0_1_0_2_0 - 0.0246272246272253*G0_1_0_2_1 + 0.0270899470899477*G0_1_0_2_2 + 0.197017797017803*G0_1_0_2_3 + 0.128061568061572*G0_1_0_2_4 + 0.108359788359792*G0_1_0_2_5 + 0.128061568061572*G0_1_0_3_0 + 0.0295526695526704*G0_1_0_3_1 + 0.197017797017803*G0_1_0_3_2 - 1.53673881673887*G0_1_0_3_3 - 0.512246272246289*G0_1_0_3_4 - 0.472842712842729*G0_1_0_3_5 + 0.118210678210682*G0_1_0_4_0 + 0.128061568061572*G0_1_0_4_1 + 0.128061568061572*G0_1_0_4_2 - 0.512246272246289*G0_1_0_4_3 - 0.472842712842729*G0_1_0_4_4 - 0.472842712842729*G0_1_0_4_5 + 0.137912457912462*G0_1_0_5_0 + 0.108359788359792*G0_1_0_5_1 + 0.108359788359792*G0_1_0_5_2 - 0.472842712842729*G0_1_0_5_3 - 0.472842712842729*G0_1_0_5_4 - 0.275824915824925*G0_1_0_5_5 - 0.0492544492544508*G0_1_1_0_0 - 0.00985088985089029*G0_1_1_0_1 + 0.0197017797017802*G0_1_1_0_3 - 0.00985088985089009*G0_1_1_0_4 - 0.0591053391053409*G0_1_1_0_5 - 0.00985088985089029*G0_1_1_1_0 + 0.00985088985089024*G0_1_1_1_2 - 0.0788071188071213*G0_1_1_1_3 + 0.0788071188071219*G0_1_1_1_5 + 0.00985088985089025*G0_1_1_2_1 + 0.0492544492544506*G0_1_1_2_2 + 0.0591053391053407*G0_1_1_2_3 + 0.00985088985089013*G0_1_1_2_4 - 0.0197017797017804*G0_1_1_2_5 + 0.0197017797017802*G0_1_1_3_0 - 0.0788071188071213*G0_1_1_3_1 + 0.0591053391053407*G0_1_1_3_2 - 1.26091390091395*G0_1_1_3_3 - 0.039403559403561*G0_1_1_3_4 - 0.0098508898508901*G0_1_1_4_0 + 0.00985088985089013*G0_1_1_4_2 - 0.039403559403561*G0_1_1_4_3 + 0.0394035594035606*G0_1_1_4_5 - 0.0591053391053409*G0_1_1_5_0 + 0.0788071188071219*G0_1_1_5_1 - 0.0197017797017804*G0_1_1_5_2 + 0.0394035594035606*G0_1_1_5_4 + 1.26091390091395*G0_1_1_5_5; + A[222] = A[193] + 0.0689562289562313*G0_0_0_0_0 + 0.00492544492544505*G0_0_0_0_1 + 0.00246272246272247*G0_0_0_0_2 - 0.0689562289562311*G0_0_0_0_3 + 0.0788071188071218*G0_0_0_0_4 - 0.059105339105341*G0_0_0_0_5 + 0.00492544492544505*G0_0_0_1_0 + 0.118210678210682*G0_0_0_1_1 + 0.0123136123136128*G0_0_0_1_2 + 0.137912457912463*G0_0_0_1_3 - 0.0886580086580116*G0_0_0_1_4 - 0.0492544492544507*G0_0_0_1_5 + 0.00246272246272247*G0_0_0_2_0 + 0.0123136123136128*G0_0_0_2_1 - 0.0886580086580121*G0_0_0_2_2 - 0.256123136123145*G0_0_0_2_3 - 0.177316017316023*G0_0_0_2_4 - 0.0886580086580117*G0_0_0_2_5 - 0.0689562289562311*G0_0_0_3_0 + 0.137912457912463*G0_0_0_3_1 - 0.256123136123145*G0_0_0_3_2 + 0.315228475228484*G0_0_0_3_3 + 0.315228475228485*G0_0_0_3_4 + 0.315228475228486*G0_0_0_3_5 + 0.0788071188071218*G0_0_0_4_0 - 0.0886580086580116*G0_0_0_4_1 - 0.177316017316023*G0_0_0_4_2 + 0.315228475228485*G0_0_0_4_3 + 1.57614237614243*G0_0_0_4_4 + 0.354632034632047*G0_0_0_4_5 - 0.059105339105341*G0_0_0_5_0 - 0.0492544492544507*G0_0_0_5_1 - 0.0886580086580117*G0_0_0_5_2 + 0.315228475228486*G0_0_0_5_3 + 0.354632034632047*G0_0_0_5_4 + 0.394035594035608*G0_0_0_5_5 - 0.0123136123136126*G0_0_1_0_1 + 0.0123136123136128*G0_0_1_0_2 + 0.0394035594035606*G0_0_1_0_4 - 0.0394035594035612*G0_0_1_0_5 - 0.0123136123136126*G0_0_1_1_0 + 0.086195286195289*G0_0_1_1_1 + 0.216719576719584*G0_0_1_1_3 + 0.0394035594035608*G0_0_1_1_4 + 0.0492544492544513*G0_0_1_1_5 + 0.0123136123136128*G0_0_1_2_0 - 0.0861952861952898*G0_0_1_2_2 - 0.216719576719585*G0_0_1_2_3 - 0.0492544492544512*G0_0_1_2_4 - 0.0394035594035608*G0_0_1_2_5 + 0.216719576719584*G0_0_1_3_1 - 0.216719576719585*G0_0_1_3_2 - 0.0788071188071216*G0_0_1_3_4 + 0.0788071188071214*G0_0_1_3_5 + 0.0394035594035606*G0_0_1_4_0 + 0.0394035594035608*G0_0_1_4_1 - 0.0492544492544512*G0_0_1_4_2 - 0.0788071188071216*G0_0_1_4_3 - 0.275824915824924*G0_0_1_4_4 - 0.0394035594035612*G0_0_1_5_0 + 0.0492544492544513*G0_0_1_5_1 - 0.0394035594035608*G0_0_1_5_2 + 0.0788071188071214*G0_0_1_5_3 + 0.275824915824925*G0_0_1_5_5 + 0.00492544492544507*G0_1_0_0_1 - 0.00492544492544507*G0_1_0_0_2 + 0.0197017797017804*G0_1_0_0_4 - 0.0197017797017804*G0_1_0_0_5 + 0.00492544492544506*G0_1_0_1_0 + 0.0714189514189539*G0_1_0_1_1 + 0.167465127465134*G0_1_0_1_3 - 0.0197017797017804*G0_1_0_1_4 + 0.0197017797017805*G0_1_0_1_5 - 0.00492544492544507*G0_1_0_2_0 - 0.0714189514189543*G0_1_0_2_2 - 0.167465127465134*G0_1_0_2_3 - 0.0197017797017805*G0_1_0_2_4 + 0.0197017797017802*G0_1_0_2_5 + 0.167465127465134*G0_1_0_3_1 - 0.167465127465134*G0_1_0_3_2 + 0.0394035594035606*G0_1_0_3_4 - 0.0394035594035605*G0_1_0_3_5 + 0.0197017797017805*G0_1_0_4_0 - 0.0197017797017804*G0_1_0_4_1 - 0.0197017797017805*G0_1_0_4_2 + 0.0394035594035606*G0_1_0_4_3 + 0.197017797017804*G0_1_0_4_4 - 0.0197017797017804*G0_1_0_5_0 + 0.0197017797017805*G0_1_0_5_1 + 0.0197017797017802*G0_1_0_5_2 - 0.0394035594035604*G0_1_0_5_3 - 0.197017797017803*G0_1_0_5_5 - 0.0689562289562321*G0_1_1_0_0 - 0.00246272246272233*G0_1_1_0_1 - 0.00492544492544502*G0_1_1_0_2 + 0.0689562289562311*G0_1_1_0_3 + 0.0591053391053408*G0_1_1_0_4 - 0.0788071188071225*G0_1_1_0_5 - 0.00246272246272233*G0_1_1_1_0 + 0.0886580086580117*G0_1_1_1_1 - 0.0123136123136126*G0_1_1_1_2 + 0.256123136123145*G0_1_1_1_3 + 0.0886580086580116*G0_1_1_1_4 + 0.177316017316023*G0_1_1_1_5 - 0.00492544492544502*G0_1_1_2_0 - 0.0123136123136126*G0_1_1_2_1 - 0.118210678210683*G0_1_1_2_2 - 0.137912457912463*G0_1_1_2_3 + 0.0492544492544508*G0_1_1_2_4 + 0.0886580086580117*G0_1_1_2_5 + 0.0689562289562311*G0_1_1_3_0 + 0.256123136123145*G0_1_1_3_1 - 0.137912457912463*G0_1_1_3_2 - 0.315228475228486*G0_1_1_3_3 - 0.315228475228486*G0_1_1_3_4 - 0.315228475228486*G0_1_1_3_5 + 0.0591053391053408*G0_1_1_4_0 + 0.0886580086580116*G0_1_1_4_1 + 0.0492544492544508*G0_1_1_4_2 - 0.315228475228486*G0_1_1_4_3 - 0.394035594035607*G0_1_1_4_4 - 0.354632034632047*G0_1_1_4_5 - 0.0788071188071225*G0_1_1_5_0 + 0.177316017316023*G0_1_1_5_1 + 0.0886580086580117*G0_1_1_5_2 - 0.315228475228486*G0_1_1_5_3 - 0.354632034632047*G0_1_1_5_4 - 1.57614237614243*G0_1_1_5_5; + A[207] = A[193] + 0.024627224627225*G0_0_1_0_0 - 0.0344781144781156*G0_0_1_0_1 - 0.0172390572390578*G0_0_1_0_2 + 0.059105339105341*G0_0_1_0_3 + 0.0886580086580114*G0_0_1_0_4 + 0.068956228956231*G0_0_1_0_5 - 0.0344781144781156*G0_0_1_1_0 + 0.0246272246272254*G0_0_1_1_1 - 0.0172390572390578*G0_0_1_1_2 + 0.0886580086580115*G0_0_1_1_3 + 0.0591053391053411*G0_0_1_1_4 + 0.0689562289562314*G0_0_1_1_5 - 0.0172390572390578*G0_0_1_2_0 - 0.0172390572390578*G0_0_1_2_1 + 0.00985088985089008*G0_0_1_2_2 + 0.0394035594035607*G0_0_1_2_3 + 0.0394035594035607*G0_0_1_2_4 + 0.059105339105341*G0_0_1_3_0 + 0.0886580086580115*G0_0_1_3_1 + 0.0394035594035607*G0_0_1_3_2 - 0.157614237614243*G0_0_1_3_3 - 0.236421356421364*G0_0_1_3_4 - 0.118210678210682*G0_0_1_3_5 + 0.0886580086580114*G0_0_1_4_0 + 0.0591053391053411*G0_0_1_4_1 + 0.0394035594035607*G0_0_1_4_2 - 0.236421356421364*G0_0_1_4_3 - 0.157614237614243*G0_0_1_4_4 - 0.118210678210682*G0_0_1_4_5 + 0.068956228956231*G0_0_1_5_0 + 0.0689562289562314*G0_0_1_5_1 - 0.118210678210682*G0_0_1_5_3 - 0.118210678210682*G0_0_1_5_4 + 0.315228475228486*G0_0_1_5_5 - 0.024627224627225*G0_1_0_0_0 + 0.0344781144781156*G0_1_0_0_1 + 0.0172390572390578*G0_1_0_0_2 - 0.059105339105341*G0_1_0_0_3 - 0.0886580086580114*G0_1_0_0_4 - 0.068956228956231*G0_1_0_0_5 + 0.0344781144781156*G0_1_0_1_0 - 0.0246272246272254*G0_1_0_1_1 + 0.0172390572390578*G0_1_0_1_2 - 0.0886580086580115*G0_1_0_1_3 - 0.0591053391053411*G0_1_0_1_4 - 0.0689562289562314*G0_1_0_1_5 + 0.0172390572390578*G0_1_0_2_0 + 0.0172390572390578*G0_1_0_2_1 - 0.00985088985089008*G0_1_0_2_2 - 0.0394035594035607*G0_1_0_2_3 - 0.0394035594035607*G0_1_0_2_4 - 0.059105339105341*G0_1_0_3_0 - 0.0886580086580115*G0_1_0_3_1 - 0.0394035594035607*G0_1_0_3_2 + 0.157614237614243*G0_1_0_3_3 + 0.236421356421364*G0_1_0_3_4 + 0.118210678210682*G0_1_0_3_5 - 0.0886580086580114*G0_1_0_4_0 - 0.0591053391053411*G0_1_0_4_1 - 0.0394035594035607*G0_1_0_4_2 + 0.236421356421364*G0_1_0_4_3 + 0.157614237614243*G0_1_0_4_4 + 0.118210678210682*G0_1_0_4_5 - 0.068956228956231*G0_1_0_5_0 - 0.0689562289562314*G0_1_0_5_1 + 0.118210678210682*G0_1_0_5_3 + 0.118210678210682*G0_1_0_5_4 - 0.315228475228486*G0_1_0_5_5; + A[194] = A[222] + 0.0246272246272259*G0_0_1_0_0 - 0.0172390572390579*G0_0_1_0_1 - 0.0344781144781156*G0_0_1_0_2 + 0.0591053391053409*G0_0_1_0_3 + 0.0689562289562313*G0_0_1_0_4 + 0.0886580086580119*G0_0_1_0_5 - 0.0172390572390579*G0_0_1_1_0 + 0.00985088985089027*G0_0_1_1_1 - 0.0172390572390578*G0_0_1_1_2 + 0.0394035594035607*G0_0_1_1_3 + 0.0394035594035606*G0_0_1_1_5 - 0.0344781144781156*G0_0_1_2_0 - 0.0172390572390578*G0_0_1_2_1 + 0.0246272246272256*G0_0_1_2_2 + 0.0886580086580116*G0_0_1_2_3 + 0.0689562289562313*G0_0_1_2_4 + 0.059105339105341*G0_0_1_2_5 + 0.0591053391053409*G0_0_1_3_0 + 0.0394035594035607*G0_0_1_3_1 + 0.0886580086580116*G0_0_1_3_2 - 0.157614237614241*G0_0_1_3_3 - 0.118210678210682*G0_0_1_3_4 - 0.236421356421364*G0_0_1_3_5 + 0.0689562289562313*G0_0_1_4_0 + 0.0689562289562313*G0_0_1_4_2 - 0.118210678210682*G0_0_1_4_3 + 0.315228475228485*G0_0_1_4_4 - 0.118210678210682*G0_0_1_4_5 + 0.0886580086580119*G0_0_1_5_0 + 0.0394035594035606*G0_0_1_5_1 + 0.059105339105341*G0_0_1_5_2 - 0.236421356421364*G0_0_1_5_3 - 0.118210678210682*G0_0_1_5_4 - 0.157614237614241*G0_0_1_5_5 - 0.0246272246272259*G0_1_0_0_0 + 0.0172390572390579*G0_1_0_0_1 + 0.0344781144781156*G0_1_0_0_2 - 0.0591053391053409*G0_1_0_0_3 - 0.0689562289562313*G0_1_0_0_4 - 0.0886580086580119*G0_1_0_0_5 + 0.0172390572390579*G0_1_0_1_0 - 0.00985088985089027*G0_1_0_1_1 + 0.0172390572390578*G0_1_0_1_2 - 0.0394035594035607*G0_1_0_1_3 - 0.0394035594035606*G0_1_0_1_5 + 0.0344781144781156*G0_1_0_2_0 + 0.0172390572390578*G0_1_0_2_1 - 0.0246272246272256*G0_1_0_2_2 - 0.0886580086580116*G0_1_0_2_3 - 0.0689562289562313*G0_1_0_2_4 - 0.059105339105341*G0_1_0_2_5 - 0.0591053391053409*G0_1_0_3_0 - 0.0394035594035607*G0_1_0_3_1 - 0.0886580086580116*G0_1_0_3_2 + 0.157614237614241*G0_1_0_3_3 + 0.118210678210682*G0_1_0_3_4 + 0.236421356421364*G0_1_0_3_5 - 0.0689562289562313*G0_1_0_4_0 - 0.0689562289562313*G0_1_0_4_2 + 0.118210678210682*G0_1_0_4_3 - 0.315228475228485*G0_1_0_4_4 + 0.118210678210682*G0_1_0_4_5 - 0.0886580086580119*G0_1_0_5_0 - 0.0394035594035606*G0_1_0_5_1 - 0.059105339105341*G0_1_0_5_2 + 0.236421356421364*G0_1_0_5_3 + 0.118210678210682*G0_1_0_5_4 + 0.157614237614241*G0_1_0_5_5; + A[210] = A[14] + 0.00274490941157618*G0_0_1_0_1 + 0.000436107102773789*G0_0_1_0_2 - 0.00318101651434995*G0_0_1_0_3 + 0.0128266794933466*G0_0_1_0_4 - 0.0128266794933466*G0_0_1_0_5 + 0.00274490941157618*G0_0_1_1_0 - 0.00210357543690884*G0_0_1_1_1 + 0.000461760461760485*G0_0_1_1_2 - 0.0014878948212282*G0_0_1_1_3 + 0.00128266794933467*G0_0_1_1_4 + 0.000436107102773789*G0_0_1_2_0 + 0.000461760461760486*G0_0_1_2_1 - 0.00107744107744118*G0_0_1_2_2 - 0.00354016354016369*G0_0_1_2_3 - 0.0132884399551071*G0_0_1_2_4 - 0.00189834856501529*G0_0_1_2_5 - 0.00318101651434995*G0_0_1_3_0 - 0.0014878948212282*G0_0_1_3_1 - 0.00354016354016369*G0_0_1_3_2 + 0.0123136123136127*G0_0_1_3_3 + 0.00379669713003057*G0_0_1_3_4 + 0.0101587301587305*G0_0_1_3_5 + 0.0128266794933466*G0_0_1_4_0 + 0.00128266794933467*G0_0_1_4_1 - 0.0132884399551071*G0_0_1_4_2 + 0.00379669713003057*G0_0_1_4_3 - 0.000205226871893515*G0_0_1_4_4 + 0.00123136123136124*G0_0_1_4_5 - 0.0128266794933466*G0_0_1_5_0 - 0.00189834856501529*G0_0_1_5_2 + 0.0101587301587305*G0_0_1_5_3 + 0.00123136123136124*G0_0_1_5_4 - 0.00225749559082914*G0_0_1_5_5 - 0.00274490941157618*G0_1_0_0_1 - 0.00043610710277379*G0_1_0_0_2 + 0.00318101651434995*G0_1_0_0_3 - 0.0128266794933466*G0_1_0_0_4 + 0.0128266794933466*G0_1_0_0_5 - 0.00274490941157618*G0_1_0_1_0 + 0.00210357543690884*G0_1_0_1_1 - 0.000461760461760486*G0_1_0_1_2 + 0.0014878948212282*G0_1_0_1_3 - 0.00128266794933467*G0_1_0_1_4 - 0.000436107102773789*G0_1_0_2_0 - 0.000461760461760487*G0_1_0_2_1 + 0.00107744107744118*G0_1_0_2_2 + 0.00354016354016369*G0_1_0_2_3 + 0.0132884399551071*G0_1_0_2_4 + 0.00189834856501529*G0_1_0_2_5 + 0.00318101651434995*G0_1_0_3_0 + 0.0014878948212282*G0_1_0_3_1 + 0.00354016354016369*G0_1_0_3_2 - 0.0123136123136127*G0_1_0_3_3 - 0.00379669713003056*G0_1_0_3_4 - 0.0101587301587305*G0_1_0_3_5 - 0.0128266794933466*G0_1_0_4_0 - 0.00128266794933467*G0_1_0_4_1 + 0.0132884399551071*G0_1_0_4_2 - 0.00379669713003056*G0_1_0_4_3 + 0.000205226871893519*G0_1_0_4_4 - 0.00123136123136124*G0_1_0_4_5 + 0.0128266794933466*G0_1_0_5_0 + 0.00189834856501529*G0_1_0_5_2 - 0.0101587301587305*G0_1_0_5_3 - 0.00123136123136124*G0_1_0_5_4 + 0.00225749559082915*G0_1_0_5_5; + A[17] = 1.76366843033591e-05*G0_0_1_0_0 + 0.0011974239752018*G0_0_1_0_1 + 0.00119742397520179*G0_0_1_0_2 + 0.00044145155256268*G0_0_1_0_3 + 0.00065416065416068*G0_0_1_0_4 + 0.000654160654160682*G0_0_1_0_5 + 0.0011974239752018*G0_0_1_1_0 - 0.0161696328363002*G0_0_1_1_1 + 0.000518678852012207*G0_0_1_1_2 - 0.000816631927743088*G0_0_1_1_3 + 3.95489284378198e-05*G0_0_1_1_4 - 0.00540430762653009*G0_0_1_1_5 + 0.00119742397520179*G0_0_1_2_0 + 0.000518678852012208*G0_0_1_2_1 - 0.0161696328363*G0_0_1_2_2 - 0.000816631927743068*G0_0_1_2_3 - 0.00540430762653003*G0_0_1_2_4 + 3.95489284378183e-05*G0_0_1_2_5 + 0.00044145155256268*G0_0_1_3_0 - 0.000816631927743088*G0_0_1_3_1 - 0.000816631927743068*G0_0_1_3_2 + 0.00216343327454445*G0_0_1_3_3 - 0.000962000962000996*G0_0_1_3_4 - 0.000962000962001002*G0_0_1_3_5 + 0.00065416065416068*G0_0_1_4_0 + 3.95489284378198e-05*G0_0_1_4_1 - 0.00540430762653003*G0_0_1_4_2 - 0.000962000962000996*G0_0_1_4_3 - 0.0034461012238791*G0_0_1_4_4 - 0.000158195713751276*G0_0_1_4_5 + 0.000654160654160682*G0_0_1_5_0 - 0.00540430762653009*G0_0_1_5_1 + 3.95489284378182e-05*G0_0_1_5_2 - 0.000962000962001002*G0_0_1_5_3 - 0.000158195713751276*G0_0_1_5_4 - 0.00344610122387915*G0_0_1_5_5; + A[2] = -A[17] + 0.0161872695206034*G0_0_1_0_0 + 0.000678745123189588*G0_0_1_0_2 + 0.000401902624124859*G0_0_1_0_3 + 0.00147079258190375*G0_0_1_0_4 + 0.00605846828069073*G0_0_1_0_5 - 0.0161872695206036*G0_0_1_1_1 - 0.000678745123189584*G0_0_1_1_2 - 0.00147079258190376*G0_0_1_1_3 - 0.000401902624124858*G0_0_1_1_4 - 0.00605846828069076*G0_0_1_1_5 + 0.000678745123189588*G0_0_1_2_0 - 0.000678745123189583*G0_0_1_2_1 + 0.00458767569878696*G0_0_1_2_3 - 0.00458767569878696*G0_0_1_2_4 + 0.000401902624124859*G0_0_1_3_0 - 0.00147079258190376*G0_0_1_3_1 + 0.00458767569878696*G0_0_1_3_2 + 0.00560953449842359*G0_0_1_3_3 - 0.000803805248249722*G0_0_1_3_5 + 0.00147079258190375*G0_0_1_4_0 - 0.000401902624124858*G0_0_1_4_1 - 0.00458767569878696*G0_0_1_4_2 - 0.00560953449842356*G0_0_1_4_4 + 0.000803805248249721*G0_0_1_4_5 + 0.00605846828069073*G0_0_1_5_0 - 0.00605846828069076*G0_0_1_5_1 - 0.000803805248249722*G0_0_1_5_3 + 0.000803805248249721*G0_0_1_5_4 + 0.0161696328363001*G0_1_1_0_0 - 0.00119742397520179*G0_1_1_0_1 - 0.00051867885201221*G0_1_1_0_2 + 0.000816631927743073*G0_1_1_0_4 + 0.00540430762653005*G0_1_1_0_5 - 0.00119742397520179*G0_1_1_1_0 - 0.0011974239752018*G0_1_1_1_2 - 0.000654160654160681*G0_1_1_1_3 - 0.00044145155256268*G0_1_1_1_4 - 0.000654160654160685*G0_1_1_1_5 - 0.00051867885201221*G0_1_1_2_0 - 0.0011974239752018*G0_1_1_2_1 + 0.0161696328363002*G0_1_1_2_2 + 0.00540430762653006*G0_1_1_2_3 + 0.000816631927743091*G0_1_1_2_4 - 0.000654160654160681*G0_1_1_3_1 + 0.00540430762653006*G0_1_1_3_2 + 0.00344610122387915*G0_1_1_3_3 + 0.000962000962001004*G0_1_1_3_4 + 0.00015819571375128*G0_1_1_3_5 + 0.000816631927743073*G0_1_1_4_0 - 0.00044145155256268*G0_1_1_4_1 + 0.000816631927743091*G0_1_1_4_2 + 0.000962000962001004*G0_1_1_4_3 - 0.00216343327454444*G0_1_1_4_4 + 0.000962000962000999*G0_1_1_4_5 + 0.00540430762653005*G0_1_1_5_0 - 0.000654160654160685*G0_1_1_5_1 + 0.00015819571375128*G0_1_1_5_3 + 0.000962000962000999*G0_1_1_5_4 + 0.00344610122387911*G0_1_1_5_5; + A[134] = -A[89] + 0.001231361231361*G0_1_0_0_0 - 0.0123136123136128*G0_1_0_0_2 + 0.0238063171396511*G0_1_0_0_3 - 0.0730607663941024*G0_1_0_0_4 - 0.00738816738816785*G0_1_0_0_5 - 0.00123136123136113*G0_1_0_1_1 + 0.0123136123136127*G0_1_0_1_2 + 0.0730607663941023*G0_1_0_1_3 - 0.0238063171396513*G0_1_0_1_4 + 0.00738816738816773*G0_1_0_1_5 - 0.0123136123136128*G0_1_0_2_0 + 0.0123136123136127*G0_1_0_2_1 - 0.098508898508902*G0_1_0_2_3 + 0.0985088985089023*G0_1_0_2_4 + 0.0238063171396511*G0_1_0_3_0 + 0.0730607663941023*G0_1_0_3_1 - 0.0985088985089019*G0_1_0_3_2 - 0.67314413981083*G0_1_0_3_3 - 0.0476126342793026*G0_1_0_3_5 - 0.0730607663941024*G0_1_0_4_0 - 0.0238063171396513*G0_1_0_4_1 + 0.0985088985089023*G0_1_0_4_2 + 0.673144139810831*G0_1_0_4_4 + 0.0476126342793027*G0_1_0_4_5 - 0.00738816738816784*G0_1_0_5_0 + 0.00738816738816773*G0_1_0_5_1 - 0.0476126342793026*G0_1_0_5_3 + 0.0476126342793027*G0_1_0_5_4 - 0.061568061568064*G0_1_1_0_0 + 0.0186756453423127*G0_1_1_0_1 + 0.0080038480038483*G0_1_1_0_2 + 0.0492544492544508*G0_1_1_0_3 - 0.00656725990059352*G0_1_1_0_4 - 0.0213435946769291*G0_1_1_0_5 + 0.0186756453423127*G0_1_1_1_0 - 0.0627994227994252*G0_1_1_1_1 + 0.020317460317461*G0_1_1_1_2 + 0.0664935064935087*G0_1_1_1_3 + 0.0254481321147996*G0_1_1_1_4 - 0.0139554272887613*G0_1_1_1_5 + 0.0080038480038483*G0_1_1_2_0 + 0.020317460317461*G0_1_1_2_1 + 0.00820907487574171*G0_1_1_2_2 - 0.0985088985089021*G0_1_1_2_3 + 0.0394035594035607*G0_1_1_2_5 + 0.0492544492544508*G0_1_1_3_0 + 0.0664935064935087*G0_1_1_3_1 - 0.0985088985089021*G0_1_1_3_2 - 0.728965848965874*G0_1_1_3_3 - 0.149405162738501*G0_1_1_3_4 - 0.177316017316023*G0_1_1_3_5 - 0.00656725990059352*G0_1_1_4_0 + 0.0254481321147996*G0_1_1_4_1 - 0.149405162738501*G0_1_1_4_3 - 0.0558217091550445*G0_1_1_4_4 - 0.129703383036721*G0_1_1_4_5 - 0.0213435946769291*G0_1_1_5_0 - 0.0139554272887613*G0_1_1_5_1 + 0.0394035594035607*G0_1_1_5_2 - 0.177316017316023*G0_1_1_5_3 - 0.129703383036721*G0_1_1_5_4 - 0.663293249959939*G0_1_1_5_5; + A[186] = A[134] - 0.220003206669881*G0_0_0_0_0 + 0.0172390572390578*G0_0_0_0_1 + 0.031194484527819*G0_0_0_0_2 + 0.0131345198011869*G0_0_0_0_3 - 0.320153920153931*G0_0_0_0_4 - 0.063209876543212*G0_0_0_0_5 + 0.0172390572390578*G0_0_0_1_0 - 0.0238063171396514*G0_0_0_1_1 + 0.0287317620650966*G0_0_0_1_2 + 0.067314413981083*G0_0_0_1_3 + 0.0525380792047477*G0_0_0_1_4 + 0.0205226871893545*G0_0_0_1_5 + 0.031194484527819*G0_0_0_2_0 + 0.0287317620650965*G0_0_0_2_1 - 0.0566426166426201*G0_0_0_2_2 - 0.169106942440282*G0_0_0_2_3 + 0.247914061247403*G0_0_0_2_4 + 0.0262690396023738*G0_0_0_2_5 + 0.0131345198011869*G0_0_0_3_0 + 0.067314413981083*G0_0_0_3_1 - 0.169106942440282*G0_0_0_3_2 - 0.6041879108546*G0_0_0_3_3 - 0.131345198011869*G0_0_0_3_4 - 0.0788071188071217*G0_0_0_3_5 - 0.320153920153931*G0_0_0_4_0 + 0.0525380792047477*G0_0_0_4_1 + 0.247914061247403*G0_0_0_4_2 - 0.131345198011869*G0_0_0_4_3 - 0.630456950456972*G0_0_0_4_4 - 0.157614237614243*G0_0_0_4_5 - 0.063209876543212*G0_0_0_5_0 + 0.0205226871893545*G0_0_0_5_1 + 0.0262690396023738*G0_0_0_5_2 - 0.0788071188071217*G0_0_0_5_3 - 0.157614237614243*G0_0_0_5_4 - 0.0722398589065282*G0_0_0_5_5 + 0.0952252685586049*G0_0_1_0_0 - 0.0110822510822514*G0_0_1_0_1 + 0.0311944845278189*G0_0_1_0_2 + 0.0451499118165799*G0_0_1_0_3 - 0.0242167708834386*G0_0_1_0_4 + 0.0307840307840318*G0_0_1_0_5 - 0.0110822510822514*G0_0_1_1_0 - 0.0238063171396513*G0_0_1_1_1 + 0.0570530703864057*G0_0_1_1_2 + 0.0800384800384829*G0_0_1_1_3 + 0.0525380792047477*G0_0_1_1_4 + 0.0077986211319548*G0_0_1_1_5 + 0.0311944845278189*G0_0_1_2_0 + 0.0570530703864057*G0_0_1_2_1 - 0.371871091871105*G0_0_1_2_2 - 0.263100849767526*G0_0_1_2_3 - 0.0480230880230897*G0_0_1_2_4 - 0.00574635241301935*G0_0_1_2_5 + 0.0451499118165799*G0_0_1_3_0 + 0.0800384800384829*G0_0_1_3_1 - 0.263100849767526*G0_0_1_3_2 - 0.65344236010905*G0_0_1_3_3 - 0.195375982042655*G0_0_1_3_4 - 0.0788071188071216*G0_0_1_3_5 - 0.0242167708834386*G0_0_1_4_0 + 0.0525380792047477*G0_0_1_4_1 - 0.0480230880230897*G0_0_1_4_2 - 0.195375982042655*G0_0_1_4_3 - 0.630456950456972*G0_0_1_4_4 - 0.0935834535834568*G0_0_1_4_5 + 0.0307840307840318*G0_0_1_5_0 + 0.0077986211319548*G0_0_1_5_1 - 0.00574635241301935*G0_0_1_5_2 - 0.0788071188071216*G0_0_1_5_3 - 0.0935834535834568*G0_0_1_5_4 - 0.0229854096520769*G0_0_1_5_5 - 0.0944043610710305*G0_1_0_0_0 + 0.00697771364438051*G0_1_0_0_1 + 0.031194484527819*G0_1_0_0_2 + 0.0320153920153931*G0_1_0_0_3 + 0.0348885682219029*G0_1_0_0_4 - 0.0513067179733861*G0_1_0_0_5 + 0.00697771364438051*G0_1_0_1_0 - 0.0238063171396514*G0_1_0_1_1 + 0.0389931056597738*G0_1_0_1_2 + 0.0570530703864057*G0_1_0_1_3 + 0.0525380792047477*G0_1_0_1_4 + 0.0307840307840317*G0_1_0_1_5 + 0.031194484527819*G0_1_0_2_0 + 0.0389931056597738*G0_1_0_2_1 - 0.18224146224147*G0_1_0_2_2 - 0.181010101010108*G0_1_0_2_3 - 0.107128427128431*G0_1_0_2_4 + 0.00738816738816754*G0_1_0_2_5 + 0.0320153920153931*G0_1_0_3_0 + 0.0570530703864057*G0_1_0_3_1 - 0.181010101010108*G0_1_0_3_2 - 0.508962642295995*G0_1_0_3_3 - 0.169106942440282*G0_1_0_3_4 - 0.0788071188071216*G0_1_0_3_5 + 0.0348885682219029*G0_1_0_4_0 + 0.0525380792047477*G0_1_0_4_1 - 0.107128427128431*G0_1_0_4_2 - 0.169106942440282*G0_1_0_4_3 - 0.630456950456973*G0_1_0_4_4 - 0.119852493185831*G0_1_0_4_5 - 0.0513067179733861*G0_1_0_5_0 + 0.0307840307840317*G0_1_0_5_1 + 0.00738816738816754*G0_1_0_5_2 - 0.0788071188071216*G0_1_0_5_3 - 0.119852493185831*G0_1_0_5_4 - 0.167465127465133*G0_1_0_5_5 + 0.277466730800074*G0_1_1_0_0 - 0.0500753567420252*G0_1_1_0_1 + 0.0377617444284123*G0_1_1_0_3 + 0.0829116562449924*G0_1_1_0_4 + 0.21179413179414*G0_1_1_0_5 - 0.0500753567420252*G0_1_1_1_0 + 0.0500753567420252*G0_1_1_1_2 + 0.049254449254451*G0_1_1_1_3 - 0.049254449254451*G0_1_1_1_5 + 0.0500753567420252*G0_1_1_2_1 - 0.277466730800074*G0_1_1_2_2 - 0.211794131794139*G0_1_1_2_3 - 0.0829116562449924*G0_1_1_2_4 - 0.0377617444284125*G0_1_1_2_5 + 0.0377617444284123*G0_1_1_3_0 + 0.049254449254451*G0_1_1_3_1 - 0.211794131794139*G0_1_1_3_2 - 0.485977232643917*G0_1_1_3_3 - 0.0755234888568249*G0_1_1_3_4 + 0.0829116562449924*G0_1_1_4_0 - 0.0829116562449924*G0_1_1_4_2 - 0.0755234888568249*G0_1_1_4_3 + 0.0755234888568247*G0_1_1_4_5 + 0.21179413179414*G0_1_1_5_0 - 0.049254449254451*G0_1_1_5_1 - 0.0377617444284125*G0_1_1_5_2 + 0.0755234888568247*G0_1_1_5_4 + 0.485977232643917*G0_1_1_5_5; + A[218] = A[134] - 0.00328362995029698*G0_0_1_0_0 + 0.000615680615680661*G0_0_1_0_1 + 0.00636203302869982*G0_0_1_0_2 + 0.0106717973384643*G0_0_1_0_3 - 0.048843995510664*G0_0_1_0_4 - 0.00615680615680653*G0_0_1_0_5 + 0.000615680615680661*G0_0_1_1_0 - 0.00451499118165792*G0_0_1_1_1 + 0.0186756453423126*G0_0_1_1_2 + 0.0242167708834383*G0_0_1_1_3 - 0.0131345198011869*G0_0_1_1_4 + 0.00123136123136136*G0_0_1_1_5 + 0.00636203302869982*G0_0_1_2_0 + 0.0186756453423126*G0_0_1_2_1 - 0.192913259579932*G0_0_1_2_2 - 0.0882475549142242*G0_0_1_2_3 + 0.0102613435946777*G0_0_1_2_4 - 0.00246272246272255*G0_0_1_2_5 + 0.0106717973384643*G0_0_1_3_0 + 0.0242167708834383*G0_0_1_3_1 - 0.0882475549142243*G0_0_1_3_2 - 0.160897867564539*G0_0_1_3_3 + 0.00492544492544524*G0_0_1_3_4 - 0.0164181497514836*G0_0_1_3_5 - 0.048843995510664*G0_0_1_4_0 - 0.0131345198011869*G0_0_1_4_1 + 0.0102613435946777*G0_0_1_4_2 + 0.00492544492544524*G0_0_1_4_3 + 0.512246272246291*G0_0_1_4_4 + 0.031194484527819*G0_0_1_4_5 - 0.00615680615680653*G0_0_1_5_0 + 0.00123136123136137*G0_0_1_5_1 - 0.00246272246272255*G0_0_1_5_2 - 0.0164181497514836*G0_0_1_5_3 + 0.031194484527819*G0_0_1_5_4 - 0.0164181497514836*G0_0_1_5_5 + 0.00328362995029698*G0_1_0_0_0 - 0.000615680615680661*G0_1_0_0_1 - 0.00636203302869982*G0_1_0_0_2 - 0.0106717973384643*G0_1_0_0_3 + 0.048843995510664*G0_1_0_0_4 + 0.00615680615680653*G0_1_0_0_5 - 0.00061568061568066*G0_1_0_1_0 + 0.00451499118165792*G0_1_0_1_1 - 0.0186756453423126*G0_1_0_1_2 - 0.0242167708834383*G0_1_0_1_3 + 0.0131345198011869*G0_1_0_1_4 - 0.00123136123136137*G0_1_0_1_5 - 0.00636203302869982*G0_1_0_2_0 - 0.0186756453423126*G0_1_0_2_1 + 0.192913259579932*G0_1_0_2_2 + 0.0882475549142243*G0_1_0_2_3 - 0.0102613435946777*G0_1_0_2_4 + 0.00246272246272255*G0_1_0_2_5 - 0.0106717973384643*G0_1_0_3_0 - 0.0242167708834383*G0_1_0_3_1 + 0.0882475549142243*G0_1_0_3_2 + 0.160897867564539*G0_1_0_3_3 - 0.00492544492544522*G0_1_0_3_4 + 0.0164181497514836*G0_1_0_3_5 + 0.048843995510664*G0_1_0_4_0 + 0.0131345198011869*G0_1_0_4_1 - 0.0102613435946777*G0_1_0_4_2 - 0.00492544492544524*G0_1_0_4_3 - 0.512246272246291*G0_1_0_4_4 - 0.0311944845278189*G0_1_0_4_5 + 0.00615680615680653*G0_1_0_5_0 - 0.00123136123136137*G0_1_0_5_1 + 0.00246272246272255*G0_1_0_5_2 + 0.0164181497514836*G0_1_0_5_3 - 0.0311944845278189*G0_1_0_5_4 + 0.0164181497514836*G0_1_0_5_5; + A[215] = -A[218] + 0.00123136123136101*G0_0_1_0_0 - 0.0123136123136128*G0_0_1_0_2 + 0.0238063171396511*G0_0_1_0_3 - 0.0730607663941024*G0_0_1_0_4 - 0.00738816738816784*G0_0_1_0_5 - 0.00123136123136113*G0_0_1_1_1 + 0.0123136123136127*G0_0_1_1_2 + 0.0730607663941023*G0_0_1_1_3 - 0.0238063171396513*G0_0_1_1_4 + 0.00738816738816773*G0_0_1_1_5 - 0.0123136123136128*G0_0_1_2_0 + 0.0123136123136127*G0_0_1_2_1 - 0.0985088985089019*G0_0_1_2_3 + 0.0985088985089023*G0_0_1_2_4 + 0.0238063171396511*G0_0_1_3_0 + 0.0730607663941023*G0_0_1_3_1 - 0.0985088985089019*G0_0_1_3_2 - 0.67314413981083*G0_0_1_3_3 - 0.0476126342793026*G0_0_1_3_5 - 0.0730607663941024*G0_0_1_4_0 - 0.0238063171396513*G0_0_1_4_1 + 0.0985088985089023*G0_0_1_4_2 + 0.673144139810831*G0_0_1_4_4 + 0.0476126342793027*G0_0_1_4_5 - 0.00738816738816784*G0_0_1_5_0 + 0.00738816738816773*G0_0_1_5_1 - 0.0476126342793026*G0_0_1_5_3 + 0.0476126342793027*G0_0_1_5_4 - 0.061568061568064*G0_1_1_0_0 + 0.0186756453423127*G0_1_1_0_1 + 0.0080038480038483*G0_1_1_0_2 + 0.0492544492544508*G0_1_1_0_3 - 0.00656725990059352*G0_1_1_0_4 - 0.0213435946769291*G0_1_1_0_5 + 0.0186756453423127*G0_1_1_1_0 - 0.0627994227994252*G0_1_1_1_1 + 0.020317460317461*G0_1_1_1_2 + 0.0664935064935087*G0_1_1_1_3 + 0.0254481321147996*G0_1_1_1_4 - 0.0139554272887613*G0_1_1_1_5 + 0.0080038480038483*G0_1_1_2_0 + 0.020317460317461*G0_1_1_2_1 + 0.00820907487574174*G0_1_1_2_2 - 0.0985088985089021*G0_1_1_2_3 + 0.0394035594035607*G0_1_1_2_5 + 0.0492544492544508*G0_1_1_3_0 + 0.0664935064935087*G0_1_1_3_1 - 0.0985088985089021*G0_1_1_3_2 - 0.728965848965874*G0_1_1_3_3 - 0.149405162738501*G0_1_1_3_4 - 0.177316017316023*G0_1_1_3_5 - 0.00656725990059352*G0_1_1_4_0 + 0.0254481321147996*G0_1_1_4_1 - 0.149405162738501*G0_1_1_4_3 - 0.0558217091550445*G0_1_1_4_4 - 0.129703383036721*G0_1_1_4_5 - 0.0213435946769291*G0_1_1_5_0 - 0.0139554272887613*G0_1_1_5_1 + 0.0394035594035607*G0_1_1_5_2 - 0.177316017316023*G0_1_1_5_3 - 0.129703383036721*G0_1_1_5_4 - 0.663293249959939*G0_1_1_5_5; + A[69] = A[139] - 0.003796697130031*G0_0_1_0_0 - 0.00230880230880236*G0_0_1_0_1 - 0.000820907487574159*G0_0_1_0_2 + 0.0033862433862435*G0_0_1_0_3 + 0.000820907487574169*G0_0_1_0_4 - 0.00123136123136149*G0_0_1_0_5 - 0.00230880230880236*G0_0_1_1_0 - 0.0395061728395076*G0_0_1_1_1 - 0.00251402918069593*G0_0_1_1_2 + 0.0362225428892109*G0_0_1_1_3 - 0.00112874779541447*G0_0_1_1_4 + 0.0126214526214532*G0_0_1_1_5 - 0.000820907487574159*G0_0_1_2_0 - 0.00251402918069593*G0_0_1_2_1 - 0.00164181497514854*G0_0_1_2_2 - 0.0227801827801837*G0_0_1_2_3 + 0.00133397466730798*G0_0_1_2_4 + 0.00215488215488223*G0_0_1_2_5 + 0.0033862433862435*G0_0_1_3_0 + 0.0362225428892109*G0_0_1_3_1 - 0.0227801827801837*G0_0_1_3_2 + 0.0213435946769285*G0_0_1_3_3 - 0.00451499118165805*G0_0_1_3_4 - 0.0110822510822515*G0_0_1_3_5 + 0.00082090748757417*G0_0_1_4_0 - 0.00112874779541447*G0_0_1_4_1 + 0.00133397466730798*G0_0_1_4_2 - 0.00451499118165805*G0_0_1_4_3 + 0.00328362995029671*G0_0_1_4_4 - 0.00205226871893551*G0_0_1_4_5 - 0.00123136123136149*G0_0_1_5_0 + 0.0126214526214532*G0_0_1_5_1 + 0.00215488215488223*G0_0_1_5_2 - 0.0110822510822515*G0_0_1_5_3 - 0.00205226871893551*G0_0_1_5_4 + 0.00410453743787075*G0_0_1_5_5 + 0.003796697130031*G0_1_0_0_0 + 0.00230880230880236*G0_1_0_0_1 + 0.000820907487574159*G0_1_0_0_2 - 0.0033862433862435*G0_1_0_0_3 - 0.000820907487574168*G0_1_0_0_4 + 0.00123136123136149*G0_1_0_0_5 + 0.00230880230880236*G0_1_0_1_0 + 0.0395061728395077*G0_1_0_1_1 + 0.00251402918069593*G0_1_0_1_2 - 0.0362225428892109*G0_1_0_1_3 + 0.00112874779541447*G0_1_0_1_4 - 0.0126214526214532*G0_1_0_1_5 + 0.000820907487574159*G0_1_0_2_0 + 0.00251402918069593*G0_1_0_2_1 + 0.00164181497514854*G0_1_0_2_2 + 0.0227801827801837*G0_1_0_2_3 - 0.00133397466730798*G0_1_0_2_4 - 0.00215488215488223*G0_1_0_2_5 - 0.0033862433862435*G0_1_0_3_0 - 0.0362225428892109*G0_1_0_3_1 + 0.0227801827801837*G0_1_0_3_2 - 0.0213435946769285*G0_1_0_3_3 + 0.00451499118165805*G0_1_0_3_4 + 0.0110822510822515*G0_1_0_3_5 - 0.000820907487574169*G0_1_0_4_0 + 0.00112874779541448*G0_1_0_4_1 - 0.00133397466730798*G0_1_0_4_2 + 0.00451499118165805*G0_1_0_4_3 - 0.00328362995029672*G0_1_0_4_4 + 0.00205226871893551*G0_1_0_4_5 + 0.00123136123136149*G0_1_0_5_0 - 0.0126214526214532*G0_1_0_5_1 - 0.00215488215488223*G0_1_0_5_2 + 0.0110822510822515*G0_1_0_5_3 + 0.00205226871893551*G0_1_0_5_4 - 0.00410453743787076*G0_1_0_5_5; + A[94] = A[69] - 0.0100561167227839*G0_0_0_0_0 - 0.000513067179733854*G0_0_0_0_1 + 0.00292448292448305*G0_0_0_0_2 + 0.00194965528298871*G0_0_0_0_3 + 0.00348885682219031*G0_0_0_0_4 - 0.00513067179733864*G0_0_0_0_5 - 0.000513067179733855*G0_0_0_1_0 - 0.0142632675966014*G0_0_0_1_1 + 0.00282186948853631*G0_0_0_1_2 + 0.00800384800384834*G0_0_0_1_3 + 0.00133397466730806*G0_0_0_1_4 + 0.00543851210517891*G0_0_0_1_5 + 0.00292448292448305*G0_0_0_2_0 + 0.00282186948853631*G0_0_0_2_1 + 0.0712137245470595*G0_0_0_2_2 - 0.0173416706750048*G0_0_0_2_3 - 0.0138528138528145*G0_0_0_2_4 - 0.00174442841109514*G0_0_0_2_5 + 0.00194965528298871*G0_0_0_3_0 + 0.00800384800384834*G0_0_0_3_1 - 0.0173416706750048*G0_0_0_3_2 - 0.0849639249639286*G0_0_0_3_3 - 0.00656725990059357*G0_0_0_3_4 - 0.000410453743787157*G0_0_0_3_5 + 0.00348885682219031*G0_0_0_4_0 + 0.00133397466730806*G0_0_0_4_1 - 0.0138528138528145*G0_0_0_4_2 - 0.00656725990059357*G0_0_0_4_3 - 0.00779862113195491*G0_0_0_4_4 + 0.000820907487574171*G0_0_0_4_5 - 0.00513067179733864*G0_0_0_5_0 + 0.00543851210517891*G0_0_0_5_1 - 0.00174442841109514*G0_0_0_5_2 - 0.000410453743787155*G0_0_0_5_3 + 0.000820907487574171*G0_0_0_5_4 - 0.00123136123136113*G0_0_0_5_5 - 0.00041045374378709*G0_0_1_0_1 + 0.000410453743787065*G0_0_1_0_2 + 0.00595157928491295*G0_0_1_0_4 - 0.00595157928491261*G0_0_1_0_5 - 0.000410453743787091*G0_0_1_1_0 - 0.0186756453423127*G0_0_1_1_1 - 0.0223697290363966*G0_0_1_1_3 + 0.00205226871893541*G0_0_1_1_4 + 0.00554112554112548*G0_0_1_1_5 + 0.000410453743787065*G0_0_1_2_0 + 0.0186756453423126*G0_0_1_2_2 + 0.0223697290363965*G0_0_1_2_3 - 0.00554112554112577*G0_0_1_2_4 - 0.00205226871893546*G0_0_1_2_5 - 0.0223697290363966*G0_0_1_3_1 + 0.0223697290363965*G0_0_1_3_2 - 0.0041045374378709*G0_0_1_3_4 + 0.00410453743787086*G0_0_1_3_5 + 0.00595157928491294*G0_0_1_4_0 + 0.00205226871893542*G0_0_1_4_1 - 0.00554112554112578*G0_0_1_4_2 - 0.0041045374378709*G0_0_1_4_3 + 0.00164181497514879*G0_0_1_4_4 - 0.00595157928491261*G0_0_1_5_0 + 0.00554112554112548*G0_0_1_5_1 - 0.00205226871893546*G0_0_1_5_2 + 0.00410453743787086*G0_0_1_5_3 - 0.00164181497514825*G0_0_1_5_5 - 0.00189834856501533*G0_1_0_0_1 + 0.00189834856501529*G0_1_0_0_2 + 0.00800384800384832*G0_1_0_0_4 - 0.00800384800384818*G0_1_0_0_5 - 0.00189834856501533*G0_1_0_1_0 - 0.0565400032066719*G0_1_0_1_1 + 0.036632996632998*G0_1_0_1_3 - 0.00123136123136126*G0_1_0_1_4 + 0.0168286034952707*G0_1_0_1_5 + 0.00189834856501529*G0_1_0_2_0 + 0.0565400032066713*G0_1_0_2_2 - 0.0366329966329981*G0_1_0_2_3 - 0.0168286034952708*G0_1_0_2_4 + 0.00123136123136127*G0_1_0_2_5 + 0.036632996632998*G0_1_0_3_1 - 0.0366329966329981*G0_1_0_3_2 + 0.0024627224627225*G0_1_0_3_4 - 0.00246272246272254*G0_1_0_3_5 + 0.00800384800384832*G0_1_0_4_0 - 0.00123136123136126*G0_1_0_4_1 - 0.0168286034952708*G0_1_0_4_2 + 0.0024627224627225*G0_1_0_4_3 + 0.000820907487574095*G0_1_0_4_4 - 0.00800384800384818*G0_1_0_5_0 + 0.0168286034952707*G0_1_0_5_1 + 0.00123136123136127*G0_1_0_5_2 - 0.00246272246272254*G0_1_0_5_3 - 0.000820907487573849*G0_1_0_5_5 + 0.0100561167227842*G0_1_1_0_0 - 0.00292448292448307*G0_1_1_0_1 + 0.000513067179733849*G0_1_1_0_2 - 0.00194965528298869*G0_1_1_0_3 + 0.00513067179733875*G0_1_1_0_4 - 0.00348885682219002*G0_1_1_0_5 - 0.00292448292448307*G0_1_1_1_0 - 0.0712137245470604*G0_1_1_1_1 - 0.00282186948853624*G0_1_1_1_2 + 0.0173416706750047*G0_1_1_1_3 + 0.00174442841109513*G0_1_1_1_4 + 0.0138528138528142*G0_1_1_1_5 + 0.00051306717973385*G0_1_1_2_0 - 0.00282186948853624*G0_1_1_2_1 + 0.0142632675966013*G0_1_1_2_2 - 0.00800384800384841*G0_1_1_2_3 - 0.00543851210517902*G0_1_1_2_4 - 0.00133397466730808*G0_1_1_2_5 - 0.00194965528298869*G0_1_1_3_0 + 0.0173416706750047*G0_1_1_3_1 - 0.00800384800384842*G0_1_1_3_2 + 0.0849639249639285*G0_1_1_3_3 + 0.000410453743787137*G0_1_1_3_4 + 0.00656725990059356*G0_1_1_3_5 + 0.00513067179733875*G0_1_1_4_0 + 0.00174442841109513*G0_1_1_4_1 - 0.00543851210517902*G0_1_1_4_2 + 0.000410453743787137*G0_1_1_4_3 + 0.00123136123136151*G0_1_1_4_4 - 0.000820907487574109*G0_1_1_4_5 - 0.00348885682219002*G0_1_1_5_0 + 0.0138528138528142*G0_1_1_5_1 - 0.00133397466730807*G0_1_1_5_2 + 0.00656725990059356*G0_1_1_5_3 - 0.000820907487574112*G0_1_1_5_4 + 0.00779862113195503*G0_1_1_5_5; + A[66] = A[94] + 0.0037966971300309*G0_0_1_0_0 + 0.000820907487574129*G0_0_1_0_1 + 0.00230880230880239*G0_0_1_0_2 - 0.00338624338624354*G0_0_1_0_3 + 0.00123136123136121*G0_0_1_0_4 - 0.00082090748757408*G0_0_1_0_5 + 0.000820907487574129*G0_0_1_1_0 + 0.00164181497514855*G0_0_1_1_1 + 0.00251402918069592*G0_0_1_1_2 + 0.0227801827801837*G0_0_1_1_3 - 0.0021548821548822*G0_0_1_1_4 - 0.00133397466730792*G0_0_1_1_5 + 0.00230880230880239*G0_0_1_2_0 + 0.00251402918069592*G0_0_1_2_1 + 0.0395061728395072*G0_0_1_2_2 - 0.0362225428892109*G0_0_1_2_3 - 0.012621452621453*G0_0_1_2_4 + 0.0011287477954145*G0_0_1_2_5 - 0.00338624338624354*G0_0_1_3_0 + 0.0227801827801837*G0_0_1_3_1 - 0.0362225428892109*G0_0_1_3_2 - 0.0213435946769281*G0_0_1_3_3 + 0.0110822510822515*G0_0_1_3_4 + 0.00451499118165806*G0_0_1_3_5 + 0.00123136123136121*G0_0_1_4_0 - 0.0021548821548822*G0_0_1_4_1 - 0.012621452621453*G0_0_1_4_2 + 0.0110822510822514*G0_0_1_4_3 - 0.00410453743787141*G0_0_1_4_4 + 0.00205226871893541*G0_0_1_4_5 - 0.000820907487574081*G0_0_1_5_0 - 0.00133397466730792*G0_0_1_5_1 + 0.0011287477954145*G0_0_1_5_2 + 0.00451499118165806*G0_0_1_5_3 + 0.00205226871893541*G0_0_1_5_4 - 0.00328362995029636*G0_0_1_5_5 - 0.0037966971300309*G0_1_0_0_0 - 0.000820907487574129*G0_1_0_0_1 - 0.00230880230880239*G0_1_0_0_2 + 0.00338624338624353*G0_1_0_0_3 - 0.00123136123136121*G0_1_0_0_4 + 0.000820907487574081*G0_1_0_0_5 - 0.000820907487574129*G0_1_0_1_0 - 0.00164181497514855*G0_1_0_1_1 - 0.00251402918069592*G0_1_0_1_2 - 0.0227801827801837*G0_1_0_1_3 + 0.0021548821548822*G0_1_0_1_4 + 0.00133397466730792*G0_1_0_1_5 - 0.00230880230880239*G0_1_0_2_0 - 0.00251402918069592*G0_1_0_2_1 - 0.0395061728395072*G0_1_0_2_2 + 0.0362225428892109*G0_1_0_2_3 + 0.012621452621453*G0_1_0_2_4 - 0.0011287477954145*G0_1_0_2_5 + 0.00338624338624354*G0_1_0_3_0 - 0.0227801827801837*G0_1_0_3_1 + 0.0362225428892109*G0_1_0_3_2 + 0.0213435946769281*G0_1_0_3_3 - 0.0110822510822515*G0_1_0_3_4 - 0.00451499118165806*G0_1_0_3_5 - 0.00123136123136121*G0_1_0_4_0 + 0.0021548821548822*G0_1_0_4_1 + 0.012621452621453*G0_1_0_4_2 - 0.0110822510822514*G0_1_0_4_3 + 0.00410453743787141*G0_1_0_4_4 - 0.00205226871893541*G0_1_0_4_5 + 0.000820907487574081*G0_1_0_5_0 + 0.00133397466730792*G0_1_0_5_1 - 0.0011287477954145*G0_1_0_5_2 - 0.00451499118165806*G0_1_0_5_3 - 0.00205226871893541*G0_1_0_5_4 + 0.00328362995029635*G0_1_0_5_5; + A[39] = -A[41] - 0.0231393298059973*G0_1_0_0_0 - 0.000726845171289644*G0_1_0_0_2 - 0.00104323659879218*G0_1_0_0_3 + 0.000735396290951841*G0_1_0_0_4 + 0.0047031158142271*G0_1_0_0_5 + 0.0231393298059975*G0_1_0_1_1 + 0.00072684517128963*G0_1_0_1_2 - 0.000735396290951857*G0_1_0_1_3 + 0.00104323659879218*G0_1_0_1_4 - 0.00470311581422708*G0_1_0_1_5 - 0.000726845171289643*G0_1_0_2_0 + 0.00072684517128963*G0_1_0_2_1 - 0.00321522099299884*G0_1_0_2_3 + 0.00321522099299891*G0_1_0_2_4 - 0.00104323659879218*G0_1_0_3_0 - 0.000735396290951856*G0_1_0_3_1 - 0.00321522099299884*G0_1_0_3_2 - 0.00499385388274302*G0_1_0_3_3 + 0.00208647319758435*G0_1_0_3_5 + 0.000735396290951841*G0_1_0_4_0 + 0.00104323659879218*G0_1_0_4_1 + 0.00321522099299891*G0_1_0_4_2 + 0.00499385388274291*G0_1_0_4_4 - 0.00208647319758437*G0_1_0_4_5 + 0.0047031158142271*G0_1_0_5_0 - 0.00470311581422708*G0_1_0_5_1 + 0.00208647319758434*G0_1_0_5_3 - 0.00208647319758437*G0_1_0_5_4 + 0.0153407086740426*G0_1_1_0_0 - 0.00539575650686783*G0_1_1_0_1 + 0.000735396290951858*G0_1_1_0_2 + 0.000530169419058325*G0_1_1_0_3 - 0.00066698733365401*G0_1_1_0_4 + 0.01287798621132*G0_1_1_0_5 - 0.00539575650686783*G0_1_1_1_0 + 0.0384800384800401*G0_1_1_1_1 + 0.0014622414622415*G0_1_1_1_2 - 0.00140238362460585*G0_1_1_1_3 + 0.0015734060178505*G0_1_1_1_4 + 0.00817487039709301*G0_1_1_1_5 + 0.000735396290951858*G0_1_1_2_0 + 0.0014622414622415*G0_1_1_2_1 - 0.0125701459034796*G0_1_1_2_2 - 0.00391641280530183*G0_1_1_2_3 - 0.000701191812302923*G0_1_1_2_4 - 0.000530169419058344*G0_1_1_2_5 + 0.000530169419058325*G0_1_1_3_0 - 0.00140238362460585*G0_1_1_3_1 - 0.00391641280530182*G0_1_1_3_2 - 0.0147079258190375*G0_1_1_3_3 - 0.00420715087381768*G0_1_1_3_4 - 0.000666987333654009*G0_1_1_4_0 + 0.0015734060178505*G0_1_1_4_1 - 0.000701191812302923*G0_1_1_4_2 - 0.00420715087381768*G0_1_1_4_3 - 0.00971407193629443*G0_1_1_4_4 - 0.00208647319758435*G0_1_1_4_5 + 0.01287798621132*G0_1_1_5_0 + 0.00817487039709301*G0_1_1_5_1 - 0.000530169419058344*G0_1_1_5_2 - 0.00208647319758435*G0_1_1_5_4 + 0.0549323927101726*G0_1_1_5_5; + A[137] = A[39] - 0.020573993907328*G0_0_1_0_0 + 0.000641333974667331*G0_0_1_0_1 - 0.000269360269360286*G0_0_1_0_2 - 0.00030784030784031*G0_0_1_0_3 + 0.000205226871893534*G0_0_1_0_4 + 0.000974827641494355*G0_0_1_0_5 + 0.000641333974667331*G0_0_1_1_0 + 0.00256533589866934*G0_0_1_1_1 + 0.000457484901929357*G0_0_1_1_2 - 0.000530169419058332*G0_0_1_1_3 + 0.000735396290951865*G0_0_1_1_4 - 0.00372828817273276*G0_0_1_1_5 - 0.000269360269360286*G0_0_1_2_0 + 0.000457484901929357*G0_0_1_2_1 - 0.00160761049649941*G0_0_1_2_3 + 0.00160761049649948*G0_0_1_2_4 - 0.000188124632569083*G0_0_1_2_5 - 0.00030784030784031*G0_0_1_3_0 - 0.000530169419058332*G0_0_1_3_1 - 0.00160761049649941*G0_0_1_3_2 - 0.00164181497514841*G0_0_1_3_3 - 0.000855111966223104*G0_0_1_3_4 + 0.00099192988081879*G0_0_1_3_5 + 0.000205226871893533*G0_0_1_4_0 + 0.000735396290951865*G0_0_1_4_1 + 0.00160761049649948*G0_0_1_4_2 - 0.000855111966223104*G0_0_1_4_3 + 0.00335203890759459*G0_0_1_4_4 - 0.00109454331676557*G0_0_1_4_5 + 0.000974827641494355*G0_0_1_5_0 - 0.00372828817273276*G0_0_1_5_1 - 0.000188124632569083*G0_0_1_5_2 + 0.000991929880818788*G0_0_1_5_3 - 0.00109454331676557*G0_0_1_5_4 + 0.0222329111218008*G0_0_1_5_5 + 0.020573993907328*G0_1_0_0_0 - 0.000641333974667331*G0_1_0_0_1 + 0.000269360269360286*G0_1_0_0_2 + 0.00030784030784031*G0_1_0_0_3 - 0.000205226871893534*G0_1_0_0_4 - 0.000974827641494355*G0_1_0_0_5 - 0.000641333974667331*G0_1_0_1_0 - 0.00256533589866934*G0_1_0_1_1 - 0.000457484901929358*G0_1_0_1_2 + 0.000530169419058333*G0_1_0_1_3 - 0.000735396290951865*G0_1_0_1_4 + 0.00372828817273277*G0_1_0_1_5 + 0.000269360269360285*G0_1_0_2_0 - 0.000457484901929358*G0_1_0_2_1 + 0.00160761049649941*G0_1_0_2_3 - 0.00160761049649948*G0_1_0_2_4 + 0.000188124632569082*G0_1_0_2_5 + 0.00030784030784031*G0_1_0_3_0 + 0.000530169419058332*G0_1_0_3_1 + 0.00160761049649941*G0_1_0_3_2 + 0.00164181497514841*G0_1_0_3_3 + 0.000855111966223104*G0_1_0_3_4 - 0.00099192988081879*G0_1_0_3_5 - 0.000205226871893533*G0_1_0_4_0 - 0.000735396290951865*G0_1_0_4_1 - 0.00160761049649948*G0_1_0_4_2 + 0.000855111966223104*G0_1_0_4_3 - 0.00335203890759459*G0_1_0_4_4 + 0.00109454331676557*G0_1_0_4_5 - 0.000974827641494355*G0_1_0_5_0 + 0.00372828817273276*G0_1_0_5_1 + 0.000188124632569083*G0_1_0_5_2 - 0.000991929880818789*G0_1_0_5_3 + 0.00109454331676557*G0_1_0_5_4 - 0.0222329111218008*G0_1_0_5_5; + A[167] = -A[137] - 0.0231393298059973*G0_0_1_0_0 - 0.000726845171289644*G0_0_1_0_2 - 0.00104323659879218*G0_0_1_0_3 + 0.000735396290951842*G0_0_1_0_4 + 0.0047031158142271*G0_0_1_0_5 + 0.0231393298059975*G0_0_1_1_1 + 0.00072684517128963*G0_0_1_1_2 - 0.000735396290951856*G0_0_1_1_3 + 0.00104323659879218*G0_0_1_1_4 - 0.00470311581422708*G0_0_1_1_5 - 0.000726845171289644*G0_0_1_2_0 + 0.00072684517128963*G0_0_1_2_1 - 0.00321522099299884*G0_0_1_2_3 + 0.00321522099299891*G0_0_1_2_4 - 0.00104323659879218*G0_0_1_3_0 - 0.000735396290951856*G0_0_1_3_1 - 0.00321522099299884*G0_0_1_3_2 - 0.00499385388274302*G0_0_1_3_3 + 0.00208647319758435*G0_0_1_3_5 + 0.000735396290951842*G0_0_1_4_0 + 0.00104323659879218*G0_0_1_4_1 + 0.00321522099299891*G0_0_1_4_2 + 0.00499385388274291*G0_0_1_4_4 - 0.00208647319758437*G0_0_1_4_5 + 0.0047031158142271*G0_0_1_5_0 - 0.00470311581422707*G0_0_1_5_1 + 0.00208647319758435*G0_0_1_5_3 - 0.00208647319758437*G0_0_1_5_4 + 0.0153407086740426*G0_1_1_0_0 - 0.00539575650686783*G0_1_1_0_1 + 0.000735396290951858*G0_1_1_0_2 + 0.000530169419058325*G0_1_1_0_3 - 0.00066698733365401*G0_1_1_0_4 + 0.01287798621132*G0_1_1_0_5 - 0.00539575650686783*G0_1_1_1_0 + 0.0384800384800401*G0_1_1_1_1 + 0.0014622414622415*G0_1_1_1_2 - 0.00140238362460585*G0_1_1_1_3 + 0.0015734060178505*G0_1_1_1_4 + 0.00817487039709301*G0_1_1_1_5 + 0.000735396290951858*G0_1_1_2_0 + 0.0014622414622415*G0_1_1_2_1 - 0.0125701459034796*G0_1_1_2_2 - 0.00391641280530182*G0_1_1_2_3 - 0.000701191812302923*G0_1_1_2_4 - 0.000530169419058344*G0_1_1_2_5 + 0.000530169419058325*G0_1_1_3_0 - 0.00140238362460585*G0_1_1_3_1 - 0.00391641280530182*G0_1_1_3_2 - 0.0147079258190375*G0_1_1_3_3 - 0.00420715087381768*G0_1_1_3_4 - 0.000666987333654009*G0_1_1_4_0 + 0.0015734060178505*G0_1_1_4_1 - 0.000701191812302923*G0_1_1_4_2 - 0.00420715087381768*G0_1_1_4_3 - 0.00971407193629443*G0_1_1_4_4 - 0.00208647319758435*G0_1_1_4_5 + 0.01287798621132*G0_1_1_5_0 + 0.00817487039709301*G0_1_1_5_1 - 0.000530169419058344*G0_1_1_5_2 - 0.00208647319758435*G0_1_1_5_4 + 0.0549323927101726*G0_1_1_5_5; + A[47] = -A[167] - 0.000949174282507699*G0_0_1_0_0 - 0.000671262893485142*G0_0_1_0_1 - 0.00628934851157093*G0_0_1_0_2 - 0.00427555983111552*G0_0_1_0_3 - 0.00395061728395076*G0_0_1_0_4 + 0.0023088023088024*G0_0_1_0_5 - 0.000671262893485142*G0_0_1_1_0 + 0.0211640211640221*G0_0_1_1_1 - 0.00325370103147891*G0_0_1_1_2 + 0.0085511196622311*G0_0_1_1_3 - 0.000342044786489219*G0_0_1_1_5 - 0.00628934851157093*G0_0_1_2_0 - 0.00325370103147891*G0_0_1_2_1 + 0.0896584896584926*G0_0_1_2_2 + 0.000188124632569056*G0_0_1_2_3 + 0.0290567046122611*G0_0_1_2_4 - 0.000718294051627388*G0_0_1_2_5 - 0.00427555983111552*G0_0_1_3_0 + 0.0085511196622311*G0_0_1_3_1 + 0.000188124632569056*G0_0_1_3_2 + 0.0124504302282085*G0_0_1_3_3 + 0.00865373309817784*G0_0_1_3_4 + 0.00998770776548586*G0_0_1_3_5 - 0.00395061728395076*G0_0_1_4_0 + 0.0290567046122611*G0_0_1_4_2 + 0.00865373309817784*G0_0_1_4_3 + 0.0194965528298867*G0_0_1_4_4 + 0.00153920153920159*G0_0_1_4_5 + 0.0023088023088024*G0_0_1_5_0 - 0.000342044786489219*G0_0_1_5_1 - 0.000718294051627388*G0_0_1_5_2 + 0.00998770776548586*G0_0_1_5_3 + 0.00153920153920159*G0_0_1_5_4 - 0.0201122334455676*G0_0_1_5_5; + A[92] = -A[47] + 0.00102613435946772*G0_0_1_0_0 - 0.00230880230880241*G0_0_1_0_2 - 0.00318101651434995*G0_0_1_0_3 - 0.0132371332371336*G0_0_1_0_4 - 0.00205226871893544*G0_0_1_0_5 - 0.00102613435946775*G0_0_1_1_1 + 0.00230880230880238*G0_0_1_1_2 + 0.0132371332371337*G0_0_1_1_3 + 0.00318101651434994*G0_0_1_1_4 + 0.00205226871893543*G0_0_1_1_5 - 0.00230880230880241*G0_0_1_2_0 + 0.00230880230880238*G0_0_1_2_1 - 0.0256533589866932*G0_0_1_2_3 + 0.0256533589866932*G0_0_1_2_4 - 0.00318101651434995*G0_0_1_3_0 + 0.0132371332371337*G0_0_1_3_1 - 0.0256533589866932*G0_0_1_3_2 - 0.00205226871893547*G0_0_1_3_3 + 0.00636203302869989*G0_0_1_3_5 - 0.0132371332371336*G0_0_1_4_0 + 0.00318101651434994*G0_0_1_4_1 + 0.0256533589866932*G0_0_1_4_2 + 0.0020522687189356*G0_0_1_4_4 - 0.00636203302869988*G0_0_1_4_5 - 0.00205226871893544*G0_0_1_5_0 + 0.00205226871893543*G0_0_1_5_1 + 0.00636203302869989*G0_0_1_5_3 - 0.00636203302869988*G0_0_1_5_4 - 0.0365047298380645*G0_1_1_0_0 + 0.00606701940035297*G0_1_1_0_1 + 0.00251830474052704*G0_1_1_0_2 - 0.000478862701084926*G0_1_1_0_3 - 0.00788413232857702*G0_1_1_0_4 - 0.0125359414248308*G0_1_1_0_5 + 0.00606701940035297*G0_1_1_1_0 - 0.0375308641975325*G0_1_1_1_1 + 0.00482710704932945*G0_1_1_1_2 + 0.0053530009085566*G0_1_1_1_3 + 0.00270215381326501*G0_1_1_1_4 - 0.0104836727058954*G0_1_1_1_5 + 0.00251830474052704*G0_1_1_2_0 + 0.00482710704932945*G0_1_1_2_1 - 0.077088343755013*G0_1_1_2_2 - 0.0251402918069593*G0_1_1_2_3 + 0.000513067179733835*G0_1_1_2_4 + 0.00124846347068573*G0_1_1_2_5 - 0.000478862701084926*G0_1_1_3_0 + 0.0053530009085566*G0_1_1_3_1 - 0.0251402918069593*G0_1_1_3_2 - 0.00478862701084946*G0_1_1_3_3 - 0.00444658222436016*G0_1_1_3_4 - 0.00153920153920163*G0_1_1_3_5 - 0.00788413232857702*G0_1_1_4_0 + 0.00270215381326501*G0_1_1_4_1 + 0.000513067179733834*G0_1_1_4_2 - 0.00444658222436016*G0_1_1_4_3 - 0.00273635829191387*G0_1_1_4_4 - 0.0079012345679015*G0_1_1_4_5 - 0.0125359414248307*G0_1_1_5_0 - 0.0104836727058954*G0_1_1_5_1 + 0.00124846347068573*G0_1_1_5_2 - 0.00153920153920163*G0_1_1_5_3 - 0.00790123456790149*G0_1_1_5_4 - 0.034820159264605*G0_1_1_5_5; + A[121] = -A[91] + 0.0153407086740425*G0_0_0_0_0 + 0.000735396290951857*G0_0_0_0_1 - 0.00539575650686779*G0_0_0_0_2 + 0.000530169419058317*G0_0_0_0_3 + 0.01287798621132*G0_0_0_0_4 - 0.000666987333654038*G0_0_0_0_5 + 0.000735396290951857*G0_0_0_1_0 - 0.0125701459034795*G0_0_0_1_1 + 0.00146224146224151*G0_0_0_1_2 - 0.00391641280530185*G0_0_0_1_3 - 0.000530169419058315*G0_0_0_1_4 - 0.000701191812302883*G0_0_0_1_5 - 0.00539575650686779*G0_0_0_2_0 + 0.00146224146224151*G0_0_0_2_1 + 0.0384800384800397*G0_0_0_2_2 - 0.00140238362460587*G0_0_0_2_3 + 0.00817487039709289*G0_0_0_2_4 + 0.00157340601785053*G0_0_0_2_5 + 0.000530169419058317*G0_0_0_3_0 - 0.00391641280530185*G0_0_0_3_1 - 0.00140238362460587*G0_0_0_3_2 - 0.0147079258190374*G0_0_0_3_3 - 0.00420715087381769*G0_0_0_3_5 + 0.01287798621132*G0_0_0_4_0 - 0.000530169419058316*G0_0_0_4_1 + 0.0081748703970929*G0_0_0_4_2 + 0.0549323927101722*G0_0_0_4_4 - 0.00208647319758441*G0_0_0_4_5 - 0.000666987333654037*G0_0_0_5_0 - 0.000701191812302883*G0_0_0_5_1 + 0.00157340601785053*G0_0_0_5_2 - 0.00420715087381769*G0_0_0_5_3 - 0.00208647319758441*G0_0_0_5_4 - 0.00971407193629445*G0_0_0_5_5 - 0.0231393298059974*G0_1_0_0_0 - 0.000726845171289664*G0_1_0_0_1 - 0.00104323659879219*G0_1_0_0_3 + 0.00470311581422705*G0_1_0_0_4 + 0.000735396290951839*G0_1_0_0_5 - 0.000726845171289664*G0_1_0_1_0 + 0.000726845171289626*G0_1_0_1_2 - 0.00321522099299883*G0_1_0_1_3 + 0.003215220992999*G0_1_0_1_5 + 0.000726845171289626*G0_1_0_2_1 + 0.0231393298059972*G0_1_0_2_2 - 0.000735396290951857*G0_1_0_2_3 - 0.00470311581422708*G0_1_0_2_4 + 0.00104323659879219*G0_1_0_2_5 - 0.00104323659879219*G0_1_0_3_0 - 0.00321522099299883*G0_1_0_3_1 - 0.000735396290951857*G0_1_0_3_2 - 0.0049938538827429*G0_1_0_3_3 + 0.00208647319758437*G0_1_0_3_4 + 0.00470311581422705*G0_1_0_4_0 - 0.00470311581422708*G0_1_0_4_2 + 0.00208647319758437*G0_1_0_4_3 - 0.00208647319758441*G0_1_0_4_5 + 0.000735396290951839*G0_1_0_5_0 + 0.003215220992999*G0_1_0_5_1 + 0.00104323659879219*G0_1_0_5_2 - 0.00208647319758441*G0_1_0_5_4 + 0.004993853882743*G0_1_0_5_5; + A[76] = -A[121] - 0.000949174282507679*G0_1_0_0_0 - 0.00628934851157099*G0_1_0_0_1 - 0.000671262893485128*G0_1_0_0_2 - 0.00427555983111553*G0_1_0_0_3 + 0.00230880230880238*G0_1_0_0_4 - 0.00395061728395078*G0_1_0_0_5 - 0.00628934851157099*G0_1_0_1_0 + 0.0896584896584935*G0_1_0_1_1 - 0.00325370103147894*G0_1_0_1_2 + 0.000188124632569197*G0_1_0_1_3 - 0.000718294051627414*G0_1_0_1_4 + 0.0290567046122614*G0_1_0_1_5 - 0.000671262893485128*G0_1_0_2_0 - 0.00325370103147894*G0_1_0_2_1 + 0.0211640211640218*G0_1_0_2_2 + 0.00855111966223105*G0_1_0_2_3 - 0.000342044786489258*G0_1_0_2_4 - 0.00427555983111553*G0_1_0_3_0 + 0.0001881246325692*G0_1_0_3_1 + 0.00855111966223105*G0_1_0_3_2 + 0.0124504302282084*G0_1_0_3_3 + 0.00998770776548587*G0_1_0_3_4 + 0.00865373309817786*G0_1_0_3_5 + 0.00230880230880237*G0_1_0_4_0 - 0.000718294051627414*G0_1_0_4_1 - 0.000342044786489259*G0_1_0_4_2 + 0.00998770776548587*G0_1_0_4_3 - 0.0201122334455675*G0_1_0_4_4 + 0.00153920153920158*G0_1_0_4_5 - 0.00395061728395078*G0_1_0_5_0 + 0.0290567046122614*G0_1_0_5_1 + 0.00865373309817786*G0_1_0_5_3 + 0.00153920153920158*G0_1_0_5_4 + 0.019496552829887*G0_1_0_5_5; + A[136] = -A[76] - 0.0365047298380645*G0_0_0_0_0 + 0.00251830474052705*G0_0_0_0_1 + 0.00606701940035294*G0_0_0_0_2 - 0.000478862701084933*G0_0_0_0_3 - 0.0125359414248307*G0_0_0_0_4 - 0.00788413232857705*G0_0_0_0_5 + 0.00251830474052705*G0_0_0_1_0 - 0.0770883437550131*G0_0_0_1_1 + 0.00482710704932943*G0_0_0_1_2 - 0.0251402918069593*G0_0_0_1_3 + 0.00124846347068574*G0_0_0_1_4 + 0.000513067179733811*G0_0_0_1_5 + 0.00606701940035294*G0_0_0_2_0 + 0.00482710704932944*G0_0_0_2_1 - 0.0375308641975321*G0_0_0_2_2 + 0.00535300090855664*G0_0_0_2_3 - 0.0104836727058953*G0_0_0_2_4 + 0.00270215381326502*G0_0_0_2_5 - 0.000478862701084933*G0_0_0_3_0 - 0.0251402918069593*G0_0_0_3_1 + 0.00535300090855664*G0_0_0_3_2 - 0.00478862701084939*G0_0_0_3_3 - 0.00153920153920159*G0_0_0_3_4 - 0.00444658222436018*G0_0_0_3_5 - 0.0125359414248307*G0_0_0_4_0 + 0.00124846347068574*G0_0_0_4_1 - 0.0104836727058953*G0_0_0_4_2 - 0.00153920153920159*G0_0_0_4_3 - 0.0348201592646048*G0_0_0_4_4 - 0.00790123456790151*G0_0_0_4_5 - 0.00788413232857705*G0_0_0_5_0 + 0.000513067179733811*G0_0_0_5_1 + 0.00270215381326502*G0_0_0_5_2 - 0.00444658222436018*G0_0_0_5_3 - 0.00790123456790151*G0_0_0_5_4 - 0.00273635829191399*G0_0_0_5_5 + 0.00102613435946772*G0_1_0_0_0 - 0.00230880230880243*G0_1_0_0_1 - 0.00318101651434996*G0_1_0_0_3 - 0.00205226871893546*G0_1_0_0_4 - 0.0132371332371337*G0_1_0_0_5 - 0.00230880230880243*G0_1_0_1_0 + 0.00230880230880237*G0_1_0_1_2 - 0.0256533589866931*G0_1_0_1_3 + 0.0256533589866934*G0_1_0_1_5 + 0.00230880230880237*G0_1_0_2_1 - 0.00102613435946776*G0_1_0_2_2 + 0.0132371332371337*G0_1_0_2_3 + 0.00205226871893545*G0_1_0_2_4 + 0.00318101651434996*G0_1_0_2_5 - 0.00318101651434996*G0_1_0_3_0 - 0.0256533589866931*G0_1_0_3_1 + 0.0132371332371337*G0_1_0_3_2 - 0.00205226871893548*G0_1_0_3_3 + 0.0063620330286999*G0_1_0_3_4 - 0.00205226871893546*G0_1_0_4_0 + 0.00205226871893544*G0_1_0_4_2 + 0.00636203302869989*G0_1_0_4_3 - 0.00636203302869993*G0_1_0_4_5 - 0.0132371332371337*G0_1_0_5_0 + 0.0256533589866934*G0_1_0_5_1 + 0.00318101651434996*G0_1_0_5_2 - 0.00636203302869993*G0_1_0_5_4 + 0.00205226871893551*G0_1_0_5_5; + A[162] = A[187] - 0.237037037037045*G0_0_0_0_0 - 0.0052332852332854*G0_0_0_0_1 + 0.047407407407409*G0_0_0_0_2 - 0.00369408369408374*G0_0_0_0_3 - 0.168696488696494*G0_0_0_0_4 - 0.056026936026938*G0_0_0_0_5 - 0.00523328523328539*G0_0_0_1_0 + 0.0720346320346348*G0_0_0_1_1 - 0.00554112554112566*G0_0_0_1_2 + 0.129292929292934*G0_0_0_1_3 + 0.0394035594035607*G0_0_0_1_4 + 0.05787397787398*G0_0_0_1_5 + 0.047407407407409*G0_0_0_2_0 - 0.00554112554112566*G0_0_0_2_1 - 0.0591053391053415*G0_0_0_2_2 - 0.110822510822515*G0_0_0_2_3 + 0.018470418470419*G0_0_0_2_4 - 0.0190860990860998*G0_0_0_2_5 - 0.00369408369408374*G0_0_0_3_0 + 0.129292929292934*G0_0_0_3_1 - 0.110822510822515*G0_0_0_3_2 - 0.0295526695526718*G0_0_0_3_3 - 0.0714189514189539*G0_0_0_3_4 + 0.045560365560367*G0_0_0_3_5 - 0.168696488696494*G0_0_0_4_0 + 0.0394035594035607*G0_0_0_4_1 + 0.018470418470419*G0_0_0_4_2 - 0.0714189514189539*G0_0_0_4_3 - 0.0886580086580105*G0_0_0_4_4 - 0.040634920634922*G0_0_0_4_5 - 0.0560269360269379*G0_0_0_5_0 + 0.05787397787398*G0_0_0_5_1 - 0.0190860990860998*G0_0_0_5_2 + 0.045560365560367*G0_0_0_5_3 - 0.040634920634922*G0_0_0_5_4 + 0.120673400673405*G0_0_0_5_5 - 0.0363251563251575*G0_0_1_0_1 + 0.0363251563251575*G0_0_1_0_2 - 0.142530062530067*G0_0_1_0_4 + 0.142530062530068*G0_0_1_0_5 - 0.0363251563251575*G0_0_1_1_0 + 0.0683405483405506*G0_0_1_1_1 + 0.114208754208758*G0_0_1_1_3 + 0.0467917267917284*G0_0_1_1_4 - 0.0440211640211656*G0_0_1_1_5 + 0.0363251563251575*G0_0_1_2_0 - 0.068340548340551*G0_0_1_2_2 - 0.114208754208758*G0_0_1_2_3 + 0.0440211640211655*G0_0_1_2_4 - 0.0467917267917283*G0_0_1_2_5 + 0.114208754208758*G0_0_1_3_1 - 0.114208754208758*G0_0_1_3_2 - 0.0935834535834569*G0_0_1_3_4 + 0.0935834535834564*G0_0_1_3_5 - 0.142530062530067*G0_0_1_4_0 + 0.0467917267917284*G0_0_1_4_1 + 0.0440211640211655*G0_0_1_4_2 - 0.0935834535834569*G0_0_1_4_3 - 0.640307840307861*G0_0_1_4_4 + 0.142530062530068*G0_0_1_5_0 - 0.0440211640211656*G0_0_1_5_1 - 0.0467917267917283*G0_0_1_5_2 + 0.0935834535834564*G0_0_1_5_3 + 0.640307840307862*G0_0_1_5_5 - 0.0132371332371336*G0_1_0_0_1 + 0.0132371332371337*G0_1_0_0_2 + 0.0483309283309299*G0_1_0_0_4 - 0.0483309283309301*G0_1_0_0_5 - 0.0132371332371336*G0_1_0_1_0 + 0.0769600769600798*G0_1_0_1_1 + 0.136373256373261*G0_1_0_1_3 + 0.047407407407409*G0_1_0_1_4 + 0.0538720538720559*G0_1_0_1_5 + 0.0132371332371337*G0_1_0_2_0 - 0.07696007696008*G0_1_0_2_2 - 0.136373256373261*G0_1_0_2_3 - 0.0538720538720558*G0_1_0_2_4 - 0.047407407407409*G0_1_0_2_5 + 0.136373256373261*G0_1_0_3_1 - 0.136373256373261*G0_1_0_3_2 - 0.0948148148148182*G0_1_0_3_4 + 0.0948148148148178*G0_1_0_3_5 + 0.04833092833093*G0_1_0_4_0 + 0.047407407407409*G0_1_0_4_1 - 0.0538720538720558*G0_1_0_4_2 - 0.0948148148148182*G0_1_0_4_3 - 0.258585858585866*G0_1_0_4_4 - 0.0483309283309301*G0_1_0_5_0 + 0.0538720538720559*G0_1_0_5_1 - 0.047407407407409*G0_1_0_5_2 + 0.0948148148148178*G0_1_0_5_3 + 0.258585858585867*G0_1_0_5_5 + 0.237037037037045*G0_1_1_0_0 - 0.047407407407409*G0_1_1_0_1 + 0.00523328523328539*G0_1_1_0_2 + 0.0036940836940839*G0_1_1_0_3 + 0.0560269360269379*G0_1_1_0_4 + 0.168696488696495*G0_1_1_0_5 - 0.047407407407409*G0_1_1_1_0 + 0.059105339105341*G0_1_1_1_1 + 0.00554112554112579*G0_1_1_1_2 + 0.110822510822515*G0_1_1_1_3 + 0.0190860990860998*G0_1_1_1_4 - 0.0184704184704192*G0_1_1_1_5 + 0.0052332852332854*G0_1_1_2_0 + 0.00554112554112578*G0_1_1_2_1 - 0.0720346320346349*G0_1_1_2_2 - 0.129292929292934*G0_1_1_2_3 - 0.0578739778739799*G0_1_1_2_4 - 0.0394035594035607*G0_1_1_2_5 + 0.0036940836940839*G0_1_1_3_0 + 0.110822510822515*G0_1_1_3_1 - 0.129292929292934*G0_1_1_3_2 + 0.0295526695526696*G0_1_1_3_3 - 0.0455603655603675*G0_1_1_3_4 + 0.0714189514189534*G0_1_1_3_5 + 0.0560269360269379*G0_1_1_4_0 + 0.0190860990860998*G0_1_1_4_1 - 0.0578739778739799*G0_1_1_4_2 - 0.0455603655603675*G0_1_1_4_3 - 0.120673400673405*G0_1_1_4_4 + 0.0406349206349216*G0_1_1_4_5 + 0.168696488696495*G0_1_1_5_0 - 0.0184704184704192*G0_1_1_5_1 - 0.0394035594035607*G0_1_1_5_2 + 0.0714189514189534*G0_1_1_5_3 + 0.0406349206349216*G0_1_1_5_4 + 0.0886580086580107*G0_1_1_5_5; + A[214] = A[162] + 0.171159211159217*G0_0_0_0_0 - 0.00615680615680634*G0_0_0_0_1 + 0.00277056277056284*G0_0_0_0_2 + 0.102202982202985*G0_0_0_0_3 + 0.254891774891783*G0_0_0_0_4 + 0.06772486772487*G0_0_0_0_5 - 0.00615680615680634*G0_0_0_1_0 - 0.111438191438196*G0_0_0_1_1 + 0.0575661375661396*G0_0_0_1_2 + 0.0209331409331417*G0_0_0_1_3 + 0.0147763347763353*G0_0_0_1_4 - 0.0400192400192415*G0_0_0_1_5 + 0.00277056277056284*G0_0_0_2_0 + 0.0575661375661396*G0_0_0_2_1 - 0.211794131794139*G0_0_0_2_2 - 0.148994708994715*G0_0_0_2_3 - 0.2511976911977*G0_0_0_2_4 + 0.00307840307840312*G0_0_0_2_5 + 0.102202982202985*G0_0_0_3_0 + 0.0209331409331417*G0_0_0_3_1 - 0.148994708994715*G0_0_0_3_2 - 1.5071861471862*G0_0_0_3_3 - 0.233958633958642*G0_0_0_3_4 - 0.210562770562778*G0_0_0_3_5 + 0.254891774891783*G0_0_0_4_0 + 0.0147763347763353*G0_0_0_4_1 - 0.2511976911977*G0_0_0_4_2 - 0.233958633958642*G0_0_0_4_3 - 0.128061568061572*G0_0_0_4_4 - 0.035709475709477*G0_0_0_4_5 + 0.06772486772487*G0_0_0_5_0 - 0.0400192400192415*G0_0_0_5_1 + 0.00307840307840312*G0_0_0_5_2 - 0.210562770562778*G0_0_0_5_3 - 0.035709475709477*G0_0_0_5_4 - 0.150226070226076*G0_0_0_5_5 - 0.0378643578643592*G0_0_1_0_0 + 0.0372486772486785*G0_0_1_0_1 + 0.0027705627705629*G0_0_1_0_2 + 0.0529485329485346*G0_0_1_0_3 + 0.00954304954304987*G0_0_1_0_4 - 0.142530062530068*G0_0_1_0_5 + 0.0372486772486785*G0_0_1_1_0 - 0.111438191438195*G0_0_1_1_1 + 0.0141606541606547*G0_0_1_1_2 - 0.0649543049543072*G0_0_1_1_3 + 0.0147763347763353*G0_0_1_1_4 + 0.0458682058682075*G0_0_1_1_5 + 0.00277056277056291*G0_0_1_2_0 + 0.0141606541606547*G0_0_1_2_1 - 0.0027705627705629*G0_0_1_2_2 + 0.0612602212602231*G0_0_1_2_3 - 0.00584896584896613*G0_0_1_2_4 + 0.0523328523328541*G0_0_1_2_5 + 0.0529485329485346*G0_0_1_3_0 - 0.0649543049543072*G0_0_1_3_1 + 0.0612602212602231*G0_0_1_3_2 - 0.990014430014466*G0_0_1_3_3 - 0.13544973544974*G0_0_1_3_4 - 0.210562770562778*G0_0_1_3_5 + 0.00954304954304987*G0_0_1_4_0 + 0.0147763347763353*G0_0_1_4_1 - 0.00584896584896613*G0_0_1_4_2 - 0.13544973544974*G0_0_1_4_3 - 0.128061568061573*G0_0_1_4_4 - 0.134218374218379*G0_0_1_4_5 - 0.142530062530068*G0_0_1_5_0 + 0.0458682058682075*G0_0_1_5_1 + 0.0523328523328541*G0_0_1_5_2 - 0.210562770562778*G0_0_1_5_3 - 0.134218374218379*G0_0_1_5_4 - 0.66739778739781*G0_0_1_5_5 - 0.0434054834054848*G0_1_0_0_0 + 0.0092352092352096*G0_1_0_0_1 + 0.00277056277056287*G0_1_0_0_2 + 0.0609523809523828*G0_1_0_0_3 - 0.0224723424723433*G0_1_0_0_4 + 0.0267821067821076*G0_1_0_0_5 + 0.00923520923520959*G0_1_0_1_0 - 0.111438191438196*G0_1_0_1_1 + 0.0421741221741237*G0_1_0_1_2 + 0.000307840307840437*G0_1_0_1_3 + 0.0147763347763353*G0_1_0_1_4 - 0.0193939393939402*G0_1_0_1_5 + 0.00277056277056287*G0_1_0_2_0 + 0.0421741221741237*G0_1_0_2_1 + 0.00277056277056233*G0_1_0_2_2 - 0.108051948051952*G0_1_0_2_3 + 0.026166426166427*G0_1_0_2_4 + 0.0443290043290058*G0_1_0_2_5 + 0.0609523809523828*G0_1_0_3_0 + 0.000307840307840437*G0_1_0_3_1 - 0.108051948051952*G0_1_0_3_2 - 1.29785473785478*G0_1_0_3_3 - 0.151457431457437*G0_1_0_3_4 - 0.210562770562778*G0_1_0_3_5 - 0.0224723424723433*G0_1_0_4_0 + 0.0147763347763353*G0_1_0_4_1 + 0.026166426166427*G0_1_0_4_2 - 0.151457431457437*G0_1_0_4_3 - 0.128061568061573*G0_1_0_4_4 - 0.118210678210682*G0_1_0_4_5 + 0.0267821067821076*G0_1_0_5_0 - 0.0193939393939402*G0_1_0_5_1 + 0.0443290043290058*G0_1_0_5_2 - 0.210562770562778*G0_1_0_5_3 - 0.118210678210682*G0_1_0_5_4 - 0.359557479557493*G0_1_0_5_5 - 0.0406349206349219*G0_1_1_0_0 - 0.00492544492544517*G0_1_1_0_1 + 0.00861952861952883*G0_1_1_0_3 - 0.0166233766233772*G0_1_1_0_4 - 0.0344781144781155*G0_1_1_0_5 - 0.00492544492544517*G0_1_1_1_0 + 0.00492544492544512*G0_1_1_1_2 - 0.0455603655603669*G0_1_1_1_3 + 0.0455603655603674*G0_1_1_1_5 + 0.00492544492544512*G0_1_1_2_1 + 0.0406349206349218*G0_1_1_2_2 + 0.0344781144781153*G0_1_1_2_3 + 0.0166233766233772*G0_1_1_2_4 - 0.00861952861952894*G0_1_1_2_5 + 0.00861952861952883*G0_1_1_3_0 - 0.0455603655603669*G0_1_1_3_1 + 0.0344781144781153*G0_1_1_3_2 - 0.630456950456973*G0_1_1_3_3 - 0.0172390572390579*G0_1_1_3_4 - 0.0166233766233772*G0_1_1_4_0 + 0.0166233766233772*G0_1_1_4_2 - 0.0172390572390579*G0_1_1_4_3 + 0.0172390572390578*G0_1_1_4_5 - 0.0344781144781155*G0_1_1_5_0 + 0.0455603655603674*G0_1_1_5_1 - 0.00861952861952894*G0_1_1_5_2 + 0.0172390572390578*G0_1_1_5_4 + 0.630456950456973*G0_1_1_5_5; + A[160] = A[162] + 0.540105820105839*G0_0_0_0_0 - 0.0524867724867742*G0_0_0_0_1 - 0.0650312650312672*G0_0_0_0_2 + 0.0150072150072154*G0_0_0_0_3 + 0.316536796536807*G0_0_0_0_4 + 0.127984607984613*G0_0_0_0_5 - 0.0524867724867742*G0_0_0_1_0 + 0.271669071669081*G0_0_0_1_1 - 0.00715728715728739*G0_0_0_1_2 + 0.0530254930254947*G0_0_0_1_3 - 0.036709956709958*G0_0_0_1_4 + 0.0307070707070719*G0_0_0_1_5 - 0.0650312650312672*G0_0_0_2_0 - 0.0071572871572874*G0_0_0_2_1 + 0.0219336219336227*G0_0_0_2_2 - 0.00938912938912966*G0_0_0_2_3 - 0.0931216931216962*G0_0_0_2_4 - 0.051255411255413*G0_0_0_2_5 + 0.0150072150072154*G0_0_0_3_0 + 0.0530254930254947*G0_0_0_3_1 - 0.00938912938912966*G0_0_0_3_2 - 0.0627994227994249*G0_0_0_3_3 + 0.0434054834054848*G0_0_0_3_4 + 0.0724963924963949*G0_0_0_3_5 + 0.316536796536807*G0_0_0_4_0 - 0.036709956709958*G0_0_0_4_1 - 0.0931216931216962*G0_0_0_4_2 + 0.0434054834054848*G0_0_0_4_3 + 0.626762866762887*G0_0_0_4_4 + 0.175930735930742*G0_0_0_4_5 + 0.127984607984612*G0_0_0_5_0 + 0.0307070707070719*G0_0_0_5_1 - 0.051255411255413*G0_0_0_5_2 + 0.0724963924963949*G0_0_0_5_3 + 0.175930735930742*G0_0_0_5_4 + 0.622760942760964*G0_0_0_5_5 - 0.0365175565175575*G0_0_1_0_0 + 0.00992784992785031*G0_0_1_0_1 + 0.00942760942760974*G0_0_1_0_2 - 0.0127753727753732*G0_0_1_0_3 - 0.0288600288600298*G0_0_1_0_4 - 0.23157287157288*G0_0_1_0_5 + 0.00992784992785031*G0_0_1_1_0 + 0.28078884078885*G0_0_1_1_1 - 0.0239730639730648*G0_0_1_1_2 + 0.0831168831168859*G0_0_1_1_3 + 0.0130062530062534*G0_0_1_1_4 + 0.206868686868694*G0_0_1_1_5 + 0.00942760942760974*G0_0_1_2_0 - 0.0239730639730648*G0_0_1_2_1 + 0.00173160173160184*G0_0_1_2_2 + 0.0041558441558443*G0_0_1_2_4 + 0.0150072150072155*G0_0_1_2_5 - 0.0127753727753732*G0_0_1_3_0 + 0.0831168831168859*G0_0_1_3_1 - 0.0620298220298243*G0_0_1_3_3 - 0.000461760461760462*G0_0_1_3_4 - 0.00446368446368446*G0_0_1_3_5 - 0.0288600288600298*G0_0_1_4_0 + 0.0130062530062534*G0_0_1_4_1 + 0.0041558441558443*G0_0_1_4_2 - 0.000461760461760455*G0_0_1_4_3 + 0.0140067340067346*G0_0_1_4_4 - 0.056026936026938*G0_0_1_4_5 - 0.23157287157288*G0_0_1_5_0 + 0.206868686868694*G0_0_1_5_1 + 0.0150072150072155*G0_0_1_5_2 - 0.00446368446368449*G0_0_1_5_3 - 0.0560269360269379*G0_0_1_5_4 - 0.259971139971149*G0_0_1_5_5 - 0.0488311688311701*G0_1_0_0_0 - 0.0153150553150558*G0_1_0_0_1 + 0.00727272727272751*G0_1_0_0_2 + 0.00384800384800393*G0_1_0_0_3 - 0.0365560365560378*G0_1_0_0_4 - 0.0484078884078902*G0_1_0_0_5 - 0.0153150553150558*G0_1_0_1_0 + 0.265396825396834*G0_1_0_1_1 - 0.0212025012025019*G0_1_0_1_2 + 0.0748051948051972*G0_1_0_1_3 + 0.0210101010101017*G0_1_0_1_4 + 0.133294853294858*G0_1_0_1_5 + 0.00727272727272751*G0_1_0_2_0 - 0.0212025012025019*G0_1_0_2_1 - 0.00504088504088519*G0_1_0_2_2 + 0.0138528138528143*G0_1_0_2_3 + 0.0284752284752295*G0_1_0_2_4 + 0.0236267436267444*G0_1_0_2_5 + 0.00384800384800393*G0_1_0_3_0 + 0.0748051948051972*G0_1_0_3_1 + 0.0138528138528143*G0_1_0_3_2 - 0.133448773448778*G0_1_0_3_3 - 0.0497162097162113*G0_1_0_3_4 - 0.0549494949494967*G0_1_0_3_5 - 0.0365560365560378*G0_1_0_4_0 + 0.0210101010101017*G0_1_0_4_1 + 0.0284752284752295*G0_1_0_4_2 - 0.0497162097162114*G0_1_0_4_3 - 0.131293891293896*G0_1_0_4_4 - 0.0892736892736923*G0_1_0_4_5 - 0.0484078884078902*G0_1_0_5_0 + 0.133294853294858*G0_1_0_5_1 + 0.0236267436267444*G0_1_0_5_2 - 0.0549494949494967*G0_1_0_5_3 - 0.0892736892736923*G0_1_0_5_4 - 0.0235497835497842*G0_1_0_5_5 - 0.0205483405483412*G0_1_1_0_0 - 0.0242809042809051*G0_1_1_0_1 + 0.00419432419432432*G0_1_1_0_2 - 0.00546416546416567*G0_1_1_0_3 - 0.0102356902356906*G0_1_1_0_4 - 0.0731890331890355*G0_1_1_0_5 - 0.0242809042809051*G0_1_1_1_0 + 0.334006734006745*G0_1_1_1_1 - 0.0224338624338632*G0_1_1_1_2 + 0.0934295334295364*G0_1_1_1_3 + 0.00246272246272248*G0_1_1_1_4 + 0.120519480519485*G0_1_1_1_5 + 0.00419432419432433*G0_1_1_2_0 - 0.0224338624338632*G0_1_1_2_1 + 0.00592592592592613*G0_1_1_2_2 - 0.00915824915824946*G0_1_1_2_3 - 0.00407888407888421*G0_1_1_2_4 - 0.0497931697931716*G0_1_1_2_5 - 0.00546416546416568*G0_1_1_3_0 + 0.0934295334295364*G0_1_1_3_1 - 0.00915824915824946*G0_1_1_3_2 - 0.0547955747955769*G0_1_1_3_3 + 0.00600288600288632*G0_1_1_3_4 + 0.110514670514675*G0_1_1_3_5 - 0.0102356902356906*G0_1_1_4_0 + 0.00246272246272248*G0_1_1_4_1 - 0.00407888407888421*G0_1_1_4_2 + 0.00600288600288632*G0_1_1_4_3 + 0.0483309283309303*G0_1_1_4_4 + 0.0946608946608981*G0_1_1_4_5 - 0.0731890331890355*G0_1_1_5_0 + 0.120519480519485*G0_1_1_5_1 - 0.0497931697931716*G0_1_1_5_2 + 0.110514670514675*G0_1_1_5_3 + 0.0946608946608981*G0_1_1_5_4 + 1.26522366522371*G0_1_1_5_5; + A[112] = A[160] - 0.323617123617135*G0_0_0_0_0 + 0.0619143819143839*G0_0_0_0_1 - 0.00665704665704682*G0_0_0_0_2 - 0.0167772967772973*G0_0_0_0_3 - 0.221029341029349*G0_0_0_0_4 - 0.0821933621933651*G0_0_0_0_5 + 0.0619143819143839*G0_0_0_1_0 - 0.337777777777789*G0_0_0_1_1 - 0.00973544973545004*G0_0_0_1_2 - 0.191476671476678*G0_0_0_1_3 - 0.0524867724867743*G0_0_0_1_4 - 0.0926599326599361*G0_0_0_1_5 - 0.00665704665704682*G0_0_0_2_0 - 0.00973544973545005*G0_0_0_2_1 + 0.371178451178463*G0_0_0_2_2 + 0.213641173641181*G0_0_0_2_3 + 0.195170755170762*G0_0_0_2_4 + 0.0728042328042354*G0_0_0_2_5 - 0.0167772967772973*G0_0_0_3_0 - 0.191476671476678*G0_0_0_3_1 + 0.213641173641181*G0_0_0_3_2 + 0.0375565175565195*G0_0_0_3_3 + 0.138528138528143*G0_0_0_3_4 - 0.112053872053876*G0_0_0_3_5 - 0.221029341029349*G0_0_0_4_0 - 0.0524867724867743*G0_0_0_4_1 + 0.195170755170762*G0_0_0_4_2 + 0.138528138528143*G0_0_0_4_3 + 0.727118807118833*G0_0_0_4_4 - 0.0406349206349218*G0_0_0_4_5 - 0.0821933621933651*G0_0_0_5_0 - 0.0926599326599361*G0_0_0_5_1 + 0.0728042328042354*G0_0_0_5_2 - 0.112053872053876*G0_0_0_5_3 - 0.0406349206349218*G0_0_0_5_4 - 0.695103415103439*G0_0_0_5_5 + 0.035824915824917*G0_0_1_0_1 - 0.035824915824917*G0_0_1_0_2 - 0.0601827801827824*G0_0_1_0_4 + 0.0601827801827822*G0_0_1_0_5 + 0.035824915824917*G0_0_1_1_0 - 0.347397787397799*G0_0_1_1_1 - 0.197325637325644*G0_0_1_1_3 - 0.0447907647907663*G0_0_1_1_4 - 0.158691678691684*G0_0_1_1_5 - 0.035824915824917*G0_0_1_2_0 + 0.347397787397798*G0_0_1_2_2 + 0.197325637325644*G0_0_1_2_3 + 0.158691678691684*G0_0_1_2_4 + 0.0447907647907664*G0_0_1_2_5 - 0.197325637325644*G0_0_1_3_1 + 0.197325637325644*G0_0_1_3_2 + 0.0895815295815329*G0_0_1_3_4 - 0.0895815295815326*G0_0_1_3_5 - 0.0601827801827824*G0_0_1_4_0 - 0.0447907647907663*G0_0_1_4_1 + 0.158691678691684*G0_0_1_4_2 + 0.0895815295815328*G0_0_1_4_3 + 0.36632996632998*G0_0_1_4_4 + 0.0601827801827822*G0_0_1_5_0 - 0.158691678691684*G0_0_1_5_1 + 0.0447907647907664*G0_0_1_5_2 - 0.0895815295815326*G0_0_1_5_3 - 0.366329966329979*G0_0_1_5_5 + 0.035824915824917*G0_1_0_0_1 - 0.035824915824917*G0_1_0_0_2 - 0.0601827801827824*G0_1_0_0_4 + 0.0601827801827822*G0_1_0_0_5 + 0.035824915824917*G0_1_0_1_0 - 0.347397787397799*G0_1_0_1_1 - 0.197325637325644*G0_1_0_1_3 - 0.0447907647907663*G0_1_0_1_4 - 0.158691678691684*G0_1_0_1_5 - 0.035824915824917*G0_1_0_2_0 + 0.347397787397798*G0_1_0_2_2 + 0.197325637325644*G0_1_0_2_3 + 0.158691678691684*G0_1_0_2_4 + 0.0447907647907664*G0_1_0_2_5 - 0.197325637325644*G0_1_0_3_1 + 0.197325637325644*G0_1_0_3_2 + 0.0895815295815329*G0_1_0_3_4 - 0.0895815295815326*G0_1_0_3_5 - 0.0601827801827824*G0_1_0_4_0 - 0.0447907647907663*G0_1_0_4_1 + 0.158691678691684*G0_1_0_4_2 + 0.0895815295815328*G0_1_0_4_3 + 0.36632996632998*G0_1_0_4_4 + 0.0601827801827822*G0_1_0_5_0 - 0.158691678691684*G0_1_0_5_1 + 0.0447907647907664*G0_1_0_5_2 - 0.0895815295815326*G0_1_0_5_3 - 0.366329966329979*G0_1_0_5_5 + 0.323617123617135*G0_1_1_0_0 + 0.00665704665704687*G0_1_1_0_1 - 0.0619143819143839*G0_1_1_0_2 + 0.0167772967772973*G0_1_1_0_3 + 0.0821933621933649*G0_1_1_0_4 + 0.221029341029348*G0_1_1_0_5 + 0.00665704665704687*G0_1_1_1_0 - 0.371178451178464*G0_1_1_1_1 + 0.00973544973545009*G0_1_1_1_2 - 0.213641173641181*G0_1_1_1_3 - 0.0728042328042352*G0_1_1_1_4 - 0.195170755170762*G0_1_1_1_5 - 0.061914381914384*G0_1_1_2_0 + 0.00973544973545009*G0_1_1_2_1 + 0.337777777777788*G0_1_1_2_2 + 0.191476671476678*G0_1_1_2_3 + 0.092659932659936*G0_1_1_2_4 + 0.0524867724867744*G0_1_1_2_5 + 0.0167772967772973*G0_1_1_3_0 - 0.213641173641181*G0_1_1_3_1 + 0.191476671476678*G0_1_1_3_2 - 0.0375565175565183*G0_1_1_3_3 + 0.112053872053876*G0_1_1_3_4 - 0.138528138528143*G0_1_1_3_5 + 0.0821933621933649*G0_1_1_4_0 - 0.0728042328042352*G0_1_1_4_1 + 0.092659932659936*G0_1_1_4_2 + 0.112053872053876*G0_1_1_4_3 + 0.695103415103439*G0_1_1_4_4 + 0.0406349206349221*G0_1_1_4_5 + 0.221029341029348*G0_1_1_5_0 - 0.195170755170762*G0_1_1_5_1 + 0.0524867724867744*G0_1_1_5_2 - 0.138528138528143*G0_1_1_5_3 + 0.0406349206349221*G0_1_1_5_4 - 0.727118807118833*G0_1_1_5_5; + A[64] = A[160] - 0.33777777777779*G0_0_0_0_0 + 0.0619143819143839*G0_0_0_0_1 - 0.00973544973544991*G0_0_0_0_2 - 0.0524867724867741*G0_0_0_0_3 - 0.191476671476678*G0_0_0_0_4 - 0.0926599326599359*G0_0_0_0_5 + 0.0619143819143839*G0_0_0_1_0 - 0.323617123617135*G0_0_0_1_1 - 0.00665704665704685*G0_0_0_1_2 - 0.221029341029349*G0_0_0_1_3 - 0.0167772967772973*G0_0_0_1_4 - 0.0821933621933652*G0_0_0_1_5 - 0.00973544973544991*G0_0_0_2_0 - 0.00665704665704685*G0_0_0_2_1 + 0.371178451178463*G0_0_0_2_2 + 0.195170755170762*G0_0_0_2_3 + 0.213641173641181*G0_0_0_2_4 + 0.0728042328042354*G0_0_0_2_5 - 0.0524867724867741*G0_0_0_3_0 - 0.221029341029349*G0_0_0_3_1 + 0.195170755170762*G0_0_0_3_2 + 0.727118807118833*G0_0_0_3_3 + 0.138528138528143*G0_0_0_3_4 - 0.040634920634922*G0_0_0_3_5 - 0.191476671476678*G0_0_0_4_0 - 0.0167772967772973*G0_0_0_4_1 + 0.213641173641181*G0_0_0_4_2 + 0.138528138528143*G0_0_0_4_3 + 0.0375565175565188*G0_0_0_4_4 - 0.112053872053876*G0_0_0_4_5 - 0.0926599326599359*G0_0_0_5_0 - 0.0821933621933652*G0_0_0_5_1 + 0.0728042328042354*G0_0_0_5_2 - 0.040634920634922*G0_0_0_5_3 - 0.112053872053876*G0_0_0_5_4 - 0.69510341510344*G0_0_0_5_5 + 0.00962000962000972*G0_0_1_0_0 + 0.0260894660894669*G0_0_1_0_1 - 0.00973544973545005*G0_0_1_0_2 - 0.00769600769600788*G0_0_1_0_3 + 0.00584896584896602*G0_0_1_0_4 + 0.0660317460317485*G0_0_1_0_5 + 0.0260894660894669*G0_0_1_1_0 - 0.323617123617135*G0_0_1_1_1 + 0.0291678691678702*G0_0_1_1_2 - 0.160846560846566*G0_0_1_1_3 - 0.0167772967772973*G0_0_1_1_4 - 0.142376142376148*G0_0_1_1_5 - 0.00973544973545005*G0_0_1_2_0 + 0.0291678691678702*G0_0_1_2_1 + 0.0237806637806642*G0_0_1_2_2 + 0.0364790764790778*G0_0_1_2_3 + 0.0163155363155369*G0_0_1_2_4 + 0.028013468013469*G0_0_1_2_5 - 0.00769600769600788*G0_0_1_3_0 - 0.160846560846566*G0_0_1_3_1 + 0.0364790764790778*G0_0_1_3_2 + 0.360788840788854*G0_0_1_3_3 + 0.0489466089466106*G0_0_1_3_4 - 0.0406349206349221*G0_0_1_3_5 + 0.00584896584896602*G0_0_1_4_0 - 0.0167772967772973*G0_0_1_4_1 + 0.0163155363155369*G0_0_1_4_2 + 0.0489466089466106*G0_0_1_4_3 + 0.037556517556519*G0_0_1_4_4 - 0.0224723424723432*G0_0_1_4_5 + 0.0660317460317485*G0_0_1_5_0 - 0.142376142376148*G0_0_1_5_1 + 0.028013468013469*G0_0_1_5_2 - 0.0406349206349221*G0_0_1_5_3 - 0.0224723424723432*G0_0_1_5_4 - 0.328773448773461*G0_0_1_5_5 + 0.00962000962000972*G0_1_0_0_0 + 0.0260894660894669*G0_1_0_0_1 - 0.00973544973545005*G0_1_0_0_2 - 0.00769600769600788*G0_1_0_0_3 + 0.00584896584896602*G0_1_0_0_4 + 0.0660317460317485*G0_1_0_0_5 + 0.0260894660894669*G0_1_0_1_0 - 0.323617123617135*G0_1_0_1_1 + 0.0291678691678702*G0_1_0_1_2 - 0.160846560846566*G0_1_0_1_3 - 0.0167772967772973*G0_1_0_1_4 - 0.142376142376148*G0_1_0_1_5 - 0.00973544973545005*G0_1_0_2_0 + 0.0291678691678702*G0_1_0_2_1 + 0.0237806637806642*G0_1_0_2_2 + 0.0364790764790778*G0_1_0_2_3 + 0.0163155363155369*G0_1_0_2_4 + 0.028013468013469*G0_1_0_2_5 - 0.00769600769600787*G0_1_0_3_0 - 0.160846560846566*G0_1_0_3_1 + 0.0364790764790778*G0_1_0_3_2 + 0.360788840788854*G0_1_0_3_3 + 0.0489466089466106*G0_1_0_3_4 - 0.0406349206349221*G0_1_0_3_5 + 0.00584896584896602*G0_1_0_4_0 - 0.0167772967772973*G0_1_0_4_1 + 0.0163155363155369*G0_1_0_4_2 + 0.0489466089466106*G0_1_0_4_3 + 0.037556517556519*G0_1_0_4_4 - 0.0224723424723432*G0_1_0_4_5 + 0.0660317460317485*G0_1_0_5_0 - 0.142376142376148*G0_1_0_5_1 + 0.028013468013469*G0_1_0_5_2 - 0.0406349206349221*G0_1_0_5_3 - 0.0224723424723432*G0_1_0_5_4 - 0.328773448773461*G0_1_0_5_5 - 0.0141606541606546*G0_1_1_0_0 - 0.00307840307840329*G0_1_1_0_1 - 0.0357094757094768*G0_1_1_0_3 - 0.0104665704665708*G0_1_1_0_4 + 0.0295526695526705*G0_1_1_0_5 - 0.00307840307840329*G0_1_1_1_0 + 0.00307840307840308*G0_1_1_1_2 - 0.0184704184704185*G0_1_1_1_3 + 0.0184704184704195*G0_1_1_1_5 + 0.00307840307840308*G0_1_1_2_1 + 0.0141606541606546*G0_1_1_2_2 - 0.0295526695526707*G0_1_1_2_3 + 0.0104665704665708*G0_1_1_2_4 + 0.0357094757094769*G0_1_1_2_5 - 0.0357094757094768*G0_1_1_3_0 - 0.0184704184704185*G0_1_1_3_1 - 0.0295526695526707*G0_1_1_3_2 + 0.689562289562315*G0_1_1_3_3 + 0.0714189514189539*G0_1_1_3_4 - 0.0104665704665708*G0_1_1_4_0 + 0.0104665704665708*G0_1_1_4_2 + 0.0714189514189539*G0_1_1_4_3 - 0.0714189514189539*G0_1_1_4_5 + 0.0295526695526705*G0_1_1_5_0 + 0.0184704184704196*G0_1_1_5_1 + 0.0357094757094769*G0_1_1_5_2 - 0.0714189514189539*G0_1_1_5_4 - 0.689562289562314*G0_1_1_5_5; + A[166] = -A[46] - 0.0189065255731929*G0_0_0_0_0 + 0.00528031639142771*G0_0_0_0_1 + 0.00441665330554234*G0_0_0_0_2 + 0.00410453743787091*G0_0_0_0_3 - 0.00596868152423729*G0_0_0_0_4 - 0.00162471273582389*G0_0_0_0_5 + 0.00528031639142771*G0_0_0_1_0 - 0.188680455347129*G0_0_0_1_1 + 0.0052803163914277*G0_0_0_1_2 - 0.015392015392016*G0_0_0_1_3 + 0.00572925017369482*G0_0_0_1_4 - 0.0153920153920162*G0_0_0_1_5 + 0.00441665330554234*G0_0_0_2_0 + 0.0052803163914277*G0_0_0_2_1 - 0.0189065255731929*G0_0_0_2_2 - 0.0016247127358239*G0_0_0_2_3 - 0.00596868152423727*G0_0_0_2_4 + 0.00410453743787092*G0_0_0_2_5 + 0.0041045374378709*G0_0_0_3_0 - 0.015392015392016*G0_0_0_3_1 - 0.0016247127358239*G0_0_0_3_2 - 0.0328362995029673*G0_0_0_3_3 - 0.0196675752231314*G0_0_0_3_4 - 0.0164181497514837*G0_0_0_3_5 - 0.00596868152423729*G0_0_0_4_0 + 0.00572925017369482*G0_0_0_4_1 - 0.00596868152423727*G0_0_0_4_2 - 0.0196675752231314*G0_0_0_4_3 - 0.0870846026401609*G0_0_0_4_4 - 0.0196675752231315*G0_0_0_4_5 - 0.00162471273582389*G0_0_0_5_0 - 0.0153920153920162*G0_0_0_5_1 + 0.00410453743787092*G0_0_0_5_2 - 0.0164181497514837*G0_0_0_5_3 - 0.0196675752231315*G0_0_0_5_4 - 0.0328362995029674*G0_0_0_5_5; + A[115] = A[157] - 0.0988936988937025*G0_0_1_0_0 - 0.0071572871572874*G0_0_1_0_1 - 0.00715728715728738*G0_0_1_0_2 + 0.00354016354016369*G0_0_1_0_3 + 0.0484848484848501*G0_0_1_0_4 + 0.0484848484848501*G0_0_1_0_5 - 0.0071572871572874*G0_0_1_1_0 - 0.00084656084656093*G0_0_1_1_1 - 0.00142376142376149*G0_0_1_1_2 + 0.00461760461760481*G0_0_1_1_3 + 0.00831168831168863*G0_0_1_1_4 - 0.011544011544012*G0_0_1_1_5 - 0.00715728715728738*G0_0_1_2_0 - 0.00142376142376149*G0_0_1_2_1 - 0.000846560846560662*G0_0_1_2_2 + 0.00461760461760485*G0_0_1_2_3 - 0.0115440115440119*G0_0_1_2_4 + 0.00831168831168862*G0_0_1_2_5 + 0.00354016354016369*G0_0_1_3_0 + 0.00461760461760481*G0_0_1_3_1 + 0.00461760461760484*G0_0_1_3_2 - 0.00430976430976434*G0_0_1_3_3 - 0.0237037037037046*G0_0_1_3_4 - 0.0237037037037046*G0_0_1_3_5 + 0.0484848484848501*G0_0_1_4_0 + 0.00831168831168863*G0_0_1_4_1 - 0.0115440115440119*G0_0_1_4_2 - 0.0237037037037046*G0_0_1_4_3 + 0.0455603655603662*G0_0_1_4_4 - 0.0332467532467545*G0_0_1_4_5 + 0.0484848484848501*G0_0_1_5_0 - 0.011544011544012*G0_0_1_5_1 + 0.00831168831168861*G0_0_1_5_2 - 0.0237037037037046*G0_0_1_5_3 - 0.0332467532467545*G0_0_1_5_4 + 0.045560365560367*G0_0_1_5_5 + 0.0988936988937025*G0_1_0_0_0 + 0.0071572871572874*G0_1_0_0_1 + 0.00715728715728738*G0_1_0_0_2 - 0.00354016354016369*G0_1_0_0_3 - 0.0484848484848501*G0_1_0_0_4 - 0.0484848484848501*G0_1_0_0_5 + 0.0071572871572874*G0_1_0_1_0 + 0.000846560846560929*G0_1_0_1_1 + 0.00142376142376149*G0_1_0_1_2 - 0.00461760461760481*G0_1_0_1_3 - 0.00831168831168863*G0_1_0_1_4 + 0.011544011544012*G0_1_0_1_5 + 0.00715728715728738*G0_1_0_2_0 + 0.00142376142376149*G0_1_0_2_1 + 0.000846560846560662*G0_1_0_2_2 - 0.00461760461760485*G0_1_0_2_3 + 0.0115440115440119*G0_1_0_2_4 - 0.00831168831168861*G0_1_0_2_5 - 0.00354016354016369*G0_1_0_3_0 - 0.00461760461760481*G0_1_0_3_1 - 0.00461760461760484*G0_1_0_3_2 + 0.00430976430976433*G0_1_0_3_3 + 0.0237037037037046*G0_1_0_3_4 + 0.0237037037037046*G0_1_0_3_5 - 0.0484848484848501*G0_1_0_4_0 - 0.00831168831168863*G0_1_0_4_1 + 0.0115440115440119*G0_1_0_4_2 + 0.0237037037037046*G0_1_0_4_3 - 0.0455603655603662*G0_1_0_4_4 + 0.0332467532467545*G0_1_0_4_5 - 0.0484848484848501*G0_1_0_5_0 + 0.011544011544012*G0_1_0_5_1 - 0.00831168831168861*G0_1_0_5_2 + 0.0237037037037046*G0_1_0_5_3 + 0.0332467532467545*G0_1_0_5_4 - 0.045560365560367*G0_1_0_5_5; + A[224] = A[208] - 0.0197017797017803*G0_0_0_0_0 + 0.0295526695526705*G0_0_0_0_1 - 0.0738816738816763*G0_0_0_0_2 + 0.0197017797017803*G0_0_0_0_3 - 0.157614237614243*G0_0_0_0_4 + 0.0394035594035607*G0_0_0_0_5 + 0.0295526695526705*G0_0_0_1_0 - 0.275824915824925*G0_0_0_1_1 - 0.0147763347763354*G0_0_0_1_2 - 0.51224627224629*G0_0_0_1_3 - 0.0197017797017804*G0_0_0_1_4 - 0.0197017797017808*G0_0_0_1_5 - 0.0738816738816763*G0_0_0_2_0 - 0.0147763347763354*G0_0_0_2_1 + 0.334930254930267*G0_0_0_2_2 + 0.591053391053413*G0_0_0_2_3 + 0.433439153439168*G0_0_0_2_4 + 0.137912457912463*G0_0_0_2_5 + 0.0197017797017803*G0_0_0_3_0 - 0.51224627224629*G0_0_0_3_1 + 0.591053391053413*G0_0_0_3_2 - 0.315228475228486*G0_0_0_3_5 - 0.157614237614243*G0_0_0_4_0 - 0.0197017797017803*G0_0_0_4_1 + 0.433439153439168*G0_0_0_4_2 + 0.630456950456972*G0_0_0_4_4 - 0.236421356421364*G0_0_0_4_5 + 0.0394035594035607*G0_0_0_5_0 - 0.0197017797017808*G0_0_0_5_1 + 0.137912457912463*G0_0_0_5_2 - 0.315228475228486*G0_0_0_5_3 - 0.236421356421364*G0_0_0_5_4 - 0.472842712842729*G0_0_0_5_5 + 0.0221645021645028*G0_0_1_0_1 - 0.0221645021645029*G0_0_1_0_2 - 0.0197017797017802*G0_0_1_0_4 + 0.0197017797017805*G0_0_1_0_5 + 0.0221645021645028*G0_0_1_1_0 - 0.177316017316023*G0_0_1_1_1 - 0.52209716209718*G0_0_1_1_3 - 0.0591053391053411*G0_0_1_1_4 - 0.0492544492544511*G0_0_1_1_5 - 0.0221645021645029*G0_0_1_2_0 + 0.177316017316024*G0_0_1_2_2 + 0.522097162097181*G0_0_1_2_3 + 0.0492544492544511*G0_0_1_2_4 + 0.0591053391053413*G0_0_1_2_5 - 0.52209716209718*G0_0_1_3_1 + 0.522097162097181*G0_0_1_3_2 + 0.118210678210682*G0_0_1_3_4 - 0.118210678210682*G0_0_1_3_5 - 0.0197017797017802*G0_0_1_4_0 - 0.0591053391053411*G0_0_1_4_1 + 0.0492544492544511*G0_0_1_4_2 + 0.118210678210682*G0_0_1_4_3 + 0.236421356421363*G0_0_1_4_4 + 0.0197017797017805*G0_0_1_5_0 - 0.0492544492544511*G0_0_1_5_1 + 0.0591053391053413*G0_0_1_5_2 - 0.118210678210682*G0_0_1_5_3 - 0.236421356421364*G0_0_1_5_5 + 0.0221645021645028*G0_1_0_0_1 - 0.0221645021645029*G0_1_0_0_2 - 0.0197017797017802*G0_1_0_0_4 + 0.0197017797017805*G0_1_0_0_5 + 0.0221645021645028*G0_1_0_1_0 - 0.177316017316023*G0_1_0_1_1 - 0.52209716209718*G0_1_0_1_3 - 0.0591053391053411*G0_1_0_1_4 - 0.0492544492544511*G0_1_0_1_5 - 0.0221645021645029*G0_1_0_2_0 + 0.177316017316024*G0_1_0_2_2 + 0.522097162097181*G0_1_0_2_3 + 0.0492544492544511*G0_1_0_2_4 + 0.0591053391053413*G0_1_0_2_5 - 0.52209716209718*G0_1_0_3_1 + 0.522097162097181*G0_1_0_3_2 + 0.118210678210682*G0_1_0_3_4 - 0.118210678210682*G0_1_0_3_5 - 0.0197017797017802*G0_1_0_4_0 - 0.0591053391053411*G0_1_0_4_1 + 0.0492544492544511*G0_1_0_4_2 + 0.118210678210682*G0_1_0_4_3 + 0.236421356421363*G0_1_0_4_4 + 0.0197017797017805*G0_1_0_5_0 - 0.0492544492544511*G0_1_0_5_1 + 0.0591053391053413*G0_1_0_5_2 - 0.118210678210682*G0_1_0_5_3 - 0.236421356421364*G0_1_0_5_5 + 0.0197017797017808*G0_1_1_0_0 + 0.0738816738816762*G0_1_1_0_1 - 0.0295526695526706*G0_1_1_0_2 - 0.0197017797017802*G0_1_1_0_3 - 0.0394035594035605*G0_1_1_0_4 + 0.157614237614244*G0_1_1_0_5 + 0.0738816738816762*G0_1_1_1_0 - 0.334930254930266*G0_1_1_1_1 + 0.0147763347763351*G0_1_1_1_2 - 0.591053391053411*G0_1_1_1_3 - 0.137912457912462*G0_1_1_1_4 - 0.433439153439169*G0_1_1_1_5 - 0.0295526695526706*G0_1_1_2_0 + 0.0147763347763351*G0_1_1_2_1 + 0.275824915824926*G0_1_1_2_2 + 0.512246272246291*G0_1_1_2_3 + 0.0197017797017806*G0_1_1_2_4 + 0.0197017797017806*G0_1_1_2_5 - 0.0197017797017802*G0_1_1_3_0 - 0.591053391053411*G0_1_1_3_1 + 0.512246272246291*G0_1_1_3_2 + 0.315228475228486*G0_1_1_3_4 - 0.0394035594035605*G0_1_1_4_0 - 0.137912457912462*G0_1_1_4_1 + 0.0197017797017806*G0_1_1_4_2 + 0.315228475228486*G0_1_1_4_3 + 0.472842712842728*G0_1_1_4_4 + 0.236421356421364*G0_1_1_4_5 + 0.157614237614244*G0_1_1_5_0 - 0.433439153439169*G0_1_1_5_1 + 0.0197017797017807*G0_1_1_5_2 + 0.236421356421364*G0_1_1_5_4 - 0.630456950456974*G0_1_1_5_5; + A[190] = A[162] + 0.0123136123136126*G0_0_1_0_0 + 0.0252429052429061*G0_0_1_0_1 + 0.00215488215488223*G0_0_1_0_2 - 0.0166233766233772*G0_0_1_0_3 + 0.00769600769600802*G0_0_1_0_4 - 0.18316498316499*G0_0_1_0_5 + 0.0252429052429061*G0_0_1_1_0 + 0.0153920153920162*G0_0_1_1_1 - 0.00277056277056289*G0_0_1_1_2 + 0.00831168831168867*G0_0_1_1_3 - 0.00800384800384827*G0_0_1_1_4 + 0.0735738335738364*G0_0_1_1_5 + 0.00215488215488223*G0_0_1_2_0 - 0.00277056277056289*G0_0_1_2_1 + 0.00677248677248703*G0_0_1_2_2 - 0.0138528138528143*G0_0_1_2_3 - 0.0243193843193852*G0_0_1_2_4 - 0.00861952861952892*G0_0_1_2_5 - 0.0166233766233772*G0_0_1_3_0 + 0.00831168831168867*G0_0_1_3_1 - 0.0138528138528143*G0_0_1_3_2 + 0.0714189514189536*G0_0_1_3_3 + 0.0492544492544509*G0_0_1_3_4 + 0.0504858104858122*G0_0_1_3_5 + 0.00769600769600802*G0_0_1_4_0 - 0.00800384800384828*G0_0_1_4_1 - 0.0243193843193852*G0_0_1_4_2 + 0.0492544492544509*G0_0_1_4_3 + 0.145300625300631*G0_0_1_4_4 + 0.0332467532467543*G0_0_1_4_5 - 0.18316498316499*G0_0_1_5_0 + 0.0735738335738364*G0_0_1_5_1 - 0.00861952861952891*G0_0_1_5_2 + 0.0504858104858122*G0_0_1_5_3 + 0.0332467532467543*G0_0_1_5_4 - 0.236421356421364*G0_0_1_5_5 - 0.0123136123136126*G0_1_0_0_0 - 0.0252429052429061*G0_1_0_0_1 - 0.00215488215488223*G0_1_0_0_2 + 0.0166233766233772*G0_1_0_0_3 - 0.00769600769600802*G0_1_0_0_4 + 0.18316498316499*G0_1_0_0_5 - 0.0252429052429061*G0_1_0_1_0 - 0.0153920153920162*G0_1_0_1_1 + 0.00277056277056289*G0_1_0_1_2 - 0.00831168831168867*G0_1_0_1_3 + 0.00800384800384827*G0_1_0_1_4 - 0.0735738335738364*G0_1_0_1_5 - 0.00215488215488223*G0_1_0_2_0 + 0.00277056277056289*G0_1_0_2_1 - 0.00677248677248703*G0_1_0_2_2 + 0.0138528138528143*G0_1_0_2_3 + 0.0243193843193852*G0_1_0_2_4 + 0.00861952861952892*G0_1_0_2_5 + 0.0166233766233772*G0_1_0_3_0 - 0.00831168831168867*G0_1_0_3_1 + 0.0138528138528143*G0_1_0_3_2 - 0.0714189514189536*G0_1_0_3_3 - 0.0492544492544509*G0_1_0_3_4 - 0.0504858104858122*G0_1_0_3_5 - 0.00769600769600802*G0_1_0_4_0 + 0.00800384800384827*G0_1_0_4_1 + 0.0243193843193852*G0_1_0_4_2 - 0.0492544492544509*G0_1_0_4_3 - 0.145300625300631*G0_1_0_4_4 - 0.0332467532467543*G0_1_0_4_5 + 0.18316498316499*G0_1_0_5_0 - 0.0735738335738364*G0_1_0_5_1 + 0.00861952861952891*G0_1_0_5_2 - 0.0504858104858122*G0_1_0_5_3 - 0.0332467532467543*G0_1_0_5_4 + 0.236421356421365*G0_1_0_5_5; + A[206] = -A[198] - 0.0615680615680636*G0_0_0_0_0 + 0.00800384800384827*G0_0_0_0_1 + 0.0186756453423126*G0_0_0_0_2 + 0.0492544492544509*G0_0_0_0_3 - 0.0213435946769287*G0_0_0_0_4 - 0.00656725990059345*G0_0_0_0_5 + 0.00800384800384827*G0_0_0_1_0 + 0.00820907487574177*G0_0_0_1_1 + 0.0203174603174611*G0_0_0_1_2 - 0.0985088985089023*G0_0_0_1_3 + 0.0394035594035607*G0_0_0_1_4 + 0.0186756453423126*G0_0_0_2_0 + 0.0203174603174611*G0_0_0_2_1 - 0.0627994227994251*G0_0_0_2_2 + 0.066493506493509*G0_0_0_2_3 - 0.0139554272887611*G0_0_0_2_4 + 0.0254481321147997*G0_0_0_2_5 + 0.0492544492544509*G0_0_0_3_0 - 0.0985088985089023*G0_0_0_3_1 + 0.066493506493509*G0_0_0_3_2 - 0.728965848965875*G0_0_0_3_3 - 0.177316017316023*G0_0_0_3_4 - 0.149405162738501*G0_0_0_3_5 - 0.0213435946769287*G0_0_0_4_0 + 0.0394035594035607*G0_0_0_4_1 - 0.0139554272887611*G0_0_0_4_2 - 0.177316017316023*G0_0_0_4_3 - 0.663293249959938*G0_0_0_4_4 - 0.129703383036721*G0_0_0_4_5 - 0.00656725990059345*G0_0_0_5_0 + 0.0254481321147997*G0_0_0_5_2 - 0.149405162738501*G0_0_0_5_3 - 0.129703383036721*G0_0_0_5_4 - 0.0558217091550446*G0_0_0_5_5 + 0.00123136123136142*G0_1_0_0_0 - 0.0123136123136127*G0_1_0_0_1 + 0.0238063171396513*G0_1_0_0_3 - 0.00738816738816753*G0_1_0_0_4 - 0.0730607663941021*G0_1_0_0_5 - 0.0123136123136127*G0_1_0_1_0 + 0.0123136123136128*G0_1_0_1_2 - 0.0985088985089024*G0_1_0_1_3 + 0.0985088985089017*G0_1_0_1_5 + 0.0123136123136128*G0_1_0_2_1 - 0.00123136123136155*G0_1_0_2_2 + 0.0730607663941024*G0_1_0_2_3 + 0.00738816738816751*G0_1_0_2_4 - 0.0238063171396512*G0_1_0_2_5 + 0.0238063171396513*G0_1_0_3_0 - 0.0985088985089024*G0_1_0_3_1 + 0.0730607663941024*G0_1_0_3_2 - 0.673144139810831*G0_1_0_3_3 - 0.0476126342793027*G0_1_0_3_4 - 0.00738816738816753*G0_1_0_4_0 + 0.00738816738816751*G0_1_0_4_2 - 0.0476126342793027*G0_1_0_4_3 + 0.0476126342793024*G0_1_0_4_5 - 0.0730607663941021*G0_1_0_5_0 + 0.0985088985089017*G0_1_0_5_1 - 0.0238063171396512*G0_1_0_5_2 + 0.0476126342793024*G0_1_0_5_4 + 0.67314413981083*G0_1_0_5_5; + A[178] = A[206] - 0.00328362995029661*G0_0_1_0_0 + 0.00636203302869998*G0_0_1_0_1 + 0.000615680615680622*G0_0_1_0_2 + 0.0106717973384644*G0_0_1_0_3 - 0.0061568061568063*G0_0_1_0_4 - 0.0488439955106638*G0_0_1_0_5 + 0.00636203302869998*G0_0_1_1_0 - 0.192913259579934*G0_0_1_1_1 + 0.0186756453423127*G0_0_1_1_2 - 0.088247554914225*G0_0_1_1_3 - 0.0024627224627225*G0_0_1_1_4 + 0.010261343594677*G0_0_1_1_5 + 0.000615680615680622*G0_0_1_2_0 + 0.0186756453423127*G0_0_1_2_1 - 0.00451499118165805*G0_0_1_2_2 + 0.0242167708834385*G0_0_1_2_3 + 0.00123136123136129*G0_0_1_2_4 - 0.0131345198011869*G0_0_1_2_5 + 0.0106717973384644*G0_0_1_3_0 - 0.088247554914225*G0_0_1_3_1 + 0.0242167708834385*G0_0_1_3_2 - 0.160897867564541*G0_0_1_3_3 - 0.0164181497514838*G0_0_1_3_4 + 0.00492544492544474*G0_0_1_3_5 - 0.0061568061568063*G0_0_1_4_0 - 0.0024627224627225*G0_0_1_4_1 + 0.00123136123136129*G0_0_1_4_2 - 0.0164181497514838*G0_0_1_4_3 - 0.0164181497514839*G0_0_1_4_4 + 0.0311944845278187*G0_0_1_4_5 - 0.0488439955106638*G0_0_1_5_0 + 0.010261343594677*G0_0_1_5_1 - 0.0131345198011869*G0_0_1_5_2 + 0.00492544492544474*G0_0_1_5_3 + 0.0311944845278187*G0_0_1_5_4 + 0.51224627224629*G0_0_1_5_5 + 0.00328362995029661*G0_1_0_0_0 - 0.00636203302869998*G0_1_0_0_1 - 0.000615680615680622*G0_1_0_0_2 - 0.0106717973384644*G0_1_0_0_3 + 0.0061568061568063*G0_1_0_0_4 + 0.0488439955106638*G0_1_0_0_5 - 0.00636203302869998*G0_1_0_1_0 + 0.192913259579934*G0_1_0_1_1 - 0.0186756453423127*G0_1_0_1_2 + 0.088247554914225*G0_1_0_1_3 + 0.0024627224627225*G0_1_0_1_4 - 0.010261343594677*G0_1_0_1_5 - 0.000615680615680622*G0_1_0_2_0 - 0.0186756453423127*G0_1_0_2_1 + 0.00451499118165805*G0_1_0_2_2 - 0.0242167708834385*G0_1_0_2_3 - 0.00123136123136129*G0_1_0_2_4 + 0.0131345198011868*G0_1_0_2_5 - 0.0106717973384644*G0_1_0_3_0 + 0.088247554914225*G0_1_0_3_1 - 0.0242167708834385*G0_1_0_3_2 + 0.160897867564541*G0_1_0_3_3 + 0.0164181497514838*G0_1_0_3_4 - 0.00492544492544474*G0_1_0_3_5 + 0.0061568061568063*G0_1_0_4_0 + 0.0024627224627225*G0_1_0_4_1 - 0.00123136123136129*G0_1_0_4_2 + 0.0164181497514838*G0_1_0_4_3 + 0.0164181497514839*G0_1_0_4_4 - 0.0311944845278187*G0_1_0_4_5 + 0.0488439955106638*G0_1_0_5_0 - 0.010261343594677*G0_1_0_5_1 + 0.0131345198011869*G0_1_0_5_2 - 0.00492544492544474*G0_1_0_5_3 - 0.0311944845278187*G0_1_0_5_4 - 0.51224627224629*G0_1_0_5_5; + A[0] = A[16] + 0.16430976430977*G0_0_0_0_0 - 0.00892523114745369*G0_0_0_0_2 + 0.00389075944631512*G0_0_0_0_3 + 0.0366415477526602*G0_0_0_0_4 + 0.0414729303618208*G0_0_0_0_5 - 0.16430976430977*G0_0_0_1_1 + 0.00892523114745369*G0_0_0_1_2 - 0.0366415477526602*G0_0_0_1_3 - 0.00389075944631512*G0_0_0_1_4 - 0.0414729303618209*G0_0_0_1_5 - 0.00892523114745369*G0_0_0_2_0 + 0.00892523114745369*G0_0_0_2_1 + 0.00483138260916056*G0_0_0_2_3 - 0.00483138260916055*G0_0_0_2_4 + 0.00389075944631512*G0_0_0_3_0 - 0.0366415477526602*G0_0_0_3_1 + 0.00483138260916056*G0_0_0_3_2 - 0.00803805248249723*G0_0_0_3_3 - 0.00778151889263032*G0_0_0_3_5 + 0.0366415477526602*G0_0_0_4_0 - 0.00389075944631512*G0_0_0_4_1 - 0.00483138260916055*G0_0_0_4_2 + 0.00803805248249725*G0_0_0_4_4 + 0.00778151889263029*G0_0_0_4_5 + 0.0414729303618208*G0_0_0_5_0 - 0.0414729303618209*G0_0_0_5_1 - 0.00778151889263032*G0_0_0_5_3 + 0.00778151889263029*G0_0_0_5_4 + 0.168726952060291*G0_0_1_0_0 - 0.00916973972529559*G0_0_1_0_1 - 0.0091697397252956*G0_0_1_0_2 + 0.000903212014323139*G0_0_1_0_3 + 0.0375821709155056*G0_0_1_0_4 + 0.0375821709155056*G0_0_1_0_5 - 0.00916973972529559*G0_0_1_1_0 + 0.0044171877505212*G0_0_1_1_1 - 0.000244508577841916*G0_0_1_1_2 + 0.000940623162845404*G0_0_1_1_3 - 0.00298754743199198*G0_0_1_1_4 - 0.00389075944631516*G0_0_1_1_5 - 0.0091697397252956*G0_0_1_2_0 - 0.000244508577841916*G0_0_1_2_1 + 0.00441718775052124*G0_0_1_2_2 + 0.000940623162845423*G0_0_1_2_3 - 0.00389075944631513*G0_0_1_2_4 - 0.00298754743199198*G0_0_1_2_5 + 0.000903212014323139*G0_0_1_3_0 + 0.000940623162845403*G0_0_1_3_1 + 0.000940623162845423*G0_0_1_3_2 + 0.0158623269734386*G0_0_1_3_3 + 0.00416867083533764*G0_0_1_3_4 + 0.00416867083533764*G0_0_1_3_5 + 0.0375821709155056*G0_0_1_4_0 - 0.00298754743199198*G0_0_1_4_1 - 0.00389075944631513*G0_0_1_4_2 + 0.00416867083533764*G0_0_1_4_3 + 0.0239003794559358*G0_0_1_4_4 + 0.0119501897279679*G0_0_1_4_5 + 0.0375821709155056*G0_0_1_5_0 - 0.00389075944631516*G0_0_1_5_1 - 0.00298754743199198*G0_0_1_5_2 + 0.00416867083533764*G0_0_1_5_3 + 0.0119501897279679*G0_0_1_5_4 + 0.0239003794559359*G0_0_1_5_5 + 0.168726952060291*G0_1_0_0_0 - 0.00916973972529559*G0_1_0_0_1 - 0.0091697397252956*G0_1_0_0_2 + 0.000903212014323139*G0_1_0_0_3 + 0.0375821709155056*G0_1_0_0_4 + 0.0375821709155056*G0_1_0_0_5 - 0.00916973972529559*G0_1_0_1_0 + 0.0044171877505212*G0_1_0_1_1 - 0.000244508577841916*G0_1_0_1_2 + 0.000940623162845404*G0_1_0_1_3 - 0.00298754743199198*G0_1_0_1_4 - 0.00389075944631516*G0_1_0_1_5 - 0.0091697397252956*G0_1_0_2_0 - 0.000244508577841916*G0_1_0_2_1 + 0.00441718775052124*G0_1_0_2_2 + 0.000940623162845423*G0_1_0_2_3 - 0.00389075944631513*G0_1_0_2_4 - 0.00298754743199198*G0_1_0_2_5 + 0.000903212014323139*G0_1_0_3_0 + 0.000940623162845403*G0_1_0_3_1 + 0.000940623162845423*G0_1_0_3_2 + 0.0158623269734386*G0_1_0_3_3 + 0.00416867083533764*G0_1_0_3_4 + 0.00416867083533764*G0_1_0_3_5 + 0.0375821709155056*G0_1_0_4_0 - 0.00298754743199198*G0_1_0_4_1 - 0.00389075944631513*G0_1_0_4_2 + 0.00416867083533764*G0_1_0_4_3 + 0.0239003794559358*G0_1_0_4_4 + 0.0119501897279679*G0_1_0_4_5 + 0.0375821709155056*G0_1_0_5_0 - 0.00389075944631516*G0_1_0_5_1 - 0.00298754743199198*G0_1_0_5_2 + 0.00416867083533764*G0_1_0_5_3 + 0.0119501897279679*G0_1_0_5_4 + 0.0239003794559359*G0_1_0_5_5 + 0.168726952060291*G0_1_1_0_0 - 0.00916973972529559*G0_1_1_0_1 - 0.0091697397252956*G0_1_1_0_2 + 0.000903212014323138*G0_1_1_0_3 + 0.0375821709155055*G0_1_1_0_4 + 0.0375821709155056*G0_1_1_0_5 - 0.00916973972529559*G0_1_1_1_0 + 0.00441718775052122*G0_1_1_1_1 - 0.000244508577841918*G0_1_1_1_2 + 0.000940623162845407*G0_1_1_1_3 - 0.00298754743199198*G0_1_1_1_4 - 0.00389075944631514*G0_1_1_1_5 - 0.0091697397252956*G0_1_1_2_0 - 0.000244508577841918*G0_1_1_2_1 + 0.00441718775052125*G0_1_1_2_2 + 0.000940623162845425*G0_1_1_2_3 - 0.00389075944631513*G0_1_1_2_4 - 0.00298754743199198*G0_1_1_2_5 + 0.000903212014323138*G0_1_1_3_0 + 0.000940623162845407*G0_1_1_3_1 + 0.000940623162845425*G0_1_1_3_2 + 0.0158623269734386*G0_1_1_3_3 + 0.00416867083533764*G0_1_1_3_4 + 0.00416867083533764*G0_1_1_3_5 + 0.0375821709155055*G0_1_1_4_0 - 0.00298754743199198*G0_1_1_4_1 - 0.00389075944631513*G0_1_1_4_2 + 0.00416867083533764*G0_1_1_4_3 + 0.0239003794559358*G0_1_1_4_4 + 0.0119501897279679*G0_1_1_4_5 + 0.0375821709155056*G0_1_1_5_0 - 0.00389075944631514*G0_1_1_5_1 - 0.00298754743199198*G0_1_1_5_2 + 0.00416867083533764*G0_1_1_5_3 + 0.0119501897279679*G0_1_1_5_4 + 0.0239003794559359*G0_1_1_5_5; + A[58] = -A[178] - 0.0615680615680636*G0_0_0_0_0 + 0.00800384800384827*G0_0_0_0_1 + 0.0186756453423126*G0_0_0_0_2 + 0.0492544492544509*G0_0_0_0_3 - 0.0213435946769288*G0_0_0_0_4 - 0.00656725990059346*G0_0_0_0_5 + 0.00800384800384827*G0_0_0_1_0 + 0.00820907487574177*G0_0_0_1_1 + 0.0203174603174611*G0_0_0_1_2 - 0.0985088985089023*G0_0_0_1_3 + 0.0394035594035607*G0_0_0_1_4 + 0.0186756453423126*G0_0_0_2_0 + 0.0203174603174611*G0_0_0_2_1 - 0.0627994227994251*G0_0_0_2_2 + 0.066493506493509*G0_0_0_2_3 - 0.0139554272887611*G0_0_0_2_4 + 0.0254481321147997*G0_0_0_2_5 + 0.0492544492544509*G0_0_0_3_0 - 0.0985088985089023*G0_0_0_3_1 + 0.066493506493509*G0_0_0_3_2 - 0.728965848965875*G0_0_0_3_3 - 0.177316017316023*G0_0_0_3_4 - 0.149405162738501*G0_0_0_3_5 - 0.0213435946769288*G0_0_0_4_0 + 0.0394035594035607*G0_0_0_4_1 - 0.0139554272887611*G0_0_0_4_2 - 0.177316017316023*G0_0_0_4_3 - 0.663293249959938*G0_0_0_4_4 - 0.129703383036721*G0_0_0_4_5 - 0.00656725990059345*G0_0_0_5_0 + 0.0254481321147997*G0_0_0_5_2 - 0.149405162738501*G0_0_0_5_3 - 0.129703383036721*G0_0_0_5_4 - 0.0558217091550445*G0_0_0_5_5 + 0.00123136123136142*G0_0_1_0_0 - 0.0123136123136127*G0_0_1_0_1 + 0.0238063171396513*G0_0_1_0_3 - 0.00738816738816753*G0_0_1_0_4 - 0.0730607663941021*G0_0_1_0_5 - 0.0123136123136127*G0_0_1_1_0 + 0.0123136123136128*G0_0_1_1_2 - 0.0985088985089024*G0_0_1_1_3 + 0.0985088985089017*G0_0_1_1_5 + 0.0123136123136128*G0_0_1_2_1 - 0.00123136123136155*G0_0_1_2_2 + 0.0730607663941024*G0_0_1_2_3 + 0.00738816738816751*G0_0_1_2_4 - 0.0238063171396512*G0_0_1_2_5 + 0.0238063171396513*G0_0_1_3_0 - 0.0985088985089024*G0_0_1_3_1 + 0.0730607663941024*G0_0_1_3_2 - 0.673144139810831*G0_0_1_3_3 - 0.0476126342793027*G0_0_1_3_4 - 0.00738816738816753*G0_0_1_4_0 + 0.00738816738816751*G0_0_1_4_2 - 0.0476126342793027*G0_0_1_4_3 + 0.0476126342793024*G0_0_1_4_5 - 0.0730607663941021*G0_0_1_5_0 + 0.0985088985089017*G0_0_1_5_1 - 0.0238063171396512*G0_0_1_5_2 + 0.0476126342793024*G0_0_1_5_4 + 0.67314413981083*G0_0_1_5_5; + A[131] = -A[86] + 0.0143658810325483*G0_1_0_0_0 + 0.00280476724921183*G0_1_0_0_1 + 0.000684089572978482*G0_1_0_0_2 + 0.00738816738816764*G0_1_0_0_3 - 0.00766180321735896*G0_1_0_0_4 - 0.019838597616376*G0_1_0_0_5 + 0.00280476724921183*G0_1_0_1_0 - 0.114106140772813*G0_1_0_1_1 + 0.0017786328897441*G0_1_0_1_2 + 0.00574635241301914*G0_1_0_1_3 + 0.000547271658382813*G0_1_0_1_4 + 0.0061568061568061*G0_1_0_1_5 + 0.00068408957297848*G0_1_0_2_0 + 0.0017786328897441*G0_1_0_2_1 - 0.0054727165838279*G0_1_0_2_3 + 0.00547271658382784*G0_1_0_2_4 - 0.00246272246272256*G0_1_0_2_5 + 0.00738816738816764*G0_1_0_3_0 + 0.00574635241301914*G0_1_0_3_1 - 0.0054727165838279*G0_1_0_3_2 - 0.0158708780931009*G0_1_0_3_4 - 0.00985088985089017*G0_1_0_3_5 - 0.00766180321735897*G0_1_0_4_0 + 0.000547271658382813*G0_1_0_4_1 + 0.00547271658382784*G0_1_0_4_2 - 0.0158708780931009*G0_1_0_4_3 + 0.0317417561862018*G0_1_0_4_4 + 0.00383090160867952*G0_1_0_4_5 - 0.019838597616376*G0_1_0_5_0 + 0.0061568061568061*G0_1_0_5_1 - 0.00246272246272256*G0_1_0_5_2 - 0.00985088985089016*G0_1_0_5_3 + 0.00383090160867952*G0_1_0_5_4 + 0.121494308160979*G0_1_0_5_5 - 0.00574635241301937*G0_1_1_0_0 + 0.0160076960076967*G0_1_1_0_1 + 0.000752498530276326*G0_1_1_0_2 - 0.00177863288974404*G0_1_1_0_3 + 0.00424135535246658*G0_1_1_0_4 + 0.0158708780931009*G0_1_1_0_5 + 0.0160076960076967*G0_1_1_1_0 - 0.192913259579935*G0_1_1_1_1 + 0.000684089572978537*G0_1_1_1_2 + 0.00643044198599756*G0_1_1_1_3 + 0.00177863288974407*G0_1_1_1_4 - 0.0803121158676748*G0_1_1_1_5 + 0.000752498530276326*G0_1_1_2_0 + 0.000684089572978537*G0_1_1_2_1 + 0.00410453743787088*G0_1_1_2_2 - 0.0109454331676558*G0_1_1_2_3 - 0.00547271658382786*G0_1_1_2_4 - 0.000410453743787046*G0_1_1_2_5 - 0.00177863288974404*G0_1_1_3_0 + 0.00643044198599757*G0_1_1_3_1 - 0.0109454331676558*G0_1_1_3_2 + 0.0651253273475519*G0_1_1_3_3 + 0.00437817326706219*G0_1_1_3_5 + 0.00424135535246658*G0_1_1_4_0 + 0.00177863288974407*G0_1_1_4_1 - 0.00547271658382786*G0_1_1_4_2 - 0.0158708780931008*G0_1_1_4_4 - 0.00273635829191398*G0_1_1_4_5 + 0.0158708780931009*G0_1_1_5_0 - 0.0803121158676748*G0_1_1_5_1 - 0.000410453743787047*G0_1_1_5_2 + 0.00437817326706219*G0_1_1_5_3 - 0.00273635829191398*G0_1_1_5_4 - 0.0902998236331606*G0_1_1_5_5; + A[74] = A[214] + 0.00677248677248694*G0_0_1_0_0 - 0.00277056277056284*G0_0_1_0_1 + 0.0021548821548822*G0_0_1_0_2 - 0.00861952861952894*G0_0_1_0_3 - 0.0243193843193851*G0_0_1_0_4 - 0.0138528138528143*G0_0_1_0_5 - 0.00277056277056284*G0_0_1_1_0 + 0.0153920153920161*G0_0_1_1_1 + 0.0252429052429061*G0_0_1_1_2 + 0.0735738335738363*G0_0_1_1_3 - 0.00800384800384827*G0_0_1_1_4 + 0.00831168831168866*G0_0_1_1_5 + 0.0021548821548822*G0_0_1_2_0 + 0.0252429052429061*G0_0_1_2_1 + 0.0123136123136123*G0_0_1_2_2 - 0.18316498316499*G0_0_1_2_3 + 0.00769600769600795*G0_0_1_2_4 - 0.0166233766233772*G0_0_1_2_5 - 0.00861952861952894*G0_0_1_3_0 + 0.0735738335738363*G0_0_1_3_1 - 0.18316498316499*G0_0_1_3_2 - 0.236421356421364*G0_0_1_3_3 + 0.0332467532467542*G0_0_1_3_4 + 0.050485810485812*G0_0_1_3_5 - 0.0243193843193851*G0_0_1_4_0 - 0.00800384800384827*G0_0_1_4_1 + 0.00769600769600795*G0_0_1_4_2 + 0.0332467532467543*G0_0_1_4_3 + 0.145300625300631*G0_0_1_4_4 + 0.0492544492544509*G0_0_1_4_5 - 0.0138528138528143*G0_0_1_5_0 + 0.00831168831168866*G0_0_1_5_1 - 0.0166233766233772*G0_0_1_5_2 + 0.050485810485812*G0_0_1_5_3 + 0.0492544492544509*G0_0_1_5_4 + 0.0714189514189529*G0_0_1_5_5 - 0.00677248677248694*G0_1_0_0_0 + 0.00277056277056284*G0_1_0_0_1 - 0.0021548821548822*G0_1_0_0_2 + 0.00861952861952893*G0_1_0_0_3 + 0.0243193843193851*G0_1_0_0_4 + 0.0138528138528143*G0_1_0_0_5 + 0.00277056277056284*G0_1_0_1_0 - 0.0153920153920161*G0_1_0_1_1 - 0.0252429052429061*G0_1_0_1_2 - 0.0735738335738363*G0_1_0_1_3 + 0.00800384800384827*G0_1_0_1_4 - 0.00831168831168866*G0_1_0_1_5 - 0.0021548821548822*G0_1_0_2_0 - 0.0252429052429061*G0_1_0_2_1 - 0.0123136123136123*G0_1_0_2_2 + 0.18316498316499*G0_1_0_2_3 - 0.00769600769600794*G0_1_0_2_4 + 0.0166233766233772*G0_1_0_2_5 + 0.00861952861952894*G0_1_0_3_0 - 0.0735738335738363*G0_1_0_3_1 + 0.18316498316499*G0_1_0_3_2 + 0.236421356421364*G0_1_0_3_3 - 0.0332467532467542*G0_1_0_3_4 - 0.050485810485812*G0_1_0_3_5 + 0.0243193843193851*G0_1_0_4_0 + 0.00800384800384827*G0_1_0_4_1 - 0.00769600769600794*G0_1_0_4_2 - 0.0332467532467542*G0_1_0_4_3 - 0.145300625300631*G0_1_0_4_4 - 0.0492544492544509*G0_1_0_4_5 + 0.0138528138528143*G0_1_0_5_0 - 0.00831168831168866*G0_1_0_5_1 + 0.0166233766233772*G0_1_0_5_2 - 0.050485810485812*G0_1_0_5_3 - 0.0492544492544509*G0_1_0_5_4 - 0.0714189514189529*G0_1_0_5_5; + A[199] = A[74] + 0.0252429052429061*G0_0_0_0_0 + 0.0113900913900917*G0_0_0_0_1 - 0.0551034151034169*G0_0_0_0_2 - 0.0898893698893727*G0_0_0_0_3 - 0.120673400673405*G0_0_0_0_4 - 0.0283213083213092*G0_0_0_0_5 + 0.0113900913900917*G0_0_0_1_0 + 0.0800384800384828*G0_0_0_1_1 - 0.0470995670995688*G0_0_0_1_2 - 0.11574795574796*G0_0_0_1_3 - 0.0627994227994248*G0_0_0_1_4 - 0.0012313612313612*G0_0_0_1_5 - 0.0551034151034169*G0_0_0_2_0 - 0.0470995670995688*G0_0_0_2_1 + 0.27089947089948*G0_0_0_2_2 + 0.214256854256862*G0_0_0_2_3 + 0.278287638287648*G0_0_0_2_4 + 0.0160076960076966*G0_0_0_2_5 - 0.0898893698893727*G0_0_0_3_0 - 0.11574795574796*G0_0_0_3_1 + 0.214256854256862*G0_0_0_3_2 + 0.906281866281898*G0_0_0_3_3 + 0.305377585377595*G0_0_0_3_4 + 0.147763347763353*G0_0_0_3_5 - 0.120673400673405*G0_0_0_4_0 - 0.0627994227994248*G0_0_0_4_1 + 0.278287638287648*G0_0_0_4_2 + 0.305377585377595*G0_0_0_4_3 + 0.847176527176555*G0_0_0_4_4 + 0.0935834535834567*G0_0_0_4_5 - 0.0283213083213092*G0_0_0_5_0 - 0.0012313612313612*G0_0_0_5_1 + 0.0160076960076966*G0_0_0_5_2 + 0.147763347763353*G0_0_0_5_3 + 0.0935834535834567*G0_0_0_5_4 + 0.0295526695526706*G0_0_0_5_5 + 0.00677248677248692*G0_0_1_0_1 - 0.00677248677248702*G0_0_1_0_2 + 0.000923520923521*G0_0_1_0_4 - 0.0009235209235209*G0_0_1_0_5 + 0.00677248677248692*G0_0_1_1_0 + 0.0372486772486788*G0_0_1_1_1 - 0.244733044733053*G0_0_1_1_3 - 0.0178547378547385*G0_0_1_1_4 - 0.00831168831168848*G0_0_1_1_5 - 0.00677248677248702*G0_0_1_2_0 - 0.0372486772486779*G0_0_1_2_2 + 0.244733044733054*G0_0_1_2_3 + 0.00831168831168875*G0_0_1_2_4 + 0.0178547378547385*G0_0_1_2_5 - 0.244733044733053*G0_0_1_3_1 + 0.244733044733054*G0_0_1_3_2 + 0.0357094757094771*G0_0_1_3_4 - 0.0357094757094769*G0_0_1_3_5 + 0.000923520923520999*G0_0_1_4_0 - 0.0178547378547385*G0_0_1_4_1 + 0.00831168831168875*G0_0_1_4_2 + 0.0357094757094771*G0_0_1_4_3 + 0.0270899470899485*G0_0_1_4_4 - 0.0009235209235209*G0_0_1_5_0 - 0.00831168831168848*G0_0_1_5_1 + 0.0178547378547385*G0_0_1_5_2 - 0.0357094757094769*G0_0_1_5_3 - 0.0270899470899472*G0_0_1_5_5 + 0.00184704184704185*G0_1_0_0_1 - 0.00184704184704197*G0_1_0_0_2 - 0.00954304954304995*G0_1_0_0_4 + 0.00954304954304977*G0_1_0_0_5 + 0.00184704184704185*G0_1_0_1_0 + 0.0403270803270821*G0_1_0_1_1 + 0.0120057720057726*G0_1_0_1_3 - 0.00923520923520958*G0_1_0_1_4 - 0.00769600769600767*G0_1_0_1_5 - 0.00184704184704197*G0_1_0_2_0 - 0.040327080327081*G0_1_0_2_2 - 0.0120057720057723*G0_1_0_2_3 + 0.00769600769600826*G0_1_0_2_4 + 0.00923520923520951*G0_1_0_2_5 + 0.0120057720057726*G0_1_0_3_1 - 0.0120057720057723*G0_1_0_3_2 + 0.0184704184704193*G0_1_0_3_4 - 0.0184704184704188*G0_1_0_3_5 - 0.00954304954304996*G0_1_0_4_0 - 0.00923520923520958*G0_1_0_4_1 + 0.00769600769600827*G0_1_0_4_2 + 0.0184704184704193*G0_1_0_4_3 + 0.100971620971626*G0_1_0_4_4 + 0.00954304954304977*G0_1_0_5_0 - 0.00769600769600767*G0_1_0_5_1 + 0.00923520923520951*G0_1_0_5_2 - 0.0184704184704188*G0_1_0_5_3 - 0.100971620971624*G0_1_0_5_5 - 0.025242905242906*G0_1_1_0_0 + 0.055103415103417*G0_1_1_0_1 - 0.0113900913900918*G0_1_1_0_2 + 0.0898893698893728*G0_1_1_0_3 + 0.0283213083213092*G0_1_1_0_4 + 0.120673400673405*G0_1_1_0_5 + 0.055103415103417*G0_1_1_1_0 - 0.270899470899481*G0_1_1_1_1 + 0.0470995670995687*G0_1_1_1_2 - 0.214256854256862*G0_1_1_1_3 - 0.0160076960076966*G0_1_1_1_4 - 0.278287638287649*G0_1_1_1_5 - 0.0113900913900918*G0_1_1_2_0 + 0.0470995670995687*G0_1_1_2_1 - 0.0800384800384824*G0_1_1_2_2 + 0.11574795574796*G0_1_1_2_3 + 0.00123136123136132*G0_1_1_2_4 + 0.062799422799425*G0_1_1_2_5 + 0.0898893698893728*G0_1_1_3_0 - 0.214256854256862*G0_1_1_3_1 + 0.11574795574796*G0_1_1_3_2 - 0.906281866281897*G0_1_1_3_3 - 0.147763347763353*G0_1_1_3_4 - 0.305377585377596*G0_1_1_3_5 + 0.0283213083213092*G0_1_1_4_0 - 0.0160076960076966*G0_1_1_4_1 + 0.00123136123136132*G0_1_1_4_2 - 0.147763347763353*G0_1_1_4_3 - 0.0295526695526702*G0_1_1_4_4 - 0.0935834535834565*G0_1_1_4_5 + 0.120673400673405*G0_1_1_5_0 - 0.278287638287649*G0_1_1_5_1 + 0.062799422799425*G0_1_1_5_2 - 0.305377585377596*G0_1_1_5_3 - 0.0935834535834565*G0_1_1_5_4 - 0.847176527176556*G0_1_1_5_5; + A[202] = -A[199] - 0.0012313612313613*G0_0_0_0_1 - 0.0258585858585867*G0_0_0_0_2 - 0.0541798941798959*G0_0_0_0_4 - 0.0012313612313613*G0_0_0_1_0 + 0.0492544492544509*G0_0_0_1_1 - 0.0160076960076965*G0_0_0_1_2 + 0.00492544492544523*G0_0_0_1_3 - 0.0197017797017803*G0_0_0_1_4 + 0.00985088985089028*G0_0_0_1_5 - 0.0258585858585867*G0_0_0_2_0 - 0.0160076960076965*G0_0_0_2_1 + 0.110822510822515*G0_0_0_2_2 + 0.0591053391053409*G0_0_0_2_3 + 0.137912457912463*G0_0_0_2_4 + 0.00492544492544511*G0_0_0_2_5 + 0.00492544492544523*G0_0_0_3_1 + 0.0591053391053409*G0_0_0_3_2 - 0.47284271284273*G0_0_0_3_3 + 0.0394035594035605*G0_0_0_3_4 - 0.00985088985089033*G0_0_0_3_5 - 0.0541798941798959*G0_0_0_4_0 - 0.0197017797017803*G0_0_0_4_1 + 0.137912457912463*G0_0_0_4_2 + 0.0394035594035605*G0_0_0_4_3 + 0.788071188071215*G0_0_0_4_4 + 0.0295526695526705*G0_0_0_4_5 + 0.00985088985089028*G0_0_0_5_1 + 0.00492544492544511*G0_0_0_5_2 - 0.00985088985089033*G0_0_0_5_3 + 0.0295526695526705*G0_0_0_5_4 + 0.0197017797017804*G0_0_0_5_5 - 0.018470418470419*G0_0_1_0_0 + 0.00307840307840311*G0_0_1_0_1 - 0.000923520923520987*G0_0_1_0_2 + 0.0412506012506026*G0_0_1_0_3 - 0.0818855218855246*G0_0_1_0_4 - 0.00738816738816749*G0_0_1_0_5 + 0.00307840307840311*G0_0_1_1_0 + 0.0209331409331419*G0_0_1_1_1 + 0.0255507455507465*G0_0_1_1_2 - 0.152073112073117*G0_0_1_1_3 - 0.00923520923520952*G0_0_1_1_4 - 0.0135449735449738*G0_0_1_1_5 - 0.000923520923520987*G0_0_1_2_0 + 0.0255507455507465*G0_0_1_2_1 + 0.0332467532467541*G0_0_1_2_2 + 0.0911207311207343*G0_0_1_2_3 + 0.076344396344399*G0_0_1_2_4 - 0.00861952861952882*G0_0_1_2_5 + 0.0412506012506026*G0_0_1_3_0 - 0.152073112073117*G0_0_1_3_1 + 0.0911207311207343*G0_0_1_3_2 - 1.05650793650797*G0_0_1_3_3 - 0.0640307840307864*G0_0_1_3_4 - 0.0652621452621479*G0_0_1_3_5 - 0.0818855218855246*G0_0_1_4_0 - 0.00923520923520952*G0_0_1_4_1 + 0.076344396344399*G0_0_1_4_2 - 0.0640307840307864*G0_0_1_4_3 + 0.00246272246272349*G0_0_1_4_4 + 0.0357094757094768*G0_0_1_4_5 - 0.00738816738816749*G0_0_1_5_0 - 0.0135449735449738*G0_0_1_5_1 - 0.00861952861952883*G0_0_1_5_2 - 0.0652621452621479*G0_0_1_5_3 + 0.0357094757094768*G0_0_1_5_4 + 0.059105339105341*G0_0_1_5_5 - 0.0160076960076965*G0_1_0_0_0 + 0.00184704184704191*G0_1_0_0_1 + 0.00184704184704187*G0_1_0_0_2 + 0.0418662818662831*G0_1_0_0_3 + 0.0123136123136126*G0_1_0_0_4 + 0.0123136123136127*G0_1_0_0_5 + 0.00184704184704191*G0_1_0_1_0 + 0.00861952861952878*G0_1_0_1_1 - 0.00061568061568059*G0_1_0_1_2 + 0.0221645021645029*G0_1_0_1_3 + 0.00738816738816762*G0_1_0_1_4 - 0.0123136123136127*G0_1_0_1_5 + 0.00184704184704187*G0_1_0_2_0 - 0.00061568061568059*G0_1_0_2_1 + 0.00861952861952902*G0_1_0_2_2 + 0.0221645021645027*G0_1_0_2_3 - 0.0123136123136125*G0_1_0_2_4 + 0.0073881673881676*G0_1_0_2_5 + 0.0418662818662831*G0_1_0_3_0 + 0.0221645021645029*G0_1_0_3_1 + 0.0221645021645027*G0_1_0_3_2 - 0.837325637325667*G0_1_0_3_3 - 0.0985088985089018*G0_1_0_3_4 - 0.0985088985089018*G0_1_0_3_5 + 0.0123136123136126*G0_1_0_4_0 + 0.00738816738816762*G0_1_0_4_1 - 0.0123136123136125*G0_1_0_4_2 - 0.0985088985089018*G0_1_0_4_3 - 0.0689562289562303*G0_1_0_4_4 - 0.0295526695526705*G0_1_0_4_5 + 0.0123136123136127*G0_1_0_5_0 - 0.0123136123136127*G0_1_0_5_1 + 0.0073881673881676*G0_1_0_5_2 - 0.0985088985089018*G0_1_0_5_3 - 0.0295526695526705*G0_1_0_5_4 - 0.0689562289562307*G0_1_0_5_5 + 0.0172390572390574*G0_1_1_0_0 + 0.0375565175565189*G0_1_1_0_1 - 0.00461760461760478*G0_1_1_0_2 + 0.0689562289562311*G0_1_1_0_3 + 0.0116979316979319*G0_1_1_0_4 + 0.0825012025012052*G0_1_1_0_5 + 0.0375565175565189*G0_1_1_1_0 - 0.207484367484375*G0_1_1_1_1 + 0.0344781144781158*G0_1_1_1_2 - 0.181010101010108*G0_1_1_1_3 - 0.00554112554112575*G0_1_1_1_4 - 0.199480519480527*G0_1_1_1_5 - 0.00461760461760477*G0_1_1_2_0 + 0.0344781144781158*G0_1_1_2_1 + 0.00307840307840289*G0_1_1_2_2 + 0.112053872053876*G0_1_1_2_3 + 0.00123136123136139*G0_1_1_2_4 + 0.0332467532467545*G0_1_1_2_5 + 0.0689562289562311*G0_1_1_3_0 - 0.181010101010108*G0_1_1_3_1 + 0.112053872053876*G0_1_1_3_2 - 1.28061568061573*G0_1_1_3_3 - 0.126830206830211*G0_1_1_3_4 - 0.204405964405972*G0_1_1_3_5 + 0.0116979316979319*G0_1_1_4_0 - 0.00554112554112575*G0_1_1_4_1 + 0.00123136123136138*G0_1_1_4_2 - 0.126830206830211*G0_1_1_4_3 - 0.0960461760461789*G0_1_1_4_4 - 0.0554112554112573*G0_1_1_4_5 + 0.0825012025012052*G0_1_1_5_0 - 0.199480519480527*G0_1_1_5_1 + 0.0332467532467545*G0_1_1_5_2 - 0.204405964405972*G0_1_1_5_3 - 0.0554112554112573*G0_1_1_5_4 - 0.591053391053412*G0_1_1_5_5; + A[164] = A[202] + 0.0424819624819642*G0_0_0_0_0 + 0.00800384800384828*G0_0_0_0_1 + 0.0083116883116886*G0_0_0_0_2 - 0.0209331409331417*G0_0_0_0_3 + 0.0160076960076964*G0_0_0_0_4 - 0.0166233766233773*G0_0_0_0_5 + 0.00800384800384828*G0_0_0_1_0 + 0.0338624338624351*G0_0_0_1_1 + 0.00338624338624341*G0_0_0_1_2 - 0.00861952861952884*G0_0_0_1_3 - 0.00985088985089022*G0_0_0_1_4 - 0.00985088985089006*G0_0_0_1_5 + 0.0083116883116886*G0_0_0_2_0 + 0.00338624338624341*G0_0_0_2_1 - 0.0474074074074085*G0_0_0_2_2 - 0.0258585858585865*G0_0_0_2_3 - 0.0591053391053411*G0_0_0_2_4 + 0.00554112554112571*G0_0_0_2_5 - 0.0209331409331417*G0_0_0_3_0 - 0.00861952861952884*G0_0_0_3_1 - 0.0258585858585865*G0_0_0_3_2 + 0.098508898508903*G0_0_0_3_3 + 0.0615680615680639*G0_0_0_3_4 + 0.030784030784032*G0_0_0_3_5 + 0.0160076960076964*G0_0_0_4_0 - 0.00985088985089022*G0_0_0_4_1 - 0.0591053391053411*G0_0_0_4_2 + 0.0615680615680639*G0_0_0_4_3 - 0.53194805194807*G0_0_0_4_4 + 0.00861952861952894*G0_0_0_4_5 - 0.0166233766233773*G0_0_0_5_0 - 0.00985088985089007*G0_0_0_5_1 + 0.00554112554112571*G0_0_0_5_2 + 0.030784030784032*G0_0_0_5_3 + 0.00861952861952895*G0_0_0_5_4 - 0.0861952861952894*G0_0_0_5_5 + 0.0027705627705629*G0_0_1_0_1 - 0.00277056277056285*G0_0_1_0_2 + 0.075420875420878*G0_0_1_0_4 - 0.0754208754208783*G0_0_1_0_5 + 0.0027705627705629*G0_0_1_1_0 + 0.0495622895622911*G0_0_1_1_1 - 0.00153920153920161*G0_0_1_1_3 - 0.0172390572390579*G0_0_1_1_4 + 0.0815776815776845*G0_0_1_1_5 - 0.00277056277056285*G0_0_1_2_0 - 0.0495622895622907*G0_0_1_2_2 + 0.00153920153920178*G0_0_1_2_3 - 0.0815776815776843*G0_0_1_2_4 + 0.0172390572390578*G0_0_1_2_5 - 0.00153920153920161*G0_0_1_3_1 + 0.00153920153920179*G0_0_1_3_2 + 0.0344781144781158*G0_0_1_3_4 - 0.0344781144781154*G0_0_1_3_5 + 0.075420875420878*G0_0_1_4_0 - 0.0172390572390579*G0_0_1_4_1 - 0.0815776815776843*G0_0_1_4_2 + 0.0344781144781158*G0_0_1_4_3 + 0.0837325637325663*G0_0_1_4_4 - 0.0754208754208783*G0_0_1_5_0 + 0.0815776815776845*G0_0_1_5_1 + 0.0172390572390578*G0_0_1_5_2 - 0.0344781144781154*G0_0_1_5_3 - 0.0837325637325665*G0_0_1_5_5 + 0.00184704184704186*G0_1_0_0_1 - 0.00184704184704193*G0_1_0_0_2 - 0.00954304954304992*G0_1_0_0_4 + 0.00954304954304974*G0_1_0_0_5 + 0.00184704184704186*G0_1_0_1_0 + 0.040327080327082*G0_1_0_1_1 + 0.0120057720057725*G0_1_0_1_3 - 0.00923520923520957*G0_1_0_1_4 - 0.00769600769600767*G0_1_0_1_5 - 0.00184704184704193*G0_1_0_2_0 - 0.0403270803270811*G0_1_0_2_2 - 0.0120057720057723*G0_1_0_2_3 + 0.00769600769600809*G0_1_0_2_4 + 0.0092352092352095*G0_1_0_2_5 + 0.0120057720057726*G0_1_0_3_1 - 0.0120057720057723*G0_1_0_3_2 + 0.0184704184704192*G0_1_0_3_4 - 0.0184704184704189*G0_1_0_3_5 - 0.00954304954304992*G0_1_0_4_0 - 0.00923520923520957*G0_1_0_4_1 + 0.00769600769600809*G0_1_0_4_2 + 0.0184704184704192*G0_1_0_4_3 + 0.100971620971625*G0_1_0_4_4 + 0.00954304954304973*G0_1_0_5_0 - 0.00769600769600767*G0_1_0_5_1 + 0.0092352092352095*G0_1_0_5_2 - 0.0184704184704189*G0_1_0_5_3 - 0.100971620971624*G0_1_0_5_5 - 0.0424819624819635*G0_1_1_0_0 - 0.00831168831168866*G0_1_1_0_1 - 0.00800384800384826*G0_1_1_0_2 + 0.0209331409331416*G0_1_1_0_3 + 0.0166233766233773*G0_1_1_0_4 - 0.0160076960076965*G0_1_1_0_5 - 0.00831168831168866*G0_1_1_1_0 + 0.047407407407409*G0_1_1_1_1 - 0.00338624338624354*G0_1_1_1_2 + 0.0258585858585868*G0_1_1_1_3 - 0.00554112554112573*G0_1_1_1_4 + 0.0591053391053414*G0_1_1_1_5 - 0.00800384800384826*G0_1_1_2_0 - 0.00338624338624354*G0_1_1_2_1 - 0.0338624338624346*G0_1_1_2_2 + 0.00861952861952894*G0_1_1_2_3 + 0.00985088985089006*G0_1_1_2_4 + 0.00985088985089009*G0_1_1_2_5 + 0.0209331409331416*G0_1_1_3_0 + 0.0258585858585868*G0_1_1_3_1 + 0.00861952861952894*G0_1_1_3_2 - 0.0985088985089012*G0_1_1_3_3 - 0.0307840307840318*G0_1_1_3_4 - 0.0615680615680634*G0_1_1_3_5 + 0.0166233766233773*G0_1_1_4_0 - 0.00554112554112573*G0_1_1_4_1 + 0.00985088985089006*G0_1_1_4_2 - 0.0307840307840318*G0_1_1_4_3 + 0.086195286195289*G0_1_1_4_4 - 0.00861952861952882*G0_1_1_4_5 - 0.0160076960076965*G0_1_1_5_0 + 0.0591053391053414*G0_1_1_5_1 + 0.00985088985089009*G0_1_1_5_2 - 0.0615680615680634*G0_1_1_5_3 - 0.00861952861952883*G0_1_1_5_4 + 0.531948051948071*G0_1_1_5_5; + A[72] = A[202] + 0.00861952861952894*G0_0_0_0_0 + 0.00492544492544512*G0_0_0_0_2 - 0.0110822510822515*G0_0_0_0_3 + 0.0246272246272254*G0_0_0_0_4 - 0.00677248677248701*G0_0_0_0_5 - 0.00861952861952892*G0_0_0_1_1 - 0.0049254449254452*G0_0_0_1_2 - 0.0246272246272256*G0_0_0_1_3 + 0.0110822510822514*G0_0_0_1_4 + 0.00677248677248692*G0_0_0_1_5 + 0.00492544492544512*G0_0_0_2_0 - 0.0049254449254452*G0_0_0_2_1 + 0.0332467532467548*G0_0_0_2_3 - 0.0332467532467545*G0_0_0_2_4 - 0.0110822510822515*G0_0_0_3_0 - 0.0246272246272256*G0_0_0_3_1 + 0.0332467532467548*G0_0_0_3_2 + 0.630456950456974*G0_0_0_3_3 + 0.0221645021645032*G0_0_0_3_5 + 0.0246272246272254*G0_0_0_4_0 + 0.0110822510822514*G0_0_0_4_1 - 0.0332467532467545*G0_0_0_4_2 - 0.630456950456972*G0_0_0_4_4 - 0.0221645021645028*G0_0_0_4_5 - 0.00677248677248701*G0_0_0_5_0 + 0.00677248677248692*G0_0_0_5_1 + 0.0221645021645032*G0_0_0_5_3 - 0.0221645021645028*G0_0_0_5_4 + 0.0156998556998563*G0_0_1_0_0 - 0.00338624338624349*G0_0_1_0_1 - 0.00523328523328541*G0_0_1_0_2 - 0.00738816738816764*G0_0_1_0_3 + 0.0914285714285745*G0_0_1_0_4 + 0.0070803270803274*G0_0_1_0_5 - 0.00338624338624349*G0_0_1_1_0 - 0.00215488215488229*G0_0_1_1_1 - 0.0110822510822515*G0_0_1_1_2 - 0.0224723424723435*G0_0_1_1_3 + 0.011697931697932*G0_0_1_1_4 + 0.0273977873977881*G0_0_1_1_5 - 0.00523328523328541*G0_0_1_2_0 - 0.0110822510822515*G0_0_1_2_1 - 0.0424819624819634*G0_0_1_2_2 + 0.0594131794131819*G0_0_1_2_3 - 0.0587974987975007*G0_0_1_2_4 + 0.0209331409331416*G0_0_1_2_5 - 0.00738816738816764*G0_0_1_3_0 - 0.0224723424723435*G0_0_1_3_1 + 0.0594131794131819*G0_0_1_3_2 + 0.615680615680639*G0_0_1_3_3 - 0.00861952861952853*G0_0_1_3_4 - 0.0270899470899476*G0_0_1_3_5 + 0.0914285714285745*G0_0_1_4_0 + 0.011697931697932*G0_0_1_4_1 - 0.0587974987975008*G0_0_1_4_2 - 0.00861952861952854*G0_0_1_4_3 + 0.00246272246272217*G0_0_1_4_4 - 0.0652621452621473*G0_0_1_4_5 + 0.0070803270803274*G0_0_1_5_0 + 0.0273977873977881*G0_0_1_5_1 + 0.0209331409331416*G0_0_1_5_2 - 0.0270899470899476*G0_0_1_5_3 - 0.0652621452621473*G0_0_1_5_4 - 0.0985088985089009*G0_0_1_5_5 + 0.00646464646464667*G0_1_0_0_0 - 0.00338624338624352*G0_1_0_0_1 - 0.00615680615680632*G0_1_0_0_2 + 0.000615680615680633*G0_1_0_0_3 + 0.00215488215488207*G0_1_0_0_4 + 0.0206253006253012*G0_1_0_0_5 - 0.00338624338624352*G0_1_0_1_0 + 0.00708032708032732*G0_1_0_1_1 - 0.0101587301587306*G0_1_0_1_2 + 0.0668013468013493*G0_1_0_1_3 + 0.00369408369408385*G0_1_0_1_4 + 0.0138528138528145*G0_1_0_1_5 - 0.00615680615680632*G0_1_0_2_0 - 0.0101587301587306*G0_1_0_2_1 - 0.0424819624819634*G0_1_0_2_2 - 0.0255507455507463*G0_1_0_2_3 + 0.0261664261664271*G0_1_0_2_4 + 0.0209331409331416*G0_1_0_2_5 + 0.000615680615680633*G0_1_0_3_0 + 0.0668013468013493*G0_1_0_3_1 - 0.0255507455507463*G0_1_0_3_2 + 0.632919672919697*G0_1_0_3_3 - 0.00861952861952876*G0_1_0_3_4 - 0.0430976430976442*G0_1_0_3_5 + 0.00215488215488206*G0_1_0_4_0 + 0.00369408369408385*G0_1_0_4_1 + 0.0261664261664271*G0_1_0_4_2 - 0.00861952861952877*G0_1_0_4_3 - 0.0147763347763366*G0_1_0_4_4 - 0.0492544492544509*G0_1_0_4_5 + 0.0206253006253012*G0_1_0_5_0 + 0.0138528138528145*G0_1_0_5_1 + 0.0209331409331416*G0_1_0_5_2 - 0.0430976430976441*G0_1_0_5_3 - 0.0492544492544509*G0_1_0_5_4 - 0.0985088985089013*G0_1_0_5_5 - 0.0338624338624343*G0_1_1_0_0 - 0.0033862433862436*G0_1_1_0_1 - 0.00800384800384828*G0_1_1_0_2 + 0.00985088985089019*G0_1_1_0_3 + 0.00985088985089028*G0_1_1_0_4 + 0.00861952861952907*G0_1_1_0_5 - 0.0033862433862436*G0_1_1_1_0 + 0.0474074074074094*G0_1_1_1_1 - 0.00831168831168869*G0_1_1_1_2 + 0.0591053391053413*G0_1_1_1_3 - 0.00554112554112574*G0_1_1_1_4 + 0.0258585858585869*G0_1_1_1_5 - 0.00800384800384828*G0_1_1_2_0 - 0.00831168831168869*G0_1_1_2_1 - 0.0424819624819634*G0_1_1_2_2 - 0.0160076960076964*G0_1_1_2_3 + 0.0166233766233771*G0_1_1_2_4 + 0.0209331409331416*G0_1_1_2_5 + 0.0098508898508902*G0_1_1_3_0 + 0.0591053391053413*G0_1_1_3_1 - 0.0160076960076964*G0_1_1_3_2 + 0.531948051948072*G0_1_1_3_3 - 0.00861952861952874*G0_1_1_3_4 - 0.0615680615680632*G0_1_1_3_5 + 0.00985088985089028*G0_1_1_4_0 - 0.00554112554112574*G0_1_1_4_1 + 0.0166233766233771*G0_1_1_4_2 - 0.00861952861952873*G0_1_1_4_3 + 0.0861952861952891*G0_1_1_4_4 - 0.0307840307840316*G0_1_1_4_5 + 0.00861952861952907*G0_1_1_5_0 + 0.0258585858585869*G0_1_1_5_1 + 0.0209331409331416*G0_1_1_5_2 - 0.0615680615680632*G0_1_1_5_3 - 0.0307840307840316*G0_1_1_5_4 - 0.0985088985089007*G0_1_1_5_5; + A[184] = A[72] + 0.000923520923521003*G0_0_1_0_1 - 0.000923520923520904*G0_0_1_0_2 - 0.00892736892736938*G0_0_1_0_4 + 0.00892736892736896*G0_0_1_0_5 + 0.000923520923521003*G0_0_1_1_0 + 0.00923520923520925*G0_0_1_1_1 + 0.0803463203463234*G0_0_1_1_3 - 0.00800384800384821*G0_0_1_1_4 - 0.00461760461760465*G0_0_1_1_5 - 0.000923520923520904*G0_0_1_2_0 - 0.00923520923520971*G0_0_1_2_2 - 0.0803463203463234*G0_0_1_2_3 + 0.00461760461760475*G0_0_1_2_4 + 0.00800384800384826*G0_0_1_2_5 + 0.0803463203463234*G0_0_1_3_1 - 0.0803463203463234*G0_0_1_3_2 + 0.0160076960076964*G0_0_1_3_4 - 0.0160076960076965*G0_0_1_3_5 - 0.00892736892736938*G0_0_1_4_0 - 0.00800384800384821*G0_0_1_4_1 + 0.00461760461760476*G0_0_1_4_2 + 0.0160076960076964*G0_0_1_4_3 - 0.0172390572390586*G0_0_1_4_4 + 0.00892736892736895*G0_0_1_5_0 - 0.00461760461760465*G0_0_1_5_1 + 0.00800384800384826*G0_0_1_5_2 - 0.0160076960076965*G0_0_1_5_3 + 0.0172390572390572*G0_0_1_5_5 - 0.000923520923521002*G0_1_0_0_1 + 0.000923520923520905*G0_1_0_0_2 + 0.00892736892736938*G0_1_0_0_4 - 0.00892736892736895*G0_1_0_0_5 - 0.000923520923521003*G0_1_0_1_0 - 0.00923520923520925*G0_1_0_1_1 - 0.0803463203463233*G0_1_0_1_3 + 0.00800384800384821*G0_1_0_1_4 + 0.00461760461760465*G0_1_0_1_5 + 0.000923520923520904*G0_1_0_2_0 + 0.00923520923520971*G0_1_0_2_2 + 0.0803463203463234*G0_1_0_2_3 - 0.00461760461760475*G0_1_0_2_4 - 0.00800384800384826*G0_1_0_2_5 - 0.0803463203463233*G0_1_0_3_1 + 0.0803463203463234*G0_1_0_3_2 - 0.0160076960076964*G0_1_0_3_4 + 0.0160076960076965*G0_1_0_3_5 + 0.00892736892736938*G0_1_0_4_0 + 0.00800384800384821*G0_1_0_4_1 - 0.00461760461760476*G0_1_0_4_2 - 0.0160076960076964*G0_1_0_4_3 + 0.0172390572390586*G0_1_0_4_4 - 0.00892736892736895*G0_1_0_5_0 + 0.00461760461760465*G0_1_0_5_1 - 0.00800384800384826*G0_1_0_5_2 + 0.0160076960076965*G0_1_0_5_3 - 0.0172390572390572*G0_1_0_5_5; + A[73] = A[199] - 0.00677248677248701*G0_0_1_0_0 - 0.00215488215488223*G0_0_1_0_1 + 0.00277056277056285*G0_0_1_0_2 + 0.00861952861952885*G0_0_1_0_3 + 0.0138528138528142*G0_0_1_0_4 + 0.024319384319385*G0_0_1_0_5 - 0.00215488215488223*G0_0_1_1_0 - 0.0123136123136128*G0_0_1_1_1 - 0.0252429052429061*G0_0_1_1_2 + 0.18316498316499*G0_0_1_1_3 + 0.0166233766233772*G0_0_1_1_4 - 0.00769600769600785*G0_0_1_1_5 + 0.00277056277056285*G0_0_1_2_0 - 0.0252429052429061*G0_0_1_2_1 - 0.0153920153920154*G0_0_1_2_2 - 0.0735738335738364*G0_0_1_2_3 - 0.00831168831168844*G0_0_1_2_4 + 0.00800384800384818*G0_0_1_2_5 + 0.00861952861952884*G0_0_1_3_0 + 0.18316498316499*G0_0_1_3_1 - 0.0735738335738364*G0_0_1_3_2 + 0.236421356421366*G0_0_1_3_3 - 0.050485810485812*G0_0_1_3_4 - 0.0332467532467539*G0_0_1_3_5 + 0.0138528138528142*G0_0_1_4_0 + 0.0166233766233772*G0_0_1_4_1 - 0.00831168831168844*G0_0_1_4_2 - 0.050485810485812*G0_0_1_4_3 - 0.0714189514189539*G0_0_1_4_4 - 0.0492544492544508*G0_0_1_4_5 + 0.024319384319385*G0_0_1_5_0 - 0.00769600769600784*G0_0_1_5_1 + 0.00800384800384818*G0_0_1_5_2 - 0.033246753246754*G0_0_1_5_3 - 0.0492544492544508*G0_0_1_5_4 - 0.145300625300629*G0_0_1_5_5 + 0.00677248677248701*G0_1_0_0_0 + 0.00215488215488223*G0_1_0_0_1 - 0.00277056277056285*G0_1_0_0_2 - 0.00861952861952885*G0_1_0_0_3 - 0.0138528138528142*G0_1_0_0_4 - 0.024319384319385*G0_1_0_0_5 + 0.00215488215488223*G0_1_0_1_0 + 0.0123136123136128*G0_1_0_1_1 + 0.0252429052429061*G0_1_0_1_2 - 0.18316498316499*G0_1_0_1_3 - 0.0166233766233772*G0_1_0_1_4 + 0.00769600769600785*G0_1_0_1_5 - 0.00277056277056285*G0_1_0_2_0 + 0.0252429052429061*G0_1_0_2_1 + 0.0153920153920154*G0_1_0_2_2 + 0.0735738335738364*G0_1_0_2_3 + 0.00831168831168844*G0_1_0_2_4 - 0.00800384800384818*G0_1_0_2_5 - 0.00861952861952885*G0_1_0_3_0 - 0.18316498316499*G0_1_0_3_1 + 0.0735738335738364*G0_1_0_3_2 - 0.236421356421366*G0_1_0_3_3 + 0.050485810485812*G0_1_0_3_4 + 0.033246753246754*G0_1_0_3_5 - 0.0138528138528142*G0_1_0_4_0 - 0.0166233766233772*G0_1_0_4_1 + 0.00831168831168843*G0_1_0_4_2 + 0.050485810485812*G0_1_0_4_3 + 0.0714189514189539*G0_1_0_4_4 + 0.0492544492544508*G0_1_0_4_5 - 0.024319384319385*G0_1_0_5_0 + 0.00769600769600784*G0_1_0_5_1 - 0.00800384800384818*G0_1_0_5_2 + 0.033246753246754*G0_1_0_5_3 + 0.0492544492544508*G0_1_0_5_4 + 0.145300625300629*G0_1_0_5_5; + A[220] = A[164] + 0.00923520923520931*G0_0_1_0_0 + 0.000923520923520927*G0_0_1_0_2 - 0.00800384800384826*G0_0_1_0_3 - 0.00461760461760485*G0_0_1_0_4 + 0.0803463203463232*G0_0_1_0_5 - 0.00923520923520939*G0_0_1_1_1 - 0.000923520923520927*G0_0_1_1_2 + 0.00461760461760474*G0_0_1_1_3 + 0.00800384800384824*G0_0_1_1_4 - 0.0803463203463232*G0_0_1_1_5 + 0.000923520923520927*G0_0_1_2_0 - 0.000923520923520928*G0_0_1_2_1 - 0.00892736892736929*G0_0_1_2_3 + 0.00892736892736935*G0_0_1_2_4 - 0.00800384800384826*G0_0_1_3_0 + 0.00461760461760475*G0_0_1_3_1 - 0.00892736892736929*G0_0_1_3_2 - 0.0172390572390583*G0_0_1_3_3 + 0.0160076960076965*G0_0_1_3_5 - 0.00461760461760486*G0_0_1_4_0 + 0.00800384800384824*G0_0_1_4_1 + 0.00892736892736936*G0_0_1_4_2 + 0.0172390572390587*G0_0_1_4_4 - 0.0160076960076964*G0_0_1_4_5 + 0.0803463203463232*G0_0_1_5_0 - 0.0803463203463232*G0_0_1_5_1 + 0.0160076960076965*G0_0_1_5_3 - 0.0160076960076964*G0_0_1_5_4 - 0.00923520923520931*G0_1_0_0_0 - 0.000923520923520929*G0_1_0_0_2 + 0.00800384800384826*G0_1_0_0_3 + 0.00461760461760485*G0_1_0_0_4 - 0.0803463203463232*G0_1_0_0_5 + 0.00923520923520938*G0_1_0_1_1 + 0.000923520923520927*G0_1_0_1_2 - 0.00461760461760475*G0_1_0_1_3 - 0.00800384800384824*G0_1_0_1_4 + 0.0803463203463232*G0_1_0_1_5 - 0.000923520923520928*G0_1_0_2_0 + 0.000923520923520928*G0_1_0_2_1 + 0.00892736892736929*G0_1_0_2_3 - 0.00892736892736936*G0_1_0_2_4 + 0.00800384800384826*G0_1_0_3_0 - 0.00461760461760475*G0_1_0_3_1 + 0.00892736892736929*G0_1_0_3_2 + 0.0172390572390583*G0_1_0_3_3 - 0.0160076960076965*G0_1_0_3_5 + 0.00461760461760485*G0_1_0_4_0 - 0.00800384800384824*G0_1_0_4_1 - 0.00892736892736936*G0_1_0_4_2 - 0.0172390572390587*G0_1_0_4_4 + 0.0160076960076964*G0_1_0_4_5 - 0.0803463203463232*G0_1_0_5_0 + 0.0803463203463232*G0_1_0_5_1 - 0.0160076960076965*G0_1_0_5_3 + 0.0160076960076964*G0_1_0_5_4; + A[118] = A[202] + 0.00923520923520945*G0_0_1_0_0 + 0.000923520923521033*G0_0_1_0_1 - 0.00800384800384828*G0_0_1_0_3 + 0.0803463203463231*G0_0_1_0_4 - 0.00461760461760484*G0_0_1_0_5 + 0.000923520923521032*G0_0_1_1_0 - 0.000923520923520911*G0_0_1_1_2 - 0.00892736892736942*G0_0_1_1_3 + 0.00892736892736896*G0_0_1_1_5 - 0.000923520923520909*G0_0_1_2_1 - 0.00923520923520965*G0_0_1_2_2 + 0.00461760461760479*G0_0_1_2_3 - 0.0803463203463231*G0_0_1_2_4 + 0.00800384800384825*G0_0_1_2_5 - 0.00800384800384828*G0_0_1_3_0 - 0.00892736892736942*G0_0_1_3_1 + 0.0046176046176048*G0_0_1_3_2 - 0.0172390572390583*G0_0_1_3_3 + 0.0160076960076966*G0_0_1_3_4 + 0.0803463203463231*G0_0_1_4_0 - 0.0803463203463231*G0_0_1_4_2 + 0.0160076960076966*G0_0_1_4_3 - 0.0160076960076965*G0_0_1_4_5 - 0.00461760461760484*G0_0_1_5_0 + 0.00892736892736896*G0_0_1_5_1 + 0.00800384800384825*G0_0_1_5_2 - 0.0160076960076965*G0_0_1_5_4 + 0.0172390572390577*G0_0_1_5_5 - 0.00923520923520945*G0_1_0_0_0 - 0.000923520923521032*G0_1_0_0_1 + 0.00800384800384828*G0_1_0_0_3 - 0.080346320346323*G0_1_0_0_4 + 0.00461760461760484*G0_1_0_0_5 - 0.00092352092352103*G0_1_0_1_0 + 0.000923520923520911*G0_1_0_1_2 + 0.00892736892736942*G0_1_0_1_3 - 0.00892736892736896*G0_1_0_1_5 + 0.000923520923520909*G0_1_0_2_1 + 0.00923520923520966*G0_1_0_2_2 - 0.0046176046176048*G0_1_0_2_3 + 0.0803463203463231*G0_1_0_2_4 - 0.00800384800384825*G0_1_0_2_5 + 0.00800384800384828*G0_1_0_3_0 + 0.00892736892736942*G0_1_0_3_1 - 0.0046176046176048*G0_1_0_3_2 + 0.0172390572390583*G0_1_0_3_3 - 0.0160076960076966*G0_1_0_3_4 - 0.080346320346323*G0_1_0_4_0 + 0.0803463203463231*G0_1_0_4_2 - 0.0160076960076966*G0_1_0_4_3 + 0.0160076960076965*G0_1_0_4_5 + 0.00461760461760484*G0_1_0_5_0 - 0.00892736892736896*G0_1_0_5_1 - 0.00800384800384825*G0_1_0_5_2 + 0.0160076960076965*G0_1_0_5_4 - 0.0172390572390577*G0_1_0_5_5; + A[40] = 0.00695206028539389*G0_1_0_0_0 + 4.81000481000586e-05*G0_1_0_0_2 + 0.000641333974667319*G0_1_0_0_3 - 0.00220618887285559*G0_1_0_0_4 - 0.0107615840949178*G0_1_0_0_5 - 0.00695206028539393*G0_1_0_1_1 - 4.81000481000426e-05*G0_1_0_1_2 + 0.00220618887285562*G0_1_0_1_3 - 0.000641333974667319*G0_1_0_1_4 + 0.0107615840949178*G0_1_0_1_5 + 4.81000481000586e-05*G0_1_0_2_0 - 4.81000481000426e-05*G0_1_0_2_1 - 0.00137245470578813*G0_1_0_2_3 + 0.00137245470578804*G0_1_0_2_4 + 0.000641333974667319*G0_1_0_3_0 + 0.00220618887285562*G0_1_0_3_1 - 0.00137245470578813*G0_1_0_3_2 - 0.000615680615680578*G0_1_0_3_3 - 0.00128266794933462*G0_1_0_3_5 - 0.00220618887285559*G0_1_0_4_0 - 0.000641333974667319*G0_1_0_4_1 + 0.00137245470578804*G0_1_0_4_2 + 0.000615680615680645*G0_1_0_4_4 + 0.00128266794933465*G0_1_0_4_5 - 0.0107615840949178*G0_1_0_5_0 + 0.0107615840949178*G0_1_0_5_1 - 0.00128266794933462*G0_1_0_5_3 + 0.00128266794933465*G0_1_0_5_4 - 0.00246913580246919*G0_1_1_0_0 - 0.0011287477954145*G0_1_1_0_1 - 0.000298220298220311*G0_1_1_0_2 + 0.00119288119288122*G0_1_1_0_3 + 0.00185986852653525*G0_1_1_0_4 - 0.00300144300144311*G0_1_1_0_5 - 0.0011287477954145*G0_1_1_1_0 - 0.00942119608786319*G0_1_1_1_1 - 0.00034632034632036*G0_1_1_1_2 + 0.00406605739939086*G0_1_1_1_3 + 0.000551547218213905*G0_1_1_1_4 + 0.0077601410934747*G0_1_1_1_5 - 0.000298220298220311*G0_1_1_2_0 - 0.00034632034632036*G0_1_1_2_1 - 0.00311046977713652*G0_1_1_2_2 - 0.0014878948212282*G0_1_1_2_3 - 0.000115440115440099*G0_1_1_2_4 + 0.000243706910373567*G0_1_1_2_5 + 0.00119288119288122*G0_1_1_3_0 + 0.00406605739939086*G0_1_1_3_1 - 0.0014878948212282*G0_1_1_3_2 - 0.00220618887285552*G0_1_1_3_3 - 0.00348885682219025*G0_1_1_3_4 - 0.00287317620650958*G0_1_1_3_5 + 0.00185986852653525*G0_1_1_4_0 + 0.000551547218213906*G0_1_1_4_1 - 0.000115440115440099*G0_1_1_4_2 - 0.00348885682219025*G0_1_1_4_3 - 0.00159050825717499*G0_1_1_4_4 - 0.00159050825717496*G0_1_1_4_5 - 0.00300144300144311*G0_1_1_5_0 + 0.0077601410934747*G0_1_1_5_1 + 0.000243706910373568*G0_1_1_5_2 - 0.00287317620650958*G0_1_1_5_3 - 0.00159050825717495*G0_1_1_5_4 + 0.0584383517716874*G0_1_1_5_5; + A[145] = A[159] + 0.0543851210517892*G0_0_1_0_0 - 0.0258072791406134*G0_0_1_0_1 - 0.00784992784992811*G0_0_1_0_2 + 0.00954304954304987*G0_0_1_0_3 + 0.0246272246272254*G0_0_1_0_4 + 0.142632675966014*G0_0_1_0_5 - 0.0258072791406134*G0_0_1_1_0 + 0.0102613435946772*G0_0_1_1_1 + 0.00702902036235395*G0_0_1_1_2 - 0.0111848645181982*G0_0_1_1_3 - 0.0214462081128755*G0_0_1_1_4 - 0.0807567740901103*G0_0_1_1_5 - 0.00784992784992811*G0_0_1_2_0 + 0.00702902036235394*G0_0_1_2_1 + 0.00441237774571122*G0_0_1_2_2 - 0.00738816738816766*G0_0_1_2_3 - 0.0146737213403885*G0_0_1_2_4 - 0.0413532146865495*G0_0_1_2_5 + 0.00954304954304987*G0_0_1_3_0 - 0.0111848645181982*G0_0_1_3_1 - 0.00738816738816766*G0_0_1_3_2 + 0.00738816738816775*G0_0_1_3_3 + 0.0238063171396513*G0_0_1_3_4 + 0.0636203302869991*G0_0_1_3_5 + 0.0246272246272254*G0_0_1_4_0 - 0.0214462081128755*G0_0_1_4_1 - 0.0146737213403885*G0_0_1_4_2 + 0.0238063171396513*G0_0_1_4_3 + 0.0426871893538575*G0_0_1_4_4 + 0.12559884559885*G0_0_1_4_5 + 0.142632675966014*G0_0_1_5_0 - 0.0807567740901103*G0_0_1_5_1 - 0.0413532146865495*G0_0_1_5_2 + 0.0636203302869991*G0_0_1_5_3 + 0.12559884559885*G0_0_1_5_4 + 0.625531505531527*G0_0_1_5_5 - 0.0543851210517892*G0_1_0_0_0 + 0.0258072791406133*G0_1_0_0_1 + 0.00784992784992811*G0_1_0_0_2 - 0.00954304954304987*G0_1_0_0_3 - 0.0246272246272254*G0_1_0_0_4 - 0.142632675966014*G0_1_0_0_5 + 0.0258072791406134*G0_1_0_1_0 - 0.0102613435946772*G0_1_0_1_1 - 0.00702902036235395*G0_1_0_1_2 + 0.0111848645181982*G0_1_0_1_3 + 0.0214462081128755*G0_1_0_1_4 + 0.0807567740901103*G0_1_0_1_5 + 0.00784992784992811*G0_1_0_2_0 - 0.00702902036235394*G0_1_0_2_1 - 0.00441237774571122*G0_1_0_2_2 + 0.00738816738816766*G0_1_0_2_3 + 0.0146737213403885*G0_1_0_2_4 + 0.0413532146865495*G0_1_0_2_5 - 0.00954304954304987*G0_1_0_3_0 + 0.0111848645181982*G0_1_0_3_1 + 0.00738816738816767*G0_1_0_3_2 - 0.00738816738816775*G0_1_0_3_3 - 0.0238063171396513*G0_1_0_3_4 - 0.0636203302869991*G0_1_0_3_5 - 0.0246272246272254*G0_1_0_4_0 + 0.0214462081128755*G0_1_0_4_1 + 0.0146737213403885*G0_1_0_4_2 - 0.0238063171396513*G0_1_0_4_3 - 0.0426871893538575*G0_1_0_4_4 - 0.12559884559885*G0_1_0_4_5 - 0.142632675966014*G0_1_0_5_0 + 0.0807567740901103*G0_1_0_5_1 + 0.0413532146865495*G0_1_0_5_2 - 0.0636203302869991*G0_1_0_5_3 - 0.12559884559885*G0_1_0_5_4 - 0.625531505531527*G0_1_0_5_5; + A[151] = -A[61] + 0.0321628988295667*G0_0_0_0_0 - 0.00219015552348894*G0_0_0_0_1 - 0.00705788039121396*G0_0_0_0_2 - 0.00227032227032234*G0_0_0_0_3 + 0.0107487574154245*G0_0_0_0_4 + 0.0107231040564378*G0_0_0_0_5 - 0.00219015552348894*G0_0_0_1_0 + 0.151707551707557*G0_0_0_1_1 - 0.00975789642456342*G0_0_0_1_2 + 0.0334776334776346*G0_0_0_1_3 - 0.00616963283629972*G0_0_0_1_4 - 0.00551547218213891*G0_0_0_1_5 - 0.00705788039121396*G0_0_0_2_0 - 0.00975789642456342*G0_0_0_2_1 + 0.0351899951899963*G0_0_0_2_2 + 0.00328362995029672*G0_0_0_2_3 + 0.0113131313131317*G0_0_0_2_4 - 0.00355299021965701*G0_0_0_2_5 - 0.00227032227032234*G0_0_0_3_0 + 0.0334776334776346*G0_0_0_3_1 + 0.00328362995029672*G0_0_0_3_2 + 0.026576879910214*G0_0_0_3_3 + 0.0168799102132441*G0_0_0_3_4 + 0.0116466249799587*G0_0_0_3_5 + 0.0107487574154245*G0_0_0_4_0 - 0.00616963283629972*G0_0_0_4_1 + 0.0113131313131317*G0_0_0_4_2 + 0.0168799102132441*G0_0_0_4_3 + 0.0850665383998744*G0_0_0_4_4 + 0.0194452461119134*G0_0_0_4_5 + 0.0107231040564378*G0_0_0_5_0 - 0.0055154721821389*G0_0_0_5_1 - 0.00355299021965701*G0_0_0_5_2 + 0.0116466249799587*G0_0_0_5_3 + 0.0194452461119134*G0_0_0_5_4 + 0.0173416706750047*G0_0_0_5_5 - 0.00302709636042978*G0_1_0_0_0 + 0.00756774090107453*G0_1_0_0_1 + 0.00128266794933466*G0_1_0_0_3 - 0.000564373897707238*G0_1_0_0_4 + 0.00743947410614103*G0_1_0_0_5 + 0.00756774090107454*G0_1_0_1_0 - 0.00756774090107446*G0_1_0_1_2 + 0.0389931056597735*G0_1_0_1_3 - 0.0389931056597739*G0_1_0_1_5 - 0.00756774090107446*G0_1_0_2_1 + 0.00302709636042978*G0_1_0_2_2 - 0.007439474106141*G0_1_0_2_3 + 0.00056437389770724*G0_1_0_2_4 - 0.00128266794933466*G0_1_0_2_5 + 0.00128266794933466*G0_1_0_3_0 + 0.0389931056597735*G0_1_0_3_1 - 0.007439474106141*G0_1_0_3_2 + 0.00923520923520938*G0_1_0_3_3 - 0.00256533589866932*G0_1_0_3_4 - 0.000564373897707239*G0_1_0_4_0 + 0.000564373897707239*G0_1_0_4_2 - 0.00256533589866932*G0_1_0_4_3 + 0.00256533589866933*G0_1_0_4_5 + 0.00743947410614103*G0_1_0_5_0 - 0.0389931056597738*G0_1_0_5_1 - 0.00128266794933466*G0_1_0_5_2 + 0.00256533589866933*G0_1_0_5_4 - 0.00923520923520959*G0_1_0_5_5; + A[102] = A[186] - 0.192913259579932*G0_0_1_0_0 + 0.0186756453423126*G0_0_1_0_1 + 0.0063620330286999*G0_0_1_0_2 - 0.00246272246272251*G0_0_1_0_3 + 0.0102613435946775*G0_0_1_0_4 - 0.0882475549142245*G0_0_1_0_5 + 0.0186756453423126*G0_0_1_1_0 - 0.00451499118165809*G0_0_1_1_1 + 0.000615680615680661*G0_0_1_1_2 + 0.00123136123136119*G0_0_1_1_3 - 0.0131345198011869*G0_0_1_1_4 + 0.0242167708834383*G0_0_1_1_5 + 0.0063620330286999*G0_0_1_2_0 + 0.000615680615680661*G0_0_1_2_1 - 0.00328362995029675*G0_0_1_2_2 - 0.00615680615680636*G0_0_1_2_3 - 0.0488439955106639*G0_0_1_2_4 + 0.0106717973384643*G0_0_1_2_5 - 0.00246272246272251*G0_0_1_3_0 + 0.00123136123136119*G0_0_1_3_1 - 0.00615680615680636*G0_0_1_3_2 - 0.0164181497514843*G0_0_1_3_3 + 0.0311944845278188*G0_0_1_3_4 - 0.0164181497514836*G0_0_1_3_5 + 0.0102613435946775*G0_0_1_4_0 - 0.0131345198011869*G0_0_1_4_1 - 0.0488439955106639*G0_0_1_4_2 + 0.0311944845278188*G0_0_1_4_3 + 0.512246272246289*G0_0_1_4_4 + 0.00492544492544512*G0_0_1_4_5 - 0.0882475549142245*G0_0_1_5_0 + 0.0242167708834383*G0_0_1_5_1 + 0.0106717973384643*G0_0_1_5_2 - 0.0164181497514836*G0_0_1_5_3 + 0.00492544492544512*G0_0_1_5_4 - 0.160897867564539*G0_0_1_5_5 + 0.192913259579932*G0_1_0_0_0 - 0.0186756453423126*G0_1_0_0_1 - 0.0063620330286999*G0_1_0_0_2 + 0.0024627224627225*G0_1_0_0_3 - 0.0102613435946775*G0_1_0_0_4 + 0.0882475549142245*G0_1_0_0_5 - 0.0186756453423126*G0_1_0_1_0 + 0.00451499118165809*G0_1_0_1_1 - 0.000615680615680663*G0_1_0_1_2 - 0.00123136123136119*G0_1_0_1_3 + 0.0131345198011869*G0_1_0_1_4 - 0.0242167708834383*G0_1_0_1_5 - 0.00636203302869989*G0_1_0_2_0 - 0.00061568061568066*G0_1_0_2_1 + 0.00328362995029675*G0_1_0_2_2 + 0.00615680615680636*G0_1_0_2_3 + 0.0488439955106639*G0_1_0_2_4 - 0.0106717973384643*G0_1_0_2_5 + 0.0024627224627225*G0_1_0_3_0 - 0.00123136123136119*G0_1_0_3_1 + 0.00615680615680636*G0_1_0_3_2 + 0.0164181497514843*G0_1_0_3_3 - 0.0311944845278188*G0_1_0_3_4 + 0.0164181497514836*G0_1_0_3_5 - 0.0102613435946775*G0_1_0_4_0 + 0.0131345198011869*G0_1_0_4_1 + 0.0488439955106639*G0_1_0_4_2 - 0.0311944845278188*G0_1_0_4_3 - 0.512246272246289*G0_1_0_4_4 - 0.00492544492544511*G0_1_0_4_5 + 0.0882475549142245*G0_1_0_5_0 - 0.0242167708834383*G0_1_0_5_1 - 0.0106717973384643*G0_1_0_5_2 + 0.0164181497514836*G0_1_0_5_3 - 0.00492544492544512*G0_1_0_5_4 + 0.160897867564539*G0_1_0_5_5; + A[189] = A[102] + 0.459708193041542*G0_0_0_0_0 - 0.0264742664742674*G0_0_0_0_1 - 0.0913259579926277*G0_0_0_0_2 + 0.0213435946769287*G0_0_0_0_3 + 0.443290043290058*G0_0_0_0_4 + 0.119031585698256*G0_0_0_0_5 - 0.0264742664742674*G0_0_0_1_0 - 0.0254481321147997*G0_0_0_1_1 + 0.0104665704665708*G0_0_0_1_2 - 0.0574635241301927*G0_0_0_1_3 - 0.0640307840307862*G0_0_0_1_4 - 0.0402244668911349*G0_0_0_1_5 - 0.0913259579926277*G0_0_0_2_0 + 0.0104665704665708*G0_0_0_2_1 + 0.0504858104858123*G0_0_0_2_2 + 0.0369408369408383*G0_0_0_2_3 - 0.142016995350333*G0_0_0_2_4 - 0.027089947089948*G0_0_0_2_5 + 0.0213435946769287*G0_0_0_3_0 - 0.0574635241301927*G0_0_0_3_1 + 0.0369408369408383*G0_0_0_3_2 + 0.0197017797017809*G0_0_0_3_3 + 0.0853743787077149*G0_0_0_3_4 + 0.0114927048260386*G0_0_0_3_5 + 0.443290043290058*G0_0_0_4_0 - 0.0640307840307862*G0_0_0_4_1 - 0.142016995350333*G0_0_0_4_2 + 0.0853743787077148*G0_0_0_4_3 + 1.05732884399555*G0_0_0_4_4 + 0.182241462241468*G0_0_0_4_5 + 0.119031585698256*G0_0_0_5_0 - 0.0402244668911349*G0_0_0_5_1 - 0.027089947089948*G0_0_0_5_2 + 0.0114927048260386*G0_0_0_5_3 + 0.182241462241468*G0_0_0_5_4 + 0.0886580086580117*G0_0_0_5_5 + 0.00164181497514837*G0_0_1_0_1 - 0.00164181497514835*G0_0_1_0_2 - 0.0307840307840318*G0_0_1_0_4 + 0.0307840307840317*G0_0_1_0_5 + 0.00164181497514837*G0_0_1_1_0 - 0.0316049382716061*G0_0_1_1_1 - 0.0545903479236831*G0_0_1_1_3 - 0.00246272246272253*G0_0_1_1_4 - 0.0348885682219027*G0_0_1_1_5 - 0.00164181497514836*G0_0_1_2_0 + 0.0316049382716061*G0_0_1_2_2 + 0.0545903479236832*G0_0_1_2_3 + 0.0348885682219027*G0_0_1_2_4 + 0.00246272246272259*G0_0_1_2_5 - 0.0545903479236831*G0_0_1_3_1 + 0.0545903479236832*G0_0_1_3_2 + 0.0049254449254451*G0_0_1_3_4 - 0.00492544492544514*G0_0_1_3_5 - 0.0307840307840318*G0_0_1_4_0 - 0.00246272246272253*G0_0_1_4_1 + 0.0348885682219027*G0_0_1_4_2 + 0.00492544492544508*G0_0_1_4_3 - 0.114927048260385*G0_0_1_4_4 + 0.0307840307840317*G0_0_1_5_0 - 0.0348885682219027*G0_0_1_5_1 + 0.00246272246272259*G0_0_1_5_2 - 0.00492544492544514*G0_0_1_5_3 + 0.114927048260385*G0_0_1_5_5 + 0.013955427288761*G0_1_0_0_1 - 0.0139554272887611*G0_1_0_0_2 + 0.0677248677248702*G0_1_0_0_4 - 0.0677248677248701*G0_1_0_0_5 + 0.0139554272887611*G0_1_0_1_0 - 0.0328362995029673*G0_1_0_1_1 - 0.0472021805355155*G0_1_0_1_3 - 0.0262690396023738*G0_1_0_1_4 + 0.0381721981721995*G0_1_0_1_5 - 0.0139554272887611*G0_1_0_2_0 + 0.0328362995029674*G0_1_0_2_2 + 0.0472021805355156*G0_1_0_2_3 - 0.0381721981721995*G0_1_0_2_4 + 0.0262690396023738*G0_1_0_2_5 - 0.0472021805355155*G0_1_0_3_1 + 0.0472021805355156*G0_1_0_3_2 + 0.0525380792047475*G0_1_0_3_4 - 0.0525380792047477*G0_1_0_3_5 + 0.0677248677248702*G0_1_0_4_0 - 0.0262690396023738*G0_1_0_4_1 - 0.0381721981721995*G0_1_0_4_2 + 0.0525380792047475*G0_1_0_4_3 + 0.558217091550444*G0_1_0_4_4 - 0.0677248677248701*G0_1_0_5_0 + 0.0381721981721995*G0_1_0_5_1 + 0.0262690396023738*G0_1_0_5_2 - 0.0525380792047477*G0_1_0_5_3 - 0.558217091550444*G0_1_0_5_5 - 0.459708193041543*G0_1_1_0_0 + 0.0913259579926279*G0_1_1_0_1 + 0.0264742664742674*G0_1_1_0_2 - 0.0213435946769287*G0_1_1_0_3 - 0.119031585698256*G0_1_1_0_4 - 0.443290043290059*G0_1_1_0_5 + 0.0913259579926279*G0_1_1_1_0 - 0.0504858104858122*G0_1_1_1_1 - 0.0104665704665708*G0_1_1_1_2 - 0.0369408369408382*G0_1_1_1_3 + 0.027089947089948*G0_1_1_1_4 + 0.142016995350334*G0_1_1_1_5 + 0.0264742664742674*G0_1_1_2_0 - 0.0104665704665708*G0_1_1_2_1 + 0.0254481321147998*G0_1_1_2_2 + 0.0574635241301928*G0_1_1_2_3 + 0.0402244668911349*G0_1_1_2_4 + 0.0640307840307863*G0_1_1_2_5 - 0.0213435946769287*G0_1_1_3_0 - 0.0369408369408382*G0_1_1_3_1 + 0.0574635241301928*G0_1_1_3_2 - 0.0197017797017808*G0_1_1_3_3 - 0.0114927048260386*G0_1_1_3_4 - 0.0853743787077149*G0_1_1_3_5 - 0.119031585698256*G0_1_1_4_0 + 0.027089947089948*G0_1_1_4_1 + 0.0402244668911349*G0_1_1_4_2 - 0.0114927048260386*G0_1_1_4_3 - 0.0886580086580114*G0_1_1_4_4 - 0.182241462241469*G0_1_1_4_5 - 0.443290043290059*G0_1_1_5_0 + 0.142016995350334*G0_1_1_5_1 + 0.0640307840307863*G0_1_1_5_2 - 0.0853743787077149*G0_1_1_5_3 - 0.182241462241469*G0_1_1_5_4 - 1.05732884399555*G0_1_1_5_5; + A[147] = A[189] + 0.192913259579933*G0_0_1_0_0 - 0.00636203302869993*G0_0_1_0_1 - 0.0186756453423127*G0_0_1_0_2 + 0.0024627224627225*G0_0_1_0_3 + 0.0882475549142246*G0_0_1_0_4 - 0.0102613435946773*G0_0_1_0_5 - 0.00636203302869993*G0_0_1_1_0 + 0.00328362995029684*G0_0_1_1_1 - 0.000615680615680653*G0_0_1_1_2 + 0.00615680615680636*G0_0_1_1_3 - 0.0106717973384644*G0_0_1_1_4 + 0.0488439955106639*G0_0_1_1_5 - 0.0186756453423127*G0_0_1_2_0 - 0.000615680615680653*G0_0_1_2_1 + 0.00451499118165808*G0_0_1_2_2 - 0.00123136123136121*G0_0_1_2_3 - 0.0242167708834384*G0_0_1_2_4 + 0.0131345198011869*G0_0_1_2_5 + 0.0024627224627225*G0_0_1_3_0 + 0.00615680615680637*G0_0_1_3_1 - 0.00123136123136121*G0_0_1_3_2 + 0.0164181497514841*G0_0_1_3_3 + 0.0164181497514837*G0_0_1_3_4 - 0.0311944845278189*G0_0_1_3_5 + 0.0882475549142246*G0_0_1_4_0 - 0.0106717973384644*G0_0_1_4_1 - 0.0242167708834383*G0_0_1_4_2 + 0.0164181497514837*G0_0_1_4_3 + 0.16089786756454*G0_0_1_4_4 - 0.00492544492544511*G0_0_1_4_5 - 0.0102613435946773*G0_0_1_5_0 + 0.0488439955106639*G0_0_1_5_1 + 0.0131345198011869*G0_0_1_5_2 - 0.0311944845278189*G0_0_1_5_3 - 0.0049254449254451*G0_0_1_5_4 - 0.51224627224629*G0_0_1_5_5 - 0.192913259579933*G0_1_0_0_0 + 0.00636203302869993*G0_1_0_0_1 + 0.0186756453423126*G0_1_0_0_2 - 0.0024627224627225*G0_1_0_0_3 - 0.0882475549142245*G0_1_0_0_4 + 0.0102613435946773*G0_1_0_0_5 + 0.00636203302869992*G0_1_0_1_0 - 0.00328362995029684*G0_1_0_1_1 + 0.000615680615680654*G0_1_0_1_2 - 0.00615680615680636*G0_1_0_1_3 + 0.0106717973384644*G0_1_0_1_4 - 0.0488439955106639*G0_1_0_1_5 + 0.0186756453423126*G0_1_0_2_0 + 0.000615680615680654*G0_1_0_2_1 - 0.00451499118165807*G0_1_0_2_2 + 0.00123136123136121*G0_1_0_2_3 + 0.0242167708834383*G0_1_0_2_4 - 0.0131345198011869*G0_1_0_2_5 - 0.0024627224627225*G0_1_0_3_0 - 0.00615680615680637*G0_1_0_3_1 + 0.00123136123136122*G0_1_0_3_2 - 0.0164181497514841*G0_1_0_3_3 - 0.0164181497514837*G0_1_0_3_4 + 0.0311944845278189*G0_1_0_3_5 - 0.0882475549142245*G0_1_0_4_0 + 0.0106717973384644*G0_1_0_4_1 + 0.0242167708834383*G0_1_0_4_2 - 0.0164181497514837*G0_1_0_4_3 - 0.16089786756454*G0_1_0_4_4 + 0.00492544492544511*G0_1_0_4_5 + 0.0102613435946773*G0_1_0_5_0 - 0.0488439955106639*G0_1_0_5_1 - 0.0131345198011869*G0_1_0_5_2 + 0.0311944845278189*G0_1_0_5_3 + 0.00492544492544511*G0_1_0_5_4 + 0.51224627224629*G0_1_0_5_5; + A[149] = A[147] - 0.289780343113687*G0_0_0_0_0 + 0.0102613435946773*G0_0_0_0_1 + 0.0389931056597737*G0_0_0_0_2 - 0.0328362995029671*G0_0_0_0_3 - 0.193734167067507*G0_0_0_0_4 - 0.0656725990059346*G0_0_0_0_5 + 0.0102613435946773*G0_0_0_1_0 + 0.0287317620650965*G0_0_0_1_1 - 0.0184704184704191*G0_0_0_1_2 + 0.0262690396023739*G0_0_0_1_3 + 0.00985088985089017*G0_0_0_1_4 + 0.0246272246272254*G0_0_0_1_5 + 0.0389931056597736*G0_0_0_2_0 - 0.0184704184704191*G0_0_0_2_1 + 0.0254481321147998*G0_0_0_2_2 + 0.0147763347763353*G0_0_0_2_3 + 0.0476126342793026*G0_0_0_2_4 - 0.0328362995029671*G0_0_0_3_0 + 0.0262690396023739*G0_0_0_3_1 + 0.0147763347763353*G0_0_0_3_2 + 0.51224627224629*G0_0_0_3_3 + 0.0459708193041542*G0_0_0_3_4 + 0.0656725990059347*G0_0_0_3_5 - 0.193734167067507*G0_0_0_4_0 + 0.00985088985089017*G0_0_0_4_1 + 0.0476126342793026*G0_0_0_4_2 + 0.0459708193041542*G0_0_0_4_3 - 0.197017797017803*G0_0_0_4_4 - 0.0197017797017803*G0_0_0_4_5 - 0.0656725990059346*G0_0_0_5_0 + 0.0246272246272254*G0_0_0_5_1 + 0.0656725990059347*G0_0_0_5_3 - 0.0197017797017803*G0_0_0_5_4 + 0.0131345198011873*G0_0_0_5_5 - 0.119442039442044*G0_0_1_0_0 - 0.0073881673881676*G0_0_1_0_1 + 0.00861952861952893*G0_0_1_0_2 - 0.0361199294532639*G0_0_1_0_3 - 0.0344781144781157*G0_0_1_0_4 + 0.0623889690556379*G0_0_1_0_5 - 0.0073881673881676*G0_0_1_1_0 + 0.0246272246272255*G0_0_1_1_1 - 0.0123136123136127*G0_0_1_1_2 + 0.0131345198011869*G0_0_1_1_3 - 0.0722398589065281*G0_0_1_1_5 + 0.00861952861952893*G0_0_1_2_0 - 0.0123136123136127*G0_0_1_2_1 + 0.0250376783710125*G0_0_1_2_2 - 0.0394035594035608*G0_0_1_2_5 - 0.0361199294532639*G0_0_1_3_0 + 0.0131345198011869*G0_0_1_3_1 + 0.558217091550444*G0_0_1_3_3 + 0.072239858906528*G0_0_1_3_4 + 0.15104697771365*G0_0_1_3_5 - 0.0344781144781157*G0_0_1_4_0 + 0.072239858906528*G0_0_1_4_3 - 0.0262690396023738*G0_0_1_4_4 + 0.0788071188071215*G0_0_1_4_5 + 0.0623889690556379*G0_0_1_5_0 - 0.0722398589065281*G0_0_1_5_1 - 0.0394035594035608*G0_0_1_5_2 + 0.15104697771365*G0_0_1_5_3 + 0.0788071188071215*G0_0_1_5_4 + 0.794638447971809*G0_0_1_5_5 + 0.12272566939234*G0_1_0_0_0 - 0.0197017797017804*G0_1_0_0_1 - 0.0184704184704191*G0_1_0_0_2 - 0.0213435946769287*G0_1_0_0_3 + 0.0738816738816764*G0_1_0_0_4 + 0.052538079204748*G0_1_0_0_5 - 0.0197017797017804*G0_1_0_1_0 + 0.0344781144781158*G0_1_0_1_1 - 0.013134519801187*G0_1_0_1_2 + 0.018059964726632*G0_1_0_1_3 - 0.0213435946769288*G0_1_0_1_4 + 0.00164181497514826*G0_1_0_1_5 - 0.0184704184704191*G0_1_0_2_0 - 0.013134519801187*G0_1_0_2_1 + 0.0373512906846256*G0_1_0_2_2 + 0.0131345198011872*G0_1_0_2_3 - 0.0213435946769286*G0_1_0_2_4 - 0.0246272246272255*G0_1_0_2_5 - 0.0213435946769287*G0_1_0_3_0 + 0.018059964726632*G0_1_0_3_1 + 0.0131345198011872*G0_1_0_3_2 + 0.571351611351633*G0_1_0_3_3 + 0.0853743787077151*G0_1_0_3_4 + 0.0919416386083086*G0_1_0_3_5 + 0.0738816738816764*G0_1_0_4_0 - 0.0213435946769288*G0_1_0_4_1 - 0.0213435946769286*G0_1_0_4_2 + 0.0853743787077151*G0_1_0_4_3 + 0.17074875741543*G0_1_0_4_4 + 0.0919416386083085*G0_1_0_4_5 + 0.052538079204748*G0_1_0_5_0 + 0.00164181497514826*G0_1_0_5_1 - 0.0246272246272255*G0_1_0_5_2 + 0.0919416386083086*G0_1_0_5_3 + 0.0919416386083085*G0_1_0_5_4 + 0.11164341831009*G0_1_0_5_5 + 0.293063973063984*G0_1_1_0_0 - 0.0673144139810831*G0_1_1_0_1 - 0.0172390572390579*G0_1_1_0_2 - 0.0262690396023737*G0_1_1_0_3 + 0.0525380792047477*G0_1_1_0_4 + 0.361199294532641*G0_1_1_0_5 - 0.0673144139810831*G0_1_1_1_0 + 0.0394035594035609*G0_1_1_1_1 - 0.00820907487574186*G0_1_1_1_2 - 0.0229854096520771*G0_1_1_1_4 - 0.157614237614243*G0_1_1_1_5 - 0.0172390572390579*G0_1_1_2_0 - 0.00820907487574186*G0_1_1_2_1 + 0.0369408369408383*G0_1_1_2_2 + 0.00656725990059373*G0_1_1_2_3 - 0.00656725990059344*G0_1_1_2_4 - 0.0656725990059347*G0_1_1_2_5 - 0.0262690396023737*G0_1_1_3_0 + 0.00656725990059374*G0_1_1_3_2 + 0.6041879108546*G0_1_1_3_3 + 0.098508898508902*G0_1_1_3_4 + 0.183883277216617*G0_1_1_3_5 + 0.0525380792047477*G0_1_1_4_0 - 0.0229854096520771*G0_1_1_4_1 - 0.00656725990059344*G0_1_1_4_2 + 0.098508898508902*G0_1_1_4_3 + 0.0262690396023739*G0_1_1_4_4 + 0.177316017316024*G0_1_1_4_5 + 0.361199294532641*G0_1_1_5_0 - 0.157614237614243*G0_1_1_5_1 - 0.0656725990059347*G0_1_1_5_2 + 0.183883277216617*G0_1_1_5_3 + 0.177316017316024*G0_1_1_5_4 + 1.23464486131157*G0_1_1_5_5; + A[219] = A[149] + 0.0492544492544518*G0_0_1_0_0 - 0.00595157928491289*G0_0_1_0_1 - 0.00841430174763542*G0_0_1_0_2 + 0.0123136123136127*G0_0_1_0_3 + 0.0201122334455675*G0_0_1_0_4 + 0.000410453743787394*G0_0_1_0_5 - 0.00595157928491289*G0_0_1_1_0 + 0.00656725990059347*G0_0_1_1_1 - 0.000205226871893591*G0_0_1_1_2 - 0.00123136123136131*G0_0_1_1_3 - 0.0106717973384644*G0_0_1_1_4 + 0.0250376783710125*G0_0_1_1_5 - 0.00841430174763542*G0_0_1_2_0 - 0.00020522687189359*G0_0_1_2_1 + 0.00779862113195499*G0_0_1_2_2 + 0.0143658810325484*G0_0_1_2_3 + 0.00287317620650976*G0_0_1_2_4 + 0.00164181497514834*G0_0_1_2_5 + 0.0123136123136127*G0_0_1_3_0 - 0.00123136123136131*G0_0_1_3_1 + 0.0143658810325484*G0_0_1_3_2 - 0.00328362995029563*G0_0_1_3_3 - 0.0032836299502966*G0_0_1_3_4 - 0.0279108545775221*G0_0_1_3_5 + 0.0201122334455675*G0_0_1_4_0 - 0.0106717973384644*G0_0_1_4_1 + 0.00287317620650975*G0_0_1_4_2 - 0.0032836299502966*G0_0_1_4_3 + 0.0361199294532641*G0_0_1_4_4 + 0.0180599647266321*G0_0_1_4_5 + 0.000410453743787391*G0_0_1_5_0 + 0.0250376783710125*G0_0_1_5_1 + 0.00164181497514834*G0_0_1_5_2 - 0.0279108545775221*G0_0_1_5_3 + 0.0180599647266321*G0_0_1_5_4 - 0.170748757415429*G0_0_1_5_5 - 0.0492544492544518*G0_1_0_0_0 + 0.00595157928491289*G0_1_0_0_1 + 0.00841430174763541*G0_1_0_0_2 - 0.0123136123136127*G0_1_0_0_3 - 0.0201122334455675*G0_1_0_0_4 - 0.000410453743787394*G0_1_0_0_5 + 0.00595157928491289*G0_1_0_1_0 - 0.00656725990059347*G0_1_0_1_1 + 0.000205226871893591*G0_1_0_1_2 + 0.00123136123136131*G0_1_0_1_3 + 0.0106717973384644*G0_1_0_1_4 - 0.0250376783710125*G0_1_0_1_5 + 0.00841430174763542*G0_1_0_2_0 + 0.00020522687189359*G0_1_0_2_1 - 0.00779862113195499*G0_1_0_2_2 - 0.0143658810325484*G0_1_0_2_3 - 0.00287317620650976*G0_1_0_2_4 - 0.00164181497514834*G0_1_0_2_5 - 0.0123136123136127*G0_1_0_3_0 + 0.00123136123136131*G0_1_0_3_1 - 0.0143658810325484*G0_1_0_3_2 + 0.00328362995029563*G0_1_0_3_3 + 0.00328362995029659*G0_1_0_3_4 + 0.027910854577522*G0_1_0_3_5 - 0.0201122334455675*G0_1_0_4_0 + 0.0106717973384644*G0_1_0_4_1 - 0.00287317620650976*G0_1_0_4_2 + 0.00328362995029659*G0_1_0_4_3 - 0.0361199294532641*G0_1_0_4_4 - 0.0180599647266321*G0_1_0_4_5 - 0.000410453743787387*G0_1_0_5_0 - 0.0250376783710125*G0_1_0_5_1 - 0.00164181497514834*G0_1_0_5_2 + 0.027910854577522*G0_1_0_5_3 - 0.0180599647266321*G0_1_0_5_4 + 0.170748757415429*G0_1_0_5_5; + A[103] = A[219] + 0.123136123136128*G0_0_0_0_0 - 0.00102613435946775*G0_0_0_0_1 - 0.0149815616482288*G0_0_0_0_2 - 0.0147763347763353*G0_0_0_0_3 + 0.111643418310089*G0_0_0_0_4 - 0.000820907487574133*G0_0_0_0_5 - 0.00102613435946775*G0_0_0_1_0 + 0.0336572069905416*G0_0_0_1_1 - 0.000205226871893606*G0_0_0_1_2 + 0.0377617444284126*G0_0_0_1_3 - 0.0114927048260385*G0_0_0_1_4 + 0.00902998236331609*G0_0_0_1_5 - 0.0149815616482288*G0_0_0_2_0 - 0.000205226871893605*G0_0_0_2_1 - 0.036530383197051*G0_0_0_2_2 - 0.0517171717171735*G0_0_0_2_3 - 0.0632098765432121*G0_0_0_2_4 + 0.00410453743787089*G0_0_0_2_5 - 0.0147763347763353*G0_0_0_3_0 + 0.0377617444284126*G0_0_0_3_1 - 0.0517171717171735*G0_0_0_3_2 + 0.0722398589065288*G0_0_0_3_3 + 0.0525380792047476*G0_0_0_3_4 + 0.0213435946769288*G0_0_0_3_5 + 0.111643418310089*G0_0_0_4_0 - 0.0114927048260385*G0_0_0_4_1 - 0.063209876543212*G0_0_0_4_2 + 0.0525380792047476*G0_0_0_4_3 + 0.374333814333827*G0_0_0_4_4 + 0.0147763347763352*G0_0_0_4_5 - 0.000820907487574134*G0_0_0_5_0 + 0.00902998236331609*G0_0_0_5_1 + 0.00410453743787089*G0_0_0_5_2 + 0.0213435946769288*G0_0_0_5_3 + 0.0147763347763352*G0_0_0_5_4 - 0.075523488856825*G0_0_0_5_5 - 0.000410453743787065*G0_0_1_0_1 + 0.000410453743787149*G0_0_1_0_2 + 0.00944043610710299*G0_0_1_0_4 - 0.00944043610710356*G0_0_1_0_5 - 0.000410453743787066*G0_0_1_1_0 + 0.0344781144781159*G0_0_1_1_1 + 0.0496649029982383*G0_0_1_1_3 - 0.000820907487574123*G0_0_1_1_4 + 0.011903158569826*G0_0_1_1_5 + 0.000410453743787149*G0_0_1_2_0 - 0.0344781144781156*G0_0_1_2_2 - 0.0496649029982382*G0_0_1_2_3 - 0.0119031585698257*G0_0_1_2_4 + 0.000820907487574177*G0_0_1_2_5 + 0.0496649029982383*G0_0_1_3_1 - 0.0496649029982382*G0_0_1_3_2 + 0.00164181497514829*G0_0_1_3_4 - 0.00164181497514831*G0_0_1_3_5 + 0.00944043610710299*G0_0_1_4_0 - 0.000820907487574125*G0_0_1_4_1 - 0.0119031585698257*G0_0_1_4_2 + 0.00164181497514829*G0_0_1_4_3 + 0.0558217091550443*G0_0_1_4_4 - 0.00944043610710356*G0_0_1_5_0 + 0.011903158569826*G0_0_1_5_1 + 0.000820907487574177*G0_0_1_5_2 - 0.00164181497514831*G0_0_1_5_3 - 0.0558217091550444*G0_0_1_5_5 + 0.00205226871893546*G0_1_0_0_1 - 0.00205226871893549*G0_1_0_0_2 + 0.0291422158088836*G0_1_0_0_4 - 0.0291422158088836*G0_1_0_0_5 + 0.00205226871893546*G0_1_0_1_0 + 0.0332467532467543*G0_1_0_1_1 + 0.0340676607343285*G0_1_0_1_3 - 0.0131345198011869*G0_1_0_1_4 + 0.0340676607343286*G0_1_0_1_5 - 0.00205226871893549*G0_1_0_2_0 - 0.0332467532467541*G0_1_0_2_2 - 0.0340676607343285*G0_1_0_2_3 - 0.0340676607343285*G0_1_0_2_4 + 0.0131345198011869*G0_1_0_2_5 + 0.0340676607343285*G0_1_0_3_1 - 0.0340676607343284*G0_1_0_3_2 + 0.0262690396023738*G0_1_0_3_4 - 0.0262690396023738*G0_1_0_3_5 + 0.0291422158088836*G0_1_0_4_0 - 0.0131345198011869*G0_1_0_4_1 - 0.0340676607343285*G0_1_0_4_2 + 0.0262690396023738*G0_1_0_4_3 + 0.262690396023738*G0_1_0_4_4 - 0.0291422158088836*G0_1_0_5_0 + 0.0340676607343286*G0_1_0_5_1 + 0.0131345198011869*G0_1_0_5_2 - 0.0262690396023738*G0_1_0_5_3 - 0.262690396023738*G0_1_0_5_5 - 0.123136123136127*G0_1_1_0_0 + 0.0149815616482288*G0_1_1_0_1 + 0.00102613435946773*G0_1_1_0_2 + 0.0147763347763353*G0_1_1_0_3 + 0.00082090748757427*G0_1_1_0_4 - 0.111643418310089*G0_1_1_0_5 + 0.0149815616482288*G0_1_1_1_0 + 0.0365303831970511*G0_1_1_1_1 + 0.00020522687189355*G0_1_1_1_2 + 0.0517171717171735*G0_1_1_1_3 - 0.00410453743787089*G0_1_1_1_4 + 0.0632098765432123*G0_1_1_1_5 + 0.00102613435946773*G0_1_1_2_0 + 0.00020522687189355*G0_1_1_2_1 - 0.0336572069905414*G0_1_1_2_2 - 0.0377617444284125*G0_1_1_2_3 - 0.00902998236331604*G0_1_1_2_4 + 0.0114927048260385*G0_1_1_2_5 + 0.0147763347763353*G0_1_1_3_0 + 0.0517171717171735*G0_1_1_3_1 - 0.0377617444284125*G0_1_1_3_2 - 0.0722398589065286*G0_1_1_3_3 - 0.0213435946769288*G0_1_1_3_4 - 0.0525380792047476*G0_1_1_3_5 + 0.000820907487574267*G0_1_1_4_0 - 0.00410453743787089*G0_1_1_4_1 - 0.00902998236331604*G0_1_1_4_2 - 0.0213435946769288*G0_1_1_4_3 + 0.0755234888568248*G0_1_1_4_4 - 0.0147763347763353*G0_1_1_4_5 - 0.111643418310089*G0_1_1_5_0 + 0.0632098765432123*G0_1_1_5_1 + 0.0114927048260385*G0_1_1_5_2 - 0.0525380792047476*G0_1_1_5_3 - 0.0147763347763353*G0_1_1_5_4 - 0.374333814333827*G0_1_1_5_5; + A[57] = A[103] - 0.0484335417668768*G0_0_0_0_0 + 0.00738816738816764*G0_0_0_0_2 + 0.0082090748757418*G0_0_0_0_3 - 0.0656725990059347*G0_0_0_0_4 + 0.0172390572390577*G0_0_0_0_5 + 0.0484335417668767*G0_0_0_1_1 - 0.0073881673881676*G0_0_0_1_2 + 0.0656725990059346*G0_0_0_1_3 - 0.00820907487574181*G0_0_0_1_4 - 0.0172390572390577*G0_0_0_1_5 + 0.00738816738816764*G0_0_0_2_0 - 0.0073881673881676*G0_0_0_2_1 - 0.0279108545775224*G0_0_0_2_3 + 0.0279108545775223*G0_0_0_2_4 + 0.0082090748757418*G0_0_0_3_0 + 0.0656725990059346*G0_0_0_3_1 - 0.0279108545775224*G0_0_0_3_2 + 0.0788071188071212*G0_0_0_3_3 - 0.0164181497514835*G0_0_0_3_5 - 0.0656725990059347*G0_0_0_4_0 - 0.00820907487574181*G0_0_0_4_1 + 0.0279108545775223*G0_0_0_4_2 - 0.0788071188071218*G0_0_0_4_4 + 0.0164181497514837*G0_0_0_4_5 + 0.0172390572390577*G0_0_0_5_0 - 0.0172390572390577*G0_0_0_5_1 - 0.0164181497514835*G0_0_0_5_3 + 0.0164181497514837*G0_0_0_5_4 - 0.0316049382716057*G0_0_1_0_0 + 0.0119031585698256*G0_0_1_0_1 + 0.00492544492544507*G0_0_1_0_2 - 0.000820907487574187*G0_0_1_0_3 - 0.0295526695526705*G0_0_1_0_4 - 0.0090299823633159*G0_0_1_0_5 + 0.0119031585698256*G0_0_1_1_0 + 0.0168286034952705*G0_0_1_1_1 - 0.00246272246272249*G0_0_1_1_2 + 0.036119929453264*G0_0_1_1_3 - 0.00902998236331604*G0_0_1_1_4 - 0.026269039602374*G0_0_1_1_5 + 0.00492544492544507*G0_0_1_2_0 - 0.00246272246272249*G0_0_1_2_1 + 0.0114927048260383*G0_0_1_2_2 - 0.0270899470899483*G0_0_1_2_3 + 0.000820907487574124*G0_0_1_2_4 + 0.0123136123136127*G0_0_1_2_5 - 0.000820907487574189*G0_0_1_3_0 + 0.036119929453264*G0_0_1_3_1 - 0.0270899470899482*G0_0_1_3_2 + 0.0492544492544507*G0_0_1_3_3 + 0.0197017797017805*G0_0_1_3_4 - 0.022985409652077*G0_0_1_3_5 - 0.0295526695526705*G0_0_1_4_0 - 0.00902998236331604*G0_0_1_4_1 + 0.000820907487574124*G0_0_1_4_2 + 0.0197017797017805*G0_0_1_4_3 - 0.0295526695526702*G0_0_1_4_4 - 0.00656725990059329*G0_0_1_4_5 - 0.0090299823633159*G0_0_1_5_0 - 0.026269039602374*G0_0_1_5_1 + 0.0123136123136127*G0_0_1_5_2 - 0.022985409652077*G0_0_1_5_3 - 0.00656725990059328*G0_0_1_5_4 - 0.0558217091550448*G0_0_1_5_5 + 0.0254481321147999*G0_1_0_0_0 - 0.00492544492544515*G0_1_0_0_1 - 0.00123136123136127*G0_1_0_0_2 + 0.0131345198011868*G0_1_0_0_3 - 0.0147763347763353*G0_1_0_0_4 + 0.0139554272887612*G0_1_0_0_5 - 0.00492544492544515*G0_1_0_1_0 + 0.0738816738816771*G0_1_0_1_1 - 0.00861952861952893*G0_1_0_1_2 + 0.0508962642295995*G0_1_0_1_3 + 0.00492544492544508*G0_1_0_1_4 - 0.00328362995029653*G0_1_0_1_5 - 0.00123136123136127*G0_1_0_2_0 - 0.00861952861952893*G0_1_0_2_1 + 0.0246272246272253*G0_1_0_2_2 - 0.00328362995029692*G0_1_0_2_3 + 0.0246272246272255*G0_1_0_2_4 - 0.00902998236331606*G0_1_0_2_5 + 0.0131345198011868*G0_1_0_3_0 + 0.0508962642295995*G0_1_0_3_1 - 0.00328362995029692*G0_1_0_3_2 - 0.124777938111276*G0_1_0_3_3 - 0.0361199294532639*G0_1_0_3_4 - 0.00820907487574163*G0_1_0_3_5 - 0.0147763347763353*G0_1_0_4_0 + 0.00492544492544508*G0_1_0_4_1 + 0.0246272246272255*G0_1_0_4_2 - 0.0361199294532639*G0_1_0_4_3 - 0.203585056918397*G0_1_0_4_4 + 0.00820907487574196*G0_1_0_4_5 + 0.0139554272887612*G0_1_0_5_0 - 0.00328362995029653*G0_1_0_5_1 - 0.00902998236331606*G0_1_0_5_2 - 0.00820907487574163*G0_1_0_5_3 + 0.00820907487574196*G0_1_0_5_4 + 0.016418149751484*G0_1_0_5_5 + 0.0615680615680631*G0_1_1_0_0 + 0.0034888568221903*G0_1_1_0_1 - 0.00225749559082897*G0_1_1_0_2 + 0.00492544492544502*G0_1_1_0_3 + 0.0106717973384642*G0_1_1_0_4 + 0.0344781144781156*G0_1_1_0_5 + 0.0034888568221903*G0_1_1_1_0 - 0.0192913259579934*G0_1_1_1_1 - 0.0014365881032548*G0_1_1_1_2 + 0.0106717973384644*G0_1_1_1_3 - 0.000820907487574191*G0_1_1_1_4 - 0.0467917267917285*G0_1_1_1_5 - 0.00225749559082897*G0_1_1_2_0 - 0.0014365881032548*G0_1_1_2_1 + 0.0180599647266318*G0_1_1_2_2 - 0.00246272246272254*G0_1_1_2_4 + 0.00164181497514834*G0_1_1_2_5 + 0.00492544492544502*G0_1_1_3_0 + 0.0106717973384644*G0_1_1_3_1 - 0.111643418310089*G0_1_1_3_3 - 0.00820907487574172*G0_1_1_3_4 - 0.0131345198011868*G0_1_1_3_5 + 0.0106717973384642*G0_1_1_4_0 - 0.000820907487574191*G0_1_1_4_1 - 0.00246272246272254*G0_1_1_4_2 - 0.00820907487574172*G0_1_1_4_3 - 0.0426871893538574*G0_1_1_4_4 - 0.00164181497514829*G0_1_1_4_5 + 0.0344781144781156*G0_1_1_5_0 - 0.0467917267917285*G0_1_1_5_1 + 0.00164181497514834*G0_1_1_5_2 - 0.0131345198011868*G0_1_1_5_3 - 0.00164181497514829*G0_1_1_5_4 - 0.0197017797017809*G0_1_1_5_5; + A[201] = A[103] - 0.0492544492544508*G0_0_1_0_0 + 0.00841430174763542*G0_0_1_0_1 + 0.00595157928491278*G0_0_1_0_2 - 0.0123136123136127*G0_0_1_0_3 - 0.000410453743786954*G0_0_1_0_4 - 0.0201122334455674*G0_0_1_0_5 + 0.00841430174763542*G0_0_1_1_0 - 0.0077986211319551*G0_0_1_1_1 + 0.000205226871893603*G0_0_1_1_2 - 0.0143658810325484*G0_0_1_1_3 - 0.00164181497514839*G0_0_1_1_4 - 0.00287317620650992*G0_0_1_1_5 + 0.00595157928491278*G0_0_1_2_0 + 0.000205226871893602*G0_0_1_2_1 - 0.0065672599005935*G0_0_1_2_2 + 0.00123136123136135*G0_0_1_2_3 - 0.0250376783710126*G0_0_1_2_4 + 0.0106717973384644*G0_0_1_2_5 - 0.0123136123136127*G0_0_1_3_0 - 0.0143658810325484*G0_0_1_3_1 + 0.00123136123136136*G0_0_1_3_2 + 0.00328362995029585*G0_0_1_3_3 + 0.0279108545775221*G0_0_1_3_4 + 0.00328362995029658*G0_0_1_3_5 - 0.00041045374378694*G0_0_1_4_0 - 0.00164181497514839*G0_0_1_4_1 - 0.0250376783710126*G0_0_1_4_2 + 0.0279108545775221*G0_0_1_4_3 + 0.17074875741543*G0_0_1_4_4 - 0.018059964726632*G0_0_1_4_5 - 0.0201122334455674*G0_0_1_5_0 - 0.00287317620650992*G0_0_1_5_1 + 0.0106717973384644*G0_0_1_5_2 + 0.00328362995029658*G0_0_1_5_3 - 0.018059964726632*G0_0_1_5_4 - 0.0361199294532647*G0_0_1_5_5 + 0.0492544492544508*G0_1_0_0_0 - 0.00841430174763542*G0_1_0_0_1 - 0.00595157928491278*G0_1_0_0_2 + 0.0123136123136127*G0_1_0_0_3 + 0.000410453743786933*G0_1_0_0_4 + 0.0201122334455674*G0_1_0_0_5 - 0.00841430174763542*G0_1_0_1_0 + 0.0077986211319551*G0_1_0_1_1 - 0.000205226871893602*G0_1_0_1_2 + 0.0143658810325484*G0_1_0_1_3 + 0.00164181497514839*G0_1_0_1_4 + 0.00287317620650992*G0_1_0_1_5 - 0.00595157928491278*G0_1_0_2_0 - 0.000205226871893602*G0_1_0_2_1 + 0.0065672599005935*G0_1_0_2_2 - 0.00123136123136135*G0_1_0_2_3 + 0.0250376783710126*G0_1_0_2_4 - 0.0106717973384644*G0_1_0_2_5 + 0.0123136123136127*G0_1_0_3_0 + 0.0143658810325484*G0_1_0_3_1 - 0.00123136123136136*G0_1_0_3_2 - 0.00328362995029591*G0_1_0_3_3 - 0.0279108545775221*G0_1_0_3_4 - 0.00328362995029658*G0_1_0_3_5 + 0.000410453743786933*G0_1_0_4_0 + 0.00164181497514839*G0_1_0_4_1 + 0.0250376783710126*G0_1_0_4_2 - 0.0279108545775221*G0_1_0_4_3 - 0.17074875741543*G0_1_0_4_4 + 0.018059964726632*G0_1_0_4_5 + 0.0201122334455674*G0_1_0_5_0 + 0.00287317620650992*G0_1_0_5_1 - 0.0106717973384644*G0_1_0_5_2 - 0.00328362995029658*G0_1_0_5_3 + 0.018059964726632*G0_1_0_5_4 + 0.0361199294532647*G0_1_0_5_5; + A[177] = -A[57] + 0.118210678210682*G0_0_0_0_0 + 0.00472021805355155*G0_0_0_0_1 - 0.0272951739618415*G0_0_0_0_2 + 0.00328362995029667*G0_0_0_0_3 + 0.126419753086424*G0_0_0_0_4 + 0.041045374378709*G0_0_0_0_5 + 0.00472021805355155*G0_0_0_1_0 - 0.012313612313613*G0_0_0_1_1 + 0.00389931056597734*G0_0_0_1_2 + 0.0164181497514838*G0_0_0_1_3 - 0.0394035594035607*G0_0_0_1_4 - 0.0410453743787091*G0_0_0_1_5 - 0.0272951739618415*G0_0_0_2_0 + 0.00389931056597734*G0_0_0_2_1 - 0.0184704184704191*G0_0_0_2_2 - 0.0287317620650965*G0_0_0_2_3 - 0.0566426166426184*G0_0_0_2_4 + 0.0188808722142061*G0_0_0_2_5 + 0.00328362995029667*G0_0_0_3_0 + 0.0164181497514838*G0_0_0_3_1 - 0.0287317620650965*G0_0_0_3_2 + 0.242988616321959*G0_0_0_3_3 + 0.072239858906528*G0_0_0_3_4 - 0.0443290043290056*G0_0_0_3_5 + 0.126419753086424*G0_0_0_4_0 - 0.0394035594035607*G0_0_0_4_1 - 0.0566426166426184*G0_0_0_4_2 + 0.072239858906528*G0_0_0_4_3 + 0.623889690556377*G0_0_0_4_4 + 0.0410453743787091*G0_0_0_4_5 + 0.041045374378709*G0_0_0_5_0 - 0.0410453743787091*G0_0_0_5_1 + 0.0188808722142061*G0_0_0_5_2 - 0.0443290043290056*G0_0_0_5_3 + 0.0410453743787091*G0_0_0_5_4 - 0.187166907166914*G0_0_0_5_5 - 0.0119031585698255*G0_0_1_0_0 + 0.0205226871893545*G0_0_1_0_1 - 0.000820907487574167*G0_0_1_0_2 - 0.000820907487574239*G0_0_1_0_3 - 0.0155972422639095*G0_0_1_0_4 - 0.0500753567420252*G0_0_1_0_5 + 0.0205226871893545*G0_0_1_1_0 + 0.00410453743787088*G0_0_1_1_2 + 0.00820907487574208*G0_0_1_1_3 - 0.0246272246272255*G0_0_1_1_4 - 0.00820907487574162*G0_0_1_1_5 - 0.000820907487574167*G0_0_1_2_0 + 0.00410453743787088*G0_0_1_2_1 - 0.0094404361071031*G0_0_1_2_2 - 0.0254481321147999*G0_0_1_2_3 - 0.00574635241301933*G0_0_1_2_4 + 0.0238063171396512*G0_0_1_2_5 - 0.000820907487574241*G0_0_1_3_0 + 0.00820907487574208*G0_0_1_3_1 - 0.0254481321147999*G0_0_1_3_2 + 0.193734167067508*G0_0_1_3_3 + 0.0508962642295995*G0_0_1_3_4 - 0.0459708193041538*G0_0_1_3_5 - 0.0155972422639095*G0_0_1_4_0 - 0.0246272246272255*G0_0_1_4_1 - 0.00574635241301933*G0_0_1_4_2 + 0.0508962642295995*G0_0_1_4_3 + 0.0656725990059352*G0_0_1_4_4 + 0.00164181497514857*G0_0_1_4_5 - 0.0500753567420252*G0_0_1_5_0 - 0.00820907487574161*G0_0_1_5_1 + 0.0238063171396512*G0_0_1_5_2 - 0.0459708193041538*G0_0_1_5_3 + 0.00164181497514857*G0_0_1_5_4 - 0.101792528459198*G0_0_1_5_5; + A[191] = A[177] + 0.0041045374378707*G0_0_1_0_0 - 0.0121083854417191*G0_0_1_0_1 + 0.00102613435946772*G0_0_1_0_2 - 0.000820907487574095*G0_0_1_0_3 + 0.00123136123136127*G0_0_1_0_4 + 0.0472021805355155*G0_0_1_0_5 - 0.0121083854417191*G0_0_1_1_0 - 0.0492544492544516*G0_0_1_1_1 + 0.00184704184704196*G0_0_1_1_2 - 0.0086195286195291*G0_0_1_1_3 + 0.0123136123136128*G0_0_1_1_4 - 0.0119031585698259*G0_0_1_1_5 + 0.00102613435946772*G0_0_1_2_0 + 0.00184704184704196*G0_0_1_2_1 + 0.0028731762065096*G0_0_1_2_2 + 0.000410453743787152*G0_0_1_2_3 + 0.00697771364438056*G0_0_1_2_4 - 0.0131345198011868*G0_0_1_2_5 - 0.000820907487574094*G0_0_1_3_0 - 0.00861952861952912*G0_0_1_3_1 + 0.000410453743787152*G0_0_1_3_2 - 0.0229854096520778*G0_0_1_3_3 - 0.0229854096520773*G0_0_1_3_4 + 0.0279108545775218*G0_0_1_3_5 + 0.00123136123136127*G0_0_1_4_0 + 0.0123136123136128*G0_0_1_4_1 + 0.00697771364438056*G0_0_1_4_2 - 0.0229854096520773*G0_0_1_4_3 - 0.0623889690556381*G0_0_1_4_4 + 0.00164181497514818*G0_0_1_4_5 + 0.0472021805355155*G0_0_1_5_0 - 0.0119031585698259*G0_0_1_5_1 - 0.0131345198011868*G0_0_1_5_2 + 0.0279108545775218*G0_0_1_5_3 + 0.00164181497514818*G0_0_1_5_4 + 0.0656725990059341*G0_0_1_5_5 - 0.00410453743787071*G0_1_0_0_0 + 0.0121083854417191*G0_1_0_0_1 - 0.00102613435946772*G0_1_0_0_2 + 0.000820907487574096*G0_1_0_0_3 - 0.00123136123136127*G0_1_0_0_4 - 0.0472021805355155*G0_1_0_0_5 + 0.0121083854417191*G0_1_0_1_0 + 0.0492544492544516*G0_1_0_1_1 - 0.00184704184704197*G0_1_0_1_2 + 0.00861952861952912*G0_1_0_1_3 - 0.0123136123136128*G0_1_0_1_4 + 0.0119031585698259*G0_1_0_1_5 - 0.00102613435946772*G0_1_0_2_0 - 0.00184704184704197*G0_1_0_2_1 - 0.0028731762065096*G0_1_0_2_2 - 0.000410453743787158*G0_1_0_2_3 - 0.00697771364438056*G0_1_0_2_4 + 0.0131345198011868*G0_1_0_2_5 + 0.000820907487574093*G0_1_0_3_0 + 0.00861952861952912*G0_1_0_3_1 - 0.000410453743787152*G0_1_0_3_2 + 0.0229854096520778*G0_1_0_3_3 + 0.0229854096520773*G0_1_0_3_4 - 0.0279108545775218*G0_1_0_3_5 - 0.00123136123136127*G0_1_0_4_0 - 0.0123136123136128*G0_1_0_4_1 - 0.00697771364438056*G0_1_0_4_2 + 0.0229854096520773*G0_1_0_4_3 + 0.0623889690556381*G0_1_0_4_4 - 0.00164181497514818*G0_1_0_4_5 - 0.0472021805355155*G0_1_0_5_0 + 0.0119031585698259*G0_1_0_5_1 + 0.0131345198011868*G0_1_0_5_2 - 0.0279108545775218*G0_1_0_5_3 - 0.00164181497514818*G0_1_0_5_4 - 0.0656725990059341*G0_1_0_5_5; + A[132] = A[191] - 0.105076158409495*G0_0_0_0_0 - 0.00348885682219029*G0_0_0_0_1 + 0.0162129228795901*G0_0_0_0_2 - 0.0147763347763352*G0_0_0_0_3 - 0.114927048260385*G0_0_0_0_4 - 0.0352990219656898*G0_0_0_0_5 - 0.00348885682219029*G0_0_0_1_0 + 0.0763443963443993*G0_0_0_1_1 - 0.0100561167227837*G0_0_0_1_2 + 0.0870161936828634*G0_0_0_1_3 + 0.018059964726632*G0_0_0_1_4 + 0.03529902196569*G0_0_0_1_5 + 0.0162129228795901*G0_0_0_2_0 - 0.0100561167227837*G0_0_0_2_1 + 0.00123136123136081*G0_0_0_2_2 - 0.061568061568064*G0_0_0_2_3 + 0.0681353214686568*G0_0_0_2_4 - 0.0139554272887611*G0_0_0_2_5 - 0.0147763347763352*G0_0_0_3_0 + 0.0870161936828634*G0_0_0_3_1 - 0.061568061568064*G0_0_0_3_2 + 0.0197017797017793*G0_0_0_3_3 - 0.00656725990059358*G0_0_0_3_4 + 0.0574635241301927*G0_0_0_3_5 - 0.114927048260385*G0_0_0_4_0 + 0.018059964726632*G0_0_0_4_1 + 0.0681353214686568*G0_0_0_4_2 - 0.00656725990059358*G0_0_0_4_3 - 0.308661215327892*G0_0_0_4_4 - 0.00820907487574178*G0_0_0_4_5 - 0.0352990219656898*G0_0_0_5_0 + 0.03529902196569*G0_0_0_5_1 - 0.0139554272887611*G0_0_0_5_2 + 0.0574635241301927*G0_0_0_5_3 - 0.00820907487574179*G0_0_0_5_4 + 0.154330607663946*G0_0_0_5_5 - 0.0016418149751484*G0_0_1_0_1 + 0.00164181497514836*G0_0_1_0_2 + 0.000410453743787103*G0_0_1_0_4 - 0.000410453743787086*G0_0_1_0_5 - 0.0016418149751484*G0_0_1_1_0 + 0.0825012025012059*G0_0_1_1_1 + 0.0882475549142248*G0_0_1_1_3 + 0.000820907487574188*G0_0_1_1_4 + 0.0061568061568065*G0_0_1_1_5 + 0.00164181497514836*G0_0_1_2_0 - 0.0825012025012057*G0_0_1_2_2 - 0.0882475549142249*G0_0_1_2_3 - 0.0061568061568064*G0_0_1_2_4 - 0.00082090748757427*G0_0_1_2_5 + 0.0882475549142248*G0_0_1_3_1 - 0.0882475549142249*G0_0_1_3_2 - 0.00164181497514835*G0_0_1_3_4 + 0.00164181497514855*G0_0_1_3_5 + 0.000410453743787103*G0_0_1_4_0 + 0.000820907487574189*G0_0_1_4_1 - 0.0061568061568064*G0_0_1_4_2 - 0.00164181497514835*G0_0_1_4_3 + 0.0426871893538574*G0_0_1_4_4 - 0.00041045374378708*G0_0_1_5_0 + 0.0061568061568065*G0_0_1_5_1 - 0.000820907487574269*G0_0_1_5_2 + 0.00164181497514855*G0_0_1_5_3 - 0.042687189353857*G0_0_1_5_5 - 0.0147763347763352*G0_1_0_0_1 + 0.0147763347763353*G0_1_0_0_2 - 0.0455603655603671*G0_1_0_0_4 + 0.0455603655603671*G0_1_0_0_5 - 0.0147763347763352*G0_1_0_1_0 + 0.0303735770402446*G0_1_0_1_1 + 0.0792175725509086*G0_1_0_1_3 + 0.0262690396023739*G0_1_0_1_4 - 0.0127240660573999*G0_1_0_1_5 + 0.0147763347763353*G0_1_0_2_0 - 0.0303735770402451*G0_1_0_2_2 - 0.0792175725509088*G0_1_0_2_3 + 0.0127240660573998*G0_1_0_2_4 - 0.0262690396023738*G0_1_0_2_5 + 0.0792175725509086*G0_1_0_3_1 - 0.0792175725509088*G0_1_0_3_2 - 0.0525380792047478*G0_1_0_3_4 + 0.0525380792047474*G0_1_0_3_5 - 0.0455603655603671*G0_1_0_4_0 + 0.0262690396023739*G0_1_0_4_1 + 0.0127240660573998*G0_1_0_4_2 - 0.0525380792047478*G0_1_0_4_3 - 0.0853743787077147*G0_1_0_4_4 + 0.0455603655603671*G0_1_0_5_0 - 0.0127240660573999*G0_1_0_5_1 - 0.0262690396023738*G0_1_0_5_2 + 0.0525380792047474*G0_1_0_5_3 + 0.0853743787077144*G0_1_0_5_5 + 0.105076158409496*G0_1_1_0_0 - 0.0162129228795901*G0_1_1_0_1 + 0.00348885682219026*G0_1_1_0_2 + 0.0147763347763352*G0_1_1_0_3 + 0.0352990219656898*G0_1_1_0_4 + 0.114927048260386*G0_1_1_0_5 - 0.0162129228795901*G0_1_1_1_0 - 0.00123136123136138*G0_1_1_1_1 + 0.0100561167227838*G0_1_1_1_2 + 0.0615680615680637*G0_1_1_1_3 + 0.0139554272887611*G0_1_1_1_4 - 0.0681353214686572*G0_1_1_1_5 + 0.00348885682219026*G0_1_1_2_0 + 0.0100561167227838*G0_1_1_2_1 - 0.0763443963443993*G0_1_1_2_2 - 0.0870161936828636*G0_1_1_2_3 - 0.0352990219656899*G0_1_1_2_4 - 0.0180599647266321*G0_1_1_2_5 + 0.0147763347763352*G0_1_1_3_0 + 0.0615680615680637*G0_1_1_3_1 - 0.0870161936828636*G0_1_1_3_2 - 0.0197017797017808*G0_1_1_3_3 - 0.0574635241301927*G0_1_1_3_4 + 0.00656725990059353*G0_1_1_3_5 + 0.0352990219656898*G0_1_1_4_0 + 0.0139554272887611*G0_1_1_4_1 - 0.0352990219656899*G0_1_1_4_2 - 0.0574635241301927*G0_1_1_4_3 - 0.154330607663946*G0_1_1_4_4 + 0.00820907487574192*G0_1_1_4_5 + 0.114927048260386*G0_1_1_5_0 - 0.0681353214686572*G0_1_1_5_1 - 0.0180599647266321*G0_1_1_5_2 + 0.00656725990059353*G0_1_1_5_3 + 0.00820907487574192*G0_1_1_5_4 + 0.308661215327893*G0_1_1_5_5; + A[188] = A[132] - 0.00410453743787101*G0_0_1_0_0 - 0.00102613435946771*G0_0_1_0_1 + 0.0121083854417192*G0_0_1_0_2 + 0.000820907487574193*G0_0_1_0_3 - 0.0472021805355155*G0_0_1_0_4 - 0.0012313612313613*G0_0_1_0_5 - 0.00102613435946771*G0_0_1_1_0 - 0.00287317620650962*G0_0_1_1_1 - 0.00184704184704191*G0_0_1_1_2 - 0.000410453743787138*G0_0_1_1_3 + 0.0131345198011869*G0_0_1_1_4 - 0.00697771364438051*G0_0_1_1_5 + 0.0121083854417192*G0_0_1_2_0 - 0.00184704184704191*G0_0_1_2_1 + 0.0492544492544509*G0_0_1_2_2 + 0.00861952861952898*G0_0_1_2_3 + 0.0119031585698256*G0_0_1_2_4 - 0.0123136123136127*G0_0_1_2_5 + 0.00082090748757419*G0_0_1_3_0 - 0.000410453743787138*G0_0_1_3_1 + 0.00861952861952898*G0_0_1_3_2 + 0.022985409652077*G0_0_1_3_3 - 0.0279108545775222*G0_0_1_3_4 + 0.022985409652077*G0_0_1_3_5 - 0.0472021805355155*G0_0_1_4_0 + 0.0131345198011869*G0_0_1_4_1 + 0.0119031585698256*G0_0_1_4_2 - 0.0279108545775222*G0_0_1_4_3 - 0.065672599005934*G0_0_1_4_4 - 0.00164181497514842*G0_0_1_4_5 - 0.0012313612313613*G0_0_1_5_0 - 0.00697771364438051*G0_0_1_5_1 - 0.0123136123136127*G0_0_1_5_2 + 0.022985409652077*G0_0_1_5_3 - 0.00164181497514843*G0_0_1_5_4 + 0.0623889690556373*G0_0_1_5_5 + 0.004104537437871*G0_1_0_0_0 + 0.00102613435946771*G0_1_0_0_1 - 0.0121083854417192*G0_1_0_0_2 - 0.000820907487574191*G0_1_0_0_3 + 0.0472021805355155*G0_1_0_0_4 + 0.00123136123136129*G0_1_0_0_5 + 0.00102613435946771*G0_1_0_1_0 + 0.00287317620650962*G0_1_0_1_1 + 0.00184704184704191*G0_1_0_1_2 + 0.000410453743787138*G0_1_0_1_3 - 0.0131345198011869*G0_1_0_1_4 + 0.00697771364438051*G0_1_0_1_5 - 0.0121083854417192*G0_1_0_2_0 + 0.00184704184704191*G0_1_0_2_1 - 0.0492544492544509*G0_1_0_2_2 - 0.00861952861952898*G0_1_0_2_3 - 0.0119031585698256*G0_1_0_2_4 + 0.0123136123136127*G0_1_0_2_5 - 0.000820907487574191*G0_1_0_3_0 + 0.000410453743787138*G0_1_0_3_1 - 0.00861952861952898*G0_1_0_3_2 - 0.022985409652077*G0_1_0_3_3 + 0.0279108545775222*G0_1_0_3_4 - 0.022985409652077*G0_1_0_3_5 + 0.0472021805355155*G0_1_0_4_0 - 0.0131345198011869*G0_1_0_4_1 - 0.0119031585698256*G0_1_0_4_2 + 0.0279108545775222*G0_1_0_4_3 + 0.065672599005934*G0_1_0_4_4 + 0.00164181497514842*G0_1_0_4_5 + 0.0012313612313613*G0_1_0_5_0 + 0.00697771364438051*G0_1_0_5_1 + 0.0123136123136127*G0_1_0_5_2 - 0.022985409652077*G0_1_0_5_3 + 0.00164181497514842*G0_1_0_5_4 - 0.0623889690556373*G0_1_0_5_5; + A[104] = A[132] + 0.0492544492544509*G0_0_0_0_0 - 0.00246272246272255*G0_0_0_0_1 - 0.0123136123136128*G0_0_0_0_2 - 0.00985088985089019*G0_0_0_0_3 + 0.00164181497514815*G0_0_0_0_4 + 0.0188808722142062*G0_0_0_0_5 - 0.00246272246272255*G0_0_0_1_0 + 0.00902998236331605*G0_0_0_1_1 - 0.0279108545775223*G0_0_0_1_2 - 0.0508962642295995*G0_0_0_1_3 - 0.00328362995029678*G0_0_0_1_4 - 0.00574635241301929*G0_0_0_1_5 - 0.0123136123136128*G0_0_0_2_0 - 0.0279108545775223*G0_0_0_2_1 + 0.110822510822516*G0_0_0_2_2 + 0.152688792688799*G0_0_0_2_3 + 0.0443290043290062*G0_0_0_2_4 + 0.00328362995029678*G0_0_0_2_5 - 0.00985088985089019*G0_0_0_3_0 - 0.0508962642295995*G0_0_0_3_1 + 0.152688792688799*G0_0_0_3_2 + 0.446573673240357*G0_0_0_3_3 + 0.0262690396023741*G0_0_0_3_4 + 0.0131345198011871*G0_0_0_3_5 + 0.00164181497514815*G0_0_0_4_0 - 0.00328362995029678*G0_0_0_4_1 + 0.0443290043290062*G0_0_0_4_2 + 0.0262690396023741*G0_0_0_4_3 - 0.105076158409495*G0_0_0_4_4 + 0.0188808722142062*G0_0_0_5_0 - 0.00574635241301929*G0_0_0_5_1 + 0.00328362995029678*G0_0_0_5_2 + 0.0131345198011871*G0_0_0_5_3 + 0.00656725990059366*G0_0_0_5_5 + 0.0131345198011869*G0_0_1_0_0 + 0.0026679493346161*G0_0_1_0_1 - 0.000205226871893515*G0_0_1_0_2 - 0.0262690396023738*G0_0_1_0_3 - 0.027089947089948*G0_0_1_0_4 + 0.00164181497514836*G0_0_1_0_5 + 0.0026679493346161*G0_0_1_1_0 + 0.00615680615680633*G0_0_1_1_1 - 0.0359147025813705*G0_0_1_1_2 - 0.0599262465929155*G0_0_1_1_3 + 0.00985088985089017*G0_0_1_1_4 - 0.00410453743787096*G0_0_1_1_5 - 0.000205226871893515*G0_0_1_2_0 - 0.0359147025813705*G0_0_1_2_1 + 0.192092352092359*G0_0_1_2_2 + 0.177316017316024*G0_0_1_2_3 + 0.0377617444284124*G0_0_1_2_4 + 0.00820907487574189*G0_0_1_2_5 - 0.0262690396023738*G0_0_1_3_0 - 0.0599262465929155*G0_0_1_3_1 + 0.177316017316024*G0_0_1_3_2 + 0.499111752445104*G0_0_1_3_3 + 0.0328362995029674*G0_0_1_3_4 + 0.0361199294532641*G0_0_1_3_5 - 0.027089947089948*G0_0_1_4_0 + 0.00985088985089017*G0_0_1_4_1 + 0.0377617444284124*G0_0_1_4_2 + 0.0328362995029674*G0_0_1_4_3 - 0.17074875741543*G0_0_1_4_4 - 0.036119929453264*G0_0_1_4_5 + 0.00164181497514835*G0_0_1_5_0 - 0.00410453743787096*G0_0_1_5_1 + 0.0082090748757419*G0_0_1_5_2 + 0.0361199294532641*G0_0_1_5_3 - 0.036119929453264*G0_0_1_5_4 + 0.03940355940356*G0_0_1_5_5 - 0.0320153920153937*G0_1_0_0_0 + 0.00554112554112576*G0_1_0_0_1 - 0.0244219977553319*G0_1_0_0_2 - 0.0147763347763353*G0_1_0_0_3 + 0.00820907487574168*G0_1_0_0_4 - 0.00574635241301958*G0_1_0_0_5 + 0.00554112554112576*G0_1_0_1_0 + 0.0119031585698257*G0_1_0_1_1 - 0.0330415263748609*G0_1_0_1_2 - 0.0525380792047477*G0_1_0_1_3 - 0.0164181497514837*G0_1_0_1_4 + 0.00328362995029678*G0_1_0_1_5 - 0.0244219977553319*G0_1_0_2_0 - 0.0330415263748609*G0_1_0_2_1 + 0.146942440275779*G0_1_0_2_2 + 0.169927849927856*G0_1_0_2_3 + 0.0730607663941023*G0_1_0_2_4 + 0.0197017797017804*G0_1_0_2_5 - 0.0147763347763353*G0_1_0_3_0 - 0.0525380792047477*G0_1_0_3_1 + 0.169927849927856*G0_1_0_3_2 + 0.413737373737389*G0_1_0_3_3 + 0.062388969055638*G0_1_0_3_4 - 0.00985088985088995*G0_1_0_3_5 + 0.00820907487574167*G0_1_0_4_0 - 0.0164181497514837*G0_1_0_4_1 + 0.0730607663941023*G0_1_0_4_2 + 0.062388969055638*G0_1_0_4_3 - 0.0394035594035609*G0_1_0_4_4 - 0.00656725990059339*G0_1_0_4_5 - 0.00574635241301958*G0_1_0_5_0 + 0.00328362995029678*G0_1_0_5_1 + 0.0197017797017804*G0_1_0_5_2 - 0.00985088985088995*G0_1_0_5_3 - 0.00656725990059339*G0_1_0_5_4 - 0.0459708193041542*G0_1_0_5_5 - 0.178957832291173*G0_1_1_0_0 + 0.0385826519159867*G0_1_1_0_1 - 0.0344781144781156*G0_1_1_0_3 - 0.0648516915183605*G0_1_1_0_4 - 0.175674202340876*G0_1_1_0_5 + 0.0385826519159867*G0_1_1_1_0 - 0.0385826519159866*G0_1_1_1_2 - 0.0558217091550444*G0_1_1_1_3 + 0.0558217091550445*G0_1_1_1_5 - 0.0385826519159866*G0_1_1_2_1 + 0.178957832291172*G0_1_1_2_2 + 0.175674202340875*G0_1_1_2_3 + 0.0648516915183604*G0_1_1_2_4 + 0.0344781144781157*G0_1_1_2_5 - 0.0344781144781156*G0_1_1_3_0 - 0.0558217091550444*G0_1_1_3_1 + 0.175674202340875*G0_1_1_3_2 + 0.459708193041543*G0_1_1_3_3 + 0.0689562289562314*G0_1_1_3_4 - 0.0648516915183605*G0_1_1_4_0 + 0.0648516915183604*G0_1_1_4_2 + 0.0689562289562314*G0_1_1_4_3 - 0.0689562289562313*G0_1_1_4_5 - 0.175674202340876*G0_1_1_5_0 + 0.0558217091550445*G0_1_1_5_1 + 0.0344781144781157*G0_1_1_5_2 - 0.0689562289562313*G0_1_1_5_4 - 0.459708193041543*G0_1_1_5_5; + A[216] = A[104] - 0.0492544492544517*G0_0_1_0_0 + 0.00184704184704195*G0_0_1_0_1 - 0.0121083854417192*G0_0_1_0_2 + 0.0123136123136127*G0_0_1_0_3 - 0.0119031585698258*G0_0_1_0_4 - 0.00861952861952923*G0_0_1_0_5 + 0.00184704184704195*G0_0_1_1_0 + 0.00287317620650974*G0_0_1_1_1 + 0.00102613435946769*G0_0_1_1_2 + 0.0069777136443806*G0_0_1_1_3 - 0.0131345198011869*G0_0_1_1_4 + 0.000410453743787229*G0_0_1_1_5 - 0.0121083854417192*G0_0_1_2_0 + 0.00102613435946769*G0_0_1_2_1 + 0.00410453743787137*G0_0_1_2_2 + 0.00123136123136135*G0_0_1_2_3 + 0.0472021805355156*G0_0_1_2_4 - 0.000820907487574178*G0_0_1_2_5 + 0.0123136123136127*G0_0_1_3_0 + 0.00697771364438061*G0_0_1_3_1 + 0.00123136123136133*G0_0_1_3_2 - 0.062388969055638*G0_0_1_3_3 + 0.00164181497514843*G0_0_1_3_4 - 0.022985409652077*G0_0_1_3_5 - 0.0119031585698258*G0_0_1_4_0 - 0.0131345198011869*G0_0_1_4_1 + 0.0472021805355156*G0_0_1_4_2 + 0.00164181497514844*G0_0_1_4_3 + 0.0656725990059347*G0_0_1_4_4 + 0.0279108545775222*G0_0_1_4_5 - 0.00861952861952922*G0_0_1_5_0 + 0.000410453743787226*G0_0_1_5_1 - 0.00082090748757418*G0_0_1_5_2 - 0.022985409652077*G0_0_1_5_3 + 0.0279108545775222*G0_0_1_5_4 - 0.0229854096520768*G0_0_1_5_5 + 0.0492544492544517*G0_1_0_0_0 - 0.00184704184704195*G0_1_0_0_1 + 0.0121083854417192*G0_1_0_0_2 - 0.0123136123136127*G0_1_0_0_3 + 0.0119031585698258*G0_1_0_0_4 + 0.00861952861952923*G0_1_0_0_5 - 0.00184704184704195*G0_1_0_1_0 - 0.00287317620650974*G0_1_0_1_1 - 0.00102613435946769*G0_1_0_1_2 - 0.0069777136443806*G0_1_0_1_3 + 0.0131345198011869*G0_1_0_1_4 - 0.00041045374378723*G0_1_0_1_5 + 0.0121083854417192*G0_1_0_2_0 - 0.00102613435946769*G0_1_0_2_1 - 0.00410453743787136*G0_1_0_2_2 - 0.00123136123136133*G0_1_0_2_3 - 0.0472021805355156*G0_1_0_2_4 + 0.00082090748757418*G0_1_0_2_5 - 0.0123136123136127*G0_1_0_3_0 - 0.00697771364438061*G0_1_0_3_1 - 0.00123136123136133*G0_1_0_3_2 + 0.062388969055638*G0_1_0_3_3 - 0.00164181497514842*G0_1_0_3_4 + 0.022985409652077*G0_1_0_3_5 + 0.0119031585698258*G0_1_0_4_0 + 0.0131345198011869*G0_1_0_4_1 - 0.0472021805355156*G0_1_0_4_2 - 0.00164181497514843*G0_1_0_4_3 - 0.0656725990059347*G0_1_0_4_4 - 0.0279108545775222*G0_1_0_4_5 + 0.00861952861952923*G0_1_0_5_0 - 0.000410453743787227*G0_1_0_5_1 + 0.00082090748757418*G0_1_0_5_2 + 0.022985409652077*G0_1_0_5_3 - 0.0279108545775222*G0_1_0_5_4 + 0.0229854096520768*G0_1_0_5_5; + A[148] = A[216] - 0.123136123136127*G0_0_0_0_0 + 0.00595157928491284*G0_0_0_0_1 + 0.0346833413500092*G0_0_0_0_2 - 0.00985088985089017*G0_0_0_0_3 - 0.0623889690556377*G0_0_0_0_4 - 0.0484335417668768*G0_0_0_0_5 + 0.00595157928491284*G0_0_0_1_0 + 0.0935834535834567*G0_0_0_1_1 - 0.000615680615680587*G0_0_0_1_2 + 0.139554272887611*G0_0_0_1_3 + 0.0197017797017804*G0_0_0_1_4 + 0.0352990219656899*G0_0_0_1_5 + 0.0346833413500092*G0_0_0_2_0 - 0.00061568061568059*G0_0_0_2_1 - 0.112053872053876*G0_0_0_2_2 - 0.146942440275779*G0_0_0_2_3 - 0.0566426166426188*G0_0_0_2_4 + 0.0106717973384643*G0_0_0_2_5 - 0.00985088985089017*G0_0_0_3_0 + 0.139554272887611*G0_0_0_3_1 - 0.146942440275779*G0_0_0_3_2 - 0.00656725990059437*G0_0_0_3_3 - 0.0197017797017805*G0_0_0_3_4 - 0.00164181497514837*G0_0_0_3_5 - 0.0623889690556377*G0_0_0_4_0 + 0.0197017797017804*G0_0_0_4_1 - 0.0566426166426188*G0_0_0_4_2 - 0.0197017797017805*G0_0_0_4_3 - 0.0459708193041543*G0_0_0_4_4 - 0.0607471540804895*G0_0_0_4_5 - 0.0484335417668768*G0_0_0_5_0 + 0.0352990219656899*G0_0_0_5_1 + 0.0106717973384643*G0_0_0_5_2 - 0.00164181497514837*G0_0_0_5_3 - 0.0607471540804895*G0_0_0_5_4 - 0.16089786756454*G0_0_0_5_5 - 0.0151867885201224*G0_0_1_0_1 + 0.0151867885201223*G0_0_1_0_2 + 0.0316049382716063*G0_0_1_0_4 - 0.0316049382716058*G0_0_1_0_5 - 0.0151867885201224*G0_0_1_1_0 + 0.104665704665708*G0_0_1_1_1 + 0.143248356581695*G0_0_1_1_3 + 0.00985088985089019*G0_0_1_1_4 + 0.0825012025012054*G0_0_1_1_5 + 0.0151867885201223*G0_0_1_2_0 - 0.104665704665709*G0_0_1_2_2 - 0.143248356581695*G0_0_1_2_3 - 0.0825012025012054*G0_0_1_2_4 - 0.00985088985089023*G0_0_1_2_5 + 0.143248356581695*G0_0_1_3_1 - 0.143248356581695*G0_0_1_3_2 - 0.0197017797017805*G0_0_1_3_4 + 0.0197017797017803*G0_0_1_3_5 + 0.0316049382716063*G0_0_1_4_0 + 0.00985088985089019*G0_0_1_4_1 - 0.0825012025012054*G0_0_1_4_2 - 0.0197017797017805*G0_0_1_4_3 + 0.0788071188071212*G0_0_1_4_4 - 0.0316049382716058*G0_0_1_5_0 + 0.0825012025012054*G0_0_1_5_1 - 0.00985088985089023*G0_0_1_5_2 + 0.0197017797017804*G0_0_1_5_3 - 0.0788071188071212*G0_0_1_5_5 - 0.00123136123136129*G0_1_0_0_1 + 0.00123136123136125*G0_1_0_0_2 + 0.0283213083213093*G0_1_0_0_4 - 0.0283213083213092*G0_1_0_0_5 - 0.00123136123136129*G0_1_0_1_0 + 0.103434343434347*G0_1_0_1_1 + 0.148994708994714*G0_1_0_1_3 - 0.00246272246272256*G0_1_0_1_4 + 0.0357094757094771*G0_1_0_1_5 + 0.00123136123136125*G0_1_0_2_0 - 0.103434343434347*G0_1_0_2_2 - 0.148994708994714*G0_1_0_2_3 - 0.0357094757094769*G0_1_0_2_4 + 0.00246272246272247*G0_1_0_2_5 + 0.148994708994714*G0_1_0_3_1 - 0.148994708994714*G0_1_0_3_2 + 0.00492544492544511*G0_1_0_3_4 - 0.00492544492544496*G0_1_0_3_5 + 0.0283213083213093*G0_1_0_4_0 - 0.00246272246272256*G0_1_0_4_1 - 0.0357094757094769*G0_1_0_4_2 + 0.00492544492544512*G0_1_0_4_3 + 0.167465127465133*G0_1_0_4_4 - 0.0283213083213093*G0_1_0_5_0 + 0.0357094757094771*G0_1_0_5_1 + 0.00246272246272247*G0_1_0_5_2 - 0.00492544492544495*G0_1_0_5_3 - 0.167465127465133*G0_1_0_5_5 + 0.123136123136128*G0_1_1_0_0 - 0.0346833413500092*G0_1_1_0_1 - 0.00595157928491286*G0_1_1_0_2 + 0.00985088985089014*G0_1_1_0_3 + 0.0484335417668768*G0_1_1_0_4 + 0.0623889690556381*G0_1_1_0_5 - 0.0346833413500092*G0_1_1_1_0 + 0.112053872053876*G0_1_1_1_1 + 0.000615680615680649*G0_1_1_1_2 + 0.146942440275779*G0_1_1_1_3 - 0.0106717973384644*G0_1_1_1_4 + 0.0566426166426187*G0_1_1_1_5 - 0.00595157928491286*G0_1_1_2_0 + 0.000615680615680649*G0_1_1_2_1 - 0.0935834535834569*G0_1_1_2_2 - 0.139554272887611*G0_1_1_2_3 - 0.0352990219656898*G0_1_1_2_4 - 0.0197017797017804*G0_1_1_2_5 + 0.00985088985089014*G0_1_1_3_0 + 0.146942440275779*G0_1_1_3_1 - 0.139554272887611*G0_1_1_3_2 + 0.00656725990059387*G0_1_1_3_3 + 0.00164181497514834*G0_1_1_3_4 + 0.0197017797017804*G0_1_1_3_5 + 0.0484335417668768*G0_1_1_4_0 - 0.0106717973384644*G0_1_1_4_1 - 0.0352990219656898*G0_1_1_4_2 + 0.00164181497514835*G0_1_1_4_3 + 0.160897867564539*G0_1_1_4_4 + 0.0607471540804894*G0_1_1_4_5 + 0.0623889690556381*G0_1_1_5_0 + 0.0566426166426187*G0_1_1_5_1 - 0.0197017797017804*G0_1_1_5_2 + 0.0197017797017804*G0_1_1_5_3 + 0.0607471540804894*G0_1_1_5_4 + 0.0459708193041545*G0_1_1_5_5; + A[204] = A[148] + 0.0492544492544504*G0_0_1_0_0 + 0.0121083854417192*G0_0_1_0_1 - 0.00184704184704187*G0_0_1_0_2 - 0.0123136123136128*G0_0_1_0_3 + 0.00861952861952878*G0_0_1_0_4 + 0.0119031585698258*G0_0_1_0_5 + 0.0121083854417192*G0_0_1_1_0 - 0.00410453743787098*G0_0_1_1_1 - 0.00102613435946773*G0_0_1_1_2 - 0.00123136123136119*G0_0_1_1_3 + 0.000820907487574168*G0_0_1_1_4 - 0.0472021805355156*G0_0_1_1_5 - 0.00184704184704187*G0_0_1_2_0 - 0.00102613435946773*G0_0_1_2_1 - 0.00287317620650967*G0_0_1_2_2 - 0.00697771364438062*G0_0_1_2_3 - 0.000410453743787115*G0_0_1_2_4 + 0.0131345198011869*G0_0_1_2_5 - 0.0123136123136128*G0_0_1_3_0 - 0.00123136123136119*G0_0_1_3_1 - 0.00697771364438061*G0_0_1_3_2 + 0.0623889690556384*G0_0_1_3_3 + 0.0229854096520772*G0_0_1_3_4 - 0.00164181497514826*G0_0_1_3_5 + 0.00861952861952878*G0_0_1_4_0 + 0.000820907487574169*G0_0_1_4_1 - 0.000410453743787115*G0_0_1_4_2 + 0.0229854096520772*G0_0_1_4_3 + 0.0229854096520771*G0_0_1_4_4 - 0.0279108545775221*G0_0_1_4_5 + 0.0119031585698257*G0_0_1_5_0 - 0.0472021805355156*G0_0_1_5_1 + 0.0131345198011869*G0_0_1_5_2 - 0.00164181497514826*G0_0_1_5_3 - 0.0279108545775221*G0_0_1_5_4 - 0.0656725990059345*G0_0_1_5_5 - 0.0492544492544504*G0_1_0_0_0 - 0.0121083854417192*G0_1_0_0_1 + 0.00184704184704187*G0_1_0_0_2 + 0.0123136123136128*G0_1_0_0_3 - 0.00861952861952878*G0_1_0_0_4 - 0.0119031585698257*G0_1_0_0_5 - 0.0121083854417192*G0_1_0_1_0 + 0.00410453743787098*G0_1_0_1_1 + 0.00102613435946773*G0_1_0_1_2 + 0.00123136123136119*G0_1_0_1_3 - 0.000820907487574169*G0_1_0_1_4 + 0.0472021805355156*G0_1_0_1_5 + 0.00184704184704188*G0_1_0_2_0 + 0.00102613435946773*G0_1_0_2_1 + 0.00287317620650967*G0_1_0_2_2 + 0.00697771364438061*G0_1_0_2_3 + 0.000410453743787115*G0_1_0_2_4 - 0.0131345198011869*G0_1_0_2_5 + 0.0123136123136128*G0_1_0_3_0 + 0.00123136123136122*G0_1_0_3_1 + 0.00697771364438062*G0_1_0_3_2 - 0.0623889690556385*G0_1_0_3_3 - 0.0229854096520772*G0_1_0_3_4 + 0.00164181497514826*G0_1_0_3_5 - 0.00861952861952878*G0_1_0_4_0 - 0.000820907487574169*G0_1_0_4_1 + 0.000410453743787113*G0_1_0_4_2 - 0.0229854096520772*G0_1_0_4_3 - 0.0229854096520771*G0_1_0_4_4 + 0.0279108545775221*G0_1_0_4_5 - 0.0119031585698257*G0_1_0_5_0 + 0.0472021805355156*G0_1_0_5_1 - 0.0131345198011869*G0_1_0_5_2 + 0.00164181497514826*G0_1_0_5_3 + 0.0279108545775221*G0_1_0_5_4 + 0.0656725990059345*G0_1_0_5_5; + A[183] = -A[191] + 0.118210678210682*G0_0_0_0_0 + 0.00472021805355155*G0_0_0_0_1 - 0.0272951739618415*G0_0_0_0_2 + 0.00328362995029667*G0_0_0_0_3 + 0.126419753086424*G0_0_0_0_4 + 0.041045374378709*G0_0_0_0_5 + 0.00472021805355155*G0_0_0_1_0 - 0.012313612313613*G0_0_0_1_1 + 0.00389931056597734*G0_0_0_1_2 + 0.0164181497514838*G0_0_0_1_3 - 0.0394035594035607*G0_0_0_1_4 - 0.0410453743787091*G0_0_0_1_5 - 0.0272951739618415*G0_0_0_2_0 + 0.00389931056597734*G0_0_0_2_1 - 0.0184704184704191*G0_0_0_2_2 - 0.0287317620650965*G0_0_0_2_3 - 0.0566426166426184*G0_0_0_2_4 + 0.0188808722142061*G0_0_0_2_5 + 0.00328362995029667*G0_0_0_3_0 + 0.0164181497514838*G0_0_0_3_1 - 0.0287317620650966*G0_0_0_3_2 + 0.242988616321959*G0_0_0_3_3 + 0.072239858906528*G0_0_0_3_4 - 0.0443290043290056*G0_0_0_3_5 + 0.126419753086424*G0_0_0_4_0 - 0.0394035594035607*G0_0_0_4_1 - 0.0566426166426184*G0_0_0_4_2 + 0.072239858906528*G0_0_0_4_3 + 0.623889690556377*G0_0_0_4_4 + 0.0410453743787091*G0_0_0_4_5 + 0.041045374378709*G0_0_0_5_0 - 0.0410453743787091*G0_0_0_5_1 + 0.0188808722142061*G0_0_0_5_2 - 0.0443290043290056*G0_0_0_5_3 + 0.0410453743787091*G0_0_0_5_4 - 0.187166907166914*G0_0_0_5_5 - 0.0119031585698255*G0_1_0_0_0 + 0.0205226871893545*G0_1_0_0_1 - 0.000820907487574165*G0_1_0_0_2 - 0.000820907487574239*G0_1_0_0_3 - 0.0155972422639095*G0_1_0_0_4 - 0.0500753567420252*G0_1_0_0_5 + 0.0205226871893545*G0_1_0_1_0 + 0.00410453743787087*G0_1_0_1_2 + 0.00820907487574209*G0_1_0_1_3 - 0.0246272246272255*G0_1_0_1_4 - 0.00820907487574162*G0_1_0_1_5 - 0.000820907487574165*G0_1_0_2_0 + 0.00410453743787087*G0_1_0_2_1 - 0.0094404361071031*G0_1_0_2_2 - 0.0254481321147999*G0_1_0_2_3 - 0.00574635241301933*G0_1_0_2_4 + 0.0238063171396512*G0_1_0_2_5 - 0.000820907487574243*G0_1_0_3_0 + 0.00820907487574208*G0_1_0_3_1 - 0.0254481321147999*G0_1_0_3_2 + 0.193734167067508*G0_1_0_3_3 + 0.0508962642295995*G0_1_0_3_4 - 0.0459708193041538*G0_1_0_3_5 - 0.0155972422639095*G0_1_0_4_0 - 0.0246272246272255*G0_1_0_4_1 - 0.00574635241301933*G0_1_0_4_2 + 0.0508962642295995*G0_1_0_4_3 + 0.0656725990059352*G0_1_0_4_4 + 0.00164181497514858*G0_1_0_4_5 - 0.0500753567420252*G0_1_0_5_0 - 0.00820907487574162*G0_1_0_5_1 + 0.0238063171396512*G0_1_0_5_2 - 0.0459708193041538*G0_1_0_5_3 + 0.00164181497514858*G0_1_0_5_4 - 0.101792528459198*G0_1_0_5_5; + A[213] = -A[183] + 0.0246272246272254*G0_0_0_0_0 - 0.00123136123136129*G0_0_0_0_1 - 0.0266794933461609*G0_0_0_0_2 - 0.0164181497514836*G0_0_0_0_3 - 0.0131345198011869*G0_0_0_0_4 + 0.00574635241301923*G0_0_0_0_5 - 0.00123136123136129*G0_0_0_1_0 + 0.110822510822515*G0_0_0_1_1 - 0.0307840307840318*G0_0_0_1_2 + 0.0788071188071216*G0_0_0_1_3 - 0.0295526695526705*G0_0_0_1_4 + 0.00738816738816776*G0_0_0_1_5 - 0.0266794933461609*G0_0_0_2_0 - 0.0307840307840318*G0_0_0_2_1 + 0.0935834535834566*G0_0_0_2_2 + 0.0279108545775221*G0_0_0_2_3 + 0.0902998236331599*G0_0_0_2_4 + 0.00820907487574179*G0_0_0_2_5 - 0.0164181497514836*G0_0_0_3_0 + 0.0788071188071216*G0_0_0_3_1 + 0.0279108545775221*G0_0_0_3_2 + 0.288959435626112*G0_0_0_3_3 + 0.0919416386083083*G0_0_0_3_4 + 0.0164181497514839*G0_0_0_3_5 - 0.0131345198011869*G0_0_0_4_0 - 0.0295526695526705*G0_0_0_4_1 + 0.0902998236331599*G0_0_0_4_2 + 0.0919416386083083*G0_0_0_4_3 + 0.63045695045697*G0_0_0_4_4 + 0.0426871893538575*G0_0_0_4_5 + 0.00574635241301923*G0_0_0_5_0 + 0.00738816738816775*G0_0_0_5_1 + 0.00820907487574179*G0_0_0_5_2 + 0.0164181497514839*G0_0_0_5_3 + 0.0426871893538575*G0_0_0_5_4 - 0.0262690396023736*G0_0_0_5_5 + 0.00697771364438059*G0_0_1_0_0 - 0.00902998236331604*G0_0_1_0_1 - 0.000410453743787096*G0_0_1_0_2 - 0.00902998236331603*G0_0_1_0_3 + 0.00246272246272259*G0_0_1_0_4 - 0.00902998236331604*G0_0_1_1_0 + 0.172390572390579*G0_0_1_1_1 - 0.0213435946769288*G0_0_1_1_2 + 0.102613435946773*G0_0_1_1_3 - 0.00246272246272256*G0_0_1_1_4 + 0.0287317620650967*G0_0_1_1_5 - 0.000410453743787096*G0_0_1_2_0 - 0.0213435946769288*G0_0_1_2_1 + 0.00451499118165803*G0_0_1_2_2 - 0.0262690396023738*G0_0_1_2_3 - 0.00328362995029675*G0_0_1_2_4 - 0.0073881673881677*G0_0_1_2_5 - 0.00902998236331603*G0_0_1_3_0 + 0.102613435946773*G0_0_1_3_1 - 0.0262690396023738*G0_0_1_3_2 + 0.147763347763353*G0_0_1_3_3 + 0.0229854096520772*G0_0_1_3_4 + 0.0328362995029675*G0_0_1_3_5 + 0.00246272246272259*G0_0_1_4_0 - 0.00246272246272256*G0_0_1_4_1 - 0.00328362995029675*G0_0_1_4_2 + 0.0229854096520772*G0_0_1_4_3 + 0.0689562289562315*G0_0_1_4_4 + 0.0197017797017805*G0_0_1_4_5 + 0.0287317620650967*G0_0_1_5_1 - 0.0073881673881677*G0_0_1_5_2 + 0.0328362995029675*G0_0_1_5_3 + 0.0197017797017805*G0_0_1_5_4 + 0.0164181497514839*G0_0_1_5_5 + 0.00205226871893549*G0_1_0_0_0 + 0.00123136123136125*G0_1_0_0_1 + 0.00082090748757419*G0_1_0_0_2 - 0.0238063171396513*G0_1_0_0_3 - 0.00492544492544511*G0_1_0_0_4 - 0.00246272246272259*G0_1_0_0_5 + 0.00123136123136125*G0_1_0_1_0 + 0.0738816738816765*G0_1_0_1_1 - 0.0275004008337352*G0_1_0_1_2 + 0.0902998236331603*G0_1_0_1_3 - 0.00246272246272253*G0_1_0_1_4 + 0.000820907487574191*G0_1_0_2_0 - 0.0275004008337352*G0_1_0_2_1 + 0.00205226871893555*G0_1_0_2_2 - 0.004104537437871*G0_1_0_2_3 - 0.000820907487574161*G0_1_0_2_4 + 0.00246272246272252*G0_1_0_2_5 - 0.0238063171396513*G0_1_0_3_0 + 0.0902998236331602*G0_1_0_3_1 - 0.00410453743787101*G0_1_0_3_2 + 0.384184704184718*G0_1_0_3_3 + 0.0525380792047477*G0_1_0_3_4 + 0.0426871893538577*G0_1_0_3_5 - 0.00492544492544511*G0_1_0_4_0 - 0.00246272246272253*G0_1_0_4_1 - 0.000820907487574161*G0_1_0_4_2 + 0.0525380792047477*G0_1_0_4_3 + 0.00985088985089021*G0_1_0_4_4 - 0.00246272246272259*G0_1_0_5_0 + 0.00246272246272252*G0_1_0_5_2 + 0.0426871893538577*G0_1_0_5_3 - 0.0426871893538574*G0_1_0_5_5 + 0.00246272246272262*G0_1_1_0_0 + 0.0123136123136128*G0_1_1_0_1 - 0.00164181497514838*G0_1_1_0_3 + 0.00574635241301927*G0_1_1_0_4 + 0.0262690396023738*G0_1_1_0_5 + 0.0123136123136128*G0_1_1_1_0 - 0.0123136123136127*G0_1_1_1_2 + 0.0738816738816764*G0_1_1_1_3 - 0.0738816738816765*G0_1_1_1_5 - 0.0123136123136127*G0_1_1_2_1 - 0.00246272246272245*G0_1_1_2_2 - 0.0262690396023738*G0_1_1_2_3 - 0.00574635241301925*G0_1_1_2_4 + 0.00164181497514835*G0_1_1_2_5 - 0.00164181497514838*G0_1_1_3_0 + 0.0738816738816764*G0_1_1_3_1 - 0.0262690396023738*G0_1_1_3_2 + 0.131345198011869*G0_1_1_3_3 + 0.00328362995029677*G0_1_1_3_4 + 0.00574635241301927*G0_1_1_4_0 - 0.00574635241301925*G0_1_1_4_2 + 0.00328362995029677*G0_1_1_4_3 - 0.00328362995029671*G0_1_1_4_5 + 0.0262690396023738*G0_1_1_5_0 - 0.0738816738816765*G0_1_1_5_1 + 0.00164181497514835*G0_1_1_5_2 - 0.00328362995029671*G0_1_1_5_4 - 0.131345198011869*G0_1_1_5_5; + A[185] = -A[188] - 0.0119031585698257*G0_0_1_0_0 - 0.000820907487574172*G0_0_1_0_1 + 0.0205226871893545*G0_0_1_0_2 - 0.000820907487574114*G0_0_1_0_3 - 0.0500753567420251*G0_0_1_0_4 - 0.0155972422639094*G0_0_1_0_5 - 0.000820907487574172*G0_0_1_1_0 - 0.00944043610710296*G0_0_1_1_1 + 0.0041045374378709*G0_0_1_1_2 - 0.0254481321147998*G0_0_1_1_3 + 0.0238063171396513*G0_0_1_1_4 - 0.00574635241301928*G0_0_1_1_5 + 0.0205226871893545*G0_0_1_2_0 + 0.0041045374378709*G0_0_1_2_1 + 0.00820907487574207*G0_0_1_2_3 - 0.00820907487574178*G0_0_1_2_4 - 0.0246272246272254*G0_0_1_2_5 - 0.000820907487574117*G0_0_1_3_0 - 0.0254481321147998*G0_0_1_3_1 + 0.00820907487574207*G0_0_1_3_2 + 0.193734167067507*G0_0_1_3_3 - 0.0459708193041542*G0_0_1_3_4 + 0.0508962642295991*G0_0_1_3_5 - 0.0500753567420251*G0_0_1_4_0 + 0.0238063171396513*G0_0_1_4_1 - 0.0082090748757418*G0_0_1_4_2 - 0.0459708193041542*G0_0_1_4_3 - 0.101792528459198*G0_0_1_4_4 + 0.00164181497514826*G0_0_1_4_5 - 0.0155972422639094*G0_0_1_5_0 - 0.00574635241301928*G0_0_1_5_1 - 0.0246272246272254*G0_0_1_5_2 + 0.0508962642295991*G0_0_1_5_3 + 0.00164181497514826*G0_0_1_5_4 + 0.0656725990059341*G0_0_1_5_5 + 0.118210678210682*G0_1_1_0_0 - 0.0272951739618416*G0_1_1_0_1 + 0.00472021805355152*G0_1_1_0_2 + 0.0032836299502968*G0_1_1_0_3 + 0.0410453743787091*G0_1_1_0_4 + 0.126419753086425*G0_1_1_0_5 - 0.0272951739618416*G0_1_1_1_0 - 0.0184704184704192*G0_1_1_1_1 + 0.00389931056597737*G0_1_1_1_2 - 0.0287317620650966*G0_1_1_1_3 + 0.0188808722142062*G0_1_1_1_4 - 0.0566426166426187*G0_1_1_1_5 + 0.00472021805355152*G0_1_1_2_0 + 0.00389931056597737*G0_1_1_2_1 - 0.0123136123136129*G0_1_1_2_2 + 0.0164181497514839*G0_1_1_2_3 - 0.0410453743787091*G0_1_1_2_4 - 0.0394035594035607*G0_1_1_2_5 + 0.0032836299502968*G0_1_1_3_0 - 0.0287317620650966*G0_1_1_3_1 + 0.0164181497514839*G0_1_1_3_2 + 0.242988616321958*G0_1_1_3_3 - 0.0443290043290059*G0_1_1_3_4 + 0.0722398589065278*G0_1_1_3_5 + 0.0410453743787091*G0_1_1_4_0 + 0.0188808722142062*G0_1_1_4_1 - 0.0410453743787091*G0_1_1_4_2 - 0.0443290043290059*G0_1_1_4_3 - 0.187166907166914*G0_1_1_4_4 + 0.041045374378709*G0_1_1_4_5 + 0.126419753086425*G0_1_1_5_0 - 0.0566426166426187*G0_1_1_5_1 - 0.0394035594035607*G0_1_1_5_2 + 0.0722398589065278*G0_1_1_5_3 + 0.041045374378709*G0_1_1_5_4 + 0.623889690556379*G0_1_1_5_5; + A[87] = -A[132] - 0.0119031585698257*G0_1_0_0_0 - 0.000820907487574172*G0_1_0_0_1 + 0.0205226871893545*G0_1_0_0_2 - 0.000820907487574115*G0_1_0_0_3 - 0.050075356742025*G0_1_0_0_4 - 0.0155972422639094*G0_1_0_0_5 - 0.000820907487574173*G0_1_0_1_0 - 0.00944043610710296*G0_1_0_1_1 + 0.0041045374378709*G0_1_0_1_2 - 0.0254481321147998*G0_1_0_1_3 + 0.0238063171396513*G0_1_0_1_4 - 0.00574635241301929*G0_1_0_1_5 + 0.0205226871893545*G0_1_0_2_0 + 0.0041045374378709*G0_1_0_2_1 + 0.00820907487574207*G0_1_0_2_3 - 0.00820907487574179*G0_1_0_2_4 - 0.0246272246272254*G0_1_0_2_5 - 0.000820907487574116*G0_1_0_3_0 - 0.0254481321147998*G0_1_0_3_1 + 0.00820907487574207*G0_1_0_3_2 + 0.193734167067507*G0_1_0_3_3 - 0.0459708193041542*G0_1_0_3_4 + 0.0508962642295991*G0_1_0_3_5 - 0.050075356742025*G0_1_0_4_0 + 0.0238063171396513*G0_1_0_4_1 - 0.0082090748757418*G0_1_0_4_2 - 0.0459708193041542*G0_1_0_4_3 - 0.101792528459198*G0_1_0_4_4 + 0.00164181497514826*G0_1_0_4_5 - 0.0155972422639094*G0_1_0_5_0 - 0.00574635241301928*G0_1_0_5_1 - 0.0246272246272254*G0_1_0_5_2 + 0.0508962642295991*G0_1_0_5_3 + 0.00164181497514827*G0_1_0_5_4 + 0.0656725990059341*G0_1_0_5_5 + 0.118210678210682*G0_1_1_0_0 - 0.0272951739618416*G0_1_1_0_1 + 0.00472021805355152*G0_1_1_0_2 + 0.0032836299502968*G0_1_1_0_3 + 0.0410453743787091*G0_1_1_0_4 + 0.126419753086425*G0_1_1_0_5 - 0.0272951739618416*G0_1_1_1_0 - 0.0184704184704192*G0_1_1_1_1 + 0.00389931056597738*G0_1_1_1_2 - 0.0287317620650966*G0_1_1_1_3 + 0.0188808722142062*G0_1_1_1_4 - 0.0566426166426187*G0_1_1_1_5 + 0.00472021805355152*G0_1_1_2_0 + 0.00389931056597737*G0_1_1_2_1 - 0.0123136123136129*G0_1_1_2_2 + 0.0164181497514839*G0_1_1_2_3 - 0.0410453743787091*G0_1_1_2_4 - 0.0394035594035607*G0_1_1_2_5 + 0.0032836299502968*G0_1_1_3_0 - 0.0287317620650966*G0_1_1_3_1 + 0.0164181497514839*G0_1_1_3_2 + 0.242988616321958*G0_1_1_3_3 - 0.0443290043290059*G0_1_1_3_4 + 0.0722398589065278*G0_1_1_3_5 + 0.0410453743787091*G0_1_1_4_0 + 0.0188808722142062*G0_1_1_4_1 - 0.0410453743787091*G0_1_1_4_2 - 0.0443290043290059*G0_1_1_4_3 - 0.187166907166914*G0_1_1_4_4 + 0.041045374378709*G0_1_1_4_5 + 0.126419753086425*G0_1_1_5_0 - 0.0566426166426187*G0_1_1_5_1 - 0.0394035594035607*G0_1_1_5_2 + 0.0722398589065278*G0_1_1_5_3 + 0.041045374378709*G0_1_1_5_4 + 0.623889690556379*G0_1_1_5_5; + A[114] = A[142] + 0.224210357543699*G0_0_1_0_0 - 0.00138528138528139*G0_0_1_0_1 + 0.00425845759179107*G0_0_1_0_2 - 0.00338624338624354*G0_0_1_0_3 - 0.0256533589866932*G0_0_1_0_4 - 0.00615680615680646*G0_0_1_0_5 - 0.00138528138528139*G0_0_1_1_0 - 0.0015392015392016*G0_0_1_1_1 + 0.000307840307840335*G0_0_1_1_2 - 0.000513067179733857*G0_0_1_1_3 - 0.000307840307840304*G0_0_1_1_4 + 0.0152894019560692*G0_0_1_1_5 + 0.00425845759179107*G0_0_1_2_0 + 0.000307840307840335*G0_0_1_2_1 - 0.00615680615680646*G0_0_1_2_2 - 0.004104537437871*G0_0_1_2_3 + 0.00831168831168857*G0_0_1_2_4 + 0.00359147025813705*G0_0_1_2_5 - 0.00338624338624354*G0_0_1_3_0 - 0.000513067179733857*G0_0_1_3_1 - 0.004104537437871*G0_0_1_3_2 - 0.0057463524130196*G0_0_1_3_3 + 0.00738816738816762*G0_0_1_3_4 - 0.000410453743787099*G0_0_1_3_5 - 0.0256533589866932*G0_0_1_4_0 - 0.000307840307840304*G0_0_1_4_1 + 0.00831168831168857*G0_0_1_4_2 + 0.00738816738816762*G0_0_1_4_3 - 0.0508962642295992*G0_0_1_4_4 - 0.00656725990059349*G0_0_1_4_5 - 0.00615680615680647*G0_0_1_5_0 + 0.0152894019560692*G0_0_1_5_1 + 0.00359147025813706*G0_0_1_5_2 - 0.000410453743787099*G0_0_1_5_3 - 0.0065672599005935*G0_0_1_5_4 - 0.14119608786276*G0_0_1_5_5 - 0.224210357543699*G0_1_0_0_0 + 0.00138528138528139*G0_1_0_0_1 - 0.00425845759179108*G0_1_0_0_2 + 0.00338624338624354*G0_1_0_0_3 + 0.0256533589866932*G0_1_0_0_4 + 0.00615680615680647*G0_1_0_0_5 + 0.00138528138528139*G0_1_0_1_0 + 0.0015392015392016*G0_1_0_1_1 - 0.000307840307840335*G0_1_0_1_2 + 0.000513067179733855*G0_1_0_1_3 + 0.000307840307840302*G0_1_0_1_4 - 0.0152894019560692*G0_1_0_1_5 - 0.00425845759179108*G0_1_0_2_0 - 0.000307840307840335*G0_1_0_2_1 + 0.00615680615680646*G0_1_0_2_2 + 0.00410453743787099*G0_1_0_2_3 - 0.00831168831168857*G0_1_0_2_4 - 0.00359147025813705*G0_1_0_2_5 + 0.00338624338624355*G0_1_0_3_0 + 0.00051306717973386*G0_1_0_3_1 + 0.004104537437871*G0_1_0_3_2 + 0.0057463524130196*G0_1_0_3_3 - 0.00738816738816762*G0_1_0_3_4 + 0.000410453743787096*G0_1_0_3_5 + 0.0256533589866932*G0_1_0_4_0 + 0.000307840307840302*G0_1_0_4_1 - 0.00831168831168857*G0_1_0_4_2 - 0.00738816738816762*G0_1_0_4_3 + 0.0508962642295993*G0_1_0_4_4 + 0.0065672599005935*G0_1_0_4_5 + 0.00615680615680647*G0_1_0_5_0 - 0.0152894019560692*G0_1_0_5_1 - 0.00359147025813706*G0_1_0_5_2 + 0.000410453743787099*G0_1_0_5_3 + 0.0065672599005935*G0_1_0_5_4 + 0.14119608786276*G0_1_0_5_5; + A[221] = -A[213] - 0.00902998236331615*G0_0_0_0_0 - 0.00020522687189355*G0_0_0_0_1 - 0.0264742664742673*G0_0_0_0_2 - 0.00492544492544505*G0_0_0_0_3 - 0.0508962642295991*G0_0_0_0_4 - 0.00328362995029665*G0_0_0_0_5 - 0.000205226871893549*G0_0_0_1_0 - 0.0123136123136129*G0_0_0_1_1 - 0.015802469135803*G0_0_0_1_2 - 0.0328362995029674*G0_0_0_1_3 - 0.0147763347763352*G0_0_0_1_4 + 0.00820907487574172*G0_0_0_1_5 - 0.0264742664742673*G0_0_0_2_0 - 0.015802469135803*G0_0_0_2_1 + 0.130113836780508*G0_0_0_2_2 + 0.0911207311207343*G0_0_0_2_3 + 0.142016995350333*G0_0_0_2_4 + 0.00410453743787096*G0_0_0_2_5 - 0.00492544492544505*G0_0_0_3_0 - 0.0328362995029674*G0_0_0_3_1 + 0.0911207311207343*G0_0_0_3_2 - 0.0853743787077157*G0_0_0_3_3 + 0.0394035594035605*G0_0_0_3_4 + 0.00164181497514826*G0_0_0_3_5 - 0.0508962642295991*G0_0_0_4_0 - 0.0147763347763352*G0_0_0_4_1 + 0.142016995350333*G0_0_0_4_2 + 0.0394035594035605*G0_0_0_4_3 + 0.558217091550442*G0_0_0_4_4 + 0.0213435946769286*G0_0_0_4_5 - 0.00328362995029665*G0_0_0_5_0 + 0.00820907487574172*G0_0_0_5_1 + 0.00410453743787096*G0_0_0_5_2 + 0.00164181497514825*G0_0_0_5_3 + 0.0213435946769286*G0_0_0_5_4 + 0.0492544492544507*G0_0_0_5_5 + 0.00944043610710293*G0_1_0_0_0 - 0.00410453743787092*G0_1_0_0_1 + 0.000820907487574179*G0_1_0_0_2 - 0.0238063171396512*G0_1_0_0_3 + 0.00574635241301924*G0_1_0_0_4 + 0.0254481321147997*G0_1_0_0_5 - 0.00410453743787092*G0_1_0_1_0 - 0.0205226871893546*G0_1_0_1_2 + 0.00820907487574188*G0_1_0_1_3 + 0.0246272246272255*G0_1_0_1_4 - 0.00820907487574177*G0_1_0_1_5 + 0.000820907487574179*G0_1_0_2_0 - 0.0205226871893546*G0_1_0_2_1 + 0.0119031585698257*G0_1_0_2_2 + 0.0500753567420252*G0_1_0_2_3 + 0.0155972422639096*G0_1_0_2_4 + 0.000820907487574251*G0_1_0_2_5 - 0.0238063171396512*G0_1_0_3_0 + 0.00820907487574188*G0_1_0_3_1 + 0.0500753567420252*G0_1_0_3_2 + 0.101792528459198*G0_1_0_3_3 - 0.00164181497514843*G0_1_0_3_4 + 0.0459708193041541*G0_1_0_3_5 + 0.00574635241301924*G0_1_0_4_0 + 0.0246272246272255*G0_1_0_4_1 + 0.0155972422639096*G0_1_0_4_2 - 0.00164181497514843*G0_1_0_4_3 - 0.0656725990059351*G0_1_0_4_4 - 0.0508962642295994*G0_1_0_4_5 + 0.0254481321147997*G0_1_0_5_0 - 0.00820907487574177*G0_1_0_5_1 + 0.000820907487574249*G0_1_0_5_2 + 0.0459708193041541*G0_1_0_5_3 - 0.0508962642295994*G0_1_0_5_4 - 0.193734167067507*G0_1_0_5_5; + A[133] = A[221] + 0.0180599647266321*G0_0_0_0_0 - 0.00225749559082899*G0_0_0_0_1 - 0.00143658810325488*G0_0_0_0_2 + 0.00164181497514829*G0_0_0_0_3 - 0.00246272246272262*G0_0_0_0_5 - 0.00225749559082899*G0_0_0_1_0 + 0.0615680615680637*G0_0_0_1_1 + 0.0034888568221902*G0_0_0_1_2 + 0.0344781144781156*G0_0_0_1_3 + 0.00492544492544504*G0_0_0_1_4 + 0.0106717973384645*G0_0_0_1_5 - 0.00143658810325488*G0_0_0_2_0 + 0.0034888568221902*G0_0_0_2_1 - 0.0192913259579924*G0_0_0_2_2 - 0.0467917267917281*G0_0_0_2_3 + 0.0106717973384646*G0_0_0_2_4 - 0.000820907487574197*G0_0_0_2_5 + 0.00164181497514829*G0_0_0_3_0 + 0.0344781144781156*G0_0_0_3_1 - 0.0467917267917281*G0_0_0_3_2 - 0.0197017797017795*G0_0_0_3_3 - 0.0131345198011867*G0_0_0_3_4 - 0.00164181497514823*G0_0_0_3_5 + 0.00492544492544504*G0_0_0_4_1 + 0.0106717973384646*G0_0_0_4_2 - 0.0131345198011867*G0_0_0_4_3 - 0.111643418310088*G0_0_0_4_4 - 0.00820907487574171*G0_0_0_4_5 - 0.00246272246272262*G0_0_0_5_0 + 0.0106717973384645*G0_0_0_5_1 - 0.000820907487574197*G0_0_0_5_2 - 0.00164181497514823*G0_0_0_5_3 - 0.00820907487574171*G0_0_0_5_4 - 0.0426871893538572*G0_0_0_5_5 - 0.00697771364438057*G0_0_1_0_1 + 0.00697771364438047*G0_0_1_0_2 + 0.00205226871893539*G0_0_1_0_4 - 0.00205226871893553*G0_0_1_0_5 - 0.00697771364438057*G0_0_1_1_0 + 0.0853743787077152*G0_0_1_1_1 + 0.040634920634922*G0_0_1_1_3 + 0.0041045374378709*G0_0_1_1_4 + 0.025858585858587*G0_0_1_1_5 + 0.00697771364438047*G0_0_1_2_0 - 0.085374378707714*G0_0_1_2_2 - 0.0406349206349217*G0_0_1_2_3 - 0.0258585858585864*G0_0_1_2_4 - 0.00410453743787093*G0_0_1_2_5 + 0.040634920634922*G0_0_1_3_1 - 0.0406349206349217*G0_0_1_3_2 - 0.00820907487574172*G0_0_1_3_4 + 0.00820907487574195*G0_0_1_3_5 + 0.00205226871893539*G0_0_1_4_0 + 0.0041045374378709*G0_0_1_4_1 - 0.0258585858585864*G0_0_1_4_2 - 0.00820907487574172*G0_0_1_4_3 + 0.0098508898508902*G0_0_1_4_4 - 0.00205226871893553*G0_0_1_5_0 + 0.025858585858587*G0_0_1_5_1 - 0.00410453743787093*G0_0_1_5_2 + 0.00820907487574195*G0_0_1_5_3 - 0.00985088985088958*G0_0_1_5_5 - 0.00123136123136124*G0_1_0_0_1 + 0.00123136123136127*G0_1_0_0_2 + 0.0283213083213093*G0_1_0_0_4 - 0.0283213083213093*G0_1_0_0_5 - 0.00123136123136124*G0_1_0_1_0 + 0.0439185505852183*G0_1_0_1_1 + 0.0233958633958642*G0_1_0_1_3 - 0.00656725990059348*G0_1_0_1_4 + 0.0398140131473478*G0_1_0_1_5 + 0.00123136123136127*G0_1_0_2_0 - 0.0439185505852182*G0_1_0_2_2 - 0.023395863395864*G0_1_0_2_3 - 0.0398140131473479*G0_1_0_2_4 + 0.0065672599005934*G0_1_0_2_5 + 0.0233958633958642*G0_1_0_3_1 - 0.023395863395864*G0_1_0_3_2 + 0.013134519801187*G0_1_0_3_4 - 0.0131345198011867*G0_1_0_3_5 + 0.0283213083213093*G0_1_0_4_0 - 0.00656725990059348*G0_1_0_4_1 - 0.0398140131473479*G0_1_0_4_2 + 0.013134519801187*G0_1_0_4_3 - 0.157614237614243*G0_1_0_4_4 - 0.0283213083213093*G0_1_0_5_0 + 0.0398140131473478*G0_1_0_5_1 + 0.0065672599005934*G0_1_0_5_2 - 0.0131345198011867*G0_1_0_5_3 + 0.157614237614243*G0_1_0_5_5 - 0.0180599647266319*G0_1_1_0_0 + 0.00143658810325483*G0_1_1_0_1 + 0.00225749559082897*G0_1_1_0_2 - 0.00164181497514836*G0_1_1_0_3 + 0.00246272246272259*G0_1_1_0_4 + 0.00143658810325483*G0_1_1_1_0 + 0.0192913259579929*G0_1_1_1_1 - 0.00348885682219033*G0_1_1_1_2 + 0.0467917267917284*G0_1_1_1_3 + 0.000820907487574239*G0_1_1_1_4 - 0.0106717973384644*G0_1_1_1_5 + 0.00225749559082897*G0_1_1_2_0 - 0.00348885682219033*G0_1_1_2_1 - 0.061568061568063*G0_1_1_2_2 - 0.0344781144781155*G0_1_1_2_3 - 0.0106717973384642*G0_1_1_2_4 - 0.00492544492544507*G0_1_1_2_5 - 0.00164181497514836*G0_1_1_3_0 + 0.0467917267917284*G0_1_1_3_1 - 0.0344781144781155*G0_1_1_3_2 + 0.019701779701781*G0_1_1_3_3 + 0.00164181497514825*G0_1_1_3_4 + 0.0131345198011868*G0_1_1_3_5 + 0.00246272246272259*G0_1_1_4_0 + 0.000820907487574239*G0_1_1_4_1 - 0.0106717973384642*G0_1_1_4_2 + 0.00164181497514825*G0_1_1_4_3 + 0.0426871893538569*G0_1_1_4_4 + 0.00820907487574163*G0_1_1_4_5 - 0.0106717973384644*G0_1_1_5_1 - 0.00492544492544507*G0_1_1_5_2 + 0.0131345198011868*G0_1_1_5_3 + 0.00820907487574163*G0_1_1_5_4 + 0.111643418310089*G0_1_1_5_5; + A[88] = -A[133] + 0.00944043610710299*G0_1_0_0_0 + 0.000820907487574208*G0_1_0_0_1 - 0.00410453743787087*G0_1_0_0_2 - 0.0238063171396513*G0_1_0_0_3 + 0.0254481321147996*G0_1_0_0_4 + 0.00574635241301918*G0_1_0_0_5 + 0.000820907487574208*G0_1_0_1_0 + 0.0119031585698255*G0_1_0_1_1 - 0.0205226871893546*G0_1_0_1_2 + 0.0500753567420254*G0_1_0_1_3 + 0.000820907487574195*G0_1_0_1_4 + 0.0155972422639094*G0_1_0_1_5 - 0.00410453743787087*G0_1_0_2_0 - 0.0205226871893546*G0_1_0_2_1 + 0.00820907487574161*G0_1_0_2_3 - 0.00820907487574196*G0_1_0_2_4 + 0.0246272246272254*G0_1_0_2_5 - 0.0238063171396513*G0_1_0_3_0 + 0.0500753567420253*G0_1_0_3_1 + 0.00820907487574162*G0_1_0_3_2 + 0.101792528459199*G0_1_0_3_3 + 0.0459708193041542*G0_1_0_3_4 - 0.00164181497514818*G0_1_0_3_5 + 0.0254481321147996*G0_1_0_4_0 + 0.000820907487574199*G0_1_0_4_1 - 0.00820907487574197*G0_1_0_4_2 + 0.0459708193041542*G0_1_0_4_3 - 0.193734167067508*G0_1_0_4_4 - 0.0508962642295993*G0_1_0_4_5 + 0.00574635241301918*G0_1_0_5_0 + 0.0155972422639094*G0_1_0_5_1 + 0.0246272246272254*G0_1_0_5_2 - 0.00164181497514818*G0_1_0_5_3 - 0.0508962642295993*G0_1_0_5_4 - 0.0656725990059346*G0_1_0_5_5 - 0.00902998236331581*G0_1_1_0_0 - 0.0264742664742675*G0_1_1_0_1 - 0.000205226871893538*G0_1_1_0_2 - 0.00492544492544512*G0_1_1_0_3 - 0.00328362995029667*G0_1_1_0_4 - 0.0508962642295992*G0_1_1_0_5 - 0.0264742664742675*G0_1_1_1_0 + 0.130113836780508*G0_1_1_1_1 - 0.0158024691358031*G0_1_1_1_2 + 0.0911207311207346*G0_1_1_1_3 + 0.00410453743787095*G0_1_1_1_4 + 0.142016995350334*G0_1_1_1_5 - 0.000205226871893538*G0_1_1_2_0 - 0.0158024691358031*G0_1_1_2_1 - 0.0123136123136123*G0_1_1_2_2 - 0.0328362995029675*G0_1_1_2_3 + 0.00820907487574179*G0_1_1_2_4 - 0.0147763347763353*G0_1_1_2_5 - 0.00492544492544512*G0_1_1_3_0 + 0.0911207311207346*G0_1_1_3_1 - 0.0328362995029675*G0_1_1_3_2 - 0.0853743787077147*G0_1_1_3_3 + 0.00164181497514825*G0_1_1_3_4 + 0.0394035594035609*G0_1_1_3_5 - 0.00328362995029667*G0_1_1_4_0 + 0.00410453743787095*G0_1_1_4_1 + 0.00820907487574179*G0_1_1_4_2 + 0.00164181497514825*G0_1_1_4_3 + 0.0492544492544505*G0_1_1_4_4 + 0.0213435946769286*G0_1_1_4_5 - 0.0508962642295992*G0_1_1_5_0 + 0.142016995350334*G0_1_1_5_1 - 0.0147763347763353*G0_1_1_5_2 + 0.0394035594035609*G0_1_1_5_3 + 0.0213435946769287*G0_1_1_5_4 + 0.558217091550445*G0_1_1_5_5; + A[179] = A[221] + 0.00656725990059328*G0_0_1_0_0 - 0.00595157928491284*G0_0_1_0_1 - 0.000205226871893536*G0_0_1_0_2 - 0.0106717973384643*G0_0_1_0_3 - 0.00123136123136129*G0_0_1_0_4 + 0.0250376783710126*G0_0_1_0_5 - 0.00595157928491284*G0_0_1_1_0 + 0.0492544492544515*G0_0_1_1_1 - 0.00841430174763537*G0_0_1_1_2 + 0.0201122334455675*G0_0_1_1_3 + 0.0123136123136128*G0_0_1_1_4 + 0.000410453743787186*G0_0_1_1_5 - 0.000205226871893536*G0_0_1_2_0 - 0.00841430174763537*G0_0_1_2_1 + 0.00779862113195467*G0_0_1_2_2 + 0.00287317620650962*G0_0_1_2_3 + 0.0143658810325482*G0_0_1_2_4 + 0.00164181497514839*G0_0_1_2_5 - 0.0106717973384643*G0_0_1_3_0 + 0.0201122334455675*G0_0_1_3_1 + 0.00287317620650962*G0_0_1_3_2 + 0.0361199294532635*G0_0_1_3_3 - 0.0032836299502968*G0_0_1_3_4 + 0.0180599647266319*G0_0_1_3_5 - 0.00123136123136129*G0_0_1_4_0 + 0.0123136123136128*G0_0_1_4_1 + 0.0143658810325482*G0_0_1_4_2 - 0.0032836299502968*G0_0_1_4_3 - 0.00328362995029723*G0_0_1_4_4 - 0.0279108545775223*G0_0_1_4_5 + 0.0250376783710126*G0_0_1_5_0 + 0.000410453743787183*G0_0_1_5_1 + 0.00164181497514839*G0_0_1_5_2 + 0.0180599647266319*G0_0_1_5_3 - 0.0279108545775223*G0_0_1_5_4 - 0.17074875741543*G0_0_1_5_5 - 0.00656725990059328*G0_1_0_0_0 + 0.00595157928491284*G0_1_0_0_1 + 0.000205226871893536*G0_1_0_0_2 + 0.0106717973384643*G0_1_0_0_3 + 0.00123136123136129*G0_1_0_0_4 - 0.0250376783710126*G0_1_0_0_5 + 0.00595157928491284*G0_1_0_1_0 - 0.0492544492544515*G0_1_0_1_1 + 0.00841430174763537*G0_1_0_1_2 - 0.0201122334455675*G0_1_0_1_3 - 0.0123136123136128*G0_1_0_1_4 - 0.000410453743787186*G0_1_0_1_5 + 0.000205226871893536*G0_1_0_2_0 + 0.00841430174763537*G0_1_0_2_1 - 0.00779862113195467*G0_1_0_2_2 - 0.00287317620650962*G0_1_0_2_3 - 0.0143658810325482*G0_1_0_2_4 - 0.00164181497514839*G0_1_0_2_5 + 0.0106717973384643*G0_1_0_3_0 - 0.0201122334455675*G0_1_0_3_1 - 0.00287317620650962*G0_1_0_3_2 - 0.0361199294532636*G0_1_0_3_3 + 0.0032836299502968*G0_1_0_3_4 - 0.0180599647266319*G0_1_0_3_5 + 0.00123136123136129*G0_1_0_4_0 - 0.0123136123136128*G0_1_0_4_1 - 0.0143658810325482*G0_1_0_4_2 + 0.0032836299502968*G0_1_0_4_3 + 0.00328362995029723*G0_1_0_4_4 + 0.0279108545775223*G0_1_0_4_5 - 0.0250376783710126*G0_1_0_5_0 - 0.000410453743787186*G0_1_0_5_1 - 0.00164181497514839*G0_1_0_5_2 - 0.0180599647266319*G0_1_0_5_3 + 0.0279108545775223*G0_1_0_5_4 + 0.17074875741543*G0_1_0_5_5; + A[200] = A[88] + 0.00287317620650962*G0_0_1_0_0 + 0.00102613435946772*G0_0_1_0_1 + 0.00184704184704188*G0_0_1_0_2 - 0.0131345198011869*G0_0_1_0_3 + 0.00041045374378701*G0_0_1_0_4 + 0.00697771364438045*G0_0_1_0_5 + 0.00102613435946772*G0_0_1_1_0 + 0.0041045374378709*G0_0_1_1_1 - 0.0121083854417192*G0_0_1_1_2 + 0.0472021805355157*G0_0_1_1_3 - 0.000820907487574183*G0_0_1_1_4 + 0.00123136123136138*G0_0_1_1_5 + 0.00184704184704188*G0_0_1_2_0 - 0.0121083854417192*G0_0_1_2_1 - 0.0492544492544503*G0_0_1_2_2 - 0.0119031585698257*G0_0_1_2_3 - 0.0086195286195287*G0_0_1_2_4 + 0.0123136123136127*G0_0_1_2_5 - 0.013134519801187*G0_0_1_3_0 + 0.0472021805355156*G0_0_1_3_1 - 0.0119031585698257*G0_0_1_3_2 + 0.0656725990059348*G0_0_1_3_3 + 0.0279108545775223*G0_0_1_3_4 + 0.00164181497514855*G0_0_1_3_5 + 0.00041045374378701*G0_0_1_4_0 - 0.000820907487574182*G0_0_1_4_1 - 0.0086195286195287*G0_0_1_4_2 + 0.0279108545775223*G0_0_1_4_3 - 0.0229854096520772*G0_0_1_4_4 - 0.022985409652077*G0_0_1_4_5 + 0.00697771364438045*G0_0_1_5_0 + 0.00123136123136138*G0_0_1_5_1 + 0.0123136123136127*G0_0_1_5_2 + 0.00164181497514855*G0_0_1_5_3 - 0.022985409652077*G0_0_1_5_4 - 0.0623889690556373*G0_0_1_5_5 - 0.00287317620650962*G0_1_0_0_0 - 0.00102613435946772*G0_1_0_0_1 - 0.00184704184704188*G0_1_0_0_2 + 0.0131345198011869*G0_1_0_0_3 - 0.000410453743787012*G0_1_0_0_4 - 0.00697771364438045*G0_1_0_0_5 - 0.00102613435946772*G0_1_0_1_0 - 0.00410453743787091*G0_1_0_1_1 + 0.0121083854417192*G0_1_0_1_2 - 0.0472021805355157*G0_1_0_1_3 + 0.000820907487574183*G0_1_0_1_4 - 0.00123136123136138*G0_1_0_1_5 - 0.00184704184704188*G0_1_0_2_0 + 0.0121083854417192*G0_1_0_2_1 + 0.0492544492544503*G0_1_0_2_2 + 0.0119031585698257*G0_1_0_2_3 + 0.0086195286195287*G0_1_0_2_4 - 0.0123136123136127*G0_1_0_2_5 + 0.013134519801187*G0_1_0_3_0 - 0.0472021805355156*G0_1_0_3_1 + 0.0119031585698257*G0_1_0_3_2 - 0.0656725990059349*G0_1_0_3_3 - 0.0279108545775223*G0_1_0_3_4 - 0.00164181497514855*G0_1_0_3_5 - 0.000410453743787012*G0_1_0_4_0 + 0.000820907487574179*G0_1_0_4_1 + 0.0086195286195287*G0_1_0_4_2 - 0.0279108545775223*G0_1_0_4_3 + 0.0229854096520772*G0_1_0_4_4 + 0.022985409652077*G0_1_0_4_5 - 0.00697771364438045*G0_1_0_5_0 - 0.00123136123136138*G0_1_0_5_1 - 0.0123136123136127*G0_1_0_5_2 - 0.00164181497514855*G0_1_0_5_3 + 0.022985409652077*G0_1_0_5_4 + 0.0623889690556373*G0_1_0_5_5; + A[203] = -A[200] + 0.00944043610710299*G0_0_1_0_0 + 0.000820907487574208*G0_0_1_0_1 - 0.00410453743787086*G0_0_1_0_2 - 0.0238063171396513*G0_0_1_0_3 + 0.0254481321147996*G0_0_1_0_4 + 0.00574635241301918*G0_0_1_0_5 + 0.000820907487574209*G0_0_1_1_0 + 0.0119031585698254*G0_0_1_1_1 - 0.0205226871893546*G0_0_1_1_2 + 0.0500753567420254*G0_0_1_1_3 + 0.000820907487574195*G0_0_1_1_4 + 0.0155972422639094*G0_0_1_1_5 - 0.00410453743787086*G0_0_1_2_0 - 0.0205226871893546*G0_0_1_2_1 + 0.00820907487574161*G0_0_1_2_3 - 0.00820907487574196*G0_0_1_2_4 + 0.0246272246272254*G0_0_1_2_5 - 0.0238063171396513*G0_0_1_3_0 + 0.0500753567420253*G0_0_1_3_1 + 0.00820907487574161*G0_0_1_3_2 + 0.101792528459199*G0_0_1_3_3 + 0.0459708193041542*G0_0_1_3_4 - 0.00164181497514818*G0_0_1_3_5 + 0.0254481321147996*G0_0_1_4_0 + 0.000820907487574196*G0_0_1_4_1 - 0.00820907487574197*G0_0_1_4_2 + 0.0459708193041542*G0_0_1_4_3 - 0.193734167067508*G0_0_1_4_4 - 0.0508962642295993*G0_0_1_4_5 + 0.00574635241301918*G0_0_1_5_0 + 0.0155972422639094*G0_0_1_5_1 + 0.0246272246272254*G0_0_1_5_2 - 0.00164181497514818*G0_0_1_5_3 - 0.0508962642295993*G0_0_1_5_4 - 0.0656725990059346*G0_0_1_5_5 - 0.00902998236331581*G0_1_1_0_0 - 0.0264742664742675*G0_1_1_0_1 - 0.000205226871893538*G0_1_1_0_2 - 0.00492544492544512*G0_1_1_0_3 - 0.00328362995029667*G0_1_1_0_4 - 0.0508962642295992*G0_1_1_0_5 - 0.0264742664742675*G0_1_1_1_0 + 0.130113836780508*G0_1_1_1_1 - 0.0158024691358031*G0_1_1_1_2 + 0.0911207311207346*G0_1_1_1_3 + 0.00410453743787095*G0_1_1_1_4 + 0.142016995350334*G0_1_1_1_5 - 0.000205226871893538*G0_1_1_2_0 - 0.0158024691358031*G0_1_1_2_1 - 0.0123136123136124*G0_1_1_2_2 - 0.0328362995029675*G0_1_1_2_3 + 0.00820907487574179*G0_1_1_2_4 - 0.0147763347763353*G0_1_1_2_5 - 0.00492544492544511*G0_1_1_3_0 + 0.0911207311207346*G0_1_1_3_1 - 0.0328362995029675*G0_1_1_3_2 - 0.0853743787077148*G0_1_1_3_3 + 0.00164181497514825*G0_1_1_3_4 + 0.0394035594035609*G0_1_1_3_5 - 0.00328362995029667*G0_1_1_4_0 + 0.00410453743787095*G0_1_1_4_1 + 0.00820907487574179*G0_1_1_4_2 + 0.00164181497514825*G0_1_1_4_3 + 0.0492544492544505*G0_1_1_4_4 + 0.0213435946769286*G0_1_1_4_5 - 0.0508962642295992*G0_1_1_5_0 + 0.142016995350334*G0_1_1_5_1 - 0.0147763347763353*G0_1_1_5_2 + 0.0394035594035609*G0_1_1_5_3 + 0.0213435946769286*G0_1_1_5_4 + 0.558217091550445*G0_1_1_5_5; + A[59] = -A[179] - 0.00902998236331615*G0_0_0_0_0 - 0.00020522687189355*G0_0_0_0_1 - 0.0264742664742673*G0_0_0_0_2 - 0.00492544492544505*G0_0_0_0_3 - 0.0508962642295991*G0_0_0_0_4 - 0.00328362995029665*G0_0_0_0_5 - 0.000205226871893549*G0_0_0_1_0 - 0.0123136123136129*G0_0_0_1_1 - 0.015802469135803*G0_0_0_1_2 - 0.0328362995029674*G0_0_0_1_3 - 0.0147763347763352*G0_0_0_1_4 + 0.00820907487574172*G0_0_0_1_5 - 0.0264742664742673*G0_0_0_2_0 - 0.015802469135803*G0_0_0_2_1 + 0.130113836780508*G0_0_0_2_2 + 0.0911207311207343*G0_0_0_2_3 + 0.142016995350333*G0_0_0_2_4 + 0.00410453743787096*G0_0_0_2_5 - 0.00492544492544505*G0_0_0_3_0 - 0.0328362995029674*G0_0_0_3_1 + 0.0911207311207343*G0_0_0_3_2 - 0.0853743787077157*G0_0_0_3_3 + 0.0394035594035605*G0_0_0_3_4 + 0.00164181497514826*G0_0_0_3_5 - 0.0508962642295991*G0_0_0_4_0 - 0.0147763347763352*G0_0_0_4_1 + 0.142016995350333*G0_0_0_4_2 + 0.0394035594035605*G0_0_0_4_3 + 0.558217091550442*G0_0_0_4_4 + 0.0213435946769286*G0_0_0_4_5 - 0.00328362995029665*G0_0_0_5_0 + 0.00820907487574172*G0_0_0_5_1 + 0.00410453743787096*G0_0_0_5_2 + 0.00164181497514825*G0_0_0_5_3 + 0.0213435946769286*G0_0_0_5_4 + 0.0492544492544507*G0_0_0_5_5 + 0.00944043610710293*G0_0_1_0_0 - 0.00410453743787093*G0_0_1_0_1 + 0.000820907487574179*G0_0_1_0_2 - 0.0238063171396512*G0_0_1_0_3 + 0.00574635241301924*G0_0_1_0_4 + 0.0254481321147997*G0_0_1_0_5 - 0.00410453743787093*G0_0_1_1_0 - 0.0205226871893546*G0_0_1_1_2 + 0.00820907487574188*G0_0_1_1_3 + 0.0246272246272255*G0_0_1_1_4 - 0.00820907487574177*G0_0_1_1_5 + 0.000820907487574179*G0_0_1_2_0 - 0.0205226871893546*G0_0_1_2_1 + 0.0119031585698257*G0_0_1_2_2 + 0.0500753567420252*G0_0_1_2_3 + 0.0155972422639096*G0_0_1_2_4 + 0.000820907487574249*G0_0_1_2_5 - 0.0238063171396512*G0_0_1_3_0 + 0.00820907487574188*G0_0_1_3_1 + 0.0500753567420252*G0_0_1_3_2 + 0.101792528459198*G0_0_1_3_3 - 0.00164181497514843*G0_0_1_3_4 + 0.0459708193041541*G0_0_1_3_5 + 0.00574635241301924*G0_0_1_4_0 + 0.0246272246272255*G0_0_1_4_1 + 0.0155972422639096*G0_0_1_4_2 - 0.00164181497514843*G0_0_1_4_3 - 0.0656725990059351*G0_0_1_4_4 - 0.0508962642295994*G0_0_1_4_5 + 0.0254481321147997*G0_0_1_5_0 - 0.00820907487574177*G0_0_1_5_1 + 0.000820907487574249*G0_0_1_5_2 + 0.0459708193041541*G0_0_1_5_3 - 0.0508962642295994*G0_0_1_5_4 - 0.193734167067507*G0_0_1_5_5; + A[196] = 0.00979958313291679*G0_0_0_0_0 + 0.00759339426006119*G0_0_0_0_1 - 0.00541285874619226*G0_0_0_0_2 + 0.0011800545133879*G0_0_0_0_3 + 0.00518197851531203*G0_0_0_0_4 + 0.00620811287477976*G0_0_0_0_5 + 0.00759339426006119*G0_0_0_1_0 - 0.122366522366527*G0_0_0_1_1 + 0.0151611351611357*G0_0_0_1_2 - 0.0731120731120756*G0_0_0_1_3 - 0.0118518518518522*G0_0_0_1_4 - 0.0341189674523021*G0_0_0_1_5 - 0.00541285874619226*G0_0_0_2_0 + 0.0151611351611357*G0_0_0_2_1 + 0.00677248677248702*G0_0_0_2_2 + 0.0136475869809208*G0_0_0_2_3 + 0.00461760461760479*G0_0_0_2_4 + 0.00246272246272257*G0_0_0_2_5 + 0.0011800545133879*G0_0_0_3_0 - 0.0731120731120756*G0_0_0_3_1 + 0.0136475869809208*G0_0_0_3_2 - 0.0178547378547384*G0_0_0_3_3 + 0.0213435946769287*G0_0_0_3_4 - 0.00728555395222095*G0_0_0_3_5 + 0.00518197851531203*G0_0_0_4_0 - 0.0118518518518522*G0_0_0_4_1 + 0.00461760461760479*G0_0_0_4_2 + 0.0213435946769287*G0_0_0_4_3 + 0.118826358826363*G0_0_0_4_4 + 0.0187782587782594*G0_0_0_4_5 + 0.00620811287477976*G0_0_0_5_0 - 0.0341189674523021*G0_0_0_5_1 + 0.00246272246272257*G0_0_0_5_2 - 0.00728555395222095*G0_0_0_5_3 + 0.0187782587782594*G0_0_0_5_4 - 0.00861952861952899*G0_0_0_5_5 + 0.00302709636042976*G0_1_0_0_0 - 0.00756774090107452*G0_1_0_0_1 - 0.00128266794933466*G0_1_0_0_3 + 0.000564373897707234*G0_1_0_0_4 - 0.00743947410614103*G0_1_0_0_5 - 0.00756774090107452*G0_1_0_1_0 + 0.00756774090107447*G0_1_0_1_2 - 0.0389931056597735*G0_1_0_1_3 + 0.0389931056597738*G0_1_0_1_5 + 0.00756774090107447*G0_1_0_2_1 - 0.00302709636042976*G0_1_0_2_2 + 0.00743947410614101*G0_1_0_2_3 - 0.000564373897707226*G0_1_0_2_4 + 0.00128266794933466*G0_1_0_2_5 - 0.00128266794933466*G0_1_0_3_0 - 0.0389931056597735*G0_1_0_3_1 + 0.00743947410614101*G0_1_0_3_2 - 0.00923520923520938*G0_1_0_3_3 + 0.00256533589866933*G0_1_0_3_4 + 0.000564373897707234*G0_1_0_4_0 - 0.000564373897707226*G0_1_0_4_2 + 0.00256533589866933*G0_1_0_4_3 - 0.00256533589866932*G0_1_0_4_5 - 0.00743947410614103*G0_1_0_5_0 + 0.0389931056597738*G0_1_0_5_1 + 0.00128266794933466*G0_1_0_5_2 - 0.00256533589866932*G0_1_0_5_4 + 0.00923520923520956*G0_1_0_5_5; + A[12] = A[196] - 0.132166105499443*G0_0_0_0_0 + 0.0205739939073279*G0_0_0_0_2 - 0.0130319063652401*G0_0_0_0_3 - 0.0782940516273875*G0_0_0_0_4 - 0.0403270803270817*G0_0_0_0_5 + 0.132166105499443*G0_0_0_1_1 - 0.020573993907328*G0_0_0_1_2 + 0.0782940516273876*G0_0_0_1_3 + 0.0130319063652401*G0_0_0_1_4 + 0.0403270803270818*G0_0_0_1_5 + 0.0205739939073279*G0_0_0_2_0 - 0.020573993907328*G0_0_0_2_1 - 0.00902998236331597*G0_0_0_2_3 + 0.00902998236331596*G0_0_0_2_4 - 0.0130319063652401*G0_0_0_3_0 + 0.0782940516273876*G0_0_0_3_1 - 0.00902998236331596*G0_0_0_3_2 + 0.136681096681101*G0_0_0_3_3 + 0.0260638127304804*G0_0_0_3_5 - 0.0782940516273875*G0_0_0_4_0 + 0.0130319063652401*G0_0_0_4_1 + 0.00902998236331596*G0_0_0_4_2 - 0.136681096681101*G0_0_0_4_4 - 0.0260638127304803*G0_0_0_4_5 - 0.0403270803270817*G0_0_0_5_0 + 0.0403270803270818*G0_0_0_5_1 + 0.0260638127304804*G0_0_0_5_3 - 0.0260638127304803*G0_0_0_5_4 - 0.122366522366527*G0_0_1_0_0 + 0.0151611351611357*G0_0_1_0_1 + 0.00759339426006119*G0_0_1_0_2 - 0.0118518518518522*G0_0_1_0_3 - 0.0341189674523019*G0_0_1_0_4 - 0.0731120731120757*G0_0_1_0_5 + 0.0151611351611357*G0_0_1_1_0 + 0.00677248677248702*G0_0_1_1_1 - 0.00541285874619227*G0_0_1_1_2 + 0.00461760461760478*G0_0_1_1_3 + 0.00246272246272255*G0_0_1_1_4 + 0.0136475869809208*G0_0_1_1_5 + 0.00759339426006119*G0_0_1_2_0 - 0.00541285874619227*G0_0_1_2_1 + 0.00979958313291683*G0_0_1_2_2 + 0.00518197851531205*G0_0_1_2_3 + 0.00620811287477975*G0_0_1_2_4 + 0.0011800545133879*G0_0_1_2_5 - 0.0118518518518522*G0_0_1_3_0 + 0.00461760461760478*G0_0_1_3_1 + 0.00518197851531205*G0_0_1_3_2 + 0.118826358826363*G0_0_1_3_3 + 0.0187782587782594*G0_0_1_3_4 + 0.0213435946769287*G0_0_1_3_5 - 0.0341189674523019*G0_0_1_4_0 + 0.00246272246272255*G0_0_1_4_1 + 0.00620811287477975*G0_0_1_4_2 + 0.0187782587782594*G0_0_1_4_3 - 0.00861952861952895*G0_0_1_4_4 - 0.00728555395222089*G0_0_1_4_5 - 0.0731120731120757*G0_0_1_5_0 + 0.0136475869809208*G0_0_1_5_1 + 0.0011800545133879*G0_0_1_5_2 + 0.0213435946769287*G0_0_1_5_3 - 0.0072855539522209*G0_0_1_5_4 - 0.0178547378547387*G0_0_1_5_5 - 0.125393618726956*G0_1_0_0_0 + 0.0151611351611357*G0_1_0_0_1 + 0.0151611351611357*G0_1_0_0_2 - 0.0105691839025175*G0_1_0_0_3 - 0.0736764470097827*G0_1_0_0_4 - 0.0266794933461609*G0_1_0_0_5 + 0.0151611351611357*G0_1_0_1_0 + 0.00979958313291645*G0_1_0_1_1 - 0.0129805996472667*G0_1_0_1_2 + 0.0441750841750855*G0_1_0_1_3 + 0.00118005451338789*G0_1_0_1_4 - 0.032784992784994*G0_1_0_1_5 + 0.0151611351611357*G0_1_0_2_0 - 0.0129805996472667*G0_1_0_2_1 + 0.00979958313291679*G0_1_0_2_2 - 0.00282186948853619*G0_1_0_2_3 + 0.014211960878628*G0_1_0_2_4 + 0.00118005451338789*G0_1_0_2_5 - 0.0105691839025175*G0_1_0_3_0 + 0.0441750841750855*G0_1_0_3_1 - 0.00282186948853618*G0_1_0_3_2 + 0.128061568061572*G0_1_0_3_3 + 0.0187782587782594*G0_1_0_3_4 + 0.0187782587782594*G0_1_0_3_5 - 0.0736764470097827*G0_1_0_4_0 + 0.00118005451338789*G0_1_0_4_1 + 0.014211960878628*G0_1_0_4_2 + 0.0187782587782594*G0_1_0_4_3 - 0.0178547378547383*G0_1_0_4_4 - 0.00472021805355154*G0_1_0_4_5 - 0.0266794933461609*G0_1_0_5_0 - 0.032784992784994*G0_1_0_5_1 + 0.00118005451338789*G0_1_0_5_2 + 0.0187782587782594*G0_1_0_5_3 - 0.00472021805355154*G0_1_0_5_4 - 0.0178547378547385*G0_1_0_5_5 - 0.122366522366527*G0_1_1_0_0 + 0.0151611351611357*G0_1_1_0_1 + 0.00759339426006119*G0_1_1_0_2 - 0.0118518518518522*G0_1_1_0_3 - 0.0341189674523019*G0_1_1_0_4 - 0.0731120731120757*G0_1_1_0_5 + 0.0151611351611357*G0_1_1_1_0 + 0.00677248677248695*G0_1_1_1_1 - 0.00541285874619227*G0_1_1_1_2 + 0.00461760461760475*G0_1_1_1_3 + 0.00246272246272255*G0_1_1_1_4 + 0.0136475869809207*G0_1_1_1_5 + 0.00759339426006119*G0_1_1_2_0 - 0.00541285874619227*G0_1_1_2_1 + 0.00979958313291684*G0_1_1_2_2 + 0.00518197851531207*G0_1_1_2_3 + 0.00620811287477977*G0_1_1_2_4 + 0.00118005451338792*G0_1_1_2_5 - 0.0118518518518522*G0_1_1_3_0 + 0.00461760461760475*G0_1_1_3_1 + 0.00518197851531207*G0_1_1_3_2 + 0.118826358826363*G0_1_1_3_3 + 0.0187782587782594*G0_1_1_3_4 + 0.0213435946769287*G0_1_1_3_5 - 0.0341189674523019*G0_1_1_4_0 + 0.00246272246272255*G0_1_1_4_1 + 0.00620811287477977*G0_1_1_4_2 + 0.0187782587782594*G0_1_1_4_3 - 0.00861952861952892*G0_1_1_4_4 - 0.00728555395222091*G0_1_1_4_5 - 0.0731120731120757*G0_1_1_5_0 + 0.0136475869809207*G0_1_1_5_1 + 0.00118005451338792*G0_1_1_5_2 + 0.0213435946769287*G0_1_1_5_3 - 0.00728555395222092*G0_1_1_5_4 - 0.017854737854739*G0_1_1_5_5; + A[180] = A[12] - 0.00756774090107452*G0_0_1_0_1 + 0.00756774090107446*G0_0_1_0_2 - 0.0389931056597735*G0_0_1_0_4 + 0.0389931056597738*G0_0_1_0_5 - 0.00756774090107452*G0_0_1_1_0 + 0.00302709636042981*G0_0_1_1_1 + 0.000564373897707234*G0_0_1_1_3 - 0.00128266794933467*G0_0_1_1_4 - 0.00743947410614105*G0_0_1_1_5 + 0.00756774090107446*G0_0_1_2_0 - 0.00302709636042979*G0_0_1_2_2 - 0.000564373897707236*G0_0_1_2_3 + 0.00743947410614098*G0_0_1_2_4 + 0.00128266794933465*G0_0_1_2_5 + 0.000564373897707232*G0_0_1_3_1 - 0.000564373897707237*G0_0_1_3_2 + 0.00256533589866934*G0_0_1_3_4 - 0.00256533589866934*G0_0_1_3_5 - 0.0389931056597735*G0_0_1_4_0 - 0.00128266794933467*G0_0_1_4_1 + 0.00743947410614098*G0_0_1_4_2 + 0.00256533589866933*G0_0_1_4_3 - 0.00923520923520925*G0_0_1_4_4 + 0.0389931056597738*G0_0_1_5_0 - 0.00743947410614105*G0_0_1_5_1 + 0.00128266794933465*G0_0_1_5_2 - 0.00256533589866934*G0_0_1_5_3 + 0.00923520923520972*G0_0_1_5_5 + 0.00756774090107452*G0_1_0_0_1 - 0.00756774090107446*G0_1_0_0_2 + 0.0389931056597735*G0_1_0_0_4 - 0.0389931056597738*G0_1_0_0_5 + 0.00756774090107453*G0_1_0_1_0 - 0.00302709636042981*G0_1_0_1_1 - 0.000564373897707232*G0_1_0_1_3 + 0.00128266794933468*G0_1_0_1_4 + 0.00743947410614105*G0_1_0_1_5 - 0.00756774090107446*G0_1_0_2_0 + 0.00302709636042979*G0_1_0_2_2 + 0.000564373897707235*G0_1_0_2_3 - 0.00743947410614098*G0_1_0_2_4 - 0.00128266794933465*G0_1_0_2_5 - 0.000564373897707231*G0_1_0_3_1 + 0.000564373897707236*G0_1_0_3_2 - 0.00256533589866933*G0_1_0_3_4 + 0.00256533589866934*G0_1_0_3_5 + 0.0389931056597735*G0_1_0_4_0 + 0.00128266794933467*G0_1_0_4_1 - 0.00743947410614098*G0_1_0_4_2 - 0.00256533589866933*G0_1_0_4_3 + 0.00923520923520926*G0_1_0_4_4 - 0.0389931056597738*G0_1_0_5_0 + 0.00743947410614105*G0_1_0_5_1 - 0.00128266794933465*G0_1_0_5_2 + 0.00256533589866934*G0_1_0_5_3 - 0.00923520923520974*G0_1_0_5_5; + A[28] = A[196] + 0.00302709636042976*G0_0_1_0_0 - 0.00756774090107452*G0_0_1_0_1 - 0.00128266794933466*G0_0_1_0_3 + 0.000564373897707242*G0_0_1_0_4 - 0.00743947410614103*G0_0_1_0_5 - 0.00756774090107452*G0_0_1_1_0 + 0.00756774090107447*G0_0_1_1_2 - 0.0389931056597735*G0_0_1_1_3 + 0.0389931056597738*G0_0_1_1_5 + 0.00756774090107447*G0_0_1_2_1 - 0.00302709636042976*G0_0_1_2_2 + 0.007439474106141*G0_0_1_2_3 - 0.000564373897707235*G0_0_1_2_4 + 0.00128266794933466*G0_0_1_2_5 - 0.00128266794933466*G0_0_1_3_0 - 0.0389931056597735*G0_0_1_3_1 + 0.007439474106141*G0_0_1_3_2 - 0.00923520923520939*G0_0_1_3_3 + 0.00256533589866933*G0_0_1_3_4 + 0.000564373897707243*G0_0_1_4_0 - 0.000564373897707235*G0_0_1_4_2 + 0.00256533589866933*G0_0_1_4_3 - 0.00256533589866931*G0_0_1_4_5 - 0.00743947410614103*G0_0_1_5_0 + 0.0389931056597738*G0_0_1_5_1 + 0.00128266794933466*G0_0_1_5_2 - 0.00256533589866931*G0_0_1_5_4 + 0.00923520923520958*G0_0_1_5_5 - 0.00302709636042976*G0_1_0_0_0 + 0.00756774090107452*G0_1_0_0_1 + 0.00128266794933466*G0_1_0_0_3 - 0.000564373897707243*G0_1_0_0_4 + 0.00743947410614103*G0_1_0_0_5 + 0.00756774090107452*G0_1_0_1_0 - 0.00756774090107447*G0_1_0_1_2 + 0.0389931056597735*G0_1_0_1_3 - 0.0389931056597738*G0_1_0_1_5 - 0.00756774090107447*G0_1_0_2_1 + 0.00302709636042976*G0_1_0_2_2 - 0.007439474106141*G0_1_0_2_3 + 0.000564373897707234*G0_1_0_2_4 - 0.00128266794933466*G0_1_0_2_5 + 0.00128266794933466*G0_1_0_3_0 + 0.0389931056597735*G0_1_0_3_1 - 0.007439474106141*G0_1_0_3_2 + 0.00923520923520939*G0_1_0_3_3 - 0.00256533589866933*G0_1_0_3_4 - 0.000564373897707243*G0_1_0_4_0 + 0.000564373897707234*G0_1_0_4_2 - 0.00256533589866933*G0_1_0_4_3 + 0.00256533589866931*G0_1_0_4_5 + 0.00743947410614103*G0_1_0_5_0 - 0.0389931056597738*G0_1_0_5_1 - 0.00128266794933466*G0_1_0_5_2 + 0.00256533589866931*G0_1_0_5_4 - 0.00923520923520956*G0_1_0_5_5; + A[27] = -A[28] - 0.0124162257495595*G0_0_0_0_0 + 0.0063620330286999*G0_0_0_0_1 - 0.000666987333654026*G0_0_0_0_2 + 0.000513067179733874*G0_0_0_0_3 - 0.0173416706750045*G0_0_0_0_4 + 0.0026679493346161*G0_0_0_0_5 + 0.0063620330286999*G0_0_0_1_0 - 0.0887606220939583*G0_0_0_1_1 + 0.00969696969697003*G0_0_0_1_2 - 0.0499727433060783*G0_0_0_1_3 - 0.00502805836139187*G0_0_0_1_4 - 0.0275004008337352*G0_0_0_1_5 - 0.000666987333654027*G0_0_0_2_0 + 0.00969696969697002*G0_0_0_2_1 + 0.0110822510822515*G0_0_0_2_2 + 0.0116979316979321*G0_0_0_2_3 + 0.0149815616482288*G0_0_0_2_4 + 0.000615680615680644*G0_0_0_2_5 + 0.000513067179733874*G0_0_0_3_0 - 0.0499727433060783*G0_0_0_3_1 + 0.0116979316979321*G0_0_0_3_2 - 0.0119031585698256*G0_0_0_3_3 + 0.009029982363316*G0_0_0_3_4 - 0.00225749559082904*G0_0_0_3_5 - 0.0173416706750045*G0_0_0_4_0 - 0.00502805836139187*G0_0_0_4_1 + 0.0149815616482288*G0_0_0_4_2 + 0.009029982363316*G0_0_0_4_3 + 0.00533589866923218*G0_0_0_4_4 + 0.00882475549142249*G0_0_0_4_5 + 0.0026679493346161*G0_0_0_5_0 - 0.0275004008337352*G0_0_0_5_1 + 0.000615680615680643*G0_0_0_5_2 - 0.00225749559082904*G0_0_0_5_3 + 0.00882475549142249*G0_0_0_5_4 + 0.0041045374378709*G0_0_0_5_5 + 0.00410453743787087*G0_0_1_0_0 - 0.0080038480038483*G0_0_1_0_1 - 0.000461760461760479*G0_0_1_0_2 + 0.000615680615680629*G0_0_1_0_3 + 0.00410453743787089*G0_0_1_0_4 + 0.00584896584896604*G0_0_1_0_5 - 0.0080038480038483*G0_0_1_1_0 + 0.0048228314894983*G0_0_1_1_2 - 0.026166426166427*G0_0_1_1_3 + 0.00318101651434995*G0_0_1_1_4 + 0.0261664261664272*G0_0_1_1_5 - 0.000461760461760479*G0_0_1_2_0 + 0.0048228314894983*G0_0_1_2_1 - 0.000923520923520915*G0_0_1_2_2 + 0.00749078082411439*G0_0_1_2_3 + 0.000923520923520981*G0_0_1_2_4 + 0.00061568061568063*G0_0_1_3_0 - 0.026166426166427*G0_0_1_3_1 + 0.00749078082411439*G0_0_1_3_2 - 0.00697771364438047*G0_0_1_3_3 - 0.00759339426006116*G0_0_1_3_4 - 0.00123136123136126*G0_0_1_3_5 + 0.00410453743787089*G0_0_1_4_0 + 0.00318101651434995*G0_0_1_4_1 + 0.000923520923520981*G0_0_1_4_2 - 0.00759339426006116*G0_0_1_4_3 - 0.0123136123136127*G0_0_1_4_4 - 0.0063620330286999*G0_0_1_4_5 + 0.00584896584896604*G0_0_1_5_0 + 0.0261664261664272*G0_0_1_5_1 - 0.00123136123136126*G0_0_1_5_3 - 0.0063620330286999*G0_0_1_5_4 + 0.00944043610710316*G0_0_1_5_5; + A[29] = -A[27] - 0.0200096200096206*G0_0_0_0_0 - 0.00395061728395076*G0_0_0_0_1 + 0.00995350328683694*G0_0_0_0_2 - 0.00123136123136128*G0_0_0_0_3 - 0.0136475869809208*G0_0_0_0_4 - 0.00554112554112574*G0_0_0_0_5 - 0.00395061728395076*G0_0_0_1_0 + 0.0672118005451365*G0_0_0_1_1 - 0.00625941959275316*G0_0_0_1_2 + 0.0425845759179107*G0_0_0_1_3 + 0.0104665704665708*G0_0_0_1_4 + 0.0169312169312176*G0_0_0_1_5 + 0.00995350328683694*G0_0_0_2_0 - 0.00625941959275316*G0_0_0_2_1 - 0.0189834856501529*G0_0_0_2_2 - 0.0187782587782594*G0_0_0_2_3 - 0.0156998556998562*G0_0_0_2_4 - 0.00441237774571125*G0_0_0_2_5 - 0.00123136123136128*G0_0_0_3_0 + 0.0425845759179107*G0_0_0_3_1 - 0.0187782587782594*G0_0_0_3_2 + 0.0184704184704192*G0_0_0_3_3 - 0.018470418470419*G0_0_0_3_4 + 0.0112874779541451*G0_0_0_3_5 - 0.0136475869809208*G0_0_0_4_0 + 0.0104665704665708*G0_0_0_4_1 - 0.0156998556998562*G0_0_0_4_2 - 0.018470418470419*G0_0_0_4_3 - 0.214667308000648*G0_0_0_4_4 - 0.0121083854417191*G0_0_0_4_5 - 0.00554112554112574*G0_0_0_5_0 + 0.0169312169312176*G0_0_0_5_1 - 0.00441237774571125*G0_0_0_5_2 + 0.0112874779541451*G0_0_0_5_3 - 0.0121083854417191*G0_0_0_5_4 + 0.0164181497514837*G0_0_0_5_5 - 0.00102613435946771*G0_0_1_0_0 + 0.00230880230880241*G0_0_1_0_1 + 0.00318101651434995*G0_0_1_0_3 + 0.00205226871893546*G0_0_1_0_4 + 0.0132371332371337*G0_0_1_0_5 + 0.00230880230880241*G0_0_1_1_0 - 0.00230880230880238*G0_0_1_1_2 + 0.0256533589866931*G0_0_1_1_3 - 0.0256533589866933*G0_0_1_1_5 - 0.00230880230880238*G0_0_1_2_1 + 0.00102613435946774*G0_0_1_2_2 - 0.0132371332371337*G0_0_1_2_3 - 0.00205226871893545*G0_0_1_2_4 - 0.00318101651434996*G0_0_1_2_5 + 0.00318101651434995*G0_0_1_3_0 + 0.0256533589866931*G0_0_1_3_1 - 0.0132371332371337*G0_0_1_3_2 + 0.00205226871893549*G0_0_1_3_3 - 0.0063620330286999*G0_0_1_3_4 + 0.00205226871893546*G0_0_1_4_0 - 0.00205226871893545*G0_0_1_4_2 - 0.0063620330286999*G0_0_1_4_3 + 0.00636203302869993*G0_0_1_4_5 + 0.0132371332371337*G0_0_1_5_0 - 0.0256533589866933*G0_0_1_5_1 - 0.00318101651434996*G0_0_1_5_2 + 0.00636203302869993*G0_0_1_5_4 - 0.00205226871893548*G0_0_1_5_5; + A[209] = A[223] - 0.00985088985089009*G0_0_1_0_0 + 0.0172390572390578*G0_0_1_0_1 + 0.0172390572390577*G0_0_1_0_2 - 0.0394035594035607*G0_0_1_0_4 - 0.0394035594035606*G0_0_1_0_5 + 0.0172390572390578*G0_0_1_1_0 - 0.0246272246272255*G0_0_1_1_1 + 0.0344781144781156*G0_0_1_1_2 - 0.0689562289562314*G0_0_1_1_3 - 0.0591053391053411*G0_0_1_1_4 - 0.0886580086580116*G0_0_1_1_5 + 0.0172390572390577*G0_0_1_2_0 + 0.0344781144781156*G0_0_1_2_1 - 0.024627224627225*G0_0_1_2_2 - 0.068956228956231*G0_0_1_2_3 - 0.0886580086580113*G0_0_1_2_4 - 0.0591053391053411*G0_0_1_2_5 - 0.0689562289562315*G0_0_1_3_1 - 0.068956228956231*G0_0_1_3_2 - 0.315228475228487*G0_0_1_3_3 + 0.118210678210682*G0_0_1_3_4 + 0.118210678210682*G0_0_1_3_5 - 0.0394035594035607*G0_0_1_4_0 - 0.0591053391053411*G0_0_1_4_1 - 0.0886580086580113*G0_0_1_4_2 + 0.118210678210682*G0_0_1_4_3 + 0.157614237614244*G0_0_1_4_4 + 0.236421356421365*G0_0_1_4_5 - 0.0394035594035606*G0_0_1_5_0 - 0.0886580086580117*G0_0_1_5_1 - 0.0591053391053411*G0_0_1_5_2 + 0.118210678210682*G0_0_1_5_3 + 0.236421356421365*G0_0_1_5_4 + 0.157614237614244*G0_0_1_5_5 + 0.00985088985089009*G0_1_0_0_0 - 0.0172390572390578*G0_1_0_0_1 - 0.0172390572390577*G0_1_0_0_2 + 0.0394035594035607*G0_1_0_0_4 + 0.0394035594035606*G0_1_0_0_5 - 0.0172390572390578*G0_1_0_1_0 + 0.0246272246272255*G0_1_0_1_1 - 0.0344781144781156*G0_1_0_1_2 + 0.0689562289562314*G0_1_0_1_3 + 0.0591053391053411*G0_1_0_1_4 + 0.0886580086580116*G0_1_0_1_5 - 0.0172390572390577*G0_1_0_2_0 - 0.0344781144781156*G0_1_0_2_1 + 0.024627224627225*G0_1_0_2_2 + 0.068956228956231*G0_1_0_2_3 + 0.0886580086580113*G0_1_0_2_4 + 0.0591053391053411*G0_1_0_2_5 + 0.0689562289562315*G0_1_0_3_1 + 0.068956228956231*G0_1_0_3_2 + 0.315228475228487*G0_1_0_3_3 - 0.118210678210682*G0_1_0_3_4 - 0.118210678210682*G0_1_0_3_5 + 0.0394035594035607*G0_1_0_4_0 + 0.0591053391053411*G0_1_0_4_1 + 0.0886580086580113*G0_1_0_4_2 - 0.118210678210682*G0_1_0_4_3 - 0.157614237614244*G0_1_0_4_4 - 0.236421356421365*G0_1_0_4_5 + 0.0394035594035607*G0_1_0_5_0 + 0.0886580086580117*G0_1_0_5_1 + 0.0591053391053411*G0_1_0_5_2 - 0.118210678210682*G0_1_0_5_3 - 0.236421356421365*G0_1_0_5_4 - 0.157614237614244*G0_1_0_5_5; + A[13] = A[195] + 0.000436107102773807*G0_0_1_0_1 + 0.00274490941157618*G0_0_1_0_2 - 0.00318101651434996*G0_0_1_0_3 - 0.0128266794933467*G0_0_1_0_4 + 0.0128266794933465*G0_0_1_0_5 + 0.000436107102773807*G0_0_1_1_0 - 0.00107744107744115*G0_0_1_1_1 + 0.000461760461760479*G0_0_1_1_2 - 0.00354016354016368*G0_0_1_1_3 - 0.00189834856501529*G0_0_1_1_4 - 0.0132884399551071*G0_0_1_1_5 + 0.00274490941157618*G0_0_1_2_0 + 0.000461760461760478*G0_0_1_2_1 - 0.00210357543690884*G0_0_1_2_2 - 0.00148789482122819*G0_0_1_2_3 + 0.00128266794933468*G0_0_1_2_5 - 0.00318101651434996*G0_0_1_3_0 - 0.00354016354016368*G0_0_1_3_1 - 0.00148789482122819*G0_0_1_3_2 + 0.0123136123136127*G0_0_1_3_3 + 0.0101587301587305*G0_0_1_3_4 + 0.00379669713003056*G0_0_1_3_5 - 0.0128266794933467*G0_0_1_4_0 - 0.00189834856501529*G0_0_1_4_1 + 0.0101587301587305*G0_0_1_4_3 - 0.00225749559082891*G0_0_1_4_4 + 0.00123136123136122*G0_0_1_4_5 + 0.0128266794933465*G0_0_1_5_0 - 0.0132884399551071*G0_0_1_5_1 + 0.00128266794933468*G0_0_1_5_2 + 0.00379669713003056*G0_0_1_5_3 + 0.00123136123136122*G0_0_1_5_4 - 0.000205226871893725*G0_0_1_5_5 - 0.000436107102773807*G0_1_0_0_1 - 0.00274490941157618*G0_1_0_0_2 + 0.00318101651434996*G0_1_0_0_3 + 0.0128266794933467*G0_1_0_0_4 - 0.0128266794933465*G0_1_0_0_5 - 0.000436107102773807*G0_1_0_1_0 + 0.00107744107744116*G0_1_0_1_1 - 0.00046176046176048*G0_1_0_1_2 + 0.00354016354016369*G0_1_0_1_3 + 0.00189834856501529*G0_1_0_1_4 + 0.0132884399551071*G0_1_0_1_5 - 0.00274490941157618*G0_1_0_2_0 - 0.00046176046176048*G0_1_0_2_1 + 0.00210357543690884*G0_1_0_2_2 + 0.00148789482122819*G0_1_0_2_3 - 0.00128266794933468*G0_1_0_2_5 + 0.00318101651434996*G0_1_0_3_0 + 0.00354016354016369*G0_1_0_3_1 + 0.00148789482122818*G0_1_0_3_2 - 0.0123136123136127*G0_1_0_3_3 - 0.0101587301587305*G0_1_0_3_4 - 0.00379669713003056*G0_1_0_3_5 + 0.0128266794933467*G0_1_0_4_0 + 0.00189834856501529*G0_1_0_4_1 - 0.0101587301587305*G0_1_0_4_3 + 0.00225749559082891*G0_1_0_4_4 - 0.00123136123136122*G0_1_0_4_5 - 0.0128266794933465*G0_1_0_5_0 + 0.0132884399551071*G0_1_0_5_1 - 0.00128266794933468*G0_1_0_5_2 - 0.00379669713003056*G0_1_0_5_3 - 0.00123136123136122*G0_1_0_5_4 + 0.00020522687189372*G0_1_0_5_5; + A[53] = -A[50] - 0.00451499118165793*G0_0_1_0_0 - 0.000752498530276334*G0_0_1_0_1 + 0.00136817914595695*G0_0_1_0_2 + 0.027089947089948*G0_0_1_0_3 - 0.0030099941211053*G0_0_1_0_4 + 0.00916680027791171*G0_0_1_0_5 - 0.000752498530276334*G0_0_1_1_0 - 0.00697771364438061*G0_0_1_1_1 + 0.0177863288974406*G0_0_1_1_2 - 0.027637218748331*G0_0_1_1_3 + 0.00246272246272255*G0_0_1_1_4 - 0.000684089572978515*G0_0_1_1_5 + 0.00136817914595694*G0_0_1_2_0 + 0.0177863288974406*G0_0_1_2_1 - 0.121083854417192*G0_0_1_2_2 - 0.0164181497514836*G0_0_1_2_3 + 0.00547271658382785*G0_0_1_2_5 + 0.027089947089948*G0_0_1_3_0 - 0.027637218748331*G0_0_1_3_1 - 0.0164181497514836*G0_0_1_3_2 - 0.220003206669881*G0_0_1_3_3 - 0.0591053391053412*G0_0_1_3_4 - 0.0651253273475518*G0_0_1_3_5 - 0.00300999412110531*G0_0_1_4_0 + 0.00246272246272255*G0_0_1_4_1 - 0.0591053391053412*G0_0_1_4_3 + 0.0755234888568248*G0_0_1_4_4 - 0.0158708780931008*G0_0_1_4_5 + 0.00916680027791171*G0_0_1_5_0 - 0.000684089572978515*G0_0_1_5_1 + 0.00547271658382785*G0_0_1_5_2 - 0.0651253273475518*G0_0_1_5_3 - 0.0158708780931008*G0_0_1_5_4 - 0.0142290631179524*G0_0_1_5_5 + 0.00574635241301933*G0_1_1_0_0 - 0.0160076960076967*G0_1_1_0_1 - 0.000752498530276332*G0_1_1_0_2 + 0.00177863288974405*G0_1_1_0_3 - 0.0042413553524666*G0_1_1_0_4 - 0.0158708780931009*G0_1_1_0_5 - 0.0160076960076967*G0_1_1_1_0 + 0.192913259579935*G0_1_1_1_1 - 0.000684089572978538*G0_1_1_1_2 - 0.00643044198599756*G0_1_1_1_3 - 0.00177863288974408*G0_1_1_1_4 + 0.0803121158676747*G0_1_1_1_5 - 0.000752498530276332*G0_1_1_2_0 - 0.000684089572978537*G0_1_1_2_1 - 0.00410453743787073*G0_1_1_2_2 + 0.0109454331676558*G0_1_1_2_3 + 0.00547271658382789*G0_1_1_2_4 + 0.000410453743787062*G0_1_1_2_5 + 0.00177863288974405*G0_1_1_3_0 - 0.00643044198599755*G0_1_1_3_1 + 0.0109454331676558*G0_1_1_3_2 - 0.065125327347552*G0_1_1_3_3 - 0.00437817326706224*G0_1_1_3_5 - 0.0042413553524666*G0_1_1_4_0 - 0.00177863288974408*G0_1_1_4_1 + 0.00547271658382789*G0_1_1_4_2 + 0.0158708780931009*G0_1_1_4_4 + 0.00273635829191395*G0_1_1_4_5 - 0.0158708780931009*G0_1_1_5_0 + 0.0803121158676747*G0_1_1_5_1 + 0.000410453743787062*G0_1_1_5_2 - 0.00437817326706224*G0_1_1_5_3 + 0.00273635829191395*G0_1_1_5_4 + 0.0902998236331602*G0_1_1_5_5; + A[30] = -A[31] + 0.0161872695206034*G0_1_0_0_0 + 0.000678745123189588*G0_1_0_0_2 + 0.000401902624124859*G0_1_0_0_3 + 0.00147079258190375*G0_1_0_0_4 + 0.00605846828069073*G0_1_0_0_5 - 0.0161872695206036*G0_1_0_1_1 - 0.000678745123189584*G0_1_0_1_2 - 0.00147079258190376*G0_1_0_1_3 - 0.000401902624124859*G0_1_0_1_4 - 0.00605846828069076*G0_1_0_1_5 + 0.000678745123189588*G0_1_0_2_0 - 0.000678745123189583*G0_1_0_2_1 + 0.00458767569878696*G0_1_0_2_3 - 0.00458767569878696*G0_1_0_2_4 + 0.000401902624124859*G0_1_0_3_0 - 0.00147079258190376*G0_1_0_3_1 + 0.00458767569878696*G0_1_0_3_2 + 0.00560953449842359*G0_1_0_3_3 - 0.000803805248249721*G0_1_0_3_5 + 0.00147079258190375*G0_1_0_4_0 - 0.000401902624124858*G0_1_0_4_1 - 0.00458767569878696*G0_1_0_4_2 - 0.00560953449842356*G0_1_0_4_4 + 0.000803805248249721*G0_1_0_4_5 + 0.00605846828069073*G0_1_0_5_0 - 0.00605846828069076*G0_1_0_5_1 - 0.000803805248249722*G0_1_0_5_3 + 0.00080380524824972*G0_1_0_5_4 + 0.0161696328363001*G0_1_1_0_0 - 0.00119742397520179*G0_1_1_0_1 - 0.00051867885201221*G0_1_1_0_2 + 0.000816631927743073*G0_1_1_0_4 + 0.00540430762653005*G0_1_1_0_5 - 0.00119742397520179*G0_1_1_1_0 - 0.0011974239752018*G0_1_1_1_2 - 0.000654160654160681*G0_1_1_1_3 - 0.00044145155256268*G0_1_1_1_4 - 0.000654160654160685*G0_1_1_1_5 - 0.00051867885201221*G0_1_1_2_0 - 0.0011974239752018*G0_1_1_2_1 + 0.0161696328363002*G0_1_1_2_2 + 0.00540430762653006*G0_1_1_2_3 + 0.000816631927743091*G0_1_1_2_4 - 0.000654160654160681*G0_1_1_3_1 + 0.00540430762653006*G0_1_1_3_2 + 0.00344610122387915*G0_1_1_3_3 + 0.000962000962001004*G0_1_1_3_4 + 0.00015819571375128*G0_1_1_3_5 + 0.000816631927743073*G0_1_1_4_0 - 0.00044145155256268*G0_1_1_4_1 + 0.000816631927743091*G0_1_1_4_2 + 0.000962000962001004*G0_1_1_4_3 - 0.00216343327454444*G0_1_1_4_4 + 0.000962000962000999*G0_1_1_4_5 + 0.00540430762653005*G0_1_1_5_0 - 0.000654160654160685*G0_1_1_5_1 + 0.00015819571375128*G0_1_1_5_3 + 0.000962000962000999*G0_1_1_5_4 + 0.00344610122387911*G0_1_1_5_5; + A[23] = -A[21] + 0.0153407086740425*G0_0_0_0_0 + 0.000735396290951857*G0_0_0_0_1 - 0.00539575650686779*G0_0_0_0_2 + 0.000530169419058316*G0_0_0_0_3 + 0.01287798621132*G0_0_0_0_4 - 0.000666987333654038*G0_0_0_0_5 + 0.000735396290951857*G0_0_0_1_0 - 0.0125701459034795*G0_0_0_1_1 + 0.00146224146224151*G0_0_0_1_2 - 0.00391641280530185*G0_0_0_1_3 - 0.000530169419058315*G0_0_0_1_4 - 0.000701191812302883*G0_0_0_1_5 - 0.00539575650686779*G0_0_0_2_0 + 0.00146224146224151*G0_0_0_2_1 + 0.0384800384800397*G0_0_0_2_2 - 0.00140238362460587*G0_0_0_2_3 + 0.0081748703970929*G0_0_0_2_4 + 0.00157340601785053*G0_0_0_2_5 + 0.000530169419058316*G0_0_0_3_0 - 0.00391641280530185*G0_0_0_3_1 - 0.00140238362460587*G0_0_0_3_2 - 0.0147079258190374*G0_0_0_3_3 - 0.00420715087381769*G0_0_0_3_5 + 0.01287798621132*G0_0_0_4_0 - 0.000530169419058316*G0_0_0_4_1 + 0.0081748703970929*G0_0_0_4_2 + 0.0549323927101722*G0_0_0_4_4 - 0.00208647319758441*G0_0_0_4_5 - 0.000666987333654038*G0_0_0_5_0 - 0.000701191812302883*G0_0_0_5_1 + 0.00157340601785053*G0_0_0_5_2 - 0.00420715087381769*G0_0_0_5_3 - 0.00208647319758441*G0_0_0_5_4 - 0.00971407193629445*G0_0_0_5_5 - 0.0231393298059974*G0_0_1_0_0 - 0.000726845171289664*G0_0_1_0_1 - 0.00104323659879219*G0_0_1_0_3 + 0.00470311581422705*G0_0_1_0_4 + 0.000735396290951838*G0_0_1_0_5 - 0.000726845171289664*G0_0_1_1_0 + 0.000726845171289626*G0_0_1_1_2 - 0.00321522099299883*G0_0_1_1_3 + 0.003215220992999*G0_0_1_1_5 + 0.000726845171289626*G0_0_1_2_1 + 0.0231393298059972*G0_0_1_2_2 - 0.000735396290951857*G0_0_1_2_3 - 0.00470311581422708*G0_0_1_2_4 + 0.00104323659879219*G0_0_1_2_5 - 0.00104323659879219*G0_0_1_3_0 - 0.00321522099299883*G0_0_1_3_1 - 0.000735396290951857*G0_0_1_3_2 - 0.00499385388274289*G0_0_1_3_3 + 0.00208647319758437*G0_0_1_3_4 + 0.00470311581422705*G0_0_1_4_0 - 0.00470311581422708*G0_0_1_4_2 + 0.00208647319758437*G0_0_1_4_3 - 0.00208647319758441*G0_0_1_4_5 + 0.000735396290951839*G0_0_1_5_0 + 0.003215220992999*G0_0_1_5_1 + 0.00104323659879219*G0_0_1_5_2 - 0.00208647319758441*G0_0_1_5_4 + 0.004993853882743*G0_0_1_5_5; + A[20] = -A[23] - 0.000949174282507679*G0_0_1_0_0 - 0.00628934851157099*G0_0_1_0_1 - 0.000671262893485128*G0_0_1_0_2 - 0.00427555983111553*G0_0_1_0_3 + 0.00230880230880237*G0_0_1_0_4 - 0.00395061728395078*G0_0_1_0_5 - 0.00628934851157099*G0_0_1_1_0 + 0.0896584896584935*G0_0_1_1_1 - 0.00325370103147894*G0_0_1_1_2 + 0.0001881246325692*G0_0_1_1_3 - 0.000718294051627414*G0_0_1_1_4 + 0.0290567046122614*G0_0_1_1_5 - 0.000671262893485128*G0_0_1_2_0 - 0.00325370103147894*G0_0_1_2_1 + 0.0211640211640218*G0_0_1_2_2 + 0.00855111966223105*G0_0_1_2_3 - 0.000342044786489259*G0_0_1_2_4 - 0.00427555983111553*G0_0_1_3_0 + 0.000188124632569202*G0_0_1_3_1 + 0.00855111966223105*G0_0_1_3_2 + 0.0124504302282084*G0_0_1_3_3 + 0.00998770776548587*G0_0_1_3_4 + 0.00865373309817786*G0_0_1_3_5 + 0.00230880230880237*G0_0_1_4_0 - 0.000718294051627414*G0_0_1_4_1 - 0.000342044786489259*G0_0_1_4_2 + 0.00998770776548587*G0_0_1_4_3 - 0.0201122334455675*G0_0_1_4_4 + 0.00153920153920158*G0_0_1_4_5 - 0.00395061728395078*G0_0_1_5_0 + 0.0290567046122614*G0_0_1_5_1 + 0.00865373309817786*G0_0_1_5_3 + 0.00153920153920158*G0_0_1_5_4 + 0.019496552829887*G0_0_1_5_5; + A[5] = -A[20] - 0.00718294051627408*G0_0_0_0_0 + 0.00357436801881258*G0_0_0_0_2 - 0.000855111966223097*G0_0_0_0_3 + 0.00208647319758439*G0_0_0_0_4 - 0.0015734060178505*G0_0_0_0_5 + 0.007182940516274*G0_0_0_1_1 - 0.00357436801881258*G0_0_0_1_2 - 0.00208647319758438*G0_0_0_1_3 + 0.000855111966223106*G0_0_0_1_4 + 0.00157340601785049*G0_0_0_1_5 + 0.00357436801881258*G0_0_0_2_0 - 0.00357436801881258*G0_0_0_2_1 + 0.0155288333066116*G0_0_0_2_3 - 0.0155288333066116*G0_0_0_2_4 - 0.000855111966223097*G0_0_0_3_0 - 0.00208647319758438*G0_0_0_3_1 + 0.0155288333066116*G0_0_0_3_2 + 0.0285949441505007*G0_0_0_3_3 + 0.00171022393244621*G0_0_0_3_5 + 0.00208647319758439*G0_0_0_4_0 + 0.000855111966223106*G0_0_0_4_1 - 0.0155288333066116*G0_0_0_4_2 - 0.0285949441505006*G0_0_0_4_4 - 0.00171022393244622*G0_0_0_4_5 - 0.00157340601785051*G0_0_0_5_0 + 0.00157340601785049*G0_0_0_5_1 + 0.00171022393244621*G0_0_0_5_3 - 0.00171022393244622*G0_0_0_5_4 - 0.00466891133557812*G0_0_1_0_0 - 0.00492544492544513*G0_0_1_0_1 + 0.000256533589866942*G0_0_1_0_2 - 0.00389931056597735*G0_0_1_0_3 - 0.000513067179733854*G0_0_1_0_4 - 0.00769600769600797*G0_0_1_0_5 - 0.00492544492544513*G0_0_1_1_0 + 0.0931216931216969*G0_0_1_1_1 - 0.00590027256693945*G0_0_1_1_2 - 0.00472021805355145*G0_0_1_1_3 + 0.00051306717973386*G0_0_1_1_4 + 0.0268847202180547*G0_0_1_1_5 + 0.000256533589866942*G0_0_1_2_0 - 0.00590027256693945*G0_0_1_2_1 + 0.0150328683662022*G0_0_1_2_2 + 0.0244219977553319*G0_0_1_2_3 - 0.000513067179733868*G0_0_1_2_5 - 0.00389931056597735*G0_0_1_3_0 - 0.00472021805355145*G0_0_1_3_1 + 0.0244219977553319*G0_0_1_3_2 + 0.0543851210517895*G0_0_1_3_3 + 0.00677248677248697*G0_0_1_3_4 + 0.00882475549142248*G0_0_1_3_5 - 0.000513067179733854*G0_0_1_4_0 + 0.00051306717973386*G0_0_1_4_1 + 0.00677248677248697*G0_0_1_4_3 - 0.00677248677248706*G0_0_1_4_4 - 0.00769600769600797*G0_0_1_5_0 + 0.0268847202180547*G0_0_1_5_1 - 0.000513067179733868*G0_0_1_5_2 + 0.00882475549142248*G0_0_1_5_3 + 0.015392015392016*G0_0_1_5_5 - 0.00628507295173981*G0_1_0_0_0 + 0.000448933782267127*G0_1_0_0_1 + 0.000555822778045007*G0_1_0_0_2 - 0.000171022393244618*G0_1_0_0_3 - 0.000701191812302939*G0_1_0_0_4 - 0.00160761049649944*G0_1_0_0_5 + 0.000448933782267127*G0_1_0_1_0 + 0.00089786756453426*G0_1_0_1_1 - 0.00301854524076758*G0_1_0_1_2 - 0.00278766500988733*G0_1_0_1_3 + 0.000684089572978485*G0_1_0_1_4 + 0.000555822778045008*G0_1_0_2_0 - 0.00301854524076758*G0_1_0_2_1 + 0.0350168350168365*G0_1_0_2_2 + 0.014690823579713*G0_1_0_2_3 - 0.000838009726898591*G0_1_0_2_4 + 0.000153920153920165*G0_1_0_2_5 - 0.000171022393244618*G0_1_0_3_0 - 0.00278766500988733*G0_1_0_3_1 + 0.014690823579713*G0_1_0_3_2 + 0.0163497407941858*G0_1_0_3_3 - 0.00102613435946773*G0_1_0_3_4 - 0.000701191812302939*G0_1_0_4_0 + 0.000684089572978485*G0_1_0_4_1 - 0.000838009726898591*G0_1_0_4_2 - 0.00102613435946773*G0_1_0_4_3 - 0.0122452033563149*G0_1_0_4_4 - 0.00167601945379729*G0_1_0_4_5 - 0.00160761049649944*G0_1_0_5_0 + 0.000153920153920165*G0_1_0_5_2 - 0.00167601945379729*G0_1_0_5_4 - 0.000820907487574171*G0_1_0_5_5 - 0.00628507295173979*G0_1_1_0_0 + 0.000906418684196483*G0_1_1_0_1 + 0.000286462508684744*G0_1_1_0_2 - 0.000359147025813689*G0_1_1_0_3 + 0.000906418684196502*G0_1_1_0_4 - 0.00321522099299888*G0_1_1_0_5 + 0.000906418684196483*G0_1_1_1_0 + 0.00346320346320364*G0_1_1_1_1 - 0.00237721126610024*G0_1_1_1_2 - 0.00651595318262005*G0_1_1_1_3 + 0.00141948586393036*G0_1_1_1_4 - 0.000564373897707213*G0_1_1_1_5 + 0.000286462508684743*G0_1_1_2_0 - 0.00237721126610024*G0_1_1_2_1 + 0.0144428411095083*G0_1_1_2_2 + 0.0156656512212073*G0_1_1_2_3 - 0.0006327828550051*G0_1_1_2_4 - 0.000153920153920159*G0_1_1_2_5 - 0.00035914702581369*G0_1_1_3_0 - 0.00651595318262005*G0_1_1_3_1 + 0.0156656512212073*G0_1_1_3_2 + 0.0385826519159865*G0_1_1_3_3 - 0.00212067767623333*G0_1_1_3_4 + 0.00102613435946773*G0_1_1_3_5 + 0.000906418684196501*G0_1_1_4_0 + 0.00141948586393036*G0_1_1_4_1 - 0.0006327828550051*G0_1_1_4_2 - 0.00212067767623333*G0_1_1_4_3 - 0.00889316444872033*G0_1_1_4_4 - 0.0025311314200204*G0_1_1_4_5 - 0.00321522099299888*G0_1_1_5_0 - 0.000564373897707213*G0_1_1_5_1 - 0.000153920153920159*G0_1_1_5_2 + 0.00102613435946773*G0_1_1_5_3 - 0.0025311314200204*G0_1_1_5_4 - 0.00246272246272247*G0_1_1_5_5; + A[8] = -A[5] - 0.0896584896584928*G0_0_1_0_0 + 0.00628934851157095*G0_0_1_0_1 + 0.00325370103147893*G0_0_1_0_2 + 0.000718294051627433*G0_0_1_0_3 - 0.000188124632569089*G0_0_1_0_4 - 0.0290567046122612*G0_0_1_0_5 + 0.00628934851157095*G0_0_1_1_0 + 0.000949174282507696*G0_0_1_1_1 + 0.000671262893485137*G0_0_1_1_2 - 0.00230880230880238*G0_0_1_1_3 + 0.00427555983111553*G0_0_1_1_4 + 0.00395061728395077*G0_0_1_1_5 + 0.00325370103147893*G0_0_1_2_0 + 0.000671262893485137*G0_0_1_2_1 - 0.0211640211640219*G0_0_1_2_2 + 0.00034204478648924*G0_0_1_2_3 - 0.00855111966223107*G0_0_1_2_4 + 0.000718294051627432*G0_0_1_3_0 - 0.00230880230880238*G0_0_1_3_1 + 0.000342044786489238*G0_0_1_3_2 + 0.0201122334455674*G0_0_1_3_3 - 0.0099877077654859*G0_0_1_3_4 - 0.00153920153920161*G0_0_1_3_5 - 0.000188124632569087*G0_0_1_4_0 + 0.00427555983111553*G0_0_1_4_1 - 0.00855111966223107*G0_0_1_4_2 - 0.0099877077654859*G0_0_1_4_3 - 0.0124504302282084*G0_0_1_4_4 - 0.00865373309817785*G0_0_1_4_5 - 0.0290567046122612*G0_0_1_5_0 + 0.00395061728395077*G0_0_1_5_1 - 0.00153920153920161*G0_0_1_5_3 - 0.00865373309817785*G0_0_1_5_4 - 0.0194965528298869*G0_0_1_5_5 - 0.0896584896584928*G0_1_1_0_0 + 0.00628934851157095*G0_1_1_0_1 + 0.00325370103147893*G0_1_1_0_2 + 0.000718294051627436*G0_1_1_0_3 - 0.000188124632569085*G0_1_1_0_4 - 0.0290567046122612*G0_1_1_0_5 + 0.00628934851157095*G0_1_1_1_0 + 0.000949174282507701*G0_1_1_1_1 + 0.000671262893485141*G0_1_1_1_2 - 0.00230880230880237*G0_1_1_1_3 + 0.00427555983111554*G0_1_1_1_4 + 0.00395061728395078*G0_1_1_1_5 + 0.00325370103147893*G0_1_1_2_0 + 0.000671262893485141*G0_1_1_2_1 - 0.021164021164022*G0_1_1_2_2 + 0.000342044786489221*G0_1_1_2_3 - 0.00855111966223109*G0_1_1_2_4 + 0.000718294051627436*G0_1_1_3_0 - 0.00230880230880237*G0_1_1_3_1 + 0.000342044786489217*G0_1_1_3_2 + 0.0201122334455674*G0_1_1_3_3 - 0.00998770776548593*G0_1_1_3_4 - 0.00153920153920162*G0_1_1_3_5 - 0.000188124632569083*G0_1_1_4_0 + 0.00427555983111554*G0_1_1_4_1 - 0.00855111966223109*G0_1_1_4_2 - 0.00998770776548592*G0_1_1_4_3 - 0.0124504302282085*G0_1_1_4_4 - 0.00865373309817787*G0_1_1_4_5 - 0.0290567046122612*G0_1_1_5_0 + 0.00395061728395078*G0_1_1_5_1 - 0.00153920153920162*G0_1_1_5_3 - 0.00865373309817787*G0_1_1_5_4 - 0.0194965528298869*G0_1_1_5_5; + A[45] = A[5] - 0.00016247127358238*G0_0_0_0_1 + 0.000350595906151469*G0_0_0_0_2 - 0.000188124632569084*G0_0_0_0_3 - 0.00251402918069595*G0_0_0_0_4 + 0.00251402918069591*G0_0_0_0_5 - 0.00016247127358238*G0_0_0_1_0 + 0.013544973544974*G0_0_0_1_1 + 0.000641333974667328*G0_0_0_1_2 + 0.0184533162310946*G0_0_0_1_3 - 0.000838009726898648*G0_0_0_1_4 - 0.000598578376356168*G0_0_0_1_5 + 0.000350595906151469*G0_0_0_2_0 + 0.000641333974667327*G0_0_0_2_1 - 0.0315536315536326*G0_0_0_2_2 - 0.021206776762333*G0_0_0_2_3 + 0.000273635829191409*G0_0_0_2_4 + 0.0012655657100102*G0_0_0_2_5 - 0.000188124632569084*G0_0_0_3_0 + 0.0184533162310946*G0_0_0_3_1 - 0.021206776762333*G0_0_0_3_2 + 0.0222329111218007*G0_0_0_3_3 + 0.00205226871893546*G0_0_0_3_4 - 0.00215488215488223*G0_0_0_3_5 - 0.00251402918069595*G0_0_0_4_0 - 0.000838009726898648*G0_0_0_4_1 + 0.000273635829191409*G0_0_0_4_2 + 0.00205226871893546*G0_0_0_4_3 + 0.00978248089359237*G0_0_0_4_4 - 0.000855111966223111*G0_0_0_4_5 + 0.00251402918069591*G0_0_0_5_0 - 0.000598578376356168*G0_0_0_5_1 + 0.0012655657100102*G0_0_0_5_2 - 0.00215488215488223*G0_0_0_5_3 - 0.00085511196622311*G0_0_0_5_4 - 0.00807225696114614*G0_0_0_5_5 - 0.00061995617551174*G0_0_1_0_1 + 0.000619956175511743*G0_0_1_0_2 - 0.00412163967719538*G0_0_1_0_4 + 0.00412163967719534*G0_0_1_0_5 - 0.00061995617551174*G0_0_1_1_0 + 0.0109796376463046*G0_0_1_1_1 + 0.0221816044038273*G0_0_1_1_3 - 0.00157340601785052*G0_0_1_1_4 + 0.000619956175511743*G0_0_1_2_0 - 0.0109796376463046*G0_0_1_2_2 - 0.0221816044038273*G0_0_1_2_3 + 0.00157340601785052*G0_0_1_2_5 + 0.0221816044038273*G0_0_1_3_1 - 0.0221816044038273*G0_0_1_3_2 + 0.00314681203570105*G0_0_1_3_4 - 0.00314681203570103*G0_0_1_3_5 - 0.00412163967719539*G0_0_1_4_0 - 0.00157340601785052*G0_0_1_4_1 + 0.00314681203570105*G0_0_1_4_3 + 0.0064304419859978*G0_0_1_4_4 + 0.00412163967719534*G0_0_1_5_0 + 0.00157340601785052*G0_0_1_5_2 - 0.00314681203570103*G0_0_1_5_3 - 0.00643044198599772*G0_0_1_5_5 + 0.000106888995777901*G0_1_0_0_1 - 0.000106888995777875*G0_1_0_0_2 - 0.000906418684196524*G0_1_0_0_4 + 0.00090641868419645*G0_1_0_0_5 + 0.0001068889957779*G0_1_0_1_0 + 0.0341189674523019*G0_1_0_1_1 + 0.0174784885896003*G0_1_0_1_3 - 0.000530169419058327*G0_1_0_1_4 - 0.000803805248249693*G0_1_0_1_5 - 0.000106888995777876*G0_1_0_2_0 - 0.0341189674523021*G0_1_0_2_2 - 0.0174784885896003*G0_1_0_2_3 + 0.000803805248249689*G0_1_0_2_4 + 0.000530169419058322*G0_1_0_2_5 + 0.0174784885896003*G0_1_0_3_1 - 0.0174784885896003*G0_1_0_3_2 + 0.00106033883811665*G0_1_0_3_4 - 0.00106033883811665*G0_1_0_3_5 - 0.000906418684196525*G0_1_0_4_0 - 0.000530169419058327*G0_1_0_4_1 + 0.000803805248249689*G0_1_0_4_2 + 0.00106033883811665*G0_1_0_4_3 + 0.0114242958687407*G0_1_0_4_4 + 0.00090641868419645*G0_1_0_5_0 - 0.000803805248249693*G0_1_0_5_1 + 0.000530169419058322*G0_1_0_5_2 - 0.00106033883811665*G0_1_0_5_3 - 0.0114242958687407*G0_1_0_5_5 - 0.00035059590615146*G0_1_1_0_1 + 0.000162471273582392*G0_1_1_0_2 + 0.000188124632569071*G0_1_1_0_3 - 0.00251402918069596*G0_1_1_0_4 + 0.00251402918069589*G0_1_1_0_5 - 0.00035059590615146*G0_1_1_1_0 + 0.0315536315536325*G0_1_1_1_1 - 0.000641333974667317*G0_1_1_1_2 + 0.021206776762333*G0_1_1_1_3 - 0.0012655657100102*G0_1_1_1_4 - 0.000273635829191375*G0_1_1_1_5 + 0.000162471273582392*G0_1_1_2_0 - 0.000641333974667317*G0_1_1_2_1 - 0.0135449735449741*G0_1_1_2_2 - 0.0184533162310946*G0_1_1_2_3 + 0.000598578376356181*G0_1_1_2_4 + 0.000838009726898642*G0_1_1_2_5 + 0.000188124632569071*G0_1_1_3_0 + 0.021206776762333*G0_1_1_3_1 - 0.0184533162310946*G0_1_1_3_2 - 0.0222329111218008*G0_1_1_3_3 + 0.00215488215488225*G0_1_1_3_4 - 0.00205226871893545*G0_1_1_3_5 - 0.00251402918069596*G0_1_1_4_0 - 0.0012655657100102*G0_1_1_4_1 + 0.000598578376356181*G0_1_1_4_2 + 0.00215488215488225*G0_1_1_4_3 + 0.00807225696114613*G0_1_1_4_4 + 0.000855111966223106*G0_1_1_4_5 + 0.00251402918069589*G0_1_1_5_0 - 0.000273635829191375*G0_1_1_5_1 + 0.000838009726898642*G0_1_1_5_2 - 0.00205226871893545*G0_1_1_5_3 + 0.000855111966223107*G0_1_1_5_4 - 0.00978248089359234*G0_1_1_5_5; + A[165] = -A[45] - 0.0896584896584931*G0_0_0_0_0 + 0.00325370103147893*G0_0_0_0_1 + 0.00628934851157095*G0_0_0_0_2 + 0.000718294051627419*G0_0_0_0_3 - 0.0290567046122612*G0_0_0_0_4 - 0.000188124632569159*G0_0_0_0_5 + 0.00325370103147893*G0_0_0_1_0 - 0.0211640211640219*G0_0_0_1_1 + 0.000671262893485136*G0_0_0_1_2 + 0.000342044786489238*G0_0_0_1_3 - 0.00855111966223107*G0_0_0_1_5 + 0.00628934851157095*G0_0_0_2_0 + 0.000671262893485136*G0_0_0_2_1 + 0.000949174282507647*G0_0_0_2_2 - 0.00230880230880238*G0_0_0_2_3 + 0.00395061728395077*G0_0_0_2_4 + 0.00427555983111554*G0_0_0_2_5 + 0.00071829405162742*G0_0_0_3_0 + 0.000342044786489238*G0_0_0_3_1 - 0.00230880230880238*G0_0_0_3_2 + 0.0201122334455675*G0_0_0_3_3 - 0.00153920153920158*G0_0_0_3_4 - 0.00998770776548589*G0_0_0_3_5 - 0.0290567046122612*G0_0_0_4_0 + 0.00395061728395077*G0_0_0_4_2 - 0.00153920153920158*G0_0_0_4_3 - 0.0194965528298868*G0_0_0_4_4 - 0.00865373309817786*G0_0_0_4_5 - 0.000188124632569157*G0_0_0_5_0 - 0.00855111966223107*G0_0_0_5_1 + 0.00427555983111554*G0_0_0_5_2 - 0.00998770776548589*G0_0_0_5_3 - 0.00865373309817786*G0_0_0_5_4 - 0.0124504302282085*G0_0_0_5_5 - 0.089658489658493*G0_0_1_0_0 + 0.00325370103147892*G0_0_1_0_1 + 0.00628934851157095*G0_0_1_0_2 + 0.000718294051627416*G0_0_1_0_3 - 0.0290567046122612*G0_0_1_0_4 - 0.000188124632569169*G0_0_1_0_5 + 0.00325370103147892*G0_0_1_1_0 - 0.0211640211640219*G0_0_1_1_1 + 0.000671262893485135*G0_0_1_1_2 + 0.000342044786489236*G0_0_1_1_3 - 0.00855111966223105*G0_0_1_1_5 + 0.00628934851157095*G0_0_1_2_0 + 0.000671262893485134*G0_0_1_2_1 + 0.000949174282507696*G0_0_1_2_2 - 0.00230880230880237*G0_0_1_2_3 + 0.00395061728395077*G0_0_1_2_4 + 0.00427555983111554*G0_0_1_2_5 + 0.000718294051627416*G0_0_1_3_0 + 0.000342044786489238*G0_0_1_3_1 - 0.00230880230880237*G0_0_1_3_2 + 0.0201122334455675*G0_0_1_3_3 - 0.00153920153920158*G0_0_1_3_4 - 0.00998770776548587*G0_0_1_3_5 - 0.0290567046122612*G0_0_1_4_0 + 0.00395061728395077*G0_0_1_4_2 - 0.00153920153920158*G0_0_1_4_3 - 0.0194965528298868*G0_0_1_4_4 - 0.00865373309817786*G0_0_1_4_5 - 0.000188124632569169*G0_0_1_5_0 - 0.00855111966223105*G0_0_1_5_1 + 0.00427555983111554*G0_0_1_5_2 - 0.00998770776548587*G0_0_1_5_3 - 0.00865373309817786*G0_0_1_5_4 - 0.0124504302282084*G0_0_1_5_5; + A[75] = A[5] - 0.000457484901929361*G0_0_1_0_1 + 0.000269360269360267*G0_0_1_0_2 + 0.000188124632569074*G0_0_1_0_3 - 0.00160761049649944*G0_0_1_0_4 + 0.00160761049649944*G0_0_1_0_5 - 0.000457484901929361*G0_0_1_1_0 - 0.00256533589866935*G0_0_1_1_1 - 0.000641333974667337*G0_0_1_1_2 + 0.00372828817273273*G0_0_1_1_3 - 0.000735396290951873*G0_0_1_1_4 + 0.000530169419058324*G0_0_1_1_5 + 0.000269360269360267*G0_0_1_2_0 - 0.000641333974667337*G0_0_1_2_1 + 0.0205739939073281*G0_0_1_2_2 - 0.000974827641494298*G0_0_1_2_3 - 0.000205226871893502*G0_0_1_2_4 + 0.000307840307840321*G0_0_1_2_5 + 0.000188124632569074*G0_0_1_3_0 + 0.00372828817273273*G0_0_1_3_1 - 0.000974827641494298*G0_0_1_3_2 - 0.0222329111218007*G0_0_1_3_3 + 0.00109454331676559*G0_0_1_3_4 - 0.000991929880818796*G0_0_1_3_5 - 0.00160761049649944*G0_0_1_4_0 - 0.000735396290951873*G0_0_1_4_1 - 0.000205226871893502*G0_0_1_4_2 + 0.00109454331676559*G0_0_1_4_3 - 0.00335203890759456*G0_0_1_4_4 + 0.00085511196622311*G0_0_1_4_5 + 0.00160761049649944*G0_0_1_5_0 + 0.000530169419058325*G0_0_1_5_1 + 0.000307840307840321*G0_0_1_5_2 - 0.000991929880818796*G0_0_1_5_3 + 0.000855111966223109*G0_0_1_5_4 + 0.0016418149751484*G0_0_1_5_5 + 0.000457484901929362*G0_1_0_0_1 - 0.000269360269360267*G0_1_0_0_2 - 0.000188124632569075*G0_1_0_0_3 + 0.00160761049649944*G0_1_0_0_4 - 0.00160761049649944*G0_1_0_0_5 + 0.000457484901929361*G0_1_0_1_0 + 0.00256533589866935*G0_1_0_1_1 + 0.000641333974667338*G0_1_0_1_2 - 0.00372828817273273*G0_1_0_1_3 + 0.000735396290951873*G0_1_0_1_4 - 0.000530169419058325*G0_1_0_1_5 - 0.000269360269360267*G0_1_0_2_0 + 0.000641333974667338*G0_1_0_2_1 - 0.0205739939073281*G0_1_0_2_2 + 0.000974827641494301*G0_1_0_2_3 + 0.000205226871893503*G0_1_0_2_4 - 0.000307840307840321*G0_1_0_2_5 - 0.000188124632569075*G0_1_0_3_0 - 0.00372828817273273*G0_1_0_3_1 + 0.000974827641494301*G0_1_0_3_2 + 0.0222329111218007*G0_1_0_3_3 - 0.00109454331676559*G0_1_0_3_4 + 0.000991929880818796*G0_1_0_3_5 + 0.00160761049649944*G0_1_0_4_0 + 0.000735396290951873*G0_1_0_4_1 + 0.000205226871893502*G0_1_0_4_2 - 0.00109454331676559*G0_1_0_4_3 + 0.00335203890759456*G0_1_0_4_4 - 0.000855111966223109*G0_1_0_4_5 - 0.00160761049649944*G0_1_0_5_0 - 0.000530169419058325*G0_1_0_5_1 - 0.000307840307840321*G0_1_0_5_2 + 0.000991929880818796*G0_1_0_5_3 - 0.000855111966223109*G0_1_0_5_4 - 0.0016418149751484*G0_1_0_5_5; + A[120] = -A[75] - 0.0896584896584928*G0_1_0_0_0 + 0.00628934851157095*G0_1_0_0_1 + 0.00325370103147893*G0_1_0_0_2 + 0.000718294051627432*G0_1_0_0_3 - 0.000188124632569091*G0_1_0_0_4 - 0.0290567046122612*G0_1_0_0_5 + 0.00628934851157095*G0_1_0_1_0 + 0.000949174282507696*G0_1_0_1_1 + 0.000671262893485138*G0_1_0_1_2 - 0.00230880230880238*G0_1_0_1_3 + 0.00427555983111553*G0_1_0_1_4 + 0.00395061728395077*G0_1_0_1_5 + 0.00325370103147892*G0_1_0_2_0 + 0.000671262893485137*G0_1_0_2_1 - 0.0211640211640219*G0_1_0_2_2 + 0.000342044786489243*G0_1_0_2_3 - 0.00855111966223107*G0_1_0_2_4 + 0.000718294051627432*G0_1_0_3_0 - 0.00230880230880238*G0_1_0_3_1 + 0.000342044786489243*G0_1_0_3_2 + 0.0201122334455674*G0_1_0_3_3 - 0.0099877077654859*G0_1_0_3_4 - 0.00153920153920161*G0_1_0_3_5 - 0.000188124632569087*G0_1_0_4_0 + 0.00427555983111553*G0_1_0_4_1 - 0.00855111966223107*G0_1_0_4_2 - 0.0099877077654859*G0_1_0_4_3 - 0.0124504302282084*G0_1_0_4_4 - 0.00865373309817785*G0_1_0_4_5 - 0.0290567046122612*G0_1_0_5_0 + 0.00395061728395077*G0_1_0_5_1 - 0.00153920153920161*G0_1_0_5_3 - 0.00865373309817785*G0_1_0_5_4 - 0.0194965528298869*G0_1_0_5_5 - 0.0896584896584928*G0_1_1_0_0 + 0.00628934851157095*G0_1_1_0_1 + 0.00325370103147893*G0_1_1_0_2 + 0.000718294051627436*G0_1_1_0_3 - 0.000188124632569086*G0_1_1_0_4 - 0.0290567046122612*G0_1_1_0_5 + 0.00628934851157095*G0_1_1_1_0 + 0.000949174282507699*G0_1_1_1_1 + 0.000671262893485141*G0_1_1_1_2 - 0.00230880230880237*G0_1_1_1_3 + 0.00427555983111554*G0_1_1_1_4 + 0.00395061728395078*G0_1_1_1_5 + 0.00325370103147893*G0_1_1_2_0 + 0.000671262893485141*G0_1_1_2_1 - 0.021164021164022*G0_1_1_2_2 + 0.000342044786489221*G0_1_1_2_3 - 0.00855111966223109*G0_1_1_2_4 + 0.000718294051627436*G0_1_1_3_0 - 0.00230880230880237*G0_1_1_3_1 + 0.000342044786489217*G0_1_1_3_2 + 0.0201122334455674*G0_1_1_3_3 - 0.00998770776548592*G0_1_1_3_4 - 0.00153920153920162*G0_1_1_3_5 - 0.000188124632569083*G0_1_1_4_0 + 0.00427555983111554*G0_1_1_4_1 - 0.00855111966223109*G0_1_1_4_2 - 0.00998770776548592*G0_1_1_4_3 - 0.0124504302282085*G0_1_1_4_4 - 0.00865373309817787*G0_1_1_4_5 - 0.0290567046122612*G0_1_1_5_0 + 0.00395061728395078*G0_1_1_5_1 - 0.00153920153920162*G0_1_1_5_3 - 0.00865373309817787*G0_1_1_5_4 - 0.0194965528298869*G0_1_1_5_5; + A[24] = -A[20] - 0.0365047298380645*G0_0_0_0_0 + 0.00251830474052705*G0_0_0_0_1 + 0.00606701940035294*G0_0_0_0_2 - 0.000478862701084933*G0_0_0_0_3 - 0.0125359414248307*G0_0_0_0_4 - 0.00788413232857705*G0_0_0_0_5 + 0.00251830474052705*G0_0_0_1_0 - 0.0770883437550131*G0_0_0_1_1 + 0.00482710704932944*G0_0_0_1_2 - 0.0251402918069593*G0_0_0_1_3 + 0.00124846347068574*G0_0_0_1_4 + 0.00051306717973381*G0_0_0_1_5 + 0.00606701940035294*G0_0_0_2_0 + 0.00482710704932943*G0_0_0_2_1 - 0.0375308641975321*G0_0_0_2_2 + 0.00535300090855664*G0_0_0_2_3 - 0.0104836727058953*G0_0_0_2_4 + 0.00270215381326502*G0_0_0_2_5 - 0.000478862701084932*G0_0_0_3_0 - 0.0251402918069593*G0_0_0_3_1 + 0.00535300090855664*G0_0_0_3_2 - 0.00478862701084938*G0_0_0_3_3 - 0.00153920153920159*G0_0_0_3_4 - 0.00444658222436018*G0_0_0_3_5 - 0.0125359414248307*G0_0_0_4_0 + 0.00124846347068574*G0_0_0_4_1 - 0.0104836727058953*G0_0_0_4_2 - 0.00153920153920159*G0_0_0_4_3 - 0.0348201592646048*G0_0_0_4_4 - 0.00790123456790151*G0_0_0_4_5 - 0.00788413232857705*G0_0_0_5_0 + 0.000513067179733808*G0_0_0_5_1 + 0.00270215381326502*G0_0_0_5_2 - 0.00444658222436018*G0_0_0_5_3 - 0.00790123456790151*G0_0_0_5_4 - 0.00273635829191399*G0_0_0_5_5 + 0.00102613435946772*G0_0_1_0_0 - 0.00230880230880243*G0_0_1_0_1 - 0.00318101651434996*G0_0_1_0_3 - 0.00205226871893546*G0_0_1_0_4 - 0.0132371332371337*G0_0_1_0_5 - 0.00230880230880243*G0_0_1_1_0 + 0.00230880230880237*G0_0_1_1_2 - 0.0256533589866931*G0_0_1_1_3 + 0.0256533589866934*G0_0_1_1_5 + 0.00230880230880237*G0_0_1_2_1 - 0.00102613435946776*G0_0_1_2_2 + 0.0132371332371337*G0_0_1_2_3 + 0.00205226871893545*G0_0_1_2_4 + 0.00318101651434996*G0_0_1_2_5 - 0.00318101651434996*G0_0_1_3_0 - 0.0256533589866931*G0_0_1_3_1 + 0.0132371332371337*G0_0_1_3_2 - 0.00205226871893548*G0_0_1_3_3 + 0.0063620330286999*G0_0_1_3_4 - 0.00205226871893546*G0_0_1_4_0 + 0.00205226871893545*G0_0_1_4_2 + 0.0063620330286999*G0_0_1_4_3 - 0.00636203302869993*G0_0_1_4_5 - 0.0132371332371337*G0_0_1_5_0 + 0.0256533589866934*G0_0_1_5_1 + 0.00318101651434996*G0_0_1_5_2 - 0.00636203302869993*G0_0_1_5_4 + 0.00205226871893551*G0_0_1_5_5; + A[3] = A[45] + 0.00026936026936028*G0_0_1_0_1 - 0.000457484901929352*G0_0_1_0_2 + 0.00018812463256908*G0_0_1_0_3 + 0.00160761049649942*G0_0_1_0_4 - 0.00160761049649945*G0_0_1_0_5 + 0.00026936026936028*G0_0_1_1_0 + 0.020573993907328*G0_0_1_1_1 - 0.000641333974667333*G0_0_1_1_2 - 0.000974827641494308*G0_0_1_1_3 + 0.00030784030784032*G0_0_1_1_4 - 0.000205226871893524*G0_0_1_1_5 - 0.000457484901929352*G0_0_1_2_0 - 0.000641333974667333*G0_0_1_2_1 - 0.00256533589866938*G0_0_1_2_2 + 0.00372828817273272*G0_0_1_2_3 + 0.000530169419058309*G0_0_1_2_4 - 0.000735396290951873*G0_0_1_2_5 + 0.000188124632569079*G0_0_1_3_0 - 0.000974827641494308*G0_0_1_3_1 + 0.00372828817273272*G0_0_1_3_2 - 0.0222329111218008*G0_0_1_3_3 - 0.000991929880818811*G0_0_1_3_4 + 0.00109454331676558*G0_0_1_3_5 + 0.00160761049649942*G0_0_1_4_0 + 0.00030784030784032*G0_0_1_4_1 + 0.000530169419058309*G0_0_1_4_2 - 0.000991929880818811*G0_0_1_4_3 + 0.00164181497514832*G0_0_1_4_4 + 0.000855111966223102*G0_0_1_4_5 - 0.00160761049649945*G0_0_1_5_0 - 0.000205226871893523*G0_0_1_5_1 - 0.000735396290951872*G0_0_1_5_2 + 0.00109454331676558*G0_0_1_5_3 + 0.000855111966223102*G0_0_1_5_4 - 0.0033520389075946*G0_0_1_5_5 - 0.00026936026936028*G0_1_0_0_1 + 0.000457484901929352*G0_1_0_0_2 - 0.00018812463256908*G0_1_0_0_3 - 0.00160761049649942*G0_1_0_0_4 + 0.00160761049649945*G0_1_0_0_5 - 0.00026936026936028*G0_1_0_1_0 - 0.020573993907328*G0_1_0_1_1 + 0.000641333974667333*G0_1_0_1_2 + 0.000974827641494308*G0_1_0_1_3 - 0.00030784030784032*G0_1_0_1_4 + 0.000205226871893524*G0_1_0_1_5 + 0.000457484901929352*G0_1_0_2_0 + 0.000641333974667333*G0_1_0_2_1 + 0.00256533589866938*G0_1_0_2_2 - 0.00372828817273272*G0_1_0_2_3 - 0.00053016941905831*G0_1_0_2_4 + 0.000735396290951872*G0_1_0_2_5 - 0.00018812463256908*G0_1_0_3_0 + 0.000974827641494312*G0_1_0_3_1 - 0.00372828817273272*G0_1_0_3_2 + 0.0222329111218008*G0_1_0_3_3 + 0.000991929880818811*G0_1_0_3_4 - 0.00109454331676558*G0_1_0_3_5 - 0.00160761049649942*G0_1_0_4_0 - 0.00030784030784032*G0_1_0_4_1 - 0.000530169419058309*G0_1_0_4_2 + 0.000991929880818811*G0_1_0_4_3 - 0.00164181497514832*G0_1_0_4_4 - 0.000855111966223101*G0_1_0_4_5 + 0.00160761049649945*G0_1_0_5_0 + 0.000205226871893524*G0_1_0_5_1 + 0.000735396290951872*G0_1_0_5_2 - 0.00109454331676558*G0_1_0_5_3 - 0.000855111966223101*G0_1_0_5_4 + 0.0033520389075946*G0_1_0_5_5; + A[11] = -A[3] - 0.0896584896584931*G0_0_0_0_0 + 0.00325370103147893*G0_0_0_0_1 + 0.00628934851157095*G0_0_0_0_2 + 0.000718294051627419*G0_0_0_0_3 - 0.0290567046122612*G0_0_0_0_4 - 0.00018812463256916*G0_0_0_0_5 + 0.00325370103147893*G0_0_0_1_0 - 0.0211640211640219*G0_0_0_1_1 + 0.000671262893485136*G0_0_0_1_2 + 0.000342044786489238*G0_0_0_1_3 - 0.00855111966223107*G0_0_0_1_5 + 0.00628934851157095*G0_0_0_2_0 + 0.000671262893485136*G0_0_0_2_1 + 0.000949174282507645*G0_0_0_2_2 - 0.00230880230880238*G0_0_0_2_3 + 0.00395061728395077*G0_0_0_2_4 + 0.00427555983111554*G0_0_0_2_5 + 0.000718294051627419*G0_0_0_3_0 + 0.000342044786489238*G0_0_0_3_1 - 0.00230880230880238*G0_0_0_3_2 + 0.0201122334455675*G0_0_0_3_3 - 0.00153920153920158*G0_0_0_3_4 - 0.00998770776548589*G0_0_0_3_5 - 0.0290567046122612*G0_0_0_4_0 + 0.00395061728395077*G0_0_0_4_2 - 0.00153920153920158*G0_0_0_4_3 - 0.0194965528298868*G0_0_0_4_4 - 0.00865373309817786*G0_0_0_4_5 - 0.00018812463256916*G0_0_0_5_0 - 0.00855111966223107*G0_0_0_5_1 + 0.00427555983111554*G0_0_0_5_2 - 0.00998770776548589*G0_0_0_5_3 - 0.00865373309817786*G0_0_0_5_4 - 0.0124504302282085*G0_0_0_5_5 - 0.089658489658493*G0_1_0_0_0 + 0.00325370103147892*G0_1_0_0_1 + 0.00628934851157095*G0_1_0_0_2 + 0.000718294051627416*G0_1_0_0_3 - 0.0290567046122612*G0_1_0_0_4 - 0.000188124632569169*G0_1_0_0_5 + 0.00325370103147892*G0_1_0_1_0 - 0.0211640211640219*G0_1_0_1_1 + 0.000671262893485134*G0_1_0_1_2 + 0.00034204478648924*G0_1_0_1_3 - 0.00855111966223105*G0_1_0_1_5 + 0.00628934851157095*G0_1_0_2_0 + 0.000671262893485134*G0_1_0_2_1 + 0.000949174282507696*G0_1_0_2_2 - 0.00230880230880238*G0_1_0_2_3 + 0.00395061728395077*G0_1_0_2_4 + 0.00427555983111554*G0_1_0_2_5 + 0.000718294051627416*G0_1_0_3_0 + 0.000342044786489243*G0_1_0_3_1 - 0.00230880230880237*G0_1_0_3_2 + 0.0201122334455675*G0_1_0_3_3 - 0.00153920153920158*G0_1_0_3_4 - 0.00998770776548587*G0_1_0_3_5 - 0.0290567046122612*G0_1_0_4_0 + 0.00395061728395077*G0_1_0_4_2 - 0.00153920153920158*G0_1_0_4_3 - 0.0194965528298868*G0_1_0_4_4 - 0.00865373309817786*G0_1_0_4_5 - 0.000188124632569169*G0_1_0_5_0 - 0.00855111966223105*G0_1_0_5_1 + 0.00427555983111554*G0_1_0_5_2 - 0.00998770776548587*G0_1_0_5_3 - 0.00865373309817786*G0_1_0_5_4 - 0.0124504302282084*G0_1_0_5_5; + A[128] = -A[125] - 0.00656725990059345*G0_0_1_0_0 - 0.00348885682219028*G0_0_1_0_1 + 0.0164181497514836*G0_0_1_0_3 + 0.0246272246272255*G0_0_1_0_4 + 0.00287317620650964*G0_0_1_0_5 - 0.00348885682219028*G0_0_1_1_0 - 0.00656725990059338*G0_0_1_1_1 + 0.0246272246272255*G0_0_1_1_3 + 0.0164181497514837*G0_0_1_1_4 + 0.00287317620650969*G0_0_1_1_5 + 0.363251563251574*G0_0_1_2_2 - 0.00820907487574193*G0_0_1_2_3 - 0.00820907487574203*G0_0_1_2_4 - 0.00820907487574179*G0_0_1_2_5 + 0.0164181497514836*G0_0_1_3_0 + 0.0246272246272255*G0_0_1_3_1 - 0.00820907487574193*G0_0_1_3_2 - 0.131345198011869*G0_0_1_3_3 - 0.0656725990059346*G0_0_1_3_4 - 0.0164181497514836*G0_0_1_3_5 + 0.0246272246272255*G0_0_1_4_0 + 0.0164181497514837*G0_0_1_4_1 - 0.00820907487574202*G0_0_1_4_2 - 0.0656725990059346*G0_0_1_4_3 - 0.131345198011869*G0_0_1_4_4 - 0.0164181497514836*G0_0_1_4_5 + 0.00287317620650963*G0_0_1_5_0 + 0.00287317620650969*G0_0_1_5_1 - 0.00820907487574179*G0_0_1_5_2 - 0.0164181497514836*G0_0_1_5_3 - 0.0164181497514836*G0_0_1_5_4 - 0.00985088985088991*G0_0_1_5_5 + 0.0948148148148181*G0_1_1_0_0 - 0.00807225696114616*G0_1_1_0_1 - 0.0242851798407362*G0_1_1_0_2 - 0.0187440542996105*G0_1_1_0_3 - 0.0250376783710126*G0_1_1_0_4 + 0.0377617444284125*G0_1_1_0_5 - 0.00807225696114616*G0_1_1_1_0 + 0.0155972422639097*G0_1_1_1_1 - 0.0116295227406342*G0_1_1_1_2 - 0.0105349794238686*G0_1_1_1_3 - 0.0373512906846253*G0_1_1_1_4 - 0.0157340601785051*G0_1_1_1_5 - 0.0242851798407362*G0_1_1_2_0 - 0.0116295227406342*G0_1_1_2_1 + 0.363251563251575*G0_1_1_2_2 + 0.0383090160867951*G0_1_1_2_3 + 0.0848271070493323*G0_1_1_2_4 - 0.0102613435946772*G0_1_1_2_5 - 0.0187440542996105*G0_1_1_3_0 - 0.0105349794238686*G0_1_1_3_1 + 0.0383090160867951*G0_1_1_3_2 + 0.0465180909625368*G0_1_1_3_3 + 0.112190689968472*G0_1_1_3_4 + 0.0580107957885755*G0_1_1_3_5 - 0.0250376783710126*G0_1_1_4_0 - 0.0373512906846253*G0_1_1_4_1 + 0.0848271070493323*G0_1_1_4_2 + 0.112190689968472*G0_1_1_4_3 + 0.40224466891135*G0_1_1_4_4 + 0.0952252685586052*G0_1_1_4_5 + 0.0377617444284125*G0_1_1_5_0 - 0.0157340601785051*G0_1_1_5_1 - 0.0102613435946772*G0_1_1_5_2 + 0.0580107957885755*G0_1_1_5_3 + 0.0952252685586052*G0_1_1_5_4 + 0.24134680134681*G0_1_1_5_5; + A[176] = A[128] + 0.0742921276254637*G0_0_0_0_0 - 0.0357778846667747*G0_0_0_0_1 + 0.0552060285393636*G0_0_0_0_2 + 0.00930361819250734*G0_0_0_0_3 + 0.0766180321735903*G0_0_0_0_4 - 0.0125872481428041*G0_0_0_0_5 - 0.0357778846667747*G0_0_0_1_0 + 0.524149430816116*G0_0_0_1_1 + 0.02702153813265*G0_0_0_1_2 + 0.188808722142062*G0_0_0_1_3 + 0.0218908663353114*G0_0_0_1_4 + 0.109180695847367*G0_0_0_1_5 + 0.0552060285393636*G0_0_0_2_0 + 0.02702153813265*G0_0_0_2_1 - 0.863184223184251*G0_0_0_2_2 - 0.287591256480155*G0_0_0_2_3 - 0.275551279995734*G0_0_0_2_4 - 0.0465180909625372*G0_0_0_2_5 + 0.00930361819250734*G0_0_0_3_0 + 0.188808722142062*G0_0_0_3_1 - 0.287591256480155*G0_0_0_3_2 - 0.0580107957885757*G0_0_0_3_3 - 0.0623889690556378*G0_0_0_3_4 + 0.0744289455400593*G0_0_0_3_5 + 0.0766180321735903*G0_0_0_4_0 + 0.0218908663353114*G0_0_0_4_1 - 0.275551279995734*G0_0_0_4_2 - 0.0623889690556378*G0_0_0_4_3 - 0.0536326225215133*G0_0_0_4_4 + 0.0492544492544509*G0_0_0_4_5 - 0.0125872481428041*G0_0_0_5_0 + 0.109180695847367*G0_0_0_5_1 - 0.0465180909625372*G0_0_0_5_2 + 0.0744289455400593*G0_0_0_5_3 + 0.0492544492544509*G0_0_0_5_4 + 0.322890278445846*G0_0_0_5_5 - 0.0233274544385664*G0_0_1_0_1 + 0.0233274544385663*G0_0_1_0_2 - 0.00629362407140212*G0_0_1_0_4 + 0.00629362407140198*G0_0_1_0_5 - 0.0233274544385664*G0_0_1_1_0 + 0.614038800705489*G0_0_1_1_1 + 0.19140826251938*G0_0_1_1_3 + 0.00629362407140201*G0_0_1_1_4 + 0.0807225696114619*G0_0_1_1_5 + 0.0233274544385663*G0_0_1_2_0 - 0.614038800705487*G0_0_1_2_2 - 0.19140826251938*G0_0_1_2_3 - 0.080722569611461*G0_0_1_2_4 - 0.0062936240714022*G0_0_1_2_5 + 0.19140826251938*G0_0_1_3_1 - 0.19140826251938*G0_0_1_3_2 - 0.0125872481428041*G0_0_1_3_4 + 0.0125872481428043*G0_0_1_3_5 - 0.00629362407140212*G0_0_1_4_0 + 0.00629362407140201*G0_0_1_4_1 - 0.0807225696114611*G0_0_1_4_2 - 0.0125872481428041*G0_0_1_4_3 + 0.0481599059376855*G0_0_1_4_4 + 0.00629362407140199*G0_0_1_5_0 + 0.0807225696114619*G0_0_1_5_1 - 0.0062936240714022*G0_0_1_5_2 + 0.0125872481428043*G0_0_1_5_3 - 0.0481599059376853*G0_0_1_5_5 - 0.0233274544385664*G0_1_0_0_1 + 0.0233274544385663*G0_1_0_0_2 - 0.00629362407140212*G0_1_0_0_4 + 0.00629362407140198*G0_1_0_0_5 - 0.0233274544385664*G0_1_0_1_0 + 0.614038800705489*G0_1_0_1_1 + 0.19140826251938*G0_1_0_1_3 + 0.00629362407140201*G0_1_0_1_4 + 0.0807225696114619*G0_1_0_1_5 + 0.0233274544385663*G0_1_0_2_0 - 0.614038800705487*G0_1_0_2_2 - 0.19140826251938*G0_1_0_2_3 - 0.080722569611461*G0_1_0_2_4 - 0.0062936240714022*G0_1_0_2_5 + 0.19140826251938*G0_1_0_3_1 - 0.19140826251938*G0_1_0_3_2 - 0.0125872481428041*G0_1_0_3_4 + 0.0125872481428043*G0_1_0_3_5 - 0.00629362407140212*G0_1_0_4_0 + 0.00629362407140201*G0_1_0_4_1 - 0.0807225696114611*G0_1_0_4_2 - 0.0125872481428041*G0_1_0_4_3 + 0.0481599059376855*G0_1_0_4_4 + 0.00629362407140199*G0_1_0_5_0 + 0.0807225696114619*G0_1_0_5_1 - 0.0062936240714022*G0_1_0_5_2 + 0.0125872481428043*G0_1_0_5_3 - 0.0481599059376853*G0_1_0_5_5 - 0.0742921276254636*G0_1_1_0_0 - 0.0552060285393638*G0_1_1_0_1 + 0.0357778846667747*G0_1_1_0_2 - 0.00930361819250741*G0_1_1_0_3 + 0.0125872481428042*G0_1_1_0_4 - 0.0766180321735905*G0_1_1_0_5 - 0.0552060285393638*G0_1_1_1_0 + 0.863184223184254*G0_1_1_1_1 - 0.0270215381326503*G0_1_1_1_2 + 0.287591256480155*G0_1_1_1_3 + 0.0465180909625369*G0_1_1_1_4 + 0.275551279995735*G0_1_1_1_5 + 0.0357778846667747*G0_1_1_2_0 - 0.0270215381326503*G0_1_1_2_1 - 0.524149430816114*G0_1_1_2_2 - 0.188808722142062*G0_1_1_2_3 - 0.109180695847366*G0_1_1_2_4 - 0.0218908663353117*G0_1_1_2_5 - 0.00930361819250742*G0_1_1_3_0 + 0.287591256480155*G0_1_1_3_1 - 0.188808722142062*G0_1_1_3_2 + 0.0580107957885755*G0_1_1_3_3 - 0.0744289455400592*G0_1_1_3_4 + 0.0623889690556381*G0_1_1_3_5 + 0.0125872481428042*G0_1_1_4_0 + 0.0465180909625369*G0_1_1_4_1 - 0.109180695847366*G0_1_1_4_2 - 0.0744289455400592*G0_1_1_4_3 - 0.322890278445846*G0_1_1_4_4 - 0.049254449254451*G0_1_1_4_5 - 0.0766180321735905*G0_1_1_5_0 + 0.275551279995735*G0_1_1_5_1 - 0.0218908663353117*G0_1_1_5_2 + 0.0623889690556381*G0_1_1_5_3 - 0.049254449254451*G0_1_1_5_4 + 0.0536326225215137*G0_1_1_5_5; + A[56] = -A[176] + 0.0948148148148183*G0_0_0_0_0 - 0.0242851798407362*G0_0_0_0_1 - 0.00807225696114613*G0_0_0_0_2 - 0.0187440542996105*G0_0_0_0_3 + 0.0377617444284124*G0_0_0_0_4 - 0.0250376783710125*G0_0_0_0_5 - 0.0242851798407362*G0_0_0_1_0 + 0.363251563251577*G0_0_0_1_1 - 0.0116295227406343*G0_0_0_1_2 + 0.0383090160867953*G0_0_0_1_3 - 0.0102613435946773*G0_0_0_1_4 + 0.0848271070493326*G0_0_0_1_5 - 0.00807225696114613*G0_0_0_2_0 - 0.0116295227406343*G0_0_0_2_1 + 0.0155972422639094*G0_0_0_2_2 - 0.0105349794238686*G0_0_0_2_3 - 0.0157340601785051*G0_0_0_2_4 - 0.0373512906846253*G0_0_0_2_5 - 0.0187440542996105*G0_0_0_3_0 + 0.0383090160867953*G0_0_0_3_1 - 0.0105349794238687*G0_0_0_3_2 + 0.046518090962537*G0_0_0_3_3 + 0.0580107957885755*G0_0_0_3_4 + 0.112190689968472*G0_0_0_3_5 + 0.0377617444284124*G0_0_0_4_0 - 0.0102613435946773*G0_0_0_4_1 - 0.0157340601785051*G0_0_0_4_2 + 0.0580107957885755*G0_0_0_4_3 + 0.241346801346809*G0_0_0_4_4 + 0.0952252685586051*G0_0_0_4_5 - 0.0250376783710125*G0_0_0_5_0 + 0.0848271070493326*G0_0_0_5_1 - 0.0373512906846253*G0_0_0_5_2 + 0.112190689968472*G0_0_0_5_3 + 0.0952252685586051*G0_0_0_5_4 + 0.40224466891135*G0_0_0_5_5 - 0.00656725990059353*G0_0_1_0_0 - 0.00348885682219026*G0_0_1_0_2 + 0.0164181497514836*G0_0_1_0_3 + 0.0028731762065096*G0_0_1_0_4 + 0.0246272246272254*G0_0_1_0_5 + 0.363251563251577*G0_0_1_1_1 - 0.00820907487574174*G0_0_1_1_3 - 0.00820907487574184*G0_0_1_1_4 - 0.00820907487574124*G0_0_1_1_5 - 0.00348885682219026*G0_0_1_2_0 - 0.00656725990059344*G0_0_1_2_2 + 0.0246272246272255*G0_0_1_2_3 + 0.00287317620650966*G0_0_1_2_4 + 0.0164181497514836*G0_0_1_2_5 + 0.0164181497514836*G0_0_1_3_0 - 0.00820907487574174*G0_0_1_3_1 + 0.0246272246272255*G0_0_1_3_2 - 0.131345198011869*G0_0_1_3_3 - 0.0164181497514837*G0_0_1_3_4 - 0.0656725990059345*G0_0_1_3_5 + 0.0028731762065096*G0_0_1_4_0 - 0.00820907487574184*G0_0_1_4_1 + 0.00287317620650966*G0_0_1_4_2 - 0.0164181497514837*G0_0_1_4_3 - 0.00985088985089013*G0_0_1_4_4 - 0.0164181497514837*G0_0_1_4_5 + 0.0246272246272254*G0_0_1_5_0 - 0.00820907487574124*G0_0_1_5_1 + 0.0164181497514836*G0_0_1_5_2 - 0.0656725990059345*G0_0_1_5_3 - 0.0164181497514837*G0_0_1_5_4 - 0.131345198011869*G0_0_1_5_5; + A[168] = A[56] + 0.00656725990059347*G0_0_1_0_0 + 0.00348885682219026*G0_0_1_0_2 - 0.0164181497514836*G0_0_1_0_3 - 0.0028731762065096*G0_0_1_0_4 - 0.0246272246272253*G0_0_1_0_5 - 0.363251563251577*G0_0_1_1_1 + 0.00820907487574174*G0_0_1_1_3 + 0.00820907487574184*G0_0_1_1_4 + 0.00820907487574121*G0_0_1_1_5 + 0.00348885682219026*G0_0_1_2_0 + 0.00656725990059344*G0_0_1_2_2 - 0.0246272246272255*G0_0_1_2_3 - 0.00287317620650966*G0_0_1_2_4 - 0.0164181497514836*G0_0_1_2_5 - 0.0164181497514836*G0_0_1_3_0 + 0.00820907487574174*G0_0_1_3_1 - 0.0246272246272255*G0_0_1_3_2 + 0.131345198011869*G0_0_1_3_3 + 0.0164181497514837*G0_0_1_3_4 + 0.0656725990059345*G0_0_1_3_5 - 0.0028731762065096*G0_0_1_4_0 + 0.00820907487574184*G0_0_1_4_1 - 0.00287317620650966*G0_0_1_4_2 + 0.0164181497514837*G0_0_1_4_3 + 0.00985088985089018*G0_0_1_4_4 + 0.0164181497514836*G0_0_1_4_5 - 0.0246272246272253*G0_0_1_5_0 + 0.0082090748757412*G0_0_1_5_1 - 0.0164181497514836*G0_0_1_5_2 + 0.0656725990059345*G0_0_1_5_3 + 0.0164181497514836*G0_0_1_5_4 + 0.131345198011869*G0_0_1_5_5 - 0.00656725990059347*G0_1_0_0_0 - 0.00348885682219026*G0_1_0_0_2 + 0.0164181497514836*G0_1_0_0_3 + 0.0028731762065096*G0_1_0_0_4 + 0.0246272246272253*G0_1_0_0_5 + 0.363251563251577*G0_1_0_1_1 - 0.00820907487574171*G0_1_0_1_3 - 0.00820907487574184*G0_1_0_1_4 - 0.00820907487574121*G0_1_0_1_5 - 0.00348885682219026*G0_1_0_2_0 - 0.00656725990059344*G0_1_0_2_2 + 0.0246272246272255*G0_1_0_2_3 + 0.00287317620650966*G0_1_0_2_4 + 0.0164181497514836*G0_1_0_2_5 + 0.0164181497514836*G0_1_0_3_0 - 0.00820907487574177*G0_1_0_3_1 + 0.0246272246272255*G0_1_0_3_2 - 0.131345198011869*G0_1_0_3_3 - 0.0164181497514837*G0_1_0_3_4 - 0.0656725990059345*G0_1_0_3_5 + 0.0028731762065096*G0_1_0_4_0 - 0.00820907487574184*G0_1_0_4_1 + 0.00287317620650966*G0_1_0_4_2 - 0.0164181497514837*G0_1_0_4_3 - 0.00985088985089018*G0_1_0_4_4 - 0.0164181497514836*G0_1_0_4_5 + 0.0246272246272253*G0_1_0_5_0 - 0.00820907487574121*G0_1_0_5_1 + 0.0164181497514836*G0_1_0_5_2 - 0.0656725990059345*G0_1_0_5_3 - 0.0164181497514836*G0_1_0_5_4 - 0.131345198011869*G0_1_0_5_5; + A[48] = -A[56] + 0.0221645021645029*G0_0_0_0_0 - 0.0116295227406342*G0_0_0_0_1 - 0.00458340013895583*G0_0_0_0_2 - 0.0537694404361088*G0_0_0_0_3 - 0.0186072363850147*G0_0_0_0_4 - 0.035162204051094*G0_0_0_0_5 - 0.0116295227406342*G0_0_0_1_0 - 0.0242851798407363*G0_0_0_1_2 + 0.0930361819250743*G0_0_0_1_3 - 0.00205226871893543*G0_0_0_1_4 + 0.046518090962537*G0_0_0_1_5 - 0.00458340013895583*G0_0_0_2_0 - 0.0242851798407363*G0_0_0_2_1 + 0.101382074715411*G0_0_0_2_2 - 0.0496649029982382*G0_0_0_2_3 + 0.0348885682219027*G0_0_0_2_4 - 0.0351622040510941*G0_0_0_2_5 - 0.0537694404361088*G0_0_0_3_0 + 0.0930361819250743*G0_0_0_3_1 - 0.0496649029982382*G0_0_0_3_2 + 0.53358986692322*G0_0_0_3_3 + 0.111643418310089*G0_0_0_3_4 + 0.177863288974406*G0_0_0_3_5 - 0.0186072363850147*G0_0_0_4_0 - 0.00205226871893543*G0_0_0_4_1 + 0.0348885682219027*G0_0_0_4_2 + 0.111643418310089*G0_0_0_4_3 + 0.251197691197699*G0_0_0_4_4 + 0.0744289455400592*G0_0_0_4_5 - 0.0351622040510941*G0_0_0_5_0 + 0.046518090962537*G0_0_0_5_1 - 0.0351622040510941*G0_0_0_5_2 + 0.177863288974406*G0_0_0_5_3 + 0.0744289455400592*G0_0_0_5_4 + 0.177863288974406*G0_0_0_5_5 + 0.00656725990059347*G0_1_0_0_0 + 0.00348885682219026*G0_1_0_0_2 - 0.0164181497514836*G0_1_0_0_3 - 0.0028731762065096*G0_1_0_0_4 - 0.0246272246272253*G0_1_0_0_5 - 0.363251563251577*G0_1_0_1_1 + 0.00820907487574171*G0_1_0_1_3 + 0.00820907487574184*G0_1_0_1_4 + 0.0082090748757412*G0_1_0_1_5 + 0.00348885682219026*G0_1_0_2_0 + 0.00656725990059339*G0_1_0_2_2 - 0.0246272246272255*G0_1_0_2_3 - 0.00287317620650966*G0_1_0_2_4 - 0.0164181497514836*G0_1_0_2_5 - 0.0164181497514836*G0_1_0_3_0 + 0.00820907487574174*G0_1_0_3_1 - 0.0246272246272255*G0_1_0_3_2 + 0.131345198011869*G0_1_0_3_3 + 0.0164181497514837*G0_1_0_3_4 + 0.0656725990059345*G0_1_0_3_5 - 0.0028731762065096*G0_1_0_4_0 + 0.00820907487574184*G0_1_0_4_1 - 0.00287317620650966*G0_1_0_4_2 + 0.0164181497514837*G0_1_0_4_3 + 0.00985088985089024*G0_1_0_4_4 + 0.0164181497514836*G0_1_0_4_5 - 0.0246272246272253*G0_1_0_5_0 + 0.0082090748757412*G0_1_0_5_1 - 0.0164181497514836*G0_1_0_5_2 + 0.0656725990059345*G0_1_0_5_3 + 0.0164181497514836*G0_1_0_5_4 + 0.131345198011869*G0_1_0_5_5; + A[63] = -A[71] - 0.00502805836139182*G0_0_0_0_0 - 0.0014365881032548*G0_0_0_0_1 + 0.0199583132916472*G0_0_0_0_2 + 0.0126214526214531*G0_0_0_0_3 + 0.0348885682219026*G0_0_0_0_4 + 0.0163155363155368*G0_0_0_0_5 - 0.0014365881032548*G0_0_0_1_0 + 0.00820907487574159*G0_0_0_1_1 + 0.0126727593394264*G0_0_0_1_2 + 0.0287317620650963*G0_0_0_1_3 + 0.0156998556998562*G0_0_0_1_4 - 0.0102613435946772*G0_0_0_1_5 + 0.0199583132916472*G0_0_0_2_0 + 0.0126727593394264*G0_0_0_2_1 - 0.182036235369575*G0_0_0_2_2 - 0.066801346801349*G0_0_0_2_3 - 0.0990219656886356*G0_0_0_2_4 + 0.000307840307840296*G0_0_0_2_5 + 0.0126214526214531*G0_0_0_3_0 + 0.0287317620650963*G0_0_0_3_1 - 0.066801346801349*G0_0_0_3_2 + 0.062799422799425*G0_0_0_3_3 - 0.0566426166426185*G0_0_0_3_4 - 0.0258585858585868*G0_0_0_3_5 + 0.0348885682219026*G0_0_0_4_0 + 0.0156998556998562*G0_0_0_4_1 - 0.0990219656886356*G0_0_0_4_2 - 0.0566426166426185*G0_0_0_4_3 - 0.237652717652725*G0_0_0_4_4 - 0.0320153920153931*G0_0_0_4_5 + 0.0163155363155368*G0_0_0_5_0 - 0.0102613435946772*G0_0_0_5_1 + 0.000307840307840296*G0_0_0_5_2 - 0.0258585858585868*G0_0_0_5_3 - 0.0320153920153931*G0_0_0_5_4 - 0.0726503126503149*G0_0_0_5_5 + 0.00287317620650968*G0_1_0_0_0 - 0.00923520923520961*G0_1_0_0_1 + 0.00733686067019424*G0_1_0_0_2 - 0.0416610549943897*G0_1_0_0_3 - 0.00790123456790152*G0_1_0_0_4 + 0.0006156806156806*G0_1_0_0_5 - 0.00923520923520961*G0_1_0_1_0 + 0.27859547859549*G0_1_0_1_1 - 0.0215488215488224*G0_1_0_1_2 + 0.116979316979321*G0_1_0_1_3 + 0.00615680615680635*G0_1_0_1_4 + 0.0184704184704196*G0_1_0_1_5 + 0.00733686067019425*G0_1_0_2_0 - 0.0215488215488224*G0_1_0_2_1 + 0.00410453743787103*G0_1_0_2_2 - 0.0724450857784217*G0_1_0_2_3 - 0.0152894019560691*G0_1_0_2_4 - 0.0178547378547385*G0_1_0_2_5 - 0.0416610549943897*G0_1_0_3_0 + 0.116979316979321*G0_1_0_3_1 - 0.0724450857784217*G0_1_0_3_2 + 0.574635241301929*G0_1_0_3_3 + 0.0710084976751668*G0_1_0_3_4 + 0.119031585698257*G0_1_0_3_5 - 0.00790123456790152*G0_1_0_4_0 + 0.00615680615680635*G0_1_0_4_1 - 0.0152894019560691*G0_1_0_4_2 + 0.0710084976751668*G0_1_0_4_3 + 0.00164181497514809*G0_1_0_4_4 + 0.0233958633958642*G0_1_0_4_5 + 0.000615680615680602*G0_1_0_5_0 + 0.0184704184704196*G0_1_0_5_1 - 0.0178547378547385*G0_1_0_5_2 + 0.119031585698257*G0_1_0_5_3 + 0.0233958633958642*G0_1_0_5_4 - 0.0985088985089018*G0_1_0_5_5; + A[140] = -A[143] + 0.114106140772811*G0_0_1_0_0 - 0.00280476724921179*G0_0_1_0_1 - 0.00177863288974406*G0_0_1_0_2 - 0.000547271658382844*G0_0_1_0_3 - 0.00574635241301928*G0_0_1_0_4 - 0.0061568061568064*G0_0_1_0_5 - 0.00280476724921179*G0_0_1_1_0 - 0.0143658810325483*G0_0_1_1_1 - 0.00068408957297849*G0_0_1_1_2 + 0.00766180321735906*G0_0_1_1_3 - 0.00738816738816764*G0_0_1_1_4 + 0.0198385976163761*G0_0_1_1_5 - 0.00177863288974406*G0_0_1_2_0 - 0.000684089572978491*G0_0_1_2_1 - 0.00547271658382792*G0_0_1_2_3 + 0.00547271658382787*G0_0_1_2_4 + 0.00246272246272254*G0_0_1_2_5 - 0.000547271658382844*G0_0_1_3_0 + 0.00766180321735906*G0_0_1_3_1 - 0.00547271658382792*G0_0_1_3_2 - 0.0317417561862014*G0_0_1_3_3 + 0.0158708780931009*G0_0_1_3_4 - 0.00383090160867943*G0_0_1_3_5 - 0.00574635241301928*G0_0_1_4_0 - 0.00738816738816764*G0_0_1_4_1 + 0.00547271658382787*G0_0_1_4_2 + 0.0158708780931009*G0_0_1_4_3 + 0.00985088985089021*G0_0_1_4_5 - 0.0061568061568064*G0_0_1_5_0 + 0.0198385976163761*G0_0_1_5_1 + 0.00246272246272254*G0_0_1_5_2 - 0.00383090160867943*G0_0_1_5_3 + 0.00985088985089021*G0_0_1_5_4 - 0.121494308160979*G0_0_1_5_5 - 0.0788071188071216*G0_1_1_0_0 + 0.0132029287584848*G0_1_1_0_1 - 0.00109454331676556*G0_1_1_0_2 + 0.00123136123136125*G0_1_1_0_3 + 0.000684089572978478*G0_1_1_0_4 - 0.0864689220244808*G0_1_1_0_5 + 0.0132029287584848*G0_1_1_1_0 - 0.0201122334455676*G0_1_1_1_1 + 0.0119031585698257*G0_1_1_1_3 - 0.0091668002779117*G0_1_1_1_4 + 0.035709475709477*G0_1_1_1_5 - 0.00109454331676556*G0_1_1_2_0 + 0.00410453743787078*G0_1_1_2_2 - 0.0109454331676559*G0_1_1_2_3 - 0.00547271658382789*G0_1_1_2_4 + 0.00205226871893546*G0_1_1_2_5 + 0.00123136123136125*G0_1_1_3_0 + 0.0119031585698257*G0_1_1_3_1 - 0.0109454331676559*G0_1_1_3_2 - 0.0476126342793026*G0_1_1_3_3 + 0.0158708780931009*G0_1_1_3_4 - 0.00656725990059339*G0_1_1_3_5 + 0.000684089572978478*G0_1_1_4_0 - 0.0091668002779117*G0_1_1_4_1 - 0.00547271658382789*G0_1_1_4_2 + 0.0158708780931009*G0_1_1_4_3 + 0.0651253273475518*G0_1_1_4_4 + 0.0142290631179525*G0_1_1_4_5 - 0.0864689220244808*G0_1_1_5_0 + 0.035709475709477*G0_1_1_5_1 + 0.00205226871893545*G0_1_1_5_2 - 0.00656725990059339*G0_1_1_5_3 + 0.0142290631179525*G0_1_1_5_4 - 0.211794131794139*G0_1_1_5_5; + A[51] = A[140] - 0.0213435946769287*G0_0_0_0_0 + 0.000342044786489238*G0_0_0_0_1 + 0.00396771952327521*G0_0_0_0_2 + 0.00287317620650966*G0_0_0_0_3 - 0.0240799529688426*G0_0_0_0_4 - 0.00013681791459571*G0_0_0_0_5 + 0.000342044786489238*G0_0_0_1_0 - 0.00902998236331611*G0_0_0_1_1 + 0.000957725402169911*G0_0_0_1_2 - 0.0246272246272256*G0_0_0_1_3 + 0.00259954037731823*G0_0_0_1_4 - 0.0041045374378709*G0_0_0_1_5 + 0.00396771952327521*G0_0_0_2_0 + 0.000957725402169911*G0_0_0_2_1 - 0.0229854096520771*G0_0_0_2_2 + 0.0236694992250556*G0_0_0_2_3 + 0.01080861525306*G0_0_0_2_4 - 0.00287317620650964*G0_0_0_2_5 + 0.00287317620650966*G0_0_0_3_0 - 0.0246272246272256*G0_0_0_3_1 + 0.0236694992250556*G0_0_0_3_2 - 0.0541798941798965*G0_0_0_3_3 - 0.0109454331676558*G0_0_0_3_4 - 0.0240799529688426*G0_0_0_4_0 + 0.00259954037731823*G0_0_0_4_1 + 0.01080861525306*G0_0_0_4_2 - 0.0109454331676558*G0_0_0_4_3 - 0.0782598471487383*G0_0_0_4_4 + 0.000547271658382821*G0_0_0_4_5 - 0.000136817914595709*G0_0_0_5_0 - 0.0041045374378709*G0_0_0_5_1 - 0.00287317620650964*G0_0_0_5_2 + 0.000547271658382822*G0_0_0_5_4 + 0.0246272246272254*G0_0_0_5_5 - 0.000752498530276349*G0_0_1_0_1 + 0.000752498530276338*G0_0_1_0_2 - 0.00793543904655037*G0_0_1_0_4 + 0.00793543904655049*G0_0_1_0_5 - 0.000752498530276349*G0_0_1_1_0 + 0.013134519801187*G0_0_1_1_1 - 0.0277740366629265*G0_0_1_1_3 + 0.00547271658382788*G0_0_1_1_4 - 0.010398161509273*G0_0_1_1_5 + 0.000752498530276338*G0_0_1_2_0 - 0.0131345198011869*G0_0_1_2_2 + 0.0277740366629265*G0_0_1_2_3 + 0.0103981615092729*G0_0_1_2_4 - 0.00547271658382789*G0_0_1_2_5 - 0.0277740366629265*G0_0_1_3_1 + 0.0277740366629265*G0_0_1_3_2 - 0.0109454331676558*G0_0_1_3_4 + 0.0109454331676557*G0_0_1_3_5 - 0.00793543904655037*G0_0_1_4_0 + 0.00547271658382787*G0_0_1_4_1 + 0.0103981615092729*G0_0_1_4_2 - 0.0109454331676558*G0_0_1_4_3 - 0.0601998824221065*G0_0_1_4_4 + 0.0079354390465505*G0_0_1_5_0 - 0.010398161509273*G0_0_1_5_1 - 0.00547271658382789*G0_0_1_5_2 + 0.0109454331676557*G0_0_1_5_3 + 0.0601998824221066*G0_0_1_5_5 + 0.000136817914595684*G0_1_0_0_1 - 0.000136817914595672*G0_1_0_0_2 - 0.00314681203570108*G0_1_0_0_4 + 0.00314681203570094*G0_1_0_0_5 + 0.000136817914595684*G0_1_0_1_0 - 0.0114927048260385*G0_1_0_1_1 - 0.0165549676660795*G0_1_0_1_3 + 0.000273635829191399*G0_1_0_1_4 - 0.00396771952327507*G0_1_0_1_5 - 0.000136817914595672*G0_1_0_2_0 + 0.0114927048260385*G0_1_0_2_2 + 0.0165549676660794*G0_1_0_2_3 + 0.00396771952327517*G0_1_0_2_4 - 0.000273635829191385*G0_1_0_2_5 - 0.0165549676660795*G0_1_0_3_1 + 0.0165549676660794*G0_1_0_3_2 - 0.00054727165838278*G0_1_0_3_4 + 0.00054727165838279*G0_1_0_3_5 - 0.00314681203570108*G0_1_0_4_0 + 0.000273635829191398*G0_1_0_4_1 + 0.00396771952327517*G0_1_0_4_2 - 0.00054727165838278*G0_1_0_4_3 - 0.0186072363850149*G0_1_0_4_4 + 0.00314681203570094*G0_1_0_5_0 - 0.00396771952327508*G0_1_0_5_1 - 0.000273635829191385*G0_1_0_5_2 + 0.000547271658382789*G0_1_0_5_3 + 0.0186072363850148*G0_1_0_5_5 + 0.0213435946769289*G0_1_1_0_0 - 0.00396771952327524*G0_1_1_0_1 - 0.000342044786489248*G0_1_1_0_2 - 0.00287317620650963*G0_1_1_0_3 + 0.000136817914595719*G0_1_1_0_4 + 0.0240799529688427*G0_1_1_0_5 - 0.00396771952327524*G0_1_1_1_0 + 0.0229854096520774*G0_1_1_1_1 - 0.000957725402169912*G0_1_1_1_2 - 0.0236694992250556*G0_1_1_1_3 + 0.00287317620650963*G0_1_1_1_4 - 0.01080861525306*G0_1_1_1_5 - 0.000342044786489248*G0_1_1_2_0 - 0.000957725402169911*G0_1_1_2_1 + 0.00902998236331613*G0_1_1_2_2 + 0.0246272246272256*G0_1_1_2_3 + 0.00410453743787091*G0_1_1_2_4 - 0.00259954037731825*G0_1_1_2_5 - 0.00287317620650963*G0_1_1_3_0 - 0.0236694992250556*G0_1_1_3_1 + 0.0246272246272256*G0_1_1_3_2 + 0.0541798941798964*G0_1_1_3_3 + 0.0109454331676558*G0_1_1_3_5 + 0.00013681791459572*G0_1_1_4_0 + 0.00287317620650963*G0_1_1_4_1 + 0.00410453743787091*G0_1_1_4_2 - 0.0246272246272254*G0_1_1_4_4 - 0.000547271658382764*G0_1_1_4_5 + 0.0240799529688427*G0_1_1_5_0 - 0.01080861525306*G0_1_1_5_1 - 0.00259954037731824*G0_1_1_5_2 + 0.0109454331676558*G0_1_1_5_3 - 0.000547271658382764*G0_1_1_5_4 + 0.0782598471487388*G0_1_1_5_5; + A[77] = -A[122] - 0.0189065255731929*G0_1_1_0_0 + 0.00441665330554236*G0_1_1_0_1 + 0.00528031639142766*G0_1_1_0_2 + 0.0041045374378709*G0_1_1_0_3 - 0.0016247127358239*G0_1_1_0_4 - 0.00596868152423731*G0_1_1_0_5 + 0.00441665330554236*G0_1_1_1_0 - 0.0189065255731931*G0_1_1_1_1 + 0.00528031639142766*G0_1_1_1_2 - 0.00162471273582395*G0_1_1_1_3 + 0.0041045374378709*G0_1_1_1_4 - 0.00596868152423738*G0_1_1_1_5 + 0.00528031639142766*G0_1_1_2_0 + 0.00528031639142766*G0_1_1_2_1 - 0.188680455347128*G0_1_1_2_2 - 0.0153920153920159*G0_1_1_2_3 - 0.0153920153920159*G0_1_1_2_4 + 0.00572925017369478*G0_1_1_2_5 + 0.0041045374378709*G0_1_1_3_0 - 0.00162471273582394*G0_1_1_3_1 - 0.0153920153920159*G0_1_1_3_2 - 0.0328362995029672*G0_1_1_3_3 - 0.0164181497514836*G0_1_1_3_4 - 0.0196675752231314*G0_1_1_3_5 - 0.0016247127358239*G0_1_1_4_0 + 0.0041045374378709*G0_1_1_4_1 - 0.0153920153920159*G0_1_1_4_2 - 0.0164181497514836*G0_1_1_4_3 - 0.0328362995029673*G0_1_1_4_4 - 0.0196675752231314*G0_1_1_4_5 - 0.00596868152423731*G0_1_1_5_0 - 0.00596868152423738*G0_1_1_5_1 + 0.00572925017369478*G0_1_1_5_2 - 0.0196675752231314*G0_1_1_5_3 - 0.0196675752231314*G0_1_1_5_4 - 0.0870846026401613*G0_1_1_5_5; + A[171] = -A[51] - 0.0788071188071214*G0_0_0_0_0 - 0.00109454331676558*G0_0_0_0_1 + 0.0132029287584847*G0_0_0_0_2 + 0.0012313612313613*G0_0_0_0_3 - 0.0864689220244804*G0_0_0_0_4 + 0.00068408957297845*G0_0_0_0_5 - 0.00109454331676558*G0_0_0_1_0 + 0.00410453743787085*G0_0_0_1_1 - 0.0109454331676559*G0_0_0_1_3 + 0.00205226871893543*G0_0_0_1_4 - 0.00547271658382785*G0_0_0_1_5 + 0.0132029287584847*G0_0_0_2_0 - 0.0201122334455672*G0_0_0_2_2 + 0.0119031585698257*G0_0_0_2_3 + 0.0357094757094769*G0_0_0_2_4 - 0.00916680027791172*G0_0_0_2_5 + 0.0012313612313613*G0_0_0_3_0 - 0.0109454331676559*G0_0_0_3_1 + 0.0119031585698257*G0_0_0_3_2 - 0.0476126342793031*G0_0_0_3_3 - 0.00656725990059342*G0_0_0_3_4 + 0.0158708780931008*G0_0_0_3_5 - 0.0864689220244804*G0_0_0_4_0 + 0.00205226871893542*G0_0_0_4_1 + 0.0357094757094769*G0_0_0_4_2 - 0.00656725990059341*G0_0_0_4_3 - 0.211794131794138*G0_0_0_4_4 + 0.0142290631179526*G0_0_0_4_5 + 0.000684089572978448*G0_0_0_5_0 - 0.00547271658382785*G0_0_0_5_1 - 0.00916680027791172*G0_0_0_5_2 + 0.0158708780931008*G0_0_0_5_3 + 0.0142290631179526*G0_0_0_5_4 + 0.065125327347552*G0_0_0_5_5 + 0.114106140772812*G0_0_1_0_0 - 0.00177863288974408*G0_0_1_0_1 - 0.00280476724921181*G0_0_1_0_2 - 0.0005472716583828*G0_0_1_0_3 - 0.00615680615680623*G0_0_1_0_4 - 0.00574635241301915*G0_0_1_0_5 - 0.00177863288974408*G0_0_1_1_0 - 0.000684089572978478*G0_0_1_1_2 - 0.00547271658382791*G0_0_1_1_3 + 0.00246272246272252*G0_0_1_1_4 + 0.00547271658382786*G0_0_1_1_5 - 0.00280476724921181*G0_0_1_2_0 - 0.000684089572978478*G0_0_1_2_1 - 0.0143658810325481*G0_0_1_2_2 + 0.00766180321735903*G0_0_1_2_3 + 0.019838597616376*G0_0_1_2_4 - 0.00738816738816768*G0_0_1_2_5 - 0.0005472716583828*G0_0_1_3_0 - 0.00547271658382791*G0_0_1_3_1 + 0.00766180321735903*G0_0_1_3_2 - 0.0317417561862018*G0_0_1_3_3 - 0.00383090160867947*G0_0_1_3_4 + 0.0158708780931009*G0_0_1_3_5 - 0.00615680615680623*G0_0_1_4_0 + 0.00246272246272252*G0_0_1_4_1 + 0.019838597616376*G0_0_1_4_2 - 0.00383090160867947*G0_0_1_4_3 - 0.121494308160978*G0_0_1_4_4 + 0.00985088985089033*G0_0_1_4_5 - 0.00574635241301915*G0_0_1_5_0 + 0.00547271658382787*G0_0_1_5_1 - 0.00738816738816768*G0_0_1_5_2 + 0.0158708780931009*G0_0_1_5_3 + 0.00985088985089033*G0_0_1_5_4; + A[101] = A[171] - 0.104665704665709*G0_0_1_0_0 - 0.000615680615680611*G0_0_1_0_1 + 0.00129977018865913*G0_0_1_0_2 + 0.00136817914595696*G0_0_1_0_3 + 0.00396771952327513*G0_0_1_0_4 + 0.00834589279033746*G0_0_1_0_5 - 0.000615680615680611*G0_0_1_1_0 + 0.00944043610710319*G0_0_1_1_1 - 0.000820907487574216*G0_0_1_1_2 + 0.00328362995029685*G0_0_1_1_3 - 0.00164181497514834*G0_0_1_1_4 - 0.0028731762065097*G0_0_1_1_5 + 0.00129977018865913*G0_0_1_2_0 - 0.000820907487574215*G0_0_1_2_1 - 0.000820907487574176*G0_0_1_2_2 + 0.00136817914595696*G0_0_1_2_3 - 0.01080861525306*G0_0_1_2_4 + 0.00300999412110536*G0_0_1_2_5 + 0.00136817914595696*G0_0_1_3_0 + 0.00328362995029685*G0_0_1_3_1 + 0.00136817914595696*G0_0_1_3_2 + 0.00218908663353146*G0_0_1_3_3 + 0.00054727165838277*G0_0_1_3_4 - 0.00875634653412461*G0_0_1_3_5 + 0.00396771952327513*G0_0_1_4_0 - 0.00164181497514834*G0_0_1_4_1 - 0.01080861525306*G0_0_1_4_2 + 0.00054727165838277*G0_0_1_4_3 + 0.0919416386083079*G0_0_1_4_4 - 0.00273635829191406*G0_0_1_4_5 + 0.00834589279033745*G0_0_1_5_0 - 0.0028731762065097*G0_0_1_5_1 + 0.00300999412110536*G0_0_1_5_2 - 0.00875634653412461*G0_0_1_5_3 - 0.00273635829191406*G0_0_1_5_4 + 0.012039976484421*G0_0_1_5_5 + 0.104665704665709*G0_1_0_0_0 + 0.000615680615680612*G0_1_0_0_1 - 0.00129977018865913*G0_1_0_0_2 - 0.00136817914595696*G0_1_0_0_3 - 0.00396771952327514*G0_1_0_0_4 - 0.00834589279033746*G0_1_0_0_5 + 0.000615680615680612*G0_1_0_1_0 - 0.0094404361071032*G0_1_0_1_1 + 0.000820907487574216*G0_1_0_1_2 - 0.00328362995029685*G0_1_0_1_3 + 0.00164181497514834*G0_1_0_1_4 + 0.0028731762065097*G0_1_0_1_5 - 0.00129977018865913*G0_1_0_2_0 + 0.000820907487574216*G0_1_0_2_1 + 0.000820907487574175*G0_1_0_2_2 - 0.00136817914595696*G0_1_0_2_3 + 0.01080861525306*G0_1_0_2_4 - 0.00300999412110536*G0_1_0_2_5 - 0.00136817914595696*G0_1_0_3_0 - 0.00328362995029685*G0_1_0_3_1 - 0.00136817914595696*G0_1_0_3_2 - 0.00218908663353147*G0_1_0_3_3 - 0.000547271658382771*G0_1_0_3_4 + 0.00875634653412461*G0_1_0_3_5 - 0.00396771952327514*G0_1_0_4_0 + 0.00164181497514834*G0_1_0_4_1 + 0.01080861525306*G0_1_0_4_2 - 0.000547271658382772*G0_1_0_4_3 - 0.0919416386083079*G0_1_0_4_4 + 0.00273635829191406*G0_1_0_4_5 - 0.00834589279033746*G0_1_0_5_0 + 0.0028731762065097*G0_1_0_5_1 - 0.00300999412110536*G0_1_0_5_2 + 0.00875634653412461*G0_1_0_5_3 + 0.00273635829191406*G0_1_0_5_4 - 0.012039976484421*G0_1_0_5_5; + A[93] = -A[101] - 0.0788071188071214*G0_0_0_0_0 - 0.00109454331676558*G0_0_0_0_1 + 0.0132029287584847*G0_0_0_0_2 + 0.00123136123136131*G0_0_0_0_3 - 0.0864689220244804*G0_0_0_0_4 + 0.000684089572978452*G0_0_0_0_5 - 0.00109454331676558*G0_0_0_1_0 + 0.00410453743787085*G0_0_0_1_1 - 0.0109454331676559*G0_0_0_1_3 + 0.00205226871893542*G0_0_0_1_4 - 0.00547271658382785*G0_0_0_1_5 + 0.0132029287584847*G0_0_0_2_0 - 0.0201122334455672*G0_0_0_2_2 + 0.0119031585698257*G0_0_0_2_3 + 0.0357094757094769*G0_0_0_2_4 - 0.00916680027791172*G0_0_0_2_5 + 0.0012313612313613*G0_0_0_3_0 - 0.0109454331676559*G0_0_0_3_1 + 0.0119031585698257*G0_0_0_3_2 - 0.0476126342793031*G0_0_0_3_3 - 0.00656725990059341*G0_0_0_3_4 + 0.0158708780931008*G0_0_0_3_5 - 0.0864689220244804*G0_0_0_4_0 + 0.00205226871893542*G0_0_0_4_1 + 0.0357094757094769*G0_0_0_4_2 - 0.00656725990059341*G0_0_0_4_3 - 0.211794131794138*G0_0_0_4_4 + 0.0142290631179526*G0_0_0_4_5 + 0.000684089572978452*G0_0_0_5_0 - 0.00547271658382785*G0_0_0_5_1 - 0.00916680027791172*G0_0_0_5_2 + 0.0158708780931008*G0_0_0_5_3 + 0.0142290631179526*G0_0_0_5_4 + 0.0651253273475521*G0_0_0_5_5 + 0.114106140772812*G0_1_0_0_0 - 0.00177863288974408*G0_1_0_0_1 - 0.00280476724921181*G0_1_0_0_2 - 0.0005472716583828*G0_1_0_0_3 - 0.00615680615680624*G0_1_0_0_4 - 0.00574635241301916*G0_1_0_0_5 - 0.00177863288974408*G0_1_0_1_0 - 0.000684089572978478*G0_1_0_1_2 - 0.00547271658382791*G0_1_0_1_3 + 0.00246272246272252*G0_1_0_1_4 + 0.00547271658382787*G0_1_0_1_5 - 0.00280476724921181*G0_1_0_2_0 - 0.000684089572978478*G0_1_0_2_1 - 0.0143658810325481*G0_1_0_2_2 + 0.00766180321735903*G0_1_0_2_3 + 0.019838597616376*G0_1_0_2_4 - 0.00738816738816768*G0_1_0_2_5 - 0.0005472716583828*G0_1_0_3_0 - 0.00547271658382791*G0_1_0_3_1 + 0.00766180321735903*G0_1_0_3_2 - 0.0317417561862019*G0_1_0_3_3 - 0.00383090160867947*G0_1_0_3_4 + 0.0158708780931009*G0_1_0_3_5 - 0.00615680615680624*G0_1_0_4_0 + 0.00246272246272252*G0_1_0_4_1 + 0.019838597616376*G0_1_0_4_2 - 0.00383090160867947*G0_1_0_4_3 - 0.121494308160978*G0_1_0_4_4 + 0.00985088985089033*G0_1_0_4_5 - 0.00574635241301916*G0_1_0_5_0 + 0.00547271658382787*G0_1_0_5_1 - 0.00738816738816768*G0_1_0_5_2 + 0.0158708780931009*G0_1_0_5_3 + 0.00985088985089033*G0_1_0_5_4; + A[152] = A[40] + 0.00695206028539389*G0_0_1_0_0 + 0.000641333974667321*G0_0_1_0_3 - 0.00220618887285559*G0_0_1_0_4 - 0.0107615840949178*G0_0_1_0_5 - 0.00695206028539393*G0_0_1_1_1 + 0.00220618887285562*G0_0_1_1_3 - 0.000641333974667319*G0_0_1_1_4 + 0.0107615840949178*G0_0_1_1_5 - 0.00137245470578813*G0_0_1_2_3 + 0.00137245470578804*G0_0_1_2_4 + 0.000641333974667321*G0_0_1_3_0 + 0.00220618887285562*G0_0_1_3_1 - 0.00137245470578813*G0_0_1_3_2 - 0.000615680615680598*G0_0_1_3_3 - 0.00128266794933463*G0_0_1_3_5 - 0.00220618887285559*G0_0_1_4_0 - 0.000641333974667319*G0_0_1_4_1 + 0.00137245470578804*G0_0_1_4_2 + 0.000615680615680634*G0_0_1_4_4 + 0.00128266794933464*G0_0_1_4_5 - 0.0107615840949178*G0_0_1_5_0 + 0.0107615840949178*G0_0_1_5_1 - 0.00128266794933463*G0_0_1_5_3 + 0.00128266794933464*G0_0_1_5_4 - 0.00695206028539389*G0_1_0_0_0 - 0.000641333974667321*G0_1_0_0_3 + 0.00220618887285559*G0_1_0_0_4 + 0.0107615840949178*G0_1_0_0_5 + 0.00695206028539393*G0_1_0_1_1 - 0.00220618887285562*G0_1_0_1_3 + 0.000641333974667318*G0_1_0_1_4 - 0.0107615840949178*G0_1_0_1_5 + 0.00137245470578813*G0_1_0_2_3 - 0.00137245470578804*G0_1_0_2_4 - 0.000641333974667321*G0_1_0_3_0 - 0.00220618887285562*G0_1_0_3_1 + 0.00137245470578813*G0_1_0_3_2 + 0.000615680615680598*G0_1_0_3_3 + 0.00128266794933463*G0_1_0_3_5 + 0.00220618887285559*G0_1_0_4_0 + 0.000641333974667319*G0_1_0_4_1 - 0.00137245470578804*G0_1_0_4_2 - 0.000615680615680635*G0_1_0_4_4 - 0.00128266794933464*G0_1_0_4_5 + 0.0107615840949178*G0_1_0_5_0 - 0.0107615840949178*G0_1_0_5_1 + 0.00128266794933463*G0_1_0_5_3 - 0.00128266794933464*G0_1_0_5_4; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p2_q4_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p2_q4_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p2_q4_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q4_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q4_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q4_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q4_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q4_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p2_q4_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p2_q4_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p2_q4_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p2_q4_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p3_q1_quadrature.h b/laplacian_2d/laplacian_f2_p3_q1_quadrature.h new file mode 100644 index 0000000..d19f67a --- /dev/null +++ b/laplacian_2d/laplacian_f2_p3_q1_quadrature.h @@ -0,0 +1,4608 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P3_Q1_QUADRATURE_H +#define __LAPLACIAN_F2_P3_Q1_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q1_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q1_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q1_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q1_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q1_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q1_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q1_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q1_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q1_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q1_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q1_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q1_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p3_q1_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p3_q1_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W12[12] = {0.0254224531851035, 0.0254224531851035, 0.0254224531851035, 0.0583931378631895, 0.0583931378631895, 0.0583931378631895, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187}; + // Quadrature points on the UFC reference element: (0.873821971016996, 0.063089014491502), (0.063089014491502, 0.873821971016996), (0.063089014491502, 0.063089014491502), (0.501426509658179, 0.24928674517091), (0.24928674517091, 0.501426509658179), (0.24928674517091, 0.24928674517091), (0.636502499121399, 0.310352451033785), (0.636502499121399, 0.053145049844816), (0.310352451033785, 0.636502499121399), (0.310352451033785, 0.053145049844816), (0.053145049844816, 0.636502499121399), (0.053145049844816, 0.310352451033785) + + // Value of basis functions at quadrature points. + static const double FE0_D01[12][2] = \ + {{-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}}; + + // Array of non-zero columns + static const unsigned int nzc1[2] = {0, 1}; + + // Array of non-zero columns + static const unsigned int nzc0[2] = {0, 2}; + + static const double FE1[12][10] = \ + {{0.0463079953908667, 0.440268993398561, 0.0463079953908666, 0.402250914961474, -0.201125457480737, -0.0145210435563257, -0.0145210435563257, -0.201125457480737, 0.402250914961474, 0.0939061879708836}, + {0.0463079953908667, 0.0463079953908667, 0.440268993398561, -0.201125457480737, 0.402250914961474, -0.201125457480737, 0.402250914961474, -0.0145210435563257, -0.0145210435563256, 0.0939061879708832}, + {0.440268993398561, 0.0463079953908666, 0.0463079953908666, -0.0145210435563257, -0.0145210435563258, 0.402250914961474, -0.201125457480737, 0.402250914961474, -0.201125457480737, 0.0939061879708838}, + {0.0393516858174584, -0.0626737220523998, 0.0393516858174587, 0.283654926157929, -0.141827463078965, -0.0705102461991972, -0.070510246199198, -0.141827463078964, 0.28365492615793, 0.841335916657949}, + {0.0393516858174584, 0.0393516858174588, -0.0626737220523998, -0.141827463078965, 0.283654926157929, -0.141827463078964, 0.28365492615793, -0.0705102461991972, -0.0705102461991981, 0.841335916657949}, + {-0.0626737220523999, 0.0393516858174588, 0.0393516858174587, -0.0705102461991978, -0.0705102461991979, 0.283654926157931, -0.141827463078965, 0.283654926157931, -0.141827463078966, 0.841335916657947}, + {0.0411107284664352, -0.0261932265993555, 0.0114358260653797, 0.808488952668145, -0.0612852214487409, -0.0623880968176904, -0.00511703591602504, -0.127951879895303, 0.138446419692862, 0.283453533784293}, + {0.0114358260653799, -0.0261932265993554, 0.041110728466435, 0.138446419692861, -0.127951879895303, -0.00511703591602516, -0.0623880968176903, -0.0612852214487413, 0.808488952668146, 0.283453533784293}, + {0.0411107284664352, 0.0114358260653799, -0.0261932265993555, -0.0612852214487413, 0.808488952668146, -0.127951879895303, 0.138446419692862, -0.0623880968176904, -0.00511703591602516, 0.283453533784293}, + {-0.0261932265993554, 0.0114358260653798, 0.0411107284664351, -0.00511703591602524, -0.0623880968176903, 0.138446419692861, -0.127951879895303, 0.808488952668146, -0.0612852214487413, 0.283453533784293}, + {0.01143582606538, 0.0411107284664352, -0.0261932265993555, -0.127951879895303, 0.138446419692862, -0.0612852214487414, 0.808488952668146, -0.00511703591602506, -0.0623880968176904, 0.283453533784293}, + {-0.0261932265993555, 0.0411107284664352, 0.0114358260653799, -0.0623880968176903, -0.00511703591602518, 0.808488952668145, -0.0612852214487411, 0.138446419692862, -0.127951879895303, 0.283453533784293}}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 9; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 1164 + for (unsigned int ip = 0; ip < 12; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 40 + for (unsigned int r = 0; r < 10; r++) + { + F0 += FE1[ip][r]*w[0][r]; + F1 += FE1[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W12[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W12[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W12[ip]; + + + // Number of operations for primary indices: 48 + for (unsigned int j = 0; j < 2; j++) + { + for (unsigned int k = 0; k < 2; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p3_q1_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p3_q1_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q1_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q1_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q1_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q1_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q1_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q1_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q1_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q1_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q1_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p3_q1_tensor.h b/laplacian_2d/laplacian_f2_p3_q1_tensor.h new file mode 100644 index 0000000..8f20e18 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p3_q1_tensor.h @@ -0,0 +1,4873 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P3_Q1_TENSOR_H +#define __LAPLACIAN_F2_P3_Q1_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q1_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q1_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q1_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q1_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q1_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q1_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q1_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q1_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q1_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q1_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q1_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q1_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p3_q1_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p3_q1_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 1056 + // Number of operations (multiply-add pairs) for tensor contraction: 965 + // Total number of operations (multiply-add pairs): 2032 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_7 = det*(w[0][0]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_9 = det*(w[0][0]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_6 = det*(w[0][1]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_8 = det*(w[0][1]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_9 = det*(w[0][1]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_6 = det*(w[0][2]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_7 = det*(w[0][2]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_8 = det*(w[0][2]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_9 = det*(w[0][2]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_6 = det*(w[0][3]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_7 = det*(w[0][3]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_8 = det*(w[0][3]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_9 = det*(w[0][3]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_6 = det*(w[0][4]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_7 = det*(w[0][4]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_8 = det*(w[0][4]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_9 = det*(w[0][4]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_6 = det*(w[0][5]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_7 = det*(w[0][5]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_8 = det*(w[0][5]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_9 = det*(w[0][5]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_1 = det*(w[0][6]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_2 = det*(w[0][6]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_3 = det*(w[0][6]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_4 = det*(w[0][6]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_5 = det*(w[0][6]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_6 = det*(w[0][6]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_7 = det*(w[0][6]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_8 = det*(w[0][6]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_9 = det*(w[0][6]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_0 = det*(w[0][7]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_2 = det*(w[0][7]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_3 = det*(w[0][7]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_4 = det*(w[0][7]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_5 = det*(w[0][7]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_6 = det*(w[0][7]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_7 = det*(w[0][7]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_8 = det*(w[0][7]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_9 = det*(w[0][7]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_1 = det*(w[0][8]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_2 = det*(w[0][8]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_3 = det*(w[0][8]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_4 = det*(w[0][8]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_5 = det*(w[0][8]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_6 = det*(w[0][8]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_7 = det*(w[0][8]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_8 = det*(w[0][8]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_9 = det*(w[0][8]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_0 = det*(w[0][9]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_1 = det*(w[0][9]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_2 = det*(w[0][9]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_3 = det*(w[0][9]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_4 = det*(w[0][9]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_5 = det*(w[0][9]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_6 = det*(w[0][9]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_7 = det*(w[0][9]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_8 = det*(w[0][9]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_9 = det*(w[0][9]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_7 = det*(w[0][0]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_9 = det*(w[0][0]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_6 = det*(w[0][1]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_8 = det*(w[0][1]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_9 = det*(w[0][1]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_6 = det*(w[0][2]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_7 = det*(w[0][2]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_8 = det*(w[0][2]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_9 = det*(w[0][2]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_6 = det*(w[0][3]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_7 = det*(w[0][3]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_8 = det*(w[0][3]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_9 = det*(w[0][3]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_6 = det*(w[0][4]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_7 = det*(w[0][4]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_8 = det*(w[0][4]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_9 = det*(w[0][4]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_6 = det*(w[0][5]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_7 = det*(w[0][5]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_8 = det*(w[0][5]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_9 = det*(w[0][5]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_1 = det*(w[0][6]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_2 = det*(w[0][6]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_3 = det*(w[0][6]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_4 = det*(w[0][6]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_5 = det*(w[0][6]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_6 = det*(w[0][6]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_7 = det*(w[0][6]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_8 = det*(w[0][6]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_9 = det*(w[0][6]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_0 = det*(w[0][7]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_2 = det*(w[0][7]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_3 = det*(w[0][7]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_4 = det*(w[0][7]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_5 = det*(w[0][7]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_6 = det*(w[0][7]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_7 = det*(w[0][7]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_8 = det*(w[0][7]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_9 = det*(w[0][7]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_1 = det*(w[0][8]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_2 = det*(w[0][8]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_3 = det*(w[0][8]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_4 = det*(w[0][8]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_5 = det*(w[0][8]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_6 = det*(w[0][8]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_7 = det*(w[0][8]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_8 = det*(w[0][8]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_9 = det*(w[0][8]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_0 = det*(w[0][9]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_1 = det*(w[0][9]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_2 = det*(w[0][9]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_3 = det*(w[0][9]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_4 = det*(w[0][9]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_5 = det*(w[0][9]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_6 = det*(w[0][9]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_7 = det*(w[0][9]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_8 = det*(w[0][9]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_9 = det*(w[0][9]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_7 = det*(w[0][0]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_9 = det*(w[0][0]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_6 = det*(w[0][1]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_8 = det*(w[0][1]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_9 = det*(w[0][1]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_6 = det*(w[0][2]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_7 = det*(w[0][2]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_8 = det*(w[0][2]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_9 = det*(w[0][2]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_6 = det*(w[0][3]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_7 = det*(w[0][3]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_8 = det*(w[0][3]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_9 = det*(w[0][3]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_6 = det*(w[0][4]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_7 = det*(w[0][4]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_8 = det*(w[0][4]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_9 = det*(w[0][4]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_6 = det*(w[0][5]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_7 = det*(w[0][5]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_8 = det*(w[0][5]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_9 = det*(w[0][5]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_1 = det*(w[0][6]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_2 = det*(w[0][6]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_3 = det*(w[0][6]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_4 = det*(w[0][6]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_5 = det*(w[0][6]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_6 = det*(w[0][6]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_7 = det*(w[0][6]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_8 = det*(w[0][6]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_9 = det*(w[0][6]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_0 = det*(w[0][7]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_2 = det*(w[0][7]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_3 = det*(w[0][7]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_4 = det*(w[0][7]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_5 = det*(w[0][7]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_6 = det*(w[0][7]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_7 = det*(w[0][7]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_8 = det*(w[0][7]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_9 = det*(w[0][7]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_1 = det*(w[0][8]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_2 = det*(w[0][8]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_3 = det*(w[0][8]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_4 = det*(w[0][8]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_5 = det*(w[0][8]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_6 = det*(w[0][8]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_7 = det*(w[0][8]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_8 = det*(w[0][8]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_9 = det*(w[0][8]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_0 = det*(w[0][9]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_1 = det*(w[0][9]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_2 = det*(w[0][9]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_3 = det*(w[0][9]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_4 = det*(w[0][9]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_5 = det*(w[0][9]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_6 = det*(w[0][9]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_7 = det*(w[0][9]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_8 = det*(w[0][9]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_9 = det*(w[0][9]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_7 = det*(w[0][0]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_9 = det*(w[0][0]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_6 = det*(w[0][1]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_8 = det*(w[0][1]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_9 = det*(w[0][1]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_6 = det*(w[0][2]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_7 = det*(w[0][2]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_8 = det*(w[0][2]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_9 = det*(w[0][2]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_6 = det*(w[0][3]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_7 = det*(w[0][3]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_8 = det*(w[0][3]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_9 = det*(w[0][3]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_6 = det*(w[0][4]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_7 = det*(w[0][4]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_8 = det*(w[0][4]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_9 = det*(w[0][4]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_6 = det*(w[0][5]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_7 = det*(w[0][5]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_8 = det*(w[0][5]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_9 = det*(w[0][5]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_1 = det*(w[0][6]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_2 = det*(w[0][6]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_3 = det*(w[0][6]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_4 = det*(w[0][6]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_5 = det*(w[0][6]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_6 = det*(w[0][6]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_7 = det*(w[0][6]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_8 = det*(w[0][6]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_9 = det*(w[0][6]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_0 = det*(w[0][7]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_2 = det*(w[0][7]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_3 = det*(w[0][7]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_4 = det*(w[0][7]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_5 = det*(w[0][7]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_6 = det*(w[0][7]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_7 = det*(w[0][7]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_8 = det*(w[0][7]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_9 = det*(w[0][7]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_1 = det*(w[0][8]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_2 = det*(w[0][8]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_3 = det*(w[0][8]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_4 = det*(w[0][8]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_5 = det*(w[0][8]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_6 = det*(w[0][8]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_7 = det*(w[0][8]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_8 = det*(w[0][8]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_9 = det*(w[0][8]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_0 = det*(w[0][9]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_1 = det*(w[0][9]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_2 = det*(w[0][9]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_3 = det*(w[0][9]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_4 = det*(w[0][9]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_5 = det*(w[0][9]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_6 = det*(w[0][9]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_7 = det*(w[0][9]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_8 = det*(w[0][9]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_9 = det*(w[0][9]*w[1][9]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[1] = -0.00565476190476195*G0_0_0_0_0 - 0.000818452380952388*G0_0_0_0_1 - 0.000818452380952388*G0_0_0_0_2 - 0.00200892857142856*G0_0_0_0_3 - 0.00200892857142857*G0_0_0_0_4 - 0.00133928571428575*G0_0_0_0_5 - 0.00133928571428575*G0_0_0_0_7 - 0.0026785714285714*G0_0_0_0_9 - 0.000818452380952388*G0_0_0_1_0 - 0.00565476190476195*G0_0_0_1_1 - 0.000818452380952388*G0_0_0_1_2 - 0.00133928571428575*G0_0_0_1_3 - 0.00200892857142857*G0_0_0_1_5 - 0.00200892857142857*G0_0_0_1_6 - 0.00133928571428575*G0_0_0_1_8 - 0.00267857142857143*G0_0_0_1_9 - 0.000818452380952388*G0_0_0_2_0 - 0.000818452380952388*G0_0_0_2_1 - 0.00565476190476195*G0_0_0_2_2 - 0.00133928571428576*G0_0_0_2_4 - 0.00133928571428575*G0_0_0_2_6 - 0.00200892857142857*G0_0_0_2_7 - 0.00200892857142856*G0_0_0_2_8 - 0.00267857142857142*G0_0_0_2_9 - 0.00200892857142856*G0_0_0_3_0 - 0.00133928571428575*G0_0_0_3_1 - 0.0401785714285716*G0_0_0_3_3 + 0.0140624999999999*G0_0_0_3_4 + 0.00401785714285713*G0_0_0_3_5 + 0.0100446428571428*G0_0_0_3_6 + 0.0100446428571428*G0_0_0_3_7 - 0.0200892857142856*G0_0_0_3_8 - 0.0120535714285713*G0_0_0_3_9 - 0.00200892857142857*G0_0_0_4_0 - 0.00133928571428576*G0_0_0_4_2 + 0.0140624999999999*G0_0_0_4_3 - 0.0401785714285717*G0_0_0_4_4 + 0.0100446428571428*G0_0_0_4_5 - 0.0200892857142856*G0_0_0_4_6 + 0.00401785714285714*G0_0_0_4_7 + 0.0100446428571428*G0_0_0_4_8 - 0.0120535714285713*G0_0_0_4_9 - 0.00133928571428575*G0_0_0_5_0 - 0.00200892857142857*G0_0_0_5_1 + 0.00401785714285713*G0_0_0_5_3 + 0.0100446428571428*G0_0_0_5_4 - 0.0401785714285717*G0_0_0_5_5 + 0.0140624999999999*G0_0_0_5_6 - 0.0200892857142856*G0_0_0_5_7 + 0.0100446428571428*G0_0_0_5_8 - 0.0120535714285715*G0_0_0_5_9 - 0.00200892857142857*G0_0_0_6_1 - 0.00133928571428575*G0_0_0_6_2 + 0.0100446428571428*G0_0_0_6_3 - 0.0200892857142856*G0_0_0_6_4 + 0.0140624999999999*G0_0_0_6_5 - 0.0401785714285718*G0_0_0_6_6 + 0.0100446428571428*G0_0_0_6_7 + 0.00401785714285714*G0_0_0_6_8 - 0.0120535714285714*G0_0_0_6_9 - 0.00133928571428575*G0_0_0_7_0 - 0.00200892857142857*G0_0_0_7_2 + 0.0100446428571428*G0_0_0_7_3 + 0.00401785714285714*G0_0_0_7_4 - 0.0200892857142856*G0_0_0_7_5 + 0.0100446428571428*G0_0_0_7_6 - 0.0401785714285717*G0_0_0_7_7 + 0.0140624999999999*G0_0_0_7_8 - 0.0120535714285715*G0_0_0_7_9 - 0.00133928571428575*G0_0_0_8_1 - 0.00200892857142856*G0_0_0_8_2 - 0.0200892857142856*G0_0_0_8_3 + 0.0100446428571428*G0_0_0_8_4 + 0.0100446428571428*G0_0_0_8_5 + 0.00401785714285714*G0_0_0_8_6 + 0.0140624999999999*G0_0_0_8_7 - 0.0401785714285717*G0_0_0_8_8 - 0.0120535714285714*G0_0_0_8_9 - 0.0026785714285714*G0_0_0_9_0 - 0.00267857142857143*G0_0_0_9_1 - 0.00267857142857142*G0_0_0_9_2 - 0.0120535714285713*G0_0_0_9_3 - 0.0120535714285713*G0_0_0_9_4 - 0.0120535714285715*G0_0_0_9_5 - 0.0120535714285714*G0_0_0_9_6 - 0.0120535714285715*G0_0_0_9_7 - 0.0120535714285714*G0_0_0_9_8 - 0.144642857142856*G0_0_0_9_9 - 0.00565476190476195*G0_1_0_0_0 - 0.000818452380952388*G0_1_0_0_1 - 0.000818452380952388*G0_1_0_0_2 - 0.00200892857142856*G0_1_0_0_3 - 0.00200892857142857*G0_1_0_0_4 - 0.00133928571428575*G0_1_0_0_5 - 0.00133928571428575*G0_1_0_0_7 - 0.0026785714285714*G0_1_0_0_9 - 0.000818452380952388*G0_1_0_1_0 - 0.00565476190476195*G0_1_0_1_1 - 0.000818452380952388*G0_1_0_1_2 - 0.00133928571428575*G0_1_0_1_3 - 0.00200892857142857*G0_1_0_1_5 - 0.00200892857142857*G0_1_0_1_6 - 0.00133928571428575*G0_1_0_1_8 - 0.00267857142857143*G0_1_0_1_9 - 0.000818452380952388*G0_1_0_2_0 - 0.000818452380952388*G0_1_0_2_1 - 0.00565476190476195*G0_1_0_2_2 - 0.00133928571428576*G0_1_0_2_4 - 0.00133928571428575*G0_1_0_2_6 - 0.00200892857142857*G0_1_0_2_7 - 0.00200892857142856*G0_1_0_2_8 - 0.00267857142857142*G0_1_0_2_9 - 0.00200892857142856*G0_1_0_3_0 - 0.00133928571428575*G0_1_0_3_1 - 0.0401785714285716*G0_1_0_3_3 + 0.0140624999999999*G0_1_0_3_4 + 0.00401785714285713*G0_1_0_3_5 + 0.0100446428571428*G0_1_0_3_6 + 0.0100446428571428*G0_1_0_3_7 - 0.0200892857142856*G0_1_0_3_8 - 0.0120535714285713*G0_1_0_3_9 - 0.00200892857142857*G0_1_0_4_0 - 0.00133928571428576*G0_1_0_4_2 + 0.0140624999999999*G0_1_0_4_3 - 0.0401785714285717*G0_1_0_4_4 + 0.0100446428571428*G0_1_0_4_5 - 0.0200892857142856*G0_1_0_4_6 + 0.00401785714285714*G0_1_0_4_7 + 0.0100446428571428*G0_1_0_4_8 - 0.0120535714285713*G0_1_0_4_9 - 0.00133928571428575*G0_1_0_5_0 - 0.00200892857142857*G0_1_0_5_1 + 0.00401785714285713*G0_1_0_5_3 + 0.0100446428571428*G0_1_0_5_4 - 0.0401785714285717*G0_1_0_5_5 + 0.0140624999999999*G0_1_0_5_6 - 0.0200892857142856*G0_1_0_5_7 + 0.0100446428571428*G0_1_0_5_8 - 0.0120535714285715*G0_1_0_5_9 - 0.00200892857142857*G0_1_0_6_1 - 0.00133928571428575*G0_1_0_6_2 + 0.0100446428571428*G0_1_0_6_3 - 0.0200892857142856*G0_1_0_6_4 + 0.0140624999999999*G0_1_0_6_5 - 0.0401785714285718*G0_1_0_6_6 + 0.0100446428571428*G0_1_0_6_7 + 0.00401785714285714*G0_1_0_6_8 - 0.0120535714285714*G0_1_0_6_9 - 0.00133928571428575*G0_1_0_7_0 - 0.00200892857142857*G0_1_0_7_2 + 0.0100446428571428*G0_1_0_7_3 + 0.00401785714285714*G0_1_0_7_4 - 0.0200892857142856*G0_1_0_7_5 + 0.0100446428571428*G0_1_0_7_6 - 0.0401785714285717*G0_1_0_7_7 + 0.0140624999999999*G0_1_0_7_8 - 0.0120535714285715*G0_1_0_7_9 - 0.00133928571428575*G0_1_0_8_1 - 0.00200892857142856*G0_1_0_8_2 - 0.0200892857142856*G0_1_0_8_3 + 0.0100446428571428*G0_1_0_8_4 + 0.0100446428571428*G0_1_0_8_5 + 0.00401785714285714*G0_1_0_8_6 + 0.0140624999999999*G0_1_0_8_7 - 0.0401785714285717*G0_1_0_8_8 - 0.0120535714285714*G0_1_0_8_9 - 0.0026785714285714*G0_1_0_9_0 - 0.00267857142857143*G0_1_0_9_1 - 0.00267857142857142*G0_1_0_9_2 - 0.0120535714285713*G0_1_0_9_3 - 0.0120535714285713*G0_1_0_9_4 - 0.0120535714285715*G0_1_0_9_5 - 0.0120535714285714*G0_1_0_9_6 - 0.0120535714285715*G0_1_0_9_7 - 0.0120535714285714*G0_1_0_9_8 - 0.144642857142856*G0_1_0_9_9; + A[5] = 0.00565476190476195*G0_0_1_0_0 + 0.000818452380952388*G0_0_1_0_1 + 0.000818452380952388*G0_0_1_0_2 + 0.00200892857142856*G0_0_1_0_3 + 0.00200892857142857*G0_0_1_0_4 + 0.00133928571428575*G0_0_1_0_5 + 0.00133928571428575*G0_0_1_0_7 + 0.0026785714285714*G0_0_1_0_9 + 0.000818452380952388*G0_0_1_1_0 + 0.00565476190476195*G0_0_1_1_1 + 0.000818452380952388*G0_0_1_1_2 + 0.00133928571428575*G0_0_1_1_3 + 0.00200892857142857*G0_0_1_1_5 + 0.00200892857142857*G0_0_1_1_6 + 0.00133928571428575*G0_0_1_1_8 + 0.00267857142857143*G0_0_1_1_9 + 0.000818452380952388*G0_0_1_2_0 + 0.000818452380952388*G0_0_1_2_1 + 0.00565476190476195*G0_0_1_2_2 + 0.00133928571428576*G0_0_1_2_4 + 0.00133928571428575*G0_0_1_2_6 + 0.00200892857142857*G0_0_1_2_7 + 0.00200892857142856*G0_0_1_2_8 + 0.00267857142857142*G0_0_1_2_9 + 0.00200892857142856*G0_0_1_3_0 + 0.00133928571428575*G0_0_1_3_1 + 0.0401785714285716*G0_0_1_3_3 - 0.0140624999999999*G0_0_1_3_4 - 0.00401785714285713*G0_0_1_3_5 - 0.0100446428571428*G0_0_1_3_6 - 0.0100446428571428*G0_0_1_3_7 + 0.0200892857142856*G0_0_1_3_8 + 0.0120535714285713*G0_0_1_3_9 + 0.00200892857142857*G0_0_1_4_0 + 0.00133928571428576*G0_0_1_4_2 - 0.0140624999999999*G0_0_1_4_3 + 0.0401785714285717*G0_0_1_4_4 - 0.0100446428571428*G0_0_1_4_5 + 0.0200892857142856*G0_0_1_4_6 - 0.00401785714285714*G0_0_1_4_7 - 0.0100446428571428*G0_0_1_4_8 + 0.0120535714285713*G0_0_1_4_9 + 0.00133928571428575*G0_0_1_5_0 + 0.00200892857142857*G0_0_1_5_1 - 0.00401785714285713*G0_0_1_5_3 - 0.0100446428571428*G0_0_1_5_4 + 0.0401785714285717*G0_0_1_5_5 - 0.0140624999999999*G0_0_1_5_6 + 0.0200892857142856*G0_0_1_5_7 - 0.0100446428571428*G0_0_1_5_8 + 0.0120535714285715*G0_0_1_5_9 + 0.00200892857142857*G0_0_1_6_1 + 0.00133928571428575*G0_0_1_6_2 - 0.0100446428571428*G0_0_1_6_3 + 0.0200892857142856*G0_0_1_6_4 - 0.0140624999999999*G0_0_1_6_5 + 0.0401785714285718*G0_0_1_6_6 - 0.0100446428571428*G0_0_1_6_7 - 0.00401785714285714*G0_0_1_6_8 + 0.0120535714285714*G0_0_1_6_9 + 0.00133928571428575*G0_0_1_7_0 + 0.00200892857142857*G0_0_1_7_2 - 0.0100446428571428*G0_0_1_7_3 - 0.00401785714285714*G0_0_1_7_4 + 0.0200892857142856*G0_0_1_7_5 - 0.0100446428571428*G0_0_1_7_6 + 0.0401785714285717*G0_0_1_7_7 - 0.0140624999999999*G0_0_1_7_8 + 0.0120535714285715*G0_0_1_7_9 + 0.00133928571428575*G0_0_1_8_1 + 0.00200892857142856*G0_0_1_8_2 + 0.0200892857142856*G0_0_1_8_3 - 0.0100446428571428*G0_0_1_8_4 - 0.0100446428571428*G0_0_1_8_5 - 0.00401785714285714*G0_0_1_8_6 - 0.0140624999999999*G0_0_1_8_7 + 0.0401785714285717*G0_0_1_8_8 + 0.0120535714285714*G0_0_1_8_9 + 0.0026785714285714*G0_0_1_9_0 + 0.00267857142857143*G0_0_1_9_1 + 0.00267857142857142*G0_0_1_9_2 + 0.0120535714285713*G0_0_1_9_3 + 0.0120535714285713*G0_0_1_9_4 + 0.0120535714285715*G0_0_1_9_5 + 0.0120535714285714*G0_0_1_9_6 + 0.0120535714285715*G0_0_1_9_7 + 0.0120535714285714*G0_0_1_9_8 + 0.144642857142856*G0_0_1_9_9; + A[0] = -A[1] + 0.00565476190476195*G0_0_1_0_0 + 0.000818452380952388*G0_0_1_0_1 + 0.000818452380952388*G0_0_1_0_2 + 0.00200892857142856*G0_0_1_0_3 + 0.00200892857142857*G0_0_1_0_4 + 0.00133928571428575*G0_0_1_0_5 + 0.00133928571428575*G0_0_1_0_7 + 0.0026785714285714*G0_0_1_0_9 + 0.000818452380952388*G0_0_1_1_0 + 0.00565476190476195*G0_0_1_1_1 + 0.000818452380952388*G0_0_1_1_2 + 0.00133928571428575*G0_0_1_1_3 + 0.00200892857142857*G0_0_1_1_5 + 0.00200892857142857*G0_0_1_1_6 + 0.00133928571428575*G0_0_1_1_8 + 0.00267857142857143*G0_0_1_1_9 + 0.000818452380952388*G0_0_1_2_0 + 0.000818452380952388*G0_0_1_2_1 + 0.00565476190476195*G0_0_1_2_2 + 0.00133928571428576*G0_0_1_2_4 + 0.00133928571428575*G0_0_1_2_6 + 0.00200892857142857*G0_0_1_2_7 + 0.00200892857142856*G0_0_1_2_8 + 0.00267857142857142*G0_0_1_2_9 + 0.00200892857142856*G0_0_1_3_0 + 0.00133928571428575*G0_0_1_3_1 + 0.0401785714285716*G0_0_1_3_3 - 0.0140624999999999*G0_0_1_3_4 - 0.00401785714285713*G0_0_1_3_5 - 0.0100446428571428*G0_0_1_3_6 - 0.0100446428571428*G0_0_1_3_7 + 0.0200892857142856*G0_0_1_3_8 + 0.0120535714285713*G0_0_1_3_9 + 0.00200892857142857*G0_0_1_4_0 + 0.00133928571428576*G0_0_1_4_2 - 0.0140624999999999*G0_0_1_4_3 + 0.0401785714285717*G0_0_1_4_4 - 0.0100446428571428*G0_0_1_4_5 + 0.0200892857142856*G0_0_1_4_6 - 0.00401785714285714*G0_0_1_4_7 - 0.0100446428571428*G0_0_1_4_8 + 0.0120535714285713*G0_0_1_4_9 + 0.00133928571428575*G0_0_1_5_0 + 0.00200892857142857*G0_0_1_5_1 - 0.00401785714285713*G0_0_1_5_3 - 0.0100446428571428*G0_0_1_5_4 + 0.0401785714285717*G0_0_1_5_5 - 0.0140624999999999*G0_0_1_5_6 + 0.0200892857142856*G0_0_1_5_7 - 0.0100446428571428*G0_0_1_5_8 + 0.0120535714285715*G0_0_1_5_9 + 0.00200892857142857*G0_0_1_6_1 + 0.00133928571428575*G0_0_1_6_2 - 0.0100446428571428*G0_0_1_6_3 + 0.0200892857142856*G0_0_1_6_4 - 0.0140624999999999*G0_0_1_6_5 + 0.0401785714285718*G0_0_1_6_6 - 0.0100446428571428*G0_0_1_6_7 - 0.00401785714285714*G0_0_1_6_8 + 0.0120535714285714*G0_0_1_6_9 + 0.00133928571428575*G0_0_1_7_0 + 0.00200892857142857*G0_0_1_7_2 - 0.0100446428571428*G0_0_1_7_3 - 0.00401785714285714*G0_0_1_7_4 + 0.0200892857142856*G0_0_1_7_5 - 0.0100446428571428*G0_0_1_7_6 + 0.0401785714285717*G0_0_1_7_7 - 0.0140624999999999*G0_0_1_7_8 + 0.0120535714285715*G0_0_1_7_9 + 0.00133928571428575*G0_0_1_8_1 + 0.00200892857142856*G0_0_1_8_2 + 0.0200892857142856*G0_0_1_8_3 - 0.0100446428571428*G0_0_1_8_4 - 0.0100446428571428*G0_0_1_8_5 - 0.00401785714285714*G0_0_1_8_6 - 0.0140624999999999*G0_0_1_8_7 + 0.0401785714285717*G0_0_1_8_8 + 0.0120535714285714*G0_0_1_8_9 + 0.0026785714285714*G0_0_1_9_0 + 0.00267857142857143*G0_0_1_9_1 + 0.00267857142857142*G0_0_1_9_2 + 0.0120535714285713*G0_0_1_9_3 + 0.0120535714285713*G0_0_1_9_4 + 0.0120535714285715*G0_0_1_9_5 + 0.0120535714285714*G0_0_1_9_6 + 0.0120535714285715*G0_0_1_9_7 + 0.0120535714285714*G0_0_1_9_8 + 0.144642857142856*G0_0_1_9_9 + 0.00565476190476195*G0_1_1_0_0 + 0.000818452380952388*G0_1_1_0_1 + 0.000818452380952388*G0_1_1_0_2 + 0.00200892857142856*G0_1_1_0_3 + 0.00200892857142857*G0_1_1_0_4 + 0.00133928571428575*G0_1_1_0_5 + 0.00133928571428575*G0_1_1_0_7 + 0.0026785714285714*G0_1_1_0_9 + 0.000818452380952388*G0_1_1_1_0 + 0.00565476190476195*G0_1_1_1_1 + 0.000818452380952388*G0_1_1_1_2 + 0.00133928571428575*G0_1_1_1_3 + 0.00200892857142857*G0_1_1_1_5 + 0.00200892857142857*G0_1_1_1_6 + 0.00133928571428575*G0_1_1_1_8 + 0.00267857142857143*G0_1_1_1_9 + 0.000818452380952388*G0_1_1_2_0 + 0.000818452380952388*G0_1_1_2_1 + 0.00565476190476195*G0_1_1_2_2 + 0.00133928571428576*G0_1_1_2_4 + 0.00133928571428575*G0_1_1_2_6 + 0.00200892857142857*G0_1_1_2_7 + 0.00200892857142856*G0_1_1_2_8 + 0.00267857142857142*G0_1_1_2_9 + 0.00200892857142856*G0_1_1_3_0 + 0.00133928571428575*G0_1_1_3_1 + 0.0401785714285716*G0_1_1_3_3 - 0.0140624999999999*G0_1_1_3_4 - 0.00401785714285713*G0_1_1_3_5 - 0.0100446428571428*G0_1_1_3_6 - 0.0100446428571428*G0_1_1_3_7 + 0.0200892857142856*G0_1_1_3_8 + 0.0120535714285713*G0_1_1_3_9 + 0.00200892857142857*G0_1_1_4_0 + 0.00133928571428576*G0_1_1_4_2 - 0.0140624999999999*G0_1_1_4_3 + 0.0401785714285717*G0_1_1_4_4 - 0.0100446428571428*G0_1_1_4_5 + 0.0200892857142856*G0_1_1_4_6 - 0.00401785714285714*G0_1_1_4_7 - 0.0100446428571428*G0_1_1_4_8 + 0.0120535714285713*G0_1_1_4_9 + 0.00133928571428575*G0_1_1_5_0 + 0.00200892857142857*G0_1_1_5_1 - 0.00401785714285713*G0_1_1_5_3 - 0.0100446428571428*G0_1_1_5_4 + 0.0401785714285717*G0_1_1_5_5 - 0.0140624999999999*G0_1_1_5_6 + 0.0200892857142856*G0_1_1_5_7 - 0.0100446428571428*G0_1_1_5_8 + 0.0120535714285715*G0_1_1_5_9 + 0.00200892857142857*G0_1_1_6_1 + 0.00133928571428575*G0_1_1_6_2 - 0.0100446428571428*G0_1_1_6_3 + 0.0200892857142856*G0_1_1_6_4 - 0.0140624999999999*G0_1_1_6_5 + 0.0401785714285718*G0_1_1_6_6 - 0.0100446428571428*G0_1_1_6_7 - 0.00401785714285714*G0_1_1_6_8 + 0.0120535714285714*G0_1_1_6_9 + 0.00133928571428575*G0_1_1_7_0 + 0.00200892857142857*G0_1_1_7_2 - 0.0100446428571428*G0_1_1_7_3 - 0.00401785714285714*G0_1_1_7_4 + 0.0200892857142856*G0_1_1_7_5 - 0.0100446428571428*G0_1_1_7_6 + 0.0401785714285717*G0_1_1_7_7 - 0.0140624999999999*G0_1_1_7_8 + 0.0120535714285715*G0_1_1_7_9 + 0.00133928571428575*G0_1_1_8_1 + 0.00200892857142856*G0_1_1_8_2 + 0.0200892857142856*G0_1_1_8_3 - 0.0100446428571428*G0_1_1_8_4 - 0.0100446428571428*G0_1_1_8_5 - 0.00401785714285714*G0_1_1_8_6 - 0.0140624999999999*G0_1_1_8_7 + 0.0401785714285717*G0_1_1_8_8 + 0.0120535714285714*G0_1_1_8_9 + 0.0026785714285714*G0_1_1_9_0 + 0.00267857142857143*G0_1_1_9_1 + 0.00267857142857142*G0_1_1_9_2 + 0.0120535714285713*G0_1_1_9_3 + 0.0120535714285713*G0_1_1_9_4 + 0.0120535714285715*G0_1_1_9_5 + 0.0120535714285714*G0_1_1_9_6 + 0.0120535714285715*G0_1_1_9_7 + 0.0120535714285714*G0_1_1_9_8 + 0.144642857142856*G0_1_1_9_9; + A[7] = 0.00565476190476195*G0_1_0_0_0 + 0.000818452380952388*G0_1_0_0_1 + 0.000818452380952388*G0_1_0_0_2 + 0.00200892857142856*G0_1_0_0_3 + 0.00200892857142857*G0_1_0_0_4 + 0.00133928571428575*G0_1_0_0_5 + 0.00133928571428575*G0_1_0_0_7 + 0.0026785714285714*G0_1_0_0_9 + 0.000818452380952388*G0_1_0_1_0 + 0.00565476190476195*G0_1_0_1_1 + 0.000818452380952388*G0_1_0_1_2 + 0.00133928571428575*G0_1_0_1_3 + 0.00200892857142857*G0_1_0_1_5 + 0.00200892857142857*G0_1_0_1_6 + 0.00133928571428575*G0_1_0_1_8 + 0.00267857142857143*G0_1_0_1_9 + 0.000818452380952388*G0_1_0_2_0 + 0.000818452380952388*G0_1_0_2_1 + 0.00565476190476195*G0_1_0_2_2 + 0.00133928571428576*G0_1_0_2_4 + 0.00133928571428575*G0_1_0_2_6 + 0.00200892857142857*G0_1_0_2_7 + 0.00200892857142856*G0_1_0_2_8 + 0.00267857142857142*G0_1_0_2_9 + 0.00200892857142856*G0_1_0_3_0 + 0.00133928571428575*G0_1_0_3_1 + 0.0401785714285716*G0_1_0_3_3 - 0.0140624999999999*G0_1_0_3_4 - 0.00401785714285713*G0_1_0_3_5 - 0.0100446428571428*G0_1_0_3_6 - 0.0100446428571428*G0_1_0_3_7 + 0.0200892857142856*G0_1_0_3_8 + 0.0120535714285713*G0_1_0_3_9 + 0.00200892857142857*G0_1_0_4_0 + 0.00133928571428576*G0_1_0_4_2 - 0.0140624999999999*G0_1_0_4_3 + 0.0401785714285717*G0_1_0_4_4 - 0.0100446428571428*G0_1_0_4_5 + 0.0200892857142856*G0_1_0_4_6 - 0.00401785714285714*G0_1_0_4_7 - 0.0100446428571428*G0_1_0_4_8 + 0.0120535714285713*G0_1_0_4_9 + 0.00133928571428575*G0_1_0_5_0 + 0.00200892857142857*G0_1_0_5_1 - 0.00401785714285713*G0_1_0_5_3 - 0.0100446428571428*G0_1_0_5_4 + 0.0401785714285717*G0_1_0_5_5 - 0.0140624999999999*G0_1_0_5_6 + 0.0200892857142856*G0_1_0_5_7 - 0.0100446428571428*G0_1_0_5_8 + 0.0120535714285715*G0_1_0_5_9 + 0.00200892857142857*G0_1_0_6_1 + 0.00133928571428575*G0_1_0_6_2 - 0.0100446428571428*G0_1_0_6_3 + 0.0200892857142856*G0_1_0_6_4 - 0.0140624999999999*G0_1_0_6_5 + 0.0401785714285718*G0_1_0_6_6 - 0.0100446428571428*G0_1_0_6_7 - 0.00401785714285714*G0_1_0_6_8 + 0.0120535714285714*G0_1_0_6_9 + 0.00133928571428575*G0_1_0_7_0 + 0.00200892857142857*G0_1_0_7_2 - 0.0100446428571428*G0_1_0_7_3 - 0.00401785714285714*G0_1_0_7_4 + 0.0200892857142856*G0_1_0_7_5 - 0.0100446428571428*G0_1_0_7_6 + 0.0401785714285717*G0_1_0_7_7 - 0.0140624999999999*G0_1_0_7_8 + 0.0120535714285715*G0_1_0_7_9 + 0.00133928571428575*G0_1_0_8_1 + 0.00200892857142856*G0_1_0_8_2 + 0.0200892857142856*G0_1_0_8_3 - 0.0100446428571428*G0_1_0_8_4 - 0.0100446428571428*G0_1_0_8_5 - 0.00401785714285714*G0_1_0_8_6 - 0.0140624999999999*G0_1_0_8_7 + 0.0401785714285717*G0_1_0_8_8 + 0.0120535714285714*G0_1_0_8_9 + 0.0026785714285714*G0_1_0_9_0 + 0.00267857142857143*G0_1_0_9_1 + 0.00267857142857142*G0_1_0_9_2 + 0.0120535714285713*G0_1_0_9_3 + 0.0120535714285713*G0_1_0_9_4 + 0.0120535714285715*G0_1_0_9_5 + 0.0120535714285714*G0_1_0_9_6 + 0.0120535714285715*G0_1_0_9_7 + 0.0120535714285714*G0_1_0_9_8 + 0.144642857142856*G0_1_0_9_9; + A[6] = -A[7] - 0.00565476190476195*G0_1_1_0_0 - 0.000818452380952388*G0_1_1_0_1 - 0.000818452380952388*G0_1_1_0_2 - 0.00200892857142856*G0_1_1_0_3 - 0.00200892857142857*G0_1_1_0_4 - 0.00133928571428575*G0_1_1_0_5 - 0.00133928571428575*G0_1_1_0_7 - 0.0026785714285714*G0_1_1_0_9 - 0.000818452380952388*G0_1_1_1_0 - 0.00565476190476195*G0_1_1_1_1 - 0.000818452380952388*G0_1_1_1_2 - 0.00133928571428575*G0_1_1_1_3 - 0.00200892857142857*G0_1_1_1_5 - 0.00200892857142857*G0_1_1_1_6 - 0.00133928571428575*G0_1_1_1_8 - 0.00267857142857143*G0_1_1_1_9 - 0.000818452380952388*G0_1_1_2_0 - 0.000818452380952388*G0_1_1_2_1 - 0.00565476190476195*G0_1_1_2_2 - 0.00133928571428576*G0_1_1_2_4 - 0.00133928571428575*G0_1_1_2_6 - 0.00200892857142857*G0_1_1_2_7 - 0.00200892857142856*G0_1_1_2_8 - 0.00267857142857142*G0_1_1_2_9 - 0.00200892857142856*G0_1_1_3_0 - 0.00133928571428575*G0_1_1_3_1 - 0.0401785714285716*G0_1_1_3_3 + 0.0140624999999999*G0_1_1_3_4 + 0.00401785714285713*G0_1_1_3_5 + 0.0100446428571428*G0_1_1_3_6 + 0.0100446428571428*G0_1_1_3_7 - 0.0200892857142856*G0_1_1_3_8 - 0.0120535714285713*G0_1_1_3_9 - 0.00200892857142857*G0_1_1_4_0 - 0.00133928571428576*G0_1_1_4_2 + 0.0140624999999999*G0_1_1_4_3 - 0.0401785714285717*G0_1_1_4_4 + 0.0100446428571428*G0_1_1_4_5 - 0.0200892857142856*G0_1_1_4_6 + 0.00401785714285714*G0_1_1_4_7 + 0.0100446428571428*G0_1_1_4_8 - 0.0120535714285713*G0_1_1_4_9 - 0.00133928571428575*G0_1_1_5_0 - 0.00200892857142857*G0_1_1_5_1 + 0.00401785714285713*G0_1_1_5_3 + 0.0100446428571428*G0_1_1_5_4 - 0.0401785714285717*G0_1_1_5_5 + 0.0140624999999999*G0_1_1_5_6 - 0.0200892857142856*G0_1_1_5_7 + 0.0100446428571428*G0_1_1_5_8 - 0.0120535714285715*G0_1_1_5_9 - 0.00200892857142857*G0_1_1_6_1 - 0.00133928571428575*G0_1_1_6_2 + 0.0100446428571428*G0_1_1_6_3 - 0.0200892857142856*G0_1_1_6_4 + 0.0140624999999999*G0_1_1_6_5 - 0.0401785714285718*G0_1_1_6_6 + 0.0100446428571428*G0_1_1_6_7 + 0.00401785714285714*G0_1_1_6_8 - 0.0120535714285714*G0_1_1_6_9 - 0.00133928571428575*G0_1_1_7_0 - 0.00200892857142857*G0_1_1_7_2 + 0.0100446428571428*G0_1_1_7_3 + 0.00401785714285714*G0_1_1_7_4 - 0.0200892857142856*G0_1_1_7_5 + 0.0100446428571428*G0_1_1_7_6 - 0.0401785714285717*G0_1_1_7_7 + 0.0140624999999999*G0_1_1_7_8 - 0.0120535714285715*G0_1_1_7_9 - 0.00133928571428575*G0_1_1_8_1 - 0.00200892857142856*G0_1_1_8_2 - 0.0200892857142856*G0_1_1_8_3 + 0.0100446428571428*G0_1_1_8_4 + 0.0100446428571428*G0_1_1_8_5 + 0.00401785714285714*G0_1_1_8_6 + 0.0140624999999999*G0_1_1_8_7 - 0.0401785714285717*G0_1_1_8_8 - 0.0120535714285714*G0_1_1_8_9 - 0.0026785714285714*G0_1_1_9_0 - 0.00267857142857143*G0_1_1_9_1 - 0.00267857142857142*G0_1_1_9_2 - 0.0120535714285713*G0_1_1_9_3 - 0.0120535714285713*G0_1_1_9_4 - 0.0120535714285715*G0_1_1_9_5 - 0.0120535714285714*G0_1_1_9_6 - 0.0120535714285715*G0_1_1_9_7 - 0.0120535714285714*G0_1_1_9_8 - 0.144642857142856*G0_1_1_9_9; + A[8] = 0.00565476190476195*G0_1_1_0_0 + 0.000818452380952388*G0_1_1_0_1 + 0.000818452380952388*G0_1_1_0_2 + 0.00200892857142856*G0_1_1_0_3 + 0.00200892857142857*G0_1_1_0_4 + 0.00133928571428575*G0_1_1_0_5 + 0.00133928571428575*G0_1_1_0_7 + 0.0026785714285714*G0_1_1_0_9 + 0.000818452380952388*G0_1_1_1_0 + 0.00565476190476195*G0_1_1_1_1 + 0.000818452380952388*G0_1_1_1_2 + 0.00133928571428575*G0_1_1_1_3 + 0.00200892857142857*G0_1_1_1_5 + 0.00200892857142857*G0_1_1_1_6 + 0.00133928571428575*G0_1_1_1_8 + 0.00267857142857143*G0_1_1_1_9 + 0.000818452380952388*G0_1_1_2_0 + 0.000818452380952388*G0_1_1_2_1 + 0.00565476190476195*G0_1_1_2_2 + 0.00133928571428576*G0_1_1_2_4 + 0.00133928571428575*G0_1_1_2_6 + 0.00200892857142857*G0_1_1_2_7 + 0.00200892857142856*G0_1_1_2_8 + 0.00267857142857142*G0_1_1_2_9 + 0.00200892857142856*G0_1_1_3_0 + 0.00133928571428575*G0_1_1_3_1 + 0.0401785714285716*G0_1_1_3_3 - 0.0140624999999999*G0_1_1_3_4 - 0.00401785714285713*G0_1_1_3_5 - 0.0100446428571428*G0_1_1_3_6 - 0.0100446428571428*G0_1_1_3_7 + 0.0200892857142856*G0_1_1_3_8 + 0.0120535714285713*G0_1_1_3_9 + 0.00200892857142857*G0_1_1_4_0 + 0.00133928571428576*G0_1_1_4_2 - 0.0140624999999999*G0_1_1_4_3 + 0.0401785714285717*G0_1_1_4_4 - 0.0100446428571428*G0_1_1_4_5 + 0.0200892857142856*G0_1_1_4_6 - 0.00401785714285714*G0_1_1_4_7 - 0.0100446428571428*G0_1_1_4_8 + 0.0120535714285713*G0_1_1_4_9 + 0.00133928571428575*G0_1_1_5_0 + 0.00200892857142857*G0_1_1_5_1 - 0.00401785714285713*G0_1_1_5_3 - 0.0100446428571428*G0_1_1_5_4 + 0.0401785714285717*G0_1_1_5_5 - 0.0140624999999999*G0_1_1_5_6 + 0.0200892857142856*G0_1_1_5_7 - 0.0100446428571428*G0_1_1_5_8 + 0.0120535714285715*G0_1_1_5_9 + 0.00200892857142857*G0_1_1_6_1 + 0.00133928571428575*G0_1_1_6_2 - 0.0100446428571428*G0_1_1_6_3 + 0.0200892857142856*G0_1_1_6_4 - 0.0140624999999999*G0_1_1_6_5 + 0.0401785714285718*G0_1_1_6_6 - 0.0100446428571428*G0_1_1_6_7 - 0.00401785714285714*G0_1_1_6_8 + 0.0120535714285714*G0_1_1_6_9 + 0.00133928571428575*G0_1_1_7_0 + 0.00200892857142857*G0_1_1_7_2 - 0.0100446428571428*G0_1_1_7_3 - 0.00401785714285714*G0_1_1_7_4 + 0.0200892857142856*G0_1_1_7_5 - 0.0100446428571428*G0_1_1_7_6 + 0.0401785714285717*G0_1_1_7_7 - 0.0140624999999999*G0_1_1_7_8 + 0.0120535714285715*G0_1_1_7_9 + 0.00133928571428575*G0_1_1_8_1 + 0.00200892857142856*G0_1_1_8_2 + 0.0200892857142856*G0_1_1_8_3 - 0.0100446428571428*G0_1_1_8_4 - 0.0100446428571428*G0_1_1_8_5 - 0.00401785714285714*G0_1_1_8_6 - 0.0140624999999999*G0_1_1_8_7 + 0.0401785714285717*G0_1_1_8_8 + 0.0120535714285714*G0_1_1_8_9 + 0.0026785714285714*G0_1_1_9_0 + 0.00267857142857143*G0_1_1_9_1 + 0.00267857142857142*G0_1_1_9_2 + 0.0120535714285713*G0_1_1_9_3 + 0.0120535714285713*G0_1_1_9_4 + 0.0120535714285715*G0_1_1_9_5 + 0.0120535714285714*G0_1_1_9_6 + 0.0120535714285715*G0_1_1_9_7 + 0.0120535714285714*G0_1_1_9_8 + 0.144642857142856*G0_1_1_9_9; + A[2] = -A[8] - 0.00565476190476195*G0_0_1_0_0 - 0.000818452380952388*G0_0_1_0_1 - 0.000818452380952388*G0_0_1_0_2 - 0.00200892857142856*G0_0_1_0_3 - 0.00200892857142857*G0_0_1_0_4 - 0.00133928571428575*G0_0_1_0_5 - 0.00133928571428575*G0_0_1_0_7 - 0.0026785714285714*G0_0_1_0_9 - 0.000818452380952388*G0_0_1_1_0 - 0.00565476190476195*G0_0_1_1_1 - 0.000818452380952388*G0_0_1_1_2 - 0.00133928571428575*G0_0_1_1_3 - 0.00200892857142857*G0_0_1_1_5 - 0.00200892857142857*G0_0_1_1_6 - 0.00133928571428575*G0_0_1_1_8 - 0.00267857142857143*G0_0_1_1_9 - 0.000818452380952388*G0_0_1_2_0 - 0.000818452380952388*G0_0_1_2_1 - 0.00565476190476195*G0_0_1_2_2 - 0.00133928571428576*G0_0_1_2_4 - 0.00133928571428575*G0_0_1_2_6 - 0.00200892857142857*G0_0_1_2_7 - 0.00200892857142856*G0_0_1_2_8 - 0.00267857142857142*G0_0_1_2_9 - 0.00200892857142856*G0_0_1_3_0 - 0.00133928571428575*G0_0_1_3_1 - 0.0401785714285716*G0_0_1_3_3 + 0.0140624999999999*G0_0_1_3_4 + 0.00401785714285713*G0_0_1_3_5 + 0.0100446428571428*G0_0_1_3_6 + 0.0100446428571428*G0_0_1_3_7 - 0.0200892857142856*G0_0_1_3_8 - 0.0120535714285713*G0_0_1_3_9 - 0.00200892857142857*G0_0_1_4_0 - 0.00133928571428576*G0_0_1_4_2 + 0.0140624999999999*G0_0_1_4_3 - 0.0401785714285717*G0_0_1_4_4 + 0.0100446428571428*G0_0_1_4_5 - 0.0200892857142856*G0_0_1_4_6 + 0.00401785714285714*G0_0_1_4_7 + 0.0100446428571428*G0_0_1_4_8 - 0.0120535714285713*G0_0_1_4_9 - 0.00133928571428575*G0_0_1_5_0 - 0.00200892857142857*G0_0_1_5_1 + 0.00401785714285713*G0_0_1_5_3 + 0.0100446428571428*G0_0_1_5_4 - 0.0401785714285717*G0_0_1_5_5 + 0.0140624999999999*G0_0_1_5_6 - 0.0200892857142856*G0_0_1_5_7 + 0.0100446428571428*G0_0_1_5_8 - 0.0120535714285715*G0_0_1_5_9 - 0.00200892857142857*G0_0_1_6_1 - 0.00133928571428575*G0_0_1_6_2 + 0.0100446428571428*G0_0_1_6_3 - 0.0200892857142856*G0_0_1_6_4 + 0.0140624999999999*G0_0_1_6_5 - 0.0401785714285718*G0_0_1_6_6 + 0.0100446428571428*G0_0_1_6_7 + 0.00401785714285714*G0_0_1_6_8 - 0.0120535714285714*G0_0_1_6_9 - 0.00133928571428575*G0_0_1_7_0 - 0.00200892857142857*G0_0_1_7_2 + 0.0100446428571428*G0_0_1_7_3 + 0.00401785714285714*G0_0_1_7_4 - 0.0200892857142856*G0_0_1_7_5 + 0.0100446428571428*G0_0_1_7_6 - 0.0401785714285717*G0_0_1_7_7 + 0.0140624999999999*G0_0_1_7_8 - 0.0120535714285715*G0_0_1_7_9 - 0.00133928571428575*G0_0_1_8_1 - 0.00200892857142856*G0_0_1_8_2 - 0.0200892857142856*G0_0_1_8_3 + 0.0100446428571428*G0_0_1_8_4 + 0.0100446428571428*G0_0_1_8_5 + 0.00401785714285714*G0_0_1_8_6 + 0.0140624999999999*G0_0_1_8_7 - 0.0401785714285717*G0_0_1_8_8 - 0.0120535714285714*G0_0_1_8_9 - 0.0026785714285714*G0_0_1_9_0 - 0.00267857142857143*G0_0_1_9_1 - 0.00267857142857142*G0_0_1_9_2 - 0.0120535714285713*G0_0_1_9_3 - 0.0120535714285713*G0_0_1_9_4 - 0.0120535714285715*G0_0_1_9_5 - 0.0120535714285714*G0_0_1_9_6 - 0.0120535714285715*G0_0_1_9_7 - 0.0120535714285714*G0_0_1_9_8 - 0.144642857142856*G0_0_1_9_9; + A[4] = 0.00565476190476195*G0_0_0_0_0 + 0.000818452380952388*G0_0_0_0_1 + 0.000818452380952388*G0_0_0_0_2 + 0.00200892857142856*G0_0_0_0_3 + 0.00200892857142857*G0_0_0_0_4 + 0.00133928571428575*G0_0_0_0_5 + 0.00133928571428575*G0_0_0_0_7 + 0.0026785714285714*G0_0_0_0_9 + 0.000818452380952388*G0_0_0_1_0 + 0.00565476190476195*G0_0_0_1_1 + 0.000818452380952388*G0_0_0_1_2 + 0.00133928571428575*G0_0_0_1_3 + 0.00200892857142857*G0_0_0_1_5 + 0.00200892857142857*G0_0_0_1_6 + 0.00133928571428575*G0_0_0_1_8 + 0.00267857142857143*G0_0_0_1_9 + 0.000818452380952388*G0_0_0_2_0 + 0.000818452380952388*G0_0_0_2_1 + 0.00565476190476195*G0_0_0_2_2 + 0.00133928571428576*G0_0_0_2_4 + 0.00133928571428575*G0_0_0_2_6 + 0.00200892857142857*G0_0_0_2_7 + 0.00200892857142856*G0_0_0_2_8 + 0.00267857142857142*G0_0_0_2_9 + 0.00200892857142856*G0_0_0_3_0 + 0.00133928571428575*G0_0_0_3_1 + 0.0401785714285716*G0_0_0_3_3 - 0.0140624999999999*G0_0_0_3_4 - 0.00401785714285713*G0_0_0_3_5 - 0.0100446428571428*G0_0_0_3_6 - 0.0100446428571428*G0_0_0_3_7 + 0.0200892857142856*G0_0_0_3_8 + 0.0120535714285713*G0_0_0_3_9 + 0.00200892857142857*G0_0_0_4_0 + 0.00133928571428576*G0_0_0_4_2 - 0.0140624999999999*G0_0_0_4_3 + 0.0401785714285717*G0_0_0_4_4 - 0.0100446428571428*G0_0_0_4_5 + 0.0200892857142856*G0_0_0_4_6 - 0.00401785714285714*G0_0_0_4_7 - 0.0100446428571428*G0_0_0_4_8 + 0.0120535714285713*G0_0_0_4_9 + 0.00133928571428575*G0_0_0_5_0 + 0.00200892857142857*G0_0_0_5_1 - 0.00401785714285713*G0_0_0_5_3 - 0.0100446428571428*G0_0_0_5_4 + 0.0401785714285717*G0_0_0_5_5 - 0.0140624999999999*G0_0_0_5_6 + 0.0200892857142856*G0_0_0_5_7 - 0.0100446428571428*G0_0_0_5_8 + 0.0120535714285715*G0_0_0_5_9 + 0.00200892857142857*G0_0_0_6_1 + 0.00133928571428575*G0_0_0_6_2 - 0.0100446428571428*G0_0_0_6_3 + 0.0200892857142856*G0_0_0_6_4 - 0.0140624999999999*G0_0_0_6_5 + 0.0401785714285718*G0_0_0_6_6 - 0.0100446428571428*G0_0_0_6_7 - 0.00401785714285714*G0_0_0_6_8 + 0.0120535714285714*G0_0_0_6_9 + 0.00133928571428575*G0_0_0_7_0 + 0.00200892857142857*G0_0_0_7_2 - 0.0100446428571428*G0_0_0_7_3 - 0.00401785714285714*G0_0_0_7_4 + 0.0200892857142856*G0_0_0_7_5 - 0.0100446428571428*G0_0_0_7_6 + 0.0401785714285717*G0_0_0_7_7 - 0.0140624999999999*G0_0_0_7_8 + 0.0120535714285715*G0_0_0_7_9 + 0.00133928571428575*G0_0_0_8_1 + 0.00200892857142856*G0_0_0_8_2 + 0.0200892857142856*G0_0_0_8_3 - 0.0100446428571428*G0_0_0_8_4 - 0.0100446428571428*G0_0_0_8_5 - 0.00401785714285714*G0_0_0_8_6 - 0.0140624999999999*G0_0_0_8_7 + 0.0401785714285717*G0_0_0_8_8 + 0.0120535714285714*G0_0_0_8_9 + 0.0026785714285714*G0_0_0_9_0 + 0.00267857142857143*G0_0_0_9_1 + 0.00267857142857142*G0_0_0_9_2 + 0.0120535714285713*G0_0_0_9_3 + 0.0120535714285713*G0_0_0_9_4 + 0.0120535714285715*G0_0_0_9_5 + 0.0120535714285714*G0_0_0_9_6 + 0.0120535714285715*G0_0_0_9_7 + 0.0120535714285714*G0_0_0_9_8 + 0.144642857142856*G0_0_0_9_9; + A[3] = -A[4] - 0.00565476190476195*G0_0_1_0_0 - 0.000818452380952388*G0_0_1_0_1 - 0.000818452380952388*G0_0_1_0_2 - 0.00200892857142856*G0_0_1_0_3 - 0.00200892857142857*G0_0_1_0_4 - 0.00133928571428575*G0_0_1_0_5 - 0.00133928571428575*G0_0_1_0_7 - 0.0026785714285714*G0_0_1_0_9 - 0.000818452380952388*G0_0_1_1_0 - 0.00565476190476195*G0_0_1_1_1 - 0.000818452380952388*G0_0_1_1_2 - 0.00133928571428575*G0_0_1_1_3 - 0.00200892857142857*G0_0_1_1_5 - 0.00200892857142857*G0_0_1_1_6 - 0.00133928571428575*G0_0_1_1_8 - 0.00267857142857143*G0_0_1_1_9 - 0.000818452380952388*G0_0_1_2_0 - 0.000818452380952388*G0_0_1_2_1 - 0.00565476190476195*G0_0_1_2_2 - 0.00133928571428576*G0_0_1_2_4 - 0.00133928571428575*G0_0_1_2_6 - 0.00200892857142857*G0_0_1_2_7 - 0.00200892857142856*G0_0_1_2_8 - 0.00267857142857142*G0_0_1_2_9 - 0.00200892857142856*G0_0_1_3_0 - 0.00133928571428575*G0_0_1_3_1 - 0.0401785714285716*G0_0_1_3_3 + 0.0140624999999999*G0_0_1_3_4 + 0.00401785714285713*G0_0_1_3_5 + 0.0100446428571428*G0_0_1_3_6 + 0.0100446428571428*G0_0_1_3_7 - 0.0200892857142856*G0_0_1_3_8 - 0.0120535714285713*G0_0_1_3_9 - 0.00200892857142857*G0_0_1_4_0 - 0.00133928571428576*G0_0_1_4_2 + 0.0140624999999999*G0_0_1_4_3 - 0.0401785714285717*G0_0_1_4_4 + 0.0100446428571428*G0_0_1_4_5 - 0.0200892857142856*G0_0_1_4_6 + 0.00401785714285714*G0_0_1_4_7 + 0.0100446428571428*G0_0_1_4_8 - 0.0120535714285713*G0_0_1_4_9 - 0.00133928571428575*G0_0_1_5_0 - 0.00200892857142857*G0_0_1_5_1 + 0.00401785714285713*G0_0_1_5_3 + 0.0100446428571428*G0_0_1_5_4 - 0.0401785714285717*G0_0_1_5_5 + 0.0140624999999999*G0_0_1_5_6 - 0.0200892857142856*G0_0_1_5_7 + 0.0100446428571428*G0_0_1_5_8 - 0.0120535714285715*G0_0_1_5_9 - 0.00200892857142857*G0_0_1_6_1 - 0.00133928571428575*G0_0_1_6_2 + 0.0100446428571428*G0_0_1_6_3 - 0.0200892857142856*G0_0_1_6_4 + 0.0140624999999999*G0_0_1_6_5 - 0.0401785714285718*G0_0_1_6_6 + 0.0100446428571428*G0_0_1_6_7 + 0.00401785714285714*G0_0_1_6_8 - 0.0120535714285714*G0_0_1_6_9 - 0.00133928571428575*G0_0_1_7_0 - 0.00200892857142857*G0_0_1_7_2 + 0.0100446428571428*G0_0_1_7_3 + 0.00401785714285714*G0_0_1_7_4 - 0.0200892857142856*G0_0_1_7_5 + 0.0100446428571428*G0_0_1_7_6 - 0.0401785714285717*G0_0_1_7_7 + 0.0140624999999999*G0_0_1_7_8 - 0.0120535714285715*G0_0_1_7_9 - 0.00133928571428575*G0_0_1_8_1 - 0.00200892857142856*G0_0_1_8_2 - 0.0200892857142856*G0_0_1_8_3 + 0.0100446428571428*G0_0_1_8_4 + 0.0100446428571428*G0_0_1_8_5 + 0.00401785714285714*G0_0_1_8_6 + 0.0140624999999999*G0_0_1_8_7 - 0.0401785714285717*G0_0_1_8_8 - 0.0120535714285714*G0_0_1_8_9 - 0.0026785714285714*G0_0_1_9_0 - 0.00267857142857143*G0_0_1_9_1 - 0.00267857142857142*G0_0_1_9_2 - 0.0120535714285713*G0_0_1_9_3 - 0.0120535714285713*G0_0_1_9_4 - 0.0120535714285715*G0_0_1_9_5 - 0.0120535714285714*G0_0_1_9_6 - 0.0120535714285715*G0_0_1_9_7 - 0.0120535714285714*G0_0_1_9_8 - 0.144642857142856*G0_0_1_9_9; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p3_q1_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p3_q1_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q1_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q1_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q1_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q1_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q1_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q1_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q1_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q1_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q1_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q1_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p3_q2_quadrature.h b/laplacian_2d/laplacian_f2_p3_q2_quadrature.h new file mode 100644 index 0000000..025e501 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p3_q2_quadrature.h @@ -0,0 +1,5425 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P3_Q2_QUADRATURE_H +#define __LAPLACIAN_F2_P3_Q2_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q2_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q2_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q2_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q2_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q2_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q2_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q2_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q2_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q2_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q2_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q2_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q2_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p3_q2_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p3_q2_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W25[25] = {0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0275289856644697, 0.0475518970579538, 0.0416389652151948, 0.021022967487322, 0.00447940679728133, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783}; + // Quadrature points on the UFC reference element: (0.0450425935698037, 0.0398098570514687), (0.0376212523451112, 0.198013417873608), (0.0263646449444709, 0.437974810247386), (0.0142857943955714, 0.695464273353636), (0.00462228846504642, 0.901464914201174), (0.221578609552379, 0.0398098570514687), (0.185070710267389, 0.198013417873608), (0.129695936782254, 0.437974810247386), (0.0702762920082817, 0.695464273353636), (0.022738483063764, 0.901464914201174), (0.480095071474266, 0.0398098570514687), (0.400993291063196, 0.198013417873608), (0.281012594876307, 0.437974810247386), (0.152267863323182, 0.695464273353636), (0.0492675428994132, 0.901464914201174), (0.738611533396152, 0.0398098570514687), (0.616915871859002, 0.198013417873608), (0.43232925297036, 0.437974810247386), (0.234259434638082, 0.695464273353636), (0.0757966027350624, 0.901464914201174), (0.915147549378728, 0.0398098570514687), (0.764365329781281, 0.198013417873608), (0.535660544808143, 0.437974810247386), (0.290249932250792, 0.695464273353636), (0.09391279733378, 0.901464914201174) + + // Value of basis functions at quadrature points. + static const double FE0_D01[25][5] = \ + {{-2.66059019751491, -0.840760571794125, 0.180170374279214, 3.50135076930903, -0.180170374279215}, + {-2.05746131912512, -0.207946328505567, 0.150485009380445, 2.26540764763069, -0.150485009380445}, + {-1.14264217923257, 0.751899240989545, 0.105458579777883, 0.390742938243027, -0.105458579777883}, + {-0.16099972900317, 1.78185709341454, 0.0571431775822844, -1.62085736441137, -0.0571431775822849}, + {0.62434881066488, 2.60585965680469, 0.0184891538601843, -3.23020846746957, -0.0184891538601846}, + {-1.95444613358461, -0.840760571794125, 0.886314438209516, 2.79520670537873, -0.886314438209517}, + {-1.46766348743601, -0.207946328505567, 0.740282841069557, 1.67560981594158, -0.740282841069557}, + {-0.729317011881439, 0.751899240989545, 0.518783747129016, -0.0225822291081054, -0.518783747129016}, + {0.062962261447671, 1.78185709341454, 0.281105168033126, -1.84481935486221, -0.281105168033126}, + {0.696813589059751, 2.60585965680469, 0.0909539322550548, -3.30267324586444, -0.0909539322550551}, + {-0.920380285897062, -0.840760571794125, 1.92038028589706, 1.76114085769119, -1.92038028589706}, + {-0.603973164252783, -0.207946328505567, 1.60397316425278, 0.811919492758351, -1.60397316425278}, + {-0.124050379505228, 0.751899240989545, 1.12405037950523, -0.627848861484317, -1.12405037950523}, + {0.390928546707272, 1.78185709341454, 0.609071453292727, -2.17278564012182, -0.609071453292727}, + {0.802929828402348, 2.60585965680469, 0.197070171597651, -3.40878948520704, -0.197070171597652}, + {0.113685561790483, -0.840760571794125, 2.95444613358461, 0.727075010003643, -2.95444613358461}, + {0.259717158930442, -0.207946328505567, 2.46766348743601, -0.0517708304248746, -2.46766348743601}, + {0.481216252870984, 0.751899240989545, 1.72931701188144, -1.23311549386053, -1.72931701188144}, + {0.718894831966873, 1.78185709341454, 0.937037738552328, -2.50075192538142, -0.937037738552329}, + {0.909046067744944, 2.60585965680469, 0.303186410940248, -3.51490572454964, -0.303186410940249}, + {0.819829625720785, -0.840760571794125, 3.66059019751491, 0.0209309460733413, -3.66059019751491}, + {0.849514990619555, -0.207946328505567, 3.05746131912512, -0.641568662113987, -3.05746131912512}, + {0.894541420222116, 0.751899240989545, 2.14264217923257, -1.64644066121166, -2.14264217923257}, + {0.942856822417714, 1.78185709341454, 1.16099972900317, -2.72471391583226, -1.16099972900317}, + {0.981510846139815, 2.60585965680469, 0.375651189335118, -3.58737050294451, -0.375651189335119}}; + + // Array of non-zero columns + static const unsigned int nzc0[5] = {0, 2, 3, 4, 5}; + + static const double FE0_D10[25][5] = \ + {{-2.66059019751491, -0.819829625720785, 0.159239428205874, -0.159239428205874, 3.4804198232357}, + {-2.05746131912512, -0.849514990619555, 0.792053671494432, -0.792053671494432, 2.90697630974468}, + {-1.14264217923257, -0.894541420222117, 1.75189924098954, -1.75189924098954, 2.03718359945469}, + {-0.16099972900317, -0.942856822417715, 2.78185709341454, -2.78185709341454, 1.10385655142089}, + {0.624348810664881, -0.981510846139815, 3.60585965680469, -3.60585965680469, 0.357162035474935}, + {-1.95444613358461, -0.113685561790483, 0.159239428205874, -0.159239428205874, 2.06813169537509}, + {-1.46766348743601, -0.259717158930443, 0.792053671494432, -0.792053671494432, 1.72738064636645}, + {-0.729317011881439, -0.481216252870984, 1.75189924098954, -1.75189924098954, 1.21053326475242}, + {0.0629622614476716, -0.718894831966874, 2.78185709341454, -2.78185709341454, 0.655932570519203}, + {0.696813589059751, -0.909046067744944, 3.60585965680469, -3.60585965680469, 0.212232478685194}, + {-0.920380285897062, 0.920380285897063, 0.159239428205874, -0.159239428205874, 0.0}, + {-0.603973164252783, 0.603973164252784, 0.792053671494432, -0.792053671494432, 0.0}, + {-0.124050379505227, 0.124050379505228, 1.75189924098954, -1.75189924098954, 0.0}, + {0.390928546707273, -0.390928546707272, 2.78185709341454, -2.78185709341454, 0.0}, + {0.802929828402348, -0.802929828402348, 3.60585965680469, -3.60585965680469, 0.0}, + {0.113685561790483, 1.95444613358461, 0.159239428205874, -0.159239428205874, -2.06813169537509}, + {0.259717158930442, 1.46766348743601, 0.792053671494432, -0.792053671494432, -1.72738064636645}, + {0.481216252870984, 0.729317011881439, 1.75189924098954, -1.75189924098954, -1.21053326475242}, + {0.718894831966873, -0.0629622614476714, 2.78185709341454, -2.78185709341454, -0.655932570519202}, + {0.909046067744945, -0.696813589059751, 3.60585965680469, -3.60585965680469, -0.212232478685193}, + {0.819829625720784, 2.66059019751491, 0.159239428205873, -0.159239428205873, -3.48041982323569}, + {0.849514990619555, 2.05746131912512, 0.792053671494432, -0.792053671494432, -2.90697630974468}, + {0.894541420222116, 1.14264217923257, 1.75189924098954, -1.75189924098954, -2.03718359945469}, + {0.942856822417715, 0.16099972900317, 2.78185709341454, -2.78185709341454, -1.10385655142088}, + {0.981510846139815, -0.62434881066488, 3.60585965680469, -3.60585965680469, -0.357162035474934}}; + + // Array of non-zero columns + static const unsigned int nzc1[5] = {0, 1, 3, 4, 5}; + + static const double FE1[25][10] = \ + {{0.595361771100889, 0.0363240630142745, 0.0329620582231266, -0.00697876330105458, -0.00710543413900178, 0.286154010031837, -0.144363814874519, 0.323767019699913, -0.160427557536749, 0.0443066477812845}, + {0.144847707077251, 0.0314917525575109, 0.0565093723571961, -0.0297392974343585, -0.0136089104009563, 0.880722068301204, -0.276497422020097, 0.167331423967527, -0.114798724929776, 0.153742030524499}, + {-0.063892231857347, 0.0233191863197456, -0.0471646056404561, -0.0478518692290423, 0.0163120554591612, 0.640806423249974, 0.331418250941681, 0.0385744417985572, -0.0585247318831845, 0.167003080840912}, + {0.0211818331847308, 0.0133805365030048, 0.0326369349932555, -0.0427925717552782, 0.0485711762178745, -0.117406110387015, 0.98683910857276, -0.00241168327121202, -0.0178593517002863, 0.077860127642167}, + {0.0579517721596661, 0.00452658789692554, 0.541134376806172, -0.0184907249626245, 0.0319586608616019, -0.273633189306433, 0.649316299328904, -0.00140306240948462, -0.00192632644777793, 0.0105656060730508}, + {0.0969129145557495, 0.0495966310503563, 0.0329620582231266, -0.0133081629182569, -0.0349538534974921, 0.160876909651335, -0.116515395516028, 0.895428534283356, -0.246912783611135, 0.175913147778989}, + {-0.0391667888544834, 0.0594654509565623, 0.056509372357196, -0.0733496016702975, -0.0669464878724996, 0.467663868980969, -0.223159844548554, 0.437096058075967, -0.228522561505532, 0.610410534080673}, + {-0.0451321541833679, 0.0638185648099453, -0.0471646056404562, -0.156158924075319, 0.0802441041051713, 0.253054939278284, 0.267486202295671, 0.0749362671988722, -0.154146013447678, 0.663061619658879}, + {0.0451608187521462, 0.0496137334753149, 0.0326369349932555, -0.17356708239734, 0.238936811531546, -0.217903867034122, 0.796473473259088, -0.0220190689531466, -0.0584641485580772, 0.309132394931336}, + {0.051903114600349, 0.0204647143413337, 0.541134376806172, -0.0859485068100626, 0.157214651192224, -0.23755901477889, 0.524060308998283, -0.00599217068695453, -0.00722668705539913, 0.0419492133929459}, + {-0.0591559090807404, -0.0591559090807405, 0.0329620582231266, 0.03786731225338, -0.0757346245067601, 0.0378673122533801, -0.07573462450676, 0.456668557219904, 0.456668557219904, 0.247747270005307}, + {-0.0324361556933479, -0.032436155693348, 0.056509372357196, 0.0725265831052634, -0.145053166210527, 0.0725265831052632, -0.145053166210527, 0.146872235029605, 0.146872235029605, 0.859671635180817}, + {0.025515852626442, 0.025515852626442, -0.0471646056404562, -0.0869325766002104, 0.173865153200421, -0.0869325766002106, 0.173865153200421, -0.0557775204375564, -0.0557775204375565, 0.933822788062264}, + {0.06381993437965, 0.0638199343796499, 0.0326369349932555, -0.258852571197658, 0.517705142395317, -0.258852571197659, 0.517705142395317, -0.0566742670215314, -0.0566742670215314, 0.435366587895191}, + {0.0388828743119487, 0.0388828743119486, 0.541134376806172, -0.170318740047626, 0.340637480095253, -0.170318740047627, 0.340637480095253, -0.00930838871228418, -0.00930838871228419, 0.0590791718992465}, + {0.0495966310503563, 0.0969129145557494, 0.0329620582231266, 0.160876909651335, -0.116515395516028, -0.0133081629182568, -0.0349538534974919, -0.246912783611135, 0.895428534283356, 0.175913147778989}, + {0.0594654509565623, -0.0391667888544834, 0.056509372357196, 0.467663868980969, -0.223159844548554, -0.0733496016702975, -0.0669464878724994, -0.228522561505531, 0.437096058075966, 0.610410534080673}, + {0.0638185648099454, -0.0451321541833679, -0.0471646056404562, 0.253054939278284, 0.267486202295671, -0.156158924075319, 0.0802441041051715, -0.154146013447678, 0.0749362671988721, 0.663061619658879}, + {0.0496137334753149, 0.0451608187521461, 0.0326369349932555, -0.217903867034122, 0.796473473259088, -0.17356708239734, 0.238936811531547, -0.0584641485580773, -0.0220190689531467, 0.309132394931336}, + {0.0204647143413337, 0.0519031146003489, 0.541134376806172, -0.23755901477889, 0.524060308998282, -0.0859485068100627, 0.157214651192224, -0.00722668705539914, -0.00599217068695452, 0.0419492133929459}, + {0.0363240630142745, 0.595361771100889, 0.0329620582231266, 0.286154010031837, -0.144363814874518, -0.00697876330105453, -0.00710543413900162, -0.160427557536749, 0.323767019699913, 0.0443066477812843}, + {0.031491752557511, 0.144847707077251, 0.0565093723571959, 0.880722068301204, -0.276497422020097, -0.0297392974343585, -0.0136089104009562, -0.114798724929776, 0.167331423967527, 0.153742030524499}, + {0.0233191863197458, -0.0638922318573471, -0.0471646056404562, 0.640806423249973, 0.331418250941681, -0.0478518692290425, 0.0163120554591614, -0.0585247318831846, 0.0385744417985571, 0.167003080840912}, + {0.013380536503005, 0.0211818331847307, 0.0326369349932555, -0.117406110387015, 0.986839108572759, -0.0427925717552787, 0.0485711762178751, -0.0178593517002865, -0.0024116832712122, 0.0778601276421677}, + {0.00452658789692559, 0.057951772159666, 0.541134376806172, -0.273633189306433, 0.649316299328904, -0.0184907249626247, 0.0319586608616019, -0.00192632644777795, -0.00140306240948464, 0.0105656060730508}}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 36; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 8725 + for (unsigned int ip = 0; ip < 25; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 40 + for (unsigned int r = 0; r < 10; r++) + { + F0 += FE1[ip][r]*w[0][r]; + F1 += FE1[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W25[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W25[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W25[ip]; + + + // Number of operations for primary indices: 300 + for (unsigned int j = 0; j < 5; j++) + { + for (unsigned int k = 0; k < 5; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc1[k]] += FE0_D01[ip][j]*FE0_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc0[k]] += FE0_D01[ip][k]*FE0_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc1[k]] += FE0_D10[ip][j]*FE0_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p3_q2_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p3_q2_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q2_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q2_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q2_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q2_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q2_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q2_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q2_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q2_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q2_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p3_q2_tensor.h b/laplacian_2d/laplacian_f2_p3_q2_tensor.h new file mode 100644 index 0000000..ce0b6d7 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p3_q2_tensor.h @@ -0,0 +1,5712 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P3_Q2_TENSOR_H +#define __LAPLACIAN_F2_P3_Q2_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q2_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q2_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q2_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q2_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q2_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q2_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q2_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q2_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q2_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q2_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q2_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q2_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p3_q2_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p3_q2_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 1200 + // Number of operations (multiply-add pairs) for tensor contraction: 6154 + // Total number of operations (multiply-add pairs): 7365 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_6 = det*(w[0][0]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_7 = det*(w[0][0]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_8 = det*(w[0][0]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_9 = det*(w[0][0]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_6 = det*(w[0][1]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_7 = det*(w[0][1]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_8 = det*(w[0][1]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_9 = det*(w[0][1]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_6 = det*(w[0][2]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_7 = det*(w[0][2]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_8 = det*(w[0][2]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_9 = det*(w[0][2]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_6 = det*(w[0][3]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_7 = det*(w[0][3]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_8 = det*(w[0][3]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_9 = det*(w[0][3]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_6 = det*(w[0][4]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_7 = det*(w[0][4]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_8 = det*(w[0][4]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_9 = det*(w[0][4]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_6 = det*(w[0][5]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_7 = det*(w[0][5]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_8 = det*(w[0][5]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_9 = det*(w[0][5]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_0 = det*(w[0][6]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_1 = det*(w[0][6]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_2 = det*(w[0][6]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_3 = det*(w[0][6]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_4 = det*(w[0][6]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_5 = det*(w[0][6]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_6 = det*(w[0][6]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_7 = det*(w[0][6]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_8 = det*(w[0][6]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_9 = det*(w[0][6]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_0 = det*(w[0][7]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_1 = det*(w[0][7]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_2 = det*(w[0][7]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_3 = det*(w[0][7]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_4 = det*(w[0][7]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_5 = det*(w[0][7]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_6 = det*(w[0][7]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_7 = det*(w[0][7]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_8 = det*(w[0][7]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_9 = det*(w[0][7]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_0 = det*(w[0][8]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_1 = det*(w[0][8]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_2 = det*(w[0][8]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_3 = det*(w[0][8]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_4 = det*(w[0][8]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_5 = det*(w[0][8]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_6 = det*(w[0][8]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_7 = det*(w[0][8]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_8 = det*(w[0][8]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_9 = det*(w[0][8]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_0 = det*(w[0][9]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_1 = det*(w[0][9]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_2 = det*(w[0][9]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_3 = det*(w[0][9]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_4 = det*(w[0][9]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_5 = det*(w[0][9]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_6 = det*(w[0][9]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_7 = det*(w[0][9]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_8 = det*(w[0][9]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_9 = det*(w[0][9]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_6 = det*(w[0][0]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_7 = det*(w[0][0]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_8 = det*(w[0][0]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_9 = det*(w[0][0]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_6 = det*(w[0][1]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_7 = det*(w[0][1]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_8 = det*(w[0][1]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_9 = det*(w[0][1]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_6 = det*(w[0][2]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_7 = det*(w[0][2]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_8 = det*(w[0][2]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_9 = det*(w[0][2]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_6 = det*(w[0][3]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_7 = det*(w[0][3]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_8 = det*(w[0][3]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_9 = det*(w[0][3]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_6 = det*(w[0][4]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_7 = det*(w[0][4]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_8 = det*(w[0][4]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_9 = det*(w[0][4]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_6 = det*(w[0][5]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_7 = det*(w[0][5]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_8 = det*(w[0][5]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_9 = det*(w[0][5]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_0 = det*(w[0][6]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_1 = det*(w[0][6]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_2 = det*(w[0][6]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_3 = det*(w[0][6]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_4 = det*(w[0][6]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_5 = det*(w[0][6]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_6 = det*(w[0][6]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_7 = det*(w[0][6]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_8 = det*(w[0][6]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_9 = det*(w[0][6]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_0 = det*(w[0][7]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_1 = det*(w[0][7]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_2 = det*(w[0][7]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_3 = det*(w[0][7]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_4 = det*(w[0][7]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_5 = det*(w[0][7]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_6 = det*(w[0][7]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_7 = det*(w[0][7]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_8 = det*(w[0][7]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_9 = det*(w[0][7]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_0 = det*(w[0][8]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_1 = det*(w[0][8]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_2 = det*(w[0][8]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_3 = det*(w[0][8]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_4 = det*(w[0][8]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_5 = det*(w[0][8]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_6 = det*(w[0][8]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_7 = det*(w[0][8]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_8 = det*(w[0][8]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_9 = det*(w[0][8]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_0 = det*(w[0][9]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_1 = det*(w[0][9]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_2 = det*(w[0][9]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_3 = det*(w[0][9]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_4 = det*(w[0][9]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_5 = det*(w[0][9]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_6 = det*(w[0][9]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_7 = det*(w[0][9]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_8 = det*(w[0][9]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_9 = det*(w[0][9]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_6 = det*(w[0][0]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_7 = det*(w[0][0]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_8 = det*(w[0][0]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_9 = det*(w[0][0]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_6 = det*(w[0][1]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_7 = det*(w[0][1]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_8 = det*(w[0][1]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_9 = det*(w[0][1]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_6 = det*(w[0][2]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_7 = det*(w[0][2]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_8 = det*(w[0][2]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_9 = det*(w[0][2]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_6 = det*(w[0][3]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_7 = det*(w[0][3]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_8 = det*(w[0][3]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_9 = det*(w[0][3]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_6 = det*(w[0][4]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_7 = det*(w[0][4]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_8 = det*(w[0][4]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_9 = det*(w[0][4]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_6 = det*(w[0][5]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_7 = det*(w[0][5]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_8 = det*(w[0][5]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_9 = det*(w[0][5]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_0 = det*(w[0][6]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_1 = det*(w[0][6]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_2 = det*(w[0][6]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_3 = det*(w[0][6]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_4 = det*(w[0][6]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_5 = det*(w[0][6]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_6 = det*(w[0][6]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_7 = det*(w[0][6]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_8 = det*(w[0][6]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_9 = det*(w[0][6]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_0 = det*(w[0][7]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_1 = det*(w[0][7]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_2 = det*(w[0][7]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_3 = det*(w[0][7]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_4 = det*(w[0][7]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_5 = det*(w[0][7]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_6 = det*(w[0][7]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_7 = det*(w[0][7]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_8 = det*(w[0][7]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_9 = det*(w[0][7]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_0 = det*(w[0][8]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_1 = det*(w[0][8]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_2 = det*(w[0][8]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_3 = det*(w[0][8]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_4 = det*(w[0][8]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_5 = det*(w[0][8]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_6 = det*(w[0][8]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_7 = det*(w[0][8]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_8 = det*(w[0][8]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_9 = det*(w[0][8]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_0 = det*(w[0][9]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_1 = det*(w[0][9]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_2 = det*(w[0][9]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_3 = det*(w[0][9]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_4 = det*(w[0][9]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_5 = det*(w[0][9]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_6 = det*(w[0][9]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_7 = det*(w[0][9]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_8 = det*(w[0][9]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_9 = det*(w[0][9]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_6 = det*(w[0][0]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_7 = det*(w[0][0]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_8 = det*(w[0][0]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_9 = det*(w[0][0]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_6 = det*(w[0][1]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_7 = det*(w[0][1]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_8 = det*(w[0][1]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_9 = det*(w[0][1]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_6 = det*(w[0][2]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_7 = det*(w[0][2]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_8 = det*(w[0][2]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_9 = det*(w[0][2]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_6 = det*(w[0][3]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_7 = det*(w[0][3]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_8 = det*(w[0][3]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_9 = det*(w[0][3]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_6 = det*(w[0][4]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_7 = det*(w[0][4]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_8 = det*(w[0][4]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_9 = det*(w[0][4]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_6 = det*(w[0][5]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_7 = det*(w[0][5]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_8 = det*(w[0][5]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_9 = det*(w[0][5]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_0 = det*(w[0][6]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_1 = det*(w[0][6]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_2 = det*(w[0][6]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_3 = det*(w[0][6]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_4 = det*(w[0][6]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_5 = det*(w[0][6]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_6 = det*(w[0][6]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_7 = det*(w[0][6]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_8 = det*(w[0][6]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_9 = det*(w[0][6]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_0 = det*(w[0][7]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_1 = det*(w[0][7]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_2 = det*(w[0][7]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_3 = det*(w[0][7]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_4 = det*(w[0][7]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_5 = det*(w[0][7]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_6 = det*(w[0][7]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_7 = det*(w[0][7]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_8 = det*(w[0][7]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_9 = det*(w[0][7]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_0 = det*(w[0][8]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_1 = det*(w[0][8]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_2 = det*(w[0][8]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_3 = det*(w[0][8]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_4 = det*(w[0][8]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_5 = det*(w[0][8]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_6 = det*(w[0][8]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_7 = det*(w[0][8]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_8 = det*(w[0][8]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_9 = det*(w[0][8]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_0 = det*(w[0][9]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_1 = det*(w[0][9]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_2 = det*(w[0][9]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_3 = det*(w[0][9]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_4 = det*(w[0][9]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_5 = det*(w[0][9]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_6 = det*(w[0][9]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_7 = det*(w[0][9]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_8 = det*(w[0][9]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_9 = det*(w[0][9]*w[1][9]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[9] = -0.000793650793650785*G0_0_0_0_0 - 0.000138888888888891*G0_0_0_0_1 - 0.00132936507936508*G0_0_0_0_2 + 0.00410714285714285*G0_0_0_0_3 - 0.00124999999999999*G0_0_0_0_4 - 0.00160714285714287*G0_0_0_0_6 - 0.00178571428571428*G0_0_0_0_7 + 0.0019642857142857*G0_0_0_0_8 + 0.0032142857142857*G0_0_0_0_9 - 0.000138888888888891*G0_0_0_1_0 + 0.00238095238095235*G0_0_0_1_1 - 0.000456349206349207*G0_0_0_1_2 + 0.00357142857142854*G0_0_0_1_3 - 0.00446428571428569*G0_0_0_1_4 - 0.000178571428571428*G0_0_0_1_5 - 0.00339285714285714*G0_0_0_1_6 - 0.000892857142857132*G0_0_0_1_7 + 0.00178571428571426*G0_0_0_1_8 - 0.00535714285714284*G0_0_0_1_9 - 0.00132936507936508*G0_0_0_2_0 - 0.000456349206349207*G0_0_0_2_1 - 0.013095238095238*G0_0_0_2_2 + 0.00535714285714282*G0_0_0_2_3 - 0.0107142857142857*G0_0_0_2_4 + 0.00535714285714283*G0_0_0_2_5 - 0.0107142857142857*G0_0_0_2_6 - 0.000178571428571428*G0_0_0_2_7 + 0.0019642857142857*G0_0_0_2_8 + 0.00410714285714285*G0_0_0_3_0 + 0.00357142857142854*G0_0_0_3_1 + 0.00535714285714282*G0_0_0_3_2 + 0.0482142857142855*G0_0_0_3_3 + 0.00482142857142857*G0_0_0_3_4 - 0.0064285714285714*G0_0_0_3_5 + 0.0112499999999999*G0_0_0_3_6 - 0.0112499999999999*G0_0_0_3_7 + 0.0160714285714285*G0_0_0_3_8 + 0.0385714285714284*G0_0_0_3_9 - 0.00124999999999999*G0_0_0_4_0 - 0.00446428571428569*G0_0_0_4_1 - 0.0107142857142857*G0_0_0_4_2 + 0.00482142857142857*G0_0_0_4_3 + 0.00482142857142855*G0_0_0_4_5 - 0.0160714285714285*G0_0_0_4_6 + 0.00160714285714284*G0_0_0_4_7 - 0.00482142857142854*G0_0_0_4_8 - 0.00964285714285708*G0_0_0_4_9 - 0.000178571428571428*G0_0_0_5_1 + 0.00535714285714283*G0_0_0_5_2 - 0.0064285714285714*G0_0_0_5_3 + 0.00482142857142855*G0_0_0_5_4 - 0.0289285714285713*G0_0_0_5_5 + 0.0112499999999999*G0_0_0_5_6 - 0.0032142857142857*G0_0_0_5_7 + 0.00160714285714286*G0_0_0_5_8 - 0.0128571428571428*G0_0_0_5_9 - 0.00160714285714287*G0_0_0_6_0 - 0.00339285714285714*G0_0_0_6_1 - 0.0107142857142857*G0_0_0_6_2 + 0.0112499999999999*G0_0_0_6_3 - 0.0160714285714285*G0_0_0_6_4 + 0.0112499999999999*G0_0_0_6_5 - 0.0642857142857141*G0_0_0_6_6 + 0.00160714285714285*G0_0_0_6_7 + 0.00160714285714285*G0_0_0_6_8 - 0.0224999999999999*G0_0_0_6_9 - 0.00178571428571428*G0_0_0_7_0 - 0.000892857142857132*G0_0_0_7_1 - 0.000178571428571428*G0_0_0_7_2 - 0.0112499999999999*G0_0_0_7_3 + 0.00160714285714284*G0_0_0_7_4 - 0.0032142857142857*G0_0_0_7_5 + 0.00160714285714285*G0_0_0_7_6 + 0.00321428571428569*G0_0_0_7_7 - 0.00482142857142854*G0_0_0_7_8 - 0.0128571428571428*G0_0_0_7_9 + 0.0019642857142857*G0_0_0_8_0 + 0.00178571428571426*G0_0_0_8_1 + 0.0019642857142857*G0_0_0_8_2 + 0.0160714285714285*G0_0_0_8_3 - 0.00482142857142853*G0_0_0_8_4 + 0.00160714285714286*G0_0_0_8_5 + 0.00160714285714285*G0_0_0_8_6 - 0.00482142857142854*G0_0_0_8_7 + 0.0160714285714284*G0_0_0_8_8 + 0.0257142857142856*G0_0_0_8_9 + 0.0032142857142857*G0_0_0_9_0 - 0.00535714285714284*G0_0_0_9_1 + 0.0385714285714284*G0_0_0_9_3 - 0.00964285714285709*G0_0_0_9_4 - 0.0128571428571428*G0_0_0_9_5 - 0.0224999999999999*G0_0_0_9_6 - 0.0128571428571428*G0_0_0_9_7 + 0.0257142857142856*G0_0_0_9_8 + 0.0385714285714284*G0_0_0_9_9 + 0.000793650793650794*G0_0_1_0_0 + 0.0032738095238095*G0_0_1_0_1 + 0.000575396825396822*G0_0_1_0_2 + 0.0108928571428571*G0_0_1_0_3 - 0.00303571428571427*G0_0_1_0_4 - 0.00178571428571428*G0_0_1_0_5 - 0.000178571428571428*G0_0_1_0_6 - 0.00714285714285711*G0_0_1_0_7 + 0.0105357142857142*G0_0_1_0_8 + 0.00749999999999998*G0_0_1_0_9 + 0.0032738095238095*G0_0_1_1_0 + 0.0440476190476188*G0_0_1_1_1 + 0.0032738095238095*G0_0_1_1_2 + 0.0321428571428569*G0_0_1_1_3 - 0.0160714285714284*G0_0_1_1_4 - 0.000892857142857135*G0_0_1_1_5 - 0.000892857142857133*G0_0_1_1_6 - 0.0160714285714285*G0_0_1_1_7 + 0.0321428571428569*G0_0_1_1_8 + 0.000575396825396822*G0_0_1_2_0 + 0.0032738095238095*G0_0_1_2_1 + 0.000793650793650791*G0_0_1_2_2 + 0.0105357142857142*G0_0_1_2_3 - 0.00714285714285709*G0_0_1_2_4 - 0.000178571428571428*G0_0_1_2_5 - 0.00178571428571427*G0_0_1_2_6 - 0.00303571428571426*G0_0_1_2_7 + 0.0108928571428571*G0_0_1_2_8 + 0.00749999999999996*G0_0_1_2_9 + 0.0108928571428571*G0_0_1_3_0 + 0.0321428571428569*G0_0_1_3_1 + 0.0105357142857142*G0_0_1_3_2 + 0.160714285714285*G0_0_1_3_3 - 0.0401785714285711*G0_0_1_3_4 - 0.0112499999999999*G0_0_1_3_5 - 0.00482142857142854*G0_0_1_3_6 - 0.0401785714285712*G0_0_1_3_7 + 0.0803571428571424*G0_0_1_3_8 + 0.0803571428571425*G0_0_1_3_9 - 0.00303571428571427*G0_0_1_4_0 - 0.0160714285714284*G0_0_1_4_1 - 0.00714285714285709*G0_0_1_4_2 - 0.0401785714285711*G0_0_1_4_3 + 0.0289285714285712*G0_0_1_4_4 + 0.00160714285714284*G0_0_1_4_5 + 0.0032142857142857*G0_0_1_4_6 + 0.0128571428571428*G0_0_1_4_7 - 0.0401785714285712*G0_0_1_4_8 - 0.0257142857142856*G0_0_1_4_9 - 0.00178571428571428*G0_0_1_5_0 - 0.000892857142857135*G0_0_1_5_1 - 0.000178571428571428*G0_0_1_5_2 - 0.0112499999999999*G0_0_1_5_3 + 0.00160714285714284*G0_0_1_5_4 - 0.0032142857142857*G0_0_1_5_5 + 0.00160714285714285*G0_0_1_5_6 + 0.00321428571428569*G0_0_1_5_7 - 0.00482142857142854*G0_0_1_5_8 - 0.0128571428571428*G0_0_1_5_9 - 0.000178571428571428*G0_0_1_6_0 - 0.000892857142857133*G0_0_1_6_1 - 0.00178571428571427*G0_0_1_6_2 - 0.00482142857142854*G0_0_1_6_3 + 0.0032142857142857*G0_0_1_6_4 + 0.00160714285714285*G0_0_1_6_5 - 0.00321428571428569*G0_0_1_6_6 + 0.00160714285714284*G0_0_1_6_7 - 0.0112499999999999*G0_0_1_6_8 - 0.0128571428571428*G0_0_1_6_9 - 0.00714285714285711*G0_0_1_7_0 - 0.0160714285714285*G0_0_1_7_1 - 0.00303571428571426*G0_0_1_7_2 - 0.0401785714285712*G0_0_1_7_3 + 0.0128571428571428*G0_0_1_7_4 + 0.00321428571428569*G0_0_1_7_5 + 0.00160714285714284*G0_0_1_7_6 + 0.0289285714285713*G0_0_1_7_7 - 0.0401785714285712*G0_0_1_7_8 - 0.0257142857142856*G0_0_1_7_9 + 0.0105357142857142*G0_0_1_8_0 + 0.0321428571428569*G0_0_1_8_1 + 0.0108928571428571*G0_0_1_8_2 + 0.0803571428571424*G0_0_1_8_3 - 0.0401785714285712*G0_0_1_8_4 - 0.00482142857142854*G0_0_1_8_5 - 0.0112499999999999*G0_0_1_8_6 - 0.0401785714285712*G0_0_1_8_7 + 0.160714285714285*G0_0_1_8_8 + 0.0803571428571425*G0_0_1_8_9 + 0.00749999999999998*G0_0_1_9_0 + 0.00749999999999996*G0_0_1_9_2 + 0.0803571428571425*G0_0_1_9_3 - 0.0257142857142856*G0_0_1_9_4 - 0.0128571428571428*G0_0_1_9_5 - 0.0128571428571428*G0_0_1_9_6 - 0.0257142857142856*G0_0_1_9_7 + 0.0803571428571425*G0_0_1_9_8 + 0.115714285714285*G0_0_1_9_9; + A[13] = 0.00248015873015872*G0_1_0_0_0 - 0.000808531746031743*G0_1_0_0_1 - 0.000808531746031745*G0_1_0_0_2 - 0.000133928571428566*G0_1_0_0_3 - 0.000133928571428574*G0_1_0_0_4 + 0.00312499999999998*G0_1_0_0_5 - 0.0025*G0_1_0_0_6 + 0.00312499999999998*G0_1_0_0_7 - 0.00249999999999999*G0_1_0_0_8 + 0.000535714285714284*G0_1_0_0_9 - 0.000808531746031743*G0_1_0_1_0 - 0.00982142857142852*G0_1_0_1_1 - 0.00112599206349206*G0_1_0_1_2 - 0.00580357142857138*G0_1_0_1_3 + 0.000892857142857127*G0_1_0_1_4 + 0.000937499999999995*G0_1_0_1_5 - 0.00227678571428571*G0_1_0_1_6 + 0.00446428571428569*G0_1_0_1_7 - 0.00758928571428566*G0_1_0_1_8 - 0.00267857142857142*G0_1_0_1_9 - 0.000808531746031745*G0_1_0_2_0 - 0.00112599206349206*G0_1_0_2_1 - 0.00982142857142852*G0_1_0_2_2 + 0.000892857142857139*G0_1_0_2_3 - 0.0058035714285714*G0_1_0_2_4 + 0.00446428571428569*G0_1_0_2_5 - 0.00758928571428568*G0_1_0_2_6 + 0.000937499999999994*G0_1_0_2_7 - 0.0022767857142857*G0_1_0_2_8 - 0.00267857142857141*G0_1_0_2_9 - 0.000133928571428566*G0_1_0_3_0 - 0.00580357142857138*G0_1_0_3_1 + 0.000892857142857139*G0_1_0_3_2 - 0.00803571428571423*G0_1_0_3_3 + 0.0148660714285713*G0_1_0_3_4 - 0.00241071428571428*G0_1_0_3_5 + 0.00924107142857138*G0_1_0_3_6 + 0.00281249999999998*G0_1_0_3_7 - 0.0120535714285713*G0_1_0_3_8 + 0.00241071428571429*G0_1_0_3_9 - 0.000133928571428574*G0_1_0_4_0 + 0.000892857142857127*G0_1_0_4_1 - 0.0058035714285714*G0_1_0_4_2 + 0.0148660714285713*G0_1_0_4_3 - 0.00803571428571424*G0_1_0_4_4 + 0.00281249999999999*G0_1_0_4_5 - 0.0120535714285714*G0_1_0_4_6 - 0.00241071428571427*G0_1_0_4_7 + 0.00924107142857136*G0_1_0_4_8 + 0.00241071428571427*G0_1_0_4_9 + 0.00312499999999998*G0_1_0_5_0 + 0.000937499999999995*G0_1_0_5_1 + 0.00446428571428569*G0_1_0_5_2 - 0.00241071428571428*G0_1_0_5_3 + 0.00281249999999999*G0_1_0_5_4 - 0.00482142857142855*G0_1_0_5_5 + 0.00522321428571427*G0_1_0_5_6 + 0.000803571428571426*G0_1_0_5_7 - 0.000401785714285716*G0_1_0_5_8 - 0.000803571428571423*G0_1_0_5_9 - 0.0025*G0_1_0_6_0 - 0.00227678571428571*G0_1_0_6_1 - 0.00758928571428568*G0_1_0_6_2 + 0.00924107142857138*G0_1_0_6_3 - 0.0120535714285714*G0_1_0_6_4 + 0.00522321428571427*G0_1_0_6_5 - 0.0401785714285713*G0_1_0_6_6 - 0.000401785714285714*G0_1_0_6_7 + 0.00562499999999996*G0_1_0_6_8 - 0.0104464285714285*G0_1_0_6_9 + 0.00312499999999998*G0_1_0_7_0 + 0.00446428571428569*G0_1_0_7_1 + 0.000937499999999994*G0_1_0_7_2 + 0.00281249999999998*G0_1_0_7_3 - 0.00241071428571427*G0_1_0_7_4 + 0.000803571428571426*G0_1_0_7_5 - 0.000401785714285714*G0_1_0_7_6 - 0.00482142857142854*G0_1_0_7_7 + 0.00522321428571425*G0_1_0_7_8 - 0.000803571428571426*G0_1_0_7_9 - 0.00249999999999999*G0_1_0_8_0 - 0.00758928571428566*G0_1_0_8_1 - 0.0022767857142857*G0_1_0_8_2 - 0.0120535714285713*G0_1_0_8_3 + 0.00924107142857136*G0_1_0_8_4 - 0.000401785714285716*G0_1_0_8_5 + 0.00562499999999996*G0_1_0_8_6 + 0.00522321428571425*G0_1_0_8_7 - 0.0401785714285712*G0_1_0_8_8 - 0.0104464285714285*G0_1_0_8_9 + 0.000535714285714284*G0_1_0_9_0 - 0.00267857142857142*G0_1_0_9_1 - 0.00267857142857141*G0_1_0_9_2 + 0.00241071428571429*G0_1_0_9_3 + 0.00241071428571427*G0_1_0_9_4 - 0.000803571428571424*G0_1_0_9_5 - 0.0104464285714285*G0_1_0_9_6 - 0.000803571428571426*G0_1_0_9_7 - 0.0104464285714285*G0_1_0_9_8 - 0.0096428571428571*G0_1_0_9_9; + A[17] = -0.0123015873015872*G0_1_0_0_0 - 0.000317460317460315*G0_1_0_0_2 + 0.00107142857142856*G0_1_0_0_3 - 0.00214285714285714*G0_1_0_0_4 - 0.00892857142857137*G0_1_0_0_5 + 0.00339285714285713*G0_1_0_0_6 - 0.0107142857142857*G0_1_0_0_7 + 0.00696428571428568*G0_1_0_0_8 - 0.00321428571428571*G0_1_0_0_9 + 0.0123015873015872*G0_1_0_1_1 + 0.000317460317460313*G0_1_0_1_2 + 0.00892857142857137*G0_1_0_1_3 - 0.00339285714285712*G0_1_0_1_4 - 0.00107142857142856*G0_1_0_1_5 + 0.00214285714285714*G0_1_0_1_6 - 0.00696428571428567*G0_1_0_1_7 + 0.0107142857142856*G0_1_0_1_8 + 0.0032142857142857*G0_1_0_1_9 - 0.000317460317460315*G0_1_0_2_0 + 0.000317460317460313*G0_1_0_2_1 + 0.00357142857142855*G0_1_0_2_3 - 0.00178571428571427*G0_1_0_2_4 - 0.00357142857142855*G0_1_0_2_5 + 0.00178571428571428*G0_1_0_2_6 - 0.00321428571428569*G0_1_0_2_7 + 0.00321428571428569*G0_1_0_2_8 + 0.00107142857142856*G0_1_0_3_0 + 0.00892857142857137*G0_1_0_3_1 + 0.00357142857142855*G0_1_0_3_2 + 0.00321428571428569*G0_1_0_3_3 - 0.00964285714285708*G0_1_0_3_4 - 0.0064285714285714*G0_1_0_3_6 - 0.00321428571428569*G0_1_0_3_7 + 0.0128571428571428*G0_1_0_3_8 - 0.00321428571428571*G0_1_0_3_9 - 0.00214285714285714*G0_1_0_4_0 - 0.00339285714285712*G0_1_0_4_1 - 0.00178571428571427*G0_1_0_4_2 - 0.00964285714285708*G0_1_0_4_3 - 0.032142857142857*G0_1_0_4_4 + 0.00642857142857141*G0_1_0_4_5 + 0.00803571428571424*G0_1_0_4_7 - 0.00964285714285707*G0_1_0_4_8 - 0.0128571428571428*G0_1_0_4_9 - 0.00892857142857137*G0_1_0_5_0 - 0.00107142857142856*G0_1_0_5_1 - 0.00357142857142855*G0_1_0_5_2 + 0.00642857142857141*G0_1_0_5_4 - 0.00321428571428568*G0_1_0_5_5 + 0.0096428571428571*G0_1_0_5_6 - 0.0128571428571428*G0_1_0_5_7 + 0.0032142857142857*G0_1_0_5_8 + 0.0032142857142857*G0_1_0_5_9 + 0.00339285714285713*G0_1_0_6_0 + 0.00214285714285714*G0_1_0_6_1 + 0.00178571428571428*G0_1_0_6_2 - 0.0064285714285714*G0_1_0_6_3 + 0.00964285714285709*G0_1_0_6_5 + 0.0321428571428571*G0_1_0_6_6 + 0.00964285714285708*G0_1_0_6_7 - 0.00803571428571423*G0_1_0_6_8 + 0.0128571428571428*G0_1_0_6_9 - 0.0107142857142857*G0_1_0_7_0 - 0.00696428571428567*G0_1_0_7_1 - 0.00321428571428569*G0_1_0_7_2 - 0.00321428571428569*G0_1_0_7_3 + 0.00803571428571425*G0_1_0_7_4 - 0.0128571428571428*G0_1_0_7_5 + 0.00964285714285709*G0_1_0_7_6 - 0.0353571428571427*G0_1_0_7_7 - 0.00964285714285709*G0_1_0_7_9 + 0.00696428571428568*G0_1_0_8_0 + 0.0107142857142856*G0_1_0_8_1 + 0.00321428571428569*G0_1_0_8_2 + 0.0128571428571428*G0_1_0_8_3 - 0.00964285714285707*G0_1_0_8_4 + 0.0032142857142857*G0_1_0_8_5 - 0.00803571428571423*G0_1_0_8_6 + 0.0353571428571426*G0_1_0_8_8 + 0.00964285714285709*G0_1_0_8_9 - 0.00321428571428571*G0_1_0_9_0 + 0.0032142857142857*G0_1_0_9_1 - 0.00321428571428571*G0_1_0_9_3 - 0.0128571428571428*G0_1_0_9_4 + 0.0032142857142857*G0_1_0_9_5 + 0.0128571428571428*G0_1_0_9_6 - 0.00964285714285709*G0_1_0_9_7 + 0.00964285714285709*G0_1_0_9_8 + 0.000793650793650786*G0_1_1_0_0 + 0.00132936507936507*G0_1_1_0_1 + 0.000138888888888889*G0_1_1_0_2 + 0.00124999999999999*G0_1_1_0_3 - 0.00410714285714285*G0_1_1_0_4 + 0.00178571428571428*G0_1_1_0_5 - 0.00196428571428571*G0_1_1_0_6 + 0.00160714285714285*G0_1_1_0_8 - 0.00321428571428571*G0_1_1_0_9 + 0.00132936507936507*G0_1_1_1_0 + 0.013095238095238*G0_1_1_1_1 + 0.000456349206349202*G0_1_1_1_2 + 0.0107142857142856*G0_1_1_1_3 - 0.00535714285714283*G0_1_1_1_4 + 0.00017857142857143*G0_1_1_1_5 - 0.00196428571428571*G0_1_1_1_6 - 0.00535714285714283*G0_1_1_1_7 + 0.0107142857142856*G0_1_1_1_8 + 0.000138888888888889*G0_1_1_2_0 + 0.000456349206349202*G0_1_1_2_1 - 0.00238095238095236*G0_1_1_2_2 + 0.00446428571428568*G0_1_1_2_3 - 0.00357142857142854*G0_1_1_2_4 + 0.000892857142857133*G0_1_1_2_5 - 0.00178571428571426*G0_1_1_2_6 + 0.000178571428571426*G0_1_1_2_7 + 0.00339285714285712*G0_1_1_2_8 + 0.00535714285714283*G0_1_1_2_9 + 0.00124999999999999*G0_1_1_3_0 + 0.0107142857142856*G0_1_1_3_1 + 0.00446428571428568*G0_1_1_3_2 - 0.00482142857142854*G0_1_1_3_4 - 0.00160714285714285*G0_1_1_3_5 + 0.00482142857142855*G0_1_1_3_6 - 0.00482142857142854*G0_1_1_3_7 + 0.0160714285714285*G0_1_1_3_8 + 0.00964285714285708*G0_1_1_3_9 - 0.00410714285714285*G0_1_1_4_0 - 0.00535714285714283*G0_1_1_4_1 - 0.00357142857142854*G0_1_1_4_2 - 0.00482142857142854*G0_1_1_4_3 - 0.0482142857142855*G0_1_1_4_4 + 0.01125*G0_1_1_4_5 - 0.0160714285714285*G0_1_1_4_6 + 0.0064285714285714*G0_1_1_4_7 - 0.0112499999999999*G0_1_1_4_8 - 0.0385714285714284*G0_1_1_4_9 + 0.00178571428571428*G0_1_1_5_0 + 0.00017857142857143*G0_1_1_5_1 + 0.000892857142857133*G0_1_1_5_2 - 0.00160714285714285*G0_1_1_5_3 + 0.01125*G0_1_1_5_4 - 0.00321428571428571*G0_1_1_5_5 + 0.00482142857142855*G0_1_1_5_6 + 0.00321428571428569*G0_1_1_5_7 - 0.00160714285714284*G0_1_1_5_8 + 0.0128571428571428*G0_1_1_5_9 - 0.00196428571428571*G0_1_1_6_0 - 0.00196428571428571*G0_1_1_6_1 - 0.00178571428571426*G0_1_1_6_2 + 0.00482142857142855*G0_1_1_6_3 - 0.0160714285714285*G0_1_1_6_4 + 0.00482142857142856*G0_1_1_6_5 - 0.0160714285714285*G0_1_1_6_6 - 0.00160714285714284*G0_1_1_6_7 - 0.00160714285714283*G0_1_1_6_8 - 0.0257142857142856*G0_1_1_6_9 - 0.00535714285714283*G0_1_1_7_1 + 0.000178571428571426*G0_1_1_7_2 - 0.00482142857142854*G0_1_1_7_3 + 0.0064285714285714*G0_1_1_7_4 + 0.00321428571428569*G0_1_1_7_5 - 0.00160714285714284*G0_1_1_7_6 + 0.0289285714285712*G0_1_1_7_7 - 0.0112499999999999*G0_1_1_7_8 + 0.0128571428571428*G0_1_1_7_9 + 0.00160714285714285*G0_1_1_8_0 + 0.0107142857142856*G0_1_1_8_1 + 0.00339285714285712*G0_1_1_8_2 + 0.0160714285714285*G0_1_1_8_3 - 0.0112499999999999*G0_1_1_8_4 - 0.00160714285714285*G0_1_1_8_5 - 0.00160714285714283*G0_1_1_8_6 - 0.0112499999999999*G0_1_1_8_7 + 0.0642857142857139*G0_1_1_8_8 + 0.0224999999999999*G0_1_1_8_9 - 0.00321428571428571*G0_1_1_9_0 + 0.00535714285714283*G0_1_1_9_2 + 0.00964285714285708*G0_1_1_9_3 - 0.0385714285714284*G0_1_1_9_4 + 0.0128571428571428*G0_1_1_9_5 - 0.0257142857142856*G0_1_1_9_6 + 0.0128571428571428*G0_1_1_9_7 + 0.0224999999999999*G0_1_1_9_8 - 0.0385714285714284*G0_1_1_9_9; + A[8] = 0.00248015873015872*G0_0_1_0_0 - 0.000808531746031743*G0_0_1_0_1 - 0.000808531746031745*G0_0_1_0_2 - 0.000133928571428566*G0_0_1_0_3 - 0.000133928571428574*G0_0_1_0_4 + 0.00312499999999998*G0_0_1_0_5 - 0.0025*G0_0_1_0_6 + 0.00312499999999998*G0_0_1_0_7 - 0.00249999999999999*G0_0_1_0_8 + 0.000535714285714284*G0_0_1_0_9 - 0.000808531746031743*G0_0_1_1_0 - 0.00982142857142852*G0_0_1_1_1 - 0.00112599206349206*G0_0_1_1_2 - 0.00580357142857139*G0_0_1_1_3 + 0.000892857142857127*G0_0_1_1_4 + 0.000937499999999995*G0_0_1_1_5 - 0.00227678571428571*G0_0_1_1_6 + 0.00446428571428569*G0_0_1_1_7 - 0.00758928571428566*G0_0_1_1_8 - 0.00267857142857142*G0_0_1_1_9 - 0.000808531746031745*G0_0_1_2_0 - 0.00112599206349206*G0_0_1_2_1 - 0.00982142857142852*G0_0_1_2_2 + 0.000892857142857139*G0_0_1_2_3 - 0.0058035714285714*G0_0_1_2_4 + 0.00446428571428569*G0_0_1_2_5 - 0.00758928571428568*G0_0_1_2_6 + 0.000937499999999994*G0_0_1_2_7 - 0.0022767857142857*G0_0_1_2_8 - 0.00267857142857141*G0_0_1_2_9 - 0.000133928571428566*G0_0_1_3_0 - 0.00580357142857138*G0_0_1_3_1 + 0.000892857142857139*G0_0_1_3_2 - 0.00803571428571423*G0_0_1_3_3 + 0.0148660714285713*G0_0_1_3_4 - 0.00241071428571428*G0_0_1_3_5 + 0.00924107142857138*G0_0_1_3_6 + 0.00281249999999998*G0_0_1_3_7 - 0.0120535714285713*G0_0_1_3_8 + 0.00241071428571428*G0_0_1_3_9 - 0.000133928571428574*G0_0_1_4_0 + 0.000892857142857127*G0_0_1_4_1 - 0.0058035714285714*G0_0_1_4_2 + 0.0148660714285713*G0_0_1_4_3 - 0.00803571428571424*G0_0_1_4_4 + 0.00281249999999999*G0_0_1_4_5 - 0.0120535714285714*G0_0_1_4_6 - 0.00241071428571427*G0_0_1_4_7 + 0.00924107142857136*G0_0_1_4_8 + 0.00241071428571427*G0_0_1_4_9 + 0.00312499999999998*G0_0_1_5_0 + 0.000937499999999995*G0_0_1_5_1 + 0.00446428571428569*G0_0_1_5_2 - 0.00241071428571428*G0_0_1_5_3 + 0.00281249999999999*G0_0_1_5_4 - 0.00482142857142855*G0_0_1_5_5 + 0.00522321428571427*G0_0_1_5_6 + 0.000803571428571426*G0_0_1_5_7 - 0.000401785714285716*G0_0_1_5_8 - 0.000803571428571424*G0_0_1_5_9 - 0.0025*G0_0_1_6_0 - 0.00227678571428571*G0_0_1_6_1 - 0.00758928571428568*G0_0_1_6_2 + 0.00924107142857138*G0_0_1_6_3 - 0.0120535714285714*G0_0_1_6_4 + 0.00522321428571427*G0_0_1_6_5 - 0.0401785714285713*G0_0_1_6_6 - 0.000401785714285714*G0_0_1_6_7 + 0.00562499999999996*G0_0_1_6_8 - 0.0104464285714285*G0_0_1_6_9 + 0.00312499999999998*G0_0_1_7_0 + 0.00446428571428569*G0_0_1_7_1 + 0.000937499999999994*G0_0_1_7_2 + 0.00281249999999998*G0_0_1_7_3 - 0.00241071428571427*G0_0_1_7_4 + 0.000803571428571426*G0_0_1_7_5 - 0.000401785714285714*G0_0_1_7_6 - 0.00482142857142854*G0_0_1_7_7 + 0.00522321428571425*G0_0_1_7_8 - 0.000803571428571426*G0_0_1_7_9 - 0.00249999999999999*G0_0_1_8_0 - 0.00758928571428566*G0_0_1_8_1 - 0.0022767857142857*G0_0_1_8_2 - 0.0120535714285713*G0_0_1_8_3 + 0.00924107142857136*G0_0_1_8_4 - 0.000401785714285716*G0_0_1_8_5 + 0.00562499999999996*G0_0_1_8_6 + 0.00522321428571425*G0_0_1_8_7 - 0.0401785714285712*G0_0_1_8_8 - 0.0104464285714285*G0_0_1_8_9 + 0.000535714285714284*G0_0_1_9_0 - 0.00267857142857142*G0_0_1_9_1 - 0.00267857142857141*G0_0_1_9_2 + 0.00241071428571428*G0_0_1_9_3 + 0.00241071428571427*G0_0_1_9_4 - 0.000803571428571424*G0_0_1_9_5 - 0.0104464285714285*G0_0_1_9_6 - 0.000803571428571426*G0_0_1_9_7 - 0.0104464285714285*G0_0_1_9_8 - 0.0096428571428571*G0_0_1_9_9; + A[11] = -A[9] - 0.0146825396825396*G0_0_0_0_0 - 0.0038690476190476*G0_0_0_0_1 - 0.00323412698412697*G0_0_0_0_2 - 0.00482142857142855*G0_0_0_0_3 + 0.00160714285714285*G0_0_0_0_4 - 0.00892857142857137*G0_0_0_0_5 + 0.00392857142857138*G0_0_0_0_6 - 0.00535714285714282*G0_0_0_0_7 - 0.0032142857142857*G0_0_0_0_8 - 0.00428571428571429*G0_0_0_0_9 - 0.0038690476190476*G0_0_0_1_0 - 0.0392857142857141*G0_0_0_1_1 - 0.00386904761904759*G0_0_0_1_2 - 0.0267857142857141*G0_0_0_1_3 + 0.0107142857142856*G0_0_0_1_4 - 0.00267857142857142*G0_0_0_1_5 - 0.00267857142857144*G0_0_0_1_6 + 0.0107142857142857*G0_0_0_1_7 - 0.0267857142857141*G0_0_0_1_8 - 0.0107142857142857*G0_0_0_1_9 - 0.00323412698412697*G0_0_0_2_0 - 0.00386904761904759*G0_0_0_2_1 - 0.0146825396825396*G0_0_0_2_2 - 0.00321428571428569*G0_0_0_2_3 - 0.00535714285714283*G0_0_0_2_4 + 0.0039285714285714*G0_0_0_2_5 - 0.00892857142857138*G0_0_0_2_6 + 0.00160714285714284*G0_0_0_2_7 - 0.00482142857142854*G0_0_0_2_8 - 0.00428571428571427*G0_0_0_2_9 - 0.00482142857142855*G0_0_0_3_0 - 0.0267857142857141*G0_0_0_3_1 - 0.00321428571428569*G0_0_0_3_2 - 0.0964285714285709*G0_0_0_3_3 + 0.0401785714285712*G0_0_0_3_4 + 0.00642857142857139*G0_0_0_3_5 + 0.0176785714285713*G0_0_0_3_6 + 0.0241071428571427*G0_0_0_3_7 - 0.0482142857142854*G0_0_0_3_8 - 0.0160714285714285*G0_0_0_3_9 + 0.00160714285714285*G0_0_0_4_0 + 0.0107142857142856*G0_0_0_4_1 - 0.00535714285714283*G0_0_0_4_2 + 0.0401785714285712*G0_0_0_4_3 - 0.0257142857142856*G0_0_0_4_4 + 0.00482142857142857*G0_0_0_4_5 - 0.0224999999999999*G0_0_0_4_6 - 0.00964285714285708*G0_0_0_4_7 + 0.0241071428571427*G0_0_0_4_8 + 0.00321428571428571*G0_0_0_4_9 - 0.00892857142857137*G0_0_0_5_0 - 0.00267857142857142*G0_0_0_5_1 + 0.0039285714285714*G0_0_0_5_2 + 0.00642857142857139*G0_0_0_5_3 + 0.00482142857142857*G0_0_0_5_4 - 0.0899999999999996*G0_0_0_5_5 + 0.020892857142857*G0_0_0_5_6 - 0.0224999999999999*G0_0_0_5_7 + 0.0176785714285714*G0_0_0_5_8 - 0.0225*G0_0_0_5_9 + 0.00392857142857138*G0_0_0_6_0 - 0.00267857142857144*G0_0_0_6_1 - 0.00892857142857138*G0_0_0_6_2 + 0.0176785714285713*G0_0_0_6_3 - 0.0224999999999999*G0_0_0_6_4 + 0.020892857142857*G0_0_0_6_5 - 0.0899999999999997*G0_0_0_6_6 + 0.00482142857142855*G0_0_0_6_7 + 0.00642857142857138*G0_0_0_6_8 - 0.0224999999999999*G0_0_0_6_9 - 0.00535714285714282*G0_0_0_7_0 + 0.0107142857142857*G0_0_0_7_1 + 0.00160714285714284*G0_0_0_7_2 + 0.0241071428571427*G0_0_0_7_3 - 0.00964285714285708*G0_0_0_7_4 - 0.0224999999999999*G0_0_0_7_5 + 0.00482142857142855*G0_0_0_7_6 - 0.0257142857142856*G0_0_0_7_7 + 0.0401785714285712*G0_0_0_7_8 + 0.00321428571428567*G0_0_0_7_9 - 0.0032142857142857*G0_0_0_8_0 - 0.0267857142857141*G0_0_0_8_1 - 0.00482142857142854*G0_0_0_8_2 - 0.0482142857142854*G0_0_0_8_3 + 0.0241071428571427*G0_0_0_8_4 + 0.0176785714285714*G0_0_0_8_5 + 0.00642857142857138*G0_0_0_8_6 + 0.0401785714285712*G0_0_0_8_7 - 0.0964285714285709*G0_0_0_8_8 - 0.0160714285714285*G0_0_0_8_9 - 0.00428571428571429*G0_0_0_9_0 - 0.0107142857142857*G0_0_0_9_1 - 0.00428571428571427*G0_0_0_9_2 - 0.0160714285714285*G0_0_0_9_3 + 0.00321428571428571*G0_0_0_9_4 - 0.0225*G0_0_0_9_5 - 0.0224999999999999*G0_0_0_9_6 + 0.00321428571428567*G0_0_0_9_7 - 0.0160714285714285*G0_0_0_9_8 - 0.0385714285714285*G0_0_0_9_9; + A[7] = 0.0040674603174603*G0_0_0_0_0 + 0.00260416666666665*G0_0_0_0_1 + 0.00109623015873015*G0_0_0_0_2 + 0.00665178571428569*G0_0_0_0_3 - 0.00191964285714284*G0_0_0_0_4 + 0.0013392857142857*G0_0_0_0_5 - 0.00107142857142856*G0_0_0_0_6 - 0.00223214285714285*G0_0_0_0_7 + 0.00607142857142854*G0_0_0_0_8 + 0.00482142857142856*G0_0_0_0_9 + 0.00260416666666665*G0_0_0_1_0 + 0.0318452380952379*G0_0_0_1_1 + 0.00260416666666665*G0_0_0_1_2 + 0.022767857142857*G0_0_0_1_3 - 0.0107142857142856*G0_0_0_1_4 + 0.000223214285714288*G0_0_0_1_5 + 0.000223214285714293*G0_0_0_1_6 - 0.0107142857142856*G0_0_0_1_7 + 0.022767857142857*G0_0_0_1_8 + 0.00267857142857142*G0_0_0_1_9 + 0.00109623015873015*G0_0_0_2_0 + 0.00260416666666665*G0_0_0_2_1 + 0.0040674603174603*G0_0_0_2_2 + 0.00607142857142852*G0_0_0_2_3 - 0.00223214285714284*G0_0_0_2_4 - 0.00107142857142856*G0_0_0_2_5 + 0.00133928571428571*G0_0_0_2_6 - 0.00191964285714284*G0_0_0_2_7 + 0.00665178571428567*G0_0_0_2_8 + 0.00482142857142855*G0_0_0_2_9 + 0.00665178571428569*G0_0_0_3_0 + 0.022767857142857*G0_0_0_3_1 + 0.00607142857142852*G0_0_0_3_2 + 0.104464285714285*G0_0_0_3_3 - 0.0301339285714284*G0_0_0_3_4 - 0.00723214285714282*G0_0_0_3_5 - 0.00683035714285711*G0_0_0_3_6 - 0.0261160714285713*G0_0_0_3_7 + 0.0522321428571425*G0_0_0_3_8 + 0.0441964285714284*G0_0_0_3_9 - 0.00191964285714284*G0_0_0_4_0 - 0.0107142857142856*G0_0_0_4_1 - 0.00223214285714284*G0_0_0_4_2 - 0.0301339285714284*G0_0_0_4_3 + 0.020892857142857*G0_0_0_4_4 - 0.000401785714285722*G0_0_0_4_5 + 0.00723214285714283*G0_0_0_4_6 + 0.00883928571428566*G0_0_0_4_7 - 0.0261160714285713*G0_0_0_4_8 - 0.0136607142857142*G0_0_0_4_9 + 0.0013392857142857*G0_0_0_5_0 + 0.000223214285714288*G0_0_0_5_1 - 0.00107142857142856*G0_0_0_5_2 - 0.00723214285714282*G0_0_0_5_3 - 0.000401785714285722*G0_0_0_5_4 + 0.0208928571428571*G0_0_0_5_5 - 0.00441964285714284*G0_0_0_5_6 + 0.00723214285714283*G0_0_0_5_7 - 0.00683035714285711*G0_0_0_5_8 - 0.000803571428571412*G0_0_0_5_9 - 0.00107142857142856*G0_0_0_6_0 + 0.000223214285714293*G0_0_0_6_1 + 0.00133928571428571*G0_0_0_6_2 - 0.00683035714285711*G0_0_0_6_3 + 0.00723214285714283*G0_0_0_6_4 - 0.00441964285714284*G0_0_0_6_5 + 0.0208928571428571*G0_0_0_6_6 - 0.000401785714285716*G0_0_0_6_7 - 0.0072321428571428*G0_0_0_6_8 - 0.000803571428571415*G0_0_0_6_9 - 0.00223214285714285*G0_0_0_7_0 - 0.0107142857142856*G0_0_0_7_1 - 0.00191964285714284*G0_0_0_7_2 - 0.0261160714285713*G0_0_0_7_3 + 0.00883928571428566*G0_0_0_7_4 + 0.00723214285714283*G0_0_0_7_5 - 0.000401785714285715*G0_0_0_7_6 + 0.020892857142857*G0_0_0_7_7 - 0.0301339285714284*G0_0_0_7_8 - 0.0136607142857142*G0_0_0_7_9 + 0.00607142857142854*G0_0_0_8_0 + 0.022767857142857*G0_0_0_8_1 + 0.00665178571428567*G0_0_0_8_2 + 0.0522321428571426*G0_0_0_8_3 - 0.0261160714285713*G0_0_0_8_4 - 0.00683035714285711*G0_0_0_8_5 - 0.0072321428571428*G0_0_0_8_6 - 0.0301339285714284*G0_0_0_8_7 + 0.104464285714285*G0_0_0_8_8 + 0.0441964285714284*G0_0_0_8_9 + 0.00482142857142856*G0_0_0_9_0 + 0.00267857142857142*G0_0_0_9_1 + 0.00482142857142855*G0_0_0_9_2 + 0.0441964285714284*G0_0_0_9_3 - 0.0136607142857142*G0_0_0_9_4 - 0.00080357142857141*G0_0_0_9_5 - 0.000803571428571414*G0_0_0_9_6 - 0.0136607142857142*G0_0_0_9_7 + 0.0441964285714284*G0_0_0_9_8 + 0.0674999999999998*G0_0_0_9_9; + A[1] = -A[13] + 0.00982142857142852*G0_0_0_0_0 + 0.00112599206349206*G0_0_0_0_1 + 0.00080853174603174*G0_0_0_0_2 + 0.00227678571428571*G0_0_0_0_3 - 0.000937499999999996*G0_0_0_0_4 + 0.00758928571428567*G0_0_0_0_5 - 0.00446428571428569*G0_0_0_0_6 + 0.0058035714285714*G0_0_0_0_7 - 0.00089285714285714*G0_0_0_0_8 + 0.00267857142857143*G0_0_0_0_9 + 0.00112599206349206*G0_0_0_1_0 + 0.00982142857142851*G0_0_0_1_1 + 0.000808531746031739*G0_0_0_1_2 + 0.00758928571428566*G0_0_0_1_3 - 0.00446428571428568*G0_0_0_1_4 + 0.00227678571428571*G0_0_0_1_5 - 0.000937499999999994*G0_0_0_1_6 - 0.000892857142857134*G0_0_0_1_7 + 0.00580357142857139*G0_0_0_1_8 + 0.00267857142857142*G0_0_0_1_9 + 0.00080853174603174*G0_0_0_2_0 + 0.000808531746031739*G0_0_0_2_1 - 0.00248015873015872*G0_0_0_2_2 + 0.00249999999999998*G0_0_0_2_3 - 0.00312499999999999*G0_0_0_2_4 + 0.00249999999999999*G0_0_0_2_5 - 0.00312499999999999*G0_0_0_2_6 + 0.000133928571428574*G0_0_0_2_7 + 0.000133928571428567*G0_0_0_2_8 - 0.000535714285714282*G0_0_0_2_9 + 0.00227678571428571*G0_0_0_3_0 + 0.00758928571428566*G0_0_0_3_1 + 0.00249999999999998*G0_0_0_3_2 + 0.0401785714285712*G0_0_0_3_3 - 0.00522321428571424*G0_0_0_3_4 - 0.00562499999999997*G0_0_0_3_5 + 0.000401785714285715*G0_0_0_3_6 - 0.00924107142857139*G0_0_0_3_7 + 0.0120535714285714*G0_0_0_3_8 + 0.0104464285714285*G0_0_0_3_9 - 0.000937499999999996*G0_0_0_4_0 - 0.00446428571428568*G0_0_0_4_1 - 0.00312499999999999*G0_0_0_4_2 - 0.00522321428571424*G0_0_0_4_3 + 0.00482142857142854*G0_0_0_4_4 + 0.000401785714285705*G0_0_0_4_5 - 0.000803571428571426*G0_0_0_4_6 + 0.00241071428571427*G0_0_0_4_7 - 0.00281249999999997*G0_0_0_4_8 + 0.000803571428571427*G0_0_0_4_9 + 0.00758928571428567*G0_0_0_5_0 + 0.00227678571428571*G0_0_0_5_1 + 0.00249999999999999*G0_0_0_5_2 - 0.00562499999999997*G0_0_0_5_3 + 0.000401785714285705*G0_0_0_5_4 + 0.0401785714285713*G0_0_0_5_5 - 0.00522321428571425*G0_0_0_5_6 + 0.0120535714285714*G0_0_0_5_7 - 0.0092410714285714*G0_0_0_5_8 + 0.0104464285714286*G0_0_0_5_9 - 0.00446428571428569*G0_0_0_6_0 - 0.000937499999999994*G0_0_0_6_1 - 0.00312499999999999*G0_0_0_6_2 + 0.000401785714285715*G0_0_0_6_3 - 0.000803571428571426*G0_0_0_6_4 - 0.00522321428571425*G0_0_0_6_5 + 0.00482142857142855*G0_0_0_6_6 - 0.00281249999999999*G0_0_0_6_7 + 0.00241071428571428*G0_0_0_6_8 + 0.000803571428571417*G0_0_0_6_9 + 0.0058035714285714*G0_0_0_7_0 - 0.000892857142857134*G0_0_0_7_1 + 0.000133928571428574*G0_0_0_7_2 - 0.00924107142857139*G0_0_0_7_3 + 0.00241071428571427*G0_0_0_7_4 + 0.0120535714285714*G0_0_0_7_5 - 0.00281249999999999*G0_0_0_7_6 + 0.00803571428571425*G0_0_0_7_7 - 0.0148660714285714*G0_0_0_7_8 - 0.00241071428571426*G0_0_0_7_9 - 0.00089285714285714*G0_0_0_8_0 + 0.00580357142857139*G0_0_0_8_1 + 0.000133928571428568*G0_0_0_8_2 + 0.0120535714285714*G0_0_0_8_3 - 0.00281249999999998*G0_0_0_8_4 - 0.0092410714285714*G0_0_0_8_5 + 0.00241071428571428*G0_0_0_8_6 - 0.0148660714285714*G0_0_0_8_7 + 0.00803571428571423*G0_0_0_8_8 - 0.00241071428571428*G0_0_0_8_9 + 0.00267857142857143*G0_0_0_9_0 + 0.00267857142857142*G0_0_0_9_1 - 0.000535714285714282*G0_0_0_9_2 + 0.0104464285714285*G0_0_0_9_3 + 0.000803571428571427*G0_0_0_9_4 + 0.0104464285714286*G0_0_0_9_5 + 0.000803571428571416*G0_0_0_9_6 - 0.00241071428571426*G0_0_0_9_7 - 0.00241071428571429*G0_0_0_9_8 + 0.00964285714285713*G0_0_0_9_9 + 0.0123015873015872*G0_1_0_0_0 + 0.000317460317460314*G0_1_0_0_1 + 0.00214285714285714*G0_1_0_0_3 - 0.00107142857142857*G0_1_0_0_4 + 0.0107142857142857*G0_1_0_0_5 - 0.00696428571428569*G0_1_0_0_6 + 0.00892857142857137*G0_1_0_0_7 - 0.00339285714285712*G0_1_0_0_8 + 0.00321428571428571*G0_1_0_0_9 + 0.000317460317460314*G0_1_0_1_0 - 0.000317460317460317*G0_1_0_1_2 + 0.00178571428571429*G0_1_0_1_3 - 0.00357142857142856*G0_1_0_1_4 + 0.0032142857142857*G0_1_0_1_5 - 0.00321428571428571*G0_1_0_1_6 + 0.00357142857142855*G0_1_0_1_7 - 0.00178571428571427*G0_1_0_1_8 - 0.000317460317460317*G0_1_0_2_1 - 0.0123015873015872*G0_1_0_2_2 + 0.00339285714285712*G0_1_0_2_3 - 0.00892857142857139*G0_1_0_2_4 + 0.00696428571428568*G0_1_0_2_5 - 0.0107142857142857*G0_1_0_2_6 + 0.00107142857142857*G0_1_0_2_7 - 0.00214285714285713*G0_1_0_2_8 - 0.00321428571428569*G0_1_0_2_9 + 0.00214285714285714*G0_1_0_3_0 + 0.00178571428571429*G0_1_0_3_1 + 0.00339285714285712*G0_1_0_3_2 + 0.032142857142857*G0_1_0_3_3 + 0.0096428571428571*G0_1_0_3_4 - 0.00803571428571425*G0_1_0_3_5 + 0.0096428571428571*G0_1_0_3_6 - 0.00642857142857142*G0_1_0_3_7 + 0.0128571428571428*G0_1_0_3_9 - 0.00107142857142857*G0_1_0_4_0 - 0.00357142857142856*G0_1_0_4_1 - 0.00892857142857139*G0_1_0_4_2 + 0.0096428571428571*G0_1_0_4_3 - 0.00321428571428569*G0_1_0_4_4 + 0.00321428571428569*G0_1_0_4_5 - 0.0128571428571428*G0_1_0_4_6 + 0.00642857142857138*G0_1_0_4_8 + 0.0032142857142857*G0_1_0_4_9 + 0.0107142857142857*G0_1_0_5_0 + 0.0032142857142857*G0_1_0_5_1 + 0.00696428571428568*G0_1_0_5_2 - 0.00803571428571425*G0_1_0_5_3 + 0.00321428571428569*G0_1_0_5_4 + 0.0353571428571427*G0_1_0_5_5 + 0.0128571428571428*G0_1_0_5_7 - 0.00964285714285712*G0_1_0_5_8 + 0.00964285714285714*G0_1_0_5_9 - 0.00696428571428568*G0_1_0_6_0 - 0.00321428571428571*G0_1_0_6_1 - 0.0107142857142857*G0_1_0_6_2 + 0.0096428571428571*G0_1_0_6_3 - 0.0128571428571428*G0_1_0_6_4 - 0.0353571428571428*G0_1_0_6_6 - 0.00321428571428571*G0_1_0_6_7 + 0.00803571428571424*G0_1_0_6_8 - 0.00964285714285712*G0_1_0_6_9 + 0.00892857142857137*G0_1_0_7_0 + 0.00357142857142855*G0_1_0_7_1 + 0.00107142857142857*G0_1_0_7_2 - 0.00642857142857141*G0_1_0_7_3 + 0.0128571428571428*G0_1_0_7_5 - 0.00321428571428571*G0_1_0_7_6 + 0.00321428571428572*G0_1_0_7_7 - 0.00964285714285712*G0_1_0_7_8 - 0.00321428571428569*G0_1_0_7_9 - 0.00339285714285712*G0_1_0_8_0 - 0.00178571428571426*G0_1_0_8_1 - 0.00214285714285713*G0_1_0_8_2 + 0.00642857142857138*G0_1_0_8_4 - 0.00964285714285711*G0_1_0_8_5 + 0.00803571428571424*G0_1_0_8_6 - 0.00964285714285711*G0_1_0_8_7 - 0.0321428571428569*G0_1_0_8_8 - 0.0128571428571428*G0_1_0_8_9 + 0.00321428571428571*G0_1_0_9_0 - 0.00321428571428569*G0_1_0_9_2 + 0.0128571428571428*G0_1_0_9_3 + 0.0032142857142857*G0_1_0_9_4 + 0.00964285714285714*G0_1_0_9_5 - 0.00964285714285712*G0_1_0_9_6 - 0.00321428571428569*G0_1_0_9_7 - 0.0128571428571428*G0_1_0_9_8; + A[34] = -0.00317460317460314*G0_0_0_0_0 - 0.000873015873015868*G0_0_0_0_2 + 0.00428571428571428*G0_0_0_0_3 + 0.00214285714285715*G0_0_0_0_4 - 0.00357142857142855*G0_0_0_0_5 + 0.00285714285714283*G0_0_0_0_6 - 0.00357142857142854*G0_0_0_0_7 + 0.00285714285714284*G0_0_0_0_8 + 0.00857142857142854*G0_0_0_0_9 + 0.00317460317460313*G0_0_0_1_1 + 0.000873015873015866*G0_0_0_1_2 + 0.00357142857142854*G0_0_0_1_3 - 0.00285714285714283*G0_0_0_1_4 - 0.00428571428571427*G0_0_0_1_5 - 0.00214285714285714*G0_0_0_1_6 - 0.00285714285714284*G0_0_0_1_7 + 0.00357142857142854*G0_0_0_1_8 - 0.00857142857142854*G0_0_0_1_9 - 0.000873015873015868*G0_0_0_2_0 + 0.000873015873015866*G0_0_0_2_1 - 0.00214285714285713*G0_0_0_2_7 + 0.00214285714285713*G0_0_0_2_8 + 0.00428571428571428*G0_0_0_3_0 + 0.00357142857142854*G0_0_0_3_1 + 0.0771428571428567*G0_0_0_3_3 - 0.00642857142857137*G0_0_0_3_4 + 0.0064285714285714*G0_0_0_3_6 - 0.0128571428571428*G0_0_0_3_7 + 0.0192857142857142*G0_0_0_3_8 + 0.0514285714285712*G0_0_0_3_9 + 0.00214285714285715*G0_0_0_4_0 - 0.00285714285714283*G0_0_0_4_1 - 0.00642857142857137*G0_0_0_4_3 + 0.064285714285714*G0_0_0_4_4 - 0.0064285714285714*G0_0_0_4_5 - 0.00642857142857139*G0_0_0_4_8 + 0.0128571428571428*G0_0_0_4_9 - 0.00357142857142855*G0_0_0_5_0 - 0.00428571428571427*G0_0_0_5_1 - 0.0064285714285714*G0_0_0_5_4 - 0.0771428571428568*G0_0_0_5_5 + 0.00642857142857138*G0_0_0_5_6 - 0.0192857142857142*G0_0_0_5_7 + 0.0128571428571428*G0_0_0_5_8 - 0.0514285714285713*G0_0_0_5_9 + 0.00285714285714283*G0_0_0_6_0 - 0.00214285714285714*G0_0_0_6_1 + 0.0064285714285714*G0_0_0_6_3 + 0.00642857142857138*G0_0_0_6_5 - 0.064285714285714*G0_0_0_6_6 + 0.00642857142857139*G0_0_0_6_7 - 0.0128571428571428*G0_0_0_6_9 - 0.00357142857142854*G0_0_0_7_0 - 0.00285714285714284*G0_0_0_7_1 - 0.00214285714285713*G0_0_0_7_2 - 0.0128571428571428*G0_0_0_7_3 - 0.0192857142857142*G0_0_0_7_5 + 0.00642857142857139*G0_0_0_7_6 - 0.0128571428571428*G0_0_0_7_7 - 0.0385714285714284*G0_0_0_7_9 + 0.00285714285714284*G0_0_0_8_0 + 0.00357142857142854*G0_0_0_8_1 + 0.00214285714285713*G0_0_0_8_2 + 0.0192857142857142*G0_0_0_8_3 - 0.00642857142857139*G0_0_0_8_4 + 0.0128571428571428*G0_0_0_8_5 + 0.0128571428571427*G0_0_0_8_8 + 0.0385714285714284*G0_0_0_8_9 + 0.00857142857142854*G0_0_0_9_0 - 0.00857142857142854*G0_0_0_9_1 + 0.0514285714285712*G0_0_0_9_3 + 0.0128571428571428*G0_0_0_9_4 - 0.0514285714285713*G0_0_0_9_5 - 0.0128571428571428*G0_0_0_9_6 - 0.0385714285714284*G0_0_0_9_7 + 0.0385714285714284*G0_0_0_9_8 + 0.0539682539682537*G0_0_1_0_0 + 0.00373015873015871*G0_0_1_0_1 + 0.00373015873015871*G0_0_1_0_2 + 0.00142857142857143*G0_0_1_0_3 + 0.00142857142857143*G0_0_1_0_4 + 0.039285714285714*G0_0_1_0_5 - 0.0185714285714285*G0_0_1_0_6 + 0.0392857142857141*G0_0_1_0_7 - 0.0185714285714285*G0_0_1_0_8 + 0.00857142857142858*G0_0_1_0_9 + 0.00373015873015871*G0_0_1_1_0 + 0.00158730158730156*G0_0_1_1_1 + 0.00158730158730158*G0_0_1_1_2 - 0.00214285714285712*G0_0_1_1_4 + 0.00999999999999995*G0_0_1_1_5 - 0.00499999999999998*G0_0_1_1_6 + 0.0121428571428571*G0_0_1_1_7 - 0.00714285714285712*G0_0_1_1_8 + 0.00428571428571428*G0_0_1_1_9 + 0.00373015873015871*G0_0_1_2_0 + 0.00158730158730158*G0_0_1_2_1 + 0.00158730158730158*G0_0_1_2_2 - 0.00214285714285714*G0_0_1_2_3 + 0.0121428571428571*G0_0_1_2_5 - 0.00714285714285711*G0_0_1_2_6 + 0.00999999999999995*G0_0_1_2_7 - 0.00499999999999998*G0_0_1_2_8 + 0.00428571428571428*G0_0_1_2_9 + 0.00142857142857143*G0_0_1_3_0 - 0.00214285714285714*G0_0_1_3_2 + 0.0578571428571425*G0_0_1_3_3 - 0.0128571428571428*G0_0_1_3_5 + 0.0064285714285714*G0_0_1_3_6 - 0.0128571428571428*G0_0_1_3_7 + 0.0064285714285714*G0_0_1_3_8 + 0.0128571428571428*G0_0_1_3_9 + 0.00142857142857143*G0_0_1_4_0 - 0.00214285714285712*G0_0_1_4_1 + 0.0578571428571426*G0_0_1_4_4 - 0.0128571428571428*G0_0_1_4_5 + 0.00642857142857143*G0_0_1_4_6 - 0.0128571428571428*G0_0_1_4_7 + 0.00642857142857141*G0_0_1_4_8 + 0.0128571428571428*G0_0_1_4_9 + 0.039285714285714*G0_0_1_5_0 + 0.00999999999999995*G0_0_1_5_1 + 0.0121428571428571*G0_0_1_5_2 - 0.0128571428571428*G0_0_1_5_3 - 0.0128571428571428*G0_0_1_5_4 + 0.147857142857142*G0_0_1_5_5 - 0.0449999999999998*G0_0_1_5_6 + 0.0771428571428568*G0_0_1_5_7 - 0.0385714285714284*G0_0_1_5_8 + 0.0514285714285713*G0_0_1_5_9 - 0.0185714285714285*G0_0_1_6_0 - 0.00499999999999998*G0_0_1_6_1 - 0.00714285714285711*G0_0_1_6_2 + 0.0064285714285714*G0_0_1_6_3 + 0.00642857142857143*G0_0_1_6_4 - 0.0449999999999998*G0_0_1_6_5 - 0.00642857142857144*G0_0_1_6_6 - 0.0385714285714284*G0_0_1_6_7 + 0.0192857142857142*G0_0_1_6_8 - 0.0257142857142856*G0_0_1_6_9 + 0.0392857142857141*G0_0_1_7_0 + 0.0121428571428571*G0_0_1_7_1 + 0.00999999999999995*G0_0_1_7_2 - 0.0128571428571428*G0_0_1_7_3 - 0.0128571428571428*G0_0_1_7_4 + 0.0771428571428568*G0_0_1_7_5 - 0.0385714285714284*G0_0_1_7_6 + 0.147857142857142*G0_0_1_7_7 - 0.0449999999999998*G0_0_1_7_8 + 0.0514285714285713*G0_0_1_7_9 - 0.0185714285714285*G0_0_1_8_0 - 0.00714285714285712*G0_0_1_8_1 - 0.00499999999999998*G0_0_1_8_2 + 0.0064285714285714*G0_0_1_8_3 + 0.00642857142857141*G0_0_1_8_4 - 0.0385714285714284*G0_0_1_8_5 + 0.0192857142857142*G0_0_1_8_6 - 0.0449999999999998*G0_0_1_8_7 - 0.00642857142857138*G0_0_1_8_8 - 0.0257142857142857*G0_0_1_8_9 + 0.00857142857142858*G0_0_1_9_0 + 0.00428571428571428*G0_0_1_9_1 + 0.00428571428571428*G0_0_1_9_2 + 0.0128571428571428*G0_0_1_9_3 + 0.0128571428571428*G0_0_1_9_4 + 0.0514285714285713*G0_0_1_9_5 - 0.0257142857142856*G0_0_1_9_6 + 0.0514285714285713*G0_0_1_9_7 - 0.0257142857142857*G0_0_1_9_8 + 0.0771428571428569*G0_0_1_9_9 + 0.00158730158730158*G0_1_0_0_0 + 0.000158730158730156*G0_1_0_0_1 + 0.000158730158730155*G0_1_0_0_2 + 0.00499999999999999*G0_1_0_0_3 + 0.005*G0_1_0_0_4 - 0.00357142857142856*G0_1_0_0_5 + 0.00285714285714286*G0_1_0_0_6 - 0.00357142857142856*G0_1_0_0_7 + 0.00285714285714284*G0_1_0_0_8 + 0.00857142857142857*G0_1_0_0_9 + 0.000158730158730156*G0_1_0_1_0 + 0.00476190476190471*G0_1_0_1_1 + 0.00103174603174602*G0_1_0_1_2 + 0.000714285714285709*G0_1_0_1_5 + 0.00285714285714285*G0_1_0_1_6 + 0.000158730158730155*G0_1_0_2_0 + 0.00103174603174602*G0_1_0_2_1 + 0.00476190476190472*G0_1_0_2_2 + 0.000714285714285713*G0_1_0_2_7 + 0.00285714285714284*G0_1_0_2_8 + 0.00499999999999999*G0_1_0_3_0 + 0.0964285714285709*G0_1_0_3_3 - 0.0192857142857141*G0_1_0_3_4 - 0.0064285714285714*G0_1_0_3_5 - 0.0128571428571428*G0_1_0_3_6 - 0.0192857142857142*G0_1_0_3_7 + 0.032142857142857*G0_1_0_3_8 + 0.0385714285714285*G0_1_0_3_9 + 0.005*G0_1_0_4_0 - 0.0192857142857141*G0_1_0_4_3 + 0.0964285714285709*G0_1_0_4_4 - 0.0192857142857142*G0_1_0_4_5 + 0.032142857142857*G0_1_0_4_6 - 0.00642857142857141*G0_1_0_4_7 - 0.0128571428571428*G0_1_0_4_8 + 0.0385714285714284*G0_1_0_4_9 - 0.00357142857142856*G0_1_0_5_0 + 0.000714285714285709*G0_1_0_5_1 - 0.0064285714285714*G0_1_0_5_3 - 0.0192857142857142*G0_1_0_5_4 + 0.0192857142857142*G0_1_0_5_5 - 0.0128571428571428*G0_1_0_5_6 + 0.0128571428571428*G0_1_0_5_7 - 0.0064285714285714*G0_1_0_5_8 - 0.0128571428571428*G0_1_0_5_9 + 0.00285714285714285*G0_1_0_6_0 + 0.00285714285714285*G0_1_0_6_1 - 0.0128571428571428*G0_1_0_6_3 + 0.032142857142857*G0_1_0_6_4 - 0.0128571428571428*G0_1_0_6_5 + 0.032142857142857*G0_1_0_6_6 - 0.00642857142857139*G0_1_0_6_7 - 0.00642857142857139*G0_1_0_6_8 + 0.0257142857142856*G0_1_0_6_9 - 0.00357142857142856*G0_1_0_7_0 + 0.000714285714285713*G0_1_0_7_2 - 0.0192857142857142*G0_1_0_7_3 - 0.00642857142857141*G0_1_0_7_4 + 0.0128571428571428*G0_1_0_7_5 - 0.00642857142857139*G0_1_0_7_6 + 0.0192857142857142*G0_1_0_7_7 - 0.0128571428571428*G0_1_0_7_8 - 0.0128571428571428*G0_1_0_7_9 + 0.00285714285714284*G0_1_0_8_0 + 0.00285714285714284*G0_1_0_8_2 + 0.032142857142857*G0_1_0_8_3 - 0.0128571428571428*G0_1_0_8_4 - 0.0064285714285714*G0_1_0_8_5 - 0.00642857142857139*G0_1_0_8_6 - 0.0128571428571428*G0_1_0_8_7 + 0.0321428571428569*G0_1_0_8_8 + 0.0257142857142856*G0_1_0_8_9 + 0.00857142857142857*G0_1_0_9_0 + 0.0385714285714285*G0_1_0_9_3 + 0.0385714285714284*G0_1_0_9_4 - 0.0128571428571428*G0_1_0_9_5 + 0.0257142857142856*G0_1_0_9_6 - 0.0128571428571428*G0_1_0_9_7 + 0.0257142857142856*G0_1_0_9_8 + 0.231428571428571*G0_1_0_9_9 - 0.00317460317460315*G0_1_1_0_0 - 0.000873015873015869*G0_1_1_0_1 + 0.00214285714285714*G0_1_1_0_3 + 0.00428571428571429*G0_1_1_0_4 - 0.00357142857142855*G0_1_1_0_5 + 0.00285714285714285*G0_1_1_0_6 - 0.00357142857142856*G0_1_1_0_7 + 0.00285714285714284*G0_1_1_0_8 + 0.00857142857142855*G0_1_1_0_9 - 0.000873015873015869*G0_1_1_1_0 + 0.000873015873015866*G0_1_1_1_2 - 0.00214285714285713*G0_1_1_1_5 + 0.00214285714285714*G0_1_1_1_6 + 0.000873015873015866*G0_1_1_2_1 + 0.00317460317460314*G0_1_1_2_2 - 0.00285714285714284*G0_1_1_2_3 + 0.00357142857142854*G0_1_1_2_4 - 0.00285714285714284*G0_1_1_2_5 + 0.00357142857142854*G0_1_1_2_6 - 0.00428571428571426*G0_1_1_2_7 - 0.00214285714285713*G0_1_1_2_8 - 0.00857142857142854*G0_1_1_2_9 + 0.00214285714285714*G0_1_1_3_0 - 0.00285714285714284*G0_1_1_3_2 + 0.0642857142857139*G0_1_1_3_3 - 0.00642857142857136*G0_1_1_3_4 - 0.00642857142857139*G0_1_1_3_6 - 0.00642857142857139*G0_1_1_3_7 + 0.0128571428571428*G0_1_1_3_9 + 0.00428571428571429*G0_1_1_4_0 + 0.00357142857142854*G0_1_1_4_2 - 0.00642857142857137*G0_1_1_4_3 + 0.0771428571428568*G0_1_1_4_4 - 0.0128571428571428*G0_1_1_4_5 + 0.0192857142857142*G0_1_1_4_6 + 0.00642857142857139*G0_1_1_4_8 + 0.0514285714285713*G0_1_1_4_9 - 0.00357142857142855*G0_1_1_5_0 - 0.00214285714285713*G0_1_1_5_1 - 0.00285714285714284*G0_1_1_5_2 - 0.0128571428571428*G0_1_1_5_4 - 0.0128571428571428*G0_1_1_5_5 - 0.0192857142857142*G0_1_1_5_7 + 0.0064285714285714*G0_1_1_5_8 - 0.0385714285714284*G0_1_1_5_9 + 0.00285714285714285*G0_1_1_6_0 + 0.00214285714285714*G0_1_1_6_1 + 0.00357142857142854*G0_1_1_6_2 - 0.00642857142857139*G0_1_1_6_3 + 0.0192857142857142*G0_1_1_6_4 + 0.0128571428571428*G0_1_1_6_6 + 0.0128571428571428*G0_1_1_6_7 + 0.0385714285714284*G0_1_1_6_9 - 0.00357142857142856*G0_1_1_7_0 - 0.00428571428571426*G0_1_1_7_2 - 0.00642857142857139*G0_1_1_7_3 - 0.0192857142857142*G0_1_1_7_5 + 0.0128571428571428*G0_1_1_7_6 - 0.0771428571428567*G0_1_1_7_7 + 0.00642857142857143*G0_1_1_7_8 - 0.0514285714285712*G0_1_1_7_9 + 0.00285714285714284*G0_1_1_8_0 - 0.00214285714285713*G0_1_1_8_2 + 0.00642857142857139*G0_1_1_8_4 + 0.00642857142857141*G0_1_1_8_5 + 0.00642857142857143*G0_1_1_8_7 - 0.064285714285714*G0_1_1_8_8 - 0.0128571428571428*G0_1_1_8_9 + 0.00857142857142855*G0_1_1_9_0 - 0.00857142857142854*G0_1_1_9_2 + 0.0128571428571428*G0_1_1_9_3 + 0.0514285714285713*G0_1_1_9_4 - 0.0385714285714284*G0_1_1_9_5 + 0.0385714285714284*G0_1_1_9_6 - 0.0514285714285712*G0_1_1_9_7 - 0.0128571428571428*G0_1_1_9_8; + A[33] = -A[34] + 0.0555555555555553*G0_0_1_0_0 + 0.003015873015873*G0_0_1_0_2 - 0.0128571428571428*G0_0_1_0_3 + 0.00428571428571426*G0_0_1_0_4 + 0.0428571428571426*G0_0_1_0_5 - 0.0192857142857142*G0_0_1_0_6 + 0.0499999999999997*G0_0_1_0_7 - 0.0335714285714284*G0_0_1_0_8 - 0.00428571428571424*G0_0_1_0_9 - 0.0555555555555552*G0_0_1_1_1 - 0.00301587301587299*G0_0_1_1_2 - 0.0428571428571426*G0_0_1_1_3 + 0.0192857142857141*G0_0_1_1_4 + 0.0128571428571428*G0_0_1_1_5 - 0.00428571428571428*G0_0_1_1_6 + 0.0335714285714284*G0_0_1_1_7 - 0.0499999999999997*G0_0_1_1_8 + 0.00428571428571428*G0_0_1_1_9 + 0.003015873015873*G0_0_1_2_0 - 0.00301587301587299*G0_0_1_2_1 - 0.0142857142857142*G0_0_1_2_3 + 0.00714285714285709*G0_0_1_2_4 + 0.0142857142857142*G0_0_1_2_5 - 0.00714285714285711*G0_0_1_2_6 + 0.017142857142857*G0_0_1_2_7 - 0.017142857142857*G0_0_1_2_8 - 0.0128571428571428*G0_0_1_3_0 - 0.0428571428571426*G0_0_1_3_1 - 0.0142857142857142*G0_0_1_3_2 - 0.167142857142856*G0_0_1_3_3 + 0.0514285714285711*G0_0_1_3_4 + 0.0128571428571428*G0_0_1_3_6 + 0.0385714285714284*G0_0_1_3_7 - 0.0899999999999995*G0_0_1_3_8 - 0.0899999999999997*G0_0_1_3_9 + 0.00428571428571426*G0_0_1_4_0 + 0.0192857142857141*G0_0_1_4_1 + 0.00714285714285709*G0_0_1_4_2 + 0.0514285714285711*G0_0_1_4_3 - 0.0128571428571428*G0_0_1_4_5 - 0.032142857142857*G0_0_1_4_7 + 0.0514285714285711*G0_0_1_4_8 + 0.0257142857142856*G0_0_1_4_9 + 0.0428571428571426*G0_0_1_5_0 + 0.0128571428571428*G0_0_1_5_1 + 0.0142857142857142*G0_0_1_5_2 - 0.0128571428571428*G0_0_1_5_4 + 0.167142857142856*G0_0_1_5_5 - 0.0514285714285712*G0_0_1_5_6 + 0.0899999999999996*G0_0_1_5_7 - 0.0385714285714284*G0_0_1_5_8 + 0.0899999999999997*G0_0_1_5_9 - 0.0192857142857142*G0_0_1_6_0 - 0.00428571428571428*G0_0_1_6_1 - 0.00714285714285711*G0_0_1_6_2 + 0.0128571428571428*G0_0_1_6_3 - 0.0514285714285712*G0_0_1_6_5 - 0.0514285714285712*G0_0_1_6_7 + 0.032142857142857*G0_0_1_6_8 - 0.0257142857142856*G0_0_1_6_9 + 0.0499999999999997*G0_0_1_7_0 + 0.0335714285714284*G0_0_1_7_1 + 0.017142857142857*G0_0_1_7_2 + 0.0385714285714284*G0_0_1_7_3 - 0.032142857142857*G0_0_1_7_4 + 0.0899999999999996*G0_0_1_7_5 - 0.0514285714285712*G0_0_1_7_6 + 0.167142857142856*G0_0_1_7_7 + 0.115714285714285*G0_0_1_7_9 - 0.0335714285714284*G0_0_1_8_0 - 0.0499999999999997*G0_0_1_8_1 - 0.017142857142857*G0_0_1_8_2 - 0.0899999999999995*G0_0_1_8_3 + 0.0514285714285711*G0_0_1_8_4 - 0.0385714285714284*G0_0_1_8_5 + 0.032142857142857*G0_0_1_8_6 - 0.167142857142856*G0_0_1_8_8 - 0.115714285714285*G0_0_1_8_9 - 0.00428571428571424*G0_0_1_9_0 + 0.00428571428571428*G0_0_1_9_1 - 0.0899999999999997*G0_0_1_9_3 + 0.0257142857142856*G0_0_1_9_4 + 0.0899999999999997*G0_0_1_9_5 - 0.0257142857142856*G0_0_1_9_6 + 0.115714285714285*G0_0_1_9_7 - 0.115714285714285*G0_0_1_9_8 - 0.00634920634920631*G0_1_1_0_0 - 0.0056349206349206*G0_1_1_0_1 - 0.000873015873015868*G0_1_1_0_2 - 0.0149999999999999*G0_1_1_0_3 + 0.00642857142857141*G0_1_1_0_4 + 0.00214285714285713*G0_1_1_0_6 + 0.00714285714285711*G0_1_1_0_7 - 0.0121428571428571*G0_1_1_0_8 - 0.00428571428571429*G0_1_1_0_9 - 0.0056349206349206*G0_1_1_1_0 - 0.0619047619047615*G0_1_1_1_1 - 0.00388888888888886*G0_1_1_1_2 - 0.0428571428571426*G0_1_1_1_3 + 0.0214285714285713*G0_1_1_1_4 - 0.00214285714285714*G0_1_1_1_5 + 0.00214285714285712*G0_1_1_1_6 + 0.0214285714285713*G0_1_1_1_7 - 0.0428571428571426*G0_1_1_1_8 - 0.000873015873015868*G0_1_1_2_0 - 0.00388888888888886*G0_1_1_2_1 - 0.0178571428571427*G0_1_1_2_3 + 0.0142857142857142*G0_1_1_2_4 - 0.00357142857142855*G0_1_1_2_5 + 0.00714285714285709*G0_1_1_2_6 - 0.00214285714285713*G0_1_1_2_7 - 0.0192857142857141*G0_1_1_2_8 - 0.0214285714285713*G0_1_1_2_9 - 0.0149999999999999*G0_1_1_3_0 - 0.0428571428571426*G0_1_1_3_1 - 0.0178571428571427*G0_1_1_3_2 - 0.192857142857142*G0_1_1_3_3 + 0.0578571428571425*G0_1_1_3_4 + 0.0192857142857142*G0_1_1_3_5 + 0.00642857142857139*G0_1_1_3_6 + 0.0578571428571426*G0_1_1_3_7 - 0.128571428571428*G0_1_1_3_8 - 0.115714285714285*G0_1_1_3_9 + 0.00642857142857141*G0_1_1_4_0 + 0.0214285714285713*G0_1_1_4_1 + 0.0142857142857142*G0_1_1_4_2 + 0.0578571428571425*G0_1_1_4_3 - 0.00642857142857139*G0_1_1_4_5 - 0.0128571428571428*G0_1_1_4_7 + 0.0707142857142852*G0_1_1_4_8 + 0.0771428571428568*G0_1_1_4_9 - 0.00214285714285714*G0_1_1_5_1 - 0.00357142857142855*G0_1_1_5_2 + 0.0192857142857142*G0_1_1_5_3 - 0.00642857142857139*G0_1_1_5_4 - 0.0257142857142856*G0_1_1_5_5 + 0.00642857142857139*G0_1_1_5_6 - 0.0385714285714284*G0_1_1_5_7 + 0.0192857142857142*G0_1_1_5_8 - 0.0257142857142856*G0_1_1_5_9 + 0.00214285714285713*G0_1_1_6_0 + 0.00214285714285713*G0_1_1_6_1 + 0.00714285714285709*G0_1_1_6_2 + 0.00642857142857138*G0_1_1_6_3 + 0.00642857142857139*G0_1_1_6_5 + 0.0192857142857142*G0_1_1_6_7 + 0.0192857142857141*G0_1_1_6_8 + 0.0514285714285712*G0_1_1_6_9 + 0.00714285714285711*G0_1_1_7_0 + 0.0214285714285713*G0_1_1_7_1 - 0.00214285714285713*G0_1_1_7_2 + 0.0578571428571426*G0_1_1_7_3 - 0.0128571428571428*G0_1_1_7_4 - 0.0385714285714284*G0_1_1_7_5 + 0.0192857142857142*G0_1_1_7_6 - 0.154285714285713*G0_1_1_7_7 + 0.0707142857142853*G0_1_1_7_8 - 0.0257142857142856*G0_1_1_7_9 - 0.0121428571428571*G0_1_1_8_0 - 0.0428571428571426*G0_1_1_8_1 - 0.0192857142857141*G0_1_1_8_2 - 0.128571428571428*G0_1_1_8_3 + 0.0707142857142852*G0_1_1_8_4 + 0.0192857142857142*G0_1_1_8_5 + 0.0192857142857141*G0_1_1_8_6 + 0.0707142857142853*G0_1_1_8_7 - 0.32142857142857*G0_1_1_8_8 - 0.141428571428571*G0_1_1_8_9 - 0.00428571428571429*G0_1_1_9_0 - 0.0214285714285713*G0_1_1_9_2 - 0.115714285714285*G0_1_1_9_3 + 0.0771428571428568*G0_1_1_9_4 - 0.0257142857142856*G0_1_1_9_5 + 0.0514285714285712*G0_1_1_9_6 - 0.0257142857142856*G0_1_1_9_7 - 0.141428571428571*G0_1_1_9_8 - 0.308571428571428*G0_1_1_9_9; + A[21] = -A[33] + 0.00634920634920631*G0_0_0_0_0 + 0.000873015873015875*G0_0_0_0_1 + 0.00563492063492061*G0_0_0_0_2 - 0.00642857142857142*G0_0_0_0_3 + 0.015*G0_0_0_0_4 - 0.00714285714285714*G0_0_0_0_5 + 0.0121428571428572*G0_0_0_0_6 - 0.00214285714285713*G0_0_0_0_8 + 0.00428571428571431*G0_0_0_0_9 + 0.000873015873015875*G0_0_0_1_0 + 0.00388888888888887*G0_0_0_1_2 - 0.0142857142857142*G0_0_0_1_3 + 0.0178571428571428*G0_0_0_1_4 + 0.00214285714285713*G0_0_0_1_5 + 0.0192857142857142*G0_0_0_1_6 + 0.00357142857142855*G0_0_0_1_7 - 0.00714285714285709*G0_0_0_1_8 + 0.0214285714285714*G0_0_0_1_9 + 0.00563492063492061*G0_0_0_2_0 + 0.00388888888888887*G0_0_0_2_1 + 0.0619047619047615*G0_0_0_2_2 - 0.0214285714285713*G0_0_0_2_3 + 0.0428571428571425*G0_0_0_2_4 - 0.0214285714285713*G0_0_0_2_5 + 0.0428571428571425*G0_0_0_2_6 + 0.00214285714285714*G0_0_0_2_7 - 0.00214285714285712*G0_0_0_2_8 - 0.00642857142857142*G0_0_0_3_0 - 0.0142857142857142*G0_0_0_3_1 - 0.0214285714285713*G0_0_0_3_2 - 0.0578571428571425*G0_0_0_3_4 + 0.0128571428571428*G0_0_0_3_5 - 0.0707142857142853*G0_0_0_3_6 + 0.00642857142857139*G0_0_0_3_7 - 0.0771428571428568*G0_0_0_3_9 + 0.015*G0_0_0_4_0 + 0.0178571428571428*G0_0_0_4_1 + 0.0428571428571425*G0_0_0_4_2 - 0.0578571428571425*G0_0_0_4_3 + 0.192857142857142*G0_0_0_4_4 - 0.0578571428571426*G0_0_0_4_5 + 0.128571428571428*G0_0_0_4_6 - 0.0192857142857142*G0_0_0_4_7 - 0.0064285714285714*G0_0_0_4_8 + 0.115714285714285*G0_0_0_4_9 - 0.00714285714285714*G0_0_0_5_0 + 0.00214285714285713*G0_0_0_5_1 - 0.0214285714285713*G0_0_0_5_2 + 0.0128571428571428*G0_0_0_5_3 - 0.0578571428571426*G0_0_0_5_4 + 0.154285714285714*G0_0_0_5_5 - 0.0707142857142853*G0_0_0_5_6 + 0.0385714285714284*G0_0_0_5_7 - 0.0192857142857142*G0_0_0_5_8 + 0.0257142857142856*G0_0_0_5_9 + 0.0121428571428572*G0_0_0_6_0 + 0.0192857142857142*G0_0_0_6_1 + 0.0428571428571425*G0_0_0_6_2 - 0.0707142857142853*G0_0_0_6_3 + 0.128571428571428*G0_0_0_6_4 - 0.0707142857142853*G0_0_0_6_5 + 0.32142857142857*G0_0_0_6_6 - 0.0192857142857142*G0_0_0_6_7 - 0.0192857142857142*G0_0_0_6_8 + 0.141428571428571*G0_0_0_6_9 + 0.00357142857142855*G0_0_0_7_1 + 0.00214285714285714*G0_0_0_7_2 + 0.00642857142857139*G0_0_0_7_3 - 0.0192857142857142*G0_0_0_7_4 + 0.0385714285714284*G0_0_0_7_5 - 0.0192857142857142*G0_0_0_7_6 + 0.0257142857142856*G0_0_0_7_7 - 0.00642857142857142*G0_0_0_7_8 + 0.0257142857142856*G0_0_0_7_9 - 0.00214285714285713*G0_0_0_8_0 - 0.00714285714285709*G0_0_0_8_1 - 0.00214285714285712*G0_0_0_8_2 - 0.0064285714285714*G0_0_0_8_4 - 0.0192857142857142*G0_0_0_8_5 - 0.0192857142857142*G0_0_0_8_6 - 0.00642857142857142*G0_0_0_8_7 - 0.0514285714285712*G0_0_0_8_9 + 0.00428571428571431*G0_0_0_9_0 + 0.0214285714285714*G0_0_0_9_1 - 0.0771428571428567*G0_0_0_9_3 + 0.115714285714285*G0_0_0_9_4 + 0.0257142857142856*G0_0_0_9_5 + 0.141428571428571*G0_0_0_9_6 + 0.0257142857142856*G0_0_0_9_7 - 0.0514285714285712*G0_0_0_9_8 + 0.308571428571427*G0_0_0_9_9 + 0.00317460317460315*G0_0_1_0_0 - 0.00357142857142855*G0_0_1_0_1 - 0.000555555555555555*G0_0_1_0_2 - 0.00928571428571425*G0_0_1_0_3 + 0.00785714285714283*G0_0_1_0_4 + 0.00214285714285714*G0_0_1_0_6 + 0.0071428571428571*G0_0_1_0_7 - 0.0121428571428571*G0_0_1_0_8 - 0.00428571428571426*G0_0_1_0_9 - 0.00357142857142855*G0_0_1_1_0 - 0.0523809523809521*G0_0_1_1_1 - 0.00357142857142854*G0_0_1_1_2 - 0.0428571428571426*G0_0_1_1_3 + 0.0214285714285713*G0_0_1_1_4 + 0.00357142857142855*G0_0_1_1_5 + 0.00357142857142855*G0_0_1_1_6 + 0.0214285714285713*G0_0_1_1_7 - 0.0428571428571426*G0_0_1_1_8 - 0.000555555555555555*G0_0_1_2_0 - 0.00357142857142854*G0_0_1_2_1 + 0.00317460317460313*G0_0_1_2_2 - 0.012142857142857*G0_0_1_2_3 + 0.00714285714285707*G0_0_1_2_4 + 0.00214285714285714*G0_0_1_2_5 + 0.00785714285714281*G0_0_1_2_7 - 0.00928571428571422*G0_0_1_2_8 - 0.00428571428571427*G0_0_1_2_9 - 0.00928571428571425*G0_0_1_3_0 - 0.0428571428571426*G0_0_1_3_1 - 0.012142857142857*G0_0_1_3_2 - 0.128571428571428*G0_0_1_3_3 + 0.0321428571428569*G0_0_1_3_4 + 0.00642857142857139*G0_0_1_3_5 - 0.00642857142857139*G0_0_1_3_6 + 0.032142857142857*G0_0_1_3_7 - 0.0642857142857139*G0_0_1_3_8 - 0.064285714285714*G0_0_1_3_9 + 0.00785714285714283*G0_0_1_4_0 + 0.0214285714285713*G0_0_1_4_1 + 0.00714285714285707*G0_0_1_4_2 + 0.0321428571428569*G0_0_1_4_3 + 0.0385714285714284*G0_0_1_4_4 - 0.0192857142857142*G0_0_1_4_5 + 0.0257142857142856*G0_0_1_4_6 - 0.0257142857142856*G0_0_1_4_7 + 0.0321428571428569*G0_0_1_4_8 + 0.0514285714285712*G0_0_1_4_9 + 0.00357142857142855*G0_0_1_5_1 + 0.00214285714285714*G0_0_1_5_2 + 0.00642857142857139*G0_0_1_5_3 - 0.0192857142857142*G0_0_1_5_4 + 0.0385714285714284*G0_0_1_5_5 - 0.0192857142857142*G0_0_1_5_6 + 0.0257142857142856*G0_0_1_5_7 - 0.00642857142857142*G0_0_1_5_8 + 0.0257142857142856*G0_0_1_5_9 + 0.00214285714285714*G0_0_1_6_0 + 0.00357142857142855*G0_0_1_6_1 - 0.00642857142857139*G0_0_1_6_3 + 0.0257142857142856*G0_0_1_6_4 - 0.0192857142857142*G0_0_1_6_5 + 0.0385714285714283*G0_0_1_6_6 - 0.0192857142857142*G0_0_1_6_7 + 0.00642857142857138*G0_0_1_6_8 + 0.0257142857142856*G0_0_1_6_9 + 0.0071428571428571*G0_0_1_7_0 + 0.0214285714285713*G0_0_1_7_1 + 0.00785714285714281*G0_0_1_7_2 + 0.032142857142857*G0_0_1_7_3 - 0.0257142857142856*G0_0_1_7_4 + 0.0257142857142856*G0_0_1_7_5 - 0.0192857142857142*G0_0_1_7_6 + 0.0385714285714283*G0_0_1_7_7 + 0.0321428571428569*G0_0_1_7_8 + 0.0514285714285712*G0_0_1_7_9 - 0.0121428571428571*G0_0_1_8_0 - 0.0428571428571426*G0_0_1_8_1 - 0.00928571428571422*G0_0_1_8_2 - 0.0642857142857139*G0_0_1_8_3 + 0.0321428571428569*G0_0_1_8_4 - 0.00642857142857142*G0_0_1_8_5 + 0.00642857142857138*G0_0_1_8_6 + 0.0321428571428569*G0_0_1_8_7 - 0.128571428571428*G0_0_1_8_8 - 0.064285714285714*G0_0_1_8_9 - 0.00428571428571426*G0_0_1_9_0 - 0.00428571428571427*G0_0_1_9_2 - 0.064285714285714*G0_0_1_9_3 + 0.0514285714285712*G0_0_1_9_4 + 0.0257142857142856*G0_0_1_9_5 + 0.0257142857142856*G0_0_1_9_6 + 0.0514285714285712*G0_0_1_9_7 - 0.064285714285714*G0_0_1_9_8 + 0.154285714285714*G0_0_1_9_9; + A[0] = A[7] + 0.0277777777777776*G0_0_0_0_0 + 0.0015079365079365*G0_0_0_0_2 - 0.00642857142857141*G0_0_0_0_3 + 0.00214285714285713*G0_0_0_0_4 + 0.0214285714285713*G0_0_0_0_5 - 0.00964285714285709*G0_0_0_0_6 + 0.0249999999999999*G0_0_0_0_7 - 0.0167857142857142*G0_0_0_0_8 - 0.00214285714285712*G0_0_0_0_9 - 0.0277777777777776*G0_0_0_1_1 - 0.00150793650793649*G0_0_0_1_2 - 0.0214285714285713*G0_0_0_1_3 + 0.00964285714285707*G0_0_0_1_4 + 0.0064285714285714*G0_0_0_1_5 - 0.00214285714285714*G0_0_0_1_6 + 0.0167857142857142*G0_0_0_1_7 - 0.0249999999999998*G0_0_0_1_8 + 0.00214285714285714*G0_0_0_1_9 + 0.0015079365079365*G0_0_0_2_0 - 0.00150793650793649*G0_0_0_2_1 - 0.00714285714285709*G0_0_0_2_3 + 0.00357142857142855*G0_0_0_2_4 + 0.00714285714285711*G0_0_0_2_5 - 0.00357142857142855*G0_0_0_2_6 + 0.00857142857142852*G0_0_0_2_7 - 0.00857142857142852*G0_0_0_2_8 - 0.00642857142857141*G0_0_0_3_0 - 0.0214285714285713*G0_0_0_3_1 - 0.00714285714285709*G0_0_0_3_2 - 0.0835714285714281*G0_0_0_3_3 + 0.0257142857142855*G0_0_0_3_4 + 0.00642857142857139*G0_0_0_3_6 + 0.0192857142857142*G0_0_0_3_7 - 0.0449999999999997*G0_0_0_3_8 - 0.0449999999999998*G0_0_0_3_9 + 0.00214285714285713*G0_0_0_4_0 + 0.00964285714285706*G0_0_0_4_1 + 0.00357142857142855*G0_0_0_4_2 + 0.0257142857142855*G0_0_0_4_3 - 0.00642857142857141*G0_0_0_4_5 - 0.0160714285714285*G0_0_0_4_7 + 0.0257142857142856*G0_0_0_4_8 + 0.0128571428571428*G0_0_0_4_9 + 0.0214285714285713*G0_0_0_5_0 + 0.0064285714285714*G0_0_0_5_1 + 0.00714285714285711*G0_0_0_5_2 - 0.00642857142857141*G0_0_0_5_4 + 0.0835714285714282*G0_0_0_5_5 - 0.0257142857142856*G0_0_0_5_6 + 0.0449999999999998*G0_0_0_5_7 - 0.0192857142857142*G0_0_0_5_8 + 0.0449999999999998*G0_0_0_5_9 - 0.00964285714285709*G0_0_0_6_0 - 0.00214285714285714*G0_0_0_6_1 - 0.00357142857142855*G0_0_0_6_2 + 0.00642857142857139*G0_0_0_6_3 - 0.0257142857142856*G0_0_0_6_5 - 0.0257142857142856*G0_0_0_6_7 + 0.0160714285714285*G0_0_0_6_8 - 0.0128571428571428*G0_0_0_6_9 + 0.0249999999999999*G0_0_0_7_0 + 0.0167857142857142*G0_0_0_7_1 + 0.00857142857142852*G0_0_0_7_2 + 0.0192857142857142*G0_0_0_7_3 - 0.0160714285714285*G0_0_0_7_4 + 0.0449999999999998*G0_0_0_7_5 - 0.0257142857142856*G0_0_0_7_6 + 0.0835714285714282*G0_0_0_7_7 + 0.0578571428571427*G0_0_0_7_9 - 0.0167857142857142*G0_0_0_8_0 - 0.0249999999999998*G0_0_0_8_1 - 0.00857142857142852*G0_0_0_8_2 - 0.0449999999999997*G0_0_0_8_3 + 0.0257142857142856*G0_0_0_8_4 - 0.0192857142857142*G0_0_0_8_5 + 0.0160714285714285*G0_0_0_8_6 - 0.083571428571428*G0_0_0_8_8 - 0.0578571428571426*G0_0_0_8_9 - 0.00214285714285712*G0_0_0_9_0 + 0.00214285714285714*G0_0_0_9_1 - 0.0449999999999998*G0_0_0_9_3 + 0.0128571428571428*G0_0_0_9_4 + 0.0449999999999998*G0_0_0_9_5 - 0.0128571428571428*G0_0_0_9_6 + 0.0578571428571427*G0_0_0_9_7 - 0.0578571428571426*G0_0_0_9_8 + 0.0318452380952379*G0_0_1_0_0 + 0.00260416666666665*G0_0_1_0_1 + 0.00260416666666665*G0_0_1_0_2 + 0.000223214285714285*G0_0_1_0_3 + 0.000223214285714284*G0_0_1_0_4 + 0.022767857142857*G0_0_1_0_5 - 0.0107142857142856*G0_0_1_0_6 + 0.022767857142857*G0_0_1_0_7 - 0.0107142857142857*G0_0_1_0_8 + 0.00267857142857144*G0_0_1_0_9 + 0.00260416666666665*G0_0_1_1_0 + 0.0040674603174603*G0_0_1_1_1 + 0.00109623015873015*G0_0_1_1_2 + 0.0013392857142857*G0_0_1_1_3 - 0.00107142857142856*G0_0_1_1_4 + 0.00665178571428568*G0_0_1_1_5 - 0.00191964285714285*G0_0_1_1_6 + 0.00607142857142854*G0_0_1_1_7 - 0.00223214285714285*G0_0_1_1_8 + 0.00482142857142856*G0_0_1_1_9 + 0.00260416666666665*G0_0_1_2_0 + 0.00109623015873015*G0_0_1_2_1 + 0.0040674603174603*G0_0_1_2_2 - 0.00107142857142857*G0_0_1_2_3 + 0.00133928571428571*G0_0_1_2_4 + 0.00607142857142855*G0_0_1_2_5 - 0.00223214285714284*G0_0_1_2_6 + 0.00665178571428568*G0_0_1_2_7 - 0.00191964285714285*G0_0_1_2_8 + 0.00482142857142856*G0_0_1_2_9 + 0.000223214285714285*G0_0_1_3_0 + 0.0013392857142857*G0_0_1_3_1 - 0.00107142857142857*G0_0_1_3_2 + 0.020892857142857*G0_0_1_3_3 - 0.00441964285714283*G0_0_1_3_4 - 0.00723214285714282*G0_0_1_3_5 - 0.000401785714285712*G0_0_1_3_6 - 0.00683035714285712*G0_0_1_3_7 + 0.00723214285714283*G0_0_1_3_8 - 0.000803571428571426*G0_0_1_3_9 + 0.000223214285714284*G0_0_1_4_0 - 0.00107142857142856*G0_0_1_4_1 + 0.00133928571428571*G0_0_1_4_2 - 0.00441964285714283*G0_0_1_4_3 + 0.020892857142857*G0_0_1_4_4 - 0.00683035714285714*G0_0_1_4_5 + 0.00723214285714284*G0_0_1_4_6 - 0.00723214285714284*G0_0_1_4_7 - 0.000401785714285702*G0_0_1_4_8 - 0.000803571428571432*G0_0_1_4_9 + 0.022767857142857*G0_0_1_5_0 + 0.00665178571428568*G0_0_1_5_1 + 0.00607142857142855*G0_0_1_5_2 - 0.00723214285714282*G0_0_1_5_3 - 0.00683035714285714*G0_0_1_5_4 + 0.104464285714285*G0_0_1_5_5 - 0.0301339285714284*G0_0_1_5_6 + 0.0522321428571426*G0_0_1_5_7 - 0.0261160714285713*G0_0_1_5_8 + 0.0441964285714285*G0_0_1_5_9 - 0.0107142857142856*G0_0_1_6_0 - 0.00191964285714284*G0_0_1_6_1 - 0.00223214285714284*G0_0_1_6_2 - 0.000401785714285712*G0_0_1_6_3 + 0.00723214285714284*G0_0_1_6_4 - 0.0301339285714284*G0_0_1_6_5 + 0.020892857142857*G0_0_1_6_6 - 0.0261160714285713*G0_0_1_6_7 + 0.00883928571428568*G0_0_1_6_8 - 0.0136607142857142*G0_0_1_6_9 + 0.022767857142857*G0_0_1_7_0 + 0.00607142857142854*G0_0_1_7_1 + 0.00665178571428568*G0_0_1_7_2 - 0.00683035714285712*G0_0_1_7_3 - 0.00723214285714284*G0_0_1_7_4 + 0.0522321428571426*G0_0_1_7_5 - 0.0261160714285713*G0_0_1_7_6 + 0.104464285714285*G0_0_1_7_7 - 0.0301339285714285*G0_0_1_7_8 + 0.0441964285714284*G0_0_1_7_9 - 0.0107142857142857*G0_0_1_8_0 - 0.00223214285714285*G0_0_1_8_1 - 0.00191964285714285*G0_0_1_8_2 + 0.00723214285714283*G0_0_1_8_3 - 0.000401785714285702*G0_0_1_8_4 - 0.0261160714285713*G0_0_1_8_5 + 0.00883928571428568*G0_0_1_8_6 - 0.0301339285714285*G0_0_1_8_7 + 0.0208928571428571*G0_0_1_8_8 - 0.0136607142857143*G0_0_1_8_9 + 0.00267857142857144*G0_0_1_9_0 + 0.00482142857142856*G0_0_1_9_1 + 0.00482142857142855*G0_0_1_9_2 - 0.000803571428571426*G0_0_1_9_3 - 0.000803571428571432*G0_0_1_9_4 + 0.0441964285714284*G0_0_1_9_5 - 0.0136607142857142*G0_0_1_9_6 + 0.0441964285714284*G0_0_1_9_7 - 0.0136607142857143*G0_0_1_9_8 + 0.0674999999999998*G0_0_1_9_9 + 0.0318452380952379*G0_1_0_0_0 + 0.00260416666666665*G0_1_0_0_1 + 0.00260416666666665*G0_1_0_0_2 + 0.000223214285714285*G0_1_0_0_3 + 0.000223214285714284*G0_1_0_0_4 + 0.022767857142857*G0_1_0_0_5 - 0.0107142857142856*G0_1_0_0_6 + 0.022767857142857*G0_1_0_0_7 - 0.0107142857142857*G0_1_0_0_8 + 0.00267857142857144*G0_1_0_0_9 + 0.00260416666666665*G0_1_0_1_0 + 0.0040674603174603*G0_1_0_1_1 + 0.00109623015873015*G0_1_0_1_2 + 0.0013392857142857*G0_1_0_1_3 - 0.00107142857142856*G0_1_0_1_4 + 0.00665178571428568*G0_1_0_1_5 - 0.00191964285714284*G0_1_0_1_6 + 0.00607142857142854*G0_1_0_1_7 - 0.00223214285714285*G0_1_0_1_8 + 0.00482142857142856*G0_1_0_1_9 + 0.00260416666666665*G0_1_0_2_0 + 0.00109623015873015*G0_1_0_2_1 + 0.0040674603174603*G0_1_0_2_2 - 0.00107142857142857*G0_1_0_2_3 + 0.00133928571428571*G0_1_0_2_4 + 0.00607142857142855*G0_1_0_2_5 - 0.00223214285714284*G0_1_0_2_6 + 0.00665178571428568*G0_1_0_2_7 - 0.00191964285714285*G0_1_0_2_8 + 0.00482142857142855*G0_1_0_2_9 + 0.000223214285714285*G0_1_0_3_0 + 0.0013392857142857*G0_1_0_3_1 - 0.00107142857142857*G0_1_0_3_2 + 0.020892857142857*G0_1_0_3_3 - 0.00441964285714283*G0_1_0_3_4 - 0.00723214285714282*G0_1_0_3_5 - 0.000401785714285712*G0_1_0_3_6 - 0.00683035714285712*G0_1_0_3_7 + 0.00723214285714283*G0_1_0_3_8 - 0.000803571428571424*G0_1_0_3_9 + 0.000223214285714284*G0_1_0_4_0 - 0.00107142857142856*G0_1_0_4_1 + 0.00133928571428571*G0_1_0_4_2 - 0.00441964285714283*G0_1_0_4_3 + 0.020892857142857*G0_1_0_4_4 - 0.00683035714285714*G0_1_0_4_5 + 0.00723214285714284*G0_1_0_4_6 - 0.00723214285714284*G0_1_0_4_7 - 0.000401785714285702*G0_1_0_4_8 - 0.000803571428571432*G0_1_0_4_9 + 0.022767857142857*G0_1_0_5_0 + 0.00665178571428568*G0_1_0_5_1 + 0.00607142857142855*G0_1_0_5_2 - 0.00723214285714282*G0_1_0_5_3 - 0.00683035714285714*G0_1_0_5_4 + 0.104464285714285*G0_1_0_5_5 - 0.0301339285714284*G0_1_0_5_6 + 0.0522321428571426*G0_1_0_5_7 - 0.0261160714285713*G0_1_0_5_8 + 0.0441964285714284*G0_1_0_5_9 - 0.0107142857142856*G0_1_0_6_0 - 0.00191964285714284*G0_1_0_6_1 - 0.00223214285714284*G0_1_0_6_2 - 0.000401785714285712*G0_1_0_6_3 + 0.00723214285714284*G0_1_0_6_4 - 0.0301339285714284*G0_1_0_6_5 + 0.020892857142857*G0_1_0_6_6 - 0.0261160714285713*G0_1_0_6_7 + 0.00883928571428568*G0_1_0_6_8 - 0.0136607142857142*G0_1_0_6_9 + 0.022767857142857*G0_1_0_7_0 + 0.00607142857142854*G0_1_0_7_1 + 0.00665178571428568*G0_1_0_7_2 - 0.00683035714285712*G0_1_0_7_3 - 0.00723214285714284*G0_1_0_7_4 + 0.0522321428571426*G0_1_0_7_5 - 0.0261160714285713*G0_1_0_7_6 + 0.104464285714285*G0_1_0_7_7 - 0.0301339285714285*G0_1_0_7_8 + 0.0441964285714284*G0_1_0_7_9 - 0.0107142857142857*G0_1_0_8_0 - 0.00223214285714285*G0_1_0_8_1 - 0.00191964285714285*G0_1_0_8_2 + 0.00723214285714283*G0_1_0_8_3 - 0.000401785714285702*G0_1_0_8_4 - 0.0261160714285713*G0_1_0_8_5 + 0.00883928571428568*G0_1_0_8_6 - 0.0301339285714285*G0_1_0_8_7 + 0.0208928571428571*G0_1_0_8_8 - 0.0136607142857143*G0_1_0_8_9 + 0.00267857142857144*G0_1_0_9_0 + 0.00482142857142856*G0_1_0_9_1 + 0.00482142857142855*G0_1_0_9_2 - 0.000803571428571424*G0_1_0_9_3 - 0.000803571428571432*G0_1_0_9_4 + 0.0441964285714284*G0_1_0_9_5 - 0.0136607142857142*G0_1_0_9_6 + 0.0441964285714284*G0_1_0_9_7 - 0.0136607142857143*G0_1_0_9_8 + 0.0674999999999998*G0_1_0_9_9 + 0.0318452380952379*G0_1_1_0_0 + 0.00260416666666665*G0_1_1_0_1 + 0.00260416666666665*G0_1_1_0_2 + 0.000223214285714287*G0_1_1_0_3 + 0.000223214285714284*G0_1_1_0_4 + 0.022767857142857*G0_1_1_0_5 - 0.0107142857142856*G0_1_1_0_6 + 0.022767857142857*G0_1_1_0_7 - 0.0107142857142857*G0_1_1_0_8 + 0.00267857142857144*G0_1_1_0_9 + 0.00260416666666665*G0_1_1_1_0 + 0.0040674603174603*G0_1_1_1_1 + 0.00109623015873015*G0_1_1_1_2 + 0.00133928571428571*G0_1_1_1_3 - 0.00107142857142856*G0_1_1_1_4 + 0.00665178571428568*G0_1_1_1_5 - 0.00191964285714285*G0_1_1_1_6 + 0.00607142857142854*G0_1_1_1_7 - 0.00223214285714285*G0_1_1_1_8 + 0.00482142857142856*G0_1_1_1_9 + 0.00260416666666665*G0_1_1_2_0 + 0.00109623015873015*G0_1_1_2_1 + 0.0040674603174603*G0_1_1_2_2 - 0.00107142857142857*G0_1_1_2_3 + 0.00133928571428571*G0_1_1_2_4 + 0.00607142857142855*G0_1_1_2_5 - 0.00223214285714284*G0_1_1_2_6 + 0.00665178571428568*G0_1_1_2_7 - 0.00191964285714285*G0_1_1_2_8 + 0.00482142857142855*G0_1_1_2_9 + 0.000223214285714287*G0_1_1_3_0 + 0.00133928571428571*G0_1_1_3_1 - 0.00107142857142857*G0_1_1_3_2 + 0.020892857142857*G0_1_1_3_3 - 0.00441964285714283*G0_1_1_3_4 - 0.00723214285714282*G0_1_1_3_5 - 0.000401785714285711*G0_1_1_3_6 - 0.00683035714285712*G0_1_1_3_7 + 0.00723214285714283*G0_1_1_3_8 - 0.000803571428571422*G0_1_1_3_9 + 0.000223214285714284*G0_1_1_4_0 - 0.00107142857142856*G0_1_1_4_1 + 0.00133928571428571*G0_1_1_4_2 - 0.00441964285714283*G0_1_1_4_3 + 0.020892857142857*G0_1_1_4_4 - 0.00683035714285713*G0_1_1_4_5 + 0.00723214285714284*G0_1_1_4_6 - 0.00723214285714284*G0_1_1_4_7 - 0.000401785714285703*G0_1_1_4_8 - 0.000803571428571433*G0_1_1_4_9 + 0.022767857142857*G0_1_1_5_0 + 0.00665178571428568*G0_1_1_5_1 + 0.00607142857142855*G0_1_1_5_2 - 0.00723214285714282*G0_1_1_5_3 - 0.00683035714285713*G0_1_1_5_4 + 0.104464285714285*G0_1_1_5_5 - 0.0301339285714284*G0_1_1_5_6 + 0.0522321428571426*G0_1_1_5_7 - 0.0261160714285713*G0_1_1_5_8 + 0.0441964285714285*G0_1_1_5_9 - 0.0107142857142856*G0_1_1_6_0 - 0.00191964285714285*G0_1_1_6_1 - 0.00223214285714284*G0_1_1_6_2 - 0.000401785714285712*G0_1_1_6_3 + 0.00723214285714284*G0_1_1_6_4 - 0.0301339285714284*G0_1_1_6_5 + 0.020892857142857*G0_1_1_6_6 - 0.0261160714285713*G0_1_1_6_7 + 0.00883928571428568*G0_1_1_6_8 - 0.0136607142857142*G0_1_1_6_9 + 0.022767857142857*G0_1_1_7_0 + 0.00607142857142854*G0_1_1_7_1 + 0.00665178571428568*G0_1_1_7_2 - 0.00683035714285712*G0_1_1_7_3 - 0.00723214285714284*G0_1_1_7_4 + 0.0522321428571426*G0_1_1_7_5 - 0.0261160714285713*G0_1_1_7_6 + 0.104464285714285*G0_1_1_7_7 - 0.0301339285714285*G0_1_1_7_8 + 0.0441964285714284*G0_1_1_7_9 - 0.0107142857142857*G0_1_1_8_0 - 0.00223214285714285*G0_1_1_8_1 - 0.00191964285714285*G0_1_1_8_2 + 0.00723214285714283*G0_1_1_8_3 - 0.000401785714285703*G0_1_1_8_4 - 0.0261160714285713*G0_1_1_8_5 + 0.00883928571428568*G0_1_1_8_6 - 0.0301339285714285*G0_1_1_8_7 + 0.0208928571428571*G0_1_1_8_8 - 0.0136607142857143*G0_1_1_8_9 + 0.00267857142857144*G0_1_1_9_0 + 0.00482142857142856*G0_1_1_9_1 + 0.00482142857142855*G0_1_1_9_2 - 0.000803571428571422*G0_1_1_9_3 - 0.000803571428571432*G0_1_1_9_4 + 0.0441964285714285*G0_1_1_9_5 - 0.0136607142857142*G0_1_1_9_6 + 0.0441964285714284*G0_1_1_9_7 - 0.0136607142857143*G0_1_1_9_8 + 0.0674999999999998*G0_1_1_9_9; + A[14] = 0.0040674603174603*G0_1_1_0_0 + 0.00109623015873016*G0_1_1_0_1 + 0.00260416666666666*G0_1_1_0_2 - 0.00191964285714285*G0_1_1_0_3 + 0.00665178571428571*G0_1_1_0_4 - 0.00223214285714286*G0_1_1_0_5 + 0.00607142857142857*G0_1_1_0_6 + 0.00133928571428571*G0_1_1_0_7 - 0.00107142857142857*G0_1_1_0_8 + 0.00482142857142857*G0_1_1_0_9 + 0.00109623015873016*G0_1_1_1_0 + 0.0040674603174603*G0_1_1_1_1 + 0.00260416666666666*G0_1_1_1_2 - 0.00223214285714285*G0_1_1_1_3 + 0.00607142857142856*G0_1_1_1_4 - 0.00191964285714285*G0_1_1_1_5 + 0.0066517857142857*G0_1_1_1_6 - 0.00107142857142857*G0_1_1_1_7 + 0.0013392857142857*G0_1_1_1_8 + 0.00482142857142856*G0_1_1_1_9 + 0.00260416666666666*G0_1_1_2_0 + 0.00260416666666666*G0_1_1_2_1 + 0.0318452380952379*G0_1_1_2_2 - 0.0107142857142856*G0_1_1_2_3 + 0.022767857142857*G0_1_1_2_4 - 0.0107142857142857*G0_1_1_2_5 + 0.022767857142857*G0_1_1_2_6 + 0.000223214285714285*G0_1_1_2_7 + 0.000223214285714284*G0_1_1_2_8 + 0.0026785714285714*G0_1_1_2_9 - 0.00191964285714285*G0_1_1_3_0 - 0.00223214285714285*G0_1_1_3_1 - 0.0107142857142856*G0_1_1_3_2 + 0.020892857142857*G0_1_1_3_3 - 0.0301339285714284*G0_1_1_3_4 + 0.00883928571428567*G0_1_1_3_5 - 0.0261160714285713*G0_1_1_3_6 - 0.000401785714285713*G0_1_1_3_7 + 0.00723214285714281*G0_1_1_3_8 - 0.0136607142857142*G0_1_1_3_9 + 0.00665178571428571*G0_1_1_4_0 + 0.00607142857142856*G0_1_1_4_1 + 0.022767857142857*G0_1_1_4_2 - 0.0301339285714284*G0_1_1_4_3 + 0.104464285714285*G0_1_1_4_4 - 0.0261160714285713*G0_1_1_4_5 + 0.0522321428571426*G0_1_1_4_6 - 0.00723214285714283*G0_1_1_4_7 - 0.0068303571428571*G0_1_1_4_8 + 0.0441964285714284*G0_1_1_4_9 - 0.00223214285714286*G0_1_1_5_0 - 0.00191964285714285*G0_1_1_5_1 - 0.0107142857142857*G0_1_1_5_2 + 0.00883928571428567*G0_1_1_5_3 - 0.0261160714285713*G0_1_1_5_4 + 0.020892857142857*G0_1_1_5_5 - 0.0301339285714284*G0_1_1_5_6 + 0.00723214285714281*G0_1_1_5_7 - 0.000401785714285709*G0_1_1_5_8 - 0.0136607142857142*G0_1_1_5_9 + 0.00607142857142857*G0_1_1_6_0 + 0.0066517857142857*G0_1_1_6_1 + 0.022767857142857*G0_1_1_6_2 - 0.0261160714285713*G0_1_1_6_3 + 0.0522321428571427*G0_1_1_6_4 - 0.0301339285714284*G0_1_1_6_5 + 0.104464285714285*G0_1_1_6_6 - 0.0068303571428571*G0_1_1_6_7 - 0.00723214285714282*G0_1_1_6_8 + 0.0441964285714284*G0_1_1_6_9 + 0.00133928571428571*G0_1_1_7_0 - 0.00107142857142857*G0_1_1_7_1 + 0.000223214285714285*G0_1_1_7_2 - 0.000401785714285713*G0_1_1_7_3 - 0.00723214285714283*G0_1_1_7_4 + 0.00723214285714281*G0_1_1_7_5 - 0.0068303571428571*G0_1_1_7_6 + 0.020892857142857*G0_1_1_7_7 - 0.00441964285714283*G0_1_1_7_8 - 0.000803571428571429*G0_1_1_7_9 - 0.00107142857142857*G0_1_1_8_0 + 0.0013392857142857*G0_1_1_8_1 + 0.000223214285714285*G0_1_1_8_2 + 0.00723214285714281*G0_1_1_8_3 - 0.0068303571428571*G0_1_1_8_4 - 0.000401785714285709*G0_1_1_8_5 - 0.00723214285714282*G0_1_1_8_6 - 0.00441964285714283*G0_1_1_8_7 + 0.020892857142857*G0_1_1_8_8 - 0.000803571428571436*G0_1_1_8_9 + 0.00482142857142857*G0_1_1_9_0 + 0.00482142857142856*G0_1_1_9_1 + 0.0026785714285714*G0_1_1_9_2 - 0.0136607142857142*G0_1_1_9_3 + 0.0441964285714284*G0_1_1_9_4 - 0.0136607142857142*G0_1_1_9_5 + 0.0441964285714284*G0_1_1_9_6 - 0.000803571428571429*G0_1_1_9_7 - 0.000803571428571436*G0_1_1_9_8 + 0.0674999999999997*G0_1_1_9_9; + A[10] = -A[9] - 0.0115079365079364*G0_0_1_0_0 + 0.00295634920634919*G0_0_1_0_1 + 0.000575396825396826*G0_0_1_0_2 + 0.00874999999999997*G0_0_1_0_3 - 0.0019642857142857*G0_0_1_0_4 - 0.0124999999999999*G0_0_1_0_5 + 0.00678571428571426*G0_0_1_0_6 - 0.0160714285714285*G0_0_1_0_7 + 0.0139285714285714*G0_0_1_0_8 + 0.00428571428571427*G0_0_1_0_9 + 0.00295634920634919*G0_0_1_1_0 + 0.0440476190476188*G0_0_1_1_1 + 0.00359126984126981*G0_0_1_1_2 + 0.0303571428571427*G0_0_1_1_3 - 0.0124999999999999*G0_0_1_1_4 - 0.00410714285714284*G0_0_1_1_5 + 0.00232142857142857*G0_0_1_1_6 - 0.019642857142857*G0_0_1_1_7 + 0.0339285714285712*G0_0_1_1_8 + 0.000575396825396826*G0_0_1_2_0 + 0.00359126984126981*G0_0_1_2_1 + 0.013095238095238*G0_0_1_2_2 + 0.00714285714285709*G0_0_1_2_3 + 0.00178571428571429*G0_0_1_2_4 - 0.00714285714285711*G0_0_1_2_5 + 0.00892857142857139*G0_0_1_2_6 - 0.00410714285714283*G0_0_1_2_7 + 0.0130357142857142*G0_0_1_2_8 + 0.0107142857142857*G0_0_1_2_9 + 0.00874999999999997*G0_0_1_3_0 + 0.0303571428571426*G0_0_1_3_1 + 0.00714285714285709*G0_0_1_3_2 + 0.128571428571428*G0_0_1_3_3 - 0.0498214285714282*G0_0_1_3_4 - 0.0032142857142857*G0_0_1_3_5 - 0.0144642857142856*G0_0_1_3_6 - 0.0337499999999998*G0_0_1_3_7 + 0.0803571428571424*G0_0_1_3_8 + 0.0674999999999997*G0_0_1_3_9 - 0.0019642857142857*G0_0_1_4_0 - 0.0124999999999999*G0_0_1_4_1 + 0.00178571428571429*G0_0_1_4_2 - 0.0498214285714282*G0_0_1_4_3 + 0.0321428571428569*G0_0_1_4_4 - 0.00160714285714285*G0_0_1_4_5 + 0.0160714285714285*G0_0_1_4_6 + 0.0128571428571428*G0_0_1_4_7 - 0.0466071428571426*G0_0_1_4_8 - 0.0289285714285713*G0_0_1_4_9 - 0.0124999999999999*G0_0_1_5_0 - 0.00410714285714284*G0_0_1_5_1 - 0.00714285714285711*G0_0_1_5_2 - 0.0032142857142857*G0_0_1_5_3 - 0.00160714285714285*G0_0_1_5_4 - 0.0385714285714284*G0_0_1_5_5 + 0.00160714285714284*G0_0_1_5_6 - 0.00964285714285711*G0_0_1_5_7 + 0.00482142857142857*G0_0_1_5_8 - 0.0225*G0_0_1_5_9 + 0.00678571428571426*G0_0_1_6_0 + 0.00232142857142857*G0_0_1_6_1 + 0.00892857142857139*G0_0_1_6_2 - 0.0144642857142856*G0_0_1_6_3 + 0.0160714285714285*G0_0_1_6_4 + 0.00160714285714284*G0_0_1_6_5 + 0.032142857142857*G0_0_1_6_6 + 0.00482142857142855*G0_0_1_6_7 - 0.0192857142857142*G0_0_1_6_8 - 0.00321428571428568*G0_0_1_6_9 - 0.0160714285714285*G0_0_1_7_0 - 0.019642857142857*G0_0_1_7_1 - 0.00410714285714283*G0_0_1_7_2 - 0.0337499999999998*G0_0_1_7_3 + 0.0128571428571428*G0_0_1_7_4 - 0.00964285714285711*G0_0_1_7_5 + 0.00482142857142855*G0_0_1_7_6 + 0.0257142857142856*G0_0_1_7_7 - 0.0305357142857141*G0_0_1_7_8 - 0.0224999999999999*G0_0_1_7_9 + 0.0139285714285714*G0_0_1_8_0 + 0.0339285714285712*G0_0_1_8_1 + 0.0130357142857142*G0_0_1_8_2 + 0.0803571428571424*G0_0_1_8_3 - 0.0466071428571426*G0_0_1_8_4 + 0.00482142857142857*G0_0_1_8_5 - 0.0192857142857142*G0_0_1_8_6 - 0.0305357142857141*G0_0_1_8_7 + 0.192857142857142*G0_0_1_8_8 + 0.0932142857142853*G0_0_1_8_9 + 0.00428571428571427*G0_0_1_9_0 + 0.0107142857142857*G0_0_1_9_2 + 0.0674999999999997*G0_0_1_9_3 - 0.0289285714285713*G0_0_1_9_4 - 0.0225*G0_0_1_9_5 - 0.00321428571428568*G0_0_1_9_6 - 0.0224999999999999*G0_0_1_9_7 + 0.0932142857142853*G0_0_1_9_8 + 0.115714285714285*G0_0_1_9_9; + A[25] = A[10] + 0.0123015873015872*G0_0_1_0_0 + 0.000317460317460312*G0_0_1_0_1 + 0.00214285714285714*G0_0_1_0_3 - 0.00107142857142857*G0_0_1_0_4 + 0.0107142857142856*G0_0_1_0_5 - 0.00696428571428568*G0_0_1_0_6 + 0.00892857142857138*G0_0_1_0_7 - 0.00339285714285713*G0_0_1_0_8 + 0.00321428571428571*G0_0_1_0_9 + 0.000317460317460312*G0_0_1_1_0 - 0.000317460317460318*G0_0_1_1_2 + 0.00178571428571427*G0_0_1_1_3 - 0.00357142857142855*G0_0_1_1_4 + 0.0032142857142857*G0_0_1_1_5 - 0.00321428571428571*G0_0_1_1_6 + 0.00357142857142856*G0_0_1_1_7 - 0.00178571428571428*G0_0_1_1_8 - 0.000317460317460318*G0_0_1_2_1 - 0.0123015873015872*G0_0_1_2_2 + 0.00339285714285712*G0_0_1_2_3 - 0.00892857142857138*G0_0_1_2_4 + 0.00696428571428568*G0_0_1_2_5 - 0.0107142857142857*G0_0_1_2_6 + 0.00107142857142857*G0_0_1_2_7 - 0.00214285714285713*G0_0_1_2_8 - 0.0032142857142857*G0_0_1_2_9 + 0.00214285714285714*G0_0_1_3_0 + 0.00178571428571427*G0_0_1_3_1 + 0.00339285714285712*G0_0_1_3_2 + 0.0321428571428569*G0_0_1_3_3 + 0.00964285714285711*G0_0_1_3_4 - 0.00803571428571424*G0_0_1_3_5 + 0.00964285714285709*G0_0_1_3_6 - 0.0064285714285714*G0_0_1_3_7 + 0.0128571428571428*G0_0_1_3_9 - 0.00107142857142857*G0_0_1_4_0 - 0.00357142857142855*G0_0_1_4_1 - 0.00892857142857138*G0_0_1_4_2 + 0.00964285714285711*G0_0_1_4_3 - 0.0032142857142857*G0_0_1_4_4 + 0.00321428571428569*G0_0_1_4_5 - 0.0128571428571428*G0_0_1_4_6 + 0.0064285714285714*G0_0_1_4_8 + 0.00321428571428571*G0_0_1_4_9 + 0.0107142857142857*G0_0_1_5_0 + 0.0032142857142857*G0_0_1_5_1 + 0.00696428571428568*G0_0_1_5_2 - 0.00803571428571424*G0_0_1_5_3 + 0.00321428571428569*G0_0_1_5_4 + 0.0353571428571427*G0_0_1_5_5 + 0.0128571428571428*G0_0_1_5_7 - 0.00964285714285711*G0_0_1_5_8 + 0.00964285714285715*G0_0_1_5_9 - 0.00696428571428568*G0_0_1_6_0 - 0.00321428571428571*G0_0_1_6_1 - 0.0107142857142857*G0_0_1_6_2 + 0.00964285714285709*G0_0_1_6_3 - 0.0128571428571428*G0_0_1_6_4 - 0.0353571428571427*G0_0_1_6_6 - 0.00321428571428571*G0_0_1_6_7 + 0.00803571428571425*G0_0_1_6_8 - 0.00964285714285711*G0_0_1_6_9 + 0.00892857142857138*G0_0_1_7_0 + 0.00357142857142856*G0_0_1_7_1 + 0.00107142857142857*G0_0_1_7_2 - 0.0064285714285714*G0_0_1_7_3 + 0.0128571428571428*G0_0_1_7_5 - 0.00321428571428571*G0_0_1_7_6 + 0.0032142857142857*G0_0_1_7_7 - 0.00964285714285709*G0_0_1_7_8 - 0.00321428571428568*G0_0_1_7_9 - 0.00339285714285713*G0_0_1_8_0 - 0.00178571428571428*G0_0_1_8_1 - 0.00214285714285713*G0_0_1_8_2 + 0.0064285714285714*G0_0_1_8_4 - 0.00964285714285711*G0_0_1_8_5 + 0.00803571428571425*G0_0_1_8_6 - 0.00964285714285709*G0_0_1_8_7 - 0.032142857142857*G0_0_1_8_8 - 0.0128571428571428*G0_0_1_8_9 + 0.00321428571428571*G0_0_1_9_0 - 0.0032142857142857*G0_0_1_9_2 + 0.0128571428571428*G0_0_1_9_3 + 0.00321428571428571*G0_0_1_9_4 + 0.00964285714285715*G0_0_1_9_5 - 0.00964285714285711*G0_0_1_9_6 - 0.00321428571428568*G0_0_1_9_7 - 0.0128571428571428*G0_0_1_9_8 - 0.0123015873015872*G0_1_0_0_0 - 0.000317460317460312*G0_1_0_0_1 - 0.00214285714285714*G0_1_0_0_3 + 0.00107142857142857*G0_1_0_0_4 - 0.0107142857142856*G0_1_0_0_5 + 0.00696428571428568*G0_1_0_0_6 - 0.00892857142857138*G0_1_0_0_7 + 0.00339285714285713*G0_1_0_0_8 - 0.00321428571428571*G0_1_0_0_9 - 0.000317460317460312*G0_1_0_1_0 + 0.000317460317460319*G0_1_0_1_2 - 0.00178571428571427*G0_1_0_1_3 + 0.00357142857142855*G0_1_0_1_4 - 0.0032142857142857*G0_1_0_1_5 + 0.00321428571428571*G0_1_0_1_6 - 0.00357142857142856*G0_1_0_1_7 + 0.00178571428571428*G0_1_0_1_8 + 0.000317460317460318*G0_1_0_2_1 + 0.0123015873015872*G0_1_0_2_2 - 0.00339285714285712*G0_1_0_2_3 + 0.00892857142857138*G0_1_0_2_4 - 0.00696428571428568*G0_1_0_2_5 + 0.0107142857142857*G0_1_0_2_6 - 0.00107142857142857*G0_1_0_2_7 + 0.00214285714285713*G0_1_0_2_8 + 0.0032142857142857*G0_1_0_2_9 - 0.00214285714285714*G0_1_0_3_0 - 0.00178571428571427*G0_1_0_3_1 - 0.00339285714285712*G0_1_0_3_2 - 0.0321428571428569*G0_1_0_3_3 - 0.00964285714285711*G0_1_0_3_4 + 0.00803571428571424*G0_1_0_3_5 - 0.00964285714285709*G0_1_0_3_6 + 0.0064285714285714*G0_1_0_3_7 - 0.0128571428571428*G0_1_0_3_9 + 0.00107142857142857*G0_1_0_4_0 + 0.00357142857142855*G0_1_0_4_1 + 0.00892857142857138*G0_1_0_4_2 - 0.00964285714285711*G0_1_0_4_3 + 0.0032142857142857*G0_1_0_4_4 - 0.00321428571428569*G0_1_0_4_5 + 0.0128571428571428*G0_1_0_4_6 - 0.0064285714285714*G0_1_0_4_8 - 0.00321428571428571*G0_1_0_4_9 - 0.0107142857142856*G0_1_0_5_0 - 0.0032142857142857*G0_1_0_5_1 - 0.00696428571428568*G0_1_0_5_2 + 0.00803571428571424*G0_1_0_5_3 - 0.00321428571428569*G0_1_0_5_4 - 0.0353571428571427*G0_1_0_5_5 - 0.0128571428571428*G0_1_0_5_7 + 0.00964285714285711*G0_1_0_5_8 - 0.00964285714285715*G0_1_0_5_9 + 0.00696428571428568*G0_1_0_6_0 + 0.00321428571428571*G0_1_0_6_1 + 0.0107142857142857*G0_1_0_6_2 - 0.00964285714285709*G0_1_0_6_3 + 0.0128571428571428*G0_1_0_6_4 + 0.0353571428571427*G0_1_0_6_6 + 0.00321428571428571*G0_1_0_6_7 - 0.00803571428571425*G0_1_0_6_8 + 0.00964285714285711*G0_1_0_6_9 - 0.00892857142857138*G0_1_0_7_0 - 0.00357142857142856*G0_1_0_7_1 - 0.00107142857142857*G0_1_0_7_2 + 0.0064285714285714*G0_1_0_7_3 - 0.0128571428571428*G0_1_0_7_5 + 0.00321428571428571*G0_1_0_7_6 - 0.0032142857142857*G0_1_0_7_7 + 0.00964285714285709*G0_1_0_7_8 + 0.00321428571428568*G0_1_0_7_9 + 0.00339285714285713*G0_1_0_8_0 + 0.00178571428571428*G0_1_0_8_1 + 0.00214285714285713*G0_1_0_8_2 - 0.0064285714285714*G0_1_0_8_4 + 0.00964285714285711*G0_1_0_8_5 - 0.00803571428571425*G0_1_0_8_6 + 0.00964285714285709*G0_1_0_8_7 + 0.032142857142857*G0_1_0_8_8 + 0.0128571428571428*G0_1_0_8_9 - 0.00321428571428571*G0_1_0_9_0 + 0.0032142857142857*G0_1_0_9_2 - 0.0128571428571428*G0_1_0_9_3 - 0.00321428571428571*G0_1_0_9_4 - 0.00964285714285714*G0_1_0_9_5 + 0.00964285714285711*G0_1_0_9_6 + 0.00321428571428568*G0_1_0_9_7 + 0.0128571428571428*G0_1_0_9_8; + A[6] = -A[8] + 0.00982142857142852*G0_0_0_0_0 + 0.00112599206349206*G0_0_0_0_1 + 0.00080853174603174*G0_0_0_0_2 + 0.00227678571428571*G0_0_0_0_3 - 0.000937499999999996*G0_0_0_0_4 + 0.00758928571428567*G0_0_0_0_5 - 0.00446428571428569*G0_0_0_0_6 + 0.00580357142857139*G0_0_0_0_7 - 0.00089285714285714*G0_0_0_0_8 + 0.00267857142857143*G0_0_0_0_9 + 0.00112599206349206*G0_0_0_1_0 + 0.00982142857142851*G0_0_0_1_1 + 0.000808531746031739*G0_0_0_1_2 + 0.00758928571428566*G0_0_0_1_3 - 0.00446428571428568*G0_0_0_1_4 + 0.00227678571428571*G0_0_0_1_5 - 0.000937499999999994*G0_0_0_1_6 - 0.000892857142857135*G0_0_0_1_7 + 0.00580357142857139*G0_0_0_1_8 + 0.00267857142857142*G0_0_0_1_9 + 0.00080853174603174*G0_0_0_2_0 + 0.000808531746031739*G0_0_0_2_1 - 0.00248015873015872*G0_0_0_2_2 + 0.00249999999999998*G0_0_0_2_3 - 0.00312499999999999*G0_0_0_2_4 + 0.00249999999999999*G0_0_0_2_5 - 0.00312499999999999*G0_0_0_2_6 + 0.000133928571428574*G0_0_0_2_7 + 0.000133928571428568*G0_0_0_2_8 - 0.000535714285714281*G0_0_0_2_9 + 0.00227678571428571*G0_0_0_3_0 + 0.00758928571428566*G0_0_0_3_1 + 0.00249999999999998*G0_0_0_3_2 + 0.0401785714285712*G0_0_0_3_3 - 0.00522321428571424*G0_0_0_3_4 - 0.00562499999999997*G0_0_0_3_5 + 0.000401785714285715*G0_0_0_3_6 - 0.00924107142857139*G0_0_0_3_7 + 0.0120535714285714*G0_0_0_3_8 + 0.0104464285714285*G0_0_0_3_9 - 0.000937499999999996*G0_0_0_4_0 - 0.00446428571428568*G0_0_0_4_1 - 0.00312499999999999*G0_0_0_4_2 - 0.00522321428571424*G0_0_0_4_3 + 0.00482142857142854*G0_0_0_4_4 + 0.000401785714285705*G0_0_0_4_5 - 0.000803571428571426*G0_0_0_4_6 + 0.00241071428571427*G0_0_0_4_7 - 0.00281249999999998*G0_0_0_4_8 + 0.000803571428571426*G0_0_0_4_9 + 0.00758928571428567*G0_0_0_5_0 + 0.00227678571428571*G0_0_0_5_1 + 0.00249999999999999*G0_0_0_5_2 - 0.00562499999999997*G0_0_0_5_3 + 0.000401785714285705*G0_0_0_5_4 + 0.0401785714285713*G0_0_0_5_5 - 0.00522321428571425*G0_0_0_5_6 + 0.0120535714285714*G0_0_0_5_7 - 0.0092410714285714*G0_0_0_5_8 + 0.0104464285714286*G0_0_0_5_9 - 0.00446428571428569*G0_0_0_6_0 - 0.000937499999999994*G0_0_0_6_1 - 0.00312499999999999*G0_0_0_6_2 + 0.000401785714285715*G0_0_0_6_3 - 0.000803571428571426*G0_0_0_6_4 - 0.00522321428571425*G0_0_0_6_5 + 0.00482142857142855*G0_0_0_6_6 - 0.00281249999999999*G0_0_0_6_7 + 0.00241071428571428*G0_0_0_6_8 + 0.000803571428571415*G0_0_0_6_9 + 0.00580357142857139*G0_0_0_7_0 - 0.000892857142857135*G0_0_0_7_1 + 0.000133928571428573*G0_0_0_7_2 - 0.00924107142857139*G0_0_0_7_3 + 0.00241071428571427*G0_0_0_7_4 + 0.0120535714285714*G0_0_0_7_5 - 0.00281249999999999*G0_0_0_7_6 + 0.00803571428571425*G0_0_0_7_7 - 0.0148660714285714*G0_0_0_7_8 - 0.00241071428571426*G0_0_0_7_9 - 0.00089285714285714*G0_0_0_8_0 + 0.00580357142857139*G0_0_0_8_1 + 0.000133928571428568*G0_0_0_8_2 + 0.0120535714285714*G0_0_0_8_3 - 0.00281249999999998*G0_0_0_8_4 - 0.0092410714285714*G0_0_0_8_5 + 0.00241071428571428*G0_0_0_8_6 - 0.0148660714285714*G0_0_0_8_7 + 0.00803571428571423*G0_0_0_8_8 - 0.00241071428571428*G0_0_0_8_9 + 0.00267857142857143*G0_0_0_9_0 + 0.00267857142857142*G0_0_0_9_1 - 0.000535714285714282*G0_0_0_9_2 + 0.0104464285714285*G0_0_0_9_3 + 0.000803571428571426*G0_0_0_9_4 + 0.0104464285714286*G0_0_0_9_5 + 0.000803571428571415*G0_0_0_9_6 - 0.00241071428571426*G0_0_0_9_7 - 0.00241071428571428*G0_0_0_9_8 + 0.00964285714285713*G0_0_0_9_9 + 0.0123015873015872*G0_0_1_0_0 + 0.000317460317460314*G0_0_1_0_1 + 0.00214285714285714*G0_0_1_0_3 - 0.00107142857142857*G0_0_1_0_4 + 0.0107142857142857*G0_0_1_0_5 - 0.00696428571428569*G0_0_1_0_6 + 0.00892857142857137*G0_0_1_0_7 - 0.00339285714285712*G0_0_1_0_8 + 0.00321428571428571*G0_0_1_0_9 + 0.000317460317460314*G0_0_1_1_0 - 0.000317460317460317*G0_0_1_1_2 + 0.00178571428571428*G0_0_1_1_3 - 0.00357142857142856*G0_0_1_1_4 + 0.0032142857142857*G0_0_1_1_5 - 0.00321428571428571*G0_0_1_1_6 + 0.00357142857142855*G0_0_1_1_7 - 0.00178571428571427*G0_0_1_1_8 - 0.000317460317460317*G0_0_1_2_1 - 0.0123015873015872*G0_0_1_2_2 + 0.00339285714285712*G0_0_1_2_3 - 0.00892857142857139*G0_0_1_2_4 + 0.00696428571428568*G0_0_1_2_5 - 0.0107142857142857*G0_0_1_2_6 + 0.00107142857142857*G0_0_1_2_7 - 0.00214285714285713*G0_0_1_2_8 - 0.00321428571428569*G0_0_1_2_9 + 0.00214285714285714*G0_0_1_3_0 + 0.00178571428571429*G0_0_1_3_1 + 0.00339285714285712*G0_0_1_3_2 + 0.032142857142857*G0_0_1_3_3 + 0.0096428571428571*G0_0_1_3_4 - 0.00803571428571425*G0_0_1_3_5 + 0.0096428571428571*G0_0_1_3_6 - 0.00642857142857141*G0_0_1_3_7 + 0.0128571428571428*G0_0_1_3_9 - 0.00107142857142857*G0_0_1_4_0 - 0.00357142857142856*G0_0_1_4_1 - 0.00892857142857139*G0_0_1_4_2 + 0.0096428571428571*G0_0_1_4_3 - 0.00321428571428569*G0_0_1_4_4 + 0.00321428571428569*G0_0_1_4_5 - 0.0128571428571428*G0_0_1_4_6 + 0.00642857142857138*G0_0_1_4_8 + 0.0032142857142857*G0_0_1_4_9 + 0.0107142857142857*G0_0_1_5_0 + 0.0032142857142857*G0_0_1_5_1 + 0.00696428571428568*G0_0_1_5_2 - 0.00803571428571425*G0_0_1_5_3 + 0.00321428571428569*G0_0_1_5_4 + 0.0353571428571427*G0_0_1_5_5 + 0.0128571428571428*G0_0_1_5_7 - 0.00964285714285712*G0_0_1_5_8 + 0.00964285714285714*G0_0_1_5_9 - 0.00696428571428568*G0_0_1_6_0 - 0.00321428571428571*G0_0_1_6_1 - 0.0107142857142857*G0_0_1_6_2 + 0.0096428571428571*G0_0_1_6_3 - 0.0128571428571428*G0_0_1_6_4 - 0.0353571428571428*G0_0_1_6_6 - 0.00321428571428571*G0_0_1_6_7 + 0.00803571428571424*G0_0_1_6_8 - 0.00964285714285712*G0_0_1_6_9 + 0.00892857142857137*G0_0_1_7_0 + 0.00357142857142855*G0_0_1_7_1 + 0.00107142857142857*G0_0_1_7_2 - 0.00642857142857141*G0_0_1_7_3 + 0.0128571428571428*G0_0_1_7_5 - 0.00321428571428571*G0_0_1_7_6 + 0.00321428571428572*G0_0_1_7_7 - 0.00964285714285711*G0_0_1_7_8 - 0.00321428571428569*G0_0_1_7_9 - 0.00339285714285712*G0_0_1_8_0 - 0.00178571428571427*G0_0_1_8_1 - 0.00214285714285713*G0_0_1_8_2 + 0.00642857142857138*G0_0_1_8_4 - 0.00964285714285711*G0_0_1_8_5 + 0.00803571428571424*G0_0_1_8_6 - 0.00964285714285711*G0_0_1_8_7 - 0.0321428571428569*G0_0_1_8_8 - 0.0128571428571428*G0_0_1_8_9 + 0.00321428571428571*G0_0_1_9_0 - 0.00321428571428569*G0_0_1_9_2 + 0.0128571428571428*G0_0_1_9_3 + 0.0032142857142857*G0_0_1_9_4 + 0.00964285714285714*G0_0_1_9_5 - 0.00964285714285712*G0_0_1_9_6 - 0.00321428571428569*G0_0_1_9_7 - 0.0128571428571428*G0_0_1_9_8; + A[35] = -A[33] + 0.0587301587301584*G0_0_0_0_0 + 0.00746031746031742*G0_0_0_0_1 + 0.00619047619047616*G0_0_0_0_2 + 0.00714285714285711*G0_0_0_0_3 - 0.0057142857142857*G0_0_0_0_4 + 0.0428571428571426*G0_0_0_0_5 - 0.0235714285714284*G0_0_0_0_6 + 0.0357142857142855*G0_0_0_0_7 - 0.00928571428571425*G0_0_0_0_8 + 0.00428571428571432*G0_0_0_0_9 + 0.00746031746031742*G0_0_0_1_0 + 0.0523809523809521*G0_0_0_1_1 + 0.00444444444444441*G0_0_0_1_2 + 0.0357142857142855*G0_0_0_1_3 - 0.0178571428571427*G0_0_0_1_4 + 0.0157142857142857*G0_0_0_1_5 - 0.0014285714285714*G0_0_0_1_6 - 0.00357142857142853*G0_0_0_1_7 + 0.0285714285714284*G0_0_0_1_8 + 0.0214285714285714*G0_0_0_1_9 + 0.00619047619047616*G0_0_0_2_0 + 0.00444444444444441*G0_0_0_2_1 + 0.00317460317460316*G0_0_0_2_2 + 0.00999999999999993*G0_0_0_2_3 - 0.00714285714285709*G0_0_0_2_4 + 0.00999999999999997*G0_0_0_2_5 - 0.00714285714285711*G0_0_0_2_6 + 0.00714285714285712*G0_0_0_2_7 + 0.00285714285714282*G0_0_0_2_8 + 0.00857142857142855*G0_0_0_2_9 + 0.00714285714285711*G0_0_0_3_0 + 0.0357142857142855*G0_0_0_3_1 + 0.00999999999999993*G0_0_0_3_2 + 0.128571428571428*G0_0_0_3_3 - 0.0385714285714283*G0_0_0_3_4 - 0.0257142857142856*G0_0_0_3_5 - 0.0128571428571428*G0_0_0_3_6 - 0.0385714285714284*G0_0_0_3_7 + 0.0642857142857139*G0_0_0_3_8 + 0.0128571428571428*G0_0_0_3_9 - 0.0057142857142857*G0_0_0_4_0 - 0.0178571428571427*G0_0_0_4_1 - 0.00714285714285709*G0_0_0_4_2 - 0.0385714285714283*G0_0_0_4_3 - 0.0128571428571428*G0_0_0_4_4 + 0.0128571428571428*G0_0_0_4_6 + 0.00642857142857136*G0_0_0_4_7 - 0.0257142857142855*G0_0_0_4_8 - 0.0257142857142856*G0_0_0_4_9 + 0.0428571428571426*G0_0_0_5_0 + 0.0157142857142857*G0_0_0_5_1 + 0.00999999999999997*G0_0_0_5_2 - 0.0257142857142856*G0_0_0_5_3 + 0.282857142857142*G0_0_0_5_5 - 0.0514285714285712*G0_0_0_5_6 + 0.102857142857142*G0_0_0_5_7 - 0.0642857142857141*G0_0_0_5_8 + 0.115714285714285*G0_0_0_5_9 - 0.0235714285714284*G0_0_0_6_0 - 0.0014285714285714*G0_0_0_6_1 - 0.00714285714285711*G0_0_0_6_2 - 0.0128571428571428*G0_0_0_6_3 + 0.0128571428571428*G0_0_0_6_4 - 0.0514285714285712*G0_0_0_6_5 + 0.115714285714285*G0_0_0_6_6 - 0.0385714285714284*G0_0_0_6_7 + 0.00642857142857144*G0_0_0_6_8 + 0.0357142857142855*G0_0_0_7_0 - 0.00357142857142854*G0_0_0_7_1 + 0.00714285714285711*G0_0_0_7_2 - 0.0385714285714284*G0_0_0_7_3 + 0.00642857142857136*G0_0_0_7_4 + 0.102857142857142*G0_0_0_7_5 - 0.0385714285714284*G0_0_0_7_6 + 0.154285714285713*G0_0_0_7_7 - 0.0899999999999996*G0_0_0_7_8 + 0.0642857142857141*G0_0_0_7_9 - 0.00928571428571425*G0_0_0_8_0 + 0.0285714285714284*G0_0_0_8_1 + 0.00285714285714282*G0_0_0_8_2 + 0.0642857142857139*G0_0_0_8_3 - 0.0257142857142855*G0_0_0_8_4 - 0.0642857142857141*G0_0_0_8_5 + 0.00642857142857144*G0_0_0_8_6 - 0.0899999999999996*G0_0_0_8_7 + 0.128571428571428*G0_0_0_8_8 - 0.0128571428571429*G0_0_0_8_9 + 0.00428571428571432*G0_0_0_9_0 + 0.0214285714285714*G0_0_0_9_1 + 0.00857142857142855*G0_0_0_9_2 + 0.0128571428571429*G0_0_0_9_3 - 0.0257142857142856*G0_0_0_9_4 + 0.115714285714285*G0_0_0_9_5 + 0.0642857142857141*G0_0_0_9_7 - 0.0128571428571429*G0_0_0_9_8 + 0.154285714285714*G0_0_0_9_9 - 0.00317460317460315*G0_1_0_0_0 + 0.00357142857142855*G0_1_0_0_1 + 0.000555555555555554*G0_1_0_0_2 + 0.00928571428571425*G0_1_0_0_3 - 0.00785714285714283*G0_1_0_0_4 - 0.00214285714285715*G0_1_0_0_6 - 0.00714285714285711*G0_1_0_0_7 + 0.0121428571428571*G0_1_0_0_8 + 0.00428571428571426*G0_1_0_0_9 + 0.00357142857142855*G0_1_0_1_0 + 0.0523809523809521*G0_1_0_1_1 + 0.00357142857142854*G0_1_0_1_2 + 0.0428571428571426*G0_1_0_1_3 - 0.0214285714285713*G0_1_0_1_4 - 0.00357142857142855*G0_1_0_1_5 - 0.00357142857142855*G0_1_0_1_6 - 0.0214285714285713*G0_1_0_1_7 + 0.0428571428571426*G0_1_0_1_8 + 0.000555555555555554*G0_1_0_2_0 + 0.00357142857142854*G0_1_0_2_1 - 0.00317460317460314*G0_1_0_2_2 + 0.0121428571428571*G0_1_0_2_3 - 0.00714285714285708*G0_1_0_2_4 - 0.00214285714285714*G0_1_0_2_5 - 0.00785714285714281*G0_1_0_2_7 + 0.00928571428571423*G0_1_0_2_8 + 0.00428571428571427*G0_1_0_2_9 + 0.00928571428571425*G0_1_0_3_0 + 0.0428571428571426*G0_1_0_3_1 + 0.0121428571428571*G0_1_0_3_2 + 0.128571428571428*G0_1_0_3_3 - 0.0321428571428569*G0_1_0_3_4 - 0.00642857142857139*G0_1_0_3_5 + 0.00642857142857139*G0_1_0_3_6 - 0.032142857142857*G0_1_0_3_7 + 0.0642857142857139*G0_1_0_3_8 + 0.064285714285714*G0_1_0_3_9 - 0.00785714285714283*G0_1_0_4_0 - 0.0214285714285713*G0_1_0_4_1 - 0.00714285714285708*G0_1_0_4_2 - 0.0321428571428569*G0_1_0_4_3 - 0.0385714285714284*G0_1_0_4_4 + 0.0192857142857142*G0_1_0_4_5 - 0.0257142857142856*G0_1_0_4_6 + 0.0257142857142856*G0_1_0_4_7 - 0.0321428571428569*G0_1_0_4_8 - 0.0514285714285712*G0_1_0_4_9 - 0.00357142857142855*G0_1_0_5_1 - 0.00214285714285714*G0_1_0_5_2 - 0.00642857142857139*G0_1_0_5_3 + 0.0192857142857142*G0_1_0_5_4 - 0.0385714285714284*G0_1_0_5_5 + 0.0192857142857142*G0_1_0_5_6 - 0.0257142857142856*G0_1_0_5_7 + 0.00642857142857142*G0_1_0_5_8 - 0.0257142857142856*G0_1_0_5_9 - 0.00214285714285714*G0_1_0_6_0 - 0.00357142857142855*G0_1_0_6_1 + 0.00642857142857139*G0_1_0_6_3 - 0.0257142857142856*G0_1_0_6_4 + 0.0192857142857142*G0_1_0_6_5 - 0.0385714285714284*G0_1_0_6_6 + 0.0192857142857142*G0_1_0_6_7 - 0.00642857142857138*G0_1_0_6_8 - 0.0257142857142856*G0_1_0_6_9 - 0.00714285714285711*G0_1_0_7_0 - 0.0214285714285713*G0_1_0_7_1 - 0.00785714285714281*G0_1_0_7_2 - 0.032142857142857*G0_1_0_7_3 + 0.0257142857142856*G0_1_0_7_4 - 0.0257142857142856*G0_1_0_7_5 + 0.0192857142857142*G0_1_0_7_6 - 0.0385714285714283*G0_1_0_7_7 - 0.0321428571428569*G0_1_0_7_8 - 0.0514285714285712*G0_1_0_7_9 + 0.0121428571428571*G0_1_0_8_0 + 0.0428571428571426*G0_1_0_8_1 + 0.00928571428571423*G0_1_0_8_2 + 0.0642857142857139*G0_1_0_8_3 - 0.0321428571428569*G0_1_0_8_4 + 0.00642857142857142*G0_1_0_8_5 - 0.00642857142857138*G0_1_0_8_6 - 0.0321428571428569*G0_1_0_8_7 + 0.128571428571428*G0_1_0_8_8 + 0.064285714285714*G0_1_0_8_9 + 0.00428571428571426*G0_1_0_9_0 + 0.00428571428571427*G0_1_0_9_2 + 0.064285714285714*G0_1_0_9_3 - 0.0514285714285712*G0_1_0_9_4 - 0.0257142857142856*G0_1_0_9_5 - 0.0257142857142856*G0_1_0_9_6 - 0.0514285714285712*G0_1_0_9_7 + 0.064285714285714*G0_1_0_9_8 - 0.154285714285714*G0_1_0_9_9; + A[23] = -A[21] + 0.00634920634920631*G0_0_0_0_0 + 0.000873015873015875*G0_0_0_0_1 + 0.00563492063492061*G0_0_0_0_2 - 0.00642857142857142*G0_0_0_0_3 + 0.015*G0_0_0_0_4 - 0.00714285714285714*G0_0_0_0_5 + 0.0121428571428572*G0_0_0_0_6 - 0.00214285714285713*G0_0_0_0_8 + 0.00428571428571431*G0_0_0_0_9 + 0.000873015873015875*G0_0_0_1_0 + 0.00388888888888887*G0_0_0_1_2 - 0.0142857142857142*G0_0_0_1_3 + 0.0178571428571428*G0_0_0_1_4 + 0.00214285714285713*G0_0_0_1_5 + 0.0192857142857142*G0_0_0_1_6 + 0.00357142857142855*G0_0_0_1_7 - 0.00714285714285709*G0_0_0_1_8 + 0.0214285714285714*G0_0_0_1_9 + 0.00563492063492061*G0_0_0_2_0 + 0.00388888888888887*G0_0_0_2_1 + 0.0619047619047615*G0_0_0_2_2 - 0.0214285714285713*G0_0_0_2_3 + 0.0428571428571425*G0_0_0_2_4 - 0.0214285714285713*G0_0_0_2_5 + 0.0428571428571425*G0_0_0_2_6 + 0.00214285714285714*G0_0_0_2_7 - 0.00214285714285712*G0_0_0_2_8 - 0.00642857142857142*G0_0_0_3_0 - 0.0142857142857142*G0_0_0_3_1 - 0.0214285714285713*G0_0_0_3_2 - 0.0578571428571425*G0_0_0_3_4 + 0.0128571428571428*G0_0_0_3_5 - 0.0707142857142853*G0_0_0_3_6 + 0.00642857142857139*G0_0_0_3_7 - 0.0771428571428567*G0_0_0_3_9 + 0.015*G0_0_0_4_0 + 0.0178571428571428*G0_0_0_4_1 + 0.0428571428571425*G0_0_0_4_2 - 0.0578571428571425*G0_0_0_4_3 + 0.192857142857142*G0_0_0_4_4 - 0.0578571428571426*G0_0_0_4_5 + 0.128571428571428*G0_0_0_4_6 - 0.0192857142857142*G0_0_0_4_7 - 0.0064285714285714*G0_0_0_4_8 + 0.115714285714285*G0_0_0_4_9 - 0.00714285714285714*G0_0_0_5_0 + 0.00214285714285713*G0_0_0_5_1 - 0.0214285714285713*G0_0_0_5_2 + 0.0128571428571428*G0_0_0_5_3 - 0.0578571428571426*G0_0_0_5_4 + 0.154285714285714*G0_0_0_5_5 - 0.0707142857142853*G0_0_0_5_6 + 0.0385714285714284*G0_0_0_5_7 - 0.0192857142857142*G0_0_0_5_8 + 0.0257142857142857*G0_0_0_5_9 + 0.0121428571428572*G0_0_0_6_0 + 0.0192857142857142*G0_0_0_6_1 + 0.0428571428571425*G0_0_0_6_2 - 0.0707142857142853*G0_0_0_6_3 + 0.128571428571428*G0_0_0_6_4 - 0.0707142857142853*G0_0_0_6_5 + 0.32142857142857*G0_0_0_6_6 - 0.0192857142857142*G0_0_0_6_7 - 0.0192857142857142*G0_0_0_6_8 + 0.141428571428571*G0_0_0_6_9 + 0.00357142857142855*G0_0_0_7_1 + 0.00214285714285714*G0_0_0_7_2 + 0.00642857142857139*G0_0_0_7_3 - 0.0192857142857142*G0_0_0_7_4 + 0.0385714285714284*G0_0_0_7_5 - 0.0192857142857142*G0_0_0_7_6 + 0.0257142857142856*G0_0_0_7_7 - 0.00642857142857142*G0_0_0_7_8 + 0.0257142857142856*G0_0_0_7_9 - 0.00214285714285713*G0_0_0_8_0 - 0.00714285714285709*G0_0_0_8_1 - 0.00214285714285712*G0_0_0_8_2 - 0.0064285714285714*G0_0_0_8_4 - 0.0192857142857142*G0_0_0_8_5 - 0.0192857142857142*G0_0_0_8_6 - 0.00642857142857142*G0_0_0_8_7 - 0.0514285714285712*G0_0_0_8_9 + 0.00428571428571431*G0_0_0_9_0 + 0.0214285714285714*G0_0_0_9_1 - 0.0771428571428568*G0_0_0_9_3 + 0.115714285714285*G0_0_0_9_4 + 0.0257142857142856*G0_0_0_9_5 + 0.141428571428571*G0_0_0_9_6 + 0.0257142857142856*G0_0_0_9_7 - 0.0514285714285712*G0_0_0_9_8 + 0.308571428571427*G0_0_0_9_9 + 0.00317460317460315*G0_1_0_0_0 - 0.00357142857142855*G0_1_0_0_1 - 0.000555555555555555*G0_1_0_0_2 - 0.00928571428571425*G0_1_0_0_3 + 0.00785714285714283*G0_1_0_0_4 + 0.00214285714285714*G0_1_0_0_6 + 0.0071428571428571*G0_1_0_0_7 - 0.0121428571428571*G0_1_0_0_8 - 0.00428571428571426*G0_1_0_0_9 - 0.00357142857142855*G0_1_0_1_0 - 0.0523809523809521*G0_1_0_1_1 - 0.00357142857142854*G0_1_0_1_2 - 0.0428571428571426*G0_1_0_1_3 + 0.0214285714285713*G0_1_0_1_4 + 0.00357142857142855*G0_1_0_1_5 + 0.00357142857142855*G0_1_0_1_6 + 0.0214285714285713*G0_1_0_1_7 - 0.0428571428571426*G0_1_0_1_8 - 0.000555555555555555*G0_1_0_2_0 - 0.00357142857142854*G0_1_0_2_1 + 0.00317460317460313*G0_1_0_2_2 - 0.012142857142857*G0_1_0_2_3 + 0.00714285714285707*G0_1_0_2_4 + 0.00214285714285714*G0_1_0_2_5 + 0.00785714285714281*G0_1_0_2_7 - 0.00928571428571422*G0_1_0_2_8 - 0.00428571428571427*G0_1_0_2_9 - 0.00928571428571425*G0_1_0_3_0 - 0.0428571428571426*G0_1_0_3_1 - 0.012142857142857*G0_1_0_3_2 - 0.128571428571428*G0_1_0_3_3 + 0.0321428571428569*G0_1_0_3_4 + 0.00642857142857139*G0_1_0_3_5 - 0.00642857142857139*G0_1_0_3_6 + 0.032142857142857*G0_1_0_3_7 - 0.0642857142857139*G0_1_0_3_8 - 0.064285714285714*G0_1_0_3_9 + 0.00785714285714283*G0_1_0_4_0 + 0.0214285714285713*G0_1_0_4_1 + 0.00714285714285707*G0_1_0_4_2 + 0.0321428571428569*G0_1_0_4_3 + 0.0385714285714284*G0_1_0_4_4 - 0.0192857142857142*G0_1_0_4_5 + 0.0257142857142856*G0_1_0_4_6 - 0.0257142857142856*G0_1_0_4_7 + 0.0321428571428569*G0_1_0_4_8 + 0.0514285714285712*G0_1_0_4_9 + 0.00357142857142855*G0_1_0_5_1 + 0.00214285714285714*G0_1_0_5_2 + 0.00642857142857139*G0_1_0_5_3 - 0.0192857142857142*G0_1_0_5_4 + 0.0385714285714284*G0_1_0_5_5 - 0.0192857142857142*G0_1_0_5_6 + 0.0257142857142856*G0_1_0_5_7 - 0.00642857142857142*G0_1_0_5_8 + 0.0257142857142856*G0_1_0_5_9 + 0.00214285714285714*G0_1_0_6_0 + 0.00357142857142855*G0_1_0_6_1 - 0.00642857142857139*G0_1_0_6_3 + 0.0257142857142856*G0_1_0_6_4 - 0.0192857142857142*G0_1_0_6_5 + 0.0385714285714283*G0_1_0_6_6 - 0.0192857142857142*G0_1_0_6_7 + 0.00642857142857138*G0_1_0_6_8 + 0.0257142857142856*G0_1_0_6_9 + 0.0071428571428571*G0_1_0_7_0 + 0.0214285714285713*G0_1_0_7_1 + 0.00785714285714281*G0_1_0_7_2 + 0.032142857142857*G0_1_0_7_3 - 0.0257142857142856*G0_1_0_7_4 + 0.0257142857142856*G0_1_0_7_5 - 0.0192857142857142*G0_1_0_7_6 + 0.0385714285714283*G0_1_0_7_7 + 0.0321428571428569*G0_1_0_7_8 + 0.0514285714285712*G0_1_0_7_9 - 0.0121428571428571*G0_1_0_8_0 - 0.0428571428571426*G0_1_0_8_1 - 0.00928571428571422*G0_1_0_8_2 - 0.0642857142857139*G0_1_0_8_3 + 0.0321428571428569*G0_1_0_8_4 - 0.00642857142857142*G0_1_0_8_5 + 0.00642857142857138*G0_1_0_8_6 + 0.0321428571428569*G0_1_0_8_7 - 0.128571428571428*G0_1_0_8_8 - 0.064285714285714*G0_1_0_8_9 - 0.00428571428571426*G0_1_0_9_0 - 0.00428571428571427*G0_1_0_9_2 - 0.064285714285714*G0_1_0_9_3 + 0.0514285714285712*G0_1_0_9_4 + 0.0257142857142856*G0_1_0_9_5 + 0.0257142857142856*G0_1_0_9_6 + 0.0514285714285712*G0_1_0_9_7 - 0.064285714285714*G0_1_0_9_8 + 0.154285714285714*G0_1_0_9_9; + A[29] = -A[23] + 0.0555555555555553*G0_1_0_0_0 + 0.003015873015873*G0_1_0_0_2 - 0.0128571428571428*G0_1_0_0_3 + 0.00428571428571426*G0_1_0_0_4 + 0.0428571428571426*G0_1_0_0_5 - 0.0192857142857142*G0_1_0_0_6 + 0.0499999999999997*G0_1_0_0_7 - 0.0335714285714284*G0_1_0_0_8 - 0.00428571428571424*G0_1_0_0_9 - 0.0555555555555552*G0_1_0_1_1 - 0.00301587301587299*G0_1_0_1_2 - 0.0428571428571426*G0_1_0_1_3 + 0.0192857142857141*G0_1_0_1_4 + 0.0128571428571428*G0_1_0_1_5 - 0.00428571428571428*G0_1_0_1_6 + 0.0335714285714284*G0_1_0_1_7 - 0.0499999999999997*G0_1_0_1_8 + 0.00428571428571428*G0_1_0_1_9 + 0.003015873015873*G0_1_0_2_0 - 0.00301587301587299*G0_1_0_2_1 - 0.0142857142857142*G0_1_0_2_3 + 0.00714285714285709*G0_1_0_2_4 + 0.0142857142857142*G0_1_0_2_5 - 0.00714285714285711*G0_1_0_2_6 + 0.017142857142857*G0_1_0_2_7 - 0.017142857142857*G0_1_0_2_8 - 0.0128571428571428*G0_1_0_3_0 - 0.0428571428571426*G0_1_0_3_1 - 0.0142857142857142*G0_1_0_3_2 - 0.167142857142856*G0_1_0_3_3 + 0.0514285714285711*G0_1_0_3_4 + 0.0128571428571428*G0_1_0_3_6 + 0.0385714285714284*G0_1_0_3_7 - 0.0899999999999995*G0_1_0_3_8 - 0.0899999999999996*G0_1_0_3_9 + 0.00428571428571426*G0_1_0_4_0 + 0.0192857142857141*G0_1_0_4_1 + 0.00714285714285709*G0_1_0_4_2 + 0.0514285714285711*G0_1_0_4_3 - 0.0128571428571428*G0_1_0_4_5 - 0.032142857142857*G0_1_0_4_7 + 0.0514285714285711*G0_1_0_4_8 + 0.0257142857142856*G0_1_0_4_9 + 0.0428571428571426*G0_1_0_5_0 + 0.0128571428571428*G0_1_0_5_1 + 0.0142857142857142*G0_1_0_5_2 - 0.0128571428571428*G0_1_0_5_4 + 0.167142857142856*G0_1_0_5_5 - 0.0514285714285712*G0_1_0_5_6 + 0.0899999999999996*G0_1_0_5_7 - 0.0385714285714284*G0_1_0_5_8 + 0.0899999999999997*G0_1_0_5_9 - 0.0192857142857142*G0_1_0_6_0 - 0.00428571428571428*G0_1_0_6_1 - 0.00714285714285711*G0_1_0_6_2 + 0.0128571428571428*G0_1_0_6_3 - 0.0514285714285712*G0_1_0_6_5 - 0.0514285714285712*G0_1_0_6_7 + 0.032142857142857*G0_1_0_6_8 - 0.0257142857142856*G0_1_0_6_9 + 0.0499999999999997*G0_1_0_7_0 + 0.0335714285714284*G0_1_0_7_1 + 0.017142857142857*G0_1_0_7_2 + 0.0385714285714284*G0_1_0_7_3 - 0.032142857142857*G0_1_0_7_4 + 0.0899999999999996*G0_1_0_7_5 - 0.0514285714285712*G0_1_0_7_6 + 0.167142857142856*G0_1_0_7_7 + 0.115714285714285*G0_1_0_7_9 - 0.0335714285714284*G0_1_0_8_0 - 0.0499999999999997*G0_1_0_8_1 - 0.017142857142857*G0_1_0_8_2 - 0.0899999999999995*G0_1_0_8_3 + 0.0514285714285711*G0_1_0_8_4 - 0.0385714285714284*G0_1_0_8_5 + 0.032142857142857*G0_1_0_8_6 - 0.167142857142856*G0_1_0_8_8 - 0.115714285714285*G0_1_0_8_9 - 0.00428571428571424*G0_1_0_9_0 + 0.00428571428571428*G0_1_0_9_1 - 0.0899999999999996*G0_1_0_9_3 + 0.0257142857142856*G0_1_0_9_4 + 0.0899999999999997*G0_1_0_9_5 - 0.0257142857142856*G0_1_0_9_6 + 0.115714285714285*G0_1_0_9_7 - 0.115714285714285*G0_1_0_9_8 - 0.00634920634920631*G0_1_1_0_0 - 0.0056349206349206*G0_1_1_0_1 - 0.000873015873015868*G0_1_1_0_2 - 0.0149999999999999*G0_1_1_0_3 + 0.00642857142857141*G0_1_1_0_4 + 0.00214285714285713*G0_1_1_0_6 + 0.00714285714285711*G0_1_1_0_7 - 0.0121428571428571*G0_1_1_0_8 - 0.00428571428571429*G0_1_1_0_9 - 0.0056349206349206*G0_1_1_1_0 - 0.0619047619047615*G0_1_1_1_1 - 0.00388888888888885*G0_1_1_1_2 - 0.0428571428571426*G0_1_1_1_3 + 0.0214285714285713*G0_1_1_1_4 - 0.00214285714285714*G0_1_1_1_5 + 0.00214285714285712*G0_1_1_1_6 + 0.0214285714285713*G0_1_1_1_7 - 0.0428571428571426*G0_1_1_1_8 - 0.000873015873015868*G0_1_1_2_0 - 0.00388888888888886*G0_1_1_2_1 - 0.0178571428571427*G0_1_1_2_3 + 0.0142857142857142*G0_1_1_2_4 - 0.00357142857142855*G0_1_1_2_5 + 0.00714285714285709*G0_1_1_2_6 - 0.00214285714285713*G0_1_1_2_7 - 0.0192857142857141*G0_1_1_2_8 - 0.0214285714285713*G0_1_1_2_9 - 0.0149999999999999*G0_1_1_3_0 - 0.0428571428571426*G0_1_1_3_1 - 0.0178571428571427*G0_1_1_3_2 - 0.192857142857142*G0_1_1_3_3 + 0.0578571428571425*G0_1_1_3_4 + 0.0192857142857142*G0_1_1_3_5 + 0.00642857142857139*G0_1_1_3_6 + 0.0578571428571426*G0_1_1_3_7 - 0.128571428571428*G0_1_1_3_8 - 0.115714285714285*G0_1_1_3_9 + 0.00642857142857141*G0_1_1_4_0 + 0.0214285714285713*G0_1_1_4_1 + 0.0142857142857142*G0_1_1_4_2 + 0.0578571428571425*G0_1_1_4_3 - 0.00642857142857139*G0_1_1_4_5 - 0.0128571428571428*G0_1_1_4_7 + 0.0707142857142852*G0_1_1_4_8 + 0.0771428571428568*G0_1_1_4_9 - 0.00214285714285714*G0_1_1_5_1 - 0.00357142857142855*G0_1_1_5_2 + 0.0192857142857142*G0_1_1_5_3 - 0.00642857142857139*G0_1_1_5_4 - 0.0257142857142856*G0_1_1_5_5 + 0.00642857142857139*G0_1_1_5_6 - 0.0385714285714283*G0_1_1_5_7 + 0.0192857142857142*G0_1_1_5_8 - 0.0257142857142856*G0_1_1_5_9 + 0.00214285714285713*G0_1_1_6_0 + 0.00214285714285712*G0_1_1_6_1 + 0.00714285714285709*G0_1_1_6_2 + 0.00642857142857138*G0_1_1_6_3 + 0.00642857142857139*G0_1_1_6_5 + 0.0192857142857142*G0_1_1_6_7 + 0.0192857142857141*G0_1_1_6_8 + 0.0514285714285712*G0_1_1_6_9 + 0.00714285714285711*G0_1_1_7_0 + 0.0214285714285713*G0_1_1_7_1 - 0.00214285714285713*G0_1_1_7_2 + 0.0578571428571426*G0_1_1_7_3 - 0.0128571428571428*G0_1_1_7_4 - 0.0385714285714283*G0_1_1_7_5 + 0.0192857142857142*G0_1_1_7_6 - 0.154285714285713*G0_1_1_7_7 + 0.0707142857142854*G0_1_1_7_8 - 0.0257142857142856*G0_1_1_7_9 - 0.0121428571428571*G0_1_1_8_0 - 0.0428571428571426*G0_1_1_8_1 - 0.0192857142857141*G0_1_1_8_2 - 0.128571428571428*G0_1_1_8_3 + 0.0707142857142852*G0_1_1_8_4 + 0.0192857142857142*G0_1_1_8_5 + 0.0192857142857141*G0_1_1_8_6 + 0.0707142857142853*G0_1_1_8_7 - 0.32142857142857*G0_1_1_8_8 - 0.141428571428571*G0_1_1_8_9 - 0.00428571428571429*G0_1_1_9_0 - 0.0214285714285713*G0_1_1_9_2 - 0.115714285714285*G0_1_1_9_3 + 0.0771428571428568*G0_1_1_9_4 - 0.0257142857142856*G0_1_1_9_5 + 0.0514285714285712*G0_1_1_9_6 - 0.0257142857142856*G0_1_1_9_7 - 0.141428571428571*G0_1_1_9_8 - 0.308571428571428*G0_1_1_9_9; + A[22] = -A[34] - 0.00634920634920631*G0_0_0_0_0 - 0.000873015873015875*G0_0_0_0_1 - 0.00563492063492061*G0_0_0_0_2 + 0.00642857142857142*G0_0_0_0_3 - 0.015*G0_0_0_0_4 + 0.00714285714285714*G0_0_0_0_5 - 0.0121428571428572*G0_0_0_0_6 + 0.00214285714285713*G0_0_0_0_8 - 0.00428571428571431*G0_0_0_0_9 - 0.000873015873015875*G0_0_0_1_0 - 0.00388888888888887*G0_0_0_1_2 + 0.0142857142857142*G0_0_0_1_3 - 0.0178571428571428*G0_0_0_1_4 - 0.00214285714285713*G0_0_0_1_5 - 0.0192857142857142*G0_0_0_1_6 - 0.00357142857142855*G0_0_0_1_7 + 0.00714285714285709*G0_0_0_1_8 - 0.0214285714285714*G0_0_0_1_9 - 0.00563492063492061*G0_0_0_2_0 - 0.00388888888888887*G0_0_0_2_1 - 0.0619047619047615*G0_0_0_2_2 + 0.0214285714285713*G0_0_0_2_3 - 0.0428571428571425*G0_0_0_2_4 + 0.0214285714285713*G0_0_0_2_5 - 0.0428571428571425*G0_0_0_2_6 - 0.00214285714285714*G0_0_0_2_7 + 0.00214285714285712*G0_0_0_2_8 + 0.00642857142857142*G0_0_0_3_0 + 0.0142857142857142*G0_0_0_3_1 + 0.0214285714285713*G0_0_0_3_2 + 0.0578571428571425*G0_0_0_3_4 - 0.0128571428571428*G0_0_0_3_5 + 0.0707142857142853*G0_0_0_3_6 - 0.00642857142857139*G0_0_0_3_7 + 0.0771428571428568*G0_0_0_3_9 - 0.015*G0_0_0_4_0 - 0.0178571428571428*G0_0_0_4_1 - 0.0428571428571425*G0_0_0_4_2 + 0.0578571428571425*G0_0_0_4_3 - 0.192857142857142*G0_0_0_4_4 + 0.0578571428571426*G0_0_0_4_5 - 0.128571428571428*G0_0_0_4_6 + 0.0192857142857142*G0_0_0_4_7 + 0.0064285714285714*G0_0_0_4_8 - 0.115714285714285*G0_0_0_4_9 + 0.00714285714285714*G0_0_0_5_0 - 0.00214285714285713*G0_0_0_5_1 + 0.0214285714285713*G0_0_0_5_2 - 0.0128571428571428*G0_0_0_5_3 + 0.0578571428571426*G0_0_0_5_4 - 0.154285714285714*G0_0_0_5_5 + 0.0707142857142853*G0_0_0_5_6 - 0.0385714285714284*G0_0_0_5_7 + 0.0192857142857142*G0_0_0_5_8 - 0.0257142857142856*G0_0_0_5_9 - 0.0121428571428572*G0_0_0_6_0 - 0.0192857142857142*G0_0_0_6_1 - 0.0428571428571425*G0_0_0_6_2 + 0.0707142857142853*G0_0_0_6_3 - 0.128571428571428*G0_0_0_6_4 + 0.0707142857142853*G0_0_0_6_5 - 0.32142857142857*G0_0_0_6_6 + 0.0192857142857142*G0_0_0_6_7 + 0.0192857142857142*G0_0_0_6_8 - 0.141428571428571*G0_0_0_6_9 - 0.00357142857142855*G0_0_0_7_1 - 0.00214285714285714*G0_0_0_7_2 - 0.00642857142857139*G0_0_0_7_3 + 0.0192857142857142*G0_0_0_7_4 - 0.0385714285714284*G0_0_0_7_5 + 0.0192857142857142*G0_0_0_7_6 - 0.0257142857142856*G0_0_0_7_7 + 0.00642857142857142*G0_0_0_7_8 - 0.0257142857142856*G0_0_0_7_9 + 0.00214285714285713*G0_0_0_8_0 + 0.00714285714285709*G0_0_0_8_1 + 0.00214285714285712*G0_0_0_8_2 + 0.0064285714285714*G0_0_0_8_4 + 0.0192857142857142*G0_0_0_8_5 + 0.0192857142857142*G0_0_0_8_6 + 0.00642857142857142*G0_0_0_8_7 + 0.0514285714285712*G0_0_0_8_9 - 0.00428571428571431*G0_0_0_9_0 - 0.0214285714285714*G0_0_0_9_1 + 0.0771428571428567*G0_0_0_9_3 - 0.115714285714285*G0_0_0_9_4 - 0.0257142857142856*G0_0_0_9_5 - 0.141428571428571*G0_0_0_9_6 - 0.0257142857142856*G0_0_0_9_7 + 0.0514285714285712*G0_0_0_9_8 - 0.308571428571427*G0_0_0_9_9 + 0.0555555555555552*G0_0_1_0_0 + 0.00301587301587299*G0_0_1_0_1 + 0.00428571428571428*G0_0_1_0_3 - 0.0128571428571428*G0_0_1_0_4 + 0.0499999999999997*G0_0_1_0_5 - 0.0335714285714284*G0_0_1_0_6 + 0.0428571428571426*G0_0_1_0_7 - 0.0192857142857142*G0_0_1_0_8 - 0.00428571428571425*G0_0_1_0_9 + 0.00301587301587299*G0_0_1_1_0 - 0.003015873015873*G0_0_1_1_2 + 0.0071428571428571*G0_0_1_1_3 - 0.0142857142857142*G0_0_1_1_4 + 0.0171428571428571*G0_0_1_1_5 - 0.0171428571428571*G0_0_1_1_6 + 0.0142857142857142*G0_0_1_1_7 - 0.00714285714285712*G0_0_1_1_8 - 0.003015873015873*G0_0_1_2_1 - 0.0555555555555552*G0_0_1_2_2 + 0.0192857142857141*G0_0_1_2_3 - 0.0428571428571426*G0_0_1_2_4 + 0.0335714285714284*G0_0_1_2_5 - 0.0499999999999997*G0_0_1_2_6 + 0.0128571428571428*G0_0_1_2_7 - 0.00428571428571428*G0_0_1_2_8 + 0.00428571428571431*G0_0_1_2_9 + 0.00428571428571427*G0_0_1_3_0 + 0.0071428571428571*G0_0_1_3_1 + 0.0192857142857141*G0_0_1_3_2 + 0.0514285714285711*G0_0_1_3_4 - 0.032142857142857*G0_0_1_3_5 + 0.0514285714285711*G0_0_1_3_6 - 0.0128571428571428*G0_0_1_3_7 + 0.0257142857142856*G0_0_1_3_9 - 0.0128571428571428*G0_0_1_4_0 - 0.0142857142857142*G0_0_1_4_1 - 0.0428571428571426*G0_0_1_4_2 + 0.0514285714285711*G0_0_1_4_3 - 0.167142857142856*G0_0_1_4_4 + 0.0385714285714284*G0_0_1_4_5 - 0.0899999999999996*G0_0_1_4_6 + 0.0128571428571428*G0_0_1_4_8 - 0.0899999999999996*G0_0_1_4_9 + 0.0499999999999997*G0_0_1_5_0 + 0.0171428571428571*G0_0_1_5_1 + 0.0335714285714284*G0_0_1_5_2 - 0.032142857142857*G0_0_1_5_3 + 0.0385714285714284*G0_0_1_5_4 + 0.167142857142856*G0_0_1_5_5 + 0.0899999999999996*G0_0_1_5_7 - 0.0514285714285712*G0_0_1_5_8 + 0.115714285714285*G0_0_1_5_9 - 0.0335714285714284*G0_0_1_6_0 - 0.0171428571428571*G0_0_1_6_1 - 0.0499999999999997*G0_0_1_6_2 + 0.0514285714285711*G0_0_1_6_3 - 0.0899999999999996*G0_0_1_6_4 - 0.167142857142856*G0_0_1_6_6 - 0.0385714285714284*G0_0_1_6_7 + 0.032142857142857*G0_0_1_6_8 - 0.115714285714285*G0_0_1_6_9 + 0.0428571428571426*G0_0_1_7_0 + 0.0142857142857142*G0_0_1_7_1 + 0.0128571428571428*G0_0_1_7_2 - 0.0128571428571428*G0_0_1_7_3 + 0.0899999999999996*G0_0_1_7_5 - 0.0385714285714284*G0_0_1_7_6 + 0.167142857142856*G0_0_1_7_7 - 0.0514285714285712*G0_0_1_7_8 + 0.0899999999999997*G0_0_1_7_9 - 0.0192857142857142*G0_0_1_8_0 - 0.00714285714285712*G0_0_1_8_1 - 0.00428571428571428*G0_0_1_8_2 + 0.0128571428571428*G0_0_1_8_4 - 0.0514285714285712*G0_0_1_8_5 + 0.032142857142857*G0_0_1_8_6 - 0.0514285714285712*G0_0_1_8_7 - 0.0257142857142857*G0_0_1_8_9 - 0.00428571428571425*G0_0_1_9_0 + 0.00428571428571431*G0_0_1_9_2 + 0.0257142857142856*G0_0_1_9_3 - 0.0899999999999996*G0_0_1_9_4 + 0.115714285714285*G0_0_1_9_5 - 0.115714285714285*G0_0_1_9_6 + 0.0899999999999997*G0_0_1_9_7 - 0.0257142857142857*G0_0_1_9_8; + A[28] = -A[22] - 0.00317460317460314*G0_1_0_0_0 + 0.000555555555555562*G0_1_0_0_1 + 0.00357142857142856*G0_1_0_0_2 - 0.00785714285714284*G0_1_0_0_3 + 0.00928571428571427*G0_1_0_0_4 - 0.0071428571428571*G0_1_0_0_5 + 0.0121428571428571*G0_1_0_0_6 - 0.00214285714285714*G0_1_0_0_8 + 0.00428571428571427*G0_1_0_0_9 + 0.000555555555555562*G0_1_0_1_0 - 0.00317460317460313*G0_1_0_1_1 + 0.00357142857142856*G0_1_0_1_2 - 0.00714285714285709*G0_1_0_1_3 + 0.0121428571428571*G0_1_0_1_4 - 0.00785714285714283*G0_1_0_1_5 + 0.00928571428571425*G0_1_0_1_6 - 0.00214285714285714*G0_1_0_1_7 + 0.00428571428571427*G0_1_0_1_9 + 0.00357142857142856*G0_1_0_2_0 + 0.00357142857142856*G0_1_0_2_1 + 0.0523809523809521*G0_1_0_2_2 - 0.0214285714285713*G0_1_0_2_3 + 0.0428571428571426*G0_1_0_2_4 - 0.0214285714285713*G0_1_0_2_5 + 0.0428571428571426*G0_1_0_2_6 - 0.00357142857142855*G0_1_0_2_7 - 0.00357142857142854*G0_1_0_2_8 - 0.00785714285714283*G0_1_0_3_0 - 0.00714285714285709*G0_1_0_3_1 - 0.0214285714285713*G0_1_0_3_2 - 0.0385714285714284*G0_1_0_3_3 - 0.032142857142857*G0_1_0_3_4 + 0.0257142857142856*G0_1_0_3_5 - 0.0321428571428569*G0_1_0_3_6 + 0.0192857142857142*G0_1_0_3_7 - 0.0257142857142856*G0_1_0_3_8 - 0.0514285714285712*G0_1_0_3_9 + 0.00928571428571427*G0_1_0_4_0 + 0.0121428571428571*G0_1_0_4_1 + 0.0428571428571426*G0_1_0_4_2 - 0.032142857142857*G0_1_0_4_3 + 0.128571428571428*G0_1_0_4_4 - 0.032142857142857*G0_1_0_4_5 + 0.064285714285714*G0_1_0_4_6 - 0.00642857142857139*G0_1_0_4_7 + 0.00642857142857137*G0_1_0_4_8 + 0.064285714285714*G0_1_0_4_9 - 0.0071428571428571*G0_1_0_5_0 - 0.00785714285714283*G0_1_0_5_1 - 0.0214285714285713*G0_1_0_5_2 + 0.0257142857142856*G0_1_0_5_3 - 0.032142857142857*G0_1_0_5_4 - 0.0385714285714284*G0_1_0_5_5 - 0.032142857142857*G0_1_0_5_6 - 0.0257142857142856*G0_1_0_5_7 + 0.0192857142857142*G0_1_0_5_8 - 0.0514285714285712*G0_1_0_5_9 + 0.0121428571428571*G0_1_0_6_0 + 0.00928571428571425*G0_1_0_6_1 + 0.0428571428571426*G0_1_0_6_2 - 0.0321428571428569*G0_1_0_6_3 + 0.064285714285714*G0_1_0_6_4 - 0.032142857142857*G0_1_0_6_5 + 0.128571428571428*G0_1_0_6_6 + 0.00642857142857139*G0_1_0_6_7 - 0.0064285714285714*G0_1_0_6_8 + 0.064285714285714*G0_1_0_6_9 - 0.00214285714285714*G0_1_0_7_1 - 0.00357142857142855*G0_1_0_7_2 + 0.0192857142857142*G0_1_0_7_3 - 0.00642857142857139*G0_1_0_7_4 - 0.0257142857142856*G0_1_0_7_5 + 0.00642857142857139*G0_1_0_7_6 - 0.0385714285714283*G0_1_0_7_7 + 0.0192857142857142*G0_1_0_7_8 - 0.0257142857142856*G0_1_0_7_9 - 0.00214285714285714*G0_1_0_8_0 - 0.00357142857142854*G0_1_0_8_2 - 0.0257142857142856*G0_1_0_8_3 + 0.00642857142857137*G0_1_0_8_4 + 0.0192857142857142*G0_1_0_8_5 - 0.0064285714285714*G0_1_0_8_6 + 0.0192857142857142*G0_1_0_8_7 - 0.0385714285714282*G0_1_0_8_8 - 0.0257142857142855*G0_1_0_8_9 + 0.00428571428571427*G0_1_0_9_0 + 0.00428571428571427*G0_1_0_9_1 - 0.0514285714285712*G0_1_0_9_3 + 0.064285714285714*G0_1_0_9_4 - 0.0514285714285712*G0_1_0_9_5 + 0.064285714285714*G0_1_0_9_6 - 0.0257142857142856*G0_1_0_9_7 - 0.0257142857142855*G0_1_0_9_8 - 0.154285714285714*G0_1_0_9_9 + 0.0587301587301584*G0_1_1_0_0 + 0.00619047619047616*G0_1_1_0_1 + 0.00746031746031743*G0_1_1_0_2 - 0.0057142857142857*G0_1_1_0_3 + 0.00714285714285712*G0_1_1_0_4 + 0.0357142857142854*G0_1_1_0_5 - 0.00928571428571419*G0_1_1_0_6 + 0.0428571428571426*G0_1_1_0_7 - 0.0235714285714284*G0_1_1_0_8 + 0.00428571428571431*G0_1_1_0_9 + 0.00619047619047616*G0_1_1_1_0 + 0.00317460317460318*G0_1_1_1_1 + 0.00444444444444443*G0_1_1_1_2 - 0.0071428571428571*G0_1_1_1_3 + 0.00999999999999995*G0_1_1_1_4 + 0.0071428571428571*G0_1_1_1_5 + 0.00285714285714286*G0_1_1_1_6 + 0.00999999999999994*G0_1_1_1_7 - 0.0071428571428571*G0_1_1_1_8 + 0.00857142857142855*G0_1_1_1_9 + 0.00746031746031743*G0_1_1_2_0 + 0.00444444444444443*G0_1_1_2_1 + 0.0523809523809521*G0_1_1_2_2 - 0.0178571428571427*G0_1_1_2_3 + 0.0357142857142855*G0_1_1_2_4 - 0.00357142857142854*G0_1_1_2_5 + 0.0285714285714284*G0_1_1_2_6 + 0.0157142857142856*G0_1_1_2_7 - 0.00142857142857142*G0_1_1_2_8 + 0.0214285714285713*G0_1_1_2_9 - 0.0057142857142857*G0_1_1_3_0 - 0.0071428571428571*G0_1_1_3_1 - 0.0178571428571427*G0_1_1_3_2 - 0.0128571428571428*G0_1_1_3_3 - 0.0385714285714284*G0_1_1_3_4 + 0.00642857142857139*G0_1_1_3_5 - 0.0257142857142856*G0_1_1_3_6 + 0.0128571428571428*G0_1_1_3_8 - 0.0257142857142856*G0_1_1_3_9 + 0.00714285714285712*G0_1_1_4_0 + 0.00999999999999995*G0_1_1_4_1 + 0.0357142857142855*G0_1_1_4_2 - 0.0385714285714283*G0_1_1_4_3 + 0.128571428571428*G0_1_1_4_4 - 0.0385714285714284*G0_1_1_4_5 + 0.064285714285714*G0_1_1_4_6 - 0.0257142857142856*G0_1_1_4_7 - 0.0128571428571428*G0_1_1_4_8 + 0.0128571428571428*G0_1_1_4_9 + 0.0357142857142854*G0_1_1_5_0 + 0.0071428571428571*G0_1_1_5_1 - 0.00357142857142854*G0_1_1_5_2 + 0.00642857142857139*G0_1_1_5_3 - 0.0385714285714284*G0_1_1_5_4 + 0.154285714285713*G0_1_1_5_5 - 0.0899999999999995*G0_1_1_5_6 + 0.102857142857142*G0_1_1_5_7 - 0.0385714285714284*G0_1_1_5_8 + 0.0642857142857141*G0_1_1_5_9 - 0.00928571428571418*G0_1_1_6_0 + 0.00285714285714286*G0_1_1_6_1 + 0.0285714285714284*G0_1_1_6_2 - 0.0257142857142856*G0_1_1_6_3 + 0.064285714285714*G0_1_1_6_4 - 0.0899999999999995*G0_1_1_6_5 + 0.128571428571428*G0_1_1_6_6 - 0.0642857142857139*G0_1_1_6_7 + 0.00642857142857143*G0_1_1_6_8 - 0.0128571428571428*G0_1_1_6_9 + 0.0428571428571426*G0_1_1_7_0 + 0.00999999999999994*G0_1_1_7_1 + 0.0157142857142856*G0_1_1_7_2 - 0.0257142857142856*G0_1_1_7_4 + 0.102857142857142*G0_1_1_7_5 - 0.0642857142857139*G0_1_1_7_6 + 0.282857142857141*G0_1_1_7_7 - 0.0514285714285712*G0_1_1_7_8 + 0.115714285714285*G0_1_1_7_9 - 0.0235714285714284*G0_1_1_8_0 - 0.0071428571428571*G0_1_1_8_1 - 0.00142857142857142*G0_1_1_8_2 + 0.0128571428571428*G0_1_1_8_3 - 0.0128571428571428*G0_1_1_8_4 - 0.0385714285714284*G0_1_1_8_5 + 0.00642857142857143*G0_1_1_8_6 - 0.0514285714285712*G0_1_1_8_7 + 0.115714285714285*G0_1_1_8_8 + 0.00428571428571431*G0_1_1_9_0 + 0.00857142857142855*G0_1_1_9_1 + 0.0214285714285713*G0_1_1_9_2 - 0.0257142857142856*G0_1_1_9_3 + 0.0128571428571428*G0_1_1_9_4 + 0.0642857142857141*G0_1_1_9_5 - 0.0128571428571428*G0_1_1_9_6 + 0.115714285714285*G0_1_1_9_7 + 0.154285714285714*G0_1_1_9_9; + A[19] = -A[25] - 0.0115079365079364*G0_1_0_0_0 + 0.00295634920634919*G0_1_0_0_1 + 0.000575396825396826*G0_1_0_0_2 + 0.00874999999999997*G0_1_0_0_3 - 0.0019642857142857*G0_1_0_0_4 - 0.0124999999999999*G0_1_0_0_5 + 0.00678571428571426*G0_1_0_0_6 - 0.0160714285714285*G0_1_0_0_7 + 0.0139285714285714*G0_1_0_0_8 + 0.00428571428571427*G0_1_0_0_9 + 0.00295634920634919*G0_1_0_1_0 + 0.0440476190476188*G0_1_0_1_1 + 0.00359126984126981*G0_1_0_1_2 + 0.0303571428571426*G0_1_0_1_3 - 0.0124999999999999*G0_1_0_1_4 - 0.00410714285714284*G0_1_0_1_5 + 0.00232142857142857*G0_1_0_1_6 - 0.019642857142857*G0_1_0_1_7 + 0.0339285714285712*G0_1_0_1_8 + 0.000575396825396826*G0_1_0_2_0 + 0.00359126984126981*G0_1_0_2_1 + 0.013095238095238*G0_1_0_2_2 + 0.00714285714285709*G0_1_0_2_3 + 0.00178571428571429*G0_1_0_2_4 - 0.00714285714285711*G0_1_0_2_5 + 0.00892857142857139*G0_1_0_2_6 - 0.00410714285714283*G0_1_0_2_7 + 0.0130357142857142*G0_1_0_2_8 + 0.0107142857142857*G0_1_0_2_9 + 0.00874999999999997*G0_1_0_3_0 + 0.0303571428571426*G0_1_0_3_1 + 0.00714285714285709*G0_1_0_3_2 + 0.128571428571428*G0_1_0_3_3 - 0.0498214285714282*G0_1_0_3_4 - 0.0032142857142857*G0_1_0_3_5 - 0.0144642857142856*G0_1_0_3_6 - 0.0337499999999998*G0_1_0_3_7 + 0.0803571428571424*G0_1_0_3_8 + 0.0674999999999997*G0_1_0_3_9 - 0.0019642857142857*G0_1_0_4_0 - 0.0124999999999999*G0_1_0_4_1 + 0.00178571428571429*G0_1_0_4_2 - 0.0498214285714282*G0_1_0_4_3 + 0.0321428571428569*G0_1_0_4_4 - 0.00160714285714285*G0_1_0_4_5 + 0.0160714285714285*G0_1_0_4_6 + 0.0128571428571428*G0_1_0_4_7 - 0.0466071428571426*G0_1_0_4_8 - 0.0289285714285713*G0_1_0_4_9 - 0.0124999999999999*G0_1_0_5_0 - 0.00410714285714284*G0_1_0_5_1 - 0.00714285714285711*G0_1_0_5_2 - 0.0032142857142857*G0_1_0_5_3 - 0.00160714285714285*G0_1_0_5_4 - 0.0385714285714284*G0_1_0_5_5 + 0.00160714285714284*G0_1_0_5_6 - 0.00964285714285711*G0_1_0_5_7 + 0.00482142857142857*G0_1_0_5_8 - 0.0225*G0_1_0_5_9 + 0.00678571428571426*G0_1_0_6_0 + 0.00232142857142857*G0_1_0_6_1 + 0.00892857142857139*G0_1_0_6_2 - 0.0144642857142856*G0_1_0_6_3 + 0.0160714285714285*G0_1_0_6_4 + 0.00160714285714284*G0_1_0_6_5 + 0.032142857142857*G0_1_0_6_6 + 0.00482142857142855*G0_1_0_6_7 - 0.0192857142857142*G0_1_0_6_8 - 0.00321428571428568*G0_1_0_6_9 - 0.0160714285714285*G0_1_0_7_0 - 0.019642857142857*G0_1_0_7_1 - 0.00410714285714283*G0_1_0_7_2 - 0.0337499999999998*G0_1_0_7_3 + 0.0128571428571428*G0_1_0_7_4 - 0.00964285714285711*G0_1_0_7_5 + 0.00482142857142855*G0_1_0_7_6 + 0.0257142857142856*G0_1_0_7_7 - 0.0305357142857141*G0_1_0_7_8 - 0.0224999999999999*G0_1_0_7_9 + 0.0139285714285714*G0_1_0_8_0 + 0.0339285714285712*G0_1_0_8_1 + 0.0130357142857142*G0_1_0_8_2 + 0.0803571428571424*G0_1_0_8_3 - 0.0466071428571426*G0_1_0_8_4 + 0.00482142857142857*G0_1_0_8_5 - 0.0192857142857142*G0_1_0_8_6 - 0.0305357142857141*G0_1_0_8_7 + 0.192857142857142*G0_1_0_8_8 + 0.0932142857142853*G0_1_0_8_9 + 0.00428571428571427*G0_1_0_9_0 + 0.0107142857142857*G0_1_0_9_2 + 0.0674999999999997*G0_1_0_9_3 - 0.0289285714285713*G0_1_0_9_4 - 0.0225*G0_1_0_9_5 - 0.00321428571428568*G0_1_0_9_6 - 0.0224999999999999*G0_1_0_9_7 + 0.0932142857142853*G0_1_0_9_8 + 0.115714285714285*G0_1_0_9_9; + A[18] = -A[19] - 0.00317460317460314*G0_0_0_0_0 - 0.000873015873015867*G0_0_0_0_2 + 0.00428571428571428*G0_0_0_0_3 + 0.00214285714285715*G0_0_0_0_4 - 0.00357142857142855*G0_0_0_0_5 + 0.00285714285714283*G0_0_0_0_6 - 0.00357142857142854*G0_0_0_0_7 + 0.00285714285714284*G0_0_0_0_8 + 0.00857142857142855*G0_0_0_0_9 + 0.00317460317460313*G0_0_0_1_1 + 0.000873015873015867*G0_0_0_1_2 + 0.00357142857142854*G0_0_0_1_3 - 0.00285714285714282*G0_0_0_1_4 - 0.00428571428571427*G0_0_0_1_5 - 0.00214285714285714*G0_0_0_1_6 - 0.00285714285714284*G0_0_0_1_7 + 0.00357142857142854*G0_0_0_1_8 - 0.00857142857142854*G0_0_0_1_9 - 0.000873015873015867*G0_0_0_2_0 + 0.000873015873015867*G0_0_0_2_1 - 0.00214285714285713*G0_0_0_2_7 + 0.00214285714285713*G0_0_0_2_8 + 0.00428571428571428*G0_0_0_3_0 + 0.00357142857142854*G0_0_0_3_1 + 0.0771428571428567*G0_0_0_3_3 - 0.00642857142857137*G0_0_0_3_4 + 0.00642857142857138*G0_0_0_3_6 - 0.0128571428571428*G0_0_0_3_7 + 0.0192857142857142*G0_0_0_3_8 + 0.0514285714285712*G0_0_0_3_9 + 0.00214285714285715*G0_0_0_4_0 - 0.00285714285714283*G0_0_0_4_1 - 0.00642857142857137*G0_0_0_4_3 + 0.064285714285714*G0_0_0_4_4 - 0.00642857142857141*G0_0_0_4_5 - 0.00642857142857139*G0_0_0_4_8 + 0.0128571428571429*G0_0_0_4_9 - 0.00357142857142855*G0_0_0_5_0 - 0.00428571428571427*G0_0_0_5_1 - 0.00642857142857141*G0_0_0_5_4 - 0.0771428571428568*G0_0_0_5_5 + 0.00642857142857137*G0_0_0_5_6 - 0.0192857142857142*G0_0_0_5_7 + 0.0128571428571428*G0_0_0_5_8 - 0.0514285714285713*G0_0_0_5_9 + 0.00285714285714283*G0_0_0_6_0 - 0.00214285714285714*G0_0_0_6_1 + 0.00642857142857139*G0_0_0_6_3 + 0.00642857142857137*G0_0_0_6_5 - 0.064285714285714*G0_0_0_6_6 + 0.00642857142857138*G0_0_0_6_7 - 0.0128571428571428*G0_0_0_6_9 - 0.00357142857142854*G0_0_0_7_0 - 0.00285714285714284*G0_0_0_7_1 - 0.00214285714285713*G0_0_0_7_2 - 0.0128571428571428*G0_0_0_7_3 - 0.0192857142857142*G0_0_0_7_5 + 0.00642857142857138*G0_0_0_7_6 - 0.0128571428571428*G0_0_0_7_7 - 0.0385714285714284*G0_0_0_7_9 + 0.00285714285714284*G0_0_0_8_0 + 0.00357142857142854*G0_0_0_8_1 + 0.00214285714285713*G0_0_0_8_2 + 0.0192857142857142*G0_0_0_8_3 - 0.00642857142857139*G0_0_0_8_4 + 0.0128571428571428*G0_0_0_8_5 + 0.0128571428571427*G0_0_0_8_8 + 0.0385714285714284*G0_0_0_8_9 + 0.00857142857142855*G0_0_0_9_0 - 0.00857142857142854*G0_0_0_9_1 + 0.0514285714285712*G0_0_0_9_3 + 0.0128571428571429*G0_0_0_9_4 - 0.0514285714285713*G0_0_0_9_5 - 0.0128571428571428*G0_0_0_9_6 - 0.0385714285714284*G0_0_0_9_7 + 0.0385714285714284*G0_0_0_9_8 - 0.00238095238095235*G0_0_1_0_0 + 0.00013888888888889*G0_0_1_0_1 + 0.000456349206349207*G0_0_1_0_2 + 0.000178571428571431*G0_0_1_0_3 + 0.00339285714285714*G0_0_1_0_4 - 0.00357142857142855*G0_0_1_0_5 + 0.00446428571428569*G0_0_1_0_6 - 0.00178571428571427*G0_0_1_0_7 + 0.000892857142857134*G0_0_1_0_8 + 0.00535714285714284*G0_0_1_0_9 + 0.00013888888888889*G0_0_1_1_0 + 0.000793650793650785*G0_0_1_1_1 + 0.00132936507936507*G0_0_1_1_2 + 0.00160714285714286*G0_0_1_1_4 - 0.00410714285714284*G0_0_1_1_5 + 0.00124999999999999*G0_0_1_1_6 - 0.0019642857142857*G0_0_1_1_7 + 0.00178571428571427*G0_0_1_1_8 - 0.0032142857142857*G0_0_1_1_9 + 0.000456349206349208*G0_0_1_2_0 + 0.00132936507936507*G0_0_1_2_1 + 0.013095238095238*G0_0_1_2_2 - 0.00535714285714282*G0_0_1_2_3 + 0.0107142857142856*G0_0_1_2_4 - 0.00535714285714283*G0_0_1_2_5 + 0.0107142857142857*G0_0_1_2_6 - 0.0019642857142857*G0_0_1_2_7 + 0.00017857142857143*G0_0_1_2_8 + 0.000178571428571431*G0_0_1_3_0 - 0.00535714285714283*G0_0_1_3_2 + 0.0289285714285713*G0_0_1_3_3 - 0.0112499999999999*G0_0_1_3_4 + 0.00642857142857139*G0_0_1_3_5 - 0.00482142857142855*G0_0_1_3_6 - 0.00160714285714285*G0_0_1_3_7 + 0.0032142857142857*G0_0_1_3_8 + 0.0128571428571428*G0_0_1_3_9 + 0.00339285714285714*G0_0_1_4_0 + 0.00160714285714286*G0_0_1_4_1 + 0.0107142857142856*G0_0_1_4_2 - 0.0112499999999999*G0_0_1_4_3 + 0.0642857142857139*G0_0_1_4_4 - 0.0112499999999999*G0_0_1_4_5 + 0.0160714285714285*G0_0_1_4_6 - 0.00160714285714285*G0_0_1_4_7 - 0.00160714285714285*G0_0_1_4_8 + 0.0224999999999999*G0_0_1_4_9 - 0.00357142857142855*G0_0_1_5_0 - 0.00410714285714284*G0_0_1_5_1 - 0.00535714285714283*G0_0_1_5_2 + 0.00642857142857139*G0_0_1_5_3 - 0.0112499999999999*G0_0_1_5_4 - 0.0482142857142855*G0_0_1_5_5 - 0.00482142857142856*G0_0_1_5_6 - 0.0160714285714285*G0_0_1_5_7 + 0.01125*G0_0_1_5_8 - 0.0385714285714284*G0_0_1_5_9 + 0.00446428571428569*G0_0_1_6_0 + 0.00124999999999999*G0_0_1_6_1 + 0.0107142857142857*G0_0_1_6_2 - 0.00482142857142855*G0_0_1_6_3 + 0.0160714285714285*G0_0_1_6_4 - 0.00482142857142856*G0_0_1_6_5 + 0.00482142857142854*G0_0_1_6_7 - 0.00160714285714285*G0_0_1_6_8 + 0.00964285714285711*G0_0_1_6_9 - 0.00178571428571427*G0_0_1_7_0 - 0.0019642857142857*G0_0_1_7_1 - 0.0019642857142857*G0_0_1_7_2 - 0.00160714285714285*G0_0_1_7_3 - 0.00160714285714285*G0_0_1_7_4 - 0.0160714285714285*G0_0_1_7_5 + 0.00482142857142854*G0_0_1_7_6 - 0.0160714285714284*G0_0_1_7_7 + 0.00482142857142855*G0_0_1_7_8 - 0.0257142857142856*G0_0_1_7_9 + 0.000892857142857134*G0_0_1_8_0 + 0.00178571428571427*G0_0_1_8_1 + 0.00017857142857143*G0_0_1_8_2 + 0.0032142857142857*G0_0_1_8_3 - 0.00160714285714285*G0_0_1_8_4 + 0.01125*G0_0_1_8_5 - 0.00160714285714285*G0_0_1_8_6 + 0.00482142857142856*G0_0_1_8_7 - 0.0032142857142857*G0_0_1_8_8 + 0.0128571428571428*G0_0_1_8_9 + 0.00535714285714284*G0_0_1_9_0 - 0.0032142857142857*G0_0_1_9_1 + 0.0128571428571428*G0_0_1_9_3 + 0.0224999999999999*G0_0_1_9_4 - 0.0385714285714284*G0_0_1_9_5 + 0.00964285714285711*G0_0_1_9_6 - 0.0257142857142856*G0_0_1_9_7 + 0.0128571428571428*G0_0_1_9_8 - 0.0385714285714285*G0_0_1_9_9 - 0.00158730158730157*G0_1_0_0_0 + 0.00373015873015871*G0_1_0_0_1 + 0.00071428571428571*G0_1_0_0_2 + 0.0142857142857142*G0_1_0_0_3 - 0.00285714285714283*G0_1_0_0_4 - 0.00357142857142855*G0_1_0_0_5 + 0.00071428571428571*G0_1_0_0_6 - 0.0107142857142857*G0_1_0_0_7 + 0.0149999999999999*G0_1_0_0_8 + 0.0128571428571428*G0_1_0_0_9 + 0.00373015873015871*G0_1_0_1_0 + 0.0571428571428568*G0_1_0_1_1 + 0.00460317460317456*G0_1_0_1_2 + 0.0428571428571426*G0_1_0_1_3 - 0.0214285714285713*G0_1_0_1_4 - 0.00285714285714284*G0_1_0_1_5 - 0.000714285714285703*G0_1_0_1_6 - 0.0214285714285713*G0_1_0_1_7 + 0.0428571428571426*G0_1_0_1_8 + 0.00071428571428571*G0_1_0_2_0 + 0.00460317460317456*G0_1_0_2_1 + 0.00158730158730158*G0_1_0_2_2 + 0.012142857142857*G0_1_0_2_3 - 0.00714285714285709*G0_1_0_2_4 - 0.00214285714285713*G0_1_0_2_5 - 0.00714285714285709*G0_1_0_2_7 + 0.0121428571428571*G0_1_0_2_8 + 0.00428571428571425*G0_1_0_2_9 + 0.0142857142857142*G0_1_0_3_0 + 0.0428571428571426*G0_1_0_3_1 + 0.012142857142857*G0_1_0_3_2 + 0.224999999999999*G0_1_0_3_3 - 0.051428571428571*G0_1_0_3_4 - 0.0128571428571428*G0_1_0_3_5 - 0.00642857142857139*G0_1_0_3_6 - 0.0514285714285712*G0_1_0_3_7 + 0.0964285714285709*G0_1_0_3_8 + 0.102857142857142*G0_1_0_3_9 - 0.00285714285714283*G0_1_0_4_0 - 0.0214285714285713*G0_1_0_4_1 - 0.00714285714285709*G0_1_0_4_2 - 0.051428571428571*G0_1_0_4_3 + 0.0578571428571425*G0_1_0_4_4 + 0.00642857142857141*G0_1_0_4_6 + 0.0192857142857142*G0_1_0_4_7 - 0.0449999999999997*G0_1_0_4_8 - 0.0128571428571427*G0_1_0_4_9 - 0.00357142857142855*G0_1_0_5_0 - 0.00285714285714284*G0_1_0_5_1 - 0.00214285714285713*G0_1_0_5_2 - 0.0128571428571428*G0_1_0_5_3 - 0.0192857142857142*G0_1_0_5_5 + 0.00642857142857138*G0_1_0_5_6 - 0.0128571428571428*G0_1_0_5_7 - 0.0385714285714284*G0_1_0_5_9 + 0.00071428571428571*G0_1_0_6_0 - 0.000714285714285703*G0_1_0_6_1 - 0.00642857142857139*G0_1_0_6_3 + 0.00642857142857141*G0_1_0_6_4 + 0.00642857142857138*G0_1_0_6_5 - 0.00642857142857138*G0_1_0_6_6 + 0.0128571428571428*G0_1_0_6_7 - 0.0128571428571428*G0_1_0_6_8 - 0.0107142857142857*G0_1_0_7_0 - 0.0214285714285713*G0_1_0_7_1 - 0.00714285714285709*G0_1_0_7_2 - 0.0514285714285712*G0_1_0_7_3 + 0.0192857142857142*G0_1_0_7_4 - 0.0128571428571428*G0_1_0_7_5 + 0.0128571428571428*G0_1_0_7_6 - 0.0192857142857141*G0_1_0_7_7 - 0.0449999999999997*G0_1_0_7_8 - 0.064285714285714*G0_1_0_7_9 + 0.0149999999999999*G0_1_0_8_0 + 0.0428571428571426*G0_1_0_8_1 + 0.0121428571428571*G0_1_0_8_2 + 0.0964285714285709*G0_1_0_8_3 - 0.0449999999999997*G0_1_0_8_4 - 0.0128571428571428*G0_1_0_8_6 - 0.0449999999999997*G0_1_0_8_7 + 0.160714285714285*G0_1_0_8_8 + 0.0899999999999996*G0_1_0_8_9 + 0.0128571428571428*G0_1_0_9_0 + 0.00428571428571425*G0_1_0_9_2 + 0.102857142857142*G0_1_0_9_3 - 0.0128571428571427*G0_1_0_9_4 - 0.0385714285714284*G0_1_0_9_5 - 0.064285714285714*G0_1_0_9_7 + 0.0899999999999996*G0_1_0_9_8 + 0.0771428571428569*G0_1_0_9_9 - 0.00238095238095236*G0_1_1_0_0 + 0.000456349206349206*G0_1_1_0_1 + 0.000138888888888888*G0_1_1_0_2 + 0.00339285714285714*G0_1_1_0_3 + 0.000178571428571435*G0_1_1_0_4 - 0.00178571428571427*G0_1_1_0_5 + 0.000892857142857137*G0_1_1_0_6 - 0.00357142857142855*G0_1_1_0_7 + 0.00446428571428569*G0_1_1_0_8 + 0.00535714285714284*G0_1_1_0_9 + 0.000456349206349206*G0_1_1_1_0 + 0.013095238095238*G0_1_1_1_1 + 0.00132936507936507*G0_1_1_1_2 + 0.0107142857142857*G0_1_1_1_3 - 0.00535714285714282*G0_1_1_1_4 - 0.0019642857142857*G0_1_1_1_5 + 0.000178571428571429*G0_1_1_1_6 - 0.00535714285714283*G0_1_1_1_7 + 0.0107142857142857*G0_1_1_1_8 + 0.000138888888888888*G0_1_1_2_0 + 0.00132936507936507*G0_1_1_2_1 + 0.000793650793650784*G0_1_1_2_2 + 0.00160714285714285*G0_1_1_2_3 - 0.0019642857142857*G0_1_1_2_5 + 0.00178571428571427*G0_1_1_2_6 - 0.00410714285714283*G0_1_1_2_7 + 0.00124999999999999*G0_1_1_2_8 - 0.0032142857142857*G0_1_1_2_9 + 0.00339285714285714*G0_1_1_3_0 + 0.0107142857142857*G0_1_1_3_1 + 0.00160714285714285*G0_1_1_3_2 + 0.0642857142857139*G0_1_1_3_3 - 0.0112499999999999*G0_1_1_3_4 - 0.00160714285714285*G0_1_1_3_5 - 0.00160714285714285*G0_1_1_3_6 - 0.01125*G0_1_1_3_7 + 0.0160714285714285*G0_1_1_3_8 + 0.0224999999999999*G0_1_1_3_9 + 0.000178571428571435*G0_1_1_4_0 - 0.00535714285714282*G0_1_1_4_1 - 0.0112499999999999*G0_1_1_4_3 + 0.0289285714285713*G0_1_1_4_4 - 0.00160714285714285*G0_1_1_4_5 + 0.00321428571428571*G0_1_1_4_6 + 0.00642857142857139*G0_1_1_4_7 - 0.00482142857142855*G0_1_1_4_8 + 0.0128571428571428*G0_1_1_4_9 - 0.00178571428571427*G0_1_1_5_0 - 0.0019642857142857*G0_1_1_5_1 - 0.0019642857142857*G0_1_1_5_2 - 0.00160714285714285*G0_1_1_5_3 - 0.00160714285714285*G0_1_1_5_4 - 0.0160714285714285*G0_1_1_5_5 + 0.00482142857142854*G0_1_1_5_6 - 0.0160714285714285*G0_1_1_5_7 + 0.00482142857142855*G0_1_1_5_8 - 0.0257142857142856*G0_1_1_5_9 + 0.000892857142857137*G0_1_1_6_0 + 0.000178571428571429*G0_1_1_6_1 + 0.00178571428571427*G0_1_1_6_2 - 0.00160714285714285*G0_1_1_6_3 + 0.00321428571428571*G0_1_1_6_4 + 0.00482142857142854*G0_1_1_6_5 - 0.0032142857142857*G0_1_1_6_6 + 0.0112499999999999*G0_1_1_6_7 - 0.00160714285714285*G0_1_1_6_8 + 0.0128571428571428*G0_1_1_6_9 - 0.00357142857142855*G0_1_1_7_0 - 0.00535714285714283*G0_1_1_7_1 - 0.00410714285714283*G0_1_1_7_2 - 0.01125*G0_1_1_7_3 + 0.00642857142857139*G0_1_1_7_4 - 0.0160714285714285*G0_1_1_7_5 + 0.0112499999999999*G0_1_1_7_6 - 0.0482142857142854*G0_1_1_7_7 - 0.00482142857142854*G0_1_1_7_8 - 0.0385714285714284*G0_1_1_7_9 + 0.00446428571428569*G0_1_1_8_0 + 0.0107142857142857*G0_1_1_8_1 + 0.00124999999999999*G0_1_1_8_2 + 0.0160714285714285*G0_1_1_8_3 - 0.00482142857142855*G0_1_1_8_4 + 0.00482142857142855*G0_1_1_8_5 - 0.00160714285714285*G0_1_1_8_6 - 0.00482142857142854*G0_1_1_8_7 + 0.00964285714285713*G0_1_1_8_9 + 0.00535714285714284*G0_1_1_9_0 - 0.0032142857142857*G0_1_1_9_2 + 0.0224999999999999*G0_1_1_9_3 + 0.0128571428571428*G0_1_1_9_4 - 0.0257142857142856*G0_1_1_9_5 + 0.0128571428571428*G0_1_1_9_6 - 0.0385714285714284*G0_1_1_9_7 + 0.00964285714285713*G0_1_1_9_8 - 0.0385714285714284*G0_1_1_9_9; + A[31] = -A[19] - 0.0146825396825396*G0_0_0_0_0 - 0.0038690476190476*G0_0_0_0_1 - 0.00323412698412697*G0_0_0_0_2 - 0.00482142857142855*G0_0_0_0_3 + 0.00160714285714285*G0_0_0_0_4 - 0.00892857142857137*G0_0_0_0_5 + 0.00392857142857138*G0_0_0_0_6 - 0.00535714285714282*G0_0_0_0_7 - 0.0032142857142857*G0_0_0_0_8 - 0.00428571428571429*G0_0_0_0_9 - 0.0038690476190476*G0_0_0_1_0 - 0.0392857142857141*G0_0_0_1_1 - 0.00386904761904759*G0_0_0_1_2 - 0.0267857142857141*G0_0_0_1_3 + 0.0107142857142856*G0_0_0_1_4 - 0.00267857142857142*G0_0_0_1_5 - 0.00267857142857144*G0_0_0_1_6 + 0.0107142857142857*G0_0_0_1_7 - 0.0267857142857141*G0_0_0_1_8 - 0.0107142857142857*G0_0_0_1_9 - 0.00323412698412697*G0_0_0_2_0 - 0.00386904761904759*G0_0_0_2_1 - 0.0146825396825396*G0_0_0_2_2 - 0.00321428571428569*G0_0_0_2_3 - 0.00535714285714283*G0_0_0_2_4 + 0.0039285714285714*G0_0_0_2_5 - 0.00892857142857138*G0_0_0_2_6 + 0.00160714285714284*G0_0_0_2_7 - 0.00482142857142854*G0_0_0_2_8 - 0.00428571428571427*G0_0_0_2_9 - 0.00482142857142855*G0_0_0_3_0 - 0.0267857142857141*G0_0_0_3_1 - 0.00321428571428569*G0_0_0_3_2 - 0.0964285714285709*G0_0_0_3_3 + 0.0401785714285712*G0_0_0_3_4 + 0.00642857142857139*G0_0_0_3_5 + 0.0176785714285713*G0_0_0_3_6 + 0.0241071428571427*G0_0_0_3_7 - 0.0482142857142854*G0_0_0_3_8 - 0.0160714285714285*G0_0_0_3_9 + 0.00160714285714285*G0_0_0_4_0 + 0.0107142857142856*G0_0_0_4_1 - 0.00535714285714283*G0_0_0_4_2 + 0.0401785714285712*G0_0_0_4_3 - 0.0257142857142856*G0_0_0_4_4 + 0.00482142857142857*G0_0_0_4_5 - 0.0224999999999999*G0_0_0_4_6 - 0.00964285714285708*G0_0_0_4_7 + 0.0241071428571427*G0_0_0_4_8 + 0.00321428571428571*G0_0_0_4_9 - 0.00892857142857137*G0_0_0_5_0 - 0.00267857142857142*G0_0_0_5_1 + 0.0039285714285714*G0_0_0_5_2 + 0.00642857142857139*G0_0_0_5_3 + 0.00482142857142857*G0_0_0_5_4 - 0.0899999999999996*G0_0_0_5_5 + 0.020892857142857*G0_0_0_5_6 - 0.0224999999999999*G0_0_0_5_7 + 0.0176785714285714*G0_0_0_5_8 - 0.0225*G0_0_0_5_9 + 0.00392857142857138*G0_0_0_6_0 - 0.00267857142857144*G0_0_0_6_1 - 0.00892857142857138*G0_0_0_6_2 + 0.0176785714285713*G0_0_0_6_3 - 0.0224999999999999*G0_0_0_6_4 + 0.020892857142857*G0_0_0_6_5 - 0.0899999999999997*G0_0_0_6_6 + 0.00482142857142855*G0_0_0_6_7 + 0.00642857142857138*G0_0_0_6_8 - 0.0224999999999999*G0_0_0_6_9 - 0.00535714285714282*G0_0_0_7_0 + 0.0107142857142857*G0_0_0_7_1 + 0.00160714285714284*G0_0_0_7_2 + 0.0241071428571427*G0_0_0_7_3 - 0.00964285714285708*G0_0_0_7_4 - 0.0224999999999999*G0_0_0_7_5 + 0.00482142857142855*G0_0_0_7_6 - 0.0257142857142856*G0_0_0_7_7 + 0.0401785714285712*G0_0_0_7_8 + 0.00321428571428567*G0_0_0_7_9 - 0.0032142857142857*G0_0_0_8_0 - 0.0267857142857141*G0_0_0_8_1 - 0.00482142857142854*G0_0_0_8_2 - 0.0482142857142854*G0_0_0_8_3 + 0.0241071428571427*G0_0_0_8_4 + 0.0176785714285714*G0_0_0_8_5 + 0.00642857142857138*G0_0_0_8_6 + 0.0401785714285712*G0_0_0_8_7 - 0.0964285714285709*G0_0_0_8_8 - 0.0160714285714285*G0_0_0_8_9 - 0.00428571428571429*G0_0_0_9_0 - 0.0107142857142857*G0_0_0_9_1 - 0.00428571428571427*G0_0_0_9_2 - 0.0160714285714285*G0_0_0_9_3 + 0.00321428571428571*G0_0_0_9_4 - 0.0225*G0_0_0_9_5 - 0.0224999999999999*G0_0_0_9_6 + 0.00321428571428567*G0_0_0_9_7 - 0.0160714285714285*G0_0_0_9_8 - 0.0385714285714285*G0_0_0_9_9; + A[3] = A[18] + 0.000317460317460314*G0_0_1_0_1 - 0.000317460317460319*G0_0_1_0_2 + 0.0032142857142857*G0_0_1_0_3 - 0.00321428571428571*G0_0_1_0_4 + 0.00178571428571428*G0_0_1_0_5 - 0.00357142857142855*G0_0_1_0_6 - 0.00178571428571428*G0_0_1_0_7 + 0.00357142857142855*G0_0_1_0_8 + 0.000317460317460314*G0_0_1_1_0 + 0.0123015873015872*G0_0_1_1_1 + 0.0107142857142856*G0_0_1_1_3 - 0.00696428571428567*G0_0_1_1_4 + 0.00214285714285714*G0_0_1_1_5 - 0.00107142857142856*G0_0_1_1_6 - 0.00339285714285712*G0_0_1_1_7 + 0.00892857142857137*G0_0_1_1_8 + 0.00321428571428571*G0_0_1_1_9 - 0.00031746031746032*G0_0_1_2_0 - 0.0123015873015872*G0_0_1_2_2 + 0.00696428571428567*G0_0_1_2_3 - 0.0107142857142856*G0_0_1_2_4 + 0.00339285714285713*G0_0_1_2_5 - 0.00892857142857138*G0_0_1_2_6 - 0.00214285714285713*G0_0_1_2_7 + 0.00107142857142856*G0_0_1_2_8 - 0.0032142857142857*G0_0_1_2_9 + 0.0032142857142857*G0_0_1_3_0 + 0.0107142857142856*G0_0_1_3_1 + 0.00696428571428567*G0_0_1_3_2 + 0.0353571428571426*G0_0_1_3_3 - 0.00803571428571424*G0_0_1_3_5 + 0.0032142857142857*G0_0_1_3_6 - 0.00964285714285709*G0_0_1_3_7 + 0.0128571428571428*G0_0_1_3_8 + 0.0096428571428571*G0_0_1_3_9 - 0.00321428571428571*G0_0_1_4_0 - 0.00696428571428567*G0_0_1_4_1 - 0.0107142857142856*G0_0_1_4_2 - 0.0353571428571427*G0_0_1_4_4 + 0.00964285714285709*G0_0_1_4_5 - 0.0128571428571428*G0_0_1_4_6 + 0.00803571428571424*G0_0_1_4_7 - 0.00321428571428568*G0_0_1_4_8 - 0.00964285714285711*G0_0_1_4_9 + 0.00178571428571428*G0_0_1_5_0 + 0.00214285714285714*G0_0_1_5_1 + 0.00339285714285713*G0_0_1_5_2 - 0.00803571428571424*G0_0_1_5_3 + 0.00964285714285709*G0_0_1_5_4 + 0.032142857142857*G0_0_1_5_5 + 0.0096428571428571*G0_0_1_5_6 - 0.00642857142857141*G0_0_1_5_8 + 0.0128571428571428*G0_0_1_5_9 - 0.00357142857142855*G0_0_1_6_0 - 0.00107142857142856*G0_0_1_6_1 - 0.00892857142857138*G0_0_1_6_2 + 0.0032142857142857*G0_0_1_6_3 - 0.0128571428571428*G0_0_1_6_4 + 0.0096428571428571*G0_0_1_6_5 - 0.00321428571428567*G0_0_1_6_6 + 0.00642857142857139*G0_0_1_6_7 + 0.0032142857142857*G0_0_1_6_9 - 0.00178571428571428*G0_0_1_7_0 - 0.00339285714285712*G0_0_1_7_1 - 0.00214285714285713*G0_0_1_7_2 - 0.00964285714285709*G0_0_1_7_3 + 0.00803571428571424*G0_0_1_7_4 + 0.00642857142857139*G0_0_1_7_6 - 0.032142857142857*G0_0_1_7_7 - 0.00964285714285708*G0_0_1_7_8 - 0.0128571428571428*G0_0_1_7_9 + 0.00357142857142855*G0_0_1_8_0 + 0.00892857142857137*G0_0_1_8_1 + 0.00107142857142856*G0_0_1_8_2 + 0.0128571428571428*G0_0_1_8_3 - 0.00321428571428569*G0_0_1_8_4 - 0.00642857142857141*G0_0_1_8_5 - 0.00964285714285709*G0_0_1_8_7 + 0.00321428571428567*G0_0_1_8_8 - 0.00321428571428571*G0_0_1_8_9 + 0.00321428571428571*G0_0_1_9_1 - 0.0032142857142857*G0_0_1_9_2 + 0.0096428571428571*G0_0_1_9_3 - 0.0096428571428571*G0_0_1_9_4 + 0.0128571428571428*G0_0_1_9_5 + 0.0032142857142857*G0_0_1_9_6 - 0.0128571428571428*G0_0_1_9_7 - 0.00321428571428571*G0_0_1_9_8 - 0.000317460317460314*G0_1_0_0_1 + 0.00031746031746032*G0_1_0_0_2 - 0.0032142857142857*G0_1_0_0_3 + 0.00321428571428571*G0_1_0_0_4 - 0.00178571428571428*G0_1_0_0_5 + 0.00357142857142855*G0_1_0_0_6 + 0.00178571428571428*G0_1_0_0_7 - 0.00357142857142855*G0_1_0_0_8 - 0.000317460317460314*G0_1_0_1_0 - 0.0123015873015872*G0_1_0_1_1 - 0.0107142857142856*G0_1_0_1_3 + 0.00696428571428567*G0_1_0_1_4 - 0.00214285714285714*G0_1_0_1_5 + 0.00107142857142856*G0_1_0_1_6 + 0.00339285714285712*G0_1_0_1_7 - 0.00892857142857137*G0_1_0_1_8 - 0.00321428571428571*G0_1_0_1_9 + 0.00031746031746032*G0_1_0_2_0 + 0.0123015873015872*G0_1_0_2_2 - 0.00696428571428567*G0_1_0_2_3 + 0.0107142857142856*G0_1_0_2_4 - 0.00339285714285713*G0_1_0_2_5 + 0.00892857142857138*G0_1_0_2_6 + 0.00214285714285713*G0_1_0_2_7 - 0.00107142857142856*G0_1_0_2_8 + 0.0032142857142857*G0_1_0_2_9 - 0.0032142857142857*G0_1_0_3_0 - 0.0107142857142856*G0_1_0_3_1 - 0.00696428571428567*G0_1_0_3_2 - 0.0353571428571426*G0_1_0_3_3 + 0.00803571428571424*G0_1_0_3_5 - 0.00321428571428569*G0_1_0_3_6 + 0.00964285714285709*G0_1_0_3_7 - 0.0128571428571428*G0_1_0_3_8 - 0.0096428571428571*G0_1_0_3_9 + 0.00321428571428571*G0_1_0_4_0 + 0.00696428571428567*G0_1_0_4_1 + 0.0107142857142857*G0_1_0_4_2 + 0.0353571428571427*G0_1_0_4_4 - 0.00964285714285709*G0_1_0_4_5 + 0.0128571428571428*G0_1_0_4_6 - 0.00803571428571424*G0_1_0_4_7 + 0.00321428571428569*G0_1_0_4_8 + 0.00964285714285711*G0_1_0_4_9 - 0.00178571428571428*G0_1_0_5_0 - 0.00214285714285714*G0_1_0_5_1 - 0.00339285714285713*G0_1_0_5_2 + 0.00803571428571424*G0_1_0_5_3 - 0.00964285714285709*G0_1_0_5_4 - 0.032142857142857*G0_1_0_5_5 - 0.00964285714285711*G0_1_0_5_6 + 0.00642857142857141*G0_1_0_5_8 - 0.0128571428571428*G0_1_0_5_9 + 0.00357142857142855*G0_1_0_6_0 + 0.00107142857142856*G0_1_0_6_1 + 0.00892857142857138*G0_1_0_6_2 - 0.0032142857142857*G0_1_0_6_3 + 0.0128571428571428*G0_1_0_6_4 - 0.0096428571428571*G0_1_0_6_5 + 0.00321428571428567*G0_1_0_6_6 - 0.00642857142857139*G0_1_0_6_7 - 0.0032142857142857*G0_1_0_6_9 + 0.00178571428571428*G0_1_0_7_0 + 0.00339285714285712*G0_1_0_7_1 + 0.00214285714285713*G0_1_0_7_2 + 0.00964285714285709*G0_1_0_7_3 - 0.00803571428571424*G0_1_0_7_4 - 0.00642857142857139*G0_1_0_7_6 + 0.032142857142857*G0_1_0_7_7 + 0.00964285714285708*G0_1_0_7_8 + 0.0128571428571428*G0_1_0_7_9 - 0.00357142857142855*G0_1_0_8_0 - 0.00892857142857137*G0_1_0_8_1 - 0.00107142857142856*G0_1_0_8_2 - 0.0128571428571428*G0_1_0_8_3 + 0.00321428571428569*G0_1_0_8_4 + 0.0064285714285714*G0_1_0_8_5 + 0.00964285714285709*G0_1_0_8_7 - 0.00321428571428567*G0_1_0_8_8 + 0.00321428571428571*G0_1_0_8_9 - 0.00321428571428571*G0_1_0_9_1 + 0.0032142857142857*G0_1_0_9_2 - 0.0096428571428571*G0_1_0_9_3 + 0.00964285714285711*G0_1_0_9_4 - 0.0128571428571428*G0_1_0_9_5 - 0.0032142857142857*G0_1_0_9_6 + 0.0128571428571428*G0_1_0_9_7 + 0.00321428571428571*G0_1_0_9_8; + A[24] = -A[18] - 0.0440476190476188*G0_1_0_0_0 - 0.00295634920634919*G0_1_0_0_1 - 0.00359126984126982*G0_1_0_0_2 + 0.00410714285714284*G0_1_0_0_3 - 0.00232142857142856*G0_1_0_0_4 - 0.0303571428571427*G0_1_0_0_5 + 0.0124999999999999*G0_1_0_0_6 - 0.0339285714285712*G0_1_0_0_7 + 0.019642857142857*G0_1_0_0_8 - 0.00295634920634919*G0_1_0_1_0 + 0.0115079365079364*G0_1_0_1_1 - 0.000575396825396829*G0_1_0_1_2 + 0.0124999999999999*G0_1_0_1_3 - 0.00678571428571424*G0_1_0_1_4 - 0.00874999999999995*G0_1_0_1_5 + 0.0019642857142857*G0_1_0_1_6 - 0.0139285714285714*G0_1_0_1_7 + 0.0160714285714285*G0_1_0_1_8 - 0.00428571428571428*G0_1_0_1_9 - 0.00359126984126982*G0_1_0_2_0 - 0.000575396825396829*G0_1_0_2_1 - 0.013095238095238*G0_1_0_2_2 + 0.0071428571428571*G0_1_0_2_3 - 0.00892857142857138*G0_1_0_2_4 - 0.0071428571428571*G0_1_0_2_5 - 0.00178571428571429*G0_1_0_2_6 - 0.0130357142857142*G0_1_0_2_7 + 0.00410714285714284*G0_1_0_2_8 - 0.0107142857142857*G0_1_0_2_9 + 0.00410714285714284*G0_1_0_3_0 + 0.0124999999999999*G0_1_0_3_1 + 0.0071428571428571*G0_1_0_3_2 + 0.0385714285714283*G0_1_0_3_3 - 0.00160714285714283*G0_1_0_3_4 + 0.0032142857142857*G0_1_0_3_5 + 0.00160714285714285*G0_1_0_3_6 - 0.00482142857142853*G0_1_0_3_7 + 0.00964285714285709*G0_1_0_3_8 + 0.0224999999999999*G0_1_0_3_9 - 0.00232142857142856*G0_1_0_4_0 - 0.00678571428571424*G0_1_0_4_1 - 0.00892857142857138*G0_1_0_4_2 - 0.00160714285714283*G0_1_0_4_3 - 0.032142857142857*G0_1_0_4_4 + 0.0144642857142857*G0_1_0_4_5 - 0.0160714285714285*G0_1_0_4_6 + 0.0192857142857142*G0_1_0_4_7 - 0.00482142857142855*G0_1_0_4_8 + 0.00321428571428571*G0_1_0_4_9 - 0.0303571428571427*G0_1_0_5_0 - 0.00874999999999995*G0_1_0_5_1 - 0.0071428571428571*G0_1_0_5_2 + 0.0032142857142857*G0_1_0_5_3 + 0.0144642857142857*G0_1_0_5_4 - 0.128571428571428*G0_1_0_5_5 + 0.0498214285714283*G0_1_0_5_6 - 0.0803571428571424*G0_1_0_5_7 + 0.0337499999999999*G0_1_0_5_8 - 0.0674999999999998*G0_1_0_5_9 + 0.0124999999999999*G0_1_0_6_0 + 0.0019642857142857*G0_1_0_6_1 - 0.00178571428571429*G0_1_0_6_2 + 0.00160714285714285*G0_1_0_6_3 - 0.0160714285714285*G0_1_0_6_4 + 0.0498214285714283*G0_1_0_6_5 - 0.032142857142857*G0_1_0_6_6 + 0.0466071428571426*G0_1_0_6_7 - 0.0128571428571428*G0_1_0_6_8 + 0.0289285714285713*G0_1_0_6_9 - 0.0339285714285712*G0_1_0_7_0 - 0.0139285714285714*G0_1_0_7_1 - 0.0130357142857142*G0_1_0_7_2 - 0.00482142857142853*G0_1_0_7_3 + 0.0192857142857142*G0_1_0_7_4 - 0.0803571428571424*G0_1_0_7_5 + 0.0466071428571426*G0_1_0_7_6 - 0.192857142857142*G0_1_0_7_7 + 0.0305357142857142*G0_1_0_7_8 - 0.0932142857142854*G0_1_0_7_9 + 0.019642857142857*G0_1_0_8_0 + 0.0160714285714285*G0_1_0_8_1 + 0.00410714285714284*G0_1_0_8_2 + 0.00964285714285709*G0_1_0_8_3 - 0.00482142857142855*G0_1_0_8_4 + 0.0337499999999999*G0_1_0_8_5 - 0.0128571428571428*G0_1_0_8_6 + 0.0305357142857142*G0_1_0_8_7 - 0.0257142857142856*G0_1_0_8_8 + 0.0225*G0_1_0_8_9 - 0.00428571428571428*G0_1_0_9_1 - 0.0107142857142857*G0_1_0_9_2 + 0.0224999999999999*G0_1_0_9_3 + 0.00321428571428571*G0_1_0_9_4 - 0.0674999999999998*G0_1_0_9_5 + 0.0289285714285713*G0_1_0_9_6 - 0.0932142857142854*G0_1_0_9_7 + 0.0225*G0_1_0_9_8 - 0.115714285714285*G0_1_0_9_9 - 0.0440476190476188*G0_1_1_0_0 - 0.00295634920634919*G0_1_1_0_1 - 0.00359126984126982*G0_1_1_0_2 + 0.00410714285714284*G0_1_1_0_3 - 0.00232142857142856*G0_1_1_0_4 - 0.0303571428571427*G0_1_1_0_5 + 0.0124999999999999*G0_1_1_0_6 - 0.0339285714285712*G0_1_1_0_7 + 0.019642857142857*G0_1_1_0_8 - 0.00295634920634919*G0_1_1_1_0 + 0.0115079365079364*G0_1_1_1_1 - 0.000575396825396826*G0_1_1_1_2 + 0.0124999999999999*G0_1_1_1_3 - 0.00678571428571424*G0_1_1_1_4 - 0.00874999999999995*G0_1_1_1_5 + 0.0019642857142857*G0_1_1_1_6 - 0.0139285714285714*G0_1_1_1_7 + 0.0160714285714285*G0_1_1_1_8 - 0.00428571428571427*G0_1_1_1_9 - 0.00359126984126982*G0_1_1_2_0 - 0.000575396825396827*G0_1_1_2_1 - 0.013095238095238*G0_1_1_2_2 + 0.0071428571428571*G0_1_1_2_3 - 0.00892857142857138*G0_1_1_2_4 - 0.0071428571428571*G0_1_1_2_5 - 0.00178571428571428*G0_1_1_2_6 - 0.0130357142857142*G0_1_1_2_7 + 0.00410714285714284*G0_1_1_2_8 - 0.0107142857142857*G0_1_1_2_9 + 0.00410714285714284*G0_1_1_3_0 + 0.0124999999999999*G0_1_1_3_1 + 0.0071428571428571*G0_1_1_3_2 + 0.0385714285714284*G0_1_1_3_3 - 0.00160714285714285*G0_1_1_3_4 + 0.0032142857142857*G0_1_1_3_5 + 0.00160714285714285*G0_1_1_3_6 - 0.00482142857142854*G0_1_1_3_7 + 0.0096428571428571*G0_1_1_3_8 + 0.0224999999999999*G0_1_1_3_9 - 0.00232142857142856*G0_1_1_4_0 - 0.00678571428571424*G0_1_1_4_1 - 0.00892857142857138*G0_1_1_4_2 - 0.00160714285714285*G0_1_1_4_3 - 0.032142857142857*G0_1_1_4_4 + 0.0144642857142857*G0_1_1_4_5 - 0.0160714285714285*G0_1_1_4_6 + 0.0192857142857142*G0_1_1_4_7 - 0.00482142857142856*G0_1_1_4_8 + 0.00321428571428572*G0_1_1_4_9 - 0.0303571428571427*G0_1_1_5_0 - 0.00874999999999996*G0_1_1_5_1 - 0.0071428571428571*G0_1_1_5_2 + 0.0032142857142857*G0_1_1_5_3 + 0.0144642857142857*G0_1_1_5_4 - 0.128571428571428*G0_1_1_5_5 + 0.0498214285714283*G0_1_1_5_6 - 0.0803571428571424*G0_1_1_5_7 + 0.0337499999999999*G0_1_1_5_8 - 0.0674999999999998*G0_1_1_5_9 + 0.0124999999999999*G0_1_1_6_0 + 0.0019642857142857*G0_1_1_6_1 - 0.00178571428571428*G0_1_1_6_2 + 0.00160714285714285*G0_1_1_6_3 - 0.0160714285714285*G0_1_1_6_4 + 0.0498214285714283*G0_1_1_6_5 - 0.032142857142857*G0_1_1_6_6 + 0.0466071428571426*G0_1_1_6_7 - 0.0128571428571428*G0_1_1_6_8 + 0.0289285714285713*G0_1_1_6_9 - 0.0339285714285712*G0_1_1_7_0 - 0.0139285714285714*G0_1_1_7_1 - 0.0130357142857142*G0_1_1_7_2 - 0.00482142857142854*G0_1_1_7_3 + 0.0192857142857142*G0_1_1_7_4 - 0.0803571428571424*G0_1_1_7_5 + 0.0466071428571426*G0_1_1_7_6 - 0.192857142857142*G0_1_1_7_7 + 0.0305357142857142*G0_1_1_7_8 - 0.0932142857142854*G0_1_1_7_9 + 0.019642857142857*G0_1_1_8_0 + 0.0160714285714285*G0_1_1_8_1 + 0.00410714285714284*G0_1_1_8_2 + 0.0096428571428571*G0_1_1_8_3 - 0.00482142857142856*G0_1_1_8_4 + 0.0337499999999999*G0_1_1_8_5 - 0.0128571428571428*G0_1_1_8_6 + 0.0305357142857142*G0_1_1_8_7 - 0.0257142857142856*G0_1_1_8_8 + 0.0225*G0_1_1_8_9 - 0.00428571428571427*G0_1_1_9_1 - 0.0107142857142857*G0_1_1_9_2 + 0.0224999999999999*G0_1_1_9_3 + 0.00321428571428572*G0_1_1_9_4 - 0.0674999999999998*G0_1_1_9_5 + 0.0289285714285713*G0_1_1_9_6 - 0.0932142857142854*G0_1_1_9_7 + 0.0225*G0_1_1_9_8 - 0.115714285714285*G0_1_1_9_9; + A[30] = -A[18] - 0.0440476190476188*G0_0_0_0_0 - 0.00359126984126982*G0_0_0_0_1 - 0.00295634920634919*G0_0_0_0_2 - 0.00232142857142856*G0_0_0_0_3 + 0.00410714285714286*G0_0_0_0_4 - 0.0339285714285712*G0_0_0_0_5 + 0.019642857142857*G0_0_0_0_6 - 0.0303571428571427*G0_0_0_0_7 + 0.0124999999999999*G0_0_0_0_8 - 0.00359126984126982*G0_0_0_1_0 - 0.013095238095238*G0_0_0_1_1 - 0.000575396825396818*G0_0_0_1_2 - 0.00892857142857137*G0_0_0_1_3 + 0.00714285714285711*G0_0_0_1_4 - 0.0130357142857142*G0_0_0_1_5 + 0.00410714285714284*G0_0_0_1_6 - 0.00714285714285711*G0_0_0_1_7 - 0.00178571428571426*G0_0_0_1_8 - 0.0107142857142857*G0_0_0_1_9 - 0.00295634920634919*G0_0_0_2_0 - 0.000575396825396818*G0_0_0_2_1 + 0.0115079365079365*G0_0_0_2_2 - 0.00678571428571424*G0_0_0_2_3 + 0.0124999999999999*G0_0_0_2_4 - 0.0139285714285714*G0_0_0_2_5 + 0.0160714285714285*G0_0_0_2_6 - 0.00874999999999996*G0_0_0_2_7 + 0.00196428571428571*G0_0_0_2_8 - 0.00428571428571428*G0_0_0_2_9 - 0.00232142857142856*G0_0_0_3_0 - 0.00892857142857137*G0_0_0_3_1 - 0.00678571428571424*G0_0_0_3_2 - 0.032142857142857*G0_0_0_3_3 - 0.00160714285714287*G0_0_0_3_4 + 0.0192857142857142*G0_0_0_3_5 - 0.00482142857142856*G0_0_0_3_6 + 0.0144642857142857*G0_0_0_3_7 - 0.0160714285714285*G0_0_0_3_8 + 0.00321428571428569*G0_0_0_3_9 + 0.00410714285714286*G0_0_0_4_0 + 0.00714285714285711*G0_0_0_4_1 + 0.0124999999999999*G0_0_0_4_2 - 0.00160714285714287*G0_0_0_4_3 + 0.0385714285714284*G0_0_0_4_4 - 0.00482142857142852*G0_0_0_4_5 + 0.00964285714285712*G0_0_0_4_6 + 0.00321428571428572*G0_0_0_4_7 + 0.00160714285714282*G0_0_0_4_8 + 0.0225*G0_0_0_4_9 - 0.0339285714285712*G0_0_0_5_0 - 0.0130357142857142*G0_0_0_5_1 - 0.0139285714285714*G0_0_0_5_2 + 0.0192857142857142*G0_0_0_5_3 - 0.00482142857142853*G0_0_0_5_4 - 0.192857142857142*G0_0_0_5_5 + 0.0305357142857141*G0_0_0_5_6 - 0.0803571428571425*G0_0_0_5_7 + 0.0466071428571427*G0_0_0_5_8 - 0.0932142857142855*G0_0_0_5_9 + 0.019642857142857*G0_0_0_6_0 + 0.00410714285714284*G0_0_0_6_1 + 0.0160714285714285*G0_0_0_6_2 - 0.00482142857142856*G0_0_0_6_3 + 0.00964285714285712*G0_0_0_6_4 + 0.0305357142857141*G0_0_0_6_5 - 0.0257142857142856*G0_0_0_6_6 + 0.0337499999999998*G0_0_0_6_7 - 0.0128571428571428*G0_0_0_6_8 + 0.0225*G0_0_0_6_9 - 0.0303571428571427*G0_0_0_7_0 - 0.00714285714285712*G0_0_0_7_1 - 0.00874999999999996*G0_0_0_7_2 + 0.0144642857142857*G0_0_0_7_3 + 0.00321428571428571*G0_0_0_7_4 - 0.0803571428571425*G0_0_0_7_5 + 0.0337499999999998*G0_0_0_7_6 - 0.128571428571428*G0_0_0_7_7 + 0.0498214285714284*G0_0_0_7_8 - 0.0674999999999998*G0_0_0_7_9 + 0.0124999999999999*G0_0_0_8_0 - 0.00178571428571426*G0_0_0_8_1 + 0.00196428571428571*G0_0_0_8_2 - 0.0160714285714285*G0_0_0_8_3 + 0.00160714285714282*G0_0_0_8_4 + 0.0466071428571427*G0_0_0_8_5 - 0.0128571428571428*G0_0_0_8_6 + 0.0498214285714284*G0_0_0_8_7 - 0.032142857142857*G0_0_0_8_8 + 0.0289285714285714*G0_0_0_8_9 - 0.0107142857142857*G0_0_0_9_1 - 0.00428571428571428*G0_0_0_9_2 + 0.00321428571428569*G0_0_0_9_3 + 0.0225*G0_0_0_9_4 - 0.0932142857142855*G0_0_0_9_5 + 0.0225*G0_0_0_9_6 - 0.0674999999999998*G0_0_0_9_7 + 0.0289285714285714*G0_0_0_9_8 - 0.115714285714285*G0_0_0_9_9 - 0.0440476190476188*G0_0_1_0_0 - 0.00359126984126982*G0_0_1_0_1 - 0.00295634920634919*G0_0_1_0_2 - 0.00232142857142856*G0_0_1_0_3 + 0.00410714285714285*G0_0_1_0_4 - 0.0339285714285712*G0_0_1_0_5 + 0.019642857142857*G0_0_1_0_6 - 0.0303571428571427*G0_0_1_0_7 + 0.0124999999999999*G0_0_1_0_8 - 0.00359126984126982*G0_0_1_1_0 - 0.013095238095238*G0_0_1_1_1 - 0.00057539682539682*G0_0_1_1_2 - 0.00892857142857137*G0_0_1_1_3 + 0.00714285714285711*G0_0_1_1_4 - 0.0130357142857142*G0_0_1_1_5 + 0.00410714285714283*G0_0_1_1_6 - 0.00714285714285711*G0_0_1_1_7 - 0.00178571428571427*G0_0_1_1_8 - 0.0107142857142857*G0_0_1_1_9 - 0.00295634920634919*G0_0_1_2_0 - 0.00057539682539682*G0_0_1_2_1 + 0.0115079365079364*G0_0_1_2_2 - 0.00678571428571424*G0_0_1_2_3 + 0.0124999999999999*G0_0_1_2_4 - 0.0139285714285714*G0_0_1_2_5 + 0.0160714285714285*G0_0_1_2_6 - 0.00874999999999996*G0_0_1_2_7 + 0.00196428571428571*G0_0_1_2_8 - 0.00428571428571428*G0_0_1_2_9 - 0.00232142857142856*G0_0_1_3_0 - 0.00892857142857138*G0_0_1_3_1 - 0.00678571428571424*G0_0_1_3_2 - 0.032142857142857*G0_0_1_3_3 - 0.00160714285714285*G0_0_1_3_4 + 0.0192857142857142*G0_0_1_3_5 - 0.00482142857142855*G0_0_1_3_6 + 0.0144642857142857*G0_0_1_3_7 - 0.0160714285714285*G0_0_1_3_8 + 0.0032142857142857*G0_0_1_3_9 + 0.00410714285714285*G0_0_1_4_0 + 0.00714285714285711*G0_0_1_4_1 + 0.0124999999999999*G0_0_1_4_2 - 0.00160714285714285*G0_0_1_4_3 + 0.0385714285714284*G0_0_1_4_4 - 0.00482142857142852*G0_0_1_4_5 + 0.0096428571428571*G0_0_1_4_6 + 0.00321428571428572*G0_0_1_4_7 + 0.00160714285714283*G0_0_1_4_8 + 0.0224999999999999*G0_0_1_4_9 - 0.0339285714285712*G0_0_1_5_0 - 0.0130357142857142*G0_0_1_5_1 - 0.0139285714285714*G0_0_1_5_2 + 0.0192857142857142*G0_0_1_5_3 - 0.00482142857142852*G0_0_1_5_4 - 0.192857142857142*G0_0_1_5_5 + 0.0305357142857141*G0_0_1_5_6 - 0.0803571428571425*G0_0_1_5_7 + 0.0466071428571427*G0_0_1_5_8 - 0.0932142857142855*G0_0_1_5_9 + 0.019642857142857*G0_0_1_6_0 + 0.00410714285714283*G0_0_1_6_1 + 0.0160714285714285*G0_0_1_6_2 - 0.00482142857142855*G0_0_1_6_3 + 0.0096428571428571*G0_0_1_6_4 + 0.0305357142857141*G0_0_1_6_5 - 0.0257142857142856*G0_0_1_6_6 + 0.0337499999999998*G0_0_1_6_7 - 0.0128571428571428*G0_0_1_6_8 + 0.0224999999999999*G0_0_1_6_9 - 0.0303571428571427*G0_0_1_7_0 - 0.00714285714285711*G0_0_1_7_1 - 0.00874999999999996*G0_0_1_7_2 + 0.0144642857142857*G0_0_1_7_3 + 0.00321428571428572*G0_0_1_7_4 - 0.0803571428571425*G0_0_1_7_5 + 0.0337499999999998*G0_0_1_7_6 - 0.128571428571428*G0_0_1_7_7 + 0.0498214285714284*G0_0_1_7_8 - 0.0674999999999998*G0_0_1_7_9 + 0.0124999999999999*G0_0_1_8_0 - 0.00178571428571427*G0_0_1_8_1 + 0.00196428571428571*G0_0_1_8_2 - 0.0160714285714285*G0_0_1_8_3 + 0.00160714285714283*G0_0_1_8_4 + 0.0466071428571427*G0_0_1_8_5 - 0.0128571428571428*G0_0_1_8_6 + 0.0498214285714284*G0_0_1_8_7 - 0.032142857142857*G0_0_1_8_8 + 0.0289285714285714*G0_0_1_8_9 - 0.0107142857142857*G0_0_1_9_1 - 0.00428571428571428*G0_0_1_9_2 + 0.00321428571428569*G0_0_1_9_3 + 0.0224999999999999*G0_0_1_9_4 - 0.0932142857142855*G0_0_1_9_5 + 0.0224999999999999*G0_0_1_9_6 - 0.0674999999999998*G0_0_1_9_7 + 0.0289285714285714*G0_0_1_9_8 - 0.115714285714285*G0_0_1_9_9; + A[4] = -A[3] - 0.0440476190476188*G0_0_1_0_0 - 0.00295634920634919*G0_0_1_0_1 - 0.00359126984126982*G0_0_1_0_2 + 0.00410714285714284*G0_0_1_0_3 - 0.00232142857142856*G0_0_1_0_4 - 0.0303571428571427*G0_0_1_0_5 + 0.0124999999999999*G0_0_1_0_6 - 0.0339285714285712*G0_0_1_0_7 + 0.019642857142857*G0_0_1_0_8 - 0.00295634920634919*G0_0_1_1_0 + 0.0115079365079364*G0_0_1_1_1 - 0.000575396825396829*G0_0_1_1_2 + 0.0124999999999999*G0_0_1_1_3 - 0.00678571428571424*G0_0_1_1_4 - 0.00874999999999995*G0_0_1_1_5 + 0.0019642857142857*G0_0_1_1_6 - 0.0139285714285714*G0_0_1_1_7 + 0.0160714285714285*G0_0_1_1_8 - 0.00428571428571428*G0_0_1_1_9 - 0.00359126984126982*G0_0_1_2_0 - 0.000575396825396829*G0_0_1_2_1 - 0.013095238095238*G0_0_1_2_2 + 0.0071428571428571*G0_0_1_2_3 - 0.00892857142857138*G0_0_1_2_4 - 0.0071428571428571*G0_0_1_2_5 - 0.00178571428571429*G0_0_1_2_6 - 0.0130357142857142*G0_0_1_2_7 + 0.00410714285714284*G0_0_1_2_8 - 0.0107142857142857*G0_0_1_2_9 + 0.00410714285714284*G0_0_1_3_0 + 0.0124999999999999*G0_0_1_3_1 + 0.0071428571428571*G0_0_1_3_2 + 0.0385714285714283*G0_0_1_3_3 - 0.00160714285714283*G0_0_1_3_4 + 0.0032142857142857*G0_0_1_3_5 + 0.00160714285714286*G0_0_1_3_6 - 0.00482142857142853*G0_0_1_3_7 + 0.00964285714285708*G0_0_1_3_8 + 0.0224999999999999*G0_0_1_3_9 - 0.00232142857142856*G0_0_1_4_0 - 0.00678571428571424*G0_0_1_4_1 - 0.00892857142857138*G0_0_1_4_2 - 0.00160714285714282*G0_0_1_4_3 - 0.032142857142857*G0_0_1_4_4 + 0.0144642857142857*G0_0_1_4_5 - 0.0160714285714285*G0_0_1_4_6 + 0.0192857142857142*G0_0_1_4_7 - 0.00482142857142855*G0_0_1_4_8 + 0.00321428571428571*G0_0_1_4_9 - 0.0303571428571427*G0_0_1_5_0 - 0.00874999999999995*G0_0_1_5_1 - 0.0071428571428571*G0_0_1_5_2 + 0.0032142857142857*G0_0_1_5_3 + 0.0144642857142857*G0_0_1_5_4 - 0.128571428571428*G0_0_1_5_5 + 0.0498214285714283*G0_0_1_5_6 - 0.0803571428571424*G0_0_1_5_7 + 0.0337499999999999*G0_0_1_5_8 - 0.0674999999999998*G0_0_1_5_9 + 0.0124999999999999*G0_0_1_6_0 + 0.0019642857142857*G0_0_1_6_1 - 0.00178571428571429*G0_0_1_6_2 + 0.00160714285714285*G0_0_1_6_3 - 0.0160714285714285*G0_0_1_6_4 + 0.0498214285714283*G0_0_1_6_5 - 0.032142857142857*G0_0_1_6_6 + 0.0466071428571426*G0_0_1_6_7 - 0.0128571428571428*G0_0_1_6_8 + 0.0289285714285713*G0_0_1_6_9 - 0.0339285714285712*G0_0_1_7_0 - 0.0139285714285714*G0_0_1_7_1 - 0.0130357142857142*G0_0_1_7_2 - 0.00482142857142853*G0_0_1_7_3 + 0.0192857142857142*G0_0_1_7_4 - 0.0803571428571424*G0_0_1_7_5 + 0.0466071428571426*G0_0_1_7_6 - 0.192857142857142*G0_0_1_7_7 + 0.0305357142857142*G0_0_1_7_8 - 0.0932142857142854*G0_0_1_7_9 + 0.019642857142857*G0_0_1_8_0 + 0.0160714285714285*G0_0_1_8_1 + 0.00410714285714284*G0_0_1_8_2 + 0.00964285714285708*G0_0_1_8_3 - 0.00482142857142855*G0_0_1_8_4 + 0.0337499999999999*G0_0_1_8_5 - 0.0128571428571428*G0_0_1_8_6 + 0.0305357142857142*G0_0_1_8_7 - 0.0257142857142856*G0_0_1_8_8 + 0.0225*G0_0_1_8_9 - 0.00428571428571428*G0_0_1_9_1 - 0.0107142857142857*G0_0_1_9_2 + 0.0224999999999999*G0_0_1_9_3 + 0.00321428571428571*G0_0_1_9_4 - 0.0674999999999998*G0_0_1_9_5 + 0.0289285714285713*G0_0_1_9_6 - 0.0932142857142854*G0_0_1_9_7 + 0.0225*G0_0_1_9_8 - 0.115714285714285*G0_0_1_9_9 - 0.0440476190476188*G0_1_1_0_0 - 0.00295634920634919*G0_1_1_0_1 - 0.00359126984126982*G0_1_1_0_2 + 0.00410714285714285*G0_1_1_0_3 - 0.00232142857142856*G0_1_1_0_4 - 0.0303571428571427*G0_1_1_0_5 + 0.0124999999999999*G0_1_1_0_6 - 0.0339285714285712*G0_1_1_0_7 + 0.019642857142857*G0_1_1_0_8 - 0.00295634920634919*G0_1_1_1_0 + 0.0115079365079365*G0_1_1_1_1 - 0.000575396825396826*G0_1_1_1_2 + 0.0124999999999999*G0_1_1_1_3 - 0.00678571428571424*G0_1_1_1_4 - 0.00874999999999995*G0_1_1_1_5 + 0.0019642857142857*G0_1_1_1_6 - 0.0139285714285714*G0_1_1_1_7 + 0.0160714285714285*G0_1_1_1_8 - 0.00428571428571427*G0_1_1_1_9 - 0.00359126984126982*G0_1_1_2_0 - 0.000575396825396827*G0_1_1_2_1 - 0.013095238095238*G0_1_1_2_2 + 0.0071428571428571*G0_1_1_2_3 - 0.00892857142857138*G0_1_1_2_4 - 0.00714285714285711*G0_1_1_2_5 - 0.00178571428571428*G0_1_1_2_6 - 0.0130357142857142*G0_1_1_2_7 + 0.00410714285714284*G0_1_1_2_8 - 0.0107142857142857*G0_1_1_2_9 + 0.00410714285714285*G0_1_1_3_0 + 0.0124999999999999*G0_1_1_3_1 + 0.0071428571428571*G0_1_1_3_2 + 0.0385714285714284*G0_1_1_3_3 - 0.00160714285714284*G0_1_1_3_4 + 0.0032142857142857*G0_1_1_3_5 + 0.00160714285714285*G0_1_1_3_6 - 0.00482142857142854*G0_1_1_3_7 + 0.0096428571428571*G0_1_1_3_8 + 0.0224999999999999*G0_1_1_3_9 - 0.00232142857142856*G0_1_1_4_0 - 0.00678571428571425*G0_1_1_4_1 - 0.00892857142857138*G0_1_1_4_2 - 0.00160714285714284*G0_1_1_4_3 - 0.032142857142857*G0_1_1_4_4 + 0.0144642857142857*G0_1_1_4_5 - 0.0160714285714285*G0_1_1_4_6 + 0.0192857142857142*G0_1_1_4_7 - 0.00482142857142856*G0_1_1_4_8 + 0.00321428571428571*G0_1_1_4_9 - 0.0303571428571427*G0_1_1_5_0 - 0.00874999999999995*G0_1_1_5_1 - 0.0071428571428571*G0_1_1_5_2 + 0.0032142857142857*G0_1_1_5_3 + 0.0144642857142857*G0_1_1_5_4 - 0.128571428571428*G0_1_1_5_5 + 0.0498214285714283*G0_1_1_5_6 - 0.0803571428571424*G0_1_1_5_7 + 0.0337499999999999*G0_1_1_5_8 - 0.0674999999999998*G0_1_1_5_9 + 0.0124999999999999*G0_1_1_6_0 + 0.0019642857142857*G0_1_1_6_1 - 0.00178571428571428*G0_1_1_6_2 + 0.00160714285714285*G0_1_1_6_3 - 0.0160714285714285*G0_1_1_6_4 + 0.0498214285714283*G0_1_1_6_5 - 0.032142857142857*G0_1_1_6_6 + 0.0466071428571426*G0_1_1_6_7 - 0.0128571428571428*G0_1_1_6_8 + 0.0289285714285713*G0_1_1_6_9 - 0.0339285714285712*G0_1_1_7_0 - 0.0139285714285714*G0_1_1_7_1 - 0.0130357142857142*G0_1_1_7_2 - 0.00482142857142854*G0_1_1_7_3 + 0.0192857142857142*G0_1_1_7_4 - 0.0803571428571424*G0_1_1_7_5 + 0.0466071428571426*G0_1_1_7_6 - 0.192857142857142*G0_1_1_7_7 + 0.0305357142857142*G0_1_1_7_8 - 0.0932142857142854*G0_1_1_7_9 + 0.019642857142857*G0_1_1_8_0 + 0.0160714285714285*G0_1_1_8_1 + 0.00410714285714284*G0_1_1_8_2 + 0.0096428571428571*G0_1_1_8_3 - 0.00482142857142856*G0_1_1_8_4 + 0.0337499999999999*G0_1_1_8_5 - 0.0128571428571428*G0_1_1_8_6 + 0.0305357142857142*G0_1_1_8_7 - 0.0257142857142856*G0_1_1_8_8 + 0.0225*G0_1_1_8_9 - 0.00428571428571427*G0_1_1_9_1 - 0.0107142857142857*G0_1_1_9_2 + 0.0224999999999999*G0_1_1_9_3 + 0.00321428571428571*G0_1_1_9_4 - 0.0674999999999998*G0_1_1_9_5 + 0.0289285714285713*G0_1_1_9_6 - 0.0932142857142854*G0_1_1_9_7 + 0.0225*G0_1_1_9_8 - 0.115714285714285*G0_1_1_9_9; + A[5] = -A[3] - 0.0440476190476188*G0_0_0_0_0 - 0.00359126984126982*G0_0_0_0_1 - 0.00295634920634919*G0_0_0_0_2 - 0.00232142857142856*G0_0_0_0_3 + 0.00410714285714286*G0_0_0_0_4 - 0.0339285714285712*G0_0_0_0_5 + 0.019642857142857*G0_0_0_0_6 - 0.0303571428571427*G0_0_0_0_7 + 0.0124999999999999*G0_0_0_0_8 - 0.00359126984126982*G0_0_0_1_0 - 0.013095238095238*G0_0_0_1_1 - 0.000575396825396818*G0_0_0_1_2 - 0.00892857142857137*G0_0_0_1_3 + 0.00714285714285711*G0_0_0_1_4 - 0.0130357142857142*G0_0_0_1_5 + 0.00410714285714284*G0_0_0_1_6 - 0.00714285714285711*G0_0_0_1_7 - 0.00178571428571426*G0_0_0_1_8 - 0.0107142857142857*G0_0_0_1_9 - 0.00295634920634919*G0_0_0_2_0 - 0.000575396825396818*G0_0_0_2_1 + 0.0115079365079365*G0_0_0_2_2 - 0.00678571428571424*G0_0_0_2_3 + 0.0124999999999999*G0_0_0_2_4 - 0.0139285714285714*G0_0_0_2_5 + 0.0160714285714285*G0_0_0_2_6 - 0.00874999999999996*G0_0_0_2_7 + 0.00196428571428571*G0_0_0_2_8 - 0.00428571428571428*G0_0_0_2_9 - 0.00232142857142856*G0_0_0_3_0 - 0.00892857142857137*G0_0_0_3_1 - 0.00678571428571424*G0_0_0_3_2 - 0.032142857142857*G0_0_0_3_3 - 0.00160714285714288*G0_0_0_3_4 + 0.0192857142857142*G0_0_0_3_5 - 0.00482142857142856*G0_0_0_3_6 + 0.0144642857142857*G0_0_0_3_7 - 0.0160714285714285*G0_0_0_3_8 + 0.00321428571428569*G0_0_0_3_9 + 0.00410714285714286*G0_0_0_4_0 + 0.00714285714285711*G0_0_0_4_1 + 0.0124999999999999*G0_0_0_4_2 - 0.00160714285714287*G0_0_0_4_3 + 0.0385714285714284*G0_0_0_4_4 - 0.00482142857142853*G0_0_0_4_5 + 0.00964285714285712*G0_0_0_4_6 + 0.00321428571428572*G0_0_0_4_7 + 0.00160714285714282*G0_0_0_4_8 + 0.0225*G0_0_0_4_9 - 0.0339285714285712*G0_0_0_5_0 - 0.0130357142857142*G0_0_0_5_1 - 0.0139285714285714*G0_0_0_5_2 + 0.0192857142857142*G0_0_0_5_3 - 0.00482142857142853*G0_0_0_5_4 - 0.192857142857142*G0_0_0_5_5 + 0.0305357142857141*G0_0_0_5_6 - 0.0803571428571425*G0_0_0_5_7 + 0.0466071428571427*G0_0_0_5_8 - 0.0932142857142855*G0_0_0_5_9 + 0.019642857142857*G0_0_0_6_0 + 0.00410714285714284*G0_0_0_6_1 + 0.0160714285714285*G0_0_0_6_2 - 0.00482142857142856*G0_0_0_6_3 + 0.00964285714285712*G0_0_0_6_4 + 0.0305357142857141*G0_0_0_6_5 - 0.0257142857142856*G0_0_0_6_6 + 0.0337499999999998*G0_0_0_6_7 - 0.0128571428571428*G0_0_0_6_8 + 0.0225*G0_0_0_6_9 - 0.0303571428571427*G0_0_0_7_0 - 0.00714285714285712*G0_0_0_7_1 - 0.00874999999999996*G0_0_0_7_2 + 0.0144642857142857*G0_0_0_7_3 + 0.00321428571428572*G0_0_0_7_4 - 0.0803571428571425*G0_0_0_7_5 + 0.0337499999999998*G0_0_0_7_6 - 0.128571428571428*G0_0_0_7_7 + 0.0498214285714284*G0_0_0_7_8 - 0.0674999999999998*G0_0_0_7_9 + 0.0124999999999999*G0_0_0_8_0 - 0.00178571428571426*G0_0_0_8_1 + 0.00196428571428571*G0_0_0_8_2 - 0.0160714285714285*G0_0_0_8_3 + 0.00160714285714282*G0_0_0_8_4 + 0.0466071428571427*G0_0_0_8_5 - 0.0128571428571428*G0_0_0_8_6 + 0.0498214285714284*G0_0_0_8_7 - 0.032142857142857*G0_0_0_8_8 + 0.0289285714285714*G0_0_0_8_9 - 0.0107142857142857*G0_0_0_9_1 - 0.00428571428571428*G0_0_0_9_2 + 0.00321428571428569*G0_0_0_9_3 + 0.0225*G0_0_0_9_4 - 0.0932142857142855*G0_0_0_9_5 + 0.0225*G0_0_0_9_6 - 0.0674999999999998*G0_0_0_9_7 + 0.0289285714285714*G0_0_0_9_8 - 0.115714285714285*G0_0_0_9_9 - 0.0440476190476188*G0_1_0_0_0 - 0.00359126984126982*G0_1_0_0_1 - 0.00295634920634919*G0_1_0_0_2 - 0.00232142857142856*G0_1_0_0_3 + 0.00410714285714285*G0_1_0_0_4 - 0.0339285714285712*G0_1_0_0_5 + 0.019642857142857*G0_1_0_0_6 - 0.0303571428571427*G0_1_0_0_7 + 0.0124999999999999*G0_1_0_0_8 - 0.00359126984126982*G0_1_0_1_0 - 0.013095238095238*G0_1_0_1_1 - 0.00057539682539682*G0_1_0_1_2 - 0.00892857142857138*G0_1_0_1_3 + 0.00714285714285711*G0_1_0_1_4 - 0.0130357142857142*G0_1_0_1_5 + 0.00410714285714283*G0_1_0_1_6 - 0.00714285714285711*G0_1_0_1_7 - 0.00178571428571427*G0_1_0_1_8 - 0.0107142857142857*G0_1_0_1_9 - 0.00295634920634919*G0_1_0_2_0 - 0.00057539682539682*G0_1_0_2_1 + 0.0115079365079364*G0_1_0_2_2 - 0.00678571428571424*G0_1_0_2_3 + 0.0124999999999999*G0_1_0_2_4 - 0.0139285714285714*G0_1_0_2_5 + 0.0160714285714285*G0_1_0_2_6 - 0.00874999999999996*G0_1_0_2_7 + 0.00196428571428571*G0_1_0_2_8 - 0.00428571428571428*G0_1_0_2_9 - 0.00232142857142856*G0_1_0_3_0 - 0.00892857142857138*G0_1_0_3_1 - 0.00678571428571424*G0_1_0_3_2 - 0.032142857142857*G0_1_0_3_3 - 0.00160714285714285*G0_1_0_3_4 + 0.0192857142857142*G0_1_0_3_5 - 0.00482142857142855*G0_1_0_3_6 + 0.0144642857142857*G0_1_0_3_7 - 0.0160714285714285*G0_1_0_3_8 + 0.00321428571428569*G0_1_0_3_9 + 0.00410714285714285*G0_1_0_4_0 + 0.00714285714285711*G0_1_0_4_1 + 0.0124999999999999*G0_1_0_4_2 - 0.00160714285714285*G0_1_0_4_3 + 0.0385714285714284*G0_1_0_4_4 - 0.00482142857142852*G0_1_0_4_5 + 0.0096428571428571*G0_1_0_4_6 + 0.00321428571428572*G0_1_0_4_7 + 0.00160714285714283*G0_1_0_4_8 + 0.0224999999999999*G0_1_0_4_9 - 0.0339285714285712*G0_1_0_5_0 - 0.0130357142857142*G0_1_0_5_1 - 0.0139285714285714*G0_1_0_5_2 + 0.0192857142857142*G0_1_0_5_3 - 0.00482142857142852*G0_1_0_5_4 - 0.192857142857142*G0_1_0_5_5 + 0.0305357142857141*G0_1_0_5_6 - 0.0803571428571425*G0_1_0_5_7 + 0.0466071428571427*G0_1_0_5_8 - 0.0932142857142854*G0_1_0_5_9 + 0.019642857142857*G0_1_0_6_0 + 0.00410714285714283*G0_1_0_6_1 + 0.0160714285714285*G0_1_0_6_2 - 0.00482142857142855*G0_1_0_6_3 + 0.0096428571428571*G0_1_0_6_4 + 0.0305357142857141*G0_1_0_6_5 - 0.0257142857142856*G0_1_0_6_6 + 0.0337499999999998*G0_1_0_6_7 - 0.0128571428571428*G0_1_0_6_8 + 0.0224999999999999*G0_1_0_6_9 - 0.0303571428571427*G0_1_0_7_0 - 0.00714285714285711*G0_1_0_7_1 - 0.00874999999999996*G0_1_0_7_2 + 0.0144642857142857*G0_1_0_7_3 + 0.00321428571428572*G0_1_0_7_4 - 0.0803571428571425*G0_1_0_7_5 + 0.0337499999999998*G0_1_0_7_6 - 0.128571428571428*G0_1_0_7_7 + 0.0498214285714284*G0_1_0_7_8 - 0.0674999999999998*G0_1_0_7_9 + 0.0124999999999999*G0_1_0_8_0 - 0.00178571428571427*G0_1_0_8_1 + 0.00196428571428571*G0_1_0_8_2 - 0.0160714285714285*G0_1_0_8_3 + 0.00160714285714283*G0_1_0_8_4 + 0.0466071428571427*G0_1_0_8_5 - 0.0128571428571428*G0_1_0_8_6 + 0.0498214285714284*G0_1_0_8_7 - 0.032142857142857*G0_1_0_8_8 + 0.0289285714285714*G0_1_0_8_9 - 0.0107142857142857*G0_1_0_9_1 - 0.00428571428571428*G0_1_0_9_2 + 0.00321428571428569*G0_1_0_9_3 + 0.0224999999999999*G0_1_0_9_4 - 0.0932142857142854*G0_1_0_9_5 + 0.0224999999999999*G0_1_0_9_6 - 0.0674999999999998*G0_1_0_9_7 + 0.0289285714285714*G0_1_0_9_8 - 0.115714285714285*G0_1_0_9_9; + A[12] = -A[13] + 0.0123015873015872*G0_1_0_0_0 + 0.000317460317460315*G0_1_0_0_2 - 0.00107142857142856*G0_1_0_0_3 + 0.00214285714285714*G0_1_0_0_4 + 0.00892857142857137*G0_1_0_0_5 - 0.00339285714285713*G0_1_0_0_6 + 0.0107142857142857*G0_1_0_0_7 - 0.00696428571428568*G0_1_0_0_8 + 0.00321428571428571*G0_1_0_0_9 - 0.0123015873015872*G0_1_0_1_1 - 0.000317460317460313*G0_1_0_1_2 - 0.00892857142857136*G0_1_0_1_3 + 0.00339285714285712*G0_1_0_1_4 + 0.00107142857142856*G0_1_0_1_5 - 0.00214285714285714*G0_1_0_1_6 + 0.00696428571428567*G0_1_0_1_7 - 0.0107142857142856*G0_1_0_1_8 - 0.0032142857142857*G0_1_0_1_9 + 0.000317460317460315*G0_1_0_2_0 - 0.000317460317460313*G0_1_0_2_1 - 0.00357142857142855*G0_1_0_2_3 + 0.00178571428571428*G0_1_0_2_4 + 0.00357142857142855*G0_1_0_2_5 - 0.00178571428571427*G0_1_0_2_6 + 0.00321428571428569*G0_1_0_2_7 - 0.00321428571428569*G0_1_0_2_8 - 0.00107142857142856*G0_1_0_3_0 - 0.00892857142857136*G0_1_0_3_1 - 0.00357142857142855*G0_1_0_3_2 - 0.00321428571428569*G0_1_0_3_3 + 0.00964285714285707*G0_1_0_3_4 + 0.00642857142857139*G0_1_0_3_6 + 0.00321428571428569*G0_1_0_3_7 - 0.0128571428571428*G0_1_0_3_8 + 0.0032142857142857*G0_1_0_3_9 + 0.00214285714285714*G0_1_0_4_0 + 0.00339285714285712*G0_1_0_4_1 + 0.00178571428571427*G0_1_0_4_2 + 0.00964285714285707*G0_1_0_4_3 + 0.032142857142857*G0_1_0_4_4 - 0.00642857142857141*G0_1_0_4_5 - 0.00803571428571425*G0_1_0_4_7 + 0.00964285714285707*G0_1_0_4_8 + 0.0128571428571428*G0_1_0_4_9 + 0.00892857142857137*G0_1_0_5_0 + 0.00107142857142856*G0_1_0_5_1 + 0.00357142857142855*G0_1_0_5_2 - 0.00642857142857141*G0_1_0_5_4 + 0.00321428571428569*G0_1_0_5_5 - 0.0096428571428571*G0_1_0_5_6 + 0.0128571428571428*G0_1_0_5_7 - 0.0032142857142857*G0_1_0_5_8 - 0.00321428571428571*G0_1_0_5_9 - 0.00339285714285713*G0_1_0_6_0 - 0.00214285714285714*G0_1_0_6_1 - 0.00178571428571427*G0_1_0_6_2 + 0.00642857142857139*G0_1_0_6_3 - 0.0096428571428571*G0_1_0_6_5 - 0.032142857142857*G0_1_0_6_6 - 0.00964285714285709*G0_1_0_6_7 + 0.00803571428571424*G0_1_0_6_8 - 0.0128571428571428*G0_1_0_6_9 + 0.0107142857142857*G0_1_0_7_0 + 0.00696428571428567*G0_1_0_7_1 + 0.00321428571428569*G0_1_0_7_2 + 0.00321428571428569*G0_1_0_7_3 - 0.00803571428571425*G0_1_0_7_4 + 0.0128571428571428*G0_1_0_7_5 - 0.00964285714285709*G0_1_0_7_6 + 0.0353571428571427*G0_1_0_7_7 + 0.00964285714285709*G0_1_0_7_9 - 0.00696428571428568*G0_1_0_8_0 - 0.0107142857142856*G0_1_0_8_1 - 0.00321428571428569*G0_1_0_8_2 - 0.0128571428571428*G0_1_0_8_3 + 0.00964285714285707*G0_1_0_8_4 - 0.0032142857142857*G0_1_0_8_5 + 0.00803571428571424*G0_1_0_8_6 - 0.0353571428571426*G0_1_0_8_8 - 0.00964285714285709*G0_1_0_8_9 + 0.00321428571428571*G0_1_0_9_0 - 0.0032142857142857*G0_1_0_9_1 + 0.0032142857142857*G0_1_0_9_3 + 0.0128571428571428*G0_1_0_9_4 - 0.00321428571428571*G0_1_0_9_5 - 0.0128571428571428*G0_1_0_9_6 + 0.00964285714285709*G0_1_0_9_7 - 0.00964285714285709*G0_1_0_9_8 + 0.00982142857142852*G0_1_1_0_0 + 0.000808531746031741*G0_1_1_0_1 + 0.00112599206349206*G0_1_1_0_2 - 0.000937499999999996*G0_1_1_0_3 + 0.00227678571428571*G0_1_1_0_4 + 0.00580357142857139*G0_1_1_0_5 - 0.000892857142857129*G0_1_1_0_6 + 0.00758928571428567*G0_1_1_0_7 - 0.00446428571428569*G0_1_1_0_8 + 0.00267857142857143*G0_1_1_0_9 + 0.000808531746031741*G0_1_1_1_0 - 0.00248015873015872*G0_1_1_1_1 + 0.000808531746031743*G0_1_1_1_2 - 0.00312499999999998*G0_1_1_1_3 + 0.00249999999999999*G0_1_1_1_4 + 0.000133928571428567*G0_1_1_1_5 + 0.000133928571428572*G0_1_1_1_6 + 0.00249999999999999*G0_1_1_1_7 - 0.00312499999999998*G0_1_1_1_8 - 0.000535714285714284*G0_1_1_1_9 + 0.00112599206349206*G0_1_1_2_0 + 0.000808531746031743*G0_1_1_2_1 + 0.00982142857142852*G0_1_1_2_2 - 0.00446428571428569*G0_1_1_2_3 + 0.00758928571428567*G0_1_1_2_4 - 0.00089285714285714*G0_1_1_2_5 + 0.0058035714285714*G0_1_1_2_6 + 0.0022767857142857*G0_1_1_2_7 - 0.000937499999999995*G0_1_1_2_8 + 0.00267857142857141*G0_1_1_2_9 - 0.000937499999999996*G0_1_1_3_0 - 0.00312499999999998*G0_1_1_3_1 - 0.00446428571428569*G0_1_1_3_2 + 0.00482142857142854*G0_1_1_3_3 - 0.00522321428571426*G0_1_1_3_4 + 0.00241071428571427*G0_1_1_3_5 - 0.00281249999999999*G0_1_1_3_6 + 0.000401785714285708*G0_1_1_3_7 - 0.000803571428571424*G0_1_1_3_8 + 0.000803571428571425*G0_1_1_3_9 + 0.00227678571428571*G0_1_1_4_0 + 0.00249999999999999*G0_1_1_4_1 + 0.00758928571428567*G0_1_1_4_2 - 0.00522321428571426*G0_1_1_4_3 + 0.0401785714285712*G0_1_1_4_4 - 0.00924107142857139*G0_1_1_4_5 + 0.0120535714285714*G0_1_1_4_6 - 0.00562499999999997*G0_1_1_4_7 + 0.000401785714285711*G0_1_1_4_8 + 0.0104464285714285*G0_1_1_4_9 + 0.00580357142857139*G0_1_1_5_0 + 0.000133928571428566*G0_1_1_5_1 - 0.00089285714285714*G0_1_1_5_2 + 0.00241071428571427*G0_1_1_5_3 - 0.00924107142857139*G0_1_1_5_4 + 0.00803571428571424*G0_1_1_5_5 - 0.0148660714285714*G0_1_1_5_6 + 0.0120535714285713*G0_1_1_5_7 - 0.00281249999999998*G0_1_1_5_8 - 0.00241071428571428*G0_1_1_5_9 - 0.000892857142857129*G0_1_1_6_0 + 0.000133928571428572*G0_1_1_6_1 + 0.0058035714285714*G0_1_1_6_2 - 0.00281249999999999*G0_1_1_6_3 + 0.0120535714285714*G0_1_1_6_4 - 0.0148660714285714*G0_1_1_6_5 + 0.00803571428571423*G0_1_1_6_6 - 0.00924107142857137*G0_1_1_6_7 + 0.00241071428571428*G0_1_1_6_8 - 0.00241071428571427*G0_1_1_6_9 + 0.00758928571428567*G0_1_1_7_0 + 0.00249999999999999*G0_1_1_7_1 + 0.0022767857142857*G0_1_1_7_2 + 0.000401785714285708*G0_1_1_7_3 - 0.00562499999999997*G0_1_1_7_4 + 0.0120535714285713*G0_1_1_7_5 - 0.00924107142857137*G0_1_1_7_6 + 0.0401785714285712*G0_1_1_7_7 - 0.00522321428571427*G0_1_1_7_8 + 0.0104464285714285*G0_1_1_7_9 - 0.00446428571428569*G0_1_1_8_0 - 0.00312499999999998*G0_1_1_8_1 - 0.000937499999999995*G0_1_1_8_2 - 0.000803571428571424*G0_1_1_8_3 + 0.000401785714285711*G0_1_1_8_4 - 0.00281249999999998*G0_1_1_8_5 + 0.00241071428571428*G0_1_1_8_6 - 0.00522321428571426*G0_1_1_8_7 + 0.00482142857142855*G0_1_1_8_8 + 0.000803571428571419*G0_1_1_8_9 + 0.00267857142857143*G0_1_1_9_0 - 0.000535714285714284*G0_1_1_9_1 + 0.00267857142857141*G0_1_1_9_2 + 0.000803571428571425*G0_1_1_9_3 + 0.0104464285714285*G0_1_1_9_4 - 0.00241071428571428*G0_1_1_9_5 - 0.00241071428571427*G0_1_1_9_6 + 0.0104464285714285*G0_1_1_9_7 + 0.000803571428571418*G0_1_1_9_8 + 0.0096428571428571*G0_1_1_9_9; + A[27] = -A[29] - 0.00634920634920631*G0_0_0_0_0 - 0.000873015873015875*G0_0_0_0_1 - 0.00563492063492061*G0_0_0_0_2 + 0.00642857142857142*G0_0_0_0_3 - 0.015*G0_0_0_0_4 + 0.00714285714285714*G0_0_0_0_5 - 0.0121428571428572*G0_0_0_0_6 + 0.00214285714285713*G0_0_0_0_8 - 0.00428571428571431*G0_0_0_0_9 - 0.000873015873015875*G0_0_0_1_0 - 0.00388888888888887*G0_0_0_1_2 + 0.0142857142857142*G0_0_0_1_3 - 0.0178571428571428*G0_0_0_1_4 - 0.00214285714285713*G0_0_0_1_5 - 0.0192857142857142*G0_0_0_1_6 - 0.00357142857142855*G0_0_0_1_7 + 0.00714285714285709*G0_0_0_1_8 - 0.0214285714285714*G0_0_0_1_9 - 0.00563492063492061*G0_0_0_2_0 - 0.00388888888888887*G0_0_0_2_1 - 0.0619047619047615*G0_0_0_2_2 + 0.0214285714285713*G0_0_0_2_3 - 0.0428571428571425*G0_0_0_2_4 + 0.0214285714285713*G0_0_0_2_5 - 0.0428571428571425*G0_0_0_2_6 - 0.00214285714285714*G0_0_0_2_7 + 0.00214285714285712*G0_0_0_2_8 + 0.00642857142857142*G0_0_0_3_0 + 0.0142857142857142*G0_0_0_3_1 + 0.0214285714285713*G0_0_0_3_2 + 0.0578571428571425*G0_0_0_3_4 - 0.0128571428571428*G0_0_0_3_5 + 0.0707142857142853*G0_0_0_3_6 - 0.00642857142857139*G0_0_0_3_7 + 0.0771428571428567*G0_0_0_3_9 - 0.015*G0_0_0_4_0 - 0.0178571428571428*G0_0_0_4_1 - 0.0428571428571425*G0_0_0_4_2 + 0.0578571428571425*G0_0_0_4_3 - 0.192857142857142*G0_0_0_4_4 + 0.0578571428571426*G0_0_0_4_5 - 0.128571428571428*G0_0_0_4_6 + 0.0192857142857142*G0_0_0_4_7 + 0.0064285714285714*G0_0_0_4_8 - 0.115714285714285*G0_0_0_4_9 + 0.00714285714285714*G0_0_0_5_0 - 0.00214285714285713*G0_0_0_5_1 + 0.0214285714285713*G0_0_0_5_2 - 0.0128571428571428*G0_0_0_5_3 + 0.0578571428571426*G0_0_0_5_4 - 0.154285714285714*G0_0_0_5_5 + 0.0707142857142853*G0_0_0_5_6 - 0.0385714285714284*G0_0_0_5_7 + 0.0192857142857142*G0_0_0_5_8 - 0.0257142857142857*G0_0_0_5_9 - 0.0121428571428572*G0_0_0_6_0 - 0.0192857142857142*G0_0_0_6_1 - 0.0428571428571425*G0_0_0_6_2 + 0.0707142857142853*G0_0_0_6_3 - 0.128571428571428*G0_0_0_6_4 + 0.0707142857142853*G0_0_0_6_5 - 0.32142857142857*G0_0_0_6_6 + 0.0192857142857142*G0_0_0_6_7 + 0.0192857142857142*G0_0_0_6_8 - 0.141428571428571*G0_0_0_6_9 - 0.00357142857142855*G0_0_0_7_1 - 0.00214285714285714*G0_0_0_7_2 - 0.00642857142857139*G0_0_0_7_3 + 0.0192857142857142*G0_0_0_7_4 - 0.0385714285714284*G0_0_0_7_5 + 0.0192857142857142*G0_0_0_7_6 - 0.0257142857142856*G0_0_0_7_7 + 0.00642857142857142*G0_0_0_7_8 - 0.0257142857142856*G0_0_0_7_9 + 0.00214285714285713*G0_0_0_8_0 + 0.00714285714285709*G0_0_0_8_1 + 0.00214285714285712*G0_0_0_8_2 + 0.0064285714285714*G0_0_0_8_4 + 0.0192857142857142*G0_0_0_8_5 + 0.0192857142857142*G0_0_0_8_6 + 0.00642857142857142*G0_0_0_8_7 + 0.0514285714285712*G0_0_0_8_9 - 0.00428571428571431*G0_0_0_9_0 - 0.0214285714285714*G0_0_0_9_1 + 0.0771428571428568*G0_0_0_9_3 - 0.115714285714285*G0_0_0_9_4 - 0.0257142857142856*G0_0_0_9_5 - 0.141428571428571*G0_0_0_9_6 - 0.0257142857142856*G0_0_0_9_7 + 0.0514285714285712*G0_0_0_9_8 - 0.308571428571427*G0_0_0_9_9 + 0.0555555555555552*G0_1_0_0_0 + 0.00301587301587299*G0_1_0_0_1 + 0.00428571428571428*G0_1_0_0_3 - 0.0128571428571428*G0_1_0_0_4 + 0.0499999999999997*G0_1_0_0_5 - 0.0335714285714284*G0_1_0_0_6 + 0.0428571428571426*G0_1_0_0_7 - 0.0192857142857142*G0_1_0_0_8 - 0.00428571428571425*G0_1_0_0_9 + 0.00301587301587299*G0_1_0_1_0 - 0.003015873015873*G0_1_0_1_2 + 0.0071428571428571*G0_1_0_1_3 - 0.0142857142857142*G0_1_0_1_4 + 0.0171428571428571*G0_1_0_1_5 - 0.0171428571428571*G0_1_0_1_6 + 0.0142857142857142*G0_1_0_1_7 - 0.00714285714285712*G0_1_0_1_8 - 0.003015873015873*G0_1_0_2_1 - 0.0555555555555552*G0_1_0_2_2 + 0.0192857142857141*G0_1_0_2_3 - 0.0428571428571426*G0_1_0_2_4 + 0.0335714285714284*G0_1_0_2_5 - 0.0499999999999997*G0_1_0_2_6 + 0.0128571428571428*G0_1_0_2_7 - 0.00428571428571428*G0_1_0_2_8 + 0.00428571428571431*G0_1_0_2_9 + 0.00428571428571428*G0_1_0_3_0 + 0.0071428571428571*G0_1_0_3_1 + 0.0192857142857141*G0_1_0_3_2 + 0.0514285714285711*G0_1_0_3_4 - 0.032142857142857*G0_1_0_3_5 + 0.0514285714285711*G0_1_0_3_6 - 0.0128571428571428*G0_1_0_3_7 + 0.0257142857142856*G0_1_0_3_9 - 0.0128571428571428*G0_1_0_4_0 - 0.0142857142857142*G0_1_0_4_1 - 0.0428571428571426*G0_1_0_4_2 + 0.0514285714285711*G0_1_0_4_3 - 0.167142857142856*G0_1_0_4_4 + 0.0385714285714284*G0_1_0_4_5 - 0.0899999999999996*G0_1_0_4_6 + 0.0128571428571428*G0_1_0_4_8 - 0.0899999999999996*G0_1_0_4_9 + 0.0499999999999997*G0_1_0_5_0 + 0.0171428571428571*G0_1_0_5_1 + 0.0335714285714284*G0_1_0_5_2 - 0.032142857142857*G0_1_0_5_3 + 0.0385714285714284*G0_1_0_5_4 + 0.167142857142856*G0_1_0_5_5 + 0.0899999999999996*G0_1_0_5_7 - 0.0514285714285712*G0_1_0_5_8 + 0.115714285714285*G0_1_0_5_9 - 0.0335714285714284*G0_1_0_6_0 - 0.0171428571428571*G0_1_0_6_1 - 0.0499999999999997*G0_1_0_6_2 + 0.0514285714285711*G0_1_0_6_3 - 0.0899999999999996*G0_1_0_6_4 - 0.167142857142856*G0_1_0_6_6 - 0.0385714285714284*G0_1_0_6_7 + 0.032142857142857*G0_1_0_6_8 - 0.115714285714285*G0_1_0_6_9 + 0.0428571428571426*G0_1_0_7_0 + 0.0142857142857142*G0_1_0_7_1 + 0.0128571428571428*G0_1_0_7_2 - 0.0128571428571428*G0_1_0_7_3 + 0.0899999999999996*G0_1_0_7_5 - 0.0385714285714284*G0_1_0_7_6 + 0.167142857142856*G0_1_0_7_7 - 0.0514285714285712*G0_1_0_7_8 + 0.0899999999999997*G0_1_0_7_9 - 0.0192857142857142*G0_1_0_8_0 - 0.00714285714285712*G0_1_0_8_1 - 0.00428571428571428*G0_1_0_8_2 + 0.0128571428571428*G0_1_0_8_4 - 0.0514285714285712*G0_1_0_8_5 + 0.032142857142857*G0_1_0_8_6 - 0.0514285714285712*G0_1_0_8_7 - 0.0257142857142857*G0_1_0_8_9 - 0.00428571428571425*G0_1_0_9_0 + 0.00428571428571431*G0_1_0_9_2 + 0.0257142857142856*G0_1_0_9_3 - 0.0899999999999996*G0_1_0_9_4 + 0.115714285714285*G0_1_0_9_5 - 0.115714285714285*G0_1_0_9_6 + 0.0899999999999997*G0_1_0_9_7 - 0.0257142857142857*G0_1_0_9_8; + A[15] = -A[17] - 0.0115079365079364*G0_1_0_0_0 + 0.00057539682539683*G0_1_0_0_1 + 0.0029563492063492*G0_1_0_0_2 - 0.00196428571428572*G0_1_0_0_3 + 0.00874999999999999*G0_1_0_0_4 - 0.0160714285714285*G0_1_0_0_5 + 0.0139285714285714*G0_1_0_0_6 - 0.0124999999999999*G0_1_0_0_7 + 0.00678571428571425*G0_1_0_0_8 + 0.00428571428571429*G0_1_0_0_9 + 0.00057539682539683*G0_1_0_1_0 + 0.013095238095238*G0_1_0_1_1 + 0.00359126984126982*G0_1_0_1_2 + 0.00178571428571426*G0_1_0_1_3 + 0.00714285714285713*G0_1_0_1_4 - 0.00410714285714284*G0_1_0_1_5 + 0.0130357142857143*G0_1_0_1_6 - 0.0071428571428571*G0_1_0_1_7 + 0.00892857142857137*G0_1_0_1_8 + 0.0107142857142857*G0_1_0_1_9 + 0.0029563492063492*G0_1_0_2_0 + 0.00359126984126982*G0_1_0_2_1 + 0.0440476190476188*G0_1_0_2_2 - 0.0124999999999999*G0_1_0_2_3 + 0.0303571428571427*G0_1_0_2_4 - 0.019642857142857*G0_1_0_2_5 + 0.0339285714285712*G0_1_0_2_6 - 0.00410714285714283*G0_1_0_2_7 + 0.00232142857142856*G0_1_0_2_8 - 0.00196428571428572*G0_1_0_3_0 + 0.00178571428571426*G0_1_0_3_1 - 0.0124999999999999*G0_1_0_3_2 + 0.0321428571428569*G0_1_0_3_3 - 0.0498214285714283*G0_1_0_3_4 + 0.0128571428571428*G0_1_0_3_5 - 0.0466071428571426*G0_1_0_3_6 - 0.00160714285714284*G0_1_0_3_7 + 0.0160714285714285*G0_1_0_3_8 - 0.0289285714285713*G0_1_0_3_9 + 0.00874999999999999*G0_1_0_4_0 + 0.00714285714285713*G0_1_0_4_1 + 0.0303571428571427*G0_1_0_4_2 - 0.0498214285714283*G0_1_0_4_3 + 0.128571428571428*G0_1_0_4_4 - 0.0337499999999999*G0_1_0_4_5 + 0.0803571428571425*G0_1_0_4_6 - 0.0032142857142857*G0_1_0_4_7 - 0.0144642857142856*G0_1_0_4_8 + 0.0674999999999997*G0_1_0_4_9 - 0.0160714285714285*G0_1_0_5_0 - 0.00410714285714284*G0_1_0_5_1 - 0.019642857142857*G0_1_0_5_2 + 0.0128571428571428*G0_1_0_5_3 - 0.0337499999999998*G0_1_0_5_4 + 0.0257142857142856*G0_1_0_5_5 - 0.0305357142857142*G0_1_0_5_6 - 0.00964285714285707*G0_1_0_5_7 + 0.00482142857142855*G0_1_0_5_8 - 0.0224999999999999*G0_1_0_5_9 + 0.0139285714285714*G0_1_0_6_0 + 0.0130357142857143*G0_1_0_6_1 + 0.0339285714285712*G0_1_0_6_2 - 0.0466071428571426*G0_1_0_6_3 + 0.0803571428571425*G0_1_0_6_4 - 0.0305357142857142*G0_1_0_6_5 + 0.192857142857142*G0_1_0_6_6 + 0.00482142857142854*G0_1_0_6_7 - 0.0192857142857142*G0_1_0_6_8 + 0.0932142857142853*G0_1_0_6_9 - 0.0124999999999999*G0_1_0_7_0 - 0.0071428571428571*G0_1_0_7_1 - 0.00410714285714283*G0_1_0_7_2 - 0.00160714285714284*G0_1_0_7_3 - 0.0032142857142857*G0_1_0_7_4 - 0.00964285714285707*G0_1_0_7_5 + 0.00482142857142854*G0_1_0_7_6 - 0.0385714285714283*G0_1_0_7_7 + 0.00160714285714287*G0_1_0_7_8 - 0.0224999999999999*G0_1_0_7_9 + 0.00678571428571425*G0_1_0_8_0 + 0.00892857142857137*G0_1_0_8_1 + 0.00232142857142856*G0_1_0_8_2 + 0.0160714285714285*G0_1_0_8_3 - 0.0144642857142856*G0_1_0_8_4 + 0.00482142857142855*G0_1_0_8_5 - 0.0192857142857142*G0_1_0_8_6 + 0.00160714285714286*G0_1_0_8_7 + 0.032142857142857*G0_1_0_8_8 - 0.0032142857142857*G0_1_0_8_9 + 0.00428571428571429*G0_1_0_9_0 + 0.0107142857142857*G0_1_0_9_1 - 0.0289285714285713*G0_1_0_9_3 + 0.0674999999999997*G0_1_0_9_4 - 0.0224999999999999*G0_1_0_9_5 + 0.0932142857142853*G0_1_0_9_6 - 0.0224999999999999*G0_1_0_9_7 - 0.0032142857142857*G0_1_0_9_8 + 0.115714285714285*G0_1_0_9_9; + A[16] = -A[15] - 0.0146825396825396*G0_1_1_0_0 - 0.00323412698412697*G0_1_1_0_1 - 0.00386904761904761*G0_1_1_0_2 + 0.00160714285714286*G0_1_1_0_3 - 0.00482142857142857*G0_1_1_0_4 - 0.00535714285714281*G0_1_1_0_5 - 0.00321428571428573*G0_1_1_0_6 - 0.00892857142857138*G0_1_1_0_7 + 0.00392857142857141*G0_1_1_0_8 - 0.00428571428571429*G0_1_1_0_9 - 0.00323412698412697*G0_1_1_1_0 - 0.0146825396825396*G0_1_1_1_1 - 0.0038690476190476*G0_1_1_1_2 - 0.00535714285714281*G0_1_1_1_3 - 0.00321428571428572*G0_1_1_1_4 + 0.00160714285714286*G0_1_1_1_5 - 0.00482142857142857*G0_1_1_1_6 + 0.00392857142857141*G0_1_1_1_7 - 0.00892857142857137*G0_1_1_1_8 - 0.00428571428571427*G0_1_1_1_9 - 0.00386904761904761*G0_1_1_2_0 - 0.0038690476190476*G0_1_1_2_1 - 0.0392857142857141*G0_1_1_2_2 + 0.0107142857142856*G0_1_1_2_3 - 0.0267857142857141*G0_1_1_2_4 + 0.0107142857142857*G0_1_1_2_5 - 0.0267857142857142*G0_1_1_2_6 - 0.00267857142857141*G0_1_1_2_7 - 0.00267857142857141*G0_1_1_2_8 - 0.0107142857142857*G0_1_1_2_9 + 0.00160714285714286*G0_1_1_3_0 - 0.00535714285714281*G0_1_1_3_1 + 0.0107142857142856*G0_1_1_3_2 - 0.0257142857142855*G0_1_1_3_3 + 0.0401785714285712*G0_1_1_3_4 - 0.0096428571428571*G0_1_1_3_5 + 0.0241071428571427*G0_1_1_3_6 + 0.00482142857142855*G0_1_1_3_7 - 0.0224999999999998*G0_1_1_3_8 + 0.00321428571428571*G0_1_1_3_9 - 0.00482142857142857*G0_1_1_4_0 - 0.00321428571428572*G0_1_1_4_1 - 0.0267857142857141*G0_1_1_4_2 + 0.0401785714285712*G0_1_1_4_3 - 0.0964285714285709*G0_1_1_4_4 + 0.0241071428571428*G0_1_1_4_5 - 0.0482142857142855*G0_1_1_4_6 + 0.0064285714285714*G0_1_1_4_7 + 0.0176785714285713*G0_1_1_4_8 - 0.0160714285714285*G0_1_1_4_9 - 0.00535714285714281*G0_1_1_5_0 + 0.00160714285714286*G0_1_1_5_1 + 0.0107142857142857*G0_1_1_5_2 - 0.00964285714285709*G0_1_1_5_3 + 0.0241071428571428*G0_1_1_5_4 - 0.0257142857142856*G0_1_1_5_5 + 0.0401785714285712*G0_1_1_5_6 - 0.0224999999999999*G0_1_1_5_7 + 0.00482142857142854*G0_1_1_5_8 + 0.00321428571428571*G0_1_1_5_9 - 0.00321428571428573*G0_1_1_6_0 - 0.00482142857142857*G0_1_1_6_1 - 0.0267857142857141*G0_1_1_6_2 + 0.0241071428571427*G0_1_1_6_3 - 0.0482142857142855*G0_1_1_6_4 + 0.0401785714285712*G0_1_1_6_5 - 0.096428571428571*G0_1_1_6_6 + 0.0176785714285713*G0_1_1_6_7 + 0.00642857142857137*G0_1_1_6_8 - 0.0160714285714285*G0_1_1_6_9 - 0.00892857142857138*G0_1_1_7_0 + 0.00392857142857141*G0_1_1_7_1 - 0.00267857142857141*G0_1_1_7_2 + 0.00482142857142855*G0_1_1_7_3 + 0.0064285714285714*G0_1_1_7_4 - 0.0224999999999999*G0_1_1_7_5 + 0.0176785714285713*G0_1_1_7_6 - 0.0899999999999994*G0_1_1_7_7 + 0.020892857142857*G0_1_1_7_8 - 0.0224999999999999*G0_1_1_7_9 + 0.00392857142857141*G0_1_1_8_0 - 0.00892857142857136*G0_1_1_8_1 - 0.00267857142857141*G0_1_1_8_2 - 0.0224999999999998*G0_1_1_8_3 + 0.0176785714285713*G0_1_1_8_4 + 0.00482142857142854*G0_1_1_8_5 + 0.00642857142857137*G0_1_1_8_6 + 0.020892857142857*G0_1_1_8_7 - 0.0899999999999994*G0_1_1_8_8 - 0.0224999999999999*G0_1_1_8_9 - 0.00428571428571429*G0_1_1_9_0 - 0.00428571428571427*G0_1_1_9_1 - 0.0107142857142857*G0_1_1_9_2 + 0.00321428571428572*G0_1_1_9_3 - 0.0160714285714285*G0_1_1_9_4 + 0.00321428571428571*G0_1_1_9_5 - 0.0160714285714285*G0_1_1_9_6 - 0.0224999999999999*G0_1_1_9_7 - 0.0224999999999999*G0_1_1_9_8 - 0.0385714285714284*G0_1_1_9_9; + A[32] = A[17] - 0.0123015873015872*G0_0_1_0_0 - 0.000317460317460315*G0_0_1_0_2 + 0.00107142857142856*G0_0_1_0_3 - 0.00214285714285714*G0_0_1_0_4 - 0.00892857142857137*G0_0_1_0_5 + 0.00339285714285713*G0_0_1_0_6 - 0.0107142857142857*G0_0_1_0_7 + 0.00696428571428568*G0_0_1_0_8 - 0.00321428571428571*G0_0_1_0_9 + 0.0123015873015872*G0_0_1_1_1 + 0.000317460317460313*G0_0_1_1_2 + 0.00892857142857137*G0_0_1_1_3 - 0.00339285714285712*G0_0_1_1_4 - 0.00107142857142856*G0_0_1_1_5 + 0.00214285714285714*G0_0_1_1_6 - 0.00696428571428567*G0_0_1_1_7 + 0.0107142857142856*G0_0_1_1_8 + 0.0032142857142857*G0_0_1_1_9 - 0.000317460317460315*G0_0_1_2_0 + 0.000317460317460313*G0_0_1_2_1 + 0.00357142857142855*G0_0_1_2_3 - 0.00178571428571427*G0_0_1_2_4 - 0.00357142857142855*G0_0_1_2_5 + 0.00178571428571428*G0_0_1_2_6 - 0.00321428571428569*G0_0_1_2_7 + 0.00321428571428569*G0_0_1_2_8 + 0.00107142857142856*G0_0_1_3_0 + 0.00892857142857137*G0_0_1_3_1 + 0.00357142857142855*G0_0_1_3_2 + 0.00321428571428569*G0_0_1_3_3 - 0.00964285714285708*G0_0_1_3_4 - 0.00642857142857139*G0_0_1_3_6 - 0.00321428571428569*G0_0_1_3_7 + 0.0128571428571428*G0_0_1_3_8 - 0.00321428571428571*G0_0_1_3_9 - 0.00214285714285714*G0_0_1_4_0 - 0.00339285714285712*G0_0_1_4_1 - 0.00178571428571427*G0_0_1_4_2 - 0.00964285714285708*G0_0_1_4_3 - 0.032142857142857*G0_0_1_4_4 + 0.00642857142857141*G0_0_1_4_5 + 0.00803571428571424*G0_0_1_4_7 - 0.00964285714285707*G0_0_1_4_8 - 0.0128571428571428*G0_0_1_4_9 - 0.00892857142857137*G0_0_1_5_0 - 0.00107142857142856*G0_0_1_5_1 - 0.00357142857142855*G0_0_1_5_2 + 0.00642857142857141*G0_0_1_5_4 - 0.00321428571428568*G0_0_1_5_5 + 0.00964285714285709*G0_0_1_5_6 - 0.0128571428571428*G0_0_1_5_7 + 0.0032142857142857*G0_0_1_5_8 + 0.0032142857142857*G0_0_1_5_9 + 0.00339285714285713*G0_0_1_6_0 + 0.00214285714285714*G0_0_1_6_1 + 0.00178571428571428*G0_0_1_6_2 - 0.00642857142857139*G0_0_1_6_3 + 0.00964285714285709*G0_0_1_6_5 + 0.0321428571428571*G0_0_1_6_6 + 0.00964285714285708*G0_0_1_6_7 - 0.00803571428571423*G0_0_1_6_8 + 0.0128571428571428*G0_0_1_6_9 - 0.0107142857142857*G0_0_1_7_0 - 0.00696428571428567*G0_0_1_7_1 - 0.00321428571428569*G0_0_1_7_2 - 0.00321428571428569*G0_0_1_7_3 + 0.00803571428571425*G0_0_1_7_4 - 0.0128571428571428*G0_0_1_7_5 + 0.00964285714285709*G0_0_1_7_6 - 0.0353571428571426*G0_0_1_7_7 - 0.00964285714285709*G0_0_1_7_9 + 0.00696428571428568*G0_0_1_8_0 + 0.0107142857142856*G0_0_1_8_1 + 0.00321428571428569*G0_0_1_8_2 + 0.0128571428571428*G0_0_1_8_3 - 0.00964285714285707*G0_0_1_8_4 + 0.0032142857142857*G0_0_1_8_5 - 0.00803571428571423*G0_0_1_8_6 + 0.0353571428571426*G0_0_1_8_8 + 0.00964285714285709*G0_0_1_8_9 - 0.00321428571428571*G0_0_1_9_0 + 0.0032142857142857*G0_0_1_9_1 - 0.00321428571428571*G0_0_1_9_3 - 0.0128571428571428*G0_0_1_9_4 + 0.0032142857142857*G0_0_1_9_5 + 0.0128571428571428*G0_0_1_9_6 - 0.00964285714285709*G0_0_1_9_7 + 0.00964285714285709*G0_0_1_9_8 + 0.0123015873015872*G0_1_0_0_0 + 0.000317460317460315*G0_1_0_0_2 - 0.00107142857142856*G0_1_0_0_3 + 0.00214285714285714*G0_1_0_0_4 + 0.00892857142857137*G0_1_0_0_5 - 0.00339285714285713*G0_1_0_0_6 + 0.0107142857142857*G0_1_0_0_7 - 0.00696428571428568*G0_1_0_0_8 + 0.00321428571428571*G0_1_0_0_9 - 0.0123015873015872*G0_1_0_1_1 - 0.000317460317460313*G0_1_0_1_2 - 0.00892857142857137*G0_1_0_1_3 + 0.00339285714285712*G0_1_0_1_4 + 0.00107142857142856*G0_1_0_1_5 - 0.00214285714285714*G0_1_0_1_6 + 0.00696428571428567*G0_1_0_1_7 - 0.0107142857142856*G0_1_0_1_8 - 0.0032142857142857*G0_1_0_1_9 + 0.000317460317460315*G0_1_0_2_0 - 0.000317460317460313*G0_1_0_2_1 - 0.00357142857142855*G0_1_0_2_3 + 0.00178571428571427*G0_1_0_2_4 + 0.00357142857142855*G0_1_0_2_5 - 0.00178571428571428*G0_1_0_2_6 + 0.00321428571428569*G0_1_0_2_7 - 0.00321428571428569*G0_1_0_2_8 - 0.00107142857142856*G0_1_0_3_0 - 0.00892857142857137*G0_1_0_3_1 - 0.00357142857142855*G0_1_0_3_2 - 0.00321428571428569*G0_1_0_3_3 + 0.00964285714285708*G0_1_0_3_4 + 0.0064285714285714*G0_1_0_3_6 + 0.00321428571428569*G0_1_0_3_7 - 0.0128571428571428*G0_1_0_3_8 + 0.00321428571428571*G0_1_0_3_9 + 0.00214285714285714*G0_1_0_4_0 + 0.00339285714285712*G0_1_0_4_1 + 0.00178571428571427*G0_1_0_4_2 + 0.00964285714285708*G0_1_0_4_3 + 0.032142857142857*G0_1_0_4_4 - 0.00642857142857141*G0_1_0_4_5 - 0.00803571428571424*G0_1_0_4_7 + 0.00964285714285707*G0_1_0_4_8 + 0.0128571428571428*G0_1_0_4_9 + 0.00892857142857137*G0_1_0_5_0 + 0.00107142857142856*G0_1_0_5_1 + 0.00357142857142855*G0_1_0_5_2 - 0.00642857142857141*G0_1_0_5_4 + 0.00321428571428568*G0_1_0_5_5 - 0.0096428571428571*G0_1_0_5_6 + 0.0128571428571428*G0_1_0_5_7 - 0.0032142857142857*G0_1_0_5_8 - 0.0032142857142857*G0_1_0_5_9 - 0.00339285714285713*G0_1_0_6_0 - 0.00214285714285714*G0_1_0_6_1 - 0.00178571428571428*G0_1_0_6_2 + 0.0064285714285714*G0_1_0_6_3 - 0.00964285714285709*G0_1_0_6_5 - 0.0321428571428571*G0_1_0_6_6 - 0.00964285714285708*G0_1_0_6_7 + 0.00803571428571423*G0_1_0_6_8 - 0.0128571428571428*G0_1_0_6_9 + 0.0107142857142857*G0_1_0_7_0 + 0.00696428571428567*G0_1_0_7_1 + 0.00321428571428569*G0_1_0_7_2 + 0.00321428571428569*G0_1_0_7_3 - 0.00803571428571425*G0_1_0_7_4 + 0.0128571428571428*G0_1_0_7_5 - 0.00964285714285709*G0_1_0_7_6 + 0.0353571428571427*G0_1_0_7_7 + 0.00964285714285709*G0_1_0_7_9 - 0.00696428571428568*G0_1_0_8_0 - 0.0107142857142856*G0_1_0_8_1 - 0.00321428571428569*G0_1_0_8_2 - 0.0128571428571428*G0_1_0_8_3 + 0.00964285714285707*G0_1_0_8_4 - 0.0032142857142857*G0_1_0_8_5 + 0.00803571428571423*G0_1_0_8_6 - 0.0353571428571426*G0_1_0_8_8 - 0.00964285714285709*G0_1_0_8_9 + 0.00321428571428571*G0_1_0_9_0 - 0.0032142857142857*G0_1_0_9_1 + 0.00321428571428571*G0_1_0_9_3 + 0.0128571428571428*G0_1_0_9_4 - 0.0032142857142857*G0_1_0_9_5 - 0.0128571428571428*G0_1_0_9_6 + 0.00964285714285709*G0_1_0_9_7 - 0.00964285714285709*G0_1_0_9_8; + A[20] = -A[32] - 0.0115079365079364*G0_0_1_0_0 + 0.00057539682539683*G0_0_1_0_1 + 0.0029563492063492*G0_0_1_0_2 - 0.00196428571428572*G0_0_1_0_3 + 0.00874999999999999*G0_0_1_0_4 - 0.0160714285714285*G0_0_1_0_5 + 0.0139285714285714*G0_0_1_0_6 - 0.0124999999999999*G0_0_1_0_7 + 0.00678571428571425*G0_0_1_0_8 + 0.00428571428571429*G0_0_1_0_9 + 0.00057539682539683*G0_0_1_1_0 + 0.013095238095238*G0_0_1_1_1 + 0.00359126984126982*G0_0_1_1_2 + 0.00178571428571426*G0_0_1_1_3 + 0.00714285714285713*G0_0_1_1_4 - 0.00410714285714284*G0_0_1_1_5 + 0.0130357142857143*G0_0_1_1_6 - 0.0071428571428571*G0_0_1_1_7 + 0.00892857142857137*G0_0_1_1_8 + 0.0107142857142857*G0_0_1_1_9 + 0.0029563492063492*G0_0_1_2_0 + 0.00359126984126982*G0_0_1_2_1 + 0.0440476190476188*G0_0_1_2_2 - 0.0124999999999999*G0_0_1_2_3 + 0.0303571428571427*G0_0_1_2_4 - 0.019642857142857*G0_0_1_2_5 + 0.0339285714285712*G0_0_1_2_6 - 0.00410714285714283*G0_0_1_2_7 + 0.00232142857142856*G0_0_1_2_8 - 0.00196428571428572*G0_0_1_3_0 + 0.00178571428571426*G0_0_1_3_1 - 0.0124999999999999*G0_0_1_3_2 + 0.0321428571428569*G0_0_1_3_3 - 0.0498214285714283*G0_0_1_3_4 + 0.0128571428571428*G0_0_1_3_5 - 0.0466071428571426*G0_0_1_3_6 - 0.00160714285714284*G0_0_1_3_7 + 0.0160714285714285*G0_0_1_3_8 - 0.0289285714285713*G0_0_1_3_9 + 0.00874999999999999*G0_0_1_4_0 + 0.00714285714285713*G0_0_1_4_1 + 0.0303571428571427*G0_0_1_4_2 - 0.0498214285714283*G0_0_1_4_3 + 0.128571428571428*G0_0_1_4_4 - 0.0337499999999998*G0_0_1_4_5 + 0.0803571428571425*G0_0_1_4_6 - 0.0032142857142857*G0_0_1_4_7 - 0.0144642857142856*G0_0_1_4_8 + 0.0674999999999997*G0_0_1_4_9 - 0.0160714285714285*G0_0_1_5_0 - 0.00410714285714284*G0_0_1_5_1 - 0.019642857142857*G0_0_1_5_2 + 0.0128571428571428*G0_0_1_5_3 - 0.0337499999999998*G0_0_1_5_4 + 0.0257142857142856*G0_0_1_5_5 - 0.0305357142857142*G0_0_1_5_6 - 0.00964285714285707*G0_0_1_5_7 + 0.00482142857142855*G0_0_1_5_8 - 0.0224999999999999*G0_0_1_5_9 + 0.0139285714285714*G0_0_1_6_0 + 0.0130357142857143*G0_0_1_6_1 + 0.0339285714285712*G0_0_1_6_2 - 0.0466071428571426*G0_0_1_6_3 + 0.0803571428571425*G0_0_1_6_4 - 0.0305357142857142*G0_0_1_6_5 + 0.192857142857142*G0_0_1_6_6 + 0.00482142857142854*G0_0_1_6_7 - 0.0192857142857142*G0_0_1_6_8 + 0.0932142857142853*G0_0_1_6_9 - 0.0124999999999999*G0_0_1_7_0 - 0.0071428571428571*G0_0_1_7_1 - 0.00410714285714283*G0_0_1_7_2 - 0.00160714285714284*G0_0_1_7_3 - 0.0032142857142857*G0_0_1_7_4 - 0.00964285714285707*G0_0_1_7_5 + 0.00482142857142854*G0_0_1_7_6 - 0.0385714285714283*G0_0_1_7_7 + 0.00160714285714287*G0_0_1_7_8 - 0.0224999999999999*G0_0_1_7_9 + 0.00678571428571425*G0_0_1_8_0 + 0.00892857142857137*G0_0_1_8_1 + 0.00232142857142856*G0_0_1_8_2 + 0.0160714285714285*G0_0_1_8_3 - 0.0144642857142856*G0_0_1_8_4 + 0.00482142857142855*G0_0_1_8_5 - 0.0192857142857142*G0_0_1_8_6 + 0.00160714285714286*G0_0_1_8_7 + 0.032142857142857*G0_0_1_8_8 - 0.0032142857142857*G0_0_1_8_9 + 0.00428571428571429*G0_0_1_9_0 + 0.0107142857142857*G0_0_1_9_1 - 0.0289285714285713*G0_0_1_9_3 + 0.0674999999999997*G0_0_1_9_4 - 0.0224999999999999*G0_0_1_9_5 + 0.0932142857142853*G0_0_1_9_6 - 0.0224999999999999*G0_0_1_9_7 - 0.0032142857142857*G0_0_1_9_8 + 0.115714285714285*G0_0_1_9_9; + A[26] = -A[20] - 0.0146825396825396*G0_1_1_0_0 - 0.00323412698412697*G0_1_1_0_1 - 0.00386904761904761*G0_1_1_0_2 + 0.00160714285714286*G0_1_1_0_3 - 0.00482142857142857*G0_1_1_0_4 - 0.00535714285714281*G0_1_1_0_5 - 0.00321428571428573*G0_1_1_0_6 - 0.00892857142857138*G0_1_1_0_7 + 0.00392857142857141*G0_1_1_0_8 - 0.00428571428571429*G0_1_1_0_9 - 0.00323412698412697*G0_1_1_1_0 - 0.0146825396825396*G0_1_1_1_1 - 0.0038690476190476*G0_1_1_1_2 - 0.00535714285714281*G0_1_1_1_3 - 0.00321428571428572*G0_1_1_1_4 + 0.00160714285714286*G0_1_1_1_5 - 0.00482142857142857*G0_1_1_1_6 + 0.00392857142857141*G0_1_1_1_7 - 0.00892857142857137*G0_1_1_1_8 - 0.00428571428571427*G0_1_1_1_9 - 0.00386904761904761*G0_1_1_2_0 - 0.0038690476190476*G0_1_1_2_1 - 0.0392857142857141*G0_1_1_2_2 + 0.0107142857142856*G0_1_1_2_3 - 0.0267857142857141*G0_1_1_2_4 + 0.0107142857142857*G0_1_1_2_5 - 0.0267857142857141*G0_1_1_2_6 - 0.00267857142857141*G0_1_1_2_7 - 0.00267857142857141*G0_1_1_2_8 - 0.0107142857142857*G0_1_1_2_9 + 0.00160714285714286*G0_1_1_3_0 - 0.00535714285714281*G0_1_1_3_1 + 0.0107142857142856*G0_1_1_3_2 - 0.0257142857142855*G0_1_1_3_3 + 0.0401785714285712*G0_1_1_3_4 - 0.0096428571428571*G0_1_1_3_5 + 0.0241071428571427*G0_1_1_3_6 + 0.00482142857142855*G0_1_1_3_7 - 0.0224999999999998*G0_1_1_3_8 + 0.00321428571428571*G0_1_1_3_9 - 0.00482142857142857*G0_1_1_4_0 - 0.00321428571428572*G0_1_1_4_1 - 0.0267857142857141*G0_1_1_4_2 + 0.0401785714285712*G0_1_1_4_3 - 0.0964285714285709*G0_1_1_4_4 + 0.0241071428571428*G0_1_1_4_5 - 0.0482142857142855*G0_1_1_4_6 + 0.0064285714285714*G0_1_1_4_7 + 0.0176785714285713*G0_1_1_4_8 - 0.0160714285714285*G0_1_1_4_9 - 0.00535714285714281*G0_1_1_5_0 + 0.00160714285714286*G0_1_1_5_1 + 0.0107142857142857*G0_1_1_5_2 - 0.00964285714285709*G0_1_1_5_3 + 0.0241071428571428*G0_1_1_5_4 - 0.0257142857142856*G0_1_1_5_5 + 0.0401785714285712*G0_1_1_5_6 - 0.0224999999999998*G0_1_1_5_7 + 0.00482142857142854*G0_1_1_5_8 + 0.00321428571428571*G0_1_1_5_9 - 0.00321428571428573*G0_1_1_6_0 - 0.00482142857142857*G0_1_1_6_1 - 0.0267857142857141*G0_1_1_6_2 + 0.0241071428571427*G0_1_1_6_3 - 0.0482142857142855*G0_1_1_6_4 + 0.0401785714285712*G0_1_1_6_5 - 0.096428571428571*G0_1_1_6_6 + 0.0176785714285713*G0_1_1_6_7 + 0.00642857142857137*G0_1_1_6_8 - 0.0160714285714285*G0_1_1_6_9 - 0.00892857142857138*G0_1_1_7_0 + 0.00392857142857141*G0_1_1_7_1 - 0.00267857142857141*G0_1_1_7_2 + 0.00482142857142854*G0_1_1_7_3 + 0.0064285714285714*G0_1_1_7_4 - 0.0224999999999998*G0_1_1_7_5 + 0.0176785714285713*G0_1_1_7_6 - 0.0899999999999994*G0_1_1_7_7 + 0.020892857142857*G0_1_1_7_8 - 0.0224999999999999*G0_1_1_7_9 + 0.00392857142857141*G0_1_1_8_0 - 0.00892857142857137*G0_1_1_8_1 - 0.00267857142857141*G0_1_1_8_2 - 0.0224999999999998*G0_1_1_8_3 + 0.0176785714285713*G0_1_1_8_4 + 0.00482142857142854*G0_1_1_8_5 + 0.00642857142857137*G0_1_1_8_6 + 0.020892857142857*G0_1_1_8_7 - 0.0899999999999994*G0_1_1_8_8 - 0.0224999999999999*G0_1_1_8_9 - 0.00428571428571429*G0_1_1_9_0 - 0.00428571428571427*G0_1_1_9_1 - 0.0107142857142857*G0_1_1_9_2 + 0.00321428571428571*G0_1_1_9_3 - 0.0160714285714285*G0_1_1_9_4 + 0.00321428571428571*G0_1_1_9_5 - 0.0160714285714285*G0_1_1_9_6 - 0.0224999999999999*G0_1_1_9_7 - 0.0224999999999999*G0_1_1_9_8 - 0.0385714285714284*G0_1_1_9_9; + A[2] = -A[8] + 0.0123015873015872*G0_0_1_0_0 + 0.000317460317460315*G0_0_1_0_2 - 0.00107142857142856*G0_0_1_0_3 + 0.00214285714285714*G0_0_1_0_4 + 0.00892857142857137*G0_0_1_0_5 - 0.00339285714285713*G0_0_1_0_6 + 0.0107142857142857*G0_0_1_0_7 - 0.00696428571428568*G0_0_1_0_8 + 0.00321428571428571*G0_0_1_0_9 - 0.0123015873015872*G0_0_1_1_1 - 0.000317460317460313*G0_0_1_1_2 - 0.00892857142857137*G0_0_1_1_3 + 0.00339285714285712*G0_0_1_1_4 + 0.00107142857142856*G0_0_1_1_5 - 0.00214285714285714*G0_0_1_1_6 + 0.00696428571428567*G0_0_1_1_7 - 0.0107142857142856*G0_0_1_1_8 - 0.0032142857142857*G0_0_1_1_9 + 0.000317460317460315*G0_0_1_2_0 - 0.000317460317460313*G0_0_1_2_1 - 0.00357142857142855*G0_0_1_2_3 + 0.00178571428571427*G0_0_1_2_4 + 0.00357142857142855*G0_0_1_2_5 - 0.00178571428571427*G0_0_1_2_6 + 0.00321428571428569*G0_0_1_2_7 - 0.00321428571428569*G0_0_1_2_8 - 0.00107142857142856*G0_0_1_3_0 - 0.00892857142857137*G0_0_1_3_1 - 0.00357142857142855*G0_0_1_3_2 - 0.00321428571428569*G0_0_1_3_3 + 0.00964285714285707*G0_0_1_3_4 + 0.00642857142857139*G0_0_1_3_6 + 0.00321428571428569*G0_0_1_3_7 - 0.0128571428571428*G0_0_1_3_8 + 0.0032142857142857*G0_0_1_3_9 + 0.00214285714285714*G0_0_1_4_0 + 0.00339285714285712*G0_0_1_4_1 + 0.00178571428571427*G0_0_1_4_2 + 0.00964285714285707*G0_0_1_4_3 + 0.032142857142857*G0_0_1_4_4 - 0.00642857142857141*G0_0_1_4_5 - 0.00803571428571425*G0_0_1_4_7 + 0.00964285714285707*G0_0_1_4_8 + 0.0128571428571428*G0_0_1_4_9 + 0.00892857142857137*G0_0_1_5_0 + 0.00107142857142856*G0_0_1_5_1 + 0.00357142857142855*G0_0_1_5_2 - 0.00642857142857141*G0_0_1_5_4 + 0.00321428571428569*G0_0_1_5_5 - 0.0096428571428571*G0_0_1_5_6 + 0.0128571428571428*G0_0_1_5_7 - 0.0032142857142857*G0_0_1_5_8 - 0.00321428571428571*G0_0_1_5_9 - 0.00339285714285713*G0_0_1_6_0 - 0.00214285714285714*G0_0_1_6_1 - 0.00178571428571427*G0_0_1_6_2 + 0.00642857142857139*G0_0_1_6_3 - 0.0096428571428571*G0_0_1_6_5 - 0.032142857142857*G0_0_1_6_6 - 0.00964285714285709*G0_0_1_6_7 + 0.00803571428571424*G0_0_1_6_8 - 0.0128571428571428*G0_0_1_6_9 + 0.0107142857142857*G0_0_1_7_0 + 0.00696428571428567*G0_0_1_7_1 + 0.00321428571428569*G0_0_1_7_2 + 0.00321428571428569*G0_0_1_7_3 - 0.00803571428571425*G0_0_1_7_4 + 0.0128571428571428*G0_0_1_7_5 - 0.00964285714285709*G0_0_1_7_6 + 0.0353571428571427*G0_0_1_7_7 + 0.00964285714285709*G0_0_1_7_9 - 0.00696428571428568*G0_0_1_8_0 - 0.0107142857142856*G0_0_1_8_1 - 0.00321428571428569*G0_0_1_8_2 - 0.0128571428571428*G0_0_1_8_3 + 0.00964285714285707*G0_0_1_8_4 - 0.0032142857142857*G0_0_1_8_5 + 0.00803571428571424*G0_0_1_8_6 - 0.0353571428571426*G0_0_1_8_8 - 0.00964285714285709*G0_0_1_8_9 + 0.00321428571428571*G0_0_1_9_0 - 0.0032142857142857*G0_0_1_9_1 + 0.0032142857142857*G0_0_1_9_3 + 0.0128571428571428*G0_0_1_9_4 - 0.00321428571428571*G0_0_1_9_5 - 0.0128571428571428*G0_0_1_9_6 + 0.00964285714285709*G0_0_1_9_7 - 0.0096428571428571*G0_0_1_9_8 + 0.00982142857142852*G0_1_1_0_0 + 0.000808531746031741*G0_1_1_0_1 + 0.00112599206349206*G0_1_1_0_2 - 0.000937499999999996*G0_1_1_0_3 + 0.00227678571428571*G0_1_1_0_4 + 0.00580357142857139*G0_1_1_0_5 - 0.000892857142857129*G0_1_1_0_6 + 0.00758928571428567*G0_1_1_0_7 - 0.00446428571428569*G0_1_1_0_8 + 0.00267857142857143*G0_1_1_0_9 + 0.000808531746031741*G0_1_1_1_0 - 0.00248015873015872*G0_1_1_1_1 + 0.000808531746031743*G0_1_1_1_2 - 0.00312499999999998*G0_1_1_1_3 + 0.00249999999999999*G0_1_1_1_4 + 0.000133928571428566*G0_1_1_1_5 + 0.000133928571428572*G0_1_1_1_6 + 0.00249999999999999*G0_1_1_1_7 - 0.00312499999999998*G0_1_1_1_8 - 0.000535714285714284*G0_1_1_1_9 + 0.00112599206349206*G0_1_1_2_0 + 0.000808531746031744*G0_1_1_2_1 + 0.00982142857142852*G0_1_1_2_2 - 0.00446428571428569*G0_1_1_2_3 + 0.00758928571428567*G0_1_1_2_4 - 0.00089285714285714*G0_1_1_2_5 + 0.0058035714285714*G0_1_1_2_6 + 0.0022767857142857*G0_1_1_2_7 - 0.000937499999999995*G0_1_1_2_8 + 0.00267857142857141*G0_1_1_2_9 - 0.000937499999999996*G0_1_1_3_0 - 0.00312499999999998*G0_1_1_3_1 - 0.00446428571428569*G0_1_1_3_2 + 0.00482142857142854*G0_1_1_3_3 - 0.00522321428571426*G0_1_1_3_4 + 0.00241071428571427*G0_1_1_3_5 - 0.00281249999999999*G0_1_1_3_6 + 0.000401785714285708*G0_1_1_3_7 - 0.000803571428571424*G0_1_1_3_8 + 0.000803571428571425*G0_1_1_3_9 + 0.00227678571428571*G0_1_1_4_0 + 0.00249999999999999*G0_1_1_4_1 + 0.00758928571428567*G0_1_1_4_2 - 0.00522321428571426*G0_1_1_4_3 + 0.0401785714285712*G0_1_1_4_4 - 0.00924107142857139*G0_1_1_4_5 + 0.0120535714285714*G0_1_1_4_6 - 0.00562499999999997*G0_1_1_4_7 + 0.000401785714285711*G0_1_1_4_8 + 0.0104464285714285*G0_1_1_4_9 + 0.00580357142857139*G0_1_1_5_0 + 0.000133928571428566*G0_1_1_5_1 - 0.00089285714285714*G0_1_1_5_2 + 0.00241071428571427*G0_1_1_5_3 - 0.00924107142857139*G0_1_1_5_4 + 0.00803571428571424*G0_1_1_5_5 - 0.0148660714285714*G0_1_1_5_6 + 0.0120535714285713*G0_1_1_5_7 - 0.00281249999999998*G0_1_1_5_8 - 0.00241071428571428*G0_1_1_5_9 - 0.000892857142857129*G0_1_1_6_0 + 0.000133928571428572*G0_1_1_6_1 + 0.0058035714285714*G0_1_1_6_2 - 0.00281249999999999*G0_1_1_6_3 + 0.0120535714285714*G0_1_1_6_4 - 0.0148660714285714*G0_1_1_6_5 + 0.00803571428571424*G0_1_1_6_6 - 0.00924107142857137*G0_1_1_6_7 + 0.00241071428571428*G0_1_1_6_8 - 0.00241071428571427*G0_1_1_6_9 + 0.00758928571428567*G0_1_1_7_0 + 0.00249999999999999*G0_1_1_7_1 + 0.0022767857142857*G0_1_1_7_2 + 0.000401785714285709*G0_1_1_7_3 - 0.00562499999999997*G0_1_1_7_4 + 0.0120535714285713*G0_1_1_7_5 - 0.00924107142857137*G0_1_1_7_6 + 0.0401785714285712*G0_1_1_7_7 - 0.00522321428571427*G0_1_1_7_8 + 0.0104464285714285*G0_1_1_7_9 - 0.00446428571428569*G0_1_1_8_0 - 0.00312499999999998*G0_1_1_8_1 - 0.000937499999999995*G0_1_1_8_2 - 0.000803571428571424*G0_1_1_8_3 + 0.000401785714285711*G0_1_1_8_4 - 0.00281249999999998*G0_1_1_8_5 + 0.00241071428571428*G0_1_1_8_6 - 0.00522321428571426*G0_1_1_8_7 + 0.00482142857142855*G0_1_1_8_8 + 0.000803571428571419*G0_1_1_8_9 + 0.00267857142857143*G0_1_1_9_0 - 0.000535714285714284*G0_1_1_9_1 + 0.00267857142857141*G0_1_1_9_2 + 0.000803571428571425*G0_1_1_9_3 + 0.0104464285714285*G0_1_1_9_4 - 0.00241071428571428*G0_1_1_9_5 - 0.00241071428571427*G0_1_1_9_6 + 0.0104464285714285*G0_1_1_9_7 + 0.000803571428571418*G0_1_1_9_8 + 0.0096428571428571*G0_1_1_9_9; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p3_q2_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p3_q2_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q2_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q2_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q2_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q2_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q2_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q2_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q2_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q2_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q2_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q2_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p3_q3_quadrature.h b/laplacian_2d/laplacian_f2_p3_q3_quadrature.h new file mode 100644 index 0000000..a3f61ba --- /dev/null +++ b/laplacian_2d/laplacian_f2_p3_q3_quadrature.h @@ -0,0 +1,3550 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P3_Q3_QUADRATURE_H +#define __LAPLACIAN_F2_P3_Q3_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q3_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q3_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q3_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q3_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q3_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q3_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q3_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q3_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p3_q3_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p3_q3_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q3_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W36[36] = {0.00619426535265906, 0.0116108747669979, 0.0120606064042655, 0.0084515357969434, 0.0037652982126918, 0.000748542561236343, 0.0130433943300833, 0.0244492622580587, 0.0253962715890485, 0.0177965759970269, 0.00792866733379675, 0.00157622175402364, 0.0169175056800133, 0.0317111115907051, 0.0329393989007878, 0.023082463651359, 0.0102836172287667, 0.00204438659154493, 0.0169175056800133, 0.0317111115907051, 0.0329393989007878, 0.023082463651359, 0.0102836172287667, 0.00204438659154493, 0.0130433943300833, 0.0244492622580587, 0.0253962715890485, 0.0177965759970269, 0.00792866733379675, 0.00157622175402364, 0.00619426535265908, 0.0116108747669979, 0.0120606064042655, 0.00845153579694342, 0.00376529821269181, 0.000748542561236345}; + // Quadrature points on the UFC reference element: (0.0327753666144599, 0.0293164271597849), (0.0287653330125591, 0.148078599668484), (0.0223868729780306, 0.336984690281154), (0.0149015633666711, 0.55867151877155), (0.00779187470128645, 0.769233862030055), (0.00246669715267023, 0.926945671319741), (0.164429241594827, 0.0293164271597849), (0.144311486950417, 0.148078599668484), (0.112311681780954, 0.336984690281154), (0.0747589734626491, 0.55867151877155), (0.0390907007328242, 0.769233862030055), (0.01237506041744, 0.926945671319741), (0.369529924372377, 0.0293164271597849), (0.324318304588776, 0.148078599668484), (0.252403568076518, 0.336984690281154), (0.168009519121192, 0.55867151877155), (0.0878504549759972, 0.769233862030055), (0.0278110821153606, 0.926945671319741), (0.601153648467838, 0.0293164271597849), (0.52760309574274, 0.148078599668484), (0.410611741642328, 0.336984690281154), (0.273318962107258, 0.55867151877155), (0.142915682993948, 0.769233862030055), (0.0452432465648983, 0.926945671319741), (0.806254331245388, 0.0293164271597849), (0.707609913381099, 0.148078599668484), (0.550703627937892, 0.336984690281154), (0.366569507765801, 0.55867151877155), (0.191675437237121, 0.769233862030055), (0.0606792682628189, 0.926945671319741), (0.937908206225755, 0.0293164271597849), (0.823156067318956, 0.148078599668484), (0.640628436740815, 0.336984690281154), (0.426426917861779, 0.55867151877155), (0.222974263268659, 0.769233862030055), (0.0705876315275886, 0.926945671319741) + + // Value of basis functions at quadrature points. + static const double FE0[36][10] = \ + {{0.692116405326339, 0.02809979214053, 0.0255622715011347, -0.00389870712577275, -0.00394357498286783, 0.224416734425978, -0.112850342203846, 0.250894855131633, -0.124729708262302, 0.0243322740491737}, + {0.283934759651154, 0.0251489409971642, 0.0640171956914923, -0.017513774166326, -0.0106528248707413, 0.806022543976085, -0.304843939147456, 0.156575676330067, -0.09735754861905, 0.0946689701576113}, + {-0.0230667189458805, 0.0201820871510281, -0.00182545940770506, -0.0316681717528917, 0.000371870446193724, 0.89558289813655, 0.0106415390326748, 0.0594961764142812, -0.0602031247994333, 0.130488903725183}, + {-0.0429162476948668, 0.0139171991648147, -0.0611798040376018, -0.0357880903185193, 0.0253254357551022, 0.299401977386428, 0.724719094689676, 0.00798601215243793, -0.0273165975674619, 0.0958510204699923}, + {0.0491311892659463, 0.00752079361748077, 0.154762873078755, -0.0263414954880058, 0.0352713041777646, -0.255537670979266, 1.00933258876242, -0.00258844236065512, -0.00763548751524317, 0.0360843474408062}, + {0.0497485688239404, 0.00243938401571432, 0.644479118812606, -0.0102130829170651, 0.0183234311516915, -0.232087782696187, 0.524347954533704, -0.000617609305981343, -0.000777734182289311, 0.00435775176386693}, + {0.239508104110957, 0.0627683640711487, 0.0255622715011347, -0.0109916789233747, -0.0197843414303476, 0.150905638607928, -0.0970095757563663, 0.846395762124882, -0.302290885970787, 0.104936341664825}, + {0.0487956775975465, 0.0641196764159749, 0.0640171956914923, -0.0545304359767136, -0.0534436711248166, 0.529434975607773, -0.26205309289338, 0.515966174346368, -0.260579700000555, 0.408273200336311}, + {-0.0624669400507792, 0.0619241738506681, -0.00182545940770507, -0.112928533782117, 0.00186561987722195, 0.544580480381976, 0.00914778960164661, 0.181500084071326, -0.18454889805122, 0.562751683508982}, + {-0.0164528736892737, 0.0514890982575727, -0.0611798040376018, -0.145793810693828, 0.127054023323504, 0.0918877602754595, 0.622990507121274, 0.0122960172501373, -0.0956618757635125, 0.413370957956269}, + {0.0580370533440934, 0.0324831299939719, 0.154762873078755, -0.119445891298144, 0.176950996894466, -0.28196773278322, 0.867652896045716, -0.0143289535245539, -0.0297631768059828, 0.155618805054899}, + {0.0451157746630251, 0.0116944490193935, 0.644479118812606, -0.0497031543433876, 0.0919259858517785, -0.207033374665612, 0.450745399833617, -0.00276397053159079, -0.00325364379944373, 0.018793415159615}, + {-0.0474645235382766, -0.0178848851455664, 0.0255622715011347, 0.00529373373938184, -0.044462323864076, 0.0637197133595963, -0.072331593322638, 0.803179075351347, 0.108551677668697, 0.175836854250401}, + {-0.0641414000235847, 0.00450421741088888, 0.0640171956914923, -0.00584473256502759, -0.120106591488146, 0.204898420912783, -0.195390172530051, 0.448763755411812, -0.0208247444397818, 0.684124051619614}, + {-0.0365624407658455, 0.0380796136728452, -0.0018254594077051, -0.0929282395408236, 0.00419269933650989, 0.144355545313924, 0.00682071014235865, 0.108123175205576, -0.11323192829258, 0.94297632433574}, + {0.0290344870041462, 0.062328097021337, -0.0611798040376018, -0.209488219289238, 0.285534757531945, -0.123712995627073, 0.464509772912832, -0.0372042608330028, -0.102487957137557, 0.692666122454212}, + {0.0641393355313793, 0.056171810516347, 0.154762873078755, -0.223953257707656, 0.397670681113729, -0.282604617367218, 0.646933211826454, -0.0322748977125213, -0.0416081953276764, 0.260763056048409}, + {0.0364487137089399, 0.0244273267710131, 0.644479118812606, -0.106328278377059, 0.206589790661253, -0.163106070537901, 0.336081595024143, -0.00489365931747109, -0.00518977181109789, 0.0314912350655751}, + {-0.0178848851455663, -0.0474645235382766, 0.0255622715011347, 0.0637197133595961, -0.0723315933226379, 0.00529373373938199, -0.0444623238640759, 0.108551677668697, 0.803179075351347, 0.1758368542504}, + {0.0045042174108889, -0.0641414000235846, 0.0640171956914922, 0.204898420912783, -0.195390172530051, -0.00584473256502754, -0.120106591488146, -0.0208247444397816, 0.448763755411812, 0.684124051619614}, + {0.0380796136728452, -0.0365624407658455, -0.00182545940770513, 0.144355545313925, 0.00682071014235859, -0.0929282395408237, 0.00419269933651006, -0.11323192829258, 0.108123175205576, 0.94297632433574}, + {0.0623280970213371, 0.0290344870041461, -0.0611798040376018, -0.123712995627073, 0.464509772912832, -0.209488219289238, 0.285534757531946, -0.102487957137557, -0.0372042608330029, 0.692666122454212}, + {0.0561718105163471, 0.0641393355313792, 0.154762873078755, -0.282604617367218, 0.646933211826454, -0.223953257707656, 0.397670681113729, -0.0416081953276764, -0.0322748977125213, 0.260763056048409}, + {0.0244273267710132, 0.0364487137089398, 0.644479118812606, -0.163106070537901, 0.336081595024142, -0.106328278377059, 0.206589790661253, -0.00518977181109793, -0.0048936593174711, 0.0314912350655751}, + {0.0627683640711488, 0.239508104110958, 0.0255622715011347, 0.150905638607928, -0.0970095757563663, -0.0109916789233746, -0.0197843414303475, -0.302290885970787, 0.846395762124882, 0.104936341664825}, + {0.064119676415975, 0.0487956775975466, 0.0640171956914922, 0.529434975607773, -0.26205309289338, -0.0545304359767136, -0.0534436711248165, -0.260579700000555, 0.515966174346368, 0.40827320033631}, + {0.0619241738506681, -0.0624669400507792, -0.00182545940770516, 0.544580480381976, 0.00914778960164673, -0.112928533782117, 0.0018656198772221, -0.18454889805122, 0.181500084071326, 0.562751683508982}, + {0.0514890982575727, -0.0164528736892738, -0.0611798040376018, 0.09188776027546, 0.622990507121274, -0.145793810693828, 0.127054023323504, -0.0956618757635125, 0.0122960172501372, 0.413370957956269}, + {0.032483129993972, 0.0580370533440933, 0.154762873078755, -0.28196773278322, 0.867652896045716, -0.119445891298145, 0.176950996894467, -0.0297631768059828, -0.014328953524554, 0.155618805054899}, + {0.0116944490193936, 0.045115774663025, 0.644479118812606, -0.207033374665612, 0.450745399833616, -0.049703154343388, 0.0919259858517791, -0.00325364379944379, -0.00276397053159082, 0.0187934151596152}, + {0.0280997921405301, 0.692116405326339, 0.0255622715011347, 0.224416734425978, -0.112850342203846, -0.00389870712577264, -0.00394357498286779, -0.124729708262302, 0.250894855131634, 0.0243322740491736}, + {0.0251489409971643, 0.283934759651153, 0.0640171956914922, 0.806022543976084, -0.304843939147455, -0.017513774166326, -0.0106528248707413, -0.0973575486190502, 0.156575676330067, 0.0946689701576113}, + {0.0201820871510282, -0.0230667189458805, -0.00182545940770517, 0.89558289813655, 0.0106415390326751, -0.0316681717528917, 0.0003718704461938, -0.0602031247994333, 0.0594961764142811, 0.130488903725183}, + {0.0139171991648147, -0.0429162476948669, -0.0611798040376018, 0.299401977386428, 0.724719094689676, -0.0357880903185195, 0.0253254357551023, -0.027316597567462, 0.00798601215243778, 0.0958510204699924}, + {0.00752079361748081, 0.0491311892659462, 0.154762873078755, -0.255537670979266, 1.00933258876242, -0.026341495488006, 0.0352713041777648, -0.00763548751524329, -0.0025884423606552, 0.0360843474408064}, + {0.00243938401571445, 0.0497485688239403, 0.644479118812606, -0.232087782696186, 0.524347954533703, -0.0102130829170657, 0.0183234311516925, -0.000777734182289422, -0.000617609305981412, 0.00435775176386721}}; + + static const double FE0_D01[36][9] = \ + {{-4.43439548859399, 0.747754769731037, -0.132987116899451, -0.121546020269397, 7.04451116334861, -3.35787044448566, -0.68249855359844, 0.132987116899451, 0.804044573867839}, + {-2.73900519484353, -0.036689229339339, -0.118273499381649, -0.0144366823060889, 2.81848265684241, -0.0427882326595375, -0.509871678182419, 0.11827349938165, 0.524308360488508}, + {-0.774808787805901, -0.499820012497934, -0.0939751052977228, 0.102947974934221, -1.65474547478613, 2.92937427508997, -0.286484092463497, 0.0939751052977238, 0.183536117529275}, + {0.383003391015211, 0.185493520523941, -0.0640592711746119, 0.157720098879452, -3.38233992003183, 2.81384300849267, -0.10451251376981, 0.0640592711746128, -0.0532075851096431}, + {0.335581821335214, 2.06512515739409, -0.0342438064524184, 0.126768458305182, -1.50166780651233, -0.899039172216978, -0.0118460269112365, 0.0342438064524186, -0.114922431393945}, + {-0.431976601534811, 4.25707070543081, -0.0110179951566316, 0.0506352075123457, 2.15424217803109, -5.97933628192709, 0.00639894282504327, 0.0110179951566312, -0.0570341503373868}, + {-2.5193326485928, 0.747754769731037, -0.374932418042144, -0.609778684304584, 4.64121565931223, -2.86963778045047, -2.83950669474232, 0.374932418042144, 3.44928537904691}, + {-1.3911199380254, -0.0366892293393392, -0.36825332018803, -0.0724267328771266, 1.41260734945324, 0.0152018179115008, -2.10773675580694, 0.368253320188031, 2.18016348868406}, + {-0.13787290718238, -0.499820012497935, -0.335114730843998, 0.516474999083284, -1.87815433126059, 2.51584725094091, -1.16455959863329, 0.335114730843999, 0.648084599550009}, + {0.485087315572777, 0.185493520523941, -0.260965175053868, 0.791258769064943, -2.8508851744039, 2.18030433830718, -0.403502342206633, 0.260965175053868, -0.38775642685831}, + {0.229096046393529, 2.06512515739409, -0.155279034366633, 0.635978895444921, -0.885971594430909, -1.40824960935672, -0.0263954798837663, 0.155279034366633, -0.609583415561153}, + {-0.503593229192932, 4.25707070543081, -0.0536203532539496, 0.254029462650712, 2.42925306082758, -6.18273053706546, 0.0354132123858459, 0.0536203532539495, -0.289442675036558}, + {-0.468324236183066, 0.747754769731037, 0.180572267914141, -1.37038563767266, 1.82960029353442, -2.10903082708239, -4.33501042119577, -0.18057226791414, 5.70539605886843}, + {-0.00949999791919755, -0.0366892293393394, -0.0394704743164267, -0.162768160109694, -0.0593540178855322, 0.105543245144069, -3.16057385004153, 0.0394704743164274, 3.32334201015123}, + {0.419378642724583, -0.499820012497935, -0.275763980444604, 1.16069967543701, -1.79118120481383, 1.87162257458719, -1.66246039814086, 0.275763980444605, 0.501760722703856}, + {0.451376715825574, 0.185493520523941, -0.374975656088352, 1.77823476077351, -1.83019858294813, 1.19332834659861, -0.483802223493915, 0.374975656088352, -1.2944325372796}, + {0.0105050989295735, 2.06512515739409, -0.291138064458875, 1.42926666118967, 0.125907118777798, -2.20153737510147, 0.0563364374879477, 0.291138064458875, -1.48560309867762}, + {-0.620444624272301, 4.25707070543081, -0.114708209625351, 0.570892909382767, 2.86296790263901, -6.49959398379751, 0.0911767510938143, 0.11470820962535, -0.662069660476581}, + {0.482312391761555, 0.747754769731037, 2.17351565428834, -2.22935213513232, 0.0199971681301339, -1.25006432962273, -3.29270366276619, -2.17351565428834, 5.52205579789852}, + {0.49890284496592, -0.0366892293393394, 1.38371392876153, -0.264792285687091, -0.669780986348047, 0.207567370721467, -2.2457922898487, -1.38371392876153, 2.51058457553579}, + {0.411580036788936, -0.499820012497935, 0.428374194665893, 1.88823366835444, -1.05584860596075, 1.14408858166975, -0.95052361709472, -0.428374194665893, -0.937710051259725}, + {0.131018492133715, 0.185493520523941, -0.221441386342913, 2.89284370159453, -0.395231418435255, 0.0787194057775988, -0.00990973005661754, 0.221441386342913, -2.88293397153791}, + {-0.313534888149137, 2.0651251573941, -0.367384525456806, 2.32514016142788, 1.34582060609471, -3.09741087533967, 0.304129963568726, 0.367384525456807, -2.6292701249966}, + {-0.760141920855525, 4.25707070543081, -0.175960766185656, 0.928732242572134, 3.3605045324116, -6.85743331698688, 0.169621491116733, 0.175960766185655, -1.09835373368887}, + {0.114864005218869, 0.747754769731037, 5.14747713919705, -2.9899590885004, -0.373161398695258, -0.489457376254649, 0.0487062086852013, -5.14747713919705, 2.9412528798152}, + {0.0176550114649053, -0.0366892293393393, 3.57536454824034, -0.355133712919657, -0.278874580079601, 0.297908797954035, 0.427106163131137, -3.57536454824034, -0.0719724502114772}, + {-0.159482701141711, -0.499820012497934, 1.6160392329029, 2.53245834470817, 0.159438808323621, 0.499863905316025, 0.80820415907293, -1.6160392329029, -3.3406625037811}, + {-0.402619444364211, 0.185493520523941, 0.164475469373326, 3.8798196933031, 1.12538250977124, -0.908256585930973, 0.909645062157548, -0.164475469373326, -4.78946475546065}, + {-0.668812812335656, 2.0651251573941, -0.366556578826485, 3.11842792717263, 2.49438629602598, -3.89069864108442, 0.660235834385566, 0.366556578826485, -3.7786637615582}, + {-0.890691874867567, 4.25707070543081, -0.223350063624382, 1.24559568930419, 3.80791793315569, -7.17429676371893, 0.252782147690049, 0.223350063624382, -1.49837783699424}, + {-0.719523733335476, 0.747754769731037, 7.65498241660988, -3.47819175253558, -0.0270063241761003, -0.00122471221946219, 3.39059922465238, -7.65498241660988, 0.0875925278832053}, + {-0.752282502061833, -0.0366892293393394, 5.44320749777884, -0.413123763490694, 0.4330728828761, 0.355898848525072, 3.06488662619637, -5.44320749777884, -2.65176286270567}, + {-0.805283966301139, -0.499820012497934, 2.65763675313957, 2.94598536885723, 1.21876709763211, 0.0863368811669633, 2.49560294446903, -2.65763675313957, -5.44158831332626}, + {-0.868883693675367, 0.185493520523941, 0.535917739362792, 4.51335836348859, 2.22518542926789, -1.54179525611646, 1.74735158145817, -0.535917739362792, -6.26070994494676}, + {-0.93069275739179, 2.0651251573941, -0.33219763662625, 3.62763836431237, 3.26547667822185, -4.39990907822416, 0.956474721641935, 0.33219763662625, -4.5841130859543}, + {-0.977881867656349, 4.25707070543081, -0.25037905659104, 1.44898994444256, 4.09850218108284, -7.3776910188573, 0.312943147512173, 0.25037905659104, -1.76193309195473}}; + + // Array of non-zero columns + static const unsigned int nzc0[9] = {0, 2, 3, 4, 5, 6, 7, 8, 9}; + + static const double FE0_D10[36][9] = \ + {{-4.43439548859399, 0.719523733335476, -0.105980792723358, -0.120321308049932, -0.610471253261279, 0.120321308049932, 6.97248386301144, -3.25761210775293, 0.716452045984637}, + {-2.73900519484353, 0.752282502061834, -0.551346382257752, -0.37033553083116, -2.62472484093643, 0.37033553083116, 4.93333581959642, -2.94661312681472, 3.17607122319418}, + {-0.774808787805901, 0.80528396630114, -1.31274220292983, 0.0166110937672599, -4.3123822279257, -0.0166110937672606, 2.37115266067607, -2.40162783917131, 5.62512443085554}, + {0.383003391015211, 0.868883693675367, -2.2892447004425, 1.69951535499592, -3.91825765939462, -1.69951535499592, 0.431405225592982, -1.68329231028356, 6.20750235983712}, + {0.335581821335214, 0.93069275739179, -3.29972048467427, 4.52667753652934, -1.16947016988608, -4.52667753652934, -0.344043663537488, -0.922230915189518, 4.46919065456036}, + {-0.431976601534811, 0.977881867656351, -4.10952017623948, 7.42832622636964, 2.40462123462214, -7.42832622636965, -0.243980113766001, -0.301925152355541, 1.70489894161734}, + {-2.5193326485928, -0.11486400521887, -0.00177101934688983, -0.120321308049932, -0.506261479884813, 0.120321308049932, 2.30797044445472, 0.326226209356949, 0.508032499231703}, + {-1.3911199380254, -0.0176550114649058, -0.0893787401084305, -0.37033553083116, -2.16275719878711, 0.37033553083116, 1.4676277924334, -0.0588528429431028, 2.25213593889554}, + {-0.137872907182381, 0.159482701141711, -0.494553539167619, 0.0166110937672598, -3.49419356416349, -0.01661109376726, 0.451479634269601, -0.473089428228931, 3.98874710333111}, + {0.485087315572777, 0.40261944436421, -1.38634768482511, 1.69951535499592, -3.01536064377723, -1.69951535499592, -0.239026872833308, -0.64867988710368, 4.40170832860234}, + {0.229096046393529, 0.668812812335656, -2.64966533039262, 4.52667753652934, -0.519415015604425, -4.52667753652934, -0.392952058710252, -0.504956800018934, 3.16908034599704}, + {-0.503593229192932, 0.890691874867569, -3.86153828640965, 7.42832622636964, 2.65260312445197, -7.42832622636965, -0.187936851238541, -0.199161794436098, 1.20893516195768}, + {-0.468324236183066, -0.482312391761556, 0.160575099784005, -0.120321308049932, -0.343915360753919, 0.120321308049932, -2.16149476690743, 3.11213139485205, 0.183340260969914}, + {-0.00949999791919725, -0.498902844965919, 0.630310512031619, -0.37033553083116, -1.44306794664706, 0.37033553083116, -1.77685992128001, 2.28526276416512, 0.812757434615439}, + {0.419378642724582, -0.411580036788936, 0.780084625516143, 0.0166110937672604, -2.21955539947972, -0.0166110937672599, -1.23408620347497, 1.22628759753933, 1.43947077396358}, + {0.451376715825574, -0.131018492133716, 0.0202557623469021, 1.69951535499592, -1.60875719660521, -1.69951535499592, -0.705243609836828, 0.38488538614497, 1.58850143425831}, + {0.0105050989295734, 0.313534888149137, -1.63695867055358, 4.52667753652934, 0.493291644234604, -4.52667753652934, -0.31104808796886, -0.0129918991098518, 1.14366702631898}, + {-0.620444624272301, 0.760141920855526, -3.47521274203695, 7.42832622636964, 3.03892866882466, -7.42832622636965, -0.0847840150918455, -0.0549132814913815, 0.436284073212286}, + {0.482312391761556, 0.468324236183066, 0.343915360753919, -0.120321308049931, -0.160575099784006, 0.120321308049932, -3.11213139485205, 2.16149476690743, -0.183340260969913}, + {0.49890284496592, 0.00949999791919749, 1.44306794664706, -0.370335530831159, -0.630310512031619, 0.37033553083116, -2.28526276416512, 1.77685992128001, -0.81275743461544}, + {0.411580036788936, -0.419378642724582, 2.21955539947972, 0.0166110937672611, -0.780084625516144, -0.0166110937672601, -1.22628759753933, 1.23408620347497, -1.43947077396358}, + {0.131018492133715, -0.451376715825574, 1.60875719660521, 1.69951535499592, -0.0202557623469027, -1.69951535499592, -0.38488538614497, 0.705243609836828, -1.58850143425831}, + {-0.313534888149137, -0.0105050989295735, -0.493291644234605, 4.52667753652934, 1.63695867055358, -4.52667753652934, 0.0129918991098499, 0.311048087968859, -1.14366702631898}, + {-0.760141920855525, 0.620444624272302, -3.03892866882466, 7.42832622636964, 3.47521274203695, -7.42832622636965, 0.0549132814913782, 0.0847840150918425, -0.436284073212287}, + {0.114864005218869, 2.5193326485928, 0.506261479884813, -0.120321308049932, 0.00177101934688745, 0.120321308049932, -0.326226209356945, -2.30797044445473, -0.5080324992317}, + {0.0176550114649051, 1.3911199380254, 2.16275719878711, -0.370335530831159, 0.0893787401084303, 0.37033553083116, 0.0588528429431052, -1.46762779243341, -2.25213593889554}, + {-0.159482701141711, 0.137872907182382, 3.49419356416349, 0.0166110937672622, 0.494553539167619, -0.0166110937672608, 0.473089428228932, -0.451479634269603, -3.98874710333111}, + {-0.402619444364211, -0.485087315572777, 3.01536064377723, 1.69951535499592, 1.38634768482511, -1.69951535499592, 0.648679887103681, 0.239026872833307, -4.40170832860234}, + {-0.668812812335656, -0.229096046393529, 0.519415015604426, 4.52667753652934, 2.64966533039261, -4.52667753652934, 0.504956800018932, 0.392952058710252, -3.16908034599704}, + {-0.890691874867568, 0.503593229192933, -2.65260312445197, 7.42832622636965, 3.86153828640965, -7.42832622636965, 0.199161794436094, 0.187936851238539, -1.20893516195768}, + {-0.719523733335476, 4.43439548859399, 0.610471253261277, -0.120321308049932, 0.10598079272335, 0.120321308049932, 3.25761210775293, -6.97248386301144, -0.716452045984627}, + {-0.752282502061834, 2.73900519484353, 2.62472484093643, -0.370335530831159, 0.55134638225775, 0.370335530831159, 2.94661312681472, -4.93333581959642, -3.17607122319418}, + {-0.805283966301139, 0.774808787805902, 4.3123822279257, 0.0166110937672631, 1.31274220292983, -0.0166110937672617, 2.40162783917131, -2.37115266067607, -5.62512443085554}, + {-0.868883693675366, -0.38300339101521, 3.91825765939462, 1.69951535499592, 2.2892447004425, -1.69951535499592, 1.68329231028356, -0.431405225592982, -6.20750235983712}, + {-0.930692757391789, -0.335581821335214, 1.16947016988608, 4.52667753652934, 3.29972048467427, -4.52667753652934, 0.922230915189515, 0.344043663537487, -4.46919065456035}, + {-0.977881867656349, 0.431976601534812, -2.40462123462214, 7.42832622636965, 4.10952017623948, -7.42832622636965, 0.301925152355537, 0.243980113765998, -1.70489894161734}}; + + // Array of non-zero columns + static const unsigned int nzc1[9] = {0, 1, 3, 4, 5, 6, 7, 8, 9}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 100; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 36756 + for (unsigned int ip = 0; ip < 36; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 40 + for (unsigned int r = 0; r < 10; r++) + { + F0 += FE0[ip][r]*w[0][r]; + F1 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W36[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W36[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W36[ip]; + + + // Number of operations for primary indices: 972 + for (unsigned int j = 0; j < 9; j++) + { + for (unsigned int k = 0; k < 9; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc1[k]] += FE0_D01[ip][j]*FE0_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc0[k]] += FE0_D01[ip][k]*FE0_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc1[k]] += FE0_D10[ip][j]*FE0_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p3_q3_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p3_q3_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q3_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q3_quadrature_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f2_p3_q3_quadrature_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f2_p3_q3_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q3_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q3_quadrature_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f2_p3_q3_quadrature_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f2_p3_q3_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q3_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q3_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p3_q3_tensor.h b/laplacian_2d/laplacian_f2_p3_q3_tensor.h new file mode 100644 index 0000000..0e9271c --- /dev/null +++ b/laplacian_2d/laplacian_f2_p3_q3_tensor.h @@ -0,0 +1,3868 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P3_Q3_TENSOR_H +#define __LAPLACIAN_F2_P3_Q3_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q3_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q3_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q3_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q3_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q3_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q3_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q3_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q3_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p3_q3_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p3_q3_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q3_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 1200 + // Number of operations (multiply-add pairs) for tensor contraction: 21623 + // Total number of operations (multiply-add pairs): 22834 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_6 = det*(w[0][0]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_7 = det*(w[0][0]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_8 = det*(w[0][0]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_9 = det*(w[0][0]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_6 = det*(w[0][1]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_7 = det*(w[0][1]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_8 = det*(w[0][1]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_9 = det*(w[0][1]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_6 = det*(w[0][2]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_7 = det*(w[0][2]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_8 = det*(w[0][2]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_9 = det*(w[0][2]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_6 = det*(w[0][3]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_7 = det*(w[0][3]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_8 = det*(w[0][3]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_9 = det*(w[0][3]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_6 = det*(w[0][4]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_7 = det*(w[0][4]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_8 = det*(w[0][4]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_9 = det*(w[0][4]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_6 = det*(w[0][5]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_7 = det*(w[0][5]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_8 = det*(w[0][5]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_9 = det*(w[0][5]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_0 = det*(w[0][6]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_1 = det*(w[0][6]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_2 = det*(w[0][6]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_3 = det*(w[0][6]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_4 = det*(w[0][6]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_5 = det*(w[0][6]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_6 = det*(w[0][6]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_7 = det*(w[0][6]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_8 = det*(w[0][6]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_9 = det*(w[0][6]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_0 = det*(w[0][7]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_1 = det*(w[0][7]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_2 = det*(w[0][7]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_3 = det*(w[0][7]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_4 = det*(w[0][7]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_5 = det*(w[0][7]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_6 = det*(w[0][7]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_7 = det*(w[0][7]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_8 = det*(w[0][7]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_9 = det*(w[0][7]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_0 = det*(w[0][8]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_1 = det*(w[0][8]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_2 = det*(w[0][8]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_3 = det*(w[0][8]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_4 = det*(w[0][8]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_5 = det*(w[0][8]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_6 = det*(w[0][8]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_7 = det*(w[0][8]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_8 = det*(w[0][8]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_9 = det*(w[0][8]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_0 = det*(w[0][9]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_1 = det*(w[0][9]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_2 = det*(w[0][9]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_3 = det*(w[0][9]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_4 = det*(w[0][9]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_5 = det*(w[0][9]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_6 = det*(w[0][9]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_7 = det*(w[0][9]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_8 = det*(w[0][9]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_9 = det*(w[0][9]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_6 = det*(w[0][0]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_7 = det*(w[0][0]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_8 = det*(w[0][0]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_9 = det*(w[0][0]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_6 = det*(w[0][1]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_7 = det*(w[0][1]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_8 = det*(w[0][1]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_9 = det*(w[0][1]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_6 = det*(w[0][2]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_7 = det*(w[0][2]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_8 = det*(w[0][2]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_9 = det*(w[0][2]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_6 = det*(w[0][3]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_7 = det*(w[0][3]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_8 = det*(w[0][3]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_9 = det*(w[0][3]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_6 = det*(w[0][4]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_7 = det*(w[0][4]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_8 = det*(w[0][4]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_9 = det*(w[0][4]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_6 = det*(w[0][5]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_7 = det*(w[0][5]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_8 = det*(w[0][5]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_9 = det*(w[0][5]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_0 = det*(w[0][6]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_1 = det*(w[0][6]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_2 = det*(w[0][6]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_3 = det*(w[0][6]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_4 = det*(w[0][6]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_5 = det*(w[0][6]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_6 = det*(w[0][6]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_7 = det*(w[0][6]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_8 = det*(w[0][6]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_9 = det*(w[0][6]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_0 = det*(w[0][7]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_1 = det*(w[0][7]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_2 = det*(w[0][7]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_3 = det*(w[0][7]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_4 = det*(w[0][7]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_5 = det*(w[0][7]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_6 = det*(w[0][7]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_7 = det*(w[0][7]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_8 = det*(w[0][7]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_9 = det*(w[0][7]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_0 = det*(w[0][8]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_1 = det*(w[0][8]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_2 = det*(w[0][8]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_3 = det*(w[0][8]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_4 = det*(w[0][8]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_5 = det*(w[0][8]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_6 = det*(w[0][8]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_7 = det*(w[0][8]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_8 = det*(w[0][8]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_9 = det*(w[0][8]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_0 = det*(w[0][9]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_1 = det*(w[0][9]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_2 = det*(w[0][9]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_3 = det*(w[0][9]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_4 = det*(w[0][9]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_5 = det*(w[0][9]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_6 = det*(w[0][9]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_7 = det*(w[0][9]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_8 = det*(w[0][9]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_9 = det*(w[0][9]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_6 = det*(w[0][0]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_7 = det*(w[0][0]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_8 = det*(w[0][0]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_9 = det*(w[0][0]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_6 = det*(w[0][1]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_7 = det*(w[0][1]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_8 = det*(w[0][1]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_9 = det*(w[0][1]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_6 = det*(w[0][2]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_7 = det*(w[0][2]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_8 = det*(w[0][2]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_9 = det*(w[0][2]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_6 = det*(w[0][3]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_7 = det*(w[0][3]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_8 = det*(w[0][3]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_9 = det*(w[0][3]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_6 = det*(w[0][4]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_7 = det*(w[0][4]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_8 = det*(w[0][4]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_9 = det*(w[0][4]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_6 = det*(w[0][5]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_7 = det*(w[0][5]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_8 = det*(w[0][5]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_9 = det*(w[0][5]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_0 = det*(w[0][6]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_1 = det*(w[0][6]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_2 = det*(w[0][6]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_3 = det*(w[0][6]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_4 = det*(w[0][6]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_5 = det*(w[0][6]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_6 = det*(w[0][6]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_7 = det*(w[0][6]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_8 = det*(w[0][6]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_9 = det*(w[0][6]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_0 = det*(w[0][7]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_1 = det*(w[0][7]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_2 = det*(w[0][7]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_3 = det*(w[0][7]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_4 = det*(w[0][7]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_5 = det*(w[0][7]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_6 = det*(w[0][7]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_7 = det*(w[0][7]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_8 = det*(w[0][7]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_9 = det*(w[0][7]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_0 = det*(w[0][8]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_1 = det*(w[0][8]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_2 = det*(w[0][8]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_3 = det*(w[0][8]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_4 = det*(w[0][8]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_5 = det*(w[0][8]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_6 = det*(w[0][8]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_7 = det*(w[0][8]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_8 = det*(w[0][8]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_9 = det*(w[0][8]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_0 = det*(w[0][9]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_1 = det*(w[0][9]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_2 = det*(w[0][9]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_3 = det*(w[0][9]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_4 = det*(w[0][9]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_5 = det*(w[0][9]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_6 = det*(w[0][9]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_7 = det*(w[0][9]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_8 = det*(w[0][9]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_9 = det*(w[0][9]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_6 = det*(w[0][0]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_7 = det*(w[0][0]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_8 = det*(w[0][0]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_9 = det*(w[0][0]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_6 = det*(w[0][1]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_7 = det*(w[0][1]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_8 = det*(w[0][1]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_9 = det*(w[0][1]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_6 = det*(w[0][2]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_7 = det*(w[0][2]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_8 = det*(w[0][2]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_9 = det*(w[0][2]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_6 = det*(w[0][3]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_7 = det*(w[0][3]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_8 = det*(w[0][3]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_9 = det*(w[0][3]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_6 = det*(w[0][4]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_7 = det*(w[0][4]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_8 = det*(w[0][4]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_9 = det*(w[0][4]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_6 = det*(w[0][5]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_7 = det*(w[0][5]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_8 = det*(w[0][5]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_9 = det*(w[0][5]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_0 = det*(w[0][6]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_1 = det*(w[0][6]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_2 = det*(w[0][6]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_3 = det*(w[0][6]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_4 = det*(w[0][6]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_5 = det*(w[0][6]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_6 = det*(w[0][6]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_7 = det*(w[0][6]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_8 = det*(w[0][6]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_9 = det*(w[0][6]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_0 = det*(w[0][7]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_1 = det*(w[0][7]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_2 = det*(w[0][7]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_3 = det*(w[0][7]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_4 = det*(w[0][7]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_5 = det*(w[0][7]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_6 = det*(w[0][7]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_7 = det*(w[0][7]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_8 = det*(w[0][7]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_9 = det*(w[0][7]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_0 = det*(w[0][8]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_1 = det*(w[0][8]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_2 = det*(w[0][8]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_3 = det*(w[0][8]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_4 = det*(w[0][8]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_5 = det*(w[0][8]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_6 = det*(w[0][8]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_7 = det*(w[0][8]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_8 = det*(w[0][8]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_9 = det*(w[0][8]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_0 = det*(w[0][9]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_1 = det*(w[0][9]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_2 = det*(w[0][9]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_3 = det*(w[0][9]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_4 = det*(w[0][9]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_5 = det*(w[0][9]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_6 = det*(w[0][9]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_7 = det*(w[0][9]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_8 = det*(w[0][9]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_9 = det*(w[0][9]*w[1][9]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[73] = -0.00474837662337685*G0_0_0_0_0 + 0.000493100649350667*G0_0_0_0_1 - 0.000264813311688325*G0_0_0_0_2 + 0.00542410714285736*G0_0_0_0_3 + 0.000739650974026009*G0_0_0_0_4 - 0.00682122564935092*G0_0_0_0_5 + 0.00378043831168846*G0_0_0_0_6 - 0.00139711850649359*G0_0_0_0_7 + 0.0018080357142858*G0_0_0_0_8 + 0.000986201298701326*G0_0_0_0_9 + 0.000493100649350667*G0_0_0_1_0 + 0.0126927759740264*G0_0_0_1_1 + 0.00253855519480528*G0_0_0_1_2 + 0.0196418425324682*G0_0_0_1_3 - 0.0119165990259744*G0_0_0_1_4 - 0.002218952922078*G0_0_0_1_5 - 0.000493100649350664*G0_0_0_1_6 - 0.00353388798701312*G0_0_0_1_7 + 0.00953327922077957*G0_0_0_1_8 + 0.00641030844155867*G0_0_0_1_9 - 0.000264813311688325*G0_0_0_2_0 + 0.00253855519480528*G0_0_0_2_1 + 0.000821834415584434*G0_0_0_2_2 + 0.001479301948052*G0_0_0_2_3 - 0.00246550324675334*G0_0_0_2_4 - 0.002958603896104*G0_0_0_2_5 + 0.00493100649350665*G0_0_0_2_6 - 0.00197240259740267*G0_0_0_2_7 - 0.00221895292207798*G0_0_0_2_8 - 0.00591720779220799*G0_0_0_2_9 + 0.00542410714285736*G0_0_0_3_0 + 0.0196418425324682*G0_0_0_3_1 + 0.001479301948052*G0_0_0_3_2 + 0.171599025974032*G0_0_0_3_3 - 0.00443790584415594*G0_0_0_3_4 - 0.00443790584415599*G0_0_0_3_5 + 0.000739650974025984*G0_0_0_3_6 - 0.017011972402598*G0_0_0_3_7 + 0.0110947646103901*G0_0_0_3_8 + 0.0147930194805201*G0_0_0_3_9 + 0.000739650974026009*G0_0_0_4_0 - 0.0119165990259744*G0_0_0_4_1 - 0.00246550324675334*G0_0_0_4_2 - 0.00443790584415595*G0_0_0_4_3 + 0.050296266233768*G0_0_0_4_4 - 0.00295860389610399*G0_0_0_4_5 + 0.00221895292207802*G0_0_0_4_6 + 0.00221895292207801*G0_0_0_4_7 + 0.00591720779220795*G0_0_0_4_8 + 0.023668831168832*G0_0_0_4_9 - 0.00682122564935092*G0_0_0_5_0 - 0.002218952922078*G0_0_0_5_1 - 0.002958603896104*G0_0_0_5_2 - 0.00443790584415599*G0_0_0_5_3 - 0.002958603896104*G0_0_0_5_4 - 0.054734172077924*G0_0_0_5_5 + 0.00369825487013001*G0_0_0_5_6 - 0.01109476461039*G0_0_0_5_7 + 0.00591720779220801*G0_0_0_5_8 - 0.01479301948052*G0_0_0_5_9 + 0.00378043831168846*G0_0_0_6_0 - 0.000493100649350664*G0_0_0_6_1 + 0.00493100649350665*G0_0_0_6_2 + 0.000739650974025984*G0_0_0_6_3 + 0.00221895292207802*G0_0_0_6_4 + 0.00369825487013001*G0_0_0_6_5 + 0.00443790584415599*G0_0_0_6_6 + 0.00517755681818201*G0_0_0_6_7 + 0.00443790584415597*G0_0_0_6_8 + 0.016272321428572*G0_0_0_6_9 - 0.00139711850649359*G0_0_0_7_0 - 0.00353388798701312*G0_0_0_7_1 - 0.00197240259740267*G0_0_0_7_2 - 0.017011972402598*G0_0_0_7_3 + 0.00221895292207801*G0_0_0_7_4 - 0.01109476461039*G0_0_0_7_5 + 0.00517755681818201*G0_0_0_7_6 - 0.011834415584416*G0_0_0_7_7 - 0.00147930194805202*G0_0_0_7_8 - 0.013313717532468*G0_0_0_7_9 + 0.0018080357142858*G0_0_0_8_0 + 0.00953327922077957*G0_0_0_8_1 - 0.00221895292207798*G0_0_0_8_2 + 0.0110947646103901*G0_0_0_8_3 + 0.00591720779220795*G0_0_0_8_4 + 0.00591720779220801*G0_0_0_8_5 + 0.00443790584415597*G0_0_0_8_6 - 0.00147930194805202*G0_0_0_8_7 - 0.0310653409090919*G0_0_0_8_8 - 0.0310653409090919*G0_0_0_8_9 + 0.000986201298701325*G0_0_0_9_0 + 0.00641030844155867*G0_0_0_9_1 - 0.00591720779220799*G0_0_0_9_2 + 0.0147930194805201*G0_0_0_9_3 + 0.023668831168832*G0_0_0_9_4 - 0.01479301948052*G0_0_0_9_5 + 0.016272321428572*G0_0_0_9_6 - 0.013313717532468*G0_0_0_9_7 - 0.0310653409090919*G0_0_0_9_8 - 0.159764610389616*G0_0_0_9_9 - 0.00374391233766239*G0_0_1_0_0 + 0.00349736201298716*G0_0_1_0_1 + 5.47889610389685e-05*G0_0_1_0_2 + 0.00682122564935092*G0_0_1_0_3 - 0.00156148538961045*G0_0_1_0_4 - 0.00336952110389619*G0_0_1_0_5 + 0.00156148538961043*G0_0_1_0_6 - 0.00443790584415597*G0_0_1_0_7 + 0.00419135551948066*G0_0_1_0_8 + 0.00349736201298716*G0_0_1_1_0 + 0.0871144480519509*G0_0_1_1_1 + 0.00644683441558463*G0_0_1_1_2 + 0.0653358360389632*G0_0_1_1_3 - 0.0295860389610399*G0_0_1_1_4 - 0.00205458603896111*G0_0_1_1_5 - 0.00131493506493512*G0_0_1_1_6 - 0.0172585227272734*G0_0_1_1_7 + 0.0382153003246767*G0_0_1_1_8 + 0.0123275162337667*G0_0_1_1_9 + 5.47889610389685e-05*G0_0_1_2_0 + 0.00644683441558463*G0_0_1_2_1 + 0.000292207792207801*G0_0_1_2_2 + 0.00904017857142887*G0_0_1_2_3 - 0.0035338879870131*G0_0_1_2_4 - 0.000986201298701328*G0_0_1_2_5 + 0.000986201298701326*G0_0_1_2_6 - 0.00254768668831178*G0_0_1_2_7 - 0.00230113636363643*G0_0_1_2_8 - 0.00443790584415598*G0_0_1_2_9 + 0.00682122564935092*G0_0_1_3_0 + 0.0653358360389632*G0_0_1_3_1 + 0.00904017857142887*G0_0_1_3_2 + 0.193048904220786*G0_0_1_3_3 - 0.0428997564935079*G0_0_1_3_4 - 0.005177556818182*G0_0_1_3_5 - 0.0244084821428581*G0_0_1_3_7 + 0.0214498782467542*G0_0_1_3_8 + 0.0118344155844161*G0_0_1_3_9 - 0.00156148538961045*G0_0_1_4_0 - 0.0295860389610399*G0_0_1_4_1 - 0.0035338879870131*G0_0_1_4_2 - 0.0428997564935079*G0_0_1_4_3 + 0.0184912743506499*G0_0_1_4_4 + 0.000739650974026003*G0_0_1_4_5 - 0.000739650974025996*G0_0_1_4_6 + 0.00813616071428603*G0_0_1_4_7 + 0.00295860389610392*G0_0_1_4_8 + 0.0118344155844159*G0_0_1_4_9 - 0.00336952110389619*G0_0_1_5_0 - 0.00205458603896111*G0_0_1_5_1 - 0.000986201298701328*G0_0_1_5_2 - 0.005177556818182*G0_0_1_5_3 + 0.000739650974026003*G0_0_1_5_4 - 0.01109476461039*G0_0_1_5_5 + 0.00295860389610398*G0_0_1_5_6 - 0.00591720779220796*G0_0_1_5_7 + 0.00221895292207798*G0_0_1_5_8 - 0.004437905844156*G0_0_1_5_9 + 0.00156148538961043*G0_0_1_6_0 - 0.00131493506493512*G0_0_1_6_1 + 0.000986201298701326*G0_0_1_6_2 - 0.000739650974025997*G0_0_1_6_4 + 0.00295860389610398*G0_0_1_6_5 - 0.000739650974026003*G0_0_1_6_6 + 0.00369825487012999*G0_0_1_6_7 + 0.00739650974025998*G0_0_1_6_8 + 0.013313717532468*G0_0_1_6_9 - 0.00443790584415597*G0_0_1_7_0 - 0.0172585227272734*G0_0_1_7_1 - 0.00254768668831178*G0_0_1_7_2 - 0.0244084821428581*G0_0_1_7_3 + 0.00813616071428603*G0_0_1_7_4 - 0.00591720779220796*G0_0_1_7_5 + 0.00369825487012999*G0_0_1_7_6 - 0.0140533685064939*G0_0_1_7_7 - 0.00813616071428614*G0_0_1_7_8 - 0.00739650974026005*G0_0_1_7_9 + 0.00419135551948066*G0_0_1_8_0 + 0.0382153003246767*G0_0_1_8_1 - 0.00230113636363643*G0_0_1_8_2 + 0.0214498782467542*G0_0_1_8_3 + 0.00295860389610393*G0_0_1_8_4 + 0.00221895292207798*G0_0_1_8_5 + 0.00739650974025998*G0_0_1_8_6 - 0.00813616071428614*G0_0_1_8_7 - 0.0954149756493538*G0_0_1_8_8 - 0.0428997564935079*G0_0_1_8_9 + 0.0123275162337667*G0_0_1_9_1 - 0.00443790584415598*G0_0_1_9_2 + 0.0118344155844161*G0_0_1_9_3 + 0.0118344155844159*G0_0_1_9_4 - 0.004437905844156*G0_0_1_9_5 + 0.013313717532468*G0_0_1_9_6 - 0.00739650974026005*G0_0_1_9_7 - 0.0428997564935079*G0_0_1_9_8 - 0.04437905844156*G0_0_1_9_9 + 0.000730519480519517*G0_1_0_0_0 + 0.00073051948051951*G0_1_0_0_1 + 0.000346996753246762*G0_1_0_0_2 + 0.00747869318181847*G0_1_0_0_3 + 0.000575284090909115*G0_1_0_0_4 + 0.000575284090909116*G0_1_0_0_5 - 0.00115056818181823*G0_1_0_0_6 + 0.00106838474025978*G0_1_0_0_7 + 0.00180803571428578*G0_1_0_0_8 + 0.005917207792208*G0_1_0_0_9 + 0.00073051948051951*G0_1_0_1_0 + 0.0136972402597407*G0_1_0_1_1 + 0.00258421266233775*G0_1_0_1_2 + 0.0197240259740266*G0_1_0_1_3 - 0.0128206168831173*G0_1_0_1_4 + 0.000575284090909112*G0_1_0_1_5 - 0.00115056818181823*G0_1_0_1_6 - 0.00295860389610401*G0_1_0_1_7 + 0.00986201298701334*G0_1_0_1_8 + 0.005917207792208*G0_1_0_1_9 + 0.000346996753246762*G0_1_0_2_0 + 0.00258421266233775*G0_1_0_2_1 - 0.00109577922077929*G0_1_0_2_2 + 0.002958603896104*G0_1_0_2_3 - 0.00493100649350668*G0_1_0_2_4 - 0.00238331980519489*G0_1_0_2_7 - 0.00164366883116888*G0_1_0_2_8 - 0.00788961038961065*G0_1_0_2_9 + 0.00747869318181847*G0_1_0_3_0 + 0.0197240259740266*G0_1_0_3_1 + 0.002958603896104*G0_1_0_3_2 + 0.193048904220786*G0_1_0_3_3 - 0.00665685876623393*G0_1_0_3_4 - 0.01109476461039*G0_1_0_3_5 + 0.001479301948052*G0_1_0_3_6 - 0.024408482142858*G0_1_0_3_7 + 0.0214498782467541*G0_1_0_3_8 + 0.0310653409090921*G0_1_0_3_9 + 0.000575284090909115*G0_1_0_4_0 - 0.0128206168831173*G0_1_0_4_1 - 0.00493100649350668*G0_1_0_4_2 - 0.00665685876623393*G0_1_0_4_3 + 0.0599117288961059*G0_1_0_4_4 - 0.00369825487012999*G0_1_0_4_5 + 0.00221895292207799*G0_1_0_4_6 + 0.00369825487013001*G0_1_0_4_7 + 0.00295860389610396*G0_1_0_4_8 + 0.0310653409090919*G0_1_0_4_9 + 0.000575284090909116*G0_1_0_5_0 + 0.000575284090909112*G0_1_0_5_1 - 0.01109476461039*G0_1_0_5_3 - 0.00369825487012999*G0_1_0_5_4 + 0.00961546266233799*G0_1_0_5_5 + 0.001479301948052*G0_1_0_5_6 - 0.00147930194805197*G0_1_0_5_7 - 0.00369825487013001*G0_1_0_5_8 - 0.010355113636364*G0_1_0_5_9 - 0.00115056818181823*G0_1_0_6_0 - 0.00115056818181823*G0_1_0_6_1 + 0.001479301948052*G0_1_0_6_3 + 0.00221895292207799*G0_1_0_6_4 + 0.001479301948052*G0_1_0_6_5 + 0.00221895292207789*G0_1_0_6_6 + 0.00517755681818199*G0_1_0_6_7 + 0.00517755681818199*G0_1_0_6_8 + 0.0207102272727279*G0_1_0_6_9 + 0.00106838474025978*G0_1_0_7_0 - 0.00295860389610401*G0_1_0_7_1 - 0.00238331980519489*G0_1_0_7_2 - 0.024408482142858*G0_1_0_7_3 + 0.00369825487013001*G0_1_0_7_4 - 0.00147930194805197*G0_1_0_7_5 + 0.00517755681818199*G0_1_0_7_6 - 0.014053368506494*G0_1_0_7_7 - 0.00887581168831204*G0_1_0_7_8 - 0.028106737012988*G0_1_0_7_9 + 0.00180803571428578*G0_1_0_8_0 + 0.00986201298701334*G0_1_0_8_1 - 0.00164366883116888*G0_1_0_8_2 + 0.0214498782467541*G0_1_0_8_3 + 0.00295860389610396*G0_1_0_8_4 - 0.00369825487013001*G0_1_0_8_5 + 0.00517755681818199*G0_1_0_8_6 - 0.00887581168831204*G0_1_0_8_7 - 0.0214498782467539*G0_1_0_8_8 - 0.0236688311688319*G0_1_0_8_9 + 0.005917207792208*G0_1_0_9_0 + 0.005917207792208*G0_1_0_9_1 - 0.00788961038961065*G0_1_0_9_2 + 0.0310653409090921*G0_1_0_9_3 + 0.0310653409090919*G0_1_0_9_4 - 0.010355113636364*G0_1_0_9_5 + 0.0207102272727279*G0_1_0_9_6 - 0.028106737012988*G0_1_0_9_7 - 0.0236688311688319*G0_1_0_9_8 - 0.13313717532468*G0_1_0_9_9 + 0.00173498376623382*G0_1_1_0_0 + 0.00465706168831187*G0_1_1_0_1 + 0.000730519480519507*G0_1_1_0_2 + 0.00887581168831203*G0_1_1_0_3 - 0.00271205357142867*G0_1_1_0_4 + 0.00032873376623377*G0_1_1_0_5 - 0.000904017857142885*G0_1_1_0_6 + 0.0017258522727273*G0_1_1_0_7 + 0.00419135551948069*G0_1_1_0_8 + 0.00246550324675335*G0_1_1_0_9 + 0.00465706168831187*G0_1_1_1_0 + 0.0925933441558472*G0_1_1_1_1 + 0.00712256493506517*G0_1_1_1_2 + 0.0690340909090932*G0_1_1_1_3 - 0.0320515422077933*G0_1_1_1_4 - 0.00246550324675333*G0_1_1_1_6 - 0.0172585227272734*G0_1_1_1_7 + 0.0443790584415601*G0_1_1_1_8 + 0.01479301948052*G0_1_1_1_9 + 0.000730519480519507*G0_1_1_2_0 + 0.00712256493506516*G0_1_1_2_1 + 0.00052962662337664*G0_1_1_2_2 + 0.0106016639610393*G0_1_1_2_3 - 0.00468445616883132*G0_1_1_2_4 + 0.000575284090909107*G0_1_1_2_5 - 0.000164366883116889*G0_1_1_2_6 - 0.00172585227272735*G0_1_1_2_7 - 0.00147930194805198*G0_1_1_2_8 - 0.00246550324675333*G0_1_1_2_9 + 0.00887581168831203*G0_1_1_3_0 + 0.0690340909090932*G0_1_1_3_1 + 0.0106016639610393*G0_1_1_3_2 + 0.21449878246754*G0_1_1_3_3 - 0.0488169642857159*G0_1_1_3_4 - 0.00961546266233799*G0_1_1_3_5 - 0.0340239448051961*G0_1_1_3_7 + 0.0369825487013002*G0_1_1_3_8 + 0.0236688311688322*G0_1_1_3_9 - 0.00271205357142867*G0_1_1_4_0 - 0.0320515422077933*G0_1_1_4_1 - 0.00468445616883132*G0_1_1_4_2 - 0.0488169642857159*G0_1_1_4_3 + 0.0207102272727279*G0_1_1_4_4 + 0.000739650974026003*G0_1_1_4_5 - 0.000739650974025997*G0_1_1_4_6 + 0.010355113636364*G0_1_1_4_7 - 0.00295860389610406*G0_1_1_4_8 + 0.00591720779220795*G0_1_1_4_9 + 0.00032873376623377*G0_1_1_5_0 + 0.000575284090909107*G0_1_1_5_2 - 0.00961546266233799*G0_1_1_5_3 + 0.000739650974026003*G0_1_1_5_4 + 0.010355113636364*G0_1_1_5_5 - 0.00295860389610398*G0_1_1_5_6 + 0.00961546266233794*G0_1_1_5_7 - 0.00739650974025998*G0_1_1_5_8 + 0.00739650974025995*G0_1_1_5_9 - 0.000904017857142885*G0_1_1_6_0 - 0.00246550324675333*G0_1_1_6_1 - 0.000164366883116889*G0_1_1_6_2 - 0.000739650974025997*G0_1_1_6_4 - 0.00295860389610398*G0_1_1_6_5 + 0.00147930194805198*G0_1_1_6_6 - 0.00221895292207796*G0_1_1_6_7 + 0.00961546266233797*G0_1_1_6_8 + 0.00739650974026*G0_1_1_6_9 + 0.0017258522727273*G0_1_1_7_0 - 0.0172585227272734*G0_1_1_7_1 - 0.00172585227272735*G0_1_1_7_2 - 0.0340239448051961*G0_1_1_7_3 + 0.010355113636364*G0_1_1_7_4 + 0.00961546266233794*G0_1_1_7_5 - 0.00221895292207796*G0_1_1_7_6 + 0.0147930194805199*G0_1_1_7_7 - 0.032544642857144*G0_1_1_7_8 - 0.00295860389610411*G0_1_1_7_9 + 0.00419135551948069*G0_1_1_8_0 + 0.0443790584415601*G0_1_1_8_1 - 0.00147930194805198*G0_1_1_8_2 + 0.0369825487013002*G0_1_1_8_3 - 0.00295860389610406*G0_1_1_8_4 - 0.00739650974025998*G0_1_1_8_5 + 0.00961546266233797*G0_1_1_8_6 - 0.032544642857144*G0_1_1_8_7 - 0.0665685876623398*G0_1_1_8_8 - 0.0384618506493519*G0_1_1_8_9 + 0.00246550324675335*G0_1_1_9_0 + 0.01479301948052*G0_1_1_9_1 - 0.00246550324675333*G0_1_1_9_2 + 0.0236688311688322*G0_1_1_9_3 + 0.00591720779220796*G0_1_1_9_4 + 0.00739650974025995*G0_1_1_9_5 + 0.00739650974026*G0_1_1_9_6 - 0.00295860389610411*G0_1_1_9_7 - 0.0384618506493519*G0_1_1_9_8 - 0.0177516233766241*G0_1_1_9_9; + A[16] = 0.000420048701298719*G0_0_0_0_0 + 0.00021002435064936*G0_0_0_0_1 - 0.00137581168831175*G0_0_0_0_2 + 0.00100446428571433*G0_0_0_0_3 + 0.000127840909090909*G0_0_0_0_4 + 0.00173498376623383*G0_0_0_0_5 - 0.0025385551948053*G0_0_0_0_6 - 6.39204545454578e-05*G0_0_0_0_7 + 0.000566152597402623*G0_0_0_0_8 + 0.00158887987012993*G0_0_0_0_9 + 0.00021002435064936*G0_0_0_1_0 + 0.00273944805194818*G0_0_0_1_1 - 0.000517451298701322*G0_0_0_1_2 + 0.00378956980519495*G0_0_0_1_3 - 0.00171672077922085*G0_0_0_1_4 + 0.000264813311688324*G0_0_0_1_5 - 0.00184456168831176*G0_0_0_1_6 - 0.00107751623376629*G0_0_0_1_7 + 0.00223721590909102*G0_0_0_1_8 + 0.000602678571428597*G0_0_0_1_9 - 0.00137581168831175*G0_0_0_2_0 - 0.000517451298701322*G0_0_0_2_1 - 0.0195413961038968*G0_0_0_2_2 + 0.00465706168831186*G0_0_0_2_3 - 0.00808137175324707*G0_0_0_2_4 + 0.00712256493506521*G0_0_0_2_5 - 0.0154778814935071*G0_0_0_2_6 - 6.39204545454585e-05*G0_0_0_2_7 + 0.000922280844155879*G0_0_0_2_8 - 0.00246550324675333*G0_0_0_2_9 + 0.00100446428571433*G0_0_0_3_0 + 0.00378956980519495*G0_0_0_3_1 + 0.00465706168831186*G0_0_0_3_2 + 0.0113413149350653*G0_0_0_3_3 - 0.00394480519480531*G0_0_0_3_4 - 0.00197240259740267*G0_0_0_3_5 + 0.00567065746753267*G0_0_0_3_6 - 0.00287642045454557*G0_0_0_3_7 + 0.0055062905844158*G0_0_0_3_8 + 0.00394480519480535*G0_0_0_3_9 + 0.000127840909090909*G0_0_0_4_0 - 0.00171672077922085*G0_0_0_4_1 - 0.00808137175324707*G0_0_0_4_2 - 0.00394480519480531*G0_0_0_4_3 + 0.0202171266233773*G0_0_0_4_4 - 0.000246550324675316*G0_0_0_4_5 - 0.00542410714285736*G0_0_0_4_6 - 0.000164366883116882*G0_0_0_4_7 - 0.00262987012987023*G0_0_0_4_8 + 0.00788961038961064*G0_0_0_4_9 + 0.00173498376623383*G0_0_0_5_0 + 0.000264813311688324*G0_0_0_5_1 + 0.00712256493506521*G0_0_0_5_2 - 0.00197240259740267*G0_0_0_5_3 - 0.000246550324675316*G0_0_0_5_4 - 0.00345170454545468*G0_0_0_5_5 + 0.00936891233766271*G0_0_0_5_6 + 0.000328733766233776*G0_0_0_5_7 - 0.000657467532467557*G0_0_0_5_8 - 0.00345170454545465*G0_0_0_5_9 - 0.0025385551948053*G0_0_0_6_0 - 0.00184456168831176*G0_0_0_6_1 - 0.0154778814935071*G0_0_0_6_2 + 0.00567065746753267*G0_0_0_6_3 - 0.00542410714285736*G0_0_0_6_4 + 0.00936891233766271*G0_0_0_6_5 - 0.0537479707792227*G0_0_0_6_6 + 0.000328733766233777*G0_0_0_6_7 + 0.0013149350649351*G0_0_0_6_8 - 0.00394480519480534*G0_0_0_6_9 - 6.39204545454579e-05*G0_0_0_7_0 - 0.00107751623376629*G0_0_0_7_1 - 6.39204545454585e-05*G0_0_0_7_2 - 0.00287642045454557*G0_0_0_7_3 - 0.000164366883116882*G0_0_0_7_4 + 0.000328733766233776*G0_0_0_7_5 + 0.000328733766233777*G0_0_0_7_6 - 0.000164366883116894*G0_0_0_7_7 - 0.00287642045454558*G0_0_0_7_8 - 0.00542410714285734*G0_0_0_7_9 + 0.000566152597402623*G0_0_0_8_0 + 0.00223721590909102*G0_0_0_8_1 + 0.000922280844155879*G0_0_0_8_2 + 0.0055062905844158*G0_0_0_8_3 - 0.00262987012987023*G0_0_0_8_4 - 0.000657467532467557*G0_0_0_8_5 + 0.0013149350649351*G0_0_0_8_6 - 0.00287642045454558*G0_0_0_8_7 + 0.00723214285714318*G0_0_0_8_8 + 0.00345170454545468*G0_0_0_8_9 + 0.00158887987012993*G0_0_0_9_0 + 0.000602678571428597*G0_0_0_9_1 - 0.00246550324675333*G0_0_0_9_2 + 0.00394480519480535*G0_0_0_9_3 + 0.00788961038961064*G0_0_0_9_4 - 0.00345170454545466*G0_0_0_9_5 - 0.00394480519480534*G0_0_0_9_6 - 0.00542410714285734*G0_0_0_9_7 + 0.00345170454545468*G0_0_0_9_8 + 0.00986201298701331*G0_0_0_9_9 - 0.00697646103896127*G0_0_1_0_0 - 0.000447443181818197*G0_0_1_0_1 - 0.0010988230519481*G0_0_1_0_2 + 0.000794439935064967*G0_0_1_0_3 - 0.000164366883116891*G0_0_1_0_4 - 0.00292207792207801*G0_0_1_0_5 - 0.000949675324675366*G0_0_1_0_6 - 0.00225547889610397*G0_0_1_0_7 + 0.000675730519480542*G0_0_1_0_8 - 0.00038352272727274*G0_0_1_0_9 - 0.000447443181818197*G0_0_1_1_0 - 0.000566152597402622*G0_0_1_1_2 + 0.00223721590909099*G0_0_1_1_3 - 0.000858360389610422*G0_0_1_1_4 + 0.00101359577922081*G0_0_1_1_5 + 0.000693993506493529*G0_0_1_1_7 - 0.00223721590909098*G0_0_1_1_8 + 0.000164366883116887*G0_0_1_1_9 - 0.0010988230519481*G0_0_1_2_0 - 0.000566152597402622*G0_0_1_2_1 - 0.0164671266233772*G0_0_1_2_2 + 0.00373478084415598*G0_0_1_2_3 - 0.00599025974025998*G0_0_1_2_4 + 0.00366172889610405*G0_0_1_2_5 - 0.011131290584416*G0_0_1_2_6 + 0.000273944805194815*G0_0_1_2_7 + 0.000219155844155853*G0_0_1_2_8 - 0.00109577922077926*G0_0_1_2_9 + 0.000794439935064967*G0_0_1_3_0 + 0.00223721590909099*G0_0_1_3_1 + 0.00373478084415598*G0_0_1_3_2 + 0.0110125811688316*G0_0_1_3_3 - 0.00328733766233776*G0_0_1_3_4 - 0.00304078733766244*G0_0_1_3_5 + 0.000657467532467572*G0_0_1_3_6 - 0.00172585227272734*G0_0_1_3_7 + 0.00172585227272735*G0_0_1_3_8 + 0.00295860389610402*G0_0_1_3_9 - 0.000164366883116891*G0_0_1_4_0 - 0.000858360389610422*G0_0_1_4_1 - 0.00599025974025998*G0_0_1_4_2 - 0.00328733766233776*G0_0_1_4_3 + 0.0134780844155849*G0_0_1_4_4 + 0.00115056818181823*G0_0_1_4_5 - 0.0018080357142858*G0_0_1_4_6 - 0.000493100649350664*G0_0_1_4_7 + 0.000986201298701325*G0_0_1_4_9 - 0.00292207792207801*G0_0_1_5_0 + 0.00101359577922081*G0_0_1_5_1 + 0.00366172889610405*G0_0_1_5_2 - 0.00304078733766244*G0_0_1_5_3 + 0.00115056818181823*G0_0_1_5_4 + 0.0241619318181826*G0_0_1_5_5 + 0.0120809659090913*G0_0_1_5_6 + 0.00254768668831178*G0_0_1_5_7 - 0.00238331980519488*G0_0_1_5_8 + 0.00591720779220798*G0_0_1_5_9 - 0.000949675324675366*G0_0_1_6_0 - 0.011131290584416*G0_0_1_6_2 + 0.000657467532467572*G0_0_1_6_3 - 0.00180803571428581*G0_0_1_6_4 + 0.0120809659090913*G0_0_1_6_5 - 0.000164366883116887*G0_0_1_6_7 - 0.000657467532467554*G0_0_1_6_8 + 0.00197240259740265*G0_0_1_6_9 - 0.00225547889610397*G0_0_1_7_0 + 0.000693993506493529*G0_0_1_7_1 + 0.000273944805194815*G0_0_1_7_2 - 0.00172585227272734*G0_0_1_7_3 - 0.000493100649350664*G0_0_1_7_4 + 0.00254768668831178*G0_0_1_7_5 - 0.000164366883116887*G0_0_1_7_6 + 0.0121631493506498*G0_0_1_7_7 + 0.00254768668831176*G0_0_1_7_8 + 0.00147930194805199*G0_0_1_7_9 + 0.000675730519480541*G0_0_1_8_0 - 0.00223721590909098*G0_0_1_8_1 + 0.000219155844155853*G0_0_1_8_2 + 0.00172585227272735*G0_0_1_8_3 - 0.00238331980519488*G0_0_1_8_5 - 0.000657467532467554*G0_0_1_8_6 + 0.00254768668831176*G0_0_1_8_7 - 0.0144642857142862*G0_0_1_8_8 - 0.000493100649350647*G0_0_1_8_9 - 0.00038352272727274*G0_0_1_9_0 + 0.000164366883116887*G0_0_1_9_1 - 0.00109577922077926*G0_0_1_9_2 + 0.00295860389610402*G0_0_1_9_3 + 0.000986201298701326*G0_0_1_9_4 + 0.00591720779220798*G0_0_1_9_5 + 0.00197240259740265*G0_0_1_9_6 + 0.00147930194805199*G0_0_1_9_7 - 0.000493100649350647*G0_0_1_9_8 - 0.0295860389610399*G0_0_1_9_9; + A[37] = A[73] + 0.00447443181818191*G0_0_1_0_0 - 0.00276684253246765*G0_0_1_0_1 + 0.000292207792207794*G0_0_1_0_2 + 0.000657467532467555*G0_0_1_0_3 + 0.00213676948051957*G0_0_1_0_4 + 0.0039448051948053*G0_0_1_0_5 - 0.00271205357142865*G0_0_1_0_6 + 0.00550629058441574*G0_0_1_0_7 - 0.00238331980519488*G0_0_1_0_8 + 0.00591720779220799*G0_0_1_0_9 - 0.00276684253246765*G0_0_1_1_0 - 0.0734172077922102*G0_0_1_1_1 - 0.00386262175324688*G0_0_1_1_2 - 0.0456118100649366*G0_0_1_1_3 + 0.0167654220779226*G0_0_1_1_4 + 0.00262987012987022*G0_0_1_1_5 + 0.000164366883116889*G0_0_1_1_6 + 0.0142999188311694*G0_0_1_1_7 - 0.0283532873376634*G0_0_1_1_8 - 0.00641030844155869*G0_0_1_1_9 + 0.000292207792207794*G0_0_1_2_0 - 0.00386262175324688*G0_0_1_2_1 - 0.00138798701298709*G0_0_1_2_2 - 0.00608157467532487*G0_0_1_2_3 - 0.00139711850649358*G0_0_1_2_4 + 0.000986201298701346*G0_0_1_2_5 - 0.00098620129870136*G0_0_1_2_6 + 0.000164366883116894*G0_0_1_2_7 + 0.000657467532467548*G0_0_1_2_8 - 0.00345170454545467*G0_0_1_2_9 + 0.000657467532467555*G0_0_1_3_0 - 0.0456118100649366*G0_0_1_3_1 - 0.00608157467532487*G0_0_1_3_2 + 0.036242897727274*G0_0_1_3_4 - 0.00591720779220799*G0_0_1_3_5 + 0.00147930194805202*G0_0_1_3_6 + 0.019230925324676*G0_0_1_3_9 + 0.00213676948051957*G0_0_1_4_0 + 0.0167654220779226*G0_0_1_4_1 - 0.00139711850649358*G0_0_1_4_2 + 0.036242897727274*G0_0_1_4_3 + 0.041420454545456*G0_0_1_4_4 - 0.00443790584415599*G0_0_1_4_5 + 0.00295860389610399*G0_0_1_4_6 - 0.00443790584415602*G0_0_1_4_7 + 0.019230925324676*G0_0_1_4_9 + 0.0039448051948053*G0_0_1_5_0 + 0.00262987012987022*G0_0_1_5_1 + 0.000986201298701346*G0_0_1_5_2 - 0.00591720779220799*G0_0_1_5_3 - 0.00443790584415599*G0_0_1_5_4 + 0.0207102272727279*G0_0_1_5_5 - 0.00147930194805198*G0_0_1_5_6 + 0.00443790584415599*G0_0_1_5_7 - 0.00591720779220799*G0_0_1_5_8 - 0.00591720779220796*G0_0_1_5_9 - 0.00271205357142865*G0_0_1_6_0 + 0.000164366883116889*G0_0_1_6_1 - 0.00098620129870136*G0_0_1_6_2 + 0.00147930194805202*G0_0_1_6_3 + 0.00295860389610399*G0_0_1_6_4 - 0.00147930194805198*G0_0_1_6_5 + 0.00295860389610389*G0_0_1_6_6 + 0.001479301948052*G0_0_1_6_7 - 0.002218952922078*G0_0_1_6_8 + 0.00739650974025997*G0_0_1_6_9 + 0.00550629058441574*G0_0_1_7_0 + 0.0142999188311694*G0_0_1_7_1 + 0.000164366883116894*G0_0_1_7_2 - 0.00443790584415602*G0_0_1_7_4 + 0.00443790584415599*G0_0_1_7_5 + 0.001479301948052*G0_0_1_7_6 - 0.000739650974025898*G0_0_1_7_8 - 0.020710227272728*G0_0_1_7_9 - 0.00238331980519488*G0_0_1_8_0 - 0.0283532873376634*G0_0_1_8_1 + 0.00065746753246755*G0_0_1_8_2 - 0.00591720779220799*G0_0_1_8_5 - 0.002218952922078*G0_0_1_8_6 - 0.000739650974025896*G0_0_1_8_7 + 0.0739650974025999*G0_0_1_8_8 + 0.019230925324676*G0_0_1_8_9 + 0.00591720779220799*G0_0_1_9_0 - 0.00641030844155869*G0_0_1_9_1 - 0.00345170454545467*G0_0_1_9_2 + 0.019230925324676*G0_0_1_9_3 + 0.019230925324676*G0_0_1_9_4 - 0.00591720779220796*G0_0_1_9_5 + 0.00739650974025997*G0_0_1_9_6 - 0.0207102272727279*G0_0_1_9_7 + 0.019230925324676*G0_0_1_9_8 - 0.0887581168831197*G0_0_1_9_9 - 0.00447443181818191*G0_1_0_0_0 + 0.00276684253246765*G0_1_0_0_1 - 0.000292207792207794*G0_1_0_0_2 - 0.000657467532467555*G0_1_0_0_3 - 0.00213676948051957*G0_1_0_0_4 - 0.0039448051948053*G0_1_0_0_5 + 0.00271205357142865*G0_1_0_0_6 - 0.00550629058441574*G0_1_0_0_7 + 0.00238331980519488*G0_1_0_0_8 - 0.00591720779220799*G0_1_0_0_9 + 0.00276684253246765*G0_1_0_1_0 + 0.0734172077922102*G0_1_0_1_1 + 0.00386262175324688*G0_1_0_1_2 + 0.0456118100649365*G0_1_0_1_3 - 0.0167654220779226*G0_1_0_1_4 - 0.00262987012987022*G0_1_0_1_5 - 0.000164366883116889*G0_1_0_1_6 - 0.0142999188311694*G0_1_0_1_7 + 0.0283532873376634*G0_1_0_1_8 + 0.00641030844155869*G0_1_0_1_9 - 0.000292207792207794*G0_1_0_2_0 + 0.00386262175324688*G0_1_0_2_1 + 0.00138798701298709*G0_1_0_2_2 + 0.00608157467532487*G0_1_0_2_3 + 0.00139711850649358*G0_1_0_2_4 - 0.000986201298701346*G0_1_0_2_5 + 0.00098620129870136*G0_1_0_2_6 - 0.000164366883116893*G0_1_0_2_7 - 0.000657467532467549*G0_1_0_2_8 + 0.00345170454545467*G0_1_0_2_9 - 0.000657467532467555*G0_1_0_3_0 + 0.0456118100649366*G0_1_0_3_1 + 0.00608157467532487*G0_1_0_3_2 - 0.036242897727274*G0_1_0_3_4 + 0.00591720779220799*G0_1_0_3_5 - 0.00147930194805202*G0_1_0_3_6 - 0.019230925324676*G0_1_0_3_9 - 0.00213676948051957*G0_1_0_4_0 - 0.0167654220779226*G0_1_0_4_1 + 0.00139711850649358*G0_1_0_4_2 - 0.036242897727274*G0_1_0_4_3 - 0.041420454545456*G0_1_0_4_4 + 0.00443790584415599*G0_1_0_4_5 - 0.00295860389610399*G0_1_0_4_6 + 0.00443790584415602*G0_1_0_4_7 - 0.019230925324676*G0_1_0_4_9 - 0.0039448051948053*G0_1_0_5_0 - 0.00262987012987022*G0_1_0_5_1 - 0.000986201298701346*G0_1_0_5_2 + 0.00591720779220799*G0_1_0_5_3 + 0.00443790584415599*G0_1_0_5_4 - 0.0207102272727279*G0_1_0_5_5 + 0.00147930194805198*G0_1_0_5_6 - 0.00443790584415599*G0_1_0_5_7 + 0.00591720779220799*G0_1_0_5_8 + 0.00591720779220796*G0_1_0_5_9 + 0.00271205357142865*G0_1_0_6_0 - 0.000164366883116888*G0_1_0_6_1 + 0.00098620129870136*G0_1_0_6_2 - 0.00147930194805202*G0_1_0_6_3 - 0.00295860389610399*G0_1_0_6_4 + 0.00147930194805198*G0_1_0_6_5 - 0.00295860389610389*G0_1_0_6_6 - 0.001479301948052*G0_1_0_6_7 + 0.002218952922078*G0_1_0_6_8 - 0.00739650974025998*G0_1_0_6_9 - 0.00550629058441574*G0_1_0_7_0 - 0.0142999188311694*G0_1_0_7_1 - 0.000164366883116894*G0_1_0_7_2 + 0.00443790584415602*G0_1_0_7_4 - 0.00443790584415599*G0_1_0_7_5 - 0.001479301948052*G0_1_0_7_6 + 0.0007396509740259*G0_1_0_7_8 + 0.020710227272728*G0_1_0_7_9 + 0.00238331980519488*G0_1_0_8_0 + 0.0283532873376634*G0_1_0_8_1 - 0.000657467532467551*G0_1_0_8_2 + 0.00591720779220799*G0_1_0_8_5 + 0.002218952922078*G0_1_0_8_6 + 0.0007396509740259*G0_1_0_8_7 - 0.0739650974025999*G0_1_0_8_8 - 0.019230925324676*G0_1_0_8_9 - 0.00591720779220799*G0_1_0_9_0 + 0.00641030844155869*G0_1_0_9_1 + 0.00345170454545467*G0_1_0_9_2 - 0.019230925324676*G0_1_0_9_3 - 0.019230925324676*G0_1_0_9_4 + 0.00591720779220796*G0_1_0_9_5 - 0.00739650974025998*G0_1_0_9_6 + 0.0207102272727279*G0_1_0_9_7 - 0.019230925324676*G0_1_0_9_8 + 0.0887581168831197*G0_1_0_9_9; + A[11] = 0.0028909632034633*G0_0_0_0_0 + 0.00448626893939412*G0_0_0_0_1 + 0.000851934523809556*G0_0_0_0_2 + 0.00503145292207812*G0_0_0_0_3 - 0.0019267451298702*G0_0_0_0_4 + 0.00104707792207795*G0_0_0_0_5 - 0.000675730519480538*G0_0_0_0_6 - 0.00264204545454556*G0_0_0_0_7 + 0.0067025162337665*G0_0_0_0_8 + 0.00224025974025983*G0_0_0_0_9 + 0.00448626893939412*G0_0_0_1_0 + 0.0703057359307383*G0_0_0_1_1 + 0.00448626893939409*G0_0_0_1_2 + 0.0427049512987028*G0_0_0_1_3 - 0.0194500811688318*G0_0_0_1_4 - 0.000776176948051977*G0_0_0_1_5 - 0.000776176948051973*G0_0_0_1_6 - 0.0194500811688319*G0_0_0_1_7 + 0.0427049512987029*G0_0_0_1_8 + 0.00760957792207822*G0_0_0_1_9 + 0.000851934523809556*G0_0_0_2_0 + 0.00448626893939409*G0_0_0_2_1 + 0.00289096320346331*G0_0_0_2_2 + 0.00670251623376646*G0_0_0_2_3 - 0.00264204545454554*G0_0_0_2_4 - 0.000675730519480547*G0_0_0_2_5 + 0.00104707792207797*G0_0_0_2_6 - 0.0019267451298702*G0_0_0_2_7 + 0.0050314529220781*G0_0_0_2_8 + 0.00224025974025982*G0_0_0_2_9 + 0.00503145292207812*G0_0_0_3_0 + 0.0427049512987028*G0_0_0_3_1 + 0.00670251623376646*G0_0_0_3_2 + 0.0845576298701329*G0_0_0_3_3 - 0.0325537743506505*G0_0_0_3_4 - 0.00336038961038973*G0_0_0_3_5 - 0.00371651785714299*G0_0_0_3_6 - 0.0211394074675333*G0_0_0_3_7 + 0.0422788149350665*G0_0_0_3_8 + 0.0194500811688319*G0_0_0_3_9 - 0.0019267451298702*G0_0_0_4_0 - 0.0194500811688318*G0_0_0_4_1 - 0.00264204545454554*G0_0_0_4_2 - 0.0325537743506505*G0_0_0_4_3 + 0.0184821428571435*G0_0_0_4_4 - 0.000264813311688324*G0_0_0_4_5 + 0.00398133116883131*G0_0_0_4_6 + 0.00880275974026006*G0_0_0_4_7 - 0.0211394074675332*G0_0_0_4_8 - 0.00619115259740284*G0_0_0_4_9 + 0.00104707792207795*G0_0_0_5_0 - 0.000776176948051977*G0_0_0_5_1 - 0.000675730519480547*G0_0_0_5_2 - 0.00336038961038973*G0_0_0_5_3 - 0.000264813311688324*G0_0_0_5_4 + 0.013222402597403*G0_0_0_5_5 - 0.00280336850649361*G0_0_0_5_6 + 0.0039813311688313*G0_0_0_5_7 - 0.00371651785714299*G0_0_0_5_8 + 0.000712256493506513*G0_0_0_5_9 - 0.000675730519480538*G0_0_0_6_0 - 0.000776176948051973*G0_0_0_6_1 + 0.00104707792207797*G0_0_0_6_2 - 0.00371651785714299*G0_0_0_6_3 + 0.00398133116883131*G0_0_0_6_4 - 0.00280336850649361*G0_0_0_6_5 + 0.0132224025974031*G0_0_0_6_6 - 0.000264813311688318*G0_0_0_6_7 - 0.00336038961038972*G0_0_0_6_8 + 0.000712256493506514*G0_0_0_6_9 - 0.00264204545454556*G0_0_0_7_0 - 0.0194500811688319*G0_0_0_7_1 - 0.0019267451298702*G0_0_0_7_2 - 0.0211394074675333*G0_0_0_7_3 + 0.00880275974026006*G0_0_0_7_4 + 0.0039813311688313*G0_0_0_7_5 - 0.000264813311688318*G0_0_0_7_6 + 0.0184821428571436*G0_0_0_7_7 - 0.0325537743506506*G0_0_0_7_8 - 0.00619115259740283*G0_0_0_7_9 + 0.0067025162337665*G0_0_0_8_0 + 0.0427049512987029*G0_0_0_8_1 + 0.0050314529220781*G0_0_0_8_2 + 0.0422788149350665*G0_0_0_8_3 - 0.0211394074675332*G0_0_0_8_4 - 0.00371651785714299*G0_0_0_8_5 - 0.00336038961038972*G0_0_0_8_6 - 0.0325537743506506*G0_0_0_8_7 + 0.084557629870133*G0_0_0_8_8 + 0.0194500811688319*G0_0_0_8_9 + 0.00224025974025983*G0_0_0_9_0 + 0.00760957792207822*G0_0_0_9_1 + 0.00224025974025982*G0_0_0_9_2 + 0.0194500811688319*G0_0_0_9_3 - 0.00619115259740284*G0_0_0_9_4 + 0.000712256493506514*G0_0_0_9_5 + 0.000712256493506514*G0_0_0_9_6 - 0.00619115259740283*G0_0_0_9_7 + 0.0194500811688319*G0_0_0_9_8 + 0.0282711038961049*G0_0_0_9_9; + A[82] = -0.00697646103896126*G0_0_1_0_0 - 0.00109882305194809*G0_0_1_0_1 - 0.0004474431818182*G0_0_1_0_2 - 0.000164366883116884*G0_0_1_0_3 + 0.00079443993506496*G0_0_1_0_4 - 0.00225547889610396*G0_0_1_0_5 + 0.00067573051948053*G0_0_1_0_6 - 0.00292207792207801*G0_0_1_0_7 - 0.000949675324675361*G0_0_1_0_8 - 0.00038352272727274*G0_0_1_0_9 - 0.00109882305194809*G0_0_1_1_0 - 0.0164671266233772*G0_0_1_1_1 - 0.000566152597402618*G0_0_1_1_2 - 0.00599025974025992*G0_0_1_1_3 + 0.00373478084415596*G0_0_1_1_4 + 0.000273944805194816*G0_0_1_1_5 + 0.000219155844155845*G0_0_1_1_6 + 0.00366172889610403*G0_0_1_1_7 - 0.011131290584416*G0_0_1_1_8 - 0.00109577922077926*G0_0_1_1_9 - 0.0004474431818182*G0_0_1_2_0 - 0.000566152597402618*G0_0_1_2_1 - 0.000858360389610404*G0_0_1_2_3 + 0.00223721590909096*G0_0_1_2_4 + 0.000693993506493547*G0_0_1_2_5 - 0.00223721590909102*G0_0_1_2_6 + 0.00101359577922081*G0_0_1_2_7 + 0.000164366883116883*G0_0_1_2_9 - 0.000164366883116884*G0_0_1_3_0 - 0.00599025974025992*G0_0_1_3_1 - 0.000858360389610404*G0_0_1_3_2 + 0.0134780844155849*G0_0_1_3_3 - 0.00328733766233776*G0_0_1_3_4 - 0.00049310064935067*G0_0_1_3_5 + 0.00115056818181821*G0_0_1_3_7 - 0.00180803571428578*G0_0_1_3_8 + 0.000986201298701347*G0_0_1_3_9 + 0.00079443993506496*G0_0_1_4_0 + 0.00373478084415596*G0_0_1_4_1 + 0.00223721590909096*G0_0_1_4_2 - 0.00328733766233776*G0_0_1_4_3 + 0.0110125811688315*G0_0_1_4_4 - 0.00172585227272732*G0_0_1_4_5 + 0.00172585227272731*G0_0_1_4_6 - 0.00304078733766244*G0_0_1_4_7 + 0.000657467532467557*G0_0_1_4_8 + 0.00295860389610399*G0_0_1_4_9 - 0.00225547889610396*G0_0_1_5_0 + 0.000273944805194816*G0_0_1_5_1 + 0.000693993506493547*G0_0_1_5_2 - 0.00049310064935067*G0_0_1_5_3 - 0.00172585227272732*G0_0_1_5_4 + 0.0121631493506497*G0_0_1_5_5 + 0.0025476866883118*G0_0_1_5_6 + 0.00254768668831177*G0_0_1_5_7 - 0.000164366883116892*G0_0_1_5_8 + 0.001479301948052*G0_0_1_5_9 + 0.00067573051948053*G0_0_1_6_0 + 0.000219155844155845*G0_0_1_6_1 - 0.00223721590909102*G0_0_1_6_2 + 0.00172585227272731*G0_0_1_6_4 + 0.0025476866883118*G0_0_1_6_5 - 0.0144642857142863*G0_0_1_6_6 - 0.00238331980519488*G0_0_1_6_7 - 0.000657467532467551*G0_0_1_6_8 - 0.000493100649350675*G0_0_1_6_9 - 0.00292207792207801*G0_0_1_7_0 + 0.00366172889610403*G0_0_1_7_1 + 0.00101359577922081*G0_0_1_7_2 + 0.00115056818181821*G0_0_1_7_3 - 0.00304078733766244*G0_0_1_7_4 + 0.00254768668831178*G0_0_1_7_5 - 0.00238331980519488*G0_0_1_7_6 + 0.0241619318181827*G0_0_1_7_7 + 0.0120809659090913*G0_0_1_7_8 + 0.00591720779220799*G0_0_1_7_9 - 0.000949675324675361*G0_0_1_8_0 - 0.011131290584416*G0_0_1_8_1 - 0.00180803571428578*G0_0_1_8_3 + 0.000657467532467556*G0_0_1_8_4 - 0.000164366883116892*G0_0_1_8_5 - 0.000657467532467551*G0_0_1_8_6 + 0.0120809659090913*G0_0_1_8_7 + 0.00197240259740266*G0_0_1_8_9 - 0.00038352272727274*G0_0_1_9_0 - 0.00109577922077926*G0_0_1_9_1 + 0.000164366883116883*G0_0_1_9_2 + 0.000986201298701347*G0_0_1_9_3 + 0.00295860389610399*G0_0_1_9_4 + 0.001479301948052*G0_0_1_9_5 - 0.000493100649350675*G0_0_1_9_6 + 0.00591720779220799*G0_0_1_9_7 + 0.00197240259740266*G0_0_1_9_8 - 0.02958603896104*G0_0_1_9_9 + 0.000420048701298708*G0_1_1_0_0 - 0.00137581168831174*G0_1_1_0_1 + 0.000210024350649355*G0_1_1_0_2 + 0.000127840909090916*G0_1_1_0_3 + 0.00100446428571432*G0_1_1_0_4 - 6.39204545454591e-05*G0_1_1_0_5 + 0.000566152597402615*G0_1_1_0_6 + 0.00173498376623382*G0_1_1_0_7 - 0.00253855519480529*G0_1_1_0_8 + 0.00158887987012993*G0_1_1_0_9 - 0.00137581168831174*G0_1_1_1_0 - 0.0195413961038968*G0_1_1_1_1 - 0.000517451298701316*G0_1_1_1_2 - 0.00808137175324702*G0_1_1_1_3 + 0.00465706168831184*G0_1_1_1_4 - 6.39204545454578e-05*G0_1_1_1_5 + 0.000922280844155873*G0_1_1_1_6 + 0.00712256493506519*G0_1_1_1_7 - 0.0154778814935071*G0_1_1_1_8 - 0.00246550324675334*G0_1_1_1_9 + 0.000210024350649355*G0_1_1_2_0 - 0.000517451298701316*G0_1_1_2_1 + 0.0027394480519481*G0_1_1_2_2 - 0.00171672077922083*G0_1_1_2_3 + 0.00378956980519492*G0_1_1_2_4 - 0.00107751623376626*G0_1_1_2_5 + 0.00223721590909095*G0_1_1_2_6 + 0.00026481331168832*G0_1_1_2_7 - 0.00184456168831175*G0_1_1_2_8 + 0.00060267857142859*G0_1_1_2_9 + 0.000127840909090916*G0_1_1_3_0 - 0.00808137175324702*G0_1_1_3_1 - 0.00171672077922083*G0_1_1_3_2 + 0.0202171266233774*G0_1_1_3_3 - 0.00394480519480534*G0_1_1_3_4 - 0.000164366883116891*G0_1_1_3_5 - 0.00262987012987021*G0_1_1_3_6 - 0.000246550324675338*G0_1_1_3_7 - 0.00542410714285731*G0_1_1_3_8 + 0.00788961038961068*G0_1_1_3_9 + 0.00100446428571432*G0_1_1_4_0 + 0.00465706168831184*G0_1_1_4_1 + 0.00378956980519492*G0_1_1_4_2 - 0.00394480519480534*G0_1_1_4_3 + 0.0113413149350654*G0_1_1_4_4 - 0.00287642045454555*G0_1_1_4_5 + 0.00550629058441576*G0_1_1_4_6 - 0.00197240259740266*G0_1_1_4_7 + 0.00567065746753265*G0_1_1_4_8 + 0.00394480519480533*G0_1_1_4_9 - 6.39204545454591e-05*G0_1_1_5_0 - 6.39204545454577e-05*G0_1_1_5_1 - 0.00107751623376626*G0_1_1_5_2 - 0.000164366883116892*G0_1_1_5_3 - 0.00287642045454555*G0_1_1_5_4 - 0.000164366883116907*G0_1_1_5_5 - 0.00287642045454553*G0_1_1_5_6 + 0.000328733766233771*G0_1_1_5_7 + 0.00032873376623378*G0_1_1_5_8 - 0.00542410714285733*G0_1_1_5_9 + 0.000566152597402616*G0_1_1_6_0 + 0.000922280844155873*G0_1_1_6_1 + 0.00223721590909095*G0_1_1_6_2 - 0.00262987012987021*G0_1_1_6_3 + 0.00550629058441576*G0_1_1_6_4 - 0.00287642045454553*G0_1_1_6_5 + 0.00723214285714303*G0_1_1_6_6 - 0.000657467532467549*G0_1_1_6_7 + 0.0013149350649351*G0_1_1_6_8 + 0.00345170454545465*G0_1_1_6_9 + 0.00173498376623382*G0_1_1_7_0 + 0.00712256493506519*G0_1_1_7_1 + 0.00026481331168832*G0_1_1_7_2 - 0.000246550324675337*G0_1_1_7_3 - 0.00197240259740266*G0_1_1_7_4 + 0.000328733766233771*G0_1_1_7_5 - 0.00065746753246755*G0_1_1_7_6 - 0.00345170454545469*G0_1_1_7_7 + 0.00936891233766267*G0_1_1_7_8 - 0.00345170454545467*G0_1_1_7_9 - 0.00253855519480529*G0_1_1_8_0 - 0.0154778814935071*G0_1_1_8_1 - 0.00184456168831175*G0_1_1_8_2 - 0.00542410714285731*G0_1_1_8_3 + 0.00567065746753265*G0_1_1_8_4 + 0.00032873376623378*G0_1_1_8_5 + 0.0013149350649351*G0_1_1_8_6 + 0.00936891233766267*G0_1_1_8_7 - 0.0537479707792226*G0_1_1_8_8 - 0.00394480519480531*G0_1_1_8_9 + 0.00158887987012993*G0_1_1_9_0 - 0.00246550324675333*G0_1_1_9_1 + 0.00060267857142859*G0_1_1_9_2 + 0.00788961038961068*G0_1_1_9_3 + 0.00394480519480533*G0_1_1_9_4 - 0.00542410714285733*G0_1_1_9_5 + 0.00345170454545465*G0_1_1_9_6 - 0.00345170454545467*G0_1_1_9_7 - 0.00394480519480531*G0_1_1_9_8 + 0.00986201298701335*G0_1_1_9_9; + A[32] = -A[82] - 0.00787134740259767*G0_0_1_0_0 - 0.00106534090909095*G0_0_1_0_1 - 0.00393567370129886*G0_0_1_0_2 - 0.00111404220779224*G0_0_1_0_3 - 0.000757913961038997*G0_0_1_0_4 + 0.000173498376623403*G0_0_1_0_5 - 0.00544237012987035*G0_0_1_0_6 - 0.00241984577922085*G0_0_1_0_7 - 0.00124188311688316*G0_0_1_0_8 - 0.00378043831168845*G0_0_1_0_9 - 0.00106534090909095*G0_0_1_1_0 - 0.0154017857142862*G0_0_1_1_1 - 0.0030742694805196*G0_0_1_1_2 - 0.00246550324675332*G0_0_1_1_3 + 0.00167106331168835*G0_0_1_1_4 + 0.00146103896103902*G0_0_1_1_5 - 0.00346996753246767*G0_0_1_1_6 + 0.00249289772727282*G0_0_1_1_7 - 0.0090401785714289*G0_0_1_1_8 + 0.000767045454545471*G0_0_1_1_9 - 0.00393567370129886*G0_0_1_2_0 - 0.0030742694805196*G0_0_1_2_1 - 0.0525974025974044*G0_0_1_2_2 + 0.0100994318181822*G0_0_1_2_3 - 0.0196783685064942*G0_0_1_2_4 + 0.0165827922077928*G0_0_1_2_5 - 0.0389458198051962*G0_0_1_2_6 + 0.00170758928571434*G0_0_1_2_7 + 0.000858360389610415*G0_0_1_2_8 - 0.00476663961038978*G0_0_1_2_9 - 0.00111404220779224*G0_0_1_3_0 - 0.00246550324675331*G0_0_1_3_1 + 0.0100994318181822*G0_0_1_3_2 - 0.0259699675324684*G0_0_1_3_3 + 0.00460227272727291*G0_0_1_3_4 - 0.00246550324675334*G0_0_1_3_5 + 0.0142999188311693*G0_0_1_3_6 + 0.00723214285714309*G0_0_1_3_7 - 0.00854707792207822*G0_0_1_3_8 - 0.0167654220779226*G0_0_1_3_9 - 0.000757913961038997*G0_0_1_4_0 + 0.00167106331168835*G0_0_1_4_1 - 0.0196783685064942*G0_0_1_4_2 + 0.00460227272727291*G0_0_1_4_3 + 0.0134780844155848*G0_0_1_4_4 + 0.00616375811688336*G0_0_1_4_5 - 0.0204636769480527*G0_0_1_4_6 - 0.00336952110389622*G0_0_1_4_7 + 0.00131493506493511*G0_0_1_4_8 + 0.00197240259740266*G0_0_1_4_9 + 0.000173498376623402*G0_0_1_5_0 + 0.00146103896103902*G0_0_1_5_1 + 0.0165827922077928*G0_0_1_5_2 - 0.00246550324675334*G0_0_1_5_3 + 0.00616375811688336*G0_0_1_5_4 + 0.0082183441558444*G0_0_1_5_5 + 0.0316406250000011*G0_0_1_5_6 + 0.00172585227272733*G0_0_1_5_7 - 0.00049310064935067*G0_0_1_5_8 + 0.0123275162337667*G0_0_1_5_9 - 0.00544237012987035*G0_0_1_6_0 - 0.00346996753246767*G0_0_1_6_1 - 0.0389458198051962*G0_0_1_6_2 + 0.0142999188311693*G0_0_1_6_3 - 0.0204636769480527*G0_0_1_6_4 + 0.0316406250000011*G0_0_1_6_5 - 0.10568790584416*G0_0_1_6_6 - 0.00123275162337667*G0_0_1_6_7 + 0.00197240259740267*G0_0_1_6_8 - 0.0142999188311693*G0_0_1_6_9 - 0.00241984577922085*G0_0_1_7_0 + 0.00249289772727282*G0_0_1_7_1 + 0.00170758928571434*G0_0_1_7_2 + 0.00723214285714309*G0_0_1_7_3 - 0.00336952110389622*G0_0_1_7_4 + 0.00172585227272733*G0_0_1_7_5 - 0.00123275162337667*G0_0_1_7_6 + 0.0238331980519489*G0_0_1_7_7 + 0.0134780844155849*G0_0_1_7_8 + 0.0138068181818186*G0_0_1_7_9 - 0.00124188311688316*G0_0_1_8_0 - 0.0090401785714289*G0_0_1_8_1 + 0.000858360389610415*G0_0_1_8_2 - 0.00854707792207822*G0_0_1_8_3 + 0.00131493506493511*G0_0_1_8_4 - 0.00049310064935067*G0_0_1_8_5 + 0.00197240259740267*G0_0_1_8_6 + 0.0134780844155849*G0_0_1_8_7 + 0.00361607142857154*G0_0_1_8_8 - 0.00493100649350667*G0_0_1_8_9 - 0.00378043831168845*G0_0_1_9_0 + 0.000767045454545471*G0_0_1_9_1 - 0.00476663961038978*G0_0_1_9_2 - 0.0167654220779226*G0_0_1_9_3 + 0.00197240259740266*G0_0_1_9_4 + 0.0123275162337667*G0_0_1_9_5 - 0.0142999188311693*G0_0_1_9_6 + 0.0138068181818186*G0_0_1_9_7 - 0.00493100649350667*G0_0_1_9_8 - 0.0867857142857172*G0_0_1_9_9; + A[45] = A[73] + 0.00648336038961069*G0_0_0_0_0 + 0.000237418831168842*G0_0_0_0_1 + 0.00492187500000021*G0_0_0_0_2 - 0.00813616071428603*G0_0_0_0_3 + 0.00813616071428603*G0_0_0_0_4 + 0.00854707792207824*G0_0_0_0_5 + 0.000410917207792207*G0_0_0_0_6 + 0.00172585227272737*G0_0_0_0_7 - 0.00271205357142869*G0_0_0_0_8 + 0.00147930194805201*G0_0_0_0_9 + 0.000237418831168842*G0_0_0_1_0 - 0.0121631493506497*G0_0_0_1_1 + 0.00458400974025992*G0_0_0_1_2 - 0.0243262987012995*G0_0_0_1_3 + 0.0225182629870138*G0_0_0_1_4 + 0.000493100649350663*G0_0_0_1_5 - 0.000986201298701323*G0_0_0_1_6 + 0.00410917207792223*G0_0_0_1_7 - 0.00969764610389646*G0_0_0_1_8 - 0.008875811688312*G0_0_0_1_9 + 0.00492187500000021*G0_0_0_2_0 + 0.00458400974025992*G0_0_0_2_1 + 0.0917715097402629*G0_0_0_2_2 - 0.0335308441558453*G0_0_0_2_3 + 0.0714995941558467*G0_0_0_2_4 - 0.0142999188311694*G0_0_0_2_5 + 0.0394480519480535*G0_0_0_2_6 + 0.00197240259740267*G0_0_0_2_7 - 0.000246550324675346*G0_0_0_2_8 + 0.020710227272728*G0_0_0_2_9 - 0.00813616071428603*G0_0_0_3_0 - 0.0243262987012995*G0_0_0_3_1 - 0.0335308441558453*G0_0_0_3_2 - 0.150888798701304*G0_0_0_3_3 - 0.04437905844156*G0_0_0_3_4 + 0.01479301948052*G0_0_0_3_5 - 0.00369825487013006*G0_0_0_3_6 + 0.017751623376624*G0_0_0_3_7 - 0.0118344155844161*G0_0_0_3_8 - 0.00887581168831213*G0_0_0_3_9 + 0.00813616071428603*G0_0_0_4_0 + 0.0225182629870138*G0_0_0_4_1 + 0.0714995941558467*G0_0_0_4_2 - 0.04437905844156*G0_0_0_4_3 + 0.164202516233772*G0_0_0_4_4 - 0.031065340909092*G0_0_0_4_5 + 0.0347635957792221*G0_0_0_4_6 - 0.011834415584416*G0_0_0_4_7 - 0.00591720779220795*G0_0_0_4_8 + 0.00854707792207824*G0_0_0_5_0 + 0.000493100649350664*G0_0_0_5_1 - 0.0142999188311694*G0_0_0_5_2 + 0.01479301948052*G0_0_0_5_3 - 0.031065340909092*G0_0_0_5_4 + 0.069527191558444*G0_0_0_5_5 - 0.036242897727274*G0_0_0_5_6 + 0.020710227272728*G0_0_0_5_7 - 0.00813616071428602*G0_0_0_5_8 + 0.011834415584416*G0_0_0_5_9 + 0.000410917207792207*G0_0_0_6_0 - 0.000986201298701324*G0_0_0_6_1 + 0.0394480519480535*G0_0_0_6_2 - 0.00369825487013006*G0_0_0_6_3 + 0.0347635957792221*G0_0_0_6_4 - 0.036242897727274*G0_0_0_6_5 - 0.0710064935064956*G0_0_0_6_6 - 0.012574066558442*G0_0_0_6_7 + 0.005177556818182*G0_0_0_6_8 - 0.0547341720779239*G0_0_0_6_9 + 0.00172585227272737*G0_0_0_7_0 + 0.00410917207792223*G0_0_0_7_1 + 0.00197240259740267*G0_0_0_7_2 + 0.017751623376624*G0_0_0_7_3 - 0.011834415584416*G0_0_0_7_4 + 0.020710227272728*G0_0_0_7_5 - 0.012574066558442*G0_0_0_7_6 + 0.02218952922078*G0_0_0_7_7 - 0.00147930194805199*G0_0_0_7_8 + 0.020710227272728*G0_0_0_7_9 - 0.00271205357142869*G0_0_0_8_0 - 0.00969764610389646*G0_0_0_8_1 - 0.000246550324675346*G0_0_0_8_2 - 0.0118344155844161*G0_0_0_8_3 - 0.00591720779220795*G0_0_0_8_4 - 0.00813616071428602*G0_0_0_8_5 + 0.005177556818182*G0_0_0_8_6 - 0.00147930194805199*G0_0_0_8_7 + 0.0325446428571439*G0_0_0_8_8 + 0.0384618506493519*G0_0_0_8_9 + 0.00147930194805201*G0_0_0_9_0 - 0.008875811688312*G0_0_0_9_1 + 0.020710227272728*G0_0_0_9_2 - 0.00887581168831213*G0_0_0_9_3 + 0.011834415584416*G0_0_0_9_5 - 0.0547341720779239*G0_0_0_9_6 + 0.020710227272728*G0_0_0_9_7 + 0.0384618506493519*G0_0_0_9_8 + 0.142012987012992*G0_0_0_9_9 - 0.0034425730519482*G0_0_1_0_1 + 0.00344257305194819*G0_0_1_0_2 - 0.00838271103896137*G0_0_1_0_3 + 0.00838271103896138*G0_0_1_0_4 - 0.00106838474025985*G0_0_1_0_5 + 0.00262987012987025*G0_0_1_0_6 + 0.0010683847402597*G0_0_1_0_7 - 0.0026298701298702*G0_0_1_0_8 - 0.0034425730519482*G0_0_1_1_0 - 0.0868222402597431*G0_0_1_1_1 - 0.0688697240259763*G0_0_1_1_3 + 0.0386262175324688*G0_0_1_1_4 - 0.000493100649350679*G0_0_1_1_5 - 0.000986201298701315*G0_0_1_1_6 + 0.016272321428572*G0_0_1_1_7 - 0.0372290990259754*G0_0_1_1_8 - 0.0167654220779227*G0_0_1_1_9 + 0.00344257305194819*G0_0_1_2_0 + 0.0868222402597433*G0_0_1_2_2 - 0.0386262175324689*G0_0_1_2_3 + 0.0688697240259765*G0_0_1_2_4 - 0.0162723214285721*G0_0_1_2_5 + 0.0372290990259754*G0_0_1_2_6 + 0.000493100649350664*G0_0_1_2_7 + 0.000986201298701318*G0_0_1_2_8 + 0.0167654220779226*G0_0_1_2_9 - 0.00838271103896137*G0_0_1_3_0 - 0.0688697240259763*G0_0_1_3_1 - 0.0386262175324689*G0_0_1_3_2 - 0.174557629870136*G0_0_1_3_3 + 0.013313717532468*G0_0_1_3_5 + 0.00295860389610393*G0_0_1_3_6 + 0.0251481331168841*G0_0_1_3_7 - 0.0221895292207802*G0_0_1_3_8 + 0.00838271103896138*G0_0_1_4_0 + 0.0386262175324688*G0_0_1_4_1 + 0.0688697240259765*G0_0_1_4_2 + 0.174557629870136*G0_0_1_4_4 - 0.025148133116884*G0_0_1_4_5 + 0.0221895292207802*G0_0_1_4_6 - 0.013313717532468*G0_0_1_4_7 - 0.00295860389610393*G0_0_1_4_8 - 0.00106838474025985*G0_0_1_5_0 - 0.000493100649350679*G0_0_1_5_1 - 0.0162723214285721*G0_0_1_5_2 + 0.013313717532468*G0_0_1_5_3 - 0.025148133116884*G0_0_1_5_4 - 0.00295860389610399*G0_0_1_5_5 - 0.01109476461039*G0_0_1_5_6 + 0.00147930194805203*G0_0_1_5_8 - 0.00295860389610401*G0_0_1_5_9 + 0.00262987012987025*G0_0_1_6_0 - 0.000986201298701315*G0_0_1_6_1 + 0.0372290990259754*G0_0_1_6_2 + 0.00295860389610393*G0_0_1_6_3 + 0.0221895292207802*G0_0_1_6_4 - 0.01109476461039*G0_0_1_6_5 - 0.0946753246753277*G0_0_1_6_6 - 0.00147930194805199*G0_0_1_6_7 - 0.0562134740259758*G0_0_1_6_9 + 0.0010683847402597*G0_0_1_7_0 + 0.016272321428572*G0_0_1_7_1 + 0.000493100649350664*G0_0_1_7_2 + 0.0251481331168841*G0_0_1_7_3 - 0.013313717532468*G0_0_1_7_4 - 0.00147930194805199*G0_0_1_7_6 + 0.00295860389610376*G0_0_1_7_7 + 0.0110947646103902*G0_0_1_7_8 + 0.00295860389610402*G0_0_1_7_9 - 0.0026298701298702*G0_0_1_8_0 - 0.0372290990259754*G0_0_1_8_1 + 0.000986201298701319*G0_0_1_8_2 - 0.0221895292207802*G0_0_1_8_3 - 0.00295860389610394*G0_0_1_8_4 + 0.00147930194805203*G0_0_1_8_5 + 0.0110947646103902*G0_0_1_8_7 + 0.0946753246753278*G0_0_1_8_8 + 0.0562134740259759*G0_0_1_8_9 - 0.0167654220779227*G0_0_1_9_1 + 0.0167654220779226*G0_0_1_9_2 - 0.00295860389610401*G0_0_1_9_5 - 0.0562134740259758*G0_0_1_9_6 + 0.00295860389610402*G0_0_1_9_7 + 0.0562134740259759*G0_0_1_9_8 - 0.000383522727272742*G0_1_0_0_1 + 0.000383522727272753*G0_1_0_0_2 - 0.00690340909090935*G0_1_0_0_3 + 0.00690340909090936*G0_1_0_0_4 + 0.000493100649350664*G0_1_0_0_5 + 0.00295860389610399*G0_1_0_0_6 - 0.000493100649350661*G0_1_0_0_7 - 0.002958603896104*G0_1_0_0_8 - 0.000383522727272742*G0_1_0_1_0 - 0.0147930194805199*G0_1_0_1_1 - 0.0246550324675333*G0_1_0_1_3 + 0.0157792207792213*G0_1_0_1_4 - 0.00295860389610399*G0_1_0_1_5 - 0.000493100649350657*G0_1_0_1_6 + 0.002958603896104*G0_1_0_1_7 - 0.00986201298701332*G0_1_0_1_8 - 0.0138068181818187*G0_1_0_1_9 + 0.000383522727272753*G0_1_0_2_0 + 0.0147930194805201*G0_1_0_2_2 - 0.0157792207792213*G0_1_0_2_3 + 0.0246550324675334*G0_1_0_2_4 - 0.00295860389610403*G0_1_0_2_5 + 0.00986201298701338*G0_1_0_2_6 + 0.002958603896104*G0_1_0_2_7 + 0.000493100649350658*G0_1_0_2_8 + 0.0138068181818186*G0_1_0_2_9 - 0.00690340909090935*G0_1_0_3_0 - 0.0246550324675333*G0_1_0_3_1 - 0.0157792207792213*G0_1_0_3_2 - 0.13313717532468*G0_1_0_3_3 + 0.01479301948052*G0_1_0_3_5 + 0.00147930194805197*G0_1_0_3_6 + 0.020710227272728*G0_1_0_3_7 - 0.0192309253246761*G0_1_0_3_8 + 0.00690340909090936*G0_1_0_4_0 + 0.0157792207792213*G0_1_0_4_1 + 0.0246550324675334*G0_1_0_4_2 + 0.13313717532468*G0_1_0_4_4 - 0.020710227272728*G0_1_0_4_5 + 0.0192309253246761*G0_1_0_4_6 - 0.01479301948052*G0_1_0_4_7 - 0.00147930194805198*G0_1_0_4_8 + 0.000493100649350666*G0_1_0_5_0 - 0.00295860389610399*G0_1_0_5_1 - 0.00295860389610403*G0_1_0_5_2 + 0.01479301948052*G0_1_0_5_3 - 0.020710227272728*G0_1_0_5_4 - 0.0236688311688318*G0_1_0_5_5 - 0.010355113636364*G0_1_0_5_6 + 0.00887581168831197*G0_1_0_5_8 - 0.0177516233766239*G0_1_0_5_9 + 0.00295860389610399*G0_1_0_6_0 - 0.000493100649350657*G0_1_0_6_1 + 0.00986201298701338*G0_1_0_6_2 + 0.00147930194805197*G0_1_0_6_3 + 0.0192309253246761*G0_1_0_6_4 - 0.010355113636364*G0_1_0_6_5 - 0.0236688311688318*G0_1_0_6_6 - 0.00887581168831202*G0_1_0_6_7 - 0.0443790584415599*G0_1_0_6_9 - 0.00049310064935066*G0_1_0_7_0 + 0.002958603896104*G0_1_0_7_1 + 0.002958603896104*G0_1_0_7_2 + 0.020710227272728*G0_1_0_7_3 - 0.01479301948052*G0_1_0_7_4 - 0.00887581168831202*G0_1_0_7_6 + 0.023668831168832*G0_1_0_7_7 + 0.010355113636364*G0_1_0_7_8 + 0.0177516233766241*G0_1_0_7_9 - 0.002958603896104*G0_1_0_8_0 - 0.00986201298701332*G0_1_0_8_1 + 0.000493100649350657*G0_1_0_8_2 - 0.0192309253246761*G0_1_0_8_3 - 0.00147930194805198*G0_1_0_8_4 + 0.00887581168831197*G0_1_0_8_5 + 0.010355113636364*G0_1_0_8_7 + 0.023668831168832*G0_1_0_8_8 + 0.0443790584415599*G0_1_0_8_9 - 0.0138068181818187*G0_1_0_9_1 + 0.0138068181818186*G0_1_0_9_2 - 0.0177516233766239*G0_1_0_9_5 - 0.0443790584415599*G0_1_0_9_6 + 0.017751623376624*G0_1_0_9_7 + 0.0443790584415599*G0_1_0_9_8 - 0.00648336038961072*G0_1_1_0_0 - 0.0049218750000002*G0_1_1_0_1 - 0.000237418831168839*G0_1_1_0_2 - 0.00813616071428603*G0_1_1_0_3 + 0.00813616071428604*G0_1_1_0_4 - 0.00172585227272739*G0_1_1_0_5 + 0.00271205357142869*G0_1_1_0_6 - 0.00854707792207827*G0_1_1_0_7 - 0.000410917207792209*G0_1_1_0_8 - 0.00147930194805203*G0_1_1_0_9 - 0.0049218750000002*G0_1_1_1_0 - 0.0917715097402627*G0_1_1_1_1 - 0.00458400974025988*G0_1_1_1_2 - 0.0714995941558465*G0_1_1_1_3 + 0.0335308441558453*G0_1_1_1_4 - 0.00197240259740267*G0_1_1_1_5 + 0.000246550324675343*G0_1_1_1_6 + 0.0142999188311694*G0_1_1_1_7 - 0.0394480519480534*G0_1_1_1_8 - 0.020710227272728*G0_1_1_1_9 - 0.000237418831168839*G0_1_1_2_0 - 0.00458400974025988*G0_1_1_2_1 + 0.0121631493506498*G0_1_1_2_2 - 0.0225182629870138*G0_1_1_2_3 + 0.0243262987012996*G0_1_1_2_4 - 0.00410917207792224*G0_1_1_2_5 + 0.00969764610389646*G0_1_1_2_6 - 0.000493100649350659*G0_1_1_2_7 + 0.000986201298701321*G0_1_1_2_8 + 0.00887581168831197*G0_1_1_2_9 - 0.00813616071428603*G0_1_1_3_0 - 0.0714995941558465*G0_1_1_3_1 - 0.0225182629870138*G0_1_1_3_2 - 0.164202516233772*G0_1_1_3_3 + 0.0443790584415599*G0_1_1_3_4 + 0.011834415584416*G0_1_1_3_5 + 0.00591720779220797*G0_1_1_3_6 + 0.0310653409090921*G0_1_1_3_7 - 0.0347635957792222*G0_1_1_3_8 + 0.00813616071428604*G0_1_1_4_0 + 0.0335308441558453*G0_1_1_4_1 + 0.0243262987012996*G0_1_1_4_2 + 0.0443790584415599*G0_1_1_4_3 + 0.150888798701304*G0_1_1_4_4 - 0.017751623376624*G0_1_1_4_5 + 0.0118344155844161*G0_1_1_4_6 - 0.01479301948052*G0_1_1_4_7 + 0.00369825487013005*G0_1_1_4_8 + 0.00887581168831216*G0_1_1_4_9 - 0.00172585227272739*G0_1_1_5_0 - 0.00197240259740267*G0_1_1_5_1 - 0.00410917207792224*G0_1_1_5_2 + 0.011834415584416*G0_1_1_5_3 - 0.017751623376624*G0_1_1_5_4 - 0.02218952922078*G0_1_1_5_5 + 0.00147930194805201*G0_1_1_5_6 - 0.020710227272728*G0_1_1_5_7 + 0.012574066558442*G0_1_1_5_8 - 0.0207102272727279*G0_1_1_5_9 + 0.00271205357142869*G0_1_1_6_0 + 0.000246550324675343*G0_1_1_6_1 + 0.00969764610389646*G0_1_1_6_2 + 0.00591720779220797*G0_1_1_6_3 + 0.0118344155844161*G0_1_1_6_4 + 0.00147930194805201*G0_1_1_6_5 - 0.0325446428571439*G0_1_1_6_6 + 0.00813616071428597*G0_1_1_6_7 - 0.005177556818182*G0_1_1_6_8 - 0.0384618506493519*G0_1_1_6_9 - 0.00854707792207827*G0_1_1_7_0 + 0.0142999188311694*G0_1_1_7_1 - 0.000493100649350659*G0_1_1_7_2 + 0.0310653409090921*G0_1_1_7_3 - 0.01479301948052*G0_1_1_7_4 - 0.020710227272728*G0_1_1_7_5 + 0.00813616071428597*G0_1_1_7_6 - 0.0695271915584441*G0_1_1_7_7 + 0.0362428977272741*G0_1_1_7_8 - 0.011834415584416*G0_1_1_7_9 - 0.000410917207792209*G0_1_1_8_0 - 0.0394480519480534*G0_1_1_8_1 + 0.00098620129870132*G0_1_1_8_2 - 0.0347635957792222*G0_1_1_8_3 + 0.00369825487013005*G0_1_1_8_4 + 0.012574066558442*G0_1_1_8_5 - 0.005177556818182*G0_1_1_8_6 + 0.0362428977272741*G0_1_1_8_7 + 0.0710064935064958*G0_1_1_8_8 + 0.0547341720779239*G0_1_1_8_9 - 0.00147930194805203*G0_1_1_9_0 - 0.020710227272728*G0_1_1_9_1 + 0.00887581168831197*G0_1_1_9_2 + 0.00887581168831215*G0_1_1_9_4 - 0.0207102272727279*G0_1_1_9_5 - 0.0384618506493519*G0_1_1_9_6 - 0.011834415584416*G0_1_1_9_7 + 0.0547341720779239*G0_1_1_9_8 - 0.142012987012992*G0_1_1_9_9; + A[99] = 0.0184090909090916*G0_0_0_0_0 - 0.0013149350649351*G0_0_0_0_1 + 0.00493100649350665*G0_0_0_0_2 + 0.0315584415584427*G0_0_0_0_3 + 0.0167654220779227*G0_0_0_0_4 - 0.00690340909090925*G0_0_0_0_5 - 0.0128206168831172*G0_0_0_0_6 - 0.00690340909090933*G0_0_0_0_7 + 0.0108482142857147*G0_0_0_0_8 + 0.0177516233766241*G0_0_0_0_9 - 0.0013149350649351*G0_0_0_1_0 + 0.0184090909090915*G0_0_0_1_1 + 0.00493100649350666*G0_0_0_1_2 - 0.00690340909090929*G0_0_0_1_3 - 0.0128206168831173*G0_0_0_1_4 + 0.0315584415584426*G0_0_0_1_5 + 0.0167654220779227*G0_0_0_1_6 + 0.0108482142857146*G0_0_0_1_7 - 0.0069034090909093*G0_0_0_1_8 + 0.017751623376624*G0_0_0_1_9 + 0.00493100649350665*G0_0_0_2_0 + 0.00493100649350666*G0_0_0_2_1 + 0.0197240259740266*G0_0_0_2_2 - 0.00394480519480536*G0_0_0_2_3 - 0.00986201298701337*G0_0_0_2_4 - 0.00394480519480526*G0_0_0_2_5 - 0.00986201298701334*G0_0_0_2_6 + 0.00493100649350667*G0_0_0_2_7 + 0.00493100649350665*G0_0_0_2_8 - 0.0118344155844159*G0_0_0_2_9 + 0.0315584415584427*G0_0_0_3_0 - 0.00690340909090929*G0_0_0_3_1 - 0.00394480519480536*G0_0_0_3_2 + 0.603555194805216*G0_0_0_3_3 - 0.00887581168831158*G0_0_0_3_4 - 0.0887581168831198*G0_0_0_3_5 - 0.0621306818181838*G0_0_0_3_6 - 0.106509740259744*G0_0_0_3_7 + 0.13313717532468*G0_0_0_3_8 + 0.159764610389616*G0_0_0_3_9 + 0.0167654220779227*G0_0_0_4_0 - 0.0128206168831173*G0_0_0_4_1 - 0.00986201298701336*G0_0_0_4_2 - 0.00887581168831159*G0_0_0_4_3 + 0.497045454545472*G0_0_0_4_4 - 0.062130681818184*G0_0_0_4_5 + 0.124261363636368*G0_0_0_4_6 - 0.026627435064936*G0_0_0_4_7 - 0.026627435064936*G0_0_0_4_8 + 0.159764610389616*G0_0_0_4_9 - 0.00690340909090924*G0_0_0_5_0 + 0.0315584415584426*G0_0_0_5_1 - 0.00394480519480526*G0_0_0_5_2 - 0.0887581168831198*G0_0_0_5_3 - 0.062130681818184*G0_0_0_5_4 + 0.603555194805215*G0_0_0_5_5 - 0.00887581168831208*G0_0_0_5_6 + 0.13313717532468*G0_0_0_5_7 - 0.106509740259744*G0_0_0_5_8 + 0.159764610389616*G0_0_0_5_9 - 0.0128206168831172*G0_0_0_6_0 + 0.0167654220779227*G0_0_0_6_1 - 0.00986201298701334*G0_0_0_6_2 - 0.0621306818181838*G0_0_0_6_3 + 0.124261363636368*G0_0_0_6_4 - 0.00887581168831208*G0_0_0_6_5 + 0.497045454545471*G0_0_0_6_6 - 0.0266274350649359*G0_0_0_6_7 - 0.0266274350649359*G0_0_0_6_8 + 0.159764610389616*G0_0_0_6_9 - 0.00690340909090933*G0_0_0_7_0 + 0.0108482142857146*G0_0_0_7_1 + 0.00493100649350667*G0_0_0_7_2 - 0.106509740259744*G0_0_0_7_3 - 0.026627435064936*G0_0_0_7_4 + 0.13313717532468*G0_0_0_7_5 - 0.0266274350649359*G0_0_0_7_6 + 0.08875811688312*G0_0_0_7_7 - 0.071006493506496*G0_0_0_7_8 + 0.0108482142857147*G0_0_0_8_0 - 0.0069034090909093*G0_0_0_8_1 + 0.00493100649350665*G0_0_0_8_2 + 0.13313717532468*G0_0_0_8_3 - 0.026627435064936*G0_0_0_8_4 - 0.106509740259744*G0_0_0_8_5 - 0.0266274350649359*G0_0_0_8_6 - 0.071006493506496*G0_0_0_8_7 + 0.08875811688312*G0_0_0_8_8 + 0.0177516233766241*G0_0_0_9_0 + 0.017751623376624*G0_0_0_9_1 - 0.0118344155844159*G0_0_0_9_2 + 0.159764610389616*G0_0_0_9_3 + 0.159764610389616*G0_0_0_9_4 + 0.159764610389616*G0_0_0_9_5 + 0.159764610389616*G0_0_0_9_6 + 0.639058441558463*G0_0_0_9_9 + 0.00854707792207827*G0_0_1_0_0 - 0.000657467532467551*G0_0_1_0_1 - 0.000657467532467553*G0_0_1_0_2 + 0.0216964285714294*G0_0_1_0_3 + 0.0216964285714294*G0_0_1_0_4 - 0.00197240259740263*G0_0_1_0_5 + 0.000986201298701317*G0_0_1_0_6 - 0.00197240259740265*G0_0_1_0_7 + 0.000986201298701331*G0_0_1_0_8 + 0.023668831168832*G0_0_1_0_9 - 0.00065746753246755*G0_0_1_1_0 + 0.0098620129870133*G0_0_1_1_1 + 0.00558847402597422*G0_0_1_1_2 - 0.00493100649350667*G0_0_1_1_3 - 0.0138068181818186*G0_0_1_1_4 + 0.00986201298701333*G0_0_1_1_5 - 0.00493100649350668*G0_0_1_1_6 + 0.00986201298701333*G0_0_1_1_7 - 0.00493100649350665*G0_0_1_1_8 - 0.00591720779220795*G0_0_1_1_9 - 0.000657467532467554*G0_0_1_2_0 + 0.00558847402597422*G0_0_1_2_1 + 0.00986201298701332*G0_0_1_2_2 - 0.0138068181818187*G0_0_1_2_3 - 0.00493100649350668*G0_0_1_2_4 + 0.00986201298701334*G0_0_1_2_5 - 0.00493100649350667*G0_0_1_2_6 + 0.00986201298701334*G0_0_1_2_7 - 0.00493100649350666*G0_0_1_2_8 - 0.00591720779220797*G0_0_1_2_9 + 0.0216964285714294*G0_0_1_3_0 - 0.00493100649350667*G0_0_1_3_1 - 0.0138068181818187*G0_0_1_3_2 + 0.505921266233784*G0_0_1_3_3 + 0.0266274350649363*G0_0_1_3_4 - 0.04437905844156*G0_0_1_3_5 + 0.00887581168831202*G0_0_1_3_6 - 0.071006493506496*G0_0_1_3_7 + 0.062130681818184*G0_0_1_3_8 + 0.159764610389616*G0_0_1_3_9 + 0.0216964285714294*G0_0_1_4_0 - 0.0138068181818186*G0_0_1_4_1 - 0.00493100649350669*G0_0_1_4_2 + 0.0266274350649363*G0_0_1_4_3 + 0.505921266233784*G0_0_1_4_4 - 0.0710064935064959*G0_0_1_4_5 + 0.062130681818184*G0_0_1_4_6 - 0.04437905844156*G0_0_1_4_7 + 0.00887581168831198*G0_0_1_4_8 + 0.159764610389616*G0_0_1_4_9 - 0.00197240259740263*G0_0_1_5_0 + 0.00986201298701333*G0_0_1_5_1 + 0.00986201298701334*G0_0_1_5_2 - 0.04437905844156*G0_0_1_5_3 - 0.0710064935064959*G0_0_1_5_4 + 0.0976339285714319*G0_0_1_5_5 - 0.035503246753248*G0_0_1_5_6 + 0.071006493506496*G0_0_1_5_7 - 0.035503246753248*G0_0_1_5_8 + 0.000986201298701317*G0_0_1_6_0 - 0.00493100649350668*G0_0_1_6_1 - 0.00493100649350667*G0_0_1_6_2 + 0.00887581168831202*G0_0_1_6_3 + 0.062130681818184*G0_0_1_6_4 - 0.035503246753248*G0_0_1_6_5 - 0.00887581168831214*G0_0_1_6_6 - 0.035503246753248*G0_0_1_6_7 + 0.017751623376624*G0_0_1_6_8 - 0.00197240259740265*G0_0_1_7_0 + 0.00986201298701333*G0_0_1_7_1 + 0.00986201298701334*G0_0_1_7_2 - 0.071006493506496*G0_0_1_7_3 - 0.04437905844156*G0_0_1_7_4 + 0.071006493506496*G0_0_1_7_5 - 0.035503246753248*G0_0_1_7_6 + 0.0976339285714322*G0_0_1_7_7 - 0.0355032467532481*G0_0_1_7_8 + 0.00098620129870133*G0_0_1_8_0 - 0.00493100649350664*G0_0_1_8_1 - 0.00493100649350666*G0_0_1_8_2 + 0.062130681818184*G0_0_1_8_3 + 0.00887581168831198*G0_0_1_8_4 - 0.035503246753248*G0_0_1_8_5 + 0.017751623376624*G0_0_1_8_6 - 0.0355032467532481*G0_0_1_8_7 - 0.00887581168831189*G0_0_1_8_8 + 0.023668831168832*G0_0_1_9_0 - 0.00591720779220796*G0_0_1_9_1 - 0.00591720779220797*G0_0_1_9_2 + 0.159764610389616*G0_0_1_9_3 + 0.159764610389616*G0_0_1_9_4 + 0.319529220779232*G0_0_1_9_9 + 0.00854707792207827*G0_1_0_0_0 - 0.000657467532467551*G0_1_0_0_1 - 0.000657467532467553*G0_1_0_0_2 + 0.0216964285714294*G0_1_0_0_3 + 0.0216964285714294*G0_1_0_0_4 - 0.00197240259740263*G0_1_0_0_5 + 0.000986201298701317*G0_1_0_0_6 - 0.00197240259740265*G0_1_0_0_7 + 0.000986201298701331*G0_1_0_0_8 + 0.023668831168832*G0_1_0_0_9 - 0.00065746753246755*G0_1_0_1_0 + 0.0098620129870133*G0_1_0_1_1 + 0.00558847402597422*G0_1_0_1_2 - 0.00493100649350667*G0_1_0_1_3 - 0.0138068181818186*G0_1_0_1_4 + 0.00986201298701333*G0_1_0_1_5 - 0.00493100649350668*G0_1_0_1_6 + 0.00986201298701333*G0_1_0_1_7 - 0.00493100649350665*G0_1_0_1_8 - 0.00591720779220796*G0_1_0_1_9 - 0.000657467532467554*G0_1_0_2_0 + 0.00558847402597422*G0_1_0_2_1 + 0.00986201298701332*G0_1_0_2_2 - 0.0138068181818187*G0_1_0_2_3 - 0.00493100649350668*G0_1_0_2_4 + 0.00986201298701334*G0_1_0_2_5 - 0.00493100649350667*G0_1_0_2_6 + 0.00986201298701334*G0_1_0_2_7 - 0.00493100649350666*G0_1_0_2_8 - 0.00591720779220796*G0_1_0_2_9 + 0.0216964285714294*G0_1_0_3_0 - 0.00493100649350667*G0_1_0_3_1 - 0.0138068181818187*G0_1_0_3_2 + 0.505921266233784*G0_1_0_3_3 + 0.0266274350649363*G0_1_0_3_4 - 0.04437905844156*G0_1_0_3_5 + 0.00887581168831202*G0_1_0_3_6 - 0.071006493506496*G0_1_0_3_7 + 0.062130681818184*G0_1_0_3_8 + 0.159764610389616*G0_1_0_3_9 + 0.0216964285714294*G0_1_0_4_0 - 0.0138068181818186*G0_1_0_4_1 - 0.00493100649350669*G0_1_0_4_2 + 0.0266274350649363*G0_1_0_4_3 + 0.505921266233784*G0_1_0_4_4 - 0.0710064935064959*G0_1_0_4_5 + 0.062130681818184*G0_1_0_4_6 - 0.04437905844156*G0_1_0_4_7 + 0.00887581168831198*G0_1_0_4_8 + 0.159764610389616*G0_1_0_4_9 - 0.00197240259740263*G0_1_0_5_0 + 0.00986201298701333*G0_1_0_5_1 + 0.00986201298701334*G0_1_0_5_2 - 0.04437905844156*G0_1_0_5_3 - 0.0710064935064959*G0_1_0_5_4 + 0.0976339285714319*G0_1_0_5_5 - 0.035503246753248*G0_1_0_5_6 + 0.071006493506496*G0_1_0_5_7 - 0.035503246753248*G0_1_0_5_8 + 0.000986201298701317*G0_1_0_6_0 - 0.00493100649350668*G0_1_0_6_1 - 0.00493100649350667*G0_1_0_6_2 + 0.00887581168831202*G0_1_0_6_3 + 0.062130681818184*G0_1_0_6_4 - 0.035503246753248*G0_1_0_6_5 - 0.00887581168831214*G0_1_0_6_6 - 0.035503246753248*G0_1_0_6_7 + 0.017751623376624*G0_1_0_6_8 - 0.00197240259740265*G0_1_0_7_0 + 0.00986201298701333*G0_1_0_7_1 + 0.00986201298701334*G0_1_0_7_2 - 0.071006493506496*G0_1_0_7_3 - 0.04437905844156*G0_1_0_7_4 + 0.071006493506496*G0_1_0_7_5 - 0.035503246753248*G0_1_0_7_6 + 0.0976339285714322*G0_1_0_7_7 - 0.0355032467532481*G0_1_0_7_8 + 0.00098620129870133*G0_1_0_8_0 - 0.00493100649350664*G0_1_0_8_1 - 0.00493100649350666*G0_1_0_8_2 + 0.062130681818184*G0_1_0_8_3 + 0.00887581168831198*G0_1_0_8_4 - 0.035503246753248*G0_1_0_8_5 + 0.017751623376624*G0_1_0_8_6 - 0.0355032467532481*G0_1_0_8_7 - 0.00887581168831189*G0_1_0_8_8 + 0.023668831168832*G0_1_0_9_0 - 0.00591720779220796*G0_1_0_9_1 - 0.00591720779220796*G0_1_0_9_2 + 0.159764610389616*G0_1_0_9_3 + 0.159764610389616*G0_1_0_9_4 + 0.319529220779232*G0_1_0_9_9 + 0.0184090909090916*G0_1_1_0_0 + 0.00493100649350668*G0_1_1_0_1 - 0.0013149350649351*G0_1_1_0_2 + 0.0167654220779227*G0_1_1_0_3 + 0.0315584415584428*G0_1_1_0_4 - 0.00690340909090931*G0_1_1_0_5 + 0.0108482142857147*G0_1_1_0_6 - 0.00690340909090922*G0_1_1_0_7 - 0.0128206168831173*G0_1_1_0_8 + 0.0177516233766241*G0_1_1_0_9 + 0.00493100649350668*G0_1_1_1_0 + 0.0197240259740267*G0_1_1_1_1 + 0.00493100649350667*G0_1_1_1_2 - 0.00986201298701334*G0_1_1_1_3 - 0.00394480519480529*G0_1_1_1_4 + 0.00493100649350666*G0_1_1_1_5 + 0.00493100649350667*G0_1_1_1_6 - 0.00394480519480533*G0_1_1_1_7 - 0.00986201298701329*G0_1_1_1_8 - 0.0118344155844159*G0_1_1_1_9 - 0.0013149350649351*G0_1_1_2_0 + 0.00493100649350667*G0_1_1_2_1 + 0.0184090909090916*G0_1_1_2_2 - 0.0128206168831174*G0_1_1_2_3 - 0.0069034090909093*G0_1_1_2_4 + 0.0108482142857147*G0_1_1_2_5 - 0.0069034090909093*G0_1_1_2_6 + 0.0315584415584427*G0_1_1_2_7 + 0.0167654220779226*G0_1_1_2_8 + 0.017751623376624*G0_1_1_2_9 + 0.0167654220779227*G0_1_1_3_0 - 0.00986201298701334*G0_1_1_3_1 - 0.0128206168831174*G0_1_1_3_2 + 0.497045454545472*G0_1_1_3_3 - 0.00887581168831166*G0_1_1_3_4 - 0.026627435064936*G0_1_1_3_5 - 0.026627435064936*G0_1_1_3_6 - 0.0621306818181842*G0_1_1_3_7 + 0.124261363636368*G0_1_1_3_8 + 0.159764610389616*G0_1_1_3_9 + 0.0315584415584427*G0_1_1_4_0 - 0.00394480519480529*G0_1_1_4_1 - 0.0069034090909093*G0_1_1_4_2 - 0.00887581168831165*G0_1_1_4_3 + 0.603555194805216*G0_1_1_4_4 - 0.106509740259744*G0_1_1_4_5 + 0.13313717532468*G0_1_1_4_6 - 0.0887581168831201*G0_1_1_4_7 - 0.062130681818184*G0_1_1_4_8 + 0.159764610389616*G0_1_1_4_9 - 0.00690340909090931*G0_1_1_5_0 + 0.00493100649350666*G0_1_1_5_1 + 0.0108482142857147*G0_1_1_5_2 - 0.026627435064936*G0_1_1_5_3 - 0.106509740259744*G0_1_1_5_4 + 0.08875811688312*G0_1_1_5_5 - 0.071006493506496*G0_1_1_5_6 + 0.13313717532468*G0_1_1_5_7 - 0.0266274350649361*G0_1_1_5_8 + 0.0108482142857147*G0_1_1_6_0 + 0.00493100649350667*G0_1_1_6_1 - 0.0069034090909093*G0_1_1_6_2 - 0.026627435064936*G0_1_1_6_3 + 0.13313717532468*G0_1_1_6_4 - 0.0710064935064961*G0_1_1_6_5 + 0.0887581168831201*G0_1_1_6_6 - 0.106509740259744*G0_1_1_6_7 - 0.0266274350649359*G0_1_1_6_8 - 0.00690340909090923*G0_1_1_7_0 - 0.00394480519480533*G0_1_1_7_1 + 0.0315584415584427*G0_1_1_7_2 - 0.0621306818181842*G0_1_1_7_3 - 0.0887581168831201*G0_1_1_7_4 + 0.13313717532468*G0_1_1_7_5 - 0.106509740259744*G0_1_1_7_6 + 0.603555194805217*G0_1_1_7_7 - 0.00887581168831227*G0_1_1_7_8 + 0.159764610389617*G0_1_1_7_9 - 0.0128206168831173*G0_1_1_8_0 - 0.00986201298701328*G0_1_1_8_1 + 0.0167654220779226*G0_1_1_8_2 + 0.124261363636368*G0_1_1_8_3 - 0.062130681818184*G0_1_1_8_4 - 0.0266274350649361*G0_1_1_8_5 - 0.0266274350649359*G0_1_1_8_6 - 0.00887581168831226*G0_1_1_8_7 + 0.497045454545473*G0_1_1_8_8 + 0.159764610389616*G0_1_1_8_9 + 0.0177516233766241*G0_1_1_9_0 - 0.0118344155844159*G0_1_1_9_1 + 0.017751623376624*G0_1_1_9_2 + 0.159764610389616*G0_1_1_9_3 + 0.159764610389616*G0_1_1_9_4 + 0.159764610389617*G0_1_1_9_7 + 0.159764610389616*G0_1_1_9_8 + 0.639058441558464*G0_1_1_9_9; + A[78] = -A[73] - 0.0864752435064963*G0_0_0_0_0 - 0.00699472402597427*G0_0_0_0_1 - 0.00539671266233784*G0_0_0_0_2 + 0.000410917207792224*G0_0_0_0_3 + 0.00189021915584424*G0_0_0_0_4 - 0.0626237824675345*G0_0_0_0_5 + 0.0273670860389619*G0_0_0_0_6 - 0.0216142451298708*G0_0_0_0_7 + 0.0178338068181824*G0_0_0_0_8 - 0.00699472402597427*G0_0_0_1_0 - 0.0690340909090931*G0_0_0_1_1 - 0.00259334415584424*G0_0_0_1_2 - 0.0361607142857154*G0_0_0_1_3 + 0.0116700487012991*G0_0_0_1_4 - 0.0072321428571431*G0_0_0_1_5 + 0.00065746753246756*G0_0_0_1_6 + 0.0124918831168836*G0_0_0_1_7 - 0.0106838474025978*G0_0_0_1_8 + 0.00542410714285729*G0_0_0_1_9 - 0.00539671266233784*G0_0_0_2_0 - 0.00259334415584424*G0_0_0_2_1 - 0.00178977272727279*G0_0_0_2_2 - 0.00977982954545486*G0_0_0_2_3 + 0.00525974025974042*G0_0_0_2_4 - 0.0142177353896109*G0_0_0_2_5 + 0.0126562500000004*G0_0_0_2_6 - 0.00920454545454577*G0_0_0_2_7 - 0.00945109577922109*G0_0_0_2_8 - 0.0197240259740266*G0_0_0_2_9 + 0.000410917207792223*G0_0_0_3_0 - 0.0361607142857154*G0_0_0_3_1 - 0.00977982954545486*G0_0_0_3_2 - 0.0103551136363638*G0_0_0_3_3 + 0.0443790584415599*G0_0_0_3_4 + 0.00665685876623398*G0_0_0_3_5 + 0.00517755681818198*G0_0_0_3_6 + 0.00591720779220803*G0_0_0_3_7 - 0.0414204545454559*G0_0_0_3_8 - 0.0281067370129879*G0_0_0_3_9 + 0.00189021915584424*G0_0_0_4_0 + 0.0116700487012991*G0_0_0_4_1 + 0.00525974025974042*G0_0_0_4_2 + 0.0443790584415599*G0_0_0_4_3 + 0.0236688311688321*G0_0_0_4_4 + 0.00147930194805202*G0_0_0_4_5 - 0.00665685876623397*G0_0_0_4_6 + 0.00739650974026*G0_0_0_4_7 + 0.035503246753248*G0_0_0_4_8 + 0.056213474025976*G0_0_0_4_9 - 0.0626237824675345*G0_0_0_5_0 - 0.0072321428571431*G0_0_0_5_1 - 0.0142177353896109*G0_0_0_5_2 + 0.00665685876623398*G0_0_0_5_3 + 0.00147930194805202*G0_0_0_5_4 - 0.23668831168832*G0_0_0_5_5 + 0.0525152191558459*G0_0_0_5_6 - 0.0636099837662359*G0_0_0_5_7 + 0.028846387987014*G0_0_0_5_8 - 0.057692775974028*G0_0_0_5_9 + 0.0273670860389619*G0_0_0_6_0 + 0.00065746753246756*G0_0_0_6_1 + 0.0126562500000004*G0_0_0_6_2 + 0.00517755681818198*G0_0_0_6_3 - 0.00665685876623397*G0_0_0_6_4 + 0.0525152191558459*G0_0_0_6_5 - 0.0221895292207799*G0_0_0_6_6 + 0.034763595779222*G0_0_0_6_7 + 0.00961546266233796*G0_0_0_6_8 + 0.048816964285716*G0_0_0_6_9 - 0.0216142451298708*G0_0_0_7_0 + 0.0124918831168836*G0_0_0_7_1 - 0.00920454545454577*G0_0_0_7_2 + 0.00591720779220803*G0_0_0_7_3 + 0.00739650974026*G0_0_0_7_4 - 0.0636099837662359*G0_0_0_7_5 + 0.034763595779222*G0_0_0_7_6 - 0.124261363636368*G0_0_0_7_7 - 0.00739650974025996*G0_0_0_7_8 - 0.0695271915584441*G0_0_0_7_9 + 0.0178338068181824*G0_0_0_8_0 - 0.0106838474025978*G0_0_0_8_1 - 0.00945109577922109*G0_0_0_8_2 - 0.0414204545454559*G0_0_0_8_3 + 0.035503246753248*G0_0_0_8_4 + 0.028846387987014*G0_0_0_8_5 + 0.00961546266233796*G0_0_0_8_6 - 0.00739650974025995*G0_0_0_8_7 - 0.143492288961044*G0_0_0_8_8 - 0.0872788149350679*G0_0_0_8_9 + 0.00542410714285729*G0_0_0_9_1 - 0.0197240259740266*G0_0_0_9_2 - 0.0281067370129879*G0_0_0_9_3 + 0.056213474025976*G0_0_0_9_4 - 0.057692775974028*G0_0_0_9_5 + 0.048816964285716*G0_0_0_9_6 - 0.069527191558444*G0_0_0_9_7 - 0.0872788149350679*G0_0_0_9_8 - 0.390535714285727*G0_0_0_9_9 + 0.00611810064935086*G0_1_0_0_0 - 0.0032599431818183*G0_1_0_0_1 + 0.00166193181818187*G0_1_0_0_2 + 0.000410917207792218*G0_1_0_0_3 + 0.000410917207792233*G0_1_0_0_4 + 0.0101085633116887*G0_1_0_0_5 - 0.00714995941558466*G0_1_0_0_6 + 0.0190665584415591*G0_1_0_0_7 + 0.000575284090909081*G0_1_0_0_8 + 0.0172585227272733*G0_1_0_0_9 - 0.0032599431818183*G0_1_0_1_0 - 0.0717735389610413*G0_1_0_1_1 - 0.00249289772727281*G0_1_0_1_2 - 0.0394480519480532*G0_1_0_1_3 + 0.0123275162337666*G0_1_0_1_4 + 0.00238331980519488*G0_1_0_1_5 - 0.00156148538961044*G0_1_0_1_6 + 0.0172585227272733*G0_1_0_1_7 - 0.01479301948052*G0_1_0_1_8 + 0.00493100649350662*G0_1_0_1_9 + 0.00166193181818187*G0_1_0_2_0 - 0.0024928977272728*G0_1_0_2_1 - 0.00341517857142872*G0_1_0_2_2 - 0.00928672889610418*G0_1_0_2_3 + 0.00378043831168841*G0_1_0_2_4 - 0.00221895292207798*G0_1_0_2_5 + 0.00419135551948063*G0_1_0_2_6 - 0.0119165990259744*G0_1_0_2_7 - 0.0114234983766238*G0_1_0_2_8 - 0.0261343344155853*G0_1_0_2_9 + 0.000410917207792217*G0_1_0_3_0 - 0.0394480519480532*G0_1_0_3_1 - 0.00928672889610419*G0_1_0_3_2 + 0.0451187094155859*G0_1_0_3_4 - 0.00517755681818199*G0_1_0_3_5 + 0.006656858766234*G0_1_0_3_6 + 0.000739650974026052*G0_1_0_3_7 - 0.0369825487013*G0_1_0_3_8 - 0.0162723214285719*G0_1_0_3_9 + 0.000410917207792233*G0_1_0_4_0 + 0.0123275162337666*G0_1_0_4_1 + 0.00378043831168841*G0_1_0_4_2 + 0.0451187094155859*G0_1_0_4_3 + 0.032544642857144*G0_1_0_4_4 + 0.00073965097402601*G0_1_0_4_5 - 0.00739650974026002*G0_1_0_4_6 + 0.016272321428572*G0_1_0_4_7 + 0.036242897727274*G0_1_0_4_8 + 0.0769237012987039*G0_1_0_4_9 + 0.0101085633116887*G0_1_0_5_0 + 0.00238331980519488*G0_1_0_5_1 - 0.00221895292207798*G0_1_0_5_2 - 0.00517755681818199*G0_1_0_5_3 + 0.00073965097402601*G0_1_0_5_4 + 0.0207102272727279*G0_1_0_5_5 + 0.00739650974026001*G0_1_0_5_6 - 0.032544642857144*G0_1_0_5_7 - 0.00517755681818198*G0_1_0_5_8 - 0.041420454545456*G0_1_0_5_9 - 0.00714995941558466*G0_1_0_6_0 - 0.00156148538961044*G0_1_0_6_1 + 0.00419135551948063*G0_1_0_6_2 + 0.006656858766234*G0_1_0_6_3 - 0.00739650974026002*G0_1_0_6_4 + 0.00739650974026001*G0_1_0_6_5 - 0.00591720779220814*G0_1_0_6_6 + 0.037722199675326*G0_1_0_6_7 + 0.01849127435065*G0_1_0_6_8 + 0.0650892857142879*G0_1_0_6_9 + 0.0190665584415591*G0_1_0_7_0 + 0.0172585227272733*G0_1_0_7_1 - 0.0119165990259744*G0_1_0_7_2 + 0.000739650974026052*G0_1_0_7_3 + 0.016272321428572*G0_1_0_7_4 - 0.032544642857144*G0_1_0_7_5 + 0.037722199675326*G0_1_0_7_6 - 0.2218952922078*G0_1_0_7_7 - 0.0229291801948059*G0_1_0_7_8 - 0.127219967532472*G0_1_0_7_9 + 0.000575284090909081*G0_1_0_8_0 - 0.01479301948052*G0_1_0_8_1 - 0.0114234983766238*G0_1_0_8_2 - 0.0369825487013*G0_1_0_8_3 + 0.036242897727274*G0_1_0_8_4 - 0.00517755681818198*G0_1_0_8_5 + 0.01849127435065*G0_1_0_8_6 - 0.0229291801948059*G0_1_0_8_7 - 0.1479301948052*G0_1_0_8_8 - 0.0872788149350679*G0_1_0_8_9 + 0.0172585227272733*G0_1_0_9_0 + 0.00493100649350662*G0_1_0_9_1 - 0.0261343344155853*G0_1_0_9_2 - 0.0162723214285719*G0_1_0_9_3 + 0.0769237012987039*G0_1_0_9_4 - 0.0414204545454559*G0_1_0_9_5 + 0.0650892857142879*G0_1_0_9_6 - 0.127219967532472*G0_1_0_9_7 - 0.0872788149350679*G0_1_0_9_8 - 0.408287337662352*G0_1_0_9_9; + A[21] = 0.0017038690476191*G0_1_0_0_0 + 0.000851934523809557*G0_1_0_0_1 + 0.000851934523809558*G0_1_0_0_2 - 9.13149350649613e-06*G0_1_0_0_3 - 9.13149350649181e-06*G0_1_0_0_4 + 2.43506493506454e-05*G0_1_0_0_5 + 0.00112317370129875*G0_1_0_0_6 + 2.43506493506472e-05*G0_1_0_0_7 + 0.00112317370129874*G0_1_0_0_8 + 0.000267857142857152*G0_1_0_0_9 + 0.000851934523809557*G0_1_0_1_0 + 0.011194534632035*G0_1_0_1_1 + 0.000970643939393975*G0_1_0_1_2 + 0.00375913149350661*G0_1_0_1_3 - 0.00193587662337668*G0_1_0_1_4 - 0.000447443181818199*G0_1_0_1_5 + 0.000566152597402622*G0_1_0_1_6 - 0.00348823051948065*G0_1_0_1_7 + 0.00823356331168861*G0_1_0_1_8 + 0.000980113636363673*G0_1_0_1_9 + 0.000851934523809558*G0_1_0_2_0 + 0.000970643939393974*G0_1_0_2_1 + 0.011194534632035*G0_1_0_2_2 - 0.0019358766233767*G0_1_0_2_3 + 0.00375913149350664*G0_1_0_2_4 - 0.00348823051948065*G0_1_0_2_5 + 0.00823356331168863*G0_1_0_2_6 - 0.000447443181818197*G0_1_0_2_7 + 0.000566152597402616*G0_1_0_2_8 + 0.000980113636363672*G0_1_0_2_9 - 9.13149350649615e-06*G0_1_0_3_0 + 0.00375913149350661*G0_1_0_3_1 - 0.0019358766233767*G0_1_0_3_2 - 0.00321428571428585*G0_1_0_3_3 - 0.000748782467532496*G0_1_0_3_4 + 0.00124188311688316*G0_1_0_3_5 - 0.0028125000000001*G0_1_0_3_6 - 0.00108664772727276*G0_1_0_3_7 + 0.00389914772727285*G0_1_0_3_8 - 0.000767045454545493*G0_1_0_3_9 - 9.13149350649179e-06*G0_1_0_4_0 - 0.00193587662337668*G0_1_0_4_1 + 0.00375913149350664*G0_1_0_4_2 - 0.000748782467532496*G0_1_0_4_3 - 0.00321428571428582*G0_1_0_4_4 - 0.00108664772727277*G0_1_0_4_5 + 0.00389914772727288*G0_1_0_4_6 + 0.00124188311688316*G0_1_0_4_7 - 0.00281250000000009*G0_1_0_4_8 - 0.000767045454545478*G0_1_0_4_9 + 2.43506493506454e-05*G0_1_0_5_0 - 0.000447443181818199*G0_1_0_5_1 - 0.00348823051948065*G0_1_0_5_2 + 0.00124188311688316*G0_1_0_5_3 - 0.00108664772727277*G0_1_0_5_4 - 0.0018993506493507*G0_1_0_5_5 - 0.00658380681818206*G0_1_0_5_6 - 0.000456574675324691*G0_1_0_5_7 + 0.000228287337662346*G0_1_0_5_8 - 0.00126014610389615*G0_1_0_5_9 + 0.00112317370129875*G0_1_0_6_0 + 0.000566152597402622*G0_1_0_6_1 + 0.00823356331168863*G0_1_0_6_2 - 0.0028125000000001*G0_1_0_6_3 + 0.00389914772727288*G0_1_0_6_4 - 0.00658380681818206*G0_1_0_6_5 + 0.022262581168832*G0_1_0_6_6 + 0.000228287337662345*G0_1_0_6_7 - 0.00114143668831172*G0_1_0_6_8 + 0.00268465909090919*G0_1_0_6_9 + 2.43506493506472e-05*G0_1_0_7_0 - 0.00348823051948065*G0_1_0_7_1 - 0.000447443181818197*G0_1_0_7_2 - 0.00108664772727276*G0_1_0_7_3 + 0.00124188311688316*G0_1_0_7_4 - 0.000456574675324691*G0_1_0_7_5 + 0.000228287337662345*G0_1_0_7_6 - 0.00189935064935072*G0_1_0_7_7 - 0.00658380681818205*G0_1_0_7_8 - 0.00126014610389614*G0_1_0_7_9 + 0.00112317370129874*G0_1_0_8_0 + 0.00823356331168861*G0_1_0_8_1 + 0.000566152597402616*G0_1_0_8_2 + 0.00389914772727285*G0_1_0_8_3 - 0.00281250000000009*G0_1_0_8_4 + 0.000228287337662346*G0_1_0_8_5 - 0.00114143668831172*G0_1_0_8_6 - 0.00658380681818205*G0_1_0_8_7 + 0.0222625811688319*G0_1_0_8_8 + 0.00268465909090917*G0_1_0_8_9 + 0.000267857142857152*G0_1_0_9_0 + 0.000980113636363673*G0_1_0_9_1 + 0.000980113636363672*G0_1_0_9_2 - 0.000767045454545492*G0_1_0_9_3 - 0.000767045454545478*G0_1_0_9_4 - 0.00126014610389615*G0_1_0_9_5 + 0.00268465909090919*G0_1_0_9_6 - 0.00126014610389614*G0_1_0_9_7 + 0.00268465909090917*G0_1_0_9_8 + 0.0105194805194809*G0_1_0_9_9; + A[1] = -A[21] - 0.011194534632035*G0_0_0_0_0 - 0.000970643939393976*G0_0_0_0_1 - 0.000851934523809553*G0_0_0_0_2 - 0.000566152597402621*G0_0_0_0_3 + 0.0004474431818182*G0_0_0_0_4 - 0.00823356331168858*G0_0_0_0_5 + 0.00348823051948063*G0_0_0_0_6 - 0.00375913149350661*G0_0_0_0_7 + 0.00193587662337668*G0_0_0_0_8 - 0.000980113636363677*G0_0_0_0_9 - 0.000970643939393976*G0_0_0_1_0 - 0.011194534632035*G0_0_0_1_1 - 0.000851934523809553*G0_0_0_1_2 - 0.0082335633116886*G0_0_0_1_3 + 0.00348823051948064*G0_0_0_1_4 - 0.000566152597402615*G0_0_0_1_5 + 0.000447443181818198*G0_0_0_1_6 + 0.0019358766233767*G0_0_0_1_7 - 0.00375913149350665*G0_0_0_1_8 - 0.000980113636363678*G0_0_0_1_9 - 0.000851934523809553*G0_0_0_2_0 - 0.000851934523809553*G0_0_0_2_1 - 0.00170386904761911*G0_0_0_2_2 - 0.00112317370129874*G0_0_0_2_3 - 0.00112317370129874*G0_0_0_2_5 - 0.000267857142857154*G0_0_0_2_9 - 0.000566152597402621*G0_0_0_3_0 - 0.0082335633116886*G0_0_0_3_1 - 0.00112317370129874*G0_0_0_3_2 - 0.022262581168832*G0_0_0_3_3 + 0.00658380681818205*G0_0_0_3_4 + 0.00114143668831173*G0_0_0_3_5 - 0.00022828733766234*G0_0_0_3_6 + 0.00281250000000011*G0_0_0_3_7 - 0.00389914772727289*G0_0_0_3_8 - 0.0026846590909092*G0_0_0_3_9 + 0.0004474431818182*G0_0_0_4_0 + 0.00348823051948064*G0_0_0_4_1 + 0.00658380681818205*G0_0_0_4_3 + 0.00189935064935072*G0_0_0_4_4 - 0.000228287337662343*G0_0_0_4_5 + 0.000456574675324688*G0_0_0_4_6 - 0.00124188311688317*G0_0_0_4_7 + 0.00108664772727278*G0_0_0_4_8 + 0.00126014610389615*G0_0_0_4_9 - 0.00823356331168858*G0_0_0_5_0 - 0.000566152597402615*G0_0_0_5_1 - 0.00112317370129874*G0_0_0_5_2 + 0.00114143668831173*G0_0_0_5_3 - 0.000228287337662343*G0_0_0_5_4 - 0.0222625811688319*G0_0_0_5_5 + 0.00658380681818204*G0_0_0_5_6 - 0.00389914772727286*G0_0_0_5_7 + 0.0028125000000001*G0_0_0_5_8 - 0.00268465909090919*G0_0_0_5_9 + 0.00348823051948063*G0_0_0_6_0 + 0.000447443181818198*G0_0_0_6_1 - 0.00022828733766234*G0_0_0_6_3 + 0.000456574675324688*G0_0_0_6_4 + 0.00658380681818204*G0_0_0_6_5 + 0.00189935064935072*G0_0_0_6_6 + 0.00108664772727276*G0_0_0_6_7 - 0.00124188311688316*G0_0_0_6_8 + 0.00126014610389615*G0_0_0_6_9 - 0.00375913149350661*G0_0_0_7_0 + 0.0019358766233767*G0_0_0_7_1 + 0.00281250000000011*G0_0_0_7_3 - 0.00124188311688317*G0_0_0_7_4 - 0.00389914772727286*G0_0_0_7_5 + 0.00108664772727276*G0_0_0_7_6 + 0.00321428571428583*G0_0_0_7_7 + 0.000748782467532511*G0_0_0_7_8 + 0.000767045454545488*G0_0_0_7_9 + 0.00193587662337668*G0_0_0_8_0 - 0.00375913149350665*G0_0_0_8_1 - 0.00389914772727289*G0_0_0_8_3 + 0.00108664772727278*G0_0_0_8_4 + 0.0028125000000001*G0_0_0_8_5 - 0.00124188311688316*G0_0_0_8_6 + 0.000748782467532511*G0_0_0_8_7 + 0.00321428571428579*G0_0_0_8_8 + 0.000767045454545472*G0_0_0_8_9 - 0.000980113636363677*G0_0_0_9_0 - 0.000980113636363678*G0_0_0_9_1 - 0.000267857142857154*G0_0_0_9_2 - 0.0026846590909092*G0_0_0_9_3 + 0.00126014610389615*G0_0_0_9_4 - 0.00268465909090919*G0_0_0_9_5 + 0.00126014610389615*G0_0_0_9_6 + 0.000767045454545488*G0_0_0_9_7 + 0.000767045454545472*G0_0_0_9_8 - 0.0105194805194809*G0_0_0_9_9 - 0.0094906655844159*G0_1_0_0_0 - 0.000118709415584419*G0_1_0_0_1 - 0.000575284090909117*G0_1_0_0_3 + 0.000438311688311708*G0_1_0_0_4 - 0.00820921266233793*G0_1_0_0_5 + 0.00461140422077938*G0_1_0_0_6 - 0.00373478084415597*G0_1_0_0_7 + 0.00305905032467543*G0_1_0_0_8 - 0.000712256493506524*G0_1_0_0_9 - 0.000118709415584419*G0_1_0_1_0 + 0.000118709415584422*G0_1_0_1_2 - 0.00447443181818197*G0_1_0_1_3 + 0.00155235389610395*G0_1_0_1_4 - 0.00101359577922081*G0_1_0_1_5 + 0.00101359577922082*G0_1_0_1_6 - 0.00155235389610395*G0_1_0_1_7 + 0.00447443181818197*G0_1_0_1_8 + 0.000118709415584422*G0_1_0_2_1 + 0.00949066558441593*G0_1_0_2_2 - 0.00305905032467543*G0_1_0_2_3 + 0.00373478084415599*G0_1_0_2_4 - 0.00461140422077939*G0_1_0_2_5 + 0.00820921266233797*G0_1_0_2_6 - 0.000438311688311701*G0_1_0_2_7 + 0.000575284090909107*G0_1_0_2_8 + 0.000712256493506518*G0_1_0_2_9 - 0.000575284090909117*G0_1_0_3_0 - 0.00447443181818197*G0_1_0_3_1 - 0.00305905032467543*G0_1_0_3_2 - 0.0254768668831178*G0_1_0_3_3 + 0.00583502435064954*G0_1_0_3_4 + 0.00238331980519489*G0_1_0_3_5 - 0.00304078733766244*G0_1_0_3_6 + 0.00172585227272735*G0_1_0_3_7 - 0.00345170454545469*G0_1_0_3_9 + 0.000438311688311708*G0_1_0_4_0 + 0.00155235389610395*G0_1_0_4_1 + 0.00373478084415599*G0_1_0_4_2 + 0.00583502435064954*G0_1_0_4_3 - 0.0013149350649351*G0_1_0_4_4 - 0.00131493506493511*G0_1_0_4_5 + 0.00435572240259756*G0_1_0_4_6 - 0.00172585227272732*G0_1_0_4_8 + 0.000493100649350676*G0_1_0_4_9 - 0.00820921266233794*G0_1_0_5_0 - 0.00101359577922081*G0_1_0_5_1 - 0.00461140422077939*G0_1_0_5_2 + 0.00238331980519489*G0_1_0_5_3 - 0.00131493506493511*G0_1_0_5_4 - 0.0241619318181826*G0_1_0_5_5 - 0.00435572240259755*G0_1_0_5_7 + 0.00304078733766244*G0_1_0_5_8 - 0.00394480519480534*G0_1_0_5_9 + 0.00461140422077938*G0_1_0_6_0 + 0.00101359577922082*G0_1_0_6_1 + 0.00820921266233797*G0_1_0_6_2 - 0.00304078733766244*G0_1_0_6_3 + 0.00435572240259756*G0_1_0_6_4 + 0.0241619318181827*G0_1_0_6_6 + 0.00131493506493511*G0_1_0_6_7 - 0.00238331980519488*G0_1_0_6_8 + 0.00394480519480534*G0_1_0_6_9 - 0.00373478084415597*G0_1_0_7_0 - 0.00155235389610395*G0_1_0_7_1 - 0.000438311688311701*G0_1_0_7_2 + 0.00172585227272735*G0_1_0_7_3 - 0.00435572240259755*G0_1_0_7_5 + 0.00131493506493511*G0_1_0_7_6 + 0.00131493506493512*G0_1_0_7_7 - 0.00583502435064954*G0_1_0_7_8 - 0.000493100649350655*G0_1_0_7_9 + 0.00305905032467543*G0_1_0_8_0 + 0.00447443181818197*G0_1_0_8_1 + 0.000575284090909107*G0_1_0_8_2 - 0.00172585227272732*G0_1_0_8_4 + 0.00304078733766244*G0_1_0_8_5 - 0.00238331980519488*G0_1_0_8_6 - 0.00583502435064954*G0_1_0_8_7 + 0.0254768668831177*G0_1_0_8_8 + 0.00345170454545465*G0_1_0_8_9 - 0.000712256493506524*G0_1_0_9_0 + 0.000712256493506518*G0_1_0_9_2 - 0.00345170454545469*G0_1_0_9_3 + 0.000493100649350676*G0_1_0_9_4 - 0.00394480519480534*G0_1_0_9_5 + 0.00394480519480534*G0_1_0_9_6 - 0.000493100649350655*G0_1_0_9_7 + 0.00345170454545465*G0_1_0_9_8; + A[72] = -A[82] + 0.00949066558441591*G0_0_1_0_0 + 0.000118709415584416*G0_0_1_0_2 - 0.000438311688311704*G0_0_1_0_3 + 0.00057528409090911*G0_0_1_0_4 + 0.00373478084415597*G0_0_1_0_5 - 0.00305905032467544*G0_0_1_0_6 + 0.00820921266233794*G0_0_1_0_7 - 0.00461140422077938*G0_0_1_0_8 + 0.000712256493506521*G0_0_1_0_9 - 0.0094906655844159*G0_0_1_1_1 - 0.000118709415584421*G0_0_1_1_2 - 0.00373478084415596*G0_0_1_1_3 + 0.00305905032467542*G0_0_1_1_4 + 0.000438311688311704*G0_0_1_1_5 - 0.000575284090909117*G0_0_1_1_6 + 0.00461140422077938*G0_0_1_1_7 - 0.00820921266233796*G0_0_1_1_8 - 0.000712256493506521*G0_0_1_1_9 + 0.000118709415584416*G0_0_1_2_0 - 0.000118709415584422*G0_0_1_2_1 - 0.00155235389610394*G0_0_1_2_3 + 0.00447443181818195*G0_0_1_2_4 + 0.00155235389610396*G0_0_1_2_5 - 0.004474431818182*G0_0_1_2_6 + 0.00101359577922081*G0_0_1_2_7 - 0.00101359577922081*G0_0_1_2_8 - 0.000438311688311704*G0_0_1_3_0 - 0.00373478084415596*G0_0_1_3_1 - 0.00155235389610394*G0_0_1_3_2 + 0.00131493506493513*G0_0_1_3_3 - 0.00583502435064954*G0_0_1_3_4 + 0.00172585227272734*G0_0_1_3_6 + 0.0013149350649351*G0_0_1_3_7 - 0.00435572240259754*G0_0_1_3_8 - 0.000493100649350653*G0_0_1_3_9 + 0.000575284090909111*G0_0_1_4_0 + 0.00305905032467542*G0_0_1_4_1 + 0.00447443181818195*G0_0_1_4_2 - 0.00583502435064954*G0_0_1_4_3 + 0.0254768668831177*G0_0_1_4_4 - 0.00172585227272732*G0_0_1_4_5 - 0.00238331980519489*G0_0_1_4_7 + 0.00304078733766244*G0_0_1_4_8 + 0.00345170454545465*G0_0_1_4_9 + 0.00373478084415597*G0_0_1_5_0 + 0.000438311688311704*G0_0_1_5_1 + 0.00155235389610396*G0_0_1_5_2 - 0.00172585227272732*G0_0_1_5_4 - 0.00131493506493513*G0_0_1_5_5 + 0.00583502435064958*G0_0_1_5_6 + 0.00435572240259754*G0_0_1_5_7 - 0.00131493506493511*G0_0_1_5_8 + 0.000493100649350668*G0_0_1_5_9 - 0.00305905032467544*G0_0_1_6_0 - 0.000575284090909117*G0_0_1_6_1 - 0.004474431818182*G0_0_1_6_2 + 0.00172585227272734*G0_0_1_6_3 + 0.00583502435064958*G0_0_1_6_5 - 0.0254768668831178*G0_0_1_6_6 - 0.00304078733766244*G0_0_1_6_7 + 0.00238331980519488*G0_0_1_6_8 - 0.00345170454545468*G0_0_1_6_9 + 0.00820921266233794*G0_0_1_7_0 + 0.00461140422077938*G0_0_1_7_1 + 0.00101359577922081*G0_0_1_7_2 + 0.0013149350649351*G0_0_1_7_3 - 0.00238331980519489*G0_0_1_7_4 + 0.00435572240259754*G0_0_1_7_5 - 0.00304078733766244*G0_0_1_7_6 + 0.0241619318181826*G0_0_1_7_7 + 0.00394480519480533*G0_0_1_7_9 - 0.00461140422077938*G0_0_1_8_0 - 0.00820921266233796*G0_0_1_8_1 - 0.00101359577922081*G0_0_1_8_2 - 0.00435572240259754*G0_0_1_8_3 + 0.00304078733766244*G0_0_1_8_4 - 0.00131493506493511*G0_0_1_8_5 + 0.00238331980519488*G0_0_1_8_6 - 0.0241619318181826*G0_0_1_8_8 - 0.00394480519480532*G0_0_1_8_9 + 0.000712256493506521*G0_0_1_9_0 - 0.000712256493506521*G0_0_1_9_1 - 0.000493100649350653*G0_0_1_9_3 + 0.00345170454545465*G0_0_1_9_4 + 0.000493100649350668*G0_0_1_9_5 - 0.00345170454545468*G0_0_1_9_6 + 0.00394480519480533*G0_0_1_9_7 - 0.00394480519480532*G0_0_1_9_8 - 0.00265422077922088*G0_1_1_0_0 - 0.00165280032467539*G0_1_1_0_1 + 0.000258725649350659*G0_1_1_0_2 - 0.000210024350649359*G0_1_1_0_3 + 0.00170758928571435*G0_1_1_0_4 - 0.00215503246753254*G0_1_1_0_5 + 0.0014884334415585*G0_1_1_0_6 - 0.00261160714285724*G0_1_1_0_7 + 0.00092228084415587*G0_1_1_0_8 + 0.000219155844155851*G0_1_1_0_9 - 0.00165280032467539*G0_1_1_1_0 - 0.0121448863636368*G0_1_1_1_1 + 0.00014001623376624*G0_1_1_1_2 - 0.00588981331168851*G0_1_1_1_3 + 0.00454748376623392*G0_1_1_1_4 + 0.000228287337662344*G0_1_1_1_5 + 0.00113230519480524*G0_1_1_1_6 + 0.00553368506493526*G0_1_1_1_7 - 0.0108208198051952*G0_1_1_1_8 - 0.000493100649350668*G0_1_1_1_9 + 0.000258725649350659*G0_1_1_2_0 + 0.00014001623376624*G0_1_1_2_1 + 0.00547889610389628*G0_1_1_2_2 - 0.00348823051948063*G0_1_1_2_3 + 0.0082640016233769*G0_1_1_2_4 - 0.00193587662337669*G0_1_1_2_5 + 0.00378956980519493*G0_1_1_2_6 - 0.00157974837662343*G0_1_1_2_7 - 0.00259334415584424*G0_1_1_2_8 + 0.0010409902597403*G0_1_1_2_9 - 0.000210024350649359*G0_1_1_3_0 - 0.00588981331168851*G0_1_1_3_1 - 0.00348823051948063*G0_1_1_3_2 + 0.00788961038961068*G0_1_1_3_3 - 0.00936891233766267*G0_1_1_3_4 + 0.000164366883116892*G0_1_1_3_5 - 0.00378043831168845*G0_1_1_3_6 + 0.000246550324675343*G0_1_1_3_7 - 0.0076430600649353*G0_1_1_3_8 + 0.00098620129870135*G0_1_1_3_9 + 0.00170758928571435*G0_1_1_4_0 + 0.00454748376623392*G0_1_1_4_1 + 0.0082640016233769*G0_1_1_4_2 - 0.00936891233766267*G0_1_1_4_3 + 0.0330377435064947*G0_1_1_4_4 - 0.00550629058441578*G0_1_1_4_5 + 0.00928672889610422*G0_1_1_4_6 + 0.00739650974025997*G0_1_1_4_8 + 0.00788961038961065*G0_1_1_4_9 - 0.00215503246753254*G0_1_1_5_0 + 0.000228287337662344*G0_1_1_5_1 - 0.00193587662337669*G0_1_1_5_2 + 0.000164366883116891*G0_1_1_5_3 - 0.00550629058441578*G0_1_1_5_4 + 0.00657467532467554*G0_1_1_5_5 - 0.00353388798701311*G0_1_1_5_6 - 0.00328733766233777*G0_1_1_5_7 - 0.00106838474025977*G0_1_1_5_8 + 0.001479301948052*G0_1_1_5_9 + 0.0014884334415585*G0_1_1_6_0 + 0.00113230519480524*G0_1_1_6_1 + 0.00378956980519493*G0_1_1_6_2 - 0.00378043831168845*G0_1_1_6_3 + 0.00928672889610422*G0_1_1_6_4 - 0.00353388798701311*G0_1_1_6_5 + 0.00756087662337689*G0_1_1_6_6 + 0.00435572240259755*G0_1_1_6_7 + 0.00238331980519487*G0_1_1_6_8 + 0.00443790584415599*G0_1_1_6_9 - 0.00261160714285724*G0_1_1_7_0 + 0.00553368506493526*G0_1_1_7_1 - 0.00157974837662343*G0_1_1_7_2 + 0.000246550324675344*G0_1_1_7_3 - 0.00328733766233777*G0_1_1_7_5 + 0.00435572240259755*G0_1_1_7_6 - 0.0571996753246773*G0_1_1_7_7 + 0.00665685876623402*G0_1_1_7_8 - 0.00936891233766266*G0_1_1_7_9 + 0.000922280844155871*G0_1_1_8_0 - 0.0108208198051952*G0_1_1_8_1 - 0.00259334415584424*G0_1_1_8_2 - 0.0076430600649353*G0_1_1_8_3 + 0.00739650974025997*G0_1_1_8_4 - 0.00106838474025977*G0_1_1_8_5 + 0.00238331980519487*G0_1_1_8_6 + 0.00665685876623402*G0_1_1_8_7 - 0.0813616071428599*G0_1_1_8_8 - 0.013313717532468*G0_1_1_8_9 + 0.00021915584415585*G0_1_1_9_0 - 0.000493100649350667*G0_1_1_9_1 + 0.0010409902597403*G0_1_1_9_2 + 0.000986201298701352*G0_1_1_9_3 + 0.00788961038961065*G0_1_1_9_4 + 0.001479301948052*G0_1_1_9_5 + 0.00443790584415599*G0_1_1_9_6 - 0.00936891233766266*G0_1_1_9_7 - 0.013313717532468*G0_1_1_9_8 + 0.0493100649350667*G0_1_1_9_9; + A[15] = -A[16] - 0.00265422077922086*G0_0_0_0_0 + 0.000258725649350658*G0_0_0_0_1 - 0.00165280032467539*G0_0_0_0_2 + 0.00170758928571436*G0_0_0_0_3 - 0.000210024350649363*G0_0_0_0_4 - 0.00261160714285722*G0_0_0_0_5 + 0.000922280844155847*G0_0_0_0_6 - 0.00215503246753254*G0_0_0_0_7 + 0.0014884334415585*G0_0_0_0_8 + 0.000219155844155849*G0_0_0_0_9 + 0.000258725649350659*G0_0_0_1_0 + 0.00547889610389627*G0_0_0_1_1 + 0.000140016233766233*G0_0_0_1_2 + 0.0082640016233769*G0_0_0_1_3 - 0.00348823051948064*G0_0_0_1_4 - 0.00157974837662342*G0_0_0_1_5 - 0.00259334415584426*G0_0_0_1_6 - 0.00193587662337669*G0_0_0_1_7 + 0.00378956980519494*G0_0_0_1_8 + 0.0010409902597403*G0_0_0_1_9 - 0.00165280032467539*G0_0_0_2_0 + 0.000140016233766233*G0_0_0_2_1 - 0.0121448863636368*G0_0_0_2_2 + 0.00454748376623393*G0_0_0_2_3 - 0.00588981331168853*G0_0_0_2_4 + 0.00553368506493527*G0_0_0_2_5 - 0.0108208198051952*G0_0_0_2_6 + 0.000228287337662343*G0_0_0_2_7 + 0.00113230519480524*G0_0_0_2_8 - 0.000493100649350671*G0_0_0_2_9 + 0.00170758928571436*G0_0_0_3_0 + 0.0082640016233769*G0_0_0_3_1 + 0.00454748376623393*G0_0_0_3_2 + 0.0330377435064947*G0_0_0_3_3 - 0.00936891233766265*G0_0_0_3_4 + 0.00739650974025999*G0_0_0_3_6 - 0.00550629058441579*G0_0_0_3_7 + 0.00928672889610425*G0_0_0_3_8 + 0.00788961038961069*G0_0_0_3_9 - 0.000210024350649363*G0_0_0_4_0 - 0.00348823051948064*G0_0_0_4_1 - 0.00588981331168853*G0_0_0_4_2 - 0.00936891233766265*G0_0_0_4_3 + 0.00788961038961065*G0_0_0_4_4 + 0.000246550324675353*G0_0_0_4_5 - 0.00764306006493535*G0_0_0_4_6 + 0.000164366883116895*G0_0_0_4_7 - 0.00378043831168845*G0_0_0_4_8 + 0.000986201298701317*G0_0_0_4_9 - 0.00261160714285722*G0_0_0_5_0 - 0.00157974837662342*G0_0_0_5_1 + 0.00553368506493527*G0_0_0_5_2 + 0.000246550324675353*G0_0_0_5_4 - 0.0571996753246772*G0_0_0_5_5 + 0.00665685876623404*G0_0_0_5_6 - 0.00328733766233777*G0_0_0_5_7 + 0.00435572240259754*G0_0_0_5_8 - 0.00936891233766265*G0_0_0_5_9 + 0.000922280844155847*G0_0_0_6_0 - 0.00259334415584426*G0_0_0_6_1 - 0.0108208198051952*G0_0_0_6_2 + 0.00739650974025999*G0_0_0_6_3 - 0.00764306006493535*G0_0_0_6_4 + 0.00665685876623404*G0_0_0_6_5 - 0.08136160714286*G0_0_0_6_6 - 0.00106838474025978*G0_0_0_6_7 + 0.00238331980519488*G0_0_0_6_8 - 0.013313717532468*G0_0_0_6_9 - 0.00215503246753254*G0_0_0_7_0 - 0.00193587662337669*G0_0_0_7_1 + 0.000228287337662343*G0_0_0_7_2 - 0.00550629058441579*G0_0_0_7_3 + 0.000164366883116895*G0_0_0_7_4 - 0.00328733766233777*G0_0_0_7_5 - 0.00106838474025978*G0_0_0_7_6 + 0.00657467532467555*G0_0_0_7_7 - 0.00353388798701312*G0_0_0_7_8 + 0.00147930194805199*G0_0_0_7_9 + 0.0014884334415585*G0_0_0_8_0 + 0.00378956980519494*G0_0_0_8_1 + 0.00113230519480524*G0_0_0_8_2 + 0.00928672889610425*G0_0_0_8_3 - 0.00378043831168845*G0_0_0_8_4 + 0.00435572240259754*G0_0_0_8_5 + 0.00238331980519488*G0_0_0_8_6 - 0.00353388798701312*G0_0_0_8_7 + 0.00756087662337692*G0_0_0_8_8 + 0.004437905844156*G0_0_0_8_9 + 0.00021915584415585*G0_0_0_9_0 + 0.0010409902597403*G0_0_0_9_1 - 0.000493100649350671*G0_0_0_9_2 + 0.00788961038961069*G0_0_0_9_3 + 0.000986201298701317*G0_0_0_9_4 - 0.00936891233766265*G0_0_0_9_5 - 0.013313717532468*G0_0_0_9_6 + 0.00147930194805199*G0_0_0_9_7 + 0.004437905844156*G0_0_0_9_8 + 0.0493100649350666*G0_0_0_9_9 + 0.0094906655844159*G0_0_1_0_0 + 0.000118709415584417*G0_0_1_0_1 + 0.000575284090909116*G0_0_1_0_3 - 0.000438311688311709*G0_0_1_0_4 + 0.00820921266233793*G0_0_1_0_5 - 0.00461140422077938*G0_0_1_0_6 + 0.00373478084415597*G0_0_1_0_7 - 0.00305905032467543*G0_0_1_0_8 + 0.000712256493506522*G0_0_1_0_9 + 0.000118709415584418*G0_0_1_1_0 - 0.000118709415584423*G0_0_1_1_2 + 0.00447443181818196*G0_0_1_1_3 - 0.00155235389610395*G0_0_1_1_4 + 0.00101359577922081*G0_0_1_1_5 - 0.00101359577922082*G0_0_1_1_6 + 0.00155235389610395*G0_0_1_1_7 - 0.00447443181818198*G0_0_1_1_8 - 0.000118709415584424*G0_0_1_2_1 - 0.00949066558441594*G0_0_1_2_2 + 0.00305905032467544*G0_0_1_2_3 - 0.00373478084415599*G0_0_1_2_4 + 0.00461140422077939*G0_0_1_2_5 - 0.00820921266233798*G0_0_1_2_6 + 0.000438311688311701*G0_0_1_2_7 - 0.000575284090909108*G0_0_1_2_8 - 0.000712256493506518*G0_0_1_2_9 + 0.000575284090909116*G0_0_1_3_0 + 0.00447443181818196*G0_0_1_3_1 + 0.00305905032467544*G0_0_1_3_2 + 0.0254768668831178*G0_0_1_3_3 - 0.00583502435064954*G0_0_1_3_4 - 0.00238331980519489*G0_0_1_3_5 + 0.00304078733766244*G0_0_1_3_6 - 0.00172585227272734*G0_0_1_3_7 + 0.00345170454545469*G0_0_1_3_9 - 0.000438311688311709*G0_0_1_4_0 - 0.00155235389610395*G0_0_1_4_1 - 0.00373478084415599*G0_0_1_4_2 - 0.00583502435064954*G0_0_1_4_3 + 0.00131493506493508*G0_0_1_4_4 + 0.00131493506493512*G0_0_1_4_5 - 0.00435572240259757*G0_0_1_4_6 + 0.00172585227272732*G0_0_1_4_8 - 0.000493100649350681*G0_0_1_4_9 + 0.00820921266233793*G0_0_1_5_0 + 0.00101359577922081*G0_0_1_5_1 + 0.00461140422077939*G0_0_1_5_2 - 0.00238331980519489*G0_0_1_5_3 + 0.00131493506493512*G0_0_1_5_4 + 0.0241619318181826*G0_0_1_5_5 + 0.00435572240259754*G0_0_1_5_7 - 0.00304078733766244*G0_0_1_5_8 + 0.00394480519480533*G0_0_1_5_9 - 0.00461140422077938*G0_0_1_6_0 - 0.00101359577922082*G0_0_1_6_1 - 0.00820921266233798*G0_0_1_6_2 + 0.00304078733766244*G0_0_1_6_3 - 0.00435572240259757*G0_0_1_6_4 - 0.0241619318181827*G0_0_1_6_6 - 0.00131493506493511*G0_0_1_6_7 + 0.00238331980519488*G0_0_1_6_8 - 0.00394480519480534*G0_0_1_6_9 + 0.00373478084415597*G0_0_1_7_0 + 0.00155235389610395*G0_0_1_7_1 + 0.000438311688311702*G0_0_1_7_2 - 0.00172585227272734*G0_0_1_7_3 + 0.00435572240259754*G0_0_1_7_5 - 0.00131493506493511*G0_0_1_7_6 - 0.00131493506493511*G0_0_1_7_7 + 0.00583502435064955*G0_0_1_7_8 + 0.000493100649350657*G0_0_1_7_9 - 0.00305905032467543*G0_0_1_8_0 - 0.00447443181818198*G0_0_1_8_1 - 0.000575284090909108*G0_0_1_8_2 + 0.00172585227272732*G0_0_1_8_4 - 0.00304078733766244*G0_0_1_8_5 + 0.00238331980519488*G0_0_1_8_6 + 0.00583502435064955*G0_0_1_8_7 - 0.0254768668831177*G0_0_1_8_8 - 0.00345170454545465*G0_0_1_8_9 + 0.000712256493506522*G0_0_1_9_0 - 0.000712256493506518*G0_0_1_9_2 + 0.00345170454545469*G0_0_1_9_3 - 0.000493100649350679*G0_0_1_9_4 + 0.00394480519480533*G0_0_1_9_5 - 0.00394480519480534*G0_0_1_9_6 + 0.000493100649350657*G0_0_1_9_7 - 0.00345170454545465*G0_0_1_9_8; + A[51] = A[15] - 0.0164671266233772*G0_0_1_0_0 - 0.000566152597402615*G0_0_1_0_1 - 0.00109882305194809*G0_0_1_0_2 + 0.000219155844155851*G0_0_1_0_3 + 0.000273944805194817*G0_0_1_0_4 - 0.0111312905844159*G0_0_1_0_5 + 0.00366172889610402*G0_0_1_0_6 - 0.00599025974025994*G0_0_1_0_7 + 0.00373478084415597*G0_0_1_0_8 - 0.00109577922077926*G0_0_1_0_9 - 0.000566152597402615*G0_0_1_1_0 - 0.000447443181818199*G0_0_1_1_2 - 0.00223721590909098*G0_0_1_1_3 + 0.000693993506493524*G0_0_1_1_4 + 0.00101359577922081*G0_0_1_1_6 - 0.000858360389610425*G0_0_1_1_7 + 0.002237215909091*G0_0_1_1_8 + 0.000164366883116884*G0_0_1_1_9 - 0.00109882305194809*G0_0_1_2_0 - 0.000447443181818199*G0_0_1_2_1 - 0.00697646103896131*G0_0_1_2_2 + 0.000675730519480551*G0_0_1_2_3 - 0.00225547889610399*G0_0_1_2_4 - 0.000949675324675343*G0_0_1_2_5 - 0.00292207792207804*G0_0_1_2_6 - 0.000164366883116887*G0_0_1_2_7 + 0.000794439935064962*G0_0_1_2_8 - 0.000383522727272743*G0_0_1_2_9 + 0.000219155844155851*G0_0_1_3_0 - 0.00223721590909098*G0_0_1_3_1 + 0.000675730519480551*G0_0_1_3_2 - 0.0144642857142862*G0_0_1_3_3 + 0.00254768668831178*G0_0_1_3_4 - 0.00065746753246755*G0_0_1_3_5 - 0.00238331980519487*G0_0_1_3_6 + 0.00172585227272732*G0_0_1_3_8 - 0.000493100649350663*G0_0_1_3_9 + 0.000273944805194817*G0_0_1_4_0 + 0.000693993506493524*G0_0_1_4_1 - 0.00225547889610399*G0_0_1_4_2 + 0.00254768668831178*G0_0_1_4_3 + 0.0121631493506498*G0_0_1_4_4 - 0.000164366883116886*G0_0_1_4_5 + 0.00254768668831176*G0_0_1_4_6 - 0.000493100649350669*G0_0_1_4_7 - 0.00172585227272733*G0_0_1_4_8 + 0.001479301948052*G0_0_1_4_9 - 0.0111312905844159*G0_0_1_5_0 - 0.000949675324675343*G0_0_1_5_2 - 0.00065746753246755*G0_0_1_5_3 - 0.000164366883116886*G0_0_1_5_4 + 0.0120809659090913*G0_0_1_5_6 - 0.00180803571428578*G0_0_1_5_7 + 0.000657467532467566*G0_0_1_5_8 + 0.00197240259740263*G0_0_1_5_9 + 0.00366172889610402*G0_0_1_6_0 + 0.00101359577922081*G0_0_1_6_1 - 0.00292207792207804*G0_0_1_6_2 - 0.00238331980519487*G0_0_1_6_3 + 0.00254768668831176*G0_0_1_6_4 + 0.0120809659090913*G0_0_1_6_5 + 0.0241619318181826*G0_0_1_6_6 + 0.00115056818181822*G0_0_1_6_7 - 0.00304078733766244*G0_0_1_6_8 + 0.00591720779220798*G0_0_1_6_9 - 0.00599025974025994*G0_0_1_7_0 - 0.000858360389610425*G0_0_1_7_1 - 0.000164366883116887*G0_0_1_7_2 - 0.000493100649350669*G0_0_1_7_4 - 0.00180803571428578*G0_0_1_7_5 + 0.00115056818181822*G0_0_1_7_6 + 0.0134780844155849*G0_0_1_7_7 - 0.00328733766233778*G0_0_1_7_8 + 0.000986201298701329*G0_0_1_7_9 + 0.00373478084415597*G0_0_1_8_0 + 0.002237215909091*G0_0_1_8_1 + 0.000794439935064961*G0_0_1_8_2 + 0.00172585227272732*G0_0_1_8_3 - 0.00172585227272733*G0_0_1_8_4 + 0.000657467532467566*G0_0_1_8_5 - 0.00304078733766244*G0_0_1_8_6 - 0.00328733766233778*G0_0_1_8_7 + 0.0110125811688316*G0_0_1_8_8 + 0.00295860389610401*G0_0_1_8_9 - 0.00109577922077926*G0_0_1_9_0 + 0.000164366883116883*G0_0_1_9_1 - 0.000383522727272743*G0_0_1_9_2 - 0.000493100649350663*G0_0_1_9_3 + 0.001479301948052*G0_0_1_9_4 + 0.00197240259740263*G0_0_1_9_5 + 0.00591720779220798*G0_0_1_9_6 + 0.000986201298701329*G0_0_1_9_7 + 0.00295860389610401*G0_0_1_9_8 - 0.0295860389610399*G0_0_1_9_9 + 0.0164671266233772*G0_1_0_0_0 + 0.000566152597402615*G0_1_0_0_1 + 0.00109882305194809*G0_1_0_0_2 - 0.000219155844155852*G0_1_0_0_3 - 0.000273944805194817*G0_1_0_0_4 + 0.0111312905844159*G0_1_0_0_5 - 0.00366172889610402*G0_1_0_0_6 + 0.00599025974025994*G0_1_0_0_7 - 0.00373478084415597*G0_1_0_0_8 + 0.00109577922077926*G0_1_0_0_9 + 0.000566152597402615*G0_1_0_1_0 + 0.000447443181818199*G0_1_0_1_2 + 0.00223721590909098*G0_1_0_1_3 - 0.000693993506493525*G0_1_0_1_4 - 0.00101359577922081*G0_1_0_1_6 + 0.000858360389610425*G0_1_0_1_7 - 0.002237215909091*G0_1_0_1_8 - 0.000164366883116883*G0_1_0_1_9 + 0.00109882305194809*G0_1_0_2_0 + 0.000447443181818199*G0_1_0_2_1 + 0.00697646103896131*G0_1_0_2_2 - 0.000675730519480551*G0_1_0_2_3 + 0.00225547889610399*G0_1_0_2_4 + 0.000949675324675344*G0_1_0_2_5 + 0.00292207792207804*G0_1_0_2_6 + 0.000164366883116888*G0_1_0_2_7 - 0.000794439935064962*G0_1_0_2_8 + 0.000383522727272743*G0_1_0_2_9 - 0.000219155844155852*G0_1_0_3_0 + 0.00223721590909098*G0_1_0_3_1 - 0.000675730519480551*G0_1_0_3_2 + 0.0144642857142862*G0_1_0_3_3 - 0.00254768668831178*G0_1_0_3_4 + 0.00065746753246755*G0_1_0_3_5 + 0.00238331980519487*G0_1_0_3_6 - 0.00172585227272733*G0_1_0_3_8 + 0.000493100649350663*G0_1_0_3_9 - 0.000273944805194817*G0_1_0_4_0 - 0.000693993506493524*G0_1_0_4_1 + 0.00225547889610399*G0_1_0_4_2 - 0.00254768668831178*G0_1_0_4_3 - 0.0121631493506498*G0_1_0_4_4 + 0.000164366883116885*G0_1_0_4_5 - 0.00254768668831176*G0_1_0_4_6 + 0.000493100649350669*G0_1_0_4_7 + 0.00172585227272733*G0_1_0_4_8 - 0.001479301948052*G0_1_0_4_9 + 0.0111312905844159*G0_1_0_5_0 + 0.000949675324675344*G0_1_0_5_2 + 0.00065746753246755*G0_1_0_5_3 + 0.000164366883116885*G0_1_0_5_4 - 0.0120809659090913*G0_1_0_5_6 + 0.00180803571428578*G0_1_0_5_7 - 0.000657467532467567*G0_1_0_5_8 - 0.00197240259740263*G0_1_0_5_9 - 0.00366172889610402*G0_1_0_6_0 - 0.00101359577922081*G0_1_0_6_1 + 0.00292207792207804*G0_1_0_6_2 + 0.00238331980519487*G0_1_0_6_3 - 0.00254768668831176*G0_1_0_6_4 - 0.0120809659090913*G0_1_0_6_5 - 0.0241619318181826*G0_1_0_6_6 - 0.00115056818181822*G0_1_0_6_7 + 0.00304078733766244*G0_1_0_6_8 - 0.00591720779220798*G0_1_0_6_9 + 0.00599025974025994*G0_1_0_7_0 + 0.000858360389610425*G0_1_0_7_1 + 0.000164366883116888*G0_1_0_7_2 + 0.000493100649350669*G0_1_0_7_4 + 0.00180803571428578*G0_1_0_7_5 - 0.00115056818181822*G0_1_0_7_6 - 0.0134780844155849*G0_1_0_7_7 + 0.00328733766233778*G0_1_0_7_8 - 0.000986201298701328*G0_1_0_7_9 - 0.00373478084415597*G0_1_0_8_0 - 0.002237215909091*G0_1_0_8_1 - 0.000794439935064962*G0_1_0_8_2 - 0.00172585227272732*G0_1_0_8_3 + 0.00172585227272733*G0_1_0_8_4 - 0.000657467532467567*G0_1_0_8_5 + 0.00304078733766244*G0_1_0_8_6 + 0.00328733766233778*G0_1_0_8_7 - 0.0110125811688316*G0_1_0_8_8 - 0.00295860389610401*G0_1_0_8_9 + 0.00109577922077926*G0_1_0_9_0 - 0.000164366883116883*G0_1_0_9_1 + 0.000383522727272743*G0_1_0_9_2 + 0.000493100649350662*G0_1_0_9_3 - 0.001479301948052*G0_1_0_9_4 - 0.00197240259740263*G0_1_0_9_5 - 0.00591720779220798*G0_1_0_9_6 - 0.000986201298701328*G0_1_0_9_7 - 0.00295860389610401*G0_1_0_9_8 + 0.0295860389610399*G0_1_0_9_9; + A[31] = A[51] + 0.00254464285714293*G0_0_0_0_0 + 0.00127232142857148*G0_0_0_0_1 + 0.00483969155844175*G0_0_0_0_3 - 0.00359780844155858*G0_0_0_0_4 + 0.00463879870129886*G0_0_0_0_5 - 0.00505884740259758*G0_0_0_0_6 + 0.000620941558441569*G0_0_0_0_7 + 0.002976866883117*G0_0_0_0_8 + 0.00241071428571438*G0_0_0_0_9 + 0.00127232142857148*G0_0_0_1_0 + 0.0130275974025979*G0_0_0_1_1 + 0.00103490259740263*G0_0_0_1_2 + 0.019267451298702*G0_0_0_1_3 - 0.00818181818181847*G0_0_0_1_4 + 0.000894886363636393*G0_0_0_1_5 - 0.00113230519480524*G0_0_0_1_6 - 0.00507711038961059*G0_0_0_1_7 + 0.0103185876623381*G0_0_0_1_8 + 0.00339691558441571*G0_0_0_1_9 + 0.00103490259740263*G0_0_0_2_1 - 0.0164366883116889*G0_0_0_2_2 + 0.00909496753246785*G0_0_0_2_3 - 0.00684862012987039*G0_0_0_2_4 + 0.00416396103896121*G0_0_0_2_5 - 0.0117796266233771*G0_0_0_2_6 - 0.00272118506493516*G0_0_0_2_7 + 0.00368912337662351*G0_0_0_2_8 + 0.000986201298701333*G0_0_0_2_9 + 0.00483969155844175*G0_0_0_3_0 + 0.019267451298702*G0_0_0_3_1 + 0.00909496753246785*G0_0_0_3_2 + 0.0867857142857174*G0_0_0_3_3 - 0.026627435064936*G0_0_0_3_4 - 0.00690340909090933*G0_0_0_3_5 - 0.0179159902597409*G0_0_0_3_7 + 0.0323802759740272*G0_0_0_3_8 + 0.0256412337662347*G0_0_0_3_9 - 0.00359780844155857*G0_0_0_4_0 - 0.00818181818181847*G0_0_0_4_1 - 0.00684862012987039*G0_0_0_4_2 - 0.026627435064936*G0_0_0_4_3 + 0.00739650974025999*G0_0_0_4_5 - 0.00739650974026001*G0_0_0_4_6 + 0.0111769480519484*G0_0_0_4_7 - 0.0144642857142862*G0_0_0_4_8 - 0.017751623376624*G0_0_0_4_9 + 0.00463879870129885*G0_0_0_5_0 + 0.000894886363636393*G0_0_0_5_1 + 0.00416396103896121*G0_0_0_5_2 - 0.00690340909090933*G0_0_0_5_3 + 0.00739650974025999*G0_0_0_5_4 + 0.0335308441558452*G0_0_0_5_5 + 0.010355113636364*G0_0_0_5_6 + 0.00131493506493511*G0_0_0_5_7 - 0.00608157467532488*G0_0_0_5_8 + 0.00493100649350665*G0_0_0_5_9 - 0.00505884740259758*G0_0_0_6_0 - 0.00113230519480524*G0_0_0_6_1 - 0.0117796266233771*G0_0_0_6_2 - 0.00739650974026001*G0_0_0_6_4 + 0.010355113636364*G0_0_0_6_5 - 0.01479301948052*G0_0_0_6_6 + 0.00476663961038977*G0_0_0_6_7 - 0.00213676948051956*G0_0_0_6_8 - 0.00295860389610401*G0_0_0_6_9 + 0.000620941558441569*G0_0_0_7_0 - 0.00507711038961059*G0_0_0_7_1 - 0.00272118506493516*G0_0_0_7_2 - 0.0179159902597409*G0_0_0_7_3 + 0.0111769480519484*G0_0_0_7_4 + 0.00131493506493511*G0_0_0_7_5 + 0.00476663961038977*G0_0_0_7_6 - 0.00262987012987021*G0_0_0_7_7 - 0.0149573863636369*G0_0_0_7_8 - 0.0167654220779227*G0_0_0_7_9 + 0.002976866883117*G0_0_0_8_0 + 0.0103185876623381*G0_0_0_8_1 + 0.00368912337662351*G0_0_0_8_2 + 0.0323802759740272*G0_0_0_8_3 - 0.0144642857142862*G0_0_0_8_4 - 0.00608157467532488*G0_0_0_8_5 - 0.00213676948051956*G0_0_0_8_6 - 0.0149573863636369*G0_0_0_8_7 + 0.0358319805194819*G0_0_0_8_8 + 0.0187378246753254*G0_0_0_8_9 + 0.00241071428571438*G0_0_0_9_0 + 0.00339691558441571*G0_0_0_9_1 + 0.000986201298701333*G0_0_0_9_2 + 0.0256412337662347*G0_0_0_9_3 - 0.017751623376624*G0_0_0_9_4 + 0.00493100649350665*G0_0_0_9_5 - 0.00295860389610401*G0_0_0_9_6 - 0.0167654220779227*G0_0_0_9_7 + 0.0187378246753254*G0_0_0_9_8 - 0.0788961038961064*G0_0_0_9_9 - 0.0153348214285719*G0_1_0_0_0 + 0.00766741071428602*G0_1_0_0_1 + 0.0113504464285719*G0_1_0_0_3 - 0.00475750811688329*G0_1_0_0_4 - 0.0120535714285718*G0_1_0_0_5 + 0.0030955762987014*G0_1_0_0_6 - 0.0124918831168836*G0_1_0_0_7 + 0.0187652191558449*G0_1_0_0_8 + 0.0037256493506495*G0_1_0_0_9 + 0.00766741071428602*G0_1_0_1_0 + 0.124736201298706*G0_1_0_1_1 + 0.00778612012987039*G0_1_0_1_2 + 0.0785765016233793*G0_1_0_1_3 - 0.0360146103896116*G0_1_0_1_4 - 0.00223721590909099*G0_1_0_1_5 - 0.00122362012987017*G0_1_0_1_6 - 0.0375669642857157*G0_1_0_1_7 + 0.0830509334415616*G0_1_0_1_8 + 0.0149573863636369*G0_1_0_1_9 + 0.00778612012987039*G0_1_0_2_1 - 0.00584415584415606*G0_1_0_2_2 + 0.0157061688311694*G0_1_0_2_3 - 0.00875710227272758*G0_1_0_2_4 - 0.00151582792207796*G0_1_0_2_5 - 0.00384435876623391*G0_1_0_2_6 - 0.00519581980519499*G0_1_0_2_7 + 0.0119257305194809*G0_1_0_2_8 + 0.004437905844156*G0_1_0_2_9 + 0.0113504464285719*G0_1_0_3_0 + 0.0785765016233793*G0_1_0_3_1 + 0.0157061688311694*G0_1_0_3_2 + 0.16798295454546*G0_1_0_3_3 - 0.0652536525974048*G0_1_0_3_4 - 0.00788961038961066*G0_1_0_3_5 - 0.00788961038961067*G0_1_0_3_6 - 0.0456118100649368*G0_1_0_3_7 + 0.0929494724026008*G0_1_0_3_8 + 0.0463514610389628*G0_1_0_3_9 - 0.00475750811688329*G0_1_0_4_0 - 0.0360146103896116*G0_1_0_4_1 - 0.00875710227272758*G0_1_0_4_2 - 0.0652536525974048*G0_1_0_4_3 + 0.0407629870129884*G0_1_0_4_4 + 0.00271205357142866*G0_1_0_4_5 + 0.00517755681818199*G0_1_0_4_6 + 0.020710227272728*G0_1_0_4_7 - 0.047337662337664*G0_1_0_4_8 - 0.0187378246753254*G0_1_0_4_9 - 0.0120535714285718*G0_1_0_5_0 - 0.00223721590909099*G0_1_0_5_1 - 0.00151582792207796*G0_1_0_5_2 - 0.00788961038961066*G0_1_0_5_3 + 0.00271205357142866*G0_1_0_5_4 - 0.00131493506493512*G0_1_0_5_5 + 0.0127384334415589*G0_1_0_5_6 + 0.000821834415584452*G0_1_0_5_7 - 0.00484882305194822*G0_1_0_5_8 - 0.00147930194805203*G0_1_0_5_9 + 0.0030955762987014*G0_1_0_6_0 - 0.00122362012987017*G0_1_0_6_1 - 0.00384435876623391*G0_1_0_6_2 - 0.00788961038961067*G0_1_0_6_3 + 0.00517755681818199*G0_1_0_6_4 + 0.0127384334415589*G0_1_0_6_5 + 0.0228469967532475*G0_1_0_6_6 + 0.00402698863636378*G0_1_0_6_7 - 0.0102729301948055*G0_1_0_6_8 + 0.00246550324675332*G0_1_0_6_9 - 0.0124918831168836*G0_1_0_7_0 - 0.0375669642857157*G0_1_0_7_1 - 0.00519581980519499*G0_1_0_7_2 - 0.0456118100649368*G0_1_0_7_3 + 0.020710227272728*G0_1_0_7_4 + 0.000821834415584452*G0_1_0_7_5 + 0.00402698863636378*G0_1_0_7_6 + 0.0420779220779236*G0_1_0_7_7 - 0.0710886769480546*G0_1_0_7_8 - 0.019230925324676*G0_1_0_7_9 + 0.0187652191558449*G0_1_0_8_0 + 0.0830509334415616*G0_1_0_8_1 + 0.0119257305194809*G0_1_0_8_2 + 0.0929494724026008*G0_1_0_8_3 - 0.047337662337664*G0_1_0_8_4 - 0.00484882305194822*G0_1_0_8_5 - 0.0102729301948055*G0_1_0_8_6 - 0.0710886769480546*G0_1_0_8_7 + 0.193459821428578*G0_1_0_8_8 + 0.0498031655844174*G0_1_0_8_9 + 0.0037256493506495*G0_1_0_9_0 + 0.0149573863636369*G0_1_0_9_1 + 0.004437905844156*G0_1_0_9_2 + 0.0463514610389628*G0_1_0_9_3 - 0.0187378246753254*G0_1_0_9_4 - 0.00147930194805203*G0_1_0_9_5 + 0.00246550324675332*G0_1_0_9_6 - 0.019230925324676*G0_1_0_9_7 + 0.0498031655844174*G0_1_0_9_8 - 0.00394480519480522*G0_1_0_9_9; + A[22] = 0.00289096320346331*G0_1_1_0_0 + 0.000851934523809557*G0_1_1_0_1 + 0.00448626893939412*G0_1_1_0_2 - 0.00192674512987021*G0_1_1_0_3 + 0.00503145292207812*G0_1_1_0_4 - 0.00264204545454556*G0_1_1_0_5 + 0.0067025162337665*G0_1_1_0_6 + 0.00104707792207796*G0_1_1_0_7 - 0.000675730519480542*G0_1_1_0_8 + 0.00224025974025983*G0_1_1_0_9 + 0.000851934523809557*G0_1_1_1_0 + 0.0028909632034633*G0_1_1_1_1 + 0.00448626893939411*G0_1_1_1_2 - 0.00264204545454555*G0_1_1_1_3 + 0.00670251623376648*G0_1_1_1_4 - 0.0019267451298702*G0_1_1_1_5 + 0.00503145292207811*G0_1_1_1_6 - 0.000675730519480544*G0_1_1_1_7 + 0.00104707792207796*G0_1_1_1_8 + 0.00224025974025982*G0_1_1_1_9 + 0.00448626893939412*G0_1_1_2_0 + 0.00448626893939411*G0_1_1_2_1 + 0.0703057359307383*G0_1_1_2_2 - 0.0194500811688318*G0_1_1_2_3 + 0.0427049512987028*G0_1_1_2_4 - 0.0194500811688319*G0_1_1_2_5 + 0.0427049512987029*G0_1_1_2_6 - 0.000776176948051975*G0_1_1_2_7 - 0.000776176948051974*G0_1_1_2_8 + 0.00760957792207818*G0_1_1_2_9 - 0.00192674512987021*G0_1_1_3_0 - 0.00264204545454555*G0_1_1_3_1 - 0.0194500811688318*G0_1_1_3_2 + 0.0184821428571435*G0_1_1_3_3 - 0.0325537743506505*G0_1_1_3_4 + 0.00880275974026005*G0_1_1_3_5 - 0.0211394074675332*G0_1_1_3_6 - 0.000264813311688322*G0_1_1_3_7 + 0.0039813311688313*G0_1_1_3_8 - 0.00619115259740281*G0_1_1_3_9 + 0.00503145292207812*G0_1_1_4_0 + 0.00670251623376648*G0_1_1_4_1 + 0.0427049512987028*G0_1_1_4_2 - 0.0325537743506505*G0_1_1_4_3 + 0.0845576298701329*G0_1_1_4_4 - 0.0211394074675332*G0_1_1_4_5 + 0.0422788149350665*G0_1_1_4_6 - 0.00336038961038973*G0_1_1_4_7 - 0.00371651785714298*G0_1_1_4_8 + 0.0194500811688319*G0_1_1_4_9 - 0.00264204545454556*G0_1_1_5_0 - 0.0019267451298702*G0_1_1_5_1 - 0.0194500811688319*G0_1_1_5_2 + 0.00880275974026005*G0_1_1_5_3 - 0.0211394074675332*G0_1_1_5_4 + 0.0184821428571435*G0_1_1_5_5 - 0.0325537743506505*G0_1_1_5_6 + 0.0039813311688313*G0_1_1_5_7 - 0.000264813311688321*G0_1_1_5_8 - 0.00619115259740282*G0_1_1_5_9 + 0.0067025162337665*G0_1_1_6_0 + 0.00503145292207811*G0_1_1_6_1 + 0.0427049512987029*G0_1_1_6_2 - 0.0211394074675332*G0_1_1_6_3 + 0.0422788149350665*G0_1_1_6_4 - 0.0325537743506505*G0_1_1_6_5 + 0.0845576298701329*G0_1_1_6_6 - 0.00371651785714298*G0_1_1_6_7 - 0.00336038961038972*G0_1_1_6_8 + 0.0194500811688319*G0_1_1_6_9 + 0.00104707792207796*G0_1_1_7_0 - 0.000675730519480544*G0_1_1_7_1 - 0.000776176948051976*G0_1_1_7_2 - 0.000264813311688322*G0_1_1_7_3 - 0.00336038961038973*G0_1_1_7_4 + 0.0039813311688313*G0_1_1_7_5 - 0.00371651785714298*G0_1_1_7_6 + 0.013222402597403*G0_1_1_7_7 - 0.0028033685064936*G0_1_1_7_8 + 0.000712256493506519*G0_1_1_7_9 - 0.000675730519480542*G0_1_1_8_0 + 0.00104707792207796*G0_1_1_8_1 - 0.000776176948051974*G0_1_1_8_2 + 0.0039813311688313*G0_1_1_8_3 - 0.00371651785714298*G0_1_1_8_4 - 0.00026481331168832*G0_1_1_8_5 - 0.00336038961038972*G0_1_1_8_6 - 0.0028033685064936*G0_1_1_8_7 + 0.013222402597403*G0_1_1_8_8 + 0.000712256493506509*G0_1_1_8_9 + 0.00224025974025983*G0_1_1_9_0 + 0.00224025974025982*G0_1_1_9_1 + 0.00760957792207818*G0_1_1_9_2 - 0.00619115259740281*G0_1_1_9_3 + 0.0194500811688319*G0_1_1_9_4 - 0.00619115259740282*G0_1_1_9_5 + 0.0194500811688319*G0_1_1_9_6 + 0.000712256493506519*G0_1_1_9_7 + 0.000712256493506509*G0_1_1_9_8 + 0.0282711038961049*G0_1_1_9_9; + A[54] = A[45] + 0.00447443181818205*G0_0_1_0_0 + 0.000292207792207807*G0_0_1_0_1 - 0.00276684253246765*G0_0_1_0_2 + 0.00213676948051957*G0_0_1_0_3 + 0.000657467532467542*G0_0_1_0_4 + 0.00550629058441582*G0_0_1_0_5 - 0.00238331980519491*G0_0_1_0_6 + 0.00394480519480538*G0_0_1_0_7 - 0.00271205357142868*G0_0_1_0_8 + 0.005917207792208*G0_0_1_0_9 + 0.000292207792207808*G0_0_1_1_0 - 0.00138798701298701*G0_0_1_1_1 - 0.00386262175324689*G0_0_1_1_2 - 0.00139711850649353*G0_0_1_1_3 - 0.00608157467532491*G0_0_1_1_4 + 0.000164366883116905*G0_0_1_1_5 + 0.000657467532467547*G0_0_1_1_6 + 0.000986201298701335*G0_0_1_1_7 - 0.000986201298701313*G0_0_1_1_8 - 0.00345170454545466*G0_0_1_1_9 - 0.00276684253246765*G0_0_1_2_0 - 0.00386262175324689*G0_0_1_2_1 - 0.0734172077922103*G0_0_1_2_2 + 0.0167654220779226*G0_0_1_2_3 - 0.0456118100649367*G0_0_1_2_4 + 0.0142999188311694*G0_0_1_2_5 - 0.0283532873376634*G0_0_1_2_6 + 0.00262987012987023*G0_0_1_2_7 + 0.000164366883116888*G0_0_1_2_8 - 0.00641030844155866*G0_0_1_2_9 + 0.00213676948051957*G0_0_1_3_0 - 0.00139711850649353*G0_0_1_3_1 + 0.0167654220779227*G0_0_1_3_2 + 0.0414204545454561*G0_0_1_3_3 + 0.036242897727274*G0_0_1_3_4 - 0.00443790584415603*G0_0_1_3_5 - 0.00443790584415603*G0_0_1_3_7 + 0.00295860389610402*G0_0_1_3_8 + 0.019230925324676*G0_0_1_3_9 + 0.000657467532467542*G0_0_1_4_0 - 0.00608157467532491*G0_0_1_4_1 - 0.0456118100649367*G0_0_1_4_2 + 0.036242897727274*G0_0_1_4_3 - 0.00591720779220799*G0_0_1_4_7 + 0.00147930194805199*G0_0_1_4_8 + 0.0192309253246759*G0_0_1_4_9 + 0.00550629058441581*G0_0_1_5_0 + 0.000164366883116905*G0_0_1_5_1 + 0.0142999188311694*G0_0_1_5_2 - 0.00443790584415602*G0_0_1_5_3 - 0.000739650974025974*G0_0_1_5_6 + 0.00443790584415608*G0_0_1_5_7 + 0.00147930194805196*G0_0_1_5_8 - 0.0207102272727279*G0_0_1_5_9 - 0.00238331980519491*G0_0_1_6_0 + 0.000657467532467547*G0_0_1_6_1 - 0.0283532873376634*G0_0_1_6_2 - 0.000739650974025974*G0_0_1_6_5 + 0.0739650974025998*G0_0_1_6_6 - 0.00591720779220803*G0_0_1_6_7 - 0.00221895292207798*G0_0_1_6_8 + 0.0192309253246759*G0_0_1_6_9 + 0.00394480519480538*G0_0_1_7_0 + 0.000986201298701335*G0_0_1_7_1 + 0.00262987012987023*G0_0_1_7_2 - 0.00443790584415603*G0_0_1_7_3 - 0.00591720779220799*G0_0_1_7_4 + 0.00443790584415608*G0_0_1_7_5 - 0.00591720779220803*G0_0_1_7_6 + 0.0207102272727282*G0_0_1_7_7 - 0.00147930194805208*G0_0_1_7_8 - 0.00591720779220791*G0_0_1_7_9 - 0.00271205357142869*G0_0_1_8_0 - 0.000986201298701313*G0_0_1_8_1 + 0.000164366883116888*G0_0_1_8_2 + 0.00295860389610402*G0_0_1_8_3 + 0.00147930194805199*G0_0_1_8_4 + 0.00147930194805195*G0_0_1_8_5 - 0.00221895292207798*G0_0_1_8_6 - 0.00147930194805208*G0_0_1_8_7 + 0.0029586038961041*G0_0_1_8_8 + 0.00739650974026*G0_0_1_8_9 + 0.005917207792208*G0_0_1_9_0 - 0.00345170454545466*G0_0_1_9_1 - 0.00641030844155866*G0_0_1_9_2 + 0.019230925324676*G0_0_1_9_3 + 0.0192309253246759*G0_0_1_9_4 - 0.0207102272727279*G0_0_1_9_5 + 0.0192309253246759*G0_0_1_9_6 - 0.00591720779220791*G0_0_1_9_7 + 0.00739650974026*G0_0_1_9_8 - 0.0887581168831197*G0_0_1_9_9 - 0.00447443181818205*G0_1_0_0_0 - 0.000292207792207807*G0_1_0_0_1 + 0.00276684253246765*G0_1_0_0_2 - 0.00213676948051957*G0_1_0_0_3 - 0.000657467532467541*G0_1_0_0_4 - 0.00550629058441582*G0_1_0_0_5 + 0.00238331980519491*G0_1_0_0_6 - 0.00394480519480538*G0_1_0_0_7 + 0.00271205357142869*G0_1_0_0_8 - 0.005917207792208*G0_1_0_0_9 - 0.000292207792207807*G0_1_0_1_0 + 0.00138798701298701*G0_1_0_1_1 + 0.00386262175324689*G0_1_0_1_2 + 0.00139711850649353*G0_1_0_1_3 + 0.00608157467532491*G0_1_0_1_4 - 0.000164366883116905*G0_1_0_1_5 - 0.000657467532467548*G0_1_0_1_6 - 0.000986201298701335*G0_1_0_1_7 + 0.000986201298701313*G0_1_0_1_8 + 0.00345170454545466*G0_1_0_1_9 + 0.00276684253246765*G0_1_0_2_0 + 0.00386262175324689*G0_1_0_2_1 + 0.0734172077922103*G0_1_0_2_2 - 0.0167654220779227*G0_1_0_2_3 + 0.0456118100649367*G0_1_0_2_4 - 0.0142999188311694*G0_1_0_2_5 + 0.0283532873376634*G0_1_0_2_6 - 0.00262987012987023*G0_1_0_2_7 - 0.000164366883116888*G0_1_0_2_8 + 0.00641030844155866*G0_1_0_2_9 - 0.00213676948051957*G0_1_0_3_0 + 0.00139711850649353*G0_1_0_3_1 - 0.0167654220779227*G0_1_0_3_2 - 0.0414204545454561*G0_1_0_3_3 - 0.036242897727274*G0_1_0_3_4 + 0.00443790584415603*G0_1_0_3_5 + 0.00443790584415603*G0_1_0_3_7 - 0.00295860389610402*G0_1_0_3_8 - 0.019230925324676*G0_1_0_3_9 - 0.000657467532467542*G0_1_0_4_0 + 0.00608157467532491*G0_1_0_4_1 + 0.0456118100649367*G0_1_0_4_2 - 0.036242897727274*G0_1_0_4_3 + 0.00591720779220799*G0_1_0_4_7 - 0.00147930194805199*G0_1_0_4_8 - 0.0192309253246759*G0_1_0_4_9 - 0.00550629058441582*G0_1_0_5_0 - 0.000164366883116904*G0_1_0_5_1 - 0.0142999188311694*G0_1_0_5_2 + 0.00443790584415603*G0_1_0_5_3 + 0.000739650974025974*G0_1_0_5_6 - 0.00443790584415608*G0_1_0_5_7 - 0.00147930194805196*G0_1_0_5_8 + 0.0207102272727279*G0_1_0_5_9 + 0.00238331980519491*G0_1_0_6_0 - 0.000657467532467548*G0_1_0_6_1 + 0.0283532873376634*G0_1_0_6_2 + 0.000739650974025974*G0_1_0_6_5 - 0.0739650974025998*G0_1_0_6_6 + 0.00591720779220803*G0_1_0_6_7 + 0.00221895292207798*G0_1_0_6_8 - 0.0192309253246759*G0_1_0_6_9 - 0.00394480519480538*G0_1_0_7_0 - 0.000986201298701335*G0_1_0_7_1 - 0.00262987012987023*G0_1_0_7_2 + 0.00443790584415602*G0_1_0_7_3 + 0.00591720779220799*G0_1_0_7_4 - 0.00443790584415608*G0_1_0_7_5 + 0.00591720779220803*G0_1_0_7_6 - 0.0207102272727282*G0_1_0_7_7 + 0.00147930194805208*G0_1_0_7_8 + 0.00591720779220791*G0_1_0_7_9 + 0.00271205357142869*G0_1_0_8_0 + 0.000986201298701313*G0_1_0_8_1 - 0.000164366883116888*G0_1_0_8_2 - 0.00295860389610402*G0_1_0_8_3 - 0.00147930194805199*G0_1_0_8_4 - 0.00147930194805195*G0_1_0_8_5 + 0.00221895292207798*G0_1_0_8_6 + 0.00147930194805208*G0_1_0_8_7 - 0.0029586038961041*G0_1_0_8_8 - 0.00739650974025999*G0_1_0_8_9 - 0.005917207792208*G0_1_0_9_0 + 0.00345170454545466*G0_1_0_9_1 + 0.00641030844155866*G0_1_0_9_2 - 0.019230925324676*G0_1_0_9_3 - 0.0192309253246759*G0_1_0_9_4 + 0.0207102272727279*G0_1_0_9_5 - 0.0192309253246759*G0_1_0_9_6 + 0.00591720779220791*G0_1_0_9_7 - 0.00739650974025999*G0_1_0_9_8 + 0.0887581168831197*G0_1_0_9_9; + A[10] = A[1] - 0.011194534632035*G0_0_1_0_0 - 0.000970643939393975*G0_0_1_0_1 - 0.000851934523809553*G0_0_1_0_2 - 0.00056615259740262*G0_0_1_0_3 + 0.0004474431818182*G0_0_1_0_4 - 0.00823356331168858*G0_0_1_0_5 + 0.00348823051948063*G0_0_1_0_6 - 0.00375913149350661*G0_0_1_0_7 + 0.00193587662337668*G0_0_1_0_8 - 0.000980113636363676*G0_0_1_0_9 - 0.000970643939393975*G0_0_1_1_0 - 0.011194534632035*G0_0_1_1_1 - 0.000851934523809553*G0_0_1_1_2 - 0.00823356331168859*G0_0_1_1_3 + 0.00348823051948063*G0_0_1_1_4 - 0.000566152597402614*G0_0_1_1_5 + 0.000447443181818197*G0_0_1_1_6 + 0.0019358766233767*G0_0_1_1_7 - 0.00375913149350664*G0_0_1_1_8 - 0.000980113636363677*G0_0_1_1_9 - 0.000851934523809553*G0_0_1_2_0 - 0.000851934523809553*G0_0_1_2_1 - 0.00170386904761912*G0_0_1_2_2 - 0.00112317370129874*G0_0_1_2_3 - 0.00112317370129873*G0_0_1_2_5 - 0.000267857142857154*G0_0_1_2_9 - 0.00056615259740262*G0_0_1_3_0 - 0.00823356331168859*G0_0_1_3_1 - 0.00112317370129874*G0_0_1_3_2 - 0.0222625811688319*G0_0_1_3_3 + 0.00658380681818204*G0_0_1_3_4 + 0.00114143668831172*G0_0_1_3_5 - 0.00022828733766234*G0_0_1_3_6 + 0.00281250000000011*G0_0_1_3_7 - 0.00389914772727288*G0_0_1_3_8 - 0.0026846590909092*G0_0_1_3_9 + 0.0004474431818182*G0_0_1_4_0 + 0.00348823051948063*G0_0_1_4_1 + 0.00658380681818204*G0_0_1_4_3 + 0.00189935064935072*G0_0_1_4_4 - 0.000228287337662343*G0_0_1_4_5 + 0.000456574675324688*G0_0_1_4_6 - 0.00124188311688317*G0_0_1_4_7 + 0.00108664772727277*G0_0_1_4_8 + 0.00126014610389615*G0_0_1_4_9 - 0.00823356331168858*G0_0_1_5_0 - 0.000566152597402614*G0_0_1_5_1 - 0.00112317370129873*G0_0_1_5_2 + 0.00114143668831172*G0_0_1_5_3 - 0.000228287337662343*G0_0_1_5_4 - 0.0222625811688319*G0_0_1_5_5 + 0.00658380681818203*G0_0_1_5_6 - 0.00389914772727285*G0_0_1_5_7 + 0.00281250000000009*G0_0_1_5_8 - 0.00268465909090919*G0_0_1_5_9 + 0.00348823051948063*G0_0_1_6_0 + 0.000447443181818197*G0_0_1_6_1 - 0.00022828733766234*G0_0_1_6_3 + 0.000456574675324688*G0_0_1_6_4 + 0.00658380681818203*G0_0_1_6_5 + 0.00189935064935072*G0_0_1_6_6 + 0.00108664772727276*G0_0_1_6_7 - 0.00124188311688316*G0_0_1_6_8 + 0.00126014610389615*G0_0_1_6_9 - 0.00375913149350661*G0_0_1_7_0 + 0.0019358766233767*G0_0_1_7_1 + 0.00281250000000011*G0_0_1_7_3 - 0.00124188311688317*G0_0_1_7_4 - 0.00389914772727285*G0_0_1_7_5 + 0.00108664772727276*G0_0_1_7_6 + 0.00321428571428583*G0_0_1_7_7 + 0.00074878246753251*G0_0_1_7_8 + 0.000767045454545489*G0_0_1_7_9 + 0.00193587662337668*G0_0_1_8_0 - 0.00375913149350664*G0_0_1_8_1 - 0.00389914772727288*G0_0_1_8_3 + 0.00108664772727277*G0_0_1_8_4 + 0.00281250000000009*G0_0_1_8_5 - 0.00124188311688316*G0_0_1_8_6 + 0.00074878246753251*G0_0_1_8_7 + 0.00321428571428579*G0_0_1_8_8 + 0.000767045454545473*G0_0_1_8_9 - 0.000980113636363675*G0_0_1_9_0 - 0.000980113636363677*G0_0_1_9_1 - 0.000267857142857154*G0_0_1_9_2 - 0.0026846590909092*G0_0_1_9_3 + 0.00126014610389615*G0_0_1_9_4 - 0.00268465909090919*G0_0_1_9_5 + 0.00126014610389615*G0_0_1_9_6 + 0.000767045454545489*G0_0_1_9_7 + 0.000767045454545473*G0_0_1_9_8 - 0.0105194805194809*G0_0_1_9_9 + 0.011194534632035*G0_1_0_0_0 + 0.000970643939393975*G0_1_0_0_1 + 0.000851934523809553*G0_1_0_0_2 + 0.00056615259740262*G0_1_0_0_3 - 0.0004474431818182*G0_1_0_0_4 + 0.00823356331168858*G0_1_0_0_5 - 0.00348823051948063*G0_1_0_0_6 + 0.00375913149350661*G0_1_0_0_7 - 0.00193587662337668*G0_1_0_0_8 + 0.000980113636363676*G0_1_0_0_9 + 0.000970643939393975*G0_1_0_1_0 + 0.011194534632035*G0_1_0_1_1 + 0.000851934523809553*G0_1_0_1_2 + 0.00823356331168859*G0_1_0_1_3 - 0.00348823051948063*G0_1_0_1_4 + 0.000566152597402614*G0_1_0_1_5 - 0.000447443181818197*G0_1_0_1_6 - 0.0019358766233767*G0_1_0_1_7 + 0.00375913149350664*G0_1_0_1_8 + 0.000980113636363677*G0_1_0_1_9 + 0.000851934523809552*G0_1_0_2_0 + 0.000851934523809553*G0_1_0_2_1 + 0.00170386904761912*G0_1_0_2_2 + 0.00112317370129874*G0_1_0_2_3 + 0.00112317370129873*G0_1_0_2_5 + 0.000267857142857154*G0_1_0_2_9 + 0.00056615259740262*G0_1_0_3_0 + 0.00823356331168859*G0_1_0_3_1 + 0.00112317370129874*G0_1_0_3_2 + 0.0222625811688319*G0_1_0_3_3 - 0.00658380681818204*G0_1_0_3_4 - 0.00114143668831172*G0_1_0_3_5 + 0.00022828733766234*G0_1_0_3_6 - 0.00281250000000011*G0_1_0_3_7 + 0.00389914772727288*G0_1_0_3_8 + 0.0026846590909092*G0_1_0_3_9 - 0.0004474431818182*G0_1_0_4_0 - 0.00348823051948063*G0_1_0_4_1 - 0.00658380681818204*G0_1_0_4_3 - 0.00189935064935072*G0_1_0_4_4 + 0.000228287337662343*G0_1_0_4_5 - 0.000456574675324688*G0_1_0_4_6 + 0.00124188311688316*G0_1_0_4_7 - 0.00108664772727277*G0_1_0_4_8 - 0.00126014610389615*G0_1_0_4_9 + 0.00823356331168858*G0_1_0_5_0 + 0.000566152597402614*G0_1_0_5_1 + 0.00112317370129873*G0_1_0_5_2 - 0.00114143668831172*G0_1_0_5_3 + 0.000228287337662343*G0_1_0_5_4 + 0.0222625811688319*G0_1_0_5_5 - 0.00658380681818203*G0_1_0_5_6 + 0.00389914772727285*G0_1_0_5_7 - 0.00281250000000009*G0_1_0_5_8 + 0.00268465909090919*G0_1_0_5_9 - 0.00348823051948063*G0_1_0_6_0 - 0.000447443181818197*G0_1_0_6_1 + 0.00022828733766234*G0_1_0_6_3 - 0.000456574675324688*G0_1_0_6_4 - 0.00658380681818203*G0_1_0_6_5 - 0.00189935064935072*G0_1_0_6_6 - 0.00108664772727276*G0_1_0_6_7 + 0.00124188311688316*G0_1_0_6_8 - 0.00126014610389615*G0_1_0_6_9 + 0.00375913149350661*G0_1_0_7_0 - 0.0019358766233767*G0_1_0_7_1 - 0.00281250000000011*G0_1_0_7_3 + 0.00124188311688317*G0_1_0_7_4 + 0.00389914772727285*G0_1_0_7_5 - 0.00108664772727276*G0_1_0_7_6 - 0.00321428571428583*G0_1_0_7_7 - 0.00074878246753251*G0_1_0_7_8 - 0.000767045454545489*G0_1_0_7_9 - 0.00193587662337668*G0_1_0_8_0 + 0.00375913149350664*G0_1_0_8_1 + 0.00389914772727288*G0_1_0_8_3 - 0.00108664772727277*G0_1_0_8_4 - 0.00281250000000009*G0_1_0_8_5 + 0.00124188311688316*G0_1_0_8_6 - 0.00074878246753251*G0_1_0_8_7 - 0.00321428571428579*G0_1_0_8_8 - 0.000767045454545473*G0_1_0_8_9 + 0.000980113636363676*G0_1_0_9_0 + 0.000980113636363677*G0_1_0_9_1 + 0.000267857142857154*G0_1_0_9_2 + 0.0026846590909092*G0_1_0_9_3 - 0.00126014610389615*G0_1_0_9_4 + 0.00268465909090919*G0_1_0_9_5 - 0.00126014610389615*G0_1_0_9_6 - 0.000767045454545489*G0_1_0_9_7 - 0.000767045454545473*G0_1_0_9_8 + 0.0105194805194809*G0_1_0_9_9; + A[27] = A[72] - 0.0164671266233772*G0_0_1_0_0 - 0.00109882305194809*G0_0_1_0_1 - 0.000566152597402615*G0_0_1_0_2 + 0.000273944805194819*G0_0_1_0_3 + 0.00021915584415585*G0_0_1_0_4 - 0.00599025974025993*G0_0_1_0_5 + 0.00373478084415597*G0_0_1_0_6 - 0.011131290584416*G0_0_1_0_7 + 0.00366172889610402*G0_0_1_0_8 - 0.00109577922077926*G0_0_1_0_9 - 0.00109882305194809*G0_0_1_1_0 - 0.00697646103896126*G0_0_1_1_1 - 0.000447443181818196*G0_0_1_1_2 - 0.00225547889610396*G0_0_1_1_3 + 0.000675730519480538*G0_0_1_1_4 - 0.000164366883116888*G0_0_1_1_5 + 0.000794439935064962*G0_0_1_1_6 - 0.000949675324675352*G0_0_1_1_7 - 0.00292207792207803*G0_0_1_1_8 - 0.000383522727272741*G0_0_1_1_9 - 0.000566152597402615*G0_0_1_2_0 - 0.000447443181818196*G0_0_1_2_1 + 0.000693993506493532*G0_0_1_2_3 - 0.00223721590909099*G0_0_1_2_4 - 0.000858360389610415*G0_0_1_2_5 + 0.00223721590909098*G0_0_1_2_6 + 0.00101359577922081*G0_0_1_2_8 + 0.000164366883116888*G0_0_1_2_9 + 0.000273944805194819*G0_0_1_3_0 - 0.00225547889610396*G0_0_1_3_1 + 0.000693993506493532*G0_0_1_3_2 + 0.0121631493506498*G0_0_1_3_3 + 0.00254768668831178*G0_0_1_3_4 - 0.000493100649350663*G0_0_1_3_5 - 0.00172585227272733*G0_0_1_3_6 - 0.000164366883116892*G0_0_1_3_7 + 0.00254768668831176*G0_0_1_3_8 + 0.001479301948052*G0_0_1_3_9 + 0.00021915584415585*G0_0_1_4_0 + 0.000675730519480538*G0_0_1_4_1 - 0.00223721590909099*G0_0_1_4_2 + 0.00254768668831178*G0_0_1_4_3 - 0.0144642857142862*G0_0_1_4_4 + 0.00172585227272733*G0_0_1_4_6 - 0.000657467532467554*G0_0_1_4_7 - 0.00238331980519488*G0_0_1_4_8 - 0.000493100649350662*G0_0_1_4_9 - 0.00599025974025993*G0_0_1_5_0 - 0.000164366883116888*G0_0_1_5_1 - 0.000858360389610415*G0_0_1_5_2 - 0.000493100649350663*G0_0_1_5_3 + 0.0134780844155849*G0_0_1_5_5 - 0.00328733766233778*G0_0_1_5_6 - 0.00180803571428576*G0_0_1_5_7 + 0.00115056818181821*G0_0_1_5_8 + 0.000986201298701339*G0_0_1_5_9 + 0.00373478084415597*G0_0_1_6_0 + 0.000794439935064962*G0_0_1_6_1 + 0.00223721590909098*G0_0_1_6_2 - 0.00172585227272733*G0_0_1_6_3 + 0.00172585227272733*G0_0_1_6_4 - 0.00328733766233778*G0_0_1_6_5 + 0.0110125811688316*G0_0_1_6_6 + 0.000657467532467549*G0_0_1_6_7 - 0.00304078733766243*G0_0_1_6_8 + 0.002958603896104*G0_0_1_6_9 - 0.011131290584416*G0_0_1_7_0 - 0.000949675324675351*G0_0_1_7_1 - 0.000164366883116892*G0_0_1_7_3 - 0.000657467532467554*G0_0_1_7_4 - 0.00180803571428576*G0_0_1_7_5 + 0.000657467532467549*G0_0_1_7_6 + 0.0120809659090913*G0_0_1_7_8 + 0.00197240259740267*G0_0_1_7_9 + 0.00366172889610402*G0_0_1_8_0 - 0.00292207792207803*G0_0_1_8_1 + 0.00101359577922081*G0_0_1_8_2 + 0.00254768668831176*G0_0_1_8_3 - 0.00238331980519488*G0_0_1_8_4 + 0.00115056818181821*G0_0_1_8_5 - 0.00304078733766243*G0_0_1_8_6 + 0.0120809659090913*G0_0_1_8_7 + 0.0241619318181826*G0_0_1_8_8 + 0.00591720779220798*G0_0_1_8_9 - 0.00109577922077926*G0_0_1_9_0 - 0.000383522727272741*G0_0_1_9_1 + 0.000164366883116888*G0_0_1_9_2 + 0.001479301948052*G0_0_1_9_3 - 0.000493100649350662*G0_0_1_9_4 + 0.000986201298701338*G0_0_1_9_5 + 0.002958603896104*G0_0_1_9_6 + 0.00197240259740267*G0_0_1_9_7 + 0.00591720779220798*G0_0_1_9_8 - 0.0295860389610399*G0_0_1_9_9 + 0.0164671266233772*G0_1_0_0_0 + 0.00109882305194809*G0_1_0_0_1 + 0.000566152597402615*G0_1_0_0_2 - 0.000273944805194819*G0_1_0_0_3 - 0.00021915584415585*G0_1_0_0_4 + 0.00599025974025993*G0_1_0_0_5 - 0.00373478084415597*G0_1_0_0_6 + 0.011131290584416*G0_1_0_0_7 - 0.00366172889610402*G0_1_0_0_8 + 0.00109577922077926*G0_1_0_0_9 + 0.00109882305194809*G0_1_0_1_0 + 0.00697646103896126*G0_1_0_1_1 + 0.000447443181818196*G0_1_0_1_2 + 0.00225547889610396*G0_1_0_1_3 - 0.000675730519480538*G0_1_0_1_4 + 0.000164366883116889*G0_1_0_1_5 - 0.000794439935064962*G0_1_0_1_6 + 0.000949675324675352*G0_1_0_1_7 + 0.00292207792207803*G0_1_0_1_8 + 0.000383522727272741*G0_1_0_1_9 + 0.000566152597402615*G0_1_0_2_0 + 0.000447443181818196*G0_1_0_2_1 - 0.000693993506493532*G0_1_0_2_3 + 0.00223721590909099*G0_1_0_2_4 + 0.000858360389610415*G0_1_0_2_5 - 0.00223721590909098*G0_1_0_2_6 - 0.00101359577922081*G0_1_0_2_8 - 0.000164366883116888*G0_1_0_2_9 - 0.000273944805194819*G0_1_0_3_0 + 0.00225547889610396*G0_1_0_3_1 - 0.000693993506493532*G0_1_0_3_2 - 0.0121631493506498*G0_1_0_3_3 - 0.00254768668831178*G0_1_0_3_4 + 0.000493100649350663*G0_1_0_3_5 + 0.00172585227272733*G0_1_0_3_6 + 0.000164366883116892*G0_1_0_3_7 - 0.00254768668831176*G0_1_0_3_8 - 0.001479301948052*G0_1_0_3_9 - 0.00021915584415585*G0_1_0_4_0 - 0.000675730519480538*G0_1_0_4_1 + 0.00223721590909099*G0_1_0_4_2 - 0.00254768668831178*G0_1_0_4_3 + 0.0144642857142862*G0_1_0_4_4 - 0.00172585227272733*G0_1_0_4_6 + 0.000657467532467554*G0_1_0_4_7 + 0.00238331980519488*G0_1_0_4_8 + 0.000493100649350662*G0_1_0_4_9 + 0.00599025974025993*G0_1_0_5_0 + 0.000164366883116888*G0_1_0_5_1 + 0.000858360389610415*G0_1_0_5_2 + 0.000493100649350663*G0_1_0_5_3 - 0.0134780844155849*G0_1_0_5_5 + 0.00328733766233778*G0_1_0_5_6 + 0.00180803571428576*G0_1_0_5_7 - 0.00115056818181821*G0_1_0_5_8 - 0.000986201298701339*G0_1_0_5_9 - 0.00373478084415597*G0_1_0_6_0 - 0.000794439935064962*G0_1_0_6_1 - 0.00223721590909098*G0_1_0_6_2 + 0.00172585227272733*G0_1_0_6_3 - 0.00172585227272733*G0_1_0_6_4 + 0.00328733766233778*G0_1_0_6_5 - 0.0110125811688316*G0_1_0_6_6 - 0.00065746753246755*G0_1_0_6_7 + 0.00304078733766243*G0_1_0_6_8 - 0.002958603896104*G0_1_0_6_9 + 0.011131290584416*G0_1_0_7_0 + 0.000949675324675352*G0_1_0_7_1 + 0.000164366883116892*G0_1_0_7_3 + 0.000657467532467554*G0_1_0_7_4 + 0.00180803571428577*G0_1_0_7_5 - 0.00065746753246755*G0_1_0_7_6 - 0.0120809659090913*G0_1_0_7_8 - 0.00197240259740267*G0_1_0_7_9 - 0.00366172889610402*G0_1_0_8_0 + 0.00292207792207803*G0_1_0_8_1 - 0.00101359577922081*G0_1_0_8_2 - 0.00254768668831176*G0_1_0_8_3 + 0.00238331980519488*G0_1_0_8_4 - 0.00115056818181821*G0_1_0_8_5 + 0.00304078733766243*G0_1_0_8_6 - 0.0120809659090913*G0_1_0_8_7 - 0.0241619318181826*G0_1_0_8_8 - 0.00591720779220798*G0_1_0_8_9 + 0.00109577922077926*G0_1_0_9_0 + 0.000383522727272741*G0_1_0_9_1 - 0.000164366883116887*G0_1_0_9_2 - 0.001479301948052*G0_1_0_9_3 + 0.000493100649350662*G0_1_0_9_4 - 0.000986201298701339*G0_1_0_9_5 - 0.002958603896104*G0_1_0_9_6 - 0.00197240259740267*G0_1_0_9_7 - 0.00591720779220798*G0_1_0_9_8 + 0.0295860389610399*G0_1_0_9_9; + A[92] = 0.00196022727272735*G0_0_1_0_0 + 0.00098011363636367*G0_0_1_0_2 + 0.00213676948051956*G0_0_1_0_3 - 0.00213676948051957*G0_0_1_0_4 + 0.00109577922077925*G0_0_1_0_5 + 0.00405438311688327*G0_0_1_0_6 + 0.00158887987012993*G0_0_1_0_7 - 0.000876623376623407*G0_0_1_0_8 + 0.00525974025974044*G0_0_1_0_9 - 0.00196022727272733*G0_0_1_1_1 - 0.000980113636363669*G0_0_1_1_2 - 0.00109577922077925*G0_0_1_1_3 - 0.00405438311688326*G0_0_1_1_4 - 0.00213676948051955*G0_0_1_1_5 + 0.00213676948051956*G0_0_1_1_6 + 0.000876623376623402*G0_0_1_1_7 - 0.00158887987012992*G0_0_1_1_8 - 0.00525974025974044*G0_0_1_1_9 + 0.00098011363636367*G0_0_1_2_0 - 0.000980113636363669*G0_0_1_2_1 + 0.00493100649350666*G0_0_1_2_3 - 0.01479301948052*G0_0_1_2_4 - 0.00493100649350666*G0_0_1_2_5 + 0.01479301948052*G0_0_1_2_6 + 0.00016436688311689*G0_0_1_2_7 - 0.000164366883116886*G0_0_1_2_8 + 0.00213676948051956*G0_0_1_3_0 - 0.00109577922077925*G0_0_1_3_1 + 0.00493100649350666*G0_0_1_3_2 + 0.035503246753248*G0_0_1_3_3 + 0.0212033279220786*G0_0_1_3_4 - 0.00641030844155864*G0_0_1_3_6 - 0.00641030844155867*G0_0_1_3_7 + 0.005917207792208*G0_0_1_3_8 + 0.0285998376623386*G0_0_1_3_9 - 0.00213676948051957*G0_0_1_4_0 - 0.00405438311688326*G0_0_1_4_1 - 0.01479301948052*G0_0_1_4_2 + 0.0212033279220786*G0_0_1_4_3 - 0.0936891233766266*G0_0_1_4_4 + 0.00641030844155867*G0_0_1_4_5 + 0.002958603896104*G0_0_1_4_7 + 0.00049310064935066*G0_0_1_4_8 - 0.0128206168831173*G0_0_1_4_9 + 0.00109577922077925*G0_0_1_5_0 - 0.00213676948051955*G0_0_1_5_1 - 0.00493100649350666*G0_0_1_5_2 + 0.00641030844155867*G0_0_1_5_4 - 0.035503246753248*G0_0_1_5_5 - 0.0212033279220786*G0_0_1_5_6 - 0.005917207792208*G0_0_1_5_7 + 0.00641030844155866*G0_0_1_5_8 - 0.0285998376623386*G0_0_1_5_9 + 0.00405438311688327*G0_0_1_6_0 + 0.00213676948051956*G0_0_1_6_1 + 0.01479301948052*G0_0_1_6_2 - 0.00641030844155864*G0_0_1_6_3 - 0.0212033279220786*G0_0_1_6_5 + 0.0936891233766265*G0_0_1_6_6 - 0.000493100649350657*G0_0_1_6_7 - 0.00295860389610399*G0_0_1_6_8 + 0.0128206168831173*G0_0_1_6_9 + 0.00158887987012993*G0_0_1_7_0 + 0.000876623376623402*G0_0_1_7_1 + 0.00016436688311689*G0_0_1_7_2 - 0.00641030844155867*G0_0_1_7_3 + 0.002958603896104*G0_0_1_7_4 - 0.005917207792208*G0_0_1_7_5 - 0.000493100649350657*G0_0_1_7_6 + 0.00394480519480533*G0_0_1_7_7 - 0.01479301948052*G0_0_1_7_9 - 0.000876623376623407*G0_0_1_8_0 - 0.00158887987012992*G0_0_1_8_1 - 0.000164366883116886*G0_0_1_8_2 + 0.005917207792208*G0_0_1_8_3 + 0.00049310064935066*G0_0_1_8_4 + 0.00641030844155866*G0_0_1_8_5 - 0.00295860389610399*G0_0_1_8_6 - 0.0039448051948053*G0_0_1_8_8 + 0.01479301948052*G0_0_1_8_9 + 0.00525974025974044*G0_0_1_9_0 - 0.00525974025974044*G0_0_1_9_1 + 0.0285998376623386*G0_0_1_9_3 - 0.0128206168831173*G0_0_1_9_4 - 0.0285998376623386*G0_0_1_9_5 + 0.0128206168831173*G0_0_1_9_6 - 0.01479301948052*G0_0_1_9_7 + 0.01479301948052*G0_0_1_9_8 + 0.00360389610389624*G0_1_1_0_0 + 0.000487012987013004*G0_1_1_0_1 - 0.00136972402597408*G0_1_1_0_2 + 0.00427353896103912*G0_1_1_0_3 - 0.00624594155844181*G0_1_1_0_4 + 0.0035612824675326*G0_1_1_0_5 - 0.00482142857142876*G0_1_1_0_6 + 0.00405438311688328*G0_1_1_0_7 - 0.00186282467532473*G0_1_1_0_8 + 0.000328733766233777*G0_1_1_0_9 + 0.000487012987013004*G0_1_1_1_0 + 0.00164366883116891*G0_1_1_1_1 - 0.00234983766233775*G0_1_1_1_2 + 0.00246550324675335*G0_1_1_1_3 - 0.00887581168831202*G0_1_1_1_4 + 0.00213676948051956*G0_1_1_1_5 - 0.00410917207792223*G0_1_1_1_6 - 0.000986201298701336*G0_1_1_1_7 + 0.00246550324675335*G0_1_1_1_8 - 0.00493100649350666*G0_1_1_1_9 - 0.00136972402597408*G0_1_1_2_0 - 0.00234983766233775*G0_1_1_2_1 - 0.0185064935064942*G0_1_1_2_2 + 0.0117248376623381*G0_1_1_2_3 - 0.028216314935066*G0_1_1_2_4 + 0.00679383116883143*G0_1_1_2_5 - 0.013423295454546*G0_1_1_2_6 + 0.00279423701298711*G0_1_1_2_7 + 0.00262987012987022*G0_1_1_2_8 - 0.00427353896103912*G0_1_1_2_9 + 0.00427353896103912*G0_1_1_3_0 + 0.00246550324675335*G0_1_1_3_1 + 0.0117248376623381*G0_1_1_3_2 + 0.0246550324675333*G0_1_1_3_3 + 0.0374756493506507*G0_1_1_3_4 - 0.011834415584416*G0_1_1_3_5 + 0.0167654220779227*G0_1_1_3_6 - 0.00838271103896135*G0_1_1_3_7 + 0.011834415584416*G0_1_1_3_8 + 0.0315584415584426*G0_1_1_3_9 - 0.00624594155844181*G0_1_1_4_0 - 0.00887581168831202*G0_1_1_4_1 - 0.028216314935066*G0_1_1_4_2 + 0.0374756493506507*G0_1_1_4_3 - 0.130178571428576*G0_1_1_4_4 + 0.0231757305194814*G0_1_1_4_5 - 0.0399411525974041*G0_1_1_4_6 + 0.002958603896104*G0_1_1_4_7 - 0.00345170454545465*G0_1_1_4_8 - 0.0335308441558453*G0_1_1_4_9 + 0.0035612824675326*G0_1_1_5_0 + 0.00213676948051956*G0_1_1_5_1 + 0.00679383116883143*G0_1_1_5_2 - 0.011834415584416*G0_1_1_5_3 + 0.0231757305194814*G0_1_1_5_4 - 0.0108482142857147*G0_1_1_5_5 + 0.016272321428572*G0_1_1_5_6 + 0.00591720779220799*G0_1_1_5_7 - 0.00197240259740267*G0_1_1_5_8 + 0.00295860389610401*G0_1_1_5_9 - 0.00482142857142876*G0_1_1_6_0 - 0.00410917207792223*G0_1_1_6_1 - 0.013423295454546*G0_1_1_6_2 + 0.0167654220779227*G0_1_1_6_3 - 0.0399411525974041*G0_1_1_6_4 + 0.016272321428572*G0_1_1_6_5 - 0.0364894480519494*G0_1_1_6_6 - 0.00394480519480532*G0_1_1_6_7 - 0.020710227272728*G0_1_1_6_9 + 0.00405438311688328*G0_1_1_7_0 - 0.000986201298701336*G0_1_1_7_1 + 0.00279423701298711*G0_1_1_7_2 - 0.00838271103896135*G0_1_1_7_3 + 0.002958603896104*G0_1_1_7_4 + 0.00591720779220799*G0_1_1_7_5 - 0.00394480519480532*G0_1_1_7_6 + 0.0739650974026*G0_1_1_7_7 - 0.00493100649350669*G0_1_1_7_8 + 0.00690340909090934*G0_1_1_7_9 - 0.00186282467532473*G0_1_1_8_0 + 0.00246550324675335*G0_1_1_8_1 + 0.00262987012987022*G0_1_1_8_2 + 0.011834415584416*G0_1_1_8_3 - 0.00345170454545465*G0_1_1_8_4 - 0.00197240259740267*G0_1_1_8_5 - 0.0049310064935067*G0_1_1_8_7 + 0.0700202922077946*G0_1_1_8_8 + 0.0216964285714293*G0_1_1_8_9 + 0.000328733766233777*G0_1_1_9_0 - 0.00493100649350666*G0_1_1_9_1 - 0.00427353896103912*G0_1_1_9_2 + 0.0315584415584426*G0_1_1_9_3 - 0.0335308441558453*G0_1_1_9_4 + 0.00295860389610401*G0_1_1_9_5 - 0.020710227272728*G0_1_1_9_6 + 0.00690340909090934*G0_1_1_9_7 + 0.0216964285714293*G0_1_1_9_8; + A[61] = -A[51] - 0.00265422077922086*G0_0_0_0_0 + 0.000258725649350658*G0_0_0_0_1 - 0.00165280032467539*G0_0_0_0_2 + 0.00170758928571436*G0_0_0_0_3 - 0.000210024350649363*G0_0_0_0_4 - 0.00261160714285723*G0_0_0_0_5 + 0.000922280844155847*G0_0_0_0_6 - 0.00215503246753254*G0_0_0_0_7 + 0.0014884334415585*G0_0_0_0_8 + 0.000219155844155849*G0_0_0_0_9 + 0.000258725649350658*G0_0_0_1_0 + 0.00547889610389626*G0_0_0_1_1 + 0.000140016233766233*G0_0_0_1_2 + 0.0082640016233769*G0_0_0_1_3 - 0.00348823051948063*G0_0_0_1_4 - 0.00157974837662342*G0_0_0_1_5 - 0.00259334415584426*G0_0_0_1_6 - 0.00193587662337669*G0_0_0_1_7 + 0.00378956980519494*G0_0_0_1_8 + 0.0010409902597403*G0_0_0_1_9 - 0.00165280032467539*G0_0_0_2_0 + 0.000140016233766233*G0_0_0_2_1 - 0.0121448863636368*G0_0_0_2_2 + 0.00454748376623393*G0_0_0_2_3 - 0.00588981331168853*G0_0_0_2_4 + 0.00553368506493527*G0_0_0_2_5 - 0.0108208198051952*G0_0_0_2_6 + 0.000228287337662343*G0_0_0_2_7 + 0.00113230519480524*G0_0_0_2_8 - 0.00049310064935067*G0_0_0_2_9 + 0.00170758928571436*G0_0_0_3_0 + 0.0082640016233769*G0_0_0_3_1 + 0.00454748376623393*G0_0_0_3_2 + 0.0330377435064947*G0_0_0_3_3 - 0.00936891233766265*G0_0_0_3_4 + 0.00739650974025999*G0_0_0_3_6 - 0.00550629058441579*G0_0_0_3_7 + 0.00928672889610425*G0_0_0_3_8 + 0.00788961038961068*G0_0_0_3_9 - 0.000210024350649363*G0_0_0_4_0 - 0.00348823051948063*G0_0_0_4_1 - 0.00588981331168853*G0_0_0_4_2 - 0.00936891233766265*G0_0_0_4_3 + 0.00788961038961066*G0_0_0_4_4 + 0.000246550324675353*G0_0_0_4_5 - 0.00764306006493535*G0_0_0_4_6 + 0.000164366883116894*G0_0_0_4_7 - 0.00378043831168845*G0_0_0_4_8 + 0.00098620129870132*G0_0_0_4_9 - 0.00261160714285723*G0_0_0_5_0 - 0.00157974837662342*G0_0_0_5_1 + 0.00553368506493527*G0_0_0_5_2 + 0.000246550324675353*G0_0_0_5_4 - 0.0571996753246772*G0_0_0_5_5 + 0.00665685876623404*G0_0_0_5_6 - 0.00328733766233777*G0_0_0_5_7 + 0.00435572240259754*G0_0_0_5_8 - 0.00936891233766265*G0_0_0_5_9 + 0.000922280844155847*G0_0_0_6_0 - 0.00259334415584426*G0_0_0_6_1 - 0.0108208198051952*G0_0_0_6_2 + 0.00739650974025999*G0_0_0_6_3 - 0.00764306006493535*G0_0_0_6_4 + 0.00665685876623403*G0_0_0_6_5 - 0.08136160714286*G0_0_0_6_6 - 0.00106838474025978*G0_0_0_6_7 + 0.00238331980519488*G0_0_0_6_8 - 0.013313717532468*G0_0_0_6_9 - 0.00215503246753254*G0_0_0_7_0 - 0.00193587662337669*G0_0_0_7_1 + 0.000228287337662343*G0_0_0_7_2 - 0.00550629058441579*G0_0_0_7_3 + 0.000164366883116894*G0_0_0_7_4 - 0.00328733766233777*G0_0_0_7_5 - 0.00106838474025978*G0_0_0_7_6 + 0.00657467532467555*G0_0_0_7_7 - 0.00353388798701312*G0_0_0_7_8 + 0.00147930194805199*G0_0_0_7_9 + 0.0014884334415585*G0_0_0_8_0 + 0.00378956980519494*G0_0_0_8_1 + 0.00113230519480524*G0_0_0_8_2 + 0.00928672889610425*G0_0_0_8_3 - 0.00378043831168845*G0_0_0_8_4 + 0.00435572240259754*G0_0_0_8_5 + 0.00238331980519488*G0_0_0_8_6 - 0.00353388798701312*G0_0_0_8_7 + 0.00756087662337692*G0_0_0_8_8 + 0.004437905844156*G0_0_0_8_9 + 0.00021915584415585*G0_0_0_9_0 + 0.0010409902597403*G0_0_0_9_1 - 0.00049310064935067*G0_0_0_9_2 + 0.00788961038961068*G0_0_0_9_3 + 0.000986201298701319*G0_0_0_9_4 - 0.00936891233766265*G0_0_0_9_5 - 0.013313717532468*G0_0_0_9_6 + 0.00147930194805199*G0_0_0_9_7 + 0.004437905844156*G0_0_0_9_8 + 0.0493100649350666*G0_0_0_9_9 + 0.00949066558441591*G0_1_0_0_0 + 0.000118709415584417*G0_1_0_0_1 + 0.000575284090909116*G0_1_0_0_3 - 0.000438311688311709*G0_1_0_0_4 + 0.00820921266233793*G0_1_0_0_5 - 0.00461140422077938*G0_1_0_0_6 + 0.00373478084415597*G0_1_0_0_7 - 0.00305905032467543*G0_1_0_0_8 + 0.000712256493506522*G0_1_0_0_9 + 0.000118709415584418*G0_1_0_1_0 - 0.000118709415584424*G0_1_0_1_2 + 0.00447443181818196*G0_1_0_1_3 - 0.00155235389610395*G0_1_0_1_4 + 0.00101359577922081*G0_1_0_1_5 - 0.00101359577922082*G0_1_0_1_6 + 0.00155235389610395*G0_1_0_1_7 - 0.00447443181818198*G0_1_0_1_8 - 0.000118709415584424*G0_1_0_2_1 - 0.00949066558441594*G0_1_0_2_2 + 0.00305905032467544*G0_1_0_2_3 - 0.00373478084415599*G0_1_0_2_4 + 0.00461140422077939*G0_1_0_2_5 - 0.00820921266233798*G0_1_0_2_6 + 0.000438311688311702*G0_1_0_2_7 - 0.000575284090909108*G0_1_0_2_8 - 0.000712256493506518*G0_1_0_2_9 + 0.000575284090909116*G0_1_0_3_0 + 0.00447443181818196*G0_1_0_3_1 + 0.00305905032467544*G0_1_0_3_2 + 0.0254768668831178*G0_1_0_3_3 - 0.00583502435064954*G0_1_0_3_4 - 0.00238331980519489*G0_1_0_3_5 + 0.00304078733766244*G0_1_0_3_6 - 0.00172585227272734*G0_1_0_3_7 + 0.00345170454545469*G0_1_0_3_9 - 0.000438311688311709*G0_1_0_4_0 - 0.00155235389610395*G0_1_0_4_1 - 0.00373478084415599*G0_1_0_4_2 - 0.00583502435064954*G0_1_0_4_3 + 0.00131493506493508*G0_1_0_4_4 + 0.00131493506493512*G0_1_0_4_5 - 0.00435572240259757*G0_1_0_4_6 + 0.00172585227272732*G0_1_0_4_8 - 0.000493100649350681*G0_1_0_4_9 + 0.00820921266233793*G0_1_0_5_0 + 0.00101359577922081*G0_1_0_5_1 + 0.00461140422077939*G0_1_0_5_2 - 0.00238331980519489*G0_1_0_5_3 + 0.00131493506493512*G0_1_0_5_4 + 0.0241619318181826*G0_1_0_5_5 + 0.00435572240259755*G0_1_0_5_7 - 0.00304078733766244*G0_1_0_5_8 + 0.00394480519480534*G0_1_0_5_9 - 0.00461140422077938*G0_1_0_6_0 - 0.00101359577922082*G0_1_0_6_1 - 0.00820921266233798*G0_1_0_6_2 + 0.00304078733766244*G0_1_0_6_3 - 0.00435572240259757*G0_1_0_6_4 - 0.0241619318181827*G0_1_0_6_6 - 0.00131493506493511*G0_1_0_6_7 + 0.00238331980519488*G0_1_0_6_8 - 0.00394480519480534*G0_1_0_6_9 + 0.00373478084415597*G0_1_0_7_0 + 0.00155235389610395*G0_1_0_7_1 + 0.000438311688311701*G0_1_0_7_2 - 0.00172585227272734*G0_1_0_7_3 + 0.00435572240259755*G0_1_0_7_5 - 0.00131493506493511*G0_1_0_7_6 - 0.00131493506493512*G0_1_0_7_7 + 0.00583502435064955*G0_1_0_7_8 + 0.000493100649350658*G0_1_0_7_9 - 0.00305905032467543*G0_1_0_8_0 - 0.00447443181818198*G0_1_0_8_1 - 0.000575284090909108*G0_1_0_8_2 + 0.00172585227272732*G0_1_0_8_4 - 0.00304078733766244*G0_1_0_8_5 + 0.00238331980519488*G0_1_0_8_6 + 0.00583502435064955*G0_1_0_8_7 - 0.0254768668831177*G0_1_0_8_8 - 0.00345170454545465*G0_1_0_8_9 + 0.000712256493506522*G0_1_0_9_0 - 0.000712256493506517*G0_1_0_9_2 + 0.00345170454545469*G0_1_0_9_3 - 0.00049310064935068*G0_1_0_9_4 + 0.00394480519480534*G0_1_0_9_5 - 0.00394480519480534*G0_1_0_9_6 + 0.000493100649350658*G0_1_0_9_7 - 0.00345170454545465*G0_1_0_9_8; + A[41] = -A[61] - 0.00787134740259768*G0_1_0_0_0 - 0.00393567370129885*G0_1_0_0_1 - 0.00106534090909095*G0_1_0_0_2 - 0.000757913961038983*G0_1_0_0_3 - 0.00111404220779225*G0_1_0_0_4 - 0.00241984577922085*G0_1_0_0_5 - 0.00124188311688316*G0_1_0_0_6 + 0.000173498376623393*G0_1_0_0_7 - 0.00544237012987034*G0_1_0_0_8 - 0.00378043831168844*G0_1_0_0_9 - 0.00393567370129885*G0_1_0_1_0 - 0.0525974025974044*G0_1_0_1_1 - 0.00307426948051959*G0_1_0_1_2 - 0.0196783685064942*G0_1_0_1_3 + 0.0100994318181821*G0_1_0_1_4 + 0.00170758928571434*G0_1_0_1_5 + 0.000858360389610412*G0_1_0_1_6 + 0.0165827922077928*G0_1_0_1_7 - 0.0389458198051962*G0_1_0_1_8 - 0.0047666396103898*G0_1_0_1_9 - 0.00106534090909095*G0_1_0_2_0 - 0.00307426948051959*G0_1_0_2_1 - 0.0154017857142863*G0_1_0_2_2 + 0.00167106331168838*G0_1_0_2_3 - 0.00246550324675336*G0_1_0_2_4 + 0.00249289772727284*G0_1_0_2_5 - 0.00904017857142893*G0_1_0_2_6 + 0.00146103896103901*G0_1_0_2_7 - 0.00346996753246765*G0_1_0_2_8 + 0.000767045454545479*G0_1_0_2_9 - 0.000757913961038983*G0_1_0_3_0 - 0.0196783685064942*G0_1_0_3_1 + 0.00167106331168838*G0_1_0_3_2 + 0.013478084415585*G0_1_0_3_3 + 0.00460227272727286*G0_1_0_3_4 - 0.00336952110389622*G0_1_0_3_5 + 0.00131493506493512*G0_1_0_3_6 + 0.00616375811688331*G0_1_0_3_7 - 0.0204636769480526*G0_1_0_3_8 + 0.00197240259740272*G0_1_0_3_9 - 0.00111404220779225*G0_1_0_4_0 + 0.0100994318181821*G0_1_0_4_1 - 0.00246550324675336*G0_1_0_4_2 + 0.00460227272727286*G0_1_0_4_3 - 0.0259699675324685*G0_1_0_4_4 + 0.00723214285714311*G0_1_0_4_5 - 0.00854707792207824*G0_1_0_4_6 - 0.00246550324675333*G0_1_0_4_7 + 0.0142999188311693*G0_1_0_4_8 - 0.0167654220779226*G0_1_0_4_9 - 0.00241984577922085*G0_1_0_5_0 + 0.00170758928571434*G0_1_0_5_1 + 0.00249289772727284*G0_1_0_5_2 - 0.00336952110389622*G0_1_0_5_3 + 0.00723214285714311*G0_1_0_5_4 + 0.0238331980519488*G0_1_0_5_5 + 0.0134780844155849*G0_1_0_5_6 + 0.00172585227272733*G0_1_0_5_7 - 0.00123275162337666*G0_1_0_5_8 + 0.0138068181818186*G0_1_0_5_9 - 0.00124188311688316*G0_1_0_6_0 + 0.000858360389610412*G0_1_0_6_1 - 0.00904017857142893*G0_1_0_6_2 + 0.00131493506493512*G0_1_0_6_3 - 0.00854707792207824*G0_1_0_6_4 + 0.0134780844155849*G0_1_0_6_5 + 0.00361607142857147*G0_1_0_6_6 - 0.000493100649350666*G0_1_0_6_7 + 0.00197240259740266*G0_1_0_6_8 - 0.00493100649350668*G0_1_0_6_9 + 0.000173498376623393*G0_1_0_7_0 + 0.0165827922077928*G0_1_0_7_1 + 0.00146103896103901*G0_1_0_7_2 + 0.00616375811688331*G0_1_0_7_3 - 0.00246550324675333*G0_1_0_7_4 + 0.00172585227272733*G0_1_0_7_5 - 0.000493100649350666*G0_1_0_7_6 + 0.00821834415584448*G0_1_0_7_7 + 0.0316406250000011*G0_1_0_7_8 + 0.0123275162337667*G0_1_0_7_9 - 0.00544237012987034*G0_1_0_8_0 - 0.0389458198051962*G0_1_0_8_1 - 0.00346996753246765*G0_1_0_8_2 - 0.0204636769480526*G0_1_0_8_3 + 0.0142999188311693*G0_1_0_8_4 - 0.00123275162337666*G0_1_0_8_5 + 0.00197240259740266*G0_1_0_8_6 + 0.0316406250000011*G0_1_0_8_7 - 0.10568790584416*G0_1_0_8_8 - 0.0142999188311693*G0_1_0_8_9 - 0.00378043831168844*G0_1_0_9_0 - 0.0047666396103898*G0_1_0_9_1 + 0.000767045454545479*G0_1_0_9_2 + 0.00197240259740272*G0_1_0_9_3 - 0.0167654220779226*G0_1_0_9_4 + 0.0138068181818186*G0_1_0_9_5 - 0.00493100649350668*G0_1_0_9_6 + 0.0123275162337667*G0_1_0_9_7 - 0.0142999188311693*G0_1_0_9_8 - 0.0867857142857171*G0_1_0_9_9; + A[40] = -A[41] + 0.00231939935064946*G0_0_0_0_0 + 0.000858360389610422*G0_0_0_0_2 - 0.000739650974026003*G0_0_0_0_3 - 0.00197240259740268*G0_0_0_0_4 + 0.00205458603896112*G0_0_0_0_5 + 0.000821834415584455*G0_0_0_0_6 + 0.00230113636363647*G0_0_0_0_7 - 0.0016436688311689*G0_0_0_0_8 - 0.000986201298701328*G0_0_0_0_9 - 0.00231939935064946*G0_0_0_1_1 - 0.000858360389610419*G0_0_0_1_2 - 0.00205458603896111*G0_0_0_1_3 - 0.000821834415584447*G0_0_0_1_4 + 0.000739650974026*G0_0_0_1_5 + 0.00197240259740267*G0_0_0_1_6 + 0.0016436688311689*G0_0_0_1_7 - 0.00230113636363647*G0_0_0_1_8 + 0.000986201298701328*G0_0_0_1_9 + 0.000858360389610422*G0_0_0_2_0 - 0.000858360389610419*G0_0_0_2_1 + 0.00246550324675333*G0_0_0_2_3 - 0.00739650974025999*G0_0_0_2_4 - 0.00246550324675333*G0_0_0_2_5 + 0.00739650974026001*G0_0_0_2_6 + 0.000986201298701337*G0_0_0_2_7 - 0.000986201298701335*G0_0_0_2_8 - 0.000739650974026003*G0_0_0_3_0 - 0.00205458603896111*G0_0_0_3_1 + 0.00246550324675333*G0_0_0_3_2 - 0.01479301948052*G0_0_0_3_3 + 0.013313717532468*G0_0_0_3_4 - 0.00591720779220798*G0_0_0_3_6 + 0.002218952922078*G0_0_0_3_7 - 0.00517755681818201*G0_0_0_3_8 - 0.00739650974025999*G0_0_0_3_9 - 0.00197240259740268*G0_0_0_4_0 - 0.000821834415584447*G0_0_0_4_1 - 0.00739650974025999*G0_0_0_4_2 + 0.013313717532468*G0_0_0_4_3 - 0.0739650974026001*G0_0_0_4_4 + 0.005917207792208*G0_0_0_4_5 + 0.001479301948052*G0_0_0_4_7 + 0.00295860389610401*G0_0_0_4_8 - 0.011834415584416*G0_0_0_4_9 + 0.00205458603896112*G0_0_0_5_0 + 0.000739650974026*G0_0_0_5_1 - 0.00246550324675333*G0_0_0_5_2 + 0.005917207792208*G0_0_0_5_4 + 0.01479301948052*G0_0_0_5_5 - 0.013313717532468*G0_0_0_5_6 + 0.00517755681818201*G0_0_0_5_7 - 0.002218952922078*G0_0_0_5_8 + 0.00739650974026*G0_0_0_5_9 + 0.000821834415584455*G0_0_0_6_0 + 0.00197240259740267*G0_0_0_6_1 + 0.00739650974026001*G0_0_0_6_2 - 0.00591720779220798*G0_0_0_6_3 - 0.013313717532468*G0_0_0_6_5 + 0.0739650974026*G0_0_0_6_6 - 0.002958603896104*G0_0_0_6_7 - 0.00147930194805199*G0_0_0_6_8 + 0.011834415584416*G0_0_0_6_9 + 0.00230113636363647*G0_0_0_7_0 + 0.0016436688311689*G0_0_0_7_1 + 0.000986201298701337*G0_0_0_7_2 + 0.002218952922078*G0_0_0_7_3 + 0.001479301948052*G0_0_0_7_4 + 0.00517755681818201*G0_0_0_7_5 - 0.002958603896104*G0_0_0_7_6 + 0.00739650974026007*G0_0_0_7_7 + 0.00887581168831201*G0_0_0_7_9 - 0.0016436688311689*G0_0_0_8_0 - 0.00230113636363647*G0_0_0_8_1 - 0.000986201298701334*G0_0_0_8_2 - 0.00517755681818201*G0_0_0_8_3 + 0.00295860389610401*G0_0_0_8_4 - 0.002218952922078*G0_0_0_8_5 - 0.00147930194805199*G0_0_0_8_6 - 0.00739650974026005*G0_0_0_8_8 - 0.008875811688312*G0_0_0_8_9 - 0.000986201298701328*G0_0_0_9_0 + 0.000986201298701328*G0_0_0_9_1 - 0.00739650974025999*G0_0_0_9_3 - 0.011834415584416*G0_0_0_9_4 + 0.00739650974026*G0_0_0_9_5 + 0.011834415584416*G0_0_0_9_6 + 0.00887581168831201*G0_0_0_9_7 - 0.008875811688312*G0_0_0_9_8 + 0.00273944805194818*G0_0_1_0_0 + 0.00021002435064936*G0_0_1_0_1 - 0.000517451298701324*G0_0_1_0_2 + 0.000264813311688323*G0_0_1_0_3 - 0.00184456168831177*G0_0_1_0_4 + 0.00378956980519495*G0_0_1_0_5 - 0.00171672077922085*G0_0_1_0_6 + 0.00223721590909101*G0_0_1_0_7 - 0.00107751623376628*G0_0_1_0_8 + 0.000602678571428596*G0_0_1_0_9 + 0.00021002435064936*G0_0_1_1_0 + 0.000420048701298718*G0_0_1_1_1 - 0.00137581168831174*G0_0_1_1_2 + 0.00173498376623383*G0_0_1_1_3 - 0.00253855519480529*G0_0_1_1_4 + 0.00100446428571432*G0_0_1_1_5 + 0.000127840909090909*G0_0_1_1_6 + 0.000566152597402621*G0_0_1_1_7 + 0.00158887987012992*G0_0_1_1_9 - 0.000517451298701324*G0_0_1_2_0 - 0.00137581168831174*G0_0_1_2_1 - 0.0195413961038968*G0_0_1_2_2 + 0.0071225649350652*G0_0_1_2_3 - 0.0154778814935071*G0_0_1_2_4 + 0.00465706168831187*G0_0_1_2_5 - 0.00808137175324709*G0_0_1_2_6 + 0.00092228084415588*G0_0_1_2_7 - 0.00246550324675334*G0_0_1_2_9 + 0.000264813311688323*G0_0_1_3_0 + 0.00173498376623383*G0_0_1_3_1 + 0.0071225649350652*G0_0_1_3_2 - 0.00345170454545472*G0_0_1_3_3 + 0.00936891233766269*G0_0_1_3_4 - 0.00197240259740267*G0_0_1_3_5 - 0.000246550324675306*G0_0_1_3_6 - 0.000657467532467557*G0_0_1_3_7 + 0.000328733766233777*G0_0_1_3_8 - 0.00345170454545465*G0_0_1_3_9 - 0.00184456168831177*G0_0_1_4_0 - 0.00253855519480529*G0_0_1_4_1 - 0.0154778814935071*G0_0_1_4_2 + 0.00936891233766269*G0_0_1_4_3 - 0.0537479707792228*G0_0_1_4_4 + 0.00567065746753269*G0_0_1_4_5 - 0.00542410714285739*G0_0_1_4_6 + 0.00131493506493512*G0_0_1_4_7 + 0.000328733766233781*G0_0_1_4_8 - 0.00394480519480537*G0_0_1_4_9 + 0.00378956980519495*G0_0_1_5_0 + 0.00100446428571432*G0_0_1_5_1 + 0.00465706168831187*G0_0_1_5_2 - 0.00197240259740267*G0_0_1_5_3 + 0.00567065746753269*G0_0_1_5_4 + 0.0113413149350653*G0_0_1_5_5 - 0.0039448051948053*G0_0_1_5_6 + 0.00550629058441579*G0_0_1_5_7 - 0.00287642045454556*G0_0_1_5_8 + 0.00394480519480535*G0_0_1_5_9 - 0.00171672077922085*G0_0_1_6_0 + 0.000127840909090909*G0_0_1_6_1 - 0.00808137175324709*G0_0_1_6_2 - 0.000246550324675306*G0_0_1_6_3 - 0.00542410714285739*G0_0_1_6_4 - 0.0039448051948053*G0_0_1_6_5 + 0.0202171266233773*G0_0_1_6_6 - 0.00262987012987022*G0_0_1_6_7 - 0.000164366883116882*G0_0_1_6_8 + 0.00788961038961064*G0_0_1_6_9 + 0.00223721590909101*G0_0_1_7_0 + 0.000566152597402621*G0_0_1_7_1 + 0.00092228084415588*G0_0_1_7_2 - 0.000657467532467557*G0_0_1_7_3 + 0.00131493506493512*G0_0_1_7_4 + 0.00550629058441579*G0_0_1_7_5 - 0.00262987012987022*G0_0_1_7_6 + 0.00723214285714318*G0_0_1_7_7 - 0.00287642045454558*G0_0_1_7_8 + 0.00345170454545468*G0_0_1_7_9 - 0.00107751623376628*G0_0_1_8_0 + 0.000328733766233777*G0_0_1_8_3 + 0.000328733766233781*G0_0_1_8_4 - 0.00287642045454556*G0_0_1_8_5 - 0.000164366883116882*G0_0_1_8_6 - 0.00287642045454558*G0_0_1_8_7 - 0.000164366883116884*G0_0_1_8_8 - 0.00542410714285733*G0_0_1_8_9 + 0.000602678571428596*G0_0_1_9_0 + 0.00158887987012992*G0_0_1_9_1 - 0.00246550324675334*G0_0_1_9_2 - 0.00345170454545465*G0_0_1_9_3 - 0.00394480519480537*G0_0_1_9_4 + 0.00394480519480535*G0_0_1_9_5 + 0.00788961038961063*G0_0_1_9_6 + 0.00345170454545468*G0_0_1_9_7 - 0.00542410714285733*G0_0_1_9_8 + 0.00986201298701334*G0_0_1_9_9 + 0.00184456168831181*G0_1_0_0_0 - 0.00283076298701309*G0_1_0_0_1 - 0.00230113636363645*G0_1_0_0_3 - 0.00279423701298712*G0_1_0_0_4 + 0.00205458603896114*G0_1_0_0_5 - 0.00115056818181823*G0_1_0_0_6 + 0.00690340909090938*G0_1_0_0_7 - 0.0078896103896107*G0_1_0_0_8 - 0.00295860389610399*G0_1_0_0_9 - 0.00283076298701309*G0_1_0_1_0 - 0.0452008928571444*G0_1_0_1_1 - 0.00278510551948061*G0_1_0_1_2 - 0.0172585227272733*G0_1_0_1_3 + 0.00936891233766264*G0_1_0_1_4 + 0.000904017857142894*G0_1_0_1_5 + 0.00115056818181822*G0_1_0_1_6 + 0.0157792207792214*G0_1_0_1_7 - 0.0345170454545467*G0_1_0_1_8 - 0.00295860389610401*G0_1_0_1_9 - 0.00278510551948061*G0_1_0_2_1 - 0.00200892857142864*G0_1_0_2_2 + 0.00139711850649356*G0_1_0_2_3 - 0.000821834415584451*G0_1_0_2_4 - 0.000246550324675326*G0_1_0_2_5 + 0.00189021915584423*G0_1_0_2_7 - 0.00402698863636377*G0_1_0_2_8 + 0.000493100649350669*G0_1_0_2_9 - 0.00230113636363645*G0_1_0_3_0 - 0.0172585227272733*G0_1_0_3_1 + 0.00139711850649356*G0_1_0_3_2 - 0.0251481331168839*G0_1_0_3_3 + 0.00517755681818196*G0_1_0_3_4 + 0.000739650974025989*G0_1_0_3_5 - 0.000739650974025994*G0_1_0_3_6 + 0.00961546266233798*G0_1_0_3_7 - 0.024408482142858*G0_1_0_3_8 - 0.010355113636364*G0_1_0_3_9 - 0.00279423701298713*G0_1_0_4_0 + 0.00936891233766264*G0_1_0_4_1 - 0.000821834415584451*G0_1_0_4_2 + 0.00517755681818196*G0_1_0_4_3 - 0.093196022727276*G0_1_0_4_4 + 0.01109476461039*G0_1_0_4_5 - 0.010355113636364*G0_1_0_4_6 + 0.01479301948052*G0_1_0_4_8 - 0.023668831168832*G0_1_0_4_9 + 0.00205458603896114*G0_1_0_5_0 + 0.000904017857142894*G0_1_0_5_1 - 0.000246550324675326*G0_1_0_5_2 + 0.000739650974025989*G0_1_0_5_3 + 0.01109476461039*G0_1_0_5_4 + 0.000739650974025967*G0_1_0_5_6 + 0.00295860389610405*G0_1_0_5_7 + 0.008875811688312*G0_1_0_5_9 - 0.00115056818181823*G0_1_0_6_0 + 0.00115056818181822*G0_1_0_6_1 - 0.000739650974025993*G0_1_0_6_3 - 0.010355113636364*G0_1_0_6_4 + 0.000739650974025966*G0_1_0_6_5 + 0.010355113636364*G0_1_0_6_6 - 0.00295860389610402*G0_1_0_6_7 + 0.002958603896104*G0_1_0_6_8 + 0.00690340909090938*G0_1_0_7_0 + 0.0157792207792214*G0_1_0_7_1 + 0.00189021915584423*G0_1_0_7_2 + 0.00961546266233798*G0_1_0_7_3 + 0.00295860389610404*G0_1_0_7_5 - 0.00295860389610402*G0_1_0_7_6 + 0.0177516233766241*G0_1_0_7_7 + 0.023668831168832*G0_1_0_7_8 + 0.01479301948052*G0_1_0_7_9 - 0.0078896103896107*G0_1_0_8_0 - 0.0345170454545467*G0_1_0_8_1 - 0.00402698863636377*G0_1_0_8_2 - 0.024408482142858*G0_1_0_8_3 + 0.01479301948052*G0_1_0_8_4 + 0.002958603896104*G0_1_0_8_6 + 0.023668831168832*G0_1_0_8_7 - 0.10355113636364*G0_1_0_8_8 - 0.020710227272728*G0_1_0_8_9 - 0.00295860389610399*G0_1_0_9_0 - 0.00295860389610401*G0_1_0_9_1 + 0.000493100649350668*G0_1_0_9_2 - 0.010355113636364*G0_1_0_9_3 - 0.023668831168832*G0_1_0_9_4 + 0.008875811688312*G0_1_0_9_5 + 0.01479301948052*G0_1_0_9_7 - 0.020710227272728*G0_1_0_9_8 - 0.0177516233766239*G0_1_0_9_9 + 0.00273944805194822*G0_1_1_0_0 + 0.000657467532467562*G0_1_1_0_1 - 0.000748782467532496*G0_1_1_0_3 - 0.00184456168831177*G0_1_1_0_4 + 0.00155235389610399*G0_1_1_0_5 - 0.000858360389610439*G0_1_1_0_6 + 0.00447443181818202*G0_1_1_0_7 - 0.00177150974025982*G0_1_1_0_8 + 0.000438311688311711*G0_1_1_0_9 + 0.000657467532467562*G0_1_1_1_0 + 0.00739650974025999*G0_1_1_1_1 - 0.000276988636363649*G0_1_1_1_2 + 0.00465706168831184*G0_1_1_1_3 - 0.00158887987012993*G0_1_1_1_4 + 0.000210024350649365*G0_1_1_1_5 + 0.000292207792207798*G0_1_1_1_6 - 0.000109577922077921*G0_1_1_1_7 + 0.00219155844155853*G0_1_1_1_8 + 0.00197240259740267*G0_1_1_1_9 - 0.000276988636363649*G0_1_1_2_1 - 0.0030742694805196*G0_1_1_2_2 + 0.00346083603896117*G0_1_1_2_3 - 0.00434659090909107*G0_1_1_2_4 + 0.000922280844155887*G0_1_1_2_5 - 0.0020911120129871*G0_1_1_2_6 + 0.00070312500000003*G0_1_1_2_7 - 0.000337865259740272*G0_1_1_2_8 - 0.00136972402597407*G0_1_1_2_9 - 0.000748782467532496*G0_1_1_3_0 + 0.00465706168831184*G0_1_1_3_1 + 0.00346083603896117*G0_1_1_3_2 - 0.0276136363636373*G0_1_1_3_3 - 0.00271205357142866*G0_1_1_3_4 + 0.00106838474025976*G0_1_1_3_5 - 0.00139711850649354*G0_1_1_3_6 + 0.00172585227272732*G0_1_1_3_7 - 0.00221895292207798*G0_1_1_3_8 - 0.00936891233766265*G0_1_1_3_9 - 0.00184456168831177*G0_1_1_4_0 - 0.00158887987012993*G0_1_1_4_1 - 0.00434659090909107*G0_1_1_4_2 - 0.00271205357142866*G0_1_1_4_3 - 0.0537479707792228*G0_1_1_4_4 + 0.00501318993506512*G0_1_1_4_5 - 0.00361607142857159*G0_1_1_4_6 + 0.00197240259740267*G0_1_1_4_7 + 0.000493100649350664*G0_1_1_4_8 - 0.00591720779220804*G0_1_1_4_9 + 0.00155235389610399*G0_1_1_5_0 + 0.000210024350649365*G0_1_1_5_1 + 0.000922280844155887*G0_1_1_5_2 + 0.00106838474025976*G0_1_1_5_3 + 0.00501318993506512*G0_1_1_5_4 + 0.000328733766233849*G0_1_1_5_5 - 0.000657467532467577*G0_1_1_5_6 + 0.00378043831168849*G0_1_1_5_7 - 0.00115056818181824*G0_1_1_5_8 + 0.00098620129870136*G0_1_1_5_9 - 0.000858360389610439*G0_1_1_6_0 + 0.000292207792207798*G0_1_1_6_1 - 0.0020911120129871*G0_1_1_6_2 - 0.00139711850649354*G0_1_1_6_3 - 0.00361607142857159*G0_1_1_6_4 - 0.000657467532467576*G0_1_1_6_5 + 0.00673904220779243*G0_1_1_6_6 - 0.00262987012987024*G0_1_1_6_7 + 0.000328733766233787*G0_1_1_6_8 + 0.0069034090909093*G0_1_1_6_9 + 0.00447443181818202*G0_1_1_7_0 - 0.000109577922077921*G0_1_1_7_1 + 0.00070312500000003*G0_1_1_7_2 + 0.00172585227272732*G0_1_1_7_3 + 0.00197240259740267*G0_1_1_7_4 + 0.00378043831168849*G0_1_1_7_5 - 0.00262987012987024*G0_1_1_7_6 + 0.0216964285714295*G0_1_1_7_7 - 0.00542410714285739*G0_1_1_7_8 + 0.00394480519480537*G0_1_1_7_9 - 0.00177150974025982*G0_1_1_8_0 + 0.00219155844155852*G0_1_1_8_1 - 0.000337865259740272*G0_1_1_8_2 - 0.00221895292207798*G0_1_1_8_3 + 0.000493100649350664*G0_1_1_8_4 - 0.00115056818181825*G0_1_1_8_5 + 0.000328733766233787*G0_1_1_8_6 - 0.00542410714285739*G0_1_1_8_7 - 0.0123275162337666*G0_1_1_8_8 - 0.00690340909090933*G0_1_1_8_9 + 0.000438311688311711*G0_1_1_9_0 + 0.00197240259740267*G0_1_1_9_1 - 0.00136972402597407*G0_1_1_9_2 - 0.00936891233766265*G0_1_1_9_3 - 0.00591720779220804*G0_1_1_9_4 + 0.00098620129870136*G0_1_1_9_5 + 0.0069034090909093*G0_1_1_9_6 + 0.00394480519480537*G0_1_1_9_7 - 0.00690340909090933*G0_1_1_9_8 + 0.0394480519480533*G0_1_1_9_9; + A[4] = A[40] + 0.000447443181818202*G0_0_1_0_1 + 0.000566152597402626*G0_0_1_0_2 - 0.00101359577922082*G0_0_1_0_3 - 0.00223721590909096*G0_0_1_0_5 + 0.000858360389610411*G0_0_1_0_6 + 0.00223721590909101*G0_0_1_0_7 - 0.000693993506493541*G0_0_1_0_8 - 0.000164366883116883*G0_0_1_0_9 + 0.000447443181818203*G0_0_1_1_0 + 0.00697646103896127*G0_0_1_1_1 + 0.00109882305194809*G0_0_1_1_2 + 0.00292207792207801*G0_0_1_1_3 + 0.000949675324675364*G0_0_1_1_4 - 0.000794439935064959*G0_0_1_1_5 + 0.000164366883116889*G0_0_1_1_6 - 0.000675730519480543*G0_0_1_1_7 + 0.00225547889610398*G0_0_1_1_8 + 0.000383522727272745*G0_0_1_1_9 + 0.000566152597402626*G0_0_1_2_0 + 0.00109882305194809*G0_0_1_2_1 + 0.0164671266233772*G0_0_1_2_2 - 0.00366172889610403*G0_0_1_2_3 + 0.011131290584416*G0_0_1_2_4 - 0.00373478084415598*G0_0_1_2_5 + 0.00599025974025998*G0_0_1_2_6 - 0.00021915584415585*G0_0_1_2_7 - 0.000273944805194816*G0_0_1_2_8 + 0.00109577922077926*G0_0_1_2_9 - 0.00101359577922082*G0_0_1_3_0 + 0.00292207792207801*G0_0_1_3_1 - 0.00366172889610403*G0_0_1_3_2 - 0.0241619318181826*G0_0_1_3_3 - 0.0120809659090913*G0_0_1_3_4 + 0.00304078733766244*G0_0_1_3_5 - 0.00115056818181823*G0_0_1_3_6 + 0.00238331980519488*G0_0_1_3_7 - 0.00254768668831176*G0_0_1_3_8 - 0.00591720779220799*G0_0_1_3_9 + 0.000949675324675364*G0_0_1_4_1 + 0.011131290584416*G0_0_1_4_2 - 0.0120809659090913*G0_0_1_4_3 - 0.000657467532467572*G0_0_1_4_5 + 0.0018080357142858*G0_0_1_4_6 + 0.000657467532467551*G0_0_1_4_7 + 0.000164366883116886*G0_0_1_4_8 - 0.00197240259740265*G0_0_1_4_9 - 0.00223721590909096*G0_0_1_5_0 - 0.00079443993506496*G0_0_1_5_1 - 0.00373478084415598*G0_0_1_5_2 + 0.00304078733766244*G0_0_1_5_3 - 0.00065746753246757*G0_0_1_5_4 - 0.0110125811688315*G0_0_1_5_5 + 0.00328733766233773*G0_0_1_5_6 - 0.0017258522727273*G0_0_1_5_7 + 0.00172585227272732*G0_0_1_5_8 - 0.00295860389610399*G0_0_1_5_9 + 0.000858360389610411*G0_0_1_6_0 + 0.000164366883116888*G0_0_1_6_1 + 0.00599025974025998*G0_0_1_6_2 - 0.00115056818181823*G0_0_1_6_3 + 0.0018080357142858*G0_0_1_6_4 + 0.00328733766233773*G0_0_1_6_5 - 0.0134780844155849*G0_0_1_6_6 + 0.000493100649350671*G0_0_1_6_8 - 0.000986201298701336*G0_0_1_6_9 + 0.00223721590909101*G0_0_1_7_0 - 0.000675730519480543*G0_0_1_7_1 - 0.00021915584415585*G0_0_1_7_2 + 0.00238331980519488*G0_0_1_7_3 + 0.000657467532467551*G0_0_1_7_4 - 0.0017258522727273*G0_0_1_7_5 + 0.0144642857142863*G0_0_1_7_7 - 0.00254768668831181*G0_0_1_7_8 + 0.000493100649350682*G0_0_1_7_9 - 0.000693993506493541*G0_0_1_8_0 + 0.00225547889610398*G0_0_1_8_1 - 0.000273944805194816*G0_0_1_8_2 - 0.00254768668831176*G0_0_1_8_3 + 0.000164366883116886*G0_0_1_8_4 + 0.00172585227272732*G0_0_1_8_5 + 0.000493100649350671*G0_0_1_8_6 - 0.00254768668831181*G0_0_1_8_7 - 0.0121631493506498*G0_0_1_8_8 - 0.001479301948052*G0_0_1_8_9 - 0.000164366883116882*G0_0_1_9_0 + 0.000383522727272745*G0_0_1_9_1 + 0.00109577922077926*G0_0_1_9_2 - 0.00591720779220799*G0_0_1_9_3 - 0.00197240259740265*G0_0_1_9_4 - 0.00295860389610399*G0_0_1_9_5 - 0.000986201298701332*G0_0_1_9_6 + 0.000493100649350682*G0_0_1_9_7 - 0.001479301948052*G0_0_1_9_8 + 0.0295860389610399*G0_0_1_9_9 - 0.000447443181818202*G0_1_0_0_1 - 0.000566152597402626*G0_1_0_0_2 + 0.00101359577922082*G0_1_0_0_3 + 0.00223721590909096*G0_1_0_0_5 - 0.000858360389610411*G0_1_0_0_6 - 0.00223721590909101*G0_1_0_0_7 + 0.00069399350649354*G0_1_0_0_8 + 0.000164366883116883*G0_1_0_0_9 - 0.000447443181818203*G0_1_0_1_0 - 0.00697646103896127*G0_1_0_1_1 - 0.00109882305194809*G0_1_0_1_2 - 0.00292207792207801*G0_1_0_1_3 - 0.000949675324675364*G0_1_0_1_4 + 0.00079443993506496*G0_1_0_1_5 - 0.000164366883116889*G0_1_0_1_6 + 0.000675730519480543*G0_1_0_1_7 - 0.00225547889610398*G0_1_0_1_8 - 0.000383522727272745*G0_1_0_1_9 - 0.000566152597402626*G0_1_0_2_0 - 0.00109882305194809*G0_1_0_2_1 - 0.0164671266233772*G0_1_0_2_2 + 0.00366172889610403*G0_1_0_2_3 - 0.011131290584416*G0_1_0_2_4 + 0.00373478084415598*G0_1_0_2_5 - 0.00599025974025998*G0_1_0_2_6 + 0.00021915584415585*G0_1_0_2_7 + 0.000273944805194816*G0_1_0_2_8 - 0.00109577922077926*G0_1_0_2_9 + 0.00101359577922082*G0_1_0_3_0 - 0.00292207792207801*G0_1_0_3_1 + 0.00366172889610403*G0_1_0_3_2 + 0.0241619318181826*G0_1_0_3_3 + 0.0120809659090914*G0_1_0_3_4 - 0.00304078733766244*G0_1_0_3_5 + 0.00115056818181823*G0_1_0_3_6 - 0.00238331980519488*G0_1_0_3_7 + 0.00254768668831176*G0_1_0_3_8 + 0.00591720779220799*G0_1_0_3_9 - 0.000949675324675364*G0_1_0_4_1 - 0.011131290584416*G0_1_0_4_2 + 0.0120809659090913*G0_1_0_4_3 + 0.00065746753246757*G0_1_0_4_5 - 0.0018080357142858*G0_1_0_4_6 - 0.000657467532467552*G0_1_0_4_7 - 0.000164366883116886*G0_1_0_4_8 + 0.00197240259740266*G0_1_0_4_9 + 0.00223721590909096*G0_1_0_5_0 + 0.00079443993506496*G0_1_0_5_1 + 0.00373478084415598*G0_1_0_5_2 - 0.00304078733766244*G0_1_0_5_3 + 0.000657467532467572*G0_1_0_5_4 + 0.0110125811688315*G0_1_0_5_5 - 0.00328733766233773*G0_1_0_5_6 + 0.0017258522727273*G0_1_0_5_7 - 0.00172585227272732*G0_1_0_5_8 + 0.00295860389610399*G0_1_0_5_9 - 0.000858360389610411*G0_1_0_6_0 - 0.000164366883116889*G0_1_0_6_1 - 0.00599025974025998*G0_1_0_6_2 + 0.00115056818181823*G0_1_0_6_3 - 0.0018080357142858*G0_1_0_6_4 - 0.00328733766233773*G0_1_0_6_5 + 0.0134780844155849*G0_1_0_6_6 - 0.000493100649350671*G0_1_0_6_8 + 0.000986201298701334*G0_1_0_6_9 - 0.00223721590909101*G0_1_0_7_0 + 0.000675730519480543*G0_1_0_7_1 + 0.00021915584415585*G0_1_0_7_2 - 0.00238331980519488*G0_1_0_7_3 - 0.000657467532467551*G0_1_0_7_4 + 0.0017258522727273*G0_1_0_7_5 - 0.0144642857142863*G0_1_0_7_7 + 0.00254768668831181*G0_1_0_7_8 - 0.000493100649350682*G0_1_0_7_9 + 0.00069399350649354*G0_1_0_8_0 - 0.00225547889610398*G0_1_0_8_1 + 0.000273944805194816*G0_1_0_8_2 + 0.00254768668831176*G0_1_0_8_3 - 0.000164366883116886*G0_1_0_8_4 - 0.00172585227272732*G0_1_0_8_5 - 0.000493100649350671*G0_1_0_8_6 + 0.00254768668831181*G0_1_0_8_7 + 0.0121631493506498*G0_1_0_8_8 + 0.001479301948052*G0_1_0_8_9 + 0.000164366883116883*G0_1_0_9_0 - 0.000383522727272745*G0_1_0_9_1 - 0.00109577922077926*G0_1_0_9_2 + 0.00591720779220799*G0_1_0_9_3 + 0.00197240259740265*G0_1_0_9_4 + 0.00295860389610399*G0_1_0_9_5 + 0.000986201298701332*G0_1_0_9_6 - 0.000493100649350681*G0_1_0_9_7 + 0.001479301948052*G0_1_0_9_8 - 0.0295860389610399*G0_1_0_9_9; + A[60] = -A[40] + 0.0525974025974045*G0_1_0_0_0 + 0.00393567370129884*G0_1_0_0_1 + 0.00307426948051959*G0_1_0_0_2 - 0.00170758928571436*G0_1_0_0_3 - 0.000858360389610423*G0_1_0_0_4 + 0.0196783685064942*G0_1_0_0_5 - 0.0100994318181822*G0_1_0_0_6 + 0.0389458198051962*G0_1_0_0_7 - 0.0165827922077928*G0_1_0_0_8 + 0.00476663961038981*G0_1_0_0_9 + 0.00393567370129884*G0_1_0_1_0 + 0.00787134740259767*G0_1_0_1_1 + 0.00106534090909095*G0_1_0_1_2 + 0.00241984577922085*G0_1_0_1_3 + 0.00124188311688316*G0_1_0_1_4 + 0.000757913961038991*G0_1_0_1_5 + 0.00111404220779225*G0_1_0_1_6 + 0.00544237012987032*G0_1_0_1_7 - 0.000173498376623372*G0_1_0_1_8 + 0.00378043831168845*G0_1_0_1_9 + 0.00307426948051959*G0_1_0_2_0 + 0.00106534090909095*G0_1_0_2_1 + 0.0154017857142863*G0_1_0_2_2 - 0.00249289772727282*G0_1_0_2_3 + 0.0090401785714289*G0_1_0_2_4 - 0.00167106331168838*G0_1_0_2_5 + 0.00246550324675336*G0_1_0_2_6 + 0.00346996753246765*G0_1_0_2_7 - 0.00146103896103901*G0_1_0_2_8 - 0.000767045454545472*G0_1_0_2_9 - 0.00170758928571436*G0_1_0_3_0 + 0.00241984577922085*G0_1_0_3_1 - 0.00249289772727282*G0_1_0_3_2 - 0.0238331980519489*G0_1_0_3_3 - 0.0134780844155849*G0_1_0_3_4 + 0.00336952110389621*G0_1_0_3_5 - 0.0072321428571431*G0_1_0_3_6 + 0.00123275162337664*G0_1_0_3_7 - 0.00172585227272732*G0_1_0_3_8 - 0.0138068181818186*G0_1_0_3_9 - 0.000858360389610423*G0_1_0_4_0 + 0.00124188311688316*G0_1_0_4_1 + 0.0090401785714289*G0_1_0_4_2 - 0.0134780844155849*G0_1_0_4_3 - 0.00361607142857159*G0_1_0_4_4 - 0.00131493506493512*G0_1_0_4_5 + 0.00854707792207822*G0_1_0_4_6 - 0.00197240259740267*G0_1_0_4_7 + 0.000493100649350667*G0_1_0_4_8 + 0.00493100649350664*G0_1_0_4_9 + 0.0196783685064942*G0_1_0_5_0 + 0.000757913961038991*G0_1_0_5_1 - 0.00167106331168838*G0_1_0_5_2 + 0.00336952110389621*G0_1_0_5_3 - 0.00131493506493512*G0_1_0_5_4 - 0.0134780844155848*G0_1_0_5_5 - 0.00460227272727292*G0_1_0_5_6 + 0.0204636769480527*G0_1_0_5_7 - 0.00616375811688335*G0_1_0_5_8 - 0.00197240259740265*G0_1_0_5_9 - 0.0100994318181822*G0_1_0_6_0 + 0.00111404220779225*G0_1_0_6_1 + 0.00246550324675336*G0_1_0_6_2 - 0.0072321428571431*G0_1_0_6_3 + 0.00854707792207822*G0_1_0_6_4 - 0.00460227272727292*G0_1_0_6_5 + 0.0259699675324684*G0_1_0_6_6 - 0.0142999188311693*G0_1_0_6_7 + 0.00246550324675334*G0_1_0_6_8 + 0.0167654220779226*G0_1_0_6_9 + 0.0389458198051962*G0_1_0_7_0 + 0.00544237012987032*G0_1_0_7_1 + 0.00346996753246765*G0_1_0_7_2 + 0.00123275162337664*G0_1_0_7_3 - 0.00197240259740267*G0_1_0_7_4 + 0.0204636769480527*G0_1_0_7_5 - 0.0142999188311693*G0_1_0_7_6 + 0.10568790584416*G0_1_0_7_7 - 0.0316406250000012*G0_1_0_7_8 + 0.0142999188311694*G0_1_0_7_9 - 0.0165827922077928*G0_1_0_8_0 - 0.000173498376623372*G0_1_0_8_1 - 0.00146103896103901*G0_1_0_8_2 - 0.00172585227272732*G0_1_0_8_3 + 0.000493100649350667*G0_1_0_8_4 - 0.00616375811688335*G0_1_0_8_5 + 0.00246550324675334*G0_1_0_8_6 - 0.0316406250000012*G0_1_0_8_7 - 0.0082183441558444*G0_1_0_8_8 - 0.0123275162337667*G0_1_0_8_9 + 0.00476663961038981*G0_1_0_9_0 + 0.00378043831168845*G0_1_0_9_1 - 0.000767045454545472*G0_1_0_9_2 - 0.0138068181818186*G0_1_0_9_3 + 0.00493100649350664*G0_1_0_9_4 - 0.00197240259740265*G0_1_0_9_5 + 0.0167654220779226*G0_1_0_9_6 + 0.0142999188311694*G0_1_0_9_7 - 0.0123275162337667*G0_1_0_9_8 + 0.0867857142857172*G0_1_0_9_9 + 0.0525974025974045*G0_1_1_0_0 + 0.00393567370129884*G0_1_1_0_1 + 0.00307426948051959*G0_1_1_0_2 - 0.00170758928571436*G0_1_1_0_3 - 0.000858360389610423*G0_1_1_0_4 + 0.0196783685064942*G0_1_1_0_5 - 0.0100994318181822*G0_1_1_0_6 + 0.0389458198051962*G0_1_1_0_7 - 0.0165827922077928*G0_1_1_0_8 + 0.00476663961038981*G0_1_1_0_9 + 0.00393567370129884*G0_1_1_1_0 + 0.00787134740259767*G0_1_1_1_1 + 0.00106534090909095*G0_1_1_1_2 + 0.00241984577922085*G0_1_1_1_3 + 0.00124188311688317*G0_1_1_1_4 + 0.000757913961038992*G0_1_1_1_5 + 0.00111404220779225*G0_1_1_1_6 + 0.00544237012987032*G0_1_1_1_7 - 0.000173498376623374*G0_1_1_1_8 + 0.00378043831168845*G0_1_1_1_9 + 0.00307426948051959*G0_1_1_2_0 + 0.00106534090909095*G0_1_1_2_1 + 0.0154017857142863*G0_1_1_2_2 - 0.00249289772727282*G0_1_1_2_3 + 0.0090401785714289*G0_1_1_2_4 - 0.00167106331168838*G0_1_1_2_5 + 0.00246550324675336*G0_1_1_2_6 + 0.00346996753246765*G0_1_1_2_7 - 0.00146103896103901*G0_1_1_2_8 - 0.000767045454545471*G0_1_1_2_9 - 0.00170758928571436*G0_1_1_3_0 + 0.00241984577922085*G0_1_1_3_1 - 0.00249289772727282*G0_1_1_3_2 - 0.0238331980519489*G0_1_1_3_3 - 0.0134780844155849*G0_1_1_3_4 + 0.00336952110389621*G0_1_1_3_5 - 0.0072321428571431*G0_1_1_3_6 + 0.00123275162337664*G0_1_1_3_7 - 0.00172585227272732*G0_1_1_3_8 - 0.0138068181818187*G0_1_1_3_9 - 0.000858360389610423*G0_1_1_4_0 + 0.00124188311688317*G0_1_1_4_1 + 0.0090401785714289*G0_1_1_4_2 - 0.0134780844155849*G0_1_1_4_3 - 0.00361607142857161*G0_1_1_4_4 - 0.00131493506493512*G0_1_1_4_5 + 0.00854707792207822*G0_1_1_4_6 - 0.00197240259740267*G0_1_1_4_7 + 0.000493100649350663*G0_1_1_4_8 + 0.00493100649350663*G0_1_1_4_9 + 0.0196783685064942*G0_1_1_5_0 + 0.000757913961038992*G0_1_1_5_1 - 0.00167106331168838*G0_1_1_5_2 + 0.00336952110389621*G0_1_1_5_3 - 0.00131493506493512*G0_1_1_5_4 - 0.0134780844155848*G0_1_1_5_5 - 0.00460227272727292*G0_1_1_5_6 + 0.0204636769480527*G0_1_1_5_7 - 0.00616375811688335*G0_1_1_5_8 - 0.00197240259740264*G0_1_1_5_9 - 0.0100994318181822*G0_1_1_6_0 + 0.00111404220779225*G0_1_1_6_1 + 0.00246550324675336*G0_1_1_6_2 - 0.0072321428571431*G0_1_1_6_3 + 0.00854707792207822*G0_1_1_6_4 - 0.00460227272727292*G0_1_1_6_5 + 0.0259699675324684*G0_1_1_6_6 - 0.0142999188311693*G0_1_1_6_7 + 0.00246550324675334*G0_1_1_6_8 + 0.0167654220779226*G0_1_1_6_9 + 0.0389458198051962*G0_1_1_7_0 + 0.00544237012987032*G0_1_1_7_1 + 0.00346996753246765*G0_1_1_7_2 + 0.00123275162337665*G0_1_1_7_3 - 0.00197240259740267*G0_1_1_7_4 + 0.0204636769480527*G0_1_1_7_5 - 0.0142999188311693*G0_1_1_7_6 + 0.10568790584416*G0_1_1_7_7 - 0.0316406250000012*G0_1_1_7_8 + 0.0142999188311694*G0_1_1_7_9 - 0.0165827922077928*G0_1_1_8_0 - 0.000173498376623375*G0_1_1_8_1 - 0.00146103896103901*G0_1_1_8_2 - 0.00172585227272732*G0_1_1_8_3 + 0.000493100649350663*G0_1_1_8_4 - 0.00616375811688335*G0_1_1_8_5 + 0.00246550324675334*G0_1_1_8_6 - 0.0316406250000012*G0_1_1_8_7 - 0.00821834415584437*G0_1_1_8_8 - 0.0123275162337667*G0_1_1_8_9 + 0.00476663961038981*G0_1_1_9_0 + 0.00378043831168845*G0_1_1_9_1 - 0.000767045454545472*G0_1_1_9_2 - 0.0138068181818187*G0_1_1_9_3 + 0.00493100649350663*G0_1_1_9_4 - 0.00197240259740264*G0_1_1_9_5 + 0.0167654220779226*G0_1_1_9_6 + 0.0142999188311694*G0_1_1_9_7 - 0.0123275162337667*G0_1_1_9_8 + 0.0867857142857172*G0_1_1_9_9; + A[71] = -A[41] + 0.0180560064935071*G0_0_0_0_0 + 0.00281554383116894*G0_0_0_0_1 + 0.00271814123376634*G0_0_0_0_2 + 0.00176237824675332*G0_0_0_0_3 - 0.00125101461038966*G0_0_0_0_4 + 0.0116517857142861*G0_0_0_0_5 - 0.00341517857142866*G0_0_0_0_6 + 0.00462053571428585*G0_0_0_0_7 - 0.00315949675324685*G0_0_0_0_8 - 0.00098620129870132*G0_0_0_0_9 + 0.00281554383116894*G0_0_0_1_0 + 0.047118506493508*G0_0_0_1_1 + 0.0037956574675326*G0_0_0_1_2 + 0.0306818181818192*G0_0_0_1_3 - 0.0130945616883121*G0_0_0_1_4 + 0.000721387987013005*G0_0_0_1_5 + 0.000885754870129908*G0_0_0_1_6 - 0.00816355519480549*G0_0_0_1_7 + 0.0158887987012993*G0_0_0_1_8 + 0.0037256493506495*G0_0_0_1_9 + 0.00271814123376634*G0_0_0_2_0 + 0.0037956574675326*G0_0_0_2_1 + 0.0200162337662345*G0_0_0_2_2 + 0.000894886363636376*G0_0_0_2_3 + 0.00571631493506517*G0_0_0_2_4 - 0.00429180194805212*G0_0_0_2_5 + 0.0132406655844161*G0_0_0_2_6 + 0.000885754870129897*G0_0_0_2_7 - 0.000374391233766243*G0_0_0_2_8 + 0.00427353896103911*G0_0_0_2_9 + 0.00176237824675332*G0_0_0_3_0 + 0.0306818181818192*G0_0_0_3_1 + 0.000894886363636376*G0_0_0_3_2 + 0.0726501623376649*G0_0_0_3_3 - 0.0222717126623384*G0_0_0_3_4 - 0.00197240259740265*G0_0_0_3_5 - 0.00616375811688334*G0_0_0_3_6 - 0.00879362824675359*G0_0_0_3_7 + 0.0111769480519485*G0_0_0_3_8 + 0.00641030844155871*G0_0_0_3_9 - 0.00125101461038966*G0_0_0_4_0 - 0.0130945616883121*G0_0_0_4_1 + 0.00571631493506517*G0_0_0_4_2 - 0.0222717126623384*G0_0_0_4_3 - 0.0161079545454551*G0_0_0_4_4 + 0.000246550324675315*G0_0_0_4_5 + 0.00591720779220803*G0_0_0_4_6 + 0.00230113636363645*G0_0_0_4_7 - 0.00238331980519491*G0_0_0_4_8 - 0.013313717532468*G0_0_0_4_9 + 0.0116517857142861*G0_0_0_5_0 + 0.000721387987013005*G0_0_0_5_1 - 0.00429180194805212*G0_0_0_5_2 - 0.00197240259740265*G0_0_0_5_3 + 0.000246550324675315*G0_0_0_5_4 + 0.0535836038961057*G0_0_0_5_5 - 0.0201349431818189*G0_0_0_5_6 + 0.011834415584416*G0_0_0_5_7 - 0.00567065746753266*G0_0_0_5_8 + 0.0142999188311693*G0_0_0_5_9 - 0.00341517857142865*G0_0_0_6_0 + 0.000885754870129908*G0_0_0_6_1 + 0.0132406655844161*G0_0_0_6_2 - 0.00616375811688334*G0_0_0_6_3 + 0.00591720779220803*G0_0_0_6_4 - 0.0201349431818189*G0_0_0_6_5 + 0.0575284090909111*G0_0_0_6_6 - 0.00616375811688332*G0_0_0_6_7 + 0.000986201298701333*G0_0_0_6_8 - 0.000493100649350668*G0_0_0_6_9 + 0.00462053571428585*G0_0_0_7_0 - 0.00816355519480549*G0_0_0_7_1 + 0.000885754870129897*G0_0_0_7_2 - 0.00879362824675359*G0_0_0_7_3 + 0.00230113636363645*G0_0_0_7_4 + 0.011834415584416*G0_0_0_7_5 - 0.00616375811688332*G0_0_0_7_6 + 0.0193952922077929*G0_0_0_7_7 - 0.00106838474025981*G0_0_0_7_8 + 0.0152861201298707*G0_0_0_7_9 - 0.00315949675324685*G0_0_0_8_0 + 0.0158887987012993*G0_0_0_8_1 - 0.000374391233766242*G0_0_0_8_2 + 0.0111769480519485*G0_0_0_8_3 - 0.00238331980519491*G0_0_0_8_4 - 0.00567065746753266*G0_0_0_8_5 + 0.000986201298701333*G0_0_0_8_6 - 0.00106838474025981*G0_0_0_8_7 - 0.0210389610389617*G0_0_0_8_8 - 0.00641030844155865*G0_0_0_8_9 - 0.00098620129870132*G0_0_0_9_0 + 0.0037256493506495*G0_0_0_9_1 + 0.00427353896103911*G0_0_0_9_2 + 0.00641030844155871*G0_0_0_9_3 - 0.013313717532468*G0_0_0_9_4 + 0.0142999188311693*G0_0_0_9_5 - 0.000493100649350668*G0_0_0_9_6 + 0.0152861201298707*G0_0_0_9_7 - 0.00641030844155865*G0_0_0_9_8 + 0.0374756493506506*G0_0_0_9_9 - 0.00196022727272735*G0_1_0_0_0 - 0.000980113636363676*G0_1_0_0_1 + 0.00213676948051957*G0_1_0_0_3 - 0.00213676948051956*G0_1_0_0_4 - 0.00158887987012993*G0_1_0_0_5 + 0.000876623376623411*G0_1_0_0_6 - 0.00109577922077926*G0_1_0_0_7 - 0.00405438311688326*G0_1_0_0_8 - 0.00525974025974044*G0_1_0_0_9 - 0.000980113636363675*G0_1_0_1_0 + 0.00098011363636367*G0_1_0_1_2 + 0.01479301948052*G0_1_0_1_3 - 0.00493100649350665*G0_1_0_1_4 - 0.000164366883116888*G0_1_0_1_5 + 0.000164366883116886*G0_1_0_1_6 + 0.00493100649350668*G0_1_0_1_7 - 0.01479301948052*G0_1_0_1_8 + 0.00098011363636367*G0_1_0_2_1 + 0.00196022727272736*G0_1_0_2_2 + 0.00405438311688325*G0_1_0_2_3 + 0.00109577922077927*G0_1_0_2_4 - 0.000876623376623415*G0_1_0_2_5 + 0.00158887987012994*G0_1_0_2_6 + 0.00213676948051955*G0_1_0_2_7 - 0.00213676948051955*G0_1_0_2_8 + 0.00525974025974044*G0_1_0_2_9 + 0.00213676948051957*G0_1_0_3_0 + 0.01479301948052*G0_1_0_3_1 + 0.00405438311688325*G0_1_0_3_2 + 0.0936891233766268*G0_1_0_3_3 - 0.0212033279220787*G0_1_0_3_4 - 0.002958603896104*G0_1_0_3_5 - 0.000493100649350686*G0_1_0_3_6 - 0.00641030844155872*G0_1_0_3_7 + 0.0128206168831174*G0_1_0_3_9 - 0.00213676948051956*G0_1_0_4_0 - 0.00493100649350665*G0_1_0_4_1 + 0.00109577922077927*G0_1_0_4_2 - 0.0212033279220787*G0_1_0_4_3 - 0.035503246753248*G0_1_0_4_4 + 0.00641030844155866*G0_1_0_4_5 - 0.00591720779220798*G0_1_0_4_6 + 0.00641030844155863*G0_1_0_4_8 - 0.0285998376623387*G0_1_0_4_9 - 0.00158887987012993*G0_1_0_5_0 - 0.000164366883116888*G0_1_0_5_1 - 0.000876623376623415*G0_1_0_5_2 - 0.002958603896104*G0_1_0_5_3 + 0.00641030844155866*G0_1_0_5_4 - 0.00394480519480533*G0_1_0_5_5 + 0.005917207792208*G0_1_0_5_7 + 0.000493100649350662*G0_1_0_5_8 + 0.01479301948052*G0_1_0_5_9 + 0.000876623376623411*G0_1_0_6_0 + 0.000164366883116886*G0_1_0_6_1 + 0.00158887987012994*G0_1_0_6_2 - 0.000493100649350686*G0_1_0_6_3 - 0.00591720779220798*G0_1_0_6_4 + 0.00394480519480537*G0_1_0_6_6 - 0.00641030844155866*G0_1_0_6_7 + 0.00295860389610399*G0_1_0_6_8 - 0.01479301948052*G0_1_0_6_9 - 0.00109577922077926*G0_1_0_7_0 + 0.00493100649350669*G0_1_0_7_1 + 0.00213676948051955*G0_1_0_7_2 - 0.00641030844155872*G0_1_0_7_3 + 0.005917207792208*G0_1_0_7_5 - 0.00641030844155866*G0_1_0_7_6 + 0.0355032467532481*G0_1_0_7_7 + 0.0212033279220786*G0_1_0_7_8 + 0.0285998376623386*G0_1_0_7_9 - 0.00405438311688326*G0_1_0_8_0 - 0.01479301948052*G0_1_0_8_1 - 0.00213676948051955*G0_1_0_8_2 + 0.00641030844155863*G0_1_0_8_4 + 0.000493100649350662*G0_1_0_8_5 + 0.00295860389610399*G0_1_0_8_6 + 0.0212033279220786*G0_1_0_8_7 - 0.0936891233766266*G0_1_0_8_8 - 0.0128206168831173*G0_1_0_8_9 - 0.00525974025974044*G0_1_0_9_0 + 0.00525974025974044*G0_1_0_9_2 + 0.0128206168831174*G0_1_0_9_3 - 0.0285998376623386*G0_1_0_9_4 + 0.01479301948052*G0_1_0_9_5 - 0.01479301948052*G0_1_0_9_6 + 0.0285998376623386*G0_1_0_9_7 - 0.0128206168831173*G0_1_0_9_8; + A[13] = A[15] + 0.00254464285714293*G0_0_0_0_0 + 0.00127232142857148*G0_0_0_0_1 + 0.00483969155844175*G0_0_0_0_3 - 0.00359780844155858*G0_0_0_0_4 + 0.00463879870129885*G0_0_0_0_5 - 0.00505884740259758*G0_0_0_0_6 + 0.000620941558441568*G0_0_0_0_7 + 0.002976866883117*G0_0_0_0_8 + 0.00241071428571438*G0_0_0_0_9 + 0.00127232142857148*G0_0_0_1_0 + 0.0130275974025979*G0_0_0_1_1 + 0.00103490259740263*G0_0_0_1_2 + 0.019267451298702*G0_0_0_1_3 - 0.00818181818181847*G0_0_0_1_4 + 0.000894886363636393*G0_0_0_1_5 - 0.00113230519480524*G0_0_0_1_6 - 0.00507711038961059*G0_0_0_1_7 + 0.0103185876623381*G0_0_0_1_8 + 0.00339691558441571*G0_0_0_1_9 + 0.00103490259740263*G0_0_0_2_1 - 0.0164366883116889*G0_0_0_2_2 + 0.00909496753246785*G0_0_0_2_3 - 0.00684862012987039*G0_0_0_2_4 + 0.00416396103896121*G0_0_0_2_5 - 0.0117796266233771*G0_0_0_2_6 - 0.00272118506493516*G0_0_0_2_7 + 0.00368912337662351*G0_0_0_2_8 + 0.000986201298701333*G0_0_0_2_9 + 0.00483969155844175*G0_0_0_3_0 + 0.019267451298702*G0_0_0_3_1 + 0.00909496753246786*G0_0_0_3_2 + 0.0867857142857174*G0_0_0_3_3 - 0.026627435064936*G0_0_0_3_4 - 0.00690340909090933*G0_0_0_3_5 - 0.0179159902597409*G0_0_0_3_7 + 0.0323802759740272*G0_0_0_3_8 + 0.0256412337662347*G0_0_0_3_9 - 0.00359780844155858*G0_0_0_4_0 - 0.00818181818181847*G0_0_0_4_1 - 0.00684862012987039*G0_0_0_4_2 - 0.026627435064936*G0_0_0_4_3 + 0.00739650974025999*G0_0_0_4_5 - 0.00739650974026001*G0_0_0_4_6 + 0.0111769480519484*G0_0_0_4_7 - 0.0144642857142862*G0_0_0_4_8 - 0.017751623376624*G0_0_0_4_9 + 0.00463879870129885*G0_0_0_5_0 + 0.000894886363636393*G0_0_0_5_1 + 0.00416396103896121*G0_0_0_5_2 - 0.00690340909090933*G0_0_0_5_3 + 0.00739650974025999*G0_0_0_5_4 + 0.0335308441558452*G0_0_0_5_5 + 0.010355113636364*G0_0_0_5_6 + 0.00131493506493511*G0_0_0_5_7 - 0.00608157467532488*G0_0_0_5_8 + 0.00493100649350665*G0_0_0_5_9 - 0.00505884740259758*G0_0_0_6_0 - 0.00113230519480524*G0_0_0_6_1 - 0.0117796266233771*G0_0_0_6_2 - 0.00739650974026001*G0_0_0_6_4 + 0.010355113636364*G0_0_0_6_5 - 0.0147930194805201*G0_0_0_6_6 + 0.00476663961038977*G0_0_0_6_7 - 0.00213676948051956*G0_0_0_6_8 - 0.00295860389610401*G0_0_0_6_9 + 0.000620941558441569*G0_0_0_7_0 - 0.00507711038961059*G0_0_0_7_1 - 0.00272118506493516*G0_0_0_7_2 - 0.0179159902597409*G0_0_0_7_3 + 0.0111769480519484*G0_0_0_7_4 + 0.00131493506493511*G0_0_0_7_5 + 0.00476663961038977*G0_0_0_7_6 - 0.00262987012987021*G0_0_0_7_7 - 0.0149573863636369*G0_0_0_7_8 - 0.0167654220779227*G0_0_0_7_9 + 0.002976866883117*G0_0_0_8_0 + 0.0103185876623381*G0_0_0_8_1 + 0.00368912337662351*G0_0_0_8_2 + 0.0323802759740272*G0_0_0_8_3 - 0.0144642857142862*G0_0_0_8_4 - 0.00608157467532488*G0_0_0_8_5 - 0.00213676948051956*G0_0_0_8_6 - 0.0149573863636369*G0_0_0_8_7 + 0.0358319805194819*G0_0_0_8_8 + 0.0187378246753254*G0_0_0_8_9 + 0.00241071428571438*G0_0_0_9_0 + 0.00339691558441571*G0_0_0_9_1 + 0.000986201298701333*G0_0_0_9_2 + 0.0256412337662347*G0_0_0_9_3 - 0.017751623376624*G0_0_0_9_4 + 0.00493100649350665*G0_0_0_9_5 - 0.00295860389610401*G0_0_0_9_6 - 0.0167654220779227*G0_0_0_9_7 + 0.0187378246753254*G0_0_0_9_8 - 0.0788961038961064*G0_0_0_9_9 - 0.0153348214285719*G0_0_1_0_0 + 0.00766741071428602*G0_0_1_0_1 + 0.0113504464285719*G0_0_1_0_3 - 0.00475750811688329*G0_0_1_0_4 - 0.0120535714285718*G0_0_1_0_5 + 0.0030955762987014*G0_0_1_0_6 - 0.0124918831168836*G0_0_1_0_7 + 0.0187652191558449*G0_0_1_0_8 + 0.0037256493506495*G0_0_1_0_9 + 0.00766741071428602*G0_0_1_1_0 + 0.124736201298706*G0_0_1_1_1 + 0.00778612012987039*G0_0_1_1_2 + 0.0785765016233793*G0_0_1_1_3 - 0.0360146103896116*G0_0_1_1_4 - 0.00223721590909099*G0_0_1_1_5 - 0.00122362012987017*G0_0_1_1_6 - 0.0375669642857157*G0_0_1_1_7 + 0.0830509334415616*G0_0_1_1_8 + 0.0149573863636369*G0_0_1_1_9 + 0.00778612012987039*G0_0_1_2_1 - 0.00584415584415606*G0_0_1_2_2 + 0.0157061688311694*G0_0_1_2_3 - 0.00875710227272758*G0_0_1_2_4 - 0.00151582792207796*G0_0_1_2_5 - 0.00384435876623391*G0_0_1_2_6 - 0.00519581980519499*G0_0_1_2_7 + 0.0119257305194809*G0_0_1_2_8 + 0.004437905844156*G0_0_1_2_9 + 0.0113504464285719*G0_0_1_3_0 + 0.0785765016233793*G0_0_1_3_1 + 0.0157061688311694*G0_0_1_3_2 + 0.16798295454546*G0_0_1_3_3 - 0.0652536525974048*G0_0_1_3_4 - 0.00788961038961066*G0_0_1_3_5 - 0.00788961038961067*G0_0_1_3_6 - 0.0456118100649368*G0_0_1_3_7 + 0.0929494724026008*G0_0_1_3_8 + 0.0463514610389628*G0_0_1_3_9 - 0.00475750811688329*G0_0_1_4_0 - 0.0360146103896116*G0_0_1_4_1 - 0.00875710227272758*G0_0_1_4_2 - 0.0652536525974048*G0_0_1_4_3 + 0.0407629870129884*G0_0_1_4_4 + 0.00271205357142866*G0_0_1_4_5 + 0.00517755681818199*G0_0_1_4_6 + 0.020710227272728*G0_0_1_4_7 - 0.047337662337664*G0_0_1_4_8 - 0.0187378246753254*G0_0_1_4_9 - 0.0120535714285718*G0_0_1_5_0 - 0.00223721590909099*G0_0_1_5_1 - 0.00151582792207796*G0_0_1_5_2 - 0.00788961038961066*G0_0_1_5_3 + 0.00271205357142866*G0_0_1_5_4 - 0.00131493506493511*G0_0_1_5_5 + 0.0127384334415589*G0_0_1_5_6 + 0.000821834415584453*G0_0_1_5_7 - 0.00484882305194822*G0_0_1_5_8 - 0.00147930194805203*G0_0_1_5_9 + 0.0030955762987014*G0_0_1_6_0 - 0.00122362012987017*G0_0_1_6_1 - 0.00384435876623391*G0_0_1_6_2 - 0.00788961038961067*G0_0_1_6_3 + 0.00517755681818199*G0_0_1_6_4 + 0.0127384334415589*G0_0_1_6_5 + 0.0228469967532475*G0_0_1_6_6 + 0.00402698863636378*G0_0_1_6_7 - 0.0102729301948055*G0_0_1_6_8 + 0.00246550324675332*G0_0_1_6_9 - 0.0124918831168836*G0_0_1_7_0 - 0.0375669642857157*G0_0_1_7_1 - 0.00519581980519499*G0_0_1_7_2 - 0.0456118100649368*G0_0_1_7_3 + 0.020710227272728*G0_0_1_7_4 + 0.000821834415584453*G0_0_1_7_5 + 0.00402698863636378*G0_0_1_7_6 + 0.0420779220779236*G0_0_1_7_7 - 0.0710886769480546*G0_0_1_7_8 - 0.019230925324676*G0_0_1_7_9 + 0.0187652191558449*G0_0_1_8_0 + 0.0830509334415616*G0_0_1_8_1 + 0.0119257305194809*G0_0_1_8_2 + 0.0929494724026008*G0_0_1_8_3 - 0.047337662337664*G0_0_1_8_4 - 0.00484882305194822*G0_0_1_8_5 - 0.0102729301948055*G0_0_1_8_6 - 0.0710886769480546*G0_0_1_8_7 + 0.193459821428578*G0_0_1_8_8 + 0.0498031655844174*G0_0_1_8_9 + 0.0037256493506495*G0_0_1_9_0 + 0.0149573863636369*G0_0_1_9_1 + 0.004437905844156*G0_0_1_9_2 + 0.0463514610389628*G0_0_1_9_3 - 0.0187378246753254*G0_0_1_9_4 - 0.00147930194805203*G0_0_1_9_5 + 0.00246550324675332*G0_0_1_9_6 - 0.019230925324676*G0_0_1_9_7 + 0.0498031655844174*G0_0_1_9_8 - 0.00394480519480522*G0_0_1_9_9; + A[30] = A[4] - 0.000161323051948059*G0_0_0_0_1 + 0.00117491883116888*G0_0_0_0_2 - 0.00210937500000008*G0_0_0_0_3 + 0.00109577922077927*G0_0_0_0_4 + 0.000684862012987039*G0_0_0_0_5 - 0.000684862012987041*G0_0_0_0_7 + 0.000219155844155851*G0_0_0_0_8 - 0.000164366883116889*G0_0_0_0_9 - 0.000161323051948059*G0_0_0_1_0 - 0.0034943181818183*G0_0_0_1_1 + 0.0010988230519481*G0_0_0_1_2 - 0.00608157467532489*G0_0_0_1_3 + 0.00599939123376645*G0_0_0_1_4 - 0.000301339285714298*G0_0_0_1_5 - 0.000465706168831181*G0_0_0_1_6 + 0.000356128246753262*G0_0_0_1_7 - 0.00202719155844164*G0_0_0_1_8 - 0.002958603896104*G0_0_0_1_9 + 0.00117491883116888*G0_0_0_2_0 + 0.0010988230519481*G0_0_0_2_1 + 0.0269379058441568*G0_0_0_2_2 - 0.00871144480519512*G0_0_0_2_3 + 0.0201349431818189*G0_0_0_2_4 - 0.0047666396103898*G0_0_0_2_5 + 0.0102729301948056*G0_0_0_2_6 - 0.000712256493506518*G0_0_0_2_7 + 0.000356128246753254*G0_0_0_2_8 + 0.004437905844156*G0_0_0_2_9 - 0.00210937500000008*G0_0_0_3_0 - 0.00608157467532489*G0_0_0_3_1 - 0.00871144480519512*G0_0_0_3_2 - 0.0502962662337679*G0_0_0_3_3 - 0.0120809659090914*G0_0_0_3_4 + 0.00394480519480533*G0_0_0_3_5 + 0.000739650974025973*G0_0_0_3_6 + 0.00567065746753267*G0_0_0_3_7 - 0.00394480519480536*G0_0_0_3_8 - 0.00246550324675336*G0_0_0_3_9 + 0.00109577922077927*G0_0_0_4_0 + 0.00599939123376645*G0_0_0_4_1 + 0.0201349431818189*G0_0_0_4_2 - 0.0120809659090914*G0_0_0_4_3 + 0.0261343344155854*G0_0_0_4_4 - 0.00394480519480536*G0_0_0_4_5 + 0.00320515422077939*G0_0_0_4_6 - 0.000246550324675344*G0_0_0_4_7 - 0.00172585227272732*G0_0_0_4_8 - 0.00542410714285729*G0_0_0_4_9 + 0.000684862012987039*G0_0_0_5_0 - 0.000301339285714298*G0_0_0_5_1 - 0.0047666396103898*G0_0_0_5_2 + 0.00394480519480533*G0_0_0_5_3 - 0.00394480519480536*G0_0_0_5_4 + 0.010355113636364*G0_0_0_5_5 - 0.00147930194805204*G0_0_0_5_6 - 0.00172585227272733*G0_0_0_5_7 + 0.000246550324675329*G0_0_0_5_8 - 0.000465706168831182*G0_0_0_6_1 + 0.0102729301948056*G0_0_0_6_2 + 0.000739650974025973*G0_0_0_6_3 + 0.00320515422077939*G0_0_0_6_4 - 0.00147930194805204*G0_0_0_6_5 - 0.0325446428571439*G0_0_0_6_6 + 0.00147930194805199*G0_0_0_6_7 + 0.000493100649350667*G0_0_0_6_8 - 0.01479301948052*G0_0_0_6_9 - 0.000684862012987041*G0_0_0_7_0 + 0.000356128246753262*G0_0_0_7_1 - 0.000712256493506518*G0_0_0_7_2 + 0.00567065746753267*G0_0_0_7_3 - 0.000246550324675344*G0_0_0_7_4 - 0.00172585227272733*G0_0_0_7_5 + 0.00147930194805199*G0_0_0_7_6 - 0.00690340909090938*G0_0_0_7_7 + 0.00221895292207802*G0_0_0_7_8 - 0.00246550324675333*G0_0_0_7_9 + 0.000219155844155851*G0_0_0_8_0 - 0.00202719155844164*G0_0_0_8_1 + 0.000356128246753254*G0_0_0_8_2 - 0.00394480519480536*G0_0_0_8_3 - 0.00172585227272732*G0_0_0_8_4 + 0.00024655032467533*G0_0_0_8_5 + 0.000493100649350667*G0_0_0_8_6 + 0.00221895292207802*G0_0_0_8_7 + 0.00690340909090931*G0_0_0_8_8 + 0.0123275162337666*G0_0_0_8_9 - 0.000164366883116888*G0_0_0_9_0 - 0.002958603896104*G0_0_0_9_1 + 0.004437905844156*G0_0_0_9_2 - 0.00246550324675336*G0_0_0_9_3 - 0.00542410714285729*G0_0_0_9_4 - 0.01479301948052*G0_0_0_9_6 - 0.00246550324675333*G0_0_0_9_7 + 0.0123275162337666*G0_0_0_9_8 + 0.0295860389610399*G0_0_0_9_9 - 0.000608766233766261*G0_0_1_0_1 + 0.000608766233766258*G0_0_1_0_2 - 0.00109577922077926*G0_0_1_0_3 + 0.00109577922077927*G0_0_1_0_4 + 0.002922077922078*G0_0_1_0_5 - 0.000913149350649374*G0_0_1_0_6 - 0.00292207792207805*G0_0_1_0_7 + 0.000913149350649392*G0_0_1_0_8 - 0.000608766233766261*G0_0_1_1_0 - 0.0104707792207796*G0_0_1_1_1 - 0.0090036525974029*G0_0_1_1_3 + 0.00504971590909108*G0_0_1_1_4 + 0.000493100649350662*G0_0_1_1_5 - 0.000630073051948071*G0_0_1_1_6 + 0.0010318587662338*G0_0_1_1_7 - 0.00428267045454562*G0_0_1_1_8 - 0.00334212662337674*G0_0_1_1_9 + 0.000608766233766258*G0_0_1_2_0 + 0.0104707792207796*G0_0_1_2_2 - 0.00504971590909109*G0_0_1_2_3 + 0.00900365259740293*G0_0_1_2_4 - 0.00103185876623382*G0_0_1_2_5 + 0.00428267045454563*G0_0_1_2_6 - 0.000493100649350669*G0_0_1_2_7 + 0.00063007305194807*G0_0_1_2_8 + 0.00334212662337674*G0_0_1_2_9 - 0.00109577922077926*G0_0_1_3_0 - 0.0090036525974029*G0_0_1_3_1 - 0.00504971590909109*G0_0_1_3_2 - 0.0261343344155853*G0_0_1_3_3 + 0.000904017857142896*G0_0_1_3_5 + 0.00189021915584421*G0_0_1_3_6 + 0.0032873376623378*G0_0_1_3_7 - 0.00139711850649359*G0_0_1_3_8 + 0.00345170454545463*G0_0_1_3_9 + 0.00109577922077927*G0_0_1_4_0 + 0.00504971590909108*G0_0_1_4_1 + 0.00900365259740293*G0_0_1_4_2 + 0.0261343344155854*G0_0_1_4_4 - 0.00328733766233779*G0_0_1_4_5 + 0.00139711850649358*G0_0_1_4_6 - 0.000904017857142892*G0_0_1_4_7 - 0.00189021915584421*G0_0_1_4_8 - 0.00345170454545464*G0_0_1_4_9 + 0.002922077922078*G0_0_1_5_0 + 0.000493100649350662*G0_0_1_5_1 - 0.00103185876623382*G0_0_1_5_2 + 0.000904017857142896*G0_0_1_5_3 - 0.00328733766233779*G0_0_1_5_4 + 0.0213676948051955*G0_0_1_5_5 - 0.00476663961038977*G0_0_1_5_6 - 0.00147930194805199*G0_0_1_5_8 + 0.00295860389610399*G0_0_1_5_9 - 0.000913149350649374*G0_0_1_6_0 - 0.000630073051948071*G0_0_1_6_1 + 0.00428267045454563*G0_0_1_6_2 + 0.00189021915584421*G0_0_1_6_3 + 0.00139711850649358*G0_0_1_6_4 - 0.00476663961038977*G0_0_1_6_5 - 0.0190665584415591*G0_0_1_6_6 + 0.00147930194805201*G0_0_1_6_7 - 0.0138068181818186*G0_0_1_6_9 - 0.00292207792207805*G0_0_1_7_0 + 0.0010318587662338*G0_0_1_7_1 - 0.000493100649350669*G0_0_1_7_2 + 0.0032873376623378*G0_0_1_7_3 - 0.000904017857142893*G0_0_1_7_4 + 0.00147930194805201*G0_0_1_7_6 - 0.0213676948051957*G0_0_1_7_7 + 0.00476663961038983*G0_0_1_7_8 - 0.00295860389610402*G0_0_1_7_9 + 0.000913149350649392*G0_0_1_8_0 - 0.00428267045454562*G0_0_1_8_1 + 0.00063007305194807*G0_0_1_8_2 - 0.00139711850649359*G0_0_1_8_3 - 0.00189021915584421*G0_0_1_8_4 - 0.00147930194805199*G0_0_1_8_5 + 0.00476663961038983*G0_0_1_8_7 + 0.0190665584415591*G0_0_1_8_8 + 0.0138068181818186*G0_0_1_8_9 - 0.00334212662337674*G0_0_1_9_1 + 0.00334212662337674*G0_0_1_9_2 + 0.00345170454545463*G0_0_1_9_3 - 0.00345170454545464*G0_0_1_9_4 + 0.00295860389610399*G0_0_1_9_5 - 0.0138068181818186*G0_0_1_9_6 - 0.00295860389610402*G0_0_1_9_7 + 0.0138068181818186*G0_0_1_9_8 - 0.000727475649350686*G0_1_0_0_1 + 0.000727475649350678*G0_1_0_0_2 - 0.00210937500000008*G0_1_0_0_3 + 0.00210937500000009*G0_1_0_0_4 - 0.00155235389610399*G0_1_0_0_5 + 0.000639204545454591*G0_1_0_0_6 + 0.00155235389610389*G0_1_0_0_7 - 0.000639204545454548*G0_1_0_0_8 - 0.000727475649350686*G0_1_0_1_0 - 0.0199614448051955*G0_1_0_1_1 - 0.0172128652597409*G0_1_0_1_3 + 0.00966112012987047*G0_1_0_1_4 - 0.000191761363636363*G0_1_0_1_6 + 0.00409090909090924*G0_1_0_1_7 - 0.00801745129870161*G0_1_0_1_8 - 0.00405438311688327*G0_1_0_1_9 + 0.000727475649350678*G0_1_0_2_0 + 0.0199614448051955*G0_1_0_2_2 - 0.00966112012987047*G0_1_0_2_3 + 0.0172128652597409*G0_1_0_2_4 - 0.00409090909090926*G0_1_0_2_5 + 0.00801745129870162*G0_1_0_2_6 + 0.000191761363636366*G0_1_0_2_8 + 0.00405438311688325*G0_1_0_2_9 - 0.00210937500000008*G0_1_0_3_0 - 0.0172128652597409*G0_1_0_3_1 - 0.00966112012987047*G0_1_0_3_2 - 0.050296266233768*G0_1_0_3_3 + 0.00328733766233778*G0_1_0_3_5 + 0.000575284090909091*G0_1_0_3_6 + 0.00632812500000025*G0_1_0_3_7 - 0.00575284090909117*G0_1_0_3_8 - 0.000493100649350716*G0_1_0_3_9 + 0.00210937500000009*G0_1_0_4_0 + 0.00966112012987047*G0_1_0_4_1 + 0.0172128652597409*G0_1_0_4_2 + 0.0502962662337681*G0_1_0_4_4 - 0.00632812500000024*G0_1_0_4_5 + 0.00575284090909116*G0_1_0_4_6 - 0.00328733766233779*G0_1_0_4_7 - 0.000575284090909087*G0_1_0_4_8 + 0.000493100649350725*G0_1_0_4_9 - 0.00155235389610399*G0_1_0_5_0 - 0.00409090909090926*G0_1_0_5_2 + 0.00328733766233778*G0_1_0_5_3 - 0.00632812500000025*G0_1_0_5_4 - 0.00410917207792224*G0_1_0_5_5 + 0.00106838474025977*G0_1_0_5_6 + 0.000246550324675356*G0_1_0_5_8 - 0.000493100649350691*G0_1_0_5_9 + 0.00063920454545459*G0_1_0_6_0 - 0.000191761363636363*G0_1_0_6_1 + 0.00801745129870162*G0_1_0_6_2 + 0.000575284090909092*G0_1_0_6_3 + 0.00575284090909116*G0_1_0_6_4 + 0.00106838474025977*G0_1_0_6_5 - 0.0203814935064942*G0_1_0_6_6 - 0.000246550324675313*G0_1_0_6_7 - 0.013313717532468*G0_1_0_6_9 + 0.00155235389610389*G0_1_0_7_0 + 0.00409090909090924*G0_1_0_7_1 + 0.00632812500000025*G0_1_0_7_3 - 0.00328733766233779*G0_1_0_7_4 - 0.000246550324675313*G0_1_0_7_6 + 0.00410917207792205*G0_1_0_7_7 - 0.00106838474025969*G0_1_0_7_8 + 0.000493100649350646*G0_1_0_7_9 - 0.000639204545454548*G0_1_0_8_0 - 0.00801745129870161*G0_1_0_8_1 + 0.000191761363636366*G0_1_0_8_2 - 0.00575284090909116*G0_1_0_8_3 - 0.000575284090909087*G0_1_0_8_4 + 0.000246550324675356*G0_1_0_8_5 - 0.00106838474025969*G0_1_0_8_7 + 0.0203814935064941*G0_1_0_8_8 + 0.013313717532468*G0_1_0_8_9 - 0.00405438311688327*G0_1_0_9_1 + 0.00405438311688325*G0_1_0_9_2 - 0.000493100649350717*G0_1_0_9_3 + 0.000493100649350725*G0_1_0_9_4 - 0.000493100649350691*G0_1_0_9_5 - 0.013313717532468*G0_1_0_9_6 + 0.000493100649350646*G0_1_0_9_7 + 0.013313717532468*G0_1_0_9_8 - 0.00117491883116889*G0_1_1_0_1 + 0.000161323051948052*G0_1_1_0_2 - 0.00109577922077926*G0_1_1_0_3 + 0.00210937500000009*G0_1_1_0_4 + 0.000684862012986973*G0_1_1_0_5 - 0.000219155844155821*G0_1_1_0_6 - 0.000684862012987116*G0_1_1_0_7 + 0.000164366883116875*G0_1_1_0_9 - 0.00117491883116889*G0_1_1_1_0 - 0.0269379058441567*G0_1_1_1_1 - 0.00109882305194809*G0_1_1_1_2 - 0.0201349431818188*G0_1_1_1_3 + 0.0087114448051951*G0_1_1_1_4 + 0.000712256493506508*G0_1_1_1_5 - 0.000356128246753252*G0_1_1_1_6 + 0.00476663961038978*G0_1_1_1_7 - 0.0102729301948056*G0_1_1_1_8 - 0.00443790584415601*G0_1_1_1_9 + 0.000161323051948052*G0_1_1_2_0 - 0.00109882305194809*G0_1_1_2_1 + 0.00349431818181831*G0_1_1_2_2 - 0.00599939123376644*G0_1_1_2_3 + 0.0060815746753249*G0_1_1_2_4 - 0.000356128246753273*G0_1_1_2_5 + 0.00202719155844164*G0_1_1_2_6 + 0.000301339285714288*G0_1_1_2_7 + 0.000465706168831181*G0_1_1_2_8 + 0.00295860389610399*G0_1_1_2_9 - 0.00109577922077926*G0_1_1_3_0 - 0.0201349431818188*G0_1_1_3_1 - 0.00599939123376644*G0_1_1_3_2 - 0.0261343344155853*G0_1_1_3_3 + 0.0120809659090913*G0_1_1_3_4 + 0.000246550324675343*G0_1_1_3_5 + 0.00172585227272732*G0_1_1_3_6 + 0.00394480519480537*G0_1_1_3_7 - 0.0032051542207794*G0_1_1_3_8 + 0.00542410714285728*G0_1_1_3_9 + 0.00210937500000009*G0_1_1_4_0 + 0.0087114448051951*G0_1_1_4_1 + 0.0060815746753249*G0_1_1_4_2 + 0.0120809659090913*G0_1_1_4_3 + 0.0502962662337681*G0_1_1_4_4 - 0.00567065746753268*G0_1_1_4_5 + 0.00394480519480536*G0_1_1_4_6 - 0.00394480519480534*G0_1_1_4_7 - 0.000739650974025973*G0_1_1_4_8 + 0.0024655032467534*G0_1_1_4_9 + 0.000684862012986973*G0_1_1_5_0 + 0.000712256493506509*G0_1_1_5_1 - 0.000356128246753273*G0_1_1_5_2 + 0.000246550324675343*G0_1_1_5_3 - 0.00567065746753268*G0_1_1_5_4 + 0.00690340909090923*G0_1_1_5_5 - 0.00221895292207796*G0_1_1_5_6 + 0.00172585227272725*G0_1_1_5_7 - 0.00147930194805196*G0_1_1_5_8 + 0.0024655032467533*G0_1_1_5_9 - 0.00021915584415582*G0_1_1_6_0 - 0.000356128246753252*G0_1_1_6_1 + 0.00202719155844164*G0_1_1_6_2 + 0.00172585227272732*G0_1_1_6_3 + 0.00394480519480536*G0_1_1_6_4 - 0.00221895292207796*G0_1_1_6_5 - 0.00690340909090932*G0_1_1_6_6 - 0.000246550324675297*G0_1_1_6_7 - 0.000493100649350677*G0_1_1_6_8 - 0.0123275162337666*G0_1_1_6_9 - 0.000684862012987116*G0_1_1_7_0 + 0.00476663961038978*G0_1_1_7_1 + 0.000301339285714288*G0_1_1_7_2 + 0.00394480519480536*G0_1_1_7_3 - 0.00394480519480534*G0_1_1_7_4 + 0.00172585227272725*G0_1_1_7_5 - 0.000246550324675297*G0_1_1_7_6 - 0.0103551136363642*G0_1_1_7_7 + 0.00147930194805213*G0_1_1_7_8 - 0.0102729301948056*G0_1_1_8_1 + 0.000465706168831181*G0_1_1_8_2 - 0.0032051542207794*G0_1_1_8_3 - 0.000739650974025973*G0_1_1_8_4 - 0.00147930194805196*G0_1_1_8_5 - 0.000493100649350677*G0_1_1_8_6 + 0.00147930194805213*G0_1_1_8_7 + 0.0325446428571438*G0_1_1_8_8 + 0.01479301948052*G0_1_1_8_9 + 0.000164366883116875*G0_1_1_9_0 - 0.00443790584415601*G0_1_1_9_1 + 0.00295860389610399*G0_1_1_9_2 + 0.00542410714285729*G0_1_1_9_3 + 0.00246550324675339*G0_1_1_9_4 + 0.0024655032467533*G0_1_1_9_5 - 0.0123275162337666*G0_1_1_9_6 + 0.01479301948052*G0_1_1_9_8 - 0.0295860389610399*G0_1_1_9_9; + A[28] = -A[27] + 0.00949066558441591*G0_1_0_0_0 + 0.000118709415584416*G0_1_0_0_2 - 0.000438311688311704*G0_1_0_0_3 + 0.000575284090909111*G0_1_0_0_4 + 0.00373478084415597*G0_1_0_0_5 - 0.00305905032467544*G0_1_0_0_6 + 0.00820921266233795*G0_1_0_0_7 - 0.00461140422077938*G0_1_0_0_8 + 0.000712256493506521*G0_1_0_0_9 - 0.0094906655844159*G0_1_0_1_1 - 0.000118709415584421*G0_1_0_1_2 - 0.00373478084415596*G0_1_0_1_3 + 0.00305905032467542*G0_1_0_1_4 + 0.000438311688311705*G0_1_0_1_5 - 0.000575284090909117*G0_1_0_1_6 + 0.00461140422077938*G0_1_0_1_7 - 0.00820921266233796*G0_1_0_1_8 - 0.000712256493506521*G0_1_0_1_9 + 0.000118709415584416*G0_1_0_2_0 - 0.000118709415584422*G0_1_0_2_1 - 0.00155235389610394*G0_1_0_2_3 + 0.00447443181818195*G0_1_0_2_4 + 0.00155235389610396*G0_1_0_2_5 - 0.004474431818182*G0_1_0_2_6 + 0.00101359577922081*G0_1_0_2_7 - 0.00101359577922081*G0_1_0_2_8 - 0.000438311688311704*G0_1_0_3_0 - 0.00373478084415596*G0_1_0_3_1 - 0.00155235389610394*G0_1_0_3_2 + 0.00131493506493512*G0_1_0_3_3 - 0.00583502435064954*G0_1_0_3_4 + 0.00172585227272734*G0_1_0_3_6 + 0.0013149350649351*G0_1_0_3_7 - 0.00435572240259754*G0_1_0_3_8 - 0.000493100649350652*G0_1_0_3_9 + 0.000575284090909111*G0_1_0_4_0 + 0.00305905032467542*G0_1_0_4_1 + 0.00447443181818195*G0_1_0_4_2 - 0.00583502435064954*G0_1_0_4_3 + 0.0254768668831177*G0_1_0_4_4 - 0.00172585227272732*G0_1_0_4_5 - 0.00238331980519489*G0_1_0_4_7 + 0.00304078733766244*G0_1_0_4_8 + 0.00345170454545465*G0_1_0_4_9 + 0.00373478084415597*G0_1_0_5_0 + 0.000438311688311704*G0_1_0_5_1 + 0.00155235389610396*G0_1_0_5_2 - 0.00172585227272732*G0_1_0_5_4 - 0.00131493506493513*G0_1_0_5_5 + 0.00583502435064958*G0_1_0_5_6 + 0.00435572240259754*G0_1_0_5_7 - 0.00131493506493511*G0_1_0_5_8 + 0.000493100649350667*G0_1_0_5_9 - 0.00305905032467544*G0_1_0_6_0 - 0.000575284090909117*G0_1_0_6_1 - 0.004474431818182*G0_1_0_6_2 + 0.00172585227272734*G0_1_0_6_3 + 0.00583502435064958*G0_1_0_6_5 - 0.0254768668831178*G0_1_0_6_6 - 0.00304078733766244*G0_1_0_6_7 + 0.00238331980519488*G0_1_0_6_8 - 0.00345170454545468*G0_1_0_6_9 + 0.00820921266233794*G0_1_0_7_0 + 0.00461140422077938*G0_1_0_7_1 + 0.00101359577922081*G0_1_0_7_2 + 0.0013149350649351*G0_1_0_7_3 - 0.00238331980519489*G0_1_0_7_4 + 0.00435572240259754*G0_1_0_7_5 - 0.00304078733766244*G0_1_0_7_6 + 0.0241619318181826*G0_1_0_7_7 + 0.00394480519480533*G0_1_0_7_9 - 0.00461140422077938*G0_1_0_8_0 - 0.00820921266233796*G0_1_0_8_1 - 0.00101359577922081*G0_1_0_8_2 - 0.00435572240259754*G0_1_0_8_3 + 0.00304078733766244*G0_1_0_8_4 - 0.00131493506493511*G0_1_0_8_5 + 0.00238331980519488*G0_1_0_8_6 - 0.0241619318181826*G0_1_0_8_8 - 0.00394480519480532*G0_1_0_8_9 + 0.000712256493506521*G0_1_0_9_0 - 0.000712256493506521*G0_1_0_9_1 - 0.000493100649350653*G0_1_0_9_3 + 0.00345170454545465*G0_1_0_9_4 + 0.000493100649350668*G0_1_0_9_5 - 0.00345170454545468*G0_1_0_9_6 + 0.00394480519480533*G0_1_0_9_7 - 0.00394480519480532*G0_1_0_9_8 - 0.00265422077922088*G0_1_1_0_0 - 0.00165280032467539*G0_1_1_0_1 + 0.000258725649350659*G0_1_1_0_2 - 0.000210024350649359*G0_1_1_0_3 + 0.00170758928571435*G0_1_1_0_4 - 0.00215503246753254*G0_1_1_0_5 + 0.0014884334415585*G0_1_1_0_6 - 0.00261160714285724*G0_1_1_0_7 + 0.00092228084415587*G0_1_1_0_8 + 0.00021915584415585*G0_1_1_0_9 - 0.00165280032467539*G0_1_1_1_0 - 0.0121448863636368*G0_1_1_1_1 + 0.00014001623376624*G0_1_1_1_2 - 0.00588981331168851*G0_1_1_1_3 + 0.00454748376623392*G0_1_1_1_4 + 0.000228287337662344*G0_1_1_1_5 + 0.00113230519480524*G0_1_1_1_6 + 0.00553368506493526*G0_1_1_1_7 - 0.0108208198051952*G0_1_1_1_8 - 0.000493100649350667*G0_1_1_1_9 + 0.000258725649350659*G0_1_1_2_0 + 0.00014001623376624*G0_1_1_2_1 + 0.00547889610389628*G0_1_1_2_2 - 0.00348823051948063*G0_1_1_2_3 + 0.0082640016233769*G0_1_1_2_4 - 0.00193587662337669*G0_1_1_2_5 + 0.00378956980519493*G0_1_1_2_6 - 0.00157974837662343*G0_1_1_2_7 - 0.00259334415584424*G0_1_1_2_8 + 0.0010409902597403*G0_1_1_2_9 - 0.000210024350649359*G0_1_1_3_0 - 0.00588981331168851*G0_1_1_3_1 - 0.00348823051948063*G0_1_1_3_2 + 0.00788961038961068*G0_1_1_3_3 - 0.00936891233766267*G0_1_1_3_4 + 0.000164366883116892*G0_1_1_3_5 - 0.00378043831168845*G0_1_1_3_6 + 0.000246550324675344*G0_1_1_3_7 - 0.0076430600649353*G0_1_1_3_8 + 0.00098620129870135*G0_1_1_3_9 + 0.00170758928571435*G0_1_1_4_0 + 0.00454748376623392*G0_1_1_4_1 + 0.0082640016233769*G0_1_1_4_2 - 0.00936891233766267*G0_1_1_4_3 + 0.0330377435064947*G0_1_1_4_4 - 0.00550629058441578*G0_1_1_4_5 + 0.00928672889610422*G0_1_1_4_6 + 0.00739650974025997*G0_1_1_4_8 + 0.00788961038961065*G0_1_1_4_9 - 0.00215503246753254*G0_1_1_5_0 + 0.000228287337662344*G0_1_1_5_1 - 0.00193587662337669*G0_1_1_5_2 + 0.000164366883116892*G0_1_1_5_3 - 0.00550629058441578*G0_1_1_5_4 + 0.00657467532467554*G0_1_1_5_5 - 0.00353388798701311*G0_1_1_5_6 - 0.00328733766233777*G0_1_1_5_7 - 0.00106838474025977*G0_1_1_5_8 + 0.001479301948052*G0_1_1_5_9 + 0.0014884334415585*G0_1_1_6_0 + 0.00113230519480524*G0_1_1_6_1 + 0.00378956980519493*G0_1_1_6_2 - 0.00378043831168845*G0_1_1_6_3 + 0.00928672889610422*G0_1_1_6_4 - 0.00353388798701311*G0_1_1_6_5 + 0.00756087662337689*G0_1_1_6_6 + 0.00435572240259755*G0_1_1_6_7 + 0.00238331980519487*G0_1_1_6_8 + 0.00443790584415599*G0_1_1_6_9 - 0.00261160714285724*G0_1_1_7_0 + 0.00553368506493526*G0_1_1_7_1 - 0.00157974837662343*G0_1_1_7_2 + 0.000246550324675344*G0_1_1_7_3 - 0.00328733766233777*G0_1_1_7_5 + 0.00435572240259755*G0_1_1_7_6 - 0.0571996753246773*G0_1_1_7_7 + 0.00665685876623402*G0_1_1_7_8 - 0.00936891233766266*G0_1_1_7_9 + 0.00092228084415587*G0_1_1_8_0 - 0.0108208198051952*G0_1_1_8_1 - 0.00259334415584424*G0_1_1_8_2 - 0.0076430600649353*G0_1_1_8_3 + 0.00739650974025997*G0_1_1_8_4 - 0.00106838474025977*G0_1_1_8_5 + 0.00238331980519487*G0_1_1_8_6 + 0.00665685876623402*G0_1_1_8_7 - 0.0813616071428599*G0_1_1_8_8 - 0.013313717532468*G0_1_1_8_9 + 0.00021915584415585*G0_1_1_9_0 - 0.000493100649350667*G0_1_1_9_1 + 0.0010409902597403*G0_1_1_9_2 + 0.000986201298701352*G0_1_1_9_3 + 0.00788961038961065*G0_1_1_9_4 + 0.001479301948052*G0_1_1_9_5 + 0.00443790584415599*G0_1_1_9_6 - 0.00936891233766266*G0_1_1_9_7 - 0.013313717532468*G0_1_1_9_8 + 0.0493100649350667*G0_1_1_9_9; + A[80] = -A[30] + 0.0525974025974044*G0_0_0_0_0 + 0.00307426948051959*G0_0_0_0_1 + 0.00393567370129884*G0_0_0_0_2 - 0.000858360389610423*G0_0_0_0_3 - 0.00170758928571435*G0_0_0_0_4 + 0.0389458198051961*G0_0_0_0_5 - 0.0165827922077928*G0_0_0_0_6 + 0.0196783685064942*G0_0_0_0_7 - 0.0100994318181822*G0_0_0_0_8 + 0.0047666396103898*G0_0_0_0_9 + 0.00307426948051959*G0_0_0_1_0 + 0.0154017857142862*G0_0_0_1_1 + 0.00106534090909095*G0_0_0_1_2 + 0.00904017857142887*G0_0_0_1_3 - 0.00249289772727281*G0_0_0_1_4 + 0.00346996753246765*G0_0_0_1_5 - 0.00146103896103901*G0_0_0_1_6 - 0.00167106331168838*G0_0_0_1_7 + 0.00246550324675336*G0_0_0_1_8 - 0.000767045454545472*G0_0_0_1_9 + 0.00393567370129884*G0_0_0_2_0 + 0.00106534090909095*G0_0_0_2_1 + 0.00787134740259769*G0_0_0_2_2 + 0.00124188311688315*G0_0_0_2_3 + 0.00241984577922088*G0_0_0_2_4 + 0.00544237012987031*G0_0_0_2_5 - 0.000173498376623357*G0_0_0_2_6 + 0.000757913961038986*G0_0_0_2_7 + 0.00111404220779224*G0_0_0_2_8 + 0.00378043831168844*G0_0_0_2_9 - 0.000858360389610423*G0_0_0_3_0 + 0.00904017857142887*G0_0_0_3_1 + 0.00124188311688315*G0_0_0_3_2 - 0.00361607142857159*G0_0_0_3_3 - 0.0134780844155849*G0_0_0_3_4 - 0.00197240259740266*G0_0_0_3_5 + 0.000493100649350657*G0_0_0_3_6 - 0.00131493506493511*G0_0_0_3_7 + 0.00854707792207822*G0_0_0_3_8 + 0.00493100649350666*G0_0_0_3_9 - 0.00170758928571435*G0_0_0_4_0 - 0.00249289772727281*G0_0_0_4_1 + 0.00241984577922088*G0_0_0_4_2 - 0.0134780844155849*G0_0_0_4_3 - 0.0238331980519489*G0_0_0_4_4 + 0.00123275162337665*G0_0_0_4_5 - 0.00172585227272732*G0_0_0_4_6 + 0.00336952110389622*G0_0_0_4_7 - 0.0072321428571431*G0_0_0_4_8 - 0.0138068181818187*G0_0_0_4_9 + 0.0389458198051961*G0_0_0_5_0 + 0.00346996753246765*G0_0_0_5_1 + 0.00544237012987031*G0_0_0_5_2 - 0.00197240259740266*G0_0_0_5_3 + 0.00123275162337665*G0_0_0_5_4 + 0.105687905844159*G0_0_0_5_5 - 0.0316406250000011*G0_0_0_5_6 + 0.0204636769480526*G0_0_0_5_7 - 0.0142999188311693*G0_0_0_5_8 + 0.0142999188311694*G0_0_0_5_9 - 0.0165827922077928*G0_0_0_6_0 - 0.00146103896103901*G0_0_0_6_1 - 0.000173498376623357*G0_0_0_6_2 + 0.000493100649350658*G0_0_0_6_3 - 0.00172585227272732*G0_0_0_6_4 - 0.0316406250000011*G0_0_0_6_5 - 0.00821834415584443*G0_0_0_6_6 - 0.00616375811688332*G0_0_0_6_7 + 0.00246550324675334*G0_0_0_6_8 - 0.0123275162337667*G0_0_0_6_9 + 0.0196783685064942*G0_0_0_7_0 - 0.00167106331168838*G0_0_0_7_1 + 0.000757913961038985*G0_0_0_7_2 - 0.00131493506493511*G0_0_0_7_3 + 0.00336952110389622*G0_0_0_7_4 + 0.0204636769480526*G0_0_0_7_5 - 0.00616375811688332*G0_0_0_7_6 - 0.0134780844155849*G0_0_0_7_7 - 0.00460227272727289*G0_0_0_7_8 - 0.00197240259740267*G0_0_0_7_9 - 0.0100994318181822*G0_0_0_8_0 + 0.00246550324675336*G0_0_0_8_1 + 0.00111404220779224*G0_0_0_8_2 + 0.00854707792207822*G0_0_0_8_3 - 0.0072321428571431*G0_0_0_8_4 - 0.0142999188311693*G0_0_0_8_5 + 0.00246550324675334*G0_0_0_8_6 - 0.00460227272727289*G0_0_0_8_7 + 0.0259699675324685*G0_0_0_8_8 + 0.0167654220779226*G0_0_0_8_9 + 0.0047666396103898*G0_0_0_9_0 - 0.000767045454545472*G0_0_0_9_1 + 0.00378043831168844*G0_0_0_9_2 + 0.00493100649350666*G0_0_0_9_3 - 0.0138068181818187*G0_0_0_9_4 + 0.0142999188311694*G0_0_0_9_5 - 0.0123275162337667*G0_0_0_9_6 - 0.00197240259740267*G0_0_0_9_7 + 0.0167654220779226*G0_0_0_9_8 + 0.0867857142857172*G0_0_0_9_9 + 0.0525974025974044*G0_0_1_0_0 + 0.00307426948051959*G0_0_1_0_1 + 0.00393567370129884*G0_0_1_0_2 - 0.000858360389610424*G0_0_1_0_3 - 0.00170758928571435*G0_0_1_0_4 + 0.0389458198051961*G0_0_1_0_5 - 0.0165827922077928*G0_0_1_0_6 + 0.0196783685064942*G0_0_1_0_7 - 0.0100994318181822*G0_0_1_0_8 + 0.0047666396103898*G0_0_1_0_9 + 0.00307426948051959*G0_0_1_1_0 + 0.0154017857142862*G0_0_1_1_1 + 0.00106534090909095*G0_0_1_1_2 + 0.00904017857142886*G0_0_1_1_3 - 0.00249289772727281*G0_0_1_1_4 + 0.00346996753246765*G0_0_1_1_5 - 0.00146103896103901*G0_0_1_1_6 - 0.00167106331168838*G0_0_1_1_7 + 0.00246550324675335*G0_0_1_1_8 - 0.000767045454545471*G0_0_1_1_9 + 0.00393567370129884*G0_0_1_2_0 + 0.00106534090909095*G0_0_1_2_1 + 0.00787134740259769*G0_0_1_2_2 + 0.00124188311688315*G0_0_1_2_3 + 0.00241984577922088*G0_0_1_2_4 + 0.00544237012987031*G0_0_1_2_5 - 0.000173498376623356*G0_0_1_2_6 + 0.000757913961038984*G0_0_1_2_7 + 0.00111404220779224*G0_0_1_2_8 + 0.00378043831168844*G0_0_1_2_9 - 0.000858360389610424*G0_0_1_3_0 + 0.00904017857142886*G0_0_1_3_1 + 0.00124188311688315*G0_0_1_3_2 - 0.00361607142857159*G0_0_1_3_3 - 0.0134780844155849*G0_0_1_3_4 - 0.00197240259740266*G0_0_1_3_5 + 0.00049310064935066*G0_0_1_3_6 - 0.00131493506493511*G0_0_1_3_7 + 0.00854707792207822*G0_0_1_3_8 + 0.00493100649350665*G0_0_1_3_9 - 0.00170758928571435*G0_0_1_4_0 - 0.0024928977272728*G0_0_1_4_1 + 0.00241984577922088*G0_0_1_4_2 - 0.0134780844155849*G0_0_1_4_3 - 0.0238331980519489*G0_0_1_4_4 + 0.00123275162337665*G0_0_1_4_5 - 0.00172585227272733*G0_0_1_4_6 + 0.00336952110389622*G0_0_1_4_7 - 0.0072321428571431*G0_0_1_4_8 - 0.0138068181818187*G0_0_1_4_9 + 0.0389458198051961*G0_0_1_5_0 + 0.00346996753246765*G0_0_1_5_1 + 0.00544237012987031*G0_0_1_5_2 - 0.00197240259740265*G0_0_1_5_3 + 0.00123275162337665*G0_0_1_5_4 + 0.105687905844159*G0_0_1_5_5 - 0.0316406250000011*G0_0_1_5_6 + 0.0204636769480526*G0_0_1_5_7 - 0.0142999188311693*G0_0_1_5_8 + 0.0142999188311694*G0_0_1_5_9 - 0.0165827922077928*G0_0_1_6_0 - 0.00146103896103901*G0_0_1_6_1 - 0.000173498376623356*G0_0_1_6_2 + 0.00049310064935066*G0_0_1_6_3 - 0.00172585227272733*G0_0_1_6_4 - 0.0316406250000011*G0_0_1_6_5 - 0.00821834415584444*G0_0_1_6_6 - 0.00616375811688332*G0_0_1_6_7 + 0.00246550324675334*G0_0_1_6_8 - 0.0123275162337667*G0_0_1_6_9 + 0.0196783685064942*G0_0_1_7_0 - 0.00167106331168838*G0_0_1_7_1 + 0.000757913961038983*G0_0_1_7_2 - 0.00131493506493511*G0_0_1_7_3 + 0.00336952110389622*G0_0_1_7_4 + 0.0204636769480526*G0_0_1_7_5 - 0.00616375811688332*G0_0_1_7_6 - 0.013478084415585*G0_0_1_7_7 - 0.00460227272727289*G0_0_1_7_8 - 0.00197240259740268*G0_0_1_7_9 - 0.0100994318181822*G0_0_1_8_0 + 0.00246550324675335*G0_0_1_8_1 + 0.00111404220779224*G0_0_1_8_2 + 0.00854707792207822*G0_0_1_8_3 - 0.0072321428571431*G0_0_1_8_4 - 0.0142999188311693*G0_0_1_8_5 + 0.00246550324675334*G0_0_1_8_6 - 0.00460227272727289*G0_0_1_8_7 + 0.0259699675324684*G0_0_1_8_8 + 0.0167654220779226*G0_0_1_8_9 + 0.0047666396103898*G0_0_1_9_0 - 0.000767045454545471*G0_0_1_9_1 + 0.00378043831168844*G0_0_1_9_2 + 0.00493100649350666*G0_0_1_9_3 - 0.0138068181818187*G0_0_1_9_4 + 0.0142999188311694*G0_0_1_9_5 - 0.0123275162337667*G0_0_1_9_6 - 0.00197240259740268*G0_0_1_9_7 + 0.0167654220779226*G0_0_1_9_8 + 0.0867857142857172*G0_0_1_9_9; + A[14] = -A[16] - 0.00787134740259768*G0_0_1_0_0 - 0.00393567370129885*G0_0_1_0_1 - 0.00106534090909095*G0_0_1_0_2 - 0.000757913961038983*G0_0_1_0_3 - 0.00111404220779225*G0_0_1_0_4 - 0.00241984577922085*G0_0_1_0_5 - 0.00124188311688316*G0_0_1_0_6 + 0.000173498376623392*G0_0_1_0_7 - 0.00544237012987034*G0_0_1_0_8 - 0.00378043831168844*G0_0_1_0_9 - 0.00393567370129885*G0_0_1_1_0 - 0.0525974025974044*G0_0_1_1_1 - 0.00307426948051959*G0_0_1_1_2 - 0.0196783685064942*G0_0_1_1_3 + 0.0100994318181821*G0_0_1_1_4 + 0.00170758928571434*G0_0_1_1_5 + 0.000858360389610411*G0_0_1_1_6 + 0.0165827922077928*G0_0_1_1_7 - 0.0389458198051962*G0_0_1_1_8 - 0.0047666396103898*G0_0_1_1_9 - 0.00106534090909095*G0_0_1_2_0 - 0.00307426948051959*G0_0_1_2_1 - 0.0154017857142863*G0_0_1_2_2 + 0.00167106331168838*G0_0_1_2_3 - 0.00246550324675336*G0_0_1_2_4 + 0.00249289772727284*G0_0_1_2_5 - 0.00904017857142893*G0_0_1_2_6 + 0.00146103896103901*G0_0_1_2_7 - 0.00346996753246765*G0_0_1_2_8 + 0.000767045454545479*G0_0_1_2_9 - 0.000757913961038983*G0_0_1_3_0 - 0.0196783685064942*G0_0_1_3_1 + 0.00167106331168838*G0_0_1_3_2 + 0.013478084415585*G0_0_1_3_3 + 0.00460227272727286*G0_0_1_3_4 - 0.00336952110389622*G0_0_1_3_5 + 0.00131493506493512*G0_0_1_3_6 + 0.00616375811688331*G0_0_1_3_7 - 0.0204636769480526*G0_0_1_3_8 + 0.00197240259740272*G0_0_1_3_9 - 0.00111404220779225*G0_0_1_4_0 + 0.0100994318181821*G0_0_1_4_1 - 0.00246550324675336*G0_0_1_4_2 + 0.00460227272727286*G0_0_1_4_3 - 0.0259699675324685*G0_0_1_4_4 + 0.00723214285714311*G0_0_1_4_5 - 0.00854707792207824*G0_0_1_4_6 - 0.00246550324675333*G0_0_1_4_7 + 0.0142999188311693*G0_0_1_4_8 - 0.0167654220779226*G0_0_1_4_9 - 0.00241984577922085*G0_0_1_5_0 + 0.00170758928571434*G0_0_1_5_1 + 0.00249289772727284*G0_0_1_5_2 - 0.00336952110389622*G0_0_1_5_3 + 0.00723214285714311*G0_0_1_5_4 + 0.0238331980519488*G0_0_1_5_5 + 0.0134780844155849*G0_0_1_5_6 + 0.00172585227272733*G0_0_1_5_7 - 0.00123275162337666*G0_0_1_5_8 + 0.0138068181818186*G0_0_1_5_9 - 0.00124188311688316*G0_0_1_6_0 + 0.000858360389610412*G0_0_1_6_1 - 0.00904017857142893*G0_0_1_6_2 + 0.00131493506493512*G0_0_1_6_3 - 0.00854707792207824*G0_0_1_6_4 + 0.0134780844155849*G0_0_1_6_5 + 0.00361607142857147*G0_0_1_6_6 - 0.000493100649350666*G0_0_1_6_7 + 0.00197240259740266*G0_0_1_6_8 - 0.00493100649350668*G0_0_1_6_9 + 0.000173498376623393*G0_0_1_7_0 + 0.0165827922077928*G0_0_1_7_1 + 0.00146103896103901*G0_0_1_7_2 + 0.00616375811688331*G0_0_1_7_3 - 0.00246550324675333*G0_0_1_7_4 + 0.00172585227272734*G0_0_1_7_5 - 0.000493100649350666*G0_0_1_7_6 + 0.00821834415584448*G0_0_1_7_7 + 0.0316406250000011*G0_0_1_7_8 + 0.0123275162337667*G0_0_1_7_9 - 0.00544237012987034*G0_0_1_8_0 - 0.0389458198051962*G0_0_1_8_1 - 0.00346996753246765*G0_0_1_8_2 - 0.0204636769480526*G0_0_1_8_3 + 0.0142999188311693*G0_0_1_8_4 - 0.00123275162337666*G0_0_1_8_5 + 0.00197240259740266*G0_0_1_8_6 + 0.0316406250000011*G0_0_1_8_7 - 0.10568790584416*G0_0_1_8_8 - 0.0142999188311693*G0_0_1_8_9 - 0.00378043831168844*G0_0_1_9_0 - 0.0047666396103898*G0_0_1_9_1 + 0.000767045454545479*G0_0_1_9_2 + 0.00197240259740272*G0_0_1_9_3 - 0.0167654220779226*G0_0_1_9_4 + 0.0138068181818186*G0_0_1_9_5 - 0.00493100649350668*G0_0_1_9_6 + 0.0123275162337667*G0_0_1_9_7 - 0.0142999188311693*G0_0_1_9_8 - 0.0867857142857171*G0_0_1_9_9; + A[23] = -A[28] - 0.00787134740259767*G0_1_0_0_0 - 0.00106534090909095*G0_1_0_0_1 - 0.00393567370129886*G0_1_0_0_2 - 0.00111404220779224*G0_1_0_0_3 - 0.000757913961038997*G0_1_0_0_4 + 0.000173498376623402*G0_1_0_0_5 - 0.00544237012987035*G0_1_0_0_6 - 0.00241984577922085*G0_1_0_0_7 - 0.00124188311688316*G0_1_0_0_8 - 0.00378043831168845*G0_1_0_0_9 - 0.00106534090909095*G0_1_0_1_0 - 0.0154017857142862*G0_1_0_1_1 - 0.0030742694805196*G0_1_0_1_2 - 0.00246550324675332*G0_1_0_1_3 + 0.00167106331168835*G0_1_0_1_4 + 0.00146103896103902*G0_1_0_1_5 - 0.00346996753246767*G0_1_0_1_6 + 0.00249289772727282*G0_1_0_1_7 - 0.0090401785714289*G0_1_0_1_8 + 0.000767045454545471*G0_1_0_1_9 - 0.00393567370129886*G0_1_0_2_0 - 0.0030742694805196*G0_1_0_2_1 - 0.0525974025974044*G0_1_0_2_2 + 0.0100994318181822*G0_1_0_2_3 - 0.0196783685064942*G0_1_0_2_4 + 0.0165827922077928*G0_1_0_2_5 - 0.0389458198051962*G0_1_0_2_6 + 0.00170758928571434*G0_1_0_2_7 + 0.000858360389610416*G0_1_0_2_8 - 0.00476663961038978*G0_1_0_2_9 - 0.00111404220779224*G0_1_0_3_0 - 0.00246550324675332*G0_1_0_3_1 + 0.0100994318181822*G0_1_0_3_2 - 0.0259699675324684*G0_1_0_3_3 + 0.00460227272727291*G0_1_0_3_4 - 0.00246550324675334*G0_1_0_3_5 + 0.0142999188311693*G0_1_0_3_6 + 0.00723214285714309*G0_1_0_3_7 - 0.00854707792207822*G0_1_0_3_8 - 0.0167654220779226*G0_1_0_3_9 - 0.000757913961038997*G0_1_0_4_0 + 0.00167106331168835*G0_1_0_4_1 - 0.0196783685064942*G0_1_0_4_2 + 0.00460227272727291*G0_1_0_4_3 + 0.0134780844155848*G0_1_0_4_4 + 0.00616375811688336*G0_1_0_4_5 - 0.0204636769480527*G0_1_0_4_6 - 0.00336952110389622*G0_1_0_4_7 + 0.00131493506493511*G0_1_0_4_8 + 0.00197240259740265*G0_1_0_4_9 + 0.000173498376623402*G0_1_0_5_0 + 0.00146103896103902*G0_1_0_5_1 + 0.0165827922077928*G0_1_0_5_2 - 0.00246550324675334*G0_1_0_5_3 + 0.00616375811688336*G0_1_0_5_4 + 0.0082183441558444*G0_1_0_5_5 + 0.0316406250000012*G0_1_0_5_6 + 0.00172585227272733*G0_1_0_5_7 - 0.000493100649350669*G0_1_0_5_8 + 0.0123275162337667*G0_1_0_5_9 - 0.00544237012987035*G0_1_0_6_0 - 0.00346996753246767*G0_1_0_6_1 - 0.0389458198051962*G0_1_0_6_2 + 0.0142999188311693*G0_1_0_6_3 - 0.0204636769480527*G0_1_0_6_4 + 0.0316406250000012*G0_1_0_6_5 - 0.10568790584416*G0_1_0_6_6 - 0.00123275162337667*G0_1_0_6_7 + 0.00197240259740267*G0_1_0_6_8 - 0.0142999188311693*G0_1_0_6_9 - 0.00241984577922085*G0_1_0_7_0 + 0.00249289772727282*G0_1_0_7_1 + 0.00170758928571434*G0_1_0_7_2 + 0.00723214285714309*G0_1_0_7_3 - 0.00336952110389622*G0_1_0_7_4 + 0.00172585227272733*G0_1_0_7_5 - 0.00123275162337667*G0_1_0_7_6 + 0.0238331980519489*G0_1_0_7_7 + 0.0134780844155849*G0_1_0_7_8 + 0.0138068181818186*G0_1_0_7_9 - 0.00124188311688316*G0_1_0_8_0 - 0.0090401785714289*G0_1_0_8_1 + 0.000858360389610416*G0_1_0_8_2 - 0.00854707792207822*G0_1_0_8_3 + 0.00131493506493511*G0_1_0_8_4 - 0.00049310064935067*G0_1_0_8_5 + 0.00197240259740267*G0_1_0_8_6 + 0.0134780844155849*G0_1_0_8_7 + 0.00361607142857154*G0_1_0_8_8 - 0.00493100649350667*G0_1_0_8_9 - 0.00378043831168845*G0_1_0_9_0 + 0.000767045454545471*G0_1_0_9_1 - 0.00476663961038978*G0_1_0_9_2 - 0.0167654220779226*G0_1_0_9_3 + 0.00197240259740266*G0_1_0_9_4 + 0.0123275162337667*G0_1_0_9_5 - 0.0142999188311693*G0_1_0_9_6 + 0.0138068181818186*G0_1_0_9_7 - 0.00493100649350667*G0_1_0_9_8 - 0.0867857142857172*G0_1_0_9_9; + A[25] = -A[23] - 0.00196022727272735*G0_1_0_0_0 - 0.000980113636363669*G0_1_0_0_2 - 0.00213676948051956*G0_1_0_0_3 + 0.00213676948051957*G0_1_0_0_4 - 0.00109577922077925*G0_1_0_0_5 - 0.00405438311688327*G0_1_0_0_6 - 0.00158887987012993*G0_1_0_0_7 + 0.000876623376623407*G0_1_0_0_8 - 0.00525974025974045*G0_1_0_0_9 + 0.00196022727272733*G0_1_0_1_1 + 0.00098011363636367*G0_1_0_1_2 + 0.00109577922077924*G0_1_0_1_3 + 0.00405438311688327*G0_1_0_1_4 + 0.00213676948051955*G0_1_0_1_5 - 0.00213676948051956*G0_1_0_1_6 - 0.000876623376623403*G0_1_0_1_7 + 0.00158887987012992*G0_1_0_1_8 + 0.00525974025974044*G0_1_0_1_9 - 0.000980113636363669*G0_1_0_2_0 + 0.000980113636363669*G0_1_0_2_1 - 0.00493100649350667*G0_1_0_2_3 + 0.01479301948052*G0_1_0_2_4 + 0.00493100649350665*G0_1_0_2_5 - 0.01479301948052*G0_1_0_2_6 - 0.00016436688311689*G0_1_0_2_7 + 0.000164366883116885*G0_1_0_2_8 - 0.00213676948051956*G0_1_0_3_0 + 0.00109577922077924*G0_1_0_3_1 - 0.00493100649350667*G0_1_0_3_2 - 0.035503246753248*G0_1_0_3_3 - 0.0212033279220786*G0_1_0_3_4 + 0.00641030844155864*G0_1_0_3_6 + 0.00641030844155866*G0_1_0_3_7 - 0.005917207792208*G0_1_0_3_8 - 0.0285998376623386*G0_1_0_3_9 + 0.00213676948051957*G0_1_0_4_0 + 0.00405438311688327*G0_1_0_4_1 + 0.01479301948052*G0_1_0_4_2 - 0.0212033279220786*G0_1_0_4_3 + 0.0936891233766266*G0_1_0_4_4 - 0.00641030844155867*G0_1_0_4_5 - 0.002958603896104*G0_1_0_4_7 - 0.00049310064935066*G0_1_0_4_8 + 0.0128206168831173*G0_1_0_4_9 - 0.00109577922077925*G0_1_0_5_0 + 0.00213676948051955*G0_1_0_5_1 + 0.00493100649350665*G0_1_0_5_2 - 0.00641030844155867*G0_1_0_5_4 + 0.0355032467532479*G0_1_0_5_5 + 0.0212033279220786*G0_1_0_5_6 + 0.005917207792208*G0_1_0_5_7 - 0.00641030844155866*G0_1_0_5_8 + 0.0285998376623386*G0_1_0_5_9 - 0.00405438311688327*G0_1_0_6_0 - 0.00213676948051956*G0_1_0_6_1 - 0.01479301948052*G0_1_0_6_2 + 0.00641030844155864*G0_1_0_6_3 + 0.0212033279220786*G0_1_0_6_5 - 0.0936891233766265*G0_1_0_6_6 + 0.000493100649350656*G0_1_0_6_7 + 0.00295860389610399*G0_1_0_6_8 - 0.0128206168831173*G0_1_0_6_9 - 0.00158887987012993*G0_1_0_7_0 - 0.000876623376623403*G0_1_0_7_1 - 0.00016436688311689*G0_1_0_7_2 + 0.00641030844155866*G0_1_0_7_3 - 0.002958603896104*G0_1_0_7_4 + 0.005917207792208*G0_1_0_7_5 + 0.000493100649350656*G0_1_0_7_6 - 0.00394480519480534*G0_1_0_7_7 + 0.01479301948052*G0_1_0_7_9 + 0.000876623376623408*G0_1_0_8_0 + 0.00158887987012992*G0_1_0_8_1 + 0.000164366883116885*G0_1_0_8_2 - 0.005917207792208*G0_1_0_8_3 - 0.00049310064935066*G0_1_0_8_4 - 0.00641030844155866*G0_1_0_8_5 + 0.00295860389610399*G0_1_0_8_6 + 0.0039448051948053*G0_1_0_8_8 - 0.01479301948052*G0_1_0_8_9 - 0.00525974025974045*G0_1_0_9_0 + 0.00525974025974044*G0_1_0_9_1 - 0.0285998376623386*G0_1_0_9_3 + 0.0128206168831173*G0_1_0_9_4 + 0.0285998376623386*G0_1_0_9_5 - 0.0128206168831173*G0_1_0_9_6 + 0.01479301948052*G0_1_0_9_7 - 0.01479301948052*G0_1_0_9_8 + 0.0180560064935071*G0_1_1_0_0 + 0.00271814123376633*G0_1_1_0_1 + 0.00281554383116895*G0_1_1_0_2 - 0.00125101461038967*G0_1_1_0_3 + 0.00176237824675333*G0_1_1_0_4 + 0.00462053571428586*G0_1_1_0_5 - 0.00315949675324684*G0_1_1_0_6 + 0.0116517857142861*G0_1_1_0_7 - 0.00341517857142868*G0_1_1_0_8 - 0.000986201298701323*G0_1_1_0_9 + 0.00271814123376633*G0_1_1_1_0 + 0.0200162337662344*G0_1_1_1_1 + 0.00379565746753261*G0_1_1_1_2 + 0.00571631493506511*G0_1_1_1_3 + 0.000894886363636417*G0_1_1_1_4 + 0.000885754870129895*G0_1_1_1_5 - 0.000374391233766236*G0_1_1_1_6 - 0.00429180194805211*G0_1_1_1_7 + 0.0132406655844161*G0_1_1_1_8 + 0.00427353896103911*G0_1_1_1_9 + 0.00281554383116895*G0_1_1_2_0 + 0.00379565746753261*G0_1_1_2_1 + 0.0471185064935082*G0_1_1_2_2 - 0.0130945616883122*G0_1_1_2_3 + 0.0306818181818193*G0_1_1_2_4 - 0.00816355519480551*G0_1_1_2_5 + 0.0158887987012993*G0_1_1_2_6 + 0.000721387987013008*G0_1_1_2_7 + 0.000885754870129896*G0_1_1_2_8 + 0.00372564935064949*G0_1_1_2_9 - 0.00125101461038967*G0_1_1_3_0 + 0.00571631493506511*G0_1_1_3_1 - 0.0130945616883122*G0_1_1_3_2 - 0.0161079545454551*G0_1_1_3_3 - 0.0222717126623384*G0_1_1_3_4 + 0.00230113636363646*G0_1_1_3_5 - 0.00238331980519492*G0_1_1_3_6 + 0.000246550324675333*G0_1_1_3_7 + 0.00591720779220798*G0_1_1_3_8 - 0.013313717532468*G0_1_1_3_9 + 0.00176237824675332*G0_1_1_4_0 + 0.000894886363636417*G0_1_1_4_1 + 0.0306818181818193*G0_1_1_4_2 - 0.0222717126623384*G0_1_1_4_3 + 0.0726501623376649*G0_1_1_4_4 - 0.00879362824675359*G0_1_1_4_5 + 0.0111769480519485*G0_1_1_4_6 - 0.00197240259740267*G0_1_1_4_7 - 0.00616375811688331*G0_1_1_4_8 + 0.00641030844155868*G0_1_1_4_9 + 0.00462053571428586*G0_1_1_5_0 + 0.000885754870129895*G0_1_1_5_1 - 0.00816355519480551*G0_1_1_5_2 + 0.00230113636363646*G0_1_1_5_3 - 0.00879362824675359*G0_1_1_5_4 + 0.0193952922077929*G0_1_1_5_5 - 0.00106838474025984*G0_1_1_5_6 + 0.011834415584416*G0_1_1_5_7 - 0.00616375811688332*G0_1_1_5_8 + 0.0152861201298706*G0_1_1_5_9 - 0.00315949675324684*G0_1_1_6_0 - 0.000374391233766236*G0_1_1_6_1 + 0.0158887987012993*G0_1_1_6_2 - 0.00238331980519493*G0_1_1_6_3 + 0.0111769480519485*G0_1_1_6_4 - 0.00106838474025984*G0_1_1_6_5 - 0.0210389610389616*G0_1_1_6_6 - 0.00567065746753266*G0_1_1_6_7 + 0.000986201298701332*G0_1_1_6_8 - 0.00641030844155862*G0_1_1_6_9 + 0.0116517857142861*G0_1_1_7_0 - 0.00429180194805211*G0_1_1_7_1 + 0.000721387987013008*G0_1_1_7_2 + 0.000246550324675332*G0_1_1_7_3 - 0.00197240259740267*G0_1_1_7_4 + 0.011834415584416*G0_1_1_7_5 - 0.00567065746753266*G0_1_1_7_6 + 0.0535836038961057*G0_1_1_7_7 - 0.0201349431818189*G0_1_1_7_8 + 0.0142999188311693*G0_1_1_7_9 - 0.00341517857142869*G0_1_1_8_0 + 0.0132406655844161*G0_1_1_8_1 + 0.000885754870129896*G0_1_1_8_2 + 0.00591720779220798*G0_1_1_8_3 - 0.00616375811688331*G0_1_1_8_4 - 0.00616375811688332*G0_1_1_8_5 + 0.000986201298701332*G0_1_1_8_6 - 0.0201349431818189*G0_1_1_8_7 + 0.057528409090911*G0_1_1_8_8 - 0.000493100649350695*G0_1_1_8_9 - 0.000986201298701323*G0_1_1_9_0 + 0.00427353896103911*G0_1_1_9_1 + 0.00372564935064949*G0_1_1_9_2 - 0.013313717532468*G0_1_1_9_3 + 0.00641030844155868*G0_1_1_9_4 + 0.0152861201298706*G0_1_1_9_5 - 0.00641030844155862*G0_1_1_9_6 + 0.0142999188311693*G0_1_1_9_7 - 0.000493100649350693*G0_1_1_9_8 + 0.0374756493506506*G0_1_1_9_9; + A[19] = 0.00360389610389623*G0_0_0_0_0 - 0.00136972402597408*G0_0_0_0_1 + 0.000487012987013002*G0_0_0_0_2 - 0.0062459415584418*G0_0_0_0_3 + 0.00427353896103912*G0_0_0_0_4 + 0.00405438311688326*G0_0_0_0_5 - 0.00186282467532472*G0_0_0_0_6 + 0.0035612824675326*G0_0_0_0_7 - 0.00482142857142875*G0_0_0_0_8 + 0.000328733766233773*G0_0_0_0_9 - 0.00136972402597408*G0_0_0_1_0 - 0.0185064935064941*G0_0_0_1_1 - 0.00234983766233774*G0_0_0_1_2 - 0.0282163149350659*G0_0_0_1_3 + 0.011724837662338*G0_0_0_1_4 + 0.0027942370129871*G0_0_0_1_5 + 0.00262987012987023*G0_0_0_1_6 + 0.00679383116883141*G0_0_0_1_7 - 0.0134232954545459*G0_0_0_1_8 - 0.00427353896103912*G0_0_0_1_9 + 0.000487012987013002*G0_0_0_2_0 - 0.00234983766233774*G0_0_0_2_1 + 0.00164366883116889*G0_0_0_2_2 - 0.00887581168831199*G0_0_0_2_3 + 0.00246550324675333*G0_0_0_2_4 - 0.000986201298701328*G0_0_0_2_5 + 0.00246550324675334*G0_0_0_2_6 + 0.00213676948051956*G0_0_0_2_7 - 0.00410917207792222*G0_0_0_2_8 - 0.00493100649350666*G0_0_0_2_9 - 0.0062459415584418*G0_0_0_3_0 - 0.0282163149350659*G0_0_0_3_1 - 0.00887581168831199*G0_0_0_3_2 - 0.130178571428576*G0_0_0_3_3 + 0.0374756493506506*G0_0_0_3_4 + 0.00295860389610402*G0_0_0_3_5 - 0.00345170454545463*G0_0_0_3_6 + 0.0231757305194814*G0_0_0_3_7 - 0.0399411525974041*G0_0_0_3_8 - 0.0335308441558454*G0_0_0_3_9 + 0.00427353896103912*G0_0_0_4_0 + 0.011724837662338*G0_0_0_4_1 + 0.00246550324675333*G0_0_0_4_2 + 0.0374756493506506*G0_0_0_4_3 + 0.0246550324675333*G0_0_0_4_4 - 0.00838271103896133*G0_0_0_4_5 + 0.011834415584416*G0_0_0_4_6 - 0.011834415584416*G0_0_0_4_7 + 0.0167654220779227*G0_0_0_4_8 + 0.0315584415584426*G0_0_0_4_9 + 0.00405438311688326*G0_0_0_5_0 + 0.0027942370129871*G0_0_0_5_1 - 0.000986201298701328*G0_0_0_5_2 + 0.00295860389610402*G0_0_0_5_3 - 0.00838271103896133*G0_0_0_5_4 + 0.0739650974025998*G0_0_0_5_5 - 0.00493100649350668*G0_0_0_5_6 + 0.00591720779220799*G0_0_0_5_7 - 0.00394480519480532*G0_0_0_5_8 + 0.00690340909090933*G0_0_0_5_9 - 0.00186282467532472*G0_0_0_6_0 + 0.00262987012987023*G0_0_0_6_1 + 0.00246550324675334*G0_0_0_6_2 - 0.00345170454545463*G0_0_0_6_3 + 0.011834415584416*G0_0_0_6_4 - 0.00493100649350667*G0_0_0_6_5 + 0.0700202922077946*G0_0_0_6_6 - 0.00197240259740266*G0_0_0_6_7 + 0.0216964285714293*G0_0_0_6_9 + 0.0035612824675326*G0_0_0_7_0 + 0.00679383116883141*G0_0_0_7_1 + 0.00213676948051956*G0_0_0_7_2 + 0.0231757305194814*G0_0_0_7_3 - 0.011834415584416*G0_0_0_7_4 + 0.00591720779220799*G0_0_0_7_5 - 0.00197240259740266*G0_0_0_7_6 - 0.0108482142857147*G0_0_0_7_7 + 0.016272321428572*G0_0_0_7_8 + 0.00295860389610404*G0_0_0_7_9 - 0.00482142857142875*G0_0_0_8_0 - 0.0134232954545459*G0_0_0_8_1 - 0.00410917207792222*G0_0_0_8_2 - 0.0399411525974041*G0_0_0_8_3 + 0.0167654220779227*G0_0_0_8_4 - 0.00394480519480532*G0_0_0_8_5 + 0.016272321428572*G0_0_0_8_7 - 0.0364894480519493*G0_0_0_8_8 - 0.020710227272728*G0_0_0_8_9 + 0.000328733766233773*G0_0_0_9_0 - 0.00427353896103912*G0_0_0_9_1 - 0.00493100649350666*G0_0_0_9_2 - 0.0335308441558454*G0_0_0_9_3 + 0.0315584415584426*G0_0_0_9_4 + 0.00690340909090934*G0_0_0_9_5 + 0.0216964285714293*G0_0_0_9_6 + 0.00295860389610404*G0_0_0_9_7 - 0.020710227272728*G0_0_0_9_8 + 0.00196022727272736*G0_0_1_0_0 + 0.00098011363636368*G0_0_1_0_1 - 0.00213676948051957*G0_0_1_0_3 + 0.00213676948051956*G0_0_1_0_4 + 0.00158887987012993*G0_0_1_0_5 - 0.000876623376623411*G0_0_1_0_6 + 0.00109577922077926*G0_0_1_0_7 + 0.00405438311688327*G0_0_1_0_8 + 0.00525974025974044*G0_0_1_0_9 + 0.00098011363636368*G0_0_1_1_0 - 0.000980113636363665*G0_0_1_1_2 - 0.0147930194805199*G0_0_1_1_3 + 0.00493100649350663*G0_0_1_1_4 + 0.000164366883116887*G0_0_1_1_5 - 0.000164366883116887*G0_0_1_1_6 - 0.0049310064935067*G0_0_1_1_7 + 0.0147930194805201*G0_0_1_1_8 - 0.000980113636363665*G0_0_1_2_1 - 0.00196022727272736*G0_0_1_2_2 - 0.00405438311688325*G0_0_1_2_3 - 0.00109577922077927*G0_0_1_2_4 + 0.000876623376623414*G0_0_1_2_5 - 0.00158887987012994*G0_0_1_2_6 - 0.00213676948051955*G0_0_1_2_7 + 0.00213676948051955*G0_0_1_2_8 - 0.00525974025974044*G0_0_1_2_9 - 0.00213676948051957*G0_0_1_3_0 - 0.0147930194805199*G0_0_1_3_1 - 0.00405438311688325*G0_0_1_3_2 - 0.0936891233766267*G0_0_1_3_3 + 0.0212033279220786*G0_0_1_3_4 + 0.002958603896104*G0_0_1_3_5 + 0.000493100649350682*G0_0_1_3_6 + 0.0064103084415587*G0_0_1_3_7 - 0.0128206168831174*G0_0_1_3_9 + 0.00213676948051956*G0_0_1_4_0 + 0.00493100649350664*G0_0_1_4_1 - 0.00109577922077927*G0_0_1_4_2 + 0.0212033279220786*G0_0_1_4_3 + 0.035503246753248*G0_0_1_4_4 - 0.00641030844155866*G0_0_1_4_5 + 0.00591720779220798*G0_0_1_4_6 - 0.00641030844155865*G0_0_1_4_8 + 0.0285998376623386*G0_0_1_4_9 + 0.00158887987012993*G0_0_1_5_0 + 0.000164366883116887*G0_0_1_5_1 + 0.000876623376623415*G0_0_1_5_2 + 0.002958603896104*G0_0_1_5_3 - 0.00641030844155866*G0_0_1_5_4 + 0.00394480519480533*G0_0_1_5_5 - 0.005917207792208*G0_0_1_5_7 - 0.000493100649350664*G0_0_1_5_8 - 0.01479301948052*G0_0_1_5_9 - 0.000876623376623411*G0_0_1_6_0 - 0.000164366883116887*G0_0_1_6_1 - 0.00158887987012994*G0_0_1_6_2 + 0.000493100649350682*G0_0_1_6_3 + 0.00591720779220798*G0_0_1_6_4 - 0.00394480519480537*G0_0_1_6_6 + 0.00641030844155866*G0_0_1_6_7 - 0.00295860389610399*G0_0_1_6_8 + 0.01479301948052*G0_0_1_6_9 + 0.00109577922077926*G0_0_1_7_0 - 0.0049310064935067*G0_0_1_7_1 - 0.00213676948051955*G0_0_1_7_2 + 0.0064103084415587*G0_0_1_7_3 - 0.005917207792208*G0_0_1_7_5 + 0.00641030844155866*G0_0_1_7_6 - 0.0355032467532481*G0_0_1_7_7 - 0.0212033279220787*G0_0_1_7_8 - 0.0285998376623386*G0_0_1_7_9 + 0.00405438311688327*G0_0_1_8_0 + 0.0147930194805201*G0_0_1_8_1 + 0.00213676948051955*G0_0_1_8_2 - 0.00641030844155865*G0_0_1_8_4 - 0.000493100649350664*G0_0_1_8_5 - 0.00295860389610399*G0_0_1_8_6 - 0.0212033279220787*G0_0_1_8_7 + 0.0936891233766267*G0_0_1_8_8 + 0.0128206168831173*G0_0_1_8_9 + 0.00525974025974044*G0_0_1_9_0 - 0.00525974025974044*G0_0_1_9_2 - 0.0128206168831174*G0_0_1_9_3 + 0.0285998376623386*G0_0_1_9_4 - 0.01479301948052*G0_0_1_9_5 + 0.01479301948052*G0_0_1_9_6 - 0.0285998376623386*G0_0_1_9_7 + 0.0128206168831173*G0_0_1_9_8; + A[90] = A[19] - 0.0221103896103904*G0_0_0_0_0 - 0.00283685064935075*G0_0_0_0_2 + 0.00904017857142892*G0_0_0_0_3 - 0.00164366883116889*G0_0_0_0_4 - 0.0322706980519492*G0_0_0_0_5 + 0.0135876623376628*G0_0_0_0_6 - 0.0169845779220785*G0_0_0_0_7 + 0.0116152597402602*G0_0_0_0_8 - 0.00460227272727289*G0_0_0_0_9 + 0.0221103896103903*G0_0_0_1_1 + 0.00283685064935074*G0_0_0_1_2 + 0.0322706980519491*G0_0_0_1_3 - 0.0135876623376628*G0_0_0_1_4 - 0.00904017857142887*G0_0_0_1_5 + 0.00164366883116888*G0_0_0_1_6 - 0.0116152597402602*G0_0_0_1_7 + 0.0169845779220785*G0_0_0_1_8 + 0.0046022727272729*G0_0_0_1_9 - 0.00283685064935075*G0_0_0_2_0 + 0.00283685064935074*G0_0_0_2_1 + 0.00788961038961065*G0_0_0_2_3 - 0.00788961038961067*G0_0_0_2_5 - 0.00624594155844178*G0_0_0_2_7 + 0.00624594155844178*G0_0_0_2_8 + 0.00904017857142892*G0_0_0_3_0 + 0.0322706980519491*G0_0_0_3_1 + 0.00788961038961065*G0_0_0_3_2 + 0.204143668831176*G0_0_0_3_3 - 0.0424066558441573*G0_0_0_3_4 - 0.00493100649350668*G0_0_0_3_6 - 0.0271205357142867*G0_0_0_3_7 + 0.0458583603896121*G0_0_0_3_8 + 0.0404342532467548*G0_0_0_3_9 - 0.00164366883116889*G0_0_0_4_0 - 0.0135876623376628*G0_0_0_4_1 - 0.0424066558441573*G0_0_0_4_3 + 0.0453652597402613*G0_0_0_4_4 + 0.00493100649350669*G0_0_0_4_5 + 0.011834415584416*G0_0_0_4_7 - 0.0187378246753253*G0_0_0_4_8 - 0.00986201298701333*G0_0_0_4_9 - 0.0322706980519492*G0_0_0_5_0 - 0.00904017857142887*G0_0_0_5_1 - 0.00788961038961067*G0_0_0_5_2 + 0.00493100649350669*G0_0_0_5_4 - 0.204143668831176*G0_0_0_5_5 + 0.0424066558441573*G0_0_0_5_6 - 0.045858360389612*G0_0_0_5_7 + 0.0271205357142866*G0_0_0_5_8 - 0.0404342532467547*G0_0_0_5_9 + 0.0135876623376628*G0_0_0_6_0 + 0.00164366883116888*G0_0_0_6_1 - 0.00493100649350669*G0_0_0_6_3 + 0.0424066558441573*G0_0_0_6_5 - 0.0453652597402613*G0_0_0_6_6 + 0.0187378246753253*G0_0_0_6_7 - 0.011834415584416*G0_0_0_6_8 + 0.00986201298701337*G0_0_0_6_9 - 0.0169845779220785*G0_0_0_7_0 - 0.0116152597402602*G0_0_0_7_1 - 0.00624594155844178*G0_0_0_7_2 - 0.0271205357142867*G0_0_0_7_3 + 0.011834415584416*G0_0_0_7_4 - 0.045858360389612*G0_0_0_7_5 + 0.0187378246753253*G0_0_0_7_6 - 0.0256412337662347*G0_0_0_7_7 - 0.0236688311688321*G0_0_0_7_9 + 0.0116152597402602*G0_0_0_8_0 + 0.0169845779220785*G0_0_0_8_1 + 0.00624594155844178*G0_0_0_8_2 + 0.0458583603896121*G0_0_0_8_3 - 0.0187378246753253*G0_0_0_8_4 + 0.0271205357142866*G0_0_0_8_5 - 0.011834415584416*G0_0_0_8_6 + 0.0256412337662347*G0_0_0_8_8 + 0.0236688311688321*G0_0_0_8_9 - 0.00460227272727289*G0_0_0_9_0 + 0.0046022727272729*G0_0_0_9_1 + 0.0404342532467548*G0_0_0_9_3 - 0.00986201298701333*G0_0_0_9_4 - 0.0404342532467547*G0_0_0_9_5 + 0.00986201298701337*G0_0_0_9_6 - 0.0236688311688321*G0_0_0_9_7 + 0.0236688311688321*G0_0_0_9_8 - 0.0204667207792216*G0_0_1_0_0 - 0.00234983766233775*G0_0_1_0_1 - 0.00234983766233774*G0_0_1_0_2 + 0.00493100649350669*G0_0_1_0_3 + 0.000493100649350677*G0_0_1_0_4 - 0.0298051948051958*G0_0_1_0_5 + 0.0126014610389615*G0_0_1_0_6 - 0.0145190746753252*G0_0_1_0_7 + 0.00273944805194815*G0_0_1_0_8 - 0.00953327922077956*G0_0_1_0_9 - 0.00234983766233775*G0_0_1_1_0 + 0.00360389610389609*G0_0_1_1_1 + 0.00146712662337667*G0_0_1_1_2 + 0.0188474025974032*G0_0_1_1_3 - 0.00679383116883136*G0_0_1_1_4 - 0.00641030844155866*G0_0_1_1_5 + 0.004437905844156*G0_0_1_1_6 + 0.000109577922077958*G0_0_1_1_7 - 0.0112317370129875*G0_0_1_1_8 + 0.000328733766233782*G0_0_1_1_9 - 0.00234983766233774*G0_0_1_2_0 + 0.00146712662337667*G0_0_1_2_1 + 0.00360389610389624*G0_0_1_2_2 + 0.00306818181818191*G0_0_1_2_3 + 0.0035612824675326*G0_0_1_2_4 - 0.00975243506493541*G0_0_1_2_5 + 0.00405438311688327*G0_0_1_2_6 - 0.00197240259740267*G0_0_1_2_7 + 0.000328733766233774*G0_0_1_2_9 + 0.00493100649350669*G0_0_1_3_0 + 0.0188474025974032*G0_0_1_3_1 + 0.00306818181818191*G0_0_1_3_2 + 0.167654220779227*G0_0_1_3_3 - 0.0261343344155853*G0_0_1_3_4 - 0.008875811688312*G0_0_1_3_6 - 0.010355113636364*G0_0_1_3_7 + 0.00591720779220806*G0_0_1_3_8 + 0.0197240259740268*G0_0_1_3_9 + 0.000493100649350678*G0_0_1_4_0 - 0.00679383116883136*G0_0_1_4_1 + 0.0035612824675326*G0_0_1_4_2 - 0.0261343344155853*G0_0_1_4_3 + 0.0345170454545467*G0_0_1_4_4 + 0.00295860389610401*G0_0_1_4_5 + 0.00591720779220801*G0_0_1_4_6 + 0.00443790584415597*G0_0_1_4_8 - 0.00690340909090932*G0_0_1_4_9 - 0.0298051948051958*G0_0_1_5_0 - 0.00641030844155866*G0_0_1_5_1 - 0.00975243506493541*G0_0_1_5_2 + 0.002958603896104*G0_0_1_5_4 - 0.134123376623381*G0_0_1_5_5 + 0.0374756493506506*G0_0_1_5_6 - 0.034023944805196*G0_0_1_5_7 + 0.023668831168832*G0_0_1_5_8 - 0.0187378246753254*G0_0_1_5_9 + 0.0126014610389615*G0_0_1_6_0 + 0.004437905844156*G0_0_1_6_1 + 0.00405438311688327*G0_0_1_6_2 - 0.008875811688312*G0_0_1_6_3 + 0.00591720779220801*G0_0_1_6_4 + 0.0374756493506506*G0_0_1_6_5 + 0.0285998376623387*G0_0_1_6_6 + 0.010355113636364*G0_0_1_6_7 - 0.00887581168831201*G0_0_1_6_8 + 0.0167654220779227*G0_0_1_6_9 - 0.0145190746753252*G0_0_1_7_0 + 0.000109577922077959*G0_0_1_7_1 - 0.00197240259740267*G0_0_1_7_2 - 0.010355113636364*G0_0_1_7_3 - 0.034023944805196*G0_0_1_7_5 + 0.010355113636364*G0_0_1_7_6 - 0.000986201298701285*G0_0_1_7_7 + 0.0374756493506507*G0_0_1_7_8 + 0.00788961038961062*G0_0_1_7_9 + 0.00273944805194815*G0_0_1_8_0 - 0.0112317370129875*G0_0_1_8_1 + 0.00591720779220806*G0_0_1_8_3 + 0.00443790584415597*G0_0_1_8_4 + 0.023668831168832*G0_0_1_8_5 - 0.00887581168831201*G0_0_1_8_6 + 0.0374756493506507*G0_0_1_8_7 - 0.104537337662341*G0_0_1_8_8 - 0.00986201298701329*G0_0_1_8_9 - 0.00953327922077956*G0_0_1_9_0 + 0.000328733766233783*G0_0_1_9_1 + 0.000328733766233774*G0_0_1_9_2 + 0.0197240259740268*G0_0_1_9_3 - 0.00690340909090932*G0_0_1_9_4 - 0.0187378246753254*G0_0_1_9_5 + 0.0167654220779227*G0_0_1_9_6 + 0.00788961038961062*G0_0_1_9_7 - 0.00986201298701329*G0_0_1_9_8 - 0.0185064935064943*G0_1_0_0_0 - 0.00234983766233775*G0_1_0_0_1 - 0.00136972402597408*G0_1_0_0_2 + 0.00262987012987023*G0_1_0_0_3 + 0.00279423701298713*G0_1_0_0_4 - 0.013423295454546*G0_1_0_0_5 + 0.00679383116883143*G0_1_0_0_6 - 0.028216314935066*G0_1_0_0_7 + 0.0117248376623381*G0_1_0_0_8 - 0.00427353896103913*G0_1_0_0_9 - 0.00234983766233775*G0_1_0_1_0 + 0.00164366883116887*G0_1_0_1_1 + 0.000487012987013004*G0_1_0_1_2 + 0.00246550324675333*G0_1_0_1_3 - 0.000986201298701321*G0_1_0_1_4 - 0.00410917207792223*G0_1_0_1_5 + 0.00213676948051956*G0_1_0_1_6 - 0.00887581168831201*G0_1_0_1_7 + 0.00246550324675333*G0_1_0_1_8 - 0.00493100649350667*G0_1_0_1_9 - 0.00136972402597408*G0_1_0_2_0 + 0.000487012987013004*G0_1_0_2_1 + 0.00360389610389624*G0_1_0_2_2 - 0.00186282467532475*G0_1_0_2_3 + 0.00405438311688327*G0_1_0_2_4 - 0.00482142857142875*G0_1_0_2_5 + 0.00356128246753261*G0_1_0_2_6 - 0.00624594155844178*G0_1_0_2_7 + 0.00427353896103911*G0_1_0_2_8 + 0.000328733766233771*G0_1_0_2_9 + 0.00262987012987023*G0_1_0_3_0 + 0.00246550324675333*G0_1_0_3_1 - 0.00186282467532475*G0_1_0_3_2 + 0.0700202922077947*G0_1_0_3_3 - 0.00493100649350664*G0_1_0_3_4 - 0.00197240259740267*G0_1_0_3_6 - 0.00345170454545465*G0_1_0_3_7 + 0.011834415584416*G0_1_0_3_8 + 0.0216964285714293*G0_1_0_3_9 + 0.00279423701298713*G0_1_0_4_0 - 0.000986201298701321*G0_1_0_4_1 + 0.00405438311688327*G0_1_0_4_2 - 0.00493100649350664*G0_1_0_4_3 + 0.0739650974026*G0_1_0_4_4 - 0.00394480519480533*G0_1_0_4_5 + 0.00591720779220801*G0_1_0_4_6 + 0.00295860389610402*G0_1_0_4_7 - 0.00838271103896133*G0_1_0_4_8 + 0.00690340909090935*G0_1_0_4_9 - 0.013423295454546*G0_1_0_5_0 - 0.00410917207792223*G0_1_0_5_1 - 0.00482142857142875*G0_1_0_5_2 - 0.00394480519480532*G0_1_0_5_4 - 0.0364894480519494*G0_1_0_5_5 + 0.016272321428572*G0_1_0_5_6 - 0.039941152597404*G0_1_0_5_7 + 0.0167654220779227*G0_1_0_5_8 - 0.020710227272728*G0_1_0_5_9 + 0.00679383116883143*G0_1_0_6_0 + 0.00213676948051956*G0_1_0_6_1 + 0.00356128246753261*G0_1_0_6_2 - 0.00197240259740267*G0_1_0_6_3 + 0.00591720779220801*G0_1_0_6_4 + 0.016272321428572*G0_1_0_6_5 - 0.0108482142857147*G0_1_0_6_6 + 0.0231757305194813*G0_1_0_6_7 - 0.011834415584416*G0_1_0_6_8 + 0.00295860389610402*G0_1_0_6_9 - 0.028216314935066*G0_1_0_7_0 - 0.00887581168831201*G0_1_0_7_1 - 0.00624594155844178*G0_1_0_7_2 - 0.00345170454545465*G0_1_0_7_3 + 0.00295860389610402*G0_1_0_7_4 - 0.039941152597404*G0_1_0_7_5 + 0.0231757305194813*G0_1_0_7_6 - 0.130178571428576*G0_1_0_7_7 + 0.0374756493506507*G0_1_0_7_8 - 0.0335308441558454*G0_1_0_7_9 + 0.0117248376623381*G0_1_0_8_0 + 0.00246550324675333*G0_1_0_8_1 + 0.00427353896103911*G0_1_0_8_2 + 0.011834415584416*G0_1_0_8_3 - 0.00838271103896133*G0_1_0_8_4 + 0.0167654220779227*G0_1_0_8_5 - 0.011834415584416*G0_1_0_8_6 + 0.0374756493506507*G0_1_0_8_7 + 0.0246550324675333*G0_1_0_8_8 + 0.0315584415584427*G0_1_0_8_9 - 0.00427353896103913*G0_1_0_9_0 - 0.00493100649350667*G0_1_0_9_1 + 0.000328733766233772*G0_1_0_9_2 + 0.0216964285714293*G0_1_0_9_3 + 0.00690340909090934*G0_1_0_9_4 - 0.020710227272728*G0_1_0_9_5 + 0.00295860389610402*G0_1_0_9_6 - 0.0335308441558454*G0_1_0_9_7 + 0.0315584415584427*G0_1_0_9_8 - 0.0185064935064943*G0_1_1_0_0 - 0.00234983766233775*G0_1_1_0_1 - 0.00136972402597408*G0_1_1_0_2 + 0.00262987012987023*G0_1_1_0_3 + 0.00279423701298713*G0_1_1_0_4 - 0.013423295454546*G0_1_1_0_5 + 0.00679383116883143*G0_1_1_0_6 - 0.028216314935066*G0_1_1_0_7 + 0.0117248376623381*G0_1_1_0_8 - 0.00427353896103912*G0_1_1_0_9 - 0.00234983766233775*G0_1_1_1_0 + 0.00164366883116887*G0_1_1_1_1 + 0.000487012987013004*G0_1_1_1_2 + 0.00246550324675332*G0_1_1_1_3 - 0.00098620129870132*G0_1_1_1_4 - 0.00410917207792223*G0_1_1_1_5 + 0.00213676948051956*G0_1_1_1_6 - 0.008875811688312*G0_1_1_1_7 + 0.00246550324675333*G0_1_1_1_8 - 0.00493100649350667*G0_1_1_1_9 - 0.00136972402597408*G0_1_1_2_0 + 0.000487012987013003*G0_1_1_2_1 + 0.00360389610389624*G0_1_1_2_2 - 0.00186282467532475*G0_1_1_2_3 + 0.00405438311688327*G0_1_1_2_4 - 0.00482142857142875*G0_1_1_2_5 + 0.0035612824675326*G0_1_1_2_6 - 0.00624594155844179*G0_1_1_2_7 + 0.00427353896103911*G0_1_1_2_8 + 0.000328733766233767*G0_1_1_2_9 + 0.00262987012987023*G0_1_1_3_0 + 0.00246550324675332*G0_1_1_3_1 - 0.00186282467532475*G0_1_1_3_2 + 0.0700202922077947*G0_1_1_3_3 - 0.00493100649350663*G0_1_1_3_4 - 0.00197240259740267*G0_1_1_3_6 - 0.00345170454545465*G0_1_1_3_7 + 0.011834415584416*G0_1_1_3_8 + 0.0216964285714293*G0_1_1_3_9 + 0.00279423701298713*G0_1_1_4_0 - 0.000986201298701319*G0_1_1_4_1 + 0.00405438311688327*G0_1_1_4_2 - 0.00493100649350663*G0_1_1_4_3 + 0.0739650974026*G0_1_1_4_4 - 0.00394480519480533*G0_1_1_4_5 + 0.00591720779220801*G0_1_1_4_6 + 0.00295860389610402*G0_1_1_4_7 - 0.00838271103896133*G0_1_1_4_8 + 0.00690340909090937*G0_1_1_4_9 - 0.013423295454546*G0_1_1_5_0 - 0.00410917207792223*G0_1_1_5_1 - 0.00482142857142875*G0_1_1_5_2 - 0.00394480519480533*G0_1_1_5_4 - 0.0364894480519494*G0_1_1_5_5 + 0.016272321428572*G0_1_1_5_6 - 0.039941152597404*G0_1_1_5_7 + 0.0167654220779227*G0_1_1_5_8 - 0.020710227272728*G0_1_1_5_9 + 0.00679383116883143*G0_1_1_6_0 + 0.00213676948051956*G0_1_1_6_1 + 0.0035612824675326*G0_1_1_6_2 - 0.00197240259740267*G0_1_1_6_3 + 0.00591720779220801*G0_1_1_6_4 + 0.016272321428572*G0_1_1_6_5 - 0.0108482142857147*G0_1_1_6_6 + 0.0231757305194813*G0_1_1_6_7 - 0.011834415584416*G0_1_1_6_8 + 0.00295860389610404*G0_1_1_6_9 - 0.028216314935066*G0_1_1_7_0 - 0.00887581168831201*G0_1_1_7_1 - 0.00624594155844178*G0_1_1_7_2 - 0.00345170454545465*G0_1_1_7_3 + 0.00295860389610402*G0_1_1_7_4 - 0.039941152597404*G0_1_1_7_5 + 0.0231757305194813*G0_1_1_7_6 - 0.130178571428576*G0_1_1_7_7 + 0.0374756493506508*G0_1_1_7_8 - 0.0335308441558454*G0_1_1_7_9 + 0.0117248376623381*G0_1_1_8_0 + 0.00246550324675333*G0_1_1_8_1 + 0.00427353896103911*G0_1_1_8_2 + 0.011834415584416*G0_1_1_8_3 - 0.00838271103896133*G0_1_1_8_4 + 0.0167654220779227*G0_1_1_8_5 - 0.011834415584416*G0_1_1_8_6 + 0.0374756493506508*G0_1_1_8_7 + 0.0246550324675333*G0_1_1_8_8 + 0.0315584415584427*G0_1_1_8_9 - 0.00427353896103912*G0_1_1_9_0 - 0.00493100649350667*G0_1_1_9_1 + 0.000328733766233767*G0_1_1_9_2 + 0.0216964285714293*G0_1_1_9_3 + 0.00690340909090937*G0_1_1_9_4 - 0.020710227272728*G0_1_1_9_5 + 0.00295860389610404*G0_1_1_9_6 - 0.0335308441558454*G0_1_1_9_7 + 0.0315584415584427*G0_1_1_9_8; + A[89] = -A[19] - 0.0116274350649355*G0_0_0_0_0 - 0.0018689123376624*G0_0_0_0_2 + 0.00509537337662358*G0_0_0_0_3 + 0.000821834415584454*G0_0_0_0_4 - 0.0176420454545461*G0_0_0_0_5 + 0.0104646915584419*G0_0_0_0_6 - 0.00728693181818208*G0_0_0_0_7 + 0.0035612824675326*G0_0_0_0_8 - 0.00361607142857156*G0_0_0_0_9 + 0.0116274350649354*G0_0_0_1_1 + 0.0018689123376624*G0_0_0_1_2 + 0.017642045454546*G0_0_0_1_3 - 0.0104646915584419*G0_0_0_1_4 - 0.00509537337662355*G0_0_0_1_5 - 0.000821834415584453*G0_0_0_1_6 - 0.00356128246753259*G0_0_0_1_7 + 0.00728693181818207*G0_0_0_1_8 + 0.00361607142857156*G0_0_0_1_9 - 0.0018689123376624*G0_0_0_2_0 + 0.0018689123376624*G0_0_0_2_1 + 0.00295860389610398*G0_0_0_2_3 - 0.00493100649350666*G0_0_0_2_4 - 0.002958603896104*G0_0_0_2_5 + 0.00493100649350665*G0_0_0_2_6 + 0.00016436688311689*G0_0_0_2_7 - 0.000164366883116884*G0_0_0_2_8 + 0.00509537337662358*G0_0_0_3_0 + 0.017642045454546*G0_0_0_3_1 + 0.00295860389610398*G0_0_0_3_2 + 0.150888798701304*G0_0_0_3_3 - 0.00542410714285725*G0_0_0_3_4 + 0.00246550324675334*G0_0_0_3_6 - 0.0152861201298707*G0_0_0_3_7 + 0.01479301948052*G0_0_0_3_8 + 0.0197240259740267*G0_0_0_3_9 + 0.000821834415584454*G0_0_0_4_0 - 0.0104646915584419*G0_0_0_4_1 - 0.00493100649350666*G0_0_0_4_2 - 0.00542410714285724*G0_0_0_4_3 + 0.0305722402597414*G0_0_0_4_4 - 0.00246550324675333*G0_0_0_4_5 - 0.00147930194805201*G0_0_0_4_7 + 0.000493100649350649*G0_0_0_4_8 + 0.00493100649350669*G0_0_0_4_9 - 0.0176420454545461*G0_0_0_5_0 - 0.00509537337662355*G0_0_0_5_1 - 0.002958603896104*G0_0_0_5_2 - 0.00246550324675333*G0_0_0_5_4 - 0.150888798701304*G0_0_0_5_5 + 0.00542410714285731*G0_0_0_5_6 - 0.01479301948052*G0_0_0_5_7 + 0.0152861201298706*G0_0_0_5_8 - 0.0197240259740267*G0_0_0_5_9 + 0.0104646915584419*G0_0_0_6_0 - 0.000821834415584452*G0_0_0_6_1 + 0.00493100649350665*G0_0_0_6_2 + 0.00246550324675334*G0_0_0_6_3 + 0.00542410714285732*G0_0_0_6_5 - 0.0305722402597414*G0_0_0_6_6 - 0.000493100649350676*G0_0_0_6_7 + 0.001479301948052*G0_0_0_6_8 - 0.00493100649350669*G0_0_0_6_9 - 0.00728693181818208*G0_0_0_7_0 - 0.00356128246753259*G0_0_0_7_1 + 0.00016436688311689*G0_0_0_7_2 - 0.0152861201298707*G0_0_0_7_3 - 0.00147930194805201*G0_0_0_7_4 - 0.01479301948052*G0_0_0_7_5 - 0.000493100649350677*G0_0_0_7_6 + 0.0128206168831174*G0_0_0_7_7 + 0.011834415584416*G0_0_0_7_9 + 0.0035612824675326*G0_0_0_8_0 + 0.00728693181818206*G0_0_0_8_1 - 0.000164366883116883*G0_0_0_8_2 + 0.01479301948052*G0_0_0_8_3 + 0.000493100649350649*G0_0_0_8_4 + 0.0152861201298706*G0_0_0_8_5 + 0.001479301948052*G0_0_0_8_6 - 0.0128206168831173*G0_0_0_8_8 - 0.011834415584416*G0_0_0_8_9 - 0.00361607142857156*G0_0_0_9_0 + 0.00361607142857156*G0_0_0_9_1 + 0.0197240259740267*G0_0_0_9_3 + 0.00493100649350669*G0_0_0_9_4 - 0.0197240259740267*G0_0_0_9_5 - 0.00493100649350669*G0_0_0_9_6 + 0.011834415584416*G0_0_0_9_7 - 0.011834415584416*G0_0_0_9_8 - 0.00505275974025996*G0_0_1_0_0 + 0.000432224025974036*G0_0_1_0_1 - 0.00169845779220785*G0_0_1_0_2 + 0.0047666396103898*G0_0_1_0_3 + 0.0016436688311689*G0_0_1_0_4 - 0.00778003246753276*G0_0_1_0_5 + 0.00454748376623393*G0_0_1_0_6 - 0.0171489448051954*G0_0_1_0_7 - 0.00235592532467537*G0_0_1_0_8 - 0.0115056818181822*G0_0_1_0_9 + 0.000432224025974036*G0_0_1_1_0 + 0.00657467532467548*G0_0_1_1_1 + 0.000170454545454547*G0_0_1_1_2 + 0.00986201298701329*G0_0_1_1_3 - 0.00591720779220798*G0_0_1_1_4 - 0.000328733766233774*G0_0_1_1_5 + 0.000821834415584439*G0_0_1_1_6 - 0.00591720779220798*G0_0_1_1_7 - 0.00986201298701335*G0_0_1_1_8 - 0.00788961038961064*G0_0_1_1_9 - 0.00169845779220785*G0_0_1_2_0 + 0.000170454545454548*G0_0_1_2_1 - 0.000645292207792236*G0_0_1_2_2 + 0.00580762987013005*G0_0_1_2_3 - 0.0104646915584419*G0_0_1_2_4 + 0.00284902597402607*G0_0_1_2_5 - 0.00553368506493526*G0_0_1_2_6 + 0.0106838474025978*G0_0_1_2_7 + 0.0105194805194809*G0_0_1_2_8 + 0.0164366883116889*G0_0_1_2_9 + 0.0047666396103898*G0_0_1_3_0 + 0.00986201298701328*G0_0_1_3_1 + 0.00580762987013005*G0_0_1_3_2 + 0.144478490259745*G0_0_1_3_3 - 0.00690340909090923*G0_0_1_3_4 - 0.00739650974025999*G0_0_1_3_5 - 0.000986201298701329*G0_0_1_3_6 - 0.0128206168831174*G0_0_1_3_7 + 0.0428997564935079*G0_0_1_3_8 + 0.0493100649350666*G0_0_1_3_9 + 0.0016436688311689*G0_0_1_4_0 - 0.00591720779220798*G0_0_1_4_1 - 0.0104646915584419*G0_0_1_4_2 - 0.00690340909090922*G0_0_1_4_3 + 0.0340239448051961*G0_0_1_4_4 - 0.00345170454545469*G0_0_1_4_5 + 0.00443790584415603*G0_0_1_4_6 - 0.019230925324676*G0_0_1_4_7 - 0.0300791396103906*G0_0_1_4_8 - 0.0424066558441572*G0_0_1_4_9 - 0.00778003246753276*G0_0_1_5_0 - 0.000328733766233774*G0_0_1_5_1 + 0.00284902597402607*G0_0_1_5_2 - 0.00739650974025999*G0_0_1_5_3 - 0.00345170454545469*G0_0_1_5_4 - 0.00641030844155867*G0_0_1_5_5 - 0.001479301948052*G0_0_1_5_6 + 0.028106737012988*G0_0_1_5_7 + 0.00246550324675331*G0_0_1_5_8 + 0.02958603896104*G0_0_1_5_9 + 0.00454748376623393*G0_0_1_6_0 + 0.000821834415584439*G0_0_1_6_1 - 0.00553368506493526*G0_0_1_6_2 - 0.00098620129870133*G0_0_1_6_3 + 0.00443790584415603*G0_0_1_6_4 - 0.00147930194805199*G0_0_1_6_5 + 0.00345170454545468*G0_0_1_6_6 - 0.0305722402597414*G0_0_1_6_7 - 0.017751623376624*G0_0_1_6_8 - 0.047337662337664*G0_0_1_6_9 - 0.0171489448051954*G0_0_1_7_0 - 0.00591720779220798*G0_0_1_7_1 + 0.0106838474025978*G0_0_1_7_2 - 0.0128206168831174*G0_0_1_7_3 - 0.019230925324676*G0_0_1_7_4 + 0.028106737012988*G0_0_1_7_5 - 0.0305722402597414*G0_0_1_7_6 + 0.211540178571436*G0_0_1_7_7 + 0.0350101461038973*G0_0_1_7_8 + 0.0956615259740295*G0_0_1_7_9 - 0.00235592532467537*G0_0_1_8_0 - 0.00986201298701335*G0_0_1_8_1 + 0.0105194805194809*G0_0_1_8_2 + 0.0428997564935079*G0_0_1_8_3 - 0.0300791396103906*G0_0_1_8_4 + 0.00246550324675331*G0_0_1_8_5 - 0.017751623376624*G0_0_1_8_6 + 0.0350101461038973*G0_0_1_8_7 + 0.198719561688319*G0_0_1_8_8 + 0.0838271103896133*G0_0_1_8_9 - 0.0115056818181822*G0_0_1_9_0 - 0.00788961038961064*G0_0_1_9_1 + 0.0164366883116889*G0_0_1_9_2 + 0.0493100649350666*G0_0_1_9_3 - 0.0424066558441572*G0_0_1_9_4 + 0.02958603896104*G0_0_1_9_5 - 0.047337662337664*G0_0_1_9_6 + 0.0956615259740295*G0_0_1_9_7 + 0.0838271103896133*G0_0_1_9_8 + 0.159764610389616*G0_0_1_9_9 + 0.00284902597402608*G0_1_0_0_0 + 0.00241071428571438*G0_1_0_0_1 + 0.00131493506493511*G0_1_0_0_2 + 0.0207102272727281*G0_1_0_0_3 - 0.00493100649350667*G0_1_0_0_4 - 0.00197240259740267*G0_1_0_0_5 - 0.001479301948052*G0_1_0_0_6 - 0.00591720779220802*G0_1_0_0_7 + 0.0113413149350654*G0_1_0_0_8 + 0.011834415584416*G0_1_0_0_9 + 0.00241071428571438*G0_1_0_1_0 + 0.0361607142857154*G0_1_0_1_1 + 0.00487621753246769*G0_1_0_1_2 + 0.0468445616883133*G0_1_0_1_3 - 0.0246550324675333*G0_1_0_1_4 + 0.00197240259740267*G0_1_0_1_5 - 0.000493100649350674*G0_1_0_1_6 - 0.00986201298701334*G0_1_0_1_7 + 0.02218952922078*G0_1_0_1_8 + 0.00493100649350671*G0_1_0_1_9 + 0.00131493506493511*G0_1_0_2_0 + 0.00487621753246769*G0_1_0_2_1 + 0.00164366883116888*G0_1_0_2_2 + 0.017751623376624*G0_1_0_2_3 - 0.0123275162337667*G0_1_0_2_4 - 0.00246550324675336*G0_1_0_2_6 - 0.00394480519480533*G0_1_0_2_7 + 0.010355113636364*G0_1_0_2_8 + 0.00690340909090933*G0_1_0_2_9 + 0.0207102272727281*G0_1_0_3_0 + 0.0468445616883133*G0_1_0_3_1 + 0.017751623376624*G0_1_0_3_2 + 0.386097808441572*G0_1_0_3_3 - 0.0665685876623399*G0_1_0_3_4 - 0.028106737012988*G0_1_0_3_5 - 0.010355113636364*G0_1_0_3_6 - 0.0739650974026001*G0_1_0_3_7 + 0.116864853896108*G0_1_0_3_8 + 0.13313717532468*G0_1_0_3_9 - 0.00493100649350667*G0_1_0_4_0 - 0.0246550324675333*G0_1_0_4_1 - 0.0123275162337667*G0_1_0_4_2 - 0.0665685876623399*G0_1_0_4_3 + 0.0399411525974039*G0_1_0_4_4 + 0.002958603896104*G0_1_0_4_5 + 0.00739650974025997*G0_1_0_4_6 + 0.019230925324676*G0_1_0_4_7 - 0.042899756493508*G0_1_0_4_8 - 0.026627435064936*G0_1_0_4_9 - 0.00197240259740267*G0_1_0_5_0 + 0.00197240259740267*G0_1_0_5_1 - 0.028106737012988*G0_1_0_5_3 + 0.002958603896104*G0_1_0_5_4 + 0.0281067370129881*G0_1_0_5_5 - 0.00295860389610396*G0_1_0_5_6 + 0.017751623376624*G0_1_0_5_7 - 0.017751623376624*G0_1_0_5_8 - 0.001479301948052*G0_1_0_6_0 - 0.000493100649350674*G0_1_0_6_1 - 0.00246550324675336*G0_1_0_6_2 - 0.010355113636364*G0_1_0_6_3 + 0.00739650974025997*G0_1_0_6_4 - 0.00295860389610396*G0_1_0_6_5 + 0.0192309253246759*G0_1_0_6_6 - 0.00887581168831199*G0_1_0_6_8 - 0.00591720779220802*G0_1_0_7_0 - 0.00986201298701334*G0_1_0_7_1 - 0.00394480519480533*G0_1_0_7_2 - 0.0739650974026001*G0_1_0_7_3 + 0.019230925324676*G0_1_0_7_4 + 0.017751623376624*G0_1_0_7_5 + 0.034023944805196*G0_1_0_7_7 - 0.050296266233768*G0_1_0_7_8 - 0.035503246753248*G0_1_0_7_9 + 0.0113413149350653*G0_1_0_8_0 + 0.02218952922078*G0_1_0_8_1 + 0.010355113636364*G0_1_0_8_2 + 0.116864853896108*G0_1_0_8_3 - 0.042899756493508*G0_1_0_8_4 - 0.017751623376624*G0_1_0_8_5 - 0.00887581168831199*G0_1_0_8_6 - 0.050296266233768*G0_1_0_8_7 + 0.105030438311692*G0_1_0_8_8 + 0.071006493506496*G0_1_0_8_9 + 0.011834415584416*G0_1_0_9_0 + 0.00493100649350671*G0_1_0_9_1 + 0.00690340909090933*G0_1_0_9_2 + 0.13313717532468*G0_1_0_9_3 - 0.026627435064936*G0_1_0_9_4 - 0.035503246753248*G0_1_0_9_7 + 0.071006493506496*G0_1_0_9_8 + 0.159764610389616*G0_1_0_9_9 + 0.00120535714285718*G0_1_1_0_0 - 0.00246550324675335*G0_1_1_0_1 + 0.010355113636364*G0_1_1_0_3 - 0.000986201298701336*G0_1_1_0_4 + 0.000493100649350662*G0_1_1_0_5 - 0.001479301948052*G0_1_1_0_6 + 0.00641030844155865*G0_1_1_0_7 - 0.00641030844155869*G0_1_1_0_8 + 0.00493100649350667*G0_1_1_0_9 - 0.00246550324675335*G0_1_1_1_0 + 0.00246550324675332*G0_1_1_1_2 + 0.0246550324675332*G0_1_1_1_3 - 0.0147930194805199*G0_1_1_1_4 + 0.00246550324675333*G0_1_1_1_5 - 0.00246550324675334*G0_1_1_1_6 + 0.0147930194805201*G0_1_1_1_7 - 0.0246550324675335*G0_1_1_1_8 + 0.00246550324675332*G0_1_1_2_1 - 0.00120535714285718*G0_1_1_2_2 + 0.00641030844155864*G0_1_1_2_3 - 0.00641030844155866*G0_1_1_2_4 + 0.001479301948052*G0_1_1_2_5 - 0.000493100649350665*G0_1_1_2_6 + 0.000986201298701326*G0_1_1_2_7 - 0.010355113636364*G0_1_1_2_8 - 0.00493100649350666*G0_1_1_2_9 + 0.010355113636364*G0_1_1_3_0 + 0.0246550324675332*G0_1_1_3_1 + 0.00641030844155864*G0_1_1_3_2 + 0.28106737012988*G0_1_1_3_3 - 0.0162723214285719*G0_1_1_3_4 - 0.019230925324676*G0_1_1_3_5 + 0.00739650974025997*G0_1_1_3_6 - 0.031065340909092*G0_1_1_3_7 + 0.0621306818181841*G0_1_1_3_9 - 0.000986201298701336*G0_1_1_4_0 - 0.0147930194805199*G0_1_1_4_1 - 0.00641030844155866*G0_1_1_4_2 - 0.0162723214285719*G0_1_1_4_3 + 0.00591720779220792*G0_1_1_4_4 + 0.002958603896104*G0_1_1_4_5 - 0.010355113636364*G0_1_1_4_6 + 0.0310653409090919*G0_1_1_4_8 + 0.00887581168831196*G0_1_1_4_9 + 0.000493100649350662*G0_1_1_5_0 + 0.00246550324675333*G0_1_1_5_1 + 0.001479301948052*G0_1_1_5_2 - 0.019230925324676*G0_1_1_5_3 + 0.002958603896104*G0_1_1_5_4 + 0.008875811688312*G0_1_1_5_5 + 0.010355113636364*G0_1_1_5_7 - 0.00739650974025999*G0_1_1_5_8 - 0.001479301948052*G0_1_1_6_0 - 0.00246550324675334*G0_1_1_6_1 - 0.000493100649350665*G0_1_1_6_2 + 0.00739650974025997*G0_1_1_6_3 - 0.010355113636364*G0_1_1_6_4 - 0.00887581168831198*G0_1_1_6_6 - 0.00295860389610398*G0_1_1_6_7 + 0.019230925324676*G0_1_1_6_8 + 0.00641030844155865*G0_1_1_7_0 + 0.0147930194805201*G0_1_1_7_1 + 0.000986201298701326*G0_1_1_7_2 - 0.031065340909092*G0_1_1_7_3 + 0.010355113636364*G0_1_1_7_5 - 0.00295860389610398*G0_1_1_7_6 - 0.00591720779220814*G0_1_1_7_7 + 0.016272321428572*G0_1_1_7_8 - 0.00887581168831205*G0_1_1_7_9 - 0.00641030844155869*G0_1_1_8_0 - 0.0246550324675335*G0_1_1_8_1 - 0.010355113636364*G0_1_1_8_2 + 0.0310653409090919*G0_1_1_8_4 - 0.00739650974025999*G0_1_1_8_5 + 0.019230925324676*G0_1_1_8_6 + 0.016272321428572*G0_1_1_8_7 - 0.28106737012988*G0_1_1_8_8 - 0.0621306818181839*G0_1_1_8_9 + 0.00493100649350667*G0_1_1_9_0 - 0.00493100649350666*G0_1_1_9_2 + 0.0621306818181841*G0_1_1_9_3 + 0.00887581168831196*G0_1_1_9_4 - 0.00887581168831205*G0_1_1_9_7 - 0.0621306818181839*G0_1_1_9_8; + A[98] = A[89] + 0.00986201298701339*G0_0_1_0_0 + 0.00295860389610402*G0_0_1_0_1 + 0.00301339285714296*G0_0_1_0_2 + 0.0138068181818187*G0_0_1_0_3 - 0.00443790584415601*G0_0_1_0_4 + 0.00739650974026002*G0_0_1_0_5 - 0.00690340909090935*G0_0_1_0_6 + 0.0123275162337667*G0_0_1_0_7 + 0.017751623376624*G0_0_1_0_8 + 0.0285998376623387*G0_0_1_0_9 + 0.00295860389610402*G0_0_1_1_0 + 0.02958603896104*G0_0_1_1_1 + 0.00372564935064948*G0_0_1_1_2 + 0.0221895292207801*G0_0_1_1_3 - 0.0138068181818187*G0_0_1_1_4 + 0.00246550324675333*G0_0_1_1_5 - 0.001479301948052*G0_0_1_1_6 - 0.00887581168831206*G0_0_1_1_7 + 0.0468445616883134*G0_0_1_1_8 + 0.0128206168831174*G0_0_1_1_9 + 0.00301339285714296*G0_0_1_2_0 + 0.00372564935064948*G0_0_1_2_1 + 0.000328733766233755*G0_0_1_2_2 + 0.00788961038961068*G0_0_1_2_3 - 0.002958603896104*G0_0_1_2_4 - 0.00197240259740265*G0_0_1_2_5 + 0.00147930194805197*G0_0_1_2_6 - 0.0167654220779227*G0_0_1_2_7 + 0.00197240259740267*G0_0_1_2_8 - 0.01479301948052*G0_0_1_2_9 + 0.0138068181818187*G0_0_1_3_0 + 0.0221895292207801*G0_0_1_3_1 + 0.00788961038961068*G0_0_1_3_2 + 0.1479301948052*G0_0_1_3_3 - 0.038461850649352*G0_0_1_3_4 - 0.017751623376624*G0_0_1_3_5 - 0.00887581168831198*G0_0_1_3_6 - 0.054734172077924*G0_0_1_3_7 + 0.0739650974026001*G0_0_1_3_8 + 0.0710064935064962*G0_0_1_3_9 - 0.00443790584415601*G0_0_1_4_0 - 0.0138068181818187*G0_0_1_4_1 - 0.00295860389610401*G0_0_1_4_2 - 0.038461850649352*G0_0_1_4_3 + 0.0414204545454558*G0_0_1_4_4 + 0.00887581168831192*G0_0_1_4_6 + 0.038461850649352*G0_0_1_4_7 - 0.019230925324676*G0_0_1_4_8 + 0.0443790584415599*G0_0_1_4_9 + 0.00739650974026002*G0_0_1_5_0 + 0.00246550324675333*G0_0_1_5_1 - 0.00197240259740265*G0_0_1_5_2 - 0.017751623376624*G0_0_1_5_3 + 0.0384618506493521*G0_0_1_5_5 - 0.00147930194805196*G0_0_1_5_6 - 0.016272321428572*G0_0_1_5_7 - 0.020710227272728*G0_0_1_5_8 - 0.0443790584415599*G0_0_1_5_9 - 0.00690340909090935*G0_0_1_6_0 - 0.001479301948052*G0_0_1_6_1 + 0.00147930194805197*G0_0_1_6_2 - 0.00887581168831198*G0_0_1_6_3 + 0.00887581168831192*G0_0_1_6_4 - 0.00147930194805196*G0_0_1_6_5 + 0.0118344155844158*G0_0_1_6_6 + 0.0369825487013*G0_0_1_6_7 + 0.00591720779220798*G0_0_1_6_8 + 0.0621306818181839*G0_0_1_6_9 + 0.0123275162337666*G0_0_1_7_0 - 0.00887581168831206*G0_0_1_7_1 - 0.0167654220779227*G0_0_1_7_2 - 0.054734172077924*G0_0_1_7_3 + 0.038461850649352*G0_0_1_7_4 - 0.016272321428572*G0_0_1_7_5 + 0.0369825487013*G0_0_1_7_6 - 0.213019480519489*G0_0_1_7_7 - 0.106509740259744*G0_0_1_7_8 - 0.159764610389616*G0_0_1_7_9 + 0.017751623376624*G0_0_1_8_0 + 0.0468445616883134*G0_0_1_8_1 + 0.00197240259740267*G0_0_1_8_2 + 0.0739650974026001*G0_0_1_8_3 - 0.019230925324676*G0_0_1_8_4 - 0.020710227272728*G0_0_1_8_5 + 0.00591720779220799*G0_0_1_8_6 - 0.106509740259744*G0_0_1_8_7 + 0.0285998376623387*G0_0_1_9_0 + 0.0128206168831174*G0_0_1_9_1 - 0.01479301948052*G0_0_1_9_2 + 0.0710064935064962*G0_0_1_9_3 + 0.0443790584415599*G0_0_1_9_4 - 0.0443790584415599*G0_0_1_9_5 + 0.0621306818181839*G0_0_1_9_6 - 0.159764610389616*G0_0_1_9_7 - 0.00986201298701339*G0_1_0_0_0 - 0.00295860389610402*G0_1_0_0_1 - 0.00301339285714296*G0_1_0_0_2 - 0.0138068181818187*G0_1_0_0_3 + 0.00443790584415601*G0_1_0_0_4 - 0.00739650974026002*G0_1_0_0_5 + 0.00690340909090935*G0_1_0_0_6 - 0.0123275162337667*G0_1_0_0_7 - 0.017751623376624*G0_1_0_0_8 - 0.0285998376623387*G0_1_0_0_9 - 0.00295860389610402*G0_1_0_1_0 - 0.02958603896104*G0_1_0_1_1 - 0.00372564935064948*G0_1_0_1_2 - 0.0221895292207801*G0_1_0_1_3 + 0.0138068181818187*G0_1_0_1_4 - 0.00246550324675333*G0_1_0_1_5 + 0.001479301948052*G0_1_0_1_6 + 0.00887581168831206*G0_1_0_1_7 - 0.0468445616883134*G0_1_0_1_8 - 0.0128206168831174*G0_1_0_1_9 - 0.00301339285714296*G0_1_0_2_0 - 0.00372564935064948*G0_1_0_2_1 - 0.000328733766233755*G0_1_0_2_2 - 0.00788961038961068*G0_1_0_2_3 + 0.00295860389610401*G0_1_0_2_4 + 0.00197240259740265*G0_1_0_2_5 - 0.00147930194805197*G0_1_0_2_6 + 0.0167654220779227*G0_1_0_2_7 - 0.00197240259740267*G0_1_0_2_8 + 0.01479301948052*G0_1_0_2_9 - 0.0138068181818187*G0_1_0_3_0 - 0.0221895292207801*G0_1_0_3_1 - 0.00788961038961068*G0_1_0_3_2 - 0.1479301948052*G0_1_0_3_3 + 0.038461850649352*G0_1_0_3_4 + 0.017751623376624*G0_1_0_3_5 + 0.00887581168831198*G0_1_0_3_6 + 0.054734172077924*G0_1_0_3_7 - 0.0739650974026001*G0_1_0_3_8 - 0.0710064935064962*G0_1_0_3_9 + 0.00443790584415601*G0_1_0_4_0 + 0.0138068181818187*G0_1_0_4_1 + 0.00295860389610401*G0_1_0_4_2 + 0.038461850649352*G0_1_0_4_3 - 0.0414204545454558*G0_1_0_4_4 - 0.00887581168831193*G0_1_0_4_6 - 0.038461850649352*G0_1_0_4_7 + 0.019230925324676*G0_1_0_4_8 - 0.0443790584415599*G0_1_0_4_9 - 0.00739650974026002*G0_1_0_5_0 - 0.00246550324675333*G0_1_0_5_1 + 0.00197240259740265*G0_1_0_5_2 + 0.017751623376624*G0_1_0_5_3 - 0.0384618506493521*G0_1_0_5_5 + 0.00147930194805196*G0_1_0_5_6 + 0.016272321428572*G0_1_0_5_7 + 0.020710227272728*G0_1_0_5_8 + 0.0443790584415599*G0_1_0_5_9 + 0.00690340909090935*G0_1_0_6_0 + 0.001479301948052*G0_1_0_6_1 - 0.00147930194805197*G0_1_0_6_2 + 0.00887581168831198*G0_1_0_6_3 - 0.00887581168831193*G0_1_0_6_4 + 0.00147930194805196*G0_1_0_6_5 - 0.0118344155844158*G0_1_0_6_6 - 0.0369825487013*G0_1_0_6_7 - 0.00591720779220798*G0_1_0_6_8 - 0.0621306818181839*G0_1_0_6_9 - 0.0123275162337666*G0_1_0_7_0 + 0.00887581168831207*G0_1_0_7_1 + 0.0167654220779227*G0_1_0_7_2 + 0.054734172077924*G0_1_0_7_3 - 0.0384618506493521*G0_1_0_7_4 + 0.016272321428572*G0_1_0_7_5 - 0.0369825487013*G0_1_0_7_6 + 0.213019480519489*G0_1_0_7_7 + 0.106509740259744*G0_1_0_7_8 + 0.159764610389616*G0_1_0_7_9 - 0.017751623376624*G0_1_0_8_0 - 0.0468445616883134*G0_1_0_8_1 - 0.00197240259740267*G0_1_0_8_2 - 0.0739650974026001*G0_1_0_8_3 + 0.019230925324676*G0_1_0_8_4 + 0.020710227272728*G0_1_0_8_5 - 0.00591720779220799*G0_1_0_8_6 + 0.106509740259744*G0_1_0_8_7 - 0.0285998376623387*G0_1_0_9_0 - 0.0128206168831174*G0_1_0_9_1 + 0.01479301948052*G0_1_0_9_2 - 0.0710064935064962*G0_1_0_9_3 - 0.0443790584415599*G0_1_0_9_4 + 0.0443790584415599*G0_1_0_9_5 - 0.0621306818181839*G0_1_0_9_6 + 0.159764610389616*G0_1_0_9_7; + A[93] = -A[98] - 0.0210389610389618*G0_0_0_0_0 + 0.00202719155844162*G0_0_0_0_1 - 0.00432832792207807*G0_0_0_0_2 - 0.0138068181818187*G0_0_0_0_3 - 0.013313717532468*G0_0_0_0_4 - 0.013313717532468*G0_0_0_0_5 + 0.00986201298701326*G0_0_0_0_6 - 0.00295860389610402*G0_0_0_0_7 - 0.000986201298701314*G0_0_0_0_8 - 0.032544642857144*G0_0_0_0_9 + 0.00202719155844163*G0_0_0_1_0 + 0.017532467532468*G0_0_0_1_1 + 0.00126014610389614*G0_0_0_1_2 + 0.0443790584415599*G0_0_0_1_3 - 0.0069034090909093*G0_0_0_1_4 - 0.0142999188311693*G0_0_0_1_5 - 0.010355113636364*G0_0_0_1_6 - 0.011834415584416*G0_0_0_1_7 + 0.0197240259740266*G0_0_0_1_8 + 0.0187378246753253*G0_0_0_1_9 - 0.00432832792207807*G0_0_0_2_0 + 0.00126014610389614*G0_0_0_2_1 - 0.0115056818181822*G0_0_0_2_2 + 0.008875811688312*G0_0_0_2_3 + 0.0123275162337667*G0_0_0_2_4 + 0.00493100649350663*G0_0_0_2_5 - 0.00739650974025999*G0_0_0_2_6 - 0.000986201298701338*G0_0_0_2_7 - 0.00197240259740265*G0_0_0_2_8 + 0.0108482142857146*G0_0_0_2_9 - 0.0138068181818187*G0_0_0_3_0 + 0.0443790584415599*G0_0_0_3_1 + 0.008875811688312*G0_0_0_3_2 - 0.186392045454552*G0_0_0_3_3 - 0.0488169642857161*G0_0_0_3_4 + 0.0414204545454559*G0_0_0_3_5 + 0.0325446428571439*G0_0_0_3_6 + 0.0428997564935079*G0_0_0_3_7 - 0.0502962662337679*G0_0_0_3_8 - 0.142012987012992*G0_0_0_3_9 - 0.013313717532468*G0_0_0_4_0 - 0.0069034090909093*G0_0_0_4_1 + 0.0123275162337667*G0_0_0_4_2 - 0.0488169642857161*G0_0_0_4_3 - 0.257398538961048*G0_0_0_4_4 + 0.041420454545456*G0_0_0_4_5 - 0.0739650974025999*G0_0_0_4_6 + 0.020710227272728*G0_0_0_4_7 + 0.00739650974025997*G0_0_0_4_8 - 0.115385551948056*G0_0_0_4_9 - 0.013313717532468*G0_0_0_5_0 - 0.0142999188311693*G0_0_0_5_1 + 0.00493100649350663*G0_0_0_5_2 + 0.0414204545454559*G0_0_0_5_3 + 0.041420454545456*G0_0_0_5_4 - 0.360949675324687*G0_0_0_5_5 + 0.025148133116884*G0_0_0_5_6 - 0.0488169642857159*G0_0_0_5_7 + 0.0443790584415599*G0_0_0_5_8 + 0.00887581168831187*G0_0_0_5_9 + 0.00986201298701327*G0_0_0_6_0 - 0.010355113636364*G0_0_0_6_1 - 0.00739650974025999*G0_0_0_6_2 + 0.0325446428571439*G0_0_0_6_3 - 0.0739650974025999*G0_0_0_6_4 + 0.025148133116884*G0_0_0_6_5 - 0.334322240259752*G0_0_0_6_6 + 0.00443790584415596*G0_0_0_6_7 + 0.0177516233766239*G0_0_0_6_8 - 0.0976339285714318*G0_0_0_6_9 - 0.00295860389610402*G0_0_0_7_0 - 0.011834415584416*G0_0_0_7_1 - 0.000986201298701337*G0_0_0_7_2 + 0.0428997564935079*G0_0_0_7_3 + 0.020710227272728*G0_0_0_7_4 - 0.0488169642857159*G0_0_0_7_5 + 0.00443790584415596*G0_0_0_7_6 - 0.00295860389610393*G0_0_0_7_7 + 0.019230925324676*G0_0_0_7_8 + 0.0887581168831198*G0_0_0_7_9 - 0.000986201298701314*G0_0_0_8_0 + 0.0197240259740266*G0_0_0_8_1 - 0.00197240259740265*G0_0_0_8_2 - 0.0502962662337679*G0_0_0_8_3 + 0.00739650974025997*G0_0_0_8_4 + 0.0443790584415599*G0_0_0_8_5 + 0.0177516233766239*G0_0_0_8_6 + 0.0192309253246759*G0_0_0_8_7 - 0.0384618506493519*G0_0_0_8_8 - 0.0710064935064958*G0_0_0_8_9 - 0.032544642857144*G0_0_0_9_0 + 0.0187378246753253*G0_0_0_9_1 + 0.0108482142857146*G0_0_0_9_2 - 0.142012987012992*G0_0_0_9_3 - 0.115385551948056*G0_0_0_9_4 + 0.00887581168831187*G0_0_0_9_5 - 0.0976339285714318*G0_0_0_9_6 + 0.0887581168831198*G0_0_0_9_7 - 0.0710064935064958*G0_0_0_9_8 - 0.319529220779231*G0_0_0_9_9 - 0.00953327922077963*G0_1_0_0_0 + 0.000767045454545466*G0_1_0_0_1 - 0.011834415584416*G0_1_0_0_3 - 0.0123275162337667*G0_1_0_0_4 - 0.00591720779220804*G0_1_0_0_5 + 0.00493100649350669*G0_1_0_0_6 - 0.0152861201298707*G0_1_0_0_7 - 0.00986201298701331*G0_1_0_0_8 - 0.0433928571428587*G0_1_0_0_9 + 0.000767045454545466*G0_1_0_1_0 - 0.000767045454545481*G0_1_0_1_2 + 0.0246550324675332*G0_1_0_1_3 + 0.0049310064935067*G0_1_0_1_4 - 0.00394480519480532*G0_1_0_1_5 + 0.00394480519480534*G0_1_0_1_6 - 0.0049310064935066*G0_1_0_1_7 - 0.0246550324675334*G0_1_0_1_8 - 0.000767045454545481*G0_1_0_2_1 + 0.00953327922077962*G0_1_0_2_2 + 0.00986201298701331*G0_1_0_2_3 + 0.0152861201298707*G0_1_0_2_4 - 0.00493100649350669*G0_1_0_2_5 + 0.00591720779220805*G0_1_0_2_6 + 0.0123275162337667*G0_1_0_2_7 + 0.011834415584416*G0_1_0_2_8 + 0.0433928571428586*G0_1_0_2_9 - 0.011834415584416*G0_1_0_3_0 + 0.0246550324675332*G0_1_0_3_1 + 0.0098620129870133*G0_1_0_3_2 - 0.1479301948052*G0_1_0_3_3 - 0.0680478896103921*G0_1_0_3_4 + 0.023668831168832*G0_1_0_3_5 - 0.011834415584416*G0_1_0_3_6 + 0.0355032467532479*G0_1_0_3_7 - 0.0710064935064961*G0_1_0_3_9 - 0.0123275162337667*G0_1_0_4_0 + 0.0049310064935067*G0_1_0_4_1 + 0.0152861201298707*G0_1_0_4_2 - 0.0680478896103921*G0_1_0_4_3 - 0.254439935064944*G0_1_0_4_4 + 0.0369825487012999*G0_1_0_4_5 - 0.0251481331168839*G0_1_0_4_6 - 0.035503246753248*G0_1_0_4_8 - 0.204143668831176*G0_1_0_4_9 - 0.00591720779220804*G0_1_0_5_0 - 0.00394480519480532*G0_1_0_5_1 - 0.0049310064935067*G0_1_0_5_2 + 0.023668831168832*G0_1_0_5_3 + 0.0369825487012999*G0_1_0_5_4 - 0.026627435064936*G0_1_0_5_5 + 0.025148133116884*G0_1_0_5_7 + 0.011834415584416*G0_1_0_5_8 + 0.106509740259744*G0_1_0_5_9 + 0.00493100649350669*G0_1_0_6_0 + 0.00394480519480534*G0_1_0_6_1 + 0.00591720779220805*G0_1_0_6_2 - 0.011834415584416*G0_1_0_6_3 - 0.0251481331168839*G0_1_0_6_4 + 0.0266274350649362*G0_1_0_6_6 - 0.0369825487013*G0_1_0_6_7 - 0.023668831168832*G0_1_0_6_8 - 0.106509740259744*G0_1_0_6_9 - 0.0152861201298707*G0_1_0_7_0 - 0.0049310064935066*G0_1_0_7_1 + 0.0123275162337667*G0_1_0_7_2 + 0.0355032467532479*G0_1_0_7_3 + 0.025148133116884*G0_1_0_7_5 - 0.0369825487013*G0_1_0_7_6 + 0.254439935064945*G0_1_0_7_7 + 0.068047889610392*G0_1_0_7_8 + 0.204143668831176*G0_1_0_7_9 - 0.0098620129870133*G0_1_0_8_0 - 0.0246550324675334*G0_1_0_8_1 + 0.011834415584416*G0_1_0_8_2 - 0.0355032467532479*G0_1_0_8_4 + 0.011834415584416*G0_1_0_8_5 - 0.023668831168832*G0_1_0_8_6 + 0.068047889610392*G0_1_0_8_7 + 0.1479301948052*G0_1_0_8_8 + 0.0710064935064959*G0_1_0_8_9 - 0.0433928571428587*G0_1_0_9_0 + 0.0433928571428586*G0_1_0_9_2 - 0.0710064935064961*G0_1_0_9_3 - 0.204143668831176*G0_1_0_9_4 + 0.106509740259744*G0_1_0_9_5 - 0.106509740259744*G0_1_0_9_6 + 0.204143668831176*G0_1_0_9_7 + 0.0710064935064959*G0_1_0_9_8; + A[97] = A[98] + 0.0453652597402614*G0_0_0_0_0 + 0.00657467532467555*G0_0_0_0_2 - 0.0192309253246761*G0_0_0_0_3 + 0.0675547889610413*G0_0_0_0_5 - 0.0345170454545466*G0_0_0_0_6 + 0.0315584415584427*G0_0_0_0_7 - 0.0187378246753254*G0_0_0_0_8 + 0.011834415584416*G0_0_0_0_9 - 0.0453652597402611*G0_0_0_1_1 - 0.00657467532467554*G0_0_0_1_2 - 0.0675547889610412*G0_0_0_1_3 + 0.0345170454545466*G0_0_0_1_4 + 0.019230925324676*G0_0_0_1_5 + 0.0187378246753253*G0_0_0_1_7 - 0.0315584415584427*G0_0_0_1_8 - 0.011834415584416*G0_0_0_1_9 + 0.00657467532467555*G0_0_0_2_0 - 0.00657467532467554*G0_0_0_2_1 - 0.0138068181818186*G0_0_0_2_3 + 0.00986201298701333*G0_0_0_2_4 + 0.0138068181818187*G0_0_0_2_5 - 0.0098620129870133*G0_0_0_2_6 + 0.005917207792208*G0_0_0_2_7 - 0.00591720779220801*G0_0_0_2_8 - 0.0192309253246761*G0_0_0_3_0 - 0.0675547889610412*G0_0_0_3_1 - 0.0138068181818186*G0_0_0_3_2 - 0.505921266233784*G0_0_0_3_3 + 0.0532548701298718*G0_0_0_3_4 + 0.0576927759740281*G0_0_0_3_7 - 0.0754443993506522*G0_0_0_3_8 - 0.0798823051948083*G0_0_0_3_9 + 0.0345170454545466*G0_0_0_4_1 + 0.00986201298701333*G0_0_0_4_2 + 0.0532548701298718*G0_0_0_4_3 - 0.106509740259744*G0_0_0_4_4 - 0.00887581168831201*G0_0_0_4_7 + 0.017751623376624*G0_0_0_4_8 + 0.0675547889610413*G0_0_0_5_0 + 0.019230925324676*G0_0_0_5_1 + 0.0138068181818187*G0_0_0_5_2 + 0.505921266233783*G0_0_0_5_5 - 0.0532548701298719*G0_0_0_5_6 + 0.0754443993506519*G0_0_0_5_7 - 0.0576927759740279*G0_0_0_5_8 + 0.079882305194808*G0_0_0_5_9 - 0.0345170454545466*G0_0_0_6_0 - 0.00986201298701331*G0_0_0_6_2 - 0.0532548701298719*G0_0_0_6_5 + 0.106509740259744*G0_0_0_6_6 - 0.017751623376624*G0_0_0_6_7 + 0.00887581168831202*G0_0_0_6_8 + 0.0315584415584427*G0_0_0_7_0 + 0.0187378246753253*G0_0_0_7_1 + 0.005917207792208*G0_0_0_7_2 + 0.0576927759740281*G0_0_0_7_3 - 0.00887581168831201*G0_0_0_7_4 + 0.0754443993506519*G0_0_0_7_5 - 0.017751623376624*G0_0_0_7_6 - 0.0187378246753254*G0_0_0_8_0 - 0.0315584415584427*G0_0_0_8_1 - 0.00591720779220801*G0_0_0_8_2 - 0.0754443993506522*G0_0_0_8_3 + 0.017751623376624*G0_0_0_8_4 - 0.0576927759740279*G0_0_0_8_5 + 0.00887581168831202*G0_0_0_8_6 + 0.011834415584416*G0_0_0_9_0 - 0.011834415584416*G0_0_0_9_1 - 0.0798823051948083*G0_0_0_9_3 + 0.079882305194808*G0_0_0_9_5 - 0.00887581168831201*G0_0_1_0_0 - 0.00345170454545468*G0_0_1_0_1 - 0.00197240259740266*G0_0_1_0_2 - 0.0305722402597414*G0_0_1_0_3 + 0.00197240259740267*G0_0_1_0_4 + 0.000986201298701329*G0_0_1_0_5 + 0.00394480519480533*G0_0_1_0_6 + 0.00443790584415602*G0_0_1_0_7 - 0.011834415584416*G0_0_1_0_8 - 0.00887581168831206*G0_0_1_0_9 - 0.00345170454545468*G0_0_1_1_0 - 0.0542410714285731*G0_0_1_1_1 - 0.0085470779220782*G0_0_1_1_2 - 0.0665685876623399*G0_0_1_1_3 + 0.0384618506493519*G0_0_1_1_4 - 0.0113413149350653*G0_0_1_1_5 + 0.00197240259740268*G0_0_1_1_6 + 0.00690340909090934*G0_0_1_1_7 - 0.0271205357142867*G0_0_1_1_8 - 0.0207102272727281*G0_0_1_1_9 - 0.00197240259740266*G0_0_1_2_0 - 0.0085470779220782*G0_0_1_2_1 - 0.00493100649350664*G0_0_1_2_2 - 0.0197240259740266*G0_0_1_2_3 + 0.0172585227272733*G0_0_1_2_4 - 0.00591720779220802*G0_0_1_2_5 + 0.00739650974026003*G0_0_1_2_6 - 0.00246550324675333*G0_0_1_2_7 - 0.00838271103896133*G0_0_1_2_8 - 0.00887581168831202*G0_0_1_2_9 - 0.0305722402597414*G0_0_1_3_0 - 0.0665685876623399*G0_0_1_3_1 - 0.0197240259740266*G0_0_1_3_2 - 0.639058441558464*G0_0_1_3_3 + 0.0798823051948078*G0_0_1_3_4 + 0.0532548701298719*G0_0_1_3_5 + 0.013313717532468*G0_0_1_3_6 + 0.1109476461039*G0_0_1_3_7 - 0.15532670454546*G0_0_1_3_8 - 0.159764610389616*G0_0_1_3_9 + 0.00197240259740267*G0_0_1_4_0 + 0.0384618506493519*G0_0_1_4_1 + 0.0172585227272733*G0_0_1_4_2 + 0.0798823051948077*G0_0_1_4_3 - 0.159764610389616*G0_0_1_4_4 + 0.013313717532468*G0_0_1_4_5 - 0.0266274350649359*G0_0_1_4_6 - 0.008875811688312*G0_0_1_4_7 + 0.04437905844156*G0_0_1_4_8 + 0.00098620129870133*G0_0_1_5_0 - 0.0113413149350653*G0_0_1_5_1 - 0.00591720779220802*G0_0_1_5_2 + 0.0532548701298719*G0_0_1_5_3 + 0.013313717532468*G0_0_1_5_4 - 0.13313717532468*G0_0_1_5_5 + 0.0266274350649359*G0_0_1_5_6 - 0.0798823051948079*G0_0_1_5_7 + 0.053254870129872*G0_0_1_5_8 - 0.079882305194808*G0_0_1_5_9 + 0.00394480519480533*G0_0_1_6_0 + 0.00197240259740268*G0_0_1_6_1 + 0.00739650974026003*G0_0_1_6_2 + 0.013313717532468*G0_0_1_6_3 - 0.0266274350649359*G0_0_1_6_4 + 0.0266274350649359*G0_0_1_6_5 - 0.0532548701298716*G0_0_1_6_6 + 0.026627435064936*G0_0_1_6_7 + 0.00443790584415602*G0_0_1_7_0 + 0.00690340909090934*G0_0_1_7_1 - 0.00246550324675333*G0_0_1_7_2 + 0.1109476461039*G0_0_1_7_3 - 0.008875811688312*G0_0_1_7_4 - 0.0798823051948079*G0_0_1_7_5 + 0.026627435064936*G0_0_1_7_6 - 0.115385551948056*G0_0_1_7_7 + 0.084320211038964*G0_0_1_7_8 - 0.026627435064936*G0_0_1_7_9 - 0.011834415584416*G0_0_1_8_0 - 0.0271205357142867*G0_0_1_8_1 - 0.00838271103896133*G0_0_1_8_2 - 0.15532670454546*G0_0_1_8_3 + 0.04437905844156*G0_0_1_8_4 + 0.053254870129872*G0_0_1_8_5 + 0.084320211038964*G0_0_1_8_7 - 0.115385551948056*G0_0_1_8_8 - 0.0266274350649361*G0_0_1_8_9 - 0.00887581168831206*G0_0_1_9_0 - 0.020710227272728*G0_0_1_9_1 - 0.00887581168831202*G0_0_1_9_2 - 0.159764610389616*G0_0_1_9_3 - 0.079882305194808*G0_0_1_9_5 - 0.026627435064936*G0_0_1_9_7 - 0.0266274350649361*G0_0_1_9_8 - 0.319529220779232*G0_0_1_9_9 + 0.0305722402597415*G0_1_0_0_0 + 0.00246550324675336*G0_1_0_0_1 + 0.00476663961038978*G0_1_0_0_2 - 0.0142999188311694*G0_1_0_0_3 - 0.00394480519480535*G0_1_0_0_4 + 0.0305722402597414*G0_1_0_0_5 - 0.0167654220779227*G0_1_0_0_6 + 0.0636099837662361*G0_1_0_0_7 - 0.0029586038961041*G0_1_0_0_8 + 0.032544642857144*G0_1_0_0_9 + 0.00246550324675336*G0_1_0_1_0 - 0.0147930194805197*G0_1_0_1_1 - 0.00180803571428576*G0_1_0_1_2 - 0.0369825487012998*G0_1_0_1_3 + 0.0177516233766239*G0_1_0_1_4 + 0.00493100649350666*G0_1_0_1_5 - 0.00394480519480532*G0_1_0_1_6 + 0.0157792207792213*G0_1_0_1_7 + 0.0320515422077934*G0_1_0_1_8 + 0.020710227272728*G0_1_0_1_9 + 0.00476663961038978*G0_1_0_2_0 - 0.00180803571428576*G0_1_0_2_1 - 0.00427353896103912*G0_1_0_2_2 - 0.0138068181818186*G0_1_0_2_3 + 0.0157792207792213*G0_1_0_2_4 + 0.00591720779220798*G0_1_0_2_6 - 0.0172585227272733*G0_1_0_2_7 - 0.0231757305194813*G0_1_0_2_8 - 0.038461850649352*G0_1_0_2_9 - 0.0142999188311694*G0_1_0_3_0 - 0.0369825487012998*G0_1_0_3_1 - 0.0138068181818186*G0_1_0_3_2 - 0.452666396103912*G0_1_0_3_3 + 0.0399411525974037*G0_1_0_3_4 + 0.017751623376624*G0_1_0_3_5 + 0.004437905844156*G0_1_0_3_6 + 0.0355032467532481*G0_1_0_3_7 - 0.0976339285714319*G0_1_0_3_8 - 0.13313717532468*G0_1_0_3_9 - 0.00394480519480535*G0_1_0_4_0 + 0.0177516233766239*G0_1_0_4_1 + 0.0157792207792213*G0_1_0_4_2 + 0.0399411525974037*G0_1_0_4_3 - 0.106509740259744*G0_1_0_4_4 + 0.00443790584415603*G0_1_0_4_5 - 0.00887581168831206*G0_1_0_4_6 + 0.0355032467532481*G0_1_0_4_7 + 0.062130681818184*G0_1_0_4_8 + 0.106509740259744*G0_1_0_4_9 + 0.0305722402597414*G0_1_0_5_0 + 0.00493100649350666*G0_1_0_5_1 + 0.017751623376624*G0_1_0_5_3 + 0.00443790584415603*G0_1_0_5_4 + 0.053254870129872*G0_1_0_5_5 - 0.013313717532468*G0_1_0_5_6 - 0.02218952922078*G0_1_0_5_7 - 0.02218952922078*G0_1_0_5_8 - 0.0532548701298719*G0_1_0_5_9 - 0.0167654220779227*G0_1_0_6_0 - 0.00394480519480532*G0_1_0_6_1 + 0.00591720779220798*G0_1_0_6_2 + 0.004437905844156*G0_1_0_6_3 - 0.00887581168831205*G0_1_0_6_4 - 0.013313717532468*G0_1_0_6_5 + 0.04437905844156*G0_1_0_6_7 + 0.0443790584415599*G0_1_0_6_8 + 0.106509740259744*G0_1_0_6_9 + 0.0636099837662361*G0_1_0_7_0 + 0.0157792207792213*G0_1_0_7_1 - 0.0172585227272733*G0_1_0_7_2 + 0.0355032467532481*G0_1_0_7_3 + 0.0355032467532481*G0_1_0_7_4 - 0.02218952922078*G0_1_0_7_5 + 0.04437905844156*G0_1_0_7_6 - 0.328405032467545*G0_1_0_7_7 - 0.128699269480524*G0_1_0_7_8 - 0.186392045454552*G0_1_0_7_9 - 0.0029586038961041*G0_1_0_8_0 + 0.0320515422077934*G0_1_0_8_1 - 0.0231757305194813*G0_1_0_8_2 - 0.0976339285714319*G0_1_0_8_3 + 0.062130681818184*G0_1_0_8_4 - 0.02218952922078*G0_1_0_8_5 + 0.0443790584415599*G0_1_0_8_6 - 0.128699269480524*G0_1_0_8_7 - 0.328405032467544*G0_1_0_8_8 - 0.186392045454552*G0_1_0_8_9 + 0.032544642857144*G0_1_0_9_0 + 0.020710227272728*G0_1_0_9_1 - 0.038461850649352*G0_1_0_9_2 - 0.13313717532468*G0_1_0_9_3 + 0.106509740259744*G0_1_0_9_4 - 0.0532548701298719*G0_1_0_9_5 + 0.106509740259744*G0_1_0_9_6 - 0.186392045454552*G0_1_0_9_7 - 0.186392045454552*G0_1_0_9_8 - 0.319529220779232*G0_1_0_9_9 - 0.0138068181818187*G0_1_1_0_0 - 0.000493100649350649*G0_1_1_0_1 + 0.000657467532467552*G0_1_1_0_2 - 0.0172585227272734*G0_1_1_0_3 - 0.00542410714285734*G0_1_1_0_4 - 0.00147930194805201*G0_1_1_0_5 - 0.00788961038961072*G0_1_1_0_7 + 0.0216964285714294*G0_1_1_0_8 + 0.00591720779220796*G0_1_1_0_9 - 0.000493100649350649*G0_1_1_1_0 - 0.00986201298701301*G0_1_1_1_1 - 0.00443790584415598*G0_1_1_1_2 - 0.0345170454545465*G0_1_1_1_3 + 0.0216964285714292*G0_1_1_1_4 - 0.00838271103896134*G0_1_1_1_5 + 0.00345170454545468*G0_1_1_1_6 - 0.0177516233766241*G0_1_1_1_7 + 0.0443790584415602*G0_1_1_1_8 + 0.00591720779220796*G0_1_1_1_9 + 0.000657467532467552*G0_1_1_2_0 - 0.00443790584415598*G0_1_1_2_1 - 0.0046022727272729*G0_1_1_2_2 - 0.00887581168831195*G0_1_1_2_3 + 0.01479301948052*G0_1_1_2_4 - 0.0108482142857147*G0_1_1_2_5 + 0.00838271103896132*G0_1_1_2_6 - 0.0261343344155853*G0_1_1_2_7 + 0.00049310064935067*G0_1_1_2_8 - 0.023668831168832*G0_1_1_2_9 - 0.0172585227272734*G0_1_1_3_0 - 0.0345170454545465*G0_1_1_3_1 - 0.00887581168831195*G0_1_1_3_2 - 0.514797077922096*G0_1_1_3_3 + 0.0310653409090917*G0_1_1_3_4 + 0.035503246753248*G0_1_1_3_5 - 0.00443790584415599*G0_1_1_3_6 + 0.0576927759740282*G0_1_1_3_7 - 0.0621306818181841*G0_1_1_3_8 - 0.13313717532468*G0_1_1_3_9 - 0.00542410714285734*G0_1_1_4_0 + 0.0216964285714292*G0_1_1_4_1 + 0.01479301948052*G0_1_1_4_2 + 0.0310653409090917*G0_1_1_4_3 - 0.142012987012992*G0_1_1_4_4 + 0.02218952922078*G0_1_1_4_5 - 0.017751623376624*G0_1_1_4_6 + 0.04437905844156*G0_1_1_4_7 + 0.00443790584415599*G0_1_1_4_8 + 0.0266274350649361*G0_1_1_4_9 - 0.00147930194805201*G0_1_1_5_0 - 0.00838271103896134*G0_1_1_5_1 - 0.0108482142857147*G0_1_1_5_2 + 0.035503246753248*G0_1_1_5_3 + 0.02218952922078*G0_1_1_5_4 - 0.071006493506496*G0_1_1_5_5 + 0.035503246753248*G0_1_1_5_6 - 0.115385551948056*G0_1_1_5_7 + 0.031065340909092*G0_1_1_5_8 - 0.079882305194808*G0_1_1_5_9 + 0.00345170454545468*G0_1_1_6_1 + 0.00838271103896132*G0_1_1_6_2 - 0.00443790584415599*G0_1_1_6_3 - 0.017751623376624*G0_1_1_6_4 + 0.035503246753248*G0_1_1_6_5 - 0.017751623376624*G0_1_1_6_6 + 0.084320211038964*G0_1_1_6_7 - 0.00887581168831201*G0_1_1_6_8 + 0.079882305194808*G0_1_1_6_9 - 0.00788961038961072*G0_1_1_7_0 - 0.0177516233766241*G0_1_1_7_1 - 0.0261343344155853*G0_1_1_7_2 + 0.0576927759740282*G0_1_1_7_3 + 0.04437905844156*G0_1_1_7_4 - 0.115385551948056*G0_1_1_7_5 + 0.084320211038964*G0_1_1_7_6 - 0.461542207792225*G0_1_1_7_7 - 0.0221895292207799*G0_1_1_7_8 - 0.186392045454552*G0_1_1_7_9 + 0.0216964285714294*G0_1_1_8_0 + 0.0443790584415602*G0_1_1_8_1 + 0.00049310064935067*G0_1_1_8_2 - 0.0621306818181841*G0_1_1_8_3 + 0.00443790584415599*G0_1_1_8_4 + 0.031065340909092*G0_1_1_8_5 - 0.00887581168831201*G0_1_1_8_6 - 0.0221895292207799*G0_1_1_8_7 + 0.0177516233766241*G0_1_1_8_8 - 0.0266274350649359*G0_1_1_8_9 + 0.00591720779220795*G0_1_1_9_0 + 0.00591720779220796*G0_1_1_9_1 - 0.023668831168832*G0_1_1_9_2 - 0.13313717532468*G0_1_1_9_3 + 0.0266274350649361*G0_1_1_9_4 - 0.079882305194808*G0_1_1_9_5 + 0.079882305194808*G0_1_1_9_6 - 0.186392045454552*G0_1_1_9_7 - 0.0266274350649359*G0_1_1_9_8 - 0.319529220779232*G0_1_1_9_9; + A[39] = -A[89] - 0.0210389610389618*G0_0_0_0_0 + 0.00202719155844162*G0_0_0_0_1 - 0.00432832792207807*G0_0_0_0_2 - 0.0138068181818187*G0_0_0_0_3 - 0.013313717532468*G0_0_0_0_4 - 0.013313717532468*G0_0_0_0_5 + 0.00986201298701326*G0_0_0_0_6 - 0.00295860389610402*G0_0_0_0_7 - 0.000986201298701314*G0_0_0_0_8 - 0.032544642857144*G0_0_0_0_9 + 0.00202719155844163*G0_0_0_1_0 + 0.017532467532468*G0_0_0_1_1 + 0.00126014610389614*G0_0_0_1_2 + 0.0443790584415599*G0_0_0_1_3 - 0.0069034090909093*G0_0_0_1_4 - 0.0142999188311693*G0_0_0_1_5 - 0.010355113636364*G0_0_0_1_6 - 0.011834415584416*G0_0_0_1_7 + 0.0197240259740266*G0_0_0_1_8 + 0.0187378246753253*G0_0_0_1_9 - 0.00432832792207807*G0_0_0_2_0 + 0.00126014610389614*G0_0_0_2_1 - 0.0115056818181822*G0_0_0_2_2 + 0.008875811688312*G0_0_0_2_3 + 0.0123275162337667*G0_0_0_2_4 + 0.00493100649350663*G0_0_0_2_5 - 0.00739650974025999*G0_0_0_2_6 - 0.000986201298701338*G0_0_0_2_7 - 0.00197240259740265*G0_0_0_2_8 + 0.0108482142857146*G0_0_0_2_9 - 0.0138068181818187*G0_0_0_3_0 + 0.0443790584415599*G0_0_0_3_1 + 0.008875811688312*G0_0_0_3_2 - 0.186392045454552*G0_0_0_3_3 - 0.0488169642857161*G0_0_0_3_4 + 0.0414204545454559*G0_0_0_3_5 + 0.0325446428571439*G0_0_0_3_6 + 0.0428997564935079*G0_0_0_3_7 - 0.0502962662337679*G0_0_0_3_8 - 0.142012987012992*G0_0_0_3_9 - 0.013313717532468*G0_0_0_4_0 - 0.0069034090909093*G0_0_0_4_1 + 0.0123275162337667*G0_0_0_4_2 - 0.0488169642857161*G0_0_0_4_3 - 0.257398538961048*G0_0_0_4_4 + 0.041420454545456*G0_0_0_4_5 - 0.0739650974025999*G0_0_0_4_6 + 0.020710227272728*G0_0_0_4_7 + 0.00739650974025997*G0_0_0_4_8 - 0.115385551948056*G0_0_0_4_9 - 0.013313717532468*G0_0_0_5_0 - 0.0142999188311693*G0_0_0_5_1 + 0.00493100649350663*G0_0_0_5_2 + 0.0414204545454559*G0_0_0_5_3 + 0.041420454545456*G0_0_0_5_4 - 0.360949675324687*G0_0_0_5_5 + 0.025148133116884*G0_0_0_5_6 - 0.0488169642857159*G0_0_0_5_7 + 0.0443790584415599*G0_0_0_5_8 + 0.00887581168831187*G0_0_0_5_9 + 0.00986201298701326*G0_0_0_6_0 - 0.010355113636364*G0_0_0_6_1 - 0.00739650974025999*G0_0_0_6_2 + 0.0325446428571439*G0_0_0_6_3 - 0.0739650974025999*G0_0_0_6_4 + 0.025148133116884*G0_0_0_6_5 - 0.334322240259752*G0_0_0_6_6 + 0.00443790584415597*G0_0_0_6_7 + 0.0177516233766239*G0_0_0_6_8 - 0.0976339285714318*G0_0_0_6_9 - 0.00295860389610402*G0_0_0_7_0 - 0.011834415584416*G0_0_0_7_1 - 0.000986201298701338*G0_0_0_7_2 + 0.0428997564935079*G0_0_0_7_3 + 0.020710227272728*G0_0_0_7_4 - 0.0488169642857159*G0_0_0_7_5 + 0.00443790584415597*G0_0_0_7_6 - 0.00295860389610393*G0_0_0_7_7 + 0.019230925324676*G0_0_0_7_8 + 0.0887581168831198*G0_0_0_7_9 - 0.000986201298701313*G0_0_0_8_0 + 0.0197240259740266*G0_0_0_8_1 - 0.00197240259740265*G0_0_0_8_2 - 0.0502962662337679*G0_0_0_8_3 + 0.00739650974025997*G0_0_0_8_4 + 0.0443790584415599*G0_0_0_8_5 + 0.0177516233766239*G0_0_0_8_6 + 0.0192309253246759*G0_0_0_8_7 - 0.0384618506493519*G0_0_0_8_8 - 0.0710064935064958*G0_0_0_8_9 - 0.032544642857144*G0_0_0_9_0 + 0.0187378246753253*G0_0_0_9_1 + 0.0108482142857146*G0_0_0_9_2 - 0.142012987012992*G0_0_0_9_3 - 0.115385551948056*G0_0_0_9_4 + 0.00887581168831187*G0_0_0_9_5 - 0.0976339285714318*G0_0_0_9_6 + 0.0887581168831198*G0_0_0_9_7 - 0.0710064935064958*G0_0_0_9_8 - 0.319529220779231*G0_0_0_9_9 - 0.00953327922077963*G0_0_1_0_0 + 0.000767045454545466*G0_0_1_0_1 - 0.011834415584416*G0_0_1_0_3 - 0.0123275162337667*G0_0_1_0_4 - 0.00591720779220804*G0_0_1_0_5 + 0.00493100649350669*G0_0_1_0_6 - 0.0152861201298707*G0_0_1_0_7 - 0.0098620129870133*G0_0_1_0_8 - 0.0433928571428587*G0_0_1_0_9 + 0.000767045454545466*G0_0_1_1_0 - 0.000767045454545482*G0_0_1_1_2 + 0.0246550324675332*G0_0_1_1_3 + 0.0049310064935067*G0_0_1_1_4 - 0.00394480519480533*G0_0_1_1_5 + 0.00394480519480534*G0_0_1_1_6 - 0.0049310064935066*G0_0_1_1_7 - 0.0246550324675334*G0_0_1_1_8 - 0.000767045454545481*G0_0_1_2_1 + 0.00953327922077962*G0_0_1_2_2 + 0.00986201298701331*G0_0_1_2_3 + 0.0152861201298707*G0_0_1_2_4 - 0.00493100649350669*G0_0_1_2_5 + 0.00591720779220805*G0_0_1_2_6 + 0.0123275162337667*G0_0_1_2_7 + 0.011834415584416*G0_0_1_2_8 + 0.0433928571428586*G0_0_1_2_9 - 0.011834415584416*G0_0_1_3_0 + 0.0246550324675332*G0_0_1_3_1 + 0.0098620129870133*G0_0_1_3_2 - 0.1479301948052*G0_0_1_3_3 - 0.0680478896103921*G0_0_1_3_4 + 0.023668831168832*G0_0_1_3_5 - 0.011834415584416*G0_0_1_3_6 + 0.0355032467532479*G0_0_1_3_7 - 0.0710064935064961*G0_0_1_3_9 - 0.0123275162337667*G0_0_1_4_0 + 0.0049310064935067*G0_0_1_4_1 + 0.0152861201298707*G0_0_1_4_2 - 0.0680478896103921*G0_0_1_4_3 - 0.254439935064944*G0_0_1_4_4 + 0.0369825487012999*G0_0_1_4_5 - 0.0251481331168839*G0_0_1_4_6 - 0.035503246753248*G0_0_1_4_8 - 0.204143668831176*G0_0_1_4_9 - 0.00591720779220804*G0_0_1_5_0 - 0.00394480519480532*G0_0_1_5_1 - 0.0049310064935067*G0_0_1_5_2 + 0.023668831168832*G0_0_1_5_3 + 0.0369825487012999*G0_0_1_5_4 - 0.026627435064936*G0_0_1_5_5 + 0.025148133116884*G0_0_1_5_7 + 0.011834415584416*G0_0_1_5_8 + 0.106509740259744*G0_0_1_5_9 + 0.00493100649350669*G0_0_1_6_0 + 0.00394480519480534*G0_0_1_6_1 + 0.00591720779220805*G0_0_1_6_2 - 0.011834415584416*G0_0_1_6_3 - 0.0251481331168839*G0_0_1_6_4 + 0.0266274350649362*G0_0_1_6_6 - 0.0369825487013*G0_0_1_6_7 - 0.023668831168832*G0_0_1_6_8 - 0.106509740259744*G0_0_1_6_9 - 0.0152861201298707*G0_0_1_7_0 - 0.0049310064935066*G0_0_1_7_1 + 0.0123275162337667*G0_0_1_7_2 + 0.0355032467532479*G0_0_1_7_3 + 0.025148133116884*G0_0_1_7_5 - 0.0369825487013*G0_0_1_7_6 + 0.254439935064945*G0_0_1_7_7 + 0.068047889610392*G0_0_1_7_8 + 0.204143668831176*G0_0_1_7_9 - 0.0098620129870133*G0_0_1_8_0 - 0.0246550324675334*G0_0_1_8_1 + 0.011834415584416*G0_0_1_8_2 - 0.0355032467532479*G0_0_1_8_4 + 0.011834415584416*G0_0_1_8_5 - 0.023668831168832*G0_0_1_8_6 + 0.068047889610392*G0_0_1_8_7 + 0.1479301948052*G0_0_1_8_8 + 0.0710064935064959*G0_0_1_8_9 - 0.0433928571428587*G0_0_1_9_0 + 0.0433928571428586*G0_0_1_9_2 - 0.0710064935064961*G0_0_1_9_3 - 0.204143668831176*G0_0_1_9_4 + 0.106509740259744*G0_0_1_9_5 - 0.106509740259744*G0_0_1_9_6 + 0.204143668831176*G0_0_1_9_7 + 0.0710064935064959*G0_0_1_9_8; + A[87] = A[78] + 0.00164366883116894*G0_0_1_0_0 - 0.000493100649350655*G0_0_1_0_1 + 0.00136972402597407*G0_0_1_0_2 - 0.000246550324675334*G0_0_1_0_3 - 0.00172585227272733*G0_0_1_0_4 + 0.00616375811688335*G0_0_1_0_5 - 0.004437905844156*G0_0_1_0_6 + 0.0135602678571433*G0_0_1_0_7 + 0.00295860389610397*G0_0_1_0_8 + 0.0113413149350653*G0_0_1_0_9 - 0.000493100649350655*G0_0_1_1_0 + 0.00164366883116898*G0_0_1_1_1 + 0.00136972402597408*G0_0_1_1_2 + 0.00616375811688338*G0_0_1_1_3 - 0.00443790584415601*G0_0_1_1_4 - 0.000246550324675338*G0_0_1_1_5 - 0.00172585227272733*G0_0_1_1_6 + 0.00295860389610397*G0_0_1_1_7 + 0.0135602678571434*G0_0_1_1_8 + 0.0113413149350653*G0_0_1_1_9 + 0.00136972402597407*G0_0_1_2_0 + 0.00136972402597408*G0_0_1_2_1 - 0.00202719155844163*G0_0_1_2_2 - 0.00320515422077931*G0_0_1_2_3 + 0.00517755681818199*G0_0_1_2_4 - 0.00320515422077933*G0_0_1_2_5 + 0.00517755681818199*G0_0_1_2_6 - 0.0120809659090913*G0_0_1_2_7 - 0.0120809659090913*G0_0_1_2_8 - 0.0226826298701306*G0_0_1_2_9 - 0.000246550324675335*G0_0_1_3_0 + 0.00616375811688338*G0_0_1_3_1 - 0.00320515422077931*G0_0_1_3_2 + 0.00887581168831193*G0_0_1_3_4 + 0.00073965097402601*G0_0_1_3_5 + 0.00517755681818198*G0_0_1_3_6 + 0.000739650974026018*G0_0_1_3_7 - 0.0369825487012999*G0_0_1_3_8 - 0.0355032467532479*G0_0_1_3_9 - 0.00172585227272733*G0_0_1_4_0 - 0.00443790584415601*G0_0_1_4_1 + 0.00517755681818198*G0_0_1_4_2 + 0.00887581168831194*G0_0_1_4_3 - 0.00887581168831201*G0_0_1_4_4 + 0.005177556818182*G0_0_1_4_5 - 0.010355113636364*G0_0_1_4_6 + 0.020710227272728*G0_0_1_4_7 + 0.0362428977272739*G0_0_1_4_8 + 0.057692775974028*G0_0_1_4_9 + 0.00616375811688335*G0_0_1_5_0 - 0.000246550324675338*G0_0_1_5_1 - 0.00320515422077933*G0_0_1_5_2 + 0.00073965097402601*G0_0_1_5_3 + 0.005177556818182*G0_0_1_5_4 + 0.008875811688312*G0_0_1_5_6 - 0.0369825487013*G0_0_1_5_7 + 0.000739650974026018*G0_0_1_5_8 - 0.035503246753248*G0_0_1_5_9 - 0.004437905844156*G0_0_1_6_0 - 0.00172585227272733*G0_0_1_6_1 + 0.00517755681818199*G0_0_1_6_2 + 0.00517755681818198*G0_0_1_6_3 - 0.010355113636364*G0_0_1_6_4 + 0.00887581168831199*G0_0_1_6_5 - 0.00887581168831204*G0_0_1_6_6 + 0.036242897727274*G0_0_1_6_7 + 0.0207102272727279*G0_0_1_6_8 + 0.0576927759740279*G0_0_1_6_9 + 0.0135602678571433*G0_0_1_7_0 + 0.00295860389610397*G0_0_1_7_1 - 0.0120809659090913*G0_0_1_7_2 + 0.000739650974026018*G0_0_1_7_3 + 0.020710227272728*G0_0_1_7_4 - 0.0369825487013*G0_0_1_7_5 + 0.036242897727274*G0_0_1_7_6 - 0.2218952922078*G0_0_1_7_7 - 0.02218952922078*G0_0_1_7_8 - 0.106509740259744*G0_0_1_7_9 + 0.00295860389610397*G0_0_1_8_0 + 0.0135602678571434*G0_0_1_8_1 - 0.0120809659090913*G0_0_1_8_2 - 0.0369825487012999*G0_0_1_8_3 + 0.0362428977272739*G0_0_1_8_4 + 0.000739650974026018*G0_0_1_8_5 + 0.0207102272727279*G0_0_1_8_6 - 0.02218952922078*G0_0_1_8_7 - 0.2218952922078*G0_0_1_8_8 - 0.106509740259744*G0_0_1_8_9 + 0.0113413149350653*G0_0_1_9_0 + 0.0113413149350653*G0_0_1_9_1 - 0.0226826298701306*G0_0_1_9_2 - 0.0355032467532479*G0_0_1_9_3 + 0.057692775974028*G0_0_1_9_4 - 0.035503246753248*G0_0_1_9_5 + 0.0576927759740279*G0_0_1_9_6 - 0.106509740259744*G0_0_1_9_7 - 0.106509740259744*G0_0_1_9_8 - 0.319529220779232*G0_0_1_9_9 - 0.00164366883116894*G0_1_0_0_0 + 0.000493100649350655*G0_1_0_0_1 - 0.00136972402597407*G0_1_0_0_2 + 0.000246550324675334*G0_1_0_0_3 + 0.00172585227272733*G0_1_0_0_4 - 0.00616375811688335*G0_1_0_0_5 + 0.004437905844156*G0_1_0_0_6 - 0.0135602678571433*G0_1_0_0_7 - 0.00295860389610397*G0_1_0_0_8 - 0.0113413149350653*G0_1_0_0_9 + 0.000493100649350655*G0_1_0_1_0 - 0.00164366883116898*G0_1_0_1_1 - 0.00136972402597408*G0_1_0_1_2 - 0.00616375811688338*G0_1_0_1_3 + 0.00443790584415601*G0_1_0_1_4 + 0.000246550324675338*G0_1_0_1_5 + 0.00172585227272733*G0_1_0_1_6 - 0.00295860389610397*G0_1_0_1_7 - 0.0135602678571434*G0_1_0_1_8 - 0.0113413149350653*G0_1_0_1_9 - 0.00136972402597407*G0_1_0_2_0 - 0.00136972402597408*G0_1_0_2_1 + 0.00202719155844163*G0_1_0_2_2 + 0.00320515422077931*G0_1_0_2_3 - 0.00517755681818199*G0_1_0_2_4 + 0.00320515422077933*G0_1_0_2_5 - 0.00517755681818199*G0_1_0_2_6 + 0.0120809659090913*G0_1_0_2_7 + 0.0120809659090913*G0_1_0_2_8 + 0.0226826298701306*G0_1_0_2_9 + 0.000246550324675335*G0_1_0_3_0 - 0.00616375811688338*G0_1_0_3_1 + 0.00320515422077931*G0_1_0_3_2 - 0.00887581168831193*G0_1_0_3_4 - 0.000739650974026009*G0_1_0_3_5 - 0.00517755681818198*G0_1_0_3_6 - 0.000739650974026018*G0_1_0_3_7 + 0.0369825487012999*G0_1_0_3_8 + 0.0355032467532479*G0_1_0_3_9 + 0.00172585227272733*G0_1_0_4_0 + 0.00443790584415601*G0_1_0_4_1 - 0.00517755681818198*G0_1_0_4_2 - 0.00887581168831194*G0_1_0_4_3 + 0.00887581168831201*G0_1_0_4_4 - 0.005177556818182*G0_1_0_4_5 + 0.010355113636364*G0_1_0_4_6 - 0.020710227272728*G0_1_0_4_7 - 0.0362428977272739*G0_1_0_4_8 - 0.057692775974028*G0_1_0_4_9 - 0.00616375811688335*G0_1_0_5_0 + 0.000246550324675338*G0_1_0_5_1 + 0.00320515422077933*G0_1_0_5_2 - 0.000739650974026009*G0_1_0_5_3 - 0.005177556818182*G0_1_0_5_4 - 0.00887581168831199*G0_1_0_5_6 + 0.0369825487013*G0_1_0_5_7 - 0.000739650974026018*G0_1_0_5_8 + 0.035503246753248*G0_1_0_5_9 + 0.004437905844156*G0_1_0_6_0 + 0.00172585227272733*G0_1_0_6_1 - 0.00517755681818199*G0_1_0_6_2 - 0.00517755681818198*G0_1_0_6_3 + 0.010355113636364*G0_1_0_6_4 - 0.00887581168831199*G0_1_0_6_5 + 0.00887581168831204*G0_1_0_6_6 - 0.036242897727274*G0_1_0_6_7 - 0.0207102272727279*G0_1_0_6_8 - 0.0576927759740279*G0_1_0_6_9 - 0.0135602678571433*G0_1_0_7_0 - 0.00295860389610397*G0_1_0_7_1 + 0.0120809659090913*G0_1_0_7_2 - 0.000739650974026018*G0_1_0_7_3 - 0.020710227272728*G0_1_0_7_4 + 0.0369825487013*G0_1_0_7_5 - 0.036242897727274*G0_1_0_7_6 + 0.2218952922078*G0_1_0_7_7 + 0.02218952922078*G0_1_0_7_8 + 0.106509740259744*G0_1_0_7_9 - 0.00295860389610397*G0_1_0_8_0 - 0.0135602678571434*G0_1_0_8_1 + 0.0120809659090913*G0_1_0_8_2 + 0.0369825487012999*G0_1_0_8_3 - 0.0362428977272739*G0_1_0_8_4 - 0.000739650974026018*G0_1_0_8_5 - 0.0207102272727279*G0_1_0_8_6 + 0.02218952922078*G0_1_0_8_7 + 0.2218952922078*G0_1_0_8_8 + 0.106509740259744*G0_1_0_8_9 - 0.0113413149350653*G0_1_0_9_0 - 0.0113413149350653*G0_1_0_9_1 + 0.0226826298701306*G0_1_0_9_2 + 0.0355032467532479*G0_1_0_9_3 - 0.057692775974028*G0_1_0_9_4 + 0.035503246753248*G0_1_0_9_5 - 0.0576927759740279*G0_1_0_9_6 + 0.106509740259744*G0_1_0_9_7 + 0.106509740259744*G0_1_0_9_8 + 0.319529220779232*G0_1_0_9_9; + A[42] = A[72] - 0.0153348214285719*G0_0_1_0_0 + 0.00766741071428602*G0_0_1_0_2 - 0.0047575081168833*G0_0_1_0_3 + 0.0113504464285719*G0_0_1_0_4 - 0.0124918831168836*G0_0_1_0_5 + 0.0187652191558449*G0_0_1_0_6 - 0.0120535714285718*G0_0_1_0_7 + 0.0030955762987014*G0_0_1_0_8 + 0.00372564935064949*G0_0_1_0_9 - 0.00584415584415603*G0_0_1_1_1 + 0.00778612012987042*G0_0_1_1_2 - 0.00875710227272758*G0_0_1_1_3 + 0.0157061688311694*G0_0_1_1_4 - 0.005195819805195*G0_0_1_1_5 + 0.011925730519481*G0_0_1_1_6 - 0.00151582792207797*G0_0_1_1_7 - 0.00384435876623391*G0_0_1_1_8 + 0.00443790584415601*G0_0_1_1_9 + 0.00766741071428602*G0_0_1_2_0 + 0.00778612012987042*G0_0_1_2_1 + 0.124736201298706*G0_0_1_2_2 - 0.0360146103896116*G0_0_1_2_3 + 0.0785765016233794*G0_0_1_2_4 - 0.0375669642857156*G0_0_1_2_5 + 0.0830509334415614*G0_0_1_2_6 - 0.00223721590909099*G0_0_1_2_7 - 0.00122362012987017*G0_0_1_2_8 + 0.0149573863636369*G0_0_1_2_9 - 0.0047575081168833*G0_0_1_3_0 - 0.00875710227272758*G0_0_1_3_1 - 0.0360146103896116*G0_0_1_3_2 + 0.0407629870129884*G0_0_1_3_3 - 0.0652536525974049*G0_0_1_3_4 + 0.020710227272728*G0_0_1_3_5 - 0.047337662337664*G0_0_1_3_6 + 0.00271205357142867*G0_0_1_3_7 + 0.00517755681818198*G0_0_1_3_8 - 0.0187378246753253*G0_0_1_3_9 + 0.0113504464285719*G0_0_1_4_0 + 0.0157061688311694*G0_0_1_4_1 + 0.0785765016233794*G0_0_1_4_2 - 0.0652536525974049*G0_0_1_4_3 + 0.167982954545461*G0_0_1_4_4 - 0.0456118100649367*G0_0_1_4_5 + 0.0929494724026007*G0_0_1_4_6 - 0.00788961038961066*G0_0_1_4_7 - 0.00788961038961065*G0_0_1_4_8 + 0.0463514610389627*G0_0_1_4_9 - 0.0124918831168836*G0_0_1_5_0 - 0.005195819805195*G0_0_1_5_1 - 0.0375669642857156*G0_0_1_5_2 + 0.020710227272728*G0_0_1_5_3 - 0.0456118100649367*G0_0_1_5_4 + 0.0420779220779236*G0_0_1_5_5 - 0.0710886769480545*G0_0_1_5_6 + 0.000821834415584448*G0_0_1_5_7 + 0.00402698863636377*G0_0_1_5_8 - 0.019230925324676*G0_0_1_5_9 + 0.0187652191558449*G0_0_1_6_0 + 0.011925730519481*G0_0_1_6_1 + 0.0830509334415614*G0_0_1_6_2 - 0.047337662337664*G0_0_1_6_3 + 0.0929494724026007*G0_0_1_6_4 - 0.0710886769480545*G0_0_1_6_5 + 0.193459821428578*G0_0_1_6_6 - 0.00484882305194822*G0_0_1_6_7 - 0.0102729301948055*G0_0_1_6_8 + 0.0498031655844173*G0_0_1_6_9 - 0.0120535714285718*G0_0_1_7_0 - 0.00151582792207797*G0_0_1_7_1 - 0.00223721590909099*G0_0_1_7_2 + 0.00271205357142867*G0_0_1_7_3 - 0.00788961038961066*G0_0_1_7_4 + 0.000821834415584448*G0_0_1_7_5 - 0.00484882305194822*G0_0_1_7_6 - 0.00131493506493512*G0_0_1_7_7 + 0.0127384334415589*G0_0_1_7_8 - 0.001479301948052*G0_0_1_7_9 + 0.0030955762987014*G0_0_1_8_0 - 0.00384435876623391*G0_0_1_8_1 - 0.00122362012987017*G0_0_1_8_2 + 0.00517755681818198*G0_0_1_8_3 - 0.00788961038961065*G0_0_1_8_4 + 0.00402698863636377*G0_0_1_8_5 - 0.0102729301948055*G0_0_1_8_6 + 0.0127384334415589*G0_0_1_8_7 + 0.0228469967532475*G0_0_1_8_8 + 0.00246550324675331*G0_0_1_8_9 + 0.00372564935064949*G0_0_1_9_0 + 0.00443790584415601*G0_0_1_9_1 + 0.0149573863636369*G0_0_1_9_2 - 0.0187378246753253*G0_0_1_9_3 + 0.0463514610389627*G0_0_1_9_4 - 0.019230925324676*G0_0_1_9_5 + 0.0498031655844173*G0_0_1_9_6 - 0.001479301948052*G0_0_1_9_7 + 0.00246550324675331*G0_0_1_9_8 - 0.00394480519480534*G0_0_1_9_9 + 0.00254464285714294*G0_1_1_0_0 + 0.00127232142857148*G0_1_1_0_2 - 0.00359780844155857*G0_1_1_0_3 + 0.00483969155844175*G0_1_1_0_4 + 0.000620941558441566*G0_1_1_0_5 + 0.002976866883117*G0_1_1_0_6 + 0.00463879870129886*G0_1_1_0_7 - 0.00505884740259758*G0_1_1_0_8 + 0.00241071428571438*G0_1_1_0_9 - 0.0164366883116888*G0_1_1_1_1 + 0.00103490259740264*G0_1_1_1_2 - 0.00684862012987036*G0_1_1_1_3 + 0.00909496753246786*G0_1_1_1_4 - 0.00272118506493516*G0_1_1_1_5 + 0.00368912337662351*G0_1_1_1_6 + 0.00416396103896119*G0_1_1_1_7 - 0.011779626623377*G0_1_1_1_8 + 0.000986201298701332*G0_1_1_1_9 + 0.00127232142857148*G0_1_1_2_0 + 0.00103490259740264*G0_1_1_2_1 + 0.0130275974025979*G0_1_1_2_2 - 0.00818181818181847*G0_1_1_2_3 + 0.019267451298702*G0_1_1_2_4 - 0.00507711038961057*G0_1_1_2_5 + 0.010318587662338*G0_1_1_2_6 + 0.00089488636363639*G0_1_1_2_7 - 0.00113230519480523*G0_1_1_2_8 + 0.0033969155844157*G0_1_1_2_9 - 0.00359780844155857*G0_1_1_3_0 - 0.00684862012987036*G0_1_1_3_1 - 0.00818181818181847*G0_1_1_3_2 - 0.026627435064936*G0_1_1_3_4 + 0.0111769480519484*G0_1_1_3_5 - 0.0144642857142862*G0_1_1_3_6 + 0.00739650974025998*G0_1_1_3_7 - 0.00739650974025999*G0_1_1_3_8 - 0.017751623376624*G0_1_1_3_9 + 0.00483969155844175*G0_1_1_4_0 + 0.00909496753246786*G0_1_1_4_1 + 0.019267451298702*G0_1_1_4_2 - 0.026627435064936*G0_1_1_4_3 + 0.0867857142857175*G0_1_1_4_4 - 0.0179159902597409*G0_1_1_4_5 + 0.0323802759740271*G0_1_1_4_6 - 0.00690340909090933*G0_1_1_4_7 + 0.0256412337662347*G0_1_1_4_9 + 0.000620941558441566*G0_1_1_5_0 - 0.00272118506493516*G0_1_1_5_1 - 0.00507711038961057*G0_1_1_5_2 + 0.0111769480519484*G0_1_1_5_3 - 0.0179159902597409*G0_1_1_5_4 - 0.0026298701298702*G0_1_1_5_5 - 0.0149573863636369*G0_1_1_5_6 + 0.0013149350649351*G0_1_1_5_7 + 0.00476663961038977*G0_1_1_5_8 - 0.0167654220779227*G0_1_1_5_9 + 0.002976866883117*G0_1_1_6_0 + 0.00368912337662351*G0_1_1_6_1 + 0.010318587662338*G0_1_1_6_2 - 0.0144642857142862*G0_1_1_6_3 + 0.0323802759740271*G0_1_1_6_4 - 0.0149573863636369*G0_1_1_6_5 + 0.0358319805194817*G0_1_1_6_6 - 0.00608157467532487*G0_1_1_6_7 - 0.00213676948051955*G0_1_1_6_8 + 0.0187378246753253*G0_1_1_6_9 + 0.00463879870129886*G0_1_1_7_0 + 0.00416396103896119*G0_1_1_7_1 + 0.00089488636363639*G0_1_1_7_2 + 0.00739650974025998*G0_1_1_7_3 - 0.00690340909090933*G0_1_1_7_4 + 0.0013149350649351*G0_1_1_7_5 - 0.00608157467532487*G0_1_1_7_6 + 0.0335308441558453*G0_1_1_7_7 + 0.010355113636364*G0_1_1_7_8 + 0.00493100649350665*G0_1_1_7_9 - 0.00505884740259758*G0_1_1_8_0 - 0.011779626623377*G0_1_1_8_1 - 0.00113230519480523*G0_1_1_8_2 - 0.00739650974025999*G0_1_1_8_3 + 0.00476663961038977*G0_1_1_8_5 - 0.00213676948051955*G0_1_1_8_6 + 0.010355113636364*G0_1_1_8_7 - 0.01479301948052*G0_1_1_8_8 - 0.00295860389610399*G0_1_1_8_9 + 0.00241071428571438*G0_1_1_9_0 + 0.000986201298701331*G0_1_1_9_1 + 0.0033969155844157*G0_1_1_9_2 - 0.017751623376624*G0_1_1_9_3 + 0.0256412337662347*G0_1_1_9_4 - 0.0167654220779227*G0_1_1_9_5 + 0.0187378246753253*G0_1_1_9_6 + 0.00493100649350665*G0_1_1_9_7 - 0.00295860389610399*G0_1_1_9_8 - 0.0788961038961066*G0_1_1_9_9; + A[62] = -A[42] - 0.0107021103896108*G0_1_1_0_0 - 0.00155235389610395*G0_1_1_0_1 - 0.00522017045454566*G0_1_1_0_2 - 0.00133319805194809*G0_1_1_0_3 - 0.00168932629870137*G0_1_1_0_4 + 0.000374391233766255*G0_1_1_0_5 - 0.00214590097402607*G0_1_1_0_6 - 0.00590807629870151*G0_1_1_0_7 + 0.00154322240259745*G0_1_1_0_8 - 0.000821834415584455*G0_1_1_0_9 - 0.00155235389610395*G0_1_1_1_0 - 0.0107021103896108*G0_1_1_1_1 - 0.00522017045454565*G0_1_1_1_2 + 0.000374391233766252*G0_1_1_1_3 - 0.00214590097402606*G0_1_1_1_4 - 0.00133319805194809*G0_1_1_1_5 - 0.00168932629870137*G0_1_1_1_6 + 0.00154322240259746*G0_1_1_1_7 - 0.00590807629870151*G0_1_1_1_8 - 0.000821834415584454*G0_1_1_1_9 - 0.00522017045454566*G0_1_1_2_0 - 0.00522017045454565*G0_1_1_2_1 - 0.0932021103896135*G0_1_1_2_2 + 0.0208198051948059*G0_1_1_2_3 - 0.0452008928571444*G0_1_1_2_4 + 0.020819805194806*G0_1_1_2_5 - 0.0452008928571445*G0_1_1_2_6 - 0.000593547077922097*G0_1_1_2_7 - 0.000593547077922095*G0_1_1_2_8 - 0.00712256493506518*G0_1_1_2_9 - 0.00133319805194809*G0_1_1_3_0 + 0.000374391233766252*G0_1_1_3_1 + 0.0208198051948059*G0_1_1_3_2 - 0.0368181818181831*G0_1_1_3_3 + 0.0201349431818189*G0_1_1_3_4 + 0.00180803571428576*G0_1_1_3_5 + 0.00945109577922113*G0_1_1_3_6 + 0.00838271103896134*G0_1_1_3_7 - 0.0145464691558446*G0_1_1_3_8 - 0.0142999188311693*G0_1_1_3_9 - 0.00168932629870137*G0_1_1_4_0 - 0.00214590097402606*G0_1_1_4_1 - 0.0452008928571444*G0_1_1_4_2 + 0.0201349431818189*G0_1_1_4_3 - 0.0378043831168844*G0_1_1_4_4 + 0.00945109577922114*G0_1_1_4_5 - 0.0189021915584423*G0_1_1_4_6 + 0.00123275162337667*G0_1_1_4_7 + 0.00616375811688331*G0_1_1_4_8 + 0.00246550324675333*G0_1_1_4_9 + 0.000374391233766255*G0_1_1_5_0 - 0.00133319805194809*G0_1_1_5_1 + 0.020819805194806*G0_1_1_5_2 + 0.00180803571428576*G0_1_1_5_3 + 0.00945109577922114*G0_1_1_5_4 - 0.0368181818181831*G0_1_1_5_5 + 0.020134943181819*G0_1_1_5_6 - 0.0145464691558446*G0_1_1_5_7 + 0.00838271103896132*G0_1_1_5_8 - 0.0142999188311693*G0_1_1_5_9 - 0.00214590097402608*G0_1_1_6_0 - 0.00168932629870137*G0_1_1_6_1 - 0.0452008928571445*G0_1_1_6_2 + 0.00945109577922113*G0_1_1_6_3 - 0.0189021915584423*G0_1_1_6_4 + 0.020134943181819*G0_1_1_6_5 - 0.0378043831168846*G0_1_1_6_6 + 0.00616375811688332*G0_1_1_6_7 + 0.00123275162337666*G0_1_1_6_8 + 0.00246550324675331*G0_1_1_6_9 - 0.00590807629870151*G0_1_1_7_0 + 0.00154322240259746*G0_1_1_7_1 - 0.000593547077922097*G0_1_1_7_2 + 0.00838271103896133*G0_1_1_7_3 + 0.00123275162337667*G0_1_1_7_4 - 0.0145464691558446*G0_1_1_7_5 + 0.00616375811688332*G0_1_1_7_6 - 0.0613088474025995*G0_1_1_7_7 + 0.0146286525974031*G0_1_1_7_8 - 0.00986201298701334*G0_1_1_7_9 + 0.00154322240259745*G0_1_1_8_0 - 0.00590807629870151*G0_1_1_8_1 - 0.000593547077922095*G0_1_1_8_2 - 0.0145464691558446*G0_1_1_8_3 + 0.00616375811688331*G0_1_1_8_4 + 0.00838271103896132*G0_1_1_8_5 + 0.00123275162337666*G0_1_1_8_6 + 0.0146286525974031*G0_1_1_8_7 - 0.0613088474025995*G0_1_1_8_8 - 0.00986201298701329*G0_1_1_8_9 - 0.000821834415584455*G0_1_1_9_0 - 0.000821834415584454*G0_1_1_9_1 - 0.00712256493506518*G0_1_1_9_2 - 0.0142999188311693*G0_1_1_9_3 + 0.00246550324675334*G0_1_1_9_4 - 0.0142999188311693*G0_1_1_9_5 + 0.00246550324675331*G0_1_1_9_6 - 0.00986201298701334*G0_1_1_9_7 - 0.00986201298701329*G0_1_1_9_8 - 0.104537337662341*G0_1_1_9_9; + A[65] = -A[45] + 0.00611810064935089*G0_1_0_0_0 + 0.00166193181818187*G0_1_0_0_1 - 0.00325994318181831*G0_1_0_0_2 + 0.000410917207792255*G0_1_0_0_3 + 0.000410917207792211*G0_1_0_0_4 + 0.0190665584415591*G0_1_0_0_5 + 0.000575284090909051*G0_1_0_0_6 + 0.0101085633116887*G0_1_0_0_7 - 0.00714995941558466*G0_1_0_0_8 + 0.0172585227272733*G0_1_0_0_9 + 0.00166193181818187*G0_1_0_1_0 - 0.00341517857142864*G0_1_0_1_1 - 0.00249289772727282*G0_1_0_1_2 + 0.00378043831168846*G0_1_0_1_3 - 0.00928672889610423*G0_1_0_1_4 - 0.0119165990259744*G0_1_0_1_5 - 0.0114234983766238*G0_1_0_1_6 - 0.00221895292207801*G0_1_0_1_7 + 0.00419135551948069*G0_1_0_1_8 - 0.0261343344155853*G0_1_0_1_9 - 0.00325994318181831*G0_1_0_2_0 - 0.00249289772727282*G0_1_0_2_1 - 0.0717735389610414*G0_1_0_2_2 + 0.0123275162337667*G0_1_0_2_3 - 0.0394480519480533*G0_1_0_2_4 + 0.0172585227272733*G0_1_0_2_5 - 0.0147930194805201*G0_1_0_2_6 + 0.00238331980519489*G0_1_0_2_7 - 0.00156148538961044*G0_1_0_2_8 + 0.00493100649350663*G0_1_0_2_9 + 0.000410917207792255*G0_1_0_3_0 + 0.00378043831168846*G0_1_0_3_1 + 0.0123275162337667*G0_1_0_3_2 + 0.0325446428571442*G0_1_0_3_3 + 0.045118709415586*G0_1_0_3_4 + 0.0162723214285719*G0_1_0_3_5 + 0.0362428977272739*G0_1_0_3_6 + 0.000739650974025961*G0_1_0_3_7 - 0.00739650974025994*G0_1_0_3_8 + 0.0769237012987039*G0_1_0_3_9 + 0.000410917207792212*G0_1_0_4_0 - 0.00928672889610423*G0_1_0_4_1 - 0.0394480519480533*G0_1_0_4_2 + 0.045118709415586*G0_1_0_4_3 + 0.000739650974026059*G0_1_0_4_5 - 0.0369825487013*G0_1_0_4_6 - 0.005177556818182*G0_1_0_4_7 + 0.00665685876623397*G0_1_0_4_8 - 0.0162723214285719*G0_1_0_4_9 + 0.0190665584415591*G0_1_0_5_0 - 0.0119165990259744*G0_1_0_5_1 + 0.0172585227272733*G0_1_0_5_2 + 0.0162723214285719*G0_1_0_5_3 + 0.000739650974026056*G0_1_0_5_4 - 0.221895292207799*G0_1_0_5_5 - 0.0229291801948059*G0_1_0_5_6 - 0.0325446428571439*G0_1_0_5_7 + 0.0377221996753259*G0_1_0_5_8 - 0.127219967532472*G0_1_0_5_9 + 0.000575284090909052*G0_1_0_6_0 - 0.0114234983766238*G0_1_0_6_1 - 0.0147930194805201*G0_1_0_6_2 + 0.0362428977272739*G0_1_0_6_3 - 0.0369825487013*G0_1_0_6_4 - 0.0229291801948059*G0_1_0_6_5 - 0.1479301948052*G0_1_0_6_6 - 0.00517755681818204*G0_1_0_6_7 + 0.01849127435065*G0_1_0_6_8 - 0.0872788149350679*G0_1_0_6_9 + 0.0101085633116887*G0_1_0_7_0 - 0.00221895292207801*G0_1_0_7_1 + 0.00238331980519489*G0_1_0_7_2 + 0.000739650974025962*G0_1_0_7_3 - 0.005177556818182*G0_1_0_7_4 - 0.0325446428571439*G0_1_0_7_5 - 0.00517755681818204*G0_1_0_7_6 + 0.0207102272727281*G0_1_0_7_7 + 0.00739650974025995*G0_1_0_7_8 - 0.041420454545456*G0_1_0_7_9 - 0.00714995941558466*G0_1_0_8_0 + 0.00419135551948069*G0_1_0_8_1 - 0.00156148538961044*G0_1_0_8_2 - 0.00739650974025994*G0_1_0_8_3 + 0.00665685876623397*G0_1_0_8_4 + 0.0377221996753259*G0_1_0_8_5 + 0.01849127435065*G0_1_0_8_6 + 0.00739650974025995*G0_1_0_8_7 - 0.00591720779220789*G0_1_0_8_8 + 0.065089285714288*G0_1_0_8_9 + 0.0172585227272733*G0_1_0_9_0 - 0.0261343344155853*G0_1_0_9_1 + 0.00493100649350663*G0_1_0_9_2 + 0.0769237012987039*G0_1_0_9_3 - 0.0162723214285719*G0_1_0_9_4 - 0.127219967532472*G0_1_0_9_5 - 0.0872788149350679*G0_1_0_9_6 - 0.041420454545456*G0_1_0_9_7 + 0.065089285714288*G0_1_0_9_8 - 0.408287337662352*G0_1_0_9_9 - 0.0864752435064966*G0_1_1_0_0 - 0.00539671266233786*G0_1_1_0_1 - 0.00699472402597428*G0_1_1_0_2 + 0.00189021915584427*G0_1_1_0_3 + 0.000410917207792222*G0_1_1_0_4 - 0.0216142451298709*G0_1_1_0_5 + 0.0178338068181824*G0_1_1_0_6 - 0.0626237824675347*G0_1_1_0_7 + 0.027367086038962*G0_1_1_0_8 - 0.00539671266233786*G0_1_1_1_0 - 0.00178977272727278*G0_1_1_1_1 - 0.00259334415584426*G0_1_1_1_2 + 0.00525974025974044*G0_1_1_1_3 - 0.00977982954545489*G0_1_1_1_4 - 0.00920454545454576*G0_1_1_1_5 - 0.00945109577922112*G0_1_1_1_6 - 0.0142177353896109*G0_1_1_1_7 + 0.0126562500000005*G0_1_1_1_8 - 0.0197240259740267*G0_1_1_1_9 - 0.00699472402597428*G0_1_1_2_0 - 0.00259334415584425*G0_1_1_2_1 - 0.0690340909090933*G0_1_1_2_2 + 0.0116700487012991*G0_1_1_2_3 - 0.0361607142857156*G0_1_1_2_4 + 0.0124918831168836*G0_1_1_2_5 - 0.0106838474025979*G0_1_1_2_6 - 0.0072321428571431*G0_1_1_2_7 + 0.000657467532467564*G0_1_1_2_8 + 0.00542410714285729*G0_1_1_2_9 + 0.00189021915584427*G0_1_1_3_0 + 0.00525974025974044*G0_1_1_3_1 + 0.0116700487012991*G0_1_1_3_2 + 0.0236688311688321*G0_1_1_3_3 + 0.04437905844156*G0_1_1_3_4 + 0.00739650974025994*G0_1_1_3_5 + 0.0355032467532479*G0_1_1_3_6 + 0.00147930194805203*G0_1_1_3_7 - 0.00665685876623397*G0_1_1_3_8 + 0.0562134740259759*G0_1_1_3_9 + 0.000410917207792222*G0_1_1_4_0 - 0.00977982954545489*G0_1_1_4_1 - 0.0361607142857156*G0_1_1_4_2 + 0.04437905844156*G0_1_1_4_3 - 0.0103551136363638*G0_1_1_4_4 + 0.00591720779220803*G0_1_1_4_5 - 0.0414204545454559*G0_1_1_4_6 + 0.006656858766234*G0_1_1_4_7 + 0.00517755681818197*G0_1_1_4_8 - 0.0281067370129878*G0_1_1_4_9 - 0.0216142451298709*G0_1_1_5_0 - 0.00920454545454576*G0_1_1_5_1 + 0.0124918831168836*G0_1_1_5_2 + 0.00739650974025994*G0_1_1_5_3 + 0.00591720779220803*G0_1_1_5_4 - 0.124261363636368*G0_1_1_5_5 - 0.00739650974025989*G0_1_1_5_6 - 0.0636099837662359*G0_1_1_5_7 + 0.034763595779222*G0_1_1_5_8 - 0.0695271915584439*G0_1_1_5_9 + 0.0178338068181824*G0_1_1_6_0 - 0.00945109577922112*G0_1_1_6_1 - 0.0106838474025979*G0_1_1_6_2 + 0.0355032467532479*G0_1_1_6_3 - 0.0414204545454559*G0_1_1_6_4 - 0.00739650974025989*G0_1_1_6_5 - 0.143492288961044*G0_1_1_6_6 + 0.028846387987014*G0_1_1_6_7 + 0.00961546266233796*G0_1_1_6_8 - 0.0872788149350678*G0_1_1_6_9 - 0.0626237824675347*G0_1_1_7_0 - 0.0142177353896109*G0_1_1_7_1 - 0.0072321428571431*G0_1_1_7_2 + 0.00147930194805203*G0_1_1_7_3 + 0.006656858766234*G0_1_1_7_4 - 0.0636099837662359*G0_1_1_7_5 + 0.028846387987014*G0_1_1_7_6 - 0.23668831168832*G0_1_1_7_7 + 0.0525152191558461*G0_1_1_7_8 - 0.0576927759740281*G0_1_1_7_9 + 0.027367086038962*G0_1_1_8_0 + 0.0126562500000005*G0_1_1_8_1 + 0.000657467532467564*G0_1_1_8_2 - 0.00665685876623398*G0_1_1_8_3 + 0.00517755681818197*G0_1_1_8_4 + 0.034763595779222*G0_1_1_8_5 + 0.00961546266233795*G0_1_1_8_6 + 0.0525152191558461*G0_1_1_8_7 - 0.02218952922078*G0_1_1_8_8 + 0.048816964285716*G0_1_1_8_9 - 0.0197240259740267*G0_1_1_9_1 + 0.00542410714285729*G0_1_1_9_2 + 0.0562134740259759*G0_1_1_9_3 - 0.0281067370129878*G0_1_1_9_4 - 0.0695271915584439*G0_1_1_9_5 - 0.0872788149350678*G0_1_1_9_6 - 0.0576927759740281*G0_1_1_9_7 + 0.048816964285716*G0_1_1_9_8 - 0.390535714285727*G0_1_1_9_9; + A[6] = -A[4] + 0.0525974025974045*G0_0_1_0_0 + 0.00393567370129884*G0_0_1_0_1 + 0.00307426948051959*G0_0_1_0_2 - 0.00170758928571436*G0_0_1_0_3 - 0.000858360389610423*G0_0_1_0_4 + 0.0196783685064942*G0_0_1_0_5 - 0.0100994318181822*G0_0_1_0_6 + 0.0389458198051962*G0_0_1_0_7 - 0.0165827922077928*G0_0_1_0_8 + 0.00476663961038981*G0_0_1_0_9 + 0.00393567370129884*G0_0_1_1_0 + 0.00787134740259767*G0_0_1_1_1 + 0.00106534090909095*G0_0_1_1_2 + 0.00241984577922085*G0_0_1_1_3 + 0.00124188311688316*G0_0_1_1_4 + 0.000757913961038991*G0_0_1_1_5 + 0.00111404220779225*G0_0_1_1_6 + 0.00544237012987032*G0_0_1_1_7 - 0.000173498376623372*G0_0_1_1_8 + 0.00378043831168845*G0_0_1_1_9 + 0.00307426948051959*G0_0_1_2_0 + 0.00106534090909095*G0_0_1_2_1 + 0.0154017857142863*G0_0_1_2_2 - 0.00249289772727282*G0_0_1_2_3 + 0.0090401785714289*G0_0_1_2_4 - 0.00167106331168838*G0_0_1_2_5 + 0.00246550324675336*G0_0_1_2_6 + 0.00346996753246765*G0_0_1_2_7 - 0.00146103896103901*G0_0_1_2_8 - 0.000767045454545472*G0_0_1_2_9 - 0.00170758928571436*G0_0_1_3_0 + 0.00241984577922085*G0_0_1_3_1 - 0.00249289772727282*G0_0_1_3_2 - 0.0238331980519489*G0_0_1_3_3 - 0.0134780844155849*G0_0_1_3_4 + 0.00336952110389621*G0_0_1_3_5 - 0.0072321428571431*G0_0_1_3_6 + 0.00123275162337664*G0_0_1_3_7 - 0.00172585227272732*G0_0_1_3_8 - 0.0138068181818186*G0_0_1_3_9 - 0.000858360389610423*G0_0_1_4_0 + 0.00124188311688316*G0_0_1_4_1 + 0.0090401785714289*G0_0_1_4_2 - 0.0134780844155849*G0_0_1_4_3 - 0.00361607142857159*G0_0_1_4_4 - 0.00131493506493512*G0_0_1_4_5 + 0.00854707792207822*G0_0_1_4_6 - 0.00197240259740267*G0_0_1_4_7 + 0.000493100649350667*G0_0_1_4_8 + 0.00493100649350664*G0_0_1_4_9 + 0.0196783685064942*G0_0_1_5_0 + 0.000757913961038991*G0_0_1_5_1 - 0.00167106331168838*G0_0_1_5_2 + 0.00336952110389621*G0_0_1_5_3 - 0.00131493506493512*G0_0_1_5_4 - 0.0134780844155848*G0_0_1_5_5 - 0.00460227272727292*G0_0_1_5_6 + 0.0204636769480527*G0_0_1_5_7 - 0.00616375811688335*G0_0_1_5_8 - 0.00197240259740265*G0_0_1_5_9 - 0.0100994318181822*G0_0_1_6_0 + 0.00111404220779225*G0_0_1_6_1 + 0.00246550324675336*G0_0_1_6_2 - 0.0072321428571431*G0_0_1_6_3 + 0.00854707792207822*G0_0_1_6_4 - 0.00460227272727292*G0_0_1_6_5 + 0.0259699675324684*G0_0_1_6_6 - 0.0142999188311693*G0_0_1_6_7 + 0.00246550324675334*G0_0_1_6_8 + 0.0167654220779226*G0_0_1_6_9 + 0.0389458198051962*G0_0_1_7_0 + 0.00544237012987032*G0_0_1_7_1 + 0.00346996753246765*G0_0_1_7_2 + 0.00123275162337664*G0_0_1_7_3 - 0.00197240259740267*G0_0_1_7_4 + 0.0204636769480527*G0_0_1_7_5 - 0.0142999188311693*G0_0_1_7_6 + 0.10568790584416*G0_0_1_7_7 - 0.0316406250000012*G0_0_1_7_8 + 0.0142999188311694*G0_0_1_7_9 - 0.0165827922077928*G0_0_1_8_0 - 0.000173498376623372*G0_0_1_8_1 - 0.00146103896103901*G0_0_1_8_2 - 0.00172585227272732*G0_0_1_8_3 + 0.000493100649350667*G0_0_1_8_4 - 0.00616375811688335*G0_0_1_8_5 + 0.00246550324675334*G0_0_1_8_6 - 0.0316406250000012*G0_0_1_8_7 - 0.0082183441558444*G0_0_1_8_8 - 0.0123275162337667*G0_0_1_8_9 + 0.00476663961038981*G0_0_1_9_0 + 0.00378043831168845*G0_0_1_9_1 - 0.000767045454545472*G0_0_1_9_2 - 0.0138068181818186*G0_0_1_9_3 + 0.00493100649350664*G0_0_1_9_4 - 0.00197240259740265*G0_0_1_9_5 + 0.0167654220779226*G0_0_1_9_6 + 0.0142999188311694*G0_0_1_9_7 - 0.0123275162337667*G0_0_1_9_8 + 0.0867857142857172*G0_0_1_9_9 + 0.0525974025974045*G0_1_1_0_0 + 0.00393567370129885*G0_1_1_0_1 + 0.00307426948051959*G0_1_1_0_2 - 0.00170758928571436*G0_1_1_0_3 - 0.000858360389610424*G0_1_1_0_4 + 0.0196783685064942*G0_1_1_0_5 - 0.0100994318181822*G0_1_1_0_6 + 0.0389458198051962*G0_1_1_0_7 - 0.0165827922077928*G0_1_1_0_8 + 0.00476663961038981*G0_1_1_0_9 + 0.00393567370129885*G0_1_1_1_0 + 0.00787134740259767*G0_1_1_1_1 + 0.00106534090909095*G0_1_1_1_2 + 0.00241984577922085*G0_1_1_1_3 + 0.00124188311688317*G0_1_1_1_4 + 0.000757913961038992*G0_1_1_1_5 + 0.00111404220779225*G0_1_1_1_6 + 0.00544237012987032*G0_1_1_1_7 - 0.000173498376623375*G0_1_1_1_8 + 0.00378043831168845*G0_1_1_1_9 + 0.00307426948051959*G0_1_1_2_0 + 0.00106534090909095*G0_1_1_2_1 + 0.0154017857142863*G0_1_1_2_2 - 0.00249289772727282*G0_1_1_2_3 + 0.0090401785714289*G0_1_1_2_4 - 0.00167106331168838*G0_1_1_2_5 + 0.00246550324675336*G0_1_1_2_6 + 0.00346996753246765*G0_1_1_2_7 - 0.00146103896103901*G0_1_1_2_8 - 0.000767045454545471*G0_1_1_2_9 - 0.00170758928571436*G0_1_1_3_0 + 0.00241984577922085*G0_1_1_3_1 - 0.00249289772727282*G0_1_1_3_2 - 0.0238331980519489*G0_1_1_3_3 - 0.0134780844155849*G0_1_1_3_4 + 0.00336952110389621*G0_1_1_3_5 - 0.0072321428571431*G0_1_1_3_6 + 0.00123275162337664*G0_1_1_3_7 - 0.00172585227272732*G0_1_1_3_8 - 0.0138068181818187*G0_1_1_3_9 - 0.000858360389610424*G0_1_1_4_0 + 0.00124188311688317*G0_1_1_4_1 + 0.0090401785714289*G0_1_1_4_2 - 0.0134780844155849*G0_1_1_4_3 - 0.00361607142857161*G0_1_1_4_4 - 0.00131493506493511*G0_1_1_4_5 + 0.00854707792207822*G0_1_1_4_6 - 0.00197240259740267*G0_1_1_4_7 + 0.000493100649350664*G0_1_1_4_8 + 0.00493100649350663*G0_1_1_4_9 + 0.0196783685064942*G0_1_1_5_0 + 0.000757913961038992*G0_1_1_5_1 - 0.00167106331168838*G0_1_1_5_2 + 0.00336952110389621*G0_1_1_5_3 - 0.00131493506493512*G0_1_1_5_4 - 0.0134780844155848*G0_1_1_5_5 - 0.00460227272727292*G0_1_1_5_6 + 0.0204636769480527*G0_1_1_5_7 - 0.00616375811688335*G0_1_1_5_8 - 0.00197240259740264*G0_1_1_5_9 - 0.0100994318181822*G0_1_1_6_0 + 0.00111404220779225*G0_1_1_6_1 + 0.00246550324675336*G0_1_1_6_2 - 0.0072321428571431*G0_1_1_6_3 + 0.00854707792207822*G0_1_1_6_4 - 0.00460227272727292*G0_1_1_6_5 + 0.0259699675324684*G0_1_1_6_6 - 0.0142999188311693*G0_1_1_6_7 + 0.00246550324675334*G0_1_1_6_8 + 0.0167654220779226*G0_1_1_6_9 + 0.0389458198051962*G0_1_1_7_0 + 0.00544237012987032*G0_1_1_7_1 + 0.00346996753246765*G0_1_1_7_2 + 0.00123275162337664*G0_1_1_7_3 - 0.00197240259740267*G0_1_1_7_4 + 0.0204636769480527*G0_1_1_7_5 - 0.0142999188311693*G0_1_1_7_6 + 0.10568790584416*G0_1_1_7_7 - 0.0316406250000012*G0_1_1_7_8 + 0.0142999188311694*G0_1_1_7_9 - 0.0165827922077928*G0_1_1_8_0 - 0.000173498376623375*G0_1_1_8_1 - 0.00146103896103901*G0_1_1_8_2 - 0.00172585227272732*G0_1_1_8_3 + 0.000493100649350664*G0_1_1_8_4 - 0.00616375811688335*G0_1_1_8_5 + 0.00246550324675334*G0_1_1_8_6 - 0.0316406250000012*G0_1_1_8_7 - 0.00821834415584437*G0_1_1_8_8 - 0.0123275162337667*G0_1_1_8_9 + 0.00476663961038981*G0_1_1_9_0 + 0.00378043831168845*G0_1_1_9_1 - 0.000767045454545471*G0_1_1_9_2 - 0.0138068181818187*G0_1_1_9_3 + 0.00493100649350663*G0_1_1_9_4 - 0.00197240259740264*G0_1_1_9_5 + 0.0167654220779226*G0_1_1_9_6 + 0.0142999188311694*G0_1_1_9_7 - 0.0123275162337667*G0_1_1_9_8 + 0.0867857142857172*G0_1_1_9_9; + A[17] = -A[14] + 0.0180560064935071*G0_0_0_0_0 + 0.00281554383116894*G0_0_0_0_1 + 0.00271814123376634*G0_0_0_0_2 + 0.00176237824675332*G0_0_0_0_3 - 0.00125101461038966*G0_0_0_0_4 + 0.0116517857142861*G0_0_0_0_5 - 0.00341517857142866*G0_0_0_0_6 + 0.00462053571428585*G0_0_0_0_7 - 0.00315949675324685*G0_0_0_0_8 - 0.00098620129870132*G0_0_0_0_9 + 0.00281554383116894*G0_0_0_1_0 + 0.047118506493508*G0_0_0_1_1 + 0.0037956574675326*G0_0_0_1_2 + 0.0306818181818192*G0_0_0_1_3 - 0.0130945616883121*G0_0_0_1_4 + 0.000721387987013005*G0_0_0_1_5 + 0.000885754870129908*G0_0_0_1_6 - 0.00816355519480549*G0_0_0_1_7 + 0.0158887987012993*G0_0_0_1_8 + 0.0037256493506495*G0_0_0_1_9 + 0.00271814123376634*G0_0_0_2_0 + 0.0037956574675326*G0_0_0_2_1 + 0.0200162337662345*G0_0_0_2_2 + 0.000894886363636376*G0_0_0_2_3 + 0.00571631493506517*G0_0_0_2_4 - 0.00429180194805212*G0_0_0_2_5 + 0.0132406655844161*G0_0_0_2_6 + 0.000885754870129897*G0_0_0_2_7 - 0.000374391233766242*G0_0_0_2_8 + 0.00427353896103911*G0_0_0_2_9 + 0.00176237824675332*G0_0_0_3_0 + 0.0306818181818192*G0_0_0_3_1 + 0.000894886363636376*G0_0_0_3_2 + 0.0726501623376649*G0_0_0_3_3 - 0.0222717126623384*G0_0_0_3_4 - 0.00197240259740265*G0_0_0_3_5 - 0.00616375811688334*G0_0_0_3_6 - 0.00879362824675359*G0_0_0_3_7 + 0.0111769480519485*G0_0_0_3_8 + 0.00641030844155871*G0_0_0_3_9 - 0.00125101461038966*G0_0_0_4_0 - 0.0130945616883121*G0_0_0_4_1 + 0.00571631493506517*G0_0_0_4_2 - 0.0222717126623384*G0_0_0_4_3 - 0.0161079545454551*G0_0_0_4_4 + 0.000246550324675315*G0_0_0_4_5 + 0.00591720779220802*G0_0_0_4_6 + 0.00230113636363645*G0_0_0_4_7 - 0.00238331980519491*G0_0_0_4_8 - 0.013313717532468*G0_0_0_4_9 + 0.0116517857142861*G0_0_0_5_0 + 0.000721387987013005*G0_0_0_5_1 - 0.00429180194805212*G0_0_0_5_2 - 0.00197240259740265*G0_0_0_5_3 + 0.000246550324675315*G0_0_0_5_4 + 0.0535836038961057*G0_0_0_5_5 - 0.0201349431818189*G0_0_0_5_6 + 0.011834415584416*G0_0_0_5_7 - 0.00567065746753266*G0_0_0_5_8 + 0.0142999188311693*G0_0_0_5_9 - 0.00341517857142866*G0_0_0_6_0 + 0.000885754870129908*G0_0_0_6_1 + 0.0132406655844161*G0_0_0_6_2 - 0.00616375811688334*G0_0_0_6_3 + 0.00591720779220803*G0_0_0_6_4 - 0.0201349431818189*G0_0_0_6_5 + 0.0575284090909111*G0_0_0_6_6 - 0.00616375811688332*G0_0_0_6_7 + 0.000986201298701333*G0_0_0_6_8 - 0.000493100649350669*G0_0_0_6_9 + 0.00462053571428585*G0_0_0_7_0 - 0.00816355519480549*G0_0_0_7_1 + 0.000885754870129897*G0_0_0_7_2 - 0.00879362824675359*G0_0_0_7_3 + 0.00230113636363645*G0_0_0_7_4 + 0.011834415584416*G0_0_0_7_5 - 0.00616375811688332*G0_0_0_7_6 + 0.0193952922077929*G0_0_0_7_7 - 0.00106838474025981*G0_0_0_7_8 + 0.0152861201298707*G0_0_0_7_9 - 0.00315949675324685*G0_0_0_8_0 + 0.0158887987012993*G0_0_0_8_1 - 0.000374391233766242*G0_0_0_8_2 + 0.0111769480519485*G0_0_0_8_3 - 0.00238331980519491*G0_0_0_8_4 - 0.00567065746753266*G0_0_0_8_5 + 0.000986201298701334*G0_0_0_8_6 - 0.00106838474025981*G0_0_0_8_7 - 0.0210389610389617*G0_0_0_8_8 - 0.00641030844155865*G0_0_0_8_9 - 0.00098620129870132*G0_0_0_9_0 + 0.0037256493506495*G0_0_0_9_1 + 0.00427353896103911*G0_0_0_9_2 + 0.00641030844155871*G0_0_0_9_3 - 0.013313717532468*G0_0_0_9_4 + 0.0142999188311693*G0_0_0_9_5 - 0.000493100649350669*G0_0_0_9_6 + 0.0152861201298707*G0_0_0_9_7 - 0.00641030844155865*G0_0_0_9_8 + 0.0374756493506506*G0_0_0_9_9 - 0.00196022727272735*G0_0_1_0_0 - 0.000980113636363676*G0_0_1_0_1 + 0.00213676948051957*G0_0_1_0_3 - 0.00213676948051956*G0_0_1_0_4 - 0.00158887987012993*G0_0_1_0_5 + 0.00087662337662341*G0_0_1_0_6 - 0.00109577922077926*G0_0_1_0_7 - 0.00405438311688326*G0_0_1_0_8 - 0.00525974025974044*G0_0_1_0_9 - 0.000980113636363675*G0_0_1_1_0 + 0.00098011363636367*G0_0_1_1_2 + 0.01479301948052*G0_0_1_1_3 - 0.00493100649350665*G0_0_1_1_4 - 0.000164366883116888*G0_0_1_1_5 + 0.000164366883116886*G0_0_1_1_6 + 0.00493100649350668*G0_0_1_1_7 - 0.01479301948052*G0_0_1_1_8 + 0.00098011363636367*G0_0_1_2_1 + 0.00196022727272736*G0_0_1_2_2 + 0.00405438311688325*G0_0_1_2_3 + 0.00109577922077927*G0_0_1_2_4 - 0.000876623376623415*G0_0_1_2_5 + 0.00158887987012994*G0_0_1_2_6 + 0.00213676948051955*G0_0_1_2_7 - 0.00213676948051955*G0_0_1_2_8 + 0.00525974025974044*G0_0_1_2_9 + 0.00213676948051957*G0_0_1_3_0 + 0.01479301948052*G0_0_1_3_1 + 0.00405438311688325*G0_0_1_3_2 + 0.0936891233766268*G0_0_1_3_3 - 0.0212033279220787*G0_0_1_3_4 - 0.002958603896104*G0_0_1_3_5 - 0.000493100649350686*G0_0_1_3_6 - 0.00641030844155872*G0_0_1_3_7 + 0.0128206168831174*G0_0_1_3_9 - 0.00213676948051956*G0_0_1_4_0 - 0.00493100649350665*G0_0_1_4_1 + 0.00109577922077927*G0_0_1_4_2 - 0.0212033279220787*G0_0_1_4_3 - 0.035503246753248*G0_0_1_4_4 + 0.00641030844155866*G0_0_1_4_5 - 0.00591720779220798*G0_0_1_4_6 + 0.00641030844155863*G0_0_1_4_8 - 0.0285998376623386*G0_0_1_4_9 - 0.00158887987012993*G0_0_1_5_0 - 0.000164366883116888*G0_0_1_5_1 - 0.000876623376623415*G0_0_1_5_2 - 0.002958603896104*G0_0_1_5_3 + 0.00641030844155866*G0_0_1_5_4 - 0.00394480519480533*G0_0_1_5_5 + 0.005917207792208*G0_0_1_5_7 + 0.000493100649350662*G0_0_1_5_8 + 0.01479301948052*G0_0_1_5_9 + 0.00087662337662341*G0_0_1_6_0 + 0.000164366883116886*G0_0_1_6_1 + 0.00158887987012994*G0_0_1_6_2 - 0.000493100649350686*G0_0_1_6_3 - 0.00591720779220798*G0_0_1_6_4 + 0.00394480519480537*G0_0_1_6_6 - 0.00641030844155866*G0_0_1_6_7 + 0.00295860389610399*G0_0_1_6_8 - 0.01479301948052*G0_0_1_6_9 - 0.00109577922077926*G0_0_1_7_0 + 0.00493100649350669*G0_0_1_7_1 + 0.00213676948051955*G0_0_1_7_2 - 0.00641030844155872*G0_0_1_7_3 + 0.005917207792208*G0_0_1_7_5 - 0.00641030844155866*G0_0_1_7_6 + 0.0355032467532481*G0_0_1_7_7 + 0.0212033279220786*G0_0_1_7_8 + 0.0285998376623386*G0_0_1_7_9 - 0.00405438311688326*G0_0_1_8_0 - 0.01479301948052*G0_0_1_8_1 - 0.00213676948051955*G0_0_1_8_2 + 0.00641030844155863*G0_0_1_8_4 + 0.000493100649350662*G0_0_1_8_5 + 0.00295860389610398*G0_0_1_8_6 + 0.0212033279220786*G0_0_1_8_7 - 0.0936891233766266*G0_0_1_8_8 - 0.0128206168831173*G0_0_1_8_9 - 0.00525974025974044*G0_0_1_9_0 + 0.00525974025974044*G0_0_1_9_2 + 0.0128206168831174*G0_0_1_9_3 - 0.0285998376623386*G0_0_1_9_4 + 0.01479301948052*G0_0_1_9_5 - 0.01479301948052*G0_0_1_9_6 + 0.0285998376623386*G0_0_1_9_7 - 0.0128206168831173*G0_0_1_9_8; + A[9] = A[90] - 0.000980113636363679*G0_0_1_0_1 + 0.00098011363636367*G0_0_1_0_2 - 0.000164366883116885*G0_0_1_0_3 + 0.000164366883116888*G0_0_1_0_4 + 0.0147930194805199*G0_0_1_0_5 - 0.00493100649350665*G0_0_1_0_6 - 0.0147930194805201*G0_0_1_0_7 + 0.0049310064935067*G0_0_1_0_8 - 0.000980113636363679*G0_0_1_1_0 - 0.00196022727272735*G0_0_1_1_1 - 0.00158887987012993*G0_0_1_1_3 + 0.00087662337662341*G0_0_1_1_4 + 0.00213676948051954*G0_0_1_1_5 - 0.00213676948051956*G0_0_1_1_6 - 0.00405438311688326*G0_0_1_1_7 - 0.00109577922077926*G0_0_1_1_8 - 0.00525974025974044*G0_0_1_1_9 + 0.00098011363636367*G0_0_1_2_0 + 0.00196022727272736*G0_0_1_2_2 - 0.000876623376623413*G0_0_1_2_3 + 0.00158887987012994*G0_0_1_2_4 + 0.00405438311688324*G0_0_1_2_5 + 0.00109577922077927*G0_0_1_2_6 - 0.00213676948051956*G0_0_1_2_7 + 0.00213676948051955*G0_0_1_2_8 + 0.00525974025974044*G0_0_1_2_9 - 0.000164366883116885*G0_0_1_3_0 - 0.00158887987012992*G0_0_1_3_1 - 0.000876623376623412*G0_0_1_3_2 - 0.00394480519480533*G0_0_1_3_3 - 0.00295860389610398*G0_0_1_3_5 + 0.00641030844155865*G0_0_1_3_6 + 0.000493100649350697*G0_0_1_3_7 + 0.00591720779220796*G0_0_1_3_8 + 0.01479301948052*G0_0_1_3_9 + 0.000164366883116888*G0_0_1_4_0 + 0.00087662337662341*G0_0_1_4_1 + 0.00158887987012994*G0_0_1_4_2 + 0.00394480519480536*G0_0_1_4_4 - 0.000493100649350677*G0_0_1_4_5 - 0.00591720779220798*G0_0_1_4_6 + 0.002958603896104*G0_0_1_4_7 - 0.00641030844155865*G0_0_1_4_8 - 0.01479301948052*G0_0_1_4_9 + 0.0147930194805199*G0_0_1_5_0 + 0.00213676948051954*G0_0_1_5_1 + 0.00405438311688324*G0_0_1_5_2 - 0.00295860389610398*G0_0_1_5_3 - 0.000493100649350675*G0_0_1_5_4 + 0.0936891233766265*G0_0_1_5_5 - 0.0212033279220786*G0_0_1_5_6 - 0.00641030844155863*G0_0_1_5_8 + 0.0128206168831173*G0_0_1_5_9 - 0.00493100649350665*G0_0_1_6_0 - 0.00213676948051956*G0_0_1_6_1 + 0.00109577922077927*G0_0_1_6_2 + 0.00641030844155865*G0_0_1_6_3 - 0.00591720779220798*G0_0_1_6_4 - 0.0212033279220786*G0_0_1_6_5 - 0.035503246753248*G0_0_1_6_6 + 0.00641030844155866*G0_0_1_6_7 - 0.0285998376623386*G0_0_1_6_9 - 0.0147930194805201*G0_0_1_7_0 - 0.00405438311688326*G0_0_1_7_1 - 0.00213676948051956*G0_0_1_7_2 + 0.000493100649350697*G0_0_1_7_3 + 0.002958603896104*G0_0_1_7_4 + 0.00641030844155866*G0_0_1_7_6 - 0.0936891233766269*G0_0_1_7_7 + 0.0212033279220787*G0_0_1_7_8 - 0.0128206168831174*G0_0_1_7_9 + 0.0049310064935067*G0_0_1_8_0 - 0.00109577922077926*G0_0_1_8_1 + 0.00213676948051955*G0_0_1_8_2 + 0.00591720779220797*G0_0_1_8_3 - 0.00641030844155865*G0_0_1_8_4 - 0.00641030844155864*G0_0_1_8_5 + 0.0212033279220787*G0_0_1_8_7 + 0.035503246753248*G0_0_1_8_8 + 0.0285998376623386*G0_0_1_8_9 - 0.00525974025974045*G0_0_1_9_1 + 0.00525974025974044*G0_0_1_9_2 + 0.01479301948052*G0_0_1_9_3 - 0.01479301948052*G0_0_1_9_4 + 0.0128206168831173*G0_0_1_9_5 - 0.0285998376623386*G0_0_1_9_6 - 0.0128206168831174*G0_0_1_9_7 + 0.0285998376623386*G0_0_1_9_8 + 0.000980113636363679*G0_1_0_0_1 - 0.00098011363636367*G0_1_0_0_2 + 0.000164366883116884*G0_1_0_0_3 - 0.000164366883116889*G0_1_0_0_4 - 0.01479301948052*G0_1_0_0_5 + 0.00493100649350665*G0_1_0_0_6 + 0.0147930194805201*G0_1_0_0_7 - 0.0049310064935067*G0_1_0_0_8 + 0.000980113636363679*G0_1_0_1_0 + 0.00196022727272735*G0_1_0_1_1 + 0.00158887987012993*G0_1_0_1_3 - 0.00087662337662341*G0_1_0_1_4 - 0.00213676948051954*G0_1_0_1_5 + 0.00213676948051956*G0_1_0_1_6 + 0.00405438311688326*G0_1_0_1_7 + 0.00109577922077926*G0_1_0_1_8 + 0.00525974025974045*G0_1_0_1_9 - 0.00098011363636367*G0_1_0_2_0 - 0.00196022727272736*G0_1_0_2_2 + 0.000876623376623413*G0_1_0_2_3 - 0.00158887987012994*G0_1_0_2_4 - 0.00405438311688324*G0_1_0_2_5 - 0.00109577922077927*G0_1_0_2_6 + 0.00213676948051956*G0_1_0_2_7 - 0.00213676948051955*G0_1_0_2_8 - 0.00525974025974043*G0_1_0_2_9 + 0.000164366883116884*G0_1_0_3_0 + 0.00158887987012993*G0_1_0_3_1 + 0.000876623376623413*G0_1_0_3_2 + 0.00394480519480536*G0_1_0_3_3 + 0.00295860389610398*G0_1_0_3_5 - 0.00641030844155865*G0_1_0_3_6 - 0.000493100649350699*G0_1_0_3_7 - 0.00591720779220796*G0_1_0_3_8 - 0.01479301948052*G0_1_0_3_9 - 0.000164366883116889*G0_1_0_4_0 - 0.00087662337662341*G0_1_0_4_1 - 0.00158887987012994*G0_1_0_4_2 - 0.00394480519480536*G0_1_0_4_4 + 0.000493100649350676*G0_1_0_4_5 + 0.00591720779220798*G0_1_0_4_6 - 0.002958603896104*G0_1_0_4_7 + 0.00641030844155865*G0_1_0_4_8 + 0.01479301948052*G0_1_0_4_9 - 0.01479301948052*G0_1_0_5_0 - 0.00213676948051954*G0_1_0_5_1 - 0.00405438311688324*G0_1_0_5_2 + 0.00295860389610398*G0_1_0_5_3 + 0.000493100649350675*G0_1_0_5_4 - 0.0936891233766265*G0_1_0_5_5 + 0.0212033279220786*G0_1_0_5_6 + 0.00641030844155863*G0_1_0_5_8 - 0.0128206168831173*G0_1_0_5_9 + 0.00493100649350665*G0_1_0_6_0 + 0.00213676948051956*G0_1_0_6_1 - 0.00109577922077927*G0_1_0_6_2 - 0.00641030844155865*G0_1_0_6_3 + 0.00591720779220798*G0_1_0_6_4 + 0.0212033279220786*G0_1_0_6_5 + 0.035503246753248*G0_1_0_6_6 - 0.00641030844155866*G0_1_0_6_7 + 0.0285998376623386*G0_1_0_6_9 + 0.0147930194805201*G0_1_0_7_0 + 0.00405438311688326*G0_1_0_7_1 + 0.00213676948051956*G0_1_0_7_2 - 0.000493100649350699*G0_1_0_7_3 - 0.002958603896104*G0_1_0_7_4 - 0.00641030844155866*G0_1_0_7_6 + 0.0936891233766269*G0_1_0_7_7 - 0.0212033279220787*G0_1_0_7_8 + 0.0128206168831174*G0_1_0_7_9 - 0.0049310064935067*G0_1_0_8_0 + 0.00109577922077926*G0_1_0_8_1 - 0.00213676948051955*G0_1_0_8_2 - 0.00591720779220796*G0_1_0_8_3 + 0.00641030844155865*G0_1_0_8_4 + 0.00641030844155864*G0_1_0_8_5 - 0.0212033279220787*G0_1_0_8_7 - 0.035503246753248*G0_1_0_8_8 - 0.0285998376623386*G0_1_0_8_9 + 0.00525974025974045*G0_1_0_9_1 - 0.00525974025974044*G0_1_0_9_2 - 0.01479301948052*G0_1_0_9_3 + 0.01479301948052*G0_1_0_9_4 - 0.0128206168831173*G0_1_0_9_5 + 0.0285998376623386*G0_1_0_9_6 + 0.0128206168831174*G0_1_0_9_7 - 0.0285998376623386*G0_1_0_9_8; + A[34] = -A[37] - 0.00527800324675349*G0_0_0_0_0 - 0.000237418831168845*G0_0_0_0_1 - 0.00738737824675353*G0_0_0_0_2 + 0.00714995941558471*G0_0_0_0_3 + 0.002218952922078*G0_0_0_0_4 - 0.00213676948051958*G0_0_0_0_5 - 0.00682122564935092*G0_0_0_0_6 - 0.00123275162337671*G0_0_0_0_7 + 0.00123275162337669*G0_0_0_0_8 + 0.00345170454545466*G0_0_0_0_9 - 0.000237418831168845*G0_0_0_1_0 + 0.0109577922077926*G0_0_0_1_1 - 0.00211850649350658*G0_0_0_1_2 + 0.0179159902597409*G0_0_0_1_3 - 0.0161079545454551*G0_0_0_1_4 + 0.000493100649350677*G0_0_0_1_5 - 0.00936891233766269*G0_0_0_1_6 - 0.00262987012987023*G0_0_0_1_7 + 0.00920454545454578*G0_0_0_1_8 + 0.00394480519480532*G0_0_0_1_9 - 0.00738737824675353*G0_0_0_2_0 - 0.00211850649350658*G0_0_0_2_1 - 0.0917715097402629*G0_0_0_2_2 + 0.0187378246753253*G0_0_0_2_3 - 0.0468445616883134*G0_0_0_2_4 + 0.0290929383116894*G0_0_0_2_5 - 0.0641030844155867*G0_0_0_2_6 + 0.000493100649350659*G0_0_0_2_7 - 0.00221895292207798*G0_0_0_2_8 - 0.020710227272728*G0_0_0_2_9 + 0.00714995941558471*G0_0_0_3_0 + 0.0179159902597409*G0_0_0_3_1 + 0.0187378246753253*G0_0_0_3_2 + 0.156806006493512*G0_0_0_3_3 + 0.0281067370129881*G0_0_0_3_4 - 0.01479301948052*G0_0_0_3_5 + 0.034763595779222*G0_0_0_3_6 - 0.0147930194805201*G0_0_0_3_7 + 0.00147930194805213*G0_0_0_3_8 + 0.0177516233766242*G0_0_0_3_9 + 0.002218952922078*G0_0_0_4_0 - 0.0161079545454551*G0_0_0_4_1 - 0.0468445616883134*G0_0_0_4_2 + 0.0281067370129881*G0_0_0_4_3 + 0.116864853896108*G0_0_0_4_4 - 0.034763595779222*G0_0_0_4_6 - 0.00739650974025998*G0_0_0_4_7 + 0.0133137175324679*G0_0_0_4_8 + 0.0621306818181839*G0_0_0_4_9 - 0.00213676948051958*G0_0_0_5_0 + 0.000493100649350677*G0_0_0_5_1 + 0.0290929383116894*G0_0_0_5_2 - 0.01479301948052*G0_0_0_5_3 - 0.075444399350652*G0_0_0_5_5 + 0.0525152191558461*G0_0_0_5_6 - 0.010355113636364*G0_0_0_5_7 + 0.005177556818182*G0_0_0_5_8 - 0.020710227272728*G0_0_0_5_9 - 0.00682122564935092*G0_0_0_6_0 - 0.00936891233766269*G0_0_0_6_1 - 0.0641030844155867*G0_0_0_6_2 + 0.034763595779222*G0_0_0_6_3 - 0.034763595779222*G0_0_0_6_4 + 0.0525152191558461*G0_0_0_6_5 - 0.210060876623384*G0_0_0_6_6 + 0.005177556818182*G0_0_0_6_7 + 0.0140533685064939*G0_0_0_6_8 - 0.00739650974026001*G0_0_0_6_9 - 0.00123275162337671*G0_0_0_7_0 - 0.00262987012987023*G0_0_0_7_1 + 0.000493100649350659*G0_0_0_7_2 - 0.0147930194805201*G0_0_0_7_3 - 0.00739650974025998*G0_0_0_7_4 - 0.010355113636364*G0_0_0_7_5 + 0.005177556818182*G0_0_0_7_6 - 0.013313717532468*G0_0_0_7_7 + 0.00147930194805197*G0_0_0_7_8 - 0.020710227272728*G0_0_0_7_9 + 0.00123275162337669*G0_0_0_8_0 + 0.00920454545454578*G0_0_0_8_1 - 0.00221895292207798*G0_0_0_8_2 + 0.00147930194805213*G0_0_0_8_3 + 0.0133137175324679*G0_0_0_8_4 + 0.005177556818182*G0_0_0_8_5 + 0.0140533685064939*G0_0_0_8_6 + 0.00147930194805197*G0_0_0_8_7 - 0.0414204545454559*G0_0_0_8_8 - 0.0384618506493519*G0_0_0_8_9 + 0.00345170454545466*G0_0_0_9_0 + 0.00394480519480532*G0_0_0_9_1 - 0.020710227272728*G0_0_0_9_2 + 0.0177516233766242*G0_0_0_9_3 + 0.0621306818181839*G0_0_0_9_4 - 0.020710227272728*G0_0_0_9_5 - 0.00739650974026*G0_0_0_9_6 - 0.020710227272728*G0_0_0_9_7 - 0.0384618506493519*G0_0_0_9_8 - 0.142012987012992*G0_0_0_9_9 + 0.00252029220779231*G0_0_1_0_0 - 0.00131493506493511*G0_0_1_0_1 - 0.00169845779220786*G0_0_1_0_2 + 0.0187378246753254*G0_0_1_0_3 + 0.011834415584416*G0_0_1_0_4 - 0.00345170454545466*G0_0_1_0_5 + 0.000493100649350651*G0_0_1_0_6 - 0.002958603896104*G0_0_1_0_7 + 0.00345170454545467*G0_0_1_0_8 + 0.026627435064936*G0_0_1_0_9 - 0.00131493506493511*G0_0_1_1_0 + 0.00657467532467554*G0_0_1_1_1 + 0.0019176136363637*G0_0_1_1_2 - 0.0157792207792213*G0_0_1_1_4 + 0.00345170454545466*G0_0_1_1_5 - 0.00295860389610401*G0_0_1_1_6 + 0.00394480519480532*G0_0_1_1_7 - 0.00788961038961063*G0_0_1_1_9 - 0.00169845779220786*G0_0_1_2_0 + 0.0019176136363637*G0_0_1_2_1 - 0.0082183441558445*G0_0_1_2_2 - 0.0246550324675334*G0_0_1_2_4 + 0.00690340909090935*G0_0_1_2_5 - 0.00986201298701339*G0_0_1_2_6 + 0.000493100649350663*G0_0_1_2_7 - 0.00345170454545465*G0_0_1_2_8 - 0.0216964285714293*G0_0_1_2_9 + 0.0187378246753254*G0_0_1_3_0 + 0.386097808441572*G0_0_1_3_3 + 0.0399411525974042*G0_0_1_3_4 - 0.034023944805196*G0_0_1_3_5 + 0.010355113636364*G0_0_1_3_6 - 0.054734172077924*G0_0_1_3_7 + 0.0428997564935081*G0_0_1_3_8 + 0.13313717532468*G0_0_1_3_9 + 0.011834415584416*G0_0_1_4_0 - 0.0157792207792213*G0_0_1_4_1 - 0.0246550324675334*G0_0_1_4_2 + 0.0399411525974042*G0_0_1_4_3 + 0.252960633116892*G0_0_1_4_4 - 0.0340239448051959*G0_0_1_4_5 + 0.023668831168832*G0_0_1_4_6 - 0.019230925324676*G0_0_1_4_7 + 0.0118344155844159*G0_0_1_4_8 + 0.13313717532468*G0_0_1_4_9 - 0.00345170454545466*G0_0_1_5_0 + 0.00345170454545466*G0_0_1_5_1 + 0.00690340909090935*G0_0_1_5_2 - 0.034023944805196*G0_0_1_5_3 - 0.0340239448051959*G0_0_1_5_4 + 0.016272321428572*G0_0_1_5_5 - 0.00147930194805195*G0_0_1_5_6 + 0.00887581168831201*G0_0_1_5_7 - 0.008875811688312*G0_0_1_5_8 - 0.0621306818181838*G0_0_1_5_9 + 0.000493100649350651*G0_0_1_6_0 - 0.00295860389610401*G0_0_1_6_1 - 0.00986201298701339*G0_0_1_6_2 + 0.010355113636364*G0_0_1_6_3 + 0.023668831168832*G0_0_1_6_4 - 0.00147930194805195*G0_0_1_6_5 - 0.0192309253246761*G0_0_1_6_6 + 0.00887581168831198*G0_0_1_6_8 + 0.0443790584415599*G0_0_1_6_9 - 0.002958603896104*G0_0_1_7_0 + 0.00394480519480532*G0_0_1_7_1 + 0.000493100649350663*G0_0_1_7_2 - 0.054734172077924*G0_0_1_7_3 - 0.019230925324676*G0_0_1_7_4 + 0.00887581168831201*G0_0_1_7_5 - 0.00739650974025998*G0_0_1_7_7 - 0.011834415584416*G0_0_1_7_8 - 0.0798823051948079*G0_0_1_7_9 + 0.00345170454545467*G0_0_1_8_0 - 0.00345170454545465*G0_0_1_8_2 + 0.0428997564935081*G0_0_1_8_3 + 0.0118344155844159*G0_0_1_8_4 - 0.008875811688312*G0_0_1_8_5 + 0.00887581168831198*G0_0_1_8_6 - 0.011834415584416*G0_0_1_8_7 - 0.0428997564935079*G0_0_1_8_8 + 0.026627435064936*G0_0_1_9_0 - 0.00788961038961063*G0_0_1_9_1 - 0.0216964285714293*G0_0_1_9_2 + 0.13313717532468*G0_0_1_9_3 + 0.13313717532468*G0_0_1_9_4 - 0.0621306818181838*G0_0_1_9_5 + 0.0443790584415599*G0_0_1_9_6 - 0.0798823051948079*G0_0_1_9_7 + 0.159764610389616*G0_0_1_9_9 - 0.00398133116883123*G0_1_0_0_0 + 0.00282163149350661*G0_1_0_0_1 - 0.000620941558441571*G0_1_0_0_2 + 0.00599939123376648*G0_1_0_0_3 - 0.0023833198051949*G0_1_0_0_4 - 0.00221895292207797*G0_1_0_0_5 - 0.00328733766233774*G0_1_0_0_7 + 0.00262987012987021*G0_1_0_0_8 - 0.00197240259740265*G0_1_0_0_9 + 0.00282163149350661*G0_1_0_1_0 + 0.0816355519480546*G0_1_0_1_1 + 0.00528713474025991*G0_1_0_1_2 + 0.0591720779220798*G0_1_0_1_3 - 0.0295860389610399*G0_1_0_1_4 - 0.000904017857142883*G0_1_0_1_5 - 0.00336952110389622*G0_1_0_1_6 - 0.01479301948052*G0_1_0_1_7 + 0.0345170454545467*G0_1_0_1_8 + 0.00986201298701335*G0_1_0_1_9 - 0.000620941558441571*G0_1_0_2_0 + 0.00528713474025991*G0_1_0_2_1 - 0.00518668831168841*G0_1_0_2_2 + 0.00904017857142886*G0_1_0_2_3 - 0.00969764610389641*G0_1_0_2_4 + 0.00147930194805198*G0_1_0_2_5 - 0.00271205357142862*G0_1_0_2_6 - 0.00139711850649356*G0_1_0_2_7 - 0.00435572240259754*G0_1_0_2_8 - 0.00690340909090931*G0_1_0_2_9 + 0.00599939123376648*G0_1_0_3_0 + 0.0591720779220799*G0_1_0_3_1 + 0.00904017857142886*G0_1_0_3_2 + 0.164202516233772*G0_1_0_3_3 - 0.0184912743506499*G0_1_0_3_4 - 0.00739650974026*G0_1_0_3_5 + 0.00961546266233794*G0_1_0_3_6 - 0.0184912743506501*G0_1_0_3_7 + 0.00591720779220817*G0_1_0_3_8 + 0.00739650974026017*G0_1_0_3_9 - 0.0023833198051949*G0_1_0_4_0 - 0.0295860389610399*G0_1_0_4_1 - 0.00969764610389641*G0_1_0_4_2 - 0.0184912743506499*G0_1_0_4_3 - 0.010355113636364*G0_1_0_4_4 + 0.00665685876623399*G0_1_0_4_5 - 0.016272321428572*G0_1_0_4_6 + 0.00591720779220803*G0_1_0_4_7 + 0.0125740665584419*G0_1_0_4_8 + 0.00739650974025996*G0_1_0_4_9 - 0.00221895292207797*G0_1_0_5_0 - 0.000904017857142884*G0_1_0_5_1 + 0.00147930194805198*G0_1_0_5_2 - 0.00739650974026*G0_1_0_5_3 + 0.00665685876623399*G0_1_0_5_4 - 0.0133137175324679*G0_1_0_5_5 + 0.00887581168831194*G0_1_0_5_6 - 0.00591720779220796*G0_1_0_5_7 + 0.00221895292207798*G0_1_0_5_8 + 0.00147930194805198*G0_1_0_5_9 - 0.00336952110389622*G0_1_0_6_1 - 0.00271205357142862*G0_1_0_6_2 + 0.00961546266233794*G0_1_0_6_3 - 0.016272321428572*G0_1_0_6_4 + 0.00887581168831193*G0_1_0_6_5 - 0.0221895292207798*G0_1_0_6_6 + 0.00369825487012999*G0_1_0_6_7 + 0.011834415584416*G0_1_0_6_8 + 0.00147930194805201*G0_1_0_6_9 - 0.00328733766233774*G0_1_0_7_0 - 0.01479301948052*G0_1_0_7_1 - 0.00139711850649356*G0_1_0_7_2 - 0.0184912743506501*G0_1_0_7_3 + 0.00591720779220803*G0_1_0_7_4 - 0.00591720779220796*G0_1_0_7_5 + 0.00369825487012999*G0_1_0_7_6 - 0.0162723214285719*G0_1_0_7_7 - 0.00221895292207811*G0_1_0_7_8 - 0.00147930194805207*G0_1_0_7_9 + 0.00262987012987021*G0_1_0_8_0 + 0.0345170454545467*G0_1_0_8_1 - 0.00435572240259754*G0_1_0_8_2 + 0.00591720779220816*G0_1_0_8_3 + 0.0125740665584419*G0_1_0_8_4 + 0.00221895292207798*G0_1_0_8_5 + 0.011834415584416*G0_1_0_8_6 - 0.00221895292207811*G0_1_0_8_7 - 0.116864853896108*G0_1_0_8_8 - 0.0547341720779239*G0_1_0_8_9 - 0.00197240259740265*G0_1_0_9_0 + 0.00986201298701335*G0_1_0_9_1 - 0.00690340909090931*G0_1_0_9_2 + 0.00739650974026017*G0_1_0_9_3 + 0.00739650974025996*G0_1_0_9_4 + 0.00147930194805198*G0_1_0_9_5 + 0.00147930194805201*G0_1_0_9_6 - 0.00147930194805208*G0_1_0_9_7 - 0.0547341720779239*G0_1_0_9_8 - 0.0710064935064959*G0_1_0_9_9 + 0.00120535714285718*G0_1_1_0_0 - 0.00246550324675334*G0_1_1_0_1 + 0.010355113636364*G0_1_1_0_3 - 0.00098620129870134*G0_1_1_0_4 + 0.000493100649350657*G0_1_1_0_5 - 0.001479301948052*G0_1_1_0_6 + 0.00641030844155864*G0_1_1_0_7 - 0.00641030844155867*G0_1_1_0_8 + 0.00493100649350669*G0_1_1_0_9 - 0.00246550324675334*G0_1_1_1_0 + 0.00246550324675333*G0_1_1_1_2 + 0.0246550324675333*G0_1_1_1_3 - 0.01479301948052*G0_1_1_1_4 + 0.00246550324675333*G0_1_1_1_5 - 0.00246550324675334*G0_1_1_1_6 + 0.01479301948052*G0_1_1_1_7 - 0.0246550324675334*G0_1_1_1_8 + 0.00246550324675333*G0_1_1_2_1 - 0.00120535714285718*G0_1_1_2_2 + 0.00641030844155866*G0_1_1_2_3 - 0.00641030844155867*G0_1_1_2_4 + 0.00147930194805199*G0_1_1_2_5 - 0.000493100649350667*G0_1_1_2_6 + 0.000986201298701316*G0_1_1_2_7 - 0.010355113636364*G0_1_1_2_8 - 0.00493100649350666*G0_1_1_2_9 + 0.010355113636364*G0_1_1_3_0 + 0.0246550324675333*G0_1_1_3_1 + 0.00641030844155866*G0_1_1_3_2 + 0.28106737012988*G0_1_1_3_3 - 0.016272321428572*G0_1_1_3_4 - 0.019230925324676*G0_1_1_3_5 + 0.00739650974025996*G0_1_1_3_6 - 0.0310653409090921*G0_1_1_3_7 + 0.0621306818181842*G0_1_1_3_9 - 0.00098620129870134*G0_1_1_4_0 - 0.01479301948052*G0_1_1_4_1 - 0.00641030844155867*G0_1_1_4_2 - 0.016272321428572*G0_1_1_4_3 + 0.00591720779220796*G0_1_1_4_4 + 0.002958603896104*G0_1_1_4_5 - 0.010355113636364*G0_1_1_4_6 + 0.0310653409090919*G0_1_1_4_8 + 0.00887581168831196*G0_1_1_4_9 + 0.000493100649350657*G0_1_1_5_0 + 0.00246550324675333*G0_1_1_5_1 + 0.00147930194805199*G0_1_1_5_2 - 0.019230925324676*G0_1_1_5_3 + 0.002958603896104*G0_1_1_5_4 + 0.00887581168831197*G0_1_1_5_5 + 0.010355113636364*G0_1_1_5_7 - 0.00739650974025998*G0_1_1_5_8 - 0.001479301948052*G0_1_1_6_0 - 0.00246550324675334*G0_1_1_6_1 - 0.000493100649350667*G0_1_1_6_2 + 0.00739650974025996*G0_1_1_6_3 - 0.010355113636364*G0_1_1_6_4 - 0.00887581168831199*G0_1_1_6_6 - 0.00295860389610395*G0_1_1_6_7 + 0.0192309253246759*G0_1_1_6_8 + 0.00641030844155864*G0_1_1_7_0 + 0.01479301948052*G0_1_1_7_1 + 0.000986201298701316*G0_1_1_7_2 - 0.0310653409090921*G0_1_1_7_3 + 0.010355113636364*G0_1_1_7_5 - 0.00295860389610395*G0_1_1_7_6 - 0.00591720779220818*G0_1_1_7_7 + 0.016272321428572*G0_1_1_7_8 - 0.00887581168831213*G0_1_1_7_9 - 0.00641030844155867*G0_1_1_8_0 - 0.0246550324675334*G0_1_1_8_1 - 0.010355113636364*G0_1_1_8_2 + 0.0310653409090919*G0_1_1_8_4 - 0.00739650974025998*G0_1_1_8_5 + 0.0192309253246759*G0_1_1_8_6 + 0.016272321428572*G0_1_1_8_7 - 0.28106737012988*G0_1_1_8_8 - 0.0621306818181838*G0_1_1_8_9 + 0.00493100649350668*G0_1_1_9_0 - 0.00493100649350666*G0_1_1_9_2 + 0.0621306818181842*G0_1_1_9_3 + 0.00887581168831196*G0_1_1_9_4 - 0.00887581168831213*G0_1_1_9_7 - 0.0621306818181838*G0_1_1_9_8; + A[75] = -A[34] - 0.0259151785714295*G0_0_0_0_0 - 0.00259334415584425*G0_0_0_0_1 - 0.011076501623377*G0_0_0_0_2 + 0.00419135551948069*G0_0_0_0_3 + 0.00419135551948067*G0_0_0_0_4 - 0.0343526785714297*G0_0_0_0_5 + 0.00780742694805215*G0_0_0_0_6 - 0.0191487418831176*G0_0_0_0_7 + 0.00797179383116912*G0_0_0_0_8 - 0.00641030844155868*G0_0_0_0_9 - 0.00259334415584425*G0_0_0_1_0 + 0.000803571428571408*G0_0_0_1_1 - 0.00483969155844174*G0_0_0_1_2 + 0.000328733766233758*G0_0_0_1_3 - 0.00460227272727289*G0_0_0_1_4 - 0.00641030844155863*G0_0_0_1_5 - 0.0049310064935067*G0_0_0_1_6 - 0.00394480519480532*G0_0_0_1_7 + 0.000986201298701317*G0_0_0_1_8 - 0.00493100649350667*G0_0_0_1_9 - 0.011076501623377*G0_0_0_2_0 - 0.00483969155844174*G0_0_0_2_1 - 0.0917715097402629*G0_0_0_2_2 + 0.017751623376624*G0_0_0_2_3 - 0.04437905844156*G0_0_0_2_4 + 0.0231757305194814*G0_0_0_2_5 - 0.06656858766234*G0_0_0_2_6 + 0.000493100649350662*G0_0_0_2_7 + 0.00419135551948066*G0_0_0_2_8 - 0.0138068181818187*G0_0_0_2_9 + 0.00419135551948069*G0_0_0_3_0 + 0.000328733766233758*G0_0_0_3_1 + 0.017751623376624*G0_0_0_3_2 + 0.0384618506493522*G0_0_0_3_3 + 0.0266274350649361*G0_0_0_3_4 - 0.00295860389610406*G0_0_0_3_5 + 0.027367086038962*G0_0_0_3_6 + 0.0147930194805201*G0_0_0_3_9 + 0.00419135551948067*G0_0_0_4_0 - 0.00460227272727289*G0_0_0_4_1 - 0.04437905844156*G0_0_0_4_2 + 0.0266274350649361*G0_0_0_4_3 + 0.116864853896108*G0_0_0_4_4 - 0.0273670860389621*G0_0_0_4_6 - 0.013313717532468*G0_0_0_4_7 + 0.0414204545454559*G0_0_0_4_9 - 0.0343526785714297*G0_0_0_5_0 - 0.00641030844155863*G0_0_0_5_1 + 0.0231757305194814*G0_0_0_5_2 - 0.00295860389610406*G0_0_0_5_3 - 0.247043425324684*G0_0_0_5_5 + 0.088018465909094*G0_0_0_5_6 - 0.0428997564935079*G0_0_0_5_7 + 0.031804991883118*G0_0_0_5_8 - 0.04437905844156*G0_0_0_5_9 + 0.00780742694805215*G0_0_0_6_0 - 0.0049310064935067*G0_0_0_6_1 - 0.06656858766234*G0_0_0_6_2 + 0.027367086038962*G0_0_0_6_3 - 0.0273670860389621*G0_0_0_6_4 + 0.088018465909094*G0_0_0_6_5 - 0.224853896103904*G0_0_0_6_6 + 0.01109476461039*G0_0_0_6_7 - 0.005177556818182*G0_0_0_6_8 - 0.013313717532468*G0_0_0_6_9 - 0.0191487418831176*G0_0_0_7_0 - 0.00394480519480532*G0_0_0_7_1 + 0.000493100649350663*G0_0_0_7_2 - 0.013313717532468*G0_0_0_7_4 - 0.0428997564935079*G0_0_0_7_5 + 0.01109476461039*G0_0_0_7_6 - 0.0133137175324679*G0_0_0_7_7 + 0.020710227272728*G0_0_0_7_8 - 0.002958603896104*G0_0_0_7_9 + 0.00797179383116912*G0_0_0_8_0 + 0.000986201298701316*G0_0_0_8_1 + 0.00419135551948066*G0_0_0_8_2 + 0.031804991883118*G0_0_0_8_5 - 0.005177556818182*G0_0_0_8_6 + 0.020710227272728*G0_0_0_8_7 - 0.00295860389610397*G0_0_0_8_8 + 0.01479301948052*G0_0_0_8_9 - 0.00641030844155867*G0_0_0_9_0 - 0.00493100649350667*G0_0_0_9_1 - 0.0138068181818187*G0_0_0_9_2 + 0.0147930194805201*G0_0_0_9_3 + 0.0414204545454559*G0_0_0_9_4 - 0.04437905844156*G0_0_0_9_5 - 0.013313717532468*G0_0_0_9_6 - 0.002958603896104*G0_0_0_9_7 + 0.01479301948052*G0_0_0_9_8 + 0.17751623376624*G0_0_0_9_9 + 0.16871347402598*G0_0_1_0_0 + 0.00730519480519505*G0_0_1_0_1 + 0.00730519480519503*G0_0_1_0_2 + 0.010355113636364*G0_0_1_0_3 + 0.010355113636364*G0_0_1_0_4 + 0.0876075487013016*G0_0_1_0_5 - 0.0391193181818195*G0_0_1_0_6 + 0.0876075487013017*G0_0_1_0_7 - 0.0391193181818195*G0_0_1_0_8 + 0.0364894480519494*G0_0_1_0_9 + 0.00730519480519505*G0_0_1_1_0 - 0.00445616883116898*G0_0_1_1_1 + 0.000547889610389627*G0_0_1_1_2 - 0.0197240259740266*G0_0_1_1_3 - 0.00345170454545468*G0_0_1_1_4 + 0.00986201298701332*G0_0_1_1_5 - 0.00419135551948066*G0_0_1_1_6 + 0.0195596590909098*G0_0_1_1_7 - 0.0156970373376629*G0_0_1_1_8 - 0.0108482142857146*G0_0_1_1_9 + 0.00730519480519503*G0_0_1_2_0 + 0.000547889610389627*G0_0_1_2_1 - 0.00445616883116901*G0_0_1_2_2 - 0.00345170454545468*G0_0_1_2_3 - 0.0197240259740267*G0_0_1_2_4 + 0.0195596590909098*G0_0_1_2_5 - 0.0156970373376629*G0_0_1_2_6 + 0.00986201298701331*G0_0_1_2_7 - 0.00419135551948066*G0_0_1_2_8 - 0.0108482142857146*G0_0_1_2_9 + 0.010355113636364*G0_0_1_3_0 - 0.0197240259740266*G0_0_1_3_1 - 0.00345170454545468*G0_0_1_3_2 + 0.241126217532476*G0_0_1_3_3 + 0.0414204545454562*G0_0_1_3_4 - 0.026627435064936*G0_0_1_3_5 + 0.00517755681818203*G0_0_1_3_6 - 0.038461850649352*G0_0_1_3_7 + 0.03328429383117*G0_0_1_3_8 + 0.109468344155848*G0_0_1_3_9 + 0.010355113636364*G0_0_1_4_0 - 0.00345170454545468*G0_0_1_4_1 - 0.0197240259740267*G0_0_1_4_2 + 0.0414204545454561*G0_0_1_4_3 + 0.241126217532476*G0_0_1_4_4 - 0.0384618506493519*G0_0_1_4_5 + 0.03328429383117*G0_0_1_4_6 - 0.026627435064936*G0_0_1_4_7 + 0.005177556818182*G0_0_1_4_8 + 0.109468344155848*G0_0_1_4_9 + 0.0876075487013016*G0_0_1_5_0 + 0.00986201298701332*G0_0_1_5_1 + 0.0195596590909098*G0_0_1_5_2 - 0.026627435064936*G0_0_1_5_3 - 0.0384618506493519*G0_0_1_5_4 + 0.102071834415588*G0_0_1_5_5 - 0.0650892857142878*G0_0_1_5_6 + 0.0739650974025998*G0_0_1_5_7 - 0.0369825487013*G0_0_1_5_8 - 0.0355032467532478*G0_0_1_5_9 - 0.0391193181818195*G0_0_1_6_0 - 0.00419135551948067*G0_0_1_6_1 - 0.0156970373376629*G0_0_1_6_2 + 0.00517755681818202*G0_0_1_6_3 + 0.03328429383117*G0_0_1_6_4 - 0.0650892857142878*G0_0_1_6_5 + 0.0118344155844159*G0_0_1_6_6 - 0.0369825487012999*G0_0_1_6_7 + 0.016272321428572*G0_0_1_6_8 + 0.0221895292207799*G0_0_1_6_9 + 0.0876075487013016*G0_0_1_7_0 + 0.0195596590909098*G0_0_1_7_1 + 0.00986201298701331*G0_0_1_7_2 - 0.038461850649352*G0_0_1_7_3 - 0.026627435064936*G0_0_1_7_4 + 0.0739650974025998*G0_0_1_7_5 - 0.0369825487012999*G0_0_1_7_6 + 0.102071834415588*G0_0_1_7_7 - 0.065089285714288*G0_0_1_7_8 - 0.0355032467532479*G0_0_1_7_9 - 0.0391193181818195*G0_0_1_8_0 - 0.0156970373376629*G0_0_1_8_1 - 0.00419135551948066*G0_0_1_8_2 + 0.03328429383117*G0_0_1_8_3 + 0.005177556818182*G0_0_1_8_4 - 0.0369825487013*G0_0_1_8_5 + 0.016272321428572*G0_0_1_8_6 - 0.065089285714288*G0_0_1_8_7 + 0.011834415584416*G0_0_1_8_8 + 0.0221895292207799*G0_0_1_8_9 + 0.0364894480519494*G0_0_1_9_0 - 0.0108482142857146*G0_0_1_9_1 - 0.0108482142857146*G0_0_1_9_2 + 0.109468344155848*G0_0_1_9_3 + 0.109468344155848*G0_0_1_9_4 - 0.0355032467532478*G0_0_1_9_5 + 0.0221895292207799*G0_0_1_9_6 - 0.0355032467532479*G0_0_1_9_7 + 0.0221895292207799*G0_0_1_9_8 + 0.443790584415599*G0_0_1_9_9 + 0.00505884740259758*G0_1_0_0_0 - 0.00036525974025976*G0_1_0_0_1 - 0.000365259740259749*G0_1_0_0_2 + 0.00156148538961045*G0_1_0_0_3 + 0.00156148538961045*G0_1_0_0_4 + 0.00156148538961045*G0_1_0_0_5 - 0.00287642045454554*G0_1_0_0_6 + 0.00156148538961045*G0_1_0_0_7 - 0.00287642045454556*G0_1_0_0_8 - 0.0108482142857146*G0_1_0_0_9 - 0.00036525974025976*G0_1_0_1_0 - 0.00109577922077936*G0_1_0_1_1 - 0.00616375811688336*G0_1_0_1_3 - 0.000986201298701325*G0_1_0_1_4 + 0.00994419642857176*G0_1_0_1_5 - 0.00238331980519489*G0_1_0_1_6 + 0.00838271103896136*G0_1_0_1_7 - 0.00862926136363673*G0_1_0_1_8 + 0.00739650974026*G0_1_0_1_9 - 0.000365259740259749*G0_1_0_2_0 - 0.00109577922077915*G0_1_0_2_2 - 0.000986201298701354*G0_1_0_2_3 - 0.00616375811688331*G0_1_0_2_4 + 0.0083827110389613*G0_1_0_2_5 - 0.00862926136363658*G0_1_0_2_6 + 0.00994419642857178*G0_1_0_2_7 - 0.0023833198051949*G0_1_0_2_8 + 0.00739650974026001*G0_1_0_2_9 + 0.00156148538961045*G0_1_0_3_0 - 0.00616375811688336*G0_1_0_3_1 - 0.000986201298701354*G0_1_0_3_2 + 0.0310653409090922*G0_1_0_3_3 + 0.017751623376624*G0_1_0_3_4 - 0.016272321428572*G0_1_0_3_5 + 0.00517755681818199*G0_1_0_3_6 - 0.00665685876623401*G0_1_0_3_7 + 0.00147930194805198*G0_1_0_3_8 - 0.00887581168831195*G0_1_0_3_9 + 0.00156148538961045*G0_1_0_4_0 - 0.000986201298701325*G0_1_0_4_1 - 0.00616375811688331*G0_1_0_4_2 + 0.017751623376624*G0_1_0_4_3 + 0.0310653409090919*G0_1_0_4_4 - 0.00665685876623402*G0_1_0_4_5 + 0.00147930194805203*G0_1_0_4_6 - 0.016272321428572*G0_1_0_4_7 + 0.00517755681818202*G0_1_0_4_8 - 0.00887581168831204*G0_1_0_4_9 + 0.00156148538961045*G0_1_0_5_0 + 0.00994419642857176*G0_1_0_5_1 + 0.0083827110389613*G0_1_0_5_2 - 0.016272321428572*G0_1_0_5_3 - 0.00665685876623402*G0_1_0_5_4 + 0.0931960227272759*G0_1_0_5_5 - 0.019230925324676*G0_1_0_5_6 + 0.063609983766236*G0_1_0_5_7 - 0.031804991883118*G0_1_0_5_8 + 0.0961546266233799*G0_1_0_5_9 - 0.00287642045454554*G0_1_0_6_0 - 0.00238331980519489*G0_1_0_6_1 - 0.00862926136363658*G0_1_0_6_2 + 0.00517755681818199*G0_1_0_6_3 + 0.00147930194805203*G0_1_0_6_4 - 0.019230925324676*G0_1_0_6_5 + 0.0103551136363641*G0_1_0_6_6 - 0.031804991883118*G0_1_0_6_7 + 0.00813616071428601*G0_1_0_6_8 - 0.032544642857144*G0_1_0_6_9 + 0.00156148538961045*G0_1_0_7_0 + 0.00838271103896136*G0_1_0_7_1 + 0.00994419642857178*G0_1_0_7_2 - 0.00665685876623401*G0_1_0_7_3 - 0.016272321428572*G0_1_0_7_4 + 0.063609983766236*G0_1_0_7_5 - 0.031804991883118*G0_1_0_7_6 + 0.0931960227272761*G0_1_0_7_7 - 0.019230925324676*G0_1_0_7_8 + 0.09615462662338*G0_1_0_7_9 - 0.00287642045454556*G0_1_0_8_0 - 0.00862926136363673*G0_1_0_8_1 - 0.0023833198051949*G0_1_0_8_2 + 0.00147930194805198*G0_1_0_8_3 + 0.00517755681818202*G0_1_0_8_4 - 0.031804991883118*G0_1_0_8_5 + 0.00813616071428601*G0_1_0_8_6 - 0.019230925324676*G0_1_0_8_7 + 0.0103551136363639*G0_1_0_8_8 - 0.032544642857144*G0_1_0_8_9 - 0.0108482142857146*G0_1_0_9_0 + 0.00739650974026*G0_1_0_9_1 + 0.00739650974026001*G0_1_0_9_2 - 0.00887581168831195*G0_1_0_9_3 - 0.00887581168831205*G0_1_0_9_4 + 0.0961546266233799*G0_1_0_9_5 - 0.032544642857144*G0_1_0_9_6 + 0.09615462662338*G0_1_0_9_7 - 0.032544642857144*G0_1_0_9_8 + 0.26627435064936*G0_1_0_9_9 - 0.0259151785714295*G0_1_1_0_0 - 0.011076501623377*G0_1_1_0_1 - 0.00259334415584424*G0_1_1_0_2 + 0.00419135551948068*G0_1_1_0_3 + 0.00419135551948068*G0_1_1_0_4 - 0.0191487418831175*G0_1_1_0_5 + 0.0079717938311691*G0_1_1_0_6 - 0.0343526785714298*G0_1_1_0_7 + 0.0078074269480522*G0_1_1_0_8 - 0.00641030844155866*G0_1_1_0_9 - 0.011076501623377*G0_1_1_1_0 - 0.0917715097402629*G0_1_1_1_1 - 0.00483969155844171*G0_1_1_1_2 - 0.0443790584415599*G0_1_1_1_3 + 0.017751623376624*G0_1_1_1_4 + 0.000493100649350664*G0_1_1_1_5 + 0.00419135551948065*G0_1_1_1_6 + 0.0231757305194814*G0_1_1_1_7 - 0.0665685876623401*G0_1_1_1_8 - 0.0138068181818187*G0_1_1_1_9 - 0.00259334415584424*G0_1_1_2_0 - 0.00483969155844172*G0_1_1_2_1 + 0.000803571428571487*G0_1_1_2_2 - 0.00460227272727289*G0_1_1_2_3 + 0.000328733766233772*G0_1_1_2_4 - 0.00394480519480533*G0_1_1_2_5 + 0.000986201298701349*G0_1_1_2_6 - 0.00641030844155867*G0_1_1_2_7 - 0.00493100649350666*G0_1_1_2_8 - 0.00493100649350667*G0_1_1_2_9 + 0.00419135551948068*G0_1_1_3_0 - 0.0443790584415599*G0_1_1_3_1 - 0.00460227272727289*G0_1_1_3_2 + 0.116864853896108*G0_1_1_3_3 + 0.026627435064936*G0_1_1_3_4 - 0.013313717532468*G0_1_1_3_5 - 0.027367086038962*G0_1_1_3_8 + 0.0414204545454561*G0_1_1_3_9 + 0.00419135551948068*G0_1_1_4_0 + 0.017751623376624*G0_1_1_4_1 + 0.000328733766233772*G0_1_1_4_2 + 0.026627435064936*G0_1_1_4_3 + 0.0384618506493519*G0_1_1_4_4 - 0.00295860389610397*G0_1_1_4_7 + 0.027367086038962*G0_1_1_4_8 + 0.01479301948052*G0_1_1_4_9 - 0.0191487418831175*G0_1_1_5_0 + 0.000493100649350664*G0_1_1_5_1 - 0.00394480519480533*G0_1_1_5_2 - 0.013313717532468*G0_1_1_5_3 - 0.013313717532468*G0_1_1_5_5 + 0.020710227272728*G0_1_1_5_6 - 0.042899756493508*G0_1_1_5_7 + 0.01109476461039*G0_1_1_5_8 - 0.00295860389610406*G0_1_1_5_9 + 0.0079717938311691*G0_1_1_6_0 + 0.00419135551948066*G0_1_1_6_1 + 0.000986201298701349*G0_1_1_6_2 + 0.020710227272728*G0_1_1_6_5 - 0.00295860389610405*G0_1_1_6_6 + 0.031804991883118*G0_1_1_6_7 - 0.00517755681818202*G0_1_1_6_8 + 0.01479301948052*G0_1_1_6_9 - 0.0343526785714298*G0_1_1_7_0 + 0.0231757305194814*G0_1_1_7_1 - 0.00641030844155867*G0_1_1_7_2 - 0.00295860389610397*G0_1_1_7_4 - 0.042899756493508*G0_1_1_7_5 + 0.031804991883118*G0_1_1_7_6 - 0.247043425324684*G0_1_1_7_7 + 0.0880184659090941*G0_1_1_7_8 - 0.0443790584415601*G0_1_1_7_9 + 0.0078074269480522*G0_1_1_8_0 - 0.0665685876623401*G0_1_1_8_1 - 0.00493100649350666*G0_1_1_8_2 - 0.027367086038962*G0_1_1_8_3 + 0.027367086038962*G0_1_1_8_4 + 0.01109476461039*G0_1_1_8_5 - 0.00517755681818202*G0_1_1_8_6 + 0.0880184659090941*G0_1_1_8_7 - 0.224853896103904*G0_1_1_8_8 - 0.013313717532468*G0_1_1_8_9 - 0.00641030844155866*G0_1_1_9_0 - 0.0138068181818187*G0_1_1_9_1 - 0.00493100649350667*G0_1_1_9_2 + 0.0414204545454561*G0_1_1_9_3 + 0.01479301948052*G0_1_1_9_4 - 0.00295860389610406*G0_1_1_9_5 + 0.01479301948052*G0_1_1_9_6 - 0.0443790584415601*G0_1_1_9_7 - 0.013313717532468*G0_1_1_9_8 + 0.17751623376624*G0_1_1_9_9; + A[36] = -A[34] + 0.00341517857142874*G0_0_1_0_0 - 0.00166193181818187*G0_0_1_0_1 + 0.00249289772727283*G0_0_1_0_2 + 0.0119165990259745*G0_0_1_0_3 + 0.0114234983766238*G0_0_1_0_4 - 0.00378043831168845*G0_0_1_0_5 + 0.00928672889610422*G0_0_1_0_6 - 0.00419135551948065*G0_0_1_0_7 + 0.00221895292207799*G0_0_1_0_8 + 0.0261343344155853*G0_0_1_0_9 - 0.00166193181818187*G0_0_1_1_0 - 0.00611810064935085*G0_0_1_1_1 + 0.00325994318181831*G0_0_1_1_2 - 0.0190665584415591*G0_0_1_1_3 - 0.000575284090909116*G0_0_1_1_4 - 0.000410917207792231*G0_0_1_1_5 - 0.000410917207792213*G0_0_1_1_6 + 0.00714995941558466*G0_0_1_1_7 - 0.0101085633116887*G0_0_1_1_8 - 0.0172585227272733*G0_0_1_1_9 + 0.00249289772727283*G0_0_1_2_0 + 0.00325994318181831*G0_0_1_2_1 + 0.0717735389610414*G0_0_1_2_2 - 0.0172585227272733*G0_0_1_2_3 + 0.01479301948052*G0_0_1_2_4 - 0.0123275162337667*G0_0_1_2_5 + 0.0394480519480534*G0_0_1_2_6 + 0.00156148538961044*G0_0_1_2_7 - 0.00238331980519488*G0_0_1_2_8 - 0.00493100649350665*G0_0_1_2_9 + 0.0119165990259745*G0_0_1_3_0 - 0.0190665584415591*G0_0_1_3_1 - 0.0172585227272733*G0_0_1_3_2 + 0.2218952922078*G0_0_1_3_3 + 0.0229291801948061*G0_0_1_3_4 - 0.016272321428572*G0_0_1_3_5 - 0.000739650974026024*G0_0_1_3_6 - 0.037722199675326*G0_0_1_3_7 + 0.032544642857144*G0_0_1_3_8 + 0.127219967532472*G0_0_1_3_9 + 0.0114234983766238*G0_0_1_4_0 - 0.000575284090909115*G0_0_1_4_1 + 0.01479301948052*G0_0_1_4_2 + 0.0229291801948061*G0_0_1_4_3 + 0.1479301948052*G0_0_1_4_4 - 0.036242897727274*G0_0_1_4_5 + 0.0369825487013*G0_0_1_4_6 - 0.01849127435065*G0_0_1_4_7 + 0.00517755681818198*G0_0_1_4_8 + 0.0872788149350679*G0_0_1_4_9 - 0.00378043831168845*G0_0_1_5_0 - 0.000410917207792229*G0_0_1_5_1 - 0.0123275162337667*G0_0_1_5_2 - 0.016272321428572*G0_0_1_5_3 - 0.036242897727274*G0_0_1_5_4 - 0.0325446428571439*G0_0_1_5_5 - 0.045118709415586*G0_0_1_5_6 + 0.00739650974025999*G0_0_1_5_7 - 0.000739650974026003*G0_0_1_5_8 - 0.0769237012987039*G0_0_1_5_9 + 0.00928672889610422*G0_0_1_6_0 - 0.000410917207792214*G0_0_1_6_1 + 0.0394480519480534*G0_0_1_6_2 - 0.000739650974026024*G0_0_1_6_3 + 0.0369825487013*G0_0_1_6_4 - 0.045118709415586*G0_0_1_6_5 - 0.00665685876623399*G0_0_1_6_7 + 0.00517755681818198*G0_0_1_6_8 + 0.016272321428572*G0_0_1_6_9 - 0.00419135551948065*G0_0_1_7_0 + 0.00714995941558466*G0_0_1_7_1 + 0.00156148538961044*G0_0_1_7_2 - 0.037722199675326*G0_0_1_7_3 - 0.01849127435065*G0_0_1_7_4 + 0.00739650974025999*G0_0_1_7_5 - 0.00665685876623399*G0_0_1_7_6 + 0.00591720779220799*G0_0_1_7_7 - 0.00739650974026*G0_0_1_7_8 - 0.0650892857142879*G0_0_1_7_9 + 0.00221895292207799*G0_0_1_8_0 - 0.0101085633116887*G0_0_1_8_1 - 0.00238331980519488*G0_0_1_8_2 + 0.032544642857144*G0_0_1_8_3 + 0.00517755681818198*G0_0_1_8_4 - 0.000739650974026003*G0_0_1_8_5 + 0.00517755681818198*G0_0_1_8_6 - 0.00739650974026*G0_0_1_8_7 - 0.020710227272728*G0_0_1_8_8 + 0.041420454545456*G0_0_1_8_9 + 0.0261343344155853*G0_0_1_9_0 - 0.0172585227272733*G0_0_1_9_1 - 0.00493100649350665*G0_0_1_9_2 + 0.127219967532472*G0_0_1_9_3 + 0.0872788149350679*G0_0_1_9_4 - 0.0769237012987039*G0_0_1_9_5 + 0.016272321428572*G0_0_1_9_6 - 0.0650892857142879*G0_0_1_9_7 + 0.041420454545456*G0_0_1_9_8 + 0.408287337662351*G0_0_1_9_9 + 0.00162540584415586*G0_1_1_0_0 - 0.00705864448051976*G0_1_1_0_1 - 0.000100446428571437*G0_1_1_0_2 + 0.00271205357142868*G0_1_1_0_3 + 0.00197240259740267*G0_1_1_0_4 + 0.00147930194805198*G0_1_1_0_5 - 0.000493100649350665*G0_1_1_0_6 + 0.00846489448051975*G0_1_1_0_7 - 0.0119987824675329*G0_1_1_0_8 + 0.00641030844155867*G0_1_1_0_9 - 0.00705864448051976*G0_1_1_1_0 - 0.0925933441558473*G0_1_1_1_1 - 0.00373478084415597*G0_1_1_1_2 - 0.0406808035714299*G0_1_1_1_3 + 0.0172585227272733*G0_1_1_1_4 + 0.001479301948052*G0_1_1_1_5 + 0.0345170454545467*G0_1_1_1_7 - 0.0727323457792234*G0_1_1_1_8 - 0.0172585227272733*G0_1_1_1_9 - 0.000100446428571437*G0_1_1_2_0 - 0.00373478084415597*G0_1_1_2_1 + 0.00273944805194808*G0_1_1_2_2 - 0.00476663961038975*G0_1_1_2_3 + 0.00410917207792219*G0_1_1_2_4 - 0.000657467532467542*G0_1_1_2_5 + 0.00328733766233774*G0_1_1_2_6 + 0.00221895292207799*G0_1_1_2_7 - 0.00961546266233798*G0_1_1_2_8 + 0.000493100649350658*G0_1_1_2_9 + 0.00271205357142868*G0_1_1_3_0 - 0.0406808035714299*G0_1_1_3_1 - 0.00476663961038975*G0_1_1_3_2 + 0.0976339285714323*G0_1_1_3_3 + 0.015532670454546*G0_1_1_3_4 - 0.00887581168831201*G0_1_1_3_5 + 0.00517755681818198*G0_1_1_3_6 - 0.00295860389610402*G0_1_1_3_7 - 0.0310653409090919*G0_1_1_3_8 + 0.057692775974028*G0_1_1_3_9 + 0.00197240259740267*G0_1_1_4_0 + 0.0172585227272733*G0_1_1_4_1 + 0.00410917207792219*G0_1_1_4_2 + 0.015532670454546*G0_1_1_4_3 + 0.00443790584415604*G0_1_1_4_4 - 0.000739650974025993*G0_1_1_4_5 - 0.00443790584415598*G0_1_1_4_6 - 0.00887581168831198*G0_1_1_4_7 + 0.0340239448051959*G0_1_1_4_8 + 0.00147930194805198*G0_1_1_5_0 + 0.001479301948052*G0_1_1_5_1 - 0.000657467532467542*G0_1_1_5_2 - 0.00887581168831201*G0_1_1_5_3 - 0.000739650974025994*G0_1_1_5_4 - 0.00887581168831199*G0_1_1_5_5 - 0.000739650974025976*G0_1_1_5_6 + 0.000739650974025987*G0_1_1_5_7 + 0.000739650974026*G0_1_1_5_8 - 0.020710227272728*G0_1_1_5_9 - 0.000493100649350664*G0_1_1_6_0 + 0.00328733766233774*G0_1_1_6_2 + 0.00517755681818198*G0_1_1_6_3 - 0.00443790584415598*G0_1_1_6_4 - 0.000739650974025976*G0_1_1_6_5 - 0.010355113636364*G0_1_1_6_6 - 0.00147930194805198*G0_1_1_6_7 + 0.0118344155844159*G0_1_1_6_8 - 0.011834415584416*G0_1_1_6_9 + 0.00846489448051975*G0_1_1_7_0 + 0.0345170454545467*G0_1_1_7_1 + 0.00221895292207799*G0_1_1_7_2 - 0.00295860389610402*G0_1_1_7_3 - 0.00887581168831198*G0_1_1_7_4 + 0.000739650974025987*G0_1_1_7_5 - 0.00147930194805198*G0_1_1_7_6 - 0.0162723214285722*G0_1_1_7_7 + 0.0451187094155861*G0_1_1_7_8 - 0.016272321428572*G0_1_1_7_9 - 0.0119987824675329*G0_1_1_8_0 - 0.0727323457792234*G0_1_1_8_1 - 0.00961546266233798*G0_1_1_8_2 - 0.0310653409090919*G0_1_1_8_3 + 0.0340239448051959*G0_1_1_8_4 + 0.000739650974026*G0_1_1_8_5 + 0.0118344155844159*G0_1_1_8_6 + 0.0451187094155861*G0_1_1_8_7 - 0.257398538961048*G0_1_1_8_8 - 0.016272321428572*G0_1_1_8_9 + 0.00641030844155867*G0_1_1_9_0 - 0.0172585227272733*G0_1_1_9_1 + 0.000493100649350658*G0_1_1_9_2 + 0.057692775974028*G0_1_1_9_3 - 0.020710227272728*G0_1_1_9_5 - 0.011834415584416*G0_1_1_9_6 - 0.016272321428572*G0_1_1_9_7 - 0.016272321428572*G0_1_1_9_8 + 0.0177516233766243*G0_1_1_9_9; + A[86] = -A[36] - 0.00162540584415592*G0_0_0_0_0 + 0.000100446428571433*G0_0_0_0_1 + 0.00705864448051976*G0_0_0_0_2 - 0.00197240259740269*G0_0_0_0_3 - 0.00271205357142865*G0_0_0_0_4 - 0.0084648944805198*G0_0_0_0_5 + 0.011998782467533*G0_0_0_0_6 - 0.00147930194805201*G0_0_0_0_7 + 0.000493100649350662*G0_0_0_0_8 - 0.00641030844155866*G0_0_0_0_9 + 0.000100446428571433*G0_0_0_1_0 - 0.00273944805194819*G0_0_0_1_1 + 0.00373478084415599*G0_0_0_1_2 - 0.00410917207792224*G0_0_0_1_3 + 0.0047666396103898*G0_0_0_1_4 - 0.00221895292207801*G0_0_0_1_5 + 0.00961546266233804*G0_0_0_1_6 + 0.000657467532467567*G0_0_0_1_7 - 0.00328733766233781*G0_0_0_1_8 - 0.00049310064935066*G0_0_0_1_9 + 0.00705864448051976*G0_0_0_2_0 + 0.00373478084415599*G0_0_0_2_1 + 0.0925933441558475*G0_0_0_2_2 - 0.0172585227272733*G0_0_0_2_3 + 0.0406808035714301*G0_0_0_2_4 - 0.0345170454545467*G0_0_0_2_5 + 0.0727323457792235*G0_0_0_2_6 - 0.00147930194805199*G0_0_0_2_7 + 0.0172585227272733*G0_0_0_2_9 - 0.00197240259740269*G0_0_0_3_0 - 0.00410917207792224*G0_0_0_3_1 - 0.0172585227272733*G0_0_0_3_2 - 0.00443790584415603*G0_0_0_3_3 - 0.0155326704545461*G0_0_0_3_4 + 0.00887581168831202*G0_0_0_3_5 - 0.034023944805196*G0_0_0_3_6 + 0.000739650974026021*G0_0_0_3_7 + 0.00443790584415597*G0_0_0_3_8 - 0.00271205357142865*G0_0_0_4_0 + 0.0047666396103898*G0_0_0_4_1 + 0.0406808035714301*G0_0_0_4_2 - 0.0155326704545461*G0_0_0_4_3 - 0.0976339285714318*G0_0_0_4_4 + 0.00295860389610391*G0_0_0_4_5 + 0.0310653409090921*G0_0_0_4_6 + 0.00887581168831197*G0_0_0_4_7 - 0.00517755681818199*G0_0_0_4_8 - 0.0576927759740279*G0_0_0_4_9 - 0.0084648944805198*G0_0_0_5_0 - 0.00221895292207801*G0_0_0_5_1 - 0.0345170454545467*G0_0_0_5_2 + 0.00887581168831203*G0_0_0_5_3 + 0.00295860389610391*G0_0_0_5_4 + 0.0162723214285721*G0_0_0_5_5 - 0.0451187094155861*G0_0_0_5_6 - 0.000739650974025988*G0_0_0_5_7 + 0.00147930194805201*G0_0_0_5_8 + 0.0162723214285719*G0_0_0_5_9 + 0.011998782467533*G0_0_0_6_0 + 0.00961546266233804*G0_0_0_6_1 + 0.0727323457792234*G0_0_0_6_2 - 0.034023944805196*G0_0_0_6_3 + 0.0310653409090921*G0_0_0_6_4 - 0.0451187094155861*G0_0_0_6_5 + 0.257398538961048*G0_0_0_6_6 - 0.000739650974026003*G0_0_0_6_7 - 0.011834415584416*G0_0_0_6_8 + 0.0162723214285721*G0_0_0_6_9 - 0.00147930194805201*G0_0_0_7_0 + 0.000657467532467567*G0_0_0_7_1 - 0.00147930194805199*G0_0_0_7_2 + 0.000739650974026021*G0_0_0_7_3 + 0.00887581168831197*G0_0_0_7_4 - 0.000739650974025988*G0_0_0_7_5 - 0.000739650974026003*G0_0_0_7_6 + 0.00887581168831208*G0_0_0_7_7 + 0.000739650974026036*G0_0_0_7_8 + 0.020710227272728*G0_0_0_7_9 + 0.000493100649350662*G0_0_0_8_0 - 0.00328733766233781*G0_0_0_8_1 + 0.00443790584415597*G0_0_0_8_3 - 0.00517755681818199*G0_0_0_8_4 + 0.001479301948052*G0_0_0_8_5 - 0.011834415584416*G0_0_0_8_6 + 0.000739650974026036*G0_0_0_8_7 + 0.010355113636364*G0_0_0_8_8 + 0.011834415584416*G0_0_0_8_9 - 0.00641030844155866*G0_0_0_9_0 - 0.00049310064935066*G0_0_0_9_1 + 0.0172585227272733*G0_0_0_9_2 - 0.0576927759740279*G0_0_0_9_4 + 0.0162723214285719*G0_0_0_9_5 + 0.0162723214285721*G0_0_0_9_6 + 0.020710227272728*G0_0_0_9_7 + 0.011834415584416*G0_0_0_9_8 - 0.0177516233766238*G0_0_0_9_9 + 0.0331655844155855*G0_0_1_0_0 + 0.00146103896103901*G0_0_1_0_1 + 0.00561586850649373*G0_0_1_0_2 - 0.000493100649350659*G0_0_1_0_4 + 0.0137246347402602*G0_0_1_0_5 + 0.00410917207792225*G0_0_1_0_6 + 0.013313717532468*G0_0_1_0_7 - 0.002958603896104*G0_0_1_0_8 + 0.00739650974026001*G0_0_1_0_9 + 0.00146103896103901*G0_0_1_1_0 + 0.00346996753246767*G0_0_1_1_2 - 0.00328733766233778*G0_0_1_1_3 + 0.0023833198051949*G0_0_1_1_4 - 0.00493100649350667*G0_0_1_1_5 + 0.00156148538961044*G0_0_1_1_7 + 0.00328733766233778*G0_0_1_1_8 - 0.00394480519480533*G0_0_1_1_9 + 0.00561586850649373*G0_0_1_2_0 + 0.00346996753246767*G0_0_1_2_1 + 0.0778916396103924*G0_0_1_2_2 - 0.0142999188311693*G0_0_1_2_3 + 0.0305722402597414*G0_0_1_2_4 - 0.017915990259741*G0_0_1_2_5 + 0.0528439529220799*G0_0_1_2_6 - 0.002958603896104*G0_0_1_2_7 - 0.00197240259740266*G0_0_1_2_8 + 0.00838271103896133*G0_0_1_2_9 - 0.00328733766233778*G0_0_1_3_1 - 0.0142999188311693*G0_0_1_3_2 + 0.00887581168831202*G0_0_1_3_3 - 0.0103551136363641*G0_0_1_3_4 + 0.010355113636364*G0_0_1_3_5 - 0.00591720779220806*G0_0_1_3_6 - 0.00591720779220797*G0_0_1_3_7 + 0.005917207792208*G0_0_1_3_8 + 0.023668831168832*G0_0_1_3_9 - 0.000493100649350658*G0_0_1_4_0 + 0.0023833198051949*G0_0_1_4_1 + 0.0305722402597414*G0_0_1_4_2 - 0.0103551136363641*G0_0_1_4_3 - 0.0650892857142878*G0_0_1_4_4 - 0.00443790584415603*G0_0_1_4_5 + 0.0103551136363641*G0_0_1_4_6 + 0.00813616071428599*G0_0_1_4_7 - 0.016272321428572*G0_0_1_4_9 + 0.0137246347402602*G0_0_1_5_0 - 0.00493100649350667*G0_0_1_5_1 - 0.017915990259741*G0_0_1_5_2 + 0.010355113636364*G0_0_1_5_3 - 0.00443790584415603*G0_0_1_5_4 - 0.113906250000004*G0_0_1_5_5 - 0.056953125000002*G0_0_1_5_6 - 0.011834415584416*G0_0_1_5_7 + 0.00887581168831199*G0_0_1_5_8 - 0.039941152597404*G0_0_1_5_9 + 0.00410917207792225*G0_0_1_6_0 + 0.0528439529220799*G0_0_1_6_2 - 0.00591720779220806*G0_0_1_6_3 + 0.0103551136363641*G0_0_1_6_4 - 0.056953125000002*G0_0_1_6_5 + 0.00295860389610399*G0_0_1_6_7 + 0.00591720779220798*G0_0_1_6_8 - 0.0133137175324679*G0_0_1_6_9 + 0.013313717532468*G0_0_1_7_0 + 0.00156148538961044*G0_0_1_7_1 - 0.002958603896104*G0_0_1_7_2 - 0.00591720779220797*G0_0_1_7_3 + 0.00813616071428599*G0_0_1_7_4 - 0.011834415584416*G0_0_1_7_5 + 0.00295860389610399*G0_0_1_7_6 - 0.0754443993506521*G0_0_1_7_7 - 0.0192309253246759*G0_0_1_7_8 - 0.028106737012988*G0_0_1_7_9 - 0.002958603896104*G0_0_1_8_0 + 0.00328733766233778*G0_0_1_8_1 - 0.00197240259740266*G0_0_1_8_2 + 0.005917207792208*G0_0_1_8_3 + 0.00887581168831199*G0_0_1_8_5 + 0.00591720779220798*G0_0_1_8_6 - 0.0192309253246759*G0_0_1_8_7 - 0.020710227272728*G0_0_1_8_8 + 0.011834415584416*G0_0_1_8_9 + 0.00739650974026001*G0_0_1_9_0 - 0.00394480519480533*G0_0_1_9_1 + 0.00838271103896133*G0_0_1_9_2 + 0.023668831168832*G0_0_1_9_3 - 0.016272321428572*G0_0_1_9_4 - 0.039941152597404*G0_0_1_9_5 - 0.0133137175324679*G0_0_1_9_6 - 0.028106737012988*G0_0_1_9_7 + 0.011834415584416*G0_0_1_9_8 + 0.213019480519488*G0_0_1_9_9; + A[35] = -A[36] + 0.00253855519480529*G0_0_0_0_0 + 0.000502232142857166*G0_0_0_0_1 + 0.00602678571428594*G0_0_0_0_2 + 0.00246550324675333*G0_0_0_0_3 + 0.000493100649350683*G0_0_0_0_4 - 0.00443790584415599*G0_0_0_0_5 + 0.00591720779220806*G0_0_0_0_6 + 0.000410917207792223*G0_0_0_0_7 + 0.00115056818181822*G0_0_0_0_8 + 0.000502232142857166*G0_0_0_1_0 + 0.00374391233766246*G0_0_0_1_1 + 0.0035612824675326*G0_0_0_1_2 + 0.00197240259740267*G0_0_0_1_3 - 0.00049310064935065*G0_0_0_1_4 + 0.00147930194805199*G0_0_0_1_5 + 0.0108482142857147*G0_0_0_1_6 - 0.00032873376623378*G0_0_0_1_7 + 0.000904017857142891*G0_0_0_1_8 + 0.00493100649350668*G0_0_0_1_9 + 0.00602678571428594*G0_0_0_2_0 + 0.0035612824675326*G0_0_0_2_1 + 0.0569805194805214*G0_0_0_2_2 - 0.0108482142857147*G0_0_0_2_3 + 0.0246550324675333*G0_0_0_2_4 - 0.0256412337662347*G0_0_0_2_5 + 0.0493100649350667*G0_0_0_2_6 - 0.00246550324675333*G0_0_0_2_7 + 0.00690340909090934*G0_0_0_2_9 + 0.00246550324675333*G0_0_0_3_0 + 0.00197240259740267*G0_0_0_3_1 - 0.0108482142857147*G0_0_0_3_2 + 0.100592532467536*G0_0_0_3_3 - 0.016272321428572*G0_0_0_3_4 - 0.00295860389610397*G0_0_0_3_5 - 0.0384618506493519*G0_0_0_3_6 - 0.013313717532468*G0_0_0_3_7 + 0.019230925324676*G0_0_0_3_8 + 0.011834415584416*G0_0_0_3_9 + 0.000493100649350682*G0_0_0_4_0 - 0.00049310064935065*G0_0_0_4_1 + 0.0246550324675333*G0_0_0_4_2 - 0.016272321428572*G0_0_0_4_3 + 0.013313717532468*G0_0_0_4_4 - 0.00739650974026005*G0_0_0_4_5 + 0.045858360389612*G0_0_0_4_6 + 0.00591720779220799*G0_0_0_4_7 - 0.00591720779220801*G0_0_0_4_8 - 0.00591720779220797*G0_0_0_4_9 - 0.00443790584415599*G0_0_0_5_0 + 0.00147930194805199*G0_0_0_5_1 - 0.0256412337662347*G0_0_0_5_2 - 0.00295860389610397*G0_0_0_5_3 - 0.00739650974026005*G0_0_0_5_4 + 0.106509740259744*G0_0_0_5_5 - 0.0325446428571441*G0_0_0_5_6 + 0.00887581168831201*G0_0_0_5_7 - 0.010355113636364*G0_0_0_5_8 + 0.020710227272728*G0_0_0_5_9 + 0.00591720779220807*G0_0_0_6_0 + 0.0108482142857147*G0_0_0_6_1 + 0.0493100649350667*G0_0_0_6_2 - 0.0384618506493519*G0_0_0_6_3 + 0.045858360389612*G0_0_0_6_4 - 0.0325446428571441*G0_0_0_6_5 + 0.294381087662348*G0_0_0_6_6 + 0.00147930194805201*G0_0_0_6_7 - 0.013313717532468*G0_0_0_6_8 + 0.0562134740259759*G0_0_0_6_9 + 0.000410917207792222*G0_0_0_7_0 - 0.00032873376623378*G0_0_0_7_1 - 0.00246550324675333*G0_0_0_7_2 - 0.013313717532468*G0_0_0_7_3 + 0.00591720779220799*G0_0_0_7_4 + 0.00887581168831201*G0_0_0_7_5 + 0.00147930194805201*G0_0_0_7_6 - 0.00665685876623401*G0_0_0_7_8 - 0.00295860389610399*G0_0_0_7_9 + 0.00115056818181822*G0_0_0_8_0 + 0.000904017857142891*G0_0_0_8_1 + 0.019230925324676*G0_0_0_8_3 - 0.00591720779220801*G0_0_0_8_4 - 0.010355113636364*G0_0_0_8_5 - 0.013313717532468*G0_0_0_8_6 - 0.00665685876623401*G0_0_0_8_7 + 0.00887581168831203*G0_0_0_8_8 - 0.00295860389610397*G0_0_0_8_9 + 0.00493100649350668*G0_0_0_9_1 + 0.00690340909090934*G0_0_0_9_2 + 0.011834415584416*G0_0_0_9_3 - 0.00591720779220798*G0_0_0_9_4 + 0.020710227272728*G0_0_0_9_5 + 0.0562134740259759*G0_0_0_9_6 - 0.00295860389610399*G0_0_0_9_7 - 0.00295860389610397*G0_0_0_9_8 - 0.0887581168831197*G0_0_0_9_9 - 0.00184456168831178*G0_0_1_0_0 + 0.0028307629870131*G0_0_1_0_2 + 0.00279423701298712*G0_0_1_0_3 + 0.00230113636363646*G0_0_1_0_4 - 0.00690340909090936*G0_0_1_0_5 + 0.0078896103896107*G0_0_1_0_6 - 0.00205458603896113*G0_0_1_0_7 + 0.00115056818181823*G0_0_1_0_8 + 0.00295860389610401*G0_0_1_0_9 + 0.00200892857142864*G0_0_1_1_1 + 0.00278510551948062*G0_0_1_1_2 + 0.000821834415584439*G0_0_1_1_3 - 0.00139711850649354*G0_0_1_1_4 - 0.00189021915584423*G0_0_1_1_5 + 0.00402698863636379*G0_0_1_1_6 + 0.000246550324675329*G0_0_1_1_7 - 0.000493100649350667*G0_0_1_1_9 + 0.0028307629870131*G0_0_1_2_0 + 0.00278510551948062*G0_0_1_2_1 + 0.0452008928571444*G0_0_1_2_2 - 0.00936891233766266*G0_0_1_2_3 + 0.0172585227272733*G0_0_1_2_4 - 0.0157792207792213*G0_0_1_2_5 + 0.0345170454545467*G0_0_1_2_6 - 0.000904017857142889*G0_0_1_2_7 - 0.00115056818181821*G0_0_1_2_8 + 0.002958603896104*G0_0_1_2_9 + 0.00279423701298712*G0_0_1_3_0 + 0.00082183441558444*G0_0_1_3_1 - 0.00936891233766266*G0_0_1_3_2 + 0.093196022727276*G0_0_1_3_3 - 0.00517755681818197*G0_0_1_3_4 - 0.01479301948052*G0_0_1_3_6 - 0.01109476461039*G0_0_1_3_7 + 0.010355113636364*G0_0_1_3_8 + 0.0236688311688321*G0_0_1_3_9 + 0.00230113636363646*G0_0_1_4_0 - 0.00139711850649354*G0_0_1_4_1 + 0.0172585227272733*G0_0_1_4_2 - 0.00517755681818198*G0_0_1_4_3 + 0.0251481331168841*G0_0_1_4_4 - 0.00961546266233802*G0_0_1_4_5 + 0.024408482142858*G0_0_1_4_6 - 0.000739650974026001*G0_0_1_4_7 + 0.000739650974025985*G0_0_1_4_8 + 0.010355113636364*G0_0_1_4_9 - 0.00690340909090936*G0_0_1_5_0 - 0.00189021915584423*G0_0_1_5_1 - 0.0157792207792213*G0_0_1_5_2 - 0.00961546266233802*G0_0_1_5_4 - 0.017751623376624*G0_0_1_5_5 - 0.023668831168832*G0_0_1_5_6 - 0.00295860389610401*G0_0_1_5_7 + 0.00295860389610401*G0_0_1_5_8 - 0.01479301948052*G0_0_1_5_9 + 0.0078896103896107*G0_0_1_6_0 + 0.00402698863636379*G0_0_1_6_1 + 0.0345170454545467*G0_0_1_6_2 - 0.01479301948052*G0_0_1_6_3 + 0.024408482142858*G0_0_1_6_4 - 0.023668831168832*G0_0_1_6_5 + 0.10355113636364*G0_0_1_6_6 - 0.002958603896104*G0_0_1_6_8 + 0.020710227272728*G0_0_1_6_9 - 0.00205458603896113*G0_0_1_7_0 + 0.000246550324675328*G0_0_1_7_1 - 0.000904017857142889*G0_0_1_7_2 - 0.01109476461039*G0_0_1_7_3 - 0.000739650974026001*G0_0_1_7_4 - 0.00295860389610401*G0_0_1_7_5 - 0.000739650974026001*G0_0_1_7_8 - 0.00887581168831202*G0_0_1_7_9 + 0.00115056818181823*G0_0_1_8_0 - 0.00115056818181821*G0_0_1_8_2 + 0.010355113636364*G0_0_1_8_3 + 0.000739650974025985*G0_0_1_8_4 + 0.00295860389610401*G0_0_1_8_5 - 0.002958603896104*G0_0_1_8_6 - 0.000739650974026001*G0_0_1_8_7 - 0.010355113636364*G0_0_1_8_8 + 0.00295860389610401*G0_0_1_9_0 - 0.000493100649350667*G0_0_1_9_1 + 0.002958603896104*G0_0_1_9_2 + 0.0236688311688321*G0_0_1_9_3 + 0.010355113636364*G0_0_1_9_4 - 0.01479301948052*G0_0_1_9_5 + 0.020710227272728*G0_0_1_9_6 - 0.00887581168831202*G0_0_1_9_7 + 0.0177516233766241*G0_0_1_9_9 + 0.00124188311688315*G0_1_0_0_0 + 0.000913149350649385*G0_1_0_0_1 + 0.000721387987013009*G0_1_0_0_2 + 0.00361607142857157*G0_1_0_0_3 + 0.000164366883116887*G0_1_0_0_4 - 0.00106838474025978*G0_1_0_0_5 + 0.000657467532467555*G0_1_0_0_6 - 0.000821834415584455*G0_1_0_0_7 + 0.00213676948051956*G0_1_0_0_8 + 0.00147930194805201*G0_1_0_0_9 + 0.000913149350649385*G0_1_0_1_0 + 0.0109577922077925*G0_1_0_1_1 + 0.0017715097402598*G0_1_0_1_2 + 0.0135602678571433*G0_1_0_1_3 - 0.00493100649350665*G0_1_0_1_4 + 0.000904017857142884*G0_1_0_1_5 + 0.00189021915584422*G0_1_0_1_6 - 0.00246550324675334*G0_1_0_1_7 + 0.00616375811688334*G0_1_0_1_8 + 0.00739650974026*G0_1_0_1_9 + 0.000721387987013009*G0_1_0_2_0 + 0.0017715097402598*G0_1_0_2_1 + 0.00356128246753254*G0_1_0_2_2 + 0.002958603896104*G0_1_0_2_3 + 0.00123275162337666*G0_1_0_2_4 - 0.000986201298701315*G0_1_0_2_5 + 0.00123275162337663*G0_1_0_2_6 - 0.000575284090909115*G0_1_0_2_7 + 0.00164366883116889*G0_1_0_2_8 + 0.000493100649350671*G0_1_0_2_9 + 0.00361607142857157*G0_1_0_3_0 + 0.0135602678571433*G0_1_0_3_1 + 0.002958603896104*G0_1_0_3_2 + 0.093196022727276*G0_1_0_3_3 - 0.026627435064936*G0_1_0_3_4 - 0.00443790584415599*G0_1_0_3_5 - 0.010355113636364*G0_1_0_3_6 - 0.015532670454546*G0_1_0_3_7 + 0.025148133116884*G0_1_0_3_8 + 0.00887581168831209*G0_1_0_3_9 + 0.000164366883116888*G0_1_0_4_0 - 0.00493100649350665*G0_1_0_4_1 + 0.00123275162337666*G0_1_0_4_2 - 0.026627435064936*G0_1_0_4_3 + 0.026627435064936*G0_1_0_4_4 - 0.00517755681818199*G0_1_0_4_5 + 0.0155326704545459*G0_1_0_4_6 + 0.00295860389610401*G0_1_0_4_7 - 0.00961546266233801*G0_1_0_4_8 + 0.00887581168831194*G0_1_0_4_9 - 0.00106838474025978*G0_1_0_5_0 + 0.000904017857142884*G0_1_0_5_1 - 0.000986201298701316*G0_1_0_5_2 - 0.00443790584415599*G0_1_0_5_3 - 0.00517755681818199*G0_1_0_5_4 + 0.0236688311688319*G0_1_0_5_5 - 0.00813616071428594*G0_1_0_5_6 + 0.010355113636364*G0_1_0_5_7 - 0.00739650974025998*G0_1_0_5_8 + 0.010355113636364*G0_1_0_5_9 + 0.000657467532467555*G0_1_0_6_0 + 0.00189021915584422*G0_1_0_6_1 + 0.00123275162337663*G0_1_0_6_2 - 0.010355113636364*G0_1_0_6_3 + 0.0155326704545459*G0_1_0_6_4 - 0.00813616071428594*G0_1_0_6_5 + 0.0310653409090918*G0_1_0_6_6 - 0.00295860389610398*G0_1_0_6_7 - 0.002958603896104*G0_1_0_6_8 + 0.0192309253246759*G0_1_0_6_9 - 0.000821834415584455*G0_1_0_7_0 - 0.00246550324675334*G0_1_0_7_1 - 0.000575284090909115*G0_1_0_7_2 - 0.015532670454546*G0_1_0_7_3 + 0.00295860389610401*G0_1_0_7_4 + 0.010355113636364*G0_1_0_7_5 - 0.00295860389610398*G0_1_0_7_6 + 0.011834415584416*G0_1_0_7_7 - 0.013313717532468*G0_1_0_7_8 + 0.00147930194805196*G0_1_0_7_9 + 0.00213676948051956*G0_1_0_8_0 + 0.00616375811688334*G0_1_0_8_1 + 0.00164366883116889*G0_1_0_8_2 + 0.025148133116884*G0_1_0_8_3 - 0.00961546266233801*G0_1_0_8_4 - 0.00739650974025998*G0_1_0_8_5 - 0.002958603896104*G0_1_0_8_6 - 0.013313717532468*G0_1_0_8_7 + 0.0192309253246761*G0_1_0_8_8 - 0.00295860389610392*G0_1_0_8_9 + 0.00147930194805201*G0_1_0_9_0 + 0.00739650974026*G0_1_0_9_1 + 0.000493100649350671*G0_1_0_9_2 + 0.00887581168831209*G0_1_0_9_3 + 0.00887581168831194*G0_1_0_9_4 + 0.010355113636364*G0_1_0_9_5 + 0.0192309253246759*G0_1_0_9_6 + 0.00147930194805196*G0_1_0_9_7 - 0.00295860389610393*G0_1_0_9_8 + 0.0532548701298718*G0_1_0_9_9 - 0.00231939935064939*G0_1_1_0_0 - 0.000858360389610418*G0_1_1_0_1 + 0.00197240259740268*G0_1_1_0_3 + 0.000739650974025999*G0_1_1_0_4 - 0.00230113636363642*G0_1_1_0_5 + 0.00164366883116887*G0_1_1_0_6 - 0.00205458603896109*G0_1_1_0_7 - 0.000821834415584456*G0_1_1_0_8 + 0.000986201298701343*G0_1_1_0_9 - 0.000858360389610418*G0_1_1_1_0 + 0.000858360389610416*G0_1_1_1_2 + 0.00739650974025998*G0_1_1_1_3 - 0.00246550324675332*G0_1_1_1_4 - 0.000986201298701329*G0_1_1_1_5 + 0.000986201298701327*G0_1_1_1_6 + 0.00246550324675334*G0_1_1_1_7 - 0.00739650974026001*G0_1_1_1_8 + 0.000858360389610416*G0_1_1_2_1 + 0.00231939935064939*G0_1_1_2_2 + 0.000821834415584448*G0_1_1_2_3 + 0.0020545860389611*G0_1_1_2_4 - 0.00164366883116887*G0_1_1_2_5 + 0.00230113636363641*G0_1_1_2_6 - 0.000739650974025998*G0_1_1_2_7 - 0.00197240259740266*G0_1_1_2_8 - 0.00098620129870133*G0_1_1_2_9 + 0.00197240259740268*G0_1_1_3_0 + 0.00739650974025998*G0_1_1_3_1 + 0.000821834415584448*G0_1_1_3_2 + 0.0739650974026*G0_1_1_3_3 - 0.013313717532468*G0_1_1_3_4 - 0.00147930194805201*G0_1_1_3_5 - 0.00295860389610399*G0_1_1_3_6 - 0.00591720779220802*G0_1_1_3_7 + 0.0118344155844161*G0_1_1_3_9 + 0.000739650974025999*G0_1_1_4_0 - 0.00246550324675332*G0_1_1_4_1 + 0.0020545860389611*G0_1_1_4_2 - 0.013313717532468*G0_1_1_4_3 + 0.01479301948052*G0_1_1_4_4 - 0.00221895292207799*G0_1_1_4_5 + 0.00517755681818198*G0_1_1_4_6 + 0.00591720779220797*G0_1_1_4_8 + 0.00739650974025997*G0_1_1_4_9 - 0.00230113636363642*G0_1_1_5_0 - 0.000986201298701329*G0_1_1_5_1 - 0.00164366883116887*G0_1_1_5_2 - 0.00147930194805201*G0_1_1_5_3 - 0.00221895292207799*G0_1_1_5_4 - 0.00739650974025998*G0_1_1_5_5 - 0.00517755681818197*G0_1_1_5_7 + 0.00295860389610399*G0_1_1_5_8 - 0.00887581168831199*G0_1_1_5_9 + 0.00164366883116887*G0_1_1_6_0 + 0.000986201298701327*G0_1_1_6_1 + 0.00230113636363641*G0_1_1_6_2 - 0.00295860389610399*G0_1_1_6_3 + 0.00517755681818198*G0_1_1_6_4 + 0.00739650974025992*G0_1_1_6_6 + 0.00221895292207799*G0_1_1_6_7 + 0.00147930194805199*G0_1_1_6_8 + 0.00887581168831197*G0_1_1_6_9 - 0.00205458603896109*G0_1_1_7_0 + 0.00246550324675334*G0_1_1_7_1 - 0.000739650974025998*G0_1_1_7_2 - 0.00591720779220803*G0_1_1_7_3 - 0.00517755681818197*G0_1_1_7_5 + 0.00221895292207799*G0_1_1_7_6 - 0.0147930194805199*G0_1_1_7_7 + 0.013313717532468*G0_1_1_7_8 - 0.00739650974026*G0_1_1_7_9 - 0.000821834415584457*G0_1_1_8_0 - 0.00739650974026001*G0_1_1_8_1 - 0.00197240259740266*G0_1_1_8_2 + 0.00591720779220797*G0_1_1_8_4 + 0.00295860389610399*G0_1_1_8_5 + 0.00147930194805199*G0_1_1_8_6 + 0.013313717532468*G0_1_1_8_7 - 0.0739650974025999*G0_1_1_8_8 - 0.011834415584416*G0_1_1_8_9 + 0.000986201298701343*G0_1_1_9_0 - 0.00098620129870133*G0_1_1_9_2 + 0.0118344155844161*G0_1_1_9_3 + 0.00739650974025997*G0_1_1_9_4 - 0.00887581168831199*G0_1_1_9_5 + 0.00887581168831197*G0_1_1_9_6 - 0.00739650974026001*G0_1_1_9_7 - 0.011834415584416*G0_1_1_9_8; + A[85] = -A[35] + 0.014701704545455*G0_0_0_0_0 + 0.000264813311688324*G0_0_0_0_1 + 0.00144277597402601*G0_0_0_0_2 + 0.00197240259740267*G0_0_0_0_3 + 0.00147930194805201*G0_0_0_0_4 + 0.0198883928571435*G0_0_0_0_5 - 0.0166010551948057*G0_0_0_0_6 + 0.0101085633116887*G0_0_0_0_7 - 0.002958603896104*G0_0_0_0_8 + 0.00887581168831201*G0_0_0_0_9 + 0.000264813311688324*G0_0_0_1_0 - 0.00273944805194806*G0_0_0_1_1 - 0.00136059253246758*G0_0_0_1_2 - 0.00657467532467551*G0_0_0_1_3 - 0.000904017857142908*G0_0_0_1_4 + 0.00961546266233798*G0_0_0_1_5 + 0.00271205357142867*G0_0_0_1_6 + 0.00238331980519487*G0_0_0_1_7 - 0.000821834415584414*G0_0_0_1_8 + 0.00345170454545466*G0_0_0_1_9 + 0.00144277597402601*G0_0_0_2_0 - 0.00136059253246758*G0_0_0_2_1 - 0.0347909902597415*G0_0_0_2_2 + 0.00345170454545468*G0_0_0_2_3 - 0.01479301948052*G0_0_0_2_4 + 0.00788961038961071*G0_0_0_2_5 - 0.0221895292207801*G0_0_0_2_6 - 0.002218952922078*G0_0_0_2_7 - 0.00197240259740266*G0_0_0_2_8 - 0.0138068181818186*G0_0_0_2_9 + 0.00197240259740267*G0_0_0_3_0 - 0.00657467532467551*G0_0_0_3_1 + 0.00345170454545468*G0_0_0_3_2 + 0.0310653409090921*G0_0_0_3_3 + 0.019970576298702*G0_0_0_3_4 - 0.0177516233766239*G0_0_0_3_5 - 0.00739650974025995*G0_0_0_3_6 - 0.005177556818182*G0_0_0_3_7 - 0.00147930194805198*G0_0_0_3_8 + 0.001479301948052*G0_0_0_4_0 - 0.000904017857142908*G0_0_0_4_1 - 0.01479301948052*G0_0_0_4_2 + 0.019970576298702*G0_0_0_4_3 + 0.0843202110389639*G0_0_0_4_4 - 0.00369825487013*G0_0_0_4_5 + 0.0110947646103899*G0_0_0_4_6 + 0.000739650974026014*G0_0_0_4_7 + 0.00665685876623398*G0_0_0_4_8 + 0.0488169642857159*G0_0_0_4_9 + 0.0198883928571435*G0_0_0_5_0 + 0.00961546266233798*G0_0_0_5_1 + 0.00788961038961071*G0_0_0_5_2 - 0.0177516233766239*G0_0_0_5_3 - 0.00369825487013001*G0_0_0_5_4 + 0.257398538961048*G0_0_0_5_5 + 0.011834415584416*G0_0_0_5_6 + 0.020710227272728*G0_0_0_5_7 - 0.028106737012988*G0_0_0_5_8 + 0.02958603896104*G0_0_0_5_9 - 0.0166010551948057*G0_0_0_6_0 + 0.00271205357142867*G0_0_0_6_1 - 0.0221895292207801*G0_0_0_6_2 - 0.00739650974025994*G0_0_0_6_3 + 0.0110947646103899*G0_0_0_6_4 + 0.011834415584416*G0_0_0_6_5 + 0.130178571428576*G0_0_0_6_6 + 0.00739650974026001*G0_0_0_6_7 - 0.00147930194805199*G0_0_0_6_8 + 0.0562134740259759*G0_0_0_6_9 + 0.0101085633116887*G0_0_0_7_0 + 0.00238331980519487*G0_0_0_7_1 - 0.002218952922078*G0_0_0_7_2 - 0.005177556818182*G0_0_0_7_3 + 0.000739650974026014*G0_0_0_7_4 + 0.020710227272728*G0_0_0_7_5 + 0.00739650974026001*G0_0_0_7_6 - 0.032544642857144*G0_0_0_7_7 - 0.00517755681818201*G0_0_0_7_8 - 0.041420454545456*G0_0_0_7_9 - 0.00295860389610401*G0_0_0_8_0 - 0.000821834415584414*G0_0_0_8_1 - 0.00197240259740266*G0_0_0_8_2 - 0.00147930194805198*G0_0_0_8_3 + 0.00665685876623398*G0_0_0_8_4 - 0.028106737012988*G0_0_0_8_5 - 0.00147930194805199*G0_0_0_8_6 - 0.00517755681818201*G0_0_0_8_7 - 0.0133137175324679*G0_0_0_8_8 - 0.0236688311688319*G0_0_0_8_9 + 0.00887581168831202*G0_0_0_9_0 + 0.00345170454545466*G0_0_0_9_1 - 0.0138068181818186*G0_0_0_9_2 + 0.0488169642857159*G0_0_0_9_4 + 0.02958603896104*G0_0_0_9_5 + 0.0562134740259759*G0_0_0_9_6 - 0.041420454545456*G0_0_0_9_7 - 0.0236688311688319*G0_0_0_9_8 - 0.230771103896111*G0_0_0_9_9 - 0.0778916396103923*G0_0_1_0_0 - 0.00346996753246765*G0_0_1_0_1 - 0.00561586850649371*G0_0_1_0_2 + 0.00197240259740268*G0_0_1_0_3 + 0.00295860389610401*G0_0_1_0_4 - 0.0528439529220797*G0_0_1_0_5 + 0.0179159902597409*G0_0_1_0_6 - 0.0305722402597413*G0_0_1_0_7 + 0.0142999188311693*G0_0_1_0_8 - 0.00838271103896135*G0_0_1_0_9 - 0.00346996753246765*G0_0_1_1_0 - 0.00146103896103902*G0_0_1_1_2 - 0.00328733766233776*G0_0_1_1_3 - 0.00156148538961045*G0_0_1_1_4 + 0.00493100649350667*G0_0_1_1_6 - 0.00238331980519489*G0_0_1_1_7 + 0.00328733766233779*G0_0_1_1_8 + 0.00394480519480532*G0_0_1_1_9 - 0.00561586850649371*G0_0_1_2_0 - 0.00146103896103902*G0_0_1_2_1 - 0.0331655844155856*G0_0_1_2_2 + 0.00295860389610401*G0_0_1_2_3 - 0.013313717532468*G0_0_1_2_4 - 0.00410917207792217*G0_0_1_2_5 - 0.0137246347402603*G0_0_1_2_6 + 0.000493100649350672*G0_0_1_2_7 - 0.00739650974025999*G0_0_1_2_9 + 0.00197240259740268*G0_0_1_3_0 - 0.00328733766233776*G0_0_1_3_1 + 0.00295860389610401*G0_0_1_3_2 + 0.020710227272728*G0_0_1_3_3 + 0.019230925324676*G0_0_1_3_4 - 0.00591720779220798*G0_0_1_3_5 - 0.00887581168831194*G0_0_1_3_6 - 0.00591720779220798*G0_0_1_3_8 - 0.011834415584416*G0_0_1_3_9 + 0.00295860389610401*G0_0_1_4_0 - 0.00156148538961045*G0_0_1_4_1 - 0.013313717532468*G0_0_1_4_2 + 0.019230925324676*G0_0_1_4_3 + 0.075444399350652*G0_0_1_4_4 - 0.00295860389610399*G0_0_1_4_5 + 0.011834415584416*G0_0_1_4_6 - 0.008136160714286*G0_0_1_4_7 + 0.00591720779220798*G0_0_1_4_8 + 0.028106737012988*G0_0_1_4_9 - 0.0528439529220797*G0_0_1_5_0 - 0.00410917207792217*G0_0_1_5_2 - 0.00591720779220798*G0_0_1_5_3 - 0.00295860389610399*G0_0_1_5_4 + 0.0569531250000019*G0_0_1_5_6 - 0.010355113636364*G0_0_1_5_7 + 0.00591720779220801*G0_0_1_5_8 + 0.0133137175324679*G0_0_1_5_9 + 0.0179159902597409*G0_0_1_6_0 + 0.00493100649350667*G0_0_1_6_1 - 0.0137246347402603*G0_0_1_6_2 - 0.00887581168831194*G0_0_1_6_3 + 0.011834415584416*G0_0_1_6_4 + 0.0569531250000019*G0_0_1_6_5 + 0.113906250000004*G0_0_1_6_6 + 0.00443790584415599*G0_0_1_6_7 - 0.010355113636364*G0_0_1_6_8 + 0.039941152597404*G0_0_1_6_9 - 0.0305722402597413*G0_0_1_7_0 - 0.00238331980519489*G0_0_1_7_1 + 0.000493100649350671*G0_0_1_7_2 - 0.008136160714286*G0_0_1_7_4 - 0.010355113636364*G0_0_1_7_5 + 0.00443790584415599*G0_0_1_7_6 + 0.0650892857142882*G0_0_1_7_7 + 0.0103551136363639*G0_0_1_7_8 + 0.016272321428572*G0_0_1_7_9 + 0.0142999188311693*G0_0_1_8_0 + 0.00328733766233779*G0_0_1_8_1 - 0.00591720779220798*G0_0_1_8_3 + 0.00591720779220798*G0_0_1_8_4 + 0.00591720779220801*G0_0_1_8_5 - 0.010355113636364*G0_0_1_8_6 + 0.0103551136363639*G0_0_1_8_7 - 0.00887581168831197*G0_0_1_8_8 - 0.0236688311688319*G0_0_1_8_9 - 0.00838271103896135*G0_0_1_9_0 + 0.00394480519480532*G0_0_1_9_1 - 0.00739650974025999*G0_0_1_9_2 - 0.011834415584416*G0_0_1_9_3 + 0.028106737012988*G0_0_1_9_4 + 0.0133137175324679*G0_0_1_9_5 + 0.039941152597404*G0_0_1_9_6 + 0.016272321428572*G0_0_1_9_7 - 0.0236688311688319*G0_0_1_9_8 - 0.213019480519487*G0_0_1_9_9; + A[58] = A[85] + 0.0734172077922102*G0_0_1_0_0 + 0.00276684253246762*G0_0_1_0_1 + 0.00386262175324688*G0_0_1_0_2 - 0.00262987012987023*G0_0_1_0_3 - 0.000164366883116892*G0_0_1_0_4 + 0.0456118100649366*G0_0_1_0_5 - 0.0167654220779226*G0_0_1_0_6 + 0.0283532873376632*G0_0_1_0_7 - 0.0142999188311693*G0_0_1_0_8 + 0.00641030844155868*G0_0_1_0_9 + 0.00276684253246762*G0_0_1_1_0 - 0.00447443181818189*G0_0_1_1_1 - 0.000292207792207798*G0_0_1_1_2 - 0.00394480519480531*G0_0_1_1_3 + 0.00271205357142865*G0_0_1_1_4 - 0.000657467532467561*G0_0_1_1_5 - 0.00213676948051956*G0_0_1_1_6 + 0.00238331980519486*G0_0_1_1_7 - 0.00550629058441574*G0_0_1_1_8 - 0.00591720779220799*G0_0_1_1_9 + 0.00386262175324688*G0_0_1_2_0 - 0.000292207792207797*G0_0_1_2_1 + 0.00138798701298707*G0_0_1_2_2 - 0.000986201298701338*G0_0_1_2_3 + 0.000986201298701347*G0_0_1_2_4 + 0.00608157467532486*G0_0_1_2_5 + 0.00139711850649357*G0_0_1_2_6 - 0.000657467532467561*G0_0_1_2_7 - 0.000164366883116886*G0_0_1_2_8 + 0.00345170454545466*G0_0_1_2_9 - 0.00262987012987023*G0_0_1_3_0 - 0.0039448051948053*G0_0_1_3_1 - 0.000986201298701338*G0_0_1_3_2 - 0.0207102272727281*G0_0_1_3_3 + 0.00147930194805199*G0_0_1_3_4 + 0.00591720779220799*G0_0_1_3_5 + 0.00443790584415599*G0_0_1_3_6 + 0.00591720779220802*G0_0_1_3_7 - 0.00443790584415601*G0_0_1_3_8 + 0.00591720779220795*G0_0_1_3_9 - 0.000164366883116891*G0_0_1_4_0 + 0.00271205357142865*G0_0_1_4_1 + 0.000986201298701347*G0_0_1_4_2 + 0.00147930194805199*G0_0_1_4_3 - 0.00295860389610392*G0_0_1_4_4 - 0.001479301948052*G0_0_1_4_5 - 0.00295860389610399*G0_0_1_4_6 + 0.002218952922078*G0_0_1_4_7 - 0.001479301948052*G0_0_1_4_8 - 0.00739650974025998*G0_0_1_4_9 + 0.0456118100649366*G0_0_1_5_0 - 0.000657467532467561*G0_0_1_5_1 + 0.00608157467532486*G0_0_1_5_2 + 0.00591720779220799*G0_0_1_5_3 - 0.001479301948052*G0_0_1_5_4 - 0.0362428977272739*G0_0_1_5_6 - 0.019230925324676*G0_0_1_5_9 - 0.0167654220779226*G0_0_1_6_0 - 0.00213676948051956*G0_0_1_6_1 + 0.00139711850649357*G0_0_1_6_2 + 0.00443790584415598*G0_0_1_6_3 - 0.00295860389610398*G0_0_1_6_4 - 0.0362428977272739*G0_0_1_6_5 - 0.041420454545456*G0_0_1_6_6 + 0.00443790584415599*G0_0_1_6_8 - 0.019230925324676*G0_0_1_6_9 + 0.0283532873376632*G0_0_1_7_0 + 0.00238331980519486*G0_0_1_7_1 - 0.000657467532467561*G0_0_1_7_2 + 0.00591720779220803*G0_0_1_7_3 + 0.002218952922078*G0_0_1_7_4 - 0.0739650974026002*G0_0_1_7_7 + 0.000739650974026027*G0_0_1_7_8 - 0.019230925324676*G0_0_1_7_9 - 0.0142999188311693*G0_0_1_8_0 - 0.00550629058441573*G0_0_1_8_1 - 0.000164366883116886*G0_0_1_8_2 - 0.00443790584415601*G0_0_1_8_3 - 0.001479301948052*G0_0_1_8_4 + 0.00443790584415599*G0_0_1_8_6 + 0.000739650974026027*G0_0_1_8_7 + 0.020710227272728*G0_0_1_8_9 + 0.00641030844155868*G0_0_1_9_0 - 0.00591720779220799*G0_0_1_9_1 + 0.00345170454545466*G0_0_1_9_2 + 0.00591720779220795*G0_0_1_9_3 - 0.00739650974025998*G0_0_1_9_4 - 0.019230925324676*G0_0_1_9_5 - 0.019230925324676*G0_0_1_9_6 - 0.019230925324676*G0_0_1_9_7 + 0.020710227272728*G0_0_1_9_8 + 0.0887581168831197*G0_0_1_9_9 - 0.0734172077922102*G0_1_0_0_0 - 0.00276684253246762*G0_1_0_0_1 - 0.00386262175324688*G0_1_0_0_2 + 0.00262987012987023*G0_1_0_0_3 + 0.000164366883116891*G0_1_0_0_4 - 0.0456118100649366*G0_1_0_0_5 + 0.0167654220779226*G0_1_0_0_6 - 0.0283532873376632*G0_1_0_0_7 + 0.0142999188311693*G0_1_0_0_8 - 0.00641030844155868*G0_1_0_0_9 - 0.00276684253246762*G0_1_0_1_0 + 0.00447443181818189*G0_1_0_1_1 + 0.000292207792207798*G0_1_0_1_2 + 0.00394480519480531*G0_1_0_1_3 - 0.00271205357142865*G0_1_0_1_4 + 0.00065746753246756*G0_1_0_1_5 + 0.00213676948051956*G0_1_0_1_6 - 0.00238331980519486*G0_1_0_1_7 + 0.00550629058441574*G0_1_0_1_8 + 0.00591720779220799*G0_1_0_1_9 - 0.00386262175324688*G0_1_0_2_0 + 0.000292207792207797*G0_1_0_2_1 - 0.00138798701298707*G0_1_0_2_2 + 0.000986201298701338*G0_1_0_2_3 - 0.000986201298701347*G0_1_0_2_4 - 0.00608157467532486*G0_1_0_2_5 - 0.00139711850649357*G0_1_0_2_6 + 0.000657467532467562*G0_1_0_2_7 + 0.000164366883116886*G0_1_0_2_8 - 0.00345170454545466*G0_1_0_2_9 + 0.00262987012987023*G0_1_0_3_0 + 0.00394480519480531*G0_1_0_3_1 + 0.000986201298701338*G0_1_0_3_2 + 0.0207102272727281*G0_1_0_3_3 - 0.00147930194805199*G0_1_0_3_4 - 0.00591720779220799*G0_1_0_3_5 - 0.00443790584415598*G0_1_0_3_6 - 0.00591720779220803*G0_1_0_3_7 + 0.00443790584415601*G0_1_0_3_8 - 0.00591720779220795*G0_1_0_3_9 + 0.000164366883116891*G0_1_0_4_0 - 0.00271205357142865*G0_1_0_4_1 - 0.000986201298701347*G0_1_0_4_2 - 0.00147930194805199*G0_1_0_4_3 + 0.00295860389610392*G0_1_0_4_4 + 0.001479301948052*G0_1_0_4_5 + 0.00295860389610399*G0_1_0_4_6 - 0.002218952922078*G0_1_0_4_7 + 0.001479301948052*G0_1_0_4_8 + 0.00739650974025997*G0_1_0_4_9 - 0.0456118100649366*G0_1_0_5_0 + 0.000657467532467561*G0_1_0_5_1 - 0.00608157467532486*G0_1_0_5_2 - 0.00591720779220799*G0_1_0_5_3 + 0.001479301948052*G0_1_0_5_4 + 0.0362428977272739*G0_1_0_5_6 + 0.019230925324676*G0_1_0_5_9 + 0.0167654220779226*G0_1_0_6_0 + 0.00213676948051956*G0_1_0_6_1 - 0.00139711850649357*G0_1_0_6_2 - 0.00443790584415598*G0_1_0_6_3 + 0.00295860389610399*G0_1_0_6_4 + 0.0362428977272739*G0_1_0_6_5 + 0.041420454545456*G0_1_0_6_6 - 0.00443790584415599*G0_1_0_6_8 + 0.019230925324676*G0_1_0_6_9 - 0.0283532873376632*G0_1_0_7_0 - 0.00238331980519486*G0_1_0_7_1 + 0.000657467532467561*G0_1_0_7_2 - 0.00591720779220802*G0_1_0_7_3 - 0.002218952922078*G0_1_0_7_4 + 0.0739650974026002*G0_1_0_7_7 - 0.000739650974026027*G0_1_0_7_8 + 0.019230925324676*G0_1_0_7_9 + 0.0142999188311693*G0_1_0_8_0 + 0.00550629058441573*G0_1_0_8_1 + 0.000164366883116886*G0_1_0_8_2 + 0.00443790584415601*G0_1_0_8_3 + 0.001479301948052*G0_1_0_8_4 - 0.00443790584415599*G0_1_0_8_6 - 0.000739650974026026*G0_1_0_8_7 - 0.020710227272728*G0_1_0_8_9 - 0.00641030844155868*G0_1_0_9_0 + 0.00591720779220799*G0_1_0_9_1 - 0.00345170454545466*G0_1_0_9_2 - 0.00591720779220795*G0_1_0_9_3 + 0.00739650974025997*G0_1_0_9_4 + 0.019230925324676*G0_1_0_9_5 + 0.019230925324676*G0_1_0_9_6 + 0.019230925324676*G0_1_0_9_7 - 0.020710227272728*G0_1_0_9_8 - 0.0887581168831197*G0_1_0_9_9; + A[57] = A[75] - 0.161627435064941*G0_0_1_0_0 - 0.00904017857142888*G0_0_1_0_1 - 0.00904017857142887*G0_0_1_0_2 + 0.0032873376623378*G0_0_1_0_3 + 0.00328733766233778*G0_0_1_0_4 - 0.0912236201298731*G0_0_1_0_5 + 0.0394480519480532*G0_0_1_0_6 - 0.0912236201298732*G0_0_1_0_7 + 0.0394480519480533*G0_0_1_0_8 - 0.0246550324675334*G0_0_1_0_9 - 0.00904017857142888*G0_0_1_1_0 + 0.0017167207792208*G0_0_1_1_1 - 0.000127840909090912*G0_0_1_1_2 - 0.000493100649350664*G0_0_1_1_4 + 0.00180803571428578*G0_0_1_1_5 + 0.0020545860389611*G0_0_1_1_6 - 0.00673904220779242*G0_0_1_1_7 + 0.000904017857142882*G0_0_1_1_8 + 0.00690340909090934*G0_0_1_1_9 - 0.00904017857142887*G0_0_1_2_0 - 0.000127840909090912*G0_0_1_2_1 + 0.00171672077922086*G0_0_1_2_2 - 0.00049310064935067*G0_0_1_2_3 - 0.00673904220779243*G0_0_1_2_5 + 0.0009040178571429*G0_0_1_2_6 + 0.00180803571428579*G0_0_1_2_7 + 0.0020545860389611*G0_0_1_2_8 + 0.00690340909090934*G0_0_1_2_9 + 0.0032873376623378*G0_0_1_3_0 - 0.00049310064935067*G0_0_1_3_2 + 0.0118344155844161*G0_0_1_3_3 - 0.00147930194805198*G0_0_1_3_4 - 0.010355113636364*G0_0_1_3_5 - 0.00073965097402599*G0_0_1_3_6 - 0.004437905844156*G0_0_1_3_7 + 0.00517755681818199*G0_0_1_3_8 - 0.011834415584416*G0_0_1_3_9 + 0.00328733766233778*G0_0_1_4_0 - 0.000493100649350664*G0_0_1_4_1 - 0.00147930194805198*G0_0_1_4_3 + 0.0118344155844159*G0_0_1_4_4 - 0.004437905844156*G0_0_1_4_5 + 0.00517755681818199*G0_0_1_4_6 - 0.010355113636364*G0_0_1_4_7 - 0.000739650974025993*G0_0_1_4_8 - 0.011834415584416*G0_0_1_4_9 - 0.0912236201298731*G0_0_1_5_0 + 0.00180803571428578*G0_0_1_5_1 - 0.00673904220779242*G0_0_1_5_2 - 0.010355113636364*G0_0_1_5_3 - 0.004437905844156*G0_0_1_5_4 + 0.0369825487012999*G0_0_1_5_6 + 0.0739650974025999*G0_0_1_5_9 + 0.0394480519480532*G0_0_1_6_0 + 0.0020545860389611*G0_0_1_6_1 + 0.000904017857142901*G0_0_1_6_2 - 0.000739650974025989*G0_0_1_6_3 + 0.00517755681818199*G0_0_1_6_4 + 0.0369825487012999*G0_0_1_6_5 - 0.00147930194805204*G0_0_1_6_6 - 0.00887581168831197*G0_0_1_6_8 - 0.019230925324676*G0_0_1_6_9 - 0.0912236201298732*G0_0_1_7_0 - 0.00673904220779242*G0_0_1_7_1 + 0.00180803571428579*G0_0_1_7_2 - 0.00443790584415601*G0_0_1_7_3 - 0.010355113636364*G0_0_1_7_4 + 0.0369825487013*G0_0_1_7_8 + 0.0739650974026*G0_0_1_7_9 + 0.0394480519480533*G0_0_1_8_0 + 0.000904017857142882*G0_0_1_8_1 + 0.0020545860389611*G0_0_1_8_2 + 0.00517755681818199*G0_0_1_8_3 - 0.000739650974025993*G0_0_1_8_4 - 0.00887581168831197*G0_0_1_8_6 + 0.0369825487013*G0_0_1_8_7 - 0.001479301948052*G0_0_1_8_8 - 0.019230925324676*G0_0_1_8_9 - 0.0246550324675334*G0_0_1_9_0 + 0.00690340909090934*G0_0_1_9_1 + 0.00690340909090934*G0_0_1_9_2 - 0.011834415584416*G0_0_1_9_3 - 0.011834415584416*G0_0_1_9_4 + 0.0739650974025999*G0_0_1_9_5 - 0.019230925324676*G0_0_1_9_6 + 0.0739650974026*G0_0_1_9_7 - 0.019230925324676*G0_0_1_9_8 + 0.142012987012992*G0_0_1_9_9 + 0.161627435064941*G0_1_0_0_0 + 0.00904017857142888*G0_1_0_0_1 + 0.00904017857142887*G0_1_0_0_2 - 0.0032873376623378*G0_1_0_0_3 - 0.00328733766233778*G0_1_0_0_4 + 0.0912236201298731*G0_1_0_0_5 - 0.0394480519480532*G0_1_0_0_6 + 0.0912236201298732*G0_1_0_0_7 - 0.0394480519480533*G0_1_0_0_8 + 0.0246550324675334*G0_1_0_0_9 + 0.00904017857142888*G0_1_0_1_0 - 0.0017167207792208*G0_1_0_1_1 + 0.000127840909090912*G0_1_0_1_2 + 0.000493100649350665*G0_1_0_1_4 - 0.00180803571428577*G0_1_0_1_5 - 0.0020545860389611*G0_1_0_1_6 + 0.00673904220779242*G0_1_0_1_7 - 0.000904017857142882*G0_1_0_1_8 - 0.00690340909090934*G0_1_0_1_9 + 0.00904017857142887*G0_1_0_2_0 + 0.000127840909090912*G0_1_0_2_1 - 0.00171672077922086*G0_1_0_2_2 + 0.000493100649350669*G0_1_0_2_3 + 0.00673904220779243*G0_1_0_2_5 - 0.000904017857142899*G0_1_0_2_6 - 0.00180803571428579*G0_1_0_2_7 - 0.0020545860389611*G0_1_0_2_8 - 0.00690340909090933*G0_1_0_2_9 - 0.0032873376623378*G0_1_0_3_0 + 0.000493100649350669*G0_1_0_3_2 - 0.011834415584416*G0_1_0_3_3 + 0.00147930194805198*G0_1_0_3_4 + 0.010355113636364*G0_1_0_3_5 + 0.000739650974025991*G0_1_0_3_6 + 0.004437905844156*G0_1_0_3_7 - 0.00517755681818199*G0_1_0_3_8 + 0.011834415584416*G0_1_0_3_9 - 0.00328733766233778*G0_1_0_4_0 + 0.000493100649350664*G0_1_0_4_1 + 0.00147930194805198*G0_1_0_4_3 - 0.0118344155844159*G0_1_0_4_4 + 0.004437905844156*G0_1_0_4_5 - 0.00517755681818199*G0_1_0_4_6 + 0.010355113636364*G0_1_0_4_7 + 0.000739650974025993*G0_1_0_4_8 + 0.011834415584416*G0_1_0_4_9 + 0.0912236201298731*G0_1_0_5_0 - 0.00180803571428577*G0_1_0_5_1 + 0.00673904220779243*G0_1_0_5_2 + 0.010355113636364*G0_1_0_5_3 + 0.004437905844156*G0_1_0_5_4 - 0.0369825487012999*G0_1_0_5_6 - 0.0739650974025999*G0_1_0_5_9 - 0.0394480519480533*G0_1_0_6_0 - 0.0020545860389611*G0_1_0_6_1 - 0.000904017857142901*G0_1_0_6_2 + 0.00073965097402599*G0_1_0_6_3 - 0.00517755681818199*G0_1_0_6_4 - 0.0369825487012999*G0_1_0_6_5 + 0.00147930194805204*G0_1_0_6_6 + 0.00887581168831197*G0_1_0_6_8 + 0.019230925324676*G0_1_0_6_9 + 0.0912236201298732*G0_1_0_7_0 + 0.00673904220779242*G0_1_0_7_1 - 0.00180803571428579*G0_1_0_7_2 + 0.004437905844156*G0_1_0_7_3 + 0.010355113636364*G0_1_0_7_4 - 0.0369825487013*G0_1_0_7_8 - 0.0739650974026*G0_1_0_7_9 - 0.0394480519480533*G0_1_0_8_0 - 0.000904017857142882*G0_1_0_8_1 - 0.0020545860389611*G0_1_0_8_2 - 0.00517755681818199*G0_1_0_8_3 + 0.000739650974025993*G0_1_0_8_4 + 0.00887581168831197*G0_1_0_8_6 - 0.0369825487013*G0_1_0_8_7 + 0.001479301948052*G0_1_0_8_8 + 0.019230925324676*G0_1_0_8_9 + 0.0246550324675334*G0_1_0_9_0 - 0.00690340909090934*G0_1_0_9_1 - 0.00690340909090933*G0_1_0_9_2 + 0.011834415584416*G0_1_0_9_3 + 0.011834415584416*G0_1_0_9_4 - 0.0739650974025999*G0_1_0_9_5 + 0.019230925324676*G0_1_0_9_6 - 0.0739650974026*G0_1_0_9_7 + 0.019230925324676*G0_1_0_9_8 - 0.142012987012992*G0_1_0_9_9; + A[74] = A[35] - 0.00648336038961067*G0_0_0_0_0 - 0.000401785714285733*G0_0_0_0_1 + 0.000173498376623393*G0_0_0_0_2 - 0.00369825487013001*G0_0_0_0_3 - 0.00123275162337666*G0_0_0_0_4 - 0.00608157467532493*G0_0_0_0_5 + 0.00525974025974044*G0_0_0_0_6 - 0.0041913555194807*G0_0_0_0_7 + 0.000986201298701351*G0_0_0_0_8 - 0.00542410714285735*G0_0_0_0_9 - 0.000401785714285734*G0_0_0_1_0 - 0.00416396103896119*G0_0_0_1_1 + 0.00103185876623381*G0_0_0_1_2 - 0.00402698863636377*G0_0_0_1_3 + 0.00608157467532488*G0_0_0_1_4 - 0.004437905844156*G0_0_0_1_5 - 0.00320515422077933*G0_0_0_1_6 - 0.000657467532467558*G0_0_0_1_7 - 0.00189021915584422*G0_0_0_1_8 - 0.00641030844155867*G0_0_0_1_9 + 0.000173498376623393*G0_0_0_2_0 + 0.00103185876623381*G0_0_0_2_1 + 0.0356128246753259*G0_0_0_2_2 - 0.008875811688312*G0_0_0_2_3 + 0.0234222808441567*G0_0_0_2_4 - 0.00641030844155871*G0_0_0_2_5 + 0.0160257711038967*G0_0_0_2_6 + 0.000986201298701332*G0_0_0_2_8 + 0.010355113636364*G0_0_0_2_9 - 0.00369825487013001*G0_0_0_3_0 - 0.00402698863636377*G0_0_0_3_1 - 0.008875811688312*G0_0_0_3_2 - 0.090237418831172*G0_0_0_3_3 - 0.012574066558442*G0_0_0_3_4 + 0.011834415584416*G0_0_0_3_5 + 0.0103551136363639*G0_0_0_3_6 + 0.011834415584416*G0_0_0_3_7 - 0.00961546266233802*G0_0_0_3_8 - 0.00443790584415607*G0_0_0_3_9 - 0.00123275162337666*G0_0_0_4_0 + 0.00608157467532488*G0_0_0_4_1 + 0.0234222808441567*G0_0_0_4_2 - 0.012574066558442*G0_0_0_4_3 - 0.0369825487012999*G0_0_0_4_4 + 0.00443790584415599*G0_0_0_4_5 - 0.0147930194805199*G0_0_0_4_6 + 0.00147930194805199*G0_0_0_4_7 - 0.00221895292207799*G0_0_0_4_8 - 0.0399411525974039*G0_0_0_4_9 - 0.00608157467532493*G0_0_0_5_0 - 0.004437905844156*G0_0_0_5_1 - 0.00641030844155871*G0_0_0_5_2 + 0.011834415584416*G0_0_0_5_3 + 0.00443790584415599*G0_0_0_5_4 - 0.105030438311692*G0_0_0_5_5 + 0.000739650974026014*G0_0_0_5_6 - 0.01479301948052*G0_0_0_5_7 + 0.014053368506494*G0_0_0_5_8 - 0.011834415584416*G0_0_0_5_9 + 0.00525974025974044*G0_0_0_6_0 - 0.00320515422077933*G0_0_0_6_1 + 0.0160257711038967*G0_0_0_6_2 + 0.0103551136363639*G0_0_0_6_3 - 0.0147930194805199*G0_0_0_6_4 + 0.000739650974026018*G0_0_0_6_5 - 0.1109476461039*G0_0_0_6_6 + 0.000739650974026001*G0_0_0_6_7 + 0.00295860389610398*G0_0_0_6_8 - 0.0517755681818199*G0_0_0_6_9 - 0.0041913555194807*G0_0_0_7_0 - 0.000657467532467558*G0_0_0_7_1 + 0.011834415584416*G0_0_0_7_3 + 0.00147930194805199*G0_0_0_7_4 - 0.01479301948052*G0_0_0_7_5 + 0.000739650974026*G0_0_0_7_6 + 0.00147930194805197*G0_0_0_7_7 + 0.00739650974026005*G0_0_0_7_8 + 0.01479301948052*G0_0_0_7_9 + 0.000986201298701351*G0_0_0_8_0 - 0.00189021915584422*G0_0_0_8_1 + 0.000986201298701332*G0_0_0_8_2 - 0.00961546266233802*G0_0_0_8_3 - 0.00221895292207799*G0_0_0_8_4 + 0.014053368506494*G0_0_0_8_5 + 0.00295860389610398*G0_0_0_8_6 + 0.00739650974026004*G0_0_0_8_7 + 0.008875811688312*G0_0_0_8_8 + 0.023668831168832*G0_0_0_8_9 - 0.00542410714285735*G0_0_0_9_0 - 0.00641030844155867*G0_0_0_9_1 + 0.010355113636364*G0_0_0_9_2 - 0.00443790584415607*G0_0_0_9_3 - 0.0399411525974039*G0_0_0_9_4 - 0.011834415584416*G0_0_0_9_5 - 0.0517755681818199*G0_0_0_9_6 + 0.01479301948052*G0_0_0_9_7 + 0.023668831168832*G0_0_0_9_8 + 0.0710064935064957*G0_0_0_9_9 - 0.00124188311688317*G0_0_1_0_1 + 0.00124188311688317*G0_0_1_0_2 + 0.00525974025974039*G0_0_1_0_5 + 0.000328733766233779*G0_0_1_0_6 - 0.00525974025974047*G0_0_1_0_7 - 0.000328733766233762*G0_0_1_0_8 - 0.00124188311688317*G0_0_1_1_0 - 0.0346996753246765*G0_0_1_1_1 - 0.0174228896103902*G0_0_1_1_3 + 0.00871144480519508*G0_0_1_1_4 - 0.000986201298701337*G0_0_1_1_5 - 0.00320515422077933*G0_0_1_1_6 + 0.00345170454545467*G0_0_1_1_7 - 0.0150395698051954*G0_0_1_1_8 - 0.008875811688312*G0_0_1_1_9 + 0.00124188311688317*G0_0_1_2_0 + 0.0346996753246765*G0_0_1_2_2 - 0.00871144480519511*G0_0_1_2_3 + 0.0174228896103902*G0_0_1_2_4 - 0.0034517045454547*G0_0_1_2_5 + 0.0150395698051954*G0_0_1_2_6 + 0.000986201298701335*G0_0_1_2_7 + 0.00320515422077933*G0_0_1_2_8 + 0.00887581168831198*G0_0_1_2_9 - 0.0174228896103902*G0_0_1_3_1 - 0.00871144480519511*G0_0_1_3_2 + 0.00591720779220811*G0_0_1_3_3 + 0.001479301948052*G0_0_1_3_5 + 0.00961546266233795*G0_0_1_3_6 + 0.00961546266233795*G0_0_1_3_8 + 0.0266274350649359*G0_0_1_3_9 + 0.00871144480519508*G0_0_1_4_1 + 0.0174228896103902*G0_0_1_4_2 - 0.00591720779220788*G0_0_1_4_4 - 0.00961546266233794*G0_0_1_4_6 - 0.00147930194805202*G0_0_1_4_7 - 0.00961546266233797*G0_0_1_4_8 - 0.0266274350649359*G0_0_1_4_9 + 0.0052597402597404*G0_0_1_5_0 - 0.000986201298701337*G0_0_1_5_1 - 0.0034517045454547*G0_0_1_5_2 + 0.001479301948052*G0_0_1_5_3 - 0.020710227272728*G0_0_1_5_5 - 0.01479301948052*G0_0_1_5_6 + 0.00295860389610401*G0_0_1_5_8 - 0.005917207792208*G0_0_1_5_9 + 0.000328733766233779*G0_0_1_6_0 - 0.00320515422077933*G0_0_1_6_1 + 0.0150395698051954*G0_0_1_6_2 + 0.00961546266233795*G0_0_1_6_3 - 0.00961546266233794*G0_0_1_6_4 - 0.01479301948052*G0_0_1_6_5 - 0.0931960227272758*G0_0_1_6_6 - 0.00295860389610401*G0_0_1_6_7 - 0.0458583603896119*G0_0_1_6_9 - 0.00525974025974047*G0_0_1_7_0 + 0.00345170454545467*G0_0_1_7_1 + 0.000986201298701335*G0_0_1_7_2 - 0.00147930194805202*G0_0_1_7_4 - 0.00295860389610401*G0_0_1_7_6 + 0.020710227272728*G0_0_1_7_7 + 0.0147930194805201*G0_0_1_7_8 + 0.00591720779220803*G0_0_1_7_9 - 0.000328733766233761*G0_0_1_8_0 - 0.0150395698051954*G0_0_1_8_1 + 0.00320515422077933*G0_0_1_8_2 + 0.00961546266233795*G0_0_1_8_3 - 0.00961546266233797*G0_0_1_8_4 + 0.00295860389610401*G0_0_1_8_5 + 0.0147930194805201*G0_0_1_8_7 + 0.093196022727276*G0_0_1_8_8 + 0.0458583603896119*G0_0_1_8_9 - 0.008875811688312*G0_0_1_9_1 + 0.00887581168831198*G0_0_1_9_2 + 0.0266274350649359*G0_0_1_9_3 - 0.0266274350649359*G0_0_1_9_4 - 0.005917207792208*G0_0_1_9_5 - 0.0458583603896119*G0_0_1_9_6 + 0.00591720779220803*G0_0_1_9_7 + 0.0458583603896119*G0_0_1_9_8 - 0.000191761363636365*G0_1_0_0_1 + 0.000191761363636378*G0_1_0_0_2 - 0.00345170454545467*G0_1_0_0_3 + 0.00345170454545468*G0_1_0_0_4 + 0.000246550324675336*G0_1_0_0_5 + 0.001479301948052*G0_1_0_0_6 - 0.000246550324675315*G0_1_0_0_7 - 0.00147930194805201*G0_1_0_0_8 - 0.000191761363636365*G0_1_0_1_0 - 0.0073965097402599*G0_1_0_1_1 - 0.0123275162337666*G0_1_0_1_3 + 0.00788961038961064*G0_1_0_1_4 - 0.001479301948052*G0_1_0_1_5 - 0.000246550324675326*G0_1_0_1_6 + 0.00147930194805199*G0_1_0_1_7 - 0.00493100649350663*G0_1_0_1_8 - 0.00690340909090932*G0_1_0_1_9 + 0.000191761363636378*G0_1_0_2_0 + 0.00739650974026003*G0_1_0_2_2 - 0.00788961038961066*G0_1_0_2_3 + 0.0123275162337667*G0_1_0_2_4 - 0.00147930194805202*G0_1_0_2_5 + 0.00493100649350671*G0_1_0_2_6 + 0.00147930194805201*G0_1_0_2_7 + 0.000246550324675331*G0_1_0_2_8 + 0.00690340909090933*G0_1_0_2_9 - 0.00345170454545467*G0_1_0_3_0 - 0.0123275162337666*G0_1_0_3_1 - 0.00788961038961066*G0_1_0_3_2 - 0.0665685876623399*G0_1_0_3_3 + 0.00739650974025998*G0_1_0_3_5 + 0.000739650974025971*G0_1_0_3_6 + 0.010355113636364*G0_1_0_3_7 - 0.00961546266233801*G0_1_0_3_8 + 0.00345170454545468*G0_1_0_4_0 + 0.00788961038961064*G0_1_0_4_1 + 0.0123275162337667*G0_1_0_4_2 + 0.06656858766234*G0_1_0_4_4 - 0.010355113636364*G0_1_0_4_5 + 0.00961546266233806*G0_1_0_4_6 - 0.00739650974026002*G0_1_0_4_7 - 0.000739650974026*G0_1_0_4_8 + 0.000246550324675336*G0_1_0_5_0 - 0.001479301948052*G0_1_0_5_1 - 0.00147930194805202*G0_1_0_5_2 + 0.00739650974025998*G0_1_0_5_3 - 0.010355113636364*G0_1_0_5_4 - 0.0118344155844159*G0_1_0_5_5 - 0.00517755681818205*G0_1_0_5_6 + 0.00443790584415598*G0_1_0_5_8 - 0.00887581168831195*G0_1_0_5_9 + 0.001479301948052*G0_1_0_6_0 - 0.000246550324675326*G0_1_0_6_1 + 0.00493100649350671*G0_1_0_6_2 + 0.000739650974025971*G0_1_0_6_3 + 0.00961546266233805*G0_1_0_6_4 - 0.00517755681818205*G0_1_0_6_5 - 0.0118344155844157*G0_1_0_6_6 - 0.00443790584415604*G0_1_0_6_7 - 0.0221895292207799*G0_1_0_6_9 - 0.000246550324675315*G0_1_0_7_0 + 0.00147930194805199*G0_1_0_7_1 + 0.00147930194805201*G0_1_0_7_2 + 0.010355113636364*G0_1_0_7_3 - 0.00739650974026002*G0_1_0_7_4 - 0.00443790584415604*G0_1_0_7_6 + 0.0118344155844162*G0_1_0_7_7 + 0.00517755681818196*G0_1_0_7_8 + 0.00887581168831208*G0_1_0_7_9 - 0.00147930194805201*G0_1_0_8_0 - 0.00493100649350663*G0_1_0_8_1 + 0.000246550324675331*G0_1_0_8_2 - 0.00961546266233801*G0_1_0_8_3 - 0.000739650974026*G0_1_0_8_4 + 0.00443790584415598*G0_1_0_8_5 + 0.00517755681818196*G0_1_0_8_7 + 0.0118344155844161*G0_1_0_8_8 + 0.0221895292207799*G0_1_0_8_9 - 0.00690340909090932*G0_1_0_9_1 + 0.00690340909090933*G0_1_0_9_2 - 0.00887581168831195*G0_1_0_9_5 - 0.0221895292207799*G0_1_0_9_6 + 0.00887581168831208*G0_1_0_9_7 + 0.0221895292207799*G0_1_0_9_8 + 0.00648336038961056*G0_1_1_0_0 - 0.000173498376623391*G0_1_1_0_1 + 0.000401785714285726*G0_1_1_0_2 + 0.00123275162337668*G0_1_1_0_3 + 0.00369825487013002*G0_1_1_0_4 + 0.00419135551948063*G0_1_1_0_5 - 0.00098620129870132*G0_1_1_0_6 + 0.00608157467532485*G0_1_1_0_7 - 0.00525974025974042*G0_1_1_0_8 + 0.00542410714285732*G0_1_1_0_9 - 0.000173498376623391*G0_1_1_1_0 - 0.0356128246753258*G0_1_1_1_1 - 0.00103185876623379*G0_1_1_1_2 - 0.0234222808441566*G0_1_1_1_3 + 0.00887581168831196*G0_1_1_1_4 - 0.000986201298701329*G0_1_1_1_6 + 0.00641030844155867*G0_1_1_1_7 - 0.0160257711038967*G0_1_1_1_8 - 0.010355113636364*G0_1_1_1_9 + 0.000401785714285726*G0_1_1_2_0 - 0.00103185876623379*G0_1_1_2_1 + 0.00416396103896116*G0_1_1_2_2 - 0.00608157467532488*G0_1_1_2_3 + 0.00402698863636376*G0_1_1_2_4 + 0.000657467532467556*G0_1_1_2_5 + 0.00189021915584421*G0_1_1_2_6 + 0.004437905844156*G0_1_1_2_7 + 0.00320515422077933*G0_1_1_2_8 + 0.00641030844155866*G0_1_1_2_9 + 0.00123275162337668*G0_1_1_3_0 - 0.0234222808441566*G0_1_1_3_1 - 0.00608157467532488*G0_1_1_3_2 + 0.0369825487013002*G0_1_1_3_3 + 0.012574066558442*G0_1_1_3_4 - 0.00147930194805201*G0_1_1_3_5 + 0.00221895292207799*G0_1_1_3_6 - 0.00443790584415602*G0_1_1_3_7 + 0.01479301948052*G0_1_1_3_8 + 0.0399411525974039*G0_1_1_3_9 + 0.00369825487013002*G0_1_1_4_0 + 0.00887581168831196*G0_1_1_4_1 + 0.00402698863636376*G0_1_1_4_2 + 0.012574066558442*G0_1_1_4_3 + 0.090237418831172*G0_1_1_4_4 - 0.011834415584416*G0_1_1_4_5 + 0.00961546266233804*G0_1_1_4_6 - 0.011834415584416*G0_1_1_4_7 - 0.010355113636364*G0_1_1_4_8 + 0.00443790584415604*G0_1_1_4_9 + 0.00419135551948063*G0_1_1_5_0 + 0.000657467532467556*G0_1_1_5_2 - 0.00147930194805201*G0_1_1_5_3 - 0.011834415584416*G0_1_1_5_4 - 0.00147930194805196*G0_1_1_5_5 - 0.00739650974026*G0_1_1_5_6 + 0.01479301948052*G0_1_1_5_7 - 0.000739650974026009*G0_1_1_5_8 - 0.0147930194805199*G0_1_1_5_9 - 0.000986201298701319*G0_1_1_6_0 - 0.000986201298701329*G0_1_1_6_1 + 0.00189021915584421*G0_1_1_6_2 + 0.00221895292207799*G0_1_1_6_3 + 0.00961546266233804*G0_1_1_6_4 - 0.00739650974026*G0_1_1_6_5 - 0.00887581168831189*G0_1_1_6_6 - 0.014053368506494*G0_1_1_6_7 - 0.00295860389610399*G0_1_1_6_8 - 0.023668831168832*G0_1_1_6_9 + 0.00608157467532485*G0_1_1_7_0 + 0.00641030844155867*G0_1_1_7_1 + 0.004437905844156*G0_1_1_7_2 - 0.00443790584415602*G0_1_1_7_3 - 0.011834415584416*G0_1_1_7_4 + 0.01479301948052*G0_1_1_7_5 - 0.014053368506494*G0_1_1_7_6 + 0.105030438311692*G0_1_1_7_7 - 0.000739650974025979*G0_1_1_7_8 + 0.0118344155844161*G0_1_1_7_9 - 0.00525974025974042*G0_1_1_8_0 - 0.0160257711038967*G0_1_1_8_1 + 0.00320515422077933*G0_1_1_8_2 + 0.01479301948052*G0_1_1_8_3 - 0.010355113636364*G0_1_1_8_4 - 0.000739650974026009*G0_1_1_8_5 - 0.00295860389610399*G0_1_1_8_6 - 0.000739650974025979*G0_1_1_8_7 + 0.1109476461039*G0_1_1_8_8 + 0.0517755681818199*G0_1_1_8_9 + 0.00542410714285732*G0_1_1_9_0 - 0.010355113636364*G0_1_1_9_1 + 0.00641030844155866*G0_1_1_9_2 + 0.0399411525974039*G0_1_1_9_3 + 0.00443790584415604*G0_1_1_9_4 - 0.0147930194805199*G0_1_1_9_5 - 0.023668831168832*G0_1_1_9_6 + 0.0118344155844161*G0_1_1_9_7 + 0.0517755681818199*G0_1_1_9_8 - 0.0710064935064956*G0_1_1_9_9; + A[53] = A[35] + 0.00447443181818204*G0_0_1_0_0 + 0.000703125000000024*G0_0_1_0_1 + 0.00175324675324683*G0_0_1_0_2 + 0.000657467532467553*G0_0_1_0_3 - 0.00279423701298712*G0_0_1_0_4 + 0.00723214285714312*G0_0_1_0_5 - 0.00115056818181824*G0_0_1_0_6 + 0.00221895292207803*G0_0_1_0_7 + 0.00197240259740267*G0_0_1_0_9 + 0.000703125000000024*G0_0_1_1_0 + 0.00447443181818187*G0_0_1_1_1 + 0.00175324675324682*G0_0_1_1_2 + 0.00723214285714307*G0_0_1_1_3 - 0.0011505681818182*G0_0_1_1_4 + 0.000657467532467554*G0_0_1_1_5 - 0.00279423701298711*G0_0_1_1_6 + 0.00221895292207795*G0_0_1_1_8 + 0.00197240259740266*G0_0_1_1_9 + 0.00175324675324683*G0_0_1_2_0 + 0.00175324675324682*G0_0_1_2_1 + 0.0317775974025985*G0_0_1_2_2 - 0.00197240259740267*G0_0_1_2_3 + 0.0123275162337667*G0_0_1_2_4 - 0.0019724025974027*G0_0_1_2_5 + 0.0123275162337667*G0_0_1_2_6 + 0.000164366883116888*G0_0_1_2_7 + 0.000164366883116884*G0_0_1_2_8 + 0.00394480519480533*G0_0_1_2_9 + 0.000657467532467553*G0_0_1_3_0 + 0.00723214285714307*G0_0_1_3_1 - 0.00197240259740267*G0_0_1_3_2 - 0.020710227272728*G0_0_1_3_4 + 0.00443790584415596*G0_0_1_3_6 - 0.00591720779220799*G0_0_1_3_7 + 0.010355113636364*G0_0_1_3_8 + 0.00591720779220801*G0_0_1_3_9 - 0.00279423701298712*G0_0_1_4_0 - 0.0011505681818182*G0_0_1_4_1 + 0.0123275162337667*G0_0_1_4_2 - 0.020710227272728*G0_0_1_4_3 - 0.072485795454548*G0_0_1_4_4 + 0.00443790584415599*G0_0_1_4_5 - 0.00887581168831198*G0_0_1_4_6 + 0.005917207792208*G0_0_1_4_7 - 0.00443790584415598*G0_0_1_4_8 - 0.020710227272728*G0_0_1_4_9 + 0.00723214285714312*G0_0_1_5_0 + 0.000657467532467555*G0_0_1_5_1 - 0.0019724025974027*G0_0_1_5_2 + 0.00443790584415599*G0_0_1_5_4 - 0.020710227272728*G0_0_1_5_6 + 0.010355113636364*G0_0_1_5_7 - 0.005917207792208*G0_0_1_5_8 + 0.00591720779220798*G0_0_1_5_9 - 0.00115056818181824*G0_0_1_6_0 - 0.00279423701298711*G0_0_1_6_1 + 0.0123275162337667*G0_0_1_6_2 + 0.00443790584415596*G0_0_1_6_3 - 0.00887581168831198*G0_0_1_6_4 - 0.020710227272728*G0_0_1_6_5 - 0.0724857954545479*G0_0_1_6_6 - 0.004437905844156*G0_0_1_6_7 + 0.00591720779220799*G0_0_1_6_8 - 0.020710227272728*G0_0_1_6_9 + 0.00221895292207803*G0_0_1_7_0 + 0.000164366883116888*G0_0_1_7_2 - 0.00591720779220799*G0_0_1_7_3 + 0.005917207792208*G0_0_1_7_4 + 0.010355113636364*G0_0_1_7_5 - 0.004437905844156*G0_0_1_7_6 + 0.00887581168831196*G0_0_1_7_7 - 0.01109476461039*G0_0_1_7_8 + 0.00295860389610398*G0_0_1_7_9 + 0.00221895292207795*G0_0_1_8_1 + 0.000164366883116884*G0_0_1_8_2 + 0.010355113636364*G0_0_1_8_3 - 0.00443790584415598*G0_0_1_8_4 - 0.005917207792208*G0_0_1_8_5 + 0.00591720779220799*G0_0_1_8_6 - 0.01109476461039*G0_0_1_8_7 + 0.00887581168831188*G0_0_1_8_8 + 0.00295860389610399*G0_0_1_8_9 + 0.00197240259740267*G0_0_1_9_0 + 0.00197240259740266*G0_0_1_9_1 + 0.00394480519480534*G0_0_1_9_2 + 0.00591720779220801*G0_0_1_9_3 - 0.020710227272728*G0_0_1_9_4 + 0.00591720779220798*G0_0_1_9_5 - 0.020710227272728*G0_0_1_9_6 + 0.00295860389610398*G0_0_1_9_7 + 0.00295860389610399*G0_0_1_9_8 + 0.124261363636368*G0_0_1_9_9 - 0.00447443181818204*G0_1_0_0_0 - 0.000703125000000024*G0_1_0_0_1 - 0.00175324675324683*G0_1_0_0_2 - 0.000657467532467553*G0_1_0_0_3 + 0.00279423701298712*G0_1_0_0_4 - 0.00723214285714312*G0_1_0_0_5 + 0.00115056818181824*G0_1_0_0_6 - 0.00221895292207803*G0_1_0_0_7 - 0.00197240259740267*G0_1_0_0_9 - 0.000703125000000024*G0_1_0_1_0 - 0.00447443181818187*G0_1_0_1_1 - 0.00175324675324682*G0_1_0_1_2 - 0.00723214285714307*G0_1_0_1_3 + 0.0011505681818182*G0_1_0_1_4 - 0.000657467532467555*G0_1_0_1_5 + 0.00279423701298711*G0_1_0_1_6 - 0.00221895292207795*G0_1_0_1_8 - 0.00197240259740266*G0_1_0_1_9 - 0.00175324675324683*G0_1_0_2_0 - 0.00175324675324682*G0_1_0_2_1 - 0.0317775974025985*G0_1_0_2_2 + 0.00197240259740268*G0_1_0_2_3 - 0.0123275162337667*G0_1_0_2_4 + 0.0019724025974027*G0_1_0_2_5 - 0.0123275162337667*G0_1_0_2_6 - 0.000164366883116887*G0_1_0_2_7 - 0.000164366883116884*G0_1_0_2_8 - 0.00394480519480533*G0_1_0_2_9 - 0.000657467532467553*G0_1_0_3_0 - 0.00723214285714307*G0_1_0_3_1 + 0.00197240259740267*G0_1_0_3_2 + 0.020710227272728*G0_1_0_3_4 - 0.00443790584415596*G0_1_0_3_6 + 0.00591720779220799*G0_1_0_3_7 - 0.010355113636364*G0_1_0_3_8 - 0.00591720779220801*G0_1_0_3_9 + 0.00279423701298712*G0_1_0_4_0 + 0.0011505681818182*G0_1_0_4_1 - 0.0123275162337667*G0_1_0_4_2 + 0.020710227272728*G0_1_0_4_3 + 0.072485795454548*G0_1_0_4_4 - 0.00443790584415599*G0_1_0_4_5 + 0.00887581168831198*G0_1_0_4_6 - 0.005917207792208*G0_1_0_4_7 + 0.00443790584415598*G0_1_0_4_8 + 0.020710227272728*G0_1_0_4_9 - 0.00723214285714312*G0_1_0_5_0 - 0.000657467532467555*G0_1_0_5_1 + 0.0019724025974027*G0_1_0_5_2 - 0.00443790584415599*G0_1_0_5_4 + 0.020710227272728*G0_1_0_5_6 - 0.010355113636364*G0_1_0_5_7 + 0.005917207792208*G0_1_0_5_8 - 0.00591720779220798*G0_1_0_5_9 + 0.00115056818181824*G0_1_0_6_0 + 0.00279423701298711*G0_1_0_6_1 - 0.0123275162337667*G0_1_0_6_2 - 0.00443790584415596*G0_1_0_6_3 + 0.00887581168831198*G0_1_0_6_4 + 0.020710227272728*G0_1_0_6_5 + 0.0724857954545478*G0_1_0_6_6 + 0.004437905844156*G0_1_0_6_7 - 0.00591720779220799*G0_1_0_6_8 + 0.020710227272728*G0_1_0_6_9 - 0.00221895292207803*G0_1_0_7_0 - 0.000164366883116888*G0_1_0_7_2 + 0.00591720779220799*G0_1_0_7_3 - 0.005917207792208*G0_1_0_7_4 - 0.010355113636364*G0_1_0_7_5 + 0.004437905844156*G0_1_0_7_6 - 0.00887581168831196*G0_1_0_7_7 + 0.01109476461039*G0_1_0_7_8 - 0.00295860389610398*G0_1_0_7_9 - 0.00221895292207795*G0_1_0_8_1 - 0.000164366883116884*G0_1_0_8_2 - 0.010355113636364*G0_1_0_8_3 + 0.00443790584415598*G0_1_0_8_4 + 0.005917207792208*G0_1_0_8_5 - 0.00591720779220799*G0_1_0_8_6 + 0.01109476461039*G0_1_0_8_7 - 0.00887581168831188*G0_1_0_8_8 - 0.00295860389610399*G0_1_0_8_9 - 0.00197240259740267*G0_1_0_9_0 - 0.00197240259740266*G0_1_0_9_1 - 0.00394480519480534*G0_1_0_9_2 - 0.00591720779220801*G0_1_0_9_3 + 0.020710227272728*G0_1_0_9_4 - 0.00591720779220798*G0_1_0_9_5 + 0.020710227272728*G0_1_0_9_6 - 0.00295860389610398*G0_1_0_9_7 - 0.00295860389610399*G0_1_0_9_8 - 0.124261363636368*G0_1_0_9_9; + A[68] = A[86] - 0.0317775974025984*G0_0_1_0_0 - 0.00175324675324682*G0_0_1_0_1 - 0.00175324675324681*G0_0_1_0_2 - 0.000164366883116884*G0_0_1_0_3 - 0.000164366883116892*G0_0_1_0_4 - 0.0123275162337666*G0_0_1_0_5 + 0.00197240259740265*G0_0_1_0_6 - 0.0123275162337666*G0_0_1_0_7 + 0.00197240259740265*G0_0_1_0_8 - 0.00394480519480534*G0_0_1_0_9 - 0.00175324675324682*G0_0_1_1_0 - 0.00447443181818204*G0_0_1_1_1 - 0.000703125000000029*G0_0_1_1_2 - 0.00221895292207803*G0_0_1_1_3 + 0.00279423701298711*G0_0_1_1_5 - 0.000657467532467555*G0_0_1_1_6 + 0.00115056818181825*G0_0_1_1_7 - 0.00723214285714316*G0_0_1_1_8 - 0.00197240259740268*G0_0_1_1_9 - 0.00175324675324681*G0_0_1_2_0 - 0.000703125000000029*G0_0_1_2_1 - 0.00447443181818198*G0_0_1_2_2 - 0.00221895292207802*G0_0_1_2_4 + 0.00115056818181823*G0_0_1_2_5 - 0.0072321428571431*G0_0_1_2_6 + 0.00279423701298711*G0_0_1_2_7 - 0.000657467532467564*G0_0_1_2_8 - 0.00197240259740267*G0_0_1_2_9 - 0.000164366883116885*G0_0_1_3_0 - 0.00221895292207803*G0_0_1_3_1 - 0.00887581168831195*G0_0_1_3_3 + 0.01109476461039*G0_0_1_3_4 - 0.00591720779220798*G0_0_1_3_5 + 0.00591720779220799*G0_0_1_3_6 + 0.00443790584415599*G0_0_1_3_7 - 0.010355113636364*G0_0_1_3_8 - 0.002958603896104*G0_0_1_3_9 - 0.000164366883116892*G0_0_1_4_0 - 0.00221895292207802*G0_0_1_4_2 + 0.01109476461039*G0_0_1_4_3 - 0.00887581168831213*G0_0_1_4_4 + 0.004437905844156*G0_0_1_4_5 - 0.010355113636364*G0_0_1_4_6 - 0.005917207792208*G0_0_1_4_7 + 0.00591720779220802*G0_0_1_4_8 - 0.00295860389610399*G0_0_1_4_9 - 0.0123275162337666*G0_0_1_5_0 + 0.00279423701298711*G0_0_1_5_1 + 0.00115056818181823*G0_0_1_5_2 - 0.00591720779220798*G0_0_1_5_3 + 0.004437905844156*G0_0_1_5_4 + 0.0724857954545479*G0_0_1_5_5 + 0.020710227272728*G0_0_1_5_6 + 0.008875811688312*G0_0_1_5_7 - 0.00443790584415599*G0_0_1_5_8 + 0.020710227272728*G0_0_1_5_9 + 0.00197240259740265*G0_0_1_6_0 - 0.000657467532467555*G0_0_1_6_1 - 0.0072321428571431*G0_0_1_6_2 + 0.00591720779220799*G0_0_1_6_3 - 0.010355113636364*G0_0_1_6_4 + 0.020710227272728*G0_0_1_6_5 - 0.004437905844156*G0_0_1_6_7 - 0.00591720779220798*G0_0_1_6_9 - 0.0123275162337666*G0_0_1_7_0 + 0.00115056818181825*G0_0_1_7_1 + 0.00279423701298711*G0_0_1_7_2 + 0.00443790584415599*G0_0_1_7_3 - 0.005917207792208*G0_0_1_7_4 + 0.008875811688312*G0_0_1_7_5 - 0.004437905844156*G0_0_1_7_6 + 0.0724857954545481*G0_0_1_7_7 + 0.020710227272728*G0_0_1_7_8 + 0.020710227272728*G0_0_1_7_9 + 0.00197240259740265*G0_0_1_8_0 - 0.00723214285714316*G0_0_1_8_1 - 0.000657467532467564*G0_0_1_8_2 - 0.010355113636364*G0_0_1_8_3 + 0.00591720779220802*G0_0_1_8_4 - 0.00443790584415599*G0_0_1_8_5 + 0.020710227272728*G0_0_1_8_7 - 0.00591720779220803*G0_0_1_8_9 - 0.00394480519480534*G0_0_1_9_0 - 0.00197240259740268*G0_0_1_9_1 - 0.00197240259740267*G0_0_1_9_2 - 0.002958603896104*G0_0_1_9_3 - 0.00295860389610399*G0_0_1_9_4 + 0.020710227272728*G0_0_1_9_5 - 0.00591720779220798*G0_0_1_9_6 + 0.020710227272728*G0_0_1_9_7 - 0.00591720779220804*G0_0_1_9_8 - 0.124261363636368*G0_0_1_9_9 + 0.0317775974025984*G0_1_0_0_0 + 0.00175324675324682*G0_1_0_0_1 + 0.00175324675324681*G0_1_0_0_2 + 0.000164366883116885*G0_1_0_0_3 + 0.000164366883116892*G0_1_0_0_4 + 0.0123275162337666*G0_1_0_0_5 - 0.00197240259740265*G0_1_0_0_6 + 0.0123275162337666*G0_1_0_0_7 - 0.00197240259740265*G0_1_0_0_8 + 0.00394480519480534*G0_1_0_0_9 + 0.00175324675324682*G0_1_0_1_0 + 0.00447443181818204*G0_1_0_1_1 + 0.000703125000000029*G0_1_0_1_2 + 0.00221895292207803*G0_1_0_1_3 - 0.00279423701298711*G0_1_0_1_5 + 0.000657467532467555*G0_1_0_1_6 - 0.00115056818181825*G0_1_0_1_7 + 0.00723214285714316*G0_1_0_1_8 + 0.00197240259740268*G0_1_0_1_9 + 0.00175324675324681*G0_1_0_2_0 + 0.000703125000000029*G0_1_0_2_1 + 0.00447443181818198*G0_1_0_2_2 + 0.00221895292207802*G0_1_0_2_4 - 0.00115056818181823*G0_1_0_2_5 + 0.0072321428571431*G0_1_0_2_6 - 0.00279423701298711*G0_1_0_2_7 + 0.000657467532467564*G0_1_0_2_8 + 0.00197240259740267*G0_1_0_2_9 + 0.000164366883116885*G0_1_0_3_0 + 0.00221895292207803*G0_1_0_3_1 + 0.00887581168831195*G0_1_0_3_3 - 0.01109476461039*G0_1_0_3_4 + 0.00591720779220798*G0_1_0_3_5 - 0.00591720779220799*G0_1_0_3_6 - 0.00443790584415599*G0_1_0_3_7 + 0.010355113636364*G0_1_0_3_8 + 0.002958603896104*G0_1_0_3_9 + 0.000164366883116892*G0_1_0_4_0 + 0.00221895292207802*G0_1_0_4_2 - 0.01109476461039*G0_1_0_4_3 + 0.00887581168831213*G0_1_0_4_4 - 0.004437905844156*G0_1_0_4_5 + 0.010355113636364*G0_1_0_4_6 + 0.005917207792208*G0_1_0_4_7 - 0.00591720779220802*G0_1_0_4_8 + 0.00295860389610399*G0_1_0_4_9 + 0.0123275162337666*G0_1_0_5_0 - 0.00279423701298711*G0_1_0_5_1 - 0.00115056818181823*G0_1_0_5_2 + 0.00591720779220798*G0_1_0_5_3 - 0.004437905844156*G0_1_0_5_4 - 0.0724857954545479*G0_1_0_5_5 - 0.020710227272728*G0_1_0_5_6 - 0.008875811688312*G0_1_0_5_7 + 0.00443790584415599*G0_1_0_5_8 - 0.020710227272728*G0_1_0_5_9 - 0.00197240259740265*G0_1_0_6_0 + 0.000657467532467555*G0_1_0_6_1 + 0.0072321428571431*G0_1_0_6_2 - 0.00591720779220799*G0_1_0_6_3 + 0.010355113636364*G0_1_0_6_4 - 0.020710227272728*G0_1_0_6_5 + 0.004437905844156*G0_1_0_6_7 + 0.00591720779220798*G0_1_0_6_9 + 0.0123275162337666*G0_1_0_7_0 - 0.00115056818181825*G0_1_0_7_1 - 0.00279423701298711*G0_1_0_7_2 - 0.00443790584415599*G0_1_0_7_3 + 0.005917207792208*G0_1_0_7_4 - 0.008875811688312*G0_1_0_7_5 + 0.004437905844156*G0_1_0_7_6 - 0.0724857954545481*G0_1_0_7_7 - 0.020710227272728*G0_1_0_7_8 - 0.020710227272728*G0_1_0_7_9 - 0.00197240259740265*G0_1_0_8_0 + 0.00723214285714316*G0_1_0_8_1 + 0.000657467532467564*G0_1_0_8_2 + 0.010355113636364*G0_1_0_8_3 - 0.00591720779220802*G0_1_0_8_4 + 0.00443790584415599*G0_1_0_8_5 - 0.020710227272728*G0_1_0_8_7 + 0.00591720779220803*G0_1_0_8_9 + 0.00394480519480534*G0_1_0_9_0 + 0.00197240259740268*G0_1_0_9_1 + 0.00197240259740267*G0_1_0_9_2 + 0.002958603896104*G0_1_0_9_3 + 0.00295860389610399*G0_1_0_9_4 - 0.020710227272728*G0_1_0_9_5 + 0.00591720779220798*G0_1_0_9_6 - 0.020710227272728*G0_1_0_9_7 + 0.00591720779220804*G0_1_0_9_8 + 0.124261363636368*G0_1_0_9_9; + A[48] = -A[68] + 0.0331655844155855*G0_1_0_0_0 + 0.00561586850649372*G0_1_0_0_1 + 0.00146103896103902*G0_1_0_0_2 - 0.000493100649350685*G0_1_0_0_3 + 0.013313717532468*G0_1_0_0_5 - 0.002958603896104*G0_1_0_0_6 + 0.0137246347402602*G0_1_0_0_7 + 0.00410917207792223*G0_1_0_0_8 + 0.00739650974026*G0_1_0_0_9 + 0.00561586850649372*G0_1_0_1_0 + 0.0778916396103922*G0_1_0_1_1 + 0.00346996753246765*G0_1_0_1_2 + 0.0305722402597412*G0_1_0_1_3 - 0.0142999188311693*G0_1_0_1_4 - 0.00295860389610399*G0_1_0_1_5 - 0.00197240259740266*G0_1_0_1_6 - 0.0179159902597409*G0_1_0_1_7 + 0.0528439529220798*G0_1_0_1_8 + 0.00838271103896135*G0_1_0_1_9 + 0.00146103896103902*G0_1_0_2_0 + 0.00346996753246765*G0_1_0_2_1 + 0.00238331980519487*G0_1_0_2_3 - 0.00328733766233772*G0_1_0_2_4 + 0.00156148538961042*G0_1_0_2_5 + 0.00328733766233782*G0_1_0_2_6 - 0.00493100649350667*G0_1_0_2_7 - 0.00394480519480532*G0_1_0_2_9 - 0.000493100649350685*G0_1_0_3_0 + 0.0305722402597412*G0_1_0_3_1 + 0.00238331980519487*G0_1_0_3_2 - 0.0650892857142883*G0_1_0_3_3 - 0.010355113636364*G0_1_0_3_4 + 0.00813616071428598*G0_1_0_3_5 - 0.00443790584415594*G0_1_0_3_7 + 0.010355113636364*G0_1_0_3_8 - 0.016272321428572*G0_1_0_3_9 - 0.0142999188311693*G0_1_0_4_1 - 0.00328733766233772*G0_1_0_4_2 - 0.010355113636364*G0_1_0_4_3 + 0.00887581168831193*G0_1_0_4_4 - 0.00591720779220797*G0_1_0_4_5 + 0.00591720779220799*G0_1_0_4_6 + 0.010355113636364*G0_1_0_4_7 - 0.00591720779220799*G0_1_0_4_8 + 0.0236688311688319*G0_1_0_4_9 + 0.013313717532468*G0_1_0_5_0 - 0.00295860389610399*G0_1_0_5_1 + 0.00156148538961041*G0_1_0_5_2 + 0.00813616071428598*G0_1_0_5_3 - 0.00591720779220797*G0_1_0_5_4 - 0.0754443993506518*G0_1_0_5_5 - 0.019230925324676*G0_1_0_5_6 - 0.011834415584416*G0_1_0_5_7 + 0.00295860389610399*G0_1_0_5_8 - 0.028106737012988*G0_1_0_5_9 - 0.002958603896104*G0_1_0_6_0 - 0.00197240259740266*G0_1_0_6_1 + 0.00328733766233782*G0_1_0_6_2 + 0.00591720779220799*G0_1_0_6_4 - 0.019230925324676*G0_1_0_6_5 - 0.0207102272727279*G0_1_0_6_6 + 0.00887581168831201*G0_1_0_6_7 + 0.00591720779220799*G0_1_0_6_8 + 0.011834415584416*G0_1_0_6_9 + 0.0137246347402602*G0_1_0_7_0 - 0.0179159902597409*G0_1_0_7_1 - 0.00493100649350667*G0_1_0_7_2 - 0.00443790584415595*G0_1_0_7_3 + 0.010355113636364*G0_1_0_7_4 - 0.011834415584416*G0_1_0_7_5 + 0.00887581168831201*G0_1_0_7_6 - 0.113906250000004*G0_1_0_7_7 - 0.056953125000002*G0_1_0_7_8 - 0.039941152597404*G0_1_0_7_9 + 0.00410917207792223*G0_1_0_8_0 + 0.0528439529220798*G0_1_0_8_1 + 0.010355113636364*G0_1_0_8_3 - 0.00591720779220799*G0_1_0_8_4 + 0.00295860389610399*G0_1_0_8_5 + 0.00591720779220799*G0_1_0_8_6 - 0.056953125000002*G0_1_0_8_7 - 0.013313717532468*G0_1_0_8_9 + 0.00739650974026*G0_1_0_9_0 + 0.00838271103896135*G0_1_0_9_1 - 0.00394480519480532*G0_1_0_9_2 - 0.016272321428572*G0_1_0_9_3 + 0.0236688311688319*G0_1_0_9_4 - 0.0281067370129879*G0_1_0_9_5 + 0.011834415584416*G0_1_0_9_6 - 0.039941152597404*G0_1_0_9_7 - 0.013313717532468*G0_1_0_9_8 + 0.213019480519487*G0_1_0_9_9 - 0.00162540584415587*G0_1_1_0_0 + 0.00705864448051976*G0_1_1_0_1 + 0.000100446428571437*G0_1_1_0_2 - 0.00271205357142868*G0_1_1_0_3 - 0.00197240259740267*G0_1_1_0_4 - 0.00147930194805199*G0_1_1_0_5 + 0.000493100649350665*G0_1_1_0_6 - 0.00846489448051976*G0_1_1_0_7 + 0.0119987824675329*G0_1_1_0_8 - 0.00641030844155867*G0_1_1_0_9 + 0.00705864448051976*G0_1_1_1_0 + 0.0925933441558473*G0_1_1_1_1 + 0.00373478084415597*G0_1_1_1_2 + 0.0406808035714299*G0_1_1_1_3 - 0.0172585227272733*G0_1_1_1_4 - 0.001479301948052*G0_1_1_1_5 - 0.0345170454545467*G0_1_1_1_7 + 0.0727323457792234*G0_1_1_1_8 + 0.0172585227272733*G0_1_1_1_9 + 0.000100446428571436*G0_1_1_2_0 + 0.00373478084415597*G0_1_1_2_1 - 0.00273944805194808*G0_1_1_2_2 + 0.00476663961038975*G0_1_1_2_3 - 0.00410917207792219*G0_1_1_2_4 + 0.00065746753246754*G0_1_1_2_5 - 0.00328733766233774*G0_1_1_2_6 - 0.00221895292207799*G0_1_1_2_7 + 0.00961546266233798*G0_1_1_2_8 - 0.000493100649350662*G0_1_1_2_9 - 0.00271205357142868*G0_1_1_3_0 + 0.0406808035714299*G0_1_1_3_1 + 0.00476663961038976*G0_1_1_3_2 - 0.0976339285714323*G0_1_1_3_3 - 0.015532670454546*G0_1_1_3_4 + 0.008875811688312*G0_1_1_3_5 - 0.00517755681818198*G0_1_1_3_6 + 0.00295860389610402*G0_1_1_3_7 + 0.0310653409090919*G0_1_1_3_8 - 0.0576927759740281*G0_1_1_3_9 - 0.00197240259740267*G0_1_1_4_0 - 0.0172585227272733*G0_1_1_4_1 - 0.00410917207792219*G0_1_1_4_2 - 0.015532670454546*G0_1_1_4_3 - 0.00443790584415603*G0_1_1_4_4 + 0.00073965097402599*G0_1_1_4_5 + 0.00443790584415599*G0_1_1_4_6 + 0.00887581168831198*G0_1_1_4_7 - 0.0340239448051959*G0_1_1_4_8 - 0.00147930194805199*G0_1_1_5_0 - 0.001479301948052*G0_1_1_5_1 + 0.00065746753246754*G0_1_1_5_2 + 0.008875811688312*G0_1_1_5_3 + 0.00073965097402599*G0_1_1_5_4 + 0.00887581168831204*G0_1_1_5_5 + 0.000739650974025982*G0_1_1_5_6 - 0.00073965097402598*G0_1_1_5_7 - 0.000739650974026011*G0_1_1_5_8 + 0.020710227272728*G0_1_1_5_9 + 0.000493100649350665*G0_1_1_6_0 - 0.00328733766233774*G0_1_1_6_2 - 0.00517755681818198*G0_1_1_6_3 + 0.00443790584415599*G0_1_1_6_4 + 0.000739650974025982*G0_1_1_6_5 + 0.010355113636364*G0_1_1_6_6 + 0.00147930194805198*G0_1_1_6_7 - 0.011834415584416*G0_1_1_6_8 + 0.011834415584416*G0_1_1_6_9 - 0.00846489448051976*G0_1_1_7_0 - 0.0345170454545467*G0_1_1_7_1 - 0.00221895292207799*G0_1_1_7_2 + 0.00295860389610402*G0_1_1_7_3 + 0.00887581168831198*G0_1_1_7_4 - 0.000739650974025981*G0_1_1_7_5 + 0.00147930194805198*G0_1_1_7_6 + 0.0162723214285721*G0_1_1_7_7 - 0.0451187094155861*G0_1_1_7_8 + 0.016272321428572*G0_1_1_7_9 + 0.0119987824675329*G0_1_1_8_0 + 0.0727323457792234*G0_1_1_8_1 + 0.00961546266233798*G0_1_1_8_2 + 0.0310653409090919*G0_1_1_8_3 - 0.0340239448051959*G0_1_1_8_4 - 0.000739650974026011*G0_1_1_8_5 - 0.011834415584416*G0_1_1_8_6 - 0.045118709415586*G0_1_1_8_7 + 0.257398538961048*G0_1_1_8_8 + 0.0162723214285719*G0_1_1_8_9 - 0.00641030844155867*G0_1_1_9_0 + 0.0172585227272733*G0_1_1_9_1 - 0.000493100649350662*G0_1_1_9_2 - 0.0576927759740281*G0_1_1_9_3 + 0.020710227272728*G0_1_1_9_5 + 0.011834415584416*G0_1_1_9_6 + 0.016272321428572*G0_1_1_9_7 + 0.0162723214285719*G0_1_1_9_8 - 0.0177516233766241*G0_1_1_9_9; + A[24] = A[27] - 0.0153348214285719*G0_1_0_0_0 + 0.00766741071428602*G0_1_0_0_2 - 0.0047575081168833*G0_1_0_0_3 + 0.0113504464285719*G0_1_0_0_4 - 0.0124918831168836*G0_1_0_0_5 + 0.0187652191558449*G0_1_0_0_6 - 0.0120535714285718*G0_1_0_0_7 + 0.00309557629870141*G0_1_0_0_8 + 0.00372564935064949*G0_1_0_0_9 - 0.00584415584415603*G0_1_0_1_1 + 0.00778612012987042*G0_1_0_1_2 - 0.00875710227272758*G0_1_0_1_3 + 0.0157061688311694*G0_1_0_1_4 - 0.005195819805195*G0_1_0_1_5 + 0.011925730519481*G0_1_0_1_6 - 0.00151582792207797*G0_1_0_1_7 - 0.00384435876623391*G0_1_0_1_8 + 0.00443790584415601*G0_1_0_1_9 + 0.00766741071428602*G0_1_0_2_0 + 0.00778612012987042*G0_1_0_2_1 + 0.124736201298706*G0_1_0_2_2 - 0.0360146103896116*G0_1_0_2_3 + 0.0785765016233794*G0_1_0_2_4 - 0.0375669642857156*G0_1_0_2_5 + 0.0830509334415614*G0_1_0_2_6 - 0.00223721590909099*G0_1_0_2_7 - 0.00122362012987017*G0_1_0_2_8 + 0.0149573863636369*G0_1_0_2_9 - 0.0047575081168833*G0_1_0_3_0 - 0.00875710227272758*G0_1_0_3_1 - 0.0360146103896116*G0_1_0_3_2 + 0.0407629870129884*G0_1_0_3_3 - 0.0652536525974049*G0_1_0_3_4 + 0.020710227272728*G0_1_0_3_5 - 0.047337662337664*G0_1_0_3_6 + 0.00271205357142867*G0_1_0_3_7 + 0.00517755681818198*G0_1_0_3_8 - 0.0187378246753253*G0_1_0_3_9 + 0.0113504464285719*G0_1_0_4_0 + 0.0157061688311694*G0_1_0_4_1 + 0.0785765016233794*G0_1_0_4_2 - 0.0652536525974049*G0_1_0_4_3 + 0.167982954545461*G0_1_0_4_4 - 0.0456118100649367*G0_1_0_4_5 + 0.0929494724026008*G0_1_0_4_6 - 0.00788961038961066*G0_1_0_4_7 - 0.00788961038961065*G0_1_0_4_8 + 0.0463514610389627*G0_1_0_4_9 - 0.0124918831168836*G0_1_0_5_0 - 0.005195819805195*G0_1_0_5_1 - 0.0375669642857156*G0_1_0_5_2 + 0.020710227272728*G0_1_0_5_3 - 0.0456118100649367*G0_1_0_5_4 + 0.0420779220779236*G0_1_0_5_5 - 0.0710886769480545*G0_1_0_5_6 + 0.000821834415584448*G0_1_0_5_7 + 0.00402698863636377*G0_1_0_5_8 - 0.019230925324676*G0_1_0_5_9 + 0.0187652191558449*G0_1_0_6_0 + 0.011925730519481*G0_1_0_6_1 + 0.0830509334415614*G0_1_0_6_2 - 0.047337662337664*G0_1_0_6_3 + 0.0929494724026007*G0_1_0_6_4 - 0.0710886769480545*G0_1_0_6_5 + 0.193459821428578*G0_1_0_6_6 - 0.00484882305194822*G0_1_0_6_7 - 0.0102729301948055*G0_1_0_6_8 + 0.0498031655844173*G0_1_0_6_9 - 0.0120535714285718*G0_1_0_7_0 - 0.00151582792207797*G0_1_0_7_1 - 0.00223721590909099*G0_1_0_7_2 + 0.00271205357142867*G0_1_0_7_3 - 0.00788961038961066*G0_1_0_7_4 + 0.000821834415584446*G0_1_0_7_5 - 0.00484882305194822*G0_1_0_7_6 - 0.00131493506493512*G0_1_0_7_7 + 0.0127384334415589*G0_1_0_7_8 - 0.00147930194805201*G0_1_0_7_9 + 0.0030955762987014*G0_1_0_8_0 - 0.00384435876623391*G0_1_0_8_1 - 0.00122362012987017*G0_1_0_8_2 + 0.00517755681818198*G0_1_0_8_3 - 0.00788961038961065*G0_1_0_8_4 + 0.00402698863636377*G0_1_0_8_5 - 0.0102729301948055*G0_1_0_8_6 + 0.0127384334415589*G0_1_0_8_7 + 0.0228469967532475*G0_1_0_8_8 + 0.00246550324675331*G0_1_0_8_9 + 0.00372564935064949*G0_1_0_9_0 + 0.00443790584415601*G0_1_0_9_1 + 0.0149573863636369*G0_1_0_9_2 - 0.0187378246753253*G0_1_0_9_3 + 0.0463514610389627*G0_1_0_9_4 - 0.019230925324676*G0_1_0_9_5 + 0.0498031655844174*G0_1_0_9_6 - 0.001479301948052*G0_1_0_9_7 + 0.00246550324675331*G0_1_0_9_8 - 0.00394480519480534*G0_1_0_9_9 + 0.00254464285714294*G0_1_1_0_0 + 0.00127232142857148*G0_1_1_0_2 - 0.00359780844155857*G0_1_1_0_3 + 0.00483969155844175*G0_1_1_0_4 + 0.000620941558441566*G0_1_1_0_5 + 0.002976866883117*G0_1_1_0_6 + 0.00463879870129886*G0_1_1_0_7 - 0.00505884740259758*G0_1_1_0_8 + 0.00241071428571438*G0_1_1_0_9 - 0.0164366883116888*G0_1_1_1_1 + 0.00103490259740264*G0_1_1_1_2 - 0.00684862012987036*G0_1_1_1_3 + 0.00909496753246786*G0_1_1_1_4 - 0.00272118506493516*G0_1_1_1_5 + 0.00368912337662351*G0_1_1_1_6 + 0.00416396103896119*G0_1_1_1_7 - 0.011779626623377*G0_1_1_1_8 + 0.000986201298701331*G0_1_1_1_9 + 0.00127232142857148*G0_1_1_2_0 + 0.00103490259740264*G0_1_1_2_1 + 0.0130275974025979*G0_1_1_2_2 - 0.00818181818181847*G0_1_1_2_3 + 0.019267451298702*G0_1_1_2_4 - 0.00507711038961057*G0_1_1_2_5 + 0.010318587662338*G0_1_1_2_6 + 0.00089488636363639*G0_1_1_2_7 - 0.00113230519480523*G0_1_1_2_8 + 0.0033969155844157*G0_1_1_2_9 - 0.00359780844155857*G0_1_1_3_0 - 0.00684862012987036*G0_1_1_3_1 - 0.00818181818181847*G0_1_1_3_2 - 0.026627435064936*G0_1_1_3_4 + 0.0111769480519484*G0_1_1_3_5 - 0.0144642857142862*G0_1_1_3_6 + 0.00739650974025998*G0_1_1_3_7 - 0.00739650974025999*G0_1_1_3_8 - 0.017751623376624*G0_1_1_3_9 + 0.00483969155844175*G0_1_1_4_0 + 0.00909496753246786*G0_1_1_4_1 + 0.019267451298702*G0_1_1_4_2 - 0.026627435064936*G0_1_1_4_3 + 0.0867857142857175*G0_1_1_4_4 - 0.0179159902597409*G0_1_1_4_5 + 0.0323802759740271*G0_1_1_4_6 - 0.00690340909090933*G0_1_1_4_7 + 0.0256412337662347*G0_1_1_4_9 + 0.000620941558441565*G0_1_1_5_0 - 0.00272118506493516*G0_1_1_5_1 - 0.00507711038961057*G0_1_1_5_2 + 0.0111769480519484*G0_1_1_5_3 - 0.0179159902597409*G0_1_1_5_4 - 0.0026298701298702*G0_1_1_5_5 - 0.0149573863636369*G0_1_1_5_6 + 0.0013149350649351*G0_1_1_5_7 + 0.00476663961038977*G0_1_1_5_8 - 0.0167654220779227*G0_1_1_5_9 + 0.002976866883117*G0_1_1_6_0 + 0.00368912337662351*G0_1_1_6_1 + 0.010318587662338*G0_1_1_6_2 - 0.0144642857142862*G0_1_1_6_3 + 0.0323802759740271*G0_1_1_6_4 - 0.0149573863636369*G0_1_1_6_5 + 0.0358319805194817*G0_1_1_6_6 - 0.00608157467532487*G0_1_1_6_7 - 0.00213676948051955*G0_1_1_6_8 + 0.0187378246753253*G0_1_1_6_9 + 0.00463879870129886*G0_1_1_7_0 + 0.00416396103896119*G0_1_1_7_1 + 0.00089488636363639*G0_1_1_7_2 + 0.00739650974025998*G0_1_1_7_3 - 0.00690340909090933*G0_1_1_7_4 + 0.0013149350649351*G0_1_1_7_5 - 0.00608157467532487*G0_1_1_7_6 + 0.0335308441558453*G0_1_1_7_7 + 0.010355113636364*G0_1_1_7_8 + 0.00493100649350665*G0_1_1_7_9 - 0.00505884740259758*G0_1_1_8_0 - 0.011779626623377*G0_1_1_8_1 - 0.00113230519480523*G0_1_1_8_2 - 0.00739650974025999*G0_1_1_8_3 + 0.00476663961038977*G0_1_1_8_5 - 0.00213676948051955*G0_1_1_8_6 + 0.010355113636364*G0_1_1_8_7 - 0.01479301948052*G0_1_1_8_8 - 0.00295860389610399*G0_1_1_8_9 + 0.00241071428571438*G0_1_1_9_0 + 0.000986201298701331*G0_1_1_9_1 + 0.0033969155844157*G0_1_1_9_2 - 0.017751623376624*G0_1_1_9_3 + 0.0256412337662347*G0_1_1_9_4 - 0.0167654220779227*G0_1_1_9_5 + 0.0187378246753253*G0_1_1_9_6 + 0.00493100649350664*G0_1_1_9_7 - 0.00295860389610399*G0_1_1_9_8 - 0.0788961038961066*G0_1_1_9_9; + A[26] = -A[24] - 0.0107021103896108*G0_1_1_0_0 - 0.00155235389610395*G0_1_1_0_1 - 0.00522017045454566*G0_1_1_0_2 - 0.00133319805194809*G0_1_1_0_3 - 0.00168932629870137*G0_1_1_0_4 + 0.000374391233766255*G0_1_1_0_5 - 0.00214590097402608*G0_1_1_0_6 - 0.00590807629870151*G0_1_1_0_7 + 0.00154322240259745*G0_1_1_0_8 - 0.000821834415584455*G0_1_1_0_9 - 0.00155235389610396*G0_1_1_1_0 - 0.0107021103896108*G0_1_1_1_1 - 0.00522017045454565*G0_1_1_1_2 + 0.000374391233766252*G0_1_1_1_3 - 0.00214590097402606*G0_1_1_1_4 - 0.00133319805194809*G0_1_1_1_5 - 0.00168932629870137*G0_1_1_1_6 + 0.00154322240259746*G0_1_1_1_7 - 0.00590807629870151*G0_1_1_1_8 - 0.000821834415584454*G0_1_1_1_9 - 0.00522017045454566*G0_1_1_2_0 - 0.00522017045454565*G0_1_1_2_1 - 0.0932021103896136*G0_1_1_2_2 + 0.0208198051948059*G0_1_1_2_3 - 0.0452008928571444*G0_1_1_2_4 + 0.020819805194806*G0_1_1_2_5 - 0.0452008928571445*G0_1_1_2_6 - 0.000593547077922097*G0_1_1_2_7 - 0.000593547077922095*G0_1_1_2_8 - 0.00712256493506518*G0_1_1_2_9 - 0.00133319805194809*G0_1_1_3_0 + 0.000374391233766253*G0_1_1_3_1 + 0.0208198051948059*G0_1_1_3_2 - 0.0368181818181831*G0_1_1_3_3 + 0.0201349431818189*G0_1_1_3_4 + 0.00180803571428576*G0_1_1_3_5 + 0.00945109577922113*G0_1_1_3_6 + 0.00838271103896133*G0_1_1_3_7 - 0.0145464691558446*G0_1_1_3_8 - 0.0142999188311693*G0_1_1_3_9 - 0.00168932629870137*G0_1_1_4_0 - 0.00214590097402606*G0_1_1_4_1 - 0.0452008928571444*G0_1_1_4_2 + 0.0201349431818189*G0_1_1_4_3 - 0.0378043831168844*G0_1_1_4_4 + 0.00945109577922114*G0_1_1_4_5 - 0.0189021915584423*G0_1_1_4_6 + 0.00123275162337667*G0_1_1_4_7 + 0.00616375811688331*G0_1_1_4_8 + 0.00246550324675333*G0_1_1_4_9 + 0.000374391233766255*G0_1_1_5_0 - 0.00133319805194809*G0_1_1_5_1 + 0.020819805194806*G0_1_1_5_2 + 0.00180803571428576*G0_1_1_5_3 + 0.00945109577922114*G0_1_1_5_4 - 0.0368181818181831*G0_1_1_5_5 + 0.020134943181819*G0_1_1_5_6 - 0.0145464691558446*G0_1_1_5_7 + 0.00838271103896132*G0_1_1_5_8 - 0.0142999188311693*G0_1_1_5_9 - 0.00214590097402608*G0_1_1_6_0 - 0.00168932629870137*G0_1_1_6_1 - 0.0452008928571445*G0_1_1_6_2 + 0.00945109577922113*G0_1_1_6_3 - 0.0189021915584423*G0_1_1_6_4 + 0.020134943181819*G0_1_1_6_5 - 0.0378043831168846*G0_1_1_6_6 + 0.00616375811688332*G0_1_1_6_7 + 0.00123275162337666*G0_1_1_6_8 + 0.00246550324675331*G0_1_1_6_9 - 0.00590807629870151*G0_1_1_7_0 + 0.00154322240259746*G0_1_1_7_1 - 0.000593547077922097*G0_1_1_7_2 + 0.00838271103896133*G0_1_1_7_3 + 0.00123275162337667*G0_1_1_7_4 - 0.0145464691558446*G0_1_1_7_5 + 0.00616375811688332*G0_1_1_7_6 - 0.0613088474025995*G0_1_1_7_7 + 0.0146286525974031*G0_1_1_7_8 - 0.00986201298701335*G0_1_1_7_9 + 0.00154322240259745*G0_1_1_8_0 - 0.00590807629870151*G0_1_1_8_1 - 0.000593547077922095*G0_1_1_8_2 - 0.0145464691558446*G0_1_1_8_3 + 0.00616375811688331*G0_1_1_8_4 + 0.00838271103896132*G0_1_1_8_5 + 0.00123275162337666*G0_1_1_8_6 + 0.0146286525974031*G0_1_1_8_7 - 0.0613088474025995*G0_1_1_8_8 - 0.00986201298701329*G0_1_1_8_9 - 0.000821834415584455*G0_1_1_9_0 - 0.000821834415584453*G0_1_1_9_1 - 0.00712256493506518*G0_1_1_9_2 - 0.0142999188311693*G0_1_1_9_3 + 0.00246550324675334*G0_1_1_9_4 - 0.0142999188311693*G0_1_1_9_5 + 0.0024655032467533*G0_1_1_9_6 - 0.00986201298701335*G0_1_1_9_7 - 0.00986201298701329*G0_1_1_9_8 - 0.104537337662341*G0_1_1_9_9; + A[84] = A[48] + 0.00138798701298711*G0_0_1_0_0 + 0.0038626217532469*G0_0_1_0_1 - 0.000292207792207795*G0_0_1_0_2 - 0.000657467532467563*G0_0_1_0_3 - 0.000164366883116898*G0_0_1_0_4 + 0.000986201298701361*G0_0_1_0_5 - 0.000986201298701344*G0_0_1_0_6 + 0.00139711850649357*G0_0_1_0_7 + 0.00608157467532488*G0_0_1_0_8 + 0.00345170454545467*G0_0_1_0_9 + 0.0038626217532469*G0_0_1_1_0 + 0.0734172077922102*G0_0_1_1_1 + 0.00276684253246762*G0_0_1_1_2 + 0.0283532873376632*G0_0_1_1_3 - 0.0142999188311693*G0_0_1_1_4 - 0.000164366883116885*G0_0_1_1_5 - 0.00262987012987021*G0_0_1_1_6 - 0.0167654220779227*G0_0_1_1_7 + 0.0456118100649367*G0_0_1_1_8 + 0.00641030844155867*G0_0_1_1_9 - 0.000292207792207795*G0_0_1_2_0 + 0.00276684253246762*G0_0_1_2_1 - 0.00447443181818189*G0_0_1_2_2 + 0.00238331980519487*G0_0_1_2_3 - 0.00550629058441575*G0_0_1_2_4 + 0.00271205357142864*G0_0_1_2_5 - 0.00394480519480528*G0_0_1_2_6 - 0.00213676948051956*G0_0_1_2_7 - 0.000657467532467559*G0_0_1_2_8 - 0.00591720779220799*G0_0_1_2_9 - 0.000657467532467563*G0_0_1_3_0 + 0.0283532873376632*G0_0_1_3_1 + 0.00238331980519488*G0_0_1_3_2 - 0.0739650974026001*G0_0_1_3_3 + 0.000739650974026024*G0_0_1_3_4 + 0.00221895292207799*G0_0_1_3_5 + 0.00591720779220798*G0_0_1_3_6 - 0.019230925324676*G0_0_1_3_9 - 0.000164366883116898*G0_0_1_4_0 - 0.0142999188311693*G0_0_1_4_1 - 0.00550629058441575*G0_0_1_4_2 + 0.000739650974026024*G0_0_1_4_3 - 0.00147930194805197*G0_0_1_4_5 - 0.00443790584415601*G0_0_1_4_6 + 0.00443790584415603*G0_0_1_4_7 + 0.0207102272727279*G0_0_1_4_9 + 0.000986201298701361*G0_0_1_5_0 - 0.000164366883116885*G0_0_1_5_1 + 0.00271205357142864*G0_0_1_5_2 + 0.00221895292207799*G0_0_1_5_3 - 0.00147930194805197*G0_0_1_5_4 - 0.00295860389610392*G0_0_1_5_5 + 0.00147930194805196*G0_0_1_5_6 - 0.00295860389610401*G0_0_1_5_7 - 0.001479301948052*G0_0_1_5_8 - 0.00739650974025998*G0_0_1_5_9 - 0.000986201298701344*G0_0_1_6_0 - 0.00262987012987021*G0_0_1_6_1 - 0.00394480519480528*G0_0_1_6_2 + 0.00591720779220798*G0_0_1_6_3 - 0.00443790584415601*G0_0_1_6_4 + 0.00147930194805196*G0_0_1_6_5 - 0.0207102272727279*G0_0_1_6_6 + 0.00443790584415601*G0_0_1_6_7 + 0.005917207792208*G0_0_1_6_8 + 0.00591720779220799*G0_0_1_6_9 + 0.00139711850649357*G0_0_1_7_0 - 0.0167654220779227*G0_0_1_7_1 - 0.00213676948051956*G0_0_1_7_2 + 0.00443790584415603*G0_0_1_7_4 - 0.00295860389610401*G0_0_1_7_5 + 0.00443790584415601*G0_0_1_7_6 - 0.0414204545454562*G0_0_1_7_7 - 0.036242897727274*G0_0_1_7_8 - 0.019230925324676*G0_0_1_7_9 + 0.00608157467532488*G0_0_1_8_0 + 0.0456118100649367*G0_0_1_8_1 - 0.000657467532467559*G0_0_1_8_2 - 0.001479301948052*G0_0_1_8_5 + 0.005917207792208*G0_0_1_8_6 - 0.036242897727274*G0_0_1_8_7 - 0.019230925324676*G0_0_1_8_9 + 0.00345170454545467*G0_0_1_9_0 + 0.00641030844155867*G0_0_1_9_1 - 0.00591720779220799*G0_0_1_9_2 - 0.019230925324676*G0_0_1_9_3 + 0.0207102272727279*G0_0_1_9_4 - 0.00739650974025997*G0_0_1_9_5 + 0.005917207792208*G0_0_1_9_6 - 0.019230925324676*G0_0_1_9_7 - 0.019230925324676*G0_0_1_9_8 + 0.0887581168831196*G0_0_1_9_9 - 0.00138798701298711*G0_1_0_0_0 - 0.0038626217532469*G0_1_0_0_1 + 0.000292207792207795*G0_1_0_0_2 + 0.000657467532467563*G0_1_0_0_3 + 0.000164366883116898*G0_1_0_0_4 - 0.000986201298701361*G0_1_0_0_5 + 0.000986201298701345*G0_1_0_0_6 - 0.00139711850649357*G0_1_0_0_7 - 0.00608157467532488*G0_1_0_0_8 - 0.00345170454545467*G0_1_0_0_9 - 0.0038626217532469*G0_1_0_1_0 - 0.0734172077922102*G0_1_0_1_1 - 0.00276684253246762*G0_1_0_1_2 - 0.0283532873376632*G0_1_0_1_3 + 0.0142999188311693*G0_1_0_1_4 + 0.000164366883116885*G0_1_0_1_5 + 0.00262987012987021*G0_1_0_1_6 + 0.0167654220779227*G0_1_0_1_7 - 0.0456118100649367*G0_1_0_1_8 - 0.00641030844155867*G0_1_0_1_9 + 0.000292207792207795*G0_1_0_2_0 - 0.00276684253246762*G0_1_0_2_1 + 0.0044744318181819*G0_1_0_2_2 - 0.00238331980519487*G0_1_0_2_3 + 0.00550629058441575*G0_1_0_2_4 - 0.00271205357142864*G0_1_0_2_5 + 0.00394480519480528*G0_1_0_2_6 + 0.00213676948051956*G0_1_0_2_7 + 0.000657467532467559*G0_1_0_2_8 + 0.00591720779220799*G0_1_0_2_9 + 0.000657467532467563*G0_1_0_3_0 - 0.0283532873376632*G0_1_0_3_1 - 0.00238331980519487*G0_1_0_3_2 + 0.0739650974026001*G0_1_0_3_3 - 0.000739650974026024*G0_1_0_3_4 - 0.00221895292207799*G0_1_0_3_5 - 0.00591720779220798*G0_1_0_3_6 + 0.019230925324676*G0_1_0_3_9 + 0.000164366883116898*G0_1_0_4_0 + 0.0142999188311693*G0_1_0_4_1 + 0.00550629058441575*G0_1_0_4_2 - 0.000739650974026024*G0_1_0_4_3 + 0.00147930194805197*G0_1_0_4_5 + 0.00443790584415601*G0_1_0_4_6 - 0.00443790584415603*G0_1_0_4_7 - 0.0207102272727279*G0_1_0_4_9 - 0.000986201298701361*G0_1_0_5_0 + 0.000164366883116885*G0_1_0_5_1 - 0.00271205357142864*G0_1_0_5_2 - 0.00221895292207799*G0_1_0_5_3 + 0.00147930194805197*G0_1_0_5_4 + 0.00295860389610392*G0_1_0_5_5 - 0.00147930194805196*G0_1_0_5_6 + 0.00295860389610401*G0_1_0_5_7 + 0.001479301948052*G0_1_0_5_8 + 0.00739650974025997*G0_1_0_5_9 + 0.000986201298701345*G0_1_0_6_0 + 0.00262987012987021*G0_1_0_6_1 + 0.00394480519480528*G0_1_0_6_2 - 0.00591720779220798*G0_1_0_6_3 + 0.00443790584415601*G0_1_0_6_4 - 0.00147930194805196*G0_1_0_6_5 + 0.0207102272727279*G0_1_0_6_6 - 0.00443790584415601*G0_1_0_6_7 - 0.005917207792208*G0_1_0_6_8 - 0.00591720779220799*G0_1_0_6_9 - 0.00139711850649357*G0_1_0_7_0 + 0.0167654220779227*G0_1_0_7_1 + 0.00213676948051956*G0_1_0_7_2 - 0.00443790584415603*G0_1_0_7_4 + 0.00295860389610401*G0_1_0_7_5 - 0.00443790584415601*G0_1_0_7_6 + 0.0414204545454562*G0_1_0_7_7 + 0.036242897727274*G0_1_0_7_8 + 0.019230925324676*G0_1_0_7_9 - 0.00608157467532488*G0_1_0_8_0 - 0.0456118100649367*G0_1_0_8_1 + 0.000657467532467559*G0_1_0_8_2 + 0.001479301948052*G0_1_0_8_5 - 0.005917207792208*G0_1_0_8_6 + 0.036242897727274*G0_1_0_8_7 + 0.019230925324676*G0_1_0_8_9 - 0.00345170454545467*G0_1_0_9_0 - 0.00641030844155867*G0_1_0_9_1 + 0.00591720779220799*G0_1_0_9_2 + 0.019230925324676*G0_1_0_9_3 - 0.0207102272727279*G0_1_0_9_4 + 0.00739650974025997*G0_1_0_9_5 - 0.005917207792208*G0_1_0_9_6 + 0.019230925324676*G0_1_0_9_7 + 0.019230925324676*G0_1_0_9_8 - 0.0887581168831196*G0_1_0_9_9; + A[47] = A[74] + 0.0044744318181821*G0_0_1_0_0 + 0.00175324675324683*G0_0_1_0_1 + 0.000703125000000039*G0_0_1_0_2 - 0.00279423701298712*G0_0_1_0_3 + 0.000657467532467551*G0_0_1_0_4 + 0.00221895292207806*G0_0_1_0_5 + 0.00723214285714319*G0_0_1_0_7 - 0.00115056818181826*G0_0_1_0_8 + 0.00197240259740268*G0_0_1_0_9 + 0.00175324675324683*G0_0_1_1_0 + 0.0317775974025984*G0_0_1_1_1 + 0.00175324675324681*G0_0_1_1_2 + 0.0123275162337666*G0_0_1_1_3 - 0.00197240259740264*G0_0_1_1_4 + 0.000164366883116895*G0_0_1_1_5 + 0.000164366883116895*G0_0_1_1_6 - 0.00197240259740266*G0_0_1_1_7 + 0.0123275162337667*G0_0_1_1_8 + 0.00394480519480535*G0_0_1_1_9 + 0.000703125000000039*G0_0_1_2_0 + 0.00175324675324681*G0_0_1_2_1 + 0.00447443181818204*G0_0_1_2_2 - 0.00115056818181823*G0_0_1_2_3 + 0.00723214285714313*G0_0_1_2_4 + 0.00221895292207805*G0_0_1_2_6 + 0.000657467532467561*G0_0_1_2_7 - 0.00279423701298711*G0_0_1_2_8 + 0.00197240259740268*G0_0_1_2_9 - 0.00279423701298712*G0_0_1_3_0 + 0.0123275162337666*G0_0_1_3_1 - 0.00115056818181823*G0_0_1_3_2 - 0.072485795454548*G0_0_1_3_3 - 0.020710227272728*G0_0_1_3_4 + 0.00591720779220799*G0_0_1_3_5 - 0.00443790584415602*G0_0_1_3_6 + 0.004437905844156*G0_0_1_3_7 - 0.00887581168831197*G0_0_1_3_8 - 0.020710227272728*G0_0_1_3_9 + 0.000657467532467551*G0_0_1_4_0 - 0.00197240259740264*G0_0_1_4_1 + 0.00723214285714313*G0_0_1_4_2 - 0.020710227272728*G0_0_1_4_3 - 0.005917207792208*G0_0_1_4_5 + 0.010355113636364*G0_0_1_4_6 + 0.00443790584415599*G0_0_1_4_8 + 0.00591720779220795*G0_0_1_4_9 + 0.00221895292207806*G0_0_1_5_0 + 0.000164366883116895*G0_0_1_5_1 + 0.00591720779220799*G0_0_1_5_3 - 0.005917207792208*G0_0_1_5_4 + 0.00887581168831215*G0_0_1_5_5 - 0.0110947646103901*G0_0_1_5_6 + 0.0103551136363641*G0_0_1_5_7 - 0.00443790584415603*G0_0_1_5_8 + 0.00295860389610402*G0_0_1_5_9 + 0.000164366883116895*G0_0_1_6_1 + 0.00221895292207805*G0_0_1_6_2 - 0.00443790584415602*G0_0_1_6_3 + 0.010355113636364*G0_0_1_6_4 - 0.0110947646103901*G0_0_1_6_5 + 0.0088758116883122*G0_0_1_6_6 - 0.00591720779220803*G0_0_1_6_7 + 0.005917207792208*G0_0_1_6_8 + 0.00295860389610401*G0_0_1_6_9 + 0.00723214285714319*G0_0_1_7_0 - 0.00197240259740266*G0_0_1_7_1 + 0.000657467532467561*G0_0_1_7_2 + 0.004437905844156*G0_0_1_7_3 + 0.0103551136363641*G0_0_1_7_5 - 0.00591720779220803*G0_0_1_7_6 - 0.0207102272727281*G0_0_1_7_8 + 0.00591720779220803*G0_0_1_7_9 - 0.00115056818181826*G0_0_1_8_0 + 0.0123275162337667*G0_0_1_8_1 - 0.00279423701298711*G0_0_1_8_2 - 0.00887581168831197*G0_0_1_8_3 + 0.00443790584415599*G0_0_1_8_4 - 0.00443790584415603*G0_0_1_8_5 + 0.005917207792208*G0_0_1_8_6 - 0.0207102272727281*G0_0_1_8_7 - 0.0724857954545479*G0_0_1_8_8 - 0.020710227272728*G0_0_1_8_9 + 0.00197240259740268*G0_0_1_9_0 + 0.00394480519480535*G0_0_1_9_1 + 0.00197240259740268*G0_0_1_9_2 - 0.020710227272728*G0_0_1_9_3 + 0.00591720779220795*G0_0_1_9_4 + 0.00295860389610402*G0_0_1_9_5 + 0.00295860389610401*G0_0_1_9_6 + 0.00591720779220803*G0_0_1_9_7 - 0.020710227272728*G0_0_1_9_8 + 0.124261363636368*G0_0_1_9_9 - 0.0044744318181821*G0_1_0_0_0 - 0.00175324675324683*G0_1_0_0_1 - 0.000703125000000039*G0_1_0_0_2 + 0.00279423701298712*G0_1_0_0_3 - 0.000657467532467551*G0_1_0_0_4 - 0.00221895292207806*G0_1_0_0_5 - 0.00723214285714319*G0_1_0_0_7 + 0.00115056818181826*G0_1_0_0_8 - 0.00197240259740268*G0_1_0_0_9 - 0.00175324675324683*G0_1_0_1_0 - 0.0317775974025984*G0_1_0_1_1 - 0.00175324675324681*G0_1_0_1_2 - 0.0123275162337666*G0_1_0_1_3 + 0.00197240259740264*G0_1_0_1_4 - 0.000164366883116895*G0_1_0_1_5 - 0.000164366883116895*G0_1_0_1_6 + 0.00197240259740266*G0_1_0_1_7 - 0.0123275162337667*G0_1_0_1_8 - 0.00394480519480535*G0_1_0_1_9 - 0.000703125000000039*G0_1_0_2_0 - 0.00175324675324681*G0_1_0_2_1 - 0.00447443181818204*G0_1_0_2_2 + 0.00115056818181823*G0_1_0_2_3 - 0.00723214285714313*G0_1_0_2_4 - 0.00221895292207805*G0_1_0_2_6 - 0.000657467532467561*G0_1_0_2_7 + 0.00279423701298711*G0_1_0_2_8 - 0.00197240259740268*G0_1_0_2_9 + 0.00279423701298712*G0_1_0_3_0 - 0.0123275162337666*G0_1_0_3_1 + 0.00115056818181823*G0_1_0_3_2 + 0.072485795454548*G0_1_0_3_3 + 0.020710227272728*G0_1_0_3_4 - 0.00591720779220799*G0_1_0_3_5 + 0.00443790584415602*G0_1_0_3_6 - 0.004437905844156*G0_1_0_3_7 + 0.00887581168831197*G0_1_0_3_8 + 0.020710227272728*G0_1_0_3_9 - 0.000657467532467551*G0_1_0_4_0 + 0.00197240259740264*G0_1_0_4_1 - 0.00723214285714313*G0_1_0_4_2 + 0.020710227272728*G0_1_0_4_3 + 0.005917207792208*G0_1_0_4_5 - 0.010355113636364*G0_1_0_4_6 - 0.00443790584415599*G0_1_0_4_8 - 0.00591720779220795*G0_1_0_4_9 - 0.00221895292207806*G0_1_0_5_0 - 0.000164366883116895*G0_1_0_5_1 - 0.00591720779220799*G0_1_0_5_3 + 0.005917207792208*G0_1_0_5_4 - 0.00887581168831214*G0_1_0_5_5 + 0.0110947646103901*G0_1_0_5_6 - 0.0103551136363641*G0_1_0_5_7 + 0.00443790584415603*G0_1_0_5_8 - 0.00295860389610402*G0_1_0_5_9 - 0.000164366883116894*G0_1_0_6_1 - 0.00221895292207805*G0_1_0_6_2 + 0.00443790584415602*G0_1_0_6_3 - 0.010355113636364*G0_1_0_6_4 + 0.0110947646103901*G0_1_0_6_5 - 0.0088758116883122*G0_1_0_6_6 + 0.00591720779220803*G0_1_0_6_7 - 0.005917207792208*G0_1_0_6_8 - 0.00295860389610401*G0_1_0_6_9 - 0.00723214285714319*G0_1_0_7_0 + 0.00197240259740266*G0_1_0_7_1 - 0.000657467532467561*G0_1_0_7_2 - 0.004437905844156*G0_1_0_7_3 - 0.0103551136363641*G0_1_0_7_5 + 0.00591720779220803*G0_1_0_7_6 + 0.0207102272727281*G0_1_0_7_8 - 0.00591720779220803*G0_1_0_7_9 + 0.00115056818181826*G0_1_0_8_0 - 0.0123275162337667*G0_1_0_8_1 + 0.00279423701298711*G0_1_0_8_2 + 0.00887581168831197*G0_1_0_8_3 - 0.00443790584415599*G0_1_0_8_4 + 0.00443790584415603*G0_1_0_8_5 - 0.005917207792208*G0_1_0_8_6 + 0.0207102272727281*G0_1_0_8_7 + 0.0724857954545479*G0_1_0_8_8 + 0.020710227272728*G0_1_0_8_9 - 0.00197240259740268*G0_1_0_9_0 - 0.00394480519480535*G0_1_0_9_1 - 0.00197240259740268*G0_1_0_9_2 + 0.020710227272728*G0_1_0_9_3 - 0.00591720779220795*G0_1_0_9_4 - 0.00295860389610402*G0_1_0_9_5 - 0.00295860389610401*G0_1_0_9_6 - 0.00591720779220803*G0_1_0_9_7 + 0.020710227272728*G0_1_0_9_8 - 0.124261363636368*G0_1_0_9_9; + A[67] = -A[47] - 0.0778916396103923*G0_1_0_0_0 - 0.00561586850649371*G0_1_0_0_1 - 0.00346996753246765*G0_1_0_0_2 + 0.00295860389610403*G0_1_0_0_3 + 0.00197240259740268*G0_1_0_0_4 - 0.0305722402597413*G0_1_0_0_5 + 0.0142999188311693*G0_1_0_0_6 - 0.0528439529220798*G0_1_0_0_7 + 0.0179159902597409*G0_1_0_0_8 - 0.00838271103896136*G0_1_0_0_9 - 0.00561586850649371*G0_1_0_1_0 - 0.0331655844155855*G0_1_0_1_1 - 0.00146103896103901*G0_1_0_1_2 - 0.0133137175324679*G0_1_0_1_3 + 0.00295860389610398*G0_1_0_1_4 + 0.000493100649350657*G0_1_0_1_5 - 0.00410917207792221*G0_1_0_1_7 - 0.0137246347402602*G0_1_0_1_8 - 0.00739650974026001*G0_1_0_1_9 - 0.00346996753246765*G0_1_0_2_0 - 0.00146103896103901*G0_1_0_2_1 - 0.00156148538961044*G0_1_0_2_3 - 0.00328733766233779*G0_1_0_2_4 - 0.00238331980519488*G0_1_0_2_5 + 0.00328733766233777*G0_1_0_2_6 + 0.00493100649350666*G0_1_0_2_8 + 0.00394480519480532*G0_1_0_2_9 + 0.00295860389610403*G0_1_0_3_0 - 0.0133137175324679*G0_1_0_3_1 - 0.00156148538961044*G0_1_0_3_2 + 0.0754443993506521*G0_1_0_3_3 + 0.019230925324676*G0_1_0_3_4 - 0.00813616071428597*G0_1_0_3_5 + 0.00591720779220799*G0_1_0_3_6 - 0.00295860389610401*G0_1_0_3_7 + 0.011834415584416*G0_1_0_3_8 + 0.028106737012988*G0_1_0_3_9 + 0.00197240259740268*G0_1_0_4_0 + 0.00295860389610398*G0_1_0_4_1 - 0.00328733766233779*G0_1_0_4_2 + 0.019230925324676*G0_1_0_4_3 + 0.0207102272727281*G0_1_0_4_4 - 0.00591720779220797*G0_1_0_4_6 - 0.00591720779220801*G0_1_0_4_7 - 0.00887581168831198*G0_1_0_4_8 - 0.0118344155844159*G0_1_0_4_9 - 0.0305722402597413*G0_1_0_5_0 + 0.000493100649350657*G0_1_0_5_1 - 0.00238331980519488*G0_1_0_5_2 - 0.00813616071428597*G0_1_0_5_3 + 0.0650892857142877*G0_1_0_5_5 + 0.010355113636364*G0_1_0_5_6 - 0.010355113636364*G0_1_0_5_7 + 0.00443790584415602*G0_1_0_5_8 + 0.016272321428572*G0_1_0_5_9 + 0.0142999188311693*G0_1_0_6_0 + 0.00328733766233777*G0_1_0_6_2 + 0.00591720779220799*G0_1_0_6_3 - 0.00591720779220797*G0_1_0_6_4 + 0.010355113636364*G0_1_0_6_5 - 0.00887581168831198*G0_1_0_6_6 + 0.00591720779220799*G0_1_0_6_7 - 0.010355113636364*G0_1_0_6_8 - 0.0236688311688319*G0_1_0_6_9 - 0.0528439529220798*G0_1_0_7_0 - 0.00410917207792221*G0_1_0_7_1 - 0.00295860389610401*G0_1_0_7_3 - 0.00591720779220801*G0_1_0_7_4 - 0.010355113636364*G0_1_0_7_5 + 0.00591720779220799*G0_1_0_7_6 + 0.056953125000002*G0_1_0_7_8 + 0.013313717532468*G0_1_0_7_9 + 0.0179159902597409*G0_1_0_8_0 - 0.0137246347402602*G0_1_0_8_1 + 0.00493100649350666*G0_1_0_8_2 + 0.011834415584416*G0_1_0_8_3 - 0.00887581168831198*G0_1_0_8_4 + 0.00443790584415602*G0_1_0_8_5 - 0.010355113636364*G0_1_0_8_6 + 0.056953125000002*G0_1_0_8_7 + 0.113906250000004*G0_1_0_8_8 + 0.039941152597404*G0_1_0_8_9 - 0.00838271103896136*G0_1_0_9_0 - 0.00739650974026001*G0_1_0_9_1 + 0.00394480519480532*G0_1_0_9_2 + 0.028106737012988*G0_1_0_9_3 - 0.0118344155844159*G0_1_0_9_4 + 0.016272321428572*G0_1_0_9_5 - 0.0236688311688319*G0_1_0_9_6 + 0.013313717532468*G0_1_0_9_7 + 0.039941152597404*G0_1_0_9_8 - 0.213019480519488*G0_1_0_9_9 + 0.0147017045454551*G0_1_1_0_0 + 0.00144277597402602*G0_1_1_0_1 + 0.000264813311688318*G0_1_1_0_2 + 0.00147930194805202*G0_1_1_0_3 + 0.00197240259740267*G0_1_1_0_4 + 0.0101085633116887*G0_1_1_0_5 - 0.00295860389610401*G0_1_1_0_6 + 0.0198883928571436*G0_1_1_0_7 - 0.0166010551948058*G0_1_1_0_8 + 0.00887581168831201*G0_1_1_0_9 + 0.00144277597402602*G0_1_1_1_0 - 0.0347909902597414*G0_1_1_1_1 - 0.00136059253246758*G0_1_1_1_2 - 0.0147930194805199*G0_1_1_1_3 + 0.00345170454545464*G0_1_1_1_4 - 0.00221895292207799*G0_1_1_1_5 - 0.00197240259740267*G0_1_1_1_6 + 0.00788961038961069*G0_1_1_1_7 - 0.02218952922078*G0_1_1_1_8 - 0.0138068181818187*G0_1_1_1_9 + 0.000264813311688318*G0_1_1_2_0 - 0.00136059253246758*G0_1_1_2_1 - 0.0027394480519482*G0_1_1_2_2 - 0.000904017857142882*G0_1_1_2_3 - 0.00657467532467558*G0_1_1_2_4 + 0.0023833198051949*G0_1_1_2_5 - 0.000821834415584487*G0_1_1_2_6 + 0.009615462662338*G0_1_1_2_7 + 0.00271205357142866*G0_1_1_2_8 + 0.00345170454545466*G0_1_1_2_9 + 0.00147930194805202*G0_1_1_3_0 - 0.0147930194805199*G0_1_1_3_1 - 0.000904017857142883*G0_1_1_3_2 + 0.0843202110389642*G0_1_1_3_3 + 0.019970576298702*G0_1_1_3_4 + 0.000739650974025969*G0_1_1_3_5 + 0.00665685876623399*G0_1_1_3_6 - 0.00369825487013008*G0_1_1_3_7 + 0.01109476461039*G0_1_1_3_8 + 0.048816964285716*G0_1_1_3_9 + 0.00197240259740267*G0_1_1_4_0 + 0.00345170454545464*G0_1_1_4_1 - 0.00657467532467558*G0_1_1_4_2 + 0.019970576298702*G0_1_1_4_3 + 0.0310653409090921*G0_1_1_4_4 - 0.00517755681818199*G0_1_1_4_5 - 0.00147930194805198*G0_1_1_4_6 - 0.017751623376624*G0_1_1_4_7 - 0.00739650974025998*G0_1_1_4_8 + 0.0101085633116887*G0_1_1_5_0 - 0.00221895292207799*G0_1_1_5_1 + 0.0023833198051949*G0_1_1_5_2 + 0.00073965097402597*G0_1_1_5_3 - 0.00517755681818199*G0_1_1_5_4 - 0.0325446428571439*G0_1_1_5_5 - 0.00517755681818198*G0_1_1_5_6 + 0.0207102272727281*G0_1_1_5_7 + 0.00739650974025996*G0_1_1_5_8 - 0.0414204545454559*G0_1_1_5_9 - 0.00295860389610401*G0_1_1_6_0 - 0.00197240259740267*G0_1_1_6_1 - 0.000821834415584487*G0_1_1_6_2 + 0.00665685876623399*G0_1_1_6_3 - 0.00147930194805198*G0_1_1_6_4 - 0.00517755681818198*G0_1_1_6_5 - 0.013313717532468*G0_1_1_6_6 - 0.028106737012988*G0_1_1_6_7 - 0.00147930194805198*G0_1_1_6_8 - 0.023668831168832*G0_1_1_6_9 + 0.0198883928571436*G0_1_1_7_0 + 0.00788961038961069*G0_1_1_7_1 + 0.009615462662338*G0_1_1_7_2 - 0.00369825487013008*G0_1_1_7_3 - 0.017751623376624*G0_1_1_7_4 + 0.0207102272727281*G0_1_1_7_5 - 0.028106737012988*G0_1_1_7_6 + 0.257398538961048*G0_1_1_7_7 + 0.0118344155844159*G0_1_1_7_8 + 0.0295860389610401*G0_1_1_7_9 - 0.0166010551948058*G0_1_1_8_0 - 0.02218952922078*G0_1_1_8_1 + 0.00271205357142866*G0_1_1_8_2 + 0.01109476461039*G0_1_1_8_3 - 0.00739650974025998*G0_1_1_8_4 + 0.00739650974025996*G0_1_1_8_5 - 0.00147930194805198*G0_1_1_8_6 + 0.0118344155844159*G0_1_1_8_7 + 0.130178571428576*G0_1_1_8_8 + 0.0562134740259759*G0_1_1_8_9 + 0.00887581168831201*G0_1_1_9_0 - 0.0138068181818187*G0_1_1_9_1 + 0.00345170454545466*G0_1_1_9_2 + 0.048816964285716*G0_1_1_9_3 - 0.0414204545454559*G0_1_1_9_5 - 0.023668831168832*G0_1_1_9_6 + 0.0295860389610401*G0_1_1_9_7 + 0.0562134740259759*G0_1_1_9_8 - 0.230771103896112*G0_1_1_9_9; + A[76] = A[67] - 0.0734172077922102*G0_0_1_0_0 - 0.00386262175324689*G0_0_1_0_1 - 0.00276684253246761*G0_0_1_0_2 + 0.000164366883116903*G0_0_1_0_3 + 0.00262987012987023*G0_0_1_0_4 - 0.0283532873376633*G0_0_1_0_5 + 0.0142999188311693*G0_0_1_0_6 - 0.0456118100649366*G0_0_1_0_7 + 0.0167654220779226*G0_0_1_0_8 - 0.00641030844155869*G0_0_1_0_9 - 0.00386262175324689*G0_0_1_1_0 - 0.00138798701298708*G0_0_1_1_1 + 0.000292207792207805*G0_0_1_1_2 - 0.000986201298701342*G0_0_1_1_3 + 0.000986201298701338*G0_0_1_1_4 + 0.000657467532467553*G0_0_1_1_5 + 0.000164366883116895*G0_0_1_1_6 - 0.00608157467532487*G0_0_1_1_7 - 0.00139711850649357*G0_0_1_1_8 - 0.00345170454545467*G0_0_1_1_9 - 0.00276684253246761*G0_0_1_2_0 + 0.000292207792207805*G0_0_1_2_1 + 0.00447443181818203*G0_0_1_2_2 - 0.00271205357142867*G0_0_1_2_3 + 0.00394480519480534*G0_0_1_2_4 - 0.0023833198051949*G0_0_1_2_5 + 0.00550629058441582*G0_0_1_2_6 + 0.000657467532467567*G0_0_1_2_7 + 0.00213676948051955*G0_0_1_2_8 + 0.005917207792208*G0_0_1_2_9 + 0.000164366883116903*G0_0_1_3_0 - 0.000986201298701342*G0_0_1_3_1 - 0.00271205357142867*G0_0_1_3_2 + 0.00295860389610407*G0_0_1_3_3 - 0.00147930194805198*G0_0_1_3_4 - 0.00221895292207798*G0_0_1_3_5 + 0.00147930194805197*G0_0_1_3_6 + 0.00147930194805199*G0_0_1_3_7 + 0.00295860389610398*G0_0_1_3_8 + 0.00739650974025998*G0_0_1_3_9 + 0.00262987012987023*G0_0_1_4_0 + 0.000986201298701338*G0_0_1_4_1 + 0.00394480519480534*G0_0_1_4_2 - 0.00147930194805198*G0_0_1_4_3 + 0.020710227272728*G0_0_1_4_4 - 0.00591720779220802*G0_0_1_4_5 + 0.00443790584415605*G0_0_1_4_6 - 0.00591720779220801*G0_0_1_4_7 - 0.00443790584415599*G0_0_1_4_8 - 0.00591720779220796*G0_0_1_4_9 - 0.0283532873376633*G0_0_1_5_0 + 0.000657467532467553*G0_0_1_5_1 - 0.0023833198051949*G0_0_1_5_2 - 0.00221895292207798*G0_0_1_5_3 - 0.00591720779220802*G0_0_1_5_4 + 0.0739650974025999*G0_0_1_5_5 - 0.000739650974026059*G0_0_1_5_6 + 0.019230925324676*G0_0_1_5_9 + 0.0142999188311693*G0_0_1_6_0 + 0.000164366883116894*G0_0_1_6_1 + 0.00550629058441582*G0_0_1_6_2 + 0.00147930194805197*G0_0_1_6_3 + 0.00443790584415605*G0_0_1_6_4 - 0.000739650974026059*G0_0_1_6_5 - 0.00443790584415599*G0_0_1_6_8 - 0.0207102272727279*G0_0_1_6_9 - 0.0456118100649366*G0_0_1_7_0 - 0.00608157467532487*G0_0_1_7_1 + 0.000657467532467568*G0_0_1_7_2 + 0.00147930194805199*G0_0_1_7_3 - 0.00591720779220801*G0_0_1_7_4 + 0.0362428977272739*G0_0_1_7_8 + 0.019230925324676*G0_0_1_7_9 + 0.0167654220779226*G0_0_1_8_0 - 0.00139711850649357*G0_0_1_8_1 + 0.00213676948051955*G0_0_1_8_2 + 0.00295860389610398*G0_0_1_8_3 - 0.00443790584415599*G0_0_1_8_4 - 0.00443790584415599*G0_0_1_8_6 + 0.0362428977272739*G0_0_1_8_7 + 0.041420454545456*G0_0_1_8_8 + 0.019230925324676*G0_0_1_8_9 - 0.00641030844155869*G0_0_1_9_0 - 0.00345170454545467*G0_0_1_9_1 + 0.005917207792208*G0_0_1_9_2 + 0.00739650974025998*G0_0_1_9_3 - 0.00591720779220797*G0_0_1_9_4 + 0.019230925324676*G0_0_1_9_5 - 0.0207102272727279*G0_0_1_9_6 + 0.019230925324676*G0_0_1_9_7 + 0.019230925324676*G0_0_1_9_8 - 0.0887581168831198*G0_0_1_9_9 + 0.0734172077922102*G0_1_0_0_0 + 0.00386262175324689*G0_1_0_0_1 + 0.00276684253246761*G0_1_0_0_2 - 0.000164366883116903*G0_1_0_0_3 - 0.00262987012987023*G0_1_0_0_4 + 0.0283532873376633*G0_1_0_0_5 - 0.0142999188311693*G0_1_0_0_6 + 0.0456118100649366*G0_1_0_0_7 - 0.0167654220779226*G0_1_0_0_8 + 0.00641030844155869*G0_1_0_0_9 + 0.00386262175324689*G0_1_0_1_0 + 0.00138798701298708*G0_1_0_1_1 - 0.000292207792207805*G0_1_0_1_2 + 0.000986201298701342*G0_1_0_1_3 - 0.000986201298701338*G0_1_0_1_4 - 0.000657467532467553*G0_1_0_1_5 - 0.000164366883116894*G0_1_0_1_6 + 0.00608157467532487*G0_1_0_1_7 + 0.00139711850649357*G0_1_0_1_8 + 0.00345170454545467*G0_1_0_1_9 + 0.00276684253246761*G0_1_0_2_0 - 0.000292207792207805*G0_1_0_2_1 - 0.00447443181818203*G0_1_0_2_2 + 0.00271205357142867*G0_1_0_2_3 - 0.00394480519480534*G0_1_0_2_4 + 0.0023833198051949*G0_1_0_2_5 - 0.00550629058441582*G0_1_0_2_6 - 0.000657467532467568*G0_1_0_2_7 - 0.00213676948051955*G0_1_0_2_8 - 0.005917207792208*G0_1_0_2_9 - 0.000164366883116903*G0_1_0_3_0 + 0.000986201298701342*G0_1_0_3_1 + 0.00271205357142867*G0_1_0_3_2 - 0.00295860389610407*G0_1_0_3_3 + 0.00147930194805198*G0_1_0_3_4 + 0.00221895292207798*G0_1_0_3_5 - 0.00147930194805197*G0_1_0_3_6 - 0.00147930194805199*G0_1_0_3_7 - 0.00295860389610399*G0_1_0_3_8 - 0.00739650974025998*G0_1_0_3_9 - 0.00262987012987023*G0_1_0_4_0 - 0.000986201298701338*G0_1_0_4_1 - 0.00394480519480534*G0_1_0_4_2 + 0.00147930194805198*G0_1_0_4_3 - 0.020710227272728*G0_1_0_4_4 + 0.00591720779220802*G0_1_0_4_5 - 0.00443790584415605*G0_1_0_4_6 + 0.00591720779220801*G0_1_0_4_7 + 0.00443790584415599*G0_1_0_4_8 + 0.00591720779220797*G0_1_0_4_9 + 0.0283532873376633*G0_1_0_5_0 - 0.000657467532467552*G0_1_0_5_1 + 0.0023833198051949*G0_1_0_5_2 + 0.00221895292207798*G0_1_0_5_3 + 0.00591720779220802*G0_1_0_5_4 - 0.0739650974025999*G0_1_0_5_5 + 0.000739650974026058*G0_1_0_5_6 - 0.019230925324676*G0_1_0_5_9 - 0.0142999188311693*G0_1_0_6_0 - 0.000164366883116894*G0_1_0_6_1 - 0.00550629058441582*G0_1_0_6_2 - 0.00147930194805197*G0_1_0_6_3 - 0.00443790584415605*G0_1_0_6_4 + 0.000739650974026057*G0_1_0_6_5 + 0.00443790584415599*G0_1_0_6_8 + 0.0207102272727279*G0_1_0_6_9 + 0.0456118100649366*G0_1_0_7_0 + 0.00608157467532487*G0_1_0_7_1 - 0.000657467532467567*G0_1_0_7_2 - 0.00147930194805199*G0_1_0_7_3 + 0.00591720779220801*G0_1_0_7_4 - 0.0362428977272739*G0_1_0_7_8 - 0.019230925324676*G0_1_0_7_9 - 0.0167654220779226*G0_1_0_8_0 + 0.00139711850649357*G0_1_0_8_1 - 0.00213676948051955*G0_1_0_8_2 - 0.00295860389610398*G0_1_0_8_3 + 0.00443790584415599*G0_1_0_8_4 + 0.00443790584415599*G0_1_0_8_6 - 0.0362428977272739*G0_1_0_8_7 - 0.041420454545456*G0_1_0_8_8 - 0.019230925324676*G0_1_0_8_9 + 0.00641030844155868*G0_1_0_9_0 + 0.00345170454545467*G0_1_0_9_1 - 0.005917207792208*G0_1_0_9_2 - 0.00739650974025998*G0_1_0_9_3 + 0.00591720779220797*G0_1_0_9_4 - 0.019230925324676*G0_1_0_9_5 + 0.0207102272727279*G0_1_0_9_6 - 0.019230925324676*G0_1_0_9_7 - 0.019230925324676*G0_1_0_9_8 + 0.0887581168831198*G0_1_0_9_9; + A[91] = A[19] - 0.00196022727272735*G0_0_1_0_0 - 0.00098011363636368*G0_0_1_0_1 + 0.00213676948051957*G0_0_1_0_3 - 0.00213676948051956*G0_0_1_0_4 - 0.00158887987012993*G0_0_1_0_5 + 0.000876623376623409*G0_0_1_0_6 - 0.00109577922077926*G0_0_1_0_7 - 0.00405438311688327*G0_0_1_0_8 - 0.00525974025974044*G0_0_1_0_9 - 0.00098011363636368*G0_0_1_1_0 + 0.000980113636363665*G0_0_1_1_2 + 0.0147930194805199*G0_0_1_1_3 - 0.00493100649350663*G0_0_1_1_4 - 0.000164366883116885*G0_0_1_1_5 + 0.000164366883116887*G0_0_1_1_6 + 0.0049310064935067*G0_0_1_1_7 - 0.0147930194805201*G0_0_1_1_8 + 0.000980113636363665*G0_0_1_2_1 + 0.00196022727272736*G0_0_1_2_2 + 0.00405438311688324*G0_0_1_2_3 + 0.00109577922077927*G0_0_1_2_4 - 0.000876623376623413*G0_0_1_2_5 + 0.00158887987012994*G0_0_1_2_6 + 0.00213676948051956*G0_0_1_2_7 - 0.00213676948051955*G0_0_1_2_8 + 0.00525974025974044*G0_0_1_2_9 + 0.00213676948051957*G0_0_1_3_0 + 0.0147930194805199*G0_0_1_3_1 + 0.00405438311688324*G0_0_1_3_2 + 0.0936891233766266*G0_0_1_3_3 - 0.0212033279220786*G0_0_1_3_4 - 0.002958603896104*G0_0_1_3_5 - 0.000493100649350682*G0_0_1_3_6 - 0.00641030844155869*G0_0_1_3_7 + 0.0128206168831174*G0_0_1_3_9 - 0.00213676948051956*G0_0_1_4_0 - 0.00493100649350663*G0_0_1_4_1 + 0.00109577922077927*G0_0_1_4_2 - 0.0212033279220786*G0_0_1_4_3 - 0.035503246753248*G0_0_1_4_4 + 0.00641030844155865*G0_0_1_4_5 - 0.00591720779220798*G0_0_1_4_6 + 0.00641030844155865*G0_0_1_4_8 - 0.0285998376623386*G0_0_1_4_9 - 0.00158887987012993*G0_0_1_5_0 - 0.000164366883116885*G0_0_1_5_1 - 0.000876623376623413*G0_0_1_5_2 - 0.002958603896104*G0_0_1_5_3 + 0.00641030844155865*G0_0_1_5_4 - 0.00394480519480529*G0_0_1_5_5 + 0.00591720779220801*G0_0_1_5_7 + 0.000493100649350658*G0_0_1_5_8 + 0.01479301948052*G0_0_1_5_9 + 0.000876623376623409*G0_0_1_6_0 + 0.000164366883116887*G0_0_1_6_1 + 0.00158887987012994*G0_0_1_6_2 - 0.000493100649350682*G0_0_1_6_3 - 0.00591720779220798*G0_0_1_6_4 + 0.00394480519480537*G0_0_1_6_6 - 0.00641030844155866*G0_0_1_6_7 + 0.00295860389610399*G0_0_1_6_8 - 0.01479301948052*G0_0_1_6_9 - 0.00109577922077926*G0_0_1_7_0 + 0.0049310064935067*G0_0_1_7_1 + 0.00213676948051956*G0_0_1_7_2 - 0.00641030844155869*G0_0_1_7_3 + 0.00591720779220801*G0_0_1_7_5 - 0.00641030844155866*G0_0_1_7_6 + 0.0355032467532481*G0_0_1_7_7 + 0.0212033279220787*G0_0_1_7_8 + 0.0285998376623387*G0_0_1_7_9 - 0.00405438311688327*G0_0_1_8_0 - 0.0147930194805201*G0_0_1_8_1 - 0.00213676948051955*G0_0_1_8_2 + 0.00641030844155865*G0_0_1_8_4 + 0.000493100649350658*G0_0_1_8_5 + 0.00295860389610399*G0_0_1_8_6 + 0.0212033279220787*G0_0_1_8_7 - 0.0936891233766267*G0_0_1_8_8 - 0.0128206168831173*G0_0_1_8_9 - 0.00525974025974044*G0_0_1_9_0 + 0.00525974025974044*G0_0_1_9_2 + 0.0128206168831174*G0_0_1_9_3 - 0.0285998376623386*G0_0_1_9_4 + 0.01479301948052*G0_0_1_9_5 - 0.01479301948052*G0_0_1_9_6 + 0.0285998376623387*G0_0_1_9_7 - 0.0128206168831173*G0_0_1_9_8 + 0.00196022727272735*G0_1_0_0_0 + 0.00098011363636368*G0_1_0_0_1 - 0.00213676948051956*G0_1_0_0_3 + 0.00213676948051956*G0_1_0_0_4 + 0.00158887987012993*G0_1_0_0_5 - 0.000876623376623409*G0_1_0_0_6 + 0.00109577922077926*G0_1_0_0_7 + 0.00405438311688327*G0_1_0_0_8 + 0.00525974025974044*G0_1_0_0_9 + 0.00098011363636368*G0_1_0_1_0 - 0.000980113636363665*G0_1_0_1_2 - 0.0147930194805199*G0_1_0_1_3 + 0.00493100649350663*G0_1_0_1_4 + 0.000164366883116885*G0_1_0_1_5 - 0.000164366883116888*G0_1_0_1_6 - 0.00493100649350671*G0_1_0_1_7 + 0.0147930194805201*G0_1_0_1_8 - 0.000980113636363665*G0_1_0_2_1 - 0.00196022727272736*G0_1_0_2_2 - 0.00405438311688324*G0_1_0_2_3 - 0.00109577922077927*G0_1_0_2_4 + 0.000876623376623413*G0_1_0_2_5 - 0.00158887987012994*G0_1_0_2_6 - 0.00213676948051956*G0_1_0_2_7 + 0.00213676948051955*G0_1_0_2_8 - 0.00525974025974044*G0_1_0_2_9 - 0.00213676948051956*G0_1_0_3_0 - 0.0147930194805199*G0_1_0_3_1 - 0.00405438311688324*G0_1_0_3_2 - 0.0936891233766266*G0_1_0_3_3 + 0.0212033279220786*G0_1_0_3_4 + 0.002958603896104*G0_1_0_3_5 + 0.000493100649350682*G0_1_0_3_6 + 0.00641030844155869*G0_1_0_3_7 - 0.0128206168831174*G0_1_0_3_9 + 0.00213676948051956*G0_1_0_4_0 + 0.00493100649350663*G0_1_0_4_1 - 0.00109577922077928*G0_1_0_4_2 + 0.0212033279220786*G0_1_0_4_3 + 0.035503246753248*G0_1_0_4_4 - 0.00641030844155865*G0_1_0_4_5 + 0.00591720779220798*G0_1_0_4_6 - 0.00641030844155865*G0_1_0_4_8 + 0.0285998376623386*G0_1_0_4_9 + 0.00158887987012993*G0_1_0_5_0 + 0.000164366883116885*G0_1_0_5_1 + 0.000876623376623413*G0_1_0_5_2 + 0.002958603896104*G0_1_0_5_3 - 0.00641030844155865*G0_1_0_5_4 + 0.00394480519480529*G0_1_0_5_5 - 0.00591720779220801*G0_1_0_5_7 - 0.000493100649350658*G0_1_0_5_8 - 0.01479301948052*G0_1_0_5_9 - 0.000876623376623409*G0_1_0_6_0 - 0.000164366883116888*G0_1_0_6_1 - 0.00158887987012994*G0_1_0_6_2 + 0.000493100649350682*G0_1_0_6_3 + 0.00591720779220798*G0_1_0_6_4 - 0.00394480519480537*G0_1_0_6_6 + 0.00641030844155866*G0_1_0_6_7 - 0.00295860389610399*G0_1_0_6_8 + 0.01479301948052*G0_1_0_6_9 + 0.00109577922077926*G0_1_0_7_0 - 0.00493100649350671*G0_1_0_7_1 - 0.00213676948051956*G0_1_0_7_2 + 0.00641030844155869*G0_1_0_7_3 - 0.00591720779220801*G0_1_0_7_5 + 0.00641030844155866*G0_1_0_7_6 - 0.0355032467532481*G0_1_0_7_7 - 0.0212033279220787*G0_1_0_7_8 - 0.0285998376623387*G0_1_0_7_9 + 0.00405438311688327*G0_1_0_8_0 + 0.0147930194805201*G0_1_0_8_1 + 0.00213676948051955*G0_1_0_8_2 - 0.00641030844155865*G0_1_0_8_4 - 0.000493100649350658*G0_1_0_8_5 - 0.00295860389610399*G0_1_0_8_6 - 0.0212033279220787*G0_1_0_8_7 + 0.0936891233766267*G0_1_0_8_8 + 0.0128206168831173*G0_1_0_8_9 + 0.00525974025974044*G0_1_0_9_0 - 0.00525974025974044*G0_1_0_9_2 - 0.0128206168831174*G0_1_0_9_3 + 0.0285998376623386*G0_1_0_9_4 - 0.01479301948052*G0_1_0_9_5 + 0.01479301948052*G0_1_0_9_6 - 0.0285998376623387*G0_1_0_9_7 + 0.0128206168831173*G0_1_0_9_8; + A[66] = A[45] + 0.00195413961038969*G0_0_0_0_0 + 0.00193587662337671*G0_0_0_0_1 + 0.0108208198051952*G0_0_0_0_2 - 0.00813616071428603*G0_0_0_0_3 + 0.0179981737012994*G0_0_0_0_4 - 0.016272321428572*G0_0_0_0_5 + 0.0281067370129881*G0_0_0_0_6 - 0.00238331980519489*G0_0_0_0_7 - 0.000657467532467561*G0_0_0_0_8 + 0.011834415584416*G0_0_0_0_9 + 0.00193587662337671*G0_0_0_1_0 + 0.00315949675324687*G0_0_0_1_1 + 0.00835531655844188*G0_0_0_1_2 - 0.00986201298701335*G0_0_0_1_3 + 0.0216964285714294*G0_0_0_1_4 - 0.00912236201298737*G0_0_0_1_5 + 0.0283532873376634*G0_0_0_1_6 - 0.00213676948051956*G0_0_0_1_7 - 0.00189021915584422*G0_0_0_1_8 + 0.0167654220779227*G0_0_0_1_9 + 0.0108208198051952*G0_0_0_2_0 + 0.00835531655844188*G0_0_0_2_1 + 0.130397727272732*G0_0_0_2_2 - 0.0369825487013*G0_0_0_2_3 + 0.0813616071428602*G0_0_0_2_4 - 0.0517755681818201*G0_0_0_2_5 + 0.106016639610394*G0_0_0_2_6 - 0.00369825487013*G0_0_0_2_7 - 0.00123275162337667*G0_0_0_2_8 + 0.00986201298701337*G0_0_0_2_9 - 0.00813616071428603*G0_0_0_3_0 - 0.00986201298701335*G0_0_0_3_1 - 0.0369825487013*G0_0_0_3_2 + 0.0473376623376639*G0_0_0_3_3 - 0.095414975649354*G0_0_0_3_4 + 0.035503246753248*G0_0_0_3_5 - 0.104290787337666*G0_0_0_3_6 + 0.005177556818182*G0_0_0_3_7 + 0.010355113636364*G0_0_0_3_8 - 0.0606513798701319*G0_0_0_3_9 + 0.0179981737012994*G0_0_0_4_0 + 0.0216964285714294*G0_0_0_4_1 + 0.0813616071428602*G0_0_0_4_2 - 0.095414975649354*G0_0_0_4_3 + 0.21449878246754*G0_0_0_4_4 - 0.0732254464285741*G0_0_0_4_5 + 0.17751623376624*G0_0_0_4_6 - 0.011834415584416*G0_0_0_4_7 - 0.015532670454546*G0_0_0_4_8 + 0.116864853896108*G0_0_0_4_9 - 0.016272321428572*G0_0_0_5_0 - 0.00912236201298737*G0_0_0_5_1 - 0.0517755681818201*G0_0_0_5_2 + 0.035503246753248*G0_0_0_5_3 - 0.0732254464285741*G0_0_0_5_4 + 0.0532548701298721*G0_0_0_5_5 - 0.111687297077926*G0_0_0_5_6 + 0.00813616071428601*G0_0_0_5_8 - 0.05177556818182*G0_0_0_5_9 + 0.0281067370129881*G0_0_0_6_0 + 0.0283532873376634*G0_0_0_6_1 + 0.106016639610394*G0_0_0_6_2 - 0.104290787337666*G0_0_0_6_3 + 0.17751623376624*G0_0_0_6_4 - 0.111687297077926*G0_0_0_6_5 + 0.49556615259742*G0_0_0_6_6 - 0.00813616071428597*G0_0_0_6_7 - 0.031065340909092*G0_0_0_6_8 + 0.178995535714292*G0_0_0_6_9 - 0.00238331980519489*G0_0_0_7_0 - 0.00213676948051956*G0_0_0_7_1 - 0.00369825487013*G0_0_0_7_2 + 0.005177556818182*G0_0_0_7_3 - 0.011834415584416*G0_0_0_7_4 - 0.00813616071428597*G0_0_0_7_6 - 0.00591720779220801*G0_0_0_7_7 + 0.002958603896104*G0_0_0_7_8 - 0.019230925324676*G0_0_0_7_9 - 0.000657467532467561*G0_0_0_8_0 - 0.00189021915584422*G0_0_0_8_1 - 0.00123275162337667*G0_0_0_8_2 + 0.010355113636364*G0_0_0_8_3 - 0.015532670454546*G0_0_0_8_4 + 0.00813616071428601*G0_0_0_8_5 - 0.0310653409090919*G0_0_0_8_6 + 0.002958603896104*G0_0_0_8_7 + 0.002958603896104*G0_0_0_8_8 - 0.019230925324676*G0_0_0_8_9 + 0.011834415584416*G0_0_0_9_0 + 0.0167654220779227*G0_0_0_9_1 + 0.00986201298701337*G0_0_0_9_2 - 0.0606513798701319*G0_0_0_9_3 + 0.116864853896108*G0_0_0_9_4 - 0.0517755681818201*G0_0_0_9_5 + 0.178995535714292*G0_0_0_9_6 - 0.019230925324676*G0_0_0_9_7 - 0.019230925324676*G0_0_0_9_8 + 0.142012987012992*G0_0_0_9_9 + 0.00387175324675342*G0_0_1_0_0 + 0.0013423295454546*G0_0_1_0_1 + 0.00771611201298732*G0_0_1_0_2 - 0.0047666396103898*G0_0_1_0_3 + 0.00928672889610426*G0_0_1_0_4 - 0.00271205357142868*G0_0_1_0_5 + 0.0133137175324681*G0_0_1_0_6 + 0.00131493506493513*G0_0_1_0_7 - 0.0016436688311689*G0_0_1_0_8 + 0.00542410714285735*G0_0_1_0_9 + 0.0013423295454546*G0_0_1_1_0 + 0.00155235389610395*G0_0_1_1_1 + 0.00685775162337689*G0_0_1_1_2 - 0.00476663961038979*G0_0_1_1_3 + 0.0124918831168836*G0_0_1_1_4 - 0.0040269886363638*G0_0_1_1_5 + 0.0112591314935069*G0_0_1_1_6 - 0.000986201298701339*G0_0_1_1_8 + 0.00641030844155868*G0_0_1_1_9 + 0.00771611201298732*G0_0_1_2_0 + 0.00685775162337689*G0_0_1_2_1 + 0.105194805194809*G0_0_1_2_2 - 0.02958603896104*G0_0_1_2_3 + 0.0653358360389634*G0_0_1_2_4 - 0.0320515422077934*G0_0_1_2_5 + 0.0727323457792235*G0_0_1_2_6 - 0.00131493506493511*G0_0_1_2_7 - 0.00230113636363644*G0_0_1_2_8 + 0.0123275162337667*G0_0_1_2_9 - 0.0047666396103898*G0_0_1_3_0 - 0.00476663961038979*G0_0_1_3_1 - 0.02958603896104*G0_0_1_3_2 + 0.0251481331168839*G0_0_1_3_3 - 0.058432426948054*G0_0_1_3_4 + 0.019230925324676*G0_0_1_3_5 - 0.045858360389612*G0_0_1_3_6 + 0.002218952922078*G0_0_1_3_7 + 0.00295860389610399*G0_0_1_3_8 - 0.023668831168832*G0_0_1_3_9 + 0.00928672889610426*G0_0_1_4_0 + 0.0124918831168836*G0_0_1_4_1 + 0.0653358360389634*G0_0_1_4_2 - 0.058432426948054*G0_0_1_4_3 + 0.128699269480524*G0_0_1_4_4 - 0.0399411525974041*G0_0_1_4_5 + 0.0857995129870161*G0_0_1_4_6 - 0.005917207792208*G0_0_1_4_7 - 0.00517755681818199*G0_0_1_4_8 + 0.042899756493508*G0_0_1_4_9 - 0.00271205357142868*G0_0_1_5_0 - 0.00402698863636379*G0_0_1_5_1 - 0.0320515422077934*G0_0_1_5_2 + 0.019230925324676*G0_0_1_5_3 - 0.0399411525974041*G0_0_1_5_4 + 0.039941152597404*G0_0_1_5_5 - 0.0717461444805221*G0_0_1_5_6 + 0.00813616071428601*G0_0_1_5_7 - 0.016272321428572*G0_0_1_5_9 + 0.0133137175324681*G0_0_1_6_0 + 0.0112591314935069*G0_0_1_6_1 + 0.0727323457792235*G0_0_1_6_2 - 0.045858360389612*G0_0_1_6_3 + 0.0857995129870161*G0_0_1_6_4 - 0.0717461444805221*G0_0_1_6_5 + 0.202664366883124*G0_0_1_6_6 - 0.008136160714286*G0_0_1_6_7 - 0.00739650974025998*G0_0_1_6_8 + 0.054734172077924*G0_0_1_6_9 + 0.00131493506493513*G0_0_1_7_0 - 0.00131493506493511*G0_0_1_7_2 + 0.002218952922078*G0_0_1_7_3 - 0.005917207792208*G0_0_1_7_4 + 0.008136160714286*G0_0_1_7_5 - 0.008136160714286*G0_0_1_7_6 + 0.00591720779220803*G0_0_1_7_7 - 0.00221895292207802*G0_0_1_7_8 - 0.0016436688311689*G0_0_1_8_0 - 0.000986201298701339*G0_0_1_8_1 - 0.00230113636363644*G0_0_1_8_2 + 0.00295860389610399*G0_0_1_8_3 - 0.005177556818182*G0_0_1_8_4 - 0.00739650974025998*G0_0_1_8_6 - 0.00221895292207802*G0_0_1_8_7 - 0.00147930194805203*G0_0_1_8_8 - 0.00887581168831199*G0_0_1_8_9 + 0.00542410714285735*G0_0_1_9_0 + 0.00641030844155868*G0_0_1_9_1 + 0.0123275162337667*G0_0_1_9_2 - 0.023668831168832*G0_0_1_9_3 + 0.042899756493508*G0_0_1_9_4 - 0.016272321428572*G0_0_1_9_5 + 0.054734172077924*G0_0_1_9_6 - 0.00887581168831199*G0_0_1_9_8 + 0.035503246753248*G0_0_1_9_9 - 0.000602678571428626*G0_1_0_0_0 + 0.00105012175324679*G0_1_0_0_1 + 0.010482954545455*G0_1_0_0_2 - 0.00690340909090937*G0_1_0_0_3 + 0.00862926136363672*G0_1_0_0_4 - 0.0082183441558445*G0_1_0_0_5 + 0.015697037337663*G0_1_0_0_6 - 0.00262987012987025*G0_1_0_0_7 + 0.00106838474025979*G0_1_0_0_8 - 0.000493100649350651*G0_1_0_0_9 + 0.00105012175324679*G0_1_0_1_0 + 0.00294034090909097*G0_1_0_1_1 + 0.0107203733766238*G0_1_0_1_2 - 0.00336952110389626*G0_1_0_1_3 + 0.0185734577922085*G0_1_0_1_4 - 0.0041913555194807*G0_1_0_1_5 + 0.0106016639610394*G0_1_0_1_6 - 0.000986201298701331*G0_1_0_1_7 + 0.00986201298701333*G0_1_0_1_9 + 0.010482954545455*G0_1_0_2_0 + 0.0107203733766238*G0_1_0_2_1 + 0.178612012987019*G0_1_0_2_2 - 0.0463514610389627*G0_1_0_2_3 + 0.1109476461039*G0_1_0_2_4 - 0.0463514610389628*G0_1_0_2_5 + 0.101085633116887*G0_1_0_2_6 - 0.00394480519480534*G0_1_0_2_7 - 0.00246550324675333*G0_1_0_2_8 + 0.0187378246753253*G0_1_0_2_9 - 0.00690340909090937*G0_1_0_3_0 - 0.00336952110389626*G0_1_0_3_1 - 0.0463514610389627*G0_1_0_3_2 - 0.0162723214285721*G0_1_0_3_3 - 0.094675324675328*G0_1_0_3_4 + 0.023668831168832*G0_1_0_3_5 - 0.0458583603896121*G0_1_0_3_6 + 0.00665685876623403*G0_1_0_3_7 - 0.042899756493508*G0_1_0_3_9 + 0.00862926136363672*G0_1_0_4_0 + 0.0185734577922085*G0_1_0_4_1 + 0.1109476461039*G0_1_0_4_2 - 0.0946753246753281*G0_1_0_4_3 + 0.128699269480524*G0_1_0_4_4 - 0.0399411525974041*G0_1_0_4_5 + 0.0857995129870162*G0_1_0_4_6 - 0.00665685876623399*G0_1_0_4_8 + 0.023668831168832*G0_1_0_4_9 - 0.0082183441558445*G0_1_0_5_0 - 0.0041913555194807*G0_1_0_5_1 - 0.0463514610389628*G0_1_0_5_2 + 0.023668831168832*G0_1_0_5_3 - 0.0399411525974041*G0_1_0_5_4 + 0.0399411525974039*G0_1_0_5_5 - 0.0710064935064961*G0_1_0_5_6 + 0.00369825487012992*G0_1_0_5_7 - 0.00147930194805196*G0_1_0_5_8 + 0.00443790584415587*G0_1_0_5_9 + 0.015697037337663*G0_1_0_6_0 + 0.0106016639610394*G0_1_0_6_1 + 0.101085633116887*G0_1_0_6_2 - 0.0458583603896121*G0_1_0_6_3 + 0.0857995129870162*G0_1_0_6_4 - 0.0710064935064961*G0_1_0_6_5 + 0.128699269480524*G0_1_0_6_6 - 0.00221895292207797*G0_1_0_6_7 - 0.00517755681818201*G0_1_0_6_8 + 0.0355032467532481*G0_1_0_6_9 - 0.00262987012987025*G0_1_0_7_0 - 0.000986201298701331*G0_1_0_7_1 - 0.00394480519480534*G0_1_0_7_2 + 0.00665685876623403*G0_1_0_7_3 + 0.00369825487012992*G0_1_0_7_5 - 0.00221895292207797*G0_1_0_7_6 - 0.0147930194805202*G0_1_0_7_7 - 0.00073965097402594*G0_1_0_7_8 + 0.00591720779220793*G0_1_0_7_9 + 0.00106838474025979*G0_1_0_8_0 - 0.00246550324675333*G0_1_0_8_2 - 0.00665685876623399*G0_1_0_8_4 - 0.00147930194805196*G0_1_0_8_5 - 0.005177556818182*G0_1_0_8_6 - 0.00073965097402594*G0_1_0_8_7 - 0.00443790584415613*G0_1_0_8_8 - 0.016272321428572*G0_1_0_8_9 - 0.000493100649350651*G0_1_0_9_0 + 0.00986201298701333*G0_1_0_9_1 + 0.0187378246753253*G0_1_0_9_2 - 0.042899756493508*G0_1_0_9_3 + 0.023668831168832*G0_1_0_9_4 + 0.00443790584415588*G0_1_0_9_5 + 0.0355032467532481*G0_1_0_9_6 + 0.00591720779220793*G0_1_0_9_7 - 0.016272321428572*G0_1_0_9_8 + 0.124261363636368*G0_1_0_9_9 + 0.0467897727272745*G0_1_1_0_0 + 0.00346083603896118*G0_1_1_0_1 + 0.0105103490259744*G0_1_1_0_2 - 0.00353388798701316*G0_1_1_0_3 + 0.00583502435064959*G0_1_1_0_4 + 0.00164366883116894*G0_1_1_0_5 - 0.00254768668831171*G0_1_1_0_6 + 0.0343526785714299*G0_1_1_0_7 - 0.0156970373376629*G0_1_1_0_8 - 0.00246550324675326*G0_1_1_0_9 + 0.00346083603896118*G0_1_1_1_0 + 0.00297686688311698*G0_1_1_1_1 + 0.00816355519480551*G0_1_1_1_2 - 0.00805397727272757*G0_1_1_1_3 + 0.0180803571428578*G0_1_1_1_4 + 0.00756087662337686*G0_1_1_1_5 + 0.0142177353896109*G0_1_1_1_6 + 0.00969764610389646*G0_1_1_1_7 - 0.0115056818181822*G0_1_1_1_8 + 0.0216964285714293*G0_1_1_1_9 + 0.0105103490259744*G0_1_1_2_0 + 0.00816355519480551*G0_1_1_2_1 + 0.159527191558447*G0_1_1_2_2 - 0.0364894480519493*G0_1_1_2_3 + 0.091716720779224*G0_1_1_2_4 - 0.0366538149350663*G0_1_1_2_5 + 0.063199066558444*G0_1_1_2_6 + 0.00410917207792222*G0_1_1_2_7 - 0.000821834415584454*G0_1_1_2_8 + 0.00493100649350671*G0_1_1_2_9 - 0.00353388798701316*G0_1_1_3_0 - 0.00805397727272757*G0_1_1_3_1 - 0.0364894480519493*G0_1_1_3_2 - 0.00295860389610411*G0_1_1_3_3 - 0.085799512987016*G0_1_1_3_4 - 0.054734172077924*G0_1_1_3_6 - 0.00147930194805202*G0_1_1_3_7 + 0.01109476461039*G0_1_1_3_8 - 0.0621306818181839*G0_1_1_3_9 + 0.00583502435064959*G0_1_1_4_0 + 0.0180803571428578*G0_1_1_4_1 + 0.091716720779224*G0_1_1_4_2 - 0.085799512987016*G0_1_1_4_3 + 0.106509740259744*G0_1_1_4_4 - 0.0295860389610401*G0_1_1_4_5 + 0.0843202110389641*G0_1_1_4_6 - 0.00887581168831201*G0_1_1_4_7 - 0.00961546266233796*G0_1_1_4_8 + 0.0443790584415598*G0_1_1_4_9 + 0.00164366883116894*G0_1_1_5_0 + 0.00756087662337686*G0_1_1_5_1 - 0.0366538149350663*G0_1_1_5_2 - 0.0295860389610401*G0_1_1_5_4 + 0.178995535714292*G0_1_1_5_5 - 0.0244084821428582*G0_1_1_5_6 + 0.05917207792208*G0_1_1_5_7 - 0.034763595779222*G0_1_1_5_8 + 0.0769237012987039*G0_1_1_5_9 - 0.00254768668831171*G0_1_1_6_0 + 0.0142177353896109*G0_1_1_6_1 + 0.063199066558444*G0_1_1_6_2 - 0.054734172077924*G0_1_1_6_3 + 0.0843202110389641*G0_1_1_6_4 - 0.0244084821428582*G0_1_1_6_5 + 0.198226461038968*G0_1_1_6_6 - 0.024408482142858*G0_1_1_6_7 - 0.014053368506494*G0_1_1_6_8 + 0.0946753246753279*G0_1_1_6_9 + 0.0343526785714299*G0_1_1_7_0 + 0.00969764610389646*G0_1_1_7_1 + 0.00410917207792222*G0_1_1_7_2 - 0.00147930194805202*G0_1_1_7_3 - 0.00887581168831201*G0_1_1_7_4 + 0.05917207792208*G0_1_1_7_5 - 0.024408482142858*G0_1_1_7_6 + 0.193788555194812*G0_1_1_7_7 - 0.0332842938311701*G0_1_1_7_8 + 0.0562134740259761*G0_1_1_7_9 - 0.0156970373376629*G0_1_1_8_0 - 0.0115056818181822*G0_1_1_8_1 - 0.000821834415584454*G0_1_1_8_2 + 0.01109476461039*G0_1_1_8_3 - 0.00961546266233796*G0_1_1_8_4 - 0.034763595779222*G0_1_1_8_5 - 0.014053368506494*G0_1_1_8_6 - 0.0332842938311701*G0_1_1_8_7 + 0.0369825487013*G0_1_1_8_8 - 0.045858360389612*G0_1_1_8_9 - 0.00246550324675326*G0_1_1_9_0 + 0.0216964285714293*G0_1_1_9_1 + 0.00493100649350671*G0_1_1_9_2 - 0.0621306818181839*G0_1_1_9_3 + 0.0443790584415599*G0_1_1_9_4 + 0.0769237012987039*G0_1_1_9_5 + 0.0946753246753279*G0_1_1_9_6 + 0.0562134740259761*G0_1_1_9_7 - 0.045858360389612*G0_1_1_9_8 + 0.408287337662351*G0_1_1_9_9; + A[55] = A[66] + 0.0069034090909093*G0_0_0_0_0 - 0.00309557629870142*G0_0_0_0_1 - 0.0114234983766239*G0_0_0_0_2 + 0.0130671672077927*G0_0_0_0_3 - 0.0219429788961048*G0_0_0_0_4 + 0.0157792207792214*G0_0_0_0_5 - 0.0428997564935081*G0_0_0_0_6 + 0.00246550324675334*G0_0_0_0_7 + 0.00246550324675333*G0_0_0_0_8 - 0.0276136363636373*G0_0_0_0_9 - 0.00309557629870142*G0_0_0_1_0 + 0.000109577922077908*G0_0_0_1_1 - 0.0124096996753251*G0_0_0_1_2 + 0.00591720779220803*G0_0_0_1_3 - 0.0251481331168841*G0_0_0_1_4 + 0.031804991883118*G0_0_0_1_5 - 0.0189843750000007*G0_0_0_1_6 + 0.010355113636364*G0_0_0_1_7 - 0.00641030844155866*G0_0_0_1_8 + 0.011834415584416*G0_0_0_1_9 - 0.0114234983766239*G0_0_0_2_0 - 0.0124096996753251*G0_0_0_2_1 - 0.17751623376624*G0_0_0_2_2 + 0.0557203733766253*G0_0_0_2_3 - 0.120809659090913*G0_0_0_2_4 + 0.0655823863636388*G0_0_0_2_5 - 0.150395698051954*G0_0_0_2_6 + 0.009615462662338*G0_0_0_2_7 + 0.00271205357142865*G0_0_0_2_8 - 0.0226826298701307*G0_0_0_2_9 + 0.0130671672077927*G0_0_0_3_0 + 0.00591720779220803*G0_0_0_3_1 + 0.0557203733766253*G0_0_0_3_2 - 0.017751623376624*G0_0_0_3_3 + 0.113166599025978*G0_0_0_3_4 - 0.0769237012987039*G0_0_0_3_5 + 0.0761840503246781*G0_0_0_3_6 - 0.019970576298702*G0_0_0_3_7 + 0.00887581168831198*G0_0_0_3_8 + 0.00443790584415608*G0_0_0_3_9 - 0.0219429788961048*G0_0_0_4_0 - 0.0251481331168841*G0_0_0_4_1 - 0.120809659090913*G0_0_0_4_2 + 0.113166599025978*G0_0_0_4_3 - 0.275150162337673*G0_0_0_4_4 + 0.0850598620129901*G0_0_0_4_5 - 0.161243912337668*G0_0_0_4_6 + 0.00887581168831199*G0_0_0_4_7 + 0.01109476461039*G0_0_0_4_8 - 0.102071834415588*G0_0_0_4_9 + 0.0157792207792214*G0_0_0_5_0 + 0.031804991883118*G0_0_0_5_1 + 0.0655823863636388*G0_0_0_5_2 - 0.0769237012987039*G0_0_0_5_3 + 0.0850598620129901*G0_0_0_5_4 + 0.313612012987023*G0_0_0_5_5 + 0.133876826298706*G0_0_0_5_6 + 0.0857995129870159*G0_0_0_5_7 - 0.0761840503246779*G0_0_0_5_8 + 0.235209009740268*G0_0_0_5_9 - 0.0428997564935081*G0_0_0_6_0 - 0.0189843750000007*G0_0_0_6_1 - 0.150395698051954*G0_0_0_6_2 + 0.0761840503246781*G0_0_0_6_3 - 0.161243912337668*G0_0_0_6_4 + 0.133876826298706*G0_0_0_6_5 - 0.245564123376633*G0_0_0_6_6 - 0.00961546266233798*G0_0_0_6_7 + 0.01479301948052*G0_0_0_6_8 - 0.0843202110389642*G0_0_0_6_9 + 0.00246550324675334*G0_0_0_7_0 + 0.010355113636364*G0_0_0_7_1 + 0.009615462662338*G0_0_0_7_2 - 0.019970576298702*G0_0_0_7_3 + 0.00887581168831199*G0_0_0_7_4 + 0.0857995129870159*G0_0_0_7_5 - 0.00961546266233798*G0_0_0_7_6 + 0.05917207792208*G0_0_0_7_7 - 0.031804991883118*G0_0_0_7_8 + 0.102071834415588*G0_0_0_7_9 + 0.00246550324675333*G0_0_0_8_0 - 0.00641030844155866*G0_0_0_8_1 + 0.00271205357142865*G0_0_0_8_2 + 0.00887581168831198*G0_0_0_8_3 + 0.01109476461039*G0_0_0_8_4 - 0.0761840503246779*G0_0_0_8_5 + 0.01479301948052*G0_0_0_8_6 - 0.031804991883118*G0_0_0_8_7 + 0.023668831168832*G0_0_0_8_8 - 0.057692775974028*G0_0_0_8_9 - 0.0276136363636373*G0_0_0_9_0 + 0.011834415584416*G0_0_0_9_1 - 0.0226826298701307*G0_0_0_9_2 + 0.00443790584415609*G0_0_0_9_3 - 0.102071834415588*G0_0_0_9_4 + 0.235209009740268*G0_0_0_9_5 - 0.0843202110389642*G0_0_0_9_6 + 0.102071834415588*G0_0_0_9_7 - 0.057692775974028*G0_0_0_9_8 + 0.26627435064936*G0_0_0_9_9 - 0.0202171266233773*G0_0_1_0_0 - 0.0039995941558443*G0_0_1_0_1 - 0.0114234983766238*G0_0_1_0_2 + 0.00862926136363668*G0_0_1_0_3 - 0.0108482142857147*G0_0_1_0_4 - 0.0310653409090919*G0_0_1_0_5 - 0.00838271103896137*G0_0_1_0_6 - 0.0172585227272733*G0_0_1_0_7 + 0.0108482142857146*G0_0_1_0_8 - 0.0187378246753253*G0_0_1_0_9 - 0.0039995941558443*G0_0_1_1_0 + 0.00010957792207792*G0_0_1_1_1 - 0.0115056818181823*G0_0_1_1_2 + 0.00172585227272736*G0_0_1_1_3 - 0.0138068181818187*G0_0_1_1_4 + 0.00961546266233801*G0_0_1_1_5 + 0.00320515422077929*G0_0_1_1_6 - 0.00098620129870133*G0_0_1_1_7 - 0.00221895292207799*G0_0_1_1_8 + 0.011834415584416*G0_0_1_1_9 - 0.0114234983766238*G0_0_1_2_0 - 0.0115056818181823*G0_0_1_2_1 - 0.150395698051953*G0_0_1_2_2 + 0.047337662337664*G0_0_1_2_3 - 0.101085633116887*G0_0_1_2_4 + 0.0310653409090921*G0_0_1_2_5 - 0.10355113636364*G0_0_1_2_6 - 0.001479301948052*G0_0_1_2_7 + 0.00714995941558466*G0_0_1_2_8 - 0.0315584415584427*G0_0_1_2_9 + 0.00862926136363668*G0_0_1_3_0 + 0.00172585227272736*G0_0_1_3_1 + 0.047337662337664*G0_0_1_3_2 + 0.0710064935064961*G0_0_1_3_4 - 0.0369825487013*G0_0_1_3_5 + 0.00961546266233818*G0_0_1_3_6 - 0.00665685876623399*G0_0_1_3_7 + 0.00887581168831197*G0_0_1_3_8 - 0.0221895292207799*G0_0_1_3_9 - 0.0108482142857147*G0_0_1_4_0 - 0.0138068181818187*G0_0_1_4_1 - 0.101085633116887*G0_0_1_4_2 + 0.0710064935064961*G0_0_1_4_3 - 0.17751623376624*G0_0_1_4_4 + 0.0517755681818201*G0_0_1_4_5 - 0.0613910308441583*G0_0_1_4_6 + 0.00887581168831201*G0_0_1_4_7 - 0.00221895292207798*G0_0_1_4_8 - 0.00887581168831214*G0_0_1_4_9 - 0.0310653409090919*G0_0_1_5_0 + 0.00961546266233801*G0_0_1_5_1 + 0.0310653409090921*G0_0_1_5_2 - 0.0369825487013*G0_0_1_5_3 + 0.0517755681818201*G0_0_1_5_4 + 0.0340239448051957*G0_0_1_5_5 + 0.133876826298706*G0_0_1_5_6 - 0.014053368506494*G0_0_1_5_7 - 0.00961546266233795*G0_0_1_5_8 + 0.0754443993506518*G0_0_1_5_9 - 0.00838271103896137*G0_0_1_6_0 + 0.00320515422077929*G0_0_1_6_1 - 0.10355113636364*G0_0_1_6_2 + 0.00961546266233818*G0_0_1_6_3 - 0.0613910308441583*G0_0_1_6_4 + 0.133876826298706*G0_0_1_6_5 + 0.0340239448051953*G0_0_1_6_6 + 0.023668831168832*G0_0_1_6_7 - 0.0251481331168839*G0_0_1_6_8 + 0.0754443993506518*G0_0_1_6_9 - 0.0172585227272733*G0_0_1_7_0 - 0.00098620129870133*G0_0_1_7_1 - 0.001479301948052*G0_0_1_7_2 - 0.00665685876623399*G0_0_1_7_3 + 0.00887581168831202*G0_0_1_7_4 - 0.014053368506494*G0_0_1_7_5 + 0.023668831168832*G0_0_1_7_6 - 0.0384618506493519*G0_0_1_7_7 + 0.010355113636364*G0_0_1_7_8 + 0.00887581168831197*G0_0_1_7_9 + 0.0108482142857146*G0_0_1_8_0 - 0.00221895292207799*G0_0_1_8_1 + 0.00714995941558466*G0_0_1_8_2 + 0.00887581168831197*G0_0_1_8_3 - 0.00221895292207798*G0_0_1_8_4 - 0.00961546266233795*G0_0_1_8_5 - 0.025148133116884*G0_0_1_8_6 + 0.010355113636364*G0_0_1_8_7 + 0.00591720779220802*G0_0_1_8_8 - 0.0310653409090919*G0_0_1_8_9 - 0.0187378246753253*G0_0_1_9_0 + 0.011834415584416*G0_0_1_9_1 - 0.0315584415584427*G0_0_1_9_2 - 0.0221895292207799*G0_0_1_9_3 - 0.00887581168831214*G0_0_1_9_4 + 0.0754443993506518*G0_0_1_9_5 + 0.0754443993506518*G0_0_1_9_6 + 0.00887581168831197*G0_0_1_9_7 - 0.0310653409090919*G0_0_1_9_8 + 0.26627435064936*G0_0_1_9_9 - 0.0202171266233773*G0_1_0_0_0 - 0.0039995941558443*G0_1_0_0_1 - 0.0114234983766238*G0_1_0_0_2 + 0.00862926136363668*G0_1_0_0_3 - 0.0108482142857147*G0_1_0_0_4 - 0.0310653409090919*G0_1_0_0_5 - 0.00838271103896137*G0_1_0_0_6 - 0.0172585227272733*G0_1_0_0_7 + 0.0108482142857146*G0_1_0_0_8 - 0.0187378246753253*G0_1_0_0_9 - 0.0039995941558443*G0_1_0_1_0 + 0.00010957792207792*G0_1_0_1_1 - 0.0115056818181823*G0_1_0_1_2 + 0.00172585227272736*G0_1_0_1_3 - 0.0138068181818187*G0_1_0_1_4 + 0.00961546266233801*G0_1_0_1_5 + 0.00320515422077929*G0_1_0_1_6 - 0.000986201298701331*G0_1_0_1_7 - 0.00221895292207799*G0_1_0_1_8 + 0.011834415584416*G0_1_0_1_9 - 0.0114234983766238*G0_1_0_2_0 - 0.0115056818181823*G0_1_0_2_1 - 0.150395698051953*G0_1_0_2_2 + 0.047337662337664*G0_1_0_2_3 - 0.101085633116887*G0_1_0_2_4 + 0.0310653409090921*G0_1_0_2_5 - 0.10355113636364*G0_1_0_2_6 - 0.001479301948052*G0_1_0_2_7 + 0.00714995941558466*G0_1_0_2_8 - 0.0315584415584427*G0_1_0_2_9 + 0.00862926136363668*G0_1_0_3_0 + 0.00172585227272736*G0_1_0_3_1 + 0.047337662337664*G0_1_0_3_2 + 0.0710064935064961*G0_1_0_3_4 - 0.0369825487013*G0_1_0_3_5 + 0.00961546266233818*G0_1_0_3_6 - 0.00665685876623399*G0_1_0_3_7 + 0.00887581168831197*G0_1_0_3_8 - 0.0221895292207799*G0_1_0_3_9 - 0.0108482142857147*G0_1_0_4_0 - 0.0138068181818187*G0_1_0_4_1 - 0.101085633116887*G0_1_0_4_2 + 0.0710064935064961*G0_1_0_4_3 - 0.17751623376624*G0_1_0_4_4 + 0.0517755681818201*G0_1_0_4_5 - 0.0613910308441583*G0_1_0_4_6 + 0.00887581168831201*G0_1_0_4_7 - 0.00221895292207798*G0_1_0_4_8 - 0.00887581168831215*G0_1_0_4_9 - 0.0310653409090919*G0_1_0_5_0 + 0.00961546266233801*G0_1_0_5_1 + 0.0310653409090921*G0_1_0_5_2 - 0.0369825487013*G0_1_0_5_3 + 0.0517755681818201*G0_1_0_5_4 + 0.0340239448051957*G0_1_0_5_5 + 0.133876826298706*G0_1_0_5_6 - 0.014053368506494*G0_1_0_5_7 - 0.00961546266233795*G0_1_0_5_8 + 0.0754443993506518*G0_1_0_5_9 - 0.00838271103896137*G0_1_0_6_0 + 0.00320515422077929*G0_1_0_6_1 - 0.10355113636364*G0_1_0_6_2 + 0.00961546266233818*G0_1_0_6_3 - 0.0613910308441583*G0_1_0_6_4 + 0.133876826298706*G0_1_0_6_5 + 0.0340239448051953*G0_1_0_6_6 + 0.023668831168832*G0_1_0_6_7 - 0.0251481331168839*G0_1_0_6_8 + 0.0754443993506518*G0_1_0_6_9 - 0.0172585227272733*G0_1_0_7_0 - 0.000986201298701331*G0_1_0_7_1 - 0.001479301948052*G0_1_0_7_2 - 0.00665685876623399*G0_1_0_7_3 + 0.00887581168831202*G0_1_0_7_4 - 0.014053368506494*G0_1_0_7_5 + 0.023668831168832*G0_1_0_7_6 - 0.0384618506493519*G0_1_0_7_7 + 0.010355113636364*G0_1_0_7_8 + 0.00887581168831197*G0_1_0_7_9 + 0.0108482142857146*G0_1_0_8_0 - 0.00221895292207799*G0_1_0_8_1 + 0.00714995941558466*G0_1_0_8_2 + 0.00887581168831197*G0_1_0_8_3 - 0.00221895292207798*G0_1_0_8_4 - 0.00961546266233795*G0_1_0_8_5 - 0.025148133116884*G0_1_0_8_6 + 0.010355113636364*G0_1_0_8_7 + 0.00591720779220802*G0_1_0_8_8 - 0.0310653409090919*G0_1_0_8_9 - 0.0187378246753253*G0_1_0_9_0 + 0.011834415584416*G0_1_0_9_1 - 0.0315584415584427*G0_1_0_9_2 - 0.0221895292207799*G0_1_0_9_3 - 0.00887581168831215*G0_1_0_9_4 + 0.0754443993506518*G0_1_0_9_5 + 0.0754443993506518*G0_1_0_9_6 + 0.00887581168831197*G0_1_0_9_7 - 0.0310653409090919*G0_1_0_9_8 + 0.26627435064936*G0_1_0_9_9 + 0.130178571428576*G0_1_1_0_0 + 0.00750608766233792*G0_1_1_0_1 + 0.001479301948052*G0_1_1_0_3 - 0.00936891233766271*G0_1_1_0_4 + 0.0724857954545479*G0_1_1_0_5 - 0.0394480519480533*G0_1_1_0_6 + 0.0838271103896133*G0_1_1_0_7 - 0.0364894480519493*G0_1_1_0_8 + 0.0128206168831174*G0_1_1_0_9 + 0.00750608766233792*G0_1_1_1_0 - 0.00750608766233795*G0_1_1_1_2 + 0.00394480519480535*G0_1_1_1_3 - 0.0128206168831174*G0_1_1_1_4 + 0.00641030844155868*G0_1_1_1_5 - 0.00641030844155869*G0_1_1_1_6 + 0.0128206168831173*G0_1_1_1_7 - 0.00394480519480533*G0_1_1_1_8 - 0.00750608766233795*G0_1_1_2_1 - 0.130178571428576*G0_1_1_2_2 + 0.0364894480519493*G0_1_1_2_3 - 0.0838271103896134*G0_1_1_2_4 + 0.0394480519480534*G0_1_1_2_5 - 0.0724857954545482*G0_1_1_2_6 + 0.00936891233766265*G0_1_1_2_7 - 0.001479301948052*G0_1_1_2_8 - 0.0128206168831173*G0_1_1_2_9 + 0.001479301948052*G0_1_1_3_0 + 0.00394480519480535*G0_1_1_3_1 + 0.0364894480519493*G0_1_1_3_2 - 0.00591720779220802*G0_1_1_3_3 + 0.0606513798701321*G0_1_1_3_4 - 0.011834415584416*G0_1_1_3_5 + 0.0192309253246761*G0_1_1_3_6 - 0.00443790584415601*G0_1_1_3_7 + 0.00887581168831205*G0_1_1_3_9 - 0.00936891233766271*G0_1_1_4_0 - 0.0128206168831174*G0_1_1_4_1 - 0.0838271103896134*G0_1_1_4_2 + 0.0606513798701321*G0_1_1_4_3 - 0.139054383116888*G0_1_1_4_4 + 0.0281067370129881*G0_1_1_4_5 - 0.0473376623376642*G0_1_1_4_6 + 0.004437905844156*G0_1_1_4_8 - 0.017751623376624*G0_1_1_4_9 + 0.0724857954545479*G0_1_1_5_0 + 0.00641030844155868*G0_1_1_5_1 + 0.0394480519480534*G0_1_1_5_2 - 0.011834415584416*G0_1_1_5_3 + 0.0281067370129881*G0_1_1_5_4 + 0.0473376623376639*G0_1_1_5_7 - 0.019230925324676*G0_1_1_5_8 - 0.0394480519480533*G0_1_1_6_0 - 0.00641030844155869*G0_1_1_6_1 - 0.0724857954545482*G0_1_1_6_2 + 0.0192309253246761*G0_1_1_6_3 - 0.0473376623376642*G0_1_1_6_4 - 0.0281067370129879*G0_1_1_6_7 + 0.011834415584416*G0_1_1_6_8 + 0.0838271103896133*G0_1_1_7_0 + 0.0128206168831173*G0_1_1_7_1 + 0.00936891233766265*G0_1_1_7_2 - 0.00443790584415602*G0_1_1_7_3 + 0.0473376623376639*G0_1_1_7_5 - 0.0281067370129879*G0_1_1_7_6 + 0.139054383116888*G0_1_1_7_7 - 0.0606513798701319*G0_1_1_7_8 + 0.017751623376624*G0_1_1_7_9 - 0.0364894480519493*G0_1_1_8_0 - 0.00394480519480533*G0_1_1_8_1 - 0.001479301948052*G0_1_1_8_2 + 0.004437905844156*G0_1_1_8_4 - 0.019230925324676*G0_1_1_8_5 + 0.011834415584416*G0_1_1_8_6 - 0.0606513798701319*G0_1_1_8_7 + 0.00591720779220803*G0_1_1_8_8 - 0.00887581168831198*G0_1_1_8_9 + 0.0128206168831174*G0_1_1_9_0 - 0.0128206168831173*G0_1_1_9_2 + 0.00887581168831205*G0_1_1_9_3 - 0.017751623376624*G0_1_1_9_4 + 0.017751623376624*G0_1_1_9_7 - 0.00887581168831198*G0_1_1_9_8; + A[64] = -A[66] - 0.00171672077922087*G0_0_1_0_0 + 0.000127840909090911*G0_0_1_0_1 + 0.00904017857142894*G0_0_1_0_2 - 0.00205458603896113*G0_0_1_0_3 - 0.00180803571428576*G0_0_1_0_4 - 0.000904017857142925*G0_0_1_0_5 + 0.00673904220779248*G0_0_1_0_6 + 0.000493100649350677*G0_0_1_0_8 - 0.00690340909090935*G0_0_1_0_9 + 0.000127840909090911*G0_0_1_1_0 - 0.00171672077922087*G0_0_1_1_1 + 0.00904017857142891*G0_0_1_1_2 - 0.000904017857142903*G0_0_1_1_3 + 0.00673904220779247*G0_0_1_1_4 - 0.00205458603896112*G0_0_1_1_5 - 0.00180803571428575*G0_0_1_1_6 + 0.000493100649350673*G0_0_1_1_7 - 0.00690340909090933*G0_0_1_1_9 + 0.00904017857142894*G0_0_1_2_0 + 0.00904017857142891*G0_0_1_2_1 + 0.161627435064941*G0_0_1_2_2 - 0.0394480519480533*G0_0_1_2_3 + 0.0912236201298734*G0_0_1_2_4 - 0.0394480519480534*G0_0_1_2_5 + 0.0912236201298735*G0_0_1_2_6 - 0.00328733766233778*G0_0_1_2_7 - 0.00328733766233777*G0_0_1_2_8 + 0.0246550324675333*G0_0_1_2_9 - 0.00205458603896113*G0_0_1_3_0 - 0.000904017857142903*G0_0_1_3_1 - 0.0394480519480533*G0_0_1_3_2 + 0.00147930194805194*G0_0_1_3_3 - 0.0369825487013*G0_0_1_3_4 + 0.00887581168831202*G0_0_1_3_5 + 0.000739650974026026*G0_0_1_3_7 - 0.00517755681818202*G0_0_1_3_8 + 0.0192309253246759*G0_0_1_3_9 - 0.00180803571428576*G0_0_1_4_0 + 0.00673904220779247*G0_0_1_4_1 + 0.0912236201298734*G0_0_1_4_2 - 0.0369825487013001*G0_0_1_4_3 + 0.010355113636364*G0_0_1_4_7 + 0.004437905844156*G0_0_1_4_8 - 0.0739650974025999*G0_0_1_4_9 - 0.000904017857142924*G0_0_1_5_0 - 0.00205458603896112*G0_0_1_5_1 - 0.0394480519480534*G0_0_1_5_2 + 0.00887581168831202*G0_0_1_5_3 + 0.00147930194805205*G0_0_1_5_5 - 0.0369825487013001*G0_0_1_5_6 - 0.00517755681818203*G0_0_1_5_7 + 0.000739650974026004*G0_0_1_5_8 + 0.019230925324676*G0_0_1_5_9 + 0.00673904220779247*G0_0_1_6_0 - 0.00180803571428575*G0_0_1_6_1 + 0.0912236201298735*G0_0_1_6_2 - 0.0369825487013001*G0_0_1_6_5 + 0.004437905844156*G0_0_1_6_7 + 0.010355113636364*G0_0_1_6_8 - 0.0739650974025998*G0_0_1_6_9 + 0.000493100649350673*G0_0_1_7_1 - 0.00328733766233778*G0_0_1_7_2 + 0.000739650974026025*G0_0_1_7_3 + 0.010355113636364*G0_0_1_7_4 - 0.00517755681818203*G0_0_1_7_5 + 0.004437905844156*G0_0_1_7_6 - 0.0118344155844162*G0_0_1_7_7 + 0.00147930194805204*G0_0_1_7_8 + 0.0118344155844159*G0_0_1_7_9 + 0.000493100649350677*G0_0_1_8_0 - 0.00328733766233777*G0_0_1_8_2 - 0.00517755681818202*G0_0_1_8_3 + 0.004437905844156*G0_0_1_8_4 + 0.000739650974026004*G0_0_1_8_5 + 0.010355113636364*G0_0_1_8_6 + 0.00147930194805204*G0_0_1_8_7 - 0.0118344155844161*G0_0_1_8_8 + 0.011834415584416*G0_0_1_8_9 - 0.00690340909090935*G0_0_1_9_0 - 0.00690340909090933*G0_0_1_9_1 + 0.0246550324675333*G0_0_1_9_2 + 0.0192309253246759*G0_0_1_9_3 - 0.0739650974025999*G0_0_1_9_4 + 0.019230925324676*G0_0_1_9_5 - 0.0739650974025998*G0_0_1_9_6 + 0.0118344155844159*G0_0_1_9_7 + 0.011834415584416*G0_0_1_9_8 - 0.142012987012992*G0_0_1_9_9 + 0.0445799512987029*G0_1_1_0_0 + 0.00301339285714297*G0_1_1_0_1 + 0.00914062500000036*G0_1_1_0_2 + 0.00115056818181819*G0_1_1_0_3 + 0.00213676948051958*G0_1_1_0_4 + 0.00156148538961046*G0_1_1_0_5 - 0.00558847402597415*G0_1_1_0_6 + 0.02958603896104*G0_1_1_0_7 - 0.0123275162337667*G0_1_1_0_8 - 0.00394480519480527*G0_1_1_0_9 + 0.00301339285714297*G0_1_1_1_0 + 0.00462053571428588*G0_1_1_1_1 + 0.00674817370129896*G0_1_1_1_2 - 0.00805397727272755*G0_1_1_1_3 + 0.0106838474025978*G0_1_1_1_4 + 0.00977982954545486*G0_1_1_1_5 + 0.0100263798701302*G0_1_1_1_6 + 0.00723214285714312*G0_1_1_1_7 - 0.00657467532467556*G0_1_1_1_8 + 0.0167654220779227*G0_1_1_1_9 + 0.00914062500000036*G0_1_1_2_0 + 0.00674817370129896*G0_1_1_2_1 + 0.146834415584421*G0_1_1_2_2 - 0.0299969561688322*G0_1_1_2_3 + 0.0723214285714311*G0_1_1_2_4 - 0.0316406250000012*G0_1_1_2_5 + 0.0534192370129891*G0_1_1_2_6 + 0.00435572240259755*G0_1_1_2_7 + 0.00139711850649354*G0_1_1_2_8 + 0.00246550324675336*G0_1_1_2_9 + 0.00115056818181819*G0_1_1_3_0 - 0.00805397727272755*G0_1_1_3_1 - 0.0299969561688322*G0_1_1_3_2 + 0.0369825487013*G0_1_1_3_3 - 0.051035917207794*G0_1_1_3_4 - 0.0125740665584419*G0_1_1_3_5 - 0.037722199675326*G0_1_1_3_6 - 0.01109476461039*G0_1_1_3_7 + 0.022929180194806*G0_1_1_3_8 - 0.0281067370129879*G0_1_1_3_9 + 0.00213676948051958*G0_1_1_4_0 + 0.0106838474025978*G0_1_1_4_1 + 0.0723214285714311*G0_1_1_4_2 - 0.051035917207794*G0_1_1_4_3 + 0.0517755681818199*G0_1_1_4_4 - 0.0140533685064941*G0_1_1_4_5 + 0.0517755681818201*G0_1_1_4_6 - 0.00591720779220801*G0_1_1_4_7 - 0.011834415584416*G0_1_1_4_8 + 0.0207102272727279*G0_1_1_4_9 + 0.00156148538961046*G0_1_1_5_0 + 0.00977982954545486*G0_1_1_5_1 - 0.0316406250000012*G0_1_1_5_2 - 0.0125740665584419*G0_1_1_5_3 - 0.0140533685064941*G0_1_1_5_4 + 0.174557629870136*G0_1_1_5_5 - 0.00813616071428615*G0_1_1_5_6 + 0.0576927759740279*G0_1_1_5_7 - 0.0369825487013*G0_1_1_5_8 + 0.0857995129870158*G0_1_1_5_9 - 0.00558847402597415*G0_1_1_6_0 + 0.0100263798701302*G0_1_1_6_1 + 0.0534192370129891*G0_1_1_6_2 - 0.037722199675326*G0_1_1_6_3 + 0.0517755681818201*G0_1_1_6_4 - 0.00813616071428615*G0_1_1_6_5 + 0.15532670454546*G0_1_1_6_6 - 0.020710227272728*G0_1_1_6_7 - 0.013313717532468*G0_1_1_6_8 + 0.0680478896103919*G0_1_1_6_9 + 0.02958603896104*G0_1_1_7_0 + 0.00723214285714312*G0_1_1_7_1 + 0.00435572240259755*G0_1_1_7_2 - 0.01109476461039*G0_1_1_7_3 - 0.00591720779220801*G0_1_1_7_4 + 0.0576927759740279*G0_1_1_7_5 - 0.020710227272728*G0_1_1_7_6 + 0.19230925324676*G0_1_1_7_7 - 0.035503246753248*G0_1_1_7_8 + 0.0532548701298721*G0_1_1_7_9 - 0.0123275162337667*G0_1_1_8_0 - 0.00657467532467556*G0_1_1_8_1 + 0.00139711850649354*G0_1_1_8_2 + 0.022929180194806*G0_1_1_8_3 - 0.011834415584416*G0_1_1_8_4 - 0.0369825487013*G0_1_1_8_5 - 0.013313717532468*G0_1_1_8_6 - 0.035503246753248*G0_1_1_8_7 + 0.0917167207792239*G0_1_1_8_8 - 0.026627435064936*G0_1_1_8_9 - 0.00394480519480527*G0_1_1_9_0 + 0.0167654220779227*G0_1_1_9_1 + 0.00246550324675336*G0_1_1_9_2 - 0.0281067370129879*G0_1_1_9_3 + 0.0207102272727279*G0_1_1_9_4 + 0.0857995129870158*G0_1_1_9_5 + 0.0680478896103919*G0_1_1_9_6 + 0.0532548701298721*G0_1_1_9_7 - 0.026627435064936*G0_1_1_9_8 + 0.408287337662352*G0_1_1_9_9; + A[46] = A[64] + 0.00171672077922087*G0_0_1_0_0 - 0.000127840909090911*G0_0_1_0_1 - 0.00904017857142893*G0_0_1_0_2 + 0.00205458603896113*G0_0_1_0_3 + 0.00180803571428577*G0_0_1_0_4 + 0.000904017857142925*G0_0_1_0_5 - 0.00673904220779247*G0_0_1_0_6 - 0.000493100649350677*G0_0_1_0_8 + 0.00690340909090935*G0_0_1_0_9 - 0.000127840909090911*G0_0_1_1_0 + 0.00171672077922087*G0_0_1_1_1 - 0.00904017857142891*G0_0_1_1_2 + 0.000904017857142903*G0_0_1_1_3 - 0.00673904220779247*G0_0_1_1_4 + 0.00205458603896112*G0_0_1_1_5 + 0.00180803571428575*G0_0_1_1_6 - 0.000493100649350673*G0_0_1_1_7 + 0.00690340909090933*G0_0_1_1_9 - 0.00904017857142893*G0_0_1_2_0 - 0.00904017857142891*G0_0_1_2_1 - 0.161627435064941*G0_0_1_2_2 + 0.0394480519480533*G0_0_1_2_3 - 0.0912236201298733*G0_0_1_2_4 + 0.0394480519480534*G0_0_1_2_5 - 0.0912236201298735*G0_0_1_2_6 + 0.00328733766233778*G0_0_1_2_7 + 0.00328733766233777*G0_0_1_2_8 - 0.0246550324675333*G0_0_1_2_9 + 0.00205458603896113*G0_0_1_3_0 + 0.000904017857142903*G0_0_1_3_1 + 0.0394480519480533*G0_0_1_3_2 - 0.00147930194805194*G0_0_1_3_3 + 0.0369825487013*G0_0_1_3_4 - 0.00887581168831202*G0_0_1_3_5 - 0.00073965097402603*G0_0_1_3_7 + 0.00517755681818202*G0_0_1_3_8 - 0.0192309253246759*G0_0_1_3_9 + 0.00180803571428577*G0_0_1_4_0 - 0.00673904220779247*G0_0_1_4_1 - 0.0912236201298733*G0_0_1_4_2 + 0.0369825487013001*G0_0_1_4_3 - 0.010355113636364*G0_0_1_4_7 - 0.004437905844156*G0_0_1_4_8 + 0.0739650974025999*G0_0_1_4_9 + 0.000904017857142926*G0_0_1_5_0 + 0.00205458603896112*G0_0_1_5_1 + 0.0394480519480534*G0_0_1_5_2 - 0.00887581168831202*G0_0_1_5_3 - 0.00147930194805206*G0_0_1_5_5 + 0.0369825487013*G0_0_1_5_6 + 0.00517755681818203*G0_0_1_5_7 - 0.000739650974026002*G0_0_1_5_8 - 0.019230925324676*G0_0_1_5_9 - 0.00673904220779247*G0_0_1_6_0 + 0.00180803571428575*G0_0_1_6_1 - 0.0912236201298735*G0_0_1_6_2 + 0.0369825487013*G0_0_1_6_5 - 0.004437905844156*G0_0_1_6_7 - 0.010355113636364*G0_0_1_6_8 + 0.0739650974025998*G0_0_1_6_9 - 0.000493100649350673*G0_0_1_7_1 + 0.00328733766233778*G0_0_1_7_2 - 0.000739650974026029*G0_0_1_7_3 - 0.010355113636364*G0_0_1_7_4 + 0.00517755681818203*G0_0_1_7_5 - 0.004437905844156*G0_0_1_7_6 + 0.0118344155844162*G0_0_1_7_7 - 0.00147930194805204*G0_0_1_7_8 - 0.0118344155844159*G0_0_1_7_9 - 0.000493100649350677*G0_0_1_8_0 + 0.00328733766233777*G0_0_1_8_2 + 0.00517755681818202*G0_0_1_8_3 - 0.004437905844156*G0_0_1_8_4 - 0.000739650974026003*G0_0_1_8_5 - 0.010355113636364*G0_0_1_8_6 - 0.00147930194805204*G0_0_1_8_7 + 0.0118344155844161*G0_0_1_8_8 - 0.011834415584416*G0_0_1_8_9 + 0.00690340909090935*G0_0_1_9_0 + 0.00690340909090933*G0_0_1_9_1 - 0.0246550324675333*G0_0_1_9_2 - 0.0192309253246759*G0_0_1_9_3 + 0.0739650974025999*G0_0_1_9_4 - 0.019230925324676*G0_0_1_9_5 + 0.0739650974025998*G0_0_1_9_6 - 0.0118344155844159*G0_0_1_9_7 - 0.011834415584416*G0_0_1_9_8 + 0.142012987012992*G0_0_1_9_9 - 0.00171672077922087*G0_1_0_0_0 + 0.000127840909090911*G0_1_0_0_1 + 0.00904017857142893*G0_1_0_0_2 - 0.00205458603896113*G0_1_0_0_3 - 0.00180803571428576*G0_1_0_0_4 - 0.000904017857142925*G0_1_0_0_5 + 0.00673904220779247*G0_1_0_0_6 + 0.000493100649350676*G0_1_0_0_8 - 0.00690340909090935*G0_1_0_0_9 + 0.000127840909090911*G0_1_0_1_0 - 0.00171672077922087*G0_1_0_1_1 + 0.00904017857142891*G0_1_0_1_2 - 0.000904017857142903*G0_1_0_1_3 + 0.00673904220779247*G0_1_0_1_4 - 0.00205458603896112*G0_1_0_1_5 - 0.00180803571428575*G0_1_0_1_6 + 0.000493100649350673*G0_1_0_1_7 - 0.00690340909090933*G0_1_0_1_9 + 0.00904017857142894*G0_1_0_2_0 + 0.00904017857142891*G0_1_0_2_1 + 0.161627435064941*G0_1_0_2_2 - 0.0394480519480533*G0_1_0_2_3 + 0.0912236201298733*G0_1_0_2_4 - 0.0394480519480534*G0_1_0_2_5 + 0.0912236201298735*G0_1_0_2_6 - 0.00328733766233778*G0_1_0_2_7 - 0.00328733766233777*G0_1_0_2_8 + 0.0246550324675333*G0_1_0_2_9 - 0.00205458603896113*G0_1_0_3_0 - 0.000904017857142903*G0_1_0_3_1 - 0.0394480519480533*G0_1_0_3_2 + 0.00147930194805194*G0_1_0_3_3 - 0.0369825487013001*G0_1_0_3_4 + 0.00887581168831202*G0_1_0_3_5 + 0.000739650974026029*G0_1_0_3_7 - 0.00517755681818202*G0_1_0_3_8 + 0.0192309253246759*G0_1_0_3_9 - 0.00180803571428577*G0_1_0_4_0 + 0.00673904220779247*G0_1_0_4_1 + 0.0912236201298733*G0_1_0_4_2 - 0.0369825487013001*G0_1_0_4_3 + 0.010355113636364*G0_1_0_4_7 + 0.004437905844156*G0_1_0_4_8 - 0.0739650974025999*G0_1_0_4_9 - 0.000904017857142926*G0_1_0_5_0 - 0.00205458603896112*G0_1_0_5_1 - 0.0394480519480534*G0_1_0_5_2 + 0.00887581168831202*G0_1_0_5_3 + 0.00147930194805206*G0_1_0_5_5 - 0.0369825487013*G0_1_0_5_6 - 0.00517755681818203*G0_1_0_5_7 + 0.000739650974026003*G0_1_0_5_8 + 0.019230925324676*G0_1_0_5_9 + 0.00673904220779247*G0_1_0_6_0 - 0.00180803571428575*G0_1_0_6_1 + 0.0912236201298735*G0_1_0_6_2 - 0.0369825487013*G0_1_0_6_5 + 0.004437905844156*G0_1_0_6_7 + 0.010355113636364*G0_1_0_6_8 - 0.0739650974025998*G0_1_0_6_9 + 0.000493100649350673*G0_1_0_7_1 - 0.00328733766233778*G0_1_0_7_2 + 0.000739650974026029*G0_1_0_7_3 + 0.010355113636364*G0_1_0_7_4 - 0.00517755681818203*G0_1_0_7_5 + 0.004437905844156*G0_1_0_7_6 - 0.0118344155844162*G0_1_0_7_7 + 0.00147930194805204*G0_1_0_7_8 + 0.0118344155844159*G0_1_0_7_9 + 0.000493100649350677*G0_1_0_8_0 - 0.00328733766233777*G0_1_0_8_2 - 0.00517755681818202*G0_1_0_8_3 + 0.004437905844156*G0_1_0_8_4 + 0.000739650974026003*G0_1_0_8_5 + 0.010355113636364*G0_1_0_8_6 + 0.00147930194805204*G0_1_0_8_7 - 0.0118344155844161*G0_1_0_8_8 + 0.011834415584416*G0_1_0_8_9 - 0.00690340909090935*G0_1_0_9_0 - 0.00690340909090933*G0_1_0_9_1 + 0.0246550324675333*G0_1_0_9_2 + 0.0192309253246759*G0_1_0_9_3 - 0.0739650974025999*G0_1_0_9_4 + 0.019230925324676*G0_1_0_9_5 - 0.0739650974025998*G0_1_0_9_6 + 0.0118344155844159*G0_1_0_9_7 + 0.011834415584416*G0_1_0_9_8 - 0.142012987012992*G0_1_0_9_9; + A[83] = A[46] + 0.00622767857142884*G0_0_0_0_0 + 0.000803571428571468*G0_0_0_0_1 + 0.0152952516233772*G0_0_0_0_2 - 0.0199705762987021*G0_0_0_0_3 + 0.0308187905844168*G0_0_0_0_4 - 0.0124918831168836*G0_0_0_0_5 + 0.0318871753246766*G0_0_0_0_6 - 0.000739650974025977*G0_0_0_0_7 - 0.00641030844155869*G0_0_0_0_8 + 0.011834415584416*G0_0_0_0_9 + 0.000803571428571468*G0_0_0_1_0 - 0.0216964285714293*G0_0_0_1_1 + 0.0115239448051953*G0_0_0_1_2 - 0.0535836038961058*G0_0_0_1_3 + 0.0507071834415603*G0_0_0_1_4 - 0.00838271103896137*G0_0_0_1_5 + 0.0295860389610401*G0_0_0_1_6 + 0.00698559253246779*G0_0_0_1_7 - 0.0213676948051956*G0_0_0_1_8 + 0.00542410714285734*G0_0_0_1_9 + 0.0152952516233772*G0_0_0_2_0 + 0.0115239448051953*G0_0_0_2_1 + 0.223812905844164*G0_0_0_2_2 - 0.0779099025974053*G0_0_0_2_3 + 0.152861201298707*G0_0_0_2_4 - 0.0685409902597428*G0_0_0_2_5 + 0.150395698051954*G0_0_0_2_6 + 0.000493100649350666*G0_0_0_2_7 - 0.00567065746753267*G0_0_0_2_8 + 0.0256412337662347*G0_0_0_2_9 - 0.0199705762987021*G0_0_0_3_0 - 0.0535836038961058*G0_0_0_3_1 - 0.0779099025974053*G0_0_0_3_2 - 0.158285308441564*G0_0_0_3_3 - 0.105030438311692*G0_0_0_3_4 + 0.053254870129872*G0_0_0_3_5 - 0.110207995129874*G0_0_0_3_6 + 0.0384618506493521*G0_0_0_3_7 - 0.0340239448051961*G0_0_0_3_8 - 0.0931960227272761*G0_0_0_3_9 + 0.0308187905844168*G0_0_0_4_0 + 0.0507071834415603*G0_0_0_4_1 + 0.152861201298707*G0_0_0_4_2 - 0.105030438311692*G0_0_0_4_3 + 0.418642451298716*G0_0_0_4_4 - 0.113906250000004*G0_0_0_4_5 + 0.224114245129878*G0_0_0_4_6 - 0.036242897727274*G0_0_0_4_7 - 0.00443790584415596*G0_0_0_4_8 + 0.150888798701304*G0_0_0_4_9 - 0.0124918831168836*G0_0_0_5_0 - 0.00838271103896137*G0_0_0_5_1 - 0.0685409902597428*G0_0_0_5_2 + 0.053254870129872*G0_0_0_5_3 - 0.113906250000004*G0_0_0_5_4 + 0.121302759740264*G0_0_0_5_5 - 0.150149147727278*G0_0_0_5_6 + 0.019230925324676*G0_0_0_5_7 + 0.00369825487013*G0_0_0_5_8 - 0.042899756493508*G0_0_0_5_9 + 0.0318871753246766*G0_0_0_6_0 + 0.0295860389610401*G0_0_0_6_1 + 0.150395698051954*G0_0_0_6_2 - 0.110207995129874*G0_0_0_6_3 + 0.224114245129878*G0_0_0_6_4 - 0.150149147727278*G0_0_0_6_5 + 0.479293831168848*G0_0_0_6_6 - 0.022929180194806*G0_0_0_6_7 - 0.025148133116884*G0_0_0_6_8 + 0.143492288961044*G0_0_0_6_9 - 0.000739650974025978*G0_0_0_7_0 + 0.00698559253246779*G0_0_0_7_1 + 0.000493100649350666*G0_0_0_7_2 + 0.0384618506493521*G0_0_0_7_3 - 0.036242897727274*G0_0_0_7_4 + 0.019230925324676*G0_0_0_7_5 - 0.022929180194806*G0_0_0_7_6 + 0.011834415584416*G0_0_0_7_7 + 0.017751623376624*G0_0_0_7_8 + 0.0103551136363641*G0_0_0_7_9 - 0.00641030844155869*G0_0_0_8_0 - 0.0213676948051956*G0_0_0_8_1 - 0.00567065746753267*G0_0_0_8_2 - 0.0340239448051961*G0_0_0_8_3 - 0.00443790584415596*G0_0_0_8_4 + 0.00369825487013*G0_0_0_8_5 - 0.025148133116884*G0_0_0_8_6 + 0.017751623376624*G0_0_0_8_7 - 0.00739650974026008*G0_0_0_8_8 - 0.00739650974026011*G0_0_0_8_9 + 0.011834415584416*G0_0_0_9_0 + 0.00542410714285734*G0_0_0_9_1 + 0.0256412337662347*G0_0_0_9_2 - 0.0931960227272761*G0_0_0_9_3 + 0.150888798701304*G0_0_0_9_4 - 0.042899756493508*G0_0_0_9_5 + 0.143492288961044*G0_0_0_9_6 + 0.0103551136363641*G0_0_0_9_7 - 0.0073965097402601*G0_0_0_9_8 + 0.284025974025983*G0_0_0_9_9 - 0.00981635551948091*G0_0_1_0_1 + 0.00981635551948092*G0_0_1_0_2 - 0.0224360795454554*G0_0_1_0_3 + 0.0224360795454554*G0_0_1_0_4 - 0.00509537337662362*G0_0_1_0_5 + 0.0175872564935072*G0_0_1_0_6 + 0.00509537337662355*G0_0_1_0_7 - 0.0175872564935072*G0_0_1_0_8 - 0.00981635551948091*G0_0_1_1_0 - 0.190464691558448*G0_0_1_1_1 - 0.138972199675329*G0_0_1_1_3 + 0.0807041396103924*G0_0_1_1_4 - 0.00320515422077936*G0_0_1_1_5 + 0.012574066558442*G0_0_1_1_6 + 0.0483238636363654*G0_0_1_1_7 - 0.1109476461039*G0_0_1_1_8 - 0.0226826298701307*G0_0_1_1_9 + 0.00981635551948092*G0_0_1_2_0 + 0.190464691558448*G0_0_1_2_2 - 0.0807041396103924*G0_0_1_2_3 + 0.13897219967533*G0_0_1_2_4 - 0.0483238636363654*G0_0_1_2_5 + 0.1109476461039*G0_0_1_2_6 + 0.00320515422077934*G0_0_1_2_7 - 0.012574066558442*G0_0_1_2_8 + 0.0226826298701307*G0_0_1_2_9 - 0.0224360795454554*G0_0_1_3_0 - 0.138972199675329*G0_0_1_3_1 - 0.0807041396103924*G0_0_1_3_2 - 0.278108766233776*G0_0_1_3_3 + 0.038461850649352*G0_0_1_3_5 - 0.0377221996753261*G0_0_1_3_6 + 0.0673082386363661*G0_0_1_3_7 - 0.105030438311692*G0_0_1_3_8 - 0.0665685876623403*G0_0_1_3_9 + 0.0224360795454554*G0_0_1_4_0 + 0.0807041396103924*G0_0_1_4_1 + 0.13897219967533*G0_0_1_4_2 + 0.278108766233776*G0_0_1_4_4 - 0.0673082386363661*G0_0_1_4_5 + 0.105030438311692*G0_0_1_4_6 - 0.038461850649352*G0_0_1_4_7 + 0.0377221996753261*G0_0_1_4_8 + 0.0665685876623401*G0_0_1_4_9 - 0.00509537337662362*G0_0_1_5_0 - 0.00320515422077936*G0_0_1_5_1 - 0.0483238636363654*G0_0_1_5_2 + 0.038461850649352*G0_0_1_5_3 - 0.0673082386363661*G0_0_1_5_4 + 0.0310653409090921*G0_0_1_5_5 - 0.0806219561688341*G0_0_1_5_6 + 0.00961546266233801*G0_0_1_5_8 - 0.019230925324676*G0_0_1_5_9 + 0.0175872564935072*G0_0_1_6_0 + 0.012574066558442*G0_0_1_6_1 + 0.1109476461039*G0_0_1_6_2 - 0.0377221996753261*G0_0_1_6_3 + 0.105030438311692*G0_0_1_6_4 - 0.0806219561688341*G0_0_1_6_5 + 0.109468344155849*G0_0_1_6_6 - 0.00961546266233801*G0_0_1_6_7 + 0.00739650974026012*G0_0_1_6_9 + 0.00509537337662355*G0_0_1_7_0 + 0.0483238636363654*G0_0_1_7_1 + 0.00320515422077934*G0_0_1_7_2 + 0.0673082386363661*G0_0_1_7_3 - 0.038461850649352*G0_0_1_7_4 - 0.00961546266233801*G0_0_1_7_6 - 0.0310653409090921*G0_0_1_7_7 + 0.0806219561688342*G0_0_1_7_8 + 0.0192309253246761*G0_0_1_7_9 - 0.0175872564935072*G0_0_1_8_0 - 0.1109476461039*G0_0_1_8_1 - 0.012574066558442*G0_0_1_8_2 - 0.105030438311692*G0_0_1_8_3 + 0.0377221996753261*G0_0_1_8_4 + 0.00961546266233801*G0_0_1_8_5 + 0.0806219561688342*G0_0_1_8_7 - 0.109468344155848*G0_0_1_8_8 - 0.00739650974026014*G0_0_1_8_9 - 0.0226826298701307*G0_0_1_9_1 + 0.0226826298701307*G0_0_1_9_2 - 0.0665685876623403*G0_0_1_9_3 + 0.0665685876623401*G0_0_1_9_4 - 0.019230925324676*G0_0_1_9_5 + 0.00739650974026012*G0_0_1_9_6 + 0.0192309253246761*G0_0_1_9_7 - 0.00739650974026014*G0_0_1_9_8 - 0.000904017857142889*G0_1_0_0_1 + 0.000904017857142908*G0_1_0_0_2 - 0.0221895292207801*G0_1_0_0_3 + 0.0221895292207801*G0_1_0_0_4 - 0.00419135551948068*G0_1_0_0_5 + 0.0113413149350654*G0_1_0_0_6 + 0.00419135551948068*G0_1_0_0_7 - 0.0113413149350654*G0_1_0_0_8 - 0.000904017857142889*G0_1_0_1_0 - 0.0271205357142866*G0_1_0_1_1 - 0.0468445616883133*G0_1_0_1_3 + 0.0345170454545467*G0_1_0_1_4 - 0.00443790584415601*G0_1_0_1_5 + 0.01109476461039*G0_1_0_1_6 + 0.00838271103896135*G0_1_0_1_7 - 0.0197240259740267*G0_1_0_1_8 + 0.00887581168831197*G0_1_0_1_9 + 0.000904017857142907*G0_1_0_2_0 + 0.0271205357142868*G0_1_0_2_2 - 0.0345170454545467*G0_1_0_2_3 + 0.0468445616883134*G0_1_0_2_4 - 0.00838271103896138*G0_1_0_2_5 + 0.0197240259740268*G0_1_0_2_6 + 0.00443790584415599*G0_1_0_2_7 - 0.01109476461039*G0_1_0_2_8 - 0.00887581168831196*G0_1_0_2_9 - 0.0221895292207801*G0_1_0_3_0 - 0.0468445616883133*G0_1_0_3_1 - 0.0345170454545467*G0_1_0_3_2 - 0.279588068181828*G0_1_0_3_3 + 0.039941152597404*G0_1_0_3_5 - 0.03328429383117*G0_1_0_3_6 + 0.06656858766234*G0_1_0_3_7 - 0.0998528814935101*G0_1_0_3_8 - 0.159764610389616*G0_1_0_3_9 + 0.0221895292207801*G0_1_0_4_0 + 0.0345170454545467*G0_1_0_4_1 + 0.0468445616883134*G0_1_0_4_2 + 0.279588068181828*G0_1_0_4_4 - 0.0665685876623401*G0_1_0_4_5 + 0.0998528814935101*G0_1_0_4_6 - 0.039941152597404*G0_1_0_4_7 + 0.03328429383117*G0_1_0_4_8 + 0.159764610389616*G0_1_0_4_9 - 0.00419135551948068*G0_1_0_5_0 - 0.00443790584415601*G0_1_0_5_1 - 0.00838271103896138*G0_1_0_5_2 + 0.039941152597404*G0_1_0_5_3 - 0.0665685876623401*G0_1_0_5_4 + 0.017751623376624*G0_1_0_5_5 - 0.0421601055194821*G0_1_0_5_6 + 0.013313717532468*G0_1_0_5_8 - 0.026627435064936*G0_1_0_5_9 + 0.0113413149350654*G0_1_0_6_0 + 0.01109476461039*G0_1_0_6_1 + 0.0197240259740268*G0_1_0_6_2 - 0.03328429383117*G0_1_0_6_3 + 0.0998528814935101*G0_1_0_6_4 - 0.0421601055194821*G0_1_0_6_5 + 0.0976339285714322*G0_1_0_6_6 - 0.013313717532468*G0_1_0_6_7 + 0.093196022727276*G0_1_0_6_9 + 0.00419135551948068*G0_1_0_7_0 + 0.00838271103896135*G0_1_0_7_1 + 0.00443790584415599*G0_1_0_7_2 + 0.0665685876623401*G0_1_0_7_3 - 0.039941152597404*G0_1_0_7_4 - 0.013313717532468*G0_1_0_7_6 - 0.017751623376624*G0_1_0_7_7 + 0.042160105519482*G0_1_0_7_8 + 0.026627435064936*G0_1_0_7_9 - 0.0113413149350654*G0_1_0_8_0 - 0.0197240259740267*G0_1_0_8_1 - 0.01109476461039*G0_1_0_8_2 - 0.0998528814935101*G0_1_0_8_3 + 0.03328429383117*G0_1_0_8_4 + 0.013313717532468*G0_1_0_8_5 + 0.042160105519482*G0_1_0_8_7 - 0.0976339285714319*G0_1_0_8_8 - 0.093196022727276*G0_1_0_8_9 + 0.00887581168831197*G0_1_0_9_1 - 0.00887581168831195*G0_1_0_9_2 - 0.159764610389616*G0_1_0_9_3 + 0.159764610389616*G0_1_0_9_4 - 0.026627435064936*G0_1_0_9_5 + 0.093196022727276*G0_1_0_9_6 + 0.026627435064936*G0_1_0_9_7 - 0.093196022727276*G0_1_0_9_8 - 0.00622767857142885*G0_1_1_0_0 - 0.0152952516233772*G0_1_1_0_1 - 0.000803571428571448*G0_1_1_0_2 - 0.0308187905844168*G0_1_1_0_3 + 0.0199705762987021*G0_1_1_0_4 + 0.00073965097402597*G0_1_1_0_5 + 0.00641030844155869*G0_1_1_0_6 + 0.0124918831168836*G0_1_1_0_7 - 0.0318871753246765*G0_1_1_0_8 - 0.0118344155844161*G0_1_1_0_9 - 0.0152952516233772*G0_1_1_1_0 - 0.223812905844164*G0_1_1_1_1 - 0.0115239448051952*G0_1_1_1_2 - 0.152861201298707*G0_1_1_1_3 + 0.0779099025974053*G0_1_1_1_4 - 0.000493100649350668*G0_1_1_1_5 + 0.00567065746753269*G0_1_1_1_6 + 0.0685409902597428*G0_1_1_1_7 - 0.150395698051954*G0_1_1_1_8 - 0.0256412337662348*G0_1_1_1_9 - 0.000803571428571448*G0_1_1_2_0 - 0.0115239448051952*G0_1_1_2_1 + 0.0216964285714294*G0_1_1_2_2 - 0.0507071834415602*G0_1_1_2_3 + 0.0535836038961058*G0_1_1_2_4 - 0.00698559253246781*G0_1_1_2_5 + 0.0213676948051956*G0_1_1_2_6 + 0.00838271103896133*G0_1_1_2_7 - 0.02958603896104*G0_1_1_2_8 - 0.00542410714285733*G0_1_1_2_9 - 0.0308187905844168*G0_1_1_3_0 - 0.152861201298707*G0_1_1_3_1 - 0.0507071834415602*G0_1_1_3_2 - 0.418642451298716*G0_1_1_3_3 + 0.105030438311692*G0_1_1_3_4 + 0.036242897727274*G0_1_1_3_5 + 0.00443790584415597*G0_1_1_3_6 + 0.113906250000004*G0_1_1_3_7 - 0.224114245129878*G0_1_1_3_8 - 0.150888798701304*G0_1_1_3_9 + 0.0199705762987021*G0_1_1_4_0 + 0.0779099025974053*G0_1_1_4_1 + 0.0535836038961058*G0_1_1_4_2 + 0.105030438311692*G0_1_1_4_3 + 0.158285308441564*G0_1_1_4_4 - 0.038461850649352*G0_1_1_4_5 + 0.0340239448051961*G0_1_1_4_6 - 0.053254870129872*G0_1_1_4_7 + 0.110207995129874*G0_1_1_4_8 + 0.0931960227272761*G0_1_1_4_9 + 0.00073965097402597*G0_1_1_5_0 - 0.000493100649350668*G0_1_1_5_1 - 0.00698559253246781*G0_1_1_5_2 + 0.036242897727274*G0_1_1_5_3 - 0.038461850649352*G0_1_1_5_4 - 0.0118344155844159*G0_1_1_5_5 - 0.017751623376624*G0_1_1_5_6 - 0.019230925324676*G0_1_1_5_7 + 0.022929180194806*G0_1_1_5_8 - 0.0103551136363639*G0_1_1_5_9 + 0.00641030844155869*G0_1_1_6_0 + 0.00567065746753269*G0_1_1_6_1 + 0.0213676948051956*G0_1_1_6_2 + 0.00443790584415597*G0_1_1_6_3 + 0.0340239448051961*G0_1_1_6_4 - 0.017751623376624*G0_1_1_6_5 + 0.00739650974026017*G0_1_1_6_6 - 0.00369825487013*G0_1_1_6_7 + 0.0251481331168839*G0_1_1_6_8 + 0.00739650974026007*G0_1_1_6_9 + 0.0124918831168836*G0_1_1_7_0 + 0.0685409902597428*G0_1_1_7_1 + 0.00838271103896133*G0_1_1_7_2 + 0.113906250000004*G0_1_1_7_3 - 0.053254870129872*G0_1_1_7_4 - 0.019230925324676*G0_1_1_7_5 - 0.00369825487013*G0_1_1_7_6 - 0.121302759740264*G0_1_1_7_7 + 0.150149147727278*G0_1_1_7_8 + 0.042899756493508*G0_1_1_7_9 - 0.0318871753246765*G0_1_1_8_0 - 0.150395698051954*G0_1_1_8_1 - 0.02958603896104*G0_1_1_8_2 - 0.224114245129878*G0_1_1_8_3 + 0.110207995129874*G0_1_1_8_4 + 0.022929180194806*G0_1_1_8_5 + 0.025148133116884*G0_1_1_8_6 + 0.150149147727278*G0_1_1_8_7 - 0.479293831168848*G0_1_1_8_8 - 0.143492288961044*G0_1_1_8_9 - 0.0118344155844161*G0_1_1_9_0 - 0.0256412337662348*G0_1_1_9_1 - 0.00542410714285733*G0_1_1_9_2 - 0.150888798701304*G0_1_1_9_3 + 0.0931960227272761*G0_1_1_9_4 - 0.0103551136363639*G0_1_1_9_5 + 0.00739650974026006*G0_1_1_9_6 + 0.042899756493508*G0_1_1_9_7 - 0.143492288961044*G0_1_1_9_8 - 0.284025974025984*G0_1_1_9_9; + A[56] = A[65] + 0.00164366883116885*G0_0_1_0_0 + 0.00136972402597407*G0_0_1_0_1 - 0.000493100649350661*G0_0_1_0_2 - 0.00172585227272732*G0_0_1_0_3 - 0.00024655032467533*G0_0_1_0_4 + 0.0135602678571433*G0_0_1_0_5 + 0.00295860389610396*G0_0_1_0_6 + 0.00616375811688329*G0_0_1_0_7 - 0.00443790584415597*G0_0_1_0_8 + 0.0113413149350653*G0_0_1_0_9 + 0.00136972402597407*G0_0_1_1_0 - 0.00202719155844163*G0_0_1_1_1 + 0.00136972402597408*G0_0_1_1_2 + 0.00517755681818199*G0_0_1_1_3 - 0.00320515422077932*G0_0_1_1_4 - 0.0120809659090913*G0_0_1_1_5 - 0.0120809659090913*G0_0_1_1_6 - 0.00320515422077934*G0_0_1_1_7 + 0.005177556818182*G0_0_1_1_8 - 0.0226826298701307*G0_0_1_1_9 - 0.000493100649350661*G0_0_1_2_0 + 0.00136972402597408*G0_0_1_2_1 + 0.00164366883116891*G0_0_1_2_2 - 0.00443790584415601*G0_0_1_2_3 + 0.00616375811688337*G0_0_1_2_4 + 0.00295860389610397*G0_0_1_2_5 + 0.0135602678571433*G0_0_1_2_6 - 0.00024655032467534*G0_0_1_2_7 - 0.00172585227272732*G0_0_1_2_8 + 0.0113413149350653*G0_0_1_2_9 - 0.00172585227272732*G0_0_1_3_0 + 0.00517755681818199*G0_0_1_3_1 - 0.00443790584415601*G0_0_1_3_2 - 0.00887581168831189*G0_0_1_3_3 + 0.00887581168831193*G0_0_1_3_4 + 0.0207102272727279*G0_0_1_3_5 + 0.0362428977272738*G0_0_1_3_6 + 0.00517755681818199*G0_0_1_3_7 - 0.010355113636364*G0_0_1_3_8 + 0.0576927759740279*G0_0_1_3_9 - 0.000246550324675332*G0_0_1_4_0 - 0.00320515422077932*G0_0_1_4_1 + 0.00616375811688337*G0_0_1_4_2 + 0.00887581168831191*G0_0_1_4_3 + 0.000739650974026018*G0_0_1_4_5 - 0.0369825487012999*G0_0_1_4_6 + 0.000739650974025996*G0_0_1_4_7 + 0.00517755681818197*G0_0_1_4_8 - 0.0355032467532478*G0_0_1_4_9 + 0.0135602678571433*G0_0_1_5_0 - 0.0120809659090913*G0_0_1_5_1 + 0.00295860389610397*G0_0_1_5_2 + 0.0207102272727279*G0_0_1_5_3 + 0.000739650974026014*G0_0_1_5_4 - 0.2218952922078*G0_0_1_5_5 - 0.0221895292207799*G0_0_1_5_6 - 0.0369825487013*G0_0_1_5_7 + 0.036242897727274*G0_0_1_5_8 - 0.106509740259744*G0_0_1_5_9 + 0.00295860389610396*G0_0_1_6_0 - 0.0120809659090913*G0_0_1_6_1 + 0.0135602678571433*G0_0_1_6_2 + 0.0362428977272739*G0_0_1_6_3 - 0.0369825487012999*G0_0_1_6_4 - 0.02218952922078*G0_0_1_6_5 - 0.2218952922078*G0_0_1_6_6 + 0.000739650974025989*G0_0_1_6_7 + 0.0207102272727279*G0_0_1_6_8 - 0.106509740259744*G0_0_1_6_9 + 0.00616375811688329*G0_0_1_7_0 - 0.00320515422077934*G0_0_1_7_1 - 0.00024655032467534*G0_0_1_7_2 + 0.00517755681818199*G0_0_1_7_3 + 0.000739650974025996*G0_0_1_7_4 - 0.0369825487013*G0_0_1_7_5 + 0.000739650974025989*G0_0_1_7_6 + 0.00887581168831203*G0_0_1_7_8 - 0.035503246753248*G0_0_1_7_9 - 0.00443790584415597*G0_0_1_8_0 + 0.00517755681818201*G0_0_1_8_1 - 0.00172585227272732*G0_0_1_8_2 - 0.010355113636364*G0_0_1_8_3 + 0.00517755681818197*G0_0_1_8_4 + 0.036242897727274*G0_0_1_8_5 + 0.0207102272727279*G0_0_1_8_6 + 0.00887581168831203*G0_0_1_8_7 - 0.00887581168831198*G0_0_1_8_8 + 0.057692775974028*G0_0_1_8_9 + 0.0113413149350653*G0_0_1_9_0 - 0.0226826298701307*G0_0_1_9_1 + 0.0113413149350653*G0_0_1_9_2 + 0.0576927759740279*G0_0_1_9_3 - 0.0355032467532478*G0_0_1_9_4 - 0.106509740259744*G0_0_1_9_5 - 0.106509740259744*G0_0_1_9_6 - 0.035503246753248*G0_0_1_9_7 + 0.057692775974028*G0_0_1_9_8 - 0.319529220779232*G0_0_1_9_9 - 0.00164366883116885*G0_1_0_0_0 - 0.00136972402597407*G0_1_0_0_1 + 0.000493100649350661*G0_1_0_0_2 + 0.00172585227272732*G0_1_0_0_3 + 0.00024655032467533*G0_1_0_0_4 - 0.0135602678571433*G0_1_0_0_5 - 0.00295860389610396*G0_1_0_0_6 - 0.00616375811688329*G0_1_0_0_7 + 0.00443790584415597*G0_1_0_0_8 - 0.0113413149350653*G0_1_0_0_9 - 0.00136972402597407*G0_1_0_1_0 + 0.00202719155844163*G0_1_0_1_1 - 0.00136972402597408*G0_1_0_1_2 - 0.00517755681818199*G0_1_0_1_3 + 0.00320515422077932*G0_1_0_1_4 + 0.0120809659090913*G0_1_0_1_5 + 0.0120809659090913*G0_1_0_1_6 + 0.00320515422077934*G0_1_0_1_7 - 0.00517755681818201*G0_1_0_1_8 + 0.0226826298701307*G0_1_0_1_9 + 0.000493100649350661*G0_1_0_2_0 - 0.00136972402597408*G0_1_0_2_1 - 0.00164366883116891*G0_1_0_2_2 + 0.00443790584415601*G0_1_0_2_3 - 0.00616375811688337*G0_1_0_2_4 - 0.00295860389610397*G0_1_0_2_5 - 0.0135602678571433*G0_1_0_2_6 + 0.00024655032467534*G0_1_0_2_7 + 0.00172585227272732*G0_1_0_2_8 - 0.0113413149350653*G0_1_0_2_9 + 0.00172585227272732*G0_1_0_3_0 - 0.00517755681818199*G0_1_0_3_1 + 0.00443790584415601*G0_1_0_3_2 + 0.00887581168831189*G0_1_0_3_3 - 0.00887581168831193*G0_1_0_3_4 - 0.0207102272727279*G0_1_0_3_5 - 0.0362428977272738*G0_1_0_3_6 - 0.00517755681818199*G0_1_0_3_7 + 0.010355113636364*G0_1_0_3_8 - 0.0576927759740279*G0_1_0_3_9 + 0.000246550324675332*G0_1_0_4_0 + 0.00320515422077932*G0_1_0_4_1 - 0.00616375811688337*G0_1_0_4_2 - 0.00887581168831193*G0_1_0_4_3 - 0.000739650974026018*G0_1_0_4_5 + 0.0369825487012999*G0_1_0_4_6 - 0.000739650974025996*G0_1_0_4_7 - 0.00517755681818197*G0_1_0_4_8 + 0.0355032467532478*G0_1_0_4_9 - 0.0135602678571433*G0_1_0_5_0 + 0.0120809659090913*G0_1_0_5_1 - 0.00295860389610396*G0_1_0_5_2 - 0.0207102272727279*G0_1_0_5_3 - 0.000739650974026014*G0_1_0_5_4 + 0.2218952922078*G0_1_0_5_5 + 0.0221895292207799*G0_1_0_5_6 + 0.0369825487013*G0_1_0_5_7 - 0.036242897727274*G0_1_0_5_8 + 0.106509740259744*G0_1_0_5_9 - 0.00295860389610396*G0_1_0_6_0 + 0.0120809659090913*G0_1_0_6_1 - 0.0135602678571433*G0_1_0_6_2 - 0.0362428977272739*G0_1_0_6_3 + 0.0369825487012999*G0_1_0_6_4 + 0.0221895292207799*G0_1_0_6_5 + 0.2218952922078*G0_1_0_6_6 - 0.00073965097402599*G0_1_0_6_7 - 0.0207102272727279*G0_1_0_6_8 + 0.106509740259744*G0_1_0_6_9 - 0.00616375811688329*G0_1_0_7_0 + 0.00320515422077934*G0_1_0_7_1 + 0.00024655032467534*G0_1_0_7_2 - 0.00517755681818199*G0_1_0_7_3 - 0.000739650974025995*G0_1_0_7_4 + 0.0369825487013*G0_1_0_7_5 - 0.00073965097402599*G0_1_0_7_6 - 0.00887581168831202*G0_1_0_7_8 + 0.035503246753248*G0_1_0_7_9 + 0.00443790584415597*G0_1_0_8_0 - 0.005177556818182*G0_1_0_8_1 + 0.00172585227272732*G0_1_0_8_2 + 0.010355113636364*G0_1_0_8_3 - 0.00517755681818197*G0_1_0_8_4 - 0.036242897727274*G0_1_0_8_5 - 0.0207102272727279*G0_1_0_8_6 - 0.00887581168831202*G0_1_0_8_7 + 0.00887581168831198*G0_1_0_8_8 - 0.057692775974028*G0_1_0_8_9 - 0.0113413149350653*G0_1_0_9_0 + 0.0226826298701307*G0_1_0_9_1 - 0.0113413149350653*G0_1_0_9_2 - 0.0576927759740279*G0_1_0_9_3 + 0.0355032467532478*G0_1_0_9_4 + 0.106509740259744*G0_1_0_9_5 + 0.106509740259744*G0_1_0_9_6 + 0.0355032467532481*G0_1_0_9_7 - 0.057692775974028*G0_1_0_9_8 + 0.319529220779232*G0_1_0_9_9; + A[77] = A[55] + 0.16162743506494*G0_0_0_0_0 + 0.0114326298701303*G0_0_0_0_1 + 0.00664772727272748*G0_0_0_0_2 - 0.000328733766233759*G0_0_0_0_3 - 0.00624594155844182*G0_0_0_0_4 + 0.110125811688315*G0_0_0_0_5 - 0.0378043831168844*G0_0_0_0_6 + 0.072321428571431*G0_0_0_0_7 - 0.0410917207792221*G0_0_0_0_8 + 0.0246550324675333*G0_0_0_0_9 + 0.0114326298701303*G0_0_0_1_0 + 0.038242694805196*G0_0_0_1_1 + 0.000127840909090897*G0_0_0_1_2 + 0.0361607142857155*G0_0_0_1_3 - 0.0190665584415591*G0_0_0_1_4 - 0.00969764610389642*G0_0_0_1_5 - 0.0106838474025978*G0_0_0_1_6 - 0.00953327922077957*G0_0_0_1_7 + 0.00871144480519514*G0_0_0_1_8 - 0.0276136363636373*G0_0_0_1_9 + 0.00664772727272748*G0_0_0_2_0 + 0.000127840909090897*G0_0_0_2_1 - 0.0416761363636378*G0_0_0_2_2 + 0.0200527597402604*G0_0_0_2_3 - 0.0361607142857155*G0_0_0_2_4 + 0.0230113636363644*G0_0_0_2_5 - 0.0105194805194809*G0_0_0_2_6 + 0.00608157467532487*G0_0_0_2_7 + 0.00657467532467555*G0_0_0_2_8 + 0.0138068181818186*G0_0_0_2_9 - 0.00032873376623376*G0_0_0_3_0 + 0.0361607142857155*G0_0_0_3_1 + 0.0200527597402604*G0_0_0_3_2 + 0.0887581168831199*G0_0_0_3_3 + 0.00147930194805203*G0_0_0_3_4 + 0.0177516233766239*G0_0_0_3_5 + 0.0266274350649359*G0_0_0_3_6 - 0.00443790584415604*G0_0_0_3_7 + 0.02958603896104*G0_0_0_3_8 + 0.0917167207792239*G0_0_0_3_9 - 0.00624594155844182*G0_0_0_4_0 - 0.0190665584415591*G0_0_0_4_1 - 0.0361607142857155*G0_0_0_4_2 + 0.00147930194805202*G0_0_0_4_3 - 0.112426948051952*G0_0_0_4_4 + 0.013313717532468*G0_0_0_4_5 - 0.039941152597404*G0_0_0_4_6 + 0.002958603896104*G0_0_0_4_7 - 0.025148133116884*G0_0_0_4_8 - 0.0680478896103918*G0_0_0_4_9 + 0.110125811688315*G0_0_0_5_0 - 0.00969764610389642*G0_0_0_5_1 + 0.0230113636363644*G0_0_0_5_2 + 0.0177516233766239*G0_0_0_5_3 + 0.013313717532468*G0_0_0_5_4 - 0.10355113636364*G0_0_0_5_5 - 0.0798823051948078*G0_0_0_5_6 + 0.0236688311688319*G0_0_0_5_8 - 0.121302759740264*G0_0_0_5_9 - 0.0378043831168844*G0_0_0_6_0 - 0.0106838474025978*G0_0_0_6_1 - 0.0105194805194809*G0_0_0_6_2 + 0.0266274350649359*G0_0_0_6_3 - 0.039941152597404*G0_0_0_6_4 - 0.0798823051948078*G0_0_0_6_5 - 0.136095779220784*G0_0_0_6_6 - 0.0236688311688319*G0_0_0_6_7 + 0.00887581168831197*G0_0_0_6_8 - 0.0946753246753279*G0_0_0_6_9 + 0.072321428571431*G0_0_0_7_0 - 0.00953327922077957*G0_0_0_7_1 + 0.00608157467532487*G0_0_0_7_2 - 0.00443790584415604*G0_0_0_7_3 + 0.002958603896104*G0_0_0_7_4 - 0.0236688311688319*G0_0_0_7_6 + 0.10355113636364*G0_0_0_7_7 + 0.00591720779220799*G0_0_0_7_8 - 0.026627435064936*G0_0_0_7_9 - 0.0410917207792221*G0_0_0_8_0 + 0.00871144480519514*G0_0_0_8_1 + 0.00657467532467555*G0_0_0_8_2 + 0.02958603896104*G0_0_0_8_3 - 0.025148133116884*G0_0_0_8_4 + 0.023668831168832*G0_0_0_8_5 + 0.00887581168831197*G0_0_0_8_6 + 0.00591720779220799*G0_0_0_8_7 + 0.139054383116888*G0_0_0_8_8 + 0.13313717532468*G0_0_0_8_9 + 0.0246550324675333*G0_0_0_9_0 - 0.0276136363636373*G0_0_0_9_1 + 0.0138068181818186*G0_0_0_9_2 + 0.0917167207792239*G0_0_0_9_3 - 0.0680478896103918*G0_0_0_9_4 - 0.121302759740264*G0_0_0_9_5 - 0.0946753246753278*G0_0_0_9_6 - 0.026627435064936*G0_0_0_9_7 + 0.13313717532468*G0_0_0_9_8 - 0.142012987012992*G0_0_0_9_9 + 0.00239245129870138*G0_0_1_0_1 - 0.00239245129870139*G0_0_1_0_2 + 0.00295860389610404*G0_0_1_0_3 - 0.00295860389610403*G0_0_1_0_4 + 0.0189021915584422*G0_0_1_0_5 + 0.00164366883116883*G0_0_1_0_6 - 0.0189021915584422*G0_0_1_0_7 - 0.00164366883116885*G0_0_1_0_8 + 0.00239245129870138*G0_0_1_1_0 + 0.0399594155844169*G0_0_1_1_1 + 0.0361607142857155*G0_0_1_1_3 - 0.0195596590909097*G0_0_1_1_4 - 0.00788961038961064*G0_0_1_1_5 - 0.00862926136363669*G0_0_1_1_6 - 0.016272321428572*G0_0_1_1_7 + 0.00961546266233801*G0_0_1_1_8 - 0.020710227272728*G0_0_1_1_9 - 0.00239245129870139*G0_0_1_2_0 - 0.039959415584417*G0_0_1_2_2 + 0.0195596590909097*G0_0_1_2_3 - 0.0361607142857155*G0_0_1_2_4 + 0.016272321428572*G0_0_1_2_5 - 0.00961546266233806*G0_0_1_2_6 + 0.00788961038961067*G0_0_1_2_7 + 0.00862926136363665*G0_0_1_2_8 + 0.020710227272728*G0_0_1_2_9 + 0.00295860389610404*G0_0_1_3_0 + 0.0361607142857155*G0_0_1_3_1 + 0.0195596590909098*G0_0_1_3_2 + 0.100592532467536*G0_0_1_3_3 + 0.00739650974025993*G0_0_1_3_5 + 0.0258877840909099*G0_0_1_3_6 - 0.00887581168831206*G0_0_1_3_7 + 0.034763595779222*G0_0_1_3_8 + 0.0798823051948079*G0_0_1_3_9 - 0.00295860389610403*G0_0_1_4_0 - 0.0195596590909097*G0_0_1_4_1 - 0.0361607142857155*G0_0_1_4_2 - 0.100592532467536*G0_0_1_4_4 + 0.00887581168831203*G0_0_1_4_5 - 0.034763595779222*G0_0_1_4_6 - 0.00739650974026001*G0_0_1_4_7 - 0.02588778409091*G0_0_1_4_8 - 0.0798823051948079*G0_0_1_4_9 + 0.0189021915584422*G0_0_1_5_0 - 0.00788961038961064*G0_0_1_5_1 + 0.016272321428572*G0_0_1_5_2 + 0.00739650974025993*G0_0_1_5_3 + 0.00887581168831203*G0_0_1_5_4 - 0.10355113636364*G0_0_1_5_5 - 0.0428997564935079*G0_0_1_5_6 + 0.0236688311688319*G0_0_1_5_8 - 0.0473376623376638*G0_0_1_5_9 + 0.00164366883116883*G0_0_1_6_0 - 0.00862926136363669*G0_0_1_6_1 - 0.00961546266233806*G0_0_1_6_2 + 0.0258877840909099*G0_0_1_6_3 - 0.034763595779222*G0_0_1_6_4 - 0.0428997564935079*G0_0_1_6_5 - 0.137575081168836*G0_0_1_6_6 - 0.023668831168832*G0_0_1_6_7 - 0.113906250000004*G0_0_1_6_9 - 0.0189021915584422*G0_0_1_7_0 - 0.016272321428572*G0_0_1_7_1 + 0.00788961038961067*G0_0_1_7_2 - 0.00887581168831206*G0_0_1_7_3 - 0.00739650974026001*G0_0_1_7_4 - 0.023668831168832*G0_0_1_7_6 + 0.10355113636364*G0_0_1_7_7 + 0.0428997564935079*G0_0_1_7_8 + 0.0473376623376641*G0_0_1_7_9 - 0.00164366883116885*G0_0_1_8_0 + 0.00961546266233801*G0_0_1_8_1 + 0.00862926136363665*G0_0_1_8_2 + 0.034763595779222*G0_0_1_8_3 - 0.02588778409091*G0_0_1_8_4 + 0.0236688311688319*G0_0_1_8_5 + 0.0428997564935079*G0_0_1_8_7 + 0.137575081168836*G0_0_1_8_8 + 0.113906250000004*G0_0_1_8_9 - 0.020710227272728*G0_0_1_9_1 + 0.020710227272728*G0_0_1_9_2 + 0.0798823051948079*G0_0_1_9_3 - 0.0798823051948079*G0_0_1_9_4 - 0.0473376623376638*G0_0_1_9_5 - 0.113906250000004*G0_0_1_9_6 + 0.0473376623376641*G0_0_1_9_7 + 0.113906250000004*G0_0_1_9_8 + 0.00239245129870138*G0_1_0_0_1 - 0.00239245129870139*G0_1_0_0_2 + 0.00295860389610404*G0_1_0_0_3 - 0.00295860389610403*G0_1_0_0_4 + 0.0189021915584422*G0_1_0_0_5 + 0.00164366883116883*G0_1_0_0_6 - 0.0189021915584422*G0_1_0_0_7 - 0.00164366883116885*G0_1_0_0_8 + 0.00239245129870138*G0_1_0_1_0 + 0.0399594155844169*G0_1_0_1_1 + 0.0361607142857155*G0_1_0_1_3 - 0.0195596590909097*G0_1_0_1_4 - 0.00788961038961064*G0_1_0_1_5 - 0.00862926136363668*G0_1_0_1_6 - 0.016272321428572*G0_1_0_1_7 + 0.00961546266233801*G0_1_0_1_8 - 0.020710227272728*G0_1_0_1_9 - 0.00239245129870139*G0_1_0_2_0 - 0.039959415584417*G0_1_0_2_2 + 0.0195596590909097*G0_1_0_2_3 - 0.0361607142857155*G0_1_0_2_4 + 0.016272321428572*G0_1_0_2_5 - 0.00961546266233806*G0_1_0_2_6 + 0.00788961038961067*G0_1_0_2_7 + 0.00862926136363665*G0_1_0_2_8 + 0.020710227272728*G0_1_0_2_9 + 0.00295860389610404*G0_1_0_3_0 + 0.0361607142857155*G0_1_0_3_1 + 0.0195596590909098*G0_1_0_3_2 + 0.100592532467536*G0_1_0_3_3 + 0.00739650974025993*G0_1_0_3_5 + 0.0258877840909099*G0_1_0_3_6 - 0.00887581168831205*G0_1_0_3_7 + 0.034763595779222*G0_1_0_3_8 + 0.0798823051948079*G0_1_0_3_9 - 0.00295860389610403*G0_1_0_4_0 - 0.0195596590909097*G0_1_0_4_1 - 0.0361607142857155*G0_1_0_4_2 - 0.100592532467536*G0_1_0_4_4 + 0.00887581168831203*G0_1_0_4_5 - 0.034763595779222*G0_1_0_4_6 - 0.00739650974026001*G0_1_0_4_7 - 0.02588778409091*G0_1_0_4_8 - 0.0798823051948079*G0_1_0_4_9 + 0.0189021915584422*G0_1_0_5_0 - 0.00788961038961064*G0_1_0_5_1 + 0.016272321428572*G0_1_0_5_2 + 0.00739650974025993*G0_1_0_5_3 + 0.00887581168831203*G0_1_0_5_4 - 0.10355113636364*G0_1_0_5_5 - 0.0428997564935079*G0_1_0_5_6 + 0.0236688311688319*G0_1_0_5_8 - 0.0473376623376638*G0_1_0_5_9 + 0.00164366883116883*G0_1_0_6_0 - 0.00862926136363668*G0_1_0_6_1 - 0.00961546266233806*G0_1_0_6_2 + 0.0258877840909099*G0_1_0_6_3 - 0.034763595779222*G0_1_0_6_4 - 0.0428997564935079*G0_1_0_6_5 - 0.137575081168836*G0_1_0_6_6 - 0.023668831168832*G0_1_0_6_7 - 0.113906250000004*G0_1_0_6_9 - 0.0189021915584422*G0_1_0_7_0 - 0.016272321428572*G0_1_0_7_1 + 0.00788961038961067*G0_1_0_7_2 - 0.00887581168831206*G0_1_0_7_3 - 0.00739650974026001*G0_1_0_7_4 - 0.023668831168832*G0_1_0_7_6 + 0.10355113636364*G0_1_0_7_7 + 0.0428997564935079*G0_1_0_7_8 + 0.0473376623376641*G0_1_0_7_9 - 0.00164366883116885*G0_1_0_8_0 + 0.00961546266233801*G0_1_0_8_1 + 0.00862926136363665*G0_1_0_8_2 + 0.034763595779222*G0_1_0_8_3 - 0.02588778409091*G0_1_0_8_4 + 0.0236688311688319*G0_1_0_8_5 + 0.0428997564935079*G0_1_0_8_7 + 0.137575081168836*G0_1_0_8_8 + 0.113906250000004*G0_1_0_8_9 - 0.020710227272728*G0_1_0_9_1 + 0.020710227272728*G0_1_0_9_2 + 0.0798823051948079*G0_1_0_9_3 - 0.0798823051948079*G0_1_0_9_4 - 0.0473376623376638*G0_1_0_9_5 - 0.113906250000004*G0_1_0_9_6 + 0.0473376623376641*G0_1_0_9_7 + 0.113906250000004*G0_1_0_9_8 - 0.161627435064941*G0_1_1_0_0 - 0.00664772727272751*G0_1_1_0_1 - 0.0114326298701303*G0_1_1_0_2 + 0.00624594155844184*G0_1_1_0_3 + 0.000328733766233751*G0_1_1_0_4 - 0.072321428571431*G0_1_1_0_5 + 0.0410917207792221*G0_1_1_0_6 - 0.110125811688315*G0_1_1_0_7 + 0.0378043831168845*G0_1_1_0_8 - 0.0246550324675334*G0_1_1_0_9 - 0.00664772727272751*G0_1_1_1_0 + 0.0416761363636377*G0_1_1_1_1 - 0.000127840909090926*G0_1_1_1_2 + 0.0361607142857155*G0_1_1_1_3 - 0.0200527597402604*G0_1_1_1_4 - 0.00608157467532487*G0_1_1_1_5 - 0.00657467532467558*G0_1_1_1_6 - 0.0230113636363644*G0_1_1_1_7 + 0.0105194805194809*G0_1_1_1_8 - 0.0138068181818186*G0_1_1_1_9 - 0.0114326298701303*G0_1_1_2_0 - 0.000127840909090926*G0_1_1_2_1 - 0.0382426948051961*G0_1_1_2_2 + 0.0190665584415591*G0_1_1_2_3 - 0.0361607142857155*G0_1_1_2_4 + 0.00953327922077957*G0_1_1_2_5 - 0.00871144480519516*G0_1_1_2_6 + 0.00969764610389646*G0_1_1_2_7 + 0.0106838474025978*G0_1_1_2_8 + 0.0276136363636373*G0_1_1_2_9 + 0.00624594155844184*G0_1_1_3_0 + 0.0361607142857155*G0_1_1_3_1 + 0.0190665584415591*G0_1_1_3_2 + 0.112426948051952*G0_1_1_3_3 - 0.00147930194805193*G0_1_1_3_4 - 0.00295860389610405*G0_1_1_3_5 + 0.0251481331168839*G0_1_1_3_6 - 0.0133137175324681*G0_1_1_3_7 + 0.039941152597404*G0_1_1_3_8 + 0.0680478896103919*G0_1_1_3_9 + 0.000328733766233751*G0_1_1_4_0 - 0.0200527597402604*G0_1_1_4_1 - 0.0361607142857155*G0_1_1_4_2 - 0.00147930194805193*G0_1_1_4_3 - 0.0887581168831201*G0_1_1_4_4 + 0.00443790584415604*G0_1_1_4_5 - 0.02958603896104*G0_1_1_4_6 - 0.017751623376624*G0_1_1_4_7 - 0.026627435064936*G0_1_1_4_8 - 0.091716720779224*G0_1_1_4_9 - 0.072321428571431*G0_1_1_5_0 - 0.00608157467532487*G0_1_1_5_1 + 0.00953327922077957*G0_1_1_5_2 - 0.00295860389610404*G0_1_1_5_3 + 0.00443790584415604*G0_1_1_5_4 - 0.10355113636364*G0_1_1_5_5 - 0.00591720779220799*G0_1_1_5_6 + 0.0236688311688319*G0_1_1_5_8 + 0.0266274350649361*G0_1_1_5_9 + 0.0410917207792221*G0_1_1_6_0 - 0.00657467532467558*G0_1_1_6_1 - 0.00871144480519516*G0_1_1_6_2 + 0.025148133116884*G0_1_1_6_3 - 0.02958603896104*G0_1_1_6_4 - 0.00591720779220799*G0_1_1_6_5 - 0.139054383116888*G0_1_1_6_6 - 0.0236688311688321*G0_1_1_6_7 - 0.00887581168831197*G0_1_1_6_8 - 0.13313717532468*G0_1_1_6_9 - 0.110125811688315*G0_1_1_7_0 - 0.0230113636363644*G0_1_1_7_1 + 0.00969764610389647*G0_1_1_7_2 - 0.0133137175324681*G0_1_1_7_3 - 0.017751623376624*G0_1_1_7_4 - 0.0236688311688321*G0_1_1_7_6 + 0.10355113636364*G0_1_1_7_7 + 0.0798823051948079*G0_1_1_7_8 + 0.121302759740264*G0_1_1_7_9 + 0.0378043831168844*G0_1_1_8_0 + 0.0105194805194809*G0_1_1_8_1 + 0.0106838474025978*G0_1_1_8_2 + 0.039941152597404*G0_1_1_8_3 - 0.026627435064936*G0_1_1_8_4 + 0.0236688311688319*G0_1_1_8_5 - 0.00887581168831197*G0_1_1_8_6 + 0.0798823051948078*G0_1_1_8_7 + 0.136095779220784*G0_1_1_8_8 + 0.0946753246753279*G0_1_1_8_9 - 0.0246550324675334*G0_1_1_9_0 - 0.0138068181818186*G0_1_1_9_1 + 0.0276136363636373*G0_1_1_9_2 + 0.0680478896103919*G0_1_1_9_3 - 0.091716720779224*G0_1_1_9_4 + 0.0266274350649361*G0_1_1_9_5 - 0.13313717532468*G0_1_1_9_6 + 0.121302759740264*G0_1_1_9_7 + 0.0946753246753279*G0_1_1_9_8 + 0.142012987012992*G0_1_1_9_9; + A[3] = A[30] - 0.000566152597402628*G0_0_1_0_1 - 0.000447443181818206*G0_0_1_0_2 + 0.00101359577922082*G0_0_1_0_4 - 0.00223721590909103*G0_0_1_0_5 + 0.000693993506493553*G0_0_1_0_6 + 0.00223721590909093*G0_0_1_0_7 - 0.0008583603896104*G0_0_1_0_8 + 0.000164366883116878*G0_0_1_0_9 - 0.000566152597402628*G0_0_1_1_0 - 0.0164671266233772*G0_0_1_1_1 - 0.00109882305194809*G0_0_1_1_2 - 0.011131290584416*G0_0_1_1_3 + 0.00366172889610402*G0_0_1_1_4 + 0.000219155844155847*G0_0_1_1_5 + 0.00027394480519482*G0_0_1_1_6 + 0.00373478084415598*G0_0_1_1_7 - 0.00599025974025998*G0_0_1_1_8 - 0.00109577922077927*G0_0_1_1_9 - 0.000447443181818206*G0_0_1_2_0 - 0.00109882305194809*G0_0_1_2_1 - 0.0069764610389613*G0_0_1_2_2 - 0.000949675324675355*G0_0_1_2_3 - 0.00292207792207803*G0_0_1_2_4 + 0.000675730519480543*G0_0_1_2_5 - 0.00225547889610399*G0_0_1_2_6 + 0.000794439935064958*G0_0_1_2_7 - 0.000164366883116888*G0_0_1_2_8 - 0.000383522727272746*G0_0_1_2_9 - 0.011131290584416*G0_0_1_3_1 - 0.000949675324675355*G0_0_1_3_2 + 0.0120809659090913*G0_0_1_3_4 - 0.000657467532467553*G0_0_1_3_5 - 0.000164366883116883*G0_0_1_3_6 + 0.000657467532467573*G0_0_1_3_7 - 0.00180803571428581*G0_0_1_3_8 + 0.00197240259740265*G0_0_1_3_9 + 0.00101359577922082*G0_0_1_4_0 + 0.00366172889610402*G0_0_1_4_1 - 0.00292207792207804*G0_0_1_4_2 + 0.0120809659090913*G0_0_1_4_3 + 0.0241619318181827*G0_0_1_4_4 - 0.00238331980519488*G0_0_1_4_5 + 0.00254768668831178*G0_0_1_4_6 - 0.00304078733766245*G0_0_1_4_7 + 0.00115056818181823*G0_0_1_4_8 + 0.00591720779220802*G0_0_1_4_9 - 0.00223721590909103*G0_0_1_5_0 + 0.000219155844155847*G0_0_1_5_1 + 0.000675730519480544*G0_0_1_5_2 - 0.000657467532467553*G0_0_1_5_3 - 0.00238331980519488*G0_0_1_5_4 - 0.0144642857142863*G0_0_1_5_5 + 0.00254768668831181*G0_0_1_5_6 + 0.00172585227272728*G0_0_1_5_7 - 0.000493100649350691*G0_0_1_5_9 + 0.000693993506493553*G0_0_1_6_0 + 0.00027394480519482*G0_0_1_6_1 - 0.00225547889610399*G0_0_1_6_2 - 0.000164366883116883*G0_0_1_6_3 + 0.00254768668831178*G0_0_1_6_4 + 0.00254768668831181*G0_0_1_6_5 + 0.0121631493506498*G0_0_1_6_6 - 0.0017258522727273*G0_0_1_6_7 - 0.000493100649350678*G0_0_1_6_8 + 0.00147930194805202*G0_0_1_6_9 + 0.00223721590909093*G0_0_1_7_0 + 0.00373478084415598*G0_0_1_7_1 + 0.000794439935064958*G0_0_1_7_2 + 0.000657467532467573*G0_0_1_7_3 - 0.00304078733766245*G0_0_1_7_4 + 0.00172585227272728*G0_0_1_7_5 - 0.00172585227272731*G0_0_1_7_6 + 0.0110125811688314*G0_0_1_7_7 - 0.00328733766233771*G0_0_1_7_8 + 0.00295860389610398*G0_0_1_7_9 - 0.0008583603896104*G0_0_1_8_0 - 0.00599025974025998*G0_0_1_8_1 - 0.000164366883116888*G0_0_1_8_2 - 0.00180803571428581*G0_0_1_8_3 + 0.00115056818181823*G0_0_1_8_4 - 0.000493100649350678*G0_0_1_8_6 - 0.00328733766233771*G0_0_1_8_7 + 0.0134780844155848*G0_0_1_8_8 + 0.000986201298701334*G0_0_1_8_9 + 0.000164366883116878*G0_0_1_9_0 - 0.00109577922077927*G0_0_1_9_1 - 0.000383522727272746*G0_0_1_9_2 + 0.00197240259740265*G0_0_1_9_3 + 0.00591720779220802*G0_0_1_9_4 - 0.000493100649350691*G0_0_1_9_5 + 0.00147930194805202*G0_0_1_9_6 + 0.00295860389610398*G0_0_1_9_7 + 0.000986201298701333*G0_0_1_9_8 - 0.0295860389610399*G0_0_1_9_9 + 0.000566152597402628*G0_1_0_0_1 + 0.000447443181818206*G0_1_0_0_2 - 0.00101359577922082*G0_1_0_0_4 + 0.00223721590909103*G0_1_0_0_5 - 0.000693993506493554*G0_1_0_0_6 - 0.00223721590909093*G0_1_0_0_7 + 0.0008583603896104*G0_1_0_0_8 - 0.000164366883116878*G0_1_0_0_9 + 0.000566152597402628*G0_1_0_1_0 + 0.0164671266233772*G0_1_0_1_1 + 0.00109882305194809*G0_1_0_1_2 + 0.011131290584416*G0_1_0_1_3 - 0.00366172889610402*G0_1_0_1_4 - 0.000219155844155847*G0_1_0_1_5 - 0.00027394480519482*G0_1_0_1_6 - 0.00373478084415598*G0_1_0_1_7 + 0.00599025974025998*G0_1_0_1_8 + 0.00109577922077927*G0_1_0_1_9 + 0.000447443181818206*G0_1_0_2_0 + 0.00109882305194809*G0_1_0_2_1 + 0.0069764610389613*G0_1_0_2_2 + 0.000949675324675355*G0_1_0_2_3 + 0.00292207792207803*G0_1_0_2_4 - 0.000675730519480543*G0_1_0_2_5 + 0.00225547889610399*G0_1_0_2_6 - 0.000794439935064957*G0_1_0_2_7 + 0.000164366883116889*G0_1_0_2_8 + 0.000383522727272747*G0_1_0_2_9 + 0.011131290584416*G0_1_0_3_1 + 0.000949675324675355*G0_1_0_3_2 - 0.0120809659090913*G0_1_0_3_4 + 0.000657467532467552*G0_1_0_3_5 + 0.000164366883116883*G0_1_0_3_6 - 0.000657467532467574*G0_1_0_3_7 + 0.00180803571428581*G0_1_0_3_8 - 0.00197240259740265*G0_1_0_3_9 - 0.00101359577922082*G0_1_0_4_0 - 0.00366172889610402*G0_1_0_4_1 + 0.00292207792207803*G0_1_0_4_2 - 0.0120809659090913*G0_1_0_4_3 - 0.0241619318181827*G0_1_0_4_4 + 0.00238331980519488*G0_1_0_4_5 - 0.00254768668831178*G0_1_0_4_6 + 0.00304078733766245*G0_1_0_4_7 - 0.00115056818181823*G0_1_0_4_8 - 0.00591720779220802*G0_1_0_4_9 + 0.00223721590909103*G0_1_0_5_0 - 0.000219155844155847*G0_1_0_5_1 - 0.000675730519480543*G0_1_0_5_2 + 0.000657467532467552*G0_1_0_5_3 + 0.00238331980519488*G0_1_0_5_4 + 0.0144642857142863*G0_1_0_5_5 - 0.00254768668831181*G0_1_0_5_6 - 0.00172585227272728*G0_1_0_5_7 + 0.00049310064935069*G0_1_0_5_9 - 0.000693993506493554*G0_1_0_6_0 - 0.00027394480519482*G0_1_0_6_1 + 0.00225547889610399*G0_1_0_6_2 + 0.000164366883116883*G0_1_0_6_3 - 0.00254768668831178*G0_1_0_6_4 - 0.00254768668831181*G0_1_0_6_5 - 0.0121631493506498*G0_1_0_6_6 + 0.00172585227272731*G0_1_0_6_7 + 0.000493100649350677*G0_1_0_6_8 - 0.00147930194805202*G0_1_0_6_9 - 0.00223721590909093*G0_1_0_7_0 - 0.00373478084415598*G0_1_0_7_1 - 0.000794439935064957*G0_1_0_7_2 - 0.000657467532467574*G0_1_0_7_3 + 0.00304078733766245*G0_1_0_7_4 - 0.00172585227272728*G0_1_0_7_5 + 0.0017258522727273*G0_1_0_7_6 - 0.0110125811688314*G0_1_0_7_7 + 0.00328733766233771*G0_1_0_7_8 - 0.00295860389610398*G0_1_0_7_9 + 0.0008583603896104*G0_1_0_8_0 + 0.00599025974025998*G0_1_0_8_1 + 0.000164366883116888*G0_1_0_8_2 + 0.00180803571428581*G0_1_0_8_3 - 0.00115056818181823*G0_1_0_8_4 + 0.000493100649350677*G0_1_0_8_6 + 0.00328733766233771*G0_1_0_8_7 - 0.0134780844155848*G0_1_0_8_8 - 0.000986201298701334*G0_1_0_8_9 - 0.000164366883116878*G0_1_0_9_0 + 0.00109577922077927*G0_1_0_9_1 + 0.000383522727272747*G0_1_0_9_2 - 0.00197240259740265*G0_1_0_9_3 - 0.00591720779220802*G0_1_0_9_4 + 0.000493100649350691*G0_1_0_9_5 - 0.00147930194805202*G0_1_0_9_6 - 0.00295860389610398*G0_1_0_9_7 - 0.000986201298701331*G0_1_0_9_8 + 0.0295860389610399*G0_1_0_9_9; + A[8] = -A[3] + 0.0525974025974044*G0_0_0_0_0 + 0.00307426948051959*G0_0_0_0_1 + 0.00393567370129884*G0_0_0_0_2 - 0.000858360389610423*G0_0_0_0_3 - 0.00170758928571435*G0_0_0_0_4 + 0.0389458198051961*G0_0_0_0_5 - 0.0165827922077928*G0_0_0_0_6 + 0.0196783685064942*G0_0_0_0_7 - 0.0100994318181822*G0_0_0_0_8 + 0.0047666396103898*G0_0_0_0_9 + 0.00307426948051959*G0_0_0_1_0 + 0.0154017857142862*G0_0_0_1_1 + 0.00106534090909095*G0_0_0_1_2 + 0.00904017857142887*G0_0_0_1_3 - 0.00249289772727281*G0_0_0_1_4 + 0.00346996753246765*G0_0_0_1_5 - 0.00146103896103901*G0_0_0_1_6 - 0.00167106331168838*G0_0_0_1_7 + 0.00246550324675336*G0_0_0_1_8 - 0.000767045454545472*G0_0_0_1_9 + 0.00393567370129884*G0_0_0_2_0 + 0.00106534090909095*G0_0_0_2_1 + 0.00787134740259769*G0_0_0_2_2 + 0.00124188311688315*G0_0_0_2_3 + 0.00241984577922088*G0_0_0_2_4 + 0.0054423701298703*G0_0_0_2_5 - 0.000173498376623357*G0_0_0_2_6 + 0.000757913961038985*G0_0_0_2_7 + 0.00111404220779224*G0_0_0_2_8 + 0.00378043831168844*G0_0_0_2_9 - 0.000858360389610423*G0_0_0_3_0 + 0.00904017857142887*G0_0_0_3_1 + 0.00124188311688315*G0_0_0_3_2 - 0.00361607142857158*G0_0_0_3_3 - 0.0134780844155849*G0_0_0_3_4 - 0.00197240259740266*G0_0_0_3_5 + 0.000493100649350658*G0_0_0_3_6 - 0.00131493506493511*G0_0_0_3_7 + 0.00854707792207822*G0_0_0_3_8 + 0.00493100649350666*G0_0_0_3_9 - 0.00170758928571435*G0_0_0_4_0 - 0.00249289772727281*G0_0_0_4_1 + 0.00241984577922088*G0_0_0_4_2 - 0.0134780844155849*G0_0_0_4_3 - 0.0238331980519489*G0_0_0_4_4 + 0.00123275162337665*G0_0_0_4_5 - 0.00172585227272732*G0_0_0_4_6 + 0.00336952110389622*G0_0_0_4_7 - 0.0072321428571431*G0_0_0_4_8 - 0.0138068181818187*G0_0_0_4_9 + 0.0389458198051961*G0_0_0_5_0 + 0.00346996753246765*G0_0_0_5_1 + 0.00544237012987031*G0_0_0_5_2 - 0.00197240259740266*G0_0_0_5_3 + 0.00123275162337665*G0_0_0_5_4 + 0.105687905844159*G0_0_0_5_5 - 0.0316406250000011*G0_0_0_5_6 + 0.0204636769480526*G0_0_0_5_7 - 0.0142999188311693*G0_0_0_5_8 + 0.0142999188311694*G0_0_0_5_9 - 0.0165827922077928*G0_0_0_6_0 - 0.00146103896103901*G0_0_0_6_1 - 0.000173498376623357*G0_0_0_6_2 + 0.000493100649350658*G0_0_0_6_3 - 0.00172585227272732*G0_0_0_6_4 - 0.0316406250000011*G0_0_0_6_5 - 0.00821834415584443*G0_0_0_6_6 - 0.00616375811688332*G0_0_0_6_7 + 0.00246550324675334*G0_0_0_6_8 - 0.0123275162337667*G0_0_0_6_9 + 0.0196783685064942*G0_0_0_7_0 - 0.00167106331168838*G0_0_0_7_1 + 0.000757913961038985*G0_0_0_7_2 - 0.00131493506493511*G0_0_0_7_3 + 0.00336952110389622*G0_0_0_7_4 + 0.0204636769480526*G0_0_0_7_5 - 0.00616375811688332*G0_0_0_7_6 - 0.0134780844155849*G0_0_0_7_7 - 0.00460227272727289*G0_0_0_7_8 - 0.00197240259740267*G0_0_0_7_9 - 0.0100994318181822*G0_0_0_8_0 + 0.00246550324675335*G0_0_0_8_1 + 0.00111404220779224*G0_0_0_8_2 + 0.00854707792207822*G0_0_0_8_3 - 0.0072321428571431*G0_0_0_8_4 - 0.0142999188311693*G0_0_0_8_5 + 0.00246550324675334*G0_0_0_8_6 - 0.00460227272727289*G0_0_0_8_7 + 0.0259699675324685*G0_0_0_8_8 + 0.0167654220779226*G0_0_0_8_9 + 0.0047666396103898*G0_0_0_9_0 - 0.000767045454545472*G0_0_0_9_1 + 0.00378043831168844*G0_0_0_9_2 + 0.00493100649350666*G0_0_0_9_3 - 0.0138068181818187*G0_0_0_9_4 + 0.0142999188311694*G0_0_0_9_5 - 0.0123275162337667*G0_0_0_9_6 - 0.00197240259740267*G0_0_0_9_7 + 0.0167654220779226*G0_0_0_9_8 + 0.0867857142857172*G0_0_0_9_9 + 0.0525974025974044*G0_1_0_0_0 + 0.00307426948051959*G0_1_0_0_1 + 0.00393567370129884*G0_1_0_0_2 - 0.000858360389610424*G0_1_0_0_3 - 0.00170758928571435*G0_1_0_0_4 + 0.0389458198051961*G0_1_0_0_5 - 0.0165827922077928*G0_1_0_0_6 + 0.0196783685064942*G0_1_0_0_7 - 0.0100994318181822*G0_1_0_0_8 + 0.0047666396103898*G0_1_0_0_9 + 0.00307426948051959*G0_1_0_1_0 + 0.0154017857142862*G0_1_0_1_1 + 0.00106534090909095*G0_1_0_1_2 + 0.00904017857142886*G0_1_0_1_3 - 0.0024928977272728*G0_1_0_1_4 + 0.00346996753246765*G0_1_0_1_5 - 0.00146103896103901*G0_1_0_1_6 - 0.00167106331168838*G0_1_0_1_7 + 0.00246550324675335*G0_1_0_1_8 - 0.000767045454545472*G0_1_0_1_9 + 0.00393567370129884*G0_1_0_2_0 + 0.00106534090909095*G0_1_0_2_1 + 0.00787134740259769*G0_1_0_2_2 + 0.00124188311688315*G0_1_0_2_3 + 0.00241984577922088*G0_1_0_2_4 + 0.0054423701298703*G0_1_0_2_5 - 0.000173498376623355*G0_1_0_2_6 + 0.000757913961038983*G0_1_0_2_7 + 0.00111404220779224*G0_1_0_2_8 + 0.00378043831168844*G0_1_0_2_9 - 0.000858360389610424*G0_1_0_3_0 + 0.00904017857142886*G0_1_0_3_1 + 0.00124188311688315*G0_1_0_3_2 - 0.00361607142857159*G0_1_0_3_3 - 0.0134780844155849*G0_1_0_3_4 - 0.00197240259740266*G0_1_0_3_5 + 0.00049310064935066*G0_1_0_3_6 - 0.00131493506493511*G0_1_0_3_7 + 0.00854707792207822*G0_1_0_3_8 + 0.00493100649350666*G0_1_0_3_9 - 0.00170758928571435*G0_1_0_4_0 - 0.0024928977272728*G0_1_0_4_1 + 0.00241984577922088*G0_1_0_4_2 - 0.0134780844155849*G0_1_0_4_3 - 0.0238331980519489*G0_1_0_4_4 + 0.00123275162337665*G0_1_0_4_5 - 0.00172585227272733*G0_1_0_4_6 + 0.00336952110389622*G0_1_0_4_7 - 0.0072321428571431*G0_1_0_4_8 - 0.0138068181818187*G0_1_0_4_9 + 0.0389458198051961*G0_1_0_5_0 + 0.00346996753246765*G0_1_0_5_1 + 0.00544237012987031*G0_1_0_5_2 - 0.00197240259740266*G0_1_0_5_3 + 0.00123275162337665*G0_1_0_5_4 + 0.105687905844159*G0_1_0_5_5 - 0.0316406250000011*G0_1_0_5_6 + 0.0204636769480526*G0_1_0_5_7 - 0.0142999188311693*G0_1_0_5_8 + 0.0142999188311693*G0_1_0_5_9 - 0.0165827922077928*G0_1_0_6_0 - 0.00146103896103901*G0_1_0_6_1 - 0.000173498376623355*G0_1_0_6_2 + 0.00049310064935066*G0_1_0_6_3 - 0.00172585227272733*G0_1_0_6_4 - 0.0316406250000011*G0_1_0_6_5 - 0.00821834415584445*G0_1_0_6_6 - 0.00616375811688332*G0_1_0_6_7 + 0.00246550324675334*G0_1_0_6_8 - 0.0123275162337667*G0_1_0_6_9 + 0.0196783685064942*G0_1_0_7_0 - 0.00167106331168838*G0_1_0_7_1 + 0.000757913961038984*G0_1_0_7_2 - 0.00131493506493511*G0_1_0_7_3 + 0.00336952110389622*G0_1_0_7_4 + 0.0204636769480526*G0_1_0_7_5 - 0.00616375811688332*G0_1_0_7_6 - 0.013478084415585*G0_1_0_7_7 - 0.00460227272727289*G0_1_0_7_8 - 0.00197240259740268*G0_1_0_7_9 - 0.0100994318181822*G0_1_0_8_0 + 0.00246550324675335*G0_1_0_8_1 + 0.00111404220779224*G0_1_0_8_2 + 0.00854707792207822*G0_1_0_8_3 - 0.0072321428571431*G0_1_0_8_4 - 0.0142999188311693*G0_1_0_8_5 + 0.00246550324675334*G0_1_0_8_6 - 0.00460227272727289*G0_1_0_8_7 + 0.0259699675324684*G0_1_0_8_8 + 0.0167654220779226*G0_1_0_8_9 + 0.0047666396103898*G0_1_0_9_0 - 0.000767045454545471*G0_1_0_9_1 + 0.00378043831168844*G0_1_0_9_2 + 0.00493100649350666*G0_1_0_9_3 - 0.0138068181818187*G0_1_0_9_4 + 0.0142999188311694*G0_1_0_9_5 - 0.0123275162337667*G0_1_0_9_6 - 0.00197240259740268*G0_1_0_9_7 + 0.0167654220779226*G0_1_0_9_8 + 0.0867857142857172*G0_1_0_9_9; + A[12] = 0.0017038690476191*G0_0_1_0_0 + 0.000851934523809557*G0_0_1_0_1 + 0.000851934523809558*G0_0_1_0_2 - 9.13149350649613e-06*G0_0_1_0_3 - 9.13149350649181e-06*G0_0_1_0_4 + 2.43506493506454e-05*G0_0_1_0_5 + 0.00112317370129875*G0_0_1_0_6 + 2.43506493506471e-05*G0_0_1_0_7 + 0.00112317370129874*G0_0_1_0_8 + 0.000267857142857152*G0_0_1_0_9 + 0.000851934523809557*G0_0_1_1_0 + 0.011194534632035*G0_0_1_1_1 + 0.000970643939393975*G0_0_1_1_2 + 0.00375913149350661*G0_0_1_1_3 - 0.00193587662337668*G0_0_1_1_4 - 0.000447443181818199*G0_0_1_1_5 + 0.000566152597402622*G0_0_1_1_6 - 0.00348823051948065*G0_0_1_1_7 + 0.00823356331168861*G0_0_1_1_8 + 0.000980113636363673*G0_0_1_1_9 + 0.000851934523809558*G0_0_1_2_0 + 0.000970643939393974*G0_0_1_2_1 + 0.011194534632035*G0_0_1_2_2 - 0.0019358766233767*G0_0_1_2_3 + 0.00375913149350664*G0_0_1_2_4 - 0.00348823051948065*G0_0_1_2_5 + 0.00823356331168863*G0_0_1_2_6 - 0.000447443181818197*G0_0_1_2_7 + 0.000566152597402616*G0_0_1_2_8 + 0.000980113636363672*G0_0_1_2_9 - 9.13149350649615e-06*G0_0_1_3_0 + 0.00375913149350661*G0_0_1_3_1 - 0.0019358766233767*G0_0_1_3_2 - 0.00321428571428585*G0_0_1_3_3 - 0.000748782467532496*G0_0_1_3_4 + 0.00124188311688316*G0_0_1_3_5 - 0.0028125000000001*G0_0_1_3_6 - 0.00108664772727276*G0_0_1_3_7 + 0.00389914772727285*G0_0_1_3_8 - 0.000767045454545493*G0_0_1_3_9 - 9.13149350649179e-06*G0_0_1_4_0 - 0.00193587662337668*G0_0_1_4_1 + 0.00375913149350664*G0_0_1_4_2 - 0.000748782467532496*G0_0_1_4_3 - 0.00321428571428582*G0_0_1_4_4 - 0.00108664772727277*G0_0_1_4_5 + 0.00389914772727288*G0_0_1_4_6 + 0.00124188311688316*G0_0_1_4_7 - 0.00281250000000009*G0_0_1_4_8 - 0.000767045454545478*G0_0_1_4_9 + 2.43506493506454e-05*G0_0_1_5_0 - 0.000447443181818199*G0_0_1_5_1 - 0.00348823051948065*G0_0_1_5_2 + 0.00124188311688316*G0_0_1_5_3 - 0.00108664772727277*G0_0_1_5_4 - 0.0018993506493507*G0_0_1_5_5 - 0.00658380681818206*G0_0_1_5_6 - 0.000456574675324691*G0_0_1_5_7 + 0.000228287337662345*G0_0_1_5_8 - 0.00126014610389615*G0_0_1_5_9 + 0.00112317370129875*G0_0_1_6_0 + 0.000566152597402622*G0_0_1_6_1 + 0.00823356331168863*G0_0_1_6_2 - 0.0028125000000001*G0_0_1_6_3 + 0.00389914772727288*G0_0_1_6_4 - 0.00658380681818206*G0_0_1_6_5 + 0.022262581168832*G0_0_1_6_6 + 0.000228287337662345*G0_0_1_6_7 - 0.00114143668831172*G0_0_1_6_8 + 0.00268465909090919*G0_0_1_6_9 + 2.43506493506473e-05*G0_0_1_7_0 - 0.00348823051948065*G0_0_1_7_1 - 0.000447443181818197*G0_0_1_7_2 - 0.00108664772727276*G0_0_1_7_3 + 0.00124188311688316*G0_0_1_7_4 - 0.000456574675324691*G0_0_1_7_5 + 0.000228287337662345*G0_0_1_7_6 - 0.00189935064935072*G0_0_1_7_7 - 0.00658380681818205*G0_0_1_7_8 - 0.00126014610389614*G0_0_1_7_9 + 0.00112317370129874*G0_0_1_8_0 + 0.00823356331168861*G0_0_1_8_1 + 0.000566152597402616*G0_0_1_8_2 + 0.00389914772727285*G0_0_1_8_3 - 0.00281250000000009*G0_0_1_8_4 + 0.000228287337662345*G0_0_1_8_5 - 0.00114143668831172*G0_0_1_8_6 - 0.00658380681818205*G0_0_1_8_7 + 0.0222625811688319*G0_0_1_8_8 + 0.00268465909090917*G0_0_1_8_9 + 0.000267857142857152*G0_0_1_9_0 + 0.000980113636363673*G0_0_1_9_1 + 0.000980113636363672*G0_0_1_9_2 - 0.000767045454545493*G0_0_1_9_3 - 0.000767045454545478*G0_0_1_9_4 - 0.00126014610389615*G0_0_1_9_5 + 0.00268465909090919*G0_0_1_9_6 - 0.00126014610389614*G0_0_1_9_7 + 0.00268465909090917*G0_0_1_9_8 + 0.0105194805194809*G0_0_1_9_9; + A[2] = -A[12] - 0.00949066558441591*G0_0_1_0_0 - 0.000118709415584418*G0_0_1_0_2 + 0.000438311688311705*G0_0_1_0_3 - 0.000575284090909114*G0_0_1_0_4 - 0.00373478084415597*G0_0_1_0_5 + 0.00305905032467543*G0_0_1_0_6 - 0.00820921266233794*G0_0_1_0_7 + 0.00461140422077938*G0_0_1_0_8 - 0.000712256493506522*G0_0_1_0_9 + 0.0094906655844159*G0_0_1_1_1 + 0.000118709415584419*G0_0_1_1_2 + 0.00373478084415597*G0_0_1_1_3 - 0.00305905032467543*G0_0_1_1_4 - 0.000438311688311703*G0_0_1_1_5 + 0.000575284090909113*G0_0_1_1_6 - 0.00461140422077938*G0_0_1_1_7 + 0.00820921266233796*G0_0_1_1_8 + 0.00071225649350652*G0_0_1_1_9 - 0.000118709415584418*G0_0_1_2_0 + 0.000118709415584419*G0_0_1_2_1 + 0.00155235389610395*G0_0_1_2_3 - 0.00447443181818197*G0_0_1_2_4 - 0.00155235389610395*G0_0_1_2_5 + 0.00447443181818198*G0_0_1_2_6 - 0.00101359577922081*G0_0_1_2_7 + 0.00101359577922081*G0_0_1_2_8 + 0.000438311688311705*G0_0_1_3_0 + 0.00373478084415597*G0_0_1_3_1 + 0.00155235389610395*G0_0_1_3_2 - 0.00131493506493514*G0_0_1_3_3 + 0.00583502435064956*G0_0_1_3_4 - 0.00172585227272733*G0_0_1_3_6 - 0.0013149350649351*G0_0_1_3_7 + 0.00435572240259754*G0_0_1_3_8 + 0.000493100649350655*G0_0_1_3_9 - 0.000575284090909114*G0_0_1_4_0 - 0.00305905032467543*G0_0_1_4_1 - 0.00447443181818197*G0_0_1_4_2 + 0.00583502435064956*G0_0_1_4_3 - 0.0254768668831178*G0_0_1_4_4 + 0.00172585227272733*G0_0_1_4_5 + 0.00238331980519489*G0_0_1_4_7 - 0.00304078733766243*G0_0_1_4_8 - 0.00345170454545467*G0_0_1_4_9 - 0.00373478084415597*G0_0_1_5_0 - 0.000438311688311703*G0_0_1_5_1 - 0.00155235389610395*G0_0_1_5_2 + 0.00172585227272733*G0_0_1_5_4 + 0.00131493506493512*G0_0_1_5_5 - 0.00583502435064956*G0_0_1_5_6 - 0.00435572240259754*G0_0_1_5_7 + 0.00131493506493511*G0_0_1_5_8 - 0.000493100649350661*G0_0_1_5_9 + 0.00305905032467543*G0_0_1_6_0 + 0.000575284090909113*G0_0_1_6_1 + 0.00447443181818198*G0_0_1_6_2 - 0.00172585227272733*G0_0_1_6_3 - 0.00583502435064956*G0_0_1_6_5 + 0.0254768668831178*G0_0_1_6_6 + 0.00304078733766244*G0_0_1_6_7 - 0.00238331980519488*G0_0_1_6_8 + 0.00345170454545466*G0_0_1_6_9 - 0.00820921266233794*G0_0_1_7_0 - 0.00461140422077939*G0_0_1_7_1 - 0.00101359577922081*G0_0_1_7_2 - 0.0013149350649351*G0_0_1_7_3 + 0.00238331980519489*G0_0_1_7_4 - 0.00435572240259754*G0_0_1_7_5 + 0.00304078733766244*G0_0_1_7_6 - 0.0241619318181826*G0_0_1_7_7 - 0.00394480519480533*G0_0_1_7_9 + 0.00461140422077938*G0_0_1_8_0 + 0.00820921266233796*G0_0_1_8_1 + 0.00101359577922081*G0_0_1_8_2 + 0.00435572240259754*G0_0_1_8_3 - 0.00304078733766243*G0_0_1_8_4 + 0.00131493506493511*G0_0_1_8_5 - 0.00238331980519488*G0_0_1_8_6 + 0.0241619318181826*G0_0_1_8_8 + 0.00394480519480532*G0_0_1_8_9 - 0.000712256493506522*G0_0_1_9_0 + 0.00071225649350652*G0_0_1_9_1 + 0.000493100649350656*G0_0_1_9_3 - 0.00345170454545467*G0_0_1_9_4 - 0.000493100649350661*G0_0_1_9_5 + 0.00345170454545466*G0_0_1_9_6 - 0.00394480519480533*G0_0_1_9_7 + 0.00394480519480532*G0_0_1_9_8 - 0.011194534632035*G0_1_1_0_0 - 0.000851934523809554*G0_1_1_0_1 - 0.000970643939393977*G0_1_1_0_2 + 0.000447443181818201*G0_1_1_0_3 - 0.000566152597402623*G0_1_1_0_4 - 0.00375913149350661*G0_1_1_0_5 + 0.00193587662337668*G0_1_1_0_6 - 0.00823356331168859*G0_1_1_0_7 + 0.00348823051948064*G0_1_1_0_8 - 0.000980113636363675*G0_1_1_0_9 - 0.000851934523809554*G0_1_1_1_0 - 0.0017038690476191*G0_1_1_1_1 - 0.000851934523809557*G0_1_1_1_2 - 0.00112317370129875*G0_1_1_1_4 - 0.00112317370129874*G0_1_1_1_7 - 0.000267857142857154*G0_1_1_1_9 - 0.000970643939393977*G0_1_1_2_0 - 0.000851934523809557*G0_1_1_2_1 - 0.011194534632035*G0_1_1_2_2 + 0.00348823051948065*G0_1_1_2_3 - 0.00823356331168862*G0_1_1_2_4 + 0.0019358766233767*G0_1_1_2_5 - 0.00375913149350665*G0_1_1_2_6 - 0.000566152597402615*G0_1_1_2_7 + 0.000447443181818196*G0_1_1_2_8 - 0.000980113636363674*G0_1_1_2_9 + 0.000447443181818201*G0_1_1_3_0 + 0.00348823051948065*G0_1_1_3_2 + 0.0018993506493507*G0_1_1_3_3 + 0.00658380681818206*G0_1_1_3_4 - 0.00124188311688316*G0_1_1_3_5 + 0.00108664772727278*G0_1_1_3_6 - 0.000228287337662342*G0_1_1_3_7 + 0.000456574675324685*G0_1_1_3_8 + 0.00126014610389615*G0_1_1_3_9 - 0.000566152597402623*G0_1_1_4_0 - 0.00112317370129875*G0_1_1_4_1 - 0.00823356331168862*G0_1_1_4_2 + 0.00658380681818206*G0_1_1_4_3 - 0.022262581168832*G0_1_1_4_4 + 0.00281250000000011*G0_1_1_4_5 - 0.00389914772727289*G0_1_1_4_6 + 0.00114143668831173*G0_1_1_4_7 - 0.000228287337662342*G0_1_1_4_8 - 0.00268465909090919*G0_1_1_4_9 - 0.00375913149350661*G0_1_1_5_0 + 0.0019358766233767*G0_1_1_5_2 - 0.00124188311688316*G0_1_1_5_3 + 0.00281250000000011*G0_1_1_5_4 + 0.00321428571428582*G0_1_1_5_5 + 0.000748782467532506*G0_1_1_5_6 - 0.00389914772727285*G0_1_1_5_7 + 0.00108664772727276*G0_1_1_5_8 + 0.000767045454545484*G0_1_1_5_9 + 0.00193587662337668*G0_1_1_6_0 - 0.00375913149350665*G0_1_1_6_2 + 0.00108664772727278*G0_1_1_6_3 - 0.00389914772727289*G0_1_1_6_4 + 0.000748782467532506*G0_1_1_6_5 + 0.00321428571428579*G0_1_1_6_6 + 0.00281250000000009*G0_1_1_6_7 - 0.00124188311688315*G0_1_1_6_8 + 0.000767045454545472*G0_1_1_6_9 - 0.00823356331168859*G0_1_1_7_0 - 0.00112317370129874*G0_1_1_7_1 - 0.000566152597402615*G0_1_1_7_2 - 0.000228287337662342*G0_1_1_7_3 + 0.00114143668831173*G0_1_1_7_4 - 0.00389914772727285*G0_1_1_7_5 + 0.00281250000000009*G0_1_1_7_6 - 0.0222625811688319*G0_1_1_7_7 + 0.00658380681818205*G0_1_1_7_8 - 0.00268465909090919*G0_1_1_7_9 + 0.00348823051948064*G0_1_1_8_0 + 0.000447443181818196*G0_1_1_8_2 + 0.000456574675324685*G0_1_1_8_3 - 0.000228287337662342*G0_1_1_8_4 + 0.00108664772727276*G0_1_1_8_5 - 0.00124188311688315*G0_1_1_8_6 + 0.00658380681818205*G0_1_1_8_7 + 0.0018993506493507*G0_1_1_8_8 + 0.00126014610389615*G0_1_1_8_9 - 0.000980113636363675*G0_1_1_9_0 - 0.000267857142857154*G0_1_1_9_1 - 0.000980113636363674*G0_1_1_9_2 + 0.00126014610389615*G0_1_1_9_3 - 0.00268465909090919*G0_1_1_9_4 + 0.000767045454545484*G0_1_1_9_5 + 0.000767045454545472*G0_1_1_9_6 - 0.00268465909090919*G0_1_1_9_7 + 0.00126014610389614*G0_1_1_9_8 - 0.0105194805194809*G0_1_1_9_9; + A[33] = -A[83] + 0.00633725649350675*G0_0_0_0_0 - 0.00229200487012995*G0_0_0_0_1 + 0.00288555194805206*G0_0_0_0_2 + 0.011834415584416*G0_0_0_0_3 + 0.011834415584416*G0_0_0_0_4 - 0.00657467532467553*G0_0_0_0_5 + 0.00673904220779248*G0_0_0_0_6 - 0.00714995941558464*G0_0_0_0_7 + 0.00394480519480532*G0_0_0_0_8 + 0.023668831168832*G0_0_0_0_9 - 0.00229200487012995*G0_0_0_1_0 - 0.01479301948052*G0_0_0_1_1 + 0.000100446428571445*G0_0_0_1_2 - 0.0378043831168844*G0_0_0_1_3 + 0.00780742694805221*G0_0_0_1_4 + 0.00468445616883132*G0_0_0_1_5 + 0.00764306006493535*G0_0_0_1_6 + 0.0094510957792211*G0_0_0_1_7 - 0.0189021915584422*G0_0_0_1_8 - 0.0221895292207799*G0_0_0_1_9 + 0.00288555194805206*G0_0_0_2_0 + 0.000100446428571445*G0_0_0_2_1 + 0.0462966720779237*G0_0_0_2_2 - 0.0123275162337667*G0_0_0_2_3 + 0.00246550324675337*G0_0_0_2_4 - 0.0128206168831173*G0_0_0_2_5 + 0.02958603896104*G0_0_0_2_6 + 0.00320515422077933*G0_0_0_2_7 + 0.00394480519480531*G0_0_0_2_8 + 0.002958603896104*G0_0_0_2_9 + 0.011834415584416*G0_0_0_3_0 - 0.0378043831168844*G0_0_0_3_1 - 0.0123275162337667*G0_0_0_3_2 + 0.15532670454546*G0_0_0_3_3 + 0.0288463879870141*G0_0_0_3_4 - 0.0236688311688319*G0_0_0_3_5 - 0.0251481331168839*G0_0_0_3_6 - 0.0377221996753259*G0_0_0_3_7 + 0.0517755681818199*G0_0_0_3_8 + 0.142012987012992*G0_0_0_3_9 + 0.011834415584416*G0_0_0_4_0 + 0.00780742694805221*G0_0_0_4_1 + 0.00246550324675337*G0_0_0_4_2 + 0.0288463879870141*G0_0_0_4_3 + 0.173078327922084*G0_0_0_4_4 - 0.037722199675326*G0_0_0_4_5 + 0.0628703327922099*G0_0_0_4_6 - 0.021449878246754*G0_0_0_4_7 - 0.0140533685064939*G0_0_0_4_8 + 0.0665685876623398*G0_0_0_4_9 - 0.00657467532467553*G0_0_0_5_0 + 0.00468445616883132*G0_0_0_5_1 - 0.0128206168831173*G0_0_0_5_2 - 0.0236688311688319*G0_0_0_5_3 - 0.037722199675326*G0_0_0_5_4 + 0.10355113636364*G0_0_0_5_5 - 0.0369825487013*G0_0_0_5_6 + 0.028106737012988*G0_0_0_5_7 - 0.016272321428572*G0_0_0_5_8 - 0.0384618506493519*G0_0_0_5_9 + 0.00673904220779248*G0_0_0_6_0 + 0.00764306006493535*G0_0_0_6_1 + 0.02958603896104*G0_0_0_6_2 - 0.0251481331168839*G0_0_0_6_3 + 0.0628703327922099*G0_0_0_6_4 - 0.0369825487013*G0_0_0_6_5 + 0.204143668831176*G0_0_0_6_6 - 0.011834415584416*G0_0_0_6_7 - 0.0162723214285719*G0_0_0_6_8 + 0.0414204545454559*G0_0_0_6_9 - 0.00714995941558464*G0_0_0_7_0 + 0.0094510957792211*G0_0_0_7_1 + 0.00320515422077933*G0_0_0_7_2 - 0.0377221996753259*G0_0_0_7_3 - 0.021449878246754*G0_0_0_7_4 + 0.028106737012988*G0_0_0_7_5 - 0.011834415584416*G0_0_0_7_6 + 0.0355032467532479*G0_0_0_7_7 - 0.0140533685064939*G0_0_0_7_8 - 0.0473376623376638*G0_0_0_7_9 + 0.00394480519480532*G0_0_0_8_0 - 0.0189021915584422*G0_0_0_8_1 + 0.00394480519480531*G0_0_0_8_2 + 0.0517755681818199*G0_0_0_8_3 - 0.0140533685064939*G0_0_0_8_4 - 0.016272321428572*G0_0_0_8_5 - 0.0162723214285719*G0_0_0_8_6 - 0.0140533685064939*G0_0_0_8_7 + 0.0517755681818199*G0_0_0_8_8 + 0.0946753246753278*G0_0_0_8_9 + 0.023668831168832*G0_0_0_9_0 - 0.0221895292207799*G0_0_0_9_1 + 0.002958603896104*G0_0_0_9_2 + 0.142012987012992*G0_0_0_9_3 + 0.0665685876623398*G0_0_0_9_4 - 0.0384618506493519*G0_0_0_9_5 + 0.0414204545454559*G0_0_0_9_6 - 0.0473376623376638*G0_0_0_9_7 + 0.0946753246753278*G0_0_0_9_8 + 0.550300324675343*G0_0_0_9_9 + 0.0017167207792208*G0_0_1_0_0 - 0.00904017857142893*G0_0_1_0_1 - 0.000127840909090921*G0_0_1_0_2 + 0.00180803571428576*G0_0_1_0_3 + 0.00205458603896112*G0_0_1_0_4 - 0.000493100649350662*G0_0_1_0_6 + 0.000904017857142895*G0_0_1_0_7 - 0.00673904220779248*G0_0_1_0_8 + 0.00690340909090933*G0_0_1_0_9 - 0.00904017857142893*G0_0_1_1_0 - 0.161627435064941*G0_0_1_1_1 - 0.00904017857142887*G0_0_1_1_2 - 0.0912236201298731*G0_0_1_1_3 + 0.0394480519480532*G0_0_1_1_4 + 0.00328733766233777*G0_0_1_1_5 + 0.00328733766233777*G0_0_1_1_6 + 0.0394480519480534*G0_0_1_1_7 - 0.0912236201298735*G0_0_1_1_8 - 0.0246550324675334*G0_0_1_1_9 - 0.000127840909090921*G0_0_1_2_0 - 0.00904017857142887*G0_0_1_2_1 + 0.0017167207792208*G0_0_1_2_2 - 0.00673904220779243*G0_0_1_2_3 + 0.000904017857142871*G0_0_1_2_4 - 0.00049310064935065*G0_0_1_2_5 + 0.00205458603896112*G0_0_1_2_7 + 0.00180803571428576*G0_0_1_2_8 + 0.00690340909090931*G0_0_1_2_9 + 0.00180803571428576*G0_0_1_3_0 - 0.0912236201298731*G0_0_1_3_1 - 0.00673904220779243*G0_0_1_3_2 + 0.0369825487012999*G0_0_1_3_4 - 0.010355113636364*G0_0_1_3_5 - 0.00443790584415596*G0_0_1_3_6 + 0.0739650974025998*G0_0_1_3_9 + 0.00205458603896112*G0_0_1_4_0 + 0.0394480519480532*G0_0_1_4_1 + 0.000904017857142871*G0_0_1_4_2 + 0.0369825487012999*G0_0_1_4_3 - 0.00147930194805201*G0_0_1_4_4 - 0.000739650974026*G0_0_1_4_5 + 0.00517755681818198*G0_0_1_4_6 - 0.00887581168831204*G0_0_1_4_7 - 0.0192309253246759*G0_0_1_4_9 + 0.00328733766233777*G0_0_1_5_1 - 0.00049310064935065*G0_0_1_5_2 - 0.010355113636364*G0_0_1_5_3 - 0.000739650974026001*G0_0_1_5_4 + 0.011834415584416*G0_0_1_5_5 - 0.00147930194805197*G0_0_1_5_6 + 0.005177556818182*G0_0_1_5_7 - 0.00443790584415599*G0_0_1_5_8 - 0.011834415584416*G0_0_1_5_9 - 0.000493100649350662*G0_0_1_6_0 + 0.00328733766233777*G0_0_1_6_1 - 0.00443790584415597*G0_0_1_6_3 + 0.00517755681818198*G0_0_1_6_4 - 0.00147930194805197*G0_0_1_6_5 + 0.0118344155844159*G0_0_1_6_6 - 0.000739650974026012*G0_0_1_6_7 - 0.010355113636364*G0_0_1_6_8 - 0.011834415584416*G0_0_1_6_9 + 0.000904017857142895*G0_0_1_7_0 + 0.0394480519480534*G0_0_1_7_1 + 0.00205458603896112*G0_0_1_7_2 - 0.00887581168831204*G0_0_1_7_4 + 0.005177556818182*G0_0_1_7_5 - 0.000739650974026012*G0_0_1_7_6 - 0.001479301948052*G0_0_1_7_7 + 0.0369825487013002*G0_0_1_7_8 - 0.0192309253246759*G0_0_1_7_9 - 0.00673904220779248*G0_0_1_8_0 - 0.0912236201298735*G0_0_1_8_1 + 0.00180803571428576*G0_0_1_8_2 - 0.00443790584415599*G0_0_1_8_5 - 0.010355113636364*G0_0_1_8_6 + 0.0369825487013002*G0_0_1_8_7 + 0.0739650974025999*G0_0_1_8_9 + 0.00690340909090933*G0_0_1_9_0 - 0.0246550324675334*G0_0_1_9_1 + 0.00690340909090931*G0_0_1_9_2 + 0.0739650974025998*G0_0_1_9_3 - 0.0192309253246759*G0_0_1_9_4 - 0.011834415584416*G0_0_1_9_5 - 0.011834415584416*G0_0_1_9_6 - 0.0192309253246759*G0_0_1_9_7 + 0.0739650974025998*G0_0_1_9_8 + 0.142012987012992*G0_0_1_9_9; + A[29] = A[92] - 0.00196022727272735*G0_0_1_0_0 - 0.00098011363636367*G0_0_1_0_2 - 0.00213676948051956*G0_0_1_0_3 + 0.00213676948051956*G0_0_1_0_4 - 0.00109577922077925*G0_0_1_0_5 - 0.00405438311688327*G0_0_1_0_6 - 0.00158887987012993*G0_0_1_0_7 + 0.000876623376623407*G0_0_1_0_8 - 0.00525974025974044*G0_0_1_0_9 + 0.00196022727272733*G0_0_1_1_1 + 0.000980113636363668*G0_0_1_1_2 + 0.00109577922077925*G0_0_1_1_3 + 0.00405438311688326*G0_0_1_1_4 + 0.00213676948051955*G0_0_1_1_5 - 0.00213676948051956*G0_0_1_1_6 - 0.000876623376623402*G0_0_1_1_7 + 0.00158887987012992*G0_0_1_1_8 + 0.00525974025974044*G0_0_1_1_9 - 0.00098011363636367*G0_0_1_2_0 + 0.000980113636363668*G0_0_1_2_1 - 0.00493100649350666*G0_0_1_2_3 + 0.01479301948052*G0_0_1_2_4 + 0.00493100649350666*G0_0_1_2_5 - 0.01479301948052*G0_0_1_2_6 - 0.00016436688311689*G0_0_1_2_7 + 0.000164366883116885*G0_0_1_2_8 - 0.00213676948051956*G0_0_1_3_0 + 0.00109577922077925*G0_0_1_3_1 - 0.00493100649350666*G0_0_1_3_2 - 0.035503246753248*G0_0_1_3_3 - 0.0212033279220786*G0_0_1_3_4 + 0.00641030844155865*G0_0_1_3_6 + 0.00641030844155866*G0_0_1_3_7 - 0.005917207792208*G0_0_1_3_8 - 0.0285998376623386*G0_0_1_3_9 + 0.00213676948051956*G0_0_1_4_0 + 0.00405438311688326*G0_0_1_4_1 + 0.01479301948052*G0_0_1_4_2 - 0.0212033279220786*G0_0_1_4_3 + 0.0936891233766266*G0_0_1_4_4 - 0.00641030844155866*G0_0_1_4_5 - 0.002958603896104*G0_0_1_4_7 - 0.000493100649350658*G0_0_1_4_8 + 0.0128206168831173*G0_0_1_4_9 - 0.00109577922077925*G0_0_1_5_0 + 0.00213676948051955*G0_0_1_5_1 + 0.00493100649350666*G0_0_1_5_2 - 0.00641030844155866*G0_0_1_5_4 + 0.0355032467532479*G0_0_1_5_5 + 0.0212033279220786*G0_0_1_5_6 + 0.00591720779220799*G0_0_1_5_7 - 0.00641030844155866*G0_0_1_5_8 + 0.0285998376623386*G0_0_1_5_9 - 0.00405438311688327*G0_0_1_6_0 - 0.00213676948051956*G0_0_1_6_1 - 0.01479301948052*G0_0_1_6_2 + 0.00641030844155865*G0_0_1_6_3 + 0.0212033279220786*G0_0_1_6_5 - 0.0936891233766265*G0_0_1_6_6 + 0.00049310064935066*G0_0_1_6_7 + 0.00295860389610399*G0_0_1_6_8 - 0.0128206168831173*G0_0_1_6_9 - 0.00158887987012993*G0_0_1_7_0 - 0.000876623376623402*G0_0_1_7_1 - 0.00016436688311689*G0_0_1_7_2 + 0.00641030844155866*G0_0_1_7_3 - 0.002958603896104*G0_0_1_7_4 + 0.00591720779220799*G0_0_1_7_5 + 0.00049310064935066*G0_0_1_7_6 - 0.00394480519480534*G0_0_1_7_7 + 0.01479301948052*G0_0_1_7_9 + 0.000876623376623407*G0_0_1_8_0 + 0.00158887987012992*G0_0_1_8_1 + 0.000164366883116885*G0_0_1_8_2 - 0.005917207792208*G0_0_1_8_3 - 0.000493100649350658*G0_0_1_8_4 - 0.00641030844155866*G0_0_1_8_5 + 0.00295860389610399*G0_0_1_8_6 + 0.0039448051948053*G0_0_1_8_8 - 0.01479301948052*G0_0_1_8_9 - 0.00525974025974044*G0_0_1_9_0 + 0.00525974025974044*G0_0_1_9_1 - 0.0285998376623386*G0_0_1_9_3 + 0.0128206168831173*G0_0_1_9_4 + 0.0285998376623386*G0_0_1_9_5 - 0.0128206168831173*G0_0_1_9_6 + 0.01479301948052*G0_0_1_9_7 - 0.01479301948052*G0_0_1_9_8 + 0.00196022727272735*G0_1_0_0_0 + 0.00098011363636367*G0_1_0_0_2 + 0.00213676948051956*G0_1_0_0_3 - 0.00213676948051956*G0_1_0_0_4 + 0.00109577922077925*G0_1_0_0_5 + 0.00405438311688327*G0_1_0_0_6 + 0.00158887987012993*G0_1_0_0_7 - 0.000876623376623407*G0_1_0_0_8 + 0.00525974025974044*G0_1_0_0_9 - 0.00196022727272733*G0_1_0_1_1 - 0.000980113636363669*G0_1_0_1_2 - 0.00109577922077925*G0_1_0_1_3 - 0.00405438311688326*G0_1_0_1_4 - 0.00213676948051955*G0_1_0_1_5 + 0.00213676948051956*G0_1_0_1_6 + 0.000876623376623403*G0_1_0_1_7 - 0.00158887987012992*G0_1_0_1_8 - 0.00525974025974044*G0_1_0_1_9 + 0.00098011363636367*G0_1_0_2_0 - 0.000980113636363669*G0_1_0_2_1 + 0.00493100649350666*G0_1_0_2_3 - 0.01479301948052*G0_1_0_2_4 - 0.00493100649350666*G0_1_0_2_5 + 0.01479301948052*G0_1_0_2_6 + 0.00016436688311689*G0_1_0_2_7 - 0.000164366883116886*G0_1_0_2_8 + 0.00213676948051956*G0_1_0_3_0 - 0.00109577922077925*G0_1_0_3_1 + 0.00493100649350666*G0_1_0_3_2 + 0.035503246753248*G0_1_0_3_3 + 0.0212033279220786*G0_1_0_3_4 - 0.00641030844155865*G0_1_0_3_6 - 0.00641030844155866*G0_1_0_3_7 + 0.005917207792208*G0_1_0_3_8 + 0.0285998376623386*G0_1_0_3_9 - 0.00213676948051956*G0_1_0_4_0 - 0.00405438311688326*G0_1_0_4_1 - 0.01479301948052*G0_1_0_4_2 + 0.0212033279220786*G0_1_0_4_3 - 0.0936891233766266*G0_1_0_4_4 + 0.00641030844155866*G0_1_0_4_5 + 0.002958603896104*G0_1_0_4_7 + 0.000493100649350658*G0_1_0_4_8 - 0.0128206168831173*G0_1_0_4_9 + 0.00109577922077925*G0_1_0_5_0 - 0.00213676948051955*G0_1_0_5_1 - 0.00493100649350666*G0_1_0_5_2 + 0.00641030844155866*G0_1_0_5_4 - 0.0355032467532479*G0_1_0_5_5 - 0.0212033279220786*G0_1_0_5_6 - 0.00591720779220799*G0_1_0_5_7 + 0.00641030844155866*G0_1_0_5_8 - 0.0285998376623386*G0_1_0_5_9 + 0.00405438311688327*G0_1_0_6_0 + 0.00213676948051956*G0_1_0_6_1 + 0.01479301948052*G0_1_0_6_2 - 0.00641030844155865*G0_1_0_6_3 - 0.0212033279220786*G0_1_0_6_5 + 0.0936891233766265*G0_1_0_6_6 - 0.00049310064935066*G0_1_0_6_7 - 0.00295860389610399*G0_1_0_6_8 + 0.0128206168831173*G0_1_0_6_9 + 0.00158887987012993*G0_1_0_7_0 + 0.000876623376623402*G0_1_0_7_1 + 0.00016436688311689*G0_1_0_7_2 - 0.00641030844155866*G0_1_0_7_3 + 0.002958603896104*G0_1_0_7_4 - 0.00591720779220799*G0_1_0_7_5 - 0.00049310064935066*G0_1_0_7_6 + 0.00394480519480534*G0_1_0_7_7 - 0.01479301948052*G0_1_0_7_9 - 0.000876623376623407*G0_1_0_8_0 - 0.00158887987012992*G0_1_0_8_1 - 0.000164366883116886*G0_1_0_8_2 + 0.005917207792208*G0_1_0_8_3 + 0.000493100649350658*G0_1_0_8_4 + 0.00641030844155866*G0_1_0_8_5 - 0.00295860389610399*G0_1_0_8_6 - 0.0039448051948053*G0_1_0_8_8 + 0.01479301948052*G0_1_0_8_9 + 0.00525974025974044*G0_1_0_9_0 - 0.00525974025974043*G0_1_0_9_1 + 0.0285998376623386*G0_1_0_9_3 - 0.0128206168831173*G0_1_0_9_4 - 0.0285998376623386*G0_1_0_9_5 + 0.0128206168831173*G0_1_0_9_6 - 0.01479301948052*G0_1_0_9_7 + 0.01479301948052*G0_1_0_9_8; + A[69] = -A[29] + 0.00120535714285719*G0_0_0_0_0 - 0.00246550324675333*G0_0_0_0_2 - 0.000986201298701322*G0_0_0_0_3 + 0.010355113636364*G0_0_0_0_4 + 0.00641030844155866*G0_0_0_0_5 - 0.00641030844155872*G0_0_0_0_6 + 0.00049310064935067*G0_0_0_0_7 - 0.001479301948052*G0_0_0_0_8 + 0.00493100649350666*G0_0_0_0_9 - 0.00120535714285719*G0_0_0_1_1 + 0.00246550324675333*G0_0_0_1_2 - 0.00641030844155867*G0_0_0_1_3 + 0.00641030844155867*G0_0_0_1_4 + 0.000986201298701337*G0_0_0_1_5 - 0.010355113636364*G0_0_0_1_6 + 0.001479301948052*G0_0_0_1_7 - 0.000493100649350674*G0_0_0_1_8 - 0.00493100649350667*G0_0_0_1_9 - 0.00246550324675333*G0_0_0_2_0 + 0.00246550324675333*G0_0_0_2_1 - 0.01479301948052*G0_0_0_2_3 + 0.0246550324675333*G0_0_0_2_4 + 0.01479301948052*G0_0_0_2_5 - 0.0246550324675333*G0_0_0_2_6 + 0.00246550324675333*G0_0_0_2_7 - 0.00246550324675333*G0_0_0_2_8 - 0.000986201298701322*G0_0_0_3_0 - 0.00641030844155867*G0_0_0_3_1 - 0.01479301948052*G0_0_0_3_2 + 0.00591720779220815*G0_0_0_3_3 - 0.0162723214285719*G0_0_0_3_4 + 0.0310653409090919*G0_0_0_3_6 + 0.00295860389610399*G0_0_0_3_7 - 0.010355113636364*G0_0_0_3_8 + 0.00887581168831202*G0_0_0_3_9 + 0.010355113636364*G0_0_0_4_0 + 0.00641030844155867*G0_0_0_4_1 + 0.0246550324675333*G0_0_0_4_2 - 0.0162723214285719*G0_0_0_4_3 + 0.28106737012988*G0_0_0_4_4 - 0.031065340909092*G0_0_0_4_5 - 0.019230925324676*G0_0_0_4_7 + 0.00739650974025999*G0_0_0_4_8 + 0.0621306818181839*G0_0_0_4_9 + 0.00641030844155866*G0_0_0_5_0 + 0.000986201298701337*G0_0_0_5_1 + 0.01479301948052*G0_0_0_5_2 - 0.031065340909092*G0_0_0_5_4 - 0.00591720779220803*G0_0_0_5_5 + 0.016272321428572*G0_0_0_5_6 + 0.010355113636364*G0_0_0_5_7 - 0.002958603896104*G0_0_0_5_8 - 0.00887581168831195*G0_0_0_5_9 - 0.00641030844155871*G0_0_0_6_0 - 0.010355113636364*G0_0_0_6_1 - 0.0246550324675333*G0_0_0_6_2 + 0.0310653409090919*G0_0_0_6_3 + 0.016272321428572*G0_0_0_6_5 - 0.28106737012988*G0_0_0_6_6 - 0.00739650974026003*G0_0_0_6_7 + 0.019230925324676*G0_0_0_6_8 - 0.0621306818181839*G0_0_0_6_9 + 0.00049310064935067*G0_0_0_7_0 + 0.001479301948052*G0_0_0_7_1 + 0.00246550324675333*G0_0_0_7_2 + 0.00295860389610399*G0_0_0_7_3 - 0.019230925324676*G0_0_0_7_4 + 0.010355113636364*G0_0_0_7_5 - 0.00739650974026003*G0_0_0_7_6 + 0.00887581168831202*G0_0_0_7_7 - 0.001479301948052*G0_0_0_8_0 - 0.000493100649350675*G0_0_0_8_1 - 0.00246550324675333*G0_0_0_8_2 - 0.010355113636364*G0_0_0_8_3 + 0.00739650974025999*G0_0_0_8_4 - 0.002958603896104*G0_0_0_8_5 + 0.019230925324676*G0_0_0_8_6 - 0.008875811688312*G0_0_0_8_8 + 0.00493100649350666*G0_0_0_9_0 - 0.00493100649350667*G0_0_0_9_1 + 0.00887581168831203*G0_0_0_9_3 + 0.0621306818181839*G0_0_0_9_4 - 0.00887581168831196*G0_0_0_9_5 - 0.0621306818181839*G0_0_0_9_6 + 0.0028490259740261*G0_0_1_0_0 + 0.00131493506493512*G0_0_1_0_1 + 0.00241071428571439*G0_0_1_0_2 - 0.00493100649350668*G0_0_1_0_3 + 0.0207102272727281*G0_0_1_0_4 - 0.00591720779220802*G0_0_1_0_5 + 0.0113413149350654*G0_0_1_0_6 - 0.00197240259740266*G0_0_1_0_7 - 0.00147930194805201*G0_0_1_0_8 + 0.011834415584416*G0_0_1_0_9 + 0.00131493506493512*G0_0_1_1_0 + 0.00164366883116891*G0_0_1_1_1 + 0.00487621753246772*G0_0_1_1_2 - 0.0123275162337667*G0_0_1_1_3 + 0.017751623376624*G0_0_1_1_4 - 0.00394480519480535*G0_0_1_1_5 + 0.010355113636364*G0_0_1_1_6 - 0.00246550324675332*G0_0_1_1_8 + 0.00690340909090935*G0_0_1_1_9 + 0.00241071428571439*G0_0_1_2_0 + 0.00487621753246772*G0_0_1_2_1 + 0.0361607142857157*G0_0_1_2_2 - 0.0246550324675334*G0_0_1_2_3 + 0.0468445616883134*G0_0_1_2_4 - 0.00986201298701338*G0_0_1_2_5 + 0.0221895292207801*G0_0_1_2_6 + 0.00197240259740267*G0_0_1_2_7 - 0.000493100649350665*G0_0_1_2_8 + 0.00493100649350669*G0_0_1_2_9 - 0.00493100649350668*G0_0_1_3_0 - 0.0123275162337667*G0_0_1_3_1 - 0.0246550324675334*G0_0_1_3_2 + 0.0399411525974041*G0_0_1_3_3 - 0.0665685876623399*G0_0_1_3_4 + 0.019230925324676*G0_0_1_3_5 - 0.042899756493508*G0_0_1_3_6 + 0.00295860389610397*G0_0_1_3_7 + 0.00739650974026002*G0_0_1_3_8 - 0.0266274350649359*G0_0_1_3_9 + 0.0207102272727281*G0_0_1_4_0 + 0.017751623376624*G0_0_1_4_1 + 0.0468445616883134*G0_0_1_4_2 - 0.0665685876623399*G0_0_1_4_3 + 0.386097808441572*G0_0_1_4_4 - 0.0739650974026*G0_0_1_4_5 + 0.116864853896108*G0_0_1_4_6 - 0.028106737012988*G0_0_1_4_7 - 0.010355113636364*G0_0_1_4_8 + 0.13313717532468*G0_0_1_4_9 - 0.00591720779220802*G0_0_1_5_0 - 0.00394480519480535*G0_0_1_5_1 - 0.00986201298701338*G0_0_1_5_2 + 0.019230925324676*G0_0_1_5_3 - 0.0739650974026*G0_0_1_5_4 + 0.034023944805196*G0_0_1_5_5 - 0.0502962662337681*G0_0_1_5_6 + 0.017751623376624*G0_0_1_5_7 - 0.035503246753248*G0_0_1_5_9 + 0.0113413149350654*G0_0_1_6_0 + 0.010355113636364*G0_0_1_6_1 + 0.0221895292207801*G0_0_1_6_2 - 0.042899756493508*G0_0_1_6_3 + 0.116864853896108*G0_0_1_6_4 - 0.0502962662337681*G0_0_1_6_5 + 0.105030438311692*G0_0_1_6_6 - 0.017751623376624*G0_0_1_6_7 - 0.00887581168831201*G0_0_1_6_8 + 0.071006493506496*G0_0_1_6_9 - 0.00197240259740266*G0_0_1_7_0 + 0.00197240259740267*G0_0_1_7_2 + 0.00295860389610398*G0_0_1_7_3 - 0.028106737012988*G0_0_1_7_4 + 0.017751623376624*G0_0_1_7_5 - 0.017751623376624*G0_0_1_7_6 + 0.0281067370129882*G0_0_1_7_7 - 0.00295860389610403*G0_0_1_7_8 - 0.00147930194805201*G0_0_1_8_0 - 0.00246550324675332*G0_0_1_8_1 - 0.000493100649350665*G0_0_1_8_2 + 0.00739650974026002*G0_0_1_8_3 - 0.010355113636364*G0_0_1_8_4 - 0.00887581168831201*G0_0_1_8_6 - 0.00295860389610403*G0_0_1_8_7 + 0.0192309253246762*G0_0_1_8_8 + 0.011834415584416*G0_0_1_9_0 + 0.00690340909090935*G0_0_1_9_1 + 0.00493100649350669*G0_0_1_9_2 - 0.0266274350649359*G0_0_1_9_3 + 0.13313717532468*G0_0_1_9_4 - 0.035503246753248*G0_0_1_9_5 + 0.071006493506496*G0_0_1_9_6 + 0.159764610389616*G0_0_1_9_9 - 0.00505275974025995*G0_1_0_0_0 - 0.00169845779220785*G0_1_0_0_1 + 0.000432224025974035*G0_1_0_0_2 + 0.00164366883116887*G0_1_0_0_3 + 0.0047666396103898*G0_1_0_0_4 - 0.0171489448051954*G0_1_0_0_5 - 0.00235592532467536*G0_1_0_0_6 - 0.00778003246753275*G0_1_0_0_7 + 0.00454748376623392*G0_1_0_0_8 - 0.0115056818181822*G0_1_0_0_9 - 0.00169845779220785*G0_1_0_1_0 - 0.000645292207792213*G0_1_0_1_1 + 0.000170454545454553*G0_1_0_1_2 - 0.0104646915584419*G0_1_0_1_3 + 0.00580762987013007*G0_1_0_1_4 + 0.0106838474025978*G0_1_0_1_5 + 0.0105194805194809*G0_1_0_1_6 + 0.00284902597402607*G0_1_0_1_7 - 0.00553368506493525*G0_1_0_1_8 + 0.0164366883116889*G0_1_0_1_9 + 0.000432224025974035*G0_1_0_2_0 + 0.000170454545454553*G0_1_0_2_1 + 0.00657467532467554*G0_1_0_2_2 - 0.005917207792208*G0_1_0_2_3 + 0.00986201298701332*G0_1_0_2_4 - 0.00591720779220796*G0_1_0_2_5 - 0.00986201298701333*G0_1_0_2_6 - 0.000328733766233779*G0_1_0_2_7 + 0.00082183441558444*G0_1_0_2_8 - 0.00788961038961064*G0_1_0_2_9 + 0.00164366883116888*G0_1_0_3_0 - 0.0104646915584419*G0_1_0_3_1 - 0.005917207792208*G0_1_0_3_2 + 0.0340239448051959*G0_1_0_3_3 - 0.00690340909090928*G0_1_0_3_4 - 0.0192309253246759*G0_1_0_3_5 - 0.0300791396103906*G0_1_0_3_6 - 0.00345170454545465*G0_1_0_3_7 + 0.00443790584415597*G0_1_0_3_8 - 0.0424066558441573*G0_1_0_3_9 + 0.0047666396103898*G0_1_0_4_0 + 0.00580762987013007*G0_1_0_4_1 + 0.00986201298701332*G0_1_0_4_2 - 0.00690340909090927*G0_1_0_4_3 + 0.144478490259745*G0_1_0_4_4 - 0.0128206168831174*G0_1_0_4_5 + 0.0428997564935079*G0_1_0_4_6 - 0.00739650974025999*G0_1_0_4_7 - 0.000986201298701323*G0_1_0_4_8 + 0.0493100649350665*G0_1_0_4_9 - 0.0171489448051954*G0_1_0_5_0 + 0.0106838474025978*G0_1_0_5_1 - 0.00591720779220796*G0_1_0_5_2 - 0.0192309253246759*G0_1_0_5_3 - 0.0128206168831174*G0_1_0_5_4 + 0.211540178571436*G0_1_0_5_5 + 0.0350101461038973*G0_1_0_5_6 + 0.0281067370129879*G0_1_0_5_7 - 0.0305722402597413*G0_1_0_5_8 + 0.0956615259740292*G0_1_0_5_9 - 0.00235592532467536*G0_1_0_6_0 + 0.0105194805194809*G0_1_0_6_1 - 0.00986201298701333*G0_1_0_6_2 - 0.0300791396103906*G0_1_0_6_3 + 0.0428997564935079*G0_1_0_6_4 + 0.0350101461038973*G0_1_0_6_5 + 0.198719561688318*G0_1_0_6_6 + 0.00246550324675336*G0_1_0_6_7 - 0.017751623376624*G0_1_0_6_8 + 0.0838271103896132*G0_1_0_6_9 - 0.00778003246753275*G0_1_0_7_0 + 0.00284902597402607*G0_1_0_7_1 - 0.000328733766233778*G0_1_0_7_2 - 0.00345170454545465*G0_1_0_7_3 - 0.00739650974025999*G0_1_0_7_4 + 0.0281067370129879*G0_1_0_7_5 + 0.00246550324675336*G0_1_0_7_6 - 0.0064103084415587*G0_1_0_7_7 - 0.00147930194805199*G0_1_0_7_8 + 0.02958603896104*G0_1_0_7_9 + 0.00454748376623392*G0_1_0_8_0 - 0.00553368506493525*G0_1_0_8_1 + 0.00082183441558444*G0_1_0_8_2 + 0.00443790584415597*G0_1_0_8_3 - 0.000986201298701324*G0_1_0_8_4 - 0.0305722402597413*G0_1_0_8_5 - 0.017751623376624*G0_1_0_8_6 - 0.00147930194805199*G0_1_0_8_7 + 0.00345170454545466*G0_1_0_8_8 - 0.047337662337664*G0_1_0_8_9 - 0.0115056818181822*G0_1_0_9_0 + 0.0164366883116889*G0_1_0_9_1 - 0.00788961038961064*G0_1_0_9_2 - 0.0424066558441573*G0_1_0_9_3 + 0.0493100649350665*G0_1_0_9_4 + 0.0956615259740292*G0_1_0_9_5 + 0.0838271103896132*G0_1_0_9_6 + 0.02958603896104*G0_1_0_9_7 - 0.047337662337664*G0_1_0_9_8 + 0.159764610389616*G0_1_0_9_9 - 0.0116274350649355*G0_1_1_0_0 - 0.00186891233766241*G0_1_1_0_1 + 0.000821834415584444*G0_1_1_0_3 + 0.00509537337662358*G0_1_1_0_4 - 0.0072869318181821*G0_1_1_0_5 + 0.0035612824675326*G0_1_1_0_6 - 0.0176420454545461*G0_1_1_0_7 + 0.010464691558442*G0_1_1_0_8 - 0.00361607142857157*G0_1_1_0_9 - 0.00186891233766241*G0_1_1_1_0 + 0.00186891233766241*G0_1_1_1_2 - 0.00493100649350665*G0_1_1_1_3 + 0.00295860389610401*G0_1_1_1_4 + 0.000164366883116882*G0_1_1_1_5 - 0.000164366883116883*G0_1_1_1_6 - 0.00295860389610402*G0_1_1_1_7 + 0.00493100649350668*G0_1_1_1_8 + 0.00186891233766241*G0_1_1_2_1 + 0.0116274350649355*G0_1_1_2_2 - 0.0104646915584419*G0_1_1_2_3 + 0.0176420454545461*G0_1_1_2_4 - 0.00356128246753261*G0_1_1_2_5 + 0.00728693181818211*G0_1_1_2_6 - 0.00509537337662356*G0_1_1_2_7 - 0.000821834415584442*G0_1_1_2_8 + 0.00361607142857156*G0_1_1_2_9 + 0.000821834415584445*G0_1_1_3_0 - 0.00493100649350665*G0_1_1_3_1 - 0.0104646915584419*G0_1_1_3_2 + 0.0305722402597413*G0_1_1_3_3 - 0.00542410714285733*G0_1_1_3_4 - 0.00147930194805198*G0_1_1_3_5 + 0.000493100649350649*G0_1_1_3_6 - 0.00246550324675329*G0_1_1_3_7 + 0.00493100649350665*G0_1_1_3_9 + 0.00509537337662358*G0_1_1_4_0 + 0.00295860389610401*G0_1_1_4_1 + 0.0176420454545461*G0_1_1_4_2 - 0.00542410714285733*G0_1_1_4_3 + 0.150888798701304*G0_1_1_4_4 - 0.0152861201298707*G0_1_1_4_5 + 0.01479301948052*G0_1_1_4_6 + 0.00246550324675332*G0_1_1_4_8 + 0.0197240259740266*G0_1_1_4_9 - 0.00728693181818211*G0_1_1_5_0 + 0.000164366883116882*G0_1_1_5_1 - 0.00356128246753261*G0_1_1_5_2 - 0.00147930194805198*G0_1_1_5_3 - 0.0152861201298707*G0_1_1_5_4 + 0.0128206168831173*G0_1_1_5_5 - 0.01479301948052*G0_1_1_5_7 - 0.00049310064935065*G0_1_1_5_8 + 0.011834415584416*G0_1_1_5_9 + 0.0035612824675326*G0_1_1_6_0 - 0.000164366883116883*G0_1_1_6_1 + 0.0072869318181821*G0_1_1_6_2 + 0.000493100649350649*G0_1_1_6_3 + 0.01479301948052*G0_1_1_6_4 - 0.0128206168831173*G0_1_1_6_6 + 0.0152861201298707*G0_1_1_6_7 + 0.00147930194805199*G0_1_1_6_8 - 0.011834415584416*G0_1_1_6_9 - 0.0176420454545461*G0_1_1_7_0 - 0.00295860389610402*G0_1_1_7_1 - 0.00509537337662356*G0_1_1_7_2 - 0.00246550324675329*G0_1_1_7_3 - 0.01479301948052*G0_1_1_7_5 + 0.0152861201298707*G0_1_1_7_6 - 0.150888798701304*G0_1_1_7_7 + 0.0054241071428574*G0_1_1_7_8 - 0.0197240259740267*G0_1_1_7_9 + 0.0104646915584419*G0_1_1_8_0 + 0.00493100649350668*G0_1_1_8_1 - 0.000821834415584441*G0_1_1_8_2 + 0.00246550324675332*G0_1_1_8_4 - 0.000493100649350649*G0_1_1_8_5 + 0.00147930194805199*G0_1_1_8_6 + 0.0054241071428574*G0_1_1_8_7 - 0.0305722402597413*G0_1_1_8_8 - 0.00493100649350665*G0_1_1_8_9 - 0.00361607142857157*G0_1_1_9_0 + 0.00361607142857156*G0_1_1_9_2 + 0.00493100649350665*G0_1_1_9_3 + 0.0197240259740266*G0_1_1_9_4 + 0.011834415584416*G0_1_1_9_5 - 0.011834415584416*G0_1_1_9_6 - 0.0197240259740267*G0_1_1_9_7 - 0.00493100649350665*G0_1_1_9_8; + A[96] = A[69] - 0.0098620129870134*G0_0_1_0_0 - 0.00301339285714297*G0_0_1_0_1 - 0.00295860389610403*G0_0_1_0_2 + 0.00443790584415599*G0_0_1_0_3 - 0.0138068181818187*G0_0_1_0_4 - 0.0123275162337666*G0_0_1_0_5 - 0.017751623376624*G0_0_1_0_6 - 0.00739650974026002*G0_0_1_0_7 + 0.00690340909090934*G0_0_1_0_8 - 0.0285998376623387*G0_0_1_0_9 - 0.00301339285714297*G0_0_1_1_0 - 0.000328733766233795*G0_0_1_1_1 - 0.0037256493506495*G0_0_1_1_2 + 0.00295860389610402*G0_0_1_1_3 - 0.0078896103896107*G0_0_1_1_4 + 0.0167654220779227*G0_0_1_1_5 - 0.0019724025974027*G0_0_1_1_6 + 0.00197240259740267*G0_0_1_1_7 - 0.00147930194805201*G0_0_1_1_8 + 0.01479301948052*G0_0_1_1_9 - 0.00295860389610403*G0_0_1_2_0 - 0.0037256493506495*G0_0_1_2_1 - 0.0295860389610401*G0_0_1_2_2 + 0.0138068181818187*G0_0_1_2_3 - 0.0221895292207801*G0_0_1_2_4 + 0.00887581168831207*G0_0_1_2_5 - 0.0468445616883134*G0_0_1_2_6 - 0.00246550324675334*G0_0_1_2_7 + 0.00147930194805199*G0_0_1_2_8 - 0.0128206168831173*G0_0_1_2_9 + 0.00443790584415599*G0_0_1_3_0 + 0.00295860389610402*G0_0_1_3_1 + 0.0138068181818187*G0_0_1_3_2 - 0.0414204545454562*G0_0_1_3_3 + 0.038461850649352*G0_0_1_3_4 - 0.0384618506493519*G0_0_1_3_5 + 0.0192309253246761*G0_0_1_3_6 - 0.00887581168831205*G0_0_1_3_8 - 0.04437905844156*G0_0_1_3_9 - 0.0138068181818187*G0_0_1_4_0 - 0.0078896103896107*G0_0_1_4_1 - 0.0221895292207801*G0_0_1_4_2 + 0.038461850649352*G0_0_1_4_3 - 0.147930194805201*G0_0_1_4_4 + 0.054734172077924*G0_0_1_4_5 - 0.0739650974026002*G0_0_1_4_6 + 0.017751623376624*G0_0_1_4_7 + 0.00887581168831203*G0_0_1_4_8 - 0.0710064935064961*G0_0_1_4_9 - 0.0123275162337666*G0_0_1_5_0 + 0.0167654220779227*G0_0_1_5_1 + 0.00887581168831207*G0_0_1_5_2 - 0.0384618506493519*G0_0_1_5_3 + 0.054734172077924*G0_0_1_5_4 + 0.213019480519487*G0_0_1_5_5 + 0.106509740259744*G0_0_1_5_6 + 0.0162723214285719*G0_0_1_5_7 - 0.0369825487012999*G0_0_1_5_8 + 0.159764610389616*G0_0_1_5_9 - 0.017751623376624*G0_0_1_6_0 - 0.0019724025974027*G0_0_1_6_1 - 0.0468445616883134*G0_0_1_6_2 + 0.0192309253246761*G0_0_1_6_3 - 0.0739650974026002*G0_0_1_6_4 + 0.106509740259744*G0_0_1_6_5 + 0.020710227272728*G0_0_1_6_7 - 0.00591720779220795*G0_0_1_6_8 - 0.00739650974026002*G0_0_1_7_0 + 0.00197240259740267*G0_0_1_7_1 - 0.00246550324675334*G0_0_1_7_2 + 0.017751623376624*G0_0_1_7_4 + 0.0162723214285719*G0_0_1_7_5 + 0.020710227272728*G0_0_1_7_6 - 0.0384618506493523*G0_0_1_7_7 + 0.00147930194805204*G0_0_1_7_8 + 0.0443790584415599*G0_0_1_7_9 + 0.00690340909090934*G0_0_1_8_0 - 0.00147930194805201*G0_0_1_8_1 + 0.00147930194805199*G0_0_1_8_2 - 0.00887581168831205*G0_0_1_8_3 + 0.00887581168831203*G0_0_1_8_4 - 0.0369825487012999*G0_0_1_8_5 - 0.00591720779220795*G0_0_1_8_6 + 0.00147930194805204*G0_0_1_8_7 - 0.0118344155844162*G0_0_1_8_8 - 0.062130681818184*G0_0_1_8_9 - 0.0285998376623387*G0_0_1_9_0 + 0.01479301948052*G0_0_1_9_1 - 0.0128206168831173*G0_0_1_9_2 - 0.04437905844156*G0_0_1_9_3 - 0.0710064935064961*G0_0_1_9_4 + 0.159764610389616*G0_0_1_9_5 + 0.0443790584415599*G0_0_1_9_7 - 0.062130681818184*G0_0_1_9_8 + 0.0098620129870134*G0_1_0_0_0 + 0.00301339285714297*G0_1_0_0_1 + 0.00295860389610403*G0_1_0_0_2 - 0.00443790584415599*G0_1_0_0_3 + 0.0138068181818187*G0_1_0_0_4 + 0.0123275162337666*G0_1_0_0_5 + 0.017751623376624*G0_1_0_0_6 + 0.00739650974026002*G0_1_0_0_7 - 0.00690340909090934*G0_1_0_0_8 + 0.0285998376623387*G0_1_0_0_9 + 0.00301339285714297*G0_1_0_1_0 + 0.000328733766233794*G0_1_0_1_1 + 0.0037256493506495*G0_1_0_1_2 - 0.00295860389610402*G0_1_0_1_3 + 0.0078896103896107*G0_1_0_1_4 - 0.0167654220779227*G0_1_0_1_5 + 0.0019724025974027*G0_1_0_1_6 - 0.00197240259740267*G0_1_0_1_7 + 0.00147930194805201*G0_1_0_1_8 - 0.01479301948052*G0_1_0_1_9 + 0.00295860389610403*G0_1_0_2_0 + 0.0037256493506495*G0_1_0_2_1 + 0.0295860389610401*G0_1_0_2_2 - 0.0138068181818187*G0_1_0_2_3 + 0.0221895292207801*G0_1_0_2_4 - 0.00887581168831207*G0_1_0_2_5 + 0.0468445616883134*G0_1_0_2_6 + 0.00246550324675334*G0_1_0_2_7 - 0.00147930194805199*G0_1_0_2_8 + 0.0128206168831173*G0_1_0_2_9 - 0.00443790584415599*G0_1_0_3_0 - 0.00295860389610402*G0_1_0_3_1 - 0.0138068181818187*G0_1_0_3_2 + 0.0414204545454562*G0_1_0_3_3 - 0.038461850649352*G0_1_0_3_4 + 0.0384618506493519*G0_1_0_3_5 - 0.0192309253246761*G0_1_0_3_6 + 0.00887581168831205*G0_1_0_3_8 + 0.04437905844156*G0_1_0_3_9 + 0.0138068181818187*G0_1_0_4_0 + 0.0078896103896107*G0_1_0_4_1 + 0.0221895292207801*G0_1_0_4_2 - 0.038461850649352*G0_1_0_4_3 + 0.147930194805201*G0_1_0_4_4 - 0.054734172077924*G0_1_0_4_5 + 0.0739650974026002*G0_1_0_4_6 - 0.017751623376624*G0_1_0_4_7 - 0.00887581168831203*G0_1_0_4_8 + 0.0710064935064961*G0_1_0_4_9 + 0.0123275162337666*G0_1_0_5_0 - 0.0167654220779227*G0_1_0_5_1 - 0.00887581168831207*G0_1_0_5_2 + 0.0384618506493519*G0_1_0_5_3 - 0.054734172077924*G0_1_0_5_4 - 0.213019480519487*G0_1_0_5_5 - 0.106509740259744*G0_1_0_5_6 - 0.0162723214285719*G0_1_0_5_7 + 0.0369825487012999*G0_1_0_5_8 - 0.159764610389616*G0_1_0_5_9 + 0.017751623376624*G0_1_0_6_0 + 0.0019724025974027*G0_1_0_6_1 + 0.0468445616883134*G0_1_0_6_2 - 0.0192309253246761*G0_1_0_6_3 + 0.0739650974026002*G0_1_0_6_4 - 0.106509740259744*G0_1_0_6_5 - 0.020710227272728*G0_1_0_6_7 + 0.00591720779220795*G0_1_0_6_8 + 0.00739650974026002*G0_1_0_7_0 - 0.00197240259740267*G0_1_0_7_1 + 0.00246550324675334*G0_1_0_7_2 - 0.017751623376624*G0_1_0_7_4 - 0.0162723214285719*G0_1_0_7_5 - 0.020710227272728*G0_1_0_7_6 + 0.0384618506493523*G0_1_0_7_7 - 0.00147930194805204*G0_1_0_7_8 - 0.0443790584415599*G0_1_0_7_9 - 0.00690340909090934*G0_1_0_8_0 + 0.00147930194805201*G0_1_0_8_1 - 0.00147930194805199*G0_1_0_8_2 + 0.00887581168831205*G0_1_0_8_3 - 0.00887581168831203*G0_1_0_8_4 + 0.0369825487012999*G0_1_0_8_5 + 0.00591720779220795*G0_1_0_8_6 - 0.00147930194805204*G0_1_0_8_7 + 0.0118344155844162*G0_1_0_8_8 + 0.062130681818184*G0_1_0_8_9 + 0.0285998376623387*G0_1_0_9_0 - 0.01479301948052*G0_1_0_9_1 + 0.0128206168831173*G0_1_0_9_2 + 0.04437905844156*G0_1_0_9_3 + 0.0710064935064961*G0_1_0_9_4 - 0.159764610389616*G0_1_0_9_5 - 0.0443790584415599*G0_1_0_9_7 + 0.062130681818184*G0_1_0_9_8; + A[94] = -A[96] - 0.00953327922077963*G0_0_1_0_0 + 0.000767045454545473*G0_0_1_0_2 - 0.0123275162337667*G0_0_1_0_3 - 0.011834415584416*G0_0_1_0_4 - 0.0152861201298706*G0_0_1_0_5 - 0.00986201298701328*G0_0_1_0_6 - 0.00591720779220801*G0_0_1_0_7 + 0.00493100649350666*G0_0_1_0_8 - 0.0433928571428586*G0_0_1_0_9 + 0.00953327922077948*G0_0_1_1_1 - 0.000767045454545487*G0_0_1_1_2 + 0.0152861201298706*G0_0_1_1_3 + 0.00986201298701335*G0_0_1_1_4 + 0.0123275162337666*G0_0_1_1_5 + 0.011834415584416*G0_0_1_1_6 - 0.00493100649350665*G0_0_1_1_7 + 0.00591720779220796*G0_0_1_1_8 + 0.0433928571428586*G0_0_1_1_9 + 0.000767045454545473*G0_0_1_2_0 - 0.000767045454545486*G0_0_1_2_1 + 0.00493100649350667*G0_0_1_2_3 + 0.0246550324675333*G0_0_1_2_4 - 0.00493100649350663*G0_0_1_2_5 - 0.0246550324675333*G0_0_1_2_6 - 0.00394480519480534*G0_0_1_2_7 + 0.00394480519480532*G0_0_1_2_8 - 0.0123275162337667*G0_0_1_3_0 + 0.0152861201298706*G0_0_1_3_1 + 0.00493100649350667*G0_0_1_3_2 - 0.254439935064944*G0_0_1_3_3 - 0.0680478896103921*G0_0_1_3_4 - 0.0355032467532479*G0_0_1_3_6 + 0.0369825487013*G0_0_1_3_7 - 0.0251481331168841*G0_0_1_3_8 - 0.204143668831176*G0_0_1_3_9 - 0.011834415584416*G0_0_1_4_0 + 0.00986201298701335*G0_0_1_4_1 + 0.0246550324675333*G0_0_1_4_2 - 0.0680478896103921*G0_0_1_4_3 - 0.1479301948052*G0_0_1_4_4 + 0.0355032467532479*G0_0_1_4_5 + 0.023668831168832*G0_0_1_4_7 - 0.011834415584416*G0_0_1_4_8 - 0.071006493506496*G0_0_1_4_9 - 0.0152861201298706*G0_0_1_5_0 + 0.0123275162337666*G0_0_1_5_1 - 0.00493100649350664*G0_0_1_5_2 + 0.0355032467532479*G0_0_1_5_4 + 0.254439935064943*G0_0_1_5_5 + 0.0680478896103919*G0_0_1_5_6 + 0.0251481331168839*G0_0_1_5_7 - 0.0369825487012999*G0_0_1_5_8 + 0.204143668831176*G0_0_1_5_9 - 0.00986201298701328*G0_0_1_6_0 + 0.011834415584416*G0_0_1_6_1 - 0.0246550324675333*G0_0_1_6_2 - 0.0355032467532479*G0_0_1_6_3 + 0.0680478896103919*G0_0_1_6_5 + 0.1479301948052*G0_0_1_6_6 + 0.011834415584416*G0_0_1_6_7 - 0.0236688311688319*G0_0_1_6_8 + 0.0710064935064959*G0_0_1_6_9 - 0.00591720779220801*G0_0_1_7_0 - 0.00493100649350665*G0_0_1_7_1 - 0.00394480519480534*G0_0_1_7_2 + 0.0369825487013*G0_0_1_7_3 + 0.023668831168832*G0_0_1_7_4 + 0.0251481331168839*G0_0_1_7_5 + 0.011834415584416*G0_0_1_7_6 - 0.0266274350649361*G0_0_1_7_7 + 0.106509740259744*G0_0_1_7_9 + 0.00493100649350666*G0_0_1_8_0 + 0.00591720779220796*G0_0_1_8_1 + 0.00394480519480532*G0_0_1_8_2 - 0.0251481331168841*G0_0_1_8_3 - 0.011834415584416*G0_0_1_8_4 - 0.0369825487012999*G0_0_1_8_5 - 0.0236688311688319*G0_0_1_8_6 + 0.0266274350649359*G0_0_1_8_8 - 0.106509740259744*G0_0_1_8_9 - 0.0433928571428586*G0_0_1_9_0 + 0.0433928571428586*G0_0_1_9_1 - 0.204143668831176*G0_0_1_9_3 - 0.071006493506496*G0_0_1_9_4 + 0.204143668831176*G0_0_1_9_5 + 0.0710064935064959*G0_0_1_9_6 + 0.106509740259744*G0_0_1_9_7 - 0.106509740259744*G0_0_1_9_8 - 0.0210389610389619*G0_1_1_0_0 - 0.00432832792207809*G0_1_1_0_1 + 0.00202719155844164*G0_1_1_0_2 - 0.013313717532468*G0_1_1_0_3 - 0.0138068181818187*G0_1_1_0_4 - 0.00295860389610404*G0_1_1_0_5 - 0.000986201298701316*G0_1_1_0_6 - 0.0133137175324681*G0_1_1_0_7 + 0.00986201298701334*G0_1_1_0_8 - 0.032544642857144*G0_1_1_0_9 - 0.00432832792207809*G0_1_1_1_0 - 0.0115056818181823*G0_1_1_1_1 + 0.00126014610389615*G0_1_1_1_2 + 0.0123275162337666*G0_1_1_1_3 + 0.00887581168831203*G0_1_1_1_4 - 0.000986201298701337*G0_1_1_1_5 - 0.00197240259740266*G0_1_1_1_6 + 0.00493100649350667*G0_1_1_1_7 - 0.00739650974026006*G0_1_1_1_8 + 0.0108482142857146*G0_1_1_1_9 + 0.00202719155844164*G0_1_1_2_0 + 0.00126014610389615*G0_1_1_2_1 + 0.0175324675324682*G0_1_1_2_2 - 0.00690340909090932*G0_1_1_2_3 + 0.04437905844156*G0_1_1_2_4 - 0.011834415584416*G0_1_1_2_5 + 0.0197240259740267*G0_1_1_2_6 - 0.0142999188311693*G0_1_1_2_7 - 0.010355113636364*G0_1_1_2_8 + 0.0187378246753253*G0_1_1_2_9 - 0.013313717532468*G0_1_1_3_0 + 0.0123275162337666*G0_1_1_3_1 - 0.00690340909090932*G0_1_1_3_2 - 0.257398538961048*G0_1_1_3_3 - 0.0488169642857162*G0_1_1_3_4 + 0.020710227272728*G0_1_1_3_5 + 0.00739650974025994*G0_1_1_3_6 + 0.0414204545454561*G0_1_1_3_7 - 0.0739650974025999*G0_1_1_3_8 - 0.115385551948056*G0_1_1_3_9 - 0.0138068181818187*G0_1_1_4_0 + 0.00887581168831202*G0_1_1_4_1 + 0.04437905844156*G0_1_1_4_2 - 0.0488169642857162*G0_1_1_4_3 - 0.186392045454552*G0_1_1_4_4 + 0.0428997564935079*G0_1_1_4_5 - 0.0502962662337679*G0_1_1_4_6 + 0.041420454545456*G0_1_1_4_7 + 0.0325446428571439*G0_1_1_4_8 - 0.142012987012992*G0_1_1_4_9 - 0.00295860389610404*G0_1_1_5_0 - 0.000986201298701338*G0_1_1_5_1 - 0.011834415584416*G0_1_1_5_2 + 0.020710227272728*G0_1_1_5_3 + 0.042899756493508*G0_1_1_5_4 - 0.00295860389610408*G0_1_1_5_5 + 0.019230925324676*G0_1_1_5_6 - 0.0488169642857161*G0_1_1_5_7 + 0.00443790584415604*G0_1_1_5_8 + 0.0887581168831198*G0_1_1_5_9 - 0.000986201298701316*G0_1_1_6_0 - 0.00197240259740266*G0_1_1_6_1 + 0.0197240259740267*G0_1_1_6_2 + 0.00739650974025994*G0_1_1_6_3 - 0.0502962662337679*G0_1_1_6_4 + 0.019230925324676*G0_1_1_6_5 - 0.038461850649352*G0_1_1_6_6 + 0.04437905844156*G0_1_1_6_7 + 0.0177516233766239*G0_1_1_6_8 - 0.0710064935064959*G0_1_1_6_9 - 0.0133137175324681*G0_1_1_7_0 + 0.00493100649350667*G0_1_1_7_1 - 0.0142999188311693*G0_1_1_7_2 + 0.0414204545454561*G0_1_1_7_3 + 0.041420454545456*G0_1_1_7_4 - 0.0488169642857161*G0_1_1_7_5 + 0.04437905844156*G0_1_1_7_6 - 0.360949675324689*G0_1_1_7_7 + 0.0251481331168842*G0_1_1_7_8 + 0.00887581168831172*G0_1_1_7_9 + 0.00986201298701334*G0_1_1_8_0 - 0.00739650974026006*G0_1_1_8_1 - 0.010355113636364*G0_1_1_8_2 - 0.0739650974025999*G0_1_1_8_3 + 0.0325446428571439*G0_1_1_8_4 + 0.00443790584415604*G0_1_1_8_5 + 0.0177516233766239*G0_1_1_8_6 + 0.0251481331168842*G0_1_1_8_7 - 0.334322240259752*G0_1_1_8_8 - 0.0976339285714319*G0_1_1_8_9 - 0.032544642857144*G0_1_1_9_0 + 0.0108482142857146*G0_1_1_9_1 + 0.0187378246753253*G0_1_1_9_2 - 0.115385551948056*G0_1_1_9_3 - 0.142012987012992*G0_1_1_9_4 + 0.0887581168831198*G0_1_1_9_5 - 0.0710064935064959*G0_1_1_9_6 + 0.00887581168831171*G0_1_1_9_7 - 0.0976339285714319*G0_1_1_9_8 - 0.319529220779232*G0_1_1_9_9; + A[59] = A[69] - 0.0138068181818187*G0_0_0_0_0 + 0.000657467532467553*G0_0_0_0_1 - 0.000493100649350664*G0_0_0_0_2 - 0.00542410714285734*G0_0_0_0_3 - 0.0172585227272734*G0_0_0_0_4 - 0.00788961038961073*G0_0_0_0_5 + 0.0216964285714293*G0_0_0_0_6 - 0.00147930194805201*G0_0_0_0_7 + 0.00591720779220794*G0_0_0_0_9 + 0.000657467532467552*G0_0_0_1_0 - 0.00460227272727287*G0_0_0_1_1 - 0.004437905844156*G0_0_0_1_2 + 0.01479301948052*G0_0_0_1_3 - 0.008875811688312*G0_0_0_1_4 - 0.0261343344155853*G0_0_0_1_5 + 0.000493100649350681*G0_0_0_1_6 - 0.0108482142857147*G0_0_0_1_7 + 0.00838271103896134*G0_0_0_1_8 - 0.023668831168832*G0_0_0_1_9 - 0.000493100649350664*G0_0_0_2_0 - 0.004437905844156*G0_0_0_2_1 - 0.00986201298701334*G0_0_0_2_2 + 0.0216964285714293*G0_0_0_2_3 - 0.0345170454545466*G0_0_0_2_4 - 0.017751623376624*G0_0_0_2_5 + 0.0443790584415599*G0_0_0_2_6 - 0.00838271103896133*G0_0_0_2_7 + 0.00345170454545468*G0_0_0_2_8 + 0.00591720779220795*G0_0_0_2_9 - 0.00542410714285734*G0_0_0_3_0 + 0.01479301948052*G0_0_0_3_1 + 0.0216964285714293*G0_0_0_3_2 - 0.142012987012992*G0_0_0_3_3 + 0.0310653409090917*G0_0_0_3_4 + 0.0443790584415599*G0_0_0_3_5 + 0.00443790584415595*G0_0_0_3_6 + 0.02218952922078*G0_0_0_3_7 - 0.017751623376624*G0_0_0_3_8 + 0.0266274350649358*G0_0_0_3_9 - 0.0172585227272734*G0_0_0_4_0 - 0.008875811688312*G0_0_0_4_1 - 0.0345170454545466*G0_0_0_4_2 + 0.0310653409090917*G0_0_0_4_3 - 0.514797077922096*G0_0_0_4_4 + 0.057692775974028*G0_0_0_4_5 - 0.062130681818184*G0_0_0_4_6 + 0.035503246753248*G0_0_0_4_7 - 0.00443790584415602*G0_0_0_4_8 - 0.13313717532468*G0_0_0_4_9 - 0.00788961038961073*G0_0_0_5_0 - 0.0261343344155853*G0_0_0_5_1 - 0.017751623376624*G0_0_0_5_2 + 0.0443790584415599*G0_0_0_5_3 + 0.057692775974028*G0_0_0_5_4 - 0.461542207792223*G0_0_0_5_5 - 0.02218952922078*G0_0_0_5_6 - 0.115385551948056*G0_0_0_5_7 + 0.0843202110389639*G0_0_0_5_8 - 0.186392045454552*G0_0_0_5_9 + 0.0216964285714293*G0_0_0_6_0 + 0.000493100649350681*G0_0_0_6_1 + 0.0443790584415599*G0_0_0_6_2 + 0.00443790584415595*G0_0_0_6_3 - 0.062130681818184*G0_0_0_6_4 - 0.02218952922078*G0_0_0_6_5 + 0.0177516233766241*G0_0_0_6_6 + 0.031065340909092*G0_0_0_6_7 - 0.00887581168831202*G0_0_0_6_8 - 0.0266274350649359*G0_0_0_6_9 - 0.00147930194805201*G0_0_0_7_0 - 0.0108482142857147*G0_0_0_7_1 - 0.00838271103896133*G0_0_0_7_2 + 0.02218952922078*G0_0_0_7_3 + 0.035503246753248*G0_0_0_7_4 - 0.115385551948056*G0_0_0_7_5 + 0.031065340909092*G0_0_0_7_6 - 0.071006493506496*G0_0_0_7_7 + 0.035503246753248*G0_0_0_7_8 - 0.0798823051948081*G0_0_0_7_9 + 0.00838271103896134*G0_0_0_8_1 + 0.00345170454545468*G0_0_0_8_2 - 0.017751623376624*G0_0_0_8_3 - 0.00443790584415602*G0_0_0_8_4 + 0.0843202110389639*G0_0_0_8_5 - 0.00887581168831201*G0_0_0_8_6 + 0.035503246753248*G0_0_0_8_7 - 0.017751623376624*G0_0_0_8_8 + 0.079882305194808*G0_0_0_8_9 + 0.00591720779220794*G0_0_0_9_0 - 0.023668831168832*G0_0_0_9_1 + 0.00591720779220795*G0_0_0_9_2 + 0.0266274350649358*G0_0_0_9_3 - 0.13313717532468*G0_0_0_9_4 - 0.186392045454552*G0_0_0_9_5 - 0.0266274350649358*G0_0_0_9_6 - 0.079882305194808*G0_0_0_9_7 + 0.079882305194808*G0_0_0_9_8 - 0.319529220779232*G0_0_0_9_9 - 0.00887581168831205*G0_0_1_0_0 - 0.00197240259740268*G0_0_1_0_1 - 0.0034517045454547*G0_0_1_0_2 + 0.00197240259740266*G0_0_1_0_3 - 0.0305722402597414*G0_0_1_0_4 + 0.00443790584415599*G0_0_1_0_5 - 0.011834415584416*G0_0_1_0_6 + 0.000986201298701307*G0_0_1_0_7 + 0.00394480519480534*G0_0_1_0_8 - 0.00887581168831205*G0_0_1_0_9 - 0.00197240259740268*G0_0_1_1_0 - 0.00493100649350669*G0_0_1_1_1 - 0.00854707792207824*G0_0_1_1_2 + 0.0172585227272733*G0_0_1_1_3 - 0.0197240259740267*G0_0_1_1_4 - 0.00246550324675331*G0_0_1_1_5 - 0.00838271103896136*G0_0_1_1_6 - 0.005917207792208*G0_0_1_1_7 + 0.00739650974025998*G0_0_1_1_8 - 0.00887581168831203*G0_0_1_1_9 - 0.0034517045454547*G0_0_1_2_0 - 0.00854707792207824*G0_0_1_2_1 - 0.0542410714285735*G0_0_1_2_2 + 0.0384618506493521*G0_0_1_2_3 - 0.0665685876623401*G0_0_1_2_4 + 0.00690340909090939*G0_0_1_2_5 - 0.0271205357142868*G0_0_1_2_6 - 0.0113413149350653*G0_0_1_2_7 + 0.00197240259740267*G0_0_1_2_8 - 0.020710227272728*G0_0_1_2_9 + 0.00197240259740266*G0_0_1_3_0 + 0.0172585227272733*G0_0_1_3_1 + 0.038461850649352*G0_0_1_3_2 - 0.159764610389616*G0_0_1_3_3 + 0.0798823051948078*G0_0_1_3_4 - 0.00887581168831202*G0_0_1_3_5 + 0.04437905844156*G0_0_1_3_6 + 0.013313717532468*G0_0_1_3_7 - 0.026627435064936*G0_0_1_3_8 - 0.0305722402597414*G0_0_1_4_0 - 0.0197240259740267*G0_0_1_4_1 - 0.0665685876623401*G0_0_1_4_2 + 0.0798823051948078*G0_0_1_4_3 - 0.639058441558464*G0_0_1_4_4 + 0.1109476461039*G0_0_1_4_5 - 0.15532670454546*G0_0_1_4_6 + 0.053254870129872*G0_0_1_4_7 + 0.013313717532468*G0_0_1_4_8 - 0.159764610389616*G0_0_1_4_9 + 0.00443790584415599*G0_0_1_5_0 - 0.00246550324675331*G0_0_1_5_1 + 0.00690340909090939*G0_0_1_5_2 - 0.00887581168831202*G0_0_1_5_3 + 0.1109476461039*G0_0_1_5_4 - 0.115385551948056*G0_0_1_5_5 + 0.0843202110389641*G0_0_1_5_6 - 0.079882305194808*G0_0_1_5_7 + 0.026627435064936*G0_0_1_5_8 - 0.026627435064936*G0_0_1_5_9 - 0.011834415584416*G0_0_1_6_0 - 0.00838271103896136*G0_0_1_6_1 - 0.0271205357142868*G0_0_1_6_2 + 0.04437905844156*G0_0_1_6_3 - 0.15532670454546*G0_0_1_6_4 + 0.0843202110389641*G0_0_1_6_5 - 0.115385551948056*G0_0_1_6_6 + 0.053254870129872*G0_0_1_6_7 - 0.026627435064936*G0_0_1_6_9 + 0.000986201298701307*G0_0_1_7_0 - 0.005917207792208*G0_0_1_7_1 - 0.0113413149350653*G0_0_1_7_2 + 0.013313717532468*G0_0_1_7_3 + 0.053254870129872*G0_0_1_7_4 - 0.079882305194808*G0_0_1_7_5 + 0.053254870129872*G0_0_1_7_6 - 0.13313717532468*G0_0_1_7_7 + 0.0266274350649361*G0_0_1_7_8 - 0.0798823051948082*G0_0_1_7_9 + 0.00394480519480534*G0_0_1_8_0 + 0.00739650974025998*G0_0_1_8_1 + 0.00197240259740267*G0_0_1_8_2 - 0.026627435064936*G0_0_1_8_3 + 0.013313717532468*G0_0_1_8_4 + 0.026627435064936*G0_0_1_8_5 + 0.0266274350649361*G0_0_1_8_7 - 0.0532548701298723*G0_0_1_8_8 - 0.00887581168831205*G0_0_1_9_0 - 0.00887581168831203*G0_0_1_9_1 - 0.020710227272728*G0_0_1_9_2 - 0.159764610389616*G0_0_1_9_4 - 0.026627435064936*G0_0_1_9_5 - 0.026627435064936*G0_0_1_9_6 - 0.0798823051948082*G0_0_1_9_7 - 0.319529220779232*G0_0_1_9_9 + 0.0305722402597415*G0_1_0_0_0 + 0.00476663961038977*G0_1_0_0_1 + 0.00246550324675335*G0_1_0_0_2 - 0.00394480519480531*G0_1_0_0_3 - 0.0142999188311694*G0_1_0_0_4 + 0.0636099837662359*G0_1_0_0_5 - 0.0029586038961041*G0_1_0_0_6 + 0.0305722402597414*G0_1_0_0_7 - 0.0167654220779227*G0_1_0_0_8 + 0.0325446428571439*G0_1_0_0_9 + 0.00476663961038977*G0_1_0_1_0 - 0.00427353896103911*G0_1_0_1_1 - 0.00180803571428578*G0_1_0_1_2 + 0.0157792207792213*G0_1_0_1_3 - 0.0138068181818187*G0_1_0_1_4 - 0.0172585227272733*G0_1_0_1_5 - 0.0231757305194813*G0_1_0_1_6 + 0.005917207792208*G0_1_0_1_8 - 0.038461850649352*G0_1_0_1_9 + 0.00246550324675335*G0_1_0_2_0 - 0.00180803571428578*G0_1_0_2_1 - 0.01479301948052*G0_1_0_2_2 + 0.017751623376624*G0_1_0_2_3 - 0.0369825487012999*G0_1_0_2_4 + 0.0157792207792213*G0_1_0_2_5 + 0.0320515422077933*G0_1_0_2_6 + 0.00493100649350667*G0_1_0_2_7 - 0.00394480519480532*G0_1_0_2_8 + 0.0207102272727279*G0_1_0_2_9 - 0.00394480519480531*G0_1_0_3_0 + 0.0157792207792213*G0_1_0_3_1 + 0.017751623376624*G0_1_0_3_2 - 0.106509740259744*G0_1_0_3_3 + 0.0399411525974038*G0_1_0_3_4 + 0.0355032467532478*G0_1_0_3_5 + 0.0621306818181838*G0_1_0_3_6 + 0.00443790584415598*G0_1_0_3_7 - 0.00887581168831196*G0_1_0_3_8 + 0.106509740259744*G0_1_0_3_9 - 0.0142999188311694*G0_1_0_4_0 - 0.0138068181818187*G0_1_0_4_1 - 0.0369825487012999*G0_1_0_4_2 + 0.0399411525974038*G0_1_0_4_3 - 0.452666396103912*G0_1_0_4_4 + 0.035503246753248*G0_1_0_4_5 - 0.0976339285714319*G0_1_0_4_6 + 0.017751623376624*G0_1_0_4_7 + 0.00443790584415598*G0_1_0_4_8 - 0.13313717532468*G0_1_0_4_9 + 0.0636099837662359*G0_1_0_5_0 - 0.0172585227272733*G0_1_0_5_1 + 0.0157792207792213*G0_1_0_5_2 + 0.0355032467532478*G0_1_0_5_3 + 0.035503246753248*G0_1_0_5_4 - 0.328405032467543*G0_1_0_5_5 - 0.128699269480524*G0_1_0_5_6 - 0.0221895292207799*G0_1_0_5_7 + 0.0443790584415599*G0_1_0_5_8 - 0.186392045454552*G0_1_0_5_9 - 0.0029586038961041*G0_1_0_6_0 - 0.0231757305194813*G0_1_0_6_1 + 0.0320515422077933*G0_1_0_6_2 + 0.0621306818181838*G0_1_0_6_3 - 0.0976339285714319*G0_1_0_6_4 - 0.128699269480524*G0_1_0_6_5 - 0.328405032467543*G0_1_0_6_6 - 0.02218952922078*G0_1_0_6_7 + 0.0443790584415599*G0_1_0_6_8 - 0.186392045454552*G0_1_0_6_9 + 0.0305722402597414*G0_1_0_7_0 + 0.00493100649350667*G0_1_0_7_2 + 0.00443790584415598*G0_1_0_7_3 + 0.017751623376624*G0_1_0_7_4 - 0.0221895292207799*G0_1_0_7_5 - 0.02218952922078*G0_1_0_7_6 + 0.0532548701298721*G0_1_0_7_7 - 0.013313717532468*G0_1_0_7_8 - 0.0532548701298719*G0_1_0_7_9 - 0.0167654220779227*G0_1_0_8_0 + 0.005917207792208*G0_1_0_8_1 - 0.00394480519480532*G0_1_0_8_2 - 0.00887581168831196*G0_1_0_8_3 + 0.00443790584415598*G0_1_0_8_4 + 0.0443790584415599*G0_1_0_8_5 + 0.0443790584415599*G0_1_0_8_6 - 0.013313717532468*G0_1_0_8_7 + 0.106509740259744*G0_1_0_8_9 + 0.0325446428571439*G0_1_0_9_0 - 0.038461850649352*G0_1_0_9_1 + 0.0207102272727279*G0_1_0_9_2 + 0.106509740259744*G0_1_0_9_3 - 0.13313717532468*G0_1_0_9_4 - 0.186392045454552*G0_1_0_9_5 - 0.186392045454552*G0_1_0_9_6 - 0.0532548701298719*G0_1_0_9_7 + 0.106509740259744*G0_1_0_9_8 - 0.319529220779232*G0_1_0_9_9 + 0.0453652597402616*G0_1_1_0_0 + 0.00657467532467557*G0_1_1_0_1 - 0.0192309253246761*G0_1_1_0_4 + 0.0315584415584428*G0_1_1_0_5 - 0.0187378246753254*G0_1_1_0_6 + 0.0675547889610416*G0_1_1_0_7 - 0.0345170454545467*G0_1_1_0_8 + 0.011834415584416*G0_1_1_0_9 + 0.00657467532467557*G0_1_1_1_0 - 0.00657467532467557*G0_1_1_1_2 + 0.00986201298701334*G0_1_1_1_3 - 0.0138068181818187*G0_1_1_1_4 + 0.00591720779220802*G0_1_1_1_5 - 0.00591720779220802*G0_1_1_1_6 + 0.0138068181818187*G0_1_1_1_7 - 0.00986201298701336*G0_1_1_1_8 - 0.00657467532467557*G0_1_1_2_1 - 0.0453652597402615*G0_1_1_2_2 + 0.0345170454545467*G0_1_1_2_3 - 0.0675547889610414*G0_1_1_2_4 + 0.0187378246753254*G0_1_1_2_5 - 0.0315584415584428*G0_1_1_2_6 + 0.019230925324676*G0_1_1_2_7 - 0.011834415584416*G0_1_1_2_9 + 0.00986201298701334*G0_1_1_3_1 + 0.0345170454545467*G0_1_1_3_2 - 0.106509740259744*G0_1_1_3_3 + 0.0532548701298719*G0_1_1_3_4 - 0.00887581168831205*G0_1_1_3_5 + 0.017751623376624*G0_1_1_3_6 - 0.0192309253246761*G0_1_1_4_0 - 0.0138068181818187*G0_1_1_4_1 - 0.0675547889610414*G0_1_1_4_2 + 0.0532548701298719*G0_1_1_4_3 - 0.505921266233784*G0_1_1_4_4 + 0.057692775974028*G0_1_1_4_5 - 0.0754443993506522*G0_1_1_4_6 - 0.079882305194808*G0_1_1_4_9 + 0.0315584415584428*G0_1_1_5_0 + 0.00591720779220802*G0_1_1_5_1 + 0.0187378246753254*G0_1_1_5_2 - 0.00887581168831205*G0_1_1_5_3 + 0.057692775974028*G0_1_1_5_4 + 0.0754443993506521*G0_1_1_5_7 - 0.0177516233766241*G0_1_1_5_8 - 0.0187378246753254*G0_1_1_6_0 - 0.00591720779220802*G0_1_1_6_1 - 0.0315584415584428*G0_1_1_6_2 + 0.017751623376624*G0_1_1_6_3 - 0.0754443993506522*G0_1_1_6_4 - 0.057692775974028*G0_1_1_6_7 + 0.00887581168831204*G0_1_1_6_8 + 0.0675547889610416*G0_1_1_7_0 + 0.0138068181818187*G0_1_1_7_1 + 0.019230925324676*G0_1_1_7_2 + 0.0754443993506521*G0_1_1_7_5 - 0.057692775974028*G0_1_1_7_6 + 0.505921266233785*G0_1_1_7_7 - 0.0532548701298722*G0_1_1_7_8 + 0.0798823051948082*G0_1_1_7_9 - 0.0345170454545467*G0_1_1_8_0 - 0.00986201298701336*G0_1_1_8_1 - 0.0177516233766241*G0_1_1_8_5 + 0.00887581168831204*G0_1_1_8_6 - 0.0532548701298722*G0_1_1_8_7 + 0.106509740259744*G0_1_1_8_8 + 0.011834415584416*G0_1_1_9_0 - 0.011834415584416*G0_1_1_9_2 - 0.079882305194808*G0_1_1_9_4 + 0.0798823051948082*G0_1_1_9_7; + A[49] = -A[69] - 0.00953327922077963*G0_1_0_0_0 + 0.000767045454545473*G0_1_0_0_2 - 0.0123275162337667*G0_1_0_0_3 - 0.011834415584416*G0_1_0_0_4 - 0.0152861201298706*G0_1_0_0_5 - 0.00986201298701327*G0_1_0_0_6 - 0.00591720779220801*G0_1_0_0_7 + 0.00493100649350666*G0_1_0_0_8 - 0.0433928571428586*G0_1_0_0_9 + 0.00953327922077948*G0_1_0_1_1 - 0.000767045454545486*G0_1_0_1_2 + 0.0152861201298706*G0_1_0_1_3 + 0.00986201298701335*G0_1_0_1_4 + 0.0123275162337666*G0_1_0_1_5 + 0.011834415584416*G0_1_0_1_6 - 0.00493100649350665*G0_1_0_1_7 + 0.00591720779220796*G0_1_0_1_8 + 0.0433928571428586*G0_1_0_1_9 + 0.000767045454545473*G0_1_0_2_0 - 0.000767045454545486*G0_1_0_2_1 + 0.00493100649350667*G0_1_0_2_3 + 0.0246550324675333*G0_1_0_2_4 - 0.00493100649350663*G0_1_0_2_5 - 0.0246550324675333*G0_1_0_2_6 - 0.00394480519480533*G0_1_0_2_7 + 0.00394480519480532*G0_1_0_2_8 - 0.0123275162337667*G0_1_0_3_0 + 0.0152861201298706*G0_1_0_3_1 + 0.00493100649350667*G0_1_0_3_2 - 0.254439935064944*G0_1_0_3_3 - 0.0680478896103921*G0_1_0_3_4 - 0.0355032467532479*G0_1_0_3_6 + 0.0369825487013*G0_1_0_3_7 - 0.0251481331168841*G0_1_0_3_8 - 0.204143668831176*G0_1_0_3_9 - 0.011834415584416*G0_1_0_4_0 + 0.00986201298701335*G0_1_0_4_1 + 0.0246550324675333*G0_1_0_4_2 - 0.0680478896103921*G0_1_0_4_3 - 0.1479301948052*G0_1_0_4_4 + 0.0355032467532479*G0_1_0_4_5 + 0.023668831168832*G0_1_0_4_7 - 0.011834415584416*G0_1_0_4_8 - 0.071006493506496*G0_1_0_4_9 - 0.0152861201298706*G0_1_0_5_0 + 0.0123275162337666*G0_1_0_5_1 - 0.00493100649350664*G0_1_0_5_2 + 0.0355032467532479*G0_1_0_5_4 + 0.254439935064943*G0_1_0_5_5 + 0.0680478896103919*G0_1_0_5_6 + 0.0251481331168839*G0_1_0_5_7 - 0.0369825487012999*G0_1_0_5_8 + 0.204143668831176*G0_1_0_5_9 - 0.00986201298701327*G0_1_0_6_0 + 0.011834415584416*G0_1_0_6_1 - 0.0246550324675333*G0_1_0_6_2 - 0.0355032467532479*G0_1_0_6_3 + 0.0680478896103919*G0_1_0_6_5 + 0.1479301948052*G0_1_0_6_6 + 0.011834415584416*G0_1_0_6_7 - 0.0236688311688319*G0_1_0_6_8 + 0.0710064935064959*G0_1_0_6_9 - 0.00591720779220801*G0_1_0_7_0 - 0.00493100649350665*G0_1_0_7_1 - 0.00394480519480533*G0_1_0_7_2 + 0.0369825487013*G0_1_0_7_3 + 0.023668831168832*G0_1_0_7_4 + 0.0251481331168839*G0_1_0_7_5 + 0.011834415584416*G0_1_0_7_6 - 0.0266274350649361*G0_1_0_7_7 + 0.106509740259744*G0_1_0_7_9 + 0.00493100649350666*G0_1_0_8_0 + 0.00591720779220796*G0_1_0_8_1 + 0.00394480519480532*G0_1_0_8_2 - 0.0251481331168841*G0_1_0_8_3 - 0.011834415584416*G0_1_0_8_4 - 0.0369825487012999*G0_1_0_8_5 - 0.0236688311688319*G0_1_0_8_6 + 0.0266274350649359*G0_1_0_8_8 - 0.106509740259744*G0_1_0_8_9 - 0.0433928571428586*G0_1_0_9_0 + 0.0433928571428586*G0_1_0_9_1 - 0.204143668831176*G0_1_0_9_3 - 0.071006493506496*G0_1_0_9_4 + 0.204143668831176*G0_1_0_9_5 + 0.0710064935064959*G0_1_0_9_6 + 0.106509740259744*G0_1_0_9_7 - 0.106509740259744*G0_1_0_9_8 - 0.0210389610389619*G0_1_1_0_0 - 0.00432832792207809*G0_1_1_0_1 + 0.00202719155844164*G0_1_1_0_2 - 0.013313717532468*G0_1_1_0_3 - 0.0138068181818187*G0_1_1_0_4 - 0.00295860389610404*G0_1_1_0_5 - 0.000986201298701314*G0_1_1_0_6 - 0.0133137175324681*G0_1_1_0_7 + 0.00986201298701334*G0_1_1_0_8 - 0.032544642857144*G0_1_1_0_9 - 0.00432832792207809*G0_1_1_1_0 - 0.0115056818181823*G0_1_1_1_1 + 0.00126014610389615*G0_1_1_1_2 + 0.0123275162337666*G0_1_1_1_3 + 0.00887581168831202*G0_1_1_1_4 - 0.000986201298701337*G0_1_1_1_5 - 0.00197240259740266*G0_1_1_1_6 + 0.00493100649350667*G0_1_1_1_7 - 0.00739650974026005*G0_1_1_1_8 + 0.0108482142857146*G0_1_1_1_9 + 0.00202719155844164*G0_1_1_2_0 + 0.00126014610389615*G0_1_1_2_1 + 0.0175324675324682*G0_1_1_2_2 - 0.00690340909090932*G0_1_1_2_3 + 0.04437905844156*G0_1_1_2_4 - 0.011834415584416*G0_1_1_2_5 + 0.0197240259740267*G0_1_1_2_6 - 0.0142999188311693*G0_1_1_2_7 - 0.010355113636364*G0_1_1_2_8 + 0.0187378246753253*G0_1_1_2_9 - 0.013313717532468*G0_1_1_3_0 + 0.0123275162337666*G0_1_1_3_1 - 0.00690340909090932*G0_1_1_3_2 - 0.257398538961048*G0_1_1_3_3 - 0.0488169642857162*G0_1_1_3_4 + 0.020710227272728*G0_1_1_3_5 + 0.00739650974025994*G0_1_1_3_6 + 0.0414204545454561*G0_1_1_3_7 - 0.0739650974025999*G0_1_1_3_8 - 0.115385551948056*G0_1_1_3_9 - 0.0138068181818187*G0_1_1_4_0 + 0.00887581168831202*G0_1_1_4_1 + 0.04437905844156*G0_1_1_4_2 - 0.0488169642857162*G0_1_1_4_3 - 0.186392045454552*G0_1_1_4_4 + 0.042899756493508*G0_1_1_4_5 - 0.0502962662337679*G0_1_1_4_6 + 0.041420454545456*G0_1_1_4_7 + 0.0325446428571439*G0_1_1_4_8 - 0.142012987012992*G0_1_1_4_9 - 0.00295860389610404*G0_1_1_5_0 - 0.000986201298701338*G0_1_1_5_1 - 0.011834415584416*G0_1_1_5_2 + 0.020710227272728*G0_1_1_5_3 + 0.0428997564935079*G0_1_1_5_4 - 0.00295860389610408*G0_1_1_5_5 + 0.019230925324676*G0_1_1_5_6 - 0.0488169642857161*G0_1_1_5_7 + 0.00443790584415604*G0_1_1_5_8 + 0.0887581168831198*G0_1_1_5_9 - 0.000986201298701316*G0_1_1_6_0 - 0.00197240259740266*G0_1_1_6_1 + 0.0197240259740267*G0_1_1_6_2 + 0.00739650974025994*G0_1_1_6_3 - 0.0502962662337679*G0_1_1_6_4 + 0.019230925324676*G0_1_1_6_5 - 0.038461850649352*G0_1_1_6_6 + 0.04437905844156*G0_1_1_6_7 + 0.0177516233766239*G0_1_1_6_8 - 0.0710064935064959*G0_1_1_6_9 - 0.0133137175324681*G0_1_1_7_0 + 0.00493100649350667*G0_1_1_7_1 - 0.0142999188311693*G0_1_1_7_2 + 0.0414204545454561*G0_1_1_7_3 + 0.041420454545456*G0_1_1_7_4 - 0.0488169642857161*G0_1_1_7_5 + 0.04437905844156*G0_1_1_7_6 - 0.360949675324689*G0_1_1_7_7 + 0.0251481331168842*G0_1_1_7_8 + 0.00887581168831172*G0_1_1_7_9 + 0.00986201298701334*G0_1_1_8_0 - 0.00739650974026006*G0_1_1_8_1 - 0.010355113636364*G0_1_1_8_2 - 0.0739650974025999*G0_1_1_8_3 + 0.0325446428571439*G0_1_1_8_4 + 0.00443790584415604*G0_1_1_8_5 + 0.0177516233766239*G0_1_1_8_6 + 0.0251481331168842*G0_1_1_8_7 - 0.334322240259752*G0_1_1_8_8 - 0.0976339285714319*G0_1_1_8_9 - 0.032544642857144*G0_1_1_9_0 + 0.0108482142857146*G0_1_1_9_1 + 0.0187378246753253*G0_1_1_9_2 - 0.115385551948056*G0_1_1_9_3 - 0.142012987012992*G0_1_1_9_4 + 0.0887581168831198*G0_1_1_9_5 - 0.0710064935064959*G0_1_1_9_6 + 0.00887581168831171*G0_1_1_9_7 - 0.0976339285714319*G0_1_1_9_8 - 0.319529220779232*G0_1_1_9_9; + A[81] = -A[31] - 0.0107021103896107*G0_0_0_0_0 - 0.00522017045454566*G0_0_0_0_1 - 0.00155235389610395*G0_0_0_0_2 - 0.00168932629870137*G0_0_0_0_3 - 0.0013331980519481*G0_0_0_0_4 - 0.00590807629870149*G0_0_0_0_5 + 0.00154322240259743*G0_0_0_0_6 + 0.000374391233766265*G0_0_0_0_7 - 0.00214590097402607*G0_0_0_0_8 - 0.000821834415584454*G0_0_0_0_9 - 0.00522017045454566*G0_0_0_1_0 - 0.0932021103896135*G0_0_0_1_1 - 0.00522017045454563*G0_0_0_1_2 - 0.0452008928571443*G0_0_0_1_3 + 0.0208198051948059*G0_0_0_1_4 - 0.000593547077922093*G0_0_0_1_5 - 0.000593547077922107*G0_0_0_1_6 + 0.020819805194806*G0_0_0_1_7 - 0.0452008928571446*G0_0_0_1_8 - 0.00712256493506522*G0_0_0_1_9 - 0.00155235389610395*G0_0_0_2_0 - 0.00522017045454563*G0_0_0_2_1 - 0.0107021103896108*G0_0_0_2_2 - 0.00214590097402603*G0_0_0_2_3 + 0.000374391233766224*G0_0_0_2_4 + 0.00154322240259747*G0_0_0_2_5 - 0.00590807629870154*G0_0_0_2_6 - 0.00133319805194809*G0_0_0_2_7 - 0.00168932629870136*G0_0_0_2_8 - 0.000821834415584454*G0_0_0_2_9 - 0.00168932629870136*G0_0_0_3_0 - 0.0452008928571443*G0_0_0_3_1 - 0.00214590097402603*G0_0_0_3_2 - 0.0378043831168843*G0_0_0_3_3 + 0.0201349431818188*G0_0_0_3_4 + 0.00123275162337665*G0_0_0_3_5 + 0.00616375811688333*G0_0_0_3_6 + 0.00945109577922114*G0_0_0_3_7 - 0.0189021915584423*G0_0_0_3_8 + 0.00246550324675333*G0_0_0_3_9 - 0.0013331980519481*G0_0_0_4_0 + 0.0208198051948059*G0_0_0_4_1 + 0.000374391233766224*G0_0_0_4_2 + 0.0201349431818188*G0_0_0_4_3 - 0.0368181818181831*G0_0_0_4_4 + 0.00838271103896133*G0_0_0_4_5 - 0.0145464691558447*G0_0_0_4_6 + 0.00180803571428576*G0_0_0_4_7 + 0.00945109577922113*G0_0_0_4_8 - 0.0142999188311693*G0_0_0_4_9 - 0.00590807629870149*G0_0_0_5_0 - 0.000593547077922093*G0_0_0_5_1 + 0.00154322240259747*G0_0_0_5_2 + 0.00123275162337665*G0_0_0_5_3 + 0.00838271103896133*G0_0_0_5_4 - 0.0613088474025994*G0_0_0_5_5 + 0.0146286525974031*G0_0_0_5_6 - 0.0145464691558446*G0_0_0_5_7 + 0.00616375811688333*G0_0_0_5_8 - 0.00986201298701333*G0_0_0_5_9 + 0.00154322240259743*G0_0_0_6_0 - 0.000593547077922107*G0_0_0_6_1 - 0.00590807629870154*G0_0_0_6_2 + 0.00616375811688333*G0_0_0_6_3 - 0.0145464691558447*G0_0_0_6_4 + 0.0146286525974031*G0_0_0_6_5 - 0.0613088474025995*G0_0_0_6_6 + 0.00838271103896132*G0_0_0_6_7 + 0.00123275162337666*G0_0_0_6_8 - 0.00986201298701331*G0_0_0_6_9 + 0.000374391233766264*G0_0_0_7_0 + 0.020819805194806*G0_0_0_7_1 - 0.00133319805194809*G0_0_0_7_2 + 0.00945109577922114*G0_0_0_7_3 + 0.00180803571428576*G0_0_0_7_4 - 0.0145464691558446*G0_0_0_7_5 + 0.00838271103896132*G0_0_0_7_6 - 0.0368181818181832*G0_0_0_7_7 + 0.020134943181819*G0_0_0_7_8 - 0.0142999188311693*G0_0_0_7_9 - 0.00214590097402608*G0_0_0_8_0 - 0.0452008928571446*G0_0_0_8_1 - 0.00168932629870136*G0_0_0_8_2 - 0.0189021915584423*G0_0_0_8_3 + 0.00945109577922113*G0_0_0_8_4 + 0.00616375811688333*G0_0_0_8_5 + 0.00123275162337666*G0_0_0_8_6 + 0.020134943181819*G0_0_0_8_7 - 0.0378043831168846*G0_0_0_8_8 + 0.00246550324675333*G0_0_0_8_9 - 0.000821834415584454*G0_0_0_9_0 - 0.00712256493506522*G0_0_0_9_1 - 0.000821834415584453*G0_0_0_9_2 + 0.00246550324675333*G0_0_0_9_3 - 0.0142999188311693*G0_0_0_9_4 - 0.00986201298701333*G0_0_0_9_5 - 0.00986201298701331*G0_0_0_9_6 - 0.0142999188311693*G0_0_0_9_7 + 0.00246550324675333*G0_0_0_9_8 - 0.104537337662341*G0_0_0_9_9; + A[7] = A[81] - 0.0987966720779254*G0_0_0_0_0 - 0.00557021103896122*G0_0_0_0_2 + 0.00758827110389641*G0_0_0_0_3 - 0.00131493506493512*G0_0_0_0_4 - 0.062742491883119*G0_0_0_0_5 + 0.0276318993506503*G0_0_0_0_6 - 0.0589163961038981*G0_0_0_0_7 + 0.0328003246753258*G0_0_0_0_8 - 0.00909496753246787*G0_0_0_0_9 + 0.0987966720779254*G0_0_0_1_1 + 0.00557021103896122*G0_0_0_1_2 + 0.062742491883119*G0_0_0_1_3 - 0.0276318993506503*G0_0_0_1_4 - 0.00758827110389636*G0_0_0_1_5 + 0.00131493506493511*G0_0_0_1_6 - 0.0328003246753259*G0_0_0_1_7 + 0.0589163961038983*G0_0_0_1_8 + 0.00909496753246789*G0_0_0_1_9 - 0.00557021103896122*G0_0_0_2_0 + 0.00557021103896122*G0_0_0_2_1 + 0.0100994318181822*G0_0_0_2_3 - 0.00381696428571441*G0_0_0_2_4 - 0.0100994318181822*G0_0_0_2_5 + 0.00381696428571442*G0_0_0_2_6 - 0.00668425324675348*G0_0_0_2_7 + 0.00668425324675348*G0_0_0_2_8 + 0.00758827110389641*G0_0_0_3_0 + 0.062742491883119*G0_0_0_3_1 + 0.0100994318181822*G0_0_0_3_2 + 0.105194805194809*G0_0_0_3_3 - 0.0452008928571444*G0_0_0_3_4 - 0.00394480519480534*G0_0_0_3_6 - 0.0227648133116892*G0_0_0_3_7 + 0.0428175730519497*G0_0_0_3_8 + 0.0182447240259748*G0_0_0_3_9 - 0.00131493506493512*G0_0_0_4_0 - 0.0276318993506503*G0_0_0_4_1 - 0.00381696428571441*G0_0_0_4_2 - 0.0452008928571444*G0_0_0_4_3 + 0.00558847402597418*G0_0_0_4_4 + 0.00394480519480535*G0_0_0_4_5 + 0.0119987824675329*G0_0_0_4_7 - 0.0200527597402605*G0_0_0_4_8 - 0.0078896103896107*G0_0_0_4_9 - 0.062742491883119*G0_0_0_5_0 - 0.00758827110389636*G0_0_0_5_1 - 0.0100994318181822*G0_0_0_5_2 + 0.00394480519480535*G0_0_0_5_4 - 0.105194805194809*G0_0_0_5_5 + 0.0452008928571443*G0_0_0_5_6 - 0.0428175730519495*G0_0_0_5_7 + 0.0227648133116891*G0_0_0_5_8 - 0.0182447240259747*G0_0_0_5_9 + 0.0276318993506503*G0_0_0_6_0 + 0.00131493506493511*G0_0_0_6_1 + 0.00381696428571442*G0_0_0_6_2 - 0.00394480519480534*G0_0_0_6_3 + 0.0452008928571443*G0_0_0_6_5 - 0.00558847402597417*G0_0_0_6_6 + 0.0200527597402604*G0_0_0_6_7 - 0.0119987824675329*G0_0_0_6_8 + 0.00788961038961067*G0_0_0_6_9 - 0.0589163961038981*G0_0_0_7_0 - 0.0328003246753259*G0_0_0_7_1 - 0.00668425324675348*G0_0_0_7_2 - 0.0227648133116892*G0_0_0_7_3 + 0.0119987824675329*G0_0_0_7_4 - 0.0428175730519495*G0_0_0_7_5 + 0.0200527597402604*G0_0_0_7_6 - 0.0330377435064945*G0_0_0_7_7 - 0.0128206168831174*G0_0_0_7_9 + 0.0328003246753258*G0_0_0_8_0 + 0.0589163961038983*G0_0_0_8_1 + 0.00668425324675349*G0_0_0_8_2 + 0.0428175730519497*G0_0_0_8_3 - 0.0200527597402605*G0_0_0_8_4 + 0.0227648133116891*G0_0_0_8_5 - 0.0119987824675329*G0_0_0_8_6 + 0.0330377435064948*G0_0_0_8_8 + 0.0128206168831174*G0_0_0_8_9 - 0.00909496753246787*G0_0_0_9_0 + 0.00909496753246788*G0_0_0_9_1 + 0.0182447240259748*G0_0_0_9_3 - 0.0078896103896107*G0_0_0_9_4 - 0.0182447240259747*G0_0_0_9_5 + 0.00788961038961067*G0_0_0_9_6 - 0.0128206168831174*G0_0_0_9_7 + 0.0128206168831174*G0_0_0_9_8 + 0.015767045454546*G0_0_1_0_0 + 0.00169237012987019*G0_0_1_0_1 + 0.00132102272727277*G0_0_1_0_2 - 0.00188108766233773*G0_0_1_0_3 - 0.000949675324675362*G0_0_1_0_4 + 0.011870941558442*G0_0_1_0_5 - 0.00593547077922098*G0_0_1_0_6 + 0.023741883116884*G0_0_1_0_7 - 0.00995332792207828*G0_0_1_0_8 + 0.00383522727272741*G0_0_1_0_9 + 0.00169237012987019*G0_0_1_1_0 - 0.00904017857142887*G0_0_1_1_1 - 0.000210024350649356*G0_0_1_1_2 - 0.00712256493506517*G0_0_1_1_3 + 0.00257508116883125*G0_0_1_1_4 + 0.00389914772727286*G0_0_1_1_5 - 0.00242897727272735*G0_0_1_1_6 + 0.00898538961038993*G0_0_1_1_7 - 0.00465706168831186*G0_0_1_1_8 + 0.00295860389610399*G0_0_1_1_9 + 0.00132102272727277*G0_0_1_2_0 - 0.000210024350649356*G0_0_1_2_1 - 0.000529626623376646*G0_0_1_2_2 - 0.00159801136363641*G0_0_1_2_3 + 0.000292207792207797*G0_0_1_2_4 + 0.00389914772727286*G0_0_1_2_5 - 0.00147017045454551*G0_0_1_2_6 + 0.00554281655844175*G0_0_1_2_7 - 0.00393567370129883*G0_0_1_2_8 + 0.0010409902597403*G0_0_1_2_9 - 0.00188108766233773*G0_0_1_3_0 - 0.00712256493506517*G0_0_1_3_1 - 0.00159801136363641*G0_0_1_3_2 - 0.0424066558441573*G0_0_1_3_3 + 0.0076430600649353*G0_0_1_3_4 - 0.00106838474025978*G0_0_1_3_5 + 0.00336952110389622*G0_0_1_3_6 + 0.00172585227272732*G0_0_1_3_7 - 0.00961546266233799*G0_0_1_3_8 - 0.0123275162337667*G0_0_1_3_9 - 0.000949675324675362*G0_0_1_4_0 + 0.00257508116883125*G0_0_1_4_1 + 0.000292207792207797*G0_0_1_4_2 + 0.0076430600649353*G0_0_1_4_3 - 0.0202171266233773*G0_0_1_4_4 - 0.00106838474025978*G0_0_1_4_5 - 0.00230113636363644*G0_0_1_4_6 - 0.00493100649350667*G0_0_1_4_7 + 0.00788961038961067*G0_0_1_4_8 - 0.000986201298701332*G0_0_1_4_9 + 0.011870941558442*G0_0_1_5_0 + 0.00389914772727286*G0_0_1_5_1 + 0.00389914772727286*G0_0_1_5_2 - 0.00106838474025978*G0_0_1_5_3 - 0.00106838474025978*G0_0_1_5_4 + 0.0361607142857155*G0_0_1_5_5 - 0.0156148538961044*G0_0_1_5_6 + 0.0361607142857155*G0_0_1_5_7 - 0.0156148538961044*G0_0_1_5_8 + 0.0197240259740267*G0_0_1_5_9 - 0.00593547077922098*G0_0_1_6_0 - 0.00242897727272735*G0_0_1_6_1 - 0.00147017045454551*G0_0_1_6_2 + 0.00336952110389622*G0_0_1_6_3 - 0.00230113636363644*G0_0_1_6_4 - 0.0156148538961044*G0_0_1_6_5 + 0.00410917207792223*G0_0_1_6_6 - 0.0205458603896111*G0_0_1_6_7 + 0.0115056818181822*G0_0_1_6_8 - 0.00986201298701334*G0_0_1_6_9 + 0.023741883116884*G0_0_1_7_0 + 0.00898538961038993*G0_0_1_7_1 + 0.00554281655844175*G0_0_1_7_2 + 0.00172585227272732*G0_0_1_7_3 - 0.00493100649350668*G0_0_1_7_4 + 0.0361607142857155*G0_0_1_7_5 - 0.0205458603896111*G0_0_1_7_6 + 0.108482142857147*G0_0_1_7_7 - 0.0320515422077934*G0_0_1_7_8 + 0.02958603896104*G0_0_1_7_9 - 0.00995332792207828*G0_0_1_8_0 - 0.00465706168831186*G0_0_1_8_1 - 0.00393567370129883*G0_0_1_8_2 - 0.00961546266233799*G0_0_1_8_3 + 0.00788961038961067*G0_0_1_8_4 - 0.0156148538961044*G0_0_1_8_5 + 0.0115056818181822*G0_0_1_8_6 - 0.0320515422077934*G0_0_1_8_7 - 0.0123275162337667*G0_0_1_8_8 - 0.0246550324675333*G0_0_1_8_9 + 0.00383522727272741*G0_0_1_9_0 + 0.00295860389610399*G0_0_1_9_1 + 0.0010409902597403*G0_0_1_9_2 - 0.0123275162337667*G0_0_1_9_3 - 0.000986201298701333*G0_0_1_9_4 + 0.0197240259740267*G0_0_1_9_5 - 0.00986201298701334*G0_0_1_9_6 + 0.02958603896104*G0_0_1_9_7 - 0.0246550324675333*G0_0_1_9_8 - 0.0394480519480532*G0_0_1_9_9 - 0.107836850649354*G0_1_0_0_0 + 0.00169237012987023*G0_1_0_0_1 - 0.00578023538961058*G0_1_0_0_2 + 0.0114874188311693*G0_1_0_0_3 - 0.00374391233766248*G0_1_0_0_4 - 0.0698650568181841*G0_1_0_0_5 + 0.0302069805194815*G0_1_0_0_6 - 0.06357345779221*G0_1_0_0_7 + 0.0417857142857158*G0_1_0_0_8 - 0.00613636363636387*G0_1_0_0_9 + 0.00169237012987023*G0_1_0_1_0 + 0.114563717532472*G0_1_0_1_1 + 0.006891233766234*G0_1_0_1_2 + 0.074613433441561*G0_1_0_1_3 - 0.0335673701298713*G0_1_0_1_4 - 0.00946935876623409*G0_1_0_1_5 + 0.000365259740259748*G0_1_0_1_6 - 0.0427536525974042*G0_1_0_1_7 + 0.0826582792207823*G0_1_0_1_8 + 0.0129301948051953*G0_1_0_1_9 - 0.00578023538961058*G0_1_0_2_0 + 0.006891233766234*G0_1_0_2_1 - 0.000529626623376635*G0_1_0_2_2 + 0.013998579545455*G0_1_0_2_3 - 0.00528713474025992*G0_1_0_2_4 - 0.0116974431818186*G0_1_0_2_5 + 0.00410917207792222*G0_1_0_2_6 - 0.0106199269480523*G0_1_0_2_7 + 0.0122270698051952*G0_1_0_2_8 + 0.0010409902597403*G0_1_0_2_9 + 0.0114874188311693*G0_1_0_3_0 + 0.074613433441561*G0_1_0_3_1 + 0.013998579545455*G0_1_0_3_2 + 0.141355519480525*G0_1_0_3_3 - 0.0608157467532489*G0_1_0_3_4 - 0.0010683847402598*G0_1_0_3_5 - 0.00501318993506513*G0_1_0_3_6 - 0.0383796672077937*G0_1_0_3_7 + 0.0789782873376653*G0_1_0_3_8 + 0.0379687500000015*G0_1_0_3_9 - 0.00374391233766248*G0_1_0_4_0 - 0.0335673701298713*G0_1_0_4_1 - 0.00528713474025992*G0_1_0_4_2 - 0.0608157467532489*G0_1_0_4_3 + 0.00969764610389642*G0_1_0_4_4 + 0.00731432629870157*G0_1_0_4_5 - 0.00230113636363644*G0_1_0_4_6 + 0.0235044642857151*G0_1_0_4_7 - 0.0405986201298716*G0_1_0_4_8 - 0.017751623376624*G0_1_0_4_9 - 0.0698650568181841*G0_1_0_5_0 - 0.00946935876623409*G0_1_0_5_1 - 0.0116974431818186*G0_1_0_5_2 - 0.0010683847402598*G0_1_0_5_3 + 0.00731432629870157*G0_1_0_5_4 - 0.147601461038966*G0_1_0_5_5 + 0.0528439529220797*G0_1_0_5_6 - 0.0524330357142875*G0_1_0_5_7 + 0.0244906655844164*G0_1_0_5_8 - 0.0305722402597414*G0_1_0_5_9 + 0.0302069805194815*G0_1_0_6_0 + 0.000365259740259749*G0_1_0_6_1 + 0.00410917207792222*G0_1_0_6_2 - 0.00501318993506513*G0_1_0_6_3 - 0.00230113636363644*G0_1_0_6_4 + 0.0528439529220797*G0_1_0_6_5 - 0.0258056006493515*G0_1_0_6_6 + 0.0279423701298711*G0_1_0_6_7 - 0.0169297889610395*G0_1_0_6_8 + 0.00690340909090934*G0_1_0_6_9 - 0.06357345779221*G0_1_0_7_0 - 0.0427536525974042*G0_1_0_7_1 - 0.0106199269480523*G0_1_0_7_2 - 0.0383796672077937*G0_1_0_7_3 + 0.0235044642857151*G0_1_0_7_4 - 0.0524330357142875*G0_1_0_7_5 + 0.0279423701298711*G0_1_0_7_6 - 0.0453652597402612*G0_1_0_7_7 - 0.0320515422077935*G0_1_0_7_8 - 0.0374756493506507*G0_1_0_7_9 + 0.0417857142857158*G0_1_0_8_0 + 0.0826582792207823*G0_1_0_8_1 + 0.0122270698051952*G0_1_0_8_2 + 0.0789782873376653*G0_1_0_8_3 - 0.0405986201298716*G0_1_0_8_4 + 0.0244906655844164*G0_1_0_8_5 - 0.0169297889610395*G0_1_0_8_6 - 0.0320515422077935*G0_1_0_8_7 + 0.141519886363642*G0_1_0_8_8 + 0.0424066558441574*G0_1_0_8_9 - 0.00613636363636388*G0_1_0_9_0 + 0.0129301948051953*G0_1_0_9_1 + 0.0010409902597403*G0_1_0_9_2 + 0.0379687500000015*G0_1_0_9_3 - 0.017751623376624*G0_1_0_9_4 - 0.0305722402597414*G0_1_0_9_5 + 0.00690340909090934*G0_1_0_9_6 - 0.0374756493506507*G0_1_0_9_7 + 0.0424066558441574*G0_1_0_9_8 - 0.0394480519480532*G0_1_0_9_9 + 0.015767045454546*G0_1_1_0_0 + 0.00169237012987019*G0_1_1_0_1 + 0.00132102272727277*G0_1_1_0_2 - 0.00188108766233773*G0_1_1_0_3 - 0.000949675324675362*G0_1_1_0_4 + 0.011870941558442*G0_1_1_0_5 - 0.00593547077922098*G0_1_1_0_6 + 0.023741883116884*G0_1_1_0_7 - 0.00995332792207828*G0_1_1_0_8 + 0.00383522727272741*G0_1_1_0_9 + 0.00169237012987019*G0_1_1_1_0 - 0.00904017857142886*G0_1_1_1_1 - 0.000210024350649356*G0_1_1_1_2 - 0.00712256493506516*G0_1_1_1_3 + 0.00257508116883124*G0_1_1_1_4 + 0.00389914772727286*G0_1_1_1_5 - 0.00242897727272736*G0_1_1_1_6 + 0.00898538961038993*G0_1_1_1_7 - 0.00465706168831186*G0_1_1_1_8 + 0.00295860389610399*G0_1_1_1_9 + 0.00132102272727277*G0_1_1_2_0 - 0.000210024350649356*G0_1_1_2_1 - 0.000529626623376646*G0_1_1_2_2 - 0.00159801136363641*G0_1_1_2_3 + 0.000292207792207796*G0_1_1_2_4 + 0.00389914772727286*G0_1_1_2_5 - 0.00147017045454551*G0_1_1_2_6 + 0.00554281655844175*G0_1_1_2_7 - 0.00393567370129883*G0_1_1_2_8 + 0.0010409902597403*G0_1_1_2_9 - 0.00188108766233773*G0_1_1_3_0 - 0.00712256493506516*G0_1_1_3_1 - 0.00159801136363641*G0_1_1_3_2 - 0.0424066558441572*G0_1_1_3_3 + 0.00764306006493529*G0_1_1_3_4 - 0.00106838474025978*G0_1_1_3_5 + 0.00336952110389622*G0_1_1_3_6 + 0.00172585227272732*G0_1_1_3_7 - 0.00961546266233798*G0_1_1_3_8 - 0.0123275162337667*G0_1_1_3_9 - 0.000949675324675362*G0_1_1_4_0 + 0.00257508116883124*G0_1_1_4_1 + 0.000292207792207796*G0_1_1_4_2 + 0.00764306006493529*G0_1_1_4_3 - 0.0202171266233773*G0_1_1_4_4 - 0.00106838474025978*G0_1_1_4_5 - 0.00230113636363644*G0_1_1_4_6 - 0.00493100649350668*G0_1_1_4_7 + 0.00788961038961066*G0_1_1_4_8 - 0.000986201298701344*G0_1_1_4_9 + 0.011870941558442*G0_1_1_5_0 + 0.00389914772727286*G0_1_1_5_1 + 0.00389914772727286*G0_1_1_5_2 - 0.00106838474025978*G0_1_1_5_3 - 0.00106838474025978*G0_1_1_5_4 + 0.0361607142857155*G0_1_1_5_5 - 0.0156148538961044*G0_1_1_5_6 + 0.0361607142857155*G0_1_1_5_7 - 0.0156148538961044*G0_1_1_5_8 + 0.0197240259740267*G0_1_1_5_9 - 0.00593547077922098*G0_1_1_6_0 - 0.00242897727272736*G0_1_1_6_1 - 0.00147017045454551*G0_1_1_6_2 + 0.00336952110389622*G0_1_1_6_3 - 0.00230113636363644*G0_1_1_6_4 - 0.0156148538961044*G0_1_1_6_5 + 0.00410917207792223*G0_1_1_6_6 - 0.0205458603896111*G0_1_1_6_7 + 0.0115056818181822*G0_1_1_6_8 - 0.00986201298701334*G0_1_1_6_9 + 0.023741883116884*G0_1_1_7_0 + 0.00898538961038993*G0_1_1_7_1 + 0.00554281655844175*G0_1_1_7_2 + 0.00172585227272732*G0_1_1_7_3 - 0.00493100649350668*G0_1_1_7_4 + 0.0361607142857155*G0_1_1_7_5 - 0.0205458603896111*G0_1_1_7_6 + 0.108482142857147*G0_1_1_7_7 - 0.0320515422077934*G0_1_1_7_8 + 0.02958603896104*G0_1_1_7_9 - 0.00995332792207828*G0_1_1_8_0 - 0.00465706168831186*G0_1_1_8_1 - 0.00393567370129883*G0_1_1_8_2 - 0.00961546266233798*G0_1_1_8_3 + 0.00788961038961066*G0_1_1_8_4 - 0.0156148538961044*G0_1_1_8_5 + 0.0115056818181822*G0_1_1_8_6 - 0.0320515422077934*G0_1_1_8_7 - 0.0123275162337666*G0_1_1_8_8 - 0.0246550324675333*G0_1_1_8_9 + 0.00383522727272741*G0_1_1_9_0 + 0.00295860389610399*G0_1_1_9_1 + 0.0010409902597403*G0_1_1_9_2 - 0.0123275162337667*G0_1_1_9_3 - 0.000986201298701343*G0_1_1_9_4 + 0.0197240259740267*G0_1_1_9_5 - 0.00986201298701334*G0_1_1_9_6 + 0.02958603896104*G0_1_1_9_7 - 0.0246550324675333*G0_1_1_9_8 - 0.0394480519480532*G0_1_1_9_9; + A[70] = A[7] - 0.124736201298706*G0_0_1_0_0 - 0.0082335633116886*G0_0_1_0_1 - 0.00823356331168859*G0_0_1_0_2 + 0.002237215909091*G0_0_1_0_3 + 0.002237215909091*G0_0_1_0_4 - 0.0808137175324702*G0_0_1_0_5 + 0.0367086038961051*G0_0_1_0_6 - 0.0808137175324703*G0_0_1_0_7 + 0.0367086038961052*G0_0_1_0_8 - 0.01479301948052*G0_0_1_0_9 - 0.00823356331168859*G0_0_1_1_0 - 0.00113230519480523*G0_0_1_1_1 - 0.00113230519480523*G0_0_1_1_2 + 0.000922280844155883*G0_0_1_1_3 + 0.000566152597402617*G0_0_1_1_4 - 0.011131290584416*G0_0_1_1_5 + 0.00503145292207809*G0_0_1_1_6 - 0.0150304383116888*G0_0_1_1_7 + 0.00650162337662361*G0_0_1_1_8 - 0.00482142857142874*G0_0_1_1_9 - 0.00823356331168859*G0_0_1_2_0 - 0.00113230519480523*G0_0_1_2_1 - 0.00113230519480523*G0_0_1_2_2 + 0.000566152597402618*G0_0_1_2_3 + 0.000922280844155878*G0_0_1_2_4 - 0.0150304383116888*G0_0_1_2_5 + 0.0065016233766236*G0_0_1_2_6 - 0.011131290584416*G0_0_1_2_7 + 0.00503145292207809*G0_0_1_2_8 - 0.00482142857142874*G0_0_1_2_9 + 0.002237215909091*G0_0_1_3_0 + 0.000922280844155883*G0_0_1_3_1 + 0.000566152597402618*G0_0_1_3_2 + 0.00131493506493514*G0_0_1_3_3 - 0.00065746753246756*G0_0_1_3_4 + 0.00723214285714309*G0_0_1_3_5 - 0.00287642045454555*G0_0_1_3_6 + 0.00550629058441579*G0_0_1_3_7 - 0.00262987012987022*G0_0_1_3_8 + 0.00345170454545467*G0_0_1_3_9 + 0.002237215909091*G0_0_1_4_0 + 0.000566152597402617*G0_0_1_4_1 + 0.000922280844155878*G0_0_1_4_2 - 0.00065746753246756*G0_0_1_4_3 + 0.00131493506493509*G0_0_1_4_4 + 0.0055062905844158*G0_0_1_4_5 - 0.00262987012987023*G0_0_1_4_6 + 0.00723214285714312*G0_0_1_4_7 - 0.00287642045454557*G0_0_1_4_8 + 0.00345170454545467*G0_0_1_4_9 - 0.0808137175324702*G0_0_1_5_0 - 0.011131290584416*G0_0_1_5_1 - 0.0150304383116888*G0_0_1_5_2 + 0.00723214285714309*G0_0_1_5_3 + 0.0055062905844158*G0_0_1_5_4 - 0.182447240259746*G0_0_1_5_5 + 0.0678013392857165*G0_0_1_5_6 - 0.0912236201298732*G0_0_1_5_7 + 0.0456118100649366*G0_0_1_5_8 - 0.0468445616883134*G0_0_1_5_9 + 0.0367086038961051*G0_0_1_6_0 + 0.00503145292207809*G0_0_1_6_1 + 0.0065016233766236*G0_0_1_6_2 - 0.00287642045454555*G0_0_1_6_3 - 0.00262987012987023*G0_0_1_6_4 + 0.0678013392857165*G0_0_1_6_5 - 0.0285998376623386*G0_0_1_6_6 + 0.0456118100649366*G0_0_1_6_7 - 0.0212033279220786*G0_0_1_6_8 + 0.0202171266233773*G0_0_1_6_9 - 0.0808137175324703*G0_0_1_7_0 - 0.0150304383116888*G0_0_1_7_1 - 0.011131290584416*G0_0_1_7_2 + 0.00550629058441579*G0_0_1_7_3 + 0.00723214285714313*G0_0_1_7_4 - 0.0912236201298732*G0_0_1_7_5 + 0.0456118100649366*G0_0_1_7_6 - 0.182447240259747*G0_0_1_7_7 + 0.0678013392857167*G0_0_1_7_8 - 0.0468445616883134*G0_0_1_7_9 + 0.0367086038961052*G0_0_1_8_0 + 0.00650162337662361*G0_0_1_8_1 + 0.00503145292207809*G0_0_1_8_2 - 0.00262987012987022*G0_0_1_8_3 - 0.00287642045454557*G0_0_1_8_4 + 0.0456118100649366*G0_0_1_8_5 - 0.0212033279220786*G0_0_1_8_6 + 0.0678013392857167*G0_0_1_8_7 - 0.0285998376623386*G0_0_1_8_8 + 0.0202171266233774*G0_0_1_8_9 - 0.01479301948052*G0_0_1_9_0 - 0.00482142857142874*G0_0_1_9_1 - 0.00482142857142874*G0_0_1_9_2 + 0.00345170454545467*G0_0_1_9_3 + 0.00345170454545467*G0_0_1_9_4 - 0.0468445616883134*G0_0_1_9_5 + 0.0202171266233773*G0_0_1_9_6 - 0.0468445616883134*G0_0_1_9_7 + 0.0202171266233774*G0_0_1_9_8 - 0.0256412337662347*G0_0_1_9_9 + 0.124736201298706*G0_1_0_0_0 + 0.0082335633116886*G0_1_0_0_1 + 0.00823356331168859*G0_1_0_0_2 - 0.002237215909091*G0_1_0_0_3 - 0.002237215909091*G0_1_0_0_4 + 0.0808137175324702*G0_1_0_0_5 - 0.0367086038961051*G0_1_0_0_6 + 0.0808137175324703*G0_1_0_0_7 - 0.0367086038961052*G0_1_0_0_8 + 0.01479301948052*G0_1_0_0_9 + 0.0082335633116886*G0_1_0_1_0 + 0.00113230519480523*G0_1_0_1_1 + 0.00113230519480523*G0_1_0_1_2 - 0.000922280844155883*G0_1_0_1_3 - 0.000566152597402616*G0_1_0_1_4 + 0.011131290584416*G0_1_0_1_5 - 0.00503145292207809*G0_1_0_1_6 + 0.0150304383116888*G0_1_0_1_7 - 0.00650162337662361*G0_1_0_1_8 + 0.00482142857142874*G0_1_0_1_9 + 0.00823356331168859*G0_1_0_2_0 + 0.00113230519480523*G0_1_0_2_1 + 0.00113230519480523*G0_1_0_2_2 - 0.000566152597402618*G0_1_0_2_3 - 0.000922280844155878*G0_1_0_2_4 + 0.0150304383116888*G0_1_0_2_5 - 0.0065016233766236*G0_1_0_2_6 + 0.011131290584416*G0_1_0_2_7 - 0.00503145292207809*G0_1_0_2_8 + 0.00482142857142874*G0_1_0_2_9 - 0.002237215909091*G0_1_0_3_0 - 0.000922280844155882*G0_1_0_3_1 - 0.000566152597402618*G0_1_0_3_2 - 0.00131493506493514*G0_1_0_3_3 + 0.000657467532467561*G0_1_0_3_4 - 0.00723214285714309*G0_1_0_3_5 + 0.00287642045454555*G0_1_0_3_6 - 0.00550629058441579*G0_1_0_3_7 + 0.00262987012987022*G0_1_0_3_8 - 0.00345170454545467*G0_1_0_3_9 - 0.002237215909091*G0_1_0_4_0 - 0.000566152597402616*G0_1_0_4_1 - 0.000922280844155878*G0_1_0_4_2 + 0.000657467532467561*G0_1_0_4_3 - 0.00131493506493509*G0_1_0_4_4 - 0.0055062905844158*G0_1_0_4_5 + 0.00262987012987023*G0_1_0_4_6 - 0.00723214285714312*G0_1_0_4_7 + 0.00287642045454557*G0_1_0_4_8 - 0.00345170454545467*G0_1_0_4_9 + 0.0808137175324702*G0_1_0_5_0 + 0.011131290584416*G0_1_0_5_1 + 0.0150304383116888*G0_1_0_5_2 - 0.00723214285714309*G0_1_0_5_3 - 0.0055062905844158*G0_1_0_5_4 + 0.182447240259746*G0_1_0_5_5 - 0.0678013392857165*G0_1_0_5_6 + 0.0912236201298732*G0_1_0_5_7 - 0.0456118100649366*G0_1_0_5_8 + 0.0468445616883134*G0_1_0_5_9 - 0.0367086038961051*G0_1_0_6_0 - 0.00503145292207809*G0_1_0_6_1 - 0.0065016233766236*G0_1_0_6_2 + 0.00287642045454555*G0_1_0_6_3 + 0.00262987012987023*G0_1_0_6_4 - 0.0678013392857165*G0_1_0_6_5 + 0.0285998376623386*G0_1_0_6_6 - 0.0456118100649366*G0_1_0_6_7 + 0.0212033279220786*G0_1_0_6_8 - 0.0202171266233773*G0_1_0_6_9 + 0.0808137175324703*G0_1_0_7_0 + 0.0150304383116888*G0_1_0_7_1 + 0.011131290584416*G0_1_0_7_2 - 0.00550629058441579*G0_1_0_7_3 - 0.00723214285714312*G0_1_0_7_4 + 0.0912236201298732*G0_1_0_7_5 - 0.0456118100649366*G0_1_0_7_6 + 0.182447240259747*G0_1_0_7_7 - 0.0678013392857167*G0_1_0_7_8 + 0.0468445616883134*G0_1_0_7_9 - 0.0367086038961052*G0_1_0_8_0 - 0.00650162337662361*G0_1_0_8_1 - 0.0050314529220781*G0_1_0_8_2 + 0.00262987012987022*G0_1_0_8_3 + 0.00287642045454557*G0_1_0_8_4 - 0.0456118100649366*G0_1_0_8_5 + 0.0212033279220786*G0_1_0_8_6 - 0.0678013392857167*G0_1_0_8_7 + 0.0285998376623386*G0_1_0_8_8 - 0.0202171266233774*G0_1_0_8_9 + 0.01479301948052*G0_1_0_9_0 + 0.00482142857142874*G0_1_0_9_1 + 0.00482142857142874*G0_1_0_9_2 - 0.00345170454545467*G0_1_0_9_3 - 0.00345170454545467*G0_1_0_9_4 + 0.0468445616883134*G0_1_0_9_5 - 0.0202171266233773*G0_1_0_9_6 + 0.0468445616883134*G0_1_0_9_7 - 0.0202171266233774*G0_1_0_9_8 + 0.0256412337662347*G0_1_0_9_9; + A[5] = A[70] + 0.124736201298706*G0_0_0_0_0 + 0.00786221590909118*G0_0_0_0_1 + 0.008604910714286*G0_0_0_0_2 - 0.00130580357142862*G0_0_0_0_3 - 0.00316862824675337*G0_0_0_0_4 + 0.0926846590909121*G0_0_0_0_5 - 0.0407264610389624*G0_0_0_0_6 + 0.0689427759740283*G0_0_0_0_7 - 0.0326907467532479*G0_0_0_0_8 + 0.01479301948052*G0_0_0_0_9 + 0.00786221590909118*G0_0_0_1_0 + 0.00964285714285748*G0_0_0_1_1 + 0.00113230519480523*G0_0_0_1_2 + 0.0064924918831171*G0_0_0_1_3 - 0.0047392451298703*G0_0_0_1_4 + 0.0127749594155848*G0_0_0_1_5 - 0.00653814935064958*G0_0_0_1_6 + 0.00994419642857176*G0_0_0_1_7 - 0.00331473214285725*G0_0_0_1_8 + 0.00290381493506504*G0_0_0_1_9 + 0.008604910714286*G0_0_0_2_0 + 0.00113230519480523*G0_0_0_2_1 - 0.00737824675324702*G0_0_0_2_2 + 0.00360693993506506*G0_0_0_2_3 - 0.00833705357142887*G0_0_0_2_4 + 0.0201166801948059*G0_0_0_2_5 - 0.00968851461038995*G0_0_0_2_6 + 0.00948762175324707*G0_0_0_2_7 - 0.00352475649350661*G0_0_0_2_8 + 0.00673904220779245*G0_0_0_2_9 - 0.00130580357142862*G0_0_0_3_0 + 0.0064924918831171*G0_0_0_3_1 + 0.00360693993506506*G0_0_0_3_2 + 0.0208745941558449*G0_0_0_3_3 + 0.000657467532467566*G0_0_0_3_4 - 0.01109476461039*G0_0_0_3_5 + 0.00739650974025999*G0_0_0_3_6 - 0.00830052759740289*G0_0_0_3_7 + 0.00994419642857178*G0_0_0_3_8 + 0.00788961038961066*G0_0_0_3_9 - 0.00316862824675337*G0_0_0_4_0 - 0.00473924512987029*G0_0_0_4_1 - 0.00833705357142887*G0_0_0_4_2 + 0.000657467532467568*G0_0_0_4_3 - 0.0235044642857151*G0_0_0_4_4 - 0.00271205357142869*G0_0_0_4_5 - 0.00468445616883133*G0_0_0_4_6 - 0.00336952110389623*G0_0_0_4_7 - 0.00164366883116888*G0_0_0_4_8 - 0.01479301948052*G0_0_0_4_9 + 0.0926846590909121*G0_0_0_5_0 + 0.0127749594155848*G0_0_0_5_1 + 0.0201166801948059*G0_0_0_5_2 - 0.01109476461039*G0_0_0_5_3 - 0.00271205357142869*G0_0_0_5_4 + 0.254768668831177*G0_0_0_5_5 - 0.0842380275974054*G0_0_0_5_6 + 0.0912236201298732*G0_0_0_5_7 - 0.0505428165584433*G0_0_0_5_8 + 0.0567065746753267*G0_0_0_5_9 - 0.0407264610389624*G0_0_0_6_0 - 0.00653814935064958*G0_0_0_6_1 - 0.00968851461038995*G0_0_0_6_2 + 0.00739650974025999*G0_0_0_6_3 - 0.00468445616883133*G0_0_0_6_4 - 0.0842380275974054*G0_0_0_6_5 + 0.0121631493506497*G0_0_0_6_6 - 0.0406808035714299*G0_0_0_6_7 + 0.0212033279220786*G0_0_0_6_8 - 0.0350101461038973*G0_0_0_6_9 + 0.0689427759740283*G0_0_0_7_0 + 0.00994419642857176*G0_0_0_7_1 + 0.00948762175324707*G0_0_0_7_2 - 0.00830052759740289*G0_0_0_7_3 - 0.00336952110389623*G0_0_0_7_4 + 0.0912236201298732*G0_0_0_7_5 - 0.0406808035714299*G0_0_0_7_6 + 0.110125811688315*G0_0_0_7_7 - 0.0513646509740278*G0_0_0_7_8 + 0.0369825487013*G0_0_0_7_9 - 0.0326907467532479*G0_0_0_8_0 - 0.00331473214285725*G0_0_0_8_1 - 0.00352475649350661*G0_0_0_8_2 + 0.00994419642857178*G0_0_0_8_3 - 0.00164366883116888*G0_0_0_8_4 - 0.0505428165584433*G0_0_0_8_5 + 0.0212033279220786*G0_0_0_8_6 - 0.0513646509740278*G0_0_0_8_7 + 0.0450365259740276*G0_0_0_8_8 - 0.00542410714285737*G0_0_0_8_9 + 0.01479301948052*G0_0_0_9_0 + 0.00290381493506504*G0_0_0_9_1 + 0.00673904220779245*G0_0_0_9_2 + 0.00788961038961066*G0_0_0_9_3 - 0.01479301948052*G0_0_0_9_4 + 0.0567065746753267*G0_0_0_9_5 - 0.0350101461038973*G0_0_0_9_6 + 0.0369825487013*G0_0_0_9_7 - 0.00542410714285736*G0_0_0_9_8 + 0.0256412337662347*G0_0_0_9_9 - 0.000371347402597417*G0_0_1_0_1 + 0.000371347402597415*G0_0_1_0_2 + 0.00093141233766238*G0_0_1_0_3 - 0.000931412337662377*G0_0_1_0_4 + 0.0118709415584419*G0_0_1_0_5 - 0.00401785714285727*G0_0_1_0_6 - 0.011870941558442*G0_0_1_0_7 + 0.00401785714285731*G0_0_1_0_8 - 0.000371347402597418*G0_0_1_1_0 + 0.00851055194805223*G0_0_1_1_1 + 0.00741477272727297*G0_0_1_1_3 - 0.00417309253246767*G0_0_1_1_4 + 0.00164366883116888*G0_0_1_1_5 - 0.00150669642857148*G0_0_1_1_6 - 0.00508624188311707*G0_0_1_1_7 + 0.00318689123376636*G0_0_1_1_8 - 0.0019176136363637*G0_0_1_1_9 + 0.000371347402597414*G0_0_1_2_0 - 0.00851055194805225*G0_0_1_2_2 + 0.00417309253246768*G0_0_1_2_3 - 0.00741477272727299*G0_0_1_2_4 + 0.00508624188311706*G0_0_1_2_5 - 0.00318689123376636*G0_0_1_2_6 - 0.00164366883116889*G0_0_1_2_7 + 0.00150669642857148*G0_0_1_2_8 + 0.0019176136363637*G0_0_1_2_9 + 0.00093141233766238*G0_0_1_3_0 + 0.00741477272727297*G0_0_1_3_1 + 0.00417309253246768*G0_0_1_3_2 + 0.02218952922078*G0_0_1_3_3 - 0.00386262175324688*G0_0_1_3_5 + 0.00452008928571444*G0_0_1_3_6 - 0.0027942370129871*G0_0_1_3_7 + 0.00731432629870155*G0_0_1_3_8 + 0.0113413149350653*G0_0_1_3_9 - 0.000931412337662377*G0_0_1_4_0 - 0.00417309253246767*G0_0_1_4_1 - 0.00741477272727299*G0_0_1_4_2 - 0.02218952922078*G0_0_1_4_4 + 0.00279423701298711*G0_0_1_4_5 - 0.00731432629870156*G0_0_1_4_6 + 0.0038626217532469*G0_0_1_4_7 - 0.00452008928571444*G0_0_1_4_8 - 0.0113413149350653*G0_0_1_4_9 + 0.0118709415584419*G0_0_1_5_0 + 0.00164366883116888*G0_0_1_5_1 + 0.00508624188311706*G0_0_1_5_2 - 0.00386262175324688*G0_0_1_5_3 + 0.00279423701298711*G0_0_1_5_4 + 0.072321428571431*G0_0_1_5_5 - 0.0164366883116888*G0_0_1_5_6 - 0.00493100649350666*G0_0_1_5_8 + 0.00986201298701333*G0_0_1_5_9 - 0.00401785714285727*G0_0_1_6_0 - 0.00150669642857148*G0_0_1_6_1 - 0.00318689123376636*G0_0_1_6_2 + 0.00452008928571444*G0_0_1_6_3 - 0.00731432629870156*G0_0_1_6_4 - 0.0164366883116888*G0_0_1_6_5 - 0.0164366883116889*G0_0_1_6_6 + 0.00493100649350667*G0_0_1_6_7 - 0.01479301948052*G0_0_1_6_9 - 0.011870941558442*G0_0_1_7_0 - 0.00508624188311707*G0_0_1_7_1 - 0.00164366883116889*G0_0_1_7_2 - 0.0027942370129871*G0_0_1_7_3 + 0.0038626217532469*G0_0_1_7_4 + 0.00493100649350667*G0_0_1_7_6 - 0.0723214285714312*G0_0_1_7_7 + 0.0164366883116889*G0_0_1_7_8 - 0.00986201298701338*G0_0_1_7_9 + 0.00401785714285732*G0_0_1_8_0 + 0.00318689123376636*G0_0_1_8_1 + 0.00150669642857148*G0_0_1_8_2 + 0.00731432629870155*G0_0_1_8_3 - 0.00452008928571444*G0_0_1_8_4 - 0.00493100649350666*G0_0_1_8_5 + 0.0164366883116889*G0_0_1_8_7 + 0.0164366883116889*G0_0_1_8_8 + 0.01479301948052*G0_0_1_8_9 - 0.0019176136363637*G0_0_1_9_1 + 0.0019176136363637*G0_0_1_9_2 + 0.0113413149350653*G0_0_1_9_3 - 0.0113413149350653*G0_0_1_9_4 + 0.00986201298701333*G0_0_1_9_5 - 0.01479301948052*G0_0_1_9_6 - 0.00986201298701338*G0_0_1_9_7 + 0.01479301948052*G0_0_1_9_8 - 0.000371347402597415*G0_1_0_0_1 + 0.000371347402597413*G0_1_0_0_2 + 0.00093141233766238*G0_1_0_0_3 - 0.000931412337662379*G0_1_0_0_4 + 0.011870941558442*G0_1_0_0_5 - 0.00401785714285729*G0_1_0_0_6 - 0.011870941558442*G0_1_0_0_7 + 0.00401785714285729*G0_1_0_0_8 - 0.000371347402597415*G0_1_0_1_0 + 0.00851055194805224*G0_1_0_1_1 + 0.00741477272727298*G0_1_0_1_3 - 0.00417309253246768*G0_1_0_1_4 + 0.00164366883116888*G0_1_0_1_5 - 0.00150669642857149*G0_1_0_1_6 - 0.00508624188311707*G0_1_0_1_7 + 0.00318689123376636*G0_1_0_1_8 - 0.0019176136363637*G0_1_0_1_9 + 0.000371347402597413*G0_1_0_2_0 - 0.00851055194805225*G0_1_0_2_2 + 0.00417309253246768*G0_1_0_2_3 - 0.00741477272727299*G0_1_0_2_4 + 0.00508624188311707*G0_1_0_2_5 - 0.00318689123376636*G0_1_0_2_6 - 0.00164366883116889*G0_1_0_2_7 + 0.00150669642857148*G0_1_0_2_8 + 0.0019176136363637*G0_1_0_2_9 + 0.00093141233766238*G0_1_0_3_0 + 0.00741477272727298*G0_1_0_3_1 + 0.00417309253246768*G0_1_0_3_2 + 0.02218952922078*G0_1_0_3_3 - 0.00386262175324688*G0_1_0_3_5 + 0.00452008928571444*G0_1_0_3_6 - 0.0027942370129871*G0_1_0_3_7 + 0.00731432629870156*G0_1_0_3_8 + 0.0113413149350653*G0_1_0_3_9 - 0.000931412337662379*G0_1_0_4_0 - 0.00417309253246768*G0_1_0_4_1 - 0.00741477272727299*G0_1_0_4_2 - 0.02218952922078*G0_1_0_4_4 + 0.00279423701298711*G0_1_0_4_5 - 0.00731432629870157*G0_1_0_4_6 + 0.00386262175324689*G0_1_0_4_7 - 0.00452008928571445*G0_1_0_4_8 - 0.0113413149350653*G0_1_0_4_9 + 0.011870941558442*G0_1_0_5_0 + 0.00164366883116888*G0_1_0_5_1 + 0.00508624188311707*G0_1_0_5_2 - 0.00386262175324688*G0_1_0_5_3 + 0.00279423701298711*G0_1_0_5_4 + 0.072321428571431*G0_1_0_5_5 - 0.0164366883116888*G0_1_0_5_6 - 0.00493100649350667*G0_1_0_5_8 + 0.00986201298701335*G0_1_0_5_9 - 0.00401785714285729*G0_1_0_6_0 - 0.00150669642857149*G0_1_0_6_1 - 0.00318689123376636*G0_1_0_6_2 + 0.00452008928571444*G0_1_0_6_3 - 0.00731432629870157*G0_1_0_6_4 - 0.0164366883116888*G0_1_0_6_5 - 0.0164366883116889*G0_1_0_6_6 + 0.00493100649350666*G0_1_0_6_7 - 0.01479301948052*G0_1_0_6_9 - 0.011870941558442*G0_1_0_7_0 - 0.00508624188311707*G0_1_0_7_1 - 0.00164366883116889*G0_1_0_7_2 - 0.0027942370129871*G0_1_0_7_3 + 0.00386262175324689*G0_1_0_7_4 + 0.00493100649350666*G0_1_0_7_6 - 0.0723214285714311*G0_1_0_7_7 + 0.0164366883116889*G0_1_0_7_8 - 0.00986201298701334*G0_1_0_7_9 + 0.00401785714285729*G0_1_0_8_0 + 0.00318689123376636*G0_1_0_8_1 + 0.00150669642857148*G0_1_0_8_2 + 0.00731432629870156*G0_1_0_8_3 - 0.00452008928571445*G0_1_0_8_4 - 0.00493100649350667*G0_1_0_8_5 + 0.0164366883116889*G0_1_0_8_7 + 0.0164366883116889*G0_1_0_8_8 + 0.01479301948052*G0_1_0_8_9 - 0.0019176136363637*G0_1_0_9_1 + 0.0019176136363637*G0_1_0_9_2 + 0.0113413149350653*G0_1_0_9_3 - 0.0113413149350653*G0_1_0_9_4 + 0.00986201298701335*G0_1_0_9_5 - 0.01479301948052*G0_1_0_9_6 - 0.00986201298701335*G0_1_0_9_7 + 0.01479301948052*G0_1_0_9_8 - 0.124736201298706*G0_1_1_0_0 - 0.00860491071428601*G0_1_1_0_1 - 0.00786221590909117*G0_1_1_0_2 + 0.00316862824675338*G0_1_1_0_3 + 0.00130580357142862*G0_1_1_0_4 - 0.0689427759740283*G0_1_1_0_5 + 0.0326907467532478*G0_1_1_0_6 - 0.0926846590909123*G0_1_1_0_7 + 0.0407264610389625*G0_1_1_0_8 - 0.01479301948052*G0_1_1_0_9 - 0.00860491071428602*G0_1_1_1_0 + 0.00737824675324699*G0_1_1_1_1 - 0.00113230519480524*G0_1_1_1_2 + 0.00833705357142885*G0_1_1_1_3 - 0.00360693993506505*G0_1_1_1_4 - 0.00948762175324708*G0_1_1_1_5 + 0.00352475649350661*G0_1_1_1_6 - 0.0201166801948059*G0_1_1_1_7 + 0.00968851461038996*G0_1_1_1_8 - 0.00673904220779244*G0_1_1_1_9 - 0.00786221590909117*G0_1_1_2_0 - 0.00113230519480524*G0_1_1_2_1 - 0.00964285714285748*G0_1_1_2_2 + 0.00473924512987029*G0_1_1_2_3 - 0.00649249188311712*G0_1_1_2_4 - 0.00994419642857176*G0_1_1_2_5 + 0.00331473214285724*G0_1_1_2_6 - 0.0127749594155849*G0_1_1_2_7 + 0.00653814935064958*G0_1_1_2_8 - 0.00290381493506505*G0_1_1_2_9 + 0.00316862824675338*G0_1_1_3_0 + 0.00833705357142885*G0_1_1_3_1 + 0.00473924512987029*G0_1_1_3_2 + 0.0235044642857151*G0_1_1_3_3 - 0.000657467532467532*G0_1_1_3_4 + 0.00336952110389622*G0_1_1_3_5 + 0.00164366883116889*G0_1_1_3_6 + 0.00271205357142869*G0_1_1_3_7 + 0.00468445616883132*G0_1_1_3_8 + 0.01479301948052*G0_1_1_3_9 + 0.00130580357142862*G0_1_1_4_0 - 0.00360693993506505*G0_1_1_4_1 - 0.00649249188311712*G0_1_1_4_2 - 0.000657467532467532*G0_1_1_4_3 - 0.0208745941558449*G0_1_1_4_4 + 0.00830052759740291*G0_1_1_4_5 - 0.0099441964285718*G0_1_1_4_6 + 0.01109476461039*G0_1_1_4_7 - 0.00739650974026001*G0_1_1_4_8 - 0.00788961038961065*G0_1_1_4_9 - 0.0689427759740283*G0_1_1_5_0 - 0.00948762175324708*G0_1_1_5_1 - 0.00994419642857176*G0_1_1_5_2 + 0.00336952110389622*G0_1_1_5_3 + 0.00830052759740291*G0_1_1_5_4 - 0.110125811688315*G0_1_1_5_5 + 0.0513646509740277*G0_1_1_5_6 - 0.0912236201298732*G0_1_1_5_7 + 0.04068080357143*G0_1_1_5_8 - 0.0369825487013*G0_1_1_5_9 + 0.0326907467532478*G0_1_1_6_0 + 0.00352475649350661*G0_1_1_6_1 + 0.00331473214285724*G0_1_1_6_2 + 0.00164366883116889*G0_1_1_6_3 - 0.0099441964285718*G0_1_1_6_4 + 0.0513646509740277*G0_1_1_6_5 - 0.0450365259740275*G0_1_1_6_6 + 0.0505428165584433*G0_1_1_6_7 - 0.0212033279220786*G0_1_1_6_8 + 0.00542410714285737*G0_1_1_6_9 - 0.0926846590909124*G0_1_1_7_0 - 0.0201166801948059*G0_1_1_7_1 - 0.0127749594155849*G0_1_1_7_2 + 0.00271205357142869*G0_1_1_7_3 + 0.01109476461039*G0_1_1_7_4 - 0.0912236201298732*G0_1_1_7_5 + 0.0505428165584433*G0_1_1_7_6 - 0.254768668831178*G0_1_1_7_7 + 0.0842380275974056*G0_1_1_7_8 - 0.0567065746753268*G0_1_1_7_9 + 0.0407264610389625*G0_1_1_8_0 + 0.00968851461038996*G0_1_1_8_1 + 0.00653814935064958*G0_1_1_8_2 + 0.00468445616883133*G0_1_1_8_3 - 0.00739650974026001*G0_1_1_8_4 + 0.04068080357143*G0_1_1_8_5 - 0.0212033279220786*G0_1_1_8_6 + 0.0842380275974056*G0_1_1_8_7 - 0.0121631493506498*G0_1_1_8_8 + 0.0350101461038973*G0_1_1_8_9 - 0.01479301948052*G0_1_1_9_0 - 0.00673904220779244*G0_1_1_9_1 - 0.00290381493506505*G0_1_1_9_2 + 0.01479301948052*G0_1_1_9_3 - 0.00788961038961065*G0_1_1_9_4 - 0.0369825487013*G0_1_1_9_5 + 0.00542410714285737*G0_1_1_9_6 - 0.0567065746753268*G0_1_1_9_7 + 0.0350101461038973*G0_1_1_9_8 - 0.0256412337662347*G0_1_1_9_9; + A[50] = A[5] + 0.124736201298706*G0_0_1_0_0 + 0.0082335633116886*G0_0_1_0_1 + 0.00823356331168858*G0_0_1_0_2 - 0.002237215909091*G0_0_1_0_3 - 0.002237215909091*G0_0_1_0_4 + 0.0808137175324702*G0_0_1_0_5 - 0.0367086038961051*G0_0_1_0_6 + 0.0808137175324704*G0_0_1_0_7 - 0.0367086038961052*G0_0_1_0_8 + 0.01479301948052*G0_0_1_0_9 + 0.0082335633116886*G0_0_1_1_0 + 0.00113230519480524*G0_0_1_1_1 + 0.00113230519480523*G0_0_1_1_2 - 0.000922280844155873*G0_0_1_1_3 - 0.00056615259740262*G0_0_1_1_4 + 0.011131290584416*G0_0_1_1_5 - 0.00503145292207809*G0_0_1_1_6 + 0.0150304383116888*G0_0_1_1_7 - 0.0065016233766236*G0_0_1_1_8 + 0.00482142857142874*G0_0_1_1_9 + 0.00823356331168858*G0_0_1_2_0 + 0.00113230519480523*G0_0_1_2_1 + 0.00113230519480523*G0_0_1_2_2 - 0.000566152597402616*G0_0_1_2_3 - 0.000922280844155878*G0_0_1_2_4 + 0.0150304383116888*G0_0_1_2_5 - 0.0065016233766236*G0_0_1_2_6 + 0.011131290584416*G0_0_1_2_7 - 0.00503145292207809*G0_0_1_2_8 + 0.00482142857142875*G0_0_1_2_9 - 0.002237215909091*G0_0_1_3_0 - 0.000922280844155873*G0_0_1_3_1 - 0.000566152597402616*G0_0_1_3_2 - 0.00131493506493513*G0_0_1_3_3 + 0.000657467532467556*G0_0_1_3_4 - 0.00723214285714309*G0_0_1_3_5 + 0.00287642045454556*G0_0_1_3_6 - 0.00550629058441579*G0_0_1_3_7 + 0.00262987012987022*G0_0_1_3_8 - 0.00345170454545467*G0_0_1_3_9 - 0.002237215909091*G0_0_1_4_0 - 0.00056615259740262*G0_0_1_4_1 - 0.000922280844155878*G0_0_1_4_2 + 0.000657467532467556*G0_0_1_4_3 - 0.00131493506493511*G0_0_1_4_4 - 0.0055062905844158*G0_0_1_4_5 + 0.00262987012987023*G0_0_1_4_6 - 0.00723214285714313*G0_0_1_4_7 + 0.00287642045454556*G0_0_1_4_8 - 0.00345170454545469*G0_0_1_4_9 + 0.0808137175324702*G0_0_1_5_0 + 0.011131290584416*G0_0_1_5_1 + 0.0150304383116888*G0_0_1_5_2 - 0.00723214285714309*G0_0_1_5_3 - 0.0055062905844158*G0_0_1_5_4 + 0.182447240259746*G0_0_1_5_5 - 0.0678013392857166*G0_0_1_5_6 + 0.0912236201298732*G0_0_1_5_7 - 0.0456118100649366*G0_0_1_5_8 + 0.0468445616883134*G0_0_1_5_9 - 0.0367086038961051*G0_0_1_6_0 - 0.00503145292207809*G0_0_1_6_1 - 0.0065016233766236*G0_0_1_6_2 + 0.00287642045454556*G0_0_1_6_3 + 0.00262987012987023*G0_0_1_6_4 - 0.0678013392857166*G0_0_1_6_5 + 0.0285998376623386*G0_0_1_6_6 - 0.0456118100649366*G0_0_1_6_7 + 0.0212033279220786*G0_0_1_6_8 - 0.0202171266233774*G0_0_1_6_9 + 0.0808137175324704*G0_0_1_7_0 + 0.0150304383116888*G0_0_1_7_1 + 0.011131290584416*G0_0_1_7_2 - 0.00550629058441579*G0_0_1_7_3 - 0.00723214285714313*G0_0_1_7_4 + 0.0912236201298732*G0_0_1_7_5 - 0.0456118100649366*G0_0_1_7_6 + 0.182447240259747*G0_0_1_7_7 - 0.0678013392857167*G0_0_1_7_8 + 0.0468445616883134*G0_0_1_7_9 - 0.0367086038961052*G0_0_1_8_0 - 0.0065016233766236*G0_0_1_8_1 - 0.00503145292207809*G0_0_1_8_2 + 0.00262987012987022*G0_0_1_8_3 + 0.00287642045454556*G0_0_1_8_4 - 0.0456118100649366*G0_0_1_8_5 + 0.0212033279220786*G0_0_1_8_6 - 0.0678013392857167*G0_0_1_8_7 + 0.0285998376623387*G0_0_1_8_8 - 0.0202171266233773*G0_0_1_8_9 + 0.01479301948052*G0_0_1_9_0 + 0.00482142857142874*G0_0_1_9_1 + 0.00482142857142875*G0_0_1_9_2 - 0.00345170454545467*G0_0_1_9_3 - 0.00345170454545469*G0_0_1_9_4 + 0.0468445616883134*G0_0_1_9_5 - 0.0202171266233774*G0_0_1_9_6 + 0.0468445616883134*G0_0_1_9_7 - 0.0202171266233773*G0_0_1_9_8 + 0.0256412337662347*G0_0_1_9_9 - 0.124736201298706*G0_1_0_0_0 - 0.0082335633116886*G0_1_0_0_1 - 0.00823356331168858*G0_1_0_0_2 + 0.002237215909091*G0_1_0_0_3 + 0.002237215909091*G0_1_0_0_4 - 0.0808137175324702*G0_1_0_0_5 + 0.0367086038961051*G0_1_0_0_6 - 0.0808137175324704*G0_1_0_0_7 + 0.0367086038961052*G0_1_0_0_8 - 0.01479301948052*G0_1_0_0_9 - 0.0082335633116886*G0_1_0_1_0 - 0.00113230519480524*G0_1_0_1_1 - 0.00113230519480523*G0_1_0_1_2 + 0.000922280844155873*G0_1_0_1_3 + 0.000566152597402621*G0_1_0_1_4 - 0.011131290584416*G0_1_0_1_5 + 0.00503145292207809*G0_1_0_1_6 - 0.0150304383116888*G0_1_0_1_7 + 0.0065016233766236*G0_1_0_1_8 - 0.00482142857142874*G0_1_0_1_9 - 0.00823356331168858*G0_1_0_2_0 - 0.00113230519480523*G0_1_0_2_1 - 0.00113230519480523*G0_1_0_2_2 + 0.000566152597402616*G0_1_0_2_3 + 0.000922280844155878*G0_1_0_2_4 - 0.0150304383116888*G0_1_0_2_5 + 0.0065016233766236*G0_1_0_2_6 - 0.011131290584416*G0_1_0_2_7 + 0.00503145292207809*G0_1_0_2_8 - 0.00482142857142875*G0_1_0_2_9 + 0.002237215909091*G0_1_0_3_0 + 0.000922280844155873*G0_1_0_3_1 + 0.000566152597402616*G0_1_0_3_2 + 0.00131493506493513*G0_1_0_3_3 - 0.000657467532467557*G0_1_0_3_4 + 0.00723214285714309*G0_1_0_3_5 - 0.00287642045454556*G0_1_0_3_6 + 0.00550629058441579*G0_1_0_3_7 - 0.00262987012987022*G0_1_0_3_8 + 0.00345170454545467*G0_1_0_3_9 + 0.002237215909091*G0_1_0_4_0 + 0.000566152597402621*G0_1_0_4_1 + 0.000922280844155879*G0_1_0_4_2 - 0.000657467532467556*G0_1_0_4_3 + 0.00131493506493512*G0_1_0_4_4 + 0.0055062905844158*G0_1_0_4_5 - 0.00262987012987023*G0_1_0_4_6 + 0.00723214285714313*G0_1_0_4_7 - 0.00287642045454556*G0_1_0_4_8 + 0.00345170454545469*G0_1_0_4_9 - 0.0808137175324702*G0_1_0_5_0 - 0.011131290584416*G0_1_0_5_1 - 0.0150304383116888*G0_1_0_5_2 + 0.00723214285714309*G0_1_0_5_3 + 0.0055062905844158*G0_1_0_5_4 - 0.182447240259746*G0_1_0_5_5 + 0.0678013392857166*G0_1_0_5_6 - 0.0912236201298732*G0_1_0_5_7 + 0.0456118100649366*G0_1_0_5_8 - 0.0468445616883134*G0_1_0_5_9 + 0.0367086038961051*G0_1_0_6_0 + 0.00503145292207809*G0_1_0_6_1 + 0.0065016233766236*G0_1_0_6_2 - 0.00287642045454556*G0_1_0_6_3 - 0.00262987012987023*G0_1_0_6_4 + 0.0678013392857166*G0_1_0_6_5 - 0.0285998376623386*G0_1_0_6_6 + 0.0456118100649366*G0_1_0_6_7 - 0.0212033279220786*G0_1_0_6_8 + 0.0202171266233774*G0_1_0_6_9 - 0.0808137175324704*G0_1_0_7_0 - 0.0150304383116888*G0_1_0_7_1 - 0.011131290584416*G0_1_0_7_2 + 0.00550629058441579*G0_1_0_7_3 + 0.00723214285714313*G0_1_0_7_4 - 0.0912236201298732*G0_1_0_7_5 + 0.0456118100649366*G0_1_0_7_6 - 0.182447240259747*G0_1_0_7_7 + 0.0678013392857167*G0_1_0_7_8 - 0.0468445616883134*G0_1_0_7_9 + 0.0367086038961052*G0_1_0_8_0 + 0.0065016233766236*G0_1_0_8_1 + 0.00503145292207809*G0_1_0_8_2 - 0.00262987012987022*G0_1_0_8_3 - 0.00287642045454556*G0_1_0_8_4 + 0.0456118100649366*G0_1_0_8_5 - 0.0212033279220786*G0_1_0_8_6 + 0.0678013392857167*G0_1_0_8_7 - 0.0285998376623387*G0_1_0_8_8 + 0.0202171266233774*G0_1_0_8_9 - 0.01479301948052*G0_1_0_9_0 - 0.00482142857142874*G0_1_0_9_1 - 0.00482142857142875*G0_1_0_9_2 + 0.00345170454545467*G0_1_0_9_3 + 0.00345170454545469*G0_1_0_9_4 - 0.0468445616883134*G0_1_0_9_5 + 0.0202171266233774*G0_1_0_9_6 - 0.0468445616883134*G0_1_0_9_7 + 0.0202171266233774*G0_1_0_9_8 - 0.0256412337662347*G0_1_0_9_9; + A[44] = -A[64] + 0.00171672077922087*G0_1_0_0_0 - 0.000127840909090913*G0_1_0_0_1 - 0.00904017857142893*G0_1_0_0_2 + 0.00205458603896113*G0_1_0_0_3 + 0.00180803571428577*G0_1_0_0_4 + 0.000904017857142924*G0_1_0_0_5 - 0.00673904220779247*G0_1_0_0_6 - 0.000493100649350676*G0_1_0_0_8 + 0.00690340909090936*G0_1_0_0_9 - 0.000127840909090913*G0_1_0_1_0 + 0.00171672077922087*G0_1_0_1_1 - 0.00904017857142891*G0_1_0_1_2 + 0.000904017857142896*G0_1_0_1_3 - 0.00673904220779247*G0_1_0_1_4 + 0.00205458603896112*G0_1_0_1_5 + 0.00180803571428575*G0_1_0_1_6 - 0.00049310064935067*G0_1_0_1_7 + 0.00690340909090932*G0_1_0_1_9 - 0.00904017857142894*G0_1_0_2_0 - 0.00904017857142891*G0_1_0_2_1 - 0.161627435064941*G0_1_0_2_2 + 0.0394480519480533*G0_1_0_2_3 - 0.0912236201298733*G0_1_0_2_4 + 0.0394480519480534*G0_1_0_2_5 - 0.0912236201298735*G0_1_0_2_6 + 0.00328733766233778*G0_1_0_2_7 + 0.00328733766233777*G0_1_0_2_8 - 0.0246550324675333*G0_1_0_2_9 + 0.00205458603896113*G0_1_0_3_0 + 0.000904017857142896*G0_1_0_3_1 + 0.0394480519480533*G0_1_0_3_2 - 0.00147930194805187*G0_1_0_3_3 + 0.0369825487013001*G0_1_0_3_4 - 0.00887581168831203*G0_1_0_3_5 - 0.00073965097402604*G0_1_0_3_7 + 0.00517755681818203*G0_1_0_3_8 - 0.0192309253246758*G0_1_0_3_9 + 0.00180803571428577*G0_1_0_4_0 - 0.00673904220779247*G0_1_0_4_1 - 0.0912236201298733*G0_1_0_4_2 + 0.0369825487013001*G0_1_0_4_3 - 0.010355113636364*G0_1_0_4_7 - 0.004437905844156*G0_1_0_4_8 + 0.0739650974025999*G0_1_0_4_9 + 0.000904017857142925*G0_1_0_5_0 + 0.00205458603896112*G0_1_0_5_1 + 0.0394480519480534*G0_1_0_5_2 - 0.00887581168831203*G0_1_0_5_3 - 0.00147930194805206*G0_1_0_5_5 + 0.0369825487013*G0_1_0_5_6 + 0.00517755681818203*G0_1_0_5_7 - 0.000739650974026006*G0_1_0_5_8 - 0.019230925324676*G0_1_0_5_9 - 0.00673904220779247*G0_1_0_6_0 + 0.00180803571428575*G0_1_0_6_1 - 0.0912236201298735*G0_1_0_6_2 + 0.0369825487013*G0_1_0_6_5 - 0.004437905844156*G0_1_0_6_7 - 0.010355113636364*G0_1_0_6_8 + 0.0739650974025998*G0_1_0_6_9 - 0.00049310064935067*G0_1_0_7_1 + 0.00328733766233778*G0_1_0_7_2 - 0.00073965097402604*G0_1_0_7_3 - 0.010355113636364*G0_1_0_7_4 + 0.00517755681818203*G0_1_0_7_5 - 0.00443790584415601*G0_1_0_7_6 + 0.0118344155844162*G0_1_0_7_7 - 0.00147930194805205*G0_1_0_7_8 - 0.011834415584416*G0_1_0_7_9 - 0.000493100649350676*G0_1_0_8_0 + 0.00328733766233777*G0_1_0_8_2 + 0.00517755681818203*G0_1_0_8_3 - 0.004437905844156*G0_1_0_8_4 - 0.000739650974026006*G0_1_0_8_5 - 0.010355113636364*G0_1_0_8_6 - 0.00147930194805205*G0_1_0_8_7 + 0.0118344155844161*G0_1_0_8_8 - 0.0118344155844159*G0_1_0_8_9 + 0.00690340909090936*G0_1_0_9_0 + 0.00690340909090932*G0_1_0_9_1 - 0.0246550324675333*G0_1_0_9_2 - 0.0192309253246758*G0_1_0_9_3 + 0.0739650974025999*G0_1_0_9_4 - 0.019230925324676*G0_1_0_9_5 + 0.0739650974025998*G0_1_0_9_6 - 0.011834415584416*G0_1_0_9_7 - 0.0118344155844159*G0_1_0_9_8 + 0.142012987012992*G0_1_0_9_9 + 0.00633725649350678*G0_1_1_0_0 + 0.00288555194805207*G0_1_1_0_1 - 0.00229200487012996*G0_1_1_0_2 + 0.011834415584416*G0_1_1_0_3 + 0.011834415584416*G0_1_1_0_4 - 0.00714995941558463*G0_1_1_0_5 + 0.00394480519480533*G0_1_1_0_6 - 0.00657467532467551*G0_1_1_0_7 + 0.00673904220779244*G0_1_1_0_8 + 0.023668831168832*G0_1_1_0_9 + 0.00288555194805207*G0_1_1_1_0 + 0.0462966720779237*G0_1_1_1_1 + 0.000100446428571425*G0_1_1_1_2 + 0.00246550324675332*G0_1_1_1_3 - 0.0123275162337667*G0_1_1_1_4 + 0.00320515422077933*G0_1_1_1_5 + 0.00394480519480533*G0_1_1_1_6 - 0.0128206168831174*G0_1_1_1_7 + 0.0295860389610401*G0_1_1_1_8 + 0.00295860389610402*G0_1_1_1_9 - 0.00229200487012996*G0_1_1_2_0 + 0.000100446428571425*G0_1_1_2_1 - 0.01479301948052*G0_1_1_2_2 + 0.0078074269480522*G0_1_1_2_3 - 0.0378043831168845*G0_1_1_2_4 + 0.00945109577922113*G0_1_1_2_5 - 0.0189021915584422*G0_1_1_2_6 + 0.00468445616883134*G0_1_1_2_7 + 0.00764306006493532*G0_1_1_2_8 - 0.02218952922078*G0_1_1_2_9 + 0.011834415584416*G0_1_1_3_0 + 0.00246550324675332*G0_1_1_3_1 + 0.0078074269480522*G0_1_1_3_2 + 0.173078327922084*G0_1_1_3_3 + 0.0288463879870142*G0_1_1_3_4 - 0.021449878246754*G0_1_1_3_5 - 0.0140533685064939*G0_1_1_3_6 - 0.037722199675326*G0_1_1_3_7 + 0.0628703327922099*G0_1_1_3_8 + 0.0665685876623401*G0_1_1_3_9 + 0.011834415584416*G0_1_1_4_0 - 0.0123275162337667*G0_1_1_4_1 - 0.0378043831168845*G0_1_1_4_2 + 0.0288463879870142*G0_1_1_4_3 + 0.15532670454546*G0_1_1_4_4 - 0.037722199675326*G0_1_1_4_5 + 0.0517755681818199*G0_1_1_4_6 - 0.023668831168832*G0_1_1_4_7 - 0.0251481331168839*G0_1_1_4_8 + 0.142012987012992*G0_1_1_4_9 - 0.00714995941558464*G0_1_1_5_0 + 0.00320515422077933*G0_1_1_5_1 + 0.00945109577922113*G0_1_1_5_2 - 0.021449878246754*G0_1_1_5_3 - 0.037722199675326*G0_1_1_5_4 + 0.0355032467532479*G0_1_1_5_5 - 0.014053368506494*G0_1_1_5_6 + 0.028106737012988*G0_1_1_5_7 - 0.011834415584416*G0_1_1_5_8 - 0.047337662337664*G0_1_1_5_9 + 0.00394480519480533*G0_1_1_6_0 + 0.00394480519480533*G0_1_1_6_1 - 0.0189021915584422*G0_1_1_6_2 - 0.0140533685064939*G0_1_1_6_3 + 0.0517755681818199*G0_1_1_6_4 - 0.014053368506494*G0_1_1_6_5 + 0.0517755681818198*G0_1_1_6_6 - 0.016272321428572*G0_1_1_6_7 - 0.0162723214285719*G0_1_1_6_8 + 0.0946753246753278*G0_1_1_6_9 - 0.00657467532467551*G0_1_1_7_0 - 0.0128206168831174*G0_1_1_7_1 + 0.00468445616883134*G0_1_1_7_2 - 0.037722199675326*G0_1_1_7_3 - 0.023668831168832*G0_1_1_7_4 + 0.028106737012988*G0_1_1_7_5 - 0.016272321428572*G0_1_1_7_6 + 0.10355113636364*G0_1_1_7_7 - 0.0369825487013001*G0_1_1_7_8 - 0.0384618506493519*G0_1_1_7_9 + 0.00673904220779244*G0_1_1_8_0 + 0.0295860389610401*G0_1_1_8_1 + 0.00764306006493532*G0_1_1_8_2 + 0.06287033279221*G0_1_1_8_3 - 0.0251481331168839*G0_1_1_8_4 - 0.011834415584416*G0_1_1_8_5 - 0.0162723214285719*G0_1_1_8_6 - 0.0369825487013001*G0_1_1_8_7 + 0.204143668831176*G0_1_1_8_8 + 0.041420454545456*G0_1_1_8_9 + 0.023668831168832*G0_1_1_9_0 + 0.00295860389610403*G0_1_1_9_1 - 0.02218952922078*G0_1_1_9_2 + 0.0665685876623401*G0_1_1_9_3 + 0.142012987012992*G0_1_1_9_4 - 0.047337662337664*G0_1_1_9_5 + 0.0946753246753278*G0_1_1_9_6 - 0.0384618506493519*G0_1_1_9_7 + 0.0414204545454559*G0_1_1_9_8 + 0.550300324675343*G0_1_1_9_9; + A[63] = A[36] - 0.0013879870129871*G0_0_1_0_0 + 0.000292207792207805*G0_0_1_0_1 - 0.00386262175324692*G0_0_1_0_2 + 0.000164366883116895*G0_0_1_0_3 + 0.00065746753246755*G0_0_1_0_4 - 0.00139711850649354*G0_0_1_0_5 - 0.0060815746753249*G0_0_1_0_6 - 0.000986201298701353*G0_0_1_0_7 + 0.00098620129870135*G0_0_1_0_8 - 0.00345170454545467*G0_0_1_0_9 + 0.000292207792207805*G0_0_1_1_0 + 0.00447443181818203*G0_0_1_1_1 - 0.00276684253246764*G0_0_1_1_2 + 0.0055062905844158*G0_0_1_1_3 - 0.0023833198051949*G0_0_1_1_4 + 0.00213676948051956*G0_0_1_1_5 + 0.000657467532467534*G0_0_1_1_6 - 0.00271205357142869*G0_0_1_1_7 + 0.00394480519480539*G0_0_1_1_8 + 0.005917207792208*G0_0_1_1_9 - 0.00386262175324692*G0_0_1_2_0 - 0.00276684253246764*G0_0_1_2_1 - 0.0734172077922104*G0_0_1_2_2 + 0.0142999188311693*G0_0_1_2_3 - 0.0283532873376634*G0_0_1_2_4 + 0.0167654220779227*G0_0_1_2_5 - 0.0456118100649368*G0_0_1_2_6 + 0.000164366883116886*G0_0_1_2_7 + 0.00262987012987022*G0_0_1_2_8 - 0.00641030844155866*G0_0_1_2_9 + 0.000164366883116895*G0_0_1_3_0 + 0.0055062905844158*G0_0_1_3_1 + 0.0142999188311693*G0_0_1_3_2 - 0.000739650974025972*G0_0_1_3_4 - 0.00443790584415599*G0_0_1_3_5 + 0.00147930194805198*G0_0_1_3_7 + 0.00443790584415603*G0_0_1_3_8 - 0.020710227272728*G0_0_1_3_9 + 0.00065746753246755*G0_0_1_4_0 - 0.0023833198051949*G0_0_1_4_1 - 0.0283532873376634*G0_0_1_4_2 - 0.000739650974025965*G0_0_1_4_3 + 0.0739650974025999*G0_0_1_4_4 - 0.00221895292207799*G0_0_1_4_7 - 0.00591720779220802*G0_0_1_4_8 + 0.0192309253246759*G0_0_1_4_9 - 0.00139711850649354*G0_0_1_5_0 + 0.00213676948051956*G0_0_1_5_1 + 0.0167654220779227*G0_0_1_5_2 - 0.004437905844156*G0_0_1_5_3 + 0.0414204545454559*G0_0_1_5_5 + 0.0362428977272741*G0_0_1_5_6 + 0.002958603896104*G0_0_1_5_7 - 0.004437905844156*G0_0_1_5_8 + 0.019230925324676*G0_0_1_5_9 - 0.0060815746753249*G0_0_1_6_0 + 0.000657467532467535*G0_0_1_6_1 - 0.0456118100649368*G0_0_1_6_2 + 0.0362428977272741*G0_0_1_6_5 + 0.00147930194805201*G0_0_1_6_7 - 0.00591720779220798*G0_0_1_6_8 + 0.0192309253246759*G0_0_1_6_9 - 0.000986201298701353*G0_0_1_7_0 - 0.00271205357142869*G0_0_1_7_1 + 0.000164366883116886*G0_0_1_7_2 + 0.00147930194805198*G0_0_1_7_3 - 0.00221895292207799*G0_0_1_7_4 + 0.002958603896104*G0_0_1_7_5 + 0.00147930194805201*G0_0_1_7_6 + 0.00295860389610401*G0_0_1_7_7 - 0.00147930194805204*G0_0_1_7_8 + 0.00739650974026*G0_0_1_7_9 + 0.00098620129870135*G0_0_1_8_0 + 0.00394480519480539*G0_0_1_8_1 + 0.00262987012987023*G0_0_1_8_2 + 0.00443790584415603*G0_0_1_8_3 - 0.00591720779220802*G0_0_1_8_4 - 0.004437905844156*G0_0_1_8_5 - 0.00591720779220799*G0_0_1_8_6 - 0.00147930194805204*G0_0_1_8_7 + 0.0207102272727281*G0_0_1_8_8 - 0.00591720779220796*G0_0_1_8_9 - 0.00345170454545467*G0_0_1_9_0 + 0.005917207792208*G0_0_1_9_1 - 0.00641030844155866*G0_0_1_9_2 - 0.020710227272728*G0_0_1_9_3 + 0.0192309253246759*G0_0_1_9_4 + 0.019230925324676*G0_0_1_9_5 + 0.0192309253246759*G0_0_1_9_6 + 0.00739650974026*G0_0_1_9_7 - 0.00591720779220796*G0_0_1_9_8 - 0.0887581168831199*G0_0_1_9_9 + 0.0013879870129871*G0_1_0_0_0 - 0.000292207792207805*G0_1_0_0_1 + 0.00386262175324692*G0_1_0_0_2 - 0.000164366883116895*G0_1_0_0_3 - 0.00065746753246755*G0_1_0_0_4 + 0.00139711850649354*G0_1_0_0_5 + 0.00608157467532491*G0_1_0_0_6 + 0.000986201298701353*G0_1_0_0_7 - 0.00098620129870135*G0_1_0_0_8 + 0.00345170454545467*G0_1_0_0_9 - 0.000292207792207805*G0_1_0_1_0 - 0.00447443181818203*G0_1_0_1_1 + 0.00276684253246764*G0_1_0_1_2 - 0.0055062905844158*G0_1_0_1_3 + 0.0023833198051949*G0_1_0_1_4 - 0.00213676948051956*G0_1_0_1_5 - 0.000657467532467534*G0_1_0_1_6 + 0.00271205357142869*G0_1_0_1_7 - 0.00394480519480539*G0_1_0_1_8 - 0.005917207792208*G0_1_0_1_9 + 0.00386262175324692*G0_1_0_2_0 + 0.00276684253246764*G0_1_0_2_1 + 0.0734172077922104*G0_1_0_2_2 - 0.0142999188311693*G0_1_0_2_3 + 0.0283532873376634*G0_1_0_2_4 - 0.0167654220779227*G0_1_0_2_5 + 0.0456118100649368*G0_1_0_2_6 - 0.000164366883116886*G0_1_0_2_7 - 0.00262987012987022*G0_1_0_2_8 + 0.00641030844155866*G0_1_0_2_9 - 0.000164366883116895*G0_1_0_3_0 - 0.0055062905844158*G0_1_0_3_1 - 0.0142999188311693*G0_1_0_3_2 + 0.000739650974025972*G0_1_0_3_4 + 0.00443790584415599*G0_1_0_3_5 - 0.00147930194805198*G0_1_0_3_7 - 0.00443790584415603*G0_1_0_3_8 + 0.020710227272728*G0_1_0_3_9 - 0.00065746753246755*G0_1_0_4_0 + 0.0023833198051949*G0_1_0_4_1 + 0.0283532873376634*G0_1_0_4_2 + 0.000739650974025965*G0_1_0_4_3 - 0.0739650974025999*G0_1_0_4_4 + 0.00221895292207799*G0_1_0_4_7 + 0.00591720779220802*G0_1_0_4_8 - 0.0192309253246759*G0_1_0_4_9 + 0.00139711850649354*G0_1_0_5_0 - 0.00213676948051956*G0_1_0_5_1 - 0.0167654220779227*G0_1_0_5_2 + 0.00443790584415599*G0_1_0_5_3 - 0.0414204545454559*G0_1_0_5_5 - 0.0362428977272741*G0_1_0_5_6 - 0.002958603896104*G0_1_0_5_7 + 0.004437905844156*G0_1_0_5_8 - 0.019230925324676*G0_1_0_5_9 + 0.0060815746753249*G0_1_0_6_0 - 0.000657467532467535*G0_1_0_6_1 + 0.0456118100649368*G0_1_0_6_2 - 0.0362428977272741*G0_1_0_6_5 - 0.00147930194805201*G0_1_0_6_7 + 0.00591720779220799*G0_1_0_6_8 - 0.0192309253246759*G0_1_0_6_9 + 0.000986201298701353*G0_1_0_7_0 + 0.00271205357142869*G0_1_0_7_1 - 0.000164366883116886*G0_1_0_7_2 - 0.00147930194805198*G0_1_0_7_3 + 0.00221895292207799*G0_1_0_7_4 - 0.002958603896104*G0_1_0_7_5 - 0.00147930194805201*G0_1_0_7_6 - 0.00295860389610401*G0_1_0_7_7 + 0.00147930194805204*G0_1_0_7_8 - 0.00739650974026*G0_1_0_7_9 - 0.00098620129870135*G0_1_0_8_0 - 0.00394480519480539*G0_1_0_8_1 - 0.00262987012987023*G0_1_0_8_2 - 0.00443790584415603*G0_1_0_8_3 + 0.00591720779220802*G0_1_0_8_4 + 0.004437905844156*G0_1_0_8_5 + 0.00591720779220799*G0_1_0_8_6 + 0.00147930194805204*G0_1_0_8_7 - 0.0207102272727282*G0_1_0_8_8 + 0.00591720779220796*G0_1_0_8_9 + 0.00345170454545467*G0_1_0_9_0 - 0.005917207792208*G0_1_0_9_1 + 0.00641030844155866*G0_1_0_9_2 + 0.020710227272728*G0_1_0_9_3 - 0.0192309253246759*G0_1_0_9_4 - 0.019230925324676*G0_1_0_9_5 - 0.0192309253246759*G0_1_0_9_6 - 0.00739650974026*G0_1_0_9_7 + 0.00591720779220796*G0_1_0_9_8 + 0.0887581168831199*G0_1_0_9_9; + A[0] = A[11] + 0.067414772727275*G0_0_0_0_0 + 0.00363433441558453*G0_0_0_0_2 - 0.0058076298701301*G0_0_0_0_3 + 0.00115056818181823*G0_0_0_0_4 + 0.0416578733766248*G0_0_0_0_5 - 0.0187743506493513*G0_0_0_0_6 + 0.0453469967532483*G0_0_0_0_7 - 0.0261525974025983*G0_0_0_0_8 + 0.00536931818181839*G0_0_0_0_9 - 0.067414772727275*G0_0_0_1_1 - 0.00363433441558454*G0_0_0_1_2 - 0.0416578733766248*G0_0_0_1_3 + 0.0187743506493513*G0_0_0_1_4 + 0.00580762987013007*G0_0_0_1_5 - 0.00115056818181822*G0_0_0_1_6 + 0.0261525974025984*G0_0_0_1_7 - 0.0453469967532485*G0_0_0_1_8 - 0.0053693181818184*G0_0_0_1_9 + 0.00363433441558454*G0_0_0_2_0 - 0.00363433441558454*G0_0_0_2_1 - 0.00737824675324701*G0_0_0_2_3 + 0.0036891233766235*G0_0_0_2_4 + 0.00737824675324701*G0_0_0_2_5 - 0.00368912337662351*G0_0_0_2_6 + 0.00695819805194829*G0_0_0_2_7 - 0.0069581980519483*G0_0_0_2_8 - 0.0058076298701301*G0_0_0_3_0 - 0.0416578733766248*G0_0_0_3_1 - 0.00737824675324701*G0_0_0_3_2 - 0.0713352272727298*G0_0_0_3_3 + 0.0297504058441569*G0_0_0_3_4 + 0.00345170454545467*G0_0_0_3_6 + 0.0174228896103903*G0_0_0_3_7 - 0.0382974837662352*G0_0_0_3_8 - 0.0187378246753254*G0_0_0_3_9 + 0.00115056818181823*G0_0_0_4_0 + 0.0187743506493513*G0_0_0_4_1 + 0.0036891233766235*G0_0_0_4_2 + 0.0297504058441569*G0_0_0_4_3 - 0.00525974025974042*G0_0_0_4_4 - 0.00345170454545467*G0_0_0_4_5 - 0.0121631493506498*G0_0_0_4_7 + 0.0208745941558449*G0_0_0_4_8 + 0.00690340909090935*G0_0_0_4_9 + 0.0416578733766248*G0_0_0_5_0 + 0.00580762987013007*G0_0_0_5_1 + 0.00737824675324701*G0_0_0_5_2 - 0.00345170454545467*G0_0_0_5_4 + 0.0713352272727296*G0_0_0_5_5 - 0.0297504058441568*G0_0_0_5_6 + 0.0382974837662351*G0_0_0_5_7 - 0.0174228896103902*G0_0_0_5_8 + 0.0187378246753254*G0_0_0_5_9 - 0.0187743506493513*G0_0_0_6_0 - 0.00115056818181822*G0_0_0_6_1 - 0.00368912337662351*G0_0_0_6_2 + 0.00345170454545467*G0_0_0_6_3 - 0.0297504058441569*G0_0_0_6_5 + 0.00525974025974042*G0_0_0_6_6 - 0.0208745941558449*G0_0_0_6_7 + 0.0121631493506498*G0_0_0_6_8 - 0.00690340909090934*G0_0_0_6_9 + 0.0453469967532483*G0_0_0_7_0 + 0.0261525974025984*G0_0_0_7_1 + 0.00695819805194829*G0_0_0_7_2 + 0.0174228896103903*G0_0_0_7_3 - 0.0121631493506498*G0_0_0_7_4 + 0.0382974837662351*G0_0_0_7_5 - 0.0208745941558449*G0_0_0_7_6 + 0.0660754870129893*G0_0_0_7_7 + 0.0256412337662347*G0_0_0_7_9 - 0.0261525974025983*G0_0_0_8_0 - 0.0453469967532485*G0_0_0_8_1 - 0.0069581980519483*G0_0_0_8_2 - 0.0382974837662352*G0_0_0_8_3 + 0.0208745941558449*G0_0_0_8_4 - 0.0174228896103902*G0_0_0_8_5 + 0.0121631493506498*G0_0_0_8_6 - 0.0660754870129895*G0_0_0_8_8 - 0.0256412337662347*G0_0_0_8_9 + 0.00536931818181839*G0_0_0_9_0 - 0.0053693181818184*G0_0_0_9_1 - 0.0187378246753254*G0_0_0_9_3 + 0.00690340909090935*G0_0_0_9_4 + 0.0187378246753254*G0_0_0_9_5 - 0.00690340909090934*G0_0_0_9_6 + 0.0256412337662347*G0_0_0_9_7 - 0.0256412337662347*G0_0_0_9_8 + 0.0703057359307383*G0_0_1_0_0 + 0.0044862689393941*G0_0_1_0_1 + 0.00448626893939409*G0_0_1_0_2 - 0.000776176948051984*G0_0_1_0_3 - 0.000776176948051977*G0_0_1_0_4 + 0.0427049512987027*G0_0_1_0_5 - 0.0194500811688318*G0_0_1_0_6 + 0.0427049512987028*G0_0_1_0_7 - 0.0194500811688318*G0_0_1_0_8 + 0.00760957792207822*G0_0_1_0_9 + 0.0044862689393941*G0_0_1_1_0 + 0.0028909632034633*G0_0_1_1_1 + 0.000851934523809553*G0_0_1_1_2 + 0.00104707792207795*G0_0_1_1_3 - 0.000675730519480539*G0_0_1_1_4 + 0.00503145292207809*G0_0_1_1_5 - 0.00192674512987019*G0_0_1_1_6 + 0.00670251623376647*G0_0_1_1_7 - 0.00264204545454555*G0_0_1_1_8 + 0.00224025974025982*G0_0_1_1_9 + 0.00448626893939409*G0_0_1_2_0 + 0.000851934523809553*G0_0_1_2_1 + 0.00289096320346331*G0_0_1_2_2 - 0.000675730519480548*G0_0_1_2_3 + 0.00104707792207796*G0_0_1_2_4 + 0.00670251623376646*G0_0_1_2_5 - 0.00264204545454554*G0_0_1_2_6 + 0.00503145292207809*G0_0_1_2_7 - 0.0019267451298702*G0_0_1_2_8 + 0.00224025974025982*G0_0_1_2_9 - 0.000776176948051984*G0_0_1_3_0 + 0.00104707792207795*G0_0_1_3_1 - 0.000675730519480548*G0_0_1_3_2 + 0.013222402597403*G0_0_1_3_3 - 0.00280336850649359*G0_0_1_3_4 - 0.00336038961038972*G0_0_1_3_5 - 0.000264813311688321*G0_0_1_3_6 - 0.00371651785714299*G0_0_1_3_7 + 0.0039813311688313*G0_0_1_3_8 + 0.000712256493506512*G0_0_1_3_9 - 0.000776176948051977*G0_0_1_4_0 - 0.000675730519480539*G0_0_1_4_1 + 0.00104707792207796*G0_0_1_4_2 - 0.00280336850649359*G0_0_1_4_3 + 0.0132224025974031*G0_0_1_4_4 - 0.003716517857143*G0_0_1_4_5 + 0.00398133116883132*G0_0_1_4_6 - 0.00336038961038974*G0_0_1_4_7 - 0.000264813311688313*G0_0_1_4_8 + 0.000712256493506514*G0_0_1_4_9 + 0.0427049512987027*G0_0_1_5_0 + 0.00503145292207809*G0_0_1_5_1 + 0.00670251623376646*G0_0_1_5_2 - 0.00336038961038972*G0_0_1_5_3 - 0.003716517857143*G0_0_1_5_4 + 0.0845576298701327*G0_0_1_5_5 - 0.0325537743506505*G0_0_1_5_6 + 0.0422788149350664*G0_0_1_5_7 - 0.0211394074675332*G0_0_1_5_8 + 0.0194500811688319*G0_0_1_5_9 - 0.0194500811688318*G0_0_1_6_0 - 0.00192674512987019*G0_0_1_6_1 - 0.00264204545454554*G0_0_1_6_2 - 0.000264813311688321*G0_0_1_6_3 + 0.00398133116883132*G0_0_1_6_4 - 0.0325537743506505*G0_0_1_6_5 + 0.0184821428571435*G0_0_1_6_6 - 0.0211394074675332*G0_0_1_6_7 + 0.00880275974026004*G0_0_1_6_8 - 0.00619115259740283*G0_0_1_6_9 + 0.0427049512987028*G0_0_1_7_0 + 0.00670251623376647*G0_0_1_7_1 + 0.00503145292207809*G0_0_1_7_2 - 0.00371651785714299*G0_0_1_7_3 - 0.00336038961038974*G0_0_1_7_4 + 0.0422788149350664*G0_0_1_7_5 - 0.0211394074675332*G0_0_1_7_6 + 0.0845576298701329*G0_0_1_7_7 - 0.0325537743506505*G0_0_1_7_8 + 0.0194500811688319*G0_0_1_7_9 - 0.0194500811688318*G0_0_1_8_0 - 0.00264204545454555*G0_0_1_8_1 - 0.0019267451298702*G0_0_1_8_2 + 0.0039813311688313*G0_0_1_8_3 - 0.000264813311688313*G0_0_1_8_4 - 0.0211394074675332*G0_0_1_8_5 + 0.00880275974026004*G0_0_1_8_6 - 0.0325537743506505*G0_0_1_8_7 + 0.0184821428571435*G0_0_1_8_8 - 0.00619115259740283*G0_0_1_8_9 + 0.00760957792207822*G0_0_1_9_0 + 0.00224025974025982*G0_0_1_9_1 + 0.00224025974025982*G0_0_1_9_2 + 0.000712256493506511*G0_0_1_9_3 + 0.000712256493506514*G0_0_1_9_4 + 0.0194500811688319*G0_0_1_9_5 - 0.00619115259740282*G0_0_1_9_6 + 0.0194500811688319*G0_0_1_9_7 - 0.00619115259740283*G0_0_1_9_8 + 0.0282711038961049*G0_0_1_9_9 + 0.0703057359307383*G0_1_0_0_0 + 0.0044862689393941*G0_1_0_0_1 + 0.00448626893939409*G0_1_0_0_2 - 0.000776176948051984*G0_1_0_0_3 - 0.000776176948051977*G0_1_0_0_4 + 0.0427049512987027*G0_1_0_0_5 - 0.0194500811688318*G0_1_0_0_6 + 0.0427049512987028*G0_1_0_0_7 - 0.0194500811688318*G0_1_0_0_8 + 0.00760957792207822*G0_1_0_0_9 + 0.0044862689393941*G0_1_0_1_0 + 0.0028909632034633*G0_1_0_1_1 + 0.000851934523809553*G0_1_0_1_2 + 0.00104707792207795*G0_1_0_1_3 - 0.000675730519480539*G0_1_0_1_4 + 0.00503145292207809*G0_1_0_1_5 - 0.00192674512987019*G0_1_0_1_6 + 0.00670251623376647*G0_1_0_1_7 - 0.00264204545454555*G0_1_0_1_8 + 0.00224025974025982*G0_1_0_1_9 + 0.00448626893939409*G0_1_0_2_0 + 0.000851934523809553*G0_1_0_2_1 + 0.00289096320346331*G0_1_0_2_2 - 0.000675730519480548*G0_1_0_2_3 + 0.00104707792207796*G0_1_0_2_4 + 0.00670251623376646*G0_1_0_2_5 - 0.00264204545454554*G0_1_0_2_6 + 0.00503145292207809*G0_1_0_2_7 - 0.0019267451298702*G0_1_0_2_8 + 0.00224025974025982*G0_1_0_2_9 - 0.000776176948051984*G0_1_0_3_0 + 0.00104707792207795*G0_1_0_3_1 - 0.000675730519480548*G0_1_0_3_2 + 0.013222402597403*G0_1_0_3_3 - 0.00280336850649359*G0_1_0_3_4 - 0.00336038961038972*G0_1_0_3_5 - 0.000264813311688321*G0_1_0_3_6 - 0.00371651785714299*G0_1_0_3_7 + 0.0039813311688313*G0_1_0_3_8 + 0.000712256493506512*G0_1_0_3_9 - 0.000776176948051977*G0_1_0_4_0 - 0.000675730519480539*G0_1_0_4_1 + 0.00104707792207796*G0_1_0_4_2 - 0.00280336850649359*G0_1_0_4_3 + 0.0132224025974031*G0_1_0_4_4 - 0.003716517857143*G0_1_0_4_5 + 0.00398133116883132*G0_1_0_4_6 - 0.00336038961038974*G0_1_0_4_7 - 0.000264813311688313*G0_1_0_4_8 + 0.000712256493506514*G0_1_0_4_9 + 0.0427049512987027*G0_1_0_5_0 + 0.00503145292207809*G0_1_0_5_1 + 0.00670251623376646*G0_1_0_5_2 - 0.00336038961038972*G0_1_0_5_3 - 0.003716517857143*G0_1_0_5_4 + 0.0845576298701327*G0_1_0_5_5 - 0.0325537743506505*G0_1_0_5_6 + 0.0422788149350664*G0_1_0_5_7 - 0.0211394074675332*G0_1_0_5_8 + 0.0194500811688319*G0_1_0_5_9 - 0.0194500811688318*G0_1_0_6_0 - 0.00192674512987019*G0_1_0_6_1 - 0.00264204545454554*G0_1_0_6_2 - 0.000264813311688321*G0_1_0_6_3 + 0.00398133116883132*G0_1_0_6_4 - 0.0325537743506505*G0_1_0_6_5 + 0.0184821428571435*G0_1_0_6_6 - 0.0211394074675332*G0_1_0_6_7 + 0.00880275974026004*G0_1_0_6_8 - 0.00619115259740282*G0_1_0_6_9 + 0.0427049512987028*G0_1_0_7_0 + 0.00670251623376647*G0_1_0_7_1 + 0.00503145292207809*G0_1_0_7_2 - 0.00371651785714299*G0_1_0_7_3 - 0.00336038961038974*G0_1_0_7_4 + 0.0422788149350664*G0_1_0_7_5 - 0.0211394074675332*G0_1_0_7_6 + 0.0845576298701329*G0_1_0_7_7 - 0.0325537743506505*G0_1_0_7_8 + 0.0194500811688319*G0_1_0_7_9 - 0.0194500811688318*G0_1_0_8_0 - 0.00264204545454555*G0_1_0_8_1 - 0.0019267451298702*G0_1_0_8_2 + 0.0039813311688313*G0_1_0_8_3 - 0.000264813311688313*G0_1_0_8_4 - 0.0211394074675332*G0_1_0_8_5 + 0.00880275974026004*G0_1_0_8_6 - 0.0325537743506505*G0_1_0_8_7 + 0.0184821428571435*G0_1_0_8_8 - 0.00619115259740283*G0_1_0_8_9 + 0.00760957792207822*G0_1_0_9_0 + 0.00224025974025982*G0_1_0_9_1 + 0.00224025974025982*G0_1_0_9_2 + 0.000712256493506511*G0_1_0_9_3 + 0.000712256493506514*G0_1_0_9_4 + 0.0194500811688319*G0_1_0_9_5 - 0.00619115259740282*G0_1_0_9_6 + 0.0194500811688319*G0_1_0_9_7 - 0.00619115259740283*G0_1_0_9_8 + 0.0282711038961049*G0_1_0_9_9 + 0.0703057359307383*G0_1_1_0_0 + 0.0044862689393941*G0_1_1_0_1 + 0.00448626893939409*G0_1_1_0_2 - 0.000776176948051983*G0_1_1_0_3 - 0.000776176948051977*G0_1_1_0_4 + 0.0427049512987027*G0_1_1_0_5 - 0.0194500811688318*G0_1_1_0_6 + 0.0427049512987028*G0_1_1_0_7 - 0.0194500811688318*G0_1_1_0_8 + 0.00760957792207822*G0_1_1_0_9 + 0.0044862689393941*G0_1_1_1_0 + 0.0028909632034633*G0_1_1_1_1 + 0.000851934523809554*G0_1_1_1_2 + 0.00104707792207795*G0_1_1_1_3 - 0.00067573051948054*G0_1_1_1_4 + 0.00503145292207809*G0_1_1_1_5 - 0.00192674512987019*G0_1_1_1_6 + 0.00670251623376647*G0_1_1_1_7 - 0.00264204545454555*G0_1_1_1_8 + 0.00224025974025982*G0_1_1_1_9 + 0.00448626893939409*G0_1_1_2_0 + 0.000851934523809553*G0_1_1_2_1 + 0.00289096320346331*G0_1_1_2_2 - 0.000675730519480547*G0_1_1_2_3 + 0.00104707792207796*G0_1_1_2_4 + 0.00670251623376646*G0_1_1_2_5 - 0.00264204545454554*G0_1_1_2_6 + 0.00503145292207809*G0_1_1_2_7 - 0.0019267451298702*G0_1_1_2_8 + 0.00224025974025982*G0_1_1_2_9 - 0.000776176948051983*G0_1_1_3_0 + 0.00104707792207795*G0_1_1_3_1 - 0.000675730519480547*G0_1_1_3_2 + 0.013222402597403*G0_1_1_3_3 - 0.0028033685064936*G0_1_1_3_4 - 0.00336038961038972*G0_1_1_3_5 - 0.000264813311688322*G0_1_1_3_6 - 0.00371651785714299*G0_1_1_3_7 + 0.00398133116883131*G0_1_1_3_8 + 0.000712256493506516*G0_1_1_3_9 - 0.000776176948051977*G0_1_1_4_0 - 0.00067573051948054*G0_1_1_4_1 + 0.00104707792207796*G0_1_1_4_2 - 0.0028033685064936*G0_1_1_4_3 + 0.0132224025974031*G0_1_1_4_4 - 0.003716517857143*G0_1_1_4_5 + 0.00398133116883132*G0_1_1_4_6 - 0.00336038961038974*G0_1_1_4_7 - 0.000264813311688315*G0_1_1_4_8 + 0.000712256493506515*G0_1_1_4_9 + 0.0427049512987027*G0_1_1_5_0 + 0.00503145292207809*G0_1_1_5_1 + 0.00670251623376646*G0_1_1_5_2 - 0.00336038961038972*G0_1_1_5_3 - 0.003716517857143*G0_1_1_5_4 + 0.0845576298701327*G0_1_1_5_5 - 0.0325537743506505*G0_1_1_5_6 + 0.0422788149350664*G0_1_1_5_7 - 0.0211394074675332*G0_1_1_5_8 + 0.0194500811688319*G0_1_1_5_9 - 0.0194500811688318*G0_1_1_6_0 - 0.00192674512987019*G0_1_1_6_1 - 0.00264204545454554*G0_1_1_6_2 - 0.000264813311688322*G0_1_1_6_3 + 0.00398133116883132*G0_1_1_6_4 - 0.0325537743506505*G0_1_1_6_5 + 0.0184821428571435*G0_1_1_6_6 - 0.0211394074675332*G0_1_1_6_7 + 0.00880275974026004*G0_1_1_6_8 - 0.00619115259740282*G0_1_1_6_9 + 0.0427049512987028*G0_1_1_7_0 + 0.00670251623376647*G0_1_1_7_1 + 0.00503145292207809*G0_1_1_7_2 - 0.00371651785714299*G0_1_1_7_3 - 0.00336038961038974*G0_1_1_7_4 + 0.0422788149350664*G0_1_1_7_5 - 0.0211394074675332*G0_1_1_7_6 + 0.0845576298701329*G0_1_1_7_7 - 0.0325537743506505*G0_1_1_7_8 + 0.0194500811688319*G0_1_1_7_9 - 0.0194500811688318*G0_1_1_8_0 - 0.00264204545454555*G0_1_1_8_1 - 0.0019267451298702*G0_1_1_8_2 + 0.00398133116883131*G0_1_1_8_3 - 0.000264813311688315*G0_1_1_8_4 - 0.0211394074675332*G0_1_1_8_5 + 0.00880275974026004*G0_1_1_8_6 - 0.0325537743506505*G0_1_1_8_7 + 0.0184821428571435*G0_1_1_8_8 - 0.00619115259740283*G0_1_1_8_9 + 0.00760957792207822*G0_1_1_9_0 + 0.00224025974025982*G0_1_1_9_1 + 0.00224025974025982*G0_1_1_9_2 + 0.000712256493506516*G0_1_1_9_3 + 0.000712256493506515*G0_1_1_9_4 + 0.0194500811688319*G0_1_1_9_5 - 0.00619115259740282*G0_1_1_9_6 + 0.0194500811688319*G0_1_1_9_7 - 0.00619115259740283*G0_1_1_9_8 + 0.0282711038961049*G0_1_1_9_9; + A[79] = A[97] + 0.0295860389610402*G0_0_1_0_0 + 0.00295860389610402*G0_0_1_0_1 + 0.00372564935064948*G0_0_1_0_2 + 0.00246550324675333*G0_0_1_0_3 - 0.00147930194805201*G0_0_1_0_4 + 0.0221895292207801*G0_0_1_0_5 - 0.0138068181818187*G0_0_1_0_6 + 0.0468445616883134*G0_0_1_0_7 - 0.00887581168831208*G0_0_1_0_8 + 0.0128206168831174*G0_0_1_0_9 + 0.00295860389610402*G0_0_1_1_0 + 0.00986201298701333*G0_0_1_1_1 + 0.00301339285714296*G0_0_1_1_2 + 0.00739650974026*G0_0_1_1_3 - 0.00690340909090934*G0_0_1_1_4 + 0.0138068181818187*G0_0_1_1_5 - 0.004437905844156*G0_0_1_1_6 + 0.017751623376624*G0_0_1_1_7 + 0.0123275162337667*G0_0_1_1_8 + 0.0285998376623387*G0_0_1_1_9 + 0.00372564935064948*G0_0_1_2_0 + 0.00301339285714296*G0_0_1_2_1 + 0.000328733766233769*G0_0_1_2_2 - 0.00197240259740265*G0_0_1_2_3 + 0.00147930194805198*G0_0_1_2_4 + 0.00788961038961068*G0_0_1_2_5 - 0.00295860389610401*G0_0_1_2_6 + 0.00197240259740267*G0_0_1_2_7 - 0.0167654220779226*G0_0_1_2_8 - 0.01479301948052*G0_0_1_2_9 + 0.00246550324675333*G0_0_1_3_0 + 0.00739650974026*G0_0_1_3_1 - 0.00197240259740265*G0_0_1_3_2 + 0.0384618506493523*G0_0_1_3_3 - 0.001479301948052*G0_0_1_3_4 - 0.017751623376624*G0_0_1_3_5 - 0.020710227272728*G0_0_1_3_7 - 0.0162723214285719*G0_0_1_3_8 - 0.0443790584415598*G0_0_1_3_9 - 0.00147930194805201*G0_0_1_4_0 - 0.00690340909090934*G0_0_1_4_1 + 0.00147930194805198*G0_0_1_4_2 - 0.001479301948052*G0_0_1_4_3 + 0.0118344155844158*G0_0_1_4_4 - 0.008875811688312*G0_0_1_4_5 + 0.00887581168831196*G0_0_1_4_6 + 0.00591720779220802*G0_0_1_4_7 + 0.0369825487013*G0_0_1_4_8 + 0.0621306818181838*G0_0_1_4_9 + 0.0221895292207801*G0_0_1_5_0 + 0.0138068181818187*G0_0_1_5_1 + 0.00788961038961068*G0_0_1_5_2 - 0.017751623376624*G0_0_1_5_3 - 0.008875811688312*G0_0_1_5_4 + 0.1479301948052*G0_0_1_5_5 - 0.038461850649352*G0_0_1_5_6 + 0.0739650974026*G0_0_1_5_7 - 0.054734172077924*G0_0_1_5_8 + 0.071006493506496*G0_0_1_5_9 - 0.0138068181818187*G0_0_1_6_0 - 0.004437905844156*G0_0_1_6_1 - 0.00295860389610402*G0_0_1_6_2 + 0.00887581168831196*G0_0_1_6_4 - 0.038461850649352*G0_0_1_6_5 + 0.0414204545454558*G0_0_1_6_6 - 0.019230925324676*G0_0_1_6_7 + 0.038461850649352*G0_0_1_6_8 + 0.0443790584415599*G0_0_1_6_9 + 0.0468445616883134*G0_0_1_7_0 + 0.017751623376624*G0_0_1_7_1 + 0.00197240259740267*G0_0_1_7_2 - 0.020710227272728*G0_0_1_7_3 + 0.00591720779220802*G0_0_1_7_4 + 0.0739650974026*G0_0_1_7_5 - 0.019230925324676*G0_0_1_7_6 - 0.106509740259744*G0_0_1_7_8 - 0.00887581168831207*G0_0_1_8_0 + 0.0123275162337667*G0_0_1_8_1 - 0.0167654220779226*G0_0_1_8_2 - 0.0162723214285719*G0_0_1_8_3 + 0.0369825487013*G0_0_1_8_4 - 0.054734172077924*G0_0_1_8_5 + 0.038461850649352*G0_0_1_8_6 - 0.106509740259744*G0_0_1_8_7 - 0.213019480519488*G0_0_1_8_8 - 0.159764610389616*G0_0_1_8_9 + 0.0128206168831174*G0_0_1_9_0 + 0.0285998376623387*G0_0_1_9_1 - 0.01479301948052*G0_0_1_9_2 - 0.0443790584415598*G0_0_1_9_3 + 0.0621306818181838*G0_0_1_9_4 + 0.071006493506496*G0_0_1_9_5 + 0.0443790584415599*G0_0_1_9_6 - 0.159764610389616*G0_0_1_9_8 - 0.0295860389610402*G0_1_0_0_0 - 0.00295860389610402*G0_1_0_0_1 - 0.00372564935064948*G0_1_0_0_2 - 0.00246550324675333*G0_1_0_0_3 + 0.00147930194805201*G0_1_0_0_4 - 0.0221895292207801*G0_1_0_0_5 + 0.0138068181818187*G0_1_0_0_6 - 0.0468445616883134*G0_1_0_0_7 + 0.00887581168831207*G0_1_0_0_8 - 0.0128206168831174*G0_1_0_0_9 - 0.00295860389610402*G0_1_0_1_0 - 0.00986201298701333*G0_1_0_1_1 - 0.00301339285714296*G0_1_0_1_2 - 0.00739650974026*G0_1_0_1_3 + 0.00690340909090934*G0_1_0_1_4 - 0.0138068181818187*G0_1_0_1_5 + 0.004437905844156*G0_1_0_1_6 - 0.017751623376624*G0_1_0_1_7 - 0.0123275162337667*G0_1_0_1_8 - 0.0285998376623387*G0_1_0_1_9 - 0.00372564935064948*G0_1_0_2_0 - 0.00301339285714296*G0_1_0_2_1 - 0.000328733766233769*G0_1_0_2_2 + 0.00197240259740265*G0_1_0_2_3 - 0.00147930194805198*G0_1_0_2_4 - 0.00788961038961068*G0_1_0_2_5 + 0.00295860389610401*G0_1_0_2_6 - 0.00197240259740267*G0_1_0_2_7 + 0.0167654220779226*G0_1_0_2_8 + 0.01479301948052*G0_1_0_2_9 - 0.00246550324675333*G0_1_0_3_0 - 0.00739650974026*G0_1_0_3_1 + 0.00197240259740265*G0_1_0_3_2 - 0.0384618506493523*G0_1_0_3_3 + 0.00147930194805201*G0_1_0_3_4 + 0.017751623376624*G0_1_0_3_5 + 0.020710227272728*G0_1_0_3_7 + 0.0162723214285719*G0_1_0_3_8 + 0.0443790584415598*G0_1_0_3_9 + 0.00147930194805201*G0_1_0_4_0 + 0.00690340909090934*G0_1_0_4_1 - 0.00147930194805198*G0_1_0_4_2 + 0.00147930194805201*G0_1_0_4_3 - 0.0118344155844158*G0_1_0_4_4 + 0.00887581168831201*G0_1_0_4_5 - 0.00887581168831196*G0_1_0_4_6 - 0.00591720779220802*G0_1_0_4_7 - 0.0369825487013*G0_1_0_4_8 - 0.0621306818181838*G0_1_0_4_9 - 0.0221895292207801*G0_1_0_5_0 - 0.0138068181818187*G0_1_0_5_1 - 0.00788961038961068*G0_1_0_5_2 + 0.017751623376624*G0_1_0_5_3 + 0.008875811688312*G0_1_0_5_4 - 0.1479301948052*G0_1_0_5_5 + 0.038461850649352*G0_1_0_5_6 - 0.0739650974026*G0_1_0_5_7 + 0.054734172077924*G0_1_0_5_8 - 0.071006493506496*G0_1_0_5_9 + 0.0138068181818187*G0_1_0_6_0 + 0.004437905844156*G0_1_0_6_1 + 0.00295860389610402*G0_1_0_6_2 - 0.00887581168831196*G0_1_0_6_4 + 0.038461850649352*G0_1_0_6_5 - 0.0414204545454558*G0_1_0_6_6 + 0.019230925324676*G0_1_0_6_7 - 0.038461850649352*G0_1_0_6_8 - 0.0443790584415599*G0_1_0_6_9 - 0.0468445616883134*G0_1_0_7_0 - 0.017751623376624*G0_1_0_7_1 - 0.00197240259740267*G0_1_0_7_2 + 0.020710227272728*G0_1_0_7_3 - 0.00591720779220802*G0_1_0_7_4 - 0.0739650974026*G0_1_0_7_5 + 0.019230925324676*G0_1_0_7_6 + 0.106509740259744*G0_1_0_7_8 + 0.00887581168831207*G0_1_0_8_0 - 0.0123275162337667*G0_1_0_8_1 + 0.0167654220779226*G0_1_0_8_2 + 0.0162723214285719*G0_1_0_8_3 - 0.0369825487013*G0_1_0_8_4 + 0.054734172077924*G0_1_0_8_5 - 0.038461850649352*G0_1_0_8_6 + 0.106509740259744*G0_1_0_8_7 + 0.213019480519488*G0_1_0_8_8 + 0.159764610389616*G0_1_0_8_9 - 0.0128206168831174*G0_1_0_9_0 - 0.0285998376623387*G0_1_0_9_1 + 0.01479301948052*G0_1_0_9_2 + 0.0443790584415598*G0_1_0_9_3 - 0.0621306818181838*G0_1_0_9_4 - 0.071006493506496*G0_1_0_9_5 - 0.0443790584415599*G0_1_0_9_6 + 0.159764610389616*G0_1_0_9_8; + A[38] = A[83] - 0.0017167207792208*G0_0_1_0_0 + 0.00904017857142893*G0_0_1_0_1 + 0.000127840909090921*G0_0_1_0_2 - 0.00180803571428576*G0_0_1_0_3 - 0.00205458603896112*G0_0_1_0_4 + 0.000493100649350663*G0_0_1_0_6 - 0.000904017857142895*G0_0_1_0_7 + 0.00673904220779247*G0_0_1_0_8 - 0.00690340909090933*G0_0_1_0_9 + 0.00904017857142893*G0_0_1_1_0 + 0.161627435064941*G0_0_1_1_1 + 0.00904017857142887*G0_0_1_1_2 + 0.0912236201298731*G0_0_1_1_3 - 0.0394480519480532*G0_0_1_1_4 - 0.00328733766233777*G0_0_1_1_5 - 0.00328733766233777*G0_0_1_1_6 - 0.0394480519480534*G0_0_1_1_7 + 0.0912236201298735*G0_0_1_1_8 + 0.0246550324675334*G0_0_1_1_9 + 0.000127840909090921*G0_0_1_2_0 + 0.00904017857142887*G0_0_1_2_1 - 0.0017167207792208*G0_0_1_2_2 + 0.00673904220779243*G0_0_1_2_3 - 0.00090401785714287*G0_0_1_2_4 + 0.000493100649350651*G0_0_1_2_5 - 0.00205458603896112*G0_0_1_2_7 - 0.00180803571428576*G0_0_1_2_8 - 0.00690340909090931*G0_0_1_2_9 - 0.00180803571428576*G0_0_1_3_0 + 0.0912236201298731*G0_0_1_3_1 + 0.00673904220779243*G0_0_1_3_2 - 0.0369825487012999*G0_0_1_3_4 + 0.010355113636364*G0_0_1_3_5 + 0.00443790584415597*G0_0_1_3_6 - 0.0739650974025998*G0_0_1_3_9 - 0.00205458603896112*G0_0_1_4_0 - 0.0394480519480532*G0_0_1_4_1 - 0.000904017857142871*G0_0_1_4_2 - 0.0369825487012999*G0_0_1_4_3 + 0.00147930194805201*G0_0_1_4_4 + 0.000739650974025996*G0_0_1_4_5 - 0.00517755681818197*G0_0_1_4_6 + 0.00887581168831203*G0_0_1_4_7 + 0.0192309253246759*G0_0_1_4_9 - 0.00328733766233777*G0_0_1_5_1 + 0.00049310064935065*G0_0_1_5_2 + 0.010355113636364*G0_0_1_5_3 + 0.000739650974025997*G0_0_1_5_4 - 0.011834415584416*G0_0_1_5_5 + 0.00147930194805197*G0_0_1_5_6 - 0.005177556818182*G0_0_1_5_7 + 0.00443790584415599*G0_0_1_5_8 + 0.011834415584416*G0_0_1_5_9 + 0.000493100649350663*G0_0_1_6_0 - 0.00328733766233777*G0_0_1_6_1 + 0.00443790584415597*G0_0_1_6_3 - 0.00517755681818197*G0_0_1_6_4 + 0.00147930194805197*G0_0_1_6_5 - 0.0118344155844159*G0_0_1_6_6 + 0.00073965097402601*G0_0_1_6_7 + 0.010355113636364*G0_0_1_6_8 + 0.011834415584416*G0_0_1_6_9 - 0.000904017857142896*G0_0_1_7_0 - 0.0394480519480534*G0_0_1_7_1 - 0.00205458603896112*G0_0_1_7_2 + 0.00887581168831204*G0_0_1_7_4 - 0.005177556818182*G0_0_1_7_5 + 0.00073965097402601*G0_0_1_7_6 + 0.001479301948052*G0_0_1_7_7 - 0.0369825487013002*G0_0_1_7_8 + 0.0192309253246759*G0_0_1_7_9 + 0.00673904220779247*G0_0_1_8_0 + 0.0912236201298735*G0_0_1_8_1 - 0.00180803571428576*G0_0_1_8_2 + 0.00443790584415599*G0_0_1_8_5 + 0.010355113636364*G0_0_1_8_6 - 0.0369825487013002*G0_0_1_8_7 - 0.0739650974025999*G0_0_1_8_9 - 0.00690340909090933*G0_0_1_9_0 + 0.0246550324675334*G0_0_1_9_1 - 0.00690340909090931*G0_0_1_9_2 - 0.0739650974025998*G0_0_1_9_3 + 0.0192309253246759*G0_0_1_9_4 + 0.011834415584416*G0_0_1_9_5 + 0.011834415584416*G0_0_1_9_6 + 0.0192309253246759*G0_0_1_9_7 - 0.0739650974025999*G0_0_1_9_8 - 0.142012987012992*G0_0_1_9_9 + 0.0017167207792208*G0_1_0_0_0 - 0.00904017857142893*G0_1_0_0_1 - 0.000127840909090921*G0_1_0_0_2 + 0.00180803571428577*G0_1_0_0_3 + 0.00205458603896112*G0_1_0_0_4 - 0.000493100649350663*G0_1_0_0_6 + 0.000904017857142895*G0_1_0_0_7 - 0.00673904220779248*G0_1_0_0_8 + 0.00690340909090933*G0_1_0_0_9 - 0.00904017857142893*G0_1_0_1_0 - 0.161627435064941*G0_1_0_1_1 - 0.00904017857142887*G0_1_0_1_2 - 0.0912236201298731*G0_1_0_1_3 + 0.0394480519480532*G0_1_0_1_4 + 0.00328733766233777*G0_1_0_1_5 + 0.00328733766233777*G0_1_0_1_6 + 0.0394480519480534*G0_1_0_1_7 - 0.0912236201298735*G0_1_0_1_8 - 0.0246550324675334*G0_1_0_1_9 - 0.000127840909090921*G0_1_0_2_0 - 0.00904017857142886*G0_1_0_2_1 + 0.0017167207792208*G0_1_0_2_2 - 0.00673904220779242*G0_1_0_2_3 + 0.000904017857142868*G0_1_0_2_4 - 0.000493100649350651*G0_1_0_2_5 + 0.00205458603896112*G0_1_0_2_7 + 0.00180803571428576*G0_1_0_2_8 + 0.00690340909090931*G0_1_0_2_9 + 0.00180803571428577*G0_1_0_3_0 - 0.0912236201298731*G0_1_0_3_1 - 0.00673904220779242*G0_1_0_3_2 + 0.0369825487012999*G0_1_0_3_4 - 0.010355113636364*G0_1_0_3_5 - 0.00443790584415597*G0_1_0_3_6 + 0.0739650974025998*G0_1_0_3_9 + 0.00205458603896112*G0_1_0_4_0 + 0.0394480519480532*G0_1_0_4_1 + 0.00090401785714287*G0_1_0_4_2 + 0.0369825487012999*G0_1_0_4_3 - 0.001479301948052*G0_1_0_4_4 - 0.000739650974025996*G0_1_0_4_5 + 0.00517755681818197*G0_1_0_4_6 - 0.00887581168831203*G0_1_0_4_7 - 0.0192309253246759*G0_1_0_4_9 + 0.00328733766233777*G0_1_0_5_1 - 0.000493100649350651*G0_1_0_5_2 - 0.010355113636364*G0_1_0_5_3 - 0.000739650974025996*G0_1_0_5_4 + 0.011834415584416*G0_1_0_5_5 - 0.00147930194805197*G0_1_0_5_6 + 0.005177556818182*G0_1_0_5_7 - 0.00443790584415599*G0_1_0_5_8 - 0.011834415584416*G0_1_0_5_9 - 0.000493100649350663*G0_1_0_6_0 + 0.00328733766233777*G0_1_0_6_1 - 0.00443790584415597*G0_1_0_6_3 + 0.00517755681818197*G0_1_0_6_4 - 0.00147930194805197*G0_1_0_6_5 + 0.0118344155844159*G0_1_0_6_6 - 0.00073965097402601*G0_1_0_6_7 - 0.010355113636364*G0_1_0_6_8 - 0.011834415584416*G0_1_0_6_9 + 0.000904017857142896*G0_1_0_7_0 + 0.0394480519480534*G0_1_0_7_1 + 0.00205458603896112*G0_1_0_7_2 - 0.00887581168831204*G0_1_0_7_4 + 0.005177556818182*G0_1_0_7_5 - 0.00073965097402601*G0_1_0_7_6 - 0.001479301948052*G0_1_0_7_7 + 0.0369825487013002*G0_1_0_7_8 - 0.0192309253246759*G0_1_0_7_9 - 0.00673904220779248*G0_1_0_8_0 - 0.0912236201298735*G0_1_0_8_1 + 0.00180803571428576*G0_1_0_8_2 - 0.00443790584415599*G0_1_0_8_5 - 0.010355113636364*G0_1_0_8_6 + 0.0369825487013002*G0_1_0_8_7 + 0.0739650974025999*G0_1_0_8_9 + 0.00690340909090933*G0_1_0_9_0 - 0.0246550324675334*G0_1_0_9_1 + 0.00690340909090931*G0_1_0_9_2 + 0.0739650974025998*G0_1_0_9_3 - 0.0192309253246759*G0_1_0_9_4 - 0.011834415584416*G0_1_0_9_5 - 0.011834415584416*G0_1_0_9_6 - 0.0192309253246759*G0_1_0_9_7 + 0.0739650974025998*G0_1_0_9_8 + 0.142012987012992*G0_1_0_9_9; + A[20] = -A[21] - 0.00949066558441591*G0_1_0_0_0 - 0.000118709415584418*G0_1_0_0_2 + 0.000438311688311705*G0_1_0_0_3 - 0.000575284090909114*G0_1_0_0_4 - 0.00373478084415597*G0_1_0_0_5 + 0.00305905032467543*G0_1_0_0_6 - 0.00820921266233794*G0_1_0_0_7 + 0.00461140422077938*G0_1_0_0_8 - 0.000712256493506522*G0_1_0_0_9 + 0.0094906655844159*G0_1_0_1_1 + 0.000118709415584419*G0_1_0_1_2 + 0.00373478084415597*G0_1_0_1_3 - 0.00305905032467543*G0_1_0_1_4 - 0.000438311688311703*G0_1_0_1_5 + 0.000575284090909113*G0_1_0_1_6 - 0.00461140422077938*G0_1_0_1_7 + 0.00820921266233796*G0_1_0_1_8 + 0.00071225649350652*G0_1_0_1_9 - 0.000118709415584418*G0_1_0_2_0 + 0.000118709415584418*G0_1_0_2_1 + 0.00155235389610395*G0_1_0_2_3 - 0.00447443181818197*G0_1_0_2_4 - 0.00155235389610395*G0_1_0_2_5 + 0.00447443181818198*G0_1_0_2_6 - 0.00101359577922081*G0_1_0_2_7 + 0.00101359577922081*G0_1_0_2_8 + 0.000438311688311705*G0_1_0_3_0 + 0.00373478084415597*G0_1_0_3_1 + 0.00155235389610395*G0_1_0_3_2 - 0.00131493506493514*G0_1_0_3_3 + 0.00583502435064956*G0_1_0_3_4 - 0.00172585227272733*G0_1_0_3_6 - 0.0013149350649351*G0_1_0_3_7 + 0.00435572240259754*G0_1_0_3_8 + 0.000493100649350655*G0_1_0_3_9 - 0.000575284090909114*G0_1_0_4_0 - 0.00305905032467543*G0_1_0_4_1 - 0.00447443181818197*G0_1_0_4_2 + 0.00583502435064956*G0_1_0_4_3 - 0.0254768668831178*G0_1_0_4_4 + 0.00172585227272733*G0_1_0_4_5 + 0.00238331980519489*G0_1_0_4_7 - 0.00304078733766243*G0_1_0_4_8 - 0.00345170454545467*G0_1_0_4_9 - 0.00373478084415597*G0_1_0_5_0 - 0.000438311688311703*G0_1_0_5_1 - 0.00155235389610395*G0_1_0_5_2 + 0.00172585227272733*G0_1_0_5_4 + 0.00131493506493512*G0_1_0_5_5 - 0.00583502435064956*G0_1_0_5_6 - 0.00435572240259754*G0_1_0_5_7 + 0.00131493506493511*G0_1_0_5_8 - 0.000493100649350661*G0_1_0_5_9 + 0.00305905032467543*G0_1_0_6_0 + 0.000575284090909113*G0_1_0_6_1 + 0.00447443181818198*G0_1_0_6_2 - 0.00172585227272733*G0_1_0_6_3 - 0.00583502435064956*G0_1_0_6_5 + 0.0254768668831178*G0_1_0_6_6 + 0.00304078733766244*G0_1_0_6_7 - 0.00238331980519488*G0_1_0_6_8 + 0.00345170454545466*G0_1_0_6_9 - 0.00820921266233794*G0_1_0_7_0 - 0.00461140422077939*G0_1_0_7_1 - 0.00101359577922081*G0_1_0_7_2 - 0.0013149350649351*G0_1_0_7_3 + 0.00238331980519489*G0_1_0_7_4 - 0.00435572240259754*G0_1_0_7_5 + 0.00304078733766244*G0_1_0_7_6 - 0.0241619318181826*G0_1_0_7_7 - 0.00394480519480533*G0_1_0_7_9 + 0.00461140422077938*G0_1_0_8_0 + 0.00820921266233796*G0_1_0_8_1 + 0.00101359577922081*G0_1_0_8_2 + 0.00435572240259754*G0_1_0_8_3 - 0.00304078733766243*G0_1_0_8_4 + 0.00131493506493511*G0_1_0_8_5 - 0.00238331980519488*G0_1_0_8_6 + 0.0241619318181826*G0_1_0_8_8 + 0.00394480519480532*G0_1_0_8_9 - 0.000712256493506522*G0_1_0_9_0 + 0.00071225649350652*G0_1_0_9_1 + 0.000493100649350656*G0_1_0_9_3 - 0.00345170454545467*G0_1_0_9_4 - 0.000493100649350661*G0_1_0_9_5 + 0.00345170454545466*G0_1_0_9_6 - 0.00394480519480533*G0_1_0_9_7 + 0.00394480519480532*G0_1_0_9_8 - 0.011194534632035*G0_1_1_0_0 - 0.000851934523809554*G0_1_1_0_1 - 0.000970643939393977*G0_1_1_0_2 + 0.000447443181818202*G0_1_1_0_3 - 0.000566152597402623*G0_1_1_0_4 - 0.00375913149350661*G0_1_1_0_5 + 0.00193587662337668*G0_1_1_0_6 - 0.00823356331168859*G0_1_1_0_7 + 0.00348823051948064*G0_1_1_0_8 - 0.000980113636363675*G0_1_1_0_9 - 0.000851934523809554*G0_1_1_1_0 - 0.0017038690476191*G0_1_1_1_1 - 0.000851934523809556*G0_1_1_1_2 - 0.00112317370129875*G0_1_1_1_4 - 0.00112317370129874*G0_1_1_1_7 - 0.000267857142857154*G0_1_1_1_9 - 0.000970643939393977*G0_1_1_2_0 - 0.000851934523809556*G0_1_1_2_1 - 0.011194534632035*G0_1_1_2_2 + 0.00348823051948065*G0_1_1_2_3 - 0.00823356331168862*G0_1_1_2_4 + 0.0019358766233767*G0_1_1_2_5 - 0.00375913149350665*G0_1_1_2_6 - 0.000566152597402615*G0_1_1_2_7 + 0.000447443181818196*G0_1_1_2_8 - 0.000980113636363674*G0_1_1_2_9 + 0.000447443181818202*G0_1_1_3_0 + 0.00348823051948065*G0_1_1_3_2 + 0.00189935064935071*G0_1_1_3_3 + 0.00658380681818206*G0_1_1_3_4 - 0.00124188311688316*G0_1_1_3_5 + 0.00108664772727278*G0_1_1_3_6 - 0.000228287337662342*G0_1_1_3_7 + 0.000456574675324685*G0_1_1_3_8 + 0.00126014610389615*G0_1_1_3_9 - 0.000566152597402623*G0_1_1_4_0 - 0.00112317370129875*G0_1_1_4_1 - 0.00823356331168862*G0_1_1_4_2 + 0.00658380681818206*G0_1_1_4_3 - 0.022262581168832*G0_1_1_4_4 + 0.00281250000000011*G0_1_1_4_5 - 0.00389914772727289*G0_1_1_4_6 + 0.00114143668831173*G0_1_1_4_7 - 0.000228287337662342*G0_1_1_4_8 - 0.00268465909090919*G0_1_1_4_9 - 0.00375913149350661*G0_1_1_5_0 + 0.0019358766233767*G0_1_1_5_2 - 0.00124188311688316*G0_1_1_5_3 + 0.00281250000000011*G0_1_1_5_4 + 0.00321428571428582*G0_1_1_5_5 + 0.000748782467532506*G0_1_1_5_6 - 0.00389914772727285*G0_1_1_5_7 + 0.00108664772727276*G0_1_1_5_8 + 0.000767045454545484*G0_1_1_5_9 + 0.00193587662337668*G0_1_1_6_0 - 0.00375913149350665*G0_1_1_6_2 + 0.00108664772727278*G0_1_1_6_3 - 0.00389914772727289*G0_1_1_6_4 + 0.000748782467532506*G0_1_1_6_5 + 0.00321428571428579*G0_1_1_6_6 + 0.00281250000000009*G0_1_1_6_7 - 0.00124188311688315*G0_1_1_6_8 + 0.000767045454545472*G0_1_1_6_9 - 0.00823356331168859*G0_1_1_7_0 - 0.00112317370129874*G0_1_1_7_1 - 0.000566152597402615*G0_1_1_7_2 - 0.000228287337662342*G0_1_1_7_3 + 0.00114143668831173*G0_1_1_7_4 - 0.00389914772727285*G0_1_1_7_5 + 0.00281250000000009*G0_1_1_7_6 - 0.0222625811688319*G0_1_1_7_7 + 0.00658380681818205*G0_1_1_7_8 - 0.00268465909090919*G0_1_1_7_9 + 0.00348823051948064*G0_1_1_8_0 + 0.000447443181818196*G0_1_1_8_2 + 0.000456574675324685*G0_1_1_8_3 - 0.000228287337662342*G0_1_1_8_4 + 0.00108664772727276*G0_1_1_8_5 - 0.00124188311688315*G0_1_1_8_6 + 0.00658380681818205*G0_1_1_8_7 + 0.0018993506493507*G0_1_1_8_8 + 0.00126014610389615*G0_1_1_8_9 - 0.000980113636363675*G0_1_1_9_0 - 0.000267857142857154*G0_1_1_9_1 - 0.000980113636363674*G0_1_1_9_2 + 0.00126014610389615*G0_1_1_9_3 - 0.00268465909090919*G0_1_1_9_4 + 0.000767045454545484*G0_1_1_9_5 + 0.000767045454545472*G0_1_1_9_6 - 0.00268465909090919*G0_1_1_9_7 + 0.00126014610389614*G0_1_1_9_8 - 0.0105194805194809*G0_1_1_9_9; + A[18] = -A[13] - 0.0107021103896107*G0_0_0_0_0 - 0.00522017045454566*G0_0_0_0_1 - 0.00155235389610395*G0_0_0_0_2 - 0.00168932629870137*G0_0_0_0_3 - 0.0013331980519481*G0_0_0_0_4 - 0.00590807629870149*G0_0_0_0_5 + 0.00154322240259743*G0_0_0_0_6 + 0.000374391233766265*G0_0_0_0_7 - 0.00214590097402608*G0_0_0_0_8 - 0.000821834415584455*G0_0_0_0_9 - 0.00522017045454566*G0_0_0_1_0 - 0.0932021103896135*G0_0_0_1_1 - 0.00522017045454563*G0_0_0_1_2 - 0.0452008928571443*G0_0_0_1_3 + 0.0208198051948059*G0_0_0_1_4 - 0.000593547077922093*G0_0_0_1_5 - 0.000593547077922107*G0_0_0_1_6 + 0.020819805194806*G0_0_0_1_7 - 0.0452008928571446*G0_0_0_1_8 - 0.00712256493506522*G0_0_0_1_9 - 0.00155235389610395*G0_0_0_2_0 - 0.00522017045454563*G0_0_0_2_1 - 0.0107021103896108*G0_0_0_2_2 - 0.00214590097402603*G0_0_0_2_3 + 0.000374391233766223*G0_0_0_2_4 + 0.00154322240259747*G0_0_0_2_5 - 0.00590807629870154*G0_0_0_2_6 - 0.00133319805194809*G0_0_0_2_7 - 0.00168932629870136*G0_0_0_2_8 - 0.000821834415584454*G0_0_0_2_9 - 0.00168932629870136*G0_0_0_3_0 - 0.0452008928571443*G0_0_0_3_1 - 0.00214590097402603*G0_0_0_3_2 - 0.0378043831168843*G0_0_0_3_3 + 0.0201349431818188*G0_0_0_3_4 + 0.00123275162337665*G0_0_0_3_5 + 0.00616375811688333*G0_0_0_3_6 + 0.00945109577922114*G0_0_0_3_7 - 0.0189021915584423*G0_0_0_3_8 + 0.00246550324675333*G0_0_0_3_9 - 0.0013331980519481*G0_0_0_4_0 + 0.0208198051948059*G0_0_0_4_1 + 0.000374391233766223*G0_0_0_4_2 + 0.0201349431818188*G0_0_0_4_3 - 0.0368181818181831*G0_0_0_4_4 + 0.00838271103896133*G0_0_0_4_5 - 0.0145464691558447*G0_0_0_4_6 + 0.00180803571428576*G0_0_0_4_7 + 0.00945109577922113*G0_0_0_4_8 - 0.0142999188311693*G0_0_0_4_9 - 0.00590807629870149*G0_0_0_5_0 - 0.000593547077922093*G0_0_0_5_1 + 0.00154322240259747*G0_0_0_5_2 + 0.00123275162337665*G0_0_0_5_3 + 0.00838271103896133*G0_0_0_5_4 - 0.0613088474025994*G0_0_0_5_5 + 0.0146286525974031*G0_0_0_5_6 - 0.0145464691558446*G0_0_0_5_7 + 0.00616375811688333*G0_0_0_5_8 - 0.00986201298701333*G0_0_0_5_9 + 0.00154322240259743*G0_0_0_6_0 - 0.000593547077922107*G0_0_0_6_1 - 0.00590807629870154*G0_0_0_6_2 + 0.00616375811688333*G0_0_0_6_3 - 0.0145464691558447*G0_0_0_6_4 + 0.0146286525974031*G0_0_0_6_5 - 0.0613088474025995*G0_0_0_6_6 + 0.00838271103896132*G0_0_0_6_7 + 0.00123275162337666*G0_0_0_6_8 - 0.00986201298701332*G0_0_0_6_9 + 0.000374391233766265*G0_0_0_7_0 + 0.020819805194806*G0_0_0_7_1 - 0.00133319805194809*G0_0_0_7_2 + 0.00945109577922114*G0_0_0_7_3 + 0.00180803571428576*G0_0_0_7_4 - 0.0145464691558446*G0_0_0_7_5 + 0.00838271103896132*G0_0_0_7_6 - 0.0368181818181832*G0_0_0_7_7 + 0.020134943181819*G0_0_0_7_8 - 0.0142999188311693*G0_0_0_7_9 - 0.00214590097402608*G0_0_0_8_0 - 0.0452008928571446*G0_0_0_8_1 - 0.00168932629870136*G0_0_0_8_2 - 0.0189021915584423*G0_0_0_8_3 + 0.00945109577922113*G0_0_0_8_4 + 0.00616375811688332*G0_0_0_8_5 + 0.00123275162337666*G0_0_0_8_6 + 0.020134943181819*G0_0_0_8_7 - 0.0378043831168846*G0_0_0_8_8 + 0.00246550324675333*G0_0_0_8_9 - 0.000821834415584454*G0_0_0_9_0 - 0.00712256493506522*G0_0_0_9_1 - 0.000821834415584454*G0_0_0_9_2 + 0.00246550324675332*G0_0_0_9_3 - 0.0142999188311693*G0_0_0_9_4 - 0.00986201298701333*G0_0_0_9_5 - 0.00986201298701332*G0_0_0_9_6 - 0.0142999188311693*G0_0_0_9_7 + 0.00246550324675333*G0_0_0_9_8 - 0.104537337662341*G0_0_0_9_9; + A[88] = -A[83] + 0.0445799512987028*G0_0_0_0_0 + 0.00914062500000034*G0_0_0_0_1 + 0.00301339285714296*G0_0_0_0_2 + 0.00213676948051956*G0_0_0_0_3 + 0.00115056818181821*G0_0_0_0_4 + 0.0295860389610399*G0_0_0_0_5 - 0.0123275162337666*G0_0_0_0_6 + 0.00156148538961039*G0_0_0_0_7 - 0.00558847402597416*G0_0_0_0_8 - 0.0039448051948053*G0_0_0_0_9 + 0.00914062500000034*G0_0_0_1_0 + 0.14683441558442*G0_0_0_1_1 + 0.00674817370129892*G0_0_0_1_2 + 0.0723214285714309*G0_0_0_1_3 - 0.0299969561688321*G0_0_0_1_4 + 0.00435572240259754*G0_0_0_1_5 + 0.00139711850649356*G0_0_0_1_6 - 0.0316406250000012*G0_0_0_1_7 + 0.053419237012989*G0_0_0_1_8 + 0.0024655032467534*G0_0_0_1_9 + 0.00301339285714296*G0_0_0_2_0 + 0.00674817370129892*G0_0_0_2_1 + 0.00462053571428591*G0_0_0_2_2 + 0.0106838474025977*G0_0_0_2_3 - 0.00805397727272751*G0_0_0_2_4 + 0.00723214285714308*G0_0_0_2_5 - 0.0065746753246755*G0_0_0_2_6 + 0.00977982954545488*G0_0_0_2_7 + 0.0100263798701302*G0_0_0_2_8 + 0.0167654220779227*G0_0_0_2_9 + 0.00213676948051956*G0_0_0_3_0 + 0.0723214285714309*G0_0_0_3_1 + 0.0106838474025977*G0_0_0_3_2 + 0.0517755681818196*G0_0_0_3_3 - 0.0510359172077939*G0_0_0_3_4 - 0.00591720779220797*G0_0_0_3_5 - 0.011834415584416*G0_0_0_3_6 - 0.0140533685064941*G0_0_0_3_7 + 0.05177556818182*G0_0_0_3_8 + 0.020710227272728*G0_0_0_3_9 + 0.00115056818181821*G0_0_0_4_0 - 0.0299969561688321*G0_0_0_4_1 - 0.00805397727272751*G0_0_0_4_2 - 0.0510359172077939*G0_0_0_4_3 + 0.0369825487012998*G0_0_0_4_4 - 0.01109476461039*G0_0_0_4_5 + 0.022929180194806*G0_0_0_4_6 - 0.012574066558442*G0_0_0_4_7 - 0.037722199675326*G0_0_0_4_8 - 0.0281067370129881*G0_0_0_4_9 + 0.0295860389610399*G0_0_0_5_0 + 0.00435572240259754*G0_0_0_5_1 + 0.00723214285714308*G0_0_0_5_2 - 0.00591720779220797*G0_0_0_5_3 - 0.01109476461039*G0_0_0_5_4 + 0.19230925324676*G0_0_0_5_5 - 0.0355032467532479*G0_0_0_5_6 + 0.057692775974028*G0_0_0_5_7 - 0.020710227272728*G0_0_0_5_8 + 0.053254870129872*G0_0_0_5_9 - 0.0123275162337666*G0_0_0_6_0 + 0.00139711850649356*G0_0_0_6_1 - 0.0065746753246755*G0_0_0_6_2 - 0.011834415584416*G0_0_0_6_3 + 0.022929180194806*G0_0_0_6_4 - 0.0355032467532479*G0_0_0_6_5 + 0.091716720779224*G0_0_0_6_6 - 0.0369825487013*G0_0_0_6_7 - 0.013313717532468*G0_0_0_6_8 - 0.026627435064936*G0_0_0_6_9 + 0.00156148538961039*G0_0_0_7_0 - 0.0316406250000012*G0_0_0_7_1 + 0.00977982954545488*G0_0_0_7_2 - 0.0140533685064941*G0_0_0_7_3 - 0.012574066558442*G0_0_0_7_4 + 0.057692775974028*G0_0_0_7_5 - 0.0369825487013*G0_0_0_7_6 + 0.174557629870136*G0_0_0_7_7 - 0.00813616071428613*G0_0_0_7_8 + 0.0857995129870161*G0_0_0_7_9 - 0.00558847402597416*G0_0_0_8_0 + 0.053419237012989*G0_0_0_8_1 + 0.0100263798701302*G0_0_0_8_2 + 0.05177556818182*G0_0_0_8_3 - 0.037722199675326*G0_0_0_8_4 - 0.020710227272728*G0_0_0_8_5 - 0.013313717532468*G0_0_0_8_6 - 0.00813616071428614*G0_0_0_8_7 + 0.15532670454546*G0_0_0_8_8 + 0.0680478896103919*G0_0_0_8_9 - 0.0039448051948053*G0_0_0_9_0 + 0.0024655032467534*G0_0_0_9_1 + 0.0167654220779227*G0_0_0_9_2 + 0.020710227272728*G0_0_0_9_3 - 0.0281067370129881*G0_0_0_9_4 + 0.053254870129872*G0_0_0_9_5 - 0.026627435064936*G0_0_0_9_6 + 0.0857995129870161*G0_0_0_9_7 + 0.0680478896103919*G0_0_0_9_8 + 0.408287337662351*G0_0_0_9_9 - 0.0017167207792208*G0_1_0_0_0 + 0.00904017857142893*G0_1_0_0_1 + 0.000127840909090921*G0_1_0_0_2 - 0.00180803571428576*G0_1_0_0_3 - 0.00205458603896112*G0_1_0_0_4 + 0.000493100649350666*G0_1_0_0_6 - 0.000904017857142899*G0_1_0_0_7 + 0.00673904220779248*G0_1_0_0_8 - 0.00690340909090933*G0_1_0_0_9 + 0.00904017857142893*G0_1_0_1_0 + 0.161627435064941*G0_1_0_1_1 + 0.00904017857142887*G0_1_0_1_2 + 0.0912236201298732*G0_1_0_1_3 - 0.0394480519480532*G0_1_0_1_4 - 0.00328733766233778*G0_1_0_1_5 - 0.00328733766233777*G0_1_0_1_6 - 0.0394480519480534*G0_1_0_1_7 + 0.0912236201298736*G0_1_0_1_8 + 0.0246550324675334*G0_1_0_1_9 + 0.000127840909090921*G0_1_0_2_0 + 0.00904017857142887*G0_1_0_2_1 - 0.0017167207792208*G0_1_0_2_2 + 0.00673904220779243*G0_1_0_2_3 - 0.000904017857142871*G0_1_0_2_4 + 0.000493100649350651*G0_1_0_2_5 - 0.00205458603896112*G0_1_0_2_7 - 0.00180803571428576*G0_1_0_2_8 - 0.00690340909090931*G0_1_0_2_9 - 0.00180803571428576*G0_1_0_3_0 + 0.0912236201298732*G0_1_0_3_1 + 0.00673904220779243*G0_1_0_3_2 - 0.0369825487012999*G0_1_0_3_4 + 0.010355113636364*G0_1_0_3_5 + 0.00443790584415597*G0_1_0_3_6 - 0.0739650974025998*G0_1_0_3_9 - 0.00205458603896112*G0_1_0_4_0 - 0.0394480519480532*G0_1_0_4_1 - 0.000904017857142873*G0_1_0_4_2 - 0.0369825487012999*G0_1_0_4_3 + 0.00147930194805201*G0_1_0_4_4 + 0.000739650974025995*G0_1_0_4_5 - 0.00517755681818197*G0_1_0_4_6 + 0.00887581168831203*G0_1_0_4_7 + 0.0192309253246759*G0_1_0_4_9 - 0.00328733766233778*G0_1_0_5_1 + 0.000493100649350651*G0_1_0_5_2 + 0.010355113636364*G0_1_0_5_3 + 0.000739650974025995*G0_1_0_5_4 - 0.011834415584416*G0_1_0_5_5 + 0.00147930194805197*G0_1_0_5_6 - 0.005177556818182*G0_1_0_5_7 + 0.00443790584415599*G0_1_0_5_8 + 0.011834415584416*G0_1_0_5_9 + 0.000493100649350666*G0_1_0_6_0 - 0.00328733766233777*G0_1_0_6_1 + 0.00443790584415596*G0_1_0_6_3 - 0.00517755681818197*G0_1_0_6_4 + 0.00147930194805197*G0_1_0_6_5 - 0.0118344155844159*G0_1_0_6_6 + 0.000739650974026004*G0_1_0_6_7 + 0.010355113636364*G0_1_0_6_8 + 0.011834415584416*G0_1_0_6_9 - 0.000904017857142899*G0_1_0_7_0 - 0.0394480519480534*G0_1_0_7_1 - 0.00205458603896112*G0_1_0_7_2 + 0.00887581168831204*G0_1_0_7_4 - 0.005177556818182*G0_1_0_7_5 + 0.000739650974026004*G0_1_0_7_6 + 0.00147930194805205*G0_1_0_7_7 - 0.0369825487013002*G0_1_0_7_8 + 0.0192309253246759*G0_1_0_7_9 + 0.00673904220779248*G0_1_0_8_0 + 0.0912236201298736*G0_1_0_8_1 - 0.00180803571428576*G0_1_0_8_2 + 0.00443790584415599*G0_1_0_8_5 + 0.010355113636364*G0_1_0_8_6 - 0.0369825487013002*G0_1_0_8_7 - 0.0739650974025998*G0_1_0_8_9 - 0.00690340909090933*G0_1_0_9_0 + 0.0246550324675334*G0_1_0_9_1 - 0.00690340909090931*G0_1_0_9_2 - 0.0739650974025998*G0_1_0_9_3 + 0.0192309253246759*G0_1_0_9_4 + 0.011834415584416*G0_1_0_9_5 + 0.011834415584416*G0_1_0_9_6 + 0.0192309253246759*G0_1_0_9_7 - 0.0739650974025998*G0_1_0_9_8 - 0.142012987012992*G0_1_0_9_9; + A[43] = -A[63] + 0.00341517857142874*G0_1_0_0_0 - 0.00166193181818187*G0_1_0_0_1 + 0.00249289772727283*G0_1_0_0_2 + 0.0119165990259745*G0_1_0_0_3 + 0.0114234983766238*G0_1_0_0_4 - 0.00378043831168845*G0_1_0_0_5 + 0.00928672889610422*G0_1_0_0_6 - 0.00419135551948065*G0_1_0_0_7 + 0.00221895292207799*G0_1_0_0_8 + 0.0261343344155853*G0_1_0_0_9 - 0.00166193181818187*G0_1_0_1_0 - 0.00611810064935085*G0_1_0_1_1 + 0.00325994318181831*G0_1_0_1_2 - 0.0190665584415591*G0_1_0_1_3 - 0.000575284090909117*G0_1_0_1_4 - 0.00041091720779223*G0_1_0_1_5 - 0.000410917207792213*G0_1_0_1_6 + 0.00714995941558466*G0_1_0_1_7 - 0.0101085633116887*G0_1_0_1_8 - 0.0172585227272733*G0_1_0_1_9 + 0.00249289772727283*G0_1_0_2_0 + 0.00325994318181831*G0_1_0_2_1 + 0.0717735389610414*G0_1_0_2_2 - 0.0172585227272733*G0_1_0_2_3 + 0.01479301948052*G0_1_0_2_4 - 0.0123275162337667*G0_1_0_2_5 + 0.0394480519480534*G0_1_0_2_6 + 0.00156148538961044*G0_1_0_2_7 - 0.00238331980519488*G0_1_0_2_8 - 0.00493100649350665*G0_1_0_2_9 + 0.0119165990259745*G0_1_0_3_0 - 0.0190665584415591*G0_1_0_3_1 - 0.0172585227272733*G0_1_0_3_2 + 0.2218952922078*G0_1_0_3_3 + 0.0229291801948061*G0_1_0_3_4 - 0.016272321428572*G0_1_0_3_5 - 0.000739650974026018*G0_1_0_3_6 - 0.037722199675326*G0_1_0_3_7 + 0.032544642857144*G0_1_0_3_8 + 0.127219967532472*G0_1_0_3_9 + 0.0114234983766238*G0_1_0_4_0 - 0.000575284090909117*G0_1_0_4_1 + 0.01479301948052*G0_1_0_4_2 + 0.0229291801948061*G0_1_0_4_3 + 0.1479301948052*G0_1_0_4_4 - 0.036242897727274*G0_1_0_4_5 + 0.0369825487013*G0_1_0_4_6 - 0.01849127435065*G0_1_0_4_7 + 0.00517755681818198*G0_1_0_4_8 + 0.0872788149350679*G0_1_0_4_9 - 0.00378043831168845*G0_1_0_5_0 - 0.000410917207792229*G0_1_0_5_1 - 0.0123275162337667*G0_1_0_5_2 - 0.016272321428572*G0_1_0_5_3 - 0.036242897727274*G0_1_0_5_4 - 0.0325446428571439*G0_1_0_5_5 - 0.045118709415586*G0_1_0_5_6 + 0.00739650974025999*G0_1_0_5_7 - 0.000739650974026004*G0_1_0_5_8 - 0.0769237012987039*G0_1_0_5_9 + 0.00928672889610422*G0_1_0_6_0 - 0.000410917207792213*G0_1_0_6_1 + 0.0394480519480534*G0_1_0_6_2 - 0.000739650974026021*G0_1_0_6_3 + 0.0369825487013*G0_1_0_6_4 - 0.045118709415586*G0_1_0_6_5 - 0.00665685876623399*G0_1_0_6_7 + 0.00517755681818198*G0_1_0_6_8 + 0.016272321428572*G0_1_0_6_9 - 0.00419135551948065*G0_1_0_7_0 + 0.00714995941558466*G0_1_0_7_1 + 0.00156148538961044*G0_1_0_7_2 - 0.037722199675326*G0_1_0_7_3 - 0.01849127435065*G0_1_0_7_4 + 0.00739650974025999*G0_1_0_7_5 - 0.00665685876623399*G0_1_0_7_6 + 0.00591720779220799*G0_1_0_7_7 - 0.00739650974026*G0_1_0_7_8 - 0.0650892857142879*G0_1_0_7_9 + 0.00221895292207799*G0_1_0_8_0 - 0.0101085633116887*G0_1_0_8_1 - 0.00238331980519488*G0_1_0_8_2 + 0.032544642857144*G0_1_0_8_3 + 0.00517755681818198*G0_1_0_8_4 - 0.000739650974026003*G0_1_0_8_5 + 0.00517755681818198*G0_1_0_8_6 - 0.00739650974026*G0_1_0_8_7 - 0.020710227272728*G0_1_0_8_8 + 0.041420454545456*G0_1_0_8_9 + 0.0261343344155853*G0_1_0_9_0 - 0.0172585227272733*G0_1_0_9_1 - 0.00493100649350665*G0_1_0_9_2 + 0.127219967532472*G0_1_0_9_3 + 0.0872788149350679*G0_1_0_9_4 - 0.0769237012987039*G0_1_0_9_5 + 0.016272321428572*G0_1_0_9_6 - 0.0650892857142879*G0_1_0_9_7 + 0.041420454545456*G0_1_0_9_8 + 0.408287337662351*G0_1_0_9_9 + 0.00162540584415586*G0_1_1_0_0 - 0.00705864448051976*G0_1_1_0_1 - 0.000100446428571437*G0_1_1_0_2 + 0.00271205357142868*G0_1_1_0_3 + 0.00197240259740267*G0_1_1_0_4 + 0.00147930194805198*G0_1_1_0_5 - 0.000493100649350664*G0_1_1_0_6 + 0.00846489448051975*G0_1_1_0_7 - 0.0119987824675329*G0_1_1_0_8 + 0.00641030844155867*G0_1_1_0_9 - 0.00705864448051976*G0_1_1_1_0 - 0.0925933441558473*G0_1_1_1_1 - 0.00373478084415597*G0_1_1_1_2 - 0.0406808035714299*G0_1_1_1_3 + 0.0172585227272733*G0_1_1_1_4 + 0.001479301948052*G0_1_1_1_5 + 0.0345170454545467*G0_1_1_1_7 - 0.0727323457792234*G0_1_1_1_8 - 0.0172585227272733*G0_1_1_1_9 - 0.000100446428571437*G0_1_1_2_0 - 0.00373478084415597*G0_1_1_2_1 + 0.00273944805194808*G0_1_1_2_2 - 0.00476663961038975*G0_1_1_2_3 + 0.00410917207792219*G0_1_1_2_4 - 0.000657467532467542*G0_1_1_2_5 + 0.00328733766233774*G0_1_1_2_6 + 0.00221895292207799*G0_1_1_2_7 - 0.00961546266233798*G0_1_1_2_8 + 0.000493100649350658*G0_1_1_2_9 + 0.00271205357142868*G0_1_1_3_0 - 0.0406808035714299*G0_1_1_3_1 - 0.00476663961038975*G0_1_1_3_2 + 0.0976339285714323*G0_1_1_3_3 + 0.015532670454546*G0_1_1_3_4 - 0.00887581168831201*G0_1_1_3_5 + 0.00517755681818198*G0_1_1_3_6 - 0.00295860389610402*G0_1_1_3_7 - 0.0310653409090919*G0_1_1_3_8 + 0.057692775974028*G0_1_1_3_9 + 0.00197240259740267*G0_1_1_4_0 + 0.0172585227272733*G0_1_1_4_1 + 0.00410917207792219*G0_1_1_4_2 + 0.015532670454546*G0_1_1_4_3 + 0.00443790584415604*G0_1_1_4_4 - 0.000739650974025995*G0_1_1_4_5 - 0.00443790584415598*G0_1_1_4_6 - 0.00887581168831198*G0_1_1_4_7 + 0.0340239448051959*G0_1_1_4_8 + 0.00147930194805198*G0_1_1_5_0 + 0.001479301948052*G0_1_1_5_1 - 0.000657467532467542*G0_1_1_5_2 - 0.00887581168831201*G0_1_1_5_3 - 0.000739650974025995*G0_1_1_5_4 - 0.00887581168831199*G0_1_1_5_5 - 0.000739650974025976*G0_1_1_5_6 + 0.000739650974025987*G0_1_1_5_7 + 0.000739650974026*G0_1_1_5_8 - 0.020710227272728*G0_1_1_5_9 - 0.000493100649350664*G0_1_1_6_0 + 0.00328733766233774*G0_1_1_6_2 + 0.00517755681818198*G0_1_1_6_3 - 0.00443790584415598*G0_1_1_6_4 - 0.000739650974025976*G0_1_1_6_5 - 0.010355113636364*G0_1_1_6_6 - 0.00147930194805198*G0_1_1_6_7 + 0.0118344155844159*G0_1_1_6_8 - 0.011834415584416*G0_1_1_6_9 + 0.00846489448051975*G0_1_1_7_0 + 0.0345170454545467*G0_1_1_7_1 + 0.00221895292207799*G0_1_1_7_2 - 0.00295860389610402*G0_1_1_7_3 - 0.00887581168831198*G0_1_1_7_4 + 0.000739650974025986*G0_1_1_7_5 - 0.00147930194805198*G0_1_1_7_6 - 0.0162723214285722*G0_1_1_7_7 + 0.0451187094155861*G0_1_1_7_8 - 0.016272321428572*G0_1_1_7_9 - 0.0119987824675329*G0_1_1_8_0 - 0.0727323457792234*G0_1_1_8_1 - 0.00961546266233798*G0_1_1_8_2 - 0.0310653409090919*G0_1_1_8_3 + 0.0340239448051959*G0_1_1_8_4 + 0.000739650974026*G0_1_1_8_5 + 0.0118344155844159*G0_1_1_8_6 + 0.0451187094155861*G0_1_1_8_7 - 0.257398538961048*G0_1_1_8_8 - 0.016272321428572*G0_1_1_8_9 + 0.00641030844155867*G0_1_1_9_0 - 0.0172585227272733*G0_1_1_9_1 + 0.000493100649350658*G0_1_1_9_2 + 0.057692775974028*G0_1_1_9_3 - 0.020710227272728*G0_1_1_9_5 - 0.011834415584416*G0_1_1_9_6 - 0.016272321428572*G0_1_1_9_7 - 0.016272321428572*G0_1_1_9_8 + 0.0177516233766243*G0_1_1_9_9; + A[95] = A[59] + 0.0295860389610401*G0_0_1_0_0 + 0.00372564935064948*G0_0_1_0_1 + 0.00295860389610402*G0_0_1_0_2 - 0.00147930194805198*G0_0_1_0_3 + 0.00246550324675332*G0_0_1_0_4 + 0.0468445616883133*G0_0_1_0_5 - 0.00887581168831206*G0_0_1_0_6 + 0.02218952922078*G0_0_1_0_7 - 0.0138068181818187*G0_0_1_0_8 + 0.0128206168831173*G0_0_1_0_9 + 0.00372564935064948*G0_0_1_1_0 + 0.000328733766233782*G0_0_1_1_1 + 0.00301339285714297*G0_0_1_1_2 + 0.00147930194805199*G0_0_1_1_3 - 0.00197240259740266*G0_0_1_1_4 + 0.00197240259740268*G0_0_1_1_5 - 0.0167654220779227*G0_0_1_1_6 + 0.00788961038961067*G0_0_1_1_7 - 0.00295860389610399*G0_0_1_1_8 - 0.01479301948052*G0_0_1_1_9 + 0.00295860389610402*G0_0_1_2_0 + 0.00301339285714297*G0_0_1_2_1 + 0.00986201298701339*G0_0_1_2_2 - 0.00690340909090934*G0_0_1_2_3 + 0.00739650974026003*G0_0_1_2_4 + 0.0177516233766239*G0_0_1_2_5 + 0.0123275162337667*G0_0_1_2_6 + 0.0138068181818187*G0_0_1_2_7 - 0.004437905844156*G0_0_1_2_8 + 0.0285998376623386*G0_0_1_2_9 - 0.00147930194805198*G0_0_1_3_0 + 0.00147930194805199*G0_0_1_3_1 - 0.00690340909090934*G0_0_1_3_2 + 0.0118344155844161*G0_0_1_3_3 - 0.00147930194805202*G0_0_1_3_4 + 0.00591720779220793*G0_0_1_3_5 + 0.0369825487012999*G0_0_1_3_6 - 0.00887581168831202*G0_0_1_3_7 + 0.00887581168831202*G0_0_1_3_8 + 0.0621306818181839*G0_0_1_3_9 + 0.00246550324675332*G0_0_1_4_0 - 0.00197240259740266*G0_0_1_4_1 + 0.00739650974026003*G0_0_1_4_2 - 0.00147930194805203*G0_0_1_4_3 + 0.0384618506493521*G0_0_1_4_4 - 0.020710227272728*G0_0_1_4_5 - 0.0162723214285719*G0_0_1_4_6 - 0.017751623376624*G0_0_1_4_7 - 0.0443790584415599*G0_0_1_4_9 + 0.0468445616883133*G0_0_1_5_0 + 0.00197240259740268*G0_0_1_5_1 + 0.017751623376624*G0_0_1_5_2 + 0.00591720779220793*G0_0_1_5_3 - 0.020710227272728*G0_0_1_5_4 - 0.106509740259744*G0_0_1_5_6 + 0.0739650974026*G0_0_1_5_7 - 0.0192309253246761*G0_0_1_5_8 - 0.00887581168831206*G0_0_1_6_0 - 0.0167654220779227*G0_0_1_6_1 + 0.0123275162337667*G0_0_1_6_2 + 0.0369825487012999*G0_0_1_6_3 - 0.0162723214285719*G0_0_1_6_4 - 0.106509740259744*G0_0_1_6_5 - 0.213019480519488*G0_0_1_6_6 - 0.054734172077924*G0_0_1_6_7 + 0.038461850649352*G0_0_1_6_8 - 0.159764610389616*G0_0_1_6_9 + 0.02218952922078*G0_0_1_7_0 + 0.00788961038961067*G0_0_1_7_1 + 0.0138068181818187*G0_0_1_7_2 - 0.00887581168831202*G0_0_1_7_3 - 0.017751623376624*G0_0_1_7_4 + 0.0739650974026*G0_0_1_7_5 - 0.054734172077924*G0_0_1_7_6 + 0.1479301948052*G0_0_1_7_7 - 0.0384618506493521*G0_0_1_7_8 + 0.0710064935064962*G0_0_1_7_9 - 0.0138068181818187*G0_0_1_8_0 - 0.00295860389610399*G0_0_1_8_1 - 0.004437905844156*G0_0_1_8_2 + 0.00887581168831202*G0_0_1_8_3 - 0.0192309253246761*G0_0_1_8_5 + 0.038461850649352*G0_0_1_8_6 - 0.0384618506493521*G0_0_1_8_7 + 0.0414204545454561*G0_0_1_8_8 + 0.0443790584415598*G0_0_1_8_9 + 0.0128206168831173*G0_0_1_9_0 - 0.01479301948052*G0_0_1_9_1 + 0.0285998376623386*G0_0_1_9_2 + 0.0621306818181839*G0_0_1_9_3 - 0.0443790584415599*G0_0_1_9_4 - 0.159764610389616*G0_0_1_9_6 + 0.0710064935064961*G0_0_1_9_7 + 0.0443790584415599*G0_0_1_9_8 - 0.0295860389610401*G0_1_0_0_0 - 0.00372564935064948*G0_1_0_0_1 - 0.00295860389610402*G0_1_0_0_2 + 0.00147930194805198*G0_1_0_0_3 - 0.00246550324675332*G0_1_0_0_4 - 0.0468445616883133*G0_1_0_0_5 + 0.00887581168831206*G0_1_0_0_6 - 0.02218952922078*G0_1_0_0_7 + 0.0138068181818187*G0_1_0_0_8 - 0.0128206168831173*G0_1_0_0_9 - 0.00372564935064948*G0_1_0_1_0 - 0.000328733766233782*G0_1_0_1_1 - 0.00301339285714297*G0_1_0_1_2 - 0.00147930194805199*G0_1_0_1_3 + 0.00197240259740266*G0_1_0_1_4 - 0.00197240259740268*G0_1_0_1_5 + 0.0167654220779227*G0_1_0_1_6 - 0.00788961038961067*G0_1_0_1_7 + 0.00295860389610399*G0_1_0_1_8 + 0.01479301948052*G0_1_0_1_9 - 0.00295860389610402*G0_1_0_2_0 - 0.00301339285714297*G0_1_0_2_1 - 0.00986201298701339*G0_1_0_2_2 + 0.00690340909090934*G0_1_0_2_3 - 0.00739650974026003*G0_1_0_2_4 - 0.017751623376624*G0_1_0_2_5 - 0.0123275162337667*G0_1_0_2_6 - 0.0138068181818187*G0_1_0_2_7 + 0.004437905844156*G0_1_0_2_8 - 0.0285998376623386*G0_1_0_2_9 + 0.00147930194805198*G0_1_0_3_0 - 0.00147930194805199*G0_1_0_3_1 + 0.00690340909090934*G0_1_0_3_2 - 0.0118344155844161*G0_1_0_3_3 + 0.00147930194805202*G0_1_0_3_4 - 0.00591720779220793*G0_1_0_3_5 - 0.0369825487012999*G0_1_0_3_6 + 0.00887581168831202*G0_1_0_3_7 - 0.00887581168831202*G0_1_0_3_8 - 0.0621306818181839*G0_1_0_3_9 - 0.00246550324675332*G0_1_0_4_0 + 0.00197240259740266*G0_1_0_4_1 - 0.00739650974026003*G0_1_0_4_2 + 0.00147930194805202*G0_1_0_4_3 - 0.0384618506493521*G0_1_0_4_4 + 0.020710227272728*G0_1_0_4_5 + 0.0162723214285719*G0_1_0_4_6 + 0.017751623376624*G0_1_0_4_7 + 0.04437905844156*G0_1_0_4_9 - 0.0468445616883133*G0_1_0_5_0 - 0.00197240259740268*G0_1_0_5_1 - 0.017751623376624*G0_1_0_5_2 - 0.00591720779220793*G0_1_0_5_3 + 0.020710227272728*G0_1_0_5_4 + 0.106509740259744*G0_1_0_5_6 - 0.0739650974026*G0_1_0_5_7 + 0.0192309253246761*G0_1_0_5_8 + 0.00887581168831206*G0_1_0_6_0 + 0.0167654220779227*G0_1_0_6_1 - 0.0123275162337667*G0_1_0_6_2 - 0.0369825487012999*G0_1_0_6_3 + 0.0162723214285719*G0_1_0_6_4 + 0.106509740259744*G0_1_0_6_5 + 0.213019480519488*G0_1_0_6_6 + 0.054734172077924*G0_1_0_6_7 - 0.038461850649352*G0_1_0_6_8 + 0.159764610389616*G0_1_0_6_9 - 0.02218952922078*G0_1_0_7_0 - 0.00788961038961067*G0_1_0_7_1 - 0.0138068181818187*G0_1_0_7_2 + 0.00887581168831202*G0_1_0_7_3 + 0.017751623376624*G0_1_0_7_4 - 0.0739650974026*G0_1_0_7_5 + 0.054734172077924*G0_1_0_7_6 - 0.1479301948052*G0_1_0_7_7 + 0.0384618506493521*G0_1_0_7_8 - 0.0710064935064962*G0_1_0_7_9 + 0.0138068181818187*G0_1_0_8_0 + 0.00295860389610399*G0_1_0_8_1 + 0.004437905844156*G0_1_0_8_2 - 0.00887581168831202*G0_1_0_8_3 + 0.0192309253246761*G0_1_0_8_5 - 0.038461850649352*G0_1_0_8_6 + 0.0384618506493521*G0_1_0_8_7 - 0.0414204545454561*G0_1_0_8_8 - 0.0443790584415598*G0_1_0_8_9 - 0.0128206168831173*G0_1_0_9_0 + 0.01479301948052*G0_1_0_9_1 - 0.0285998376623386*G0_1_0_9_2 - 0.0621306818181839*G0_1_0_9_3 + 0.04437905844156*G0_1_0_9_4 + 0.159764610389616*G0_1_0_9_6 - 0.0710064935064962*G0_1_0_9_7 - 0.0443790584415599*G0_1_0_9_8; + A[52] = -A[32] - 0.00196022727272735*G0_0_1_0_0 - 0.000980113636363668*G0_0_1_0_2 - 0.00213676948051956*G0_0_1_0_3 + 0.00213676948051957*G0_0_1_0_4 - 0.00109577922077925*G0_0_1_0_5 - 0.00405438311688327*G0_0_1_0_6 - 0.00158887987012993*G0_0_1_0_7 + 0.000876623376623407*G0_0_1_0_8 - 0.00525974025974045*G0_0_1_0_9 + 0.00196022727272733*G0_0_1_1_1 + 0.00098011363636367*G0_0_1_1_2 + 0.00109577922077924*G0_0_1_1_3 + 0.00405438311688327*G0_0_1_1_4 + 0.00213676948051955*G0_0_1_1_5 - 0.00213676948051956*G0_0_1_1_6 - 0.000876623376623403*G0_0_1_1_7 + 0.00158887987012992*G0_0_1_1_8 + 0.00525974025974044*G0_0_1_1_9 - 0.000980113636363668*G0_0_1_2_0 + 0.00098011363636367*G0_0_1_2_1 - 0.00493100649350667*G0_0_1_2_3 + 0.01479301948052*G0_0_1_2_4 + 0.00493100649350665*G0_0_1_2_5 - 0.0147930194805199*G0_0_1_2_6 - 0.00016436688311689*G0_0_1_2_7 + 0.000164366883116885*G0_0_1_2_8 - 0.00213676948051956*G0_0_1_3_0 + 0.00109577922077924*G0_0_1_3_1 - 0.00493100649350667*G0_0_1_3_2 - 0.035503246753248*G0_0_1_3_3 - 0.0212033279220786*G0_0_1_3_4 + 0.00641030844155864*G0_0_1_3_6 + 0.00641030844155867*G0_0_1_3_7 - 0.005917207792208*G0_0_1_3_8 - 0.0285998376623387*G0_0_1_3_9 + 0.00213676948051957*G0_0_1_4_0 + 0.00405438311688327*G0_0_1_4_1 + 0.01479301948052*G0_0_1_4_2 - 0.0212033279220786*G0_0_1_4_3 + 0.0936891233766266*G0_0_1_4_4 - 0.00641030844155868*G0_0_1_4_5 - 0.002958603896104*G0_0_1_4_7 - 0.00049310064935066*G0_0_1_4_8 + 0.0128206168831173*G0_0_1_4_9 - 0.00109577922077925*G0_0_1_5_0 + 0.00213676948051955*G0_0_1_5_1 + 0.00493100649350665*G0_0_1_5_2 - 0.00641030844155867*G0_0_1_5_4 + 0.0355032467532479*G0_0_1_5_5 + 0.0212033279220786*G0_0_1_5_6 + 0.005917207792208*G0_0_1_5_7 - 0.00641030844155866*G0_0_1_5_8 + 0.0285998376623386*G0_0_1_5_9 - 0.00405438311688327*G0_0_1_6_0 - 0.00213676948051956*G0_0_1_6_1 - 0.01479301948052*G0_0_1_6_2 + 0.00641030844155864*G0_0_1_6_3 + 0.0212033279220786*G0_0_1_6_5 - 0.0936891233766265*G0_0_1_6_6 + 0.000493100649350656*G0_0_1_6_7 + 0.00295860389610399*G0_0_1_6_8 - 0.0128206168831173*G0_0_1_6_9 - 0.00158887987012993*G0_0_1_7_0 - 0.000876623376623403*G0_0_1_7_1 - 0.00016436688311689*G0_0_1_7_2 + 0.00641030844155866*G0_0_1_7_3 - 0.002958603896104*G0_0_1_7_4 + 0.005917207792208*G0_0_1_7_5 + 0.000493100649350656*G0_0_1_7_6 - 0.00394480519480534*G0_0_1_7_7 + 0.01479301948052*G0_0_1_7_9 + 0.000876623376623407*G0_0_1_8_0 + 0.00158887987012992*G0_0_1_8_1 + 0.000164366883116885*G0_0_1_8_2 - 0.005917207792208*G0_0_1_8_3 - 0.00049310064935066*G0_0_1_8_4 - 0.00641030844155866*G0_0_1_8_5 + 0.00295860389610399*G0_0_1_8_6 + 0.0039448051948053*G0_0_1_8_8 - 0.01479301948052*G0_0_1_8_9 - 0.00525974025974045*G0_0_1_9_0 + 0.00525974025974044*G0_0_1_9_1 - 0.0285998376623386*G0_0_1_9_3 + 0.0128206168831173*G0_0_1_9_4 + 0.0285998376623386*G0_0_1_9_5 - 0.0128206168831173*G0_0_1_9_6 + 0.01479301948052*G0_0_1_9_7 - 0.01479301948052*G0_0_1_9_8 + 0.0180560064935071*G0_1_1_0_0 + 0.00271814123376633*G0_1_1_0_1 + 0.00281554383116895*G0_1_1_0_2 - 0.00125101461038967*G0_1_1_0_3 + 0.00176237824675333*G0_1_1_0_4 + 0.00462053571428586*G0_1_1_0_5 - 0.00315949675324684*G0_1_1_0_6 + 0.0116517857142861*G0_1_1_0_7 - 0.00341517857142868*G0_1_1_0_8 - 0.000986201298701324*G0_1_1_0_9 + 0.00271814123376633*G0_1_1_1_0 + 0.0200162337662344*G0_1_1_1_1 + 0.00379565746753261*G0_1_1_1_2 + 0.00571631493506511*G0_1_1_1_3 + 0.000894886363636418*G0_1_1_1_4 + 0.000885754870129894*G0_1_1_1_5 - 0.000374391233766236*G0_1_1_1_6 - 0.00429180194805211*G0_1_1_1_7 + 0.0132406655844161*G0_1_1_1_8 + 0.00427353896103911*G0_1_1_1_9 + 0.00281554383116895*G0_1_1_2_0 + 0.00379565746753261*G0_1_1_2_1 + 0.0471185064935082*G0_1_1_2_2 - 0.0130945616883122*G0_1_1_2_3 + 0.0306818181818193*G0_1_1_2_4 - 0.00816355519480551*G0_1_1_2_5 + 0.0158887987012993*G0_1_1_2_6 + 0.000721387987013008*G0_1_1_2_7 + 0.000885754870129896*G0_1_1_2_8 + 0.00372564935064949*G0_1_1_2_9 - 0.00125101461038967*G0_1_1_3_0 + 0.00571631493506511*G0_1_1_3_1 - 0.0130945616883122*G0_1_1_3_2 - 0.0161079545454551*G0_1_1_3_3 - 0.0222717126623384*G0_1_1_3_4 + 0.00230113636363646*G0_1_1_3_5 - 0.00238331980519493*G0_1_1_3_6 + 0.000246550324675333*G0_1_1_3_7 + 0.00591720779220798*G0_1_1_3_8 - 0.013313717532468*G0_1_1_3_9 + 0.00176237824675332*G0_1_1_4_0 + 0.000894886363636417*G0_1_1_4_1 + 0.0306818181818193*G0_1_1_4_2 - 0.0222717126623384*G0_1_1_4_3 + 0.0726501623376649*G0_1_1_4_4 - 0.00879362824675359*G0_1_1_4_5 + 0.0111769480519485*G0_1_1_4_6 - 0.00197240259740267*G0_1_1_4_7 - 0.00616375811688331*G0_1_1_4_8 + 0.00641030844155868*G0_1_1_4_9 + 0.00462053571428586*G0_1_1_5_0 + 0.000885754870129895*G0_1_1_5_1 - 0.00816355519480552*G0_1_1_5_2 + 0.00230113636363646*G0_1_1_5_3 - 0.00879362824675359*G0_1_1_5_4 + 0.0193952922077929*G0_1_1_5_5 - 0.00106838474025984*G0_1_1_5_6 + 0.011834415584416*G0_1_1_5_7 - 0.00616375811688332*G0_1_1_5_8 + 0.0152861201298706*G0_1_1_5_9 - 0.00315949675324684*G0_1_1_6_0 - 0.000374391233766236*G0_1_1_6_1 + 0.0158887987012993*G0_1_1_6_2 - 0.00238331980519493*G0_1_1_6_3 + 0.0111769480519485*G0_1_1_6_4 - 0.00106838474025984*G0_1_1_6_5 - 0.0210389610389616*G0_1_1_6_6 - 0.00567065746753266*G0_1_1_6_7 + 0.000986201298701331*G0_1_1_6_8 - 0.00641030844155862*G0_1_1_6_9 + 0.0116517857142861*G0_1_1_7_0 - 0.00429180194805211*G0_1_1_7_1 + 0.000721387987013008*G0_1_1_7_2 + 0.000246550324675333*G0_1_1_7_3 - 0.00197240259740267*G0_1_1_7_4 + 0.011834415584416*G0_1_1_7_5 - 0.00567065746753266*G0_1_1_7_6 + 0.0535836038961057*G0_1_1_7_7 - 0.0201349431818189*G0_1_1_7_8 + 0.0142999188311693*G0_1_1_7_9 - 0.00341517857142868*G0_1_1_8_0 + 0.0132406655844161*G0_1_1_8_1 + 0.000885754870129896*G0_1_1_8_2 + 0.00591720779220798*G0_1_1_8_3 - 0.00616375811688331*G0_1_1_8_4 - 0.00616375811688332*G0_1_1_8_5 + 0.000986201298701331*G0_1_1_8_6 - 0.0201349431818189*G0_1_1_8_7 + 0.057528409090911*G0_1_1_8_8 - 0.000493100649350695*G0_1_1_8_9 - 0.000986201298701323*G0_1_1_9_0 + 0.00427353896103911*G0_1_1_9_1 + 0.00372564935064949*G0_1_1_9_2 - 0.013313717532468*G0_1_1_9_3 + 0.00641030844155868*G0_1_1_9_4 + 0.0152861201298706*G0_1_1_9_5 - 0.00641030844155863*G0_1_1_9_6 + 0.0142999188311693*G0_1_1_9_7 - 0.000493100649350693*G0_1_1_9_8 + 0.0374756493506506*G0_1_1_9_9; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p3_q3_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p3_q3_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q3_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q3_tensor_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f2_p3_q3_tensor_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f2_p3_q3_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q3_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q3_tensor_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f2_p3_q3_tensor_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f2_p3_q3_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q3_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q3_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p3_q4_quadrature.h b/laplacian_2d/laplacian_f2_p3_q4_quadrature.h new file mode 100644 index 0000000..b15f8ca --- /dev/null +++ b/laplacian_2d/laplacian_f2_p3_q4_quadrature.h @@ -0,0 +1,8550 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P3_Q4_QUADRATURE_H +#define __LAPLACIAN_F2_P3_Q4_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q4_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q4_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q4_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q4_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q4_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q4_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q4_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q4_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q4_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q4_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q4_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q4_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p3_q4_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p3_q4_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W49[49] = {0.0036234660797264, 0.00715464377909735, 0.00824760301353097, 0.00693554275373524, 0.00429791008798315, 0.00177448507143835, 0.000337590756711431, 0.00782718664849641, 0.0154550176627367, 0.0178159604006788, 0.0149817292193919, 0.0092840787568901, 0.00383313257348533, 0.000729242610651687, 0.0106850106013168, 0.021097877818156, 0.0243208363749012, 0.0204517846225132, 0.0126738360020949, 0.00523266711568851, 0.000995500091625133, 0.0116960367644213, 0.0230941796709132, 0.0266220977213878, 0.0223869525046108, 0.0138730467715663, 0.00572778720065371, 0.00108969528483177, 0.0106850106013168, 0.021097877818156, 0.0243208363749012, 0.0204517846225133, 0.0126738360020949, 0.00523266711568852, 0.000995500091625133, 0.00782718664849641, 0.0154550176627367, 0.0178159604006788, 0.0149817292193919, 0.0092840787568901, 0.00383313257348533, 0.000729242610651687, 0.00362346607972641, 0.00715464377909737, 0.00824760301353099, 0.00693554275373526, 0.00429791008798316, 0.00177448507143835, 0.000337590756711432}; + // Quadrature points on the UFC reference element: (0.0248740323760607, 0.0224793864387125), (0.0225279156156636, 0.114679053160904), (0.0186827443488427, 0.265789822784589), (0.0139228951565961, 0.452846373669445), (0.00897290400671669, 0.64737528288683), (0.00458641254163789, 0.819759308263108), (0.00143165958133296, 0.943737439463078), (0.126329297019669, 0.0224793864387125), (0.114413927746761, 0.114679053160904), (0.0948852170128628, 0.265789822784589), (0.0707110745463253, 0.452846373669445), (0.045571246280295, 0.64737528288683), (0.0232932989499898, 0.819759308263108), (0.00727105865856026, 0.943737439463078), (0.29039930608799, 0.0224793864387125), (0.263008866575801, 0.114679053160904), (0.218117268350298, 0.265789822784589), (0.16254699001287, 0.452846373669445), (0.104756842708482, 0.64737528288683), (0.0535454404572833, 0.819759308263108), (0.0167143365694675, 0.943737439463078), (0.488760306780644, 0.0224793864387125), (0.442660473419548, 0.114679053160904), (0.367105088607705, 0.265789822784589), (0.273576813165278, 0.452846373669445), (0.176312358556585, 0.64737528288683), (0.0901203458684462, 0.819759308263108), (0.0281312802684611, 0.943737439463078), (0.687121307473297, 0.0224793864387125), (0.622312080263294, 0.114679053160904), (0.516092908865112, 0.265789822784589), (0.384606636317686, 0.452846373669445), (0.247867874404688, 0.64737528288683), (0.126695251279609, 0.819759308263108), (0.0395482239674546, 0.943737439463078), (0.851191316541618, 0.0224793864387125), (0.770907019092334, 0.114679053160904), (0.639324960202548, 0.265789822784589), (0.47644255178423, 0.452846373669445), (0.307053470832875, 0.64737528288683), (0.156947392786903, 0.819759308263108), (0.0489915018783619, 0.943737439463078), (0.952646581185227, 0.0224793864387125), (0.862793031223432, 0.114679053160904), (0.715527432866568, 0.265789822784589), (0.533230731173959, 0.452846373669445), (0.343651813106453, 0.64737528288683), (0.175654279195255, 0.819759308263108), (0.0548309009555892, 0.943737439463078) + + // Value of basis functions at quadrature points. + static const double FE0[49][10] = \ + {{0.759259490549809, 0.0221590586807319, 0.0202565508334599, -0.00232842517935526, -0.00234650132061204, 0.179044261105492, -0.0898682781718619, 0.198117184364795, -0.0986755707370276, 0.0143822298745692}, + {0.403169832432288, 0.0202955830318149, 0.0622850658315548, -0.0108399544739675, -0.00762600105240234, 0.707224672483947, -0.292066992631152, 0.138929449658773, -0.0815548866260338, 0.0601832313451772}, + {0.0601288715882343, 0.0171413871629327, 0.032385116304693, -0.0210931449040641, -0.00452789572055778, 0.981256130427186, -0.173413152839019, 0.068973887839052, -0.0567844308941791, 0.0959332310357226}, + {-0.064004075667787, 0.0130627287158153, -0.0520748014962052, -0.0271871272651125, 0.0101725424378915, 0.651638858584826, 0.389596573201606, 0.0200348286650145, -0.03201309007429, 0.090773562898242}, + {-0.00515429610053714, 0.00861384643795112, -0.0176489825313883, -0.0254361144552716, 0.0246269466012941, 0.0309901900119197, 0.943183482680242, 0.000429537561098939, -0.0135024723402444, 0.0538978621349362}, + {0.0611980667541932, 0.00449218837368877, 0.274707138662764, -0.0166861035842362, 0.024689369513165, -0.306515799699927, 0.94557420778192, -0.00171490325731397, -0.00357542203927685, 0.0178312574950231}, + {0.0420437794348035, 0.00142244936492668, 0.718243758548968, -0.00605388489987935, 0.0111337678992375, -0.194553625202202, 0.426410393158711, -0.000295139887384638, -0.000351729145694007, 0.00200023072851285}, + {0.366019955489299, 0.0635858397592477, 0.0202565508334599, -0.00793599005513183, -0.0119173223628165, 0.133769185243817, -0.0802974571296574, 0.7517539315772, -0.300499563967438, 0.0652648706120209}, + {0.158234646728241, 0.0622463008387585, 0.0622850658315548, -0.038777608547051, -0.0387306463807783, 0.522241119924781, -0.260962347302776, 0.521033755638225, -0.260674724708381, 0.273104437977427}, + {-0.0240696255023905, 0.0582150166968705, 0.0323851163046929, -0.0811829011624888, -0.0229961059271974, 0.701945378409426, -0.15494494263238, 0.250589879114876, -0.195275554613316, 0.435333739311908}, + {-0.0583655036819059, 0.049801839277281, -0.0520748014962052, -0.113528168626855, 0.0516639246766596, 0.416833691765261, 0.348105190962838, 0.0650877647821212, -0.119443708738744, 0.41191977107955}, + {0.013058257635032, 0.0366518011112076, -0.0176489825313883, -0.114607849295939, 0.12507440711047, -0.0705223834533175, 0.842736022171066, -0.00496434292377251, -0.0543591002641987, 0.244582170440841}, + {0.0634982330351345, 0.0209085718766359, 0.274707138662764, -0.0799224708936429, 0.125391438239775, -0.306364327912917, 0.84487213905531, -0.00870528191111163, -0.0153015931693676, 0.0809161530174197}, + {0.0387198943189268, 0.00703488117358865, 0.718243758548968, -0.0302053001190502, 0.0565457602782774, -0.177478791461603, 0.380998400779672, -0.00136739165938128, -0.00156802406648272, 0.00907681220708489}, + {0.0223759175857752, 0.0211108763763083, 0.0202565508334599, -0.00378368892316172, -0.0273949291750588, 0.0737725345196536, -0.0648198503174151, 0.953028361840235, -0.115654992944011, 0.121109220204214}, + {-0.0358942747511901, 0.0335971702606884, 0.0622850658315548, -0.0286348362908939, -0.0890320226476534, 0.278414597642436, -0.210660971035901, 0.638525569803523, -0.155388486816179, 0.506788188003614}, + {-0.063910149786551, 0.050725446767189, 0.0323851163046929, -0.0901727271791657, -0.0528622683853315, 0.338438801699255, -0.125078780174246, 0.277735791976569, -0.175091373261166, 0.807830142038756}, + {-0.0250300738487931, 0.0629764585450425, -0.0520748014962052, -0.169713634674798, 0.118762379193389, 0.120557083126032, 0.281006736446109, 0.0432733750920397, -0.144139368149536, 0.764381845766722}, + {0.039923518202092, 0.0605470656066383, -0.0176489825313883, -0.209268491422469, 0.287514629552574, -0.185140210770349, 0.680295799728962, -0.0299589812144171, -0.0801249870360448, 0.453860639884402}, + {0.0636141873018032, 0.0413342706009023, 0.274707138662764, -0.165795041633989, 0.288243404445893, -0.289728237600496, 0.682020172849192, -0.018924611088712, -0.0256239169827024, 0.150152633445345}, + {0.0327882963196602, 0.0154781884654098, 0.718243758548968, -0.0674234644917184, 0.129984492389545, -0.148027265853737, 0.307559668668404, -0.00262167997101505, -0.00282544504740345, 0.0168434509718876}, + {-0.0608171838969239, -0.0608171838969239, 0.0202565508334599, 0.0230536948731184, -0.046107389746237, 0.0230536948731185, -0.0461073897462369, 0.501247265326078, 0.501247265326078, 0.144990676054469}, + {-0.0487833107612748, -0.0487833107612748, 0.0622850658315548, 0.0749232484208884, -0.149846496841777, 0.0749232484208885, -0.149846496841777, 0.289203300009696, 0.289203300009696, 0.60672145251338}, + {-0.016712547765976, -0.0167125477659761, 0.0323851163046929, 0.0444852621398943, -0.0889705242797887, 0.0444852621398942, -0.0889705242797886, 0.0614424056139961, 0.0614424056139961, 0.967125692279056}, + {0.0289180452500466, 0.0289180452500466, -0.0520748014962053, -0.0999422789098742, 0.199884557819749, -0.0999422789098744, 0.199884557819749, -0.0603778494306702, -0.0603778494306702, 0.915109852037704}, + {0.0610889883577044, 0.0610889883577043, -0.0176489825313883, -0.241952607320384, 0.483905214640768, -0.241952607320384, 0.483905214640768, -0.0658956805785702, -0.0658956805785702, 0.543357152332352}, + {0.0568664779664873, 0.0568664779664872, 0.274707138662764, -0.242565894323771, 0.485131788647542, -0.242565894323771, 0.485131788647543, -0.0266665130508418, -0.0266665130508418, 0.179761142858402}, + {0.0246703000807062, 0.0246703000807062, 0.718243758548968, -0.109386040264487, 0.218772080528974, -0.109386040264487, 0.218772080528975, -0.00326062019738045, -0.00326062019738044, 0.0201648011554063}, + {0.0211108763763084, 0.0223759175857751, 0.0202565508334598, 0.0737725345196536, -0.0648198503174151, -0.00378368892316158, -0.0273949291750586, -0.11565499294401, 0.953028361840235, 0.121109220204214}, + {0.0335971702606884, -0.0358942747511902, 0.0622850658315547, 0.278414597642436, -0.210660971035901, -0.0286348362908938, -0.0890320226476534, -0.155388486816179, 0.638525569803523, 0.506788188003614}, + {0.050725446767189, -0.063910149786551, 0.0323851163046929, 0.338438801699255, -0.125078780174246, -0.0901727271791658, -0.0528622683853314, -0.175091373261166, 0.277735791976569, 0.807830142038755}, + {0.0629764585450425, -0.0250300738487931, -0.0520748014962053, 0.120557083126032, 0.281006736446109, -0.169713634674798, 0.118762379193389, -0.144139368149536, 0.0432733750920395, 0.764381845766722}, + {0.0605470656066383, 0.0399235182020919, -0.0176489825313883, -0.185140210770348, 0.680295799728962, -0.209268491422469, 0.287514629552574, -0.0801249870360448, -0.0299589812144172, 0.453860639884402}, + {0.0413342706009023, 0.0636141873018031, 0.274707138662764, -0.289728237600496, 0.682020172849192, -0.165795041633989, 0.288243404445893, -0.0256239169827024, -0.0189246110887121, 0.150152633445345}, + {0.0154781884654099, 0.0327882963196601, 0.718243758548968, -0.148027265853737, 0.307559668668404, -0.0674234644917186, 0.129984492389545, -0.00282544504740347, -0.00262167997101503, 0.0168434509718876}, + {0.0635858397592478, 0.366019955489299, 0.0202565508334598, 0.133769185243817, -0.0802974571296574, -0.00793599005513183, -0.0119173223628163, -0.300499563967438, 0.7517539315772, 0.0652648706120206}, + {0.0622463008387585, 0.158234646728241, 0.0622850658315547, 0.522241119924781, -0.260962347302776, -0.0387776085470509, -0.0387306463807782, -0.260674724708381, 0.521033755638225, 0.273104437977427}, + {0.0582150166968705, -0.0240696255023904, 0.0323851163046928, 0.701945378409426, -0.15494494263238, -0.0811829011624887, -0.0229961059271972, -0.195275554613315, 0.250589879114876, 0.435333739311907}, + {0.049801839277281, -0.0583655036819059, -0.0520748014962053, 0.416833691765261, 0.348105190962838, -0.113528168626855, 0.0516639246766597, -0.119443708738743, 0.065087764782121, 0.41191977107955}, + {0.0366518011112077, 0.0130582576350319, -0.0176489825313883, -0.0705223834533173, 0.842736022171066, -0.114607849295939, 0.12507440711047, -0.0543591002641987, -0.00496434292377262, 0.244582170440841}, + {0.0209085718766359, 0.0634982330351344, 0.274707138662764, -0.306364327912917, 0.84487213905531, -0.0799224708936432, 0.125391438239775, -0.0153015931693677, -0.00870528191111167, 0.0809161530174198}, + {0.00703488117358871, 0.0387198943189268, 0.718243758548968, -0.177478791461603, 0.380998400779671, -0.0302053001190504, 0.0565457602782777, -0.00156802406648275, -0.00136739165938128, 0.00907681220708501}, + {0.022159058680732, 0.759259490549808, 0.0202565508334598, 0.179044261105492, -0.0898682781718618, -0.00232842517935528, -0.00234650132061198, -0.0986755707370279, 0.198117184364796, 0.0143822298745689}, + {0.0202955830318151, 0.403169832432288, 0.0622850658315547, 0.707224672483947, -0.292066992631151, -0.0108399544739675, -0.00762600105240231, -0.0815548866260341, 0.138929449658774, 0.0601832313451776}, + {0.0171413871629328, 0.0601288715882343, 0.0323851163046928, 0.981256130427186, -0.173413152839019, -0.021093144904064, -0.00452789572055773, -0.056784430894179, 0.068973887839052, 0.0959332310357224}, + {0.0130627287158154, -0.064004075667787, -0.0520748014962053, 0.651638858584826, 0.389596573201606, -0.0271871272651127, 0.0101725424378917, -0.0320130900742902, 0.0200348286650145, 0.0907735628982425}, + {0.00861384643795122, -0.00515429610053721, -0.0176489825313883, 0.0309901900119197, 0.943183482680242, -0.0254361144552718, 0.0246269466012944, -0.0135024723402446, 0.00042953756109879, 0.0538978621349366}, + {0.00449218837368882, 0.0611980667541931, 0.274707138662764, -0.306515799699927, 0.94557420778192, -0.0166861035842365, 0.0246893695131652, -0.00357542203927696, -0.00171490325731404, 0.0178312574950233}, + {0.00142244936492668, 0.0420437794348034, 0.718243758548968, -0.194553625202202, 0.426410393158711, -0.0060538848998794, 0.0111337678992378, -0.000351729145694007, -0.000295139887384582, 0.00200023072851307}}; + + static const double FE1_D01[49][14] = \ + {{-6.2983643593319, -0.694073161871321, 0.113519186381575, 0.0734840280169391, 0.0984846001518278, 11.5669209264721, -8.24212493298538, 3.66764152771654, -1.50558780011902, 0.593234886597469, -0.113519186381578, 2.01273152435652, -0.666718914614394, -0.605628324389347}, + {-3.32619259826499, 0.115046637841692, 0.104396471037129, 0.00676984349243703, -0.00727114516575689, 2.97769889864492, 0.767052857736327, -0.53360579595794, -1.02275141063035, 0.483942358105556, -0.104396471037129, 1.03662941012947, -0.490712201597989, -0.00660685433336317}, + {-0.549695655308225, 0.308459105882946, 0.0887500995675866, -0.0778807157453651, -0.0492244335023702, -3.60102441622466, 5.68556143023182, -1.84330046458188, -0.468431599918545, 0.326662099783205, -0.0887500995675859, 0.0458795243988659, -0.248781384037843, 0.471776509022054}, + {0.358406771512467, -0.239359761565477, 0.0681674900910355, -0.137931601010259, 0.0362009851498887, -3.22815496021952, 1.53784371388017, 1.57126423639236, -0.105834165766421, 0.171750926210292, -0.0681674900910327, -0.389759589990786, -0.0338193252000379, 0.459392770607321}, + {-0.103179561013745, -0.0457498117201074, 0.0453098957474664, -0.144607720032904, 0.157433585761919, 0.784869363126178, -5.04786667922461, 4.41192668883228, 0.0138543604554365, 0.0605287830611945, -0.0453098957474642, -0.288184918202206, 0.0840789369717037, 0.116896971984854}, + {-0.326491365232074, 2.27120607677057, 0.0237918574385716, -0.100095848205051, 0.178344573436363, 1.78677338877635, -4.18967397240809, 0.458185872093246, 0.00898558035535058, 0.00729789868370739, -0.0237918574385719, -0.0564211094023351, 0.0927979495213352, -0.130909044389374}, + {0.33308858961669, 5.95338639424384, 0.00757005419514645, -0.0372941056573852, 0.084376435976818, -1.8814364577812, 4.75885783633031, -9.16389636240963, -0.00316250511668703, -0.00319625519429378, -0.00757005419515089, 0.022309354568133, 0.0404903608516722, -0.103523285428255}, + {-3.01985386154978, -0.694073161871322, 0.24908562971792, 0.205018039019174, 0.50017987097331, 6.68780549330648, -6.23982472678043, 3.26594625689506, -5.5075153511621, 1.45221838319479, -0.24908562971792, 7.74679802178531, -1.65723642221396, -2.73946254159653}, + {-1.32800715611101, 0.115046637841692, 0.25521372605437, 0.020493846812117, -0.0369284176940277, 0.964409556854252, 0.752499484844729, -0.503948523429667, -3.66872618701273, 1.2825489473512, -0.255213726054369, 3.71143208946821, -1.30304279416331, -0.00577748476144757}, + {0.0931248882416956, 0.308459105882946, 0.254400845864469, -0.265236309631135, -0.249999195407129, -2.96831375426394, 4.20925546281642, -1.64252570267713, -1.58788472041106, 0.968945423022684, -0.254400845864469, -0.297554154505031, -0.703709113391549, 2.13543807032322}, + {0.293601942017483, -0.239359761565477, 0.232209135262308, -0.532011787969227, 0.183856197349245, -1.87304125263067, 0.395190047985663, 1.423609024193, -0.275539185046309, 0.570302420156437, -0.232209135262307, -1.90444363576373, -0.0382906321872113, 1.9961266234608}, + {-0.213104288233202, -0.0457498117201073, 0.180628969832867, -0.622910247921068, 0.79956775467293, 1.31238472190614, -4.8233231418741, 3.76979251992127, 0.102535944602846, 0.217091000218642, -0.180628969832866, -1.27275966179829, 0.405819247702422, 0.370655962522514}, + {-0.284485368014275, 2.27120607677057, 0.107407678425936, -0.469612557580906, 0.905769689805973, 1.49122800968786, -3.20870947416779, -0.269239244276366, 0.0362989223429497, 0.0215943804656727, -0.107407678425936, -0.199711778895101, 0.448018177115226, -0.742356833253817}, + {0.391648921344113, 5.95338639424384, 0.0371035955317214, -0.18495830213148, 0.428527859127303, -2.17465562183201, 5.33766809180418, -9.50804778556012, -0.0182147190254841, -0.0171708316763455, -0.0371035955317257, 0.124356204326215, 0.202129133807817, -0.534669344428027}, + {-0.256951052509294, -0.694073161871323, -0.10491821927114, -0.153953882680608, 1.14978782338363, 1.90814298935695, -3.57345707946107, 2.61633830448474, -6.32807331096238, -0.844130315034471, 0.104918219271138, 10.2251437547949, 0.998084197715082, -5.0468582672161}, + {0.178979923490298, 0.115046637841692, -0.0345963802695218, -0.00452000962771604, -0.0848891518141152, -0.519795187776687, 0.681756415754277, -0.455987789309578, -3.96517896303726, -0.217795462549473, 0.0345963802695225, 3.96008867408254, 0.222315472177191, 0.0899794407688379}, + {0.3504690128846, 0.308459105882946, 0.0836378307375766, -0.125321852446052, -0.574685323052836, -1.60581168597306, 2.26472314223693, -1.31783957503142, -1.39517165564417, 0.348125218485999, -0.0836378307375764, -1.97019895502062, -0.222803366039945, 3.94005593371763}, + {0.0319842939836341, -0.239359761565476, 0.204670718785766, -0.596532414567511, 0.42263919288559, -0.0975523701387334, -0.879898190936079, 1.18482602865665, 0.0564755715664906, 0.472366895100942, -0.204670718785765, -3.81485025343291, 0.124165519466571, 3.33573548898083}, + {-0.336103018558463, -0.0457498117201073, 0.256584936559011, -1.01735065880461, 1.8380053289713, 1.73164264584619, -4.08114476119051, 2.73135494562289, 0.279290624348595, 0.239291017524297, -0.25658493655901, -2.14021394604236, 0.77805964128031, 0.0229179927224675}, + {-0.174486083113598, 2.27120607677057, 0.200378252978495, -0.935468034459551, 2.08213688828043, 0.839499046770344, -1.49061259767649, -1.44560644275083, 0.038581998526761, 0.00228259393374258, -0.200378252978495, -0.126120653940716, 0.933185440525803, -1.99459823286647}, + {0.492395174720615, 5.95338639424384, 0.0804025495143752, -0.408631473040799, 0.98507785498534, -2.67000852469274, 6.28882473714645, -10.0645977814182, -0.0501839086511154, -0.0426489414445635, -0.0804025495143802, 0.327258872526758, 0.451280414485357, -1.26215281886098}, + {0.31638636763196, -0.694073161871322, -0.0559630311690269, -1.53136678561222, 1.93516526213515, -0.160046261204804, -1.29322781028905, 1.83096086573322, -2.26304003366395, -5.43354582437204, 0.0559630311690227, 6.27754940498531, 6.96491260998427, -5.9496746334565}, + {0.212319100629048, 0.115046637841692, -0.208644136896537, -0.112666000590888, -0.142873784520836, -0.447686288301539, 0.518323706433658, -0.398003156602859, -0.922701304131801, -3.4676600552207, 0.208644136896536, 0.704016947600009, 3.58032605581159, 0.361558141052629}, + {-0.0262953756010448, 0.308459105882946, -0.243760447430801, 0.774724701708878, -0.967231563261829, -0.00153936731378884, 0.644668971854309, -0.925293334822423, 0.334552279494446, -1.33223260633535, 0.243760447430801, -4.02738426617794, 0.557507904626476, 4.66006354994532}, + {-0.29356289474483, -0.239359761565476, -0.0623123315710547, 0.270672878860724, 0.711328358028839, 1.11305758781431, -1.47627179501741, 0.896136863513405, 0.710072942022708, -0.122666336983631, 0.0623123315710551, -4.48630509968547, -0.148006541877092, 3.06490379963392}, + {-0.327634086563149, -0.045749811720107, 0.179428837844928, -0.868700357319804, 3.0934786331076, 1.4558221054225, -2.55831984862584, 1.4758816414866, 0.347625115448976, 0.0853314957145185, -0.179428837844928, -1.79254652722957, 0.783368861605285, -1.648557221327}, + {0.036846469239904, 2.27120607677057, 0.25197713048577, -1.28132822727202, 3.50436741046099, -0.244145974203915, 0.803930393124825, -2.86783696493139, -0.05454135785624, -0.064327724529484, -0.251977130485772, 0.493454978250569, 1.3456559518015, -3.94328103085532}, + {0.624443743244776, 5.95338639424384, 0.125659543788936, -0.654094044532481, 1.65794802023242, -3.30409618018047, 7.4637339893571, -10.7374679466652, -0.102235447581936, -0.0773889767633431, -0.125659543788941, 0.635886926929466, 0.73148302129582, -2.19159949957995}, + {-0.256167192594589, -0.694073161871324, 2.3979899083662, -3.94145487821414, 2.72054270088668, -0.0496693417284613, -0.0456737307873238, 1.0455834269817, 1.68877745293698, -6.3588568112112, -2.3979899083662, 0.377820466532677, 10.3003116894253, -4.78714062035633}, + {-0.31337441874482, 0.115046637841691, 1.20913119791835, -0.306086989650012, -0.200858417227556, 0.268730305782177, 0.26961599901709, -0.340018523896138, 1.64601865635699, -4.09291116152073, -1.20913119791835, -2.24884707665775, 4.39899815117074, 0.803686837528319}, + {-0.358196717965493, 0.308459105882946, 0.0942940870013346, 2.47481320682791, -1.35977780347082, 0.757827954260181, -0.175343247564207, -0.532747094613429, 1.30909730979016, -1.63682175983448, -0.0942940870013332, -3.72930677056414, -0.837991446993429, 3.77998726424481}, + {-0.299031575509981, -0.239359761565476, -0.254889997755028, 2.17251908035175, 1.00001752317209, 0.968948129741249, -1.03800449103595, 0.607447698370155, 0.649107912379451, -0.248810292759198, 0.254889997755029, -2.37391572971298, -1.92370878759255, 0.724790294161442}, + {-0.0587315309968481, -0.0457498117201066, 0.00568525470507764, -0.0353366695478041, 4.34895193724389, 0.234854555140629, -0.350781549773974, 0.220408337350298, -0.00832015616685149, -0.00136937137580671, -0.00568525470507851, 0.348827426873828, 0.0367060409236111, -4.68945920795087}, + {0.345738129853759, 2.27120607677057, 0.248824058319431, -1.38926304497705, 4.92659793264154, -1.66327547854597, 3.33639875903358, -4.29006748711195, -0.288030981086331, -0.14288283407959, -0.248824058319433, 1.72924762750383, 1.53214587905664, -6.36781457905904}, + {0.768066880588579, 5.95338639424384, 0.163513060553487, -0.872236387075245, 2.3308181854795, -3.97707863343676, 8.66596347051667, -11.4103381119123, -0.170032646642033, -0.115361398282502, -0.163513060553492, 1.01490109935928, 0.987597785357744, -3.17568663819675}, + {-0.172813608000422, -0.694073161871325, 7.66782809152167, -6.71523244110837, 3.370150653297, 0.265023019962775, 0.205888275337591, 0.395975474571381, 0.603475909884814, -0.0870706695977282, -7.66782809152167, -1.70870149959479, 6.80230311070609, -2.26492506358702}, + {-0.113628301891749, 0.115046637841691, 4.64163709128915, -0.530507734639861, -0.248819151347642, 0.291173412449481, -0.000533958623372799, -0.29205778977605, 0.241731806134247, 0.544135465219736, -4.64163709128915, -1.29117019494523, -0.0136277305798783, 1.29825754015863}, + {0.00405506587005919, 0.308459105882947, 1.47962462567569, 4.48554419539218, -1.68446393111653, 0.144605831979229, -0.249059036764512, -0.208060966967725, -0.264098497629497, 0.959452802423969, -1.47962462567569, 0.105590363865181, -5.44499699781615, 1.84297206488085}, + {0.18782173265459, -0.239359761565475, -0.10843900959293, 4.52740072698736, 1.23880051870843, -0.423436217199132, 0.106309543276207, 0.368664702833807, -0.689808648043233, 0.74970394766101, 0.108439009592929, 2.22541351612113, -5.27710467464837, -2.77440538678632}, + {0.427267214018341, -0.0457498117201059, -0.144218762998722, 1.17135536116006, 5.38738951154227, -1.55601743785118, 1.99252927250102, -0.818029236948076, -0.82370044267206, 0.17810815241041, 0.144218762998721, 3.67577299206352, -1.34946351357047, -8.23946206093373}, + {0.683869442456404, 2.27120607677057, 0.213762780978216, -1.29875429064357, 6.102965131116, -3.09950070037759, 5.61085986673702, -5.46643468558641, -0.613980108412682, -0.1901262966971, -0.213762780978218, 3.24379941839263, 1.48888058734067, -8.73278444109596}, + {0.895879083025975, 5.95338639424384, 0.189499737225269, -1.03202398811275, 2.88736818133754, -4.56338305523019, 9.68100568573074, -11.9668881077704, -0.238821457078579, -0.148398113611569, -0.189499737225274, 1.38239452811436, 1.18042210172432, -4.03094125237332}, + {0.664222657894854, -0.694073161871327, 12.9275644065722, -8.78395125405246, 3.77184592411849, 0.0276346426303491, 0.00793565759621373, -0.00571979625009167, -3.63967304909877, 8.5787783385411, -12.9275644065722, -0.133919242118136, 0.205172915511345, 0.00174636709842613}, + {0.693463094928461, 0.115046637841691, 8.18404667582311, -0.698473537804771, -0.278476423875914, -0.349332077522817, -0.196777137999558, -0.262400517247778, -3.41364720909731, 6.93483266816505, -8.18404667582311, 2.02965711027351, -6.23635913036028, 1.66246652269972}, + {0.742462338825681, 0.308459105882948, 3.06311173017419, 6.00278514792514, -1.88523869302129, -1.02286678188448, -0.0207684577611782, -0.00728620506297029, -2.99256143513504, 4.53299557147238, -3.06311173017419, 4.78035959481176, -10.5357807193975, 0.0974405333445643}, + {0.804987040600065, -0.239359761565474, 0.214133273556956, 6.33776159032838, 1.38645573090779, -1.95473369735074, 1.1680969276817, 0.221009490634447, -2.38198458018266, 2.14728685500484, -0.214133273556956, 6.6420824838077, -8.48504844533322, -5.64655363453284}, + {0.872231208290863, -0.0457498117201053, -0.214692262891511, 2.15192642376965, 6.02952368045328, -3.04226439106095, 3.67594640034927, -1.46016340585909, -1.63900372753042, 0.477973943103458, 0.214692262891509, 6.51293029846871, -2.62990036687311, -10.9034502513916}, + {0.933738188386175, 2.27120607677057, 0.180722238870034, -1.16133911697905, 6.83039024748561, -4.10984071121841, 7.09875624801768, -6.19385980195602, -0.885735900753481, -0.201279792394255, -0.180722238870036, 4.41344164930901, 1.36261890937331, -10.3580959960411}, + {0.979100584098921, 5.95338639424384, 0.203259177991436, -1.12147877712069, 3.23151960448803, -4.93947279609268, 10.3180253486708, -12.3110395309209, -0.287421909108014, -0.169259721888914, -0.203259177991441, 1.6344084309254, 1.2907384990096, -4.57850612630541}}; + + // Array of non-zero columns + static const unsigned int nzc0[14] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + static const double FE1_D10[49][14] = \ + {{-6.2983643593319, -0.664222657894858, 0.0858845437512279, 0.06554837042071, 0.104204396401937, -1.36064348010013, 0.541826321067073, -0.104204396401937, 11.4219766064532, -7.98554345194364, 3.52615386271722, 1.80755860884517, -0.532799672496272, -0.607374691487783}, + {-3.32619259826499, -0.693463094928464, 0.453728548559946, 0.203546981491995, 0.255129372082022, -5.2063477771782, 1.46552639554109, -0.255129372082023, 7.16129526519277, -6.45089031005951, 3.30925073806019, 7.27298854048976, -2.52036931187151, -1.66907337703308}, + {-0.549695655308226, -0.742462338825682, 1.11161688145206, -0.0571122579841792, -0.0419382284394078, -6.66413614639885, -0.317223717693313, 0.0419382284394063, 2.59468013025565, -4.20633347168919, 2.90381133556745, 10.5816602437964, -5.0291409788496, 0.374335975677494}, + {0.358406771512468, -0.804987040600067, 2.02290118744177, -1.30602852869195, -0.184808505484566, -3.44228823377648, -4.79991787644822, 0.184808505484566, 0.108299107790537, -1.97553592879455, 2.31381709009162, 8.09528885534245, -6.67590180900774, 6.10594640514017}, + {-0.103179561013744, -0.872231208290865, 3.08757428680841, -3.82055412038218, 1.617596991621, 0.999561626017688, -7.19979310299425, -1.617596991621, -0.200837902436074, -0.417445160042268, 1.59369383178295, 2.3417154486709, -6.428851361497, 11.0203472233764}, + {-0.326491365232074, -0.933738188386174, 4.13363256865698, -7.19885209622273, 6.37220437539238, 1.60605114990632, -3.02833485542904, -6.37220437539237, 0.189707819225386, 0.208577691077958, 0.861944043314903, -1.41904001877565, -4.32064369978765, 10.2271869516518}, + {0.333088589616686, -0.979100584098917, 4.94704285028783, -10.3553194543281, 12.3954159668977, -2.08469563577263, 5.88033661345101, -12.3954159668977, 0.200096672874755, 0.166063466694611, 0.279851854912864, -1.26842914444148, -1.59391807007371, 4.47498284087713}, + {-3.01985386154978, 0.172813608000422, -0.0159373902448528, -0.000870236318424256, 0.104204396401936, -0.98002259821518, 0.475407714327933, -0.104204396401936, 2.16031274035957, 1.53928905279252, -0.852561539602726, 0.944494911079208, 0.0514650773808247, -0.474537478009509}, + {-1.32800715611101, 0.113628301891749, -0.0359596863951125, 0.0210278054354899, 0.255129372082022, -3.67722753443489, 1.28300721948459, -0.255129372082023, 0.972910904276413, 0.738413482131461, -0.496945532188616, 3.72505982004808, -0.0118725992180806, -1.30403502492007}, + {0.0931248882416949, -0.00405506587005874, 0.109795013885239, -0.0161772728666198, -0.0419382284394074, -4.44793837993963, -0.276288732575753, 0.0419382284394062, -0.108260094735374, 0.00949262059871651, 0.00969765176502122, 5.14744284331111, -0.809299477256726, 0.292466005442374}, + {0.293601942017483, -0.18782173265459, 0.655645352461437, -0.63832133124543, -0.184808505484566, -1.76460224303774, -4.13221067900169, 0.184808505484565, -0.383978194639238, -0.179401527504574, 0.457599512780919, 3.37266103888463, -2.26370414830833, 4.77053201024712}, + {-0.213104288233201, -0.427267214018342, 1.73664640768405, -2.61543952042209, 1.617596991621, 1.45660348490486, -5.99467850303416, -1.617596991621, -0.0416828183958762, 0.0389828478082308, 0.643071472839188, 0.0767038517721826, -3.26995374436109, 8.61011802345624}, + {-0.284485368014275, -0.683869442456402, 3.20690837880352, -6.08047242431791, 6.37220437539238, 1.27746522870965, -1.90995518352422, -6.37220437539237, 0.250061703321168, 0.211720677162769, 0.506572429986739, -1.68859236623577, -2.79578124127739, 7.99042760784213}, + {0.391648921344109, -0.895879083025971, 4.60048665076192, -9.86596398786222, 12.3954159668977, -2.36415535905727, 6.36969207991694, -12.3954159668977, 0.171285018199791, 0.131227281935214, 0.201717861546855, -1.05606589739812, -1.18026539430653, 3.49627190794527}, + {-0.256951052509294, 0.25616719259459, -0.0552488775426753, -0.108280151893286, 0.104204396401935, -0.489846919009246, 0.367997798753068, -0.104204396401935, -3.93008340259618, 5.51472649617672, -1.58385923366584, -0.0751679346304815, 0.620263731182404, -0.259717646859782}, + {0.178979923490298, 0.313374418744821, -0.303326686051699, -0.274136008644806, 0.255129372082022, -1.72892638569504, 0.987843405404289, -0.255129372082023, -2.7560477651189, 3.87511569897125, -1.61142227608747, -0.438909477088203, 2.47116254883494, -0.713707396759483}, + {0.3504690128846, 0.358196717965493, -0.674190123522603, 0.0500213951181531, -0.0419382284394064, -1.70010577297439, -0.210090064590979, 0.041938228439406, -1.30087756864284, 1.98494697832048, -1.39273514052774, -1.1322075080272, 3.50650340452419, 0.160068669472826}, + {0.0319842939836341, 0.29903157550998, -0.764277410955483, 0.441472076468436, -0.184808505484566, 0.157337627616295, -3.05241727128782, 0.184808505484566, -0.198414426188537, 0.721177187860139, -0.853778631165216, -1.89114146584036, 2.49808124917955, 2.61094519481939}, + {-0.336103018558462, 0.0587315309968476, 0.0217303814183805, -0.666569109030633, 1.617596991621, 1.72595739114111, -4.04580809164271, -1.617596991621, 0.284975879053674, 0.240660388900103, -0.248264780392162, -2.17691998696598, 0.429232214406487, 4.71237720067334}, + {-0.174486083113599, -0.345738129853758, 1.86365373152446, -4.27186679349313, 6.37220437539238, 0.590674988450914, -0.101349552699435, -6.37220437539237, 0.287406056846195, 0.14516542801333, 0.087652728107831, -1.65826653299736, -0.796062186978011, 4.37321634619255}, + {0.492395174720611, -0.768066880588575, 4.05748118295113, -9.07459494355746, 12.3954159668977, -2.83352158524622, 7.1610611242217, -12.3954159668977, 0.113329151902378, 0.0727124568379292, 0.0896300971276551, -0.660338912830997, -0.563620684873913, 1.91353381933575}, + {0.316386367631959, -0.316386367631959, 0.104083230035782, -0.238138975323175, 0.104204396401934, -0.104083230035779, 0.23813897532318, -0.104204396401934, -2.31900306483297, 0.0, 2.31900306483298, -0.687363204998965, 0.687363204998963, 0.0}, + {0.212319100629047, -0.212319100629048, 0.239042151405003, -0.630989707024547, 0.255129372082022, -0.239042151405004, 0.630989707024548, -0.255129372082022, -1.13134544102834, 0.0, 1.13134544102834, -2.87630910821158, 2.87630910821158, 0.0}, + {-0.026295375601045, 0.0262953756010446, -0.242221080117011, 0.130055729854566, -0.0419382284394061, 0.24222108011701, -0.130055729854567, 0.0419382284394061, 0.0907918320636461, 0.0, -0.0907918320636447, -4.58489217080441, 4.58489217080441, 0.0}, + {-0.29356289474483, 0.29356289474483, -1.17536991938536, 1.74694467387813, -0.184808505484566, 1.17536991938536, -1.74694467387813, 0.184808505484566, 0.647760610451654, 0.0, -0.647760610451653, -4.33829855780838, 4.33829855780838, 0.0}, + {-0.327634086563149, 0.327634086563149, -1.27639326757757, 1.68961949130604, 1.617596991621, 1.27639326757757, -1.68961949130604, -1.617596991621, 0.527053953293905, 0.0, -0.527053953293905, -2.57591538883485, 2.57591538883486, 0.0}, + {0.0368464692399032, -0.0368464692399034, 0.496123104689687, -2.08525862039685, 6.37220437539238, -0.496123104689686, 2.08525862039685, -6.37220437539237, 0.197435772629535, 0.0, -0.197435772629533, -0.85220097355094, 0.852200973550941, 0.0}, + {0.624443743244772, -0.624443743244772, 3.42975572396941, -8.11782803388957, 12.3954159668977, -3.4297557239694, 8.11782803388958, -12.3954159668977, 0.0234240962070069, 0.0, -0.0234240962069999, -0.095596094366365, 0.0955960943663583, -2.2630040522817e-14}, + {-0.256167192594591, 0.256951052509292, 0.489846919009249, -0.367997798753061, 0.104204396401933, 0.0552488775426808, 0.108280151893289, -0.104204396401933, 1.58385923366584, -5.51472649617673, 3.93008340259619, -0.620263731182411, 0.0751679346304815, 0.259717646859772}, + {-0.313374418744821, -0.178979923490299, 1.72892638569504, -0.987843405404288, 0.255129372082022, 0.303326686051699, 0.274136008644807, -0.255129372082022, 1.61142227608747, -3.87511569897126, 2.75604776511891, -2.47116254883495, 0.438909477088208, 0.713707396759479}, + {-0.358196717965493, -0.3504690128846, 1.70010577297439, 0.210090064590978, -0.0419382284394057, 0.674190123522602, -0.0500213951181539, 0.0419382284394061, 1.39273514052774, -1.98494697832048, 1.30087756864284, -3.50650340452419, 1.1322075080272, -0.160068669472826}, + {-0.299031575509981, -0.0319842939836339, -0.157337627616295, 3.05241727128782, -0.184808505484565, 0.764277410955482, -0.441472076468439, 0.184808505484565, 0.853778631165218, -0.72117718786014, 0.198414426188537, -2.49808124917955, 1.89114146584036, -2.61094519481939}, + {-0.0587315309968477, 0.336103018558462, -1.72595739114111, 4.0458080916427, 1.617596991621, -0.0217303814183839, 0.666569109030632, -1.617596991621, 0.248264780392162, -0.240660388900103, -0.284975879053674, -0.429232214406483, 2.17691998696598, -4.71237720067334}, + {0.345738129853758, 0.174486083113598, -0.59067498845091, 0.101349552699432, 6.37220437539238, -1.86365373152446, 4.27186679349313, -6.37220437539237, -0.0876527281078311, -0.145165428013333, -0.287406056846194, 0.796062186978016, 1.65826653299736, -4.37321634619257}, + {0.768066880588575, -0.492395174720611, 2.83352158524623, -7.16106112422169, 12.3954159668977, -4.05748118295112, 9.07459494355747, -12.3954159668977, -0.0896300971276489, -0.0727124568379454, -0.113329151902371, 0.563620684873909, 0.660338912830988, -1.91353381933579}, + {-0.172813608000423, 3.01985386154978, 0.980022598215181, -0.475407714327921, 0.104204396401933, 0.0159373902448603, 0.000870236318421092, -0.104204396401933, 0.852561539602731, -1.53928905279252, -2.16031274035957, -0.0514650773808256, -0.944494911079216, 0.474537478009499}, + {-0.113628301891749, 1.32800715611101, 3.67722753443489, -1.28300721948459, 0.255129372082023, 0.0359596863951115, -0.0210278054354893, -0.255129372082022, 0.496945532188615, -0.73841348213146, -0.972910904276412, 0.0118725992180839, -3.72505982004809, 1.30403502492007}, + {0.00405506587005958, -0.0931248882416937, 4.44793837993963, 0.276288732575748, -0.0419382284394049, -0.109795013885243, 0.0161772728666222, 0.0419382284394052, -0.00969765176502627, -0.00949262059871116, 0.108260094735372, 0.809299477256729, -5.14744284331112, -0.292466005442373}, + {0.187821732654591, -0.293601942017482, 1.76460224303774, 4.13221067900169, -0.184808505484564, -0.655645352461442, 0.638321331245432, 0.184808505484564, -0.457599512780922, 0.179401527504576, 0.383978194639238, 2.26370414830833, -3.37266103888464, -4.77053201024712}, + {0.427267214018341, 0.213104288233201, -1.45660348490486, 5.99467850303416, 1.617596991621, -1.73664640768405, 2.61543952042209, -1.617596991621, -0.64307147283919, -0.0389828478082302, 0.0416828183958766, 3.26995374436109, -0.0767038517721803, -8.61011802345625}, + {0.683869442456402, 0.284485368014274, -1.27746522870964, 1.90995518352422, 6.37220437539238, -3.20690837880352, 6.08047242431792, -6.37220437539237, -0.50657242998674, -0.211720677162772, -0.250061703321165, 2.7957812412774, 1.68859236623577, -7.99042760784215}, + {0.895879083025971, -0.391648921344109, 2.36415535905728, -6.36969207991693, 12.3954159668977, -4.60048665076191, 9.86596398786223, -12.3954159668977, -0.20171786154685, -0.131227281935231, -0.171285018199783, 1.18026539430653, 1.0560658973981, -3.49627190794531}, + {0.664222657894854, 6.29836435933189, 1.36064348010012, -0.541826321067053, 0.104204396401933, -0.0858845437512238, -0.0655483704207188, -0.104204396401933, -3.5261538627172, 7.98554345194362, -11.4219766064532, 0.532799672496285, -1.80755860884518, 0.607374691487772}, + {0.693463094928461, 3.32619259826499, 5.2063477771782, -1.46552639554109, 0.255129372082023, -0.45372854855995, -0.203546981491994, -0.255129372082023, -3.30925073806019, 6.45089031005949, -7.16129526519275, 2.52036931187151, -7.27298854048976, 1.66907337703308}, + {0.742462338825682, 0.549695655308226, 6.66413614639886, 0.317223717693305, -0.0419382284394039, -1.11161688145207, 0.057112257984185, 0.0419382284394043, -2.90381133556745, 4.20633347168919, -2.59468013025564, 5.0291409788496, -10.5816602437964, -0.374335975677492}, + {0.804987040600066, -0.358406771512467, 3.44228823377648, 4.79991787644821, -0.184808505484563, -2.02290118744178, 1.30602852869196, 0.184808505484563, -2.31381709009162, 1.97553592879455, -0.108299107790533, 6.67590180900773, -8.09528885534242, -6.10594640514017}, + {0.872231208290864, 0.103179561013743, -0.999561626017687, 7.19979310299425, 1.617596991621, -3.08757428680841, 3.82055412038218, -1.617596991621, -1.59369383178295, 0.417445160042269, 0.200837902436075, 6.428851361497, -2.3417154486709, -11.0203472233764}, + {0.933738188386173, 0.326491365232073, -1.60605114990631, 3.02833485542903, 6.37220437539238, -4.13363256865699, 7.19885209622274, -6.37220437539238, -0.861944043314903, -0.208577691077961, -0.189707819225383, 4.32064369978766, 1.41904001877564, -10.2271869516518}, + {0.979100584098917, -0.333088589616686, 2.08469563577265, -5.880336613451, 12.3954159668977, -4.94704285028782, 10.3553194543282, -12.3954159668977, -0.279851854912859, -0.166063466694627, -0.200096672874747, 1.59391807007371, 1.26842914444146, -4.47498284087718}}; + + // Array of non-zero columns + static const unsigned int nzc1[14] = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 225; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 117649 + for (unsigned int ip = 0; ip < 49; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + + // Total number of operations to compute function values = 40 + for (unsigned int r = 0; r < 10; r++) + { + F0 += FE0[ip][r]*w[0][r]; + F1 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 9 + double I[3]; + // Number of operations: 3 + I[0] = F0*F1*G[0]*W49[ip]; + + // Number of operations: 3 + I[1] = F0*F1*G[1]*W49[ip]; + + // Number of operations: 3 + I[2] = F0*F1*G[2]*W49[ip]; + + + // Number of operations for primary indices: 2352 + for (unsigned int j = 0; j < 14; j++) + { + for (unsigned int k = 0; k < 14; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p3_q4_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p3_q4_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q4_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q4_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q4_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q4_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q4_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q4_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q4_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q4_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q4_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f2_p3_q4_tensor.h b/laplacian_2d/laplacian_f2_p3_q4_tensor.h new file mode 100644 index 0000000..22a1780 --- /dev/null +++ b/laplacian_2d/laplacian_f2_p3_q4_tensor.h @@ -0,0 +1,8954 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F2_P3_Q4_TENSOR_H +#define __LAPLACIAN_F2_P3_Q4_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q4_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q4_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q4_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f2_p3_q4_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f2_p3_q4_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f2_p3_q4_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q4_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q4_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q4_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f2_p3_q4_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f2_p3_q4_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f2_p3_q4_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f2_p3_q4_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f2_p3_q4_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 1200 + // Number of operations (multiply-add pairs) for tensor contraction: 54301 + // Total number of operations (multiply-add pairs): 55512 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_6 = det*(w[0][0]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_7 = det*(w[0][0]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_8 = det*(w[0][0]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_9 = det*(w[0][0]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_6 = det*(w[0][1]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_7 = det*(w[0][1]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_8 = det*(w[0][1]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_9 = det*(w[0][1]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_6 = det*(w[0][2]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_7 = det*(w[0][2]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_8 = det*(w[0][2]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_9 = det*(w[0][2]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_6 = det*(w[0][3]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_7 = det*(w[0][3]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_8 = det*(w[0][3]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_9 = det*(w[0][3]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_6 = det*(w[0][4]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_7 = det*(w[0][4]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_8 = det*(w[0][4]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_9 = det*(w[0][4]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_6 = det*(w[0][5]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_7 = det*(w[0][5]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_8 = det*(w[0][5]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_9 = det*(w[0][5]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_0 = det*(w[0][6]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_1 = det*(w[0][6]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_2 = det*(w[0][6]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_3 = det*(w[0][6]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_4 = det*(w[0][6]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_5 = det*(w[0][6]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_6 = det*(w[0][6]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_7 = det*(w[0][6]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_8 = det*(w[0][6]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_6_9 = det*(w[0][6]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_0 = det*(w[0][7]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_1 = det*(w[0][7]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_2 = det*(w[0][7]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_3 = det*(w[0][7]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_4 = det*(w[0][7]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_5 = det*(w[0][7]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_6 = det*(w[0][7]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_7 = det*(w[0][7]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_8 = det*(w[0][7]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_7_9 = det*(w[0][7]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_0 = det*(w[0][8]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_1 = det*(w[0][8]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_2 = det*(w[0][8]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_3 = det*(w[0][8]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_4 = det*(w[0][8]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_5 = det*(w[0][8]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_6 = det*(w[0][8]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_7 = det*(w[0][8]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_8 = det*(w[0][8]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_8_9 = det*(w[0][8]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_0 = det*(w[0][9]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_1 = det*(w[0][9]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_2 = det*(w[0][9]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_3 = det*(w[0][9]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_4 = det*(w[0][9]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_5 = det*(w[0][9]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_6 = det*(w[0][9]*w[1][6]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_7 = det*(w[0][9]*w[1][7]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_8 = det*(w[0][9]*w[1][8]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_9_9 = det*(w[0][9]*w[1][9]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0 = det*(w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1 = det*(w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2 = det*(w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3 = det*(w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4 = det*(w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5 = det*(w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_6 = det*(w[0][0]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_7 = det*(w[0][0]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_8 = det*(w[0][0]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_9 = det*(w[0][0]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0 = det*(w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1 = det*(w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2 = det*(w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3 = det*(w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4 = det*(w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5 = det*(w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_6 = det*(w[0][1]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_7 = det*(w[0][1]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_8 = det*(w[0][1]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_9 = det*(w[0][1]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0 = det*(w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1 = det*(w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2 = det*(w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3 = det*(w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4 = det*(w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5 = det*(w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_6 = det*(w[0][2]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_7 = det*(w[0][2]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_8 = det*(w[0][2]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_9 = det*(w[0][2]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0 = det*(w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1 = det*(w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2 = det*(w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3 = det*(w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4 = det*(w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5 = det*(w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_6 = det*(w[0][3]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_7 = det*(w[0][3]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_8 = det*(w[0][3]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_9 = det*(w[0][3]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0 = det*(w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1 = det*(w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2 = det*(w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3 = det*(w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4 = det*(w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5 = det*(w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_6 = det*(w[0][4]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_7 = det*(w[0][4]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_8 = det*(w[0][4]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_9 = det*(w[0][4]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0 = det*(w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1 = det*(w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2 = det*(w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3 = det*(w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4 = det*(w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5 = det*(w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_6 = det*(w[0][5]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_7 = det*(w[0][5]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_8 = det*(w[0][5]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_9 = det*(w[0][5]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_0 = det*(w[0][6]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_1 = det*(w[0][6]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_2 = det*(w[0][6]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_3 = det*(w[0][6]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_4 = det*(w[0][6]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_5 = det*(w[0][6]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_6 = det*(w[0][6]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_7 = det*(w[0][6]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_8 = det*(w[0][6]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_6_9 = det*(w[0][6]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_0 = det*(w[0][7]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_1 = det*(w[0][7]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_2 = det*(w[0][7]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_3 = det*(w[0][7]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_4 = det*(w[0][7]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_5 = det*(w[0][7]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_6 = det*(w[0][7]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_7 = det*(w[0][7]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_8 = det*(w[0][7]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_7_9 = det*(w[0][7]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_0 = det*(w[0][8]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_1 = det*(w[0][8]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_2 = det*(w[0][8]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_3 = det*(w[0][8]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_4 = det*(w[0][8]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_5 = det*(w[0][8]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_6 = det*(w[0][8]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_7 = det*(w[0][8]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_8 = det*(w[0][8]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_8_9 = det*(w[0][8]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_0 = det*(w[0][9]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_1 = det*(w[0][9]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_2 = det*(w[0][9]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_3 = det*(w[0][9]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_4 = det*(w[0][9]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_5 = det*(w[0][9]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_6 = det*(w[0][9]*w[1][6]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_7 = det*(w[0][9]*w[1][7]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_8 = det*(w[0][9]*w[1][8]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_9_9 = det*(w[0][9]*w[1][9]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_6 = det*(w[0][0]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_7 = det*(w[0][0]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_8 = det*(w[0][0]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_9 = det*(w[0][0]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_6 = det*(w[0][1]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_7 = det*(w[0][1]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_8 = det*(w[0][1]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_9 = det*(w[0][1]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_6 = det*(w[0][2]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_7 = det*(w[0][2]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_8 = det*(w[0][2]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_9 = det*(w[0][2]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_6 = det*(w[0][3]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_7 = det*(w[0][3]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_8 = det*(w[0][3]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_9 = det*(w[0][3]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_6 = det*(w[0][4]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_7 = det*(w[0][4]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_8 = det*(w[0][4]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_9 = det*(w[0][4]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_6 = det*(w[0][5]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_7 = det*(w[0][5]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_8 = det*(w[0][5]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_9 = det*(w[0][5]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_0 = det*(w[0][6]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_1 = det*(w[0][6]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_2 = det*(w[0][6]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_3 = det*(w[0][6]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_4 = det*(w[0][6]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_5 = det*(w[0][6]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_6 = det*(w[0][6]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_7 = det*(w[0][6]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_8 = det*(w[0][6]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_6_9 = det*(w[0][6]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_0 = det*(w[0][7]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_1 = det*(w[0][7]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_2 = det*(w[0][7]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_3 = det*(w[0][7]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_4 = det*(w[0][7]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_5 = det*(w[0][7]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_6 = det*(w[0][7]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_7 = det*(w[0][7]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_8 = det*(w[0][7]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_7_9 = det*(w[0][7]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_0 = det*(w[0][8]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_1 = det*(w[0][8]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_2 = det*(w[0][8]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_3 = det*(w[0][8]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_4 = det*(w[0][8]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_5 = det*(w[0][8]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_6 = det*(w[0][8]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_7 = det*(w[0][8]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_8 = det*(w[0][8]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_8_9 = det*(w[0][8]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_0 = det*(w[0][9]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_1 = det*(w[0][9]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_2 = det*(w[0][9]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_3 = det*(w[0][9]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_4 = det*(w[0][9]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_5 = det*(w[0][9]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_6 = det*(w[0][9]*w[1][6]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_7 = det*(w[0][9]*w[1][7]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_8 = det*(w[0][9]*w[1][8]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_9_9 = det*(w[0][9]*w[1][9]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0 = det*(w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1 = det*(w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2 = det*(w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3 = det*(w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4 = det*(w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5 = det*(w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_6 = det*(w[0][0]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_7 = det*(w[0][0]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_8 = det*(w[0][0]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_9 = det*(w[0][0]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0 = det*(w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1 = det*(w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2 = det*(w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3 = det*(w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4 = det*(w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5 = det*(w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_6 = det*(w[0][1]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_7 = det*(w[0][1]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_8 = det*(w[0][1]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_9 = det*(w[0][1]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0 = det*(w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1 = det*(w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2 = det*(w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3 = det*(w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4 = det*(w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5 = det*(w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_6 = det*(w[0][2]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_7 = det*(w[0][2]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_8 = det*(w[0][2]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_9 = det*(w[0][2]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0 = det*(w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1 = det*(w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2 = det*(w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3 = det*(w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4 = det*(w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5 = det*(w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_6 = det*(w[0][3]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_7 = det*(w[0][3]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_8 = det*(w[0][3]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_9 = det*(w[0][3]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0 = det*(w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1 = det*(w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2 = det*(w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3 = det*(w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4 = det*(w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5 = det*(w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_6 = det*(w[0][4]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_7 = det*(w[0][4]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_8 = det*(w[0][4]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_9 = det*(w[0][4]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0 = det*(w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1 = det*(w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2 = det*(w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3 = det*(w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4 = det*(w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5 = det*(w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_6 = det*(w[0][5]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_7 = det*(w[0][5]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_8 = det*(w[0][5]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_9 = det*(w[0][5]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_0 = det*(w[0][6]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_1 = det*(w[0][6]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_2 = det*(w[0][6]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_3 = det*(w[0][6]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_4 = det*(w[0][6]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_5 = det*(w[0][6]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_6 = det*(w[0][6]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_7 = det*(w[0][6]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_8 = det*(w[0][6]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_6_9 = det*(w[0][6]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_0 = det*(w[0][7]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_1 = det*(w[0][7]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_2 = det*(w[0][7]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_3 = det*(w[0][7]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_4 = det*(w[0][7]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_5 = det*(w[0][7]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_6 = det*(w[0][7]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_7 = det*(w[0][7]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_8 = det*(w[0][7]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_7_9 = det*(w[0][7]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_0 = det*(w[0][8]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_1 = det*(w[0][8]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_2 = det*(w[0][8]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_3 = det*(w[0][8]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_4 = det*(w[0][8]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_5 = det*(w[0][8]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_6 = det*(w[0][8]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_7 = det*(w[0][8]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_8 = det*(w[0][8]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_8_9 = det*(w[0][8]*w[1][9]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_0 = det*(w[0][9]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_1 = det*(w[0][9]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_2 = det*(w[0][9]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_3 = det*(w[0][9]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_4 = det*(w[0][9]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_5 = det*(w[0][9]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_6 = det*(w[0][9]*w[1][6]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_7 = det*(w[0][9]*w[1][7]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_8 = det*(w[0][9]*w[1][8]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_9_9 = det*(w[0][9]*w[1][9]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[108] = 0.000455840455840541*G0_0_0_0_0 - 1.30028701457341e-05*G0_0_0_0_1 + 0.0011446754303899*G0_0_0_0_2 + 0.000453197596054839*G0_0_0_0_3 - 0.000889269460698194*G0_0_0_0_4 + 0.00500356786071156*G0_0_0_0_5 + 0.000143665857951544*G0_0_0_0_6 + 0.000244517387374569*G0_0_0_0_7 - 0.000278768850197467*G0_0_0_0_8 + 0.00189334475048793*G0_0_0_0_9 - 1.30028701457342e-05*G0_0_0_1_0 - 0.0013320013320016*G0_0_0_1_1 + 0.00100428671857259*G0_0_0_1_2 - 0.00342102342102398*G0_0_0_1_3 - 0.00229072514786841*G0_0_0_1_4 - 0.000882609454038169*G0_0_0_1_5 - 0.00342387770959257*G0_0_0_1_6 + 0.000275597418454619*G0_0_0_1_7 - 0.0010012210012212*G0_0_0_1_8 + 0.00100280671709262*G0_0_0_1_9 + 0.0011446754303899*G0_0_0_2_0 + 0.00100428671857259*G0_0_0_2_1 + 0.0645724645724752*G0_0_0_2_2 - 0.00602508602508696*G0_0_0_2_3 + 0.00539016539016618*G0_0_0_2_4 - 0.00311244311244357*G0_0_0_2_5 + 0.0140570540570562*G0_0_0_2_6 + 0.00023341737627456*G0_0_0_2_7 + 0.000370423227566156*G0_0_0_2_8 - 0.00298368298368352*G0_0_0_2_9 + 0.000453197596054839*G0_0_0_3_0 - 0.00342102342102398*G0_0_0_3_1 - 0.00602508602508696*G0_0_0_3_2 + 0.0134608248893991*G0_0_0_3_3 + 0.0226915941201693*G0_0_0_3_4 + 0.000622234907949253*G0_0_0_3_5 + 0.0103153988868291*G0_0_0_3_6 - 0.00131582703011301*G0_0_0_3_7 + 0.00238333095475999*G0_0_0_3_8 - 0.000376766091051827*G0_0_0_3_9 - 0.000889269460698194*G0_0_0_4_0 - 0.00229072514786841*G0_0_0_4_1 + 0.00539016539016618*G0_0_0_4_2 + 0.0226915941201693*G0_0_0_4_3 - 0.0685714285714402*G0_0_0_4_4 + 0.00271157414014604*G0_0_0_4_5 - 0.0130269730269752*G0_0_0_4_6 + 0.000961895247609695*G0_0_0_4_7 - 0.00106750392464698*G0_0_0_4_8 + 0.00352790067075849*G0_0_0_4_9 + 0.00500356786071156*G0_0_0_5_0 - 0.000882609454038169*G0_0_0_5_1 - 0.00311244311244357*G0_0_0_5_2 + 0.000622234907949254*G0_0_0_5_3 + 0.00271157414014605*G0_0_0_5_4 - 0.0375510204081695*G0_0_0_5_5 - 0.0131811046096782*G0_0_0_5_6 - 0.00203510774939379*G0_0_0_5_7 + 0.00269159412016599*G0_0_0_5_8 - 0.0110632224917958*G0_0_0_5_9 + 0.000143665857951544*G0_0_0_6_0 - 0.00342387770959257*G0_0_0_6_1 + 0.0140570540570562*G0_0_0_6_2 + 0.0103153988868291*G0_0_0_6_3 - 0.0130269730269752*G0_0_0_6_4 - 0.0131811046096782*G0_0_0_6_5 - 0.185894105894137*G0_0_0_6_6 - 0.000656486370772211*G0_0_0_6_7 + 0.00455829884401384*G0_0_0_6_8 - 0.0116797488226077*G0_0_0_6_9 + 0.000244517387374569*G0_0_0_7_0 + 0.000275597418454619*G0_0_0_7_1 + 0.00023341737627456*G0_0_0_7_2 - 0.00131582703011301*G0_0_0_7_3 + 0.000961895247609694*G0_0_0_7_4 - 0.00203510774939379*G0_0_0_7_5 - 0.000656486370772211*G0_0_0_7_6 - 0.00193520764949369*G0_0_0_7_7 + 0.000282574568288913*G0_0_0_7_8 - 0.00436706150991941*G0_0_0_7_9 - 0.000278768850197467*G0_0_0_8_0 - 0.0010012210012212*G0_0_0_8_1 + 0.000370423227566156*G0_0_0_8_2 + 0.00238333095475999*G0_0_0_8_3 - 0.00106750392464698*G0_0_0_8_4 + 0.00269159412016599*G0_0_0_8_5 + 0.00455829884401384*G0_0_0_8_6 + 0.000282574568288913*G0_0_0_8_7 + 0.00470957613814831*G0_0_0_8_8 - 0.000873412301983904*G0_0_0_8_9 + 0.00189334475048793*G0_0_0_9_0 + 0.00100280671709262*G0_0_0_9_1 - 0.00298368298368352*G0_0_0_9_2 - 0.000376766091051827*G0_0_0_9_3 + 0.00352790067075849*G0_0_0_9_4 - 0.0110632224917958*G0_0_0_9_5 - 0.0116797488226077*G0_0_0_9_6 - 0.00436706150991941*G0_0_0_9_7 - 0.000873412301983904*G0_0_0_9_8 + 0.063707720850589*G0_0_0_9_9 + 0.000462747129413886*G0_0_1_0_0 - 4.61619509238885e-05*G0_0_1_0_1 + 0.000221859269478351*G0_0_1_0_2 - 0.000257203114346015*G0_0_1_0_3 + 2.82257425114591e-05*G0_0_1_0_4 + 0.00140018711447308*G0_0_1_0_5 - 0.000437023294166234*G0_0_1_0_6 + 0.000917495203209666*G0_0_1_0_7 - 0.00030509173366325*G0_0_1_0_8 + 0.000875315161029594*G0_0_1_0_9 - 4.61619509238885e-05*G0_0_1_1_0 - 0.0038036038036049*G0_0_1_1_1 + 0.00014803538613063*G0_0_1_1_2 - 0.00380064380064453*G0_0_1_1_3 + 0.00187368187368223*G0_0_1_1_4 - 0.000104974390688688*G0_0_1_1_5 - 0.00126476697905291*G0_0_1_1_6 + 0.000861360861361124*G0_0_1_1_7 - 0.00108336108336153*G0_0_1_1_8 - 0.00175824175824207*G0_0_1_1_9 + 0.000221859269478351*G0_0_1_2_0 + 0.00014803538613063*G0_0_1_2_1 + 0.00382728382728434*G0_0_1_2_2 - 0.0025447568304715*G0_0_1_2_3 + 0.00475080475080547*G0_0_1_2_4 - 0.00020043448614878*G0_0_1_2_5 + 0.00208680208680239*G0_0_1_2_6 + 8.91172319743965e-05*G0_0_1_2_7 - 0.000242931671503153*G0_0_1_2_8 + 0.00148423005565886*G0_0_1_2_9 - 0.000257203114346015*G0_0_1_3_0 - 0.00380064380064453*G0_0_1_3_1 - 0.0025447568304715*G0_0_1_3_2 - 0.0037362637362642*G0_0_1_3_3 + 0.00063079777365503*G0_0_1_3_4 + 0.000693592122163651*G0_0_1_3_5 + 0.00349364920793552*G0_0_1_3_6 + 0.000470957613814849*G0_0_1_3_7 - 0.000899100899101112*G0_0_1_3_8 + 0.0043328100470965*G0_0_1_3_9 + 2.82257425114591e-05*G0_0_1_4_0 + 0.00187368187368223*G0_0_1_4_1 + 0.00475080475080547*G0_0_1_4_2 + 0.000630797773655031*G0_0_1_4_3 + 0.000990438133295299*G0_0_1_4_4 - 0.000385328956757573*G0_0_1_4_5 - 0.00310832025117795*G0_0_1_4_6 - 2.56885971171853e-05*G0_0_1_4_7 + 0.000428143285286264*G0_0_1_4_8 - 0.00368203225346144*G0_0_1_4_9 + 0.00140018711447308*G0_0_1_5_0 - 0.000104974390688688*G0_0_1_5_1 - 0.00020043448614878*G0_0_1_5_2 + 0.000693592122163651*G0_0_1_5_3 - 0.000385328956757573*G0_0_1_5_4 - 0.00306265163408073*G0_0_1_5_5 - 0.00156415013557898*G0_0_1_5_6 + 0.000553731982303515*G0_0_1_5_7 + 1.42714428428689e-05*G0_0_1_5_8 - 0.00265448836877452*G0_0_1_5_9 - 0.000437023294166234*G0_0_1_6_0 - 0.00126476697905291*G0_0_1_6_1 + 0.00208680208680239*G0_0_1_6_2 + 0.00349364920793552*G0_0_1_6_3 - 0.00310832025117795*G0_0_1_6_4 - 0.00156415013557898*G0_0_1_6_5 - 0.0174311402882861*G0_0_1_6_6 - 0.000568003425146386*G0_0_1_6_7 + 0.00241187384044569*G0_0_1_6_8 - 0.0114399885828476*G0_0_1_6_9 + 0.000917495203209666*G0_0_1_7_0 + 0.000861360861361124*G0_0_1_7_1 + 8.91172319743965e-05*G0_0_1_7_2 + 0.000470957613814849*G0_0_1_7_3 - 2.56885971171852e-05*G0_0_1_7_4 + 0.000553731982303515*G0_0_1_7_5 - 0.000568003425146386*G0_0_1_7_6 + 0.000796346510632308*G0_0_1_7_7 - 0.00148993863279588*G0_0_1_7_8 - 0.00148993863279602*G0_0_1_7_9 - 0.00030509173366325*G0_0_1_8_0 - 0.00108336108336153*G0_0_1_8_1 - 0.000242931671503153*G0_0_1_8_2 - 0.000899100899101112*G0_0_1_8_3 + 0.000428143285286264*G0_0_1_8_4 + 1.42714428428688e-05*G0_0_1_8_5 + 0.00241187384044569*G0_0_1_8_6 - 0.00148993863279588*G0_0_1_8_7 + 0.00413586413586437*G0_0_1_8_8 + 0.00441843870415368*G0_0_1_8_9 + 0.000875315161029594*G0_0_1_9_0 - 0.00175824175824207*G0_0_1_9_1 + 0.00148423005565886*G0_0_1_9_2 + 0.0043328100470965*G0_0_1_9_3 - 0.00368203225346144*G0_0_1_9_4 - 0.00265448836877452*G0_0_1_9_5 - 0.0114399885828476*G0_0_1_9_6 - 0.00148993863279602*G0_0_1_9_7 + 0.00441843870415368*G0_0_1_9_8 - 0.0101726844584003*G0_0_1_9_9 - 0.000967920967921173*G0_1_0_0_0 + 0.000150008721437312*G0_1_0_0_1 + 0.000618746333032142*G0_1_0_0_2 - 0.00102627531198977*G0_1_0_0_3 + 6.21600621600717e-05*G0_1_0_0_4 + 0.00377812663527013*G0_1_0_0_5 - 0.00440036154321945*G0_1_0_0_6 + 0.000848357991215264*G0_1_0_0_7 - 0.000649192077763621*G0_1_0_0_8 + 0.00320251177394089*G0_1_0_0_9 + 0.000150008721437312*G0_1_0_1_0 - 0.000932400932401155*G0_1_0_1_1 + 0.000536817679674903*G0_1_0_1_2 - 0.00260628260628306*G0_1_0_1_3 - 0.00109826681255271*G0_1_0_1_4 + 0.000821400821400947*G0_1_0_1_5 - 0.00209282780711388*G0_1_0_1_6 - 0.000450026164311944*G0_1_0_1_7 + 0.000900052328623914*G0_1_0_1_9 + 0.000618746333032142*G0_1_0_2_0 + 0.000536817679674903*G0_1_0_2_1 + 0.0554645354645446*G0_1_0_2_2 - 0.00453070738785096*G0_1_0_2_3 + 0.00317016317016361*G0_1_0_2_4 - 0.000783343640486573*G0_1_0_2_5 - 0.000541680541680755*G0_1_0_2_6 + 0.000199165913451664*G0_1_0_2_7 + 0.000649192077763612*G0_1_0_2_8 - 0.00529755958327478*G0_1_0_2_9 - 0.00102627531198977*G0_1_0_3_0 - 0.00260628260628307*G0_1_0_3_1 - 0.00453070738785096*G0_1_0_3_2 - 0.00394748109033879*G0_1_0_3_3 + 0.0180847723704897*G0_1_0_3_4 + 8.56286570576008e-06*G0_1_0_3_5 + 0.00687598116169655*G0_1_0_3_6 + 0.00367632367632432*G0_1_0_3_7 - 0.00232624518338848*G0_1_0_3_8 - 0.0100528043385204*G0_1_0_3_9 + 6.21600621600723e-05*G0_1_0_4_0 - 0.00109826681255271*G0_1_0_4_1 + 0.00317016317016361*G0_1_0_4_2 + 0.0180847723704897*G0_1_0_4_3 - 0.0506150991865363*G0_1_0_4_4 + 0.000411017553874756*G0_1_0_4_5 - 0.00728699871557133*G0_1_0_4_6 - 0.000690737833595111*G0_1_0_4_7 - 0.00135007849293584*G0_1_0_4_8 + 0.0150706436420749*G0_1_0_4_9 + 0.00377812663527013*G0_1_0_5_0 + 0.000821400821400947*G0_1_0_5_1 - 0.000783343640486573*G0_1_0_5_2 + 8.56286570575999e-06*G0_1_0_5_3 + 0.000411017553874756*G0_1_0_5_4 + 0.0570087055801435*G0_1_0_5_5 + 0.0132010846296583*G0_1_0_5_6 + 0.00186670472384784*G0_1_0_5_7 - 0.00186670472384784*G0_1_0_5_8 - 0.00587412587412697*G0_1_0_5_9 - 0.00440036154321945*G0_1_0_6_0 - 0.00209282780711388*G0_1_0_6_1 - 0.000541680541680751*G0_1_0_6_2 + 0.00687598116169655*G0_1_0_6_3 - 0.00728699871557134*G0_1_0_6_4 + 0.0132010846296583*G0_1_0_6_5 - 0.151753960325415*G0_1_0_6_6 + 0.00186670472384786*G0_1_0_6_8 + 0.00214071642643128*G0_1_0_6_9 + 0.000848357991215264*G0_1_0_7_0 - 0.000450026164311944*G0_1_0_7_1 + 0.000199165913451664*G0_1_0_7_2 + 0.00367632367632432*G0_1_0_7_3 - 0.000690737833595111*G0_1_0_7_4 + 0.00186670472384784*G0_1_0_7_5 - 0.00204081632653101*G0_1_0_7_7 + 0.00135007849293593*G0_1_0_7_8 - 0.00960753532182268*G0_1_0_7_9 - 0.000649192077763621*G0_1_0_8_0 + 0.000649192077763612*G0_1_0_8_2 - 0.00232624518338848*G0_1_0_8_3 - 0.00135007849293584*G0_1_0_8_4 - 0.00186670472384784*G0_1_0_8_5 + 0.00186670472384786*G0_1_0_8_6 + 0.00135007849293593*G0_1_0_8_7 + 0.00232624518338829*G0_1_0_8_8 + 0.0032025117739409*G0_1_0_9_0 + 0.000900052328623913*G0_1_0_9_1 - 0.00529755958327478*G0_1_0_9_2 - 0.0100528043385204*G0_1_0_9_3 + 0.0150706436420749*G0_1_0_9_4 - 0.00587412587412697*G0_1_0_9_5 + 0.00214071642643128*G0_1_0_9_6 - 0.00960753532182268*G0_1_0_9_7 + 0.0192150706436453*G0_1_0_9_9 - 0.0033645366978707*G0_1_1_0_0 - 0.000194197337054544*G0_1_1_0_1 - 1.42714428428837e-05*G0_1_1_0_3 - 6.08914894629235e-05*G0_1_1_0_4 - 0.000686614972329384*G0_1_1_0_5 - 0.000236588808017412*G0_1_1_0_6 - 0.00383330954759594*G0_1_1_0_7 + 0.00223966509680831*G0_1_1_0_8 - 0.000608914894629284*G0_1_1_0_9 - 0.000194197337054544*G0_1_1_1_0 + 0.000194197337054488*G0_1_1_1_2 - 0.00271728271728333*G0_1_1_1_3 + 0.00101232101232126*G0_1_1_1_4 + 0.00115979258836421*G0_1_1_1_5 - 0.00115979258836421*G0_1_1_1_6 - 0.00101232101232107*G0_1_1_1_7 + 0.0027172827172829*G0_1_1_1_8 + 0.000194197337054488*G0_1_1_2_1 + 0.00336453669787047*G0_1_1_2_2 - 0.00223966509680831*G0_1_1_2_3 + 0.00383330954759584*G0_1_1_2_4 + 0.000236588808017437*G0_1_1_2_5 + 0.000686614972329343*G0_1_1_2_6 + 6.08914894629363e-05*G0_1_1_2_7 + 1.42714428428561e-05*G0_1_1_2_8 + 0.000608914894629266*G0_1_1_2_9 - 1.42714428428838e-05*G0_1_1_3_0 - 0.00271728271728332*G0_1_1_3_1 - 0.00223966509680831*G0_1_1_3_2 - 0.00787212787212924*G0_1_1_3_3 + 0.00212073640645112*G0_1_1_3_4 - 0.001718281718282*G0_1_1_3_5 + 0.00347937776509264*G0_1_1_3_6 + 4.28143285286813e-05*G0_1_1_3_7 - 8.56286570572726e-05*G0_1_1_3_9 - 6.08914894629235e-05*G0_1_1_4_0 + 0.00101232101232125*G0_1_1_4_1 + 0.00383330954759584*G0_1_1_4_2 + 0.00212073640645111*G0_1_1_4_3 + 0.000194091622662949*G0_1_1_4_4 + 0.00018267446838879*G0_1_1_4_5 - 0.00366205223348143*G0_1_1_4_6 - 4.28143285285471e-05*G0_1_1_4_8 - 0.00219209362066538*G0_1_1_4_9 - 0.000686614972329383*G0_1_1_5_0 + 0.00115979258836421*G0_1_1_5_1 + 0.000236588808017437*G0_1_1_5_2 - 0.001718281718282*G0_1_1_5_3 + 0.00018267446838879*G0_1_1_5_4 + 0.0143684886542054*G0_1_1_5_5 + 0.0036620522334814*G0_1_1_5_7 - 0.00347937776509262*G0_1_1_5_8 + 0.00878550021407308*G0_1_1_5_9 - 0.000236588808017412*G0_1_1_6_0 - 0.00115979258836421*G0_1_1_6_1 + 0.000686614972329343*G0_1_1_6_2 + 0.00347937776509264*G0_1_1_6_3 - 0.00366205223348143*G0_1_1_6_4 - 0.0143684886542054*G0_1_1_6_6 - 0.000182674468388786*G0_1_1_6_7 + 0.00171828171828202*G0_1_1_6_8 - 0.00878550021407308*G0_1_1_6_9 - 0.00383330954759594*G0_1_1_7_0 - 0.00101232101232107*G0_1_1_7_1 + 6.08914894629363e-05*G0_1_1_7_2 + 4.28143285286812e-05*G0_1_1_7_3 + 0.0036620522334814*G0_1_1_7_5 - 0.000182674468388786*G0_1_1_7_6 - 0.000194091622663172*G0_1_1_7_7 - 0.00212073640645084*G0_1_1_7_8 + 0.00219209362066541*G0_1_1_7_9 + 0.00223966509680831*G0_1_1_8_0 + 0.0027172827172829*G0_1_1_8_1 + 1.42714428428561e-05*G0_1_1_8_2 - 4.2814328528547e-05*G0_1_1_8_4 - 0.00347937776509262*G0_1_1_8_5 + 0.00171828171828202*G0_1_1_8_6 - 0.00212073640645084*G0_1_1_8_7 + 0.0078721278721287*G0_1_1_8_8 + 8.56286570571817e-05*G0_1_1_8_9 - 0.000608914894629284*G0_1_1_9_0 + 0.000608914894629266*G0_1_1_9_2 - 8.56286570572722e-05*G0_1_1_9_3 - 0.00219209362066538*G0_1_1_9_4 + 0.00878550021407308*G0_1_1_9_5 - 0.00878550021407308*G0_1_1_9_6 + 0.00219209362066541*G0_1_1_9_7 + 8.56286570571818e-05*G0_1_1_9_8; + A[181] = -0.00842910176243654*G0_0_0_0_0 + 0.00039586515777*G0_0_0_0_1 - 0.00075249265725469*G0_0_0_0_2 + 0.00157842157842186*G0_0_0_0_3 - 0.000864373721516731*G0_0_0_0_4 - 0.0118146932432667*G0_0_0_0_5 + 0.00621727478870442*G0_0_0_0_6 - 0.0022667808382098*G0_0_0_0_7 + 0.00154892726321325*G0_0_0_0_8 + 0.000123685837971563*G0_0_0_0_9 + 0.00039586515777*G0_0_0_1_0 + 0.016600683267353*G0_0_0_1_1 + 0.00175593366069587*G0_0_0_1_2 + 0.0206160506160542*G0_0_0_1_3 - 0.0073260073260086*G0_0_0_1_4 - 0.00237381665953134*G0_0_0_1_5 - 0.000593216307502127*G0_0_0_1_6 - 0.00293928293928348*G0_0_0_1_7 + 0.0043700743700752*G0_0_0_1_8 - 0.00254412254412295*G0_0_0_1_9 - 0.00075249265725469*G0_0_0_2_0 + 0.00175593366069587*G0_0_0_2_1 + 0.00152736152736178*G0_0_0_2_2 + 0.00362938648652997*G0_0_0_2_3 + 0.00114805829091562*G0_0_0_2_4 - 0.00327418613132954*G0_0_0_2_5 + 0.00538762824477201*G0_0_0_2_6 - 0.000916702345273929*G0_0_0_2_7 + 0.00142286285143453*G0_0_0_2_8 + 0.00415584415584486*G0_0_0_2_9 + 0.00157842157842186*G0_0_0_3_0 + 0.0206160506160542*G0_0_0_3_1 + 0.00362938648652997*G0_0_0_3_2 + 0.0461938061938142*G0_0_0_3_3 - 0.0234950763522232*G0_0_0_3_4 + 0.00162694448408759*G0_0_0_3_5 + 0.000911945197659629*G0_0_0_3_6 - 0.0056029684601123*G0_0_0_3_7 + 0.0107392607392626*G0_0_0_3_8 + 0.0188383045525935*G0_0_0_3_9 - 0.000864373721516731*G0_0_0_4_0 - 0.0073260073260086*G0_0_0_4_1 + 0.00114805829091562*G0_0_0_4_2 - 0.0234950763522232*G0_0_0_4_3 + 0.0104952190666494*G0_0_0_4_4 + 0.00172541743970345*G0_0_0_4_5 - 0.00263736263736308*G0_0_0_4_6 + 0.00310546596260936*G0_0_0_4_7 - 0.00513629227915033*G0_0_0_4_8 - 0.0159183673469415*G0_0_0_4_9 - 0.0118146932432667*G0_0_0_5_0 - 0.00237381665953134*G0_0_0_5_1 - 0.00327418613132954*G0_0_0_5_2 + 0.00162694448408759*G0_0_0_5_3 + 0.00172541743970345*G0_0_0_5_4 - 0.101121735407467*G0_0_0_5_5 + 0.00439417725132084*G0_0_0_5_6 - 0.00813614956472232*G0_0_0_5_7 + 0.00625374625374728*G0_0_0_5_8 - 0.0128785500214093*G0_0_0_5_9 + 0.00621727478870442*G0_0_0_6_0 - 0.000593216307502127*G0_0_0_6_1 + 0.005387628244772*G0_0_0_6_2 + 0.000911945197659629*G0_0_0_6_3 - 0.00263736263736308*G0_0_0_6_4 + 0.00439417725132084*G0_0_0_6_5 - 0.0190466676180994*G0_0_0_6_6 + 0.00188240331097505*G0_0_0_6_7 - 0.000810617953475236*G0_0_0_6_8 - 0.0142914228628538*G0_0_0_6_9 - 0.0022667808382098*G0_0_0_7_0 - 0.00293928293928348*G0_0_0_7_1 - 0.000916702345273929*G0_0_0_7_2 - 0.0056029684601123*G0_0_0_7_3 + 0.00310546596260936*G0_0_0_7_4 - 0.00813614956472232*G0_0_0_7_5 + 0.00188240331097505*G0_0_0_7_6 + 0.00218923933209689*G0_0_0_7_7 - 0.000610817753675044*G0_0_0_7_8 - 0.00413586413586482*G0_0_0_7_9 + 0.00154892726321325*G0_0_0_8_0 + 0.0043700743700752*G0_0_0_8_1 + 0.00142286285143453*G0_0_0_8_2 + 0.0107392607392626*G0_0_0_8_3 - 0.00513629227915033*G0_0_0_8_4 + 0.00625374625374728*G0_0_0_8_5 - 0.000810617953475237*G0_0_0_8_6 - 0.000610817753675044*G0_0_0_8_7 + 0.00645354645354764*G0_0_0_8_8 + 0.0179049521906695*G0_0_0_8_9 + 0.000123685837971563*G0_0_0_9_0 - 0.00254412254412295*G0_0_0_9_1 + 0.00415584415584486*G0_0_0_9_2 + 0.0188383045525935*G0_0_0_9_3 - 0.0159183673469415*G0_0_0_9_4 - 0.0128785500214093*G0_0_0_9_5 - 0.0142914228628539*G0_0_0_9_6 - 0.00413586413586482*G0_0_0_9_7 + 0.0179049521906695*G0_0_0_9_8 - 0.0203453689168008*G0_0_0_9_9 - 0.00237293570626946*G0_1_0_0_0 - 0.000801544134877601*G0_1_0_0_1 + 5.69448188495917e-05*G0_1_0_0_2 + 0.000133992991135881*G0_1_0_0_3 - 0.000287014572728913*G0_1_0_0_4 - 0.000945562374133963*G0_1_0_0_5 - 3.55200355200386e-05*G0_1_0_0_6 + 0.00435770578627793*G0_1_0_0_7 - 0.00223522509236831*G0_1_0_0_8 + 0.00133390419104727*G0_1_0_0_9 - 0.000801544134877601*G0_1_0_1_0 + 0.000797104130437605*G0_1_0_1_2 + 0.0109668109668129*G0_1_0_1_3 - 0.00275280275280324*G0_1_0_1_4 + 0.000498390498390584*G0_1_0_1_5 - 0.000493950493950584*G0_1_0_1_6 + 0.00674880674880786*G0_1_0_1_7 - 0.0109668109668128*G0_1_0_1_8 - 0.00399600399600465*G0_1_0_1_9 + 5.69448188495918e-05*G0_1_0_2_0 + 0.000797104130437605*G0_1_0_2_1 - 0.000273025034929846*G0_1_0_2_2 + 0.0022269793698369*G0_1_0_2_3 + 0.00142825428539738*G0_1_0_2_4 - 0.00021629164486311*G0_1_0_2_5 + 0.000408321836893339*G0_1_0_2_6 + 0.00139891854177591*G0_1_0_2_7 - 0.00124462838748573*G0_1_0_2_8 + 0.00371628371628435*G0_1_0_2_9 + 0.000133992991135881*G0_1_0_3_0 + 0.0109668109668129*G0_1_0_3_1 + 0.0022269793698369*G0_1_0_3_2 + 0.0317482517482573*G0_1_0_3_3 - 0.0173126873126903*G0_1_0_3_4 - 0.000685029256457942*G0_1_0_3_5 + 0.000954759526188252*G0_1_0_3_6 - 0.000929070929071128*G0_1_0_3_7 - 0.00227772227772259*G0_1_0_3_8 + 0.0138461538461562*G0_1_0_3_9 - 0.000287014572728913*G0_1_0_4_0 - 0.00275280275280324*G0_1_0_4_1 + 0.00142825428539738*G0_1_0_4_2 - 0.0173126873126903*G0_1_0_4_3 + 0.010383901812475*G0_1_0_4_4 + 0.00033395176252325*G0_1_0_4_5 - 0.0012887112887115*G0_1_0_4_6 - 0.00140430997573876*G0_1_0_4_7 + 0.00320679320679371*G0_1_0_4_8 - 0.0118167546738995*G0_1_0_4_9 - 0.000945562374133963*G0_1_0_5_0 + 0.000498390498390584*G0_1_0_5_1 - 0.00021629164486311*G0_1_0_5_2 - 0.000685029256457942*G0_1_0_5_3 + 0.00033395176252325*G0_1_0_5_4 + 0.000299700299700331*G0_1_0_5_5 + 0.0010275438846869*G0_1_0_5_6 + 0.00674611103182644*G0_1_0_5_7 - 0.00202226345083521*G0_1_0_5_8 + 4.28143285286209e-05*G0_1_0_5_9 - 3.55200355200387e-05*G0_1_0_6_0 - 0.000493950493950583*G0_1_0_6_1 + 0.000408321836893339*G0_1_0_6_2 + 0.000954759526188252*G0_1_0_6_3 - 0.0012887112887115*G0_1_0_6_4 + 0.0010275438846869*G0_1_0_6_5 + 0.00175538746967347*G0_1_0_6_6 - 0.00472384758099122*G0_1_0_6_7 + 0.0028714142999862*G0_1_0_6_8 - 0.0130583702012296*G0_1_0_6_9 + 0.00435770578627793*G0_1_0_7_0 + 0.00674880674880786*G0_1_0_7_1 + 0.00139891854177591*G0_1_0_7_2 - 0.000929070929071128*G0_1_0_7_3 - 0.00140430997573876*G0_1_0_7_4 + 0.00674611103182644*G0_1_0_7_5 - 0.00472384758099122*G0_1_0_7_6 + 0.0318824033109801*G0_1_0_7_7 - 0.00438561438561515*G0_1_0_7_8 + 0.00544598258884063*G0_1_0_7_9 - 0.00223522509236831*G0_1_0_8_0 - 0.0109668109668128*G0_1_0_8_1 - 0.00124462838748573*G0_1_0_8_2 - 0.00227772227772259*G0_1_0_8_3 + 0.00320679320679371*G0_1_0_8_4 - 0.00202226345083521*G0_1_0_8_5 + 0.0028714142999862*G0_1_0_8_6 - 0.00438561438561515*G0_1_0_8_7 - 0.0271928071928117*G0_1_0_8_8 + 0.00557442557442654*G0_1_0_8_9 + 0.00133390419104727*G0_1_0_9_0 - 0.00399600399600465*G0_1_0_9_1 + 0.00371628371628435*G0_1_0_9_2 + 0.0138461538461562*G0_1_0_9_3 - 0.0118167546738995*G0_1_0_9_4 + 4.28143285286217e-05*G0_1_0_9_5 - 0.0130583702012296*G0_1_0_9_6 + 0.00544598258884063*G0_1_0_9_7 + 0.00557442557442654*G0_1_0_9_8 - 0.0267161410018597*G0_1_0_9_9; + A[176] = 0.0415815577720413*G0_0_0_0_0 + 0.0134561734561758*G0_0_0_0_1 + 0.00396118872309417*G0_0_0_0_2 + 0.0109909138480586*G0_0_0_0_3 - 0.00477110191395988*G0_0_0_0_4 + 0.0290558119129598*G0_0_0_0_5 - 0.0137813509242105*G0_0_0_0_6 + 0.00510431367574312*G0_0_0_0_7 + 0.00431526145811936*G0_0_0_0_8 + 0.00418375275518208*G0_0_0_0_9 + 0.0134561734561758*G0_0_0_1_0 + 0.338801938801997*G0_0_0_1_1 + 0.0167822301155663*G0_0_0_1_2 + 0.172020572020601*G0_0_0_1_3 - 0.0760158360158489*G0_0_0_1_4 + 0.00188256188256209*G0_0_0_1_5 - 0.0019092019092022*G0_0_0_1_6 - 0.0503822103822191*G0_0_0_1_7 + 0.0984644984645156*G0_0_0_1_8 + 0.0143323343323369*G0_0_0_1_9 + 0.00396118872309417*G0_0_0_2_0 + 0.0167822301155663*G0_0_0_2_1 + 0.00380346285108254*G0_0_0_2_2 + 0.0236352007780619*G0_0_0_2_3 - 0.011519485805202*G0_0_0_2_4 + 0.00529333100761764*G0_0_0_2_5 - 0.00530178815893191*G0_0_0_2_6 - 6.21600621600774e-05*G0_0_0_2_7 + 0.0159725988297444*G0_0_0_2_8 + 0.0120818863676027*G0_0_0_2_9 + 0.0109909138480586*G0_0_0_3_0 + 0.172020572020601*G0_0_0_3_1 + 0.0236352007780619*G0_0_0_3_2 + 0.277056277056324*G0_0_0_3_3 - 0.108238428238446*G0_0_0_3_4 - 0.0116607202321508*G0_0_0_3_5 - 0.00957138099995403*G0_0_0_3_6 - 0.0482717282717365*G0_0_0_3_7 + 0.11148851148853*G0_0_0_3_8 + 0.0535464535464627*G0_0_0_3_9 - 0.00477110191395988*G0_0_0_4_0 - 0.0760158360158489*G0_0_0_4_1 - 0.011519485805202*G0_0_0_4_2 - 0.108238428238446*G0_0_0_4_3 + 0.0509966224252024*G0_0_0_4_4 - 0.000985680985681161*G0_0_0_4_5 + 0.0105570619856352*G0_0_0_4_6 + 0.0148993863279603*G0_0_0_4_7 - 0.0632167832167939*G0_0_0_4_8 - 0.0342742971314458*G0_0_0_4_9 + 0.0290558119129598*G0_0_0_5_0 + 0.00188256188256209*G0_0_0_5_1 + 0.00529333100761764*G0_0_0_5_2 - 0.0116607202321508*G0_0_0_5_3 - 0.000985680985681161*G0_0_0_5_4 + 0.136549165120617*G0_0_0_5_5 - 0.0254260025688641*G0_0_0_5_6 + 0.0360591789163278*G0_0_0_5_7 - 0.0209466723752474*G0_0_0_5_8 + 0.0293420864849486*G0_0_0_5_9 - 0.0137813509242105*G0_0_0_6_0 - 0.0019092019092022*G0_0_0_6_1 - 0.00530178815893191*G0_0_0_6_2 - 0.00957138099995403*G0_0_0_6_3 + 0.0105570619856352*G0_0_0_6_4 - 0.0254260025688641*G0_0_0_6_5 + 0.0384529755958392*G0_0_0_6_6 - 0.0151125065410805*G0_0_0_6_7 - 0.0134456020170328*G0_0_0_6_8 - 0.0171028971029*G0_0_0_6_9 + 0.00510431367574312*G0_0_0_7_0 - 0.0503822103822191*G0_0_0_7_1 - 6.21600621600774e-05*G0_0_0_7_2 - 0.0482717282717365*G0_0_0_7_3 + 0.0148993863279603*G0_0_0_7_4 + 0.0360591789163278*G0_0_0_7_5 - 0.0151125065410805*G0_0_0_7_6 + 0.0954854669140544*G0_0_0_7_7 - 0.0563170163170259*G0_0_0_7_8 + 0.0176737548166149*G0_0_0_7_9 + 0.00431526145811936*G0_0_0_8_0 + 0.0984644984645156*G0_0_0_8_1 + 0.0159725988297444*G0_0_0_8_2 + 0.11148851148853*G0_0_0_8_3 - 0.0632167832167939*G0_0_0_8_4 - 0.0209466723752474*G0_0_0_8_5 - 0.0134456020170328*G0_0_0_8_6 - 0.0563170163170259*G0_0_0_8_7 + 0.292773892773943*G0_0_0_8_8 + 0.0834365634365776*G0_0_0_8_9 + 0.00418375275518208*G0_0_0_9_0 + 0.0143323343323369*G0_0_0_9_1 + 0.0120818863676027*G0_0_0_9_2 + 0.0535464535464627*G0_0_0_9_3 - 0.0342742971314458*G0_0_0_9_4 + 0.0293420864849486*G0_0_0_9_5 - 0.0171028971029*G0_0_0_9_6 + 0.0176737548166149*G0_0_0_9_7 + 0.0834365634365776*G0_0_0_9_8 + 0.15262451833883*G0_0_0_9_9 + 0.000165196355672512*G0_0_1_0_0 + 0.0162810029476725*G0_0_1_0_1 + 0.000959463816606838*G0_0_1_0_2 + 0.0116209716209737*G0_0_1_0_3 - 0.00473093044521698*G0_0_1_0_4 - 0.00109562395276704*G0_0_1_0_5 + 0.000342937485794701*G0_0_1_0_6 - 0.0048108505251371*G0_0_1_0_7 + 0.00829096829096977*G0_0_1_0_8 + 0.000682492111063674*G0_0_1_0_9 + 0.0162810029476725*G0_0_1_1_0 + 0.395851062517797*G0_0_1_1_1 + 0.0206549006549041*G0_0_1_1_2 + 0.208798608798644*G0_0_1_1_3 - 0.0935656935657094*G0_0_1_1_4 - 0.00377696377696454*G0_0_1_1_5 - 0.00334184334184386*G0_0_1_1_6 - 0.0714248714248838*G0_0_1_1_7 + 0.14498094498097*G0_0_1_1_8 + 0.0237984237984279*G0_0_1_1_9 + 0.000959463816606838*G0_0_1_2_0 + 0.0206549006549041*G0_0_1_2_1 + 0.00200660010183853*G0_0_1_2_2 + 0.0235941835941876*G0_0_1_2_3 - 0.00916924345495928*G0_0_1_2_4 - 0.000422434708149074*G0_0_1_2_5 - 0.00417275845847346*G0_0_1_2_7 + 0.00546712546712641*G0_0_1_2_8 + 0.00084486941629815*G0_0_1_2_9 + 0.0116209716209737*G0_0_1_3_0 + 0.208798608798644*G0_0_1_3_1 + 0.0235941835941876*G0_0_1_3_2 + 0.304095904095956*G0_0_1_3_3 - 0.112527472527492*G0_0_1_3_4 - 0.00543456543456637*G0_0_1_3_5 - 0.00263736263736309*G0_0_1_3_6 - 0.0475258075258157*G0_0_1_3_7 + 0.0765900765900898*G0_0_1_3_8 + 0.0236563436563479*G0_0_1_3_9 - 0.00473093044521698*G0_0_1_4_0 - 0.0935656935657094*G0_0_1_4_1 - 0.00916924345495928*G0_0_1_4_2 - 0.112527472527492*G0_0_1_4_3 + 0.045314685314693*G0_0_1_4_4 + 0.00152989867275609*G0_0_1_4_5 + 0.00110746396460701*G0_0_1_4_6 + 0.0196869796869831*G0_0_1_4_7 - 0.0290642690642741*G0_0_1_4_8 - 0.00559440559440663*G0_0_1_4_9 - 0.00109562395276704*G0_0_1_5_0 - 0.00377696377696453*G0_0_1_5_1 - 0.000422434708149074*G0_0_1_5_2 - 0.00543456543456637*G0_0_1_5_3 + 0.00152989867275609*G0_0_1_5_4 - 0.00300271157414069*G0_0_1_5_5 - 0.000102754388468665*G0_0_1_5_6 + 0.00147661861947602*G0_0_1_5_7 - 0.0013320013320016*G0_0_1_5_8 + 0.000616526330812119*G0_0_1_5_9 + 0.000342937485794701*G0_0_1_6_0 - 0.00334184334184386*G0_0_1_6_1 - 0.00263736263736309*G0_0_1_6_3 + 0.00110746396460701*G0_0_1_6_4 - 0.000102754388468665*G0_0_1_6_5 - 0.00110746396460699*G0_0_1_6_6 - 0.000144617287474449*G0_0_1_6_7 + 0.00314352314352367*G0_0_1_6_8 + 0.00274011702583177*G0_0_1_6_9 - 0.0048108505251371*G0_0_1_7_0 - 0.0714248714248838*G0_0_1_7_1 - 0.00417275845847346*G0_0_1_7_2 - 0.0475258075258157*G0_0_1_7_3 + 0.0196869796869831*G0_0_1_7_4 + 0.00147661861947602*G0_0_1_7_5 - 0.000144617287474449*G0_0_1_7_6 + 0.0217649017649055*G0_0_1_7_7 - 0.0354578754578817*G0_0_1_7_8 - 0.00175824175824214*G0_0_1_7_9 + 0.00829096829096977*G0_0_1_8_0 + 0.14498094498097*G0_0_1_8_1 + 0.00546712546712641*G0_0_1_8_2 + 0.0765900765900898*G0_0_1_8_3 - 0.0290642690642741*G0_0_1_8_4 - 0.0013320013320016*G0_0_1_8_5 + 0.00314352314352367*G0_0_1_8_6 - 0.0354578754578817*G0_0_1_8_7 + 0.00226440226440302*G0_0_1_8_8 - 0.0132667332667354*G0_0_1_8_9 + 0.000682492111063673*G0_0_1_9_0 + 0.0237984237984279*G0_0_1_9_1 + 0.000844869416298151*G0_0_1_9_2 + 0.0236563436563479*G0_0_1_9_3 - 0.00559440559440663*G0_0_1_9_4 + 0.000616526330812119*G0_0_1_9_5 + 0.00274011702583177*G0_0_1_9_6 - 0.00175824175824214*G0_0_1_9_7 - 0.0132667332667354*G0_0_1_9_8 - 0.00863136863137007*G0_0_1_9_9 + 0.000165196355672512*G0_1_0_0_0 + 0.0162810029476725*G0_1_0_0_1 + 0.000959463816606838*G0_1_0_0_2 + 0.0116209716209737*G0_1_0_0_3 - 0.00473093044521698*G0_1_0_0_4 - 0.00109562395276704*G0_1_0_0_5 + 0.000342937485794701*G0_1_0_0_6 - 0.0048108505251371*G0_1_0_0_7 + 0.00829096829096977*G0_1_0_0_8 + 0.000682492111063673*G0_1_0_0_9 + 0.0162810029476725*G0_1_0_1_0 + 0.395851062517797*G0_1_0_1_1 + 0.0206549006549041*G0_1_0_1_2 + 0.208798608798644*G0_1_0_1_3 - 0.0935656935657094*G0_1_0_1_4 - 0.00377696377696454*G0_1_0_1_5 - 0.00334184334184386*G0_1_0_1_6 - 0.0714248714248838*G0_1_0_1_7 + 0.14498094498097*G0_1_0_1_8 + 0.0237984237984279*G0_1_0_1_9 + 0.000959463816606838*G0_1_0_2_0 + 0.0206549006549041*G0_1_0_2_1 + 0.00200660010183853*G0_1_0_2_2 + 0.0235941835941876*G0_1_0_2_3 - 0.00916924345495928*G0_1_0_2_4 - 0.000422434708149074*G0_1_0_2_5 - 0.00417275845847346*G0_1_0_2_7 + 0.00546712546712641*G0_1_0_2_8 + 0.00084486941629815*G0_1_0_2_9 + 0.0116209716209737*G0_1_0_3_0 + 0.208798608798644*G0_1_0_3_1 + 0.0235941835941876*G0_1_0_3_2 + 0.304095904095956*G0_1_0_3_3 - 0.112527472527492*G0_1_0_3_4 - 0.00543456543456637*G0_1_0_3_5 - 0.00263736263736309*G0_1_0_3_6 - 0.0475258075258157*G0_1_0_3_7 + 0.0765900765900898*G0_1_0_3_8 + 0.0236563436563479*G0_1_0_3_9 - 0.00473093044521698*G0_1_0_4_0 - 0.0935656935657094*G0_1_0_4_1 - 0.00916924345495928*G0_1_0_4_2 - 0.112527472527492*G0_1_0_4_3 + 0.045314685314693*G0_1_0_4_4 + 0.00152989867275609*G0_1_0_4_5 + 0.00110746396460701*G0_1_0_4_6 + 0.0196869796869831*G0_1_0_4_7 - 0.0290642690642741*G0_1_0_4_8 - 0.00559440559440664*G0_1_0_4_9 - 0.00109562395276704*G0_1_0_5_0 - 0.00377696377696453*G0_1_0_5_1 - 0.000422434708149074*G0_1_0_5_2 - 0.00543456543456637*G0_1_0_5_3 + 0.00152989867275609*G0_1_0_5_4 - 0.00300271157414069*G0_1_0_5_5 - 0.000102754388468664*G0_1_0_5_6 + 0.00147661861947602*G0_1_0_5_7 - 0.0013320013320016*G0_1_0_5_8 + 0.000616526330812119*G0_1_0_5_9 + 0.000342937485794701*G0_1_0_6_0 - 0.00334184334184386*G0_1_0_6_1 - 0.00263736263736309*G0_1_0_6_3 + 0.00110746396460701*G0_1_0_6_4 - 0.000102754388468664*G0_1_0_6_5 - 0.00110746396460699*G0_1_0_6_6 - 0.000144617287474449*G0_1_0_6_7 + 0.00314352314352367*G0_1_0_6_8 + 0.00274011702583177*G0_1_0_6_9 - 0.0048108505251371*G0_1_0_7_0 - 0.0714248714248838*G0_1_0_7_1 - 0.00417275845847346*G0_1_0_7_2 - 0.0475258075258157*G0_1_0_7_3 + 0.0196869796869831*G0_1_0_7_4 + 0.00147661861947602*G0_1_0_7_5 - 0.000144617287474449*G0_1_0_7_6 + 0.0217649017649055*G0_1_0_7_7 - 0.0354578754578817*G0_1_0_7_8 - 0.00175824175824214*G0_1_0_7_9 + 0.00829096829096977*G0_1_0_8_0 + 0.14498094498097*G0_1_0_8_1 + 0.00546712546712641*G0_1_0_8_2 + 0.0765900765900898*G0_1_0_8_3 - 0.0290642690642741*G0_1_0_8_4 - 0.0013320013320016*G0_1_0_8_5 + 0.00314352314352367*G0_1_0_8_6 - 0.0354578754578817*G0_1_0_8_7 + 0.00226440226440302*G0_1_0_8_8 - 0.0132667332667354*G0_1_0_8_9 + 0.000682492111063673*G0_1_0_9_0 + 0.0237984237984279*G0_1_0_9_1 + 0.000844869416298151*G0_1_0_9_2 + 0.0236563436563479*G0_1_0_9_3 - 0.00559440559440663*G0_1_0_9_4 + 0.000616526330812119*G0_1_0_9_5 + 0.00274011702583177*G0_1_0_9_6 - 0.00175824175824214*G0_1_0_9_7 - 0.0132667332667354*G0_1_0_9_8 - 0.00863136863137007*G0_1_0_9_9 + 0.00401320020367709*G0_1_1_0_0 + 0.0281397614730997*G0_1_1_0_1 + 0.00299312680265112*G0_1_1_0_2 + 0.027291227291232*G0_1_1_0_3 - 0.0126066526066548*G0_1_1_0_4 - 0.00137470994613876*G0_1_1_0_5 - 0.00144321287178454*G0_1_1_0_6 - 0.0169637769637799*G0_1_1_0_7 + 0.039264439264446*G0_1_1_0_8 + 0.010212010212012*G0_1_1_0_9 + 0.0281397614730997*G0_1_1_1_0 + 0.497379164045916*G0_1_1_1_1 + 0.0281397614730995*G0_1_1_1_2 + 0.272616272616319*G0_1_1_1_3 - 0.125474525474547*G0_1_1_1_4 - 0.0064528064528077*G0_1_1_1_5 - 0.00645280645280747*G0_1_1_1_6 - 0.125474525474547*G0_1_1_1_7 + 0.272616272616319*G0_1_1_1_8 + 0.0433344433344508*G0_1_1_1_9 + 0.00299312680265112*G0_1_1_2_0 + 0.0281397614730995*G0_1_1_2_1 + 0.00401320020367706*G0_1_1_2_2 + 0.0392644392644459*G0_1_1_2_3 - 0.0169637769637798*G0_1_1_2_4 - 0.00144321287178454*G0_1_1_2_5 - 0.00137470994613874*G0_1_1_2_6 - 0.0126066526066547*G0_1_1_2_7 + 0.0272912272912319*G0_1_1_2_8 + 0.0102120102120119*G0_1_1_2_9 + 0.027291227291232*G0_1_1_3_0 + 0.272616272616319*G0_1_1_3_1 + 0.0392644392644459*G0_1_1_3_2 + 0.455011655011732*G0_1_1_3_3 - 0.178754578754609*G0_1_1_3_4 - 0.0153180153180179*G0_1_1_3_5 - 0.0125208125208146*G0_1_1_3_6 - 0.113752913752933*G0_1_1_3_7 + 0.227505827505866*G0_1_1_3_8 + 0.0975024975025141*G0_1_1_3_9 - 0.0126066526066548*G0_1_1_4_0 - 0.125474525474547*G0_1_1_4_1 - 0.0169637769637798*G0_1_1_4_2 - 0.178754578754609*G0_1_1_4_3 + 0.0774691974692104*G0_1_1_4_4 + 0.00594072594072695*G0_1_1_4_5 + 0.00658008658008767*G0_1_1_4_6 + 0.0537595737595828*G0_1_1_4_7 - 0.113752913752933*G0_1_1_4_8 - 0.0425174825174897*G0_1_1_4_9 - 0.00137470994613876*G0_1_1_5_0 - 0.0064528064528077*G0_1_1_5_1 - 0.00144321287178454*G0_1_1_5_2 - 0.0153180153180179*G0_1_1_5_3 + 0.00594072594072695*G0_1_1_5_4 + 0.00221492792921401*G0_1_1_5_5 + 0.000262594548308877*G0_1_1_5_6 + 0.00658008658008773*G0_1_1_5_7 - 0.0125208125208147*G0_1_1_5_8 - 0.00559440559440654*G0_1_1_5_9 - 0.00144321287178454*G0_1_1_6_0 - 0.00645280645280747*G0_1_1_6_1 - 0.00137470994613874*G0_1_1_6_2 - 0.0125208125208146*G0_1_1_6_3 + 0.00658008658008767*G0_1_1_6_4 + 0.000262594548308877*G0_1_1_6_5 + 0.002214927929214*G0_1_1_6_6 + 0.0059407259407269*G0_1_1_6_7 - 0.0153180153180178*G0_1_1_6_8 - 0.00559440559440654*G0_1_1_6_9 - 0.0169637769637799*G0_1_1_7_0 - 0.125474525474547*G0_1_1_7_1 - 0.0126066526066547*G0_1_1_7_2 - 0.113752913752933*G0_1_1_7_3 + 0.0537595737595828*G0_1_1_7_4 + 0.00658008658008773*G0_1_1_7_5 + 0.0059407259407269*G0_1_1_7_6 + 0.0774691974692106*G0_1_1_7_7 - 0.178754578754609*G0_1_1_7_8 - 0.0425174825174897*G0_1_1_7_9 + 0.039264439264446*G0_1_1_8_0 + 0.272616272616319*G0_1_1_8_1 + 0.0272912272912319*G0_1_1_8_2 + 0.227505827505866*G0_1_1_8_3 - 0.113752913752933*G0_1_1_8_4 - 0.0125208125208147*G0_1_1_8_5 - 0.0153180153180178*G0_1_1_8_6 - 0.178754578754609*G0_1_1_8_7 + 0.455011655011732*G0_1_1_8_8 + 0.097502497502514*G0_1_1_8_9 + 0.010212010212012*G0_1_1_9_0 + 0.0433344433344508*G0_1_1_9_1 + 0.0102120102120119*G0_1_1_9_2 + 0.0975024975025141*G0_1_1_9_3 - 0.0425174825174897*G0_1_1_9_4 - 0.00559440559440654*G0_1_1_9_5 - 0.00559440559440654*G0_1_1_9_6 - 0.0425174825174897*G0_1_1_9_7 + 0.097502497502514*G0_1_1_9_8 + 0.0498701298701383*G0_1_1_9_9; + A[21] = 0.00590767257434026*G0_0_0_0_0 + 0.000158333729762331*G0_0_0_0_1 + 0.000809604857224042*G0_0_0_0_2 - 0.000425896854468357*G0_0_0_0_3 - 6.15786330072135e-06*G0_0_0_0_4 + 0.00915232915233071*G0_0_0_0_5 - 0.00428542357113859*G0_0_0_0_6 + 0.00165575165575194*G0_0_0_0_7 - 0.00112044040615488*G0_0_0_0_8 + 0.00137211994354875*G0_0_0_0_9 + 0.000158333729762331*G0_0_0_1_0 - 0.00286380286380332*G0_0_0_1_1 - 0.000317310555405849*G0_0_0_1_2 - 0.0036570836570843*G0_0_0_1_3 + 0.00112313612313632*G0_0_0_1_4 + 0.000763390049104458*G0_0_0_1_5 + 0.000146070860356599*G0_0_0_1_6 - 0.000240685240685297*G0_0_0_1_7 - 0.000510970510970555*G0_0_0_1_8 - 0.000405150405150477*G0_0_0_1_9 + 0.000809604857224042*G0_0_0_2_0 - 0.000317310555405849*G0_0_0_2_1 + 0.00448070448070521*G0_0_0_2_2 - 0.000792382220953787*G0_0_0_2_3 - 0.000245785960071719*G0_0_0_2_4 + 0.00113584827870562*G0_0_0_2_5 - 0.00107289535860984*G0_0_0_2_6 - 0.000354539640253985*G0_0_0_2_7 + 5.26721955293484e-05*G0_0_0_2_8 - 0.0016821273964134*G0_0_0_2_9 - 0.000425896854468357*G0_0_0_3_0 - 0.0036570836570843*G0_0_0_3_1 - 0.000792382220953787*G0_0_0_3_2 - 0.00836163836163987*G0_0_0_3_3 + 0.00586770372484761*G0_0_0_3_4 - 0.000685029256457926*G0_0_0_3_5 - 8.06336520622366e-05*G0_0_0_3_6 + 0.00163526949241263*G0_0_0_3_7 - 0.00183483183483215*G0_0_0_3_8 - 0.00205508776937384*G0_0_0_3_9 - 6.15786330072134e-06*G0_0_0_4_0 + 0.00112313612313632*G0_0_0_4_1 - 0.000245785960071719*G0_0_0_4_2 + 0.00586770372484761*G0_0_0_4_3 - 0.00711574140145686*G0_0_0_4_4 + 0.000376052518909719*G0_0_0_4_5 - 0.000295418866847488*G0_0_0_4_6 + 0.000362256790828278*G0_0_0_4_7 + 0.000199562342419516*G0_0_0_4_8 + 0.00429427715142075*G0_0_0_4_9 + 0.00915232915233072*G0_0_0_5_0 + 0.000763390049104458*G0_0_0_5_1 + 0.00113584827870563*G0_0_0_5_2 - 0.000685029256457926*G0_0_0_5_3 + 0.000376052518909719*G0_0_0_5_4 + 0.0569444840873507*G0_0_0_5_5 - 0.00367703724846643*G0_0_0_5_6 + 0.000511393368536292*G0_0_0_5_7 - 0.00193259121830581*G0_0_0_5_8 - 0.000251177394034597*G0_0_0_5_9 - 0.00428542357113859*G0_0_0_6_0 + 0.000146070860356599*G0_0_0_6_1 - 0.00107289535860984*G0_0_0_6_2 - 8.06336520622367e-05*G0_0_0_6_3 - 0.000295418866847488*G0_0_0_6_4 - 0.00367703724846643*G0_0_0_6_5 - 0.00410161267304196*G0_0_0_6_6 + 0.00142119784976952*G0_0_0_6_7 - 0.000476904048332704*G0_0_0_6_8 + 0.00520764949336466*G0_0_0_6_9 + 0.00165575165575194*G0_0_0_7_0 - 0.000240685240685297*G0_0_0_7_1 - 0.000354539640253985*G0_0_0_7_2 + 0.00163526949241263*G0_0_0_7_3 + 0.000362256790828278*G0_0_0_7_4 + 0.000511393368536292*G0_0_0_7_5 + 0.00142119784976952*G0_0_0_7_6 - 0.00859664145378573*G0_0_0_7_7 + 0.00317658531944296*G0_0_0_7_8 - 0.00695875553018528*G0_0_0_7_9 - 0.00112044040615488*G0_0_0_8_0 - 0.000510970510970555*G0_0_0_8_1 + 5.26721955293484e-05*G0_0_0_8_2 - 0.00183483183483215*G0_0_0_8_3 + 0.000199562342419516*G0_0_0_8_4 - 0.00193259121830581*G0_0_0_8_5 - 0.000476904048332704*G0_0_0_8_6 + 0.00317658531944296*G0_0_0_8_7 - 0.00125541125541137*G0_0_0_8_8 + 0.000816326530612394*G0_0_0_8_9 + 0.00137211994354875*G0_0_0_9_0 - 0.000405150405150477*G0_0_0_9_1 - 0.0016821273964134*G0_0_0_9_2 - 0.00205508776937384*G0_0_0_9_3 + 0.00429427715142075*G0_0_0_9_4 - 0.000251177394034597*G0_0_0_9_5 + 0.00520764949336466*G0_0_0_9_6 - 0.00695875553018528*G0_0_0_9_7 + 0.000816326530612393*G0_0_0_9_8 - 0.00645640074211614*G0_0_0_9_9 - 0.0170459170459201*G0_0_1_0_0 - 0.000135455373550635*G0_0_1_0_1 - 0.000591824401348315*G0_0_1_0_2 - 4.5880045880048e-05*G0_0_1_0_3 + 4.11757554614771e-05*G0_0_1_0_4 - 0.00662670662670778*G0_0_1_0_5 + 0.00222769294197905*G0_0_1_0_6 - 0.00212343212343252*G0_0_1_0_7 + 0.00158611230039831*G0_0_1_0_8 + 0.000466359037787679*G0_0_1_0_9 - 0.000135455373550635*G0_0_1_1_0 - 0.000140194902099685*G0_0_1_1_2 - 0.00182854182854211*G0_0_1_1_3 + 0.000292670292670329*G0_0_1_1_4 + 7.89157932015147e-05*G0_0_1_1_5 + 0.000196734482448802*G0_0_1_1_6 - 0.000627890627890758*G0_0_1_1_7 + 0.00182854182854218*G0_0_1_1_8 + 0.000335220335220394*G0_0_1_1_9 - 0.000591824401348315*G0_0_1_2_0 - 0.000140194902099685*G0_0_1_2_1 + 0.00407525455144571*G0_0_1_2_2 - 0.000426372569229783*G0_0_1_2_3 - 0.000477511906083415*G0_0_1_2_4 - 0.000730724302152997*G0_0_1_2_5 - 0.000827690827690969*G0_0_1_2_6 - 0.000111370111370133*G0_0_1_2_7 + 0.000364661793233286*G0_0_1_2_8 - 0.00128173413887721*G0_0_1_2_9 - 4.5880045880048e-05*G0_0_1_3_0 - 0.00182854182854211*G0_0_1_3_1 - 0.000426372569229783*G0_0_1_3_2 - 0.0055744255744265*G0_0_1_3_3 + 0.00410732125017908*G0_0_1_3_4 - 0.000169592312449472*G0_0_1_3_5 - 0.00035012606441184*G0_0_1_3_6 + 0.000377717520574721*G0_0_1_3_7 + 0.00047619047619057*G0_0_1_3_8 - 0.00176109604681063*G0_0_1_3_9 + 4.11757554614771e-05*G0_0_1_4_0 + 0.000292670292670329*G0_0_1_4_1 - 0.000477511906083415*G0_0_1_4_2 + 0.00410732125017908*G0_0_1_4_3 - 0.00549878692735923*G0_0_1_4_4 + 0.000116550116550132*G0_0_1_4_5 + 0.000233575947861705*G0_0_1_4_6 - 1.47471576043e-05*G0_0_1_4_7 - 0.000853907996765293*G0_0_1_4_8 + 0.00361210218353137*G0_0_1_4_9 - 0.00662670662670778*G0_0_1_5_0 + 7.89157932015147e-05*G0_0_1_5_1 - 0.000730724302152997*G0_0_1_5_2 - 0.000169592312449472*G0_0_1_5_3 + 0.000116550116550132*G0_0_1_5_4 + 0.0201679273107877*G0_0_1_5_5 + 0.00651729223157907*G0_0_1_5_6 - 0.000577517720374985*G0_0_1_5_7 + 3.33000333002002e-06*G0_0_1_5_8 - 0.0014057371200231*G0_0_1_5_9 + 0.00222769294197905*G0_0_1_6_0 + 0.000196734482448802*G0_0_1_6_1 - 0.000827690827690969*G0_0_1_6_2 - 0.00035012606441184*G0_0_1_6_3 + 0.000233575947861705*G0_0_1_6_4 + 0.00651729223157906*G0_0_1_6_5 - 0.00713334284762978*G0_0_1_6_6 + 0.000574187717044964*G0_0_1_6_7 - 0.000962133104990415*G0_0_1_6_8 + 0.00454545454545532*G0_0_1_6_9 - 0.00212343212343252*G0_0_1_7_0 - 0.000627890627890758*G0_0_1_7_1 - 0.000111370111370133*G0_0_1_7_2 + 0.000377717520574721*G0_0_1_7_3 - 1.47471576042999e-05*G0_0_1_7_4 - 0.000577517720374985*G0_0_1_7_5 + 0.000574187717044964*G0_0_1_7_6 + 0.00768041482327324*G0_0_1_7_7 - 0.0025721897150473*G0_0_1_7_8 - 0.00254745254745299*G0_0_1_7_9 + 0.00158611230039831*G0_0_1_8_0 + 0.00182854182854218*G0_0_1_8_1 + 0.000364661793233286*G0_0_1_8_2 + 0.00047619047619057*G0_0_1_8_3 - 0.000853907996765293*G0_0_1_8_4 + 3.33000333001999e-06*G0_0_1_8_5 - 0.000962133104990415*G0_0_1_8_6 - 0.0025721897150473*G0_0_1_8_7 + 0.00462204462204546*G0_0_1_8_8 + 0.000702154987869404*G0_0_1_8_9 + 0.000466359037787679*G0_0_1_9_0 + 0.000335220335220394*G0_0_1_9_1 - 0.00128173413887721*G0_0_1_9_2 - 0.00176109604681063*G0_0_1_9_3 + 0.00361210218353137*G0_0_1_9_4 - 0.00140573712002309*G0_0_1_9_5 + 0.00454545454545532*G0_0_1_9_6 - 0.00254745254745299*G0_0_1_9_7 + 0.000702154987869404*G0_0_1_9_8 - 0.00428143285286217*G0_0_1_9_9; + A[52] = A[108] - 0.00143066809733506*G0_0_1_0_0 + 0.000196170672361201*G0_0_1_0_1 + 0.000396887063553791*G0_0_1_0_2 - 0.000769072197643758*G0_0_1_0_3 + 0.00237793952079706*G0_0_1_0_5 - 0.00396333824905322*G0_0_1_0_6 - 0.000344100344100371*G0_0_1_0_8 + 0.0023271966129113*G0_0_1_0_9 + 0.000196170672361201*G0_0_1_1_0 + 0.00287120287120375*G0_0_1_1_1 + 0.000388782293544272*G0_0_1_1_2 + 0.00119436119436146*G0_0_1_1_3 - 0.00297194868623494*G0_0_1_1_4 + 0.000926375212089635*G0_0_1_1_5 - 0.000828060828060968*G0_0_1_1_6 - 0.00131138702567307*G0_0_1_1_7 + 0.0010833610833615*G0_0_1_1_8 + 0.00265829408686599*G0_0_1_1_9 + 0.000396887063553791*G0_0_1_2_0 + 0.000388782293544272*G0_0_1_2_1 + 0.0516372516372603*G0_0_1_2_2 - 0.00198595055737946*G0_0_1_2_3 - 0.00158064158064187*G0_0_1_2_4 - 0.000582909154337792*G0_0_1_2_5 - 0.00262848262848315*G0_0_1_2_6 + 0.000110048681477268*G0_0_1_2_7 + 0.000892123749266765*G0_0_1_2_8 - 0.00678178963893365*G0_0_1_2_9 - 0.000769072197643758*G0_0_1_3_0 + 0.00119436119436146*G0_0_1_3_1 - 0.00198595055737946*G0_0_1_3_2 - 0.000211217354074582*G0_0_1_3_3 + 0.0174539745968347*G0_0_1_3_4 - 0.000685029256457893*G0_0_1_3_5 + 0.00338233195376104*G0_0_1_3_6 + 0.00320536606250947*G0_0_1_3_7 - 0.00142714428428737*G0_0_1_3_8 - 0.0143856143856169*G0_0_1_3_9 - 0.00297194868623494*G0_0_1_4_1 - 0.00158064158064186*G0_0_1_4_2 + 0.0174539745968347*G0_0_1_4_3 - 0.0516055373198316*G0_0_1_4_4 + 0.000796346510632328*G0_0_1_4_5 - 0.00417867846439339*G0_0_1_4_6 - 0.000665049236477926*G0_0_1_4_7 - 0.00177822177822211*G0_0_1_4_8 + 0.0187526758955363*G0_0_1_4_9 + 0.00237793952079706*G0_0_1_5_0 + 0.000926375212089635*G0_0_1_5_1 - 0.000582909154337793*G0_0_1_5_2 - 0.000685029256457893*G0_0_1_5_3 + 0.000796346510632329*G0_0_1_5_4 + 0.0600713572142242*G0_0_1_5_5 + 0.0147652347652373*G0_0_1_5_6 + 0.00131297274154433*G0_0_1_5_7 - 0.00188097616669071*G0_0_1_5_8 - 0.00321963750535245*G0_0_1_5_9 - 0.00396333824905322*G0_0_1_6_0 - 0.000828060828060968*G0_0_1_6_1 - 0.00262848262848315*G0_0_1_6_2 + 0.00338233195376104*G0_0_1_6_3 - 0.00417867846439339*G0_0_1_6_4 + 0.0147652347652373*G0_0_1_6_5 - 0.134322820037128*G0_0_1_6_6 + 0.000568003425146373*G0_0_1_6_7 - 0.000545169116597828*G0_0_1_6_8 + 0.0135807050092789*G0_0_1_6_9 - 0.00131138702567307*G0_0_1_7_1 + 0.000110048681477268*G0_0_1_7_2 + 0.00320536606250947*G0_0_1_7_3 - 0.000665049236477926*G0_0_1_7_4 + 0.00131297274154433*G0_0_1_7_5 + 0.000568003425146373*G0_0_1_7_6 - 0.00283716283716331*G0_0_1_7_7 + 0.00284001712573181*G0_0_1_7_8 - 0.00811759668902666*G0_0_1_7_9 - 0.000344100344100371*G0_0_1_8_0 + 0.0010833610833615*G0_0_1_8_1 + 0.000892123749266765*G0_0_1_8_2 - 0.00142714428428737*G0_0_1_8_3 - 0.00177822177822211*G0_0_1_8_4 - 0.00188097616669071*G0_0_1_8_5 - 0.000545169116597828*G0_0_1_8_6 + 0.00284001712573181*G0_0_1_8_7 - 0.00180961895247608*G0_0_1_8_8 - 0.00441843870415374*G0_0_1_8_9 + 0.0023271966129113*G0_0_1_9_0 + 0.00265829408686598*G0_0_1_9_1 - 0.00678178963893365*G0_0_1_9_2 - 0.0143856143856169*G0_0_1_9_3 + 0.0187526758955363*G0_0_1_9_4 - 0.00321963750535245*G0_0_1_9_5 + 0.0135807050092789*G0_0_1_9_6 - 0.00811759668902666*G0_0_1_9_7 - 0.00441843870415374*G0_0_1_9_8 + 0.0293877551020457*G0_0_1_9_9 + 0.00143066809733506*G0_1_0_0_0 - 0.000196170672361201*G0_1_0_0_1 - 0.000396887063553791*G0_1_0_0_2 + 0.000769072197643758*G0_1_0_0_3 - 0.00237793952079706*G0_1_0_0_5 + 0.00396333824905322*G0_1_0_0_6 + 0.000344100344100371*G0_1_0_0_8 - 0.0023271966129113*G0_1_0_0_9 - 0.000196170672361201*G0_1_0_1_0 - 0.00287120287120375*G0_1_0_1_1 - 0.000388782293544273*G0_1_0_1_2 - 0.00119436119436146*G0_1_0_1_3 + 0.00297194868623494*G0_1_0_1_4 - 0.000926375212089635*G0_1_0_1_5 + 0.000828060828060968*G0_1_0_1_6 + 0.00131138702567307*G0_1_0_1_7 - 0.0010833610833615*G0_1_0_1_8 - 0.00265829408686599*G0_1_0_1_9 - 0.000396887063553791*G0_1_0_2_0 - 0.000388782293544273*G0_1_0_2_1 - 0.0516372516372603*G0_1_0_2_2 + 0.00198595055737946*G0_1_0_2_3 + 0.00158064158064186*G0_1_0_2_4 + 0.000582909154337793*G0_1_0_2_5 + 0.00262848262848315*G0_1_0_2_6 - 0.000110048681477268*G0_1_0_2_7 - 0.000892123749266765*G0_1_0_2_8 + 0.00678178963893365*G0_1_0_2_9 + 0.000769072197643758*G0_1_0_3_0 - 0.00119436119436146*G0_1_0_3_1 + 0.00198595055737946*G0_1_0_3_2 + 0.000211217354074588*G0_1_0_3_3 - 0.0174539745968347*G0_1_0_3_4 + 0.000685029256457891*G0_1_0_3_5 - 0.00338233195376104*G0_1_0_3_6 - 0.00320536606250947*G0_1_0_3_7 + 0.00142714428428737*G0_1_0_3_8 + 0.0143856143856169*G0_1_0_3_9 + 0.00297194868623494*G0_1_0_4_1 + 0.00158064158064186*G0_1_0_4_2 - 0.0174539745968347*G0_1_0_4_3 + 0.0516055373198316*G0_1_0_4_4 - 0.000796346510632329*G0_1_0_4_5 + 0.00417867846439339*G0_1_0_4_6 + 0.000665049236477926*G0_1_0_4_7 + 0.00177822177822211*G0_1_0_4_8 - 0.0187526758955363*G0_1_0_4_9 - 0.00237793952079706*G0_1_0_5_0 - 0.000926375212089635*G0_1_0_5_1 + 0.000582909154337793*G0_1_0_5_2 + 0.000685029256457891*G0_1_0_5_3 - 0.000796346510632329*G0_1_0_5_4 - 0.0600713572142242*G0_1_0_5_5 - 0.0147652347652373*G0_1_0_5_6 - 0.00131297274154433*G0_1_0_5_7 + 0.00188097616669071*G0_1_0_5_8 + 0.00321963750535245*G0_1_0_5_9 + 0.00396333824905322*G0_1_0_6_0 + 0.000828060828060968*G0_1_0_6_1 + 0.00262848262848314*G0_1_0_6_2 - 0.00338233195376104*G0_1_0_6_3 + 0.00417867846439339*G0_1_0_6_4 - 0.0147652347652373*G0_1_0_6_5 + 0.134322820037128*G0_1_0_6_6 - 0.000568003425146374*G0_1_0_6_7 + 0.000545169116597827*G0_1_0_6_8 - 0.0135807050092789*G0_1_0_6_9 + 0.00131138702567307*G0_1_0_7_1 - 0.000110048681477268*G0_1_0_7_2 - 0.00320536606250947*G0_1_0_7_3 + 0.000665049236477925*G0_1_0_7_4 - 0.00131297274154433*G0_1_0_7_5 - 0.000568003425146373*G0_1_0_7_6 + 0.00283716283716331*G0_1_0_7_7 - 0.00284001712573181*G0_1_0_7_8 + 0.00811759668902666*G0_1_0_7_9 + 0.000344100344100371*G0_1_0_8_0 - 0.0010833610833615*G0_1_0_8_1 - 0.000892123749266765*G0_1_0_8_2 + 0.00142714428428737*G0_1_0_8_3 + 0.00177822177822211*G0_1_0_8_4 + 0.00188097616669071*G0_1_0_8_5 + 0.000545169116597828*G0_1_0_8_6 - 0.00284001712573181*G0_1_0_8_7 + 0.00180961895247608*G0_1_0_8_8 + 0.00441843870415374*G0_1_0_8_9 - 0.0023271966129113*G0_1_0_9_0 - 0.00265829408686598*G0_1_0_9_1 + 0.00678178963893365*G0_1_0_9_2 + 0.0143856143856169*G0_1_0_9_3 - 0.0187526758955363*G0_1_0_9_4 + 0.00321963750535245*G0_1_0_9_5 - 0.0135807050092789*G0_1_0_9_6 + 0.00811759668902666*G0_1_0_9_7 + 0.00441843870415374*G0_1_0_9_8 - 0.0293877551020457*G0_1_0_9_9; + A[35] = 0.00113558399272705*G0_1_0_0_0 + 0.000944003086860395*G0_1_0_0_1 + 0.0117478200811554*G0_1_0_0_2 - 0.00417748917748989*G0_1_0_0_3 + 0.00868964368964519*G0_1_0_0_4 - 0.00592851592851695*G0_1_0_0_5 + 0.0135714285714309*G0_1_0_0_6 - 0.00052074909217775*G0_1_0_0_7 - 0.000326736755308238*G0_1_0_0_8 + 0.00253857253857297*G0_1_0_0_9 + 0.000944003086860395*G0_1_0_1_0 + 0.00113558399272705*G0_1_0_1_1 + 0.0117478200811554*G0_1_0_1_2 - 0.00592851592851693*G0_1_0_1_3 + 0.0135714285714309*G0_1_0_1_4 - 0.00417748917748989*G0_1_0_1_5 + 0.00868964368964518*G0_1_0_1_6 - 0.000326736755308242*G0_1_0_1_7 - 0.000520749092177744*G0_1_0_1_8 + 0.00253857253857297*G0_1_0_1_9 + 0.0117478200811554*G0_1_0_2_0 + 0.0117478200811554*G0_1_0_2_1 + 0.2284591951259*G0_1_0_2_2 - 0.0524753024753112*G0_1_0_2_3 + 0.113297813297832*G0_1_0_2_4 - 0.0524753024753113*G0_1_0_2_5 + 0.113297813297832*G0_1_0_2_6 - 0.00252247752247793*G0_1_0_2_7 - 0.00252247752247793*G0_1_0_2_8 + 0.0166944166944195*G0_1_0_2_9 - 0.00417748917748989*G0_1_0_3_0 - 0.00592851592851693*G0_1_0_3_1 - 0.0524753024753112*G0_1_0_3_2 + 0.0270496170496216*G0_1_0_3_3 - 0.0619963369963474*G0_1_0_3_4 + 0.017975357975361*G0_1_0_3_5 - 0.0369547119547181*G0_1_0_3_6 + 0.00164668664668692*G0_1_0_3_7 + 0.00167166167166195*G0_1_0_3_8 - 0.0109090909090927*G0_1_0_3_9 + 0.00868964368964519*G0_1_0_4_0 + 0.0135714285714309*G0_1_0_4_1 + 0.113297813297832*G0_1_0_4_2 - 0.0619963369963474*G0_1_0_4_3 + 0.147818847818873*G0_1_0_4_4 - 0.0369547119547182*G0_1_0_4_5 + 0.0739094239094364*G0_1_0_4_6 - 0.00380785880785944*G0_1_0_4_7 - 0.00331834831834887*G0_1_0_4_8 + 0.0238261738261778*G0_1_0_4_9 - 0.00592851592851695*G0_1_0_5_0 - 0.00417748917748989*G0_1_0_5_1 - 0.0524753024753113*G0_1_0_5_2 + 0.017975357975361*G0_1_0_5_3 - 0.0369547119547182*G0_1_0_5_4 + 0.0270496170496216*G0_1_0_5_5 - 0.0619963369963474*G0_1_0_5_6 + 0.00167166167166195*G0_1_0_5_7 + 0.00164668664668692*G0_1_0_5_8 - 0.0109090909090927*G0_1_0_5_9 + 0.0135714285714309*G0_1_0_6_0 + 0.00868964368964518*G0_1_0_6_1 + 0.113297813297832*G0_1_0_6_2 - 0.0369547119547181*G0_1_0_6_3 + 0.0739094239094364*G0_1_0_6_4 - 0.0619963369963474*G0_1_0_6_5 + 0.147818847818873*G0_1_0_6_6 - 0.00331834831834886*G0_1_0_6_7 - 0.00380785880785943*G0_1_0_6_8 + 0.0238261738261778*G0_1_0_6_9 - 0.00052074909217775*G0_1_0_7_0 - 0.000326736755308242*G0_1_0_7_1 - 0.00252247752247793*G0_1_0_7_2 + 0.00164668664668692*G0_1_0_7_3 - 0.00380785880785944*G0_1_0_7_4 + 0.00167166167166195*G0_1_0_7_5 - 0.00331834831834886*G0_1_0_7_6 - 0.000705484991199375*G0_1_0_7_7 + 0.000204319490033806*G0_1_0_7_8 - 0.000979020979021142*G0_1_0_7_9 - 0.000326736755308238*G0_1_0_8_0 - 0.000520749092177744*G0_1_0_8_1 - 0.00252247752247793*G0_1_0_8_2 + 0.00167166167166195*G0_1_0_8_3 - 0.00331834831834887*G0_1_0_8_4 + 0.00164668664668692*G0_1_0_8_5 - 0.00380785880785943*G0_1_0_8_6 + 0.000204319490033806*G0_1_0_8_7 - 0.00070548499119936*G0_1_0_8_8 - 0.000979020979021136*G0_1_0_8_9 + 0.00253857253857297*G0_1_0_9_0 + 0.00253857253857297*G0_1_0_9_1 + 0.0166944166944195*G0_1_0_9_2 - 0.0109090909090927*G0_1_0_9_3 + 0.0238261738261778*G0_1_0_9_4 - 0.0109090909090927*G0_1_0_9_5 + 0.0238261738261778*G0_1_0_9_6 - 0.000979020979021142*G0_1_0_9_7 - 0.000979020979021136*G0_1_0_9_8 + 0.00803196803196937*G0_1_0_9_9 - 0.00037669561479091*G0_1_1_0_0 - 0.000193677574629992*G0_1_1_0_1 + 0.00287397787397837*G0_1_1_0_2 - 0.00305205376634001*G0_1_1_0_3 + 0.00448532948533026*G0_1_1_0_4 - 0.00158185729614328*G0_1_1_0_5 + 0.00371276871276935*G0_1_1_0_6 + 0.000163751592323052*G0_1_1_0_7 - 0.00104575318861052*G0_1_1_0_8 + 0.000279561708133181*G0_1_1_0_9 - 0.000193677574629992*G0_1_1_1_0 - 0.00739334739334872*G0_1_1_1_1 + 0.00430587930588004*G0_1_1_1_2 - 0.00552621981193506*G0_1_1_1_3 + 0.0101975801975819*G0_1_1_1_4 - 0.00213091141662606*G0_1_1_1_5 + 0.00371276871276934*G0_1_1_1_6 + 0.00247958390815578*G0_1_1_1_7 - 0.00622647194075876*G0_1_1_1_8 + 0.00137766994909874*G0_1_1_1_9 + 0.00287397787397837*G0_1_1_2_0 + 0.00430587930588004*G0_1_1_2_1 + 0.04288304288305*G0_1_1_2_2 - 0.0214183964184*G0_1_1_2_3 + 0.0501683501683586*G0_1_1_2_4 - 0.0125420875420896*G0_1_1_2_5 + 0.0250841750841793*G0_1_1_2_6 - 0.00144207644207668*G0_1_1_2_7 - 0.00210252710252745*G0_1_1_2_8 + 0.00733155733155856*G0_1_1_2_9 - 0.00305205376634001*G0_1_1_3_0 - 0.00552621981193506*G0_1_1_3_1 - 0.0214183964184*G0_1_1_3_2 + 0.00337662337662391*G0_1_1_3_3 - 0.0399450549450617*G0_1_1_3_4 + 0.0100216450216467*G0_1_1_3_5 - 0.0156327006327033*G0_1_1_3_6 + 0.00466176680462474*G0_1_1_3_7 - 0.00647495361781186*G0_1_1_3_8 - 0.0134565434565457*G0_1_1_3_9 + 0.00448532948533026*G0_1_1_4_0 + 0.0101975801975819*G0_1_1_4_1 + 0.0501683501683586*G0_1_1_4_2 - 0.0399450549450617*G0_1_1_4_3 + 0.100749250749268*G0_1_1_4_4 - 0.017950382950386*G0_1_1_4_5 + 0.0335830835830893*G0_1_1_4_6 - 0.00231768231768271*G0_1_1_4_7 + 0.00181318681318713*G0_1_1_4_8 + 0.0139060939060962*G0_1_1_4_9 - 0.00158185729614328*G0_1_1_5_0 - 0.00213091141662606*G0_1_1_5_1 - 0.0125420875420896*G0_1_1_5_2 + 0.0100216450216467*G0_1_1_5_3 - 0.017950382950386*G0_1_1_5_4 + 0.00561105561105657*G0_1_1_5_5 - 0.0156327006327033*G0_1_1_5_6 - 0.00173017458731773*G0_1_1_5_7 + 0.00189833975548293*G0_1_1_5_8 - 0.0046353646353654*G0_1_1_5_9 + 0.00371276871276935*G0_1_1_6_0 + 0.00371276871276934*G0_1_1_6_1 + 0.0250841750841793*G0_1_1_6_2 - 0.0156327006327033*G0_1_1_6_3 + 0.0335830835830893*G0_1_1_6_4 - 0.0156327006327033*G0_1_1_6_5 + 0.0335830835830893*G0_1_1_6_6 - 0.000168165168165198*G0_1_1_6_7 - 0.000168165168165196*G0_1_1_6_8 + 0.0092707292707308*G0_1_1_6_9 + 0.000163751592323052*G0_1_1_7_0 + 0.00247958390815578*G0_1_1_7_1 - 0.00144207644207668*G0_1_1_7_2 + 0.00466176680462474*G0_1_1_7_3 - 0.00231768231768271*G0_1_1_7_4 - 0.00173017458731773*G0_1_1_7_5 - 0.000168165168165198*G0_1_1_7_6 - 0.0166875981161724*G0_1_1_7_7 + 0.00561509918652874*G0_1_1_7_8 - 0.00050235478806915*G0_1_1_7_9 - 0.00104575318861052*G0_1_1_8_0 - 0.00622647194075876*G0_1_1_8_1 - 0.00210252710252745*G0_1_1_8_2 - 0.00647495361781186*G0_1_1_8_3 + 0.00181318681318713*G0_1_1_8_4 + 0.00189833975548293*G0_1_1_8_5 - 0.000168165168165196*G0_1_1_8_6 + 0.00561509918652874*G0_1_1_8_7 - 0.0353617810760729*G0_1_1_8_8 - 0.00775938347367049*G0_1_1_8_9 + 0.000279561708133181*G0_1_1_9_0 + 0.00137766994909874*G0_1_1_9_1 + 0.00733155733155856*G0_1_1_9_2 - 0.0134565434565457*G0_1_1_9_3 + 0.0139060939060962*G0_1_1_9_4 - 0.0046353646353654*G0_1_1_9_5 + 0.0092707292707308*G0_1_1_9_6 - 0.00050235478806915*G0_1_1_9_7 - 0.00775938347367049*G0_1_1_9_8 - 0.0260139860139904*G0_1_1_9_9; + A[26] = -0.00852893138607575*G0_0_0_0_0 - 0.00744194077527542*G0_0_0_0_1 - 0.00113768066149038*G0_0_0_0_2 - 0.00497687497687585*G0_0_0_0_3 + 0.00204657776086383*G0_0_0_0_4 - 0.00570572284858099*G0_0_0_0_5 + 0.002806320663464*G0_0_0_0_6 + 0.000402296116581907*G0_0_0_0_7 - 0.00337384837384897*G0_0_0_0_8 - 0.00116090258947423*G0_0_0_0_9 - 0.00744194077527542*G0_0_0_1_0 - 0.185576152242851*G0_0_0_1_1 - 0.00887384220717703*G0_0_0_1_2 - 0.0882136382136533*G0_0_0_1_3 + 0.0399332149332217*G0_0_0_1_4 + 0.000419950419950551*G0_0_0_1_5 + 0.00108040108040124*G0_0_0_1_6 + 0.0310569060569114*G0_0_0_1_7 - 0.0631294631294741*G0_0_0_1_8 - 0.009362859362861*G0_0_0_1_9 - 0.00113768066149038*G0_0_0_2_0 - 0.00887384220717703*G0_0_0_2_1 - 0.00151227960751796*G0_0_0_2_2 - 0.00985865985866152*G0_0_0_2_3 + 0.00434665863237365*G0_0_0_2_4 - 0.000719016433302273*G0_0_0_2_5 + 0.000684500684500802*G0_0_0_2_6 + 0.00112543541114989*G0_0_0_2_7 - 0.00420431420431492*G0_0_0_2_8 - 0.00225901083043979*G0_0_0_2_9 - 0.00497687497687585*G0_0_0_3_0 - 0.0882136382136533*G0_0_0_3_1 - 0.00985865985866152*G0_0_0_3_2 - 0.114235764235784*G0_0_0_3_3 + 0.0463636363636442*G0_0_0_3_4 + 0.00363969363969426*G0_0_0_3_5 + 0.00315018315018368*G0_0_0_3_6 + 0.021322011322015*G0_0_0_3_7 - 0.0403263403263473*G0_0_0_3_8 - 0.0145554445554471*G0_0_0_3_9 + 0.00204657776086383*G0_0_0_4_0 + 0.0399332149332217*G0_0_0_4_1 + 0.00434665863237365*G0_0_0_4_2 + 0.0463636363636442*G0_0_0_4_3 - 0.0214385614385651*G0_0_0_4_4 + 0.000251653108796005*G0_0_0_4_5 - 0.00340183625897969*G0_0_0_4_6 - 0.00795371295371432*G0_0_0_4_7 + 0.0190043290043323*G0_0_0_4_8 + 0.00627372627372737*G0_0_0_4_9 - 0.00570572284858099*G0_0_0_5_0 + 0.000419950419950551*G0_0_0_5_1 - 0.000719016433302273*G0_0_0_5_2 + 0.00363969363969426*G0_0_0_5_3 + 0.000251653108796006*G0_0_0_5_4 - 0.0346562960848733*G0_0_0_5_5 + 0.00541077969649491*G0_0_0_5_6 - 0.00814661528947381*G0_0_0_5_7 + 0.00513153513153602*G0_0_0_5_8 - 0.00678036249464934*G0_0_0_5_9 + 0.002806320663464*G0_0_0_6_0 + 0.00108040108040124*G0_0_0_6_1 + 0.000684500684500802*G0_0_0_6_2 + 0.00315018315018368*G0_0_0_6_3 - 0.00340183625897969*G0_0_0_6_4 + 0.00541077969649491*G0_0_0_6_5 - 0.0159821131249729*G0_0_0_6_6 + 0.00301508015793781*G0_0_0_6_7 + 0.00149017649017673*G0_0_0_6_8 + 0.000476666190952*G0_0_0_6_9 + 0.000402296116581907*G0_0_0_7_0 + 0.0310569060569114*G0_0_0_7_1 + 0.00112543541114989*G0_0_0_7_2 + 0.021322011322015*G0_0_0_7_3 - 0.00795371295371432*G0_0_0_7_4 - 0.00814661528947381*G0_0_0_7_5 + 0.00301508015793781*G0_0_0_7_6 - 0.0236729936729977*G0_0_0_7_7 + 0.0220512820512859*G0_0_0_7_8 - 0.00254745254745296*G0_0_0_7_9 - 0.00337384837384897*G0_0_0_8_0 - 0.0631294631294741*G0_0_0_8_1 - 0.00420431420431492*G0_0_0_8_2 - 0.0403263403263473*G0_0_0_8_3 + 0.0190043290043323*G0_0_0_8_4 + 0.00513153513153602*G0_0_0_8_5 + 0.00149017649017673*G0_0_0_8_6 + 0.0220512820512859*G0_0_0_8_7 - 0.0470695970696053*G0_0_0_8_8 - 0.00992007992008165*G0_0_0_8_9 - 0.00116090258947423*G0_0_0_9_0 - 0.009362859362861*G0_0_0_9_1 - 0.00225901083043979*G0_0_0_9_2 - 0.0145554445554471*G0_0_0_9_3 + 0.00627372627372737*G0_0_0_9_4 - 0.00678036249464934*G0_0_0_9_5 + 0.000476666190952*G0_0_0_9_6 - 0.00254745254745296*G0_0_0_9_7 - 0.00992007992008165*G0_0_0_9_8 - 0.0340459540459598*G0_0_0_9_9 - 0.00113558399272704*G0_0_1_0_0 - 0.0117478200811555*G0_0_1_0_1 - 0.00094400308686039*G0_0_1_0_2 - 0.00868964368964519*G0_0_1_0_3 + 0.00417748917748989*G0_0_1_0_4 + 0.000520749092177764*G0_0_1_0_5 + 0.000326736755308234*G0_0_1_0_6 + 0.00592851592851695*G0_0_1_0_7 - 0.0135714285714309*G0_0_1_0_8 - 0.00253857253857298*G0_0_1_0_9 - 0.0117478200811555*G0_0_1_1_0 - 0.228459195125901*G0_0_1_1_1 - 0.0117478200811554*G0_0_1_1_2 - 0.113297813297833*G0_0_1_1_3 + 0.0524753024753113*G0_0_1_1_4 + 0.00252247752247802*G0_0_1_1_5 + 0.00252247752247791*G0_0_1_1_6 + 0.0524753024753115*G0_0_1_1_7 - 0.113297813297833*G0_0_1_1_8 - 0.0166944166944196*G0_0_1_1_9 - 0.00094400308686039*G0_0_1_2_0 - 0.0117478200811554*G0_0_1_2_1 - 0.00113558399272704*G0_0_1_2_2 - 0.0135714285714309*G0_0_1_2_3 + 0.00592851592851692*G0_0_1_2_4 + 0.000326736755308242*G0_0_1_2_5 + 0.000520749092177748*G0_0_1_2_6 + 0.00417748917748988*G0_0_1_2_7 - 0.00868964368964515*G0_0_1_2_8 - 0.00253857253857297*G0_0_1_2_9 - 0.00868964368964519*G0_0_1_3_0 - 0.113297813297833*G0_0_1_3_1 - 0.0135714285714309*G0_0_1_3_2 - 0.147818847818873*G0_0_1_3_3 + 0.0619963369963475*G0_0_1_3_4 + 0.00380785880785946*G0_0_1_3_5 + 0.00331834831834887*G0_0_1_3_6 + 0.0369547119547182*G0_0_1_3_7 - 0.0739094239094365*G0_0_1_3_8 - 0.0238261738261779*G0_0_1_3_9 + 0.00417748917748989*G0_0_1_4_0 + 0.0524753024753113*G0_0_1_4_1 + 0.00592851592851692*G0_0_1_4_2 + 0.0619963369963475*G0_0_1_4_3 - 0.0270496170496216*G0_0_1_4_4 - 0.00164668664668693*G0_0_1_4_5 - 0.00167166167166195*G0_0_1_4_6 - 0.017975357975361*G0_0_1_4_7 + 0.0369547119547182*G0_0_1_4_8 + 0.0109090909090928*G0_0_1_4_9 + 0.000520749092177764*G0_0_1_5_0 + 0.00252247752247802*G0_0_1_5_1 + 0.000326736755308242*G0_0_1_5_2 + 0.00380785880785946*G0_0_1_5_3 - 0.00164668664668693*G0_0_1_5_4 + 0.000705484991199402*G0_0_1_5_5 - 0.000204319490033816*G0_0_1_5_6 - 0.00167166167166197*G0_0_1_5_7 + 0.00331834831834892*G0_0_1_5_8 + 0.000979020979021152*G0_0_1_5_9 + 0.000326736755308234*G0_0_1_6_0 + 0.00252247752247791*G0_0_1_6_1 + 0.000520749092177748*G0_0_1_6_2 + 0.00331834831834887*G0_0_1_6_3 - 0.00167166167166195*G0_0_1_6_4 - 0.000204319490033816*G0_0_1_6_5 + 0.000705484991199388*G0_0_1_6_6 - 0.00164668664668691*G0_0_1_6_7 + 0.00380785880785942*G0_0_1_6_8 + 0.000979020979021144*G0_0_1_6_9 + 0.00592851592851695*G0_0_1_7_0 + 0.0524753024753115*G0_0_1_7_1 + 0.00417748917748988*G0_0_1_7_2 + 0.0369547119547182*G0_0_1_7_3 - 0.017975357975361*G0_0_1_7_4 - 0.00167166167166197*G0_0_1_7_5 - 0.00164668664668691*G0_0_1_7_6 - 0.0270496170496217*G0_0_1_7_7 + 0.0619963369963475*G0_0_1_7_8 + 0.0109090909090928*G0_0_1_7_9 - 0.0135714285714309*G0_0_1_8_0 - 0.113297813297833*G0_0_1_8_1 - 0.00868964368964515*G0_0_1_8_2 - 0.0739094239094365*G0_0_1_8_3 + 0.0369547119547182*G0_0_1_8_4 + 0.00331834831834892*G0_0_1_8_5 + 0.00380785880785942*G0_0_1_8_6 + 0.0619963369963475*G0_0_1_8_7 - 0.147818847818873*G0_0_1_8_8 - 0.0238261738261779*G0_0_1_8_9 - 0.00253857253857298*G0_0_1_9_0 - 0.0166944166944196*G0_0_1_9_1 - 0.00253857253857297*G0_0_1_9_2 - 0.0238261738261779*G0_0_1_9_3 + 0.0109090909090928*G0_0_1_9_4 + 0.000979020979021152*G0_0_1_9_5 + 0.000979020979021144*G0_0_1_9_6 + 0.0109090909090928*G0_0_1_9_7 - 0.0238261738261779*G0_0_1_9_8 - 0.00803196803196939*G0_0_1_9_9; + A[135] = A[35] - 0.185576152242851*G0_0_0_0_0 - 0.00744194077527539*G0_0_0_0_1 - 0.00887384220717706*G0_0_0_0_2 + 0.000419950419950539*G0_0_0_0_3 + 0.00108040108040126*G0_0_0_0_4 - 0.0882136382136534*G0_0_0_0_5 + 0.0399332149332218*G0_0_0_0_6 - 0.0631294631294739*G0_0_0_0_7 + 0.0310569060569114*G0_0_0_0_8 - 0.00936285936286106*G0_0_0_0_9 - 0.00744194077527539*G0_0_0_1_0 - 0.00852893138607569*G0_0_0_1_1 - 0.00113768066149037*G0_0_0_1_2 - 0.00570572284858096*G0_0_0_1_3 + 0.00280632066346399*G0_0_0_1_4 - 0.00497687497687581*G0_0_0_1_5 + 0.00204657776086382*G0_0_0_1_6 - 0.00337384837384895*G0_0_0_1_7 + 0.000402296116581898*G0_0_0_1_8 - 0.00116090258947422*G0_0_0_1_9 - 0.00887384220717706*G0_0_0_2_0 - 0.00113768066149037*G0_0_0_2_1 - 0.00151227960751792*G0_0_0_2_2 - 0.000719016433302274*G0_0_0_2_3 + 0.000684500684500816*G0_0_0_2_4 - 0.00985865985866156*G0_0_0_2_5 + 0.00434665863237368*G0_0_0_2_6 - 0.00420431420431491*G0_0_0_2_7 + 0.00112543541114989*G0_0_0_2_8 - 0.00225901083043978*G0_0_0_2_9 + 0.000419950419950539*G0_0_0_3_0 - 0.00570572284858096*G0_0_0_3_1 - 0.000719016433302274*G0_0_0_3_2 - 0.0346562960848733*G0_0_0_3_3 + 0.00541077969649489*G0_0_0_3_4 + 0.00363969363969426*G0_0_0_3_5 + 0.000251653108795998*G0_0_0_3_6 + 0.00513153513153602*G0_0_0_3_7 - 0.00814661528947381*G0_0_0_3_8 - 0.00678036249464936*G0_0_0_3_9 + 0.00108040108040126*G0_0_0_4_0 + 0.00280632066346399*G0_0_0_4_1 + 0.000684500684500816*G0_0_0_4_2 + 0.00541077969649489*G0_0_0_4_3 - 0.0159821131249729*G0_0_0_4_4 + 0.00315018315018369*G0_0_0_4_5 - 0.00340183625897969*G0_0_0_4_6 + 0.00149017649017674*G0_0_0_4_7 + 0.00301508015793781*G0_0_0_4_8 + 0.000476666190951987*G0_0_0_4_9 - 0.0882136382136533*G0_0_0_5_0 - 0.00497687497687581*G0_0_0_5_1 - 0.00985865985866156*G0_0_0_5_2 + 0.00363969363969426*G0_0_0_5_3 + 0.00315018315018369*G0_0_0_5_4 - 0.114235764235784*G0_0_0_5_5 + 0.0463636363636443*G0_0_0_5_6 - 0.0403263403263472*G0_0_0_5_7 + 0.0213220113220149*G0_0_0_5_8 - 0.0145554445554471*G0_0_0_5_9 + 0.0399332149332218*G0_0_0_6_0 + 0.00204657776086382*G0_0_0_6_1 + 0.00434665863237368*G0_0_0_6_2 + 0.000251653108795998*G0_0_0_6_3 - 0.00340183625897969*G0_0_0_6_4 + 0.0463636363636443*G0_0_0_6_5 - 0.0214385614385651*G0_0_0_6_6 + 0.0190043290043322*G0_0_0_6_7 - 0.0079537129537143*G0_0_0_6_8 + 0.00627372627372736*G0_0_0_6_9 - 0.0631294631294739*G0_0_0_7_0 - 0.00337384837384895*G0_0_0_7_1 - 0.00420431420431491*G0_0_0_7_2 + 0.00513153513153602*G0_0_0_7_3 + 0.00149017649017674*G0_0_0_7_4 - 0.0403263403263472*G0_0_0_7_5 + 0.0190043290043322*G0_0_0_7_6 - 0.0470695970696051*G0_0_0_7_7 + 0.0220512820512858*G0_0_0_7_8 - 0.00992007992008163*G0_0_0_7_9 + 0.0310569060569114*G0_0_0_8_0 + 0.000402296116581899*G0_0_0_8_1 + 0.00112543541114989*G0_0_0_8_2 - 0.00814661528947381*G0_0_0_8_3 + 0.00301508015793781*G0_0_0_8_4 + 0.0213220113220149*G0_0_0_8_5 - 0.0079537129537143*G0_0_0_8_6 + 0.0220512820512858*G0_0_0_8_7 - 0.0236729936729977*G0_0_0_8_8 - 0.00254745254745295*G0_0_0_8_9 - 0.00936285936286106*G0_0_0_9_0 - 0.00116090258947422*G0_0_0_9_1 - 0.00225901083043979*G0_0_0_9_2 - 0.00678036249464936*G0_0_0_9_3 + 0.000476666190951987*G0_0_0_9_4 - 0.0145554445554471*G0_0_0_9_5 + 0.00627372627372736*G0_0_0_9_6 - 0.00992007992008163*G0_0_0_9_7 - 0.00254745254745295*G0_0_0_9_8 - 0.0340459540459599*G0_0_0_9_9 - 0.185576152242851*G0_0_1_0_0 - 0.00744194077527539*G0_0_1_0_1 - 0.00887384220717705*G0_0_1_0_2 + 0.000419950419950539*G0_0_1_0_3 + 0.00108040108040126*G0_0_1_0_4 - 0.0882136382136533*G0_0_1_0_5 + 0.0399332149332218*G0_0_1_0_6 - 0.0631294631294738*G0_0_1_0_7 + 0.0310569060569114*G0_0_1_0_8 - 0.00936285936286106*G0_0_1_0_9 - 0.00744194077527539*G0_0_1_1_0 - 0.00852893138607569*G0_0_1_1_1 - 0.00113768066149038*G0_0_1_1_2 - 0.00570572284858095*G0_0_1_1_3 + 0.00280632066346399*G0_0_1_1_4 - 0.00497687497687581*G0_0_1_1_5 + 0.00204657776086382*G0_0_1_1_6 - 0.00337384837384895*G0_0_1_1_7 + 0.000402296116581903*G0_0_1_1_8 - 0.00116090258947422*G0_0_1_1_9 - 0.00887384220717705*G0_0_1_2_0 - 0.00113768066149038*G0_0_1_2_1 - 0.00151227960751794*G0_0_1_2_2 - 0.000719016433302268*G0_0_1_2_3 + 0.000684500684500806*G0_0_1_2_4 - 0.00985865985866155*G0_0_1_2_5 + 0.00434665863237367*G0_0_1_2_6 - 0.00420431420431491*G0_0_1_2_7 + 0.00112543541114989*G0_0_1_2_8 - 0.00225901083043979*G0_0_1_2_9 + 0.000419950419950539*G0_0_1_3_0 - 0.00570572284858095*G0_0_1_3_1 - 0.000719016433302268*G0_0_1_3_2 - 0.0346562960848733*G0_0_1_3_3 + 0.00541077969649489*G0_0_1_3_4 + 0.00363969363969426*G0_0_1_3_5 + 0.000251653108796002*G0_0_1_3_6 + 0.00513153513153602*G0_0_1_3_7 - 0.00814661528947381*G0_0_1_3_8 - 0.00678036249464936*G0_0_1_3_9 + 0.00108040108040126*G0_0_1_4_0 + 0.00280632066346399*G0_0_1_4_1 + 0.000684500684500806*G0_0_1_4_2 + 0.00541077969649489*G0_0_1_4_3 - 0.015982113124973*G0_0_1_4_4 + 0.00315018315018369*G0_0_1_4_5 - 0.0034018362589797*G0_0_1_4_6 + 0.00149017649017675*G0_0_1_4_7 + 0.0030150801579378*G0_0_1_4_8 + 0.000476666190951977*G0_0_1_4_9 - 0.0882136382136533*G0_0_1_5_0 - 0.00497687497687581*G0_0_1_5_1 - 0.00985865985866155*G0_0_1_5_2 + 0.00363969363969426*G0_0_1_5_3 + 0.0031501831501837*G0_0_1_5_4 - 0.114235764235784*G0_0_1_5_5 + 0.0463636363636443*G0_0_1_5_6 - 0.0403263403263472*G0_0_1_5_7 + 0.0213220113220149*G0_0_1_5_8 - 0.0145554445554471*G0_0_1_5_9 + 0.0399332149332218*G0_0_1_6_0 + 0.00204657776086382*G0_0_1_6_1 + 0.00434665863237367*G0_0_1_6_2 + 0.000251653108796002*G0_0_1_6_3 - 0.0034018362589797*G0_0_1_6_4 + 0.0463636363636443*G0_0_1_6_5 - 0.0214385614385651*G0_0_1_6_6 + 0.0190043290043322*G0_0_1_6_7 - 0.0079537129537143*G0_0_1_6_8 + 0.00627372627372735*G0_0_1_6_9 - 0.0631294631294738*G0_0_1_7_0 - 0.00337384837384895*G0_0_1_7_1 - 0.00420431420431491*G0_0_1_7_2 + 0.00513153513153602*G0_0_1_7_3 + 0.00149017649017675*G0_0_1_7_4 - 0.0403263403263471*G0_0_1_7_5 + 0.0190043290043322*G0_0_1_7_6 - 0.0470695970696051*G0_0_1_7_7 + 0.0220512820512858*G0_0_1_7_8 - 0.00992007992008164*G0_0_1_7_9 + 0.0310569060569114*G0_0_1_8_0 + 0.000402296116581903*G0_0_1_8_1 + 0.00112543541114989*G0_0_1_8_2 - 0.00814661528947381*G0_0_1_8_3 + 0.0030150801579378*G0_0_1_8_4 + 0.0213220113220149*G0_0_1_8_5 - 0.0079537129537143*G0_0_1_8_6 + 0.0220512820512858*G0_0_1_8_7 - 0.0236729936729977*G0_0_1_8_8 - 0.00254745254745294*G0_0_1_8_9 - 0.00936285936286105*G0_0_1_9_0 - 0.00116090258947422*G0_0_1_9_1 - 0.00225901083043979*G0_0_1_9_2 - 0.00678036249464936*G0_0_1_9_3 + 0.000476666190951978*G0_0_1_9_4 - 0.0145554445554471*G0_0_1_9_5 + 0.00627372627372735*G0_0_1_9_6 - 0.00992007992008164*G0_0_1_9_7 - 0.00254745254745294*G0_0_1_9_8 - 0.0340459540459599*G0_0_1_9_9 + 0.041747458890323*G0_1_0_0_0 + 0.00336187621901964*G0_1_0_0_1 - 0.00887384220717708*G0_1_0_0_2 + 0.00207496207496241*G0_1_0_0_3 - 0.0101317201317219*G0_1_0_0_4 + 0.0310126910126962*G0_1_0_0_5 - 0.0261135161135205*G0_1_0_0_6 + 0.0506890992605364*G0_1_0_0_7 - 0.0210916596630918*G0_1_0_0_8 + 0.00479298479298562*G0_1_0_0_9 + 0.00336187621901964*G0_1_0_1_0 - 0.0085289313860757*G0_1_0_1_1 - 0.0119414976557854*G0_1_0_1_2 - 0.000297956012241781*G0_1_0_1_3 - 0.0110918446632751*G0_1_0_1_4 + 0.00789025789025922*G0_1_0_1_5 - 0.0108205551062712*G0_1_0_1_6 + 0.0105243169528902*G0_1_0_1_7 - 0.00500547071975729*G0_1_0_1_8 - 0.00116090258947422*G0_1_0_1_9 - 0.00887384220717708*G0_1_0_2_0 - 0.0119414976557854*G0_1_0_2_1 - 0.228835890740691*G0_1_0_2_2 + 0.0514295492867007*G0_1_0_2_3 - 0.113134061705509*G0_1_0_2_4 + 0.0561880711880806*G0_1_0_2_5 - 0.114879670593976*G0_1_0_2_6 + 0.00700780700780817*G0_1_0_2_7 - 0.000529576243862064*G0_1_0_2_8 - 0.0164148549862863*G0_1_0_2_9 + 0.00207496207496241*G0_1_0_3_0 - 0.00029795601224178*G0_1_0_3_1 + 0.0514295492867007*G0_1_0_3_2 - 0.0624113981256944*G0_1_0_3_3 + 0.0676114361828761*G0_1_0_3_4 - 0.0181435231435262*G0_1_0_3_5 + 0.0388530517102011*G0_1_0_3_6 + 0.000166500166500181*G0_1_0_3_7 - 0.00814661528947379*G0_1_0_3_8 + 0.00314970743542221*G0_1_0_3_9 - 0.0101317201317219*G0_1_0_4_0 - 0.0110918446632751*G0_1_0_4_1 - 0.113134061705509*G0_1_0_4_2 + 0.0676114361828761*G0_1_0_4_3 - 0.164506445935045*G0_1_0_4_4 + 0.036786546786553*G0_1_0_4_5 - 0.0756395984967541*G0_1_0_4_6 + 0.00149017649017674*G0_1_0_4_7 + 0.0079801151229736*G0_1_0_4_8 - 0.024328528614247*G0_1_0_4_9 + 0.0310126910126962*G0_1_0_5_0 + 0.00789025789025922*G0_1_0_5_1 + 0.0561880711880806*G0_1_0_5_2 - 0.0181435231435262*G0_1_0_5_3 + 0.036786546786553*G0_1_0_5_4 + 0.00653346653346755*G0_1_0_5_5 + 0.0463636363636442*G0_1_0_5_6 + 0.0319114219114272*G0_1_0_5_7 - 0.0172793872793902*G0_1_0_5_8 + 0.0201798201798236*G0_1_0_5_9 - 0.0261135161135205*G0_1_0_6_0 - 0.0108205551062712*G0_1_0_6_1 - 0.114879670593976*G0_1_0_6_2 + 0.0388530517102011*G0_1_0_6_3 - 0.0756395984967541*G0_1_0_6_4 + 0.0463636363636442*G0_1_0_6_5 - 0.142207792207816*G0_1_0_6_6 - 0.0146320346320371*G0_1_0_6_7 + 0.0138295038295061*G0_1_0_6_8 - 0.0284615384615432*G0_1_0_6_9 + 0.0506890992605364*G0_1_0_7_0 + 0.0105243169528902*G0_1_0_7_1 + 0.00700780700780817*G0_1_0_7_2 + 0.000166500166500181*G0_1_0_7_3 + 0.00149017649017674*G0_1_0_7_4 + 0.0319114219114272*G0_1_0_7_5 - 0.0146320346320371*G0_1_0_7_6 + 0.101454735740467*G0_1_0_7_7 - 0.0401493744350955*G0_1_0_7_8 + 0.0148851148851174*G0_1_0_7_9 - 0.0210916596630918*G0_1_0_8_0 - 0.00500547071975729*G0_1_0_8_1 - 0.000529576243862064*G0_1_0_8_2 - 0.0081466152894738*G0_1_0_8_3 + 0.0079801151229736*G0_1_0_8_4 - 0.0172793872793902*G0_1_0_8_5 + 0.0138295038295061*G0_1_0_8_6 - 0.0401493744350955*G0_1_0_8_7 + 0.0040821083678233*G0_1_0_8_8 - 0.0124775224775246*G0_1_0_8_9 + 0.00479298479298561*G0_1_0_9_0 - 0.00116090258947422*G0_1_0_9_1 - 0.0164148549862863*G0_1_0_9_2 + 0.00314970743542221*G0_1_0_9_3 - 0.024328528614247*G0_1_0_9_4 + 0.0201798201798236*G0_1_0_9_5 - 0.0284615384615432*G0_1_0_9_6 + 0.0148851148851174*G0_1_0_9_7 - 0.0124775224775246*G0_1_0_9_8 - 0.0340459540459598*G0_1_0_9_9 + 0.043259738497841*G0_1_1_0_0 + 0.00449955688051003*G0_1_1_0_1 + 0.000949526663812528*G0_1_1_0_3 - 0.00592740592740695*G0_1_1_0_4 + 0.0266660323803226*G0_1_1_0_5 - 0.016254856254859*G0_1_1_0_6 + 0.0500045985760355*G0_1_1_0_7 - 0.0203726432297895*G0_1_1_0_8 + 0.00705199562342541*G0_1_1_0_9 + 0.00449955688051003*G0_1_1_1_0 - 0.00449955688051002*G0_1_1_1_2 - 0.000700252128823649*G0_1_1_1_3 - 0.00771799628942619*G0_1_1_1_4 + 0.00584368012939539*G0_1_1_1_5 - 0.0058436801293954*G0_1_1_1_6 + 0.00771799628942615*G0_1_1_1_7 + 0.000700252128823728*G0_1_1_1_8 - 0.00449955688051002*G0_1_1_2_1 - 0.0432597384978409*G0_1_1_2_2 + 0.0203726432297895*G0_1_1_2_3 - 0.0500045985760356*G0_1_1_2_4 + 0.016254856254859*G0_1_1_2_5 - 0.0266660323803226*G0_1_1_2_6 + 0.00592740592740691*G0_1_1_2_7 - 0.000949526663812536*G0_1_1_2_8 - 0.00705199562342538*G0_1_1_2_9 + 0.000949526663812528*G0_1_1_3_0 - 0.000700252128823649*G0_1_1_3_1 + 0.0203726432297895*G0_1_1_3_2 - 0.0387384044526967*G0_1_1_3_3 + 0.0455601541315904*G0_1_1_3_4 - 0.0101898101898119*G0_1_1_3_5 + 0.0175310403881862*G0_1_1_3_6 - 0.00284857999143764*G0_1_1_3_7 + 0.0056971599828752*G0_1_1_3_9 - 0.00592740592740695*G0_1_1_4_0 - 0.00771799628942619*G0_1_1_4_1 - 0.0500045985760356*G0_1_1_4_2 + 0.0455601541315904*G0_1_1_4_3 - 0.11743684886544*G0_1_1_4_4 + 0.0177822177822208*G0_1_1_4_5 - 0.035313258170407*G0_1_1_4_6 + 0.0028485799914376*G0_1_1_4_8 - 0.0144084486941654*G0_1_1_4_9 + 0.0266660323803226*G0_1_1_5_0 + 0.00584368012939539*G0_1_1_5_1 + 0.016254856254859*G0_1_1_5_2 - 0.0101898101898119*G0_1_1_5_3 + 0.0177822177822208*G0_1_1_5_4 + 0.0279720279720325*G0_1_1_5_5 + 0.0353132581704069*G0_1_1_5_7 - 0.0175310403881862*G0_1_1_5_8 + 0.0139060939060962*G0_1_1_5_9 - 0.016254856254859*G0_1_1_6_0 - 0.0058436801293954*G0_1_1_6_1 - 0.0266660323803226*G0_1_1_6_2 + 0.0175310403881862*G0_1_1_6_3 - 0.035313258170407*G0_1_1_6_4 - 0.0279720279720327*G0_1_1_6_6 - 0.0177822177822207*G0_1_1_6_7 + 0.0101898101898119*G0_1_1_6_8 - 0.0139060939060962*G0_1_1_6_9 + 0.0500045985760355*G0_1_1_7_0 + 0.00771799628942615*G0_1_1_7_1 + 0.00592740592740691*G0_1_1_7_2 - 0.00284857999143764*G0_1_1_7_3 + 0.0353132581704069*G0_1_1_7_5 - 0.0177822177822207*G0_1_1_7_6 + 0.11743684886544*G0_1_1_7_7 - 0.0455601541315904*G0_1_1_7_8 + 0.0144084486941654*G0_1_1_7_9 - 0.0203726432297895*G0_1_1_8_0 + 0.000700252128823729*G0_1_1_8_1 - 0.000949526663812536*G0_1_1_8_2 + 0.0028485799914376*G0_1_1_8_4 - 0.0175310403881862*G0_1_1_8_5 + 0.0101898101898119*G0_1_1_8_6 - 0.0455601541315904*G0_1_1_8_7 + 0.0387384044526968*G0_1_1_8_8 - 0.00569715998287523*G0_1_1_8_9 + 0.00705199562342541*G0_1_1_9_0 - 0.00705199562342538*G0_1_1_9_2 + 0.0056971599828752*G0_1_1_9_3 - 0.0144084486941654*G0_1_1_9_4 + 0.0139060939060962*G0_1_1_9_5 - 0.0139060939060962*G0_1_1_9_6 + 0.0144084486941654*G0_1_1_9_7 - 0.00569715998287523*G0_1_1_9_8; + A[157] = -0.0185429385429419*G0_0_0_0_0 - 0.000773195058909485*G0_0_0_0_1 - 0.00185837971552291*G0_0_0_0_2 + 0.000400076114361905*G0_0_0_0_3 + 0.000412206840778337*G0_0_0_0_4 - 0.0225857475857515*G0_0_0_0_5 + 0.00657152371438202*G0_0_0_0_6 - 0.00452380952381033*G0_0_0_0_7 + 0.00193615907901658*G0_0_0_0_8 - 0.00192093620665082*G0_0_0_0_9 - 0.000773195058909485*G0_0_0_1_0 - 0.00266252266252333*G0_0_0_1_1 - 0.00016393659250806*G0_0_0_1_2 - 0.0027108605680039*G0_0_0_1_3 - 0.000933352361923944*G0_0_0_1_4 + 0.00108225108225126*G0_0_0_1_5 - 0.00137315065886519*G0_0_0_1_6 + 0.00292564578278915*G0_0_0_1_7 - 0.000695732838590118*G0_0_0_1_8 - 0.00133295276152442*G0_0_0_1_9 - 0.00185837971552291*G0_0_0_2_0 - 0.00016393659250806*G0_0_0_2_1 - 0.00124912124912165*G0_0_0_2_2 - 0.000643166357452137*G0_0_0_2_3 - 0.00330336330336394*G0_0_0_2_4 - 0.00261452832881446*G0_0_0_2_5 - 0.0017582417582421*G0_0_0_2_6 + 0.00386732315303809*G0_0_0_2_7 - 0.00193972693972726*G0_0_0_2_8 + 0.0023519337805056*G0_0_0_2_9 + 0.000400076114361905*G0_0_0_3_0 - 0.0027108605680039*G0_0_0_3_1 - 0.000643166357452137*G0_0_0_3_2 + 0.000916226630512692*G0_0_0_3_3 + 0.0129834451263045*G0_0_0_3_4 - 0.00244897959183714*G0_0_0_3_5 + 0.00457042957043038*G0_0_0_3_6 - 0.000749250749250897*G0_0_0_3_7 - 0.0055209076637657*G0_0_0_3_8 + 0.00549735978307504*G0_0_0_3_9 + 0.000412206840778337*G0_0_0_4_0 - 0.000933352361923943*G0_0_0_4_1 - 0.00330336330336394*G0_0_0_4_2 + 0.0129834451263045*G0_0_0_4_3 - 0.00253888968174736*G0_0_0_4_4 - 0.000785642928500189*G0_0_0_4_5 - 0.00378478664193019*G0_0_0_4_6 - 0.00664478378764205*G0_0_0_4_7 + 0.0062701584130166*G0_0_0_4_8 - 0.00548451548451641*G0_0_0_4_9 - 0.0225857475857515*G0_0_0_5_0 + 0.00108225108225126*G0_0_0_5_1 - 0.00261452832881446*G0_0_0_5_2 - 0.00244897959183714*G0_0_0_5_3 - 0.000785642928500189*G0_0_0_5_4 + 0.0141201655487392*G0_0_0_5_5 + 0.0255323248180434*G0_0_0_5_6 + 0.0139467675181984*G0_0_0_5_7 - 0.00279577565291896*G0_0_0_5_8 + 0.0113543599257904*G0_0_0_5_9 + 0.00657152371438202*G0_0_0_6_0 - 0.00137315065886519*G0_0_0_6_1 - 0.0017582417582421*G0_0_0_6_2 + 0.00457042957043038*G0_0_0_6_3 - 0.00378478664193019*G0_0_0_6_4 + 0.0255323248180434*G0_0_0_6_5 + 0.00843014128728536*G0_0_0_6_6 - 0.0111509918652794*G0_0_0_6_7 + 0.00474382760097126*G0_0_0_6_8 - 0.0161966604823775*G0_0_0_6_9 - 0.00452380952381033*G0_0_0_7_0 + 0.00292564578278915*G0_0_0_7_1 + 0.00386732315303809*G0_0_0_7_2 - 0.000749250749250897*G0_0_0_7_3 - 0.00664478378764205*G0_0_0_7_4 + 0.0139467675181984*G0_0_0_7_5 - 0.0111509918652794*G0_0_0_7_6 + 0.0567075781361591*G0_0_0_7_7 - 0.00919651776794794*G0_0_0_7_8 + 0.0280647923505113*G0_0_0_7_9 + 0.00193615907901658*G0_0_0_8_0 - 0.000695732838590118*G0_0_0_8_1 - 0.00193972693972726*G0_0_0_8_2 - 0.0055209076637657*G0_0_0_8_3 + 0.0062701584130166*G0_0_0_8_4 - 0.00279577565291896*G0_0_0_8_5 + 0.00474382760097126*G0_0_0_8_6 - 0.00919651776794794*G0_0_0_8_7 - 0.0128314542600276*G0_0_0_8_8 - 0.00854145854145995*G0_0_0_8_9 - 0.00192093620665082*G0_0_0_9_0 - 0.00133295276152442*G0_0_0_9_1 + 0.0023519337805056*G0_0_0_9_2 + 0.00549735978307504*G0_0_0_9_3 - 0.00548451548451642*G0_0_0_9_4 + 0.0113543599257904*G0_0_0_9_5 - 0.0161966604823775*G0_0_0_9_6 + 0.0280647923505113*G0_0_0_9_7 - 0.00854145854145994*G0_0_0_9_8 - 0.0117140002854308*G0_0_0_9_9 + 0.121480001480023*G0_0_1_0_0 + 0.00115664758521923*G0_0_1_0_1 + 0.0011566475852192*G0_0_1_0_2 + 0.000988059559488265*G0_0_1_0_3 + 0.0009880595594883*G0_0_1_0_4 + 0.00539294039294133*G0_0_1_0_5 - 0.00647875933590331*G0_0_1_0_6 + 0.00539294039294146*G0_0_1_0_7 - 0.00647875933590336*G0_0_1_0_8 - 0.00719566148137691*G0_0_1_0_9 + 0.00115664758521923*G0_0_1_1_0 - 0.00171606171606225*G0_0_1_1_1 - 0.000215340215340265*G0_0_1_1_2 - 0.0033404690547554*G0_0_1_1_3 - 0.000668141382427184*G0_0_1_1_4 - 0.00104704818990548*G0_0_1_1_5 - 0.00131321059892512*G0_0_1_1_6 - 0.00349293563579331*G0_0_1_1_7 - 0.000312544598258987*G0_0_1_1_8 + 0.00267589553303883*G0_0_1_1_9 + 0.0011566475852192*G0_0_1_2_0 - 0.000215340215340265*G0_0_1_2_1 - 0.00171606171606217*G0_0_1_2_2 - 0.000668141382427174*G0_0_1_2_3 - 0.00334046905475541*G0_0_1_2_4 - 0.00349293563579336*G0_0_1_2_5 - 0.000312544598258976*G0_0_1_2_6 - 0.00104704818990549*G0_0_1_2_7 - 0.0013132105989251*G0_0_1_2_8 + 0.00267589553303884*G0_0_1_2_9 + 0.000988059559488265*G0_0_1_3_0 - 0.0033404690547554*G0_0_1_3_1 - 0.000668141382427173*G0_0_1_3_2 + 2.35478806908133e-05*G0_0_1_3_3 + 0.011988011988014*G0_0_1_3_4 - 0.000372484658199072*G0_0_1_3_5 + 0.00486156700442499*G0_0_1_3_6 - 0.00204224347081523*G0_0_1_3_7 - 0.00281932353360966*G0_0_1_3_8 - 0.00394319965748597*G0_0_1_3_9 + 0.0009880595594883*G0_0_1_4_0 - 0.000668141382427184*G0_0_1_4_1 - 0.00334046905475541*G0_0_1_4_2 + 0.011988011988014*G0_0_1_4_3 + 2.35478806906484e-05*G0_0_1_4_4 - 0.00204224347081522*G0_0_1_4_5 - 0.00281932353360974*G0_0_1_4_6 - 0.000372484658199027*G0_0_1_4_7 + 0.00486156700442493*G0_0_1_4_8 - 0.00394319965748606*G0_0_1_4_9 + 0.00539294039294133*G0_0_1_5_0 - 0.00104704818990548*G0_0_1_5_1 - 0.00349293563579337*G0_0_1_5_2 - 0.000372484658199071*G0_0_1_5_3 - 0.00204224347081522*G0_0_1_5_4 - 0.192688026259487*G0_0_1_5_5 + 0.026756814613962*G0_0_1_5_6 - 0.00812615955473221*G0_0_1_5_7 + 0.00406307977736613*G0_0_1_5_8 + 0.0134608248893986*G0_0_1_5_9 - 0.00647875933590331*G0_0_1_6_0 - 0.00131321059892512*G0_0_1_6_1 - 0.000312544598258976*G0_0_1_6_2 + 0.00486156700442499*G0_0_1_6_3 - 0.00281932353360974*G0_0_1_6_4 + 0.026756814613962*G0_0_1_6_5 - 0.0106586270872004*G0_0_1_6_6 + 0.00406307977736611*G0_0_1_6_7 + 0.0034786641929505*G0_0_1_6_8 - 0.0177508206079665*G0_0_1_6_9 + 0.00539294039294146*G0_0_1_7_0 - 0.00349293563579332*G0_0_1_7_1 - 0.00104704818990549*G0_0_1_7_2 - 0.00204224347081523*G0_0_1_7_3 - 0.000372484658199027*G0_0_1_7_4 - 0.00812615955473222*G0_0_1_7_5 + 0.00406307977736611*G0_0_1_7_6 - 0.192688026259487*G0_0_1_7_7 + 0.0267568146139618*G0_0_1_7_8 + 0.0134608248893986*G0_0_1_7_9 - 0.00647875933590336*G0_0_1_8_0 - 0.000312544598258986*G0_0_1_8_1 - 0.0013132105989251*G0_0_1_8_2 - 0.00281932353360966*G0_0_1_8_3 + 0.00486156700442493*G0_0_1_8_4 + 0.00406307977736613*G0_0_1_8_5 + 0.0034786641929505*G0_0_1_8_6 + 0.0267568146139618*G0_0_1_8_7 - 0.0106586270871999*G0_0_1_8_8 - 0.0177508206079664*G0_0_1_8_9 - 0.00719566148137691*G0_0_1_9_0 + 0.00267589553303883*G0_0_1_9_1 + 0.00267589553303884*G0_0_1_9_2 - 0.00394319965748597*G0_0_1_9_3 - 0.00394319965748606*G0_0_1_9_4 + 0.0134608248893986*G0_0_1_9_5 - 0.0177508206079665*G0_0_1_9_6 + 0.0134608248893986*G0_0_1_9_7 - 0.0177508206079664*G0_0_1_9_8 + 0.079608962466119*G0_0_1_9_9 + 0.00246938246938288*G0_1_0_0_0 + 0.000236641665213126*G0_1_0_0_1 + 0.00023664166521313*G0_1_0_0_2 - 0.000149136577708023*G0_1_0_0_3 - 0.000149136577708032*G0_1_0_0_4 + 0.00555944055944149*G0_1_0_0_5 - 0.00172684458398773*G0_1_0_0_6 + 0.0055594405594415*G0_1_0_0_7 - 0.00172684458398773*G0_1_0_0_8 + 0.00431283002711647*G0_1_0_0_9 + 0.000236641665213126*G0_1_0_1_0 - 0.00312946312946391*G0_1_0_1_1 + 4.18364704079028e-05*G0_1_0_1_2 - 0.00273060273060322*G0_1_0_1_3 - 0.00112078397792701*G0_1_0_1_4 + 0.000240473811902417*G0_1_0_1_5 - 0.00307121449978647*G0_1_0_1_6 + 0.00234241948527705*G0_1_0_1_7 + 0.000732600732600805*G0_1_0_1_8 - 0.00114171542742993*G0_1_0_1_9 + 0.00023664166521313*G0_1_0_2_0 + 4.18364704079028e-05*G0_1_0_2_1 - 0.00312946312946367*G0_1_0_2_2 - 0.00112078397792702*G0_1_0_2_3 - 0.00273060273060318*G0_1_0_2_4 + 0.00234241948527703*G0_1_0_2_5 + 0.000732600732600865*G0_1_0_2_6 + 0.000240473811902422*G0_1_0_2_7 - 0.00307121449978644*G0_1_0_2_8 - 0.00114171542742989*G0_1_0_2_9 - 0.000149136577708023*G0_1_0_3_0 - 0.00273060273060322*G0_1_0_3_1 - 0.00112078397792702*G0_1_0_3_2 + 0.00151776794633988*G0_1_0_3_3 + 0.0143492222063674*G0_1_0_3_4 + 0.000370343941772574*G0_1_0_3_5 + 0.00819894391323106*G0_1_0_3_6 - 0.000567289853004249*G0_1_0_3_7 - 0.00763165406022675*G0_1_0_3_8 + 0.00455972598829827*G0_1_0_3_9 - 0.000149136577708032*G0_1_0_4_0 - 0.00112078397792701*G0_1_0_4_1 - 0.00273060273060318*G0_1_0_4_2 + 0.0143492222063674*G0_1_0_4_3 + 0.00151776794633967*G0_1_0_4_4 - 0.00056728985300423*G0_1_0_4_5 - 0.00763165406022683*G0_1_0_4_6 + 0.000370343941772577*G0_1_0_4_7 + 0.008198943913231*G0_1_0_4_8 + 0.00455972598829816*G0_1_0_4_9 + 0.00555944055944149*G0_1_0_5_0 + 0.000240473811902417*G0_1_0_5_1 + 0.00234241948527703*G0_1_0_5_2 + 0.000370343941772574*G0_1_0_5_3 - 0.00056728985300423*G0_1_0_5_4 - 0.00393677750820691*G0_1_0_5_5 - 0.00805337519623372*G0_1_0_5_6 + 0.00347224204367117*G0_1_0_5_7 - 0.00173612102183558*G0_1_0_5_8 - 0.00946624803767825*G0_1_0_5_9 - 0.00172684458398773*G0_1_0_6_0 - 0.00307121449978647*G0_1_0_6_1 + 0.000732600732600865*G0_1_0_6_2 + 0.00819894391323106*G0_1_0_6_3 - 0.00763165406022683*G0_1_0_6_4 - 0.00805337519623372*G0_1_0_6_5 - 0.0238069073783405*G0_1_0_6_6 - 0.0017361210218356*G0_1_0_6_7 + 0.00972099329242352*G0_1_0_6_8 - 0.0129727415441725*G0_1_0_6_9 + 0.0055594405594415*G0_1_0_7_0 + 0.00234241948527705*G0_1_0_7_1 + 0.000240473811902422*G0_1_0_7_2 - 0.000567289853004249*G0_1_0_7_3 + 0.000370343941772577*G0_1_0_7_4 + 0.00347224204367117*G0_1_0_7_5 - 0.0017361210218356*G0_1_0_7_6 - 0.00393677750820676*G0_1_0_7_7 - 0.00805337519623373*G0_1_0_7_8 - 0.00946624803767824*G0_1_0_7_9 - 0.00172684458398773*G0_1_0_8_0 + 0.000732600732600805*G0_1_0_8_1 - 0.00307121449978644*G0_1_0_8_2 - 0.00763165406022675*G0_1_0_8_3 + 0.008198943913231*G0_1_0_8_4 - 0.00173612102183558*G0_1_0_8_5 + 0.00972099329242352*G0_1_0_8_6 - 0.00805337519623373*G0_1_0_8_7 - 0.0238069073783397*G0_1_0_8_8 - 0.0129727415441722*G0_1_0_8_9 + 0.00431283002711647*G0_1_0_9_0 - 0.00114171542742993*G0_1_0_9_1 - 0.00114171542742989*G0_1_0_9_2 + 0.00455972598829827*G0_1_0_9_3 + 0.00455972598829816*G0_1_0_9_4 - 0.00946624803767825*G0_1_0_9_5 - 0.0129727415441725*G0_1_0_9_6 - 0.00946624803767824*G0_1_0_9_7 - 0.0129727415441722*G0_1_0_9_8 - 0.0410760667903596*G0_1_0_9_9 - 0.0185429385429415*G0_1_1_0_0 - 0.00185837971552289*G0_1_1_0_1 - 0.000773195058909467*G0_1_1_0_2 + 0.000412206840778354*G0_1_1_0_3 + 0.000400076114361889*G0_1_1_0_4 - 0.00452380952381021*G0_1_1_0_5 + 0.0019361590790165*G0_1_1_0_6 - 0.0225857475857513*G0_1_1_0_7 + 0.00657152371438192*G0_1_1_0_8 - 0.00192093620665082*G0_1_1_0_9 - 0.00185837971552289*G0_1_1_1_0 - 0.00124912124912174*G0_1_1_1_1 - 0.000163936592508057*G0_1_1_1_2 - 0.00330336330336394*G0_1_1_1_3 - 0.000643166357452142*G0_1_1_1_4 + 0.00386732315303811*G0_1_1_1_5 - 0.00193972693972728*G0_1_1_1_6 - 0.00261452832881443*G0_1_1_1_7 - 0.00175824175824213*G0_1_1_1_8 + 0.00235193378050558*G0_1_1_1_9 - 0.000773195058909467*G0_1_1_2_0 - 0.000163936592508057*G0_1_1_2_1 - 0.00266252266252312*G0_1_1_2_2 - 0.000933352361923945*G0_1_1_2_3 - 0.00271086056800388*G0_1_1_2_4 + 0.00292564578278915*G0_1_1_2_5 - 0.000695732838590117*G0_1_1_2_6 + 0.00108225108225128*G0_1_1_2_7 - 0.00137315065886517*G0_1_1_2_8 - 0.00133295276152439*G0_1_1_2_9 + 0.000412206840778354*G0_1_1_3_0 - 0.00330336330336394*G0_1_1_3_1 - 0.000933352361923945*G0_1_1_3_2 - 0.00253888968174718*G0_1_1_3_3 + 0.0129834451263044*G0_1_1_3_4 - 0.00664478378764206*G0_1_1_3_5 + 0.00627015841301665*G0_1_1_3_6 - 0.000785642928500213*G0_1_1_3_7 - 0.0037847866419301*G0_1_1_3_8 - 0.00548451548451632*G0_1_1_3_9 + 0.000400076114361889*G0_1_1_4_0 - 0.000643166357452142*G0_1_1_4_1 - 0.00271086056800388*G0_1_1_4_2 + 0.0129834451263044*G0_1_1_4_3 + 0.000916226630512507*G0_1_1_4_4 - 0.000749250749250871*G0_1_1_4_5 - 0.00552090766376579*G0_1_1_4_6 - 0.00244897959183716*G0_1_1_4_7 + 0.00457042957043031*G0_1_1_4_8 + 0.00549735978307492*G0_1_1_4_9 - 0.00452380952381021*G0_1_1_5_0 + 0.0038673231530381*G0_1_1_5_1 + 0.00292564578278915*G0_1_1_5_2 - 0.00664478378764206*G0_1_1_5_3 - 0.000749250749250872*G0_1_1_5_4 + 0.0567075781361593*G0_1_1_5_5 - 0.00919651776794787*G0_1_1_5_6 + 0.0139467675181985*G0_1_1_5_7 - 0.0111509918652795*G0_1_1_5_8 + 0.0280647923505115*G0_1_1_5_9 + 0.0019361590790165*G0_1_1_6_0 - 0.00193972693972728*G0_1_1_6_1 - 0.000695732838590117*G0_1_1_6_2 + 0.00627015841301665*G0_1_1_6_3 - 0.00552090766376579*G0_1_1_6_4 - 0.00919651776794787*G0_1_1_6_5 - 0.0128314542600282*G0_1_1_6_6 - 0.00279577565291901*G0_1_1_6_7 + 0.00474382760097128*G0_1_1_6_8 - 0.00854145854146012*G0_1_1_6_9 - 0.0225857475857513*G0_1_1_7_0 - 0.00261452832881443*G0_1_1_7_1 + 0.00108225108225128*G0_1_1_7_2 - 0.000785642928500212*G0_1_1_7_3 - 0.00244897959183716*G0_1_1_7_4 + 0.0139467675181985*G0_1_1_7_5 - 0.00279577565291901*G0_1_1_7_6 + 0.0141201655487397*G0_1_1_7_7 + 0.0255323248180433*G0_1_1_7_8 + 0.0113543599257905*G0_1_1_7_9 + 0.00657152371438192*G0_1_1_8_0 - 0.00175824175824213*G0_1_1_8_1 - 0.00137315065886517*G0_1_1_8_2 - 0.0037847866419301*G0_1_1_8_3 + 0.00457042957043031*G0_1_1_8_4 - 0.0111509918652795*G0_1_1_8_5 + 0.00474382760097128*G0_1_1_8_6 + 0.0255323248180433*G0_1_1_8_7 + 0.00843014128728594*G0_1_1_8_8 - 0.0161966604823774*G0_1_1_8_9 - 0.00192093620665082*G0_1_1_9_0 + 0.00235193378050558*G0_1_1_9_1 - 0.00133295276152439*G0_1_1_9_2 - 0.00548451548451632*G0_1_1_9_3 + 0.00549735978307492*G0_1_1_9_4 + 0.0280647923505115*G0_1_1_9_5 - 0.00854145854146012*G0_1_1_9_6 + 0.0113543599257905*G0_1_1_9_7 - 0.0161966604823774*G0_1_1_9_8 - 0.0117140002854306*G0_1_1_9_9; + A[211] = -A[181] - 0.00662871520014488*G0_0_0_0_0 + 0.00135469468802827*G0_0_0_0_1 - 0.00156193013335897*G0_0_0_0_2 + 0.00424591281734213*G0_0_0_0_3 - 0.00317999460856658*G0_0_0_0_4 - 0.00683538683538802*G0_0_0_0_5 + 0.00315938030223796*G0_0_0_0_6 - 0.00254697683269156*G0_0_0_0_7 + 0.00295133437990632*G0_0_0_0_8 + 0.000563246277532078*G0_0_0_0_9 + 0.00135469468802827*G0_0_0_1_0 + 0.0332013665347058*G0_0_0_1_1 + 0.00295334295334346*G0_0_0_1_2 + 0.0359529359529421*G0_0_0_1_3 - 0.0170140970140999*G0_0_0_1_4 - 0.00247308247308289*G0_0_0_1_5 - 0.00346542346542406*G0_0_0_1_6 - 0.00751248751248885*G0_0_0_1_7 + 0.0140193140193165*G0_0_0_1_8 - 0.00109224109224124*G0_0_0_1_9 - 0.00156193013335897*G0_0_0_2_0 + 0.00295334295334346*G0_0_0_2_1 - 0.00452880452880526*G0_0_0_2_2 + 0.00741353884211152*G0_0_0_2_3 - 0.00547642833357211*G0_0_0_2_4 + 0.0029786086928949*G0_0_0_2_5 - 0.00548150262436069*G0_0_0_2_6 - 0.00149406149406175*G0_0_0_2_7 + 0.0028672914387205*G0_0_0_2_8 + 0.00294562580276916*G0_0_0_2_9 + 0.00424591281734213*G0_0_0_3_0 + 0.0359529359529421*G0_0_0_3_1 + 0.00741353884211152*G0_0_0_3_2 + 0.0798401598401735*G0_0_0_3_3 - 0.0197202797202831*G0_0_0_3_4 - 0.00205508776937386*G0_0_0_3_5 + 0.00918795490224212*G0_0_0_3_6 - 0.0139460539460563*G0_0_0_3_7 + 0.0237562437562479*G0_0_0_3_8 + 0.0311688311688365*G0_0_0_3_9 - 0.00317999460856658*G0_0_0_4_0 - 0.0170140970140999*G0_0_0_4_1 - 0.00547642833357211*G0_0_0_4_2 - 0.0197202797202831*G0_0_0_4_3 - 0.0191979449122337*G0_0_0_4_4 + 0.00833166833166973*G0_0_0_4_5 - 0.0175196232339119*G0_0_0_4_6 + 0.00761524190095748*G0_0_0_4_7 - 0.0098101898101915*G0_0_0_4_8 - 0.0255002140716469*G0_0_0_4_9 - 0.00683538683538802*G0_0_0_5_0 - 0.00247308247308289*G0_0_0_5_1 + 0.0029786086928949*G0_0_0_5_2 - 0.00205508776937386*G0_0_0_5_3 + 0.00833166833166973*G0_0_0_5_4 - 0.12192379049524*G0_0_0_5_5 + 0.00776081061795477*G0_0_0_5_6 - 0.0094848009133739*G0_0_0_5_7 + 0.00621093192521866*G0_0_0_5_8 - 0.0141116026830336*G0_0_0_5_9 + 0.00315938030223796*G0_0_0_6_0 - 0.00346542346542406*G0_0_0_6_1 - 0.00548150262436069*G0_0_0_6_2 + 0.00918795490224212*G0_0_0_6_3 - 0.0175196232339119*G0_0_0_6_4 + 0.00776081061795477*G0_0_0_6_5 - 0.120468103325266*G0_0_0_6_6 + 0.00327386898815523*G0_0_0_6_7 + 0.0015013557870703*G0_0_0_6_8 - 0.0272127872127917*G0_0_0_6_9 - 0.00254697683269156*G0_0_0_7_0 - 0.00751248751248885*G0_0_0_7_1 - 0.00149406149406175*G0_0_0_7_2 - 0.0139460539460563*G0_0_0_7_3 + 0.00761524190095748*G0_0_0_7_4 - 0.0094848009133739*G0_0_0_7_5 + 0.00327386898815524*G0_0_0_7_6 + 0.00230055658627129*G0_0_0_7_7 - 0.00679320679320798*G0_0_0_7_8 - 0.00823747680890676*G0_0_0_7_9 + 0.00295133437990632*G0_0_0_8_0 + 0.0140193140193165*G0_0_0_8_1 + 0.0028672914387205*G0_0_0_8_2 + 0.0237562437562478*G0_0_0_8_3 - 0.0098101898101915*G0_0_0_8_4 + 0.00621093192521866*G0_0_0_8_5 + 0.0015013557870703*G0_0_0_8_6 - 0.00679320679320798*G0_0_0_8_7 + 0.0208991008991046*G0_0_0_8_8 + 0.0228971028971068*G0_0_0_8_9 + 0.000563246277532077*G0_0_0_9_0 - 0.00109224109224124*G0_0_0_9_1 + 0.00294562580276916*G0_0_0_9_2 + 0.0311688311688365*G0_0_0_9_3 - 0.0255002140716469*G0_0_0_9_4 - 0.0141116026830336*G0_0_0_9_5 - 0.0272127872127917*G0_0_0_9_6 - 0.00823747680890676*G0_0_0_9_7 + 0.0228971028971068*G0_0_0_9_8 - 0.0139745968317419*G0_0_0_9_9 - 0.00209991067133959*G0_1_0_0_0 - 0.00159864826531521*G0_1_0_0_1 + 0.00137862137862162*G0_1_0_0_3 - 0.00168593311450483*G0_1_0_0_4 - 0.00135388421102729*G0_1_0_0_5 + 0.000180771609343063*G0_1_0_0_6 + 0.00292945150088056*G0_1_0_0_7 - 0.00446220446220522*G0_1_0_0_8 - 0.00238237952523707*G0_1_0_0_9 - 0.00159864826531521*G0_1_0_1_0 + 0.0015986482653152*G0_1_0_1_2 + 0.0219336219336257*G0_1_0_1_3 - 0.00950160950161111*G0_1_0_1_4 + 0.00099234099234117*G0_1_0_1_5 - 0.000992340992341169*G0_1_0_1_6 + 0.0095016095016111*G0_1_0_1_7 - 0.0219336219336256*G0_1_0_1_8 + 0.0015986482653152*G0_1_0_2_1 + 0.00209991067133959*G0_1_0_2_2 + 0.00446220446220522*G0_1_0_2_3 - 0.00292945150088056*G0_1_0_2_4 - 0.000180771609343067*G0_1_0_2_5 + 0.00135388421102729*G0_1_0_2_6 + 0.00168593311450482*G0_1_0_2_7 - 0.0013786213786216*G0_1_0_2_8 + 0.00238237952523707*G0_1_0_2_9 + 0.00137862137862162*G0_1_0_3_0 + 0.0219336219336257*G0_1_0_3_1 + 0.00446220446220522*G0_1_0_3_2 + 0.0589410589410691*G0_1_0_3_3 - 0.0129270729270752*G0_1_0_3_4 - 0.00355644355644415*G0_1_0_3_5 + 0.00297702297702347*G0_1_0_3_6 - 0.00413586413586487*G0_1_0_3_7 + 0.00827172827172971*G0_1_0_3_9 - 0.00168593311450483*G0_1_0_4_0 - 0.00950160950161111*G0_1_0_4_1 - 0.00292945150088056*G0_1_0_4_2 - 0.0129270729270752*G0_1_0_4_3 - 0.021498501498505*G0_1_0_4_4 + 0.00505779934351447*G0_1_0_4_5 - 0.00803482232053794*G0_1_0_4_6 + 0.0041358641358648*G0_1_0_4_8 - 0.0172627372627402*G0_1_0_4_9 - 0.00135388421102729*G0_1_0_5_0 + 0.000992340992341169*G0_1_0_5_1 - 0.000180771609343067*G0_1_0_5_2 - 0.00355644355644415*G0_1_0_5_3 + 0.00505779934351447*G0_1_0_5_4 - 0.00145568716997312*G0_1_0_5_5 + 0.00803482232053795*G0_1_0_5_7 - 0.00297702297702346*G0_1_0_5_8 + 0.0131011845297582*G0_1_0_5_9 + 0.000180771609343063*G0_1_0_6_0 - 0.000992340992341169*G0_1_0_6_1 + 0.00135388421102729*G0_1_0_6_2 + 0.00297702297702347*G0_1_0_6_3 - 0.00803482232053794*G0_1_0_6_4 + 0.00145568716997313*G0_1_0_6_6 - 0.00505779934351446*G0_1_0_6_7 + 0.00355644355644414*G0_1_0_6_8 - 0.0131011845297582*G0_1_0_6_9 + 0.00292945150088056*G0_1_0_7_0 + 0.0095016095016111*G0_1_0_7_1 + 0.00168593311450482*G0_1_0_7_2 - 0.00413586413586487*G0_1_0_7_3 + 0.00803482232053795*G0_1_0_7_5 - 0.00505779934351446*G0_1_0_7_6 + 0.0214985014985051*G0_1_0_7_7 + 0.0129270729270751*G0_1_0_7_8 + 0.0172627372627402*G0_1_0_7_9 - 0.00446220446220522*G0_1_0_8_0 - 0.0219336219336256*G0_1_0_8_1 - 0.0013786213786216*G0_1_0_8_2 + 0.0041358641358648*G0_1_0_8_4 - 0.00297702297702346*G0_1_0_8_5 + 0.00355644355644414*G0_1_0_8_6 + 0.0129270729270751*G0_1_0_8_7 - 0.0589410589410688*G0_1_0_8_8 - 0.00827172827172966*G0_1_0_8_9 - 0.00238237952523707*G0_1_0_9_0 + 0.00238237952523707*G0_1_0_9_2 + 0.00827172827172971*G0_1_0_9_3 - 0.0172627372627402*G0_1_0_9_4 + 0.0131011845297582*G0_1_0_9_5 - 0.0131011845297582*G0_1_0_9_6 + 0.0172627372627402*G0_1_0_9_7 - 0.00827172827172966*G0_1_0_9_8; + A[16] = 0.00212020122734446*G0_0_0_0_0 + 0.00505480245063667*G0_0_0_0_1 + 0.000609996815354063*G0_0_0_0_2 + 0.00327664233914291*G0_0_0_0_3 - 0.00139091232841257*G0_0_0_0_4 + 0.000907706711278298*G0_0_0_0_5 - 0.000483709412280923*G0_0_0_0_6 - 0.00193059255559289*G0_0_0_0_7 + 0.0049455174455183*G0_0_0_0_8 + 0.00107184482184501*G0_0_0_0_9 + 0.00505480245063667*G0_0_0_1_0 + 0.106054978971664*G0_0_0_1_1 + 0.00505480245063664*G0_0_0_1_2 + 0.0477428821178903*G0_0_0_1_3 - 0.022224997225001*G0_0_0_1_4 - 0.00074988668738685*G0_0_0_1_5 - 0.000749886687386799*G0_0_0_1_6 - 0.0222249972250011*G0_0_0_1_7 + 0.0477428821178903*G0_0_0_1_8 + 0.00658577533577648*G0_0_0_1_9 + 0.000609996815354063*G0_0_0_2_0 + 0.00505480245063664*G0_0_0_2_1 + 0.00212020122734444*G0_0_0_2_2 + 0.00494551744551828*G0_0_0_2_3 - 0.00193059255559288*G0_0_0_2_4 - 0.000483709412280921*G0_0_0_2_5 + 0.000907706711278292*G0_0_0_2_6 - 0.00139091232841256*G0_0_0_2_7 + 0.00327664233914289*G0_0_0_2_8 + 0.00107184482184501*G0_0_0_2_9 + 0.00327664233914291*G0_0_0_3_0 + 0.0477428821178903*G0_0_0_3_1 + 0.00494551744551828*G0_0_0_3_2 + 0.0567786380286477*G0_0_0_3_3 - 0.0240733225108266*G0_0_0_3_4 - 0.00160776723276751*G0_0_0_3_5 - 0.00211507242757278*G0_0_0_3_6 - 0.0141946595071619*G0_0_0_3_7 + 0.0283893190143239*G0_0_0_3_8 + 0.0086319930069945*G0_0_0_3_9 - 0.00139091232841257*G0_0_0_4_0 - 0.022224997225001*G0_0_0_4_1 - 0.00193059255559288*G0_0_0_4_2 - 0.0240733225108266*G0_0_0_4_3 + 0.0128475690975713*G0_0_0_4_4 - 0.000191995504495532*G0_0_0_4_5 + 0.00230706793206832*G0_0_0_4_6 + 0.00635510323010431*G0_0_0_4_7 - 0.0141946595071619*G0_0_0_4_8 - 0.00283154345654395*G0_0_0_4_9 + 0.000907706711278298*G0_0_0_5_0 - 0.00074988668738685*G0_0_0_5_1 - 0.000483709412280921*G0_0_0_5_2 - 0.00160776723276751*G0_0_0_5_3 - 0.000191995504495532*G0_0_0_5_4 + 0.00947475143903874*G0_0_0_5_5 - 0.00193593608772213*G0_0_0_5_6 + 0.00230706793206833*G0_0_0_5_7 - 0.0021150724275728*G0_0_0_5_8 + 0.00101461038961056*G0_0_0_5_9 - 0.000483709412280923*G0_0_0_6_0 - 0.000749886687386799*G0_0_0_6_1 + 0.000907706711278292*G0_0_0_6_2 - 0.00211507242757278*G0_0_0_6_3 + 0.00230706793206832*G0_0_0_6_4 - 0.00193593608772213*G0_0_0_6_5 + 0.00947475143903874*G0_0_0_6_6 - 0.000191995504495541*G0_0_0_6_7 - 0.00160776723276749*G0_0_0_6_8 + 0.00101461038961055*G0_0_0_6_9 - 0.00193059255559289*G0_0_0_7_0 - 0.0222249972250011*G0_0_0_7_1 - 0.00139091232841256*G0_0_0_7_2 - 0.0141946595071619*G0_0_0_7_3 + 0.00635510323010431*G0_0_0_7_4 + 0.00230706793206833*G0_0_0_7_5 - 0.000191995504495541*G0_0_0_7_6 + 0.0128475690975713*G0_0_0_7_7 - 0.0240733225108266*G0_0_0_7_8 - 0.00283154345654395*G0_0_0_7_9 + 0.0049455174455183*G0_0_0_8_0 + 0.0477428821178903*G0_0_0_8_1 + 0.00327664233914289*G0_0_0_8_2 + 0.0283893190143239*G0_0_0_8_3 - 0.0141946595071619*G0_0_0_8_4 - 0.0021150724275728*G0_0_0_8_5 - 0.00160776723276749*G0_0_0_8_6 - 0.0240733225108266*G0_0_0_8_7 + 0.0567786380286477*G0_0_0_8_8 + 0.00863199300699449*G0_0_0_8_9 + 0.00107184482184501*G0_0_0_9_0 + 0.00658577533577648*G0_0_0_9_1 + 0.00107184482184501*G0_0_0_9_2 + 0.0086319930069945*G0_0_0_9_3 - 0.00283154345654395*G0_0_0_9_4 + 0.00101461038961056*G0_0_0_9_5 + 0.00101461038961055*G0_0_0_9_6 - 0.00283154345654395*G0_0_0_9_7 + 0.00863199300699449*G0_0_0_9_8 + 0.0118756243756264*G0_0_0_9_9; + A[70] = A[157] + 0.0158804158804187*G0_0_0_0_0 + 0.00169444312301486*G0_0_0_0_2 + 0.00068217496788935*G0_0_0_0_3 - 0.00178535749964351*G0_0_0_0_4 + 0.0198748870177476*G0_0_0_0_5 - 0.00750487607630595*G0_0_0_0_6 + 0.00382807668522024*G0_0_0_0_7 + 0.00098948670377254*G0_0_0_0_8 + 0.000587983445126403*G0_0_0_0_9 - 0.0158804158804182*G0_0_0_1_1 - 0.00169444312301482*G0_0_0_1_2 - 0.0198748870177475*G0_0_0_1_3 + 0.00750487607630592*G0_0_0_1_4 - 0.000682174967889364*G0_0_0_1_5 + 0.00178535749964353*G0_0_0_1_6 - 0.000989486703772578*G0_0_0_1_7 - 0.0038280766852202*G0_0_0_1_8 - 0.000587983445126422*G0_0_0_1_9 + 0.00169444312301486*G0_0_0_2_0 - 0.00169444312301482*G0_0_0_2_1 - 0.00197136197136239*G0_0_0_2_3 + 0.00154512154512195*G0_0_0_2_4 + 0.00197136197136224*G0_0_0_2_5 - 0.00154512154512167*G0_0_0_2_6 - 0.00580705009276534*G0_0_0_2_7 + 0.00580705009276533*G0_0_0_2_8 + 0.00068217496788935*G0_0_0_3_0 - 0.0198748870177475*G0_0_0_3_1 - 0.00197136197136239*G0_0_0_3_2 + 0.0132039389182262*G0_0_0_3_3 + 0.012548879691739*G0_0_0_3_4 - 0.00535607249893059*G0_0_0_3_6 - 0.00204652490366804*G0_0_0_3_7 + 0.019467675181964*G0_0_0_3_8 + 0.00585700014271534*G0_0_0_3_9 - 0.00178535749964351*G0_0_0_4_0 + 0.00750487607630592*G0_0_0_4_1 + 0.00154512154512195*G0_0_0_4_2 + 0.012548879691739*G0_0_0_4_3 + 0.0109690309690328*G0_0_0_4_4 + 0.00535607249893053*G0_0_0_4_5 + 0.0113886113886133*G0_0_0_4_7 - 0.017421150278296*G0_0_0_4_8 - 0.0107121449978611*G0_0_0_4_9 + 0.0198748870177476*G0_0_0_5_0 - 0.000682174967889364*G0_0_0_5_1 + 0.00197136197136224*G0_0_0_5_2 + 0.00535607249893053*G0_0_0_5_4 - 0.0132039389182267*G0_0_0_5_5 - 0.012548879691739*G0_0_0_5_6 - 0.0194676751819641*G0_0_0_5_7 + 0.00204652490366808*G0_0_0_5_8 - 0.00585700014271535*G0_0_0_5_9 - 0.00750487607630595*G0_0_0_6_0 + 0.00178535749964353*G0_0_0_6_1 - 0.00154512154512167*G0_0_0_6_2 - 0.00535607249893059*G0_0_0_6_3 - 0.012548879691739*G0_0_0_6_5 - 0.0109690309690326*G0_0_0_6_6 + 0.017421150278296*G0_0_0_6_7 - 0.0113886113886133*G0_0_0_6_8 + 0.0107121449978611*G0_0_0_6_9 + 0.00382807668522024*G0_0_0_7_0 - 0.000989486703772578*G0_0_0_7_1 - 0.00580705009276534*G0_0_0_7_2 - 0.00204652490366804*G0_0_0_7_3 + 0.0113886113886133*G0_0_0_7_4 - 0.0194676751819641*G0_0_0_7_5 + 0.017421150278296*G0_0_0_7_6 - 0.0695390323961866*G0_0_0_7_7 - 0.0366062508919712*G0_0_0_7_9 + 0.000989486703772541*G0_0_0_8_0 - 0.0038280766852202*G0_0_0_8_1 + 0.00580705009276533*G0_0_0_8_2 + 0.019467675181964*G0_0_0_8_3 - 0.017421150278296*G0_0_0_8_4 + 0.00204652490366808*G0_0_0_8_5 - 0.0113886113886133*G0_0_0_8_6 + 0.0695390323961864*G0_0_0_8_8 + 0.0366062508919713*G0_0_0_8_9 + 0.000587983445126403*G0_0_0_9_0 - 0.000587983445126422*G0_0_0_9_1 + 0.00585700014271534*G0_0_0_9_3 - 0.0107121449978611*G0_0_0_9_4 - 0.00585700014271535*G0_0_0_9_5 + 0.0107121449978611*G0_0_0_9_6 - 0.0366062508919712*G0_0_0_9_7 + 0.0366062508919713*G0_0_0_9_8 - 0.121013061013082*G0_0_1_0_0 - 0.00216648430934184*G0_0_1_0_1 - 0.00136242064813516*G0_0_1_0_2 - 0.000146282289139432*G0_0_1_0_3 + 0.00071000428143298*G0_0_1_0_4 - 0.00537319823034201*G0_0_1_0_5 + 0.00666619095190638*G0_0_1_0_6 - 0.00682127396413238*G0_0_1_0_7 + 0.00706198563341546*G0_0_1_0_8 + 0.0070044241472824*G0_0_1_0_9 - 0.00216648430934184*G0_0_1_1_0 - 0.0192962592962622*G0_0_1_1_1 - 0.00187968116539575*G0_0_1_1_2 - 0.0248047190904375*G0_0_1_1_3 + 0.00896650968079688*G0_0_1_1_4 + 0.00159626088197542*G0_0_1_1_5 + 0.00187455401741148*G0_0_1_1_6 + 0.0071559392987976*G0_0_1_1_7 - 0.00977070548499278*G0_0_1_1_8 - 0.00890966176680614*G0_0_1_1_9 - 0.00136242064813516*G0_0_1_2_0 - 0.00187968116539575*G0_0_1_2_1 + 0.00359640359640436*G0_0_1_2_2 - 0.00428880643166434*G0_0_1_2_3 + 0.000849626563912495*G0_0_1_2_4 + 0.00397055325626822*G0_0_1_2_5 - 0.000260215974501726*G0_0_1_2_6 + 0.00217853574996467*G0_0_1_2_7 + 0.00494005994006075*G0_0_1_2_8 + 0.00081775367489666*G0_0_1_2_9 - 0.000146282289139432*G0_0_1_3_0 - 0.0248047190904375*G0_0_1_3_1 - 0.00428880643166434*G0_0_1_3_2 + 0.0180333951762548*G0_0_1_3_3 + 0.0215976880262631*G0_0_1_3_4 - 0.00244683887541063*G0_0_1_3_5 - 0.00507992007992093*G0_0_1_3_6 + 0.000982588839731899*G0_0_1_3_7 + 0.0132938490081368*G0_0_1_3_8 + 0.0247638076209545*G0_0_1_3_9 + 0.00071000428143298*G0_0_1_4_0 + 0.00896650968079688*G0_0_1_4_1 + 0.000849626563912495*G0_0_1_4_2 + 0.0215976880262631*G0_0_1_4_3 + 0.0322135007849349*G0_0_1_4_4 - 0.00158627087198544*G0_0_1_4_5 + 0.00666619095190636*G0_0_1_4_6 - 0.00460468103325323*G0_0_1_4_7 - 0.0142764378478687*G0_0_1_4_8 + 0.000719280719280897*G0_0_1_4_9 - 0.00537319823034201*G0_0_1_5_0 + 0.00159626088197542*G0_0_1_5_1 + 0.00397055325626822*G0_0_1_5_2 - 0.00244683887541063*G0_0_1_5_3 - 0.00158627087198544*G0_0_1_5_4 + 0.19208648494366*G0_0_1_5_5 - 0.028122591694025*G0_0_1_5_6 + 0.0102369059511932*G0_0_1_5_7 - 0.00424504067361277*G0_0_1_5_8 - 0.0125231910946218*G0_0_1_5_9 + 0.00666619095190638*G0_0_1_6_0 + 0.00187455401741148*G0_0_1_6_1 - 0.000260215974501726*G0_0_1_6_2 - 0.00507992007992093*G0_0_1_6_3 + 0.00666619095190636*G0_0_1_6_4 - 0.028122591694025*G0_0_1_6_5 + 0.00660196945911325*G0_0_1_6_6 - 0.0059918652775805*G0_0_1_6_7 - 0.0104937919223651*G0_0_1_6_8 + 0.00770657913515186*G0_0_1_6_9 - 0.00682127396413238*G0_0_1_7_0 + 0.0071559392987976*G0_0_1_7_1 + 0.00217853574996467*G0_0_1_7_2 + 0.0009825888397319*G0_0_1_7_3 - 0.00460468103325323*G0_0_1_7_4 + 0.0102369059511932*G0_0_1_7_5 - 0.0059918652775805*G0_0_1_7_6 + 0.203663479377799*G0_0_1_7_7 - 0.027899957185676*G0_0_1_7_8 - 0.00902954188668625*G0_0_1_7_9 + 0.00706198563341546*G0_0_1_8_0 - 0.00977070548499278*G0_0_1_8_1 + 0.00494005994006075*G0_0_1_8_2 + 0.0132938490081368*G0_0_1_8_3 - 0.0142764378478687*G0_0_1_8_4 - 0.00424504067361277*G0_0_1_8_5 - 0.0104937919223651*G0_0_1_8_6 - 0.027899957185676*G0_0_1_8_7 + 0.0713029827315654*G0_0_1_8_8 + 0.0552818609961559*G0_0_1_8_9 + 0.0070044241472824*G0_0_1_9_0 - 0.00890966176680614*G0_0_1_9_1 + 0.000817753674896661*G0_0_1_9_2 + 0.0247638076209545*G0_0_1_9_3 + 0.000719280719280895*G0_0_1_9_4 - 0.0125231910946218*G0_0_1_9_5 + 0.00770657913515185*G0_0_1_9_6 - 0.00902954188668625*G0_0_1_9_7 + 0.0552818609961559*G0_0_1_9_8 - 0.0502468959611903*G0_0_1_9_9 - 0.00341584341584407*G0_1_0_0_0 - 0.00216648430934186*G0_1_0_0_1 - 0.000185238042380928*G0_1_0_0_2 + 0.00227843584986482*G0_1_0_0_3 - 0.00492983207269004*G0_1_0_0_5 + 0.00146163360449099*G0_1_0_0_6 - 0.00594262879977266*G0_1_0_0_7 + 0.00814542600257024*G0_1_0_0_8 - 0.00832167832167972*G0_1_0_0_9 - 0.00216648430934186*G0_1_0_1_0 - 0.1368934768935*G0_1_0_1_1 - 0.00305686377115001*G0_1_0_1_2 - 0.0252480852480897*G0_1_0_1_3 + 0.0141710670282123*G0_1_0_1_4 - 0.000828457257028771*G0_1_0_1_5 + 0.0024953617810765*G0_1_0_1_6 + 0.00607249892964293*G0_1_0_1_7 - 0.0106493506493527*G0_1_0_1_8 + 0.00641644070215604*G0_1_0_1_9 - 0.000185238042380928*G0_1_0_2_0 - 0.00305686377115001*G0_1_0_2_1 + 0.00359640359640423*G0_1_0_2_2 + 0.0019991912849059*G0_1_0_2_3 + 0.00128490557062008*G0_1_0_2_4 - 0.002317444460302*G0_1_0_2_5 - 0.000695494981209386*G0_1_0_2_6 - 0.000866990152704573*G0_1_0_2_7 + 0.00798558584273002*G0_1_0_2_8 + 0.000817753674896664*G0_1_0_2_9 + 0.00227843584986482*G0_1_0_3_0 - 0.0252480852480897*G0_1_0_3_1 + 0.0019991912849059*G0_1_0_3_2 + 0.205290423861887*G0_1_0_3_3 - 0.015573712002286*G0_1_0_3_4 - 0.00244683887541067*G0_1_0_3_5 - 0.00694234337091602*G0_1_0_3_6 - 0.00629156557728089*G0_1_0_3_7 + 0.0297045811331574*G0_1_0_3_8 - 0.00666619095190632*G0_1_0_3_9 + 0.0141710670282123*G0_1_0_4_1 + 0.00128490557062008*G0_1_0_4_2 - 0.015573712002286*G0_1_0_4_3 + 0.0175710004281462*G0_1_0_4_4 + 0.000276152419009603*G0_1_0_4_5 + 0.00666619095190642*G0_1_0_4_6 + 0.000894819466248162*G0_1_0_4_7 - 0.0234130155558766*G0_1_0_4_8 - 0.00300556586270922*G0_1_0_4_9 - 0.00492983207269004*G0_1_0_5_0 - 0.000828457257028771*G0_1_0_5_1 - 0.002317444460302*G0_1_0_5_2 - 0.00244683887541068*G0_1_0_5_3 + 0.000276152419009603*G0_1_0_5_4 + 0.00482945625802884*G0_1_0_5_5 + 0.00904880833452416*G0_1_0_5_6 - 0.00617382617382718*G0_1_0_5_7 + 0.00302911374339993*G0_1_0_5_8 + 0.0189068074782393*G0_1_0_5_9 + 0.00146163360449099*G0_1_0_6_0 + 0.0024953617810765*G0_1_0_6_1 - 0.000695494981209386*G0_1_0_6_2 - 0.00694234337091602*G0_1_0_6_3 + 0.00666619095190642*G0_1_0_6_4 + 0.00904880833452416*G0_1_0_6_5 + 0.0212444698159025*G0_1_0_6_6 + 0.00314471243042722*G0_1_0_6_7 - 0.0159932924218665*G0_1_0_6_8 + 0.0114314257171421*G0_1_0_6_9 - 0.00594262879977266*G0_1_0_7_0 + 0.00607249892964294*G0_1_0_7_1 - 0.000866990152704573*G0_1_0_7_2 - 0.00629156557728089*G0_1_0_7_3 + 0.000894819466248161*G0_1_0_7_4 - 0.00617382617382718*G0_1_0_7_5 + 0.00314471243042722*G0_1_0_7_6 + 0.00176395033537945*G0_1_0_7_7 - 0.0278999571856761*G0_1_0_7_8 + 0.0186756101041847*G0_1_0_7_9 + 0.00814542600257024*G0_1_0_8_0 - 0.0106493506493527*G0_1_0_8_1 + 0.00798558584273002*G0_1_0_8_2 + 0.0297045811331574*G0_1_0_8_3 - 0.0234130155558766*G0_1_0_8_4 + 0.00302911374339993*G0_1_0_8_5 - 0.0159932924218665*G0_1_0_8_6 - 0.0278999571856761*G0_1_0_8_7 + 0.273202511773986*G0_1_0_8_8 + 0.0275767090052851*G0_1_0_8_9 - 0.00832167832167972*G0_1_0_9_0 + 0.00641644070215604*G0_1_0_9_1 + 0.000817753674896664*G0_1_0_9_2 - 0.00666619095190632*G0_1_0_9_3 - 0.00300556586270923*G0_1_0_9_4 + 0.0189068074782393*G0_1_0_9_5 + 0.0114314257171421*G0_1_0_9_6 + 0.0186756101041847*G0_1_0_9_7 + 0.0275767090052851*G0_1_0_9_8 - 0.0502468959611901*G0_1_0_9_9 + 0.0194768194768226*G0_1_1_0_0 - 0.00216648430934187*G0_1_1_0_1 + 0.000618825618825713*G0_1_1_0_2 + 0.00534394177251411*G0_1_1_0_3 + 0.00067147138575723*G0_1_1_0_4 + 0.004580657437801*G0_1_1_0_5 - 0.0017237524380384*G0_1_1_0_6 + 0.0197117168545772*G0_1_1_0_7 - 0.00510989010989093*G0_1_1_0_8 + 0.00140573712002308*G0_1_1_0_9 - 0.00216648430934187*G0_1_1_1_0 - 0.159786139786167*G0_1_1_1_1 - 0.00386092743235666*G0_1_1_1_2 - 0.0347585747585807*G0_1_1_1_3 + 0.0173564530707417*G0_1_1_1_4 - 0.00389396317967808*G0_1_1_1_5 + 0.00191308691308723*G0_1_1_1_6 + 0.0193278150421041*G0_1_1_1_7 - 0.0363036963037027*G0_1_1_1_8 - 0.00331097473954675*G0_1_1_1_9 + 0.000618825618825713*G0_1_1_2_0 - 0.00386092743235666*G0_1_1_2_1 + 0.00359640359640421*G0_1_1_2_2 + 0.00239498596641492*G0_1_1_2_3 - 0.000163170163170196*G0_1_1_2_4 - 0.00271323914181104*G0_1_1_2_5 + 0.000752580752580895*G0_1_1_2_6 + 0.00712929927215759*G0_1_1_2_8 + 0.000817753674896643*G0_1_1_2_9 + 0.00534394177251411*G0_1_1_3_0 - 0.0347585747585807*G0_1_1_3_1 + 0.00239498596641492*G0_1_1_3_2 + 0.26999143713434*G0_1_1_3_3 - 0.0153510774939371*G0_1_1_3_4 - 0.00244683887541064*G0_1_1_3_5 - 0.00519551876694823*G0_1_1_3_6 - 0.0154880833452288*G0_1_1_3_7 + 0.036332239189388*G0_1_1_3_8 + 0.0409090909090978*G0_1_1_3_9 + 0.000671471385757231*G0_1_1_4_0 + 0.0173564530707417*G0_1_1_4_1 - 0.000163170163170195*G0_1_1_4_2 - 0.0153510774939371*G0_1_1_4_3 + 0.0291479948622855*G0_1_1_4_4 - 0.00147067218495816*G0_1_1_4_5 + 0.00666619095190639*G0_1_1_4_6 - 0.00126302269159435*G0_1_1_4_7 - 0.0208441558441592*G0_1_1_4_8 + 0.000488083345226375*G0_1_1_4_9 + 0.004580657437801*G0_1_1_5_0 - 0.00389396317967808*G0_1_1_5_1 - 0.00271323914181104*G0_1_1_5_2 - 0.00244683887541064*G0_1_1_5_3 - 0.00147067218495816*G0_1_1_5_4 - 0.0598715570144245*G0_1_1_5_5 + 0.0088261738261753*G0_1_1_5_6 - 0.0128014842300579*G0_1_1_5_7 + 0.0122256315113479*G0_1_1_5_8 - 0.028668474382765*G0_1_1_5_9 - 0.0017237524380384*G0_1_1_6_0 + 0.00191308691308723*G0_1_1_6_1 + 0.000752580752580895*G0_1_1_6_2 - 0.00519551876694823*G0_1_1_6_3 + 0.00666619095190639*G0_1_1_6_4 + 0.0088261738261753*G0_1_1_6_5 + 0.009667475381763*G0_1_1_6_6 + 0.000575852718710002*G0_1_1_6_7 - 0.013835450264024*G0_1_1_6_8 + 0.00793777650920652*G0_1_1_6_9 + 0.0197117168545772*G0_1_1_7_0 + 0.0193278150421041*G0_1_1_7_1 - 0.0154880833452288*G0_1_1_7_3 - 0.00126302269159435*G0_1_1_7_4 - 0.0128014842300579*G0_1_1_7_5 + 0.000575852718710001*G0_1_1_7_6 + 0.0159440559440582*G0_1_1_7_7 - 0.027899957185676*G0_1_1_7_8 - 0.00536891679748918*G0_1_1_7_9 - 0.00510989010989093*G0_1_1_8_0 - 0.0363036963037027*G0_1_1_8_1 + 0.00712929927215759*G0_1_1_8_2 + 0.036332239189388*G0_1_1_8_3 - 0.0208441558441592*G0_1_1_8_4 + 0.0122256315113479*G0_1_1_8_5 - 0.013835450264024*G0_1_1_8_6 - 0.027899957185676*G0_1_1_8_7 + 0.259022406165307*G0_1_1_8_8 + 0.0516212359069588*G0_1_1_8_9 + 0.00140573712002308*G0_1_1_9_0 - 0.00331097473954675*G0_1_1_9_1 + 0.000817753674896644*G0_1_1_9_2 + 0.0409090909090978*G0_1_1_9_3 + 0.000488083345226374*G0_1_1_9_4 - 0.028668474382765*G0_1_1_9_5 + 0.00793777650920652*G0_1_1_9_6 - 0.00536891679748918*G0_1_1_9_7 + 0.0516212359069588*G0_1_1_9_8 - 0.0502468959611904*G0_1_1_9_9; + A[122] = -0.00113558399272705*G0_0_1_0_0 - 0.000944003086860395*G0_0_1_0_1 - 0.0117478200811554*G0_0_1_0_2 + 0.00417748917748989*G0_0_1_0_3 - 0.00868964368964519*G0_0_1_0_4 + 0.00592851592851694*G0_0_1_0_5 - 0.0135714285714309*G0_0_1_0_6 + 0.000520749092177751*G0_0_1_0_7 + 0.000326736755308238*G0_0_1_0_8 - 0.00253857253857297*G0_0_1_0_9 - 0.000944003086860395*G0_0_1_1_0 - 0.00113558399272705*G0_0_1_1_1 - 0.0117478200811554*G0_0_1_1_2 + 0.00592851592851693*G0_0_1_1_3 - 0.0135714285714309*G0_0_1_1_4 + 0.00417748917748989*G0_0_1_1_5 - 0.00868964368964518*G0_0_1_1_6 + 0.000326736755308241*G0_0_1_1_7 + 0.000520749092177744*G0_0_1_1_8 - 0.00253857253857297*G0_0_1_1_9 - 0.0117478200811554*G0_0_1_2_0 - 0.0117478200811554*G0_0_1_2_1 - 0.2284591951259*G0_0_1_2_2 + 0.0524753024753112*G0_0_1_2_3 - 0.113297813297832*G0_0_1_2_4 + 0.0524753024753113*G0_0_1_2_5 - 0.113297813297832*G0_0_1_2_6 + 0.00252247752247793*G0_0_1_2_7 + 0.00252247752247792*G0_0_1_2_8 - 0.0166944166944195*G0_0_1_2_9 + 0.00417748917748989*G0_0_1_3_0 + 0.00592851592851693*G0_0_1_3_1 + 0.0524753024753112*G0_0_1_3_2 - 0.0270496170496216*G0_0_1_3_3 + 0.0619963369963474*G0_0_1_3_4 - 0.017975357975361*G0_0_1_3_5 + 0.0369547119547181*G0_0_1_3_6 - 0.00164668664668692*G0_0_1_3_7 - 0.00167166167166195*G0_0_1_3_8 + 0.0109090909090927*G0_0_1_3_9 - 0.00868964368964519*G0_0_1_4_0 - 0.0135714285714309*G0_0_1_4_1 - 0.113297813297832*G0_0_1_4_2 + 0.0619963369963474*G0_0_1_4_3 - 0.147818847818873*G0_0_1_4_4 + 0.0369547119547182*G0_0_1_4_5 - 0.0739094239094363*G0_0_1_4_6 + 0.00380785880785944*G0_0_1_4_7 + 0.00331834831834887*G0_0_1_4_8 - 0.0238261738261778*G0_0_1_4_9 + 0.00592851592851694*G0_0_1_5_0 + 0.00417748917748989*G0_0_1_5_1 + 0.0524753024753113*G0_0_1_5_2 - 0.017975357975361*G0_0_1_5_3 + 0.0369547119547182*G0_0_1_5_4 - 0.0270496170496216*G0_0_1_5_5 + 0.0619963369963474*G0_0_1_5_6 - 0.00167166167166195*G0_0_1_5_7 - 0.00164668664668691*G0_0_1_5_8 + 0.0109090909090927*G0_0_1_5_9 - 0.0135714285714309*G0_0_1_6_0 - 0.00868964368964517*G0_0_1_6_1 - 0.113297813297832*G0_0_1_6_2 + 0.0369547119547181*G0_0_1_6_3 - 0.0739094239094363*G0_0_1_6_4 + 0.0619963369963474*G0_0_1_6_5 - 0.147818847818873*G0_0_1_6_6 + 0.00331834831834886*G0_0_1_6_7 + 0.00380785880785943*G0_0_1_6_8 - 0.0238261738261778*G0_0_1_6_9 + 0.000520749092177751*G0_0_1_7_0 + 0.000326736755308241*G0_0_1_7_1 + 0.00252247752247793*G0_0_1_7_2 - 0.00164668664668692*G0_0_1_7_3 + 0.00380785880785944*G0_0_1_7_4 - 0.00167166167166195*G0_0_1_7_5 + 0.00331834831834886*G0_0_1_7_6 + 0.000705484991199376*G0_0_1_7_7 - 0.000204319490033806*G0_0_1_7_8 + 0.000979020979021139*G0_0_1_7_9 + 0.000326736755308238*G0_0_1_8_0 + 0.000520749092177744*G0_0_1_8_1 + 0.00252247752247792*G0_0_1_8_2 - 0.00167166167166195*G0_0_1_8_3 + 0.00331834831834887*G0_0_1_8_4 - 0.00164668664668691*G0_0_1_8_5 + 0.00380785880785943*G0_0_1_8_6 - 0.000204319490033806*G0_0_1_8_7 + 0.00070548499119936*G0_0_1_8_8 + 0.000979020979021137*G0_0_1_8_9 - 0.00253857253857297*G0_0_1_9_0 - 0.00253857253857297*G0_0_1_9_1 - 0.0166944166944195*G0_0_1_9_2 + 0.0109090909090927*G0_0_1_9_3 - 0.0238261738261778*G0_0_1_9_4 + 0.0109090909090927*G0_0_1_9_5 - 0.0238261738261778*G0_0_1_9_6 + 0.000979020979021139*G0_0_1_9_7 + 0.000979020979021137*G0_0_1_9_8 - 0.00803196803196937*G0_0_1_9_9 - 0.00852893138607569*G0_1_1_0_0 - 0.00113768066149038*G0_1_1_0_1 - 0.00744194077527538*G0_1_1_0_2 + 0.00204657776086383*G0_1_1_0_3 - 0.00497687497687584*G0_1_1_0_4 + 0.000402296116581904*G0_1_1_0_5 - 0.00337384837384895*G0_1_1_0_6 - 0.00570572284858095*G0_1_1_0_7 + 0.00280632066346399*G0_1_1_0_8 - 0.00116090258947422*G0_1_1_0_9 - 0.00113768066149038*G0_1_1_1_0 - 0.00151227960751799*G0_1_1_1_1 - 0.00887384220717705*G0_1_1_1_2 + 0.00434665863237365*G0_1_1_1_3 - 0.00985865985866154*G0_1_1_1_4 + 0.00112543541114989*G0_1_1_1_5 - 0.00420431420431492*G0_1_1_1_6 - 0.000719016433302262*G0_1_1_1_7 + 0.000684500684500779*G0_1_1_1_8 - 0.00225901083043979*G0_1_1_1_9 - 0.00744194077527538*G0_1_1_2_0 - 0.00887384220717705*G0_1_1_2_1 - 0.18557615224285*G0_1_1_2_2 + 0.0399332149332216*G0_1_1_2_3 - 0.088213638213653*G0_1_1_2_4 + 0.0310569060569112*G0_1_1_2_5 - 0.0631294631294737*G0_1_1_2_6 + 0.000419950419950483*G0_1_1_2_7 + 0.00108040108040125*G0_1_1_2_8 - 0.00936285936286091*G0_1_1_2_9 + 0.00204657776086383*G0_1_1_3_0 + 0.00434665863237365*G0_1_1_3_1 + 0.0399332149332216*G0_1_1_3_2 - 0.021438561438565*G0_1_1_3_3 + 0.0463636363636442*G0_1_1_3_4 - 0.00795371295371428*G0_1_1_3_5 + 0.0190043290043322*G0_1_1_3_6 + 0.00025165310879602*G0_1_1_3_7 - 0.00340183625897969*G0_1_1_3_8 + 0.00627372627372733*G0_1_1_3_9 - 0.00497687497687584*G0_1_1_4_0 - 0.00985865985866154*G0_1_1_4_1 - 0.088213638213653*G0_1_1_4_2 + 0.0463636363636442*G0_1_1_4_3 - 0.114235764235784*G0_1_1_4_4 + 0.0213220113220149*G0_1_1_4_5 - 0.0403263403263471*G0_1_1_4_6 + 0.00363969363969424*G0_1_1_4_7 + 0.00315018315018368*G0_1_1_4_8 - 0.014555444555447*G0_1_1_4_9 + 0.000402296116581904*G0_1_1_5_0 + 0.00112543541114989*G0_1_1_5_1 + 0.0310569060569112*G0_1_1_5_2 - 0.00795371295371428*G0_1_1_5_3 + 0.0213220113220149*G0_1_1_5_4 - 0.0236729936729976*G0_1_1_5_5 + 0.0220512820512857*G0_1_1_5_6 - 0.00814661528947378*G0_1_1_5_7 + 0.00301508015793781*G0_1_1_5_8 - 0.00254745254745297*G0_1_1_5_9 - 0.00337384837384895*G0_1_1_6_0 - 0.00420431420431492*G0_1_1_6_1 - 0.0631294631294737*G0_1_1_6_2 + 0.0190043290043322*G0_1_1_6_3 - 0.0403263403263471*G0_1_1_6_4 + 0.0220512820512857*G0_1_1_6_5 - 0.0470695970696049*G0_1_1_6_6 + 0.00513153513153598*G0_1_1_6_7 + 0.00149017649017674*G0_1_1_6_8 - 0.00992007992008161*G0_1_1_6_9 - 0.00570572284858095*G0_1_1_7_0 - 0.000719016433302262*G0_1_1_7_1 + 0.000419950419950483*G0_1_1_7_2 + 0.00025165310879602*G0_1_1_7_3 + 0.00363969363969424*G0_1_1_7_4 - 0.00814661528947378*G0_1_1_7_5 + 0.00513153513153598*G0_1_1_7_6 - 0.0346562960848734*G0_1_1_7_7 + 0.00541077969649491*G0_1_1_7_8 - 0.00678036249464935*G0_1_1_7_9 + 0.00280632066346399*G0_1_1_8_0 + 0.000684500684500779*G0_1_1_8_1 + 0.00108040108040125*G0_1_1_8_2 - 0.00340183625897969*G0_1_1_8_3 + 0.00315018315018368*G0_1_1_8_4 + 0.00301508015793781*G0_1_1_8_5 + 0.00149017649017674*G0_1_1_8_6 + 0.00541077969649491*G0_1_1_8_7 - 0.015982113124973*G0_1_1_8_8 + 0.000476666190951991*G0_1_1_8_9 - 0.00116090258947422*G0_1_1_9_0 - 0.00225901083043979*G0_1_1_9_1 - 0.00936285936286091*G0_1_1_9_2 + 0.00627372627372733*G0_1_1_9_3 - 0.014555444555447*G0_1_1_9_4 - 0.00254745254745297*G0_1_1_9_5 - 0.00992007992008161*G0_1_1_9_6 - 0.00678036249464935*G0_1_1_9_7 + 0.000476666190951992*G0_1_1_9_8 - 0.0340459540459598*G0_1_1_9_9; + A[138] = A[181] + 0.0145464412131104*G0_0_0_0_0 - 0.00148458243696366*G0_0_0_0_1 + 0.00175480604052063*G0_0_0_0_2 - 0.00417561274704208*G0_0_0_0_3 + 0.000163698735127345*G0_0_0_0_4 + 0.0195610209895958*G0_0_0_0_5 - 0.00959506102363409*G0_0_0_0_6 + 0.00270782127925034*G0_0_0_0_7 + 0.00073281216138368*G0_0_0_0_8 + 0.00164724164724193*G0_0_0_0_9 - 0.00148458243696366*G0_0_0_1_0 - 0.0455692455692534*G0_0_0_1_1 - 0.00526128192794949*G0_0_0_1_2 - 0.0641073741073851*G0_0_0_1_3 + 0.0255824598681785*G0_0_0_1_4 + 0.00453377310520244*G0_0_0_1_5 + 0.000501456215742021*G0_0_0_1_6 + 0.00874004302575885*G0_0_0_1_7 - 0.0125959225959248*G0_0_0_1_8 - 0.00279403136546047*G0_0_0_1_9 + 0.00175480604052063*G0_0_0_2_0 - 0.00526128192794949*G0_0_0_2_1 - 0.000509120509120531*G0_0_0_2_2 - 0.0103680446537607*G0_0_0_2_3 + 0.00345432345432406*G0_0_0_2_4 + 0.00424844996273639*G0_0_0_2_5 - 0.00409368409368474*G0_0_0_2_6 + 0.00121566264423429*G0_0_0_2_7 + 0.000504944790659135*G0_0_0_2_8 + 0.00153751010893893*G0_0_0_2_9 - 0.00417561274704208*G0_0_0_3_0 - 0.0641073741073851*G0_0_0_3_1 - 0.0103680446537607*G0_0_0_3_2 - 0.26910232624523*G0_0_0_3_3 + 0.05115884115885*G0_0_0_3_4 - 0.000439560439560495*G0_0_0_3_5 - 0.00169972884258625*G0_0_0_3_6 + 0.012331478045766*G0_0_0_3_7 - 0.0106212834784284*G0_0_0_3_8 - 0.0162808619951507*G0_0_0_3_9 + 0.000163698735127345*G0_0_0_4_0 + 0.0255824598681785*G0_0_0_4_1 + 0.00345432345432406*G0_0_0_4_2 + 0.05115884115885*G0_0_0_4_3 - 0.0191494220065681*G0_0_0_4_4 - 0.000686456400742236*G0_0_0_4_5 + 0.00238618524332848*G0_0_0_4_6 - 0.00197136197136235*G0_0_0_4_7 - 0.00171019456733761*G0_0_0_4_8 - 0.00323961752533234*G0_0_0_4_9 + 0.0195610209895958*G0_0_0_5_0 + 0.00453377310520244*G0_0_0_5_1 + 0.00424844996273639*G0_0_0_5_2 - 0.000439560439560495*G0_0_0_5_3 - 0.000686456400742236*G0_0_0_5_4 + 0.139437705152014*G0_0_0_5_5 - 0.0149093763379503*G0_0_0_5_6 + 0.0176390276390306*G0_0_0_5_7 - 0.0137966795109675*G0_0_0_5_8 + 0.0226516340802093*G0_0_0_5_9 - 0.00959506102363409*G0_0_0_6_0 + 0.000501456215742022*G0_0_0_6_1 - 0.00409368409368474*G0_0_0_6_2 - 0.00169972884258625*G0_0_0_6_3 + 0.00238618524332848*G0_0_0_6_4 - 0.0149093763379503*G0_0_0_6_5 + 0.0224489795918406*G0_0_0_6_6 - 0.00384234812806306*G0_0_0_6_7 - 0.00141192141192163*G0_0_0_6_8 - 0.0012130726416443*G0_0_0_6_9 + 0.00270782127925034*G0_0_0_7_0 + 0.00874004302575885*G0_0_0_7_1 + 0.00121566264423429*G0_0_0_7_2 + 0.012331478045766*G0_0_0_7_3 - 0.00197136197136235*G0_0_0_7_4 + 0.0176390276390306*G0_0_0_7_5 - 0.00384234812806306*G0_0_0_7_6 + 0.0117777460634623*G0_0_0_7_7 - 0.0163626849341162*G0_0_0_7_8 + 0.00274297131440039*G0_0_0_7_9 + 0.00073281216138368*G0_0_0_8_0 - 0.0125959225959248*G0_0_0_8_1 + 0.000504944790659135*G0_0_0_8_2 - 0.0106212834784284*G0_0_0_8_3 - 0.00171019456733761*G0_0_0_8_4 - 0.0137966795109675*G0_0_0_8_5 - 0.00141192141192163*G0_0_0_8_6 - 0.0163626849341162*G0_0_0_8_7 + 0.0368783597355086*G0_0_0_8_8 + 0.0118024832310566*G0_0_0_8_9 + 0.00164724164724193*G0_0_0_9_0 - 0.00279403136546047*G0_0_0_9_1 + 0.00153751010893893*G0_0_0_9_2 - 0.0162808619951507*G0_0_0_9_3 - 0.00323961752533234*G0_0_0_9_4 + 0.0226516340802093*G0_0_0_9_5 - 0.0012130726416443*G0_0_0_9_6 + 0.00274297131440039*G0_0_0_9_7 + 0.0118024832310566*G0_0_0_9_8 + 0.0685714285714399*G0_0_0_9_9 + 0.00447947114613872*G0_0_1_0_0 - 0.00263003310622405*G0_0_1_0_1 + 0.000233276423752658*G0_0_1_0_2 - 0.00277986563700901*G0_0_1_0_3 + 0.00047021761307485*G0_0_1_0_4 + 0.00277944277944332*G0_0_1_0_5 - 0.00137132708561306*G0_0_1_0_6 + 0.00135864135864165*G0_0_1_0_7 + 0.00264243692815162*G0_0_1_0_8 + 0.00164153307010477*G0_0_1_0_9 - 0.00263003310622405*G0_0_1_1_0 - 0.11911051911054*G0_0_1_1_1 - 0.00690216309264045*G0_0_1_1_2 - 0.07687719687721*G0_0_1_1_3 + 0.0322936322936378*G0_0_1_1_4 + 0.00106137248994413*G0_0_1_1_5 + 0.000557749129177789*G0_0_1_1_6 + 0.0123550523550545*G0_0_1_1_7 - 0.0193820993821028*G0_0_1_1_8 - 0.00504384504384595*G0_0_1_1_9 + 0.000233276423752658*G0_0_1_2_0 - 0.00690216309264045*G0_0_1_2_1 - 0.000546331974903493*G0_0_1_2_2 - 0.00919250062107362*G0_0_1_2_3 + 0.00284498570212905*G0_0_1_2_4 + 0.00044696044696053*G0_0_1_2_5 - 0.000353508924937556*G0_0_1_2_6 + 0.000528571957143493*G0_0_1_2_7 + 0.00184408184408213*G0_0_1_2_8 + 0.00170749885035628*G0_0_1_2_9 - 0.00277986563700901*G0_0_1_3_0 - 0.07687719687721*G0_0_1_3_1 - 0.00919250062107362*G0_0_1_3_2 - 0.159920079920107*G0_0_1_3_3 + 0.0460568003425225*G0_0_1_3_4 + 0.00215403643975109*G0_0_1_3_5 - 0.000825840825840951*G0_0_1_3_6 + 0.00918700347271942*G0_0_1_3_7 - 0.00450216450216546*G0_0_1_3_8 - 0.00324247181390109*G0_0_1_3_9 + 0.00047021761307485*G0_0_1_4_0 + 0.0322936322936378*G0_0_1_4_1 + 0.00284498570212905*G0_0_1_4_2 + 0.0460568003425225*G0_0_1_4_3 - 0.0141686884544051*G0_0_1_4_4 - 0.000563246277532099*G0_0_1_4_5 + 0.00138908710337305*G0_0_1_4_6 - 0.00192188763617373*G0_0_1_4_7 - 0.00468483897055396*G0_0_1_4_8 - 0.00399600399600462*G0_0_1_4_9 + 0.00277944277944332*G0_0_1_5_0 + 0.00106137248994413*G0_0_1_5_1 + 0.00044696044696053*G0_0_1_5_2 + 0.00215403643975109*G0_0_1_5_3 - 0.000563246277532098*G0_0_1_5_4 + 0.00531658817373202*G0_0_1_5_5 - 0.00244707673279146*G0_0_1_5_6 + 0.00307502021787792*G0_0_1_5_7 - 0.00233671090813989*G0_0_1_5_8 - 0.000251177394034532*G0_0_1_5_9 - 0.00137132708561306*G0_0_1_6_0 + 0.000557749129177789*G0_0_1_6_1 - 0.000353508924937556*G0_0_1_6_2 - 0.000825840825840951*G0_0_1_6_3 + 0.00138908710337305*G0_0_1_6_4 - 0.00244707673279146*G0_0_1_6_5 + 0.00205128205128243*G0_0_1_6_6 - 0.00073830930973804*G0_0_1_6_7 - 0.0040264497407361*G0_0_1_6_8 - 0.00347081489938693*G0_0_1_6_9 + 0.00135864135864165*G0_0_1_7_0 + 0.0123550523550545*G0_0_1_7_1 + 0.000528571957143493*G0_0_1_7_2 + 0.00918700347271942*G0_0_1_7_3 - 0.00192188763617373*G0_0_1_7_4 + 0.00307502021787792*G0_0_1_7_5 - 0.00073830930973804*G0_0_1_7_6 + 0.0145873174444629*G0_0_1_7_7 - 0.0206688549545726*G0_0_1_7_8 - 0.00344798059083822*G0_0_1_7_9 + 0.00264243692815162*G0_0_1_8_0 - 0.0193820993821028*G0_0_1_8_1 + 0.00184408184408213*G0_0_1_8_2 - 0.00450216450216546*G0_0_1_8_3 - 0.00468483897055395*G0_0_1_8_4 - 0.00233671090813989*G0_0_1_8_5 - 0.0040264497407361*G0_0_1_8_6 - 0.0206688549545726*G0_0_1_8_7 + 0.0834099234099373*G0_0_1_8_8 + 0.0245012130726457*G0_0_1_8_9 + 0.00164153307010477*G0_0_1_9_0 - 0.00504384504384595*G0_0_1_9_1 + 0.00170749885035628*G0_0_1_9_2 - 0.00324247181390108*G0_0_1_9_3 - 0.00399600399600462*G0_0_1_9_4 - 0.000251177394034532*G0_0_1_9_5 - 0.00347081489938693*G0_0_1_9_6 - 0.00344798059083822*G0_0_1_9_7 + 0.0245012130726457*G0_0_1_9_8 + 0.0119195090623682*G0_0_1_9_9 + 0.00180066846733545*G0_1_0_0_0 - 0.000717078336126088*G0_1_0_0_1 - 0.000105714391428695*G0_1_0_0_2 - 0.00430379144664938*G0_1_0_0_3 + 0.000410066124351924*G0_1_0_0_4 - 0.00059067916210783*G0_1_0_0_5 + 0.000268937411794601*G0_1_0_0_6 - 0.00529010671867902*G0_1_0_0_7 + 0.00467088467088544*G0_1_0_0_8 - 0.0011968983397557*G0_1_0_0_9 - 0.000717078336126088*G0_1_0_1_0 - 0.0306064306064358*G0_1_0_1_1 - 0.00466272704368022*G0_1_0_1_2 - 0.0566455766455864*G0_1_0_1_3 + 0.0225019425019463*G0_1_0_1_4 + 0.000804433661576661*G0_1_0_1_5 + 0.000727367870225144*G0_1_0_1_6 + 0.000879120879120947*G0_1_0_1_8 - 0.00154512154512186*G0_1_0_1_9 - 0.000105714391428695*G0_1_0_2_0 - 0.00466272704368022*G0_1_0_2_1 - 0.000614975853071148*G0_1_0_2_2 - 0.00979782122639435*G0_1_0_2_3 + 0.00324009324009382*G0_1_0_2_4 + 0.000277183134326028*G0_1_0_2_5 - 0.000530104815819162*G0_1_0_2_6 - 0.000552780552780628*G0_1_0_2_7 + 0.00261976119119018*G0_1_0_2_8 + 0.00152038437752749*G0_1_0_2_9 - 0.00430379144664938*G0_1_0_3_0 - 0.0566455766455864*G0_1_0_3_1 - 0.00979782122639435*G0_1_0_3_2 - 0.277022977023025*G0_1_0_3_3 + 0.0484472670187039*G0_1_0_3_4 + 0.00494362780077149*G0_1_0_3_5 - 0.00157128585700039*G0_1_0_3_6 + 0.0135221920936231*G0_1_0_3_7 - 0.00627372627372758*G0_1_0_3_8 - 0.0224090195518807*G0_1_0_3_9 + 0.000410066124351923*G0_1_0_4_0 + 0.0225019425019463*G0_1_0_4_1 + 0.00324009324009382*G0_1_0_4_2 + 0.0484472670187039*G0_1_0_4_3 - 0.0164464107321278*G0_1_0_4_4 - 0.000619380619380734*G0_1_0_4_5 + 0.00219066647638113*G0_1_0_4_6 - 0.00724846581989551*G0_1_0_4_8 - 0.00332239189382099*G0_1_0_4_9 - 0.00059067916210783*G0_1_0_5_0 + 0.000804433661576661*G0_1_0_5_1 + 0.000277183134326028*G0_1_0_5_2 + 0.00494362780077149*G0_1_0_5_3 - 0.000619380619380733*G0_1_0_5_4 - 0.00394177251320167*G0_1_0_5_5 - 0.00164407021549909*G0_1_0_5_6 - 0.000466676180961932*G0_1_0_5_7 - 0.00180248323105498*G0_1_0_5_8 + 0.00719566148137704*G0_1_0_5_9 + 0.000268937411794601*G0_1_0_6_0 + 0.000727367870225143*G0_1_0_6_1 - 0.000530104815819162*G0_1_0_6_2 - 0.00157128585700039*G0_1_0_6_3 + 0.00219066647638113*G0_1_0_6_4 - 0.00164407021549909*G0_1_0_6_5 - 0.000853432282003791*G0_1_0_6_6 + 0.0022691594120169*G0_1_0_6_7 - 0.00532610246896048*G0_1_0_6_8 - 0.00141858141858168*G0_1_0_6_9 - 0.00529010671867902*G0_1_0_7_0 - 0.000552780552780628*G0_1_0_7_2 + 0.0135221920936231*G0_1_0_7_3 - 0.000466676180961932*G0_1_0_7_5 + 0.0022691594120169*G0_1_0_7_6 - 0.0150649350649376*G0_1_0_7_7 - 0.00988582845725862*G0_1_0_7_8 - 0.000947623804766719*G0_1_0_7_9 + 0.00467088467088544*G0_1_0_8_0 + 0.000879120879120947*G0_1_0_8_1 + 0.00261976119119018*G0_1_0_8_2 - 0.00627372627372758*G0_1_0_8_3 - 0.00724846581989551*G0_1_0_8_4 - 0.00180248323105498*G0_1_0_8_5 - 0.00532610246896048*G0_1_0_8_6 - 0.00988582845725862*G0_1_0_8_7 + 0.0649950049950157*G0_1_0_8_8 + 0.0191322962751565*G0_1_0_8_9 - 0.0011968983397557*G0_1_0_9_0 - 0.00154512154512186*G0_1_0_9_1 + 0.00152038437752749*G0_1_0_9_2 - 0.0224090195518807*G0_1_0_9_3 - 0.00332239189382099*G0_1_0_9_4 + 0.00719566148137704*G0_1_0_9_5 - 0.00141858141858168*G0_1_0_9_6 - 0.00094762380476672*G0_1_0_9_7 + 0.0191322962751565*G0_1_0_9_8 + 0.0674068788354615*G0_1_0_9_9 - 0.00221013554346926*G0_1_1_0_0 - 0.00396245729579133*G0_1_1_0_1 - 0.000418488037535731*G0_1_1_0_2 - 0.00368731797303292*G0_1_1_0_3 + 0.00113198970341848*G0_1_1_0_4 - 0.00186184186184218*G0_1_1_0_5 + 0.000913795199509645*G0_1_1_0_6 - 0.00465608465608544*G0_1_1_0_7 + 0.00426451855023355*G0_1_1_0_8 - 0.000134468705897319*G0_1_1_0_9 - 0.00396245729579133*G0_1_1_1_0 - 0.125800125800147*G0_1_1_1_1 - 0.00755392755392883*G0_1_1_1_2 - 0.0815184815184954*G0_1_1_1_3 + 0.0345787545787604*G0_1_1_1_4 + 0.000153920153920213*G0_1_1_1_5 + 0.00121952121952142*G0_1_1_1_6 + 0.0139771339771364*G0_1_1_1_7 - 0.0253968253968298*G0_1_1_1_8 - 0.00681984681984803*G0_1_1_1_9 - 0.000418488037535731*G0_1_1_2_0 - 0.00755392755392883*G0_1_1_2_1 - 0.000870522775284829*G0_1_1_2_2 - 0.0101921359064234*G0_1_1_2_3 + 0.00320399177542089*G0_1_1_2_4 - 0.000552674838389216*G0_1_1_2_5 + 0.000112057254914429*G0_1_1_2_7 + 0.00142756714185307*G0_1_1_2_8 + 0.000626674912389294*G0_1_1_2_9 - 0.00368731797303292*G0_1_1_3_0 - 0.0815184815184954*G0_1_1_3_1 - 0.0101921359064234*G0_1_1_3_2 - 0.173906093906124*G0_1_1_3_3 + 0.0513086913087001*G0_1_1_3_4 + 0.00371818657533006*G0_1_1_3_5 - 0.000494743351886274*G0_1_1_3_6 + 0.0142257742257767*G0_1_1_3_7 - 0.0131068931068955*G0_1_1_3_8 - 0.00799200799200951*G0_1_1_3_9 + 0.00113198970341848*G0_1_1_4_0 + 0.0345787545787604*G0_1_1_4_1 + 0.00320399177542089*G0_1_1_4_2 + 0.0513086913087001*G0_1_1_4_3 - 0.0163950335378934*G0_1_1_4_4 - 0.000232148803577423*G0_1_1_4_5 + 0.000726892155463701*G0_1_1_4_6 - 0.00344798059083836*G0_1_1_4_7 - 0.00111888111888121*G0_1_1_4_8 - 0.00141572713001303*G0_1_1_4_9 - 0.00186184186184218*G0_1_1_5_0 + 0.000153920153920213*G0_1_1_5_1 - 0.000552674838389216*G0_1_1_5_2 + 0.00371818657533006*G0_1_1_5_3 - 0.000232148803577423*G0_1_1_5_4 - 0.00866942581228442*G0_1_1_5_5 + 0.00280481423338613*G0_1_1_5_6 - 0.00552970838685217*G0_1_1_5_7 + 0.00270205984491745*G0_1_1_5_8 - 0.00500071357214296*G0_1_1_5_9 + 0.000913795199509645*G0_1_1_6_0 + 0.00121952121952142*G0_1_1_6_1 - 0.000494743351886275*G0_1_1_6_3 + 0.000726892155463701*G0_1_1_6_4 + 0.00280481423338613*G0_1_1_6_5 - 0.000175063032205929*G0_1_1_6_6 + 0.00282764854193472*G0_1_1_6_7 - 0.00555254269540075*G0_1_1_6_8 - 0.000890538033395338*G0_1_1_6_9 - 0.00465608465608544*G0_1_1_7_0 + 0.0139771339771364*G0_1_1_7_1 + 0.000112057254914429*G0_1_1_7_2 + 0.0142257742257767*G0_1_1_7_3 - 0.00344798059083836*G0_1_1_7_4 - 0.00552970838685217*G0_1_1_7_5 + 0.00282764854193472*G0_1_1_7_6 + 0.000228343085486029*G0_1_1_7_7 - 0.00879120879121021*G0_1_1_7_8 - 0.00525189096617749*G0_1_1_7_9 + 0.00426451855023355*G0_1_1_8_0 - 0.0253968253968298*G0_1_1_8_1 + 0.00142756714185307*G0_1_1_8_2 - 0.0131068931068955*G0_1_1_8_3 - 0.00111888111888122*G0_1_1_8_4 + 0.00270205984491745*G0_1_1_8_5 - 0.00555254269540075*G0_1_1_8_6 - 0.00879120879121021*G0_1_1_8_7 + 0.0690509490509605*G0_1_1_8_8 + 0.0226973026973064*G0_1_1_8_9 - 0.000134468705897319*G0_1_1_9_0 - 0.00681984681984803*G0_1_1_9_1 + 0.000626674912389294*G0_1_1_9_2 - 0.00799200799200951*G0_1_1_9_3 - 0.00141572713001303*G0_1_1_9_4 - 0.00500071357214296*G0_1_1_9_5 - 0.000890538033395338*G0_1_1_9_6 - 0.00525189096617749*G0_1_1_9_7 + 0.0226973026973064*G0_1_1_9_8 + 0.00602825745682986*G0_1_1_9_9; + A[212] = 0.00151284341760561*G0_0_1_0_0 + 0.00231632564965936*G0_0_1_0_2 + 0.000520431949003478*G0_0_1_0_3 - 0.000449550449550561*G0_0_1_0_4 - 0.00243106100248998*G0_0_1_0_5 + 0.0088933288933304*G0_0_1_0_6 + 0.000586873444016426*G0_0_1_0_7 - 0.000544851973423506*G0_0_1_0_8 + 0.00207601921887671*G0_0_1_0_9 - 0.0015128434176056*G0_0_1_1_1 - 0.0023163256496594*G0_0_1_1_2 + 0.00243106100249*G0_0_1_1_3 - 0.00889332889333044*G0_0_1_1_4 - 0.000520431949003462*G0_0_1_1_5 + 0.000449550449550516*G0_0_1_1_6 + 0.000544851973423503*G0_0_1_1_7 - 0.000586873444016413*G0_0_1_1_8 - 0.00207601921887672*G0_0_1_1_9 + 0.00231632564965936*G0_0_1_2_0 - 0.0023163256496594*G0_0_1_2_1 + 0.011899211899214*G0_0_1_2_3 - 0.0381840381840449*G0_0_1_2_4 - 0.0118992118992138*G0_0_1_2_5 + 0.0381840381840445*G0_0_1_2_6 + 0.000502830502830597*G0_0_1_2_7 - 0.000502830502830581*G0_0_1_2_8 + 0.000520431949003478*G0_0_1_3_0 + 0.00243106100249*G0_0_1_3_1 + 0.011899211899214*G0_0_1_3_2 - 0.00755244755244895*G0_0_1_3_3 + 0.0445054945055022*G0_0_1_3_4 - 0.00134865134865148*G0_0_1_3_6 - 0.00156129584701039*G0_0_1_3_7 + 5.2804338518614e-05*G0_0_1_3_8 + 0.00935064935065095*G0_0_1_3_9 - 0.00044955044955056*G0_0_1_4_0 - 0.00889332889333044*G0_0_1_4_1 - 0.0381840381840449*G0_0_1_4_2 + 0.0445054945055022*G0_0_1_4_3 - 0.0998001998002173*G0_0_1_4_4 + 0.00134865134865167*G0_0_1_4_5 - 7.99200799200889e-05*G0_0_1_4_7 + 0.00150849150849177*G0_0_1_4_8 - 0.00269730269730321*G0_0_1_4_9 - 0.00243106100248998*G0_0_1_5_0 - 0.000520431949003462*G0_0_1_5_1 - 0.0118992118992138*G0_0_1_5_2 + 0.00134865134865167*G0_0_1_5_4 + 0.00755244755244878*G0_0_1_5_5 - 0.044505494505502*G0_0_1_5_6 - 5.28043385186278e-05*G0_0_1_5_7 + 0.00156129584701039*G0_0_1_5_8 - 0.00935064935065091*G0_0_1_5_9 + 0.0088933288933304*G0_0_1_6_0 + 0.000449550449550515*G0_0_1_6_1 + 0.0381840381840445*G0_0_1_6_2 - 0.00134865134865147*G0_0_1_6_3 - 0.044505494505502*G0_0_1_6_5 + 0.0998001998002165*G0_0_1_6_6 - 0.00150849150849176*G0_0_1_6_7 + 7.99200799201253e-05*G0_0_1_6_8 + 0.00269730269730304*G0_0_1_6_9 + 0.000586873444016426*G0_0_1_7_0 + 0.000544851973423503*G0_0_1_7_1 + 0.000502830502830597*G0_0_1_7_2 - 0.00156129584701039*G0_0_1_7_3 - 7.99200799200887e-05*G0_0_1_7_4 - 5.28043385186278e-05*G0_0_1_7_5 - 0.00150849150849176*G0_0_1_7_6 + 0.00235478806907428*G0_0_1_7_7 - 0.00321107463964659*G0_0_1_7_9 - 0.000544851973423506*G0_0_1_8_0 - 0.000586873444016413*G0_0_1_8_1 - 0.000502830502830581*G0_0_1_8_2 + 5.28043385186141e-05*G0_0_1_8_3 + 0.00150849150849177*G0_0_1_8_4 + 0.00156129584701039*G0_0_1_8_5 + 7.99200799201253e-05*G0_0_1_8_6 - 0.00235478806907419*G0_0_1_8_8 + 0.00321107463964661*G0_0_1_8_9 + 0.00207601921887671*G0_0_1_9_0 - 0.00207601921887672*G0_0_1_9_1 + 0.00935064935065095*G0_0_1_9_3 - 0.00269730269730322*G0_0_1_9_4 - 0.00935064935065091*G0_0_1_9_5 + 0.00269730269730304*G0_0_1_9_6 - 0.00321107463964659*G0_0_1_9_7 + 0.00321107463964661*G0_0_1_9_8 + 0.00289812480288722*G0_1_1_0_0 + 0.000136565374660638*G0_1_1_0_1 - 0.00342817676151069*G0_1_1_0_2 + 0.00392258535115745*G0_1_1_0_3 - 0.00563785420928377*G0_1_1_0_4 + 0.00219288647860115*G0_1_1_0_5 - 0.00414125556982771*G0_1_1_0_6 + 0.00249861249861295*G0_1_1_0_7 - 0.000886098028955323*G0_1_1_0_8 - 0.0017753674896535*G0_1_1_0_9 + 0.000136565374660638*G0_1_1_1_0 + 0.00138528138528163*G0_1_1_1_1 - 0.00574450241117006*G0_1_1_1_2 + 0.00462394748109114*G0_1_1_1_3 - 0.0130345844631581*G0_1_1_1_4 + 0.00340215340215398*G0_1_1_1_5 - 0.00518830375973322*G0_1_1_1_6 - 0.000341246055531836*G0_1_1_1_7 + 0.00191173905459654*G0_1_1_1_8 - 0.00385138670853022*G0_1_1_1_9 - 0.00342817676151069*G0_1_1_2_0 - 0.00574450241117006*G0_1_1_2_1 - 0.0566199232865995*G0_1_1_2_2 + 0.0276212676212723*G0_1_1_2_3 - 0.0671273171273285*G0_1_1_2_4 + 0.0157220557220584*G0_1_1_2_5 - 0.0289432789432838*G0_1_1_2_6 + 0.00305250305250356*G0_1_1_2_7 + 0.00254967254967297*G0_1_1_2_8 - 0.00438228438228512*G0_1_1_2_9 + 0.00392258535115745*G0_1_1_3_0 + 0.00462394748109114*G0_1_1_3_1 + 0.0276212676212723*G0_1_1_3_2 - 0.00675610104181653*G0_1_1_3_3 + 0.0575724275724374*G0_1_1_3_4 - 0.0134893677750843*G0_1_1_3_5 + 0.0205694305694341*G0_1_1_3_6 - 0.0067632367632379*G0_1_1_3_7 + 0.00940773512202241*G0_1_1_3_8 + 0.0250806336520664*G0_1_1_3_9 - 0.00563785420928377*G0_1_1_4_0 - 0.0130345844631581*G0_1_1_4_1 - 0.0671273171273285*G0_1_1_4_2 + 0.0575724275724374*G0_1_1_4_3 - 0.138581418581442*G0_1_1_4_4 + 0.0219180819180857*G0_1_1_4_5 - 0.0424875124875197*G0_1_1_4_6 + 0.00137576709005304*G0_1_1_4_7 - 0.00264449835878452*G0_1_1_4_8 - 0.0306893106893159*G0_1_1_4_9 + 0.00219288647860115*G0_1_1_5_0 + 0.00340215340215398*G0_1_1_5_1 + 0.0157220557220584*G0_1_1_5_2 - 0.0134893677750843*G0_1_1_5_3 + 0.0219180819180856*G0_1_1_5_4 + 0.000796346510632307*G0_1_1_5_5 + 0.0130669330669353*G0_1_1_5_6 + 0.00935493078350376*G0_1_1_5_7 - 0.0052019409162275*G0_1_1_5_8 + 0.0157299843014155*G0_1_1_5_9 - 0.00414125556982771*G0_1_1_6_0 - 0.00518830375973322*G0_1_1_6_1 - 0.0289432789432838*G0_1_1_6_2 + 0.0205694305694341*G0_1_1_6_3 - 0.0424875124875197*G0_1_1_6_4 + 0.0130669330669353*G0_1_1_6_5 - 0.0387812187812253*G0_1_1_6_6 - 0.00415298986727628*G0_1_1_6_7 + 0.00145568716997314*G0_1_1_6_8 - 0.0279920079920127*G0_1_1_6_9 + 0.00249861249861295*G0_1_1_7_0 - 0.000341246055531836*G0_1_1_7_1 + 0.00305250305250356*G0_1_1_7_2 - 0.0067632367632379*G0_1_1_7_3 + 0.00137576709005304*G0_1_1_7_4 + 0.00935493078350376*G0_1_1_7_5 - 0.00415298986727628*G0_1_1_7_6 + 0.0608648494362883*G0_1_1_7_7 - 0.00633223918938315*G0_1_1_7_8 + 0.0136320822035131*G0_1_1_7_9 - 0.000886098028955323*G0_1_1_8_0 + 0.00191173905459654*G0_1_1_8_1 + 0.00254967254967297*G0_1_1_8_2 + 0.00940773512202241*G0_1_1_8_3 - 0.00264449835878452*G0_1_1_8_4 - 0.0052019409162275*G0_1_1_8_5 + 0.00145568716997314*G0_1_1_8_6 - 0.00633223918938315*G0_1_1_8_7 + 0.0585100613672142*G0_1_1_8_8 + 0.0168431568431597*G0_1_1_8_9 - 0.0017753674896535*G0_1_1_9_0 - 0.00385138670853022*G0_1_1_9_1 - 0.00438228438228512*G0_1_1_9_2 + 0.0250806336520664*G0_1_1_9_3 - 0.0306893106893159*G0_1_1_9_4 + 0.0157299843014155*G0_1_1_9_5 - 0.0279920079920127*G0_1_1_9_6 + 0.0136320822035131*G0_1_1_9_7 + 0.0168431568431597*G0_1_1_9_8 + 0.0528157556729072*G0_1_1_9_9; + A[1] = A[16] + 0.00869899500852035*G0_0_0_0_0 - 0.00453085384633083*G0_0_0_0_1 - 0.00304913010270206*G0_0_0_0_3 + 0.00121600951958116*G0_0_0_0_4 + 0.00568461300604257*G0_0_0_0_5 - 0.00220808952951849*G0_0_0_0_6 + 0.00382492507492575*G0_0_0_0_7 - 0.00610014985015091*G0_0_0_0_8 - 0.000780885780885911*G0_0_0_0_9 - 0.00453085384633083*G0_0_0_1_0 - 0.0952357827357991*G0_0_0_1_1 - 0.00443448636901093*G0_0_0_1_2 - 0.0411505624005694*G0_0_0_1_3 + 0.0195331982832016*G0_0_0_1_4 + 0.000977398923827694*G0_0_0_1_5 + 0.000574983878555389*G0_0_0_1_6 + 0.0210703648203685*G0_0_0_1_7 - 0.0458485495985575*G0_0_0_1_8 - 0.00629481629481739*G0_0_0_1_9 - 0.00443448636901093*G0_0_0_2_1 - 0.00274697524697571*G0_0_0_2_2 - 0.00407230335801833*G0_0_0_2_3 + 0.00179530125958728*G0_0_0_2_4 + 0.00135692349978087*G0_0_0_2_5 - 0.0010429980072839*G0_0_0_2_6 + 0.00139341148269743*G0_0_0_2_7 - 0.00327414318485802*G0_0_0_2_8 - 0.000634880992023958*G0_0_0_2_9 - 0.00304913010270206*G0_0_0_3_0 - 0.0411505624005694*G0_0_0_3_1 - 0.00407230335801833*G0_0_0_3_2 - 0.0460273060273139*G0_0_0_3_3 + 0.0192551793444683*G0_0_0_3_4 + 0.00117995100137978*G0_0_0_3_5 + 0.0021303398981974*G0_0_0_3_6 + 0.0130026818419698*G0_0_0_3_7 - 0.0266804029304075*G0_0_0_3_8 - 0.00712091479948746*G0_0_0_3_9 + 0.00121600951958116*G0_0_0_4_0 + 0.0195331982832016*G0_0_0_4_1 + 0.00179530125958728*G0_0_0_4_2 + 0.0192551793444683*G0_0_0_4_3 - 0.0102291755863202*G0_0_0_4_4 + 0.000207262975120149*G0_0_0_4_5 - 0.00233760287331755*G0_0_0_4_6 - 0.00584177727034969*G0_0_0_4_7 + 0.0136777210884377*G0_0_0_4_8 + 0.00149011702583158*G0_0_0_4_9 + 0.00568461300604257*G0_0_0_5_0 + 0.000977398923827694*G0_0_0_5_1 + 0.00135692349978087*G0_0_0_5_2 + 0.00117995100137978*G0_0_0_5_3 + 0.000207262975120149*G0_0_0_5_4 + 0.00127658056229511*G0_0_0_5_5 - 0.00288220707863615*G0_0_0_5_6 - 0.000598151848151951*G0_0_0_5_7 + 0.000923094762380647*G0_0_0_5_8 + 0.000496467817896482*G0_0_0_5_9 - 0.00220808952951849*G0_0_0_6_0 + 0.000574983878555389*G0_0_0_6_1 - 0.0010429980072839*G0_0_0_6_2 + 0.0021303398981974*G0_0_0_6_3 - 0.00233760287331755*G0_0_0_6_4 - 0.00288220707863614*G0_0_0_6_5 - 0.00685635792778765*G0_0_0_6_6 - 0.000324942914228681*G0_0_0_6_7 + 0.00212109319252211*G0_0_0_6_8 - 0.00235603682032293*G0_0_0_6_9 + 0.00382492507492575*G0_0_0_7_0 + 0.0210703648203685*G0_0_0_7_1 + 0.00139341148269743*G0_0_0_7_2 + 0.0130026818419698*G0_0_0_7_3 - 0.00584177727034969*G0_0_0_7_4 - 0.000598151848151951*G0_0_0_7_5 - 0.000324942914228681*G0_0_0_7_6 - 0.0153346653346679*G0_0_0_7_7 + 0.0248011809618995*G0_0_0_7_8 + 0.00299254317111511*G0_0_0_7_9 - 0.00610014985015091*G0_0_0_8_0 - 0.0458485495985575*G0_0_0_8_1 - 0.00327414318485802*G0_0_0_8_2 - 0.0266804029304075*G0_0_0_8_3 + 0.0136777210884377*G0_0_0_8_4 + 0.000923094762380647*G0_0_0_8_5 + 0.00212109319252211*G0_0_0_8_6 + 0.0248011809618995*G0_0_0_8_7 - 0.0592657342657443*G0_0_0_8_8 - 0.00847099329242332*G0_0_0_8_9 - 0.000780885780885911*G0_0_0_9_0 - 0.00629481629481739*G0_0_0_9_1 - 0.000634880992023958*G0_0_0_9_2 - 0.00712091479948746*G0_0_0_9_3 + 0.00149011702583158*G0_0_0_9_4 + 0.000496467817896482*G0_0_0_9_5 - 0.00235603682032293*G0_0_0_9_6 + 0.00299254317111511*G0_0_0_9_7 - 0.00847099329242332*G0_0_0_9_8 - 0.0100421007563882*G0_0_0_9_9 + 0.0108191962358648*G0_1_0_0_0 + 0.00052394860430584*G0_1_0_0_1 + 0.000620316081625713*G0_1_0_0_2 + 0.000227512236440845*G0_1_0_0_3 - 0.000174902808831411*G0_1_0_0_4 + 0.00659231971732086*G0_1_0_0_5 - 0.00269179894179941*G0_1_0_0_6 + 0.00189433251933286*G0_1_0_0_7 - 0.00115463240463261*G0_1_0_0_8 + 0.000290959040959097*G0_1_0_0_9 + 0.00052394860430584*G0_1_0_1_0 + 0.0108191962358647*G0_1_0_1_1 + 0.000620316081625708*G0_1_0_1_2 + 0.00659231971732082*G0_1_0_1_3 - 0.00269179894179939*G0_1_0_1_4 + 0.000227512236440844*G0_1_0_1_5 - 0.000174902808831409*G0_1_0_1_6 - 0.0011546324046326*G0_1_0_1_7 + 0.00189433251933285*G0_1_0_1_8 + 0.000290959040959093*G0_1_0_1_9 + 0.000620316081625713*G0_1_0_2_0 + 0.000620316081625708*G0_1_0_2_1 - 0.000626774019631271*G0_1_0_2_2 + 0.000873214087499947*G0_1_0_2_3 - 0.000135291296005604*G0_1_0_2_4 + 0.000873214087499953*G0_1_0_2_5 - 0.000135291296005607*G0_1_0_2_6 + 0.000436963829821047*G0_1_0_2_9 + 0.000227512236440845*G0_1_0_3_0 + 0.00659231971732082*G0_1_0_3_1 + 0.000873214087499947*G0_1_0_3_2 + 0.0107513320013338*G0_1_0_3_3 - 0.00481814316635825*G0_1_0_3_4 - 0.000427816231387732*G0_1_0_3_5 - 0.00119197766519215*G0_1_0_3_7 + 0.00170891608391637*G0_1_0_3_8 + 0.00151107820750704*G0_1_0_3_9 - 0.000174902808831411*G0_1_0_4_0 - 0.00269179894179939*G0_1_0_4_1 - 0.000135291296005604*G0_1_0_4_2 - 0.00481814316635825*G0_1_0_4_3 + 0.00261839351125108*G0_1_0_4_4 + 0.000513325959754617*G0_1_0_4_7 - 0.000516938418724219*G0_1_0_4_8 - 0.00134142643071238*G0_1_0_4_9 + 0.00659231971732086*G0_1_0_5_0 + 0.000227512236440844*G0_1_0_5_1 + 0.000873214087499953*G0_1_0_5_2 - 0.000427816231387732*G0_1_0_5_3 + 0.0107513320013338*G0_1_0_5_5 - 0.00481814316635827*G0_1_0_5_6 + 0.00170891608391638*G0_1_0_5_7 - 0.00119197766519216*G0_1_0_5_8 + 0.00151107820750704*G0_1_0_5_9 - 0.00269179894179941*G0_1_0_6_0 - 0.000174902808831409*G0_1_0_6_1 - 0.000135291296005607*G0_1_0_6_2 - 0.00481814316635827*G0_1_0_6_5 + 0.00261839351125109*G0_1_0_6_6 - 0.000516938418724223*G0_1_0_6_7 + 0.00051332595975462*G0_1_0_6_8 - 0.00134142643071238*G0_1_0_6_9 + 0.00189433251933286*G0_1_0_7_0 - 0.0011546324046326*G0_1_0_7_1 - 0.00119197766519215*G0_1_0_7_3 + 0.000513325959754617*G0_1_0_7_4 + 0.00170891608391638*G0_1_0_7_5 - 0.000516938418724223*G0_1_0_7_6 - 0.00248709623709664*G0_1_0_7_7 + 0.000727858451072852*G0_1_0_7_8 + 0.000160999714571173*G0_1_0_7_9 - 0.00115463240463261*G0_1_0_8_0 + 0.00189433251933285*G0_1_0_8_1 + 0.00170891608391637*G0_1_0_8_3 - 0.000516938418724219*G0_1_0_8_4 - 0.00119197766519216*G0_1_0_8_5 + 0.00051332595975462*G0_1_0_8_6 + 0.000727858451072852*G0_1_0_8_7 - 0.00248709623709665*G0_1_0_8_8 + 0.000160999714571168*G0_1_0_8_9 + 0.000290959040959097*G0_1_0_9_0 + 0.000290959040959092*G0_1_0_9_1 + 0.000436963829821047*G0_1_0_9_2 + 0.00151107820750704*G0_1_0_9_3 - 0.00134142643071238*G0_1_0_9_4 + 0.00151107820750704*G0_1_0_9_5 - 0.00134142643071238*G0_1_0_9_6 + 0.000160999714571173*G0_1_0_9_7 + 0.000160999714571168*G0_1_0_9_8 + 0.00183352361923822*G0_1_0_9_9; + A[27] = A[181] - 0.00237293570626945*G0_0_1_0_0 - 0.0008015441348776*G0_0_1_0_1 + 0.000133992991135881*G0_0_1_0_3 - 0.000287014572728912*G0_0_1_0_4 - 0.000945562374133963*G0_0_1_0_5 + 0.00435770578627794*G0_0_1_0_7 - 0.00223522509236832*G0_0_1_0_8 + 0.00133390419104727*G0_0_1_0_9 - 0.0008015441348776*G0_0_1_1_0 + 0.000797104130437605*G0_0_1_1_2 + 0.0109668109668129*G0_0_1_1_3 - 0.00275280275280324*G0_0_1_1_4 + 0.000498390498390585*G0_0_1_1_5 - 0.000493950493950583*G0_0_1_1_6 + 0.00674880674880786*G0_0_1_1_7 - 0.0109668109668128*G0_0_1_1_8 - 0.00399600399600465*G0_0_1_1_9 + 0.000797104130437605*G0_0_1_2_1 - 0.000273025034929846*G0_0_1_2_2 + 0.0022269793698369*G0_0_1_2_3 + 0.00142825428539738*G0_0_1_2_4 - 0.000216291644863112*G0_0_1_2_5 + 0.00040832183689334*G0_0_1_2_6 + 0.00139891854177591*G0_0_1_2_7 - 0.00124462838748573*G0_0_1_2_8 + 0.00371628371628435*G0_0_1_2_9 + 0.000133992991135881*G0_0_1_3_0 + 0.0109668109668129*G0_0_1_3_1 + 0.0022269793698369*G0_0_1_3_2 + 0.0317482517482573*G0_0_1_3_3 - 0.0173126873126903*G0_0_1_3_4 - 0.000685029256457943*G0_0_1_3_5 + 0.000954759526188251*G0_0_1_3_6 - 0.000929070929071129*G0_0_1_3_7 - 0.00227772227772258*G0_0_1_3_8 + 0.0138461538461562*G0_0_1_3_9 - 0.000287014572728912*G0_0_1_4_0 - 0.00275280275280324*G0_0_1_4_1 + 0.00142825428539738*G0_0_1_4_2 - 0.0173126873126903*G0_0_1_4_3 + 0.010383901812475*G0_0_1_4_4 + 0.000333951762523247*G0_0_1_4_5 - 0.0012887112887115*G0_0_1_4_6 - 0.00140430997573876*G0_0_1_4_7 + 0.00320679320679371*G0_0_1_4_8 - 0.0118167546738995*G0_0_1_4_9 - 0.000945562374133963*G0_0_1_5_0 + 0.000498390498390585*G0_0_1_5_1 - 0.000216291644863112*G0_0_1_5_2 - 0.000685029256457943*G0_0_1_5_3 + 0.000333951762523247*G0_0_1_5_4 + 0.00029970029970032*G0_0_1_5_5 + 0.00102754388468691*G0_0_1_5_6 + 0.00674611103182645*G0_0_1_5_7 - 0.00202226345083522*G0_0_1_5_8 - 0.000493950493950583*G0_0_1_6_1 + 0.00040832183689334*G0_0_1_6_2 + 0.000954759526188251*G0_0_1_6_3 - 0.0012887112887115*G0_0_1_6_4 + 0.00102754388468691*G0_0_1_6_5 + 0.00175538746967349*G0_0_1_6_6 - 0.00472384758099122*G0_0_1_6_7 + 0.0028714142999862*G0_0_1_6_8 - 0.0130583702012296*G0_0_1_6_9 + 0.00435770578627794*G0_0_1_7_0 + 0.00674880674880786*G0_0_1_7_1 + 0.00139891854177591*G0_0_1_7_2 - 0.000929070929071129*G0_0_1_7_3 - 0.00140430997573876*G0_0_1_7_4 + 0.00674611103182645*G0_0_1_7_5 - 0.00472384758099122*G0_0_1_7_6 + 0.0318824033109801*G0_0_1_7_7 - 0.00438561438561516*G0_0_1_7_8 + 0.00544598258884064*G0_0_1_7_9 - 0.00223522509236832*G0_0_1_8_0 - 0.0109668109668128*G0_0_1_8_1 - 0.00124462838748573*G0_0_1_8_2 - 0.00227772227772258*G0_0_1_8_3 + 0.00320679320679371*G0_0_1_8_4 - 0.00202226345083522*G0_0_1_8_5 + 0.0028714142999862*G0_0_1_8_6 - 0.00438561438561516*G0_0_1_8_7 - 0.0271928071928117*G0_0_1_8_8 + 0.00557442557442654*G0_0_1_8_9 + 0.00133390419104727*G0_0_1_9_0 - 0.00399600399600465*G0_0_1_9_1 + 0.00371628371628435*G0_0_1_9_2 + 0.0138461538461562*G0_0_1_9_3 - 0.0118167546738995*G0_0_1_9_4 - 0.0130583702012296*G0_0_1_9_6 + 0.00544598258884064*G0_0_1_9_7 + 0.00557442557442654*G0_0_1_9_8 - 0.0267161410018597*G0_0_1_9_9 + 0.00237293570626945*G0_1_0_0_0 + 0.0008015441348776*G0_1_0_0_1 - 0.000133992991135881*G0_1_0_0_3 + 0.000287014572728912*G0_1_0_0_4 + 0.000945562374133963*G0_1_0_0_5 - 0.00435770578627794*G0_1_0_0_7 + 0.00223522509236832*G0_1_0_0_8 - 0.00133390419104727*G0_1_0_0_9 + 0.0008015441348776*G0_1_0_1_0 - 0.000797104130437604*G0_1_0_1_2 - 0.0109668109668129*G0_1_0_1_3 + 0.00275280275280324*G0_1_0_1_4 - 0.000498390498390585*G0_1_0_1_5 + 0.000493950493950583*G0_1_0_1_6 - 0.00674880674880786*G0_1_0_1_7 + 0.0109668109668128*G0_1_0_1_8 + 0.00399600399600465*G0_1_0_1_9 - 0.000797104130437604*G0_1_0_2_1 + 0.000273025034929846*G0_1_0_2_2 - 0.0022269793698369*G0_1_0_2_3 - 0.00142825428539738*G0_1_0_2_4 + 0.000216291644863113*G0_1_0_2_5 - 0.00040832183689334*G0_1_0_2_6 - 0.00139891854177591*G0_1_0_2_7 + 0.00124462838748573*G0_1_0_2_8 - 0.00371628371628435*G0_1_0_2_9 - 0.000133992991135881*G0_1_0_3_0 - 0.0109668109668129*G0_1_0_3_1 - 0.0022269793698369*G0_1_0_3_2 - 0.0317482517482573*G0_1_0_3_3 + 0.0173126873126903*G0_1_0_3_4 + 0.000685029256457943*G0_1_0_3_5 - 0.00095475952618825*G0_1_0_3_6 + 0.000929070929071129*G0_1_0_3_7 + 0.00227772227772258*G0_1_0_3_8 - 0.0138461538461562*G0_1_0_3_9 + 0.000287014572728912*G0_1_0_4_0 + 0.00275280275280324*G0_1_0_4_1 - 0.00142825428539738*G0_1_0_4_2 + 0.0173126873126903*G0_1_0_4_3 - 0.010383901812475*G0_1_0_4_4 - 0.000333951762523247*G0_1_0_4_5 + 0.0012887112887115*G0_1_0_4_6 + 0.00140430997573876*G0_1_0_4_7 - 0.00320679320679371*G0_1_0_4_8 + 0.0118167546738995*G0_1_0_4_9 + 0.000945562374133963*G0_1_0_5_0 - 0.000498390498390585*G0_1_0_5_1 + 0.000216291644863113*G0_1_0_5_2 + 0.000685029256457943*G0_1_0_5_3 - 0.000333951762523247*G0_1_0_5_4 - 0.00029970029970032*G0_1_0_5_5 - 0.00102754388468691*G0_1_0_5_6 - 0.00674611103182645*G0_1_0_5_7 + 0.00202226345083522*G0_1_0_5_8 + 0.000493950493950583*G0_1_0_6_1 - 0.00040832183689334*G0_1_0_6_2 - 0.000954759526188251*G0_1_0_6_3 + 0.0012887112887115*G0_1_0_6_4 - 0.00102754388468691*G0_1_0_6_5 - 0.00175538746967349*G0_1_0_6_6 + 0.00472384758099122*G0_1_0_6_7 - 0.0028714142999862*G0_1_0_6_8 + 0.0130583702012296*G0_1_0_6_9 - 0.00435770578627794*G0_1_0_7_0 - 0.00674880674880786*G0_1_0_7_1 - 0.00139891854177591*G0_1_0_7_2 + 0.000929070929071129*G0_1_0_7_3 + 0.00140430997573876*G0_1_0_7_4 - 0.00674611103182645*G0_1_0_7_5 + 0.00472384758099122*G0_1_0_7_6 - 0.0318824033109801*G0_1_0_7_7 + 0.00438561438561516*G0_1_0_7_8 - 0.00544598258884064*G0_1_0_7_9 + 0.00223522509236832*G0_1_0_8_0 + 0.0109668109668128*G0_1_0_8_1 + 0.00124462838748573*G0_1_0_8_2 + 0.00227772227772258*G0_1_0_8_3 - 0.00320679320679371*G0_1_0_8_4 + 0.00202226345083522*G0_1_0_8_5 - 0.0028714142999862*G0_1_0_8_6 + 0.00438561438561516*G0_1_0_8_7 + 0.0271928071928117*G0_1_0_8_8 - 0.00557442557442655*G0_1_0_8_9 - 0.00133390419104727*G0_1_0_9_0 + 0.00399600399600465*G0_1_0_9_1 - 0.00371628371628435*G0_1_0_9_2 - 0.0138461538461562*G0_1_0_9_3 + 0.0118167546738995*G0_1_0_9_4 + 0.0130583702012296*G0_1_0_9_6 - 0.00544598258884064*G0_1_0_9_7 - 0.00557442557442655*G0_1_0_9_8 + 0.0267161410018597*G0_1_0_9_9; + A[46] = -0.000376695614790921*G0_0_0_0_0 + 0.00287397787397836*G0_0_0_0_1 - 0.000193677574629989*G0_0_0_0_2 + 0.00448532948533026*G0_0_0_0_3 - 0.00305205376634*G0_0_0_0_4 + 0.000163751592323045*G0_0_0_0_5 - 0.00104575318861051*G0_0_0_0_6 - 0.00158185729614328*G0_0_0_0_7 + 0.00371276871276934*G0_0_0_0_8 + 0.000279561708133184*G0_0_0_0_9 + 0.00287397787397836*G0_0_0_1_0 + 0.04288304288305*G0_0_0_1_1 + 0.00430587930588002*G0_0_0_1_2 + 0.0501683501683586*G0_0_0_1_3 - 0.0214183964184*G0_0_0_1_4 - 0.00144207644207669*G0_0_0_1_5 - 0.00210252710252746*G0_0_0_1_6 - 0.0125420875420896*G0_0_0_1_7 + 0.0250841750841793*G0_0_0_1_8 + 0.00733155733155859*G0_0_0_1_9 - 0.000193677574629989*G0_0_0_2_0 + 0.00430587930588002*G0_0_0_2_1 - 0.00739334739334863*G0_0_0_2_2 + 0.0101975801975819*G0_0_0_2_3 - 0.00552621981193502*G0_0_0_2_4 + 0.00247958390815575*G0_0_0_2_5 - 0.0062264719407587*G0_0_0_2_6 - 0.00213091141662606*G0_0_0_2_7 + 0.00371276871276933*G0_0_0_2_8 + 0.00137766994909876*G0_0_0_2_9 + 0.00448532948533026*G0_0_0_3_0 + 0.0501683501683586*G0_0_0_3_1 + 0.0101975801975819*G0_0_0_3_2 + 0.100749250749268*G0_0_0_3_3 - 0.0399450549450617*G0_0_0_3_4 - 0.00231768231768271*G0_0_0_3_5 + 0.0018131868131871*G0_0_0_3_6 - 0.017950382950386*G0_0_0_3_7 + 0.0335830835830892*G0_0_0_3_8 + 0.0139060939060963*G0_0_0_3_9 - 0.00305205376634*G0_0_0_4_0 - 0.0214183964184*G0_0_0_4_1 - 0.00552621981193502*G0_0_0_4_2 - 0.0399450549450617*G0_0_0_4_3 + 0.00337662337662395*G0_0_0_4_4 + 0.00466176680462473*G0_0_0_4_5 - 0.00647495361781184*G0_0_0_4_6 + 0.0100216450216467*G0_0_0_4_7 - 0.0156327006327033*G0_0_0_4_8 - 0.0134565434565457*G0_0_0_4_9 + 0.000163751592323045*G0_0_0_5_0 - 0.00144207644207669*G0_0_0_5_1 + 0.00247958390815575*G0_0_0_5_2 - 0.00231768231768271*G0_0_0_5_3 + 0.00466176680462473*G0_0_0_5_4 - 0.0166875981161723*G0_0_0_5_5 + 0.00561509918652871*G0_0_0_5_6 - 0.00173017458731773*G0_0_0_5_7 - 0.000168165168165199*G0_0_0_5_8 - 0.000502354788069157*G0_0_0_5_9 - 0.00104575318861051*G0_0_0_6_0 - 0.00210252710252746*G0_0_0_6_1 - 0.0062264719407587*G0_0_0_6_2 + 0.0018131868131871*G0_0_0_6_3 - 0.00647495361781184*G0_0_0_6_4 + 0.00561509918652871*G0_0_0_6_5 - 0.0353617810760727*G0_0_0_6_6 + 0.00189833975548293*G0_0_0_6_7 - 0.000168165168165197*G0_0_0_6_8 - 0.00775938347367048*G0_0_0_6_9 - 0.00158185729614328*G0_0_0_7_0 - 0.0125420875420896*G0_0_0_7_1 - 0.00213091141662606*G0_0_0_7_2 - 0.017950382950386*G0_0_0_7_3 + 0.0100216450216467*G0_0_0_7_4 - 0.00173017458731773*G0_0_0_7_5 + 0.00189833975548293*G0_0_0_7_6 + 0.00561105561105654*G0_0_0_7_7 - 0.0156327006327032*G0_0_0_7_8 - 0.00463536463536542*G0_0_0_7_9 + 0.00371276871276934*G0_0_0_8_0 + 0.0250841750841793*G0_0_0_8_1 + 0.00371276871276933*G0_0_0_8_2 + 0.0335830835830892*G0_0_0_8_3 - 0.0156327006327032*G0_0_0_8_4 - 0.000168165168165199*G0_0_0_8_5 - 0.000168165168165197*G0_0_0_8_6 - 0.0156327006327032*G0_0_0_8_7 + 0.0335830835830891*G0_0_0_8_8 + 0.00927072927073083*G0_0_0_8_9 + 0.000279561708133184*G0_0_0_9_0 + 0.00733155733155859*G0_0_0_9_1 + 0.00137766994909876*G0_0_0_9_2 + 0.0139060939060963*G0_0_0_9_3 - 0.0134565434565457*G0_0_0_9_4 - 0.000502354788069157*G0_0_0_9_5 - 0.00775938347367048*G0_0_0_9_6 - 0.00463536463536542*G0_0_0_9_7 + 0.00927072927073083*G0_0_0_9_8 - 0.0260139860139904*G0_0_0_9_9 + 0.00113558399272704*G0_1_0_0_0 + 0.0117478200811555*G0_1_0_0_1 + 0.000944003086860391*G0_1_0_0_2 + 0.00868964368964519*G0_1_0_0_3 - 0.00417748917748989*G0_1_0_0_4 - 0.000520749092177761*G0_1_0_0_5 - 0.000326736755308234*G0_1_0_0_6 - 0.00592851592851695*G0_1_0_0_7 + 0.0135714285714309*G0_1_0_0_8 + 0.00253857253857298*G0_1_0_0_9 + 0.0117478200811555*G0_1_0_1_0 + 0.228459195125901*G0_1_0_1_1 + 0.0117478200811554*G0_1_0_1_2 + 0.113297813297833*G0_1_0_1_3 - 0.0524753024753113*G0_1_0_1_4 - 0.00252247752247802*G0_1_0_1_5 - 0.00252247752247791*G0_1_0_1_6 - 0.0524753024753115*G0_1_0_1_7 + 0.113297813297833*G0_1_0_1_8 + 0.0166944166944196*G0_1_0_1_9 + 0.000944003086860391*G0_1_0_2_0 + 0.0117478200811554*G0_1_0_2_1 + 0.00113558399272705*G0_1_0_2_2 + 0.0135714285714309*G0_1_0_2_3 - 0.00592851592851692*G0_1_0_2_4 - 0.000326736755308243*G0_1_0_2_5 - 0.000520749092177745*G0_1_0_2_6 - 0.00417748917748988*G0_1_0_2_7 + 0.00868964368964515*G0_1_0_2_8 + 0.00253857253857297*G0_1_0_2_9 + 0.00868964368964519*G0_1_0_3_0 + 0.113297813297833*G0_1_0_3_1 + 0.0135714285714309*G0_1_0_3_2 + 0.147818847818873*G0_1_0_3_3 - 0.0619963369963475*G0_1_0_3_4 - 0.00380785880785946*G0_1_0_3_5 - 0.00331834831834887*G0_1_0_3_6 - 0.0369547119547183*G0_1_0_3_7 + 0.0739094239094365*G0_1_0_3_8 + 0.0238261738261779*G0_1_0_3_9 - 0.00417748917748989*G0_1_0_4_0 - 0.0524753024753113*G0_1_0_4_1 - 0.00592851592851692*G0_1_0_4_2 - 0.0619963369963475*G0_1_0_4_3 + 0.0270496170496216*G0_1_0_4_4 + 0.00164668664668693*G0_1_0_4_5 + 0.00167166167166195*G0_1_0_4_6 + 0.017975357975361*G0_1_0_4_7 - 0.0369547119547182*G0_1_0_4_8 - 0.0109090909090928*G0_1_0_4_9 - 0.000520749092177761*G0_1_0_5_0 - 0.00252247752247802*G0_1_0_5_1 - 0.000326736755308243*G0_1_0_5_2 - 0.00380785880785946*G0_1_0_5_3 + 0.00164668664668693*G0_1_0_5_4 - 0.00070548499119941*G0_1_0_5_5 + 0.00020431949003381*G0_1_0_5_6 + 0.00167166167166197*G0_1_0_5_7 - 0.00331834831834892*G0_1_0_5_8 - 0.000979020979021151*G0_1_0_5_9 - 0.000326736755308234*G0_1_0_6_0 - 0.00252247752247791*G0_1_0_6_1 - 0.000520749092177745*G0_1_0_6_2 - 0.00331834831834887*G0_1_0_6_3 + 0.00167166167166195*G0_1_0_6_4 + 0.00020431949003381*G0_1_0_6_5 - 0.000705484991199398*G0_1_0_6_6 + 0.00164668664668691*G0_1_0_6_7 - 0.00380785880785942*G0_1_0_6_8 - 0.000979020979021146*G0_1_0_6_9 - 0.00592851592851695*G0_1_0_7_0 - 0.0524753024753115*G0_1_0_7_1 - 0.00417748917748988*G0_1_0_7_2 - 0.0369547119547183*G0_1_0_7_3 + 0.017975357975361*G0_1_0_7_4 + 0.00167166167166197*G0_1_0_7_5 + 0.00164668664668691*G0_1_0_7_6 + 0.0270496170496217*G0_1_0_7_7 - 0.0619963369963475*G0_1_0_7_8 - 0.0109090909090928*G0_1_0_7_9 + 0.0135714285714309*G0_1_0_8_0 + 0.113297813297833*G0_1_0_8_1 + 0.00868964368964515*G0_1_0_8_2 + 0.0739094239094365*G0_1_0_8_3 - 0.0369547119547182*G0_1_0_8_4 - 0.00331834831834892*G0_1_0_8_5 - 0.00380785880785942*G0_1_0_8_6 - 0.0619963369963475*G0_1_0_8_7 + 0.147818847818873*G0_1_0_8_8 + 0.0238261738261779*G0_1_0_8_9 + 0.00253857253857298*G0_1_0_9_0 + 0.0166944166944196*G0_1_0_9_1 + 0.00253857253857297*G0_1_0_9_2 + 0.0238261738261779*G0_1_0_9_3 - 0.0109090909090928*G0_1_0_9_4 - 0.000979020979021151*G0_1_0_9_5 - 0.000979020979021146*G0_1_0_9_6 - 0.0109090909090928*G0_1_0_9_7 + 0.0238261738261779*G0_1_0_9_8 + 0.00803196803196939*G0_1_0_9_9; + A[144] = A[176] + 0.297220381029956*G0_0_0_0_0 + 0.0128210413924722*G0_0_0_0_2 - 0.00910835196549648*G0_0_0_0_3 + 0.00286190000475765*G0_0_0_0_4 + 0.142964760107642*G0_0_0_0_5 - 0.0622344850916387*G0_0_0_0_6 + 0.0933601847887721*G0_0_0_0_7 - 0.0546974718403383*G0_0_0_0_8 + 0.0101485815771549*G0_0_0_0_9 - 0.297220381029956*G0_0_0_1_1 - 0.0128210413924721*G0_0_0_1_2 - 0.142964760107642*G0_0_0_1_3 + 0.0622344850916385*G0_0_0_1_4 + 0.00910835196549646*G0_0_0_1_5 - 0.00286190000475766*G0_0_0_1_6 + 0.0546974718403385*G0_0_0_1_7 - 0.0933601847887724*G0_0_0_1_8 - 0.0101485815771548*G0_0_0_1_9 + 0.0128210413924722*G0_0_0_2_0 - 0.0128210413924721*G0_0_0_2_1 - 0.0183418697704443*G0_0_0_2_3 + 0.00621769764627012*G0_0_0_2_4 + 0.0183418697704443*G0_0_0_2_5 - 0.00621769764627013*G0_0_0_2_6 + 0.0160347588919044*G0_0_0_2_7 - 0.0160347588919045*G0_0_0_2_8 - 0.00910835196549648*G0_0_0_3_0 - 0.142964760107642*G0_0_0_3_1 - 0.0183418697704443*G0_0_0_3_2 - 0.140507111935707*G0_0_0_3_3 + 0.0828124256695825*G0_0_0_3_4 + 0.00858570001427288*G0_0_0_3_6 + 0.0273250558964891*G0_0_0_3_7 - 0.0754293325722026*G0_0_0_3_8 - 0.0242043670615141*G0_0_0_3_9 + 0.00286190000475765*G0_0_0_4_0 + 0.0622344850916385*G0_0_0_4_1 + 0.00621769764627012*G0_0_0_4_2 + 0.0828124256695825*G0_0_0_4_3 - 0.0125436468293632*G0_0_0_4_4 - 0.00858570001427291*G0_0_0_4_5 - 0.0283449883449931*G0_0_0_4_7 + 0.0481042766757134*G0_0_0_4_8 + 0.0171714000285459*G0_0_0_4_9 + 0.142964760107642*G0_0_0_5_0 + 0.00910835196549646*G0_0_0_5_1 + 0.0183418697704443*G0_0_0_5_2 - 0.00858570001427291*G0_0_0_5_4 + 0.140507111935708*G0_0_0_5_5 - 0.0828124256695827*G0_0_0_5_6 + 0.0754293325722024*G0_0_0_5_7 - 0.0273250558964891*G0_0_0_5_8 + 0.0242043670615141*G0_0_0_5_9 - 0.0622344850916387*G0_0_0_6_0 - 0.00286190000475766*G0_0_0_6_1 - 0.00621769764627013*G0_0_0_6_2 + 0.00858570001427288*G0_0_0_6_3 - 0.0828124256695827*G0_0_0_6_5 + 0.0125436468293634*G0_0_0_6_6 - 0.0481042766757133*G0_0_0_6_7 + 0.0283449883449931*G0_0_0_6_8 - 0.0171714000285458*G0_0_0_6_9 + 0.0933601847887721*G0_0_0_7_0 + 0.0546974718403385*G0_0_0_7_1 + 0.0160347588919044*G0_0_0_7_2 + 0.0273250558964891*G0_0_0_7_3 - 0.0283449883449931*G0_0_0_7_4 + 0.0754293325722024*G0_0_0_7_5 - 0.0481042766757133*G0_0_0_7_6 + 0.197288425859888*G0_0_0_7_7 + 0.0657628086199625*G0_0_0_7_9 - 0.0546974718403384*G0_0_0_8_0 - 0.0933601847887725*G0_0_0_8_1 - 0.0160347588919045*G0_0_0_8_2 - 0.0754293325722026*G0_0_0_8_3 + 0.0481042766757134*G0_0_0_8_4 - 0.0273250558964891*G0_0_0_8_5 + 0.0283449883449931*G0_0_0_8_6 - 0.197288425859888*G0_0_0_8_8 - 0.0657628086199627*G0_0_0_8_9 + 0.0101485815771549*G0_0_0_9_0 - 0.0101485815771548*G0_0_0_9_1 - 0.0242043670615141*G0_0_0_9_3 + 0.0171714000285459*G0_0_0_9_4 + 0.0242043670615141*G0_0_0_9_5 - 0.0171714000285458*G0_0_0_9_6 + 0.0657628086199626*G0_0_0_9_7 - 0.0657628086199627*G0_0_0_9_8 - 0.0572143200714725*G0_0_1_0_0 - 0.0191058324391691*G0_0_1_0_1 - 0.00483213435594469*G0_0_1_0_2 - 0.005961445961447*G0_0_1_0_3 + 0.00616357187785866*G0_0_1_0_4 - 0.0356824128252759*G0_0_1_0_5 + 0.0172069200640658*G0_0_1_0_6 - 0.0417055959913172*G0_0_1_0_7 + 0.0127516927516948*G0_0_1_0_8 - 0.0101485815771547*G0_0_1_0_9 - 0.0191058324391691*G0_0_1_1_0 - 0.354434701101429*G0_0_1_1_1 - 0.0176531757484168*G0_0_1_1_2 - 0.178647172932918*G0_0_1_1_3 + 0.0794414051557043*G0_0_1_1_4 + 0.00314690600404951*G0_0_1_1_5 + 0.00330167187310096*G0_0_1_1_6 + 0.0674491645920334*G0_0_1_1_7 - 0.13506578078009*G0_0_1_1_8 - 0.0202971631543096*G0_0_1_1_9 - 0.00483213435594469*G0_0_1_2_0 - 0.0176531757484168*G0_0_1_2_1 - 0.00020973735259453*G0_0_1_2_2 - 0.0178784178784209*G0_0_1_2_3 + 0.00386745529602737*G0_0_1_2_4 + 0.000463451892023407*G0_0_1_2_5 - 0.00235024235024275*G0_0_1_2_6 + 0.0146782318210914*G0_0_1_2_7 - 0.00135652707081304*G0_0_1_2_8 + 0.0103921475350064*G0_0_1_2_9 - 0.005961445961447*G0_0_1_3_0 - 0.178647172932918*G0_0_1_3_1 - 0.0178784178784209*G0_0_1_3_2 - 0.164544027401198*G0_0_1_3_3 + 0.0872042243470962*G0_0_1_3_4 - 0.000791589363018046*G0_0_1_3_5 + 0.000121782978925874*G0_0_1_3_6 + 0.0279111364825698*G0_0_1_3_7 - 0.042007516293238*G0_0_1_3_8 + 0.00506921649778861*G0_0_1_3_9 + 0.00616357187785866*G0_0_1_4_0 + 0.0794414051557043*G0_0_1_4_1 + 0.00386745529602737*G0_0_1_4_2 + 0.0872042243470962*G0_0_1_4_3 - 0.00575424575424666*G0_0_1_4_4 - 0.00846391703534705*G0_0_1_4_5 + 0.00834213405642118*G0_0_1_4_6 - 0.0362761048475396*G0_0_1_4_7 + 0.014096379810668*G0_0_1_4_8 - 0.0142486085343251*G0_0_1_4_9 - 0.0356824128252759*G0_0_1_5_0 + 0.00314690600404951*G0_0_1_5_1 + 0.000463451892023407*G0_0_1_5_2 - 0.000791589363018047*G0_0_1_5_3 - 0.00846391703534704*G0_0_1_5_4 - 0.0240369154654909*G0_0_1_5_5 + 0.00439179867751366*G0_0_1_5_6 + 0.0334218162789647*G0_0_1_5_7 + 0.000586080586080726*G0_0_1_5_8 + 0.0292735835593027*G0_0_1_5_9 + 0.0172069200640658*G0_0_1_6_0 + 0.00330167187310096*G0_0_1_6_1 - 0.00235024235024275*G0_0_1_6_2 + 0.000121782978925874*G0_0_1_6_3 + 0.00834213405642118*G0_0_1_6_4 + 0.00439179867751366*G0_0_1_6_5 + 0.0067894010751165*G0_0_1_6_6 - 0.0340078968650454*G0_0_1_6_7 - 0.0079311165025464*G0_0_1_6_8 - 0.0314200085628709*G0_0_1_6_9 - 0.0417055959913173*G0_0_1_7_0 + 0.0674491645920334*G0_0_1_7_1 + 0.0146782318210914*G0_0_1_7_2 + 0.0279111364825698*G0_0_1_7_3 - 0.0362761048475396*G0_0_1_7_4 + 0.0334218162789647*G0_0_1_7_5 - 0.0340078968650454*G0_0_1_7_6 + 0.268744588744634*G0_0_1_7_7 + 0.0145987345987373*G0_0_1_7_8 + 0.098461538461555*G0_0_1_7_9 + 0.0127516927516948*G0_0_1_8_0 - 0.13506578078009*G0_0_1_8_1 - 0.00135652707081304*G0_0_1_8_2 - 0.042007516293238*G0_0_1_8_3 + 0.014096379810668*G0_0_1_8_4 + 0.000586080586080724*G0_0_1_8_5 - 0.0079311165025464*G0_0_1_8_6 + 0.0145987345987373*G0_0_1_8_7 + 0.071456162884746*G0_0_1_8_8 + 0.0326987298415924*G0_0_1_8_9 - 0.0101485815771547*G0_0_1_9_0 - 0.0202971631543096*G0_0_1_9_1 + 0.0103921475350064*G0_0_1_9_2 + 0.00506921649778861*G0_0_1_9_3 - 0.0142486085343251*G0_0_1_9_4 + 0.0292735835593027*G0_0_1_9_5 - 0.0314200085628709*G0_0_1_9_6 + 0.098461538461555*G0_0_1_9_7 + 0.0326987298415924*G0_0_1_9_8 + 0.16988725560157*G0_0_1_9_9 - 0.0572143200714725*G0_1_0_0_0 - 0.0191058324391691*G0_1_0_0_1 - 0.00483213435594469*G0_1_0_0_2 - 0.005961445961447*G0_1_0_0_3 + 0.00616357187785866*G0_1_0_0_4 - 0.0356824128252759*G0_1_0_0_5 + 0.0172069200640658*G0_1_0_0_6 - 0.0417055959913172*G0_1_0_0_7 + 0.0127516927516948*G0_1_0_0_8 - 0.0101485815771547*G0_1_0_0_9 - 0.0191058324391691*G0_1_0_1_0 - 0.354434701101429*G0_1_0_1_1 - 0.0176531757484168*G0_1_0_1_2 - 0.178647172932918*G0_1_0_1_3 + 0.0794414051557043*G0_1_0_1_4 + 0.00314690600404951*G0_1_0_1_5 + 0.00330167187310096*G0_1_0_1_6 + 0.0674491645920334*G0_1_0_1_7 - 0.13506578078009*G0_1_0_1_8 - 0.0202971631543096*G0_1_0_1_9 - 0.00483213435594469*G0_1_0_2_0 - 0.0176531757484168*G0_1_0_2_1 - 0.00020973735259453*G0_1_0_2_2 - 0.0178784178784209*G0_1_0_2_3 + 0.00386745529602737*G0_1_0_2_4 + 0.000463451892023406*G0_1_0_2_5 - 0.00235024235024274*G0_1_0_2_6 + 0.0146782318210914*G0_1_0_2_7 - 0.00135652707081304*G0_1_0_2_8 + 0.0103921475350064*G0_1_0_2_9 - 0.005961445961447*G0_1_0_3_0 - 0.178647172932918*G0_1_0_3_1 - 0.0178784178784209*G0_1_0_3_2 - 0.164544027401198*G0_1_0_3_3 + 0.0872042243470962*G0_1_0_3_4 - 0.000791589363018046*G0_1_0_3_5 + 0.000121782978925874*G0_1_0_3_6 + 0.0279111364825698*G0_1_0_3_7 - 0.042007516293238*G0_1_0_3_8 + 0.00506921649778861*G0_1_0_3_9 + 0.00616357187785866*G0_1_0_4_0 + 0.0794414051557043*G0_1_0_4_1 + 0.00386745529602738*G0_1_0_4_2 + 0.0872042243470962*G0_1_0_4_3 - 0.00575424575424666*G0_1_0_4_4 - 0.00846391703534704*G0_1_0_4_5 + 0.00834213405642118*G0_1_0_4_6 - 0.0362761048475395*G0_1_0_4_7 + 0.014096379810668*G0_1_0_4_8 - 0.0142486085343251*G0_1_0_4_9 - 0.0356824128252759*G0_1_0_5_0 + 0.00314690600404951*G0_1_0_5_1 + 0.000463451892023406*G0_1_0_5_2 - 0.000791589363018047*G0_1_0_5_3 - 0.00846391703534704*G0_1_0_5_4 - 0.0240369154654909*G0_1_0_5_5 + 0.00439179867751366*G0_1_0_5_6 + 0.0334218162789646*G0_1_0_5_7 + 0.000586080586080726*G0_1_0_5_8 + 0.0292735835593027*G0_1_0_5_9 + 0.0172069200640658*G0_1_0_6_0 + 0.00330167187310096*G0_1_0_6_1 - 0.00235024235024274*G0_1_0_6_2 + 0.000121782978925874*G0_1_0_6_3 + 0.00834213405642118*G0_1_0_6_4 + 0.00439179867751367*G0_1_0_6_5 + 0.00678940107511649*G0_1_0_6_6 - 0.0340078968650453*G0_1_0_6_7 - 0.0079311165025464*G0_1_0_6_8 - 0.0314200085628709*G0_1_0_6_9 - 0.0417055959913173*G0_1_0_7_0 + 0.0674491645920334*G0_1_0_7_1 + 0.0146782318210914*G0_1_0_7_2 + 0.0279111364825698*G0_1_0_7_3 - 0.0362761048475395*G0_1_0_7_4 + 0.0334218162789646*G0_1_0_7_5 - 0.0340078968650453*G0_1_0_7_6 + 0.268744588744634*G0_1_0_7_7 + 0.0145987345987374*G0_1_0_7_8 + 0.098461538461555*G0_1_0_7_9 + 0.0127516927516948*G0_1_0_8_0 - 0.13506578078009*G0_1_0_8_1 - 0.00135652707081304*G0_1_0_8_2 - 0.042007516293238*G0_1_0_8_3 + 0.014096379810668*G0_1_0_8_4 + 0.000586080586080727*G0_1_0_8_5 - 0.0079311165025464*G0_1_0_8_6 + 0.0145987345987374*G0_1_0_8_7 + 0.071456162884746*G0_1_0_8_8 + 0.0326987298415924*G0_1_0_8_9 - 0.0101485815771547*G0_1_0_9_0 - 0.0202971631543096*G0_1_0_9_1 + 0.0103921475350064*G0_1_0_9_2 + 0.00506921649778861*G0_1_0_9_3 - 0.0142486085343251*G0_1_0_9_4 + 0.0292735835593027*G0_1_0_9_5 - 0.0314200085628709*G0_1_0_9_6 + 0.098461538461555*G0_1_0_9_7 + 0.0326987298415924*G0_1_0_9_8 + 0.16988725560157*G0_1_0_9_9 + 0.0404657776086415*G0_1_1_0_0 - 0.0191058324391691*G0_1_1_0_1 + 0.000619063476206426*G0_1_1_0_2 - 0.0243075443075485*G0_1_1_0_3 + 0.0109283309283328*G0_1_1_0_4 + 0.0284143369857703*G0_1_1_0_5 - 0.0129157614871922*G0_1_1_0_6 + 0.0980826580826746*G0_1_1_0_7 - 0.0722714322714445*G0_1_1_0_8 - 0.000142080142080146*G0_1_1_0_9 - 0.0191058324391691*G0_1_1_1_0 - 0.452114798781543*G0_1_1_1_1 - 0.0231043735805679*G0_1_1_1_2 - 0.242743922743964*G0_1_1_1_3 + 0.109564086706962*G0_1_1_1_4 + 0.0214930043501509*G0_1_1_1_5 - 0.0014630871773732*G0_1_1_1_6 + 0.152472289615173*G0_1_1_1_7 - 0.274854034854082*G0_1_1_1_8 - 0.0303036645893841*G0_1_1_1_9 + 0.000619063476206426*G0_1_1_2_0 - 0.0231043735805679*G0_1_1_2_1 - 0.000209737352594521*G0_1_1_2_2 - 0.0345694517123147*G0_1_1_2_3 + 0.0102872788587091*G0_1_1_2_4 + 0.0171544857259172*G0_1_1_2_5 - 0.00877006591292452*G0_1_1_2_6 + 0.0449362277933781*G0_1_1_2_7 - 0.0316145230430998*G0_1_1_2_8 + 0.0103921475350064*G0_1_1_2_9 - 0.0243075443075485*G0_1_1_3_0 - 0.242743922743964*G0_1_1_3_1 - 0.0345694517123147*G0_1_1_3_2 - 0.31024213881362*G0_1_1_3_3 + 0.153796679510991*G0_1_1_3_4 - 0.000791589363018069*G0_1_1_3_5 + 0.0144160601303483*G0_1_1_3_6 + 0.082949431520874*G0_1_1_3_7 - 0.187819799248402*G0_1_1_3_8 - 0.0749878692735963*G0_1_1_3_9 + 0.0109283309283328*G0_1_1_4_0 + 0.109564086706962*G0_1_1_4_1 + 0.0102872788587091*G0_1_1_4_2 + 0.153796679510991*G0_1_1_4_3 - 0.034586366014943*G0_1_1_4_4 - 0.0227581941867695*G0_1_1_4_5 + 0.00834213405642121*G0_1_1_4_6 - 0.0888102373816809*G0_1_1_4_7 + 0.104870367727528*G0_1_1_4_8 + 0.0143399457685197*G0_1_1_4_9 + 0.0284143369857703*G0_1_1_5_0 + 0.0214930043501509*G0_1_1_5_1 + 0.0171544857259172*G0_1_1_5_2 - 0.000791589363018068*G0_1_1_5_3 - 0.0227581941867695*G0_1_1_5_4 + 0.12166119594693*G0_1_1_5_5 - 0.0622006564863811*G0_1_1_5_6 + 0.179234099234129*G0_1_1_5_7 - 0.0544522144522234*G0_1_1_5_8 + 0.109330669330688*G0_1_1_5_9 - 0.0129157614871922*G0_1_1_6_0 - 0.0014630871773732*G0_1_1_6_1 - 0.00877006591292452*G0_1_1_6_2 + 0.0144160601303483*G0_1_1_6_3 + 0.00834213405642121*G0_1_1_6_4 - 0.0622006564863811*G0_1_1_6_5 + 0.035621521335813*G0_1_1_6_6 - 0.124781884781906*G0_1_1_6_7 + 0.0446030160315948*G0_1_1_6_8 - 0.0600085628657158*G0_1_1_6_9 + 0.0980826580826746*G0_1_1_7_0 + 0.152472289615173*G0_1_1_7_1 + 0.0449362277933781*G0_1_1_7_2 + 0.082949431520874*G0_1_1_7_3 - 0.0888102373816809*G0_1_1_7_4 + 0.179234099234129*G0_1_1_7_5 - 0.124781884781906*G0_1_1_7_6 + 0.665787545787658*G0_1_1_7_7 + 0.0145987345987374*G0_1_1_7_8 + 0.249990009990052*G0_1_1_7_9 - 0.0722714322714445*G0_1_1_8_0 - 0.274854034854082*G0_1_1_8_1 - 0.0316145230430998*G0_1_1_8_2 - 0.187819799248402*G0_1_1_8_3 + 0.104870367727528*G0_1_1_8_4 - 0.0544522144522234*G0_1_1_8_5 + 0.0446030160315948*G0_1_1_8_6 + 0.0145987345987374*G0_1_1_8_7 - 0.325586794158278*G0_1_1_8_8 - 0.118829741686905*G0_1_1_8_9 - 0.000142080142080144*G0_1_1_9_0 - 0.0303036645893841*G0_1_1_9_1 + 0.0103921475350064*G0_1_1_9_2 - 0.0749878692735963*G0_1_1_9_3 + 0.0143399457685197*G0_1_1_9_4 + 0.109330669330688*G0_1_1_9_5 - 0.0600085628657158*G0_1_1_9_6 + 0.249990009990052*G0_1_1_9_7 - 0.118829741686905*G0_1_1_9_8 + 0.16988725560157*G0_1_1_9_9; + A[89] = 0.000420602325364301*G0_0_0_0_0 + 0.00640149973483411*G0_0_0_0_2 + 0.00149945292802465*G0_0_0_0_3 - 0.0105494505494525*G0_0_0_0_4 - 0.0076647162361461*G0_0_0_0_5 + 0.024775224775229*G0_0_0_0_6 - 0.000339977482834675*G0_0_0_0_7 + 6.34286348572176e-05*G0_0_0_0_8 + 0.000837257980115245*G0_0_0_0_9 - 0.000420602325364321*G0_0_0_1_1 - 0.00640149973483421*G0_0_0_1_2 + 0.00766471623614616*G0_0_0_1_3 - 0.0247752247752291*G0_0_0_1_4 - 0.0014994529280246*G0_0_0_1_5 + 0.0105494505494523*G0_0_0_1_6 - 6.34286348572107e-05*G0_0_0_1_7 + 0.000339977482834681*G0_0_0_1_8 - 0.000837257980115282*G0_0_0_1_9 + 0.00640149973483411*G0_0_0_2_0 - 0.00640149973483421*G0_0_0_2_1 + 0.0333888333888393*G0_0_0_2_3 - 0.0966144966145137*G0_0_0_2_4 - 0.0333888333888388*G0_0_0_2_5 + 0.0966144966145126*G0_0_0_2_6 + 0.000213120213120266*G0_0_0_2_7 - 0.00021312021312023*G0_0_0_2_8 + 0.00149945292802465*G0_0_0_3_0 + 0.00766471623614616*G0_0_0_3_1 + 0.0333888333888393*G0_0_0_3_2 - 0.0274925074925124*G0_0_0_3_3 + 0.121158841158862*G0_0_0_3_4 - 0.0316483516483567*G0_0_0_3_6 - 0.00449835878407383*G0_0_0_3_7 + 0.00385899814471305*G0_0_0_3_8 + 0.0115084915084935*G0_0_0_3_9 - 0.0105494505494525*G0_0_0_4_0 - 0.0247752247752291*G0_0_0_4_1 - 0.0966144966145137*G0_0_0_4_2 + 0.121158841158862*G0_0_0_4_3 - 0.495504495504581*G0_0_0_4_4 + 0.0316483516483572*G0_0_0_4_5 + 0.0155044955044981*G0_0_0_4_7 + 0.000639360639360781*G0_0_0_4_8 - 0.0632967032967141*G0_0_0_4_9 - 0.0076647162361461*G0_0_0_5_0 - 0.0014994529280246*G0_0_0_5_1 - 0.0333888333888388*G0_0_0_5_2 + 0.0316483516483572*G0_0_0_5_4 + 0.027492507492512*G0_0_0_5_5 - 0.121158841158862*G0_0_0_5_6 - 0.0038589981447131*G0_0_0_5_7 + 0.00449835878407381*G0_0_0_5_8 - 0.0115084915084934*G0_0_0_5_9 + 0.024775224775229*G0_0_0_6_0 + 0.0105494505494523*G0_0_0_6_1 + 0.0966144966145126*G0_0_0_6_2 - 0.0316483516483567*G0_0_0_6_3 - 0.121158841158862*G0_0_0_6_5 + 0.495504495504579*G0_0_0_6_6 - 0.000639360639360687*G0_0_0_6_7 - 0.015504495504498*G0_0_0_6_8 + 0.0632967032967136*G0_0_0_6_9 - 0.000339977482834675*G0_0_0_7_0 - 6.34286348572107e-05*G0_0_0_7_1 + 0.000213120213120266*G0_0_0_7_2 - 0.00449835878407383*G0_0_0_7_3 + 0.0155044955044981*G0_0_0_7_4 - 0.0038589981447131*G0_0_0_7_5 - 0.000639360639360688*G0_0_0_7_6 - 0.0036991579848729*G0_0_0_7_7 - 0.00123305266162428*G0_0_0_7_9 + 6.34286348572176e-05*G0_0_0_8_0 + 0.000339977482834681*G0_0_0_8_1 - 0.00021312021312023*G0_0_0_8_2 + 0.00385899814471305*G0_0_0_8_3 + 0.000639360639360781*G0_0_0_8_4 + 0.00449835878407381*G0_0_0_8_5 - 0.015504495504498*G0_0_0_8_6 + 0.00369915798487285*G0_0_0_8_8 + 0.00123305266162431*G0_0_0_8_9 + 0.000837257980115245*G0_0_0_9_0 - 0.000837257980115282*G0_0_0_9_1 + 0.0115084915084935*G0_0_0_9_3 - 0.0632967032967141*G0_0_0_9_4 - 0.0115084915084934*G0_0_0_9_5 + 0.0632967032967136*G0_0_0_9_6 - 0.00123305266162428*G0_0_0_9_7 + 0.00123305266162431*G0_0_0_9_8 - 0.00249204058727912*G0_0_1_0_0 - 0.00204606680797193*G0_0_1_0_1 - 0.00900038233371722*G0_0_1_0_2 + 0.00926058068915372*G0_0_1_0_3 - 0.0255845741560072*G0_0_1_0_4 + 0.00812140240711809*G0_0_1_0_5 - 0.01460634603492*G0_0_1_0_6 + 0.000994560994561167*G0_0_1_0_7 + 0.00127618413332721*G0_0_1_0_8 - 0.00866181437610158*G0_0_1_0_9 - 0.00204606680797193*G0_0_1_1_0 - 0.00291264291264341*G0_0_1_1_1 - 0.0154018820685514*G0_0_1_1_2 + 0.0157861186432642*G0_0_1_1_3 - 0.039381570810149*G0_0_1_1_4 + 0.00776112776112909*G0_0_1_1_5 - 0.0150351236065548*G0_0_1_1_6 + 0.00121275549846998*G0_0_1_1_7 + 0.00133453847739586*G0_0_1_1_8 - 0.00949907235621683*G0_0_1_1_9 - 0.00900038233371722*G0_0_1_2_0 - 0.0154018820685514*G0_0_1_2_1 - 0.133358000024689*G0_0_1_2_2 + 0.0715373515373637*G0_0_1_2_3 - 0.1712065712066*G0_0_1_2_4 + 0.0381485181485246*G0_0_1_2_5 - 0.0745920745920872*G0_0_1_2_6 + 0.00360528360528421*G0_0_1_2_7 + 0.00339216339216396*G0_0_1_2_8 - 0.0230169830169869*G0_0_1_2_9 + 0.00926058068915372*G0_0_1_3_0 + 0.0157861186432642*G0_0_1_3_1 + 0.0715373515373637*G0_0_1_3_2 - 0.0626801769659019*G0_0_1_3_3 + 0.181738261738293*G0_0_1_3_4 - 0.0358270301127505*G0_0_1_3_5 + 0.0656943056943168*G0_0_1_3_6 - 0.0071928071928084*G0_0_1_3_7 - 0.00321963750535231*G0_0_1_3_8 + 0.0428828314542673*G0_0_1_3_9 - 0.0255845741560072*G0_0_1_4_0 - 0.039381570810149*G0_0_1_4_1 - 0.1712065712066*G0_0_1_4_2 + 0.181738261738293*G0_0_1_4_3 - 0.616183816183921*G0_0_1_4_4 + 0.0973426573426739*G0_0_1_4_5 - 0.163036963036991*G0_0_1_4_6 + 0.0226744683887579*G0_0_1_4_7 + 0.0104124446981607*G0_0_1_4_8 - 0.125634365634387*G0_0_1_4_9 + 0.00812140240711809*G0_0_1_5_0 + 0.00776112776112909*G0_0_1_5_1 + 0.0381485181485246*G0_0_1_5_2 - 0.0358270301127505*G0_0_1_5_3 + 0.0973426573426739*G0_0_1_5_4 - 0.0351876694733898*G0_0_1_5_5 + 0.0605794205794308*G0_0_1_5_6 - 0.00707863565006542*G0_0_1_5_7 - 0.00269444840873456*G0_0_1_5_8 + 0.0313743399457738*G0_0_1_5_9 - 0.01460634603492*G0_0_1_6_0 - 0.0150351236065548*G0_0_1_6_1 - 0.0745920745920872*G0_0_1_6_2 + 0.0656943056943168*G0_0_1_6_3 - 0.163036963036991*G0_0_1_6_4 + 0.0605794205794308*G0_0_1_6_5 - 0.120679320679341*G0_0_1_6_6 + 0.00977308405879999*G0_0_1_6_7 + 0.00716997288425979*G0_0_1_6_8 - 0.0623376623376729*G0_0_1_6_9 + 0.000994560994561166*G0_0_1_7_0 + 0.00121275549846998*G0_0_1_7_1 + 0.00360528360528421*G0_0_1_7_2 - 0.0071928071928084*G0_0_1_7_3 + 0.0226744683887579*G0_0_1_7_4 - 0.00707863565006542*G0_0_1_7_5 + 0.00977308405879999*G0_0_1_7_6 - 0.00970458113315405*G0_0_1_7_7 - 0.000867703724846723*G0_0_1_7_8 + 0.00643927501070466*G0_0_1_7_9 + 0.00127618413332721*G0_0_1_8_0 + 0.00133453847739586*G0_0_1_8_1 + 0.00339216339216396*G0_0_1_8_2 - 0.00321963750535231*G0_0_1_8_3 + 0.0104124446981607*G0_0_1_8_4 - 0.00269444840873456*G0_0_1_8_5 + 0.00716997288425979*G0_0_1_8_6 - 0.000867703724846723*G0_0_1_8_7 - 0.00600542314828106*G0_0_1_8_8 + 0.00767232767232902*G0_0_1_8_9 - 0.00866181437610158*G0_0_1_9_0 - 0.00949907235621683*G0_0_1_9_1 - 0.0230169830169869*G0_0_1_9_2 + 0.0428828314542673*G0_0_1_9_3 - 0.125634365634387*G0_0_1_9_4 + 0.0313743399457738*G0_0_1_9_5 - 0.0623376623376729*G0_0_1_9_6 + 0.00643927501070466*G0_0_1_9_7 + 0.00767232767232902*G0_0_1_9_8 - 0.0780933352362056*G0_0_1_9_9 - 0.00197220768649375*G0_1_0_0_0 - 0.000323908895337526*G0_1_0_0_1 - 0.000106560106560146*G0_1_0_0_2 + 0.00291264291264343*G0_1_0_0_3 - 0.0338810395953312*G0_1_0_0_4 + 0.0044856730571024*G0_1_0_0_5 - 0.00208299636871102*G0_1_0_0_6 + 0.00223015080157975*G0_1_0_0_7 + 0.000829646543932415*G0_1_0_0_8 - 0.0141116026830337*G0_1_0_0_9 - 0.000323908895337527*G0_1_0_1_0 + 0.00376512376512446*G0_1_0_1_1 - 0.00750064750064881*G0_1_0_1_2 + 0.0134417962989415*G0_1_0_1_3 - 0.0263964606821796*G0_1_0_1_4 + 0.0024026766883914*G0_1_0_1_5 + 0.00208299636871099*G0_1_0_1_6 - 0.00135990993133875*G0_1_0_1_7 + 0.00431822146107938*G0_1_0_1_8 + 0.000334903192046096*G0_1_0_1_9 - 0.000106560106560146*G0_1_0_2_0 - 0.00750064750064881*G0_1_0_2_1 - 0.0337440337440397*G0_1_0_2_2 + 0.038326118326125*G0_1_0_2_3 - 0.079209679209693*G0_1_0_2_4 + 0.000319680319680421*G0_1_0_2_5 - 0.00065712065712077*G0_1_0_2_7 + 0.00163392163392191*G0_1_0_2_8 - 0.00063936063936078*G0_1_0_2_9 + 0.00291264291264343*G0_1_0_3_0 + 0.0134417962989415*G0_1_0_3_1 + 0.038326118326125*G0_1_0_3_2 - 0.0758327386898944*G0_1_0_3_3 + 0.116523476523496*G0_1_0_3_4 - 0.0115769944341393*G0_1_0_3_5 + 0.000959040959041214*G0_1_0_3_6 - 0.00152989867275608*G0_1_0_3_7 - 0.000776366490652322*G0_1_0_3_8 + 0.00205508776937382*G0_1_0_3_9 - 0.0338810395953312*G0_1_0_4_0 - 0.0263964606821796*G0_1_0_4_1 - 0.079209679209693*G0_1_0_4_2 + 0.116523476523496*G0_1_0_4_3 - 0.988291708291877*G0_1_0_4_4 + 0.108851148851167*G0_1_0_4_5 - 0.109810189810209*G0_1_0_4_6 + 0.0482032253460907*G0_1_0_4_7 + 0.00230626516340843*G0_1_0_4_8 - 0.215784215784252*G0_1_0_4_9 + 0.0044856730571024*G0_1_0_5_0 + 0.0024026766883914*G0_1_0_5_1 + 0.000319680319680421*G0_1_0_5_2 - 0.0115769944341393*G0_1_0_5_3 + 0.108851148851167*G0_1_0_5_4 - 0.0106179534750981*G0_1_0_5_5 - 0.000959040959041005*G0_1_0_5_6 - 0.00917939203653646*G0_1_0_5_7 + 0.042334808049101*G0_1_0_5_9 - 0.00208299636871102*G0_1_0_6_0 + 0.002082996368711*G0_1_0_6_1 + 0.000959040959041202*G0_1_0_6_3 - 0.109810189810209*G0_1_0_6_4 - 0.000959040959041005*G0_1_0_6_5 + 0.109810189810209*G0_1_0_6_6 + 0.00917939203653649*G0_1_0_6_7 - 0.00917939203653644*G0_1_0_6_8 + 0.00223015080157975*G0_1_0_7_0 - 0.00135990993133875*G0_1_0_7_1 - 0.00065712065712077*G0_1_0_7_2 - 0.00152989867275608*G0_1_0_7_3 + 0.0482032253460907*G0_1_0_7_4 - 0.00917939203653646*G0_1_0_7_5 + 0.00917939203653649*G0_1_0_7_6 - 0.00742115027829452*G0_1_0_7_7 - 0.00248893963179723*G0_1_0_7_8 + 0.023976023976028*G0_1_0_7_9 + 0.000829646543932415*G0_1_0_8_0 + 0.00431822146107938*G0_1_0_8_1 + 0.00163392163392191*G0_1_0_8_2 - 0.000776366490652322*G0_1_0_8_3 + 0.00230626516340843*G0_1_0_8_4 - 0.00917939203653644*G0_1_0_8_6 - 0.00248893963179723*G0_1_0_8_7 + 0.0131297274154439*G0_1_0_8_8 - 0.00561723990295513*G0_1_0_8_9 - 0.0141116026830337*G0_1_0_9_0 + 0.000334903192046095*G0_1_0_9_1 - 0.00063936063936078*G0_1_0_9_2 + 0.00205508776937382*G0_1_0_9_3 - 0.215784215784252*G0_1_0_9_4 + 0.042334808049101*G0_1_0_9_5 + 0.023976023976028*G0_1_0_9_7 - 0.00561723990295513*G0_1_0_9_8 - 0.0846696160982018*G0_1_0_9_9 - 0.00571365142793813*G0_1_1_0_0 - 0.00365518079803858*G0_1_1_0_1 - 0.0045567131281425*G0_1_1_0_2 + 0.00293294007579774*G0_1_1_0_3 - 0.0386940044082968*G0_1_1_0_4 + 0.0107980907980926*G0_1_1_0_5 - 0.0144490430204741*G0_1_1_0_6 + 0.00714206428492262*G0_1_1_0_7 - 0.00246356817785434*G0_1_1_0_8 - 0.0170648399219857*G0_1_1_0_9 - 0.00365518079803858*G0_1_1_1_0 - 0.0133081733081757*G0_1_1_1_1 - 0.0111076225361959*G0_1_1_1_2 + 0.0167654567654596*G0_1_1_1_3 - 0.0365754880040657*G0_1_1_1_4 + 0.00605362891077282*G0_1_1_1_5 - 0.0123660466517631*G0_1_1_1_6 + 0.00874807731950739*G0_1_1_1_7 - 0.0112243312243332*G0_1_1_1_8 - 0.00243565957851717*G0_1_1_1_9 - 0.0045567131281425*G0_1_1_2_0 - 0.0111076225361959*G0_1_1_2_1 - 0.0595552595552697*G0_1_1_2_2 + 0.0485381285381368*G0_1_1_2_3 - 0.111834831834851*G0_1_1_2_4 + 0.0176356976357006*G0_1_1_2_5 - 0.0349517149517209*G0_1_1_2_6 + 4.82057624914855e-05*G0_1_1_2_7 - 0.0040086897229761*G0_1_1_2_8 - 0.02568098568099*G0_1_1_2_9 + 0.00293294007579774*G0_1_1_3_0 + 0.0167654567654596*G0_1_1_3_1 + 0.0485381285381368*G0_1_1_3_2 - 0.145317539603278*G0_1_1_3_3 + 0.182948480091368*G0_1_1_3_4 - 0.024775224775229*G0_1_1_3_5 + 0.0596888825460355*G0_1_1_3_6 + 0.0137919223633533*G0_1_1_3_7 - 0.0484087341230279*G0_1_1_3_8 - 0.0202768659911551*G0_1_1_3_9 - 0.0386940044082968*G0_1_1_4_0 - 0.0365754880040657*G0_1_1_4_1 - 0.111834831834851*G0_1_1_4_2 + 0.182948480091368*G0_1_1_4_3 - 1.0555844155846*G0_1_1_4_4 + 0.138672755815636*G0_1_1_4_5 - 0.198361638361672*G0_1_1_4_6 + 0.0466733266733345*G0_1_1_4_7 + 0.0346168117596747*G0_1_1_4_8 - 0.200302554588303*G0_1_1_4_9 + 0.0107980907980926*G0_1_1_5_0 + 0.00605362891077282*G0_1_1_5_1 + 0.0176356976357006*G0_1_1_5_2 - 0.024775224775229*G0_1_1_5_3 + 0.138672755815636*G0_1_1_5_4 - 0.0455316112459046*G0_1_1_5_5 + 0.0587298415869944*G0_1_1_5_6 - 0.0268759811616999*G0_1_1_5_7 + 0.00442985585842804*G0_1_1_5_8 + 0.042334808049101*G0_1_1_5_9 - 0.0144490430204741*G0_1_1_6_0 - 0.0123660466517631*G0_1_1_6_1 - 0.0349517149517209*G0_1_1_6_2 + 0.0596888825460355*G0_1_1_6_3 - 0.198361638361672*G0_1_1_6_4 + 0.0587298415869944*G0_1_1_6_5 - 0.0885514485514636*G0_1_1_6_6 + 0.0224461253032719*G0_1_1_6_7 + 0.0132667332667355*G0_1_1_6_8 - 0.042334808049101*G0_1_1_6_9 + 0.00714206428492262*G0_1_1_7_0 + 0.00874807731950739*G0_1_1_7_1 + 4.82057624914851e-05*G0_1_1_7_2 + 0.0137919223633533*G0_1_1_7_3 + 0.0466733266733345*G0_1_1_7_4 - 0.0268759811616999*G0_1_1_7_5 + 0.0224461253032719*G0_1_1_7_6 - 0.119012416155293*G0_1_1_7_7 + 0.01580134151563*G0_1_1_7_8 + 0.00630226915941309*G0_1_1_7_9 - 0.00246356817785434*G0_1_1_8_0 - 0.0112243312243332*G0_1_1_8_1 - 0.0040086897229761*G0_1_1_8_2 - 0.0484087341230279*G0_1_1_8_3 + 0.0346168117596747*G0_1_1_8_4 + 0.00442985585842804*G0_1_1_8_5 + 0.0132667332667355*G0_1_1_8_6 + 0.01580134151563*G0_1_1_8_7 - 0.214368488654239*G0_1_1_8_8 - 0.0619266447837981*G0_1_1_8_9 - 0.0170648399219857*G0_1_1_9_0 - 0.00243565957851717*G0_1_1_9_1 - 0.02568098568099*G0_1_1_9_2 - 0.0202768659911551*G0_1_1_9_3 - 0.200302554588303*G0_1_1_9_4 + 0.042334808049101*G0_1_1_9_5 - 0.042334808049101*G0_1_1_9_6 + 0.0063022691594131*G0_1_1_9_7 - 0.0619266447837981*G0_1_1_9_8 - 0.299220779220829*G0_1_1_9_9; + A[195] = A[181] + 0.0250297850297893*G0_0_0_0_0 + 0.00250842631795056*G0_0_0_0_2 - 0.00395223823795321*G0_0_0_0_3 + 0.000271157414014602*G0_0_0_0_4 + 0.0324307438593209*G0_0_0_0_5 - 0.013543282114713*G0_0_0_0_6 + 0.00663685520828493*G0_0_0_0_7 - 0.0044882102024967*G0_0_0_0_8 - 0.00266780838209453*G0_0_0_0_9 - 0.0250297850297895*G0_0_0_1_1 - 0.00250842631795056*G0_0_0_1_2 - 0.0324307438593209*G0_0_0_1_3 + 0.013543282114713*G0_0_0_1_4 + 0.00395223823795318*G0_0_0_1_5 - 0.000271157414014599*G0_0_0_1_6 + 0.00448821020249673*G0_0_0_1_7 - 0.006636855208285*G0_0_0_1_8 + 0.00266780838209451*G0_0_0_1_9 + 0.00250842631795056*G0_0_0_2_0 - 0.00250842631795056*G0_0_0_2_1 - 0.0069035726178595*G0_0_0_2_3 + 0.00423956995385636*G0_0_0_2_4 + 0.00690357261785951*G0_0_0_2_5 - 0.00423956995385638*G0_0_0_2_6 + 0.00233956519670845*G0_0_0_2_7 - 0.00233956519670846*G0_0_0_2_8 - 0.00395223823795321*G0_0_0_3_0 - 0.0324307438593209*G0_0_0_3_1 - 0.0069035726178595*G0_0_0_3_2 - 0.147315541601281*G0_0_0_3_3 + 0.0278892536035441*G0_0_0_3_4 + 0.000813472242043821*G0_0_0_3_6 + 0.0118567147138596*G0_0_0_3_7 - 0.018875410303985*G0_0_0_3_8 - 0.0317168545740028*G0_0_0_3_9 + 0.000271157414014602*G0_0_0_4_0 + 0.013543282114713*G0_0_0_4_1 + 0.00423956995385636*G0_0_0_4_2 + 0.0278892536035441*G0_0_0_4_3 - 0.0295418866847488*G0_0_0_4_4 - 0.000813472242043812*G0_0_0_4_5 - 0.00391608391608459*G0_0_0_4_7 + 0.00701869559012539*G0_0_0_4_8 + 0.00162694448408762*G0_0_0_4_9 + 0.0324307438593209*G0_0_0_5_0 + 0.00395223823795318*G0_0_0_5_1 + 0.00690357261785951*G0_0_0_5_2 - 0.000813472242043812*G0_0_0_5_4 + 0.147315541601281*G0_0_0_5_5 - 0.027889253603544*G0_0_0_5_6 + 0.0188754103039849*G0_0_0_5_7 - 0.0118567147138595*G0_0_0_5_8 + 0.0317168545740028*G0_0_0_5_9 - 0.013543282114713*G0_0_0_6_0 - 0.000271157414014599*G0_0_0_6_1 - 0.00423956995385638*G0_0_0_6_2 + 0.000813472242043821*G0_0_0_6_3 - 0.027889253603544*G0_0_0_6_5 + 0.0295418866847488*G0_0_0_6_6 - 0.00701869559012533*G0_0_0_6_7 + 0.00391608391608459*G0_0_0_6_8 - 0.00162694448408764*G0_0_0_6_9 + 0.00663685520828493*G0_0_0_7_0 + 0.00448821020249673*G0_0_0_7_1 + 0.00233956519670845*G0_0_0_7_2 + 0.0118567147138596*G0_0_0_7_3 - 0.00391608391608459*G0_0_0_7_4 + 0.0188754103039849*G0_0_0_7_5 - 0.00701869559012533*G0_0_0_7_6 + 0.0042643071214507*G0_0_0_7_7 + 0.0220408163265343*G0_0_0_7_9 - 0.0044882102024967*G0_0_0_8_0 - 0.006636855208285*G0_0_0_8_1 - 0.00233956519670846*G0_0_0_8_2 - 0.018875410303985*G0_0_0_8_3 + 0.00701869559012539*G0_0_0_8_4 - 0.0118567147138595*G0_0_0_8_5 + 0.00391608391608459*G0_0_0_8_6 - 0.0042643071214508*G0_0_0_8_8 - 0.0220408163265344*G0_0_0_8_9 - 0.00266780838209453*G0_0_0_9_0 + 0.00266780838209451*G0_0_0_9_1 - 0.0317168545740028*G0_0_0_9_3 + 0.00162694448408762*G0_0_0_9_4 + 0.0317168545740028*G0_0_0_9_5 - 0.00162694448408764*G0_0_0_9_6 + 0.0220408163265343*G0_0_0_9_7 - 0.0220408163265344*G0_0_0_9_8 + 0.0166006832673528*G0_0_1_0_0 + 0.000395865157769986*G0_0_1_0_1 + 0.00175593366069587*G0_0_1_0_2 - 0.00237381665953135*G0_0_1_0_3 - 0.000593216307502128*G0_0_1_0_4 + 0.0206160506160541*G0_0_1_0_5 - 0.00732600732600858*G0_0_1_0_6 + 0.00437007437007513*G0_0_1_0_7 - 0.00293928293928344*G0_0_1_0_8 - 0.00254412254412297*G0_0_1_0_9 + 0.000395865157769986*G0_0_1_1_0 - 0.00842910176243652*G0_0_1_1_1 - 0.000752492657254687*G0_0_1_1_2 - 0.0118146932432667*G0_0_1_1_3 + 0.0062172747887044*G0_0_1_1_4 + 0.00157842157842184*G0_0_1_1_5 - 0.000864373721516725*G0_0_1_1_6 + 0.00154892726321325*G0_0_1_1_7 - 0.0022667808382098*G0_0_1_1_8 + 0.000123685837971563*G0_0_1_1_9 + 0.00175593366069587*G0_0_1_2_0 - 0.000752492657254687*G0_0_1_2_1 + 0.00152736152736176*G0_0_1_2_2 - 0.00327418613132953*G0_0_1_2_3 + 0.00538762824477199*G0_0_1_2_4 + 0.00362938648652996*G0_0_1_2_5 + 0.00114805829091562*G0_0_1_2_6 + 0.00142286285143452*G0_0_1_2_7 - 0.000916702345273927*G0_0_1_2_8 + 0.00415584415584486*G0_0_1_2_9 - 0.00237381665953135*G0_0_1_3_0 - 0.0118146932432667*G0_0_1_3_1 - 0.00327418613132953*G0_0_1_3_2 - 0.101121735407467*G0_0_1_3_3 + 0.00439417725132085*G0_0_1_3_4 + 0.00162694448408759*G0_0_1_3_5 + 0.00172541743970345*G0_0_1_3_6 + 0.0062537462537473*G0_0_1_3_7 - 0.00813614956472234*G0_0_1_3_8 - 0.0128785500214093*G0_0_1_3_9 - 0.000593216307502128*G0_0_1_4_0 + 0.0062172747887044*G0_0_1_4_1 + 0.00538762824477199*G0_0_1_4_2 + 0.00439417725132085*G0_0_1_4_3 - 0.0190466676180994*G0_0_1_4_4 + 0.00091194519765964*G0_0_1_4_5 - 0.00263736263736309*G0_0_1_4_6 - 0.000810617953475235*G0_0_1_4_7 + 0.00188240331097505*G0_0_1_4_8 - 0.0142914228628539*G0_0_1_4_9 + 0.0206160506160541*G0_0_1_5_0 + 0.00157842157842184*G0_0_1_5_1 + 0.00362938648652996*G0_0_1_5_2 + 0.00162694448408759*G0_0_1_5_3 + 0.00091194519765964*G0_0_1_5_4 + 0.0461938061938139*G0_0_1_5_5 - 0.0234950763522232*G0_0_1_5_6 + 0.0107392607392626*G0_0_1_5_7 - 0.00560296846011226*G0_0_1_5_8 + 0.0188383045525935*G0_0_1_5_9 - 0.00732600732600858*G0_0_1_6_0 - 0.000864373721516725*G0_0_1_6_1 + 0.00114805829091562*G0_0_1_6_2 + 0.00172541743970345*G0_0_1_6_3 - 0.00263736263736309*G0_0_1_6_4 - 0.0234950763522232*G0_0_1_6_5 + 0.0104952190666494*G0_0_1_6_6 - 0.00513629227915029*G0_0_1_6_7 + 0.00310546596260935*G0_0_1_6_8 - 0.0159183673469415*G0_0_1_6_9 + 0.00437007437007513*G0_0_1_7_0 + 0.00154892726321325*G0_0_1_7_1 + 0.00142286285143452*G0_0_1_7_2 + 0.0062537462537473*G0_0_1_7_3 - 0.000810617953475235*G0_0_1_7_4 + 0.0107392607392625*G0_0_1_7_5 - 0.00513629227915029*G0_0_1_7_6 + 0.00645354645354762*G0_0_1_7_7 - 0.000610817753675026*G0_0_1_7_8 + 0.0179049521906695*G0_0_1_7_9 - 0.00293928293928344*G0_0_1_8_0 - 0.0022667808382098*G0_0_1_8_1 - 0.000916702345273927*G0_0_1_8_2 - 0.00813614956472234*G0_0_1_8_3 + 0.00188240331097505*G0_0_1_8_4 - 0.00560296846011226*G0_0_1_8_5 + 0.00310546596260935*G0_0_1_8_6 - 0.000610817753675026*G0_0_1_8_7 + 0.00218923933209688*G0_0_1_8_8 - 0.00413586413586482*G0_0_1_8_9 - 0.00254412254412297*G0_0_1_9_0 + 0.000123685837971563*G0_0_1_9_1 + 0.00415584415584486*G0_0_1_9_2 - 0.0128785500214093*G0_0_1_9_3 - 0.0142914228628539*G0_0_1_9_4 + 0.0188383045525935*G0_0_1_9_5 - 0.0159183673469415*G0_0_1_9_6 + 0.0179049521906695*G0_0_1_9_7 - 0.00413586413586482*G0_0_1_9_8 - 0.0203453689168008*G0_0_1_9_9 + 0.0189736189736219*G0_1_0_0_0 + 0.00199895342752518*G0_1_0_0_1 + 0.000901884711408657*G0_1_0_0_2 - 0.00300620014905782*G0_1_0_0_3 + 0.000187748759177369*G0_1_0_0_4 + 0.0105948020233751*G0_1_0_0_5 - 0.00453768453768524*G0_1_0_0_6 + 0.0109791795506099*G0_1_0_0_7 - 0.00745286459572295*G0_1_0_0_8 + 0.000117977260834418*G0_1_0_0_9 + 0.00199895342752518*G0_1_0_1_0 - 0.00605616605616715*G0_1_0_1_1 - 0.00160654160654188*G0_1_0_1_2 - 0.0218359418359456*G0_1_0_1_3 + 0.00900559757702768*G0_1_0_1_4 + 0.000946038088895379*G0_1_0_1_5 - 0.0029646543932263*G0_1_0_1_7 + 0.00434232434232503*G0_1_0_1_8 + 0.00278578564292895*G0_1_0_1_9 + 0.000901884711408657*G0_1_0_2_0 - 0.00160654160654188*G0_1_0_2_1 + 0.00207341159722145*G0_1_0_2_2 - 0.00528487385630332*G0_1_0_2_3 + 0.00355105212248127*G0_1_0_2_4 + 0.00161869876155617*G0_1_0_2_5 - 0.000688517831375091*G0_1_0_2_6 + 0.00126857269714434*G0_1_0_2_7 - 0.00107099249956411*G0_1_0_2_8 - 0.00327672327672384*G0_1_0_2_9 - 0.00300620014905782*G0_1_0_3_0 - 0.0218359418359456*G0_1_0_3_1 - 0.00528487385630332*G0_1_0_3_2 - 0.133169687455424*G0_1_0_3_3 + 0.0206793206793242*G0_1_0_3_4 + 0.00299700299700348*G0_1_0_3_5 + 0.000436706150991938*G0_1_0_3_6 + 0.00920508063365364*G0_1_0_3_7 - 0.0126045383188262*G0_1_0_3_8 - 0.0267675181960942*G0_1_0_3_9 + 0.000187748759177369*G0_1_0_4_0 + 0.00900559757702768*G0_1_0_4_1 + 0.00355105212248127*G0_1_0_4_2 + 0.0206793206793242*G0_1_0_4_3 - 0.0311859569002479*G0_1_0_4_4 - 0.000376766091051871*G0_1_0_4_5 - 0.00227772227772268*G0_1_0_4_7 + 0.00339945768517257*G0_1_0_4_8 + 0.0105837020122753*G0_1_0_4_9 + 0.0105948020233751*G0_1_0_5_0 + 0.00094603808889538*G0_1_0_5_1 + 0.00161869876155617*G0_1_0_5_2 + 0.00299700299700348*G0_1_0_5_3 - 0.000376766091051871*G0_1_0_5_4 + 0.0141458541458564*G0_1_0_5_5 - 0.00720993292421979*G0_1_0_5_6 + 0.00627087198515869*G0_1_0_5_7 - 0.00265163408020592*G0_1_0_5_8 + 0.00494933637790861*G0_1_0_5_9 - 0.00453768453768524*G0_1_0_6_0 - 0.000688517831375091*G0_1_0_6_2 + 0.000436706150991938*G0_1_0_6_3 - 0.00720993292421979*G0_1_0_6_5 - 0.00164407021549905*G0_1_0_6_6 - 0.00361923790495277*G0_1_0_6_7 + 0.0016383616383619*G0_1_0_6_8 + 0.00895675752818764*G0_1_0_6_9 + 0.0109791795506099*G0_1_0_7_0 - 0.0029646543932263*G0_1_0_7_1 + 0.00126857269714434*G0_1_0_7_2 + 0.00920508063365364*G0_1_0_7_3 - 0.00227772227772268*G0_1_0_7_4 + 0.00627087198515869*G0_1_0_7_5 - 0.00361923790495277*G0_1_0_7_6 + 0.0017639503353791*G0_1_0_7_7 + 0.00816041101755533*G0_1_0_7_8 + 0.00688454402740234*G0_1_0_7_9 - 0.00745286459572295*G0_1_0_8_0 + 0.00434232434232503*G0_1_0_8_1 - 0.00107099249956411*G0_1_0_8_2 - 0.0126045383188262*G0_1_0_8_3 + 0.00339945768517257*G0_1_0_8_4 - 0.00265163408020592*G0_1_0_8_5 + 0.0016383616383619*G0_1_0_8_6 + 0.00816041101755533*G0_1_0_8_7 - 0.00250035678607162*G0_1_0_8_8 - 0.015156272299132*G0_1_0_8_9 + 0.000117977260834418*G0_1_0_9_0 + 0.00278578564292895*G0_1_0_9_1 - 0.00327672327672384*G0_1_0_9_2 - 0.0267675181960942*G0_1_0_9_3 + 0.0105837020122753*G0_1_0_9_4 + 0.00494933637790861*G0_1_0_9_5 + 0.00895675752818764*G0_1_0_9_6 + 0.00688454402740234*G0_1_0_9_7 - 0.015156272299132*G0_1_0_9_8 + 0.0330869130869186*G0_1_0_9_9 + 0.0166006832673525*G0_1_1_0_0 + 0.00119740929264758*G0_1_1_0_1 + 0.000958829530258251*G0_1_1_0_2 - 0.00287220715792193*G0_1_1_0_3 + 0.00964923964924114*G0_1_1_0_5 - 0.00457320457320528*G0_1_1_0_6 + 0.0153368853368878*G0_1_1_0_7 - 0.00968808968809127*G0_1_1_0_8 + 0.0014518814518817*G0_1_1_0_9 + 0.00119740929264758*G0_1_1_1_0 - 0.00605616605616706*G0_1_1_1_1 - 0.000809437476104277*G0_1_1_1_2 - 0.0108691308691327*G0_1_1_1_3 + 0.00625279482422443*G0_1_1_1_4 + 0.00144442858728597*G0_1_1_1_5 - 0.000577359148787815*G0_1_1_1_6 + 0.00378415235558155*G0_1_1_1_7 - 0.00662448662448772*G0_1_1_1_8 - 0.00121021835307571*G0_1_1_1_9 + 0.00095882953025825*G0_1_1_2_0 - 0.000809437476104277*G0_1_1_2_1 + 0.00180038656229161*G0_1_1_2_2 - 0.00305789448646642*G0_1_1_2_3 + 0.00497930640787866*G0_1_1_2_4 + 0.00140240711669306*G0_1_1_2_5 - 0.00028019599448175*G0_1_1_2_6 + 0.00266749123892025*G0_1_1_2_7 - 0.00231562088704983*G0_1_1_2_8 + 0.000439560439560517*G0_1_1_2_9 - 0.00287220715792193*G0_1_1_3_0 - 0.0108691308691327*G0_1_1_3_1 - 0.00305789448646642*G0_1_1_3_2 - 0.101421435707167*G0_1_1_3_3 + 0.00336663336663392*G0_1_1_3_4 + 0.00231197374054554*G0_1_1_3_5 + 0.00139146567718019*G0_1_1_3_6 + 0.00827600970458249*G0_1_1_3_7 - 0.0148822605965487*G0_1_1_3_8 - 0.0129213643499379*G0_1_1_3_9 + 0.00625279482422443*G0_1_1_4_1 + 0.00497930640787866*G0_1_1_4_2 + 0.00336663336663391*G0_1_1_4_3 - 0.0208020550877728*G0_1_1_4_4 - 0.00134865134865157*G0_1_1_4_6 - 0.00368203225346144*G0_1_1_4_7 + 0.00660625089196626*G0_1_1_4_8 - 0.0012330526616243*G0_1_1_4_9 + 0.00964923964924114*G0_1_1_5_0 + 0.00144442858728597*G0_1_1_5_1 + 0.00140240711669306*G0_1_1_5_2 + 0.00231197374054554*G0_1_1_5_3 + 0.0144455544455567*G0_1_1_5_5 - 0.00618238903953289*G0_1_1_5_6 + 0.0130169830169851*G0_1_1_5_7 - 0.00467389753104114*G0_1_1_5_8 + 0.00499215070643723*G0_1_1_5_9 - 0.00457320457320528*G0_1_1_6_0 - 0.000577359148787815*G0_1_1_6_1 - 0.000280195994481751*G0_1_1_6_2 + 0.00139146567718019*G0_1_1_6_3 - 0.00134865134865157*G0_1_1_6_4 - 0.00618238903953289*G0_1_1_6_5 + 0.000111317254174409*G0_1_1_6_6 - 0.008343085485944*G0_1_1_6_7 + 0.0045097759383481*G0_1_1_6_8 - 0.00410161267304194*G0_1_1_6_9 + 0.0153368853368878*G0_1_1_7_0 + 0.00378415235558155*G0_1_1_7_1 + 0.00266749123892025*G0_1_1_7_2 + 0.00827600970458249*G0_1_1_7_3 - 0.00368203225346144*G0_1_1_7_4 + 0.0130169830169851*G0_1_1_7_5 - 0.008343085485944*G0_1_1_7_6 + 0.0336463536463593*G0_1_1_7_7 + 0.0037747966319401*G0_1_1_7_8 + 0.012330526616243*G0_1_1_7_9 - 0.00968808968809127*G0_1_1_8_0 - 0.00662448662448772*G0_1_1_8_1 - 0.00231562088704983*G0_1_1_8_2 - 0.0148822605965487*G0_1_1_8_3 + 0.00660625089196626*G0_1_1_8_4 - 0.00467389753104114*G0_1_1_8_5 + 0.0045097759383481*G0_1_1_8_6 + 0.0037747966319401*G0_1_1_8_7 - 0.0296931639788831*G0_1_1_8_8 - 0.00958184672470544*G0_1_1_8_9 + 0.0014518814518817*G0_1_1_9_0 - 0.00121021835307571*G0_1_1_9_1 + 0.000439560439560517*G0_1_1_9_2 - 0.0129213643499379*G0_1_1_9_3 - 0.0012330526616243*G0_1_1_9_4 + 0.00499215070643723*G0_1_1_9_5 - 0.00410161267304194*G0_1_1_9_6 + 0.012330526616243*G0_1_1_9_7 - 0.00958184672470544*G0_1_1_9_8 + 0.00637077208505897*G0_1_1_9_9; + A[14] = A[195] + 0.000562964372488289*G0_0_0_0_1 - 0.000558524368048272*G0_0_0_0_2 + 0.00227455084597981*G0_0_0_0_3 - 0.00227899085041982*G0_0_0_0_4 - 0.00527916527916617*G0_0_0_0_5 - 0.00236208236208278*G0_0_0_0_6 + 0.00527916527916626*G0_0_0_0_7 - 0.00163392163392195*G0_0_0_0_8 + 0.00399600399600469*G0_0_0_0_9 + 0.000562964372488289*G0_0_0_1_0 + 0.0102294883247282*G0_0_0_1_1 + 0.0167939996511453*G0_0_0_1_3 - 0.00927516927517084*G0_0_0_1_4 + 0.00108906966049842*G0_0_0_1_5 - 0.00145124716553312*G0_0_0_1_6 - 0.000146520146520166*G0_0_0_1_7 + 0.00198658484372804*G0_0_0_1_8 + 0.000315874601588955*G0_0_0_1_9 - 0.000558524368048272*G0_0_0_2_0 - 0.00758352758352889*G0_0_0_2_2 + 0.00952698095555399*G0_0_0_2_3 - 0.0162567591139047*G0_0_0_2_4 + 0.000154765869051604*G0_0_0_2_5 - 0.00777254491540338*G0_0_0_2_6 + 0.000339343196486109*G0_0_0_2_8 - 0.00536606250892056*G0_0_0_2_9 + 0.00227455084597981*G0_0_0_3_0 + 0.0167939996511453*G0_0_0_3_1 + 0.00952698095555399*G0_0_0_3_2 + 0.0803196803196938*G0_0_0_3_3 - 0.00102754388468689*G0_0_0_3_4 - 0.00530897673754905*G0_0_0_3_5 + 0.00488083345226282*G0_0_0_3_6 - 0.00629656058227593*G0_0_0_3_7 + 0.0067874982160708*G0_0_0_3_8 + 0.011645497359785*G0_0_0_3_9 - 0.00227899085041982*G0_0_0_4_0 - 0.00927516927517084*G0_0_0_4_1 - 0.0162567591139047*G0_0_0_4_2 - 0.00102754388468689*G0_0_0_4_3 - 0.0823747680890677*G0_0_0_4_4 + 0.00736406450692287*G0_0_0_4_5 - 0.0122448979591857*G0_0_0_4_6 + 0.00312259169402078*G0_0_0_4_7 - 0.000490937633794865*G0_0_0_4_8 + 0.00137005851291595*G0_0_0_4_9 - 0.00527916527916617*G0_0_0_5_0 + 0.00108906966049842*G0_0_0_5_1 + 0.000154765869051604*G0_0_0_5_2 - 0.00530897673754904*G0_0_0_5_3 + 0.00736406450692288*G0_0_0_5_4 - 0.0125474525474546*G0_0_0_5_5 + 0.0272698729841633*G0_0_0_5_6 + 0.00227772227772269*G0_0_0_5_7 - 0.00274011702583178*G0_0_0_5_8 - 0.00650777793635049*G0_0_0_5_9 - 0.00236208236208278*G0_0_0_6_0 - 0.00145124716553312*G0_0_0_6_1 - 0.00777254491540338*G0_0_0_6_2 + 0.00488083345226282*G0_0_0_6_3 - 0.0122448979591857*G0_0_0_6_4 + 0.0272698729841633*G0_0_0_6_5 - 0.0401883830455325*G0_0_0_6_6 + 0.000462394748109092*G0_0_0_6_7 + 0.00140430997573877*G0_0_0_6_8 + 0.00633652062223607*G0_0_0_6_9 + 0.00527916527916626*G0_0_0_7_0 - 0.000146520146520165*G0_0_0_7_1 - 0.00629656058227593*G0_0_0_7_3 + 0.00312259169402078*G0_0_0_7_4 + 0.00227772227772269*G0_0_0_7_5 + 0.000462394748109092*G0_0_0_7_6 + 0.00799200799200947*G0_0_0_7_7 - 0.00557157128585799*G0_0_0_7_8 - 0.0129128014842322*G0_0_0_7_9 - 0.00163392163392195*G0_0_0_8_0 + 0.00198658484372804*G0_0_0_8_1 + 0.000339343196486109*G0_0_0_8_2 + 0.0067874982160708*G0_0_0_8_3 - 0.000490937633794865*G0_0_0_8_4 - 0.00274011702583178*G0_0_0_8_5 + 0.00140430997573877*G0_0_0_8_6 - 0.00557157128585799*G0_0_0_8_7 - 0.0020779220779224*G0_0_0_8_8 + 0.00399600399600469*G0_0_0_9_0 + 0.000315874601588956*G0_0_0_9_1 - 0.00536606250892056*G0_0_0_9_2 + 0.011645497359785*G0_0_0_9_3 + 0.00137005851291595*G0_0_0_9_4 - 0.00650777793635049*G0_0_0_9_5 + 0.00633652062223607*G0_0_0_9_6 - 0.0129128014842322*G0_0_0_9_7 + 0.0267161410018598*G0_0_0_9_9 + 0.00136006850292589*G0_0_1_0_1 - 0.00136006850292587*G0_0_1_0_2 + 0.00178060035202922*G0_0_1_0_3 - 0.00178060035202923*G0_0_1_0_4 - 0.016245976245979*G0_0_1_0_5 + 0.00438672438672511*G0_0_1_0_6 + 0.0162459762459791*G0_0_1_0_7 - 0.00438672438672518*G0_0_1_0_8 + 0.00136006850292589*G0_0_1_1_0 + 0.00995646328979829*G0_0_1_1_1 + 0.0172023214880387*G0_0_1_1_3 - 0.00949146092003395*G0_0_1_1_4 - 0.000155558726987314*G0_0_1_1_5 + 0.00208045922331673*G0_0_1_1_7 + 0.00341483912912541*G0_0_1_1_8 + 0.0040321583178733*G0_0_1_1_9 - 0.00136006850292587*G0_0_1_2_0 - 0.00995646328979829*G0_0_1_2_2 + 0.00949146092003394*G0_0_1_2_3 - 0.0172023214880387*G0_0_1_2_4 - 0.00208045922331672*G0_0_1_2_5 - 0.00341483912912542*G0_0_1_2_6 + 0.000155558726987328*G0_0_1_2_7 - 0.00403215831787328*G0_0_1_2_9 + 0.00178060035202922*G0_0_1_3_0 + 0.0172023214880387*G0_0_1_3_1 + 0.00949146092003394*G0_0_1_3_2 + 0.0820750677893672*G0_0_1_3_3 - 0.00243756243756284*G0_0_1_3_5 + 0.000156985871271607*G0_0_1_3_6 - 0.00534180105608768*G0_0_1_3_7 + 0.00549878692735928*G0_0_1_3_8 - 0.00141287284144453*G0_0_1_3_9 - 0.00178060035202923*G0_0_1_4_0 - 0.00949146092003395*G0_0_1_4_1 - 0.0172023214880387*G0_0_1_4_2 - 0.0820750677893673*G0_0_1_4_4 + 0.00534180105608765*G0_0_1_4_5 - 0.00549878692735927*G0_0_1_4_6 + 0.00243756243756284*G0_0_1_4_7 - 0.000156985871271612*G0_0_1_4_8 + 0.00141287284144457*G0_0_1_4_9 - 0.016245976245979*G0_0_1_5_0 - 0.000155558726987314*G0_0_1_5_1 - 0.00208045922331672*G0_0_1_5_2 - 0.00243756243756283*G0_0_1_5_3 + 0.00534180105608765*G0_0_1_5_4 - 0.0397402597402664*G0_0_1_5_5 + 0.0228842585985482*G0_0_1_5_6 + 0.000466676180961945*G0_0_1_5_8 - 0.000933352361923948*G0_0_1_5_9 + 0.0043867243867251*G0_0_1_6_0 - 0.00341483912912542*G0_0_1_6_2 + 0.000156985871271607*G0_0_1_6_3 - 0.00549878692735927*G0_0_1_6_4 + 0.0228842585985482*G0_0_1_6_5 - 0.00830597973455251*G0_0_1_6_6 - 0.000466676180962003*G0_0_1_6_7 + 0.0117825032110767*G0_0_1_6_9 + 0.0162459762459791*G0_0_1_7_0 + 0.00208045922331673*G0_0_1_7_1 + 0.000155558726987328*G0_0_1_7_2 - 0.00534180105608768*G0_0_1_7_3 + 0.00243756243756284*G0_0_1_7_4 - 0.000466676180962002*G0_0_1_7_6 + 0.0397402597402666*G0_0_1_7_7 - 0.0228842585985482*G0_0_1_7_8 + 0.000933352361923975*G0_0_1_7_9 - 0.00438672438672518*G0_0_1_8_0 + 0.00341483912912541*G0_0_1_8_1 + 0.00549878692735928*G0_0_1_8_3 - 0.000156985871271613*G0_0_1_8_4 + 0.000466676180961945*G0_0_1_8_5 - 0.0228842585985482*G0_0_1_8_7 + 0.00830597973455262*G0_0_1_8_8 - 0.0117825032110767*G0_0_1_8_9 + 0.0040321583178733*G0_0_1_9_1 - 0.00403215831787328*G0_0_1_9_2 - 0.00141287284144453*G0_0_1_9_3 + 0.00141287284144457*G0_0_1_9_4 - 0.000933352361923951*G0_0_1_9_5 + 0.0117825032110767*G0_0_1_9_6 + 0.000933352361923979*G0_0_1_9_7 - 0.0117825032110767*G0_0_1_9_8 - 0.000238579762389303*G0_1_0_0_1 + 0.000238579762389345*G0_1_0_0_2 + 0.00277294134437039*G0_1_0_0_3 - 0.0027729413443704*G0_1_0_0_4 + 0.00568764568764685*G0_1_0_0_5 - 0.00511488511488609*G0_1_0_0_6 - 0.0056876456876464*G0_1_0_0_7 + 0.00511488511488587*G0_1_0_0_8 - 0.000238579762389303*G0_1_0_1_0 + 0.00785655261845871*G0_1_0_1_1 + 0.0158484372770114*G0_1_0_1_3 - 0.00931068931069089*G0_1_0_1_4 + 0.0012230626516343*G0_1_0_1_5 - 0.00173826173826204*G0_1_0_1_6 - 0.00238174523888847*G0_1_0_1_7 + 0.00634429063000598*G0_1_0_1_8 + 0.00164977879263623*G0_1_0_1_9 + 0.000238579762389345*G0_1_0_2_0 - 0.00785655261845873*G0_1_0_2_2 + 0.00931068931069089*G0_1_0_2_3 - 0.0158484372770114*G0_1_0_2_4 + 0.00238174523888851*G0_1_0_2_5 - 0.006344290630006*G0_1_0_2_6 - 0.00122306265163427*G0_1_0_2_7 + 0.00173826173826202*G0_1_0_2_8 - 0.00164977879263621*G0_1_0_2_9 + 0.00277294134437039*G0_1_0_3_0 + 0.0158484372770114*G0_1_0_3_1 + 0.00931068931069089*G0_1_0_3_2 + 0.0806193806193942*G0_1_0_3_3 - 0.00599400599400699*G0_1_0_3_5 + 0.00521478521478609*G0_1_0_3_6 - 0.00831882403311114*G0_1_0_3_7 + 0.0135336092478972*G0_1_0_3_8 + 0.0116883116883137*G0_1_0_3_9 - 0.0027729413443704*G0_1_0_4_0 - 0.00931068931069089*G0_1_0_4_1 - 0.0158484372770114*G0_1_0_4_2 - 0.0806193806193943*G0_1_0_4_4 + 0.00831882403311114*G0_1_0_4_5 - 0.0135336092478972*G0_1_0_4_6 + 0.00599400599400699*G0_1_0_4_7 - 0.00521478521478609*G0_1_0_4_8 - 0.0116883116883136*G0_1_0_4_9 + 0.00568764568764685*G0_1_0_5_0 + 0.0012230626516343*G0_1_0_5_1 + 0.00238174523888851*G0_1_0_5_2 - 0.00599400599400699*G0_1_0_5_3 + 0.00831882403311114*G0_1_0_5_4 + 0.0192007992008027*G0_1_0_5_5 + 0.00995718567147302*G0_1_0_5_6 - 0.00366918795490291*G0_1_0_5_8 + 0.00733837590980575*G0_1_0_5_9 - 0.00511488511488609*G0_1_0_6_0 - 0.00173826173826204*G0_1_0_6_1 - 0.006344290630006*G0_1_0_6_2 + 0.00521478521478609*G0_1_0_6_3 - 0.0135336092478972*G0_1_0_6_4 + 0.00995718567147302*G0_1_0_6_5 - 0.0298044812330576*G0_1_0_6_6 + 0.00366918795490279*G0_1_0_6_7 - 0.00548023405166353*G0_1_0_6_9 - 0.0056876456876464*G0_1_0_7_0 - 0.00238174523888847*G0_1_0_7_1 - 0.00122306265163427*G0_1_0_7_2 - 0.00831882403311114*G0_1_0_7_3 + 0.00599400599400699*G0_1_0_7_4 + 0.00366918795490279*G0_1_0_7_6 - 0.0192007992008021*G0_1_0_7_7 - 0.00995718567147319*G0_1_0_7_8 - 0.0073383759098057*G0_1_0_7_9 + 0.00511488511488587*G0_1_0_8_0 + 0.00634429063000598*G0_1_0_8_1 + 0.00173826173826202*G0_1_0_8_2 + 0.0135336092478972*G0_1_0_8_3 - 0.00521478521478609*G0_1_0_8_4 - 0.00366918795490291*G0_1_0_8_5 - 0.0099571856714732*G0_1_0_8_7 + 0.0298044812330578*G0_1_0_8_8 + 0.00548023405166354*G0_1_0_8_9 + 0.00164977879263622*G0_1_0_9_1 - 0.00164977879263621*G0_1_0_9_2 + 0.0116883116883137*G0_1_0_9_3 - 0.0116883116883136*G0_1_0_9_4 + 0.00733837590980575*G0_1_0_9_5 - 0.00548023405166352*G0_1_0_9_6 - 0.0073383759098057*G0_1_0_9_7 + 0.00548023405166354*G0_1_0_9_8 + 0.000558524368048299*G0_1_1_0_1 - 0.00056296437248826*G0_1_1_0_2 + 0.0022789908504198*G0_1_1_0_3 - 0.00227455084597982*G0_1_1_0_4 - 0.00527916527916596*G0_1_1_0_5 + 0.00163392163392181*G0_1_1_0_6 + 0.00527916527916645*G0_1_1_0_7 + 0.00236208236208264*G0_1_1_0_8 - 0.00399600399600464*G0_1_1_0_9 + 0.000558524368048299*G0_1_1_1_0 + 0.00758352758352883*G0_1_1_1_1 + 0.0162567591139047*G0_1_1_1_3 - 0.00952698095555399*G0_1_1_1_4 - 0.000339343196486119*G0_1_1_1_6 - 0.000154765869051561*G0_1_1_1_7 + 0.00777254491540333*G0_1_1_1_8 + 0.00536606250892057*G0_1_1_1_9 - 0.00056296437248826*G0_1_1_2_0 - 0.0102294883247282*G0_1_1_2_2 + 0.00927516927517084*G0_1_1_2_3 - 0.0167939996511454*G0_1_1_2_4 + 0.000146520146520202*G0_1_1_2_5 - 0.00198658484372806*G0_1_1_2_6 - 0.0010890696604984*G0_1_1_2_7 + 0.00145124716553311*G0_1_1_2_8 - 0.000315874601588941*G0_1_1_2_9 + 0.0022789908504198*G0_1_1_3_0 + 0.0162567591139047*G0_1_1_3_1 + 0.00927516927517084*G0_1_1_3_2 + 0.0823747680890676*G0_1_1_3_3 + 0.001027543884687*G0_1_1_3_4 - 0.00312259169402078*G0_1_1_3_5 + 0.000490937633794872*G0_1_1_3_6 - 0.00736406450692288*G0_1_1_3_7 + 0.0122448979591857*G0_1_1_3_8 - 0.00137005851291593*G0_1_1_3_9 - 0.00227455084597982*G0_1_1_4_0 - 0.00952698095555399*G0_1_1_4_1 - 0.0167939996511454*G0_1_1_4_2 + 0.001027543884687*G0_1_1_4_3 - 0.0803196803196939*G0_1_1_4_4 + 0.00629656058227592*G0_1_1_4_5 - 0.00678749821607081*G0_1_1_4_6 + 0.00530897673754904*G0_1_1_4_7 - 0.00488083345226281*G0_1_1_4_8 - 0.011645497359785*G0_1_1_4_9 - 0.00527916527916596*G0_1_1_5_0 + 0.000146520146520202*G0_1_1_5_2 - 0.00312259169402078*G0_1_1_5_3 + 0.00629656058227593*G0_1_1_5_4 - 0.00799200799200911*G0_1_1_5_5 + 0.00557157128585786*G0_1_1_5_6 - 0.00227772227772252*G0_1_1_5_7 - 0.000462394748109191*G0_1_1_5_8 + 0.0129128014842323*G0_1_1_5_9 + 0.00163392163392181*G0_1_1_6_0 - 0.000339343196486119*G0_1_1_6_1 - 0.00198658484372806*G0_1_1_6_2 + 0.000490937633794873*G0_1_1_6_3 - 0.00678749821607081*G0_1_1_6_4 + 0.00557157128585786*G0_1_1_6_5 + 0.00207792207792244*G0_1_1_6_6 + 0.0027401170258317*G0_1_1_6_7 - 0.00140430997573873*G0_1_1_6_8 + 0.00527916527916645*G0_1_1_7_0 - 0.000154765869051562*G0_1_1_7_1 - 0.0010890696604984*G0_1_1_7_2 - 0.00736406450692288*G0_1_1_7_3 + 0.00530897673754904*G0_1_1_7_4 - 0.00227772227772252*G0_1_1_7_5 + 0.0027401170258317*G0_1_1_7_6 + 0.012547452547455*G0_1_1_7_7 - 0.0272698729841634*G0_1_1_7_8 + 0.00650777793635053*G0_1_1_7_9 + 0.00236208236208264*G0_1_1_8_0 + 0.00777254491540333*G0_1_1_8_1 + 0.00145124716553311*G0_1_1_8_2 + 0.0122448979591857*G0_1_1_8_3 - 0.00488083345226281*G0_1_1_8_4 - 0.000462394748109191*G0_1_1_8_5 - 0.00140430997573873*G0_1_1_8_6 - 0.0272698729841634*G0_1_1_8_7 + 0.0401883830455325*G0_1_1_8_8 - 0.00633652062223606*G0_1_1_8_9 - 0.00399600399600464*G0_1_1_9_0 + 0.00536606250892057*G0_1_1_9_1 - 0.00031587460158894*G0_1_1_9_2 - 0.00137005851291593*G0_1_1_9_3 - 0.011645497359785*G0_1_1_9_4 + 0.0129128014842323*G0_1_1_9_5 + 0.00650777793635053*G0_1_1_9_7 - 0.00633652062223606*G0_1_1_9_8 - 0.0267161410018597*G0_1_1_9_9; + A[56] = -A[176] + 0.0443464824417283*G0_0_0_0_0 + 0.00902406235739731*G0_0_0_0_1 + 0.00420489563346779*G0_0_0_0_2 + 0.00487808487808571*G0_0_0_0_3 - 0.00190370476084794*G0_0_0_0_4 + 0.0310191395905736*G0_0_0_0_5 - 0.0150947465233206*G0_0_0_0_6 + 0.00577454291740106*G0_0_0_0_7 + 0.00368520368520433*G0_0_0_0_8 + 0.0062642119784988*G0_0_0_0_9 + 0.00902406235739731*G0_0_0_1_0 + 0.259513326180038*G0_0_0_1_1 + 0.007976221309556*G0_0_0_1_2 + 0.0714248714248837*G0_0_0_1_3 - 0.0346468346468406*G0_0_0_1_4 + 0.00542864542864624*G0_0_0_1_5 + 0.00120176120176144*G0_0_0_1_6 - 0.0311540311540367*G0_0_0_1_7 + 0.0616864616864726*G0_0_0_1_8 + 0.00150960150960183*G0_0_0_1_9 + 0.00420489563346779*G0_0_0_2_0 + 0.007976221309556*G0_0_0_2_1 + 0.00472698377460362*G0_0_0_2_2 + 0.00770192770192898*G0_0_0_2_3 - 0.00649086363372187*G0_0_0_2_4 + 0.00474530760245129*G0_0_0_2_5 - 0.00443408443408519*G0_0_0_2_6 + 0.00224706510420834*G0_0_0_2_7 + 0.0160136160136187*G0_0_0_2_8 + 0.0139999682856849*G0_0_0_2_9 + 0.0048780848780857*G0_0_0_3_0 + 0.0714248714248838*G0_0_0_3_1 + 0.00770192770192898*G0_0_0_3_2 + 0.0101232101232116*G0_0_0_3_3 - 0.0319147519147572*G0_0_0_3_4 - 0.0100166500166517*G0_0_0_3_5 - 0.0144921744921769*G0_0_0_3_6 - 0.0255211455211499*G0_0_0_3_7 + 0.0844488844488987*G0_0_0_3_8 + 0.0465134865134943*G0_0_0_3_9 - 0.00190370476084794*G0_0_0_4_0 - 0.0346468346468406*G0_0_0_4_1 - 0.00649086363372187*G0_0_0_4_2 - 0.0319147519147572*G0_0_0_4_3 + 0.0329803529803585*G0_0_0_4_4 - 0.00517577660434893*G0_0_0_4_5 + 0.0196679510965258*G0_0_0_4_6 + 0.00492840492840576*G0_0_0_4_7 - 0.0589277389277488*G0_0_0_4_8 - 0.031648351648357*G0_0_0_4_9 + 0.0310191395905736*G0_0_0_5_0 + 0.00542864542864624*G0_0_0_5_1 + 0.00474530760245129*G0_0_0_5_2 - 0.0100166500166517*G0_0_0_5_3 - 0.00517577660434893*G0_0_0_5_4 + 0.188748394462712*G0_0_0_5_5 - 0.029661766804629*G0_0_0_5_6 + 0.0448009133723495*G0_0_0_5_7 - 0.0271728271728318*G0_0_0_5_8 + 0.0355530184101673*G0_0_0_5_9 - 0.0150947465233206*G0_0_0_6_0 + 0.00120176120176144*G0_0_0_6_1 - 0.00443408443408519*G0_0_0_6_2 - 0.0144921744921769*G0_0_0_6_3 + 0.0196679510965258*G0_0_0_6_4 - 0.029661766804629*G0_0_0_6_5 + 0.0887569573284007*G0_0_0_6_6 - 0.0176280861995177*G0_0_0_6_7 - 0.0203796203796238*G0_0_0_6_8 - 0.013015555872701*G0_0_0_6_9 + 0.00577454291740106*G0_0_0_7_0 - 0.0311540311540367*G0_0_0_7_1 + 0.00224706510420834*G0_0_0_7_2 - 0.0255211455211499*G0_0_0_7_3 + 0.00492840492840576*G0_0_0_7_4 + 0.0448009133723495*G0_0_0_7_5 - 0.0176280861995177*G0_0_0_7_6 + 0.101018981018998*G0_0_0_7_7 - 0.0570629370629467*G0_0_0_7_8 + 0.0164635364635393*G0_0_0_7_9 + 0.00368520368520433*G0_0_0_8_0 + 0.0616864616864726*G0_0_0_8_1 + 0.0160136160136187*G0_0_0_8_2 + 0.0844488844488987*G0_0_0_8_3 - 0.0589277389277488*G0_0_0_8_4 - 0.0271728271728318*G0_0_0_8_5 - 0.0203796203796238*G0_0_0_8_6 - 0.0570629370629467*G0_0_0_8_7 + 0.327672327672383*G0_0_0_8_8 + 0.113326673326692*G0_0_0_8_9 + 0.0062642119784988*G0_0_0_9_0 + 0.00150960150960183*G0_0_0_9_1 + 0.0139999682856849*G0_0_0_9_2 + 0.0465134865134943*G0_0_0_9_3 - 0.031648351648357*G0_0_0_9_4 + 0.0355530184101673*G0_0_0_9_5 - 0.013015555872701*G0_0_0_9_6 + 0.0164635364635393*G0_0_0_9_7 + 0.113326673326692*G0_0_0_9_8 + 0.258941058941103*G0_0_0_9_9 - 0.00184140374616603*G0_0_1_0_0 + 0.00879614212947705*G0_0_1_0_1 - 0.00107419916943744*G0_0_1_0_2 - 0.0102031302031319*G0_0_1_0_3 + 0.0037029637029643*G0_0_1_0_4 + 0.000279085993371709*G0_0_1_0_5 + 0.00136371564943018*G0_0_1_0_6 + 0.00298368298368343*G0_0_1_0_7 - 0.00737928737928854*G0_0_1_0_8 - 0.00868464868465014*G0_0_1_0_9 + 0.00879614212947705*G0_0_1_1_0 + 0.294322960989679*G0_0_1_1_1 + 0.00879614212947696*G0_0_1_1_2 + 0.0811632811632952*G0_0_1_1_3 - 0.0395160395160463*G0_0_1_1_4 - 0.000666000666000888*G0_0_1_1_5 - 0.000666000666000741*G0_0_1_1_6 - 0.0395160395160465*G0_0_1_1_7 + 0.0811632811632956*G0_0_1_1_8 + 0.00426240426240506*G0_0_1_1_9 - 0.00107419916943744*G0_0_1_2_0 + 0.00879614212947696*G0_0_1_2_1 - 0.00184140374616595*G0_0_1_2_2 - 0.00737928737928859*G0_0_1_2_3 + 0.00298368298368347*G0_0_1_2_4 + 0.00136371564943014*G0_0_1_2_5 + 0.000279085993371762*G0_0_1_2_6 + 0.0037029637029643*G0_0_1_2_7 - 0.0102031302031319*G0_0_1_2_8 - 0.00868464868465012*G0_0_1_2_9 - 0.0102031302031319*G0_0_1_3_0 + 0.0811632811632952*G0_0_1_3_1 - 0.0073792873792886*G0_0_1_3_2 - 0.148651348651374*G0_0_1_3_3 + 0.0307692307692358*G0_0_1_3_4 + 0.0130269730269751*G0_0_1_3_5 + 0.00855144855144997*G0_0_1_3_6 + 0.0371628371628432*G0_0_1_3_7 - 0.0743256743256864*G0_0_1_3_8 - 0.0871128871129016*G0_0_1_3_9 + 0.0037029637029643*G0_0_1_4_0 - 0.0395160395160463*G0_0_1_4_1 + 0.00298368298368347*G0_0_1_4_2 + 0.0307692307692358*G0_0_1_4_3 - 0.0103896103896121*G0_0_1_4_4 - 0.00455544455544528*G0_0_1_4_5 - 0.00399600399600465*G0_0_1_4_6 - 0.0143856143856167*G0_0_1_4_7 + 0.0371628371628432*G0_0_1_4_8 + 0.035164835164841*G0_0_1_4_9 + 0.000279085993371709*G0_0_1_5_0 - 0.000666000666000888*G0_0_1_5_1 + 0.00136371564943014*G0_0_1_5_2 + 0.0130269730269751*G0_0_1_5_3 - 0.00455544455544528*G0_0_1_5_4 - 0.0063251034679617*G0_0_1_5_5 - 0.000468103325246228*G0_0_1_5_6 - 0.00399600399600465*G0_0_1_5_7 + 0.00855144855144993*G0_0_1_5_8 + 0.0089510489510504*G0_0_1_5_9 + 0.00136371564943018*G0_0_1_6_0 - 0.000666000666000741*G0_0_1_6_1 + 0.000279085993371762*G0_0_1_6_2 + 0.00855144855144997*G0_0_1_6_3 - 0.00399600399600465*G0_0_1_6_4 - 0.000468103325246228*G0_0_1_6_5 - 0.00632510346796161*G0_0_1_6_6 - 0.0045554445554453*G0_0_1_6_7 + 0.0130269730269752*G0_0_1_6_8 + 0.00895104895105045*G0_0_1_6_9 + 0.00298368298368343*G0_0_1_7_0 - 0.0395160395160465*G0_0_1_7_1 + 0.0037029637029643*G0_0_1_7_2 + 0.0371628371628432*G0_0_1_7_3 - 0.0143856143856167*G0_0_1_7_4 - 0.00399600399600465*G0_0_1_7_5 - 0.0045554445554453*G0_0_1_7_6 - 0.010389610389612*G0_0_1_7_7 + 0.0307692307692356*G0_0_1_7_8 + 0.035164835164841*G0_0_1_7_9 - 0.00737928737928854*G0_0_1_8_0 + 0.0811632811632956*G0_0_1_8_1 - 0.0102031302031319*G0_0_1_8_2 - 0.0743256743256864*G0_0_1_8_3 + 0.0371628371628432*G0_0_1_8_4 + 0.00855144855144993*G0_0_1_8_5 + 0.0130269730269752*G0_0_1_8_6 + 0.0307692307692356*G0_0_1_8_7 - 0.148651348651373*G0_0_1_8_8 - 0.0871128871129016*G0_0_1_8_9 - 0.00868464868465014*G0_0_1_9_0 + 0.00426240426240506*G0_0_1_9_1 - 0.00868464868465012*G0_0_1_9_2 - 0.0871128871129016*G0_0_1_9_3 + 0.035164835164841*G0_0_1_9_4 + 0.0089510489510504*G0_0_1_9_5 + 0.00895104895105045*G0_0_1_9_6 + 0.035164835164841*G0_0_1_9_7 - 0.0871128871129015*G0_0_1_9_8 - 0.0671328671328785*G0_0_1_9_9; + A[99] = A[56] - 0.0820535372916465*G0_0_0_0_0 - 0.00904971571638392*G0_0_0_0_2 + 0.00965891251605706*G0_0_0_0_3 + 0.000243565957851712*G0_0_0_0_4 - 0.102559028273331*G0_0_0_0_5 + 0.0426823969681185*G0_0_0_0_6 - 0.0374482660197009*G0_0_0_0_7 + 0.0198582370010975*G0_0_0_0_8 - 0.0149031920460517*G0_0_0_0_9 + 0.0820535372916462*G0_0_0_1_1 + 0.0090497157163839*G0_0_0_1_2 + 0.102559028273331*G0_0_0_1_3 - 0.0426823969681184*G0_0_0_1_4 - 0.00965891251605699*G0_0_0_1_5 - 0.000243565957851716*G0_0_0_1_6 - 0.0198582370010975*G0_0_0_1_7 + 0.0374482660197009*G0_0_0_1_8 + 0.0149031920460518*G0_0_0_1_9 - 0.00904971571638392*G0_0_0_2_0 + 0.0090497157163839*G0_0_0_2_1 + 0.0153852496709666*G0_0_0_2_3 - 0.00416091844663345*G0_0_0_2_4 - 0.0153852496709666*G0_0_0_2_5 + 0.00416091844663345*G0_0_0_2_6 - 0.00226820798249409*G0_0_0_2_7 + 0.0022682079824941*G0_0_0_2_8 + 0.00965891251605707*G0_0_0_3_0 + 0.102559028273331*G0_0_0_3_1 + 0.0153852496709666*G0_0_0_3_2 + 0.319132296275208*G0_0_0_3_3 - 0.0805594405594543*G0_0_0_3_4 + 0.000730697873555106*G0_0_0_3_6 - 0.0289767375481711*G0_0_0_3_7 + 0.0357813614956534*G0_0_0_3_8 + 0.0132438989581871*G0_0_0_3_9 + 0.000243565957851712*G0_0_0_4_0 - 0.0426823969681184*G0_0_0_4_1 - 0.00416091844663345*G0_0_0_4_2 - 0.0805594405594543*G0_0_0_4_3 + 0.0683202511774056*G0_0_0_4_4 - 0.000730697873555104*G0_0_0_4_5 + 0.0030369630369636*G0_0_0_4_7 - 0.00680462394748231*G0_0_0_4_8 + 0.00146139574711022*G0_0_0_4_9 - 0.102559028273331*G0_0_0_5_0 - 0.00965891251605699*G0_0_0_5_1 - 0.0153852496709666*G0_0_0_5_2 - 0.000730697873555106*G0_0_0_5_4 - 0.319132296275207*G0_0_0_5_5 + 0.0805594405594543*G0_0_0_5_6 - 0.0357813614956532*G0_0_0_5_7 + 0.028976737548171*G0_0_0_5_8 - 0.013243898958187*G0_0_0_5_9 + 0.0426823969681185*G0_0_0_6_0 - 0.000243565957851715*G0_0_0_6_1 + 0.00416091844663345*G0_0_0_6_2 + 0.000730697873555106*G0_0_0_6_3 + 0.0805594405594543*G0_0_0_6_5 - 0.0683202511774054*G0_0_0_6_6 + 0.00680462394748224*G0_0_0_6_7 - 0.00303696303696358*G0_0_0_6_8 - 0.0014613957471102*G0_0_0_6_9 - 0.0374482660197009*G0_0_0_7_0 - 0.0198582370010975*G0_0_0_7_1 - 0.00226820798249409*G0_0_0_7_2 - 0.0289767375481711*G0_0_0_7_3 + 0.0030369630369636*G0_0_0_7_4 - 0.0357813614956532*G0_0_0_7_5 + 0.00680462394748224*G0_0_0_7_6 + 0.029364920793497*G0_0_0_7_7 + 0.0311003282431905*G0_0_0_7_9 + 0.0198582370010975*G0_0_0_8_0 + 0.0374482660197009*G0_0_0_8_1 + 0.0022682079824941*G0_0_0_8_2 + 0.0357813614956534*G0_0_0_8_3 - 0.00680462394748231*G0_0_0_8_4 + 0.028976737548171*G0_0_0_8_5 - 0.00303696303696357*G0_0_0_8_6 - 0.0293649207934969*G0_0_0_8_8 - 0.0311003282431905*G0_0_0_8_9 - 0.0149031920460517*G0_0_0_9_0 + 0.0149031920460518*G0_0_0_9_1 + 0.0132438989581871*G0_0_0_9_3 + 0.00146139574711022*G0_0_0_9_4 - 0.013243898958187*G0_0_0_9_5 - 0.00146139574711019*G0_0_0_9_6 + 0.0311003282431905*G0_0_0_9_7 - 0.0311003282431905*G0_0_0_9_8 + 0.0242460890079978*G0_0_1_0_0 + 0.0105376105376123*G0_0_1_0_1 + 0.00508641270546117*G0_0_1_0_2 + 0.0222592222592261*G0_0_1_0_3 - 0.00799877371306077*G0_0_1_0_4 + 0.0256649170934927*G0_0_1_0_5 - 0.0137014308442902*G0_0_1_0_6 + 0.0192450935308109*G0_0_1_0_7 + 0.00298960298960356*G0_0_1_0_8 + 0.0160804275090017*G0_0_1_0_9 + 0.0105376105376123*G0_0_1_1_0 + 0.106299626299644*G0_0_1_1_1 + 0.0141361284218451*G0_0_1_1_2 + 0.128223945366824*G0_0_1_1_3 - 0.0563838278124087*G0_0_1_1_4 + 0.012600309743169*G0_0_1_1_5 - 0.00824233967091247*G0_0_1_1_6 - 0.016868634011494*G0_0_1_1_7 + 0.0566933595505119*G0_0_1_1_8 + 0.0309836195550534*G0_0_1_1_9 + 0.00508641270546117*G0_0_1_2_0 + 0.0141361284218451*G0_0_1_2_1 + 0.00861952861953004*G0_0_1_2_2 + 0.0286392972107306*G0_0_1_2_3 - 0.0115643087071678*G0_0_1_2_4 + 0.0132540475397641*G0_0_1_2_5 - 0.00740339026053436*G0_0_1_2_6 + 0.00783555069269485*G0_0_1_2_7 + 0.0101037586751889*G0_0_1_2_8 + 0.0209771181199788*G0_0_1_2_9 + 0.0222592222592261*G0_0_1_3_0 + 0.128223945366824*G0_0_1_3_1 + 0.0286392972107306*G0_0_1_3_2 + 0.508268873983246*G0_0_1_3_3 - 0.147167118595715*G0_0_1_3_4 - 0.035279006707584*G0_0_1_3_5 - 0.00929356357927943*G0_0_1_3_6 - 0.100798249369695*G0_0_1_3_7 + 0.165130107987279*G0_0_1_3_8 + 0.10864564007423*G0_0_1_3_9 - 0.00799877371306077*G0_0_1_4_0 - 0.0563838278124087*G0_0_1_4_1 - 0.0115643087071678*G0_0_1_4_2 - 0.147167118595715*G0_0_1_4_3 + 0.111225916940222*G0_0_1_4_4 - 0.0100242614528346*G0_0_1_4_5 + 0.019317825032114*G0_0_1_4_6 + 0.0172551258265573*G0_0_1_4_7 - 0.0643318586175836*G0_0_1_4_8 - 0.0428828314542672*G0_0_1_4_9 + 0.0256649170934927*G0_0_1_5_0 + 0.012600309743169*G0_0_1_5_1 + 0.0132540475397641*G0_0_1_5_2 - 0.035279006707584*G0_0_1_5_3 - 0.0100242614528346*G0_0_1_5_4 + 0.189136577708038*G0_0_1_5_5 - 0.0666076780362606*G0_0_1_5_6 + 0.129348746491625*G0_0_1_5_7 - 0.0718215118215238*G0_0_1_5_8 + 0.0954017411160429*G0_0_1_5_9 - 0.0137014308442902*G0_0_1_6_0 - 0.00824233967091247*G0_0_1_6_1 - 0.00740339026053436*G0_0_1_6_2 - 0.00929356357927943*G0_0_1_6_3 + 0.019317825032114*G0_0_1_6_4 - 0.0666076780362606*G0_0_1_6_5 + 0.0429056657628158*G0_0_1_6_6 - 0.0575272346701014*G0_0_1_6_7 + 0.0142181627895937*G0_0_1_6_8 - 0.0443442272013775*G0_0_1_6_9 + 0.0192450935308109*G0_0_1_7_0 - 0.016868634011494*G0_0_1_7_1 + 0.00783555069269485*G0_0_1_7_2 - 0.100798249369695*G0_0_1_7_3 + 0.0172551258265573*G0_0_1_7_4 + 0.129348746491625*G0_0_1_7_5 - 0.0575272346701014*G0_0_1_7_6 + 0.217968697968734*G0_0_1_7_7 - 0.133200133200155*G0_0_1_7_8 + 0.066813186813198*G0_0_1_7_9 + 0.00298960298960356*G0_0_1_8_0 + 0.0566933595505119*G0_0_1_8_1 + 0.0101037586751889*G0_0_1_8_2 + 0.165130107987279*G0_0_1_8_3 - 0.0643318586175836*G0_0_1_8_4 - 0.0718215118215238*G0_0_1_8_5 + 0.0142181627895937*G0_0_1_8_6 - 0.133200133200155*G0_0_1_8_7 + 0.188603777175237*G0_0_1_8_8 + 0.0357128585700074*G0_0_1_8_9 + 0.0160804275090017*G0_0_1_9_0 + 0.0309836195550534*G0_0_1_9_1 + 0.0209771181199788*G0_0_1_9_2 + 0.10864564007423*G0_0_1_9_3 - 0.0428828314542672*G0_0_1_9_4 + 0.0954017411160429*G0_0_1_9_5 - 0.0443442272013775*G0_0_1_9_6 + 0.066813186813198*G0_0_1_9_7 + 0.0357128585700073*G0_0_1_9_8 + 0.22331953760529*G0_0_1_9_9 + 0.31672764625151*G0_1_0_0_0 + 0.0281298947965664*G0_1_0_0_1 + 0.0128083556655007*G0_1_0_0_2 + 0.0113900913900933*G0_1_0_0_3 - 0.00496181067609723*G0_1_0_0_4 + 0.10710728425016*G0_1_0_0_5 - 0.0518537547109064*G0_1_0_0_6 + 0.10339205767779*G0_1_0_0_7 - 0.0439057239057313*G0_1_0_0_8 + 0.0116581830867567*G0_1_0_0_9 + 0.0281298947965664*G0_1_0_1_0 + 0.398781183543157*G0_1_0_1_1 + 0.0218580713818846*G0_1_0_1_2 + 0.209666312523491*G0_1_0_1_3 - 0.0945361516790248*G0_1_0_1_4 + 0.00173117887403619*G0_1_0_1_5 - 0.0052053766339489*G0_1_0_1_6 - 0.0637639609068291*G0_1_0_1_7 + 0.140840323697491*G0_1_0_1_8 + 0.0265613751328083*G0_1_0_1_9 + 0.0128083556655007*G0_1_0_2_0 + 0.0218580713818846*G0_1_0_2_1 + 0.0049367211271981*G0_1_0_2_2 + 0.0226237254808722*G0_1_0_2_3 - 0.00830153973011257*G0_1_0_2_4 + 0.00723847580990561*G0_1_0_2_5 - 0.00414062128347914*G0_1_0_2_6 + 0.00133538419252726*G0_1_0_2_7 + 0.00360359217502138*G0_1_0_2_8 + 0.00360782075067852*G0_1_0_2_9 + 0.0113900913900933*G0_1_0_3_0 + 0.209666312523491*G0_1_0_3_1 + 0.0226237254808722*G0_1_0_3_2 + 0.35329242186391*G0_1_0_3_3 - 0.116865991151725*G0_1_0_3_4 - 0.00922506065363368*G0_1_0_3_5 - 0.00529755958327476*G0_1_0_3_6 - 0.0550839636554017*G0_1_0_3_7 + 0.0868084296655875*G0_1_0_3_8 + 0.0304838019123788*G0_1_0_3_9 - 0.00496181067609723*G0_1_0_4_0 - 0.0945361516790248*G0_1_0_4_1 - 0.00830153973011257*G0_1_0_4_2 - 0.116865991151725*G0_1_0_4_3 + 0.0945112030826476*G0_1_0_4_4 - 0.00602825745682989*G0_1_0_4_5 + 0.0113258170401047*G0_1_0_4_6 + 0.0158964844679158*G0_1_0_4_7 - 0.0317244660101858*G0_1_0_4_8 + 0.00123305266162421*G0_1_0_4_9 + 0.10710728425016*G0_1_0_5_0 + 0.00173117887403619*G0_1_0_5_1 + 0.00723847580990561*G0_1_0_5_2 - 0.00922506065363369*G0_1_0_5_3 - 0.00602825745682989*G0_1_0_5_4 + 0.0341601255887029*G0_1_0_5_5 - 0.0363065505922711*G0_1_0_5_6 + 0.0510270681699339*G0_1_0_5_7 - 0.0261072261072306*G0_1_0_5_8 + 0.0172399029541916*G0_1_0_5_9 - 0.0518537547109064*G0_1_0_6_0 - 0.0052053766339489*G0_1_0_6_1 - 0.00414062128347914*G0_1_0_6_2 - 0.00529755958327476*G0_1_0_6_3 + 0.0113258170401047*G0_1_0_6_4 - 0.0363065505922711*G0_1_0_6_5 + 0.0261909519052421*G0_1_0_6_6 - 0.0249198420627034*G0_1_0_6_7 + 0.0128595214309522*G0_1_0_6_8 - 0.000228343085485991*G0_1_0_6_9 + 0.10339205767779*G0_1_0_7_0 - 0.0637639609068291*G0_1_0_7_1 + 0.00133538419252726*G0_1_0_7_2 - 0.0550839636554017*G0_1_0_7_3 + 0.0158964844679158*G0_1_0_7_4 + 0.0510270681699339*G0_1_0_7_5 - 0.0249198420627034*G0_1_0_7_6 + 0.0589277389277491*G0_1_0_7_7 - 0.071661671661684*G0_1_0_7_8 + 0.0148651348651373*G0_1_0_7_9 - 0.0439057239057313*G0_1_0_8_0 + 0.140840323697491*G0_1_0_8_1 + 0.00360359217502138*G0_1_0_8_2 + 0.0868084296655875*G0_1_0_8_3 - 0.0317244660101858*G0_1_0_8_4 - 0.0261072261072306*G0_1_0_8_5 + 0.0128595214309522*G0_1_0_8_6 - 0.071661671661684*G0_1_0_8_7 + 0.0295628181342524*G0_1_0_8_8 - 0.0162351933780531*G0_1_0_8_9 + 0.0116581830867567*G0_1_0_9_0 + 0.0265613751328083*G0_1_0_9_1 + 0.00360782075067852*G0_1_0_9_2 + 0.0304838019123788*G0_1_0_9_3 + 0.00123305266162421*G0_1_0_9_4 + 0.0172399029541916*G0_1_0_9_5 - 0.000228343085485991*G0_1_0_9_6 + 0.0148651348651373*G0_1_0_9_7 - 0.0162351933780531*G0_1_0_9_8 + 0.0890538033395328*G0_1_0_9_9 - 0.0752754124182822*G0_1_1_0_0 + 0.0193337526670894*G0_1_1_0_1 - 0.00143898429612738*G0_1_1_0_2 + 0.0304021904021957*G0_1_1_0_3 - 0.00906056906057061*G0_1_1_0_4 - 0.0381527467241816*G0_1_1_0_5 + 0.0177849663563979*G0_1_1_0_6 - 0.117559477559497*G0_1_1_0_7 + 0.0806334406334543*G0_1_1_0_8 - 0.00261072261072305*G0_1_1_0_9 + 0.0193337526670894*G0_1_1_1_0 + 0.498302684969437*G0_1_1_1_1 + 0.0283834683834731*G0_1_1_1_2 + 0.273483976341166*G0_1_1_1_3 - 0.126022548879713*G0_1_1_1_4 - 0.00641178926893335*G0_1_1_1_5 - 0.00414358128643906*G0_1_1_1_6 - 0.14140779855068*G0_1_1_1_7 + 0.277644894787799*G0_1_1_1_8 + 0.0452525252525331*G0_1_1_1_9 - 0.00143898429612738*G0_1_1_2_0 + 0.0283834683834731*G0_1_1_2_1 + 0.00677812487336409*G0_1_1_2_2 + 0.0379510436653357*G0_1_1_2_3 - 0.0150004492861661*G0_1_1_2_4 - 0.00207327064469955*G0_1_1_2_5 - 0.000704480704480828*G0_1_1_2_6 - 0.0187194815766276*G0_1_1_2_7 + 0.0301586244443438*G0_1_1_2_8 + 0.0122924694353287*G0_1_1_2_9 + 0.0304021904021957*G0_1_1_3_0 + 0.273483976341166*G0_1_1_3_1 + 0.0379510436653357*G0_1_1_3_2 + 0.505315636744294*G0_1_1_3_3 - 0.182990342990374*G0_1_1_3_4 - 0.0222520336806088*G0_1_1_3_5 - 0.0150363921792518*G0_1_1_3_6 - 0.118673707245156*G0_1_1_3_7 + 0.236616716616757*G0_1_1_3_8 + 0.101589838732713*G0_1_1_3_9 - 0.00906056906057061*G0_1_1_4_0 - 0.126022548879713*G0_1_1_4_1 - 0.0150004492861661*G0_1_1_4_2 - 0.182990342990374*G0_1_1_4_3 + 0.129668426811306*G0_1_1_4_4 - 0.000285428856857499*G0_1_1_4_5 + 0.0153218210361093*G0_1_1_4_6 + 0.0554036439750818*G0_1_1_4_7 - 0.117943009371601*G0_1_1_4_8 - 0.036306550592271*G0_1_1_4_9 - 0.0381527467241816*G0_1_1_5_0 - 0.00641178926893335*G0_1_1_5_1 - 0.00207327064469955*G0_1_1_5_2 - 0.0222520336806088*G0_1_1_5_3 - 0.000285428856857499*G0_1_1_5_4 + 0.0371133628276549*G0_1_1_5_5 - 0.00048332619761205*G0_1_1_5_6 - 0.0204595404595437*G0_1_1_5_7 - 0.00823176823176978*G0_1_1_5_8 + 0.0242957042957084*G0_1_1_5_9 + 0.0177849663563979*G0_1_1_6_0 - 0.00414358128643906*G0_1_1_6_1 - 0.000704480704480828*G0_1_1_6_2 - 0.0150363921792518*G0_1_1_6_3 + 0.0153218210361093*G0_1_1_6_4 - 0.00048332619761205*G0_1_1_6_5 + 0.00774844203415768*G0_1_1_6_6 + 0.0286913086913134*G0_1_1_6_7 - 0.0252889967175723*G0_1_1_6_8 - 0.00680462394748221*G0_1_1_6_9 - 0.117559477559497*G0_1_1_7_0 - 0.14140779855068*G0_1_1_7_1 - 0.0187194815766276*G0_1_1_7_2 - 0.118673707245156*G0_1_1_7_3 + 0.0554036439750818*G0_1_1_7_4 - 0.0204595404595437*G0_1_1_7_5 + 0.0286913086913134*G0_1_1_7_6 - 0.189463869463901*G0_1_1_7_7 - 0.10243090243092*G0_1_1_7_8 - 0.049550449550458*G0_1_1_7_9 + 0.0806334406334543*G0_1_1_8_0 + 0.277644894787799*G0_1_1_8_1 + 0.0301586244443438*G0_1_1_8_2 + 0.236616716616757*G0_1_1_8_3 - 0.117943009371601*G0_1_1_8_4 - 0.00823176823176978*G0_1_1_8_5 - 0.0252889967175723*G0_1_1_8_6 - 0.10243090243092*G0_1_1_8_7 + 0.436995385566888*G0_1_1_8_8 + 0.100128442985603*G0_1_1_8_9 - 0.00261072261072305*G0_1_1_9_0 + 0.0452525252525331*G0_1_1_9_1 + 0.0122924694353287*G0_1_1_9_2 + 0.101589838732713*G0_1_1_9_3 - 0.036306550592271*G0_1_1_9_4 + 0.0242957042957084*G0_1_1_9_5 - 0.00680462394748221*G0_1_1_9_6 - 0.049550449550458*G0_1_1_9_7 + 0.100128442985603*G0_1_1_9_8 + 0.156186670472411*G0_1_1_9_9; + A[125] = A[56] - 0.00677812487336415*G0_0_0_0_0 + 0.00143898429612739*G0_0_0_0_1 - 0.0283834683834732*G0_0_0_0_2 + 0.0187194815766277*G0_0_0_0_3 - 0.0301586244443439*G0_0_0_0_4 + 0.0150004492861661*G0_0_0_0_5 - 0.0379510436653359*G0_0_0_0_6 + 0.000704480704480814*G0_0_0_0_7 + 0.00207327064469958*G0_0_0_0_8 - 0.0122924694353287*G0_0_0_0_9 + 0.00143898429612739*G0_0_0_1_0 + 0.0752754124182821*G0_0_0_1_1 - 0.0193337526670893*G0_0_0_1_2 + 0.117559477559497*G0_0_0_1_3 - 0.0806334406334543*G0_0_0_1_4 + 0.00906056906057061*G0_0_0_1_5 - 0.0304021904021956*G0_0_0_1_6 - 0.0177849663563979*G0_0_0_1_7 + 0.0381527467241817*G0_0_0_1_8 + 0.0026107226107231*G0_0_0_1_9 - 0.0283834683834732*G0_0_0_2_0 - 0.0193337526670893*G0_0_0_2_1 - 0.498302684969435*G0_0_0_2_2 + 0.141407798550679*G0_0_0_2_3 - 0.277644894787798*G0_0_0_2_4 + 0.126022548879713*G0_0_0_2_5 - 0.273483976341165*G0_0_0_2_6 + 0.00414358128643909*G0_0_0_2_7 + 0.00641178926893317*G0_0_0_2_8 - 0.0452525252525328*G0_0_0_2_9 + 0.0187194815766277*G0_0_0_3_0 + 0.117559477559497*G0_0_0_3_1 + 0.141407798550679*G0_0_0_3_2 + 0.189463869463902*G0_0_0_3_3 + 0.10243090243092*G0_0_0_3_4 - 0.0554036439750818*G0_0_0_3_5 + 0.118673707245156*G0_0_0_3_6 - 0.0286913086913136*G0_0_0_3_7 + 0.0204595404595441*G0_0_0_3_8 + 0.049550449550458*G0_0_0_3_9 - 0.0301586244443439*G0_0_0_4_0 - 0.0806334406334543*G0_0_0_4_1 - 0.277644894787798*G0_0_0_4_2 + 0.10243090243092*G0_0_0_4_3 - 0.436995385566888*G0_0_0_4_4 + 0.117943009371601*G0_0_0_4_5 - 0.236616716616756*G0_0_0_4_6 + 0.0252889967175724*G0_0_0_4_7 + 0.00823176823176952*G0_0_0_4_8 - 0.100128442985603*G0_0_0_4_9 + 0.0150004492861661*G0_0_0_5_0 + 0.00906056906057061*G0_0_0_5_1 + 0.126022548879713*G0_0_0_5_2 - 0.0554036439750818*G0_0_0_5_3 + 0.117943009371601*G0_0_0_5_4 - 0.129668426811306*G0_0_0_5_5 + 0.182990342990374*G0_0_0_5_6 - 0.0153218210361093*G0_0_0_5_7 + 0.000285428856857484*G0_0_0_5_8 + 0.0363065505922709*G0_0_0_5_9 - 0.0379510436653359*G0_0_0_6_0 - 0.0304021904021956*G0_0_0_6_1 - 0.273483976341165*G0_0_0_6_2 + 0.118673707245156*G0_0_0_6_3 - 0.236616716616756*G0_0_0_6_4 + 0.182990342990374*G0_0_0_6_5 - 0.505315636744293*G0_0_0_6_6 + 0.0150363921792518*G0_0_0_6_7 + 0.0222520336806088*G0_0_0_6_8 - 0.101589838732713*G0_0_0_6_9 + 0.000704480704480814*G0_0_0_7_0 - 0.0177849663563979*G0_0_0_7_1 + 0.00414358128643909*G0_0_0_7_2 - 0.0286913086913136*G0_0_0_7_3 + 0.0252889967175724*G0_0_0_7_4 - 0.0153218210361093*G0_0_0_7_5 + 0.0150363921792518*G0_0_0_7_6 - 0.0077484420341576*G0_0_0_7_7 + 0.000483326197611949*G0_0_0_7_8 + 0.00680462394748217*G0_0_0_7_9 + 0.00207327064469958*G0_0_0_8_0 + 0.0381527467241817*G0_0_0_8_1 + 0.00641178926893317*G0_0_0_8_2 + 0.0204595404595441*G0_0_0_8_3 + 0.00823176823176952*G0_0_0_8_4 + 0.000285428856857484*G0_0_0_8_5 + 0.0222520336806088*G0_0_0_8_6 + 0.000483326197611954*G0_0_0_8_7 - 0.0371133628276547*G0_0_0_8_8 - 0.0242957042957083*G0_0_0_8_9 - 0.0122924694353287*G0_0_0_9_0 + 0.0026107226107231*G0_0_0_9_1 - 0.0452525252525328*G0_0_0_9_2 + 0.049550449550458*G0_0_0_9_3 - 0.100128442985603*G0_0_0_9_4 + 0.0363065505922709*G0_0_0_9_5 - 0.101589838732713*G0_0_0_9_6 + 0.00680462394748217*G0_0_0_9_7 - 0.0242957042957083*G0_0_0_9_8 - 0.156186670472411*G0_0_0_9_9 + 0.00545119783215114*G0_0_1_0_1 - 0.00545119783215116*G0_0_1_0_2 + 0.0302579959722869*G0_0_1_0_3 - 0.0302579959722869*G0_0_1_0_4 + 0.00641982356268182*G0_0_1_0_5 - 0.0166910338338938*G0_0_1_0_6 - 0.00641982356268179*G0_0_1_0_7 + 0.0166910338338938*G0_0_1_0_8 + 0.00545119783215114*G0_0_1_1_0 + 0.0976800976801139*G0_0_1_1_1 + 0.139788254073992*G0_0_1_1_3 - 0.0850231250231394*G0_0_1_1_4 + 0.00476475905047414*G0_0_1_1_5 - 0.0183460983461015*G0_0_1_1_6 - 0.030122681551258*G0_0_1_1_7 + 0.0640967498110463*G0_0_1_1_8 + 0.0100065014350746*G0_0_1_1_9 - 0.00545119783215116*G0_0_1_2_0 - 0.097680097680114*G0_0_1_2_2 + 0.0850231250231393*G0_0_1_2_3 - 0.139788254073992*G0_0_1_2_4 + 0.030122681551258*G0_0_1_2_5 - 0.0640967498110463*G0_0_1_2_6 - 0.00476475905047413*G0_0_1_2_7 + 0.0183460983461014*G0_0_1_2_8 - 0.0100065014350745*G0_0_1_2_9 + 0.0302579959722869*G0_0_1_3_0 + 0.139788254073992*G0_0_1_3_1 + 0.0850231250231393*G0_0_1_3_2 + 0.397042957043025*G0_0_1_3_3 - 0.0525341325341413*G0_0_1_3_5 + 0.0550382950383043*G0_0_1_3_6 - 0.0907739879168603*G0_0_1_3_7 + 0.145812282955165*G0_0_1_3_8 + 0.151528471528497*G0_0_1_3_9 - 0.0302579959722869*G0_0_1_4_0 - 0.0850231250231394*G0_0_1_4_1 - 0.139788254073992*G0_0_1_4_2 - 0.397042957043024*G0_0_1_4_4 + 0.0907739879168604*G0_0_1_4_5 - 0.145812282955165*G0_0_1_4_6 + 0.0525341325341413*G0_0_1_4_7 - 0.0550382950383042*G0_0_1_4_8 - 0.151528471528497*G0_0_1_4_9 + 0.00641982356268182*G0_0_1_5_0 + 0.00476475905047414*G0_0_1_5_1 + 0.030122681551258*G0_0_1_5_2 - 0.0525341325341413*G0_0_1_5_3 + 0.0907739879168604*G0_0_1_5_4 - 0.0288321202606966*G0_0_1_5_5 + 0.066592455163895*G0_0_1_5_6 - 0.0142942771514224*G0_0_1_5_8 + 0.0285885543028448*G0_0_1_5_9 - 0.0166910338338938*G0_0_1_6_0 - 0.0183460983461015*G0_0_1_6_1 - 0.0640967498110463*G0_0_1_6_2 + 0.0550382950383043*G0_0_1_6_3 - 0.145812282955165*G0_0_1_6_4 + 0.066592455163895*G0_0_1_6_5 - 0.145698111412422*G0_0_1_6_6 + 0.0142942771514224*G0_0_1_6_7 - 0.0800570857713849*G0_0_1_6_9 - 0.00641982356268179*G0_0_1_7_0 - 0.030122681551258*G0_0_1_7_1 - 0.00476475905047413*G0_0_1_7_2 - 0.0907739879168603*G0_0_1_7_3 + 0.0525341325341413*G0_0_1_7_4 + 0.0142942771514224*G0_0_1_7_6 + 0.0288321202606965*G0_0_1_7_7 - 0.0665924551638948*G0_0_1_7_8 - 0.0285885543028448*G0_0_1_7_9 + 0.0166910338338938*G0_0_1_8_0 + 0.0640967498110463*G0_0_1_8_1 + 0.0183460983461014*G0_0_1_8_2 + 0.145812282955165*G0_0_1_8_3 - 0.0550382950383042*G0_0_1_8_4 - 0.0142942771514224*G0_0_1_8_5 - 0.0665924551638948*G0_0_1_8_7 + 0.145698111412422*G0_0_1_8_8 + 0.0800570857713849*G0_0_1_8_9 + 0.0100065014350746*G0_0_1_9_1 - 0.0100065014350745*G0_0_1_9_2 + 0.151528471528497*G0_0_1_9_3 - 0.151528471528497*G0_0_1_9_4 + 0.0285885543028448*G0_0_1_9_5 - 0.0800570857713849*G0_0_1_9_6 - 0.0285885543028448*G0_0_1_9_7 + 0.0800570857713849*G0_0_1_9_8 + 0.0153215391310656*G0_1_0_0_1 - 0.0153215391310656*G0_1_0_0_2 + 0.0163519020661906*G0_1_0_0_3 - 0.0163519020661906*G0_1_0_0_4 + 0.00371522657237003*G0_1_0_0_5 - 0.00794803080517498*G0_1_0_0_6 - 0.00371522657237011*G0_1_0_0_7 + 0.00794803080517508*G0_1_0_0_8 + 0.0153215391310656*G0_1_0_1_0 + 0.393844462415959*G0_1_0_1_1 + 0.217967852253604*G0_1_0_1_3 - 0.117159877159897*G0_1_0_1_4 + 0.000395794681508918*G0_1_0_1_5 - 0.00880896880897026*G0_1_0_1_6 - 0.0710024367167347*G0_1_0_1_7 + 0.14498094498097*G0_1_0_1_8 + 0.0229535543821298*G0_1_0_1_9 - 0.0153215391310656*G0_1_0_2_0 - 0.393844462415957*G0_1_0_2_2 + 0.117159877159897*G0_1_0_2_3 - 0.217967852253603*G0_1_0_2_4 + 0.0710024367167343*G0_1_0_2_5 - 0.144980944980969*G0_1_0_2_6 - 0.000395794681509068*G0_1_0_2_7 + 0.00880896880897029*G0_1_0_2_8 - 0.0229535543821296*G0_1_0_2_9 + 0.0163519020661906*G0_1_0_3_0 + 0.217967852253604*G0_1_0_3_1 + 0.117159877159897*G0_1_0_3_2 + 0.258781218781263*G0_1_0_3_3 - 0.0251215451215494*G0_1_0_3_5 + 0.0264269064269108*G0_1_0_3_6 - 0.0490557061985718*G0_1_0_3_7 + 0.0754826126254829*G0_1_0_3_8 + 0.0292507492507544*G0_1_0_3_9 - 0.0163519020661906*G0_1_0_4_0 - 0.117159877159897*G0_1_0_4_1 - 0.217967852253603*G0_1_0_4_2 - 0.258781218781263*G0_1_0_4_4 + 0.0490557061985716*G0_1_0_4_5 - 0.0754826126254825*G0_1_0_4_6 + 0.0251215451215494*G0_1_0_4_7 - 0.026426906426911*G0_1_0_4_8 - 0.0292507492507543*G0_1_0_4_9 + 0.00371522657237003*G0_1_0_5_0 + 0.000395794681508918*G0_1_0_5_1 + 0.0710024367167343*G0_1_0_5_2 - 0.0251215451215493*G0_1_0_5_3 + 0.0490557061985716*G0_1_0_5_4 - 0.0247676133390461*G0_1_0_5_5 + 0.0353551210694126*G0_1_0_5_6 - 0.00118738404452715*G0_1_0_5_8 + 0.00237476808905418*G0_1_0_5_9 - 0.00794803080517498*G0_1_0_6_0 - 0.00880896880897026*G0_1_0_6_1 - 0.144980944980969*G0_1_0_6_2 + 0.0264269064269108*G0_1_0_6_3 - 0.0754826126254825*G0_1_0_6_4 + 0.0353551210694126*G0_1_0_6_5 - 0.00337186622900926*G0_1_0_6_6 + 0.0011873840445271*G0_1_0_6_7 + 0.0160068502925673*G0_1_0_6_9 - 0.00371522657237011*G0_1_0_7_0 - 0.0710024367167347*G0_1_0_7_1 - 0.000395794681509068*G0_1_0_7_2 - 0.0490557061985718*G0_1_0_7_3 + 0.0251215451215494*G0_1_0_7_4 + 0.0011873840445271*G0_1_0_7_6 + 0.0247676133390461*G0_1_0_7_7 - 0.035355121069413*G0_1_0_7_8 - 0.00237476808905427*G0_1_0_7_9 + 0.00794803080517508*G0_1_0_8_0 + 0.14498094498097*G0_1_0_8_1 + 0.00880896880897029*G0_1_0_8_2 + 0.0754826126254829*G0_1_0_8_3 - 0.026426906426911*G0_1_0_8_4 - 0.00118738404452715*G0_1_0_8_5 - 0.035355121069413*G0_1_0_8_7 + 0.00337186622901023*G0_1_0_8_8 - 0.0160068502925671*G0_1_0_8_9 + 0.0229535543821298*G0_1_0_9_1 - 0.0229535543821296*G0_1_0_9_2 + 0.0292507492507544*G0_1_0_9_3 - 0.0292507492507543*G0_1_0_9_4 + 0.00237476808905418*G0_1_0_9_5 + 0.0160068502925673*G0_1_0_9_6 - 0.00237476808905427*G0_1_0_9_7 - 0.0160068502925671*G0_1_0_9_8 + 0.00677812487336411*G0_1_1_0_0 + 0.0283834683834733*G0_1_1_0_1 - 0.00143898429612741*G0_1_1_0_2 + 0.0301586244443439*G0_1_1_0_3 - 0.0187194815766277*G0_1_1_0_4 - 0.000704480704480836*G0_1_1_0_5 - 0.00207327064469955*G0_1_1_0_6 - 0.0150004492861662*G0_1_1_0_7 + 0.0379510436653359*G0_1_1_0_8 + 0.0122924694353287*G0_1_1_0_9 + 0.0283834683834733*G0_1_1_1_0 + 0.498302684969437*G0_1_1_1_1 + 0.0193337526670892*G0_1_1_1_2 + 0.277644894787799*G0_1_1_1_3 - 0.14140779855068*G0_1_1_1_4 - 0.00414358128643929*G0_1_1_1_5 - 0.00641178926893313*G0_1_1_1_6 - 0.126022548879713*G0_1_1_1_7 + 0.273483976341166*G0_1_1_1_8 + 0.0452525252525331*G0_1_1_1_9 - 0.00143898429612741*G0_1_1_2_0 + 0.0193337526670892*G0_1_1_2_1 - 0.0752754124182821*G0_1_1_2_2 + 0.0806334406334542*G0_1_1_2_3 - 0.117559477559497*G0_1_1_2_4 + 0.0177849663563979*G0_1_1_2_5 - 0.0381527467241817*G0_1_1_2_6 - 0.00906056906057058*G0_1_1_2_7 + 0.0304021904021955*G0_1_1_2_8 - 0.00261072261072304*G0_1_1_2_9 + 0.0301586244443439*G0_1_1_3_0 + 0.277644894787799*G0_1_1_3_1 + 0.0806334406334542*G0_1_1_3_2 + 0.436995385566888*G0_1_1_3_3 - 0.10243090243092*G0_1_1_3_4 - 0.0252889967175724*G0_1_1_3_5 - 0.0082317682317696*G0_1_1_3_6 - 0.117943009371601*G0_1_1_3_7 + 0.236616716616757*G0_1_1_3_8 + 0.100128442985603*G0_1_1_3_9 - 0.0187194815766277*G0_1_1_4_0 - 0.14140779855068*G0_1_1_4_1 - 0.117559477559497*G0_1_1_4_2 - 0.10243090243092*G0_1_1_4_3 - 0.189463869463902*G0_1_1_4_4 + 0.0286913086913136*G0_1_1_4_5 - 0.020459540459544*G0_1_1_4_6 + 0.0554036439750819*G0_1_1_4_7 - 0.118673707245156*G0_1_1_4_8 - 0.0495504495504579*G0_1_1_4_9 - 0.000704480704480836*G0_1_1_5_0 - 0.00414358128643929*G0_1_1_5_1 + 0.0177849663563979*G0_1_1_5_2 - 0.0252889967175724*G0_1_1_5_3 + 0.0286913086913136*G0_1_1_5_4 + 0.0077484420341576*G0_1_1_5_5 - 0.000483326197611992*G0_1_1_5_6 + 0.0153218210361094*G0_1_1_5_7 - 0.0150363921792519*G0_1_1_5_8 - 0.00680462394748227*G0_1_1_5_9 - 0.00207327064469956*G0_1_1_6_0 - 0.00641178926893313*G0_1_1_6_1 - 0.0381527467241817*G0_1_1_6_2 - 0.0082317682317696*G0_1_1_6_3 - 0.0204595404595439*G0_1_1_6_4 - 0.000483326197611991*G0_1_1_6_5 + 0.037113362827655*G0_1_1_6_6 - 0.000285428856857497*G0_1_1_6_7 - 0.0222520336806088*G0_1_1_6_8 + 0.0242957042957085*G0_1_1_6_9 - 0.0150004492861662*G0_1_1_7_0 - 0.126022548879713*G0_1_1_7_1 - 0.00906056906057058*G0_1_1_7_2 - 0.117943009371601*G0_1_1_7_3 + 0.0554036439750819*G0_1_1_7_4 + 0.0153218210361094*G0_1_1_7_5 - 0.000285428856857497*G0_1_1_7_6 + 0.129668426811306*G0_1_1_7_7 - 0.182990342990374*G0_1_1_7_8 - 0.036306550592271*G0_1_1_7_9 + 0.0379510436653359*G0_1_1_8_0 + 0.273483976341166*G0_1_1_8_1 + 0.0304021904021955*G0_1_1_8_2 + 0.236616716616757*G0_1_1_8_3 - 0.118673707245156*G0_1_1_8_4 - 0.0150363921792519*G0_1_1_8_5 - 0.0222520336806088*G0_1_1_8_6 - 0.182990342990374*G0_1_1_8_7 + 0.505315636744293*G0_1_1_8_8 + 0.101589838732713*G0_1_1_8_9 + 0.0122924694353287*G0_1_1_9_0 + 0.0452525252525331*G0_1_1_9_1 - 0.00261072261072304*G0_1_1_9_2 + 0.100128442985603*G0_1_1_9_3 - 0.0495504495504579*G0_1_1_9_4 - 0.00680462394748227*G0_1_1_9_5 + 0.0242957042957085*G0_1_1_9_6 - 0.036306550592271*G0_1_1_9_7 + 0.101589838732713*G0_1_1_9_8 + 0.156186670472411*G0_1_1_9_9; + A[83] = A[125] + 0.00184140374616596*G0_0_1_0_0 + 0.00107419916943745*G0_0_1_0_1 - 0.00879614212947696*G0_0_1_0_2 - 0.00370296370296434*G0_0_1_0_3 + 0.0102031302031319*G0_0_1_0_4 - 0.00298368298368351*G0_0_1_0_5 + 0.00737928737928868*G0_0_1_0_6 - 0.000279085993371761*G0_0_1_0_7 - 0.00136371564943017*G0_0_1_0_8 + 0.00868464868465017*G0_0_1_0_9 + 0.00107419916943745*G0_0_1_1_0 + 0.00184140374616592*G0_0_1_1_1 - 0.00879614212947696*G0_0_1_1_2 - 0.0029836829836835*G0_0_1_1_3 + 0.00737928737928863*G0_0_1_1_4 - 0.00370296370296433*G0_0_1_1_5 + 0.0102031302031319*G0_0_1_1_6 - 0.00136371564943015*G0_0_1_1_7 - 0.000279085993371793*G0_0_1_1_8 + 0.00868464868465015*G0_0_1_1_9 - 0.00879614212947696*G0_0_1_2_0 - 0.00879614212947696*G0_0_1_2_1 - 0.294322960989677*G0_0_1_2_2 + 0.0395160395160461*G0_0_1_2_3 - 0.0811632811632948*G0_0_1_2_4 + 0.0395160395160461*G0_0_1_2_5 - 0.0811632811632946*G0_0_1_2_6 + 0.000666000666000764*G0_0_1_2_7 + 0.000666000666000751*G0_0_1_2_8 - 0.00426240426240495*G0_0_1_2_9 - 0.00370296370296434*G0_0_1_3_0 - 0.0029836829836835*G0_0_1_3_1 + 0.0395160395160461*G0_0_1_3_2 + 0.0103896103896121*G0_0_1_3_3 - 0.0307692307692359*G0_0_1_3_4 + 0.0143856143856168*G0_0_1_3_5 - 0.0371628371628434*G0_0_1_3_6 + 0.00455544455544532*G0_0_1_3_7 + 0.00399600399600464*G0_0_1_3_8 - 0.035164835164841*G0_0_1_3_9 + 0.0102031302031319*G0_0_1_4_0 + 0.00737928737928863*G0_0_1_4_1 - 0.0811632811632948*G0_0_1_4_2 - 0.0307692307692359*G0_0_1_4_3 + 0.148651348651374*G0_0_1_4_4 - 0.0371628371628435*G0_0_1_4_5 + 0.0743256743256869*G0_0_1_4_6 - 0.0130269730269752*G0_0_1_4_7 - 0.00855144855144997*G0_0_1_4_8 + 0.0871128871129017*G0_0_1_4_9 - 0.00298368298368351*G0_0_1_5_0 - 0.00370296370296433*G0_0_1_5_1 + 0.0395160395160461*G0_0_1_5_2 + 0.0143856143856168*G0_0_1_5_3 - 0.0371628371628435*G0_0_1_5_4 + 0.0103896103896122*G0_0_1_5_5 - 0.0307692307692362*G0_0_1_5_6 + 0.00399600399600468*G0_0_1_5_7 + 0.00455544455544532*G0_0_1_5_8 - 0.0351648351648411*G0_0_1_5_9 + 0.00737928737928868*G0_0_1_6_0 + 0.010203130203132*G0_0_1_6_1 - 0.0811632811632946*G0_0_1_6_2 - 0.0371628371628434*G0_0_1_6_3 + 0.0743256743256869*G0_0_1_6_4 - 0.0307692307692362*G0_0_1_6_5 + 0.148651348651374*G0_0_1_6_6 - 0.00855144855144998*G0_0_1_6_7 - 0.0130269730269752*G0_0_1_6_8 + 0.0871128871129018*G0_0_1_6_9 - 0.000279085993371761*G0_0_1_7_0 - 0.00136371564943015*G0_0_1_7_1 + 0.000666000666000764*G0_0_1_7_2 + 0.00455544455544532*G0_0_1_7_3 - 0.0130269730269752*G0_0_1_7_4 + 0.00399600399600468*G0_0_1_7_5 - 0.00855144855144998*G0_0_1_7_6 + 0.00632510346796155*G0_0_1_7_7 + 0.000468103325246279*G0_0_1_7_8 - 0.00895104895105044*G0_0_1_7_9 - 0.00136371564943017*G0_0_1_8_0 - 0.000279085993371793*G0_0_1_8_1 + 0.000666000666000752*G0_0_1_8_2 + 0.00399600399600464*G0_0_1_8_3 - 0.00855144855144997*G0_0_1_8_4 + 0.00455544455544532*G0_0_1_8_5 - 0.0130269730269752*G0_0_1_8_6 + 0.000468103325246279*G0_0_1_8_7 + 0.00632510346796145*G0_0_1_8_8 - 0.00895104895105047*G0_0_1_8_9 + 0.00868464868465017*G0_0_1_9_0 + 0.00868464868465015*G0_0_1_9_1 - 0.00426240426240495*G0_0_1_9_2 - 0.035164835164841*G0_0_1_9_3 + 0.0871128871129017*G0_0_1_9_4 - 0.0351648351648411*G0_0_1_9_5 + 0.0871128871129018*G0_0_1_9_6 - 0.00895104895105044*G0_0_1_9_7 - 0.00895104895105047*G0_0_1_9_8 + 0.0671328671328784*G0_0_1_9_9 - 0.00184140374616596*G0_1_0_0_0 - 0.00107419916943745*G0_1_0_0_1 + 0.00879614212947696*G0_1_0_0_2 + 0.00370296370296434*G0_1_0_0_3 - 0.0102031302031319*G0_1_0_0_4 + 0.00298368298368351*G0_1_0_0_5 - 0.00737928737928868*G0_1_0_0_6 + 0.000279085993371761*G0_1_0_0_7 + 0.00136371564943017*G0_1_0_0_8 - 0.00868464868465017*G0_1_0_0_9 - 0.00107419916943745*G0_1_0_1_0 - 0.00184140374616592*G0_1_0_1_1 + 0.00879614212947696*G0_1_0_1_2 + 0.0029836829836835*G0_1_0_1_3 - 0.00737928737928864*G0_1_0_1_4 + 0.00370296370296433*G0_1_0_1_5 - 0.0102031302031319*G0_1_0_1_6 + 0.00136371564943015*G0_1_0_1_7 + 0.000279085993371793*G0_1_0_1_8 - 0.00868464868465015*G0_1_0_1_9 + 0.00879614212947696*G0_1_0_2_0 + 0.00879614212947696*G0_1_0_2_1 + 0.294322960989677*G0_1_0_2_2 - 0.0395160395160461*G0_1_0_2_3 + 0.0811632811632948*G0_1_0_2_4 - 0.0395160395160461*G0_1_0_2_5 + 0.0811632811632946*G0_1_0_2_6 - 0.000666000666000764*G0_1_0_2_7 - 0.000666000666000751*G0_1_0_2_8 + 0.00426240426240496*G0_1_0_2_9 + 0.00370296370296434*G0_1_0_3_0 + 0.0029836829836835*G0_1_0_3_1 - 0.0395160395160461*G0_1_0_3_2 - 0.0103896103896121*G0_1_0_3_3 + 0.0307692307692359*G0_1_0_3_4 - 0.0143856143856168*G0_1_0_3_5 + 0.0371628371628434*G0_1_0_3_6 - 0.00455544455544532*G0_1_0_3_7 - 0.00399600399600464*G0_1_0_3_8 + 0.035164835164841*G0_1_0_3_9 - 0.0102031302031319*G0_1_0_4_0 - 0.00737928737928864*G0_1_0_4_1 + 0.0811632811632948*G0_1_0_4_2 + 0.0307692307692359*G0_1_0_4_3 - 0.148651348651374*G0_1_0_4_4 + 0.0371628371628435*G0_1_0_4_5 - 0.0743256743256869*G0_1_0_4_6 + 0.0130269730269752*G0_1_0_4_7 + 0.00855144855144997*G0_1_0_4_8 - 0.0871128871129017*G0_1_0_4_9 + 0.00298368298368351*G0_1_0_5_0 + 0.00370296370296433*G0_1_0_5_1 - 0.0395160395160461*G0_1_0_5_2 - 0.0143856143856168*G0_1_0_5_3 + 0.0371628371628435*G0_1_0_5_4 - 0.0103896103896122*G0_1_0_5_5 + 0.0307692307692362*G0_1_0_5_6 - 0.00399600399600468*G0_1_0_5_7 - 0.00455544455544532*G0_1_0_5_8 + 0.0351648351648411*G0_1_0_5_9 - 0.00737928737928868*G0_1_0_6_0 - 0.010203130203132*G0_1_0_6_1 + 0.0811632811632946*G0_1_0_6_2 + 0.0371628371628434*G0_1_0_6_3 - 0.0743256743256869*G0_1_0_6_4 + 0.0307692307692361*G0_1_0_6_5 - 0.148651348651374*G0_1_0_6_6 + 0.00855144855144998*G0_1_0_6_7 + 0.0130269730269752*G0_1_0_6_8 - 0.0871128871129018*G0_1_0_6_9 + 0.000279085993371761*G0_1_0_7_0 + 0.00136371564943015*G0_1_0_7_1 - 0.000666000666000764*G0_1_0_7_2 - 0.00455544455544532*G0_1_0_7_3 + 0.0130269730269752*G0_1_0_7_4 - 0.00399600399600468*G0_1_0_7_5 + 0.00855144855144998*G0_1_0_7_6 - 0.00632510346796155*G0_1_0_7_7 - 0.000468103325246279*G0_1_0_7_8 + 0.00895104895105044*G0_1_0_7_9 + 0.00136371564943017*G0_1_0_8_0 + 0.000279085993371793*G0_1_0_8_1 - 0.000666000666000752*G0_1_0_8_2 - 0.00399600399600464*G0_1_0_8_3 + 0.00855144855144997*G0_1_0_8_4 - 0.00455544455544532*G0_1_0_8_5 + 0.0130269730269752*G0_1_0_8_6 - 0.000468103325246279*G0_1_0_8_7 - 0.00632510346796145*G0_1_0_8_8 + 0.00895104895105047*G0_1_0_8_9 - 0.00868464868465017*G0_1_0_9_0 - 0.00868464868465015*G0_1_0_9_1 + 0.00426240426240495*G0_1_0_9_2 + 0.035164835164841*G0_1_0_9_3 - 0.0871128871129017*G0_1_0_9_4 + 0.0351648351648411*G0_1_0_9_5 - 0.0871128871129018*G0_1_0_9_6 + 0.00895104895105044*G0_1_0_9_7 + 0.00895104895105047*G0_1_0_9_8 - 0.0671328671328784*G0_1_0_9_9; + A[80] = -A[125] + 0.00184140374616597*G0_1_0_0_0 + 0.00107419916943745*G0_1_0_0_1 - 0.00879614212947696*G0_1_0_0_2 - 0.00370296370296434*G0_1_0_0_3 + 0.010203130203132*G0_1_0_0_4 - 0.00298368298368351*G0_1_0_0_5 + 0.00737928737928869*G0_1_0_0_6 - 0.000279085993371762*G0_1_0_0_7 - 0.00136371564943017*G0_1_0_0_8 + 0.00868464868465017*G0_1_0_0_9 + 0.00107419916943745*G0_1_0_1_0 + 0.00184140374616593*G0_1_0_1_1 - 0.00879614212947696*G0_1_0_1_2 - 0.00298368298368351*G0_1_0_1_3 + 0.00737928737928865*G0_1_0_1_4 - 0.00370296370296434*G0_1_0_1_5 + 0.010203130203132*G0_1_0_1_6 - 0.00136371564943015*G0_1_0_1_7 - 0.000279085993371792*G0_1_0_1_8 + 0.00868464868465016*G0_1_0_1_9 - 0.00879614212947696*G0_1_0_2_0 - 0.00879614212947696*G0_1_0_2_1 - 0.294322960989677*G0_1_0_2_2 + 0.039516039516046*G0_1_0_2_3 - 0.0811632811632947*G0_1_0_2_4 + 0.0395160395160461*G0_1_0_2_5 - 0.0811632811632946*G0_1_0_2_6 + 0.000666000666000763*G0_1_0_2_7 + 0.00066600066600075*G0_1_0_2_8 - 0.00426240426240495*G0_1_0_2_9 - 0.00370296370296434*G0_1_0_3_0 - 0.00298368298368351*G0_1_0_3_1 + 0.039516039516046*G0_1_0_3_2 + 0.0103896103896121*G0_1_0_3_3 - 0.0307692307692359*G0_1_0_3_4 + 0.0143856143856168*G0_1_0_3_5 - 0.0371628371628435*G0_1_0_3_6 + 0.00455544455544532*G0_1_0_3_7 + 0.00399600399600464*G0_1_0_3_8 - 0.0351648351648411*G0_1_0_3_9 + 0.010203130203132*G0_1_0_4_0 + 0.00737928737928865*G0_1_0_4_1 - 0.0811632811632947*G0_1_0_4_2 - 0.0307692307692359*G0_1_0_4_3 + 0.148651348651374*G0_1_0_4_4 - 0.0371628371628435*G0_1_0_4_5 + 0.074325674325687*G0_1_0_4_6 - 0.0130269730269752*G0_1_0_4_7 - 0.00855144855144997*G0_1_0_4_8 + 0.0871128871129017*G0_1_0_4_9 - 0.00298368298368351*G0_1_0_5_0 - 0.00370296370296434*G0_1_0_5_1 + 0.0395160395160461*G0_1_0_5_2 + 0.0143856143856168*G0_1_0_5_3 - 0.0371628371628435*G0_1_0_5_4 + 0.0103896103896123*G0_1_0_5_5 - 0.0307692307692362*G0_1_0_5_6 + 0.00399600399600468*G0_1_0_5_7 + 0.00455544455544532*G0_1_0_5_8 - 0.0351648351648411*G0_1_0_5_9 + 0.00737928737928869*G0_1_0_6_0 + 0.010203130203132*G0_1_0_6_1 - 0.0811632811632946*G0_1_0_6_2 - 0.0371628371628435*G0_1_0_6_3 + 0.074325674325687*G0_1_0_6_4 - 0.0307692307692362*G0_1_0_6_5 + 0.148651348651374*G0_1_0_6_6 - 0.00855144855144999*G0_1_0_6_7 - 0.0130269730269752*G0_1_0_6_8 + 0.0871128871129018*G0_1_0_6_9 - 0.000279085993371762*G0_1_0_7_0 - 0.00136371564943015*G0_1_0_7_1 + 0.000666000666000763*G0_1_0_7_2 + 0.00455544455544532*G0_1_0_7_3 - 0.0130269730269752*G0_1_0_7_4 + 0.00399600399600468*G0_1_0_7_5 - 0.00855144855144999*G0_1_0_7_6 + 0.00632510346796155*G0_1_0_7_7 + 0.00046810332524628*G0_1_0_7_8 - 0.00895104895105044*G0_1_0_7_9 - 0.00136371564943017*G0_1_0_8_0 - 0.000279085993371792*G0_1_0_8_1 + 0.00066600066600075*G0_1_0_8_2 + 0.00399600399600464*G0_1_0_8_3 - 0.00855144855144997*G0_1_0_8_4 + 0.00455544455544532*G0_1_0_8_5 - 0.0130269730269752*G0_1_0_8_6 + 0.00046810332524628*G0_1_0_8_7 + 0.00632510346796145*G0_1_0_8_8 - 0.00895104895105049*G0_1_0_8_9 + 0.00868464868465017*G0_1_0_9_0 + 0.00868464868465016*G0_1_0_9_1 - 0.00426240426240494*G0_1_0_9_2 - 0.0351648351648411*G0_1_0_9_3 + 0.0871128871129017*G0_1_0_9_4 - 0.0351648351648411*G0_1_0_9_5 + 0.0871128871129018*G0_1_0_9_6 - 0.00895104895105044*G0_1_0_9_7 - 0.00895104895105049*G0_1_0_9_8 + 0.0671328671328784*G0_1_0_9_9 + 0.00656838752076957*G0_1_1_0_0 + 0.00527909480290526*G0_1_1_0_1 - 0.000819920819920959*G0_1_1_0_2 - 0.00145589859875598*G0_1_1_0_3 + 0.0262167462167507*G0_1_1_0_4 - 0.0094745466174054*G0_1_1_0_5 + 0.0150812150812177*G0_1_1_0_6 - 0.00471317042745696*G0_1_1_0_7 + 0.00338159195302115*G0_1_1_0_8 + 0.0226846169703351*G0_1_1_0_9 + 0.00527909480290526*G0_1_1_1_0 + 0.0461878861878944*G0_1_1_1_1 + 0.000227920227920274*G0_1_1_1_2 + 0.00279085993371768*G0_1_1_1_3 + 0.0110644910644929*G0_1_1_1_4 - 0.00560666846381231*G0_1_1_1_5 + 0.0150812150812177*G0_1_1_1_6 - 0.0164584621727508*G0_1_1_1_7 + 0.0307400535972019*G0_1_1_1_8 + 0.014948860663149*G0_1_1_1_9 - 0.000819920819920959*G0_1_1_2_0 + 0.000227920227920274*G0_1_1_2_1 - 0.0348096348096406*G0_1_1_2_2 + 0.00836200836200973*G0_1_1_2_3 - 0.0194768194768227*G0_1_1_2_4 + 0.00486920486920565*G0_1_1_2_5 - 0.00973840973841134*G0_1_1_2_6 + 0.00186776186776217*G0_1_1_2_7 + 0.00609464609464711*G0_1_1_2_8 - 0.00275280275280324*G0_1_1_2_9 - 0.00145589859875598*G0_1_1_3_0 + 0.00279085993371767*G0_1_1_3_1 + 0.00836200836200973*G0_1_1_3_2 + 0.11140859140861*G0_1_1_3_3 - 0.0878321678321825*G0_1_1_3_4 + 0.0193140193140226*G0_1_1_3_5 - 0.0626839826839932*G0_1_1_3_6 - 0.0130726416440725*G0_1_1_3_7 + 0.0487969173683542*G0_1_1_3_8 - 0.0187012987013018*G0_1_1_3_9 + 0.0262167462167507*G0_1_1_4_0 + 0.0110644910644929*G0_1_1_4_1 - 0.0194768194768227*G0_1_1_4_2 - 0.0878321678321825*G0_1_1_4_3 + 0.476323676323756*G0_1_1_4_4 - 0.0960905760905923*G0_1_1_4_5 + 0.158774558774586*G0_1_1_4_6 - 0.033406593406599*G0_1_1_4_7 - 0.0357242757242817*G0_1_1_4_8 + 0.200439560439594*G0_1_1_4_9 - 0.0094745466174054*G0_1_1_5_0 - 0.00560666846381231*G0_1_1_5_1 + 0.00486920486920565*G0_1_1_5_2 + 0.0193140193140226*G0_1_1_5_3 - 0.0960905760905923*G0_1_1_5_4 + 0.0433699633699707*G0_1_1_5_5 - 0.0626839826839933*G0_1_1_5_6 + 0.0236639550925305*G0_1_1_5_7 - 0.0006203320489036*G0_1_1_5_8 - 0.0668131868131981*G0_1_1_5_9 + 0.0150812150812177*G0_1_1_6_0 + 0.0150812150812177*G0_1_1_6_1 - 0.00973840973841134*G0_1_1_6_2 - 0.0626839826839932*G0_1_1_6_3 + 0.158774558774586*G0_1_1_6_4 - 0.0626839826839933*G0_1_1_6_5 + 0.158774558774586*G0_1_1_6_6 - 0.0230436230436269*G0_1_1_6_7 - 0.0230436230436269*G0_1_1_6_8 + 0.133626373626396*G0_1_1_6_9 - 0.00471317042745696*G0_1_1_7_0 - 0.0164584621727508*G0_1_1_7_1 + 0.00186776186776217*G0_1_1_7_2 - 0.0130726416440725*G0_1_1_7_3 - 0.033406593406599*G0_1_1_7_4 + 0.0236639550925305*G0_1_1_7_5 - 0.0230436230436269*G0_1_1_7_6 + 0.0950820607963624*G0_1_1_7_7 - 0.0291936634793829*G0_1_1_7_8 - 0.0219666048237514*G0_1_1_7_9 + 0.00338159195302115*G0_1_1_8_0 + 0.0307400535972019*G0_1_1_8_1 + 0.00609464609464711*G0_1_1_8_2 + 0.0487969173683542*G0_1_1_8_3 - 0.0357242757242817*G0_1_1_8_4 - 0.0006203320489036*G0_1_1_8_5 - 0.0230436230436269*G0_1_1_8_6 - 0.0291936634793829*G0_1_1_8_7 + 0.195073497930674*G0_1_1_8_8 + 0.0266019694591168*G0_1_1_8_9 + 0.0226846169703352*G0_1_1_9_0 + 0.014948860663149*G0_1_1_9_1 - 0.00275280275280324*G0_1_1_9_2 - 0.0187012987013018*G0_1_1_9_3 + 0.200439560439594*G0_1_1_9_4 - 0.0668131868131981*G0_1_1_9_5 + 0.133626373626396*G0_1_1_9_6 - 0.0219666048237514*G0_1_1_9_7 + 0.0266019694591168*G0_1_1_9_8 + 0.326073926073981*G0_1_1_9_9; + A[31] = 0.000626774019631273*G0_1_0_0_0 - 0.000620316081625717*G0_1_0_0_1 - 0.000620316081625712*G0_1_0_0_2 - 2.49915428487123e-06*G0_1_0_0_3 - 2.49915428486798e-06*G0_1_0_0_4 + 0.000135291296005608*G0_1_0_0_5 - 0.000873214087499952*G0_1_0_0_6 + 0.000135291296005611*G0_1_0_0_7 - 0.000873214087499958*G0_1_0_0_8 - 0.000436963829821046*G0_1_0_0_9 - 0.000620316081625717*G0_1_0_1_0 - 0.0108191962358648*G0_1_0_1_1 - 0.000523948604305839*G0_1_0_1_2 - 0.00189433251933287*G0_1_0_1_3 + 0.00115463240463261*G0_1_0_1_4 + 0.000174902808831416*G0_1_0_1_5 - 0.000227512236440849*G0_1_0_1_6 + 0.00269179894179942*G0_1_0_1_7 - 0.00659231971732089*G0_1_0_1_8 - 0.000290959040959097*G0_1_0_1_9 - 0.000620316081625712*G0_1_0_2_0 - 0.000523948604305839*G0_1_0_2_1 - 0.0108191962358647*G0_1_0_2_2 + 0.00115463240463259*G0_1_0_2_3 - 0.00189433251933284*G0_1_0_2_4 + 0.00269179894179939*G0_1_0_2_5 - 0.00659231971732082*G0_1_0_2_6 + 0.00017490280883141*G0_1_0_2_7 - 0.000227512236440849*G0_1_0_2_8 - 0.000290959040959089*G0_1_0_2_9 - 2.49915428487122e-06*G0_1_0_3_0 - 0.00189433251933287*G0_1_0_3_1 + 0.00115463240463259*G0_1_0_3_2 + 0.00248709623709665*G0_1_0_3_3 - 0.000727858451072852*G0_1_0_3_4 - 0.000513325959754615*G0_1_0_3_5 + 0.00119197766519215*G0_1_0_3_6 + 0.000516938418724228*G0_1_0_3_7 - 0.00170891608391639*G0_1_0_3_8 - 0.000160999714571169*G0_1_0_3_9 - 2.49915428486797e-06*G0_1_0_4_0 + 0.00115463240463261*G0_1_0_4_1 - 0.00189433251933284*G0_1_0_4_2 - 0.000727858451072852*G0_1_0_4_3 + 0.00248709623709665*G0_1_0_4_4 + 0.000516938418724219*G0_1_0_4_5 - 0.00170891608391637*G0_1_0_4_6 - 0.000513325959754622*G0_1_0_4_7 + 0.00119197766519216*G0_1_0_4_8 - 0.000160999714571171*G0_1_0_4_9 + 0.000135291296005608*G0_1_0_5_0 + 0.000174902808831416*G0_1_0_5_1 + 0.00269179894179939*G0_1_0_5_2 - 0.000513325959754615*G0_1_0_5_3 + 0.000516938418724219*G0_1_0_5_4 - 0.00261839351125108*G0_1_0_5_5 + 0.00481814316635826*G0_1_0_5_6 + 3.0534941249232e-05*G0_1_0_5_7 - 1.52674706246116e-05*G0_1_0_5_8 + 0.00134142643071237*G0_1_0_5_9 - 0.000873214087499952*G0_1_0_6_0 - 0.000227512236440849*G0_1_0_6_1 - 0.00659231971732082*G0_1_0_6_2 + 0.00119197766519215*G0_1_0_6_3 - 0.00170891608391637*G0_1_0_6_4 + 0.00481814316635826*G0_1_0_6_5 - 0.0107513320013338*G0_1_0_6_6 - 1.52674706246164e-05*G0_1_0_6_7 + 0.000427816231387729*G0_1_0_6_8 - 0.00151107820750703*G0_1_0_6_9 + 0.000135291296005611*G0_1_0_7_0 + 0.00269179894179942*G0_1_0_7_1 + 0.00017490280883141*G0_1_0_7_2 + 0.000516938418724228*G0_1_0_7_3 - 0.000513325959754622*G0_1_0_7_4 + 3.0534941249232e-05*G0_1_0_7_5 - 1.52674706246164e-05*G0_1_0_7_6 - 0.0026183935112511*G0_1_0_7_7 + 0.00481814316635829*G0_1_0_7_8 + 0.00134142643071237*G0_1_0_7_9 - 0.000873214087499958*G0_1_0_8_0 - 0.00659231971732089*G0_1_0_8_1 - 0.000227512236440849*G0_1_0_8_2 - 0.00170891608391639*G0_1_0_8_3 + 0.00119197766519216*G0_1_0_8_4 - 1.52674706246116e-05*G0_1_0_8_5 + 0.000427816231387729*G0_1_0_8_6 + 0.00481814316635829*G0_1_0_8_7 - 0.0107513320013339*G0_1_0_8_8 - 0.00151107820750704*G0_1_0_8_9 - 0.000436963829821046*G0_1_0_9_0 - 0.000290959040959097*G0_1_0_9_1 - 0.000290959040959088*G0_1_0_9_2 - 0.000160999714571169*G0_1_0_9_3 - 0.000160999714571171*G0_1_0_9_4 + 0.00134142643071237*G0_1_0_9_5 - 0.00151107820750703*G0_1_0_9_6 + 0.00134142643071237*G0_1_0_9_7 - 0.00151107820750704*G0_1_0_9_8 - 0.00183352361923822*G0_1_0_9_9; + A[110] = A[31] + 0.00119386786053473*G0_0_0_0_0 + 0.000674493055445552*G0_0_0_0_1 + 0.0106520639853991*G0_0_0_0_2 - 0.00329162900591528*G0_0_0_0_3 + 0.010238650238652*G0_0_0_0_4 - 0.00064538635967217*G0_0_0_0_5 - 0.00200022200022241*G0_0_0_0_6 + 0.000241345955631709*G0_0_0_0_7 - 0.000724989296418001*G0_0_0_0_9 + 0.000674493055445552*G0_0_0_1_0 + 0.00161447018589903*G0_0_0_1_1 + 0.0170535637202333*G0_0_0_1_2 - 0.00831010259581829*G0_0_0_1_3 + 0.0227750027750067*G0_0_0_1_4 - 0.00179217607789066*G0_0_0_1_5 - 0.000310800310800391*G0_0_0_1_6 + 0.00011226868369727*G0_0_0_1_9 + 0.0106520639853991*G0_0_0_2_0 + 0.0170535637202333*G0_0_0_2_1 + 0.298264698264748*G0_0_0_2_2 - 0.0782994782994914*G0_0_0_2_3 + 0.180308580308611*G0_0_0_2_4 - 0.0449106449106523*G0_0_0_2_5 + 0.0836940836940974*G0_0_0_2_6 - 0.00254856254856296*G0_0_0_2_7 - 0.0023354423354427*G0_0_0_2_8 + 0.0175824175824205*G0_0_0_2_9 - 0.00329162900591528*G0_0_0_3_0 - 0.00831010259581829*G0_0_0_3_1 - 0.0782994782994914*G0_0_0_3_2 + 0.039400599400606*G0_0_0_3_3 - 0.110329670329689*G0_0_0_3_4 + 0.0118681318681338*G0_0_0_3_5 - 0.00755244755244876*G0_0_0_3_6 + 0.0013900385328959*G0_0_0_3_7 - 0.00311688311688362*G0_0_0_3_9 + 0.010238650238652*G0_0_0_4_0 + 0.0227750027750067*G0_0_0_4_1 + 0.180308580308611*G0_0_0_4_2 - 0.110329670329689*G0_0_0_4_3 + 0.341258741258799*G0_0_0_4_4 - 0.0392007992008058*G0_0_0_4_5 + 0.0467532467532545*G0_0_0_4_6 - 0.00729270729270851*G0_0_0_4_7 - 0.00147852147852171*G0_0_0_4_8 + 0.0256543456543499*G0_0_0_4_9 - 0.00064538635967217*G0_0_0_5_0 - 0.00179217607789066*G0_0_0_5_1 - 0.0449106449106523*G0_0_0_5_2 + 0.0118681318681338*G0_0_0_5_3 - 0.0392007992008058*G0_0_0_5_4 + 0.0119080919080938*G0_0_0_5_5 + 0.0108291708291729*G0_0_0_5_6 + 0.00394748109033889*G0_0_0_5_7 - 0.00310832025117792*G0_0_0_5_8 + 0.00839160839160985*G0_0_0_5_9 - 0.00200022200022241*G0_0_0_6_0 - 0.000310800310800391*G0_0_0_6_1 + 0.0836940836940974*G0_0_0_6_2 - 0.00755244755244876*G0_0_0_6_3 + 0.0467532467532545*G0_0_0_6_4 + 0.0108291708291729*G0_0_0_6_5 - 0.154245754245781*G0_0_0_6_6 - 0.00083916083916098*G0_0_0_6_7 + 0.00821178821178959*G0_0_0_6_8 - 0.037642357642364*G0_0_0_6_9 + 0.000241345955631709*G0_0_0_7_0 - 0.00254856254856296*G0_0_0_7_2 + 0.0013900385328959*G0_0_0_7_3 - 0.00729270729270851*G0_0_0_7_4 + 0.00394748109033889*G0_0_0_7_5 - 0.000839160839160979*G0_0_0_7_6 + 0.00489225060653712*G0_0_0_7_7 - 0.0015042100756389*G0_0_0_7_8 + 0.00385328956757592*G0_0_0_7_9 - 0.0023354423354427*G0_0_0_8_2 - 0.00147852147852171*G0_0_0_8_4 - 0.00310832025117792*G0_0_0_8_5 + 0.00821178821178959*G0_0_0_8_6 - 0.0015042100756389*G0_0_0_8_7 + 0.00119309262166424*G0_0_0_8_8 + 0.00262023690595162*G0_0_0_8_9 - 0.000724989296418*G0_0_0_9_0 + 0.000112268683697269*G0_0_0_9_1 + 0.0175824175824205*G0_0_0_9_2 - 0.00311688311688362*G0_0_0_9_3 + 0.0256543456543499*G0_0_0_9_4 + 0.00839160839160985*G0_0_0_9_5 - 0.037642357642364*G0_0_0_9_6 + 0.00385328956757592*G0_0_0_9_7 + 0.00262023690595162*G0_0_0_9_8 - 0.00287712287712333*G0_0_0_9_9 + 0.000541680541680631*G0_0_1_0_0 + 0.000339766054051818*G0_0_1_0_1 + 0.0034942834942841*G0_0_1_0_2 - 0.00163297020439906*G0_0_1_0_3 + 0.010469213326358*G0_0_1_0_4 - 0.000261643118786011*G0_0_1_0_5 - 0.00105418391132696*G0_0_1_0_6 + 0.000266083123226038*G0_0_1_0_7 - 0.00092478949621824*G0_0_1_0_9 + 0.000339766054051818*G0_0_1_1_0 + 0.000488400488400421*G0_0_1_1_1 + 0.00862322862323008*G0_0_1_1_2 - 0.00576946862661251*G0_0_1_1_3 + 0.0165015936444536*G0_0_1_1_4 - 0.00108684965827841*G0_0_1_1_5 - 0.00313718028003798*G0_0_1_1_6 + 0.000565783422926272*G0_0_1_1_8 - 0.00441463298606233*G0_0_1_1_9 + 0.00349428349428409*G0_0_1_2_0 + 0.00862322862323008*G0_0_1_2_1 + 0.067710067710079*G0_0_1_2_2 - 0.0402974802974871*G0_0_1_2_3 + 0.0957264957265119*G0_0_1_2_4 - 0.0141902541902565*G0_0_1_2_5 + 0.0280608280608327*G0_0_1_2_6 - 0.00168054168054195*G0_0_1_2_7 - 0.00192696192696225*G0_0_1_2_8 + 0.0141724941724965*G0_0_1_2_9 - 0.00163297020439906*G0_0_1_3_0 - 0.00576946862661251*G0_0_1_3_1 - 0.0402974802974871*G0_0_1_3_2 + 0.0333009847295616*G0_0_1_3_3 - 0.0812187812187949*G0_0_1_3_4 + 0.0062879977165702*G0_0_1_3_5 + 0.00499500499500588*G0_0_1_3_6 + 0.000482374768089158*G0_0_1_3_7 - 0.00184672470386794*G0_0_1_3_8 + 0.0122791494220087*G0_0_1_3_9 + 0.010469213326358*G0_0_1_4_0 + 0.0165015936444536*G0_0_1_4_1 + 0.0957264957265119*G0_0_1_4_2 - 0.0812187812187949*G0_0_1_4_3 + 0.421918081918153*G0_0_1_4_4 - 0.0358241758241819*G0_0_1_4_5 + 0.030829170829176*G0_0_1_4_6 - 0.01097473954617*G0_0_1_4_7 + 0.00136434993577878*G0_0_1_4_8 + 0.0291308691308739*G0_0_1_4_9 - 0.000261643118786011*G0_0_1_5_0 - 0.00108684965827841*G0_0_1_5_1 - 0.0141902541902566*G0_0_1_5_2 + 0.0062879977165702*G0_0_1_5_3 - 0.0358241758241819*G0_0_1_5_4 - 0.000665049236478024*G0_0_1_5_5 + 0.005954045954047*G0_0_1_5_6 + 0.000530897673754896*G0_0_1_5_7 - 0.00115598687027278*G0_0_1_5_8 + 0.00508634222920026*G0_0_1_5_9 - 0.00105418391132696*G0_0_1_6_0 - 0.00313718028003798*G0_0_1_6_1 + 0.0280608280608327*G0_0_1_6_2 + 0.00499500499500588*G0_0_1_6_3 + 0.030829170829176*G0_0_1_6_4 + 0.005954045954047*G0_0_1_6_5 - 0.0789810189810328*G0_0_1_6_6 + 0.000625089196517868*G0_0_1_6_7 + 0.00980448123305435*G0_0_1_6_8 - 0.0525074925075015*G0_0_1_6_9 + 0.000266083123226038*G0_0_1_7_0 - 0.00168054168054195*G0_0_1_7_2 + 0.000482374768089158*G0_0_1_7_3 - 0.01097473954617*G0_0_1_7_4 + 0.000530897673754896*G0_0_1_7_5 + 0.000625089196517868*G0_0_1_7_6 + 0.00595690024261552*G0_0_1_7_7 - 0.000165548736977264*G0_0_1_7_8 + 0.00152419009561895*G0_0_1_7_9 + 0.000565783422926272*G0_0_1_8_1 - 0.00192696192696225*G0_0_1_8_2 - 0.00184672470386794*G0_0_1_8_3 + 0.00136434993577878*G0_0_1_8_4 - 0.00115598687027278*G0_0_1_8_5 + 0.00980448123305435*G0_0_1_8_6 - 0.000165548736977264*G0_0_1_8_7 + 0.00224061652633092*G0_0_1_8_8 + 0.0105151990866294*G0_0_1_8_9 - 0.00092478949621824*G0_0_1_9_0 - 0.00441463298606233*G0_0_1_9_1 + 0.0141724941724965*G0_0_1_9_2 + 0.0122791494220087*G0_0_1_9_3 + 0.0291308691308739*G0_0_1_9_4 + 0.00508634222920027*G0_0_1_9_5 - 0.0525074925075015*G0_0_1_9_6 + 0.00152419009561895*G0_0_1_9_7 + 0.0105151990866294*G0_0_1_9_8 - 0.0619608962466212*G0_0_1_9_9 - 0.00321282993902097*G0_1_0_0_0 + 0.000579616040925671*G0_1_0_0_1 + 0.00748974295105375*G0_1_0_0_2 - 0.000970496104424846*G0_1_0_0_3 + 0.00502921846671935*G0_1_0_0_4 + 0.00196324508824543*G0_1_0_0_5 - 0.0074368885083184*G0_1_0_0_6 - 0.00166106710749595*G0_1_0_0_7 + 0.00208374958374994*G0_1_0_0_8 - 0.00232027892742218*G0_1_0_0_9 + 0.000579616040925671*G0_1_0_1_0 + 0.0118310943906203*G0_1_0_1_1 + 0.0149317630121227*G0_1_0_1_2 - 0.00394617617831968*G0_1_0_1_3 + 0.0161940506583391*G0_1_0_1_4 - 0.000386754449254519*G0_1_0_1_5 - 0.00459591830127624*G0_1_0_1_6 - 0.00286844768987677*G0_1_0_1_7 + 0.00723485178842449*G0_1_0_1_8 - 0.00270984967413585*G0_1_0_1_9 + 0.00748974295105375*G0_1_0_2_0 + 0.0149317630121227*G0_1_0_2_1 + 0.274367993118039*G0_1_0_2_2 - 0.0680255392755506*G0_1_0_2_3 + 0.158493289118316*G0_1_0_2_4 - 0.0312898675398727*G0_1_0_2_5 + 0.0538783670033758*G0_1_0_2_6 - 0.00211074474467366*G0_1_0_2_7 - 0.00110226909334069*G0_1_0_2_8 + 0.0115330502830522*G0_1_0_2_9 - 0.000970496104424846*G0_1_0_3_0 - 0.00394617617831968*G0_1_0_3_1 - 0.0680255392755506*G0_1_0_3_2 + 0.026914930307792*G0_1_0_3_3 - 0.0856657479425481*G0_1_0_3_4 + 0.00366160625089257*G0_1_0_3_5 + 0.0105362940630816*G0_1_0_3_6 - 0.000339972527472588*G0_1_0_3_7 + 0.000284626088197573*G0_1_0_3_8 + 0.0088094940773527*G0_1_0_3_9 + 0.00502921846671935*G0_1_0_4_0 + 0.0161940506583391*G0_1_0_4_1 + 0.158493289118316*G0_1_0_4_2 - 0.0856657479425481*G0_1_0_4_3 + 0.27693348318353*G0_1_0_4_4 - 0.018339116240905*G0_1_0_4_5 + 0.00780282217782346*G0_1_0_4_6 - 0.00275198016269491*G0_1_0_4_7 + 0.0020790816326534*G0_1_0_4_9 + 0.00196324508824543*G0_1_0_5_0 - 0.000386754449254519*G0_1_0_5_1 - 0.0312898675398727*G0_1_0_5_2 + 0.00366160625089257*G0_1_0_5_3 - 0.018339116240905*G0_1_0_5_4 - 0.0113761833404712*G0_1_0_5_5 + 0.0366403982921904*G0_1_0_5_6 - 0.00098957590029037*G0_1_0_5_7 - 0.00209119749298354*G0_1_0_5_8 + 0.0111432317682336*G0_1_0_5_9 - 0.0074368885083184*G0_1_0_6_0 - 0.00459591830127625*G0_1_0_6_1 + 0.0538783670033758*G0_1_0_6_2 + 0.0105362940630816*G0_1_0_6_3 + 0.00780282217782346*G0_1_0_6_4 + 0.0366403982921904*G0_1_0_6_5 - 0.201935980686015*G0_1_0_6_6 + 0.0030807733932739*G0_1_0_6_7 + 0.0101730115122989*G0_1_0_6_8 - 0.0556717389753197*G0_1_0_6_9 - 0.00166106710749595*G0_1_0_7_0 - 0.00286844768987677*G0_1_0_7_1 - 0.00211074474467366*G0_1_0_7_2 - 0.000339972527472588*G0_1_0_7_3 - 0.00275198016269491*G0_1_0_7_4 - 0.00098957590029037*G0_1_0_7_5 + 0.00308077339327389*G0_1_0_7_6 - 0.00220820845820872*G0_1_0_7_7 - 0.00443852278673784*G0_1_0_7_8 + 0.000799289995718681*G0_1_0_7_9 + 0.00208374958374994*G0_1_0_8_0 + 0.00723485178842449*G0_1_0_8_1 - 0.00110226909334069*G0_1_0_8_2 + 0.000284626088197573*G0_1_0_8_3 - 0.00209119749298354*G0_1_0_8_5 + 0.0101730115122989*G0_1_0_8_6 - 0.00443852278673785*G0_1_0_8_7 + 0.00991502545074146*G0_1_0_8_8 + 0.0080188561438575*G0_1_0_8_9 - 0.00232027892742218*G0_1_0_9_0 - 0.00270984967413585*G0_1_0_9_1 + 0.0115330502830522*G0_1_0_9_2 + 0.0088094940773527*G0_1_0_9_3 + 0.0020790816326534*G0_1_0_9_4 + 0.0111432317682336*G0_1_0_9_5 - 0.0556717389753197*G0_1_0_9_6 + 0.000799289995718682*G0_1_0_9_7 + 0.0080188561438575*G0_1_0_9_8 - 0.0245743542172155*G0_1_0_9_9 - 0.00564176564176654*G0_1_1_0_0 - 0.000735032163603724*G0_1_1_0_1 + 0.00248851677423149*G0_1_1_0_2 + 0.00073926073926086*G0_1_1_0_3 + 0.00346130060415837*G0_1_1_0_4 + 0.000981558124415456*G0_1_1_0_5 - 0.00512376512376602*G0_1_1_0_6 - 0.00621632335918153*G0_1_1_0_7 + 0.00461379889951394*G0_1_1_0_8 - 0.00372579801151295*G0_1_1_0_9 - 0.000735032163603724*G0_1_1_1_0 + 0.000970880970880988*G0_1_1_1_1 + 0.00719587291015984*G0_1_1_1_2 - 0.00303188874617502*G0_1_1_1_3 + 0.0113385027670762*G0_1_1_1_4 - 0.000529946244232036*G0_1_1_1_5 - 0.00532705389848339*G0_1_1_1_6 - 0.00211344211344243*G0_1_1_1_7 + 0.00431061002489636*G0_1_1_1_8 - 0.00730697873555142*G0_1_1_1_9 + 0.00248851677423149*G0_1_1_2_0 + 0.00719587291015984*G0_1_1_2_1 + 0.0594664594664693*G0_1_1_2_2 - 0.0339216339216396*G0_1_1_2_3 + 0.0847663447663591*G0_1_1_2_4 - 0.0113664113664133*G0_1_1_2_5 + 0.0182639582639613*G0_1_1_2_6 - 0.00383806669521018*G0_1_1_2_7 - 0.000910518053375351*G0_1_1_2_8 + 0.00945720945721105*G0_1_1_2_9 + 0.00073926073926086*G0_1_1_3_0 - 0.00303188874617502*G0_1_1_3_1 - 0.0339216339216396*G0_1_1_3_2 + 0.0273954616811805*G0_1_1_3_3 - 0.0603653489367877*G0_1_1_3_4 - 0.000707863565006557*G0_1_1_3_5 + 0.0167689453403768*G0_1_1_3_6 - 0.00142999857285593*G0_1_1_3_7 - 0.00208933923219676*G0_1_1_3_8 + 0.0247809333523661*G0_1_1_3_9 + 0.00346130060415837*G0_1_1_4_0 + 0.0113385027670762*G0_1_1_4_1 + 0.0847663447663591*G0_1_1_4_2 - 0.0603653489367877*G0_1_1_4_3 + 0.332147852147909*G0_1_1_4_4 - 0.00959611816754833*G0_1_1_4_5 - 0.00717282717282842*G0_1_1_4_6 + 0.000171257314114483*G0_1_1_4_7 + 0.00351933780505271*G0_1_1_4_8 - 0.00917939203653656*G0_1_1_4_9 + 0.000981558124415456*G0_1_1_5_0 - 0.000529946244232036*G0_1_1_5_1 - 0.0113664113664133*G0_1_1_5_2 - 0.000707863565006557*G0_1_1_5_3 - 0.00959611816754833*G0_1_1_5_4 - 0.0238561438561478*G0_1_1_5_5 + 0.0301755387469725*G0_1_1_5_6 - 0.01467960610818*G0_1_1_5_7 + 0.00237762237762275*G0_1_1_5_8 + 0.00642214927929331*G0_1_1_5_9 - 0.00512376512376602*G0_1_1_6_0 - 0.00532705389848339*G0_1_1_6_1 + 0.0182639582639613*G0_1_1_6_2 + 0.0167689453403768*G0_1_1_6_3 - 0.00717282717282841*G0_1_1_6_4 + 0.0301755387469725*G0_1_1_6_5 - 0.103216783216801*G0_1_1_6_6 + 0.0123019837305572*G0_1_1_6_7 + 0.00896246610532477*G0_1_1_6_8 - 0.0619095190523867*G0_1_1_6_9 - 0.00621632335918153*G0_1_1_7_0 - 0.00211344211344243*G0_1_1_7_1 - 0.00383806669521019*G0_1_1_7_2 - 0.00142999857285593*G0_1_1_7_3 + 0.000171257314114484*G0_1_1_7_4 - 0.01467960610818*G0_1_1_7_5 + 0.0123019837305572*G0_1_1_7_6 - 0.0654659626088307*G0_1_1_7_7 + 0.00326816041101818*G0_1_1_7_8 - 0.0134265734265757*G0_1_1_7_9 + 0.00461379889951394*G0_1_1_8_0 + 0.00431061002489636*G0_1_1_8_1 - 0.000910518053375351*G0_1_1_8_2 - 0.00208933923219676*G0_1_1_8_3 + 0.00351933780505271*G0_1_1_8_4 + 0.00237762237762275*G0_1_1_8_5 + 0.00896246610532478*G0_1_1_8_6 + 0.00326816041101818*G0_1_1_8_7 - 0.0112287712287733*G0_1_1_8_8 + 0.0148822605965488*G0_1_1_8_9 - 0.00372579801151295*G0_1_1_9_0 - 0.00730697873555142*G0_1_1_9_1 + 0.00945720945721105*G0_1_1_9_2 + 0.0247809333523661*G0_1_1_9_3 - 0.00917939203653656*G0_1_1_9_4 + 0.00642214927929331*G0_1_1_9_5 - 0.0619095190523867*G0_1_1_9_6 - 0.0134265734265757*G0_1_1_9_7 + 0.0148822605965488*G0_1_1_9_8 - 0.122072213500805*G0_1_1_9_9; + A[117] = -A[110] + 0.0168937235603931*G0_0_0_0_0 + 0.00333426714379152*G0_0_0_0_1 + 0.0120377682282465*G0_0_0_0_2 - 0.00732759304188*G0_0_0_0_3 + 0.0198062255205147*G0_0_0_0_4 + 0.0394078936936146*G0_0_0_0_5 + 0.00342482913911539*G0_0_0_0_6 + 0.0127088784231663*G0_0_0_0_7 - 0.00822447393876104*G0_0_0_0_8 + 0.0206593406593442*G0_0_0_0_9 + 0.00333426714379152*G0_0_0_1_0 + 0.00265131693703166*G0_0_0_1_1 + 0.0203624241719515*G0_0_0_1_2 - 0.0176969062683378*G0_0_0_1_3 + 0.033311133311139*G0_0_0_1_4 - 0.00821432535718391*G0_0_0_1_5 + 0.00261199118342017*G0_0_0_1_6 + 0.00211058782487389*G0_0_0_1_7 - 0.00155241583813039*G0_0_0_1_8 + 0.011746348889208*G0_0_0_1_9 + 0.0120377682282465*G0_0_0_2_0 + 0.0203624241719515*G0_0_0_2_1 + 0.312827912827965*G0_0_0_2_2 - 0.0938039738039896*G0_0_0_2_3 + 0.209399489399525*G0_0_0_2_4 - 0.0282339882339929*G0_0_0_2_5 + 0.0918992118992272*G0_0_0_2_6 + 0.000842332270903857*G0_0_0_2_7 - 0.00556649699506933*G0_0_0_2_8 + 0.00895104895105042*G0_0_0_2_9 - 0.00732759304188*G0_0_0_3_0 - 0.0176969062683378*G0_0_0_3_1 - 0.0938039738039896*G0_0_0_3_2 + 0.0926273726273886*G0_0_0_3_3 - 0.145471671185982*G0_0_0_3_4 + 0.0336520622234964*G0_0_0_3_5 - 0.0285143428000619*G0_0_0_3_6 + 0.00130440987583863*G0_0_0_3_7 + 0.00267446838875457*G0_0_0_3_8 - 0.0378478664193012*G0_0_0_3_9 + 0.0198062255205147*G0_0_0_4_0 + 0.0333111333111391*G0_0_0_4_1 + 0.209399489399525*G0_0_0_4_2 - 0.145471671185982*G0_0_0_4_3 + 0.637602397602507*G0_0_0_4_4 - 0.0800970458113451*G0_0_0_4_5 + 0.108611388611407*G0_0_0_4_6 - 0.020633652062227*G0_0_0_4_7 - 0.00397887826459321*G0_0_0_4_8 + 0.133340944769539*G0_0_0_4_9 + 0.0394078936936146*G0_0_0_5_0 - 0.00821432535718391*G0_0_0_5_1 - 0.0282339882339929*G0_0_0_5_2 + 0.0336520622234964*G0_0_0_5_3 - 0.0800970458113451*G0_0_0_5_4 - 0.105163408020569*G0_0_0_5_5 - 0.134808049093786*G0_0_0_5_6 + 0.0192407592407624*G0_0_0_5_7 + 0.00396460682175036*G0_0_0_5_8 - 0.0699072356215332*G0_0_0_5_9 + 0.00342482913911538*G0_0_0_6_0 + 0.00261199118342017*G0_0_0_6_1 + 0.0918992118992272*G0_0_0_6_2 - 0.0285143428000619*G0_0_0_6_3 + 0.108611388611407*G0_0_0_6_4 - 0.134808049093786*G0_0_0_6_5 - 0.181098901098933*G0_0_0_6_6 - 0.0232053660625128*G0_0_0_6_7 + 0.0147709433423744*G0_0_0_6_8 + 0.0301755387469724*G0_0_0_6_9 + 0.0127088784231663*G0_0_0_7_0 + 0.00211058782487389*G0_0_0_7_1 + 0.000842332270903857*G0_0_0_7_2 + 0.00130440987583863*G0_0_0_7_3 - 0.020633652062227*G0_0_0_7_4 + 0.0192407592407624*G0_0_0_7_5 - 0.0232053660625128*G0_0_0_7_6 + 0.0204081632653096*G0_0_0_7_7 - 0.0119851576994454*G0_0_0_7_8 - 0.0155672898530068*G0_0_0_7_9 - 0.00822447393876104*G0_0_0_8_0 - 0.00155241583813039*G0_0_0_8_1 - 0.00556649699506933*G0_0_0_8_2 + 0.00267446838875458*G0_0_0_8_3 - 0.00397887826459321*G0_0_0_8_4 + 0.00396460682175036*G0_0_0_8_5 + 0.0147709433423744*G0_0_0_8_6 - 0.0119851576994454*G0_0_0_8_7 - 0.00322534608248948*G0_0_0_8_8 - 0.0272812901384376*G0_0_0_8_9 + 0.0206593406593442*G0_0_0_9_0 + 0.011746348889208*G0_0_0_9_1 + 0.00895104895105041*G0_0_0_9_2 - 0.0378478664193012*G0_0_0_9_3 + 0.133340944769539*G0_0_0_9_4 - 0.0699072356215332*G0_0_0_9_5 + 0.0301755387469724*G0_0_0_9_6 - 0.0155672898530068*G0_0_0_9_7 - 0.0272812901384376*G0_0_0_9_8 + 0.233868988154742*G0_0_0_9_9 + 0.0120679320679342*G0_0_1_0_0 + 0.00187600759029363*G0_0_1_0_1 + 0.00596060024631556*G0_0_1_0_2 - 0.00280893709465188*G0_0_1_0_3 + 0.0206533149390329*G0_0_1_0_4 + 0.00228247942533697*G0_0_1_0_5 - 0.00236905951191701*G0_0_1_0_6 + 0.0116147344718794*G0_0_1_0_7 - 0.00637774923489322*G0_0_1_0_8 + 0.00431568431568513*G0_0_1_0_9 + 0.00187600759029363*G0_0_1_1_0 + 0.00381544381544435*G0_0_1_1_1 + 0.0116126201840508*G0_0_1_1_2 - 0.0195613909899658*G0_0_1_1_3 + 0.0309671281099906*G0_0_1_1_4 + 0.00375973233116151*G0_0_1_1_5 + 0.0119106290534882*G0_0_1_1_6 + 0.00635428063999604*G0_0_1_1_7 - 0.0067411953126251*G0_0_1_1_8 + 0.0217306503020825*G0_0_1_1_9 + 0.00596060024631556*G0_0_1_2_0 + 0.0116126201840507*G0_0_1_2_1 + 0.100992340992358*G0_0_1_2_2 - 0.0571492000063526*G0_0_1_2_3 + 0.133209013209036*G0_0_1_2_4 - 0.0175088403659862*G0_0_1_2_5 + 0.0244111444111486*G0_0_1_2_6 + 0.00539238539238631*G0_0_1_2_7 - 0.00171574457288772*G0_0_1_2_8 - 0.000875315161029589*G0_0_1_2_9 - 0.00280893709465188*G0_0_1_3_0 - 0.0195613909899658*G0_0_1_3_1 - 0.0571492000063526*G0_0_1_3_2 + 0.0993549307835192*G0_0_1_3_3 - 0.131277294134459*G0_0_1_3_4 + 0.00486656200942003*G0_0_1_3_5 - 0.0483173968888335*G0_0_1_3_6 - 0.00415869844441346*G0_0_1_3_7 + 0.0115969744541192*G0_0_1_3_8 - 0.0568745540174206*G0_0_1_3_9 + 0.0206533149390329*G0_0_1_4_0 + 0.0309671281099906*G0_0_1_4_1 + 0.133209013209036*G0_0_1_4_2 - 0.131277294134459*G0_0_1_4_3 + 0.753900385329086*G0_0_1_4_4 - 0.0745454545454673*G0_0_1_4_5 + 0.122862851434301*G0_0_1_4_6 - 0.032775795632944*G0_0_1_4_7 - 0.0074382760097058*G0_0_1_4_8 + 0.151716854574023*G0_0_1_4_9 + 0.00228247942533697*G0_0_1_5_0 + 0.00375973233116152*G0_0_1_5_1 - 0.0175088403659862*G0_0_1_5_2 + 0.00486656200942002*G0_0_1_5_3 - 0.0745454545454673*G0_0_1_5_4 + 0.0763493649208061*G0_0_1_5_5 - 0.0164977879263622*G0_0_1_5_6 + 0.0526273726273815*G0_0_1_5_7 - 0.0238647067218536*G0_0_1_5_8 + 0.0347823604966519*G0_0_1_5_9 - 0.00236905951191701*G0_0_1_6_0 + 0.0119106290534882*G0_0_1_6_1 + 0.0244111444111486*G0_0_1_6_2 - 0.0483173968888336*G0_0_1_6_3 + 0.122862851434301*G0_0_1_6_4 - 0.0164977879263622*G0_0_1_6_5 + 0.102431853860442*G0_0_1_6_6 - 0.0287626659055279*G0_0_1_6_7 - 0.00899957185671619*G0_0_1_6_8 + 0.0992607392607559*G0_0_1_6_9 + 0.0116147344718794*G0_0_1_7_0 + 0.00635428063999605*G0_0_1_7_1 + 0.00539238539238631*G0_0_1_7_2 - 0.00415869844441345*G0_0_1_7_3 - 0.032775795632944*G0_0_1_7_4 + 0.0526273726273815*G0_0_1_7_5 - 0.0287626659055279*G0_0_1_7_6 + 0.121812473241066*G0_0_1_7_7 - 0.0253403739118068*G0_0_1_7_8 + 0.0445782788640007*G0_0_1_7_9 - 0.00637774923489322*G0_0_1_8_0 - 0.0067411953126251*G0_0_1_8_1 - 0.00171574457288772*G0_0_1_8_2 + 0.0115969744541192*G0_0_1_8_3 - 0.0074382760097058*G0_0_1_8_4 - 0.0238647067218536*G0_0_1_8_5 - 0.00899957185671619*G0_0_1_8_6 - 0.0253403739118068*G0_0_1_8_7 + 0.0222263450834915*G0_0_1_8_8 - 0.0503153988868359*G0_0_1_8_9 + 0.00431568431568512*G0_0_1_9_0 + 0.0217306503020825*G0_0_1_9_1 - 0.000875315161029592*G0_0_1_9_2 - 0.0568745540174206*G0_0_1_9_3 + 0.151716854574023*G0_0_1_9_4 + 0.034782360496652*G0_0_1_9_5 + 0.0992607392607559*G0_0_1_9_6 + 0.0445782788640007*G0_0_1_9_7 - 0.0503153988868359*G0_0_1_9_8 + 0.359126587698077*G0_0_1_9_9 - 0.0290070423403803*G0_1_0_0_0 - 0.000586820586820675*G0_1_0_0_1 + 0.00886214314785897*G0_1_0_0_2 - 0.00366744366744428*G0_1_0_0_3 + 0.0151708608851493*G0_1_0_0_4 + 0.0231574774431958*G0_1_0_0_5 - 0.00725401582544572*G0_1_0_0_6 - 0.0169503512360683*G0_1_0_0_7 + 0.00626262626262726*G0_1_0_0_8 + 0.0139917225631535*G0_1_0_0_9 - 0.000586820586820675*G0_1_0_1_0 + 0.00355919213062129*G0_1_0_1_1 + 0.0179412122269296*G0_1_0_1_2 - 0.0175564118421291*G0_1_0_1_3 + 0.0285412999698763*G0_1_0_1_4 + 0.0222742337028089*G0_1_0_1_5 + 0.000165865880151606*G0_1_0_1_6 + 0.004150452721882*G0_1_0_1_7 - 0.00514025656882888*G0_1_0_1_8 + 0.0185319442462331*G0_1_0_1_9 + 0.00886214314785897*G0_1_0_2_0 + 0.0179412122269296*G0_1_0_2_1 + 0.282267855601236*G0_1_0_2_2 - 0.0825009910724335*G0_1_0_2_3 + 0.185689865689897*G0_1_0_2_4 - 0.00831739688882671*G0_1_0_2_5 + 0.0473926073926152*G0_1_0_2_6 + 0.00227708799137412*G0_1_0_2_7 - 0.00530865959437476*G0_1_0_2_8 + 0.00286190000475764*G0_1_0_2_9 - 0.00366744366744428*G0_1_0_3_0 - 0.0175564118421291*G0_1_0_3_1 - 0.0825009910724335*G0_1_0_3_2 + 0.07812473241046*G0_1_0_3_3 - 0.125269016697609*G0_1_0_3_4 - 0.0190637933495107*G0_1_0_3_5 - 0.018190381047527*G0_1_0_3_6 - 0.00669045240473924*G0_1_0_3_7 + 0.00845725702868705*G0_1_0_3_8 - 0.0422149279292206*G0_1_0_3_9 + 0.0151708608851493*G0_1_0_4_0 + 0.0285412999698763*G0_1_0_4_1 + 0.185689865689897*G0_1_0_4_2 - 0.125269016697609*G0_1_0_4_3 + 0.562320536606347*G0_1_0_4_4 - 0.0632053660625197*G0_1_0_4_5 + 0.0813957471100466*G0_1_0_4_6 - 0.0173255316112488*G0_1_0_4_7 - 0.00176680462394778*G0_1_0_4_8 + 0.117825032110766*G0_1_0_4_9 + 0.0231574774431958*G0_1_0_5_0 + 0.0222742337028089*G0_1_0_5_1 - 0.00831739688882671*G0_1_0_5_2 - 0.0190637933495107*G0_1_0_5_3 - 0.0632053660625197*G0_1_0_5_4 + 0.733389467675305*G0_1_0_5_5 - 0.110463821892412*G0_1_0_5_6 + 0.109039531896693*G0_1_0_5_7 - 0.0845154845154987*G0_1_0_5_8 + 0.127055801341537*G0_1_0_5_9 - 0.00725401582544572*G0_1_0_6_0 + 0.000165865880151603*G0_1_0_6_1 + 0.0473926073926152*G0_1_0_6_2 - 0.018190381047527*G0_1_0_6_3 + 0.0813957471100466*G0_1_0_6_4 - 0.110463821892412*G0_1_0_6_5 - 0.103613529327833*G0_1_0_6_6 - 0.0245240473811944*G0_1_0_6_7 + 0.0165605822748708*G0_1_0_6_8 + 0.0277950620807809*G0_1_0_6_9 - 0.0169503512360683*G0_1_0_7_0 + 0.004150452721882*G0_1_0_7_1 + 0.00227708799137412*G0_1_0_7_2 - 0.00669045240473924*G0_1_0_7_3 - 0.0173255316112488*G0_1_0_7_4 + 0.109039531896693*G0_1_0_7_5 - 0.0245240473811944*G0_1_0_7_6 + 0.00337662337662415*G0_1_0_7_7 - 0.0112487512487532*G0_1_0_7_8 + 0.00707292707292828*G0_1_0_7_9 + 0.00626262626262726*G0_1_0_8_0 - 0.00514025656882888*G0_1_0_8_1 - 0.00530865959437476*G0_1_0_8_2 + 0.00845725702868705*G0_1_0_8_3 - 0.00176680462394778*G0_1_0_8_4 - 0.0845154845154988*G0_1_0_8_5 + 0.0165605822748708*G0_1_0_8_6 - 0.0112487512487532*G0_1_0_8_7 + 0.0096275153418028*G0_1_0_8_8 - 0.0520622234908036*G0_1_0_8_9 + 0.0139917225631536*G0_1_0_9_0 + 0.0185319442462331*G0_1_0_9_1 + 0.00286190000475763*G0_1_0_9_2 - 0.0422149279292206*G0_1_0_9_3 + 0.117825032110766*G0_1_0_9_4 + 0.127055801341537*G0_1_0_9_5 + 0.027795062080781*G0_1_0_9_6 + 0.00707292707292829*G0_1_0_9_7 - 0.0520622234908036*G0_1_0_9_8 + 0.162865705722877*G0_1_0_9_9 - 0.0889244089244239*G0_1_1_0_0 - 0.0097366125937571*G0_1_1_0_1 - 0.00109319252176409*G0_1_1_0_3 + 0.0152609295466465*G0_1_1_0_4 - 0.0221286649858115*G0_1_1_0_5 + 0.0151397808540691*G0_1_1_0_6 - 0.121594278737156*G0_1_1_0_7 + 0.0507714507714593*G0_1_1_0_8 + 0.0051909994767146*G0_1_1_0_9 - 0.0097366125937571*G0_1_1_1_0 + 0.00973661259375712*G0_1_1_1_2 - 0.0128201956773408*G0_1_1_1_3 + 0.0246128474699946*G0_1_1_1_4 - 0.00815089672232665*G0_1_1_1_5 + 0.00815089672232667*G0_1_1_1_6 - 0.0246128474699945*G0_1_1_1_7 + 0.0128201956773406*G0_1_1_1_8 + 0.00973661259375712*G0_1_1_2_1 + 0.088924408924424*G0_1_1_2_2 - 0.0507714507714594*G0_1_1_2_3 + 0.121594278737157*G0_1_1_2_4 - 0.0151397808540691*G0_1_1_2_5 + 0.0221286649858116*G0_1_1_2_6 - 0.0152609295466463*G0_1_1_2_7 + 0.00109319252176413*G0_1_1_2_8 - 0.00519099947671461*G0_1_1_2_9 - 0.00109319252176409*G0_1_1_3_0 - 0.0128201956773408*G0_1_1_3_1 - 0.0507714507714594*G0_1_1_3_2 + 0.0771285857000275*G0_1_1_3_3 - 0.105936920222653*G0_1_1_3_4 + 0.0138661338661362*G0_1_1_3_5 - 0.02445269016698*G0_1_1_3_6 + 0.00327957756529253*G0_1_1_3_7 - 0.00655915513058462*G0_1_1_3_9 + 0.0152609295466465*G0_1_1_4_0 + 0.0246128474699946*G0_1_1_4_1 + 0.121594278737157*G0_1_1_4_2 - 0.105936920222653*G0_1_1_4_3 + 0.63208791208802*G0_1_1_4_4 - 0.0457827886399393*G0_1_1_4_5 + 0.0702354788069193*G0_1_1_4_6 - 0.0032795775652924*G0_1_1_4_8 + 0.107138575710022*G0_1_1_4_9 - 0.0221286649858115*G0_1_1_5_0 - 0.00815089672232665*G0_1_1_5_1 - 0.0151397808540691*G0_1_1_5_2 + 0.0138661338661362*G0_1_1_5_3 - 0.0457827886399393*G0_1_1_5_4 - 0.0260824889396358*G0_1_1_5_5 - 0.070235478806919*G0_1_1_5_7 + 0.0244526901669799*G0_1_1_5_8 - 0.0644783787641038*G0_1_1_5_9 + 0.0151397808540691*G0_1_1_6_0 + 0.00815089672232667*G0_1_1_6_1 + 0.0221286649858116*G0_1_1_6_2 - 0.02445269016698*G0_1_1_6_3 + 0.0702354788069193*G0_1_1_6_4 + 0.026082488939636*G0_1_1_6_6 + 0.0457827886399391*G0_1_1_6_7 - 0.0138661338661362*G0_1_1_6_8 + 0.0644783787641039*G0_1_1_6_9 - 0.121594278737156*G0_1_1_7_0 - 0.0246128474699945*G0_1_1_7_1 - 0.0152609295466463*G0_1_1_7_2 + 0.00327957756529252*G0_1_1_7_3 - 0.070235478806919*G0_1_1_7_5 + 0.0457827886399391*G0_1_1_7_6 - 0.632087912088018*G0_1_1_7_7 + 0.105936920222652*G0_1_1_7_8 - 0.107138575710022*G0_1_1_7_9 + 0.0507714507714593*G0_1_1_8_0 + 0.0128201956773406*G0_1_1_8_1 + 0.00109319252176413*G0_1_1_8_2 - 0.0032795775652924*G0_1_1_8_4 + 0.0244526901669799*G0_1_1_8_5 - 0.0138661338661362*G0_1_1_8_6 + 0.105936920222652*G0_1_1_8_7 - 0.0771285857000273*G0_1_1_8_8 + 0.00655915513058493*G0_1_1_8_9 + 0.00519099947671459*G0_1_1_9_0 - 0.00519099947671461*G0_1_1_9_2 - 0.00655915513058462*G0_1_1_9_3 + 0.107138575710022*G0_1_1_9_4 - 0.0644783787641038*G0_1_1_9_5 + 0.0644783787641039*G0_1_1_9_6 - 0.107138575710022*G0_1_1_9_7 + 0.00655915513058492*G0_1_1_9_8; + A[65] = -A[110] - 0.000420602325364306*G0_0_0_0_0 - 0.00640149973483414*G0_0_0_0_2 - 0.00149945292802463*G0_0_0_0_3 + 0.0105494505494524*G0_0_0_0_4 + 0.00766471623614613*G0_0_0_0_5 - 0.0247752247752291*G0_0_0_0_6 + 0.000339977482834678*G0_0_0_0_7 - 0.000837257980115262*G0_0_0_0_9 + 0.000420602325364315*G0_0_0_1_1 + 0.00640149973483418*G0_0_0_1_2 - 0.00766471623614614*G0_0_0_1_3 + 0.0247752247752291*G0_0_0_1_4 + 0.00149945292802462*G0_0_0_1_5 - 0.0105494505494524*G0_0_0_1_6 - 0.000339977482834679*G0_0_0_1_8 + 0.000837257980115266*G0_0_0_1_9 - 0.00640149973483414*G0_0_0_2_0 + 0.00640149973483418*G0_0_0_2_1 - 0.0333888333888392*G0_0_0_2_3 + 0.0966144966145133*G0_0_0_2_4 + 0.033388833388839*G0_0_0_2_5 - 0.0966144966145129*G0_0_0_2_6 - 0.000213120213120258*G0_0_0_2_7 + 0.000213120213120237*G0_0_0_2_8 - 0.00149945292802463*G0_0_0_3_0 - 0.00766471623614614*G0_0_0_3_1 - 0.0333888333888392*G0_0_0_3_2 + 0.0274925074925123*G0_0_0_3_3 - 0.121158841158862*G0_0_0_3_4 + 0.0316483516483568*G0_0_0_3_6 + 0.00449835878407382*G0_0_0_3_7 - 0.00385899814471306*G0_0_0_3_8 - 0.0115084915084934*G0_0_0_3_9 + 0.0105494505494524*G0_0_0_4_0 + 0.0247752247752291*G0_0_0_4_1 + 0.0966144966145133*G0_0_0_4_2 - 0.121158841158862*G0_0_0_4_3 + 0.49550449550458*G0_0_0_4_4 - 0.0316483516483571*G0_0_0_4_5 - 0.0155044955044981*G0_0_0_4_7 - 0.00063936063936076*G0_0_0_4_8 + 0.063296703296714*G0_0_0_4_9 + 0.00766471623614613*G0_0_0_5_0 + 0.00149945292802462*G0_0_0_5_1 + 0.033388833388839*G0_0_0_5_2 - 0.0316483516483571*G0_0_0_5_4 - 0.0274925074925122*G0_0_0_5_5 + 0.121158841158862*G0_0_0_5_6 + 0.00385899814471309*G0_0_0_5_7 - 0.00449835878407382*G0_0_0_5_8 + 0.0115084915084934*G0_0_0_5_9 - 0.0247752247752291*G0_0_0_6_0 - 0.0105494505494524*G0_0_0_6_1 - 0.0966144966145129*G0_0_0_6_2 + 0.0316483516483568*G0_0_0_6_3 + 0.121158841158862*G0_0_0_6_5 - 0.495504495504579*G0_0_0_6_6 + 0.000639360639360703*G0_0_0_6_7 + 0.015504495504498*G0_0_0_6_8 - 0.0632967032967138*G0_0_0_6_9 + 0.000339977482834678*G0_0_0_7_0 - 0.000213120213120258*G0_0_0_7_2 + 0.00449835878407382*G0_0_0_7_3 - 0.0155044955044981*G0_0_0_7_4 + 0.00385899814471309*G0_0_0_7_5 + 0.000639360639360705*G0_0_0_7_6 + 0.0036991579848729*G0_0_0_7_7 + 0.00123305266162429*G0_0_0_7_9 - 0.000339977482834679*G0_0_0_8_1 + 0.000213120213120236*G0_0_0_8_2 - 0.00385899814471306*G0_0_0_8_3 - 0.000639360639360759*G0_0_0_8_4 - 0.00449835878407382*G0_0_0_8_5 + 0.015504495504498*G0_0_0_8_6 - 0.00369915798487286*G0_0_0_8_8 - 0.0012330526616243*G0_0_0_8_9 - 0.000837257980115262*G0_0_0_9_0 + 0.000837257980115266*G0_0_0_9_1 - 0.0115084915084934*G0_0_0_9_3 + 0.063296703296714*G0_0_0_9_4 + 0.0115084915084934*G0_0_0_9_5 - 0.0632967032967138*G0_0_0_9_6 + 0.00123305266162429*G0_0_0_9_7 - 0.0012330526616243*G0_0_0_9_8 + 0.00197220768649375*G0_0_1_0_0 + 0.000323908895337523*G0_0_1_0_1 + 0.000106560106560137*G0_0_1_0_2 - 0.00291264291264341*G0_0_1_0_3 + 0.0338810395953312*G0_0_1_0_4 - 0.00448567305710239*G0_0_1_0_5 + 0.002082996368711*G0_0_1_0_6 - 0.00223015080157974*G0_0_1_0_7 - 0.000829646543932412*G0_0_1_0_8 + 0.0141116026830337*G0_0_1_0_9 + 0.000323908895337523*G0_0_1_1_0 - 0.00376512376512446*G0_0_1_1_1 + 0.00750064750064879*G0_0_1_1_2 - 0.0134417962989415*G0_0_1_1_3 + 0.0263964606821796*G0_0_1_1_4 - 0.00240267668839139*G0_0_1_1_5 - 0.00208299636871102*G0_0_1_1_6 + 0.00135990993133875*G0_0_1_1_7 - 0.00431822146107938*G0_0_1_1_8 - 0.000334903192046116*G0_0_1_1_9 + 0.000106560106560137*G0_0_1_2_0 + 0.00750064750064879*G0_0_1_2_1 + 0.0337440337440396*G0_0_1_2_2 - 0.0383261183261249*G0_0_1_2_3 + 0.0792096792096929*G0_0_1_2_4 - 0.00031968031968038*G0_0_1_2_5 + 0.000657120657120772*G0_0_1_2_7 - 0.00163392163392191*G0_0_1_2_8 + 0.000639360639360757*G0_0_1_2_9 - 0.00291264291264341*G0_0_1_3_0 - 0.0134417962989415*G0_0_1_3_1 - 0.0383261183261249*G0_0_1_3_2 + 0.0758327386898944*G0_0_1_3_3 - 0.116523476523496*G0_0_1_3_4 + 0.0115769944341393*G0_0_1_3_5 - 0.00095904095904112*G0_0_1_3_6 + 0.00152989867275606*G0_0_1_3_7 + 0.000776366490652331*G0_0_1_3_8 - 0.00205508776937371*G0_0_1_3_9 + 0.0338810395953312*G0_0_1_4_0 + 0.0263964606821796*G0_0_1_4_1 + 0.0792096792096929*G0_0_1_4_2 - 0.116523476523496*G0_0_1_4_3 + 0.988291708291876*G0_0_1_4_4 - 0.108851148851167*G0_0_1_4_5 + 0.109810189810208*G0_0_1_4_6 - 0.0482032253460906*G0_0_1_4_7 - 0.00230626516340841*G0_0_1_4_8 + 0.215784215784252*G0_0_1_4_9 - 0.00448567305710239*G0_0_1_5_0 - 0.00240267668839139*G0_0_1_5_1 - 0.000319680319680387*G0_0_1_5_2 + 0.0115769944341393*G0_0_1_5_3 - 0.108851148851167*G0_0_1_5_4 + 0.010617953475098*G0_0_1_5_5 + 0.000959040959041123*G0_0_1_5_6 + 0.00917939203653645*G0_0_1_5_7 - 0.0423348080491009*G0_0_1_5_9 + 0.002082996368711*G0_0_1_6_0 - 0.00208299636871102*G0_0_1_6_1 - 0.000959040959041123*G0_0_1_6_3 + 0.109810189810208*G0_0_1_6_4 + 0.00095904095904112*G0_0_1_6_5 - 0.109810189810209*G0_0_1_6_6 - 0.00917939203653647*G0_0_1_6_7 + 0.00917939203653645*G0_0_1_6_8 - 0.00223015080157974*G0_0_1_7_0 + 0.00135990993133875*G0_0_1_7_1 + 0.000657120657120772*G0_0_1_7_2 + 0.00152989867275606*G0_0_1_7_3 - 0.0482032253460906*G0_0_1_7_4 + 0.00917939203653645*G0_0_1_7_5 - 0.00917939203653647*G0_0_1_7_6 + 0.00742115027829452*G0_0_1_7_7 + 0.00248893963179722*G0_0_1_7_8 - 0.023976023976028*G0_0_1_7_9 - 0.000829646543932412*G0_0_1_8_0 - 0.00431822146107938*G0_0_1_8_1 - 0.00163392163392191*G0_0_1_8_2 + 0.000776366490652331*G0_0_1_8_3 - 0.00230626516340842*G0_0_1_8_4 + 0.00917939203653645*G0_0_1_8_6 + 0.00248893963179722*G0_0_1_8_7 - 0.0131297274154439*G0_0_1_8_8 + 0.00561723990295516*G0_0_1_8_9 + 0.0141116026830337*G0_0_1_9_0 - 0.000334903192046117*G0_0_1_9_1 + 0.000639360639360757*G0_0_1_9_2 - 0.00205508776937371*G0_0_1_9_3 + 0.215784215784252*G0_0_1_9_4 - 0.0423348080491009*G0_0_1_9_5 - 0.023976023976028*G0_0_1_9_7 + 0.00561723990295517*G0_0_1_9_8 + 0.0846696160982018*G0_0_1_9_9 - 0.00318862795053325*G0_1_0_0_0 - 0.000755893136845639*G0_1_0_0_1 + 0.00422367755701162*G0_1_0_0_2 + 0.00060732917875785*G0_1_0_0_3 + 0.000514089085517789*G0_1_0_0_4 + 0.00456813028241679*G0_1_0_0_5 - 0.0137364223078533*G0_1_0_0_6 - 0.000784612213183764*G0_1_0_0_7 + 0.000980289551718294*G0_1_0_0_8 - 0.00587032015603543*G0_1_0_0_9 - 0.000755893136845639*G0_1_0_1_0 - 0.00276802562516886*G0_1_0_1_1 + 0.0106251772918458*G0_1_0_1_2 - 0.00309658595372933*G0_1_0_1_3 + 0.0110388024673758*G0_1_0_1_4 + 0.00210678210678246*G0_1_0_1_5 - 0.0100353614639346*G0_1_0_1_6 + 0.00104371818657548*G0_1_0_1_7 - 0.00112458969601839*G0_1_0_1_8 - 0.00503306217592017*G0_1_0_1_9 + 0.00422367755701162*G0_1_0_2_0 + 0.0106251772918458*G0_1_0_2_1 + 0.228832895499601*G0_1_0_2_2 - 0.0505583305583391*G0_1_0_2_3 + 0.120190920190941*G0_1_0_2_4 - 0.0171694971695*G0_1_0_2_5 + 0.0235764235764274*G0_1_0_2_6 - 0.00093018093018108*G0_1_0_2_7 - 0.000717060717060819*G0_1_0_2_8 + 0.00490176490176572*G0_1_0_2_9 + 0.00060732917875785*G0_1_0_3_0 - 0.00309658595372933*G0_1_0_3_1 - 0.0505583305583391*G0_1_0_3_2 + 0.00349935778507289*G0_1_0_3_3 - 0.0557642357642454*G0_1_0_3_4 - 0.00557157128585793*G0_1_0_3_5 + 0.0331068931068986*G0_1_0_3_6 + 0.00117882117882136*G0_1_0_3_7 - 0.00633081204509876*G0_1_0_3_8 + 0.0127415441701177*G0_1_0_3_9 + 0.000514089085517788*G0_1_0_4_0 + 0.0110388024673758*G0_1_0_4_1 + 0.120190920190941*G0_1_0_4_2 - 0.0557642357642454*G0_1_0_4_3 + 0.220979020979059*G0_1_0_4_4 + 0.00145854145854165*G0_1_0_4_5 - 0.0345654345654403*G0_1_0_4_6 - 0.000876266590552465*G0_1_0_4_7 + 0.00515199086627742*G0_1_0_4_8 - 0.0176223776223805*G0_1_0_4_9 + 0.00456813028241679*G0_1_0_5_0 + 0.00210678210678246*G0_1_0_5_1 - 0.0171694971695*G0_1_0_5_2 - 0.00557157128585793*G0_1_0_5_3 + 0.00145854145854165*G0_1_0_5_4 - 0.0239931497074397*G0_1_0_5_5 + 0.0653946053946166*G0_1_0_5_6 - 0.00247181390038575*G0_1_0_5_7 - 0.00331953760525243*G0_1_0_5_8 + 0.0242500356786111*G0_1_0_5_9 - 0.0137364223078533*G0_1_0_6_0 - 0.0100353614639346*G0_1_0_6_1 + 0.0235764235764274*G0_1_0_6_2 + 0.0331068931068986*G0_1_0_6_3 - 0.0345654345654403*G0_1_0_6_4 + 0.0653946053946166*G0_1_0_6_5 - 0.274525474525521*G0_1_0_6_6 + 0.00579135150563817*G0_1_0_6_7 + 0.0146282289139456*G0_1_0_6_8 - 0.0809190809190945*G0_1_0_6_9 - 0.000784612213183764*G0_1_0_7_0 + 0.00104371818657548*G0_1_0_7_1 - 0.00093018093018108*G0_1_0_7_2 + 0.00117882117882136*G0_1_0_7_3 - 0.000876266590552465*G0_1_0_7_4 - 0.00247181390038575*G0_1_0_7_5 + 0.00579135150563817*G0_1_0_7_6 - 0.00685600114171644*G0_1_0_7_7 + 0.00226345083487973*G0_1_0_7_8 + 0.00602825745682986*G0_1_0_7_9 + 0.000980289551718294*G0_1_0_8_0 - 0.00112458969601839*G0_1_0_8_1 - 0.000717060717060819*G0_1_0_8_2 - 0.00633081204509877*G0_1_0_8_3 + 0.00515199086627742*G0_1_0_8_4 - 0.00331953760525243*G0_1_0_8_5 + 0.0146282289139456*G0_1_0_8_6 + 0.00226345083487973*G0_1_0_8_7 - 0.0105551591265892*G0_1_0_8_8 + 0.00479520479520564*G0_1_0_8_9 - 0.00587032015603543*G0_1_0_9_0 - 0.00503306217592017*G0_1_0_9_1 + 0.00490176490176572*G0_1_0_9_2 + 0.0127415441701177*G0_1_0_9_3 - 0.0176223776223805*G0_1_0_9_4 + 0.0242500356786111*G0_1_0_9_5 - 0.0809190809190945*G0_1_0_9_6 + 0.00602825745682986*G0_1_0_9_7 + 0.00479520479520564*G0_1_0_9_8 - 0.049938632795784*G0_1_0_9_9 - 0.00707525278953965*G0_1_1_0_0 - 0.00744620458906304*G0_1_1_0_1 - 0.0054044368330092*G0_1_1_0_3 + 0.00746079317508024*G0_1_1_0_4 + 0.00261452832881451*G0_1_1_0_5 - 0.00731363874221144*G0_1_1_0_6 + 0.000473811902383455*G0_1_1_0_7 - 0.00811664525950386*G0_1_1_0_8 - 0.00877027734170742*G0_1_1_0_9 - 0.00744620458906304*G0_1_1_1_0 - 0.0927280127280291*G0_1_1_1_1 + 0.002688634117206*G0_1_1_1_2 - 0.0309417566560478*G0_1_1_1_3 + 0.0146640660926401*G0_1_1_1_4 + 0.00229643372500559*G0_1_1_1_5 - 0.00939663511092245*G0_1_1_1_6 + 0.0275679875679924*G0_1_1_1_7 - 0.0618188161045412*G0_1_1_1_8 - 0.0132743447029184*G0_1_1_1_9 + 0.002688634117206*G0_1_1_2_1 + 0.0469456469456548*G0_1_1_2_2 - 0.0366722166722229*G0_1_1_2_3 + 0.0588655788655889*G0_1_1_2_4 - 0.00439338439338513*G0_1_1_2_5 + 0.00846708846708987*G0_1_1_2_6 + 0.000446854732569106*G0_1_1_2_7 - 0.00862978291549865*G0_1_1_2_8 - 0.00355644355644413*G0_1_1_2_9 - 0.0054044368330092*G0_1_1_3_0 - 0.0309417566560478*G0_1_1_3_1 - 0.0366722166722229*G0_1_1_3_2 - 0.115661481375787*G0_1_1_3_3 + 0.0338547167118651*G0_1_1_3_4 - 0.00173826173826203*G0_1_1_3_5 + 0.0409904381333022*G0_1_1_3_6 + 0.0290138432995625*G0_1_1_3_7 - 0.0677037248465935*G0_1_1_3_8 - 0.0182046524903699*G0_1_1_3_9 + 0.00746079317508024*G0_1_1_4_0 + 0.0146640660926401*G0_1_1_4_1 + 0.0588655788655889*G0_1_1_4_2 + 0.0338547167118652*G0_1_1_4_3 + 0.366273726273789*G0_1_1_4_4 - 0.00958184672470556*G0_1_1_4_5 - 0.0314085914085966*G0_1_1_4_6 - 0.0182617382617414*G0_1_1_4_7 + 0.0386898815470309*G0_1_1_4_8 + 0.0298330241187435*G0_1_1_4_9 + 0.00261452832881451*G0_1_1_5_0 + 0.00229643372500559*G0_1_1_5_1 - 0.00439338439338513*G0_1_1_5_2 - 0.00173826173826203*G0_1_1_5_3 - 0.00958184672470556*G0_1_1_5_4 - 0.0286342229199419*G0_1_1_5_5 + 0.0419494790923433*G0_1_1_5_6 - 0.0173712002283459*G0_1_1_5_7 + 0.00591123162551836*G0_1_1_5_8 + 0.0144883687740856*G0_1_1_5_9 - 0.00731363874221144*G0_1_1_6_0 - 0.00939663511092245*G0_1_1_6_1 + 0.00846708846708987*G0_1_1_6_2 + 0.0409904381333022*G0_1_1_6_3 - 0.0314085914085966*G0_1_1_6_4 + 0.0419494790923433*G0_1_1_6_5 - 0.141218781218805*G0_1_1_6_6 + 0.0114599686028276*G0_1_1_6_7 + 0.0206393606393641*G0_1_1_6_8 - 0.071311545597272*G0_1_1_6_9 + 0.000473811902383454*G0_1_1_7_0 + 0.0275679875679924*G0_1_1_7_1 + 0.000446854732569105*G0_1_1_7_2 + 0.0290138432995625*G0_1_1_7_3 - 0.0182617382617414*G0_1_1_7_4 - 0.0173712002283459*G0_1_1_7_5 + 0.0114599686028276*G0_1_1_7_6 - 0.0996146710432591*G0_1_1_7_7 + 0.0587384044527003*G0_1_1_7_8 + 0.00339089481946685*G0_1_1_7_9 - 0.00811664525950386*G0_1_1_8_0 - 0.0618188161045412*G0_1_1_8_1 - 0.00862978291549865*G0_1_1_8_2 - 0.0677037248465935*G0_1_1_8_3 + 0.0386898815470309*G0_1_1_8_4 + 0.00591123162551835*G0_1_1_8_5 + 0.0206393606393641*G0_1_1_8_6 + 0.0587384044527003*G0_1_1_8_7 - 0.242837162837204*G0_1_1_8_8 - 0.0375567289853067*G0_1_1_8_9 - 0.00877027734170741*G0_1_1_9_0 - 0.0132743447029184*G0_1_1_9_1 - 0.00355644355644413*G0_1_1_9_2 - 0.0182046524903698*G0_1_1_9_3 + 0.0298330241187435*G0_1_1_9_4 + 0.0144883687740856*G0_1_1_9_5 - 0.071311545597272*G0_1_1_9_6 + 0.00339089481946685*G0_1_1_9_7 - 0.0375567289853067*G0_1_1_9_8 - 0.195644355644388*G0_1_1_9_9; + A[202] = -A[65] - 0.00524935382078331*G0_0_0_0_0 - 0.000932436170531563*G0_0_0_0_1 - 0.0150767046005167*G0_0_0_0_2 + 0.00109002109002123*G0_0_0_0_3 - 0.000648240648240729*G0_0_0_0_4 - 0.0108459794174098*G0_0_0_0_5 - 0.0255931370217127*G0_0_0_0_6 - 0.00281654853083472*G0_0_0_0_7 + 0.00146678718107314*G0_0_0_0_8 - 0.0103762903762922*G0_0_0_0_9 - 0.000932436170531564*G0_0_0_1_0 + 0.000534773868107354*G0_0_0_1_1 - 0.00825403873023059*G0_0_0_1_2 + 0.00676307819165072*G0_0_0_1_3 + 0.0064852607709762*G0_0_0_1_4 + 0.00659689516832487*G0_0_0_1_5 - 0.00359386645100991*G0_0_0_1_6 - 0.000132882990025886*G0_0_0_1_7 + 0.000580689152117857*G0_0_0_1_8 - 0.00686741829599089*G0_0_0_1_9 - 0.0150767046005167*G0_0_0_2_0 - 0.00825403873023059*G0_0_0_2_1 - 0.283701483701531*G0_0_0_2_2 + 0.0367587967588027*G0_0_0_2_3 - 0.0520457320457404*G0_0_0_2_4 + 0.0614097014097116*G0_0_0_2_5 - 0.174660894660924*G0_0_0_2_6 + 0.00278071135214037*G0_0_0_2_7 + 0.00258281401138584*G0_0_0_2_8 + 0.00109002109002123*G0_0_0_3_0 + 0.00676307819165071*G0_0_0_3_1 + 0.0367587967588027*G0_0_0_3_2 - 0.0444469815898468*G0_0_0_3_3 - 0.0538490081347316*G0_0_0_3_4 - 0.0158413015555898*G0_0_0_3_5 + 0.0194034536891711*G0_0_0_3_6 + 0.00535179106607774*G0_0_0_3_7 - 0.00622520336806161*G0_0_0_3_8 + 0.00989867275581711*G0_0_0_3_9 - 0.000648240648240729*G0_0_0_4_0 + 0.0064852607709762*G0_0_0_4_1 - 0.0520457320457404*G0_0_0_4_2 - 0.0538490081347316*G0_0_0_4_3 + 0.158081918081945*G0_0_0_4_4 + 0.0105665762808637*G0_0_0_4_5 - 0.0299700299700348*G0_0_0_4_6 - 0.00750963322392021*G0_0_0_4_7 + 0.000873412301983871*G0_0_0_4_8 - 0.0211331525617276*G0_0_0_4_9 - 0.0108459794174098*G0_0_0_5_0 + 0.00659689516832486*G0_0_0_5_1 + 0.0614097014097116*G0_0_0_5_2 - 0.0158413015555898*G0_0_0_5_3 + 0.0105665762808637*G0_0_0_5_4 + 0.0810960468103464*G0_0_0_5_5 + 0.174927929213673*G0_0_0_5_6 + 0.0108891108891127*G0_0_0_5_7 - 0.011168831168833*G0_0_0_5_8 + 0.0534665334665425*G0_0_0_5_9 - 0.0255931370217127*G0_0_0_6_0 - 0.00359386645100991*G0_0_0_6_1 - 0.174660894660924*G0_0_0_6_2 + 0.0194034536891711*G0_0_0_6_3 - 0.0299700299700348*G0_0_0_6_4 + 0.174927929213673*G0_0_0_6_5 + 0.014545454545458*G0_0_0_6_6 + 0.000279720279720332*G0_0_0_6_7 - 0.00279434850863472*G0_0_0_6_8 - 0.0388069073783425*G0_0_0_6_9 - 0.00281654853083472*G0_0_0_7_0 - 0.000132882990025886*G0_0_0_7_1 + 0.00278071135214037*G0_0_0_7_2 + 0.00535179106607774*G0_0_0_7_3 - 0.00750963322392021*G0_0_0_7_4 + 0.0108891108891127*G0_0_0_7_5 + 0.000279720279720334*G0_0_0_7_6 + 0.0232282003710614*G0_0_0_7_7 + 0.0305694305694358*G0_0_0_7_9 + 0.00146678718107314*G0_0_0_8_0 + 0.000580689152117857*G0_0_0_8_1 + 0.00258281401138584*G0_0_0_8_2 - 0.00622520336806161*G0_0_0_8_3 + 0.000873412301983872*G0_0_0_8_4 - 0.011168831168833*G0_0_0_8_5 - 0.00279434850863472*G0_0_0_8_6 - 0.000405308976737547*G0_0_0_8_8 + 0.0188554302840049*G0_0_0_8_9 - 0.0103762903762922*G0_0_0_9_0 - 0.00686741829599089*G0_0_0_9_1 + 0.00989867275581712*G0_0_0_9_3 - 0.0211331525617276*G0_0_0_9_4 + 0.0534665334665425*G0_0_0_9_5 - 0.0388069073783425*G0_0_0_9_6 + 0.0305694305694358*G0_0_0_9_7 + 0.0188554302840049*G0_0_0_9_8 - 0.224004566861748*G0_0_0_9_9 + 0.00737421308850005*G0_0_1_0_0 - 0.000618640618640704*G0_0_1_0_1 - 0.00261452832881448*G0_0_1_0_2 + 0.000493791922363428*G0_0_1_0_3 + 0.021217829789262*G0_0_1_0_4 - 0.0196771482485802*G0_0_1_0_5 + 0.0112033997748303*G0_0_1_0_6 - 0.00618397475540432*G0_0_1_0_7 + 0.00166627023769908*G0_0_1_0_8 - 0.00543456543456633*G0_0_1_0_9 - 0.000618640618640704*G0_0_1_1_0 - 0.00300440300440335*G0_0_1_1_1 + 0.00150251864537606*G0_0_1_1_2 - 0.00253651110794007*G0_0_1_1_3 + 0.0117025831311566*G0_0_1_1_4 - 0.00521097949669466*G0_0_1_1_5 + 0.00302174016459784*G0_0_1_1_6 + 0.00283779712351186*G0_0_1_1_7 - 0.00495821638678856*G0_0_1_1_8 + 0.00172779601351062*G0_0_1_1_9 - 0.00261452832881448*G0_0_1_2_0 + 0.00150251864537606*G0_0_1_2_1 - 0.0187042587042619*G0_0_1_2_2 - 0.00616145759003009*G0_0_1_2_3 + 0.0124675324675347*G0_0_1_2_4 + 0.000942549513978187*G0_0_1_2_5 - 0.00738816738816855*G0_0_1_2_6 + 0.00304933162076071*G0_0_1_2_7 - 0.000519480519480601*G0_0_1_2_8 + 0.0101917130488576*G0_0_1_2_9 + 0.000493791922363427*G0_0_1_3_0 - 0.00253651110794007*G0_0_1_3_1 - 0.00616145759003009*G0_0_1_3_2 + 0.0333694876552075*G0_0_1_3_3 - 0.0673298130441101*G0_0_1_3_4 + 0.00869701726844726*G0_0_1_3_5 - 0.0123076923076944*G0_0_1_3_6 - 0.00472384758099127*G0_0_1_3_7 + 0.00640787783645042*G0_0_1_3_8 + 0.00426430712145073*G0_0_1_3_9 + 0.021217829789262*G0_0_1_4_0 + 0.0117025831311566*G0_0_1_4_1 + 0.0124675324675347*G0_0_1_4_2 - 0.0673298130441101*G0_0_1_4_3 + 0.550326816041195*G0_0_1_4_4 - 0.0668959611816868*G0_0_1_4_5 + 0.0792036534893812*G0_0_1_4_6 - 0.0347795062080835*G0_0_1_4_7 - 0.00168403025545915*G0_0_1_4_8 + 0.103216783216801*G0_0_1_4_9 - 0.0196771482485802*G0_0_1_5_0 - 0.00521097949669466*G0_0_1_5_1 + 0.000942549513978184*G0_0_1_5_2 + 0.00869701726844726*G0_0_1_5_3 - 0.0668959611816868*G0_0_1_5_4 - 0.260861995147753*G0_0_1_5_5 + 0.00420151277294199*G0_0_1_5_6 + 0.012390466676183*G0_0_1_5_8 - 0.00847723704866714*G0_0_1_5_9 + 0.0112033997748303*G0_0_1_6_0 + 0.00302174016459784*G0_0_1_6_1 - 0.00738816738816855*G0_0_1_6_2 - 0.0123076923076944*G0_0_1_6_3 + 0.0792036534893812*G0_0_1_6_4 + 0.00420151277294199*G0_0_1_6_5 + 0.197439703154023*G0_0_1_6_6 - 0.0123904666761831*G0_0_1_6_7 - 0.00213215356072534*G0_0_1_6_8 - 0.00595975453118412*G0_0_1_6_9 - 0.00618397475540432*G0_0_1_7_0 + 0.00283779712351186*G0_0_1_7_1 + 0.00304933162076071*G0_0_1_7_2 - 0.00472384758099127*G0_0_1_7_3 - 0.0347795062080835*G0_0_1_7_4 - 0.0123904666761831*G0_0_1_7_6 + 0.00247466818895473*G0_0_1_7_7 - 0.00383616383616462*G0_0_1_7_8 + 0.0410846296560652*G0_0_1_7_9 + 0.00166627023769908*G0_0_1_8_0 - 0.00495821638678856*G0_0_1_8_1 - 0.000519480519480601*G0_0_1_8_2 + 0.00640787783645042*G0_0_1_8_3 - 0.00168403025545916*G0_0_1_8_4 + 0.012390466676183*G0_0_1_8_5 - 0.00213215356072534*G0_0_1_8_6 - 0.00383616383616462*G0_0_1_8_7 - 0.0120993292421881*G0_0_1_8_8 - 0.00181532752961353*G0_0_1_8_9 - 0.00543456543456633*G0_0_1_9_0 + 0.00172779601351062*G0_0_1_9_1 + 0.0101917130488576*G0_0_1_9_2 + 0.00426430712145074*G0_0_1_9_3 + 0.103216783216801*G0_0_1_9_4 - 0.00847723704866714*G0_0_1_9_5 - 0.00595975453118412*G0_0_1_9_6 + 0.0410846296560652*G0_0_1_9_7 - 0.00181532752961353*G0_0_1_9_8 + 0.158344512630253*G0_0_1_9_9 - 0.00353889496746697*G0_1_0_0_0 - 0.000746061698442784*G0_1_0_0_1 - 0.00187255425350695*G0_1_0_0_2 - 0.00520527091955752*G0_1_0_0_4 - 0.00166151309008477*G0_1_0_0_5 - 0.00428270142555933*G0_1_0_0_6 - 0.00483801912373421*G0_1_0_0_7 + 0.00130916702345293*G0_1_0_0_8 - 0.00723467009181417*G0_1_0_0_9 - 0.000746061698442784*G0_1_0_1_0 - 0.00253080253080295*G0_1_0_1_1 - 0.00172945220564297*G0_1_0_1_2 + 0.00796536796536926*G0_1_0_1_3 - 0.000232148803577393*G0_1_0_1_4 + 0.000946672375243978*G0_1_0_1_5 - 0.00576756576756674*G0_1_0_1_6 - 0.00159967017109898*G0_1_0_1_7 - 0.00192696192696234*G0_1_0_1_8 - 0.00438418724133085*G0_1_0_1_9 - 0.00187255425350695*G0_1_0_2_0 - 0.00172945220564297*G0_1_0_2_1 - 0.0105741172407856*G0_1_0_2_2 + 0.00913499199213635*G0_1_0_2_3 - 0.0055322455322464*G0_1_0_2_4 + 0.00542314828029204*G0_1_0_2_5 - 0.0143589743589768*G0_1_0_2_6 + 0.000215974501688832*G0_1_0_2_7 + 0.00312259169402077*G0_1_0_2_8 + 0.00103515532086979*G0_1_0_2_9 + 0.00796536796536926*G0_1_0_3_1 + 0.00913499199213635*G0_1_0_3_2 - 0.0596574853717817*G0_1_0_3_3 - 0.0173055515912688*G0_1_0_3_4 - 0.00411302982731621*G0_1_0_3_5 + 0.0225945483088378*G0_1_0_3_6 + 0.00519765948337472*G0_1_0_3_7 - 0.00112173540744998*G0_1_0_3_8 + 0.00275724275724309*G0_1_0_3_9 - 0.00520527091955752*G0_1_0_4_0 - 0.000232148803577391*G0_1_0_4_1 - 0.00553224553224641*G0_1_0_4_2 - 0.0173055515912688*G0_1_0_4_3 - 0.078016269444854*G0_1_0_4_4 + 0.0209076637648101*G0_1_0_4_5 - 0.0435022120736479*G0_1_0_4_6 + 0.00483801912373419*G0_1_0_4_7 - 0.00407592407592472*G0_1_0_4_8 - 0.0449207934922296*G0_1_0_4_9 - 0.00166151309008477*G0_1_0_5_0 + 0.000946672375243978*G0_1_0_5_1 + 0.00542314828029204*G0_1_0_5_2 - 0.00411302982731621*G0_1_0_5_3 + 0.0209076637648101*G0_1_0_5_4 - 0.0170372484658226*G0_1_0_5_5 + 0.0331325817040159*G0_1_0_5_6 - 0.00709576138147681*G0_1_0_5_7 + 0.00245183388040571*G0_1_0_5_8 + 0.0168003425146311*G0_1_0_5_9 - 0.00428270142555933*G0_1_0_6_0 - 0.00576756576756674*G0_1_0_6_1 - 0.0143589743589768*G0_1_0_6_2 + 0.0225945483088378*G0_1_0_6_3 - 0.0435022120736479*G0_1_0_6_4 + 0.0331325817040159*G0_1_0_6_5 - 0.0986756101041977*G0_1_0_6_6 + 0.0046439275010711*G0_1_0_6_7 + 0.00132153560725011*G0_1_0_6_8 - 0.0482945625802849*G0_1_0_6_9 - 0.00483801912373421*G0_1_0_7_0 - 0.00159967017109898*G0_1_0_7_1 + 0.000215974501688832*G0_1_0_7_2 + 0.00519765948337472*G0_1_0_7_3 + 0.00483801912373419*G0_1_0_7_4 - 0.00709576138147681*G0_1_0_7_5 + 0.0046439275010711*G0_1_0_7_6 + 0.00250891965177725*G0_1_0_7_7 + 0.0113029827315562*G0_1_0_7_8 + 0.0124161552733003*G0_1_0_7_9 + 0.00130916702345293*G0_1_0_8_0 - 0.00192696192696234*G0_1_0_8_1 + 0.00312259169402078*G0_1_0_8_2 - 0.00112173540744998*G0_1_0_8_3 - 0.00407592407592472*G0_1_0_8_4 + 0.00245183388040571*G0_1_0_8_5 + 0.00132153560725011*G0_1_0_8_6 + 0.0113029827315562*G0_1_0_8_7 + 0.0181447124304294*G0_1_0_8_8 + 0.021304409875842*G0_1_0_8_9 - 0.00723467009181417*G0_1_0_9_0 - 0.00438418724133085*G0_1_0_9_1 + 0.00103515532086979*G0_1_0_9_2 + 0.00275724275724309*G0_1_0_9_3 - 0.0449207934922296*G0_1_0_9_4 + 0.0168003425146311*G0_1_0_9_5 - 0.0482945625802849*G0_1_0_9_6 + 0.0124161552733003*G0_1_0_9_7 + 0.021304409875842*G0_1_0_9_8 - 0.0118167546738994*G0_1_0_9_9 + 0.0197719740576913*G0_1_1_0_0 - 0.00468885611742841*G0_1_1_0_1 - 0.000842437985295291*G0_1_1_0_2 - 0.00518275375418324*G0_1_1_0_3 + 0.00251716537430871*G0_1_1_0_4 + 0.00685251256679933*G0_1_1_0_5 - 0.00705167848025103*G0_1_1_0_6 + 0.0319867434153201*G0_1_1_0_7 - 0.0183686155114758*G0_1_1_0_8 - 0.00179059036201923*G0_1_1_0_9 - 0.00468885611742841*G0_1_1_1_0 - 0.0912006512006672*G0_1_1_1_1 - 0.00248492248492292*G0_1_1_1_2 - 0.0228482628482669*G0_1_1_1_3 + 0.00658325801183063*G0_1_1_1_4 + 0.000898783755926808*G0_1_1_1_5 - 0.00599717742574987*G0_1_1_1_6 + 0.0329391243677015*G0_1_1_1_7 - 0.0610678210678318*G0_1_1_1_8 - 0.0106712335283782*G0_1_1_1_9 - 0.000842437985295291*G0_1_1_2_0 - 0.00248492248492292*G0_1_1_2_1 + 0.00868464868464996*G0_1_1_2_2 - 0.00838875410304123*G0_1_1_2_3 - 0.000604157747015041*G0_1_1_2_4 + 0.00211122211122248*G0_1_1_2_5 - 0.00457732743447108*G0_1_1_2_6 + 0.00280259423116613*G0_1_1_2_7 - 0.00675832104403648*G0_1_1_2_8 - 0.00975976404547998*G0_1_1_2_9 - 0.00518275375418324*G0_1_1_3_0 - 0.0228482628482669*G0_1_1_3_1 - 0.00838875410304123*G0_1_1_3_2 - 0.148948194662506*G0_1_1_3_3 + 0.0557042957043051*G0_1_1_3_4 + 0.000870558013415303*G0_1_1_3_5 + 0.0291023262451882*G0_1_1_3_6 + 0.0266590552304884*G0_1_1_3_7 - 0.0580448123305365*G0_1_1_3_8 - 0.0213044098758421*G0_1_1_3_9 + 0.00251716537430871*G0_1_1_4_0 + 0.00658325801183063*G0_1_1_4_1 - 0.000604157747015038*G0_1_1_4_2 + 0.0557042957043051*G0_1_1_4_3 + 0.0190894819466286*G0_1_1_4_4 + 0.00355929784501263*G0_1_1_4_5 - 0.0326616240902008*G0_1_1_4_6 - 0.0135350363921816*G0_1_1_4_7 + 0.0313857571000482*G0_1_1_4_8 + 0.0221606964464147*G0_1_1_4_9 + 0.00685251256679933*G0_1_1_5_0 + 0.000898783755926808*G0_1_1_5_1 + 0.00211122211122248*G0_1_1_5_2 + 0.000870558013415304*G0_1_1_5_3 + 0.00355929784501263*G0_1_1_5_4 - 0.0486542029399255*G0_1_1_5_5 + 0.0301669758812666*G0_1_1_5_6 - 0.0111174539745987*G0_1_1_5_7 + 0.00841444270015847*G0_1_1_5_8 - 0.0114571143142592*G0_1_1_5_9 - 0.00705167848025103*G0_1_1_6_0 - 0.00599717742574987*G0_1_1_6_1 - 0.00457732743447108*G0_1_1_6_2 + 0.0291023262451882*G0_1_1_6_3 - 0.0326616240902009*G0_1_1_6_4 + 0.0301669758812666*G0_1_1_6_5 - 0.0818781218781352*G0_1_1_6_6 + 0.00270301127444029*G0_1_1_6_7 + 0.0135778507207101*G0_1_1_6_8 - 0.0289253603539365*G0_1_1_6_9 + 0.0319867434153201*G0_1_1_7_0 + 0.0329391243677015*G0_1_1_7_1 + 0.00280259423116613*G0_1_1_7_2 + 0.0266590552304884*G0_1_1_7_3 - 0.0135350363921816*G0_1_1_7_4 - 0.0111174539745987*G0_1_1_7_5 + 0.00270301127444029*G0_1_1_7_6 - 0.0491851006136806*G0_1_1_7_7 + 0.0169544740973345*G0_1_1_7_8 - 0.0183686155114758*G0_1_1_8_0 - 0.0610678210678318*G0_1_1_8_1 - 0.00675832104403648*G0_1_1_8_2 - 0.0580448123305365*G0_1_1_8_3 + 0.0313857571000482*G0_1_1_8_4 + 0.00841444270015847*G0_1_1_8_5 + 0.0135778507207101*G0_1_1_8_6 + 0.0169544740973345*G0_1_1_8_7 - 0.23749964321397*G0_1_1_8_8 - 0.0307578136149618*G0_1_1_8_9 - 0.00179059036201922*G0_1_1_9_0 - 0.0106712335283782*G0_1_1_9_1 - 0.00975976404547998*G0_1_1_9_2 - 0.0213044098758421*G0_1_1_9_3 + 0.0221606964464147*G0_1_1_9_4 - 0.0114571143142592*G0_1_1_9_5 - 0.0289253603539365*G0_1_1_9_6 - 0.0307578136149618*G0_1_1_9_8 - 0.050144141572721*G0_1_1_9_9; + A[164] = A[202] + 0.0248403448403494*G0_0_0_0_0 + 0.00180433323290498*G0_0_0_0_1 - 0.000780172208743735*G0_0_0_0_3 + 0.00191998477712797*G0_0_0_0_4 + 0.0444526901669835*G0_0_0_0_5 - 0.00282003710575199*G0_0_0_0_6 + 0.00813472242043809*G0_0_0_0_7 - 0.00638218923933319*G0_0_0_0_8 + 0.0135179106607701*G0_0_0_0_9 + 0.00180433323290498*G0_0_0_1_0 + 0.0194768194768228*G0_0_0_1_1 - 0.000375708947137564*G0_0_0_1_2 + 0.0191789163217767*G0_0_0_1_3 - 0.0101232101232118*G0_0_0_1_4 - 0.00478759335902276*G0_0_0_1_5 - 0.00568383996955523*G0_0_0_1_6 - 0.00471909043337697*G0_0_0_1_7 + 0.00439750725465087*G0_0_0_1_8 + 0.0108462965605841*G0_0_0_1_9 - 0.000375708947137564*G0_0_0_2_1 - 0.0120649720649738*G0_0_0_2_2 + 0.0114095428381161*G0_0_0_2_3 - 0.0265867465867509*G0_0_0_2_4 + 0.0201474715760464*G0_0_0_2_5 - 0.000586080586080737*G0_0_0_2_6 - 0.0023728652300085*G0_0_0_2_7 - 0.0019618476761337*G0_0_0_2_8 - 0.0222862851434317*G0_0_0_2_9 - 0.000780172208743735*G0_0_0_3_0 + 0.0191789163217767*G0_0_0_3_1 + 0.0114095428381161*G0_0_0_3_2 + 0.0175024975025013*G0_0_0_3_3 + 0.00450406736121071*G0_0_0_3_4 + 0.0088711288711303*G0_0_0_3_5 + 0.0160125588697043*G0_0_0_3_6 + 0.00130155558727*G0_0_0_3_7 - 0.00614813757670985*G0_0_0_3_8 - 0.0351420008562923*G0_0_0_3_9 + 0.00191998477712797*G0_0_0_4_0 - 0.0101232101232118*G0_0_0_4_1 - 0.0265867465867509*G0_0_0_4_2 + 0.00450406736121072*G0_0_0_4_3 - 0.00972741544170199*G0_0_0_4_4 - 0.00679891537034515*G0_0_0_4_5 - 0.00921364349935916*G0_0_0_4_6 + 0.00119880119880141*G0_0_0_4_7 + 0.00484658198943986*G0_0_0_4_8 + 0.0804566861709856*G0_0_0_4_9 + 0.0444526901669835*G0_0_0_5_0 - 0.00478759335902276*G0_0_0_5_1 + 0.0201474715760464*G0_0_0_5_2 + 0.0088711288711303*G0_0_0_5_3 - 0.00679891537034515*G0_0_0_5_4 - 0.135533038390204*G0_0_0_5_5 - 0.103114028828332*G0_0_0_5_6 - 0.0194034536891712*G0_0_0_5_7 + 0.013323819038107*G0_0_0_5_8 - 0.0672013700585244*G0_0_0_5_9 - 0.00282003710575199*G0_0_0_6_0 - 0.00568383996955523*G0_0_0_6_1 - 0.000586080586080737*G0_0_0_6_2 + 0.0160125588697043*G0_0_0_6_3 - 0.00921364349935916*G0_0_0_6_4 - 0.103114028828332*G0_0_0_6_5 - 0.361695447409795*G0_0_0_6_6 + 0.00607963465106423*G0_0_0_6_7 + 0.0119880119880139*G0_0_0_6_8 + 0.0348337376908867*G0_0_0_6_9 + 0.00813472242043809*G0_0_0_7_0 - 0.00471909043337697*G0_0_0_7_1 - 0.0023728652300085*G0_0_0_7_2 + 0.00130155558727*G0_0_0_7_3 + 0.00119880119880141*G0_0_0_7_4 - 0.0194034536891712*G0_0_0_7_5 + 0.00607963465106423*G0_0_0_7_6 - 0.0682974168688574*G0_0_0_7_7 + 0.0199686028257491*G0_0_0_7_8 - 0.0527130012844389*G0_0_0_7_9 - 0.00638218923933319*G0_0_0_8_0 + 0.00439750725465087*G0_0_0_8_1 - 0.0019618476761337*G0_0_0_8_2 - 0.00614813757670985*G0_0_0_8_3 + 0.00484658198943986*G0_0_0_8_4 + 0.013323819038107*G0_0_0_8_5 + 0.0119880119880139*G0_0_0_8_6 + 0.0199686028257491*G0_0_0_8_7 - 0.0483630655059306*G0_0_0_8_8 - 0.0422320536606321*G0_0_0_8_9 + 0.0135179106607701*G0_0_0_9_0 + 0.0108462965605841*G0_0_0_9_1 - 0.0222862851434317*G0_0_0_9_2 - 0.0351420008562923*G0_0_0_9_3 + 0.0804566861709856*G0_0_0_9_4 - 0.0672013700585244*G0_0_0_9_5 + 0.0348337376908867*G0_0_0_9_6 - 0.0527130012844389*G0_0_0_9_7 - 0.0422320536606321*G0_0_0_9_8 + 0.250309690309733*G0_0_0_9_9 + 0.0013759785188359*G0_0_1_0_1 - 0.00137597851883588*G0_0_1_0_2 - 0.00396746111031891*G0_0_1_0_3 + 0.00396746111031894*G0_0_1_0_4 + 0.0117653774796653*G0_0_1_0_5 - 0.00557157128585803*G0_0_1_0_6 - 0.0117653774796652*G0_0_1_0_7 + 0.00557157128585794*G0_0_1_0_8 + 0.0013759785188359*G0_0_1_1_0 + 0.0140126540126561*G0_0_1_1_1 + 0.0238485324199649*G0_0_1_1_3 - 0.00994053565482298*G0_0_1_1_4 + 0.00460682174967966*G0_0_1_1_5 - 0.00278007706579182*G0_0_1_1_6 - 0.0143780029494339*G0_0_1_1_7 + 0.020746872175447*G0_0_1_1_8 + 0.0260767803624991*G0_0_1_1_9 - 0.00137597851883588*G0_0_1_2_0 - 0.0140126540126561*G0_0_1_2_2 + 0.00994053565482296*G0_0_1_2_3 - 0.0238485324199648*G0_0_1_2_4 + 0.0143780029494339*G0_0_1_2_5 - 0.0207468721754471*G0_0_1_2_6 - 0.00460682174967967*G0_0_1_2_7 + 0.00278007706579182*G0_0_1_2_8 - 0.026076780362499*G0_0_1_2_9 - 0.00396746111031891*G0_0_1_3_0 + 0.0238485324199649*G0_0_1_3_1 + 0.00994053565482296*G0_0_1_3_2 - 0.00688454402740174*G0_0_1_3_3 - 0.000959040959041064*G0_0_1_3_5 + 0.00834023119737537*G0_0_1_3_6 + 0.0119023833309568*G0_0_1_3_7 - 0.00356215213358126*G0_0_1_3_8 - 0.102035107749411*G0_0_1_3_9 + 0.00396746111031894*G0_0_1_4_0 - 0.00994053565482298*G0_0_1_4_1 - 0.0238485324199648*G0_0_1_4_2 + 0.00688454402740297*G0_0_1_4_4 - 0.0119023833309569*G0_0_1_4_5 + 0.00356215213358142*G0_0_1_4_6 + 0.000959040959041097*G0_0_1_4_7 - 0.00834023119737549*G0_0_1_4_8 + 0.102035107749411*G0_0_1_4_9 + 0.0117653774796653*G0_0_1_5_0 + 0.00460682174967966*G0_0_1_5_1 + 0.0143780029494339*G0_0_1_5_2 - 0.000959040959041067*G0_0_1_5_3 - 0.0119023833309569*G0_0_1_5_4 + 0.273155416012605*G0_0_1_5_5 - 0.0156871699728869*G0_0_1_5_6 - 0.013820465249039*G0_0_1_5_8 + 0.027640930498078*G0_0_1_5_9 - 0.00557157128585803*G0_0_1_6_0 - 0.00278007706579183*G0_0_1_6_1 - 0.0207468721754471*G0_0_1_6_2 + 0.00834023119737538*G0_0_1_6_3 + 0.00356215213358142*G0_0_1_6_4 - 0.0156871699728869*G0_0_1_6_5 - 0.224997859283612*G0_0_1_6_6 + 0.013820465249039*G0_0_1_6_7 + 0.0615498786927463*G0_0_1_6_9 - 0.0117653774796652*G0_0_1_7_0 - 0.0143780029494339*G0_0_1_7_1 - 0.00460682174967967*G0_0_1_7_2 + 0.0119023833309568*G0_0_1_7_3 + 0.000959040959041097*G0_0_1_7_4 + 0.0138204652490389*G0_0_1_7_6 - 0.273155416012605*G0_0_1_7_7 + 0.015687169972887*G0_0_1_7_8 - 0.0276409304980782*G0_0_1_7_9 + 0.00557157128585794*G0_0_1_8_0 + 0.020746872175447*G0_0_1_8_1 + 0.00278007706579182*G0_0_1_8_2 - 0.00356215213358126*G0_0_1_8_3 - 0.00834023119737549*G0_0_1_8_4 - 0.013820465249039*G0_0_1_8_5 + 0.015687169972887*G0_0_1_8_7 + 0.224997859283612*G0_0_1_8_8 - 0.061549878692746*G0_0_1_8_9 + 0.0260767803624991*G0_0_1_9_1 - 0.026076780362499*G0_0_1_9_2 - 0.102035107749411*G0_0_1_9_3 + 0.102035107749411*G0_0_1_9_4 + 0.027640930498078*G0_0_1_9_5 + 0.0615498786927463*G0_0_1_9_6 - 0.0276409304980782*G0_0_1_9_7 - 0.061549878692746*G0_0_1_9_8 + 0.000804063661206675*G0_1_0_0_1 - 0.000804063661206644*G0_1_0_0_2 + 0.000856286570572459*G0_1_0_0_3 - 0.000856286570572425*G0_1_0_0_4 - 0.0014480757337903*G0_1_0_0_5 + 0.000395794681509067*G0_1_0_0_6 + 0.0014480757337902*G0_1_0_0_7 - 0.000395794681508989*G0_1_0_0_8 + 0.000804063661206675*G0_1_0_1_0 + 0.0228926628926669*G0_1_0_1_1 + 0.02565434565435*G0_1_0_1_3 - 0.0132553161124612*G0_1_0_1_4 + 0.000582274867989244*G0_1_0_1_5 + 0.00306550592264933*G0_1_0_1_6 - 0.00318538604252954*G0_1_0_1_7 + 0.00951048951049131*G0_1_0_1_8 + 0.00972741544170285*G0_1_0_1_9 - 0.000804063661206644*G0_1_0_2_0 - 0.0228926628926664*G0_1_0_2_2 + 0.0132553161124611*G0_1_0_2_3 - 0.0256543456543498*G0_1_0_2_4 + 0.00318538604252936*G0_1_0_2_5 - 0.00951048951049098*G0_1_0_2_6 - 0.000582274867989266*G0_1_0_2_7 - 0.00306550592264926*G0_1_0_2_8 - 0.00972741544170276*G0_1_0_2_9 + 0.000856286570572459*G0_1_0_3_0 + 0.02565434565435*G0_1_0_3_1 + 0.0132553161124611*G0_1_0_3_2 + 0.0141801056086803*G0_1_0_3_3 - 0.00215784215784254*G0_1_0_3_5 - 0.00919651776794797*G0_1_0_3_6 - 0.00256885971171741*G0_1_0_3_7 - 0.00662765805623033*G0_1_0_3_8 - 0.0240445269016737*G0_1_0_3_9 - 0.000856286570572424*G0_1_0_4_0 - 0.0132553161124612*G0_1_0_4_1 - 0.0256543456543498*G0_1_0_4_2 - 0.0141801056086789*G0_1_0_4_4 + 0.00256885971171724*G0_1_0_4_5 + 0.00662765805623073*G0_1_0_4_6 + 0.00215784215784255*G0_1_0_4_7 + 0.00919651776794775*G0_1_0_4_8 + 0.0240445269016738*G0_1_0_4_9 - 0.0014480757337903*G0_1_0_5_0 + 0.000582274867989244*G0_1_0_5_1 + 0.00318538604252936*G0_1_0_5_2 - 0.00215784215784254*G0_1_0_5_3 + 0.00256885971171724*G0_1_0_5_4 + 0.0115769944341393*G0_1_0_5_5 + 0.0002226345083488*G0_1_0_5_6 - 0.00174682460396777*G0_1_0_5_8 + 0.00349364920793554*G0_1_0_5_9 + 0.000395794681509067*G0_1_0_6_0 + 0.00306550592264933*G0_1_0_6_1 - 0.00951048951049098*G0_1_0_6_2 - 0.00919651776794797*G0_1_0_6_3 + 0.00662765805623073*G0_1_0_6_4 + 0.0002226345083488*G0_1_0_6_5 + 0.064701013272453*G0_1_0_6_6 + 0.00174682460396777*G0_1_0_6_7 + 0.0475752818610043*G0_1_0_6_9 + 0.0014480757337902*G0_1_0_7_0 - 0.00318538604252954*G0_1_0_7_1 - 0.000582274867989266*G0_1_0_7_2 - 0.00256885971171741*G0_1_0_7_3 + 0.00215784215784255*G0_1_0_7_4 + 0.00174682460396777*G0_1_0_7_6 - 0.0115769944341391*G0_1_0_7_7 - 0.000222634508348959*G0_1_0_7_8 - 0.00349364920793551*G0_1_0_7_9 - 0.00039579468150899*G0_1_0_8_0 + 0.00951048951049131*G0_1_0_8_1 - 0.00306550592264926*G0_1_0_8_2 - 0.00662765805623033*G0_1_0_8_3 + 0.00919651776794775*G0_1_0_8_4 - 0.00174682460396777*G0_1_0_8_5 - 0.000222634508348959*G0_1_0_8_7 - 0.0647010132724518*G0_1_0_8_8 - 0.047575281861004*G0_1_0_8_9 + 0.00972741544170285*G0_1_0_9_1 - 0.00972741544170276*G0_1_0_9_2 - 0.0240445269016737*G0_1_0_9_3 + 0.0240445269016738*G0_1_0_9_4 + 0.00349364920793554*G0_1_0_9_5 + 0.0475752818610043*G0_1_0_9_6 - 0.00349364920793551*G0_1_0_9_7 - 0.047575281861004*G0_1_0_9_8 - 0.0248403448403487*G0_1_1_0_0 - 0.00180433323290495*G0_1_1_0_2 - 0.00191998477712793*G0_1_1_0_3 + 0.000780172208743746*G0_1_1_0_4 - 0.00813472242043797*G0_1_1_0_5 + 0.0063821892393331*G0_1_1_0_6 - 0.0444526901669832*G0_1_1_0_7 + 0.00282003710575186*G0_1_1_0_8 - 0.0135179106607701*G0_1_1_0_9 + 0.012064972064974*G0_1_1_1_1 + 0.000375708947137587*G0_1_1_1_2 + 0.026586746586751*G0_1_1_1_3 - 0.0114095428381162*G0_1_1_1_4 + 0.00237286523000849*G0_1_1_1_5 + 0.00196184767613371*G0_1_1_1_6 - 0.0201474715760464*G0_1_1_1_7 + 0.000586080586080753*G0_1_1_1_8 + 0.0222862851434318*G0_1_1_1_9 - 0.00180433323290495*G0_1_1_2_0 + 0.000375708947137587*G0_1_1_2_1 - 0.0194768194768225*G0_1_1_2_2 + 0.0101232101232118*G0_1_1_2_3 - 0.0191789163217766*G0_1_1_2_4 + 0.00471909043337692*G0_1_1_2_5 - 0.00439750725465082*G0_1_1_2_6 + 0.00478759335902274*G0_1_1_2_7 + 0.00568383996955523*G0_1_1_2_8 - 0.0108462965605841*G0_1_1_2_9 - 0.00191998477712793*G0_1_1_3_0 + 0.026586746586751*G0_1_1_3_1 + 0.0101232101232118*G0_1_1_3_2 + 0.00972741544170333*G0_1_1_3_3 - 0.00450406736121103*G0_1_1_3_4 - 0.00119880119880141*G0_1_1_3_5 - 0.00484658198943991*G0_1_1_3_6 + 0.00679891537034502*G0_1_1_3_7 + 0.00921364349935944*G0_1_1_3_8 - 0.0804566861709854*G0_1_1_3_9 + 0.000780172208743746*G0_1_1_4_0 - 0.0114095428381162*G0_1_1_4_1 - 0.0191789163217766*G0_1_1_4_2 - 0.00450406736121103*G0_1_1_4_3 - 0.0175024975025002*G0_1_1_4_4 - 0.00130155558727007*G0_1_1_4_5 + 0.00614813757670998*G0_1_1_4_6 - 0.00887112887113035*G0_1_1_4_7 - 0.0160125588697045*G0_1_1_4_8 + 0.0351420008562924*G0_1_1_4_9 - 0.00813472242043797*G0_1_1_5_0 + 0.00237286523000849*G0_1_1_5_1 + 0.00471909043337692*G0_1_1_5_2 - 0.00119880119880141*G0_1_1_5_3 - 0.00130155558727007*G0_1_1_5_4 + 0.068297416868857*G0_1_1_5_5 - 0.0199686028257489*G0_1_1_5_6 + 0.0194034536891713*G0_1_1_5_7 - 0.0060796346510643*G0_1_1_5_8 + 0.0527130012844389*G0_1_1_5_9 + 0.0063821892393331*G0_1_1_6_0 + 0.00196184767613371*G0_1_1_6_1 - 0.00439750725465082*G0_1_1_6_2 - 0.00484658198943991*G0_1_1_6_3 + 0.00614813757670998*G0_1_1_6_4 - 0.0199686028257489*G0_1_1_6_5 + 0.0483630655059303*G0_1_1_6_6 - 0.013323819038107*G0_1_1_6_7 - 0.011988011988014*G0_1_1_6_8 + 0.0422320536606321*G0_1_1_6_9 - 0.0444526901669832*G0_1_1_7_0 - 0.0201474715760464*G0_1_1_7_1 + 0.00478759335902274*G0_1_1_7_2 + 0.00679891537034501*G0_1_1_7_3 - 0.00887112887113034*G0_1_1_7_4 + 0.0194034536891713*G0_1_1_7_5 - 0.013323819038107*G0_1_1_7_6 + 0.135533038390205*G0_1_1_7_7 + 0.103114028828332*G0_1_1_7_8 + 0.0672013700585243*G0_1_1_7_9 + 0.00282003710575186*G0_1_1_8_0 + 0.000586080586080752*G0_1_1_8_1 + 0.00568383996955523*G0_1_1_8_2 + 0.00921364349935944*G0_1_1_8_3 - 0.0160125588697045*G0_1_1_8_4 - 0.0060796346510643*G0_1_1_8_5 - 0.011988011988014*G0_1_1_8_6 + 0.103114028828332*G0_1_1_8_7 + 0.361695447409796*G0_1_1_8_8 - 0.0348337376908862*G0_1_1_8_9 - 0.0135179106607701*G0_1_1_9_0 + 0.0222862851434318*G0_1_1_9_1 - 0.0108462965605841*G0_1_1_9_2 - 0.0804566861709854*G0_1_1_9_3 + 0.0351420008562924*G0_1_1_9_4 + 0.0527130012844389*G0_1_1_9_5 + 0.0422320536606321*G0_1_1_9_6 + 0.0672013700585243*G0_1_1_9_7 - 0.0348337376908862*G0_1_1_9_8 - 0.250309690309733*G0_1_1_9_9; + A[113] = -A[110] + 0.00360133693467096*G0_0_1_0_0 - 0.000318869842679432*G0_0_1_0_1 - 0.00603519936853373*G0_0_1_0_2 + 0.0029744858316292*G0_0_1_0_3 - 0.000823620823620978*G0_0_1_0_4 + 0.00805607091321517*G0_0_1_0_5 - 0.00894882894883057*G0_0_1_0_6 + 0.00490874205160009*G0_0_1_0_7 - 0.00137925566497022*G0_0_1_0_8 - 0.00427952999381648*G0_0_1_0_9 - 0.000318869842679432*G0_0_1_1_0 - 0.00255659684231173*G0_0_1_1_1 - 0.00504261170927924*G0_0_1_1_2 + 0.00676466390752216*G0_0_1_1_3 - 0.00941058941059099*G0_0_1_1_4 + 0.00198499912785661*G0_0_1_1_5 - 0.0262382062382108*G0_0_1_1_6 + 0.000746872175443786*G0_0_1_1_7 + 0.00316064887493501*G0_0_1_1_8 - 0.0195632938490115*G0_0_1_1_9 - 0.00603519936853373*G0_0_1_2_0 - 0.00504261170927924*G0_0_1_2_1 - 0.19658859658863*G0_0_1_2_2 + 0.0241314241314281*G0_0_1_2_3 - 0.056521256521266*G0_0_1_2_4 + 0.0287490287490335*G0_0_1_2_5 - 0.0391164391164456*G0_0_1_2_6 + 0.00057498057498067*G0_0_1_2_7 - 0.00192918192918228*G0_0_1_2_8 + 0.0101232101232119*G0_0_1_2_9 + 0.0029744858316292*G0_0_1_3_0 + 0.00676466390752216*G0_0_1_3_1 + 0.0241314241314281*G0_0_1_3_2 - 0.0173826173826204*G0_0_1_3_3 + 0.0341058941058999*G0_0_1_3_4 - 0.0108691308691327*G0_0_1_3_5 + 0.08557442557444*G0_0_1_3_6 - 0.00206365063507952*G0_0_1_3_7 - 0.0105837020122753*G0_0_1_3_8 + 0.0628171828171934*G0_0_1_3_9 - 0.000823620823620976*G0_0_1_4_0 - 0.009410589410591*G0_0_1_4_1 - 0.056521256521266*G0_0_1_4_2 + 0.0341058941058999*G0_0_1_4_3 + 0.11148851148853*G0_0_1_4_4 + 0.00933066933067096*G0_0_1_4_5 - 0.0949050949051111*G0_0_1_4_6 - 0.00305694305694358*G0_0_1_4_7 + 0.0126473526473548*G0_0_1_4_8 - 0.0490309690309774*G0_0_1_4_9 + 0.00805607091321517*G0_0_1_5_0 + 0.00198499912785661*G0_0_1_5_1 + 0.0287490287490335*G0_0_1_5_2 - 0.0108691308691327*G0_0_1_5_3 + 0.00933066933067094*G0_0_1_5_4 - 0.0551048951049046*G0_0_1_5_5 + 0.0304295704295755*G0_0_1_5_6 - 0.0060396746111042*G0_0_1_5_7 + 0.000904809476238202*G0_0_1_5_8 + 0.0110289710289729*G0_0_1_5_9 - 0.00894882894883057*G0_0_1_6_0 - 0.0262382062382108*G0_0_1_6_1 - 0.0391164391164456*G0_0_1_6_2 + 0.08557442557444*G0_0_1_6_3 - 0.094905094905111*G0_0_1_6_4 + 0.0304295704295755*G0_0_1_6_5 - 0.491108891108975*G0_0_1_6_6 + 0.00513486513486594*G0_0_1_6_7 + 0.0388211788211854*G0_0_1_6_8 - 0.201518481518516*G0_0_1_6_9 + 0.00490874205160009*G0_0_1_7_0 + 0.000746872175443786*G0_0_1_7_1 + 0.00057498057498067*G0_0_1_7_2 - 0.00206365063507952*G0_0_1_7_3 - 0.00305694305694358*G0_0_1_7_4 - 0.0060396746111042*G0_0_1_7_5 + 0.00513486513486594*G0_0_1_7_6 + 0.0164349935778536*G0_0_1_7_7 - 0.00131582703011292*G0_0_1_7_8 + 0.00256885971171732*G0_0_1_7_9 - 0.00137925566497022*G0_0_1_8_0 + 0.00316064887493501*G0_0_1_8_1 - 0.00192918192918228*G0_0_1_8_2 - 0.0105837020122753*G0_0_1_8_3 + 0.0126473526473548*G0_0_1_8_4 + 0.000904809476238202*G0_0_1_8_5 + 0.0388211788211854*G0_0_1_8_6 - 0.00131582703011292*G0_0_1_8_7 - 0.000416726131012232*G0_0_1_8_8 + 0.0333951762523247*G0_0_1_8_9 - 0.00427952999381648*G0_0_1_9_0 - 0.0195632938490115*G0_0_1_9_1 + 0.0101232101232119*G0_0_1_9_2 + 0.0628171828171934*G0_0_1_9_3 - 0.0490309690309774*G0_0_1_9_4 + 0.0110289710289729*G0_0_1_9_5 - 0.201518481518516*G0_0_1_9_6 + 0.00256885971171732*G0_0_1_9_7 + 0.0333951762523247*G0_0_1_9_8 - 0.205714285714321*G0_0_1_9_9 - 0.0925010791677615*G0_1_1_0_0 - 0.00738964738964866*G0_1_1_0_1 - 0.00776556776556909*G0_1_1_0_2 + 0.00585446299732118*G0_1_1_0_3 - 0.00668918383204213*G0_1_1_0_4 - 0.0213545184973792*G0_1_1_0_5 - 0.00338296624010977*G0_1_1_0_6 - 0.0659359687931227*G0_1_1_0_7 + 0.0316968745540227*G0_1_1_0_8 - 0.011015651015653*G0_1_1_0_9 - 0.00738964738964866*G0_1_1_1_0 - 0.0029050314764607*G0_1_1_1_1 - 0.00621304621304727*G0_1_1_1_2 + 0.00866562009419295*G0_1_1_1_3 - 0.011337234194379*G0_1_1_1_4 - 0.0051821194678346*G0_1_1_1_5 - 0.0199159570588176*G0_1_1_1_6 - 0.0138388595531476*G0_1_1_1_7 + 0.0128544471401635*G0_1_1_1_8 - 0.0243870415299029*G0_1_1_1_9 - 0.00776556776556909*G0_1_1_2_0 - 0.00621304621304727*G0_1_1_2_1 - 0.18263711597048*G0_1_1_2_2 + 0.0260517260517304*G0_1_1_2_3 - 0.0535686535686626*G0_1_1_2_4 + 0.0125097125097146*G0_1_1_2_5 - 0.0384060384060448*G0_1_1_2_6 - 0.00991452991453157*G0_1_1_2_7 + 0.00236652236652275*G0_1_1_2_8 - 0.00126540126540145*G0_1_1_2_9 + 0.00585446299732118*G0_1_1_3_0 + 0.00866562009419295*G0_1_1_3_1 + 0.0260517260517304*G0_1_1_3_2 - 0.0180676466390783*G0_1_1_3_3 + 0.04279720279721*G0_1_1_3_4 - 0.010175538746969*G0_1_1_3_5 + 0.0780819180819312*G0_1_1_3_6 + 0.000770657913515266*G0_1_1_3_7 - 0.0120051377194255*G0_1_1_3_8 + 0.071619808762678*G0_1_1_3_9 - 0.00668918383204213*G0_1_1_4_0 - 0.011337234194379*G0_1_1_4_1 - 0.0535686535686626*G0_1_1_4_2 + 0.04279720279721*G0_1_1_4_3 + 0.0455544455544532*G0_1_1_4_4 + 0.0384015984016049*G0_1_1_4_5 - 0.116483516483536*G0_1_1_4_6 + 0.0157385471671212*G0_1_1_4_7 + 0.0112344798059103*G0_1_1_4_8 - 0.0730069930070054*G0_1_1_4_9 - 0.0213545184973792*G0_1_1_5_0 - 0.0051821194678346*G0_1_1_5_1 + 0.0125097125097146*G0_1_1_5_2 - 0.010175538746969*G0_1_1_5_3 + 0.0384015984016049*G0_1_1_5_4 - 0.195450264021725*G0_1_1_5_5 + 0.118241758241778*G0_1_1_5_6 - 0.0819580419580556*G0_1_1_5_7 + 0.0338804053089824*G0_1_1_5_8 - 0.0347138575710062*G0_1_1_5_9 - 0.00338296624010977*G0_1_1_6_0 - 0.0199159570588176*G0_1_1_6_1 - 0.0384060384060448*G0_1_1_6_2 + 0.0780819180819312*G0_1_1_6_3 - 0.116483516483536*G0_1_1_6_4 + 0.118241758241778*G0_1_1_6_5 - 0.422777222777295*G0_1_1_6_6 + 0.0480776366490732*G0_1_1_6_7 + 0.0171571285857029*G0_1_1_6_8 - 0.152367632367658*G0_1_1_6_9 - 0.0659359687931227*G0_1_1_7_0 - 0.0138388595531476*G0_1_1_7_1 - 0.00991452991453157*G0_1_1_7_2 + 0.000770657913515266*G0_1_1_7_3 + 0.0157385471671212*G0_1_1_7_4 - 0.0819580419580556*G0_1_1_7_5 + 0.0480776366490732*G0_1_1_7_6 - 0.276877408306026*G0_1_1_7_7 + 0.0557042957043052*G0_1_1_7_8 - 0.0631083202511881*G0_1_1_7_9 + 0.0316968745540227*G0_1_1_8_0 + 0.0128544471401635*G0_1_1_8_1 + 0.00236652236652275*G0_1_1_8_2 - 0.0120051377194255*G0_1_1_8_3 + 0.0112344798059103*G0_1_1_8_4 + 0.0338804053089824*G0_1_1_8_5 + 0.0171571285857029*G0_1_1_8_6 + 0.0557042957043052*G0_1_1_8_7 - 0.0460054231482883*G0_1_1_8_8 + 0.0506921649778879*G0_1_1_8_9 - 0.011015651015653*G0_1_1_9_0 - 0.0243870415299029*G0_1_1_9_1 - 0.00126540126540145*G0_1_1_9_2 + 0.071619808762678*G0_1_1_9_3 - 0.0730069930070054*G0_1_1_9_4 - 0.0347138575710062*G0_1_1_9_5 - 0.152367632367658*G0_1_1_9_6 - 0.0631083202511881*G0_1_1_9_7 + 0.0506921649778879*G0_1_1_9_8 - 0.315866990152758*G0_1_1_9_9; + A[97] = A[113] - 0.0113269446602799*G0_0_0_0_0 - 0.00171433504766867*G0_0_0_0_1 + 0.00614482519244528*G0_0_0_0_2 + 0.000993292421864013*G0_0_0_0_3 + 0.00251938537652866*G0_0_0_0_4 - 0.0265461522604424*G0_0_0_0_5 - 0.00475080475080565*G0_0_0_0_6 - 0.00955552384123973*G0_0_0_0_7 + 0.00696319553462528*G0_0_0_0_8 - 0.0137386423100732*G0_0_0_0_9 - 0.00171433504766867*G0_0_0_1_0 + 0.000180983038125925*G0_0_0_1_1 + 0.010342391294774*G0_0_0_1_2 - 0.00161996733425332*G0_0_0_1_3 + 0.0100445586159889*G0_0_0_1_4 + 0.00220731649303117*G0_0_0_1_5 - 0.00645449788307045*G0_0_0_1_6 - 0.00213627642199106*G0_0_0_1_7 + 0.00153433867719608*G0_0_0_1_8 - 0.00493221064649721*G0_0_0_1_9 + 0.00614482519244528*G0_0_0_2_0 + 0.010342391294774*G0_0_0_2_1 + 0.204565804565839*G0_0_0_2_2 - 0.0486180486180567*G0_0_0_2_3 + 0.114179154179173*G0_0_0_2_4 - 0.0415850815850884*G0_0_0_2_5 + 0.0557842157842248*G0_0_0_2_6 - 0.006618143761002*G0_0_0_2_7 + 0.000490937633794874*G0_0_0_2_8 + 0.0116150516150535*G0_0_0_2_9 + 0.000993292421864013*G0_0_0_3_0 - 0.00161996733425332*G0_0_0_3_1 - 0.0486180486180567*G0_0_0_3_2 + 0.00525189096617747*G0_0_0_3_3 - 0.0548594262880069*G0_0_0_3_4 - 0.00656486370772197*G0_0_0_3_5 + 0.0228913943199697*G0_0_0_3_6 + 0.000548023405166363*G0_0_0_3_7 - 0.0026031111745402*G0_0_0_3_8 + 0.0137005851291589*G0_0_0_3_9 + 0.00251938537652866*G0_0_0_4_0 + 0.0100445586159889*G0_0_0_4_1 + 0.114179154179173*G0_0_0_4_2 - 0.0548594262880069*G0_0_0_4_3 + 0.109650349650368*G0_0_0_4_4 - 0.00403025545882749*G0_0_0_4_5 - 0.0188611388611422*G0_0_0_4_6 + 0.00438418724133085*G0_0_0_4_7 + 0.00205508776937384*G0_0_0_4_8 - 0.0267846439275057*G0_0_0_4_9 - 0.0265461522604424*G0_0_0_5_0 + 0.00220731649303117*G0_0_0_5_1 - 0.0415850815850884*G0_0_0_5_2 - 0.00656486370772197*G0_0_0_5_3 - 0.00403025545882749*G0_0_0_5_4 + 0.0460339660339737*G0_0_0_5_5 + 0.105049236477826*G0_0_0_5_6 - 0.0202882831454294*G0_0_0_5_7 - 0.00309404880833506*G0_0_0_5_8 + 0.0474040245468897*G0_0_0_5_9 - 0.00475080475080565*G0_0_0_6_0 - 0.00645449788307045*G0_0_0_6_1 + 0.0557842157842248*G0_0_0_6_2 + 0.0228913943199697*G0_0_0_6_3 - 0.0188611388611422*G0_0_0_6_4 + 0.105049236477826*G0_0_0_6_5 - 0.297302697302748*G0_0_0_6_6 + 0.0233823319537644*G0_0_0_6_7 + 0.0071813900385341*G0_0_0_6_8 - 0.0806279434850999*G0_0_0_6_9 - 0.00955552384123973*G0_0_0_7_0 - 0.00213627642199106*G0_0_0_7_1 - 0.006618143761002*G0_0_0_7_2 + 0.000548023405166363*G0_0_0_7_3 + 0.00438418724133085*G0_0_0_7_4 - 0.0202882831454294*G0_0_0_7_5 + 0.0233823319537644*G0_0_0_7_6 - 0.0331097473954672*G0_0_0_7_7 + 0.010269730269732*G0_0_0_7_8 - 0.00554873697730934*G0_0_0_7_9 + 0.00696319553462528*G0_0_0_8_0 + 0.00153433867719608*G0_0_0_8_1 + 0.000490937633794875*G0_0_0_8_2 - 0.0026031111745402*G0_0_0_8_3 + 0.00205508776937384*G0_0_0_8_4 - 0.00309404880833506*G0_0_0_8_5 + 0.0071813900385341*G0_0_0_8_6 + 0.010269730269732*G0_0_0_8_7 - 0.00358498644212991*G0_0_0_8_8 + 0.0106864564007439*G0_0_0_8_9 - 0.0137386423100732*G0_0_0_9_0 - 0.00493221064649721*G0_0_0_9_1 + 0.0116150516150535*G0_0_0_9_2 + 0.0137005851291589*G0_0_0_9_3 - 0.0267846439275057*G0_0_0_9_4 + 0.0474040245468897*G0_0_0_9_5 - 0.0806279434850999*G0_0_0_9_6 - 0.00554873697730935*G0_0_0_9_7 + 0.0106864564007439*G0_0_0_9_8 - 0.0764492650207065*G0_0_0_9_9 + 0.0183855650522346*G0_0_1_0_0 + 0.00165753118134098*G0_0_1_0_1 + 0.00614482519244528*G0_0_1_0_2 - 0.0026601969459117*G0_0_1_0_3 + 0.0032805289948153*G0_0_1_0_4 - 0.0177016634159523*G0_0_1_0_5 + 0.00317270031555808*G0_0_1_0_6 + 0.0136212993355871*G0_0_1_0_7 - 0.00551955980527494*G0_0_1_0_8 + 0.0038742210170788*G0_0_1_0_9 + 0.00165753118134098*G0_0_1_1_0 + 0.000180983038125945*G0_0_1_1_1 + 0.00697052506576435*G0_0_1_1_2 - 0.00334776334776392*G0_0_1_1_3 + 0.0140101168672621*G0_0_1_1_4 - 0.0224841824841863*G0_0_1_1_5 + 0.0182370010941471*G0_0_1_1_6 - 0.0061018346732643*G0_0_1_1_7 + 0.00326213469070669*G0_0_1_1_8 - 0.00493221064649717*G0_0_1_1_9 + 0.00614482519244528*G0_0_1_2_0 + 0.00697052506576435*G0_0_1_2_1 + 0.174853294853324*G0_0_1_2_2 - 0.0361352932781565*G0_0_1_2_3 + 0.0910023310023464*G0_0_1_2_4 - 0.0495085866514521*G0_0_1_2_5 + 0.0469397269397347*G0_0_1_2_6 - 0.00737928737928864*G0_0_1_2_7 + 0.00414442700157058*G0_0_1_2_8 - 0.00599781171209848*G0_0_1_2_9 - 0.0026601969459117*G0_0_1_3_0 - 0.00334776334776392*G0_0_1_3_1 - 0.0361352932781565*G0_0_1_3_2 + 0.0150706436420747*G0_0_1_3_3 - 0.0625089196517874*G0_0_1_3_4 + 0.0359526188097676*G0_0_1_3_5 - 0.0511831026116827*G0_0_1_3_6 + 0.0115084915084934*G0_0_1_3_7 - 0.00260311117454017*G0_0_1_3_8 - 0.00822035107749537*G0_0_1_3_9 + 0.0032805289948153*G0_0_1_4_0 + 0.0140101168672621*G0_0_1_4_1 + 0.0910023310023464*G0_0_1_4_2 - 0.0625089196517874*G0_0_1_4_3 + 0.0941915227629675*G0_0_1_4_4 - 0.00631368631368737*G0_0_1_4_5 + 0.0574967889253701*G0_0_1_4_6 + 0.00438418724133087*G0_0_1_4_7 - 0.00890538033395328*G0_0_1_4_8 + 0.0306208077636701*G0_0_1_4_9 - 0.0177016634159523*G0_0_1_5_0 - 0.0224841824841863*G0_0_1_5_1 - 0.0495085866514521*G0_0_1_5_2 + 0.0359526188097676*G0_0_1_5_3 - 0.00631368631368737*G0_0_1_5_4 - 0.477807906379415*G0_0_1_5_5 + 0.105049236477826*G0_0_1_5_6 - 0.0966462109319415*G0_0_1_5_7 + 0.0709804481233172*G0_0_1_5_8 - 0.153583559297871*G0_0_1_5_9 + 0.00317270031555808*G0_0_1_6_0 + 0.0182370010941471*G0_0_1_6_1 + 0.0469397269397347*G0_0_1_6_2 - 0.0511831026116827*G0_0_1_6_3 + 0.0574967889253701*G0_0_1_6_4 + 0.105049236477826*G0_0_1_6_5 + 0.226539175110642*G0_0_1_6_6 + 0.0256657628086243*G0_0_1_6_7 - 0.0353360924789556*G0_0_1_6_8 + 0.120359640359661*G0_0_1_6_9 + 0.0136212993355871*G0_0_1_7_0 - 0.0061018346732643*G0_0_1_7_1 - 0.00737928737928864*G0_0_1_7_2 + 0.0115084915084934*G0_0_1_7_3 + 0.00438418724133087*G0_0_1_7_4 - 0.0966462109319415*G0_0_1_7_5 + 0.0256657628086243*G0_0_1_7_6 - 0.0176509205080668*G0_0_1_7_7 + 0.0179192236335125*G0_0_1_7_8 - 0.0629541886684851*G0_0_1_7_9 - 0.00551955980527494*G0_0_1_8_0 + 0.0032621346907067*G0_0_1_8_1 + 0.00414442700157058*G0_0_1_8_2 - 0.00260311117454017*G0_0_1_8_3 - 0.00890538033395328*G0_0_1_8_4 + 0.0709804481233172*G0_0_1_8_5 - 0.0353360924789556*G0_0_1_8_6 + 0.0179192236335125*G0_0_1_8_7 - 0.0134037391180271*G0_0_1_8_8 + 0.0326073926073982*G0_0_1_8_9 + 0.0038742210170788*G0_0_1_9_0 - 0.00493221064649717*G0_0_1_9_1 - 0.00599781171209848*G0_0_1_9_2 - 0.00822035107749537*G0_0_1_9_3 + 0.0306208077636701*G0_0_1_9_4 - 0.153583559297871*G0_0_1_9_5 + 0.120359640359661*G0_0_1_9_6 - 0.0629541886684851*G0_0_1_9_7 + 0.0326073926073982*G0_0_1_9_8 - 0.0764492650207066*G0_0_1_9_9 + 0.0196090329423699*G0_1_0_0_0 + 0.000216221168602167*G0_1_0_0_1 + 0.00614482519244528*G0_1_0_0_2 + 0.0023062651634084*G0_1_0_0_3 - 0.00330526616240959*G0_1_0_0_4 + 0.0126058068915234*G0_1_0_0_5 - 0.0273732616589807*G0_1_0_0_6 + 0.012386978101266*G0_1_0_0_7 - 0.00324500895929528*G0_1_0_0_8 - 0.00943056943057102*G0_1_0_0_9 + 0.000216221168602167*G0_1_0_1_0 + 0.000180983038125914*G0_1_0_1_1 + 0.00841183507850316*G0_1_0_1_2 + 0.000108462965605837*G0_1_0_1_3 + 0.00484848484848567*G0_1_0_1_4 + 0.00830027115741543*G0_1_0_1_5 - 0.0125474525474547*G0_1_0_1_6 + 0.00305979734551217*G0_1_0_1_7 - 0.000194091622663102*G0_1_0_1_8 - 0.0049322106464972*G0_1_0_1_9 + 0.00614482519244528*G0_1_0_2_0 + 0.00841183507850316*G0_1_0_2_1 + 0.173629826963189*G0_1_0_2_2 - 0.0384098441241362*G0_1_0_2_3 + 0.0922366522366676*G0_1_0_2_4 - 0.0189626246769134*G0_1_0_2_5 + 0.0166322566322591*G0_1_0_2_6 - 0.000793492222063768*G0_1_0_2_7 - 0.000822035107749524*G0_1_0_2_8 + 0.00730697873555137*G0_1_0_2_9 + 0.0023062651634084*G0_1_0_3_0 + 0.000108462965605838*G0_1_0_3_1 - 0.0384098441241362*G0_1_0_3_2 - 0.00271728271728326*G0_1_0_3_3 - 0.0328071928071983*G0_1_0_3_4 - 0.0176737548166149*G0_1_0_3_5 + 0.0411702583131224*G0_1_0_3_6 - 0.00339089481946681*G0_1_0_3_7 - 0.00260311117454019*G0_1_0_3_8 + 0.0215784215784252*G0_1_0_3_9 - 0.00330526616240959*G0_1_0_4_0 + 0.00484848484848567*G0_1_0_4_1 + 0.0922366522366676*G0_1_0_4_2 - 0.0328071928071983*G0_1_0_4_3 + 0.0575310403881929*G0_1_0_4_4 + 0.0134436991579872*G0_1_0_4_5 - 0.0546139574711096*G0_1_0_4_6 + 0.00438418724133083*G0_1_0_4_7 + 0.00599400599400701*G0_1_0_4_8 - 0.0488083345226285*G0_1_0_4_9 + 0.0126058068915234*G0_1_0_5_0 + 0.00830027115741543*G0_1_0_5_1 - 0.0189626246769134*G0_1_0_5_2 - 0.0176737548166149*G0_1_0_5_3 + 0.0134436991579872*G0_1_0_5_4 + 0.078572855715726*G0_1_0_5_5 + 0.105049236477826*G0_1_0_5_6 + 0.0154645354645381*G0_1_0_5_7 - 0.0213729128014878*G0_1_0_5_8 + 0.0710375338946887*G0_1_0_5_9 - 0.0273732616589807*G0_1_0_6_0 - 0.0125474525474547*G0_1_0_6_1 + 0.0166322566322591*G0_1_0_6_2 + 0.0411702583131224*G0_1_0_6_3 - 0.0546139574711096*G0_1_0_6_4 + 0.105049236477826*G0_1_0_6_5 - 0.3298415869845*G0_1_0_6_6 + 0.00590837733694971*G0_1_0_6_7 + 0.0182902811474271*G0_1_0_6_8 - 0.104261452832899*G0_1_0_6_9 + 0.012386978101266*G0_1_0_7_0 + 0.00305979734551217*G0_1_0_7_1 - 0.000793492222063768*G0_1_0_7_2 - 0.00339089481946681*G0_1_0_7_3 + 0.00438418724133083*G0_1_0_7_4 + 0.0154645354645381*G0_1_0_7_5 + 0.00590837733694971*G0_1_0_7_6 + 0.0190095618667082*G0_1_0_7_7 - 0.0117825032110767*G0_1_0_7_8 + 0.0164749536178136*G0_1_0_7_9 - 0.00324500895929528*G0_1_0_8_0 - 0.000194091622663102*G0_1_0_8_1 - 0.000822035107749524*G0_1_0_8_2 - 0.00260311117454019*G0_1_0_8_3 + 0.00599400599400701*G0_1_0_8_4 - 0.0213729128014878*G0_1_0_8_5 + 0.0182902811474271*G0_1_0_8_6 - 0.0117825032110767*G0_1_0_8_7 + 0.00438418724133086*G0_1_0_8_8 + 0.00280861995147754*G0_1_0_8_9 - 0.00943056943057102*G0_1_0_9_0 - 0.0049322106464972*G0_1_0_9_1 + 0.00730697873555137*G0_1_0_9_2 + 0.0215784215784252*G0_1_0_9_3 - 0.0488083345226285*G0_1_0_9_4 + 0.0710375338946887*G0_1_0_9_5 - 0.104261452832899*G0_1_0_9_6 + 0.0164749536178136*G0_1_0_9_7 + 0.00280861995147754*G0_1_0_9_8 - 0.0764492650207065*G0_1_0_9_9 - 0.155244261910955*G0_1_1_0_0 - 0.0067543038971622*G0_1_1_0_1 - 0.0018381618381621*G0_1_1_0_3 + 0.00407402121687905*G0_1_1_0_4 - 0.0343339200482115*G0_1_1_0_5 + 0.0221353249924716*G0_1_1_0_6 - 0.0786153529010804*G0_1_1_0_7 + 0.0328902843188613*G0_1_1_0_8 - 0.00343275771847265*G0_1_1_0_9 - 0.0067543038971622*G0_1_1_1_0 + 0.00675430389716218*G0_1_1_1_2 - 0.00315367172510084*G0_1_1_1_3 + 0.01095031952175*G0_1_1_1_4 - 0.0099367299367316*G0_1_1_1_5 + 0.00993672993673164*G0_1_1_1_6 - 0.0109503195217499*G0_1_1_1_7 + 0.00315367172510083*G0_1_1_1_8 + 0.00675430389716218*G0_1_1_2_1 + 0.155244261910955*G0_1_1_2_2 - 0.0328902843188612*G0_1_1_2_3 + 0.0786153529010804*G0_1_1_2_4 - 0.0221353249924715*G0_1_1_2_5 + 0.0343339200482114*G0_1_1_2_6 - 0.00407402121687903*G0_1_1_2_7 + 0.00183816183816215*G0_1_1_2_8 + 0.00343275771847255*G0_1_1_2_9 - 0.0018381618381621*G0_1_1_3_0 - 0.00315367172510084*G0_1_1_3_1 - 0.0328902843188612*G0_1_1_3_2 + 0.0106864564007439*G0_1_1_3_3 - 0.0507264164407107*G0_1_1_3_4 + 0.0176623376623406*G0_1_1_3_5 - 0.0298101898101948*G0_1_1_3_6 + 0.00551448551448648*G0_1_1_3_7 - 0.0110289710289729*G0_1_1_3_9 + 0.00407402121687905*G0_1_1_4_0 + 0.01095031952175*G0_1_1_4_1 + 0.0786153529010804*G0_1_1_4_2 - 0.0507264164407107*G0_1_1_4_3 + 0.0751819608962595*G0_1_1_4_4 - 0.0122220636506371*G0_1_1_4_5 + 0.042032253460832*G0_1_1_4_6 - 0.00551448551448643*G0_1_1_4_8 + 0.0141458541458566*G0_1_1_4_9 - 0.0343339200482115*G0_1_1_5_0 - 0.0099367299367316*G0_1_1_5_1 - 0.0221353249924715*G0_1_1_5_2 + 0.0176623376623406*G0_1_1_5_3 - 0.0122220636506371*G0_1_1_5_4 - 0.147966319394915*G0_1_1_5_5 - 0.0420322534608319*G0_1_1_5_7 + 0.0298101898101948*G0_1_1_5_8 - 0.0493221064649719*G0_1_1_5_9 + 0.0221353249924716*G0_1_1_6_0 + 0.00993672993673164*G0_1_1_6_1 + 0.0343339200482114*G0_1_1_6_2 - 0.0298101898101948*G0_1_1_6_3 + 0.042032253460832*G0_1_1_6_4 + 0.147966319394916*G0_1_1_6_6 + 0.0122220636506371*G0_1_1_6_7 - 0.0176623376623406*G0_1_1_6_8 + 0.049322106464972*G0_1_1_6_9 - 0.0786153529010804*G0_1_1_7_0 - 0.0109503195217499*G0_1_1_7_1 - 0.00407402121687903*G0_1_1_7_2 + 0.00551448551448648*G0_1_1_7_3 - 0.0420322534608319*G0_1_1_7_5 + 0.0122220636506371*G0_1_1_7_6 - 0.0751819608962592*G0_1_1_7_7 + 0.0507264164407107*G0_1_1_7_8 - 0.0141458541458566*G0_1_1_7_9 + 0.0328902843188613*G0_1_1_8_0 + 0.00315367172510083*G0_1_1_8_1 + 0.00183816183816215*G0_1_1_8_2 - 0.00551448551448643*G0_1_1_8_4 + 0.0298101898101948*G0_1_1_8_5 - 0.0176623376623406*G0_1_1_8_6 + 0.0507264164407107*G0_1_1_8_7 - 0.0106864564007439*G0_1_1_8_8 + 0.0110289710289729*G0_1_1_8_9 - 0.00343275771847266*G0_1_1_9_0 + 0.00343275771847255*G0_1_1_9_2 - 0.0110289710289729*G0_1_1_9_3 + 0.0141458541458566*G0_1_1_9_4 - 0.0493221064649719*G0_1_1_9_5 + 0.049322106464972*G0_1_1_9_6 - 0.0141458541458566*G0_1_1_9_7 + 0.0110289710289729*G0_1_1_9_8; + A[111] = A[97] + 0.000749867416534628*G0_0_1_0_0 - 0.000741974075307513*G0_0_1_0_1 + 0.00266005599338979*G0_0_1_0_2 + 0.00133200133200156*G0_0_1_0_3 - 0.000319680319680389*G0_0_1_0_4 + 0.0198912198912235*G0_0_1_0_5 - 0.0143412143412168*G0_0_1_0_6 - 0.00435120435120481*G0_0_1_0_7 + 0.00244200244200274*G0_0_1_0_8 - 0.00719280719280836*G0_0_1_0_9 - 0.000741974075307513*G0_0_1_1_0 + 0.00203309917595665*G0_0_1_1_1 + 0.000699335937431286*G0_0_1_1_2 - 0.00323739752311236*G0_0_1_1_3 - 0.000598132026703566*G0_0_1_1_4 + 0.0279244564958898*G0_0_1_1_5 - 0.00285999714571191*G0_0_1_1_6 + 0.0085634999920729*G0_0_1_1_7 - 0.00669362383648214*G0_0_1_1_8 + 0.0181494695780441*G0_0_1_1_9 + 0.00266005599338979*G0_0_1_2_0 + 0.000699335937431286*G0_0_1_2_1 - 0.000473600473600774*G0_0_1_2_2 + 0.000167451596023091*G0_0_1_2_3 - 0.00311688311688374*G0_0_1_2_4 + 0.0162047476333219*G0_0_1_2_5 - 0.0104162504162522*G0_0_1_2_6 + 0.00626611483754449*G0_0_1_2_7 - 0.00363446077731854*G0_0_1_2_8 + 0.00611198325484144*G0_0_1_2_9 + 0.00133200133200156*G0_0_1_3_0 - 0.00323739752311236*G0_0_1_3_1 + 0.000167451596023091*G0_0_1_3_2 + 0.00349364920793545*G0_0_1_3_3 + 0.000770657913515251*G0_0_1_3_4 - 0.0396175253318176*G0_0_1_3_5 - 0.0125303268160432*G0_0_1_3_7 + 0.0101612673041261*G0_0_1_3_8 - 0.0293877551020457*G0_0_1_3_9 - 0.000319680319680389*G0_0_1_4_0 - 0.000598132026703562*G0_0_1_4_1 - 0.00311688311688374*G0_0_1_4_2 + 0.000770657913515251*G0_0_1_4_3 - 0.00565149136577806*G0_0_1_4_4 - 0.00757528186099746*G0_0_1_4_5 + 0.0075296132439002*G0_0_1_4_6 - 0.0046524903667769*G0_0_1_4_7 + 0.00236905951191707*G0_0_1_4_8 - 0.00318538604252948*G0_0_1_4_9 + 0.0198912198912235*G0_0_1_5_0 + 0.0279244564958898*G0_0_1_5_1 + 0.0162047476333219*G0_0_1_5_2 - 0.0396175253318176*G0_0_1_5_3 - 0.00757528186099746*G0_0_1_5_4 + 0.624815184815289*G0_0_1_5_5 - 0.065934065934077*G0_0_1_5_6 + 0.11964035964038*G0_0_1_5_7 - 0.0923076923077079*G0_0_1_5_8 + 0.206193806193841*G0_0_1_5_9 - 0.0143412143412168*G0_0_1_6_0 - 0.00285999714571191*G0_0_1_6_1 - 0.0104162504162522*G0_0_1_6_2 + 0.00752961324390019*G0_0_1_6_4 - 0.065934065934077*G0_0_1_6_5 + 0.0684344227201486*G0_0_1_6_6 - 0.027332667332672*G0_0_1_6_7 + 0.014008848294565*G0_0_1_6_8 - 0.0184272869987187*G0_0_1_6_9 - 0.00435120435120481*G0_0_1_7_0 + 0.00856349999207289*G0_0_1_7_1 + 0.00626611483754449*G0_0_1_7_2 - 0.0125303268160432*G0_0_1_7_3 - 0.0046524903667769*G0_0_1_7_4 + 0.11964035964038*G0_0_1_7_5 - 0.027332667332672*G0_0_1_7_6 + 0.0310089910089968*G0_0_1_7_7 - 0.028931068931074*G0_0_1_7_8 + 0.0762437562437692*G0_0_1_7_9 + 0.00244200244200274*G0_0_1_8_0 - 0.00669362383648214*G0_0_1_8_1 - 0.00363446077731854*G0_0_1_8_2 + 0.0101612673041261*G0_0_1_8_3 + 0.00236905951191707*G0_0_1_8_4 - 0.0923076923077079*G0_0_1_8_5 + 0.014008848294565*G0_0_1_8_6 - 0.028931068931074*G0_0_1_8_7 + 0.0212815755672935*G0_0_1_8_8 - 0.0591865277579664*G0_0_1_8_9 - 0.00719280719280836*G0_0_1_9_0 + 0.0181494695780441*G0_0_1_9_1 + 0.00611198325484144*G0_0_1_9_2 - 0.0293877551020457*G0_0_1_9_3 - 0.00318538604252949*G0_0_1_9_4 + 0.206193806193841*G0_0_1_9_5 - 0.0184272869987187*G0_0_1_9_6 + 0.0762437562437692*G0_0_1_9_7 - 0.0591865277579664*G0_0_1_9_8 + 0.170161267304153*G0_0_1_9_9 - 0.000749867416534631*G0_1_0_0_0 + 0.000741974075307513*G0_1_0_0_1 - 0.00266005599338979*G0_1_0_0_2 - 0.00133200133200156*G0_1_0_0_3 + 0.000319680319680389*G0_1_0_0_4 - 0.0198912198912235*G0_1_0_0_5 + 0.0143412143412168*G0_1_0_0_6 + 0.00435120435120481*G0_1_0_0_7 - 0.00244200244200273*G0_1_0_0_8 + 0.00719280719280836*G0_1_0_0_9 + 0.000741974075307513*G0_1_0_1_0 - 0.00203309917595665*G0_1_0_1_1 - 0.000699335937431284*G0_1_0_1_2 + 0.00323739752311236*G0_1_0_1_3 + 0.000598132026703562*G0_1_0_1_4 - 0.0279244564958898*G0_1_0_1_5 + 0.00285999714571191*G0_1_0_1_6 - 0.0085634999920729*G0_1_0_1_7 + 0.00669362383648214*G0_1_0_1_8 - 0.0181494695780441*G0_1_0_1_9 - 0.00266005599338979*G0_1_0_2_0 - 0.000699335937431284*G0_1_0_2_1 + 0.000473600473600774*G0_1_0_2_2 - 0.000167451596023094*G0_1_0_2_3 + 0.00311688311688373*G0_1_0_2_4 - 0.0162047476333219*G0_1_0_2_5 + 0.0104162504162522*G0_1_0_2_6 - 0.00626611483754449*G0_1_0_2_7 + 0.00363446077731854*G0_1_0_2_8 - 0.00611198325484144*G0_1_0_2_9 - 0.00133200133200156*G0_1_0_3_0 + 0.00323739752311236*G0_1_0_3_1 - 0.000167451596023091*G0_1_0_3_2 - 0.00349364920793545*G0_1_0_3_3 - 0.000770657913515251*G0_1_0_3_4 + 0.0396175253318176*G0_1_0_3_5 + 0.0125303268160432*G0_1_0_3_7 - 0.0101612673041261*G0_1_0_3_8 + 0.0293877551020457*G0_1_0_3_9 + 0.000319680319680389*G0_1_0_4_0 + 0.000598132026703566*G0_1_0_4_1 + 0.00311688311688374*G0_1_0_4_2 - 0.000770657913515251*G0_1_0_4_3 + 0.00565149136577808*G0_1_0_4_4 + 0.00757528186099747*G0_1_0_4_5 - 0.00752961324390021*G0_1_0_4_6 + 0.00465249036677689*G0_1_0_4_7 - 0.00236905951191707*G0_1_0_4_8 + 0.00318538604252948*G0_1_0_4_9 - 0.0198912198912235*G0_1_0_5_0 - 0.0279244564958898*G0_1_0_5_1 - 0.0162047476333219*G0_1_0_5_2 + 0.0396175253318176*G0_1_0_5_3 + 0.00757528186099747*G0_1_0_5_4 - 0.624815184815289*G0_1_0_5_5 + 0.065934065934077*G0_1_0_5_6 - 0.11964035964038*G0_1_0_5_7 + 0.0923076923077079*G0_1_0_5_8 - 0.206193806193841*G0_1_0_5_9 + 0.0143412143412168*G0_1_0_6_0 + 0.00285999714571191*G0_1_0_6_1 + 0.0104162504162522*G0_1_0_6_2 - 0.00752961324390019*G0_1_0_6_4 + 0.065934065934077*G0_1_0_6_5 - 0.0684344227201486*G0_1_0_6_6 + 0.027332667332672*G0_1_0_6_7 - 0.014008848294565*G0_1_0_6_8 + 0.0184272869987187*G0_1_0_6_9 + 0.00435120435120481*G0_1_0_7_0 - 0.00856349999207289*G0_1_0_7_1 - 0.00626611483754449*G0_1_0_7_2 + 0.0125303268160432*G0_1_0_7_3 + 0.00465249036677689*G0_1_0_7_4 - 0.11964035964038*G0_1_0_7_5 + 0.027332667332672*G0_1_0_7_6 - 0.0310089910089968*G0_1_0_7_7 + 0.028931068931074*G0_1_0_7_8 - 0.0762437562437692*G0_1_0_7_9 - 0.00244200244200273*G0_1_0_8_0 + 0.00669362383648214*G0_1_0_8_1 + 0.00363446077731854*G0_1_0_8_2 - 0.0101612673041261*G0_1_0_8_3 - 0.00236905951191707*G0_1_0_8_4 + 0.0923076923077079*G0_1_0_8_5 - 0.014008848294565*G0_1_0_8_6 + 0.028931068931074*G0_1_0_8_7 - 0.0212815755672935*G0_1_0_8_8 + 0.0591865277579664*G0_1_0_8_9 + 0.00719280719280836*G0_1_0_9_0 - 0.0181494695780441*G0_1_0_9_1 - 0.00611198325484144*G0_1_0_9_2 + 0.0293877551020457*G0_1_0_9_3 + 0.00318538604252948*G0_1_0_9_4 - 0.206193806193841*G0_1_0_9_5 + 0.0184272869987187*G0_1_0_9_6 - 0.0762437562437692*G0_1_0_9_7 + 0.0591865277579664*G0_1_0_9_8 - 0.170161267304153*G0_1_0_9_9; + A[72] = A[202] + 0.00536352536352632*G0_0_0_0_0 + 0.000421166135451921*G0_0_0_0_2 + 0.00400742115027902*G0_0_0_0_3 + 0.00760382474668326*G0_0_0_0_4 + 0.0252737738452067*G0_0_0_0_5 + 0.00730317301745989*G0_0_0_0_6 + 0.00373721516578724*G0_0_0_0_7 - 0.00166309880595623*G0_0_0_0_8 + 0.00267161410018601*G0_0_0_0_9 - 0.00536352536352634*G0_0_0_1_1 - 0.000421166135451907*G0_0_0_1_2 - 0.0252737738452067*G0_0_0_1_3 - 0.00730317301745988*G0_0_0_1_4 - 0.00400742115027899*G0_0_0_1_5 - 0.00760382474668321*G0_0_0_1_6 + 0.00166309880595626*G0_0_0_1_7 - 0.00373721516578728*G0_0_0_1_8 - 0.002671614100186*G0_0_0_1_9 + 0.000421166135451921*G0_0_0_2_0 - 0.000421166135451907*G0_0_0_2_1 - 0.00873792873793029*G0_0_0_2_3 - 0.0260006660006702*G0_0_0_2_4 + 0.00873792873793022*G0_0_0_2_5 + 0.0260006660006703*G0_0_0_2_6 - 0.000411017553874763*G0_0_0_2_7 + 0.000411017553874765*G0_0_0_2_8 + 0.00400742115027902*G0_0_0_3_0 - 0.0252737738452067*G0_0_0_3_1 - 0.00873792873793029*G0_0_0_3_2 + 0.153035535892705*G0_0_0_3_3 + 0.107618096189543*G0_0_0_3_4 + 0.0228114742400495*G0_0_0_3_6 - 0.0120222634508369*G0_0_0_3_7 + 0.0132553161124612*G0_0_0_3_8 + 0.0320593692022319*G0_0_0_3_9 + 0.00760382474668326*G0_0_0_4_0 - 0.00730317301745988*G0_0_0_4_1 - 0.0260006660006702*G0_0_0_4_2 + 0.107618096189543*G0_0_0_4_3 + 0.351968031968093*G0_0_0_4_4 - 0.0228114742400496*G0_0_0_4_5 - 0.0107892107892127*G0_0_0_4_7 - 0.00123305266162431*G0_0_0_4_8 + 0.0456229484800993*G0_0_0_4_9 + 0.0252737738452067*G0_0_0_5_0 - 0.00400742115027898*G0_0_0_5_1 + 0.00873792873793022*G0_0_0_5_2 - 0.0228114742400496*G0_0_0_5_4 - 0.153035535892705*G0_0_0_5_5 - 0.107618096189543*G0_0_0_5_6 - 0.0132553161124612*G0_0_0_5_7 + 0.0120222634508369*G0_0_0_5_8 - 0.0320593692022318*G0_0_0_5_9 + 0.00730317301745989*G0_0_0_6_0 - 0.0076038247466832*G0_0_0_6_1 + 0.0260006660006703*G0_0_0_6_2 + 0.0228114742400495*G0_0_0_6_3 - 0.107618096189543*G0_0_0_6_5 - 0.351968031968092*G0_0_0_6_6 + 0.00123305266162425*G0_0_0_6_7 + 0.0107892107892126*G0_0_0_6_8 - 0.045622948480099*G0_0_0_6_9 + 0.00373721516578724*G0_0_0_7_0 + 0.00166309880595626*G0_0_0_7_1 - 0.000411017553874762*G0_0_0_7_2 - 0.0120222634508369*G0_0_0_7_3 - 0.0107892107892127*G0_0_0_7_4 - 0.0132553161124612*G0_0_0_7_5 + 0.00123305266162425*G0_0_0_7_6 - 0.0199343513629261*G0_0_0_7_7 - 0.0104809476238066*G0_0_0_7_9 - 0.00166309880595623*G0_0_0_8_0 - 0.00373721516578728*G0_0_0_8_1 + 0.000411017553874766*G0_0_0_8_2 + 0.0132553161124612*G0_0_0_8_3 - 0.00123305266162431*G0_0_0_8_4 + 0.0120222634508369*G0_0_0_8_5 + 0.0107892107892126*G0_0_0_8_6 + 0.0199343513629261*G0_0_0_8_8 + 0.0104809476238065*G0_0_0_8_9 + 0.00267161410018601*G0_0_0_9_0 - 0.002671614100186*G0_0_0_9_1 + 0.0320593692022319*G0_0_0_9_3 + 0.0456229484800993*G0_0_0_9_4 - 0.0320593692022318*G0_0_0_9_5 - 0.045622948480099*G0_0_0_9_6 - 0.0104809476238066*G0_0_0_9_7 + 0.0104809476238065*G0_0_0_9_8 - 0.0054641654641663*G0_0_1_0_0 + 0.000375708947137578*G0_0_1_0_1 - 0.000428354714069075*G0_0_1_0_2 + 0.00290376290376342*G0_0_1_0_3 + 0.00939441510870252*G0_0_1_0_4 + 0.0163493649207963*G0_0_1_0_5 - 0.00965891251605704*G0_0_1_0_6 + 0.00466961609818838*G0_0_1_0_7 + 0.000182674468388728*G0_0_1_0_8 + 0.015230483801915*G0_0_1_0_9 + 0.000375708947137578*G0_0_1_1_0 - 0.00194768194768239*G0_0_1_1_1 - 0.00142143570715023*G0_0_1_1_2 - 0.0201607915893665*G0_0_1_1_3 - 0.00576946862661235*G0_0_1_1_4 + 0.00474192474192553*G0_0_1_1_5 - 0.00223395651967119*G0_0_1_1_6 - 0.00146900718329309*G0_0_1_1_7 + 0.00273821416678595*G0_0_1_1_8 - 0.00379049521906733*G0_0_1_1_9 - 0.000428354714069075*G0_0_1_2_0 - 0.00142143570715023*G0_0_1_2_1 - 0.0248403448403488*G0_0_1_2_2 - 0.0027515341801062*G0_0_1_2_3 - 0.032687312687318*G0_0_1_2_4 + 0.0119537605251911*G0_0_1_2_5 - 0.0199000999001032*G0_0_1_2_6 - 0.00318728890157512*G0_0_1_2_7 + 0.00204747633319095*G0_0_1_2_8 - 0.0135179106607701*G0_0_1_2_9 + 0.00290376290376342*G0_0_1_3_0 - 0.0201607915893665*G0_0_1_3_1 - 0.0027515341801062*G0_0_1_3_2 + 0.136697588126183*G0_0_1_3_3 + 0.0874268588554449*G0_0_1_3_4 - 0.0119880119880139*G0_0_1_3_5 + 0.00774083059797472*G0_0_1_3_6 - 0.00767232767232894*G0_0_1_3_7 + 0.0127757956329406*G0_0_1_3_8 + 0.0267161410018599*G0_0_1_3_9 + 0.00939441510870252*G0_0_1_4_0 - 0.00576946862661235*G0_0_1_4_1 - 0.032687312687318*G0_0_1_4_2 + 0.087426858855445*G0_0_1_4_3 + 0.408688454402811*G0_0_1_4_4 - 0.0271442842871462*G0_0_1_4_5 + 0.0194034536891715*G0_0_1_4_6 - 0.00983016983017161*G0_0_1_4_7 - 0.00510346796061166*G0_0_1_4_8 + 0.0948423005566025*G0_0_1_4_9 + 0.0163493649207963*G0_0_1_5_0 + 0.00474192474192553*G0_0_1_5_1 + 0.0119537605251911*G0_0_1_5_2 - 0.0119880119880139*G0_0_1_5_3 - 0.0271442842871462*G0_0_1_5_4 + 0.273360924789542*G0_0_1_5_5 - 0.0042814328528622*G0_0_1_5_6 + 0.00258598544312882*G0_0_1_5_7 - 0.0131868131868154*G0_0_1_5_8 - 0.0193178250321139*G0_0_1_5_9 - 0.00965891251605704*G0_0_1_6_0 - 0.00223395651967119*G0_0_1_6_1 - 0.0199000999001032*G0_0_1_6_2 + 0.00774083059797472*G0_0_1_6_3 + 0.0194034536891715*G0_0_1_6_4 - 0.00428143285286221*G0_0_1_6_5 - 0.204857999143749*G0_0_1_6_6 + 0.0106008277436866*G0_0_1_6_7 - 0.000239760239760288*G0_0_1_6_8 + 0.0250720707863607*G0_0_1_6_9 + 0.00466961609818838*G0_0_1_7_0 - 0.00146900718329309*G0_0_1_7_1 - 0.00318728890157512*G0_0_1_7_2 - 0.00767232767232894*G0_0_1_7_3 - 0.00983016983017161*G0_0_1_7_4 + 0.00258598544312881*G0_0_1_7_5 + 0.0106008277436866*G0_0_1_7_6 - 0.024387041529902*G0_0_1_7_7 - 0.00450406736121093*G0_0_1_7_8 - 0.0668931068931181*G0_0_1_7_9 + 0.000182674468388727*G0_0_1_8_0 + 0.00273821416678595*G0_0_1_8_1 + 0.00204747633319095*G0_0_1_8_2 + 0.0127757956329406*G0_0_1_8_3 - 0.00510346796061166*G0_0_1_8_4 - 0.0131868131868154*G0_0_1_8_5 - 0.000239760239760289*G0_0_1_8_6 - 0.00450406736121093*G0_0_1_8_7 + 0.0166119594691051*G0_0_1_8_8 + 0.0215784215784253*G0_0_1_8_9 + 0.015230483801915*G0_0_1_9_0 - 0.00379049521906733*G0_0_1_9_1 - 0.0135179106607701*G0_0_1_9_2 + 0.0267161410018599*G0_0_1_9_3 + 0.0948423005566025*G0_0_1_9_4 - 0.0193178250321139*G0_0_1_9_5 + 0.0250720707863607*G0_0_1_9_6 - 0.0668931068931181*G0_0_1_9_7 + 0.0215784215784253*G0_0_1_9_8 - 0.250309690309732*G0_0_1_9_9 + 0.00341584341584399*G0_1_0_0_0 + 0.000375708947137579*G0_1_0_0_1 - 0.00100026957169832*G0_1_0_0_2 + 0.00874934589220461*G0_1_0_0_3 + 0.00536986822701204*G0_1_0_0_4 + 0.00511298225584021*G0_1_0_0_5 + 0.00153370439084755*G0_1_0_0_6 + 0.00647542933257327*G0_1_0_0_7 - 0.00313210598924934*G0_1_0_0_8 - 0.0011188811188813*G0_1_0_0_9 + 0.000375708947137579*G0_1_0_1_0 - 0.0108276908276929*G0_1_0_1_1 - 0.000849520849520983*G0_1_0_1_2 - 0.00892440892441043*G0_1_0_1_3 - 0.0169620855335169*G0_1_0_1_4 - 0.00110365824651561*G0_1_0_1_5 + 0.00179059036201923*G0_1_0_1_6 + 0.00184577327434501*G0_1_0_1_7 + 0.000932400932401127*G0_1_0_1_8 + 0.0125588697017289*G0_1_0_1_9 - 0.00100026957169832*G0_1_0_2_0 - 0.000849520849520983*G0_1_0_2_1 - 0.0248403448403487*G0_1_0_2_2 + 0.00321583178726081*G0_1_0_2_3 - 0.0459007659007735*G0_1_0_2_4 + 0.00598639455782408*G0_1_0_2_5 - 0.00668664668664771*G0_1_0_2_6 + 0.00163645877931618*G0_1_0_2_7 - 0.00277627134770037*G0_1_0_2_8 - 0.0135179106607701*G0_1_0_2_9 + 0.00874934589220461*G0_1_0_3_0 - 0.00892440892441043*G0_1_0_3_1 + 0.00321583178726081*G0_1_0_3_2 + 0.426396460682248*G0_1_0_3_3 + 0.103336663336681*G0_1_0_3_4 - 0.011988011988014*G0_1_0_3_5 - 0.00433281004709645*G0_1_0_3_6 - 0.0252090766376525*G0_1_0_3_7 + 0.0158413015555901*G0_1_0_3_8 + 0.0127415441701182*G0_1_0_3_9 + 0.00536986822701204*G0_1_0_4_0 - 0.0169620855335169*G0_1_0_4_1 - 0.0459007659007735*G0_1_0_4_2 + 0.103336663336681*G0_1_0_4_3 + 0.147110032824344*G0_1_0_4_4 - 0.0150706436420748*G0_1_0_4_5 + 0.0194034536891713*G0_1_0_4_6 - 0.0110289710289729*G0_1_0_4_7 + 0.00936777508206231*G0_1_0_4_8 + 0.0706950192664598*G0_1_0_4_9 + 0.00511298225584021*G0_1_0_5_0 - 0.00110365824651561*G0_1_0_5_1 + 0.00598639455782408*G0_1_0_5_2 - 0.011988011988014*G0_1_0_5_3 - 0.0150706436420748*G0_1_0_5_4 - 0.0163379477665228*G0_1_0_5_5 - 0.0201912373340979*G0_1_0_5_6 - 0.000479520479520692*G0_1_0_5_7 + 0.00434993577850803*G0_1_0_5_8 - 0.00534322820037211*G0_1_0_5_9 + 0.00153370439084755*G0_1_0_6_0 + 0.00179059036201923*G0_1_0_6_1 - 0.00668664668664771*G0_1_0_6_2 - 0.00433281004709645*G0_1_0_6_3 + 0.0194034536891713*G0_1_0_6_4 - 0.0201912373340979*G0_1_0_6_5 + 0.0567204224347171*G0_1_0_6_6 - 0.00387041529898733*G0_1_0_6_7 + 0.000959040959041109*G0_1_0_6_8 + 0.0492193520765031*G0_1_0_6_9 + 0.00647542933257327*G0_1_0_7_0 + 0.00184577327434501*G0_1_0_7_1 + 0.00163645877931618*G0_1_0_7_2 - 0.0252090766376525*G0_1_0_7_3 - 0.0110289710289729*G0_1_0_7_4 - 0.000479520479520693*G0_1_0_7_5 - 0.00387041529898733*G0_1_0_7_6 - 0.00332239189382104*G0_1_0_7_7 - 0.00450406736121112*G0_1_0_7_8 + 0.0110974739546186*G0_1_0_7_9 - 0.00313210598924934*G0_1_0_8_0 + 0.000932400932401126*G0_1_0_8_1 - 0.00277627134770037*G0_1_0_8_2 + 0.0158413015555901*G0_1_0_8_3 + 0.00936777508206231*G0_1_0_8_4 + 0.00434993577850803*G0_1_0_8_5 + 0.000959040959041109*G0_1_0_8_6 - 0.00450406736121112*G0_1_0_8_7 - 0.00445269016697592*G0_1_0_8_8 - 0.0564121592693114*G0_1_0_8_9 - 0.0011188811188813*G0_1_0_9_0 + 0.0125588697017289*G0_1_0_9_1 - 0.0135179106607701*G0_1_0_9_2 + 0.0127415441701182*G0_1_0_9_3 + 0.0706950192664598*G0_1_0_9_4 - 0.00534322820037211*G0_1_0_9_5 + 0.0492193520765031*G0_1_0_9_6 + 0.0110974739546186*G0_1_0_9_7 - 0.0564121592693114*G0_1_0_9_8 - 0.250309690309732*G0_1_0_9_9 - 0.0194768194768223*G0_1_1_0_0 + 0.000375708947137613*G0_1_1_0_1 - 0.00180433323290495*G0_1_1_0_2 + 0.00568383996955531*G0_1_1_0_3 + 0.00478759335902278*G0_1_1_0_4 - 0.00439750725465074*G0_1_1_0_5 + 0.00471909043337688*G0_1_1_0_6 - 0.0191789163217764*G0_1_1_0_7 + 0.0101232101232117*G0_1_1_0_8 - 0.0108462965605841*G0_1_1_0_9 + 0.000375708947137613*G0_1_1_1_0 + 0.0120649720649741*G0_1_1_1_1 + 0.000586080586080688*G0_1_1_1_3 - 0.0201474715760464*G0_1_1_1_4 + 0.00196184767613372*G0_1_1_1_5 + 0.00237286523000849*G0_1_1_1_6 - 0.0114095428381162*G0_1_1_1_7 + 0.0265867465867511*G0_1_1_1_8 + 0.0222862851434318*G0_1_1_1_9 - 0.00180433323290495*G0_1_1_2_0 - 0.0248403448403487*G0_1_1_2_2 + 0.00282003710575178*G0_1_1_2_3 - 0.0444526901669832*G0_1_1_2_4 + 0.00638218923933314*G0_1_1_2_5 - 0.00813472242043804*G0_1_1_2_6 + 0.000780172208743786*G0_1_1_2_7 - 0.00191998477712794*G0_1_1_2_8 - 0.01351791066077*G0_1_1_2_9 + 0.00568383996955531*G0_1_1_3_0 + 0.000586080586080691*G0_1_1_3_1 + 0.00282003710575178*G0_1_1_3_2 + 0.361695447409795*G0_1_1_3_3 + 0.103114028828332*G0_1_1_3_4 - 0.011988011988014*G0_1_1_3_5 - 0.00607963465106421*G0_1_1_3_6 - 0.0160125588697045*G0_1_1_3_7 + 0.0092136434993595*G0_1_1_3_8 - 0.034833737690886*G0_1_1_3_9 + 0.00478759335902278*G0_1_1_4_0 - 0.0201474715760464*G0_1_1_4_1 - 0.0444526901669832*G0_1_1_4_2 + 0.103114028828332*G0_1_1_4_3 + 0.135533038390205*G0_1_1_4_4 - 0.013323819038107*G0_1_1_4_5 + 0.0194034536891713*G0_1_1_4_6 - 0.00887112887113041*G0_1_1_4_7 + 0.00679891537034502*G0_1_1_4_8 + 0.0672013700585243*G0_1_1_4_9 - 0.00439750725465074*G0_1_1_5_0 + 0.00196184767613372*G0_1_1_5_1 + 0.00638218923933314*G0_1_1_5_2 - 0.011988011988014*G0_1_1_5_3 - 0.013323819038107*G0_1_1_5_4 + 0.0483630655059309*G0_1_1_5_5 - 0.019968602825749*G0_1_1_5_6 + 0.00614813757671014*G0_1_1_5_7 - 0.00484658198944*G0_1_1_5_8 + 0.0422320536606323*G0_1_1_5_9 + 0.00471909043337688*G0_1_1_6_0 + 0.00237286523000849*G0_1_1_6_1 - 0.00813472242043804*G0_1_1_6_2 - 0.00607963465106421*G0_1_1_6_3 + 0.0194034536891713*G0_1_1_6_4 - 0.019968602825749*G0_1_1_6_5 + 0.0682974168688565*G0_1_1_6_6 - 0.00130155558727015*G0_1_1_6_7 - 0.0011988011988014*G0_1_1_6_8 + 0.0527130012844386*G0_1_1_6_9 - 0.0191789163217764*G0_1_1_7_0 - 0.0114095428381162*G0_1_1_7_1 + 0.000780172208743786*G0_1_1_7_2 - 0.0160125588697045*G0_1_1_7_3 - 0.00887112887113041*G0_1_1_7_4 + 0.00614813757671014*G0_1_1_7_5 - 0.00130155558727015*G0_1_1_7_6 - 0.0175024975024994*G0_1_1_7_7 - 0.00450406736121128*G0_1_1_7_8 + 0.0351420008562925*G0_1_1_7_9 + 0.0101232101232117*G0_1_1_8_0 + 0.0265867465867511*G0_1_1_8_1 - 0.00191998477712794*G0_1_1_8_2 + 0.0092136434993595*G0_1_1_8_3 + 0.00679891537034502*G0_1_1_8_4 - 0.00484658198944*G0_1_1_8_5 - 0.0011988011988014*G0_1_1_8_6 - 0.00450406736121128*G0_1_1_8_7 + 0.0097274154417035*G0_1_1_8_8 - 0.0804566861709853*G0_1_1_8_9 - 0.0108462965605841*G0_1_1_9_0 + 0.0222862851434318*G0_1_1_9_1 - 0.01351791066077*G0_1_1_9_2 - 0.034833737690886*G0_1_1_9_3 + 0.0672013700585243*G0_1_1_9_4 + 0.0422320536606323*G0_1_1_9_5 + 0.0527130012844386*G0_1_1_9_6 + 0.0351420008562925*G0_1_1_9_7 - 0.0804566861709853*G0_1_1_9_8 - 0.250309690309732*G0_1_1_9_9; + A[42] = -0.00237293570626942*G0_1_0_0_0 + 5.69448188495904e-05*G0_1_0_0_1 - 0.000801544134877597*G0_1_0_0_2 - 0.000287014572728907*G0_1_0_0_3 + 0.000133992991135886*G0_1_0_0_4 + 0.00435770578627795*G0_1_0_0_5 - 0.00223522509236832*G0_1_0_0_6 - 0.00094556237413396*G0_1_0_0_7 - 3.55200355200428e-05*G0_1_0_0_8 + 0.00133390419104728*G0_1_0_0_9 + 5.69448188495904e-05*G0_1_0_1_0 - 0.000273025034929867*G0_1_0_1_1 + 0.000797104130437608*G0_1_0_1_2 + 0.00142825428539736*G0_1_0_1_3 + 0.00222697936983692*G0_1_0_1_4 + 0.00139891854177591*G0_1_0_1_5 - 0.00124462838748573*G0_1_0_1_6 - 0.000216291644863107*G0_1_0_1_7 + 0.00040832183689332*G0_1_0_1_8 + 0.00371628371628434*G0_1_0_1_9 - 0.000801544134877597*G0_1_0_2_0 + 0.000797104130437608*G0_1_0_2_1 - 0.00275280275280327*G0_1_0_2_3 + 0.0109668109668129*G0_1_0_2_4 + 0.00674880674880786*G0_1_0_2_5 - 0.0109668109668128*G0_1_0_2_6 + 0.00049839049839058*G0_1_0_2_7 - 0.000493950493950576*G0_1_0_2_8 - 0.00399600399600465*G0_1_0_2_9 - 0.000287014572728907*G0_1_0_3_0 + 0.00142825428539736*G0_1_0_3_1 - 0.00275280275280327*G0_1_0_3_2 + 0.0103839018124751*G0_1_0_3_3 - 0.0173126873126903*G0_1_0_3_4 - 0.00140430997573875*G0_1_0_3_5 + 0.0032067932067937*G0_1_0_3_6 + 0.000333951762523241*G0_1_0_3_7 - 0.00128871128871148*G0_1_0_3_8 - 0.0118167546738995*G0_1_0_3_9 + 0.000133992991135886*G0_1_0_4_0 + 0.00222697936983692*G0_1_0_4_1 + 0.0109668109668129*G0_1_0_4_2 - 0.0173126873126903*G0_1_0_4_3 + 0.0317482517482574*G0_1_0_4_4 - 0.000929070929071135*G0_1_0_4_5 - 0.00227772227772257*G0_1_0_4_6 - 0.000685029256457951*G0_1_0_4_7 + 0.000954759526188242*G0_1_0_4_8 + 0.0138461538461562*G0_1_0_4_9 + 0.00435770578627795*G0_1_0_5_0 + 0.00139891854177591*G0_1_0_5_1 + 0.00674880674880786*G0_1_0_5_2 - 0.00140430997573875*G0_1_0_5_3 - 0.000929070929071135*G0_1_0_5_4 + 0.0318824033109799*G0_1_0_5_5 - 0.00438561438561515*G0_1_0_5_6 + 0.00674611103182643*G0_1_0_5_7 - 0.00472384758099121*G0_1_0_5_8 + 0.00544598258884059*G0_1_0_5_9 - 0.00223522509236832*G0_1_0_6_0 - 0.00124462838748573*G0_1_0_6_1 - 0.0109668109668128*G0_1_0_6_2 + 0.0032067932067937*G0_1_0_6_3 - 0.00227772227772257*G0_1_0_6_4 - 0.00438561438561515*G0_1_0_6_5 - 0.0271928071928118*G0_1_0_6_6 - 0.00202226345083522*G0_1_0_6_7 + 0.0028714142999862*G0_1_0_6_8 + 0.00557442557442655*G0_1_0_6_9 - 0.00094556237413396*G0_1_0_7_0 - 0.000216291644863107*G0_1_0_7_1 + 0.00049839049839058*G0_1_0_7_2 + 0.000333951762523241*G0_1_0_7_3 - 0.000685029256457951*G0_1_0_7_4 + 0.00674611103182643*G0_1_0_7_5 - 0.00202226345083522*G0_1_0_7_6 + 0.000299700299700355*G0_1_0_7_7 + 0.00102754388468691*G0_1_0_7_8 + 4.28143285286054e-05*G0_1_0_7_9 - 3.55200355200428e-05*G0_1_0_8_0 + 0.000408321836893321*G0_1_0_8_1 - 0.000493950493950576*G0_1_0_8_2 - 0.00128871128871148*G0_1_0_8_3 + 0.000954759526188242*G0_1_0_8_4 - 0.00472384758099121*G0_1_0_8_5 + 0.0028714142999862*G0_1_0_8_6 + 0.00102754388468691*G0_1_0_8_7 + 0.00175538746967354*G0_1_0_8_8 - 0.0130583702012295*G0_1_0_8_9 + 0.00133390419104728*G0_1_0_9_0 + 0.00371628371628434*G0_1_0_9_1 - 0.00399600399600465*G0_1_0_9_2 - 0.0118167546738995*G0_1_0_9_3 + 0.0138461538461562*G0_1_0_9_4 + 0.00544598258884059*G0_1_0_9_5 + 0.00557442557442655*G0_1_0_9_6 + 4.28143285286063e-05*G0_1_0_9_7 - 0.0130583702012295*G0_1_0_9_8 - 0.0267161410018595*G0_1_0_9_9 - 0.00842910176243652*G0_1_1_0_0 - 0.000752492657254688*G0_1_1_0_1 + 0.000395865157769994*G0_1_1_0_2 - 0.000864373721516721*G0_1_1_0_3 + 0.00157842157842186*G0_1_1_0_4 - 0.0022667808382098*G0_1_1_0_5 + 0.00154892726321324*G0_1_1_0_6 - 0.0118146932432667*G0_1_1_0_7 + 0.00621727478870442*G0_1_1_0_8 + 0.000123685837971572*G0_1_1_0_9 - 0.000752492657254688*G0_1_1_1_0 + 0.00152736152736179*G0_1_1_1_1 + 0.00175593366069587*G0_1_1_1_2 + 0.00114805829091562*G0_1_1_1_3 + 0.00362938648652998*G0_1_1_1_4 - 0.000916702345273931*G0_1_1_1_5 + 0.00142286285143453*G0_1_1_1_6 - 0.00327418613132954*G0_1_1_1_7 + 0.00538762824477202*G0_1_1_1_8 + 0.00415584415584486*G0_1_1_1_9 + 0.000395865157769994*G0_1_1_2_0 + 0.00175593366069587*G0_1_1_2_1 + 0.0166006832673528*G0_1_1_2_2 - 0.0073260073260086*G0_1_1_2_3 + 0.0206160506160542*G0_1_1_2_4 - 0.00293928293928344*G0_1_1_2_5 + 0.00437007437007512*G0_1_1_2_6 - 0.00237381665953134*G0_1_1_2_7 - 0.000593216307502118*G0_1_1_2_8 - 0.00254412254412296*G0_1_1_2_9 - 0.000864373721516721*G0_1_1_3_0 + 0.00114805829091562*G0_1_1_3_1 - 0.0073260073260086*G0_1_1_3_2 + 0.0104952190666496*G0_1_1_3_3 - 0.0234950763522233*G0_1_1_3_4 + 0.00310546596260935*G0_1_1_3_5 - 0.00513629227915032*G0_1_1_3_6 + 0.00172541743970345*G0_1_1_3_7 - 0.00263736263736305*G0_1_1_3_8 - 0.0159183673469414*G0_1_1_3_9 + 0.00157842157842186*G0_1_1_4_0 + 0.00362938648652998*G0_1_1_4_1 + 0.0206160506160542*G0_1_1_4_2 - 0.0234950763522233*G0_1_1_4_3 + 0.0461938061938143*G0_1_1_4_4 - 0.0056029684601123*G0_1_1_4_5 + 0.0107392607392626*G0_1_1_4_6 + 0.00162694448408761*G0_1_1_4_7 + 0.000911945197659622*G0_1_1_4_8 + 0.0188383045525935*G0_1_1_4_9 - 0.0022667808382098*G0_1_1_5_0 - 0.000916702345273931*G0_1_1_5_1 - 0.00293928293928344*G0_1_1_5_2 + 0.00310546596260935*G0_1_1_5_3 - 0.0056029684601123*G0_1_1_5_4 + 0.00218923933209686*G0_1_1_5_5 - 0.000610817753675007*G0_1_1_5_6 - 0.00813614956472235*G0_1_1_5_7 + 0.00188240331097505*G0_1_1_5_8 - 0.00413586413586483*G0_1_1_5_9 + 0.00154892726321324*G0_1_1_6_0 + 0.00142286285143453*G0_1_1_6_1 + 0.00437007437007512*G0_1_1_6_2 - 0.00513629227915032*G0_1_1_6_3 + 0.0107392607392626*G0_1_1_6_4 - 0.000610817753675007*G0_1_1_6_5 + 0.00645354645354755*G0_1_1_6_6 + 0.0062537462537473*G0_1_1_6_7 - 0.000810617953475244*G0_1_1_6_8 + 0.0179049521906695*G0_1_1_6_9 - 0.0118146932432667*G0_1_1_7_0 - 0.00327418613132955*G0_1_1_7_1 - 0.00237381665953134*G0_1_1_7_2 + 0.00172541743970345*G0_1_1_7_3 + 0.00162694448408761*G0_1_1_7_4 - 0.00813614956472235*G0_1_1_7_5 + 0.0062537462537473*G0_1_1_7_6 - 0.101121735407467*G0_1_1_7_7 + 0.00439417725132084*G0_1_1_7_8 - 0.0128785500214094*G0_1_1_7_9 + 0.00621727478870442*G0_1_1_8_0 + 0.00538762824477202*G0_1_1_8_1 - 0.000593216307502118*G0_1_1_8_2 - 0.00263736263736305*G0_1_1_8_3 + 0.000911945197659622*G0_1_1_8_4 + 0.00188240331097505*G0_1_1_8_5 - 0.000810617953475244*G0_1_1_8_6 + 0.00439417725132084*G0_1_1_8_7 - 0.0190466676180994*G0_1_1_8_8 - 0.0142914228628538*G0_1_1_8_9 + 0.000123685837971572*G0_1_1_9_0 + 0.00415584415584486*G0_1_1_9_1 - 0.00254412254412296*G0_1_1_9_2 - 0.0159183673469414*G0_1_1_9_3 + 0.0188383045525935*G0_1_1_9_4 - 0.00413586413586484*G0_1_1_9_5 + 0.0179049521906695*G0_1_1_9_6 - 0.0128785500214094*G0_1_1_9_7 - 0.0142914228628538*G0_1_1_9_8 - 0.0203453689168006*G0_1_1_9_9; + A[107] = -0.000546983880317323*G0_0_1_0_0 + 0.000270961401913831*G0_0_1_0_1 + 0.00480046188379603*G0_0_1_0_2 - 0.00165729112157712*G0_0_1_0_3 + 0.00393675768675837*G0_0_1_0_4 - 0.00153616225044823*G0_0_1_0_5 + 0.000815712065712192*G0_0_1_0_6 - 0.000921657707372161*G0_0_1_0_7 + 0.000340235161663799*G0_0_1_0_8 + 0.00040304933162083*G0_0_1_0_9 + 0.000270961401913831*G0_0_1_1_0 + 0.000965859537288304*G0_0_1_1_1 + 0.00711678753345541*G0_0_1_1_2 - 0.0039672232529382*G0_0_1_1_3 + 0.00970904095904261*G0_0_1_1_4 - 0.00113685917257365*G0_0_1_1_5 + 0.00348720723720783*G0_0_1_1_6 - 0.000204616811759713*G0_0_1_1_7 - 0.000334784263355727*G0_0_1_1_8 + 0.00247906855049755*G0_0_1_1_9 + 0.00480046188379603*G0_0_1_2_0 + 0.00711678753345541*G0_0_1_2_1 + 0.139942464942488*G0_0_1_2_2 - 0.0327852702852757*G0_0_1_2_3 + 0.0754273504273631*G0_0_1_2_4 - 0.0208860583860618*G0_0_1_2_5 + 0.0372433122433184*G0_0_1_2_6 - 0.00115398490398509*G0_0_1_2_7 - 0.000651154401154497*G0_0_1_2_8 + 0.00532800532800619*G0_0_1_2_9 - 0.00165729112157712*G0_0_1_3_0 - 0.0039672232529382*G0_0_1_3_1 - 0.0327852702852757*G0_0_1_3_2 + 0.0172752247752277*G0_0_1_3_3 - 0.0454857642357719*G0_0_1_3_4 + 0.00624375624375728*G0_0_1_3_5 - 0.0145666833166858*G0_0_1_3_6 + 0.00086681175966904*G0_0_1_3_7 + 0.00128478664192973*G0_0_1_3_8 - 0.00917082917083071*G0_0_1_3_9 + 0.00393675768675837*G0_0_1_4_0 + 0.00970904095904261*G0_0_1_4_1 + 0.0754273504273631*G0_0_1_4_2 - 0.0454857642357719*G0_0_1_4_3 + 0.110864135864155*G0_0_1_4_4 - 0.0159153346653373*G0_0_1_4_5 + 0.0304820179820231*G0_0_1_4_6 - 0.00212162837162872*G0_0_1_4_7 - 0.00215159840159876*G0_0_1_4_8 + 0.015846653346656*G0_0_1_4_9 - 0.00153616225044823*G0_0_1_5_0 - 0.00113685917257365*G0_0_1_5_1 - 0.0208860583860618*G0_0_1_5_2 + 0.00624375624375728*G0_0_1_5_3 - 0.0159153346653373*G0_0_1_5_4 + 0.00972277722277885*G0_0_1_5_5 - 0.000980269730269788*G0_0_1_5_6 + 0.00133759098044835*G0_0_1_5_7 - 0.000694484087341352*G0_0_1_5_8 + 0.000179820179820223*G0_0_1_5_9 + 0.000815712065712192*G0_0_1_6_0 + 0.00348720723720783*G0_0_1_6_1 + 0.0372433122433184*G0_0_1_6_2 - 0.0145666833166858*G0_0_1_6_3 + 0.0304820179820231*G0_0_1_6_4 - 0.000980269730269788*G0_0_1_6_5 + 0.0110639360639378*G0_0_1_6_6 - 0.000643106893106993*G0_0_1_6_7 - 0.00220154845154883*G0_0_1_6_8 + 0.0131493506493529*G0_0_1_6_9 - 0.000921657707372161*G0_0_1_7_0 - 0.000204616811759713*G0_0_1_7_1 - 0.00115398490398509*G0_0_1_7_2 + 0.00086681175966904*G0_0_1_7_3 - 0.00212162837162872*G0_0_1_7_4 + 0.00133759098044835*G0_0_1_7_5 - 0.000643106893106993*G0_0_1_7_6 - 0.0027426145283293*G0_0_1_7_7 + 8.0455259026692e-05*G0_0_1_7_8 + 7.70657913515116e-05*G0_0_1_7_9 + 0.000340235161663799*G0_0_1_8_0 - 0.000334784263355727*G0_0_1_8_1 - 0.000651154401154497*G0_0_1_8_2 + 0.00128478664192973*G0_0_1_8_3 - 0.00215159840159876*G0_0_1_8_4 - 0.000694484087341352*G0_0_1_8_5 - 0.00220154845154883*G0_0_1_8_6 + 8.0455259026692e-05*G0_0_1_8_7 - 0.000387826459255041*G0_0_1_8_8 - 0.0031340088482951*G0_0_1_8_9 + 0.00040304933162083*G0_0_1_9_0 + 0.00247906855049755*G0_0_1_9_1 + 0.00532800532800619*G0_0_1_9_2 - 0.00917082917083071*G0_0_1_9_3 + 0.015846653346656*G0_0_1_9_4 + 0.000179820179820223*G0_0_1_9_5 + 0.0131493506493529*G0_0_1_9_6 + 7.70657913515116e-05*G0_0_1_9_7 - 0.0031340088482951*G0_0_1_9_8 + 0.0220279720279758*G0_0_1_9_9 + 0.016843588510258*G0_1_1_0_0 + 0.00134550634550658*G0_1_1_0_1 + 0.0038430088430095*G0_1_1_0_2 - 0.00122552051123502*G0_1_1_0_3 + 0.00276037454608932*G0_1_1_0_4 + 0.00496566925138437*G0_1_1_0_5 - 0.00325057878629363*G0_1_1_0_6 + 0.0123289805432683*G0_1_1_0_7 - 0.00560861757290423*G0_1_1_0_8 + 0.000501998001998106*G0_1_1_0_9 + 0.00134550634550658*G0_1_1_1_0 + 0.00082467796753528*G0_1_1_1_1 + 0.00630628630628737*G0_1_1_1_2 - 0.00342597878312221*G0_1_1_1_3 + 0.0080091337234208*G0_1_1_1_4 + 0.00100831707974582*G0_1_1_1_5 + 0.000902232687947125*G0_1_1_1_6 + 0.00255062397919583*G0_1_1_1_7 - 0.00200398807541696*G0_1_1_1_8 + 0.00253032681604153*G0_1_1_1_9 + 0.0038430088430095*G0_1_1_2_0 + 0.00630628630628737*G0_1_1_2_1 + 0.125027133360488*G0_1_1_2_2 - 0.0287769175269223*G0_1_1_2_3 + 0.0661602286602398*G0_1_1_2_4 - 0.0123794261294282*G0_1_1_2_5 + 0.0233294483294521*G0_1_1_2_6 + 0.0010275835275837*G0_1_1_2_7 - 0.000957930957931108*G0_1_1_2_8 + 0.00467615717615794*G0_1_1_2_9 - 0.00122552051123502*G0_1_1_3_0 - 0.00342597878312221*G0_1_1_3_1 - 0.0287769175269223*G0_1_1_3_2 + 0.0135478806907401*G0_1_1_3_3 - 0.0379545454545519*G0_1_1_3_4 + 0.00225292564578317*G0_1_1_3_5 - 0.00656093906094016*G0_1_1_3_6 - 0.000177679463393792*G0_1_1_3_7 + 0.00115812758669921*G0_1_1_3_8 - 0.00723562152133703*G0_1_1_3_9 + 0.00276037454608932*G0_1_1_4_0 + 0.0080091337234208*G0_1_1_4_1 + 0.0661602286602398*G0_1_1_4_2 - 0.0379545454545519*G0_1_1_4_3 + 0.0972252747252912*G0_1_1_4_4 - 0.0121353646353667*G0_1_1_4_5 + 0.0186963036963068*G0_1_1_4_6 - 0.00375481661196009*G0_1_1_4_7 - 0.000980448123305432*G0_1_1_4_8 + 0.0102422577422595*G0_1_1_4_9 + 0.00496566925138437*G0_1_1_5_0 + 0.00100831707974582*G0_1_1_5_1 - 0.0123794261294282*G0_1_1_5_2 + 0.00225292564578317*G0_1_1_5_3 - 0.0121353646353667*G0_1_1_5_4 + 0.027726202369064*G0_1_1_5_5 - 0.00227272727272756*G0_1_1_5_6 + 0.0138161838161861*G0_1_1_5_7 - 0.00687919223633623*G0_1_1_5_8 + 0.0122523904666782*G0_1_1_5_9 - 0.00325057878629363*G0_1_1_6_0 + 0.000902232687947125*G0_1_1_6_1 + 0.0233294483294521*G0_1_1_6_2 - 0.00656093906094016*G0_1_1_6_3 + 0.0186963036963068*G0_1_1_6_4 - 0.00227272727272756*G0_1_1_6_5 - 0.0187337662337695*G0_1_1_6_6 - 0.00693699157984988*G0_1_1_6_7 + 0.00201066790352537*G0_1_1_6_8 - 0.000906593406593514*G0_1_1_6_9 + 0.0123289805432683*G0_1_1_7_0 + 0.00255062397919583*G0_1_1_7_1 + 0.0010275835275837*G0_1_1_7_2 - 0.000177679463393792*G0_1_1_7_3 - 0.00375481661196009*G0_1_1_7_4 + 0.0138161838161861*G0_1_1_7_5 - 0.00693699157984988*G0_1_1_7_6 + 0.0506953760525274*G0_1_1_7_7 - 0.0102722277722295*G0_1_1_7_8 + 0.0123679891537055*G0_1_1_7_9 - 0.00560861757290423*G0_1_1_8_0 - 0.00200398807541696*G0_1_1_8_1 - 0.000957930957931108*G0_1_1_8_2 + 0.00115812758669921*G0_1_1_8_3 - 0.000980448123305432*G0_1_1_8_4 - 0.00687919223633623*G0_1_1_8_5 + 0.00201066790352537*G0_1_1_8_6 - 0.0102722277722295*G0_1_1_8_7 + 0.00786499215070781*G0_1_1_8_8 - 0.00563008420151373*G0_1_1_8_9 + 0.000501998001998106*G0_1_1_9_0 + 0.00253032681604153*G0_1_1_9_1 + 0.00467615717615794*G0_1_1_9_2 - 0.00723562152133703*G0_1_1_9_3 + 0.0102422577422595*G0_1_1_9_4 + 0.0122523904666782*G0_1_1_9_5 - 0.000906593406593514*G0_1_1_9_6 + 0.0123679891537055*G0_1_1_9_7 - 0.00563008420151373*G0_1_1_9_8 + 0.0352704438418783*G0_1_1_9_9; + A[7] = A[107] - 0.0149153315820009*G0_0_0_0_0 - 0.000810501227168036*G0_0_0_0_1 - 0.000957453040786538*G0_0_0_0_2 - 0.000306776556776606*G0_0_0_0_3 + 0.00218156843156881*G0_0_0_0_4 - 0.0139138639138663*G0_0_0_0_5 + 0.00850663225663372*G0_0_0_0_6 - 0.00926712176712339*G0_0_0_0_7 + 0.00400835275835347*G0_0_0_0_8 - 0.000651848151848271*G0_0_0_0_9 - 0.000810501227168036*G0_0_0_1_0 - 0.000141181569753039*G0_0_0_1_1 + 0.00107454494359275*G0_0_0_1_2 - 0.00166920381206124*G0_0_0_1_3 + 0.00275524079095555*G0_0_0_1_4 - 0.0025849745492607*G0_0_0_1_5 + 0.00214517625231947*G0_0_0_1_6 - 0.00169990723562181*G0_0_0_1_7 + 0.000541244469815992*G0_0_0_1_8 - 0.000957453040786538*G0_0_0_2_0 + 0.00107454494359275*G0_0_0_2_1 + 0.0173905723905753*G0_0_0_2_2 - 0.00594885273456802*G0_0_0_2_3 + 0.0132506382506405*G0_0_0_2_4 - 0.00406629085200583*G0_0_0_2_5 + 0.00650183150183261*G0_0_0_2_6 - 0.00117638314066905*G0_0_0_2_7 + 0.000431770610342114*G0_0_0_2_8 - 0.000306776556776606*G0_0_0_3_0 - 0.00166920381206124*G0_0_0_3_1 - 0.00594885273456802*G0_0_0_3_2 + 0.00825281860996289*G0_0_0_3_3 - 0.0103526830312562*G0_0_0_3_4 + 0.00421221635507421*G0_0_0_3_5 - 0.0061847081489949*G0_0_0_3_6 + 0.00117115027829333*G0_0_0_3_7 - 0.000126659055230504*G0_0_0_3_8 - 0.00249607535321862*G0_0_0_3_9 + 0.00218156843156881*G0_0_0_4_0 + 0.00275524079095555*G0_0_0_4_1 + 0.0132506382506405*G0_0_0_4_2 - 0.0103526830312562*G0_0_0_4_3 + 0.0534379905808568*G0_0_0_4_4 - 0.00629388468674289*G0_0_0_4_5 + 0.0124785928357378*G0_0_0_4_6 - 0.00163318824033137*G0_0_0_4_7 - 0.00104449122306283*G0_0_0_4_8 + 0.012290923362354*G0_0_0_4_9 - 0.0139138639138663*G0_0_0_5_0 - 0.0025849745492607*G0_0_0_5_1 - 0.00406629085200583*G0_0_0_5_2 + 0.00421221635507421*G0_0_0_5_3 - 0.00629388468674289*G0_0_0_5_4 - 0.0297977022977074*G0_0_0_5_5 - 0.00129245754245776*G0_0_0_5_6 - 0.0117857142857163*G0_0_0_5_7 + 0.00800574425574561*G0_0_0_5_8 - 0.0140559440559465*G0_0_0_5_9 + 0.00850663225663372*G0_0_0_6_0 + 0.00214517625231947*G0_0_0_6_1 + 0.00650183150183261*G0_0_0_6_2 - 0.0061847081489949*G0_0_0_6_3 + 0.0124785928357378*G0_0_0_6_4 - 0.00129245754245776*G0_0_0_6_5 + 0.0180034251462853*G0_0_0_6_6 + 0.00377997002997068*G0_0_0_6_7 - 0.00399083059797413*G0_0_0_6_8 + 0.012072570286858*G0_0_0_6_9 - 0.00926712176712339*G0_0_0_7_0 - 0.00169990723562181*G0_0_0_7_1 - 0.00117638314066905*G0_0_0_7_2 + 0.00117115027829333*G0_0_0_7_3 - 0.00163318824033137*G0_0_0_7_4 - 0.0117857142857163*G0_0_0_7_5 + 0.00377997002997068*G0_0_0_7_6 - 0.0136388611388635*G0_0_0_7_7 + 0.00753121878122008*G0_0_0_7_8 - 0.00560439560439657*G0_0_0_7_9 + 0.00400835275835347*G0_0_0_8_0 + 0.000541244469815992*G0_0_0_8_1 + 0.000431770610342114*G0_0_0_8_2 - 0.000126659055230504*G0_0_0_8_3 - 0.00104449122306283*G0_0_0_8_4 + 0.00800574425574561*G0_0_0_8_5 - 0.00399083059797413*G0_0_0_8_6 + 0.00753121878122008*G0_0_0_8_7 - 0.00372734408448757*G0_0_0_8_8 + 0.0019352076494937*G0_0_0_8_9 - 0.000651848151848271*G0_0_0_9_0 - 0.00249607535321862*G0_0_0_9_3 + 0.012290923362354*G0_0_0_9_4 - 0.0140559440559465*G0_0_0_9_5 + 0.012072570286858*G0_0_0_9_6 - 0.00560439560439657*G0_0_0_9_7 + 0.0019352076494937*G0_0_0_9_8 + 0.0132424718139026*G0_0_0_9_9 + 0.125574117240805*G0_0_1_0_0 + 0.00603532490437356*G0_0_1_0_1 - 0.000957453040786546*G0_0_1_0_2 + 0.000699360163645949*G0_0_1_0_3 - 0.00290917415917465*G0_0_1_0_4 + 0.0248656105799005*G0_0_1_0_5 - 0.0131951381951404*G0_0_1_0_6 + 0.067081886367612*G0_0_1_0_7 - 0.0291171526885862*G0_0_1_0_8 + 0.0042731078445372*G0_0_1_0_9 + 0.00603532490437356*G0_0_1_1_0 - 0.000141181569753073*G0_0_1_1_1 - 0.00577128118794883*G0_0_1_1_2 + 0.00196323517752121*G0_0_1_1_3 - 0.00715841697984676*G0_0_1_1_4 + 0.00203909186052077*G0_0_1_1_5 - 0.002478890157462*G0_0_1_1_6 + 0.00821375053518052*G0_0_1_1_7 - 0.0030911945197665*G0_0_1_1_8 - 0.000957453040786546*G0_0_1_2_0 - 0.00577128118794883*G0_0_1_2_1 - 0.12309887643223*G0_0_1_2_2 + 0.0271766527123715*G0_0_1_2_3 - 0.0630983698840947*G0_0_1_2_4 + 0.0176354795997682*G0_0_1_2_5 - 0.032277642991934*G0_0_1_2_6 + 0.00391435945007438*G0_0_1_2_7 - 0.000574366110080501*G0_0_1_2_8 - 0.00482600732600811*G0_0_1_2_9 + 0.00069936016364595*G0_0_1_3_0 + 0.00196323517752121*G0_0_1_3_1 + 0.0271766527123715*G0_0_1_3_2 - 0.00941023262451993*G0_0_1_3_3 + 0.0352135364635424*G0_0_1_3_4 - 0.00423308834023191*G0_0_1_3_5 + 0.00768749108034952*G0_0_1_3_6 - 0.00184725988297452*G0_0_1_3_7 - 0.000126659055230494*G0_0_1_3_8 + 0.00354074496931701*G0_0_1_3_9 - 0.00290917415917465*G0_0_1_4_0 - 0.00715841697984676*G0_0_1_4_1 - 0.0630983698840947*G0_0_1_4_2 + 0.0352135364635424*G0_0_1_4_3 - 0.0601687598116272*G0_0_1_4_4 + 0.00897834308548744*G0_0_1_4_5 - 0.016665834165837*G0_0_1_4_6 - 0.00163318824033136*G0_0_1_4_7 + 0.00197391893820498*G0_0_1_4_8 - 0.0034786641929505*G0_0_1_4_9 + 0.0248656105799005*G0_0_1_5_0 + 0.00203909186052078*G0_0_1_5_1 + 0.0176354795997682*G0_0_1_5_2 - 0.00423308834023191*G0_0_1_5_3 + 0.00897834308548744*G0_0_1_5_4 - 0.0284565434565483*G0_0_1_5_5 - 0.00129245754245784*G0_0_1_5_6 + 0.0173587127158584*G0_0_1_5_7 - 0.0058664549735988*G0_0_1_5_8 - 0.00108641358641378*G0_0_1_5_9 - 0.0131951381951404*G0_0_1_6_0 - 0.002478890157462*G0_0_1_6_1 - 0.032277642991934*G0_0_1_6_2 + 0.00768749108034952*G0_0_1_6_3 - 0.016665834165837*G0_0_1_6_4 - 0.00129245754245784*G0_0_1_6_5 + 0.0166622663051264*G0_0_1_6_6 - 0.0114922577422597*G0_0_1_6_7 + 0.00445447409733199*G0_0_1_6_8 - 0.000896960182674674*G0_0_1_6_9 + 0.067081886367612*G0_0_1_7_0 + 0.00821375053518052*G0_0_1_7_1 + 0.00391435945007438*G0_0_1_7_2 - 0.00184725988297452*G0_0_1_7_3 - 0.00163318824033136*G0_0_1_7_4 + 0.0173587127158584*G0_0_1_7_5 - 0.0114922577422597*G0_0_1_7_6 + 0.0999678892536204*G0_0_1_7_7 - 0.0380350007135785*G0_0_1_7_8 + 0.010165191950908*G0_0_1_7_9 - 0.0291171526885862*G0_0_1_8_0 - 0.0030911945197665*G0_0_1_8_1 - 0.000574366110080501*G0_0_1_8_2 - 0.000126659055230494*G0_0_1_8_3 + 0.00197391893820498*G0_0_1_8_4 - 0.0058664549735988*G0_0_1_8_5 + 0.00445447409733199*G0_0_1_8_6 - 0.0380350007135785*G0_0_1_8_7 + 0.0139357071499952*G0_0_1_8_8 - 0.00410161267304194*G0_0_1_8_9 + 0.00427310784453721*G0_0_1_9_0 - 0.00482600732600811*G0_0_1_9_2 + 0.00354074496931701*G0_0_1_9_3 - 0.0034786641929505*G0_0_1_9_4 - 0.00108641358641378*G0_0_1_9_5 - 0.000896960182674673*G0_0_1_9_6 + 0.010165191950908*G0_0_1_9_7 - 0.00410161267304194*G0_0_1_9_8 + 0.0132424718139026*G0_0_1_9_9 - 0.0149153315820009*G0_1_0_0_0 - 0.000810501227168036*G0_1_0_0_1 - 0.000957453040786535*G0_1_0_0_2 - 0.000306776556776608*G0_1_0_0_3 + 0.00218156843156881*G0_1_0_0_4 - 0.0139138639138663*G0_1_0_0_5 + 0.00850663225663373*G0_1_0_0_6 - 0.00926712176712339*G0_1_0_0_7 + 0.00400835275835347*G0_1_0_0_8 - 0.000651848151848269*G0_1_0_0_9 - 0.000810501227168036*G0_1_0_1_0 - 0.000141181569753038*G0_1_0_1_1 + 0.00107454494359275*G0_1_0_1_2 - 0.00166920381206124*G0_1_0_1_3 + 0.00275524079095556*G0_1_0_1_4 - 0.00258497454926071*G0_1_0_1_5 + 0.00214517625231948*G0_1_0_1_6 - 0.00169990723562182*G0_1_0_1_7 + 0.000541244469815991*G0_1_0_1_8 - 0.000957453040786535*G0_1_0_2_0 + 0.00107454494359275*G0_1_0_2_1 + 0.0173905723905754*G0_1_0_2_2 - 0.00594885273456804*G0_1_0_2_3 + 0.0132506382506405*G0_1_0_2_4 - 0.00406629085200584*G0_1_0_2_5 + 0.00650183150183263*G0_1_0_2_6 - 0.00117638314066905*G0_1_0_2_7 + 0.000431770610342114*G0_1_0_2_8 - 0.000306776556776608*G0_1_0_3_0 - 0.00166920381206124*G0_1_0_3_1 - 0.00594885273456804*G0_1_0_3_2 + 0.0082528186099629*G0_1_0_3_3 - 0.0103526830312562*G0_1_0_3_4 + 0.00421221635507422*G0_1_0_3_5 - 0.00618470814899491*G0_1_0_3_6 + 0.00117115027829333*G0_1_0_3_7 - 0.000126659055230502*G0_1_0_3_8 - 0.00249607535321862*G0_1_0_3_9 + 0.00218156843156881*G0_1_0_4_0 + 0.00275524079095556*G0_1_0_4_1 + 0.0132506382506405*G0_1_0_4_2 - 0.0103526830312562*G0_1_0_4_3 + 0.0534379905808568*G0_1_0_4_4 - 0.0062938846867429*G0_1_0_4_5 + 0.0124785928357378*G0_1_0_4_6 - 0.00163318824033137*G0_1_0_4_7 - 0.00104449122306283*G0_1_0_4_8 + 0.012290923362354*G0_1_0_4_9 - 0.0139138639138663*G0_1_0_5_0 - 0.00258497454926071*G0_1_0_5_1 - 0.00406629085200584*G0_1_0_5_2 + 0.00421221635507421*G0_1_0_5_3 - 0.0062938846867429*G0_1_0_5_4 - 0.0297977022977074*G0_1_0_5_5 - 0.00129245754245778*G0_1_0_5_6 - 0.0117857142857163*G0_1_0_5_7 + 0.00800574425574562*G0_1_0_5_8 - 0.0140559440559465*G0_1_0_5_9 + 0.00850663225663373*G0_1_0_6_0 + 0.00214517625231948*G0_1_0_6_1 + 0.00650183150183263*G0_1_0_6_2 - 0.00618470814899491*G0_1_0_6_3 + 0.0124785928357378*G0_1_0_6_4 - 0.00129245754245778*G0_1_0_6_5 + 0.0180034251462853*G0_1_0_6_6 + 0.00377997002997067*G0_1_0_6_7 - 0.00399083059797413*G0_1_0_6_8 + 0.012072570286858*G0_1_0_6_9 - 0.00926712176712339*G0_1_0_7_0 - 0.00169990723562182*G0_1_0_7_1 - 0.00117638314066905*G0_1_0_7_2 + 0.00117115027829333*G0_1_0_7_3 - 0.00163318824033137*G0_1_0_7_4 - 0.0117857142857163*G0_1_0_7_5 + 0.00377997002997067*G0_1_0_7_6 - 0.0136388611388635*G0_1_0_7_7 + 0.00753121878122008*G0_1_0_7_8 - 0.00560439560439657*G0_1_0_7_9 + 0.00400835275835347*G0_1_0_8_0 + 0.000541244469815991*G0_1_0_8_1 + 0.000431770610342114*G0_1_0_8_2 - 0.000126659055230502*G0_1_0_8_3 - 0.00104449122306283*G0_1_0_8_4 + 0.00800574425574562*G0_1_0_8_5 - 0.00399083059797413*G0_1_0_8_6 + 0.00753121878122008*G0_1_0_8_7 - 0.00372734408448756*G0_1_0_8_8 + 0.00193520764949371*G0_1_0_8_9 - 0.000651848151848268*G0_1_0_9_0 - 0.00249607535321862*G0_1_0_9_3 + 0.012290923362354*G0_1_0_9_4 - 0.0140559440559465*G0_1_0_9_5 + 0.012072570286858*G0_1_0_9_6 - 0.00560439560439657*G0_1_0_9_7 + 0.00193520764949371*G0_1_0_9_8 + 0.0132424718139026*G0_1_0_9_9 + 0.10818354485023*G0_1_1_0_0 + 0.00496077996078081*G0_1_1_0_1 + 0.000267589553303846*G0_1_1_0_3 - 0.00173279101850559*G0_1_1_0_4 + 0.0183637790780679*G0_1_1_0_5 - 0.00912884734313456*G0_1_1_0_6 + 0.0538312481169715*G0_1_1_0_7 - 0.0231682999540181*G0_1_1_0_8 + 0.00417415917415993*G0_1_1_0_9 + 0.00496077996078081*G0_1_1_1_0 - 0.0049607799607808*G0_1_1_1_2 + 0.00142199070770522*G0_1_1_1_3 - 0.00545850974422494*G0_1_1_1_4 - 0.000106084391798686*G0_1_1_1_5 + 0.0001060843917987*G0_1_1_1_6 + 0.00545850974422497*G0_1_1_1_7 - 0.00142199070770526*G0_1_1_1_8 - 0.0049607799607808*G0_1_1_2_1 - 0.10818354485023*G0_1_1_2_2 + 0.0231682999540181*G0_1_1_2_3 - 0.0538312481169714*G0_1_1_2_4 + 0.00912884734313452*G0_1_1_2_5 - 0.0183637790780677*G0_1_1_2_6 + 0.00173279101850558*G0_1_1_2_7 - 0.000267589553303891*G0_1_1_2_8 - 0.00417415917415985*G0_1_1_2_9 + 0.000267589553303846*G0_1_1_3_0 + 0.00142199070770522*G0_1_1_3_1 + 0.0231682999540181*G0_1_1_3_2 - 0.00568288854003233*G0_1_1_3_3 + 0.0276823176823223*G0_1_1_3_4 - 0.000242257742257806*G0_1_1_3_5 - 0.000318253175396086*G0_1_1_3_6 - 0.000802768659911685*G0_1_1_3_7 + 0.00160553731982331*G0_1_1_3_9 - 0.00173279101850559*G0_1_1_4_0 - 0.00545850974422494*G0_1_1_4_1 - 0.0538312481169714*G0_1_1_4_2 + 0.0276823176823223*G0_1_1_4_3 - 0.0465298986727637*G0_1_1_4_4 + 0.00519837305551677*G0_1_1_4_5 - 0.00488011988012068*G0_1_1_4_6 + 0.000802768659911645*G0_1_1_4_8 + 0.00212573141144604*G0_1_1_4_9 + 0.0183637790780679*G0_1_1_5_0 - 0.000106084391798686*G0_1_1_5_1 + 0.00912884734313452*G0_1_1_5_2 - 0.000242257742257807*G0_1_1_5_3 + 0.00519837305551677*G0_1_1_5_4 - 0.0464599686028334*G0_1_1_5_5 + 0.00488011988012071*G0_1_1_5_7 + 0.000318253175396062*G0_1_1_5_8 - 0.0131589838732717*G0_1_1_5_9 - 0.00912884734313456*G0_1_1_6_0 + 0.000106084391798701*G0_1_1_6_1 - 0.0183637790780677*G0_1_1_6_2 - 0.000318253175396086*G0_1_1_6_3 - 0.00488011988012068*G0_1_1_6_4 + 0.0464599686028337*G0_1_1_6_6 - 0.00519837305551679*G0_1_1_6_7 + 0.00024225774225779*G0_1_1_6_8 + 0.0131589838732718*G0_1_1_6_9 + 0.0538312481169715*G0_1_1_7_0 + 0.00545850974422497*G0_1_1_7_1 + 0.00173279101850559*G0_1_1_7_2 - 0.000802768659911685*G0_1_1_7_3 + 0.00488011988012071*G0_1_1_7_5 - 0.00519837305551679*G0_1_1_7_6 + 0.0465298986727637*G0_1_1_7_7 - 0.0276823176823224*G0_1_1_7_8 - 0.00212573141144599*G0_1_1_7_9 - 0.0231682999540182*G0_1_1_8_0 - 0.00142199070770526*G0_1_1_8_1 - 0.000267589553303891*G0_1_1_8_2 + 0.000802768659911645*G0_1_1_8_4 + 0.000318253175396062*G0_1_1_8_5 + 0.00024225774225779*G0_1_1_8_6 - 0.0276823176823224*G0_1_1_8_7 + 0.00568288854003235*G0_1_1_8_8 - 0.00160553731982332*G0_1_1_8_9 + 0.00417415917415993*G0_1_1_9_0 - 0.00417415917415985*G0_1_1_9_2 + 0.00160553731982331*G0_1_1_9_3 + 0.00212573141144604*G0_1_1_9_4 - 0.0131589838732717*G0_1_1_9_5 + 0.0131589838732718*G0_1_1_9_6 - 0.00212573141144599*G0_1_1_9_7 - 0.00160553731982332*G0_1_1_9_8; + A[182] = A[42] - 0.00237293570626943*G0_0_1_0_0 - 0.000801544134877597*G0_0_1_0_2 - 0.000287014572728908*G0_0_1_0_3 + 0.000133992991135885*G0_0_1_0_4 + 0.00435770578627795*G0_0_1_0_5 - 0.00223522509236832*G0_0_1_0_6 - 0.000945562374133961*G0_0_1_0_7 + 0.00133390419104728*G0_0_1_0_9 - 0.000273025034929867*G0_0_1_1_1 + 0.000797104130437608*G0_0_1_1_2 + 0.00142825428539737*G0_0_1_1_3 + 0.00222697936983692*G0_0_1_1_4 + 0.00139891854177591*G0_0_1_1_5 - 0.00124462838748573*G0_0_1_1_6 - 0.000216291644863108*G0_0_1_1_7 + 0.000408321836893321*G0_0_1_1_8 + 0.00371628371628434*G0_0_1_1_9 - 0.000801544134877597*G0_0_1_2_0 + 0.000797104130437608*G0_0_1_2_1 - 0.00275280275280327*G0_0_1_2_3 + 0.0109668109668129*G0_0_1_2_4 + 0.00674880674880786*G0_0_1_2_5 - 0.0109668109668128*G0_0_1_2_6 + 0.00049839049839058*G0_0_1_2_7 - 0.000493950493950576*G0_0_1_2_8 - 0.00399600399600465*G0_0_1_2_9 - 0.000287014572728908*G0_0_1_3_0 + 0.00142825428539737*G0_0_1_3_1 - 0.00275280275280327*G0_0_1_3_2 + 0.0103839018124751*G0_0_1_3_3 - 0.0173126873126903*G0_0_1_3_4 - 0.00140430997573875*G0_0_1_3_5 + 0.0032067932067937*G0_0_1_3_6 + 0.000333951762523244*G0_0_1_3_7 - 0.00128871128871149*G0_0_1_3_8 - 0.0118167546738995*G0_0_1_3_9 + 0.000133992991135885*G0_0_1_4_0 + 0.00222697936983692*G0_0_1_4_1 + 0.0109668109668129*G0_0_1_4_2 - 0.0173126873126903*G0_0_1_4_3 + 0.0317482517482574*G0_0_1_4_4 - 0.000929070929071133*G0_0_1_4_5 - 0.00227772227772258*G0_0_1_4_6 - 0.000685029256457951*G0_0_1_4_7 + 0.000954759526188244*G0_0_1_4_8 + 0.0138461538461562*G0_0_1_4_9 + 0.00435770578627795*G0_0_1_5_0 + 0.00139891854177591*G0_0_1_5_1 + 0.00674880674880786*G0_0_1_5_2 - 0.00140430997573875*G0_0_1_5_3 - 0.000929070929071133*G0_0_1_5_4 + 0.0318824033109799*G0_0_1_5_5 - 0.00438561438561515*G0_0_1_5_6 + 0.00674611103182643*G0_0_1_5_7 - 0.00472384758099121*G0_0_1_5_8 + 0.0054459825888406*G0_0_1_5_9 - 0.00223522509236832*G0_0_1_6_0 - 0.00124462838748573*G0_0_1_6_1 - 0.0109668109668128*G0_0_1_6_2 + 0.0032067932067937*G0_0_1_6_3 - 0.00227772227772258*G0_0_1_6_4 - 0.00438561438561515*G0_0_1_6_5 - 0.0271928071928118*G0_0_1_6_6 - 0.00202226345083522*G0_0_1_6_7 + 0.00287141429998619*G0_0_1_6_8 + 0.00557442557442655*G0_0_1_6_9 - 0.000945562374133961*G0_0_1_7_0 - 0.000216291644863108*G0_0_1_7_1 + 0.00049839049839058*G0_0_1_7_2 + 0.000333951762523244*G0_0_1_7_3 - 0.00068502925645795*G0_0_1_7_4 + 0.00674611103182643*G0_0_1_7_5 - 0.00202226345083522*G0_0_1_7_6 + 0.000299700299700353*G0_0_1_7_7 + 0.00102754388468692*G0_0_1_7_8 + 0.000408321836893321*G0_0_1_8_1 - 0.000493950493950576*G0_0_1_8_2 - 0.00128871128871149*G0_0_1_8_3 + 0.000954759526188244*G0_0_1_8_4 - 0.00472384758099121*G0_0_1_8_5 + 0.00287141429998619*G0_0_1_8_6 + 0.00102754388468692*G0_0_1_8_7 + 0.00175538746967353*G0_0_1_8_8 - 0.0130583702012295*G0_0_1_8_9 + 0.00133390419104728*G0_0_1_9_0 + 0.00371628371628434*G0_0_1_9_1 - 0.00399600399600465*G0_0_1_9_2 - 0.0118167546738995*G0_0_1_9_3 + 0.0138461538461562*G0_0_1_9_4 + 0.0054459825888406*G0_0_1_9_5 + 0.00557442557442655*G0_0_1_9_6 - 0.0130583702012295*G0_0_1_9_8 - 0.0267161410018596*G0_0_1_9_9 + 0.00237293570626943*G0_1_0_0_0 + 0.000801544134877597*G0_1_0_0_2 + 0.000287014572728908*G0_1_0_0_3 - 0.000133992991135885*G0_1_0_0_4 - 0.00435770578627794*G0_1_0_0_5 + 0.00223522509236832*G0_1_0_0_6 + 0.000945562374133962*G0_1_0_0_7 - 0.00133390419104728*G0_1_0_0_9 + 0.000273025034929867*G0_1_0_1_1 - 0.000797104130437608*G0_1_0_1_2 - 0.00142825428539737*G0_1_0_1_3 - 0.00222697936983692*G0_1_0_1_4 - 0.00139891854177591*G0_1_0_1_5 + 0.00124462838748573*G0_1_0_1_6 + 0.000216291644863108*G0_1_0_1_7 - 0.000408321836893321*G0_1_0_1_8 - 0.00371628371628434*G0_1_0_1_9 + 0.000801544134877597*G0_1_0_2_0 - 0.000797104130437608*G0_1_0_2_1 + 0.00275280275280327*G0_1_0_2_3 - 0.0109668109668129*G0_1_0_2_4 - 0.00674880674880786*G0_1_0_2_5 + 0.0109668109668128*G0_1_0_2_6 - 0.00049839049839058*G0_1_0_2_7 + 0.000493950493950576*G0_1_0_2_8 + 0.00399600399600465*G0_1_0_2_9 + 0.000287014572728908*G0_1_0_3_0 - 0.00142825428539737*G0_1_0_3_1 + 0.00275280275280327*G0_1_0_3_2 - 0.0103839018124751*G0_1_0_3_3 + 0.0173126873126903*G0_1_0_3_4 + 0.00140430997573875*G0_1_0_3_5 - 0.0032067932067937*G0_1_0_3_6 - 0.000333951762523244*G0_1_0_3_7 + 0.00128871128871149*G0_1_0_3_8 + 0.0118167546738995*G0_1_0_3_9 - 0.000133992991135885*G0_1_0_4_0 - 0.00222697936983692*G0_1_0_4_1 - 0.0109668109668129*G0_1_0_4_2 + 0.0173126873126903*G0_1_0_4_3 - 0.0317482517482574*G0_1_0_4_4 + 0.000929070929071133*G0_1_0_4_5 + 0.00227772227772258*G0_1_0_4_6 + 0.000685029256457951*G0_1_0_4_7 - 0.000954759526188244*G0_1_0_4_8 - 0.0138461538461562*G0_1_0_4_9 - 0.00435770578627795*G0_1_0_5_0 - 0.00139891854177591*G0_1_0_5_1 - 0.00674880674880786*G0_1_0_5_2 + 0.00140430997573875*G0_1_0_5_3 + 0.000929070929071133*G0_1_0_5_4 - 0.0318824033109799*G0_1_0_5_5 + 0.00438561438561515*G0_1_0_5_6 - 0.00674611103182643*G0_1_0_5_7 + 0.00472384758099121*G0_1_0_5_8 - 0.0054459825888406*G0_1_0_5_9 + 0.00223522509236832*G0_1_0_6_0 + 0.00124462838748573*G0_1_0_6_1 + 0.0109668109668128*G0_1_0_6_2 - 0.0032067932067937*G0_1_0_6_3 + 0.00227772227772258*G0_1_0_6_4 + 0.00438561438561515*G0_1_0_6_5 + 0.0271928071928118*G0_1_0_6_6 + 0.00202226345083522*G0_1_0_6_7 - 0.00287141429998619*G0_1_0_6_8 - 0.00557442557442655*G0_1_0_6_9 + 0.000945562374133962*G0_1_0_7_0 + 0.000216291644863108*G0_1_0_7_1 - 0.00049839049839058*G0_1_0_7_2 - 0.000333951762523244*G0_1_0_7_3 + 0.000685029256457951*G0_1_0_7_4 - 0.00674611103182643*G0_1_0_7_5 + 0.00202226345083522*G0_1_0_7_6 - 0.000299700299700353*G0_1_0_7_7 - 0.00102754388468692*G0_1_0_7_8 - 0.000408321836893321*G0_1_0_8_1 + 0.000493950493950576*G0_1_0_8_2 + 0.00128871128871149*G0_1_0_8_3 - 0.000954759526188244*G0_1_0_8_4 + 0.00472384758099121*G0_1_0_8_5 - 0.00287141429998619*G0_1_0_8_6 - 0.00102754388468692*G0_1_0_8_7 - 0.00175538746967353*G0_1_0_8_8 + 0.0130583702012295*G0_1_0_8_9 - 0.00133390419104728*G0_1_0_9_0 - 0.00371628371628434*G0_1_0_9_1 + 0.00399600399600465*G0_1_0_9_2 + 0.0118167546738995*G0_1_0_9_3 - 0.0138461538461562*G0_1_0_9_4 - 0.0054459825888406*G0_1_0_9_5 - 0.00557442557442655*G0_1_0_9_6 + 0.0130583702012295*G0_1_0_9_8 + 0.0267161410018596*G0_1_0_9_9; + A[198] = A[89] - 0.00613425375330242*G0_0_0_0_0 - 0.00455671312814248*G0_0_0_0_1 - 0.0100566805328727*G0_0_0_0_2 - 0.0401934573363214*G0_0_0_0_3 + 0.0134823906252501*G0_0_0_0_4 + 0.0148067805210687*G0_0_0_0_5 - 0.0272387929530834*G0_0_0_0_6 + 0.0111380682809273*G0_0_0_0_7 - 0.0145124716553313*G0_0_0_0_8 - 0.017902097902101*G0_0_0_0_9 - 0.00455671312814248*G0_0_0_1_0 - 0.0591346572299053*G0_0_0_1_1 - 0.00470612280136162*G0_0_0_1_2 - 0.119499548070997*G0_0_0_1_3 + 0.0733133533133658*G0_0_0_1_4 + 0.00154765869051609*G0_0_0_1_5 - 0.0145581402724285*G0_0_0_1_6 + 0.0176991262705578*G0_0_0_1_7 - 0.0352916924345555*G0_0_0_1_8 - 0.0248437277008748*G0_0_0_1_9 - 0.0100566805328727*G0_0_0_2_0 - 0.00470612280136162*G0_0_0_2_1 - 0.0133081733081747*G0_0_0_2_2 - 0.0699643213929049*G0_0_0_2_3 + 0.113379953379973*G0_0_0_2_4 + 0.0421369107083462*G0_0_0_2_5 - 0.107838827838846*G0_0_0_2_6 + 0.00584050869765251*G0_0_0_2_7 - 0.0121529264386428*G0_0_0_2_8 - 0.00243565957851703*G0_0_0_2_9 - 0.0401934573363214*G0_0_0_3_0 - 0.119499548070997*G0_0_0_3_1 - 0.0699643213929049*G0_0_0_3_2 - 1.02809190809208*G0_0_0_3_3 + 0.0617896389325059*G0_0_0_3_4 + 0.0466733266733345*G0_0_0_3_5 + 0.0662651634080313*G0_0_0_3_6 + 0.14317111459971*G0_0_0_3_7 - 0.202220636506385*G0_0_0_3_8 - 0.211811046096797*G0_0_0_3_9 + 0.0134823906252501*G0_0_0_4_0 + 0.0733133533133658*G0_0_0_4_1 + 0.113379953379973*G0_0_0_4_2 + 0.0617896389325058*G0_0_0_4_3 + 0.350186955901303*G0_0_0_4_4 - 0.0178564292850039*G0_0_0_4_5 - 0.0484087341230275*G0_0_0_4_6 - 0.040279720279727*G0_0_0_4_7 + 0.0590495219066746*G0_0_0_4_8 + 0.0430198373055589*G0_0_0_4_9 + 0.0148067805210687*G0_0_0_5_0 + 0.00154765869051609*G0_0_0_5_1 + 0.0421369107083462*G0_0_0_5_2 + 0.0466733266733345*G0_0_0_5_3 - 0.0178564292850039*G0_0_0_5_4 - 0.146504923647805*G0_0_0_5_5 + 0.136960182674492*G0_0_0_5_6 - 0.0230169830169869*G0_0_0_5_7 + 0.0179477665191981*G0_0_0_5_8 + 0.0178107606679064*G0_0_0_5_9 - 0.0272387929530834*G0_0_0_6_0 - 0.0145581402724285*G0_0_0_6_1 - 0.107838827838846*G0_0_0_6_2 + 0.0662651634080313*G0_0_0_6_3 - 0.0484087341230275*G0_0_0_6_4 + 0.136960182674492*G0_0_0_6_5 - 0.709872984158818*G0_0_0_6_6 + 0.00506921649778872*G0_0_0_6_7 + 0.0287712287712335*G0_0_0_6_8 - 0.125223348080512*G0_0_0_6_9 + 0.0111380682809273*G0_0_0_7_0 + 0.0176991262705578*G0_0_0_7_1 + 0.00584050869765251*G0_0_0_7_2 + 0.14317111459971*G0_0_0_7_3 - 0.040279720279727*G0_0_0_7_4 - 0.0230169830169869*G0_0_0_7_5 + 0.00506921649778872*G0_0_0_7_6 - 0.0418324532610317*G0_0_0_7_7 + 0.0587298415869943*G0_0_0_7_8 + 0.0435678607107251*G0_0_0_7_9 - 0.0145124716553313*G0_0_0_8_0 - 0.0352916924345555*G0_0_0_8_1 - 0.0121529264386428*G0_0_0_8_2 - 0.202220636506385*G0_0_0_8_3 + 0.0590495219066746*G0_0_0_8_4 + 0.0179477665191981*G0_0_0_8_5 + 0.0287712287712335*G0_0_0_8_6 + 0.0587298415869943*G0_0_0_8_7 - 0.0922506065363363*G0_0_0_8_8 - 0.0435678607107252*G0_0_0_8_9 - 0.017902097902101*G0_0_0_9_0 - 0.0248437277008748*G0_0_0_9_1 - 0.00243565957851702*G0_0_0_9_2 - 0.211811046096797*G0_0_0_9_3 + 0.043019837305559*G0_0_0_9_4 + 0.0178107606679064*G0_0_0_9_5 - 0.125223348080512*G0_0_0_9_6 + 0.0435678607107251*G0_0_0_9_7 - 0.0435678607107252*G0_0_0_9_8 - 0.29922077922083*G0_0_0_9_9 - 0.00695431552574531*G0_0_1_0_1 + 0.0069543155257453*G0_0_1_0_2 - 0.0348451548451608*G0_0_1_0_3 + 0.0348451548451609*G0_0_1_0_4 - 0.00712684141255694*G0_0_1_0_5 + 0.0158825301682472*G0_0_1_0_6 + 0.00712684141255692*G0_0_1_0_7 - 0.0158825301682472*G0_0_1_0_8 - 0.00695431552574531*G0_0_1_1_0 - 0.130445357112046*G0_0_1_1_1 - 0.186992689849864*G0_0_1_1_3 + 0.110918922347513*G0_0_1_1_4 - 0.00415584415584486*G0_0_1_1_5 + 0.0184272869987187*G0_0_1_1_6 + 0.0369357626500547*G0_0_1_1_7 - 0.0759266130694832*G0_0_1_1_8 - 0.0135179106607702*G0_0_1_1_9 + 0.0069543155257453*G0_0_1_2_0 + 0.130445357112046*G0_0_1_2_2 - 0.110918922347513*G0_0_1_2_3 + 0.186992689849865*G0_0_1_2_4 - 0.0369357626500546*G0_0_1_2_5 + 0.075926613069483*G0_0_1_2_6 + 0.00415584415584485*G0_0_1_2_7 - 0.0184272869987187*G0_0_1_2_8 + 0.0135179106607701*G0_0_1_2_9 - 0.0348451548451608*G0_0_1_3_0 - 0.186992689849865*G0_0_1_3_1 - 0.110918922347513*G0_0_1_3_2 - 0.553503639218019*G0_0_1_3_3 + 0.0585014985015083*G0_0_1_3_5 - 0.0552818609961561*G0_0_1_3_6 + 0.104535464535482*G0_0_1_3_7 - 0.159817325531638*G0_0_1_3_8 - 0.168517197088654*G0_0_1_3_9 + 0.0348451548451609*G0_0_1_4_0 + 0.110918922347513*G0_0_1_4_1 + 0.186992689849865*G0_0_1_4_2 + 0.55350363921802*G0_0_1_4_4 - 0.104535464535482*G0_0_1_4_5 + 0.159817325531638*G0_0_1_4_6 - 0.0585014985015084*G0_0_1_4_7 + 0.0552818609961561*G0_0_1_4_8 + 0.168517197088654*G0_0_1_4_9 - 0.00712684141255694*G0_0_1_5_0 - 0.00415584415584486*G0_0_1_5_1 - 0.0369357626500546*G0_0_1_5_2 + 0.0585014985015083*G0_0_1_5_3 - 0.104535464535482*G0_0_1_5_4 + 0.0254830883402355*G0_0_1_5_5 - 0.0614471243042775*G0_0_1_5_6 + 0.0124675324675346*G0_0_1_5_8 - 0.0249350649350692*G0_0_1_5_9 + 0.0158825301682472*G0_0_1_6_0 + 0.0184272869987187*G0_0_1_6_1 + 0.075926613069483*G0_0_1_6_2 - 0.0552818609961561*G0_0_1_6_3 + 0.159817325531638*G0_0_1_6_4 - 0.0614471243042776*G0_0_1_6_5 + 0.11467389753106*G0_0_1_6_6 - 0.0124675324675345*G0_0_1_6_7 + 0.0700099900100018*G0_0_1_6_9 + 0.00712684141255692*G0_0_1_7_0 + 0.0369357626500547*G0_0_1_7_1 + 0.00415584415584485*G0_0_1_7_2 + 0.104535464535482*G0_0_1_7_3 - 0.0585014985015084*G0_0_1_7_4 - 0.0124675324675345*G0_0_1_7_6 - 0.0254830883402357*G0_0_1_7_7 + 0.0614471243042776*G0_0_1_7_8 + 0.0249350649350691*G0_0_1_7_9 - 0.0158825301682472*G0_0_1_8_0 - 0.0759266130694832*G0_0_1_8_1 - 0.0184272869987187*G0_0_1_8_2 - 0.159817325531638*G0_0_1_8_3 + 0.055281860996156*G0_0_1_8_4 + 0.0124675324675346*G0_0_1_8_5 + 0.0614471243042776*G0_0_1_8_7 - 0.11467389753106*G0_0_1_8_8 - 0.0700099900100019*G0_0_1_8_9 - 0.0135179106607702*G0_0_1_9_1 + 0.0135179106607701*G0_0_1_9_2 - 0.168517197088654*G0_0_1_9_3 + 0.168517197088654*G0_0_1_9_4 - 0.0249350649350692*G0_0_1_9_5 + 0.0700099900100018*G0_0_1_9_6 + 0.0249350649350691*G0_0_1_9_7 - 0.0700099900100019*G0_0_1_9_8 + 0.00021734878877738*G0_1_0_0_1 - 0.000217348788777385*G0_1_0_0_2 - 0.0367936825079746*G0_1_0_0_3 + 0.0367936825079746*G0_1_0_0_4 - 0.00225552225552264*G0_1_0_0_5 + 0.00291264291264341*G0_1_0_0_6 + 0.00225552225552266*G0_1_0_0_7 - 0.00291264291264346*G0_1_0_0_8 + 0.00021734878877738*G0_1_0_1_0 - 0.037509157509164*G0_1_0_1_1 - 0.0926514755086342*G0_1_0_1_3 + 0.0647225790083044*G0_1_0_1_4 - 0.00305979734551217*G0_1_0_1_5 - 0.00044907473478908*G0_1_0_1_6 + 0.00167959025101919*G0_1_0_1_7 - 0.00431822146107953*G0_1_0_1_8 - 0.000974263831406932*G0_1_0_1_9 - 0.000217348788777385*G0_1_0_2_0 + 0.0375091575091639*G0_1_0_2_2 - 0.0647225790083043*G0_1_0_2_3 + 0.0926514755086344*G0_1_0_2_4 - 0.00167959025101911*G0_1_0_2_5 + 0.00431822146107933*G0_1_0_2_6 + 0.00305979734551216*G0_1_0_2_7 + 0.000449074734789063*G0_1_0_2_8 + 0.000974263831406876*G0_1_0_2_9 - 0.0367936825079746*G0_1_0_3_0 - 0.0926514755086342*G0_1_0_3_1 - 0.0647225790083043*G0_1_0_3_2 - 0.912458969601982*G0_1_0_3_3 + 0.0597802197802298*G0_1_0_3_5 + 0.00134722420436723*G0_1_0_3_6 + 0.110381047523923*G0_1_0_3_7 - 0.109033823319556*G0_1_0_3_8 - 0.217839303553626*G0_1_0_3_9 + 0.0367936825079746*G0_1_0_4_0 + 0.0647225790083044*G0_1_0_4_1 + 0.0926514755086344*G0_1_0_4_2 + 0.912458969601983*G0_1_0_4_4 - 0.110381047523923*G0_1_0_4_5 + 0.109033823319556*G0_1_0_4_6 - 0.0597802197802299*G0_1_0_4_7 - 0.00134722420436722*G0_1_0_4_8 + 0.217839303553626*G0_1_0_4_9 - 0.00225552225552264*G0_1_0_5_0 - 0.00305979734551217*G0_1_0_5_1 - 0.00167959025101911*G0_1_0_5_2 + 0.0597802197802298*G0_1_0_5_3 - 0.110381047523923*G0_1_0_5_4 + 0.00319680319680366*G0_1_0_5_5 - 0.00152989867275614*G0_1_0_5_6 + 0.00917939203653644*G0_1_0_5_8 - 0.018358784073073*G0_1_0_5_9 + 0.00291264291264341*G0_1_0_6_0 - 0.000449074734789082*G0_1_0_6_1 + 0.00431822146107934*G0_1_0_6_2 + 0.00134722420436724*G0_1_0_6_3 + 0.109033823319556*G0_1_0_6_4 - 0.00152989867275614*G0_1_0_6_5 - 0.0966804623947651*G0_1_0_6_6 - 0.00917939203653649*G0_1_0_6_7 - 0.00561723990295513*G0_1_0_6_9 + 0.00225552225552266*G0_1_0_7_0 + 0.00167959025101919*G0_1_0_7_1 + 0.00305979734551216*G0_1_0_7_2 + 0.110381047523923*G0_1_0_7_3 - 0.0597802197802299*G0_1_0_7_4 - 0.00917939203653649*G0_1_0_7_6 - 0.00319680319680367*G0_1_0_7_7 + 0.00152989867275627*G0_1_0_7_8 + 0.0183587840730729*G0_1_0_7_9 - 0.00291264291264346*G0_1_0_8_0 - 0.00431822146107953*G0_1_0_8_1 + 0.000449074734789063*G0_1_0_8_2 - 0.109033823319556*G0_1_0_8_3 - 0.00134722420436722*G0_1_0_8_4 + 0.00917939203653644*G0_1_0_8_5 + 0.00152989867275628*G0_1_0_8_7 + 0.0966804623947639*G0_1_0_8_8 + 0.00561723990295501*G0_1_0_8_9 - 0.00097426383140693*G0_1_0_9_1 + 0.000974263831406877*G0_1_0_9_2 - 0.217839303553626*G0_1_0_9_3 + 0.217839303553626*G0_1_0_9_4 - 0.018358784073073*G0_1_0_9_5 - 0.00561723990295515*G0_1_0_9_6 + 0.0183587840730729*G0_1_0_9_7 + 0.00561723990295501*G0_1_0_9_8 + 0.00613425375330243*G0_1_1_0_0 + 0.0100566805328727*G0_1_1_0_1 + 0.00455671312814249*G0_1_1_0_2 - 0.0134823906252501*G0_1_1_0_3 + 0.0401934573363215*G0_1_1_0_4 - 0.0111380682809273*G0_1_1_0_5 + 0.0145124716553313*G0_1_1_0_6 - 0.0148067805210687*G0_1_1_0_7 + 0.0272387929530833*G0_1_1_0_8 + 0.017902097902101*G0_1_1_0_9 + 0.0100566805328727*G0_1_1_1_0 + 0.0133081733081755*G0_1_1_1_1 + 0.00470612280136171*G0_1_1_1_2 - 0.113379953379973*G0_1_1_1_3 + 0.0699643213929048*G0_1_1_1_4 - 0.00584050869765261*G0_1_1_1_5 + 0.0121529264386429*G0_1_1_1_6 - 0.0421369107083463*G0_1_1_1_7 + 0.107838827838846*G0_1_1_1_8 + 0.00243565957851709*G0_1_1_1_9 + 0.00455671312814249*G0_1_1_2_0 + 0.00470612280136171*G0_1_1_2_1 + 0.0591346572299053*G0_1_1_2_2 - 0.0733133533133658*G0_1_1_2_3 + 0.119499548070997*G0_1_1_2_4 - 0.0176991262705578*G0_1_1_2_5 + 0.0352916924345556*G0_1_1_2_6 - 0.00154765869051608*G0_1_1_2_7 + 0.0145581402724283*G0_1_1_2_8 + 0.0248437277008747*G0_1_1_2_9 - 0.0134823906252501*G0_1_1_3_0 - 0.113379953379973*G0_1_1_3_1 - 0.0733133533133658*G0_1_1_3_2 - 0.350186955901301*G0_1_1_3_3 - 0.0617896389325065*G0_1_1_3_4 + 0.0402797202797271*G0_1_1_3_5 - 0.0590495219066747*G0_1_1_3_6 + 0.0178564292850039*G0_1_1_3_7 + 0.0484087341230275*G0_1_1_3_8 - 0.0430198373055591*G0_1_1_3_9 + 0.0401934573363215*G0_1_1_4_0 + 0.0699643213929048*G0_1_1_4_1 + 0.119499548070997*G0_1_1_4_2 - 0.0617896389325065*G0_1_1_4_3 + 1.02809190809208*G0_1_1_4_4 - 0.14317111459971*G0_1_1_4_5 + 0.202220636506385*G0_1_1_4_6 - 0.0466733266733346*G0_1_1_4_7 - 0.0662651634080315*G0_1_1_4_8 + 0.211811046096796*G0_1_1_4_9 - 0.0111380682809273*G0_1_1_5_0 - 0.00584050869765261*G0_1_1_5_1 - 0.0176991262705578*G0_1_1_5_2 + 0.040279720279727*G0_1_1_5_3 - 0.14317111459971*G0_1_1_5_4 + 0.0418324532610317*G0_1_1_5_5 - 0.0587298415869944*G0_1_1_5_6 + 0.0230169830169869*G0_1_1_5_7 - 0.00506921649778887*G0_1_1_5_8 - 0.0435678607107253*G0_1_1_5_9 + 0.0145124716553313*G0_1_1_6_0 + 0.0121529264386429*G0_1_1_6_1 + 0.0352916924345556*G0_1_1_6_2 - 0.0590495219066747*G0_1_1_6_3 + 0.202220636506385*G0_1_1_6_4 - 0.0587298415869944*G0_1_1_6_5 + 0.0922506065363364*G0_1_1_6_6 - 0.0179477665191981*G0_1_1_6_7 - 0.0287712287712334*G0_1_1_6_8 + 0.0435678607107253*G0_1_1_6_9 - 0.0148067805210687*G0_1_1_7_0 - 0.0421369107083463*G0_1_1_7_1 - 0.00154765869051608*G0_1_1_7_2 + 0.0178564292850039*G0_1_1_7_3 - 0.0466733266733346*G0_1_1_7_4 + 0.0230169830169869*G0_1_1_7_5 - 0.0179477665191981*G0_1_1_7_6 + 0.146504923647805*G0_1_1_7_7 - 0.136960182674491*G0_1_1_7_8 - 0.0178107606679065*G0_1_1_7_9 + 0.0272387929530833*G0_1_1_8_0 + 0.107838827838846*G0_1_1_8_1 + 0.0145581402724283*G0_1_1_8_2 + 0.0484087341230275*G0_1_1_8_3 - 0.0662651634080315*G0_1_1_8_4 - 0.00506921649778887*G0_1_1_8_5 - 0.0287712287712334*G0_1_1_8_6 - 0.136960182674491*G0_1_1_8_7 + 0.709872984158817*G0_1_1_8_8 + 0.125223348080512*G0_1_1_8_9 + 0.017902097902101*G0_1_1_9_0 + 0.00243565957851709*G0_1_1_9_1 + 0.0248437277008747*G0_1_1_9_2 - 0.0430198373055591*G0_1_1_9_3 + 0.211811046096796*G0_1_1_9_4 - 0.0435678607107253*G0_1_1_9_5 + 0.0435678607107253*G0_1_1_9_6 - 0.0178107606679066*G0_1_1_9_7 + 0.125223348080512*G0_1_1_9_8 + 0.299220779220829*G0_1_1_9_9; + A[186] = A[198] - 0.0538416081273315*G0_0_0_0_0 - 0.00745244173815728*G0_0_0_0_2 + 0.0387422101707882*G0_0_0_0_3 - 0.00694162979877385*G0_0_0_0_4 - 0.118976896119773*G0_0_0_0_5 + 0.0510016967159911*G0_0_0_0_6 - 0.0457498057498133*G0_0_0_0_7 + 0.0320847406561746*G0_0_0_0_8 - 0.00861614575900435*G0_0_0_0_9 + 0.0538416081273315*G0_0_0_1_1 + 0.00745244173815726*G0_0_0_1_2 + 0.118976896119773*G0_0_0_1_3 - 0.051001696715991*G0_0_0_1_4 - 0.0387422101707881*G0_0_0_1_5 + 0.00694162979877381*G0_0_0_1_6 - 0.0320847406561746*G0_0_0_1_7 + 0.0457498057498135*G0_0_0_1_8 + 0.00861614575900442*G0_0_0_1_9 - 0.00745244173815728*G0_0_0_2_0 + 0.00745244173815727*G0_0_0_2_1 + 0.045323565323573*G0_0_0_2_3 - 0.0279897879897928*G0_0_0_2_4 - 0.045323565323573*G0_0_0_2_5 + 0.0279897879897927*G0_0_0_2_6 - 0.0184196755625358*G0_0_0_2_7 + 0.0184196755625358*G0_0_0_2_8 + 0.0387422101707882*G0_0_0_3_0 + 0.118976896119773*G0_0_0_3_1 + 0.045323565323573*G0_0_0_3_2 + 0.936571999429302*G0_0_0_3_3 - 0.167147138575738*G0_0_0_3_4 - 0.0208248893963214*G0_0_0_3_6 - 0.116226630512364*G0_0_0_3_7 + 0.171485657199972*G0_0_0_3_8 + 0.206604823747716*G0_0_0_3_9 - 0.00694162979877385*G0_0_0_4_0 - 0.051001696715991*G0_0_0_4_1 - 0.0279897879897928*G0_0_0_4_2 - 0.167147138575738*G0_0_0_4_3 - 0.0690509490509614*G0_0_0_4_4 + 0.0208248893963215*G0_0_0_4_5 + 0.0380419580419644*G0_0_0_4_7 - 0.0552590266876074*G0_0_0_4_8 - 0.0416497787926429*G0_0_0_4_9 - 0.118976896119773*G0_0_0_5_0 - 0.0387422101707881*G0_0_0_5_1 - 0.045323565323573*G0_0_0_5_2 + 0.0208248893963215*G0_0_0_5_4 - 0.936571999429301*G0_0_0_5_5 + 0.167147138575738*G0_0_0_5_6 - 0.171485657199972*G0_0_0_5_7 + 0.116226630512364*G0_0_0_5_8 - 0.206604823747716*G0_0_0_5_9 + 0.0510016967159911*G0_0_0_6_0 + 0.00694162979877381*G0_0_0_6_1 + 0.0279897879897927*G0_0_0_6_2 - 0.0208248893963214*G0_0_0_6_3 + 0.167147138575738*G0_0_0_6_5 + 0.0690509490509607*G0_0_0_6_6 + 0.0552590266876073*G0_0_0_6_7 - 0.0380419580419644*G0_0_0_6_8 + 0.0416497787926429*G0_0_0_6_9 - 0.0457498057498133*G0_0_0_7_0 - 0.0320847406561746*G0_0_0_7_1 - 0.0184196755625358*G0_0_0_7_2 - 0.116226630512364*G0_0_0_7_3 + 0.0380419580419644*G0_0_0_7_4 - 0.171485657199972*G0_0_0_7_5 + 0.0552590266876073*G0_0_0_7_6 - 0.0430198373055587*G0_0_0_7_7 - 0.0846696160982018*G0_0_0_7_9 + 0.0320847406561746*G0_0_0_8_0 + 0.0457498057498135*G0_0_0_8_1 + 0.0184196755625358*G0_0_0_8_2 + 0.171485657199972*G0_0_0_8_3 - 0.0552590266876074*G0_0_0_8_4 + 0.116226630512364*G0_0_0_8_5 - 0.0380419580419644*G0_0_0_8_6 + 0.0430198373055587*G0_0_0_8_8 + 0.0846696160982018*G0_0_0_8_9 - 0.00861614575900435*G0_0_0_9_0 + 0.00861614575900442*G0_0_0_9_1 + 0.206604823747716*G0_0_0_9_3 - 0.0416497787926429*G0_0_0_9_4 - 0.206604823747716*G0_0_0_9_5 + 0.0416497787926429*G0_0_0_9_6 - 0.0846696160982018*G0_0_0_9_7 + 0.0846696160982018*G0_0_0_9_8 + 0.0762947810566986*G0_0_1_0_0 + 0.0134440515392919*G0_0_1_0_1 + 0.00634032634032741*G0_0_1_0_2 + 0.0220274963132144*G0_0_1_0_3 - 0.0166614338042938*G0_0_1_0_4 + 0.0583771783771882*G0_0_1_0_5 - 0.0242754071325541*G0_0_1_0_6 + 0.0315189572332481*G0_0_1_0_7 - 0.00590647447790395*G0_0_1_0_8 + 0.00599781171209845*G0_0_1_0_9 + 0.0134440515392919*G0_0_1_1_0 + 0.13013638918403*G0_0_1_1_1 + 0.0137927680784847*G0_0_1_1_2 + 0.177354074496962*G0_0_1_1_3 - 0.0752771038485451*G0_0_1_1_4 - 0.0167147138575738*G0_0_1_1_5 - 0.00971980400551993*G0_0_1_1_6 - 0.0379912151340788*G0_0_1_1_7 + 0.0772687629830619*G0_0_1_1_8 + 0.0146139574711029*G0_0_1_1_9 + 0.00634032634032741*G0_0_1_2_0 + 0.0137927680784847*G0_0_1_2_1 - 0.00748288748288884*G0_0_1_2_2 + 0.0469168926311863*G0_0_1_2_3 - 0.0283449883449932*G0_0_1_2_4 + 0.00159332730761329*G0_0_1_2_5 - 0.000355200355200446*G0_0_1_2_6 - 0.00509205080633739*G0_0_1_2_7 + 0.0133276247561984*G0_0_1_2_8 + 0.0165624851339165*G0_0_1_2_9 + 0.0220274963132144*G0_0_1_3_0 + 0.177354074496962*G0_0_1_3_1 + 0.0469168926311863*G0_0_1_3_2 + 0.506875981161782*G0_0_1_3_3 - 0.165069216497816*G0_0_1_3_4 + 0.00132438989581863*G0_0_1_3_5 + 0.0105722848580009*G0_0_1_3_6 - 0.0846696160982019*G0_0_1_3_7 + 0.143239617525356*G0_0_1_3_8 + 0.125497359783095*G0_0_1_3_9 - 0.0166614338042938*G0_0_1_4_0 - 0.0752771038485452*G0_0_1_4_1 - 0.0283449883449932*G0_0_1_4_2 - 0.165069216497816*G0_0_1_4_3 - 0.145682888540056*G0_0_1_4_4 + 0.0313971742543224*G0_0_1_4_5 - 0.0419694591123233*G0_0_1_4_6 + 0.0419237904952262*G0_0_1_4_7 - 0.0585700014271542*G0_0_1_4_8 - 0.112481803910394*G0_0_1_4_9 + 0.0583771783771882*G0_0_1_5_0 - 0.0167147138575738*G0_0_1_5_1 + 0.00159332730761329*G0_0_1_5_2 + 0.00132438989581863*G0_0_1_5_3 + 0.0313971742543224*G0_0_1_5_4 - 0.429696018267519*G0_0_1_5_5 + 0.00207792207792232*G0_0_1_5_6 - 0.0282460396746159*G0_0_1_5_7 + 0.0315570144141626*G0_0_1_5_8 - 0.0811074639646206*G0_0_1_5_9 - 0.0242754071325541*G0_0_1_6_0 - 0.00971980400551993*G0_0_1_6_1 - 0.000355200355200446*G0_0_1_6_2 + 0.0105722848580009*G0_0_1_6_3 - 0.0419694591123233*G0_0_1_6_4 + 0.00207792207792233*G0_0_1_6_5 - 0.0766319394890952*G0_0_1_6_6 - 0.00331097473954669*G0_0_1_6_7 + 0.00388183245326165*G0_0_1_6_8 - 0.0708320251177513*G0_0_1_6_9 + 0.0315189572332481*G0_0_1_7_0 - 0.0379912151340788*G0_0_1_7_1 - 0.00509205080633739*G0_0_1_7_2 - 0.0846696160982019*G0_0_1_7_3 + 0.0419237904952262*G0_0_1_7_4 - 0.0282460396746159*G0_0_1_7_5 - 0.00331097473954669*G0_0_1_7_6 + 0.0673155416012672*G0_0_1_7_7 - 0.0624289995718672*G0_0_1_7_8 - 0.0113714856572019*G0_0_1_7_9 - 0.00590647447790395*G0_0_1_8_0 + 0.0772687629830619*G0_0_1_8_1 + 0.0133276247561984*G0_0_1_8_2 + 0.143239617525356*G0_0_1_8_3 - 0.0585700014271542*G0_0_1_8_4 + 0.0315570144141626*G0_0_1_8_5 + 0.00388183245326165*G0_0_1_8_6 - 0.0624289995718672*G0_0_1_8_7 + 0.110335378906826*G0_0_1_8_8 + 0.073298130441*G0_0_1_8_9 + 0.00599781171209845*G0_0_1_9_0 + 0.0146139574711029*G0_0_1_9_1 + 0.0165624851339165*G0_0_1_9_2 + 0.125497359783095*G0_0_1_9_3 - 0.112481803910394*G0_0_1_9_4 - 0.0811074639646206*G0_0_1_9_5 - 0.0708320251177513*G0_0_1_9_6 - 0.0113714856572019*G0_0_1_9_7 + 0.073298130441*G0_0_1_9_8 - 0.143034108748418*G0_0_1_9_9 - 0.0238390181247363*G0_1_0_0_0 - 0.00434359291502219*G0_1_0_0_1 - 0.00328306614020954*G0_1_0_0_2 + 0.0345863660149434*G0_1_0_0_3 - 0.00855525426954148*G0_1_0_0_4 - 0.0348553034267377*G0_1_0_0_5 + 0.00938236366807947*G0_1_0_0_6 - 0.0394373880088231*G0_1_0_0_7 + 0.0193990136847312*G0_1_0_0_8 - 0.0109300223585956*G0_1_0_0_9 - 0.00434359291502219*G0_1_0_1_0 + 0.0300025900025951*G0_1_0_1_1 + 0.00416937559794773*G0_1_0_1_2 + 0.0841215926930356*G0_1_0_1_3 - 0.0416193330479116*G0_1_0_1_4 - 0.00415584415584484*G0_1_0_1_5 - 0.00161362447076763*G0_1_0_1_6 - 0.0126857269714434*G0_1_0_1_7 + 0.00631241774099034*G0_1_0_1_8 - 0.00231387659959121*G0_1_0_1_9 - 0.00328306614020953*G0_1_0_2_0 + 0.00416937559794773*G0_1_0_2_1 - 0.0208384208384243*G0_1_0_2_2 + 0.0365044479330255*G0_1_0_2_3 - 0.028984348984354*G0_1_0_2_4 - 0.00881911739054746*G0_1_0_2_5 - 0.000994560994561094*G0_1_0_2_6 - 0.0168517197088654*G0_1_0_2_7 + 0.00156795585367042*G0_1_0_2_8 - 0.00310546596260933*G0_1_0_2_9 + 0.0345863660149434*G0_1_0_3_0 + 0.0841215926930356*G0_1_0_3_1 + 0.0365044479330255*G0_1_0_3_2 + 0.876700442414877*G0_1_0_3_3 - 0.0982331953760689*G0_1_0_3_4 - 0.0497331240188466*G0_1_0_3_5 + 0.0130155558727009*G0_1_0_3_6 - 0.0955844155844318*G0_1_0_3_7 + 0.0921136006850451*G0_1_0_3_8 + 0.198110460967638*G0_1_0_3_9 - 0.00855525426954148*G0_1_0_4_0 - 0.0416193330479116*G0_1_0_4_1 - 0.028984348984354*G0_1_0_4_2 - 0.0982331953760689*G0_1_0_4_3 - 0.151665477379789*G0_1_0_4_4 + 0.0338404452690224*G0_1_0_4_5 - 0.0468560011417234*G0_1_0_4_6 + 0.0340231197374112*G0_1_0_4_7 + 0.00347081489938683*G0_1_0_4_8 - 0.0583644926502168*G0_1_0_4_9 - 0.0348553034267377*G0_1_0_5_0 - 0.00415584415584484*G0_1_0_5_1 - 0.00881911739054745*G0_1_0_5_2 - 0.0497331240188466*G0_1_0_5_3 + 0.0338404452690224*G0_1_0_5_4 - 0.0598715570144242*G0_1_0_5_5 + 0.0689139431996689*G0_1_0_5_6 - 0.0793720565149268*G0_1_0_5_7 + 0.0206422149279327*G0_1_0_5_8 - 0.00849436278007849*G0_1_0_5_9 + 0.00938236366807948*G0_1_0_6_0 - 0.00161362447076763*G0_1_0_6_1 - 0.000994560994561093*G0_1_0_6_2 + 0.0130155558727009*G0_1_0_6_3 - 0.0468560011417234*G0_1_0_6_4 + 0.0689139431996689*G0_1_0_6_5 - 0.0826145283288276*G0_1_0_6_6 + 0.0587298415869942*G0_1_0_6_7 - 0.00401883830455328*G0_1_0_6_8 - 0.0167147138575738*G0_1_0_6_9 - 0.0394373880088231*G0_1_0_7_0 - 0.0126857269714434*G0_1_0_7_1 - 0.0168517197088654*G0_1_0_7_2 - 0.0955844155844318*G0_1_0_7_3 + 0.0340231197374112*G0_1_0_7_4 - 0.0793720565149268*G0_1_0_7_5 + 0.0587298415869942*G0_1_0_7_6 - 0.187743684886573*G0_1_0_7_7 + 0.0606479235050763*G0_1_0_7_8 - 0.0846696160982017*G0_1_0_7_9 + 0.0193990136847312*G0_1_0_8_0 + 0.00631241774099034*G0_1_0_8_1 + 0.00156795585367042*G0_1_0_8_2 + 0.0921136006850451*G0_1_0_8_3 + 0.00347081489938683*G0_1_0_8_4 + 0.0206422149279327*G0_1_0_8_5 - 0.00401883830455328*G0_1_0_8_6 + 0.0606479235050763*G0_1_0_8_7 - 0.144723847581014*G0_1_0_8_8 - 0.0109300223585956*G0_1_0_9_0 - 0.00231387659959121*G0_1_0_9_1 - 0.00310546596260933*G0_1_0_9_2 + 0.198110460967638*G0_1_0_9_3 - 0.0583644926502168*G0_1_0_9_4 - 0.00849436278007849*G0_1_0_9_5 - 0.0167147138575738*G0_1_0_9_6 - 0.0846696160982017*G0_1_0_9_7 - 0.129881547024426*G0_1_0_9_9 + 0.107126171888095*G0_1_1_0_0 + 0.00455022931213486*G0_1_1_0_1 + 0.0053934072981701*G0_1_1_0_2 + 0.00786261357690063*G0_1_1_0_3 - 0.0107473478902069*G0_1_1_0_4 + 0.0423068994497637*G0_1_1_0_5 - 0.0279999365713698*G0_1_1_0_6 + 0.143919572491025*G0_1_1_0_7 - 0.0789965589965724*G0_1_1_0_8 - 0.00286190000475758*G0_1_1_0_9 + 0.00455022931213486*G0_1_1_1_0 - 0.000828800828800818*G0_1_1_1_1 + 0.00511629464010503*G0_1_1_1_2 + 0.10019187162046*G0_1_1_1_3 - 0.0378948036090958*G0_1_1_1_4 + 0.0100090385804689*G0_1_1_1_5 - 0.00752771038485456*G0_1_1_1_6 + 0.0604043575472248*G0_1_1_1_7 - 0.106088197516787*G0_1_1_1_8 + 0.00654583511726488*G0_1_1_1_9 + 0.0053934072981701*G0_1_1_2_0 + 0.00511629464010503*G0_1_1_2_1 - 0.0141606541606566*G0_1_1_2_2 + 0.0336070278927479*G0_1_1_2_3 - 0.0242018299161198*G0_1_1_2_4 + 0.00449074734789096*G0_1_1_2_5 - 0.00513771942343459*G0_1_1_2_6 + 0.0126349840635576*G0_1_1_2_7 - 0.0161590790162245*G0_1_1_2_8 + 0.00672850958565361*G0_1_1_2_9 + 0.00786261357690063*G0_1_1_3_0 + 0.10019187162046*G0_1_1_3_1 + 0.0336070278927479*G0_1_1_3_2 + 0.389918652775862*G0_1_1_3_3 - 0.102000856286588*G0_1_1_3_4 - 0.0242043670615139*G0_1_1_3_5 + 0.0173769088054831*G0_1_1_3_6 - 0.0287940630797825*G0_1_1_3_7 - 0.0144769516198107*G0_1_1_3_8 + 0.0379506208077703*G0_1_1_3_9 - 0.0107473478902069*G0_1_1_4_0 - 0.0378948036090958*G0_1_1_4_1 - 0.0242018299161198*G0_1_1_4_2 - 0.102000856286588*G0_1_1_4_3 - 0.190301127444017*G0_1_1_4_4 + 0.0270358213215402*G0_1_1_4_5 - 0.0444127301270234*G0_1_1_4_6 - 0.000228343085485884*G0_1_1_4_7 + 0.0432710146995932*G0_1_1_4_8 - 0.0742571714000412*G0_1_1_4_9 + 0.0423068994497637*G0_1_1_5_0 + 0.0100090385804689*G0_1_1_5_1 + 0.00449074734789096*G0_1_1_5_2 - 0.0242043670615139*G0_1_1_5_3 + 0.0270358213215402*G0_1_1_5_4 + 0.0570857713714949*G0_1_1_5_5 + 0.00584558298844117*G0_1_1_5_6 + 0.0783445126302399*G0_1_1_5_7 - 0.0352333380904867*G0_1_1_5_8 + 0.0790523761952466*G0_1_1_5_9 - 0.0279999365713698*G0_1_1_6_0 - 0.00752771038485455*G0_1_1_6_1 - 0.00513771942343459*G0_1_1_6_2 + 0.0173769088054831*G0_1_1_6_3 - 0.0444127301270234*G0_1_1_6_4 + 0.00584558298844117*G0_1_1_6_5 - 0.0379962894248673*G0_1_1_6_6 - 0.0431111745397531*G0_1_1_6_7 + 0.0381332952761586*G0_1_1_6_8 - 0.0549393463679271*G0_1_1_6_9 + 0.143919572491025*G0_1_1_7_0 + 0.0604043575472248*G0_1_1_7_1 + 0.0126349840635576*G0_1_1_7_2 - 0.0287940630797825*G0_1_1_7_3 - 0.000228343085485881*G0_1_1_7_4 + 0.0783445126302399*G0_1_1_7_5 - 0.0431111745397531*G0_1_1_7_6 + 0.390329670329736*G0_1_1_7_7 - 0.000890538033395463*G0_1_1_7_8 + 0.0948080490937796*G0_1_1_7_9 - 0.0789965589965724*G0_1_1_8_0 - 0.106088197516787*G0_1_1_8_1 - 0.0161590790162245*G0_1_1_8_2 - 0.0144769516198107*G0_1_1_8_3 + 0.0432710146995932*G0_1_1_8_4 - 0.0352333380904867*G0_1_1_8_5 + 0.0381332952761587*G0_1_1_8_6 - 0.000890538033395463*G0_1_1_8_7 - 0.467737976309483*G0_1_1_8_8 - 0.106179534750981*G0_1_1_8_9 - 0.00286190000475758*G0_1_1_9_0 + 0.00654583511726488*G0_1_1_9_1 + 0.00672850958565362*G0_1_1_9_2 + 0.0379506208077703*G0_1_1_9_3 - 0.0742571714000412*G0_1_1_9_4 + 0.0790523761952466*G0_1_1_9_5 - 0.0549393463679271*G0_1_1_9_6 + 0.0948080490937796*G0_1_1_9_7 - 0.106179534750981*G0_1_1_9_8 - 0.136457827886422*G0_1_1_9_9; + A[32] = 0.00212020122734445*G0_1_1_0_0 + 0.000609996815354065*G0_1_1_0_1 + 0.00505480245063665*G0_1_1_0_2 - 0.00139091232841257*G0_1_1_0_3 + 0.0032766423391429*G0_1_1_0_4 - 0.00193059255559289*G0_1_1_0_5 + 0.00494551744551829*G0_1_1_0_6 + 0.000907706711278292*G0_1_1_0_7 - 0.000483709412280919*G0_1_1_0_8 + 0.00107184482184501*G0_1_1_0_9 + 0.000609996815354065*G0_1_1_1_0 + 0.00212020122734446*G0_1_1_1_1 + 0.00505480245063664*G0_1_1_1_2 - 0.00193059255559288*G0_1_1_1_3 + 0.00494551744551828*G0_1_1_1_4 - 0.00139091232841257*G0_1_1_1_5 + 0.0032766423391429*G0_1_1_1_6 - 0.000483709412280929*G0_1_1_1_7 + 0.000907706711278309*G0_1_1_1_8 + 0.00107184482184501*G0_1_1_1_9 + 0.00505480245063665*G0_1_1_2_0 + 0.00505480245063664*G0_1_1_2_1 + 0.106054978971663*G0_1_1_2_2 - 0.0222249972250009*G0_1_1_2_3 + 0.0477428821178901*G0_1_1_2_4 - 0.0222249972250009*G0_1_1_2_5 + 0.0477428821178901*G0_1_1_2_6 - 0.000749886687386808*G0_1_1_2_7 - 0.000749886687386804*G0_1_1_2_8 + 0.00658577533577643*G0_1_1_2_9 - 0.00139091232841257*G0_1_1_3_0 - 0.00193059255559288*G0_1_1_3_1 - 0.0222249972250009*G0_1_1_3_2 + 0.0128475690975713*G0_1_1_3_3 - 0.0240733225108266*G0_1_1_3_4 + 0.00635510323010429*G0_1_1_3_5 - 0.0141946595071619*G0_1_1_3_6 - 0.000191995504495541*G0_1_1_3_7 + 0.00230706793206832*G0_1_1_3_8 - 0.00283154345654393*G0_1_1_3_9 + 0.0032766423391429*G0_1_1_4_0 + 0.00494551744551828*G0_1_1_4_1 + 0.0477428821178901*G0_1_1_4_2 - 0.0240733225108266*G0_1_1_4_3 + 0.0567786380286476*G0_1_1_4_4 - 0.0141946595071619*G0_1_1_4_5 + 0.0283893190143238*G0_1_1_4_6 - 0.0016077672327675*G0_1_1_4_7 - 0.00211507242757278*G0_1_1_4_8 + 0.00863199300699446*G0_1_1_4_9 - 0.00193059255559289*G0_1_1_5_0 - 0.00139091232841257*G0_1_1_5_1 - 0.0222249972250009*G0_1_1_5_2 + 0.00635510323010429*G0_1_1_5_3 - 0.0141946595071619*G0_1_1_5_4 + 0.0128475690975712*G0_1_1_5_5 - 0.0240733225108266*G0_1_1_5_6 + 0.00230706793206831*G0_1_1_5_7 - 0.000191995504495538*G0_1_1_5_8 - 0.00283154345654393*G0_1_1_5_9 + 0.00494551744551829*G0_1_1_6_0 + 0.0032766423391429*G0_1_1_6_1 + 0.0477428821178901*G0_1_1_6_2 - 0.0141946595071619*G0_1_1_6_3 + 0.0283893190143238*G0_1_1_6_4 - 0.0240733225108266*G0_1_1_6_5 + 0.0567786380286476*G0_1_1_6_6 - 0.00211507242757278*G0_1_1_6_7 - 0.0016077672327675*G0_1_1_6_8 + 0.00863199300699445*G0_1_1_6_9 + 0.000907706711278292*G0_1_1_7_0 - 0.000483709412280929*G0_1_1_7_1 - 0.000749886687386808*G0_1_1_7_2 - 0.000191995504495541*G0_1_1_7_3 - 0.0016077672327675*G0_1_1_7_4 + 0.00230706793206831*G0_1_1_7_5 - 0.00211507242757278*G0_1_1_7_6 + 0.00947475143903876*G0_1_1_7_7 - 0.00193593608772214*G0_1_1_7_8 + 0.00101461038961056*G0_1_1_7_9 - 0.000483709412280919*G0_1_1_8_0 + 0.000907706711278308*G0_1_1_8_1 - 0.000749886687386804*G0_1_1_8_2 + 0.00230706793206832*G0_1_1_8_3 - 0.00211507242757278*G0_1_1_8_4 - 0.000191995504495538*G0_1_1_8_5 - 0.0016077672327675*G0_1_1_8_6 - 0.00193593608772214*G0_1_1_8_7 + 0.00947475143903879*G0_1_1_8_8 + 0.00101461038961056*G0_1_1_8_9 + 0.00107184482184501*G0_1_1_9_0 + 0.00107184482184501*G0_1_1_9_1 + 0.00658577533577643*G0_1_1_9_2 - 0.00283154345654393*G0_1_1_9_3 + 0.00863199300699446*G0_1_1_9_4 - 0.00283154345654393*G0_1_1_9_5 + 0.00863199300699445*G0_1_1_9_6 + 0.00101461038961056*G0_1_1_9_7 + 0.00101461038961056*G0_1_1_9_8 + 0.0118756243756264*G0_1_1_9_9; + A[41] = A[32] - 0.00407525455144574*G0_1_0_0_0 + 0.000591824401348319*G0_1_0_0_1 + 0.000140194902099688*G0_1_0_0_2 + 0.000111370111370133*G0_1_0_0_3 - 0.000364661793233285*G0_1_0_0_4 + 0.000477511906083408*G0_1_0_0_5 + 0.000426372569229787*G0_1_0_0_6 + 0.000827690827690953*G0_1_0_0_7 + 0.000730724302153005*G0_1_0_0_8 + 0.00128173413887721*G0_1_0_0_9 + 0.000591824401348319*G0_1_0_1_0 + 0.0170459170459201*G0_1_0_1_1 + 0.00013545537355064*G0_1_0_1_2 + 0.00212343212343253*G0_1_0_1_3 - 0.0015861123003983*G0_1_0_1_4 - 0.00222769294197907*G0_1_0_1_7 + 0.00662670662670783*G0_1_0_1_8 - 0.000466359037787676*G0_1_0_1_9 + 0.000140194902099688*G0_1_0_2_0 + 0.00013545537355064*G0_1_0_2_1 + 0.00062789062789073*G0_1_0_2_3 - 0.00182854182854213*G0_1_0_2_4 - 0.000292670292670344*G0_1_0_2_5 + 0.00182854182854214*G0_1_0_2_6 - 0.000196734482448802*G0_1_0_2_7 - 0.000335220335220396*G0_1_0_2_9 + 0.000111370111370133*G0_1_0_3_0 + 0.00212343212343253*G0_1_0_3_1 + 0.00062789062789073*G0_1_0_3_2 - 0.00768041482327328*G0_1_0_3_3 + 0.00257218971504728*G0_1_0_3_4 - 0.000377717520574723*G0_1_0_3_6 - 0.000574187717044964*G0_1_0_3_7 + 0.000577517720374971*G0_1_0_3_8 + 0.00254745254745296*G0_1_0_3_9 - 0.000364661793233285*G0_1_0_4_0 - 0.0015861123003983*G0_1_0_4_1 - 0.00182854182854213*G0_1_0_4_2 + 0.00257218971504728*G0_1_0_4_3 - 0.00462204462204539*G0_1_0_4_4 + 0.000853907996765285*G0_1_0_4_5 - 0.000476190476190561*G0_1_0_4_6 + 0.000962133104990412*G0_1_0_4_7 - 0.000702154987869381*G0_1_0_4_9 + 0.000477511906083408*G0_1_0_5_0 - 0.000292670292670344*G0_1_0_5_2 + 0.000853907996765286*G0_1_0_5_4 + 0.00549878692735923*G0_1_0_5_5 - 0.00410732125017908*G0_1_0_5_6 - 0.000233575947861706*G0_1_0_5_7 - 0.000116550116550134*G0_1_0_5_8 - 0.00361210218353136*G0_1_0_5_9 + 0.000426372569229787*G0_1_0_6_0 + 0.00182854182854214*G0_1_0_6_2 - 0.000377717520574723*G0_1_0_6_3 - 0.000476190476190561*G0_1_0_6_4 - 0.00410732125017908*G0_1_0_6_5 + 0.0055744255744265*G0_1_0_6_6 + 0.000350126064411839*G0_1_0_6_7 + 0.000169592312449485*G0_1_0_6_8 + 0.00176109604681063*G0_1_0_6_9 + 0.000827690827690953*G0_1_0_7_0 - 0.00222769294197907*G0_1_0_7_1 - 0.000196734482448802*G0_1_0_7_2 - 0.000574187717044964*G0_1_0_7_3 + 0.000962133104990413*G0_1_0_7_4 - 0.000233575947861707*G0_1_0_7_5 + 0.000350126064411839*G0_1_0_7_6 + 0.00713334284762976*G0_1_0_7_7 - 0.00651729223157906*G0_1_0_7_8 - 0.0045454545454553*G0_1_0_7_9 + 0.000730724302153005*G0_1_0_8_0 + 0.00662670662670783*G0_1_0_8_1 + 0.000577517720374972*G0_1_0_8_3 - 0.000116550116550134*G0_1_0_8_5 + 0.000169592312449485*G0_1_0_8_6 - 0.00651729223157906*G0_1_0_8_7 - 0.0201679273107879*G0_1_0_8_8 + 0.00140573712002304*G0_1_0_8_9 + 0.00128173413887721*G0_1_0_9_0 - 0.000466359037787676*G0_1_0_9_1 - 0.000335220335220396*G0_1_0_9_2 + 0.00254745254745296*G0_1_0_9_3 - 0.000702154987869381*G0_1_0_9_4 - 0.00361210218353136*G0_1_0_9_5 + 0.00176109604681063*G0_1_0_9_6 - 0.0045454545454553*G0_1_0_9_7 + 0.00140573712002304*G0_1_0_9_8 + 0.00428143285286216*G0_1_0_9_9 - 0.00171475129808491*G0_1_1_0_0 + 0.000791432443218303*G0_1_1_0_1 - 0.00523191810394281*G0_1_1_0_2 + 0.00114774279952872*G0_1_1_0_3 - 0.00358863193684684*G0_1_1_0_4 + 0.00216231850160459*G0_1_1_0_5 - 0.00531152709724229*G0_1_1_0_6 - 0.00115291124219715*G0_1_1_0_7 + 0.00235028199313955*G0_1_1_0_8 - 0.00147223807938119*G0_1_1_0_9 + 0.000791432443218303*G0_1_1_1_0 + 0.0208333883929159*G0_1_1_1_1 - 0.00476101334732368*G0_1_1_1_2 + 0.00570977633477735*G0_1_1_1_3 - 0.00765207015207147*G0_1_1_1_4 + 0.00134357870965036*G0_1_1_1_5 - 0.0036566591477312*G0_1_1_1_6 - 0.00602940710083674*G0_1_1_1_7 + 0.0148713290677603*G0_1_1_1_8 - 0.000166083916083934*G0_1_1_1_9 - 0.00523191810394281*G0_1_1_2_0 - 0.00476101334732368*G0_1_1_2_1 - 0.108918781835467*G0_1_1_2_2 + 0.0226122026122064*G0_1_1_2_3 - 0.0500823944574029*G0_1_1_2_4 + 0.0230554630554669*G0_1_1_2_5 - 0.0495714239464322*G0_1_1_2_6 + 0.000699223065294603*G0_1_1_2_7 + 0.00143436094328975*G0_1_1_2_8 - 0.00732614607614729*G0_1_1_2_9 + 0.00114774279952872*G0_1_1_3_0 + 0.00570977633477735*G0_1_1_3_1 + 0.0226122026122064*G0_1_1_3_2 - 0.0291246253746303*G0_1_1_3_3 + 0.0298220975453168*G0_1_1_3_4 - 0.00597809928167172*G0_1_1_3_5 + 0.0154522114789998*G0_1_1_3_6 + 0.00103900563722008*G0_1_1_3_7 - 0.00121815684315699*G0_1_1_3_8 - 0.00157975952618835*G0_1_1_3_9 - 0.00358863193684684*G0_1_1_4_0 - 0.00765207015207147*G0_1_1_4_1 - 0.0500823944574029*G0_1_1_4_2 + 0.0298220975453168*G0_1_1_4_3 - 0.0626560939061045*G0_1_1_4_4 + 0.0152481298463467*G0_1_1_4_5 - 0.0307003413253465*G0_1_1_4_6 + 0.00209299628942522*G0_1_1_4_7 + 0.000179151205936915*G0_1_1_4_8 - 0.00851782146425148*G0_1_1_4_9 + 0.00216231850160459*G0_1_1_5_0 + 0.00134357870965036*G0_1_1_5_1 + 0.0230554630554669*G0_1_1_5_2 - 0.00597809928167172*G0_1_1_5_3 + 0.0152481298463467*G0_1_1_5_4 - 0.0144645235716688*G0_1_1_5_5 + 0.025833704985495*G0_1_1_5_6 - 0.00283606274677749*G0_1_1_5_7 + 0.000451497906855109*G0_1_1_5_8 + 0.00351371842443331*G0_1_1_5_9 - 0.00531152709724229*G0_1_1_6_0 - 0.0036566591477312*G0_1_1_6_1 - 0.0495714239464322*G0_1_1_6_2 + 0.0154522114789998*G0_1_1_6_3 - 0.0307003413253465*G0_1_1_6_4 + 0.025833704985495*G0_1_1_6_5 - 0.0595658508158609*G0_1_1_6_6 + 0.00238456483992237*G0_1_1_6_7 + 0.00109233028875904*G0_1_1_6_8 - 0.00892598472955766*G0_1_1_6_9 - 0.00115291124219715*G0_1_1_7_0 - 0.00602940710083674*G0_1_1_7_1 + 0.000699223065294603*G0_1_1_7_2 + 0.00103900563722008*G0_1_1_7_3 + 0.00209299628942522*G0_1_1_7_4 - 0.00283606274677749*G0_1_1_7_5 + 0.00238456483992237*G0_1_1_7_6 - 0.00644302126445088*G0_1_1_7_7 - 0.00825839339232343*G0_1_1_7_8 - 0.000352415441701223*G0_1_1_7_9 + 0.00235028199313955*G0_1_1_8_0 + 0.0148713290677603*G0_1_1_8_1 + 0.00143436094328975*G0_1_1_8_2 - 0.00121815684315699*G0_1_1_8_3 + 0.000179151205936915*G0_1_1_8_4 + 0.000451497906855109*G0_1_1_8_5 + 0.00109233028875904*G0_1_1_8_6 - 0.00825839339232343*G0_1_1_8_7 + 0.0273018053375244*G0_1_1_8_8 + 0.000139949336377971*G0_1_1_8_9 - 0.00147223807938119*G0_1_1_9_0 - 0.000166083916083934*G0_1_1_9_1 - 0.00732614607614729*G0_1_1_9_2 - 0.00157975952618835*G0_1_1_9_3 - 0.00851782146425148*G0_1_1_9_4 + 0.00351371842443331*G0_1_1_9_5 - 0.00892598472955766*G0_1_1_9_6 - 0.000352415441701223*G0_1_1_9_7 + 0.000139949336377971*G0_1_1_9_8 - 0.0140505922648803*G0_1_1_9_9; + A[25] = 0.0168435885102581*G0_0_0_0_0 + 0.00384300884300953*G0_0_0_0_1 + 0.00134550634550658*G0_0_0_0_2 + 0.00276037454608932*G0_0_0_0_3 - 0.00122552051123502*G0_0_0_0_4 + 0.0123289805432684*G0_0_0_0_5 - 0.00560861757290427*G0_0_0_0_6 + 0.00496566925138438*G0_0_0_0_7 - 0.00325057878629362*G0_0_0_0_8 + 0.000501998001998108*G0_0_0_0_9 + 0.00384300884300953*G0_0_0_1_0 + 0.125027133360488*G0_0_0_1_1 + 0.00630628630628737*G0_0_0_1_2 + 0.06616022866024*G0_0_0_1_3 - 0.0287769175269224*G0_0_0_1_4 + 0.00102758352758367*G0_0_0_1_5 - 0.000957930957931112*G0_0_0_1_6 - 0.0123794261294283*G0_0_0_1_7 + 0.0233294483294525*G0_0_0_1_8 + 0.00467615717615802*G0_0_0_1_9 + 0.00134550634550658*G0_0_0_2_0 + 0.00630628630628737*G0_0_0_2_1 + 0.000824677967535265*G0_0_0_2_2 + 0.0080091337234208*G0_0_0_2_3 - 0.00342597878312222*G0_0_0_2_4 + 0.00255062397919584*G0_0_0_2_5 - 0.00200398807541698*G0_0_0_2_6 + 0.00100831707974581*G0_0_0_2_7 + 0.00090223268794714*G0_0_0_2_8 + 0.00253032681604154*G0_0_0_2_9 + 0.00276037454608932*G0_0_0_3_0 + 0.06616022866024*G0_0_0_3_1 + 0.0080091337234208*G0_0_0_3_2 + 0.0972252747252914*G0_0_0_3_3 - 0.0379545454545519*G0_0_0_3_4 - 0.0037548166119601*G0_0_0_3_5 - 0.000980448123305437*G0_0_0_3_6 - 0.0121353646353668*G0_0_0_3_7 + 0.018696303696307*G0_0_0_3_8 + 0.0102422577422596*G0_0_0_3_9 - 0.00122552051123502*G0_0_0_4_0 - 0.0287769175269224*G0_0_0_4_1 - 0.00342597878312222*G0_0_0_4_2 - 0.0379545454545519*G0_0_0_4_3 + 0.0135478806907401*G0_0_0_4_4 - 0.000177679463393778*G0_0_0_4_5 + 0.00115812758669921*G0_0_0_4_6 + 0.0022529256457832*G0_0_0_4_7 - 0.00656093906094023*G0_0_0_4_8 - 0.00723562152133707*G0_0_0_4_9 + 0.0123289805432684*G0_0_0_5_0 + 0.00102758352758367*G0_0_0_5_1 + 0.00255062397919584*G0_0_0_5_2 - 0.0037548166119601*G0_0_0_5_3 - 0.000177679463393778*G0_0_0_5_4 + 0.0506953760525274*G0_0_0_5_5 - 0.0102722277722295*G0_0_0_5_6 + 0.0138161838161861*G0_0_0_5_7 - 0.0069369915798499*G0_0_0_5_8 + 0.0123679891537055*G0_0_0_5_9 - 0.00560861757290426*G0_0_0_6_0 - 0.000957930957931112*G0_0_0_6_1 - 0.00200398807541698*G0_0_0_6_2 - 0.000980448123305438*G0_0_0_6_3 + 0.00115812758669921*G0_0_0_6_4 - 0.0102722277722295*G0_0_0_6_5 + 0.00786499215070777*G0_0_0_6_6 - 0.00687919223633624*G0_0_0_6_7 + 0.00201066790352538*G0_0_0_6_8 - 0.00563008420151373*G0_0_0_6_9 + 0.00496566925138438*G0_0_0_7_0 - 0.0123794261294283*G0_0_0_7_1 + 0.00100831707974581*G0_0_0_7_2 - 0.0121353646353668*G0_0_0_7_3 + 0.0022529256457832*G0_0_0_7_4 + 0.0138161838161861*G0_0_0_7_5 - 0.00687919223633624*G0_0_0_7_6 + 0.0277262023690642*G0_0_0_7_7 - 0.00227272727272772*G0_0_0_7_8 + 0.0122523904666782*G0_0_0_7_9 - 0.00325057878629362*G0_0_0_8_0 + 0.0233294483294525*G0_0_0_8_1 + 0.000902232687947141*G0_0_0_8_2 + 0.018696303696307*G0_0_0_8_3 - 0.00656093906094023*G0_0_0_8_4 - 0.0069369915798499*G0_0_0_8_5 + 0.00201066790352538*G0_0_0_8_6 - 0.00227272727272772*G0_0_0_8_7 - 0.0187337662337692*G0_0_0_8_8 - 0.000906593406593503*G0_0_0_8_9 + 0.000501998001998108*G0_0_0_9_0 + 0.00467615717615802*G0_0_0_9_1 + 0.00253032681604154*G0_0_0_9_2 + 0.0102422577422596*G0_0_0_9_3 - 0.00723562152133707*G0_0_0_9_4 + 0.0123679891537055*G0_0_0_9_5 - 0.00563008420151373*G0_0_0_9_6 + 0.0122523904666782*G0_0_0_9_7 - 0.000906593406593503*G0_0_0_9_8 + 0.0352704438418784*G0_0_0_9_9 - 0.000546983880317294*G0_0_1_0_0 + 0.00480046188379607*G0_0_1_0_1 + 0.000270961401913831*G0_0_1_0_2 + 0.00393675768675838*G0_0_1_0_3 - 0.00165729112157713*G0_0_1_0_4 - 0.000921657707372145*G0_0_1_0_5 + 0.000340235161663788*G0_0_1_0_6 - 0.00153616225044824*G0_0_1_0_7 + 0.000815712065712223*G0_0_1_0_8 + 0.000403049331620834*G0_0_1_0_9 + 0.00480046188379607*G0_0_1_1_0 + 0.139942464942489*G0_0_1_1_1 + 0.0071167875334554*G0_0_1_1_2 + 0.0754273504273633*G0_0_1_1_3 - 0.0327852702852758*G0_0_1_1_4 - 0.00115398490398514*G0_0_1_1_5 - 0.0006511544011545*G0_0_1_1_6 - 0.020886058386062*G0_0_1_1_7 + 0.0372433122433187*G0_0_1_1_8 + 0.00532800532800628*G0_0_1_1_9 + 0.000270961401913831*G0_0_1_2_0 + 0.0071167875334554*G0_0_1_2_1 + 0.000965859537288271*G0_0_1_2_2 + 0.0097090409590426*G0_0_1_2_3 - 0.00396722325293821*G0_0_1_2_4 - 0.000204616811759701*G0_0_1_2_5 - 0.000334784263355752*G0_0_1_2_6 - 0.00113685917257365*G0_0_1_2_7 + 0.00348720723720784*G0_0_1_2_8 + 0.00247906855049755*G0_0_1_2_9 + 0.00393675768675838*G0_0_1_3_0 + 0.0754273504273633*G0_0_1_3_1 + 0.0097090409590426*G0_0_1_3_2 + 0.110864135864155*G0_0_1_3_3 - 0.0454857642357719*G0_0_1_3_4 - 0.00212162837162874*G0_0_1_3_5 - 0.00215159840159877*G0_0_1_3_6 - 0.0159153346653374*G0_0_1_3_7 + 0.0304820179820233*G0_0_1_3_8 + 0.0158466533466561*G0_0_1_3_9 - 0.00165729112157713*G0_0_1_4_0 - 0.0327852702852758*G0_0_1_4_1 - 0.00396722325293821*G0_0_1_4_2 - 0.0454857642357719*G0_0_1_4_3 + 0.0172752247752277*G0_0_1_4_4 + 0.000866811759669051*G0_0_1_4_5 + 0.00128478664192972*G0_0_1_4_6 + 0.00624375624375732*G0_0_1_4_7 - 0.0145666833166858*G0_0_1_4_8 - 0.00917082917083076*G0_0_1_4_9 - 0.000921657707372145*G0_0_1_5_0 - 0.00115398490398514*G0_0_1_5_1 - 0.000204616811759701*G0_0_1_5_2 - 0.00212162837162874*G0_0_1_5_3 + 0.000866811759669051*G0_0_1_5_4 - 0.00274261452832929*G0_0_1_5_5 + 8.04552590266941e-05*G0_0_1_5_6 + 0.00133759098044836*G0_0_1_5_7 - 0.000643106893107013*G0_0_1_5_8 + 7.70657913515203e-05*G0_0_1_5_9 + 0.000340235161663788*G0_0_1_6_0 - 0.0006511544011545*G0_0_1_6_1 - 0.000334784263355752*G0_0_1_6_2 - 0.00215159840159877*G0_0_1_6_3 + 0.00128478664192972*G0_0_1_6_4 + 8.04552590266941e-05*G0_0_1_6_5 - 0.000387826459255136*G0_0_1_6_6 - 0.000694484087341349*G0_0_1_6_7 - 0.00220154845154883*G0_0_1_6_8 - 0.00313400884829511*G0_0_1_6_9 - 0.00153616225044824*G0_0_1_7_0 - 0.020886058386062*G0_0_1_7_1 - 0.00113685917257365*G0_0_1_7_2 - 0.0159153346653374*G0_0_1_7_3 + 0.00624375624375732*G0_0_1_7_4 + 0.00133759098044836*G0_0_1_7_5 - 0.000694484087341349*G0_0_1_7_6 + 0.00972277722277889*G0_0_1_7_7 - 0.000980269730269952*G0_0_1_7_8 + 0.000179820179820203*G0_0_1_7_9 + 0.000815712065712223*G0_0_1_8_0 + 0.0372433122433187*G0_0_1_8_1 + 0.00348720723720784*G0_0_1_8_2 + 0.0304820179820233*G0_0_1_8_3 - 0.0145666833166858*G0_0_1_8_4 - 0.000643106893107013*G0_0_1_8_5 - 0.00220154845154883*G0_0_1_8_6 - 0.000980269730269952*G0_0_1_8_7 + 0.0110639360639381*G0_0_1_8_8 + 0.0131493506493529*G0_0_1_8_9 + 0.000403049331620834*G0_0_1_9_0 + 0.00532800532800628*G0_0_1_9_1 + 0.00247906855049755*G0_0_1_9_2 + 0.0158466533466561*G0_0_1_9_3 - 0.00917082917083076*G0_0_1_9_4 + 7.70657913515199e-05*G0_0_1_9_5 - 0.00313400884829511*G0_0_1_9_6 + 0.000179820179820203*G0_0_1_9_7 + 0.0131493506493529*G0_0_1_9_8 + 0.0220279720279758*G0_0_1_9_9; + A[61] = -0.000141181569753028*G0_0_0_0_0 - 0.000810501227168027*G0_0_0_0_1 + 0.00107454494359275*G0_0_0_0_2 - 0.0025849745492607*G0_0_0_0_3 + 0.00214517625231947*G0_0_0_0_4 - 0.00166920381206124*G0_0_0_0_5 + 0.00275524079095555*G0_0_0_0_6 + 0.00054124446981599*G0_0_0_0_7 - 0.0016999072356218*G0_0_0_0_8 + 5.12582655439897e-05*G0_0_0_0_9 - 0.000810501227168027*G0_0_0_1_0 - 0.0149153315820006*G0_0_0_1_1 - 0.00095745304078653*G0_0_0_1_2 - 0.0139138639138662*G0_0_0_1_3 + 0.00850663225663368*G0_0_0_1_4 - 0.000306776556776607*G0_0_0_1_5 + 0.0021815684315688*G0_0_0_1_6 + 0.00400835275835341*G0_0_0_1_7 - 0.00926712176712326*G0_0_0_1_8 - 0.000651848151848267*G0_0_0_1_9 + 0.00107454494359275*G0_0_0_2_0 - 0.00095745304078653*G0_0_0_2_1 + 0.0173905723905753*G0_0_0_2_2 - 0.00406629085200581*G0_0_0_2_3 + 0.00650183150183259*G0_0_0_2_4 - 0.00594885273456801*G0_0_0_2_5 + 0.0132506382506405*G0_0_0_2_6 + 0.000431770610342112*G0_0_0_2_7 - 0.00117638314066905*G0_0_0_2_8 + 9.89486703772557e-05*G0_0_0_2_9 - 0.0025849745492607*G0_0_0_3_0 - 0.0139138639138662*G0_0_0_3_1 - 0.00406629085200581*G0_0_0_3_2 - 0.0297977022977074*G0_0_0_3_3 - 0.00129245754245775*G0_0_0_3_4 + 0.0042122163550742*G0_0_0_3_5 - 0.00629388468674287*G0_0_0_3_6 + 0.00800574425574561*G0_0_0_3_7 - 0.0117857142857163*G0_0_0_3_8 - 0.0140559440559464*G0_0_0_3_9 + 0.00214517625231947*G0_0_0_4_0 + 0.00850663225663368*G0_0_0_4_1 + 0.00650183150183259*G0_0_0_4_2 - 0.00129245754245775*G0_0_0_4_3 + 0.0180034251462852*G0_0_0_4_4 - 0.00618470814899489*G0_0_0_4_5 + 0.0124785928357378*G0_0_0_4_6 - 0.00399083059797412*G0_0_0_4_7 + 0.00377997002997066*G0_0_0_4_8 + 0.012072570286858*G0_0_0_4_9 - 0.00166920381206124*G0_0_0_5_0 - 0.000306776556776607*G0_0_0_5_1 - 0.00594885273456802*G0_0_0_5_2 + 0.0042122163550742*G0_0_0_5_3 - 0.00618470814899489*G0_0_0_5_4 + 0.00825281860996285*G0_0_0_5_5 - 0.0103526830312562*G0_0_0_5_6 - 0.000126659055230504*G0_0_0_5_7 + 0.00117115027829333*G0_0_0_5_8 - 0.00249607535321863*G0_0_0_5_9 + 0.00275524079095555*G0_0_0_6_0 + 0.0021815684315688*G0_0_0_6_1 + 0.0132506382506405*G0_0_0_6_2 - 0.00629388468674287*G0_0_0_6_3 + 0.0124785928357378*G0_0_0_6_4 - 0.0103526830312562*G0_0_0_6_5 + 0.0534379905808567*G0_0_0_6_6 - 0.00104449122306282*G0_0_0_6_7 - 0.00163318824033137*G0_0_0_6_8 + 0.012290923362354*G0_0_0_6_9 + 0.00054124446981599*G0_0_0_7_0 + 0.00400835275835341*G0_0_0_7_1 + 0.000431770610342112*G0_0_0_7_2 + 0.00800574425574561*G0_0_0_7_3 - 0.00399083059797412*G0_0_0_7_4 - 0.000126659055230504*G0_0_0_7_5 - 0.00104449122306282*G0_0_0_7_6 - 0.00372734408448753*G0_0_0_7_7 + 0.00753121878122*G0_0_0_7_8 + 0.00193520764949369*G0_0_0_7_9 - 0.0016999072356218*G0_0_0_8_0 - 0.00926712176712326*G0_0_0_8_1 - 0.00117638314066905*G0_0_0_8_2 - 0.0117857142857163*G0_0_0_8_3 + 0.00377997002997065*G0_0_0_8_4 + 0.00117115027829333*G0_0_0_8_5 - 0.00163318824033137*G0_0_0_8_6 + 0.00753121878122*G0_0_0_8_7 - 0.0136388611388633*G0_0_0_8_8 - 0.00560439560439653*G0_0_0_8_9 + 5.12582655439898e-05*G0_0_0_9_0 - 0.000651848151848267*G0_0_0_9_1 + 9.89486703772558e-05*G0_0_0_9_2 - 0.0140559440559464*G0_0_0_9_3 + 0.012072570286858*G0_0_0_9_4 - 0.00249607535321863*G0_0_0_9_5 + 0.012290923362354*G0_0_0_9_6 + 0.00193520764949369*G0_0_0_9_7 - 0.00560439560439653*G0_0_0_9_8 + 0.0132424718139026*G0_0_0_9_9 - 0.000965859537288285*G0_1_0_0_0 - 0.00711678753345545*G0_1_0_0_1 - 0.000270961401913829*G0_1_0_0_2 - 0.00348720723720784*G0_1_0_0_3 + 0.00113685917257365*G0_1_0_0_4 + 0.000334784263355753*G0_1_0_0_5 + 0.000204616811759701*G0_1_0_0_6 + 0.00396722325293823*G0_1_0_0_7 - 0.00970904095904264*G0_1_0_0_8 - 0.00247906855049755*G0_1_0_0_9 - 0.00711678753345545*G0_1_0_1_0 - 0.139942464942489*G0_1_0_1_1 - 0.00480046188379603*G0_1_0_1_2 - 0.0372433122433187*G0_1_0_1_3 + 0.020886058386062*G0_1_0_1_4 + 0.000651154401154568*G0_1_0_1_5 + 0.00115398490398507*G0_1_0_1_6 + 0.0327852702852759*G0_1_0_1_7 - 0.0754273504273634*G0_1_0_1_8 - 0.00532800532800627*G0_1_0_1_9 - 0.000270961401913829*G0_1_0_2_0 - 0.00480046188379603*G0_1_0_2_1 + 0.000546983880317293*G0_1_0_2_2 - 0.000815712065712203*G0_1_0_2_3 + 0.00153616225044823*G0_1_0_2_4 - 0.000340235161663788*G0_1_0_2_5 + 0.000921657707372143*G0_1_0_2_6 + 0.00165729112157712*G0_1_0_2_7 - 0.00393675768675835*G0_1_0_2_8 - 0.000403049331620827*G0_1_0_2_9 - 0.00348720723720784*G0_1_0_3_0 - 0.0372433122433187*G0_1_0_3_1 - 0.000815712065712203*G0_1_0_3_2 - 0.011063936063938*G0_1_0_3_3 + 0.000980269730269882*G0_1_0_3_4 + 0.00220154845154884*G0_1_0_3_5 + 0.000643106893106989*G0_1_0_3_6 + 0.0145666833166858*G0_1_0_3_7 - 0.0304820179820232*G0_1_0_3_8 - 0.0131493506493529*G0_1_0_3_9 + 0.00113685917257365*G0_1_0_4_0 + 0.020886058386062*G0_1_0_4_1 + 0.00153616225044823*G0_1_0_4_2 + 0.000980269730269882*G0_1_0_4_3 - 0.00972277722277888*G0_1_0_4_4 + 0.000694484087341338*G0_1_0_4_5 - 0.00133759098044834*G0_1_0_4_6 - 0.00624375624375731*G0_1_0_4_7 + 0.0159153346653374*G0_1_0_4_8 - 0.000179820179820211*G0_1_0_4_9 + 0.000334784263355753*G0_1_0_5_0 + 0.000651154401154568*G0_1_0_5_1 - 0.000340235161663788*G0_1_0_5_2 + 0.00220154845154884*G0_1_0_5_3 + 0.000694484087341338*G0_1_0_5_4 + 0.000387826459255132*G0_1_0_5_5 - 8.04552590266982e-05*G0_1_0_5_6 - 0.00128478664192973*G0_1_0_5_7 + 0.00215159840159881*G0_1_0_5_8 + 0.00313400884829509*G0_1_0_5_9 + 0.000204616811759701*G0_1_0_6_0 + 0.00115398490398507*G0_1_0_6_1 + 0.000921657707372143*G0_1_0_6_2 + 0.000643106893106989*G0_1_0_6_3 - 0.00133759098044834*G0_1_0_6_4 - 8.04552590266983e-05*G0_1_0_6_5 + 0.0027426145283293*G0_1_0_6_6 - 0.000866811759669037*G0_1_0_6_7 + 0.0021216283716287*G0_1_0_6_8 - 7.70657913515176e-05*G0_1_0_6_9 + 0.00396722325293823*G0_1_0_7_0 + 0.0327852702852759*G0_1_0_7_1 + 0.00165729112157712*G0_1_0_7_2 + 0.0145666833166858*G0_1_0_7_3 - 0.00624375624375731*G0_1_0_7_4 - 0.00128478664192973*G0_1_0_7_5 - 0.000866811759669037*G0_1_0_7_6 - 0.0172752247752277*G0_1_0_7_7 + 0.045485764235772*G0_1_0_7_8 + 0.00917082917083073*G0_1_0_7_9 - 0.00970904095904264*G0_1_0_8_0 - 0.0754273504273634*G0_1_0_8_1 - 0.00393675768675835*G0_1_0_8_2 - 0.0304820179820232*G0_1_0_8_3 + 0.0159153346653374*G0_1_0_8_4 + 0.00215159840159881*G0_1_0_8_5 + 0.0021216283716287*G0_1_0_8_6 + 0.045485764235772*G0_1_0_8_7 - 0.110864135864155*G0_1_0_8_8 - 0.015846653346656*G0_1_0_8_9 - 0.00247906855049755*G0_1_0_9_0 - 0.00532800532800627*G0_1_0_9_1 - 0.000403049331620827*G0_1_0_9_2 - 0.0131493506493529*G0_1_0_9_3 - 0.000179820179820211*G0_1_0_9_4 + 0.00313400884829509*G0_1_0_9_5 - 7.70657913515175e-05*G0_1_0_9_6 + 0.00917082917083073*G0_1_0_9_7 - 0.015846653346656*G0_1_0_9_8 - 0.0220279720279758*G0_1_0_9_9; + A[159] = A[97] - 0.229582762916136*G0_0_0_0_0 - 0.0078652564366864*G0_0_0_0_1 - 0.00890168033025331*G0_0_0_0_2 - 0.0103613846471007*G0_0_0_0_3 + 0.0109963052820215*G0_0_0_0_4 - 0.112434232434252*G0_0_0_0_5 + 0.0627239427239536*G0_0_0_0_6 - 0.046873126873135*G0_0_0_0_7 + 0.0169030969030999*G0_0_0_0_8 + 0.00229104229104251*G0_0_0_0_9 - 0.0078652564366864*G0_0_0_1_0 - 0.0854258263782219*G0_0_0_1_1 - 0.0664097806955063*G0_0_0_1_3 + 0.0398135198135266*G0_0_0_1_4 - 0.0141499770071222*G0_0_0_1_5 + 0.0112588998303303*G0_0_0_1_6 + 0.00393067250210179*G0_0_0_1_7 - 0.0239690468261938*G0_0_0_1_8 - 0.00224537367394551*G0_0_0_1_9 - 0.00890168033025331*G0_0_0_2_0 + 0.0898229812515675*G0_0_0_2_2 - 0.0414068471211398*G0_0_0_2_3 + 0.0746732632447044*G0_0_0_2_4 - 0.026001300287019*G0_0_0_2_5 + 0.0396073767502405*G0_0_0_2_6 - 0.0105193219478951*G0_0_0_2_7 - 0.00747855319284014*G0_0_0_2_8 - 0.0111126968269844*G0_0_0_2_9 - 0.0103613846471007*G0_0_0_3_0 - 0.0664097806955063*G0_0_0_3_1 - 0.0414068471211398*G0_0_0_3_2 - 0.177262737262767*G0_0_0_3_3 - 0.00303410874839493*G0_0_0_3_4 + 0.0340002854288625*G0_0_0_3_5 - 0.0282431853860473*G0_0_0_3_6 + 0.0366176680462457*G0_0_0_3_7 - 0.0645868417297098*G0_0_0_3_8 - 0.0664992150706549*G0_0_0_3_9 + 0.0109963052820215*G0_0_0_4_0 + 0.0398135198135266*G0_0_0_4_1 + 0.0746732632447044*G0_0_0_4_2 - 0.00303410874839494*G0_0_0_4_3 + 0.196831739688916*G0_0_0_4_4 - 0.0274554017411207*G0_0_0_4_5 + 0.055698587127168*G0_0_0_4_6 - 0.00348223205366125*G0_0_0_4_7 + 0.0279691736834641*G0_0_0_4_8 + 0.0882488939631946*G0_0_0_4_9 - 0.112434232434252*G0_0_0_5_0 - 0.0141499770071222*G0_0_0_5_1 - 0.026001300287019*G0_0_0_5_2 + 0.0340002854288625*G0_0_0_5_3 - 0.0274554017411207*G0_0_0_5_4 - 0.320719280719336*G0_0_0_5_5 + 0.0089424860853449*G0_0_0_5_6 - 0.0850749250749394*G0_0_0_5_7 + 0.0479834451263104*G0_0_0_5_8 - 0.102840017125749*G0_0_0_5_9 + 0.0627239427239536*G0_0_0_6_0 + 0.0112588998303303*G0_0_0_6_1 + 0.0396073767502405*G0_0_0_6_2 - 0.0282431853860473*G0_0_0_6_3 + 0.055698587127168*G0_0_0_6_4 + 0.0089424860853449*G0_0_0_6_5 + 0.0975938347367085*G0_0_0_6_6 + 0.037091479948629*G0_0_0_6_7 - 0.00843727700870705*G0_0_0_6_8 + 0.0898244612530478*G0_0_0_6_9 - 0.046873126873135*G0_0_0_7_0 + 0.00393067250210179*G0_0_0_7_1 - 0.0105193219478951*G0_0_0_7_2 + 0.0366176680462457*G0_0_0_7_3 - 0.00348223205366125*G0_0_0_7_4 - 0.0850749250749394*G0_0_0_7_5 + 0.037091479948629*G0_0_0_7_6 - 0.281558441558489*G0_0_0_7_7 + 0.0762922791494349*G0_0_0_7_8 - 0.081056086770386*G0_0_0_7_9 + 0.0169030969030999*G0_0_0_8_0 - 0.0239690468261938*G0_0_0_8_1 - 0.00747855319284014*G0_0_0_8_2 - 0.0645868417297098*G0_0_0_8_3 + 0.0279691736834641*G0_0_0_8_4 + 0.0479834451263104*G0_0_0_8_5 - 0.00843727700870705*G0_0_0_8_6 + 0.0762922791494349*G0_0_0_8_7 - 0.166816041101784*G0_0_0_8_8 - 0.0492022263450918*G0_0_0_8_9 + 0.00229104229104251*G0_0_0_9_0 - 0.00224537367394551*G0_0_0_9_1 - 0.0111126968269844*G0_0_0_9_2 - 0.0664992150706549*G0_0_0_9_3 + 0.0882488939631945*G0_0_0_9_4 - 0.102840017125749*G0_0_0_9_5 + 0.0898244612530478*G0_0_0_9_6 - 0.081056086770386*G0_0_0_9_7 - 0.0492022263450918*G0_0_0_9_8 - 0.120222634508369*G0_0_0_9_9 - 0.00438355295498227*G0_0_1_0_1 + 0.00438355295498229*G0_0_1_0_2 - 0.00995956424528025*G0_0_1_0_3 + 0.00995956424528025*G0_0_1_0_4 + 0.0276479076479124*G0_0_1_0_5 - 0.00217560217560255*G0_0_1_0_6 - 0.0276479076479121*G0_0_1_0_7 + 0.00217560217560242*G0_0_1_0_8 - 0.00438355295498227*G0_0_1_1_0 - 0.0865813551527985*G0_0_1_1_1 - 0.0704317904318025*G0_0_1_1_3 + 0.0401956773385413*G0_0_1_1_4 + 0.0142885685742853*G0_0_1_1_5 + 0.00900623186337625*G0_0_1_1_6 - 0.0012422498136785*G0_0_1_1_7 - 0.0260945403802592*G0_0_1_1_8 + 0.0100337757480631*G0_0_1_1_9 + 0.00438355295498229*G0_0_1_2_0 + 0.086581355152798*G0_0_1_2_2 - 0.0401956773385412*G0_0_1_2_3 + 0.0704317904318023*G0_0_1_2_4 + 0.00124224981367867*G0_0_1_2_5 + 0.026094540380259*G0_0_1_2_6 - 0.0142885685742852*G0_0_1_2_7 - 0.00900623186337624*G0_0_1_2_8 - 0.0100337757480631*G0_0_1_2_9 - 0.00995956424528025*G0_0_1_3_0 - 0.0704317904318025*G0_0_1_3_1 - 0.0401956773385412*G0_0_1_3_2 - 0.180625089196549*G0_0_1_3_3 - 0.00649350649350749*G0_0_1_3_5 - 0.0270186955901287*G0_0_1_3_6 + 0.0298786927358408*G0_0_1_3_7 - 0.0568973883259694*G0_0_1_3_8 - 0.0898587127158708*G0_0_1_3_9 + 0.00995956424528025*G0_0_1_4_0 + 0.0401956773385413*G0_0_1_4_1 + 0.0704317904318023*G0_0_1_4_2 + 0.180625089196549*G0_0_1_4_4 - 0.0298786927358407*G0_0_1_4_5 + 0.0568973883259694*G0_0_1_4_6 + 0.00649350649350752*G0_0_1_4_7 + 0.0270186955901287*G0_0_1_4_8 + 0.0898587127158707*G0_0_1_4_9 + 0.0276479076479124*G0_0_1_5_0 + 0.0142885685742853*G0_0_1_5_1 + 0.00124224981367867*G0_0_1_5_2 - 0.00649350649350749*G0_0_1_5_3 - 0.0298786927358407*G0_0_1_5_4 + 0.525074925075013*G0_0_1_5_5 - 0.112755815612978*G0_0_1_5_6 - 0.0428657057228558*G0_0_1_5_8 + 0.0857314114457118*G0_0_1_5_9 - 0.00217560217560255*G0_0_1_6_0 + 0.00900623186337625*G0_0_1_6_1 + 0.026094540380259*G0_0_1_6_2 - 0.0270186955901287*G0_0_1_6_3 + 0.0568973883259694*G0_0_1_6_4 - 0.112755815612978*G0_0_1_6_5 + 0.16952761524193*G0_0_1_6_6 + 0.0428657057228556*G0_0_1_6_7 + 0.0841387184244468*G0_0_1_6_9 - 0.0276479076479121*G0_0_1_7_0 - 0.0012422498136785*G0_0_1_7_1 - 0.0142885685742852*G0_0_1_7_2 + 0.0298786927358408*G0_0_1_7_3 + 0.00649350649350751*G0_0_1_7_4 + 0.0428657057228556*G0_0_1_7_6 - 0.525074925075012*G0_0_1_7_7 + 0.112755815612977*G0_0_1_7_8 - 0.0857314114457115*G0_0_1_7_9 + 0.00217560217560242*G0_0_1_8_0 - 0.0260945403802592*G0_0_1_8_1 - 0.00900623186337624*G0_0_1_8_2 - 0.0568973883259694*G0_0_1_8_3 + 0.0270186955901287*G0_0_1_8_4 - 0.0428657057228558*G0_0_1_8_5 + 0.112755815612977*G0_0_1_8_7 - 0.169527615241929*G0_0_1_8_8 - 0.084138718424447*G0_0_1_8_9 + 0.0100337757480631*G0_0_1_9_1 - 0.0100337757480631*G0_0_1_9_2 - 0.0898587127158708*G0_0_1_9_3 + 0.0898587127158707*G0_0_1_9_4 + 0.0857314114457118*G0_0_1_9_5 + 0.0841387184244468*G0_0_1_9_6 - 0.0857314114457115*G0_0_1_9_7 - 0.084138718424447*G0_0_1_9_8 - 0.000981522886284997*G0_1_0_0_1 + 0.000981522886284954*G0_1_0_0_2 - 0.0116112458969622*G0_1_0_0_3 + 0.0116112458969622*G0_1_0_0_4 + 0.00340548340548377*G0_1_0_0_5 + 0.0146076146076172*G0_1_0_0_6 - 0.00340548340548418*G0_1_0_0_7 - 0.014607614607617*G0_1_0_0_8 - 0.000981522886284997*G0_1_0_1_0 - 0.0890880548023557*G0_1_0_1_1 - 0.0703112760255737*G0_1_0_1_3 + 0.0409612609612679*G0_1_0_1_4 - 0.00736977308406004*G0_1_0_1_5 + 0.00823176823176964*G0_1_0_1_6 + 0.00639899782757037*G0_1_0_1_7 - 0.0298171669600292*G0_1_0_1_8 - 0.00200371057513952*G0_1_0_1_9 + 0.000981522886284954*G0_1_0_2_0 + 0.0890880548023555*G0_1_0_2_2 - 0.0409612609612678*G0_1_0_2_3 + 0.0703112760255736*G0_1_0_2_4 - 0.00639899782757035*G0_1_0_2_5 + 0.0298171669600291*G0_1_0_2_6 + 0.00736977308406003*G0_1_0_2_7 - 0.0082317682317696*G0_1_0_2_8 + 0.00200371057513946*G0_1_0_2_9 - 0.0116112458969622*G0_1_0_3_0 - 0.0703112760255737*G0_1_0_3_1 - 0.0409612609612679*G0_1_0_3_2 - 0.189770229770262*G0_1_0_3_3 + 0.0284715284715332*G0_1_0_3_5 - 0.0246953046953089*G0_1_0_3_6 + 0.0348337376908864*G0_1_0_3_7 - 0.0595290423861953*G0_1_0_3_8 - 0.0636563436563545*G0_1_0_3_9 + 0.0116112458969622*G0_1_0_4_0 + 0.0409612609612679*G0_1_0_4_1 + 0.0703112760255736*G0_1_0_4_2 + 0.189770229770262*G0_1_0_4_4 - 0.0348337376908864*G0_1_0_4_5 + 0.0595290423861953*G0_1_0_4_6 - 0.0284715284715333*G0_1_0_4_7 + 0.0246953046953089*G0_1_0_4_8 + 0.0636563436563544*G0_1_0_4_9 + 0.00340548340548377*G0_1_0_5_0 - 0.00736977308406004*G0_1_0_5_1 - 0.00639899782757035*G0_1_0_5_2 + 0.0284715284715332*G0_1_0_5_3 - 0.0348337376908864*G0_1_0_5_4 - 0.0687312687312804*G0_1_0_5_5 - 0.0757528186099743*G0_1_0_5_6 + 0.0221093192521801*G0_1_0_5_8 - 0.0442186385043603*G0_1_0_5_9 + 0.0146076146076172*G0_1_0_6_0 + 0.00823176823176964*G0_1_0_6_1 + 0.0298171669600292*G0_1_0_6_2 - 0.0246953046953089*G0_1_0_6_3 + 0.0595290423861953*G0_1_0_6_4 - 0.0757528186099743*G0_1_0_6_5 + 0.122374768089075*G0_1_0_6_6 - 0.02210931925218*G0_1_0_6_7 + 0.0433794776651993*G0_1_0_6_9 - 0.00340548340548418*G0_1_0_7_0 + 0.00639899782757037*G0_1_0_7_1 + 0.00736977308406003*G0_1_0_7_2 + 0.0348337376908864*G0_1_0_7_3 - 0.0284715284715333*G0_1_0_7_4 - 0.0221093192521801*G0_1_0_7_6 + 0.0687312687312802*G0_1_0_7_7 + 0.0757528186099743*G0_1_0_7_8 + 0.0442186385043603*G0_1_0_7_9 - 0.014607614607617*G0_1_0_8_0 - 0.0298171669600292*G0_1_0_8_1 - 0.00823176823176961*G0_1_0_8_2 - 0.0595290423861953*G0_1_0_8_3 + 0.0246953046953089*G0_1_0_8_4 + 0.0221093192521801*G0_1_0_8_5 + 0.0757528186099743*G0_1_0_8_7 - 0.122374768089075*G0_1_0_8_8 - 0.0433794776651993*G0_1_0_8_9 - 0.00200371057513952*G0_1_0_9_1 + 0.00200371057513946*G0_1_0_9_2 - 0.0636563436563545*G0_1_0_9_3 + 0.0636563436563544*G0_1_0_9_4 - 0.0442186385043603*G0_1_0_9_5 + 0.0433794776651993*G0_1_0_9_6 + 0.0442186385043603*G0_1_0_9_7 - 0.0433794776651993*G0_1_0_9_8 + 0.229582762916135*G0_1_1_0_0 + 0.00890168033025328*G0_1_1_0_1 + 0.00786525643668634*G0_1_1_0_2 - 0.0109963052820216*G0_1_1_0_3 + 0.0103613846471008*G0_1_1_0_4 + 0.0468731268731348*G0_1_1_0_5 - 0.0169030969030997*G0_1_1_0_6 + 0.112434232434251*G0_1_1_0_7 - 0.0627239427239534*G0_1_1_0_8 - 0.00229104229104253*G0_1_1_0_9 + 0.00890168033025328*G0_1_1_1_0 - 0.089822981251568*G0_1_1_1_1 - 0.0746732632447046*G0_1_1_1_3 + 0.0414068471211399*G0_1_1_1_4 + 0.0105193219478952*G0_1_1_1_5 + 0.00747855319284018*G0_1_1_1_6 + 0.026001300287019*G0_1_1_1_7 - 0.0396073767502407*G0_1_1_1_8 + 0.0111126968269844*G0_1_1_1_9 + 0.00786525643668634*G0_1_1_2_0 + 0.0854258263782217*G0_1_1_2_2 - 0.0398135198135265*G0_1_1_2_3 + 0.0664097806955062*G0_1_1_2_4 - 0.00393067250210173*G0_1_1_2_5 + 0.0239690468261937*G0_1_1_2_6 + 0.0141499770071222*G0_1_1_2_7 - 0.0112588998303303*G0_1_1_2_8 + 0.00224537367394548*G0_1_1_2_9 - 0.0109963052820216*G0_1_1_3_0 - 0.0746732632447045*G0_1_1_3_1 - 0.0398135198135265*G0_1_1_3_2 - 0.196831739688916*G0_1_1_3_3 + 0.00303410874839501*G0_1_1_3_4 + 0.00348223205366124*G0_1_1_3_5 - 0.0279691736834641*G0_1_1_3_6 + 0.0274554017411206*G0_1_1_3_7 - 0.055698587127168*G0_1_1_3_8 - 0.0882488939631947*G0_1_1_3_9 + 0.0103613846471008*G0_1_1_4_0 + 0.0414068471211399*G0_1_1_4_1 + 0.0664097806955062*G0_1_1_4_2 + 0.00303410874839501*G0_1_1_4_3 + 0.177262737262767*G0_1_1_4_4 - 0.0366176680462457*G0_1_1_4_5 + 0.0645868417297098*G0_1_1_4_6 - 0.0340002854288626*G0_1_1_4_7 + 0.0282431853860473*G0_1_1_4_8 + 0.0664992150706548*G0_1_1_4_9 + 0.0468731268731348*G0_1_1_5_0 + 0.0105193219478952*G0_1_1_5_1 - 0.00393067250210173*G0_1_1_5_2 + 0.00348223205366124*G0_1_1_5_3 - 0.0366176680462457*G0_1_1_5_4 + 0.281558441558488*G0_1_1_5_5 - 0.0762922791494349*G0_1_1_5_6 + 0.0850749250749393*G0_1_1_5_7 - 0.037091479948629*G0_1_1_5_8 + 0.0810560867703861*G0_1_1_5_9 - 0.0169030969030997*G0_1_1_6_0 + 0.00747855319284018*G0_1_1_6_1 + 0.0239690468261937*G0_1_1_6_2 - 0.0279691736834641*G0_1_1_6_3 + 0.0645868417297098*G0_1_1_6_4 - 0.0762922791494349*G0_1_1_6_5 + 0.166816041101784*G0_1_1_6_6 - 0.0479834451263103*G0_1_1_6_7 + 0.00843727700870699*G0_1_1_6_8 + 0.0492022263450918*G0_1_1_6_9 + 0.112434232434251*G0_1_1_7_0 + 0.026001300287019*G0_1_1_7_1 + 0.0141499770071222*G0_1_1_7_2 + 0.0274554017411206*G0_1_1_7_3 - 0.0340002854288626*G0_1_1_7_4 + 0.0850749250749393*G0_1_1_7_5 - 0.0479834451263103*G0_1_1_7_6 + 0.320719280719335*G0_1_1_7_7 - 0.00894248608534479*G0_1_1_7_8 + 0.102840017125749*G0_1_1_7_9 - 0.0627239427239534*G0_1_1_8_0 - 0.0396073767502407*G0_1_1_8_1 - 0.0112588998303303*G0_1_1_8_2 - 0.055698587127168*G0_1_1_8_3 + 0.0282431853860473*G0_1_1_8_4 - 0.037091479948629*G0_1_1_8_5 + 0.00843727700870698*G0_1_1_8_6 - 0.00894248608534479*G0_1_1_8_7 - 0.0975938347367084*G0_1_1_8_8 - 0.0898244612530479*G0_1_1_8_9 - 0.00229104229104253*G0_1_1_9_0 + 0.0111126968269844*G0_1_1_9_1 + 0.00224537367394548*G0_1_1_9_2 - 0.0882488939631947*G0_1_1_9_3 + 0.0664992150706548*G0_1_1_9_4 + 0.0810560867703861*G0_1_1_9_5 + 0.0492022263450918*G0_1_1_9_6 + 0.102840017125749*G0_1_1_9_7 - 0.0898244612530479*G0_1_1_9_8 + 0.120222634508369*G0_1_1_9_9; + A[79] = A[65] - 0.00203309917595668*G0_0_1_0_0 - 0.000699335937431298*G0_0_1_0_1 + 0.000741974075307536*G0_0_1_0_2 + 0.00285999714571192*G0_0_1_0_3 - 0.0279244564958899*G0_0_1_0_4 + 0.00669362383648212*G0_0_1_0_5 - 0.00856349999207289*G0_0_1_0_6 + 0.00323739752311236*G0_0_1_0_7 + 0.000598132026703567*G0_0_1_0_8 - 0.0181494695780441*G0_0_1_0_9 - 0.000699335937431298*G0_0_1_1_0 + 0.000473600473600564*G0_0_1_1_1 - 0.00266005599338978*G0_0_1_1_2 + 0.0104162504162522*G0_0_1_1_3 - 0.0162047476333219*G0_0_1_1_4 + 0.00363446077731854*G0_0_1_1_5 - 0.00626611483754448*G0_0_1_1_6 - 0.000167451596023058*G0_0_1_1_7 + 0.00311688311688366*G0_0_1_1_8 - 0.00611198325484144*G0_0_1_1_9 + 0.000741974075307535*G0_0_1_2_0 - 0.00266005599338978*G0_0_1_2_1 - 0.000749867416534079*G0_0_1_2_2 + 0.0143412143412168*G0_0_1_2_3 - 0.0198912198912233*G0_0_1_2_4 - 0.00244200244200288*G0_0_1_2_5 + 0.00435120435120512*G0_0_1_2_6 - 0.00133200133200156*G0_0_1_2_7 + 0.000319680319680372*G0_0_1_2_8 + 0.00719280719280841*G0_0_1_2_9 + 0.00285999714571192*G0_0_1_3_0 + 0.0104162504162522*G0_0_1_3_1 + 0.0143412143412168*G0_0_1_3_2 - 0.0684344227201485*G0_0_1_3_3 + 0.065934065934077*G0_0_1_3_4 - 0.0140088482945649*G0_0_1_3_5 + 0.0273326673326719*G0_0_1_3_6 - 0.00752961324390022*G0_0_1_3_8 + 0.0184272869987186*G0_0_1_3_9 - 0.0279244564958899*G0_0_1_4_0 - 0.0162047476333219*G0_0_1_4_1 - 0.0198912198912233*G0_0_1_4_2 + 0.065934065934077*G0_0_1_4_3 - 0.62481518481529*G0_0_1_4_4 + 0.0923076923077079*G0_0_1_4_5 - 0.11964035964038*G0_0_1_4_6 + 0.0396175253318177*G0_0_1_4_7 + 0.00757528186099743*G0_0_1_4_8 - 0.206193806193841*G0_0_1_4_9 + 0.00669362383648212*G0_0_1_5_0 + 0.00363446077731854*G0_0_1_5_1 - 0.00244200244200288*G0_0_1_5_2 - 0.0140088482945649*G0_0_1_5_3 + 0.0923076923077079*G0_0_1_5_4 - 0.0212815755672934*G0_0_1_5_5 + 0.0289310689310738*G0_0_1_5_6 - 0.0101612673041262*G0_0_1_5_7 - 0.00236905951191706*G0_0_1_5_8 + 0.0591865277579663*G0_0_1_5_9 - 0.00856349999207289*G0_0_1_6_0 - 0.00626611483754448*G0_0_1_6_1 + 0.00435120435120512*G0_0_1_6_2 + 0.0273326673326719*G0_0_1_6_3 - 0.11964035964038*G0_0_1_6_4 + 0.0289310689310738*G0_0_1_6_5 - 0.0310089910089962*G0_0_1_6_6 + 0.0125303268160432*G0_0_1_6_7 + 0.00465249036677687*G0_0_1_6_8 - 0.0762437562437691*G0_0_1_6_9 + 0.00323739752311236*G0_0_1_7_0 - 0.000167451596023057*G0_0_1_7_1 - 0.00133200133200156*G0_0_1_7_2 + 0.0396175253318177*G0_0_1_7_4 - 0.0101612673041262*G0_0_1_7_5 + 0.0125303268160432*G0_0_1_7_6 - 0.00349364920793561*G0_0_1_7_7 - 0.000770657913515202*G0_0_1_7_8 + 0.0293877551020458*G0_0_1_7_9 + 0.000598132026703566*G0_0_1_8_0 + 0.00311688311688366*G0_0_1_8_1 + 0.000319680319680372*G0_0_1_8_2 - 0.00752961324390022*G0_0_1_8_3 + 0.00757528186099743*G0_0_1_8_4 - 0.00236905951191706*G0_0_1_8_5 + 0.00465249036677687*G0_0_1_8_6 - 0.000770657913515202*G0_0_1_8_7 + 0.00565149136577805*G0_0_1_8_8 + 0.00318538604252943*G0_0_1_8_9 - 0.0181494695780441*G0_0_1_9_0 - 0.00611198325484144*G0_0_1_9_1 + 0.00719280719280841*G0_0_1_9_2 + 0.0184272869987186*G0_0_1_9_3 - 0.206193806193841*G0_0_1_9_4 + 0.0591865277579663*G0_0_1_9_5 - 0.0762437562437691*G0_0_1_9_6 + 0.0293877551020458*G0_0_1_9_7 + 0.00318538604252942*G0_0_1_9_8 - 0.170161267304153*G0_0_1_9_9 + 0.00203309917595668*G0_1_0_0_0 + 0.000699335937431298*G0_1_0_0_1 - 0.000741974075307536*G0_1_0_0_2 - 0.00285999714571192*G0_1_0_0_3 + 0.0279244564958899*G0_1_0_0_4 - 0.00669362383648212*G0_1_0_0_5 + 0.00856349999207289*G0_1_0_0_6 - 0.00323739752311236*G0_1_0_0_7 - 0.000598132026703567*G0_1_0_0_8 + 0.0181494695780441*G0_1_0_0_9 + 0.000699335937431298*G0_1_0_1_0 - 0.000473600473600564*G0_1_0_1_1 + 0.00266005599338978*G0_1_0_1_2 - 0.0104162504162522*G0_1_0_1_3 + 0.0162047476333219*G0_1_0_1_4 - 0.00363446077731854*G0_1_0_1_5 + 0.00626611483754448*G0_1_0_1_6 + 0.000167451596023058*G0_1_0_1_7 - 0.00311688311688366*G0_1_0_1_8 + 0.00611198325484144*G0_1_0_1_9 - 0.000741974075307537*G0_1_0_2_0 + 0.00266005599338978*G0_1_0_2_1 + 0.000749867416534079*G0_1_0_2_2 - 0.0143412143412168*G0_1_0_2_3 + 0.0198912198912233*G0_1_0_2_4 + 0.00244200244200288*G0_1_0_2_5 - 0.00435120435120513*G0_1_0_2_6 + 0.00133200133200156*G0_1_0_2_7 - 0.000319680319680372*G0_1_0_2_8 - 0.00719280719280841*G0_1_0_2_9 - 0.00285999714571192*G0_1_0_3_0 - 0.0104162504162522*G0_1_0_3_1 - 0.0143412143412168*G0_1_0_3_2 + 0.0684344227201485*G0_1_0_3_3 - 0.065934065934077*G0_1_0_3_4 + 0.0140088482945649*G0_1_0_3_5 - 0.0273326673326719*G0_1_0_3_6 + 0.00752961324390022*G0_1_0_3_8 - 0.0184272869987186*G0_1_0_3_9 + 0.0279244564958899*G0_1_0_4_0 + 0.0162047476333219*G0_1_0_4_1 + 0.0198912198912233*G0_1_0_4_2 - 0.065934065934077*G0_1_0_4_3 + 0.62481518481529*G0_1_0_4_4 - 0.0923076923077079*G0_1_0_4_5 + 0.11964035964038*G0_1_0_4_6 - 0.0396175253318177*G0_1_0_4_7 - 0.00757528186099743*G0_1_0_4_8 + 0.206193806193841*G0_1_0_4_9 - 0.00669362383648212*G0_1_0_5_0 - 0.00363446077731854*G0_1_0_5_1 + 0.00244200244200288*G0_1_0_5_2 + 0.0140088482945649*G0_1_0_5_3 - 0.0923076923077079*G0_1_0_5_4 + 0.0212815755672934*G0_1_0_5_5 - 0.0289310689310738*G0_1_0_5_6 + 0.0101612673041262*G0_1_0_5_7 + 0.00236905951191706*G0_1_0_5_8 - 0.0591865277579663*G0_1_0_5_9 + 0.00856349999207289*G0_1_0_6_0 + 0.00626611483754448*G0_1_0_6_1 - 0.00435120435120512*G0_1_0_6_2 - 0.0273326673326719*G0_1_0_6_3 + 0.11964035964038*G0_1_0_6_4 - 0.0289310689310738*G0_1_0_6_5 + 0.0310089910089962*G0_1_0_6_6 - 0.0125303268160432*G0_1_0_6_7 - 0.00465249036677687*G0_1_0_6_8 + 0.0762437562437691*G0_1_0_6_9 - 0.00323739752311236*G0_1_0_7_0 + 0.000167451596023057*G0_1_0_7_1 + 0.00133200133200156*G0_1_0_7_2 - 0.0396175253318177*G0_1_0_7_4 + 0.0101612673041262*G0_1_0_7_5 - 0.0125303268160432*G0_1_0_7_6 + 0.00349364920793561*G0_1_0_7_7 + 0.000770657913515202*G0_1_0_7_8 - 0.0293877551020458*G0_1_0_7_9 - 0.000598132026703566*G0_1_0_8_0 - 0.00311688311688366*G0_1_0_8_1 - 0.000319680319680372*G0_1_0_8_2 + 0.00752961324390022*G0_1_0_8_3 - 0.00757528186099743*G0_1_0_8_4 + 0.00236905951191706*G0_1_0_8_5 - 0.00465249036677687*G0_1_0_8_6 + 0.000770657913515201*G0_1_0_8_7 - 0.00565149136577805*G0_1_0_8_8 - 0.00318538604252942*G0_1_0_8_9 + 0.0181494695780441*G0_1_0_9_0 + 0.00611198325484144*G0_1_0_9_1 - 0.00719280719280841*G0_1_0_9_2 - 0.0184272869987186*G0_1_0_9_3 + 0.206193806193841*G0_1_0_9_4 - 0.0591865277579663*G0_1_0_9_5 + 0.0762437562437691*G0_1_0_9_6 - 0.0293877551020458*G0_1_0_9_7 - 0.00318538604252942*G0_1_0_9_8 + 0.170161267304153*G0_1_0_9_9; + A[154] = A[70] - 0.00141340141340175*G0_0_1_0_0 - 0.000920005920006119*G0_0_1_0_1 + 0.000257176685748161*G0_0_1_0_2 + 0.00128752200180796*G0_0_1_0_3 - 0.00175800390086135*G0_0_1_0_4 + 0.000609866324152135*G0_0_1_0_5 - 0.000452642595499803*G0_0_1_0_6 + 0.00104514533085976*G0_0_1_0_7 + 0.00583535512107041*G0_0_1_0_8 - 0.00381761096046875*G0_0_1_0_9 - 0.000920005920006119*G0_0_1_1_0 - 0.11901061901064*G0_0_1_1_1 - 0.00092000592000609*G0_0_1_1_2 + 0.000166500166500001*G0_0_1_1_3 + 0.00475191475191563*G0_0_1_1_4 - 0.00113719613719629*G0_0_1_1_5 - 0.00113719613719633*G0_0_1_1_6 + 0.0047519147519157*G0_0_1_1_7 + 0.000166500166499847*G0_0_1_1_8 + 0.0115084915084934*G0_0_1_1_9 + 0.000257176685748161*G0_0_1_2_0 - 0.000920005920006089*G0_0_1_2_1 - 0.00141340141340163*G0_0_1_2_2 + 0.00583535512107039*G0_0_1_2_3 + 0.00104514533085981*G0_0_1_2_4 - 0.000452642595499831*G0_0_1_2_5 + 0.000609866324152181*G0_0_1_2_6 - 0.00175800390086133*G0_0_1_2_7 + 0.00128752200180793*G0_0_1_2_8 - 0.00381761096046873*G0_0_1_2_9 + 0.00128752200180796*G0_0_1_3_0 + 0.000166500166499998*G0_0_1_3_1 + 0.00583535512107039*G0_0_1_3_2 + 0.188751248751281*G0_0_1_3_3 - 0.0348101898101957*G0_0_1_3_4 + 0.000742828599971603*G0_0_1_3_5 + 0.00147495361781098*G0_0_1_3_6 - 0.0057992007992018*G0_0_1_3_7 + 0.0115984015984035*G0_0_1_3_8 - 0.0229270729270766*G0_0_1_3_9 - 0.00175800390086135*G0_0_1_4_0 + 0.00475191475191563*G0_0_1_4_1 + 0.00104514533085981*G0_0_1_4_2 - 0.0348101898101957*G0_0_1_4_3 - 0.0131482802911397*G0_0_1_4_4 + 0.00333737690880604*G0_0_1_4_5 - 0.00481233052661703*G0_0_1_4_6 + 0.00624232909947299*G0_0_1_4_7 - 0.00579920079920176*G0_0_1_4_8 + 0.0047780790637941*G0_0_1_4_9 + 0.000609866324152135*G0_0_1_5_0 - 0.00113719613719629*G0_0_1_5_1 - 0.000452642595499831*G0_0_1_5_2 + 0.000742828599971602*G0_0_1_5_3 + 0.00333737690880604*G0_0_1_5_4 + 0.0014942200656491*G0_0_1_5_5 + 0.00236121021835344*G0_0_1_5_6 - 0.00481233052661703*G0_0_1_5_7 + 0.00147495361781099*G0_0_1_5_8 + 0.00850292564578422*G0_0_1_5_9 - 0.000452642595499803*G0_0_1_6_0 - 0.00113719613719633*G0_0_1_6_1 + 0.000609866324152181*G0_0_1_6_2 + 0.00147495361781098*G0_0_1_6_3 - 0.00481233052661703*G0_0_1_6_4 + 0.00236121021835344*G0_0_1_6_5 + 0.00149422006564917*G0_0_1_6_6 + 0.00333737690880602*G0_0_1_6_7 + 0.000742828599971591*G0_0_1_6_8 + 0.00850292564578424*G0_0_1_6_9 + 0.00104514533085976*G0_0_1_7_0 + 0.0047519147519157*G0_0_1_7_1 - 0.00175800390086133*G0_0_1_7_2 - 0.0057992007992018*G0_0_1_7_3 + 0.00624232909947299*G0_0_1_7_4 - 0.00481233052661703*G0_0_1_7_5 + 0.00333737690880602*G0_0_1_7_6 - 0.0131482802911393*G0_0_1_7_7 - 0.0348101898101956*G0_0_1_7_8 + 0.00477807906379417*G0_0_1_7_9 + 0.00583535512107041*G0_0_1_8_0 + 0.000166500166499842*G0_0_1_8_1 + 0.00128752200180793*G0_0_1_8_2 + 0.0115984015984035*G0_0_1_8_3 - 0.00579920079920176*G0_0_1_8_4 + 0.00147495361781099*G0_0_1_8_5 + 0.00074282859997159*G0_0_1_8_6 - 0.0348101898101956*G0_0_1_8_7 + 0.188751248751281*G0_0_1_8_8 - 0.0229270729270767*G0_0_1_8_9 - 0.00381761096046875*G0_0_1_9_0 + 0.0115084915084934*G0_0_1_9_1 - 0.00381761096046873*G0_0_1_9_2 - 0.0229270729270766*G0_0_1_9_3 + 0.0047780790637941*G0_0_1_9_4 + 0.00850292564578422*G0_0_1_9_5 + 0.00850292564578424*G0_0_1_9_6 + 0.00477807906379417*G0_0_1_9_7 - 0.0229270729270767*G0_0_1_9_8 - 0.120685029256478*G0_0_1_9_9 + 0.00141340141340175*G0_1_0_0_0 + 0.000920005920006119*G0_1_0_0_1 - 0.000257176685748161*G0_1_0_0_2 - 0.00128752200180796*G0_1_0_0_3 + 0.00175800390086135*G0_1_0_0_4 - 0.000609866324152135*G0_1_0_0_5 + 0.000452642595499803*G0_1_0_0_6 - 0.00104514533085976*G0_1_0_0_7 - 0.00583535512107041*G0_1_0_0_8 + 0.00381761096046875*G0_1_0_0_9 + 0.000920005920006119*G0_1_0_1_0 + 0.11901061901064*G0_1_0_1_1 + 0.000920005920006089*G0_1_0_1_2 - 0.000166500166500005*G0_1_0_1_3 - 0.00475191475191563*G0_1_0_1_4 + 0.00113719613719629*G0_1_0_1_5 + 0.00113719613719633*G0_1_0_1_6 - 0.0047519147519157*G0_1_0_1_7 - 0.00016650016649985*G0_1_0_1_8 - 0.0115084915084934*G0_1_0_1_9 - 0.000257176685748161*G0_1_0_2_0 + 0.000920005920006089*G0_1_0_2_1 + 0.00141340141340163*G0_1_0_2_2 - 0.00583535512107039*G0_1_0_2_3 - 0.00104514533085981*G0_1_0_2_4 + 0.000452642595499831*G0_1_0_2_5 - 0.000609866324152181*G0_1_0_2_6 + 0.00175800390086133*G0_1_0_2_7 - 0.00128752200180793*G0_1_0_2_8 + 0.00381761096046873*G0_1_0_2_9 - 0.00128752200180796*G0_1_0_3_0 - 0.000166500166500001*G0_1_0_3_1 - 0.00583535512107039*G0_1_0_3_2 - 0.188751248751281*G0_1_0_3_3 + 0.0348101898101957*G0_1_0_3_4 - 0.000742828599971602*G0_1_0_3_5 - 0.00147495361781098*G0_1_0_3_6 + 0.0057992007992018*G0_1_0_3_7 - 0.0115984015984035*G0_1_0_3_8 + 0.0229270729270766*G0_1_0_3_9 + 0.00175800390086135*G0_1_0_4_0 - 0.00475191475191563*G0_1_0_4_1 - 0.00104514533085981*G0_1_0_4_2 + 0.0348101898101957*G0_1_0_4_3 + 0.0131482802911397*G0_1_0_4_4 - 0.00333737690880604*G0_1_0_4_5 + 0.00481233052661703*G0_1_0_4_6 - 0.00624232909947299*G0_1_0_4_7 + 0.00579920079920176*G0_1_0_4_8 - 0.0047780790637941*G0_1_0_4_9 - 0.000609866324152135*G0_1_0_5_0 + 0.00113719613719629*G0_1_0_5_1 + 0.000452642595499831*G0_1_0_5_2 - 0.000742828599971602*G0_1_0_5_3 - 0.00333737690880604*G0_1_0_5_4 - 0.0014942200656491*G0_1_0_5_5 - 0.00236121021835344*G0_1_0_5_6 + 0.00481233052661703*G0_1_0_5_7 - 0.00147495361781099*G0_1_0_5_8 - 0.00850292564578422*G0_1_0_5_9 + 0.000452642595499803*G0_1_0_6_0 + 0.00113719613719633*G0_1_0_6_1 - 0.000609866324152181*G0_1_0_6_2 - 0.00147495361781098*G0_1_0_6_3 + 0.00481233052661703*G0_1_0_6_4 - 0.00236121021835344*G0_1_0_6_5 - 0.00149422006564917*G0_1_0_6_6 - 0.00333737690880602*G0_1_0_6_7 - 0.00074282859997159*G0_1_0_6_8 - 0.00850292564578424*G0_1_0_6_9 - 0.00104514533085976*G0_1_0_7_0 - 0.0047519147519157*G0_1_0_7_1 + 0.00175800390086133*G0_1_0_7_2 + 0.0057992007992018*G0_1_0_7_3 - 0.00624232909947299*G0_1_0_7_4 + 0.00481233052661703*G0_1_0_7_5 - 0.00333737690880602*G0_1_0_7_6 + 0.0131482802911393*G0_1_0_7_7 + 0.0348101898101956*G0_1_0_7_8 - 0.00477807906379417*G0_1_0_7_9 - 0.00583535512107041*G0_1_0_8_0 - 0.000166500166499845*G0_1_0_8_1 - 0.00128752200180793*G0_1_0_8_2 - 0.0115984015984035*G0_1_0_8_3 + 0.00579920079920176*G0_1_0_8_4 - 0.00147495361781099*G0_1_0_8_5 - 0.00074282859997159*G0_1_0_8_6 + 0.0348101898101956*G0_1_0_8_7 - 0.188751248751281*G0_1_0_8_8 + 0.0229270729270767*G0_1_0_8_9 + 0.00381761096046875*G0_1_0_9_0 - 0.0115084915084934*G0_1_0_9_1 + 0.00381761096046873*G0_1_0_9_2 + 0.0229270729270766*G0_1_0_9_3 - 0.0047780790637941*G0_1_0_9_4 - 0.00850292564578422*G0_1_0_9_5 - 0.00850292564578424*G0_1_0_9_6 - 0.00477807906379417*G0_1_0_9_7 + 0.0229270729270767*G0_1_0_9_8 + 0.120685029256478*G0_1_0_9_9; + A[106] = -0.00165920499253863*G0_0_0_0_0 - 0.000148328303090244*G0_0_0_0_1 - 0.000265107467488465*G0_0_0_0_2 - 8.25166896595651e-05*G0_0_0_0_3 + 0.00017044463473038*G0_0_0_0_4 - 0.00331010259581745*G0_0_0_0_5 + 0.000302653695510907*G0_0_0_0_6 - 0.000261048475334231*G0_0_0_0_7 + 0.000297500118928729*G0_0_0_0_8 - 0.000490818705104504*G0_0_0_0_9 - 0.000148328303090244*G0_0_0_1_0 - 0.00168535168535219*G0_0_0_1_1 - 0.00023995625186106*G0_0_0_1_2 - 0.00142302142302171*G0_0_0_1_3 + 0.00118145743145765*G0_0_0_1_4 + 0.000406042370328154*G0_0_0_1_5 + 0.000690638726353132*G0_0_0_1_6 + 0.000564851814851961*G0_0_0_1_7 - 0.00038211788211806*G0_0_0_1_8 - 0.000800033300033447*G0_0_0_1_9 - 0.000265107467488465*G0_0_0_2_0 - 0.00023995625186106*G0_0_0_2_1 - 0.0113344063344082*G0_0_0_2_2 + 0.000282138496424254*G0_0_0_2_3 + 0.000122655122655149*G0_0_0_2_4 - 0.000303942089656438*G0_0_0_2_5 - 0.00238150738150775*G0_0_0_2_6 + 0.000145588538445707*G0_0_0_2_7 - 0.000268045446616927*G0_0_0_2_8 + 0.00111126968269844*G0_0_0_2_9 - 8.2516689659565e-05*G0_0_0_3_0 - 0.00142302142302171*G0_0_0_3_1 + 0.000282138496424254*G0_0_0_3_2 - 0.00384865134865198*G0_0_0_3_3 - 0.00248233908948236*G0_0_0_3_4 - 0.000530184101612756*G0_0_0_3_5 - 0.00198212501783962*G0_0_0_3_6 + 0.000337341230198442*G0_0_0_3_7 - 0.00123126873126897*G0_0_0_3_8 + 0.00172541743970345*G0_0_0_3_9 + 0.00017044463473038*G0_0_0_4_0 + 0.00118145743145765*G0_0_0_4_1 + 0.000122655122655149*G0_0_0_4_2 - 0.00248233908948236*G0_0_0_4_3 + 0.0116897388325979*G0_0_0_4_4 - 0.000421542742971383*G0_0_0_4_5 + 0.00240366776081101*G0_0_0_4_6 - 0.000518945340374003*G0_0_0_4_7 + 0.00089392750107053*G0_0_0_4_8 - 0.00249072356215257*G0_0_0_4_9 - 0.00331010259581745*G0_0_0_5_0 + 0.000406042370328154*G0_0_0_5_1 - 0.000303942089656438*G0_0_0_5_2 - 0.000530184101612756*G0_0_0_5_3 - 0.000421542742971383*G0_0_0_5_4 + 0.01254923647781*G0_0_0_5_5 + 0.00698604966462226*G0_0_0_5_6 + 0.00147531040388208*G0_0_0_5_7 - 0.00112833594976471*G0_0_0_5_8 + 0.00372912801484293*G0_0_0_5_9 + 0.000302653695510907*G0_0_0_6_0 + 0.000690638726353132*G0_0_0_6_1 - 0.00238150738150775*G0_0_0_6_2 - 0.00198212501783962*G0_0_0_6_3 + 0.00240366776081101*G0_0_0_6_4 + 0.00698604966462226*G0_0_0_6_5 + 0.0479834451263104*G0_0_0_6_6 - 0.000346974454117365*G0_0_0_6_7 - 0.000678785500214172*G0_0_0_6_8 + 0.000630440987583918*G0_0_0_6_9 - 0.000261048475334231*G0_0_0_7_0 + 0.000564851814851961*G0_0_0_7_1 + 0.000145588538445707*G0_0_0_7_2 + 0.000337341230198442*G0_0_0_7_3 - 0.000518945340374003*G0_0_0_7_4 + 0.00147531040388208*G0_0_0_7_5 - 0.000346974454117365*G0_0_0_7_6 + 0.00361602683031313*G0_0_0_7_7 - 0.00134882974168705*G0_0_0_7_8 + 0.00216640502354825*G0_0_0_7_9 + 0.000297500118928729*G0_0_0_8_0 - 0.00038211788211806*G0_0_0_8_1 - 0.000268045446616927*G0_0_0_8_2 - 0.00123126873126897*G0_0_0_8_3 + 0.00089392750107053*G0_0_0_8_4 - 0.00112833594976471*G0_0_0_8_5 - 0.000678785500214172*G0_0_0_8_6 - 0.00134882974168705*G0_0_0_8_7 - 0.000806693306693603*G0_0_0_8_8 + 0.000612244897959275*G0_0_0_8_9 - 0.000490818705104504*G0_0_0_9_0 - 0.000800033300033447*G0_0_0_9_1 + 0.00111126968269844*G0_0_0_9_2 + 0.00172541743970345*G0_0_0_9_3 - 0.00249072356215257*G0_0_0_9_4 + 0.00372912801484292*G0_0_0_9_5 + 0.000630440987583918*G0_0_0_9_6 + 0.00216640502354825*G0_0_0_9_7 + 0.000612244897959275*G0_0_0_9_8 - 0.0196132438989615*G0_0_0_9_9 + 0.00967520134186971*G0_1_0_0_0 + 9.16279487708138e-05*G0_1_0_0_1 + 0.000185528756957352*G0_1_0_0_3 + 2.48560962846742e-05*G0_1_0_0_4 - 0.000928595214309647*G0_1_0_0_5 + 0.000606595785167318*G0_1_0_0_6 - 0.000383703597989344*G0_1_0_0_7 + 1.53616225044576e-05*G0_1_0_0_8 - 0.00160208838780294*G0_1_0_0_9 + 9.16279487708137e-05*G0_1_0_1_0 - 9.16279487708291e-05*G0_1_0_1_2 - 0.00104090354090379*G0_1_0_1_3 + 0.000616605616605755*G0_1_0_1_4 - 0.000284596356024968*G0_1_0_1_5 + 0.000284596356024978*G0_1_0_1_6 - 0.000616605616605663*G0_1_0_1_7 + 0.0010409035409036*G0_1_0_1_8 - 9.16279487708291e-05*G0_1_0_2_1 - 0.00967520134186962*G0_1_0_2_2 - 1.5361622504488e-05*G0_1_0_2_3 + 0.00038370359798938*G0_1_0_2_4 - 0.000606595785167326*G0_1_0_2_5 + 0.000928595214309676*G0_1_0_2_6 - 2.4856096284667e-05*G0_1_0_2_7 - 0.000185528756957367*G0_1_0_2_8 + 0.00160208838780294*G0_1_0_2_9 + 0.000185528756957352*G0_1_0_3_0 - 0.00104090354090379*G0_1_0_3_1 - 1.53616225044881e-05*G0_1_0_3_2 - 0.00304195804195858*G0_1_0_3_3 - 0.00113350934779523*G0_1_0_3_4 + 0.000148601398601409*G0_1_0_3_5 - 0.000853789068074915*G0_1_0_3_6 - 0.000556586270872061*G0_1_0_3_7 + 0.00111317254174416*G0_1_0_3_9 + 2.48560962846743e-05*G0_1_0_4_0 + 0.000616605616605755*G0_1_0_4_1 + 0.000383703597989381*G0_1_0_4_2 - 0.00113350934779523*G0_1_0_4_3 + 0.00807371200228473*G0_1_0_4_4 - 7.45682888540108e-05*G0_1_0_4_5 + 0.000928357356928934*G0_1_0_4_6 + 0.000556586270872105*G0_1_0_4_8 - 0.00465712858570081*G0_1_0_4_9 - 0.000928595214309648*G0_1_0_5_0 - 0.000284596356024968*G0_1_0_5_1 - 0.000606595785167326*G0_1_0_5_2 + 0.000148601398601409*G0_1_0_5_3 - 7.45682888540108e-05*G0_1_0_5_4 - 0.0354342086485002*G0_1_0_5_5 - 0.000928357356928912*G0_1_0_5_7 + 0.000853789068074908*G0_1_0_5_8 + 0.003098687027259*G0_1_0_5_9 + 0.000606595785167318*G0_1_0_6_0 + 0.000284596356024978*G0_1_0_6_1 + 0.000928595214309677*G0_1_0_6_2 - 0.000853789068074915*G0_1_0_6_3 + 0.000928357356928934*G0_1_0_6_4 + 0.0354342086485004*G0_1_0_6_6 + 7.4568288854009e-05*G0_1_0_6_7 - 0.000148601398601409*G0_1_0_6_8 - 0.003098687027259*G0_1_0_6_9 - 0.000383703597989344*G0_1_0_7_0 - 0.000616605616605663*G0_1_0_7_1 - 2.48560962846669e-05*G0_1_0_7_2 - 0.000556586270872061*G0_1_0_7_3 - 0.000928357356928911*G0_1_0_7_5 + 7.45682888540088e-05*G0_1_0_7_6 - 0.00807371200228477*G0_1_0_7_7 + 0.00113350934779529*G0_1_0_7_8 + 0.00465712858570081*G0_1_0_7_9 + 1.5361622504458e-05*G0_1_0_8_0 + 0.0010409035409036*G0_1_0_8_1 - 0.000185528756957367*G0_1_0_8_2 + 0.000556586270872105*G0_1_0_8_4 + 0.000853789068074908*G0_1_0_8_5 - 0.000148601398601409*G0_1_0_8_6 + 0.00113350934779529*G0_1_0_8_7 + 0.00304195804195841*G0_1_0_8_8 - 0.00111317254174417*G0_1_0_8_9 - 0.00160208838780294*G0_1_0_9_0 + 0.00160208838780294*G0_1_0_9_2 + 0.00111317254174416*G0_1_0_9_3 - 0.00465712858570081*G0_1_0_9_4 + 0.003098687027259*G0_1_0_9_5 - 0.003098687027259*G0_1_0_9_6 + 0.00465712858570081*G0_1_0_9_7 - 0.00111317254174417*G0_1_0_9_8; + A[60] = A[106] + 0.000488559059987719*G0_0_0_0_3 + 0.000520194091622755*G0_0_0_0_4 + 0.00188708117279576*G0_0_0_0_5 + 0.000878803735946738*G0_0_0_0_6 - 0.000121069406783779*G0_0_0_0_7 + 0.000267351695923207*G0_0_0_0_8 - 0.000309214594928942*G0_0_0_0_9 - 0.00188708117279573*G0_0_0_1_3 - 0.000878803735946758*G0_0_0_1_4 - 0.000488559059987717*G0_0_0_1_5 - 0.000520194091622753*G0_0_0_1_6 - 0.000267351695923229*G0_0_0_1_7 + 0.000121069406783827*G0_0_0_1_8 + 0.00030921459492894*G0_0_0_1_9 - 0.000586080586080695*G0_0_0_2_3 - 0.0025041625041629*G0_0_0_2_4 + 0.00058608058608069*G0_0_0_2_5 + 0.0025041625041629*G0_0_0_2_6 - 0.000413633985062631*G0_0_0_2_7 + 0.000413633985062633*G0_0_0_2_8 + 0.000488559059987719*G0_0_0_3_0 - 0.00188708117279573*G0_0_0_3_1 - 0.000586080586080695*G0_0_0_3_2 + 0.0163978878264619*G0_0_0_3_3 + 0.00946838875410462*G0_0_0_3_4 + 0.00156058227486824*G0_0_0_3_6 - 0.00146567717996315*G0_0_0_3_7 + 0.00270657913515104*G0_0_0_3_8 + 0.00200371057513948*G0_0_0_3_9 + 0.000520194091622754*G0_0_0_4_0 - 0.000878803735946758*G0_0_0_4_1 - 0.0025041625041629*G0_0_0_4_2 + 0.00946838875410462*G0_0_0_4_3 + 0.0362937062937125*G0_0_0_4_4 - 0.00156058227486824*G0_0_0_4_5 - 0.000159840159840177*G0_0_0_4_7 - 0.0012409019551879*G0_0_0_4_8 + 0.00312116454973649*G0_0_0_4_9 + 0.00188708117279576*G0_0_0_5_0 - 0.000488559059987717*G0_0_0_5_1 + 0.00058608058608069*G0_0_0_5_2 - 0.00156058227486824*G0_0_0_5_4 - 0.016397887826462*G0_0_0_5_5 - 0.00946838875410461*G0_0_0_5_6 - 0.00270657913515104*G0_0_0_5_7 + 0.00146567717996314*G0_0_0_5_8 - 0.00200371057513947*G0_0_0_5_9 + 0.000878803735946738*G0_0_0_6_0 - 0.000520194091622753*G0_0_0_6_1 + 0.0025041625041629*G0_0_0_6_2 + 0.00156058227486824*G0_0_0_6_3 - 0.00946838875410462*G0_0_0_6_5 - 0.0362937062937125*G0_0_0_6_6 + 0.00124090195518789*G0_0_0_6_7 + 0.000159840159840172*G0_0_0_6_8 - 0.0031211645497365*G0_0_0_6_9 - 0.000121069406783779*G0_0_0_7_0 - 0.000267351695923229*G0_0_0_7_1 - 0.000413633985062631*G0_0_0_7_2 - 0.00146567717996315*G0_0_0_7_3 - 0.000159840159840177*G0_0_0_7_4 - 0.00270657913515104*G0_0_0_7_5 + 0.00124090195518789*G0_0_0_7_6 - 0.00442272013700668*G0_0_0_7_7 - 0.00155416012558896*G0_0_0_7_9 + 0.000267351695923207*G0_0_0_8_0 + 0.000121069406783827*G0_0_0_8_1 + 0.000413633985062633*G0_0_0_8_2 + 0.00270657913515104*G0_0_0_8_3 - 0.0012409019551879*G0_0_0_8_4 + 0.00146567717996314*G0_0_0_8_5 + 0.000159840159840172*G0_0_0_8_6 + 0.00442272013700673*G0_0_0_8_8 + 0.00155416012558898*G0_0_0_8_9 - 0.000309214594928942*G0_0_0_9_0 + 0.00030921459492894*G0_0_0_9_1 + 0.00200371057513948*G0_0_0_9_3 + 0.00312116454973649*G0_0_0_9_4 - 0.00200371057513947*G0_0_0_9_5 - 0.0031211645497365*G0_0_0_9_6 - 0.00155416012558897*G0_0_0_9_7 + 0.00155416012558898*G0_0_0_9_8 - 0.00168535168535206*G0_0_1_0_0 - 0.000148328303090239*G0_0_1_0_1 - 0.000239956251861062*G0_0_1_0_2 + 0.000406042370328155*G0_0_1_0_3 + 0.000690638726353132*G0_0_1_0_4 - 0.00142302142302168*G0_0_1_0_5 + 0.00118145743145764*G0_0_1_0_6 - 0.000382117882118006*G0_0_1_0_7 + 0.000564851814851934*G0_0_1_0_8 - 0.000800033300033447*G0_0_1_0_9 - 0.000148328303090239*G0_0_1_1_0 - 0.0016592049925386*G0_0_1_1_1 - 0.000265107467488467*G0_0_1_1_2 - 0.00331010259581743*G0_0_1_1_3 + 0.000302653695510894*G0_0_1_1_4 + 0.000170444634730375*G0_0_1_1_6 + 0.000297500118928733*G0_0_1_1_7 - 0.000261048475334232*G0_0_1_1_8 - 0.000490818705104506*G0_0_1_1_9 - 0.000239956251861062*G0_0_1_2_0 - 0.000265107467488467*G0_0_1_2_1 - 0.0113344063344083*G0_0_1_2_2 - 0.00030394208965642*G0_0_1_2_3 - 0.00238150738150779*G0_0_1_2_4 + 0.000282138496424275*G0_0_1_2_5 + 0.000122655122655106*G0_0_1_2_6 - 0.000268045446616923*G0_0_1_2_7 + 0.000145588538445705*G0_0_1_2_8 + 0.00111126968269844*G0_0_1_2_9 + 0.000406042370328155*G0_0_1_3_0 - 0.00331010259581743*G0_0_1_3_1 - 0.00030394208965642*G0_0_1_3_2 + 0.0125492364778099*G0_0_1_3_3 + 0.00698604966462226*G0_0_1_3_4 - 0.000530184101612761*G0_0_1_3_5 - 0.000421542742971366*G0_0_1_3_6 - 0.0011283359497647*G0_0_1_3_7 + 0.00147531040388207*G0_0_1_3_8 + 0.00372912801484292*G0_0_1_3_9 + 0.000690638726353132*G0_0_1_4_0 + 0.000302653695510894*G0_0_1_4_1 - 0.00238150738150779*G0_0_1_4_2 + 0.00698604966462226*G0_0_1_4_3 + 0.0479834451263103*G0_0_1_4_4 - 0.00198212501783962*G0_0_1_4_5 + 0.00240366776081099*G0_0_1_4_6 - 0.00067878550021418*G0_0_1_4_7 - 0.000346974454117365*G0_0_1_4_8 + 0.000630440987583905*G0_0_1_4_9 - 0.00142302142302168*G0_0_1_5_0 + 0.000282138496424275*G0_0_1_5_2 - 0.000530184101612761*G0_0_1_5_3 - 0.00198212501783962*G0_0_1_5_4 - 0.00384865134865202*G0_0_1_5_5 - 0.00248233908948235*G0_0_1_5_6 - 0.00123126873126896*G0_0_1_5_7 + 0.000337341230198437*G0_0_1_5_8 + 0.00172541743970346*G0_0_1_5_9 + 0.00118145743145764*G0_0_1_6_0 + 0.000170444634730375*G0_0_1_6_1 + 0.000122655122655106*G0_0_1_6_2 - 0.000421542742971366*G0_0_1_6_3 + 0.00240366776081099*G0_0_1_6_4 - 0.00248233908948235*G0_0_1_6_5 + 0.0116897388325978*G0_0_1_6_6 + 0.000893927501070522*G0_0_1_6_7 - 0.000518945340373995*G0_0_1_6_8 - 0.0024907235621526*G0_0_1_6_9 - 0.000382117882118007*G0_0_1_7_0 + 0.000297500118928733*G0_0_1_7_1 - 0.000268045446616923*G0_0_1_7_2 - 0.0011283359497647*G0_0_1_7_3 - 0.000678785500214179*G0_0_1_7_4 - 0.00123126873126896*G0_0_1_7_5 + 0.000893927501070522*G0_0_1_7_6 - 0.000806693306693547*G0_0_1_7_7 - 0.00134882974168706*G0_0_1_7_8 + 0.000612244897959291*G0_0_1_7_9 + 0.000564851814851935*G0_0_1_8_0 - 0.000261048475334232*G0_0_1_8_1 + 0.000145588538445705*G0_0_1_8_2 + 0.00147531040388207*G0_0_1_8_3 - 0.000346974454117365*G0_0_1_8_4 + 0.000337341230198437*G0_0_1_8_5 - 0.000518945340373995*G0_0_1_8_6 - 0.00134882974168706*G0_0_1_8_7 + 0.00361602683031311*G0_0_1_8_8 + 0.00216640502354824*G0_0_1_8_9 - 0.000800033300033447*G0_0_1_9_0 - 0.000490818705104506*G0_0_1_9_1 + 0.00111126968269844*G0_0_1_9_2 + 0.00372912801484292*G0_0_1_9_3 + 0.000630440987583905*G0_0_1_9_4 + 0.00172541743970346*G0_0_1_9_5 - 0.0024907235621526*G0_0_1_9_6 + 0.000612244897959291*G0_0_1_9_7 + 0.00216640502354824*G0_0_1_9_8 - 0.0196132438989615*G0_0_1_9_9 - 0.0113605530272218*G0_1_0_0_0 - 0.000331584200631876*G0_1_0_0_1 - 0.000148328303090237*G0_1_0_0_2 + 0.000505109969395781*G0_1_0_0_3 + 0.000381186274043483*G0_1_0_0_4 + 0.00054647733219169*G0_1_0_0_5 - 0.00103931782503237*G0_1_0_0_7 + 0.00116609580895319*G0_1_0_0_8 + 0.0008020550877695*G0_1_0_0_9 - 0.000331584200631876*G0_1_0_1_0 - 0.0113344063344081*G0_1_0_1_1 - 0.000173479518717636*G0_1_0_1_2 - 0.00134060384060401*G0_1_0_1_3 - 0.000920547706262171*G0_1_0_1_4 - 0.000139007817579272*G0_1_0_1_6 + 0.000898744113029926*G0_1_0_1_7 - 0.000918248418248477*G0_1_0_1_8 + 0.00111126968269845*G0_1_0_1_9 - 0.000148328303090237*G0_1_0_2_0 - 0.000173479518717636*G0_1_0_2_1 + 0.00801599634933103*G0_1_0_2_2 + 0.000318015318015366*G0_1_0_2_3 - 0.0036938061938068*G0_1_0_2_4 + 0.000904095904096065*G0_1_0_2_5 - 0.0011896436896439*G0_1_0_2_6 + 0.000355973391687744*G0_1_0_2_8 - 0.00209290709290744*G0_1_0_2_9 + 0.000505109969395781*G0_1_0_3_0 - 0.00134060384060401*G0_1_0_3_1 + 0.000318015318015367*G0_1_0_3_2 + 0.0510254031682689*G0_1_0_3_3 + 0.0081195590124175*G0_1_0_3_4 - 0.000827386898815579*G0_1_0_3_5 + 0.000506814613957546*G0_1_0_3_6 - 0.00142553874696757*G0_1_0_3_7 + 0.00240366776081105*G0_1_0_3_8 - 0.000482731554160203*G0_1_0_3_9 + 0.000381186274043483*G0_1_0_4_0 - 0.000920547706262171*G0_1_0_4_1 - 0.0036938061938068*G0_1_0_4_2 + 0.0081195590124175*G0_1_0_4_3 + 0.00447552447552535*G0_1_0_4_4 - 0.0010537676609107*G0_1_0_4_5 + 0.000546953046953155*G0_1_0_4_6 - 0.000530184101612755*G0_1_0_4_7 - 0.000978129013843487*G0_1_0_4_8 + 0.00838625660054374*G0_1_0_4_9 + 0.00054647733219169*G0_1_0_5_0 + 0.000904095904096065*G0_1_0_5_2 - 0.000827386898815579*G0_1_0_5_3 - 0.0010537676609107*G0_1_0_5_4 + 0.0346275153418068*G0_1_0_5_5 - 0.00134882974168711*G0_1_0_5_6 - 0.00030291137434004*G0_1_0_5_7 - 0.00248644212929971*G0_1_0_5_9 - 0.000139007817579272*G0_1_0_6_1 - 0.0011896436896439*G0_1_0_6_2 + 0.000506814613957546*G0_1_0_6_3 + 0.000546953046953155*G0_1_0_6_4 - 0.0013488297416871*G0_1_0_6_5 - 0.0318181818181872*G0_1_0_6_6 + 0.000262772941344426*G0_1_0_6_7 - 0.00037034394177259*G0_1_0_6_8 + 0.00526509205080724*G0_1_0_6_9 - 0.00103931782503237*G0_1_0_7_0 + 0.000898744113029926*G0_1_0_7_1 - 0.00142553874696757*G0_1_0_7_3 - 0.000530184101612755*G0_1_0_7_4 - 0.00030291137434004*G0_1_0_7_5 + 0.000262772941344426*G0_1_0_7_6 + 0.0042250606536327*G0_1_0_7_7 - 0.00361584843727762*G0_1_0_7_8 - 0.00293171114599737*G0_1_0_7_9 + 0.00116609580895319*G0_1_0_8_0 - 0.000918248418248476*G0_1_0_8_1 + 0.000355973391687744*G0_1_0_8_2 + 0.00240366776081105*G0_1_0_8_3 - 0.000978129013843487*G0_1_0_8_4 - 0.00037034394177259*G0_1_0_8_6 - 0.00361584843727762*G0_1_0_8_7 + 0.00864778079063953*G0_1_0_8_8 - 0.00137755102040837*G0_1_0_8_9 + 0.0008020550877695*G0_1_0_9_0 + 0.00111126968269845*G0_1_0_9_1 - 0.00209290709290744*G0_1_0_9_2 - 0.000482731554160203*G0_1_0_9_3 + 0.00838625660054374*G0_1_0_9_4 - 0.00248644212929971*G0_1_0_9_5 + 0.00526509205080724*G0_1_0_9_6 - 0.00293171114599737*G0_1_0_9_7 - 0.00137755102040837*G0_1_0_9_8 - 0.0196132438989615*G0_1_0_9_9 - 0.00168535168535209*G0_1_1_0_0 - 0.000239956251861065*G0_1_1_0_1 - 0.000148328303090237*G0_1_1_0_2 + 0.000690638726353131*G0_1_1_0_3 + 0.000406042370328157*G0_1_1_0_4 - 0.000382117882117966*G0_1_1_0_5 + 0.000564851814851924*G0_1_1_0_6 - 0.00142302142302173*G0_1_1_0_7 + 0.00118145743145766*G0_1_1_0_8 - 0.000800033300033443*G0_1_1_0_9 - 0.000239956251861065*G0_1_1_1_0 - 0.0113344063344083*G0_1_1_1_1 - 0.000265107467488468*G0_1_1_1_2 - 0.0023815073815078*G0_1_1_1_3 - 0.000303942089656416*G0_1_1_1_4 - 0.00026804544661692*G0_1_1_1_5 + 0.000145588538445706*G0_1_1_1_6 + 0.000282138496424264*G0_1_1_1_7 + 0.000122655122655107*G0_1_1_1_8 + 0.00111126968269844*G0_1_1_1_9 - 0.000148328303090237*G0_1_1_2_0 - 0.000265107467488468*G0_1_1_2_1 - 0.00165920499253864*G0_1_1_2_2 + 0.000302653695510889*G0_1_1_2_3 - 0.00331010259581744*G0_1_1_2_4 + 0.000297500118928745*G0_1_1_2_5 - 0.000261048475334241*G0_1_1_2_6 + 0.000170444634730375*G0_1_1_2_8 - 0.000490818705104501*G0_1_1_2_9 + 0.000690638726353131*G0_1_1_3_0 - 0.0023815073815078*G0_1_1_3_1 + 0.00030265369551089*G0_1_1_3_2 + 0.0479834451263103*G0_1_1_3_3 + 0.00698604966462228*G0_1_1_3_4 - 0.000678785500214169*G0_1_1_3_5 - 0.000346974454117364*G0_1_1_3_6 - 0.00198212501783962*G0_1_1_3_7 + 0.00240366776081099*G0_1_1_3_8 + 0.00063044098758394*G0_1_1_3_9 + 0.000406042370328157*G0_1_1_4_0 - 0.000303942089656416*G0_1_1_4_1 - 0.00331010259581744*G0_1_1_4_2 + 0.00698604966462228*G0_1_1_4_3 + 0.0125492364778101*G0_1_1_4_4 - 0.00112833594976471*G0_1_1_4_5 + 0.00147531040388208*G0_1_1_4_6 - 0.000530184101612767*G0_1_1_4_7 - 0.000421542742971375*G0_1_1_4_8 + 0.00372912801484293*G0_1_1_4_9 - 0.000382117882117966*G0_1_1_5_0 - 0.00026804544661692*G0_1_1_5_1 + 0.000297500118928746*G0_1_1_5_2 - 0.000678785500214169*G0_1_1_5_3 - 0.00112833594976471*G0_1_1_5_4 - 0.000806693306693451*G0_1_1_5_5 - 0.00134882974168712*G0_1_1_5_6 - 0.00123126873126896*G0_1_1_5_7 + 0.000893927501070521*G0_1_1_5_8 + 0.000612244897959286*G0_1_1_5_9 + 0.000564851814851924*G0_1_1_6_0 + 0.000145588538445706*G0_1_1_6_1 - 0.000261048475334241*G0_1_1_6_2 - 0.000346974454117364*G0_1_1_6_3 + 0.00147531040388208*G0_1_1_6_4 - 0.00134882974168712*G0_1_1_6_5 + 0.00361602683031312*G0_1_1_6_6 + 0.000337341230198439*G0_1_1_6_7 - 0.000518945340373998*G0_1_1_6_8 + 0.00216640502354823*G0_1_1_6_9 - 0.00142302142302173*G0_1_1_7_0 + 0.000282138496424264*G0_1_1_7_1 - 0.00198212501783962*G0_1_1_7_3 - 0.000530184101612767*G0_1_1_7_4 - 0.00123126873126896*G0_1_1_7_5 + 0.000337341230198439*G0_1_1_7_6 - 0.00384865134865211*G0_1_1_7_7 - 0.00248233908948229*G0_1_1_7_8 + 0.00172541743970344*G0_1_1_7_9 + 0.00118145743145766*G0_1_1_8_0 + 0.000122655122655108*G0_1_1_8_1 + 0.000170444634730375*G0_1_1_8_2 + 0.00240366776081099*G0_1_1_8_3 - 0.000421542742971375*G0_1_1_8_4 + 0.000893927501070521*G0_1_1_8_5 - 0.000518945340373998*G0_1_1_8_6 - 0.00248233908948229*G0_1_1_8_7 + 0.0116897388325979*G0_1_1_8_8 - 0.00249072356215256*G0_1_1_8_9 - 0.000800033300033443*G0_1_1_9_0 + 0.00111126968269844*G0_1_1_9_1 - 0.000490818705104501*G0_1_1_9_2 + 0.00063044098758394*G0_1_1_9_3 + 0.00372912801484293*G0_1_1_9_4 + 0.000612244897959285*G0_1_1_9_5 + 0.00216640502354823*G0_1_1_9_6 + 0.00172541743970344*G0_1_1_9_7 - 0.00249072356215256*G0_1_1_9_8 - 0.0196132438989615*G0_1_1_9_9; + A[4] = A[60] + 0.000284596356024978*G0_0_1_0_3 - 0.000284596356024974*G0_0_1_0_4 + 0.00104090354090373*G0_0_1_0_5 - 0.000616605616605722*G0_0_1_0_6 - 0.0010409035409037*G0_0_1_0_7 + 0.000616605616605714*G0_0_1_0_8 - 0.00967520134186971*G0_0_1_1_1 + 0.000928595214309638*G0_0_1_1_3 - 0.000606595785167312*G0_0_1_1_4 - 0.000185528756957357*G0_0_1_1_5 + 0.000383703597989352*G0_0_1_1_8 + 0.00160208838780294*G0_0_1_1_9 + 0.00967520134186971*G0_0_1_2_2 + 0.000606595785167307*G0_0_1_2_3 - 0.000928595214309652*G0_0_1_2_4 - 0.000383703597989346*G0_0_1_2_6 + 0.000185528756957362*G0_0_1_2_7 - 0.00160208838780294*G0_0_1_2_9 + 0.000284596356024978*G0_0_1_3_0 + 0.000928595214309639*G0_0_1_3_1 + 0.000606595785167308*G0_0_1_3_2 + 0.0354342086485004*G0_0_1_3_3 - 0.000148601398601411*G0_0_1_3_5 - 0.000853789068074924*G0_0_1_3_7 + 0.000928357356928937*G0_0_1_3_8 - 0.00309868702725897*G0_0_1_3_9 - 0.000284596356024975*G0_0_1_4_0 - 0.000606595785167312*G0_0_1_4_1 - 0.000928595214309652*G0_0_1_4_2 - 0.0354342086485003*G0_0_1_4_4 + 0.000853789068074903*G0_0_1_4_5 - 0.000928357356928914*G0_0_1_4_6 + 0.000148601398601413*G0_0_1_4_7 + 0.00309868702725903*G0_0_1_4_9 + 0.00104090354090373*G0_0_1_5_0 - 0.000185528756957357*G0_0_1_5_1 - 0.000148601398601411*G0_0_1_5_3 + 0.000853789068074903*G0_0_1_5_4 + 0.00304195804195859*G0_0_1_5_5 + 0.00113350934779522*G0_0_1_5_6 + 0.000556586270872077*G0_0_1_5_8 - 0.00111317254174418*G0_0_1_5_9 - 0.000616605616605722*G0_0_1_6_0 - 0.000383703597989346*G0_0_1_6_2 - 0.000928357356928913*G0_0_1_6_4 + 0.00113350934779522*G0_0_1_6_5 - 0.00807371200228474*G0_0_1_6_6 - 0.00055658627087209*G0_0_1_6_7 + 0.00465712858570082*G0_0_1_6_9 - 0.0010409035409037*G0_0_1_7_0 + 0.000185528756957362*G0_0_1_7_2 - 0.000853789068074924*G0_0_1_7_3 + 0.000148601398601413*G0_0_1_7_4 - 0.000556586270872089*G0_0_1_7_6 - 0.00304195804195851*G0_0_1_7_7 - 0.00113350934779527*G0_0_1_7_8 + 0.00111317254174415*G0_0_1_7_9 + 0.000616605616605715*G0_0_1_8_0 + 0.000383703597989353*G0_0_1_8_1 + 0.000928357356928937*G0_0_1_8_3 + 0.000556586270872077*G0_0_1_8_5 - 0.00113350934779527*G0_0_1_8_7 + 0.00807371200228484*G0_0_1_8_8 - 0.00465712858570079*G0_0_1_8_9 + 0.00160208838780294*G0_0_1_9_1 - 0.00160208838780294*G0_0_1_9_2 - 0.00309868702725897*G0_0_1_9_3 + 0.00309868702725903*G0_0_1_9_4 - 0.00111317254174418*G0_0_1_9_5 + 0.00465712858570082*G0_0_1_9_6 + 0.00111317254174415*G0_0_1_9_7 - 0.00465712858570079*G0_0_1_9_8 - 0.000284596356024978*G0_1_0_0_3 + 0.000284596356024974*G0_1_0_0_4 - 0.00104090354090373*G0_1_0_0_5 + 0.000616605616605722*G0_1_0_0_6 + 0.0010409035409037*G0_1_0_0_7 - 0.000616605616605714*G0_1_0_0_8 + 0.00967520134186971*G0_1_0_1_1 - 0.000928595214309639*G0_1_0_1_3 + 0.000606595785167312*G0_1_0_1_4 + 0.000185528756957356*G0_1_0_1_5 - 0.000383703597989352*G0_1_0_1_8 - 0.00160208838780294*G0_1_0_1_9 - 0.00967520134186971*G0_1_0_2_2 - 0.000606595785167307*G0_1_0_2_3 + 0.000928595214309652*G0_1_0_2_4 + 0.000383703597989346*G0_1_0_2_6 - 0.000185528756957362*G0_1_0_2_7 + 0.00160208838780294*G0_1_0_2_9 - 0.000284596356024978*G0_1_0_3_0 - 0.000928595214309639*G0_1_0_3_1 - 0.000606595785167308*G0_1_0_3_2 - 0.0354342086485004*G0_1_0_3_3 + 0.000148601398601411*G0_1_0_3_5 + 0.000853789068074924*G0_1_0_3_7 - 0.000928357356928938*G0_1_0_3_8 + 0.00309868702725897*G0_1_0_3_9 + 0.000284596356024975*G0_1_0_4_0 + 0.000606595785167312*G0_1_0_4_1 + 0.000928595214309652*G0_1_0_4_2 + 0.0354342086485003*G0_1_0_4_4 - 0.000853789068074903*G0_1_0_4_5 + 0.000928357356928914*G0_1_0_4_6 - 0.000148601398601413*G0_1_0_4_7 - 0.00309868702725903*G0_1_0_4_9 - 0.00104090354090373*G0_1_0_5_0 + 0.000185528756957357*G0_1_0_5_1 + 0.000148601398601411*G0_1_0_5_3 - 0.000853789068074903*G0_1_0_5_4 - 0.00304195804195859*G0_1_0_5_5 - 0.00113350934779522*G0_1_0_5_6 - 0.000556586270872077*G0_1_0_5_8 + 0.00111317254174418*G0_1_0_5_9 + 0.000616605616605722*G0_1_0_6_0 + 0.000383703597989346*G0_1_0_6_2 + 0.000928357356928913*G0_1_0_6_4 - 0.00113350934779522*G0_1_0_6_5 + 0.00807371200228474*G0_1_0_6_6 + 0.000556586270872089*G0_1_0_6_7 - 0.00465712858570082*G0_1_0_6_9 + 0.0010409035409037*G0_1_0_7_0 - 0.000185528756957362*G0_1_0_7_2 + 0.000853789068074924*G0_1_0_7_3 - 0.000148601398601413*G0_1_0_7_4 + 0.00055658627087209*G0_1_0_7_6 + 0.00304195804195851*G0_1_0_7_7 + 0.00113350934779527*G0_1_0_7_8 - 0.00111317254174415*G0_1_0_7_9 - 0.000616605616605715*G0_1_0_8_0 - 0.000383703597989353*G0_1_0_8_1 - 0.000928357356928937*G0_1_0_8_3 - 0.000556586270872077*G0_1_0_8_5 + 0.00113350934779527*G0_1_0_8_7 - 0.00807371200228484*G0_1_0_8_8 + 0.00465712858570079*G0_1_0_8_9 - 0.00160208838780294*G0_1_0_9_1 + 0.00160208838780294*G0_1_0_9_2 + 0.00309868702725897*G0_1_0_9_3 - 0.00309868702725902*G0_1_0_9_4 + 0.00111317254174418*G0_1_0_9_5 - 0.00465712858570082*G0_1_0_9_6 - 0.00111317254174415*G0_1_0_9_7 + 0.00465712858570079*G0_1_0_9_8; + A[187] = A[117] - 0.0379472379472442*G0_0_1_0_0 - 0.00208236208236244*G0_0_1_0_1 - 0.000473600473600535*G0_0_1_0_2 - 0.00151848151848175*G0_0_1_0_3 + 0.0185148185148218*G0_0_1_0_5 + 0.00237096237096268*G0_0_1_0_6 - 0.0267732267732313*G0_0_1_0_7 + 0.0114285714285733*G0_0_1_0_8 + 0.0115084915084934*G0_0_1_0_9 - 0.00208236208236244*G0_0_1_1_0 - 0.000779749351178105*G0_0_1_1_1 + 0.000544006258292058*G0_0_1_1_2 + 0.00207601921887669*G0_0_1_1_3 - 0.0032729175586324*G0_0_1_1_4 + 0.017639503353792*G0_0_1_1_5 - 0.0100585129156575*G0_0_1_1_6 - 0.00205508776937382*G0_0_1_1_7 + 0.00152419009561888*G0_0_1_1_8 - 0.00461253032681684*G0_0_1_1_9 - 0.000473600473600535*G0_0_1_2_0 + 0.000544006258292058*G0_0_1_2_1 - 0.014563214563217*G0_0_1_2_2 + 0.00122163550735001*G0_0_1_2_3 - 0.00839160839160984*G0_0_1_2_4 + 0.0235992578849762*G0_0_1_2_5 + 0.0037562437562444*G0_0_1_2_6 - 0.0028599971457119*G0_0_1_2_7 - 0.00419009561866775*G0_0_1_2_8 + 0.00666761809619067*G0_0_1_2_9 - 0.00151848151848175*G0_0_1_3_0 + 0.00207601921887669*G0_0_1_3_1 + 0.00122163550735002*G0_0_1_3_2 - 0.0173312401883862*G0_0_1_3_3 + 0.011183102611676*G0_0_1_3_4 - 0.0207906379334985*G0_0_1_3_5 + 0.0233937491080388*G0_0_1_3_6 - 0.00222634508348827*G0_0_1_3_7 - 0.0035621521335813*G0_0_1_3_8 + 0.0182902811474271*G0_0_1_3_9 - 0.00327291755863239*G0_0_1_4_1 - 0.00839160839160983*G0_0_1_4_2 + 0.011183102611676*G0_0_1_4_3 - 0.049082346225212*G0_0_1_4_4 - 0.00666190951905347*G0_0_1_4_5 - 0.0167318395889854*G0_0_1_4_6 + 0.00774083059797477*G0_0_1_4_7 + 0.00578849721706962*G0_0_1_4_8 - 0.00667903525046509*G0_0_1_4_9 + 0.0185148185148218*G0_0_1_5_0 + 0.017639503353792*G0_0_1_5_1 + 0.0235992578849762*G0_0_1_5_2 - 0.0207906379334985*G0_0_1_5_3 - 0.00666190951905348*G0_0_1_5_4 + 0.670369630369743*G0_0_1_5_5 - 0.129470529470551*G0_0_1_5_6 + 0.0579020979021076*G0_0_1_5_7 - 0.0597002997003098*G0_0_1_5_8 + 0.0848751248751395*G0_0_1_5_9 + 0.00237096237096268*G0_0_1_6_0 - 0.0100585129156575*G0_0_1_6_1 + 0.0037562437562444*G0_0_1_6_2 + 0.0233937491080388*G0_0_1_6_3 - 0.0167318395889854*G0_0_1_6_4 - 0.129470529470551*G0_0_1_6_5 - 0.0723390894819592*G0_0_1_6_6 + 0.00179820179820209*G0_0_1_6_7 + 0.0247638076209547*G0_0_1_6_8 - 0.0667903525046497*G0_0_1_6_9 - 0.0267732267732313*G0_0_1_7_0 - 0.00205508776937383*G0_0_1_7_1 - 0.0028599971457119*G0_0_1_7_2 - 0.00222634508348827*G0_0_1_7_3 + 0.00774083059797477*G0_0_1_7_4 + 0.0579020979021076*G0_0_1_7_5 + 0.00179820179820209*G0_0_1_7_6 - 0.107652347652366*G0_0_1_7_7 + 0.0135464535464559*G0_0_1_7_8 - 0.0381218781218846*G0_0_1_7_9 + 0.0114285714285733*G0_0_1_8_0 + 0.00152419009561888*G0_0_1_8_1 - 0.00419009561866775*G0_0_1_8_2 - 0.0035621521335813*G0_0_1_8_3 + 0.00578849721706962*G0_0_1_8_4 - 0.0597002997003098*G0_0_1_8_5 + 0.0247638076209547*G0_0_1_8_6 + 0.0135464535464559*G0_0_1_8_7 - 0.00952190666476539*G0_0_1_8_8 + 0.00226059654631124*G0_0_1_8_9 + 0.0115084915084934*G0_0_1_9_0 - 0.00461253032681684*G0_0_1_9_1 + 0.00666761809619067*G0_0_1_9_2 + 0.0182902811474271*G0_0_1_9_3 - 0.00667903525046508*G0_0_1_9_4 + 0.0848751248751395*G0_0_1_9_5 - 0.0667903525046497*G0_0_1_9_6 - 0.0381218781218846*G0_0_1_9_7 + 0.00226059654631126*G0_0_1_9_8 - 0.231813900385367*G0_0_1_9_9 + 0.0379472379472442*G0_1_0_0_0 + 0.00208236208236244*G0_1_0_0_1 + 0.000473600473600535*G0_1_0_0_2 + 0.00151848151848174*G0_1_0_0_3 - 0.0185148185148218*G0_1_0_0_5 - 0.00237096237096268*G0_1_0_0_6 + 0.0267732267732313*G0_1_0_0_7 - 0.0114285714285733*G0_1_0_0_8 - 0.0115084915084934*G0_1_0_0_9 + 0.00208236208236244*G0_1_0_1_0 + 0.000779749351178104*G0_1_0_1_1 - 0.000544006258292058*G0_1_0_1_2 - 0.00207601921887669*G0_1_0_1_3 + 0.0032729175586324*G0_1_0_1_4 - 0.017639503353792*G0_1_0_1_5 + 0.0100585129156575*G0_1_0_1_6 + 0.00205508776937383*G0_1_0_1_7 - 0.00152419009561888*G0_1_0_1_8 + 0.00461253032681684*G0_1_0_1_9 + 0.000473600473600535*G0_1_0_2_0 - 0.000544006258292058*G0_1_0_2_1 + 0.014563214563217*G0_1_0_2_2 - 0.00122163550735002*G0_1_0_2_3 + 0.00839160839160984*G0_1_0_2_4 - 0.0235992578849762*G0_1_0_2_5 - 0.0037562437562444*G0_1_0_2_6 + 0.0028599971457119*G0_1_0_2_7 + 0.00419009561866775*G0_1_0_2_8 - 0.00666761809619067*G0_1_0_2_9 + 0.00151848151848174*G0_1_0_3_0 - 0.00207601921887669*G0_1_0_3_1 - 0.00122163550735002*G0_1_0_3_2 + 0.0173312401883862*G0_1_0_3_3 - 0.011183102611676*G0_1_0_3_4 + 0.0207906379334985*G0_1_0_3_5 - 0.0233937491080388*G0_1_0_3_6 + 0.00222634508348827*G0_1_0_3_7 + 0.0035621521335813*G0_1_0_3_8 - 0.0182902811474271*G0_1_0_3_9 + 0.0032729175586324*G0_1_0_4_1 + 0.00839160839160983*G0_1_0_4_2 - 0.011183102611676*G0_1_0_4_3 + 0.049082346225212*G0_1_0_4_4 + 0.00666190951905347*G0_1_0_4_5 + 0.0167318395889854*G0_1_0_4_6 - 0.00774083059797477*G0_1_0_4_7 - 0.00578849721706962*G0_1_0_4_8 + 0.00667903525046507*G0_1_0_4_9 - 0.0185148185148218*G0_1_0_5_0 - 0.017639503353792*G0_1_0_5_1 - 0.0235992578849762*G0_1_0_5_2 + 0.0207906379334985*G0_1_0_5_3 + 0.00666190951905347*G0_1_0_5_4 - 0.670369630369743*G0_1_0_5_5 + 0.129470529470551*G0_1_0_5_6 - 0.0579020979021076*G0_1_0_5_7 + 0.0597002997003098*G0_1_0_5_8 - 0.0848751248751395*G0_1_0_5_9 - 0.00237096237096268*G0_1_0_6_0 + 0.0100585129156575*G0_1_0_6_1 - 0.0037562437562444*G0_1_0_6_2 - 0.0233937491080388*G0_1_0_6_3 + 0.0167318395889854*G0_1_0_6_4 + 0.129470529470551*G0_1_0_6_5 + 0.0723390894819592*G0_1_0_6_6 - 0.00179820179820209*G0_1_0_6_7 - 0.0247638076209547*G0_1_0_6_8 + 0.0667903525046497*G0_1_0_6_9 + 0.0267732267732313*G0_1_0_7_0 + 0.00205508776937383*G0_1_0_7_1 + 0.0028599971457119*G0_1_0_7_2 + 0.00222634508348827*G0_1_0_7_3 - 0.00774083059797477*G0_1_0_7_4 - 0.0579020979021076*G0_1_0_7_5 - 0.00179820179820209*G0_1_0_7_6 + 0.107652347652366*G0_1_0_7_7 - 0.0135464535464559*G0_1_0_7_8 + 0.0381218781218846*G0_1_0_7_9 - 0.0114285714285733*G0_1_0_8_0 - 0.00152419009561888*G0_1_0_8_1 + 0.00419009561866775*G0_1_0_8_2 + 0.0035621521335813*G0_1_0_8_3 - 0.00578849721706962*G0_1_0_8_4 + 0.0597002997003098*G0_1_0_8_5 - 0.0247638076209547*G0_1_0_8_6 - 0.0135464535464559*G0_1_0_8_7 + 0.00952190666476539*G0_1_0_8_8 - 0.00226059654631126*G0_1_0_8_9 - 0.0115084915084934*G0_1_0_9_0 + 0.00461253032681684*G0_1_0_9_1 - 0.00666761809619067*G0_1_0_9_2 - 0.0182902811474271*G0_1_0_9_3 + 0.00667903525046505*G0_1_0_9_4 - 0.0848751248751395*G0_1_0_9_5 + 0.0667903525046497*G0_1_0_9_6 + 0.0381218781218846*G0_1_0_9_7 - 0.00226059654631126*G0_1_0_9_8 + 0.231813900385367*G0_1_0_9_9; + A[15] = A[1] + 0.0108191962358648*G0_0_1_0_0 + 0.00052394860430584*G0_0_1_0_1 + 0.000620316081625712*G0_0_1_0_2 + 0.000227512236440846*G0_0_1_0_3 - 0.000174902808831411*G0_0_1_0_4 + 0.00659231971732086*G0_0_1_0_5 - 0.00269179894179941*G0_0_1_0_6 + 0.00189433251933284*G0_0_1_0_7 - 0.0011546324046326*G0_0_1_0_8 + 0.000290959040959096*G0_0_1_0_9 + 0.00052394860430584*G0_0_1_1_0 + 0.0108191962358648*G0_0_1_1_1 + 0.000620316081625709*G0_0_1_1_2 + 0.00659231971732083*G0_0_1_1_3 - 0.00269179894179939*G0_0_1_1_4 + 0.000227512236440843*G0_0_1_1_5 - 0.000174902808831409*G0_0_1_1_6 - 0.00115463240463261*G0_0_1_1_7 + 0.00189433251933286*G0_0_1_1_8 + 0.000290959040959094*G0_0_1_1_9 + 0.000620316081625712*G0_0_1_2_0 + 0.000620316081625709*G0_0_1_2_1 - 0.000626774019631279*G0_0_1_2_2 + 0.00087321408749995*G0_0_1_2_3 - 0.000135291296005608*G0_0_1_2_4 + 0.000873214087499953*G0_0_1_2_5 - 0.000135291296005609*G0_0_1_2_6 + 0.000436963829821046*G0_0_1_2_9 + 0.000227512236440846*G0_0_1_3_0 + 0.00659231971732083*G0_0_1_3_1 + 0.00087321408749995*G0_0_1_3_2 + 0.0107513320013338*G0_0_1_3_3 - 0.00481814316635826*G0_0_1_3_4 - 0.000427816231387733*G0_0_1_3_5 - 0.00119197766519216*G0_0_1_3_7 + 0.00170891608391638*G0_0_1_3_8 + 0.00151107820750704*G0_0_1_3_9 - 0.000174902808831411*G0_0_1_4_0 - 0.0026917989417994*G0_0_1_4_1 - 0.000135291296005608*G0_0_1_4_2 - 0.00481814316635826*G0_0_1_4_3 + 0.00261839351125108*G0_0_1_4_4 + 0.000513325959754621*G0_0_1_4_7 - 0.000516938418724224*G0_0_1_4_8 - 0.00134142643071238*G0_0_1_4_9 + 0.00659231971732086*G0_0_1_5_0 + 0.000227512236440843*G0_0_1_5_1 + 0.000873214087499953*G0_0_1_5_2 - 0.000427816231387733*G0_0_1_5_3 + 0.0107513320013338*G0_0_1_5_5 - 0.00481814316635827*G0_0_1_5_6 + 0.00170891608391637*G0_0_1_5_7 - 0.00119197766519215*G0_0_1_5_8 + 0.00151107820750704*G0_0_1_5_9 - 0.00269179894179941*G0_0_1_6_0 - 0.000174902808831409*G0_0_1_6_1 - 0.000135291296005609*G0_0_1_6_2 - 0.00481814316635827*G0_0_1_6_5 + 0.00261839351125109*G0_0_1_6_6 - 0.000516938418724218*G0_0_1_6_7 + 0.000513325959754618*G0_0_1_6_8 - 0.00134142643071238*G0_0_1_6_9 + 0.00189433251933284*G0_0_1_7_0 - 0.00115463240463261*G0_0_1_7_1 - 0.00119197766519216*G0_0_1_7_3 + 0.000513325959754621*G0_0_1_7_4 + 0.00170891608391637*G0_0_1_7_5 - 0.000516938418724218*G0_0_1_7_6 - 0.00248709623709666*G0_0_1_7_7 + 0.000727858451072848*G0_0_1_7_8 + 0.000160999714571166*G0_0_1_7_9 - 0.0011546324046326*G0_0_1_8_0 + 0.00189433251933286*G0_0_1_8_1 + 0.00170891608391638*G0_0_1_8_3 - 0.000516938418724224*G0_0_1_8_4 - 0.00119197766519215*G0_0_1_8_5 + 0.000513325959754618*G0_0_1_8_6 + 0.000727858451072848*G0_0_1_8_7 - 0.00248709623709663*G0_0_1_8_8 + 0.000160999714571174*G0_0_1_8_9 + 0.000290959040959096*G0_0_1_9_0 + 0.000290959040959094*G0_0_1_9_1 + 0.000436963829821046*G0_0_1_9_2 + 0.00151107820750704*G0_0_1_9_3 - 0.00134142643071238*G0_0_1_9_4 + 0.00151107820750704*G0_0_1_9_5 - 0.00134142643071238*G0_0_1_9_6 + 0.000160999714571166*G0_0_1_9_7 + 0.000160999714571174*G0_0_1_9_8 + 0.00183352361923822*G0_0_1_9_9 - 0.0108191962358648*G0_1_0_0_0 - 0.00052394860430584*G0_1_0_0_1 - 0.000620316081625712*G0_1_0_0_2 - 0.000227512236440846*G0_1_0_0_3 + 0.000174902808831411*G0_1_0_0_4 - 0.00659231971732086*G0_1_0_0_5 + 0.00269179894179941*G0_1_0_0_6 - 0.00189433251933284*G0_1_0_0_7 + 0.0011546324046326*G0_1_0_0_8 - 0.000290959040959096*G0_1_0_0_9 - 0.00052394860430584*G0_1_0_1_0 - 0.0108191962358648*G0_1_0_1_1 - 0.000620316081625709*G0_1_0_1_2 - 0.00659231971732083*G0_1_0_1_3 + 0.00269179894179939*G0_1_0_1_4 - 0.000227512236440843*G0_1_0_1_5 + 0.000174902808831409*G0_1_0_1_6 + 0.00115463240463261*G0_1_0_1_7 - 0.00189433251933286*G0_1_0_1_8 - 0.000290959040959094*G0_1_0_1_9 - 0.000620316081625712*G0_1_0_2_0 - 0.000620316081625709*G0_1_0_2_1 + 0.000626774019631279*G0_1_0_2_2 - 0.00087321408749995*G0_1_0_2_3 + 0.000135291296005608*G0_1_0_2_4 - 0.000873214087499953*G0_1_0_2_5 + 0.00013529129600561*G0_1_0_2_6 - 0.000436963829821046*G0_1_0_2_9 - 0.000227512236440846*G0_1_0_3_0 - 0.00659231971732083*G0_1_0_3_1 - 0.000873214087499949*G0_1_0_3_2 - 0.0107513320013338*G0_1_0_3_3 + 0.00481814316635826*G0_1_0_3_4 + 0.000427816231387733*G0_1_0_3_5 + 0.00119197766519216*G0_1_0_3_7 - 0.00170891608391638*G0_1_0_3_8 - 0.00151107820750704*G0_1_0_3_9 + 0.000174902808831411*G0_1_0_4_0 + 0.00269179894179939*G0_1_0_4_1 + 0.000135291296005608*G0_1_0_4_2 + 0.00481814316635826*G0_1_0_4_3 - 0.00261839351125108*G0_1_0_4_4 - 0.00051332595975462*G0_1_0_4_7 + 0.000516938418724224*G0_1_0_4_8 + 0.00134142643071238*G0_1_0_4_9 - 0.00659231971732086*G0_1_0_5_0 - 0.000227512236440843*G0_1_0_5_1 - 0.000873214087499953*G0_1_0_5_2 + 0.000427816231387733*G0_1_0_5_3 - 0.0107513320013338*G0_1_0_5_5 + 0.00481814316635827*G0_1_0_5_6 - 0.00170891608391637*G0_1_0_5_7 + 0.00119197766519215*G0_1_0_5_8 - 0.00151107820750704*G0_1_0_5_9 + 0.00269179894179941*G0_1_0_6_0 + 0.000174902808831409*G0_1_0_6_1 + 0.00013529129600561*G0_1_0_6_2 + 0.00481814316635827*G0_1_0_6_5 - 0.00261839351125109*G0_1_0_6_6 + 0.000516938418724218*G0_1_0_6_7 - 0.000513325959754618*G0_1_0_6_8 + 0.00134142643071238*G0_1_0_6_9 - 0.00189433251933284*G0_1_0_7_0 + 0.00115463240463261*G0_1_0_7_1 + 0.00119197766519216*G0_1_0_7_3 - 0.00051332595975462*G0_1_0_7_4 - 0.00170891608391637*G0_1_0_7_5 + 0.000516938418724218*G0_1_0_7_6 + 0.00248709623709666*G0_1_0_7_7 - 0.000727858451072849*G0_1_0_7_8 - 0.000160999714571166*G0_1_0_7_9 + 0.0011546324046326*G0_1_0_8_0 - 0.00189433251933286*G0_1_0_8_1 - 0.00170891608391638*G0_1_0_8_3 + 0.000516938418724224*G0_1_0_8_4 + 0.00119197766519215*G0_1_0_8_5 - 0.000513325959754618*G0_1_0_8_6 - 0.000727858451072849*G0_1_0_8_7 + 0.00248709623709663*G0_1_0_8_8 - 0.000160999714571174*G0_1_0_8_9 - 0.000290959040959096*G0_1_0_9_0 - 0.000290959040959094*G0_1_0_9_1 - 0.000436963829821046*G0_1_0_9_2 - 0.00151107820750704*G0_1_0_9_3 + 0.00134142643071238*G0_1_0_9_4 - 0.00151107820750704*G0_1_0_9_5 + 0.00134142643071238*G0_1_0_9_6 - 0.000160999714571166*G0_1_0_9_7 - 0.000160999714571174*G0_1_0_9_8 - 0.00183352361923822*G0_1_0_9_9; + A[37] = -0.000546983880317323*G0_1_0_0_0 + 0.000270961401913831*G0_1_0_0_1 + 0.00480046188379603*G0_1_0_0_2 - 0.00165729112157712*G0_1_0_0_3 + 0.00393675768675837*G0_1_0_0_4 - 0.00153616225044823*G0_1_0_0_5 + 0.000815712065712192*G0_1_0_0_6 - 0.000921657707372161*G0_1_0_0_7 + 0.000340235161663799*G0_1_0_0_8 + 0.00040304933162083*G0_1_0_0_9 + 0.000270961401913831*G0_1_0_1_0 + 0.000965859537288304*G0_1_0_1_1 + 0.0071167875334554*G0_1_0_1_2 - 0.0039672232529382*G0_1_0_1_3 + 0.00970904095904261*G0_1_0_1_4 - 0.00113685917257365*G0_1_0_1_5 + 0.00348720723720783*G0_1_0_1_6 - 0.000204616811759713*G0_1_0_1_7 - 0.000334784263355727*G0_1_0_1_8 + 0.00247906855049755*G0_1_0_1_9 + 0.00480046188379603*G0_1_0_2_0 + 0.00711678753345541*G0_1_0_2_1 + 0.139942464942488*G0_1_0_2_2 - 0.0327852702852757*G0_1_0_2_3 + 0.0754273504273631*G0_1_0_2_4 - 0.0208860583860618*G0_1_0_2_5 + 0.0372433122433184*G0_1_0_2_6 - 0.00115398490398509*G0_1_0_2_7 - 0.000651154401154497*G0_1_0_2_8 + 0.00532800532800619*G0_1_0_2_9 - 0.00165729112157712*G0_1_0_3_0 - 0.0039672232529382*G0_1_0_3_1 - 0.0327852702852757*G0_1_0_3_2 + 0.0172752247752277*G0_1_0_3_3 - 0.0454857642357719*G0_1_0_3_4 + 0.00624375624375728*G0_1_0_3_5 - 0.0145666833166858*G0_1_0_3_6 + 0.00086681175966904*G0_1_0_3_7 + 0.00128478664192973*G0_1_0_3_8 - 0.00917082917083071*G0_1_0_3_9 + 0.00393675768675837*G0_1_0_4_0 + 0.00970904095904261*G0_1_0_4_1 + 0.0754273504273631*G0_1_0_4_2 - 0.0454857642357719*G0_1_0_4_3 + 0.110864135864155*G0_1_0_4_4 - 0.0159153346653373*G0_1_0_4_5 + 0.0304820179820231*G0_1_0_4_6 - 0.00212162837162872*G0_1_0_4_7 - 0.00215159840159876*G0_1_0_4_8 + 0.015846653346656*G0_1_0_4_9 - 0.00153616225044823*G0_1_0_5_0 - 0.00113685917257365*G0_1_0_5_1 - 0.0208860583860618*G0_1_0_5_2 + 0.00624375624375728*G0_1_0_5_3 - 0.0159153346653373*G0_1_0_5_4 + 0.00972277722277885*G0_1_0_5_5 - 0.000980269730269788*G0_1_0_5_6 + 0.00133759098044835*G0_1_0_5_7 - 0.000694484087341352*G0_1_0_5_8 + 0.000179820179820223*G0_1_0_5_9 + 0.000815712065712192*G0_1_0_6_0 + 0.00348720723720783*G0_1_0_6_1 + 0.0372433122433184*G0_1_0_6_2 - 0.0145666833166858*G0_1_0_6_3 + 0.0304820179820231*G0_1_0_6_4 - 0.000980269730269788*G0_1_0_6_5 + 0.0110639360639378*G0_1_0_6_6 - 0.000643106893106993*G0_1_0_6_7 - 0.00220154845154883*G0_1_0_6_8 + 0.0131493506493529*G0_1_0_6_9 - 0.000921657707372161*G0_1_0_7_0 - 0.000204616811759713*G0_1_0_7_1 - 0.00115398490398509*G0_1_0_7_2 + 0.00086681175966904*G0_1_0_7_3 - 0.00212162837162872*G0_1_0_7_4 + 0.00133759098044835*G0_1_0_7_5 - 0.000643106893106993*G0_1_0_7_6 - 0.0027426145283293*G0_1_0_7_7 + 8.04552590266921e-05*G0_1_0_7_8 + 7.70657913515118e-05*G0_1_0_7_9 + 0.000340235161663799*G0_1_0_8_0 - 0.000334784263355727*G0_1_0_8_1 - 0.000651154401154497*G0_1_0_8_2 + 0.00128478664192973*G0_1_0_8_3 - 0.00215159840159876*G0_1_0_8_4 - 0.000694484087341352*G0_1_0_8_5 - 0.00220154845154883*G0_1_0_8_6 + 8.0455259026692e-05*G0_1_0_8_7 - 0.000387826459255041*G0_1_0_8_8 - 0.0031340088482951*G0_1_0_8_9 + 0.00040304933162083*G0_1_0_9_0 + 0.00247906855049755*G0_1_0_9_1 + 0.00532800532800619*G0_1_0_9_2 - 0.00917082917083071*G0_1_0_9_3 + 0.015846653346656*G0_1_0_9_4 + 0.000179820179820223*G0_1_0_9_5 + 0.0131493506493529*G0_1_0_9_6 + 7.70657913515117e-05*G0_1_0_9_7 - 0.0031340088482951*G0_1_0_9_8 + 0.0220279720279758*G0_1_0_9_9 + 0.016843588510258*G0_1_1_0_0 + 0.00134550634550658*G0_1_1_0_1 + 0.0038430088430095*G0_1_1_0_2 - 0.00122552051123502*G0_1_1_0_3 + 0.00276037454608932*G0_1_1_0_4 + 0.00496566925138437*G0_1_1_0_5 - 0.00325057878629363*G0_1_1_0_6 + 0.0123289805432683*G0_1_1_0_7 - 0.00560861757290423*G0_1_1_0_8 + 0.000501998001998106*G0_1_1_0_9 + 0.00134550634550658*G0_1_1_1_0 + 0.00082467796753528*G0_1_1_1_1 + 0.00630628630628737*G0_1_1_1_2 - 0.00342597878312221*G0_1_1_1_3 + 0.0080091337234208*G0_1_1_1_4 + 0.00100831707974582*G0_1_1_1_5 + 0.000902232687947126*G0_1_1_1_6 + 0.00255062397919583*G0_1_1_1_7 - 0.00200398807541696*G0_1_1_1_8 + 0.00253032681604153*G0_1_1_1_9 + 0.0038430088430095*G0_1_1_2_0 + 0.00630628630628737*G0_1_1_2_1 + 0.125027133360488*G0_1_1_2_2 - 0.0287769175269223*G0_1_1_2_3 + 0.0661602286602398*G0_1_1_2_4 - 0.0123794261294282*G0_1_1_2_5 + 0.0233294483294521*G0_1_1_2_6 + 0.0010275835275837*G0_1_1_2_7 - 0.000957930957931108*G0_1_1_2_8 + 0.00467615717615794*G0_1_1_2_9 - 0.00122552051123502*G0_1_1_3_0 - 0.00342597878312221*G0_1_1_3_1 - 0.0287769175269223*G0_1_1_3_2 + 0.0135478806907401*G0_1_1_3_3 - 0.0379545454545519*G0_1_1_3_4 + 0.00225292564578317*G0_1_1_3_5 - 0.00656093906094016*G0_1_1_3_6 - 0.000177679463393792*G0_1_1_3_7 + 0.00115812758669921*G0_1_1_3_8 - 0.00723562152133703*G0_1_1_3_9 + 0.00276037454608932*G0_1_1_4_0 + 0.0080091337234208*G0_1_1_4_1 + 0.0661602286602398*G0_1_1_4_2 - 0.0379545454545519*G0_1_1_4_3 + 0.0972252747252913*G0_1_1_4_4 - 0.0121353646353667*G0_1_1_4_5 + 0.0186963036963068*G0_1_1_4_6 - 0.00375481661196009*G0_1_1_4_7 - 0.000980448123305432*G0_1_1_4_8 + 0.0102422577422595*G0_1_1_4_9 + 0.00496566925138437*G0_1_1_5_0 + 0.00100831707974582*G0_1_1_5_1 - 0.0123794261294282*G0_1_1_5_2 + 0.00225292564578317*G0_1_1_5_3 - 0.0121353646353667*G0_1_1_5_4 + 0.027726202369064*G0_1_1_5_5 - 0.00227272727272756*G0_1_1_5_6 + 0.0138161838161861*G0_1_1_5_7 - 0.00687919223633623*G0_1_1_5_8 + 0.0122523904666782*G0_1_1_5_9 - 0.00325057878629363*G0_1_1_6_0 + 0.000902232687947125*G0_1_1_6_1 + 0.0233294483294521*G0_1_1_6_2 - 0.00656093906094016*G0_1_1_6_3 + 0.0186963036963068*G0_1_1_6_4 - 0.00227272727272756*G0_1_1_6_5 - 0.0187337662337695*G0_1_1_6_6 - 0.00693699157984988*G0_1_1_6_7 + 0.00201066790352537*G0_1_1_6_8 - 0.000906593406593513*G0_1_1_6_9 + 0.0123289805432683*G0_1_1_7_0 + 0.00255062397919583*G0_1_1_7_1 + 0.0010275835275837*G0_1_1_7_2 - 0.000177679463393792*G0_1_1_7_3 - 0.00375481661196009*G0_1_1_7_4 + 0.0138161838161861*G0_1_1_7_5 - 0.00693699157984988*G0_1_1_7_6 + 0.0506953760525274*G0_1_1_7_7 - 0.0102722277722295*G0_1_1_7_8 + 0.0123679891537055*G0_1_1_7_9 - 0.00560861757290423*G0_1_1_8_0 - 0.00200398807541696*G0_1_1_8_1 - 0.000957930957931108*G0_1_1_8_2 + 0.00115812758669921*G0_1_1_8_3 - 0.000980448123305432*G0_1_1_8_4 - 0.00687919223633623*G0_1_1_8_5 + 0.00201066790352537*G0_1_1_8_6 - 0.0102722277722295*G0_1_1_8_7 + 0.00786499215070781*G0_1_1_8_8 - 0.00563008420151373*G0_1_1_8_9 + 0.000501998001998106*G0_1_1_9_0 + 0.00253032681604153*G0_1_1_9_1 + 0.00467615717615794*G0_1_1_9_2 - 0.00723562152133703*G0_1_1_9_3 + 0.0102422577422595*G0_1_1_9_4 + 0.0122523904666782*G0_1_1_9_5 - 0.000906593406593512*G0_1_1_9_6 + 0.0123679891537055*G0_1_1_9_7 - 0.00563008420151373*G0_1_1_9_8 + 0.0352704438418783*G0_1_1_9_9; + A[160] = 0.1870921670922*G0_0_0_0_0 + 0.0128221513935822*G0_0_0_0_1 + 0.0124117416974581*G0_0_0_0_2 + 0.0124389895818488*G0_0_0_0_3 - 0.00620879120879228*G0_0_0_0_4 + 0.119565434565455*G0_0_0_0_5 - 0.0526709005280525*G0_0_0_0_6 + 0.0507109557109644*G0_0_0_0_7 - 0.00998691784406245*G0_0_0_0_8 + 0.0128343085485966*G0_0_0_0_9 + 0.0128221513935822*G0_0_0_1_0 + 0.187092167092199*G0_0_0_1_1 + 0.0124117416974581*G0_0_0_1_2 + 0.119565434565455*G0_0_0_1_3 - 0.0526709005280523*G0_0_0_1_4 + 0.0124389895818488*G0_0_0_1_5 - 0.00620879120879224*G0_0_0_1_6 - 0.00998691784406254*G0_0_0_1_7 + 0.0507109557109645*G0_0_0_1_8 + 0.0128343085485965*G0_0_0_1_9 + 0.0124117416974581*G0_0_0_2_0 + 0.0124117416974581*G0_0_0_2_1 + 0.00610246895961284*G0_0_0_2_2 + 0.0238413966985436*G0_0_0_2_3 - 0.0148113790970959*G0_0_0_2_4 + 0.0238413966985436*G0_0_0_2_5 - 0.0148113790970959*G0_0_0_2_6 + 0.0173305266162438*G0_0_0_2_7 + 0.0173305266162438*G0_0_0_2_8 + 0.0290994719566197*G0_0_0_2_9 + 0.0124389895818488*G0_0_0_3_0 + 0.119565434565455*G0_0_0_3_1 + 0.0238413966985436*G0_0_0_3_2 + 0.350084201512833*G0_0_0_3_3 - 0.107371913800503*G0_0_0_3_4 - 0.0236249464820933*G0_0_0_3_5 - 0.0087576709005295*G0_0_0_3_6 - 0.0647010132724529*G0_0_0_3_7 + 0.144076637648091*G0_0_0_3_8 + 0.0908991008991164*G0_0_0_3_9 - 0.00620879120879228*G0_0_0_4_0 - 0.0526709005280523*G0_0_0_4_1 - 0.0148113790970959*G0_0_0_4_2 - 0.107371913800503*G0_0_0_4_3 + 0.0588268873983259*G0_0_0_4_4 - 0.00875767090052954*G0_0_0_4_5 + 0.017515341801059*G0_0_0_4_6 - 0.00299058084772416*G0_0_0_4_7 - 0.0793756243756377*G0_0_0_4_8 - 0.0697830740688001*G0_0_0_4_9 + 0.119565434565455*G0_0_0_5_0 + 0.0124389895818488*G0_0_0_5_1 + 0.0238413966985436*G0_0_0_5_2 - 0.0236249464820933*G0_0_0_5_3 - 0.00875767090052954*G0_0_0_5_4 + 0.350084201512833*G0_0_0_5_5 - 0.107371913800504*G0_0_0_5_6 + 0.14407663764809*G0_0_0_5_7 - 0.0647010132724528*G0_0_0_5_8 + 0.0908991008991163*G0_0_0_5_9 - 0.0526709005280525*G0_0_0_6_0 - 0.00620879120879224*G0_0_0_6_1 - 0.0148113790970959*G0_0_0_6_2 - 0.0087576709005295*G0_0_0_6_3 + 0.017515341801059*G0_0_0_6_4 - 0.107371913800504*G0_0_0_6_5 + 0.058826887398326*G0_0_0_6_6 - 0.0793756243756376*G0_0_0_6_7 - 0.00299058084772415*G0_0_0_6_8 - 0.0697830740688001*G0_0_0_6_9 + 0.0507109557109644*G0_0_0_7_0 - 0.00998691784406254*G0_0_0_7_1 + 0.0173305266162438*G0_0_0_7_2 - 0.0647010132724529*G0_0_0_7_3 - 0.00299058084772416*G0_0_0_7_4 + 0.14407663764809*G0_0_0_7_5 - 0.0793756243756376*G0_0_0_7_6 + 0.482162123590776*G0_0_0_7_7 - 0.171586984444156*G0_0_0_7_8 + 0.120248323105486*G0_0_0_7_9 - 0.00998691784406245*G0_0_0_8_0 + 0.0507109557109645*G0_0_0_8_1 + 0.0173305266162438*G0_0_0_8_2 + 0.144076637648091*G0_0_0_8_3 - 0.0793756243756377*G0_0_0_8_4 - 0.0647010132724528*G0_0_0_8_5 - 0.00299058084772414*G0_0_0_8_6 - 0.171586984444156*G0_0_0_8_7 + 0.482162123590777*G0_0_0_8_8 + 0.120248323105486*G0_0_0_8_9 + 0.0128343085485966*G0_0_0_9_0 + 0.0128343085485965*G0_0_0_9_1 + 0.0290994719566197*G0_0_0_9_2 + 0.0908991008991164*G0_0_0_9_3 - 0.0697830740688001*G0_0_0_9_4 + 0.0908991008991163*G0_0_0_9_5 - 0.0697830740688001*G0_0_0_9_6 + 0.120248323105486*G0_0_0_9_7 + 0.120248323105486*G0_0_0_9_8 + 0.317048665620148*G0_0_0_9_9 - 0.0097924297924313*G0_0_1_0_0 + 0.00641107569679112*G0_0_1_0_1 + 0.000941254512683251*G0_0_1_0_2 + 0.0135064935064958*G0_0_1_0_3 - 0.00592264877979265*G0_0_1_0_4 - 0.00836663336663473*G0_0_1_0_5 + 0.001484943627801*G0_0_1_0_6 - 0.00337495837495897*G0_0_1_0_7 + 0.0176354597783199*G0_0_1_0_8 + 0.0102768659911535*G0_0_1_0_9 + 0.00641107569679112*G0_0_1_1_0 + 0.196884596884631*G0_0_1_1_1 + 0.0114704871847748*G0_0_1_1_2 + 0.12793206793209*G0_0_1_1_3 - 0.0541558441558533*G0_0_1_1_4 - 0.00106750392464701*G0_0_1_1_5 - 0.000286142428999603*G0_0_1_1_6 - 0.0276223776223824*G0_0_1_1_7 + 0.0540859140859235*G0_0_1_1_8 + 0.00255744255744306*G0_0_1_1_9 + 0.000941254512683251*G0_0_1_2_0 + 0.0114704871847748*G0_0_1_2_1 + 0.00305123447980642*G0_0_1_2_2 + 0.0259480995195325*G0_0_1_2_3 - 0.0128466771323936*G0_0_1_2_4 - 0.00210670282098889*G0_0_1_2_5 - 0.00196470196470229*G0_0_1_2_6 - 0.00786213786213918*G0_0_1_2_7 + 0.025192664478383*G0_0_1_2_8 + 0.0145497359783099*G0_0_1_2_9 + 0.0135064935064958*G0_0_1_3_0 + 0.12793206793209*G0_0_1_3_1 + 0.0259480995195325*G0_0_1_3_2 + 0.368016983017045*G0_0_1_3_3 - 0.113072641644089*G0_0_1_3_4 - 0.0118124732410467*G0_0_1_3_5 - 0.0128335949764543*G0_0_1_3_6 - 0.0542115027829406*G0_0_1_3_7 + 0.143481518481543*G0_0_1_3_8 + 0.100750677893552*G0_0_1_3_9 - 0.00592264877979265*G0_0_1_4_0 - 0.0541558441558533*G0_0_1_4_1 - 0.0128466771323936*G0_0_1_4_2 - 0.113072641644089*G0_0_1_4_3 + 0.0572748679891633*G0_0_1_4_4 + 0.00407592407592476*G0_0_1_4_5 + 0.00875767090052952*G0_0_1_4_6 + 0.0275231910946243*G0_0_1_4_7 - 0.0892700156986022*G0_0_1_4_8 - 0.0518010560867792*G0_0_1_4_9 - 0.00836663336663473*G0_0_1_5_0 - 0.00106750392464701*G0_0_1_5_1 - 0.00210670282098889*G0_0_1_5_2 - 0.0118124732410467*G0_0_1_5_3 + 0.00407592407592476*G0_0_1_5_4 - 0.0179327815042131*G0_0_1_5_5 + 0.00570072784358592*G0_0_1_5_6 + 0.000595119166547848*G0_0_1_5_7 - 0.0104895104895123*G0_0_1_5_8 - 0.00985157699443579*G0_0_1_5_9 + 0.001484943627801*G0_0_1_6_0 - 0.000286142428999603*G0_0_1_6_1 - 0.00196470196470229*G0_0_1_6_2 - 0.0128335949764543*G0_0_1_6_3 + 0.00875767090052952*G0_0_1_6_4 + 0.00570072784358592*G0_0_1_6_5 + 0.00155201940916253*G0_0_1_6_6 + 0.00989439132296441*G0_0_1_6_7 - 0.0305137719423485*G0_0_1_6_8 - 0.017982017982021*G0_0_1_6_9 - 0.00337495837495897*G0_0_1_7_0 - 0.0276223776223824*G0_0_1_7_1 - 0.00786213786213918*G0_0_1_7_2 - 0.0542115027829406*G0_0_1_7_3 + 0.0275231910946243*G0_0_1_7_4 + 0.000595119166547846*G0_0_1_7_5 + 0.00989439132296441*G0_0_1_7_6 - 0.0180526616240934*G0_0_1_7_7 - 0.085793492222078*G0_0_1_7_8 - 0.0506193806193892*G0_0_1_7_9 + 0.0176354597783199*G0_0_1_8_0 + 0.0540859140859234*G0_0_1_8_1 + 0.025192664478383*G0_0_1_8_2 + 0.143481518481543*G0_0_1_8_3 - 0.0892700156986022*G0_0_1_8_4 - 0.0104895104895123*G0_0_1_8_5 - 0.0305137719423485*G0_0_1_8_6 - 0.085793492222078*G0_0_1_8_7 + 0.50021478521487*G0_0_1_8_8 + 0.170867703724876*G0_0_1_8_9 + 0.0102768659911535*G0_0_1_9_0 + 0.00255744255744306*G0_0_1_9_1 + 0.0145497359783099*G0_0_1_9_2 + 0.100750677893552*G0_0_1_9_3 - 0.0518010560867792*G0_0_1_9_4 - 0.00985157699443579*G0_0_1_9_5 - 0.017982017982021*G0_0_1_9_6 - 0.0506193806193892*G0_0_1_9_7 + 0.170867703724876*G0_0_1_9_8 + 0.158524332810074*G0_0_1_9_9 - 0.0097924297924313*G0_1_0_0_0 + 0.00641107569679112*G0_1_0_0_1 + 0.000941254512683251*G0_1_0_0_2 + 0.0135064935064958*G0_1_0_0_3 - 0.00592264877979265*G0_1_0_0_4 - 0.00836663336663473*G0_1_0_0_5 + 0.001484943627801*G0_1_0_0_6 - 0.00337495837495897*G0_1_0_0_7 + 0.0176354597783199*G0_1_0_0_8 + 0.0102768659911535*G0_1_0_0_9 + 0.00641107569679112*G0_1_0_1_0 + 0.196884596884631*G0_1_0_1_1 + 0.0114704871847748*G0_1_0_1_2 + 0.12793206793209*G0_1_0_1_3 - 0.0541558441558533*G0_1_0_1_4 - 0.00106750392464701*G0_1_0_1_5 - 0.000286142428999603*G0_1_0_1_6 - 0.0276223776223824*G0_1_0_1_7 + 0.0540859140859234*G0_1_0_1_8 + 0.00255744255744307*G0_1_0_1_9 + 0.000941254512683251*G0_1_0_2_0 + 0.0114704871847748*G0_1_0_2_1 + 0.00305123447980642*G0_1_0_2_2 + 0.0259480995195325*G0_1_0_2_3 - 0.0128466771323936*G0_1_0_2_4 - 0.00210670282098889*G0_1_0_2_5 - 0.00196470196470229*G0_1_0_2_6 - 0.00786213786213918*G0_1_0_2_7 + 0.025192664478383*G0_1_0_2_8 + 0.0145497359783099*G0_1_0_2_9 + 0.0135064935064958*G0_1_0_3_0 + 0.12793206793209*G0_1_0_3_1 + 0.0259480995195325*G0_1_0_3_2 + 0.368016983017046*G0_1_0_3_3 - 0.113072641644089*G0_1_0_3_4 - 0.0118124732410467*G0_1_0_3_5 - 0.0128335949764543*G0_1_0_3_6 - 0.0542115027829406*G0_1_0_3_7 + 0.143481518481543*G0_1_0_3_8 + 0.100750677893552*G0_1_0_3_9 - 0.00592264877979265*G0_1_0_4_0 - 0.0541558441558533*G0_1_0_4_1 - 0.0128466771323936*G0_1_0_4_2 - 0.113072641644089*G0_1_0_4_3 + 0.0572748679891633*G0_1_0_4_4 + 0.00407592407592476*G0_1_0_4_5 + 0.00875767090052952*G0_1_0_4_6 + 0.0275231910946243*G0_1_0_4_7 - 0.0892700156986022*G0_1_0_4_8 - 0.0518010560867792*G0_1_0_4_9 - 0.00836663336663473*G0_1_0_5_0 - 0.00106750392464701*G0_1_0_5_1 - 0.00210670282098889*G0_1_0_5_2 - 0.0118124732410467*G0_1_0_5_3 + 0.00407592407592476*G0_1_0_5_4 - 0.0179327815042131*G0_1_0_5_5 + 0.00570072784358592*G0_1_0_5_6 + 0.000595119166547848*G0_1_0_5_7 - 0.0104895104895123*G0_1_0_5_8 - 0.00985157699443579*G0_1_0_5_9 + 0.001484943627801*G0_1_0_6_0 - 0.000286142428999603*G0_1_0_6_1 - 0.00196470196470229*G0_1_0_6_2 - 0.0128335949764543*G0_1_0_6_3 + 0.00875767090052952*G0_1_0_6_4 + 0.00570072784358592*G0_1_0_6_5 + 0.00155201940916253*G0_1_0_6_6 + 0.00989439132296441*G0_1_0_6_7 - 0.0305137719423485*G0_1_0_6_8 - 0.017982017982021*G0_1_0_6_9 - 0.00337495837495897*G0_1_0_7_0 - 0.0276223776223824*G0_1_0_7_1 - 0.00786213786213918*G0_1_0_7_2 - 0.0542115027829406*G0_1_0_7_3 + 0.0275231910946243*G0_1_0_7_4 + 0.000595119166547846*G0_1_0_7_5 + 0.00989439132296441*G0_1_0_7_6 - 0.0180526616240934*G0_1_0_7_7 - 0.085793492222078*G0_1_0_7_8 - 0.0506193806193892*G0_1_0_7_9 + 0.0176354597783199*G0_1_0_8_0 + 0.0540859140859234*G0_1_0_8_1 + 0.025192664478383*G0_1_0_8_2 + 0.143481518481543*G0_1_0_8_3 - 0.0892700156986022*G0_1_0_8_4 - 0.0104895104895123*G0_1_0_8_5 - 0.0305137719423485*G0_1_0_8_6 - 0.085793492222078*G0_1_0_8_7 + 0.50021478521487*G0_1_0_8_8 + 0.170867703724876*G0_1_0_8_9 + 0.0102768659911535*G0_1_0_9_0 + 0.00255744255744307*G0_1_0_9_1 + 0.0145497359783099*G0_1_0_9_2 + 0.100750677893552*G0_1_0_9_3 - 0.0518010560867792*G0_1_0_9_4 - 0.00985157699443579*G0_1_0_9_5 - 0.017982017982021*G0_1_0_9_6 - 0.0506193806193892*G0_1_0_9_7 + 0.170867703724876*G0_1_0_9_8 + 0.158524332810074*G0_1_0_9_9 + 0.00704628704628819*G0_1_1_0_0 + 0.00958670958671126*G0_1_1_0_1 + 0.000827558684701683*G0_1_1_0_2 + 0.0135616764188216*G0_1_1_0_3 - 0.00361186432615067*G0_1_1_0_4 + 0.000597735597735664*G0_1_1_0_5 - 0.000339898197041102*G0_1_1_0_6 - 0.01273892773893*G0_1_1_0_7 + 0.00259716474002241*G0_1_1_0_8 + 0.000366776081061882*G0_1_1_0_9 + 0.00958670958671126*G0_1_1_1_0 + 0.21372331372335*G0_1_1_1_1 + 0.0113567913567933*G0_1_1_1_2 + 0.13689643689646*G0_1_1_1_3 - 0.0559806859806955*G0_1_1_1_4 - 0.00101232101232124*G0_1_1_1_5 + 0.00202464202464239*G0_1_1_1_6 - 0.04266067266068*G0_1_1_1_7 + 0.0447219447219525*G0_1_1_1_8 - 0.00735264735264852*G0_1_1_1_9 + 0.000827558684701683*G0_1_1_2_0 + 0.0113567913567933*G0_1_1_2_1 + 0.00487449058877712*G0_1_1_2_2 + 0.029690071832934*G0_1_1_2_3 - 0.0172715379858266*G0_1_1_2_4 + 0.00163526949241262*G0_1_1_2_5 - 0.00638956281813532*G0_1_1_2_6 + 0.00256481613624514*G0_1_1_2_7 + 0.0356196184767673*G0_1_1_2_8 + 0.0292521763950385*G0_1_1_2_9 + 0.0135616764188216*G0_1_1_3_0 + 0.13689643689646*G0_1_1_3_1 + 0.029690071832934*G0_1_1_3_2 + 0.407712287712357*G0_1_1_3_3 - 0.126623376623398*G0_1_1_3_4 - 0.0132574568288876*G0_1_1_3_5 - 0.017207078635653*G0_1_1_3_6 - 0.0518181818181907*G0_1_1_3_7 + 0.169810189810219*G0_1_1_3_8 + 0.125694305694327*G0_1_1_3_9 - 0.00361186432615067*G0_1_1_4_0 - 0.0559806859806954*G0_1_1_4_1 - 0.0172715379858266*G0_1_1_4_2 - 0.126623376623398*G0_1_1_4_3 + 0.0707035821321655*G0_1_1_4_4 - 0.00029755958327392*G0_1_1_4_5 + 0.0175046382189269*G0_1_1_4_6 + 0.0071371485657212*G0_1_1_4_7 - 0.117992007992028*G0_1_1_4_8 - 0.0871614100185677*G0_1_1_4_9 + 0.000597735597735665*G0_1_1_5_0 - 0.00101232101232124*G0_1_1_5_1 + 0.00163526949241262*G0_1_1_5_2 - 0.0132574568288876*G0_1_1_5_3 - 0.000297559583273921*G0_1_1_5_4 + 0.0217625231910983*G0_1_1_5_5 - 0.00785000713572272*G0_1_1_5_6 + 0.0269237904952236*G0_1_1_5_7 - 0.00809618952476234*G0_1_1_5_8 + 0.0150920508063391*G0_1_1_5_9 - 0.000339898197041102*G0_1_1_6_0 + 0.00202464202464239*G0_1_1_6_1 - 0.00638956281813532*G0_1_1_6_2 - 0.017207078635653*G0_1_1_6_3 + 0.0175046382189269*G0_1_1_6_4 - 0.00785000713572272*G0_1_1_6_5 + 0.0149807335521647*G0_1_1_6_6 - 0.0188276009704613*G0_1_1_6_7 - 0.0508998144712516*G0_1_1_6_8 - 0.0533423719138095*G0_1_1_6_9 - 0.01273892773893*G0_1_1_7_0 - 0.04266067266068*G0_1_1_7_1 + 0.00256481613624514*G0_1_1_7_2 - 0.0518181818181907*G0_1_1_7_3 + 0.00713714856572119*G0_1_1_7_4 + 0.0269237904952236*G0_1_1_7_5 - 0.0188276009704613*G0_1_1_7_6 + 0.157976309404908*G0_1_1_7_7 + 0.00380619380619453*G0_1_1_7_8 + 0.0365548736977371*G0_1_1_7_9 + 0.00259716474002241*G0_1_1_8_0 + 0.0447219447219525*G0_1_1_8_1 + 0.0356196184767673*G0_1_1_8_2 + 0.169810189810219*G0_1_1_8_3 - 0.117992007992028*G0_1_1_8_4 - 0.00809618952476234*G0_1_1_8_5 - 0.0508998144712516*G0_1_1_8_6 + 0.00380619380619453*G0_1_1_8_7 + 0.676243756243871*G0_1_1_8_8 + 0.258041958042002*G0_1_1_8_9 + 0.000366776081061882*G0_1_1_9_0 - 0.00735264735264852*G0_1_1_9_1 + 0.0292521763950385*G0_1_1_9_2 + 0.125694305694327*G0_1_1_9_3 - 0.0871614100185677*G0_1_1_9_4 + 0.0150920508063391*G0_1_1_9_5 - 0.0533423719138095*G0_1_1_9_6 + 0.0365548736977371*G0_1_1_9_7 + 0.258041958042002*G0_1_1_9_8 + 0.313503639217978*G0_1_1_9_9; + A[91] = A[21] + 0.0170459170459201*G0_0_1_0_0 + 0.000135455373550636*G0_0_1_0_1 + 0.000591824401348315*G0_0_1_0_2 + 0.00662670662670778*G0_0_1_0_5 - 0.00222769294197905*G0_0_1_0_6 + 0.00212343212343253*G0_0_1_0_7 - 0.00158611230039831*G0_0_1_0_8 - 0.000466359037787678*G0_0_1_0_9 + 0.000135455373550636*G0_0_1_1_0 + 0.000140194902099684*G0_0_1_1_2 + 0.00182854182854211*G0_0_1_1_3 - 0.00029267029267033*G0_0_1_1_4 - 0.000196734482448803*G0_0_1_1_6 + 0.00062789062789076*G0_0_1_1_7 - 0.00182854182854219*G0_0_1_1_8 - 0.000335220335220393*G0_0_1_1_9 + 0.000591824401348315*G0_0_1_2_0 + 0.000140194902099684*G0_0_1_2_1 - 0.00407525455144573*G0_0_1_2_2 + 0.000426372569229787*G0_0_1_2_3 + 0.000477511906083406*G0_0_1_2_4 + 0.000730724302153*G0_0_1_2_5 + 0.000827690827690963*G0_0_1_2_6 + 0.000111370111370135*G0_0_1_2_7 - 0.000364661793233286*G0_0_1_2_8 + 0.00128173413887721*G0_0_1_2_9 + 0.00182854182854211*G0_0_1_3_1 + 0.000426372569229787*G0_0_1_3_2 + 0.0055744255744265*G0_0_1_3_3 - 0.00410732125017907*G0_0_1_3_4 + 0.00016959231244947*G0_0_1_3_5 + 0.000350126064411842*G0_0_1_3_6 - 0.000377717520574722*G0_0_1_3_7 - 0.00047619047619057*G0_0_1_3_8 + 0.00176109604681063*G0_0_1_3_9 - 0.00029267029267033*G0_0_1_4_1 + 0.000477511906083406*G0_0_1_4_2 - 0.00410732125017907*G0_0_1_4_3 + 0.00549878692735925*G0_0_1_4_4 - 0.000116550116550132*G0_0_1_4_5 - 0.000233575947861707*G0_0_1_4_6 + 0.000853907996765294*G0_0_1_4_8 - 0.00361210218353137*G0_0_1_4_9 + 0.00662670662670779*G0_0_1_5_0 + 0.000730724302153*G0_0_1_5_2 + 0.00016959231244947*G0_0_1_5_3 - 0.000116550116550132*G0_0_1_5_4 - 0.0201679273107878*G0_0_1_5_5 - 0.00651729223157906*G0_0_1_5_6 + 0.000577517720374995*G0_0_1_5_7 + 0.0014057371200231*G0_0_1_5_9 - 0.00222769294197905*G0_0_1_6_0 - 0.000196734482448803*G0_0_1_6_1 + 0.000827690827690963*G0_0_1_6_2 + 0.000350126064411842*G0_0_1_6_3 - 0.000233575947861707*G0_0_1_6_4 - 0.00651729223157906*G0_0_1_6_5 + 0.00713334284762978*G0_0_1_6_6 - 0.000574187717044969*G0_0_1_6_7 + 0.000962133104990418*G0_0_1_6_8 - 0.00454545454545532*G0_0_1_6_9 + 0.00212343212343253*G0_0_1_7_0 + 0.00062789062789076*G0_0_1_7_1 + 0.000111370111370135*G0_0_1_7_2 - 0.000377717520574722*G0_0_1_7_3 + 0.000577517720374995*G0_0_1_7_5 - 0.00057418771704497*G0_0_1_7_6 - 0.00768041482327322*G0_0_1_7_7 + 0.00257218971504729*G0_0_1_7_8 + 0.00254745254745299*G0_0_1_7_9 - 0.00158611230039831*G0_0_1_8_0 - 0.00182854182854219*G0_0_1_8_1 - 0.000364661793233286*G0_0_1_8_2 - 0.00047619047619057*G0_0_1_8_3 + 0.000853907996765294*G0_0_1_8_4 + 0.000962133104990418*G0_0_1_8_6 + 0.00257218971504729*G0_0_1_8_7 - 0.00462204462204545*G0_0_1_8_8 - 0.000702154987869406*G0_0_1_8_9 - 0.000466359037787678*G0_0_1_9_0 - 0.000335220335220394*G0_0_1_9_1 + 0.00128173413887721*G0_0_1_9_2 + 0.00176109604681063*G0_0_1_9_3 - 0.00361210218353137*G0_0_1_9_4 + 0.0014057371200231*G0_0_1_9_5 - 0.00454545454545532*G0_0_1_9_6 + 0.00254745254745299*G0_0_1_9_7 - 0.000702154987869406*G0_0_1_9_8 + 0.00428143285286217*G0_0_1_9_9 - 0.0170459170459201*G0_1_0_0_0 - 0.000135455373550635*G0_1_0_0_1 - 0.000591824401348315*G0_1_0_0_2 - 0.00662670662670778*G0_1_0_0_5 + 0.00222769294197905*G0_1_0_0_6 - 0.00212343212343253*G0_1_0_0_7 + 0.00158611230039831*G0_1_0_0_8 + 0.000466359037787678*G0_1_0_0_9 - 0.000135455373550635*G0_1_0_1_0 - 0.000140194902099684*G0_1_0_1_2 - 0.00182854182854211*G0_1_0_1_3 + 0.00029267029267033*G0_1_0_1_4 + 0.000196734482448803*G0_1_0_1_6 - 0.00062789062789076*G0_1_0_1_7 + 0.00182854182854219*G0_1_0_1_8 + 0.000335220335220394*G0_1_0_1_9 - 0.000591824401348315*G0_1_0_2_0 - 0.000140194902099684*G0_1_0_2_1 + 0.00407525455144573*G0_1_0_2_2 - 0.000426372569229786*G0_1_0_2_3 - 0.000477511906083406*G0_1_0_2_4 - 0.000730724302153*G0_1_0_2_5 - 0.000827690827690963*G0_1_0_2_6 - 0.000111370111370135*G0_1_0_2_7 + 0.000364661793233286*G0_1_0_2_8 - 0.00128173413887721*G0_1_0_2_9 - 0.00182854182854211*G0_1_0_3_1 - 0.000426372569229786*G0_1_0_3_2 - 0.0055744255744265*G0_1_0_3_3 + 0.00410732125017907*G0_1_0_3_4 - 0.00016959231244947*G0_1_0_3_5 - 0.000350126064411842*G0_1_0_3_6 + 0.000377717520574722*G0_1_0_3_7 + 0.00047619047619057*G0_1_0_3_8 - 0.00176109604681063*G0_1_0_3_9 + 0.00029267029267033*G0_1_0_4_1 - 0.000477511906083406*G0_1_0_4_2 + 0.00410732125017907*G0_1_0_4_3 - 0.00549878692735925*G0_1_0_4_4 + 0.000116550116550132*G0_1_0_4_5 + 0.000233575947861707*G0_1_0_4_6 - 0.000853907996765294*G0_1_0_4_8 + 0.00361210218353137*G0_1_0_4_9 - 0.00662670662670778*G0_1_0_5_0 - 0.000730724302153*G0_1_0_5_2 - 0.000169592312449471*G0_1_0_5_3 + 0.000116550116550132*G0_1_0_5_4 + 0.0201679273107878*G0_1_0_5_5 + 0.00651729223157906*G0_1_0_5_6 - 0.000577517720374995*G0_1_0_5_7 - 0.0014057371200231*G0_1_0_5_9 + 0.00222769294197905*G0_1_0_6_0 + 0.000196734482448803*G0_1_0_6_1 - 0.000827690827690963*G0_1_0_6_2 - 0.000350126064411842*G0_1_0_6_3 + 0.000233575947861707*G0_1_0_6_4 + 0.00651729223157906*G0_1_0_6_5 - 0.00713334284762978*G0_1_0_6_6 + 0.00057418771704497*G0_1_0_6_7 - 0.000962133104990418*G0_1_0_6_8 + 0.00454545454545532*G0_1_0_6_9 - 0.00212343212343253*G0_1_0_7_0 - 0.00062789062789076*G0_1_0_7_1 - 0.000111370111370135*G0_1_0_7_2 + 0.000377717520574722*G0_1_0_7_3 - 0.000577517720374995*G0_1_0_7_5 + 0.00057418771704497*G0_1_0_7_6 + 0.00768041482327321*G0_1_0_7_7 - 0.00257218971504729*G0_1_0_7_8 - 0.00254745254745299*G0_1_0_7_9 + 0.00158611230039831*G0_1_0_8_0 + 0.00182854182854219*G0_1_0_8_1 + 0.000364661793233286*G0_1_0_8_2 + 0.00047619047619057*G0_1_0_8_3 - 0.000853907996765294*G0_1_0_8_4 - 0.000962133104990418*G0_1_0_8_6 - 0.00257218971504729*G0_1_0_8_7 + 0.00462204462204545*G0_1_0_8_8 + 0.000702154987869406*G0_1_0_8_9 + 0.000466359037787677*G0_1_0_9_0 + 0.000335220335220394*G0_1_0_9_1 - 0.00128173413887721*G0_1_0_9_2 - 0.00176109604681063*G0_1_0_9_3 + 0.00361210218353137*G0_1_0_9_4 - 0.0014057371200231*G0_1_0_9_5 + 0.00454545454545532*G0_1_0_9_6 - 0.00254745254745299*G0_1_0_9_7 + 0.000702154987869406*G0_1_0_9_8 - 0.00428143285286217*G0_1_0_9_9; + A[82] = A[110] - 0.00312773646107032*G0_0_1_0_0 - 0.000380466094751864*G0_0_1_0_1 + 0.00337514337514395*G0_0_1_0_2 + 0.000659974945689347*G0_0_1_0_3 - 0.00544249401392352*G0_0_1_0_4 + 0.00236017950303705*G0_0_1_0_5 - 0.00725591868449139*G0_0_1_0_6 - 0.00179185893471638*G0_0_1_0_7 + 0.00121180406894714*G0_0_1_0_8 - 0.00183245326102498*G0_0_1_0_9 - 0.000380466094751864*G0_0_1_1_0 + 0.000523497666355045*G0_0_1_1_1 + 0.00578458578458677*G0_0_1_1_2 + 0.000847089418518104*G0_0_1_1_4 + 0.000874998017855309*G0_0_1_1_5 - 0.00168625025767911*G0_0_1_1_6 - 0.000148740148740217*G0_0_1_1_7 + 0.00141382427096739*G0_0_1_1_9 + 0.00337514337514395*G0_0_1_2_0 + 0.00578458578458677*G0_0_1_2_1 + 0.195838729172095*G0_0_1_2_2 - 0.026573426573431*G0_0_1_2_3 + 0.060872460872471*G0_0_1_2_4 - 0.0144078144078167*G0_0_1_2_5 + 0.0192252192252222*G0_0_1_2_6 - 0.000255300255300292*G0_0_1_2_7 + 0.000597180597180718*G0_0_1_2_8 - 0.00293040293040345*G0_0_1_2_9 + 0.000659974945689348*G0_0_1_3_0 - 0.026573426573431*G0_0_1_3_2 - 0.003898958184673*G0_0_1_3_3 - 0.00517482517482608*G0_0_1_3_4 - 0.00313971742543224*G0_0_1_3_5 + 0.00673326673326782*G0_0_1_3_6 - 0.000305408876837518*G0_0_1_3_7 + 0.000422434708149126*G0_0_1_3_8 - 0.00363065505922712*G0_0_1_3_9 - 0.00544249401392352*G0_0_1_4_0 + 0.000847089418518111*G0_0_1_4_1 + 0.060872460872471*G0_0_1_4_2 - 0.00517482517482609*G0_0_1_4_3 - 0.142497502497527*G0_0_1_4_4 + 0.018001998002001*G0_0_1_4_5 - 0.0247352647352689*G0_0_1_4_6 + 0.00770943342372044*G0_0_1_4_7 - 0.0001170258313116*G0_0_1_4_8 - 0.0272127872127917*G0_0_1_4_9 + 0.00236017950303705*G0_0_1_5_0 + 0.000874998017855309*G0_0_1_5_1 - 0.0144078144078167*G0_0_1_5_2 - 0.00313971742543224*G0_0_1_5_3 + 0.0180019980020011*G0_0_1_5_4 - 0.0133295276152443*G0_0_1_5_5 + 0.0355044955045016*G0_0_1_5_6 - 0.00148993863279603*G0_0_1_5_7 - 0.000950478093335379*G0_0_1_5_8 + 0.0073983159697457*G0_0_1_5_9 - 0.00725591868449139*G0_0_1_6_0 - 0.00168625025767912*G0_0_1_6_1 + 0.0192252192252222*G0_0_1_6_2 + 0.00673326673326783*G0_0_1_6_3 - 0.0247352647352689*G0_0_1_6_4 + 0.0355044955045016*G0_0_1_6_5 - 0.133706293706316*G0_0_1_6_6 + 0.00244041672613141*G0_0_1_6_7 + 0.000796346510632309*G0_0_1_6_8 - 0.00467532467532526*G0_0_1_6_9 - 0.00179185893471637*G0_0_1_7_0 - 0.000148740148740217*G0_0_1_7_1 - 0.000255300255300292*G0_0_1_7_2 - 0.000305408876837517*G0_0_1_7_3 + 0.00770943342372044*G0_0_1_7_4 - 0.00148993863279603*G0_0_1_7_5 + 0.00244041672613141*G0_0_1_7_6 - 0.0107835022120753*G0_0_1_7_7 + 0.000545169116597711*G0_0_1_7_8 + 0.000616526330812105*G0_0_1_7_9 + 0.00121180406894714*G0_0_1_8_0 + 0.000597180597180718*G0_0_1_8_2 + 0.000422434708149126*G0_0_1_8_3 - 0.000117025831311599*G0_0_1_8_4 - 0.000950478093335379*G0_0_1_8_5 + 0.000796346510632309*G0_0_1_8_6 + 0.000545169116597711*G0_0_1_8_7 - 0.00307692307692333*G0_0_1_8_8 - 0.00400742115027895*G0_0_1_8_9 - 0.00183245326102499*G0_0_1_9_0 + 0.00141382427096739*G0_0_1_9_1 - 0.00293040293040345*G0_0_1_9_2 - 0.00363065505922712*G0_0_1_9_3 - 0.0272127872127917*G0_0_1_9_4 + 0.0073983159697457*G0_0_1_9_5 - 0.00467532467532525*G0_0_1_9_6 + 0.000616526330812105*G0_0_1_9_7 - 0.00400742115027895*G0_0_1_9_8 + 0.0355530184101675*G0_0_1_9_9 + 0.00312773646107032*G0_1_0_0_0 + 0.000380466094751864*G0_1_0_0_1 - 0.00337514337514395*G0_1_0_0_2 - 0.000659974945689347*G0_1_0_0_3 + 0.00544249401392352*G0_1_0_0_4 - 0.00236017950303705*G0_1_0_0_5 + 0.00725591868449139*G0_1_0_0_6 + 0.00179185893471638*G0_1_0_0_7 - 0.00121180406894714*G0_1_0_0_8 + 0.00183245326102499*G0_1_0_0_9 + 0.000380466094751864*G0_1_0_1_0 - 0.000523497666355045*G0_1_0_1_1 - 0.00578458578458677*G0_1_0_1_2 - 0.000847089418518104*G0_1_0_1_4 - 0.000874998017855309*G0_1_0_1_5 + 0.00168625025767911*G0_1_0_1_6 + 0.000148740148740217*G0_1_0_1_7 - 0.00141382427096739*G0_1_0_1_9 - 0.00337514337514395*G0_1_0_2_0 - 0.00578458578458676*G0_1_0_2_1 - 0.195838729172095*G0_1_0_2_2 + 0.0265734265734309*G0_1_0_2_3 - 0.060872460872471*G0_1_0_2_4 + 0.0144078144078167*G0_1_0_2_5 - 0.0192252192252222*G0_1_0_2_6 + 0.000255300255300292*G0_1_0_2_7 - 0.000597180597180718*G0_1_0_2_8 + 0.00293040293040345*G0_1_0_2_9 - 0.000659974945689347*G0_1_0_3_0 + 0.026573426573431*G0_1_0_3_2 + 0.003898958184673*G0_1_0_3_3 + 0.00517482517482608*G0_1_0_3_4 + 0.00313971742543224*G0_1_0_3_5 - 0.00673326673326782*G0_1_0_3_6 + 0.000305408876837517*G0_1_0_3_7 - 0.000422434708149126*G0_1_0_3_8 + 0.00363065505922712*G0_1_0_3_9 + 0.00544249401392352*G0_1_0_4_0 - 0.000847089418518108*G0_1_0_4_1 - 0.060872460872471*G0_1_0_4_2 + 0.00517482517482609*G0_1_0_4_3 + 0.142497502497527*G0_1_0_4_4 - 0.0180019980020011*G0_1_0_4_5 + 0.0247352647352689*G0_1_0_4_6 - 0.00770943342372044*G0_1_0_4_7 + 0.0001170258313116*G0_1_0_4_8 + 0.0272127872127917*G0_1_0_4_9 - 0.00236017950303705*G0_1_0_5_0 - 0.000874998017855308*G0_1_0_5_1 + 0.0144078144078167*G0_1_0_5_2 + 0.00313971742543224*G0_1_0_5_3 - 0.0180019980020011*G0_1_0_5_4 + 0.0133295276152443*G0_1_0_5_5 - 0.0355044955045016*G0_1_0_5_6 + 0.00148993863279603*G0_1_0_5_7 + 0.000950478093335379*G0_1_0_5_8 - 0.0073983159697457*G0_1_0_5_9 + 0.00725591868449139*G0_1_0_6_0 + 0.00168625025767912*G0_1_0_6_1 - 0.0192252192252222*G0_1_0_6_2 - 0.00673326673326782*G0_1_0_6_3 + 0.0247352647352689*G0_1_0_6_4 - 0.0355044955045016*G0_1_0_6_5 + 0.133706293706316*G0_1_0_6_6 - 0.00244041672613141*G0_1_0_6_7 - 0.000796346510632309*G0_1_0_6_8 + 0.00467532467532526*G0_1_0_6_9 + 0.00179185893471638*G0_1_0_7_0 + 0.000148740148740217*G0_1_0_7_1 + 0.000255300255300292*G0_1_0_7_2 + 0.000305408876837517*G0_1_0_7_3 - 0.00770943342372044*G0_1_0_7_4 + 0.00148993863279603*G0_1_0_7_5 - 0.00244041672613141*G0_1_0_7_6 + 0.0107835022120753*G0_1_0_7_7 - 0.000545169116597711*G0_1_0_7_8 - 0.000616526330812105*G0_1_0_7_9 - 0.00121180406894714*G0_1_0_8_0 - 0.000597180597180718*G0_1_0_8_2 - 0.000422434708149125*G0_1_0_8_3 + 0.000117025831311599*G0_1_0_8_4 + 0.000950478093335379*G0_1_0_8_5 - 0.000796346510632307*G0_1_0_8_6 - 0.000545169116597711*G0_1_0_8_7 + 0.00307692307692333*G0_1_0_8_8 + 0.00400742115027895*G0_1_0_8_9 + 0.00183245326102498*G0_1_0_9_0 - 0.00141382427096739*G0_1_0_9_1 + 0.00293040293040345*G0_1_0_9_2 + 0.00363065505922712*G0_1_0_9_3 + 0.0272127872127917*G0_1_0_9_4 - 0.00739831596974569*G0_1_0_9_5 + 0.00467532467532525*G0_1_0_9_6 - 0.000616526330812105*G0_1_0_9_7 + 0.00400742115027895*G0_1_0_9_8 - 0.0355530184101675*G0_1_0_9_9; + A[153] = A[82] - 0.00683563350230137*G0_0_0_0_0 + 0.00181402371878595*G0_0_0_0_1 - 0.0113870961490028*G0_0_0_0_2 + 0.00675292961007369*G0_0_0_0_3 - 0.00949938949939117*G0_0_0_0_4 - 0.00557093699950942*G0_0_0_0_5 + 0.00661402089973638*G0_0_0_0_6 + 0.000740212168783703*G0_0_0_0_7 - 0.00511393368536309*G0_0_0_0_8 - 0.00300080871509492*G0_0_0_0_9 + 0.00181402371878595*G0_0_0_1_0 + 0.0578519892805704*G0_0_0_1_1 - 0.00985769081007344*G0_0_0_1_2 + 0.0930764473621775*G0_0_0_1_3 - 0.0566966366966463*G0_0_0_1_4 - 0.00204589061731955*G0_0_0_1_5 - 0.000599717742574963*G0_0_0_1_6 - 0.0114200085628677*G0_0_0_1_7 + 0.0183625897911644*G0_0_0_1_8 + 0.00934494077351384*G0_0_0_1_9 - 0.0113870961490028*G0_0_0_2_0 - 0.00985769081007344*G0_0_0_2_1 - 0.297293817293867*G0_0_0_2_2 + 0.0896379810665675*G0_0_0_2_3 - 0.183340469054786*G0_0_0_2_4 + 0.0427972027972098*G0_0_0_2_5 - 0.079383473669201*G0_0_0_2_6 + 0.0020186163043309*G0_0_0_2_7 - 0.00299161156304063*G0_0_0_2_8 - 0.0248893963179719*G0_0_0_2_9 + 0.00675292961007369*G0_0_0_3_0 + 0.0930764473621775*G0_0_0_3_1 + 0.0896379810665675*G0_0_0_3_2 + 0.292747252747303*G0_0_0_3_3 + 0.0499643213929011*G0_0_0_3_4 - 0.0116968745540193*G0_0_0_3_5 + 0.0110717853575014*G0_0_0_3_6 - 0.0109861567004444*G0_0_0_3_7 - 0.00726131011845391*G0_0_0_3_8 - 0.00606250891965251*G0_0_0_3_9 - 0.00949938949939117*G0_0_0_4_0 - 0.0566966366966463*G0_0_0_4_1 - 0.183340469054786*G0_0_0_4_2 + 0.0499643213929011*G0_0_0_4_3 - 0.313863279577619*G0_0_0_4_4 + 0.0377708006279498*G0_0_0_4_5 - 0.0488425859854513*G0_0_0_4_6 + 0.00658484372770203*G0_0_0_4_7 + 0.0182474668188983*G0_0_0_4_8 - 0.00087341230198389*G0_0_0_4_9 - 0.00557093699950941*G0_0_0_5_0 - 0.00204589061731955*G0_0_0_5_1 + 0.0427972027972098*G0_0_0_5_2 - 0.0116968745540193*G0_0_0_5_3 + 0.0377708006279498*G0_0_0_5_4 - 0.0773740545169245*G0_0_0_5_5 - 0.0075610104181548*G0_0_0_5_6 - 0.0186270871985189*G0_0_0_5_7 + 0.0154103039817351*G0_0_0_5_8 - 0.0218181818181856*G0_0_0_5_9 + 0.00661402089973638*G0_0_0_6_0 - 0.000599717742574963*G0_0_0_6_1 - 0.079383473669201*G0_0_0_6_2 + 0.0110717853575014*G0_0_0_6_3 - 0.0488425859854513*G0_0_0_6_4 - 0.0075610104181548*G0_0_0_6_5 + 0.143016983017008*G0_0_0_6_6 + 0.00321678321678378*G0_0_0_6_7 + 0.000750677893535133*G0_0_0_6_8 + 0.0525246182389128*G0_0_0_6_9 + 0.000740212168783703*G0_0_0_7_0 - 0.0114200085628677*G0_0_0_7_1 + 0.0020186163043309*G0_0_0_7_2 - 0.0109861567004444*G0_0_0_7_3 + 0.00658484372770203*G0_0_0_7_4 - 0.0186270871985189*G0_0_0_7_5 + 0.00321678321678378*G0_0_0_7_6 - 0.028748394462685*G0_0_0_7_7 + 0.0316797488226112*G0_0_0_7_8 + 0.00256885971171719*G0_0_0_7_9 - 0.00511393368536309*G0_0_0_8_0 + 0.0183625897911644*G0_0_0_8_1 - 0.00299161156304062*G0_0_0_8_2 - 0.0072613101184539*G0_0_0_8_3 + 0.0182474668188983*G0_0_0_8_4 + 0.0154103039817351*G0_0_0_8_5 + 0.000750677893535133*G0_0_0_8_6 + 0.0316797488226112*G0_0_0_8_7 - 0.104409875838465*G0_0_0_8_8 - 0.0645297559583381*G0_0_0_8_9 - 0.00300080871509492*G0_0_0_9_0 + 0.00934494077351385*G0_0_0_9_1 - 0.0248893963179719*G0_0_0_9_2 - 0.00606250891965251*G0_0_0_9_3 - 0.000873412301983883*G0_0_0_9_4 - 0.0218181818181856*G0_0_0_9_5 + 0.0525246182389128*G0_0_0_9_6 + 0.00256885971171719*G0_0_0_9_7 - 0.0645297559583381*G0_0_0_9_8 - 0.119195090623682*G0_0_0_9_9 + 0.00691012691012816*G0_0_1_0_1 - 0.00691012691012809*G0_0_1_0_2 + 0.00599971457114424*G0_0_1_0_3 - 0.00599971457114422*G0_0_1_0_4 - 0.00362431219574145*G0_0_1_0_5 + 0.00952063809206836*G0_0_1_0_6 + 0.00362431219574132*G0_0_1_0_7 - 0.00952063809206821*G0_0_1_0_8 + 0.00691012691012815*G0_0_1_1_0 + 0.26253689872742*G0_0_1_1_1 + 0.162439465296636*G0_0_1_1_3 - 0.08421958993389*G0_0_1_1_4 - 0.00172399029541923*G0_0_1_1_5 + 0.00349364920793555*G0_0_1_1_6 - 0.0284214198499963*G0_0_1_1_7 + 0.0466435152149522*G0_0_1_1_8 + 0.0142428999571882*G0_0_1_1_9 - 0.00691012691012809*G0_0_1_2_0 - 0.262536898727419*G0_0_1_2_2 + 0.0842195899338898*G0_0_1_2_3 - 0.162439465296635*G0_0_1_2_4 + 0.0284214198499959*G0_0_1_2_5 - 0.0466435152149514*G0_0_1_2_6 + 0.00172399029541911*G0_0_1_2_7 - 0.00349364920793547*G0_0_1_2_8 - 0.014242899957188*G0_0_1_2_9 + 0.00599971457114424*G0_0_1_3_0 + 0.162439465296636*G0_0_1_3_1 + 0.0842195899338898*G0_0_1_3_2 + 0.250018552875739*G0_0_1_3_3 - 0.0064135864135875*G0_0_1_3_5 - 0.0104809476238066*G0_0_1_3_6 - 0.0179991437134327*G0_0_1_3_7 + 0.00751819608962642*G0_0_1_3_8 - 0.00673041244469897*G0_0_1_3_9 - 0.00599971457114422*G0_0_1_4_0 - 0.08421958993389*G0_0_1_4_1 - 0.162439465296635*G0_0_1_4_2 - 0.250018552875738*G0_0_1_4_4 + 0.0179991437134325*G0_0_1_4_5 - 0.00751819608962589*G0_0_1_4_6 + 0.00641358641358759*G0_0_1_4_7 + 0.0104809476238063*G0_0_1_4_8 + 0.00673041244469919*G0_0_1_4_9 - 0.00362431219574145*G0_0_1_5_0 - 0.00172399029541923*G0_0_1_5_1 + 0.0284214198499959*G0_0_1_5_2 - 0.0064135864135875*G0_0_1_5_3 + 0.0179991437134325*G0_0_1_5_4 + 0.00916797488226225*G0_0_1_5_5 - 0.0410789210789282*G0_0_1_5_6 + 0.00517197088625745*G0_0_1_5_8 - 0.0103439417725149*G0_0_1_5_9 + 0.00952063809206836*G0_0_1_6_0 + 0.00349364920793555*G0_0_1_6_1 - 0.0466435152149514*G0_0_1_6_2 - 0.0104809476238066*G0_0_1_6_3 - 0.00751819608962589*G0_0_1_6_4 - 0.0410789210789282*G0_0_1_6_5 + 0.211851006136757*G0_0_1_6_6 - 0.00517197088625742*G0_0_1_6_7 + 0.0636905951191772*G0_0_1_6_9 + 0.00362431219574132*G0_0_1_7_0 - 0.0284214198499963*G0_0_1_7_1 + 0.00172399029541911*G0_0_1_7_2 - 0.0179991437134327*G0_0_1_7_3 + 0.00641358641358759*G0_0_1_7_4 - 0.00517197088625742*G0_0_1_7_6 - 0.0091679748822622*G0_0_1_7_7 + 0.0410789210789278*G0_0_1_7_8 + 0.0103439417725148*G0_0_1_7_9 - 0.00952063809206821*G0_0_1_8_0 + 0.0466435152149522*G0_0_1_8_1 - 0.00349364920793546*G0_0_1_8_2 + 0.00751819608962642*G0_0_1_8_3 + 0.0104809476238063*G0_0_1_8_4 + 0.00517197088625745*G0_0_1_8_5 + 0.0410789210789278*G0_0_1_8_7 - 0.211851006136755*G0_0_1_8_8 - 0.0636905951191771*G0_0_1_8_9 + 0.0142428999571882*G0_0_1_9_1 - 0.014242899957188*G0_0_1_9_2 - 0.00673041244469897*G0_0_1_9_3 + 0.00673041244469919*G0_0_1_9_4 - 0.0103439417725149*G0_0_1_9_5 + 0.0636905951191772*G0_0_1_9_6 + 0.0103439417725148*G0_0_1_9_7 - 0.0636905951191771*G0_0_1_9_8 + 0.00315451744023228*G0_1_0_0_1 - 0.00315451744023227*G0_1_0_0_2 + 0.0121021835307571*G0_1_0_0_3 - 0.0121021835307571*G0_1_0_0_4 + 0.000527726242012031*G0_1_0_0_5 + 0.00105291533862982*G0_1_0_0_6 - 0.000527726242012066*G0_1_0_0_7 - 0.00105291533862977*G0_1_0_0_8 + 0.00315451744023228*G0_1_0_1_0 + 0.0672216672216786*G0_1_0_1_1 + 0.101495964353124*G0_1_0_1_3 - 0.0567990739419407*G0_1_0_1_4 - 0.00059369202226356*G0_1_0_1_5 + 0.00121021835307573*G0_1_0_1_6 - 0.0141623455909195*G0_1_0_1_7 + 0.0274950446379066*G0_1_0_1_8 + 0.018587127158559*G0_1_0_1_9 - 0.00315451744023227*G0_1_0_2_0 - 0.0672216672216784*G0_1_0_2_2 + 0.0567990739419407*G0_1_0_2_3 - 0.101495964353124*G0_1_0_2_4 + 0.0141623455909194*G0_1_0_2_5 - 0.0274950446379064*G0_1_0_2_6 + 0.000593692022263534*G0_1_0_2_7 - 0.00121021835307568*G0_1_0_2_8 - 0.0185871271585588*G0_1_0_2_9 + 0.0121021835307571*G0_1_0_3_0 + 0.101495964353124*G0_1_0_3_1 + 0.0567990739419407*G0_1_0_3_2 + 0.388617097188592*G0_1_0_3_3 - 0.0172627372627401*G0_1_0_3_5 - 0.00363065505922717*G0_1_0_3_6 - 0.0363065505922711*G0_1_0_3_7 + 0.0326758955330441*G0_1_0_3_8 + 0.0168517197088656*G0_1_0_3_9 - 0.0121021835307571*G0_1_0_4_0 - 0.0567990739419407*G0_1_0_4_1 - 0.101495964353124*G0_1_0_4_2 - 0.388617097188592*G0_1_0_4_4 + 0.036306550592271*G0_1_0_4_5 - 0.0326758955330438*G0_1_0_4_6 + 0.0172627372627402*G0_1_0_4_7 + 0.00363065505922698*G0_1_0_4_8 - 0.0168517197088653*G0_1_0_4_9 + 0.00052772624201203*G0_1_0_5_0 - 0.000593692022263561*G0_1_0_5_1 + 0.0141623455909194*G0_1_0_5_2 - 0.0172627372627401*G0_1_0_5_3 + 0.036306550592271*G0_1_0_5_4 + 0.00662194947909359*G0_1_0_5_5 - 0.00611959469102433*G0_1_0_5_6 + 0.00178107606679065*G0_1_0_5_8 - 0.00356215213358134*G0_1_0_5_9 + 0.00105291533862982*G0_1_0_6_0 + 0.00121021835307573*G0_1_0_6_1 - 0.0274950446379064*G0_1_0_6_2 - 0.00363065505922717*G0_1_0_6_3 - 0.0326758955330438*G0_1_0_6_4 - 0.00611959469102433*G0_1_0_6_5 + 0.0812216355073642*G0_1_0_6_6 - 0.00178107606679064*G0_1_0_6_7 + 0.0630226915941309*G0_1_0_6_9 - 0.000527726242012067*G0_1_0_7_0 - 0.0141623455909195*G0_1_0_7_1 + 0.000593692022263534*G0_1_0_7_2 - 0.0363065505922711*G0_1_0_7_3 + 0.0172627372627402*G0_1_0_7_4 - 0.00178107606679064*G0_1_0_7_6 - 0.00662194947909341*G0_1_0_7_7 + 0.00611959469102415*G0_1_0_7_8 + 0.00356215213358125*G0_1_0_7_9 - 0.00105291533862977*G0_1_0_8_0 + 0.0274950446379066*G0_1_0_8_1 - 0.00121021835307568*G0_1_0_8_2 + 0.0326758955330441*G0_1_0_8_3 + 0.00363065505922698*G0_1_0_8_4 + 0.00178107606679065*G0_1_0_8_5 + 0.00611959469102415*G0_1_0_8_7 - 0.081221635507363*G0_1_0_8_8 - 0.0630226915941307*G0_1_0_8_9 + 0.018587127158559*G0_1_0_9_1 - 0.0185871271585588*G0_1_0_9_2 + 0.0168517197088656*G0_1_0_9_3 - 0.0168517197088653*G0_1_0_9_4 - 0.00356215213358134*G0_1_0_9_5 + 0.0630226915941309*G0_1_0_9_6 + 0.00356215213358125*G0_1_0_9_7 - 0.0630226915941307*G0_1_0_9_8 + 0.00683563350230129*G0_1_1_0_0 + 0.0113870961490029*G0_1_1_0_1 - 0.00181402371878594*G0_1_1_0_2 + 0.00949938949939118*G0_1_1_0_3 - 0.00675292961007367*G0_1_1_0_4 - 0.000740212168783746*G0_1_1_0_5 + 0.00511393368536315*G0_1_1_0_6 + 0.00557093699950932*G0_1_1_0_7 - 0.00661402089973625*G0_1_1_0_8 + 0.00300080871509498*G0_1_1_0_9 + 0.0113870961490029*G0_1_1_1_0 + 0.297293817293868*G0_1_1_1_1 + 0.00985769081007342*G0_1_1_1_2 + 0.183340469054786*G0_1_1_1_3 - 0.0896379810665677*G0_1_1_1_4 - 0.00201861630433102*G0_1_1_1_5 + 0.00299161156304068*G0_1_1_1_6 - 0.0427972027972103*G0_1_1_1_7 + 0.0793834736692019*G0_1_1_1_8 + 0.0248893963179721*G0_1_1_1_9 - 0.00181402371878594*G0_1_1_2_0 + 0.00985769081007342*G0_1_1_2_1 - 0.0578519892805703*G0_1_1_2_2 + 0.0566966366966463*G0_1_1_2_3 - 0.0930764473621774*G0_1_1_2_4 + 0.0114200085628676*G0_1_1_2_5 - 0.0183625897911643*G0_1_1_2_6 + 0.00204589061731951*G0_1_1_2_7 + 0.000599717742575037*G0_1_1_2_8 - 0.00934494077351375*G0_1_1_2_9 + 0.00949938949939118*G0_1_1_3_0 + 0.183340469054786*G0_1_1_3_1 + 0.0566966366966463*G0_1_1_3_2 + 0.313863279577619*G0_1_1_3_3 - 0.0499643213929013*G0_1_1_3_4 - 0.00658484372770197*G0_1_1_3_5 - 0.0182474668188985*G0_1_1_3_6 - 0.03777080062795*G0_1_1_3_7 + 0.0488425859854518*G0_1_1_3_8 + 0.000873412301984126*G0_1_1_3_9 - 0.00675292961007367*G0_1_1_4_0 - 0.0896379810665677*G0_1_1_4_1 - 0.0930764473621774*G0_1_1_4_2 - 0.0499643213929013*G0_1_1_4_3 - 0.292747252747302*G0_1_1_4_4 + 0.0109861567004443*G0_1_1_4_5 + 0.00726131011845423*G0_1_1_4_6 + 0.0116968745540194*G0_1_1_4_7 - 0.0110717853575017*G0_1_1_4_8 + 0.00606250891965279*G0_1_1_4_9 - 0.000740212168783746*G0_1_1_5_0 - 0.00201861630433102*G0_1_1_5_1 + 0.0114200085628676*G0_1_1_5_2 - 0.00658484372770197*G0_1_1_5_3 + 0.0109861567004442*G0_1_1_5_4 + 0.0287483944626849*G0_1_1_5_5 - 0.0316797488226113*G0_1_1_5_6 + 0.0186270871985189*G0_1_1_5_7 - 0.00321678321678375*G0_1_1_5_8 - 0.00256885971171738*G0_1_1_5_9 + 0.00511393368536315*G0_1_1_6_0 + 0.00299161156304068*G0_1_1_6_1 - 0.0183625897911643*G0_1_1_6_2 - 0.0182474668188985*G0_1_1_6_3 + 0.00726131011845424*G0_1_1_6_4 - 0.0316797488226113*G0_1_1_6_5 + 0.104409875838465*G0_1_1_6_6 - 0.0154103039817351*G0_1_1_6_7 - 0.000750677893535239*G0_1_1_6_8 + 0.0645297559583383*G0_1_1_6_9 + 0.00557093699950932*G0_1_1_7_0 - 0.0427972027972103*G0_1_1_7_1 + 0.00204589061731951*G0_1_1_7_2 - 0.03777080062795*G0_1_1_7_3 + 0.0116968745540194*G0_1_1_7_4 + 0.0186270871985189*G0_1_1_7_5 - 0.0154103039817351*G0_1_1_7_6 + 0.0773740545169248*G0_1_1_7_7 + 0.00756101041815432*G0_1_1_7_8 + 0.0218181818181854*G0_1_1_7_9 - 0.00661402089973625*G0_1_1_8_0 + 0.0793834736692019*G0_1_1_8_1 + 0.000599717742575037*G0_1_1_8_2 + 0.0488425859854518*G0_1_1_8_3 - 0.0110717853575017*G0_1_1_8_4 - 0.00321678321678375*G0_1_1_8_5 - 0.000750677893535239*G0_1_1_8_6 + 0.00756101041815431*G0_1_1_8_7 - 0.143016983017006*G0_1_1_8_8 - 0.0525246182389126*G0_1_1_8_9 + 0.00300080871509498*G0_1_1_9_0 + 0.0248893963179721*G0_1_1_9_1 - 0.00934494077351375*G0_1_1_9_2 + 0.000873412301984126*G0_1_1_9_3 + 0.00606250891965279*G0_1_1_9_4 - 0.00256885971171738*G0_1_1_9_5 + 0.0645297559583383*G0_1_1_9_6 + 0.0218181818181854*G0_1_1_9_7 - 0.0525246182389126*G0_1_1_9_8 + 0.119195090623682*G0_1_1_9_9; + A[100] = A[153] + 0.0651082251082363*G0_0_0_0_0 + 0.00793090507376358*G0_0_0_0_2 - 0.00729936729936863*G0_0_0_0_3 - 0.0016497787926362*G0_0_0_0_4 + 0.0909826681255408*G0_0_0_0_5 - 0.0385354328211537*G0_0_0_0_6 + 0.017282400139546*G0_0_0_0_7 - 0.00624264624264737*G0_0_0_0_8 + 0.013183007468724*G0_0_0_0_9 - 0.065108225108236*G0_0_0_1_1 - 0.00793090507376355*G0_0_0_1_2 - 0.0909826681255408*G0_0_0_1_3 + 0.0385354328211537*G0_0_0_1_4 + 0.00729936729936852*G0_0_0_1_5 + 0.00164977879263622*G0_0_0_1_6 + 0.00624264624264737*G0_0_0_1_7 - 0.017282400139546*G0_0_0_1_8 - 0.0131830074687241*G0_0_0_1_9 + 0.00793090507376358*G0_0_0_2_0 - 0.00793090507376355*G0_0_0_2_1 - 0.0134519448805187*G0_0_0_2_3 + 0.00734249877107151*G0_0_0_2_4 + 0.0134519448805186*G0_0_0_2_5 - 0.00734249877107138*G0_0_0_2_6 - 0.00479710765425128*G0_0_0_2_7 + 0.00479710765425127*G0_0_0_2_8 - 0.00729936729936863*G0_0_0_3_0 - 0.0909826681255408*G0_0_0_3_1 - 0.0134519448805187*G0_0_0_3_2 - 0.39761381475674*G0_0_0_3_3 + 0.0636335093478061*G0_0_0_3_4 - 0.00494933637790862*G0_0_0_3_6 + 0.0218981018981058*G0_0_0_3_7 - 0.007506778935352*G0_0_0_3_8 - 0.00424718139003961*G0_0_0_3_9 - 0.0016497787926362*G0_0_0_4_0 + 0.0385354328211537*G0_0_0_4_1 + 0.00734249877107151*G0_0_0_4_2 + 0.0636335093478061*G0_0_0_4_3 - 0.0386242329099538*G0_0_0_4_4 + 0.00494933637790859*G0_0_0_4_5 + 0.0096703296703312*G0_0_0_4_7 - 0.0143913229627538*G0_0_0_4_8 - 0.0098986727558172*G0_0_0_4_9 + 0.0909826681255408*G0_0_0_5_0 + 0.00729936729936852*G0_0_0_5_1 + 0.0134519448805186*G0_0_0_5_2 + 0.00494933637790859*G0_0_0_5_4 + 0.397613814756739*G0_0_0_5_5 - 0.063633509347806*G0_0_0_5_6 + 0.00750677893535166*G0_0_0_5_7 - 0.0218981018981056*G0_0_0_5_8 + 0.00424718139003937*G0_0_0_5_9 - 0.0385354328211537*G0_0_0_6_0 + 0.00164977879263622*G0_0_0_6_1 - 0.00734249877107138*G0_0_0_6_2 - 0.00494933637790862*G0_0_0_6_3 - 0.063633509347806*G0_0_0_6_5 + 0.0386242329099538*G0_0_0_6_6 + 0.0143913229627539*G0_0_0_6_7 - 0.00967032967033123*G0_0_0_6_8 + 0.00989867275581723*G0_0_0_6_9 + 0.017282400139546*G0_0_0_7_0 + 0.00624264624264737*G0_0_0_7_1 - 0.00479710765425128*G0_0_0_7_2 + 0.0218981018981058*G0_0_0_7_3 + 0.00967032967033121*G0_0_0_7_4 + 0.00750677893535166*G0_0_0_7_5 + 0.0143913229627539*G0_0_0_7_6 - 0.0793606393606524*G0_0_0_7_7 - 0.0683316683316796*G0_0_0_7_9 - 0.00624264624264737*G0_0_0_8_0 - 0.017282400139546*G0_0_0_8_1 + 0.00479710765425126*G0_0_0_8_2 - 0.00750677893535201*G0_0_0_8_3 - 0.0143913229627538*G0_0_0_8_4 - 0.0218981018981056*G0_0_0_8_5 - 0.00967032967033123*G0_0_0_8_6 + 0.079360639360652*G0_0_0_8_8 + 0.0683316683316796*G0_0_0_8_9 + 0.013183007468724*G0_0_0_9_0 - 0.0131830074687241*G0_0_0_9_1 - 0.00424718139003962*G0_0_0_9_3 - 0.0098986727558172*G0_0_0_9_4 + 0.00424718139003937*G0_0_0_9_5 + 0.00989867275581723*G0_0_0_9_6 - 0.0683316683316796*G0_0_0_9_7 + 0.0683316683316796*G0_0_0_9_8 - 0.00565755232421976*G0_0_1_0_0 - 0.00787519358948071*G0_0_1_0_1 - 0.00138665567237019*G0_0_1_0_2 - 0.00718424432710279*G0_0_1_0_3 + 0.00198943913229664*G0_0_1_0_4 - 0.00943437514866233*G0_0_1_0_5 + 0.00516531087959742*G0_0_1_0_6 - 0.0118954061811223*G0_0_1_0_7 + 0.0111339454196615*G0_0_1_0_8 - 0.0019580419580423*G0_0_1_0_9 - 0.00787519358948071*G0_0_1_1_0 - 0.269732243065623*G0_0_1_1_1 - 0.0154826126254724*G0_0_1_1_2 - 0.163081363081391*G0_0_1_1_3 + 0.0714859743431294*G0_0_1_1_4 - 0.00507207078635728*G0_0_1_1_5 + 0.00370201227344146*G0_0_1_1_6 + 0.0245284873856346*G0_0_1_1_7 - 0.0460428460428543*G0_0_1_1_8 - 0.014043099757388*G0_0_1_1_9 - 0.00138665567237019*G0_0_1_2_0 - 0.0154826126254724*G0_0_1_2_1 - 0.000529417672274901*G0_0_1_2_2 - 0.0194342165770771*G0_0_1_2_3 + 0.00958533529962265*G0_0_1_2_4 - 0.0049864421293001*G0_0_1_2_5 + 0.00209504780933389*G0_0_1_2_6 - 0.00197802197802228*G0_0_1_2_7 + 0.00538033395176335*G0_0_1_2_8 + 0.000108462965605804*G0_0_1_2_9 - 0.00718424432710279*G0_0_1_3_0 - 0.163081363081391*G0_0_1_3_1 - 0.0194342165770771*G0_0_1_3_2 - 0.350843442272074*G0_0_1_3_3 + 0.0898273155416167*G0_0_1_3_4 + 0.014411302982734*G0_0_1_3_5 - 0.00315969744541224*G0_0_1_3_6 + 0.0294990723562205*G0_0_1_3_7 - 0.0213044098758426*G0_0_1_3_8 - 0.0168688454402773*G0_0_1_3_9 + 0.00198943913229664*G0_0_1_4_0 + 0.0714859743431294*G0_0_1_4_1 + 0.00958533529962265*G0_0_1_4_2 + 0.0898273155416167*G0_0_1_4_3 - 0.0428714142999931*G0_0_1_4_4 + 0.0019780219780223*G0_0_1_4_5 + 0.00118167546738995*G0_0_1_4_6 - 0.00399029541886762*G0_0_1_4_7 - 0.00819466248037788*G0_0_1_4_8 - 0.00428143285286199*G0_0_1_4_9 - 0.00943437514866233*G0_0_1_5_0 - 0.00507207078635728*G0_0_1_5_1 - 0.0049864421293001*G0_0_1_5_2 + 0.014411302982734*G0_0_1_5_3 + 0.0019780219780223*G0_0_1_5_4 - 0.084943627800785*G0_0_1_5_5 + 0.0204738119023866*G0_0_1_5_6 - 0.0370429570429632*G0_0_1_5_7 + 0.0231625517339842*G0_0_1_5_8 - 0.0404509775938416*G0_0_1_5_9 + 0.00516531087959742*G0_0_1_6_0 + 0.00370201227344146*G0_0_1_6_1 + 0.00209504780933389*G0_0_1_6_2 - 0.00315969744541224*G0_0_1_6_3 + 0.00118167546738995*G0_0_1_6_4 + 0.0204738119023866*G0_0_1_6_5 - 0.00506921649778867*G0_0_1_6_6 + 0.013880405308979*G0_0_1_6_7 - 0.0175966890252633*G0_0_1_6_8 + 0.00599400599400705*G0_0_1_6_9 - 0.0118954061811223*G0_0_1_7_0 + 0.0245284873856346*G0_0_1_7_1 - 0.00197802197802228*G0_0_1_7_2 + 0.0294990723562205*G0_0_1_7_3 - 0.00399029541886762*G0_0_1_7_4 - 0.0370429570429632*G0_0_1_7_5 + 0.013880405308979*G0_0_1_7_6 - 0.0102411873840462*G0_0_1_7_7 - 0.0172370486656228*G0_0_1_7_8 - 0.0218866847438312*G0_0_1_7_9 + 0.0111339454196615*G0_0_1_8_0 - 0.0460428460428543*G0_0_1_8_1 + 0.00538033395176335*G0_0_1_8_2 - 0.0213044098758426*G0_0_1_8_3 - 0.00819466248037788*G0_0_1_8_4 + 0.0231625517339842*G0_0_1_8_5 - 0.0175966890252633*G0_0_1_8_6 - 0.0172370486656228*G0_0_1_8_7 + 0.189496218067677*G0_0_1_8_8 + 0.0585186242329195*G0_0_1_8_9 - 0.0019580419580423*G0_0_1_9_0 - 0.014043099757388*G0_0_1_9_1 + 0.000108462965605803*G0_0_1_9_2 - 0.0168688454402773*G0_0_1_9_3 - 0.00428143285286199*G0_0_1_9_4 - 0.0404509775938416*G0_0_1_9_5 + 0.00599400599400705*G0_0_1_9_6 - 0.0218866847438312*G0_0_1_9_7 + 0.0585186242329195*G0_0_1_9_8 - 0.033703439417731*G0_0_1_9_9 - 0.204624017957387*G0_1_0_0_0 - 0.00787519358948069*G0_1_0_0_1 - 0.00755170755170886*G0_1_0_0_2 - 0.0123714380857259*G0_1_0_0_3 + 0.00205223348080527*G0_1_0_0_4 - 0.0720986949558503*G0_1_0_0_5 + 0.0329505415219758*G0_1_0_0_6 - 0.0287604459033081*G0_1_0_0_7 + 0.0182858411429872*G0_1_0_0_8 - 0.000860092288663996*G0_1_0_0_9 - 0.00787519358948069*G0_1_0_1_0 - 0.0707657774324558*G0_1_0_1_1 - 0.00931756074613373*G0_1_0_1_2 - 0.100417043274203*G0_1_0_1_3 + 0.0437007437007511*G0_1_0_1_4 + 0.000115122972265838*G0_1_0_1_5 + 0.00363921792493283*G0_1_0_1_6 + 0.0173765916623089*G0_1_0_1_7 - 0.0291778063206684*G0_1_0_1_8 - 0.0151410494267663*G0_1_0_1_9 - 0.00755170755170885*G0_1_0_2_0 - 0.00931756074613373*G0_1_0_2_1 - 0.000529417672274834*G0_1_0_2_2 - 0.0184383870098187*G0_1_0_2_3 + 0.00943754658040535*G0_1_0_2_4 - 0.00598227169655844*G0_1_0_2_5 + 0.00224283652855121*G0_1_0_2_6 + 0.000583226297512104*G0_1_0_2_7 + 0.00281908567622899*G0_1_0_2_8 + 0.000108462965605825*G0_1_0_2_9 - 0.0123714380857259*G0_1_0_3_0 - 0.100417043274203*G0_1_0_3_1 - 0.0184383870098187*G0_1_0_3_2 - 0.482557442557525*G0_1_0_3_3 + 0.0841073212501926*G0_1_0_3_4 + 0.014411302982734*G0_1_0_3_5 - 0.00297131439988631*G0_1_0_3_6 + 0.0450606536320899*G0_1_0_3_7 - 0.0445497359783151*G0_1_0_3_8 - 0.0446981589838811*G0_1_0_3_9 + 0.00205223348080527*G0_1_0_4_0 + 0.0437007437007511*G0_1_0_4_1 + 0.00943754658040535*G0_1_0_4_2 + 0.0841073212501926*G0_1_0_4_3 - 0.0436934494077424*G0_1_0_4_4 + 0.00178963893249638*G0_1_0_4_5 + 0.00118167546738994*G0_1_0_4_6 - 0.00792635935493214*G0_1_0_4_7 - 0.000510917653774803*G0_1_0_4_8 - 0.00390466676181021*G0_1_0_4_9 - 0.0720986949558503*G0_1_0_5_0 + 0.000115122972265838*G0_1_0_5_1 - 0.00598227169655844*G0_1_0_5_2 + 0.014411302982734*G0_1_0_5_3 + 0.00178963893249638*G0_1_0_5_4 + 0.0467703724846657*G0_1_0_5_5 + 0.0261938061938107*G0_1_0_5_6 - 0.0137976309404905*G0_1_0_5_7 + 0.00760097045811467*G0_1_0_5_8 - 0.0126216640502377*G0_1_0_5_9 + 0.0329505415219758*G0_1_0_6_0 + 0.00363921792493283*G0_1_0_6_1 + 0.00224283652855121*G0_1_0_6_2 - 0.00297131439988632*G0_1_0_6_3 + 0.00118167546738994*G0_1_0_6_4 + 0.0261938061938107*G0_1_0_6_5 - 0.00424718139003946*G0_1_0_6_6 + 0.00619666048237586*G0_1_0_6_7 - 0.0136606250891988*G0_1_0_6_8 + 0.00561723990295515*G0_1_0_6_9 - 0.0287604459033081*G0_1_0_7_0 + 0.0173765916623089*G0_1_0_7_1 + 0.000583226297512103*G0_1_0_7_2 + 0.0450606536320899*G0_1_0_7_3 - 0.00792635935493214*G0_1_0_7_4 - 0.0137976309404905*G0_1_0_7_5 + 0.00619666048237586*G0_1_0_7_6 + 0.110135578707026*G0_1_0_7_7 - 0.0172370486656228*G0_1_0_7_8 - 0.00981304409875999*G0_1_0_7_9 + 0.0182858411429872*G0_1_0_8_0 - 0.0291778063206684*G0_1_0_8_1 + 0.00281908567622899*G0_1_0_8_2 - 0.0445497359783151*G0_1_0_8_3 - 0.0005109176537748*G0_1_0_8_4 + 0.00760097045811466*G0_1_0_8_5 - 0.0136606250891988*G0_1_0_8_6 - 0.0172370486656228*G0_1_0_8_7 + 0.0691194519766061*G0_1_0_8_8 + 0.0464449835878485*G0_1_0_8_9 - 0.000860092288663997*G0_1_0_9_0 - 0.0151410494267663*G0_1_0_9_1 + 0.000108462965605826*G0_1_0_9_2 - 0.0446981589838811*G0_1_0_9_3 - 0.00390466676181021*G0_1_0_9_4 - 0.0126216640502377*G0_1_0_9_5 + 0.00561723990295515*G0_1_0_9_6 - 0.00981304409875999*G0_1_0_9_7 + 0.0464449835878485*G0_1_0_9_8 - 0.033703439417731*G0_1_0_9_9 + 0.0252784252784292*G0_1_1_0_0 - 0.00787519358948073*G0_1_1_0_1 + 0.000543900543900617*G0_1_1_0_2 - 0.013008895866041*G0_1_1_0_3 + 0.00330241187384103*G0_1_1_0_4 + 0.0125081267938431*G0_1_1_0_5 - 0.00504289361432297*G0_1_1_0_6 + 0.0272565529708432*G0_1_1_0_7 - 0.0114885114885134*G0_1_1_0_8 + 0.00235003092145988*G0_1_1_0_9 - 0.00787519358948073*G0_1_1_1_0 - 0.300668220668272*G0_1_1_1_1 - 0.0174131688417432*G0_1_1_1_2 - 0.185023865023897*G0_1_1_1_3 + 0.0816941788370498*G0_1_1_1_4 + 0.000752580752580941*G0_1_1_1_5 + 0.00238903953189706*G0_1_1_1_6 + 0.0471509442938096*G0_1_1_1_7 - 0.08519480519482*G0_1_1_1_8 - 0.0183511726368901*G0_1_1_1_9 + 0.000543900543900617*G0_1_1_2_0 - 0.0174131688417432*G0_1_1_2_1 - 0.000529417672274901*G0_1_1_2_2 - 0.0246302903445802*G0_1_1_2_3 + 0.0113137655994818*G0_1_1_2_4 + 0.00020963163820309*G0_1_1_2_5 + 0.000366617509474736*G0_1_1_2_6 + 0.00411493268636194*G0_1_1_2_7 - 0.00071262071262088*G0_1_1_2_8 + 0.000108462965605802*G0_1_1_2_9 - 0.013008895866041*G0_1_1_3_0 - 0.185023865023897*G0_1_1_3_1 - 0.0246302903445802*G0_1_1_3_2 - 0.402962751534249*G0_1_1_3_3 + 0.111879549022425*G0_1_1_3_4 + 0.014411302982734*G0_1_1_3_5 + 0.000779220779220925*G0_1_1_3_6 + 0.046973026973035*G0_1_1_3_7 - 0.0570572284858099*G0_1_1_3_8 - 0.0388925360354*G0_1_1_3_9 + 0.00330241187384103*G0_1_1_4_0 + 0.0816941788370498*G0_1_1_4_1 + 0.0113137655994818*G0_1_1_4_2 + 0.111879549022425*G0_1_1_4_3 - 0.0508405879834537*G0_1_1_4_4 - 0.00196089624661087*G0_1_1_4_5 + 0.00118167546738995*G0_1_1_4_6 - 0.0150991865277605*G0_1_1_4_7 + 0.0100842015127748*G0_1_1_4_8 + 0.00359640359640435*G0_1_1_4_9 + 0.0125081267938431*G0_1_1_5_0 + 0.00075258075258094*G0_1_1_5_1 + 0.00020963163820309*G0_1_1_5_2 + 0.014411302982734*G0_1_1_5_3 - 0.00196089624661087*G0_1_1_5_4 - 0.0328243185386101*G0_1_1_5_5 - 0.00157842157842184*G0_1_1_5_6 - 0.00129013843299594*G0_1_1_5_7 + 0.00568859711716959*G0_1_1_5_8 - 0.0184272869987188*G0_1_1_5_9 - 0.00504289361432297*G0_1_1_6_0 + 0.00238903953189706*G0_1_1_6_1 + 0.000366617509474736*G0_1_1_6_2 + 0.000779220779220925*G0_1_1_6_3 + 0.00118167546738995*G0_1_1_6_4 - 0.00157842157842184*G0_1_1_6_5 + 0.00289995718567199*G0_1_1_6_6 - 0.00439845868417365*G0_1_1_6_7 - 0.00648779791637039*G0_1_1_6_8 - 0.00188383045525927*G0_1_1_6_9 + 0.0272565529708432*G0_1_1_7_0 + 0.0471509442938096*G0_1_1_7_1 + 0.00411493268636194*G0_1_1_7_2 + 0.046973026973035*G0_1_1_7_3 - 0.0150991865277605*G0_1_1_7_4 - 0.00129013843299594*G0_1_1_7_5 - 0.00439845868417365*G0_1_1_7_6 + 0.0222977022977056*G0_1_1_7_7 - 0.0172370486656227*G0_1_1_7_8 + 0.00174682460396773*G0_1_1_7_9 - 0.0114885114885134*G0_1_1_8_0 - 0.08519480519482*G0_1_1_8_1 - 0.00071262071262088*G0_1_1_8_2 - 0.0570572284858099*G0_1_1_8_3 + 0.0100842015127748*G0_1_1_8_4 + 0.00568859711716959*G0_1_1_8_5 - 0.00648779791637039*G0_1_1_8_6 - 0.0172370486656227*G0_1_1_8_7 + 0.156957328385925*G0_1_1_8_8 + 0.0348851148851206*G0_1_1_8_9 + 0.00235003092145988*G0_1_1_9_0 - 0.0183511726368901*G0_1_1_9_1 + 0.000108462965605802*G0_1_1_9_2 - 0.0388925360354*G0_1_1_9_3 + 0.00359640359640435*G0_1_1_9_4 - 0.0184272869987188*G0_1_1_9_5 - 0.00188383045525927*G0_1_1_9_6 + 0.00174682460396773*G0_1_1_9_7 + 0.0348851148851206*G0_1_1_9_8 - 0.0337034394177311*G0_1_1_9_9; + A[163] = -A[153] + 0.0238161838161879*G0_0_0_0_0 + 0.00180570751999355*G0_0_0_0_2 - 0.0079615622472779*G0_0_0_0_3 + 0.00274297131440034*G0_0_0_0_4 + 0.0306116106116159*G0_0_0_0_5 - 0.0122360179503058*G0_0_0_0_6 + 0.00484626484626566*G0_0_0_0_7 - 0.00889713461142182*G0_0_0_0_8 - 0.0183740069454386*G0_0_0_0_9 - 0.0238161838161881*G0_0_0_1_1 - 0.00180570751999354*G0_0_0_1_2 - 0.0306116106116159*G0_0_0_1_3 + 0.0122360179503057*G0_0_0_1_4 + 0.00796156224727787*G0_0_0_1_5 - 0.00274297131440035*G0_0_0_1_6 + 0.00889713461142184*G0_0_0_1_7 - 0.00484626484626571*G0_0_0_1_8 + 0.0183740069454386*G0_0_0_1_9 + 0.00180570751999355*G0_0_0_2_0 - 0.00180570751999355*G0_0_0_2_1 - 0.0111609025894759*G0_0_0_2_3 + 0.00547769690626923*G0_0_0_2_4 + 0.0111609025894759*G0_0_0_2_5 - 0.00547769690626929*G0_0_0_2_6 + 0.012948004376578*G0_0_0_2_7 - 0.012948004376578*G0_0_0_2_8 - 0.0079615622472779*G0_0_0_3_0 - 0.0306116106116159*G0_0_0_3_1 - 0.0111609025894759*G0_0_0_3_2 - 0.23447409733128*G0_0_0_3_3 + 0.0423034108748466*G0_0_0_3_4 + 0.00822891394320105*G0_0_0_3_6 + 0.0238846867418336*G0_0_0_3_7 - 0.0627286998715675*G0_0_0_3_8 - 0.102891394319983*G0_0_0_3_9 + 0.00274297131440034*G0_0_0_4_0 + 0.0122360179503057*G0_0_0_4_1 + 0.00547769690626923*G0_0_0_4_2 + 0.0423034108748466*G0_0_0_4_3 - 0.0385043527900735*G0_0_0_4_4 - 0.00822891394320105*G0_0_0_4_5 - 0.0235364635364675*G0_0_0_4_7 + 0.0388440131297339*G0_0_0_4_8 + 0.0164578278864021*G0_0_0_4_9 + 0.0306116106116159*G0_0_0_5_0 + 0.00796156224727787*G0_0_0_5_1 + 0.0111609025894759*G0_0_0_5_2 - 0.00822891394320105*G0_0_0_5_4 + 0.23447409733128*G0_0_0_5_5 - 0.0423034108748466*G0_0_0_5_6 + 0.0627286998715674*G0_0_0_5_7 - 0.0238846867418336*G0_0_0_5_8 + 0.102891394319983*G0_0_0_5_9 - 0.0122360179503058*G0_0_0_6_0 - 0.00274297131440035*G0_0_0_6_1 - 0.00547769690626929*G0_0_0_6_2 + 0.00822891394320105*G0_0_0_6_3 - 0.0423034108748466*G0_0_0_6_5 + 0.0385043527900735*G0_0_0_6_6 - 0.0388440131297339*G0_0_0_6_7 + 0.0235364635364675*G0_0_0_6_8 - 0.0164578278864021*G0_0_0_6_9 + 0.00484626484626566*G0_0_0_7_0 + 0.00889713461142184*G0_0_0_7_1 + 0.012948004376578*G0_0_0_7_2 + 0.0238846867418336*G0_0_0_7_3 - 0.0235364635364675*G0_0_0_7_4 + 0.0627286998715674*G0_0_0_7_5 - 0.0388440131297339*G0_0_0_7_6 + 0.105443128300288*G0_0_0_7_7 + 0.132810047095784*G0_0_0_7_9 - 0.00889713461142182*G0_0_0_8_0 - 0.0048462648462657*G0_0_0_8_1 - 0.012948004376578*G0_0_0_8_2 - 0.0627286998715675*G0_0_0_8_3 + 0.0388440131297339*G0_0_0_8_4 - 0.0238846867418336*G0_0_0_8_5 + 0.0235364635364675*G0_0_0_8_6 - 0.105443128300289*G0_0_0_8_8 - 0.132810047095784*G0_0_0_8_9 - 0.0183740069454386*G0_0_0_9_0 + 0.0183740069454386*G0_0_0_9_1 - 0.102891394319983*G0_0_0_9_3 + 0.0164578278864021*G0_0_0_9_4 + 0.102891394319983*G0_0_0_9_5 - 0.0164578278864021*G0_0_0_9_6 + 0.132810047095784*G0_0_0_9_7 - 0.132810047095784*G0_0_0_9_8 + 0.00815283481950244*G0_0_1_0_0 + 0.00238819381676571*G0_0_1_0_1 - 0.00103335817621551*G0_0_1_0_2 - 0.0106090734662181*G0_0_1_0_3 + 0.00500959358102298*G0_0_1_0_4 + 0.00621124906839276*G0_0_1_0_5 + 0.00585668299954106*G0_0_1_0_7 - 0.0323641437927207*G0_0_1_0_8 - 0.00902526045383341*G0_0_1_0_9 + 0.0023881938167657*G0_0_1_1_0 + 0.206687140020509*G0_0_1_1_1 + 0.00595235452378411*G0_0_1_1_2 + 0.0566455766455864*G0_0_1_1_3 - 0.0257653457653502*G0_0_1_1_4 - 0.000280354566068966*G0_0_1_1_5 - 0.000467786182071971*G0_0_1_1_6 - 0.00939060939061118*G0_0_1_1_7 + 0.00311688311688419*G0_0_1_1_8 + 0.00340992340992407*G0_0_1_1_9 - 0.00103335817621551*G0_0_1_2_0 + 0.00595235452378411*G0_0_1_2_1 - 0.00250627679199152*G0_0_1_2_2 - 0.0094778237635396*G0_0_1_2_3 + 0.00845186559472412*G0_0_1_2_4 + 0.00190507904793649*G0_0_1_2_5 + 0.00257012828441441*G0_0_1_2_6 + 0.00827680256251821*G0_0_1_2_7 - 0.0349304663590436*G0_0_1_2_8 - 0.0172265829408715*G0_0_1_2_9 - 0.0106090734662181*G0_0_1_3_0 + 0.0566455766455864*G0_0_1_3_1 - 0.0094778237635396*G0_0_1_3_2 - 0.295404595404645*G0_0_1_3_3 + 0.0279035250463868*G0_0_1_3_4 + 0.0106236620522352*G0_0_1_3_5 + 0.0128243185386064*G0_0_1_3_6 + 0.0432481803910446*G0_0_1_3_7 - 0.159460539460566*G0_0_1_3_8 - 0.0967261310118616*G0_0_1_3_9 + 0.00500959358102298*G0_0_1_4_0 - 0.0257653457653502*G0_0_1_4_1 + 0.00845186559472412*G0_0_1_4_2 + 0.0279035250463867*G0_0_1_4_3 - 0.0469616098187605*G0_0_1_4_4 - 0.00360782075067848*G0_0_1_4_5 - 0.0092164977879279*G0_0_1_4_6 - 0.025640074211507*G0_0_1_4_7 + 0.116212359069521*G0_0_1_4_8 + 0.0588953903239716*G0_0_1_4_9 + 0.00621124906839276*G0_0_1_5_0 - 0.000280354566068966*G0_0_1_5_1 + 0.00190507904793649*G0_0_1_5_2 + 0.0106236620522352*G0_0_1_5_3 - 0.00360782075067848*G0_0_1_5_4 + 0.0122135007849313*G0_0_1_5_5 - 0.00631654060225584*G0_0_1_5_6 + 0.00114742400456705*G0_0_1_5_7 + 0.0122620236905972*G0_0_1_5_8 + 0.00255173398030582*G0_0_1_5_9 - 0.000467786182071971*G0_0_1_6_1 + 0.00257012828441441*G0_0_1_6_2 + 0.0128243185386064*G0_0_1_6_3 - 0.0092164977879279*G0_0_1_6_4 - 0.00631654060225584*G0_0_1_6_5 + 0.000174111602683039*G0_0_1_6_6 - 0.0134094476951642*G0_0_1_6_7 + 0.0473868988154781*G0_0_1_6_8 + 0.0260311117454018*G0_0_1_6_9 + 0.00585668299954106*G0_0_1_7_0 - 0.00939060939061118*G0_0_1_7_1 + 0.00827680256251821*G0_0_1_7_2 + 0.0432481803910446*G0_0_1_7_3 - 0.025640074211507*G0_0_1_7_4 + 0.00114742400456705*G0_0_1_7_5 - 0.0134094476951642*G0_0_1_7_6 + 0.006230911945199*G0_0_1_7_7 + 0.163205366062536*G0_0_1_7_8 + 0.0538946767518286*G0_0_1_7_9 - 0.0323641437927207*G0_0_1_8_0 + 0.0031168831168842*G0_0_1_8_1 - 0.0349304663590436*G0_0_1_8_2 - 0.159460539460566*G0_0_1_8_3 + 0.116212359069521*G0_0_1_8_4 + 0.0122620236905972*G0_0_1_8_5 + 0.0473868988154781*G0_0_1_8_6 + 0.163205366062536*G0_0_1_8_7 - 0.962297702297864*G0_0_1_8_8 - 0.242654488368815*G0_0_1_8_9 - 0.00902526045383341*G0_0_1_9_0 + 0.00340992340992407*G0_0_1_9_1 - 0.0172265829408715*G0_0_1_9_2 - 0.0967261310118616*G0_0_1_9_3 + 0.0588953903239716*G0_0_1_9_4 + 0.00255173398030582*G0_0_1_9_5 + 0.0260311117454019*G0_0_1_9_6 + 0.0538946767518286*G0_0_1_9_7 - 0.242654488368815*G0_0_1_9_8 - 0.093609247894978*G0_0_1_9_9 - 0.00328264328264382*G0_1_0_0_0 - 0.00146055003197886*G0_1_0_0_1 - 0.000108885823171557*G0_1_0_0_2 - 0.00802657659800656*G0_1_0_0_3 + 0.000159523016665906*G0_1_0_0_4 - 0.000388500388500436*G0_1_0_0_5 + 0.00725274725274847*G0_1_0_0_7 - 0.00150896722325321*G0_1_0_0_8 - 0.000525189096617777*G0_1_0_0_9 - 0.00146055003197886*G0_1_0_1_0 - 0.0270988270988319*G0_1_0_1_1 - 0.0019145933431651*G0_1_0_1_2 - 0.0310001110001163*G0_1_0_1_3 + 0.0122366522366543*G0_1_0_1_4 - 0.00258344829773445*G0_1_0_1_6 + 0.00738816738816868*G0_1_0_1_7 + 0.00240648240648272*G0_1_0_1_8 + 0.0178488178488208*G0_1_0_1_9 - 0.000108885823171557*G0_1_0_2_0 - 0.0019145933431651*G0_1_0_2_1 - 0.00380952380952445*G0_1_0_2_2 - 0.0123800009514316*G0_1_0_2_3 + 0.0100470957613832*G0_1_0_2_4 - 0.00121909836195571*G0_1_0_2_5 + 0.00456939885511392*G0_1_0_2_6 - 0.00265670837099453*G0_1_0_2_7 - 0.0156047127475725*G0_1_0_2_8 - 0.0232529375386557*G0_1_0_2_9 - 0.00802657659800656*G0_1_0_3_0 - 0.0310001110001163*G0_1_0_3_1 - 0.0123800009514316*G0_1_0_3_2 - 0.260559440559484*G0_1_0_3_3 + 0.0466248037676687*G0_1_0_3_4 + 0.0106550592264896*G0_1_0_3_5 + 0.0107149992864297*G0_1_0_3_6 + 0.0270443841872459*G0_1_0_3_7 - 0.0768231768231897*G0_1_0_3_8 - 0.107635221920954*G0_1_0_3_9 + 0.000159523016665906*G0_1_0_4_0 + 0.0122366522366543*G0_1_0_4_1 + 0.0100470957613832*G0_1_0_4_2 + 0.0466248037676687*G0_1_0_4_3 - 0.0525845582988528*G0_1_0_4_4 + 0.00248608534322862*G0_1_0_4_5 - 0.0132010846296583*G0_1_0_4_6 + 0.00226345083487979*G0_1_0_4_7 + 0.0497787926359439*G0_1_0_4_8 + 0.06478664192951*G0_1_0_4_9 - 0.000388500388500435*G0_1_0_5_0 - 0.00121909836195571*G0_1_0_5_2 + 0.0106550592264896*G0_1_0_5_3 + 0.00248608534322862*G0_1_0_5_4 - 0.0260853432282049*G0_1_0_5_5 + 0.00432139289282213*G0_1_0_5_6 - 0.0140944769516222*G0_1_0_5_7 + 0.00315969744541228*G0_1_0_5_8 - 0.00474382760097131*G0_1_0_5_9 - 0.00258344829773445*G0_1_0_6_1 + 0.00456939885511392*G0_1_0_6_2 + 0.0107149992864297*G0_1_0_6_3 - 0.0132010846296583*G0_1_0_6_4 + 0.00432139289282213*G0_1_0_6_5 - 0.0140802055087795*G0_1_0_6_6 + 0.0109347795062099*G0_1_0_6_7 + 0.0257999143713473*G0_1_0_6_8 + 0.0483288140431079*G0_1_0_6_9 + 0.00725274725274847*G0_1_0_7_0 + 0.00738816738816868*G0_1_0_7_1 - 0.00265670837099453*G0_1_0_7_2 + 0.0270443841872459*G0_1_0_7_3 + 0.00226345083487979*G0_1_0_7_4 - 0.0140944769516222*G0_1_0_7_5 + 0.0109347795062099*G0_1_0_7_6 - 0.0527786499215159*G0_1_0_7_7 - 0.00176965891251636*G0_1_0_7_8 - 0.0202939917225666*G0_1_0_7_9 - 0.00150896722325321*G0_1_0_8_0 + 0.00240648240648272*G0_1_0_8_1 - 0.0156047127475725*G0_1_0_8_2 - 0.0768231768231897*G0_1_0_8_3 + 0.0497787926359439*G0_1_0_8_4 + 0.00315969744541228*G0_1_0_8_5 + 0.0257999143713473*G0_1_0_8_6 - 0.00176965891251636*G0_1_0_8_7 - 0.158221778221805*G0_1_0_8_8 - 0.15310403881835*G0_1_0_8_9 - 0.000525189096617779*G0_1_0_9_0 + 0.0178488178488208*G0_1_0_9_1 - 0.0232529375386557*G0_1_0_9_2 - 0.107635221920954*G0_1_0_9_3 + 0.06478664192951*G0_1_0_9_4 - 0.00474382760097131*G0_1_0_9_5 + 0.0483288140431079*G0_1_0_9_6 - 0.0202939917225666*G0_1_0_9_7 - 0.15310403881835*G0_1_0_9_8 - 0.360976166690513*G0_1_0_9_9 - 0.00678630011963452*G0_1_1_0_0 + 0.00509021842355269*G0_1_1_0_1 - 0.00907917479346205*G0_1_1_0_3 - 0.000751312179883752*G0_1_1_0_4 - 0.000413237556094727*G0_1_1_0_5 + 0.000117660117660122*G0_1_1_0_6 + 0.0149675721104318*G0_1_1_0_7 - 0.00605902034473573*G0_1_1_0_8 - 0.000576566290852106*G0_1_1_0_9 + 0.00509021842355269*G0_1_1_1_0 + 0.245576645576688*G0_1_1_1_1 + 0.0097216363883047*G0_1_1_1_2 + 0.0814740814740954*G0_1_1_1_3 - 0.0390320790320857*G0_1_1_1_4 - 0.00150960150960184*G0_1_1_1_5 - 0.00433344433344504*G0_1_1_1_6 - 0.0189632589632624*G0_1_1_1_7 + 0.0770340770340905*G0_1_1_1_8 + 0.0258941058941104*G0_1_1_1_9 + 0.0097216363883047*G0_1_1_2_1 - 0.00419390133675917*G0_1_1_2_2 - 0.00837670266241832*G0_1_1_2_3 + 0.0118354661211824*G0_1_1_2_4 - 0.00179407893693638*G0_1_1_2_5 + 0.00623408337694157*G0_1_1_2_6 - 0.00542853971425493*G0_1_1_2_7 - 0.0416865674008601*G0_1_1_2_8 - 0.0286247086247134*G0_1_1_2_9 - 0.00907917479346205*G0_1_1_3_0 + 0.0814740814740954*G0_1_1_3_1 - 0.00837670266241832*G0_1_1_3_2 - 0.33390609390615*G0_1_1_3_3 + 0.0186613386613416*G0_1_1_3_4 + 0.0150563721992318*G0_1_1_3_5 + 0.0146539175110628*G0_1_1_3_6 + 0.0288911088911137*G0_1_1_3_7 - 0.155604395604421*G0_1_1_3_8 - 0.135464535464558*G0_1_1_3_9 - 0.000751312179883751*G0_1_1_4_0 - 0.0390320790320857*G0_1_1_4_1 + 0.0118354661211824*G0_1_1_4_2 + 0.0186613386613416*G0_1_1_4_3 - 0.0613672042243573*G0_1_1_4_4 + 0.00390752105037886*G0_1_1_4_5 - 0.0185614385614417*G0_1_1_4_6 + 0.00844298558584425*G0_1_1_4_7 + 0.126713286713308*G0_1_1_4_8 + 0.0780590837733827*G0_1_1_4_9 - 0.000413237556094727*G0_1_1_5_0 - 0.00150960150960184*G0_1_1_5_1 - 0.00179407893693638*G0_1_1_5_2 + 0.0150563721992318*G0_1_1_5_3 + 0.00390752105037887*G0_1_1_5_4 - 0.0137062937062959*G0_1_1_5_5 + 0.00671614100185637*G0_1_1_5_6 - 0.0241215926930252*G0_1_1_5_7 + 0.00618238903953291*G0_1_1_5_8 - 0.0106350792065096*G0_1_1_5_9 + 0.000117660117660122*G0_1_1_6_0 - 0.00433344433344504*G0_1_1_6_1 + 0.00623408337694157*G0_1_1_6_2 + 0.0146539175110628*G0_1_1_6_3 - 0.0185614385614417*G0_1_1_6_4 + 0.00671614100185637*G0_1_1_6_5 - 0.0106236620522352*G0_1_1_6_6 + 0.0179392036534924*G0_1_1_6_7 + 0.0682032253460938*G0_1_1_6_8 + 0.0565662908520147*G0_1_1_6_9 + 0.0149675721104318*G0_1_1_7_0 - 0.0189632589632624*G0_1_1_7_1 - 0.00542853971425493*G0_1_1_7_2 + 0.0288911088911137*G0_1_1_7_3 + 0.00844298558584425*G0_1_1_7_4 - 0.0241215926930252*G0_1_1_7_5 + 0.0179392036534924*G0_1_1_7_6 - 0.176132438989611*G0_1_1_7_7 + 0.0093906093906106*G0_1_1_7_8 - 0.0341487084344286*G0_1_1_7_9 - 0.00605902034473572*G0_1_1_8_0 + 0.0770340770340905*G0_1_1_8_1 - 0.0416865674008601*G0_1_1_8_2 - 0.155604395604421*G0_1_1_8_3 + 0.126713286713308*G0_1_1_8_4 + 0.00618238903953291*G0_1_1_8_5 + 0.0682032253460938*G0_1_1_8_6 + 0.00939060939061061*G0_1_1_8_7 - 1.09794205794224*G0_1_1_8_8 - 0.331108891108947*G0_1_1_8_9 - 0.000576566290852106*G0_1_1_9_0 + 0.0258941058941104*G0_1_1_9_1 - 0.0286247086247134*G0_1_1_9_2 - 0.135464535464558*G0_1_1_9_3 + 0.0780590837733827*G0_1_1_9_4 - 0.0106350792065096*G0_1_1_9_5 + 0.0565662908520147*G0_1_1_9_6 - 0.0341487084344286*G0_1_1_9_7 - 0.331108891108947*G0_1_1_9_8 - 0.25441986584848*G0_1_1_9_9; + A[205] = A[163] - 0.0145632145632167*G0_0_1_0_0 - 0.000473600473600558*G0_0_1_0_1 + 0.000544006258292078*G0_0_1_0_2 - 0.00285999714571194*G0_0_1_0_3 - 0.00419009561866775*G0_0_1_0_4 - 0.00839160839160962*G0_0_1_0_5 + 0.00122163550734994*G0_0_1_0_6 + 0.00375624375624442*G0_0_1_0_7 + 0.0235992578849762*G0_0_1_0_8 + 0.00666761809619064*G0_0_1_0_9 - 0.000473600473600558*G0_0_1_1_0 - 0.0379472379472444*G0_0_1_1_1 - 0.00208236208236243*G0_0_1_1_2 - 0.0267732267732313*G0_0_1_1_3 + 0.0114285714285734*G0_0_1_1_4 - 0.00151848151848177*G0_0_1_1_6 + 0.00237096237096281*G0_0_1_1_7 + 0.0185148185148215*G0_0_1_1_8 + 0.0115084915084934*G0_0_1_1_9 + 0.000544006258292078*G0_0_1_2_0 - 0.00208236208236243*G0_0_1_2_1 - 0.000779749351178036*G0_0_1_2_2 - 0.00205508776937382*G0_0_1_2_3 + 0.00152419009561895*G0_0_1_2_4 - 0.00327291755863238*G0_0_1_2_5 + 0.00207601921887672*G0_0_1_2_6 - 0.0100585129156575*G0_0_1_2_7 + 0.017639503353792*G0_0_1_2_8 - 0.00461253032681683*G0_0_1_2_9 - 0.00285999714571194*G0_0_1_3_0 - 0.0267732267732313*G0_0_1_3_1 - 0.00205508776937383*G0_0_1_3_2 - 0.107652347652365*G0_0_1_3_3 + 0.0135464535464557*G0_0_1_3_4 + 0.00774083059797476*G0_0_1_3_5 - 0.0022263450834883*G0_0_1_3_6 + 0.00179820179820218*G0_0_1_3_7 + 0.0579020979021074*G0_0_1_3_8 - 0.0381218781218846*G0_0_1_3_9 - 0.00419009561866775*G0_0_1_4_0 + 0.0114285714285734*G0_0_1_4_1 + 0.00152419009561895*G0_0_1_4_2 + 0.0135464535464557*G0_0_1_4_3 - 0.00952190666476538*G0_0_1_4_4 + 0.00578849721706962*G0_0_1_4_5 - 0.00356215213358132*G0_0_1_4_6 + 0.0247638076209546*G0_0_1_4_7 - 0.0597002997003097*G0_0_1_4_8 + 0.00226059654631122*G0_0_1_4_9 - 0.00839160839160962*G0_0_1_5_0 - 0.00327291755863238*G0_0_1_5_2 + 0.00774083059797477*G0_0_1_5_3 + 0.00578849721706962*G0_0_1_5_4 - 0.0490823462252118*G0_0_1_5_5 + 0.0111831026116758*G0_0_1_5_6 - 0.0167318395889853*G0_0_1_5_7 - 0.00666190951905351*G0_0_1_5_8 - 0.00667903525046503*G0_0_1_5_9 + 0.00122163550734994*G0_0_1_6_0 - 0.00151848151848177*G0_0_1_6_1 + 0.00207601921887672*G0_0_1_6_2 - 0.0022263450834883*G0_0_1_6_3 - 0.00356215213358132*G0_0_1_6_4 + 0.0111831026116758*G0_0_1_6_5 - 0.0173312401883863*G0_0_1_6_6 + 0.0233937491080387*G0_0_1_6_7 - 0.0207906379334985*G0_0_1_6_8 + 0.0182902811474271*G0_0_1_6_9 + 0.00375624375624442*G0_0_1_7_0 + 0.0023709623709628*G0_0_1_7_1 - 0.0100585129156575*G0_0_1_7_2 + 0.00179820179820218*G0_0_1_7_3 + 0.0247638076209546*G0_0_1_7_4 - 0.0167318395889853*G0_0_1_7_5 + 0.0233937491080387*G0_0_1_7_6 - 0.0723390894819591*G0_0_1_7_7 - 0.129470529470551*G0_0_1_7_8 - 0.0667903525046495*G0_0_1_7_9 + 0.0235992578849761*G0_0_1_8_0 + 0.0185148185148215*G0_0_1_8_1 + 0.017639503353792*G0_0_1_8_2 + 0.0579020979021074*G0_0_1_8_3 - 0.0597002997003097*G0_0_1_8_4 - 0.00666190951905351*G0_0_1_8_5 - 0.0207906379334985*G0_0_1_8_6 - 0.129470529470551*G0_0_1_8_7 + 0.670369630369744*G0_0_1_8_8 + 0.0848751248751393*G0_0_1_8_9 + 0.00666761809619065*G0_0_1_9_0 + 0.0115084915084934*G0_0_1_9_1 - 0.00461253032681683*G0_0_1_9_2 - 0.0381218781218846*G0_0_1_9_3 + 0.00226059654631122*G0_0_1_9_4 - 0.00667903525046503*G0_0_1_9_5 + 0.0182902811474271*G0_0_1_9_6 - 0.0667903525046495*G0_0_1_9_7 + 0.0848751248751394*G0_0_1_9_8 - 0.231813900385368*G0_0_1_9_9 + 0.0145632145632167*G0_1_0_0_0 + 0.000473600473600558*G0_1_0_0_1 - 0.000544006258292078*G0_1_0_0_2 + 0.00285999714571194*G0_1_0_0_3 + 0.00419009561866775*G0_1_0_0_4 + 0.00839160839160962*G0_1_0_0_5 - 0.00122163550734994*G0_1_0_0_6 - 0.00375624375624442*G0_1_0_0_7 - 0.0235992578849761*G0_1_0_0_8 - 0.00666761809619065*G0_1_0_0_9 + 0.000473600473600558*G0_1_0_1_0 + 0.0379472379472444*G0_1_0_1_1 + 0.00208236208236243*G0_1_0_1_2 + 0.0267732267732313*G0_1_0_1_3 - 0.0114285714285734*G0_1_0_1_4 + 0.00151848151848177*G0_1_0_1_6 - 0.00237096237096281*G0_1_0_1_7 - 0.0185148185148215*G0_1_0_1_8 - 0.0115084915084934*G0_1_0_1_9 - 0.000544006258292078*G0_1_0_2_0 + 0.00208236208236243*G0_1_0_2_1 + 0.000779749351178038*G0_1_0_2_2 + 0.00205508776937384*G0_1_0_2_3 - 0.00152419009561895*G0_1_0_2_4 + 0.00327291755863238*G0_1_0_2_5 - 0.00207601921887672*G0_1_0_2_6 + 0.0100585129156575*G0_1_0_2_7 - 0.017639503353792*G0_1_0_2_8 + 0.00461253032681682*G0_1_0_2_9 + 0.00285999714571194*G0_1_0_3_0 + 0.0267732267732313*G0_1_0_3_1 + 0.00205508776937384*G0_1_0_3_2 + 0.107652347652366*G0_1_0_3_3 - 0.0135464535464558*G0_1_0_3_4 - 0.00774083059797477*G0_1_0_3_5 + 0.0022263450834883*G0_1_0_3_6 - 0.00179820179820219*G0_1_0_3_7 - 0.0579020979021074*G0_1_0_3_8 + 0.0381218781218846*G0_1_0_3_9 + 0.00419009561866775*G0_1_0_4_0 - 0.0114285714285734*G0_1_0_4_1 - 0.00152419009561895*G0_1_0_4_2 - 0.0135464535464558*G0_1_0_4_3 + 0.00952190666476538*G0_1_0_4_4 - 0.00578849721706962*G0_1_0_4_5 + 0.00356215213358132*G0_1_0_4_6 - 0.0247638076209546*G0_1_0_4_7 + 0.0597002997003097*G0_1_0_4_8 - 0.00226059654631125*G0_1_0_4_9 + 0.00839160839160962*G0_1_0_5_0 + 0.00327291755863238*G0_1_0_5_2 - 0.00774083059797477*G0_1_0_5_3 - 0.00578849721706962*G0_1_0_5_4 + 0.0490823462252118*G0_1_0_5_5 - 0.0111831026116758*G0_1_0_5_6 + 0.0167318395889853*G0_1_0_5_7 + 0.0066619095190535*G0_1_0_5_8 + 0.00667903525046503*G0_1_0_5_9 - 0.00122163550734994*G0_1_0_6_0 + 0.00151848151848177*G0_1_0_6_1 - 0.00207601921887672*G0_1_0_6_2 + 0.0022263450834883*G0_1_0_6_3 + 0.00356215213358132*G0_1_0_6_4 - 0.0111831026116758*G0_1_0_6_5 + 0.0173312401883863*G0_1_0_6_6 - 0.0233937491080387*G0_1_0_6_7 + 0.0207906379334985*G0_1_0_6_8 - 0.0182902811474271*G0_1_0_6_9 - 0.00375624375624442*G0_1_0_7_0 - 0.0023709623709628*G0_1_0_7_1 + 0.0100585129156575*G0_1_0_7_2 - 0.00179820179820219*G0_1_0_7_3 - 0.0247638076209546*G0_1_0_7_4 + 0.0167318395889853*G0_1_0_7_5 - 0.0233937491080387*G0_1_0_7_6 + 0.0723390894819591*G0_1_0_7_7 + 0.129470529470551*G0_1_0_7_8 + 0.0667903525046495*G0_1_0_7_9 - 0.0235992578849761*G0_1_0_8_0 - 0.0185148185148215*G0_1_0_8_1 - 0.017639503353792*G0_1_0_8_2 - 0.0579020979021074*G0_1_0_8_3 + 0.0597002997003097*G0_1_0_8_4 + 0.00666190951905351*G0_1_0_8_5 + 0.0207906379334985*G0_1_0_8_6 + 0.129470529470551*G0_1_0_8_7 - 0.670369630369744*G0_1_0_8_8 - 0.0848751248751393*G0_1_0_8_9 - 0.00666761809619065*G0_1_0_9_0 - 0.0115084915084934*G0_1_0_9_1 + 0.00461253032681682*G0_1_0_9_2 + 0.0381218781218846*G0_1_0_9_3 - 0.00226059654631124*G0_1_0_9_4 + 0.00667903525046503*G0_1_0_9_5 - 0.0182902811474271*G0_1_0_9_6 + 0.0667903525046495*G0_1_0_9_7 - 0.0848751248751393*G0_1_0_9_8 + 0.231813900385368*G0_1_0_9_9; + A[168] = -A[176] + 0.0443464824417283*G0_0_0_0_0 + 0.00902406235739731*G0_0_0_0_1 + 0.00420489563346779*G0_0_0_0_2 + 0.00487808487808571*G0_0_0_0_3 - 0.00190370476084794*G0_0_0_0_4 + 0.0310191395905736*G0_0_0_0_5 - 0.0150947465233206*G0_0_0_0_6 + 0.00577454291740106*G0_0_0_0_7 + 0.00368520368520433*G0_0_0_0_8 + 0.0062642119784988*G0_0_0_0_9 + 0.00902406235739731*G0_0_0_1_0 + 0.259513326180038*G0_0_0_1_1 + 0.007976221309556*G0_0_0_1_2 + 0.0714248714248837*G0_0_0_1_3 - 0.0346468346468406*G0_0_0_1_4 + 0.00542864542864624*G0_0_0_1_5 + 0.00120176120176144*G0_0_0_1_6 - 0.0311540311540367*G0_0_0_1_7 + 0.0616864616864726*G0_0_0_1_8 + 0.00150960150960183*G0_0_0_1_9 + 0.00420489563346779*G0_0_0_2_0 + 0.007976221309556*G0_0_0_2_1 + 0.00472698377460362*G0_0_0_2_2 + 0.00770192770192898*G0_0_0_2_3 - 0.00649086363372187*G0_0_0_2_4 + 0.00474530760245129*G0_0_0_2_5 - 0.00443408443408519*G0_0_0_2_6 + 0.00224706510420834*G0_0_0_2_7 + 0.0160136160136187*G0_0_0_2_8 + 0.0139999682856849*G0_0_0_2_9 + 0.0048780848780857*G0_0_0_3_0 + 0.0714248714248838*G0_0_0_3_1 + 0.00770192770192898*G0_0_0_3_2 + 0.0101232101232116*G0_0_0_3_3 - 0.0319147519147572*G0_0_0_3_4 - 0.0100166500166517*G0_0_0_3_5 - 0.0144921744921769*G0_0_0_3_6 - 0.0255211455211499*G0_0_0_3_7 + 0.0844488844488987*G0_0_0_3_8 + 0.0465134865134943*G0_0_0_3_9 - 0.00190370476084794*G0_0_0_4_0 - 0.0346468346468406*G0_0_0_4_1 - 0.00649086363372187*G0_0_0_4_2 - 0.0319147519147572*G0_0_0_4_3 + 0.0329803529803585*G0_0_0_4_4 - 0.00517577660434893*G0_0_0_4_5 + 0.0196679510965258*G0_0_0_4_6 + 0.00492840492840576*G0_0_0_4_7 - 0.0589277389277488*G0_0_0_4_8 - 0.031648351648357*G0_0_0_4_9 + 0.0310191395905736*G0_0_0_5_0 + 0.00542864542864624*G0_0_0_5_1 + 0.00474530760245129*G0_0_0_5_2 - 0.0100166500166517*G0_0_0_5_3 - 0.00517577660434893*G0_0_0_5_4 + 0.188748394462712*G0_0_0_5_5 - 0.029661766804629*G0_0_0_5_6 + 0.0448009133723495*G0_0_0_5_7 - 0.0271728271728318*G0_0_0_5_8 + 0.0355530184101673*G0_0_0_5_9 - 0.0150947465233206*G0_0_0_6_0 + 0.00120176120176144*G0_0_0_6_1 - 0.00443408443408519*G0_0_0_6_2 - 0.0144921744921769*G0_0_0_6_3 + 0.0196679510965258*G0_0_0_6_4 - 0.029661766804629*G0_0_0_6_5 + 0.0887569573284007*G0_0_0_6_6 - 0.0176280861995177*G0_0_0_6_7 - 0.0203796203796238*G0_0_0_6_8 - 0.013015555872701*G0_0_0_6_9 + 0.00577454291740106*G0_0_0_7_0 - 0.0311540311540367*G0_0_0_7_1 + 0.00224706510420834*G0_0_0_7_2 - 0.0255211455211499*G0_0_0_7_3 + 0.00492840492840576*G0_0_0_7_4 + 0.0448009133723495*G0_0_0_7_5 - 0.0176280861995177*G0_0_0_7_6 + 0.101018981018998*G0_0_0_7_7 - 0.0570629370629467*G0_0_0_7_8 + 0.0164635364635393*G0_0_0_7_9 + 0.00368520368520433*G0_0_0_8_0 + 0.0616864616864726*G0_0_0_8_1 + 0.0160136160136187*G0_0_0_8_2 + 0.0844488844488987*G0_0_0_8_3 - 0.0589277389277488*G0_0_0_8_4 - 0.0271728271728318*G0_0_0_8_5 - 0.0203796203796238*G0_0_0_8_6 - 0.0570629370629467*G0_0_0_8_7 + 0.327672327672383*G0_0_0_8_8 + 0.113326673326692*G0_0_0_8_9 + 0.0062642119784988*G0_0_0_9_0 + 0.00150960150960183*G0_0_0_9_1 + 0.0139999682856849*G0_0_0_9_2 + 0.0465134865134943*G0_0_0_9_3 - 0.031648351648357*G0_0_0_9_4 + 0.0355530184101673*G0_0_0_9_5 - 0.013015555872701*G0_0_0_9_6 + 0.0164635364635393*G0_0_0_9_7 + 0.113326673326692*G0_0_0_9_8 + 0.258941058941103*G0_0_0_9_9 - 0.00184140374616603*G0_1_0_0_0 + 0.00879614212947705*G0_1_0_0_1 - 0.00107419916943744*G0_1_0_0_2 - 0.0102031302031319*G0_1_0_0_3 + 0.0037029637029643*G0_1_0_0_4 + 0.000279085993371709*G0_1_0_0_5 + 0.00136371564943018*G0_1_0_0_6 + 0.00298368298368343*G0_1_0_0_7 - 0.00737928737928854*G0_1_0_0_8 - 0.00868464868465014*G0_1_0_0_9 + 0.00879614212947705*G0_1_0_1_0 + 0.294322960989679*G0_1_0_1_1 + 0.00879614212947696*G0_1_0_1_2 + 0.0811632811632952*G0_1_0_1_3 - 0.0395160395160463*G0_1_0_1_4 - 0.000666000666000888*G0_1_0_1_5 - 0.000666000666000741*G0_1_0_1_6 - 0.0395160395160465*G0_1_0_1_7 + 0.0811632811632956*G0_1_0_1_8 + 0.00426240426240506*G0_1_0_1_9 - 0.00107419916943744*G0_1_0_2_0 + 0.00879614212947696*G0_1_0_2_1 - 0.00184140374616595*G0_1_0_2_2 - 0.00737928737928859*G0_1_0_2_3 + 0.00298368298368347*G0_1_0_2_4 + 0.00136371564943014*G0_1_0_2_5 + 0.000279085993371762*G0_1_0_2_6 + 0.0037029637029643*G0_1_0_2_7 - 0.0102031302031319*G0_1_0_2_8 - 0.00868464868465012*G0_1_0_2_9 - 0.0102031302031319*G0_1_0_3_0 + 0.0811632811632952*G0_1_0_3_1 - 0.00737928737928859*G0_1_0_3_2 - 0.148651348651374*G0_1_0_3_3 + 0.0307692307692358*G0_1_0_3_4 + 0.0130269730269751*G0_1_0_3_5 + 0.00855144855144997*G0_1_0_3_6 + 0.0371628371628432*G0_1_0_3_7 - 0.0743256743256864*G0_1_0_3_8 - 0.0871128871129016*G0_1_0_3_9 + 0.0037029637029643*G0_1_0_4_0 - 0.0395160395160463*G0_1_0_4_1 + 0.00298368298368347*G0_1_0_4_2 + 0.0307692307692358*G0_1_0_4_3 - 0.0103896103896121*G0_1_0_4_4 - 0.00455544455544528*G0_1_0_4_5 - 0.00399600399600465*G0_1_0_4_6 - 0.0143856143856167*G0_1_0_4_7 + 0.0371628371628432*G0_1_0_4_8 + 0.035164835164841*G0_1_0_4_9 + 0.000279085993371708*G0_1_0_5_0 - 0.000666000666000888*G0_1_0_5_1 + 0.00136371564943014*G0_1_0_5_2 + 0.0130269730269751*G0_1_0_5_3 - 0.00455544455544528*G0_1_0_5_4 - 0.0063251034679617*G0_1_0_5_5 - 0.000468103325246228*G0_1_0_5_6 - 0.00399600399600465*G0_1_0_5_7 + 0.00855144855144993*G0_1_0_5_8 + 0.00895104895105041*G0_1_0_5_9 + 0.00136371564943018*G0_1_0_6_0 - 0.000666000666000741*G0_1_0_6_1 + 0.000279085993371762*G0_1_0_6_2 + 0.00855144855144997*G0_1_0_6_3 - 0.00399600399600465*G0_1_0_6_4 - 0.000468103325246228*G0_1_0_6_5 - 0.00632510346796161*G0_1_0_6_6 - 0.0045554445554453*G0_1_0_6_7 + 0.0130269730269752*G0_1_0_6_8 + 0.00895104895105045*G0_1_0_6_9 + 0.00298368298368343*G0_1_0_7_0 - 0.0395160395160465*G0_1_0_7_1 + 0.0037029637029643*G0_1_0_7_2 + 0.0371628371628432*G0_1_0_7_3 - 0.0143856143856167*G0_1_0_7_4 - 0.00399600399600465*G0_1_0_7_5 - 0.0045554445554453*G0_1_0_7_6 - 0.010389610389612*G0_1_0_7_7 + 0.0307692307692356*G0_1_0_7_8 + 0.035164835164841*G0_1_0_7_9 - 0.00737928737928854*G0_1_0_8_0 + 0.0811632811632956*G0_1_0_8_1 - 0.0102031302031319*G0_1_0_8_2 - 0.0743256743256864*G0_1_0_8_3 + 0.0371628371628432*G0_1_0_8_4 + 0.00855144855144993*G0_1_0_8_5 + 0.0130269730269752*G0_1_0_8_6 + 0.0307692307692356*G0_1_0_8_7 - 0.148651348651373*G0_1_0_8_8 - 0.0871128871129016*G0_1_0_8_9 - 0.00868464868465014*G0_1_0_9_0 + 0.00426240426240506*G0_1_0_9_1 - 0.00868464868465012*G0_1_0_9_2 - 0.0871128871129016*G0_1_0_9_3 + 0.035164835164841*G0_1_0_9_4 + 0.0089510489510504*G0_1_0_9_5 + 0.00895104895105045*G0_1_0_9_6 + 0.035164835164841*G0_1_0_9_7 - 0.0871128871129015*G0_1_0_9_8 - 0.0671328671328785*G0_1_0_9_9; + A[109] = A[70] + 0.0035964035964043*G0_0_0_0_0 + 0.000618825618825734*G0_0_0_0_1 - 0.00386092743235664*G0_0_0_0_2 + 0.00712929927215767*G0_0_0_0_4 - 0.000163170163170189*G0_0_0_0_5 + 0.00239498596641502*G0_0_0_0_6 + 0.000752580752580876*G0_0_0_0_7 - 0.00271323914181102*G0_0_0_0_8 + 0.000817753674896675*G0_0_0_0_9 + 0.000618825618825734*G0_0_0_1_0 + 0.0194768194768227*G0_0_0_1_1 - 0.00216648430934179*G0_0_0_1_2 + 0.0197117168545773*G0_0_0_1_3 - 0.00510989010989091*G0_0_0_1_4 + 0.000671471385757194*G0_0_0_1_5 + 0.00534394177251414*G0_0_0_1_6 - 0.00172375243803847*G0_0_0_1_7 + 0.00458065743780111*G0_0_0_1_8 + 0.0014057371200231*G0_0_0_1_9 - 0.00386092743235664*G0_0_0_2_0 - 0.00216648430934179*G0_0_0_2_1 - 0.159786139786166*G0_0_0_2_2 + 0.0193278150421038*G0_0_0_2_3 - 0.036303696303702*G0_0_0_2_4 + 0.0173564530707415*G0_0_0_2_5 - 0.0347585747585802*G0_0_0_2_6 + 0.00191308691308721*G0_0_0_2_7 - 0.00389396317967812*G0_0_0_2_8 - 0.00331097473954668*G0_0_0_2_9 + 0.0197117168545773*G0_0_0_3_1 + 0.0193278150421038*G0_0_0_3_2 + 0.0159440559440592*G0_0_0_3_3 - 0.0278999571856764*G0_0_0_3_4 - 0.0012630226915943*G0_0_0_3_5 - 0.0154880833452288*G0_0_0_3_6 + 0.000575852718709907*G0_0_0_3_7 - 0.0128014842300577*G0_0_0_3_8 - 0.00536891679748907*G0_0_0_3_9 + 0.00712929927215767*G0_0_0_4_0 - 0.00510989010989091*G0_0_0_4_1 - 0.036303696303702*G0_0_0_4_2 - 0.0278999571856764*G0_0_0_4_3 + 0.259022406165308*G0_0_0_4_4 - 0.0208441558441595*G0_0_0_4_5 + 0.0363322391893884*G0_0_0_4_6 - 0.013835450264024*G0_0_0_4_7 + 0.0122256315113478*G0_0_0_4_8 + 0.0516212359069589*G0_0_0_4_9 - 0.000163170163170188*G0_0_0_5_0 + 0.000671471385757194*G0_0_0_5_1 + 0.0173564530707415*G0_0_0_5_2 - 0.0012630226915943*G0_0_0_5_3 - 0.0208441558441595*G0_0_0_5_4 + 0.0291479948622855*G0_0_0_5_5 - 0.0153510774939374*G0_0_0_5_6 + 0.00666619095190631*G0_0_0_5_7 - 0.00147067218495814*G0_0_0_5_8 + 0.000488083345226291*G0_0_0_5_9 + 0.00239498596641502*G0_0_0_6_0 + 0.00534394177251414*G0_0_0_6_1 - 0.0347585747585802*G0_0_0_6_2 - 0.0154880833452288*G0_0_0_6_3 + 0.0363322391893884*G0_0_0_6_4 - 0.0153510774939374*G0_0_0_6_5 + 0.269991437134341*G0_0_0_6_6 - 0.00519551876694815*G0_0_0_6_7 - 0.00244683887541071*G0_0_0_6_8 + 0.0409090909090977*G0_0_0_6_9 + 0.000752580752580876*G0_0_0_7_0 - 0.00172375243803847*G0_0_0_7_1 + 0.00191308691308721*G0_0_0_7_2 + 0.000575852718709906*G0_0_0_7_3 - 0.013835450264024*G0_0_0_7_4 + 0.00666619095190631*G0_0_0_7_5 - 0.00519551876694815*G0_0_0_7_6 + 0.00966747538176234*G0_0_0_7_7 + 0.00882617382617528*G0_0_0_7_8 + 0.00793777650920636*G0_0_0_7_9 - 0.00271323914181102*G0_0_0_8_0 + 0.00458065743780111*G0_0_0_8_1 - 0.00389396317967812*G0_0_0_8_2 - 0.0128014842300577*G0_0_0_8_3 + 0.0122256315113478*G0_0_0_8_4 - 0.00147067218495814*G0_0_0_8_5 - 0.00244683887541071*G0_0_0_8_6 + 0.00882617382617528*G0_0_0_8_7 - 0.0598715570144238*G0_0_0_8_8 - 0.0286684743827649*G0_0_0_8_9 + 0.000817753674896675*G0_0_0_9_0 + 0.0014057371200231*G0_0_0_9_1 - 0.00331097473954668*G0_0_0_9_2 - 0.00536891679748907*G0_0_0_9_3 + 0.0516212359069589*G0_0_0_9_4 + 0.000488083345226289*G0_0_0_9_5 + 0.0409090909090977*G0_0_0_9_6 + 0.00793777650920636*G0_0_0_9_7 - 0.0286684743827649*G0_0_0_9_8 - 0.0502468959611904*G0_0_0_9_9 + 0.000804063661206678*G0_0_1_0_1 - 0.000804063661206644*G0_0_1_0_2 + 0.00085628657057246*G0_0_1_0_3 - 0.000856286570572421*G0_0_1_0_4 - 0.00144807573379029*G0_0_1_0_5 + 0.00039579468150906*G0_0_1_0_6 + 0.00144807573379022*G0_0_1_0_7 - 0.000395794681508998*G0_0_1_0_8 + 0.000804063661206678*G0_0_1_1_0 + 0.022892662892667*G0_0_1_1_1 + 0.0256543456543501*G0_0_1_1_3 - 0.0132553161124612*G0_0_1_1_4 + 0.000582274867989244*G0_0_1_1_5 + 0.00306550592264933*G0_0_1_1_6 - 0.00318538604252954*G0_0_1_1_7 + 0.00951048951049131*G0_0_1_1_8 + 0.00972741544170286*G0_0_1_1_9 - 0.000804063661206644*G0_0_1_2_0 - 0.0228926628926665*G0_0_1_2_2 + 0.0132553161124611*G0_0_1_2_3 - 0.0256543456543498*G0_0_1_2_4 + 0.00318538604252936*G0_0_1_2_5 - 0.009510489510491*G0_0_1_2_6 - 0.000582274867989264*G0_0_1_2_7 - 0.00306550592264927*G0_0_1_2_8 - 0.00972741544170277*G0_0_1_2_9 + 0.000856286570572461*G0_0_1_3_0 + 0.0256543456543501*G0_0_1_3_1 + 0.0132553161124611*G0_0_1_3_2 + 0.0141801056086804*G0_0_1_3_3 - 0.00215784215784254*G0_0_1_3_5 - 0.009196517767948*G0_0_1_3_6 - 0.00256885971171741*G0_0_1_3_7 - 0.00662765805623034*G0_0_1_3_8 - 0.0240445269016737*G0_0_1_3_9 - 0.000856286570572421*G0_0_1_4_0 - 0.0132553161124612*G0_0_1_4_1 - 0.0256543456543498*G0_0_1_4_2 - 0.0141801056086788*G0_0_1_4_4 + 0.00256885971171722*G0_0_1_4_5 + 0.00662765805623077*G0_0_1_4_6 + 0.00215784215784254*G0_0_1_4_7 + 0.00919651776794777*G0_0_1_4_8 + 0.0240445269016739*G0_0_1_4_9 - 0.00144807573379029*G0_0_1_5_0 + 0.000582274867989244*G0_0_1_5_1 + 0.00318538604252936*G0_0_1_5_2 - 0.00215784215784254*G0_0_1_5_3 + 0.00256885971171722*G0_0_1_5_4 + 0.0115769944341394*G0_0_1_5_5 + 0.000222634508348814*G0_0_1_5_6 - 0.00174682460396777*G0_0_1_5_8 + 0.00349364920793555*G0_0_1_5_9 + 0.00039579468150906*G0_0_1_6_0 + 0.00306550592264933*G0_0_1_6_1 - 0.009510489510491*G0_0_1_6_2 - 0.009196517767948*G0_0_1_6_3 + 0.00662765805623077*G0_0_1_6_4 + 0.000222634508348814*G0_0_1_6_5 + 0.0647010132724535*G0_0_1_6_6 + 0.00174682460396776*G0_0_1_6_7 + 0.0475752818610043*G0_0_1_6_9 + 0.00144807573379022*G0_0_1_7_0 - 0.00318538604252954*G0_0_1_7_1 - 0.000582274867989264*G0_0_1_7_2 - 0.00256885971171741*G0_0_1_7_3 + 0.00215784215784254*G0_0_1_7_4 + 0.00174682460396776*G0_0_1_7_6 - 0.011576994434139*G0_0_1_7_7 - 0.000222634508348961*G0_0_1_7_8 - 0.0034936492079355*G0_0_1_7_9 - 0.000395794681508998*G0_0_1_8_0 + 0.00951048951049132*G0_0_1_8_1 - 0.00306550592264927*G0_0_1_8_2 - 0.00662765805623034*G0_0_1_8_3 + 0.00919651776794777*G0_0_1_8_4 - 0.00174682460396777*G0_0_1_8_5 - 0.000222634508348964*G0_0_1_8_7 - 0.0647010132724519*G0_0_1_8_8 - 0.0475752818610041*G0_0_1_8_9 + 0.00972741544170286*G0_0_1_9_1 - 0.00972741544170277*G0_0_1_9_2 - 0.0240445269016737*G0_0_1_9_3 + 0.0240445269016739*G0_0_1_9_4 + 0.00349364920793555*G0_0_1_9_5 + 0.0475752818610043*G0_0_1_9_6 - 0.00349364920793551*G0_0_1_9_7 - 0.0475752818610041*G0_0_1_9_8 + 0.00198124626696093*G0_1_0_0_1 - 0.00198124626696087*G0_1_0_0_2 - 0.00218923933209687*G0_1_0_0_3 + 0.00218923933209688*G0_1_0_0_4 - 0.00101279672708267*G0_1_0_0_5 + 0.00668379239807933*G0_1_0_0_6 + 0.00101279672708249*G0_1_0_0_7 - 0.00668379239807919*G0_1_0_0_8 + 0.00198124626696093*G0_1_0_1_0 + 0.140489880489905*G0_1_0_1_1 + 0.0265329908187098*G0_1_0_1_3 - 0.0121718757433064*G0_1_0_1_4 + 0.0054902240616536*G0_1_0_1_6 - 0.00838994338994499*G0_1_0_1_7 + 0.00995385566814342*G0_1_0_1_8 - 0.00559868702725935*G0_1_0_1_9 - 0.00198124626696087*G0_1_0_2_0 - 0.140489880489904*G0_1_0_2_2 + 0.0121718757433062*G0_1_0_2_3 - 0.0265329908187092*G0_1_0_2_4 + 0.00838994338994463*G0_1_0_2_5 - 0.00995385566814274*G0_1_0_2_6 - 0.00549022406165354*G0_1_0_2_8 + 0.00559868702725944*G0_1_0_2_9 - 0.00218923933209687*G0_1_0_3_0 + 0.0265329908187098*G0_1_0_3_1 + 0.0121718757433062*G0_1_0_3_2 - 0.187719423433741*G0_1_0_3_3 + 0.00334165834165889*G0_1_0_3_5 - 0.0164706721849607*G0_1_0_3_6 + 0.0065677179962905*G0_1_0_3_7 - 0.0230383901812511*G0_1_0_3_8 + 0.00366062508919703*G0_1_0_3_9 + 0.00218923933209688*G0_1_0_4_0 - 0.0121718757433064*G0_1_0_4_1 - 0.0265329908187092*G0_1_0_4_2 + 0.187719423433741*G0_1_0_4_4 - 0.00656771799629056*G0_1_0_4_5 + 0.0230383901812513*G0_1_0_4_6 - 0.00334165834165885*G0_1_0_4_7 + 0.0164706721849606*G0_1_0_4_8 - 0.00366062508919722*G0_1_0_4_9 - 0.00101279672708267*G0_1_0_5_0 + 0.00838994338994463*G0_1_0_5_2 + 0.00334165834165889*G0_1_0_5_3 - 0.00656771799629057*G0_1_0_5_4 - 0.0030655059226494*G0_1_0_5_5 - 0.0369487655202004*G0_1_0_5_6 + 0.000115598687027302*G0_1_0_5_8 - 0.000231197374054489*G0_1_0_5_9 + 0.00668379239807933*G0_1_0_6_0 + 0.0054902240616536*G0_1_0_6_1 - 0.00995385566814273*G0_1_0_6_2 - 0.0164706721849607*G0_1_0_6_3 + 0.0230383901812513*G0_1_0_6_4 - 0.0369487655202004*G0_1_0_6_5 + 0.251958041958085*G0_1_0_6_6 - 0.000115598687027184*G0_1_0_6_7 + 0.016145283288143*G0_1_0_6_9 + 0.00101279672708249*G0_1_0_7_0 - 0.00838994338994499*G0_1_0_7_1 + 0.0065677179962905*G0_1_0_7_3 - 0.00334165834165885*G0_1_0_7_4 - 0.000115598687027185*G0_1_0_7_6 + 0.00306550592264863*G0_1_0_7_7 + 0.0369487655202003*G0_1_0_7_8 + 0.000231197374054542*G0_1_0_7_9 - 0.00668379239807919*G0_1_0_8_0 + 0.00995385566814343*G0_1_0_8_1 - 0.00549022406165354*G0_1_0_8_2 - 0.0230383901812511*G0_1_0_8_3 + 0.0164706721849606*G0_1_0_8_4 + 0.000115598687027302*G0_1_0_8_5 + 0.0369487655202003*G0_1_0_8_7 - 0.251958041958084*G0_1_0_8_8 - 0.0161452832881432*G0_1_0_8_9 - 0.00559868702725935*G0_1_0_9_1 + 0.00559868702725944*G0_1_0_9_2 + 0.00366062508919703*G0_1_0_9_3 - 0.00366062508919722*G0_1_0_9_4 - 0.000231197374054491*G0_1_0_9_5 + 0.016145283288143*G0_1_0_9_6 + 0.000231197374054542*G0_1_0_9_7 - 0.0161452832881432*G0_1_0_9_8 - 0.00359640359640434*G0_1_1_0_0 + 0.00386092743235672*G0_1_1_0_1 - 0.000618825618825719*G0_1_1_0_2 - 0.00712929927215763*G0_1_1_0_3 - 0.000752580752580928*G0_1_1_0_5 + 0.00271323914181107*G0_1_1_0_6 + 0.00016317016317007*G0_1_1_0_7 - 0.00239498596641488*G0_1_1_0_8 - 0.000817753674896684*G0_1_1_0_9 + 0.00386092743235672*G0_1_1_1_0 + 0.159786139786168*G0_1_1_1_1 + 0.00216648430934185*G0_1_1_1_2 + 0.0363036963037027*G0_1_1_1_3 - 0.0193278150421041*G0_1_1_1_4 - 0.00191308691308731*G0_1_1_1_5 + 0.00389396317967816*G0_1_1_1_6 - 0.017356453070742*G0_1_1_1_7 + 0.0347585747585812*G0_1_1_1_8 + 0.0033109747395468*G0_1_1_1_9 - 0.000618825618825719*G0_1_1_2_0 + 0.00216648430934185*G0_1_1_2_1 - 0.0194768194768225*G0_1_1_2_2 + 0.00510989010989092*G0_1_1_2_3 - 0.0197117168545772*G0_1_1_2_4 + 0.00172375243803838*G0_1_1_2_5 - 0.00458065743780098*G0_1_1_2_6 - 0.000671471385757239*G0_1_1_2_7 - 0.00534394177251406*G0_1_1_2_8 - 0.00140573712002306*G0_1_1_2_9 - 0.00712929927215763*G0_1_1_3_0 + 0.0363036963037027*G0_1_1_3_1 + 0.00510989010989092*G0_1_1_3_2 - 0.259022406165307*G0_1_1_3_3 + 0.027899957185676*G0_1_1_3_4 + 0.013835450264024*G0_1_1_3_5 - 0.0122256315113479*G0_1_1_3_6 + 0.0208441558441593*G0_1_1_3_7 - 0.0363322391893879*G0_1_1_3_8 - 0.051621235906959*G0_1_1_3_9 - 0.0193278150421041*G0_1_1_4_1 - 0.0197117168545772*G0_1_1_4_2 + 0.027899957185676*G0_1_1_4_3 - 0.0159440559440581*G0_1_1_4_4 - 0.000575852718709973*G0_1_1_4_5 + 0.0128014842300579*G0_1_1_4_6 + 0.00126302269159439*G0_1_1_4_7 + 0.0154880833452287*G0_1_1_4_8 + 0.00536891679748915*G0_1_1_4_9 - 0.000752580752580928*G0_1_1_5_0 - 0.00191308691308731*G0_1_1_5_1 + 0.00172375243803838*G0_1_1_5_2 + 0.013835450264024*G0_1_1_5_3 - 0.000575852718709973*G0_1_1_5_4 - 0.00966747538176297*G0_1_1_5_5 - 0.00882617382617532*G0_1_1_5_6 - 0.00666619095190643*G0_1_1_5_7 + 0.00519551876694826*G0_1_1_5_8 - 0.0079377765092065*G0_1_1_5_9 + 0.00271323914181107*G0_1_1_6_0 + 0.00389396317967817*G0_1_1_6_1 - 0.00458065743780098*G0_1_1_6_2 - 0.0122256315113479*G0_1_1_6_3 + 0.0128014842300579*G0_1_1_6_4 - 0.00882617382617532*G0_1_1_6_5 + 0.0598715570144246*G0_1_1_6_6 + 0.00147067218495819*G0_1_1_6_7 + 0.00244683887541063*G0_1_1_6_8 + 0.028668474382765*G0_1_1_6_9 + 0.00016317016317007*G0_1_1_7_0 - 0.017356453070742*G0_1_1_7_1 - 0.000671471385757239*G0_1_1_7_2 + 0.0208441558441593*G0_1_1_7_3 + 0.00126302269159439*G0_1_1_7_4 - 0.00666619095190643*G0_1_1_7_5 + 0.00147067218495819*G0_1_1_7_6 - 0.0291479948622856*G0_1_1_7_7 + 0.0153510774939371*G0_1_1_7_8 - 0.000488083345226331*G0_1_1_7_9 - 0.00239498596641488*G0_1_1_8_0 + 0.0347585747585812*G0_1_1_8_1 - 0.00534394177251406*G0_1_1_8_2 - 0.0363322391893879*G0_1_1_8_3 + 0.0154880833452287*G0_1_1_8_4 + 0.00519551876694826*G0_1_1_8_5 + 0.00244683887541063*G0_1_1_8_6 + 0.0153510774939371*G0_1_1_8_7 - 0.269991437134339*G0_1_1_8_8 - 0.0409090909090978*G0_1_1_8_9 - 0.000817753674896685*G0_1_1_9_0 + 0.0033109747395468*G0_1_1_9_1 - 0.00140573712002306*G0_1_1_9_2 - 0.051621235906959*G0_1_1_9_3 + 0.00536891679748915*G0_1_1_9_4 - 0.0079377765092065*G0_1_1_9_5 + 0.028668474382765*G0_1_1_9_6 - 0.000488083345226332*G0_1_1_9_7 - 0.0409090909090978*G0_1_1_9_8 + 0.0502468959611898*G0_1_1_9_9; + A[184] = A[72] + 0.000571914857629219*G0_0_1_0_1 - 0.000571914857629251*G0_0_1_0_2 + 0.00252319109462015*G0_0_1_0_3 - 0.00252319109462015*G0_0_1_0_4 + 0.00427001569858786*G0_0_1_0_6 - 0.00427001569858779*G0_0_1_0_8 + 0.000571914857629219*G0_0_1_1_0 - 0.00888000888001064*G0_0_1_1_1 + 0.0113220113220132*G0_0_1_1_3 - 0.00692260120831669*G0_0_1_1_4 - 0.00332239189382104*G0_0_1_1_5 + 0.00150135578707032*G0_0_1_1_6 - 0.000955235240949678*G0_0_1_1_7 - 0.00189144189144227*G0_0_1_1_8 + 0.0163493649207962*G0_0_1_1_9 - 0.000571914857629251*G0_0_1_2_0 + 0.00888000888001036*G0_0_1_2_2 + 0.0069226012083167*G0_0_1_2_3 - 0.0113220113220133*G0_0_1_2_4 + 0.0009552352409497*G0_0_1_2_5 + 0.00189144189144217*G0_0_1_2_6 + 0.00332239189382099*G0_0_1_2_7 - 0.00150135578707031*G0_0_1_2_8 - 0.0163493649207963*G0_0_1_2_9 + 0.00252319109462015*G0_0_1_3_0 + 0.0113220113220132*G0_0_1_3_1 + 0.0069226012083167*G0_0_1_3_2 + 0.265106322249225*G0_0_1_3_3 + 0.00119880119880143*G0_0_1_3_5 - 0.00450406736121094*G0_0_1_3_6 - 0.00756957328386035*G0_0_1_3_7 + 0.00306550592264936*G0_0_1_3_8 - 0.0339089481946679*G0_0_1_3_9 - 0.00252319109462015*G0_0_1_4_0 - 0.00692260120831669*G0_0_1_4_1 - 0.0113220113220133*G0_0_1_4_2 - 0.265106322249225*G0_0_1_4_4 + 0.00756957328386035*G0_0_1_4_5 - 0.00306550592264945*G0_0_1_4_6 - 0.00119880119880133*G0_0_1_4_7 + 0.00450406736121097*G0_0_1_4_8 + 0.0339089481946681*G0_0_1_4_9 - 0.00332239189382104*G0_0_1_5_1 + 0.0009552352409497*G0_0_1_5_2 + 0.00119880119880143*G0_0_1_5_3 + 0.00756957328386035*G0_0_1_5_4 - 0.0245925503068408*G0_0_1_5_5 - 0.0159098044812356*G0_0_1_5_6 + 0.00996717568146317*G0_0_1_5_8 - 0.0199343513629263*G0_0_1_5_9 + 0.00427001569858786*G0_0_1_6_0 + 0.00150135578707032*G0_0_1_6_1 + 0.00189144189144217*G0_0_1_6_2 - 0.00450406736121094*G0_0_1_6_3 - 0.00306550592264945*G0_0_1_6_4 - 0.0159098044812356*G0_0_1_6_5 - 0.00352790067075863*G0_0_1_6_6 - 0.00996717568146295*G0_0_1_6_7 + 0.0580562294848107*G0_0_1_6_9 - 0.000955235240949678*G0_0_1_7_1 + 0.00332239189382099*G0_0_1_7_2 - 0.00756957328386035*G0_0_1_7_3 - 0.00119880119880133*G0_0_1_7_4 - 0.00996717568146295*G0_0_1_7_6 + 0.0245925503068391*G0_0_1_7_7 + 0.0159098044812358*G0_0_1_7_8 + 0.019934351362926*G0_0_1_7_9 - 0.00427001569858779*G0_0_1_8_0 - 0.00189144189144227*G0_0_1_8_1 - 0.00150135578707031*G0_0_1_8_2 + 0.00306550592264936*G0_0_1_8_3 + 0.00450406736121097*G0_0_1_8_4 + 0.00996717568146317*G0_0_1_8_5 + 0.0159098044812358*G0_0_1_8_7 + 0.00352790067075841*G0_0_1_8_8 - 0.0580562294848106*G0_0_1_8_9 + 0.0163493649207962*G0_0_1_9_1 - 0.0163493649207963*G0_0_1_9_2 - 0.0339089481946679*G0_0_1_9_3 + 0.0339089481946681*G0_0_1_9_4 - 0.0199343513629263*G0_0_1_9_5 + 0.0580562294848107*G0_0_1_9_6 + 0.019934351362926*G0_0_1_9_7 - 0.0580562294848106*G0_0_1_9_8 - 0.000571914857629219*G0_1_0_0_1 + 0.000571914857629251*G0_1_0_0_2 - 0.00252319109462015*G0_1_0_0_3 + 0.00252319109462015*G0_1_0_0_4 - 0.00427001569858786*G0_1_0_0_6 + 0.00427001569858779*G0_1_0_0_8 - 0.000571914857629219*G0_1_0_1_0 + 0.00888000888001064*G0_1_0_1_1 - 0.0113220113220132*G0_1_0_1_3 + 0.00692260120831669*G0_1_0_1_4 + 0.00332239189382104*G0_1_0_1_5 - 0.00150135578707032*G0_1_0_1_6 + 0.000955235240949678*G0_1_0_1_7 + 0.00189144189144227*G0_1_0_1_8 - 0.0163493649207962*G0_1_0_1_9 + 0.000571914857629251*G0_1_0_2_0 - 0.00888000888001036*G0_1_0_2_2 - 0.00692260120831671*G0_1_0_2_3 + 0.0113220113220133*G0_1_0_2_4 - 0.0009552352409497*G0_1_0_2_5 - 0.00189144189144217*G0_1_0_2_6 - 0.00332239189382099*G0_1_0_2_7 + 0.00150135578707031*G0_1_0_2_8 + 0.0163493649207963*G0_1_0_2_9 - 0.00252319109462014*G0_1_0_3_0 - 0.0113220113220132*G0_1_0_3_1 - 0.00692260120831671*G0_1_0_3_2 - 0.265106322249225*G0_1_0_3_3 - 0.00119880119880143*G0_1_0_3_5 + 0.00450406736121095*G0_1_0_3_6 + 0.00756957328386035*G0_1_0_3_7 - 0.00306550592264936*G0_1_0_3_8 + 0.0339089481946679*G0_1_0_3_9 + 0.00252319109462015*G0_1_0_4_0 + 0.00692260120831669*G0_1_0_4_1 + 0.0113220113220133*G0_1_0_4_2 + 0.265106322249225*G0_1_0_4_4 - 0.00756957328386035*G0_1_0_4_5 + 0.00306550592264945*G0_1_0_4_6 + 0.00119880119880133*G0_1_0_4_7 - 0.00450406736121097*G0_1_0_4_8 - 0.0339089481946681*G0_1_0_4_9 + 0.00332239189382104*G0_1_0_5_1 - 0.000955235240949699*G0_1_0_5_2 - 0.00119880119880143*G0_1_0_5_3 - 0.00756957328386035*G0_1_0_5_4 + 0.0245925503068408*G0_1_0_5_5 + 0.0159098044812356*G0_1_0_5_6 - 0.00996717568146317*G0_1_0_5_8 + 0.0199343513629263*G0_1_0_5_9 - 0.00427001569858786*G0_1_0_6_0 - 0.00150135578707032*G0_1_0_6_1 - 0.00189144189144217*G0_1_0_6_2 + 0.00450406736121095*G0_1_0_6_3 + 0.00306550592264945*G0_1_0_6_4 + 0.0159098044812356*G0_1_0_6_5 + 0.00352790067075862*G0_1_0_6_6 + 0.00996717568146295*G0_1_0_6_7 - 0.0580562294848107*G0_1_0_6_9 + 0.000955235240949679*G0_1_0_7_1 - 0.00332239189382099*G0_1_0_7_2 + 0.00756957328386035*G0_1_0_7_3 + 0.00119880119880133*G0_1_0_7_4 + 0.00996717568146295*G0_1_0_7_6 - 0.0245925503068391*G0_1_0_7_7 - 0.0159098044812358*G0_1_0_7_8 - 0.0199343513629259*G0_1_0_7_9 + 0.00427001569858779*G0_1_0_8_0 + 0.00189144189144227*G0_1_0_8_1 + 0.00150135578707031*G0_1_0_8_2 - 0.00306550592264936*G0_1_0_8_3 - 0.00450406736121096*G0_1_0_8_4 - 0.00996717568146317*G0_1_0_8_5 - 0.0159098044812358*G0_1_0_8_7 - 0.00352790067075841*G0_1_0_8_8 + 0.0580562294848106*G0_1_0_8_9 - 0.0163493649207962*G0_1_0_9_1 + 0.0163493649207963*G0_1_0_9_2 + 0.0339089481946679*G0_1_0_9_3 - 0.0339089481946681*G0_1_0_9_4 + 0.0199343513629263*G0_1_0_9_5 - 0.0580562294848107*G0_1_0_9_6 - 0.0199343513629259*G0_1_0_9_7 + 0.0580562294848106*G0_1_0_9_8; + A[18] = -A[26] - 0.00890562700086667*G0_0_0_0_0 - 0.00456796290129706*G0_0_0_0_1 - 0.00133135823612037*G0_0_0_0_2 - 0.000491545491545589*G0_0_0_0_3 - 0.00100547600547617*G0_0_0_0_4 - 0.00554197125625794*G0_0_0_0_5 + 0.00176056747485349*G0_0_0_0_6 - 0.00117956117956137*G0_0_0_0_7 + 0.00033892033892037*G0_0_0_0_8 - 0.000881340881341046*G0_0_0_0_9 - 0.00456796290129706*G0_0_0_1_0 - 0.142693109359801*G0_0_0_1_1 - 0.00456796290129701*G0_0_0_1_2 - 0.0380452880452946*G0_0_0_1_3 + 0.0185148185148217*G0_0_0_1_4 - 0.00102212602212614*G0_0_0_1_5 - 0.00102212602212621*G0_0_0_1_6 + 0.0185148185148218*G0_0_0_1_7 - 0.0380452880452948*G0_0_0_1_8 - 0.00203130203130241*G0_0_0_1_9 - 0.00133135823612037*G0_0_0_2_0 - 0.00456796290129701*G0_0_0_2_1 - 0.00890562700086659*G0_0_0_2_2 + 0.00033892033892039*G0_0_0_2_3 - 0.00117956117956137*G0_0_0_2_4 + 0.00176056747485348*G0_0_0_2_5 - 0.0055419712562579*G0_0_0_2_6 - 0.00100547600547617*G0_0_0_2_7 - 0.00049154549154559*G0_0_0_2_8 - 0.000881340881341034*G0_0_0_2_9 - 0.000491545491545589*G0_0_0_3_0 - 0.0380452880452946*G0_0_0_3_1 + 0.00033892033892039*G0_0_0_3_2 - 0.0134865134865158*G0_0_0_3_3 + 0.0064185814185825*G0_0_0_3_4 + 0.00132201132201155*G0_0_0_3_5 + 0.00496336996337078*G0_0_0_3_6 + 0.00337162837162901*G0_0_0_3_7 - 0.00674325674325801*G0_0_0_3_8 - 0.000649350649350797*G0_0_0_3_9 - 0.00100547600547617*G0_0_0_4_0 + 0.0185148185148217*G0_0_0_4_1 - 0.00117956117956137*G0_0_0_4_2 + 0.0064185814185825*G0_0_0_4_3 - 0.0180619380619411*G0_0_0_4_4 + 0.00491341991342074*G0_0_0_4_5 - 0.00987678987679153*G0_0_0_4_6 + 0.00206793206793239*G0_0_0_4_7 + 0.00337162837162901*G0_0_0_4_8 - 0.00718281718281836*G0_0_0_4_9 - 0.00554197125625794*G0_0_0_5_0 - 0.00102212602212614*G0_0_0_5_1 + 0.00176056747485348*G0_0_0_5_2 + 0.00132201132201155*G0_0_0_5_3 + 0.00491341991342074*G0_0_0_5_4 - 0.0513438942010457*G0_0_0_5_5 + 0.0110258788830236*G0_0_0_5_6 - 0.00987678987679154*G0_0_0_5_7 + 0.00496336996337082*G0_0_0_5_8 - 0.0072827172827185*G0_0_0_5_9 + 0.00176056747485349*G0_0_0_6_0 - 0.00102212602212621*G0_0_0_6_1 - 0.0055419712562579*G0_0_0_6_2 + 0.00496336996337078*G0_0_0_6_3 - 0.00987678987679153*G0_0_0_6_4 + 0.0110258788830236*G0_0_0_6_5 - 0.0513438942010456*G0_0_0_6_6 + 0.00491341991342074*G0_0_0_6_7 + 0.00132201132201154*G0_0_0_6_8 - 0.00728271728271848*G0_0_0_6_9 - 0.00117956117956137*G0_0_0_7_0 + 0.0185148185148218*G0_0_0_7_1 - 0.00100547600547617*G0_0_0_7_2 + 0.00337162837162901*G0_0_0_7_3 + 0.00206793206793239*G0_0_0_7_4 - 0.00987678987679154*G0_0_0_7_5 + 0.00491341991342074*G0_0_0_7_6 - 0.0180619380619412*G0_0_0_7_7 + 0.00641858141858263*G0_0_0_7_8 - 0.00718281718281838*G0_0_0_7_9 + 0.00033892033892037*G0_0_0_8_0 - 0.0380452880452948*G0_0_0_8_1 - 0.00049154549154559*G0_0_0_8_2 - 0.00674325674325801*G0_0_0_8_3 + 0.00337162837162901*G0_0_0_8_4 + 0.00496336996337082*G0_0_0_8_5 + 0.00132201132201154*G0_0_0_8_6 + 0.00641858141858263*G0_0_0_8_7 - 0.0134865134865161*G0_0_0_8_8 - 0.000649350649350821*G0_0_0_8_9 - 0.000881340881341046*G0_0_0_9_0 - 0.00203130203130242*G0_0_0_9_1 - 0.000881340881341034*G0_0_0_9_2 - 0.000649350649350799*G0_0_0_9_3 - 0.00718281718281836*G0_0_0_9_4 - 0.0072827172827185*G0_0_0_9_5 - 0.00728271728271848*G0_0_0_9_6 - 0.00718281718281838*G0_0_0_9_7 - 0.000649350649350821*G0_0_0_9_8 - 0.0600599400599502*G0_0_0_9_9; + A[68] = -A[65] + 0.00255659684231164*G0_0_1_0_0 + 0.000318869842679434*G0_0_1_0_1 + 0.00504261170927922*G0_0_1_0_2 - 0.00198499912785659*G0_0_1_0_3 + 0.0262382062382107*G0_0_1_0_4 - 0.00676466390752218*G0_0_1_0_5 + 0.00941058941059096*G0_0_1_0_6 - 0.00316064887493507*G0_0_1_0_7 - 0.000746872175443755*G0_0_1_0_8 + 0.0195632938490115*G0_0_1_0_9 + 0.000318869842679434*G0_0_1_1_0 - 0.00360133693467081*G0_0_1_1_1 + 0.00603519936853371*G0_0_1_1_2 - 0.0080560709132151*G0_0_1_1_3 + 0.00894882894883048*G0_0_1_1_4 - 0.00297448583162919*G0_0_1_1_5 + 0.000823620823620947*G0_0_1_1_6 + 0.00137925566497017*G0_0_1_1_7 - 0.00490874205159998*G0_0_1_1_8 + 0.00427952999381645*G0_0_1_1_9 + 0.00504261170927922*G0_0_1_2_0 + 0.00603519936853371*G0_0_1_2_1 + 0.196588596588629*G0_0_1_2_2 - 0.0287490287490334*G0_0_1_2_3 + 0.0391164391164455*G0_0_1_2_4 - 0.024131424131428*G0_0_1_2_5 + 0.0565212565212658*G0_0_1_2_6 + 0.00192918192918227*G0_0_1_2_7 - 0.000574980574980646*G0_0_1_2_8 - 0.0101232101232119*G0_0_1_2_9 - 0.00198499912785659*G0_0_1_3_0 - 0.0080560709132151*G0_0_1_3_1 - 0.0287490287490334*G0_0_1_3_2 + 0.0551048951049044*G0_0_1_3_3 - 0.0304295704295755*G0_0_1_3_4 + 0.0108691308691327*G0_0_1_3_5 - 0.00933066933067087*G0_0_1_3_6 - 0.000904809476238232*G0_0_1_3_7 + 0.00603967461110425*G0_0_1_3_8 - 0.0110289710289728*G0_0_1_3_9 + 0.0262382062382107*G0_0_1_4_0 + 0.00894882894883048*G0_0_1_4_1 + 0.0391164391164455*G0_0_1_4_2 - 0.0304295704295755*G0_0_1_4_3 + 0.491108891108974*G0_0_1_4_4 - 0.08557442557444*G0_0_1_4_5 + 0.0949050949051109*G0_0_1_4_6 - 0.0388211788211854*G0_0_1_4_7 - 0.00513486513486604*G0_0_1_4_8 + 0.201518481518515*G0_0_1_4_9 - 0.00676466390752218*G0_0_1_5_0 - 0.00297448583162919*G0_0_1_5_1 - 0.024131424131428*G0_0_1_5_2 + 0.0108691308691327*G0_0_1_5_3 - 0.0855744255744399*G0_0_1_5_4 + 0.0173826173826203*G0_0_1_5_5 - 0.0341058941058997*G0_0_1_5_6 + 0.0105837020122753*G0_0_1_5_7 + 0.00206365063507955*G0_0_1_5_8 - 0.0628171828171934*G0_0_1_5_9 + 0.00941058941059096*G0_0_1_6_0 + 0.000823620823620947*G0_0_1_6_1 + 0.0565212565212658*G0_0_1_6_2 - 0.00933066933067087*G0_0_1_6_3 + 0.0949050949051109*G0_0_1_6_4 - 0.0341058941058997*G0_0_1_6_5 - 0.111488511488531*G0_0_1_6_6 - 0.0126473526473548*G0_0_1_6_7 + 0.00305694305694355*G0_0_1_6_8 + 0.0490309690309774*G0_0_1_6_9 - 0.00316064887493507*G0_0_1_7_0 + 0.00137925566497017*G0_0_1_7_1 + 0.00192918192918227*G0_0_1_7_2 - 0.000904809476238232*G0_0_1_7_3 - 0.0388211788211854*G0_0_1_7_4 + 0.0105837020122753*G0_0_1_7_5 - 0.0126473526473548*G0_0_1_7_6 + 0.000416726131012351*G0_0_1_7_7 + 0.00131582703011289*G0_0_1_7_8 - 0.0333951762523247*G0_0_1_7_9 - 0.000746872175443755*G0_0_1_8_0 - 0.00490874205159998*G0_0_1_8_1 - 0.000574980574980646*G0_0_1_8_2 + 0.00603967461110426*G0_0_1_8_3 - 0.00513486513486604*G0_0_1_8_4 + 0.00206365063507955*G0_0_1_8_5 + 0.00305694305694355*G0_0_1_8_6 + 0.00131582703011289*G0_0_1_8_7 - 0.0164349935778531*G0_0_1_8_8 - 0.00256885971171724*G0_0_1_8_9 + 0.0195632938490115*G0_0_1_9_0 + 0.00427952999381645*G0_0_1_9_1 - 0.0101232101232119*G0_0_1_9_2 - 0.0110289710289728*G0_0_1_9_3 + 0.201518481518515*G0_0_1_9_4 - 0.0628171828171934*G0_0_1_9_5 + 0.0490309690309773*G0_0_1_9_6 - 0.0333951762523247*G0_0_1_9_7 - 0.00256885971171724*G0_0_1_9_8 + 0.205714285714321*G0_0_1_9_9 - 0.000348434634148923*G0_1_1_0_0 - 0.00707077754696928*G0_1_1_0_1 - 0.00117043450376804*G0_1_1_0_2 - 0.00716711859569126*G0_1_1_0_3 + 0.00632224917939315*G0_1_1_0_4 + 0.00190095618667082*G0_1_1_0_5 - 0.00192664478378799*G0_1_1_0_6 + 0.00969379826522854*G0_1_1_0_7 - 0.0145857317285914*G0_1_1_0_8 - 0.00482374768089135*G0_1_1_0_9 - 0.00707077754696928*G0_1_1_1_0 - 0.0961024161024332*G0_1_1_1_1 - 0.00173036839703538*G0_1_1_1_2 - 0.0294105894105946*G0_1_1_1_3 + 0.0055658627087209*G0_1_1_1_4 + 0.00287997716569199*G0_1_1_1_5 - 0.00586556300842118*G0_1_1_1_6 + 0.0330761302189932*G0_1_1_1_7 - 0.0708447108447233*G0_1_1_1_8 - 0.00673612102183652*G0_1_1_1_9 - 0.00117043450376804*G0_1_1_2_0 - 0.00173036839703538*G0_1_1_2_1 + 0.0139514806181494*G0_1_1_2_2 - 0.0162393162393189*G0_1_1_2_3 + 0.000710400710400738*G0_1_1_2_4 + 0.00192030192030229*G0_1_1_2_5 + 0.00295260295260338*G0_1_1_2_6 + 0.00429570429570503*G0_1_1_2_7 - 0.0104895104895122*G0_1_1_2_8 - 0.0113886113886133*G0_1_1_2_9 - 0.00716711859569126*G0_1_1_3_0 - 0.0294105894105946*G0_1_1_3_1 - 0.0162393162393189*G0_1_1_3_2 - 0.140345368916822*G0_1_1_3_3 + 0.0878121878122027*G0_1_1_3_4 + 0.000693592122163668*G0_1_1_3_5 + 0.029070929070934*G0_1_1_3_6 + 0.0329755958327443*G0_1_1_3_7 - 0.0759183673469517*G0_1_1_3_8 - 0.0457428285999792*G0_1_1_3_9 + 0.00632224917939315*G0_1_1_4_0 + 0.0055658627087209*G0_1_1_4_1 + 0.000710400710400742*G0_1_1_4_2 + 0.0878121878122027*G0_1_1_4_3 + 0.0683316683316803*G0_1_1_4_4 - 0.00749250749250881*G0_1_1_4_5 - 0.0215784215784252*G0_1_1_4_6 - 0.0216640502354825*G0_1_1_4_7 + 0.0429427715142073*G0_1_1_4_8 + 0.0491508491508575*G0_1_1_4_9 + 0.00190095618667082*G0_1_1_5_0 + 0.00287997716569199*G0_1_1_5_1 + 0.00192030192030229*G0_1_1_5_2 + 0.000693592122163668*G0_1_1_5_3 - 0.00749250749250881*G0_1_1_5_4 - 0.000685029256457868*G0_1_1_5_5 + 0.00869130869131011*G0_1_1_5_6 - 0.00142143570715018*G0_1_1_5_7 + 0.00283430854859477*G0_1_1_5_8 + 0.00880262594548458*G0_1_1_5_9 - 0.00192664478378799*G0_1_1_6_0 - 0.00586556300842118*G0_1_1_6_1 + 0.00295260295260338*G0_1_1_6_2 + 0.029070929070934*G0_1_1_6_3 - 0.0215784215784252*G0_1_1_6_4 + 0.00869130869131011*G0_1_1_6_5 - 0.0659340659340773*G0_1_1_6_6 - 0.00141287284144455*G0_1_1_6_7 + 0.0187954902240648*G0_1_1_6_8 - 0.0239760239760281*G0_1_1_6_9 + 0.00969379826522854*G0_1_1_7_0 + 0.0330761302189932*G0_1_1_7_1 + 0.00429570429570503*G0_1_1_7_2 + 0.0329755958327443*G0_1_1_7_3 - 0.0216640502354825*G0_1_1_7_4 - 0.00142143570715018*G0_1_1_7_5 - 0.00141287284144455*G0_1_1_7_6 - 0.0455886970172759*G0_1_1_7_7 + 0.0570201227344183*G0_1_1_7_8 + 0.0172969887255631*G0_1_1_7_9 - 0.0145857317285915*G0_1_1_8_0 - 0.0708447108447233*G0_1_1_8_1 - 0.0104895104895122*G0_1_1_8_2 - 0.0759183673469517*G0_1_1_8_3 + 0.0429427715142073*G0_1_1_8_4 + 0.00283430854859477*G0_1_1_8_5 + 0.0187954902240648*G0_1_1_8_6 + 0.0570201227344183*G0_1_1_8_7 - 0.29331240188388*G0_1_1_8_8 - 0.0656771799629053*G0_1_1_8_9 - 0.00482374768089135*G0_1_1_9_0 - 0.00673612102183651*G0_1_1_9_1 - 0.0113886113886133*G0_1_1_9_2 - 0.0457428285999792*G0_1_1_9_3 + 0.0491508491508576*G0_1_1_9_4 + 0.00880262594548458*G0_1_1_9_5 - 0.0239760239760281*G0_1_1_9_6 + 0.0172969887255631*G0_1_1_9_7 - 0.0656771799629053*G0_1_1_9_8 - 0.110152704438437*G0_1_1_9_9; + A[169] = A[68] - 0.00052941767227487*G0_0_0_0_0 + 0.000543900543900634*G0_0_0_0_1 - 0.0174131688417432*G0_0_0_0_2 + 0.00411493268636195*G0_0_0_0_3 - 0.00071262071262079*G0_0_0_0_4 + 0.0113137655994818*G0_0_0_0_5 - 0.0246302903445803*G0_0_0_0_6 + 0.000366617509474702*G0_0_0_0_7 + 0.000209631638203097*G0_0_0_0_8 + 0.000108462965605845*G0_0_0_0_9 + 0.000543900543900634*G0_0_0_1_0 + 0.0252784252784293*G0_0_0_1_1 - 0.00787519358948061*G0_0_0_1_2 + 0.0272565529708432*G0_0_0_1_3 - 0.0114885114885133*G0_0_0_1_4 + 0.003302411873841*G0_0_0_1_5 - 0.0130088958660409*G0_0_0_1_6 - 0.00504289361432303*G0_0_0_1_7 + 0.0125081267938431*G0_0_0_1_8 + 0.00235003092145991*G0_0_0_1_9 - 0.0174131688417432*G0_0_0_2_0 - 0.00787519358948061*G0_0_0_2_1 - 0.30066822066827*G0_0_0_2_2 + 0.0471509442938091*G0_0_0_2_3 - 0.085194805194819*G0_0_0_2_4 + 0.0816941788370495*G0_0_0_2_5 - 0.185023865023896*G0_0_0_2_6 + 0.00238903953189704*G0_0_0_2_7 + 0.000752580752580848*G0_0_0_2_8 - 0.0183511726368899*G0_0_0_2_9 + 0.00411493268636195*G0_0_0_3_0 + 0.0272565529708432*G0_0_0_3_1 + 0.0471509442938091*G0_0_0_3_2 + 0.0222977022977065*G0_0_0_3_3 - 0.0172370486656233*G0_0_0_3_4 - 0.0150991865277604*G0_0_0_3_5 + 0.0469730269730346*G0_0_0_3_6 - 0.00439845868417373*G0_0_0_3_7 - 0.00129013843299571*G0_0_0_3_8 + 0.00174682460396776*G0_0_0_3_9 - 0.00071262071262079*G0_0_0_4_0 - 0.0114885114885133*G0_0_0_4_1 - 0.085194805194819*G0_0_0_4_2 - 0.0172370486656233*G0_0_0_4_3 + 0.156957328385927*G0_0_0_4_4 + 0.0100842015127745*G0_0_0_4_5 - 0.0570572284858091*G0_0_0_4_6 - 0.00648779791637045*G0_0_0_4_7 + 0.00568859711716945*G0_0_0_4_8 + 0.0348851148851208*G0_0_0_4_9 + 0.0113137655994818*G0_0_0_5_0 + 0.003302411873841*G0_0_0_5_1 + 0.0816941788370495*G0_0_0_5_2 - 0.0150991865277604*G0_0_0_5_3 + 0.0100842015127745*G0_0_0_5_4 - 0.0508405879834536*G0_0_0_5_5 + 0.111879549022425*G0_0_0_5_6 + 0.00118167546738996*G0_0_0_5_7 - 0.00196089624661084*G0_0_0_5_8 + 0.00359640359640415*G0_0_0_5_9 - 0.0246302903445803*G0_0_0_6_0 - 0.0130088958660409*G0_0_0_6_1 - 0.185023865023896*G0_0_0_6_2 + 0.0469730269730346*G0_0_0_6_3 - 0.0570572284858091*G0_0_0_6_4 + 0.111879549022425*G0_0_0_6_5 - 0.402962751534247*G0_0_0_6_6 + 0.000779220779220877*G0_0_0_6_7 + 0.0144113029827339*G0_0_0_6_8 - 0.0388925360353995*G0_0_0_6_9 + 0.000366617509474701*G0_0_0_7_0 - 0.00504289361432303*G0_0_0_7_1 + 0.00238903953189704*G0_0_0_7_2 - 0.00439845868417374*G0_0_0_7_3 - 0.00648779791637045*G0_0_0_7_4 + 0.00118167546738996*G0_0_0_7_5 + 0.000779220779220876*G0_0_0_7_6 + 0.00289995718567187*G0_0_0_7_7 - 0.00157842157842181*G0_0_0_7_8 - 0.00188383045525937*G0_0_0_7_9 + 0.000209631638203098*G0_0_0_8_0 + 0.0125081267938431*G0_0_0_8_1 + 0.000752580752580847*G0_0_0_8_2 - 0.00129013843299571*G0_0_0_8_3 + 0.00568859711716945*G0_0_0_8_4 - 0.00196089624661084*G0_0_0_8_5 + 0.0144113029827339*G0_0_0_8_6 - 0.00157842157842181*G0_0_0_8_7 - 0.0328243185386096*G0_0_0_8_8 - 0.0184272869987186*G0_0_0_8_9 + 0.000108462965605845*G0_0_0_9_0 + 0.00235003092145991*G0_0_0_9_1 - 0.0183511726368899*G0_0_0_9_2 + 0.00174682460396776*G0_0_0_9_3 + 0.0348851148851208*G0_0_0_9_4 + 0.00359640359640415*G0_0_0_9_5 - 0.0388925360353995*G0_0_0_9_6 - 0.00188383045525936*G0_0_0_9_7 - 0.0184272869987186*G0_0_0_9_8 - 0.0337034394177309*G0_0_0_9_9 + 0.00809560809560954*G0_0_1_0_1 - 0.00809560809560946*G0_0_1_0_2 + 0.00353170638884985*G0_0_1_0_3 - 0.00353170638884981*G0_0_1_0_4 + 0.00187621901907644*G0_0_1_0_5 - 0.00619190333476147*G0_0_1_0_6 - 0.00187621901907657*G0_0_1_0_7 + 0.00619190333476158*G0_0_1_0_8 + 0.00809560809560954*G0_0_1_1_0 + 0.229902443235816*G0_0_1_1_1 + 0.0560169988741514*G0_0_1_1_3 - 0.0297743526315006*G0_0_1_1_4 + 0.00125017839303565*G0_0_1_1_5 - 0.000637457780314974*G0_0_1_1_6 - 0.0379934351362989*G0_0_1_1_7 + 0.0846068217496937*G0_0_1_1_8 + 0.00321012321012382*G0_0_1_1_9 - 0.00809560809560946*G0_0_1_2_0 - 0.229902443235815*G0_0_1_2_2 + 0.0297743526315003*G0_0_1_2_3 - 0.0560169988741507*G0_0_1_2_4 + 0.0379934351362985*G0_0_1_2_5 - 0.0846068217496928*G0_0_1_2_6 - 0.00125017839303578*G0_0_1_2_7 + 0.000637457780315022*G0_0_1_2_8 - 0.00321012321012369*G0_0_1_2_9 + 0.00353170638884985*G0_0_1_3_0 + 0.0560169988741514*G0_0_1_3_1 + 0.0297743526315003*G0_0_1_3_2 - 0.0878378764093195*G0_0_1_3_3 - 0.00717282717282837*G0_0_1_3_5 + 0.00191237334094501*G0_0_1_3_6 - 0.0105951191665496*G0_0_1_3_7 + 0.0125074925074948*G0_0_1_3_8 + 0.0115598687027278*G0_0_1_3_9 - 0.00353170638884981*G0_0_1_4_0 - 0.0297743526315006*G0_0_1_4_1 - 0.0560169988741507*G0_0_1_4_2 + 0.0878378764093207*G0_0_1_4_4 + 0.0105951191665494*G0_0_1_4_5 - 0.0125074925074944*G0_0_1_4_6 + 0.0071728271728284*G0_0_1_4_7 - 0.00191237334094518*G0_0_1_4_8 - 0.0115598687027277*G0_0_1_4_9 + 0.00187621901907644*G0_0_1_5_0 + 0.00125017839303565*G0_0_1_5_1 + 0.0379934351362985*G0_0_1_5_2 - 0.00717282717282837*G0_0_1_5_3 + 0.0105951191665494*G0_0_1_5_4 - 0.00714713857571126*G0_0_1_5_5 + 0.0277722277722323*G0_0_1_5_6 - 0.00375053517910726*G0_0_1_5_8 + 0.00750107035821447*G0_0_1_5_9 - 0.00619190333476147*G0_0_1_6_0 - 0.000637457780314974*G0_0_1_6_1 - 0.0846068217496928*G0_0_1_6_2 + 0.00191237334094501*G0_0_1_6_3 - 0.0125074925074944*G0_0_1_6_4 + 0.0277722277722323*G0_0_1_6_5 + 0.0795946910232764*G0_0_1_6_6 + 0.00375053517910726*G0_0_1_6_7 + 0.00580562294848108*G0_0_1_6_9 - 0.00187621901907657*G0_0_1_7_0 - 0.0379934351362989*G0_0_1_7_1 - 0.00125017839303578*G0_0_1_7_2 - 0.0105951191665496*G0_0_1_7_3 + 0.0071728271728284*G0_0_1_7_4 + 0.00375053517910726*G0_0_1_7_6 + 0.00714713857571096*G0_0_1_7_7 - 0.0277722277722326*G0_0_1_7_8 - 0.00750107035821451*G0_0_1_7_9 + 0.00619190333476158*G0_0_1_8_0 + 0.0846068217496937*G0_0_1_8_1 + 0.000637457780315023*G0_0_1_8_2 + 0.0125074925074948*G0_0_1_8_3 - 0.00191237334094518*G0_0_1_8_4 - 0.00375053517910726*G0_0_1_8_5 - 0.0277722277722326*G0_0_1_8_7 - 0.0795946910232756*G0_0_1_8_8 - 0.00580562294848108*G0_0_1_8_9 + 0.00321012321012383*G0_0_1_9_1 - 0.00321012321012369*G0_0_1_9_2 + 0.0115598687027278*G0_0_1_9_3 - 0.0115598687027277*G0_0_1_9_4 + 0.00750107035821447*G0_0_1_9_5 + 0.00580562294848108*G0_0_1_9_6 - 0.00750107035821451*G0_0_1_9_7 - 0.00580562294848108*G0_0_1_9_8 + 0.00193055621627082*G0_1_0_0_1 - 0.00193055621627082*G0_1_0_0_2 + 0.00609295466438428*G0_1_0_0_3 - 0.00609295466438425*G0_1_0_0_4 + 0.00172843029985916*G0_1_0_0_5 - 0.00519607376750322*G0_1_0_0_6 - 0.00172843029985917*G0_1_0_0_7 + 0.00519607376750321*G0_1_0_0_8 + 0.00193055621627082*G0_1_0_1_0 + 0.0309359776026493*G0_1_0_1_1 + 0.0391519591519657*G0_1_0_1_3 - 0.022622456908175*G0_1_0_1_4 + 0.00131297274154439*G0_1_0_1_5 - 0.00582465153893823*G0_1_0_1_6 - 0.0102082044939205*G0_1_0_1_7 + 0.0219425019425055*G0_1_0_1_8 + 0.0043080728795022*G0_1_0_1_9 - 0.00193055621627082*G0_1_0_2_0 - 0.0309359776026491*G0_1_0_2_2 + 0.0226224569081749*G0_1_0_2_3 - 0.0391519591519655*G0_1_0_2_4 + 0.0102082044939204*G0_1_0_2_5 - 0.0219425019425055*G0_1_0_2_6 - 0.00131297274154439*G0_1_0_2_7 + 0.00582465153893822*G0_1_0_2_8 - 0.00430807287950215*G0_1_0_2_9 + 0.00609295466438428*G0_1_0_3_0 + 0.0391519591519657*G0_1_0_3_1 + 0.0226224569081749*G0_1_0_3_2 + 0.0325388896817528*G0_1_0_3_3 - 0.011108891108893*G0_1_0_3_5 + 0.0174739546168146*G0_1_0_3_6 - 0.0182788639931528*G0_1_0_3_7 + 0.0357528186099675*G0_1_0_3_8 + 0.0236335093477991*G0_1_0_3_9 - 0.00609295466438425*G0_1_0_4_0 - 0.022622456908175*G0_1_0_4_1 - 0.0391519591519655*G0_1_0_4_2 - 0.0325388896817518*G0_1_0_4_4 + 0.0182788639931527*G0_1_0_4_5 - 0.0357528186099674*G0_1_0_4_6 + 0.0111088911088929*G0_1_0_4_7 - 0.0174739546168147*G0_1_0_4_8 - 0.0236335093477989*G0_1_0_4_9 + 0.00172843029985916*G0_1_0_5_0 + 0.00131297274154439*G0_1_0_5_1 + 0.0102082044939204*G0_1_0_5_2 - 0.011108891108893*G0_1_0_5_3 + 0.0182788639931527*G0_1_0_5_4 - 0.00796917368346072*G0_1_0_5_5 + 0.0220522334808086*G0_1_0_5_6 - 0.00393891822463317*G0_1_0_5_8 + 0.0078778364492663*G0_1_0_5_9 - 0.00519607376750322*G0_1_0_6_0 - 0.00582465153893823*G0_1_0_6_1 - 0.0219425019425055*G0_1_0_6_2 + 0.0174739546168146*G0_1_0_6_3 - 0.0357528186099673*G0_1_0_6_4 + 0.0220522334808086*G0_1_0_6_5 - 0.0521193092621753*G0_1_0_6_6 + 0.00393891822463316*G0_1_0_6_7 - 0.0220236905951228*G0_1_0_6_9 - 0.00172843029985917*G0_1_0_7_0 - 0.0102082044939205*G0_1_0_7_1 - 0.00131297274154439*G0_1_0_7_2 - 0.0182788639931528*G0_1_0_7_3 + 0.0111088911088929*G0_1_0_7_4 + 0.00393891822463316*G0_1_0_7_6 + 0.00796917368346075*G0_1_0_7_7 - 0.0220522334808086*G0_1_0_7_8 - 0.00787783644926638*G0_1_0_7_9 + 0.00519607376750321*G0_1_0_8_0 + 0.0219425019425055*G0_1_0_8_1 + 0.00582465153893822*G0_1_0_8_2 + 0.0357528186099675*G0_1_0_8_3 - 0.0174739546168147*G0_1_0_8_4 - 0.00393891822463317*G0_1_0_8_5 - 0.0220522334808086*G0_1_0_8_7 + 0.0521193092621751*G0_1_0_8_8 + 0.0220236905951229*G0_1_0_8_9 + 0.0043080728795022*G0_1_0_9_1 - 0.00430807287950215*G0_1_0_9_2 + 0.0236335093477991*G0_1_0_9_3 - 0.0236335093477989*G0_1_0_9_4 + 0.0078778364492663*G0_1_0_9_5 - 0.0220236905951228*G0_1_0_9_6 - 0.00787783644926638*G0_1_0_9_7 + 0.0220236905951229*G0_1_0_9_8 + 0.000529417672274857*G0_1_1_0_0 + 0.0174131688417433*G0_1_1_0_1 - 0.000543900543900629*G0_1_1_0_2 + 0.000712620712620863*G0_1_1_0_3 - 0.00411493268636196*G0_1_1_0_4 - 0.000366617509474752*G0_1_1_0_5 - 0.000209631638203079*G0_1_1_0_6 - 0.0113137655994819*G0_1_1_0_7 + 0.0246302903445804*G0_1_1_0_8 - 0.000108462965605816*G0_1_1_0_9 + 0.0174131688417433*G0_1_1_1_0 + 0.300668220668273*G0_1_1_1_1 + 0.00787519358948065*G0_1_1_1_2 + 0.0851948051948199*G0_1_1_1_3 - 0.0471509442938095*G0_1_1_1_4 - 0.00238903953189721*G0_1_1_1_5 - 0.000752580752580802*G0_1_1_1_6 - 0.0816941788370501*G0_1_1_1_7 + 0.185023865023897*G0_1_1_1_8 + 0.0183511726368901*G0_1_1_1_9 - 0.000543900543900629*G0_1_1_2_0 + 0.00787519358948066*G0_1_1_2_1 - 0.0252784252784292*G0_1_1_2_2 + 0.0114885114885134*G0_1_1_2_3 - 0.0272565529708431*G0_1_1_2_4 + 0.00504289361432297*G0_1_1_2_5 - 0.0125081267938431*G0_1_1_2_6 - 0.00330241187384102*G0_1_1_2_7 + 0.0130088958660409*G0_1_1_2_8 - 0.00235003092145987*G0_1_1_2_9 + 0.000712620712620861*G0_1_1_3_0 + 0.0851948051948199*G0_1_1_3_1 + 0.0114885114885134*G0_1_1_3_2 - 0.156957328385926*G0_1_1_3_3 + 0.0172370486656228*G0_1_1_3_4 + 0.00648779791637037*G0_1_1_3_5 - 0.00568859711716955*G0_1_1_3_6 - 0.0100842015127748*G0_1_1_3_7 + 0.0570572284858098*G0_1_1_3_8 - 0.0348851148851207*G0_1_1_3_9 - 0.00411493268636196*G0_1_1_4_0 - 0.0471509442938095*G0_1_1_4_1 - 0.0272565529708431*G0_1_1_4_2 + 0.0172370486656228*G0_1_1_4_3 - 0.0222977022977056*G0_1_1_4_4 + 0.0043984586841737*G0_1_1_4_5 + 0.00129013843299588*G0_1_1_4_6 + 0.0150991865277606*G0_1_1_4_7 - 0.046973026973035*G0_1_1_4_8 - 0.00174682460396773*G0_1_1_4_9 - 0.000366617509474752*G0_1_1_5_0 - 0.00238903953189721*G0_1_1_5_1 + 0.00504289361432297*G0_1_1_5_2 + 0.00648779791637037*G0_1_1_5_3 + 0.0043984586841737*G0_1_1_5_4 - 0.002899957185672*G0_1_1_5_5 + 0.00157842157842186*G0_1_1_5_6 - 0.00118167546738994*G0_1_1_5_7 - 0.000779220779221017*G0_1_1_5_8 + 0.00188383045525926*G0_1_1_5_9 - 0.000209631638203079*G0_1_1_6_0 - 0.000752580752580802*G0_1_1_6_1 - 0.0125081267938431*G0_1_1_6_2 - 0.00568859711716954*G0_1_1_6_3 + 0.00129013843299588*G0_1_1_6_4 + 0.00157842157842186*G0_1_1_6_5 + 0.03282431853861*G0_1_1_6_6 + 0.00196089624661087*G0_1_1_6_7 - 0.0144113029827339*G0_1_1_6_8 + 0.0184272869987188*G0_1_1_6_9 - 0.0113137655994819*G0_1_1_7_0 - 0.0816941788370501*G0_1_1_7_1 - 0.00330241187384102*G0_1_1_7_2 - 0.0100842015127748*G0_1_1_7_3 + 0.0150991865277606*G0_1_1_7_4 - 0.00118167546738994*G0_1_1_7_5 + 0.00196089624661087*G0_1_1_7_6 + 0.0508405879834536*G0_1_1_7_7 - 0.111879549022425*G0_1_1_7_8 - 0.00359640359640434*G0_1_1_7_9 + 0.0246302903445804*G0_1_1_8_0 + 0.185023865023897*G0_1_1_8_1 + 0.0130088958660409*G0_1_1_8_2 + 0.0570572284858098*G0_1_1_8_3 - 0.046973026973035*G0_1_1_8_4 - 0.000779220779221018*G0_1_1_8_5 - 0.0144113029827339*G0_1_1_8_6 - 0.111879549022425*G0_1_1_8_7 + 0.402962751534249*G0_1_1_8_8 + 0.0388925360353999*G0_1_1_8_9 - 0.000108462965605815*G0_1_1_9_0 + 0.0183511726368901*G0_1_1_9_1 - 0.00235003092145987*G0_1_1_9_2 - 0.0348851148851207*G0_1_1_9_3 - 0.00174682460396773*G0_1_1_9_4 + 0.00188383045525926*G0_1_1_9_5 + 0.0184272869987188*G0_1_1_9_6 - 0.00359640359640433*G0_1_1_9_7 + 0.0388925360353999*G0_1_1_9_8 + 0.0337034394177309*G0_1_1_9_9; + A[71] = A[169] - 0.000523497666354945*G0_0_1_0_0 - 0.00578458578458685*G0_0_1_0_1 + 0.00038046609475187*G0_0_1_0_2 + 0.00168625025767911*G0_0_1_0_3 - 0.000874998017855304*G0_0_1_0_4 + 0.00014874014874017*G0_0_1_0_6 - 0.000847089418518182*G0_0_1_0_8 - 0.00141382427096736*G0_0_1_0_9 - 0.00578458578458685*G0_0_1_1_0 - 0.195838729172097*G0_0_1_1_1 - 0.00337514337514397*G0_0_1_1_2 - 0.0192252192252228*G0_0_1_1_3 + 0.014407814407817*G0_0_1_1_4 - 0.000597180597180613*G0_0_1_1_5 + 0.00025530025530027*G0_0_1_1_6 + 0.0265734265734314*G0_0_1_1_7 - 0.0608724608724718*G0_0_1_1_8 + 0.00293040293040336*G0_0_1_1_9 + 0.00038046609475187*G0_0_1_2_0 - 0.00337514337514397*G0_0_1_2_1 + 0.0031277364610703*G0_0_1_2_2 + 0.00725591868449134*G0_0_1_2_3 - 0.00236017950303704*G0_0_1_2_4 - 0.00121180406894712*G0_0_1_2_5 + 0.00179185893471636*G0_0_1_2_6 - 0.000659974945689333*G0_0_1_2_7 + 0.00544249401392347*G0_0_1_2_8 + 0.00183245326102499*G0_0_1_2_9 + 0.00168625025767911*G0_0_1_3_0 - 0.0192252192252228*G0_0_1_3_1 + 0.00725591868449134*G0_0_1_3_2 + 0.133706293706316*G0_0_1_3_3 - 0.0355044955045015*G0_0_1_3_4 - 0.000796346510632326*G0_0_1_3_5 - 0.00244041672613142*G0_0_1_3_6 - 0.0067332667332678*G0_0_1_3_7 + 0.0247352647352687*G0_0_1_3_8 + 0.00467532467532556*G0_0_1_3_9 - 0.000874998017855304*G0_0_1_4_0 + 0.014407814407817*G0_0_1_4_1 - 0.00236017950303704*G0_0_1_4_2 - 0.0355044955045015*G0_0_1_4_3 + 0.013329527615244*G0_0_1_4_4 + 0.000950478093335389*G0_0_1_4_5 + 0.00148993863279601*G0_0_1_4_6 + 0.0031397174254322*G0_0_1_4_7 - 0.0180019980020009*G0_0_1_4_8 - 0.00739831596974579*G0_0_1_4_9 - 0.000597180597180613*G0_0_1_5_1 - 0.00121180406894712*G0_0_1_5_2 - 0.000796346510632329*G0_0_1_5_3 + 0.00095047809333539*G0_0_1_5_4 + 0.0030769230769237*G0_0_1_5_5 - 0.00054516911659776*G0_0_1_5_6 - 0.000422434708149082*G0_0_1_5_7 + 0.000117025831311597*G0_0_1_5_8 + 0.00400742115027894*G0_0_1_5_9 + 0.00014874014874017*G0_0_1_6_0 + 0.000255300255300269*G0_0_1_6_1 + 0.00179185893471636*G0_0_1_6_2 - 0.00244041672613142*G0_0_1_6_3 + 0.00148993863279601*G0_0_1_6_4 - 0.00054516911659776*G0_0_1_6_5 + 0.0107835022120754*G0_0_1_6_6 + 0.000305408876837505*G0_0_1_6_7 - 0.00770943342372041*G0_0_1_6_8 - 0.000616526330812152*G0_0_1_6_9 + 0.0265734265734314*G0_0_1_7_1 - 0.000659974945689333*G0_0_1_7_2 - 0.00673326673326781*G0_0_1_7_3 + 0.0031397174254322*G0_0_1_7_4 - 0.000422434708149081*G0_0_1_7_5 + 0.000305408876837505*G0_0_1_7_6 + 0.00389895818467305*G0_0_1_7_7 + 0.00517482517482631*G0_0_1_7_8 + 0.00363065505922708*G0_0_1_7_9 - 0.000847089418518182*G0_0_1_8_0 - 0.0608724608724718*G0_0_1_8_1 + 0.00544249401392347*G0_0_1_8_2 + 0.0247352647352687*G0_0_1_8_3 - 0.0180019980020009*G0_0_1_8_4 + 0.000117025831311597*G0_0_1_8_5 - 0.00770943342372041*G0_0_1_8_6 + 0.00517482517482631*G0_0_1_8_7 + 0.142497502497526*G0_0_1_8_8 + 0.0272127872127918*G0_0_1_8_9 - 0.00141382427096736*G0_0_1_9_0 + 0.00293040293040336*G0_0_1_9_1 + 0.00183245326102499*G0_0_1_9_2 + 0.00467532467532555*G0_0_1_9_3 - 0.00739831596974579*G0_0_1_9_4 + 0.00400742115027894*G0_0_1_9_5 - 0.000616526330812152*G0_0_1_9_6 + 0.00363065505922708*G0_0_1_9_7 + 0.0272127872127918*G0_0_1_9_8 - 0.0355530184101672*G0_0_1_9_9 + 0.000523497666354945*G0_1_0_0_0 + 0.00578458578458685*G0_1_0_0_1 - 0.00038046609475187*G0_1_0_0_2 - 0.00168625025767911*G0_1_0_0_3 + 0.000874998017855304*G0_1_0_0_4 - 0.00014874014874017*G0_1_0_0_6 + 0.000847089418518182*G0_1_0_0_8 + 0.00141382427096736*G0_1_0_0_9 + 0.00578458578458685*G0_1_0_1_0 + 0.195838729172097*G0_1_0_1_1 + 0.00337514337514397*G0_1_0_1_2 + 0.0192252192252228*G0_1_0_1_3 - 0.014407814407817*G0_1_0_1_4 + 0.000597180597180613*G0_1_0_1_5 - 0.00025530025530027*G0_1_0_1_6 - 0.0265734265734314*G0_1_0_1_7 + 0.0608724608724718*G0_1_0_1_8 - 0.00293040293040336*G0_1_0_1_9 - 0.00038046609475187*G0_1_0_2_0 + 0.00337514337514397*G0_1_0_2_1 - 0.0031277364610703*G0_1_0_2_2 - 0.00725591868449134*G0_1_0_2_3 + 0.00236017950303704*G0_1_0_2_4 + 0.00121180406894712*G0_1_0_2_5 - 0.00179185893471636*G0_1_0_2_6 + 0.000659974945689333*G0_1_0_2_7 - 0.00544249401392347*G0_1_0_2_8 - 0.00183245326102499*G0_1_0_2_9 - 0.00168625025767911*G0_1_0_3_0 + 0.0192252192252228*G0_1_0_3_1 - 0.00725591868449134*G0_1_0_3_2 - 0.133706293706316*G0_1_0_3_3 + 0.0355044955045015*G0_1_0_3_4 + 0.000796346510632329*G0_1_0_3_5 + 0.00244041672613142*G0_1_0_3_6 + 0.00673326673326781*G0_1_0_3_7 - 0.0247352647352687*G0_1_0_3_8 - 0.00467532467532556*G0_1_0_3_9 + 0.000874998017855304*G0_1_0_4_0 - 0.014407814407817*G0_1_0_4_1 + 0.00236017950303704*G0_1_0_4_2 + 0.0355044955045015*G0_1_0_4_3 - 0.013329527615244*G0_1_0_4_4 - 0.000950478093335389*G0_1_0_4_5 - 0.00148993863279601*G0_1_0_4_6 - 0.0031397174254322*G0_1_0_4_7 + 0.0180019980020009*G0_1_0_4_8 + 0.00739831596974579*G0_1_0_4_9 + 0.000597180597180613*G0_1_0_5_1 + 0.00121180406894712*G0_1_0_5_2 + 0.000796346510632329*G0_1_0_5_3 - 0.00095047809333539*G0_1_0_5_4 - 0.0030769230769237*G0_1_0_5_5 + 0.00054516911659776*G0_1_0_5_6 + 0.000422434708149082*G0_1_0_5_7 - 0.000117025831311596*G0_1_0_5_8 - 0.00400742115027894*G0_1_0_5_9 - 0.00014874014874017*G0_1_0_6_0 - 0.00025530025530027*G0_1_0_6_1 - 0.00179185893471636*G0_1_0_6_2 + 0.00244041672613142*G0_1_0_6_3 - 0.00148993863279601*G0_1_0_6_4 + 0.00054516911659776*G0_1_0_6_5 - 0.0107835022120754*G0_1_0_6_6 - 0.000305408876837505*G0_1_0_6_7 + 0.00770943342372041*G0_1_0_6_8 + 0.000616526330812151*G0_1_0_6_9 - 0.0265734265734314*G0_1_0_7_1 + 0.000659974945689333*G0_1_0_7_2 + 0.00673326673326781*G0_1_0_7_3 - 0.0031397174254322*G0_1_0_7_4 + 0.000422434708149081*G0_1_0_7_5 - 0.000305408876837505*G0_1_0_7_6 - 0.00389895818467304*G0_1_0_7_7 - 0.00517482517482632*G0_1_0_7_8 - 0.00363065505922708*G0_1_0_7_9 + 0.000847089418518183*G0_1_0_8_0 + 0.0608724608724718*G0_1_0_8_1 - 0.00544249401392347*G0_1_0_8_2 - 0.0247352647352687*G0_1_0_8_3 + 0.0180019980020009*G0_1_0_8_4 - 0.000117025831311597*G0_1_0_8_5 + 0.00770943342372041*G0_1_0_8_6 - 0.00517482517482632*G0_1_0_8_7 - 0.142497502497526*G0_1_0_8_8 - 0.0272127872127918*G0_1_0_8_9 + 0.00141382427096736*G0_1_0_9_0 - 0.00293040293040336*G0_1_0_9_1 - 0.00183245326102499*G0_1_0_9_2 - 0.00467532467532556*G0_1_0_9_3 + 0.00739831596974579*G0_1_0_9_4 - 0.00400742115027894*G0_1_0_9_5 + 0.000616526330812152*G0_1_0_9_6 - 0.00363065505922708*G0_1_0_9_7 - 0.0272127872127918*G0_1_0_9_8 + 0.0355530184101672*G0_1_0_9_9; + A[38] = -A[35] - 0.0089056270008666*G0_1_1_0_0 - 0.00133135823612038*G0_1_1_0_1 - 0.00456796290129701*G0_1_1_0_2 - 0.00100547600547617*G0_1_1_0_3 - 0.000491545491545575*G0_1_1_0_4 - 0.00117956117956138*G0_1_1_0_5 + 0.000338920338920403*G0_1_1_0_6 - 0.0055419712562579*G0_1_1_0_7 + 0.00176056747485347*G0_1_1_0_8 - 0.000881340881341044*G0_1_1_0_9 - 0.00133135823612038*G0_1_1_1_0 - 0.00890562700086671*G0_1_1_1_1 - 0.00456796290129701*G0_1_1_1_2 - 0.00117956117956141*G0_1_1_1_3 + 0.000338920338920403*G0_1_1_1_4 - 0.00100547600547617*G0_1_1_1_5 - 0.000491545491545578*G0_1_1_1_6 + 0.00176056747485352*G0_1_1_1_7 - 0.00554197125625798*G0_1_1_1_8 - 0.000881340881341046*G0_1_1_1_9 - 0.00456796290129701*G0_1_1_2_0 - 0.00456796290129701*G0_1_1_2_1 - 0.1426931093598*G0_1_1_2_2 + 0.0185148185148216*G0_1_1_2_3 - 0.0380452880452944*G0_1_1_2_4 + 0.0185148185148216*G0_1_1_2_5 - 0.0380452880452944*G0_1_1_2_6 - 0.0010221260221262*G0_1_1_2_7 - 0.00102212602212621*G0_1_1_2_8 - 0.00203130203130235*G0_1_1_2_9 - 0.00100547600547618*G0_1_1_3_0 - 0.00117956117956141*G0_1_1_3_1 + 0.0185148185148216*G0_1_1_3_2 - 0.0180619380619411*G0_1_1_3_3 + 0.00641858141858251*G0_1_1_3_4 + 0.00206793206793242*G0_1_1_3_5 + 0.00337162837162892*G0_1_1_3_6 + 0.00491341991342076*G0_1_1_3_7 - 0.00987678987679155*G0_1_1_3_8 - 0.00718281718281837*G0_1_1_3_9 - 0.000491545491545575*G0_1_1_4_0 + 0.000338920338920405*G0_1_1_4_1 - 0.0380452880452944*G0_1_1_4_2 + 0.00641858141858251*G0_1_1_4_3 - 0.0134865134865157*G0_1_1_4_4 + 0.00337162837162893*G0_1_1_4_5 - 0.00674325674325785*G0_1_1_4_6 + 0.00132201132201154*G0_1_1_4_7 + 0.00496336996337081*G0_1_1_4_8 - 0.000649350649350792*G0_1_1_4_9 - 0.00117956117956138*G0_1_1_5_0 - 0.00100547600547617*G0_1_1_5_1 + 0.0185148185148216*G0_1_1_5_2 + 0.00206793206793242*G0_1_1_5_3 + 0.00337162837162893*G0_1_1_5_4 - 0.018061938061941*G0_1_1_5_5 + 0.00641858141858242*G0_1_1_5_6 - 0.00987678987679151*G0_1_1_5_7 + 0.00491341991342074*G0_1_1_5_8 - 0.00718281718281837*G0_1_1_5_9 + 0.000338920338920403*G0_1_1_6_0 - 0.000491545491545578*G0_1_1_6_1 - 0.0380452880452944*G0_1_1_6_2 + 0.00337162837162893*G0_1_1_6_3 - 0.00674325674325784*G0_1_1_6_4 + 0.00641858141858242*G0_1_1_6_5 - 0.0134865134865157*G0_1_1_6_6 + 0.00496336996337079*G0_1_1_6_7 + 0.00132201132201154*G0_1_1_6_8 - 0.000649350649350809*G0_1_1_6_9 - 0.0055419712562579*G0_1_1_7_0 + 0.00176056747485352*G0_1_1_7_1 - 0.0010221260221262*G0_1_1_7_2 + 0.00491341991342076*G0_1_1_7_3 + 0.00132201132201154*G0_1_1_7_4 - 0.00987678987679151*G0_1_1_7_5 + 0.00496336996337079*G0_1_1_7_6 - 0.0513438942010457*G0_1_1_7_7 + 0.0110258788830237*G0_1_1_7_8 - 0.0072827172827185*G0_1_1_7_9 + 0.00176056747485347*G0_1_1_8_0 - 0.00554197125625798*G0_1_1_8_1 - 0.00102212602212621*G0_1_1_8_2 - 0.00987678987679155*G0_1_1_8_3 + 0.0049633699633708*G0_1_1_8_4 + 0.00491341991342074*G0_1_1_8_5 + 0.00132201132201154*G0_1_1_8_6 + 0.0110258788830237*G0_1_1_8_7 - 0.0513438942010459*G0_1_1_8_8 - 0.0072827172827185*G0_1_1_8_9 - 0.000881340881341043*G0_1_1_9_0 - 0.000881340881341045*G0_1_1_9_1 - 0.00203130203130235*G0_1_1_9_2 - 0.00718281718281837*G0_1_1_9_3 - 0.000649350649350788*G0_1_1_9_4 - 0.00718281718281837*G0_1_1_9_5 - 0.000649350649350809*G0_1_1_9_6 - 0.0072827172827185*G0_1_1_9_7 - 0.0072827172827185*G0_1_1_9_8 - 0.0600599400599501*G0_1_1_9_9; + A[116] = -A[108] + 0.00910102243435743*G0_0_0_0_0 + 0.000500628119675834*G0_0_0_0_1 + 0.00144874525826931*G0_0_0_0_2 + 0.000431631860203388*G0_0_0_0_3 - 0.00088324374038676*G0_0_0_0_4 + 0.0182021153449756*G0_0_0_0_5 - 0.00174841031983928*G0_0_0_0_6 + 0.00154702440416753*G0_0_0_0_7 - 0.00146805575377029*G0_0_0_0_8 + 0.00333190618904962*G0_0_0_0_9 + 0.000500628119675834*G0_0_0_1_0 + 0.00207200207200274*G0_0_0_1_1 + 0.000693239740858905*G0_0_0_1_2 - 0.000621600621600653*G0_0_0_1_3 - 0.00343878343878407*G0_0_0_1_4 - 0.00210868496582817*G0_0_0_1_5 - 0.00386312100597879*G0_0_0_1_6 - 0.00177822177822213*G0_0_0_1_7 - 0.00073260073260076*G0_0_0_1_8 + 0.00286380286380339*G0_0_0_1_9 + 0.00144874525826931*G0_0_0_2_0 + 0.000693239740858905*G0_0_0_2_1 + 0.0621689421689525*G0_0_0_2_2 - 0.00310990596704928*G0_0_0_2_3 + 0.00163201877487626*G0_0_0_2_5 + 0.0131956931956952*G0_0_0_2_6 - 0.000807129378558083*G0_0_0_2_7 + 0.00209282780711389*G0_0_0_2_8 - 0.00577708006279536*G0_0_0_2_9 + 0.000431631860203388*G0_0_0_3_0 - 0.000621600621600653*G0_0_0_3_1 - 0.00310990596704928*G0_0_0_3_2 + 0.0195804195804233*G0_0_0_3_3 + 0.0209932924218674*G0_0_0_3_4 + 0.00262023690595157*G0_0_0_3_5 + 0.0113800485229075*G0_0_0_3_6 - 0.00150421007563895*G0_0_0_3_7 + 0.00799200799200942*G0_0_0_3_8 - 0.00558298844013224*G0_0_0_3_9 - 0.00088324374038676*G0_0_0_4_0 - 0.00343878343878407*G0_0_0_4_1 + 0.0209932924218674*G0_0_0_4_3 - 0.0694562580276983*G0_0_0_4_4 + 0.00244041672613144*G0_0_0_4_5 - 0.0138204652490389*G0_0_0_4_6 + 0.00264021692593165*G0_0_0_4_7 - 0.00648779791637047*G0_0_0_4_8 + 0.0124504067361232*G0_0_0_4_9 + 0.0182021153449756*G0_0_0_5_0 - 0.00210868496582817*G0_0_0_5_1 + 0.00163201877487626*G0_0_0_5_2 + 0.00262023690595157*G0_0_0_5_3 + 0.00244041672613144*G0_0_0_5_4 - 0.0686285143428114*G0_0_0_5_5 - 0.0379991437134357*G0_0_0_5_6 - 0.00832881404310112*G0_0_0_5_7 + 0.00611674040245568*G0_0_0_5_8 - 0.0222291993720602*G0_0_0_5_9 - 0.00174841031983928*G0_0_0_6_0 - 0.00386312100597879*G0_0_0_6_1 + 0.0131956931956952*G0_0_0_6_2 + 0.0113800485229075*G0_0_0_6_3 - 0.0138204652490389*G0_0_0_6_4 - 0.0379991437134357*G0_0_0_6_5 - 0.263022691594164*G0_0_0_6_6 + 0.00221207364064541*G0_0_0_6_7 + 0.00276009704581171*G0_0_0_6_8 - 0.00542885685742883*G0_0_0_6_9 + 0.00154702440416753*G0_0_0_7_0 - 0.00177822177822213*G0_0_0_7_1 - 0.000807129378558083*G0_0_0_7_2 - 0.00150421007563895*G0_0_0_7_3 + 0.00264021692593165*G0_0_0_7_4 - 0.00832881404310112*G0_0_0_7_5 + 0.00221207364064541*G0_0_0_7_6 - 0.0206878835450299*G0_0_0_7_7 + 0.00637933495076458*G0_0_0_7_8 - 0.0144198658484397*G0_0_0_7_9 - 0.00146805575377029*G0_0_0_8_0 - 0.00073260073260076*G0_0_0_8_1 + 0.00209282780711389*G0_0_0_8_2 + 0.00799200799200942*G0_0_0_8_3 - 0.00648779791637047*G0_0_0_8_4 + 0.00611674040245569*G0_0_0_8_5 + 0.00276009704581171*G0_0_0_8_6 + 0.00637933495076458*G0_0_0_8_7 + 0.0179820179820209*G0_0_0_8_8 + 0.00438418724133079*G0_0_0_8_9 + 0.00333190618904962*G0_0_0_9_0 + 0.00286380286380339*G0_0_0_9_1 - 0.00577708006279536*G0_0_0_9_2 - 0.00558298844013224*G0_0_0_9_3 + 0.0124504067361232*G0_0_0_9_4 - 0.0222291993720602*G0_0_0_9_5 - 0.00542885685742883*G0_0_0_9_6 - 0.0144198658484397*G0_0_0_9_7 + 0.00438418724133079*G0_0_0_9_8 + 0.118373055515933*G0_0_0_9_9 - 0.0530679197345957*G0_1_0_0_0 - 0.000192611621183089*G0_1_0_0_1 - 0.0016611959469105*G0_1_0_0_3 + 0.00500642214928011*G0_1_0_0_5 - 0.00338042909471538*G0_1_0_0_6 + 0.00151150436864734*G0_1_0_0_7 + 0.00164185021327911*G0_1_0_0_8 + 0.00910898625184492*G0_1_0_0_9 - 0.000192611621183089*G0_1_0_1_0 + 0.000192611621183084*G0_1_0_1_2 + 0.000111000111000223*G0_1_0_1_3 - 0.00166056166056199*G0_1_0_1_4 + 0.00175443604015058*G0_1_0_1_5 - 0.00175443604015061*G0_1_0_1_6 + 0.00166056166056186*G0_1_0_1_7 - 0.000111000111000016*G0_1_0_1_8 + 0.000192611621183084*G0_1_0_2_1 + 0.0530679197345952*G0_1_0_2_2 - 0.00164185021327902*G0_1_0_2_3 - 0.00151150436864756*G0_1_0_2_4 + 0.00338042909471544*G0_1_0_2_5 - 0.00500642214928026*G0_1_0_2_6 + 0.00166119594691051*G0_1_0_2_8 - 0.00910898625184496*G0_1_0_2_9 - 0.0016611959469105*G0_1_0_3_0 + 0.000111000111000222*G0_1_0_3_1 - 0.00164185021327902*G0_1_0_3_2 + 0.00159840159840197*G0_1_0_3_3 + 0.0146139574711028*G0_1_0_3_4 - 0.000139860139860068*G0_1_0_3_5 + 0.00526330812045177*G0_1_0_3_6 + 0.00498358784073156*G0_1_0_3_7 - 0.00996717568146318*G0_1_0_3_9 - 0.00166056166056199*G0_1_0_4_1 - 0.00151150436864756*G0_1_0_4_2 + 0.0146139574711028*G0_1_0_4_3 - 0.0487683744826684*G0_1_0_4_4 + 0.00022834308548595*G0_1_0_4_5 - 0.00549165120593776*G0_1_0_4_6 - 0.00498358784073152*G0_1_0_4_8 + 0.026870272584563*G0_1_0_4_9 + 0.0050064221492801*G0_1_0_5_0 + 0.00175443604015058*G0_1_0_5_1 + 0.00338042909471544*G0_1_0_5_2 - 0.000139860139860068*G0_1_0_5_3 + 0.00022834308548595*G0_1_0_5_4 + 0.194394177251352*G0_1_0_5_5 + 0.00549165120593767*G0_1_0_5_7 - 0.00526330812045175*G0_1_0_5_8 - 0.0168003425146312*G0_1_0_5_9 - 0.00338042909471538*G0_1_0_6_0 - 0.00175443604015061*G0_1_0_6_1 - 0.00500642214928025*G0_1_0_6_2 + 0.00526330812045177*G0_1_0_6_3 - 0.00549165120593777*G0_1_0_6_4 - 0.194394177251353*G0_1_0_6_6 - 0.000228343085485962*G0_1_0_6_7 + 0.000139860139860097*G0_1_0_6_8 + 0.0168003425146314*G0_1_0_6_9 + 0.00151150436864734*G0_1_0_7_0 + 0.00166056166056186*G0_1_0_7_1 + 0.00498358784073155*G0_1_0_7_3 + 0.00549165120593767*G0_1_0_7_5 - 0.000228343085485963*G0_1_0_7_6 + 0.0487683744826681*G0_1_0_7_7 - 0.0146139574711026*G0_1_0_7_8 - 0.0268702725845629*G0_1_0_7_9 + 0.00164185021327911*G0_1_0_8_0 - 0.000111000111000016*G0_1_0_8_1 + 0.00166119594691051*G0_1_0_8_2 - 0.00498358784073152*G0_1_0_8_4 - 0.00526330812045175*G0_1_0_8_5 + 0.000139860139860097*G0_1_0_8_6 - 0.0146139574711026*G0_1_0_8_7 - 0.00159840159840215*G0_1_0_8_8 + 0.00996717568146298*G0_1_0_8_9 + 0.00910898625184492*G0_1_0_9_0 - 0.00910898625184496*G0_1_0_9_2 - 0.00996717568146318*G0_1_0_9_3 + 0.026870272584563*G0_1_0_9_4 - 0.0168003425146312*G0_1_0_9_5 + 0.0168003425146314*G0_1_0_9_6 - 0.0268702725845629*G0_1_0_9_7 + 0.00996717568146298*G0_1_0_9_8; + A[139] = A[116] - 0.00524117857451276*G0_0_0_0_0 - 0.000615116805593109*G0_0_0_0_2 - 0.00120450977593855*G0_0_0_0_3 - 0.000445269016697672*G0_0_0_0_4 - 0.0103991246848407*G0_0_0_0_5 + 0.000744017886875171*G0_0_0_0_6 - 0.00103388674817259*G0_0_0_0_7 - 0.000864532293103884*G0_0_0_0_8 + 0.000422434708149081*G0_0_0_0_9 + 0.00524117857451238*G0_0_0_1_1 + 0.000615116805593087*G0_0_0_1_2 + 0.0103991246848407*G0_0_0_1_3 - 0.000744017886875137*G0_0_0_1_4 + 0.00120450977593855*G0_0_0_1_5 + 0.000445269016697652*G0_0_0_1_6 + 0.000864532293103927*G0_0_0_1_7 + 0.00103388674817252*G0_0_0_1_8 - 0.000422434708149068*G0_0_0_1_9 - 0.000615116805593109*G0_0_0_2_0 + 0.000615116805593087*G0_0_0_2_1 + 0.00182928182928218*G0_0_0_2_3 + 0.00449328449328519*G0_0_0_2_4 - 0.0018292818292821*G0_0_0_2_5 - 0.00449328449328531*G0_0_0_2_6 + 0.00276295133438036*G0_0_0_2_7 - 0.00276295133438037*G0_0_0_2_8 - 0.00120450977593855*G0_0_0_3_0 + 0.0103991246848407*G0_0_0_3_1 + 0.00182928182928218*G0_0_0_3_2 - 0.0371970886256659*G0_0_0_3_3 - 0.0231197374054556*G0_0_0_3_4 - 0.00133580705009293*G0_0_0_3_6 + 0.00361352932781563*G0_0_0_3_7 - 0.0119023833309567*G0_0_0_3_8 - 0.00595975453118405*G0_0_0_3_9 - 0.000445269016697673*G0_0_0_4_0 - 0.000744017886875137*G0_0_0_4_1 + 0.00449328449328519*G0_0_0_4_2 - 0.0231197374054556*G0_0_0_4_3 - 0.0762437562437691*G0_0_0_4_4 + 0.00133580705009298*G0_0_0_4_5 - 0.00347652347652405*G0_0_0_4_7 + 0.00828885400314111*G0_0_0_4_8 - 0.00267161410018595*G0_0_0_4_9 - 0.0103991246848407*G0_0_0_5_0 + 0.00120450977593855*G0_0_0_5_1 - 0.00182928182928211*G0_0_0_5_2 + 0.00133580705009298*G0_0_0_5_4 + 0.0371970886256662*G0_0_0_5_5 + 0.0231197374054556*G0_0_0_5_6 + 0.0119023833309567*G0_0_0_5_7 - 0.00361352932781564*G0_0_0_5_8 + 0.00595975453118402*G0_0_0_5_9 + 0.00074401788687517*G0_0_0_6_0 + 0.000445269016697652*G0_0_0_6_1 - 0.00449328449328531*G0_0_0_6_2 - 0.00133580705009292*G0_0_0_6_3 + 0.0231197374054556*G0_0_0_6_5 + 0.0762437562437688*G0_0_0_6_6 - 0.00828885400314108*G0_0_0_6_7 + 0.00347652347652409*G0_0_0_6_8 + 0.0026716141001859*G0_0_0_6_9 - 0.00103388674817259*G0_0_0_7_0 + 0.000864532293103927*G0_0_0_7_1 + 0.00276295133438036*G0_0_0_7_2 + 0.00361352932781563*G0_0_0_7_3 - 0.00347652347652405*G0_0_0_7_4 + 0.0119023833309567*G0_0_0_7_5 - 0.00828885400314108*G0_0_0_7_6 + 0.0320251177394086*G0_0_0_7_7 + 0.0153104038818349*G0_0_0_7_9 - 0.000864532293103884*G0_0_0_8_0 + 0.00103388674817253*G0_0_0_8_1 - 0.00276295133438037*G0_0_0_8_2 - 0.0119023833309567*G0_0_0_8_3 + 0.00828885400314111*G0_0_0_8_4 - 0.00361352932781564*G0_0_0_8_5 + 0.00347652347652409*G0_0_0_8_6 - 0.0320251177394087*G0_0_0_8_8 - 0.015310403881835*G0_0_0_8_9 + 0.000422434708149082*G0_0_0_9_0 - 0.000422434708149068*G0_0_0_9_1 - 0.00595975453118406*G0_0_0_9_3 - 0.00267161410018595*G0_0_0_9_4 + 0.00595975453118403*G0_0_0_9_5 + 0.0026716141001859*G0_0_0_9_6 + 0.0153104038818349*G0_0_0_9_7 - 0.015310403881835*G0_0_0_9_8 + 0.00293434960101692*G0_0_1_0_0 + 0.000810089381518085*G0_0_1_0_1 + 0.000255018350256492*G0_0_1_0_2 - 0.0024163138448857*G0_0_1_0_3 - 0.000749409320838024*G0_0_1_0_4 + 0.00148232719661318*G0_0_1_0_5 - 0.00102278673707265*G0_0_1_0_6 + 0.00129711558283016*G0_0_1_0_7 - 0.00446949875521385*G0_0_1_0_8 + 0.00363636363636425*G0_0_1_0_9 + 0.000810089381518085*G0_0_1_1_0 + 0.0569415769415864*G0_0_1_1_1 + 0.00107085154704219*G0_0_1_1_2 + 0.00816960816960952*G0_0_1_1_3 - 0.00103832675261262*G0_0_1_1_4 + 0.000508380508380583*G0_0_1_1_5 - 0.00112046683475273*G0_0_1_1_6 - 0.00261896833325442*G0_0_1_1_7 - 0.000444000444000679*G0_0_1_1_8 - 0.00622615479758442*G0_0_1_1_9 + 0.000255018350256491*G0_0_1_2_0 + 0.00107085154704219*G0_0_1_2_1 + 0.0038203771537111*G0_0_1_2_2 - 0.0019640676783537*G0_0_1_2_3 + 0.00835418549704402*G0_0_1_2_4 - 0.000174111602683059*G0_0_1_2_5 + 0.00141382427096734*G0_0_1_2_6 + 0.00079951794237522*G0_0_1_2_7 - 0.00116042687471279*G0_0_1_2_8 + 0.00250225964511719*G0_0_1_2_9 - 0.0024163138448857*G0_0_1_3_0 + 0.00816960816960952*G0_0_1_3_1 - 0.0019640676783537*G0_0_1_3_2 - 0.172199229342116*G0_0_1_3_3 - 0.0109861567004443*G0_0_1_3_4 + 0.00284001712573184*G0_0_1_3_5 + 0.00340516626230967*G0_0_1_3_6 + 0.00729270729270853*G0_0_1_3_7 - 0.0108177536748984*G0_0_1_3_8 + 0.00409304980733612*G0_0_1_3_9 - 0.000749409320838024*G0_0_1_4_0 - 0.00103832675261262*G0_0_1_4_1 + 0.00835418549704402*G0_0_1_4_2 - 0.0109861567004443*G0_0_1_4_3 - 0.0334979306407935*G0_0_1_4_4 + 0.00229199372056554*G0_0_1_4_5 - 0.00569715998287522*G0_0_1_4_6 + 0.00352504638218987*G0_0_1_4_8 - 0.0120907663764827*G0_0_1_4_9 + 0.00148232719661318*G0_0_1_5_0 + 0.000508380508380583*G0_0_1_5_1 - 0.000174111602683059*G0_0_1_5_2 + 0.00284001712573184*G0_0_1_5_3 + 0.00229199372056554*G0_0_1_5_4 - 0.00248893963179724*G0_0_1_5_5 + 0.000208363065505993*G0_0_1_5_6 + 0.00383616383616449*G0_0_1_5_7 - 0.00148137576709031*G0_0_1_5_8 - 0.00794633937491214*G0_0_1_5_9 - 0.00102278673707265*G0_0_1_6_0 - 0.00112046683475273*G0_0_1_6_1 + 0.00141382427096734*G0_0_1_6_2 + 0.00340516626230967*G0_0_1_6_3 - 0.00569715998287522*G0_0_1_6_4 + 0.000208363065505993*G0_0_1_6_5 - 0.020162694448412*G0_0_1_6_6 - 0.00235478806907417*G0_0_1_6_7 + 0.00339945768517254*G0_0_1_6_8 - 0.0143171114599709*G0_0_1_6_9 + 0.00129711558283016*G0_0_1_7_0 - 0.00261896833325441*G0_0_1_7_1 + 0.00079951794237522*G0_0_1_7_2 + 0.00729270729270853*G0_0_1_7_3 + 0.00383616383616449*G0_0_1_7_5 - 0.00235478806907417*G0_0_1_7_6 + 0.0179934351362951*G0_0_1_7_7 + 0.0205708577137184*G0_0_1_7_8 - 0.0061995147709444*G0_0_1_7_9 - 0.00446949875521385*G0_0_1_8_0 - 0.000444000444000683*G0_0_1_8_1 - 0.00116042687471279*G0_0_1_8_2 - 0.0108177536748984*G0_0_1_8_3 + 0.00352504638218987*G0_0_1_8_4 - 0.00148137576709031*G0_0_1_8_5 + 0.00339945768517254*G0_0_1_8_6 + 0.0205708577137184*G0_0_1_8_7 - 0.0654260025688713*G0_0_1_8_8 + 0.0116283716283735*G0_0_1_8_9 + 0.00363636363636425*G0_0_1_9_0 - 0.00622615479758442*G0_0_1_9_1 + 0.00250225964511719*G0_0_1_9_2 + 0.00409304980733613*G0_0_1_9_3 - 0.0120907663764827*G0_0_1_9_4 - 0.00794633937491214*G0_0_1_9_5 - 0.0143171114599709*G0_0_1_9_6 - 0.0061995147709444*G0_0_1_9_7 + 0.0116283716283735*G0_0_1_9_8 + 0.063707720850589*G0_0_1_9_9 + 0.051700398367074*G0_1_0_0_0 + 0.000810089381518085*G0_1_0_0_1 + 0.0004557347414491*G0_1_0_0_2 - 0.000696129267557975*G0_1_0_0_3 - 0.00156573585145043*G0_1_0_0_4 - 0.00222951651523116*G0_1_0_0_5 - 0.000294308865737509*G0_1_0_0_6 - 0.00147788719217312*G0_1_0_0_7 - 0.00348350062635837*G0_1_0_0_8 - 0.00580372008943533*G0_1_0_0_9 + 0.000810089381518085*G0_1_0_1_0 + 0.0081755281755291*G0_1_0_1_1 + 0.00087013515584957*G0_1_0_1_2 + 0.0118814518814538*G0_1_0_1_3 - 0.00176680462394774*G0_1_0_1_4 - 0.00121180406894711*G0_1_0_1_5 - 0.000304140304140366*G0_1_0_1_6 - 0.00360496646210986*G0_1_0_1_7 + 0.00233100233100259*G0_1_0_1_8 + 0.00321392892821518*G0_1_0_1_9 + 0.0004557347414491*G0_1_0_2_0 + 0.00087013515584957*G0_1_0_2_1 + 0.003820377153711*G0_1_0_2_2 + 0.00165517022659912*G0_1_0_2_3 + 0.00590710876425256*G0_1_0_2_4 - 0.00379334950763584*G0_1_0_2_5 + 0.00386090100375873*G0_1_0_2_6 + 0.00160252445966758*G0_1_0_2_7 - 0.00196343339200514*G0_1_0_2_8 + 0.00250225964511721*G0_1_0_2_9 - 0.000696129267557975*G0_1_0_3_0 + 0.0118814518814538*G0_1_0_3_1 + 0.00165517022659912*G0_1_0_3_2 - 0.0396860282574634*G0_1_0_3_3 - 0.0229113743399497*G0_1_0_3_4 + 0.00284001712573182*G0_1_0_3_5 + 0.000956186670472593*G0_1_0_3_6 + 0.00213215356072534*G0_1_0_3_7 - 0.00806621949479224*G0_1_0_3_8 - 0.0139060939060962*G0_1_0_3_9 - 0.00156573585145043*G0_1_0_4_0 - 0.00176680462394774*G0_1_0_4_1 + 0.00590710876425256*G0_1_0_4_2 - 0.0229113743399497*G0_1_0_4_3 - 0.0964064506921817*G0_1_0_4_4 + 0.00474097331240274*G0_1_0_4_5 - 0.00569715998287533*G0_1_0_4_6 + 0.00593406593406692*G0_1_0_4_8 - 0.0169887255601571*G0_1_0_4_9 - 0.00222951651523116*G0_1_0_5_0 - 0.00121180406894711*G0_1_0_5_1 - 0.00379334950763584*G0_1_0_5_2 + 0.00284001712573182*G0_1_0_5_3 + 0.00474097331240274*G0_1_0_5_4 - 0.135002140716449*G0_1_0_5_5 + 0.0121335807050114*G0_1_0_5_6 + 0.00108462965605844*G0_1_0_5_7 + 0.00367917796489282*G0_1_0_5_8 + 0.0100528043385204*G0_1_0_5_9 - 0.000294308865737509*G0_1_0_6_0 - 0.000304140304140366*G0_1_0_6_1 + 0.00386090100375873*G0_1_0_6_2 + 0.000956186670472593*G0_1_0_6_3 - 0.00569715998287533*G0_1_0_6_4 + 0.0121335807050114*G0_1_0_6_5 + 0.0427458256029754*G0_1_0_6_6 - 0.00476380762095124*G0_1_0_6_7 + 0.00337947766519253*G0_1_0_6_8 - 0.0094191522762968*G0_1_0_6_9 - 0.00147788719217312*G0_1_0_7_0 - 0.00360496646210986*G0_1_0_7_1 + 0.00160252445966758*G0_1_0_7_2 + 0.00213215356072534*G0_1_0_7_3 + 0.00108462965605844*G0_1_0_7_5 - 0.00476380762095124*G0_1_0_7_6 - 0.0334008848294623*G0_1_0_7_7 + 0.0205708577137183*G0_1_0_7_8 + 0.0269387755102085*G0_1_0_7_9 - 0.00348350062635837*G0_1_0_8_0 + 0.00233100233100259*G0_1_0_8_1 - 0.00196343339200514*G0_1_0_8_2 - 0.00806621949479224*G0_1_0_8_3 + 0.00593406593406692*G0_1_0_8_4 + 0.00367917796489282*G0_1_0_8_5 + 0.00337947766519253*G0_1_0_8_6 + 0.0205708577137183*G0_1_0_8_7 - 0.0140316826031133*G0_1_0_8_8 - 0.0215099186527794*G0_1_0_8_9 - 0.00580372008943533*G0_1_0_9_0 + 0.00321392892821518*G0_1_0_9_1 + 0.00250225964511721*G0_1_0_9_2 - 0.0139060939060962*G0_1_0_9_3 - 0.0169887255601571*G0_1_0_9_4 + 0.0100528043385204*G0_1_0_9_5 - 0.0094191522762968*G0_1_0_9_6 + 0.0269387755102085*G0_1_0_9_7 - 0.0215099186527794*G0_1_0_9_8 + 0.0637077208505888*G0_1_0_9_9 - 0.00469653802987235*G0_1_1_0_0 + 0.000810089381518067*G0_1_1_0_1 - 0.00343814915243549*G0_1_1_0_3 - 0.000943500943501107*G0_1_1_0_4 - 0.00168783597355058*G0_1_1_0_5 - 0.00725433296862001*G0_1_1_0_7 + 0.000393891822463309*G0_1_1_0_9 + 0.000810089381518068*G0_1_1_1_0 + 0.0645724645724752*G0_1_1_1_1 + 0.0013388727674444*G0_1_1_1_2 + 0.0113397713397732*G0_1_1_1_3 - 0.00210012210012238*G0_1_1_1_4 + 0.00153021581593034*G0_1_1_1_5 - 0.000926375212089638*G0_1_1_1_6 - 0.00703740703740816*G0_1_1_1_7 + 0.0081074481074493*G0_1_1_1_8 - 0.0029836829836835*G0_1_1_1_9 + 0.0013388727674444*G0_1_1_2_1 + 0.00382037715371111*G0_1_1_2_2 - 0.00209599923885673*G0_1_1_2_3 + 0.00883687740830748*G0_1_1_2_4 + 0.000931132359703938*G0_1_1_2_6 + 0.000514089085517739*G0_1_1_2_7 - 0.000874998017855321*G0_1_1_2_8 + 0.0025022596451172*G0_1_1_2_9 - 0.00343814915243549*G0_1_1_3_0 + 0.0113397713397732*G0_1_1_3_1 - 0.00209599923885673*G0_1_1_3_2 - 0.193766233766267*G0_1_1_3_3 - 0.0110603682032273*G0_1_1_3_4 + 0.00284001712573189*G0_1_1_3_5 + 0.00282289139432042*G0_1_1_3_6 + 0.0103582132153579*G0_1_1_3_7 - 0.0130269730269753*G0_1_1_3_8 - 0.0117653774796654*G0_1_1_3_9 - 0.000943500943501107*G0_1_1_4_0 - 0.00210012210012238*G0_1_1_4_1 + 0.00883687740830747*G0_1_1_4_2 - 0.0110603682032273*G0_1_1_4_3 - 0.0373569287855067*G0_1_1_4_4 + 0.00287426858855479*G0_1_1_4_5 - 0.00569715998287522*G0_1_1_4_6 + 0.000622234907949296*G0_1_1_4_7 + 0.00266875981161746*G0_1_1_4_8 - 0.0132553161124612*G0_1_1_4_9 - 0.00168783597355058*G0_1_1_5_0 + 0.00153021581593034*G0_1_1_5_1 + 0.00284001712573189*G0_1_1_5_3 + 0.00287426858855479*G0_1_1_5_4 + 0.0190780647923538*G0_1_1_5_5 + 0.000282574568288881*G0_1_1_5_6 + 0.0060453831882413*G0_1_1_5_7 - 0.00454688168973958*G0_1_1_5_8 + 0.00791208791208921*G0_1_1_5_9 - 0.000926375212089638*G0_1_1_6_1 + 0.000931132359703938*G0_1_1_6_2 + 0.00282289139432042*G0_1_1_6_3 - 0.00569715998287522*G0_1_1_6_4 + 0.000282574568288881*G0_1_1_6_5 - 0.016303696303699*G0_1_1_6_6 - 0.00149850149850172*G0_1_1_6_7 + 0.0026801769658917*G0_1_1_6_8 - 0.0131525617239924*G0_1_1_6_9 - 0.00725433296862001*G0_1_1_7_0 - 0.00703740703740816*G0_1_1_7_1 + 0.000514089085517739*G0_1_1_7_2 + 0.0103582132153579*G0_1_1_7_3 + 0.000622234907949297*G0_1_1_7_4 + 0.0060453831882413*G0_1_1_7_5 - 0.00149850149850172*G0_1_1_7_6 + 0.0132667332667349*G0_1_1_7_7 + 0.0205708577137186*G0_1_1_7_8 + 0.00181532752961351*G0_1_1_7_9 + 0.0081074481074493*G0_1_1_8_1 - 0.00087499801785532*G0_1_1_8_2 - 0.0130269730269753*G0_1_1_8_3 + 0.00266875981161746*G0_1_1_8_4 - 0.00454688168973958*G0_1_1_8_5 + 0.00268017696589169*G0_1_1_8_6 + 0.0205708577137186*G0_1_1_8_7 - 0.0606993006993115*G0_1_1_8_8 + 0.00361352932781555*G0_1_1_8_9 + 0.000393891822463309*G0_1_1_9_0 - 0.0029836829836835*G0_1_1_9_1 + 0.0025022596451172*G0_1_1_9_2 - 0.0117653774796654*G0_1_1_9_3 - 0.0132553161124612*G0_1_1_9_4 + 0.00791208791208921*G0_1_1_9_5 - 0.0131525617239924*G0_1_1_9_6 + 0.00181532752961351*G0_1_1_9_7 + 0.00361352932781555*G0_1_1_9_8 + 0.0637077208505888*G0_1_1_9_9; + A[55] = A[153] + 0.00312773646107042*G0_0_1_0_0 - 0.00337514337514401*G0_0_1_0_1 + 0.000380466094751875*G0_0_1_0_2 + 0.00544249401392349*G0_0_1_0_3 - 0.000659974945689325*G0_0_1_0_4 + 0.00179185893471643*G0_0_1_0_5 - 0.00121180406894715*G0_0_1_0_6 - 0.00236017950303701*G0_0_1_0_7 + 0.0072559186844913*G0_0_1_0_8 + 0.00183245326102499*G0_0_1_0_9 - 0.00337514337514401*G0_0_1_1_0 - 0.195838729172097*G0_0_1_1_1 - 0.00578458578458678*G0_0_1_1_2 - 0.0608724608724714*G0_0_1_1_3 + 0.0265734265734312*G0_0_1_1_4 + 0.000255300255300364*G0_0_1_1_5 - 0.000597180597180708*G0_0_1_1_6 + 0.014407814407817*G0_0_1_1_7 - 0.0192252192252229*G0_0_1_1_8 + 0.00293040293040336*G0_0_1_1_9 + 0.000380466094751875*G0_0_1_2_0 - 0.00578458578458678*G0_0_1_2_1 - 0.000523497666354896*G0_0_1_2_2 - 0.00084708941851817*G0_0_1_2_3 + 0.000148740148740175*G0_0_1_2_5 - 0.000874998017855288*G0_0_1_2_7 + 0.00168625025767907*G0_0_1_2_8 - 0.00141382427096738*G0_0_1_2_9 + 0.00544249401392349*G0_0_1_3_0 - 0.0608724608724714*G0_0_1_3_1 - 0.000847089418518167*G0_0_1_3_2 + 0.142497502497527*G0_0_1_3_3 + 0.0051748251748262*G0_0_1_3_4 - 0.00770943342372038*G0_0_1_3_5 + 0.000117025831311574*G0_0_1_3_6 - 0.0180019980020009*G0_0_1_3_7 + 0.0247352647352686*G0_0_1_3_8 + 0.0272127872127917*G0_0_1_3_9 - 0.000659974945689325*G0_0_1_4_0 + 0.0265734265734312*G0_0_1_4_1 + 0.0051748251748262*G0_0_1_4_3 + 0.00389895818467306*G0_0_1_4_4 + 0.000305408876837481*G0_0_1_4_5 - 0.000422434708149065*G0_0_1_4_6 + 0.00313971742543217*G0_0_1_4_7 - 0.00673326673326772*G0_0_1_4_8 + 0.00363065505922715*G0_0_1_4_9 + 0.00179185893471643*G0_0_1_5_0 + 0.000255300255300364*G0_0_1_5_1 + 0.000148740148740175*G0_0_1_5_2 - 0.00770943342372038*G0_0_1_5_3 + 0.000305408876837481*G0_0_1_5_4 + 0.0107835022120756*G0_0_1_5_5 - 0.000545169116597808*G0_0_1_5_6 + 0.00148993863279603*G0_0_1_5_7 - 0.00244041672613142*G0_0_1_5_8 - 0.0006165263308121*G0_0_1_5_9 - 0.00121180406894715*G0_0_1_6_0 - 0.000597180597180708*G0_0_1_6_1 + 0.000117025831311573*G0_0_1_6_3 - 0.000422434708149065*G0_0_1_6_4 - 0.000545169116597808*G0_0_1_6_5 + 0.00307692307692378*G0_0_1_6_6 + 0.000950478093335374*G0_0_1_6_7 - 0.000796346510632314*G0_0_1_6_8 + 0.00400742115027897*G0_0_1_6_9 - 0.00236017950303701*G0_0_1_7_0 + 0.0144078144078171*G0_0_1_7_1 - 0.000874998017855288*G0_0_1_7_2 - 0.0180019980020009*G0_0_1_7_3 + 0.00313971742543217*G0_0_1_7_4 + 0.00148993863279603*G0_0_1_7_5 + 0.000950478093335374*G0_0_1_7_6 + 0.0133295276152441*G0_0_1_7_7 - 0.0355044955045013*G0_0_1_7_8 - 0.0073983159697457*G0_0_1_7_9 + 0.0072559186844913*G0_0_1_8_0 - 0.0192252192252229*G0_0_1_8_1 + 0.00168625025767907*G0_0_1_8_2 + 0.0247352647352686*G0_0_1_8_3 - 0.00673326673326772*G0_0_1_8_4 - 0.00244041672613142*G0_0_1_8_5 - 0.000796346510632316*G0_0_1_8_6 - 0.0355044955045013*G0_0_1_8_7 + 0.133706293706316*G0_0_1_8_8 + 0.00467532467532535*G0_0_1_8_9 + 0.00183245326102499*G0_0_1_9_0 + 0.00293040293040336*G0_0_1_9_1 - 0.00141382427096738*G0_0_1_9_2 + 0.0272127872127917*G0_0_1_9_3 + 0.00363065505922715*G0_0_1_9_4 - 0.000616526330812099*G0_0_1_9_5 + 0.00400742115027897*G0_0_1_9_6 - 0.0073983159697457*G0_0_1_9_7 + 0.00467532467532535*G0_0_1_9_8 - 0.0355530184101673*G0_0_1_9_9 - 0.00312773646107042*G0_1_0_0_0 + 0.00337514337514401*G0_1_0_0_1 - 0.000380466094751875*G0_1_0_0_2 - 0.00544249401392349*G0_1_0_0_3 + 0.000659974945689325*G0_1_0_0_4 - 0.00179185893471643*G0_1_0_0_5 + 0.00121180406894715*G0_1_0_0_6 + 0.00236017950303701*G0_1_0_0_7 - 0.0072559186844913*G0_1_0_0_8 - 0.00183245326102499*G0_1_0_0_9 + 0.00337514337514401*G0_1_0_1_0 + 0.195838729172097*G0_1_0_1_1 + 0.00578458578458678*G0_1_0_1_2 + 0.0608724608724714*G0_1_0_1_3 - 0.0265734265734312*G0_1_0_1_4 - 0.000255300255300364*G0_1_0_1_5 + 0.000597180597180708*G0_1_0_1_6 - 0.014407814407817*G0_1_0_1_7 + 0.0192252192252229*G0_1_0_1_8 - 0.00293040293040336*G0_1_0_1_9 - 0.000380466094751875*G0_1_0_2_0 + 0.00578458578458678*G0_1_0_2_1 + 0.000523497666354896*G0_1_0_2_2 + 0.00084708941851817*G0_1_0_2_3 - 0.000148740148740175*G0_1_0_2_5 + 0.000874998017855289*G0_1_0_2_7 - 0.00168625025767907*G0_1_0_2_8 + 0.00141382427096738*G0_1_0_2_9 - 0.00544249401392349*G0_1_0_3_0 + 0.0608724608724714*G0_1_0_3_1 + 0.000847089418518167*G0_1_0_3_2 - 0.142497502497527*G0_1_0_3_3 - 0.0051748251748262*G0_1_0_3_4 + 0.00770943342372038*G0_1_0_3_5 - 0.000117025831311574*G0_1_0_3_6 + 0.0180019980020009*G0_1_0_3_7 - 0.0247352647352686*G0_1_0_3_8 - 0.0272127872127917*G0_1_0_3_9 + 0.000659974945689325*G0_1_0_4_0 - 0.0265734265734312*G0_1_0_4_1 - 0.0051748251748262*G0_1_0_4_3 - 0.00389895818467306*G0_1_0_4_4 - 0.000305408876837481*G0_1_0_4_5 + 0.000422434708149066*G0_1_0_4_6 - 0.00313971742543217*G0_1_0_4_7 + 0.00673326673326771*G0_1_0_4_8 - 0.00363065505922716*G0_1_0_4_9 - 0.00179185893471643*G0_1_0_5_0 - 0.000255300255300364*G0_1_0_5_1 - 0.000148740148740175*G0_1_0_5_2 + 0.00770943342372038*G0_1_0_5_3 - 0.000305408876837481*G0_1_0_5_4 - 0.0107835022120756*G0_1_0_5_5 + 0.000545169116597807*G0_1_0_5_6 - 0.00148993863279603*G0_1_0_5_7 + 0.00244041672613142*G0_1_0_5_8 + 0.000616526330812101*G0_1_0_5_9 + 0.00121180406894715*G0_1_0_6_0 + 0.000597180597180708*G0_1_0_6_1 - 0.000117025831311573*G0_1_0_6_3 + 0.000422434708149066*G0_1_0_6_4 + 0.000545169116597807*G0_1_0_6_5 - 0.00307692307692378*G0_1_0_6_6 - 0.000950478093335374*G0_1_0_6_7 + 0.000796346510632314*G0_1_0_6_8 - 0.00400742115027897*G0_1_0_6_9 + 0.00236017950303701*G0_1_0_7_0 - 0.014407814407817*G0_1_0_7_1 + 0.000874998017855289*G0_1_0_7_2 + 0.0180019980020009*G0_1_0_7_3 - 0.00313971742543217*G0_1_0_7_4 - 0.00148993863279603*G0_1_0_7_5 - 0.000950478093335374*G0_1_0_7_6 - 0.0133295276152441*G0_1_0_7_7 + 0.0355044955045013*G0_1_0_7_8 + 0.0073983159697457*G0_1_0_7_9 - 0.0072559186844913*G0_1_0_8_0 + 0.0192252192252229*G0_1_0_8_1 - 0.00168625025767907*G0_1_0_8_2 - 0.0247352647352686*G0_1_0_8_3 + 0.00673326673326772*G0_1_0_8_4 + 0.00244041672613142*G0_1_0_8_5 + 0.000796346510632316*G0_1_0_8_6 + 0.0355044955045013*G0_1_0_8_7 - 0.133706293706316*G0_1_0_8_8 - 0.00467532467532533*G0_1_0_8_9 - 0.00183245326102499*G0_1_0_9_0 - 0.00293040293040336*G0_1_0_9_1 + 0.00141382427096738*G0_1_0_9_2 - 0.0272127872127917*G0_1_0_9_3 - 0.00363065505922716*G0_1_0_9_4 + 0.0006165263308121*G0_1_0_9_5 - 0.00400742115027897*G0_1_0_9_6 + 0.0073983159697457*G0_1_0_9_7 - 0.00467532467532533*G0_1_0_9_8 + 0.0355530184101673*G0_1_0_9_9; + A[175] = -A[55] - 0.0925010791677621*G0_0_0_0_0 - 0.00776556776556914*G0_0_0_0_1 - 0.00738964738964867*G0_0_0_0_2 - 0.00668918383204206*G0_0_0_0_3 + 0.00585446299732113*G0_0_0_0_4 - 0.0659359687931231*G0_0_0_0_5 + 0.0316968745540229*G0_0_0_0_6 - 0.0213545184973793*G0_0_0_0_7 - 0.00338296624010963*G0_0_0_0_8 - 0.0110156510156529*G0_0_0_0_9 - 0.00776556776556914*G0_0_0_1_0 - 0.182637115970481*G0_0_0_1_1 - 0.00621304621304726*G0_0_0_1_2 - 0.0535686535686627*G0_0_0_1_3 + 0.0260517260517305*G0_0_0_1_4 - 0.00991452991453152*G0_0_0_1_5 + 0.00236652236652274*G0_0_0_1_6 + 0.0125097125097148*G0_0_0_1_7 - 0.0384060384060452*G0_0_0_1_8 - 0.00126540126540151*G0_0_0_1_9 - 0.00738964738964867*G0_0_0_2_0 - 0.00621304621304726*G0_0_0_2_1 - 0.00290503147646061*G0_0_0_2_2 - 0.0113372341943789*G0_0_0_2_3 + 0.00866562009419294*G0_0_0_2_4 - 0.0138388595531476*G0_0_0_2_5 + 0.0128544471401636*G0_0_0_2_6 - 0.00518211946783463*G0_0_0_2_7 - 0.0199159570588175*G0_0_0_2_8 - 0.0243870415299028*G0_0_0_2_9 - 0.00668918383204206*G0_0_0_3_0 - 0.0535686535686627*G0_0_0_3_1 - 0.0113372341943789*G0_0_0_3_2 + 0.0455544455544539*G0_0_0_3_3 + 0.0427972027972099*G0_0_0_3_4 + 0.0157385471671212*G0_0_0_3_5 + 0.0112344798059102*G0_0_0_3_6 + 0.0384015984016048*G0_0_0_3_7 - 0.116483516483536*G0_0_0_3_8 - 0.0730069930070051*G0_0_0_3_9 + 0.00585446299732113*G0_0_0_4_0 + 0.0260517260517305*G0_0_0_4_1 + 0.00866562009419294*G0_0_0_4_2 + 0.0427972027972099*G0_0_0_4_3 - 0.0180676466390782*G0_0_0_4_4 + 0.000770657913515212*G0_0_0_4_5 - 0.0120051377194254*G0_0_0_4_6 - 0.010175538746969*G0_0_0_4_7 + 0.0780819180819311*G0_0_0_4_8 + 0.071619808762678*G0_0_0_4_9 - 0.0659359687931231*G0_0_0_5_0 - 0.00991452991453152*G0_0_0_5_1 - 0.0138388595531476*G0_0_0_5_2 + 0.0157385471671212*G0_0_0_5_3 + 0.000770657913515213*G0_0_0_5_4 - 0.276877408306027*G0_0_0_5_5 + 0.0557042957043053*G0_0_0_5_6 - 0.0819580419580557*G0_0_0_5_7 + 0.0480776366490733*G0_0_0_5_8 - 0.0631083202511881*G0_0_0_5_9 + 0.0316968745540229*G0_0_0_6_0 + 0.00236652236652274*G0_0_0_6_1 + 0.0128544471401636*G0_0_0_6_2 + 0.0112344798059102*G0_0_0_6_3 - 0.0120051377194254*G0_0_0_6_4 + 0.0557042957043053*G0_0_0_6_5 - 0.0460054231482881*G0_0_0_6_6 + 0.0338804053089824*G0_0_0_6_7 + 0.0171571285857028*G0_0_0_6_8 + 0.0506921649778878*G0_0_0_6_9 - 0.0213545184973793*G0_0_0_7_0 + 0.0125097125097148*G0_0_0_7_1 - 0.00518211946783463*G0_0_0_7_2 + 0.0384015984016048*G0_0_0_7_3 - 0.010175538746969*G0_0_0_7_4 - 0.0819580419580557*G0_0_0_7_5 + 0.0338804053089824*G0_0_0_7_6 - 0.195450264021725*G0_0_0_7_7 + 0.118241758241778*G0_0_0_7_8 - 0.0347138575710063*G0_0_0_7_9 - 0.00338296624010963*G0_0_0_8_0 - 0.0384060384060451*G0_0_0_8_1 - 0.0199159570588175*G0_0_0_8_2 - 0.116483516483536*G0_0_0_8_3 + 0.0780819180819311*G0_0_0_8_4 + 0.0480776366490733*G0_0_0_8_5 + 0.0171571285857028*G0_0_0_8_6 + 0.118241758241778*G0_0_0_8_7 - 0.422777222777294*G0_0_0_8_8 - 0.152367632367658*G0_0_0_8_9 - 0.0110156510156529*G0_0_0_9_0 - 0.00126540126540151*G0_0_0_9_1 - 0.0243870415299028*G0_0_0_9_2 - 0.0730069930070051*G0_0_0_9_3 + 0.071619808762678*G0_0_0_9_4 - 0.0631083202511881*G0_0_0_9_5 + 0.0506921649778878*G0_0_0_9_6 - 0.0347138575710063*G0_0_0_9_7 - 0.152367632367658*G0_0_0_9_8 - 0.315866990152758*G0_0_0_9_9 + 0.00360133693467082*G0_0_1_0_0 - 0.00603519936853378*G0_0_1_0_1 - 0.000318869842679422*G0_0_1_0_2 - 0.000823620823620953*G0_0_1_0_3 + 0.0029744858316292*G0_0_1_0_4 + 0.0049087420516*G0_0_1_0_5 - 0.00137925566497017*G0_0_1_0_6 + 0.00805607091321515*G0_0_1_0_7 - 0.0089488289488305*G0_0_1_0_8 - 0.00427952999381644*G0_0_1_0_9 - 0.00603519936853378*G0_0_1_1_0 - 0.196588596588631*G0_0_1_1_1 - 0.00504261170927923*G0_0_1_1_2 - 0.0565212565212662*G0_0_1_1_3 + 0.0241314241314282*G0_0_1_1_4 + 0.000574980574980734*G0_0_1_1_5 - 0.00192918192918228*G0_0_1_1_6 + 0.0287490287490338*G0_0_1_1_7 - 0.039116439116446*G0_0_1_1_8 + 0.0101232101232118*G0_0_1_1_9 - 0.000318869842679422*G0_0_1_2_0 - 0.00504261170927923*G0_0_1_2_1 - 0.00255659684231155*G0_0_1_2_2 - 0.00941058941059098*G0_0_1_2_3 + 0.00676466390752218*G0_0_1_2_4 + 0.000746872175443717*G0_0_1_2_5 + 0.00316064887493514*G0_0_1_2_6 + 0.0019849991278566*G0_0_1_2_7 - 0.0262382062382106*G0_0_1_2_8 - 0.0195632938490114*G0_0_1_2_9 - 0.000823620823620953*G0_0_1_3_0 - 0.0565212565212662*G0_0_1_3_1 - 0.00941058941059098*G0_0_1_3_2 + 0.111488511488531*G0_0_1_3_3 + 0.0341058941058998*G0_0_1_3_4 - 0.00305694305694353*G0_0_1_3_5 + 0.0126473526473548*G0_0_1_3_6 + 0.00933066933067089*G0_0_1_3_7 - 0.0949050949051108*G0_0_1_3_8 - 0.0490309690309772*G0_0_1_3_9 + 0.0029744858316292*G0_0_1_4_0 + 0.0241314241314282*G0_0_1_4_1 + 0.00676466390752218*G0_0_1_4_2 + 0.0341058941058998*G0_0_1_4_3 - 0.0173826173826203*G0_0_1_4_4 - 0.00206365063507956*G0_0_1_4_5 - 0.0105837020122752*G0_0_1_4_6 - 0.0108691308691327*G0_0_1_4_7 + 0.0855744255744399*G0_0_1_4_8 + 0.0628171828171934*G0_0_1_4_9 + 0.0049087420516*G0_0_1_5_0 + 0.000574980574980733*G0_0_1_5_1 + 0.000746872175443717*G0_0_1_5_2 - 0.00305694305694353*G0_0_1_5_3 - 0.00206365063507956*G0_0_1_5_4 + 0.0164349935778536*G0_0_1_5_5 - 0.00131582703011293*G0_0_1_5_6 - 0.00603967461110423*G0_0_1_5_7 + 0.00513486513486603*G0_0_1_5_8 + 0.00256885971171727*G0_0_1_5_9 - 0.00137925566497017*G0_0_1_6_0 - 0.00192918192918228*G0_0_1_6_1 + 0.00316064887493514*G0_0_1_6_2 + 0.0126473526473548*G0_0_1_6_3 - 0.0105837020122752*G0_0_1_6_4 - 0.00131582703011293*G0_0_1_6_5 - 0.000416726131011697*G0_0_1_6_6 + 0.000904809476238219*G0_0_1_6_7 + 0.0388211788211853*G0_0_1_6_8 + 0.0333951762523248*G0_0_1_6_9 + 0.00805607091321515*G0_0_1_7_0 + 0.0287490287490338*G0_0_1_7_1 + 0.0019849991278566*G0_0_1_7_2 + 0.00933066933067089*G0_0_1_7_3 - 0.0108691308691327*G0_0_1_7_4 - 0.00603967461110423*G0_0_1_7_5 + 0.000904809476238218*G0_0_1_7_6 - 0.0551048951049044*G0_0_1_7_7 + 0.0304295704295755*G0_0_1_7_8 + 0.0110289710289728*G0_0_1_7_9 - 0.0089488289488305*G0_0_1_8_0 - 0.039116439116446*G0_0_1_8_1 - 0.0262382062382106*G0_0_1_8_2 - 0.0949050949051108*G0_0_1_8_3 + 0.0855744255744399*G0_0_1_8_4 + 0.00513486513486603*G0_0_1_8_5 + 0.0388211788211853*G0_0_1_8_6 + 0.0304295704295755*G0_0_1_8_7 - 0.491108891108974*G0_0_1_8_8 - 0.201518481518516*G0_0_1_8_9 - 0.00427952999381644*G0_0_1_9_0 + 0.0101232101232118*G0_0_1_9_1 - 0.0195632938490114*G0_0_1_9_2 - 0.0490309690309772*G0_0_1_9_3 + 0.0628171828171934*G0_0_1_9_4 + 0.00256885971171727*G0_0_1_9_5 + 0.0333951762523248*G0_0_1_9_6 + 0.0110289710289728*G0_0_1_9_7 - 0.201518481518516*G0_0_1_9_8 - 0.205714285714321*G0_0_1_9_9; + A[29] = -A[27] - 0.00662871520014488*G0_0_0_0_0 + 0.00135469468802827*G0_0_0_0_1 - 0.00156193013335897*G0_0_0_0_2 + 0.00424591281734213*G0_0_0_0_3 - 0.00317999460856658*G0_0_0_0_4 - 0.00683538683538802*G0_0_0_0_5 + 0.00315938030223796*G0_0_0_0_6 - 0.00254697683269156*G0_0_0_0_7 + 0.00295133437990632*G0_0_0_0_8 + 0.000563246277532077*G0_0_0_0_9 + 0.00135469468802827*G0_0_0_1_0 + 0.0332013665347058*G0_0_0_1_1 + 0.00295334295334346*G0_0_0_1_2 + 0.0359529359529421*G0_0_0_1_3 - 0.0170140970140999*G0_0_0_1_4 - 0.00247308247308289*G0_0_0_1_5 - 0.00346542346542406*G0_0_0_1_6 - 0.00751248751248885*G0_0_0_1_7 + 0.0140193140193165*G0_0_0_1_8 - 0.00109224109224124*G0_0_0_1_9 - 0.00156193013335897*G0_0_0_2_0 + 0.00295334295334346*G0_0_0_2_1 - 0.00452880452880526*G0_0_0_2_2 + 0.00741353884211152*G0_0_0_2_3 - 0.00547642833357211*G0_0_0_2_4 + 0.0029786086928949*G0_0_0_2_5 - 0.00548150262436069*G0_0_0_2_6 - 0.00149406149406175*G0_0_0_2_7 + 0.0028672914387205*G0_0_0_2_8 + 0.00294562580276916*G0_0_0_2_9 + 0.00424591281734213*G0_0_0_3_0 + 0.0359529359529421*G0_0_0_3_1 + 0.00741353884211152*G0_0_0_3_2 + 0.0798401598401735*G0_0_0_3_3 - 0.0197202797202831*G0_0_0_3_4 - 0.00205508776937386*G0_0_0_3_5 + 0.00918795490224212*G0_0_0_3_6 - 0.0139460539460563*G0_0_0_3_7 + 0.0237562437562478*G0_0_0_3_8 + 0.0311688311688365*G0_0_0_3_9 - 0.00317999460856658*G0_0_0_4_0 - 0.0170140970140999*G0_0_0_4_1 - 0.00547642833357211*G0_0_0_4_2 - 0.0197202797202831*G0_0_0_4_3 - 0.0191979449122337*G0_0_0_4_4 + 0.00833166833166973*G0_0_0_4_5 - 0.0175196232339119*G0_0_0_4_6 + 0.00761524190095748*G0_0_0_4_7 - 0.0098101898101915*G0_0_0_4_8 - 0.0255002140716469*G0_0_0_4_9 - 0.00683538683538802*G0_0_0_5_0 - 0.00247308247308289*G0_0_0_5_1 + 0.0029786086928949*G0_0_0_5_2 - 0.00205508776937386*G0_0_0_5_3 + 0.00833166833166973*G0_0_0_5_4 - 0.12192379049524*G0_0_0_5_5 + 0.00776081061795477*G0_0_0_5_6 - 0.0094848009133739*G0_0_0_5_7 + 0.00621093192521866*G0_0_0_5_8 - 0.0141116026830336*G0_0_0_5_9 + 0.00315938030223796*G0_0_0_6_0 - 0.00346542346542406*G0_0_0_6_1 - 0.00548150262436069*G0_0_0_6_2 + 0.00918795490224212*G0_0_0_6_3 - 0.0175196232339119*G0_0_0_6_4 + 0.00776081061795478*G0_0_0_6_5 - 0.120468103325266*G0_0_0_6_6 + 0.00327386898815523*G0_0_0_6_7 + 0.0015013557870703*G0_0_0_6_8 - 0.0272127872127917*G0_0_0_6_9 - 0.00254697683269156*G0_0_0_7_0 - 0.00751248751248885*G0_0_0_7_1 - 0.00149406149406175*G0_0_0_7_2 - 0.0139460539460563*G0_0_0_7_3 + 0.00761524190095748*G0_0_0_7_4 - 0.0094848009133739*G0_0_0_7_5 + 0.00327386898815524*G0_0_0_7_6 + 0.00230055658627129*G0_0_0_7_7 - 0.00679320679320798*G0_0_0_7_8 - 0.00823747680890676*G0_0_0_7_9 + 0.00295133437990632*G0_0_0_8_0 + 0.0140193140193165*G0_0_0_8_1 + 0.0028672914387205*G0_0_0_8_2 + 0.0237562437562478*G0_0_0_8_3 - 0.0098101898101915*G0_0_0_8_4 + 0.00621093192521866*G0_0_0_8_5 + 0.0015013557870703*G0_0_0_8_6 - 0.00679320679320798*G0_0_0_8_7 + 0.0208991008991046*G0_0_0_8_8 + 0.0228971028971068*G0_0_0_8_9 + 0.000563246277532077*G0_0_0_9_0 - 0.00109224109224124*G0_0_0_9_1 + 0.00294562580276916*G0_0_0_9_2 + 0.0311688311688365*G0_0_0_9_3 - 0.0255002140716469*G0_0_0_9_4 - 0.0141116026830336*G0_0_0_9_5 - 0.0272127872127917*G0_0_0_9_6 - 0.00823747680890676*G0_0_0_9_7 + 0.0228971028971068*G0_0_0_9_8 - 0.0139745968317419*G0_0_0_9_9 - 0.00209991067133959*G0_0_1_0_0 - 0.00159864826531521*G0_0_1_0_1 + 0.00137862137862162*G0_0_1_0_3 - 0.00168593311450483*G0_0_1_0_4 - 0.00135388421102729*G0_0_1_0_5 + 0.000180771609343063*G0_0_1_0_6 + 0.00292945150088056*G0_0_1_0_7 - 0.00446220446220522*G0_0_1_0_8 - 0.00238237952523707*G0_0_1_0_9 - 0.0015986482653152*G0_0_1_1_0 + 0.0015986482653152*G0_0_1_1_2 + 0.0219336219336257*G0_0_1_1_3 - 0.00950160950161111*G0_0_1_1_4 + 0.00099234099234117*G0_0_1_1_5 - 0.00099234099234117*G0_0_1_1_6 + 0.0095016095016111*G0_0_1_1_7 - 0.0219336219336256*G0_0_1_1_8 + 0.0015986482653152*G0_0_1_2_1 + 0.00209991067133959*G0_0_1_2_2 + 0.00446220446220522*G0_0_1_2_3 - 0.00292945150088056*G0_0_1_2_4 - 0.000180771609343067*G0_0_1_2_5 + 0.00135388421102729*G0_0_1_2_6 + 0.00168593311450482*G0_0_1_2_7 - 0.0013786213786216*G0_0_1_2_8 + 0.00238237952523707*G0_0_1_2_9 + 0.00137862137862162*G0_0_1_3_0 + 0.0219336219336257*G0_0_1_3_1 + 0.00446220446220522*G0_0_1_3_2 + 0.0589410589410691*G0_0_1_3_3 - 0.0129270729270752*G0_0_1_3_4 - 0.00355644355644415*G0_0_1_3_5 + 0.00297702297702347*G0_0_1_3_6 - 0.00413586413586487*G0_0_1_3_7 + 0.00827172827172971*G0_0_1_3_9 - 0.00168593311450483*G0_0_1_4_0 - 0.00950160950161111*G0_0_1_4_1 - 0.00292945150088056*G0_0_1_4_2 - 0.0129270729270752*G0_0_1_4_3 - 0.021498501498505*G0_0_1_4_4 + 0.00505779934351447*G0_0_1_4_5 - 0.00803482232053794*G0_0_1_4_6 + 0.0041358641358648*G0_0_1_4_8 - 0.0172627372627402*G0_0_1_4_9 - 0.00135388421102729*G0_0_1_5_0 + 0.000992340992341169*G0_0_1_5_1 - 0.000180771609343067*G0_0_1_5_2 - 0.00355644355644415*G0_0_1_5_3 + 0.00505779934351447*G0_0_1_5_4 - 0.00145568716997312*G0_0_1_5_5 + 0.00803482232053795*G0_0_1_5_7 - 0.00297702297702346*G0_0_1_5_8 + 0.0131011845297582*G0_0_1_5_9 + 0.000180771609343063*G0_0_1_6_0 - 0.000992340992341169*G0_0_1_6_1 + 0.00135388421102729*G0_0_1_6_2 + 0.00297702297702347*G0_0_1_6_3 - 0.00803482232053794*G0_0_1_6_4 + 0.00145568716997313*G0_0_1_6_6 - 0.00505779934351446*G0_0_1_6_7 + 0.00355644355644414*G0_0_1_6_8 - 0.0131011845297582*G0_0_1_6_9 + 0.00292945150088056*G0_0_1_7_0 + 0.0095016095016111*G0_0_1_7_1 + 0.00168593311450482*G0_0_1_7_2 - 0.00413586413586487*G0_0_1_7_3 + 0.00803482232053795*G0_0_1_7_5 - 0.00505779934351446*G0_0_1_7_6 + 0.0214985014985051*G0_0_1_7_7 + 0.0129270729270751*G0_0_1_7_8 + 0.0172627372627402*G0_0_1_7_9 - 0.00446220446220522*G0_0_1_8_0 - 0.0219336219336256*G0_0_1_8_1 - 0.0013786213786216*G0_0_1_8_2 + 0.0041358641358648*G0_0_1_8_4 - 0.00297702297702346*G0_0_1_8_5 + 0.00355644355644414*G0_0_1_8_6 + 0.0129270729270751*G0_0_1_8_7 - 0.0589410589410688*G0_0_1_8_8 - 0.00827172827172966*G0_0_1_8_9 - 0.00238237952523707*G0_0_1_9_0 + 0.00238237952523707*G0_0_1_9_2 + 0.00827172827172971*G0_0_1_9_3 - 0.0172627372627402*G0_0_1_9_4 + 0.0131011845297582*G0_0_1_9_5 - 0.0131011845297582*G0_0_1_9_6 + 0.0172627372627402*G0_0_1_9_7 - 0.00827172827172966*G0_0_1_9_8; + A[43] = -A[42] - 0.00209991067133958*G0_1_0_0_0 - 0.0015986482653152*G0_1_0_0_2 - 0.00168593311450483*G0_1_0_0_3 + 0.00137862137862162*G0_1_0_0_4 + 0.00292945150088057*G0_1_0_0_5 - 0.00446220446220523*G0_1_0_0_6 - 0.00135388421102729*G0_1_0_0_7 + 0.000180771609343068*G0_1_0_0_8 - 0.00238237952523706*G0_1_0_0_9 + 0.00209991067133961*G0_1_0_1_1 + 0.0015986482653152*G0_1_0_1_2 - 0.00292945150088056*G0_1_0_1_3 + 0.00446220446220523*G0_1_0_1_4 + 0.00168593311450482*G0_1_0_1_5 - 0.00137862137862161*G0_1_0_1_6 - 0.000180771609343077*G0_1_0_1_7 + 0.00135388421102731*G0_1_0_1_8 + 0.00238237952523706*G0_1_0_1_9 - 0.0015986482653152*G0_1_0_2_0 + 0.0015986482653152*G0_1_0_2_1 - 0.0095016095016111*G0_1_0_2_3 + 0.0219336219336256*G0_1_0_2_4 + 0.00950160950161111*G0_1_0_2_5 - 0.0219336219336257*G0_1_0_2_6 + 0.000992340992341156*G0_1_0_2_7 - 0.000992340992341155*G0_1_0_2_8 - 0.00168593311450483*G0_1_0_3_0 - 0.00292945150088056*G0_1_0_3_1 - 0.0095016095016111*G0_1_0_3_2 - 0.0214985014985052*G0_1_0_3_3 - 0.0129270729270752*G0_1_0_3_4 + 0.0041358641358648*G0_1_0_3_6 + 0.00505779934351447*G0_1_0_3_7 - 0.00803482232053793*G0_1_0_3_8 - 0.0172627372627401*G0_1_0_3_9 + 0.00137862137862162*G0_1_0_4_0 + 0.00446220446220523*G0_1_0_4_1 + 0.0219336219336256*G0_1_0_4_2 - 0.0129270729270752*G0_1_0_4_3 + 0.0589410589410691*G0_1_0_4_4 - 0.00413586413586485*G0_1_0_4_5 - 0.00355644355644415*G0_1_0_4_7 + 0.00297702297702345*G0_1_0_4_8 + 0.00827172827172966*G0_1_0_4_9 + 0.00292945150088058*G0_1_0_5_0 + 0.00168593311450482*G0_1_0_5_1 + 0.00950160950161111*G0_1_0_5_2 - 0.00413586413586484*G0_1_0_5_4 + 0.021498501498505*G0_1_0_5_5 + 0.0129270729270751*G0_1_0_5_6 + 0.00803482232053794*G0_1_0_5_7 - 0.00505779934351447*G0_1_0_5_8 + 0.0172627372627401*G0_1_0_5_9 - 0.00446220446220523*G0_1_0_6_0 - 0.00137862137862161*G0_1_0_6_1 - 0.0219336219336257*G0_1_0_6_2 + 0.00413586413586481*G0_1_0_6_3 + 0.0129270729270751*G0_1_0_6_5 - 0.0589410589410689*G0_1_0_6_6 - 0.00297702297702348*G0_1_0_6_7 + 0.00355644355644414*G0_1_0_6_8 - 0.00827172827172964*G0_1_0_6_9 - 0.00135388421102729*G0_1_0_7_0 - 0.000180771609343077*G0_1_0_7_1 + 0.000992340992341156*G0_1_0_7_2 + 0.00505779934351448*G0_1_0_7_3 - 0.00355644355644415*G0_1_0_7_4 + 0.00803482232053794*G0_1_0_7_5 - 0.00297702297702348*G0_1_0_7_6 - 0.0014556871699731*G0_1_0_7_7 + 0.0131011845297581*G0_1_0_7_9 + 0.000180771609343068*G0_1_0_8_0 + 0.00135388421102731*G0_1_0_8_1 - 0.000992340992341155*G0_1_0_8_2 - 0.00803482232053793*G0_1_0_8_3 + 0.00297702297702345*G0_1_0_8_4 - 0.00505779934351447*G0_1_0_8_5 + 0.00355644355644414*G0_1_0_8_6 + 0.00145568716997323*G0_1_0_8_8 - 0.0131011845297581*G0_1_0_8_9 - 0.00238237952523706*G0_1_0_9_0 + 0.00238237952523706*G0_1_0_9_1 - 0.0172627372627401*G0_1_0_9_3 + 0.00827172827172966*G0_1_0_9_4 + 0.0172627372627401*G0_1_0_9_5 - 0.00827172827172964*G0_1_0_9_6 + 0.0131011845297581*G0_1_0_9_7 - 0.0131011845297581*G0_1_0_9_8 - 0.00662871520014493*G0_1_1_0_0 - 0.00156193013335898*G0_1_1_0_1 + 0.00135469468802825*G0_1_1_0_2 - 0.00317999460856658*G0_1_1_0_3 + 0.00424591281734212*G0_1_1_0_4 - 0.00254697683269155*G0_1_1_0_5 + 0.0029513343799063*G0_1_1_0_6 - 0.00683538683538801*G0_1_1_0_7 + 0.00315938030223797*G0_1_1_0_8 + 0.00056324627753208*G0_1_1_0_9 - 0.00156193013335898*G0_1_1_1_0 - 0.00452880452880531*G0_1_1_1_1 + 0.00295334295334345*G0_1_1_1_2 - 0.00547642833357212*G0_1_1_1_3 + 0.00741353884211154*G0_1_1_1_4 - 0.00149406149406174*G0_1_1_1_5 + 0.00286729143872049*G0_1_1_1_6 + 0.00297860869289493*G0_1_1_1_7 - 0.00548150262436073*G0_1_1_1_8 + 0.00294562580276915*G0_1_1_1_9 + 0.00135469468802825*G0_1_1_2_0 + 0.00295334295334345*G0_1_1_2_1 + 0.0332013665347053*G0_1_1_2_2 - 0.0170140970140999*G0_1_1_2_3 + 0.035952935952942*G0_1_1_2_4 - 0.00751248751248873*G0_1_1_2_5 + 0.0140193140193163*G0_1_1_2_6 - 0.00247308247308289*G0_1_1_2_7 - 0.00346542346542404*G0_1_1_2_8 - 0.00109224109224129*G0_1_1_2_9 - 0.00317999460856658*G0_1_1_3_0 - 0.00547642833357212*G0_1_1_3_1 - 0.0170140970140999*G0_1_1_3_2 - 0.0191979449122339*G0_1_1_3_3 - 0.0197202797202831*G0_1_1_3_4 + 0.00761524190095745*G0_1_1_3_5 - 0.00981018981019145*G0_1_1_3_6 + 0.00833166833166976*G0_1_1_3_7 - 0.0175196232339119*G0_1_1_3_8 - 0.0255002140716469*G0_1_1_3_9 + 0.00424591281734212*G0_1_1_4_0 + 0.00741353884211154*G0_1_1_4_1 + 0.035952935952942*G0_1_1_4_2 - 0.0197202797202831*G0_1_1_4_3 + 0.0798401598401735*G0_1_1_4_4 - 0.0139460539460563*G0_1_1_4_5 + 0.0237562437562477*G0_1_1_4_6 - 0.00205508776937383*G0_1_1_4_7 + 0.00918795490224217*G0_1_1_4_8 + 0.0311688311688364*G0_1_1_4_9 - 0.00254697683269155*G0_1_1_5_0 - 0.00149406149406174*G0_1_1_5_1 - 0.00751248751248873*G0_1_1_5_2 + 0.00761524190095745*G0_1_1_5_3 - 0.0139460539460563*G0_1_1_5_4 + 0.00230055658627127*G0_1_1_5_5 - 0.00679320679320787*G0_1_1_5_6 - 0.00948480091337393*G0_1_1_5_7 + 0.00327386898815525*G0_1_1_5_8 - 0.00823747680890674*G0_1_1_5_9 + 0.0029513343799063*G0_1_1_6_0 + 0.00286729143872049*G0_1_1_6_1 + 0.0140193140193163*G0_1_1_6_2 - 0.00981018981019145*G0_1_1_6_3 + 0.0237562437562477*G0_1_1_6_4 - 0.00679320679320787*G0_1_1_6_5 + 0.0208991008991042*G0_1_1_6_6 + 0.00621093192521868*G0_1_1_6_7 + 0.00150135578707031*G0_1_1_6_8 + 0.0228971028971067*G0_1_1_6_9 - 0.00683538683538801*G0_1_1_7_0 + 0.00297860869289492*G0_1_1_7_1 - 0.00247308247308289*G0_1_1_7_2 + 0.00833166833166976*G0_1_1_7_3 - 0.00205508776937383*G0_1_1_7_4 - 0.00948480091337393*G0_1_1_7_5 + 0.00621093192521868*G0_1_1_7_6 - 0.12192379049524*G0_1_1_7_7 + 0.00776081061795485*G0_1_1_7_8 - 0.0141116026830337*G0_1_1_7_9 + 0.00315938030223797*G0_1_1_8_0 - 0.00548150262436073*G0_1_1_8_1 - 0.00346542346542404*G0_1_1_8_2 - 0.0175196232339119*G0_1_1_8_3 + 0.00918795490224217*G0_1_1_8_4 + 0.00327386898815525*G0_1_1_8_5 + 0.00150135578707031*G0_1_1_8_6 + 0.00776081061795485*G0_1_1_8_7 - 0.120468103325267*G0_1_1_8_8 - 0.0272127872127918*G0_1_1_8_9 + 0.000563246277532081*G0_1_1_9_0 + 0.00294562580276915*G0_1_1_9_1 - 0.00109224109224129*G0_1_1_9_2 - 0.0255002140716469*G0_1_1_9_3 + 0.0311688311688364*G0_1_1_9_4 - 0.00823747680890674*G0_1_1_9_5 + 0.0228971028971068*G0_1_1_9_6 - 0.0141116026830337*G0_1_1_9_7 - 0.0272127872127918*G0_1_1_9_8 - 0.0139745968317418*G0_1_1_9_9; + A[146] = -A[138] + 0.11624918291587*G0_0_0_0_0 + 0.00513095370238318*G0_0_0_0_1 + 0.0079409831790798*G0_0_0_0_2 + 0.0024644138929857*G0_0_0_0_3 - 0.0038936724651017*G0_0_0_0_4 + 0.0763976763976897*G0_0_0_0_5 - 0.0332463303891933*G0_0_0_0_6 + 0.0271077071077118*G0_0_0_0_7 - 0.00510262224548033*G0_0_0_0_8 + 0.00822796251367826*G0_0_0_0_9 + 0.00513095370238318*G0_0_0_1_0 + 0.0811632811632952*G0_0_0_1_1 + 0.00343332152856021*G0_0_0_1_2 + 0.0251600251600295*G0_0_0_1_3 - 0.0116120916120936*G0_0_0_1_4 + 0.00722156150727699*G0_0_0_1_5 - 0.0032847575704724*G0_0_0_1_6 - 0.0015836015836019*G0_0_0_1_7 + 0.0184408184408216*G0_0_0_1_8 + 0.00111888111888132*G0_0_0_1_9 + 0.0079409831790798*G0_0_0_2_0 + 0.00343332152856021*G0_0_0_2_1 + 0.0034087957897488*G0_0_0_2_2 + 0.00438165009593653*G0_0_0_2_3 - 0.000469371897943379*G0_0_0_2_4 + 0.0120945720945742*G0_0_0_2_5 - 0.00377780949209582*G0_0_0_2_6 + 0.00386491815063309*G0_0_0_2_7 + 0.0054937654937664*G0_0_0_2_8 + 0.0147306661592401*G0_0_0_2_9 + 0.0024644138929857*G0_0_0_3_0 + 0.0251600251600295*G0_0_0_3_1 + 0.00438165009593653*G0_0_0_3_2 - 0.0628704628704739*G0_0_0_3_3 - 0.0252395223823837*G0_0_0_3_4 - 0.00850958565244423*G0_0_0_3_5 - 0.00218448218448254*G0_0_0_3_6 - 0.019431996574857*G0_0_0_3_7 + 0.0479520479520559*G0_0_0_3_8 + 0.03550734979307*G0_0_0_3_9 - 0.0038936724651017*G0_0_0_4_0 - 0.0116120916120936*G0_0_0_4_1 - 0.000469371897943378*G0_0_0_4_2 - 0.0252395223823837*G0_0_0_4_3 + 0.0112268683697273*G0_0_0_4_4 - 0.000357737500594702*G0_0_0_4_5 + 0.00254221968507723*G0_0_0_4_6 + 0.00606250891965279*G0_0_0_4_7 - 0.028520051377199*G0_0_0_4_8 - 0.0434765234765308*G0_0_0_4_9 + 0.0763976763976897*G0_0_0_5_0 + 0.00722156150727699*G0_0_0_5_1 + 0.0120945720945742*G0_0_0_5_2 - 0.00850958565244423*G0_0_0_5_3 - 0.000357737500594702*G0_0_0_5_4 + 0.198354026925489*G0_0_0_5_5 - 0.06341848627564*G0_0_0_5_6 + 0.0573369487655298*G0_0_0_5_7 - 0.0337034394177308*G0_0_0_5_8 + 0.0427229912944272*G0_0_0_5_9 - 0.0332463303891933*G0_0_0_6_0 - 0.0032847575704724*G0_0_0_6_1 - 0.00377780949209582*G0_0_0_6_2 - 0.00218448218448254*G0_0_0_6_3 + 0.00254221968507723*G0_0_0_6_4 - 0.06341848627564*G0_0_0_6_5 + 0.0232833832833873*G0_0_0_6_6 - 0.023633509347799*G0_0_0_6_7 + 0.00270586556300891*G0_0_0_6_8 - 0.0398230341087552*G0_0_0_6_9 + 0.0271077071077118*G0_0_0_7_0 - 0.0015836015836019*G0_0_0_7_1 + 0.00386491815063309*G0_0_0_7_2 - 0.019431996574857*G0_0_0_7_3 + 0.00606250891965279*G0_0_0_7_4 + 0.0573369487655298*G0_0_0_7_5 - 0.023633509347799*G0_0_0_7_6 + 0.102236810808257*G0_0_0_7_7 - 0.0743408971980525*G0_0_0_7_8 + 0.0225831311545635*G0_0_0_7_9 - 0.00510262224548033*G0_0_0_8_0 + 0.0184408184408217*G0_0_0_8_1 + 0.0054937654937664*G0_0_0_8_2 + 0.0479520479520559*G0_0_0_8_3 - 0.028520051377199*G0_0_0_8_4 - 0.0337034394177308*G0_0_0_8_5 + 0.00270586556300892*G0_0_0_8_6 - 0.0743408971980525*G0_0_0_8_7 + 0.131601731601754*G0_0_0_8_8 + 0.0536834593977541*G0_0_0_8_9 + 0.00822796251367826*G0_0_0_9_0 + 0.00111888111888132*G0_0_0_9_1 + 0.0147306661592401*G0_0_0_9_2 + 0.03550734979307*G0_0_0_9_3 - 0.0434765234765309*G0_0_0_9_4 + 0.0427229912944271*G0_0_0_9_5 - 0.0398230341087552*G0_0_0_9_6 + 0.0225831311545635*G0_0_0_9_7 + 0.0536834593977541*G0_0_0_9_8 + 0.138375909804505*G0_0_0_9_9 - 0.00955094288427789*G0_1_0_0_0 + 0.0020710154043491*G0_1_0_0_1 + 0.00195317909603654*G0_1_0_0_3 - 0.00251219679791151*G0_1_0_0_4 - 0.00976208976209141*G0_1_0_0_5 + 0.00265850551564883*G0_1_0_0_6 + 0.00635216635216736*G0_1_0_0_7 + 0.0074063502634944*G0_1_0_0_8 + 0.00155019583591037*G0_1_0_0_9 + 0.0020710154043491*G0_1_0_1_0 + 0.0840048840048984*G0_1_0_1_1 + 0.00330632330632386*G0_1_0_1_2 + 0.0257520257520301*G0_1_0_1_3 - 0.0114907314907334*G0_1_0_1_4 + 0.00358456358456417*G0_1_0_1_5 - 0.0024893624893629*G0_1_0_1_6 + 0.00200688200688228*G0_1_0_1_7 + 0.0179376179376211*G0_1_0_1_8 + 0.00255744255744301*G0_1_0_1_9 + 0.00330632330632386*G0_1_0_2_1 + 0.000956221908603064*G0_1_0_2_2 + 0.00399642685357036*G0_1_0_2_3 - 0.000756915042629416*G0_1_0_2_4 + 0.00198869913155659*G0_1_0_2_5 - 0.00234855091997985*G0_1_0_2_6 + 0.00625617768475015*G0_1_0_2_7 + 0.00546966261252066*G0_1_0_2_8 + 0.0159814788386244*G0_1_0_2_9 + 0.00195317909603654*G0_1_0_3_0 + 0.0257520257520301*G0_1_0_3_1 + 0.00399642685357036*G0_1_0_3_2 - 0.0799200799200941*G0_1_0_3_3 - 0.0242157842157883*G0_1_0_3_4 - 0.00328433471290671*G0_1_0_3_5 - 0.00257647114790014*G0_1_0_3_6 - 0.0159040959040985*G0_1_0_3_7 + 0.0423576423576494*G0_1_0_3_8 + 0.024135864135868*G0_1_0_3_9 - 0.00251219679791151*G0_1_0_4_0 - 0.0114907314907334*G0_1_0_4_1 - 0.000756915042629415*G0_1_0_4_2 - 0.0242157842157883*G0_1_0_4_3 + 0.0158698444412757*G0_1_0_4_4 - 0.00250796822225436*G0_1_0_4_5 + 0.00508443937015451*G0_1_0_4_6 - 0.000593692022263551*G0_1_0_4_7 - 0.0264535464535508*G0_1_0_4_8 - 0.0429285000713645*G0_1_0_4_9 - 0.00976208976209142*G0_1_0_5_0 + 0.00358456358456417*G0_1_0_5_1 + 0.00198869913155659*G0_1_0_5_2 - 0.00328433471290671*G0_1_0_5_3 - 0.00250796822225436*G0_1_0_5_4 - 0.00352409495266688*G0_1_0_5_5 - 0.00746301317730018*G0_1_0_5_6 + 0.0496113410399208*G0_1_0_5_7 - 0.0207982493696815*G0_1_0_5_8 + 0.0369459112316318*G0_1_0_5_9 + 0.00265850551564883*G0_1_0_6_0 - 0.0024893624893629*G0_1_0_6_1 - 0.00234855091997985*G0_1_0_6_2 - 0.00257647114790014*G0_1_0_6_3 + 0.00508443937015451*G0_1_0_6_4 - 0.00746301317730018*G0_1_0_6_5 + 0.00661433804291063*G0_1_0_6_6 - 0.0288130916702393*G0_1_0_6_7 + 0.000551829123257813*G0_1_0_6_8 - 0.0427914942200729*G0_1_0_6_9 + 0.00635216635216736*G0_1_0_7_0 + 0.00200688200688228*G0_1_0_7_1 + 0.00625617768475016*G0_1_0_7_2 - 0.0159040959040985*G0_1_0_7_3 - 0.000593692022263551*G0_1_0_7_4 + 0.0496113410399208*G0_1_0_7_5 - 0.0288130916702393*G0_1_0_7_6 + 0.188497217068677*G0_1_0_7_7 - 0.0923076923077078*G0_1_0_7_8 + 0.0529755958327476*G0_1_0_7_9 + 0.0074063502634944*G0_1_0_8_0 + 0.0179376179376211*G0_1_0_8_1 + 0.00546966261252066*G0_1_0_8_2 + 0.0423576423576494*G0_1_0_8_3 - 0.0264535464535509*G0_1_0_8_4 - 0.0207982493696815*G0_1_0_8_5 + 0.000551829123257813*G0_1_0_8_6 - 0.0923076923077078*G0_1_0_8_7 + 0.140659340659364*G0_1_0_8_8 + 0.0452347652347728*G0_1_0_8_9 + 0.00155019583591037*G0_1_0_9_0 + 0.00255744255744301*G0_1_0_9_1 + 0.0159814788386244*G0_1_0_9_2 + 0.024135864135868*G0_1_0_9_3 - 0.0429285000713645*G0_1_0_9_4 + 0.0369459112316318*G0_1_0_9_5 - 0.0427914942200729*G0_1_0_9_6 + 0.0529755958327476*G0_1_0_9_7 + 0.0452347652347728*G0_1_0_9_8 + 0.142760097045835*G0_1_0_9_9; + A[126] = A[146] - 0.107921707921727*G0_0_0_0_0 - 0.00580118294404112*G0_0_0_0_1 - 0.00297621250002257*G0_0_0_0_2 - 0.00619359476502439*G0_0_0_0_3 + 0.00688031545174522*G0_0_0_0_4 - 0.0639952639952752*G0_0_0_0_5 + 0.02560402560403*G0_0_0_0_6 - 0.0248048248048291*G0_0_0_0_7 + 0.00647056647056763*G0_0_0_0_8 - 0.00632256632256747*G0_0_0_0_9 - 0.00580118294404112*G0_0_0_1_0 - 0.109261320689911*G0_0_0_1_1 + 0.000615257758114996*G0_0_0_1_2 - 0.0718553404267813*G0_0_0_1_3 + 0.0400606800606869*G0_0_0_1_4 - 0.0051736623165203*G0_0_0_1_5 + 0.00176543033685919*G0_0_0_1_6 + 0.00793703650846649*G0_0_0_1_7 - 0.0266721638150256*G0_0_0_1_8 - 0.00708370994085404*G0_0_0_1_9 - 0.00297621250002257*G0_0_0_2_0 + 0.000615257758114997*G0_0_0_2_1 + 0.123409571028639*G0_0_0_2_2 - 0.0456990628419276*G0_0_0_2_3 + 0.0865902351616782*G0_0_0_2_4 - 0.0250974422403035*G0_0_0_2_5 + 0.0304685790400125*G0_0_0_2_6 - 0.0037198780055929*G0_0_0_2_7 - 0.00478547907119415*G0_0_0_2_8 - 0.00221746507460834*G0_0_0_2_9 - 0.00619359476502439*G0_0_0_3_0 - 0.0718553404267813*G0_0_0_3_1 - 0.0456990628419276*G0_0_0_3_2 - 0.143643023643048*G0_0_0_3_3 + 0.00159459588031049*G0_0_0_3_4 + 0.0131449502878096*G0_0_0_3_5 + 0.00251557965843724*G0_0_0_3_6 + 0.026392654964088*G0_0_0_3_7 - 0.0485609628466854*G0_0_0_3_8 - 0.0315341801056141*G0_0_0_3_9 + 0.00688031545174522*G0_0_0_4_0 + 0.0400606800606869*G0_0_0_4_1 + 0.0865902351616782*G0_0_0_4_2 + 0.00159459588031049*G0_0_0_4_3 + 0.154025022596477*G0_0_0_4_4 - 0.0128290756862207*G0_0_0_4_5 + 0.0103134960277835*G0_0_0_4_6 - 0.00864659150373584*G0_0_0_4_7 + 0.0221683078825974*G0_0_0_4_8 + 0.0323105465962664*G0_0_0_4_9 - 0.0639952639952752*G0_0_0_5_0 - 0.0051736623165203*G0_0_0_5_1 - 0.0250974422403035*G0_0_0_5_2 + 0.0131449502878096*G0_0_0_5_3 - 0.0128290756862207*G0_0_0_5_4 - 0.160266400266428*G0_0_0_5_5 + 0.0616944959802209*G0_0_0_5_6 - 0.0423043623043694*G0_0_0_5_7 + 0.0233328576185759*G0_0_0_5_8 - 0.0276980162694496*G0_0_0_5_9 + 0.02560402560403*G0_0_0_6_0 + 0.00176543033685919*G0_0_0_6_1 + 0.0304685790400125*G0_0_0_6_2 + 0.00251557965843724*G0_0_0_6_3 + 0.0103134960277835*G0_0_0_6_4 + 0.0616944959802209*G0_0_0_6_5 - 0.0889320203606072*G0_0_0_6_6 + 0.0189715046857936*G0_0_0_6_7 + 0.000624137766994986*G0_0_0_6_8 + 0.00162123590695052*G0_0_0_6_9 - 0.0248048248048291*G0_0_0_7_0 + 0.00793703650846649*G0_0_0_7_1 - 0.0037198780055929*G0_0_0_7_2 + 0.026392654964088*G0_0_0_7_3 - 0.00864659150373584*G0_0_0_7_4 - 0.0423043623043694*G0_0_0_7_5 + 0.0189715046857936*G0_0_0_7_6 - 0.079600399600413*G0_0_0_7_7 + 0.0545625802768752*G0_0_0_7_8 - 0.018975310403885*G0_0_0_7_9 + 0.00647056647056763*G0_0_0_8_0 - 0.0266721638150256*G0_0_0_8_1 - 0.00478547907119415*G0_0_0_8_2 - 0.0485609628466854*G0_0_0_8_3 + 0.0221683078825974*G0_0_0_8_4 + 0.0233328576185759*G0_0_0_8_5 + 0.000624137766994983*G0_0_0_8_6 + 0.0545625802768752*G0_0_0_8_7 - 0.0880947623804917*G0_0_0_8_8 - 0.0230854859426327*G0_0_0_8_9 - 0.00632256632256747*G0_0_0_9_0 - 0.00708370994085404*G0_0_0_9_1 - 0.00221746507460834*G0_0_0_9_2 - 0.0315341801056141*G0_0_0_9_3 + 0.0323105465962664*G0_0_0_9_4 - 0.0276980162694496*G0_0_0_9_5 + 0.00162123590695052*G0_0_0_9_6 - 0.018975310403885*G0_0_0_9_7 - 0.0230854859426327*G0_0_0_9_8 - 0.0961781076066952*G0_0_0_9_9 - 0.0028633095299767*G0_0_1_0_1 + 0.0028633095299767*G0_0_1_0_2 - 0.00325008325008385*G0_0_1_0_3 + 0.00325008325008384*G0_0_1_0_4 + 0.00142080142080175*G0_0_1_0_5 - 0.00401376401376475*G0_0_1_0_6 - 0.00142080142080157*G0_0_1_0_7 + 0.00401376401376464*G0_0_1_0_8 - 0.0028633095299767*G0_0_1_1_0 - 0.118564187135636*G0_0_1_1_1 - 0.0797221825793391*G0_0_1_1_3 + 0.0414861329147114*G0_0_1_1_4 + 0.000532800532800657*G0_0_1_1_5 - 0.00128633271490437*G0_0_1_1_6 + 0.011908091908094*G0_0_1_1_7 - 0.0190285904571653*G0_0_1_1_8 - 0.00675134389420223*G0_0_1_1_9 + 0.0028633095299767*G0_0_1_2_0 + 0.118564187135636*G0_0_1_2_2 - 0.0414861329147113*G0_0_1_2_3 + 0.0797221825793389*G0_0_1_2_4 - 0.0119080919080939*G0_0_1_2_5 + 0.019028590457165*G0_0_1_2_6 - 0.000532800532800601*G0_0_1_2_7 + 0.00128633271490434*G0_0_1_2_8 + 0.00675134389420216*G0_0_1_2_9 - 0.00325008325008385*G0_0_1_3_0 - 0.0797221825793391*G0_0_1_3_1 - 0.0414861329147113*G0_0_1_3_2 - 0.145751391465702*G0_0_1_3_3 + 0.00407592407592477*G0_0_1_3_5 + 0.00385899814471307*G0_0_1_3_6 + 0.0097502497502515*G0_0_1_3_7 - 0.00589125160553851*G0_0_1_3_8 + 0.000753532182103557*G0_0_1_3_9 + 0.00325008325008384*G0_0_1_4_0 + 0.0414861329147114*G0_0_1_4_1 + 0.0797221825793389*G0_0_1_4_2 + 0.145751391465702*G0_0_1_4_4 - 0.00975024975025141*G0_0_1_4_5 + 0.00589125160553834*G0_0_1_4_6 - 0.00407592407592481*G0_0_1_4_7 - 0.00385899814471299*G0_0_1_4_8 - 0.000753532182103687*G0_0_1_4_9 + 0.00142080142080175*G0_0_1_5_0 + 0.000532800532800657*G0_0_1_5_1 - 0.0119080919080939*G0_0_1_5_2 + 0.00407592407592477*G0_0_1_5_3 - 0.00975024975025141*G0_0_1_5_4 - 0.00927072927073077*G0_0_1_5_5 + 0.0182217782217813*G0_0_1_5_6 - 0.00159840159840188*G0_0_1_5_8 + 0.00319680319680376*G0_0_1_5_9 - 0.00401376401376474*G0_0_1_6_0 - 0.00128633271490437*G0_0_1_6_1 + 0.019028590457165*G0_0_1_6_2 + 0.00385899814471307*G0_0_1_6_3 + 0.00589125160553834*G0_0_1_6_4 + 0.0182217782217813*G0_0_1_6_5 - 0.0813586413586551*G0_0_1_6_6 + 0.00159840159840182*G0_0_1_6_7 - 0.0279720279720326*G0_0_1_6_9 - 0.00142080142080157*G0_0_1_7_0 + 0.011908091908094*G0_0_1_7_1 - 0.000532800532800601*G0_0_1_7_2 + 0.0097502497502515*G0_0_1_7_3 - 0.00407592407592481*G0_0_1_7_4 + 0.00159840159840183*G0_0_1_7_6 + 0.00927072927073091*G0_0_1_7_7 - 0.0182217782217813*G0_0_1_7_8 - 0.00319680319680366*G0_0_1_7_9 + 0.00401376401376464*G0_0_1_8_0 - 0.0190285904571653*G0_0_1_8_1 + 0.00128633271490434*G0_0_1_8_2 - 0.00589125160553851*G0_0_1_8_3 - 0.003858998144713*G0_0_1_8_4 - 0.00159840159840188*G0_0_1_8_5 - 0.0182217782217813*G0_0_1_8_7 + 0.081358641358655*G0_0_1_8_8 + 0.0279720279720326*G0_0_1_8_9 - 0.00675134389420223*G0_0_1_9_1 + 0.00675134389420216*G0_0_1_9_2 + 0.000753532182103559*G0_0_1_9_3 - 0.000753532182103684*G0_0_1_9_4 + 0.00319680319680376*G0_0_1_9_5 - 0.0279720279720326*G0_0_1_9_6 - 0.00319680319680366*G0_0_1_9_7 + 0.0279720279720326*G0_0_1_9_8 - 0.00355313117217941*G0_1_0_0_1 + 0.0035531311721794*G0_1_0_0_2 - 0.00875822590108455*G0_1_0_0_3 + 0.00875822590108456*G0_1_0_0_4 + 0.0155104155104182*G0_1_0_0_5 + 0.00254560254560297*G0_1_0_0_6 - 0.015510415510418*G0_1_0_0_7 - 0.00254560254560304*G0_1_0_0_8 - 0.00355313117217941*G0_1_0_1_0 - 0.11276709181473*G0_1_0_1_1 - 0.0768560539989242*G0_1_0_1_3 + 0.0428071399500044*G0_1_0_1_4 + 0.00312830027115796*G0_1_0_1_5 + 0.00681730967445368*G0_1_0_1_6 + 0.00666973238401931*G0_1_0_1_7 - 0.0302520759663669*G0_1_0_1_8 + 0.00264624264624305*G0_1_0_1_9 + 0.0035531311721794*G0_1_0_2_0 + 0.112767091814729*G0_1_0_2_2 - 0.0428071399500042*G0_1_0_2_3 + 0.076856053998924*G0_1_0_2_4 - 0.00666973238401914*G0_1_0_2_5 + 0.0302520759663666*G0_1_0_2_6 - 0.0031283002711579*G0_1_0_2_7 - 0.00681730967445367*G0_1_0_2_8 - 0.00264624264624311*G0_1_0_2_9 - 0.00875822590108455*G0_1_0_3_0 - 0.0768560539989242*G0_1_0_3_1 - 0.0428071399500042*G0_1_0_3_2 - 0.143422291993745*G0_1_0_3_3 + 0.00844488844488989*G0_1_0_3_5 - 0.020451929023361*G0_1_0_3_6 + 0.0262746777032536*G0_1_0_3_7 - 0.0467266067266147*G0_1_0_3_8 - 0.0604880833452364*G0_1_0_3_9 + 0.00875822590108456*G0_1_0_4_0 + 0.0428071399500044*G0_1_0_4_1 + 0.076856053998924*G0_1_0_4_2 + 0.143422291993745*G0_1_0_4_4 - 0.0262746777032536*G0_1_0_4_5 + 0.0467266067266146*G0_1_0_4_6 - 0.00844488844488991*G0_1_0_4_7 + 0.020451929023361*G0_1_0_4_8 + 0.0604880833452364*G0_1_0_4_9 + 0.0155104155104182*G0_1_0_5_0 + 0.00312830027115796*G0_1_0_5_1 - 0.00666973238401914*G0_1_0_5_2 + 0.00844488844488989*G0_1_0_5_3 - 0.0262746777032536*G0_1_0_5_4 + 0.1715617715618*G0_1_0_5_5 - 0.0711897626183461*G0_1_0_5_6 - 0.00938490081347383*G0_1_0_5_8 + 0.0187698016269476*G0_1_0_5_9 + 0.00254560254560297*G0_1_0_6_0 + 0.00681730967445368*G0_1_0_6_1 + 0.0302520759663666*G0_1_0_6_2 - 0.020451929023361*G0_1_0_6_3 + 0.0467266067266146*G0_1_0_6_4 - 0.0711897626183461*G0_1_0_6_5 + 0.0971447600019193*G0_1_0_6_6 + 0.00938490081347376*G0_1_0_6_7 + 0.0488425859854513*G0_1_0_6_9 - 0.015510415510418*G0_1_0_7_0 + 0.00666973238401931*G0_1_0_7_1 - 0.00312830027115791*G0_1_0_7_2 + 0.0262746777032536*G0_1_0_7_3 - 0.0084448884448899*G0_1_0_7_4 + 0.00938490081347376*G0_1_0_7_6 - 0.1715617715618*G0_1_0_7_7 + 0.0711897626183459*G0_1_0_7_8 - 0.0187698016269476*G0_1_0_7_9 - 0.00254560254560304*G0_1_0_8_0 - 0.0302520759663669*G0_1_0_8_1 - 0.00681730967445367*G0_1_0_8_2 - 0.0467266067266147*G0_1_0_8_3 + 0.020451929023361*G0_1_0_8_4 - 0.00938490081347383*G0_1_0_8_5 + 0.0711897626183459*G0_1_0_8_7 - 0.0971447600019191*G0_1_0_8_8 - 0.0488425859854514*G0_1_0_8_9 + 0.00264624264624305*G0_1_0_9_1 - 0.00264624264624311*G0_1_0_9_2 - 0.0604880833452364*G0_1_0_9_3 + 0.0604880833452364*G0_1_0_9_4 + 0.0187698016269476*G0_1_0_9_5 + 0.0488425859854513*G0_1_0_9_6 - 0.0187698016269476*G0_1_0_9_7 - 0.0488425859854514*G0_1_0_9_8 + 0.107921707921726*G0_1_1_0_0 + 0.00297621250002251*G0_1_1_0_1 + 0.00580118294404107*G0_1_1_0_2 - 0.00688031545174528*G0_1_1_0_3 + 0.00619359476502444*G0_1_1_0_4 + 0.024804824804829*G0_1_1_0_5 - 0.00647056647056752*G0_1_1_0_6 + 0.0639952639952748*G0_1_1_0_7 - 0.0256040256040299*G0_1_1_0_8 + 0.00632256632256745*G0_1_1_0_9 + 0.00297621250002251*G0_1_1_1_0 - 0.12340957102864*G0_1_1_1_1 - 0.000615257758114991*G0_1_1_1_2 - 0.0865902351616785*G0_1_1_1_3 + 0.0456990628419277*G0_1_1_1_4 + 0.00371987800559294*G0_1_1_1_5 + 0.00478547907119417*G0_1_1_1_6 + 0.0250974422403037*G0_1_1_1_7 - 0.0304685790400129*G0_1_1_1_8 + 0.00221746507460827*G0_1_1_1_9 + 0.00580118294404107*G0_1_1_2_0 - 0.000615257758114991*G0_1_1_2_1 + 0.109261320689911*G0_1_1_2_2 - 0.0400606800606868*G0_1_1_2_3 + 0.0718553404267812*G0_1_1_2_4 - 0.00793703650846641*G0_1_1_2_5 + 0.0266721638150255*G0_1_1_2_6 + 0.00517366231652034*G0_1_1_2_7 - 0.00176543033685921*G0_1_1_2_8 + 0.00708370994085398*G0_1_1_2_9 - 0.00688031545174528*G0_1_1_3_0 - 0.0865902351616785*G0_1_1_3_1 - 0.0400606800606868*G0_1_1_3_2 - 0.154025022596478*G0_1_1_3_3 - 0.00159459588031034*G0_1_1_3_4 + 0.00864659150373582*G0_1_1_3_5 - 0.0221683078825973*G0_1_1_3_6 + 0.0128290756862208*G0_1_1_3_7 - 0.0103134960277837*G0_1_1_3_8 - 0.0323105465962665*G0_1_1_3_9 + 0.00619359476502444*G0_1_1_4_0 + 0.0456990628419277*G0_1_1_4_1 + 0.0718553404267812*G0_1_1_4_2 - 0.00159459588031033*G0_1_1_4_3 + 0.143643023643048*G0_1_1_4_4 - 0.026392654964088*G0_1_1_4_5 + 0.0485609628466854*G0_1_1_4_6 - 0.0131449502878097*G0_1_1_4_7 - 0.00251557965843714*G0_1_1_4_8 + 0.031534180105614*G0_1_1_4_9 + 0.024804824804829*G0_1_1_5_0 + 0.00371987800559294*G0_1_1_5_1 - 0.00793703650846641*G0_1_1_5_2 + 0.00864659150373582*G0_1_1_5_3 - 0.026392654964088*G0_1_1_5_4 + 0.0796003996004129*G0_1_1_5_5 - 0.0545625802768752*G0_1_1_5_6 + 0.0423043623043694*G0_1_1_5_7 - 0.0189715046857936*G0_1_1_5_8 + 0.0189753104038851*G0_1_1_5_9 - 0.00647056647056752*G0_1_1_6_0 + 0.00478547907119417*G0_1_1_6_1 + 0.0266721638150255*G0_1_1_6_2 - 0.0221683078825973*G0_1_1_6_3 + 0.0485609628466854*G0_1_1_6_4 - 0.0545625802768752*G0_1_1_6_5 + 0.0880947623804916*G0_1_1_6_6 - 0.0233328576185758*G0_1_1_6_7 - 0.000624137766994995*G0_1_1_6_8 + 0.0230854859426327*G0_1_1_6_9 + 0.0639952639952748*G0_1_1_7_0 + 0.0250974422403037*G0_1_1_7_1 + 0.00517366231652034*G0_1_1_7_2 + 0.0128290756862208*G0_1_1_7_3 - 0.0131449502878097*G0_1_1_7_4 + 0.0423043623043694*G0_1_1_7_5 - 0.0233328576185758*G0_1_1_7_6 + 0.160266400266427*G0_1_1_7_7 - 0.0616944959802206*G0_1_1_7_8 + 0.0276980162694497*G0_1_1_7_9 - 0.0256040256040299*G0_1_1_8_0 - 0.0304685790400129*G0_1_1_8_1 - 0.00176543033685921*G0_1_1_8_2 - 0.0103134960277837*G0_1_1_8_3 - 0.00251557965843714*G0_1_1_8_4 - 0.0189715046857936*G0_1_1_8_5 - 0.000624137766994994*G0_1_1_8_6 - 0.0616944959802206*G0_1_1_8_7 + 0.0889320203606067*G0_1_1_8_8 - 0.00162123590695058*G0_1_1_8_9 + 0.00632256632256745*G0_1_1_9_0 + 0.00221746507460827*G0_1_1_9_1 + 0.00708370994085398*G0_1_1_9_2 - 0.0323105465962665*G0_1_1_9_3 + 0.031534180105614*G0_1_1_9_4 + 0.0189753104038851*G0_1_1_9_5 + 0.0230854859426327*G0_1_1_9_6 + 0.0276980162694497*G0_1_1_9_7 - 0.00162123590695059*G0_1_1_9_8 + 0.0961781076066952*G0_1_1_9_9; + A[174] = A[146] - 0.00449920449920508*G0_0_1_0_0 + 0.000959604769128739*G0_0_1_0_1 + 0.000269783126926037*G0_0_1_0_2 + 0.00334311191454104*G0_0_1_0_3 - 0.00216503073645967*G0_0_1_0_4 - 0.00544640544640628*G0_0_1_0_5 + 0.0010537610537612*G0_0_1_0_6 + 0.00864320864321011*G0_0_1_0_7 + 0.0076131276131289*G0_0_1_0_8 + 0.00305472305472357*G0_0_1_0_9 + 0.000959604769128739*G0_0_1_1_0 - 0.00449920449920534*G0_0_1_1_1 + 0.000269783126926026*G0_0_1_1_2 - 0.00544640544640641*G0_0_1_1_3 + 0.00105376105376125*G0_0_1_1_4 + 0.00334311191454106*G0_0_1_1_5 - 0.00216503073645967*G0_0_1_1_6 + 0.00761312761312891*G0_0_1_1_7 + 0.00864320864321006*G0_0_1_1_8 + 0.00305472305472357*G0_0_1_1_9 + 0.000269783126926037*G0_0_1_2_0 + 0.000269783126926027*G0_0_1_2_1 + 0.00129789082170056*G0_0_1_2_2 + 0.00237476808905419*G0_0_1_2_3 - 0.00258027686599157*G0_0_1_2_4 + 0.00237476808905421*G0_0_1_2_5 - 0.00258027686599158*G0_0_1_2_6 + 0.00593861165289836*G0_0_1_2_7 + 0.00593861165289834*G0_0_1_2_8 + 0.0124523095951688*G0_0_1_2_9 + 0.00334311191454104*G0_0_1_3_0 - 0.00544640544640641*G0_0_1_3_1 + 0.00237476808905419*G0_0_1_3_2 + 0.00543456543456625*G0_0_1_3_3 - 0.00929356357927939*G0_0_1_3_4 - 0.00538889681746916*G0_0_1_3_5 - 0.00278578564292895*G0_0_1_3_6 - 0.0193102135959311*G0_0_1_3_7 + 0.0464069264069341*G0_0_1_3_8 + 0.0294562580276915*G0_0_1_3_9 - 0.00216503073645967*G0_0_1_4_0 + 0.00105376105376124*G0_0_1_4_1 - 0.00258027686599157*G0_0_1_4_2 - 0.00929356357927939*G0_0_1_4_3 + 0.00776366490652329*G0_0_1_4_4 - 0.00278578564292897*G0_0_1_4_5 + 0.00557157128585792*G0_0_1_4_6 - 0.00101993244850406*G0_0_1_4_7 - 0.027096712811003*G0_0_1_4_8 - 0.0317853574996486*G0_0_1_4_9 - 0.00544640544640629*G0_0_1_5_0 + 0.00334311191454106*G0_0_1_5_1 + 0.00237476808905421*G0_0_1_5_2 - 0.00538889681746916*G0_0_1_5_3 - 0.00278578564292897*G0_0_1_5_4 + 0.00543456543456649*G0_0_1_5_5 - 0.00929356357927947*G0_0_1_5_6 + 0.0464069264069342*G0_0_1_5_7 - 0.0193102135959312*G0_0_1_5_8 + 0.0294562580276916*G0_0_1_5_9 + 0.0010537610537612*G0_0_1_6_0 - 0.00216503073645967*G0_0_1_6_1 - 0.00258027686599158*G0_0_1_6_2 - 0.00278578564292895*G0_0_1_6_3 + 0.00557157128585792*G0_0_1_6_4 - 0.00929356357927947*G0_0_1_6_5 + 0.00776366490652337*G0_0_1_6_6 - 0.027096712811003*G0_0_1_6_7 - 0.00101993244850401*G0_0_1_6_8 - 0.0317853574996486*G0_0_1_6_9 + 0.00864320864321011*G0_0_1_7_0 + 0.00761312761312891*G0_0_1_7_1 + 0.00593861165289836*G0_0_1_7_2 - 0.0193102135959311*G0_0_1_7_3 - 0.00101993244850406*G0_0_1_7_4 + 0.0464069264069342*G0_0_1_7_5 - 0.0270967128110031*G0_0_1_7_6 + 0.186267066267097*G0_0_1_7_7 - 0.0987051044194067*G0_0_1_7_8 + 0.0450292564578355*G0_0_1_7_9 + 0.00761312761312889*G0_0_1_8_0 + 0.00864320864321005*G0_0_1_8_1 + 0.00593861165289834*G0_0_1_8_2 + 0.0464069264069341*G0_0_1_8_3 - 0.027096712811003*G0_0_1_8_4 - 0.0193102135959312*G0_0_1_8_5 - 0.00101993244850401*G0_0_1_8_6 - 0.0987051044194067*G0_0_1_8_7 + 0.186267066267098*G0_0_1_8_8 + 0.0450292564578354*G0_0_1_8_9 + 0.00305472305472357*G0_0_1_9_0 + 0.00305472305472357*G0_0_1_9_1 + 0.0124523095951688*G0_0_1_9_2 + 0.0294562580276915*G0_0_1_9_3 - 0.0317853574996486*G0_0_1_9_4 + 0.0294562580276916*G0_0_1_9_5 - 0.0317853574996486*G0_0_1_9_6 + 0.0450292564578355*G0_0_1_9_7 + 0.0450292564578354*G0_0_1_9_8 + 0.113988868274602*G0_0_1_9_9 + 0.00449920449920508*G0_1_0_0_0 - 0.000959604769128739*G0_1_0_0_1 - 0.000269783126926037*G0_1_0_0_2 - 0.00334311191454104*G0_1_0_0_3 + 0.00216503073645967*G0_1_0_0_4 + 0.00544640544640628*G0_1_0_0_5 - 0.0010537610537612*G0_1_0_0_6 - 0.00864320864321011*G0_1_0_0_7 - 0.0076131276131289*G0_1_0_0_8 - 0.00305472305472357*G0_1_0_0_9 - 0.000959604769128739*G0_1_0_1_0 + 0.00449920449920534*G0_1_0_1_1 - 0.000269783126926027*G0_1_0_1_2 + 0.0054464054464064*G0_1_0_1_3 - 0.00105376105376124*G0_1_0_1_4 - 0.00334311191454106*G0_1_0_1_5 + 0.00216503073645967*G0_1_0_1_6 - 0.0076131276131289*G0_1_0_1_7 - 0.00864320864321006*G0_1_0_1_8 - 0.00305472305472357*G0_1_0_1_9 - 0.000269783126926037*G0_1_0_2_0 - 0.000269783126926027*G0_1_0_2_1 - 0.00129789082170056*G0_1_0_2_2 - 0.00237476808905419*G0_1_0_2_3 + 0.00258027686599157*G0_1_0_2_4 - 0.00237476808905421*G0_1_0_2_5 + 0.00258027686599158*G0_1_0_2_6 - 0.00593861165289836*G0_1_0_2_7 - 0.00593861165289834*G0_1_0_2_8 - 0.0124523095951688*G0_1_0_2_9 - 0.00334311191454104*G0_1_0_3_0 + 0.00544640544640641*G0_1_0_3_1 - 0.00237476808905419*G0_1_0_3_2 - 0.00543456543456625*G0_1_0_3_3 + 0.00929356357927939*G0_1_0_3_4 + 0.00538889681746916*G0_1_0_3_5 + 0.00278578564292895*G0_1_0_3_6 + 0.0193102135959311*G0_1_0_3_7 - 0.0464069264069341*G0_1_0_3_8 - 0.0294562580276915*G0_1_0_3_9 + 0.00216503073645967*G0_1_0_4_0 - 0.00105376105376124*G0_1_0_4_1 + 0.00258027686599157*G0_1_0_4_2 + 0.00929356357927938*G0_1_0_4_3 - 0.00776366490652329*G0_1_0_4_4 + 0.00278578564292897*G0_1_0_4_5 - 0.00557157128585792*G0_1_0_4_6 + 0.00101993244850406*G0_1_0_4_7 + 0.027096712811003*G0_1_0_4_8 + 0.0317853574996486*G0_1_0_4_9 + 0.00544640544640629*G0_1_0_5_0 - 0.00334311191454106*G0_1_0_5_1 - 0.00237476808905421*G0_1_0_5_2 + 0.00538889681746916*G0_1_0_5_3 + 0.00278578564292897*G0_1_0_5_4 - 0.00543456543456649*G0_1_0_5_5 + 0.00929356357927947*G0_1_0_5_6 - 0.0464069264069342*G0_1_0_5_7 + 0.0193102135959312*G0_1_0_5_8 - 0.0294562580276916*G0_1_0_5_9 - 0.0010537610537612*G0_1_0_6_0 + 0.00216503073645967*G0_1_0_6_1 + 0.00258027686599158*G0_1_0_6_2 + 0.00278578564292895*G0_1_0_6_3 - 0.00557157128585792*G0_1_0_6_4 + 0.00929356357927947*G0_1_0_6_5 - 0.00776366490652337*G0_1_0_6_6 + 0.0270967128110031*G0_1_0_6_7 + 0.00101993244850401*G0_1_0_6_8 + 0.0317853574996486*G0_1_0_6_9 - 0.00864320864321011*G0_1_0_7_0 - 0.00761312761312891*G0_1_0_7_1 - 0.00593861165289836*G0_1_0_7_2 + 0.0193102135959311*G0_1_0_7_3 + 0.00101993244850406*G0_1_0_7_4 - 0.0464069264069342*G0_1_0_7_5 + 0.0270967128110031*G0_1_0_7_6 - 0.186267066267097*G0_1_0_7_7 + 0.0987051044194067*G0_1_0_7_8 - 0.0450292564578355*G0_1_0_7_9 - 0.00761312761312889*G0_1_0_8_0 - 0.00864320864321006*G0_1_0_8_1 - 0.00593861165289834*G0_1_0_8_2 - 0.0464069264069341*G0_1_0_8_3 + 0.027096712811003*G0_1_0_8_4 + 0.0193102135959312*G0_1_0_8_5 + 0.00101993244850401*G0_1_0_8_6 + 0.0987051044194067*G0_1_0_8_7 - 0.186267066267098*G0_1_0_8_8 - 0.0450292564578354*G0_1_0_8_9 - 0.00305472305472357*G0_1_0_9_0 - 0.00305472305472357*G0_1_0_9_1 - 0.0124523095951688*G0_1_0_9_2 - 0.0294562580276915*G0_1_0_9_3 + 0.0317853574996486*G0_1_0_9_4 - 0.0294562580276916*G0_1_0_9_5 + 0.0317853574996486*G0_1_0_9_6 - 0.0450292564578355*G0_1_0_9_7 - 0.0450292564578354*G0_1_0_9_8 - 0.113988868274602*G0_1_0_9_9; + A[119] = A[205] - 0.0374381174381239*G0_0_0_0_0 + 0.00181532752961356*G0_0_0_0_1 - 0.00810258524544382*G0_0_0_0_2 + 0.0139631796774679*G0_0_0_0_3 - 0.0213215356072537*G0_0_0_0_4 - 0.0212149755006935*G0_0_0_0_5 + 0.0127910185053062*G0_0_0_0_6 - 0.00451929023357675*G0_0_0_0_7 + 0.00390086104371889*G0_0_0_0_8 + 0.0147966319394915*G0_0_0_0_9 + 0.00181532752961356*G0_0_0_1_0 + 0.0774742717599993*G0_0_0_1_1 + 0.00166965309822474*G0_0_0_1_2 + 0.135523524094976*G0_0_0_1_3 - 0.0773093573093705*G0_0_0_1_4 - 0.0154359925788523*G0_0_0_1_5 - 0.0395433138290349*G0_0_0_1_6 - 0.0221112221112259*G0_0_0_1_7 + 0.0294429380143717*G0_0_0_1_8 - 0.0376537747966382*G0_0_0_1_9 - 0.00810258524544382*G0_0_0_2_0 + 0.00166965309822474*G0_0_0_2_1 - 0.0517171717171812*G0_0_0_2_2 + 0.0617668046239582*G0_0_0_2_3 - 0.10734408448696*G0_0_0_2_4 + 0.0126730412444721*G0_0_0_2_5 + 0.00312830027115748*G0_0_0_2_6 - 0.0124389895818488*G0_0_0_2_7 + 0.00562294848009231*G0_0_0_2_8 + 0.00100470957613827*G0_0_0_2_9 + 0.0139631796774679*G0_0_0_3_0 + 0.135523524094976*G0_0_0_3_1 + 0.0617668046239582*G0_0_0_3_2 + 0.465854145854225*G0_0_0_3_3 + 0.0263222491793966*G0_0_0_3_4 - 0.00325388896817537*G0_0_0_3_5 + 0.129556158127608*G0_0_0_3_6 - 0.0309633223918992*G0_0_0_3_7 + 0.036905951191672*G0_0_0_3_8 + 0.174887969173713*G0_0_0_3_9 - 0.0213215356072537*G0_0_0_4_0 - 0.0773093573093706*G0_0_0_4_1 - 0.10734408448696*G0_0_0_4_2 + 0.0263222491793966*G0_0_0_4_3 - 0.609265020693697*G0_0_0_4_4 + 0.0748908234622649*G0_0_0_4_5 - 0.204446981589874*G0_0_0_4_6 + 0.0451776794634014*G0_0_0_4_7 - 0.00594262879977276*G0_0_0_4_8 - 0.152795775652944*G0_0_0_4_9 - 0.0212149755006935*G0_0_0_5_0 - 0.0154359925788523*G0_0_0_5_1 + 0.0126730412444721*G0_0_0_5_2 - 0.00325388896817536*G0_0_0_5_3 + 0.0748908234622649*G0_0_0_5_4 - 0.487980590837816*G0_0_0_5_5 + 0.0441330098473033*G0_0_0_5_6 - 0.105477379763112*G0_0_0_5_7 + 0.0572341943770611*G0_0_0_5_8 - 0.158858284572597*G0_0_0_5_9 + 0.0127910185053062*G0_0_0_6_0 - 0.0395433138290349*G0_0_0_6_1 + 0.00312830027115747*G0_0_0_6_2 + 0.129556158127608*G0_0_0_6_3 - 0.204446981589874*G0_0_0_6_4 + 0.0441330098473033*G0_0_0_6_5 - 0.993429427715311*G0_0_0_6_6 + 0.0482431853860505*G0_0_0_6_7 + 0.0454174397031616*G0_0_0_6_8 - 0.262126444983632*G0_0_0_6_9 - 0.00451929023357674*G0_0_0_7_0 - 0.0221112221112259*G0_0_0_7_1 - 0.0124389895818488*G0_0_0_7_2 - 0.0309633223918992*G0_0_0_7_3 + 0.0451776794634014*G0_0_0_7_4 - 0.105477379763112*G0_0_0_7_5 + 0.0482431853860505*G0_0_0_7_6 - 0.147897816469269*G0_0_0_7_7 + 0.0383958898244676*G0_0_0_7_8 - 0.140876266590576*G0_0_0_7_9 + 0.00390086104371889*G0_0_0_8_0 + 0.0294429380143717*G0_0_0_8_1 + 0.00562294848009231*G0_0_0_8_2 + 0.036905951191672*G0_0_0_8_3 - 0.00594262879977277*G0_0_0_8_4 + 0.0572341943770611*G0_0_0_8_5 + 0.0454174397031616*G0_0_0_8_6 + 0.0383958898244676*G0_0_0_8_7 - 0.00959040959041112*G0_0_0_8_8 + 0.12484658198946*G0_0_0_8_9 + 0.0147966319394915*G0_0_0_9_0 - 0.0376537747966383*G0_0_0_9_1 + 0.00100470957613827*G0_0_0_9_2 + 0.174887969173713*G0_0_0_9_3 - 0.152795775652944*G0_0_0_9_4 - 0.158858284572597*G0_0_0_9_5 - 0.262126444983632*G0_0_0_9_6 - 0.140876266590576*G0_0_0_9_7 + 0.12484658198946*G0_0_0_9_8 - 0.373614956472162*G0_0_0_9_9 + 0.00450618164903957*G0_0_1_0_1 - 0.00450618164903957*G0_0_1_0_2 + 0.0202882831454296*G0_0_1_0_3 - 0.0202882831454296*G0_0_1_0_4 + 0.00816897388326092*G0_0_1_0_5 - 0.000456686170971986*G0_0_1_0_6 - 0.00816897388326104*G0_0_1_0_7 + 0.000456686170972034*G0_0_1_0_8 + 0.00450618164903957*G0_0_1_1_0 + 0.0905109705109859*G0_0_1_1_1 + 0.142543171114624*G0_0_1_1_3 - 0.0814157271300267*G0_0_1_1_4 - 0.00318538604252943*G0_0_1_1_5 - 0.0118110460967624*G0_0_1_1_6 - 0.0227696113410439*G0_0_1_1_7 + 0.0296579610865377*G0_0_1_1_8 - 0.0225146282289176*G0_0_1_1_9 - 0.00450618164903957*G0_0_1_2_0 - 0.0905109705109858*G0_0_1_2_2 + 0.0814157271300266*G0_0_1_2_3 - 0.142543171114624*G0_0_1_2_4 + 0.0227696113410437*G0_0_1_2_5 - 0.0296579610865375*G0_0_1_2_6 + 0.00318538604252942*G0_0_1_2_7 + 0.0118110460967624*G0_0_1_2_8 + 0.0225146282289177*G0_0_1_2_9 + 0.0202882831454296*G0_0_1_3_0 + 0.142543171114624*G0_0_1_3_1 + 0.0814157271300266*G0_0_1_3_2 + 0.596591979449223*G0_0_1_3_3 - 0.02565434565435*G0_0_1_3_5 + 0.0354331382902871*G0_0_1_3_6 - 0.0608648494362884*G0_0_1_3_7 + 0.0962979877265756*G0_0_1_3_8 + 0.18927358355933*G0_0_1_3_9 - 0.0202882831454296*G0_0_1_4_0 - 0.0814157271300267*G0_0_1_4_1 - 0.142543171114624*G0_0_1_4_2 - 0.596591979449224*G0_0_1_4_4 + 0.0608648494362884*G0_0_1_4_5 - 0.0962979877265754*G0_0_1_4_6 + 0.02565434565435*G0_0_1_4_7 - 0.0354331382902872*G0_0_1_4_8 - 0.18927358355933*G0_0_1_4_9 + 0.00816897388326092*G0_0_1_5_0 - 0.00318538604252943*G0_0_1_5_1 + 0.0227696113410437*G0_0_1_5_2 - 0.02565434565435*G0_0_1_5_3 + 0.0608648494362884*G0_0_1_5_4 - 0.0200713572142174*G0_0_1_5_5 - 0.0122106464963627*G0_0_1_5_6 + 0.00955615812758829*G0_0_1_5_8 - 0.0191123162551765*G0_0_1_5_9 - 0.000456686170971986*G0_0_1_6_0 - 0.0118110460967624*G0_0_1_6_1 - 0.0296579610865375*G0_0_1_6_2 + 0.0354331382902871*G0_0_1_6_3 - 0.0962979877265754*G0_0_1_6_4 - 0.0122106464963627*G0_0_1_6_5 - 0.0629199372056615*G0_0_1_6_6 - 0.00955615812758828*G0_0_1_6_7 - 0.138410161267327*G0_0_1_6_9 - 0.00816897388326104*G0_0_1_7_0 - 0.0227696113410439*G0_0_1_7_1 + 0.00318538604252942*G0_0_1_7_2 - 0.0608648494362884*G0_0_1_7_3 + 0.02565434565435*G0_0_1_7_4 - 0.00955615812758828*G0_0_1_7_6 + 0.0200713572142176*G0_0_1_7_7 + 0.0122106464963628*G0_0_1_7_8 + 0.0191123162551766*G0_0_1_7_9 + 0.000456686170972034*G0_0_1_8_0 + 0.0296579610865377*G0_0_1_8_1 + 0.0118110460967624*G0_0_1_8_2 + 0.0962979877265756*G0_0_1_8_3 - 0.0354331382902872*G0_0_1_8_4 + 0.00955615812758829*G0_0_1_8_5 + 0.0122106464963628*G0_0_1_8_7 + 0.0629199372056624*G0_0_1_8_8 + 0.138410161267328*G0_0_1_8_9 - 0.0225146282289176*G0_0_1_9_1 + 0.0225146282289177*G0_0_1_9_2 + 0.18927358355933*G0_0_1_9_3 - 0.18927358355933*G0_0_1_9_4 - 0.0191123162551765*G0_0_1_9_5 - 0.138410161267327*G0_0_1_9_6 + 0.0191123162551766*G0_0_1_9_7 + 0.138410161267328*G0_0_1_9_8 + 0.00348857491714696*G0_1_0_0_1 - 0.00348857491714697*G0_1_0_0_2 + 0.0216183816183854*G0_1_0_0_3 - 0.0216183816183854*G0_1_0_0_4 - 0.00397887826459294*G0_1_0_0_5 - 0.0228343085485984*G0_1_0_0_6 + 0.00397887826459347*G0_1_0_0_7 + 0.022834308548598*G0_1_0_0_8 + 0.00348857491714696*G0_1_0_1_0 + 0.0533434819149195*G0_1_0_1_1 + 0.114245754245774*G0_1_0_1_3 - 0.0679320679320795*G0_1_0_1_4 + 0.00683316683316801*G0_1_0_1_5 - 0.0309690309690363*G0_1_0_1_6 - 0.0171257314114486*G0_1_0_1_7 + 0.0460967603824824*G0_1_0_1_8 - 0.00639360639360745*G0_1_0_1_9 - 0.00348857491714697*G0_1_0_2_0 - 0.0533434819149201*G0_1_0_2_2 + 0.0679320679320796*G0_1_0_2_3 - 0.114245754245774*G0_1_0_2_4 + 0.0171257314114488*G0_1_0_2_5 - 0.0460967603824828*G0_1_0_2_6 - 0.00683316683316796*G0_1_0_2_7 + 0.0309690309690361*G0_1_0_2_8 + 0.00639360639360746*G0_1_0_2_9 + 0.0216183816183854*G0_1_0_3_0 + 0.114245754245774*G0_1_0_3_1 + 0.0679320679320796*G0_1_0_3_2 + 0.498461538461623*G0_1_0_3_3 - 0.0426773226773298*G0_1_0_3_5 + 0.0929070929071085*G0_1_0_3_6 - 0.0648551448551558*G0_1_0_3_7 + 0.157762237762264*G0_1_0_3_8 + 0.148891108891134*G0_1_0_3_9 - 0.0216183816183854*G0_1_0_4_0 - 0.0679320679320795*G0_1_0_4_1 - 0.114245754245774*G0_1_0_4_2 - 0.498461538461624*G0_1_0_4_4 + 0.0648551448551559*G0_1_0_4_5 - 0.157762237762265*G0_1_0_4_6 + 0.0426773226773298*G0_1_0_4_7 - 0.0929070929071085*G0_1_0_4_8 - 0.148891108891134*G0_1_0_4_9 - 0.00397887826459294*G0_1_0_5_0 + 0.00683316683316801*G0_1_0_5_1 + 0.0171257314114488*G0_1_0_5_2 - 0.0426773226773298*G0_1_0_5_3 + 0.0648551448551559*G0_1_0_5_4 + 0.00318538604252947*G0_1_0_5_5 + 0.128442985585864*G0_1_0_5_6 - 0.020499500499504*G0_1_0_5_8 + 0.0409990009990078*G0_1_0_5_9 - 0.0228343085485984*G0_1_0_6_0 - 0.0309690309690363*G0_1_0_6_1 - 0.0460967603824828*G0_1_0_6_2 + 0.0929070929071085*G0_1_0_6_3 - 0.157762237762265*G0_1_0_6_4 + 0.128442985585864*G0_1_0_6_5 - 0.750620807763792*G0_1_0_6_6 + 0.0204995004995038*G0_1_0_6_7 - 0.204995004995039*G0_1_0_6_9 + 0.00397887826459347*G0_1_0_7_0 - 0.0171257314114486*G0_1_0_7_1 - 0.00683316683316796*G0_1_0_7_2 - 0.0648551448551558*G0_1_0_7_3 + 0.0426773226773298*G0_1_0_7_4 + 0.0204995004995038*G0_1_0_7_6 - 0.00318538604252907*G0_1_0_7_7 - 0.128442985585864*G0_1_0_7_8 - 0.040999000999008*G0_1_0_7_9 + 0.022834308548598*G0_1_0_8_0 + 0.0460967603824824*G0_1_0_8_1 + 0.0309690309690361*G0_1_0_8_2 + 0.157762237762264*G0_1_0_8_3 - 0.0929070929071085*G0_1_0_8_4 - 0.020499500499504*G0_1_0_8_5 - 0.128442985585864*G0_1_0_8_7 + 0.750620807763792*G0_1_0_8_8 + 0.20499500499504*G0_1_0_8_9 - 0.00639360639360745*G0_1_0_9_1 + 0.00639360639360746*G0_1_0_9_2 + 0.148891108891134*G0_1_0_9_3 - 0.148891108891134*G0_1_0_9_4 + 0.0409990009990078*G0_1_0_9_5 - 0.204995004995039*G0_1_0_9_6 - 0.040999000999008*G0_1_0_9_7 + 0.20499500499504*G0_1_0_9_8 + 0.037438117438124*G0_1_1_0_0 + 0.00810258524544379*G0_1_1_0_1 - 0.00181532752961357*G0_1_1_0_2 + 0.0213215356072536*G0_1_1_0_3 - 0.0139631796774678*G0_1_1_0_4 + 0.00451929023357677*G0_1_1_0_5 - 0.00390086104371888*G0_1_1_0_6 + 0.0212149755006935*G0_1_1_0_7 - 0.0127910185053063*G0_1_1_0_8 - 0.0147966319394915*G0_1_1_0_9 + 0.00810258524544379*G0_1_1_1_0 + 0.0517171717171805*G0_1_1_1_1 - 0.00166965309822485*G0_1_1_1_2 + 0.10734408448696*G0_1_1_1_3 - 0.061766804623958*G0_1_1_1_4 + 0.0124389895818488*G0_1_1_1_5 - 0.0056229484800923*G0_1_1_1_6 - 0.012673041244472*G0_1_1_1_7 - 0.00312830027115793*G0_1_1_1_8 - 0.00100470957613826*G0_1_1_1_9 - 0.00181532752961357*G0_1_1_2_0 - 0.00166965309822485*G0_1_1_2_1 - 0.0774742717599992*G0_1_1_2_2 + 0.0773093573093704*G0_1_1_2_3 - 0.135523524094976*G0_1_1_2_4 + 0.0221112221112259*G0_1_1_2_5 - 0.0294429380143716*G0_1_1_2_6 + 0.0154359925788523*G0_1_1_2_7 + 0.0395433138290347*G0_1_1_2_8 + 0.0376537747966383*G0_1_1_2_9 + 0.0213215356072536*G0_1_1_3_0 + 0.10734408448696*G0_1_1_3_1 + 0.0773093573093704*G0_1_1_3_2 + 0.609265020693695*G0_1_1_3_3 - 0.0263222491793962*G0_1_1_3_4 - 0.0451776794634013*G0_1_1_3_5 + 0.00594262879977268*G0_1_1_3_6 - 0.0748908234622647*G0_1_1_3_7 + 0.204446981589873*G0_1_1_3_8 + 0.152795775652944*G0_1_1_3_9 - 0.0139631796774678*G0_1_1_4_0 - 0.061766804623958*G0_1_1_4_1 - 0.135523524094976*G0_1_1_4_2 - 0.0263222491793962*G0_1_1_4_3 - 0.465854145854226*G0_1_1_4_4 + 0.0309633223918991*G0_1_1_4_5 - 0.0369059511916718*G0_1_1_4_6 + 0.00325388896817519*G0_1_1_4_7 - 0.129556158127608*G0_1_1_4_8 - 0.174887969173713*G0_1_1_4_9 + 0.00451929023357677*G0_1_1_5_0 + 0.0124389895818488*G0_1_1_5_1 + 0.0221112221112258*G0_1_1_5_2 - 0.0451776794634013*G0_1_1_5_3 + 0.0309633223918991*G0_1_1_5_4 + 0.14789781646927*G0_1_1_5_5 - 0.0383958898244677*G0_1_1_5_6 + 0.105477379763112*G0_1_1_5_7 - 0.0482431853860506*G0_1_1_5_8 + 0.140876266590576*G0_1_1_5_9 - 0.00390086104371888*G0_1_1_6_0 - 0.0056229484800923*G0_1_1_6_1 - 0.0294429380143716*G0_1_1_6_2 + 0.00594262879977268*G0_1_1_6_3 - 0.0369059511916718*G0_1_1_6_4 - 0.0383958898244677*G0_1_1_6_5 + 0.00959040959041128*G0_1_1_6_6 - 0.0572341943770611*G0_1_1_6_7 - 0.0454174397031616*G0_1_1_6_8 - 0.12484658198946*G0_1_1_6_9 + 0.0212149755006935*G0_1_1_7_0 - 0.012673041244472*G0_1_1_7_1 + 0.0154359925788523*G0_1_1_7_2 - 0.0748908234622647*G0_1_1_7_3 + 0.00325388896817519*G0_1_1_7_4 + 0.105477379763112*G0_1_1_7_5 - 0.0572341943770611*G0_1_1_7_6 + 0.487980590837816*G0_1_1_7_7 - 0.044133009847303*G0_1_1_7_8 + 0.158858284572597*G0_1_1_7_9 - 0.0127910185053063*G0_1_1_8_0 - 0.00312830027115793*G0_1_1_8_1 + 0.0395433138290347*G0_1_1_8_2 + 0.204446981589873*G0_1_1_8_3 - 0.129556158127608*G0_1_1_8_4 - 0.0482431853860506*G0_1_1_8_5 - 0.0454174397031616*G0_1_1_8_6 - 0.044133009847303*G0_1_1_8_7 + 0.993429427715311*G0_1_1_8_8 + 0.262126444983632*G0_1_1_8_9 - 0.0147966319394915*G0_1_1_9_0 - 0.00100470957613826*G0_1_1_9_1 + 0.0376537747966383*G0_1_1_9_2 + 0.152795775652944*G0_1_1_9_3 - 0.174887969173713*G0_1_1_9_4 + 0.140876266590576*G0_1_1_9_5 - 0.12484658198946*G0_1_1_9_6 + 0.158858284572597*G0_1_1_9_7 + 0.262126444983632*G0_1_1_9_8 + 0.373614956472162*G0_1_1_9_9; + A[214] = A[119] + 0.00217179645751113*G0_0_0_0_0 - 0.00177008177008201*G0_0_0_0_2 - 0.00617668046239585*G0_0_0_0_3 - 0.0220579420579458*G0_0_0_0_4 + 0.00453261024689675*G0_0_0_0_5 - 0.0270929070929116*G0_0_0_0_6 + 0.00698729841587104*G0_0_0_0_7 - 0.00197516768945375*G0_0_0_0_8 - 0.0288854003139766*G0_0_0_0_9 - 0.00217179645751106*G0_0_0_1_1 + 0.00177008177008213*G0_0_0_1_2 - 0.00453261024689677*G0_0_0_1_3 + 0.0270929070929117*G0_0_0_1_4 + 0.00617668046239579*G0_0_0_1_5 + 0.0220579420579459*G0_0_0_1_6 + 0.00197516768945374*G0_0_0_1_7 - 0.00698729841587101*G0_0_0_1_8 + 0.0288854003139766*G0_0_0_1_9 - 0.00177008177008201*G0_0_0_2_0 + 0.00177008177008213*G0_0_0_2_1 - 0.0133200133200158*G0_0_0_2_3 + 0.0921744921745083*G0_0_0_2_4 + 0.0133200133200153*G0_0_0_2_5 - 0.0921744921745071*G0_0_0_2_6 - 0.00303696303696356*G0_0_0_2_7 + 0.00303696303696353*G0_0_0_2_8 - 0.00617668046239585*G0_0_0_3_0 - 0.00453261024689677*G0_0_0_3_1 - 0.0133200133200158*G0_0_0_3_2 - 0.0872727272727418*G0_0_0_3_3 - 0.130429570429593*G0_0_0_3_4 - 0.0661738261738375*G0_0_0_3_6 + 0.0185300413871873*G0_0_0_3_7 - 0.00941915227629667*G0_0_0_3_8 - 0.123716283716304*G0_0_0_3_9 - 0.0220579420579458*G0_0_0_4_0 + 0.0270929070929117*G0_0_0_4_1 + 0.0921744921745083*G0_0_0_4_2 - 0.130429570429593*G0_0_0_4_3 - 0.268531468531513*G0_0_0_4_4 + 0.0661738261738371*G0_0_0_4_5 + 0.037642357642364*G0_0_0_4_7 - 0.00911088911089064*G0_0_0_4_8 - 0.132347652347675*G0_0_0_4_9 + 0.00453261024689675*G0_0_0_5_0 + 0.00617668046239579*G0_0_0_5_1 + 0.0133200133200153*G0_0_0_5_2 + 0.0661738261738372*G0_0_0_5_4 + 0.0872727272727422*G0_0_0_5_5 + 0.130429570429592*G0_0_0_5_6 + 0.00941915227629674*G0_0_0_5_7 - 0.0185300413871874*G0_0_0_5_8 + 0.123716283716304*G0_0_0_5_9 - 0.0270929070929116*G0_0_0_6_0 + 0.0220579420579459*G0_0_0_6_1 - 0.0921744921745071*G0_0_0_6_2 - 0.0661738261738375*G0_0_0_6_3 + 0.130429570429592*G0_0_0_6_5 + 0.268531468531515*G0_0_0_6_6 + 0.00911088911089068*G0_0_0_6_7 - 0.037642357642364*G0_0_0_6_8 + 0.132347652347675*G0_0_0_6_9 + 0.00698729841587104*G0_0_0_7_0 + 0.00197516768945374*G0_0_0_7_1 - 0.00303696303696356*G0_0_0_7_2 + 0.0185300413871873*G0_0_0_7_3 + 0.037642357642364*G0_0_0_7_4 + 0.00941915227629674*G0_0_0_7_5 + 0.00911088911089068*G0_0_0_7_6 + 0.0067817896389337*G0_0_0_7_7 + 0.0684344227201485*G0_0_0_7_9 - 0.00197516768945375*G0_0_0_8_0 - 0.00698729841587101*G0_0_0_8_1 + 0.00303696303696353*G0_0_0_8_2 - 0.00941915227629667*G0_0_0_8_3 - 0.00911088911089064*G0_0_0_8_4 - 0.0185300413871874*G0_0_0_8_5 - 0.037642357642364*G0_0_0_8_6 - 0.00678178963893352*G0_0_0_8_8 - 0.0684344227201485*G0_0_0_8_9 - 0.0288854003139766*G0_0_0_9_0 + 0.0288854003139766*G0_0_0_9_1 - 0.123716283716304*G0_0_0_9_3 - 0.132347652347675*G0_0_0_9_4 + 0.123716283716304*G0_0_0_9_5 + 0.132347652347675*G0_0_0_9_6 + 0.0684344227201486*G0_0_0_9_7 - 0.0684344227201485*G0_0_0_9_8 + 0.00153412724841325*G0_0_1_0_0 + 0.000768120768120898*G0_0_1_0_1 + 0.00607836607836714*G0_0_1_0_2 - 0.0139175110603706*G0_0_1_0_3 + 0.00722705865563135*G0_0_1_0_4 - 0.00166119594691045*G0_0_1_0_5 - 0.00387041529898738*G0_0_1_0_6 + 0.00505970220256026*G0_0_1_0_7 - 0.00393130678845036*G0_0_1_0_8 - 0.0149108034822345*G0_0_1_0_9 + 0.000768120768120898*G0_0_1_1_0 - 0.014421134421137*G0_0_1_1_1 + 0.00945720945721108*G0_0_1_1_2 - 0.00396175253318186*G0_0_1_1_3 + 0.0488768374482744*G0_0_1_1_4 - 0.00187241330098505*G0_0_1_1_5 + 0.0087855002140731*G0_0_1_1_6 + 0.00253841396698589*G0_0_1_1_7 - 0.0123952238237975*G0_0_1_1_8 + 0.0252547452547495*G0_0_1_1_9 + 0.00607836607836714*G0_0_1_2_0 + 0.00945720945721108*G0_0_1_2_1 + 0.0989824989825157*G0_0_1_2_2 - 0.0457942057942136*G0_0_1_2_3 + 0.164235764235792*G0_0_1_2_4 - 0.0234165834165873*G0_0_1_2_5 + 0.0267732267732313*G0_0_1_2_6 - 0.00447552447552522*G0_0_1_2_7 + 0.0124675324675346*G0_0_1_2_9 - 0.0139175110603706*G0_0_1_3_0 - 0.00396175253318186*G0_0_1_3_1 - 0.0457942057942136*G0_0_1_3_2 - 0.122380476666212*G0_0_1_3_3 - 0.251028971029014*G0_0_1_3_4 + 0.0293877551020458*G0_0_1_3_5 - 0.0377622377622441*G0_0_1_3_6 + 0.0303467960610869*G0_0_1_3_7 - 0.0188211788211821*G0_0_1_3_8 - 0.136457827886422*G0_0_1_3_9 + 0.00722705865563135*G0_0_1_4_0 + 0.0488768374482744*G0_0_1_4_1 + 0.164235764235792*G0_0_1_4_2 - 0.251028971029014*G0_0_1_4_3 + 0.488391608391691*G0_0_1_4_4 - 0.0330869130869187*G0_0_1_4_5 + 0.0708491508491627*G0_0_1_4_6 + 0.00157556728985332*G0_0_1_4_7 - 0.0115256172399048*G0_0_1_4_8 + 0.0287712287712332*G0_0_1_4_9 - 0.00166119594691045*G0_0_1_5_0 - 0.00187241330098505*G0_0_1_5_1 - 0.0234165834165873*G0_0_1_5_2 + 0.0293877551020458*G0_0_1_5_3 - 0.0330869130869187*G0_0_1_5_4 + 0.0277094334237235*G0_0_1_5_5 + 0.0224175824175861*G0_0_1_5_6 + 0.00376766091051869*G0_0_1_5_7 - 0.0057884972170696*G0_0_1_5_8 + 0.0563094048808428*G0_0_1_5_9 - 0.00387041529898738*G0_0_1_6_0 + 0.0087855002140731*G0_0_1_6_1 + 0.0267732267732313*G0_0_1_6_2 - 0.0377622377622441*G0_0_1_6_3 + 0.0708491508491627*G0_0_1_6_4 + 0.0224175824175861*G0_0_1_6_5 - 0.0210989010989054*G0_0_1_6_6 + 0.00202083630655091*G0_0_1_6_7 - 0.00753532182103732*G0_0_1_6_8 + 0.0381218781218843*G0_0_1_6_9 + 0.00505970220256026*G0_0_1_7_0 + 0.00253841396698589*G0_0_1_7_1 - 0.00447552447552522*G0_0_1_7_2 + 0.0303467960610869*G0_0_1_7_3 + 0.00157556728985332*G0_0_1_7_4 + 0.00376766091051869*G0_0_1_7_5 + 0.00202083630655091*G0_0_1_7_6 + 0.0192150706436455*G0_0_1_7_7 + 0.0104295704295723*G0_0_1_7_8 + 0.0406907378336019*G0_0_1_7_9 - 0.00393130678845036*G0_0_1_8_0 - 0.0123952238237975*G0_0_1_8_1 - 0.0188211788211821*G0_0_1_8_3 - 0.0115256172399048*G0_0_1_8_4 - 0.0057884972170696*G0_0_1_8_5 - 0.00753532182103732*G0_0_1_8_6 + 0.0104295704295723*G0_0_1_8_7 - 0.0193178250321143*G0_0_1_8_8 - 0.0527130012844387*G0_0_1_8_9 - 0.0149108034822345*G0_0_1_9_0 + 0.0252547452547495*G0_0_1_9_1 + 0.0124675324675346*G0_0_1_9_2 - 0.136457827886422*G0_0_1_9_3 + 0.0287712287712332*G0_0_1_9_4 + 0.0563094048808428*G0_0_1_9_5 + 0.0381218781218843*G0_0_1_9_6 + 0.0406907378336019*G0_0_1_9_7 - 0.0527130012844387*G0_0_1_9_8 + 0.114673897531059*G0_0_1_9_9 - 0.0122493379636261*G0_1_0_0_0 + 0.000768120768120879*G0_1_0_0_1 + 0.00768712768712903*G0_1_0_0_2 - 0.00804909376338087*G0_1_0_0_3 - 0.0132724418438727*G0_1_0_0_4 + 0.000570857713714835*G0_1_0_0_5 + 0.0217839303553628*G0_1_0_0_6 - 0.00540792540792656*G0_1_0_0_7 + 0.0005632462775322*G0_1_0_0_8 - 0.00363065505922714*G0_1_0_0_9 + 0.000768120768120879*G0_1_0_1_0 - 0.000637669209097858*G0_1_0_1_1 + 0.00784844784844922*G0_1_0_1_2 - 0.00619380619380726*G0_1_0_1_3 + 0.0232224917939243*G0_1_0_1_4 - 0.00774083059797478*G0_1_0_1_5 + 0.0292850007135772*G0_1_0_1_6 - 0.0019561390989966*G0_1_0_1_7 - 0.00192759621331081*G0_1_0_1_8 + 0.013974596831742*G0_1_0_1_9 + 0.00768712768712903*G0_1_0_2_0 + 0.00784844784844922*G0_1_0_2_1 + 0.0989824989825161*G0_1_0_2_2 - 0.036736596736603*G0_1_0_2_3 + 0.118947718947739*G0_1_0_2_4 - 0.032474192474198*G0_1_0_2_5 + 0.0720612720612844*G0_1_0_2_6 - 0.00299700299700352*G0_1_0_2_7 - 0.00143856143856167*G0_1_0_2_8 + 0.0124675324675345*G0_1_0_2_9 - 0.00804909376338087*G0_1_0_3_0 - 0.00619380619380726*G0_1_0_3_1 - 0.036736596736603*G0_1_0_3_2 - 0.0595632938490181*G0_1_0_3_3 - 0.108011988012006*G0_1_0_3_4 + 0.0293877551020457*G0_1_0_3_5 - 0.0992607392607559*G0_1_0_3_6 + 0.0127415441701178*G0_1_0_3_7 - 0.00565149136577809*G0_1_0_3_8 - 0.0674068788354616*G0_1_0_3_9 - 0.0132724418438727*G0_1_0_4_0 + 0.0232224917939243*G0_1_0_4_1 + 0.118947718947739*G0_1_0_4_2 - 0.108011988012006*G0_1_0_4_3 - 0.289630369630418*G0_1_0_4_4 + 0.0284115884115932*G0_1_0_4_5 + 0.0708491508491627*G0_1_0_4_6 + 0.0301070358213267*G0_1_0_4_7 - 0.00709005280433965*G0_1_0_4_8 - 0.0942257742257903*G0_1_0_4_9 + 0.000570857713714834*G0_1_0_5_0 - 0.00774083059797478*G0_1_0_5_1 - 0.032474192474198*G0_1_0_5_2 + 0.0293877551020457*G0_1_0_5_3 + 0.0284115884115932*G0_1_0_5_4 - 0.0351077493934696*G0_1_0_5_5 - 0.120599400599421*G0_1_0_5_6 - 0.00940202654488542*G0_1_0_5_7 + 0.0118167546738995*G0_1_0_5_8 - 0.0127415441701177*G0_1_0_5_9 + 0.0217839303553628*G0_1_0_6_0 + 0.0292850007135772*G0_1_0_6_1 + 0.0720612720612844*G0_1_0_6_2 - 0.0992607392607559*G0_1_0_6_3 + 0.0708491508491627*G0_1_0_6_4 - 0.120599400599421*G0_1_0_6_5 + 0.756923076923205*G0_1_0_6_6 - 0.00241472812901405*G0_1_0_6_7 - 0.0360667903525106*G0_1_0_6_8 + 0.161118881118908*G0_1_0_6_9 - 0.00540792540792656*G0_1_0_7_0 - 0.0019561390989966*G0_1_0_7_1 - 0.00299700299700352*G0_1_0_7_2 + 0.0127415441701178*G0_1_0_7_3 + 0.0301070358213267*G0_1_0_7_4 - 0.00940202654488542*G0_1_0_7_5 - 0.00241472812901405*G0_1_0_7_6 - 0.0125360353931815*G0_1_0_7_7 + 0.0104295704295724*G0_1_0_7_8 + 0.0157214214357097*G0_1_0_7_9 + 0.000563246277532199*G0_1_0_8_0 - 0.00192759621331081*G0_1_0_8_1 - 0.00143856143856167*G0_1_0_8_2 - 0.00565149136577809*G0_1_0_8_3 - 0.00709005280433965*G0_1_0_8_4 + 0.0118167546738995*G0_1_0_8_5 - 0.0360667903525106*G0_1_0_8_6 + 0.0104295704295724*G0_1_0_8_7 + 0.0124332810047112*G0_1_0_8_8 - 0.0277436848865467*G0_1_0_8_9 - 0.00363065505922714*G0_1_0_9_0 + 0.013974596831742*G0_1_0_9_1 + 0.0124675324675345*G0_1_0_9_2 - 0.0674068788354616*G0_1_0_9_3 - 0.0942257742257903*G0_1_0_9_4 - 0.0127415441701177*G0_1_0_9_5 + 0.161118881118908*G0_1_0_9_6 + 0.0157214214357097*G0_1_0_9_7 - 0.0277436848865467*G0_1_0_9_8 + 0.114673897531059*G0_1_0_9_9 - 0.0284211027068221*G0_1_1_0_0 + 0.00076812076812089*G0_1_1_0_1 + 0.00514829086257746*G0_1_1_0_2 + 0.000919080919081066*G0_1_1_0_3 + 0.00500071357214301*G0_1_1_0_4 - 0.00531849103277774*G0_1_1_0_5 + 0.00583036011607543*G0_1_1_0_6 - 0.0462147376433171*G0_1_1_0_7 + 0.0273859473859521*G0_1_1_0_8 + 0.0262822891394364*G0_1_1_0_9 + 0.00076812076812089*G0_1_1_1_0 + 0.0155340955340983*G0_1_1_1_1 + 0.0103872846730007*G0_1_1_1_2 - 0.000304457447314617*G0_1_1_1_3 + 0.0391760620332116*G0_1_1_1_4 - 0.0167090052804367*G0_1_1_1_5 + 0.0110118452975615*G0_1_1_1_6 - 0.0287788402074166*G0_1_1_1_7 + 0.0388792160220798*G0_1_1_1_8 - 0.0159383473669215*G0_1_1_1_9 + 0.00514829086257746*G0_1_1_2_0 + 0.0103872846730007*G0_1_1_2_1 + 0.0989824989825156*G0_1_1_2_2 - 0.0407326007326076*G0_1_1_2_3 + 0.155431235431262*G0_1_1_2_4 - 0.0284781884781933*G0_1_1_2_5 + 0.0355777555777616*G0_1_1_2_6 - 0.0158355929784528*G0_1_1_2_7 + 0.0114000285428876*G0_1_1_2_8 + 0.0124675324675345*G0_1_1_2_9 + 0.000919080919081069*G0_1_1_3_0 - 0.000304457447314617*G0_1_1_3_1 - 0.0407326007326076*G0_1_1_3_2 + 0.0390466676181029*G0_1_1_3_3 - 0.248305979734593*G0_1_1_3_4 + 0.0293877551020457*G0_1_1_3_5 - 0.044441273012709*G0_1_1_3_6 - 0.0141629798772679*G0_1_1_3_7 + 0.0597688026259555*G0_1_1_3_8 + 0.0761410018553005*G0_1_1_3_9 + 0.00500071357214301*G0_1_1_4_0 + 0.0391760620332116*G0_1_1_4_1 + 0.155431235431262*G0_1_1_4_2 - 0.248305979734593*G0_1_1_4_3 + 0.449550449550525*G0_1_1_4_4 - 0.0264078778364536*G0_1_1_4_5 + 0.0708491508491627*G0_1_1_4_6 + 0.0219551876694772*G0_1_1_4_7 - 0.0456058227486875*G0_1_1_4_8 + 0.0154131582703034*G0_1_1_4_9 - 0.00531849103277775*G0_1_1_5_0 - 0.0167090052804367*G0_1_1_5_1 - 0.0284781884781933*G0_1_1_5_2 + 0.0293877551020457*G0_1_1_5_3 - 0.0264078778364536*G0_1_1_5_4 - 0.133717710860591*G0_1_1_5_5 + 0.0196945911231659*G0_1_1_5_6 - 0.0748223205366189*G0_1_1_5_7 + 0.0387212787212852*G0_1_1_5_8 - 0.15628942486088*G0_1_1_5_9 + 0.00583036011607543*G0_1_1_6_0 + 0.0110118452975615*G0_1_1_6_1 + 0.0355777555777616*G0_1_1_6_2 - 0.044441273012709*G0_1_1_6_3 + 0.0708491508491627*G0_1_1_6_4 + 0.0196945911231659*G0_1_1_6_5 + 0.0177422577422606*G0_1_1_6_6 + 0.0361010418153336*G0_1_1_6_7 - 0.0279149422006611*G0_1_1_6_8 + 0.0514799486228144*G0_1_1_6_9 - 0.0462147376433171*G0_1_1_7_0 - 0.0287788402074166*G0_1_1_7_1 - 0.0158355929784528*G0_1_1_7_2 - 0.0141629798772679*G0_1_1_7_3 + 0.0219551876694772*G0_1_1_7_4 - 0.0748223205366189*G0_1_1_7_5 + 0.0361010418153336*G0_1_1_7_6 - 0.246713286713329*G0_1_1_7_7 + 0.0104295704295723*G0_1_1_7_8 - 0.151048951048977*G0_1_1_7_9 + 0.0273859473859521*G0_1_1_8_0 + 0.0388792160220798*G0_1_1_8_1 + 0.0114000285428876*G0_1_1_8_2 + 0.0597688026259555*G0_1_1_8_3 - 0.0456058227486875*G0_1_1_8_4 + 0.0387212787212852*G0_1_1_8_5 - 0.0279149422006611*G0_1_1_8_6 + 0.0104295704295723*G0_1_1_8_7 + 0.246610532324859*G0_1_1_8_8 + 0.13902668759814*G0_1_1_8_9 + 0.0262822891394364*G0_1_1_9_0 - 0.0159383473669215*G0_1_1_9_1 + 0.0124675324675345*G0_1_1_9_2 + 0.0761410018553005*G0_1_1_9_3 + 0.0154131582703034*G0_1_1_9_4 - 0.15628942486088*G0_1_1_9_5 + 0.0514799486228144*G0_1_1_9_6 - 0.151048951048977*G0_1_1_9_7 + 0.13902668759814*G0_1_1_9_8 + 0.11467389753106*G0_1_1_9_9; + A[220] = A[164] - 0.00888000888001068*G0_0_1_0_0 + 0.000571914857629231*G0_0_1_0_2 + 0.00150135578707032*G0_0_1_0_3 - 0.00332239189382103*G0_0_1_0_4 - 0.0018914418914423*G0_0_1_0_5 - 0.000955235240949639*G0_0_1_0_6 + 0.0113220113220131*G0_0_1_0_7 - 0.00692260120831664*G0_0_1_0_8 + 0.0163493649207962*G0_0_1_0_9 + 0.00888000888001063*G0_0_1_1_1 - 0.000571914857629241*G0_0_1_1_2 + 0.00189144189144225*G0_0_1_1_3 + 0.000955235240949653*G0_0_1_1_4 - 0.00150135578707032*G0_0_1_1_5 + 0.00332239189382105*G0_0_1_1_6 + 0.00692260120831662*G0_0_1_1_7 - 0.0113220113220131*G0_0_1_1_8 - 0.0163493649207962*G0_0_1_1_9 + 0.000571914857629231*G0_0_1_2_0 - 0.000571914857629242*G0_0_1_2_1 + 0.00427001569858787*G0_0_1_2_3 - 0.00427001569858785*G0_0_1_2_5 + 0.00252319109462009*G0_0_1_2_7 - 0.00252319109462007*G0_0_1_2_8 + 0.00150135578707032*G0_0_1_3_0 + 0.00189144189144225*G0_0_1_3_1 + 0.00427001569858787*G0_0_1_3_2 - 0.00352790067075864*G0_0_1_3_3 - 0.0159098044812357*G0_0_1_3_4 - 0.00996717568146313*G0_0_1_3_6 - 0.00450406736121103*G0_0_1_3_7 - 0.00306550592264925*G0_0_1_3_8 + 0.0580562294848106*G0_0_1_3_9 - 0.00332239189382103*G0_0_1_4_0 + 0.000955235240949654*G0_0_1_4_1 - 0.0159098044812357*G0_0_1_4_3 - 0.0245925503068405*G0_0_1_4_4 + 0.0099671756814631*G0_0_1_4_5 + 0.00119880119880142*G0_0_1_4_7 + 0.00756957328386024*G0_0_1_4_8 - 0.0199343513629262*G0_0_1_4_9 - 0.0018914418914423*G0_0_1_5_0 - 0.00150135578707032*G0_0_1_5_1 - 0.00427001569858785*G0_0_1_5_2 + 0.0099671756814631*G0_0_1_5_4 + 0.00352790067075858*G0_0_1_5_5 + 0.0159098044812357*G0_0_1_5_6 + 0.00306550592264929*G0_0_1_5_7 + 0.004504067361211*G0_0_1_5_8 - 0.0580562294848106*G0_0_1_5_9 - 0.000955235240949639*G0_0_1_6_0 + 0.00332239189382105*G0_0_1_6_1 - 0.00996717568146313*G0_0_1_6_3 + 0.0159098044812357*G0_0_1_6_5 + 0.0245925503068408*G0_0_1_6_6 - 0.00756957328386025*G0_0_1_6_7 - 0.0011988011988015*G0_0_1_6_8 + 0.0199343513629263*G0_0_1_6_9 + 0.0113220113220131*G0_0_1_7_0 + 0.00692260120831662*G0_0_1_7_1 + 0.00252319109462009*G0_0_1_7_2 - 0.00450406736121103*G0_0_1_7_3 + 0.00119880119880142*G0_0_1_7_4 + 0.00306550592264929*G0_0_1_7_5 - 0.00756957328386025*G0_0_1_7_6 + 0.265106322249224*G0_0_1_7_7 - 0.033908948194668*G0_0_1_7_9 - 0.00692260120831664*G0_0_1_8_0 - 0.0113220113220131*G0_0_1_8_1 - 0.00252319109462007*G0_0_1_8_2 - 0.00306550592264925*G0_0_1_8_3 + 0.00756957328386024*G0_0_1_8_4 + 0.004504067361211*G0_0_1_8_5 - 0.0011988011988015*G0_0_1_8_6 - 0.265106322249224*G0_0_1_8_8 + 0.0339089481946681*G0_0_1_8_9 + 0.0163493649207962*G0_0_1_9_0 - 0.0163493649207962*G0_0_1_9_1 + 0.0580562294848106*G0_0_1_9_3 - 0.0199343513629262*G0_0_1_9_4 - 0.0580562294848106*G0_0_1_9_5 + 0.0199343513629263*G0_0_1_9_6 - 0.033908948194668*G0_0_1_9_7 + 0.0339089481946681*G0_0_1_9_8 + 0.00888000888001068*G0_1_0_0_0 - 0.000571914857629231*G0_1_0_0_2 - 0.00150135578707032*G0_1_0_0_3 + 0.00332239189382103*G0_1_0_0_4 + 0.0018914418914423*G0_1_0_0_5 + 0.000955235240949639*G0_1_0_0_6 - 0.0113220113220131*G0_1_0_0_7 + 0.00692260120831664*G0_1_0_0_8 - 0.0163493649207962*G0_1_0_0_9 - 0.00888000888001063*G0_1_0_1_1 + 0.000571914857629241*G0_1_0_1_2 - 0.00189144189144225*G0_1_0_1_3 - 0.000955235240949653*G0_1_0_1_4 + 0.00150135578707032*G0_1_0_1_5 - 0.00332239189382105*G0_1_0_1_6 - 0.00692260120831662*G0_1_0_1_7 + 0.0113220113220131*G0_1_0_1_8 + 0.0163493649207962*G0_1_0_1_9 - 0.000571914857629231*G0_1_0_2_0 + 0.000571914857629241*G0_1_0_2_1 - 0.00427001569858787*G0_1_0_2_3 + 0.00427001569858785*G0_1_0_2_5 - 0.00252319109462009*G0_1_0_2_7 + 0.00252319109462007*G0_1_0_2_8 - 0.00150135578707032*G0_1_0_3_0 - 0.00189144189144225*G0_1_0_3_1 - 0.00427001569858787*G0_1_0_3_2 + 0.00352790067075864*G0_1_0_3_3 + 0.0159098044812357*G0_1_0_3_4 + 0.00996717568146313*G0_1_0_3_6 + 0.00450406736121103*G0_1_0_3_7 + 0.00306550592264925*G0_1_0_3_8 - 0.0580562294848106*G0_1_0_3_9 + 0.00332239189382103*G0_1_0_4_0 - 0.000955235240949654*G0_1_0_4_1 + 0.0159098044812357*G0_1_0_4_3 + 0.0245925503068405*G0_1_0_4_4 - 0.0099671756814631*G0_1_0_4_5 - 0.00119880119880142*G0_1_0_4_7 - 0.00756957328386024*G0_1_0_4_8 + 0.0199343513629262*G0_1_0_4_9 + 0.0018914418914423*G0_1_0_5_0 + 0.00150135578707032*G0_1_0_5_1 + 0.00427001569858785*G0_1_0_5_2 - 0.0099671756814631*G0_1_0_5_4 - 0.00352790067075858*G0_1_0_5_5 - 0.0159098044812357*G0_1_0_5_6 - 0.00306550592264929*G0_1_0_5_7 - 0.004504067361211*G0_1_0_5_8 + 0.0580562294848106*G0_1_0_5_9 + 0.000955235240949639*G0_1_0_6_0 - 0.00332239189382105*G0_1_0_6_1 + 0.00996717568146313*G0_1_0_6_3 - 0.0159098044812357*G0_1_0_6_5 - 0.0245925503068408*G0_1_0_6_6 + 0.00756957328386025*G0_1_0_6_7 + 0.0011988011988015*G0_1_0_6_8 - 0.0199343513629263*G0_1_0_6_9 - 0.0113220113220131*G0_1_0_7_0 - 0.00692260120831662*G0_1_0_7_1 - 0.00252319109462009*G0_1_0_7_2 + 0.00450406736121103*G0_1_0_7_3 - 0.00119880119880142*G0_1_0_7_4 - 0.00306550592264929*G0_1_0_7_5 + 0.00756957328386025*G0_1_0_7_6 - 0.265106322249224*G0_1_0_7_7 + 0.033908948194668*G0_1_0_7_9 + 0.00692260120831664*G0_1_0_8_0 + 0.0113220113220131*G0_1_0_8_1 + 0.00252319109462007*G0_1_0_8_2 + 0.00306550592264925*G0_1_0_8_3 - 0.00756957328386024*G0_1_0_8_4 - 0.004504067361211*G0_1_0_8_5 + 0.0011988011988015*G0_1_0_8_6 + 0.265106322249224*G0_1_0_8_8 - 0.0339089481946681*G0_1_0_8_9 - 0.0163493649207962*G0_1_0_9_0 + 0.0163493649207962*G0_1_0_9_1 - 0.0580562294848106*G0_1_0_9_3 + 0.0199343513629262*G0_1_0_9_4 + 0.0580562294848106*G0_1_0_9_5 - 0.0199343513629263*G0_1_0_9_6 + 0.033908948194668*G0_1_0_9_7 - 0.0339089481946681*G0_1_0_9_8; + A[197] = -A[182] - 0.00209991067133958*G0_0_1_0_0 - 0.0015986482653152*G0_0_1_0_2 - 0.00168593311450483*G0_0_1_0_3 + 0.00137862137862162*G0_0_1_0_4 + 0.00292945150088058*G0_0_1_0_5 - 0.00446220446220523*G0_0_1_0_6 - 0.00135388421102729*G0_0_1_0_7 + 0.000180771609343068*G0_0_1_0_8 - 0.00238237952523706*G0_0_1_0_9 + 0.00209991067133961*G0_0_1_1_1 + 0.0015986482653152*G0_0_1_1_2 - 0.00292945150088056*G0_0_1_1_3 + 0.00446220446220523*G0_0_1_1_4 + 0.00168593311450482*G0_0_1_1_5 - 0.00137862137862161*G0_0_1_1_6 - 0.000180771609343077*G0_0_1_1_7 + 0.00135388421102731*G0_0_1_1_8 + 0.00238237952523706*G0_0_1_1_9 - 0.0015986482653152*G0_0_1_2_0 + 0.0015986482653152*G0_0_1_2_1 - 0.0095016095016111*G0_0_1_2_3 + 0.0219336219336256*G0_0_1_2_4 + 0.00950160950161112*G0_0_1_2_5 - 0.0219336219336257*G0_0_1_2_6 + 0.000992340992341156*G0_0_1_2_7 - 0.000992340992341155*G0_0_1_2_8 - 0.00168593311450483*G0_0_1_3_0 - 0.00292945150088056*G0_0_1_3_1 - 0.0095016095016111*G0_0_1_3_2 - 0.0214985014985052*G0_0_1_3_3 - 0.0129270729270752*G0_0_1_3_4 + 0.0041358641358648*G0_0_1_3_6 + 0.00505779934351447*G0_0_1_3_7 - 0.00803482232053793*G0_0_1_3_8 - 0.0172627372627401*G0_0_1_3_9 + 0.00137862137862162*G0_0_1_4_0 + 0.00446220446220523*G0_0_1_4_1 + 0.0219336219336256*G0_0_1_4_2 - 0.0129270729270752*G0_0_1_4_3 + 0.0589410589410691*G0_0_1_4_4 - 0.00413586413586485*G0_0_1_4_5 - 0.00355644355644415*G0_0_1_4_7 + 0.00297702297702345*G0_0_1_4_8 + 0.00827172827172965*G0_0_1_4_9 + 0.00292945150088058*G0_0_1_5_0 + 0.00168593311450482*G0_0_1_5_1 + 0.00950160950161112*G0_0_1_5_2 - 0.00413586413586485*G0_0_1_5_4 + 0.021498501498505*G0_0_1_5_5 + 0.0129270729270751*G0_0_1_5_6 + 0.00803482232053794*G0_0_1_5_7 - 0.00505779934351447*G0_0_1_5_8 + 0.0172627372627401*G0_0_1_5_9 - 0.00446220446220523*G0_0_1_6_0 - 0.00137862137862161*G0_0_1_6_1 - 0.0219336219336257*G0_0_1_6_2 + 0.00413586413586481*G0_0_1_6_3 + 0.0129270729270751*G0_0_1_6_5 - 0.0589410589410689*G0_0_1_6_6 - 0.00297702297702348*G0_0_1_6_7 + 0.00355644355644414*G0_0_1_6_8 - 0.00827172827172964*G0_0_1_6_9 - 0.00135388421102729*G0_0_1_7_0 - 0.000180771609343077*G0_0_1_7_1 + 0.000992340992341156*G0_0_1_7_2 + 0.00505779934351447*G0_0_1_7_3 - 0.00355644355644415*G0_0_1_7_4 + 0.00803482232053794*G0_0_1_7_5 - 0.00297702297702348*G0_0_1_7_6 - 0.0014556871699731*G0_0_1_7_7 + 0.0131011845297581*G0_0_1_7_9 + 0.000180771609343068*G0_0_1_8_0 + 0.00135388421102731*G0_0_1_8_1 - 0.000992340992341155*G0_0_1_8_2 - 0.00803482232053792*G0_0_1_8_3 + 0.00297702297702345*G0_0_1_8_4 - 0.00505779934351447*G0_0_1_8_5 + 0.00355644355644414*G0_0_1_8_6 + 0.00145568716997323*G0_0_1_8_8 - 0.0131011845297581*G0_0_1_8_9 - 0.00238237952523706*G0_0_1_9_0 + 0.00238237952523706*G0_0_1_9_1 - 0.0172627372627401*G0_0_1_9_3 + 0.00827172827172966*G0_0_1_9_4 + 0.0172627372627401*G0_0_1_9_5 - 0.00827172827172964*G0_0_1_9_6 + 0.0131011845297581*G0_0_1_9_7 - 0.0131011845297581*G0_0_1_9_8 - 0.00662871520014493*G0_1_1_0_0 - 0.00156193013335898*G0_1_1_0_1 + 0.00135469468802825*G0_1_1_0_2 - 0.00317999460856658*G0_1_1_0_3 + 0.00424591281734212*G0_1_1_0_4 - 0.00254697683269155*G0_1_1_0_5 + 0.0029513343799063*G0_1_1_0_6 - 0.00683538683538801*G0_1_1_0_7 + 0.00315938030223797*G0_1_1_0_8 + 0.00056324627753208*G0_1_1_0_9 - 0.00156193013335898*G0_1_1_1_0 - 0.00452880452880531*G0_1_1_1_1 + 0.00295334295334345*G0_1_1_1_2 - 0.00547642833357212*G0_1_1_1_3 + 0.00741353884211154*G0_1_1_1_4 - 0.00149406149406174*G0_1_1_1_5 + 0.00286729143872049*G0_1_1_1_6 + 0.00297860869289493*G0_1_1_1_7 - 0.00548150262436073*G0_1_1_1_8 + 0.00294562580276915*G0_1_1_1_9 + 0.00135469468802825*G0_1_1_2_0 + 0.00295334295334345*G0_1_1_2_1 + 0.0332013665347053*G0_1_1_2_2 - 0.0170140970140999*G0_1_1_2_3 + 0.035952935952942*G0_1_1_2_4 - 0.00751248751248873*G0_1_1_2_5 + 0.0140193140193163*G0_1_1_2_6 - 0.00247308247308289*G0_1_1_2_7 - 0.00346542346542404*G0_1_1_2_8 - 0.00109224109224129*G0_1_1_2_9 - 0.00317999460856658*G0_1_1_3_0 - 0.00547642833357212*G0_1_1_3_1 - 0.0170140970140999*G0_1_1_3_2 - 0.0191979449122339*G0_1_1_3_3 - 0.0197202797202831*G0_1_1_3_4 + 0.00761524190095745*G0_1_1_3_5 - 0.00981018981019145*G0_1_1_3_6 + 0.00833166833166976*G0_1_1_3_7 - 0.0175196232339119*G0_1_1_3_8 - 0.0255002140716469*G0_1_1_3_9 + 0.00424591281734212*G0_1_1_4_0 + 0.00741353884211154*G0_1_1_4_1 + 0.035952935952942*G0_1_1_4_2 - 0.0197202797202831*G0_1_1_4_3 + 0.0798401598401735*G0_1_1_4_4 - 0.0139460539460563*G0_1_1_4_5 + 0.0237562437562477*G0_1_1_4_6 - 0.00205508776937383*G0_1_1_4_7 + 0.00918795490224217*G0_1_1_4_8 + 0.0311688311688364*G0_1_1_4_9 - 0.00254697683269155*G0_1_1_5_0 - 0.00149406149406174*G0_1_1_5_1 - 0.00751248751248873*G0_1_1_5_2 + 0.00761524190095745*G0_1_1_5_3 - 0.0139460539460563*G0_1_1_5_4 + 0.00230055658627127*G0_1_1_5_5 - 0.00679320679320787*G0_1_1_5_6 - 0.00948480091337393*G0_1_1_5_7 + 0.00327386898815525*G0_1_1_5_8 - 0.00823747680890674*G0_1_1_5_9 + 0.0029513343799063*G0_1_1_6_0 + 0.00286729143872049*G0_1_1_6_1 + 0.0140193140193163*G0_1_1_6_2 - 0.00981018981019145*G0_1_1_6_3 + 0.0237562437562477*G0_1_1_6_4 - 0.00679320679320787*G0_1_1_6_5 + 0.0208991008991042*G0_1_1_6_6 + 0.00621093192521868*G0_1_1_6_7 + 0.00150135578707031*G0_1_1_6_8 + 0.0228971028971068*G0_1_1_6_9 - 0.00683538683538801*G0_1_1_7_0 + 0.00297860869289492*G0_1_1_7_1 - 0.00247308247308289*G0_1_1_7_2 + 0.00833166833166976*G0_1_1_7_3 - 0.00205508776937383*G0_1_1_7_4 - 0.00948480091337393*G0_1_1_7_5 + 0.00621093192521868*G0_1_1_7_6 - 0.12192379049524*G0_1_1_7_7 + 0.00776081061795485*G0_1_1_7_8 - 0.0141116026830337*G0_1_1_7_9 + 0.00315938030223797*G0_1_1_8_0 - 0.00548150262436073*G0_1_1_8_1 - 0.00346542346542404*G0_1_1_8_2 - 0.0175196232339119*G0_1_1_8_3 + 0.00918795490224217*G0_1_1_8_4 + 0.00327386898815525*G0_1_1_8_5 + 0.00150135578707031*G0_1_1_8_6 + 0.00776081061795485*G0_1_1_8_7 - 0.120468103325267*G0_1_1_8_8 - 0.0272127872127918*G0_1_1_8_9 + 0.000563246277532081*G0_1_1_9_0 + 0.00294562580276915*G0_1_1_9_1 - 0.00109224109224129*G0_1_1_9_2 - 0.0255002140716469*G0_1_1_9_3 + 0.0311688311688364*G0_1_1_9_4 - 0.00823747680890674*G0_1_1_9_5 + 0.0228971028971068*G0_1_1_9_6 - 0.0141116026830337*G0_1_1_9_7 - 0.0272127872127918*G0_1_1_9_8 - 0.0139745968317418*G0_1_1_9_9; + A[19] = -A[25] + 0.0167024069405051*G0_0_0_0_0 + 0.00303250761584151*G0_0_0_0_1 + 0.00242005128909933*G0_0_0_0_2 + 0.000175399996828616*G0_0_0_0_3 + 0.000919655741084456*G0_0_0_0_4 + 0.0106597767312072*G0_0_0_0_5 - 0.00285337678194871*G0_0_0_0_6 + 0.00550691372120037*G0_0_0_0_7 - 0.00495048602191542*G0_0_0_0_8 + 0.000553256267542097*G0_0_0_0_9 + 0.00303250761584151*G0_0_0_1_0 + 0.110111801778488*G0_0_0_1_1 + 0.00534883326550084*G0_0_0_1_2 + 0.0522463647463737*G0_0_0_1_3 - 0.0202702852702887*G0_0_0_1_4 + 0.000720806970807058*G0_0_0_1_5 + 0.00122363747363769*G0_0_0_1_6 - 0.00837107337107492*G0_0_0_1_7 + 0.0140623265623292*G0_0_0_1_8 + 0.00402430902430975*G0_0_0_1_9 + 0.00242005128909933*G0_0_0_2_0 + 0.00534883326550084*G0_0_0_2_1 + 0.0182152503581106*G0_0_0_2_2 + 0.00394284287141499*G0_0_0_2_3 + 0.00307585271871037*G0_0_0_2_4 - 0.00339822875537217*G0_0_0_2_5 + 0.0112466501752235*G0_0_0_2_6 + 0.00144008769008792*G0_0_0_2_7 - 0.000274150452721906*G0_0_0_2_8 + 0.00262927548641879*G0_0_0_2_9 + 0.000175399996828617*G0_0_0_3_0 + 0.0522463647463737*G0_0_0_3_1 + 0.00394284287141499*G0_0_0_3_2 + 0.067427572427584*G0_0_0_3_3 - 0.0392470029970097*G0_0_0_3_4 + 0.0004573997431141*G0_0_0_3_5 - 0.00727433281004831*G0_0_0_3_6 - 0.00412962037962116*G0_0_0_3_7 + 0.00691058941059074*G0_0_0_3_8 - 0.00381368631368687*G0_0_0_3_9 + 0.000919655741084456*G0_0_0_4_0 - 0.0202702852702887*G0_0_0_4_1 + 0.00307585271871037*G0_0_0_4_2 - 0.0392470029970097*G0_0_0_4_3 + 0.0315513058370253*G0_0_0_4_4 - 0.00636238761238867*G0_0_0_4_5 + 0.013636720422437*G0_0_0_4_6 - 0.00173790495219091*G0_0_0_4_7 - 0.00278096903096958*G0_0_0_4_8 + 0.00483694876552093*G0_0_0_4_9 + 0.0106597767312072*G0_0_0_5_0 + 0.000720806970807058*G0_0_0_5_1 - 0.00339822875537217*G0_0_0_5_2 + 0.0004573997431141*G0_0_0_5_3 - 0.00636238761238867*G0_0_0_5_4 + 0.0589481946624903*G0_0_0_5_5 - 0.0206249108034857*G0_0_0_5_6 + 0.0136895247609556*G0_0_0_5_7 - 0.00576584130155657*G0_0_0_5_8 + 0.0098719138004869*G0_0_0_5_9 - 0.00285337678194871*G0_0_0_6_0 + 0.00122363747363769*G0_0_0_6_1 + 0.0112466501752235*G0_0_0_6_2 - 0.00727433281004831*G0_0_0_6_3 + 0.013636720422437*G0_0_0_6_4 - 0.0206249108034857*G0_0_0_6_5 + 0.0613029827315645*G0_0_0_6_6 - 0.00792368345939906*G0_0_0_6_7 + 0.000377479663194007*G0_0_0_6_8 + 0.00666083916084024*G0_0_0_6_9 + 0.00550691372120037*G0_0_0_7_0 - 0.00837107337107491*G0_0_0_7_1 + 0.00144008769008792*G0_0_0_7_2 - 0.00412962037962115*G0_0_0_7_3 - 0.00173790495219092*G0_0_0_7_4 + 0.0136895247609556*G0_0_0_7_5 - 0.00792368345939906*G0_0_0_7_6 + 0.0239988582845766*G0_0_0_7_7 + 0.00525849150849227*G0_0_0_7_8 + 0.0141875981161719*G0_0_0_7_9 - 0.00495048602191542*G0_0_0_8_0 + 0.0140623265623292*G0_0_0_8_1 - 0.000274150452721906*G0_0_0_8_2 + 0.00691058941059074*G0_0_0_8_3 - 0.00278096903096958*G0_0_0_8_4 - 0.00576584130155657*G0_0_0_8_5 + 0.000377479663194008*G0_0_0_8_6 + 0.00525849150849228*G0_0_0_8_7 - 0.0323726273726325*G0_0_0_8_8 - 0.00651098901099004*G0_0_0_8_9 + 0.000553256267542097*G0_0_0_9_0 + 0.00402430902430975*G0_0_0_9_1 + 0.00262927548641879*G0_0_0_9_2 - 0.00381368631368686*G0_0_0_9_3 + 0.00483694876552093*G0_0_0_9_4 + 0.0098719138004869*G0_0_0_9_5 + 0.00666083916084024*G0_0_0_9_6 + 0.0141875981161719*G0_0_0_9_7 - 0.00651098901099004*G0_0_0_9_8 + 0.048512915655781*G0_0_0_9_9 - 0.00151284341760558*G0_0_1_0_0 - 0.00231632564965939*G0_0_1_0_1 + 0.000449550449550539*G0_0_1_0_3 - 0.000520431949003472*G0_0_1_0_4 - 0.000586873444016392*G0_0_1_0_5 + 0.000544851973423489*G0_0_1_0_6 + 0.00243106100248999*G0_0_1_0_7 - 0.00889332889333041*G0_0_1_0_8 - 0.00207601921887671*G0_0_1_0_9 - 0.00231632564965938*G0_0_1_1_0 + 0.00231632564965937*G0_0_1_1_2 + 0.0381840381840446*G0_0_1_1_3 - 0.0118992118992139*G0_0_1_1_4 - 0.00050283050283057*G0_0_1_1_5 + 0.000502830502830574*G0_0_1_1_6 + 0.0118992118992139*G0_0_1_1_7 - 0.0381840381840447*G0_0_1_1_8 + 0.00231632564965937*G0_0_1_2_1 + 0.00151284341760556*G0_0_1_2_2 + 0.0088933288933304*G0_0_1_2_3 - 0.00243106100248998*G0_0_1_2_4 - 0.000544851973423489*G0_0_1_2_5 + 0.000586873444016391*G0_0_1_2_6 + 0.000520431949003462*G0_0_1_2_7 - 0.00044955044955051*G0_0_1_2_8 + 0.00207601921887673*G0_0_1_2_9 + 0.000449550449550538*G0_0_1_3_0 + 0.0381840381840446*G0_0_1_3_1 + 0.0088933288933304*G0_0_1_3_2 + 0.0998001998002168*G0_0_1_3_3 - 0.0445054945055021*G0_0_1_3_4 - 0.00150849150849178*G0_0_1_3_6 - 0.00134865134865161*G0_0_1_3_7 + 0.00269730269730323*G0_0_1_3_9 - 0.000520431949003472*G0_0_1_4_0 - 0.0118992118992139*G0_0_1_4_1 - 0.00243106100248998*G0_0_1_4_2 - 0.0445054945055021*G0_0_1_4_3 + 0.00755244755244882*G0_0_1_4_4 + 0.00156129584701039*G0_0_1_4_5 + 0.00134865134865154*G0_0_1_4_8 - 0.00935064935065097*G0_0_1_4_9 - 0.000586873444016392*G0_0_1_5_0 - 0.000502830502830571*G0_0_1_5_1 - 0.000544851973423489*G0_0_1_5_2 + 0.00156129584701039*G0_0_1_5_4 - 0.00235478806907416*G0_0_1_5_5 + 0.00150849150849179*G0_0_1_5_8 + 0.00321107463964661*G0_0_1_5_9 + 0.000544851973423489*G0_0_1_6_0 + 0.000502830502830574*G0_0_1_6_1 + 0.000586873444016391*G0_0_1_6_2 - 0.00150849150849178*G0_0_1_6_3 + 0.00235478806907417*G0_0_1_6_6 - 0.00156129584701039*G0_0_1_6_7 - 0.00321107463964662*G0_0_1_6_9 + 0.00243106100248999*G0_0_1_7_0 + 0.0118992118992139*G0_0_1_7_1 + 0.000520431949003462*G0_0_1_7_2 - 0.00134865134865161*G0_0_1_7_3 - 0.00156129584701039*G0_0_1_7_6 - 0.00755244755244883*G0_0_1_7_7 + 0.044505494505502*G0_0_1_7_8 + 0.00935064935065093*G0_0_1_7_9 - 0.00889332889333042*G0_0_1_8_0 - 0.0381840381840447*G0_0_1_8_1 - 0.00044955044955051*G0_0_1_8_2 + 0.00134865134865154*G0_0_1_8_4 + 0.00150849150849179*G0_0_1_8_5 + 0.044505494505502*G0_0_1_8_7 - 0.0998001998002166*G0_0_1_8_8 - 0.00269730269730311*G0_0_1_8_9 - 0.00207601921887671*G0_0_1_9_0 + 0.00207601921887673*G0_0_1_9_2 + 0.00269730269730323*G0_0_1_9_3 - 0.00935064935065097*G0_0_1_9_4 + 0.00321107463964661*G0_0_1_9_5 - 0.00321107463964662*G0_0_1_9_6 + 0.00935064935065093*G0_0_1_9_7 - 0.00269730269730311*G0_0_1_9_8; + A[54] = A[138] - 0.00505173838507272*G0_0_1_0_0 + 0.00111141063522036*G0_0_1_0_1 - 0.00028204599633176*G0_0_1_0_2 - 0.0013899328185045*G0_0_1_0_3 - 0.000347166061451838*G0_0_1_0_4 - 0.00431568431568511*G0_0_1_0_5 + 0.00160474446188762*G0_0_1_0_6 - 0.00229104229104273*G0_0_1_0_7 - 0.000206777349634496*G0_0_1_0_8 - 0.0015045272188132*G0_0_1_0_9 + 0.00111141063522036*G0_0_1_1_0 + 0.0885040885041038*G0_0_1_1_1 + 0.00303654017939784*G0_0_1_1_2 + 0.0311984311984366*G0_0_1_1_3 - 0.0125444925444947*G0_0_1_1_4 + 0.000241451670023113*G0_0_1_1_5 - 0.000324331752903229*G0_0_1_1_6 - 0.00560624560624662*G0_0_1_1_7 + 0.00929440929441102*G0_0_1_1_8 - 0.000497280497280557*G0_0_1_1_9 - 0.00028204599633176*G0_0_1_2_0 + 0.00303654017939784*G0_0_1_2_1 - 0.000341668913097501*G0_0_1_2_2 + 0.00162165876451617*G0_0_1_2_3 + 0.00182336182336216*G0_0_1_2_4 - 0.000386068957497614*G0_0_1_2_5 + 0.000231725946011734*G0_0_1_2_6 + 0.000317566031851792*G0_0_1_2_7 - 0.000468949040377683*G0_0_1_2_8 + 0.00352916924345556*G0_0_1_2_9 - 0.0013899328185045*G0_0_1_3_0 + 0.0311984311984365*G0_0_1_3_1 + 0.00162165876451617*G0_0_1_3_2 - 0.0853546453546604*G0_0_1_3_3 - 0.0149222206365089*G0_0_1_3_4 + 0.00210456210456245*G0_0_1_3_5 + 0.000209314495028808*G0_0_1_3_6 + 0.00340611769183256*G0_0_1_3_7 - 0.0040492840492847*G0_0_1_3_8 - 0.00532039389182345*G0_0_1_3_9 - 0.000347166061451838*G0_0_1_4_0 - 0.0125444925444947*G0_0_1_4_1 + 0.00182336182336216*G0_0_1_4_2 - 0.0149222206365089*G0_0_1_4_3 + 0.00810617953475234*G0_0_1_4_4 + 0.000277817420674613*G0_0_1_4_5 - 0.000487131915703417*G0_0_1_4_6 + 0.000426240426240517*G0_0_1_4_7 + 0.00064316635745215*G0_0_1_4_8 - 0.0111431425717159*G0_0_1_4_9 - 0.00431568431568511*G0_0_1_5_0 + 0.000241451670023112*G0_0_1_5_1 - 0.000386068957497614*G0_0_1_5_2 + 0.00210456210456245*G0_0_1_5_3 + 0.000277817420674612*G0_0_1_5_4 - 0.00895866038723337*G0_0_1_5_5 + 0.00183055040197929*G0_0_1_5_6 + 0.00320441463298659*G0_0_1_5_7 - 0.00148803577375031*G0_0_1_5_8 + 0.00748965320394019*G0_0_1_5_9 + 0.00160474446188762*G0_0_1_6_0 - 0.000324331752903229*G0_0_1_6_1 + 0.000231725946011734*G0_0_1_6_2 + 0.000209314495028809*G0_0_1_6_3 - 0.000487131915703417*G0_0_1_6_4 + 0.00183055040197928*G0_0_1_6_5 - 0.00114932686361273*G0_0_1_6_6 - 0.00171637885923628*G0_0_1_6_7 + 0.00157176157176183*G0_0_1_6_8 - 0.0110061367204243*G0_0_1_6_9 - 0.00229104229104273*G0_0_1_7_0 - 0.00560624560624662*G0_0_1_7_1 + 0.000317566031851793*G0_0_1_7_2 + 0.00340611769183256*G0_0_1_7_3 + 0.000426240426240516*G0_0_1_7_4 + 0.00320441463298659*G0_0_1_7_5 - 0.00171637885923628*G0_0_1_7_6 + 0.00223015080157967*G0_0_1_7_7 + 0.00639741211169887*G0_0_1_7_8 + 0.00794633937491214*G0_0_1_7_9 - 0.000206777349634496*G0_0_1_8_0 + 0.00929440929441102*G0_0_1_8_1 - 0.000468949040377683*G0_0_1_8_2 - 0.0040492840492847*G0_0_1_8_3 + 0.000643166357452149*G0_0_1_8_4 - 0.00148803577375031*G0_0_1_8_5 + 0.00157176157176183*G0_0_1_8_6 + 0.00639741211169887*G0_0_1_8_7 - 0.0456077256077333*G0_0_1_8_8 + 0.000205508776937376*G0_0_1_8_9 - 0.0015045272188132*G0_0_1_9_0 - 0.000497280497280556*G0_0_1_9_1 + 0.00352916924345556*G0_0_1_9_2 - 0.00532039389182345*G0_0_1_9_3 - 0.0111431425717159*G0_0_1_9_4 + 0.00748965320394019*G0_0_1_9_5 - 0.0110061367204243*G0_0_1_9_6 + 0.00794633937491214*G0_0_1_9_7 + 0.000205508776937379*G0_0_1_9_8 + 0.0287712287712336*G0_0_1_9_9 + 0.00505173838507272*G0_1_0_0_0 - 0.00111141063522036*G0_1_0_0_1 + 0.00028204599633176*G0_1_0_0_2 + 0.0013899328185045*G0_1_0_0_3 + 0.000347166061451838*G0_1_0_0_4 + 0.00431568431568511*G0_1_0_0_5 - 0.00160474446188762*G0_1_0_0_6 + 0.00229104229104273*G0_1_0_0_7 + 0.000206777349634496*G0_1_0_0_8 + 0.0015045272188132*G0_1_0_0_9 - 0.00111141063522036*G0_1_0_1_0 - 0.0885040885041038*G0_1_0_1_1 - 0.00303654017939784*G0_1_0_1_2 - 0.0311984311984366*G0_1_0_1_3 + 0.0125444925444947*G0_1_0_1_4 - 0.000241451670023113*G0_1_0_1_5 + 0.000324331752903229*G0_1_0_1_6 + 0.00560624560624662*G0_1_0_1_7 - 0.00929440929441102*G0_1_0_1_8 + 0.000497280497280557*G0_1_0_1_9 + 0.00028204599633176*G0_1_0_2_0 - 0.00303654017939784*G0_1_0_2_1 + 0.000341668913097501*G0_1_0_2_2 - 0.00162165876451617*G0_1_0_2_3 - 0.00182336182336216*G0_1_0_2_4 + 0.000386068957497614*G0_1_0_2_5 - 0.000231725946011734*G0_1_0_2_6 - 0.000317566031851792*G0_1_0_2_7 + 0.000468949040377683*G0_1_0_2_8 - 0.00352916924345556*G0_1_0_2_9 + 0.0013899328185045*G0_1_0_3_0 - 0.0311984311984365*G0_1_0_3_1 - 0.00162165876451617*G0_1_0_3_2 + 0.0853546453546604*G0_1_0_3_3 + 0.0149222206365089*G0_1_0_3_4 - 0.00210456210456245*G0_1_0_3_5 - 0.000209314495028808*G0_1_0_3_6 - 0.00340611769183256*G0_1_0_3_7 + 0.0040492840492847*G0_1_0_3_8 + 0.00532039389182345*G0_1_0_3_9 + 0.000347166061451838*G0_1_0_4_0 + 0.0125444925444947*G0_1_0_4_1 - 0.00182336182336216*G0_1_0_4_2 + 0.0149222206365089*G0_1_0_4_3 - 0.00810617953475234*G0_1_0_4_4 - 0.000277817420674612*G0_1_0_4_5 + 0.000487131915703416*G0_1_0_4_6 - 0.000426240426240517*G0_1_0_4_7 - 0.00064316635745215*G0_1_0_4_8 + 0.0111431425717159*G0_1_0_4_9 + 0.00431568431568511*G0_1_0_5_0 - 0.000241451670023113*G0_1_0_5_1 + 0.000386068957497614*G0_1_0_5_2 - 0.00210456210456245*G0_1_0_5_3 - 0.000277817420674612*G0_1_0_5_4 + 0.00895866038723337*G0_1_0_5_5 - 0.00183055040197929*G0_1_0_5_6 - 0.00320441463298659*G0_1_0_5_7 + 0.00148803577375031*G0_1_0_5_8 - 0.00748965320394019*G0_1_0_5_9 - 0.00160474446188762*G0_1_0_6_0 + 0.000324331752903229*G0_1_0_6_1 - 0.000231725946011734*G0_1_0_6_2 - 0.000209314495028808*G0_1_0_6_3 + 0.000487131915703417*G0_1_0_6_4 - 0.00183055040197928*G0_1_0_6_5 + 0.00114932686361273*G0_1_0_6_6 + 0.00171637885923628*G0_1_0_6_7 - 0.00157176157176183*G0_1_0_6_8 + 0.0110061367204243*G0_1_0_6_9 + 0.00229104229104273*G0_1_0_7_0 + 0.00560624560624662*G0_1_0_7_1 - 0.000317566031851793*G0_1_0_7_2 - 0.00340611769183256*G0_1_0_7_3 - 0.000426240426240516*G0_1_0_7_4 - 0.00320441463298659*G0_1_0_7_5 + 0.00171637885923628*G0_1_0_7_6 - 0.00223015080157967*G0_1_0_7_7 - 0.00639741211169887*G0_1_0_7_8 - 0.00794633937491214*G0_1_0_7_9 + 0.000206777349634496*G0_1_0_8_0 - 0.00929440929441102*G0_1_0_8_1 + 0.000468949040377683*G0_1_0_8_2 + 0.00404928404928469*G0_1_0_8_3 - 0.000643166357452149*G0_1_0_8_4 + 0.00148803577375031*G0_1_0_8_5 - 0.00157176157176183*G0_1_0_8_6 - 0.00639741211169887*G0_1_0_8_7 + 0.0456077256077333*G0_1_0_8_8 - 0.000205508776937383*G0_1_0_8_9 + 0.0015045272188132*G0_1_0_9_0 + 0.000497280497280556*G0_1_0_9_1 - 0.00352916924345556*G0_1_0_9_2 + 0.00532039389182345*G0_1_0_9_3 + 0.0111431425717159*G0_1_0_9_4 - 0.00748965320394019*G0_1_0_9_5 + 0.0110061367204243*G0_1_0_9_6 - 0.00794633937491214*G0_1_0_9_7 - 0.000205508776937379*G0_1_0_9_8 - 0.0287712287712336*G0_1_0_9_9; + A[50] = -A[54] + 0.00698786222595871*G0_0_0_0_0 - 0.000670229241657935*G0_0_0_0_1 + 0.00855624093719478*G0_0_0_0_2 - 0.00270924842353463*G0_0_0_0_3 - 0.0021282421282425*G0_0_0_0_4 + 0.0045423359709082*G0_0_0_0_5 + 0.00681434967149369*G0_0_0_0_6 + 0.000435543292686247*G0_0_0_0_7 + 0.00283441426298615*G0_0_0_0_8 + 0.00114425257282418*G0_0_0_0_9 - 0.000670229241657935*G0_0_0_1_0 - 0.0267584267584313*G0_0_0_1_1 + 0.000457109028537681*G0_0_0_1_2 - 0.0388352388352455*G0_0_0_1_3 + 0.0139919339919363*G0_0_0_1_4 + 0.00102796674225263*G0_0_0_1_5 + 0.00359555788127278*G0_0_0_1_6 + 0.00488696488696574*G0_0_0_1_7 - 0.00636400636400749*G0_0_0_1_8 - 0.00520368520368612*G0_0_0_1_9 + 0.00855624093719478*G0_0_0_2_0 + 0.000457109028537681*G0_0_0_2_1 + 0.126818366818388*G0_0_0_2_2 - 0.020715792144367*G0_0_0_2_3 + 0.0299992071420692*G0_0_0_2_4 - 0.0336044907473535*G0_0_0_2_5 + 0.0828124256695824*G0_0_0_2_6 - 0.000920560920561056*G0_0_0_2_7 + 0.0017738874881735*G0_0_0_2_8 + 0.0125132010846317*G0_0_0_2_9 - 0.00270924842353463*G0_0_0_3_0 - 0.0388352388352455*G0_0_0_3_1 - 0.020715792144367*G0_0_0_3_2 - 0.223136863136901*G0_0_0_3_3 + 0.036454973597837*G0_0_0_3_4 + 0.00463536463536537*G0_0_0_3_5 - 0.0150135578707031*G0_0_0_3_6 + 0.00390086104371893*G0_0_0_3_7 + 0.00564768564768644*G0_0_0_3_8 + 0.00780933352362042*G0_0_0_3_9 - 0.0021282421282425*G0_0_0_4_0 + 0.0139919339919363*G0_0_0_4_1 + 0.0299992071420692*G0_0_0_4_2 + 0.036454973597837*G0_0_0_4_3 - 0.0777051519908796*G0_0_0_4_4 + 0.00215784215784258*G0_0_0_4_5 + 0.0128557157128606*G0_0_0_4_6 + 0.00668664668664779*G0_0_0_4_7 - 0.00954854669140536*G0_0_0_4_8 - 0.0418552875695804*G0_0_0_4_9 + 0.0045423359709082*G0_0_0_5_0 + 0.00102796674225263*G0_0_0_5_1 - 0.0336044907473535*G0_0_0_5_2 + 0.00463536463536537*G0_0_0_5_3 + 0.00215784215784258*G0_0_0_5_4 + 0.054711003282441*G0_0_0_5_5 - 0.0618238903953294*G0_0_0_5_6 + 0.00877598591884452*G0_0_0_5_7 - 0.00731078445364284*G0_0_0_5_8 + 0.0111888111888131*G0_0_0_5_9 + 0.00681434967149369*G0_0_0_6_0 + 0.00359555788127278*G0_0_0_6_1 + 0.0828124256695824*G0_0_0_6_2 - 0.0150135578707031*G0_0_0_6_3 + 0.0128557157128606*G0_0_0_6_4 - 0.0618238903953294*G0_0_0_6_5 + 0.177308405879864*G0_0_0_6_6 - 0.0014652014652017*G0_0_0_6_7 - 0.00594072594072688*G0_0_0_6_8 - 0.00751248751248893*G0_0_0_6_9 + 0.000435543292686247*G0_0_0_7_0 + 0.00488696488696574*G0_0_0_7_1 - 0.000920560920561056*G0_0_0_7_2 + 0.00390086104371893*G0_0_0_7_3 + 0.00668664668664779*G0_0_0_7_4 + 0.00877598591884452*G0_0_0_7_5 - 0.0014652014652017*G0_0_0_7_6 + 0.0141420484277651*G0_0_0_7_7 - 0.0197783169211773*G0_0_0_7_8 - 0.000502354788069098*G0_0_0_7_9 + 0.00283441426298615*G0_0_0_8_0 - 0.00636400636400749*G0_0_0_8_1 + 0.0017738874881735*G0_0_0_8_2 + 0.00564768564768644*G0_0_0_8_3 - 0.00954854669140536*G0_0_0_8_4 - 0.00731078445364284*G0_0_0_8_5 - 0.00594072594072688*G0_0_0_8_6 - 0.0197783169211773*G0_0_0_8_7 + 0.0520013320013406*G0_0_0_8_8 + 0.0347081489938691*G0_0_0_8_9 + 0.00114425257282418*G0_0_0_9_0 - 0.00520368520368612*G0_0_0_9_1 + 0.0125132010846317*G0_0_0_9_2 + 0.00780933352362042*G0_0_0_9_3 - 0.0418552875695804*G0_0_0_9_4 + 0.0111888111888131*G0_0_0_9_5 - 0.00751248751248892*G0_0_0_9_6 - 0.000502354788069095*G0_0_0_9_7 + 0.0347081489938691*G0_0_0_9_8 + 0.0421978021978093*G0_0_0_9_9 - 0.00154596726025325*G0_0_1_0_0 - 0.00113664113664134*G0_0_1_0_1 + 0.000333211761783248*G0_0_1_0_2 - 0.00969189540618282*G0_0_1_0_3 - 0.00539904539904633*G0_0_1_0_4 + 0.00068502925645795*G0_0_1_0_5 - 0.00114171542742991*G0_0_1_0_6 + 0.00128886986029866*G0_0_1_0_7 + 0.00106052677481266*G0_0_1_0_8 - 0.0112344798059103*G0_0_1_0_9 - 0.00113664113664134*G0_0_1_1_0 - 0.0194176194176227*G0_0_1_1_1 - 0.00349280349280409*G0_0_1_1_2 - 0.0483072483072566*G0_0_1_1_3 + 0.0105139305139323*G0_0_1_1_4 + 0.00280608280608329*G0_0_1_1_5 - 0.00220224220224258*G0_0_1_1_6 + 0.00340992340992402*G0_0_1_1_7 - 0.00681984681984803*G0_0_1_1_9 + 0.000333211761783248*G0_0_1_2_0 - 0.00349280349280409*G0_0_1_2_1 + 0.010300810300812*G0_0_1_2_2 - 0.0168060510917682*G0_0_1_2_3 + 0.00203986489700807*G0_0_1_2_4 - 0.00327799184942098*G0_0_1_2_5 + 0.00996590710876595*G0_0_1_2_6 + 0.00234939663511133*G0_0_1_2_7 - 0.00106052677481268*G0_0_1_2_8 + 0.00395794681509034*G0_0_1_2_9 - 0.00969189540618282*G0_0_1_3_0 - 0.0483072483072566*G0_0_1_3_1 - 0.0168060510917682*G0_0_1_3_2 - 0.417182817182889*G0_0_1_3_3 + 0.117962037962058*G0_0_1_3_4 + 0.00680462394748219*G0_0_1_3_5 + 0.0136549165120617*G0_0_1_3_6 + 0.0361238761238823*G0_0_1_3_7 - 0.0463536463536544*G0_0_1_3_8 - 0.0517882117882208*G0_0_1_3_9 - 0.00539904539904633*G0_0_1_4_0 + 0.0105139305139323*G0_0_1_4_1 + 0.00203986489700807*G0_0_1_4_2 + 0.117962037962058*G0_0_1_4_3 - 0.177970600827774*G0_0_1_4_4 + 0.0232453261024729*G0_0_1_4_5 - 0.0369002426145346*G0_0_1_4_6 + 0.00105037819323549*G0_0_1_4_7 + 0.010229770229772*G0_0_1_4_8 - 0.0583644926502168*G0_0_1_4_9 + 0.00068502925645795*G0_0_1_5_0 + 0.00280608280608329*G0_0_1_5_1 - 0.00327799184942098*G0_0_1_5_2 + 0.0068046239474822*G0_0_1_5_3 + 0.0232453261024729*G0_0_1_5_4 - 0.00917939203653635*G0_0_1_5_5 + 0.00342514628228972*G0_0_1_5_6 + 0.00137005851291592*G0_0_1_5_7 - 0.00137005851291592*G0_0_1_5_8 + 0.0364435564435627*G0_0_1_5_9 - 0.00114171542742991*G0_0_1_6_0 - 0.00220224220224258*G0_0_1_6_1 + 0.00996590710876595*G0_0_1_6_2 + 0.0136549165120617*G0_0_1_6_3 - 0.0369002426145346*G0_0_1_6_4 + 0.00342514628228972*G0_0_1_6_5 + 0.00945340373911968*G0_0_1_6_6 + 0.00137005851291592*G0_0_1_6_8 - 0.0391836734693945*G0_0_1_6_9 + 0.00128886986029866*G0_0_1_7_0 + 0.00340992340992402*G0_0_1_7_1 + 0.00234939663511133*G0_0_1_7_2 + 0.0361238761238823*G0_0_1_7_3 + 0.00105037819323548*G0_0_1_7_4 + 0.00137005851291592*G0_0_1_7_5 + 0.0112801484230075*G0_0_1_7_7 - 0.0102297702297719*G0_0_1_7_8 + 0.0337034394177309*G0_0_1_7_9 + 0.00106052677481266*G0_0_1_8_0 - 0.00106052677481268*G0_0_1_8_2 - 0.0463536463536544*G0_0_1_8_3 + 0.010229770229772*G0_0_1_8_4 - 0.00137005851291592*G0_0_1_8_5 + 0.00137005851291592*G0_0_1_8_6 - 0.0102297702297719*G0_0_1_8_7 + 0.046353646353654*G0_0_1_8_8 - 0.0112344798059103*G0_0_1_9_0 - 0.00681984681984803*G0_0_1_9_1 + 0.00395794681509034*G0_0_1_9_2 - 0.0517882117882208*G0_0_1_9_3 - 0.0583644926502168*G0_0_1_9_4 + 0.0364435564435627*G0_0_1_9_5 - 0.0391836734693945*G0_0_1_9_6 + 0.0337034394177309*G0_0_1_9_7 - 0.0674068788354617*G0_0_1_9_9 + 0.00480366194652004*G0_1_0_0_0 - 0.00197826864493568*G0_1_0_0_1 + 0.000885040885041029*G0_1_0_0_2 - 0.00236335093477995*G0_1_0_0_3 + 0.000886732315303901*G0_1_0_0_4 + 0.00242043670615147*G0_1_0_0_5 - 0.000371691800263328*G0_1_0_0_6 + 0.000999635285349801*G0_1_0_0_7 + 0.00364207221350134*G0_1_0_0_8 + 0.00272235700807174*G0_1_0_0_9 - 0.00197826864493568*G0_1_0_1_0 - 0.112420912420932*G0_1_0_1_1 - 0.00556973890307319*G0_1_0_1_2 - 0.070862470862483*G0_1_0_1_3 + 0.0306715506715559*G0_1_0_1_4 + 0.000399600399600505*G0_1_0_1_5 + 0.0014652014652017*G0_1_0_1_6 + 0.0100699300699319*G0_1_0_1_7 - 0.0147408147408175*G0_1_0_1_8 - 0.00326784326784389*G0_1_0_1_9 + 0.000885040885041029*G0_1_0_2_0 - 0.00556973890307319*G0_1_0_2_1 + 0.00614327471470411*G0_1_0_2_2 - 0.0108145822431555*G0_1_0_2_3 + 0.00885971171685597*G0_1_0_2_4 - 0.00183816183816209*G0_1_0_2_5 + 0.00428777571634778*G0_1_0_2_6 - 0.000133200133200132*G0_1_0_2_7 + 0.00275153418010604*G0_1_0_2_8 + 0.00348350062635833*G0_1_0_2_9 - 0.00236335093477995*G0_1_0_3_0 - 0.070862470862483*G0_1_0_3_1 - 0.0108145822431555*G0_1_0_3_2 - 0.14556110556113*G0_1_0_3_3 + 0.0341791541791601*G0_1_0_3_4 + 0.00368012939441571*G0_1_0_3_5 - 0.00586461157889822*G0_1_0_3_6 + 0.00562104562104669*G0_1_0_3_7 + 0.00410256410256454*G0_1_0_3_8 - 0.00143856143856181*G0_1_0_3_9 + 0.000886732315303901*G0_1_0_4_0 + 0.0306715506715559*G0_1_0_4_1 + 0.00885971171685597*G0_1_0_4_2 + 0.0341791541791601*G0_1_0_4_3 + 0.000190285904571442*G0_1_0_4_4 - 0.00412920412920479*G0_1_0_4_5 + 0.00999381570810302*G0_1_0_4_6 - 0.000395794681509089*G0_1_0_4_7 - 0.00972360972361123*G0_1_0_4_8 - 0.00219209362066542*G0_1_0_4_9 + 0.00242043670615147*G0_1_0_5_0 + 0.000399600399600505*G0_1_0_5_1 - 0.00183816183816209*G0_1_0_5_2 + 0.00368012939441571*G0_1_0_5_3 - 0.00412920412920479*G0_1_0_5_4 + 0.00754293325722032*G0_1_0_5_5 - 0.00769896769896899*G0_1_0_5_6 + 0.00373721516578726*G0_1_0_5_7 - 0.00266780838209456*G0_1_0_5_8 - 0.00283145426002611*G0_1_0_5_9 - 0.000371691800263328*G0_1_0_6_0 + 0.0014652014652017*G0_1_0_6_1 + 0.00428777571634778*G0_1_0_6_2 - 0.00586461157889822*G0_1_0_6_3 + 0.00999381570810302*G0_1_0_6_4 - 0.00769896769896898*G0_1_0_6_5 + 0.0160372960372986*G0_1_0_6_6 - 0.00106940678369271*G0_1_0_6_7 - 0.00559059987631506*G0_1_0_6_8 + 0.00127872127872145*G0_1_0_6_9 + 0.000999635285349801*G0_1_0_7_0 + 0.0100699300699319*G0_1_0_7_1 - 0.000133200133200132*G0_1_0_7_2 + 0.00562104562104669*G0_1_0_7_3 - 0.000395794681509089*G0_1_0_7_4 + 0.00373721516578726*G0_1_0_7_5 - 0.00106940678369271*G0_1_0_7_6 + 0.0168136625279511*G0_1_0_7_7 - 0.0259207459207501*G0_1_0_7_8 - 0.0060282574568298*G0_1_0_7_9 + 0.00364207221350134*G0_1_0_8_0 - 0.0147408147408175*G0_1_0_8_1 + 0.00275153418010604*G0_1_0_8_2 + 0.00410256410256453*G0_1_0_8_3 - 0.00972360972361122*G0_1_0_8_4 - 0.00266780838209456*G0_1_0_8_5 - 0.00559059987631506*G0_1_0_8_6 - 0.0259207459207501*G0_1_0_8_7 + 0.0973959373959534*G0_1_0_8_8 + 0.0292507492507541*G0_1_0_8_9 + 0.00272235700807174*G0_1_0_9_0 - 0.00326784326784389*G0_1_0_9_1 + 0.00348350062635833*G0_1_0_9_2 - 0.00143856143856181*G0_1_0_9_3 - 0.00219209362066541*G0_1_0_9_4 - 0.00283145426002611*G0_1_0_9_5 + 0.00127872127872145*G0_1_0_9_6 - 0.0060282574568298*G0_1_0_9_7 + 0.0292507492507541*G0_1_0_9_8 + 0.0178107606679065*G0_1_0_9_9 - 0.00133961276818445*G0_1_1_0_0 + 0.00359147025813755*G0_1_1_0_1 - 0.00511488511488601*G0_1_1_0_3 + 0.00101993244850405*G0_1_1_0_4 - 0.00186733901019649*G0_1_1_0_5 + 0.00146647003789886*G0_1_1_0_6 - 0.00786007643150637*G0_1_1_0_7 + 0.0144566544566569*G0_1_1_0_8 - 0.00076114361828663*G0_1_1_0_9 + 0.00359147025813755*G0_1_1_1_0 - 0.00359147025813753*G0_1_1_1_2 - 0.0561216561216656*G0_1_1_1_3 + 0.020601620601624*G0_1_1_1_4 - 0.00106560106560127*G0_1_1_1_5 + 0.00106560106560126*G0_1_1_1_6 - 0.0206016206016242*G0_1_1_1_7 + 0.0561216561216657*G0_1_1_1_8 - 0.00359147025813753*G0_1_1_2_1 + 0.00133961276818438*G0_1_1_2_2 - 0.0144566544566569*G0_1_1_2_3 + 0.00786007643150629*G0_1_1_2_4 - 0.00146647003789885*G0_1_1_2_5 + 0.00186733901019645*G0_1_1_2_6 - 0.00101993244850404*G0_1_1_2_7 + 0.00511488511488595*G0_1_1_2_8 + 0.000761143618286591*G0_1_1_2_9 - 0.00511488511488601*G0_1_1_3_0 - 0.0561216561216656*G0_1_1_3_1 - 0.0144566544566569*G0_1_1_3_2 - 0.242957042957085*G0_1_1_3_3 + 0.0600999000999104*G0_1_1_3_4 + 0.0092707292707308*G0_1_1_3_5 - 0.00319680319680369*G0_1_1_3_6 + 0.015344655344658*G0_1_1_3_7 - 0.030689310689316*G0_1_1_3_9 + 0.00101993244850405*G0_1_1_4_0 + 0.020601620601624*G0_1_1_4_1 + 0.00786007643150629*G0_1_1_4_2 + 0.0600999000999104*G0_1_1_4_3 - 0.0166233766233797*G0_1_1_4_4 - 0.0030597973455121*G0_1_1_4_5 + 0.00625660054231581*G0_1_1_4_6 - 0.0153446553446578*G0_1_1_4_8 + 0.00383616383616445*G0_1_1_4_9 - 0.00186733901019649*G0_1_1_5_0 - 0.00106560106560127*G0_1_1_5_1 - 0.00146647003789885*G0_1_1_5_2 + 0.0092707292707308*G0_1_1_5_3 - 0.0030597973455121*G0_1_1_5_4 - 0.00849436278007851*G0_1_1_5_5 - 0.00625660054231587*G0_1_1_5_7 + 0.00319680319680369*G0_1_1_5_8 - 0.00411017553874761*G0_1_1_5_9 + 0.00146647003789886*G0_1_1_6_0 + 0.00106560106560126*G0_1_1_6_1 + 0.00186733901019645*G0_1_1_6_2 - 0.00319680319680369*G0_1_1_6_3 + 0.00625660054231581*G0_1_1_6_4 + 0.00849436278007845*G0_1_1_6_6 + 0.00305979734551214*G0_1_1_6_7 - 0.00927072927073076*G0_1_1_6_8 + 0.00411017553874761*G0_1_1_6_9 - 0.00786007643150637*G0_1_1_7_0 - 0.0206016206016242*G0_1_1_7_1 - 0.00101993244850404*G0_1_1_7_2 + 0.015344655344658*G0_1_1_7_3 - 0.00625660054231587*G0_1_1_7_5 + 0.00305979734551214*G0_1_1_7_6 + 0.0166233766233795*G0_1_1_7_7 - 0.0600999000999103*G0_1_1_7_8 - 0.00383616383616442*G0_1_1_7_9 + 0.0144566544566569*G0_1_1_8_0 + 0.0561216561216657*G0_1_1_8_1 + 0.00511488511488595*G0_1_1_8_2 - 0.0153446553446579*G0_1_1_8_4 + 0.00319680319680369*G0_1_1_8_5 - 0.00927072927073076*G0_1_1_8_6 - 0.0600999000999103*G0_1_1_8_7 + 0.242957042957084*G0_1_1_8_8 + 0.0306893106893158*G0_1_1_8_9 - 0.00076114361828663*G0_1_1_9_0 + 0.000761143618286591*G0_1_1_9_2 - 0.030689310689316*G0_1_1_9_3 + 0.00383616383616445*G0_1_1_9_4 - 0.00411017553874761*G0_1_1_9_5 + 0.00411017553874761*G0_1_1_9_6 - 0.00383616383616442*G0_1_1_9_7 + 0.0306893106893158*G0_1_1_9_8; + A[170] = -A[50] + 0.00245257388114573*G0_0_0_0_0 + 0.00012699822223634*G0_0_0_0_1 + 0.0079532460484855*G0_0_0_0_2 - 0.0023912595341171*G0_0_0_0_4 - 0.00142925857211596*G0_0_0_0_5 + 0.0101058729630175*G0_0_0_0_6 + 0.000287543144686058*G0_0_0_0_7 + 0.000385223242366166*G0_0_0_0_8 - 0.00125081267938433*G0_0_0_0_9 + 0.00012699822223634*G0_0_0_1_0 - 0.00284160284160324*G0_0_0_1_1 + 0.00305993829803406*G0_0_0_1_2 + 0.000503200503200611*G0_0_0_1_3 - 0.00359048359048423*G0_0_0_1_4 - 0.000795395081109498*G0_0_0_1_5 + 0.00363699792271282*G0_0_0_1_6 - 0.000121360121360144*G0_0_0_1_7 - 0.000592000592000671*G0_0_0_1_8 - 0.00143856143856169*G0_0_0_1_9 + 0.0079532460484855*G0_0_0_2_0 + 0.00305993829803406*G0_0_0_2_1 + 0.125800125800147*G0_0_0_2_2 - 0.0125089725089745*G0_0_0_2_3 + 0.0207555407555441*G0_0_0_2_4 - 0.0359048359048419*G0_0_0_2_5 + 0.0861597661597806*G0_0_0_2_6 - 0.00138147566719017*G0_0_0_2_7 + 0.000511234796949177*G0_0_0_2_8 + 0.00667776667776776*G0_0_0_2_9 + 0.00050320050320061*G0_0_0_3_1 - 0.0125089725089745*G0_0_0_3_2 - 0.00905760905761054*G0_0_0_3_3 + 0.0179667951096554*G0_0_0_3_4 + 0.00215403643975104*G0_0_0_3_5 - 0.0129051900480492*G0_0_0_3_6 - 0.00206650492364814*G0_0_0_3_7 + 0.00559440559440651*G0_0_0_3_8 + 0.00844869416298134*G0_0_0_3_9 - 0.0023912595341171*G0_0_0_4_0 - 0.00359048359048423*G0_0_0_4_1 + 0.0207555407555441*G0_0_0_4_2 + 0.0179667951096554*G0_0_0_4_3 - 0.086260406260421*G0_0_0_4_4 + 0.00517958232244041*G0_0_0_4_5 + 0.00772560772560888*G0_0_0_4_6 + 0.00665620094191635*G0_0_0_4_7 - 0.00352790067075837*G0_0_0_4_8 - 0.0303924646781841*G0_0_0_4_9 - 0.00142925857211596*G0_0_0_5_0 - 0.000795395081109498*G0_0_0_5_1 - 0.0359048359048419*G0_0_0_5_2 + 0.00215403643975104*G0_0_0_5_3 + 0.00517958232244041*G0_0_0_5_4 + 0.0166690452404765*G0_0_0_5_5 - 0.0559554730983396*G0_0_0_5_6 - 0.00254221968507725*G0_0_0_5_7 + 0.000391988963417586*G0_0_0_5_8 + 0.00296846011131781*G0_0_0_5_9 + 0.0101058729630175*G0_0_0_6_0 + 0.00363699792271282*G0_0_0_6_1 + 0.0861597661597806*G0_0_0_6_2 - 0.0129051900480492*G0_0_0_6_3 + 0.00772560772560888*G0_0_0_6_4 - 0.0559554730983396*G0_0_0_6_5 + 0.201878121878156*G0_0_0_6_6 + 0.00215023072165967*G0_0_0_6_7 - 0.00522525093953747*G0_0_0_6_8 + 0.00577708006279516*G0_0_0_6_9 + 0.000287543144686058*G0_0_0_7_0 - 0.000121360121360144*G0_0_0_7_1 - 0.00138147566719017*G0_0_0_7_2 - 0.00206650492364814*G0_0_0_7_3 + 0.00665620094191635*G0_0_0_7_4 - 0.00254221968507725*G0_0_0_7_5 + 0.00215023072165967*G0_0_0_7_6 - 0.00464297607154824*G0_0_0_7_7 - 0.00102373816659549*G0_0_0_7_8 - 0.000548023405166329*G0_0_0_7_9 + 0.000385223242366166*G0_0_0_8_0 - 0.000592000592000671*G0_0_0_8_1 + 0.000511234796949176*G0_0_0_8_2 + 0.00559440559440651*G0_0_0_8_3 - 0.00352790067075837*G0_0_0_8_4 + 0.000391988963417586*G0_0_0_8_5 - 0.00522525093953747*G0_0_0_8_6 - 0.00102373816659549*G0_0_0_8_7 + 0.0170496170496197*G0_0_0_8_8 + 0.0113714856572018*G0_0_0_8_9 - 0.00125081267938433*G0_0_0_9_0 - 0.00143856143856169*G0_0_0_9_1 + 0.00667776667776776*G0_0_0_9_2 + 0.00844869416298134*G0_0_0_9_3 - 0.0303924646781841*G0_0_0_9_4 + 0.00296846011131781*G0_0_0_9_5 + 0.00577708006279516*G0_0_0_9_6 - 0.000548023405166329*G0_0_0_9_7 + 0.0113714856572018*G0_0_0_9_8 - 0.0043841872413308*G0_0_0_9_9 - 0.00095622190860305*G0_0_1_0_0 - 0.00330632330632391*G0_0_1_0_1 - 0.00546966261252069*G0_0_1_0_3 - 0.0062561776847502*G0_0_1_0_4 + 0.00234855091997989*G0_0_1_0_5 - 0.00198869913155663*G0_0_1_0_6 + 0.000756915042629478*G0_0_1_0_7 - 0.0039964268535704*G0_0_1_0_8 - 0.0159814788386244*G0_0_1_0_9 - 0.00330632330632391*G0_0_1_1_0 - 0.0840048840048988*G0_0_1_1_1 - 0.0020710154043491*G0_0_1_1_2 - 0.0179376179376212*G0_0_1_1_3 - 0.00200688200688231*G0_0_1_1_4 + 0.00248936248936295*G0_0_1_1_5 - 0.00358456358456421*G0_0_1_1_6 + 0.0114907314907336*G0_0_1_1_7 - 0.0257520257520304*G0_0_1_1_8 - 0.00255744255744305*G0_0_1_1_9 - 0.0020710154043491*G0_0_1_2_1 + 0.00955094288427778*G0_0_1_2_2 - 0.00740635026349435*G0_0_1_2_3 - 0.00635216635216748*G0_0_1_2_4 - 0.00265850551564881*G0_0_1_2_5 + 0.00976208976209139*G0_0_1_2_6 + 0.00251219679791151*G0_0_1_2_7 - 0.00195317909603657*G0_0_1_2_8 - 0.00155019583591038*G0_0_1_2_9 - 0.00546966261252069*G0_0_1_3_0 - 0.0179376179376212*G0_0_1_3_1 - 0.00740635026349435*G0_0_1_3_2 - 0.140659340659365*G0_0_1_3_3 + 0.0923076923077079*G0_0_1_3_4 - 0.000551829123257823*G0_0_1_3_5 + 0.0207982493696815*G0_0_1_3_6 + 0.026453546453551*G0_0_1_3_7 - 0.0423576423576496*G0_0_1_3_8 - 0.0452347652347728*G0_0_1_3_9 - 0.0062561776847502*G0_0_1_4_0 - 0.00200688200688231*G0_0_1_4_1 - 0.00635216635216748*G0_0_1_4_2 + 0.092307692307708*G0_0_1_4_3 - 0.188497217068677*G0_0_1_4_4 + 0.0288130916702394*G0_0_1_4_5 - 0.0496113410399209*G0_0_1_4_6 + 0.000593692022263544*G0_0_1_4_7 + 0.0159040959040986*G0_0_1_4_8 - 0.0529755958327476*G0_0_1_4_9 + 0.00234855091997989*G0_0_1_5_0 + 0.00248936248936295*G0_0_1_5_1 - 0.00265850551564881*G0_0_1_5_2 - 0.000551829123257823*G0_0_1_5_3 + 0.0288130916702394*G0_0_1_5_4 - 0.00661433804291052*G0_0_1_5_5 + 0.00746301317730022*G0_0_1_5_6 - 0.00508443937015451*G0_0_1_5_7 + 0.00257647114790014*G0_0_1_5_8 + 0.0427914942200729*G0_0_1_5_9 - 0.00198869913155663*G0_0_1_6_0 - 0.00358456358456421*G0_0_1_6_1 + 0.00976208976209139*G0_0_1_6_2 + 0.0207982493696815*G0_0_1_6_3 - 0.0496113410399209*G0_0_1_6_4 + 0.00746301317730022*G0_0_1_6_5 + 0.00352409495266697*G0_0_1_6_6 + 0.00250796822225438*G0_0_1_6_7 + 0.00328433471290672*G0_0_1_6_8 - 0.0369459112316319*G0_0_1_6_9 + 0.000756915042629478*G0_0_1_7_0 + 0.0114907314907336*G0_0_1_7_1 + 0.00251219679791151*G0_0_1_7_2 + 0.026453546453551*G0_0_1_7_3 + 0.000593692022263542*G0_0_1_7_4 - 0.00508443937015451*G0_0_1_7_5 + 0.00250796822225437*G0_0_1_7_6 - 0.0158698444412757*G0_0_1_7_7 + 0.0242157842157884*G0_0_1_7_8 + 0.0429285000713645*G0_0_1_7_9 - 0.0039964268535704*G0_0_1_8_0 - 0.0257520257520304*G0_0_1_8_1 - 0.00195317909603657*G0_0_1_8_2 - 0.0423576423576496*G0_0_1_8_3 + 0.0159040959040986*G0_0_1_8_4 + 0.00257647114790014*G0_0_1_8_5 + 0.00328433471290672*G0_0_1_8_6 + 0.0242157842157884*G0_0_1_8_7 + 0.0799200799200932*G0_0_1_8_8 - 0.0241358641358682*G0_0_1_8_9 - 0.0159814788386244*G0_0_1_9_0 - 0.00255744255744305*G0_0_1_9_1 - 0.00155019583591038*G0_0_1_9_2 - 0.0452347652347728*G0_0_1_9_3 - 0.0529755958327476*G0_0_1_9_4 + 0.0427914942200729*G0_0_1_9_5 - 0.0369459112316319*G0_0_1_9_6 + 0.0429285000713645*G0_0_1_9_7 - 0.0241358641358682*G0_0_1_9_8 - 0.142760097045835*G0_0_1_9_9; + A[86] = A[170] - 0.00034166891309752*G0_0_1_0_0 + 0.00303654017939788*G0_0_1_0_1 - 0.000282045996331756*G0_0_1_0_2 - 0.000468949040377691*G0_0_1_0_3 + 0.000317566031851801*G0_0_1_0_4 + 0.000231725946011699*G0_0_1_0_5 - 0.000386068957497585*G0_0_1_0_6 + 0.00182336182336211*G0_0_1_0_7 + 0.00162165876451621*G0_0_1_0_8 + 0.00352916924345556*G0_0_1_0_9 + 0.00303654017939788*G0_0_1_1_0 + 0.0885040885041042*G0_0_1_1_1 + 0.00111141063522036*G0_0_1_1_2 + 0.00929440929441105*G0_0_1_1_3 - 0.00560624560624662*G0_0_1_1_4 - 0.00032433175290328*G0_0_1_1_5 + 0.000241451670023159*G0_0_1_1_6 - 0.0125444925444948*G0_0_1_1_7 + 0.0311984311984368*G0_0_1_1_8 - 0.00049728049728054*G0_0_1_1_9 - 0.000282045996331756*G0_0_1_2_0 + 0.00111141063522036*G0_0_1_2_1 - 0.00505173838507255*G0_0_1_2_2 - 0.00020677734963453*G0_0_1_2_3 - 0.00229104229104267*G0_0_1_2_4 + 0.00160474446188758*G0_0_1_2_5 - 0.00431568431568502*G0_0_1_2_6 - 0.000347166061451841*G0_0_1_2_7 - 0.00138993281850446*G0_0_1_2_8 - 0.00150452721881318*G0_0_1_2_9 - 0.000468949040377691*G0_0_1_3_0 + 0.00929440929441105*G0_0_1_3_1 - 0.00020677734963453*G0_0_1_3_2 - 0.0456077256077334*G0_0_1_3_3 + 0.00639741211169885*G0_0_1_3_4 + 0.00157176157176184*G0_0_1_3_5 - 0.00148803577375035*G0_0_1_3_6 + 0.000643166357452145*G0_0_1_3_7 - 0.0040492840492846*G0_0_1_3_8 + 0.000205508776937327*G0_0_1_3_9 + 0.000317566031851801*G0_0_1_4_0 - 0.00560624560624662*G0_0_1_4_1 - 0.00229104229104267*G0_0_1_4_2 + 0.00639741211169885*G0_0_1_4_3 + 0.00223015080157972*G0_0_1_4_4 - 0.00171637885923631*G0_0_1_4_5 + 0.00320441463298666*G0_0_1_4_6 + 0.000426240426240519*G0_0_1_4_7 + 0.00340611769183247*G0_0_1_4_8 + 0.00794633937491217*G0_0_1_4_9 + 0.000231725946011699*G0_0_1_5_0 - 0.00032433175290328*G0_0_1_5_1 + 0.00160474446188758*G0_0_1_5_2 + 0.00157176157176184*G0_0_1_5_3 - 0.00171637885923631*G0_0_1_5_4 - 0.0011493268636128*G0_0_1_5_5 + 0.00183055040197922*G0_0_1_5_6 - 0.000487131915703417*G0_0_1_5_7 + 0.000209314495028808*G0_0_1_5_8 - 0.0110061367204243*G0_0_1_5_9 - 0.000386068957497585*G0_0_1_6_0 + 0.000241451670023159*G0_0_1_6_1 - 0.00431568431568502*G0_0_1_6_2 - 0.00148803577375035*G0_0_1_6_3 + 0.00320441463298666*G0_0_1_6_4 + 0.00183055040197922*G0_0_1_6_5 - 0.00895866038723323*G0_0_1_6_6 + 0.000277817420674601*G0_0_1_6_7 + 0.00210456210456243*G0_0_1_6_8 + 0.00748965320394023*G0_0_1_6_9 + 0.00182336182336211*G0_0_1_7_0 - 0.0125444925444948*G0_0_1_7_1 - 0.000347166061451841*G0_0_1_7_2 + 0.000643166357452145*G0_0_1_7_3 + 0.00042624042624052*G0_0_1_7_4 - 0.000487131915703417*G0_0_1_7_5 + 0.000277817420674601*G0_0_1_7_6 + 0.00810617953475237*G0_0_1_7_7 - 0.014922220636509*G0_0_1_7_8 - 0.0111431425717159*G0_0_1_7_9 + 0.00162165876451621*G0_0_1_8_0 + 0.0311984311984368*G0_0_1_8_1 - 0.00138993281850446*G0_0_1_8_2 - 0.0040492840492846*G0_0_1_8_3 + 0.00340611769183247*G0_0_1_8_4 + 0.000209314495028809*G0_0_1_8_5 + 0.00210456210456243*G0_0_1_8_6 - 0.014922220636509*G0_0_1_8_7 - 0.0853546453546593*G0_0_1_8_8 - 0.00532039389182334*G0_0_1_8_9 + 0.00352916924345556*G0_0_1_9_0 - 0.00049728049728054*G0_0_1_9_1 - 0.00150452721881318*G0_0_1_9_2 + 0.000205508776937327*G0_0_1_9_3 + 0.00794633937491217*G0_0_1_9_4 - 0.0110061367204243*G0_0_1_9_5 + 0.00748965320394024*G0_0_1_9_6 - 0.0111431425717159*G0_0_1_9_7 - 0.00532039389182334*G0_0_1_9_8 + 0.0287712287712337*G0_0_1_9_9 + 0.00034166891309752*G0_1_0_0_0 - 0.00303654017939788*G0_1_0_0_1 + 0.000282045996331756*G0_1_0_0_2 + 0.000468949040377691*G0_1_0_0_3 - 0.000317566031851801*G0_1_0_0_4 - 0.000231725946011699*G0_1_0_0_5 + 0.000386068957497586*G0_1_0_0_6 - 0.00182336182336211*G0_1_0_0_7 - 0.00162165876451621*G0_1_0_0_8 - 0.00352916924345556*G0_1_0_0_9 - 0.00303654017939788*G0_1_0_1_0 - 0.0885040885041042*G0_1_0_1_1 - 0.00111141063522036*G0_1_0_1_2 - 0.00929440929441105*G0_1_0_1_3 + 0.00560624560624662*G0_1_0_1_4 + 0.00032433175290328*G0_1_0_1_5 - 0.000241451670023158*G0_1_0_1_6 + 0.0125444925444948*G0_1_0_1_7 - 0.0311984311984368*G0_1_0_1_8 + 0.00049728049728054*G0_1_0_1_9 + 0.000282045996331756*G0_1_0_2_0 - 0.00111141063522036*G0_1_0_2_1 + 0.00505173838507255*G0_1_0_2_2 + 0.00020677734963453*G0_1_0_2_3 + 0.00229104229104267*G0_1_0_2_4 - 0.00160474446188758*G0_1_0_2_5 + 0.00431568431568502*G0_1_0_2_6 + 0.000347166061451841*G0_1_0_2_7 + 0.00138993281850446*G0_1_0_2_8 + 0.00150452721881318*G0_1_0_2_9 + 0.000468949040377691*G0_1_0_3_0 - 0.00929440929441104*G0_1_0_3_1 + 0.00020677734963453*G0_1_0_3_2 + 0.0456077256077334*G0_1_0_3_3 - 0.00639741211169885*G0_1_0_3_4 - 0.00157176157176184*G0_1_0_3_5 + 0.00148803577375035*G0_1_0_3_6 - 0.000643166357452145*G0_1_0_3_7 + 0.0040492840492846*G0_1_0_3_8 - 0.000205508776937327*G0_1_0_3_9 - 0.000317566031851801*G0_1_0_4_0 + 0.00560624560624662*G0_1_0_4_1 + 0.00229104229104267*G0_1_0_4_2 - 0.00639741211169885*G0_1_0_4_3 - 0.00223015080157971*G0_1_0_4_4 + 0.00171637885923631*G0_1_0_4_5 - 0.00320441463298665*G0_1_0_4_6 - 0.00042624042624052*G0_1_0_4_7 - 0.00340611769183247*G0_1_0_4_8 - 0.00794633937491217*G0_1_0_4_9 - 0.000231725946011699*G0_1_0_5_0 + 0.00032433175290328*G0_1_0_5_1 - 0.00160474446188758*G0_1_0_5_2 - 0.00157176157176184*G0_1_0_5_3 + 0.00171637885923631*G0_1_0_5_4 + 0.0011493268636128*G0_1_0_5_5 - 0.00183055040197922*G0_1_0_5_6 + 0.000487131915703417*G0_1_0_5_7 - 0.000209314495028808*G0_1_0_5_8 + 0.0110061367204243*G0_1_0_5_9 + 0.000386068957497586*G0_1_0_6_0 - 0.000241451670023158*G0_1_0_6_1 + 0.00431568431568502*G0_1_0_6_2 + 0.00148803577375034*G0_1_0_6_3 - 0.00320441463298666*G0_1_0_6_4 - 0.00183055040197923*G0_1_0_6_5 + 0.00895866038723323*G0_1_0_6_6 - 0.000277817420674601*G0_1_0_6_7 - 0.00210456210456243*G0_1_0_6_8 - 0.00748965320394023*G0_1_0_6_9 - 0.00182336182336211*G0_1_0_7_0 + 0.0125444925444948*G0_1_0_7_1 + 0.000347166061451841*G0_1_0_7_2 - 0.000643166357452144*G0_1_0_7_3 - 0.00042624042624052*G0_1_0_7_4 + 0.000487131915703417*G0_1_0_7_5 - 0.000277817420674601*G0_1_0_7_6 - 0.00810617953475237*G0_1_0_7_7 + 0.014922220636509*G0_1_0_7_8 + 0.0111431425717159*G0_1_0_7_9 - 0.00162165876451621*G0_1_0_8_0 - 0.0311984311984368*G0_1_0_8_1 + 0.00138993281850446*G0_1_0_8_2 + 0.0040492840492846*G0_1_0_8_3 - 0.00340611769183247*G0_1_0_8_4 - 0.000209314495028808*G0_1_0_8_5 - 0.00210456210456243*G0_1_0_8_6 + 0.014922220636509*G0_1_0_8_7 + 0.0853546453546594*G0_1_0_8_8 + 0.00532039389182334*G0_1_0_8_9 - 0.00352916924345556*G0_1_0_9_0 + 0.00049728049728054*G0_1_0_9_1 + 0.00150452721881318*G0_1_0_9_2 - 0.000205508776937327*G0_1_0_9_3 - 0.00794633937491217*G0_1_0_9_4 + 0.0110061367204243*G0_1_0_9_5 - 0.00748965320394023*G0_1_0_9_6 + 0.0111431425717159*G0_1_0_9_7 + 0.00532039389182334*G0_1_0_9_8 - 0.0287712287712337*G0_1_0_9_9; + A[33] = -A[41] - 0.0036748789129748*G0_1_0_0_0 + 0.000628533723771934*G0_1_0_0_1 + 0.00342487318677853*G0_1_0_0_2 + 0.00109987895702201*G0_1_0_0_3 - 0.000899418042275349*G0_1_0_0_5 + 0.00476158761873129*G0_1_0_0_6 + 0.000525823382966314*G0_1_0_0_7 + 0.00108526394240699*G0_1_0_0_8 + 0.00346225203368118*G0_1_0_0_9 + 0.000628533723771933*G0_1_0_1_0 + 0.0153463820130514*G0_1_0_1_1 + 0.00182148539291428*G0_1_0_1_2 + 0.00367595367595435*G0_1_0_1_3 - 0.00171310171310203*G0_1_0_1_4 - 0.000738600024314444*G0_1_0_1_5 + 0.00171355099926558*G0_1_0_1_6 - 0.00169238169238201*G0_1_0_1_7 + 0.00497095497095589*G0_1_0_1_8 - 0.000668220668220766*G0_1_0_1_9 + 0.00342487318677853*G0_1_0_2_0 + 0.00182148539291428*G0_1_0_2_1 + 0.0591889591889691*G0_1_0_2_2 - 0.00446146446146518*G0_1_0_2_3 + 0.0103481703481721*G0_1_0_2_4 - 0.0148836348836374*G0_1_0_2_5 + 0.0359388759388819*G0_1_0_2_6 - 0.000948390234104674*G0_1_0_2_7 + 0.000161769447483763*G0_1_0_2_8 + 0.00259518259518301*G0_1_0_2_9 + 0.00109987895702201*G0_1_0_3_0 + 0.00367595367595435*G0_1_0_3_1 - 0.00446146446146518*G0_1_0_3_2 + 0.023010323010327*G0_1_0_3_3 - 0.00674349460063856*G0_1_0_3_4 + 0.000805385091099505*G0_1_0_3_5 - 0.00783525997811841*G0_1_0_3_6 - 0.00599424385138772*G0_1_0_3_7 + 0.00917415917416071*G0_1_0_3_8 + 0.0139931497074378*G0_1_0_3_9 - 0.00171310171310203*G0_1_0_4_1 + 0.0103481703481721*G0_1_0_4_2 - 0.00674349460063856*G0_1_0_4_3 - 0.0102564102564121*G0_1_0_4_4 - 0.00246777032491358*G0_1_0_4_5 + 0.010303030303032*G0_1_0_4_6 + 0.00288330716902194*G0_1_0_4_7 - 0.00317991532277298*G0_1_0_4_8 - 0.00285000713572188*G0_1_0_4_9 - 0.000899418042275349*G0_1_0_5_0 - 0.000738600024314445*G0_1_0_5_1 - 0.0148836348836374*G0_1_0_5_2 + 0.000805385091099505*G0_1_0_5_3 - 0.00246777032491358*G0_1_0_5_4 + 0.0146910232624542*G0_1_0_5_5 - 0.0263500784929401*G0_1_0_5_6 + 0.000328243185386086*G0_1_0_5_7 - 0.000478806907378411*G0_1_0_5_8 - 0.00942914228628672*G0_1_0_5_9 + 0.00476158761873129*G0_1_0_6_0 + 0.00171355099926558*G0_1_0_6_1 + 0.0359388759388819*G0_1_0_6_2 - 0.00783525997811841*G0_1_0_6_3 + 0.010303030303032*G0_1_0_6_4 - 0.0263500784929401*G0_1_0_6_5 + 0.0588811188811288*G0_1_0_6_6 + 0.000150563721992324*G0_1_0_6_7 - 0.00146567717996313*G0_1_0_6_8 + 0.00788497217068778*G0_1_0_6_9 + 0.000525823382966314*G0_1_0_7_0 - 0.00169238169238201*G0_1_0_7_1 - 0.000948390234104674*G0_1_0_7_2 - 0.00599424385138772*G0_1_0_7_3 + 0.00288330716902194*G0_1_0_7_4 + 0.000328243185386085*G0_1_0_7_5 + 0.000150563721992324*G0_1_0_7_6 + 0.00807763664906657*G0_1_0_7_7 - 0.00793849008134856*G0_1_0_7_8 - 0.0106878835450282*G0_1_0_7_9 + 0.00108526394240699*G0_1_0_8_0 + 0.00497095497095589*G0_1_0_8_1 + 0.000161769447483763*G0_1_0_8_2 + 0.00917415917416071*G0_1_0_8_3 - 0.00317991532277298*G0_1_0_8_4 - 0.000478806907378411*G0_1_0_8_5 - 0.00146567717996313*G0_1_0_8_6 - 0.00793849008134856*G0_1_0_8_7 - 0.0206793206793243*G0_1_0_8_8 + 0.00836449265020828*G0_1_0_8_9 + 0.00346225203368118*G0_1_0_9_0 - 0.000668220668220766*G0_1_0_9_1 + 0.00259518259518301*G0_1_0_9_2 + 0.0139931497074377*G0_1_0_9_3 - 0.00285000713572187*G0_1_0_9_4 - 0.00942914228628672*G0_1_0_9_5 + 0.00788497217068778*G0_1_0_9_6 - 0.0106878835450282*G0_1_0_9_7 + 0.00836449265020828*G0_1_0_9_8 + 0.0213900385328993*G0_1_0_9_9; + A[36] = -A[33] + 0.00209991067133959*G0_1_0_0_0 + 0.00159864826531521*G0_1_0_0_2 + 0.00168593311450483*G0_1_0_0_3 - 0.00137862137862162*G0_1_0_0_4 - 0.00292945150088058*G0_1_0_0_5 + 0.00446220446220524*G0_1_0_0_6 + 0.00135388421102729*G0_1_0_0_7 - 0.000180771609343068*G0_1_0_0_8 + 0.00238237952523706*G0_1_0_0_9 - 0.00209991067133961*G0_1_0_1_1 - 0.0015986482653152*G0_1_0_1_2 + 0.00292945150088056*G0_1_0_1_3 - 0.00446220446220522*G0_1_0_1_4 - 0.00168593311450482*G0_1_0_1_5 + 0.00137862137862162*G0_1_0_1_6 + 0.000180771609343076*G0_1_0_1_7 - 0.00135388421102731*G0_1_0_1_8 - 0.00238237952523706*G0_1_0_1_9 + 0.00159864826531521*G0_1_0_2_0 - 0.0015986482653152*G0_1_0_2_1 + 0.00950160950161109*G0_1_0_2_3 - 0.0219336219336256*G0_1_0_2_4 - 0.00950160950161114*G0_1_0_2_5 + 0.0219336219336257*G0_1_0_2_6 - 0.000992340992341156*G0_1_0_2_7 + 0.000992340992341155*G0_1_0_2_8 + 0.00168593311450483*G0_1_0_3_0 + 0.00292945150088056*G0_1_0_3_1 + 0.00950160950161109*G0_1_0_3_2 + 0.0214985014985052*G0_1_0_3_3 + 0.0129270729270751*G0_1_0_3_4 - 0.00413586413586482*G0_1_0_3_6 - 0.00505779934351447*G0_1_0_3_7 + 0.00803482232053793*G0_1_0_3_8 + 0.0172627372627401*G0_1_0_3_9 - 0.00137862137862162*G0_1_0_4_0 - 0.00446220446220522*G0_1_0_4_1 - 0.0219336219336256*G0_1_0_4_2 + 0.0129270729270751*G0_1_0_4_3 - 0.058941058941069*G0_1_0_4_4 + 0.00413586413586484*G0_1_0_4_5 + 0.00355644355644415*G0_1_0_4_7 - 0.00297702297702345*G0_1_0_4_8 - 0.00827172827172965*G0_1_0_4_9 - 0.00292945150088058*G0_1_0_5_0 - 0.00168593311450482*G0_1_0_5_1 - 0.00950160950161113*G0_1_0_5_2 + 0.00413586413586484*G0_1_0_5_4 - 0.021498501498505*G0_1_0_5_5 - 0.0129270729270752*G0_1_0_5_6 - 0.00803482232053793*G0_1_0_5_7 + 0.00505779934351446*G0_1_0_5_8 - 0.0172627372627401*G0_1_0_5_9 + 0.00446220446220524*G0_1_0_6_0 + 0.00137862137862162*G0_1_0_6_1 + 0.0219336219336257*G0_1_0_6_2 - 0.00413586413586482*G0_1_0_6_3 - 0.0129270729270752*G0_1_0_6_5 + 0.058941058941069*G0_1_0_6_6 + 0.00297702297702348*G0_1_0_6_7 - 0.00355644355644414*G0_1_0_6_8 + 0.00827172827172965*G0_1_0_6_9 + 0.00135388421102729*G0_1_0_7_0 + 0.000180771609343076*G0_1_0_7_1 - 0.000992340992341156*G0_1_0_7_2 - 0.00505779934351447*G0_1_0_7_3 + 0.00355644355644415*G0_1_0_7_4 - 0.00803482232053793*G0_1_0_7_5 + 0.00297702297702348*G0_1_0_7_6 + 0.00145568716997309*G0_1_0_7_7 - 0.0131011845297581*G0_1_0_7_9 - 0.000180771609343068*G0_1_0_8_0 - 0.00135388421102731*G0_1_0_8_1 + 0.000992340992341155*G0_1_0_8_2 + 0.00803482232053793*G0_1_0_8_3 - 0.00297702297702345*G0_1_0_8_4 + 0.00505779934351446*G0_1_0_8_5 - 0.00355644355644414*G0_1_0_8_6 - 0.00145568716997323*G0_1_0_8_8 + 0.0131011845297581*G0_1_0_8_9 + 0.00238237952523706*G0_1_0_9_0 - 0.00238237952523706*G0_1_0_9_1 + 0.0172627372627401*G0_1_0_9_3 - 0.00827172827172965*G0_1_0_9_4 - 0.0172627372627401*G0_1_0_9_5 + 0.00827172827172965*G0_1_0_9_6 - 0.0131011845297581*G0_1_0_9_7 + 0.0131011845297581*G0_1_0_9_8 - 0.0216595045166511*G0_1_1_0_0 - 0.00283956783956834*G0_1_1_0_1 - 0.00180270346937045*G0_1_1_0_2 + 0.000987927416499021*G0_1_1_0_3 - 0.000975664547093294*G0_1_1_0_4 - 0.00556343127771792*G0_1_1_0_5 + 0.00319955177098088*G0_1_1_0_6 - 0.0138780795923676*G0_1_1_0_7 + 0.00411123268266193*G0_1_1_0_8 - 0.000303506017791806*G0_1_1_0_9 - 0.00283956783956834*G0_1_1_1_0 - 0.0237594151879909*G0_1_1_1_1 - 0.00340135173468566*G0_1_1_1_2 - 0.00263397977683742*G0_1_1_1_3 - 0.00126265269122432*G0_1_1_1_4 - 0.000698005698005798*G0_1_1_1_5 + 0.000402956831528321*G0_1_1_1_6 + 0.00429200429200507*G0_1_1_1_7 - 0.0152319638033951*G0_1_1_1_8 - 0.00268588554302887*G0_1_1_1_9 - 0.00180270346937045*G0_1_1_2_0 - 0.00340135173468566*G0_1_1_2_1 - 0.0534613534613625*G0_1_1_2_2 + 0.0133732933732956*G0_1_1_2_3 - 0.029942279942285*G0_1_1_2_4 + 0.00387168387168453*G0_1_1_2_5 - 0.00800865800865938*G0_1_1_2_6 - 0.000874495874496018*G0_1_1_2_7 + 0.000117845117845129*G0_1_1_2_8 - 0.0014496614496617*G0_1_1_2_9 + 0.000987927416499021*G0_1_1_3_0 - 0.00263397977683742*G0_1_1_3_1 + 0.0133732933732956*G0_1_1_3_2 + 0.00870177441606156*G0_1_1_3_3 + 0.0147335997336023*G0_1_1_3_4 - 0.00154464583036038*G0_1_1_3_5 + 0.0010106560106562*G0_1_1_3_6 - 0.000744255744255835*G0_1_1_3_7 - 0.00112173540744994*G0_1_1_3_8 + 0.00954616811759828*G0_1_1_3_9 - 0.000975664547093294*G0_1_1_4_0 - 0.00126265269122432*G0_1_1_4_1 - 0.029942279942285*G0_1_1_4_2 + 0.0147335997336023*G0_1_1_4_3 - 0.0446420246420323*G0_1_1_4_4 + 0.00514652014652103*G0_1_1_4_5 - 0.00615717615717724*G0_1_1_4_6 + 0.00166547737976336*G0_1_1_4_7 + 0.00186599115170578*G0_1_1_4_8 - 0.00594405594405695*G0_1_1_4_9 - 0.00556343127771792*G0_1_1_5_0 - 0.000698005698005798*G0_1_1_5_1 + 0.00387168387168453*G0_1_1_5_2 - 0.00154464583036038*G0_1_1_5_3 + 0.00514652014652103*G0_1_1_5_4 - 0.0127967270824434*G0_1_1_5_5 + 0.00180652680652711*G0_1_1_5_6 - 0.00915655772798782*G0_1_1_5_7 + 0.00431354359925861*G0_1_1_5_8 - 0.00771656914514183*G0_1_1_5_9 + 0.00319955177098088*G0_1_1_6_0 + 0.000402956831528321*G0_1_1_6_1 - 0.00800865800865938*G0_1_1_6_2 + 0.0010106560106562*G0_1_1_6_3 - 0.00615717615717724*G0_1_1_6_4 + 0.00180652680652711*G0_1_1_6_5 + 0.0142990342990367*G0_1_1_6_6 + 0.00484301412872923*G0_1_1_6_7 - 0.00189096617668078*G0_1_1_6_8 + 0.0023276723276727*G0_1_1_6_9 - 0.0138780795923676*G0_1_1_7_0 + 0.00429200429200507*G0_1_1_7_1 - 0.000874495874496018*G0_1_1_7_2 - 0.000744255744255835*G0_1_1_7_3 + 0.00166547737976336*G0_1_1_7_4 - 0.00915655772798782*G0_1_1_7_5 + 0.00484301412872923*G0_1_1_7_6 - 0.0392968935826145*G0_1_1_7_7 + 0.0218098568098606*G0_1_1_7_8 - 0.0087755102040831*G0_1_1_7_9 + 0.00411123268266193*G0_1_1_8_0 - 0.0152319638033951*G0_1_1_8_1 + 0.000117845117845129*G0_1_1_8_2 - 0.00112173540744994*G0_1_1_8_3 + 0.00186599115170578*G0_1_1_8_4 + 0.00431354359925861*G0_1_1_8_5 - 0.00189096617668078*G0_1_1_8_6 + 0.0218098568098606*G0_1_1_8_7 - 0.0407525807525878*G0_1_1_8_8 + 0.00432567432567502*G0_1_1_8_9 - 0.000303506017791806*G0_1_1_9_0 - 0.00268588554302887*G0_1_1_9_1 - 0.0014496614496617*G0_1_1_9_2 + 0.00954616811759828*G0_1_1_9_3 - 0.00594405594405695*G0_1_1_9_4 - 0.00771656914514183*G0_1_1_9_5 + 0.0023276723276727*G0_1_1_9_6 - 0.0087755102040831*G0_1_1_9_7 + 0.00432567432567502*G0_1_1_9_8 - 0.0127586699015292*G0_1_1_9_9; + A[127] = A[113] - 0.000473600473600633*G0_0_1_0_0 + 0.000699335937431296*G0_0_1_0_1 + 0.00266005599338978*G0_0_1_0_2 - 0.00363446077731855*G0_0_1_0_3 + 0.0062661148375445*G0_0_1_0_4 - 0.0104162504162522*G0_0_1_0_5 + 0.0162047476333219*G0_0_1_0_6 - 0.00311688311688371*G0_0_1_0_7 + 0.000167451596023078*G0_0_1_0_8 + 0.00611198325484146*G0_0_1_0_9 + 0.000699335937431296*G0_0_1_1_0 + 0.00203309917595668*G0_0_1_1_1 - 0.000741974075307518*G0_0_1_1_2 - 0.00669362383648212*G0_0_1_1_3 + 0.00856349999207289*G0_0_1_1_4 - 0.00285999714571193*G0_0_1_1_5 + 0.0279244564958899*G0_0_1_1_6 - 0.00059813202670357*G0_0_1_1_7 - 0.00323739752311234*G0_0_1_1_8 + 0.0181494695780441*G0_0_1_1_9 + 0.00266005599338979*G0_0_1_2_0 - 0.00074197407530752*G0_0_1_2_1 + 0.000749867416534433*G0_0_1_2_2 + 0.00244200244200281*G0_0_1_2_3 - 0.00435120435120501*G0_0_1_2_4 - 0.0143412143412168*G0_0_1_2_5 + 0.0198912198912234*G0_0_1_2_6 - 0.00031968031968038*G0_0_1_2_7 + 0.00133200133200156*G0_0_1_2_8 - 0.00719280719280841*G0_0_1_2_9 - 0.00363446077731855*G0_0_1_3_0 - 0.00669362383648212*G0_0_1_3_1 + 0.00244200244200279*G0_0_1_3_2 + 0.0212815755672935*G0_0_1_3_3 - 0.0289310689310739*G0_0_1_3_4 + 0.0140088482945649*G0_0_1_3_5 - 0.0923076923077078*G0_0_1_3_6 + 0.00236905951191704*G0_0_1_3_7 + 0.0101612673041262*G0_0_1_3_8 - 0.0591865277579663*G0_0_1_3_9 + 0.0062661148375445*G0_0_1_4_0 + 0.00856349999207289*G0_0_1_4_1 - 0.00435120435120503*G0_0_1_4_2 - 0.0289310689310739*G0_0_1_4_3 + 0.0310089910089965*G0_0_1_4_4 - 0.027332667332672*G0_0_1_4_5 + 0.11964035964038*G0_0_1_4_6 - 0.00465249036677686*G0_0_1_4_7 - 0.0125303268160432*G0_0_1_4_8 + 0.0762437562437691*G0_0_1_4_9 - 0.0104162504162522*G0_0_1_5_0 - 0.00285999714571193*G0_0_1_5_1 - 0.0143412143412168*G0_0_1_5_2 + 0.0140088482945649*G0_0_1_5_3 - 0.027332667332672*G0_0_1_5_4 + 0.0684344227201487*G0_0_1_5_5 - 0.0659340659340771*G0_0_1_5_6 + 0.0075296132439002*G0_0_1_5_7 - 0.0184272869987187*G0_0_1_5_9 + 0.0162047476333219*G0_0_1_6_0 + 0.0279244564958899*G0_0_1_6_1 + 0.0198912198912234*G0_0_1_6_2 - 0.0923076923077078*G0_0_1_6_3 + 0.11964035964038*G0_0_1_6_4 - 0.0659340659340771*G0_0_1_6_5 + 0.624815184815291*G0_0_1_6_6 - 0.00757528186099734*G0_0_1_6_7 - 0.0396175253318177*G0_0_1_6_8 + 0.206193806193841*G0_0_1_6_9 - 0.00311688311688371*G0_0_1_7_0 - 0.000598132026703571*G0_0_1_7_1 - 0.00031968031968038*G0_0_1_7_2 + 0.00236905951191704*G0_0_1_7_3 - 0.00465249036677686*G0_0_1_7_4 + 0.0075296132439002*G0_0_1_7_5 - 0.00757528186099734*G0_0_1_7_6 - 0.00565149136577826*G0_0_1_7_7 + 0.000770657913515211*G0_0_1_7_8 - 0.00318538604252944*G0_0_1_7_9 + 0.000167451596023079*G0_0_1_8_0 - 0.00323739752311234*G0_0_1_8_1 + 0.00133200133200156*G0_0_1_8_2 + 0.0101612673041262*G0_0_1_8_3 - 0.0125303268160432*G0_0_1_8_4 - 0.0396175253318177*G0_0_1_8_6 + 0.00077065791351521*G0_0_1_8_7 + 0.00349364920793556*G0_0_1_8_8 - 0.0293877551020457*G0_0_1_8_9 + 0.00611198325484146*G0_0_1_9_0 + 0.0181494695780441*G0_0_1_9_1 - 0.00719280719280841*G0_0_1_9_2 - 0.0591865277579663*G0_0_1_9_3 + 0.0762437562437691*G0_0_1_9_4 - 0.0184272869987187*G0_0_1_9_5 + 0.206193806193841*G0_0_1_9_6 - 0.00318538604252944*G0_0_1_9_7 - 0.0293877551020458*G0_0_1_9_8 + 0.170161267304153*G0_0_1_9_9 + 0.000473600473600633*G0_1_0_0_0 - 0.000699335937431296*G0_1_0_0_1 - 0.00266005599338979*G0_1_0_0_2 + 0.00363446077731855*G0_1_0_0_3 - 0.0062661148375445*G0_1_0_0_4 + 0.0104162504162522*G0_1_0_0_5 - 0.0162047476333219*G0_1_0_0_6 + 0.00311688311688371*G0_1_0_0_7 - 0.000167451596023078*G0_1_0_0_8 - 0.00611198325484146*G0_1_0_0_9 - 0.000699335937431296*G0_1_0_1_0 - 0.00203309917595668*G0_1_0_1_1 + 0.000741974075307518*G0_1_0_1_2 + 0.00669362383648212*G0_1_0_1_3 - 0.00856349999207289*G0_1_0_1_4 + 0.00285999714571193*G0_1_0_1_5 - 0.0279244564958899*G0_1_0_1_6 + 0.00059813202670357*G0_1_0_1_7 + 0.00323739752311234*G0_1_0_1_8 - 0.0181494695780441*G0_1_0_1_9 - 0.00266005599338979*G0_1_0_2_0 + 0.00074197407530752*G0_1_0_2_1 - 0.000749867416534489*G0_1_0_2_2 - 0.00244200244200281*G0_1_0_2_3 + 0.00435120435120501*G0_1_0_2_4 + 0.0143412143412168*G0_1_0_2_5 - 0.0198912198912234*G0_1_0_2_6 + 0.00031968031968038*G0_1_0_2_7 - 0.00133200133200156*G0_1_0_2_8 + 0.00719280719280841*G0_1_0_2_9 + 0.00363446077731855*G0_1_0_3_0 + 0.00669362383648212*G0_1_0_3_1 - 0.00244200244200279*G0_1_0_3_2 - 0.0212815755672935*G0_1_0_3_3 + 0.0289310689310739*G0_1_0_3_4 - 0.0140088482945649*G0_1_0_3_5 + 0.0923076923077078*G0_1_0_3_6 - 0.00236905951191704*G0_1_0_3_7 - 0.0101612673041262*G0_1_0_3_8 + 0.0591865277579663*G0_1_0_3_9 - 0.0062661148375445*G0_1_0_4_0 - 0.00856349999207289*G0_1_0_4_1 + 0.00435120435120503*G0_1_0_4_2 + 0.0289310689310739*G0_1_0_4_3 - 0.0310089910089965*G0_1_0_4_4 + 0.027332667332672*G0_1_0_4_5 - 0.11964035964038*G0_1_0_4_6 + 0.00465249036677686*G0_1_0_4_7 + 0.0125303268160432*G0_1_0_4_8 - 0.0762437562437691*G0_1_0_4_9 + 0.0104162504162522*G0_1_0_5_0 + 0.00285999714571193*G0_1_0_5_1 + 0.0143412143412168*G0_1_0_5_2 - 0.0140088482945649*G0_1_0_5_3 + 0.027332667332672*G0_1_0_5_4 - 0.0684344227201487*G0_1_0_5_5 + 0.0659340659340771*G0_1_0_5_6 - 0.0075296132439002*G0_1_0_5_7 + 0.0184272869987187*G0_1_0_5_9 - 0.0162047476333219*G0_1_0_6_0 - 0.0279244564958899*G0_1_0_6_1 - 0.0198912198912234*G0_1_0_6_2 + 0.0923076923077078*G0_1_0_6_3 - 0.11964035964038*G0_1_0_6_4 + 0.0659340659340771*G0_1_0_6_5 - 0.624815184815291*G0_1_0_6_6 + 0.00757528186099734*G0_1_0_6_7 + 0.0396175253318177*G0_1_0_6_8 - 0.206193806193841*G0_1_0_6_9 + 0.00311688311688371*G0_1_0_7_0 + 0.000598132026703571*G0_1_0_7_1 + 0.00031968031968038*G0_1_0_7_2 - 0.00236905951191704*G0_1_0_7_3 + 0.00465249036677686*G0_1_0_7_4 - 0.0075296132439002*G0_1_0_7_5 + 0.00757528186099734*G0_1_0_7_6 + 0.00565149136577826*G0_1_0_7_7 - 0.00077065791351521*G0_1_0_7_8 + 0.00318538604252944*G0_1_0_7_9 - 0.000167451596023079*G0_1_0_8_0 + 0.00323739752311234*G0_1_0_8_1 - 0.00133200133200156*G0_1_0_8_2 - 0.0101612673041262*G0_1_0_8_3 + 0.0125303268160432*G0_1_0_8_4 + 0.0396175253318177*G0_1_0_8_6 - 0.00077065791351521*G0_1_0_8_7 - 0.00349364920793556*G0_1_0_8_8 + 0.0293877551020457*G0_1_0_8_9 - 0.00611198325484146*G0_1_0_9_0 - 0.0181494695780441*G0_1_0_9_1 + 0.00719280719280841*G0_1_0_9_2 + 0.0591865277579663*G0_1_0_9_3 - 0.0762437562437691*G0_1_0_9_4 + 0.0184272869987187*G0_1_0_9_5 - 0.206193806193841*G0_1_0_9_6 + 0.00318538604252944*G0_1_0_9_7 + 0.0293877551020458*G0_1_0_9_8 - 0.170161267304153*G0_1_0_9_9; + A[62] = -A[107] - 0.00151284341760561*G0_0_1_0_0 - 0.00231632564965937*G0_0_1_0_2 - 0.000520431949003474*G0_0_1_0_3 + 0.000449550449550548*G0_0_1_0_4 + 0.00243106100248998*G0_0_1_0_5 - 0.00889332889333042*G0_0_1_0_6 - 0.000586873444016425*G0_0_1_0_7 + 0.000544851973423507*G0_0_1_0_8 - 0.00207601921887671*G0_0_1_0_9 + 0.0015128434176056*G0_0_1_1_1 + 0.00231632564965939*G0_0_1_1_2 - 0.00243106100248999*G0_0_1_1_3 + 0.00889332889333042*G0_0_1_1_4 + 0.000520431949003468*G0_0_1_1_5 - 0.000449550449550529*G0_0_1_1_6 - 0.000544851973423503*G0_0_1_1_7 + 0.000586873444016414*G0_0_1_1_8 + 0.00207601921887672*G0_0_1_1_9 - 0.00231632564965937*G0_0_1_2_0 + 0.00231632564965939*G0_0_1_2_1 - 0.011899211899214*G0_0_1_2_3 + 0.0381840381840448*G0_0_1_2_4 + 0.0118992118992139*G0_0_1_2_5 - 0.0381840381840446*G0_0_1_2_6 - 0.000502830502830593*G0_0_1_2_7 + 0.000502830502830584*G0_0_1_2_8 - 0.000520431949003474*G0_0_1_3_0 - 0.00243106100248999*G0_0_1_3_1 - 0.011899211899214*G0_0_1_3_2 + 0.0075524475524489*G0_0_1_3_3 - 0.0445054945055021*G0_0_1_3_4 + 0.00134865134865151*G0_0_1_3_6 + 0.00156129584701039*G0_0_1_3_7 - 0.00935064935065094*G0_0_1_3_9 + 0.000449550449550548*G0_0_1_4_0 + 0.00889332889333043*G0_0_1_4_1 + 0.0381840381840448*G0_0_1_4_2 - 0.0445054945055021*G0_0_1_4_3 + 0.0998001998002171*G0_0_1_4_4 - 0.00134865134865162*G0_0_1_4_5 - 0.00150849150849177*G0_0_1_4_8 + 0.00269730269730319*G0_0_1_4_9 + 0.00243106100248998*G0_0_1_5_0 + 0.000520431949003468*G0_0_1_5_1 + 0.0118992118992139*G0_0_1_5_2 - 0.00134865134865162*G0_0_1_5_4 - 0.0075524475524488*G0_0_1_5_5 + 0.0445054945055021*G0_0_1_5_6 - 0.00156129584701039*G0_0_1_5_8 + 0.00935064935065092*G0_0_1_5_9 - 0.00889332889333042*G0_0_1_6_0 - 0.000449550449550528*G0_0_1_6_1 - 0.0381840381840446*G0_0_1_6_2 + 0.00134865134865151*G0_0_1_6_3 + 0.0445054945055021*G0_0_1_6_5 - 0.0998001998002167*G0_0_1_6_6 + 0.00150849150849177*G0_0_1_6_7 - 0.00269730269730307*G0_0_1_6_9 - 0.000586873444016425*G0_0_1_7_0 - 0.000544851973423503*G0_0_1_7_1 - 0.000502830502830593*G0_0_1_7_2 + 0.00156129584701039*G0_0_1_7_3 + 0.00150849150849177*G0_0_1_7_6 - 0.00235478806907428*G0_0_1_7_7 + 0.0032110746396466*G0_0_1_7_9 + 0.000544851973423507*G0_0_1_8_0 + 0.000586873444016414*G0_0_1_8_1 + 0.000502830502830584*G0_0_1_8_2 - 0.00150849150849177*G0_0_1_8_4 - 0.00156129584701039*G0_0_1_8_5 + 0.00235478806907419*G0_0_1_8_8 - 0.00321107463964662*G0_0_1_8_9 - 0.00207601921887671*G0_0_1_9_0 + 0.00207601921887672*G0_0_1_9_1 - 0.00935064935065094*G0_0_1_9_3 + 0.00269730269730319*G0_0_1_9_4 + 0.00935064935065092*G0_0_1_9_5 - 0.00269730269730307*G0_0_1_9_6 + 0.0032110746396466*G0_0_1_9_7 - 0.00321107463964662*G0_0_1_9_8 + 0.016702406940505*G0_1_1_0_0 + 0.00242005128909933*G0_1_1_0_1 + 0.00303250761584147*G0_1_1_0_2 + 0.000919655741084461*G0_1_1_0_3 + 0.000175399996828614*G0_1_1_0_4 + 0.00550691372120036*G0_1_1_0_5 - 0.00495048602191544*G0_1_1_0_6 + 0.0106597767312071*G0_1_1_0_7 - 0.00285337678194867*G0_1_1_0_8 + 0.000553256267542094*G0_1_1_0_9 + 0.00242005128909933*G0_1_1_1_0 + 0.0182152503581108*G0_1_1_1_1 + 0.00534883326550085*G0_1_1_1_2 + 0.00307585271871043*G0_1_1_1_3 + 0.00394284287141496*G0_1_1_1_4 + 0.00144008769008792*G0_1_1_1_5 - 0.000274150452721921*G0_1_1_1_6 - 0.00339822875537224*G0_1_1_1_7 + 0.0112466501752236*G0_1_1_1_8 + 0.00262927548641881*G0_1_1_1_9 + 0.00303250761584147*G0_1_1_2_0 + 0.00534883326550085*G0_1_1_2_1 + 0.110111801778487*G0_1_1_2_2 - 0.0202702852702887*G0_1_1_2_3 + 0.0522463647463736*G0_1_1_2_4 - 0.00837107337107476*G0_1_1_2_5 + 0.0140623265623289*G0_1_1_2_6 + 0.00072080697080709*G0_1_1_2_7 + 0.00122363747363769*G0_1_1_2_8 + 0.00402430902430969*G0_1_1_2_9 + 0.000919655741084461*G0_1_1_3_0 + 0.00307585271871043*G0_1_1_3_1 - 0.0202702852702887*G0_1_1_3_2 + 0.0315513058370256*G0_1_1_3_3 - 0.0392470029970097*G0_1_1_3_4 - 0.00173790495219095*G0_1_1_3_5 - 0.00278096903096951*G0_1_1_3_6 - 0.00636238761238871*G0_1_1_3_7 + 0.013636720422437*G0_1_1_3_8 + 0.00483694876552099*G0_1_1_3_9 + 0.000175399996828614*G0_1_1_4_0 + 0.00394284287141496*G0_1_1_4_1 + 0.0522463647463736*G0_1_1_4_2 - 0.0392470029970097*G0_1_1_4_3 + 0.0674275724275841*G0_1_1_4_4 - 0.00412962037962109*G0_1_1_4_5 + 0.00691058941059061*G0_1_1_4_6 + 0.000457399743114114*G0_1_1_4_7 - 0.00727433281004833*G0_1_1_4_8 - 0.0038136863136869*G0_1_1_4_9 + 0.00550691372120036*G0_1_1_5_0 + 0.00144008769008792*G0_1_1_5_1 - 0.00837107337107475*G0_1_1_5_2 - 0.00173790495219095*G0_1_1_5_3 - 0.00412962037962109*G0_1_1_5_4 + 0.0239988582845765*G0_1_1_5_5 + 0.00525849150849249*G0_1_1_5_6 + 0.0136895247609556*G0_1_1_5_7 - 0.00792368345939906*G0_1_1_5_8 + 0.0141875981161719*G0_1_1_5_9 - 0.00495048602191544*G0_1_1_6_0 - 0.000274150452721922*G0_1_1_6_1 + 0.0140623265623289*G0_1_1_6_2 - 0.00278096903096951*G0_1_1_6_3 + 0.00691058941059061*G0_1_1_6_4 + 0.00525849150849249*G0_1_1_6_5 - 0.0323726273726329*G0_1_1_6_6 - 0.00576584130155654*G0_1_1_6_7 + 0.000377479663194005*G0_1_1_6_8 - 0.00651098901099003*G0_1_1_6_9 + 0.0106597767312071*G0_1_1_7_0 - 0.00339822875537224*G0_1_1_7_1 + 0.00072080697080709*G0_1_1_7_2 - 0.00636238761238871*G0_1_1_7_3 + 0.000457399743114115*G0_1_1_7_4 + 0.0136895247609556*G0_1_1_7_5 - 0.00576584130155654*G0_1_1_7_6 + 0.0589481946624903*G0_1_1_7_7 - 0.0206249108034858*G0_1_1_7_8 + 0.00987191380048687*G0_1_1_7_9 - 0.00285337678194867*G0_1_1_8_0 + 0.0112466501752236*G0_1_1_8_1 + 0.00122363747363769*G0_1_1_8_2 + 0.013636720422437*G0_1_1_8_3 - 0.00727433281004833*G0_1_1_8_4 - 0.00792368345939906*G0_1_1_8_5 + 0.000377479663194005*G0_1_1_8_6 - 0.0206249108034858*G0_1_1_8_7 + 0.0613029827315647*G0_1_1_8_8 + 0.00666083916084028*G0_1_1_8_9 + 0.000553256267542095*G0_1_1_9_0 + 0.00262927548641881*G0_1_1_9_1 + 0.00402430902430969*G0_1_1_9_2 + 0.00483694876552099*G0_1_1_9_3 - 0.0038136863136869*G0_1_1_9_4 + 0.0141875981161719*G0_1_1_9_5 - 0.00651098901099003*G0_1_1_9_6 + 0.00987191380048687*G0_1_1_9_7 + 0.00666083916084028*G0_1_1_9_8 + 0.0485129156557809*G0_1_1_9_9; + A[44] = A[212] - 0.00151284341760561*G0_0_1_0_0 - 0.00231632564965936*G0_0_1_0_2 - 0.000520431949003479*G0_0_1_0_3 + 0.00044955044955056*G0_0_1_0_4 + 0.00243106100248997*G0_0_1_0_5 - 0.0088933288933304*G0_0_1_0_6 - 0.000586873444016426*G0_0_1_0_7 + 0.000544851973423506*G0_0_1_0_8 - 0.00207601921887671*G0_0_1_0_9 + 0.0015128434176056*G0_0_1_1_1 + 0.0023163256496594*G0_0_1_1_2 - 0.00243106100249*G0_0_1_1_3 + 0.00889332889333044*G0_0_1_1_4 + 0.000520431949003462*G0_0_1_1_5 - 0.000449550449550515*G0_0_1_1_6 - 0.000544851973423503*G0_0_1_1_7 + 0.000586873444016413*G0_0_1_1_8 + 0.00207601921887673*G0_0_1_1_9 - 0.00231632564965936*G0_0_1_2_0 + 0.0023163256496594*G0_0_1_2_1 - 0.011899211899214*G0_0_1_2_3 + 0.0381840381840449*G0_0_1_2_4 + 0.0118992118992138*G0_0_1_2_5 - 0.0381840381840445*G0_0_1_2_6 - 0.000502830502830597*G0_0_1_2_7 + 0.000502830502830581*G0_0_1_2_8 - 0.000520431949003479*G0_0_1_3_0 - 0.00243106100249*G0_0_1_3_1 - 0.011899211899214*G0_0_1_3_2 + 0.00755244755244894*G0_0_1_3_3 - 0.0445054945055022*G0_0_1_3_4 + 0.00134865134865147*G0_0_1_3_6 + 0.00156129584701039*G0_0_1_3_7 - 0.00935064935065096*G0_0_1_3_9 + 0.000449550449550559*G0_0_1_4_0 + 0.00889332889333044*G0_0_1_4_1 + 0.0381840381840449*G0_0_1_4_2 - 0.0445054945055022*G0_0_1_4_3 + 0.0998001998002172*G0_0_1_4_4 - 0.00134865134865167*G0_0_1_4_5 - 0.00150849150849177*G0_0_1_4_8 + 0.00269730269730321*G0_0_1_4_9 + 0.00243106100248997*G0_0_1_5_0 + 0.000520431949003462*G0_0_1_5_1 + 0.0118992118992138*G0_0_1_5_2 - 0.00134865134865167*G0_0_1_5_4 - 0.00755244755244877*G0_0_1_5_5 + 0.044505494505502*G0_0_1_5_6 - 0.00156129584701039*G0_0_1_5_8 + 0.00935064935065092*G0_0_1_5_9 - 0.0088933288933304*G0_0_1_6_0 - 0.000449550449550515*G0_0_1_6_1 - 0.0381840381840445*G0_0_1_6_2 + 0.00134865134865147*G0_0_1_6_3 + 0.044505494505502*G0_0_1_6_5 - 0.0998001998002165*G0_0_1_6_6 + 0.00150849150849176*G0_0_1_6_7 - 0.00269730269730304*G0_0_1_6_9 - 0.000586873444016426*G0_0_1_7_0 - 0.000544851973423503*G0_0_1_7_1 - 0.000502830502830597*G0_0_1_7_2 + 0.00156129584701039*G0_0_1_7_3 + 0.00150849150849176*G0_0_1_7_6 - 0.00235478806907428*G0_0_1_7_7 + 0.0032110746396466*G0_0_1_7_9 + 0.000544851973423506*G0_0_1_8_0 + 0.000586873444016413*G0_0_1_8_1 + 0.000502830502830581*G0_0_1_8_2 - 0.00150849150849177*G0_0_1_8_4 - 0.00156129584701039*G0_0_1_8_5 + 0.00235478806907419*G0_0_1_8_8 - 0.00321107463964662*G0_0_1_8_9 - 0.00207601921887671*G0_0_1_9_0 + 0.00207601921887672*G0_0_1_9_1 - 0.00935064935065096*G0_0_1_9_3 + 0.00269730269730321*G0_0_1_9_4 + 0.00935064935065092*G0_0_1_9_5 - 0.00269730269730304*G0_0_1_9_6 + 0.0032110746396466*G0_0_1_9_7 - 0.00321107463964662*G0_0_1_9_8 + 0.00151284341760561*G0_1_0_0_0 + 0.00231632564965936*G0_1_0_0_2 + 0.000520431949003479*G0_1_0_0_3 - 0.00044955044955056*G0_1_0_0_4 - 0.00243106100248997*G0_1_0_0_5 + 0.0088933288933304*G0_1_0_0_6 + 0.000586873444016426*G0_1_0_0_7 - 0.000544851973423506*G0_1_0_0_8 + 0.00207601921887671*G0_1_0_0_9 - 0.0015128434176056*G0_1_0_1_1 - 0.0023163256496594*G0_1_0_1_2 + 0.00243106100249*G0_1_0_1_3 - 0.00889332889333044*G0_1_0_1_4 - 0.000520431949003462*G0_1_0_1_5 + 0.000449550449550515*G0_1_0_1_6 + 0.000544851973423503*G0_1_0_1_7 - 0.000586873444016413*G0_1_0_1_8 - 0.00207601921887673*G0_1_0_1_9 + 0.00231632564965936*G0_1_0_2_0 - 0.0023163256496594*G0_1_0_2_1 + 0.011899211899214*G0_1_0_2_3 - 0.0381840381840449*G0_1_0_2_4 - 0.0118992118992138*G0_1_0_2_5 + 0.0381840381840445*G0_1_0_2_6 + 0.000502830502830597*G0_1_0_2_7 - 0.000502830502830581*G0_1_0_2_8 + 0.000520431949003479*G0_1_0_3_0 + 0.00243106100249*G0_1_0_3_1 + 0.011899211899214*G0_1_0_3_2 - 0.00755244755244894*G0_1_0_3_3 + 0.0445054945055022*G0_1_0_3_4 - 0.00134865134865147*G0_1_0_3_6 - 0.00156129584701039*G0_1_0_3_7 + 0.00935064935065096*G0_1_0_3_9 - 0.000449550449550559*G0_1_0_4_0 - 0.00889332889333044*G0_1_0_4_1 - 0.0381840381840449*G0_1_0_4_2 + 0.0445054945055022*G0_1_0_4_3 - 0.0998001998002172*G0_1_0_4_4 + 0.00134865134865167*G0_1_0_4_5 + 0.00150849150849177*G0_1_0_4_8 - 0.00269730269730321*G0_1_0_4_9 - 0.00243106100248997*G0_1_0_5_0 - 0.000520431949003462*G0_1_0_5_1 - 0.0118992118992138*G0_1_0_5_2 + 0.00134865134865167*G0_1_0_5_4 + 0.00755244755244877*G0_1_0_5_5 - 0.044505494505502*G0_1_0_5_6 + 0.00156129584701039*G0_1_0_5_8 - 0.00935064935065092*G0_1_0_5_9 + 0.0088933288933304*G0_1_0_6_0 + 0.000449550449550514*G0_1_0_6_1 + 0.0381840381840445*G0_1_0_6_2 - 0.00134865134865147*G0_1_0_6_3 - 0.044505494505502*G0_1_0_6_5 + 0.0998001998002165*G0_1_0_6_6 - 0.00150849150849176*G0_1_0_6_7 + 0.00269730269730304*G0_1_0_6_9 + 0.000586873444016426*G0_1_0_7_0 + 0.000544851973423503*G0_1_0_7_1 + 0.000502830502830597*G0_1_0_7_2 - 0.00156129584701039*G0_1_0_7_3 - 0.00150849150849176*G0_1_0_7_6 + 0.00235478806907428*G0_1_0_7_7 - 0.0032110746396466*G0_1_0_7_9 - 0.000544851973423506*G0_1_0_8_0 - 0.000586873444016413*G0_1_0_8_1 - 0.000502830502830581*G0_1_0_8_2 + 0.00150849150849177*G0_1_0_8_4 + 0.00156129584701039*G0_1_0_8_5 - 0.00235478806907419*G0_1_0_8_8 + 0.00321107463964662*G0_1_0_8_9 + 0.00207601921887671*G0_1_0_9_0 - 0.00207601921887673*G0_1_0_9_1 + 0.00935064935065096*G0_1_0_9_3 - 0.00269730269730321*G0_1_0_9_4 - 0.00935064935065092*G0_1_0_9_5 + 0.00269730269730304*G0_1_0_9_6 - 0.0032110746396466*G0_1_0_9_7 + 0.00321107463964662*G0_1_0_9_8; + A[141] = A[99] + 0.294322960989678*G0_0_1_0_0 + 0.00879614212947701*G0_0_1_0_1 + 0.00879614212947697*G0_0_1_0_2 - 0.000666000666000888*G0_0_1_0_3 - 0.000666000666000769*G0_0_1_0_4 + 0.0811632811632953*G0_0_1_0_5 - 0.0395160395160464*G0_0_1_0_6 + 0.0811632811632952*G0_0_1_0_7 - 0.0395160395160464*G0_0_1_0_8 + 0.00426240426240517*G0_0_1_0_9 + 0.00879614212947701*G0_0_1_1_0 - 0.001841403746166*G0_0_1_1_1 - 0.00107419916943745*G0_0_1_1_2 + 0.000279085993371693*G0_0_1_1_3 + 0.00136371564943019*G0_0_1_1_4 - 0.0102031302031319*G0_0_1_1_5 + 0.00370296370296431*G0_0_1_1_6 - 0.00737928737928855*G0_0_1_1_7 + 0.00298368298368344*G0_0_1_1_8 - 0.00868464868465015*G0_0_1_1_9 + 0.00879614212947697*G0_0_1_2_0 - 0.00107419916943745*G0_0_1_2_1 - 0.00184140374616599*G0_0_1_2_2 + 0.00136371564943017*G0_0_1_2_3 + 0.000279085993371728*G0_0_1_2_4 - 0.00737928737928859*G0_0_1_2_5 + 0.00298368298368346*G0_0_1_2_6 - 0.0102031302031319*G0_0_1_2_7 + 0.00370296370296432*G0_0_1_2_8 - 0.00868464868465015*G0_0_1_2_9 - 0.000666000666000888*G0_0_1_3_0 + 0.000279085993371693*G0_0_1_3_1 + 0.00136371564943017*G0_0_1_3_2 - 0.00632510346796204*G0_0_1_3_3 - 0.000468103325246197*G0_0_1_3_4 + 0.0130269730269752*G0_0_1_3_5 - 0.0045554445554453*G0_0_1_3_6 + 0.00855144855144999*G0_0_1_3_7 - 0.00399600399600469*G0_0_1_3_8 + 0.00895104895105042*G0_0_1_3_9 - 0.00066600066600077*G0_0_1_4_0 + 0.00136371564943019*G0_0_1_4_1 + 0.000279085993371728*G0_0_1_4_2 - 0.000468103325246198*G0_0_1_4_3 - 0.00632510346796197*G0_0_1_4_4 + 0.00855144855145002*G0_0_1_4_5 - 0.00399600399600469*G0_0_1_4_6 + 0.0130269730269752*G0_0_1_4_7 - 0.00455544455544532*G0_0_1_4_8 + 0.00895104895105046*G0_0_1_4_9 + 0.0811632811632953*G0_0_1_5_0 - 0.0102031302031319*G0_0_1_5_1 - 0.00737928737928859*G0_0_1_5_2 + 0.0130269730269752*G0_0_1_5_3 + 0.00855144855145002*G0_0_1_5_4 - 0.148651348651373*G0_0_1_5_5 + 0.0307692307692358*G0_0_1_5_6 - 0.0743256743256865*G0_0_1_5_7 + 0.0371628371628433*G0_0_1_5_8 - 0.0871128871129017*G0_0_1_5_9 - 0.0395160395160464*G0_0_1_6_0 + 0.00370296370296431*G0_0_1_6_1 + 0.00298368298368346*G0_0_1_6_2 - 0.0045554445554453*G0_0_1_6_3 - 0.00399600399600469*G0_0_1_6_4 + 0.0307692307692358*G0_0_1_6_5 - 0.010389610389612*G0_0_1_6_6 + 0.0371628371628433*G0_0_1_6_7 - 0.0143856143856168*G0_0_1_6_8 + 0.0351648351648411*G0_0_1_6_9 + 0.0811632811632952*G0_0_1_7_0 - 0.00737928737928855*G0_0_1_7_1 - 0.0102031302031319*G0_0_1_7_2 + 0.00855144855144999*G0_0_1_7_3 + 0.0130269730269752*G0_0_1_7_4 - 0.0743256743256865*G0_0_1_7_5 + 0.0371628371628433*G0_0_1_7_6 - 0.148651348651373*G0_0_1_7_7 + 0.0307692307692358*G0_0_1_7_8 - 0.0871128871129017*G0_0_1_7_9 - 0.0395160395160464*G0_0_1_8_0 + 0.00298368298368344*G0_0_1_8_1 + 0.00370296370296432*G0_0_1_8_2 - 0.00399600399600469*G0_0_1_8_3 - 0.00455544455544532*G0_0_1_8_4 + 0.0371628371628433*G0_0_1_8_5 - 0.0143856143856168*G0_0_1_8_6 + 0.0307692307692357*G0_0_1_8_7 - 0.0103896103896121*G0_0_1_8_8 + 0.0351648351648411*G0_0_1_8_9 + 0.00426240426240517*G0_0_1_9_0 - 0.00868464868465015*G0_0_1_9_1 - 0.00868464868465015*G0_0_1_9_2 + 0.00895104895105042*G0_0_1_9_3 + 0.00895104895105046*G0_0_1_9_4 - 0.0871128871129017*G0_0_1_9_5 + 0.0351648351648411*G0_0_1_9_6 - 0.0871128871129017*G0_0_1_9_7 + 0.0351648351648411*G0_0_1_9_8 - 0.0671328671328785*G0_0_1_9_9 - 0.294322960989678*G0_1_0_0_0 - 0.008796142129477*G0_1_0_0_1 - 0.00879614212947697*G0_1_0_0_2 + 0.000666000666000888*G0_1_0_0_3 + 0.000666000666000769*G0_1_0_0_4 - 0.0811632811632952*G0_1_0_0_5 + 0.0395160395160464*G0_1_0_0_6 - 0.0811632811632952*G0_1_0_0_7 + 0.0395160395160464*G0_1_0_0_8 - 0.00426240426240517*G0_1_0_0_9 - 0.00879614212947701*G0_1_0_1_0 + 0.001841403746166*G0_1_0_1_1 + 0.00107419916943745*G0_1_0_1_2 - 0.000279085993371693*G0_1_0_1_3 - 0.00136371564943019*G0_1_0_1_4 + 0.0102031302031319*G0_1_0_1_5 - 0.00370296370296431*G0_1_0_1_6 + 0.00737928737928855*G0_1_0_1_7 - 0.00298368298368344*G0_1_0_1_8 + 0.00868464868465015*G0_1_0_1_9 - 0.00879614212947697*G0_1_0_2_0 + 0.00107419916943745*G0_1_0_2_1 + 0.00184140374616599*G0_1_0_2_2 - 0.00136371564943017*G0_1_0_2_3 - 0.000279085993371728*G0_1_0_2_4 + 0.00737928737928859*G0_1_0_2_5 - 0.00298368298368346*G0_1_0_2_6 + 0.0102031302031319*G0_1_0_2_7 - 0.00370296370296432*G0_1_0_2_8 + 0.00868464868465015*G0_1_0_2_9 + 0.000666000666000888*G0_1_0_3_0 - 0.000279085993371693*G0_1_0_3_1 - 0.00136371564943017*G0_1_0_3_2 + 0.00632510346796205*G0_1_0_3_3 + 0.000468103325246199*G0_1_0_3_4 - 0.0130269730269752*G0_1_0_3_5 + 0.0045554445554453*G0_1_0_3_6 - 0.00855144855144999*G0_1_0_3_7 + 0.00399600399600469*G0_1_0_3_8 - 0.00895104895105042*G0_1_0_3_9 + 0.000666000666000769*G0_1_0_4_0 - 0.00136371564943019*G0_1_0_4_1 - 0.000279085993371728*G0_1_0_4_2 + 0.000468103325246198*G0_1_0_4_3 + 0.00632510346796197*G0_1_0_4_4 - 0.00855144855145002*G0_1_0_4_5 + 0.00399600399600469*G0_1_0_4_6 - 0.0130269730269752*G0_1_0_4_7 + 0.00455544455544532*G0_1_0_4_8 - 0.00895104895105046*G0_1_0_4_9 - 0.0811632811632952*G0_1_0_5_0 + 0.0102031302031319*G0_1_0_5_1 + 0.00737928737928859*G0_1_0_5_2 - 0.0130269730269752*G0_1_0_5_3 - 0.00855144855145002*G0_1_0_5_4 + 0.148651348651373*G0_1_0_5_5 - 0.0307692307692358*G0_1_0_5_6 + 0.0743256743256865*G0_1_0_5_7 - 0.0371628371628433*G0_1_0_5_8 + 0.0871128871129017*G0_1_0_5_9 + 0.0395160395160464*G0_1_0_6_0 - 0.00370296370296431*G0_1_0_6_1 - 0.00298368298368346*G0_1_0_6_2 + 0.0045554445554453*G0_1_0_6_3 + 0.00399600399600469*G0_1_0_6_4 - 0.0307692307692358*G0_1_0_6_5 + 0.010389610389612*G0_1_0_6_6 - 0.0371628371628433*G0_1_0_6_7 + 0.0143856143856168*G0_1_0_6_8 - 0.0351648351648411*G0_1_0_6_9 - 0.0811632811632952*G0_1_0_7_0 + 0.00737928737928855*G0_1_0_7_1 + 0.0102031302031319*G0_1_0_7_2 - 0.00855144855144999*G0_1_0_7_3 - 0.0130269730269752*G0_1_0_7_4 + 0.0743256743256865*G0_1_0_7_5 - 0.0371628371628433*G0_1_0_7_6 + 0.148651348651373*G0_1_0_7_7 - 0.0307692307692358*G0_1_0_7_8 + 0.0871128871129017*G0_1_0_7_9 + 0.0395160395160464*G0_1_0_8_0 - 0.00298368298368344*G0_1_0_8_1 - 0.00370296370296432*G0_1_0_8_2 + 0.00399600399600469*G0_1_0_8_3 + 0.00455544455544532*G0_1_0_8_4 - 0.0371628371628433*G0_1_0_8_5 + 0.0143856143856168*G0_1_0_8_6 - 0.0307692307692358*G0_1_0_8_7 + 0.0103896103896121*G0_1_0_8_8 - 0.0351648351648411*G0_1_0_8_9 - 0.00426240426240517*G0_1_0_9_0 + 0.00868464868465015*G0_1_0_9_1 + 0.00868464868465015*G0_1_0_9_2 - 0.00895104895105042*G0_1_0_9_3 - 0.00895104895105046*G0_1_0_9_4 + 0.0871128871129017*G0_1_0_9_5 - 0.0351648351648411*G0_1_0_9_6 + 0.0871128871129017*G0_1_0_9_7 - 0.0351648351648411*G0_1_0_9_8 + 0.0671328671328785*G0_1_0_9_9; + A[78] = A[50] + 0.00129789082170057*G0_0_1_0_0 + 0.000269783126926026*G0_0_1_0_1 + 0.000269783126926022*G0_0_1_0_2 + 0.00593861165289838*G0_0_1_0_3 + 0.00593861165289839*G0_0_1_0_4 - 0.00258027686599159*G0_0_1_0_5 + 0.00237476808905421*G0_0_1_0_6 - 0.00258027686599159*G0_0_1_0_7 + 0.00237476808905419*G0_0_1_0_8 + 0.0124523095951689*G0_0_1_0_9 + 0.000269783126926026*G0_0_1_1_0 - 0.00449920449920535*G0_0_1_1_1 + 0.000959604769128731*G0_0_1_1_2 + 0.00864320864321011*G0_0_1_1_3 + 0.00761312761312892*G0_0_1_1_4 - 0.00216503073645967*G0_0_1_1_5 + 0.00334311191454105*G0_0_1_1_6 + 0.00105376105376126*G0_0_1_1_7 - 0.00544640544640643*G0_0_1_1_8 + 0.00305472305472359*G0_0_1_1_9 + 0.000269783126926022*G0_0_1_2_0 + 0.000959604769128731*G0_0_1_2_1 - 0.00449920449920541*G0_0_1_2_2 + 0.00761312761312893*G0_0_1_2_3 + 0.00864320864321005*G0_0_1_2_4 + 0.00105376105376127*G0_0_1_2_5 - 0.00544640544640645*G0_0_1_2_6 - 0.00216503073645967*G0_0_1_2_7 + 0.00334311191454104*G0_0_1_2_8 + 0.00305472305472355*G0_0_1_2_9 + 0.00593861165289838*G0_0_1_3_0 + 0.00864320864321011*G0_0_1_3_1 + 0.00761312761312893*G0_0_1_3_2 + 0.186267066267098*G0_0_1_3_3 - 0.0987051044194067*G0_0_1_3_4 - 0.00101993244850403*G0_0_1_3_5 - 0.0193102135959311*G0_0_1_3_6 - 0.0270967128110031*G0_0_1_3_7 + 0.0464069264069342*G0_0_1_3_8 + 0.0450292564578355*G0_0_1_3_9 + 0.00593861165289839*G0_0_1_4_0 + 0.00761312761312892*G0_0_1_4_1 + 0.00864320864321005*G0_0_1_4_2 - 0.0987051044194067*G0_0_1_4_3 + 0.186267066267098*G0_0_1_4_4 - 0.0270967128110031*G0_0_1_4_5 + 0.0464069264069342*G0_0_1_4_6 - 0.00101993244850406*G0_0_1_4_7 - 0.0193102135959311*G0_0_1_4_8 + 0.0450292564578354*G0_0_1_4_9 - 0.00258027686599159*G0_0_1_5_0 - 0.00216503073645967*G0_0_1_5_1 + 0.00105376105376127*G0_0_1_5_2 - 0.00101993244850403*G0_0_1_5_3 - 0.0270967128110031*G0_0_1_5_4 + 0.00776366490652331*G0_0_1_5_5 - 0.00929356357927942*G0_0_1_5_6 + 0.00557157128585793*G0_0_1_5_7 - 0.00278578564292895*G0_0_1_5_8 - 0.0317853574996486*G0_0_1_5_9 + 0.00237476808905421*G0_0_1_6_0 + 0.00334311191454105*G0_0_1_6_1 - 0.00544640544640645*G0_0_1_6_2 - 0.0193102135959311*G0_0_1_6_3 + 0.0464069264069342*G0_0_1_6_4 - 0.00929356357927942*G0_0_1_6_5 + 0.00543456543456623*G0_0_1_6_6 - 0.00278578564292897*G0_0_1_6_7 - 0.00538889681746915*G0_0_1_6_8 + 0.0294562580276916*G0_0_1_6_9 - 0.00258027686599159*G0_0_1_7_0 + 0.00105376105376126*G0_0_1_7_1 - 0.00216503073645967*G0_0_1_7_2 - 0.0270967128110031*G0_0_1_7_3 - 0.00101993244850406*G0_0_1_7_4 + 0.00557157128585793*G0_0_1_7_5 - 0.00278578564292897*G0_0_1_7_6 + 0.00776366490652333*G0_0_1_7_7 - 0.00929356357927936*G0_0_1_7_8 - 0.0317853574996486*G0_0_1_7_9 + 0.00237476808905419*G0_0_1_8_0 - 0.00544640544640643*G0_0_1_8_1 + 0.00334311191454104*G0_0_1_8_2 + 0.0464069264069342*G0_0_1_8_3 - 0.0193102135959311*G0_0_1_8_4 - 0.00278578564292895*G0_0_1_8_5 - 0.00538889681746915*G0_0_1_8_6 - 0.00929356357927936*G0_0_1_8_7 + 0.00543456543456613*G0_0_1_8_8 + 0.0294562580276915*G0_0_1_8_9 + 0.0124523095951689*G0_0_1_9_0 + 0.00305472305472359*G0_0_1_9_1 + 0.00305472305472355*G0_0_1_9_2 + 0.0450292564578355*G0_0_1_9_3 + 0.0450292564578354*G0_0_1_9_4 - 0.0317853574996486*G0_0_1_9_5 + 0.0294562580276916*G0_0_1_9_6 - 0.0317853574996486*G0_0_1_9_7 + 0.0294562580276915*G0_0_1_9_8 + 0.113988868274602*G0_0_1_9_9 - 0.00129789082170057*G0_1_0_0_0 - 0.000269783126926026*G0_1_0_0_1 - 0.000269783126926022*G0_1_0_0_2 - 0.00593861165289838*G0_1_0_0_3 - 0.00593861165289839*G0_1_0_0_4 + 0.00258027686599159*G0_1_0_0_5 - 0.00237476808905421*G0_1_0_0_6 + 0.00258027686599159*G0_1_0_0_7 - 0.00237476808905419*G0_1_0_0_8 - 0.0124523095951689*G0_1_0_0_9 - 0.000269783126926026*G0_1_0_1_0 + 0.00449920449920535*G0_1_0_1_1 - 0.000959604769128731*G0_1_0_1_2 - 0.00864320864321011*G0_1_0_1_3 - 0.00761312761312892*G0_1_0_1_4 + 0.00216503073645967*G0_1_0_1_5 - 0.00334311191454105*G0_1_0_1_6 - 0.00105376105376126*G0_1_0_1_7 + 0.00544640544640643*G0_1_0_1_8 - 0.00305472305472359*G0_1_0_1_9 - 0.000269783126926022*G0_1_0_2_0 - 0.000959604769128731*G0_1_0_2_1 + 0.00449920449920541*G0_1_0_2_2 - 0.00761312761312893*G0_1_0_2_3 - 0.00864320864321005*G0_1_0_2_4 - 0.00105376105376127*G0_1_0_2_5 + 0.00544640544640645*G0_1_0_2_6 + 0.00216503073645967*G0_1_0_2_7 - 0.00334311191454104*G0_1_0_2_8 - 0.00305472305472355*G0_1_0_2_9 - 0.00593861165289838*G0_1_0_3_0 - 0.00864320864321011*G0_1_0_3_1 - 0.00761312761312893*G0_1_0_3_2 - 0.186267066267098*G0_1_0_3_3 + 0.0987051044194067*G0_1_0_3_4 + 0.00101993244850403*G0_1_0_3_5 + 0.0193102135959311*G0_1_0_3_6 + 0.0270967128110031*G0_1_0_3_7 - 0.0464069264069342*G0_1_0_3_8 - 0.0450292564578355*G0_1_0_3_9 - 0.00593861165289839*G0_1_0_4_0 - 0.00761312761312892*G0_1_0_4_1 - 0.00864320864321005*G0_1_0_4_2 + 0.0987051044194067*G0_1_0_4_3 - 0.186267066267098*G0_1_0_4_4 + 0.0270967128110031*G0_1_0_4_5 - 0.0464069264069342*G0_1_0_4_6 + 0.00101993244850406*G0_1_0_4_7 + 0.0193102135959311*G0_1_0_4_8 - 0.0450292564578354*G0_1_0_4_9 + 0.00258027686599159*G0_1_0_5_0 + 0.00216503073645967*G0_1_0_5_1 - 0.00105376105376127*G0_1_0_5_2 + 0.00101993244850403*G0_1_0_5_3 + 0.0270967128110031*G0_1_0_5_4 - 0.00776366490652331*G0_1_0_5_5 + 0.00929356357927942*G0_1_0_5_6 - 0.00557157128585793*G0_1_0_5_7 + 0.00278578564292895*G0_1_0_5_8 + 0.0317853574996486*G0_1_0_5_9 - 0.00237476808905421*G0_1_0_6_0 - 0.00334311191454105*G0_1_0_6_1 + 0.00544640544640645*G0_1_0_6_2 + 0.0193102135959311*G0_1_0_6_3 - 0.0464069264069342*G0_1_0_6_4 + 0.00929356357927942*G0_1_0_6_5 - 0.00543456543456623*G0_1_0_6_6 + 0.00278578564292897*G0_1_0_6_7 + 0.00538889681746915*G0_1_0_6_8 - 0.0294562580276916*G0_1_0_6_9 + 0.00258027686599159*G0_1_0_7_0 - 0.00105376105376126*G0_1_0_7_1 + 0.00216503073645967*G0_1_0_7_2 + 0.0270967128110031*G0_1_0_7_3 + 0.00101993244850406*G0_1_0_7_4 - 0.00557157128585793*G0_1_0_7_5 + 0.00278578564292897*G0_1_0_7_6 - 0.00776366490652333*G0_1_0_7_7 + 0.00929356357927936*G0_1_0_7_8 + 0.0317853574996486*G0_1_0_7_9 - 0.00237476808905419*G0_1_0_8_0 + 0.00544640544640643*G0_1_0_8_1 - 0.00334311191454104*G0_1_0_8_2 - 0.0464069264069342*G0_1_0_8_3 + 0.0193102135959311*G0_1_0_8_4 + 0.00278578564292895*G0_1_0_8_5 + 0.00538889681746915*G0_1_0_8_6 + 0.00929356357927936*G0_1_0_8_7 - 0.00543456543456613*G0_1_0_8_8 - 0.0294562580276915*G0_1_0_8_9 - 0.0124523095951689*G0_1_0_9_0 - 0.00305472305472359*G0_1_0_9_1 - 0.00305472305472355*G0_1_0_9_2 - 0.0450292564578355*G0_1_0_9_3 - 0.0450292564578354*G0_1_0_9_4 + 0.0317853574996486*G0_1_0_9_5 - 0.0294562580276916*G0_1_0_9_6 + 0.0317853574996486*G0_1_0_9_7 - 0.0294562580276915*G0_1_0_9_8 - 0.113988868274602*G0_1_0_9_9; + A[172] = -A[52] + 0.00910102243435743*G0_0_0_0_0 + 0.000500628119675834*G0_0_0_0_1 + 0.00144874525826931*G0_0_0_0_2 + 0.000431631860203388*G0_0_0_0_3 - 0.000883243740386759*G0_0_0_0_4 + 0.0182021153449756*G0_0_0_0_5 - 0.00174841031983928*G0_0_0_0_6 + 0.00154702440416753*G0_0_0_0_7 - 0.00146805575377029*G0_0_0_0_8 + 0.00333190618904962*G0_0_0_0_9 + 0.000500628119675834*G0_0_0_1_0 + 0.00207200207200274*G0_0_0_1_1 + 0.000693239740858905*G0_0_0_1_2 - 0.000621600621600654*G0_0_0_1_3 - 0.00343878343878407*G0_0_0_1_4 - 0.00210868496582817*G0_0_0_1_5 - 0.00386312100597879*G0_0_0_1_6 - 0.00177822177822213*G0_0_0_1_7 - 0.000732600732600761*G0_0_0_1_8 + 0.00286380286380339*G0_0_0_1_9 + 0.00144874525826931*G0_0_0_2_0 + 0.000693239740858905*G0_0_0_2_1 + 0.0621689421689525*G0_0_0_2_2 - 0.00310990596704928*G0_0_0_2_3 + 0.00163201877487626*G0_0_0_2_5 + 0.0131956931956952*G0_0_0_2_6 - 0.000807129378558084*G0_0_0_2_7 + 0.00209282780711389*G0_0_0_2_8 - 0.00577708006279536*G0_0_0_2_9 + 0.000431631860203388*G0_0_0_3_0 - 0.000621600621600653*G0_0_0_3_1 - 0.00310990596704928*G0_0_0_3_2 + 0.0195804195804233*G0_0_0_3_3 + 0.0209932924218674*G0_0_0_3_4 + 0.00262023690595157*G0_0_0_3_5 + 0.0113800485229075*G0_0_0_3_6 - 0.00150421007563895*G0_0_0_3_7 + 0.00799200799200941*G0_0_0_3_8 - 0.00558298844013224*G0_0_0_3_9 - 0.000883243740386759*G0_0_0_4_0 - 0.00343878343878407*G0_0_0_4_1 + 0.0209932924218674*G0_0_0_4_3 - 0.0694562580276983*G0_0_0_4_4 + 0.00244041672613144*G0_0_0_4_5 - 0.0138204652490389*G0_0_0_4_6 + 0.00264021692593166*G0_0_0_4_7 - 0.00648779791637047*G0_0_0_4_8 + 0.0124504067361232*G0_0_0_4_9 + 0.0182021153449756*G0_0_0_5_0 - 0.00210868496582817*G0_0_0_5_1 + 0.00163201877487626*G0_0_0_5_2 + 0.00262023690595157*G0_0_0_5_3 + 0.00244041672613144*G0_0_0_5_4 - 0.0686285143428114*G0_0_0_5_5 - 0.0379991437134357*G0_0_0_5_6 - 0.00832881404310112*G0_0_0_5_7 + 0.00611674040245569*G0_0_0_5_8 - 0.0222291993720602*G0_0_0_5_9 - 0.00174841031983928*G0_0_0_6_0 - 0.00386312100597879*G0_0_0_6_1 + 0.0131956931956952*G0_0_0_6_2 + 0.0113800485229075*G0_0_0_6_3 - 0.0138204652490389*G0_0_0_6_4 - 0.0379991437134357*G0_0_0_6_5 - 0.263022691594164*G0_0_0_6_6 + 0.00221207364064541*G0_0_0_6_7 + 0.00276009704581171*G0_0_0_6_8 - 0.00542885685742883*G0_0_0_6_9 + 0.00154702440416753*G0_0_0_7_0 - 0.00177822177822213*G0_0_0_7_1 - 0.000807129378558084*G0_0_0_7_2 - 0.00150421007563895*G0_0_0_7_3 + 0.00264021692593165*G0_0_0_7_4 - 0.00832881404310112*G0_0_0_7_5 + 0.00221207364064541*G0_0_0_7_6 - 0.0206878835450299*G0_0_0_7_7 + 0.00637933495076458*G0_0_0_7_8 - 0.0144198658484397*G0_0_0_7_9 - 0.00146805575377029*G0_0_0_8_0 - 0.000732600732600761*G0_0_0_8_1 + 0.00209282780711389*G0_0_0_8_2 + 0.00799200799200941*G0_0_0_8_3 - 0.00648779791637047*G0_0_0_8_4 + 0.00611674040245569*G0_0_0_8_5 + 0.00276009704581171*G0_0_0_8_6 + 0.00637933495076458*G0_0_0_8_7 + 0.0179820179820209*G0_0_0_8_8 + 0.00438418724133079*G0_0_0_8_9 + 0.00333190618904962*G0_0_0_9_0 + 0.00286380286380339*G0_0_0_9_1 - 0.00577708006279536*G0_0_0_9_2 - 0.00558298844013224*G0_0_0_9_3 + 0.0124504067361233*G0_0_0_9_4 - 0.0222291993720602*G0_0_0_9_5 - 0.00542885685742883*G0_0_0_9_6 - 0.0144198658484397*G0_0_0_9_7 + 0.00438418724133079*G0_0_0_9_8 + 0.118373055515933*G0_0_0_9_9 - 0.0530679197345957*G0_0_1_0_0 - 0.000192611621183089*G0_0_1_0_1 - 0.0016611959469105*G0_0_1_0_3 + 0.00500642214928011*G0_0_1_0_5 - 0.00338042909471538*G0_0_1_0_6 + 0.00151150436864734*G0_0_1_0_7 + 0.00164185021327911*G0_0_1_0_8 + 0.00910898625184492*G0_0_1_0_9 - 0.000192611621183089*G0_0_1_1_0 + 0.000192611621183084*G0_0_1_1_2 + 0.000111000111000222*G0_0_1_1_3 - 0.00166056166056199*G0_0_1_1_4 + 0.00175443604015058*G0_0_1_1_5 - 0.00175443604015061*G0_0_1_1_6 + 0.00166056166056186*G0_0_1_1_7 - 0.000111000111000015*G0_0_1_1_8 + 0.000192611621183084*G0_0_1_2_1 + 0.0530679197345952*G0_0_1_2_2 - 0.00164185021327902*G0_0_1_2_3 - 0.00151150436864757*G0_0_1_2_4 + 0.00338042909471544*G0_0_1_2_5 - 0.00500642214928026*G0_0_1_2_6 + 0.00166119594691051*G0_0_1_2_8 - 0.00910898625184496*G0_0_1_2_9 - 0.0016611959469105*G0_0_1_3_0 + 0.000111000111000223*G0_0_1_3_1 - 0.00164185021327902*G0_0_1_3_2 + 0.00159840159840198*G0_0_1_3_3 + 0.0146139574711028*G0_0_1_3_4 - 0.000139860139860069*G0_0_1_3_5 + 0.00526330812045177*G0_0_1_3_6 + 0.00498358784073155*G0_0_1_3_7 - 0.00996717568146318*G0_0_1_3_9 - 0.00166056166056199*G0_0_1_4_1 - 0.00151150436864756*G0_0_1_4_2 + 0.0146139574711028*G0_0_1_4_3 - 0.0487683744826684*G0_0_1_4_4 + 0.000228343085485949*G0_0_1_4_5 - 0.00549165120593777*G0_0_1_4_6 - 0.00498358784073152*G0_0_1_4_8 + 0.026870272584563*G0_0_1_4_9 + 0.00500642214928011*G0_0_1_5_0 + 0.00175443604015058*G0_0_1_5_1 + 0.00338042909471544*G0_0_1_5_2 - 0.00013986013986007*G0_0_1_5_3 + 0.00022834308548595*G0_0_1_5_4 + 0.194394177251352*G0_0_1_5_5 + 0.00549165120593767*G0_0_1_5_7 - 0.00526330812045175*G0_0_1_5_8 - 0.0168003425146312*G0_0_1_5_9 - 0.00338042909471538*G0_0_1_6_0 - 0.00175443604015061*G0_0_1_6_1 - 0.00500642214928025*G0_0_1_6_2 + 0.00526330812045177*G0_0_1_6_3 - 0.00549165120593777*G0_0_1_6_4 - 0.194394177251353*G0_0_1_6_6 - 0.000228343085485963*G0_0_1_6_7 + 0.000139860139860097*G0_0_1_6_8 + 0.0168003425146314*G0_0_1_6_9 + 0.00151150436864734*G0_0_1_7_0 + 0.00166056166056186*G0_0_1_7_1 + 0.00498358784073156*G0_0_1_7_3 + 0.00549165120593768*G0_0_1_7_5 - 0.000228343085485963*G0_0_1_7_6 + 0.0487683744826681*G0_0_1_7_7 - 0.0146139574711026*G0_0_1_7_8 - 0.0268702725845629*G0_0_1_7_9 + 0.00164185021327911*G0_0_1_8_0 - 0.000111000111000015*G0_0_1_8_1 + 0.00166119594691051*G0_0_1_8_2 - 0.00498358784073152*G0_0_1_8_4 - 0.00526330812045175*G0_0_1_8_5 + 0.000139860139860097*G0_0_1_8_6 - 0.0146139574711026*G0_0_1_8_7 - 0.00159840159840216*G0_0_1_8_8 + 0.00996717568146298*G0_0_1_8_9 + 0.00910898625184492*G0_0_1_9_0 - 0.00910898625184496*G0_0_1_9_2 - 0.00996717568146318*G0_0_1_9_3 + 0.026870272584563*G0_0_1_9_4 - 0.0168003425146312*G0_0_1_9_5 + 0.0168003425146314*G0_0_1_9_6 - 0.0268702725845629*G0_0_1_9_7 + 0.00996717568146298*G0_0_1_9_8; + A[158] = A[172] - 0.00528064528064626*G0_0_0_0_0 - 0.000513630989821567*G0_0_0_0_1 - 0.000109872490824881*G0_0_0_0_2 - 0.00936523793666812*G0_0_0_0_5 - 0.000347588919017504*G0_0_0_0_6 - 0.000615892044463578*G0_0_0_0_7 + 0.00142587571159023*G0_0_0_0_8 - 0.000829646543932405*G0_0_0_0_9 - 0.000513630989821567*G0_0_0_1_0 - 0.00676854010187488*G0_0_0_1_1 + 0.00011684964065919*G0_0_0_1_2 - 0.00663273234701924*G0_0_0_1_3 + 0.003387723387724*G0_0_0_1_4 + 0.00116518402232707*G0_0_0_1_5 + 0.000424971853543352*G0_0_0_1_6 + 0.00181723038865933*G0_0_0_1_7 - 0.000955235240949823*G0_0_0_1_8 - 0.00246991104134005*G0_0_0_1_9 - 0.000109872490824881*G0_0_0_2_0 + 0.000116849640659191*G0_0_0_2_1 + 0.00240352240352308*G0_0_0_2_2 - 0.00392750107035893*G0_0_0_2_3 + 0.00807192807192955*G0_0_0_2_4 - 0.0037321408749987*G0_0_0_2_5 - 0.00185592185592202*G0_0_0_2_6 - 0.000119245833531563*G0_0_0_2_7 - 0.000562611991183531*G0_0_0_2_8 + 0.00279339707911186*G0_0_0_2_9 - 0.00663273234701924*G0_0_0_3_1 - 0.00392750107035893*G0_0_0_3_2 - 0.00631368631368734*G0_0_0_3_3 - 0.000422434708149128*G0_0_0_3_4 - 0.0019980019980023*G0_0_0_3_5 - 0.00102183530754973*G0_0_0_3_6 - 0.00194662480376806*G0_0_0_3_8 + 0.00739831596974579*G0_0_0_3_9 + 0.003387723387724*G0_0_0_4_1 + 0.00807192807192955*G0_0_0_4_2 - 0.000422434708149128*G0_0_0_4_3 + 0.00875695732838743*G0_0_0_4_4 + 0.000228343085485945*G0_0_0_4_5 + 0.000793492222063794*G0_0_0_4_6 + 0.00194091622663089*G0_0_0_4_8 - 0.00883687740830748*G0_0_0_4_9 - 0.00936523793666812*G0_0_0_5_0 + 0.00116518402232707*G0_0_0_5_1 - 0.0037321408749987*G0_0_0_5_2 - 0.0019980019980023*G0_0_0_5_3 + 0.000228343085485945*G0_0_0_5_4 + 0.031271585557305*G0_0_0_5_5 + 0.0269387755102086*G0_0_0_5_6 + 0.00263165406022593*G0_0_0_5_7 - 0.00324247181390091*G0_0_0_5_8 + 0.00897388325959903*G0_0_0_5_9 - 0.000347588919017504*G0_0_0_6_0 + 0.000424971853543352*G0_0_0_6_1 - 0.00185592185592202*G0_0_0_6_2 - 0.00102183530754973*G0_0_0_6_3 + 0.000793492222063792*G0_0_0_6_4 + 0.0269387755102086*G0_0_0_6_5 + 0.069256457827898*G0_0_0_6_6 + 0.000610817753674987*G0_0_0_6_7 - 0.0063365206222361*G0_0_0_6_9 - 0.000615892044463578*G0_0_0_7_0 + 0.00181723038865933*G0_0_0_7_1 - 0.000119245833531563*G0_0_0_7_2 + 0.00263165406022593*G0_0_0_7_5 + 0.000610817753674987*G0_0_0_7_6 + 0.00438418724133094*G0_0_0_7_7 - 0.00609676038247564*G0_0_0_7_8 + 0.00126730412444723*G0_0_0_7_9 + 0.00142587571159023*G0_0_0_8_0 - 0.000955235240949823*G0_0_0_8_1 - 0.000562611991183531*G0_0_0_8_2 - 0.00194662480376806*G0_0_0_8_3 + 0.00194091622663089*G0_0_0_8_4 - 0.00324247181390091*G0_0_0_8_5 - 0.00609676038247564*G0_0_0_8_7 + 0.00109604681033246*G0_0_0_8_8 + 0.00352790067075837*G0_0_0_8_9 - 0.000829646543932405*G0_0_0_9_0 - 0.00246991104134005*G0_0_0_9_1 + 0.00279339707911186*G0_0_0_9_2 + 0.00739831596974579*G0_0_0_9_3 - 0.00883687740830748*G0_0_0_9_4 + 0.00897388325959904*G0_0_0_9_5 - 0.0063365206222361*G0_0_0_9_6 + 0.00126730412444723*G0_0_0_9_7 + 0.00352790067075837*G0_0_0_9_8 - 0.054665334665344*G0_0_0_9_9 - 0.000276125990411759*G0_0_1_0_1 + 0.000276125990411764*G0_0_1_0_2 + 0.000496646210932001*G0_0_1_0_3 - 0.000496646210932005*G0_0_1_0_4 - 0.00056514913657779*G0_0_1_0_5 + 0.00127110984253862*G0_0_1_0_6 + 0.000565149136577853*G0_0_1_0_7 - 0.00127110984253866*G0_0_1_0_8 - 0.000276125990411759*G0_0_1_1_0 - 0.00332901666235072*G0_0_1_1_1 - 0.00739895025609442*G0_0_1_1_3 + 0.00345115202258121*G0_0_1_1_4 - 0.00105608677037265*G0_0_1_1_5 + 0.000673612102183645*G0_0_1_1_6 + 0.00205318491032817*G0_0_1_1_7 - 0.00435374149659948*G0_0_1_1_8 - 0.00291137433994627*G0_0_1_1_9 + 0.000276125990411764*G0_0_1_2_0 + 0.00332901666235078*G0_0_1_2_2 - 0.00345115202258122*G0_0_1_2_3 + 0.00739895025609445*G0_0_1_2_4 - 0.00205318491032815*G0_0_1_2_5 + 0.00435374149659945*G0_0_1_2_6 + 0.00105608677037267*G0_0_1_2_7 - 0.00067361210218365*G0_0_1_2_8 + 0.00291137433994628*G0_0_1_2_9 + 0.000496646210932001*G0_0_1_3_0 - 0.00739895025609442*G0_0_1_3_1 - 0.00345115202258122*G0_0_1_3_2 - 0.00369915798487304*G0_0_1_3_3 + 0.000839160839160948*G0_0_1_3_5 - 0.00202083630655092*G0_0_1_3_6 - 0.00148993863279603*G0_0_1_3_7 - 0.000530897673754944*G0_0_1_3_8 + 0.0117140002854308*G0_0_1_3_9 - 0.000496646210932005*G0_0_1_4_0 + 0.00345115202258121*G0_0_1_4_1 + 0.00739895025609445*G0_0_1_4_2 + 0.00369915798487291*G0_0_1_4_4 + 0.00148993863279602*G0_0_1_4_5 + 0.000530897673754911*G0_0_1_4_6 - 0.000839160839160994*G0_0_1_4_7 + 0.00202083630655095*G0_0_1_4_8 - 0.0117140002854309*G0_0_1_4_9 - 0.000565149136577791*G0_0_1_5_0 - 0.00105608677037265*G0_0_1_5_1 - 0.00205318491032815*G0_0_1_5_2 + 0.000839160839160949*G0_0_1_5_3 + 0.00148993863279602*G0_0_1_5_4 - 0.0865762808620093*G0_0_1_5_5 - 0.00276295133438042*G0_0_1_5_6 + 0.00316826031111794*G0_0_1_5_8 - 0.00633652062223586*G0_0_1_5_9 + 0.00127110984253862*G0_0_1_6_0 + 0.000673612102183645*G0_0_1_6_1 + 0.00435374149659945*G0_0_1_6_2 - 0.00202083630655092*G0_0_1_6_3 + 0.000530897673754911*G0_0_1_6_4 - 0.00276295133438041*G0_0_1_6_5 + 0.0387155701441481*G0_0_1_6_6 - 0.00316826031111801*G0_0_1_6_7 - 0.004692450406737*G0_0_1_6_9 + 0.00056514913657785*G0_0_1_7_0 + 0.00205318491032818*G0_0_1_7_1 + 0.00105608677037267*G0_0_1_7_2 - 0.00148993863279603*G0_0_1_7_3 - 0.000839160839160995*G0_0_1_7_4 - 0.00316826031111801*G0_0_1_7_6 + 0.0865762808620099*G0_0_1_7_7 + 0.00276295133438034*G0_0_1_7_8 + 0.00633652062223609*G0_0_1_7_9 - 0.00127110984253865*G0_0_1_8_0 - 0.00435374149659948*G0_0_1_8_1 - 0.00067361210218365*G0_0_1_8_2 - 0.000530897673754944*G0_0_1_8_3 + 0.00202083630655095*G0_0_1_8_4 + 0.00316826031111794*G0_0_1_8_5 + 0.00276295133438035*G0_0_1_8_7 - 0.0387155701441482*G0_0_1_8_8 + 0.00469245040673687*G0_0_1_8_9 - 0.00291137433994627*G0_0_1_9_1 + 0.00291137433994628*G0_0_1_9_2 + 0.0117140002854308*G0_0_1_9_3 - 0.0117140002854309*G0_0_1_9_4 - 0.00633652062223586*G0_0_1_9_5 - 0.004692450406737*G0_0_1_9_6 + 0.00633652062223609*G0_0_1_9_7 + 0.00469245040673687*G0_0_1_9_8 - 0.000268021220402243*G0_1_0_0_1 + 0.000268021220402216*G0_1_0_0_2 - 0.000285428856857477*G0_1_0_0_3 + 0.000285428856857473*G0_1_0_0_4 + 0.000482691911263437*G0_1_0_0_5 - 0.000131931560503038*G0_1_0_0_6 - 0.000482691911263386*G0_1_0_0_7 + 0.000131931560502974*G0_1_0_0_8 - 0.000268021220402243*G0_1_0_1_0 - 0.00763088763088931*G0_1_0_1_1 - 0.00855144855145007*G0_1_0_1_3 + 0.00441843870415377*G0_1_0_1_4 - 0.000194091622663072*G0_1_0_1_5 - 0.00102183530754977*G0_1_0_1_6 + 0.00106179534750993*G0_1_0_1_7 - 0.00317016317016396*G0_1_0_1_8 - 0.00324247181390095*G0_1_0_1_9 + 0.000268021220402216*G0_1_0_2_0 + 0.0076308876308889*G0_1_0_2_2 - 0.00441843870415371*G0_1_0_2_3 + 0.00855144855144996*G0_1_0_2_4 - 0.00106179534750979*G0_1_0_2_5 + 0.00317016317016365*G0_1_0_2_6 + 0.000194091622663089*G0_1_0_2_7 + 0.00102183530754974*G0_1_0_2_8 + 0.0032424718139009*G0_1_0_2_9 - 0.000285428856857477*G0_1_0_3_0 - 0.00855144855145007*G0_1_0_3_1 - 0.00441843870415371*G0_1_0_3_2 - 0.00472670186955972*G0_1_0_3_3 + 0.000719280719280814*G0_1_0_3_5 + 0.00306550592264932*G0_1_0_3_6 + 0.00085628657057245*G0_1_0_3_7 + 0.00220921935207676*G0_1_0_3_8 + 0.00801484230055791*G0_1_0_3_9 + 0.000285428856857473*G0_1_0_4_0 + 0.00441843870415377*G0_1_0_4_1 + 0.00855144855144996*G0_1_0_4_2 + 0.00472670186955974*G0_1_0_4_4 - 0.000856286570572398*G0_1_0_4_5 - 0.00220921935207692*G0_1_0_4_6 - 0.000719280719280852*G0_1_0_4_7 - 0.00306550592264921*G0_1_0_4_8 - 0.00801484230055791*G0_1_0_4_9 + 0.000482691911263437*G0_1_0_5_0 - 0.000194091622663072*G0_1_0_5_1 - 0.00106179534750979*G0_1_0_5_2 + 0.000719280719280814*G0_1_0_5_3 - 0.000856286570572398*G0_1_0_5_4 - 0.00385899814471304*G0_1_0_5_5 + 0.000582274867989238*G0_1_0_5_8 - 0.00116454973597846*G0_1_0_5_9 - 0.000131931560503038*G0_1_0_6_0 - 0.00102183530754977*G0_1_0_6_1 + 0.00317016317016365*G0_1_0_6_2 + 0.00306550592264931*G0_1_0_6_3 - 0.00220921935207692*G0_1_0_6_4 - 0.021567004424151*G0_1_0_6_6 - 0.000582274867989249*G0_1_0_6_7 - 0.0158584272870013*G0_1_0_6_9 - 0.000482691911263386*G0_1_0_7_0 + 0.00106179534750993*G0_1_0_7_1 + 0.000194091622663089*G0_1_0_7_2 + 0.00085628657057245*G0_1_0_7_3 - 0.000719280719280852*G0_1_0_7_4 - 0.000582274867989249*G0_1_0_7_6 + 0.00385899814471297*G0_1_0_7_7 + 0.00116454973597851*G0_1_0_7_9 + 0.000131931560502974*G0_1_0_8_0 - 0.00317016317016396*G0_1_0_8_1 + 0.00102183530754974*G0_1_0_8_2 + 0.00220921935207676*G0_1_0_8_3 - 0.00306550592264921*G0_1_0_8_4 + 0.000582274867989238*G0_1_0_8_5 + 0.0215670044241501*G0_1_0_8_8 + 0.0158584272870013*G0_1_0_8_9 - 0.00324247181390095*G0_1_0_9_1 + 0.0032424718139009*G0_1_0_9_2 + 0.00801484230055791*G0_1_0_9_3 - 0.00801484230055792*G0_1_0_9_4 - 0.00116454973597846*G0_1_0_9_5 - 0.0158584272870014*G0_1_0_9_6 + 0.00116454973597851*G0_1_0_9_7 + 0.0158584272870013*G0_1_0_9_8 + 0.00528064528064593*G0_1_1_0_0 + 0.000109872490824862*G0_1_1_0_1 + 0.000513630989821545*G0_1_1_0_2 + 0.000615892044463522*G0_1_1_0_5 - 0.00142587571159021*G0_1_1_0_6 + 0.00936523793666799*G0_1_1_0_7 + 0.000347588919017547*G0_1_1_0_8 + 0.000829646543932402*G0_1_1_0_9 + 0.000109872490824862*G0_1_1_1_0 - 0.00240352240352305*G0_1_1_1_1 - 0.000116849640659196*G0_1_1_1_2 - 0.00807192807192952*G0_1_1_1_3 + 0.00392750107035892*G0_1_1_1_4 + 0.000119245833531559*G0_1_1_1_5 + 0.000562611991183539*G0_1_1_1_6 + 0.00373214087499872*G0_1_1_1_7 + 0.00185592185592197*G0_1_1_1_8 - 0.00279339707911185*G0_1_1_1_9 + 0.000513630989821545*G0_1_1_2_0 - 0.000116849640659196*G0_1_1_2_1 + 0.00676854010187457*G0_1_1_2_2 - 0.00338772338772396*G0_1_1_2_3 + 0.00663273234701917*G0_1_1_2_4 - 0.00181723038865927*G0_1_1_2_5 + 0.000955235240949674*G0_1_1_2_6 - 0.00116518402232708*G0_1_1_2_7 - 0.000424971853543369*G0_1_1_2_8 + 0.00246991104133999*G0_1_1_2_9 - 0.00807192807192952*G0_1_1_3_1 - 0.00338772338772396*G0_1_1_3_2 - 0.00875695732838756*G0_1_1_3_3 + 0.000422434708149095*G0_1_1_3_4 - 0.00194091622663088*G0_1_1_3_6 - 0.000228343085485905*G0_1_1_3_7 - 0.00079349222206392*G0_1_1_3_8 + 0.00883687740830737*G0_1_1_3_9 + 0.00392750107035892*G0_1_1_4_1 + 0.00663273234701917*G0_1_1_4_2 + 0.000422434708149095*G0_1_1_4_3 + 0.00631368631368735*G0_1_1_4_4 + 0.00194662480376804*G0_1_1_4_6 + 0.00199800199800231*G0_1_1_4_7 + 0.00102183530754984*G0_1_1_4_8 - 0.00739831596974568*G0_1_1_4_9 + 0.000615892044463523*G0_1_1_5_0 + 0.000119245833531559*G0_1_1_5_1 - 0.00181723038865927*G0_1_1_5_2 - 0.00438418724133091*G0_1_1_5_5 + 0.00609676038247572*G0_1_1_5_6 - 0.00263165406022601*G0_1_1_5_7 - 0.000610817753674941*G0_1_1_5_8 - 0.0012673041244473*G0_1_1_5_9 - 0.00142587571159021*G0_1_1_6_0 + 0.00056261199118354*G0_1_1_6_1 + 0.000955235240949674*G0_1_1_6_2 - 0.00194091622663088*G0_1_1_6_3 + 0.00194662480376804*G0_1_1_6_4 + 0.00609676038247572*G0_1_1_6_5 - 0.00109604681033235*G0_1_1_6_6 + 0.00324247181390095*G0_1_1_6_7 - 0.00352790067075822*G0_1_1_6_9 + 0.00936523793666799*G0_1_1_7_0 + 0.00373214087499872*G0_1_1_7_1 - 0.00116518402232708*G0_1_1_7_2 - 0.000228343085485904*G0_1_1_7_3 + 0.00199800199800231*G0_1_1_7_4 - 0.00263165406022601*G0_1_1_7_5 + 0.00324247181390095*G0_1_1_7_6 - 0.0312715855573055*G0_1_1_7_7 - 0.0269387755102083*G0_1_1_7_8 - 0.00897388325959911*G0_1_1_7_9 + 0.000347588919017548*G0_1_1_8_0 + 0.00185592185592197*G0_1_1_8_1 - 0.000424971853543369*G0_1_1_8_2 - 0.00079349222206392*G0_1_1_8_3 + 0.00102183530754984*G0_1_1_8_4 - 0.000610817753674941*G0_1_1_8_5 - 0.0269387755102083*G0_1_1_8_7 - 0.0692564578278987*G0_1_1_8_8 + 0.00633652062223585*G0_1_1_8_9 + 0.000829646543932402*G0_1_1_9_0 - 0.00279339707911185*G0_1_1_9_1 + 0.00246991104133999*G0_1_1_9_2 + 0.00883687740830737*G0_1_1_9_3 - 0.00739831596974568*G0_1_1_9_4 - 0.0012673041244473*G0_1_1_9_5 - 0.00352790067075822*G0_1_1_9_6 - 0.00897388325959911*G0_1_1_9_7 + 0.00633652062223585*G0_1_1_9_8 + 0.0546653346653438*G0_1_1_9_9; + A[155] = -A[158] - 0.0530679197345956*G0_0_1_0_0 - 0.000192611621183075*G0_0_1_0_2 - 0.00166119594691052*G0_0_1_0_4 + 0.00151150436864748*G0_0_1_0_5 + 0.00164185021327907*G0_0_1_0_6 + 0.00500642214928007*G0_0_1_0_7 - 0.00338042909471536*G0_0_1_0_8 + 0.00910898625184489*G0_0_1_0_9 + 0.053067919734596*G0_0_1_1_1 + 0.000192611621183102*G0_0_1_1_2 - 0.00151150436864733*G0_0_1_1_3 - 0.00164185021327913*G0_0_1_1_4 + 0.00166119594691052*G0_0_1_1_6 + 0.00338042909471527*G0_0_1_1_7 - 0.00500642214927992*G0_0_1_1_8 - 0.00910898625184491*G0_0_1_1_9 - 0.000192611621183075*G0_0_1_2_0 + 0.000192611621183102*G0_0_1_2_1 - 0.00166056166056197*G0_0_1_2_3 + 0.00011100011100019*G0_0_1_2_4 + 0.00166056166056192*G0_0_1_2_5 - 0.000111000111000071*G0_0_1_2_6 + 0.00175443604015061*G0_0_1_2_7 - 0.00175443604015062*G0_0_1_2_8 - 0.00151150436864733*G0_0_1_3_1 - 0.00166056166056197*G0_0_1_3_2 - 0.0487683744826689*G0_0_1_3_3 + 0.0146139574711028*G0_0_1_3_4 - 0.00498358784073155*G0_0_1_3_6 + 0.000228343085485959*G0_0_1_3_7 - 0.00549165120593785*G0_0_1_3_8 + 0.0268702725845627*G0_0_1_3_9 - 0.00166119594691052*G0_0_1_4_0 - 0.00164185021327913*G0_0_1_4_1 + 0.000111000111000191*G0_0_1_4_2 + 0.0146139574711028*G0_0_1_4_3 + 0.0015984015984018*G0_0_1_4_4 + 0.00498358784073154*G0_0_1_4_5 - 0.000139860139860144*G0_0_1_4_7 + 0.00526330812045186*G0_0_1_4_8 - 0.00996717568146308*G0_0_1_4_9 + 0.00151150436864748*G0_0_1_5_0 + 0.00166056166056192*G0_0_1_5_2 + 0.00498358784073155*G0_0_1_5_4 + 0.0487683744826684*G0_0_1_5_5 - 0.0146139574711028*G0_0_1_5_6 + 0.0054916512059378*G0_0_1_5_7 - 0.000228343085485946*G0_0_1_5_8 - 0.0268702725845628*G0_0_1_5_9 + 0.00164185021327907*G0_0_1_6_0 + 0.00166119594691052*G0_0_1_6_1 - 0.000111000111000071*G0_0_1_6_2 - 0.00498358784073155*G0_0_1_6_3 - 0.0146139574711028*G0_0_1_6_5 - 0.00159840159840176*G0_0_1_6_6 - 0.00526330812045183*G0_0_1_6_7 + 0.000139860139860128*G0_0_1_6_8 + 0.00996717568146308*G0_0_1_6_9 + 0.00500642214928006*G0_0_1_7_0 + 0.00338042909471527*G0_0_1_7_1 + 0.00175443604015061*G0_0_1_7_2 + 0.000228343085485959*G0_0_1_7_3 - 0.000139860139860145*G0_0_1_7_4 + 0.0054916512059378*G0_0_1_7_5 - 0.00526330812045183*G0_0_1_7_6 + 0.194394177251353*G0_0_1_7_7 - 0.0168003425146309*G0_0_1_7_9 - 0.00338042909471536*G0_0_1_8_0 - 0.00500642214927992*G0_0_1_8_1 - 0.00175443604015062*G0_0_1_8_2 - 0.00549165120593785*G0_0_1_8_3 + 0.00526330812045186*G0_0_1_8_4 - 0.000228343085485946*G0_0_1_8_5 + 0.000139860139860128*G0_0_1_8_6 - 0.194394177251353*G0_0_1_8_8 + 0.0168003425146309*G0_0_1_8_9 + 0.00910898625184489*G0_0_1_9_0 - 0.00910898625184491*G0_0_1_9_1 + 0.0268702725845627*G0_0_1_9_3 - 0.00996717568146308*G0_0_1_9_4 - 0.0268702725845628*G0_0_1_9_5 + 0.00996717568146307*G0_0_1_9_6 - 0.0168003425146309*G0_0_1_9_7 + 0.0168003425146309*G0_0_1_9_8 + 0.00910102243435721*G0_1_1_0_0 + 0.00144874525826934*G0_1_1_0_1 + 0.00050062811967582*G0_1_1_0_2 - 0.000883243740386764*G0_1_1_0_3 + 0.000431631860203376*G0_1_1_0_4 + 0.00154702440416748*G0_1_1_0_5 - 0.00146805575377026*G0_1_1_0_6 + 0.0182021153449755*G0_1_1_0_7 - 0.00174841031983919*G0_1_1_0_8 + 0.00333190618904962*G0_1_1_0_9 + 0.00144874525826934*G0_1_1_1_0 + 0.0621689421689534*G0_1_1_1_1 + 0.00069323974085892*G0_1_1_1_2 - 0.00310990596704941*G0_1_1_1_4 - 0.000807129378558118*G0_1_1_1_5 + 0.00209282780711391*G0_1_1_1_6 + 0.00163201877487606*G0_1_1_1_7 + 0.0131956931956957*G0_1_1_1_8 - 0.00577708006279529*G0_1_1_1_9 + 0.00050062811967582*G0_1_1_2_0 + 0.00069323974085892*G0_1_1_2_1 + 0.00207200207200244*G0_1_1_2_2 - 0.00343878343878402*G0_1_1_2_3 - 0.000621600621600719*G0_1_1_2_4 - 0.00177822177822209*G0_1_1_2_5 - 0.000732600732600857*G0_1_1_2_6 - 0.00210868496582819*G0_1_1_2_7 - 0.00386312100597878*G0_1_1_2_8 + 0.00286380286380333*G0_1_1_2_9 - 0.000883243740386764*G0_1_1_3_0 - 0.00343878343878402*G0_1_1_3_2 - 0.0694562580276987*G0_1_1_3_3 + 0.0209932924218674*G0_1_1_3_4 + 0.00264021692593166*G0_1_1_3_5 - 0.0064877979163705*G0_1_1_3_6 + 0.00244041672613144*G0_1_1_3_7 - 0.0138204652490389*G0_1_1_3_8 + 0.012450406736123*G0_1_1_3_9 + 0.000431631860203376*G0_1_1_4_0 - 0.00310990596704941*G0_1_1_4_1 - 0.000621600621600719*G0_1_1_4_2 + 0.0209932924218674*G0_1_1_4_3 + 0.019580419580423*G0_1_1_4_4 - 0.00150421007563892*G0_1_1_4_5 + 0.00799200799200943*G0_1_1_4_6 + 0.00262023690595164*G0_1_1_4_7 + 0.0113800485229075*G0_1_1_4_8 - 0.00558298844013215*G0_1_1_4_9 + 0.00154702440416748*G0_1_1_5_0 - 0.000807129378558118*G0_1_1_5_1 - 0.00177822177822209*G0_1_1_5_2 + 0.00264021692593166*G0_1_1_5_3 - 0.00150421007563892*G0_1_1_5_4 - 0.0206878835450299*G0_1_1_5_5 + 0.0063793349507646*G0_1_1_5_6 - 0.00832881404310118*G0_1_1_5_7 + 0.00221207364064548*G0_1_1_5_8 - 0.0144198658484397*G0_1_1_5_9 - 0.00146805575377026*G0_1_1_6_0 + 0.00209282780711391*G0_1_1_6_1 - 0.000732600732600858*G0_1_1_6_2 - 0.0064877979163705*G0_1_1_6_3 + 0.00799200799200943*G0_1_1_6_4 + 0.0063793349507646*G0_1_1_6_5 + 0.0179820179820214*G0_1_1_6_6 + 0.00611674040245572*G0_1_1_6_7 + 0.00276009704581172*G0_1_1_6_8 + 0.004384187241331*G0_1_1_6_9 + 0.0182021153449755*G0_1_1_7_0 + 0.00163201877487606*G0_1_1_7_1 - 0.00210868496582819*G0_1_1_7_2 + 0.00244041672613144*G0_1_1_7_3 + 0.00262023690595164*G0_1_1_7_4 - 0.00832881404310118*G0_1_1_7_5 + 0.00611674040245572*G0_1_1_7_6 - 0.0686285143428118*G0_1_1_7_7 - 0.0379991437134358*G0_1_1_7_8 - 0.0222291993720603*G0_1_1_7_9 - 0.00174841031983919*G0_1_1_8_0 + 0.0131956931956957*G0_1_1_8_1 - 0.00386312100597878*G0_1_1_8_2 - 0.0138204652490389*G0_1_1_8_3 + 0.0113800485229075*G0_1_1_8_4 + 0.00221207364064548*G0_1_1_8_5 + 0.00276009704581172*G0_1_1_8_6 - 0.0379991437134358*G0_1_1_8_7 - 0.263022691594165*G0_1_1_8_8 - 0.00542885685742931*G0_1_1_8_9 + 0.00333190618904962*G0_1_1_9_0 - 0.00577708006279529*G0_1_1_9_1 + 0.00286380286380333*G0_1_1_9_2 + 0.012450406736123*G0_1_1_9_3 - 0.00558298844013215*G0_1_1_9_4 - 0.0144198658484397*G0_1_1_9_5 + 0.004384187241331*G0_1_1_9_6 - 0.0222291993720603*G0_1_1_9_7 - 0.0054288568574293*G0_1_1_9_8 + 0.118373055515933*G0_1_1_9_9; + A[85] = A[155] + 0.00143066809733496*G0_0_1_0_0 - 0.000396887063553818*G0_0_1_0_1 - 0.000196170672361178*G0_0_1_0_2 + 0.000769072197643771*G0_0_1_0_4 + 0.000344100344100432*G0_0_1_0_6 - 0.00237793952079709*G0_0_1_0_7 + 0.00396333824905322*G0_0_1_0_8 - 0.00232719661291128*G0_0_1_0_9 - 0.000396887063553818*G0_0_1_1_0 - 0.0516372516372608*G0_0_1_1_1 - 0.000388782293544267*G0_0_1_1_2 + 0.00158064158064174*G0_0_1_1_3 + 0.00198595055737952*G0_0_1_1_4 - 0.000110048681477261*G0_0_1_1_5 - 0.000892123749266745*G0_0_1_1_6 + 0.000582909154337897*G0_0_1_1_7 + 0.00262848262848289*G0_0_1_1_8 + 0.00678178963893363*G0_0_1_1_9 - 0.000196170672361178*G0_0_1_2_0 - 0.000388782293544267*G0_0_1_2_1 - 0.00287120287120331*G0_0_1_2_2 + 0.00297194868623488*G0_0_1_2_3 - 0.00119436119436134*G0_0_1_2_4 + 0.00131138702567293*G0_0_1_2_5 - 0.0010833610833612*G0_0_1_2_6 - 0.00092637521208965*G0_0_1_2_7 + 0.000828060828060969*G0_0_1_2_8 - 0.00265829408686594*G0_0_1_2_9 + 0.00158064158064173*G0_0_1_3_1 + 0.00297194868623488*G0_0_1_3_2 + 0.0516055373198322*G0_0_1_3_3 - 0.0174539745968348*G0_0_1_3_4 + 0.000665049236477948*G0_0_1_3_5 + 0.00177822177822201*G0_0_1_3_6 - 0.000796346510632355*G0_0_1_3_7 + 0.00417867846439347*G0_0_1_3_8 - 0.0187526758955361*G0_0_1_3_9 + 0.000769072197643771*G0_0_1_4_0 + 0.00198595055737953*G0_0_1_4_1 - 0.00119436119436134*G0_0_1_4_2 - 0.0174539745968348*G0_0_1_4_3 + 0.00021121735407479*G0_0_1_4_4 - 0.00320536606250952*G0_0_1_4_5 + 0.0014271442842875*G0_0_1_4_6 + 0.000685029256457918*G0_0_1_4_7 - 0.00338233195376111*G0_0_1_4_8 + 0.0143856143856169*G0_0_1_4_9 - 0.000110048681477261*G0_0_1_5_1 + 0.00131138702567293*G0_0_1_5_2 + 0.000665049236477947*G0_0_1_5_3 - 0.00320536606250952*G0_0_1_5_4 + 0.00283716283716336*G0_0_1_5_5 - 0.00284001712573196*G0_0_1_5_6 - 0.00131297274154438*G0_0_1_5_7 - 0.000568003425146378*G0_0_1_5_8 + 0.00811759668902656*G0_0_1_5_9 + 0.000344100344100432*G0_0_1_6_0 - 0.000892123749266745*G0_0_1_6_1 - 0.0010833610833612*G0_0_1_6_2 + 0.00177822177822201*G0_0_1_6_3 + 0.0014271442842875*G0_0_1_6_4 - 0.00284001712573196*G0_0_1_6_5 + 0.00180961895247667*G0_0_1_6_6 + 0.00188097616669074*G0_0_1_6_7 + 0.000545169116597771*G0_0_1_6_8 + 0.00441843870415381*G0_0_1_6_9 - 0.00237793952079709*G0_0_1_7_0 + 0.000582909154337899*G0_0_1_7_1 - 0.000926375212089649*G0_0_1_7_2 - 0.000796346510632356*G0_0_1_7_3 + 0.000685029256457918*G0_0_1_7_4 - 0.00131297274154438*G0_0_1_7_5 + 0.00188097616669074*G0_0_1_7_6 - 0.0600713572142243*G0_0_1_7_7 - 0.0147652347652372*G0_0_1_7_8 + 0.0032196375053523*G0_0_1_7_9 + 0.00396333824905322*G0_0_1_8_0 + 0.00262848262848289*G0_0_1_8_1 + 0.000828060828060969*G0_0_1_8_2 + 0.00417867846439347*G0_0_1_8_3 - 0.00338233195376111*G0_0_1_8_4 - 0.000568003425146378*G0_0_1_8_5 + 0.000545169116597771*G0_0_1_8_6 - 0.0147652347652372*G0_0_1_8_7 + 0.134322820037129*G0_0_1_8_8 - 0.0135807050092786*G0_0_1_8_9 - 0.00232719661291128*G0_0_1_9_0 + 0.00678178963893363*G0_0_1_9_1 - 0.00265829408686594*G0_0_1_9_2 - 0.0187526758955361*G0_0_1_9_3 + 0.0143856143856169*G0_0_1_9_4 + 0.00811759668902657*G0_0_1_9_5 + 0.00441843870415381*G0_0_1_9_6 + 0.0032196375053523*G0_0_1_9_7 - 0.0135807050092786*G0_0_1_9_8 - 0.0293877551020457*G0_0_1_9_9 - 0.00143066809733496*G0_1_0_0_0 + 0.000396887063553818*G0_1_0_0_1 + 0.000196170672361178*G0_1_0_0_2 - 0.000769072197643771*G0_1_0_0_4 - 0.000344100344100432*G0_1_0_0_6 + 0.00237793952079709*G0_1_0_0_7 - 0.00396333824905322*G0_1_0_0_8 + 0.00232719661291128*G0_1_0_0_9 + 0.000396887063553818*G0_1_0_1_0 + 0.0516372516372608*G0_1_0_1_1 + 0.000388782293544267*G0_1_0_1_2 - 0.00158064158064174*G0_1_0_1_3 - 0.00198595055737952*G0_1_0_1_4 + 0.000110048681477261*G0_1_0_1_5 + 0.000892123749266744*G0_1_0_1_6 - 0.000582909154337898*G0_1_0_1_7 - 0.00262848262848289*G0_1_0_1_8 - 0.00678178963893363*G0_1_0_1_9 + 0.000196170672361178*G0_1_0_2_0 + 0.000388782293544267*G0_1_0_2_1 + 0.00287120287120331*G0_1_0_2_2 - 0.00297194868623488*G0_1_0_2_3 + 0.00119436119436134*G0_1_0_2_4 - 0.00131138702567293*G0_1_0_2_5 + 0.0010833610833612*G0_1_0_2_6 + 0.000926375212089649*G0_1_0_2_7 - 0.000828060828060969*G0_1_0_2_8 + 0.00265829408686594*G0_1_0_2_9 - 0.00158064158064173*G0_1_0_3_1 - 0.00297194868623488*G0_1_0_3_2 - 0.0516055373198322*G0_1_0_3_3 + 0.0174539745968348*G0_1_0_3_4 - 0.000665049236477947*G0_1_0_3_5 - 0.00177822177822201*G0_1_0_3_6 + 0.000796346510632355*G0_1_0_3_7 - 0.00417867846439347*G0_1_0_3_8 + 0.0187526758955361*G0_1_0_3_9 - 0.000769072197643771*G0_1_0_4_0 - 0.00198595055737952*G0_1_0_4_1 + 0.00119436119436134*G0_1_0_4_2 + 0.0174539745968348*G0_1_0_4_3 - 0.00021121735407479*G0_1_0_4_4 + 0.00320536606250952*G0_1_0_4_5 - 0.0014271442842875*G0_1_0_4_6 - 0.000685029256457918*G0_1_0_4_7 + 0.00338233195376111*G0_1_0_4_8 - 0.0143856143856169*G0_1_0_4_9 + 0.000110048681477261*G0_1_0_5_1 - 0.00131138702567293*G0_1_0_5_2 - 0.000665049236477947*G0_1_0_5_3 + 0.00320536606250952*G0_1_0_5_4 - 0.00283716283716336*G0_1_0_5_5 + 0.00284001712573196*G0_1_0_5_6 + 0.00131297274154438*G0_1_0_5_7 + 0.000568003425146378*G0_1_0_5_8 - 0.00811759668902656*G0_1_0_5_9 - 0.000344100344100432*G0_1_0_6_0 + 0.000892123749266744*G0_1_0_6_1 + 0.0010833610833612*G0_1_0_6_2 - 0.00177822177822201*G0_1_0_6_3 - 0.0014271442842875*G0_1_0_6_4 + 0.00284001712573196*G0_1_0_6_5 - 0.00180961895247667*G0_1_0_6_6 - 0.00188097616669074*G0_1_0_6_7 - 0.000545169116597772*G0_1_0_6_8 - 0.00441843870415381*G0_1_0_6_9 + 0.00237793952079709*G0_1_0_7_0 - 0.000582909154337898*G0_1_0_7_1 + 0.000926375212089649*G0_1_0_7_2 + 0.000796346510632356*G0_1_0_7_3 - 0.000685029256457917*G0_1_0_7_4 + 0.00131297274154438*G0_1_0_7_5 - 0.00188097616669074*G0_1_0_7_6 + 0.0600713572142243*G0_1_0_7_7 + 0.0147652347652372*G0_1_0_7_8 - 0.0032196375053523*G0_1_0_7_9 - 0.00396333824905322*G0_1_0_8_0 - 0.00262848262848289*G0_1_0_8_1 - 0.000828060828060969*G0_1_0_8_2 - 0.00417867846439347*G0_1_0_8_3 + 0.00338233195376111*G0_1_0_8_4 + 0.000568003425146378*G0_1_0_8_5 - 0.000545169116597771*G0_1_0_8_6 + 0.0147652347652372*G0_1_0_8_7 - 0.134322820037129*G0_1_0_8_8 + 0.0135807050092786*G0_1_0_8_9 + 0.00232719661291128*G0_1_0_9_0 - 0.00678178963893363*G0_1_0_9_1 + 0.00265829408686594*G0_1_0_9_2 + 0.0187526758955361*G0_1_0_9_3 - 0.0143856143856169*G0_1_0_9_4 - 0.00811759668902657*G0_1_0_9_5 - 0.00441843870415381*G0_1_0_9_6 - 0.0032196375053523*G0_1_0_9_7 + 0.0135807050092786*G0_1_0_9_8 + 0.0293877551020457*G0_1_0_9_9; + A[130] = -A[85] - 0.0530679197345956*G0_1_0_0_0 - 0.000192611621183075*G0_1_0_0_2 - 0.00166119594691052*G0_1_0_0_4 + 0.00151150436864748*G0_1_0_0_5 + 0.00164185021327907*G0_1_0_0_6 + 0.00500642214928007*G0_1_0_0_7 - 0.00338042909471536*G0_1_0_0_8 + 0.00910898625184488*G0_1_0_0_9 + 0.053067919734596*G0_1_0_1_1 + 0.000192611621183102*G0_1_0_1_2 - 0.00151150436864733*G0_1_0_1_3 - 0.00164185021327913*G0_1_0_1_4 + 0.00166119594691052*G0_1_0_1_6 + 0.00338042909471527*G0_1_0_1_7 - 0.00500642214927992*G0_1_0_1_8 - 0.00910898625184491*G0_1_0_1_9 - 0.000192611621183075*G0_1_0_2_0 + 0.000192611621183102*G0_1_0_2_1 - 0.00166056166056197*G0_1_0_2_3 + 0.000111000111000191*G0_1_0_2_4 + 0.00166056166056192*G0_1_0_2_5 - 0.000111000111000071*G0_1_0_2_6 + 0.00175443604015061*G0_1_0_2_7 - 0.00175443604015062*G0_1_0_2_8 - 0.00151150436864733*G0_1_0_3_1 - 0.00166056166056197*G0_1_0_3_2 - 0.0487683744826689*G0_1_0_3_3 + 0.0146139574711028*G0_1_0_3_4 - 0.00498358784073155*G0_1_0_3_6 + 0.000228343085485959*G0_1_0_3_7 - 0.00549165120593785*G0_1_0_3_8 + 0.0268702725845627*G0_1_0_3_9 - 0.00166119594691052*G0_1_0_4_0 - 0.00164185021327913*G0_1_0_4_1 + 0.000111000111000191*G0_1_0_4_2 + 0.0146139574711028*G0_1_0_4_3 + 0.0015984015984018*G0_1_0_4_4 + 0.00498358784073155*G0_1_0_4_5 - 0.000139860139860143*G0_1_0_4_7 + 0.00526330812045186*G0_1_0_4_8 - 0.00996717568146308*G0_1_0_4_9 + 0.00151150436864748*G0_1_0_5_0 + 0.00166056166056192*G0_1_0_5_2 + 0.00498358784073155*G0_1_0_5_4 + 0.0487683744826684*G0_1_0_5_5 - 0.0146139574711028*G0_1_0_5_6 + 0.0054916512059378*G0_1_0_5_7 - 0.000228343085485946*G0_1_0_5_8 - 0.0268702725845628*G0_1_0_5_9 + 0.00164185021327907*G0_1_0_6_0 + 0.00166119594691052*G0_1_0_6_1 - 0.000111000111000072*G0_1_0_6_2 - 0.00498358784073155*G0_1_0_6_3 - 0.0146139574711028*G0_1_0_6_5 - 0.00159840159840176*G0_1_0_6_6 - 0.00526330812045183*G0_1_0_6_7 + 0.000139860139860127*G0_1_0_6_8 + 0.00996717568146308*G0_1_0_6_9 + 0.00500642214928006*G0_1_0_7_0 + 0.00338042909471527*G0_1_0_7_1 + 0.00175443604015061*G0_1_0_7_2 + 0.000228343085485959*G0_1_0_7_3 - 0.000139860139860144*G0_1_0_7_4 + 0.00549165120593779*G0_1_0_7_5 - 0.00526330812045183*G0_1_0_7_6 + 0.194394177251353*G0_1_0_7_7 - 0.0168003425146309*G0_1_0_7_9 - 0.00338042909471536*G0_1_0_8_0 - 0.00500642214927992*G0_1_0_8_1 - 0.00175443604015062*G0_1_0_8_2 - 0.00549165120593784*G0_1_0_8_3 + 0.00526330812045186*G0_1_0_8_4 - 0.000228343085485946*G0_1_0_8_5 + 0.000139860139860128*G0_1_0_8_6 - 0.194394177251353*G0_1_0_8_8 + 0.0168003425146309*G0_1_0_8_9 + 0.00910898625184489*G0_1_0_9_0 - 0.00910898625184491*G0_1_0_9_1 + 0.0268702725845627*G0_1_0_9_3 - 0.00996717568146308*G0_1_0_9_4 - 0.0268702725845628*G0_1_0_9_5 + 0.00996717568146308*G0_1_0_9_6 - 0.0168003425146309*G0_1_0_9_7 + 0.0168003425146309*G0_1_0_9_8 + 0.00910102243435721*G0_1_1_0_0 + 0.00144874525826934*G0_1_1_0_1 + 0.00050062811967582*G0_1_1_0_2 - 0.000883243740386764*G0_1_1_0_3 + 0.000431631860203376*G0_1_1_0_4 + 0.00154702440416748*G0_1_1_0_5 - 0.00146805575377026*G0_1_1_0_6 + 0.0182021153449755*G0_1_1_0_7 - 0.00174841031983919*G0_1_1_0_8 + 0.00333190618904961*G0_1_1_0_9 + 0.00144874525826934*G0_1_1_1_0 + 0.0621689421689534*G0_1_1_1_1 + 0.00069323974085892*G0_1_1_1_2 - 0.00310990596704941*G0_1_1_1_4 - 0.000807129378558118*G0_1_1_1_5 + 0.0020928278071139*G0_1_1_1_6 + 0.00163201877487606*G0_1_1_1_7 + 0.0131956931956957*G0_1_1_1_8 - 0.00577708006279529*G0_1_1_1_9 + 0.00050062811967582*G0_1_1_2_0 + 0.00069323974085892*G0_1_1_2_1 + 0.00207200207200244*G0_1_1_2_2 - 0.00343878343878402*G0_1_1_2_3 - 0.000621600621600719*G0_1_1_2_4 - 0.00177822177822209*G0_1_1_2_5 - 0.000732600732600858*G0_1_1_2_6 - 0.00210868496582819*G0_1_1_2_7 - 0.00386312100597879*G0_1_1_2_8 + 0.00286380286380333*G0_1_1_2_9 - 0.000883243740386764*G0_1_1_3_0 - 0.00343878343878402*G0_1_1_3_2 - 0.0694562580276987*G0_1_1_3_3 + 0.0209932924218674*G0_1_1_3_4 + 0.00264021692593166*G0_1_1_3_5 - 0.0064877979163705*G0_1_1_3_6 + 0.00244041672613144*G0_1_1_3_7 - 0.0138204652490389*G0_1_1_3_8 + 0.012450406736123*G0_1_1_3_9 + 0.000431631860203376*G0_1_1_4_0 - 0.00310990596704941*G0_1_1_4_1 - 0.000621600621600719*G0_1_1_4_2 + 0.0209932924218674*G0_1_1_4_3 + 0.019580419580423*G0_1_1_4_4 - 0.00150421007563892*G0_1_1_4_5 + 0.00799200799200943*G0_1_1_4_6 + 0.00262023690595164*G0_1_1_4_7 + 0.0113800485229075*G0_1_1_4_8 - 0.00558298844013215*G0_1_1_4_9 + 0.00154702440416748*G0_1_1_5_0 - 0.000807129378558118*G0_1_1_5_1 - 0.00177822177822209*G0_1_1_5_2 + 0.00264021692593166*G0_1_1_5_3 - 0.00150421007563892*G0_1_1_5_4 - 0.0206878835450299*G0_1_1_5_5 + 0.0063793349507646*G0_1_1_5_6 - 0.00832881404310119*G0_1_1_5_7 + 0.00221207364064548*G0_1_1_5_8 - 0.0144198658484397*G0_1_1_5_9 - 0.00146805575377026*G0_1_1_6_0 + 0.00209282780711391*G0_1_1_6_1 - 0.000732600732600858*G0_1_1_6_2 - 0.0064877979163705*G0_1_1_6_3 + 0.00799200799200943*G0_1_1_6_4 + 0.0063793349507646*G0_1_1_6_5 + 0.0179820179820214*G0_1_1_6_6 + 0.00611674040245572*G0_1_1_6_7 + 0.00276009704581172*G0_1_1_6_8 + 0.004384187241331*G0_1_1_6_9 + 0.0182021153449755*G0_1_1_7_0 + 0.00163201877487606*G0_1_1_7_1 - 0.00210868496582818*G0_1_1_7_2 + 0.00244041672613144*G0_1_1_7_3 + 0.00262023690595163*G0_1_1_7_4 - 0.00832881404310118*G0_1_1_7_5 + 0.00611674040245572*G0_1_1_7_6 - 0.0686285143428118*G0_1_1_7_7 - 0.0379991437134357*G0_1_1_7_8 - 0.0222291993720603*G0_1_1_7_9 - 0.00174841031983919*G0_1_1_8_0 + 0.0131956931956957*G0_1_1_8_1 - 0.00386312100597879*G0_1_1_8_2 - 0.0138204652490389*G0_1_1_8_3 + 0.0113800485229075*G0_1_1_8_4 + 0.00221207364064548*G0_1_1_8_5 + 0.00276009704581172*G0_1_1_8_6 - 0.0379991437134357*G0_1_1_8_7 - 0.263022691594165*G0_1_1_8_8 - 0.00542885685742931*G0_1_1_8_9 + 0.00333190618904962*G0_1_1_9_0 - 0.00577708006279529*G0_1_1_9_1 + 0.00286380286380333*G0_1_1_9_2 + 0.012450406736123*G0_1_1_9_3 - 0.00558298844013215*G0_1_1_9_4 - 0.0144198658484397*G0_1_1_9_5 + 0.004384187241331*G0_1_1_9_6 - 0.0222291993720603*G0_1_1_9_7 - 0.00542885685742931*G0_1_1_9_8 + 0.118373055515933*G0_1_1_9_9; + A[105] = A[7] - 0.139942464942489*G0_0_1_0_0 - 0.00711678753345543*G0_0_1_0_1 - 0.00480046188379602*G0_0_1_0_2 + 0.000651154401154562*G0_0_1_0_3 + 0.00115398490398509*G0_0_1_0_4 - 0.0372433122433185*G0_0_1_0_5 + 0.0208860583860619*G0_0_1_0_6 - 0.0754273504273632*G0_0_1_0_7 + 0.0327852702852758*G0_0_1_0_8 - 0.0053280053280063*G0_0_1_0_9 - 0.00711678753345543*G0_0_1_1_0 - 0.00096585953728827*G0_0_1_1_1 - 0.000270961401913823*G0_0_1_1_2 + 0.000334784263355755*G0_0_1_1_3 + 0.000204616811759708*G0_0_1_1_4 - 0.00348720723720783*G0_0_1_1_5 + 0.00113685917257365*G0_0_1_1_6 - 0.00970904095904262*G0_0_1_1_7 + 0.00396722325293822*G0_0_1_1_8 - 0.00247906855049755*G0_0_1_1_9 - 0.00480046188379602*G0_0_1_2_0 - 0.000270961401913823*G0_0_1_2_1 + 0.0005469838803174*G0_0_1_2_2 - 0.000340235161663809*G0_0_1_2_3 + 0.000921657707372195*G0_0_1_2_4 - 0.000815712065712206*G0_0_1_2_5 + 0.00153616225044825*G0_0_1_2_6 - 0.00393675768675834*G0_0_1_2_7 + 0.00165729112157711*G0_0_1_2_8 - 0.000403049331620826*G0_0_1_2_9 + 0.000651154401154562*G0_0_1_3_0 + 0.000334784263355755*G0_0_1_3_1 - 0.000340235161663809*G0_0_1_3_2 + 0.000387826459255128*G0_0_1_3_3 + 0.00220154845154885*G0_0_1_3_5 + 0.00069448408734132*G0_0_1_3_6 + 0.00215159840159881*G0_0_1_3_7 - 0.00128478664192973*G0_0_1_3_8 + 0.00313400884829509*G0_0_1_3_9 + 0.00115398490398509*G0_0_1_4_0 + 0.000204616811759708*G0_0_1_4_1 + 0.000921657707372195*G0_0_1_4_2 + 0.00274261452832936*G0_0_1_4_4 + 0.000643106893106984*G0_0_1_4_5 - 0.00133759098044831*G0_0_1_4_6 + 0.00212162837162872*G0_0_1_4_7 - 0.000866811759669047*G0_0_1_4_8 - 0.0372433122433185*G0_0_1_5_0 - 0.00348720723720783*G0_0_1_5_1 - 0.000815712065712206*G0_0_1_5_2 + 0.00220154845154885*G0_0_1_5_3 + 0.000643106893106985*G0_0_1_5_4 - 0.0110639360639379*G0_0_1_5_5 + 0.00098026973026984*G0_0_1_5_6 - 0.0304820179820231*G0_0_1_5_7 + 0.0145666833166858*G0_0_1_5_8 - 0.0131493506493529*G0_0_1_5_9 + 0.0208860583860619*G0_0_1_6_0 + 0.00113685917257365*G0_0_1_6_1 + 0.00153616225044825*G0_0_1_6_2 + 0.00069448408734132*G0_0_1_6_3 - 0.00133759098044831*G0_0_1_6_4 + 0.00098026973026984*G0_0_1_6_5 - 0.0097227772227788*G0_0_1_6_6 + 0.0159153346653373*G0_0_1_6_7 - 0.00624375624375729*G0_0_1_6_8 - 0.000179820179820184*G0_0_1_6_9 - 0.0754273504273632*G0_0_1_7_0 - 0.00970904095904262*G0_0_1_7_1 - 0.00393675768675834*G0_0_1_7_2 + 0.00215159840159881*G0_0_1_7_3 + 0.00212162837162872*G0_0_1_7_4 - 0.0304820179820231*G0_0_1_7_5 + 0.0159153346653373*G0_0_1_7_6 - 0.110864135864155*G0_0_1_7_7 + 0.0454857642357719*G0_0_1_7_8 - 0.0158466533466561*G0_0_1_7_9 + 0.0327852702852759*G0_0_1_8_0 + 0.00396722325293822*G0_0_1_8_1 + 0.00165729112157711*G0_0_1_8_2 - 0.00128478664192973*G0_0_1_8_3 - 0.000866811759669047*G0_0_1_8_4 + 0.0145666833166858*G0_0_1_8_5 - 0.00624375624375729*G0_0_1_8_6 + 0.0454857642357719*G0_0_1_8_7 - 0.0172752247752277*G0_0_1_8_8 + 0.00917082917083074*G0_0_1_8_9 - 0.0053280053280063*G0_0_1_9_0 - 0.00247906855049755*G0_0_1_9_1 - 0.000403049331620826*G0_0_1_9_2 + 0.00313400884829509*G0_0_1_9_3 - 0.0131493506493529*G0_0_1_9_5 - 0.000179820179820184*G0_0_1_9_6 - 0.0158466533466561*G0_0_1_9_7 + 0.00917082917083074*G0_0_1_9_8 - 0.0220279720279758*G0_0_1_9_9 + 0.139942464942489*G0_1_0_0_0 + 0.00711678753345543*G0_1_0_0_1 + 0.00480046188379602*G0_1_0_0_2 - 0.000651154401154562*G0_1_0_0_3 - 0.00115398490398509*G0_1_0_0_4 + 0.0372433122433185*G0_1_0_0_5 - 0.0208860583860619*G0_1_0_0_6 + 0.0754273504273632*G0_1_0_0_7 - 0.0327852702852758*G0_1_0_0_8 + 0.0053280053280063*G0_1_0_0_9 + 0.00711678753345543*G0_1_0_1_0 + 0.00096585953728827*G0_1_0_1_1 + 0.000270961401913823*G0_1_0_1_2 - 0.000334784263355755*G0_1_0_1_3 - 0.000204616811759707*G0_1_0_1_4 + 0.00348720723720783*G0_1_0_1_5 - 0.00113685917257365*G0_1_0_1_6 + 0.00970904095904262*G0_1_0_1_7 - 0.00396722325293822*G0_1_0_1_8 + 0.00247906855049755*G0_1_0_1_9 + 0.00480046188379602*G0_1_0_2_0 + 0.000270961401913823*G0_1_0_2_1 - 0.000546983880317396*G0_1_0_2_2 + 0.000340235161663809*G0_1_0_2_3 - 0.000921657707372195*G0_1_0_2_4 + 0.000815712065712206*G0_1_0_2_5 - 0.00153616225044825*G0_1_0_2_6 + 0.00393675768675834*G0_1_0_2_7 - 0.00165729112157711*G0_1_0_2_8 + 0.000403049331620826*G0_1_0_2_9 - 0.000651154401154562*G0_1_0_3_0 - 0.000334784263355755*G0_1_0_3_1 + 0.000340235161663809*G0_1_0_3_2 - 0.000387826459255128*G0_1_0_3_3 - 0.00220154845154885*G0_1_0_3_5 - 0.00069448408734132*G0_1_0_3_6 - 0.00215159840159881*G0_1_0_3_7 + 0.00128478664192973*G0_1_0_3_8 - 0.00313400884829509*G0_1_0_3_9 - 0.00115398490398509*G0_1_0_4_0 - 0.000204616811759707*G0_1_0_4_1 - 0.000921657707372193*G0_1_0_4_2 - 0.00274261452832937*G0_1_0_4_4 - 0.000643106893106984*G0_1_0_4_5 + 0.00133759098044831*G0_1_0_4_6 - 0.00212162837162872*G0_1_0_4_7 + 0.000866811759669047*G0_1_0_4_8 + 0.0372433122433185*G0_1_0_5_0 + 0.00348720723720783*G0_1_0_5_1 + 0.000815712065712206*G0_1_0_5_2 - 0.00220154845154885*G0_1_0_5_3 - 0.000643106893106985*G0_1_0_5_4 + 0.0110639360639379*G0_1_0_5_5 - 0.000980269730269839*G0_1_0_5_6 + 0.0304820179820231*G0_1_0_5_7 - 0.0145666833166858*G0_1_0_5_8 + 0.0131493506493529*G0_1_0_5_9 - 0.0208860583860619*G0_1_0_6_0 - 0.00113685917257365*G0_1_0_6_1 - 0.00153616225044825*G0_1_0_6_2 - 0.00069448408734132*G0_1_0_6_3 + 0.00133759098044831*G0_1_0_6_4 - 0.000980269730269839*G0_1_0_6_5 + 0.0097227772227788*G0_1_0_6_6 - 0.0159153346653373*G0_1_0_6_7 + 0.00624375624375729*G0_1_0_6_8 + 0.000179820179820184*G0_1_0_6_9 + 0.0754273504273632*G0_1_0_7_0 + 0.00970904095904262*G0_1_0_7_1 + 0.00393675768675834*G0_1_0_7_2 - 0.00215159840159881*G0_1_0_7_3 - 0.00212162837162872*G0_1_0_7_4 + 0.0304820179820231*G0_1_0_7_5 - 0.0159153346653373*G0_1_0_7_6 + 0.110864135864155*G0_1_0_7_7 - 0.0454857642357719*G0_1_0_7_8 + 0.0158466533466561*G0_1_0_7_9 - 0.0327852702852759*G0_1_0_8_0 - 0.00396722325293822*G0_1_0_8_1 - 0.00165729112157711*G0_1_0_8_2 + 0.00128478664192973*G0_1_0_8_3 + 0.000866811759669047*G0_1_0_8_4 - 0.0145666833166858*G0_1_0_8_5 + 0.00624375624375729*G0_1_0_8_6 - 0.0454857642357719*G0_1_0_8_7 + 0.0172752247752277*G0_1_0_8_8 - 0.00917082917083074*G0_1_0_8_9 + 0.0053280053280063*G0_1_0_9_0 + 0.00247906855049755*G0_1_0_9_1 + 0.000403049331620826*G0_1_0_9_2 - 0.00313400884829508*G0_1_0_9_3 + 0.0131493506493529*G0_1_0_9_5 + 0.000179820179820184*G0_1_0_9_6 + 0.0158466533466561*G0_1_0_9_7 - 0.00917082917083074*G0_1_0_9_8 + 0.0220279720279758*G0_1_0_9_9; + A[10] = A[105] + 0.139942464942489*G0_0_0_0_0 + 0.00465351007017756*G0_0_0_0_1 + 0.00726373934707394*G0_0_0_0_2 + 0.00133436008436028*G0_0_0_0_3 - 0.00313949938949993*G0_0_0_0_4 + 0.0800740925741065*G0_0_0_0_5 - 0.0372835497835563*G0_0_0_0_6 + 0.0325965700965758*G0_0_0_0_7 - 0.0163877788877818*G0_0_0_0_8 + 0.00532800532800632*G0_0_0_0_9 + 0.00465351007017756*G0_0_0_1_0 + 0.0169847700800111*G0_0_0_1_1 + 0.000270961401913825*G0_0_0_1_2 + 0.0139981843553296*G0_0_0_1_3 - 0.00836385836385978*G0_0_0_1_4 + 0.00534534909535*G0_0_0_1_5 - 0.00337069676355448*G0_0_0_1_6 - 0.0015506715506718*G0_0_0_1_7 + 0.00442442478156839*G0_0_0_1_8 + 0.000450739736454112*G0_0_0_1_9 + 0.00726373934707394*G0_0_0_2_0 + 0.000270961401913825*G0_0_0_2_1 - 0.0165658944230401*G0_0_0_2_2 + 0.00849947671376386*G0_0_0_2_3 - 0.0152546263260575*G0_0_0_2_4 + 0.0120754245754266*G0_0_0_2_5 - 0.00992781028495484*G0_0_0_2_6 + 0.00207861582861619*G0_0_0_2_7 + 0.000576546469403701*G0_0_0_2_8 + 0.00243137814566428*G0_0_0_2_9 + 0.00133436008436028*G0_0_0_3_0 + 0.0139981843553296*G0_0_0_3_1 + 0.00849947671376386*G0_0_0_3_2 + 0.0424425574425645*G0_0_0_3_3 - 0.00796703296703431*G0_0_0_3_5 + 0.00600702868560112*G0_0_0_3_6 - 0.00810814185814323*G0_0_0_3_7 + 0.0139428428714166*G0_0_0_3_8 + 0.0148640645069241*G0_0_0_3_9 - 0.00313949938949993*G0_0_0_4_0 - 0.00836385836385978*G0_0_0_4_1 - 0.0152546263260575*G0_0_0_4_2 - 0.045572998430149*G0_0_0_4_4 + 0.00531343656343745*G0_0_0_4_5 - 0.0113204652490386*G0_0_0_4_6 + 0.00364385614385675*G0_0_0_4_7 - 0.00583470101327342*G0_0_0_4_8 - 0.0179210075638677*G0_0_0_4_9 + 0.0800740925741065*G0_0_0_5_0 + 0.00534534909535*G0_0_0_5_1 + 0.0120754245754266*G0_0_0_5_2 - 0.00796703296703431*G0_0_0_5_3 + 0.00531343656343745*G0_0_0_5_4 + 0.127022977022999*G0_0_0_5_5 - 0.0366620879120942*G0_0_0_5_6 + 0.0304820179820232*G0_0_0_5_7 - 0.0201411088911123*G0_0_0_5_8 + 0.024298201798206*G0_0_0_5_9 - 0.0372835497835563*G0_0_0_6_0 - 0.00337069676355448*G0_0_0_6_1 - 0.00992781028495484*G0_0_0_6_2 + 0.00600702868560112*G0_0_0_6_3 - 0.0113204652490386*G0_0_0_6_4 - 0.0366620879120942*G0_0_0_6_5 - 0.00445554445554508*G0_0_0_6_6 - 0.0103409090909109*G0_0_0_6_7 + 0.00624375624375731*G0_0_0_6_8 - 0.0193081918081951*G0_0_0_6_9 + 0.0325965700965758*G0_0_0_7_0 - 0.0015506715506718*G0_0_0_7_1 + 0.00207861582861619*G0_0_0_7_2 - 0.00810814185814323*G0_0_0_7_3 + 0.00364385614385675*G0_0_0_7_4 + 0.0304820179820232*G0_0_0_7_5 - 0.0103409090909109*G0_0_0_7_6 - 0.00509490509490579*G0_0_0_7_7 - 0.00980394605394778*G0_0_0_7_8 + 0.00469780219780302*G0_0_0_7_9 - 0.0163877788877818*G0_0_0_8_0 + 0.00442442478156839*G0_0_0_8_1 + 0.000576546469403701*G0_0_0_8_2 + 0.0139428428714167*G0_0_0_8_3 - 0.00583470101327342*G0_0_0_8_4 - 0.0201411088911123*G0_0_0_8_5 + 0.00624375624375731*G0_0_0_8_6 - 0.00980394605394778*G0_0_0_8_7 + 0.0314535464535518*G0_0_0_8_8 + 0.0103171828171845*G0_0_0_8_9 + 0.00532800532800632*G0_0_0_9_0 + 0.000450739736454112*G0_0_0_9_1 + 0.00243137814566428*G0_0_0_9_2 + 0.0148640645069241*G0_0_0_9_3 - 0.0179210075638677*G0_0_0_9_4 + 0.024298201798206*G0_0_0_9_5 - 0.0193081918081951*G0_0_0_9_6 + 0.00469780219780302*G0_0_0_9_7 + 0.0103171828171845*G0_0_0_9_8 + 0.0220279720279758*G0_0_0_9_9 - 0.000146951813618489*G0_0_1_0_1 + 0.000146951813618513*G0_0_1_0_2 + 0.00248834498834542*G0_0_1_0_3 - 0.00248834498834543*G0_0_1_0_4 + 0.00464674214674306*G0_0_1_0_5 - 0.00449827949828033*G0_0_1_0_6 - 0.0046467421467428*G0_0_1_0_7 + 0.00449827949828019*G0_0_1_0_8 - 0.000146951813618489*G0_0_1_1_0 + 0.0175317539603284*G0_0_1_1_1 + 0.0149198420627017*G0_0_1_1_3 - 0.00870409352552357*G0_0_1_1_4 + 0.00140859140859165*G0_0_1_1_5 - 0.00171340564197737*G0_0_1_1_6 - 0.00236638361638401*G0_0_1_1_7 + 0.00596058703201662*G0_0_1_1_8 + 0.000146951813618512*G0_0_1_2_0 - 0.0175317539603284*G0_0_1_2_2 + 0.00870409352552358*G0_0_1_2_3 - 0.0149198420627018*G0_0_1_2_4 + 0.00236638361638403*G0_0_1_2_5 - 0.00596058703201665*G0_0_1_2_6 - 0.00140859140859164*G0_0_1_2_7 + 0.00171340564197735*G0_0_1_2_8 + 0.00248834498834542*G0_0_1_3_0 + 0.0149198420627017*G0_0_1_3_1 + 0.00870409352552358*G0_0_1_3_2 + 0.0451851719708938*G0_0_1_3_3 - 0.00584540459540558*G0_0_1_3_5 + 0.00514021692593209*G0_0_1_3_6 - 0.00746503496503622*G0_0_1_3_7 + 0.0126052518909683*G0_0_1_3_8 + 0.0147869987155726*G0_0_1_3_9 - 0.00248834498834543*G0_0_1_4_0 - 0.00870409352552357*G0_0_1_4_1 - 0.0149198420627018*G0_0_1_4_2 - 0.045185171970894*G0_0_1_4_4 + 0.00746503496503624*G0_0_1_4_5 - 0.0126052518909683*G0_0_1_4_6 + 0.00584540459540558*G0_0_1_4_7 - 0.00514021692593207*G0_0_1_4_8 - 0.0147869987155726*G0_0_1_4_9 + 0.00464674214674306*G0_0_1_5_0 + 0.00140859140859165*G0_0_1_5_1 + 0.00236638361638403*G0_0_1_5_2 - 0.00584540459540558*G0_0_1_5_3 + 0.00746503496503623*G0_0_1_5_4 + 0.016158841158844*G0_0_1_5_5 + 0.00882367632367782*G0_0_1_5_6 - 0.00422577422577498*G0_0_1_5_8 + 0.00845154845154994*G0_0_1_5_9 - 0.00449827949828033*G0_0_1_6_0 - 0.00171340564197737*G0_0_1_6_1 - 0.00596058703201665*G0_0_1_6_2 + 0.00514021692593209*G0_0_1_6_3 - 0.0126052518909683*G0_0_1_6_4 + 0.00882367632367782*G0_0_1_6_5 - 0.0217307692307729*G0_0_1_6_6 + 0.00422577422577491*G0_0_1_6_7 - 0.0101373626373644*G0_0_1_6_9 - 0.0046467421467428*G0_0_1_7_0 - 0.00236638361638401*G0_0_1_7_1 - 0.00140859140859164*G0_0_1_7_2 - 0.00746503496503622*G0_0_1_7_3 + 0.00584540459540558*G0_0_1_7_4 + 0.00422577422577491*G0_0_1_7_6 - 0.0161588411588437*G0_0_1_7_7 - 0.00882367632367788*G0_0_1_7_8 - 0.00845154845154986*G0_0_1_7_9 + 0.00449827949828019*G0_0_1_8_0 + 0.00596058703201662*G0_0_1_8_1 + 0.00171340564197735*G0_0_1_8_2 + 0.0126052518909683*G0_0_1_8_3 - 0.00514021692593207*G0_0_1_8_4 - 0.00422577422577498*G0_0_1_8_5 - 0.00882367632367788*G0_0_1_8_7 + 0.0217307692307729*G0_0_1_8_8 + 0.0101373626373643*G0_0_1_8_9 + 0.0147869987155726*G0_0_1_9_3 - 0.0147869987155726*G0_0_1_9_4 + 0.00845154845154993*G0_0_1_9_5 - 0.0101373626373644*G0_0_1_9_6 - 0.00845154845154986*G0_0_1_9_7 + 0.0101373626373643*G0_0_1_9_8 - 0.00246327746327787*G0_1_0_0_1 + 0.00246327746327791*G0_1_0_0_2 + 0.00198551448551484*G0_1_0_0_3 - 0.00198551448551484*G0_1_0_0_4 + 0.0428307803307879*G0_1_0_0_5 - 0.0163974913974943*G0_1_0_0_6 - 0.0428307803307875*G0_1_0_0_7 + 0.0163974913974941*G0_1_0_0_8 - 0.00246327746327787*G0_1_0_1_0 + 0.0160189105427228*G0_1_0_1_1 + 0.0143329686186853*G0_1_0_1_3 - 0.00815924155210008*G0_1_0_1_4 + 0.00185814185814217*G0_1_0_1_5 - 0.00223383759098083*G0_1_0_1_6 - 0.0112597125097144*G0_1_0_1_7 + 0.00839164803450661*G0_1_0_1_8 - 0.00202832881404344*G0_1_0_1_9 + 0.00246327746327791*G0_1_0_2_0 - 0.0160189105427228*G0_1_0_2_2 + 0.00815924155210006*G0_1_0_2_3 - 0.0143329686186853*G0_1_0_2_4 + 0.0112597125097144*G0_1_0_2_5 - 0.00839164803450661*G0_1_0_2_6 - 0.00185814185814215*G0_1_0_2_7 + 0.00223383759098081*G0_1_0_2_8 + 0.00202832881404345*G0_1_0_2_9 + 0.00198551448551484*G0_1_0_3_0 + 0.0143329686186853*G0_1_0_3_1 + 0.00815924155210006*G0_1_0_3_2 + 0.0428303839018196*G0_1_0_3_3 - 0.00576548451548546*G0_1_0_3_5 + 0.00670151277294246*G0_1_0_3_6 - 0.00595654345654441*G0_1_0_3_7 + 0.0126580562294869*G0_1_0_3_8 + 0.0179980733552192*G0_1_0_3_9 - 0.00198551448551484*G0_1_0_4_0 - 0.00815924155210008*G0_1_0_4_1 - 0.0143329686186853*G0_1_0_4_2 - 0.0428303839018197*G0_1_0_4_4 + 0.00595654345654444*G0_1_0_4_5 - 0.0126580562294869*G0_1_0_4_6 + 0.00576548451548546*G0_1_0_4_7 - 0.00670151277294245*G0_1_0_4_8 - 0.0179980733552192*G0_1_0_4_9 + 0.0428307803307879*G0_1_0_5_0 + 0.00185814185814217*G0_1_0_5_1 + 0.0112597125097144*G0_1_0_5_2 - 0.00576548451548546*G0_1_0_5_3 + 0.00595654345654444*G0_1_0_5_4 + 0.115959040959061*G0_1_0_5_5 - 0.0356818181818243*G0_1_0_5_6 - 0.00557442557442656*G0_1_0_5_8 + 0.0111488511488531*G0_1_0_5_9 - 0.0163974913974943*G0_1_0_6_0 - 0.00223383759098083*G0_1_0_6_1 - 0.00839164803450661*G0_1_0_6_2 + 0.00670151277294246*G0_1_0_6_3 - 0.0126580562294869*G0_1_0_6_4 - 0.0356818181818243*G0_1_0_6_5 - 0.014178321678324*G0_1_0_6_6 + 0.00557442557442647*G0_1_0_6_7 - 0.0194880119880153*G0_1_0_6_9 - 0.0428307803307875*G0_1_0_7_0 - 0.0112597125097144*G0_1_0_7_1 - 0.00185814185814215*G0_1_0_7_2 - 0.00595654345654442*G0_1_0_7_3 + 0.00576548451548546*G0_1_0_7_4 + 0.00557442557442646*G0_1_0_7_6 - 0.11595904095906*G0_1_0_7_7 + 0.0356818181818242*G0_1_0_7_8 - 0.011148851148853*G0_1_0_7_9 + 0.0163974913974941*G0_1_0_8_0 + 0.00839164803450661*G0_1_0_8_1 + 0.00223383759098081*G0_1_0_8_2 + 0.0126580562294869*G0_1_0_8_3 - 0.00670151277294245*G0_1_0_8_4 - 0.00557442557442656*G0_1_0_8_5 + 0.0356818181818242*G0_1_0_8_7 + 0.014178321678324*G0_1_0_8_8 + 0.0194880119880152*G0_1_0_8_9 - 0.00202832881404344*G0_1_0_9_1 + 0.00202832881404345*G0_1_0_9_2 + 0.0179980733552192*G0_1_0_9_3 - 0.0179980733552192*G0_1_0_9_4 + 0.0111488511488531*G0_1_0_9_5 - 0.0194880119880153*G0_1_0_9_6 - 0.011148851148853*G0_1_0_9_7 + 0.0194880119880152*G0_1_0_9_8 - 0.139942464942489*G0_1_1_0_0 - 0.00726373934707391*G0_1_1_0_1 - 0.00465351007017751*G0_1_1_0_2 + 0.00313949938949998*G0_1_1_0_3 - 0.00133436008436034*G0_1_1_0_4 - 0.0325965700965755*G0_1_1_0_5 + 0.0163877788877816*G0_1_1_0_6 - 0.080074092574106*G0_1_1_0_7 + 0.037283549783556*G0_1_1_0_8 - 0.0053280053280063*G0_1_1_0_9 - 0.00726373934707391*G0_1_1_1_0 + 0.0165658944230401*G0_1_1_1_1 - 0.000270961401913835*G0_1_1_1_2 + 0.0152546263260575*G0_1_1_1_3 - 0.00849947671376387*G0_1_1_1_4 - 0.00207861582861618*G0_1_1_1_5 - 0.000576546469403717*G0_1_1_1_6 - 0.0120754245754266*G0_1_1_1_7 + 0.00992781028495484*G0_1_1_1_8 - 0.00243137814566427*G0_1_1_1_9 - 0.00465351007017751*G0_1_1_2_0 - 0.000270961401913835*G0_1_1_2_1 - 0.0169847700800111*G0_1_1_2_2 + 0.00836385836385978*G0_1_1_2_3 - 0.0139981843553296*G0_1_1_2_4 + 0.00155067155067183*G0_1_1_2_5 - 0.00442442478156842*G0_1_1_2_6 - 0.00534534909534998*G0_1_1_2_7 + 0.00337069676355446*G0_1_1_2_8 - 0.000450739736454103*G0_1_1_2_9 + 0.00313949938949998*G0_1_1_3_0 + 0.0152546263260575*G0_1_1_3_1 + 0.00836385836385978*G0_1_1_3_2 + 0.0455729984301489*G0_1_1_3_3 - 0.00364385614385673*G0_1_1_3_5 + 0.00583470101327342*G0_1_1_3_6 - 0.00531343656343741*G0_1_1_3_7 + 0.0113204652490385*G0_1_1_3_8 + 0.0179210075638677*G0_1_1_3_9 - 0.00133436008436034*G0_1_1_4_0 - 0.00849947671376387*G0_1_1_4_1 - 0.0139981843553296*G0_1_1_4_2 - 0.0424425574425647*G0_1_1_4_4 + 0.00810814185814323*G0_1_1_4_5 - 0.0139428428714167*G0_1_1_4_6 + 0.00796703296703429*G0_1_1_4_7 - 0.0060070286856011*G0_1_1_4_8 - 0.0148640645069242*G0_1_1_4_9 - 0.0325965700965755*G0_1_1_5_0 - 0.00207861582861618*G0_1_1_5_1 + 0.00155067155067183*G0_1_1_5_2 - 0.00364385614385673*G0_1_1_5_3 + 0.00810814185814323*G0_1_1_5_4 + 0.00509490509490601*G0_1_1_5_5 + 0.00980394605394768*G0_1_1_5_6 - 0.030482017982023*G0_1_1_5_7 + 0.0103409090909108*G0_1_1_5_8 - 0.00469780219780299*G0_1_1_5_9 + 0.0163877788877816*G0_1_1_6_0 - 0.000576546469403717*G0_1_1_6_1 - 0.00442442478156842*G0_1_1_6_2 + 0.00583470101327342*G0_1_1_6_3 - 0.0139428428714167*G0_1_1_6_4 + 0.00980394605394768*G0_1_1_6_5 - 0.0314535464535518*G0_1_1_6_6 + 0.0201411088911122*G0_1_1_6_7 - 0.00624375624375727*G0_1_1_6_8 - 0.0103171828171846*G0_1_1_6_9 - 0.080074092574106*G0_1_1_7_0 - 0.0120754245754266*G0_1_1_7_1 - 0.00534534909534998*G0_1_1_7_2 - 0.0053134365634374*G0_1_1_7_3 + 0.00796703296703429*G0_1_1_7_4 - 0.030482017982023*G0_1_1_7_5 + 0.0201411088911122*G0_1_1_7_6 - 0.127022977022998*G0_1_1_7_7 + 0.0366620879120941*G0_1_1_7_8 - 0.0242982017982059*G0_1_1_7_9 + 0.037283549783556*G0_1_1_8_0 + 0.00992781028495484*G0_1_1_8_1 + 0.00337069676355446*G0_1_1_8_2 + 0.0113204652490385*G0_1_1_8_3 - 0.0060070286856011*G0_1_1_8_4 + 0.0103409090909108*G0_1_1_8_5 - 0.00624375624375727*G0_1_1_8_6 + 0.0366620879120941*G0_1_1_8_7 + 0.0044555444555451*G0_1_1_8_8 + 0.019308191808195*G0_1_1_8_9 - 0.0053280053280063*G0_1_1_9_0 - 0.00243137814566427*G0_1_1_9_1 - 0.000450739736454103*G0_1_1_9_2 + 0.0179210075638677*G0_1_1_9_3 - 0.0148640645069242*G0_1_1_9_4 - 0.00469780219780299*G0_1_1_9_5 - 0.0103171828171846*G0_1_1_9_6 - 0.0242982017982059*G0_1_1_9_7 + 0.019308191808195*G0_1_1_9_8 - 0.0220279720279759*G0_1_1_9_9; + A[150] = A[10] + 0.139942464942489*G0_0_1_0_0 + 0.00480046188379604*G0_0_1_0_1 + 0.00711678753345542*G0_0_1_0_2 - 0.00115398490398513*G0_0_1_0_3 - 0.00065115440115451*G0_0_1_0_4 + 0.0754273504273634*G0_0_1_0_5 - 0.0327852702852759*G0_0_1_0_6 + 0.0372433122433186*G0_0_1_0_7 - 0.020886058386062*G0_0_1_0_8 + 0.0053280053280063*G0_0_1_0_9 + 0.00480046188379604*G0_0_1_1_0 - 0.00054698388031731*G0_0_1_1_1 + 0.000270961401913828*G0_0_1_1_2 - 0.000921657707372145*G0_0_1_1_3 + 0.000340235161663789*G0_0_1_1_4 + 0.00393675768675835*G0_0_1_1_5 - 0.00165729112157712*G0_0_1_1_6 + 0.00081571206571221*G0_0_1_1_7 - 0.00153616225044823*G0_0_1_1_8 + 0.000403049331620832*G0_0_1_1_9 + 0.00711678753345542*G0_0_1_2_0 + 0.000270961401913828*G0_0_1_2_1 + 0.000965859537288261*G0_0_1_2_2 - 0.000204616811759702*G0_0_1_2_3 - 0.000334784263355757*G0_0_1_2_4 + 0.00970904095904262*G0_0_1_2_5 - 0.00396722325293822*G0_0_1_2_6 + 0.00348720723720782*G0_0_1_2_7 - 0.00113685917257366*G0_0_1_2_8 + 0.00247906855049754*G0_0_1_2_9 - 0.00115398490398513*G0_0_1_3_0 - 0.000921657707372145*G0_0_1_3_1 - 0.000204616811759702*G0_0_1_3_2 - 0.00274261452832927*G0_0_1_3_3 - 0.00212162837162873*G0_0_1_3_5 + 0.000866811759669051*G0_0_1_3_6 - 0.000643106893107003*G0_0_1_3_7 + 0.00133759098044833*G0_0_1_3_8 - 0.00065115440115451*G0_0_1_4_0 + 0.000340235161663789*G0_0_1_4_1 - 0.000334784263355757*G0_0_1_4_2 - 0.000387826459255114*G0_0_1_4_4 - 0.00215159840159878*G0_0_1_4_5 + 0.00128478664192972*G0_0_1_4_6 - 0.00220154845154883*G0_0_1_4_7 - 0.000694484087341328*G0_0_1_4_8 - 0.00313400884829508*G0_0_1_4_9 + 0.0754273504273634*G0_0_1_5_0 + 0.00393675768675835*G0_0_1_5_1 + 0.00970904095904262*G0_0_1_5_2 - 0.00212162837162873*G0_0_1_5_3 - 0.00215159840159878*G0_0_1_5_4 + 0.110864135864155*G0_0_1_5_5 - 0.045485764235772*G0_0_1_5_6 + 0.0304820179820231*G0_0_1_5_7 - 0.0159153346653374*G0_0_1_5_8 + 0.0158466533466561*G0_0_1_5_9 - 0.0327852702852759*G0_0_1_6_0 - 0.00165729112157711*G0_0_1_6_1 - 0.00396722325293822*G0_0_1_6_2 + 0.000866811759669051*G0_0_1_6_3 + 0.00128478664192972*G0_0_1_6_4 - 0.045485764235772*G0_0_1_6_5 + 0.0172752247752277*G0_0_1_6_6 - 0.0145666833166858*G0_0_1_6_7 + 0.00624375624375731*G0_0_1_6_8 - 0.00917082917083073*G0_0_1_6_9 + 0.0372433122433186*G0_0_1_7_0 + 0.00081571206571221*G0_0_1_7_1 + 0.00348720723720782*G0_0_1_7_2 - 0.000643106893107003*G0_0_1_7_3 - 0.00220154845154883*G0_0_1_7_4 + 0.0304820179820231*G0_0_1_7_5 - 0.0145666833166858*G0_0_1_7_6 + 0.0110639360639379*G0_0_1_7_7 - 0.000980269730269891*G0_0_1_7_8 + 0.0131493506493529*G0_0_1_7_9 - 0.020886058386062*G0_0_1_8_0 - 0.00153616225044823*G0_0_1_8_1 - 0.00113685917257366*G0_0_1_8_2 + 0.00133759098044833*G0_0_1_8_3 - 0.000694484087341328*G0_0_1_8_4 - 0.0159153346653374*G0_0_1_8_5 + 0.00624375624375731*G0_0_1_8_6 - 0.000980269730269892*G0_0_1_8_7 + 0.00972277722277874*G0_0_1_8_8 + 0.000179820179820158*G0_0_1_8_9 + 0.0053280053280063*G0_0_1_9_0 + 0.000403049331620833*G0_0_1_9_1 + 0.00247906855049754*G0_0_1_9_2 - 0.00313400884829508*G0_0_1_9_4 + 0.0158466533466561*G0_0_1_9_5 - 0.00917082917083073*G0_0_1_9_6 + 0.0131493506493529*G0_0_1_9_7 + 0.000179820179820158*G0_0_1_9_8 + 0.0220279720279758*G0_0_1_9_9 - 0.139942464942489*G0_1_0_0_0 - 0.00480046188379604*G0_1_0_0_1 - 0.00711678753345542*G0_1_0_0_2 + 0.00115398490398513*G0_1_0_0_3 + 0.00065115440115451*G0_1_0_0_4 - 0.0754273504273634*G0_1_0_0_5 + 0.0327852702852759*G0_1_0_0_6 - 0.0372433122433186*G0_1_0_0_7 + 0.020886058386062*G0_1_0_0_8 - 0.0053280053280063*G0_1_0_0_9 - 0.00480046188379604*G0_1_0_1_0 + 0.000546983880317313*G0_1_0_1_1 - 0.000270961401913828*G0_1_0_1_2 + 0.000921657707372145*G0_1_0_1_3 - 0.000340235161663789*G0_1_0_1_4 - 0.00393675768675835*G0_1_0_1_5 + 0.00165729112157711*G0_1_0_1_6 - 0.000815712065712211*G0_1_0_1_7 + 0.00153616225044823*G0_1_0_1_8 - 0.000403049331620832*G0_1_0_1_9 - 0.00711678753345542*G0_1_0_2_0 - 0.000270961401913827*G0_1_0_2_1 - 0.000965859537288261*G0_1_0_2_2 + 0.000204616811759702*G0_1_0_2_3 + 0.000334784263355757*G0_1_0_2_4 - 0.00970904095904262*G0_1_0_2_5 + 0.00396722325293822*G0_1_0_2_6 - 0.00348720723720783*G0_1_0_2_7 + 0.00113685917257366*G0_1_0_2_8 - 0.00247906855049754*G0_1_0_2_9 + 0.00115398490398513*G0_1_0_3_0 + 0.000921657707372146*G0_1_0_3_1 + 0.000204616811759702*G0_1_0_3_2 + 0.00274261452832929*G0_1_0_3_3 + 0.00212162837162873*G0_1_0_3_5 - 0.000866811759669051*G0_1_0_3_6 + 0.000643106893107003*G0_1_0_3_7 - 0.00133759098044833*G0_1_0_3_8 + 0.00065115440115451*G0_1_0_4_0 - 0.000340235161663789*G0_1_0_4_1 + 0.000334784263355757*G0_1_0_4_2 + 0.000387826459255114*G0_1_0_4_4 + 0.00215159840159878*G0_1_0_4_5 - 0.00128478664192972*G0_1_0_4_6 + 0.00220154845154883*G0_1_0_4_7 + 0.000694484087341328*G0_1_0_4_8 + 0.00313400884829508*G0_1_0_4_9 - 0.0754273504273634*G0_1_0_5_0 - 0.00393675768675835*G0_1_0_5_1 - 0.00970904095904262*G0_1_0_5_2 + 0.00212162837162873*G0_1_0_5_3 + 0.00215159840159878*G0_1_0_5_4 - 0.110864135864155*G0_1_0_5_5 + 0.045485764235772*G0_1_0_5_6 - 0.0304820179820231*G0_1_0_5_7 + 0.0159153346653374*G0_1_0_5_8 - 0.0158466533466561*G0_1_0_5_9 + 0.0327852702852759*G0_1_0_6_0 + 0.00165729112157711*G0_1_0_6_1 + 0.00396722325293822*G0_1_0_6_2 - 0.000866811759669051*G0_1_0_6_3 - 0.00128478664192972*G0_1_0_6_4 + 0.045485764235772*G0_1_0_6_5 - 0.0172752247752277*G0_1_0_6_6 + 0.0145666833166858*G0_1_0_6_7 - 0.00624375624375731*G0_1_0_6_8 + 0.00917082917083073*G0_1_0_6_9 - 0.0372433122433186*G0_1_0_7_0 - 0.00081571206571221*G0_1_0_7_1 - 0.00348720723720783*G0_1_0_7_2 + 0.000643106893107003*G0_1_0_7_3 + 0.00220154845154883*G0_1_0_7_4 - 0.0304820179820231*G0_1_0_7_5 + 0.0145666833166858*G0_1_0_7_6 - 0.0110639360639379*G0_1_0_7_7 + 0.000980269730269892*G0_1_0_7_8 - 0.0131493506493529*G0_1_0_7_9 + 0.020886058386062*G0_1_0_8_0 + 0.00153616225044823*G0_1_0_8_1 + 0.00113685917257366*G0_1_0_8_2 - 0.00133759098044833*G0_1_0_8_3 + 0.000694484087341328*G0_1_0_8_4 + 0.0159153346653374*G0_1_0_8_5 - 0.00624375624375731*G0_1_0_8_6 + 0.00098026973026989*G0_1_0_8_7 - 0.00972277722277874*G0_1_0_8_8 - 0.000179820179820158*G0_1_0_8_9 - 0.00532800532800631*G0_1_0_9_0 - 0.000403049331620833*G0_1_0_9_1 - 0.00247906855049754*G0_1_0_9_2 + 0.00313400884829508*G0_1_0_9_4 - 0.0158466533466561*G0_1_0_9_5 + 0.00917082917083073*G0_1_0_9_6 - 0.0131493506493529*G0_1_0_9_7 - 0.000179820179820158*G0_1_0_9_8 - 0.0220279720279758*G0_1_0_9_9; + A[98] = A[126] - 0.00449920449920519*G0_0_1_0_0 + 0.000269783126926035*G0_0_1_0_1 + 0.000959604769128738*G0_0_1_0_2 - 0.00216503073645967*G0_0_1_0_3 + 0.00334311191454105*G0_0_1_0_4 + 0.00864320864321014*G0_0_1_0_5 + 0.00761312761312892*G0_0_1_0_6 - 0.00544640544640632*G0_0_1_0_7 + 0.00105376105376121*G0_0_1_0_8 + 0.00305472305472359*G0_0_1_0_9 + 0.000269783126926035*G0_0_1_1_0 + 0.00129789082170057*G0_0_1_1_1 + 0.00026978312692602*G0_0_1_1_2 - 0.00258027686599158*G0_0_1_1_3 + 0.0023747680890542*G0_0_1_1_4 + 0.00593861165289836*G0_0_1_1_5 + 0.00593861165289839*G0_0_1_1_6 + 0.0023747680890542*G0_0_1_1_7 - 0.00258027686599158*G0_0_1_1_8 + 0.0124523095951688*G0_0_1_1_9 + 0.000959604769128739*G0_0_1_2_0 + 0.000269783126926019*G0_0_1_2_1 - 0.00449920449920554*G0_0_1_2_2 + 0.00105376105376127*G0_0_1_2_3 - 0.00544640544640643*G0_0_1_2_4 + 0.00761312761312895*G0_0_1_2_5 + 0.00864320864321003*G0_0_1_2_6 + 0.00334311191454106*G0_0_1_2_7 - 0.00216503073645967*G0_0_1_2_8 + 0.00305472305472356*G0_0_1_2_9 - 0.00216503073645967*G0_0_1_3_0 - 0.00258027686599158*G0_0_1_3_1 + 0.00105376105376127*G0_0_1_3_2 + 0.00776366490652339*G0_0_1_3_3 - 0.00929356357927942*G0_0_1_3_4 - 0.00101993244850404*G0_0_1_3_5 - 0.0270967128110031*G0_0_1_3_6 - 0.00278578564292897*G0_0_1_3_7 + 0.00557157128585795*G0_0_1_3_8 - 0.0317853574996485*G0_0_1_3_9 + 0.00334311191454105*G0_0_1_4_0 + 0.0023747680890542*G0_0_1_4_1 - 0.00544640544640644*G0_0_1_4_2 - 0.00929356357927943*G0_0_1_4_3 + 0.00543456543456641*G0_0_1_4_4 - 0.0193102135959311*G0_0_1_4_5 + 0.0464069264069342*G0_0_1_4_6 - 0.00538889681746916*G0_0_1_4_7 - 0.00278578564292897*G0_0_1_4_8 + 0.0294562580276915*G0_0_1_4_9 + 0.00864320864321014*G0_0_1_5_0 + 0.00593861165289836*G0_0_1_5_1 + 0.00761312761312895*G0_0_1_5_2 - 0.00101993244850404*G0_0_1_5_3 - 0.0193102135959311*G0_0_1_5_4 + 0.186267066267098*G0_0_1_5_5 - 0.0987051044194068*G0_0_1_5_6 + 0.0464069264069342*G0_0_1_5_7 - 0.0270967128110031*G0_0_1_5_8 + 0.0450292564578355*G0_0_1_5_9 + 0.00761312761312891*G0_0_1_6_0 + 0.00593861165289839*G0_0_1_6_1 + 0.00864320864321003*G0_0_1_6_2 - 0.0270967128110031*G0_0_1_6_3 + 0.0464069264069342*G0_0_1_6_4 - 0.0987051044194068*G0_0_1_6_5 + 0.186267066267098*G0_0_1_6_6 - 0.0193102135959311*G0_0_1_6_7 - 0.00101993244850403*G0_0_1_6_8 + 0.0450292564578354*G0_0_1_6_9 - 0.00544640544640632*G0_0_1_7_0 + 0.0023747680890542*G0_0_1_7_1 + 0.00334311191454106*G0_0_1_7_2 - 0.00278578564292897*G0_0_1_7_3 - 0.00538889681746916*G0_0_1_7_4 + 0.0464069264069342*G0_0_1_7_5 - 0.0193102135959311*G0_0_1_7_6 + 0.00543456543456646*G0_0_1_7_7 - 0.00929356357927946*G0_0_1_7_8 + 0.0294562580276916*G0_0_1_7_9 + 0.00105376105376121*G0_0_1_8_0 - 0.00258027686599159*G0_0_1_8_1 - 0.00216503073645967*G0_0_1_8_2 + 0.00557157128585795*G0_0_1_8_3 - 0.00278578564292897*G0_0_1_8_4 - 0.0270967128110031*G0_0_1_8_5 - 0.00101993244850403*G0_0_1_8_6 - 0.00929356357927946*G0_0_1_8_7 + 0.00776366490652346*G0_0_1_8_8 - 0.0317853574996486*G0_0_1_8_9 + 0.00305472305472359*G0_0_1_9_0 + 0.0124523095951689*G0_0_1_9_1 + 0.00305472305472356*G0_0_1_9_2 - 0.0317853574996485*G0_0_1_9_3 + 0.0294562580276915*G0_0_1_9_4 + 0.0450292564578355*G0_0_1_9_5 + 0.0450292564578354*G0_0_1_9_6 + 0.0294562580276916*G0_0_1_9_7 - 0.0317853574996486*G0_0_1_9_8 + 0.113988868274602*G0_0_1_9_9 + 0.00449920449920519*G0_1_0_0_0 - 0.000269783126926035*G0_1_0_0_1 - 0.000959604769128738*G0_1_0_0_2 + 0.00216503073645967*G0_1_0_0_3 - 0.00334311191454105*G0_1_0_0_4 - 0.00864320864321013*G0_1_0_0_5 - 0.00761312761312892*G0_1_0_0_6 + 0.00544640544640632*G0_1_0_0_7 - 0.00105376105376121*G0_1_0_0_8 - 0.00305472305472359*G0_1_0_0_9 - 0.000269783126926035*G0_1_0_1_0 - 0.00129789082170057*G0_1_0_1_1 - 0.00026978312692602*G0_1_0_1_2 + 0.00258027686599158*G0_1_0_1_3 - 0.0023747680890542*G0_1_0_1_4 - 0.00593861165289836*G0_1_0_1_5 - 0.00593861165289839*G0_1_0_1_6 - 0.0023747680890542*G0_1_0_1_7 + 0.00258027686599158*G0_1_0_1_8 - 0.0124523095951688*G0_1_0_1_9 - 0.000959604769128738*G0_1_0_2_0 - 0.00026978312692602*G0_1_0_2_1 + 0.00449920449920554*G0_1_0_2_2 - 0.00105376105376127*G0_1_0_2_3 + 0.00544640544640643*G0_1_0_2_4 - 0.00761312761312895*G0_1_0_2_5 - 0.00864320864321003*G0_1_0_2_6 - 0.00334311191454106*G0_1_0_2_7 + 0.00216503073645967*G0_1_0_2_8 - 0.00305472305472356*G0_1_0_2_9 + 0.00216503073645967*G0_1_0_3_0 + 0.00258027686599158*G0_1_0_3_1 - 0.00105376105376127*G0_1_0_3_2 - 0.00776366490652338*G0_1_0_3_3 + 0.00929356357927943*G0_1_0_3_4 + 0.00101993244850404*G0_1_0_3_5 + 0.0270967128110031*G0_1_0_3_6 + 0.00278578564292897*G0_1_0_3_7 - 0.00557157128585795*G0_1_0_3_8 + 0.0317853574996485*G0_1_0_3_9 - 0.00334311191454105*G0_1_0_4_0 - 0.0023747680890542*G0_1_0_4_1 + 0.00544640544640645*G0_1_0_4_2 + 0.00929356357927944*G0_1_0_4_3 - 0.00543456543456639*G0_1_0_4_4 + 0.0193102135959311*G0_1_0_4_5 - 0.0464069264069342*G0_1_0_4_6 + 0.00538889681746916*G0_1_0_4_7 + 0.00278578564292897*G0_1_0_4_8 - 0.0294562580276915*G0_1_0_4_9 - 0.00864320864321013*G0_1_0_5_0 - 0.00593861165289836*G0_1_0_5_1 - 0.00761312761312895*G0_1_0_5_2 + 0.00101993244850404*G0_1_0_5_3 + 0.0193102135959311*G0_1_0_5_4 - 0.186267066267098*G0_1_0_5_5 + 0.0987051044194068*G0_1_0_5_6 - 0.0464069264069342*G0_1_0_5_7 + 0.0270967128110031*G0_1_0_5_8 - 0.0450292564578355*G0_1_0_5_9 - 0.00761312761312891*G0_1_0_6_0 - 0.00593861165289839*G0_1_0_6_1 - 0.00864320864321003*G0_1_0_6_2 + 0.0270967128110031*G0_1_0_6_3 - 0.0464069264069342*G0_1_0_6_4 + 0.0987051044194068*G0_1_0_6_5 - 0.186267066267098*G0_1_0_6_6 + 0.0193102135959311*G0_1_0_6_7 + 0.00101993244850403*G0_1_0_6_8 - 0.0450292564578354*G0_1_0_6_9 + 0.00544640544640632*G0_1_0_7_0 - 0.0023747680890542*G0_1_0_7_1 - 0.00334311191454106*G0_1_0_7_2 + 0.00278578564292897*G0_1_0_7_3 + 0.00538889681746916*G0_1_0_7_4 - 0.0464069264069342*G0_1_0_7_5 + 0.0193102135959311*G0_1_0_7_6 - 0.00543456543456646*G0_1_0_7_7 + 0.00929356357927946*G0_1_0_7_8 - 0.0294562580276916*G0_1_0_7_9 - 0.00105376105376121*G0_1_0_8_0 + 0.00258027686599158*G0_1_0_8_1 + 0.00216503073645967*G0_1_0_8_2 - 0.00557157128585795*G0_1_0_8_3 + 0.00278578564292897*G0_1_0_8_4 + 0.0270967128110031*G0_1_0_8_5 + 0.00101993244850403*G0_1_0_8_6 + 0.00929356357927946*G0_1_0_8_7 - 0.00776366490652346*G0_1_0_8_8 + 0.0317853574996486*G0_1_0_8_9 - 0.00305472305472359*G0_1_0_9_0 - 0.0124523095951689*G0_1_0_9_1 - 0.00305472305472356*G0_1_0_9_2 + 0.0317853574996485*G0_1_0_9_3 - 0.0294562580276915*G0_1_0_9_4 - 0.0450292564578355*G0_1_0_9_5 - 0.0450292564578354*G0_1_0_9_6 - 0.0294562580276916*G0_1_0_9_7 + 0.0317853574996486*G0_1_0_9_8 - 0.113988868274602*G0_1_0_9_9; + A[95] = -A[98] - 0.00955094288427775*G0_0_1_0_0 + 0.00207101540434909*G0_0_1_0_2 - 0.0025121967979115*G0_0_1_0_3 + 0.00195317909603655*G0_0_1_0_4 + 0.00635216635216747*G0_0_1_0_5 + 0.00740635026349438*G0_0_1_0_6 - 0.00976208976209134*G0_0_1_0_7 + 0.0026585055156488*G0_0_1_0_8 + 0.00155019583591041*G0_0_1_0_9 + 0.000956221908603065*G0_0_1_1_1 + 0.00330632330632386*G0_0_1_1_2 - 0.000756915042629431*G0_0_1_1_3 + 0.00399642685357037*G0_0_1_1_4 + 0.00625617768475015*G0_0_1_1_5 + 0.0054696626125207*G0_0_1_1_6 + 0.00198869913155659*G0_0_1_1_7 - 0.00234855091997983*G0_0_1_1_8 + 0.0159814788386244*G0_0_1_1_9 + 0.0020710154043491*G0_0_1_2_0 + 0.00330632330632386*G0_0_1_2_1 + 0.0840048840048979*G0_0_1_2_2 - 0.0114907314907334*G0_0_1_2_3 + 0.02575202575203*G0_0_1_2_4 + 0.00200688200688241*G0_0_1_2_5 + 0.0179376179376209*G0_0_1_2_6 + 0.0035845635845642*G0_0_1_2_7 - 0.00248936248936289*G0_0_1_2_8 + 0.00255744255744298*G0_0_1_2_9 - 0.0025121967979115*G0_0_1_3_0 - 0.00075691504262943*G0_0_1_3_1 - 0.0114907314907334*G0_0_1_3_2 + 0.0158698444412759*G0_0_1_3_3 - 0.0242157842157883*G0_0_1_3_4 - 0.000593692022263525*G0_0_1_3_5 - 0.0264535464535509*G0_0_1_3_6 - 0.00250796822225438*G0_0_1_3_7 + 0.00508443937015458*G0_0_1_3_8 - 0.0429285000713644*G0_0_1_3_9 + 0.00195317909603655*G0_0_1_4_0 + 0.00399642685357037*G0_0_1_4_1 + 0.02575202575203*G0_0_1_4_2 - 0.0242157842157883*G0_0_1_4_3 - 0.0799200799200935*G0_0_1_4_4 - 0.0159040959040986*G0_0_1_4_5 + 0.0423576423576495*G0_0_1_4_6 - 0.00328433471290669*G0_0_1_4_7 - 0.00257647114790018*G0_0_1_4_8 + 0.0241358641358682*G0_0_1_4_9 + 0.00635216635216747*G0_0_1_5_0 + 0.00625617768475015*G0_0_1_5_1 + 0.00200688200688241*G0_0_1_5_2 - 0.000593692022263526*G0_0_1_5_3 - 0.0159040959040986*G0_0_1_5_4 + 0.188497217068677*G0_0_1_5_5 - 0.092307692307708*G0_0_1_5_6 + 0.0496113410399208*G0_0_1_5_7 - 0.0288130916702394*G0_0_1_5_8 + 0.0529755958327476*G0_0_1_5_9 + 0.00740635026349438*G0_0_1_6_0 + 0.0054696626125207*G0_0_1_6_1 + 0.0179376179376209*G0_0_1_6_2 - 0.0264535464535509*G0_0_1_6_3 + 0.0423576423576495*G0_0_1_6_4 - 0.092307692307708*G0_0_1_6_5 + 0.140659340659364*G0_0_1_6_6 - 0.0207982493696814*G0_0_1_6_7 + 0.000551829123257784*G0_0_1_6_8 + 0.0452347652347729*G0_0_1_6_9 - 0.00976208976209134*G0_0_1_7_0 + 0.00198869913155659*G0_0_1_7_1 + 0.0035845635845642*G0_0_1_7_2 - 0.00250796822225438*G0_0_1_7_3 - 0.00328433471290669*G0_0_1_7_4 + 0.0496113410399208*G0_0_1_7_5 - 0.0207982493696814*G0_0_1_7_6 - 0.00352409495266671*G0_0_1_7_7 - 0.00746301317730025*G0_0_1_7_8 + 0.0369459112316317*G0_0_1_7_9 + 0.0026585055156488*G0_0_1_8_0 - 0.00234855091997983*G0_0_1_8_1 - 0.00248936248936289*G0_0_1_8_2 + 0.00508443937015458*G0_0_1_8_3 - 0.00257647114790018*G0_0_1_8_4 - 0.0288130916702394*G0_0_1_8_5 + 0.000551829123257784*G0_0_1_8_6 - 0.00746301317730025*G0_0_1_8_7 + 0.00661433804291098*G0_0_1_8_8 - 0.0427914942200728*G0_0_1_8_9 + 0.00155019583591041*G0_0_1_9_0 + 0.0159814788386244*G0_0_1_9_1 + 0.00255744255744298*G0_0_1_9_2 - 0.0429285000713644*G0_0_1_9_3 + 0.0241358641358682*G0_0_1_9_4 + 0.0529755958327476*G0_0_1_9_5 + 0.0452347652347729*G0_0_1_9_6 + 0.0369459112316317*G0_0_1_9_7 - 0.0427914942200728*G0_0_1_9_8 + 0.142760097045836*G0_0_1_9_9 + 0.116249182915869*G0_1_1_0_0 + 0.00794098317907978*G0_1_1_0_1 + 0.00513095370238314*G0_1_1_0_2 - 0.00389367246510175*G0_1_1_0_3 + 0.00246441389298575*G0_1_1_0_4 + 0.0271077071077117*G0_1_1_0_5 - 0.00510262224548019*G0_1_1_0_6 + 0.0763976763976893*G0_1_1_0_7 - 0.0332463303891931*G0_1_1_0_8 + 0.00822796251367828*G0_1_1_0_9 + 0.00794098317907978*G0_1_1_1_0 + 0.00340879578974881*G0_1_1_1_1 + 0.00343332152856021*G0_1_1_1_2 - 0.000469371897943396*G0_1_1_1_3 + 0.00438165009593655*G0_1_1_1_4 + 0.00386491815063307*G0_1_1_1_5 + 0.00549376549376644*G0_1_1_1_6 + 0.0120945720945741*G0_1_1_1_7 - 0.0037778094920958*G0_1_1_1_8 + 0.0147306661592401*G0_1_1_1_9 + 0.00513095370238314*G0_1_1_2_0 + 0.00343332152856021*G0_1_1_2_1 + 0.0811632811632949*G0_1_1_2_2 - 0.0116120916120936*G0_1_1_2_3 + 0.0251600251600294*G0_1_1_2_4 - 0.00158360158360185*G0_1_1_2_5 + 0.0184408184408216*G0_1_1_2_6 + 0.007221561507277*G0_1_1_2_7 - 0.0032847575704724*G0_1_1_2_8 + 0.0011188811188813*G0_1_1_2_9 - 0.00389367246510175*G0_1_1_3_0 - 0.000469371897943396*G0_1_1_3_1 - 0.0116120916120935*G0_1_1_3_2 + 0.0112268683697275*G0_1_1_3_3 - 0.0252395223823838*G0_1_1_3_4 + 0.00606250891965281*G0_1_1_3_5 - 0.028520051377199*G0_1_1_3_6 - 0.000357737500594774*G0_1_1_3_7 + 0.0025422196850773*G0_1_1_3_8 - 0.0434765234765308*G0_1_1_3_9 + 0.00246441389298575*G0_1_1_4_0 + 0.00438165009593654*G0_1_1_4_1 + 0.0251600251600294*G0_1_1_4_2 - 0.0252395223823838*G0_1_1_4_3 - 0.0628704628704734*G0_1_1_4_4 - 0.019431996574857*G0_1_1_4_5 + 0.0479520479520561*G0_1_1_4_6 - 0.00850958565244421*G0_1_1_4_7 - 0.00218448218448257*G0_1_1_4_8 + 0.0355073497930701*G0_1_1_4_9 + 0.0271077071077117*G0_1_1_5_0 + 0.00386491815063307*G0_1_1_5_1 - 0.00158360158360185*G0_1_1_5_2 + 0.0060625089196528*G0_1_1_5_3 - 0.019431996574857*G0_1_1_5_4 + 0.102236810808256*G0_1_1_5_5 - 0.0743408971980526*G0_1_1_5_6 + 0.0573369487655298*G0_1_1_5_7 - 0.023633509347799*G0_1_1_5_8 + 0.0225831311545635*G0_1_1_5_9 - 0.0051026222454802*G0_1_1_6_0 + 0.00549376549376644*G0_1_1_6_1 + 0.0184408184408216*G0_1_1_6_2 - 0.028520051377199*G0_1_1_6_3 + 0.0479520479520561*G0_1_1_6_4 - 0.0743408971980526*G0_1_1_6_5 + 0.131601731601754*G0_1_1_6_6 - 0.0337034394177308*G0_1_1_6_7 + 0.00270586556300887*G0_1_1_6_8 + 0.0536834593977542*G0_1_1_6_9 + 0.0763976763976893*G0_1_1_7_0 + 0.0120945720945741*G0_1_1_7_1 + 0.007221561507277*G0_1_1_7_2 - 0.000357737500594774*G0_1_1_7_3 - 0.00850958565244421*G0_1_1_7_4 + 0.0573369487655298*G0_1_1_7_5 - 0.0337034394177308*G0_1_1_7_6 + 0.198354026925489*G0_1_1_7_7 - 0.0634184862756399*G0_1_1_7_8 + 0.0427229912944271*G0_1_1_7_9 - 0.0332463303891931*G0_1_1_8_0 - 0.0037778094920958*G0_1_1_8_1 - 0.0032847575704724*G0_1_1_8_2 + 0.0025422196850773*G0_1_1_8_3 - 0.00218448218448257*G0_1_1_8_4 - 0.023633509347799*G0_1_1_8_5 + 0.00270586556300887*G0_1_1_8_6 - 0.0634184862756399*G0_1_1_8_7 + 0.0232833832833874*G0_1_1_8_8 - 0.0398230341087551*G0_1_1_8_9 + 0.00822796251367828*G0_1_1_9_0 + 0.0147306661592401*G0_1_1_9_1 + 0.00111888111888131*G0_1_1_9_2 - 0.0434765234765308*G0_1_1_9_3 + 0.0355073497930701*G0_1_1_9_4 + 0.0225831311545635*G0_1_1_9_5 + 0.0536834593977542*G0_1_1_9_6 + 0.0427229912944271*G0_1_1_9_7 - 0.0398230341087551*G0_1_1_9_8 + 0.138375909804505*G0_1_1_9_9; + A[173] = -A[170] + 0.0223759309473634*G0_0_1_0_0 - 0.00349900540376795*G0_0_1_0_1 - 0.000180419228038306*G0_0_1_0_2 + 0.000402560402560463*G0_0_1_0_3 - 0.000383954669669022*G0_0_1_0_4 - 0.00268260839689454*G0_0_1_0_5 - 0.00178319035461924*G0_0_1_0_6 - 0.00427424427424492*G0_0_1_0_7 - 0.00379091807663304*G0_0_1_0_8 - 0.00931386074243373*G0_0_1_0_9 - 0.00349900540376795*G0_0_1_1_0 - 0.093555826889177*G0_0_1_1_1 - 0.00156598251836376*G0_0_1_1_2 - 0.0109934509934531*G0_0_1_1_3 + 0.00540538826253213*G0_0_1_1_4 + 0.00119922405636717*G0_0_1_1_5 - 0.00110704110704132*G0_0_1_1_6 + 0.0124738753310205*G0_0_1_1_7 - 0.0361061161061226*G0_0_1_1_8 + 0.000662194947909297*G0_0_1_1_9 - 0.000180419228038306*G0_0_1_2_0 - 0.00156598251836375*G0_0_1_2_1 + 0.000592000592000684*G0_0_1_2_4 - 0.00167536167536196*G0_0_1_2_5 - 0.000592000592000688*G0_0_1_2_6 + 0.00122205836491572*G0_0_1_2_7 + 0.000524343381486314*G0_0_1_2_8 + 0.00166944166944196*G0_0_1_2_9 + 0.000402560402560463*G0_0_1_3_0 - 0.0109934509934531*G0_0_1_3_1 + 0.0366490652205001*G0_0_1_3_3 + 0.00283145426002621*G0_0_1_3_4 - 0.004148232719662*G0_0_1_3_5 + 0.00681223538366515*G0_0_1_3_6 + 0.00228343085485984*G0_0_1_3_7 - 0.00420151277294215*G0_0_1_3_8 - 0.00655344655344758*G0_0_1_3_9 - 0.000383954669669022*G0_0_1_4_0 + 0.00540538826253213*G0_0_1_4_1 + 0.000592000592000684*G0_0_1_4_2 + 0.00283145426002621*G0_0_1_4_3 - 0.0111888111888131*G0_0_1_4_4 + 0.00464297607154829*G0_0_1_4_5 - 0.0114552114552134*G0_0_1_4_6 - 0.00300271157414067*G0_0_1_4_7 + 0.0019180819180823*G0_0_1_4_8 - 0.0142942771514225*G0_0_1_4_9 - 0.00268260839689454*G0_0_1_5_0 + 0.00119922405636717*G0_0_1_5_1 - 0.00167536167536196*G0_0_1_5_2 - 0.004148232719662*G0_0_1_5_3 + 0.00464297607154829*G0_0_1_5_4 - 0.0304533561676469*G0_0_1_5_5 + 0.018640407211839*G0_0_1_5_6 + 0.00028162313876607*G0_0_1_5_7 - 0.000106560106560139*G0_0_1_5_8 + 0.0281547024404215*G0_0_1_5_9 - 0.00178319035461924*G0_0_1_6_0 - 0.00110704110704132*G0_0_1_6_1 - 0.000592000592000688*G0_0_1_6_2 + 0.00681223538366515*G0_0_1_6_3 - 0.0114552114552134*G0_0_1_6_4 + 0.018640407211839*G0_0_1_6_5 + 0.0340992340992398*G0_0_1_6_6 - 0.000175063032205915*G0_0_1_6_7 - 0.00087150944293812*G0_0_1_6_8 - 0.0186327957756562*G0_0_1_6_9 - 0.00427424427424491*G0_0_1_7_0 + 0.0124738753310205*G0_0_1_7_1 + 0.00122205836491572*G0_0_1_7_2 + 0.00228343085485984*G0_0_1_7_3 - 0.00300271157414067*G0_0_1_7_4 + 0.000281623138766071*G0_0_1_7_5 - 0.000175063032205916*G0_0_1_7_6 - 0.0397088625660121*G0_0_1_7_7 + 0.0353931782503271*G0_0_1_7_8 + 0.028291708291713*G0_0_1_7_9 - 0.00379091807663304*G0_0_1_8_0 - 0.0361061161061226*G0_0_1_8_1 + 0.000524343381486314*G0_0_1_8_2 - 0.00420151277294215*G0_0_1_8_3 + 0.0019180819180823*G0_0_1_8_4 - 0.00010656010656014*G0_0_1_8_5 - 0.00087150944293812*G0_0_1_8_6 + 0.0353931782503271*G0_0_1_8_7 + 0.110495219066666*G0_0_1_8_8 - 0.00582274867989247*G0_0_1_8_9 - 0.00931386074243373*G0_0_1_9_0 + 0.000662194947909297*G0_0_1_9_1 + 0.00166944166944196*G0_0_1_9_2 - 0.00655344655344758*G0_0_1_9_3 - 0.0142942771514225*G0_0_1_9_4 + 0.0281547024404215*G0_0_1_9_5 - 0.0186327957756562*G0_0_1_9_6 + 0.028291708291713*G0_0_1_9_7 - 0.00582274867989247*G0_0_1_9_8 - 0.0411017553874767*G0_0_1_9_9 - 0.0024525738811458*G0_1_1_0_0 - 0.00795324604848557*G0_1_1_0_1 - 0.000126998222236343*G0_1_1_0_2 + 0.00239125953411707*G0_1_1_0_3 - 0.000287543144686057*G0_1_1_0_5 - 0.00038522324236616*G0_1_1_0_6 + 0.00142925857211596*G0_1_1_0_7 - 0.0101058729630176*G0_1_1_0_8 + 0.00125081267938431*G0_1_1_0_9 - 0.00795324604848557*G0_1_1_1_0 - 0.125800125800148*G0_1_1_1_1 - 0.00305993829803407*G0_1_1_1_2 - 0.0207555407555445*G0_1_1_1_3 + 0.0125089725089747*G0_1_1_1_4 + 0.00138147566719024*G0_1_1_1_5 - 0.000511234796949189*G0_1_1_1_6 + 0.0359048359048422*G0_1_1_1_7 - 0.0861597661597812*G0_1_1_1_8 - 0.00667776667776785*G0_1_1_1_9 - 0.000126998222236343*G0_1_1_2_0 - 0.00305993829803407*G0_1_1_2_1 + 0.00284160284160331*G0_1_1_2_2 + 0.00359048359048419*G0_1_1_2_3 - 0.000503200503200588*G0_1_1_2_4 + 0.000121360121360146*G0_1_1_2_5 + 0.000592000592000682*G0_1_1_2_6 + 0.000795395081109506*G0_1_1_2_7 - 0.00363699792271283*G0_1_1_2_8 + 0.00143856143856166*G0_1_1_2_9 + 0.00239125953411707*G0_1_1_3_0 - 0.0207555407555445*G0_1_1_3_1 + 0.00359048359048419*G0_1_1_3_2 + 0.086260406260421*G0_1_1_3_3 - 0.0179667951096553*G0_1_1_3_4 - 0.00665620094191631*G0_1_1_3_5 + 0.00352790067075838*G0_1_1_3_6 - 0.00517958232244026*G0_1_1_3_7 - 0.00772560772560919*G0_1_1_3_8 + 0.030392464678184*G0_1_1_3_9 + 0.0125089725089747*G0_1_1_4_1 - 0.000503200503200588*G0_1_1_4_2 - 0.0179667951096553*G0_1_1_4_3 + 0.00905760905761058*G0_1_1_4_4 + 0.0020665049236481*G0_1_1_4_5 - 0.0055944055944065*G0_1_1_4_6 - 0.00215403643975114*G0_1_1_4_7 + 0.0129051900480495*G0_1_1_4_8 - 0.0084486941629812*G0_1_1_4_9 - 0.000287543144686057*G0_1_1_5_0 + 0.00138147566719024*G0_1_1_5_1 + 0.000121360121360147*G0_1_1_5_2 - 0.00665620094191631*G0_1_1_5_3 + 0.0020665049236481*G0_1_1_5_4 + 0.00464297607154827*G0_1_1_5_5 + 0.00102373816659548*G0_1_1_5_6 + 0.0025422196850772*G0_1_1_5_7 - 0.00215023072165957*G0_1_1_5_8 + 0.000548023405166315*G0_1_1_5_9 - 0.00038522324236616*G0_1_1_6_0 - 0.000511234796949189*G0_1_1_6_1 + 0.000592000592000682*G0_1_1_6_2 + 0.00352790067075838*G0_1_1_6_3 - 0.0055944055944065*G0_1_1_6_4 + 0.00102373816659548*G0_1_1_6_5 - 0.0170496170496198*G0_1_1_6_6 - 0.000391988963417583*G0_1_1_6_7 + 0.00522525093953748*G0_1_1_6_8 - 0.0113714856572018*G0_1_1_6_9 + 0.00142925857211596*G0_1_1_7_0 + 0.0359048359048422*G0_1_1_7_1 + 0.000795395081109506*G0_1_1_7_2 - 0.00517958232244026*G0_1_1_7_3 - 0.00215403643975113*G0_1_1_7_4 + 0.0025422196850772*G0_1_1_7_5 - 0.000391988963417583*G0_1_1_7_6 - 0.0166690452404768*G0_1_1_7_7 + 0.05595547309834*G0_1_1_7_8 - 0.00296846011131775*G0_1_1_7_9 - 0.0101058729630176*G0_1_1_8_0 - 0.0861597661597812*G0_1_1_8_1 - 0.00363699792271283*G0_1_1_8_2 - 0.00772560772560919*G0_1_1_8_3 + 0.0129051900480495*G0_1_1_8_4 - 0.00215023072165957*G0_1_1_8_5 + 0.00522525093953748*G0_1_1_8_6 + 0.05595547309834*G0_1_1_8_7 - 0.201878121878157*G0_1_1_8_8 - 0.00577708006279546*G0_1_1_8_9 + 0.00125081267938431*G0_1_1_9_0 - 0.00667776667776785*G0_1_1_9_1 + 0.00143856143856166*G0_1_1_9_2 + 0.030392464678184*G0_1_1_9_3 - 0.0084486941629812*G0_1_1_9_4 + 0.000548023405166315*G0_1_1_9_5 - 0.0113714856572018*G0_1_1_9_6 - 0.00296846011131775*G0_1_1_9_7 - 0.00577708006279546*G0_1_1_9_8 + 0.00438418724133077*G0_1_1_9_9; + A[118] = A[202] - 0.00888000888001035*G0_0_1_0_0 + 0.000571914857629218*G0_0_1_0_1 - 0.00332239189382105*G0_0_1_0_3 + 0.00150135578707033*G0_0_1_0_4 + 0.0113220113220133*G0_0_1_0_5 - 0.00692260120831673*G0_0_1_0_6 - 0.00189144189144224*G0_0_1_0_7 - 0.000955235240949716*G0_0_1_0_8 + 0.0163493649207963*G0_0_1_0_9 + 0.000571914857629218*G0_0_1_1_0 - 0.000571914857629257*G0_0_1_1_2 + 0.0042700156985879*G0_0_1_1_4 + 0.00252319109462009*G0_0_1_1_5 - 0.0025231910946201*G0_0_1_1_6 - 0.00427001569858778*G0_0_1_1_7 - 0.000571914857629257*G0_0_1_2_1 + 0.0088800088800103*G0_0_1_2_2 + 0.000955235240949688*G0_0_1_2_3 + 0.00189144189144219*G0_0_1_2_4 + 0.00692260120831674*G0_0_1_2_5 - 0.0113220113220134*G0_0_1_2_6 - 0.00150135578707031*G0_0_1_2_7 + 0.003322391893821*G0_0_1_2_8 - 0.0163493649207963*G0_0_1_2_9 - 0.00332239189382105*G0_0_1_3_0 + 0.000955235240949688*G0_0_1_3_2 - 0.0245925503068407*G0_0_1_3_3 - 0.0159098044812357*G0_0_1_3_4 + 0.00119880119880146*G0_0_1_3_5 + 0.00756957328386022*G0_0_1_3_6 + 0.00996717568146317*G0_0_1_3_7 - 0.0199343513629262*G0_0_1_3_9 + 0.00150135578707033*G0_0_1_4_0 + 0.0042700156985879*G0_0_1_4_1 + 0.00189144189144219*G0_0_1_4_2 - 0.0159098044812357*G0_0_1_4_3 - 0.00352790067075854*G0_0_1_4_4 - 0.004504067361211*G0_0_1_4_5 - 0.00306550592264929*G0_0_1_4_6 - 0.009967175681463*G0_0_1_4_8 + 0.0580562294848107*G0_0_1_4_9 + 0.0113220113220133*G0_0_1_5_0 + 0.0025231910946201*G0_0_1_5_1 + 0.00692260120831674*G0_0_1_5_2 + 0.00119880119880146*G0_0_1_5_3 - 0.004504067361211*G0_0_1_5_4 + 0.265106322249224*G0_0_1_5_5 + 0.0030655059226493*G0_0_1_5_7 - 0.00756957328386028*G0_0_1_5_8 - 0.0339089481946681*G0_0_1_5_9 - 0.00692260120831673*G0_0_1_6_0 - 0.0025231910946201*G0_0_1_6_1 - 0.0113220113220134*G0_0_1_6_2 + 0.00756957328386022*G0_0_1_6_3 - 0.00306550592264929*G0_0_1_6_4 - 0.265106322249224*G0_0_1_6_6 + 0.00450406736121093*G0_0_1_6_7 - 0.00119880119880143*G0_0_1_6_8 + 0.0339089481946683*G0_0_1_6_9 - 0.00189144189144224*G0_0_1_7_0 - 0.00427001569858778*G0_0_1_7_1 - 0.00150135578707031*G0_0_1_7_2 + 0.00996717568146317*G0_0_1_7_3 + 0.0030655059226493*G0_0_1_7_5 + 0.00450406736121093*G0_0_1_7_6 + 0.00352790067075812*G0_0_1_7_7 + 0.015909804481236*G0_0_1_7_8 - 0.0580562294848107*G0_0_1_7_9 - 0.000955235240949717*G0_0_1_8_0 + 0.003322391893821*G0_0_1_8_2 - 0.009967175681463*G0_0_1_8_4 - 0.00756957328386028*G0_0_1_8_5 - 0.00119880119880143*G0_0_1_8_6 + 0.015909804481236*G0_0_1_8_7 + 0.0245925503068394*G0_0_1_8_8 + 0.0199343513629261*G0_0_1_8_9 + 0.0163493649207963*G0_0_1_9_0 - 0.0163493649207963*G0_0_1_9_2 - 0.0199343513629262*G0_0_1_9_3 + 0.0580562294848107*G0_0_1_9_4 - 0.0339089481946681*G0_0_1_9_5 + 0.0339089481946683*G0_0_1_9_6 - 0.0580562294848107*G0_0_1_9_7 + 0.0199343513629261*G0_0_1_9_8 + 0.00888000888001035*G0_1_0_0_0 - 0.000571914857629218*G0_1_0_0_1 + 0.00332239189382105*G0_1_0_0_3 - 0.00150135578707033*G0_1_0_0_4 - 0.0113220113220133*G0_1_0_0_5 + 0.00692260120831674*G0_1_0_0_6 + 0.00189144189144224*G0_1_0_0_7 + 0.000955235240949716*G0_1_0_0_8 - 0.0163493649207963*G0_1_0_0_9 - 0.000571914857629218*G0_1_0_1_0 + 0.000571914857629257*G0_1_0_1_2 - 0.0042700156985879*G0_1_0_1_4 - 0.00252319109462009*G0_1_0_1_5 + 0.0025231910946201*G0_1_0_1_6 + 0.00427001569858778*G0_1_0_1_7 + 0.000571914857629257*G0_1_0_2_1 - 0.00888000888001029*G0_1_0_2_2 - 0.000955235240949689*G0_1_0_2_3 - 0.00189144189144219*G0_1_0_2_4 - 0.00692260120831674*G0_1_0_2_5 + 0.0113220113220134*G0_1_0_2_6 + 0.00150135578707031*G0_1_0_2_7 - 0.003322391893821*G0_1_0_2_8 + 0.0163493649207963*G0_1_0_2_9 + 0.00332239189382105*G0_1_0_3_0 - 0.000955235240949689*G0_1_0_3_2 + 0.0245925503068407*G0_1_0_3_3 + 0.0159098044812357*G0_1_0_3_4 - 0.00119880119880146*G0_1_0_3_5 - 0.00756957328386022*G0_1_0_3_6 - 0.00996717568146317*G0_1_0_3_7 + 0.0199343513629262*G0_1_0_3_9 - 0.00150135578707033*G0_1_0_4_0 - 0.0042700156985879*G0_1_0_4_1 - 0.00189144189144219*G0_1_0_4_2 + 0.0159098044812357*G0_1_0_4_3 + 0.00352790067075854*G0_1_0_4_4 + 0.004504067361211*G0_1_0_4_5 + 0.00306550592264929*G0_1_0_4_6 + 0.009967175681463*G0_1_0_4_8 - 0.0580562294848107*G0_1_0_4_9 - 0.0113220113220133*G0_1_0_5_0 - 0.0025231910946201*G0_1_0_5_1 - 0.00692260120831674*G0_1_0_5_2 - 0.00119880119880146*G0_1_0_5_3 + 0.004504067361211*G0_1_0_5_4 - 0.265106322249224*G0_1_0_5_5 - 0.0030655059226493*G0_1_0_5_7 + 0.00756957328386028*G0_1_0_5_8 + 0.0339089481946681*G0_1_0_5_9 + 0.00692260120831674*G0_1_0_6_0 + 0.0025231910946201*G0_1_0_6_1 + 0.0113220113220134*G0_1_0_6_2 - 0.00756957328386022*G0_1_0_6_3 + 0.00306550592264929*G0_1_0_6_4 + 0.265106322249224*G0_1_0_6_6 - 0.00450406736121093*G0_1_0_6_7 + 0.00119880119880142*G0_1_0_6_8 - 0.0339089481946683*G0_1_0_6_9 + 0.00189144189144225*G0_1_0_7_0 + 0.00427001569858778*G0_1_0_7_1 + 0.00150135578707031*G0_1_0_7_2 - 0.00996717568146317*G0_1_0_7_3 - 0.00306550592264929*G0_1_0_7_5 - 0.00450406736121093*G0_1_0_7_6 - 0.00352790067075813*G0_1_0_7_7 - 0.015909804481236*G0_1_0_7_8 + 0.0580562294848107*G0_1_0_7_9 + 0.000955235240949716*G0_1_0_8_0 - 0.003322391893821*G0_1_0_8_2 + 0.009967175681463*G0_1_0_8_4 + 0.00756957328386028*G0_1_0_8_5 + 0.00119880119880143*G0_1_0_8_6 - 0.015909804481236*G0_1_0_8_7 - 0.0245925503068394*G0_1_0_8_8 - 0.0199343513629261*G0_1_0_8_9 - 0.0163493649207963*G0_1_0_9_0 + 0.0163493649207963*G0_1_0_9_2 + 0.0199343513629262*G0_1_0_9_3 - 0.0580562294848107*G0_1_0_9_4 + 0.0339089481946681*G0_1_0_9_5 - 0.0339089481946683*G0_1_0_9_6 + 0.0580562294848107*G0_1_0_9_7 - 0.0199343513629261*G0_1_0_9_8; + A[217] = A[119] + 0.0145632145632174*G0_0_1_0_0 - 0.000544006258292049*G0_0_1_0_1 + 0.000473600473600527*G0_0_1_0_2 + 0.00419009561866775*G0_0_1_0_3 + 0.00285999714571192*G0_0_1_0_4 - 0.00375624375624423*G0_0_1_0_5 - 0.0235992578849763*G0_0_1_0_6 + 0.00839160839161008*G0_0_1_0_7 - 0.00122163550735013*G0_0_1_0_8 - 0.00666761809619059*G0_0_1_0_9 - 0.000544006258292048*G0_0_1_1_0 + 0.000779749351177997*G0_0_1_1_1 + 0.00208236208236241*G0_0_1_1_2 - 0.00152419009561893*G0_0_1_1_3 + 0.00205508776937382*G0_0_1_1_4 + 0.0100585129156575*G0_0_1_1_5 - 0.0176395033537921*G0_0_1_1_6 + 0.00327291755863247*G0_0_1_1_7 - 0.0020760192188768*G0_0_1_1_8 + 0.00461253032681678*G0_0_1_1_9 + 0.000473600473600526*G0_0_1_2_0 + 0.00208236208236241*G0_0_1_2_1 + 0.0379472379472437*G0_0_1_2_2 - 0.0114285714285732*G0_0_1_2_3 + 0.026773226773231*G0_0_1_2_4 - 0.00237096237096258*G0_0_1_2_5 - 0.018514818514822*G0_0_1_2_6 + 0.00151848151848175*G0_0_1_2_8 - 0.0115084915084935*G0_0_1_2_9 + 0.00419009561866775*G0_0_1_3_0 - 0.00152419009561893*G0_0_1_3_1 - 0.0114285714285732*G0_0_1_3_2 + 0.00952190666476531*G0_0_1_3_3 - 0.0135464535464556*G0_0_1_3_4 - 0.0247638076209546*G0_0_1_3_5 + 0.0597002997003098*G0_0_1_3_6 - 0.00578849721706961*G0_0_1_3_7 + 0.00356215213358124*G0_0_1_3_8 - 0.00226059654631116*G0_0_1_3_9 + 0.00285999714571192*G0_0_1_4_0 + 0.00205508776937382*G0_0_1_4_1 + 0.026773226773231*G0_0_1_4_2 - 0.0135464535464556*G0_0_1_4_3 + 0.107652347652366*G0_0_1_4_4 - 0.00179820179820211*G0_0_1_4_5 - 0.0579020979021078*G0_0_1_4_6 - 0.00774083059797482*G0_0_1_4_7 + 0.00222634508348836*G0_0_1_4_8 + 0.0381218781218846*G0_0_1_4_9 - 0.00375624375624423*G0_0_1_5_0 + 0.0100585129156575*G0_0_1_5_1 - 0.00237096237096258*G0_0_1_5_2 - 0.0247638076209546*G0_0_1_5_3 - 0.0017982017982021*G0_0_1_5_4 + 0.0723390894819587*G0_0_1_5_5 + 0.129470529470551*G0_0_1_5_6 + 0.0167318395889854*G0_0_1_5_7 - 0.0233937491080388*G0_0_1_5_8 + 0.0667903525046493*G0_0_1_5_9 - 0.0235992578849763*G0_0_1_6_0 - 0.0176395033537921*G0_0_1_6_1 - 0.018514818514822*G0_0_1_6_2 + 0.0597002997003098*G0_0_1_6_3 - 0.0579020979021078*G0_0_1_6_4 + 0.129470529470551*G0_0_1_6_5 - 0.670369630369745*G0_0_1_6_6 + 0.00666190951905334*G0_0_1_6_7 + 0.0207906379334986*G0_0_1_6_8 - 0.084875124875139*G0_0_1_6_9 + 0.00839160839161008*G0_0_1_7_0 + 0.00327291755863247*G0_0_1_7_1 - 0.00578849721706961*G0_0_1_7_3 - 0.00774083059797482*G0_0_1_7_4 + 0.0167318395889854*G0_0_1_7_5 + 0.00666190951905334*G0_0_1_7_6 + 0.0490823462252124*G0_0_1_7_7 - 0.011183102611676*G0_0_1_7_8 + 0.00667903525046501*G0_0_1_7_9 - 0.00122163550735013*G0_0_1_8_0 - 0.0020760192188768*G0_0_1_8_1 + 0.00151848151848175*G0_0_1_8_2 + 0.00356215213358124*G0_0_1_8_3 + 0.00222634508348836*G0_0_1_8_4 - 0.0233937491080388*G0_0_1_8_5 + 0.0207906379334986*G0_0_1_8_6 - 0.011183102611676*G0_0_1_8_7 + 0.0173312401883857*G0_0_1_8_8 - 0.0182902811474271*G0_0_1_8_9 - 0.00666761809619059*G0_0_1_9_0 + 0.00461253032681679*G0_0_1_9_1 - 0.0115084915084935*G0_0_1_9_2 - 0.00226059654631116*G0_0_1_9_3 + 0.0381218781218846*G0_0_1_9_4 + 0.0667903525046493*G0_0_1_9_5 - 0.0848751248751391*G0_0_1_9_6 + 0.00667903525046501*G0_0_1_9_7 - 0.0182902811474271*G0_0_1_9_8 + 0.231813900385368*G0_0_1_9_9 - 0.0145632145632174*G0_1_0_0_0 + 0.000544006258292048*G0_1_0_0_1 - 0.000473600473600527*G0_1_0_0_2 - 0.00419009561866775*G0_1_0_0_3 - 0.00285999714571192*G0_1_0_0_4 + 0.00375624375624423*G0_1_0_0_5 + 0.0235992578849763*G0_1_0_0_6 - 0.00839160839161008*G0_1_0_0_7 + 0.00122163550735013*G0_1_0_0_8 + 0.00666761809619059*G0_1_0_0_9 + 0.000544006258292048*G0_1_0_1_0 - 0.000779749351177997*G0_1_0_1_1 - 0.00208236208236241*G0_1_0_1_2 + 0.00152419009561893*G0_1_0_1_3 - 0.00205508776937381*G0_1_0_1_4 - 0.0100585129156575*G0_1_0_1_5 + 0.0176395033537921*G0_1_0_1_6 - 0.00327291755863247*G0_1_0_1_7 + 0.0020760192188768*G0_1_0_1_8 - 0.00461253032681679*G0_1_0_1_9 - 0.000473600473600526*G0_1_0_2_0 - 0.00208236208236241*G0_1_0_2_1 - 0.0379472379472437*G0_1_0_2_2 + 0.0114285714285732*G0_1_0_2_3 - 0.026773226773231*G0_1_0_2_4 + 0.00237096237096258*G0_1_0_2_5 + 0.018514818514822*G0_1_0_2_6 - 0.00151848151848175*G0_1_0_2_8 + 0.0115084915084935*G0_1_0_2_9 - 0.00419009561866775*G0_1_0_3_0 + 0.00152419009561893*G0_1_0_3_1 + 0.0114285714285732*G0_1_0_3_2 - 0.00952190666476532*G0_1_0_3_3 + 0.0135464535464556*G0_1_0_3_4 + 0.0247638076209546*G0_1_0_3_5 - 0.0597002997003098*G0_1_0_3_6 + 0.00578849721706961*G0_1_0_3_7 - 0.00356215213358125*G0_1_0_3_8 + 0.00226059654631116*G0_1_0_3_9 - 0.00285999714571192*G0_1_0_4_0 - 0.00205508776937381*G0_1_0_4_1 - 0.026773226773231*G0_1_0_4_2 + 0.0135464535464556*G0_1_0_4_3 - 0.107652347652366*G0_1_0_4_4 + 0.0017982017982021*G0_1_0_4_5 + 0.0579020979021078*G0_1_0_4_6 + 0.00774083059797482*G0_1_0_4_7 - 0.00222634508348836*G0_1_0_4_8 - 0.0381218781218845*G0_1_0_4_9 + 0.00375624375624423*G0_1_0_5_0 - 0.0100585129156575*G0_1_0_5_1 + 0.00237096237096258*G0_1_0_5_2 + 0.0247638076209546*G0_1_0_5_3 + 0.0017982017982021*G0_1_0_5_4 - 0.0723390894819587*G0_1_0_5_5 - 0.129470529470551*G0_1_0_5_6 - 0.0167318395889854*G0_1_0_5_7 + 0.0233937491080388*G0_1_0_5_8 - 0.0667903525046494*G0_1_0_5_9 + 0.0235992578849763*G0_1_0_6_0 + 0.0176395033537921*G0_1_0_6_1 + 0.018514818514822*G0_1_0_6_2 - 0.0597002997003098*G0_1_0_6_3 + 0.0579020979021078*G0_1_0_6_4 - 0.129470529470551*G0_1_0_6_5 + 0.670369630369745*G0_1_0_6_6 - 0.00666190951905334*G0_1_0_6_7 - 0.0207906379334986*G0_1_0_6_8 + 0.084875124875139*G0_1_0_6_9 - 0.00839160839161008*G0_1_0_7_0 - 0.00327291755863247*G0_1_0_7_1 + 0.00578849721706961*G0_1_0_7_3 + 0.00774083059797482*G0_1_0_7_4 - 0.0167318395889854*G0_1_0_7_5 - 0.00666190951905334*G0_1_0_7_6 - 0.0490823462252124*G0_1_0_7_7 + 0.011183102611676*G0_1_0_7_8 - 0.00667903525046501*G0_1_0_7_9 + 0.00122163550735013*G0_1_0_8_0 + 0.0020760192188768*G0_1_0_8_1 - 0.00151848151848175*G0_1_0_8_2 - 0.00356215213358125*G0_1_0_8_3 - 0.00222634508348836*G0_1_0_8_4 + 0.0233937491080388*G0_1_0_8_5 - 0.0207906379334986*G0_1_0_8_6 + 0.011183102611676*G0_1_0_8_7 - 0.0173312401883857*G0_1_0_8_8 + 0.0182902811474271*G0_1_0_8_9 + 0.00666761809619059*G0_1_0_9_0 - 0.00461253032681679*G0_1_0_9_1 + 0.0115084915084935*G0_1_0_9_2 + 0.00226059654631116*G0_1_0_9_3 - 0.0381218781218845*G0_1_0_9_4 - 0.0667903525046493*G0_1_0_9_5 + 0.0848751248751391*G0_1_0_9_6 - 0.00667903525046501*G0_1_0_9_7 + 0.0182902811474271*G0_1_0_9_8 - 0.231813900385368*G0_1_0_9_9; + A[22] = A[106] + 0.00967520134186972*G0_0_1_0_0 + 0.000185528756957352*G0_0_1_0_3 - 0.000928595214309644*G0_0_1_0_5 + 0.000606595785167316*G0_0_1_0_6 - 0.000383703597989341*G0_0_1_0_7 - 0.00160208838780294*G0_0_1_0_9 - 0.00104090354090379*G0_0_1_1_3 + 0.000616605616605753*G0_0_1_1_4 - 0.000284596356024968*G0_0_1_1_5 + 0.000284596356024976*G0_0_1_1_6 - 0.000616605616605662*G0_0_1_1_7 + 0.0010409035409036*G0_0_1_1_8 - 0.00967520134186967*G0_0_1_2_2 + 0.00038370359798936*G0_0_1_2_4 - 0.000606595785167317*G0_0_1_2_5 + 0.000928595214309663*G0_0_1_2_6 - 0.000185528756957367*G0_0_1_2_8 + 0.00160208838780294*G0_0_1_2_9 + 0.000185528756957352*G0_0_1_3_0 - 0.00104090354090379*G0_0_1_3_1 - 0.00304195804195858*G0_0_1_3_3 - 0.00113350934779522*G0_0_1_3_4 + 0.000148601398601407*G0_0_1_3_5 - 0.000853789068074906*G0_0_1_3_6 - 0.000556586270872062*G0_0_1_3_7 + 0.00111317254174416*G0_0_1_3_9 + 0.000616605616605753*G0_0_1_4_1 + 0.00038370359798936*G0_0_1_4_2 - 0.00113350934779522*G0_0_1_4_3 + 0.00807371200228473*G0_0_1_4_4 + 0.000928357356928922*G0_0_1_4_6 + 0.000556586270872107*G0_0_1_4_8 - 0.00465712858570081*G0_0_1_4_9 - 0.000928595214309645*G0_0_1_5_0 - 0.000284596356024968*G0_0_1_5_1 - 0.000606595785167317*G0_0_1_5_2 + 0.000148601398601407*G0_0_1_5_3 - 0.0354342086485002*G0_0_1_5_5 - 0.000928357356928907*G0_0_1_5_7 + 0.000853789068074906*G0_0_1_5_8 + 0.003098687027259*G0_0_1_5_9 + 0.000606595785167317*G0_0_1_6_0 + 0.000284596356024976*G0_0_1_6_1 + 0.000928595214309663*G0_0_1_6_2 - 0.000853789068074906*G0_0_1_6_3 + 0.000928357356928923*G0_0_1_6_4 + 0.0354342086485003*G0_0_1_6_6 - 0.000148601398601405*G0_0_1_6_8 - 0.00309868702725902*G0_0_1_6_9 - 0.000383703597989341*G0_0_1_7_0 - 0.000616605616605662*G0_0_1_7_1 - 0.000556586270872062*G0_0_1_7_3 - 0.000928357356928907*G0_0_1_7_5 - 0.00807371200228476*G0_0_1_7_7 + 0.00113350934779529*G0_0_1_7_8 + 0.00465712858570081*G0_0_1_7_9 + 0.0010409035409036*G0_0_1_8_1 - 0.000185528756957367*G0_0_1_8_2 + 0.000556586270872107*G0_0_1_8_4 + 0.000853789068074906*G0_0_1_8_5 - 0.000148601398601404*G0_0_1_8_6 + 0.00113350934779529*G0_0_1_8_7 + 0.00304195804195841*G0_0_1_8_8 - 0.00111317254174418*G0_0_1_8_9 - 0.00160208838780294*G0_0_1_9_0 + 0.00160208838780294*G0_0_1_9_2 + 0.00111317254174416*G0_0_1_9_3 - 0.00465712858570081*G0_0_1_9_4 + 0.003098687027259*G0_0_1_9_5 - 0.00309868702725902*G0_0_1_9_6 + 0.00465712858570081*G0_0_1_9_7 - 0.00111317254174418*G0_0_1_9_8 - 0.00967520134186972*G0_1_0_0_0 - 0.000185528756957352*G0_1_0_0_3 + 0.000928595214309645*G0_1_0_0_5 - 0.000606595785167317*G0_1_0_0_6 + 0.000383703597989341*G0_1_0_0_7 + 0.00160208838780294*G0_1_0_0_9 + 0.00104090354090379*G0_1_0_1_3 - 0.000616605616605753*G0_1_0_1_4 + 0.000284596356024968*G0_1_0_1_5 - 0.000284596356024976*G0_1_0_1_6 + 0.000616605616605662*G0_1_0_1_7 - 0.0010409035409036*G0_1_0_1_8 + 0.00967520134186967*G0_1_0_2_2 - 0.00038370359798936*G0_1_0_2_4 + 0.000606595785167317*G0_1_0_2_5 - 0.000928595214309663*G0_1_0_2_6 + 0.000185528756957367*G0_1_0_2_8 - 0.00160208838780294*G0_1_0_2_9 - 0.000185528756957352*G0_1_0_3_0 + 0.00104090354090379*G0_1_0_3_1 + 0.00304195804195858*G0_1_0_3_3 + 0.00113350934779522*G0_1_0_3_4 - 0.000148601398601407*G0_1_0_3_5 + 0.000853789068074906*G0_1_0_3_6 + 0.000556586270872062*G0_1_0_3_7 - 0.00111317254174416*G0_1_0_3_9 - 0.000616605616605753*G0_1_0_4_1 - 0.000383703597989361*G0_1_0_4_2 + 0.00113350934779522*G0_1_0_4_3 - 0.00807371200228474*G0_1_0_4_4 - 0.000928357356928923*G0_1_0_4_6 - 0.000556586270872107*G0_1_0_4_8 + 0.00465712858570081*G0_1_0_4_9 + 0.000928595214309645*G0_1_0_5_0 + 0.000284596356024968*G0_1_0_5_1 + 0.000606595785167317*G0_1_0_5_2 - 0.000148601398601407*G0_1_0_5_3 + 0.0354342086485002*G0_1_0_5_5 + 0.000928357356928907*G0_1_0_5_7 - 0.000853789068074906*G0_1_0_5_8 - 0.003098687027259*G0_1_0_5_9 - 0.000606595785167317*G0_1_0_6_0 - 0.000284596356024976*G0_1_0_6_1 - 0.000928595214309664*G0_1_0_6_2 + 0.000853789068074906*G0_1_0_6_3 - 0.000928357356928923*G0_1_0_6_4 - 0.0354342086485003*G0_1_0_6_6 + 0.000148601398601404*G0_1_0_6_8 + 0.00309868702725902*G0_1_0_6_9 + 0.000383703597989341*G0_1_0_7_0 + 0.000616605616605662*G0_1_0_7_1 + 0.000556586270872062*G0_1_0_7_3 + 0.000928357356928907*G0_1_0_7_5 + 0.00807371200228476*G0_1_0_7_7 - 0.00113350934779529*G0_1_0_7_8 - 0.00465712858570081*G0_1_0_7_9 - 0.0010409035409036*G0_1_0_8_1 + 0.000185528756957367*G0_1_0_8_2 - 0.000556586270872107*G0_1_0_8_4 - 0.000853789068074906*G0_1_0_8_5 + 0.000148601398601404*G0_1_0_8_6 - 0.00113350934779529*G0_1_0_8_7 - 0.00304195804195841*G0_1_0_8_8 + 0.00111317254174418*G0_1_0_8_9 + 0.00160208838780294*G0_1_0_9_0 - 0.00160208838780294*G0_1_0_9_2 - 0.00111317254174416*G0_1_0_9_3 + 0.00465712858570081*G0_1_0_9_4 - 0.003098687027259*G0_1_0_9_5 + 0.00309868702725902*G0_1_0_9_6 - 0.00465712858570081*G0_1_0_9_7 + 0.00111317254174418*G0_1_0_9_8; + A[9] = A[135] + 0.228459195125901*G0_0_1_0_0 + 0.0117478200811554*G0_0_1_0_1 + 0.0117478200811554*G0_0_1_0_2 - 0.00252247752247802*G0_0_1_0_3 - 0.00252247752247794*G0_0_1_0_4 + 0.113297813297833*G0_0_1_0_5 - 0.0524753024753114*G0_0_1_0_6 + 0.113297813297832*G0_0_1_0_7 - 0.0524753024753114*G0_0_1_0_8 + 0.0166944166944196*G0_0_1_0_9 + 0.0117478200811554*G0_0_1_1_0 + 0.00113558399272704*G0_0_1_1_1 + 0.000944003086860387*G0_0_1_1_2 - 0.00052074909217776*G0_0_1_1_3 - 0.000326736755308237*G0_0_1_1_4 + 0.00868964368964514*G0_0_1_1_5 - 0.00417748917748988*G0_0_1_1_6 + 0.0135714285714309*G0_0_1_1_7 - 0.00592851592851694*G0_0_1_1_8 + 0.00253857253857297*G0_0_1_1_9 + 0.0117478200811554*G0_0_1_2_0 + 0.000944003086860387*G0_0_1_2_1 + 0.00113558399272704*G0_0_1_2_2 - 0.000326736755308239*G0_0_1_2_3 - 0.000520749092177757*G0_0_1_2_4 + 0.0135714285714309*G0_0_1_2_5 - 0.00592851592851693*G0_0_1_2_6 + 0.00868964368964515*G0_0_1_2_7 - 0.00417748917748988*G0_0_1_2_8 + 0.00253857253857297*G0_0_1_2_9 - 0.00252247752247802*G0_0_1_3_0 - 0.000520749092177759*G0_0_1_3_1 - 0.000326736755308239*G0_0_1_3_2 - 0.000705484991199448*G0_0_1_3_3 + 0.000204319490033815*G0_0_1_3_4 - 0.00380785880785945*G0_0_1_3_5 + 0.00164668664668693*G0_0_1_3_6 - 0.00331834831834892*G0_0_1_3_7 + 0.00167166167166196*G0_0_1_3_8 - 0.000979020979021162*G0_0_1_3_9 - 0.00252247752247794*G0_0_1_4_0 - 0.000326736755308238*G0_0_1_4_1 - 0.000520749092177757*G0_0_1_4_2 + 0.000204319490033816*G0_0_1_4_3 - 0.000705484991199441*G0_0_1_4_4 - 0.00331834831834889*G0_0_1_4_5 + 0.00167166167166196*G0_0_1_4_6 - 0.00380785880785945*G0_0_1_4_7 + 0.00164668664668693*G0_0_1_4_8 - 0.000979020979021148*G0_0_1_4_9 + 0.113297813297833*G0_0_1_5_0 + 0.00868964368964514*G0_0_1_5_1 + 0.0135714285714309*G0_0_1_5_2 - 0.00380785880785945*G0_0_1_5_3 - 0.00331834831834889*G0_0_1_5_4 + 0.147818847818873*G0_0_1_5_5 - 0.0619963369963475*G0_0_1_5_6 + 0.0739094239094363*G0_0_1_5_7 - 0.0369547119547182*G0_0_1_5_8 + 0.0238261738261779*G0_0_1_5_9 - 0.0524753024753114*G0_0_1_6_0 - 0.00417748917748988*G0_0_1_6_1 - 0.00592851592851694*G0_0_1_6_2 + 0.00164668664668693*G0_0_1_6_3 + 0.00167166167166196*G0_0_1_6_4 - 0.0619963369963475*G0_0_1_6_5 + 0.0270496170496216*G0_0_1_6_6 - 0.0369547119547182*G0_0_1_6_7 + 0.017975357975361*G0_0_1_6_8 - 0.0109090909090928*G0_0_1_6_9 + 0.113297813297832*G0_0_1_7_0 + 0.0135714285714309*G0_0_1_7_1 + 0.00868964368964515*G0_0_1_7_2 - 0.00331834831834892*G0_0_1_7_3 - 0.00380785880785945*G0_0_1_7_4 + 0.0739094239094363*G0_0_1_7_5 - 0.0369547119547182*G0_0_1_7_6 + 0.147818847818873*G0_0_1_7_7 - 0.0619963369963475*G0_0_1_7_8 + 0.0238261738261779*G0_0_1_7_9 - 0.0524753024753114*G0_0_1_8_0 - 0.00592851592851694*G0_0_1_8_1 - 0.00417748917748988*G0_0_1_8_2 + 0.00167166167166196*G0_0_1_8_3 + 0.00164668664668693*G0_0_1_8_4 - 0.0369547119547182*G0_0_1_8_5 + 0.017975357975361*G0_0_1_8_6 - 0.0619963369963474*G0_0_1_8_7 + 0.0270496170496216*G0_0_1_8_8 - 0.0109090909090928*G0_0_1_8_9 + 0.0166944166944196*G0_0_1_9_0 + 0.00253857253857297*G0_0_1_9_1 + 0.00253857253857297*G0_0_1_9_2 - 0.000979020979021162*G0_0_1_9_3 - 0.000979020979021148*G0_0_1_9_4 + 0.0238261738261779*G0_0_1_9_5 - 0.0109090909090928*G0_0_1_9_6 + 0.0238261738261779*G0_0_1_9_7 - 0.0109090909090928*G0_0_1_9_8 + 0.00803196803196941*G0_0_1_9_9 - 0.228459195125901*G0_1_0_0_0 - 0.0117478200811554*G0_1_0_0_1 - 0.0117478200811554*G0_1_0_0_2 + 0.00252247752247802*G0_1_0_0_3 + 0.00252247752247794*G0_1_0_0_4 - 0.113297813297833*G0_1_0_0_5 + 0.0524753024753114*G0_1_0_0_6 - 0.113297813297832*G0_1_0_0_7 + 0.0524753024753114*G0_1_0_0_8 - 0.0166944166944196*G0_1_0_0_9 - 0.0117478200811554*G0_1_0_1_0 - 0.00113558399272704*G0_1_0_1_1 - 0.000944003086860387*G0_1_0_1_2 + 0.00052074909217776*G0_1_0_1_3 + 0.000326736755308237*G0_1_0_1_4 - 0.00868964368964514*G0_1_0_1_5 + 0.00417748917748988*G0_1_0_1_6 - 0.0135714285714309*G0_1_0_1_7 + 0.00592851592851694*G0_1_0_1_8 - 0.00253857253857297*G0_1_0_1_9 - 0.0117478200811554*G0_1_0_2_0 - 0.000944003086860387*G0_1_0_2_1 - 0.00113558399272704*G0_1_0_2_2 + 0.000326736755308239*G0_1_0_2_3 + 0.000520749092177758*G0_1_0_2_4 - 0.0135714285714309*G0_1_0_2_5 + 0.00592851592851694*G0_1_0_2_6 - 0.00868964368964515*G0_1_0_2_7 + 0.00417748917748988*G0_1_0_2_8 - 0.00253857253857297*G0_1_0_2_9 + 0.00252247752247802*G0_1_0_3_0 + 0.000520749092177758*G0_1_0_3_1 + 0.000326736755308238*G0_1_0_3_2 + 0.000705484991199448*G0_1_0_3_3 - 0.000204319490033818*G0_1_0_3_4 + 0.00380785880785945*G0_1_0_3_5 - 0.00164668664668693*G0_1_0_3_6 + 0.00331834831834892*G0_1_0_3_7 - 0.00167166167166196*G0_1_0_3_8 + 0.000979020979021161*G0_1_0_3_9 + 0.00252247752247794*G0_1_0_4_0 + 0.000326736755308237*G0_1_0_4_1 + 0.000520749092177758*G0_1_0_4_2 - 0.000204319490033816*G0_1_0_4_3 + 0.000705484991199441*G0_1_0_4_4 + 0.00331834831834889*G0_1_0_4_5 - 0.00167166167166196*G0_1_0_4_6 + 0.00380785880785945*G0_1_0_4_7 - 0.00164668664668693*G0_1_0_4_8 + 0.000979020979021149*G0_1_0_4_9 - 0.113297813297833*G0_1_0_5_0 - 0.00868964368964514*G0_1_0_5_1 - 0.0135714285714309*G0_1_0_5_2 + 0.00380785880785945*G0_1_0_5_3 + 0.00331834831834889*G0_1_0_5_4 - 0.147818847818873*G0_1_0_5_5 + 0.0619963369963475*G0_1_0_5_6 - 0.0739094239094363*G0_1_0_5_7 + 0.0369547119547182*G0_1_0_5_8 - 0.0238261738261779*G0_1_0_5_9 + 0.0524753024753114*G0_1_0_6_0 + 0.00417748917748988*G0_1_0_6_1 + 0.00592851592851694*G0_1_0_6_2 - 0.00164668664668693*G0_1_0_6_3 - 0.00167166167166196*G0_1_0_6_4 + 0.0619963369963475*G0_1_0_6_5 - 0.0270496170496217*G0_1_0_6_6 + 0.0369547119547182*G0_1_0_6_7 - 0.017975357975361*G0_1_0_6_8 + 0.0109090909090928*G0_1_0_6_9 - 0.113297813297832*G0_1_0_7_0 - 0.0135714285714309*G0_1_0_7_1 - 0.00868964368964515*G0_1_0_7_2 + 0.00331834831834892*G0_1_0_7_3 + 0.00380785880785945*G0_1_0_7_4 - 0.0739094239094363*G0_1_0_7_5 + 0.0369547119547182*G0_1_0_7_6 - 0.147818847818873*G0_1_0_7_7 + 0.0619963369963475*G0_1_0_7_8 - 0.0238261738261779*G0_1_0_7_9 + 0.0524753024753114*G0_1_0_8_0 + 0.00592851592851694*G0_1_0_8_1 + 0.00417748917748988*G0_1_0_8_2 - 0.00167166167166196*G0_1_0_8_3 - 0.00164668664668693*G0_1_0_8_4 + 0.0369547119547182*G0_1_0_8_5 - 0.017975357975361*G0_1_0_8_6 + 0.0619963369963474*G0_1_0_8_7 - 0.0270496170496216*G0_1_0_8_8 + 0.0109090909090928*G0_1_0_8_9 - 0.0166944166944196*G0_1_0_9_0 - 0.00253857253857298*G0_1_0_9_1 - 0.00253857253857297*G0_1_0_9_2 + 0.000979020979021162*G0_1_0_9_3 + 0.000979020979021148*G0_1_0_9_4 - 0.0238261738261779*G0_1_0_9_5 + 0.0109090909090928*G0_1_0_9_6 - 0.0238261738261779*G0_1_0_9_7 + 0.0109090909090928*G0_1_0_9_8 - 0.00803196803196942*G0_1_0_9_9; + A[90] = A[9] + 0.228459195125901*G0_0_0_0_0 + 0.0103159186492537*G0_0_0_0_1 + 0.0131797215130571*G0_0_0_0_2 - 0.00186202686202723*G0_0_0_0_3 - 0.00318292818292872*G0_0_0_0_4 + 0.138381988382012*G0_0_0_0_5 - 0.0613516113516218*G0_0_0_0_6 + 0.0882136382136531*G0_0_0_0_7 - 0.043598993599001*G0_0_0_0_8 + 0.0166944166944196*G0_0_0_0_9 + 0.0103159186492537*G0_0_0_1_0 + 0.00815223577128477*G0_0_0_1_1 + 0.000944003086860386*G0_0_0_1_2 + 0.005869474440904*G0_0_0_1_3 - 0.0038520738520745*G0_0_0_1_4 + 0.00946220446220604*G0_0_0_1_5 - 0.00509863152720381*G0_0_0_1_6 + 0.00708661708661827*G0_0_0_1_7 - 0.00198415341272517*G0_0_0_1_8 + 0.0014404642976074*G0_0_0_1_9 + 0.0131797215130571*G0_0_0_2_0 + 0.000944003086860386*G0_0_0_2_1 - 0.00588106778583067*G0_0_0_2_2 + 0.00319860034145802*G0_0_0_2_3 - 0.00691097262525951*G0_0_0_2_4 + 0.0200562400562435*G0_0_0_2_5 - 0.00987287844430869*G0_0_0_2_6 + 0.00791708291708424*G0_0_0_2_7 - 0.00325634682777595*G0_0_0_2_8 + 0.00363668077953854*G0_0_0_2_9 - 0.00186202686202723*G0_0_0_3_0 + 0.005869474440904*G0_0_0_3_1 + 0.00319860034145802*G0_0_0_3_2 + 0.017968697968701*G0_0_0_3_3 + 0.000204319490033817*G0_0_0_3_4 - 0.00595737595737695*G0_0_0_3_5 + 0.00441011369582872*G0_0_0_3_6 - 0.00529970029970121*G0_0_0_3_7 + 0.00641644070215607*G0_0_0_3_8 + 0.00627800770658019*G0_0_0_3_9 - 0.00318292818292872*G0_0_0_4_0 - 0.0038520738520745*G0_0_0_4_1 - 0.00691097262525951*G0_0_0_4_2 + 0.000204319490033817*G0_0_0_4_3 - 0.0193796679510998*G0_0_0_4_4 - 0.00133699633699658*G0_0_0_4_5 - 0.00307311735883215*G0_0_0_4_6 - 0.00165834165834194*G0_0_0_4_7 - 0.00111674040245487*G0_0_0_4_8 - 0.00823604966462248*G0_0_0_4_9 + 0.138381988382012*G0_0_0_5_0 + 0.00946220446220604*G0_0_0_5_1 + 0.0200562400562435*G0_0_0_5_2 - 0.00595737595737695*G0_0_0_5_3 - 0.00133699633699658*G0_0_0_5_4 + 0.214985014985051*G0_0_0_5_5 - 0.086308691308706*G0_0_0_5_6 + 0.0739094239094363*G0_0_0_5_7 - 0.0392723942724009*G0_0_0_5_8 + 0.0284615384615433*G0_0_0_5_9 - 0.0613516113516218*G0_0_0_6_0 - 0.00509863152720381*G0_0_0_6_1 - 0.00987287844430869*G0_0_0_6_2 + 0.00441011369582872*G0_0_0_6_3 - 0.00307311735883215*G0_0_0_6_4 - 0.086308691308706*G0_0_0_6_5 + 0.0248151848151891*G0_0_0_6_6 - 0.0346370296370354*G0_0_0_6_7 + 0.017975357975361*G0_0_0_6_8 - 0.0197302697302731*G0_0_0_6_9 + 0.0882136382136531*G0_0_0_7_0 + 0.00708661708661828*G0_0_0_7_1 + 0.00791708291708425*G0_0_0_7_2 - 0.00529970029970121*G0_0_0_7_3 - 0.00165834165834194*G0_0_0_7_4 + 0.0739094239094363*G0_0_0_7_5 - 0.0346370296370354*G0_0_0_7_6 + 0.0806526806526942*G0_0_0_7_7 - 0.037683982683989*G0_0_0_7_8 + 0.0191908091908125*G0_0_0_7_9 - 0.043598993599001*G0_0_0_8_0 - 0.00198415341272517*G0_0_0_8_1 - 0.00325634682777595*G0_0_0_8_2 + 0.00641644070215607*G0_0_0_8_3 - 0.00111674040245487*G0_0_0_8_4 - 0.0392723942724009*G0_0_0_8_5 + 0.017975357975361*G0_0_0_8_6 - 0.037683982683989*G0_0_0_8_7 + 0.0292840492840542*G0_0_0_8_8 - 0.00208791208791246*G0_0_0_8_9 + 0.0166944166944196*G0_0_0_9_0 + 0.0014404642976074*G0_0_0_9_1 + 0.00363668077953854*G0_0_0_9_2 + 0.00627800770658019*G0_0_0_9_3 - 0.00823604966462248*G0_0_0_9_4 + 0.0284615384615433*G0_0_0_9_5 - 0.0197302697302731*G0_0_0_9_6 + 0.0191908091908125*G0_0_0_9_7 - 0.00208791208791246*G0_0_0_9_8 + 0.00803196803196941*G0_0_0_9_9 - 0.00143190143190168*G0_0_1_0_1 + 0.00143190143190168*G0_0_1_0_2 + 0.000660450660450789*G0_0_1_0_3 - 0.000660450660450782*G0_0_1_0_4 + 0.0250841750841794*G0_0_1_0_5 - 0.00887630887631039*G0_0_1_0_6 - 0.0250841750841794*G0_0_1_0_7 + 0.00887630887631039*G0_0_1_0_8 - 0.00143190143190168*G0_0_1_1_0 + 0.00701665177855773*G0_0_1_1_1 + 0.00639022353308175*G0_0_1_1_3 - 0.00352533709676626*G0_0_1_1_4 + 0.000772560772560892*G0_0_1_1_5 - 0.000921142349713933*G0_0_1_1_6 - 0.0064848114848126*G0_0_1_1_7 + 0.00394436251579176*G0_0_1_1_8 - 0.00109810824096558*G0_0_1_1_9 + 0.00143190143190168*G0_0_1_2_0 - 0.00701665177855774*G0_0_1_2_2 + 0.00352533709676627*G0_0_1_2_3 - 0.00639022353308177*G0_0_1_2_4 + 0.00648481148481259*G0_0_1_2_5 - 0.00394436251579176*G0_0_1_2_6 - 0.000772560772560905*G0_0_1_2_7 + 0.000921142349713931*G0_0_1_2_8 + 0.00109810824096557*G0_0_1_2_9 + 0.000660450660450789*G0_0_1_3_0 + 0.00639022353308175*G0_0_1_3_1 + 0.00352533709676627*G0_0_1_3_2 + 0.0186741829599004*G0_0_1_3_3 - 0.00214951714951749*G0_0_1_3_5 + 0.00276342704914179*G0_0_1_3_6 - 0.00198135198135229*G0_0_1_3_7 + 0.0047447790304941*G0_0_1_3_8 + 0.00725702868560135*G0_0_1_3_9 - 0.000660450660450782*G0_0_1_4_0 - 0.00352533709676626*G0_0_1_4_1 - 0.00639022353308177*G0_0_1_4_2 - 0.0186741829599004*G0_0_1_4_4 + 0.00198135198135231*G0_0_1_4_5 - 0.00474477903049412*G0_0_1_4_6 + 0.00214951714951751*G0_0_1_4_7 - 0.00276342704914179*G0_0_1_4_8 - 0.00725702868560133*G0_0_1_4_9 + 0.0250841750841794*G0_0_1_5_0 + 0.000772560772560892*G0_0_1_5_1 + 0.00648481148481259*G0_0_1_5_2 - 0.00214951714951749*G0_0_1_5_3 + 0.00198135198135231*G0_0_1_5_4 + 0.0671661671661785*G0_0_1_5_5 - 0.0243123543123584*G0_0_1_5_6 - 0.00231768231768269*G0_0_1_5_8 + 0.0046353646353654*G0_0_1_5_9 - 0.00887630887631039*G0_0_1_6_0 - 0.000921142349713933*G0_0_1_6_1 - 0.00394436251579176*G0_0_1_6_2 + 0.0027634270491418*G0_0_1_6_3 - 0.00474477903049412*G0_0_1_6_4 - 0.0243123543123584*G0_0_1_6_5 - 0.00223443223443262*G0_0_1_6_6 + 0.00231768231768273*G0_0_1_6_7 - 0.00882117882118031*G0_0_1_6_9 - 0.0250841750841794*G0_0_1_7_0 - 0.0064848114848126*G0_0_1_7_1 - 0.000772560772560905*G0_0_1_7_2 - 0.00198135198135229*G0_0_1_7_3 + 0.00214951714951751*G0_0_1_7_4 + 0.00231768231768273*G0_0_1_7_6 - 0.0671661671661786*G0_0_1_7_7 + 0.0243123543123584*G0_0_1_7_8 - 0.00463536463536549*G0_0_1_7_9 + 0.0088763088763104*G0_0_1_8_0 + 0.00394436251579176*G0_0_1_8_1 + 0.00092114234971393*G0_0_1_8_2 + 0.0047447790304941*G0_0_1_8_3 - 0.00276342704914179*G0_0_1_8_4 - 0.00231768231768269*G0_0_1_8_5 + 0.0243123543123584*G0_0_1_8_7 + 0.00223443223443258*G0_0_1_8_8 + 0.00882117882118034*G0_0_1_8_9 - 0.00109810824096558*G0_0_1_9_1 + 0.00109810824096557*G0_0_1_9_2 + 0.00725702868560135*G0_0_1_9_3 - 0.00725702868560133*G0_0_1_9_4 + 0.0046353646353654*G0_0_1_9_5 - 0.00882117882118031*G0_0_1_9_6 - 0.00463536463536549*G0_0_1_9_7 + 0.00882117882118034*G0_0_1_9_8 - 0.00143190143190167*G0_1_0_0_1 + 0.00143190143190169*G0_1_0_0_2 + 0.000660450660450785*G0_1_0_0_3 - 0.000660450660450784*G0_1_0_0_4 + 0.0250841750841795*G0_1_0_0_5 - 0.00887630887631048*G0_1_0_0_6 - 0.0250841750841793*G0_1_0_0_7 + 0.00887630887631033*G0_1_0_0_8 - 0.00143190143190167*G0_1_0_1_0 + 0.00701665177855774*G0_1_0_1_1 + 0.00639022353308176*G0_1_0_1_3 - 0.00352533709676626*G0_1_0_1_4 + 0.000772560772560897*G0_1_0_1_5 - 0.000921142349713933*G0_1_0_1_6 - 0.00648481148481258*G0_1_0_1_7 + 0.00394436251579176*G0_1_0_1_8 - 0.00109810824096557*G0_1_0_1_9 + 0.00143190143190169*G0_1_0_2_0 - 0.00701665177855773*G0_1_0_2_2 + 0.00352533709676626*G0_1_0_2_3 - 0.00639022353308176*G0_1_0_2_4 + 0.0064848114848126*G0_1_0_2_5 - 0.00394436251579176*G0_1_0_2_6 - 0.000772560772560897*G0_1_0_2_7 + 0.000921142349713927*G0_1_0_2_8 + 0.00109810824096557*G0_1_0_2_9 + 0.000660450660450785*G0_1_0_3_0 + 0.00639022353308176*G0_1_0_3_1 + 0.00352533709676626*G0_1_0_3_2 + 0.0186741829599004*G0_1_0_3_3 - 0.0021495171495175*G0_1_0_3_5 + 0.00276342704914179*G0_1_0_3_6 - 0.00198135198135229*G0_1_0_3_7 + 0.0047447790304941*G0_1_0_3_8 + 0.00725702868560133*G0_1_0_3_9 - 0.000660450660450784*G0_1_0_4_0 - 0.00352533709676626*G0_1_0_4_1 - 0.00639022353308176*G0_1_0_4_2 - 0.0186741829599004*G0_1_0_4_4 + 0.0019813519813523*G0_1_0_4_5 - 0.00474477903049411*G0_1_0_4_6 + 0.0021495171495175*G0_1_0_4_7 - 0.00276342704914179*G0_1_0_4_8 - 0.00725702868560132*G0_1_0_4_9 + 0.0250841750841795*G0_1_0_5_0 + 0.000772560772560897*G0_1_0_5_1 + 0.0064848114848126*G0_1_0_5_2 - 0.0021495171495175*G0_1_0_5_3 + 0.0019813519813523*G0_1_0_5_4 + 0.0671661671661787*G0_1_0_5_5 - 0.0243123543123585*G0_1_0_5_6 - 0.00231768231768274*G0_1_0_5_8 + 0.00463536463536543*G0_1_0_5_9 - 0.00887630887631048*G0_1_0_6_0 - 0.000921142349713933*G0_1_0_6_1 - 0.00394436251579176*G0_1_0_6_2 + 0.00276342704914179*G0_1_0_6_3 - 0.00474477903049411*G0_1_0_6_4 - 0.0243123543123585*G0_1_0_6_5 - 0.00223443223443255*G0_1_0_6_6 + 0.00231768231768267*G0_1_0_6_7 - 0.00882117882118031*G0_1_0_6_9 - 0.0250841750841793*G0_1_0_7_0 - 0.00648481148481258*G0_1_0_7_1 - 0.000772560772560896*G0_1_0_7_2 - 0.00198135198135229*G0_1_0_7_3 + 0.0021495171495175*G0_1_0_7_4 + 0.00231768231768267*G0_1_0_7_6 - 0.0671661671661784*G0_1_0_7_7 + 0.0243123543123584*G0_1_0_7_8 - 0.00463536463536544*G0_1_0_7_9 + 0.00887630887631034*G0_1_0_8_0 + 0.00394436251579176*G0_1_0_8_1 + 0.000921142349713927*G0_1_0_8_2 + 0.0047447790304941*G0_1_0_8_3 - 0.00276342704914179*G0_1_0_8_4 - 0.00231768231768274*G0_1_0_8_5 + 0.0243123543123584*G0_1_0_8_7 + 0.00223443223443259*G0_1_0_8_8 + 0.0088211788211803*G0_1_0_8_9 - 0.00109810824096557*G0_1_0_9_1 + 0.00109810824096557*G0_1_0_9_2 + 0.00725702868560133*G0_1_0_9_3 - 0.00725702868560132*G0_1_0_9_4 + 0.00463536463536543*G0_1_0_9_5 - 0.00882117882118031*G0_1_0_9_6 - 0.00463536463536543*G0_1_0_9_7 + 0.0088211788211803*G0_1_0_9_8 - 0.228459195125901*G0_1_1_0_0 - 0.0131797215130571*G0_1_1_0_1 - 0.0103159186492537*G0_1_1_0_2 + 0.0031829281829288*G0_1_1_0_3 + 0.00186202686202716*G0_1_1_0_4 - 0.0882136382136531*G0_1_1_0_5 + 0.0435989935990009*G0_1_1_0_6 - 0.138381988382012*G0_1_1_0_7 + 0.0613516113516217*G0_1_1_0_8 - 0.0166944166944196*G0_1_1_0_9 - 0.0131797215130571*G0_1_1_1_0 + 0.00588106778583069*G0_1_1_1_1 - 0.000944003086860391*G0_1_1_1_2 + 0.00691097262525952*G0_1_1_1_3 - 0.00319860034145803*G0_1_1_1_4 - 0.00791708291708424*G0_1_1_1_5 + 0.00325634682777594*G0_1_1_1_6 - 0.0200562400562435*G0_1_1_1_7 + 0.00987287844430869*G0_1_1_1_8 - 0.00363668077953855*G0_1_1_1_9 - 0.0103159186492537*G0_1_1_2_0 - 0.000944003086860391*G0_1_1_2_1 - 0.00815223577128481*G0_1_1_2_2 + 0.00385207385207451*G0_1_1_2_3 - 0.00586947444090402*G0_1_1_2_4 - 0.00708661708661827*G0_1_1_2_5 + 0.00198415341272516*G0_1_1_2_6 - 0.00946220446220604*G0_1_1_2_7 + 0.00509863152720381*G0_1_1_2_8 - 0.0014404642976074*G0_1_1_2_9 + 0.0031829281829288*G0_1_1_3_0 + 0.00691097262525952*G0_1_1_3_1 + 0.00385207385207451*G0_1_1_3_2 + 0.0193796679510998*G0_1_1_3_3 - 0.000204319490033796*G0_1_1_3_4 + 0.00165834165834195*G0_1_1_3_5 + 0.00111674040245487*G0_1_1_3_6 + 0.00133699633699663*G0_1_1_3_7 + 0.00307311735883213*G0_1_1_3_8 + 0.00823604966462249*G0_1_1_3_9 + 0.00186202686202716*G0_1_1_4_0 - 0.00319860034145803*G0_1_1_4_1 - 0.00586947444090402*G0_1_1_4_2 - 0.000204319490033798*G0_1_1_4_3 - 0.017968697968701*G0_1_1_4_4 + 0.00529970029970119*G0_1_1_4_5 - 0.00641644070215607*G0_1_1_4_6 + 0.00595737595737694*G0_1_1_4_7 - 0.00441011369582871*G0_1_1_4_8 - 0.00627800770658018*G0_1_1_4_9 - 0.0882136382136531*G0_1_1_5_0 - 0.00791708291708425*G0_1_1_5_1 - 0.00708661708661827*G0_1_1_5_2 + 0.00165834165834196*G0_1_1_5_3 + 0.00529970029970119*G0_1_1_5_4 - 0.0806526806526942*G0_1_1_5_5 + 0.037683982683989*G0_1_1_5_6 - 0.0739094239094363*G0_1_1_5_7 + 0.0346370296370354*G0_1_1_5_8 - 0.0191908091908125*G0_1_1_5_9 + 0.0435989935990009*G0_1_1_6_0 + 0.00325634682777594*G0_1_1_6_1 + 0.00198415341272516*G0_1_1_6_2 + 0.00111674040245487*G0_1_1_6_3 - 0.00641644070215607*G0_1_1_6_4 + 0.037683982683989*G0_1_1_6_5 - 0.0292840492840542*G0_1_1_6_6 + 0.0392723942724008*G0_1_1_6_7 - 0.017975357975361*G0_1_1_6_8 + 0.00208791208791246*G0_1_1_6_9 - 0.138381988382012*G0_1_1_7_0 - 0.0200562400562435*G0_1_1_7_1 - 0.00946220446220604*G0_1_1_7_2 + 0.00133699633699663*G0_1_1_7_3 + 0.00595737595737694*G0_1_1_7_4 - 0.0739094239094363*G0_1_1_7_5 + 0.0392723942724008*G0_1_1_7_6 - 0.214985014985051*G0_1_1_7_7 + 0.0863086913087059*G0_1_1_7_8 - 0.0284615384615434*G0_1_1_7_9 + 0.0613516113516217*G0_1_1_8_0 + 0.00987287844430869*G0_1_1_8_1 + 0.00509863152720381*G0_1_1_8_2 + 0.00307311735883213*G0_1_1_8_3 - 0.00441011369582871*G0_1_1_8_4 + 0.0346370296370354*G0_1_1_8_5 - 0.017975357975361*G0_1_1_8_6 + 0.0863086913087059*G0_1_1_8_7 - 0.024815184815189*G0_1_1_8_8 + 0.0197302697302731*G0_1_1_8_9 - 0.0166944166944196*G0_1_1_9_0 - 0.00363668077953855*G0_1_1_9_1 - 0.0014404642976074*G0_1_1_9_2 + 0.00823604966462249*G0_1_1_9_3 - 0.00627800770658018*G0_1_1_9_4 - 0.0191908091908125*G0_1_1_9_5 + 0.00208791208791246*G0_1_1_9_6 - 0.0284615384615434*G0_1_1_9_7 + 0.0197302697302731*G0_1_1_9_8 - 0.00803196803196941*G0_1_1_9_9; + A[6] = A[90] - 0.228459195125901*G0_0_1_0_0 - 0.0117478200811554*G0_0_1_0_1 - 0.0117478200811554*G0_0_1_0_2 + 0.00252247752247801*G0_0_1_0_3 + 0.00252247752247794*G0_0_1_0_4 - 0.113297813297833*G0_0_1_0_5 + 0.0524753024753113*G0_0_1_0_6 - 0.113297813297832*G0_0_1_0_7 + 0.0524753024753113*G0_0_1_0_8 - 0.0166944166944196*G0_0_1_0_9 - 0.0117478200811554*G0_0_1_1_0 - 0.00113558399272703*G0_0_1_1_1 - 0.000944003086860385*G0_0_1_1_2 + 0.000520749092177765*G0_0_1_1_3 + 0.000326736755308237*G0_0_1_1_4 - 0.00868964368964514*G0_0_1_1_5 + 0.00417748917748988*G0_0_1_1_6 - 0.0135714285714309*G0_0_1_1_7 + 0.00592851592851693*G0_0_1_1_8 - 0.00253857253857297*G0_0_1_1_9 - 0.0117478200811554*G0_0_1_2_0 - 0.000944003086860385*G0_0_1_2_1 - 0.00113558399272702*G0_0_1_2_2 + 0.000326736755308235*G0_0_1_2_3 + 0.000520749092177765*G0_0_1_2_4 - 0.0135714285714309*G0_0_1_2_5 + 0.00592851592851693*G0_0_1_2_6 - 0.00868964368964514*G0_0_1_2_7 + 0.00417748917748988*G0_0_1_2_8 - 0.00253857253857297*G0_0_1_2_9 + 0.00252247752247801*G0_0_1_3_0 + 0.000520749092177765*G0_0_1_3_1 + 0.000326736755308235*G0_0_1_3_2 + 0.000705484991199455*G0_0_1_3_3 - 0.00020431949003383*G0_0_1_3_4 + 0.00380785880785945*G0_0_1_3_5 - 0.00164668664668693*G0_0_1_3_6 + 0.00331834831834891*G0_0_1_3_7 - 0.00167166167166196*G0_0_1_3_8 + 0.000979020979021141*G0_0_1_3_9 + 0.00252247752247794*G0_0_1_4_0 + 0.000326736755308237*G0_0_1_4_1 + 0.000520749092177766*G0_0_1_4_2 - 0.000204319490033831*G0_0_1_4_3 + 0.000705484991199448*G0_0_1_4_4 + 0.00331834831834888*G0_0_1_4_5 - 0.00167166167166195*G0_0_1_4_6 + 0.00380785880785944*G0_0_1_4_7 - 0.00164668664668692*G0_0_1_4_8 + 0.000979020979021157*G0_0_1_4_9 - 0.113297813297833*G0_0_1_5_0 - 0.00868964368964514*G0_0_1_5_1 - 0.0135714285714309*G0_0_1_5_2 + 0.00380785880785945*G0_0_1_5_3 + 0.00331834831834888*G0_0_1_5_4 - 0.147818847818873*G0_0_1_5_5 + 0.0619963369963474*G0_0_1_5_6 - 0.0739094239094362*G0_0_1_5_7 + 0.0369547119547181*G0_0_1_5_8 - 0.0238261738261779*G0_0_1_5_9 + 0.0524753024753113*G0_0_1_6_0 + 0.00417748917748988*G0_0_1_6_1 + 0.00592851592851693*G0_0_1_6_2 - 0.00164668664668693*G0_0_1_6_3 - 0.00167166167166194*G0_0_1_6_4 + 0.0619963369963474*G0_0_1_6_5 - 0.0270496170496216*G0_0_1_6_6 + 0.0369547119547181*G0_0_1_6_7 - 0.017975357975361*G0_0_1_6_8 + 0.0109090909090928*G0_0_1_6_9 - 0.113297813297832*G0_0_1_7_0 - 0.0135714285714309*G0_0_1_7_1 - 0.00868964368964514*G0_0_1_7_2 + 0.00331834831834891*G0_0_1_7_3 + 0.00380785880785944*G0_0_1_7_4 - 0.0739094239094362*G0_0_1_7_5 + 0.0369547119547181*G0_0_1_7_6 - 0.147818847818873*G0_0_1_7_7 + 0.0619963369963474*G0_0_1_7_8 - 0.0238261738261779*G0_0_1_7_9 + 0.0524753024753113*G0_0_1_8_0 + 0.00592851592851693*G0_0_1_8_1 + 0.00417748917748988*G0_0_1_8_2 - 0.00167166167166196*G0_0_1_8_3 - 0.00164668664668692*G0_0_1_8_4 + 0.0369547119547181*G0_0_1_8_5 - 0.017975357975361*G0_0_1_8_6 + 0.0619963369963474*G0_0_1_8_7 - 0.0270496170496216*G0_0_1_8_8 + 0.0109090909090928*G0_0_1_8_9 - 0.0166944166944196*G0_0_1_9_0 - 0.00253857253857297*G0_0_1_9_1 - 0.00253857253857297*G0_0_1_9_2 + 0.00097902097902114*G0_0_1_9_3 + 0.000979020979021159*G0_0_1_9_4 - 0.0238261738261779*G0_0_1_9_5 + 0.0109090909090928*G0_0_1_9_6 - 0.0238261738261779*G0_0_1_9_7 + 0.0109090909090928*G0_0_1_9_8 - 0.00803196803196939*G0_0_1_9_9 + 0.228459195125901*G0_1_0_0_0 + 0.0117478200811554*G0_1_0_0_1 + 0.0117478200811554*G0_1_0_0_2 - 0.00252247752247801*G0_1_0_0_3 - 0.00252247752247794*G0_1_0_0_4 + 0.113297813297833*G0_1_0_0_5 - 0.0524753024753113*G0_1_0_0_6 + 0.113297813297832*G0_1_0_0_7 - 0.0524753024753113*G0_1_0_0_8 + 0.0166944166944196*G0_1_0_0_9 + 0.0117478200811554*G0_1_0_1_0 + 0.00113558399272703*G0_1_0_1_1 + 0.000944003086860385*G0_1_0_1_2 - 0.000520749092177765*G0_1_0_1_3 - 0.000326736755308237*G0_1_0_1_4 + 0.00868964368964514*G0_1_0_1_5 - 0.00417748917748988*G0_1_0_1_6 + 0.0135714285714309*G0_1_0_1_7 - 0.00592851592851693*G0_1_0_1_8 + 0.00253857253857297*G0_1_0_1_9 + 0.0117478200811554*G0_1_0_2_0 + 0.000944003086860385*G0_1_0_2_1 + 0.00113558399272702*G0_1_0_2_2 - 0.000326736755308235*G0_1_0_2_3 - 0.000520749092177765*G0_1_0_2_4 + 0.0135714285714309*G0_1_0_2_5 - 0.00592851592851693*G0_1_0_2_6 + 0.00868964368964514*G0_1_0_2_7 - 0.00417748917748988*G0_1_0_2_8 + 0.00253857253857297*G0_1_0_2_9 - 0.00252247752247801*G0_1_0_3_0 - 0.000520749092177765*G0_1_0_3_1 - 0.000326736755308235*G0_1_0_3_2 - 0.000705484991199452*G0_1_0_3_3 + 0.00020431949003383*G0_1_0_3_4 - 0.00380785880785945*G0_1_0_3_5 + 0.00164668664668693*G0_1_0_3_6 - 0.00331834831834891*G0_1_0_3_7 + 0.00167166167166196*G0_1_0_3_8 - 0.000979020979021141*G0_1_0_3_9 - 0.00252247752247794*G0_1_0_4_0 - 0.000326736755308237*G0_1_0_4_1 - 0.000520749092177766*G0_1_0_4_2 + 0.000204319490033831*G0_1_0_4_3 - 0.000705484991199448*G0_1_0_4_4 - 0.00331834831834888*G0_1_0_4_5 + 0.00167166167166194*G0_1_0_4_6 - 0.00380785880785944*G0_1_0_4_7 + 0.00164668664668692*G0_1_0_4_8 - 0.000979020979021156*G0_1_0_4_9 + 0.113297813297833*G0_1_0_5_0 + 0.00868964368964514*G0_1_0_5_1 + 0.0135714285714309*G0_1_0_5_2 - 0.00380785880785945*G0_1_0_5_3 - 0.00331834831834888*G0_1_0_5_4 + 0.147818847818873*G0_1_0_5_5 - 0.0619963369963474*G0_1_0_5_6 + 0.0739094239094362*G0_1_0_5_7 - 0.0369547119547181*G0_1_0_5_8 + 0.0238261738261779*G0_1_0_5_9 - 0.0524753024753113*G0_1_0_6_0 - 0.00417748917748988*G0_1_0_6_1 - 0.00592851592851693*G0_1_0_6_2 + 0.00164668664668693*G0_1_0_6_3 + 0.00167166167166194*G0_1_0_6_4 - 0.0619963369963474*G0_1_0_6_5 + 0.0270496170496216*G0_1_0_6_6 - 0.0369547119547181*G0_1_0_6_7 + 0.017975357975361*G0_1_0_6_8 - 0.0109090909090928*G0_1_0_6_9 + 0.113297813297832*G0_1_0_7_0 + 0.0135714285714309*G0_1_0_7_1 + 0.00868964368964514*G0_1_0_7_2 - 0.00331834831834891*G0_1_0_7_3 - 0.00380785880785944*G0_1_0_7_4 + 0.0739094239094362*G0_1_0_7_5 - 0.0369547119547181*G0_1_0_7_6 + 0.147818847818873*G0_1_0_7_7 - 0.0619963369963474*G0_1_0_7_8 + 0.0238261738261779*G0_1_0_7_9 - 0.0524753024753113*G0_1_0_8_0 - 0.00592851592851693*G0_1_0_8_1 - 0.00417748917748988*G0_1_0_8_2 + 0.00167166167166196*G0_1_0_8_3 + 0.00164668664668692*G0_1_0_8_4 - 0.0369547119547181*G0_1_0_8_5 + 0.017975357975361*G0_1_0_8_6 - 0.0619963369963474*G0_1_0_8_7 + 0.0270496170496216*G0_1_0_8_8 - 0.0109090909090928*G0_1_0_8_9 + 0.0166944166944196*G0_1_0_9_0 + 0.00253857253857297*G0_1_0_9_1 + 0.00253857253857297*G0_1_0_9_2 - 0.000979020979021142*G0_1_0_9_3 - 0.000979020979021158*G0_1_0_9_4 + 0.0238261738261779*G0_1_0_9_5 - 0.0109090909090928*G0_1_0_9_6 + 0.0238261738261779*G0_1_0_9_7 - 0.0109090909090928*G0_1_0_9_8 + 0.00803196803196939*G0_1_0_9_9; + A[49] = -A[169] - 0.000348434634148947*G0_0_0_0_0 - 0.00117043450376804*G0_0_0_0_1 - 0.00707077754696922*G0_0_0_0_2 + 0.00632224917939311*G0_0_0_0_3 - 0.00716711859569125*G0_0_0_0_4 + 0.00969379826522849*G0_0_0_0_5 - 0.0145857317285914*G0_0_0_0_6 + 0.00190095618667079*G0_0_0_0_7 - 0.00192664478378797*G0_0_0_0_8 - 0.00482374768089139*G0_0_0_0_9 - 0.00117043450376804*G0_0_0_1_0 + 0.0139514806181495*G0_0_0_1_1 - 0.00173036839703536*G0_0_0_1_2 + 0.000710400710400794*G0_0_0_1_3 - 0.016239316239319*G0_0_0_1_4 + 0.00429570429570502*G0_0_0_1_5 - 0.0104895104895123*G0_0_0_1_6 + 0.00192030192030225*G0_0_0_1_7 + 0.00295260295260343*G0_0_0_1_8 - 0.0113886113886133*G0_0_0_1_9 - 0.00707077754696922*G0_0_0_2_0 - 0.00173036839703537*G0_0_0_2_1 - 0.096102416102432*G0_0_0_2_2 + 0.0055658627087207*G0_0_0_2_3 - 0.0294105894105943*G0_0_0_2_4 + 0.0330761302189929*G0_0_0_2_5 - 0.0708447108447227*G0_0_0_2_6 + 0.00287997716569192*G0_0_0_2_7 - 0.00586556300842114*G0_0_0_2_8 - 0.00673612102183642*G0_0_0_2_9 + 0.00632224917939311*G0_0_0_3_0 + 0.000710400710400797*G0_0_0_3_1 + 0.0055658627087207*G0_0_0_3_2 + 0.0683316683316797*G0_0_0_3_3 + 0.0878121878122028*G0_0_0_3_4 - 0.0216640502354824*G0_0_0_3_5 + 0.0429427715142072*G0_0_0_3_6 - 0.00749250749250871*G0_0_0_3_7 - 0.0215784215784252*G0_0_0_3_8 + 0.0491508491508573*G0_0_0_3_9 - 0.00716711859569125*G0_0_0_4_0 - 0.016239316239319*G0_0_0_4_1 - 0.0294105894105943*G0_0_0_4_2 + 0.0878121878122028*G0_0_0_4_3 - 0.140345368916821*G0_0_0_4_4 + 0.0329755958327442*G0_0_0_4_5 - 0.0759183673469515*G0_0_0_4_6 + 0.000693592122163656*G0_0_0_4_7 + 0.0290709290709339*G0_0_0_4_8 - 0.0457428285999791*G0_0_0_4_9 + 0.00969379826522849*G0_0_0_5_0 + 0.00429570429570502*G0_0_0_5_1 + 0.0330761302189929*G0_0_0_5_2 - 0.0216640502354824*G0_0_0_5_3 + 0.0329755958327442*G0_0_0_5_4 - 0.0455886970172761*G0_0_0_5_5 + 0.0570201227344181*G0_0_0_5_6 - 0.00142143570715025*G0_0_0_5_7 - 0.0014128728414445*G0_0_0_5_8 + 0.0172969887255631*G0_0_0_5_9 - 0.0145857317285914*G0_0_0_6_0 - 0.0104895104895123*G0_0_0_6_1 - 0.0708447108447227*G0_0_0_6_2 + 0.0429427715142072*G0_0_0_6_3 - 0.0759183673469515*G0_0_0_6_4 + 0.0570201227344181*G0_0_0_6_5 - 0.29331240188388*G0_0_0_6_6 + 0.00283430854859473*G0_0_0_6_7 + 0.0187954902240648*G0_0_0_6_8 - 0.0656771799629052*G0_0_0_6_9 + 0.00190095618667079*G0_0_0_7_0 + 0.00192030192030225*G0_0_0_7_1 + 0.00287997716569192*G0_0_0_7_2 - 0.00749250749250872*G0_0_0_7_3 + 0.000693592122163655*G0_0_0_7_4 - 0.00142143570715025*G0_0_0_7_5 + 0.00283430854859473*G0_0_0_7_6 - 0.000685029256458069*G0_0_0_7_7 + 0.00869130869131019*G0_0_0_7_8 + 0.0088026259454846*G0_0_0_7_9 - 0.00192664478378797*G0_0_0_8_0 + 0.00295260295260343*G0_0_0_8_1 - 0.00586556300842114*G0_0_0_8_2 - 0.0215784215784252*G0_0_0_8_3 + 0.0290709290709339*G0_0_0_8_4 - 0.0014128728414445*G0_0_0_8_5 + 0.0187954902240648*G0_0_0_8_6 + 0.00869130869131019*G0_0_0_8_7 - 0.0659340659340768*G0_0_0_8_8 - 0.023976023976028*G0_0_0_8_9 - 0.00482374768089139*G0_0_0_9_0 - 0.0113886113886133*G0_0_0_9_1 - 0.00673612102183642*G0_0_0_9_2 + 0.0491508491508573*G0_0_0_9_3 - 0.0457428285999791*G0_0_0_9_4 + 0.0172969887255631*G0_0_0_9_5 - 0.0656771799629052*G0_0_0_9_6 + 0.0088026259454846*G0_0_0_9_7 - 0.023976023976028*G0_0_0_9_8 - 0.110152704438438*G0_0_0_9_9 + 0.00255659684231161*G0_0_1_0_0 + 0.00504261170927931*G0_0_1_0_1 + 0.00031886984267942*G0_0_1_0_2 + 0.0262382062382108*G0_0_1_0_3 - 0.0019849991278566*G0_0_1_0_4 - 0.00316064887493513*G0_0_1_0_5 - 0.000746872175443724*G0_0_1_0_6 - 0.00676466390752223*G0_0_1_0_7 + 0.00941058941059104*G0_0_1_0_8 + 0.0195632938490114*G0_0_1_0_9 + 0.00504261170927931*G0_0_1_1_0 + 0.196588596588631*G0_0_1_1_1 + 0.00603519936853374*G0_0_1_1_2 + 0.0391164391164461*G0_0_1_1_3 - 0.0287490287490337*G0_0_1_1_4 + 0.00192918192918218*G0_0_1_1_5 - 0.000574980574980651*G0_0_1_1_6 - 0.0241314241314285*G0_0_1_1_7 + 0.0565212565212666*G0_0_1_1_8 - 0.0101232101232117*G0_0_1_1_9 + 0.00031886984267942*G0_0_1_2_0 + 0.00603519936853374*G0_0_1_2_1 - 0.00360133693467079*G0_0_1_2_2 + 0.00894882894883042*G0_0_1_2_3 - 0.00805607091321513*G0_0_1_2_4 + 0.00137925566497017*G0_0_1_2_5 - 0.00490874205159999*G0_0_1_2_6 - 0.00297448583162919*G0_0_1_2_7 + 0.000823620823620973*G0_0_1_2_8 + 0.00427952999381641*G0_0_1_2_9 + 0.0262382062382108*G0_0_1_3_0 + 0.0391164391164461*G0_0_1_3_1 + 0.00894882894883042*G0_0_1_3_2 + 0.491108891108975*G0_0_1_3_3 - 0.0304295704295754*G0_0_1_3_4 - 0.0388211788211853*G0_0_1_3_5 - 0.00513486513486598*G0_0_1_3_6 - 0.0855744255744401*G0_0_1_3_7 + 0.0949050949051111*G0_0_1_3_8 + 0.201518481518516*G0_0_1_3_9 - 0.0019849991278566*G0_0_1_4_0 - 0.0287490287490337*G0_0_1_4_1 - 0.00805607091321513*G0_0_1_4_2 - 0.0304295704295754*G0_0_1_4_3 + 0.0551048951049044*G0_0_1_4_4 - 0.000904809476238214*G0_0_1_4_5 + 0.0060396746111042*G0_0_1_4_6 + 0.0108691308691327*G0_0_1_4_7 - 0.00933066933067095*G0_0_1_4_8 - 0.0110289710289728*G0_0_1_4_9 - 0.00316064887493513*G0_0_1_5_0 + 0.00192918192918218*G0_0_1_5_1 + 0.00137925566497017*G0_0_1_5_2 - 0.0388211788211853*G0_0_1_5_3 - 0.000904809476238215*G0_0_1_5_4 + 0.00041672613101172*G0_0_1_5_5 + 0.00131582703011293*G0_0_1_5_6 + 0.0105837020122752*G0_0_1_5_7 - 0.0126473526473548*G0_0_1_5_8 - 0.0333951762523247*G0_0_1_5_9 - 0.000746872175443724*G0_0_1_6_0 - 0.000574980574980651*G0_0_1_6_1 - 0.00490874205159999*G0_0_1_6_2 - 0.00513486513486598*G0_0_1_6_3 + 0.0060396746111042*G0_0_1_6_4 + 0.00131582703011293*G0_0_1_6_5 - 0.0164349935778536*G0_0_1_6_6 + 0.00206365063507954*G0_0_1_6_7 + 0.00305694305694356*G0_0_1_6_8 - 0.00256885971171726*G0_0_1_6_9 - 0.00676466390752223*G0_0_1_7_0 - 0.0241314241314285*G0_0_1_7_1 - 0.00297448583162919*G0_0_1_7_2 - 0.0855744255744401*G0_0_1_7_3 + 0.0108691308691327*G0_0_1_7_4 + 0.0105837020122752*G0_0_1_7_5 + 0.00206365063507954*G0_0_1_7_6 + 0.0173826173826204*G0_0_1_7_7 - 0.0341058941059*G0_0_1_7_8 - 0.0628171828171934*G0_0_1_7_9 + 0.00941058941059104*G0_0_1_8_0 + 0.0565212565212666*G0_0_1_8_1 + 0.000823620823620973*G0_0_1_8_2 + 0.0949050949051111*G0_0_1_8_3 - 0.00933066933067095*G0_0_1_8_4 - 0.0126473526473548*G0_0_1_8_5 + 0.00305694305694356*G0_0_1_8_6 - 0.0341058941059*G0_0_1_8_7 - 0.11148851148853*G0_0_1_8_8 + 0.0490309690309772*G0_0_1_8_9 + 0.0195632938490114*G0_0_1_9_0 - 0.0101232101232117*G0_0_1_9_1 + 0.00427952999381641*G0_0_1_9_2 + 0.201518481518516*G0_0_1_9_3 - 0.0110289710289728*G0_0_1_9_4 - 0.0333951762523247*G0_0_1_9_5 - 0.00256885971171726*G0_0_1_9_6 - 0.0628171828171934*G0_0_1_9_7 + 0.0490309690309772*G0_0_1_9_8 + 0.20571428571432*G0_0_1_9_9; + A[34] = -A[37] - 0.00151284341760561*G0_1_0_0_0 - 0.00231632564965937*G0_1_0_0_2 - 0.000520431949003474*G0_1_0_0_3 + 0.000449550449550548*G0_1_0_0_4 + 0.00243106100248998*G0_1_0_0_5 - 0.00889332889333042*G0_1_0_0_6 - 0.000586873444016425*G0_1_0_0_7 + 0.000544851973423507*G0_1_0_0_8 - 0.00207601921887671*G0_1_0_0_9 + 0.0015128434176056*G0_1_0_1_1 + 0.00231632564965938*G0_1_0_1_2 - 0.00243106100248999*G0_1_0_1_3 + 0.00889332889333042*G0_1_0_1_4 + 0.000520431949003468*G0_1_0_1_5 - 0.000449550449550528*G0_1_0_1_6 - 0.000544851973423503*G0_1_0_1_7 + 0.000586873444016414*G0_1_0_1_8 + 0.00207601921887672*G0_1_0_1_9 - 0.00231632564965937*G0_1_0_2_0 + 0.00231632564965939*G0_1_0_2_1 - 0.011899211899214*G0_1_0_2_3 + 0.0381840381840448*G0_1_0_2_4 + 0.0118992118992139*G0_1_0_2_5 - 0.0381840381840446*G0_1_0_2_6 - 0.000502830502830593*G0_1_0_2_7 + 0.000502830502830584*G0_1_0_2_8 - 0.000520431949003474*G0_1_0_3_0 - 0.00243106100248999*G0_1_0_3_1 - 0.011899211899214*G0_1_0_3_2 + 0.00755244755244891*G0_1_0_3_3 - 0.0445054945055021*G0_1_0_3_4 + 0.00134865134865151*G0_1_0_3_6 + 0.00156129584701039*G0_1_0_3_7 - 0.00935064935065094*G0_1_0_3_9 + 0.000449550449550548*G0_1_0_4_0 + 0.00889332889333043*G0_1_0_4_1 + 0.0381840381840448*G0_1_0_4_2 - 0.0445054945055021*G0_1_0_4_3 + 0.0998001998002171*G0_1_0_4_4 - 0.00134865134865162*G0_1_0_4_5 - 0.00150849150849177*G0_1_0_4_8 + 0.00269730269730319*G0_1_0_4_9 + 0.00243106100248998*G0_1_0_5_0 + 0.000520431949003468*G0_1_0_5_1 + 0.0118992118992139*G0_1_0_5_2 - 0.00134865134865162*G0_1_0_5_4 - 0.0075524475524488*G0_1_0_5_5 + 0.0445054945055021*G0_1_0_5_6 - 0.00156129584701039*G0_1_0_5_8 + 0.00935064935065092*G0_1_0_5_9 - 0.00889332889333042*G0_1_0_6_0 - 0.000449550449550528*G0_1_0_6_1 - 0.0381840381840446*G0_1_0_6_2 + 0.00134865134865151*G0_1_0_6_3 + 0.0445054945055021*G0_1_0_6_5 - 0.0998001998002167*G0_1_0_6_6 + 0.00150849150849177*G0_1_0_6_7 - 0.00269730269730307*G0_1_0_6_9 - 0.000586873444016425*G0_1_0_7_0 - 0.000544851973423503*G0_1_0_7_1 - 0.000502830502830593*G0_1_0_7_2 + 0.00156129584701039*G0_1_0_7_3 + 0.00150849150849177*G0_1_0_7_6 - 0.00235478806907428*G0_1_0_7_7 + 0.00321107463964659*G0_1_0_7_9 + 0.000544851973423507*G0_1_0_8_0 + 0.000586873444016414*G0_1_0_8_1 + 0.000502830502830584*G0_1_0_8_2 - 0.00150849150849177*G0_1_0_8_4 - 0.00156129584701039*G0_1_0_8_5 + 0.00235478806907419*G0_1_0_8_8 - 0.00321107463964662*G0_1_0_8_9 - 0.00207601921887671*G0_1_0_9_0 + 0.00207601921887672*G0_1_0_9_1 - 0.00935064935065094*G0_1_0_9_3 + 0.00269730269730319*G0_1_0_9_4 + 0.00935064935065092*G0_1_0_9_5 - 0.00269730269730307*G0_1_0_9_6 + 0.00321107463964659*G0_1_0_9_7 - 0.00321107463964662*G0_1_0_9_8 + 0.016702406940505*G0_1_1_0_0 + 0.00242005128909933*G0_1_1_0_1 + 0.00303250761584147*G0_1_1_0_2 + 0.00091965574108446*G0_1_1_0_3 + 0.000175399996828614*G0_1_1_0_4 + 0.00550691372120036*G0_1_1_0_5 - 0.00495048602191544*G0_1_1_0_6 + 0.0106597767312071*G0_1_1_0_7 - 0.00285337678194867*G0_1_1_0_8 + 0.000553256267542094*G0_1_1_0_9 + 0.00242005128909933*G0_1_1_1_0 + 0.0182152503581108*G0_1_1_1_1 + 0.00534883326550085*G0_1_1_1_2 + 0.00307585271871043*G0_1_1_1_3 + 0.00394284287141496*G0_1_1_1_4 + 0.00144008769008792*G0_1_1_1_5 - 0.000274150452721921*G0_1_1_1_6 - 0.00339822875537224*G0_1_1_1_7 + 0.0112466501752236*G0_1_1_1_8 + 0.00262927548641881*G0_1_1_1_9 + 0.00303250761584147*G0_1_1_2_0 + 0.00534883326550085*G0_1_1_2_1 + 0.110111801778487*G0_1_1_2_2 - 0.0202702852702887*G0_1_1_2_3 + 0.0522463647463736*G0_1_1_2_4 - 0.00837107337107476*G0_1_1_2_5 + 0.0140623265623289*G0_1_1_2_6 + 0.00072080697080709*G0_1_1_2_7 + 0.00122363747363769*G0_1_1_2_8 + 0.00402430902430969*G0_1_1_2_9 + 0.00091965574108446*G0_1_1_3_0 + 0.00307585271871043*G0_1_1_3_1 - 0.0202702852702887*G0_1_1_3_2 + 0.0315513058370256*G0_1_1_3_3 - 0.0392470029970097*G0_1_1_3_4 - 0.00173790495219095*G0_1_1_3_5 - 0.00278096903096951*G0_1_1_3_6 - 0.00636238761238871*G0_1_1_3_7 + 0.013636720422437*G0_1_1_3_8 + 0.00483694876552099*G0_1_1_3_9 + 0.000175399996828614*G0_1_1_4_0 + 0.00394284287141496*G0_1_1_4_1 + 0.0522463647463736*G0_1_1_4_2 - 0.0392470029970097*G0_1_1_4_3 + 0.0674275724275841*G0_1_1_4_4 - 0.00412962037962109*G0_1_1_4_5 + 0.00691058941059061*G0_1_1_4_6 + 0.000457399743114114*G0_1_1_4_7 - 0.00727433281004833*G0_1_1_4_8 - 0.0038136863136869*G0_1_1_4_9 + 0.00550691372120036*G0_1_1_5_0 + 0.00144008769008792*G0_1_1_5_1 - 0.00837107337107476*G0_1_1_5_2 - 0.00173790495219095*G0_1_1_5_3 - 0.00412962037962109*G0_1_1_5_4 + 0.0239988582845765*G0_1_1_5_5 + 0.00525849150849248*G0_1_1_5_6 + 0.0136895247609556*G0_1_1_5_7 - 0.00792368345939906*G0_1_1_5_8 + 0.0141875981161719*G0_1_1_5_9 - 0.00495048602191544*G0_1_1_6_0 - 0.000274150452721921*G0_1_1_6_1 + 0.0140623265623289*G0_1_1_6_2 - 0.00278096903096951*G0_1_1_6_3 + 0.00691058941059061*G0_1_1_6_4 + 0.00525849150849248*G0_1_1_6_5 - 0.0323726273726329*G0_1_1_6_6 - 0.00576584130155654*G0_1_1_6_7 + 0.000377479663194004*G0_1_1_6_8 - 0.00651098901099003*G0_1_1_6_9 + 0.0106597767312071*G0_1_1_7_0 - 0.00339822875537224*G0_1_1_7_1 + 0.00072080697080709*G0_1_1_7_2 - 0.00636238761238871*G0_1_1_7_3 + 0.000457399743114114*G0_1_1_7_4 + 0.0136895247609556*G0_1_1_7_5 - 0.00576584130155654*G0_1_1_7_6 + 0.0589481946624903*G0_1_1_7_7 - 0.0206249108034858*G0_1_1_7_8 + 0.00987191380048687*G0_1_1_7_9 - 0.00285337678194867*G0_1_1_8_0 + 0.0112466501752236*G0_1_1_8_1 + 0.00122363747363769*G0_1_1_8_2 + 0.013636720422437*G0_1_1_8_3 - 0.00727433281004833*G0_1_1_8_4 - 0.00792368345939906*G0_1_1_8_5 + 0.000377479663194005*G0_1_1_8_6 - 0.0206249108034858*G0_1_1_8_7 + 0.0613029827315647*G0_1_1_8_8 + 0.00666083916084028*G0_1_1_8_9 + 0.000553256267542095*G0_1_1_9_0 + 0.00262927548641881*G0_1_1_9_1 + 0.00402430902430969*G0_1_1_9_2 + 0.00483694876552099*G0_1_1_9_3 - 0.0038136863136869*G0_1_1_9_4 + 0.0141875981161719*G0_1_1_9_5 - 0.00651098901099003*G0_1_1_9_6 + 0.00987191380048687*G0_1_1_9_7 + 0.00666083916084028*G0_1_1_9_8 + 0.0485129156557809*G0_1_1_9_9; + A[124] = -A[79] + 0.00255659684231164*G0_1_0_0_0 + 0.000318869842679434*G0_1_0_0_1 + 0.00504261170927922*G0_1_0_0_2 - 0.00198499912785659*G0_1_0_0_3 + 0.0262382062382107*G0_1_0_0_4 - 0.00676466390752218*G0_1_0_0_5 + 0.00941058941059096*G0_1_0_0_6 - 0.00316064887493507*G0_1_0_0_7 - 0.000746872175443755*G0_1_0_0_8 + 0.0195632938490115*G0_1_0_0_9 + 0.000318869842679434*G0_1_0_1_0 - 0.00360133693467081*G0_1_0_1_1 + 0.00603519936853371*G0_1_0_1_2 - 0.0080560709132151*G0_1_0_1_3 + 0.00894882894883049*G0_1_0_1_4 - 0.00297448583162919*G0_1_0_1_5 + 0.000823620823620947*G0_1_0_1_6 + 0.00137925566497017*G0_1_0_1_7 - 0.00490874205159998*G0_1_0_1_8 + 0.00427952999381645*G0_1_0_1_9 + 0.00504261170927922*G0_1_0_2_0 + 0.00603519936853371*G0_1_0_2_1 + 0.196588596588629*G0_1_0_2_2 - 0.0287490287490334*G0_1_0_2_3 + 0.0391164391164455*G0_1_0_2_4 - 0.024131424131428*G0_1_0_2_5 + 0.0565212565212658*G0_1_0_2_6 + 0.00192918192918227*G0_1_0_2_7 - 0.000574980574980646*G0_1_0_2_8 - 0.0101232101232119*G0_1_0_2_9 - 0.00198499912785659*G0_1_0_3_0 - 0.0080560709132151*G0_1_0_3_1 - 0.0287490287490334*G0_1_0_3_2 + 0.0551048951049044*G0_1_0_3_3 - 0.0304295704295755*G0_1_0_3_4 + 0.0108691308691327*G0_1_0_3_5 - 0.00933066933067087*G0_1_0_3_6 - 0.000904809476238232*G0_1_0_3_7 + 0.00603967461110426*G0_1_0_3_8 - 0.0110289710289728*G0_1_0_3_9 + 0.0262382062382107*G0_1_0_4_0 + 0.00894882894883048*G0_1_0_4_1 + 0.0391164391164455*G0_1_0_4_2 - 0.0304295704295755*G0_1_0_4_3 + 0.491108891108974*G0_1_0_4_4 - 0.08557442557444*G0_1_0_4_5 + 0.0949050949051109*G0_1_0_4_6 - 0.0388211788211854*G0_1_0_4_7 - 0.00513486513486604*G0_1_0_4_8 + 0.201518481518515*G0_1_0_4_9 - 0.00676466390752218*G0_1_0_5_0 - 0.00297448583162919*G0_1_0_5_1 - 0.024131424131428*G0_1_0_5_2 + 0.0108691308691327*G0_1_0_5_3 - 0.08557442557444*G0_1_0_5_4 + 0.0173826173826203*G0_1_0_5_5 - 0.0341058941058997*G0_1_0_5_6 + 0.0105837020122753*G0_1_0_5_7 + 0.00206365063507955*G0_1_0_5_8 - 0.0628171828171934*G0_1_0_5_9 + 0.00941058941059096*G0_1_0_6_0 + 0.000823620823620947*G0_1_0_6_1 + 0.0565212565212658*G0_1_0_6_2 - 0.00933066933067086*G0_1_0_6_3 + 0.0949050949051109*G0_1_0_6_4 - 0.0341058941058997*G0_1_0_6_5 - 0.111488511488531*G0_1_0_6_6 - 0.0126473526473548*G0_1_0_6_7 + 0.00305694305694355*G0_1_0_6_8 + 0.0490309690309774*G0_1_0_6_9 - 0.00316064887493507*G0_1_0_7_0 + 0.00137925566497017*G0_1_0_7_1 + 0.00192918192918227*G0_1_0_7_2 - 0.000904809476238232*G0_1_0_7_3 - 0.0388211788211854*G0_1_0_7_4 + 0.0105837020122753*G0_1_0_7_5 - 0.0126473526473548*G0_1_0_7_6 + 0.000416726131012351*G0_1_0_7_7 + 0.00131582703011289*G0_1_0_7_8 - 0.0333951762523247*G0_1_0_7_9 - 0.000746872175443755*G0_1_0_8_0 - 0.00490874205159998*G0_1_0_8_1 - 0.000574980574980646*G0_1_0_8_2 + 0.00603967461110426*G0_1_0_8_3 - 0.00513486513486604*G0_1_0_8_4 + 0.00206365063507955*G0_1_0_8_5 + 0.00305694305694355*G0_1_0_8_6 + 0.00131582703011289*G0_1_0_8_7 - 0.0164349935778531*G0_1_0_8_8 - 0.00256885971171724*G0_1_0_8_9 + 0.0195632938490115*G0_1_0_9_0 + 0.00427952999381645*G0_1_0_9_1 - 0.0101232101232119*G0_1_0_9_2 - 0.0110289710289728*G0_1_0_9_3 + 0.201518481518515*G0_1_0_9_4 - 0.0628171828171934*G0_1_0_9_5 + 0.0490309690309773*G0_1_0_9_6 - 0.0333951762523247*G0_1_0_9_7 - 0.00256885971171724*G0_1_0_9_8 + 0.205714285714321*G0_1_0_9_9 - 0.000348434634148923*G0_1_1_0_0 - 0.00707077754696928*G0_1_1_0_1 - 0.00117043450376804*G0_1_1_0_2 - 0.00716711859569126*G0_1_1_0_3 + 0.00632224917939315*G0_1_1_0_4 + 0.00190095618667082*G0_1_1_0_5 - 0.00192664478378798*G0_1_1_0_6 + 0.00969379826522854*G0_1_1_0_7 - 0.0145857317285914*G0_1_1_0_8 - 0.00482374768089135*G0_1_1_0_9 - 0.00707077754696928*G0_1_1_1_0 - 0.0961024161024332*G0_1_1_1_1 - 0.00173036839703538*G0_1_1_1_2 - 0.0294105894105946*G0_1_1_1_3 + 0.0055658627087209*G0_1_1_1_4 + 0.00287997716569199*G0_1_1_1_5 - 0.00586556300842118*G0_1_1_1_6 + 0.0330761302189932*G0_1_1_1_7 - 0.0708447108447233*G0_1_1_1_8 - 0.00673612102183651*G0_1_1_1_9 - 0.00117043450376804*G0_1_1_2_0 - 0.00173036839703538*G0_1_1_2_1 + 0.0139514806181494*G0_1_1_2_2 - 0.0162393162393189*G0_1_1_2_3 + 0.000710400710400738*G0_1_1_2_4 + 0.00192030192030229*G0_1_1_2_5 + 0.00295260295260338*G0_1_1_2_6 + 0.00429570429570503*G0_1_1_2_7 - 0.0104895104895122*G0_1_1_2_8 - 0.0113886113886133*G0_1_1_2_9 - 0.00716711859569126*G0_1_1_3_0 - 0.0294105894105946*G0_1_1_3_1 - 0.0162393162393189*G0_1_1_3_2 - 0.140345368916822*G0_1_1_3_3 + 0.0878121878122027*G0_1_1_3_4 + 0.000693592122163667*G0_1_1_3_5 + 0.029070929070934*G0_1_1_3_6 + 0.0329755958327443*G0_1_1_3_7 - 0.0759183673469517*G0_1_1_3_8 - 0.0457428285999792*G0_1_1_3_9 + 0.00632224917939315*G0_1_1_4_0 + 0.0055658627087209*G0_1_1_4_1 + 0.000710400710400738*G0_1_1_4_2 + 0.0878121878122027*G0_1_1_4_3 + 0.0683316683316803*G0_1_1_4_4 - 0.00749250749250881*G0_1_1_4_5 - 0.0215784215784252*G0_1_1_4_6 - 0.0216640502354825*G0_1_1_4_7 + 0.0429427715142073*G0_1_1_4_8 + 0.0491508491508576*G0_1_1_4_9 + 0.00190095618667082*G0_1_1_5_0 + 0.00287997716569199*G0_1_1_5_1 + 0.00192030192030229*G0_1_1_5_2 + 0.000693592122163669*G0_1_1_5_3 - 0.00749250749250882*G0_1_1_5_4 - 0.000685029256457868*G0_1_1_5_5 + 0.00869130869131011*G0_1_1_5_6 - 0.00142143570715018*G0_1_1_5_7 + 0.00283430854859477*G0_1_1_5_8 + 0.00880262594548458*G0_1_1_5_9 - 0.00192664478378798*G0_1_1_6_0 - 0.00586556300842118*G0_1_1_6_1 + 0.00295260295260338*G0_1_1_6_2 + 0.029070929070934*G0_1_1_6_3 - 0.0215784215784252*G0_1_1_6_4 + 0.00869130869131011*G0_1_1_6_5 - 0.0659340659340773*G0_1_1_6_6 - 0.00141287284144455*G0_1_1_6_7 + 0.0187954902240648*G0_1_1_6_8 - 0.0239760239760281*G0_1_1_6_9 + 0.00969379826522854*G0_1_1_7_0 + 0.0330761302189932*G0_1_1_7_1 + 0.00429570429570503*G0_1_1_7_2 + 0.0329755958327443*G0_1_1_7_3 - 0.0216640502354825*G0_1_1_7_4 - 0.00142143570715018*G0_1_1_7_5 - 0.00141287284144455*G0_1_1_7_6 - 0.0455886970172759*G0_1_1_7_7 + 0.0570201227344183*G0_1_1_7_8 + 0.0172969887255631*G0_1_1_7_9 - 0.0145857317285915*G0_1_1_8_0 - 0.0708447108447233*G0_1_1_8_1 - 0.0104895104895122*G0_1_1_8_2 - 0.0759183673469517*G0_1_1_8_3 + 0.0429427715142073*G0_1_1_8_4 + 0.00283430854859477*G0_1_1_8_5 + 0.0187954902240648*G0_1_1_8_6 + 0.0570201227344183*G0_1_1_8_7 - 0.29331240188388*G0_1_1_8_8 - 0.0656771799629053*G0_1_1_8_9 - 0.00482374768089135*G0_1_1_9_0 - 0.00673612102183651*G0_1_1_9_1 - 0.0113886113886133*G0_1_1_9_2 - 0.0457428285999792*G0_1_1_9_3 + 0.0491508491508576*G0_1_1_9_4 + 0.00880262594548457*G0_1_1_9_5 - 0.0239760239760281*G0_1_1_9_6 + 0.0172969887255631*G0_1_1_9_7 - 0.0656771799629053*G0_1_1_9_8 - 0.110152704438437*G0_1_1_9_9; + A[67] = A[109] - 0.0014134014134018*G0_0_1_0_0 + 0.00025717668574813*G0_0_1_0_1 - 0.000920005920006065*G0_0_1_0_2 - 0.00175800390086137*G0_0_1_0_3 + 0.00128752200180795*G0_0_1_0_4 + 0.00104514533085976*G0_0_1_0_5 + 0.00583535512107047*G0_0_1_0_6 + 0.000609866324152031*G0_0_1_0_7 - 0.000452642595499788*G0_0_1_0_8 - 0.00381761096046879*G0_0_1_0_9 + 0.00025717668574813*G0_0_1_1_0 - 0.00141340141340196*G0_0_1_1_1 - 0.000920005920006068*G0_0_1_1_2 + 0.00104514533085971*G0_0_1_1_3 + 0.00583535512107047*G0_0_1_1_4 - 0.00175800390086135*G0_0_1_1_5 + 0.00128752200180794*G0_0_1_1_6 - 0.000452642595499751*G0_0_1_1_7 + 0.000609866324151956*G0_0_1_1_8 - 0.00381761096046879*G0_0_1_1_9 - 0.000920005920006065*G0_0_1_2_0 - 0.000920005920006068*G0_0_1_2_1 - 0.119010619010639*G0_0_1_2_2 + 0.00475191475191543*G0_0_1_2_3 + 0.000166500166500442*G0_0_1_2_4 + 0.00475191475191544*G0_0_1_2_5 + 0.000166500166500444*G0_0_1_2_6 - 0.00113719613719634*G0_0_1_2_7 - 0.00113719613719635*G0_0_1_2_8 + 0.0115084915084935*G0_0_1_2_9 - 0.00175800390086137*G0_0_1_3_0 + 0.00104514533085971*G0_0_1_3_1 + 0.00475191475191543*G0_0_1_3_2 - 0.0131482802911401*G0_0_1_3_3 - 0.0348101898101957*G0_0_1_3_4 + 0.00624232909947304*G0_0_1_3_5 - 0.00579920079920171*G0_0_1_3_6 + 0.00333737690880611*G0_0_1_3_7 - 0.00481233052661718*G0_0_1_3_8 + 0.0047780790637941*G0_0_1_3_9 + 0.00128752200180795*G0_0_1_4_0 + 0.00583535512107047*G0_0_1_4_1 + 0.000166500166500438*G0_0_1_4_2 - 0.0348101898101957*G0_0_1_4_3 + 0.188751248751281*G0_0_1_4_4 - 0.00579920079920175*G0_0_1_4_5 + 0.0115984015984035*G0_0_1_4_6 + 0.000742828599971606*G0_0_1_4_7 + 0.00147495361781106*G0_0_1_4_8 - 0.022927072927077*G0_0_1_4_9 + 0.00104514533085976*G0_0_1_5_0 - 0.00175800390086135*G0_0_1_5_1 + 0.00475191475191544*G0_0_1_5_2 + 0.00624232909947304*G0_0_1_5_3 - 0.00579920079920175*G0_0_1_5_4 - 0.0131482802911397*G0_0_1_5_5 - 0.0348101898101958*G0_0_1_5_6 - 0.00481233052661713*G0_0_1_5_7 + 0.00333737690880607*G0_0_1_5_8 + 0.00477807906379418*G0_0_1_5_9 + 0.00583535512107047*G0_0_1_6_0 + 0.00128752200180794*G0_0_1_6_1 + 0.000166500166500451*G0_0_1_6_2 - 0.00579920079920171*G0_0_1_6_3 + 0.0115984015984035*G0_0_1_6_4 - 0.0348101898101958*G0_0_1_6_5 + 0.188751248751281*G0_0_1_6_6 + 0.00147495361781107*G0_0_1_6_7 + 0.000742828599971645*G0_0_1_6_8 - 0.0229270729270771*G0_0_1_6_9 + 0.000609866324152031*G0_0_1_7_0 - 0.000452642595499751*G0_0_1_7_1 - 0.00113719613719634*G0_0_1_7_2 + 0.00333737690880611*G0_0_1_7_3 + 0.000742828599971606*G0_0_1_7_4 - 0.00481233052661713*G0_0_1_7_5 + 0.00147495361781107*G0_0_1_7_6 + 0.00149422006564836*G0_0_1_7_7 + 0.0023612102183537*G0_0_1_7_8 + 0.00850292564578421*G0_0_1_7_9 - 0.000452642595499788*G0_0_1_8_0 + 0.000609866324151956*G0_0_1_8_1 - 0.00113719613719635*G0_0_1_8_2 - 0.00481233052661718*G0_0_1_8_3 + 0.00147495361781106*G0_0_1_8_4 + 0.00333737690880607*G0_0_1_8_5 + 0.000742828599971645*G0_0_1_8_6 + 0.0023612102183537*G0_0_1_8_7 + 0.00149422006564841*G0_0_1_8_8 + 0.00850292564578423*G0_0_1_8_9 - 0.00381761096046879*G0_0_1_9_0 - 0.00381761096046879*G0_0_1_9_1 + 0.0115084915084935*G0_0_1_9_2 + 0.0047780790637941*G0_0_1_9_3 - 0.022927072927077*G0_0_1_9_4 + 0.00477807906379418*G0_0_1_9_5 - 0.0229270729270771*G0_0_1_9_6 + 0.00850292564578421*G0_0_1_9_7 + 0.00850292564578423*G0_0_1_9_8 - 0.120685029256479*G0_0_1_9_9 + 0.0014134014134018*G0_1_0_0_0 - 0.00025717668574813*G0_1_0_0_1 + 0.000920005920006065*G0_1_0_0_2 + 0.00175800390086137*G0_1_0_0_3 - 0.00128752200180795*G0_1_0_0_4 - 0.00104514533085976*G0_1_0_0_5 - 0.00583535512107047*G0_1_0_0_6 - 0.000609866324152031*G0_1_0_0_7 + 0.000452642595499788*G0_1_0_0_8 + 0.00381761096046879*G0_1_0_0_9 - 0.00025717668574813*G0_1_0_1_0 + 0.00141340141340196*G0_1_0_1_1 + 0.000920005920006068*G0_1_0_1_2 - 0.00104514533085971*G0_1_0_1_3 - 0.00583535512107047*G0_1_0_1_4 + 0.00175800390086135*G0_1_0_1_5 - 0.00128752200180794*G0_1_0_1_6 + 0.000452642595499751*G0_1_0_1_7 - 0.000609866324151956*G0_1_0_1_8 + 0.00381761096046879*G0_1_0_1_9 + 0.000920005920006065*G0_1_0_2_0 + 0.000920005920006068*G0_1_0_2_1 + 0.119010619010639*G0_1_0_2_2 - 0.00475191475191543*G0_1_0_2_3 - 0.000166500166500438*G0_1_0_2_4 - 0.00475191475191544*G0_1_0_2_5 - 0.000166500166500444*G0_1_0_2_6 + 0.00113719613719634*G0_1_0_2_7 + 0.00113719613719635*G0_1_0_2_8 - 0.0115084915084935*G0_1_0_2_9 + 0.00175800390086137*G0_1_0_3_0 - 0.00104514533085971*G0_1_0_3_1 - 0.00475191475191543*G0_1_0_3_2 + 0.0131482802911401*G0_1_0_3_3 + 0.0348101898101957*G0_1_0_3_4 - 0.00624232909947304*G0_1_0_3_5 + 0.00579920079920172*G0_1_0_3_6 - 0.00333737690880611*G0_1_0_3_7 + 0.00481233052661718*G0_1_0_3_8 - 0.0047780790637941*G0_1_0_3_9 - 0.00128752200180795*G0_1_0_4_0 - 0.00583535512107047*G0_1_0_4_1 - 0.000166500166500438*G0_1_0_4_2 + 0.0348101898101957*G0_1_0_4_3 - 0.188751248751281*G0_1_0_4_4 + 0.00579920079920175*G0_1_0_4_5 - 0.0115984015984035*G0_1_0_4_6 - 0.000742828599971606*G0_1_0_4_7 - 0.00147495361781106*G0_1_0_4_8 + 0.022927072927077*G0_1_0_4_9 - 0.00104514533085976*G0_1_0_5_0 + 0.00175800390086135*G0_1_0_5_1 - 0.00475191475191544*G0_1_0_5_2 - 0.00624232909947303*G0_1_0_5_3 + 0.00579920079920175*G0_1_0_5_4 + 0.0131482802911397*G0_1_0_5_5 + 0.0348101898101958*G0_1_0_5_6 + 0.00481233052661713*G0_1_0_5_7 - 0.00333737690880607*G0_1_0_5_8 - 0.00477807906379418*G0_1_0_5_9 - 0.00583535512107047*G0_1_0_6_0 - 0.00128752200180794*G0_1_0_6_1 - 0.000166500166500451*G0_1_0_6_2 + 0.00579920079920171*G0_1_0_6_3 - 0.0115984015984035*G0_1_0_6_4 + 0.0348101898101958*G0_1_0_6_5 - 0.188751248751281*G0_1_0_6_6 - 0.00147495361781107*G0_1_0_6_7 - 0.000742828599971645*G0_1_0_6_8 + 0.0229270729270771*G0_1_0_6_9 - 0.000609866324152031*G0_1_0_7_0 + 0.000452642595499751*G0_1_0_7_1 + 0.00113719613719634*G0_1_0_7_2 - 0.00333737690880611*G0_1_0_7_3 - 0.000742828599971605*G0_1_0_7_4 + 0.00481233052661713*G0_1_0_7_5 - 0.00147495361781107*G0_1_0_7_6 - 0.00149422006564836*G0_1_0_7_7 - 0.0023612102183537*G0_1_0_7_8 - 0.00850292564578421*G0_1_0_7_9 + 0.000452642595499788*G0_1_0_8_0 - 0.000609866324151956*G0_1_0_8_1 + 0.00113719613719635*G0_1_0_8_2 + 0.00481233052661718*G0_1_0_8_3 - 0.00147495361781106*G0_1_0_8_4 - 0.00333737690880607*G0_1_0_8_5 - 0.000742828599971644*G0_1_0_8_6 - 0.0023612102183537*G0_1_0_8_7 - 0.00149422006564841*G0_1_0_8_8 - 0.00850292564578423*G0_1_0_8_9 + 0.00381761096046879*G0_1_0_9_0 + 0.00381761096046879*G0_1_0_9_1 - 0.0115084915084935*G0_1_0_9_2 - 0.0047780790637941*G0_1_0_9_3 + 0.022927072927077*G0_1_0_9_4 - 0.00477807906379418*G0_1_0_9_5 + 0.0229270729270771*G0_1_0_9_6 - 0.00850292564578421*G0_1_0_9_7 - 0.00850292564578423*G0_1_0_9_8 + 0.120685029256479*G0_1_0_9_9; + A[161] = -A[153] - 0.0925010791677621*G0_0_0_0_0 - 0.00776556776556914*G0_0_0_0_1 - 0.00738964738964867*G0_0_0_0_2 - 0.00668918383204207*G0_0_0_0_3 + 0.00585446299732113*G0_0_0_0_4 - 0.0659359687931231*G0_0_0_0_5 + 0.0316968745540229*G0_0_0_0_6 - 0.0213545184973793*G0_0_0_0_7 - 0.00338296624010963*G0_0_0_0_8 - 0.011015651015653*G0_0_0_0_9 - 0.00776556776556914*G0_0_0_1_0 - 0.182637115970481*G0_0_0_1_1 - 0.00621304621304727*G0_0_0_1_2 - 0.0535686535686627*G0_0_0_1_3 + 0.0260517260517305*G0_0_0_1_4 - 0.00991452991453152*G0_0_0_1_5 + 0.00236652236652274*G0_0_0_1_6 + 0.0125097125097148*G0_0_0_1_7 - 0.0384060384060452*G0_0_0_1_8 - 0.00126540126540151*G0_0_0_1_9 - 0.00738964738964867*G0_0_0_2_0 - 0.00621304621304727*G0_0_0_2_1 - 0.00290503147646061*G0_0_0_2_2 - 0.0113372341943789*G0_0_0_2_3 + 0.00866562009419295*G0_0_0_2_4 - 0.0138388595531476*G0_0_0_2_5 + 0.0128544471401636*G0_0_0_2_6 - 0.00518211946783462*G0_0_0_2_7 - 0.0199159570588175*G0_0_0_2_8 - 0.0243870415299028*G0_0_0_2_9 - 0.00668918383204206*G0_0_0_3_0 - 0.0535686535686627*G0_0_0_3_1 - 0.0113372341943789*G0_0_0_3_2 + 0.0455544455544539*G0_0_0_3_3 + 0.0427972027972099*G0_0_0_3_4 + 0.0157385471671212*G0_0_0_3_5 + 0.0112344798059102*G0_0_0_3_6 + 0.0384015984016048*G0_0_0_3_7 - 0.116483516483536*G0_0_0_3_8 - 0.0730069930070051*G0_0_0_3_9 + 0.00585446299732113*G0_0_0_4_0 + 0.0260517260517305*G0_0_0_4_1 + 0.00866562009419294*G0_0_0_4_2 + 0.0427972027972099*G0_0_0_4_3 - 0.0180676466390782*G0_0_0_4_4 + 0.000770657913515211*G0_0_0_4_5 - 0.0120051377194254*G0_0_0_4_6 - 0.010175538746969*G0_0_0_4_7 + 0.0780819180819311*G0_0_0_4_8 + 0.071619808762678*G0_0_0_4_9 - 0.0659359687931231*G0_0_0_5_0 - 0.00991452991453152*G0_0_0_5_1 - 0.0138388595531476*G0_0_0_5_2 + 0.0157385471671212*G0_0_0_5_3 + 0.000770657913515212*G0_0_0_5_4 - 0.276877408306027*G0_0_0_5_5 + 0.0557042957043053*G0_0_0_5_6 - 0.0819580419580557*G0_0_0_5_7 + 0.0480776366490733*G0_0_0_5_8 - 0.0631083202511881*G0_0_0_5_9 + 0.0316968745540229*G0_0_0_6_0 + 0.00236652236652274*G0_0_0_6_1 + 0.0128544471401636*G0_0_0_6_2 + 0.0112344798059102*G0_0_0_6_3 - 0.0120051377194254*G0_0_0_6_4 + 0.0557042957043053*G0_0_0_6_5 - 0.0460054231482881*G0_0_0_6_6 + 0.0338804053089824*G0_0_0_6_7 + 0.0171571285857028*G0_0_0_6_8 + 0.0506921649778878*G0_0_0_6_9 - 0.0213545184973793*G0_0_0_7_0 + 0.0125097125097148*G0_0_0_7_1 - 0.00518211946783463*G0_0_0_7_2 + 0.0384015984016048*G0_0_0_7_3 - 0.010175538746969*G0_0_0_7_4 - 0.0819580419580557*G0_0_0_7_5 + 0.0338804053089824*G0_0_0_7_6 - 0.195450264021725*G0_0_0_7_7 + 0.118241758241778*G0_0_0_7_8 - 0.0347138575710063*G0_0_0_7_9 - 0.00338296624010963*G0_0_0_8_0 - 0.0384060384060452*G0_0_0_8_1 - 0.0199159570588175*G0_0_0_8_2 - 0.116483516483536*G0_0_0_8_3 + 0.0780819180819311*G0_0_0_8_4 + 0.0480776366490733*G0_0_0_8_5 + 0.0171571285857028*G0_0_0_8_6 + 0.118241758241778*G0_0_0_8_7 - 0.422777222777294*G0_0_0_8_8 - 0.152367632367658*G0_0_0_8_9 - 0.011015651015653*G0_0_0_9_0 - 0.00126540126540151*G0_0_0_9_1 - 0.0243870415299028*G0_0_0_9_2 - 0.0730069930070051*G0_0_0_9_3 + 0.071619808762678*G0_0_0_9_4 - 0.0631083202511881*G0_0_0_9_5 + 0.0506921649778878*G0_0_0_9_6 - 0.0347138575710063*G0_0_0_9_7 - 0.152367632367658*G0_0_0_9_8 - 0.315866990152758*G0_0_0_9_9 + 0.00360133693467082*G0_1_0_0_0 - 0.00603519936853378*G0_1_0_0_1 - 0.000318869842679422*G0_1_0_0_2 - 0.000823620823620955*G0_1_0_0_3 + 0.0029744858316292*G0_1_0_0_4 + 0.0049087420516*G0_1_0_0_5 - 0.00137925566497017*G0_1_0_0_6 + 0.00805607091321515*G0_1_0_0_7 - 0.0089488289488305*G0_1_0_0_8 - 0.00427952999381644*G0_1_0_0_9 - 0.00603519936853378*G0_1_0_1_0 - 0.196588596588631*G0_1_0_1_1 - 0.00504261170927923*G0_1_0_1_2 - 0.0565212565212662*G0_1_0_1_3 + 0.0241314241314282*G0_1_0_1_4 + 0.000574980574980733*G0_1_0_1_5 - 0.00192918192918228*G0_1_0_1_6 + 0.0287490287490338*G0_1_0_1_7 - 0.039116439116446*G0_1_0_1_8 + 0.0101232101232118*G0_1_0_1_9 - 0.000318869842679422*G0_1_0_2_0 - 0.00504261170927923*G0_1_0_2_1 - 0.00255659684231155*G0_1_0_2_2 - 0.00941058941059098*G0_1_0_2_3 + 0.00676466390752218*G0_1_0_2_4 + 0.000746872175443716*G0_1_0_2_5 + 0.00316064887493514*G0_1_0_2_6 + 0.0019849991278566*G0_1_0_2_7 - 0.0262382062382106*G0_1_0_2_8 - 0.0195632938490114*G0_1_0_2_9 - 0.000823620823620955*G0_1_0_3_0 - 0.0565212565212662*G0_1_0_3_1 - 0.00941058941059098*G0_1_0_3_2 + 0.111488511488531*G0_1_0_3_3 + 0.0341058941058998*G0_1_0_3_4 - 0.00305694305694354*G0_1_0_3_5 + 0.0126473526473548*G0_1_0_3_6 + 0.00933066933067089*G0_1_0_3_7 - 0.0949050949051108*G0_1_0_3_8 - 0.0490309690309772*G0_1_0_3_9 + 0.0029744858316292*G0_1_0_4_0 + 0.0241314241314282*G0_1_0_4_1 + 0.00676466390752218*G0_1_0_4_2 + 0.0341058941058998*G0_1_0_4_3 - 0.0173826173826203*G0_1_0_4_4 - 0.00206365063507956*G0_1_0_4_5 - 0.0105837020122752*G0_1_0_4_6 - 0.0108691308691327*G0_1_0_4_7 + 0.0855744255744399*G0_1_0_4_8 + 0.0628171828171935*G0_1_0_4_9 + 0.0049087420516*G0_1_0_5_0 + 0.000574980574980734*G0_1_0_5_1 + 0.000746872175443716*G0_1_0_5_2 - 0.00305694305694353*G0_1_0_5_3 - 0.00206365063507956*G0_1_0_5_4 + 0.0164349935778536*G0_1_0_5_5 - 0.00131582703011293*G0_1_0_5_6 - 0.00603967461110423*G0_1_0_5_7 + 0.00513486513486603*G0_1_0_5_8 + 0.00256885971171727*G0_1_0_5_9 - 0.00137925566497017*G0_1_0_6_0 - 0.00192918192918228*G0_1_0_6_1 + 0.00316064887493514*G0_1_0_6_2 + 0.0126473526473548*G0_1_0_6_3 - 0.0105837020122752*G0_1_0_6_4 - 0.00131582703011293*G0_1_0_6_5 - 0.000416726131011697*G0_1_0_6_6 + 0.000904809476238221*G0_1_0_6_7 + 0.0388211788211853*G0_1_0_6_8 + 0.0333951762523248*G0_1_0_6_9 + 0.00805607091321515*G0_1_0_7_0 + 0.0287490287490338*G0_1_0_7_1 + 0.0019849991278566*G0_1_0_7_2 + 0.00933066933067089*G0_1_0_7_3 - 0.0108691308691327*G0_1_0_7_4 - 0.00603967461110423*G0_1_0_7_5 + 0.000904809476238219*G0_1_0_7_6 - 0.0551048951049044*G0_1_0_7_7 + 0.0304295704295755*G0_1_0_7_8 + 0.0110289710289728*G0_1_0_7_9 - 0.0089488289488305*G0_1_0_8_0 - 0.039116439116446*G0_1_0_8_1 - 0.0262382062382106*G0_1_0_8_2 - 0.0949050949051108*G0_1_0_8_3 + 0.0855744255744399*G0_1_0_8_4 + 0.00513486513486603*G0_1_0_8_5 + 0.0388211788211853*G0_1_0_8_6 + 0.0304295704295755*G0_1_0_8_7 - 0.491108891108974*G0_1_0_8_8 - 0.201518481518516*G0_1_0_8_9 - 0.00427952999381644*G0_1_0_9_0 + 0.0101232101232118*G0_1_0_9_1 - 0.0195632938490114*G0_1_0_9_2 - 0.0490309690309772*G0_1_0_9_3 + 0.0628171828171935*G0_1_0_9_4 + 0.00256885971171727*G0_1_0_9_5 + 0.0333951762523248*G0_1_0_9_6 + 0.0110289710289728*G0_1_0_9_7 - 0.201518481518516*G0_1_0_9_8 - 0.205714285714321*G0_1_0_9_9; + A[96] = A[144] - 0.294322960989679*G0_0_0_0_0 - 0.00984398317731824*G0_0_0_0_1 - 0.00774830108163578*G0_0_0_0_2 - 0.00356088356088408*G0_0_0_0_3 + 0.00489288489288574*G0_0_0_0_4 - 0.0909016909017069*G0_0_0_0_5 + 0.0430088430088507*G0_0_0_0_6 - 0.0714248714248838*G0_0_0_0_7 + 0.0360232360232422*G0_0_0_0_8 - 0.00426240426240518*G0_0_0_0_9 - 0.00984398317731824*G0_0_0_1_0 - 0.0377780949209585*G0_0_0_1_1 + 0.00107419916943744*G0_0_0_1_2 - 0.0357323100180304*G0_0_0_1_3 + 0.0184763384763416*G0_0_0_1_4 + 0.0213386613386649*G0_0_0_1_5 + 0.000447806162091979*G0_0_0_1_6 + 0.0113960113960133*G0_0_0_1_7 - 0.0152490895348064*G0_0_0_1_8 + 0.0164204049918363*G0_0_0_1_9 - 0.00774830108163578*G0_0_0_2_0 + 0.00107419916943744*G0_0_0_2_1 + 0.0414609024132901*G0_0_0_2_2 - 0.0212037697752019*G0_0_0_2_3 + 0.0351741380312868*G0_0_0_2_4 + 0.00336256336256389*G0_0_0_2_5 + 0.0092817235674394*G0_0_0_2_6 - 0.000932400932401097*G0_0_0_2_7 - 0.00785373356802059*G0_0_0_2_8 + 0.000948892377463971*G0_0_0_2_9 - 0.00356088356088408*G0_0_0_3_0 - 0.0357323100180304*G0_0_0_3_1 - 0.0212037697752019*G0_0_0_3_2 - 0.0936663336663495*G0_0_0_3_3 + 0.000468103325246286*G0_0_0_3_4 - 0.0233899433899472*G0_0_0_3_5 - 0.00789686503972352*G0_0_0_3_6 + 0.00412920412920492*G0_0_0_3_7 - 0.021136958279819*G0_0_0_3_8 - 0.0575196232339186*G0_0_0_3_9 + 0.00489288489288574*G0_0_0_4_0 + 0.0184763384763416*G0_0_0_4_1 + 0.0351741380312868*G0_0_0_4_2 + 0.000468103325246286*G0_0_0_4_3 + 0.106316540602273*G0_0_0_4_4 - 0.0212321012321049*G0_0_0_4_5 + 0.0291289662718283*G0_0_0_4_6 - 0.00266400266400316*G0_0_0_4_7 + 0.0170077541506142*G0_0_0_4_8 + 0.0396175253318177*G0_0_0_4_9 - 0.0909016909017069*G0_0_0_5_0 + 0.0213386613386649*G0_0_0_5_1 + 0.00336256336256388*G0_0_0_5_2 - 0.0233899433899472*G0_0_0_5_3 - 0.0212321012321049*G0_0_0_5_4 + 0.466200466200544*G0_0_0_5_5 - 0.055917415917425*G0_0_0_5_6 + 0.0743256743256866*G0_0_0_5_7 - 0.0705694305694423*G0_0_0_5_8 + 0.1539260739261*G0_0_0_5_9 + 0.0430088430088507*G0_0_0_6_0 + 0.000447806162091981*G0_0_0_6_1 + 0.0092817235674394*G0_0_0_6_2 - 0.00789686503972352*G0_0_0_6_3 + 0.0291289662718283*G0_0_0_6_4 - 0.055917415917425*G0_0_0_6_5 + 0.0784282384282515*G0_0_0_6_6 - 0.00375624375624434*G0_0_0_6_7 + 0.0143856143856167*G0_0_0_6_8 + 0.0129470529470551*G0_0_0_6_9 - 0.0714248714248838*G0_0_0_7_0 + 0.0113960113960133*G0_0_0_7_1 - 0.000932400932401094*G0_0_0_7_2 + 0.00412920412920493*G0_0_0_7_3 - 0.00266400266400316*G0_0_0_7_4 + 0.0743256743256866*G0_0_0_7_5 - 0.00375624375624434*G0_0_0_7_6 - 0.168897768897798*G0_0_0_7_7 - 0.00562104562104643*G0_0_0_7_8 + 0.0202997002997037*G0_0_0_7_9 + 0.0360232360232423*G0_0_0_8_0 - 0.0152490895348064*G0_0_0_8_1 - 0.00785373356802059*G0_0_0_8_2 - 0.021136958279819*G0_0_0_8_3 + 0.0170077541506142*G0_0_0_8_4 - 0.0705694305694424*G0_0_0_8_5 + 0.0143856143856167*G0_0_0_8_6 - 0.00562104562104643*G0_0_0_8_7 - 0.0576490176490274*G0_0_0_8_8 - 0.0832767232767373*G0_0_0_8_9 - 0.00426240426240518*G0_0_0_9_0 + 0.0164204049918363*G0_0_0_9_1 + 0.000948892377463977*G0_0_0_9_2 - 0.0575196232339186*G0_0_0_9_3 + 0.0396175253318177*G0_0_0_9_4 + 0.1539260739261*G0_0_0_9_5 + 0.0129470529470551*G0_0_0_9_6 + 0.0202997002997037*G0_0_0_9_7 - 0.0832767232767373*G0_0_0_9_8 + 0.0671328671328787*G0_0_0_9_9 - 0.00104784104784121*G0_0_1_0_1 + 0.00104784104784123*G0_0_1_0_2 - 0.00422688422688497*G0_0_1_0_3 + 0.00422688422688497*G0_0_1_0_4 - 0.0097384097384114*G0_0_1_0_5 + 0.00349280349280411*G0_0_1_0_6 + 0.00973840973841154*G0_0_1_0_7 - 0.00349280349280415*G0_0_1_0_8 - 0.00104784104784121*G0_0_1_1_0 - 0.0396194986671244*G0_0_1_1_1 - 0.0354532240246586*G0_0_1_1_3 + 0.0198400541257718*G0_0_1_1_4 + 0.011135531135533*G0_0_1_1_5 + 0.00415076986505628*G0_0_1_1_6 + 0.00401672401672475*G0_0_1_1_7 - 0.012265406551123*G0_0_1_1_8 + 0.00773575630718618*G0_0_1_1_9 + 0.00104784104784123*G0_0_1_2_0 + 0.0396194986671243*G0_0_1_2_2 - 0.0198400541257717*G0_0_1_2_3 + 0.0354532240246586*G0_0_1_2_4 - 0.00401672401672466*G0_0_1_2_5 + 0.0122654065511229*G0_0_1_2_6 - 0.011135531135533*G0_0_1_2_7 - 0.00415076986505628*G0_0_1_2_8 - 0.00773575630718617*G0_0_1_2_9 - 0.00422688422688497*G0_0_1_3_0 - 0.0354532240246586*G0_0_1_3_1 - 0.0198400541257717*G0_0_1_3_2 - 0.0999914371343114*G0_0_1_3_3 - 0.0103629703629721*G0_0_1_3_5 - 0.0124523095951688*G0_0_1_3_6 + 0.0126806526806549*G0_0_1_3_7 - 0.0251329622758237*G0_0_1_3_8 - 0.0485685742828682*G0_0_1_3_9 + 0.00422688422688497*G0_0_1_4_0 + 0.0198400541257718*G0_0_1_4_1 + 0.0354532240246586*G0_0_1_4_2 + 0.0999914371343112*G0_0_1_4_4 - 0.0126806526806548*G0_0_1_4_5 + 0.0251329622758237*G0_0_1_4_6 + 0.0103629703629721*G0_0_1_4_7 + 0.0124523095951688*G0_0_1_4_8 + 0.0485685742828681*G0_0_1_4_9 - 0.0097384097384114*G0_0_1_5_0 + 0.011135531135533*G0_0_1_5_1 - 0.00401672401672467*G0_0_1_5_2 - 0.010362970362972*G0_0_1_5_3 - 0.0126806526806549*G0_0_1_5_4 + 0.317549117549171*G0_0_1_5_5 - 0.0251481851481894*G0_0_1_5_6 - 0.0334065934065991*G0_0_1_5_8 + 0.0668131868131982*G0_0_1_5_9 + 0.00349280349280411*G0_0_1_6_0 + 0.00415076986505628*G0_0_1_6_1 + 0.0122654065511229*G0_0_1_6_2 - 0.0124523095951688*G0_0_1_6_3 + 0.0251329622758237*G0_0_1_6_4 - 0.0251481851481894*G0_0_1_6_5 + 0.0680386280386396*G0_0_1_6_6 + 0.0334065934065989*G0_0_1_6_7 + 0.0481118881118962*G0_0_1_6_9 + 0.00973840973841156*G0_0_1_7_0 + 0.00401672401672476*G0_0_1_7_1 - 0.011135531135533*G0_0_1_7_2 + 0.0126806526806549*G0_0_1_7_3 + 0.0103629703629721*G0_0_1_7_4 + 0.0334065934065989*G0_0_1_7_6 - 0.317549117549171*G0_0_1_7_7 + 0.0251481851481892*G0_0_1_7_8 - 0.0668131868131979*G0_0_1_7_9 - 0.00349280349280415*G0_0_1_8_0 - 0.012265406551123*G0_0_1_8_1 - 0.00415076986505628*G0_0_1_8_2 - 0.0251329622758237*G0_0_1_8_3 + 0.0124523095951688*G0_0_1_8_4 - 0.0334065934065991*G0_0_1_8_5 + 0.0251481851481892*G0_0_1_8_7 - 0.0680386280386394*G0_0_1_8_8 - 0.0481118881118963*G0_0_1_8_9 + 0.00773575630718618*G0_0_1_9_1 - 0.00773575630718617*G0_0_1_9_2 - 0.0485685742828682*G0_0_1_9_3 + 0.0485685742828681*G0_0_1_9_4 + 0.0668131868131982*G0_0_1_9_5 + 0.0481118881118962*G0_0_1_9_6 - 0.0668131868131979*G0_0_1_9_7 - 0.0481118881118963*G0_0_1_9_8 - 0.00104784104784121*G0_1_0_0_1 + 0.00104784104784123*G0_1_0_0_2 - 0.00422688422688497*G0_1_0_0_3 + 0.00422688422688497*G0_1_0_0_4 - 0.0097384097384114*G0_1_0_0_5 + 0.0034928034928041*G0_1_0_0_6 + 0.00973840973841153*G0_1_0_0_7 - 0.00349280349280415*G0_1_0_0_8 - 0.00104784104784121*G0_1_0_1_0 - 0.0396194986671245*G0_1_0_1_1 - 0.0354532240246586*G0_1_0_1_3 + 0.0198400541257718*G0_1_0_1_4 + 0.011135531135533*G0_1_0_1_5 + 0.00415076986505628*G0_1_0_1_6 + 0.00401672401672476*G0_1_0_1_7 - 0.012265406551123*G0_1_0_1_8 + 0.00773575630718618*G0_1_0_1_9 + 0.00104784104784123*G0_1_0_2_0 + 0.0396194986671243*G0_1_0_2_2 - 0.0198400541257717*G0_1_0_2_3 + 0.0354532240246586*G0_1_0_2_4 - 0.00401672401672466*G0_1_0_2_5 + 0.0122654065511229*G0_1_0_2_6 - 0.011135531135533*G0_1_0_2_7 - 0.00415076986505628*G0_1_0_2_8 - 0.00773575630718617*G0_1_0_2_9 - 0.00422688422688498*G0_1_0_3_0 - 0.0354532240246586*G0_1_0_3_1 - 0.0198400541257717*G0_1_0_3_2 - 0.0999914371343114*G0_1_0_3_3 - 0.0103629703629721*G0_1_0_3_5 - 0.0124523095951688*G0_1_0_3_6 + 0.0126806526806549*G0_1_0_3_7 - 0.0251329622758237*G0_1_0_3_8 - 0.0485685742828682*G0_1_0_3_9 + 0.00422688422688497*G0_1_0_4_0 + 0.0198400541257718*G0_1_0_4_1 + 0.0354532240246586*G0_1_0_4_2 + 0.0999914371343112*G0_1_0_4_4 - 0.0126806526806549*G0_1_0_4_5 + 0.0251329622758237*G0_1_0_4_6 + 0.0103629703629721*G0_1_0_4_7 + 0.0124523095951688*G0_1_0_4_8 + 0.0485685742828681*G0_1_0_4_9 - 0.00973840973841139*G0_1_0_5_0 + 0.011135531135533*G0_1_0_5_1 - 0.00401672401672466*G0_1_0_5_2 - 0.010362970362972*G0_1_0_5_3 - 0.0126806526806549*G0_1_0_5_4 + 0.317549117549171*G0_1_0_5_5 - 0.0251481851481894*G0_1_0_5_6 - 0.0334065934065991*G0_1_0_5_8 + 0.0668131868131982*G0_1_0_5_9 + 0.0034928034928041*G0_1_0_6_0 + 0.00415076986505628*G0_1_0_6_1 + 0.0122654065511229*G0_1_0_6_2 - 0.0124523095951688*G0_1_0_6_3 + 0.0251329622758237*G0_1_0_6_4 - 0.0251481851481894*G0_1_0_6_5 + 0.0680386280386396*G0_1_0_6_6 + 0.0334065934065989*G0_1_0_6_7 + 0.0481118881118961*G0_1_0_6_9 + 0.00973840973841155*G0_1_0_7_0 + 0.00401672401672476*G0_1_0_7_1 - 0.011135531135533*G0_1_0_7_2 + 0.0126806526806549*G0_1_0_7_3 + 0.0103629703629721*G0_1_0_7_4 + 0.0334065934065989*G0_1_0_7_6 - 0.317549117549171*G0_1_0_7_7 + 0.0251481851481892*G0_1_0_7_8 - 0.0668131868131979*G0_1_0_7_9 - 0.00349280349280415*G0_1_0_8_0 - 0.012265406551123*G0_1_0_8_1 - 0.00415076986505628*G0_1_0_8_2 - 0.0251329622758237*G0_1_0_8_3 + 0.0124523095951688*G0_1_0_8_4 - 0.0334065934065991*G0_1_0_8_5 + 0.0251481851481892*G0_1_0_8_7 - 0.0680386280386394*G0_1_0_8_8 - 0.0481118881118963*G0_1_0_8_9 + 0.00773575630718618*G0_1_0_9_1 - 0.00773575630718617*G0_1_0_9_2 - 0.0485685742828682*G0_1_0_9_3 + 0.0485685742828681*G0_1_0_9_4 + 0.0668131868131982*G0_1_0_9_5 + 0.0481118881118961*G0_1_0_9_6 - 0.0668131868131979*G0_1_0_9_7 - 0.0481118881118963*G0_1_0_9_8 + 0.294322960989678*G0_1_1_0_0 + 0.00774830108163577*G0_1_1_0_1 + 0.00984398317731818*G0_1_1_0_2 - 0.00489288489288585*G0_1_1_0_3 + 0.0035608835608842*G0_1_1_0_4 + 0.0714248714248837*G0_1_1_0_5 - 0.0360232360232422*G0_1_1_0_6 + 0.0909016909017065*G0_1_1_0_7 - 0.0430088430088504*G0_1_1_0_8 + 0.00426240426240515*G0_1_1_0_9 + 0.00774830108163577*G0_1_1_1_0 - 0.0414609024132904*G0_1_1_1_1 - 0.00107419916943744*G0_1_1_1_2 - 0.0351741380312869*G0_1_1_1_3 + 0.021203769775202*G0_1_1_1_4 + 0.000932400932401123*G0_1_1_1_5 + 0.0078537335680206*G0_1_1_1_6 - 0.00336256336256385*G0_1_1_1_7 - 0.00928172356743947*G0_1_1_1_8 - 0.00094889237746397*G0_1_1_1_9 + 0.00984398317731818*G0_1_1_2_0 - 0.00107419916943744*G0_1_1_2_1 + 0.0377780949209584*G0_1_1_2_2 - 0.0184763384763416*G0_1_1_2_3 + 0.0357323100180304*G0_1_1_2_4 - 0.0113960113960133*G0_1_1_2_5 + 0.0152490895348064*G0_1_1_2_6 - 0.0213386613386649*G0_1_1_2_7 - 0.000447806162091954*G0_1_1_2_8 - 0.0164204049918363*G0_1_1_2_9 - 0.00489288489288585*G0_1_1_3_0 - 0.0351741380312869*G0_1_1_3_1 - 0.0184763384763416*G0_1_1_3_2 - 0.106316540602273*G0_1_1_3_3 - 0.000468103325246241*G0_1_1_3_4 + 0.00266400266400315*G0_1_1_3_5 - 0.0170077541506141*G0_1_1_3_6 + 0.0212321012321049*G0_1_1_3_7 - 0.0291289662718283*G0_1_1_3_8 - 0.0396175253318178*G0_1_1_3_9 + 0.0035608835608842*G0_1_1_4_0 + 0.021203769775202*G0_1_1_4_1 + 0.0357323100180304*G0_1_1_4_2 - 0.000468103325246255*G0_1_1_4_3 + 0.0936663336663494*G0_1_1_4_4 - 0.00412920412920483*G0_1_1_4_5 + 0.021136958279819*G0_1_1_4_6 + 0.0233899433899473*G0_1_1_4_7 + 0.00789686503972351*G0_1_1_4_8 + 0.0575196232339186*G0_1_1_4_9 + 0.0714248714248837*G0_1_1_5_0 + 0.00093240093240112*G0_1_1_5_1 - 0.0113960113960133*G0_1_1_5_2 + 0.00266400266400314*G0_1_1_5_3 - 0.00412920412920483*G0_1_1_5_4 + 0.168897768897798*G0_1_1_5_5 + 0.00562104562104646*G0_1_1_5_6 - 0.0743256743256867*G0_1_1_5_7 + 0.00375624375624431*G0_1_1_5_8 - 0.0202997002997036*G0_1_1_5_9 - 0.0360232360232422*G0_1_1_6_0 + 0.0078537335680206*G0_1_1_6_1 + 0.0152490895348064*G0_1_1_6_2 - 0.0170077541506141*G0_1_1_6_3 + 0.021136958279819*G0_1_1_6_4 + 0.00562104562104646*G0_1_1_6_5 + 0.0576490176490274*G0_1_1_6_6 + 0.0705694305694423*G0_1_1_6_7 - 0.0143856143856168*G0_1_1_6_8 + 0.0832767232767372*G0_1_1_6_9 + 0.0909016909017064*G0_1_1_7_0 - 0.00336256336256385*G0_1_1_7_1 - 0.0213386613386649*G0_1_1_7_2 + 0.0212321012321049*G0_1_1_7_3 + 0.0233899433899473*G0_1_1_7_4 - 0.0743256743256867*G0_1_1_7_5 + 0.0705694305694423*G0_1_1_7_6 - 0.466200466200544*G0_1_1_7_7 + 0.0559174159174251*G0_1_1_7_8 - 0.1539260739261*G0_1_1_7_9 - 0.0430088430088504*G0_1_1_8_0 - 0.00928172356743947*G0_1_1_8_1 - 0.000447806162091955*G0_1_1_8_2 - 0.0291289662718283*G0_1_1_8_3 + 0.00789686503972351*G0_1_1_8_4 + 0.00375624375624431*G0_1_1_8_5 - 0.0143856143856168*G0_1_1_8_6 + 0.0559174159174251*G0_1_1_8_7 - 0.0784282384282515*G0_1_1_8_8 - 0.0129470529470552*G0_1_1_8_9 + 0.00426240426240515*G0_1_1_9_0 - 0.00094889237746397*G0_1_1_9_1 - 0.0164204049918363*G0_1_1_9_2 - 0.0396175253318178*G0_1_1_9_3 + 0.0575196232339186*G0_1_1_9_4 - 0.0202997002997036*G0_1_1_9_5 + 0.0832767232767372*G0_1_1_9_6 - 0.1539260739261*G0_1_1_9_7 - 0.0129470529470552*G0_1_1_9_8 - 0.0671328671328785*G0_1_1_9_9; + A[81] = -A[126] - 0.00955094288427775*G0_1_0_0_0 + 0.00207101540434909*G0_1_0_0_2 - 0.0025121967979115*G0_1_0_0_3 + 0.00195317909603655*G0_1_0_0_4 + 0.00635216635216747*G0_1_0_0_5 + 0.00740635026349438*G0_1_0_0_6 - 0.00976208976209135*G0_1_0_0_7 + 0.0026585055156488*G0_1_0_0_8 + 0.00155019583591041*G0_1_0_0_9 + 0.000956221908603066*G0_1_0_1_1 + 0.00330632330632386*G0_1_0_1_2 - 0.00075691504262943*G0_1_0_1_3 + 0.00399642685357037*G0_1_0_1_4 + 0.00625617768475015*G0_1_0_1_5 + 0.0054696626125207*G0_1_0_1_6 + 0.00198869913155659*G0_1_0_1_7 - 0.00234855091997983*G0_1_0_1_8 + 0.0159814788386244*G0_1_0_1_9 + 0.00207101540434909*G0_1_0_2_0 + 0.00330632330632386*G0_1_0_2_1 + 0.0840048840048979*G0_1_0_2_2 - 0.0114907314907334*G0_1_0_2_3 + 0.02575202575203*G0_1_0_2_4 + 0.00200688200688241*G0_1_0_2_5 + 0.0179376179376209*G0_1_0_2_6 + 0.0035845635845642*G0_1_0_2_7 - 0.00248936248936289*G0_1_0_2_8 + 0.00255744255744298*G0_1_0_2_9 - 0.0025121967979115*G0_1_0_3_0 - 0.000756915042629429*G0_1_0_3_1 - 0.0114907314907334*G0_1_0_3_2 + 0.0158698444412759*G0_1_0_3_3 - 0.0242157842157883*G0_1_0_3_4 - 0.000593692022263525*G0_1_0_3_5 - 0.0264535464535509*G0_1_0_3_6 - 0.00250796822225438*G0_1_0_3_7 + 0.00508443937015458*G0_1_0_3_8 - 0.0429285000713644*G0_1_0_3_9 + 0.00195317909603655*G0_1_0_4_0 + 0.00399642685357037*G0_1_0_4_1 + 0.02575202575203*G0_1_0_4_2 - 0.0242157842157883*G0_1_0_4_3 - 0.0799200799200935*G0_1_0_4_4 - 0.0159040959040986*G0_1_0_4_5 + 0.0423576423576495*G0_1_0_4_6 - 0.00328433471290669*G0_1_0_4_7 - 0.00257647114790018*G0_1_0_4_8 + 0.0241358641358682*G0_1_0_4_9 + 0.00635216635216747*G0_1_0_5_0 + 0.00625617768475015*G0_1_0_5_1 + 0.00200688200688241*G0_1_0_5_2 - 0.000593692022263526*G0_1_0_5_3 - 0.0159040959040986*G0_1_0_5_4 + 0.188497217068677*G0_1_0_5_5 - 0.092307692307708*G0_1_0_5_6 + 0.0496113410399208*G0_1_0_5_7 - 0.0288130916702394*G0_1_0_5_8 + 0.0529755958327476*G0_1_0_5_9 + 0.00740635026349438*G0_1_0_6_0 + 0.0054696626125207*G0_1_0_6_1 + 0.0179376179376209*G0_1_0_6_2 - 0.0264535464535509*G0_1_0_6_3 + 0.0423576423576495*G0_1_0_6_4 - 0.092307692307708*G0_1_0_6_5 + 0.140659340659364*G0_1_0_6_6 - 0.0207982493696814*G0_1_0_6_7 + 0.000551829123257784*G0_1_0_6_8 + 0.0452347652347729*G0_1_0_6_9 - 0.00976208976209134*G0_1_0_7_0 + 0.00198869913155659*G0_1_0_7_1 + 0.0035845635845642*G0_1_0_7_2 - 0.00250796822225438*G0_1_0_7_3 - 0.00328433471290669*G0_1_0_7_4 + 0.0496113410399208*G0_1_0_7_5 - 0.0207982493696814*G0_1_0_7_6 - 0.00352409495266672*G0_1_0_7_7 - 0.00746301317730025*G0_1_0_7_8 + 0.0369459112316317*G0_1_0_7_9 + 0.0026585055156488*G0_1_0_8_0 - 0.00234855091997983*G0_1_0_8_1 - 0.00248936248936289*G0_1_0_8_2 + 0.00508443937015458*G0_1_0_8_3 - 0.00257647114790018*G0_1_0_8_4 - 0.0288130916702394*G0_1_0_8_5 + 0.000551829123257784*G0_1_0_8_6 - 0.00746301317730025*G0_1_0_8_7 + 0.00661433804291098*G0_1_0_8_8 - 0.0427914942200728*G0_1_0_8_9 + 0.00155019583591041*G0_1_0_9_0 + 0.0159814788386244*G0_1_0_9_1 + 0.00255744255744298*G0_1_0_9_2 - 0.0429285000713644*G0_1_0_9_3 + 0.0241358641358682*G0_1_0_9_4 + 0.0529755958327476*G0_1_0_9_5 + 0.0452347652347729*G0_1_0_9_6 + 0.0369459112316317*G0_1_0_9_7 - 0.0427914942200728*G0_1_0_9_8 + 0.142760097045836*G0_1_0_9_9 + 0.116249182915869*G0_1_1_0_0 + 0.00794098317907978*G0_1_1_0_1 + 0.00513095370238314*G0_1_1_0_2 - 0.00389367246510175*G0_1_1_0_3 + 0.00246441389298575*G0_1_1_0_4 + 0.0271077071077117*G0_1_1_0_5 - 0.00510262224548019*G0_1_1_0_6 + 0.0763976763976893*G0_1_1_0_7 - 0.0332463303891931*G0_1_1_0_8 + 0.00822796251367828*G0_1_1_0_9 + 0.00794098317907978*G0_1_1_1_0 + 0.00340879578974881*G0_1_1_1_1 + 0.00343332152856021*G0_1_1_1_2 - 0.000469371897943396*G0_1_1_1_3 + 0.00438165009593654*G0_1_1_1_4 + 0.00386491815063307*G0_1_1_1_5 + 0.00549376549376644*G0_1_1_1_6 + 0.0120945720945741*G0_1_1_1_7 - 0.0037778094920958*G0_1_1_1_8 + 0.0147306661592401*G0_1_1_1_9 + 0.00513095370238314*G0_1_1_2_0 + 0.00343332152856021*G0_1_1_2_1 + 0.0811632811632949*G0_1_1_2_2 - 0.0116120916120936*G0_1_1_2_3 + 0.0251600251600294*G0_1_1_2_4 - 0.00158360158360185*G0_1_1_2_5 + 0.0184408184408216*G0_1_1_2_6 + 0.007221561507277*G0_1_1_2_7 - 0.0032847575704724*G0_1_1_2_8 + 0.00111888111888131*G0_1_1_2_9 - 0.00389367246510175*G0_1_1_3_0 - 0.000469371897943396*G0_1_1_3_1 - 0.0116120916120936*G0_1_1_3_2 + 0.0112268683697275*G0_1_1_3_3 - 0.0252395223823838*G0_1_1_3_4 + 0.0060625089196528*G0_1_1_3_5 - 0.028520051377199*G0_1_1_3_6 - 0.000357737500594774*G0_1_1_3_7 + 0.0025422196850773*G0_1_1_3_8 - 0.0434765234765308*G0_1_1_3_9 + 0.00246441389298575*G0_1_1_4_0 + 0.00438165009593654*G0_1_1_4_1 + 0.0251600251600294*G0_1_1_4_2 - 0.0252395223823838*G0_1_1_4_3 - 0.0628704628704734*G0_1_1_4_4 - 0.019431996574857*G0_1_1_4_5 + 0.0479520479520561*G0_1_1_4_6 - 0.00850958565244421*G0_1_1_4_7 - 0.00218448218448257*G0_1_1_4_8 + 0.0355073497930701*G0_1_1_4_9 + 0.0271077071077117*G0_1_1_5_0 + 0.00386491815063307*G0_1_1_5_1 - 0.00158360158360185*G0_1_1_5_2 + 0.0060625089196528*G0_1_1_5_3 - 0.019431996574857*G0_1_1_5_4 + 0.102236810808256*G0_1_1_5_5 - 0.0743408971980526*G0_1_1_5_6 + 0.0573369487655298*G0_1_1_5_7 - 0.023633509347799*G0_1_1_5_8 + 0.0225831311545635*G0_1_1_5_9 - 0.00510262224548019*G0_1_1_6_0 + 0.00549376549376644*G0_1_1_6_1 + 0.0184408184408216*G0_1_1_6_2 - 0.028520051377199*G0_1_1_6_3 + 0.0479520479520561*G0_1_1_6_4 - 0.0743408971980526*G0_1_1_6_5 + 0.131601731601754*G0_1_1_6_6 - 0.0337034394177308*G0_1_1_6_7 + 0.00270586556300887*G0_1_1_6_8 + 0.0536834593977542*G0_1_1_6_9 + 0.0763976763976893*G0_1_1_7_0 + 0.0120945720945741*G0_1_1_7_1 + 0.007221561507277*G0_1_1_7_2 - 0.000357737500594774*G0_1_1_7_3 - 0.00850958565244421*G0_1_1_7_4 + 0.0573369487655298*G0_1_1_7_5 - 0.0337034394177308*G0_1_1_7_6 + 0.198354026925489*G0_1_1_7_7 - 0.0634184862756399*G0_1_1_7_8 + 0.0427229912944271*G0_1_1_7_9 - 0.0332463303891931*G0_1_1_8_0 - 0.0037778094920958*G0_1_1_8_1 - 0.0032847575704724*G0_1_1_8_2 + 0.0025422196850773*G0_1_1_8_3 - 0.00218448218448257*G0_1_1_8_4 - 0.023633509347799*G0_1_1_8_5 + 0.00270586556300887*G0_1_1_8_6 - 0.0634184862756399*G0_1_1_8_7 + 0.0232833832833874*G0_1_1_8_8 - 0.0398230341087551*G0_1_1_8_9 + 0.00822796251367828*G0_1_1_9_0 + 0.0147306661592401*G0_1_1_9_1 + 0.00111888111888131*G0_1_1_9_2 - 0.0434765234765308*G0_1_1_9_3 + 0.0355073497930701*G0_1_1_9_4 + 0.0225831311545635*G0_1_1_9_5 + 0.0536834593977542*G0_1_1_9_6 + 0.0427229912944271*G0_1_1_9_7 - 0.0398230341087551*G0_1_1_9_8 + 0.138375909804505*G0_1_1_9_9; + A[156] = A[100] - 0.195838729172097*G0_0_1_0_0 - 0.00337514337514399*G0_0_1_0_1 - 0.00578458578458679*G0_0_1_0_2 + 0.00025530025530037*G0_0_1_0_3 - 0.000597180597180701*G0_0_1_0_4 - 0.0608724608724715*G0_0_1_0_5 + 0.0265734265734313*G0_0_1_0_6 - 0.0192252192252228*G0_0_1_0_7 + 0.014407814407817*G0_0_1_0_8 + 0.00293040293040329*G0_0_1_0_9 - 0.00337514337514399*G0_0_1_1_0 + 0.00312773646107041*G0_0_1_1_1 + 0.000380466094751884*G0_0_1_1_2 + 0.00179185893471649*G0_0_1_1_3 - 0.00121180406894717*G0_0_1_1_4 + 0.00544249401392348*G0_0_1_1_5 - 0.000659974945689333*G0_0_1_1_6 + 0.00725591868449128*G0_0_1_1_7 - 0.002360179503037*G0_0_1_1_8 + 0.001832453261025*G0_0_1_1_9 - 0.00578458578458679*G0_0_1_2_0 + 0.000380466094751884*G0_0_1_2_1 - 0.000523497666354829*G0_0_1_2_2 + 0.000148740148740178*G0_0_1_2_3 - 0.000847089418518165*G0_0_1_2_5 + 0.00168625025767909*G0_0_1_2_7 - 0.000874998017855289*G0_0_1_2_8 - 0.00141382427096736*G0_0_1_2_9 + 0.00025530025530037*G0_0_1_3_0 + 0.00179185893471649*G0_0_1_3_1 + 0.000148740148740178*G0_0_1_3_2 + 0.0107835022120759*G0_0_1_3_3 - 0.00054516911659789*G0_0_1_3_4 - 0.0077094334237204*G0_0_1_3_5 + 0.000305408876837497*G0_0_1_3_6 - 0.00244041672613147*G0_0_1_3_7 + 0.0014899386327961*G0_0_1_3_8 - 0.00061652633081208*G0_0_1_3_9 - 0.0005971805971807*G0_0_1_4_0 - 0.00121180406894717*G0_0_1_4_1 - 0.000545169116597889*G0_0_1_4_3 + 0.00307692307692372*G0_0_1_4_4 + 0.000117025831311558*G0_0_1_4_5 - 0.000422434708149076*G0_0_1_4_6 - 0.000796346510632344*G0_0_1_4_7 + 0.00095047809333536*G0_0_1_4_8 + 0.00400742115027893*G0_0_1_4_9 - 0.0608724608724715*G0_0_1_5_0 + 0.00544249401392348*G0_0_1_5_1 - 0.000847089418518165*G0_0_1_5_2 - 0.0077094334237204*G0_0_1_5_3 + 0.000117025831311558*G0_0_1_5_4 + 0.142497502497526*G0_0_1_5_5 + 0.00517482517482626*G0_0_1_5_6 + 0.0247352647352687*G0_0_1_5_7 - 0.018001998002001*G0_0_1_5_8 + 0.0272127872127918*G0_0_1_5_9 + 0.0265734265734313*G0_0_1_6_0 - 0.000659974945689333*G0_0_1_6_1 + 0.000305408876837497*G0_0_1_6_3 - 0.000422434708149076*G0_0_1_6_4 + 0.00517482517482626*G0_0_1_6_5 + 0.00389895818467298*G0_0_1_6_6 - 0.00673326673326778*G0_0_1_6_7 + 0.00313971742543219*G0_0_1_6_8 + 0.00363065505922707*G0_0_1_6_9 - 0.0192252192252228*G0_0_1_7_0 + 0.00725591868449128*G0_0_1_7_1 + 0.00168625025767909*G0_0_1_7_2 - 0.00244041672613147*G0_0_1_7_3 - 0.000796346510632343*G0_0_1_7_4 + 0.0247352647352687*G0_0_1_7_5 - 0.00673326673326778*G0_0_1_7_6 + 0.133706293706316*G0_0_1_7_7 - 0.0355044955045013*G0_0_1_7_8 + 0.00467532467532549*G0_0_1_7_9 + 0.014407814407817*G0_0_1_8_0 - 0.002360179503037*G0_0_1_8_1 - 0.000874998017855289*G0_0_1_8_2 + 0.0014899386327961*G0_0_1_8_3 + 0.000950478093335359*G0_0_1_8_4 - 0.018001998002001*G0_0_1_8_5 + 0.00313971742543219*G0_0_1_8_6 - 0.0355044955045013*G0_0_1_8_7 + 0.0133295276152444*G0_0_1_8_8 - 0.00739831596974572*G0_0_1_8_9 + 0.00293040293040329*G0_0_1_9_0 + 0.001832453261025*G0_0_1_9_1 - 0.00141382427096736*G0_0_1_9_2 - 0.000616526330812084*G0_0_1_9_3 + 0.00400742115027893*G0_0_1_9_4 + 0.0272127872127918*G0_0_1_9_5 + 0.00363065505922707*G0_0_1_9_6 + 0.00467532467532549*G0_0_1_9_7 - 0.00739831596974572*G0_0_1_9_8 - 0.0355530184101673*G0_0_1_9_9 + 0.195838729172097*G0_1_0_0_0 + 0.00337514337514399*G0_1_0_0_1 + 0.00578458578458679*G0_1_0_0_2 - 0.00025530025530037*G0_1_0_0_3 + 0.000597180597180701*G0_1_0_0_4 + 0.0608724608724715*G0_1_0_0_5 - 0.0265734265734313*G0_1_0_0_6 + 0.0192252192252228*G0_1_0_0_7 - 0.014407814407817*G0_1_0_0_8 - 0.00293040293040329*G0_1_0_0_9 + 0.00337514337514399*G0_1_0_1_0 - 0.00312773646107041*G0_1_0_1_1 - 0.000380466094751884*G0_1_0_1_2 - 0.00179185893471649*G0_1_0_1_3 + 0.00121180406894717*G0_1_0_1_4 - 0.00544249401392348*G0_1_0_1_5 + 0.000659974945689332*G0_1_0_1_6 - 0.00725591868449128*G0_1_0_1_7 + 0.002360179503037*G0_1_0_1_8 - 0.001832453261025*G0_1_0_1_9 + 0.00578458578458679*G0_1_0_2_0 - 0.000380466094751884*G0_1_0_2_1 + 0.000523497666354829*G0_1_0_2_2 - 0.000148740148740178*G0_1_0_2_3 + 0.000847089418518165*G0_1_0_2_5 - 0.00168625025767909*G0_1_0_2_7 + 0.000874998017855289*G0_1_0_2_8 + 0.00141382427096736*G0_1_0_2_9 - 0.000255300255300369*G0_1_0_3_0 - 0.00179185893471649*G0_1_0_3_1 - 0.000148740148740178*G0_1_0_3_2 - 0.0107835022120759*G0_1_0_3_3 + 0.000545169116597888*G0_1_0_3_4 + 0.0077094334237204*G0_1_0_3_5 - 0.000305408876837497*G0_1_0_3_6 + 0.00244041672613147*G0_1_0_3_7 - 0.0014899386327961*G0_1_0_3_8 + 0.00061652633081208*G0_1_0_3_9 + 0.0005971805971807*G0_1_0_4_0 + 0.00121180406894717*G0_1_0_4_1 + 0.000545169116597887*G0_1_0_4_3 - 0.00307692307692372*G0_1_0_4_4 - 0.000117025831311558*G0_1_0_4_5 + 0.000422434708149076*G0_1_0_4_6 + 0.000796346510632343*G0_1_0_4_7 - 0.00095047809333536*G0_1_0_4_8 - 0.00400742115027893*G0_1_0_4_9 + 0.0608724608724715*G0_1_0_5_0 - 0.00544249401392348*G0_1_0_5_1 + 0.000847089418518165*G0_1_0_5_2 + 0.0077094334237204*G0_1_0_5_3 - 0.000117025831311558*G0_1_0_5_4 - 0.142497502497526*G0_1_0_5_5 - 0.00517482517482627*G0_1_0_5_6 - 0.0247352647352687*G0_1_0_5_7 + 0.018001998002001*G0_1_0_5_8 - 0.0272127872127918*G0_1_0_5_9 - 0.0265734265734313*G0_1_0_6_0 + 0.000659974945689333*G0_1_0_6_1 - 0.000305408876837497*G0_1_0_6_3 + 0.000422434708149076*G0_1_0_6_4 - 0.00517482517482627*G0_1_0_6_5 - 0.00389895818467298*G0_1_0_6_6 + 0.00673326673326778*G0_1_0_6_7 - 0.00313971742543219*G0_1_0_6_8 - 0.00363065505922707*G0_1_0_6_9 + 0.0192252192252228*G0_1_0_7_0 - 0.00725591868449128*G0_1_0_7_1 - 0.00168625025767909*G0_1_0_7_2 + 0.00244041672613147*G0_1_0_7_3 + 0.000796346510632343*G0_1_0_7_4 - 0.0247352647352687*G0_1_0_7_5 + 0.00673326673326778*G0_1_0_7_6 - 0.133706293706316*G0_1_0_7_7 + 0.0355044955045013*G0_1_0_7_8 - 0.00467532467532549*G0_1_0_7_9 - 0.014407814407817*G0_1_0_8_0 + 0.002360179503037*G0_1_0_8_1 + 0.000874998017855289*G0_1_0_8_2 - 0.0014899386327961*G0_1_0_8_3 - 0.000950478093335359*G0_1_0_8_4 + 0.018001998002001*G0_1_0_8_5 - 0.00313971742543219*G0_1_0_8_6 + 0.0355044955045013*G0_1_0_8_7 - 0.0133295276152444*G0_1_0_8_8 + 0.00739831596974572*G0_1_0_8_9 - 0.00293040293040329*G0_1_0_9_0 - 0.001832453261025*G0_1_0_9_1 + 0.00141382427096736*G0_1_0_9_2 + 0.000616526330812084*G0_1_0_9_3 - 0.00400742115027893*G0_1_0_9_4 - 0.0272127872127918*G0_1_0_9_5 - 0.00363065505922707*G0_1_0_9_6 - 0.00467532467532549*G0_1_0_9_7 + 0.00739831596974572*G0_1_0_9_8 + 0.0355530184101673*G0_1_0_9_9; + A[142] = A[156] - 0.0329941663275051*G0_0_0_0_0 - 0.00127012317488528*G0_0_0_0_1 - 0.00441900251424136*G0_0_0_0_2 + 0.00384884956313594*G0_0_0_0_3 - 0.00185972757401361*G0_0_0_0_4 - 0.058155178155188*G0_0_0_0_5 + 0.0204329004329039*G0_0_0_0_6 - 0.00551448551448639*G0_0_0_0_7 + 0.00631368631368738*G0_0_0_0_8 - 0.00783216783216919*G0_0_0_0_9 - 0.00127012317488528*G0_0_0_1_0 + 0.00672681815539083*G0_0_0_1_1 + 0.000375427042093779*G0_0_0_1_2 + 0.00921998636284516*G0_0_0_1_3 - 0.0064690864690876*G0_0_0_1_4 - 0.00113854399568702*G0_0_0_1_5 - 0.00176268176268207*G0_0_0_1_6 + 0.00538699395842341*G0_0_0_1_7 - 0.000713572142143649*G0_0_0_1_8 + 0.00394652966081606*G0_0_0_1_9 - 0.00441900251424136*G0_0_0_2_0 + 0.000375427042093779*G0_0_0_2_1 - 0.00337440337440391*G0_0_0_2_2 + 0.00550814265100073*G0_0_0_2_3 - 0.00902589474018198*G0_0_0_2_4 - 0.00909820338391924*G0_0_0_2_5 + 0.00153116724545323*G0_0_0_2_6 + 0.00353107210250125*G0_0_0_2_7 + 0.000583543440686408*G0_0_0_2_8 + 0.00653822368108193*G0_0_0_2_9 + 0.00384884956313594*G0_0_0_3_0 + 0.00921998636284516*G0_0_0_3_1 + 0.00550814265100073*G0_0_0_3_2 + 0.0540259740259834*G0_0_0_3_3 - 0.00171828171828207*G0_0_0_3_4 - 0.00340231197374118*G0_0_0_3_5 + 0.00396175253318178*G0_0_0_3_6 - 0.0128728414442722*G0_0_0_3_7 + 0.0159497645211958*G0_0_0_3_8 + 0.0139060939060963*G0_0_0_3_9 - 0.00185972757401361*G0_0_0_4_0 - 0.0064690864690876*G0_0_0_4_1 - 0.00902589474018198*G0_0_0_4_2 - 0.00171828171828207*G0_0_0_4_3 - 0.0504752390466762*G0_0_0_4_4 + 0.00425288996717643*G0_0_0_4_5 - 0.0082146425003582*G0_0_0_4_6 - 0.00184387041529927*G0_0_0_4_7 - 0.00307692307692363*G0_0_0_4_8 - 0.0281204509775986*G0_0_0_4_9 - 0.058155178155188*G0_0_0_5_0 - 0.00113854399568703*G0_0_0_5_1 - 0.00909820338391924*G0_0_0_5_2 - 0.00340231197374118*G0_0_0_5_3 + 0.00425288996717643*G0_0_0_5_4 - 0.297942057942108*G0_0_0_5_5 + 0.0539574711003375*G0_0_0_5_6 + 0.00983016983017147*G0_0_0_5_7 + 0.00208933923219672*G0_0_0_5_8 + 0.019317825032114*G0_0_0_5_9 + 0.0204329004329039*G0_0_0_6_0 - 0.00176268176268207*G0_0_0_6_1 + 0.00153116724545323*G0_0_0_6_2 + 0.00396175253318178*G0_0_0_6_3 - 0.0082146425003582*G0_0_0_6_4 + 0.0539574711003375*G0_0_0_6_5 - 0.0246838875410346*G0_0_0_6_6 - 0.0119195090623682*G0_0_0_6_7 + 0.00243185386042568*G0_0_0_6_8 - 0.0275381761096093*G0_0_0_6_9 - 0.00551448551448638*G0_0_0_7_0 + 0.00538699395842341*G0_0_0_7_1 + 0.00353107210250125*G0_0_0_7_2 - 0.0128728414442722*G0_0_0_7_3 - 0.00184387041529927*G0_0_0_7_4 + 0.00983016983017147*G0_0_0_7_5 - 0.0119195090623682*G0_0_0_7_6 + 0.0752847152847276*G0_0_0_7_7 - 0.0332581704010332*G0_0_0_7_8 + 0.0473355216212438*G0_0_0_7_9 + 0.00631368631368738*G0_0_0_8_0 - 0.000713572142143649*G0_0_0_8_1 + 0.000583543440686408*G0_0_0_8_2 + 0.0159497645211958*G0_0_0_8_3 - 0.00307692307692363*G0_0_0_8_4 + 0.00208933923219672*G0_0_0_8_5 + 0.00243185386042568*G0_0_0_8_6 - 0.0332581704010332*G0_0_0_8_7 + 0.0279491936634844*G0_0_0_8_8 - 0.00568574282860088*G0_0_0_8_9 - 0.00783216783216919*G0_0_0_9_0 + 0.00394652966081606*G0_0_0_9_1 + 0.00653822368108193*G0_0_0_9_2 + 0.0139060939060963*G0_0_0_9_3 - 0.0281204509775986*G0_0_0_9_4 + 0.0193178250321139*G0_0_0_9_5 - 0.0275381761096093*G0_0_0_9_6 + 0.0473355216212438*G0_0_0_9_7 - 0.00568574282860088*G0_0_0_9_8 + 0.0854916512059513*G0_0_0_9_9 - 0.00283103140246044*G0_0_1_0_1 + 0.00283103140246049*G0_0_1_0_2 + 0.00232148803577417*G0_0_1_0_3 - 0.00232148803577417*G0_0_1_0_4 + 0.0428105228105304*G0_0_1_0_5 - 0.0157176157176186*G0_0_1_0_6 - 0.0428105228105299*G0_0_1_0_7 + 0.0157176157176183*G0_0_1_0_8 - 0.00283103140246044*G0_0_1_1_0 + 0.0030146925385026*G0_0_1_1_1 + 0.00835862550148407*G0_0_1_1_3 - 0.00534005676862911*G0_0_1_1_4 + 0.00106179534750983*G0_0_1_1_5 - 0.00203035060177953*G0_0_1_1_6 - 0.00919651776794789*G0_0_1_1_7 + 0.00392559821131316*G0_0_1_1_8 - 0.00333761476618675*G0_0_1_1_9 + 0.00283103140246049*G0_0_1_2_0 - 0.00301469253850254*G0_0_1_2_2 + 0.00534005676862909*G0_0_1_2_3 - 0.00835862550148405*G0_0_1_2_4 + 0.00919651776794793*G0_0_1_2_5 - 0.00392559821131318*G0_0_1_2_6 - 0.0010617953475098*G0_0_1_2_7 + 0.0020303506017795*G0_0_1_2_8 + 0.00333761476618677*G0_0_1_2_9 + 0.00232148803577417*G0_0_1_3_0 + 0.00835862550148407*G0_0_1_3_1 + 0.00534005676862909*G0_0_1_3_2 + 0.0502468959611901*G0_0_1_3_3 - 0.00507492507492593*G0_0_1_3_5 + 0.00609105180533855*G0_0_1_3_6 - 0.0069644641073224*G0_0_1_3_7 + 0.0130555159126609*G0_0_1_3_8 + 0.0239417725132051*G0_0_1_3_9 - 0.00232148803577417*G0_0_1_4_0 - 0.00534005676862911*G0_0_1_4_1 - 0.00835862550148405*G0_0_1_4_2 - 0.0502468959611902*G0_0_1_4_4 + 0.00696446410732242*G0_0_1_4_5 - 0.013055515912661*G0_0_1_4_6 + 0.00507492507492592*G0_0_1_4_7 - 0.00609105180533853*G0_0_1_4_8 - 0.0239417725132051*G0_0_1_4_9 + 0.0428105228105304*G0_0_1_5_0 + 0.00106179534750983*G0_0_1_5_1 + 0.00919651776794793*G0_0_1_5_2 - 0.00507492507492594*G0_0_1_5_3 + 0.00696446410732242*G0_0_1_5_4 + 0.0567432567432669*G0_0_1_5_5 - 0.0373112601684095*G0_0_1_5_6 - 0.00318538604252952*G0_0_1_5_8 + 0.00637077208505901*G0_0_1_5_9 - 0.0157176157176186*G0_0_1_6_0 - 0.00203035060177953*G0_0_1_6_1 - 0.00392559821131318*G0_0_1_6_2 + 0.00609105180533855*G0_0_1_6_3 - 0.013055515912661*G0_0_1_6_4 - 0.0373112601684095*G0_0_1_6_5 - 0.00785500214071773*G0_0_1_6_6 + 0.0031853860425294*G0_0_1_6_7 - 0.0221949479092374*G0_0_1_6_9 - 0.0428105228105299*G0_0_1_7_0 - 0.00919651776794789*G0_0_1_7_1 - 0.0010617953475098*G0_0_1_7_2 - 0.00696446410732239*G0_0_1_7_3 + 0.00507492507492592*G0_0_1_7_4 + 0.0031853860425294*G0_0_1_7_6 - 0.0567432567432662*G0_0_1_7_7 + 0.0373112601684093*G0_0_1_7_8 - 0.00637077208505888*G0_0_1_7_9 + 0.0157176157176183*G0_0_1_8_0 + 0.00392559821131316*G0_0_1_8_1 + 0.0020303506017795*G0_0_1_8_2 + 0.0130555159126609*G0_0_1_8_3 - 0.00609105180533853*G0_0_1_8_4 - 0.00318538604252952*G0_0_1_8_5 + 0.0373112601684093*G0_0_1_8_7 + 0.00785500214071778*G0_0_1_8_8 + 0.0221949479092374*G0_0_1_8_9 - 0.00333761476618675*G0_0_1_9_1 + 0.00333761476618677*G0_0_1_9_2 + 0.0239417725132051*G0_0_1_9_3 - 0.0239417725132051*G0_0_1_9_4 + 0.006370772085059*G0_0_1_9_5 - 0.0221949479092374*G0_0_1_9_6 - 0.00637077208505887*G0_0_1_9_7 + 0.0221949479092374*G0_0_1_9_8 - 0.000421588993017645*G0_1_0_0_1 + 0.000421588993017628*G0_1_0_0_2 + 0.00317396888825516*G0_1_0_0_3 - 0.00317396888825516*G0_1_0_0_4 + 0.0011632811632813*G0_1_0_0_5 - 0.00355200355200414*G0_1_0_0_6 - 0.0011632811632815*G0_1_0_0_7 + 0.00355200355200421*G0_1_0_0_8 - 0.000421588993017645*G0_1_0_1_0 + 0.0066659266659279*G0_1_0_1_1 + 0.0102272330843778*G0_1_0_1_3 - 0.00670060098631646*G0_1_0_1_4 + 0.00481803910375421*G0_1_0_1_5 - 0.00181532752961356*G0_1_0_1_6 - 0.00109350966493846*G0_1_0_1_7 + 0.00149437863723607*G0_1_0_1_8 + 0.000421588993017628*G0_1_0_2_0 - 0.00666592666592774*G0_1_0_2_2 + 0.00670060098631643*G0_1_0_2_3 - 0.0102272330843777*G0_1_0_2_4 + 0.00109350966493841*G0_1_0_2_5 - 0.00149437863723603*G0_1_0_2_6 - 0.00481803910375421*G0_1_0_2_7 + 0.00181532752961357*G0_1_0_2_8 + 0.00317396888825516*G0_1_0_3_0 + 0.0102272330843778*G0_1_0_3_1 + 0.00670060098631643*G0_1_0_3_2 + 0.0579534750963422*G0_1_0_3_3 - 0.011988011988014*G0_1_0_3_5 + 0.00544598258884067*G0_1_0_3_6 - 0.00952190666476543*G0_1_0_3_7 + 0.0149678892536061*G0_1_0_3_8 + 0.0193178250321141*G0_1_0_3_9 - 0.00317396888825516*G0_1_0_4_0 - 0.00670060098631646*G0_1_0_4_1 - 0.0102272330843777*G0_1_0_4_2 - 0.0579534750963423*G0_1_0_4_4 + 0.00952190666476545*G0_1_0_4_5 - 0.0149678892536061*G0_1_0_4_6 + 0.011988011988014*G0_1_0_4_7 - 0.00544598258884069*G0_1_0_4_8 - 0.0193178250321141*G0_1_0_4_9 + 0.0011632811632813*G0_1_0_5_0 + 0.00481803910375421*G0_1_0_5_1 + 0.00109350966493841*G0_1_0_5_2 - 0.011988011988014*G0_1_0_5_3 + 0.00952190666476545*G0_1_0_5_4 + 0.0655344655344768*G0_1_0_5_5 + 0.00336806051091833*G0_1_0_5_6 - 0.0144541173112626*G0_1_0_5_8 + 0.0289082346225253*G0_1_0_5_9 - 0.00355200355200414*G0_1_0_6_0 - 0.00181532752961356*G0_1_0_6_1 - 0.00149437863723603*G0_1_0_6_2 + 0.00544598258884067*G0_1_0_6_3 - 0.0149678892536061*G0_1_0_6_4 + 0.00336806051091834*G0_1_0_6_5 - 0.0172855715712889*G0_1_0_6_6 + 0.0144541173112626*G0_1_0_6_7 - 0.0111659768802645*G0_1_0_6_9 - 0.0011632811632815*G0_1_0_7_0 - 0.00109350966493846*G0_1_0_7_1 - 0.00481803910375421*G0_1_0_7_2 - 0.00952190666476543*G0_1_0_7_3 + 0.011988011988014*G0_1_0_7_4 + 0.0144541173112626*G0_1_0_7_6 - 0.0655344655344767*G0_1_0_7_7 - 0.00336806051091812*G0_1_0_7_8 - 0.0289082346225252*G0_1_0_7_9 + 0.00355200355200421*G0_1_0_8_0 + 0.00149437863723607*G0_1_0_8_1 + 0.00181532752961357*G0_1_0_8_2 + 0.0149678892536061*G0_1_0_8_3 - 0.00544598258884069*G0_1_0_8_4 - 0.0144541173112626*G0_1_0_8_5 - 0.00336806051091813*G0_1_0_8_7 + 0.0172855715712891*G0_1_0_8_8 + 0.0111659768802646*G0_1_0_8_9 + 0.0193178250321141*G0_1_0_9_3 - 0.0193178250321141*G0_1_0_9_4 + 0.0289082346225253*G0_1_0_9_5 - 0.0111659768802645*G0_1_0_9_6 - 0.0289082346225252*G0_1_0_9_7 + 0.0111659768802646*G0_1_0_9_8 + 0.0329941663275054*G0_1_1_0_0 + 0.00441900251424137*G0_1_1_0_1 + 0.0012701231748853*G0_1_1_0_2 + 0.00185972757401359*G0_1_1_0_3 - 0.00384884956313594*G0_1_1_0_4 + 0.00551448551448648*G0_1_1_0_5 - 0.00631368631368741*G0_1_1_0_6 + 0.058155178155188*G0_1_1_0_7 - 0.0204329004329039*G0_1_1_0_8 + 0.00783216783216916*G0_1_1_0_9 + 0.00441900251424137*G0_1_1_1_0 + 0.00337440337440397*G0_1_1_1_1 - 0.000375427042093777*G0_1_1_1_2 + 0.00902589474018198*G0_1_1_1_3 - 0.00550814265100073*G0_1_1_1_4 - 0.00353107210250125*G0_1_1_1_5 - 0.000583543440686407*G0_1_1_1_6 + 0.00909820338391922*G0_1_1_1_7 - 0.00153116724545323*G0_1_1_1_8 - 0.00653822368108193*G0_1_1_1_9 + 0.0012701231748853*G0_1_1_2_0 - 0.000375427042093777*G0_1_1_2_1 - 0.00672681815539069*G0_1_1_2_2 + 0.00646908646908756*G0_1_1_2_3 - 0.00921998636284509*G0_1_1_2_4 - 0.00538699395842344*G0_1_1_2_5 + 0.000713572142143683*G0_1_1_2_6 + 0.00113854399568703*G0_1_1_2_7 + 0.00176268176268206*G0_1_1_2_8 - 0.00394652966081604*G0_1_1_2_9 + 0.00185972757401359*G0_1_1_3_0 + 0.00902589474018198*G0_1_1_3_1 + 0.00646908646908756*G0_1_1_3_2 + 0.050475239046676*G0_1_1_3_3 + 0.00171828171828206*G0_1_1_3_4 + 0.00184387041529927*G0_1_1_3_5 + 0.00307692307692363*G0_1_1_3_6 - 0.00425288996717648*G0_1_1_3_7 + 0.00821464250035818*G0_1_1_3_8 + 0.0281204509775986*G0_1_1_3_9 - 0.00384884956313594*G0_1_1_4_0 - 0.00550814265100073*G0_1_1_4_1 - 0.00921998636284509*G0_1_1_4_2 + 0.00171828171828206*G0_1_1_4_3 - 0.0540259740259835*G0_1_1_4_4 + 0.0128728414442722*G0_1_1_4_5 - 0.0159497645211959*G0_1_1_4_6 + 0.00340231197374116*G0_1_1_4_7 - 0.00396175253318178*G0_1_1_4_8 - 0.0139060939060963*G0_1_1_4_9 + 0.00551448551448648*G0_1_1_5_0 - 0.00353107210250125*G0_1_1_5_1 - 0.00538699395842344*G0_1_1_5_2 + 0.00184387041529927*G0_1_1_5_3 + 0.0128728414442722*G0_1_1_5_4 - 0.0752847152847277*G0_1_1_5_5 + 0.0332581704010332*G0_1_1_5_6 - 0.00983016983017149*G0_1_1_5_7 + 0.0119195090623682*G0_1_1_5_8 - 0.0473355216212438*G0_1_1_5_9 - 0.00631368631368741*G0_1_1_6_0 - 0.000583543440686407*G0_1_1_6_1 + 0.000713572142143683*G0_1_1_6_2 + 0.00307692307692363*G0_1_1_6_3 - 0.0159497645211959*G0_1_1_6_4 + 0.0332581704010332*G0_1_1_6_5 - 0.0279491936634842*G0_1_1_6_6 - 0.00208933923219668*G0_1_1_6_7 - 0.0024318538604257*G0_1_1_6_8 + 0.00568574282860086*G0_1_1_6_9 + 0.058155178155188*G0_1_1_7_0 + 0.00909820338391922*G0_1_1_7_1 + 0.00113854399568703*G0_1_1_7_2 - 0.00425288996717648*G0_1_1_7_3 + 0.00340231197374116*G0_1_1_7_4 - 0.00983016983017149*G0_1_1_7_5 - 0.00208933923219669*G0_1_1_7_6 + 0.297942057942108*G0_1_1_7_7 - 0.0539574711003373*G0_1_1_7_8 - 0.0193178250321139*G0_1_1_7_9 - 0.0204329004329039*G0_1_1_8_0 - 0.00153116724545322*G0_1_1_8_1 + 0.00176268176268207*G0_1_1_8_2 + 0.00821464250035817*G0_1_1_8_3 - 0.00396175253318178*G0_1_1_8_4 + 0.0119195090623682*G0_1_1_8_5 - 0.0024318538604257*G0_1_1_8_6 - 0.0539574711003373*G0_1_1_8_7 + 0.0246838875410346*G0_1_1_8_8 + 0.0275381761096093*G0_1_1_8_9 + 0.00783216783216916*G0_1_1_9_0 - 0.00653822368108193*G0_1_1_9_1 - 0.00394652966081604*G0_1_1_9_2 + 0.0281204509775986*G0_1_1_9_3 - 0.0139060939060963*G0_1_1_9_4 - 0.0473355216212438*G0_1_1_9_5 + 0.00568574282860086*G0_1_1_9_6 - 0.0193178250321139*G0_1_1_9_7 + 0.0275381761096093*G0_1_1_9_8 - 0.0854916512059515*G0_1_1_9_9; + A[112] = A[160] - 0.180045880045912*G0_0_0_0_0 - 0.0119945927088805*G0_0_0_0_1 - 0.0028250321107469*G0_0_0_0_2 - 0.0160508539079995*G0_0_0_0_3 + 0.0197704676276139*G0_0_0_0_4 - 0.132304362304385*G0_0_0_0_5 + 0.055268065268075*G0_0_0_0_6 - 0.0501132201132287*G0_0_0_0_7 + 0.00964701964702131*G0_0_0_0_8 - 0.0124675324675347*G0_0_0_0_9 - 0.0119945927088805*G0_0_0_1_0 - 0.182217676503422*G0_0_0_1_1 - 0.00105495034066479*G0_0_0_1_2 - 0.136836972551282*G0_0_0_1_3 + 0.0823609723609864*G0_0_0_1_4 - 0.00987417344560364*G0_0_0_1_5 + 0.0418284096855597*G0_0_0_1_6 + 0.0116221873364752*G0_0_0_1_7 - 0.0571005185290998*G0_0_0_1_8 + 0.016417867846442*G0_0_0_1_9 - 0.00282503211074691*G0_0_0_2_0 - 0.00105495034066479*G0_0_0_2_1 + 0.207620844763737*G0_0_0_2_2 - 0.0798220826792389*G0_0_0_2_3 + 0.151707815993556*G0_0_0_2_4 - 0.0665020693592234*G0_0_0_2_5 + 0.0595333238190481*G0_0_0_2_6 - 0.0183428476285649*G0_0_0_2_7 - 0.0153058845916014*G0_0_0_2_8 - 0.0364521193092683*G0_0_0_2_9 - 0.0160508539079995*G0_0_0_3_0 - 0.136836972551282*G0_0_0_3_1 - 0.0798220826792389*G0_0_0_3_2 - 0.279380619380667*G0_0_0_3_3 - 0.0192514628228946*G0_0_0_3_4 + 0.0307620950478145*G0_0_0_3_5 - 0.109234337091498*G0_0_0_3_6 + 0.0644034536891789*G0_0_0_3_7 - 0.126571999429164*G0_0_0_3_8 - 0.178060510917684*G0_0_0_3_9 + 0.0197704676276139*G0_0_0_4_0 + 0.0823609723609864*G0_0_0_4_1 + 0.151707815993556*G0_0_0_4_2 - 0.0192514628228946*G0_0_0_4_3 + 0.348885400314031*G0_0_0_4_4 - 0.0430605109176611*G0_0_0_4_5 + 0.152294848009159*G0_0_0_4_6 - 0.0102668759811635*G0_0_0_4_7 + 0.0621685457399848*G0_0_0_4_8 + 0.195477379763127*G0_0_0_4_9 - 0.132304362304385*G0_0_0_5_0 - 0.00987417344560364*G0_0_0_5_1 - 0.0665020693592234*G0_0_0_5_2 + 0.0307620950478145*G0_0_0_5_3 - 0.0430605109176611*G0_0_0_5_4 - 0.192107892107925*G0_0_0_5_5 + 0.111178107606698*G0_0_0_5_6 - 0.117152847152867*G0_0_0_5_7 + 0.0458734123019915*G0_0_0_5_8 - 0.0543442272013793*G0_0_0_5_9 + 0.055268065268075*G0_0_0_6_0 + 0.0418284096855597*G0_0_0_6_1 + 0.0595333238190481*G0_0_0_6_2 - 0.109234337091498*G0_0_0_6_3 + 0.152294848009159*G0_0_0_6_4 + 0.111178107606698*G0_0_0_6_5 + 0.617416868845545*G0_0_0_6_6 + 0.0712794348508754*G0_0_0_6_7 - 0.0479092336235274*G0_0_0_6_8 + 0.327825032110802*G0_0_0_6_9 - 0.0501132201132287*G0_0_0_7_0 + 0.0116221873364752*G0_0_0_7_1 - 0.0183428476285649*G0_0_0_7_2 + 0.0644034536891789*G0_0_0_7_3 - 0.0102668759811635*G0_0_0_7_4 - 0.117152847152867*G0_0_0_7_5 + 0.0712794348508754*G0_0_0_7_6 - 0.460399600399677*G0_0_0_7_7 + 0.163736977308433*G0_0_0_7_8 - 0.105156272299147*G0_0_0_7_9 + 0.00964701964702131*G0_0_0_8_0 - 0.0571005185290998*G0_0_0_8_1 - 0.0153058845916014*G0_0_0_8_2 - 0.126571999429164*G0_0_0_8_3 + 0.0621685457399848*G0_0_0_8_4 + 0.0458734123019915*G0_0_0_8_5 - 0.0479092336235275*G0_0_0_8_6 + 0.163736977308433*G0_0_0_8_7 - 0.467181390038612*G0_0_0_8_8 - 0.173590695019296*G0_0_0_8_9 - 0.0124675324675347*G0_0_0_9_0 + 0.016417867846442*G0_0_0_9_1 - 0.0364521193092683*G0_0_0_9_2 - 0.178060510917684*G0_0_0_9_3 + 0.195477379763127*G0_0_0_9_4 - 0.0543442272013793*G0_0_0_9_5 + 0.327825032110802*G0_0_0_9_6 - 0.105156272299147*G0_0_0_9_7 - 0.173590695019296*G0_0_0_9_8 - 0.00354502640216986*G0_0_0_9_9 - 0.00546982118410788*G0_0_1_0_1 + 0.00546982118410784*G0_0_1_0_2 - 0.0194291422862885*G0_0_1_0_3 + 0.0194291422862885*G0_0_1_0_4 + 0.00499167499167571*G0_0_1_0_5 + 0.016150516150519*G0_0_1_0_6 - 0.00499167499167591*G0_0_1_0_7 - 0.0161505161505189*G0_0_1_0_8 - 0.00546982118410788*G0_0_1_1_0 - 0.193833362404824*G0_0_1_1_1 - 0.140778745064483*G0_0_1_1_3 + 0.0801039436753859*G0_0_1_1_4 - 0.00679463393749219*G0_0_1_1_5 + 0.0254788069073827*G0_0_1_1_6 + 0.0255156748013935*G0_0_1_1_7 - 0.0560506160506258*G0_0_1_1_8 + 0.0119922934208668*G0_0_1_1_9 + 0.00546982118410784*G0_0_1_2_0 + 0.193833362404823*G0_0_1_2_2 - 0.0801039436753857*G0_0_1_2_3 + 0.140778745064483*G0_0_1_2_4 - 0.0255156748013934*G0_0_1_2_5 + 0.0560506160506255*G0_0_1_2_6 + 0.00679463393749223*G0_0_1_2_7 - 0.0254788069073826*G0_0_1_2_8 - 0.0119922934208669*G0_0_1_2_9 - 0.0194291422862885*G0_0_1_3_0 - 0.140778745064483*G0_0_1_3_1 - 0.0801039436753857*G0_0_1_3_2 - 0.310742115027882*G0_0_1_3_3 + 0.0393356643356709*G0_0_1_3_5 - 0.0764364207221479*G0_0_1_3_6 + 0.0582874268588653*G0_0_1_3_7 - 0.134723847581013*G0_0_1_3_8 - 0.152551733980331*G0_0_1_3_9 + 0.0194291422862885*G0_0_1_4_0 + 0.0801039436753859*G0_0_1_4_1 + 0.140778745064483*G0_0_1_4_2 + 0.310742115027882*G0_0_1_4_4 - 0.0582874268588653*G0_0_1_4_5 + 0.134723847581013*G0_0_1_4_6 - 0.039335664335671*G0_0_1_4_7 + 0.0764364207221479*G0_0_1_4_8 + 0.152551733980331*G0_0_1_4_9 + 0.00499167499167571*G0_0_1_5_0 - 0.00679463393749219*G0_0_1_5_1 - 0.0255156748013934*G0_0_1_5_2 + 0.0393356643356709*G0_0_1_5_3 - 0.0582874268588653*G0_0_1_5_4 - 0.00011988011987998*G0_0_1_5_5 - 0.0914942200656641*G0_0_1_5_6 + 0.0203839018124767*G0_0_1_5_8 - 0.0407678036249534*G0_0_1_5_9 + 0.016150516150519*G0_0_1_6_0 + 0.0254788069073827*G0_0_1_6_1 + 0.0560506160506255*G0_0_1_6_2 - 0.0764364207221479*G0_0_1_6_3 + 0.134723847581013*G0_0_1_6_4 - 0.0914942200656641*G0_0_1_6_5 + 0.498662765805708*G0_0_1_6_6 - 0.0203839018124766*G0_0_1_6_7 + 0.188849721706897*G0_0_1_6_9 - 0.00499167499167591*G0_0_1_7_0 + 0.0255156748013935*G0_0_1_7_1 + 0.00679463393749223*G0_0_1_7_2 + 0.0582874268588653*G0_0_1_7_3 - 0.039335664335671*G0_0_1_7_4 - 0.0203839018124766*G0_0_1_7_6 + 0.000119880119880175*G0_0_1_7_7 + 0.091494220065664*G0_0_1_7_8 + 0.0407678036249534*G0_0_1_7_9 - 0.0161505161505189*G0_0_1_8_0 - 0.0560506160506257*G0_0_1_8_1 - 0.0254788069073826*G0_0_1_8_2 - 0.134723847581013*G0_0_1_8_3 + 0.0764364207221479*G0_0_1_8_4 + 0.0203839018124767*G0_0_1_8_5 + 0.091494220065664*G0_0_1_8_7 - 0.498662765805708*G0_0_1_8_8 - 0.188849721706897*G0_0_1_8_9 + 0.0119922934208668*G0_0_1_9_1 - 0.0119922934208669*G0_0_1_9_2 - 0.152551733980331*G0_0_1_9_3 + 0.152551733980331*G0_0_1_9_4 - 0.0407678036249534*G0_0_1_9_5 + 0.188849721706897*G0_0_1_9_6 + 0.0407678036249534*G0_0_1_9_7 - 0.188849721706897*G0_0_1_9_8 - 0.00546982118410788*G0_1_0_0_1 + 0.00546982118410784*G0_1_0_0_2 - 0.0194291422862885*G0_1_0_0_3 + 0.0194291422862885*G0_1_0_0_4 + 0.00499167499167571*G0_1_0_0_5 + 0.016150516150519*G0_1_0_0_6 - 0.00499167499167591*G0_1_0_0_7 - 0.0161505161505189*G0_1_0_0_8 - 0.00546982118410788*G0_1_0_1_0 - 0.193833362404824*G0_1_0_1_1 - 0.140778745064483*G0_1_0_1_3 + 0.0801039436753859*G0_1_0_1_4 - 0.00679463393749219*G0_1_0_1_5 + 0.0254788069073827*G0_1_0_1_6 + 0.0255156748013935*G0_1_0_1_7 - 0.0560506160506257*G0_1_0_1_8 + 0.0119922934208668*G0_1_0_1_9 + 0.00546982118410784*G0_1_0_2_0 + 0.193833362404823*G0_1_0_2_2 - 0.0801039436753857*G0_1_0_2_3 + 0.140778745064483*G0_1_0_2_4 - 0.0255156748013934*G0_1_0_2_5 + 0.0560506160506255*G0_1_0_2_6 + 0.00679463393749223*G0_1_0_2_7 - 0.0254788069073826*G0_1_0_2_8 - 0.0119922934208669*G0_1_0_2_9 - 0.0194291422862885*G0_1_0_3_0 - 0.140778745064483*G0_1_0_3_1 - 0.0801039436753857*G0_1_0_3_2 - 0.310742115027882*G0_1_0_3_3 + 0.0393356643356709*G0_1_0_3_5 - 0.0764364207221479*G0_1_0_3_6 + 0.0582874268588653*G0_1_0_3_7 - 0.134723847581013*G0_1_0_3_8 - 0.152551733980331*G0_1_0_3_9 + 0.0194291422862885*G0_1_0_4_0 + 0.0801039436753859*G0_1_0_4_1 + 0.140778745064483*G0_1_0_4_2 + 0.310742115027882*G0_1_0_4_4 - 0.0582874268588653*G0_1_0_4_5 + 0.134723847581013*G0_1_0_4_6 - 0.039335664335671*G0_1_0_4_7 + 0.0764364207221479*G0_1_0_4_8 + 0.152551733980331*G0_1_0_4_9 + 0.00499167499167571*G0_1_0_5_0 - 0.00679463393749219*G0_1_0_5_1 - 0.0255156748013934*G0_1_0_5_2 + 0.0393356643356709*G0_1_0_5_3 - 0.0582874268588653*G0_1_0_5_4 - 0.000119880119879984*G0_1_0_5_5 - 0.0914942200656641*G0_1_0_5_6 + 0.0203839018124767*G0_1_0_5_8 - 0.0407678036249534*G0_1_0_5_9 + 0.016150516150519*G0_1_0_6_0 + 0.0254788069073827*G0_1_0_6_1 + 0.0560506160506255*G0_1_0_6_2 - 0.0764364207221479*G0_1_0_6_3 + 0.134723847581013*G0_1_0_6_4 - 0.0914942200656641*G0_1_0_6_5 + 0.498662765805708*G0_1_0_6_6 - 0.0203839018124766*G0_1_0_6_7 + 0.188849721706897*G0_1_0_6_9 - 0.00499167499167591*G0_1_0_7_0 + 0.0255156748013935*G0_1_0_7_1 + 0.00679463393749223*G0_1_0_7_2 + 0.0582874268588653*G0_1_0_7_3 - 0.039335664335671*G0_1_0_7_4 - 0.0203839018124766*G0_1_0_7_6 + 0.000119880119880175*G0_1_0_7_7 + 0.091494220065664*G0_1_0_7_8 + 0.0407678036249534*G0_1_0_7_9 - 0.0161505161505189*G0_1_0_8_0 - 0.0560506160506257*G0_1_0_8_1 - 0.0254788069073826*G0_1_0_8_2 - 0.134723847581013*G0_1_0_8_3 + 0.0764364207221479*G0_1_0_8_4 + 0.0203839018124767*G0_1_0_8_5 + 0.091494220065664*G0_1_0_8_7 - 0.498662765805708*G0_1_0_8_8 - 0.188849721706897*G0_1_0_8_9 + 0.0119922934208668*G0_1_0_9_1 - 0.0119922934208669*G0_1_0_9_2 - 0.152551733980331*G0_1_0_9_3 + 0.152551733980331*G0_1_0_9_4 - 0.0407678036249534*G0_1_0_9_5 + 0.188849721706897*G0_1_0_9_6 + 0.0407678036249534*G0_1_0_9_7 - 0.188849721706897*G0_1_0_9_8 + 0.180045880045911*G0_1_1_0_0 + 0.00282503211074684*G0_1_1_0_1 + 0.0119945927088805*G0_1_1_0_2 - 0.019770467627614*G0_1_1_0_3 + 0.0160508539079996*G0_1_1_0_4 + 0.0501132201132286*G0_1_1_0_5 - 0.00964701964702114*G0_1_1_0_6 + 0.132304362304385*G0_1_1_0_7 - 0.0552680652680747*G0_1_1_0_8 + 0.0124675324675347*G0_1_1_0_9 + 0.00282503211074684*G0_1_1_1_0 - 0.207620844763737*G0_1_1_1_1 + 0.00105495034066482*G0_1_1_1_2 - 0.151707815993556*G0_1_1_1_3 + 0.0798220826792391*G0_1_1_1_4 + 0.018342847628565*G0_1_1_1_5 + 0.0153058845916015*G0_1_1_1_6 + 0.0665020693592236*G0_1_1_1_7 - 0.0595333238190484*G0_1_1_1_8 + 0.0364521193092683*G0_1_1_1_9 + 0.0119945927088805*G0_1_1_2_0 + 0.00105495034066482*G0_1_1_2_1 + 0.182217676503421*G0_1_1_2_2 - 0.0823609723609862*G0_1_1_2_3 + 0.136836972551281*G0_1_1_2_4 - 0.011622187336475*G0_1_1_2_5 + 0.0571005185290996*G0_1_1_2_6 + 0.00987417344560366*G0_1_1_2_7 - 0.0418284096855596*G0_1_1_2_8 - 0.0164178678464421*G0_1_1_2_9 - 0.019770467627614*G0_1_1_3_0 - 0.151707815993556*G0_1_1_3_1 - 0.0823609723609862*G0_1_1_3_2 - 0.348885400314031*G0_1_1_3_3 + 0.0192514628228947*G0_1_1_3_4 + 0.0102668759811635*G0_1_1_3_5 - 0.0621685457399847*G0_1_1_3_6 + 0.0430605109176611*G0_1_1_3_7 - 0.152294848009159*G0_1_1_3_8 - 0.195477379763127*G0_1_1_3_9 + 0.0160508539079996*G0_1_1_4_0 + 0.0798220826792391*G0_1_1_4_1 + 0.136836972551281*G0_1_1_4_2 + 0.0192514628228947*G0_1_1_4_3 + 0.279380619380667*G0_1_1_4_4 - 0.0644034536891789*G0_1_1_4_5 + 0.126571999429164*G0_1_1_4_6 - 0.0307620950478145*G0_1_1_4_7 + 0.109234337091498*G0_1_1_4_8 + 0.178060510917684*G0_1_1_4_9 + 0.0501132201132286*G0_1_1_5_0 + 0.018342847628565*G0_1_1_5_1 - 0.011622187336475*G0_1_1_5_2 + 0.0102668759811635*G0_1_1_5_3 - 0.0644034536891789*G0_1_1_5_4 + 0.460399600399678*G0_1_1_5_5 - 0.163736977308434*G0_1_1_5_6 + 0.117152847152867*G0_1_1_5_7 - 0.0712794348508753*G0_1_1_5_8 + 0.105156272299147*G0_1_1_5_9 - 0.00964701964702114*G0_1_1_6_0 + 0.0153058845916015*G0_1_1_6_1 + 0.0571005185290996*G0_1_1_6_2 - 0.0621685457399847*G0_1_1_6_3 + 0.126571999429164*G0_1_1_6_4 - 0.163736977308434*G0_1_1_6_5 + 0.467181390038612*G0_1_1_6_6 - 0.0458734123019914*G0_1_1_6_7 + 0.0479092336235274*G0_1_1_6_8 + 0.173590695019296*G0_1_1_6_9 + 0.132304362304385*G0_1_1_7_0 + 0.0665020693592236*G0_1_1_7_1 + 0.00987417344560366*G0_1_1_7_2 + 0.0430605109176611*G0_1_1_7_3 - 0.0307620950478145*G0_1_1_7_4 + 0.117152847152867*G0_1_1_7_5 - 0.0458734123019914*G0_1_1_7_6 + 0.192107892107924*G0_1_1_7_7 - 0.111178107606698*G0_1_1_7_8 + 0.0543442272013792*G0_1_1_7_9 - 0.0552680652680747*G0_1_1_8_0 - 0.0595333238190484*G0_1_1_8_1 - 0.0418284096855596*G0_1_1_8_2 - 0.152294848009159*G0_1_1_8_3 + 0.109234337091498*G0_1_1_8_4 - 0.0712794348508753*G0_1_1_8_5 + 0.0479092336235274*G0_1_1_8_6 - 0.111178107606698*G0_1_1_8_7 - 0.617416868845545*G0_1_1_8_8 - 0.327825032110802*G0_1_1_8_9 + 0.0124675324675347*G0_1_1_9_0 + 0.0364521193092683*G0_1_1_9_1 - 0.0164178678464421*G0_1_1_9_2 - 0.195477379763127*G0_1_1_9_3 + 0.178060510917684*G0_1_1_9_4 + 0.105156272299147*G0_1_1_9_5 + 0.173590695019296*G0_1_1_9_6 + 0.0543442272013792*G0_1_1_9_7 - 0.327825032110802*G0_1_1_9_8 + 0.00354502640216942*G0_1_1_9_9; + A[210] = A[14] - 0.000797104130437604*G0_0_1_0_1 + 0.000801544134877603*G0_0_1_0_2 + 0.000493950493950587*G0_0_1_0_3 - 0.000498390498390587*G0_0_1_0_4 + 0.0109668109668128*G0_0_1_0_5 - 0.00674880674880789*G0_0_1_0_6 - 0.0109668109668128*G0_0_1_0_7 + 0.00275280275280323*G0_0_1_0_8 + 0.00399600399600467*G0_0_1_0_9 - 0.000797104130437604*G0_0_1_1_0 + 0.000273025034929861*G0_0_1_1_1 - 0.000408321836893327*G0_0_1_1_3 + 0.000216291644863099*G0_0_1_1_4 + 0.00124462838748574*G0_0_1_1_5 - 0.00139891854177592*G0_0_1_1_6 - 0.0022269793698369*G0_0_1_1_7 - 0.00142825428539737*G0_0_1_1_8 - 0.00371628371628435*G0_0_1_1_9 + 0.000801544134877603*G0_0_1_2_0 + 0.0023729357062694*G0_0_1_2_2 + 0.00094556237413391*G0_0_1_2_4 + 0.00223522509236832*G0_0_1_2_5 - 0.00435770578627795*G0_0_1_2_6 - 0.000133992991135872*G0_0_1_2_7 + 0.000287014572728908*G0_0_1_2_8 - 0.00133390419104728*G0_0_1_2_9 + 0.000493950493950587*G0_0_1_3_0 - 0.000408321836893327*G0_0_1_3_1 - 0.00175538746967352*G0_0_1_3_3 - 0.00102754388468687*G0_0_1_3_4 - 0.00287141429998621*G0_0_1_3_5 + 0.00472384758099123*G0_0_1_3_6 - 0.000954759526188249*G0_0_1_3_7 + 0.00128871128871151*G0_0_1_3_8 + 0.0130583702012296*G0_0_1_3_9 - 0.000498390498390587*G0_0_1_4_0 + 0.000216291644863099*G0_0_1_4_1 + 0.000945562374133908*G0_0_1_4_2 - 0.00102754388468687*G0_0_1_4_3 - 0.000299700299700445*G0_0_1_4_4 + 0.00202226345083522*G0_0_1_4_5 - 0.00674611103182646*G0_0_1_4_6 + 0.00068502925645794*G0_0_1_4_7 - 0.000333951762523249*G0_0_1_4_8 + 0.0109668109668128*G0_0_1_5_0 + 0.00124462838748574*G0_0_1_5_1 + 0.00223522509236832*G0_0_1_5_2 - 0.00287141429998621*G0_0_1_5_3 + 0.00202226345083522*G0_0_1_5_4 + 0.0271928071928118*G0_0_1_5_5 + 0.00438561438561516*G0_0_1_5_6 + 0.00227772227772264*G0_0_1_5_7 - 0.00320679320679373*G0_0_1_5_8 - 0.00557442557442654*G0_0_1_5_9 - 0.00674880674880789*G0_0_1_6_0 - 0.00139891854177592*G0_0_1_6_1 - 0.00435770578627795*G0_0_1_6_2 + 0.00472384758099123*G0_0_1_6_3 - 0.00674611103182646*G0_0_1_6_4 + 0.00438561438561516*G0_0_1_6_5 - 0.0318824033109801*G0_0_1_6_6 + 0.000929070929071096*G0_0_1_6_7 + 0.00140430997573877*G0_0_1_6_8 - 0.00544598258884061*G0_0_1_6_9 - 0.0109668109668128*G0_0_1_7_0 - 0.0022269793698369*G0_0_1_7_1 - 0.000133992991135872*G0_0_1_7_2 - 0.000954759526188249*G0_0_1_7_3 + 0.00068502925645794*G0_0_1_7_4 + 0.00227772227772264*G0_0_1_7_5 + 0.000929070929071095*G0_0_1_7_6 - 0.0317482517482572*G0_0_1_7_7 + 0.0173126873126902*G0_0_1_7_8 - 0.0138461538461562*G0_0_1_7_9 + 0.00275280275280323*G0_0_1_8_0 - 0.00142825428539737*G0_0_1_8_1 + 0.000287014572728908*G0_0_1_8_2 + 0.00128871128871151*G0_0_1_8_3 - 0.000333951762523248*G0_0_1_8_4 - 0.00320679320679373*G0_0_1_8_5 + 0.00140430997573877*G0_0_1_8_6 + 0.0173126873126902*G0_0_1_8_7 - 0.010383901812475*G0_0_1_8_8 + 0.0118167546738995*G0_0_1_8_9 + 0.00399600399600467*G0_0_1_9_0 - 0.00371628371628435*G0_0_1_9_1 - 0.00133390419104728*G0_0_1_9_2 + 0.0130583702012296*G0_0_1_9_3 - 0.00557442557442654*G0_0_1_9_5 - 0.00544598258884061*G0_0_1_9_6 - 0.0138461538461562*G0_0_1_9_7 + 0.0118167546738995*G0_0_1_9_8 + 0.0267161410018598*G0_0_1_9_9 + 0.000797104130437604*G0_1_0_0_1 - 0.000801544134877603*G0_1_0_0_2 - 0.000493950493950587*G0_1_0_0_3 + 0.000498390498390587*G0_1_0_0_4 - 0.0109668109668128*G0_1_0_0_5 + 0.00674880674880789*G0_1_0_0_6 + 0.0109668109668128*G0_1_0_0_7 - 0.00275280275280323*G0_1_0_0_8 - 0.00399600399600467*G0_1_0_0_9 + 0.000797104130437604*G0_1_0_1_0 - 0.000273025034929861*G0_1_0_1_1 + 0.000408321836893326*G0_1_0_1_3 - 0.000216291644863098*G0_1_0_1_4 - 0.00124462838748574*G0_1_0_1_5 + 0.00139891854177592*G0_1_0_1_6 + 0.0022269793698369*G0_1_0_1_7 + 0.00142825428539737*G0_1_0_1_8 + 0.00371628371628435*G0_1_0_1_9 - 0.000801544134877603*G0_1_0_2_0 - 0.0023729357062694*G0_1_0_2_2 - 0.000945562374133912*G0_1_0_2_4 - 0.00223522509236832*G0_1_0_2_5 + 0.00435770578627795*G0_1_0_2_6 + 0.000133992991135872*G0_1_0_2_7 - 0.000287014572728908*G0_1_0_2_8 + 0.00133390419104728*G0_1_0_2_9 - 0.000493950493950587*G0_1_0_3_0 + 0.000408321836893326*G0_1_0_3_1 + 0.00175538746967351*G0_1_0_3_3 + 0.00102754388468688*G0_1_0_3_4 + 0.00287141429998621*G0_1_0_3_5 - 0.00472384758099123*G0_1_0_3_6 + 0.000954759526188249*G0_1_0_3_7 - 0.00128871128871151*G0_1_0_3_8 - 0.0130583702012296*G0_1_0_3_9 + 0.000498390498390587*G0_1_0_4_0 - 0.000216291644863098*G0_1_0_4_1 - 0.00094556237413391*G0_1_0_4_2 + 0.00102754388468688*G0_1_0_4_3 + 0.000299700299700445*G0_1_0_4_4 - 0.00202226345083522*G0_1_0_4_5 + 0.00674611103182646*G0_1_0_4_6 - 0.00068502925645794*G0_1_0_4_7 + 0.000333951762523248*G0_1_0_4_8 - 0.0109668109668128*G0_1_0_5_0 - 0.00124462838748574*G0_1_0_5_1 - 0.00223522509236832*G0_1_0_5_2 + 0.00287141429998621*G0_1_0_5_3 - 0.00202226345083522*G0_1_0_5_4 - 0.0271928071928118*G0_1_0_5_5 - 0.00438561438561516*G0_1_0_5_6 - 0.00227772227772264*G0_1_0_5_7 + 0.00320679320679373*G0_1_0_5_8 + 0.00557442557442654*G0_1_0_5_9 + 0.00674880674880789*G0_1_0_6_0 + 0.00139891854177592*G0_1_0_6_1 + 0.00435770578627795*G0_1_0_6_2 - 0.00472384758099123*G0_1_0_6_3 + 0.00674611103182646*G0_1_0_6_4 - 0.00438561438561516*G0_1_0_6_5 + 0.0318824033109801*G0_1_0_6_6 - 0.000929070929071097*G0_1_0_6_7 - 0.00140430997573877*G0_1_0_6_8 + 0.00544598258884061*G0_1_0_6_9 + 0.0109668109668128*G0_1_0_7_0 + 0.0022269793698369*G0_1_0_7_1 + 0.000133992991135872*G0_1_0_7_2 + 0.000954759526188248*G0_1_0_7_3 - 0.00068502925645794*G0_1_0_7_4 - 0.00227772227772264*G0_1_0_7_5 - 0.000929070929071095*G0_1_0_7_6 + 0.0317482517482572*G0_1_0_7_7 - 0.0173126873126902*G0_1_0_7_8 + 0.0138461538461562*G0_1_0_7_9 - 0.00275280275280323*G0_1_0_8_0 + 0.00142825428539737*G0_1_0_8_1 - 0.000287014572728908*G0_1_0_8_2 - 0.00128871128871151*G0_1_0_8_3 + 0.000333951762523248*G0_1_0_8_4 + 0.00320679320679373*G0_1_0_8_5 - 0.00140430997573877*G0_1_0_8_6 - 0.0173126873126902*G0_1_0_8_7 + 0.010383901812475*G0_1_0_8_8 - 0.0118167546738995*G0_1_0_8_9 - 0.00399600399600467*G0_1_0_9_0 + 0.00371628371628435*G0_1_0_9_1 + 0.00133390419104728*G0_1_0_9_2 - 0.0130583702012296*G0_1_0_9_3 + 0.00557442557442654*G0_1_0_9_5 + 0.00544598258884061*G0_1_0_9_6 + 0.0138461538461562*G0_1_0_9_7 - 0.0118167546738995*G0_1_0_9_8 - 0.0267161410018598*G0_1_0_9_9; + A[17] = 0.000626774019631273*G0_0_1_0_0 - 0.000620316081625717*G0_0_1_0_1 - 0.000620316081625712*G0_0_1_0_2 - 2.49915428487123e-06*G0_0_1_0_3 - 2.49915428486799e-06*G0_0_1_0_4 + 0.000135291296005608*G0_0_1_0_5 - 0.000873214087499952*G0_0_1_0_6 + 0.000135291296005611*G0_0_1_0_7 - 0.000873214087499958*G0_0_1_0_8 - 0.000436963829821046*G0_0_1_0_9 - 0.000620316081625717*G0_0_1_1_0 - 0.0108191962358648*G0_0_1_1_1 - 0.000523948604305839*G0_0_1_1_2 - 0.00189433251933287*G0_0_1_1_3 + 0.00115463240463261*G0_0_1_1_4 + 0.000174902808831416*G0_0_1_1_5 - 0.000227512236440849*G0_0_1_1_6 + 0.00269179894179942*G0_0_1_1_7 - 0.00659231971732089*G0_0_1_1_8 - 0.000290959040959097*G0_0_1_1_9 - 0.000620316081625712*G0_0_1_2_0 - 0.000523948604305839*G0_0_1_2_1 - 0.0108191962358647*G0_0_1_2_2 + 0.00115463240463259*G0_0_1_2_3 - 0.00189433251933284*G0_0_1_2_4 + 0.00269179894179939*G0_0_1_2_5 - 0.00659231971732082*G0_0_1_2_6 + 0.00017490280883141*G0_0_1_2_7 - 0.000227512236440849*G0_0_1_2_8 - 0.000290959040959089*G0_0_1_2_9 - 2.49915428487123e-06*G0_0_1_3_0 - 0.00189433251933287*G0_0_1_3_1 + 0.0011546324046326*G0_0_1_3_2 + 0.00248709623709665*G0_0_1_3_3 - 0.000727858451072852*G0_0_1_3_4 - 0.000513325959754615*G0_0_1_3_5 + 0.00119197766519215*G0_0_1_3_6 + 0.000516938418724229*G0_0_1_3_7 - 0.00170891608391639*G0_0_1_3_8 - 0.000160999714571169*G0_0_1_3_9 - 2.49915428486801e-06*G0_0_1_4_0 + 0.00115463240463261*G0_0_1_4_1 - 0.00189433251933284*G0_0_1_4_2 - 0.000727858451072852*G0_0_1_4_3 + 0.00248709623709665*G0_0_1_4_4 + 0.000516938418724219*G0_0_1_4_5 - 0.00170891608391637*G0_0_1_4_6 - 0.000513325959754622*G0_0_1_4_7 + 0.00119197766519216*G0_0_1_4_8 - 0.000160999714571171*G0_0_1_4_9 + 0.000135291296005608*G0_0_1_5_0 + 0.000174902808831416*G0_0_1_5_1 + 0.00269179894179939*G0_0_1_5_2 - 0.000513325959754615*G0_0_1_5_3 + 0.000516938418724219*G0_0_1_5_4 - 0.00261839351125108*G0_0_1_5_5 + 0.00481814316635826*G0_0_1_5_6 + 3.05349412492319e-05*G0_0_1_5_7 - 1.52674706246116e-05*G0_0_1_5_8 + 0.00134142643071237*G0_0_1_5_9 - 0.000873214087499952*G0_0_1_6_0 - 0.000227512236440849*G0_0_1_6_1 - 0.00659231971732082*G0_0_1_6_2 + 0.00119197766519215*G0_0_1_6_3 - 0.00170891608391637*G0_0_1_6_4 + 0.00481814316635826*G0_0_1_6_5 - 0.0107513320013338*G0_0_1_6_6 - 1.52674706246164e-05*G0_0_1_6_7 + 0.000427816231387729*G0_0_1_6_8 - 0.00151107820750703*G0_0_1_6_9 + 0.000135291296005611*G0_0_1_7_0 + 0.00269179894179942*G0_0_1_7_1 + 0.00017490280883141*G0_0_1_7_2 + 0.000516938418724228*G0_0_1_7_3 - 0.000513325959754622*G0_0_1_7_4 + 3.05349412492319e-05*G0_0_1_7_5 - 1.52674706246164e-05*G0_0_1_7_6 - 0.0026183935112511*G0_0_1_7_7 + 0.00481814316635829*G0_0_1_7_8 + 0.00134142643071237*G0_0_1_7_9 - 0.000873214087499958*G0_0_1_8_0 - 0.00659231971732089*G0_0_1_8_1 - 0.000227512236440849*G0_0_1_8_2 - 0.00170891608391639*G0_0_1_8_3 + 0.00119197766519216*G0_0_1_8_4 - 1.52674706246116e-05*G0_0_1_8_5 + 0.000427816231387729*G0_0_1_8_6 + 0.00481814316635829*G0_0_1_8_7 - 0.0107513320013339*G0_0_1_8_8 - 0.00151107820750704*G0_0_1_8_9 - 0.000436963829821046*G0_0_1_9_0 - 0.000290959040959097*G0_0_1_9_1 - 0.000290959040959089*G0_0_1_9_2 - 0.000160999714571169*G0_0_1_9_3 - 0.000160999714571171*G0_0_1_9_4 + 0.00134142643071237*G0_0_1_9_5 - 0.00151107820750703*G0_0_1_9_6 + 0.00134142643071237*G0_0_1_9_7 - 0.00151107820750704*G0_0_1_9_8 - 0.00183352361923822*G0_0_1_9_9; + A[2] = -A[17] + 0.011445970255496*G0_0_1_0_0 - 0.000177401963116286*G0_0_1_0_3 + 0.000225013082155981*G0_0_1_0_4 + 0.00202962381533845*G0_0_1_0_5 - 0.00202784649213255*G0_0_1_0_6 + 0.00672761101332644*G0_0_1_0_7 - 0.00356501302929936*G0_0_1_0_8 - 0.000146004788861948*G0_0_1_0_9 - 0.0114459702554961*G0_0_1_1_1 - 0.00202962381533848*G0_0_1_1_3 + 0.00202784649213256*G0_0_1_1_4 + 0.000177401963116286*G0_0_1_1_5 - 0.000225013082155981*G0_0_1_1_6 + 0.00356501302929937*G0_0_1_1_7 - 0.00672761101332649*G0_0_1_1_8 + 0.00014600478886195*G0_0_1_1_9 - 0.0015371665371668*G0_0_1_2_3 + 0.00469798719798799*G0_0_1_2_4 + 0.00153716653716679*G0_0_1_2_5 - 0.00469798719798798*G0_0_1_2_6 + 0.000402415045272256*G0_0_1_2_7 - 0.000402415045272258*G0_0_1_2_8 - 0.000177401963116286*G0_0_1_3_0 - 0.00202962381533848*G0_0_1_3_1 - 0.0015371665371668*G0_0_1_3_2 + 0.00510548974834775*G0_0_1_3_3 - 0.00554600161743111*G0_0_1_3_4 + 0.000675039246467929*G0_0_1_3_6 + 0.000532205889348839*G0_0_1_3_7 - 0.00173945102516562*G0_0_1_3_8 - 0.00150242614528354*G0_0_1_3_9 + 0.000225013082155981*G0_0_1_4_0 + 0.00202784649213256*G0_0_1_4_1 + 0.00469798719798799*G0_0_1_4_2 - 0.00554600161743111*G0_0_1_4_3 + 0.0132384282384305*G0_0_1_4_4 - 0.000675039246467933*G0_0_1_4_5 - 0.000941142191142353*G0_0_1_4_7 + 0.00120724513581678*G0_0_1_4_8 + 0.00135007849293586*G0_0_1_4_9 + 0.00202962381533845*G0_0_1_5_0 + 0.000177401963116286*G0_0_1_5_1 + 0.00153716653716679*G0_0_1_5_2 - 0.000675039246467934*G0_0_1_5_4 - 0.00510548974834773*G0_0_1_5_5 + 0.00554600161743111*G0_0_1_5_6 + 0.0017394510251656*G0_0_1_5_7 - 0.000532205889348833*G0_0_1_5_8 + 0.00150242614528354*G0_0_1_5_9 - 0.00202784649213255*G0_0_1_6_0 - 0.000225013082155981*G0_0_1_6_1 - 0.00469798719798798*G0_0_1_6_2 + 0.000675039246467929*G0_0_1_6_3 + 0.00554600161743112*G0_0_1_6_5 - 0.0132384282384305*G0_0_1_6_6 - 0.00120724513581677*G0_0_1_6_7 + 0.000941142191142346*G0_0_1_6_8 - 0.00135007849293586*G0_0_1_6_9 + 0.00672761101332644*G0_0_1_7_0 + 0.00356501302929937*G0_0_1_7_1 + 0.000402415045272256*G0_0_1_7_2 + 0.000532205889348839*G0_0_1_7_3 - 0.000941142191142352*G0_0_1_7_4 + 0.0017394510251656*G0_0_1_7_5 - 0.00120724513581677*G0_0_1_7_6 + 0.00813293849008271*G0_0_1_7_7 + 0.00285250463821941*G0_0_1_7_9 - 0.00356501302929936*G0_0_1_8_0 - 0.00672761101332649*G0_0_1_8_1 - 0.000402415045272257*G0_0_1_8_2 - 0.00173945102516562*G0_0_1_8_3 + 0.00120724513581678*G0_0_1_8_4 - 0.000532205889348833*G0_0_1_8_5 + 0.000941142191142346*G0_0_1_8_6 - 0.00813293849008276*G0_0_1_8_8 - 0.00285250463821941*G0_0_1_8_9 - 0.000146004788861948*G0_0_1_9_0 + 0.00014600478886195*G0_0_1_9_1 - 0.00150242614528354*G0_0_1_9_3 + 0.00135007849293586*G0_0_1_9_4 + 0.00150242614528354*G0_0_1_9_5 - 0.00135007849293586*G0_0_1_9_6 + 0.00285250463821941*G0_0_1_9_7 - 0.00285250463821941*G0_0_1_9_8 + 0.0108191962358647*G0_1_1_0_0 + 0.000620316081625712*G0_1_1_0_1 + 0.00052394860430584*G0_1_1_0_2 - 0.000174902808831416*G0_1_1_0_3 + 0.000227512236440852*G0_1_1_0_4 + 0.00189433251933284*G0_1_1_0_5 - 0.0011546324046326*G0_1_1_0_6 + 0.00659231971732084*G0_1_1_0_7 - 0.0026917989417994*G0_1_1_0_8 + 0.000290959040959099*G0_1_1_0_9 + 0.000620316081625712*G0_1_1_1_0 - 0.00062677401963128*G0_1_1_1_1 + 0.000620316081625715*G0_1_1_1_2 - 0.000135291296005611*G0_1_1_1_3 + 0.000873214087499956*G0_1_1_1_4 + 0.000873214087499954*G0_1_1_1_7 - 0.000135291296005612*G0_1_1_1_8 + 0.000436963829821047*G0_1_1_1_9 + 0.00052394860430584*G0_1_1_2_0 + 0.000620316081625715*G0_1_1_2_1 + 0.0108191962358648*G0_1_1_2_2 - 0.00269179894179941*G0_1_1_2_3 + 0.00659231971732087*G0_1_1_2_4 - 0.00115463240463262*G0_1_1_2_5 + 0.00189433251933288*G0_1_1_2_6 + 0.000227512236440846*G0_1_1_2_7 - 0.00017490280883141*G0_1_1_2_8 + 0.000290959040959094*G0_1_1_2_9 - 0.000174902808831416*G0_1_1_3_0 - 0.000135291296005611*G0_1_1_3_1 - 0.00269179894179941*G0_1_1_3_2 + 0.00261839351125111*G0_1_1_3_3 - 0.00481814316635828*G0_1_1_3_4 + 0.00051332595975462*G0_1_1_3_5 - 0.000516938418724229*G0_1_1_3_6 - 0.00134142643071237*G0_1_1_3_9 + 0.000227512236440852*G0_1_1_4_0 + 0.000873214087499956*G0_1_1_4_1 + 0.00659231971732087*G0_1_1_4_2 - 0.00481814316635828*G0_1_1_4_3 + 0.0107513320013339*G0_1_1_4_4 - 0.00119197766519216*G0_1_1_4_5 + 0.00170891608391639*G0_1_1_4_6 - 0.000427816231387732*G0_1_1_4_7 + 0.00151107820750704*G0_1_1_4_9 + 0.00189433251933284*G0_1_1_5_0 - 0.00115463240463262*G0_1_1_5_2 + 0.00051332595975462*G0_1_1_5_3 - 0.00119197766519216*G0_1_1_5_4 - 0.00248709623709664*G0_1_1_5_5 + 0.00072785845107284*G0_1_1_5_6 + 0.00170891608391637*G0_1_1_5_7 - 0.000516938418724222*G0_1_1_5_8 + 0.000160999714571166*G0_1_1_5_9 - 0.0011546324046326*G0_1_1_6_0 + 0.00189433251933288*G0_1_1_6_2 - 0.000516938418724229*G0_1_1_6_3 + 0.00170891608391639*G0_1_1_6_4 + 0.00072785845107284*G0_1_1_6_5 - 0.00248709623709662*G0_1_1_6_6 - 0.00119197766519215*G0_1_1_6_7 + 0.000513325959754618*G0_1_1_6_8 + 0.000160999714571176*G0_1_1_6_9 + 0.00659231971732084*G0_1_1_7_0 + 0.000873214087499954*G0_1_1_7_1 + 0.000227512236440846*G0_1_1_7_2 - 0.000427816231387732*G0_1_1_7_4 + 0.00170891608391637*G0_1_1_7_5 - 0.00119197766519215*G0_1_1_7_6 + 0.0107513320013338*G0_1_1_7_7 - 0.00481814316635827*G0_1_1_7_8 + 0.00151107820750704*G0_1_1_7_9 - 0.0026917989417994*G0_1_1_8_0 - 0.000135291296005612*G0_1_1_8_1 - 0.00017490280883141*G0_1_1_8_2 - 0.000516938418724222*G0_1_1_8_5 + 0.000513325959754618*G0_1_1_8_6 - 0.00481814316635827*G0_1_1_8_7 + 0.00261839351125108*G0_1_1_8_8 - 0.00134142643071237*G0_1_1_8_9 + 0.000290959040959099*G0_1_1_9_0 + 0.000436963829821047*G0_1_1_9_1 + 0.000290959040959094*G0_1_1_9_2 - 0.00134142643071237*G0_1_1_9_3 + 0.00151107820750704*G0_1_1_9_4 + 0.000160999714571166*G0_1_1_9_5 + 0.000160999714571176*G0_1_1_9_6 + 0.00151107820750704*G0_1_1_9_7 - 0.00134142643071237*G0_1_1_9_8 + 0.00183352361923823*G0_1_1_9_9; + A[134] = -A[89] - 0.0061579337769826*G0_1_0_0_0 + 0.00099258765925452*G0_1_0_0_2 - 0.000989486703772596*G0_1_0_0_3 - 0.0254145854145898*G0_1_0_0_4 - 0.00129140700569298*G0_1_0_0_5 - 0.000461760461760412*G0_1_0_0_6 - 0.00174809317666501*G0_1_0_0_7 + 0.00212612784041398*G0_1_0_0_8 - 0.015283763855195*G0_1_0_0_9 + 0.00615793377698253*G0_1_0_1_1 - 0.000992587659254466*G0_1_0_1_2 + 0.00129140700569296*G0_1_0_1_3 + 0.000461760461760493*G0_1_0_1_4 + 0.000989486703772584*G0_1_0_1_5 + 0.0254145854145898*G0_1_0_1_6 - 0.00212612784041395*G0_1_0_1_7 + 0.00174809317666496*G0_1_0_1_8 + 0.015283763855195*G0_1_0_1_9 + 0.00099258765925452*G0_1_0_2_0 - 0.000992587659254466*G0_1_0_2_1 + 0.0046176046176053*G0_1_0_2_3 + 0.0174048174048206*G0_1_0_2_4 - 0.00461760461760554*G0_1_0_2_5 - 0.0174048174048201*G0_1_0_2_6 - 0.00250416250416295*G0_1_0_2_7 + 0.00250416250416293*G0_1_0_2_8 - 0.000989486703772596*G0_1_0_3_0 + 0.00129140700569296*G0_1_0_3_1 + 0.0046176046176053*G0_1_0_3_2 - 0.037722277722284*G0_1_0_3_3 - 0.00367632367632438*G0_1_0_3_4 - 0.0762437562437691*G0_1_0_3_6 + 0.00296846011131773*G0_1_0_3_7 + 0.00454402740117105*G0_1_0_3_8 - 0.0517882117882205*G0_1_0_3_9 - 0.0254145854145898*G0_1_0_4_0 + 0.000461760461760493*G0_1_0_4_1 + 0.0174048174048206*G0_1_0_4_2 - 0.00367632367632438*G0_1_0_4_3 - 0.602597402597505*G0_1_0_4_4 + 0.0762437562437691*G0_1_0_4_5 + 0.041878121878129*G0_1_0_4_7 - 0.00751248751248877*G0_1_0_4_8 - 0.152487512487538*G0_1_0_4_9 - 0.00129140700569299*G0_1_0_5_0 + 0.000989486703772583*G0_1_0_5_1 - 0.00461760461760554*G0_1_0_5_2 + 0.0762437562437691*G0_1_0_5_4 + 0.0377222777222842*G0_1_0_5_5 + 0.00367632367632428*G0_1_0_5_6 - 0.00454402740117109*G0_1_0_5_7 - 0.00296846011131775*G0_1_0_5_8 + 0.0517882117882206*G0_1_0_5_9 - 0.000461760461760412*G0_1_0_6_0 + 0.0254145854145898*G0_1_0_6_1 - 0.0174048174048201*G0_1_0_6_2 - 0.0762437562437691*G0_1_0_6_3 + 0.00367632367632429*G0_1_0_6_5 + 0.602597402597506*G0_1_0_6_6 + 0.00751248751248891*G0_1_0_6_7 - 0.0418781218781289*G0_1_0_6_8 + 0.152487512487538*G0_1_0_6_9 - 0.00174809317666501*G0_1_0_7_0 - 0.00212612784041395*G0_1_0_7_1 - 0.00250416250416295*G0_1_0_7_2 + 0.00296846011131773*G0_1_0_7_3 + 0.041878121878129*G0_1_0_7_4 - 0.00454402740117109*G0_1_0_7_5 + 0.00751248751248891*G0_1_0_7_6 - 0.016851719708866*G0_1_0_7_7 + 0.0308263165406074*G0_1_0_7_9 + 0.00212612784041398*G0_1_0_8_0 + 0.00174809317666496*G0_1_0_8_1 + 0.00250416250416293*G0_1_0_8_2 + 0.00454402740117105*G0_1_0_8_3 - 0.00751248751248877*G0_1_0_8_4 - 0.00296846011131775*G0_1_0_8_5 - 0.0418781218781289*G0_1_0_8_6 + 0.0168517197088654*G0_1_0_8_8 - 0.0308263165406074*G0_1_0_8_9 - 0.015283763855195*G0_1_0_9_0 + 0.015283763855195*G0_1_0_9_1 - 0.0517882117882205*G0_1_0_9_3 - 0.152487512487538*G0_1_0_9_4 + 0.0517882117882206*G0_1_0_9_5 + 0.152487512487538*G0_1_0_9_6 + 0.0308263165406074*G0_1_0_9_7 - 0.0308263165406074*G0_1_0_9_8 - 0.0202949079139591*G0_1_1_0_0 - 0.00494038589276771*G0_1_1_0_1 + 0.000836694170027642*G0_1_1_0_2 - 0.00267668839097455*G0_1_1_0_3 - 0.0275584732727637*G0_1_1_0_4 + 0.00600034885749271*G0_1_1_0_5 - 0.0100217243074403*G0_1_1_0_6 - 0.00939504939505112*G0_1_1_0_7 + 0.00636823493966458*G0_1_1_0_8 - 0.0111735883164474*G0_1_1_0_9 - 0.00494038589276771*G0_1_1_1_0 - 0.0141369741369766*G0_1_1_1_1 - 0.000155893489226845*G0_1_1_1_2 + 0.00729175586318563*G0_1_1_1_3 - 0.00955996384567978*G0_1_1_1_4 - 0.00168720168720194*G0_1_1_1_5 - 0.00214388785817395*G0_1_1_1_6 + 0.00424210709925069*G0_1_1_1_7 - 0.00764695621838618*G0_1_1_1_8 + 0.00411017553874761*G0_1_1_1_9 + 0.000836694170027641*G0_1_1_2_0 - 0.000155893489226845*G0_1_1_2_1 + 0.0479915146581894*G0_1_1_2_2 - 0.00568320568320665*G0_1_1_2_3 + 0.0244200244200286*G0_1_1_2_4 - 0.010300810300812*G0_1_1_2_5 + 0.00701520701520816*G0_1_1_2_6 - 0.00919968919969074*G0_1_1_2_7 - 0.0066955266955278*G0_1_1_2_8 - 0.0277056277056323*G0_1_1_2_9 - 0.00267668839097455*G0_1_1_3_0 + 0.00729175586318563*G0_1_1_3_1 - 0.00568320568320665*G0_1_1_3_2 - 0.117551020408183*G0_1_1_3_3 + 0.0608991008991111*G0_1_1_3_4 - 0.00214642500356826*G0_1_1_3_5 + 0.0238161838161879*G0_1_1_3_6 + 0.0254145854145898*G0_1_1_3_7 - 0.0628856857428391*G0_1_1_3_8 - 0.0631596974454223*G0_1_1_3_9 - 0.0275584732727637*G0_1_1_4_0 - 0.00955996384567978*G0_1_1_4_1 + 0.0244200244200286*G0_1_1_4_2 + 0.0608991008991111*G0_1_1_4_3 - 0.637762237762346*G0_1_1_4_4 + 0.100059940059957*G0_1_1_4_5 - 0.123876123876145*G0_1_1_4_6 + 0.0464449835878485*G0_1_1_4_7 + 0.0374711003282495*G0_1_1_4_8 - 0.117002997003017*G0_1_1_4_9 + 0.00600034885749271*G0_1_1_5_0 - 0.00168720168720194*G0_1_1_5_1 - 0.010300810300812*G0_1_1_5_2 - 0.00214642500356825*G0_1_1_5_3 + 0.100059940059957*G0_1_1_5_4 - 0.079828742685899*G0_1_1_5_5 + 0.0645754245754355*G0_1_1_5_6 - 0.0674297131440102*G0_1_1_5_7 + 0.022446125303272*G0_1_1_5_8 - 0.0113714856572018*G0_1_1_5_9 - 0.0100217243074403*G0_1_1_6_0 - 0.00214388785817395*G0_1_1_6_1 + 0.00701520701520816*G0_1_1_6_2 + 0.0238161838161879*G0_1_1_6_3 - 0.123876123876145*G0_1_1_6_4 + 0.0645754245754355*G0_1_1_6_5 - 0.0351648351648413*G0_1_1_6_6 + 0.0449835878407383*G0_1_1_6_7 + 0.00456686170971956*G0_1_1_6_8 + 0.0354845154845213*G0_1_1_6_9 - 0.00939504939505112*G0_1_1_7_0 + 0.00424210709925069*G0_1_1_7_1 - 0.00919968919969074*G0_1_1_7_2 + 0.0254145854145898*G0_1_1_7_3 + 0.0464449835878485*G0_1_1_7_4 - 0.0674297131440102*G0_1_1_7_5 + 0.0449835878407383*G0_1_1_7_6 - 0.336806051091822*G0_1_1_7_7 + 0.034959326387904*G0_1_1_7_8 - 0.0564464107321345*G0_1_1_7_9 + 0.00636823493966458*G0_1_1_8_0 - 0.00764695621838617*G0_1_1_8_1 - 0.0066955266955278*G0_1_1_8_2 - 0.0628856857428391*G0_1_1_8_3 + 0.0374711003282495*G0_1_1_8_4 + 0.022446125303272*G0_1_1_8_5 + 0.00456686170971956*G0_1_1_8_6 + 0.034959326387904*G0_1_1_8_7 - 0.319954331382957*G0_1_1_8_8 - 0.0872727272727419*G0_1_1_8_9 - 0.0111735883164474*G0_1_1_9_0 + 0.0041101755387476*G0_1_1_9_1 - 0.0277056277056323*G0_1_1_9_2 - 0.0631596974454223*G0_1_1_9_3 - 0.117002997003017*G0_1_1_9_4 - 0.0113714856572018*G0_1_1_9_5 + 0.0354845154845213*G0_1_1_9_6 - 0.0564464107321345*G0_1_1_9_7 - 0.0872727272727419*G0_1_1_9_8 - 0.435678607107252*G0_1_1_9_9; + A[218] = A[134] - 0.00667776667776796*G0_0_1_0_0 - 0.0017221579126344*G0_0_1_0_1 - 0.00790123456790255*G0_0_1_0_2 + 0.00535845107273769*G0_0_1_0_3 - 0.0171181199752657*G0_0_1_0_4 + 0.0023443223443227*G0_0_1_0_5 - 0.0129851101279694*G0_0_1_0_6 - 0.0029836829836836*G0_0_1_0_7 + 0.00257266542980877*G0_0_1_0_8 - 0.00983397554826292*G0_0_1_0_9 - 0.0017221579126344*G0_0_1_1_0 - 0.000519832900785334*G0_0_1_1_1 - 0.00889382222715703*G0_0_1_1_2 + 0.00363572935001567*G0_0_1_1_3 - 0.0125233496662089*G0_0_1_1_4 + 0.00634793777651027*G0_0_1_1_5 + 0.00829646543932404*G0_0_1_1_6 + 0.000446537589394774*G0_0_1_1_7 - 0.00123558980701855*G0_0_1_1_8 + 0.0054497883069321*G0_0_1_1_9 - 0.00790123456790255*G0_0_1_2_0 - 0.00889382222715703*G0_0_1_2_1 - 0.0996139662806488*G0_0_1_2_2 + 0.037828837828844*G0_0_1_2_3 - 0.0745920745920868*G0_0_1_2_4 + 0.0332112332112386*G0_0_1_2_5 - 0.0919968919969071*G0_0_1_2_6 + 0.00175824175824203*G0_0_1_2_7 + 0.00426240426240497*G0_0_1_2_8 - 0.0223776223776261*G0_0_1_2_9 + 0.00535845107273769*G0_0_1_3_0 + 0.00363572935001568*G0_0_1_3_1 + 0.037828837828844*G0_0_1_3_2 - 0.0245697159982914*G0_0_1_3_3 + 0.0615384615384717*G0_0_1_3_4 - 0.0242500356786111*G0_0_1_3_5 - 0.0115084915084935*G0_0_1_3_6 - 0.00269444840873458*G0_0_1_3_7 + 0.00210075638647106*G0_0_1_3_8 - 0.0109604681033271*G0_0_1_3_9 - 0.0171181199752657*G0_0_1_4_0 - 0.0125233496662089*G0_0_1_4_1 - 0.0745920745920867*G0_0_1_4_2 + 0.0615384615384717*G0_0_1_4_3 - 0.230489510489549*G0_0_1_4_4 + 0.0647352647352755*G0_0_1_4_5 - 0.0532267732267821*G0_0_1_4_6 + 0.0163493649207962*G0_0_1_4_7 + 0.000593692022263517*G0_0_1_4_8 - 0.0623376623376727*G0_0_1_4_9 + 0.0023443223443227*G0_0_1_5_0 + 0.00634793777651027*G0_0_1_5_1 + 0.0332112332112386*G0_0_1_5_2 - 0.0242500356786111*G0_0_1_5_3 + 0.0647352647352755*G0_0_1_5_4 + 0.0131525617239926*G0_0_1_5_5 + 0.0652147852147961*G0_0_1_5_6 - 0.00244327101470005*G0_0_1_5_7 - 0.0056629085200523*G0_0_1_5_8 + 0.0408277436848934*G0_0_1_5_9 - 0.0129851101279694*G0_0_1_6_0 + 0.00829646543932404*G0_0_1_6_1 - 0.0919968919969071*G0_0_1_6_2 - 0.0115084915084935*G0_0_1_6_3 - 0.053226773226782*G0_0_1_6_4 + 0.0652147852147961*G0_0_1_6_5 + 0.372107892107956*G0_0_1_6_6 + 0.00810617953475241*G0_0_1_6_7 - 0.0255287569573327*G0_0_1_6_8 + 0.0901498501498654*G0_0_1_6_9 - 0.0029836829836836*G0_0_1_7_0 + 0.000446537589394774*G0_0_1_7_1 + 0.00175824175824203*G0_0_1_7_2 - 0.00269444840873458*G0_0_1_7_3 + 0.0163493649207962*G0_0_1_7_4 - 0.00244327101470005*G0_0_1_7_5 + 0.00810617953475241*G0_0_1_7_6 - 0.0191351505637255*G0_0_1_7_7 + 0.00162123590695053*G0_0_1_7_8 + 0.0132895675752841*G0_0_1_7_9 + 0.00257266542980877*G0_0_1_8_0 - 0.00123558980701855*G0_0_1_8_1 + 0.00426240426240497*G0_0_1_8_2 + 0.00210075638647106*G0_0_1_8_3 + 0.000593692022263519*G0_0_1_8_4 - 0.0056629085200523*G0_0_1_8_5 - 0.0255287569573327*G0_0_1_8_6 + 0.00162123590695053*G0_0_1_8_7 - 0.0022834308548596*G0_0_1_8_8 - 0.0175367489653233*G0_0_1_8_9 - 0.00983397554826292*G0_0_1_9_0 + 0.0054497883069321*G0_0_1_9_1 - 0.0223776223776261*G0_0_1_9_2 - 0.0109604681033271*G0_0_1_9_3 - 0.0623376623376727*G0_0_1_9_4 + 0.0408277436848934*G0_0_1_9_5 + 0.0901498501498654*G0_0_1_9_6 + 0.0132895675752841*G0_0_1_9_7 - 0.0175367489653233*G0_0_1_9_8 + 0.00657628086199614*G0_0_1_9_9 + 0.00667776667776796*G0_1_0_0_0 + 0.0017221579126344*G0_1_0_0_1 + 0.00790123456790255*G0_1_0_0_2 - 0.00535845107273769*G0_1_0_0_3 + 0.0171181199752657*G0_1_0_0_4 - 0.0023443223443227*G0_1_0_0_5 + 0.0129851101279694*G0_1_0_0_6 + 0.0029836829836836*G0_1_0_0_7 - 0.00257266542980877*G0_1_0_0_8 + 0.00983397554826292*G0_1_0_0_9 + 0.0017221579126344*G0_1_0_1_0 + 0.000519832900785333*G0_1_0_1_1 + 0.00889382222715703*G0_1_0_1_2 - 0.00363572935001567*G0_1_0_1_3 + 0.0125233496662089*G0_1_0_1_4 - 0.00634793777651027*G0_1_0_1_5 - 0.00829646543932404*G0_1_0_1_6 - 0.000446537589394774*G0_1_0_1_7 + 0.00123558980701855*G0_1_0_1_8 - 0.0054497883069321*G0_1_0_1_9 + 0.00790123456790255*G0_1_0_2_0 + 0.00889382222715703*G0_1_0_2_1 + 0.0996139662806489*G0_1_0_2_2 - 0.037828837828844*G0_1_0_2_3 + 0.0745920745920867*G0_1_0_2_4 - 0.0332112332112386*G0_1_0_2_5 + 0.0919968919969071*G0_1_0_2_6 - 0.00175824175824203*G0_1_0_2_7 - 0.00426240426240497*G0_1_0_2_8 + 0.0223776223776261*G0_1_0_2_9 - 0.00535845107273769*G0_1_0_3_0 - 0.00363572935001568*G0_1_0_3_1 - 0.037828837828844*G0_1_0_3_2 + 0.0245697159982914*G0_1_0_3_3 - 0.0615384615384717*G0_1_0_3_4 + 0.0242500356786111*G0_1_0_3_5 + 0.0115084915084935*G0_1_0_3_6 + 0.00269444840873458*G0_1_0_3_7 - 0.00210075638647106*G0_1_0_3_8 + 0.0109604681033271*G0_1_0_3_9 + 0.0171181199752657*G0_1_0_4_0 + 0.0125233496662089*G0_1_0_4_1 + 0.0745920745920867*G0_1_0_4_2 - 0.0615384615384717*G0_1_0_4_3 + 0.230489510489549*G0_1_0_4_4 - 0.0647352647352756*G0_1_0_4_5 + 0.053226773226782*G0_1_0_4_6 - 0.0163493649207962*G0_1_0_4_7 - 0.000593692022263514*G0_1_0_4_8 + 0.0623376623376727*G0_1_0_4_9 - 0.0023443223443227*G0_1_0_5_0 - 0.00634793777651027*G0_1_0_5_1 - 0.0332112332112386*G0_1_0_5_2 + 0.0242500356786111*G0_1_0_5_3 - 0.0647352647352756*G0_1_0_5_4 - 0.0131525617239926*G0_1_0_5_5 - 0.0652147852147961*G0_1_0_5_6 + 0.00244327101470004*G0_1_0_5_7 + 0.0056629085200523*G0_1_0_5_8 - 0.0408277436848934*G0_1_0_5_9 + 0.0129851101279694*G0_1_0_6_0 - 0.00829646543932404*G0_1_0_6_1 + 0.0919968919969071*G0_1_0_6_2 + 0.0115084915084935*G0_1_0_6_3 + 0.053226773226782*G0_1_0_6_4 - 0.0652147852147961*G0_1_0_6_5 - 0.372107892107956*G0_1_0_6_6 - 0.00810617953475241*G0_1_0_6_7 + 0.0255287569573327*G0_1_0_6_8 - 0.0901498501498654*G0_1_0_6_9 + 0.0029836829836836*G0_1_0_7_0 - 0.000446537589394774*G0_1_0_7_1 - 0.00175824175824203*G0_1_0_7_2 + 0.00269444840873458*G0_1_0_7_3 - 0.0163493649207962*G0_1_0_7_4 + 0.00244327101470004*G0_1_0_7_5 - 0.00810617953475241*G0_1_0_7_6 + 0.0191351505637255*G0_1_0_7_7 - 0.00162123590695053*G0_1_0_7_8 - 0.0132895675752841*G0_1_0_7_9 - 0.00257266542980877*G0_1_0_8_0 + 0.00123558980701855*G0_1_0_8_1 - 0.00426240426240497*G0_1_0_8_2 - 0.00210075638647106*G0_1_0_8_3 - 0.000593692022263519*G0_1_0_8_4 + 0.0056629085200523*G0_1_0_8_5 + 0.0255287569573327*G0_1_0_8_6 - 0.00162123590695052*G0_1_0_8_7 + 0.0022834308548596*G0_1_0_8_8 + 0.0175367489653233*G0_1_0_8_9 + 0.00983397554826292*G0_1_0_9_0 - 0.0054497883069321*G0_1_0_9_1 + 0.0223776223776261*G0_1_0_9_2 + 0.0109604681033271*G0_1_0_9_3 + 0.0623376623376727*G0_1_0_9_4 - 0.0408277436848934*G0_1_0_9_5 - 0.0901498501498654*G0_1_0_9_6 - 0.0132895675752841*G0_1_0_9_7 + 0.0175367489653233*G0_1_0_9_8 - 0.00657628086199614*G0_1_0_9_9; + A[215] = -A[218] - 0.0061579337769826*G0_0_1_0_0 + 0.00099258765925452*G0_0_1_0_2 - 0.000989486703772596*G0_0_1_0_3 - 0.0254145854145898*G0_0_1_0_4 - 0.00129140700569298*G0_0_1_0_5 - 0.000461760461760412*G0_0_1_0_6 - 0.00174809317666501*G0_0_1_0_7 + 0.00212612784041398*G0_0_1_0_8 - 0.015283763855195*G0_0_1_0_9 + 0.00615793377698254*G0_0_1_1_1 - 0.000992587659254466*G0_0_1_1_2 + 0.00129140700569296*G0_0_1_1_3 + 0.000461760461760493*G0_0_1_1_4 + 0.000989486703772584*G0_0_1_1_5 + 0.0254145854145898*G0_0_1_1_6 - 0.00212612784041395*G0_0_1_1_7 + 0.00174809317666496*G0_0_1_1_8 + 0.015283763855195*G0_0_1_1_9 + 0.00099258765925452*G0_0_1_2_0 - 0.000992587659254465*G0_0_1_2_1 + 0.0046176046176053*G0_0_1_2_3 + 0.0174048174048206*G0_0_1_2_4 - 0.00461760461760554*G0_0_1_2_5 - 0.0174048174048201*G0_0_1_2_6 - 0.00250416250416295*G0_0_1_2_7 + 0.00250416250416293*G0_0_1_2_8 - 0.000989486703772595*G0_0_1_3_0 + 0.00129140700569296*G0_0_1_3_1 + 0.0046176046176053*G0_0_1_3_2 - 0.037722277722284*G0_0_1_3_3 - 0.00367632367632439*G0_0_1_3_4 - 0.0762437562437691*G0_0_1_3_6 + 0.00296846011131773*G0_0_1_3_7 + 0.00454402740117105*G0_0_1_3_8 - 0.0517882117882205*G0_0_1_3_9 - 0.0254145854145898*G0_0_1_4_0 + 0.00046176046176049*G0_0_1_4_1 + 0.0174048174048205*G0_0_1_4_2 - 0.00367632367632437*G0_0_1_4_3 - 0.602597402597505*G0_0_1_4_4 + 0.0762437562437691*G0_0_1_4_5 + 0.041878121878129*G0_0_1_4_7 - 0.00751248751248877*G0_0_1_4_8 - 0.152487512487538*G0_0_1_4_9 - 0.00129140700569298*G0_0_1_5_0 + 0.000989486703772582*G0_0_1_5_1 - 0.00461760461760554*G0_0_1_5_2 + 0.0762437562437691*G0_0_1_5_4 + 0.0377222777222842*G0_0_1_5_5 + 0.00367632367632428*G0_0_1_5_6 - 0.0045440274011711*G0_0_1_5_7 - 0.00296846011131775*G0_0_1_5_8 + 0.0517882117882206*G0_0_1_5_9 - 0.000461760461760414*G0_0_1_6_0 + 0.0254145854145898*G0_0_1_6_1 - 0.0174048174048201*G0_0_1_6_2 - 0.0762437562437691*G0_0_1_6_3 + 0.00367632367632429*G0_0_1_6_5 + 0.602597402597506*G0_0_1_6_6 + 0.00751248751248891*G0_0_1_6_7 - 0.0418781218781289*G0_0_1_6_8 + 0.152487512487538*G0_0_1_6_9 - 0.00174809317666501*G0_0_1_7_0 - 0.00212612784041395*G0_0_1_7_1 - 0.00250416250416295*G0_0_1_7_2 + 0.00296846011131773*G0_0_1_7_3 + 0.041878121878129*G0_0_1_7_4 - 0.0045440274011711*G0_0_1_7_5 + 0.00751248751248891*G0_0_1_7_6 - 0.016851719708866*G0_0_1_7_7 + 0.0308263165406074*G0_0_1_7_9 + 0.00212612784041398*G0_0_1_8_0 + 0.00174809317666496*G0_0_1_8_1 + 0.00250416250416293*G0_0_1_8_2 + 0.00454402740117105*G0_0_1_8_3 - 0.00751248751248877*G0_0_1_8_4 - 0.00296846011131775*G0_0_1_8_5 - 0.0418781218781289*G0_0_1_8_6 + 0.0168517197088654*G0_0_1_8_8 - 0.0308263165406074*G0_0_1_8_9 - 0.015283763855195*G0_0_1_9_0 + 0.015283763855195*G0_0_1_9_1 - 0.0517882117882205*G0_0_1_9_3 - 0.152487512487538*G0_0_1_9_4 + 0.0517882117882205*G0_0_1_9_5 + 0.152487512487538*G0_0_1_9_6 + 0.0308263165406074*G0_0_1_9_7 - 0.0308263165406074*G0_0_1_9_8 - 0.0202949079139591*G0_1_1_0_0 - 0.00494038589276771*G0_1_1_0_1 + 0.000836694170027642*G0_1_1_0_2 - 0.00267668839097455*G0_1_1_0_3 - 0.0275584732727637*G0_1_1_0_4 + 0.00600034885749271*G0_1_1_0_5 - 0.0100217243074403*G0_1_1_0_6 - 0.00939504939505112*G0_1_1_0_7 + 0.00636823493966458*G0_1_1_0_8 - 0.0111735883164474*G0_1_1_0_9 - 0.00494038589276771*G0_1_1_1_0 - 0.0141369741369766*G0_1_1_1_1 - 0.000155893489226845*G0_1_1_1_2 + 0.00729175586318563*G0_1_1_1_3 - 0.00955996384567978*G0_1_1_1_4 - 0.00168720168720194*G0_1_1_1_5 - 0.00214388785817395*G0_1_1_1_6 + 0.00424210709925069*G0_1_1_1_7 - 0.00764695621838618*G0_1_1_1_8 + 0.0041101755387476*G0_1_1_1_9 + 0.000836694170027641*G0_1_1_2_0 - 0.000155893489226845*G0_1_1_2_1 + 0.0479915146581894*G0_1_1_2_2 - 0.00568320568320664*G0_1_1_2_3 + 0.0244200244200286*G0_1_1_2_4 - 0.010300810300812*G0_1_1_2_5 + 0.00701520701520816*G0_1_1_2_6 - 0.00919968919969074*G0_1_1_2_7 - 0.0066955266955278*G0_1_1_2_8 - 0.0277056277056324*G0_1_1_2_9 - 0.00267668839097455*G0_1_1_3_0 + 0.00729175586318564*G0_1_1_3_1 - 0.00568320568320663*G0_1_1_3_2 - 0.117551020408183*G0_1_1_3_3 + 0.0608991008991111*G0_1_1_3_4 - 0.00214642500356826*G0_1_1_3_5 + 0.0238161838161879*G0_1_1_3_6 + 0.0254145854145898*G0_1_1_3_7 - 0.0628856857428391*G0_1_1_3_8 - 0.0631596974454223*G0_1_1_3_9 - 0.0275584732727637*G0_1_1_4_0 - 0.00955996384567978*G0_1_1_4_1 + 0.0244200244200286*G0_1_1_4_2 + 0.0608991008991111*G0_1_1_4_3 - 0.637762237762346*G0_1_1_4_4 + 0.100059940059957*G0_1_1_4_5 - 0.123876123876145*G0_1_1_4_6 + 0.0464449835878485*G0_1_1_4_7 + 0.0374711003282495*G0_1_1_4_8 - 0.117002997003017*G0_1_1_4_9 + 0.00600034885749271*G0_1_1_5_0 - 0.00168720168720194*G0_1_1_5_1 - 0.010300810300812*G0_1_1_5_2 - 0.00214642500356825*G0_1_1_5_3 + 0.100059940059957*G0_1_1_5_4 - 0.079828742685899*G0_1_1_5_5 + 0.0645754245754355*G0_1_1_5_6 - 0.0674297131440102*G0_1_1_5_7 + 0.022446125303272*G0_1_1_5_8 - 0.0113714856572018*G0_1_1_5_9 - 0.0100217243074403*G0_1_1_6_0 - 0.00214388785817395*G0_1_1_6_1 + 0.00701520701520815*G0_1_1_6_2 + 0.0238161838161879*G0_1_1_6_3 - 0.123876123876145*G0_1_1_6_4 + 0.0645754245754355*G0_1_1_6_5 - 0.0351648351648413*G0_1_1_6_6 + 0.0449835878407383*G0_1_1_6_7 + 0.00456686170971956*G0_1_1_6_8 + 0.0354845154845212*G0_1_1_6_9 - 0.00939504939505112*G0_1_1_7_0 + 0.00424210709925069*G0_1_1_7_1 - 0.00919968919969074*G0_1_1_7_2 + 0.0254145854145898*G0_1_1_7_3 + 0.0464449835878485*G0_1_1_7_4 - 0.0674297131440102*G0_1_1_7_5 + 0.0449835878407383*G0_1_1_7_6 - 0.336806051091822*G0_1_1_7_7 + 0.034959326387904*G0_1_1_7_8 - 0.0564464107321345*G0_1_1_7_9 + 0.00636823493966458*G0_1_1_8_0 - 0.00764695621838617*G0_1_1_8_1 - 0.0066955266955278*G0_1_1_8_2 - 0.0628856857428391*G0_1_1_8_3 + 0.0374711003282495*G0_1_1_8_4 + 0.022446125303272*G0_1_1_8_5 + 0.00456686170971956*G0_1_1_8_6 + 0.034959326387904*G0_1_1_8_7 - 0.319954331382957*G0_1_1_8_8 - 0.0872727272727419*G0_1_1_8_9 - 0.0111735883164474*G0_1_1_9_0 + 0.0041101755387476*G0_1_1_9_1 - 0.0277056277056323*G0_1_1_9_2 - 0.0631596974454223*G0_1_1_9_3 - 0.117002997003017*G0_1_1_9_4 - 0.0113714856572018*G0_1_1_9_5 + 0.0354845154845212*G0_1_1_9_6 - 0.0564464107321345*G0_1_1_9_7 - 0.0872727272727419*G0_1_1_9_8 - 0.435678607107252*G0_1_1_9_9; + A[69] = A[139] - 0.00287120287120355*G0_0_1_0_0 - 0.00038878229354429*G0_0_1_0_1 - 0.000196170672361191*G0_0_1_0_2 + 0.000828060828060987*G0_0_1_0_3 - 0.000926375212089673*G0_0_1_0_4 - 0.00108336108336129*G0_0_1_0_5 + 0.00131138702567297*G0_0_1_0_6 - 0.00119436119436154*G0_0_1_0_7 + 0.00297194868623497*G0_0_1_0_8 - 0.00265829408686597*G0_0_1_0_9 - 0.00038878229354429*G0_0_1_1_0 - 0.0516372516372607*G0_0_1_1_1 - 0.000396887063553806*G0_0_1_1_2 + 0.00262848262848303*G0_0_1_1_3 + 0.000582909154337844*G0_0_1_1_4 - 0.000892123749266744*G0_0_1_1_5 - 0.000110048681477274*G0_0_1_1_6 + 0.00198595055737948*G0_0_1_1_7 + 0.00158064158064176*G0_0_1_1_8 + 0.00678178963893364*G0_0_1_1_9 - 0.000196170672361191*G0_0_1_2_0 - 0.000396887063553806*G0_0_1_2_1 + 0.00143066809733491*G0_0_1_2_2 + 0.00396333824905323*G0_0_1_2_3 - 0.00237793952079709*G0_0_1_2_4 + 0.000344100344100429*G0_0_1_2_5 + 0.000769072197643739*G0_0_1_2_7 - 0.00232719661291129*G0_0_1_2_9 + 0.000828060828060988*G0_0_1_3_0 + 0.00262848262848303*G0_0_1_3_1 + 0.00396333824905323*G0_0_1_3_2 + 0.134322820037129*G0_0_1_3_3 - 0.0147652347652373*G0_0_1_3_4 + 0.000545169116597801*G0_0_1_3_5 - 0.000568003425146377*G0_0_1_3_6 - 0.00338233195376111*G0_0_1_3_7 + 0.00417867846439347*G0_0_1_3_8 - 0.0135807050092787*G0_0_1_3_9 - 0.000926375212089673*G0_0_1_4_0 + 0.000582909154337844*G0_0_1_4_1 - 0.00237793952079709*G0_0_1_4_2 - 0.0147652347652373*G0_0_1_4_3 - 0.0600713572142248*G0_0_1_4_4 + 0.0018809761666908*G0_0_1_4_5 - 0.00131297274154443*G0_0_1_4_6 + 0.000685029256457979*G0_0_1_4_7 - 0.000796346510632373*G0_0_1_4_8 + 0.00321963750535229*G0_0_1_4_9 - 0.00108336108336129*G0_0_1_5_0 - 0.000892123749266744*G0_0_1_5_1 + 0.000344100344100428*G0_0_1_5_2 + 0.000545169116597801*G0_0_1_5_3 + 0.0018809761666908*G0_0_1_5_4 + 0.00180961895247647*G0_0_1_5_5 - 0.00284001712573187*G0_0_1_5_6 + 0.0014271442842873*G0_0_1_5_7 + 0.00177822177822209*G0_0_1_5_8 + 0.00441843870415371*G0_0_1_5_9 + 0.00131138702567297*G0_0_1_6_0 - 0.000110048681477274*G0_0_1_6_1 - 0.000568003425146378*G0_0_1_6_3 - 0.00131297274154443*G0_0_1_6_4 - 0.00284001712573187*G0_0_1_6_5 + 0.00283716283716322*G0_0_1_6_6 - 0.0032053660625094*G0_0_1_6_7 + 0.000665049236477907*G0_0_1_6_8 + 0.00811759668902665*G0_0_1_6_9 - 0.00119436119436154*G0_0_1_7_0 + 0.00198595055737948*G0_0_1_7_1 + 0.000769072197643739*G0_0_1_7_2 - 0.00338233195376111*G0_0_1_7_3 + 0.00068502925645798*G0_0_1_7_4 + 0.0014271442842873*G0_0_1_7_5 - 0.0032053660625094*G0_0_1_7_6 + 0.00021121735407403*G0_0_1_7_7 - 0.0174539745968346*G0_0_1_7_8 + 0.0143856143856167*G0_0_1_7_9 + 0.00297194868623497*G0_0_1_8_0 + 0.00158064158064176*G0_0_1_8_1 + 0.00417867846439348*G0_0_1_8_3 - 0.000796346510632373*G0_0_1_8_4 + 0.00177822177822209*G0_0_1_8_5 + 0.000665049236477907*G0_0_1_8_6 - 0.0174539745968346*G0_0_1_8_7 + 0.0516055373198319*G0_0_1_8_8 - 0.0187526758955361*G0_0_1_8_9 - 0.00265829408686597*G0_0_1_9_0 + 0.00678178963893364*G0_0_1_9_1 - 0.00232719661291129*G0_0_1_9_2 - 0.0135807050092787*G0_0_1_9_3 + 0.00321963750535228*G0_0_1_9_4 + 0.00441843870415371*G0_0_1_9_5 + 0.00811759668902665*G0_0_1_9_6 + 0.0143856143856167*G0_0_1_9_7 - 0.0187526758955361*G0_0_1_9_8 - 0.0293877551020458*G0_0_1_9_9 + 0.00287120287120355*G0_1_0_0_0 + 0.00038878229354429*G0_1_0_0_1 + 0.000196170672361191*G0_1_0_0_2 - 0.000828060828060987*G0_1_0_0_3 + 0.000926375212089673*G0_1_0_0_4 + 0.00108336108336129*G0_1_0_0_5 - 0.00131138702567297*G0_1_0_0_6 + 0.00119436119436154*G0_1_0_0_7 - 0.00297194868623497*G0_1_0_0_8 + 0.00265829408686597*G0_1_0_0_9 + 0.00038878229354429*G0_1_0_1_0 + 0.0516372516372607*G0_1_0_1_1 + 0.000396887063553806*G0_1_0_1_2 - 0.00262848262848303*G0_1_0_1_3 - 0.000582909154337844*G0_1_0_1_4 + 0.000892123749266744*G0_1_0_1_5 + 0.000110048681477275*G0_1_0_1_6 - 0.00198595055737948*G0_1_0_1_7 - 0.00158064158064176*G0_1_0_1_8 - 0.00678178963893364*G0_1_0_1_9 + 0.000196170672361191*G0_1_0_2_0 + 0.000396887063553806*G0_1_0_2_1 - 0.00143066809733491*G0_1_0_2_2 - 0.00396333824905323*G0_1_0_2_3 + 0.00237793952079709*G0_1_0_2_4 - 0.000344100344100428*G0_1_0_2_5 - 0.000769072197643739*G0_1_0_2_7 + 0.00232719661291129*G0_1_0_2_9 - 0.000828060828060987*G0_1_0_3_0 - 0.00262848262848303*G0_1_0_3_1 - 0.00396333824905323*G0_1_0_3_2 - 0.134322820037129*G0_1_0_3_3 + 0.0147652347652373*G0_1_0_3_4 - 0.000545169116597802*G0_1_0_3_5 + 0.000568003425146377*G0_1_0_3_6 + 0.00338233195376111*G0_1_0_3_7 - 0.00417867846439347*G0_1_0_3_8 + 0.0135807050092787*G0_1_0_3_9 + 0.000926375212089674*G0_1_0_4_0 - 0.000582909154337843*G0_1_0_4_1 + 0.00237793952079709*G0_1_0_4_2 + 0.0147652347652373*G0_1_0_4_3 + 0.0600713572142248*G0_1_0_4_4 - 0.0018809761666908*G0_1_0_4_5 + 0.00131297274154444*G0_1_0_4_6 - 0.000685029256457981*G0_1_0_4_7 + 0.000796346510632373*G0_1_0_4_8 - 0.00321963750535228*G0_1_0_4_9 + 0.00108336108336129*G0_1_0_5_0 + 0.000892123749266744*G0_1_0_5_1 - 0.000344100344100428*G0_1_0_5_2 - 0.000545169116597802*G0_1_0_5_3 - 0.0018809761666908*G0_1_0_5_4 - 0.00180961895247647*G0_1_0_5_5 + 0.00284001712573187*G0_1_0_5_6 - 0.0014271442842873*G0_1_0_5_7 - 0.00177822177822209*G0_1_0_5_8 - 0.00441843870415371*G0_1_0_5_9 - 0.00131138702567297*G0_1_0_6_0 + 0.000110048681477274*G0_1_0_6_1 + 0.000568003425146378*G0_1_0_6_3 + 0.00131297274154444*G0_1_0_6_4 + 0.00284001712573187*G0_1_0_6_5 - 0.00283716283716322*G0_1_0_6_6 + 0.0032053660625094*G0_1_0_6_7 - 0.000665049236477907*G0_1_0_6_8 - 0.00811759668902665*G0_1_0_6_9 + 0.00119436119436154*G0_1_0_7_0 - 0.00198595055737948*G0_1_0_7_1 - 0.000769072197643739*G0_1_0_7_2 + 0.00338233195376111*G0_1_0_7_3 - 0.00068502925645798*G0_1_0_7_4 - 0.0014271442842873*G0_1_0_7_5 + 0.0032053660625094*G0_1_0_7_6 - 0.00021121735407403*G0_1_0_7_7 + 0.0174539745968346*G0_1_0_7_8 - 0.0143856143856167*G0_1_0_7_9 - 0.00297194868623497*G0_1_0_8_0 - 0.00158064158064176*G0_1_0_8_1 - 0.00417867846439348*G0_1_0_8_3 + 0.000796346510632373*G0_1_0_8_4 - 0.00177822177822209*G0_1_0_8_5 - 0.000665049236477907*G0_1_0_8_6 + 0.0174539745968346*G0_1_0_8_7 - 0.0516055373198319*G0_1_0_8_8 + 0.0187526758955361*G0_1_0_8_9 + 0.00265829408686597*G0_1_0_9_0 - 0.00678178963893364*G0_1_0_9_1 + 0.00232719661291129*G0_1_0_9_2 + 0.0135807050092787*G0_1_0_9_3 - 0.00321963750535228*G0_1_0_9_4 - 0.00441843870415371*G0_1_0_9_5 - 0.00811759668902664*G0_1_0_9_6 - 0.0143856143856167*G0_1_0_9_7 + 0.0187526758955361*G0_1_0_9_8 + 0.0293877551020458*G0_1_0_9_9; + A[94] = A[69] - 0.00473600473600571*G0_0_0_0_0 - 0.000526633859967292*G0_0_0_0_1 + 0.00131533369628628*G0_0_0_0_2 + 0.000343466057751828*G0_0_0_0_3 - 0.00298463441320638*G0_0_0_0_4 - 0.00622044622044728*G0_0_0_0_5 - 0.00114266685695277*G0_0_0_0_6 - 0.00126984126984156*G0_0_0_0_7 + 0.00232941661513132*G0_0_0_0_8 - 0.000858189429618168*G0_0_0_0_9 - 0.000526633859967292*G0_0_0_1_0 - 0.00818934152267618*G0_0_0_1_1 + 0.00084060560251049*G0_0_0_1_2 - 0.00819497962355242*G0_0_0_1_3 + 0.00203574203574235*G0_0_0_1_4 + 0.000474763331906276*G0_0_0_1_5 - 0.000895295181009631*G0_0_0_1_6 + 0.000910518053375347*G0_0_0_1_7 - 0.00105798962941839*G0_0_0_1_8 + 0.000454783311926232*G0_0_0_1_9 + 0.00131533369628628*G0_0_0_2_0 + 0.00084060560251049*G0_0_0_2_1 + 0.0669759869759978*G0_0_0_2_2 - 0.00785690499976336*G0_0_0_2_3 + 0.0149184149184172*G0_0_0_2_4 - 0.00894026608312464*G0_0_0_2_5 + 0.0107448107448124*G0_0_0_2_6 - 0.00135198135198157*G0_0_0_2_7 + 0.0012739641311072*G0_0_0_2_8 - 0.000190285904571659*G0_0_0_2_9 + 0.000343466057751828*G0_0_0_3_0 - 0.00819497962355242*G0_0_0_3_1 - 0.00785690499976336*G0_0_0_3_2 - 0.00647352647352784*G0_0_0_3_3 + 0.0116369344940794*G0_0_0_3_4 - 0.00137576709005304*G0_0_0_3_5 + 0.00298273155416066*G0_0_0_3_6 - 0.000733552162123684*G0_0_0_3_7 + 0.00425859854431349*G0_0_0_3_8 + 0.000102754388468662*G0_0_0_3_9 - 0.00298463441320638*G0_0_0_4_0 + 0.00203574203574235*G0_0_0_4_1 + 0.0149184149184172*G0_0_0_4_2 + 0.0116369344940794*G0_0_0_4_3 - 0.108765520194111*G0_0_0_4_4 + 0.00925074925075089*G0_0_0_4_5 - 0.0122334808049116*G0_0_0_4_6 + 0.00635650064221601*G0_0_0_4_7 - 0.00352504638218981*G0_0_0_4_8 - 0.0179306407877868*G0_0_0_4_9 - 0.00622044622044729*G0_0_0_5_0 + 0.000474763331906276*G0_0_0_5_1 - 0.00894026608312464*G0_0_0_5_2 - 0.00137576709005304*G0_0_0_5_3 + 0.00925074925075089*G0_0_0_5_4 + 0.00734123019837424*G0_0_0_5_5 + 0.0243898958184714*G0_0_0_5_6 - 0.00322534608248949*G0_0_0_5_7 - 0.00112744398458702*G0_0_0_5_8 + 0.00482945625802853*G0_0_0_5_9 - 0.00114266685695277*G0_0_0_6_0 - 0.000895295181009631*G0_0_0_6_1 + 0.0107448107448124*G0_0_0_6_2 + 0.00298273155416066*G0_0_0_6_3 - 0.0122334808049116*G0_0_0_6_4 + 0.0243898958184714*G0_0_0_6_5 - 0.0676865991151822*G0_0_0_6_6 + 0.0043527900670765*G0_0_0_6_7 - 0.00071642643071227*G0_0_0_6_8 - 0.00539460539460633*G0_0_0_6_9 - 0.00126984126984156*G0_0_0_7_0 + 0.000910518053375347*G0_0_0_7_1 - 0.00135198135198157*G0_0_0_7_2 - 0.000733552162123683*G0_0_0_7_3 + 0.00635650064221601*G0_0_0_7_4 - 0.00322534608248948*G0_0_0_7_5 + 0.0043527900670765*G0_0_0_7_6 - 0.00856286570572414*G0_0_0_7_7 - 0.00581418581418671*G0_0_0_7_8 - 0.00613101184529853*G0_0_0_7_9 + 0.00232941661513132*G0_0_0_8_0 - 0.00105798962941839*G0_0_0_8_1 + 0.0012739641311072*G0_0_0_8_2 + 0.00425859854431349*G0_0_0_8_3 - 0.00352504638218981*G0_0_0_8_4 - 0.00112744398458702*G0_0_0_8_5 - 0.000716426430712269*G0_0_0_8_6 - 0.00581418581418671*G0_0_0_8_7 + 0.0168174682460424*G0_0_0_8_8 + 0.00568574282860092*G0_0_0_8_9 - 0.000858189429618169*G0_0_0_9_0 + 0.000454783311926232*G0_0_0_9_1 - 0.00019028590457166*G0_0_0_9_2 + 0.000102754388468662*G0_0_0_9_3 - 0.0179306407877868*G0_0_0_9_4 + 0.00482945625802853*G0_0_0_9_5 - 0.00539460539460633*G0_0_0_9_6 - 0.00613101184529853*G0_0_0_9_7 + 0.00568574282860092*G0_0_0_9_8 + 0.00904238618524475*G0_0_0_9_9 - 0.000630480630480741*G0_0_1_0_1 + 0.000630480630480743*G0_0_1_0_2 - 0.000372960372960467*G0_0_1_0_3 + 0.000372960372960449*G0_0_1_0_4 + 0.000186480186480248*G0_0_1_0_5 - 0.00191808191808226*G0_0_1_0_6 - 0.000186480186480122*G0_0_1_0_7 + 0.00191808191808218*G0_0_1_0_8 - 0.000630480630480741*G0_0_1_1_0 - 0.00768416768416899*G0_0_1_1_1 - 0.0133732933732957*G0_0_1_1_3 + 0.00687312687312805*G0_0_1_1_4 + 0.00175824175824208*G0_0_1_1_5 - 0.000985680985681158*G0_0_1_1_6 + 0.00186480186480225*G0_0_1_1_7 - 0.00282384282384343*G0_0_1_1_8 - 0.00362304362304425*G0_0_1_1_9 + 0.000630480630480743*G0_0_1_2_0 + 0.00768416768416895*G0_0_1_2_2 - 0.00687312687312803*G0_0_1_2_3 + 0.0133732933732956*G0_0_1_2_4 - 0.00186480186480217*G0_0_1_2_5 + 0.00282384282384331*G0_0_1_2_6 - 0.00175824175824202*G0_0_1_2_7 + 0.000985680985681128*G0_0_1_2_8 + 0.00362304362304424*G0_0_1_2_9 - 0.000372960372960467*G0_0_1_3_0 - 0.0133732933732957*G0_0_1_3_1 - 0.00687312687312803*G0_0_1_3_2 - 0.0604195804195913*G0_0_1_3_3 - 0.00207792207792244*G0_0_1_3_5 + 0.00295704295704347*G0_0_1_3_6 + 0.00111888111888139*G0_0_1_3_7 + 0.001838161838162*G0_0_1_3_8 + 0.00863136863136993*G0_0_1_3_9 + 0.000372960372960449*G0_0_1_4_0 + 0.00687312687312805*G0_0_1_4_1 + 0.0133732933732956*G0_0_1_4_2 + 0.0604195804195906*G0_0_1_4_4 - 0.00111888111888132*G0_0_1_4_5 - 0.00183816183816215*G0_0_1_4_6 + 0.00207792207792238*G0_0_1_4_7 - 0.00295704295704338*G0_0_1_4_8 - 0.00863136863137009*G0_0_1_4_9 + 0.000186480186480248*G0_0_1_5_0 + 0.00175824175824208*G0_0_1_5_1 - 0.00186480186480217*G0_0_1_5_2 - 0.00207792207792244*G0_0_1_5_3 - 0.00111888111888132*G0_0_1_5_4 + 0.015024975024978*G0_0_1_5_5 + 0.00567432567432657*G0_0_1_5_6 - 0.00527472527472623*G0_0_1_5_8 + 0.0105494505494525*G0_0_1_5_9 - 0.00191808191808226*G0_0_1_6_0 - 0.000985680985681158*G0_0_1_6_1 + 0.00282384282384331*G0_0_1_6_2 + 0.00295704295704347*G0_0_1_6_3 - 0.00183816183816215*G0_0_1_6_4 + 0.00567432567432657*G0_0_1_6_5 - 0.018061938061941*G0_0_1_6_6 + 0.00527472527472608*G0_0_1_6_7 - 0.0167832167832197*G0_0_1_6_9 - 0.000186480186480122*G0_0_1_7_0 + 0.00186480186480225*G0_0_1_7_1 - 0.00175824175824202*G0_0_1_7_2 + 0.00111888111888139*G0_0_1_7_3 + 0.00207792207792237*G0_0_1_7_4 + 0.00527472527472608*G0_0_1_7_6 - 0.015024975024977*G0_0_1_7_7 - 0.0056743256743266*G0_0_1_7_8 - 0.0105494505494521*G0_0_1_7_9 + 0.00191808191808218*G0_0_1_8_0 - 0.00282384282384343*G0_0_1_8_1 + 0.000985680985681128*G0_0_1_8_2 + 0.00183816183816199*G0_0_1_8_3 - 0.00295704295704338*G0_0_1_8_4 - 0.00527472527472623*G0_0_1_8_5 - 0.0056743256743266*G0_0_1_8_7 + 0.0180619380619406*G0_0_1_8_8 + 0.0167832167832195*G0_0_1_8_9 - 0.00362304362304425*G0_0_1_9_1 + 0.00362304362304424*G0_0_1_9_2 + 0.00863136863136993*G0_0_1_9_3 - 0.00863136863137009*G0_0_1_9_4 + 0.0105494505494525*G0_0_1_9_5 - 0.0167832167832197*G0_0_1_9_6 - 0.0105494505494521*G0_0_1_9_7 + 0.0167832167832195*G0_0_1_9_8 - 0.000823092251663828*G0_1_0_0_1 + 0.000823092251663817*G0_1_0_0_2 + 0.0013814756671902*G0_1_0_0_3 - 0.0013814756671902*G0_1_0_0_4 + 0.000297480297480393*G0_1_0_0_5 - 0.00357864357864421*G0_1_0_0_6 - 0.000297480297480265*G0_1_0_0_7 + 0.00357864357864415*G0_1_0_0_8 - 0.000823092251663828*G0_1_0_1_0 - 0.0607520874187646*G0_1_0_1_1 - 0.00836687122401556*G0_1_0_1_3 + 0.00349269777841265*G0_1_0_1_4 - 0.00106179534750983*G0_1_0_1_6 + 0.0035066520780813*G0_1_0_1_7 - 0.00131233845519593*G0_1_0_1_8 + 0.00548594262880069*G0_1_0_1_9 + 0.000823092251663817*G0_1_0_2_0 + 0.0607520874187641*G0_1_0_2_2 - 0.00349269777841258*G0_1_0_2_3 + 0.00836687122401533*G0_1_0_2_4 - 0.00350665207808118*G0_1_0_2_5 + 0.00131233845519573*G0_1_0_2_6 + 0.00106179534750981*G0_1_0_2_8 - 0.0054859426288007*G0_1_0_2_9 + 0.0013814756671902*G0_1_0_3_0 - 0.00836687122401556*G0_1_0_3_1 - 0.00349269777841258*G0_1_0_3_2 + 0.133974596831763*G0_1_0_3_3 - 0.00221778221778256*G0_1_0_3_5 + 0.00318538604252943*G0_1_0_3_6 - 0.00414442700157055*G0_1_0_3_7 + 0.00732981304409996*G0_1_0_3_8 - 0.00816897388326092*G0_1_0_3_9 - 0.0013814756671902*G0_1_0_4_0 + 0.00349269777841265*G0_1_0_4_1 + 0.00836687122401533*G0_1_0_4_2 - 0.133974596831762*G0_1_0_4_4 + 0.00414442700157055*G0_1_0_4_5 - 0.00732981304410002*G0_1_0_4_6 + 0.00221778221778257*G0_1_0_4_7 - 0.00318538604252942*G0_1_0_4_8 + 0.00816897388326103*G0_1_0_4_9 + 0.000297480297480393*G0_1_0_5_0 - 0.00350665207808118*G0_1_0_5_2 - 0.00221778221778256*G0_1_0_5_3 + 0.00414442700157055*G0_1_0_5_4 + 0.0166233766233795*G0_1_0_5_5 + 0.0202882831454294*G0_1_0_5_6 - 0.000291137433994635*G0_1_0_5_8 + 0.000582274867989225*G0_1_0_5_9 - 0.00357864357864421*G0_1_0_6_0 - 0.00106179534750983*G0_1_0_6_1 + 0.00131233845519573*G0_1_0_6_2 + 0.00318538604252943*G0_1_0_6_3 - 0.00732981304410001*G0_1_0_6_4 + 0.0202882831454294*G0_1_0_6_5 - 0.0668303125446096*G0_1_0_6_6 + 0.000291137433994569*G0_1_0_6_7 + 0.0100870558013433*G0_1_0_6_9 - 0.000297480297480266*G0_1_0_7_0 + 0.0035066520780813*G0_1_0_7_1 - 0.00414442700157055*G0_1_0_7_3 + 0.00221778221778257*G0_1_0_7_4 + 0.000291137433994569*G0_1_0_7_6 - 0.0166233766233789*G0_1_0_7_7 - 0.0202882831454295*G0_1_0_7_8 - 0.000582274867989215*G0_1_0_7_9 + 0.00357864357864415*G0_1_0_8_0 - 0.00131233845519593*G0_1_0_8_1 + 0.00106179534750981*G0_1_0_8_2 + 0.00732981304409996*G0_1_0_8_3 - 0.00318538604252942*G0_1_0_8_4 - 0.000291137433994635*G0_1_0_8_5 - 0.0202882831454295*G0_1_0_8_7 + 0.0668303125446097*G0_1_0_8_8 - 0.0100870558013432*G0_1_0_8_9 + 0.00548594262880069*G0_1_0_9_1 - 0.0054859426288007*G0_1_0_9_2 - 0.00816897388326092*G0_1_0_9_3 + 0.00816897388326103*G0_1_0_9_4 + 0.000582274867989223*G0_1_0_9_5 + 0.0100870558013433*G0_1_0_9_6 - 0.000582274867989212*G0_1_0_9_7 - 0.0100870558013432*G0_1_0_9_8 + 0.00473600473600574*G0_1_1_0_0 - 0.00131533369628631*G0_1_1_0_1 + 0.000526633859967286*G0_1_1_0_2 + 0.00298463441320636*G0_1_1_0_3 - 0.000343466057751828*G0_1_1_0_4 + 0.00126984126984153*G0_1_1_0_5 - 0.00232941661513133*G0_1_1_0_6 + 0.00622044622044743*G0_1_1_0_7 + 0.00114266685695269*G0_1_1_0_8 + 0.000858189429618161*G0_1_1_0_9 - 0.00131533369628631*G0_1_1_1_0 - 0.0669759869759986*G0_1_1_1_1 - 0.000840605602510516*G0_1_1_1_2 - 0.0149184149184175*G0_1_1_1_3 + 0.00785690499976348*G0_1_1_1_4 + 0.00135198135198162*G0_1_1_1_5 - 0.00127396413110721*G0_1_1_1_6 + 0.00894026608312484*G0_1_1_1_7 - 0.0107448107448127*G0_1_1_1_8 + 0.000190285904571633*G0_1_1_1_9 + 0.000526633859967286*G0_1_1_2_0 - 0.000840605602510516*G0_1_1_2_1 + 0.00818934152267614*G0_1_1_2_2 - 0.00203574203574235*G0_1_1_2_3 + 0.00819497962355235*G0_1_1_2_4 - 0.000910518053375334*G0_1_1_2_5 + 0.00105798962941835*G0_1_1_2_6 - 0.000474763331906249*G0_1_1_2_7 + 0.000895295181009605*G0_1_1_2_8 - 0.000454783311926255*G0_1_1_2_9 + 0.00298463441320636*G0_1_1_3_0 - 0.0149184149184175*G0_1_1_3_1 - 0.00203574203574235*G0_1_1_3_2 + 0.108765520194111*G0_1_1_3_3 - 0.0116369344940792*G0_1_1_3_4 - 0.00635650064221601*G0_1_1_3_5 + 0.00352504638218984*G0_1_1_3_6 - 0.00925074925075083*G0_1_1_3_7 + 0.0122334808049114*G0_1_1_3_8 + 0.0179306407877868*G0_1_1_3_9 - 0.000343466057751828*G0_1_1_4_0 + 0.00785690499976348*G0_1_1_4_1 + 0.00819497962355235*G0_1_1_4_2 - 0.0116369344940792*G0_1_1_4_3 + 0.00647352647352749*G0_1_1_4_4 + 0.000733552162123712*G0_1_1_4_5 - 0.00425859854431356*G0_1_1_4_6 + 0.001375767090053*G0_1_1_4_7 - 0.00298273155416058*G0_1_1_4_8 - 0.000102754388468672*G0_1_1_4_9 + 0.00126984126984153*G0_1_1_5_0 + 0.00135198135198161*G0_1_1_5_1 - 0.000910518053375334*G0_1_1_5_2 - 0.00635650064221601*G0_1_1_5_3 + 0.000733552162123712*G0_1_1_5_4 + 0.00856286570572446*G0_1_1_5_5 + 0.00581418581418682*G0_1_1_5_6 + 0.00322534608248956*G0_1_1_5_7 - 0.00435279006707655*G0_1_1_5_8 + 0.00613101184529864*G0_1_1_5_9 - 0.00232941661513133*G0_1_1_6_0 - 0.00127396413110721*G0_1_1_6_1 + 0.00105798962941835*G0_1_1_6_2 + 0.00352504638218984*G0_1_1_6_3 - 0.00425859854431356*G0_1_1_6_4 + 0.00581418581418682*G0_1_1_6_5 - 0.0168174682460425*G0_1_1_6_6 + 0.00112744398458698*G0_1_1_6_7 + 0.000716426430712286*G0_1_1_6_8 - 0.00568574282860092*G0_1_1_6_9 + 0.00622044622044743*G0_1_1_7_0 + 0.00894026608312484*G0_1_1_7_1 - 0.000474763331906249*G0_1_1_7_2 - 0.00925074925075083*G0_1_1_7_3 + 0.001375767090053*G0_1_1_7_4 + 0.00322534608248956*G0_1_1_7_5 + 0.00112744398458698*G0_1_1_7_6 - 0.00734123019837368*G0_1_1_7_7 - 0.0243898958184714*G0_1_1_7_8 - 0.00482945625802844*G0_1_1_7_9 + 0.00114266685695269*G0_1_1_8_0 - 0.0107448107448127*G0_1_1_8_1 + 0.000895295181009604*G0_1_1_8_2 + 0.0122334808049114*G0_1_1_8_3 - 0.00298273155416058*G0_1_1_8_4 - 0.00435279006707655*G0_1_1_8_5 + 0.000716426430712287*G0_1_1_8_6 - 0.0243898958184714*G0_1_1_8_7 + 0.0676865991151818*G0_1_1_8_8 + 0.00539460539460628*G0_1_1_8_9 + 0.000858189429618161*G0_1_1_9_0 + 0.000190285904571631*G0_1_1_9_1 - 0.000454783311926256*G0_1_1_9_2 + 0.0179306407877868*G0_1_1_9_3 - 0.00010275438846867*G0_1_1_9_4 + 0.00613101184529864*G0_1_1_9_5 - 0.00568574282860092*G0_1_1_9_6 - 0.00482945625802843*G0_1_1_9_7 + 0.00539460539460628*G0_1_1_9_8 - 0.00904238618524477*G0_1_1_9_9; + A[66] = A[94] + 0.00287120287120355*G0_0_1_0_0 + 0.000196170672361203*G0_0_1_0_1 + 0.000388782293544265*G0_0_1_0_2 + 0.000926375212089679*G0_0_1_0_3 - 0.00082806082806098*G0_0_1_0_4 + 0.00119436119436144*G0_0_1_0_5 - 0.00297194868623493*G0_0_1_0_6 + 0.0010833610833614*G0_0_1_0_7 - 0.001311387025673*G0_0_1_0_8 + 0.002658294086866*G0_0_1_0_9 + 0.000196170672361203*G0_0_1_1_0 - 0.00143066809733494*G0_0_1_1_1 + 0.000396887063553796*G0_0_1_1_2 + 0.00237793952079709*G0_0_1_1_3 - 0.00396333824905324*G0_0_1_1_4 - 0.000769072197643769*G0_0_1_1_5 - 0.000344100344100429*G0_0_1_1_7 + 0.00232719661291129*G0_0_1_1_9 + 0.000388782293544266*G0_0_1_2_0 + 0.000396887063553796*G0_0_1_2_1 + 0.0516372516372602*G0_0_1_2_2 - 0.000582909154337784*G0_0_1_2_3 - 0.00262848262848317*G0_0_1_2_4 - 0.00198595055737944*G0_0_1_2_5 - 0.00158064158064189*G0_0_1_2_6 + 0.000892123749266761*G0_0_1_2_7 + 0.000110048681477283*G0_0_1_2_8 - 0.00678178963893364*G0_0_1_2_9 + 0.000926375212089679*G0_0_1_3_0 + 0.00237793952079709*G0_0_1_3_1 - 0.000582909154337784*G0_0_1_3_2 + 0.0600713572142251*G0_0_1_3_3 + 0.0147652347652373*G0_0_1_3_4 - 0.000685029256457925*G0_0_1_3_5 + 0.000796346510632347*G0_0_1_3_6 - 0.00188097616669083*G0_0_1_3_7 + 0.00131297274154449*G0_0_1_3_8 - 0.00321963750535219*G0_0_1_3_9 - 0.000828060828060981*G0_0_1_4_0 - 0.00396333824905324*G0_0_1_4_1 - 0.00262848262848317*G0_0_1_4_2 + 0.0147652347652373*G0_0_1_4_3 - 0.134322820037128*G0_0_1_4_4 + 0.00338233195376107*G0_0_1_4_5 - 0.00417867846439343*G0_0_1_4_6 - 0.000545169116597788*G0_0_1_4_7 + 0.000568003425146337*G0_0_1_4_8 + 0.0135807050092788*G0_0_1_4_9 + 0.00119436119436144*G0_0_1_5_0 - 0.000769072197643769*G0_0_1_5_1 - 0.00198595055737944*G0_0_1_5_2 - 0.000685029256457925*G0_0_1_5_3 + 0.00338233195376107*G0_0_1_5_4 - 0.000211217354074957*G0_0_1_5_5 + 0.0174539745968347*G0_0_1_5_6 - 0.0014271442842874*G0_0_1_5_7 + 0.0032053660625095*G0_0_1_5_8 - 0.014385614385617*G0_0_1_5_9 - 0.00297194868623493*G0_0_1_6_0 - 0.00158064158064189*G0_0_1_6_2 + 0.000796346510632344*G0_0_1_6_3 - 0.00417867846439343*G0_0_1_6_4 + 0.0174539745968347*G0_0_1_6_5 - 0.0516055373198318*G0_0_1_6_6 - 0.0017782217782221*G0_0_1_6_7 - 0.000665049236477942*G0_0_1_6_8 + 0.0187526758955363*G0_0_1_6_9 + 0.0010833610833614*G0_0_1_7_0 - 0.000344100344100429*G0_0_1_7_1 + 0.00089212374926676*G0_0_1_7_2 - 0.00188097616669083*G0_0_1_7_3 - 0.000545169116597788*G0_0_1_7_4 - 0.0014271442842874*G0_0_1_7_5 - 0.0017782217782221*G0_0_1_7_6 - 0.00180961895247601*G0_0_1_7_7 + 0.0028400171257317*G0_0_1_7_8 - 0.00441843870415379*G0_0_1_7_9 - 0.001311387025673*G0_0_1_8_0 + 0.000110048681477283*G0_0_1_8_2 + 0.00131297274154449*G0_0_1_8_3 + 0.000568003425146338*G0_0_1_8_4 + 0.0032053660625095*G0_0_1_8_5 - 0.000665049236477941*G0_0_1_8_6 + 0.0028400171257317*G0_0_1_8_7 - 0.00283716283716286*G0_0_1_8_8 - 0.00811759668902655*G0_0_1_8_9 + 0.002658294086866*G0_0_1_9_0 + 0.00232719661291129*G0_0_1_9_1 - 0.00678178963893364*G0_0_1_9_2 - 0.00321963750535219*G0_0_1_9_3 + 0.0135807050092788*G0_0_1_9_4 - 0.014385614385617*G0_0_1_9_5 + 0.0187526758955363*G0_0_1_9_6 - 0.00441843870415378*G0_0_1_9_7 - 0.00811759668902655*G0_0_1_9_8 + 0.0293877551020457*G0_0_1_9_9 - 0.00287120287120355*G0_1_0_0_0 - 0.000196170672361203*G0_1_0_0_1 - 0.000388782293544265*G0_1_0_0_2 - 0.000926375212089679*G0_1_0_0_3 + 0.00082806082806098*G0_1_0_0_4 - 0.00119436119436143*G0_1_0_0_5 + 0.00297194868623493*G0_1_0_0_6 - 0.0010833610833614*G0_1_0_0_7 + 0.001311387025673*G0_1_0_0_8 - 0.002658294086866*G0_1_0_0_9 - 0.000196170672361203*G0_1_0_1_0 + 0.00143066809733494*G0_1_0_1_1 - 0.000396887063553796*G0_1_0_1_2 - 0.00237793952079709*G0_1_0_1_3 + 0.00396333824905324*G0_1_0_1_4 + 0.00076907219764377*G0_1_0_1_5 + 0.000344100344100429*G0_1_0_1_7 - 0.00232719661291129*G0_1_0_1_9 - 0.000388782293544266*G0_1_0_2_0 - 0.000396887063553796*G0_1_0_2_1 - 0.0516372516372602*G0_1_0_2_2 + 0.000582909154337783*G0_1_0_2_3 + 0.00262848262848317*G0_1_0_2_4 + 0.00198595055737944*G0_1_0_2_5 + 0.00158064158064189*G0_1_0_2_6 - 0.00089212374926676*G0_1_0_2_7 - 0.000110048681477283*G0_1_0_2_8 + 0.00678178963893364*G0_1_0_2_9 - 0.000926375212089679*G0_1_0_3_0 - 0.00237793952079709*G0_1_0_3_1 + 0.000582909154337783*G0_1_0_3_2 - 0.0600713572142251*G0_1_0_3_3 - 0.0147652347652373*G0_1_0_3_4 + 0.000685029256457925*G0_1_0_3_5 - 0.000796346510632344*G0_1_0_3_6 + 0.00188097616669083*G0_1_0_3_7 - 0.00131297274154449*G0_1_0_3_8 + 0.0032196375053522*G0_1_0_3_9 + 0.00082806082806098*G0_1_0_4_0 + 0.00396333824905324*G0_1_0_4_1 + 0.00262848262848317*G0_1_0_4_2 - 0.0147652347652373*G0_1_0_4_3 + 0.134322820037128*G0_1_0_4_4 - 0.00338233195376107*G0_1_0_4_5 + 0.00417867846439343*G0_1_0_4_6 + 0.000545169116597789*G0_1_0_4_7 - 0.000568003425146337*G0_1_0_4_8 - 0.0135807050092788*G0_1_0_4_9 - 0.00119436119436144*G0_1_0_5_0 + 0.00076907219764377*G0_1_0_5_1 + 0.00198595055737944*G0_1_0_5_2 + 0.000685029256457924*G0_1_0_5_3 - 0.00338233195376107*G0_1_0_5_4 + 0.000211217354074957*G0_1_0_5_5 - 0.0174539745968347*G0_1_0_5_6 + 0.0014271442842874*G0_1_0_5_7 - 0.00320536606250951*G0_1_0_5_8 + 0.014385614385617*G0_1_0_5_9 + 0.00297194868623493*G0_1_0_6_0 + 0.00158064158064189*G0_1_0_6_2 - 0.000796346510632343*G0_1_0_6_3 + 0.00417867846439342*G0_1_0_6_4 - 0.0174539745968347*G0_1_0_6_5 + 0.0516055373198318*G0_1_0_6_6 + 0.0017782217782221*G0_1_0_6_7 + 0.000665049236477942*G0_1_0_6_8 - 0.0187526758955363*G0_1_0_6_9 - 0.0010833610833614*G0_1_0_7_0 + 0.000344100344100429*G0_1_0_7_1 - 0.00089212374926676*G0_1_0_7_2 + 0.00188097616669083*G0_1_0_7_3 + 0.000545169116597788*G0_1_0_7_4 + 0.0014271442842874*G0_1_0_7_5 + 0.0017782217782221*G0_1_0_7_6 + 0.00180961895247601*G0_1_0_7_7 - 0.0028400171257317*G0_1_0_7_8 + 0.00441843870415379*G0_1_0_7_9 + 0.001311387025673*G0_1_0_8_0 - 0.000110048681477283*G0_1_0_8_2 - 0.00131297274154449*G0_1_0_8_3 - 0.000568003425146337*G0_1_0_8_4 - 0.00320536606250951*G0_1_0_8_5 + 0.000665049236477941*G0_1_0_8_6 - 0.0028400171257317*G0_1_0_8_7 + 0.00283716283716286*G0_1_0_8_8 + 0.00811759668902655*G0_1_0_8_9 - 0.002658294086866*G0_1_0_9_0 - 0.00232719661291129*G0_1_0_9_1 + 0.00678178963893364*G0_1_0_9_2 + 0.0032196375053522*G0_1_0_9_3 - 0.0135807050092788*G0_1_0_9_4 + 0.014385614385617*G0_1_0_9_5 - 0.0187526758955363*G0_1_0_9_6 + 0.00441843870415379*G0_1_0_9_7 + 0.00811759668902655*G0_1_0_9_8 - 0.0293877551020457*G0_1_0_9_9; + A[48] = -A[56] + 0.00656838752076961*G0_0_0_0_0 - 0.000819920819920961*G0_0_0_0_1 + 0.00527909480290522*G0_0_0_0_2 + 0.0262167462167507*G0_0_0_0_3 - 0.00145589859875595*G0_0_0_0_4 - 0.00471317042745692*G0_0_0_0_5 + 0.00338159195302113*G0_0_0_0_6 - 0.00947454661740536*G0_0_0_0_7 + 0.0150812150812176*G0_0_0_0_8 + 0.0226846169703351*G0_0_0_0_9 - 0.00081992081992096*G0_0_0_1_0 - 0.0348096348096406*G0_0_0_1_1 + 0.000227920227920276*G0_0_0_1_2 - 0.0194768194768227*G0_0_0_1_3 + 0.00836200836200976*G0_0_0_1_4 + 0.00186776186776218*G0_0_0_1_5 + 0.00609464609464713*G0_0_0_1_6 + 0.0048692048692057*G0_0_0_1_7 - 0.00973840973841143*G0_0_0_1_8 - 0.00275280275280321*G0_0_0_1_9 + 0.00527909480290522*G0_0_0_2_0 + 0.000227920227920276*G0_0_0_2_1 + 0.0461878861878939*G0_0_0_2_2 + 0.0110644910644929*G0_0_0_2_3 + 0.00279085993371753*G0_0_0_2_4 - 0.0164584621727506*G0_0_0_2_5 + 0.0307400535972016*G0_0_0_2_6 - 0.00560666846381224*G0_0_0_2_7 + 0.0150812150812176*G0_0_0_2_8 + 0.0149488606631488*G0_0_0_2_9 + 0.0262167462167507*G0_0_0_3_0 - 0.0194768194768227*G0_0_0_3_1 + 0.0110644910644929*G0_0_0_3_2 + 0.476323676323757*G0_0_0_3_3 - 0.0878321678321825*G0_0_0_3_4 - 0.0334065934065989*G0_0_0_3_5 - 0.0357242757242816*G0_0_0_3_6 - 0.0960905760905922*G0_0_0_3_7 + 0.158774558774585*G0_0_0_3_8 + 0.200439560439594*G0_0_0_3_9 - 0.00145589859875595*G0_0_0_4_0 + 0.00836200836200976*G0_0_0_4_1 + 0.00279085993371753*G0_0_0_4_2 - 0.0878321678321825*G0_0_0_4_3 + 0.11140859140861*G0_0_0_4_4 - 0.0130726416440725*G0_0_0_4_5 + 0.0487969173683541*G0_0_0_4_6 + 0.0193140193140225*G0_0_0_4_7 - 0.0626839826839931*G0_0_0_4_8 - 0.0187012987013017*G0_0_0_4_9 - 0.00471317042745692*G0_0_0_5_0 + 0.00186776186776218*G0_0_0_5_1 - 0.0164584621727506*G0_0_0_5_2 - 0.0334065934065989*G0_0_0_5_3 - 0.0130726416440725*G0_0_0_5_4 + 0.0950820607963623*G0_0_0_5_5 - 0.0291936634793827*G0_0_0_5_6 + 0.0236639550925305*G0_0_0_5_7 - 0.0230436230436269*G0_0_0_5_8 - 0.0219666048237514*G0_0_0_5_9 + 0.00338159195302113*G0_0_0_6_0 + 0.00609464609464713*G0_0_0_6_1 + 0.0307400535972016*G0_0_0_6_2 - 0.0357242757242816*G0_0_0_6_3 + 0.0487969173683541*G0_0_0_6_4 - 0.0291936634793827*G0_0_0_6_5 + 0.195073497930673*G0_0_0_6_6 - 0.000620332048903588*G0_0_0_6_7 - 0.0230436230436268*G0_0_0_6_8 + 0.0266019694591167*G0_0_0_6_9 - 0.00947454661740535*G0_0_0_7_0 + 0.0048692048692057*G0_0_0_7_1 - 0.00560666846381224*G0_0_0_7_2 - 0.0960905760905922*G0_0_0_7_3 + 0.0193140193140225*G0_0_0_7_4 + 0.0236639550925305*G0_0_0_7_5 - 0.000620332048903588*G0_0_0_7_6 + 0.0433699633699706*G0_0_0_7_7 - 0.0626839826839931*G0_0_0_7_8 - 0.066813186813198*G0_0_0_7_9 + 0.0150812150812176*G0_0_0_8_0 - 0.00973840973841142*G0_0_0_8_1 + 0.0150812150812176*G0_0_0_8_2 + 0.158774558774585*G0_0_0_8_3 - 0.0626839826839931*G0_0_0_8_4 - 0.0230436230436269*G0_0_0_8_5 - 0.0230436230436268*G0_0_0_8_6 - 0.0626839826839931*G0_0_0_8_7 + 0.158774558774585*G0_0_0_8_8 + 0.133626373626396*G0_0_0_8_9 + 0.0226846169703351*G0_0_0_9_0 - 0.00275280275280321*G0_0_0_9_1 + 0.0149488606631488*G0_0_0_9_2 + 0.200439560439594*G0_0_0_9_3 - 0.0187012987013017*G0_0_0_9_4 - 0.0219666048237514*G0_0_0_9_5 + 0.0266019694591167*G0_0_0_9_6 - 0.066813186813198*G0_0_0_9_7 + 0.133626373626396*G0_0_0_9_8 + 0.326073926073981*G0_0_0_9_9 + 0.001841403746166*G0_1_0_0_0 - 0.00879614212947705*G0_1_0_0_1 + 0.00107419916943744*G0_1_0_0_2 + 0.0102031302031319*G0_1_0_0_3 - 0.0037029637029643*G0_1_0_0_4 - 0.000279085993371721*G0_1_0_0_5 - 0.00136371564943018*G0_1_0_0_6 - 0.00298368298368344*G0_1_0_0_7 + 0.00737928737928854*G0_1_0_0_8 + 0.00868464868465015*G0_1_0_0_9 - 0.00879614212947705*G0_1_0_1_0 - 0.294322960989679*G0_1_0_1_1 - 0.00879614212947696*G0_1_0_1_2 - 0.0811632811632952*G0_1_0_1_3 + 0.0395160395160463*G0_1_0_1_4 + 0.00066600066600089*G0_1_0_1_5 + 0.000666000666000743*G0_1_0_1_6 + 0.0395160395160465*G0_1_0_1_7 - 0.0811632811632956*G0_1_0_1_8 - 0.00426240426240507*G0_1_0_1_9 + 0.00107419916943744*G0_1_0_2_0 - 0.00879614212947696*G0_1_0_2_1 + 0.0018414037461659*G0_1_0_2_2 + 0.0073792873792886*G0_1_0_2_3 - 0.00298368298368348*G0_1_0_2_4 - 0.00136371564943014*G0_1_0_2_5 - 0.000279085993371782*G0_1_0_2_6 - 0.0037029637029643*G0_1_0_2_7 + 0.0102031302031319*G0_1_0_2_8 + 0.00868464868465012*G0_1_0_2_9 + 0.0102031302031319*G0_1_0_3_0 - 0.0811632811632952*G0_1_0_3_1 + 0.0073792873792886*G0_1_0_3_2 + 0.148651348651374*G0_1_0_3_3 - 0.0307692307692359*G0_1_0_3_4 - 0.0130269730269752*G0_1_0_3_5 - 0.00855144855144997*G0_1_0_3_6 - 0.0371628371628432*G0_1_0_3_7 + 0.0743256743256864*G0_1_0_3_8 + 0.0871128871129017*G0_1_0_3_9 - 0.0037029637029643*G0_1_0_4_0 + 0.0395160395160463*G0_1_0_4_1 - 0.00298368298368348*G0_1_0_4_2 - 0.0307692307692359*G0_1_0_4_3 + 0.0103896103896121*G0_1_0_4_4 + 0.00455544455544528*G0_1_0_4_5 + 0.00399600399600466*G0_1_0_4_6 + 0.0143856143856167*G0_1_0_4_7 - 0.0371628371628432*G0_1_0_4_8 - 0.035164835164841*G0_1_0_4_9 - 0.000279085993371721*G0_1_0_5_0 + 0.000666000666000889*G0_1_0_5_1 - 0.00136371564943014*G0_1_0_5_2 - 0.0130269730269752*G0_1_0_5_3 + 0.00455544455544528*G0_1_0_5_4 + 0.00632510346796175*G0_1_0_5_5 + 0.00046810332524626*G0_1_0_5_6 + 0.00399600399600465*G0_1_0_5_7 - 0.00855144855144993*G0_1_0_5_8 - 0.00895104895105042*G0_1_0_5_9 - 0.00136371564943018*G0_1_0_6_0 + 0.000666000666000744*G0_1_0_6_1 - 0.000279085993371782*G0_1_0_6_2 - 0.00855144855144997*G0_1_0_6_3 + 0.00399600399600466*G0_1_0_6_4 + 0.00046810332524626*G0_1_0_6_5 + 0.00632510346796167*G0_1_0_6_6 + 0.00455544455544531*G0_1_0_6_7 - 0.0130269730269752*G0_1_0_6_8 - 0.00895104895105043*G0_1_0_6_9 - 0.00298368298368344*G0_1_0_7_0 + 0.0395160395160465*G0_1_0_7_1 - 0.0037029637029643*G0_1_0_7_2 - 0.0371628371628432*G0_1_0_7_3 + 0.0143856143856167*G0_1_0_7_4 + 0.00399600399600465*G0_1_0_7_5 + 0.00455544455544531*G0_1_0_7_6 + 0.010389610389612*G0_1_0_7_7 - 0.0307692307692356*G0_1_0_7_8 - 0.035164835164841*G0_1_0_7_9 + 0.00737928737928854*G0_1_0_8_0 - 0.0811632811632956*G0_1_0_8_1 + 0.0102031302031319*G0_1_0_8_2 + 0.0743256743256864*G0_1_0_8_3 - 0.0371628371628432*G0_1_0_8_4 - 0.00855144855144993*G0_1_0_8_5 - 0.0130269730269752*G0_1_0_8_6 - 0.0307692307692356*G0_1_0_8_7 + 0.148651348651373*G0_1_0_8_8 + 0.0871128871129015*G0_1_0_8_9 + 0.00868464868465015*G0_1_0_9_0 - 0.00426240426240507*G0_1_0_9_1 + 0.00868464868465012*G0_1_0_9_2 + 0.0871128871129017*G0_1_0_9_3 - 0.035164835164841*G0_1_0_9_4 - 0.00895104895105042*G0_1_0_9_5 - 0.00895104895105043*G0_1_0_9_6 - 0.035164835164841*G0_1_0_9_7 + 0.0871128871129015*G0_1_0_9_8 + 0.0671328671328785*G0_1_0_9_9; + A[39] = -A[41] - 0.0211211715973657*G0_1_0_0_0 + 0.000152545866831614*G0_1_0_0_3 - 0.000410541839113339*G0_1_0_0_4 - 0.00164592021734908*G0_1_0_0_5 + 0.00201248486962808*G0_1_0_0_6 - 0.0057990157990168*G0_1_0_0_7 + 0.00295841724413204*G0_1_0_0_8 + 0.00174809317666488*G0_1_0_0_9 + 0.0211211715973659*G0_1_0_1_1 + 0.00164592021734913*G0_1_0_1_3 - 0.00201248486962809*G0_1_0_1_4 - 0.00015254586683162*G0_1_0_1_5 + 0.000410541839113343*G0_1_0_1_6 - 0.00295841724413207*G0_1_0_1_7 + 0.00579901579901687*G0_1_0_1_8 - 0.00174809317666489*G0_1_0_1_9 + 0.000920560920561058*G0_1_0_2_3 - 0.00365708365708423*G0_1_0_2_4 - 0.000920560920561094*G0_1_0_2_5 + 0.00365708365708431*G0_1_0_2_6 - 0.000117818689247281*G0_1_0_2_7 + 0.000117818689247278*G0_1_0_2_8 + 0.000152545866831614*G0_1_0_3_0 + 0.00164592021734913*G0_1_0_3_1 + 0.000920560920561058*G0_1_0_3_2 - 0.0131792017506326*G0_1_0_3_3 + 0.00667951096522636*G0_1_0_3_4 - 0.00123162551734001*G0_1_0_3_6 - 0.000457637600494824*G0_1_0_3_7 + 0.000811093668236657*G0_1_0_3_8 + 0.00615955473098429*G0_1_0_3_9 - 0.000410541839113339*G0_1_0_4_0 - 0.00201248486962809*G0_1_0_4_1 - 0.00365708365708423*G0_1_0_4_2 + 0.00667951096522636*G0_1_0_4_3 - 0.0101964701964719*G0_1_0_4_4 + 0.00123162551734*G0_1_0_4_5 + 0.000792540792540926*G0_1_0_4_7 - 0.000353456067741835*G0_1_0_4_8 - 0.00246325103468001*G0_1_0_4_9 - 0.00164592021734908*G0_1_0_5_0 - 0.00015254586683162*G0_1_0_5_1 - 0.000920560920561094*G0_1_0_5_2 + 0.00123162551734*G0_1_0_5_4 + 0.0131792017506325*G0_1_0_5_5 - 0.00667951096522639*G0_1_0_5_6 - 0.000811093668236666*G0_1_0_5_7 + 0.000457637600494824*G0_1_0_5_8 - 0.00615955473098431*G0_1_0_5_9 + 0.00201248486962807*G0_1_0_6_0 + 0.000410541839113343*G0_1_0_6_1 + 0.00365708365708431*G0_1_0_6_2 - 0.00123162551734001*G0_1_0_6_3 - 0.00667951096522639*G0_1_0_6_5 + 0.0101964701964719*G0_1_0_6_6 + 0.000353456067741843*G0_1_0_6_7 - 0.000792540792540923*G0_1_0_6_8 + 0.00246325103468002*G0_1_0_6_9 - 0.0057990157990168*G0_1_0_7_0 - 0.00295841724413207*G0_1_0_7_1 - 0.000117818689247281*G0_1_0_7_2 - 0.000457637600494824*G0_1_0_7_3 + 0.000792540792540926*G0_1_0_7_4 - 0.000811093668236666*G0_1_0_7_5 + 0.000353456067741843*G0_1_0_7_6 + 0.0273012701584176*G0_1_0_7_7 - 0.00595119166547834*G0_1_0_7_9 + 0.00295841724413204*G0_1_0_8_0 + 0.00579901579901687*G0_1_0_8_1 + 0.000117818689247278*G0_1_0_8_2 + 0.000811093668236658*G0_1_0_8_3 - 0.000353456067741836*G0_1_0_8_4 + 0.000457637600494824*G0_1_0_8_5 - 0.000792540792540923*G0_1_0_8_6 - 0.0273012701584177*G0_1_0_8_8 + 0.00595119166547832*G0_1_0_8_9 + 0.00174809317666488*G0_1_0_9_0 - 0.00174809317666489*G0_1_0_9_1 + 0.00615955473098429*G0_1_0_9_3 - 0.00246325103468001*G0_1_0_9_4 - 0.00615955473098431*G0_1_0_9_5 + 0.00246325103468002*G0_1_0_9_6 - 0.00595119166547834*G0_1_0_9_7 + 0.00595119166547832*G0_1_0_9_8 + 0.00631312250359977*G0_1_1_0_0 + 0.00221103411579641*G0_1_1_0_1 - 0.000249327392184577*G0_1_1_0_3 - 0.000737886452172296*G0_1_1_0_4 + 0.00188747760176363*G0_1_1_0_5 - 0.00148645005787888*G0_1_1_0_6 + 0.00890712462141183*G0_1_1_0_7 - 0.00241885099027995*G0_1_1_0_8 + 0.000971726686012566*G0_1_1_0_9 + 0.00221103411579641*G0_1_1_1_0 + 0.0274342941009657*G0_1_1_1_1 + 0.00353339781911277*G0_1_1_1_3 - 0.00349893492750698*G0_1_1_1_4 - 0.000401873259016194*G0_1_1_1_5 - 0.00032734461305895*G0_1_1_1_6 - 0.00537726823441206*G0_1_1_1_7 + 0.0147061404204287*G0_1_1_1_8 - 0.00077636649065232*G0_1_1_1_9 - 0.00572760572760663*G0_1_1_2_2 + 0.00151034151034176*G0_1_1_2_3 - 0.00599659599659701*G0_1_1_2_4 + 0.000589780589780674*G0_1_1_2_5 - 0.0023395123395127*G0_1_1_2_6 + 0.000712726427012259*G0_1_1_2_7 + 0.000830545116259545*G0_1_1_2_8 - 0.00114552114552133*G0_1_1_2_9 - 0.000249327392184577*G0_1_1_3_0 + 0.00353339781911277*G0_1_1_3_1 + 0.00151034151034176*G0_1_1_3_2 - 0.023392797678516*G0_1_1_3_3 + 0.0116164787593379*G0_1_1_3_4 + 0.000739260739260851*G0_1_1_3_5 + 0.00145711431425742*G0_1_1_3_6 + 0.00122306265163425*G0_1_1_3_7 + 0.000793492222063834*G0_1_1_3_8 - 0.000117025831311572*G0_1_1_3_9 - 0.000737886452172295*G0_1_1_4_0 - 0.00349893492750698*G0_1_1_4_1 - 0.00599659599659701*G0_1_1_4_2 + 0.0116164787593379*G0_1_1_4_3 - 0.0142390942390967*G0_1_1_4_4 + 0.00268873983159743*G0_1_1_4_5 - 0.00414585414585484*G0_1_1_4_6 - 0.000199800199800219*G0_1_1_4_7 - 0.0020165548736981*G0_1_1_4_8 - 0.00194091622663086*G0_1_1_4_9 + 0.00188747760176363*G0_1_1_5_0 - 0.000401873259016194*G0_1_1_5_1 + 0.000589780589780674*G0_1_1_5_2 + 0.000739260739260851*G0_1_1_5_3 + 0.00268873983159743*G0_1_1_5_4 - 0.0102135959278833*G0_1_1_5_5 + 0.00493696779411145*G0_1_1_5_6 + 0.00168070025212908*G0_1_1_5_8 - 0.00627658056229587*G0_1_1_5_9 - 0.00148645005787888*G0_1_1_6_0 - 0.00032734461305895*G0_1_1_6_1 - 0.0023395123395127*G0_1_1_6_2 + 0.00145711431425742*G0_1_1_6_3 - 0.00414585414585484*G0_1_1_6_4 + 0.00493696779411145*G0_1_1_6_5 - 0.00404262404262467*G0_1_1_6_6 - 0.00166309880595623*G0_1_1_6_7 - 0.000992340992341152*G0_1_1_6_8 + 0.000522334808049165*G0_1_1_6_9 + 0.00890712462141183*G0_1_1_7_0 - 0.00537726823441206*G0_1_1_7_1 + 0.000712726427012259*G0_1_1_7_2 + 0.00122306265163425*G0_1_1_7_3 - 0.000199800199800219*G0_1_1_7_4 - 0.00166309880595623*G0_1_1_7_6 + 0.0599762142619387*G0_1_1_7_7 - 0.013871366728512*G0_1_1_7_8 + 0.000411017553874809*G0_1_1_7_9 - 0.00241885099027995*G0_1_1_8_0 + 0.0147061404204287*G0_1_1_8_1 + 0.000830545116259545*G0_1_1_8_2 + 0.000793492222063834*G0_1_1_8_3 - 0.0020165548736981*G0_1_1_8_4 + 0.00168070025212908*G0_1_1_8_5 - 0.000992340992341152*G0_1_1_8_6 - 0.013871366728512*G0_1_1_8_7 + 0.0326749441035212*G0_1_1_8_8 + 0.00636220921935316*G0_1_1_8_9 + 0.000971726686012566*G0_1_1_9_0 - 0.00077636649065232*G0_1_1_9_1 - 0.00114552114552133*G0_1_1_9_2 - 0.000117025831311572*G0_1_1_9_3 - 0.00194091622663086*G0_1_1_9_4 - 0.00627658056229587*G0_1_1_9_5 + 0.000522334808049166*G0_1_1_9_6 + 0.000411017553874808*G0_1_1_9_7 + 0.00636220921935316*G0_1_1_9_8 - 0.00863136863137007*G0_1_1_9_9; + A[137] = A[39] - 0.01704591704592*G0_0_1_0_0 - 0.000591824401348312*G0_0_1_0_1 - 0.000135455373550629*G0_0_1_0_2 - 0.00212343212343249*G0_0_1_0_5 + 0.00158611230039829*G0_0_1_0_6 - 0.00662670662670775*G0_0_1_0_7 + 0.00222769294197904*G0_0_1_0_8 + 0.000466359037787674*G0_0_1_0_9 - 0.000591824401348312*G0_0_1_1_0 + 0.00407525455144576*G0_0_1_1_1 - 0.000140194902099683*G0_0_1_1_2 - 0.000477511906083404*G0_0_1_1_3 - 0.000426372569229786*G0_0_1_1_4 - 0.000111370111370133*G0_0_1_1_5 + 0.000364661793233287*G0_0_1_1_6 - 0.000730724302153002*G0_0_1_1_7 - 0.000827690827690956*G0_0_1_1_8 - 0.00128173413887721*G0_0_1_1_9 - 0.000135455373550629*G0_0_1_2_0 - 0.000140194902099683*G0_0_1_2_1 + 0.000292670292670325*G0_0_1_2_3 - 0.0018285418285421*G0_0_1_2_4 - 0.000627890627890753*G0_0_1_2_5 + 0.00182854182854218*G0_0_1_2_6 + 0.000196734482448798*G0_0_1_2_8 + 0.000335220335220398*G0_0_1_2_9 - 0.000477511906083404*G0_0_1_3_1 + 0.000292670292670325*G0_0_1_3_2 - 0.00549878692735933*G0_0_1_3_3 + 0.00410732125017907*G0_0_1_3_4 - 0.000853907996765293*G0_0_1_3_6 + 0.000116550116550138*G0_0_1_3_7 + 0.000233575947861689*G0_0_1_3_8 + 0.00361210218353134*G0_0_1_3_9 - 0.000426372569229786*G0_0_1_4_1 - 0.0018285418285421*G0_0_1_4_2 + 0.00410732125017907*G0_0_1_4_3 - 0.00557442557442651*G0_0_1_4_4 + 0.000377717520574717*G0_0_1_4_5 + 0.000476190476190576*G0_0_1_4_6 - 0.000169592312449487*G0_0_1_4_7 - 0.000350126064411831*G0_0_1_4_8 - 0.00176109604681063*G0_0_1_4_9 - 0.00212343212343249*G0_0_1_5_0 - 0.000111370111370133*G0_0_1_5_1 - 0.000627890627890753*G0_0_1_5_2 + 0.000377717520574717*G0_0_1_5_4 + 0.00768041482327328*G0_0_1_5_5 - 0.00257218971504732*G0_0_1_5_6 - 0.000577517720374955*G0_0_1_5_7 + 0.000574187717044955*G0_0_1_5_8 - 0.00254745254745295*G0_0_1_5_9 + 0.00158611230039829*G0_0_1_6_0 + 0.000364661793233287*G0_0_1_6_1 + 0.00182854182854218*G0_0_1_6_2 - 0.000853907996765293*G0_0_1_6_3 + 0.000476190476190576*G0_0_1_6_4 - 0.00257218971504732*G0_0_1_6_5 + 0.00462204462204546*G0_0_1_6_6 - 0.000962133104990407*G0_0_1_6_8 + 0.000702154987869389*G0_0_1_6_9 - 0.00662670662670775*G0_0_1_7_0 - 0.000730724302153002*G0_0_1_7_1 + 0.000116550116550138*G0_0_1_7_3 - 0.000169592312449486*G0_0_1_7_4 - 0.000577517720374954*G0_0_1_7_5 + 0.0201679273107879*G0_0_1_7_7 + 0.00651729223157905*G0_0_1_7_8 - 0.00140573712002304*G0_0_1_7_9 + 0.00222769294197904*G0_0_1_8_0 - 0.000827690827690956*G0_0_1_8_1 + 0.000196734482448798*G0_0_1_8_2 + 0.000233575947861689*G0_0_1_8_3 - 0.000350126064411831*G0_0_1_8_4 + 0.000574187717044955*G0_0_1_8_5 - 0.000962133104990407*G0_0_1_8_6 + 0.00651729223157905*G0_0_1_8_7 - 0.00713334284762984*G0_0_1_8_8 + 0.00454545454545529*G0_0_1_8_9 + 0.000466359037787674*G0_0_1_9_0 - 0.00128173413887721*G0_0_1_9_1 + 0.000335220335220398*G0_0_1_9_2 + 0.00361210218353134*G0_0_1_9_3 - 0.00176109604681063*G0_0_1_9_4 - 0.00254745254745295*G0_0_1_9_5 + 0.000702154987869389*G0_0_1_9_6 - 0.00140573712002304*G0_0_1_9_7 + 0.00454545454545529*G0_0_1_9_8 - 0.00428143285286215*G0_0_1_9_9 + 0.01704591704592*G0_1_0_0_0 + 0.000591824401348312*G0_1_0_0_1 + 0.000135455373550629*G0_1_0_0_2 + 0.00212343212343249*G0_1_0_0_5 - 0.00158611230039829*G0_1_0_0_6 + 0.00662670662670775*G0_1_0_0_7 - 0.00222769294197904*G0_1_0_0_8 - 0.000466359037787674*G0_1_0_0_9 + 0.000591824401348312*G0_1_0_1_0 - 0.00407525455144576*G0_1_0_1_1 + 0.000140194902099683*G0_1_0_1_2 + 0.000477511906083404*G0_1_0_1_3 + 0.000426372569229786*G0_1_0_1_4 + 0.000111370111370133*G0_1_0_1_5 - 0.000364661793233287*G0_1_0_1_6 + 0.000730724302153002*G0_1_0_1_7 + 0.000827690827690956*G0_1_0_1_8 + 0.00128173413887721*G0_1_0_1_9 + 0.000135455373550629*G0_1_0_2_0 + 0.000140194902099683*G0_1_0_2_1 - 0.000292670292670325*G0_1_0_2_3 + 0.0018285418285421*G0_1_0_2_4 + 0.000627890627890753*G0_1_0_2_5 - 0.00182854182854218*G0_1_0_2_6 - 0.000196734482448798*G0_1_0_2_8 - 0.000335220335220398*G0_1_0_2_9 + 0.000477511906083404*G0_1_0_3_1 - 0.000292670292670325*G0_1_0_3_2 + 0.00549878692735933*G0_1_0_3_3 - 0.00410732125017907*G0_1_0_3_4 + 0.000853907996765293*G0_1_0_3_6 - 0.000116550116550138*G0_1_0_3_7 - 0.000233575947861689*G0_1_0_3_8 - 0.00361210218353134*G0_1_0_3_9 + 0.000426372569229786*G0_1_0_4_1 + 0.0018285418285421*G0_1_0_4_2 - 0.00410732125017908*G0_1_0_4_3 + 0.00557442557442651*G0_1_0_4_4 - 0.000377717520574717*G0_1_0_4_5 - 0.000476190476190576*G0_1_0_4_6 + 0.000169592312449486*G0_1_0_4_7 + 0.000350126064411831*G0_1_0_4_8 + 0.00176109604681063*G0_1_0_4_9 + 0.00212343212343249*G0_1_0_5_0 + 0.000111370111370133*G0_1_0_5_1 + 0.000627890627890753*G0_1_0_5_2 - 0.000377717520574717*G0_1_0_5_4 - 0.00768041482327327*G0_1_0_5_5 + 0.00257218971504732*G0_1_0_5_6 + 0.000577517720374955*G0_1_0_5_7 - 0.000574187717044955*G0_1_0_5_8 + 0.00254745254745295*G0_1_0_5_9 - 0.00158611230039829*G0_1_0_6_0 - 0.000364661793233287*G0_1_0_6_1 - 0.00182854182854218*G0_1_0_6_2 + 0.000853907996765293*G0_1_0_6_3 - 0.000476190476190576*G0_1_0_6_4 + 0.00257218971504732*G0_1_0_6_5 - 0.00462204462204546*G0_1_0_6_6 + 0.000962133104990407*G0_1_0_6_8 - 0.000702154987869389*G0_1_0_6_9 + 0.00662670662670775*G0_1_0_7_0 + 0.000730724302153002*G0_1_0_7_1 - 0.000116550116550138*G0_1_0_7_3 + 0.000169592312449486*G0_1_0_7_4 + 0.000577517720374954*G0_1_0_7_5 - 0.0201679273107879*G0_1_0_7_7 - 0.00651729223157905*G0_1_0_7_8 + 0.00140573712002304*G0_1_0_7_9 - 0.00222769294197904*G0_1_0_8_0 + 0.000827690827690956*G0_1_0_8_1 - 0.000196734482448798*G0_1_0_8_2 - 0.000233575947861689*G0_1_0_8_3 + 0.000350126064411831*G0_1_0_8_4 - 0.000574187717044955*G0_1_0_8_5 + 0.000962133104990407*G0_1_0_8_6 - 0.00651729223157905*G0_1_0_8_7 + 0.00713334284762984*G0_1_0_8_8 - 0.00454545454545529*G0_1_0_8_9 - 0.000466359037787674*G0_1_0_9_0 + 0.00128173413887721*G0_1_0_9_1 - 0.000335220335220398*G0_1_0_9_2 - 0.00361210218353134*G0_1_0_9_3 + 0.00176109604681063*G0_1_0_9_4 + 0.00254745254745295*G0_1_0_9_5 - 0.000702154987869389*G0_1_0_9_6 + 0.00140573712002304*G0_1_0_9_7 - 0.00454545454545529*G0_1_0_9_8 + 0.00428143285286215*G0_1_0_9_9; + A[167] = -A[137] - 0.0211211715973657*G0_0_1_0_0 + 0.000152545866831614*G0_0_1_0_3 - 0.000410541839113339*G0_0_1_0_4 - 0.00164592021734908*G0_0_1_0_5 + 0.00201248486962808*G0_0_1_0_6 - 0.0057990157990168*G0_0_1_0_7 + 0.00295841724413204*G0_0_1_0_8 + 0.00174809317666488*G0_0_1_0_9 + 0.0211211715973659*G0_0_1_1_1 + 0.00164592021734913*G0_0_1_1_3 - 0.00201248486962809*G0_0_1_1_4 - 0.00015254586683162*G0_0_1_1_5 + 0.000410541839113343*G0_0_1_1_6 - 0.00295841724413207*G0_0_1_1_7 + 0.00579901579901687*G0_0_1_1_8 - 0.00174809317666489*G0_0_1_1_9 + 0.000920560920561058*G0_0_1_2_3 - 0.00365708365708423*G0_0_1_2_4 - 0.000920560920561094*G0_0_1_2_5 + 0.00365708365708431*G0_0_1_2_6 - 0.000117818689247281*G0_0_1_2_7 + 0.000117818689247278*G0_0_1_2_8 + 0.000152545866831614*G0_0_1_3_0 + 0.00164592021734913*G0_0_1_3_1 + 0.000920560920561058*G0_0_1_3_2 - 0.0131792017506326*G0_0_1_3_3 + 0.00667951096522636*G0_0_1_3_4 - 0.00123162551734001*G0_0_1_3_6 - 0.000457637600494824*G0_0_1_3_7 + 0.000811093668236657*G0_0_1_3_8 + 0.00615955473098429*G0_0_1_3_9 - 0.000410541839113339*G0_0_1_4_0 - 0.00201248486962809*G0_0_1_4_1 - 0.00365708365708423*G0_0_1_4_2 + 0.00667951096522636*G0_0_1_4_3 - 0.0101964701964719*G0_0_1_4_4 + 0.00123162551734*G0_0_1_4_5 + 0.000792540792540926*G0_0_1_4_7 - 0.000353456067741836*G0_0_1_4_8 - 0.00246325103468001*G0_0_1_4_9 - 0.00164592021734908*G0_0_1_5_0 - 0.000152545866831619*G0_0_1_5_1 - 0.000920560920561094*G0_0_1_5_2 + 0.00123162551734*G0_0_1_5_4 + 0.0131792017506325*G0_0_1_5_5 - 0.00667951096522639*G0_0_1_5_6 - 0.000811093668236666*G0_0_1_5_7 + 0.000457637600494824*G0_0_1_5_8 - 0.00615955473098431*G0_0_1_5_9 + 0.00201248486962807*G0_0_1_6_0 + 0.000410541839113343*G0_0_1_6_1 + 0.00365708365708431*G0_0_1_6_2 - 0.00123162551734001*G0_0_1_6_3 - 0.00667951096522639*G0_0_1_6_5 + 0.0101964701964719*G0_0_1_6_6 + 0.000353456067741843*G0_0_1_6_7 - 0.000792540792540923*G0_0_1_6_8 + 0.00246325103468002*G0_0_1_6_9 - 0.0057990157990168*G0_0_1_7_0 - 0.00295841724413207*G0_0_1_7_1 - 0.000117818689247281*G0_0_1_7_2 - 0.000457637600494824*G0_0_1_7_3 + 0.000792540792540926*G0_0_1_7_4 - 0.000811093668236666*G0_0_1_7_5 + 0.000353456067741843*G0_0_1_7_6 + 0.0273012701584176*G0_0_1_7_7 - 0.00595119166547834*G0_0_1_7_9 + 0.00295841724413204*G0_0_1_8_0 + 0.00579901579901687*G0_0_1_8_1 + 0.000117818689247278*G0_0_1_8_2 + 0.000811093668236657*G0_0_1_8_3 - 0.000353456067741836*G0_0_1_8_4 + 0.000457637600494824*G0_0_1_8_5 - 0.000792540792540923*G0_0_1_8_6 - 0.0273012701584177*G0_0_1_8_8 + 0.00595119166547832*G0_0_1_8_9 + 0.00174809317666488*G0_0_1_9_0 - 0.00174809317666489*G0_0_1_9_1 + 0.00615955473098429*G0_0_1_9_3 - 0.00246325103468001*G0_0_1_9_4 - 0.00615955473098431*G0_0_1_9_5 + 0.00246325103468002*G0_0_1_9_6 - 0.00595119166547834*G0_0_1_9_7 + 0.00595119166547832*G0_0_1_9_8 + 0.00631312250359977*G0_1_1_0_0 + 0.00221103411579641*G0_1_1_0_1 - 0.000249327392184577*G0_1_1_0_3 - 0.000737886452172296*G0_1_1_0_4 + 0.00188747760176363*G0_1_1_0_5 - 0.00148645005787888*G0_1_1_0_6 + 0.00890712462141183*G0_1_1_0_7 - 0.00241885099027995*G0_1_1_0_8 + 0.000971726686012566*G0_1_1_0_9 + 0.00221103411579641*G0_1_1_1_0 + 0.0274342941009657*G0_1_1_1_1 + 0.00353339781911277*G0_1_1_1_3 - 0.00349893492750698*G0_1_1_1_4 - 0.000401873259016194*G0_1_1_1_5 - 0.00032734461305895*G0_1_1_1_6 - 0.00537726823441206*G0_1_1_1_7 + 0.0147061404204287*G0_1_1_1_8 - 0.00077636649065232*G0_1_1_1_9 - 0.00572760572760663*G0_1_1_2_2 + 0.00151034151034176*G0_1_1_2_3 - 0.00599659599659701*G0_1_1_2_4 + 0.000589780589780674*G0_1_1_2_5 - 0.0023395123395127*G0_1_1_2_6 + 0.000712726427012259*G0_1_1_2_7 + 0.000830545116259545*G0_1_1_2_8 - 0.00114552114552133*G0_1_1_2_9 - 0.000249327392184577*G0_1_1_3_0 + 0.00353339781911277*G0_1_1_3_1 + 0.00151034151034176*G0_1_1_3_2 - 0.023392797678516*G0_1_1_3_3 + 0.0116164787593379*G0_1_1_3_4 + 0.000739260739260852*G0_1_1_3_5 + 0.00145711431425742*G0_1_1_3_6 + 0.00122306265163425*G0_1_1_3_7 + 0.000793492222063834*G0_1_1_3_8 - 0.000117025831311572*G0_1_1_3_9 - 0.000737886452172295*G0_1_1_4_0 - 0.00349893492750698*G0_1_1_4_1 - 0.00599659599659701*G0_1_1_4_2 + 0.0116164787593379*G0_1_1_4_3 - 0.0142390942390967*G0_1_1_4_4 + 0.00268873983159743*G0_1_1_4_5 - 0.00414585414585484*G0_1_1_4_6 - 0.000199800199800219*G0_1_1_4_7 - 0.0020165548736981*G0_1_1_4_8 - 0.00194091622663086*G0_1_1_4_9 + 0.00188747760176363*G0_1_1_5_0 - 0.000401873259016194*G0_1_1_5_1 + 0.000589780589780674*G0_1_1_5_2 + 0.000739260739260852*G0_1_1_5_3 + 0.00268873983159743*G0_1_1_5_4 - 0.0102135959278833*G0_1_1_5_5 + 0.00493696779411145*G0_1_1_5_6 + 0.00168070025212908*G0_1_1_5_8 - 0.00627658056229588*G0_1_1_5_9 - 0.00148645005787888*G0_1_1_6_0 - 0.00032734461305895*G0_1_1_6_1 - 0.0023395123395127*G0_1_1_6_2 + 0.00145711431425742*G0_1_1_6_3 - 0.00414585414585484*G0_1_1_6_4 + 0.00493696779411145*G0_1_1_6_5 - 0.00404262404262467*G0_1_1_6_6 - 0.00166309880595623*G0_1_1_6_7 - 0.000992340992341152*G0_1_1_6_8 + 0.000522334808049165*G0_1_1_6_9 + 0.00890712462141183*G0_1_1_7_0 - 0.00537726823441206*G0_1_1_7_1 + 0.000712726427012259*G0_1_1_7_2 + 0.00122306265163425*G0_1_1_7_3 - 0.000199800199800219*G0_1_1_7_4 - 0.00166309880595623*G0_1_1_7_6 + 0.0599762142619387*G0_1_1_7_7 - 0.013871366728512*G0_1_1_7_8 + 0.000411017553874808*G0_1_1_7_9 - 0.00241885099027995*G0_1_1_8_0 + 0.0147061404204287*G0_1_1_8_1 + 0.000830545116259545*G0_1_1_8_2 + 0.000793492222063834*G0_1_1_8_3 - 0.0020165548736981*G0_1_1_8_4 + 0.00168070025212908*G0_1_1_8_5 - 0.000992340992341152*G0_1_1_8_6 - 0.013871366728512*G0_1_1_8_7 + 0.0326749441035212*G0_1_1_8_8 + 0.00636220921935316*G0_1_1_8_9 + 0.000971726686012566*G0_1_1_9_0 - 0.00077636649065232*G0_1_1_9_1 - 0.00114552114552133*G0_1_1_9_2 - 0.000117025831311572*G0_1_1_9_3 - 0.00194091622663086*G0_1_1_9_4 - 0.00627658056229588*G0_1_1_9_5 + 0.000522334808049165*G0_1_1_9_6 + 0.000411017553874808*G0_1_1_9_7 + 0.00636220921935316*G0_1_1_9_8 - 0.00863136863137007*G0_1_1_9_9; + A[47] = -A[167] - 0.0036748789129748*G0_0_1_0_0 + 0.000628533723771933*G0_0_1_0_1 + 0.00342487318677853*G0_0_1_0_2 + 0.00109987895702201*G0_0_1_0_3 - 0.00089941804227535*G0_0_1_0_5 + 0.00476158761873129*G0_0_1_0_6 + 0.000525823382966314*G0_0_1_0_7 + 0.00108526394240699*G0_0_1_0_8 + 0.00346225203368118*G0_0_1_0_9 + 0.000628533723771933*G0_0_1_1_0 + 0.0153463820130514*G0_0_1_1_1 + 0.00182148539291428*G0_0_1_1_2 + 0.00367595367595435*G0_0_1_1_3 - 0.00171310171310203*G0_0_1_1_4 - 0.000738600024314444*G0_0_1_1_5 + 0.00171355099926558*G0_0_1_1_6 - 0.00169238169238201*G0_0_1_1_7 + 0.00497095497095589*G0_0_1_1_8 - 0.000668220668220766*G0_0_1_1_9 + 0.00342487318677853*G0_0_1_2_0 + 0.00182148539291428*G0_0_1_2_1 + 0.0591889591889691*G0_0_1_2_2 - 0.00446146446146518*G0_0_1_2_3 + 0.0103481703481721*G0_0_1_2_4 - 0.0148836348836374*G0_0_1_2_5 + 0.0359388759388819*G0_0_1_2_6 - 0.000948390234104674*G0_0_1_2_7 + 0.000161769447483763*G0_0_1_2_8 + 0.00259518259518301*G0_0_1_2_9 + 0.00109987895702201*G0_0_1_3_0 + 0.00367595367595435*G0_0_1_3_1 - 0.00446146446146518*G0_0_1_3_2 + 0.023010323010327*G0_0_1_3_3 - 0.00674349460063856*G0_0_1_3_4 + 0.000805385091099504*G0_0_1_3_5 - 0.00783525997811841*G0_0_1_3_6 - 0.00599424385138772*G0_0_1_3_7 + 0.00917415917416071*G0_0_1_3_8 + 0.0139931497074377*G0_0_1_3_9 - 0.00171310171310203*G0_0_1_4_1 + 0.0103481703481721*G0_0_1_4_2 - 0.00674349460063856*G0_0_1_4_3 - 0.0102564102564121*G0_0_1_4_4 - 0.00246777032491358*G0_0_1_4_5 + 0.010303030303032*G0_0_1_4_6 + 0.00288330716902194*G0_0_1_4_7 - 0.00317991532277298*G0_0_1_4_8 - 0.00285000713572188*G0_0_1_4_9 - 0.00089941804227535*G0_0_1_5_0 - 0.000738600024314444*G0_0_1_5_1 - 0.0148836348836374*G0_0_1_5_2 + 0.000805385091099505*G0_0_1_5_3 - 0.00246777032491358*G0_0_1_5_4 + 0.0146910232624542*G0_0_1_5_5 - 0.0263500784929401*G0_0_1_5_6 + 0.000328243185386086*G0_0_1_5_7 - 0.000478806907378411*G0_0_1_5_8 - 0.00942914228628672*G0_0_1_5_9 + 0.00476158761873129*G0_0_1_6_0 + 0.00171355099926558*G0_0_1_6_1 + 0.0359388759388819*G0_0_1_6_2 - 0.00783525997811841*G0_0_1_6_3 + 0.010303030303032*G0_0_1_6_4 - 0.0263500784929401*G0_0_1_6_5 + 0.0588811188811288*G0_0_1_6_6 + 0.000150563721992324*G0_0_1_6_7 - 0.00146567717996313*G0_0_1_6_8 + 0.00788497217068778*G0_0_1_6_9 + 0.000525823382966314*G0_0_1_7_0 - 0.00169238169238201*G0_0_1_7_1 - 0.000948390234104674*G0_0_1_7_2 - 0.00599424385138772*G0_0_1_7_3 + 0.00288330716902194*G0_0_1_7_4 + 0.000328243185386085*G0_0_1_7_5 + 0.000150563721992324*G0_0_1_7_6 + 0.00807763664906658*G0_0_1_7_7 - 0.00793849008134856*G0_0_1_7_8 - 0.0106878835450282*G0_0_1_7_9 + 0.00108526394240699*G0_0_1_8_0 + 0.00497095497095589*G0_0_1_8_1 + 0.000161769447483764*G0_0_1_8_2 + 0.00917415917416071*G0_0_1_8_3 - 0.00317991532277298*G0_0_1_8_4 - 0.000478806907378411*G0_0_1_8_5 - 0.00146567717996313*G0_0_1_8_6 - 0.00793849008134856*G0_0_1_8_7 - 0.0206793206793243*G0_0_1_8_8 + 0.00836449265020828*G0_0_1_8_9 + 0.00346225203368118*G0_0_1_9_0 - 0.000668220668220766*G0_0_1_9_1 + 0.00259518259518301*G0_0_1_9_2 + 0.0139931497074377*G0_0_1_9_3 - 0.00285000713572187*G0_0_1_9_4 - 0.00942914228628672*G0_0_1_9_5 + 0.00788497217068778*G0_0_1_9_6 - 0.0106878835450282*G0_0_1_9_7 + 0.00836449265020828*G0_0_1_9_8 + 0.0213900385328993*G0_0_1_9_9; + A[92] = -A[47] + 0.00209991067133959*G0_0_1_0_0 + 0.00159864826531521*G0_0_1_0_2 + 0.00168593311450483*G0_0_1_0_3 - 0.00137862137862162*G0_0_1_0_4 - 0.00292945150088058*G0_0_1_0_5 + 0.00446220446220524*G0_0_1_0_6 + 0.00135388421102729*G0_0_1_0_7 - 0.000180771609343068*G0_0_1_0_8 + 0.00238237952523706*G0_0_1_0_9 - 0.00209991067133961*G0_0_1_1_1 - 0.0015986482653152*G0_0_1_1_2 + 0.00292945150088056*G0_0_1_1_3 - 0.00446220446220522*G0_0_1_1_4 - 0.00168593311450482*G0_0_1_1_5 + 0.00137862137862162*G0_0_1_1_6 + 0.000180771609343076*G0_0_1_1_7 - 0.00135388421102731*G0_0_1_1_8 - 0.00238237952523706*G0_0_1_1_9 + 0.00159864826531521*G0_0_1_2_0 - 0.0015986482653152*G0_0_1_2_1 + 0.00950160950161109*G0_0_1_2_3 - 0.0219336219336256*G0_0_1_2_4 - 0.00950160950161113*G0_0_1_2_5 + 0.0219336219336257*G0_0_1_2_6 - 0.000992340992341156*G0_0_1_2_7 + 0.000992340992341155*G0_0_1_2_8 + 0.00168593311450483*G0_0_1_3_0 + 0.00292945150088056*G0_0_1_3_1 + 0.00950160950161109*G0_0_1_3_2 + 0.0214985014985052*G0_0_1_3_3 + 0.0129270729270751*G0_0_1_3_4 - 0.00413586413586482*G0_0_1_3_6 - 0.00505779934351447*G0_0_1_3_7 + 0.00803482232053793*G0_0_1_3_8 + 0.0172627372627401*G0_0_1_3_9 - 0.00137862137862162*G0_0_1_4_0 - 0.00446220446220522*G0_0_1_4_1 - 0.0219336219336256*G0_0_1_4_2 + 0.0129270729270751*G0_0_1_4_3 - 0.058941058941069*G0_0_1_4_4 + 0.00413586413586484*G0_0_1_4_5 + 0.00355644355644415*G0_0_1_4_7 - 0.00297702297702345*G0_0_1_4_8 - 0.00827172827172965*G0_0_1_4_9 - 0.00292945150088058*G0_0_1_5_0 - 0.00168593311450482*G0_0_1_5_1 - 0.00950160950161113*G0_0_1_5_2 + 0.00413586413586484*G0_0_1_5_4 - 0.021498501498505*G0_0_1_5_5 - 0.0129270729270752*G0_0_1_5_6 - 0.00803482232053793*G0_0_1_5_7 + 0.00505779934351446*G0_0_1_5_8 - 0.0172627372627401*G0_0_1_5_9 + 0.00446220446220524*G0_0_1_6_0 + 0.00137862137862162*G0_0_1_6_1 + 0.0219336219336257*G0_0_1_6_2 - 0.00413586413586482*G0_0_1_6_3 - 0.0129270729270752*G0_0_1_6_5 + 0.058941058941069*G0_0_1_6_6 + 0.00297702297702348*G0_0_1_6_7 - 0.00355644355644414*G0_0_1_6_8 + 0.00827172827172965*G0_0_1_6_9 + 0.00135388421102729*G0_0_1_7_0 + 0.000180771609343076*G0_0_1_7_1 - 0.000992340992341156*G0_0_1_7_2 - 0.00505779934351447*G0_0_1_7_3 + 0.00355644355644415*G0_0_1_7_4 - 0.00803482232053793*G0_0_1_7_5 + 0.00297702297702348*G0_0_1_7_6 + 0.00145568716997309*G0_0_1_7_7 - 0.0131011845297581*G0_0_1_7_9 - 0.000180771609343068*G0_0_1_8_0 - 0.00135388421102731*G0_0_1_8_1 + 0.000992340992341155*G0_0_1_8_2 + 0.00803482232053793*G0_0_1_8_3 - 0.00297702297702346*G0_0_1_8_4 + 0.00505779934351446*G0_0_1_8_5 - 0.00355644355644414*G0_0_1_8_6 - 0.00145568716997323*G0_0_1_8_8 + 0.0131011845297581*G0_0_1_8_9 + 0.00238237952523706*G0_0_1_9_0 - 0.00238237952523706*G0_0_1_9_1 + 0.0172627372627401*G0_0_1_9_3 - 0.00827172827172965*G0_0_1_9_4 - 0.0172627372627401*G0_0_1_9_5 + 0.00827172827172965*G0_0_1_9_6 - 0.0131011845297581*G0_0_1_9_7 + 0.0131011845297581*G0_0_1_9_8 - 0.0216595045166511*G0_1_1_0_0 - 0.00283956783956834*G0_1_1_0_1 - 0.00180270346937045*G0_1_1_0_2 + 0.000987927416499021*G0_1_1_0_3 - 0.000975664547093294*G0_1_1_0_4 - 0.00556343127771792*G0_1_1_0_5 + 0.00319955177098088*G0_1_1_0_6 - 0.0138780795923676*G0_1_1_0_7 + 0.00411123268266193*G0_1_1_0_8 - 0.000303506017791806*G0_1_1_0_9 - 0.00283956783956834*G0_1_1_1_0 - 0.0237594151879909*G0_1_1_1_1 - 0.00340135173468566*G0_1_1_1_2 - 0.00263397977683742*G0_1_1_1_3 - 0.00126265269122432*G0_1_1_1_4 - 0.000698005698005798*G0_1_1_1_5 + 0.000402956831528321*G0_1_1_1_6 + 0.00429200429200507*G0_1_1_1_7 - 0.0152319638033951*G0_1_1_1_8 - 0.00268588554302887*G0_1_1_1_9 - 0.00180270346937045*G0_1_1_2_0 - 0.00340135173468566*G0_1_1_2_1 - 0.0534613534613625*G0_1_1_2_2 + 0.0133732933732956*G0_1_1_2_3 - 0.029942279942285*G0_1_1_2_4 + 0.00387168387168453*G0_1_1_2_5 - 0.00800865800865938*G0_1_1_2_6 - 0.000874495874496018*G0_1_1_2_7 + 0.000117845117845129*G0_1_1_2_8 - 0.0014496614496617*G0_1_1_2_9 + 0.000987927416499021*G0_1_1_3_0 - 0.00263397977683742*G0_1_1_3_1 + 0.0133732933732956*G0_1_1_3_2 + 0.00870177441606156*G0_1_1_3_3 + 0.0147335997336023*G0_1_1_3_4 - 0.00154464583036038*G0_1_1_3_5 + 0.0010106560106562*G0_1_1_3_6 - 0.000744255744255835*G0_1_1_3_7 - 0.00112173540744994*G0_1_1_3_8 + 0.00954616811759828*G0_1_1_3_9 - 0.000975664547093294*G0_1_1_4_0 - 0.00126265269122432*G0_1_1_4_1 - 0.029942279942285*G0_1_1_4_2 + 0.0147335997336023*G0_1_1_4_3 - 0.0446420246420323*G0_1_1_4_4 + 0.00514652014652103*G0_1_1_4_5 - 0.00615717615717723*G0_1_1_4_6 + 0.00166547737976336*G0_1_1_4_7 + 0.00186599115170578*G0_1_1_4_8 - 0.00594405594405695*G0_1_1_4_9 - 0.00556343127771792*G0_1_1_5_0 - 0.000698005698005798*G0_1_1_5_1 + 0.00387168387168453*G0_1_1_5_2 - 0.00154464583036038*G0_1_1_5_3 + 0.00514652014652103*G0_1_1_5_4 - 0.0127967270824434*G0_1_1_5_5 + 0.00180652680652711*G0_1_1_5_6 - 0.00915655772798782*G0_1_1_5_7 + 0.00431354359925861*G0_1_1_5_8 - 0.00771656914514183*G0_1_1_5_9 + 0.00319955177098088*G0_1_1_6_0 + 0.000402956831528321*G0_1_1_6_1 - 0.00800865800865938*G0_1_1_6_2 + 0.0010106560106562*G0_1_1_6_3 - 0.00615717615717723*G0_1_1_6_4 + 0.00180652680652711*G0_1_1_6_5 + 0.0142990342990367*G0_1_1_6_6 + 0.00484301412872923*G0_1_1_6_7 - 0.00189096617668078*G0_1_1_6_8 + 0.0023276723276727*G0_1_1_6_9 - 0.0138780795923676*G0_1_1_7_0 + 0.00429200429200507*G0_1_1_7_1 - 0.000874495874496018*G0_1_1_7_2 - 0.000744255744255835*G0_1_1_7_3 + 0.00166547737976336*G0_1_1_7_4 - 0.00915655772798782*G0_1_1_7_5 + 0.00484301412872923*G0_1_1_7_6 - 0.0392968935826145*G0_1_1_7_7 + 0.0218098568098606*G0_1_1_7_8 - 0.0087755102040831*G0_1_1_7_9 + 0.00411123268266193*G0_1_1_8_0 - 0.0152319638033951*G0_1_1_8_1 + 0.000117845117845129*G0_1_1_8_2 - 0.00112173540744994*G0_1_1_8_3 + 0.00186599115170578*G0_1_1_8_4 + 0.00431354359925861*G0_1_1_8_5 - 0.00189096617668078*G0_1_1_8_6 + 0.0218098568098606*G0_1_1_8_7 - 0.0407525807525878*G0_1_1_8_8 + 0.00432567432567502*G0_1_1_8_9 - 0.000303506017791806*G0_1_1_9_0 - 0.00268588554302887*G0_1_1_9_1 - 0.0014496614496617*G0_1_1_9_2 + 0.00954616811759828*G0_1_1_9_3 - 0.00594405594405695*G0_1_1_9_4 - 0.00771656914514183*G0_1_1_9_5 + 0.0023276723276727*G0_1_1_9_6 - 0.0087755102040831*G0_1_1_9_7 + 0.00432567432567502*G0_1_1_9_8 - 0.0127586699015292*G0_1_1_9_9; + A[121] = -A[91] + 0.00631312250359978*G0_0_0_0_0 + 0.0022110341157964*G0_0_0_0_2 - 0.000737886452172291*G0_0_0_0_3 - 0.000249327392184578*G0_0_0_0_4 + 0.00890712462141186*G0_0_0_0_5 - 0.00241885099027998*G0_0_0_0_6 + 0.00188747760176364*G0_0_0_0_7 - 0.00148645005787887*G0_0_0_0_8 + 0.00097172668601257*G0_0_0_0_9 - 0.00572760572760661*G0_0_0_1_1 - 0.00599659599659702*G0_0_0_1_3 + 0.00151034151034176*G0_0_0_1_4 + 0.000712726427012255*G0_0_0_1_5 + 0.000830545116259544*G0_0_0_1_6 + 0.000589780589780657*G0_0_0_1_7 - 0.00233951233951265*G0_0_0_1_8 - 0.00114552114552134*G0_0_0_1_9 + 0.0022110341157964*G0_0_0_2_0 + 0.0274342941009653*G0_0_0_2_2 - 0.00349893492750694*G0_0_0_2_3 + 0.00353339781911269*G0_0_0_2_4 - 0.00537726823441197*G0_0_0_2_5 + 0.0147061404204286*G0_0_0_2_6 - 0.000401873259016183*G0_0_0_2_7 - 0.000327344613058947*G0_0_0_2_8 - 0.000776366490652341*G0_0_0_2_9 - 0.000737886452172291*G0_0_0_3_0 - 0.00599659599659702*G0_0_0_3_1 - 0.00349893492750694*G0_0_0_3_2 - 0.0142390942390967*G0_0_0_3_3 + 0.0116164787593379*G0_0_0_3_4 - 0.00019980019980022*G0_0_0_3_5 - 0.00201655487369806*G0_0_0_3_6 + 0.00268873983159743*G0_0_0_3_7 - 0.00414585414585483*G0_0_0_3_8 - 0.00194091622663085*G0_0_0_3_9 - 0.000249327392184578*G0_0_0_4_0 + 0.00151034151034176*G0_0_0_4_1 + 0.00353339781911269*G0_0_0_4_2 + 0.0116164787593379*G0_0_0_4_3 - 0.0233927976785158*G0_0_0_4_4 + 0.00122306265163428*G0_0_0_4_5 + 0.000793492222063781*G0_0_0_4_6 + 0.000739260739260863*G0_0_0_4_7 + 0.0014571143142574*G0_0_0_4_8 - 0.000117025831311538*G0_0_0_4_9 + 0.00890712462141186*G0_0_0_5_0 + 0.000712726427012255*G0_0_0_5_1 - 0.00537726823441197*G0_0_0_5_2 - 0.000199800199800219*G0_0_0_5_3 + 0.00122306265163428*G0_0_0_5_4 + 0.0599762142619385*G0_0_0_5_5 - 0.0138713667285119*G0_0_0_5_6 - 0.00166309880595622*G0_0_0_5_8 + 0.00041101755387475*G0_0_0_5_9 - 0.00241885099027998*G0_0_0_6_0 + 0.000830545116259544*G0_0_0_6_1 + 0.0147061404204286*G0_0_0_6_2 - 0.00201655487369806*G0_0_0_6_3 + 0.000793492222063781*G0_0_0_6_4 - 0.0138713667285119*G0_0_0_6_5 + 0.032674944103521*G0_0_0_6_6 + 0.00168070025212911*G0_0_0_6_7 - 0.000992340992341159*G0_0_0_6_8 + 0.00636220921935314*G0_0_0_6_9 + 0.00188747760176364*G0_0_0_7_0 + 0.000589780589780657*G0_0_0_7_1 - 0.000401873259016183*G0_0_0_7_2 + 0.00268873983159743*G0_0_0_7_3 + 0.000739260739260863*G0_0_0_7_4 + 0.00168070025212911*G0_0_0_7_6 - 0.0102135959278833*G0_0_0_7_7 + 0.00493696779411141*G0_0_0_7_8 - 0.00627658056229592*G0_0_0_7_9 - 0.00148645005787887*G0_0_0_8_0 - 0.00233951233951265*G0_0_0_8_1 - 0.000327344613058947*G0_0_0_8_2 - 0.00414585414585483*G0_0_0_8_3 + 0.0014571143142574*G0_0_0_8_4 - 0.00166309880595622*G0_0_0_8_5 - 0.000992340992341158*G0_0_0_8_6 + 0.00493696779411141*G0_0_0_8_7 - 0.00404262404262456*G0_0_0_8_8 + 0.0005223348080492*G0_0_0_8_9 + 0.00097172668601257*G0_0_0_9_0 - 0.00114552114552134*G0_0_0_9_1 - 0.000776366490652341*G0_0_0_9_2 - 0.00194091622663085*G0_0_0_9_3 - 0.000117025831311538*G0_0_0_9_4 + 0.00041101755387475*G0_0_0_9_5 + 0.00636220921935314*G0_0_0_9_6 - 0.00627658056229592*G0_0_0_9_7 + 0.0005223348080492*G0_0_0_9_8 - 0.0086313686313701*G0_0_0_9_9 - 0.0211211715973658*G0_1_0_0_0 - 0.000410541839113327*G0_1_0_0_3 + 0.000152545866831605*G0_1_0_0_4 - 0.00579901579901682*G0_1_0_0_5 + 0.00295841724413205*G0_1_0_0_6 - 0.00164592021734912*G0_1_0_0_7 + 0.00201248486962811*G0_1_0_0_8 + 0.00174809317666489*G0_1_0_0_9 - 0.00365708365708419*G0_1_0_1_3 + 0.000920560920561033*G0_1_0_1_4 - 0.000117818689247291*G0_1_0_1_5 + 0.00011781868924728*G0_1_0_1_6 - 0.000920560920561148*G0_1_0_1_7 + 0.00365708365708443*G0_1_0_1_8 + 0.0211211715973656*G0_1_0_2_2 - 0.00201248486962806*G0_1_0_2_3 + 0.00164592021734906*G0_1_0_2_4 - 0.00295841724413202*G0_1_0_2_5 + 0.00579901579901675*G0_1_0_2_6 - 0.000152545866831612*G0_1_0_2_7 + 0.000410541839113345*G0_1_0_2_8 - 0.0017480931766649*G0_1_0_2_9 - 0.000410541839113327*G0_1_0_3_0 - 0.00365708365708419*G0_1_0_3_1 - 0.00201248486962806*G0_1_0_3_2 - 0.0101964701964719*G0_1_0_3_3 + 0.00667951096522635*G0_1_0_3_4 + 0.000792540792540938*G0_1_0_3_5 - 0.000353456067741849*G0_1_0_3_6 + 0.00123162551733999*G0_1_0_3_7 - 0.00246325103468002*G0_1_0_3_9 + 0.000152545866831605*G0_1_0_4_0 + 0.000920560920561033*G0_1_0_4_1 + 0.00164592021734906*G0_1_0_4_2 + 0.00667951096522636*G0_1_0_4_3 - 0.0131792017506325*G0_1_0_4_4 - 0.000457637600494825*G0_1_0_4_5 + 0.000811093668236668*G0_1_0_4_6 - 0.00123162551734004*G0_1_0_4_8 + 0.00615955473098435*G0_1_0_4_9 - 0.00579901579901682*G0_1_0_5_0 - 0.000117818689247291*G0_1_0_5_1 - 0.00295841724413202*G0_1_0_5_2 + 0.000792540792540937*G0_1_0_5_3 - 0.000457637600494825*G0_1_0_5_4 + 0.0273012701584175*G0_1_0_5_5 - 0.000811093668236695*G0_1_0_5_7 + 0.000353456067741859*G0_1_0_5_8 - 0.00595119166547841*G0_1_0_5_9 + 0.00295841724413205*G0_1_0_6_0 + 0.00011781868924728*G0_1_0_6_1 + 0.00579901579901675*G0_1_0_6_2 - 0.000353456067741849*G0_1_0_6_3 + 0.000811093668236667*G0_1_0_6_4 - 0.0273012701584177*G0_1_0_6_6 + 0.000457637600494828*G0_1_0_6_7 - 0.000792540792540937*G0_1_0_6_8 + 0.0059511916654784*G0_1_0_6_9 - 0.00164592021734912*G0_1_0_7_0 - 0.000920560920561148*G0_1_0_7_1 - 0.000152545866831612*G0_1_0_7_2 + 0.00123162551733999*G0_1_0_7_3 - 0.000811093668236695*G0_1_0_7_5 + 0.000457637600494828*G0_1_0_7_6 + 0.0131792017506325*G0_1_0_7_7 - 0.00667951096522643*G0_1_0_7_8 - 0.00615955473098435*G0_1_0_7_9 + 0.00201248486962811*G0_1_0_8_0 + 0.00365708365708442*G0_1_0_8_1 + 0.000410541839113345*G0_1_0_8_2 - 0.00123162551734004*G0_1_0_8_4 + 0.000353456067741859*G0_1_0_8_5 - 0.000792540792540937*G0_1_0_8_6 - 0.00667951096522643*G0_1_0_8_7 + 0.0101964701964721*G0_1_0_8_8 + 0.00246325103468005*G0_1_0_8_9 + 0.00174809317666489*G0_1_0_9_0 - 0.0017480931766649*G0_1_0_9_2 - 0.00246325103468002*G0_1_0_9_3 + 0.00615955473098435*G0_1_0_9_4 - 0.00595119166547841*G0_1_0_9_5 + 0.0059511916654784*G0_1_0_9_6 - 0.00615955473098435*G0_1_0_9_7 + 0.00246325103468005*G0_1_0_9_8; + A[76] = -A[121] - 0.0036748789129748*G0_1_0_0_0 + 0.00342487318677856*G0_1_0_0_1 + 0.000628533723771926*G0_1_0_0_2 + 0.001099878957022*G0_1_0_0_4 + 0.000525823382966322*G0_1_0_0_5 + 0.00108526394240698*G0_1_0_0_6 - 0.000899418042275366*G0_1_0_0_7 + 0.00476158761873132*G0_1_0_0_8 + 0.00346225203368119*G0_1_0_0_9 + 0.00342487318677856*G0_1_0_1_0 + 0.0591889591889697*G0_1_0_1_1 + 0.00182148539291428*G0_1_0_1_2 + 0.0103481703481722*G0_1_0_1_3 - 0.00446146446146527*G0_1_0_1_4 - 0.000948390234104711*G0_1_0_1_5 + 0.00016176944748377*G0_1_0_1_6 - 0.0148836348836375*G0_1_0_1_7 + 0.0359388759388823*G0_1_0_1_8 + 0.00259518259518306*G0_1_0_1_9 + 0.000628533723771926*G0_1_0_2_0 + 0.00182148539291428*G0_1_0_2_1 + 0.0153463820130513*G0_1_0_2_2 - 0.00171310171310199*G0_1_0_2_3 + 0.00367595367595429*G0_1_0_2_4 - 0.00169238169238197*G0_1_0_2_5 + 0.00497095497095579*G0_1_0_2_6 - 0.000738600024314437*G0_1_0_2_7 + 0.00171355099926558*G0_1_0_2_8 - 0.000668220668220782*G0_1_0_2_9 + 0.0103481703481722*G0_1_0_3_1 - 0.00171310171310199*G0_1_0_3_2 - 0.010256410256412*G0_1_0_3_3 - 0.0067434946006386*G0_1_0_3_4 + 0.00288330716902193*G0_1_0_3_5 - 0.003179915322773*G0_1_0_3_6 - 0.00246777032491363*G0_1_0_3_7 + 0.0103030303030321*G0_1_0_3_8 - 0.0028500071357219*G0_1_0_3_9 + 0.001099878957022*G0_1_0_4_0 - 0.00446146446146527*G0_1_0_4_1 + 0.00367595367595429*G0_1_0_4_2 - 0.0067434946006386*G0_1_0_4_3 + 0.0230103230103268*G0_1_0_4_4 - 0.0059942438513877*G0_1_0_4_5 + 0.0091741591741607*G0_1_0_4_6 + 0.000805385091099534*G0_1_0_4_7 - 0.00783525997811847*G0_1_0_4_8 + 0.0139931497074377*G0_1_0_4_9 + 0.000525823382966322*G0_1_0_5_0 - 0.000948390234104711*G0_1_0_5_1 - 0.00169238169238197*G0_1_0_5_2 + 0.00288330716902193*G0_1_0_5_3 - 0.0059942438513877*G0_1_0_5_4 + 0.00807763664906653*G0_1_0_5_5 - 0.00793849008134855*G0_1_0_5_6 + 0.000328243185386097*G0_1_0_5_7 + 0.000150563721992301*G0_1_0_5_8 - 0.0106878835450282*G0_1_0_5_9 + 0.00108526394240698*G0_1_0_6_0 + 0.00016176944748377*G0_1_0_6_1 + 0.00497095497095579*G0_1_0_6_2 - 0.003179915322773*G0_1_0_6_3 + 0.0091741591741607*G0_1_0_6_4 - 0.00793849008134855*G0_1_0_6_5 - 0.0206793206793242*G0_1_0_6_6 - 0.000478806907378421*G0_1_0_6_7 - 0.00146567717996313*G0_1_0_6_8 + 0.00836449265020835*G0_1_0_6_9 - 0.000899418042275366*G0_1_0_7_0 - 0.0148836348836375*G0_1_0_7_1 - 0.000738600024314437*G0_1_0_7_2 - 0.00246777032491363*G0_1_0_7_3 + 0.000805385091099534*G0_1_0_7_4 + 0.000328243185386097*G0_1_0_7_5 - 0.000478806907378421*G0_1_0_7_6 + 0.0146910232624543*G0_1_0_7_7 - 0.0263500784929402*G0_1_0_7_8 - 0.00942914228628674*G0_1_0_7_9 + 0.00476158761873132*G0_1_0_8_0 + 0.0359388759388823*G0_1_0_8_1 + 0.00171355099926558*G0_1_0_8_2 + 0.0103030303030321*G0_1_0_8_3 - 0.00783525997811847*G0_1_0_8_4 + 0.000150563721992301*G0_1_0_8_5 - 0.00146567717996313*G0_1_0_8_6 - 0.0263500784929402*G0_1_0_8_7 + 0.058881118881129*G0_1_0_8_8 + 0.00788497217068781*G0_1_0_8_9 + 0.00346225203368119*G0_1_0_9_0 + 0.00259518259518306*G0_1_0_9_1 - 0.000668220668220782*G0_1_0_9_2 - 0.0028500071357219*G0_1_0_9_3 + 0.0139931497074377*G0_1_0_9_4 - 0.0106878835450282*G0_1_0_9_5 + 0.00836449265020835*G0_1_0_9_6 - 0.00942914228628674*G0_1_0_9_7 + 0.00788497217068781*G0_1_0_9_8 + 0.0213900385328993*G0_1_0_9_9; + A[136] = -A[76] - 0.0216595045166512*G0_0_0_0_0 - 0.00180270346937046*G0_0_0_0_1 - 0.00283956783956833*G0_0_0_0_2 - 0.000975664547093292*G0_0_0_0_3 + 0.00098792741649902*G0_0_0_0_4 - 0.0138780795923677*G0_0_0_0_5 + 0.00411123268266197*G0_0_0_0_6 - 0.00556343127771796*G0_0_0_0_7 + 0.00319955177098089*G0_0_0_0_8 - 0.000303506017791802*G0_0_0_0_9 - 0.00180270346937046*G0_0_0_1_0 - 0.0534613534613627*G0_0_0_1_1 - 0.00340135173468565*G0_0_0_1_2 - 0.0299422799422851*G0_0_0_1_3 + 0.0133732933732957*G0_0_0_1_4 - 0.000874495874496006*G0_0_0_1_5 + 0.000117845117845132*G0_0_0_1_6 + 0.00387168387168458*G0_0_0_1_7 - 0.00800865800865948*G0_0_0_1_8 - 0.00144966144966172*G0_0_0_1_9 - 0.00283956783956833*G0_0_0_2_0 - 0.00340135173468565*G0_0_0_2_1 - 0.0237594151879906*G0_0_0_2_2 - 0.00126265269122434*G0_0_0_2_3 - 0.00263397977683736*G0_0_0_2_4 + 0.004292004292005*G0_0_0_2_5 - 0.0152319638033949*G0_0_0_2_6 - 0.000698005698005812*G0_0_0_2_7 + 0.000402956831528317*G0_0_0_2_8 - 0.00268588554302885*G0_0_0_2_9 - 0.000975664547093292*G0_0_0_3_0 - 0.0299422799422851*G0_0_0_3_1 - 0.00126265269122434*G0_0_0_3_2 - 0.0446420246420323*G0_0_0_3_3 + 0.0147335997336023*G0_0_0_3_4 + 0.00166547737976338*G0_0_0_3_5 + 0.00186599115170575*G0_0_0_3_6 + 0.00514652014652106*G0_0_0_3_7 - 0.00615717615717728*G0_0_0_3_8 - 0.00594405594405699*G0_0_0_3_9 + 0.00098792741649902*G0_0_0_4_0 + 0.0133732933732957*G0_0_0_4_1 - 0.00263397977683736*G0_0_0_4_2 + 0.0147335997336023*G0_0_0_4_3 + 0.00870177441606156*G0_0_0_4_4 - 0.000744255744255869*G0_0_0_4_5 - 0.00112173540744988*G0_0_0_4_6 - 0.0015446458303604*G0_0_0_4_7 + 0.00101065601065622*G0_0_0_4_8 + 0.00954616811759831*G0_0_0_4_9 - 0.0138780795923677*G0_0_0_5_0 - 0.000874495874496006*G0_0_0_5_1 + 0.004292004292005*G0_0_0_5_2 + 0.00166547737976338*G0_0_0_5_3 - 0.000744255744255869*G0_0_0_5_4 - 0.0392968935826145*G0_0_0_5_5 + 0.0218098568098605*G0_0_0_5_6 - 0.00915655772798784*G0_0_0_5_7 + 0.00484301412872924*G0_0_0_5_8 - 0.00877551020408312*G0_0_0_5_9 + 0.00411123268266197*G0_0_0_6_0 + 0.000117845117845132*G0_0_0_6_1 - 0.0152319638033949*G0_0_0_6_2 + 0.00186599115170575*G0_0_0_6_3 - 0.00112173540744988*G0_0_0_6_4 + 0.0218098568098605*G0_0_0_6_5 - 0.0407525807525876*G0_0_0_6_6 + 0.0043135435992586*G0_0_0_6_7 - 0.00189096617668078*G0_0_0_6_8 + 0.00432567432567508*G0_0_0_6_9 - 0.00556343127771796*G0_0_0_7_0 + 0.00387168387168458*G0_0_0_7_1 - 0.000698005698005812*G0_0_0_7_2 + 0.00514652014652106*G0_0_0_7_3 - 0.00154464583036039*G0_0_0_7_4 - 0.00915655772798784*G0_0_0_7_5 + 0.0043135435992586*G0_0_0_7_6 - 0.0127967270824435*G0_0_0_7_7 + 0.00180652680652717*G0_0_0_7_8 - 0.00771656914514186*G0_0_0_7_9 + 0.00319955177098089*G0_0_0_8_0 - 0.00800865800865948*G0_0_0_8_1 + 0.000402956831528317*G0_0_0_8_2 - 0.00615717615717728*G0_0_0_8_3 + 0.00101065601065622*G0_0_0_8_4 + 0.00484301412872924*G0_0_0_8_5 - 0.00189096617668078*G0_0_0_8_6 + 0.00180652680652717*G0_0_0_8_7 + 0.0142990342990366*G0_0_0_8_8 + 0.0023276723276727*G0_0_0_8_9 - 0.000303506017791803*G0_0_0_9_0 - 0.00144966144966172*G0_0_0_9_1 - 0.00268588554302885*G0_0_0_9_2 - 0.00594405594405699*G0_0_0_9_3 + 0.00954616811759831*G0_0_0_9_4 - 0.00877551020408312*G0_0_0_9_5 + 0.00432567432567508*G0_0_0_9_6 - 0.00771656914514186*G0_0_0_9_7 + 0.00232767232767269*G0_0_0_9_8 - 0.0127586699015292*G0_0_0_9_9 + 0.00209991067133961*G0_1_0_0_0 + 0.00159864826531521*G0_1_0_0_1 - 0.00137862137862162*G0_1_0_0_3 + 0.00168593311450483*G0_1_0_0_4 + 0.0013538842110273*G0_1_0_0_5 - 0.000180771609343068*G0_1_0_0_6 - 0.00292945150088056*G0_1_0_0_7 + 0.00446220446220523*G0_1_0_0_8 + 0.00238237952523707*G0_1_0_0_9 + 0.00159864826531521*G0_1_0_1_0 - 0.0015986482653152*G0_1_0_1_2 - 0.0219336219336256*G0_1_0_1_3 + 0.00950160950161108*G0_1_0_1_4 - 0.000992340992341171*G0_1_0_1_5 + 0.000992340992341167*G0_1_0_1_6 - 0.00950160950161114*G0_1_0_1_7 + 0.0219336219336257*G0_1_0_1_8 - 0.0015986482653152*G0_1_0_2_1 - 0.0020999106713396*G0_1_0_2_2 - 0.00446220446220522*G0_1_0_2_3 + 0.00292945150088056*G0_1_0_2_4 + 0.000180771609343071*G0_1_0_2_5 - 0.0013538842110273*G0_1_0_2_6 - 0.00168593311450482*G0_1_0_2_7 + 0.00137862137862161*G0_1_0_2_8 - 0.00238237952523708*G0_1_0_2_9 - 0.00137862137862162*G0_1_0_3_0 - 0.0219336219336256*G0_1_0_3_1 - 0.00446220446220522*G0_1_0_3_2 - 0.058941058941069*G0_1_0_3_3 + 0.0129270729270752*G0_1_0_3_4 + 0.00355644355644415*G0_1_0_3_5 - 0.00297702297702347*G0_1_0_3_6 + 0.00413586413586486*G0_1_0_3_7 - 0.00827172827172971*G0_1_0_3_9 + 0.00168593311450483*G0_1_0_4_0 + 0.00950160950161108*G0_1_0_4_1 + 0.00292945150088056*G0_1_0_4_2 + 0.0129270729270752*G0_1_0_4_3 + 0.021498501498505*G0_1_0_4_4 - 0.00505779934351447*G0_1_0_4_5 + 0.00803482232053794*G0_1_0_4_6 - 0.00413586413586482*G0_1_0_4_8 + 0.0172627372627402*G0_1_0_4_9 + 0.0013538842110273*G0_1_0_5_0 - 0.000992340992341171*G0_1_0_5_1 + 0.000180771609343071*G0_1_0_5_2 + 0.00355644355644415*G0_1_0_5_3 - 0.00505779934351447*G0_1_0_5_4 + 0.0014556871699731*G0_1_0_5_5 - 0.00803482232053794*G0_1_0_5_7 + 0.00297702297702346*G0_1_0_5_8 - 0.0131011845297582*G0_1_0_5_9 - 0.000180771609343068*G0_1_0_6_0 + 0.000992340992341167*G0_1_0_6_1 - 0.0013538842110273*G0_1_0_6_2 - 0.00297702297702347*G0_1_0_6_3 + 0.00803482232053794*G0_1_0_6_4 - 0.00145568716997317*G0_1_0_6_6 + 0.00505779934351446*G0_1_0_6_7 - 0.00355644355644414*G0_1_0_6_8 + 0.0131011845297582*G0_1_0_6_9 - 0.00292945150088056*G0_1_0_7_0 - 0.00950160950161114*G0_1_0_7_1 - 0.00168593311450482*G0_1_0_7_2 + 0.00413586413586486*G0_1_0_7_3 - 0.00803482232053794*G0_1_0_7_5 + 0.00505779934351446*G0_1_0_7_6 - 0.021498501498505*G0_1_0_7_7 - 0.0129270729270751*G0_1_0_7_8 - 0.0172627372627402*G0_1_0_7_9 + 0.00446220446220523*G0_1_0_8_0 + 0.0219336219336257*G0_1_0_8_1 + 0.0013786213786216*G0_1_0_8_2 - 0.00413586413586482*G0_1_0_8_4 + 0.00297702297702346*G0_1_0_8_5 - 0.00355644355644414*G0_1_0_8_6 - 0.0129270729270752*G0_1_0_8_7 + 0.0589410589410689*G0_1_0_8_8 + 0.00827172827172966*G0_1_0_8_9 + 0.00238237952523707*G0_1_0_9_0 - 0.00238237952523708*G0_1_0_9_2 - 0.00827172827172971*G0_1_0_9_3 + 0.0172627372627402*G0_1_0_9_4 - 0.0131011845297582*G0_1_0_9_5 + 0.0131011845297582*G0_1_0_9_6 - 0.0172627372627402*G0_1_0_9_7 + 0.00827172827172966*G0_1_0_9_8; + A[64] = A[160] - 0.182217676503423*G0_0_0_0_0 - 0.0119945927088805*G0_0_0_0_1 - 0.00105495034066486*G0_0_0_0_2 - 0.00987417344560368*G0_0_0_0_3 + 0.0418284096855597*G0_0_0_0_4 - 0.136836972551282*G0_0_0_0_5 + 0.0823609723609866*G0_0_0_0_6 - 0.0571005185290997*G0_0_0_0_7 + 0.0116221873364751*G0_0_0_0_8 + 0.0164178678464419*G0_0_0_0_9 - 0.0119945927088805*G0_0_0_1_0 - 0.180045880045911*G0_0_0_1_1 - 0.00282503211074689*G0_0_0_1_2 - 0.132304362304385*G0_0_0_1_3 + 0.0552680652680747*G0_0_0_1_4 - 0.0160508539079994*G0_0_0_1_5 + 0.0197704676276138*G0_0_0_1_6 + 0.00964701964702142*G0_0_0_1_7 - 0.0501132201132288*G0_0_0_1_8 - 0.0124675324675346*G0_0_0_1_9 - 0.00105495034066487*G0_0_0_2_0 - 0.00282503211074689*G0_0_0_2_1 + 0.207620844763736*G0_0_0_2_2 - 0.0665020693592232*G0_0_0_2_3 + 0.0595333238190478*G0_0_0_2_4 - 0.0798220826792388*G0_0_0_2_5 + 0.151707815993555*G0_0_0_2_6 - 0.0153058845916014*G0_0_0_2_7 - 0.018342847628565*G0_0_0_2_8 - 0.0364521193092684*G0_0_0_2_9 - 0.00987417344560368*G0_0_0_3_0 - 0.132304362304385*G0_0_0_3_1 - 0.0665020693592232*G0_0_0_3_2 - 0.192107892107925*G0_0_0_3_3 + 0.111178107606698*G0_0_0_3_4 + 0.0307620950478144*G0_0_0_3_5 - 0.0430605109176609*G0_0_0_3_6 + 0.0458734123019916*G0_0_0_3_7 - 0.117152847152867*G0_0_0_3_8 - 0.0543442272013793*G0_0_0_3_9 + 0.0418284096855597*G0_0_0_4_0 + 0.0552680652680747*G0_0_0_4_1 + 0.0595333238190478*G0_0_0_4_2 + 0.111178107606698*G0_0_0_4_3 + 0.617416868845545*G0_0_0_4_4 - 0.109234337091498*G0_0_0_4_5 + 0.152294848009159*G0_0_0_4_6 - 0.0479092336235275*G0_0_0_4_7 + 0.0712794348508754*G0_0_0_4_8 + 0.327825032110802*G0_0_0_4_9 - 0.136836972551282*G0_0_0_5_0 - 0.0160508539079994*G0_0_0_5_1 - 0.0798220826792388*G0_0_0_5_2 + 0.0307620950478144*G0_0_0_5_3 - 0.109234337091498*G0_0_0_5_4 - 0.279380619380667*G0_0_0_5_5 - 0.0192514628228942*G0_0_0_5_6 - 0.126571999429163*G0_0_0_5_7 + 0.0644034536891789*G0_0_0_5_8 - 0.178060510917684*G0_0_0_5_9 + 0.0823609723609866*G0_0_0_6_0 + 0.0197704676276138*G0_0_0_6_1 + 0.151707815993555*G0_0_0_6_2 - 0.0430605109176609*G0_0_0_6_3 + 0.152294848009159*G0_0_0_6_4 - 0.0192514628228943*G0_0_0_6_5 + 0.34888540031403*G0_0_0_6_6 + 0.0621685457399847*G0_0_0_6_7 - 0.0102668759811634*G0_0_0_6_8 + 0.195477379763127*G0_0_0_6_9 - 0.0571005185290997*G0_0_0_7_0 + 0.00964701964702143*G0_0_0_7_1 - 0.0153058845916014*G0_0_0_7_2 + 0.0458734123019916*G0_0_0_7_3 - 0.0479092336235274*G0_0_0_7_4 - 0.126571999429163*G0_0_0_7_5 + 0.0621685457399847*G0_0_0_7_6 - 0.467181390038611*G0_0_0_7_7 + 0.163736977308433*G0_0_0_7_8 - 0.173590695019296*G0_0_0_7_9 + 0.0116221873364751*G0_0_0_8_0 - 0.0501132201132288*G0_0_0_8_1 - 0.0183428476285649*G0_0_0_8_2 - 0.117152847152867*G0_0_0_8_3 + 0.0712794348508754*G0_0_0_8_4 + 0.0644034536891789*G0_0_0_8_5 - 0.0102668759811634*G0_0_0_8_6 + 0.163736977308433*G0_0_0_8_7 - 0.460399600399678*G0_0_0_8_8 - 0.105156272299147*G0_0_0_8_9 + 0.0164178678464419*G0_0_0_9_0 - 0.0124675324675346*G0_0_0_9_1 - 0.0364521193092684*G0_0_0_9_2 - 0.0543442272013794*G0_0_0_9_3 + 0.327825032110802*G0_0_0_9_4 - 0.178060510917684*G0_0_0_9_5 + 0.195477379763127*G0_0_0_9_6 - 0.173590695019296*G0_0_0_9_7 - 0.105156272299147*G0_0_0_9_8 - 0.00354502640217025*G0_0_0_9_9 + 0.011615685901402*G0_0_1_0_0 - 0.00652477152477269*G0_0_1_0_1 - 0.00105495034066482*G0_0_1_0_2 - 0.00307953950811151*G0_0_1_0_3 + 0.016349602778177*G0_0_1_0_4 + 0.00394177251320169*G0_0_1_0_5 + 0.00225702868560053*G0_0_1_0_6 - 0.00104990247847405*G0_0_1_0_7 - 0.0138934874649185*G0_0_1_0_8 + 0.00442557442557517*G0_0_1_0_9 - 0.00652477152477269*G0_0_1_1_0 - 0.180045880045911*G0_0_1_1_1 - 0.00829485329485471*G0_0_1_1_2 - 0.137296037296061*G0_0_1_1_3 + 0.0391175491175558*G0_0_1_1_4 + 0.00337828837828899*G0_0_1_1_5 + 0.00034132534132539*G0_0_1_1_6 + 0.0257975357975403*G0_0_1_1_7 - 0.0451215451215531*G0_0_1_1_8 - 0.0124675324675346*G0_0_1_1_9 - 0.00105495034066482*G0_0_1_2_0 - 0.00829485329485471*G0_0_1_2_1 + 0.013787482358913*G0_0_1_2_2 - 0.04098639455783*G0_0_1_2_3 + 0.0034827077684225*G0_0_1_2_4 + 0.000281860996146796*G0_0_1_2_5 + 0.0109290709290727*G0_0_1_2_6 + 0.0101729223157812*G0_0_1_2_7 - 0.0251374815660572*G0_0_1_2_8 - 0.0244598258884015*G0_0_1_2_9 - 0.00307953950811151*G0_0_1_3_0 - 0.137296037296061*G0_0_1_3_1 - 0.04098639455783*G0_0_1_3_2 - 0.191988011988045*G0_0_1_3_3 + 0.202672327672362*G0_0_1_3_4 - 0.00857356928785641*G0_0_1_3_5 + 0.0152269159412043*G0_0_1_3_6 + 0.0254895104895149*G0_0_1_3_7 - 0.117152847152867*G0_0_1_3_8 - 0.0135764235764262*G0_0_1_3_9 + 0.016349602778177*G0_0_1_4_0 + 0.0391175491175558*G0_0_1_4_1 + 0.00348270776842251*G0_0_1_4_2 + 0.202672327672362*G0_0_1_4_3 + 0.118754103039838*G0_0_1_4_4 - 0.0327979163693505*G0_0_1_4_5 + 0.0175710004281463*G0_0_1_4_6 - 0.0479092336235275*G0_0_1_4_7 + 0.0916633366633522*G0_0_1_4_8 + 0.138975310403906*G0_0_1_4_9 + 0.00394177251320169*G0_0_1_5_0 + 0.00337828837828899*G0_0_1_5_1 + 0.000281860996146796*G0_0_1_5_2 - 0.00857356928785641*G0_0_1_5_3 - 0.0327979163693505*G0_0_1_5_4 + 0.0313614956472153*G0_0_1_5_5 - 0.0192514628228946*G0_0_1_5_6 + 0.00815184815184951*G0_0_1_5_7 + 0.0061160268303136*G0_0_1_5_8 - 0.0255087769373527*G0_0_1_5_9 + 0.00225702868560053*G0_0_1_6_0 + 0.00034132534132539*G0_0_1_6_1 + 0.0109290709290727*G0_0_1_6_2 + 0.0152269159412043*G0_0_1_6_3 + 0.0175710004281463*G0_0_1_6_4 - 0.0192514628228946*G0_0_1_6_5 + 0.0381432852861489*G0_0_1_6_6 - 0.0142678749821631*G0_0_1_6_7 + 0.0290687883545075*G0_0_1_6_8 + 0.042925645782796*G0_0_1_6_9 - 0.00104990247847405*G0_0_1_7_0 + 0.0257975357975403*G0_0_1_7_1 + 0.0101729223157812*G0_0_1_7_2 + 0.0254895104895149*G0_0_1_7_3 - 0.0479092336235275*G0_0_1_7_4 + 0.00815184815184951*G0_0_1_7_5 - 0.0142678749821631*G0_0_1_7_6 + 0.0314813757670955*G0_0_1_7_7 + 0.0722427572427694*G0_0_1_7_8 + 0.0152590266876007*G0_0_1_7_9 - 0.0138934874649185*G0_0_1_8_0 - 0.0451215451215531*G0_0_1_8_1 - 0.0251374815660572*G0_0_1_8_2 - 0.117152847152867*G0_0_1_8_3 + 0.0916633366633522*G0_0_1_8_4 + 0.0061160268303136*G0_0_1_8_5 + 0.0290687883545075*G0_0_1_8_6 + 0.0722427572427694*G0_0_1_8_7 - 0.460519480519559*G0_0_1_8_8 - 0.145924075924101*G0_0_1_8_9 + 0.00442557442557517*G0_0_1_9_0 - 0.0124675324675346*G0_0_1_9_1 - 0.0244598258884015*G0_0_1_9_2 - 0.0135764235764262*G0_0_1_9_3 + 0.138975310403906*G0_0_1_9_4 - 0.0255087769373526*G0_0_1_9_5 + 0.042925645782796*G0_0_1_9_6 + 0.0152590266876007*G0_0_1_9_7 - 0.145924075924101*G0_0_1_9_8 - 0.00354502640217039*G0_0_1_9_9 + 0.011615685901402*G0_1_0_0_0 - 0.00652477152477269*G0_1_0_0_1 - 0.00105495034066482*G0_1_0_0_2 - 0.00307953950811151*G0_1_0_0_3 + 0.016349602778177*G0_1_0_0_4 + 0.00394177251320169*G0_1_0_0_5 + 0.00225702868560053*G0_1_0_0_6 - 0.00104990247847405*G0_1_0_0_7 - 0.0138934874649185*G0_1_0_0_8 + 0.00442557442557517*G0_1_0_0_9 - 0.00652477152477269*G0_1_0_1_0 - 0.180045880045911*G0_1_0_1_1 - 0.00829485329485471*G0_1_0_1_2 - 0.137296037296061*G0_1_0_1_3 + 0.0391175491175558*G0_1_0_1_4 + 0.00337828837828899*G0_1_0_1_5 + 0.00034132534132539*G0_1_0_1_6 + 0.0257975357975403*G0_1_0_1_7 - 0.0451215451215531*G0_1_0_1_8 - 0.0124675324675346*G0_1_0_1_9 - 0.00105495034066482*G0_1_0_2_0 - 0.00829485329485471*G0_1_0_2_1 + 0.013787482358913*G0_1_0_2_2 - 0.04098639455783*G0_1_0_2_3 + 0.00348270776842251*G0_1_0_2_4 + 0.000281860996146796*G0_1_0_2_5 + 0.0109290709290727*G0_1_0_2_6 + 0.0101729223157812*G0_1_0_2_7 - 0.0251374815660572*G0_1_0_2_8 - 0.0244598258884015*G0_1_0_2_9 - 0.00307953950811151*G0_1_0_3_0 - 0.137296037296061*G0_1_0_3_1 - 0.04098639455783*G0_1_0_3_2 - 0.191988011988045*G0_1_0_3_3 + 0.202672327672362*G0_1_0_3_4 - 0.00857356928785641*G0_1_0_3_5 + 0.0152269159412043*G0_1_0_3_6 + 0.0254895104895149*G0_1_0_3_7 - 0.117152847152867*G0_1_0_3_8 - 0.0135764235764262*G0_1_0_3_9 + 0.016349602778177*G0_1_0_4_0 + 0.0391175491175558*G0_1_0_4_1 + 0.00348270776842251*G0_1_0_4_2 + 0.202672327672362*G0_1_0_4_3 + 0.118754103039838*G0_1_0_4_4 - 0.0327979163693505*G0_1_0_4_5 + 0.0175710004281463*G0_1_0_4_6 - 0.0479092336235275*G0_1_0_4_7 + 0.0916633366633522*G0_1_0_4_8 + 0.138975310403906*G0_1_0_4_9 + 0.00394177251320169*G0_1_0_5_0 + 0.00337828837828899*G0_1_0_5_1 + 0.000281860996146796*G0_1_0_5_2 - 0.00857356928785641*G0_1_0_5_3 - 0.0327979163693505*G0_1_0_5_4 + 0.0313614956472153*G0_1_0_5_5 - 0.0192514628228946*G0_1_0_5_6 + 0.00815184815184951*G0_1_0_5_7 + 0.0061160268303136*G0_1_0_5_8 - 0.0255087769373526*G0_1_0_5_9 + 0.00225702868560053*G0_1_0_6_0 + 0.00034132534132539*G0_1_0_6_1 + 0.0109290709290727*G0_1_0_6_2 + 0.0152269159412043*G0_1_0_6_3 + 0.0175710004281463*G0_1_0_6_4 - 0.0192514628228946*G0_1_0_6_5 + 0.0381432852861489*G0_1_0_6_6 - 0.0142678749821631*G0_1_0_6_7 + 0.0290687883545075*G0_1_0_6_8 + 0.042925645782796*G0_1_0_6_9 - 0.00104990247847405*G0_1_0_7_0 + 0.0257975357975403*G0_1_0_7_1 + 0.0101729223157812*G0_1_0_7_2 + 0.0254895104895149*G0_1_0_7_3 - 0.0479092336235275*G0_1_0_7_4 + 0.00815184815184951*G0_1_0_7_5 - 0.0142678749821631*G0_1_0_7_6 + 0.0314813757670955*G0_1_0_7_7 + 0.0722427572427694*G0_1_0_7_8 + 0.0152590266876008*G0_1_0_7_9 - 0.0138934874649185*G0_1_0_8_0 - 0.0451215451215531*G0_1_0_8_1 - 0.0251374815660572*G0_1_0_8_2 - 0.117152847152867*G0_1_0_8_3 + 0.0916633366633522*G0_1_0_8_4 + 0.0061160268303136*G0_1_0_8_5 + 0.0290687883545075*G0_1_0_8_6 + 0.0722427572427694*G0_1_0_8_7 - 0.460519480519559*G0_1_0_8_8 - 0.145924075924101*G0_1_0_8_9 + 0.00442557442557517*G0_1_0_9_0 - 0.0124675324675346*G0_1_0_9_1 - 0.0244598258884015*G0_1_0_9_2 - 0.0135764235764262*G0_1_0_9_3 + 0.138975310403906*G0_1_0_9_4 - 0.0255087769373526*G0_1_0_9_5 + 0.042925645782796*G0_1_0_9_6 + 0.0152590266876008*G0_1_0_9_7 - 0.145924075924101*G0_1_0_9_8 - 0.00354502640217039*G0_1_0_9_9 - 0.00217179645751104*G0_1_1_0_0 + 0.0017700817700821*G0_1_1_0_1 + 0.0220579420579458*G0_1_1_0_3 + 0.00617668046239585*G0_1_1_0_4 - 0.006987298415871*G0_1_1_0_5 + 0.00197516768945374*G0_1_1_0_6 - 0.00453261024689669*G0_1_1_0_7 + 0.0270929070929117*G0_1_1_0_8 + 0.0288854003139766*G0_1_1_0_9 + 0.0017700817700821*G0_1_1_1_0 - 0.00177008177008206*G0_1_1_1_2 - 0.0921744921745077*G0_1_1_1_3 + 0.0133200133200155*G0_1_1_1_4 + 0.00303696303696351*G0_1_1_1_5 - 0.00303696303696353*G0_1_1_1_6 - 0.0133200133200157*G0_1_1_1_7 + 0.092174492174508*G0_1_1_1_8 - 0.00177008177008206*G0_1_1_2_1 + 0.00217179645751106*G0_1_1_2_2 - 0.0270929070929117*G0_1_1_2_3 + 0.00453261024689662*G0_1_1_2_4 - 0.00197516768945372*G0_1_1_2_5 + 0.00698729841587099*G0_1_1_2_6 - 0.00617668046239578*G0_1_1_2_7 - 0.0220579420579458*G0_1_1_2_8 - 0.0288854003139767*G0_1_1_2_9 + 0.0220579420579458*G0_1_1_3_0 - 0.0921744921745076*G0_1_1_3_1 - 0.0270929070929117*G0_1_1_3_2 + 0.268531468531514*G0_1_1_3_3 + 0.130429570429593*G0_1_1_3_4 - 0.037642357642364*G0_1_1_3_5 + 0.00911088911089072*G0_1_1_3_6 - 0.0661738261738373*G0_1_1_3_7 + 0.132347652347675*G0_1_1_3_9 + 0.00617668046239585*G0_1_1_4_0 + 0.0133200133200155*G0_1_1_4_1 + 0.00453261024689662*G0_1_1_4_2 + 0.130429570429593*G0_1_1_4_3 + 0.0872727272727423*G0_1_1_4_4 - 0.0185300413871874*G0_1_1_4_5 + 0.00941915227629672*G0_1_1_4_6 + 0.0661738261738374*G0_1_1_4_8 + 0.123716283716305*G0_1_1_4_9 - 0.006987298415871*G0_1_1_5_0 + 0.00303696303696351*G0_1_1_5_1 - 0.00197516768945372*G0_1_1_5_2 - 0.037642357642364*G0_1_1_5_3 - 0.0185300413871874*G0_1_1_5_4 - 0.00678178963893364*G0_1_1_5_5 - 0.00941915227629668*G0_1_1_5_7 - 0.0091108891108907*G0_1_1_5_8 - 0.0684344227201485*G0_1_1_5_9 + 0.00197516768945374*G0_1_1_6_0 - 0.00303696303696353*G0_1_1_6_1 + 0.006987298415871*G0_1_1_6_2 + 0.00911088911089072*G0_1_1_6_3 + 0.00941915227629671*G0_1_1_6_4 + 0.00678178963893366*G0_1_1_6_6 + 0.0185300413871873*G0_1_1_6_7 + 0.0376423576423641*G0_1_1_6_8 + 0.0684344227201486*G0_1_1_6_9 - 0.00453261024689669*G0_1_1_7_0 - 0.0133200133200157*G0_1_1_7_1 - 0.00617668046239578*G0_1_1_7_2 - 0.0661738261738373*G0_1_1_7_3 - 0.00941915227629667*G0_1_1_7_5 + 0.0185300413871873*G0_1_1_7_6 - 0.0872727272727421*G0_1_1_7_7 - 0.130429570429593*G0_1_1_7_8 - 0.123716283716305*G0_1_1_7_9 + 0.0270929070929117*G0_1_1_8_0 + 0.092174492174508*G0_1_1_8_1 - 0.0220579420579458*G0_1_1_8_2 + 0.0661738261738374*G0_1_1_8_4 - 0.0091108891108907*G0_1_1_8_5 + 0.0376423576423641*G0_1_1_8_6 - 0.130429570429593*G0_1_1_8_7 - 0.268531468531515*G0_1_1_8_8 - 0.132347652347675*G0_1_1_8_9 + 0.0288854003139766*G0_1_1_9_0 - 0.0288854003139767*G0_1_1_9_2 + 0.132347652347675*G0_1_1_9_3 + 0.123716283716305*G0_1_1_9_4 - 0.0684344227201485*G0_1_1_9_5 + 0.0684344227201486*G0_1_1_9_6 - 0.123716283716305*G0_1_1_9_7 - 0.132347652347675*G0_1_1_9_8; + A[162] = A[187] - 0.0989824989825159*G0_0_0_0_0 - 0.00514829086257743*G0_0_0_0_1 - 0.0103872846730008*G0_0_0_0_2 + 0.0158355929784528*G0_0_0_0_3 - 0.0114000285428877*G0_0_0_0_4 - 0.155431235431262*G0_0_0_0_5 + 0.0407326007326077*G0_0_0_0_6 - 0.0355777555777616*G0_0_0_0_7 + 0.0284781884781933*G0_0_0_0_8 - 0.0124675324675347*G0_0_0_0_9 - 0.00514829086257743*G0_0_0_1_0 + 0.0284211027068221*G0_0_0_1_1 - 0.000768120768120915*G0_0_0_1_2 + 0.0462147376433171*G0_0_0_1_3 - 0.0273859473859521*G0_0_0_1_4 - 0.00500071357214294*G0_0_0_1_5 - 0.000919080919081088*G0_0_0_1_6 - 0.00583036011607543*G0_0_0_1_7 + 0.00531849103277772*G0_0_0_1_8 - 0.0262822891394364*G0_0_0_1_9 - 0.0103872846730008*G0_0_0_2_0 - 0.000768120768120915*G0_0_0_2_1 - 0.0155340955340984*G0_0_0_2_2 + 0.0287788402074166*G0_0_0_2_3 - 0.03887921602208*G0_0_0_2_4 - 0.0391760620332115*G0_0_0_2_5 + 0.000304457447314523*G0_0_0_2_6 - 0.0110118452975614*G0_0_0_2_7 + 0.0167090052804367*G0_0_0_2_8 + 0.0159383473669215*G0_0_0_2_9 + 0.0158355929784528*G0_0_0_3_0 + 0.0462147376433171*G0_0_0_3_1 + 0.0287788402074166*G0_0_0_3_2 + 0.246713286713328*G0_0_0_3_3 - 0.0104295704295721*G0_0_0_3_4 - 0.0219551876694771*G0_0_0_3_5 + 0.014162979877268*G0_0_0_3_6 - 0.0361010418153336*G0_0_0_3_7 + 0.0748223205366189*G0_0_0_3_8 + 0.151048951048976*G0_0_0_3_9 - 0.0114000285428877*G0_0_0_4_0 - 0.0273859473859521*G0_0_0_4_1 - 0.03887921602208*G0_0_0_4_2 - 0.0104295704295721*G0_0_0_4_3 - 0.246610532324861*G0_0_0_4_4 + 0.0456058227486877*G0_0_0_4_5 - 0.0597688026259557*G0_0_0_4_6 + 0.0279149422006612*G0_0_0_4_7 - 0.0387212787212852*G0_0_0_4_8 - 0.13902668759814*G0_0_0_4_9 - 0.155431235431262*G0_0_0_5_0 - 0.00500071357214294*G0_0_0_5_1 - 0.0391760620332115*G0_0_0_5_2 - 0.0219551876694771*G0_0_0_5_3 + 0.0456058227486877*G0_0_0_5_4 - 0.449550449550525*G0_0_0_5_5 + 0.248305979734593*G0_0_0_5_6 - 0.0708491508491626*G0_0_0_5_7 + 0.0264078778364537*G0_0_0_5_8 - 0.0154131582703037*G0_0_0_5_9 + 0.0407326007326077*G0_0_0_6_0 - 0.000919080919081087*G0_0_0_6_1 + 0.000304457447314522*G0_0_0_6_2 + 0.014162979877268*G0_0_0_6_3 - 0.0597688026259557*G0_0_0_6_4 + 0.248305979734593*G0_0_0_6_5 - 0.0390466676181023*G0_0_0_6_6 + 0.044441273012709*G0_0_0_6_7 - 0.0293877551020458*G0_0_0_6_8 - 0.0761410018553003*G0_0_0_6_9 - 0.0355777555777616*G0_0_0_7_0 - 0.00583036011607543*G0_0_0_7_1 - 0.0110118452975614*G0_0_0_7_2 - 0.0361010418153336*G0_0_0_7_3 + 0.0279149422006612*G0_0_0_7_4 - 0.0708491508491626*G0_0_0_7_5 + 0.044441273012709*G0_0_0_7_6 - 0.0177422577422606*G0_0_0_7_7 - 0.0196945911231659*G0_0_0_7_8 - 0.0514799486228143*G0_0_0_7_9 + 0.0284781884781933*G0_0_0_8_0 + 0.00531849103277772*G0_0_0_8_1 + 0.0167090052804367*G0_0_0_8_2 + 0.0748223205366188*G0_0_0_8_3 - 0.0387212787212852*G0_0_0_8_4 + 0.0264078778364537*G0_0_0_8_5 - 0.0293877551020458*G0_0_0_8_6 - 0.0196945911231659*G0_0_0_8_7 + 0.133717710860591*G0_0_0_8_8 + 0.15628942486088*G0_0_0_8_9 - 0.0124675324675347*G0_0_0_9_0 - 0.0262822891394364*G0_0_0_9_1 + 0.0159383473669215*G0_0_0_9_2 + 0.151048951048977*G0_0_0_9_3 - 0.13902668759814*G0_0_0_9_4 - 0.0154131582703037*G0_0_0_9_5 - 0.0761410018553003*G0_0_0_9_6 - 0.0514799486228143*G0_0_0_9_7 + 0.15628942486088*G0_0_0_9_8 - 0.114673897531059*G0_0_0_9_9 + 0.00253883682455152*G0_0_1_0_1 - 0.00253883682455157*G0_0_1_0_2 + 0.0128385899814493*G0_0_1_0_3 - 0.0128385899814493*G0_0_1_0_4 - 0.0364835164835228*G0_0_1_0_5 + 0.00399600399600471*G0_0_1_0_6 + 0.0364835164835224*G0_0_1_0_7 - 0.00399600399600458*G0_0_1_0_8 + 0.00253883682455152*G0_0_1_1_0 + 0.0161717647431961*G0_0_1_1_1 + 0.0408068122353907*G0_0_1_1_3 - 0.02682270110842*G0_0_1_1_4 - 0.0182731554160156*G0_0_1_1_5 - 0.00896817468246192*G0_0_1_1_6 + 0.0159535702392872*G0_0_1_1_7 + 0.00588934874649263*G0_0_1_1_8 - 0.0299129441986635*G0_0_1_1_9 - 0.00253883682455157*G0_0_1_2_0 - 0.0161717647431963*G0_0_1_2_2 + 0.02682270110842*G0_0_1_2_3 - 0.0408068122353908*G0_0_1_2_4 - 0.0159535702392872*G0_0_1_2_5 - 0.00588934874649267*G0_0_1_2_6 + 0.0182731554160156*G0_0_1_2_7 + 0.00896817468246188*G0_0_1_2_8 + 0.0299129441986634*G0_0_1_2_9 + 0.0128385899814493*G0_0_1_3_0 + 0.0408068122353907*G0_0_1_3_1 + 0.02682270110842*G0_0_1_3_2 + 0.234177251320148*G0_0_1_3_3 + 0.0081518481518494*G0_0_1_3_5 + 0.0269045240473858*G0_0_1_3_6 - 0.038515769944348*G0_0_1_3_7 + 0.0654202939917335*G0_0_1_3_8 + 0.166770372484686*G0_0_1_3_9 - 0.0128385899814493*G0_0_1_4_0 - 0.02682270110842*G0_0_1_4_1 - 0.0408068122353908*G0_0_1_4_2 - 0.234177251320149*G0_0_1_4_4 + 0.038515769944348*G0_0_1_4_5 - 0.0654202939917337*G0_0_1_4_6 - 0.00815184815184947*G0_0_1_4_7 - 0.0269045240473856*G0_0_1_4_8 - 0.166770372484686*G0_0_1_4_9 - 0.0364835164835228*G0_0_1_5_0 - 0.0182731554160156*G0_0_1_5_1 - 0.0159535702392872*G0_0_1_5_2 + 0.00815184815184939*G0_0_1_5_3 + 0.038515769944348*G0_0_1_5_4 - 0.739180819180944*G0_0_1_5_5 + 0.140293991722587*G0_0_1_5_6 + 0.054819466248047*G0_0_1_5_8 - 0.109638932496094*G0_0_1_5_9 + 0.00399600399600471*G0_0_1_6_0 - 0.00896817468246192*G0_0_1_6_1 - 0.00588934874649267*G0_0_1_6_2 + 0.0269045240473858*G0_0_1_6_3 - 0.0654202939917337*G0_0_1_6_4 + 0.140293991722587*G0_0_1_6_5 - 0.0986099614671207*G0_0_1_6_6 - 0.0548194662480467*G0_0_1_6_7 - 0.143547880690762*G0_0_1_6_9 + 0.0364835164835224*G0_0_1_7_0 + 0.0159535702392872*G0_0_1_7_1 + 0.0182731554160156*G0_0_1_7_2 - 0.038515769944348*G0_0_1_7_3 - 0.00815184815184946*G0_0_1_7_4 - 0.0548194662480467*G0_0_1_7_6 + 0.739180819180943*G0_0_1_7_7 - 0.140293991722587*G0_0_1_7_8 + 0.109638932496094*G0_0_1_7_9 - 0.00399600399600458*G0_0_1_8_0 + 0.00588934874649263*G0_0_1_8_1 + 0.00896817468246188*G0_0_1_8_2 + 0.0654202939917335*G0_0_1_8_3 - 0.0269045240473856*G0_0_1_8_4 + 0.054819466248047*G0_0_1_8_5 - 0.140293991722587*G0_0_1_8_7 + 0.0986099614671201*G0_0_1_8_8 + 0.143547880690762*G0_0_1_8_9 - 0.0299129441986635*G0_0_1_9_1 + 0.0299129441986634*G0_0_1_9_2 + 0.166770372484686*G0_0_1_9_3 - 0.166770372484686*G0_0_1_9_4 - 0.109638932496094*G0_0_1_9_5 - 0.143547880690762*G0_0_1_9_6 + 0.109638932496094*G0_0_1_9_7 + 0.143547880690762*G0_0_1_9_8 + 0.000930075215789647*G0_1_0_0_1 - 0.000930075215789675*G0_1_0_0_2 + 0.0113600685029276*G0_1_0_0_3 - 0.0113600685029277*G0_1_0_0_4 + 0.00880452880453019*G0_1_0_0_5 - 0.00506160506160596*G0_1_0_0_6 - 0.00880452880453044*G0_1_0_0_7 + 0.00506160506160601*G0_1_0_0_8 + 0.000930075215789647*G0_1_0_1_0 + 0.0299552299552353*G0_1_0_1_1 + 0.0512744398458773*G0_1_0_1_3 - 0.0313172541744024*G0_1_0_1_4 + 0.00222634508348834*G0_1_0_1_5 - 0.0148365919794517*G0_1_0_1_6 - 0.00970077541506283*G0_1_0_1_7 + 0.00365729508586721*G0_1_0_1_8 - 0.041193092621671*G0_1_0_1_9 - 0.000930075215789675*G0_1_0_2_0 - 0.0299552299552352*G0_1_0_2_2 + 0.0313172541744024*G0_1_0_2_3 - 0.0512744398458773*G0_1_0_2_4 + 0.00970077541506277*G0_1_0_2_5 - 0.00365729508586722*G0_1_0_2_6 - 0.00222634508348833*G0_1_0_2_7 + 0.0148365919794516*G0_1_0_2_8 + 0.041193092621671*G0_1_0_2_9 + 0.0113600685029276*G0_1_0_3_0 + 0.0512744398458773*G0_1_0_3_1 + 0.0313172541744024*G0_1_0_3_2 + 0.265928357356974*G0_1_0_3_3 - 0.0203796203796238*G0_1_0_3_5 + 0.0445097759383549*G0_1_0_3_6 - 0.0340802055087827*G0_1_0_3_7 + 0.0785899814471376*G0_1_0_3_8 + 0.191739688882578*G0_1_0_3_9 - 0.0113600685029277*G0_1_0_4_0 - 0.0313172541744024*G0_1_0_4_1 - 0.0512744398458773*G0_1_0_4_2 - 0.265928357356975*G0_1_0_4_4 + 0.0340802055087828*G0_1_0_4_5 - 0.0785899814471377*G0_1_0_4_6 + 0.0203796203796239*G0_1_0_4_7 - 0.0445097759383549*G0_1_0_4_8 - 0.191739688882578*G0_1_0_4_9 + 0.00880452880453019*G0_1_0_5_0 + 0.00222634508348834*G0_1_0_5_1 + 0.00970077541506277*G0_1_0_5_2 - 0.0203796203796238*G0_1_0_5_3 + 0.0340802055087828*G0_1_0_5_4 + 0.0388411588411659*G0_1_0_5_5 - 0.00272299129442002*G0_1_0_5_6 - 0.00667903525046499*G0_1_0_5_8 + 0.0133580705009302*G0_1_0_5_9 - 0.00506160506160596*G0_1_0_6_0 - 0.0148365919794517*G0_1_0_6_1 - 0.00365729508586722*G0_1_0_6_2 + 0.0445097759383549*G0_1_0_6_3 - 0.0785899814471377*G0_1_0_6_4 - 0.00272299129442002*G0_1_0_6_5 - 0.161427144284314*G0_1_0_6_6 + 0.00667903525046499*G0_1_0_6_7 - 0.212598829741723*G0_1_0_6_9 - 0.00880452880453044*G0_1_0_7_0 - 0.00970077541506283*G0_1_0_7_1 - 0.00222634508348833*G0_1_0_7_2 - 0.0340802055087827*G0_1_0_7_3 + 0.0203796203796239*G0_1_0_7_4 + 0.006679035250465*G0_1_0_7_6 - 0.0388411588411658*G0_1_0_7_7 + 0.00272299129442045*G0_1_0_7_8 - 0.0133580705009299*G0_1_0_7_9 + 0.00506160506160601*G0_1_0_8_0 + 0.00365729508586721*G0_1_0_8_1 + 0.0148365919794516*G0_1_0_8_2 + 0.0785899814471376*G0_1_0_8_3 - 0.0445097759383549*G0_1_0_8_4 - 0.00667903525046499*G0_1_0_8_5 + 0.00272299129442046*G0_1_0_8_7 + 0.161427144284314*G0_1_0_8_8 + 0.212598829741723*G0_1_0_8_9 - 0.041193092621671*G0_1_0_9_1 + 0.041193092621671*G0_1_0_9_2 + 0.191739688882578*G0_1_0_9_3 - 0.191739688882578*G0_1_0_9_4 + 0.0133580705009302*G0_1_0_9_5 - 0.212598829741723*G0_1_0_9_6 - 0.0133580705009299*G0_1_0_9_7 + 0.212598829741723*G0_1_0_9_8 + 0.0989824989825156*G0_1_1_0_0 + 0.0103872846730007*G0_1_1_0_1 + 0.00514829086257741*G0_1_1_0_2 + 0.0114000285428876*G0_1_1_0_3 - 0.0158355929784528*G0_1_1_0_4 + 0.0355777555777615*G0_1_1_0_5 - 0.0284781884781933*G0_1_1_0_6 + 0.155431235431262*G0_1_1_0_7 - 0.0407326007326076*G0_1_1_0_8 + 0.0124675324675346*G0_1_1_0_9 + 0.0103872846730007*G0_1_1_1_0 + 0.0155340955340982*G0_1_1_1_1 + 0.000768120768120879*G0_1_1_1_2 + 0.0388792160220799*G0_1_1_1_3 - 0.0287788402074166*G0_1_1_1_4 + 0.0110118452975614*G0_1_1_1_5 - 0.0167090052804367*G0_1_1_1_6 + 0.0391760620332115*G0_1_1_1_7 - 0.000304457447314619*G0_1_1_1_8 - 0.0159383473669215*G0_1_1_1_9 + 0.00514829086257741*G0_1_1_2_0 + 0.000768120768120878*G0_1_1_2_1 - 0.028421102706822*G0_1_1_2_2 + 0.0273859473859521*G0_1_1_2_3 - 0.0462147376433171*G0_1_1_2_4 + 0.00583036011607539*G0_1_1_2_5 - 0.00531849103277768*G0_1_1_2_6 + 0.00500071357214293*G0_1_1_2_7 + 0.000919080919081049*G0_1_1_2_8 + 0.0262822891394364*G0_1_1_2_9 + 0.0114000285428876*G0_1_1_3_0 + 0.0388792160220799*G0_1_1_3_1 + 0.0273859473859521*G0_1_1_3_2 + 0.24661053232486*G0_1_1_3_3 + 0.0104295704295723*G0_1_1_3_4 - 0.0279149422006612*G0_1_1_3_5 + 0.0387212787212853*G0_1_1_3_6 - 0.0456058227486877*G0_1_1_3_7 + 0.0597688026259555*G0_1_1_3_8 + 0.13902668759814*G0_1_1_3_9 - 0.0158355929784528*G0_1_1_4_0 - 0.0287788402074166*G0_1_1_4_1 - 0.0462147376433171*G0_1_1_4_2 + 0.0104295704295723*G0_1_1_4_3 - 0.246713286713329*G0_1_1_4_4 + 0.0361010418153337*G0_1_1_4_5 - 0.074822320536619*G0_1_1_4_6 + 0.0219551876694771*G0_1_1_4_7 - 0.0141629798772679*G0_1_1_4_8 - 0.151048951048977*G0_1_1_4_9 + 0.0355777555777615*G0_1_1_5_0 + 0.0110118452975614*G0_1_1_5_1 + 0.00583036011607539*G0_1_1_5_2 - 0.0279149422006612*G0_1_1_5_3 + 0.0361010418153337*G0_1_1_5_4 + 0.0177422577422603*G0_1_1_5_5 + 0.019694591123166*G0_1_1_5_6 + 0.0708491508491624*G0_1_1_5_7 - 0.0444412730127089*G0_1_1_5_8 + 0.0514799486228144*G0_1_1_5_9 - 0.0284781884781933*G0_1_1_6_0 - 0.0167090052804367*G0_1_1_6_1 - 0.00531849103277768*G0_1_1_6_2 + 0.0387212787212853*G0_1_1_6_3 - 0.074822320536619*G0_1_1_6_4 + 0.019694591123166*G0_1_1_6_5 - 0.133717710860591*G0_1_1_6_6 - 0.0264078778364535*G0_1_1_6_7 + 0.0293877551020458*G0_1_1_6_8 - 0.15628942486088*G0_1_1_6_9 + 0.155431235431262*G0_1_1_7_0 + 0.0391760620332115*G0_1_1_7_1 + 0.00500071357214293*G0_1_1_7_2 - 0.0456058227486877*G0_1_1_7_3 + 0.0219551876694771*G0_1_1_7_4 + 0.0708491508491624*G0_1_1_7_5 - 0.0264078778364536*G0_1_1_7_6 + 0.449550449550524*G0_1_1_7_7 - 0.248305979734593*G0_1_1_7_8 + 0.0154131582703037*G0_1_1_7_9 - 0.0407326007326076*G0_1_1_8_0 - 0.000304457447314619*G0_1_1_8_1 + 0.000919080919081049*G0_1_1_8_2 + 0.0597688026259555*G0_1_1_8_3 - 0.0141629798772679*G0_1_1_8_4 - 0.0444412730127089*G0_1_1_8_5 + 0.0293877551020457*G0_1_1_8_6 - 0.248305979734593*G0_1_1_8_7 + 0.0390466676181019*G0_1_1_8_8 + 0.0761410018553002*G0_1_1_8_9 + 0.0124675324675346*G0_1_1_9_0 - 0.0159383473669215*G0_1_1_9_1 + 0.0262822891394364*G0_1_1_9_2 + 0.13902668759814*G0_1_1_9_3 - 0.151048951048977*G0_1_1_9_4 + 0.0514799486228144*G0_1_1_9_5 - 0.15628942486088*G0_1_1_9_6 + 0.0154131582703037*G0_1_1_9_7 + 0.0761410018553002*G0_1_1_9_8 + 0.114673897531059*G0_1_1_9_9; + A[166] = -A[46] - 0.00890562700086667*G0_0_0_0_0 - 0.00456796290129706*G0_0_0_0_1 - 0.00133135823612037*G0_0_0_0_2 - 0.000491545491545588*G0_0_0_0_3 - 0.00100547600547617*G0_0_0_0_4 - 0.00554197125625794*G0_0_0_0_5 + 0.00176056747485349*G0_0_0_0_6 - 0.00117956117956137*G0_0_0_0_7 + 0.00033892033892037*G0_0_0_0_8 - 0.000881340881341046*G0_0_0_0_9 - 0.00456796290129706*G0_0_0_1_0 - 0.142693109359801*G0_0_0_1_1 - 0.00456796290129701*G0_0_0_1_2 - 0.0380452880452946*G0_0_0_1_3 + 0.0185148185148217*G0_0_0_1_4 - 0.00102212602212614*G0_0_0_1_5 - 0.00102212602212621*G0_0_0_1_6 + 0.0185148185148218*G0_0_0_1_7 - 0.0380452880452948*G0_0_0_1_8 - 0.00203130203130241*G0_0_0_1_9 - 0.00133135823612037*G0_0_0_2_0 - 0.00456796290129701*G0_0_0_2_1 - 0.00890562700086659*G0_0_0_2_2 + 0.00033892033892039*G0_0_0_2_3 - 0.00117956117956137*G0_0_0_2_4 + 0.00176056747485348*G0_0_0_2_5 - 0.0055419712562579*G0_0_0_2_6 - 0.00100547600547617*G0_0_0_2_7 - 0.000491545491545589*G0_0_0_2_8 - 0.000881340881341034*G0_0_0_2_9 - 0.000491545491545588*G0_0_0_3_0 - 0.0380452880452946*G0_0_0_3_1 + 0.00033892033892039*G0_0_0_3_2 - 0.0134865134865158*G0_0_0_3_3 + 0.00641858141858249*G0_0_0_3_4 + 0.00132201132201155*G0_0_0_3_5 + 0.00496336996337078*G0_0_0_3_6 + 0.00337162837162901*G0_0_0_3_7 - 0.00674325674325801*G0_0_0_3_8 - 0.000649350649350799*G0_0_0_3_9 - 0.00100547600547617*G0_0_0_4_0 + 0.0185148185148217*G0_0_0_4_1 - 0.00117956117956137*G0_0_0_4_2 + 0.00641858141858249*G0_0_0_4_3 - 0.0180619380619411*G0_0_0_4_4 + 0.00491341991342074*G0_0_0_4_5 - 0.00987678987679153*G0_0_0_4_6 + 0.00206793206793239*G0_0_0_4_7 + 0.003371628371629*G0_0_0_4_8 - 0.00718281718281836*G0_0_0_4_9 - 0.00554197125625794*G0_0_0_5_0 - 0.00102212602212614*G0_0_0_5_1 + 0.00176056747485348*G0_0_0_5_2 + 0.00132201132201155*G0_0_0_5_3 + 0.00491341991342074*G0_0_0_5_4 - 0.0513438942010457*G0_0_0_5_5 + 0.0110258788830236*G0_0_0_5_6 - 0.00987678987679154*G0_0_0_5_7 + 0.00496336996337082*G0_0_0_5_8 - 0.0072827172827185*G0_0_0_5_9 + 0.00176056747485349*G0_0_0_6_0 - 0.00102212602212621*G0_0_0_6_1 - 0.0055419712562579*G0_0_0_6_2 + 0.00496336996337078*G0_0_0_6_3 - 0.00987678987679153*G0_0_0_6_4 + 0.0110258788830236*G0_0_0_6_5 - 0.0513438942010456*G0_0_0_6_6 + 0.00491341991342074*G0_0_0_6_7 + 0.00132201132201154*G0_0_0_6_8 - 0.00728271728271848*G0_0_0_6_9 - 0.00117956117956137*G0_0_0_7_0 + 0.0185148185148218*G0_0_0_7_1 - 0.00100547600547617*G0_0_0_7_2 + 0.00337162837162901*G0_0_0_7_3 + 0.00206793206793239*G0_0_0_7_4 - 0.00987678987679154*G0_0_0_7_5 + 0.00491341991342074*G0_0_0_7_6 - 0.0180619380619412*G0_0_0_7_7 + 0.00641858141858263*G0_0_0_7_8 - 0.00718281718281838*G0_0_0_7_9 + 0.000338920338920371*G0_0_0_8_0 - 0.0380452880452948*G0_0_0_8_1 - 0.000491545491545589*G0_0_0_8_2 - 0.00674325674325802*G0_0_0_8_3 + 0.00337162837162901*G0_0_0_8_4 + 0.00496336996337082*G0_0_0_8_5 + 0.00132201132201154*G0_0_0_8_6 + 0.00641858141858263*G0_0_0_8_7 - 0.0134865134865161*G0_0_0_8_8 - 0.000649350649350818*G0_0_0_8_9 - 0.000881340881341046*G0_0_0_9_0 - 0.00203130203130241*G0_0_0_9_1 - 0.000881340881341034*G0_0_0_9_2 - 0.000649350649350799*G0_0_0_9_3 - 0.00718281718281836*G0_0_0_9_4 - 0.0072827172827185*G0_0_0_9_5 - 0.00728271728271848*G0_0_0_9_6 - 0.00718281718281838*G0_0_0_9_7 - 0.000649350649350821*G0_0_0_9_8 - 0.0600599400599502*G0_0_0_9_9; + A[115] = A[157] - 0.11901061901064*G0_0_1_0_0 - 0.000920005920006105*G0_0_1_0_1 - 0.000920005920006074*G0_0_1_0_2 - 0.00113719613719629*G0_0_1_0_3 - 0.00113719613719633*G0_0_1_0_4 + 0.000166500166500169*G0_0_1_0_5 + 0.00475191475191558*G0_0_1_0_6 + 0.00016650016650004*G0_0_1_0_7 + 0.00475191475191563*G0_0_1_0_8 + 0.0115084915084934*G0_0_1_0_9 - 0.000920005920006105*G0_0_1_1_0 - 0.00141340141340165*G0_0_1_1_1 + 0.000257176685748168*G0_0_1_1_2 + 0.000609866324152185*G0_0_1_1_3 - 0.000452642595499825*G0_0_1_1_4 + 0.0012875220018079*G0_0_1_1_5 - 0.00175800390086135*G0_0_1_1_6 + 0.00583535512107037*G0_0_1_1_7 + 0.00104514533085979*G0_0_1_1_8 - 0.00381761096046876*G0_0_1_1_9 - 0.000920005920006074*G0_0_1_2_0 + 0.000257176685748168*G0_0_1_2_1 - 0.0014134014134015*G0_0_1_2_2 - 0.000452642595499846*G0_0_1_2_3 + 0.000609866324152226*G0_0_1_2_4 + 0.0058353551210704*G0_0_1_2_5 + 0.00104514533085984*G0_0_1_2_6 + 0.00128752200180791*G0_0_1_2_7 - 0.00175800390086135*G0_0_1_2_8 - 0.00381761096046874*G0_0_1_2_9 - 0.00113719613719629*G0_0_1_3_0 + 0.000609866324152185*G0_0_1_3_1 - 0.000452642595499847*G0_0_1_3_2 + 0.00149422006564906*G0_0_1_3_3 + 0.00236121021835341*G0_0_1_3_4 + 0.000742828599971646*G0_0_1_3_5 + 0.00333737690880607*G0_0_1_3_6 + 0.00147495361781098*G0_0_1_3_7 - 0.00481233052661709*G0_0_1_3_8 + 0.00850292564578423*G0_0_1_3_9 - 0.00113719613719633*G0_0_1_4_0 - 0.000452642595499825*G0_0_1_4_1 + 0.000609866324152226*G0_0_1_4_2 + 0.00236121021835341*G0_0_1_4_3 + 0.00149422006564902*G0_0_1_4_4 + 0.00147495361781099*G0_0_1_4_5 - 0.00481233052661709*G0_0_1_4_6 + 0.000742828599971603*G0_0_1_4_7 + 0.00333737690880607*G0_0_1_4_8 + 0.00850292564578422*G0_0_1_4_9 + 0.000166500166500168*G0_0_1_5_0 + 0.0012875220018079*G0_0_1_5_1 + 0.0058353551210704*G0_0_1_5_2 + 0.000742828599971645*G0_0_1_5_3 + 0.00147495361781099*G0_0_1_5_4 + 0.18875124875128*G0_0_1_5_5 - 0.0348101898101957*G0_0_1_5_6 + 0.0115984015984034*G0_0_1_5_7 - 0.00579920079920171*G0_0_1_5_8 - 0.0229270729270768*G0_0_1_5_9 + 0.00475191475191559*G0_0_1_6_0 - 0.00175800390086135*G0_0_1_6_1 + 0.00104514533085984*G0_0_1_6_2 + 0.00333737690880607*G0_0_1_6_3 - 0.00481233052661709*G0_0_1_6_4 - 0.0348101898101957*G0_0_1_6_5 - 0.0131482802911401*G0_0_1_6_6 - 0.0057992007992017*G0_0_1_6_7 + 0.00624232909947302*G0_0_1_6_8 + 0.00477807906379403*G0_0_1_6_9 + 0.000166500166500037*G0_0_1_7_0 + 0.00583535512107037*G0_0_1_7_1 + 0.00128752200180791*G0_0_1_7_2 + 0.00147495361781098*G0_0_1_7_3 + 0.000742828599971604*G0_0_1_7_4 + 0.0115984015984034*G0_0_1_7_5 - 0.00579920079920171*G0_0_1_7_6 + 0.18875124875128*G0_0_1_7_7 - 0.0348101898101955*G0_0_1_7_8 - 0.0229270729270768*G0_0_1_7_9 + 0.00475191475191563*G0_0_1_8_0 + 0.00104514533085979*G0_0_1_8_1 - 0.00175800390086135*G0_0_1_8_2 - 0.00481233052661709*G0_0_1_8_3 + 0.00333737690880607*G0_0_1_8_4 - 0.00579920079920171*G0_0_1_8_5 + 0.00624232909947302*G0_0_1_8_6 - 0.0348101898101955*G0_0_1_8_7 - 0.0131482802911399*G0_0_1_8_8 + 0.00477807906379412*G0_0_1_8_9 + 0.0115084915084934*G0_0_1_9_0 - 0.00381761096046876*G0_0_1_9_1 - 0.00381761096046874*G0_0_1_9_2 + 0.00850292564578423*G0_0_1_9_3 + 0.00850292564578422*G0_0_1_9_4 - 0.0229270729270768*G0_0_1_9_5 + 0.00477807906379402*G0_0_1_9_6 - 0.0229270729270768*G0_0_1_9_7 + 0.00477807906379412*G0_0_1_9_8 - 0.120685029256479*G0_0_1_9_9 + 0.11901061901064*G0_1_0_0_0 + 0.000920005920006105*G0_1_0_0_1 + 0.000920005920006075*G0_1_0_0_2 + 0.00113719613719629*G0_1_0_0_3 + 0.00113719613719633*G0_1_0_0_4 - 0.000166500166500167*G0_1_0_0_5 - 0.00475191475191558*G0_1_0_0_6 - 0.00016650016650004*G0_1_0_0_7 - 0.00475191475191563*G0_1_0_0_8 - 0.0115084915084934*G0_1_0_0_9 + 0.000920005920006105*G0_1_0_1_0 + 0.00141340141340165*G0_1_0_1_1 - 0.000257176685748168*G0_1_0_1_2 - 0.000609866324152184*G0_1_0_1_3 + 0.000452642595499825*G0_1_0_1_4 - 0.0012875220018079*G0_1_0_1_5 + 0.00175800390086135*G0_1_0_1_6 - 0.00583535512107037*G0_1_0_1_7 - 0.00104514533085979*G0_1_0_1_8 + 0.00381761096046876*G0_1_0_1_9 + 0.000920005920006074*G0_1_0_2_0 - 0.000257176685748168*G0_1_0_2_1 + 0.0014134014134015*G0_1_0_2_2 + 0.000452642595499847*G0_1_0_2_3 - 0.000609866324152226*G0_1_0_2_4 - 0.0058353551210704*G0_1_0_2_5 - 0.00104514533085984*G0_1_0_2_6 - 0.00128752200180791*G0_1_0_2_7 + 0.00175800390086135*G0_1_0_2_8 + 0.00381761096046874*G0_1_0_2_9 + 0.00113719613719629*G0_1_0_3_0 - 0.000609866324152185*G0_1_0_3_1 + 0.000452642595499847*G0_1_0_3_2 - 0.00149422006564907*G0_1_0_3_3 - 0.00236121021835341*G0_1_0_3_4 - 0.000742828599971646*G0_1_0_3_5 - 0.00333737690880607*G0_1_0_3_6 - 0.00147495361781098*G0_1_0_3_7 + 0.00481233052661709*G0_1_0_3_8 - 0.00850292564578423*G0_1_0_3_9 + 0.00113719613719633*G0_1_0_4_0 + 0.000452642595499825*G0_1_0_4_1 - 0.000609866324152226*G0_1_0_4_2 - 0.00236121021835341*G0_1_0_4_3 - 0.00149422006564902*G0_1_0_4_4 - 0.00147495361781099*G0_1_0_4_5 + 0.00481233052661709*G0_1_0_4_6 - 0.000742828599971603*G0_1_0_4_7 - 0.00333737690880607*G0_1_0_4_8 - 0.00850292564578422*G0_1_0_4_9 - 0.000166500166500168*G0_1_0_5_0 - 0.0012875220018079*G0_1_0_5_1 - 0.00583535512107039*G0_1_0_5_2 - 0.000742828599971646*G0_1_0_5_3 - 0.00147495361781099*G0_1_0_5_4 - 0.18875124875128*G0_1_0_5_5 + 0.0348101898101957*G0_1_0_5_6 - 0.0115984015984034*G0_1_0_5_7 + 0.00579920079920171*G0_1_0_5_8 + 0.0229270729270768*G0_1_0_5_9 - 0.00475191475191559*G0_1_0_6_0 + 0.00175800390086135*G0_1_0_6_1 - 0.00104514533085984*G0_1_0_6_2 - 0.00333737690880607*G0_1_0_6_3 + 0.00481233052661709*G0_1_0_6_4 + 0.0348101898101957*G0_1_0_6_5 + 0.0131482802911401*G0_1_0_6_6 + 0.0057992007992017*G0_1_0_6_7 - 0.00624232909947302*G0_1_0_6_8 - 0.00477807906379403*G0_1_0_6_9 - 0.000166500166500037*G0_1_0_7_0 - 0.00583535512107037*G0_1_0_7_1 - 0.00128752200180791*G0_1_0_7_2 - 0.00147495361781098*G0_1_0_7_3 - 0.000742828599971603*G0_1_0_7_4 - 0.0115984015984034*G0_1_0_7_5 + 0.0057992007992017*G0_1_0_7_6 - 0.18875124875128*G0_1_0_7_7 + 0.0348101898101955*G0_1_0_7_8 + 0.0229270729270768*G0_1_0_7_9 - 0.00475191475191563*G0_1_0_8_0 - 0.00104514533085979*G0_1_0_8_1 + 0.00175800390086135*G0_1_0_8_2 + 0.00481233052661709*G0_1_0_8_3 - 0.00333737690880607*G0_1_0_8_4 + 0.00579920079920171*G0_1_0_8_5 - 0.00624232909947302*G0_1_0_8_6 + 0.0348101898101955*G0_1_0_8_7 + 0.0131482802911399*G0_1_0_8_8 - 0.00477807906379412*G0_1_0_8_9 - 0.0115084915084934*G0_1_0_9_0 + 0.00381761096046876*G0_1_0_9_1 + 0.00381761096046874*G0_1_0_9_2 - 0.00850292564578423*G0_1_0_9_3 - 0.00850292564578422*G0_1_0_9_4 + 0.0229270729270768*G0_1_0_9_5 - 0.00477807906379402*G0_1_0_9_6 + 0.0229270729270768*G0_1_0_9_7 - 0.00477807906379412*G0_1_0_9_8 + 0.120685029256479*G0_1_0_9_9; + A[190] = A[162] + 0.0379472379472444*G0_0_1_0_0 + 0.000473600473600568*G0_0_1_0_1 + 0.00208236208236243*G0_0_1_0_2 + 0.00151848151848176*G0_0_1_0_4 + 0.0267732267732312*G0_0_1_0_5 - 0.0114285714285734*G0_0_1_0_6 - 0.0185148185148216*G0_0_1_0_7 - 0.00237096237096276*G0_0_1_0_8 - 0.0115084915084934*G0_0_1_0_9 + 0.000473600473600568*G0_0_1_1_0 + 0.0145632145632172*G0_0_1_1_1 - 0.000544006258292055*G0_0_1_1_2 + 0.00839160839160987*G0_0_1_1_3 - 0.00122163550735003*G0_0_1_1_4 + 0.00285999714571192*G0_0_1_1_5 + 0.00419009561866775*G0_0_1_1_6 - 0.0235992578849762*G0_0_1_1_7 - 0.00375624375624431*G0_0_1_1_8 - 0.00666761809619063*G0_0_1_1_9 + 0.00208236208236243*G0_0_1_2_0 - 0.000544006258292056*G0_0_1_2_1 + 0.000779749351178074*G0_0_1_2_2 + 0.0032729175586324*G0_0_1_2_3 - 0.0020760192188767*G0_0_1_2_4 + 0.00205508776937382*G0_0_1_2_5 - 0.00152419009561894*G0_0_1_2_6 - 0.017639503353792*G0_0_1_2_7 + 0.0100585129156575*G0_0_1_2_8 + 0.00461253032681685*G0_0_1_2_9 + 0.00839160839160987*G0_0_1_3_1 + 0.0032729175586324*G0_0_1_3_2 + 0.0490823462252115*G0_0_1_3_3 - 0.011183102611676*G0_0_1_3_4 - 0.00774083059797475*G0_0_1_3_5 - 0.00578849721706965*G0_0_1_3_6 + 0.00666190951905357*G0_0_1_3_7 + 0.0167318395889854*G0_0_1_3_8 + 0.00667903525046504*G0_0_1_3_9 + 0.00151848151848176*G0_0_1_4_0 - 0.00122163550735003*G0_0_1_4_1 - 0.0020760192188767*G0_0_1_4_2 - 0.011183102611676*G0_0_1_4_3 + 0.0173312401883861*G0_0_1_4_4 + 0.00222634508348831*G0_0_1_4_5 + 0.00356215213358132*G0_0_1_4_6 + 0.0207906379334985*G0_0_1_4_7 - 0.0233937491080389*G0_0_1_4_8 - 0.0182902811474272*G0_0_1_4_9 + 0.0267732267732312*G0_0_1_5_0 + 0.00285999714571193*G0_0_1_5_1 + 0.00205508776937382*G0_0_1_5_2 - 0.00774083059797475*G0_0_1_5_3 + 0.00222634508348831*G0_0_1_5_4 + 0.107652347652366*G0_0_1_5_5 - 0.0135464535464557*G0_0_1_5_6 - 0.0579020979021074*G0_0_1_5_7 - 0.00179820179820219*G0_0_1_5_8 + 0.0381218781218848*G0_0_1_5_9 - 0.0114285714285734*G0_0_1_6_0 + 0.00419009561866775*G0_0_1_6_1 - 0.00152419009561894*G0_0_1_6_2 - 0.00578849721706964*G0_0_1_6_3 + 0.00356215213358131*G0_0_1_6_4 - 0.0135464535464557*G0_0_1_6_5 + 0.00952190666476552*G0_0_1_6_6 + 0.0597002997003096*G0_0_1_6_7 - 0.0247638076209547*G0_0_1_6_8 - 0.00226059654631126*G0_0_1_6_9 - 0.0185148185148216*G0_0_1_7_0 - 0.0235992578849762*G0_0_1_7_1 - 0.017639503353792*G0_0_1_7_2 + 0.00666190951905356*G0_0_1_7_3 + 0.0207906379334985*G0_0_1_7_4 - 0.0579020979021074*G0_0_1_7_5 + 0.0597002997003096*G0_0_1_7_6 - 0.670369630369743*G0_0_1_7_7 + 0.129470529470551*G0_0_1_7_8 - 0.0848751248751391*G0_0_1_7_9 - 0.00237096237096276*G0_0_1_8_0 - 0.00375624375624431*G0_0_1_8_1 + 0.0100585129156575*G0_0_1_8_2 + 0.0167318395889854*G0_0_1_8_3 - 0.0233937491080389*G0_0_1_8_4 - 0.00179820179820218*G0_0_1_8_5 - 0.0247638076209547*G0_0_1_8_6 + 0.129470529470551*G0_0_1_8_7 + 0.0723390894819597*G0_0_1_8_8 + 0.0667903525046497*G0_0_1_8_9 - 0.0115084915084934*G0_0_1_9_0 - 0.00666761809619063*G0_0_1_9_1 + 0.00461253032681686*G0_0_1_9_2 + 0.00667903525046504*G0_0_1_9_3 - 0.0182902811474272*G0_0_1_9_4 + 0.0381218781218848*G0_0_1_9_5 - 0.00226059654631126*G0_0_1_9_6 - 0.0848751248751391*G0_0_1_9_7 + 0.0667903525046497*G0_0_1_9_8 + 0.231813900385368*G0_0_1_9_9 - 0.0379472379472444*G0_1_0_0_0 - 0.000473600473600569*G0_1_0_0_1 - 0.00208236208236243*G0_1_0_0_2 - 0.00151848151848176*G0_1_0_0_4 - 0.0267732267732312*G0_1_0_0_5 + 0.0114285714285734*G0_1_0_0_6 + 0.0185148185148216*G0_1_0_0_7 + 0.00237096237096276*G0_1_0_0_8 + 0.0115084915084934*G0_1_0_0_9 - 0.000473600473600569*G0_1_0_1_0 - 0.0145632145632172*G0_1_0_1_1 + 0.000544006258292055*G0_1_0_1_2 - 0.00839160839160987*G0_1_0_1_3 + 0.00122163550735003*G0_1_0_1_4 - 0.00285999714571193*G0_1_0_1_5 - 0.00419009561866775*G0_1_0_1_6 + 0.0235992578849762*G0_1_0_1_7 + 0.00375624375624431*G0_1_0_1_8 + 0.00666761809619063*G0_1_0_1_9 - 0.00208236208236243*G0_1_0_2_0 + 0.000544006258292055*G0_1_0_2_1 - 0.000779749351178074*G0_1_0_2_2 - 0.0032729175586324*G0_1_0_2_3 + 0.0020760192188767*G0_1_0_2_4 - 0.00205508776937382*G0_1_0_2_5 + 0.00152419009561895*G0_1_0_2_6 + 0.017639503353792*G0_1_0_2_7 - 0.0100585129156575*G0_1_0_2_8 - 0.00461253032681686*G0_1_0_2_9 - 0.00839160839160986*G0_1_0_3_1 - 0.0032729175586324*G0_1_0_3_2 - 0.0490823462252116*G0_1_0_3_3 + 0.011183102611676*G0_1_0_3_4 + 0.00774083059797475*G0_1_0_3_5 + 0.00578849721706965*G0_1_0_3_6 - 0.00666190951905357*G0_1_0_3_7 - 0.0167318395889854*G0_1_0_3_8 - 0.00667903525046508*G0_1_0_3_9 - 0.00151848151848176*G0_1_0_4_0 + 0.00122163550735003*G0_1_0_4_1 + 0.0020760192188767*G0_1_0_4_2 + 0.011183102611676*G0_1_0_4_3 - 0.0173312401883861*G0_1_0_4_4 - 0.0022263450834883*G0_1_0_4_5 - 0.00356215213358132*G0_1_0_4_6 - 0.0207906379334985*G0_1_0_4_7 + 0.0233937491080389*G0_1_0_4_8 + 0.0182902811474272*G0_1_0_4_9 - 0.0267732267732312*G0_1_0_5_0 - 0.00285999714571193*G0_1_0_5_1 - 0.00205508776937382*G0_1_0_5_2 + 0.00774083059797476*G0_1_0_5_3 - 0.0022263450834883*G0_1_0_5_4 - 0.107652347652366*G0_1_0_5_5 + 0.0135464535464557*G0_1_0_5_6 + 0.0579020979021074*G0_1_0_5_7 + 0.00179820179820219*G0_1_0_5_8 - 0.0381218781218848*G0_1_0_5_9 + 0.0114285714285734*G0_1_0_6_0 - 0.00419009561866775*G0_1_0_6_1 + 0.00152419009561894*G0_1_0_6_2 + 0.00578849721706964*G0_1_0_6_3 - 0.00356215213358132*G0_1_0_6_4 + 0.0135464535464557*G0_1_0_6_5 - 0.00952190666476552*G0_1_0_6_6 - 0.0597002997003096*G0_1_0_6_7 + 0.0247638076209547*G0_1_0_6_8 + 0.00226059654631126*G0_1_0_6_9 + 0.0185148185148216*G0_1_0_7_0 + 0.0235992578849762*G0_1_0_7_1 + 0.017639503353792*G0_1_0_7_2 - 0.00666190951905356*G0_1_0_7_3 - 0.0207906379334985*G0_1_0_7_4 + 0.0579020979021074*G0_1_0_7_5 - 0.0597002997003096*G0_1_0_7_6 + 0.670369630369742*G0_1_0_7_7 - 0.129470529470551*G0_1_0_7_8 + 0.0848751248751391*G0_1_0_7_9 + 0.00237096237096276*G0_1_0_8_0 + 0.00375624375624431*G0_1_0_8_1 - 0.0100585129156575*G0_1_0_8_2 - 0.0167318395889854*G0_1_0_8_3 + 0.0233937491080389*G0_1_0_8_4 + 0.00179820179820219*G0_1_0_8_5 + 0.0247638076209547*G0_1_0_8_6 - 0.129470529470551*G0_1_0_8_7 - 0.0723390894819598*G0_1_0_8_8 - 0.0667903525046497*G0_1_0_8_9 + 0.0115084915084934*G0_1_0_9_0 + 0.00666761809619063*G0_1_0_9_1 - 0.00461253032681686*G0_1_0_9_2 - 0.00667903525046507*G0_1_0_9_3 + 0.0182902811474272*G0_1_0_9_4 - 0.0381218781218848*G0_1_0_9_5 + 0.00226059654631126*G0_1_0_9_6 + 0.0848751248751391*G0_1_0_9_7 - 0.0667903525046497*G0_1_0_9_8 - 0.231813900385368*G0_1_0_9_9; + A[206] = -A[198] - 0.020294907913959*G0_0_0_0_0 + 0.000836694170027659*G0_0_0_0_1 - 0.00494038589276769*G0_0_0_0_2 - 0.0275584732727637*G0_0_0_0_3 - 0.0026766883909746*G0_0_0_0_4 - 0.00939504939505106*G0_0_0_0_5 + 0.00636823493966453*G0_0_0_0_6 + 0.00600034885749273*G0_0_0_0_7 - 0.0100217243074403*G0_0_0_0_8 - 0.0111735883164474*G0_0_0_0_9 + 0.000836694170027659*G0_0_0_1_0 + 0.0479915146581896*G0_0_0_1_1 - 0.000155893489226851*G0_0_0_1_2 + 0.0244200244200285*G0_0_0_1_3 - 0.00568320568320663*G0_0_0_1_4 - 0.00919968919969074*G0_0_0_1_5 - 0.00669552669552785*G0_0_0_1_6 - 0.0103008103008121*G0_0_0_1_7 + 0.00701520701520833*G0_0_0_1_8 - 0.0277056277056324*G0_0_0_1_9 - 0.00494038589276769*G0_0_0_2_0 - 0.000155893489226852*G0_0_0_2_1 - 0.0141369741369766*G0_0_0_2_2 - 0.00955996384567969*G0_0_0_2_3 + 0.00729175586318565*G0_0_0_2_4 + 0.00424210709925066*G0_0_0_2_5 - 0.00764695621838613*G0_0_0_2_6 - 0.00168720168720198*G0_0_0_2_7 - 0.0021438878581739*G0_0_0_2_8 + 0.00411017553874769*G0_0_0_2_9 - 0.0275584732727637*G0_0_0_3_0 + 0.0244200244200285*G0_0_0_3_1 - 0.00955996384567969*G0_0_0_3_2 - 0.637762237762347*G0_0_0_3_3 + 0.060899100899111*G0_0_0_3_4 + 0.0464449835878484*G0_0_0_3_5 + 0.0374711003282494*G0_0_0_3_6 + 0.100059940059957*G0_0_0_3_7 - 0.123876123876145*G0_0_0_3_8 - 0.117002997003017*G0_0_0_3_9 - 0.0026766883909746*G0_0_0_4_0 - 0.00568320568320664*G0_0_0_4_1 + 0.00729175586318565*G0_0_0_4_2 + 0.0608991008991109*G0_0_0_4_3 - 0.117551020408183*G0_0_0_4_4 + 0.0254145854145898*G0_0_0_4_5 - 0.0628856857428392*G0_0_0_4_6 - 0.00214642500356815*G0_0_0_4_7 + 0.0238161838161877*G0_0_0_4_8 - 0.0631596974454225*G0_0_0_4_9 - 0.00939504939505106*G0_0_0_5_0 - 0.00919968919969074*G0_0_0_5_1 + 0.00424210709925066*G0_0_0_5_2 + 0.0464449835878484*G0_0_0_5_3 + 0.0254145854145898*G0_0_0_5_4 - 0.336806051091822*G0_0_0_5_5 + 0.0349593263879038*G0_0_0_5_6 - 0.0674297131440101*G0_0_0_5_7 + 0.0449835878407382*G0_0_0_5_8 - 0.0564464107321345*G0_0_0_5_9 + 0.00636823493966454*G0_0_0_6_0 - 0.00669552669552785*G0_0_0_6_1 - 0.00764695621838614*G0_0_0_6_2 + 0.0374711003282494*G0_0_0_6_3 - 0.0628856857428392*G0_0_0_6_4 + 0.0349593263879038*G0_0_0_6_5 - 0.319954331382957*G0_0_0_6_6 + 0.0224461253032719*G0_0_0_6_7 + 0.00456686170971957*G0_0_0_6_8 - 0.0872727272727419*G0_0_0_6_9 + 0.00600034885749273*G0_0_0_7_0 - 0.0103008103008121*G0_0_0_7_1 - 0.00168720168720198*G0_0_0_7_2 + 0.100059940059957*G0_0_0_7_3 - 0.00214642500356814*G0_0_0_7_4 - 0.0674297131440101*G0_0_0_7_5 + 0.0224461253032719*G0_0_0_7_6 - 0.0798287426858988*G0_0_0_7_7 + 0.0645754245754353*G0_0_0_7_8 - 0.0113714856572019*G0_0_0_7_9 - 0.0100217243074403*G0_0_0_8_0 + 0.00701520701520834*G0_0_0_8_1 - 0.0021438878581739*G0_0_0_8_2 - 0.123876123876145*G0_0_0_8_3 + 0.0238161838161877*G0_0_0_8_4 + 0.0449835878407382*G0_0_0_8_5 + 0.00456686170971957*G0_0_0_8_6 + 0.0645754245754353*G0_0_0_8_7 - 0.0351648351648409*G0_0_0_8_8 + 0.0354845154845216*G0_0_0_8_9 - 0.0111735883164474*G0_0_0_9_0 - 0.0277056277056324*G0_0_0_9_1 + 0.00411017553874769*G0_0_0_9_2 - 0.117002997003017*G0_0_0_9_3 - 0.0631596974454225*G0_0_0_9_4 - 0.0564464107321345*G0_0_0_9_5 - 0.0872727272727419*G0_0_0_9_6 - 0.0113714856572019*G0_0_0_9_7 + 0.0354845154845216*G0_0_0_9_8 - 0.435678607107252*G0_0_0_9_9 - 0.0061579337769823*G0_1_0_0_0 + 0.000992587659254482*G0_1_0_0_1 - 0.0254145854145898*G0_1_0_0_3 - 0.0009894867037726*G0_1_0_0_4 - 0.00174809317666481*G0_1_0_0_5 + 0.00212612784041386*G0_1_0_0_6 - 0.0012914070056929*G0_1_0_0_7 - 0.000461760461760561*G0_1_0_0_8 - 0.015283763855195*G0_1_0_0_9 + 0.000992587659254481*G0_1_0_1_0 - 0.000992587659254507*G0_1_0_1_2 + 0.0174048174048202*G0_1_0_1_3 + 0.00461760461760545*G0_1_0_1_4 - 0.00250416250416291*G0_1_0_1_5 + 0.00250416250416292*G0_1_0_1_6 - 0.00461760461760534*G0_1_0_1_7 - 0.0174048174048205*G0_1_0_1_8 - 0.000992587659254507*G0_1_0_2_1 + 0.00615793377698228*G0_1_0_2_2 + 0.000461760461760576*G0_1_0_2_3 + 0.00129140700569294*G0_1_0_2_4 - 0.00212612784041386*G0_1_0_2_5 + 0.00174809317666479*G0_1_0_2_6 + 0.000989486703772594*G0_1_0_2_7 + 0.0254145854145897*G0_1_0_2_8 + 0.015283763855195*G0_1_0_2_9 - 0.0254145854145898*G0_1_0_3_0 + 0.0174048174048202*G0_1_0_3_1 + 0.000461760461760576*G0_1_0_3_2 - 0.602597402597506*G0_1_0_3_3 - 0.00367632367632445*G0_1_0_3_4 + 0.0418781218781289*G0_1_0_3_5 - 0.00751248751248874*G0_1_0_3_6 + 0.0762437562437693*G0_1_0_3_7 - 0.152487512487539*G0_1_0_3_9 - 0.0009894867037726*G0_1_0_4_0 + 0.00461760461760545*G0_1_0_4_1 + 0.00129140700569293*G0_1_0_4_2 - 0.00367632367632445*G0_1_0_4_3 - 0.0377222777222842*G0_1_0_4_4 + 0.00296846011131779*G0_1_0_4_5 + 0.00454402740117096*G0_1_0_4_6 - 0.076243756243769*G0_1_0_4_8 - 0.0517882117882206*G0_1_0_4_9 - 0.00174809317666481*G0_1_0_5_0 - 0.00250416250416291*G0_1_0_5_1 - 0.00212612784041386*G0_1_0_5_2 + 0.0418781218781289*G0_1_0_5_3 + 0.00296846011131779*G0_1_0_5_4 - 0.0168517197088654*G0_1_0_5_5 - 0.00454402740117102*G0_1_0_5_7 + 0.00751248751248877*G0_1_0_5_8 + 0.0308263165406074*G0_1_0_5_9 + 0.00212612784041386*G0_1_0_6_0 + 0.00250416250416292*G0_1_0_6_1 + 0.00174809317666479*G0_1_0_6_2 - 0.00751248751248874*G0_1_0_6_3 + 0.00454402740117096*G0_1_0_6_4 + 0.0168517197088649*G0_1_0_6_6 - 0.00296846011131776*G0_1_0_6_7 - 0.0418781218781288*G0_1_0_6_8 - 0.0308263165406075*G0_1_0_6_9 - 0.0012914070056929*G0_1_0_7_0 - 0.00461760461760534*G0_1_0_7_1 + 0.000989486703772595*G0_1_0_7_2 + 0.0762437562437693*G0_1_0_7_3 - 0.00454402740117102*G0_1_0_7_5 - 0.00296846011131776*G0_1_0_7_6 + 0.0377222777222839*G0_1_0_7_7 + 0.00367632367632461*G0_1_0_7_8 + 0.0517882117882206*G0_1_0_7_9 - 0.000461760461760562*G0_1_0_8_0 - 0.0174048174048205*G0_1_0_8_1 + 0.0254145854145897*G0_1_0_8_2 - 0.076243756243769*G0_1_0_8_4 + 0.00751248751248877*G0_1_0_8_5 - 0.0418781218781288*G0_1_0_8_6 + 0.00367632367632462*G0_1_0_8_7 + 0.602597402597504*G0_1_0_8_8 + 0.152487512487538*G0_1_0_8_9 - 0.015283763855195*G0_1_0_9_0 + 0.015283763855195*G0_1_0_9_2 - 0.152487512487539*G0_1_0_9_3 - 0.0517882117882206*G0_1_0_9_4 + 0.0308263165406074*G0_1_0_9_5 - 0.0308263165406075*G0_1_0_9_6 + 0.0517882117882206*G0_1_0_9_7 + 0.152487512487538*G0_1_0_9_8; + A[178] = A[206] - 0.00667776667776769*G0_0_1_0_0 - 0.00790123456790261*G0_0_1_0_1 - 0.00172215791263439*G0_0_1_0_2 - 0.0171181199752658*G0_0_1_0_3 + 0.00535845107273769*G0_0_1_0_4 - 0.00298368298368343*G0_0_1_0_5 + 0.00257266542980869*G0_0_1_0_6 + 0.00234432234432277*G0_0_1_0_7 - 0.0129851101279695*G0_0_1_0_8 - 0.00983397554826292*G0_0_1_0_9 - 0.00790123456790261*G0_0_1_1_0 - 0.09961396628065*G0_0_1_1_1 - 0.00889382222715705*G0_0_1_1_2 - 0.0745920745920872*G0_0_1_1_3 + 0.0378288378288442*G0_0_1_1_4 + 0.00175824175824208*G0_0_1_1_5 + 0.00426240426240496*G0_0_1_1_6 + 0.0332112332112389*G0_0_1_1_7 - 0.0919968919969078*G0_0_1_1_8 - 0.0223776223776262*G0_0_1_1_9 - 0.00172215791263439*G0_0_1_2_0 - 0.00889382222715705*G0_0_1_2_1 - 0.000519832900785374*G0_0_1_2_2 - 0.0125233496662089*G0_0_1_2_3 + 0.00363572935001567*G0_0_1_2_4 + 0.000446537589394808*G0_0_1_2_5 - 0.00123558980701859*G0_0_1_2_6 + 0.00634793777651027*G0_0_1_2_7 + 0.00829646543932398*G0_0_1_2_8 + 0.00544978830693209*G0_0_1_2_9 - 0.0171181199752658*G0_0_1_3_0 - 0.0745920745920873*G0_0_1_3_1 - 0.0125233496662089*G0_0_1_3_2 - 0.23048951048955*G0_0_1_3_3 + 0.0615384615384718*G0_0_1_3_4 + 0.0163493649207962*G0_0_1_3_5 + 0.000593692022263562*G0_0_1_3_6 + 0.0647352647352757*G0_0_1_3_7 - 0.0532267732267823*G0_0_1_3_8 - 0.0623376623376729*G0_0_1_3_9 + 0.00535845107273769*G0_0_1_4_0 + 0.0378288378288442*G0_0_1_4_1 + 0.00363572935001567*G0_0_1_4_2 + 0.0615384615384718*G0_0_1_4_3 - 0.0245697159982916*G0_0_1_4_4 - 0.00269444840873454*G0_0_1_4_5 + 0.00210075638647099*G0_0_1_4_6 - 0.0242500356786112*G0_0_1_4_7 - 0.0115084915084934*G0_0_1_4_8 - 0.0109604681033272*G0_0_1_4_9 - 0.00298368298368342*G0_0_1_5_0 + 0.00175824175824208*G0_0_1_5_1 + 0.000446537589394808*G0_0_1_5_2 + 0.0163493649207962*G0_0_1_5_3 - 0.00269444840873454*G0_0_1_5_4 - 0.0191351505637253*G0_0_1_5_5 + 0.00162123590695047*G0_0_1_5_6 - 0.00244327101470003*G0_0_1_5_7 + 0.00810617953475235*G0_0_1_5_8 + 0.013289567575284*G0_0_1_5_9 + 0.00257266542980869*G0_0_1_6_0 + 0.00426240426240496*G0_0_1_6_1 - 0.00123558980701859*G0_0_1_6_2 + 0.000593692022263562*G0_0_1_6_3 + 0.00210075638647099*G0_0_1_6_4 + 0.00162123590695047*G0_0_1_6_5 - 0.0022834308548599*G0_0_1_6_6 - 0.00566290852005231*G0_0_1_6_7 - 0.0255287569573327*G0_0_1_6_8 - 0.0175367489653234*G0_0_1_6_9 + 0.00234432234432277*G0_0_1_7_0 + 0.0332112332112389*G0_0_1_7_1 + 0.00634793777651027*G0_0_1_7_2 + 0.0647352647352757*G0_0_1_7_3 - 0.0242500356786112*G0_0_1_7_4 - 0.00244327101470003*G0_0_1_7_5 - 0.00566290852005231*G0_0_1_7_6 + 0.0131525617239923*G0_0_1_7_7 + 0.0652147852147965*G0_0_1_7_8 + 0.0408277436848934*G0_0_1_7_9 - 0.0129851101279695*G0_0_1_8_0 - 0.0919968919969077*G0_0_1_8_1 + 0.00829646543932398*G0_0_1_8_2 - 0.0532267732267823*G0_0_1_8_3 - 0.0115084915084934*G0_0_1_8_4 + 0.00810617953475235*G0_0_1_8_5 - 0.0255287569573327*G0_0_1_8_6 + 0.0652147852147965*G0_0_1_8_7 + 0.372107892107955*G0_0_1_8_8 + 0.0901498501498656*G0_0_1_8_9 - 0.00983397554826292*G0_0_1_9_0 - 0.0223776223776262*G0_0_1_9_1 + 0.00544978830693209*G0_0_1_9_2 - 0.0623376623376729*G0_0_1_9_3 - 0.0109604681033272*G0_0_1_9_4 + 0.013289567575284*G0_0_1_9_5 - 0.0175367489653234*G0_0_1_9_6 + 0.0408277436848934*G0_0_1_9_7 + 0.0901498501498656*G0_0_1_9_8 + 0.00657628086199583*G0_0_1_9_9 + 0.00667776667776769*G0_1_0_0_0 + 0.00790123456790261*G0_1_0_0_1 + 0.00172215791263439*G0_1_0_0_2 + 0.0171181199752658*G0_1_0_0_3 - 0.00535845107273769*G0_1_0_0_4 + 0.00298368298368342*G0_1_0_0_5 - 0.00257266542980869*G0_1_0_0_6 - 0.00234432234432277*G0_1_0_0_7 + 0.0129851101279695*G0_1_0_0_8 + 0.00983397554826292*G0_1_0_0_9 + 0.00790123456790261*G0_1_0_1_0 + 0.09961396628065*G0_1_0_1_1 + 0.00889382222715706*G0_1_0_1_2 + 0.0745920745920873*G0_1_0_1_3 - 0.0378288378288442*G0_1_0_1_4 - 0.00175824175824208*G0_1_0_1_5 - 0.00426240426240496*G0_1_0_1_6 - 0.0332112332112389*G0_1_0_1_7 + 0.0919968919969078*G0_1_0_1_8 + 0.0223776223776262*G0_1_0_1_9 + 0.00172215791263439*G0_1_0_2_0 + 0.00889382222715706*G0_1_0_2_1 + 0.000519832900785374*G0_1_0_2_2 + 0.0125233496662089*G0_1_0_2_3 - 0.00363572935001568*G0_1_0_2_4 - 0.000446537589394808*G0_1_0_2_5 + 0.00123558980701859*G0_1_0_2_6 - 0.00634793777651027*G0_1_0_2_7 - 0.00829646543932397*G0_1_0_2_8 - 0.00544978830693209*G0_1_0_2_9 + 0.0171181199752658*G0_1_0_3_0 + 0.0745920745920873*G0_1_0_3_1 + 0.0125233496662089*G0_1_0_3_2 + 0.23048951048955*G0_1_0_3_3 - 0.0615384615384718*G0_1_0_3_4 - 0.0163493649207962*G0_1_0_3_5 - 0.000593692022263562*G0_1_0_3_6 - 0.0647352647352757*G0_1_0_3_7 + 0.0532267732267823*G0_1_0_3_8 + 0.0623376623376729*G0_1_0_3_9 - 0.00535845107273769*G0_1_0_4_0 - 0.0378288378288442*G0_1_0_4_1 - 0.00363572935001567*G0_1_0_4_2 - 0.0615384615384718*G0_1_0_4_3 + 0.0245697159982916*G0_1_0_4_4 + 0.00269444840873454*G0_1_0_4_5 - 0.00210075638647099*G0_1_0_4_6 + 0.0242500356786112*G0_1_0_4_7 + 0.0115084915084934*G0_1_0_4_8 + 0.0109604681033272*G0_1_0_4_9 + 0.00298368298368342*G0_1_0_5_0 - 0.00175824175824208*G0_1_0_5_1 - 0.000446537589394808*G0_1_0_5_2 - 0.0163493649207962*G0_1_0_5_3 + 0.00269444840873454*G0_1_0_5_4 + 0.0191351505637253*G0_1_0_5_5 - 0.00162123590695047*G0_1_0_5_6 + 0.00244327101470003*G0_1_0_5_7 - 0.00810617953475235*G0_1_0_5_8 - 0.013289567575284*G0_1_0_5_9 - 0.00257266542980869*G0_1_0_6_0 - 0.00426240426240496*G0_1_0_6_1 + 0.00123558980701859*G0_1_0_6_2 - 0.000593692022263562*G0_1_0_6_3 - 0.00210075638647099*G0_1_0_6_4 - 0.00162123590695047*G0_1_0_6_5 + 0.0022834308548599*G0_1_0_6_6 + 0.00566290852005231*G0_1_0_6_7 + 0.0255287569573327*G0_1_0_6_8 + 0.0175367489653234*G0_1_0_6_9 - 0.00234432234432277*G0_1_0_7_0 - 0.0332112332112389*G0_1_0_7_1 - 0.00634793777651027*G0_1_0_7_2 - 0.0647352647352757*G0_1_0_7_3 + 0.0242500356786112*G0_1_0_7_4 + 0.00244327101470003*G0_1_0_7_5 + 0.00566290852005231*G0_1_0_7_6 - 0.0131525617239924*G0_1_0_7_7 - 0.0652147852147964*G0_1_0_7_8 - 0.0408277436848934*G0_1_0_7_9 + 0.0129851101279695*G0_1_0_8_0 + 0.0919968919969077*G0_1_0_8_1 - 0.00829646543932397*G0_1_0_8_2 + 0.0532267732267823*G0_1_0_8_3 + 0.0115084915084934*G0_1_0_8_4 - 0.00810617953475235*G0_1_0_8_5 + 0.0255287569573327*G0_1_0_8_6 - 0.0652147852147964*G0_1_0_8_7 - 0.372107892107955*G0_1_0_8_8 - 0.0901498501498656*G0_1_0_8_9 + 0.00983397554826292*G0_1_0_9_0 + 0.0223776223776262*G0_1_0_9_1 - 0.00544978830693209*G0_1_0_9_2 + 0.0623376623376729*G0_1_0_9_3 + 0.0109604681033272*G0_1_0_9_4 - 0.013289567575284*G0_1_0_9_5 + 0.0175367489653234*G0_1_0_9_6 - 0.0408277436848934*G0_1_0_9_7 - 0.0901498501498656*G0_1_0_9_8 - 0.00657628086199581*G0_1_0_9_9; + A[0] = A[16] + 0.103934777744319*G0_0_0_0_0 + 0.00444480563528258*G0_0_0_0_2 - 0.00402652902652975*G0_0_0_0_3 + 0.000641025641025759*G0_0_0_0_4 + 0.046835175406612*G0_0_0_0_5 - 0.0217412878127201*G0_0_0_0_6 + 0.0496734746734831*G0_0_0_0_7 - 0.0271705146705193*G0_0_0_0_8 + 0.0055139305139315*G0_0_0_0_9 - 0.103934777744319*G0_0_0_1_1 - 0.00444480563528257*G0_0_0_1_2 - 0.046835175406612*G0_0_0_1_3 + 0.0217412878127201*G0_0_0_1_4 + 0.00402652902652974*G0_0_0_1_5 - 0.000641025641025763*G0_0_0_1_6 + 0.0271705146705193*G0_0_0_1_7 - 0.0496734746734832*G0_0_0_1_8 - 0.00551393051393147*G0_0_0_1_9 + 0.00444480563528258*G0_0_0_2_0 - 0.00444480563528257*G0_0_0_2_1 - 0.0054292268577992*G0_0_0_2_3 + 0.00283829926687117*G0_0_0_2_4 + 0.00542922685779921*G0_0_0_2_5 - 0.00283829926687118*G0_0_0_2_6 + 0.00466755466755545*G0_0_0_2_7 - 0.00466755466755545*G0_0_0_2_8 - 0.00402652902652975*G0_0_0_3_0 - 0.046835175406612*G0_0_0_3_1 - 0.0054292268577992*G0_0_0_3_2 - 0.047303886589609*G0_0_0_3_3 + 0.0221373864231045*G0_0_0_3_4 + 0.00192307692307725*G0_0_0_3_6 + 0.0120795870795891*G0_0_0_3_7 - 0.0260822510822555*G0_0_0_3_8 - 0.00761738261738394*G0_0_0_3_9 + 0.000641025641025759*G0_0_0_4_0 + 0.0217412878127201*G0_0_0_4_1 + 0.00283829926687117*G0_0_0_4_2 + 0.0221373864231045*G0_0_0_4_3 - 0.00337281765853252*G0_0_0_4_4 - 0.00192307692307726*G0_0_0_4_5 - 0.00796287046287181*G0_0_0_4_7 + 0.0140026640026664*G0_0_0_4_8 + 0.00384615384615451*G0_0_0_4_9 + 0.046835175406612*G0_0_0_5_0 + 0.00402652902652974*G0_0_0_5_1 + 0.00542922685779921*G0_0_0_5_2 - 0.00192307692307726*G0_0_0_5_4 + 0.047303886589609*G0_0_0_5_5 - 0.0221373864231045*G0_0_0_5_6 + 0.0260822510822554*G0_0_0_5_7 - 0.0120795870795891*G0_0_0_5_8 + 0.00761738261738394*G0_0_0_5_9 - 0.0217412878127201*G0_0_0_6_0 - 0.000641025641025763*G0_0_0_6_1 - 0.00283829926687118*G0_0_0_6_2 + 0.00192307692307725*G0_0_0_6_3 - 0.0221373864231045*G0_0_0_6_5 + 0.00337281765853253*G0_0_0_6_6 - 0.0140026640026664*G0_0_0_6_7 + 0.00796287046287179*G0_0_0_6_8 - 0.0038461538461545*G0_0_0_6_9 + 0.0496734746734831*G0_0_0_7_0 + 0.0271705146705193*G0_0_0_7_1 + 0.00466755466755545*G0_0_0_7_2 + 0.0120795870795891*G0_0_0_7_3 - 0.00796287046287181*G0_0_0_7_4 + 0.0260822510822554*G0_0_0_7_5 - 0.0140026640026664*G0_0_0_7_6 + 0.0439310689310763*G0_0_0_7_7 + 0.0114635364635384*G0_0_0_7_9 - 0.0271705146705193*G0_0_0_8_0 - 0.0496734746734832*G0_0_0_8_1 - 0.00466755466755545*G0_0_0_8_2 - 0.0260822510822555*G0_0_0_8_3 + 0.0140026640026664*G0_0_0_8_4 - 0.0120795870795891*G0_0_0_8_5 + 0.00796287046287179*G0_0_0_8_6 - 0.0439310689310764*G0_0_0_8_8 - 0.0114635364635384*G0_0_0_8_9 + 0.0055139305139315*G0_0_0_9_0 - 0.00551393051393147*G0_0_0_9_1 - 0.00761738261738394*G0_0_0_9_3 + 0.00384615384615451*G0_0_0_9_4 + 0.00761738261738394*G0_0_0_9_5 - 0.0038461538461545*G0_0_0_9_6 + 0.0114635364635384*G0_0_0_9_7 - 0.0114635364635384*G0_0_0_9_8 + 0.106054978971664*G0_0_1_0_0 + 0.00505480245063665*G0_0_1_0_1 + 0.00505480245063664*G0_0_1_0_2 - 0.000749886687386847*G0_0_1_0_3 - 0.000749886687386808*G0_0_1_0_4 + 0.0477428821178903*G0_0_1_0_5 - 0.022224997225001*G0_0_1_0_6 + 0.0477428821178902*G0_0_1_0_7 - 0.022224997225001*G0_0_1_0_8 + 0.00658577533577651*G0_0_1_0_9 + 0.00505480245063665*G0_0_1_1_0 + 0.00212020122734442*G0_0_1_1_1 + 0.00060999681535406*G0_0_1_1_2 + 0.000907706711278278*G0_0_1_1_3 - 0.000483709412280914*G0_0_1_1_4 + 0.00327664233914289*G0_0_1_1_5 - 0.00139091232841256*G0_0_1_1_6 + 0.00494551744551829*G0_0_1_1_7 - 0.0019305925555929*G0_0_1_1_8 + 0.00107184482184501*G0_0_1_1_9 + 0.00505480245063664*G0_0_1_2_0 + 0.00060999681535406*G0_0_1_2_1 + 0.00212020122734445*G0_0_1_2_2 - 0.000483709412280927*G0_0_1_2_3 + 0.000907706711278299*G0_0_1_2_4 + 0.00494551744551829*G0_0_1_2_5 - 0.00193059255559288*G0_0_1_2_6 + 0.00327664233914289*G0_0_1_2_7 - 0.00139091232841256*G0_0_1_2_8 + 0.00107184482184501*G0_0_1_2_9 - 0.000749886687386847*G0_0_1_3_0 + 0.000907706711278279*G0_0_1_3_1 - 0.000483709412280927*G0_0_1_3_2 + 0.00947475143903871*G0_0_1_3_3 - 0.00193593608772212*G0_0_1_3_4 - 0.00160776723276751*G0_0_1_3_5 - 0.000191995504495533*G0_0_1_3_6 - 0.0021150724275728*G0_0_1_3_7 + 0.00230706793206832*G0_0_1_3_8 + 0.00101461038961055*G0_0_1_3_9 - 0.000749886687386808*G0_0_1_4_0 - 0.000483709412280914*G0_0_1_4_1 + 0.000907706711278299*G0_0_1_4_2 - 0.00193593608772212*G0_0_1_4_3 + 0.00947475143903874*G0_0_1_4_4 - 0.00211507242757279*G0_0_1_4_5 + 0.00230706793206833*G0_0_1_4_6 - 0.0016077672327675*G0_0_1_4_7 - 0.000191995504495531*G0_0_1_4_8 + 0.00101461038961056*G0_0_1_4_9 + 0.0477428821178903*G0_0_1_5_0 + 0.00327664233914289*G0_0_1_5_1 + 0.00494551744551829*G0_0_1_5_2 - 0.00160776723276751*G0_0_1_5_3 - 0.00211507242757279*G0_0_1_5_4 + 0.0567786380286477*G0_0_1_5_5 - 0.0240733225108266*G0_0_1_5_6 + 0.0283893190143238*G0_0_1_5_7 - 0.0141946595071619*G0_0_1_5_8 + 0.0086319930069945*G0_0_1_5_9 - 0.022224997225001*G0_0_1_6_0 - 0.00139091232841256*G0_0_1_6_1 - 0.00193059255559288*G0_0_1_6_2 - 0.000191995504495534*G0_0_1_6_3 + 0.00230706793206833*G0_0_1_6_4 - 0.0240733225108266*G0_0_1_6_5 + 0.0128475690975713*G0_0_1_6_6 - 0.0141946595071619*G0_0_1_6_7 + 0.0063551032301043*G0_0_1_6_8 - 0.00283154345654395*G0_0_1_6_9 + 0.0477428821178902*G0_0_1_7_0 + 0.00494551744551829*G0_0_1_7_1 + 0.00327664233914289*G0_0_1_7_2 - 0.0021150724275728*G0_0_1_7_3 - 0.0016077672327675*G0_0_1_7_4 + 0.0283893190143238*G0_0_1_7_5 - 0.0141946595071619*G0_0_1_7_6 + 0.0567786380286476*G0_0_1_7_7 - 0.0240733225108266*G0_0_1_7_8 + 0.0086319930069945*G0_0_1_7_9 - 0.022224997225001*G0_0_1_8_0 - 0.0019305925555929*G0_0_1_8_1 - 0.00139091232841256*G0_0_1_8_2 + 0.00230706793206832*G0_0_1_8_3 - 0.000191995504495531*G0_0_1_8_4 - 0.0141946595071619*G0_0_1_8_5 + 0.0063551032301043*G0_0_1_8_6 - 0.0240733225108266*G0_0_1_8_7 + 0.0128475690975713*G0_0_1_8_8 - 0.00283154345654396*G0_0_1_8_9 + 0.00658577533577651*G0_0_1_9_0 + 0.00107184482184501*G0_0_1_9_1 + 0.00107184482184501*G0_0_1_9_2 + 0.00101461038961055*G0_0_1_9_3 + 0.00101461038961056*G0_0_1_9_4 + 0.0086319930069945*G0_0_1_9_5 - 0.00283154345654395*G0_0_1_9_6 + 0.0086319930069945*G0_0_1_9_7 - 0.00283154345654396*G0_0_1_9_8 + 0.0118756243756264*G0_0_1_9_9 + 0.106054978971664*G0_1_0_0_0 + 0.00505480245063665*G0_1_0_0_1 + 0.00505480245063664*G0_1_0_0_2 - 0.000749886687386847*G0_1_0_0_3 - 0.000749886687386808*G0_1_0_0_4 + 0.0477428821178903*G0_1_0_0_5 - 0.022224997225001*G0_1_0_0_6 + 0.0477428821178902*G0_1_0_0_7 - 0.022224997225001*G0_1_0_0_8 + 0.00658577533577651*G0_1_0_0_9 + 0.00505480245063665*G0_1_0_1_0 + 0.00212020122734442*G0_1_0_1_1 + 0.00060999681535406*G0_1_0_1_2 + 0.000907706711278278*G0_1_0_1_3 - 0.000483709412280914*G0_1_0_1_4 + 0.00327664233914289*G0_1_0_1_5 - 0.00139091232841256*G0_1_0_1_6 + 0.00494551744551829*G0_1_0_1_7 - 0.0019305925555929*G0_1_0_1_8 + 0.00107184482184501*G0_1_0_1_9 + 0.00505480245063664*G0_1_0_2_0 + 0.00060999681535406*G0_1_0_2_1 + 0.00212020122734445*G0_1_0_2_2 - 0.000483709412280927*G0_1_0_2_3 + 0.000907706711278299*G0_1_0_2_4 + 0.00494551744551829*G0_1_0_2_5 - 0.00193059255559288*G0_1_0_2_6 + 0.00327664233914289*G0_1_0_2_7 - 0.00139091232841256*G0_1_0_2_8 + 0.00107184482184501*G0_1_0_2_9 - 0.000749886687386847*G0_1_0_3_0 + 0.000907706711278278*G0_1_0_3_1 - 0.000483709412280927*G0_1_0_3_2 + 0.00947475143903871*G0_1_0_3_3 - 0.00193593608772212*G0_1_0_3_4 - 0.00160776723276751*G0_1_0_3_5 - 0.000191995504495533*G0_1_0_3_6 - 0.0021150724275728*G0_1_0_3_7 + 0.00230706793206832*G0_1_0_3_8 + 0.00101461038961055*G0_1_0_3_9 - 0.000749886687386808*G0_1_0_4_0 - 0.000483709412280914*G0_1_0_4_1 + 0.000907706711278299*G0_1_0_4_2 - 0.00193593608772212*G0_1_0_4_3 + 0.00947475143903874*G0_1_0_4_4 - 0.00211507242757279*G0_1_0_4_5 + 0.00230706793206833*G0_1_0_4_6 - 0.0016077672327675*G0_1_0_4_7 - 0.000191995504495531*G0_1_0_4_8 + 0.00101461038961056*G0_1_0_4_9 + 0.0477428821178903*G0_1_0_5_0 + 0.00327664233914289*G0_1_0_5_1 + 0.00494551744551829*G0_1_0_5_2 - 0.00160776723276751*G0_1_0_5_3 - 0.00211507242757279*G0_1_0_5_4 + 0.0567786380286477*G0_1_0_5_5 - 0.0240733225108266*G0_1_0_5_6 + 0.0283893190143238*G0_1_0_5_7 - 0.0141946595071619*G0_1_0_5_8 + 0.0086319930069945*G0_1_0_5_9 - 0.022224997225001*G0_1_0_6_0 - 0.00139091232841256*G0_1_0_6_1 - 0.00193059255559288*G0_1_0_6_2 - 0.000191995504495533*G0_1_0_6_3 + 0.00230706793206833*G0_1_0_6_4 - 0.0240733225108266*G0_1_0_6_5 + 0.0128475690975713*G0_1_0_6_6 - 0.0141946595071619*G0_1_0_6_7 + 0.0063551032301043*G0_1_0_6_8 - 0.00283154345654395*G0_1_0_6_9 + 0.0477428821178902*G0_1_0_7_0 + 0.00494551744551829*G0_1_0_7_1 + 0.00327664233914289*G0_1_0_7_2 - 0.0021150724275728*G0_1_0_7_3 - 0.0016077672327675*G0_1_0_7_4 + 0.0283893190143238*G0_1_0_7_5 - 0.0141946595071619*G0_1_0_7_6 + 0.0567786380286476*G0_1_0_7_7 - 0.0240733225108266*G0_1_0_7_8 + 0.0086319930069945*G0_1_0_7_9 - 0.022224997225001*G0_1_0_8_0 - 0.0019305925555929*G0_1_0_8_1 - 0.00139091232841256*G0_1_0_8_2 + 0.00230706793206832*G0_1_0_8_3 - 0.000191995504495531*G0_1_0_8_4 - 0.0141946595071619*G0_1_0_8_5 + 0.0063551032301043*G0_1_0_8_6 - 0.0240733225108266*G0_1_0_8_7 + 0.0128475690975713*G0_1_0_8_8 - 0.00283154345654396*G0_1_0_8_9 + 0.00658577533577651*G0_1_0_9_0 + 0.00107184482184501*G0_1_0_9_1 + 0.00107184482184501*G0_1_0_9_2 + 0.00101461038961055*G0_1_0_9_3 + 0.00101461038961056*G0_1_0_9_4 + 0.0086319930069945*G0_1_0_9_5 - 0.00283154345654395*G0_1_0_9_6 + 0.0086319930069945*G0_1_0_9_7 - 0.00283154345654396*G0_1_0_9_8 + 0.0118756243756264*G0_1_0_9_9 + 0.106054978971664*G0_1_1_0_0 + 0.00505480245063665*G0_1_1_0_1 + 0.00505480245063664*G0_1_1_0_2 - 0.000749886687386846*G0_1_1_0_3 - 0.000749886687386809*G0_1_1_0_4 + 0.0477428821178903*G0_1_1_0_5 - 0.022224997225001*G0_1_1_0_6 + 0.0477428821178902*G0_1_1_0_7 - 0.022224997225001*G0_1_1_0_8 + 0.00658577533577651*G0_1_1_0_9 + 0.00505480245063665*G0_1_1_1_0 + 0.00212020122734444*G0_1_1_1_1 + 0.000609996815354061*G0_1_1_1_2 + 0.000907706711278289*G0_1_1_1_3 - 0.000483709412280918*G0_1_1_1_4 + 0.00327664233914289*G0_1_1_1_5 - 0.00139091232841256*G0_1_1_1_6 + 0.00494551744551829*G0_1_1_1_7 - 0.00193059255559289*G0_1_1_1_8 + 0.00107184482184501*G0_1_1_1_9 + 0.00505480245063664*G0_1_1_2_0 + 0.000609996815354061*G0_1_1_2_1 + 0.00212020122734446*G0_1_1_2_2 - 0.000483709412280927*G0_1_1_2_3 + 0.000907706711278302*G0_1_1_2_4 + 0.00494551744551828*G0_1_1_2_5 - 0.00193059255559288*G0_1_1_2_6 + 0.00327664233914289*G0_1_1_2_7 - 0.00139091232841256*G0_1_1_2_8 + 0.001071844821845*G0_1_1_2_9 - 0.000749886687386846*G0_1_1_3_0 + 0.000907706711278289*G0_1_1_3_1 - 0.000483709412280927*G0_1_1_3_2 + 0.00947475143903872*G0_1_1_3_3 - 0.00193593608772213*G0_1_1_3_4 - 0.00160776723276751*G0_1_1_3_5 - 0.000191995504495535*G0_1_1_3_6 - 0.0021150724275728*G0_1_1_3_7 + 0.00230706793206832*G0_1_1_3_8 + 0.00101461038961056*G0_1_1_3_9 - 0.000749886687386809*G0_1_1_4_0 - 0.000483709412280918*G0_1_1_4_1 + 0.000907706711278302*G0_1_1_4_2 - 0.00193593608772213*G0_1_1_4_3 + 0.00947475143903875*G0_1_1_4_4 - 0.00211507242757279*G0_1_1_4_5 + 0.00230706793206833*G0_1_1_4_6 - 0.0016077672327675*G0_1_1_4_7 - 0.000191995504495535*G0_1_1_4_8 + 0.00101461038961056*G0_1_1_4_9 + 0.0477428821178903*G0_1_1_5_0 + 0.00327664233914289*G0_1_1_5_1 + 0.00494551744551828*G0_1_1_5_2 - 0.00160776723276751*G0_1_1_5_3 - 0.00211507242757279*G0_1_1_5_4 + 0.0567786380286477*G0_1_1_5_5 - 0.0240733225108266*G0_1_1_5_6 + 0.0283893190143238*G0_1_1_5_7 - 0.0141946595071619*G0_1_1_5_8 + 0.0086319930069945*G0_1_1_5_9 - 0.022224997225001*G0_1_1_6_0 - 0.00139091232841256*G0_1_1_6_1 - 0.00193059255559288*G0_1_1_6_2 - 0.000191995504495535*G0_1_1_6_3 + 0.00230706793206833*G0_1_1_6_4 - 0.0240733225108266*G0_1_1_6_5 + 0.0128475690975713*G0_1_1_6_6 - 0.0141946595071619*G0_1_1_6_7 + 0.0063551032301043*G0_1_1_6_8 - 0.00283154345654394*G0_1_1_6_9 + 0.0477428821178902*G0_1_1_7_0 + 0.00494551744551829*G0_1_1_7_1 + 0.00327664233914289*G0_1_1_7_2 - 0.0021150724275728*G0_1_1_7_3 - 0.0016077672327675*G0_1_1_7_4 + 0.0283893190143238*G0_1_1_7_5 - 0.0141946595071619*G0_1_1_7_6 + 0.0567786380286476*G0_1_1_7_7 - 0.0240733225108266*G0_1_1_7_8 + 0.0086319930069945*G0_1_1_7_9 - 0.022224997225001*G0_1_1_8_0 - 0.00193059255559289*G0_1_1_8_1 - 0.00139091232841256*G0_1_1_8_2 + 0.00230706793206833*G0_1_1_8_3 - 0.000191995504495535*G0_1_1_8_4 - 0.0141946595071619*G0_1_1_8_5 + 0.0063551032301043*G0_1_1_8_6 - 0.0240733225108266*G0_1_1_8_7 + 0.0128475690975713*G0_1_1_8_8 - 0.00283154345654395*G0_1_1_8_9 + 0.00658577533577651*G0_1_1_9_0 + 0.00107184482184501*G0_1_1_9_1 + 0.001071844821845*G0_1_1_9_2 + 0.00101461038961056*G0_1_1_9_3 + 0.00101461038961056*G0_1_1_9_4 + 0.0086319930069945*G0_1_1_9_5 - 0.00283154345654394*G0_1_1_9_6 + 0.0086319930069945*G0_1_1_9_7 - 0.00283154345654395*G0_1_1_9_8 + 0.0118756243756264*G0_1_1_9_9; + A[58] = -A[178] - 0.020294907913959*G0_0_0_0_0 + 0.000836694170027659*G0_0_0_0_1 - 0.00494038589276769*G0_0_0_0_2 - 0.0275584732727637*G0_0_0_0_3 - 0.0026766883909746*G0_0_0_0_4 - 0.00939504939505106*G0_0_0_0_5 + 0.00636823493966454*G0_0_0_0_6 + 0.00600034885749273*G0_0_0_0_7 - 0.0100217243074403*G0_0_0_0_8 - 0.0111735883164474*G0_0_0_0_9 + 0.000836694170027659*G0_0_0_1_0 + 0.0479915146581897*G0_0_0_1_1 - 0.000155893489226851*G0_0_0_1_2 + 0.0244200244200285*G0_0_0_1_3 - 0.00568320568320665*G0_0_0_1_4 - 0.00919968919969074*G0_0_0_1_5 - 0.00669552669552785*G0_0_0_1_6 - 0.0103008103008121*G0_0_0_1_7 + 0.00701520701520834*G0_0_0_1_8 - 0.0277056277056324*G0_0_0_1_9 - 0.00494038589276769*G0_0_0_2_0 - 0.000155893489226851*G0_0_0_2_1 - 0.0141369741369766*G0_0_0_2_2 - 0.00955996384567969*G0_0_0_2_3 + 0.00729175586318565*G0_0_0_2_4 + 0.00424210709925066*G0_0_0_2_5 - 0.00764695621838613*G0_0_0_2_6 - 0.00168720168720198*G0_0_0_2_7 - 0.0021438878581739*G0_0_0_2_8 + 0.00411017553874769*G0_0_0_2_9 - 0.0275584732727637*G0_0_0_3_0 + 0.0244200244200285*G0_0_0_3_1 - 0.00955996384567969*G0_0_0_3_2 - 0.637762237762347*G0_0_0_3_3 + 0.0608991008991109*G0_0_0_3_4 + 0.0464449835878484*G0_0_0_3_5 + 0.0374711003282494*G0_0_0_3_6 + 0.100059940059957*G0_0_0_3_7 - 0.123876123876145*G0_0_0_3_8 - 0.117002997003017*G0_0_0_3_9 - 0.0026766883909746*G0_0_0_4_0 - 0.00568320568320664*G0_0_0_4_1 + 0.00729175586318565*G0_0_0_4_2 + 0.060899100899111*G0_0_0_4_3 - 0.117551020408183*G0_0_0_4_4 + 0.0254145854145898*G0_0_0_4_5 - 0.0628856857428392*G0_0_0_4_6 - 0.00214642500356815*G0_0_0_4_7 + 0.0238161838161877*G0_0_0_4_8 - 0.0631596974454225*G0_0_0_4_9 - 0.00939504939505106*G0_0_0_5_0 - 0.00919968919969074*G0_0_0_5_1 + 0.00424210709925066*G0_0_0_5_2 + 0.0464449835878484*G0_0_0_5_3 + 0.0254145854145898*G0_0_0_5_4 - 0.336806051091822*G0_0_0_5_5 + 0.0349593263879038*G0_0_0_5_6 - 0.0674297131440101*G0_0_0_5_7 + 0.0449835878407382*G0_0_0_5_8 - 0.0564464107321345*G0_0_0_5_9 + 0.00636823493966454*G0_0_0_6_0 - 0.00669552669552785*G0_0_0_6_1 - 0.00764695621838614*G0_0_0_6_2 + 0.0374711003282494*G0_0_0_6_3 - 0.0628856857428392*G0_0_0_6_4 + 0.0349593263879038*G0_0_0_6_5 - 0.319954331382957*G0_0_0_6_6 + 0.0224461253032719*G0_0_0_6_7 + 0.00456686170971957*G0_0_0_6_8 - 0.0872727272727419*G0_0_0_6_9 + 0.00600034885749273*G0_0_0_7_0 - 0.0103008103008121*G0_0_0_7_1 - 0.00168720168720198*G0_0_0_7_2 + 0.100059940059957*G0_0_0_7_3 - 0.00214642500356815*G0_0_0_7_4 - 0.0674297131440101*G0_0_0_7_5 + 0.0224461253032719*G0_0_0_7_6 - 0.0798287426858988*G0_0_0_7_7 + 0.0645754245754353*G0_0_0_7_8 - 0.0113714856572018*G0_0_0_7_9 - 0.0100217243074403*G0_0_0_8_0 + 0.00701520701520834*G0_0_0_8_1 - 0.0021438878581739*G0_0_0_8_2 - 0.123876123876145*G0_0_0_8_3 + 0.0238161838161877*G0_0_0_8_4 + 0.0449835878407382*G0_0_0_8_5 + 0.00456686170971957*G0_0_0_8_6 + 0.0645754245754353*G0_0_0_8_7 - 0.0351648351648409*G0_0_0_8_8 + 0.0354845154845216*G0_0_0_8_9 - 0.0111735883164474*G0_0_0_9_0 - 0.0277056277056324*G0_0_0_9_1 + 0.00411017553874769*G0_0_0_9_2 - 0.117002997003017*G0_0_0_9_3 - 0.0631596974454225*G0_0_0_9_4 - 0.0564464107321345*G0_0_0_9_5 - 0.0872727272727419*G0_0_0_9_6 - 0.0113714856572019*G0_0_0_9_7 + 0.0354845154845216*G0_0_0_9_8 - 0.435678607107252*G0_0_0_9_9 - 0.0061579337769823*G0_0_1_0_0 + 0.000992587659254482*G0_0_1_0_1 - 0.0254145854145898*G0_0_1_0_3 - 0.0009894867037726*G0_0_1_0_4 - 0.00174809317666481*G0_0_1_0_5 + 0.00212612784041386*G0_0_1_0_6 - 0.0012914070056929*G0_0_1_0_7 - 0.000461760461760562*G0_0_1_0_8 - 0.015283763855195*G0_0_1_0_9 + 0.000992587659254482*G0_0_1_1_0 - 0.000992587659254507*G0_0_1_1_2 + 0.0174048174048202*G0_0_1_1_3 + 0.00461760461760545*G0_0_1_1_4 - 0.00250416250416291*G0_0_1_1_5 + 0.00250416250416292*G0_0_1_1_6 - 0.00461760461760535*G0_0_1_1_7 - 0.0174048174048205*G0_0_1_1_8 - 0.000992587659254506*G0_0_1_2_1 + 0.00615793377698228*G0_0_1_2_2 + 0.000461760461760573*G0_0_1_2_3 + 0.00129140700569293*G0_0_1_2_4 - 0.00212612784041386*G0_0_1_2_5 + 0.00174809317666479*G0_0_1_2_6 + 0.000989486703772594*G0_0_1_2_7 + 0.0254145854145897*G0_0_1_2_8 + 0.015283763855195*G0_0_1_2_9 - 0.0254145854145898*G0_0_1_3_0 + 0.0174048174048202*G0_0_1_3_1 + 0.000461760461760573*G0_0_1_3_2 - 0.602597402597506*G0_0_1_3_3 - 0.00367632367632445*G0_0_1_3_4 + 0.0418781218781289*G0_0_1_3_5 - 0.00751248751248874*G0_0_1_3_6 + 0.0762437562437693*G0_0_1_3_7 - 0.152487512487539*G0_0_1_3_9 - 0.000989486703772601*G0_0_1_4_0 + 0.00461760461760545*G0_0_1_4_1 + 0.00129140700569293*G0_0_1_4_2 - 0.00367632367632445*G0_0_1_4_3 - 0.0377222777222842*G0_0_1_4_4 + 0.00296846011131779*G0_0_1_4_5 + 0.00454402740117096*G0_0_1_4_6 - 0.076243756243769*G0_0_1_4_8 - 0.0517882117882206*G0_0_1_4_9 - 0.00174809317666481*G0_0_1_5_0 - 0.00250416250416291*G0_0_1_5_1 - 0.00212612784041386*G0_0_1_5_2 + 0.0418781218781289*G0_0_1_5_3 + 0.00296846011131778*G0_0_1_5_4 - 0.0168517197088654*G0_0_1_5_5 - 0.00454402740117102*G0_0_1_5_7 + 0.00751248751248877*G0_0_1_5_8 + 0.0308263165406074*G0_0_1_5_9 + 0.00212612784041386*G0_0_1_6_0 + 0.00250416250416292*G0_0_1_6_1 + 0.00174809317666479*G0_0_1_6_2 - 0.00751248751248874*G0_0_1_6_3 + 0.00454402740117096*G0_0_1_6_4 + 0.0168517197088649*G0_0_1_6_6 - 0.00296846011131776*G0_0_1_6_7 - 0.0418781218781289*G0_0_1_6_8 - 0.0308263165406075*G0_0_1_6_9 - 0.0012914070056929*G0_0_1_7_0 - 0.00461760461760534*G0_0_1_7_1 + 0.000989486703772594*G0_0_1_7_2 + 0.0762437562437693*G0_0_1_7_3 - 0.00454402740117102*G0_0_1_7_5 - 0.00296846011131776*G0_0_1_7_6 + 0.0377222777222839*G0_0_1_7_7 + 0.00367632367632462*G0_0_1_7_8 + 0.0517882117882206*G0_0_1_7_9 - 0.000461760461760561*G0_0_1_8_0 - 0.0174048174048205*G0_0_1_8_1 + 0.0254145854145897*G0_0_1_8_2 - 0.076243756243769*G0_0_1_8_4 + 0.00751248751248877*G0_0_1_8_5 - 0.0418781218781289*G0_0_1_8_6 + 0.00367632367632462*G0_0_1_8_7 + 0.602597402597504*G0_0_1_8_8 + 0.152487512487538*G0_0_1_8_9 - 0.015283763855195*G0_0_1_9_0 + 0.015283763855195*G0_0_1_9_2 - 0.152487512487539*G0_0_1_9_3 - 0.0517882117882206*G0_0_1_9_4 + 0.0308263165406074*G0_0_1_9_5 - 0.0308263165406075*G0_0_1_9_6 + 0.0517882117882206*G0_0_1_9_7 + 0.152487512487538*G0_0_1_9_8; + A[28] = 0.0028981248028872*G0_0_0_0_0 - 0.00342817676151069*G0_0_0_0_1 + 0.000136565374660636*G0_0_0_0_2 - 0.00563785420928376*G0_0_0_0_3 + 0.00392258535115745*G0_0_0_0_4 + 0.00249861249861294*G0_0_0_0_5 - 0.000886098028955314*G0_0_0_0_6 + 0.00219288647860114*G0_0_0_0_7 - 0.00414125556982772*G0_0_0_0_8 - 0.0017753674896535*G0_0_0_0_9 - 0.00342817676151069*G0_0_0_1_0 - 0.0566199232865996*G0_0_0_1_1 - 0.00574450241117004*G0_0_0_1_2 - 0.0671273171273285*G0_0_0_1_3 + 0.0276212676212723*G0_0_0_1_4 + 0.00305250305250357*G0_0_0_1_5 + 0.00254967254967298*G0_0_0_1_6 + 0.0157220557220584*G0_0_0_1_7 - 0.0289432789432839*G0_0_0_1_8 - 0.00438228438228517*G0_0_0_1_9 + 0.000136565374660636*G0_0_0_2_0 - 0.00574450241117005*G0_0_0_2_1 + 0.00138528138528164*G0_0_0_2_2 - 0.0130345844631581*G0_0_0_2_3 + 0.00462394748109111*G0_0_0_2_4 - 0.000341246055531829*G0_0_0_2_5 + 0.00191173905459653*G0_0_0_2_6 + 0.00340215340215398*G0_0_0_2_7 - 0.00518830375973321*G0_0_0_2_8 - 0.00385138670853022*G0_0_0_2_9 - 0.00563785420928376*G0_0_0_3_0 - 0.0671273171273285*G0_0_0_3_1 - 0.0130345844631581*G0_0_0_3_2 - 0.138581418581442*G0_0_0_3_3 + 0.0575724275724374*G0_0_0_3_4 + 0.00137576709005304*G0_0_0_3_5 - 0.00264449835878449*G0_0_0_3_6 + 0.0219180819180857*G0_0_0_3_7 - 0.0424875124875197*G0_0_0_3_8 - 0.030689310689316*G0_0_0_3_9 + 0.00392258535115745*G0_0_0_4_0 + 0.0276212676212723*G0_0_0_4_1 + 0.00462394748109111*G0_0_0_4_2 + 0.0575724275724373*G0_0_0_4_3 - 0.00675610104181647*G0_0_0_4_4 - 0.0067632367632379*G0_0_0_4_5 + 0.00940773512202241*G0_0_0_4_6 - 0.0134893677750843*G0_0_0_4_7 + 0.0205694305694341*G0_0_0_4_8 + 0.0250806336520665*G0_0_0_4_9 + 0.00249861249861293*G0_0_0_5_0 + 0.00305250305250357*G0_0_0_5_1 - 0.000341246055531829*G0_0_0_5_2 + 0.00137576709005305*G0_0_0_5_3 - 0.0067632367632379*G0_0_0_5_4 + 0.0608648494362882*G0_0_0_5_5 - 0.00633223918938312*G0_0_0_5_6 + 0.00935493078350377*G0_0_0_5_7 - 0.00415298986727627*G0_0_0_5_8 + 0.0136320822035131*G0_0_0_5_9 - 0.000886098028955314*G0_0_0_6_0 + 0.00254967254967298*G0_0_0_6_1 + 0.00191173905459653*G0_0_0_6_2 - 0.00264449835878449*G0_0_0_6_3 + 0.00940773512202241*G0_0_0_6_4 - 0.00633223918938312*G0_0_0_6_5 + 0.0585100613672141*G0_0_0_6_6 - 0.00520194091622749*G0_0_0_6_7 + 0.00145568716997314*G0_0_0_6_8 + 0.0168431568431597*G0_0_0_6_9 + 0.00219288647860114*G0_0_0_7_0 + 0.0157220557220584*G0_0_0_7_1 + 0.00340215340215398*G0_0_0_7_2 + 0.0219180819180857*G0_0_0_7_3 - 0.0134893677750843*G0_0_0_7_4 + 0.00935493078350377*G0_0_0_7_5 - 0.00520194091622749*G0_0_0_7_6 + 0.000796346510632302*G0_0_0_7_7 + 0.0130669330669353*G0_0_0_7_8 + 0.0157299843014155*G0_0_0_7_9 - 0.00414125556982772*G0_0_0_8_0 - 0.0289432789432839*G0_0_0_8_1 - 0.00518830375973321*G0_0_0_8_2 - 0.0424875124875197*G0_0_0_8_3 + 0.0205694305694341*G0_0_0_8_4 - 0.00415298986727627*G0_0_0_8_5 + 0.00145568716997314*G0_0_0_8_6 + 0.0130669330669353*G0_0_0_8_7 - 0.0387812187812254*G0_0_0_8_8 - 0.0279920079920127*G0_0_0_8_9 - 0.0017753674896535*G0_0_0_9_0 - 0.00438228438228516*G0_0_0_9_1 - 0.00385138670853022*G0_0_0_9_2 - 0.0306893106893159*G0_0_0_9_3 + 0.0250806336520665*G0_0_0_9_4 + 0.0136320822035131*G0_0_0_9_5 + 0.0168431568431597*G0_0_0_9_6 + 0.0157299843014155*G0_0_0_9_7 - 0.0279920079920127*G0_0_0_9_8 + 0.0528157556729073*G0_0_0_9_9 + 0.00151284341760556*G0_0_1_0_0 + 0.00231632564965937*G0_0_1_0_1 - 0.000449550449550542*G0_0_1_0_3 + 0.000520431949003475*G0_0_1_0_4 + 0.000586873444016381*G0_0_1_0_5 - 0.000544851973423483*G0_0_1_0_6 - 0.00243106100248999*G0_0_1_0_7 + 0.0088933288933304*G0_0_1_0_8 + 0.00207601921887671*G0_0_1_0_9 + 0.00231632564965937*G0_0_1_1_0 - 0.00231632564965938*G0_0_1_1_2 - 0.0381840381840447*G0_0_1_1_3 + 0.0118992118992139*G0_0_1_1_4 + 0.000502830502830573*G0_0_1_1_5 - 0.000502830502830571*G0_0_1_1_6 - 0.0118992118992139*G0_0_1_1_7 + 0.0381840381840446*G0_0_1_1_8 - 0.00231632564965938*G0_0_1_2_1 - 0.00151284341760555*G0_0_1_2_2 - 0.00889332889333041*G0_0_1_2_3 + 0.00243106100248998*G0_0_1_2_4 + 0.000544851973423483*G0_0_1_2_5 - 0.000586873444016379*G0_0_1_2_6 - 0.000520431949003458*G0_0_1_2_7 + 0.000449550449550504*G0_0_1_2_8 - 0.00207601921887673*G0_0_1_2_9 - 0.000449550449550542*G0_0_1_3_0 - 0.0381840381840447*G0_0_1_3_1 - 0.00889332889333041*G0_0_1_3_2 - 0.0998001998002168*G0_0_1_3_3 + 0.0445054945055021*G0_0_1_3_4 - 7.99200799201036e-05*G0_0_1_3_5 + 0.00150849150849178*G0_0_1_3_6 + 0.00134865134865163*G0_0_1_3_7 - 0.00269730269730324*G0_0_1_3_9 + 0.000520431949003475*G0_0_1_4_0 + 0.0118992118992139*G0_0_1_4_1 + 0.00243106100248998*G0_0_1_4_2 + 0.0445054945055021*G0_0_1_4_3 - 0.00755244755244882*G0_0_1_4_4 - 0.00156129584701039*G0_0_1_4_5 + 5.28043385186297e-05*G0_0_1_4_6 - 0.00134865134865151*G0_0_1_4_8 + 0.00935064935065098*G0_0_1_4_9 + 0.000586873444016381*G0_0_1_5_0 + 0.000502830502830573*G0_0_1_5_1 + 0.000544851973423483*G0_0_1_5_2 - 7.99200799201032e-05*G0_0_1_5_3 - 0.00156129584701039*G0_0_1_5_4 + 0.00235478806907419*G0_0_1_5_5 - 5.28043385186231e-05*G0_0_1_5_7 - 0.00150849150849179*G0_0_1_5_8 - 0.00321107463964661*G0_0_1_5_9 - 0.000544851973423483*G0_0_1_6_0 - 0.000502830502830571*G0_0_1_6_1 - 0.000586873444016379*G0_0_1_6_2 + 0.00150849150849178*G0_0_1_6_3 + 5.28043385186297e-05*G0_0_1_6_4 - 0.0023547880690741*G0_0_1_6_6 + 0.00156129584701038*G0_0_1_6_7 + 7.99200799201322e-05*G0_0_1_6_8 + 0.00321107463964663*G0_0_1_6_9 - 0.00243106100248999*G0_0_1_7_0 - 0.0118992118992139*G0_0_1_7_1 - 0.000520431949003458*G0_0_1_7_2 + 0.00134865134865163*G0_0_1_7_3 - 5.28043385186232e-05*G0_0_1_7_5 + 0.00156129584701038*G0_0_1_7_6 + 0.00755244755244883*G0_0_1_7_7 - 0.044505494505502*G0_0_1_7_8 - 0.00935064935065092*G0_0_1_7_9 + 0.00889332889333041*G0_0_1_8_0 + 0.0381840381840446*G0_0_1_8_1 + 0.000449550449550504*G0_0_1_8_2 - 0.00134865134865151*G0_0_1_8_4 - 0.00150849150849179*G0_0_1_8_5 + 7.99200799201322e-05*G0_0_1_8_6 - 0.044505494505502*G0_0_1_8_7 + 0.0998001998002165*G0_0_1_8_8 + 0.00269730269730309*G0_0_1_8_9 + 0.00207601921887671*G0_0_1_9_0 - 0.00207601921887672*G0_0_1_9_2 - 0.00269730269730324*G0_0_1_9_3 + 0.00935064935065098*G0_0_1_9_4 - 0.00321107463964661*G0_0_1_9_5 + 0.00321107463964663*G0_0_1_9_6 - 0.00935064935065092*G0_0_1_9_7 + 0.00269730269730309*G0_0_1_9_8; + A[12] = A[28] - 0.0595180480894866*G0_0_0_0_0 - 0.00588106778583068*G0_0_0_0_2 + 0.00869035726178733*G0_0_0_0_3 - 0.00137291280148446*G0_0_0_0_4 - 0.0696259296259414*G0_0_0_0_5 + 0.0285073656502276*G0_0_0_0_6 - 0.0311361654218849*G0_0_0_0_7 + 0.0198633112918861*G0_0_0_0_8 - 0.00260691689263164*G0_0_0_0_9 + 0.0595180480894868*G0_0_0_1_1 + 0.00588106778583068*G0_0_0_1_2 + 0.0696259296259414*G0_0_0_1_3 - 0.0285073656502276*G0_0_0_1_4 - 0.00869035726178729*G0_0_0_1_5 + 0.00137291280148445*G0_0_0_1_6 - 0.0198633112918861*G0_0_0_1_7 + 0.0311361654218851*G0_0_0_1_8 + 0.00260691689263167*G0_0_0_1_9 - 0.00588106778583068*G0_0_0_2_0 + 0.00588106778583068*G0_0_0_2_1 + 0.0126933384076263*G0_0_0_2_3 - 0.00271220842649456*G0_0_0_2_4 - 0.0126933384076263*G0_0_0_2_5 + 0.00271220842649459*G0_0_0_2_6 - 0.00859045716188717*G0_0_0_2_7 + 0.00859045716188718*G0_0_0_2_8 + 0.00869035726178734*G0_0_0_3_0 + 0.0696259296259415*G0_0_0_3_1 + 0.0126933384076263*G0_0_0_3_2 + 0.19944626801773*G0_0_0_3_3 - 0.0639046667618205*G0_0_0_3_4 - 0.0041187384044534*G0_0_0_3_6 - 0.0260710717853619*G0_0_0_3_7 + 0.0518424432710235*G0_0_0_3_8 + 0.044321392892829*G0_0_0_3_9 - 0.00137291280148446*G0_0_0_4_0 - 0.0285073656502276*G0_0_0_4_1 - 0.00271220842649456*G0_0_0_4_2 - 0.0639046667618205*G0_0_0_4_3 + 0.0652661624090306*G0_0_0_4_4 + 0.00411873840445339*G0_0_0_4_5 + 0.0149450549450575*G0_0_0_4_7 - 0.0257713714856616*G0_0_0_4_8 - 0.00823747680890679*G0_0_0_4_9 - 0.0696259296259414*G0_0_0_5_0 - 0.00869035726178729*G0_0_0_5_1 - 0.0126933384076263*G0_0_0_5_2 + 0.00411873840445339*G0_0_0_5_4 - 0.19944626801773*G0_0_0_5_5 + 0.0639046667618205*G0_0_0_5_6 - 0.0518424432710233*G0_0_0_5_7 + 0.0260710717853618*G0_0_0_5_8 - 0.0443213928928289*G0_0_0_5_9 + 0.0285073656502276*G0_0_0_6_0 + 0.00137291280148445*G0_0_0_6_1 + 0.00271220842649459*G0_0_0_6_2 - 0.0041187384044534*G0_0_0_6_3 + 0.0639046667618205*G0_0_0_6_5 - 0.0652661624090306*G0_0_0_6_6 + 0.0257713714856615*G0_0_0_6_7 - 0.0149450549450575*G0_0_0_6_8 + 0.0082374768089068*G0_0_0_6_9 - 0.0311361654218849*G0_0_0_7_0 - 0.0198633112918861*G0_0_0_7_1 - 0.00859045716188717*G0_0_0_7_2 - 0.0260710717853619*G0_0_0_7_3 + 0.0149450549450575*G0_0_0_7_4 - 0.0518424432710233*G0_0_0_7_5 + 0.0257713714856615*G0_0_0_7_6 - 0.0395775652918575*G0_0_0_7_7 - 0.0437219922934282*G0_0_0_7_9 + 0.0198633112918861*G0_0_0_8_0 + 0.0311361654218851*G0_0_0_8_1 + 0.00859045716188718*G0_0_0_8_2 + 0.0518424432710235*G0_0_0_8_3 - 0.0257713714856616*G0_0_0_8_4 + 0.0260710717853618*G0_0_0_8_5 - 0.0149450549450575*G0_0_0_8_6 + 0.0395775652918578*G0_0_0_8_8 + 0.0437219922934283*G0_0_0_8_9 - 0.00260691689263164*G0_0_0_9_0 + 0.00260691689263167*G0_0_0_9_1 + 0.044321392892829*G0_0_0_9_3 - 0.00823747680890678*G0_0_0_9_4 - 0.044321392892829*G0_0_0_9_5 + 0.0082374768089068*G0_0_0_9_6 - 0.0437219922934282*G0_0_0_9_7 + 0.0437219922934283*G0_0_0_9_8 - 0.0581327667042051*G0_0_1_0_0 - 0.00806082806082943*G0_0_1_0_1 - 0.00342817676151066*G0_0_1_0_2 + 0.00299922299922355*G0_0_1_0_3 + 0.0025320711035001*G0_0_1_0_4 - 0.0295301523873002*G0_0_1_0_5 + 0.0162669076954818*G0_0_1_0_6 - 0.0646962561248385*G0_0_1_0_7 + 0.0187279387279419*G0_0_1_0_8 - 0.00645830360116186*G0_0_1_0_9 - 0.00806082806082943*G0_0_1_1_0 + 0.00138528138528169*G0_0_1_1_1 + 0.00245289102432002*G0_0_1_1_2 + 0.0400957772386412*G0_0_1_1_3 - 0.0122404579547457*G0_0_1_1_4 - 0.00569113426256377*G0_0_1_1_5 + 0.00390498390498454*G0_0_1_1_6 - 0.00113537256394422*G0_0_1_1_7 - 0.0335600907029535*G0_0_1_1_8 - 0.0038513867085302*G0_0_1_1_9 - 0.00342817676151066*G0_0_1_2_0 + 0.00245289102432002*G0_0_1_2_1 + 0.00441096822049277*G0_0_1_2_2 + 0.00800723086437508*G0_0_1_2_3 - 0.00468610754325117*G0_0_1_2_5 + 0.00277975992261752*G0_0_1_2_6 - 0.00511742226028026*G0_0_1_2_7 + 0.00347303490160693*G0_0_1_2_8 + 0.000300651729223218*G0_0_1_2_9 + 0.00299922299922355*G0_0_1_3_0 + 0.0400957772386412*G0_0_1_3_1 + 0.00800723086437508*G0_0_1_3_2 + 0.158310261167431*G0_0_1_3_3 - 0.0508377336948852*G0_0_1_3_4 + 0.00153560724989324*G0_0_1_3_5 - 0.00671043242471928*G0_0_1_3_6 - 0.00399314970743611*G0_0_1_3_7 + 0.00940773512202251*G0_0_1_3_8 + 0.0195404595404629*G0_0_1_3_9 + 0.0025320711035001*G0_0_1_4_0 - 0.0122404579547457*G0_0_1_4_1 - 0.0508377336948852*G0_0_1_4_3 + 0.0684172969887372*G0_0_1_4_4 - 0.00259169402026589*G0_0_1_4_5 + 0.00930212644498517*G0_0_1_4_6 + 0.00137576709005305*G0_0_1_4_7 - 0.00541458541458638*G0_0_1_4_8 + 0.0042814328528621*G0_0_1_4_9 - 0.0295301523873002*G0_0_1_5_0 - 0.00569113426256377*G0_0_1_5_1 - 0.00468610754325117*G0_0_1_5_2 + 0.00153560724989324*G0_0_1_5_3 - 0.00259169402026589*G0_0_1_5_4 - 0.0411360068502994*G0_0_1_5_5 + 0.0130669330669352*G0_0_1_5_6 - 0.0424347081490009*G0_0_1_5_7 + 0.0220779220779258*G0_0_1_5_8 - 0.0247809333523661*G0_0_1_5_9 + 0.0162669076954818*G0_0_1_6_0 + 0.00390498390498454*G0_0_1_6_1 + 0.00277975992261752*G0_0_1_6_2 - 0.00671043242471928*G0_0_1_6_3 + 0.00930212644498517*G0_0_1_6_4 + 0.0130669330669352*G0_0_1_6_5 + 0.00315113457970647*G0_0_1_6_6 + 0.0203567860710752*G0_0_1_6_7 - 0.0135692878550044*G0_0_1_6_8 + 0.0125189096617689*G0_0_1_6_9 - 0.0646962561248385*G0_0_1_7_0 - 0.00113537256394422*G0_0_1_7_1 - 0.00511742226028026*G0_0_1_7_2 - 0.00399314970743611*G0_0_1_7_3 + 0.00137576709005305*G0_0_1_7_4 - 0.0424347081490009*G0_0_1_7_5 + 0.0203567860710752*G0_0_1_7_6 - 0.146133866133891*G0_0_1_7_7 + 0.102077922077939*G0_0_1_7_8 - 0.021338661338665*G0_0_1_7_9 + 0.0187279387279419*G0_0_1_8_0 - 0.0335600907029535*G0_0_1_8_1 + 0.00347303490160693*G0_0_1_8_2 + 0.00940773512202251*G0_0_1_8_3 - 0.00541458541458638*G0_0_1_8_4 + 0.0220779220779258*G0_0_1_8_5 - 0.0135692878550044*G0_0_1_8_6 + 0.102077922077939*G0_0_1_8_7 - 0.106556300842033*G0_0_1_8_8 + 0.0223833309547634*G0_0_1_8_9 - 0.00645830360116186*G0_0_1_9_0 - 0.0038513867085302*G0_0_1_9_1 + 0.000300651729223217*G0_0_1_9_2 + 0.0195404595404629*G0_0_1_9_3 + 0.0042814328528621*G0_0_1_9_4 - 0.0247809333523661*G0_0_1_9_5 + 0.0125189096617689*G0_0_1_9_6 - 0.021338661338665*G0_0_1_9_7 + 0.0223833309547634*G0_0_1_9_8 + 0.0528157556729074*G0_0_1_9_9 - 0.0566199232865994*G0_1_0_0_0 - 0.00342817676151066*G0_1_0_0_1 - 0.00574450241117005*G0_1_0_0_2 + 0.00305250305250358*G0_1_0_0_3 + 0.00254967254967299*G0_1_0_0_4 - 0.0671273171273285*G0_1_0_0_5 + 0.0276212676212723*G0_1_0_0_6 - 0.0289432789432838*G0_1_0_0_7 + 0.0157220557220583*G0_1_0_0_8 - 0.00438228438228513*G0_1_0_0_9 - 0.00342817676151066*G0_1_0_1_0 + 0.00289812480288723*G0_1_0_1_1 + 0.000136565374660641*G0_1_0_1_2 + 0.00249861249861295*G0_1_0_1_3 - 0.000886098028955315*G0_1_0_1_4 - 0.00563785420928371*G0_1_0_1_5 + 0.00392258535115743*G0_1_0_1_6 - 0.00414125556982769*G0_1_0_1_7 + 0.00219288647860114*G0_1_0_1_8 - 0.00177536748965349*G0_1_0_1_9 - 0.00574450241117005*G0_1_0_2_0 + 0.000136565374660641*G0_1_0_2_1 + 0.00138528138528164*G0_1_0_2_2 - 0.000341246055531837*G0_1_0_2_3 + 0.00191173905459655*G0_1_0_2_4 - 0.0130345844631581*G0_1_0_2_5 + 0.00462394748109112*G0_1_0_2_6 - 0.0051883037597332*G0_1_0_2_7 + 0.00340215340215397*G0_1_0_2_8 - 0.00385138670853022*G0_1_0_2_9 + 0.00305250305250358*G0_1_0_3_0 + 0.00249861249861295*G0_1_0_3_1 - 0.000341246055531837*G0_1_0_3_2 + 0.0608648494362882*G0_1_0_3_3 - 0.00633223918938317*G0_1_0_3_4 + 0.00137576709005302*G0_1_0_3_5 - 0.00676323676323789*G0_1_0_3_6 - 0.00415298986727629*G0_1_0_3_7 + 0.00935493078350379*G0_1_0_3_8 + 0.0136320822035131*G0_1_0_3_9 + 0.00254967254967299*G0_1_0_4_0 - 0.000886098028955316*G0_1_0_4_1 + 0.00191173905459655*G0_1_0_4_2 - 0.00633223918938316*G0_1_0_4_3 + 0.0585100613672141*G0_1_0_4_4 - 0.00264449835878452*G0_1_0_4_5 + 0.00940773512202242*G0_1_0_4_6 + 0.00145568716997313*G0_1_0_4_7 - 0.00520194091622751*G0_1_0_4_8 + 0.0168431568431597*G0_1_0_4_9 - 0.0671273171273285*G0_1_0_5_0 - 0.00563785420928371*G0_1_0_5_1 - 0.0130345844631581*G0_1_0_5_2 + 0.00137576709005302*G0_1_0_5_3 - 0.00264449835878452*G0_1_0_5_4 - 0.138581418581442*G0_1_0_5_5 + 0.0575724275724373*G0_1_0_5_6 - 0.0424875124875195*G0_1_0_5_7 + 0.0219180819180855*G0_1_0_5_8 - 0.0306893106893159*G0_1_0_5_9 + 0.0276212676212723*G0_1_0_6_0 + 0.00392258535115743*G0_1_0_6_1 + 0.00462394748109112*G0_1_0_6_2 - 0.00676323676323789*G0_1_0_6_3 + 0.00940773512202243*G0_1_0_6_4 + 0.0575724275724373*G0_1_0_6_5 - 0.00675610104181648*G0_1_0_6_6 + 0.020569430569434*G0_1_0_6_7 - 0.0134893677750843*G0_1_0_6_8 + 0.0250806336520665*G0_1_0_6_9 - 0.0289432789432838*G0_1_0_7_0 - 0.00414125556982769*G0_1_0_7_1 - 0.0051883037597332*G0_1_0_7_2 - 0.00415298986727629*G0_1_0_7_3 + 0.00145568716997313*G0_1_0_7_4 - 0.0424875124875195*G0_1_0_7_5 + 0.020569430569434*G0_1_0_7_6 - 0.0387812187812252*G0_1_0_7_7 + 0.0130669330669352*G0_1_0_7_8 - 0.0279920079920127*G0_1_0_7_9 + 0.0157220557220583*G0_1_0_8_0 + 0.00219288647860114*G0_1_0_8_1 + 0.00340215340215397*G0_1_0_8_2 + 0.00935493078350379*G0_1_0_8_3 - 0.00520194091622751*G0_1_0_8_4 + 0.0219180819180855*G0_1_0_8_5 - 0.0134893677750843*G0_1_0_8_6 + 0.0130669330669352*G0_1_0_8_7 + 0.000796346510632367*G0_1_0_8_8 + 0.0157299843014155*G0_1_0_8_9 - 0.00438228438228513*G0_1_0_9_0 - 0.00177536748965349*G0_1_0_9_1 - 0.00385138670853022*G0_1_0_9_2 + 0.0136320822035131*G0_1_0_9_3 + 0.0168431568431597*G0_1_0_9_4 - 0.0306893106893159*G0_1_0_9_5 + 0.0250806336520665*G0_1_0_9_6 - 0.0279920079920127*G0_1_0_9_7 + 0.0157299843014155*G0_1_0_9_8 + 0.0528157556729074*G0_1_0_9_9 - 0.0566199232865995*G0_1_1_0_0 - 0.00574450241117006*G0_1_1_0_1 - 0.00342817676151066*G0_1_1_0_2 + 0.00254967254967301*G0_1_1_0_3 + 0.00305250305250358*G0_1_1_0_4 - 0.0289432789432838*G0_1_1_0_5 + 0.0157220557220584*G0_1_1_0_6 - 0.0671273171273285*G0_1_1_0_7 + 0.0276212676212723*G0_1_1_0_8 - 0.00438228438228514*G0_1_1_0_9 - 0.00574450241117005*G0_1_1_1_0 + 0.00138528138528162*G0_1_1_1_1 + 0.00013656537466064*G0_1_1_1_2 + 0.00191173905459654*G0_1_1_1_3 - 0.000341246055531816*G0_1_1_1_4 - 0.0051883037597332*G0_1_1_1_5 + 0.00340215340215398*G0_1_1_1_6 - 0.0130345844631581*G0_1_1_1_7 + 0.00462394748109111*G0_1_1_1_8 - 0.00385138670853021*G0_1_1_1_9 - 0.00342817676151066*G0_1_1_2_0 + 0.00013656537466064*G0_1_1_2_1 + 0.00289812480288722*G0_1_1_2_2 - 0.000886098028955333*G0_1_1_2_3 + 0.00249861249861296*G0_1_1_2_4 - 0.00414125556982769*G0_1_1_2_5 + 0.00219288647860114*G0_1_1_2_6 - 0.00563785420928372*G0_1_1_2_7 + 0.00392258535115743*G0_1_1_2_8 - 0.00177536748965351*G0_1_1_2_9 + 0.00254967254967301*G0_1_1_3_0 + 0.00191173905459654*G0_1_1_3_1 - 0.000886098028955333*G0_1_1_3_2 + 0.0585100613672141*G0_1_1_3_3 - 0.00633223918938315*G0_1_1_3_4 + 0.00145568716997314*G0_1_1_3_5 - 0.00520194091622751*G0_1_1_3_6 - 0.00264449835878448*G0_1_1_3_7 + 0.00940773512202236*G0_1_1_3_8 + 0.0168431568431597*G0_1_1_3_9 + 0.00305250305250358*G0_1_1_4_0 - 0.000341246055531815*G0_1_1_4_1 + 0.00249861249861296*G0_1_1_4_2 - 0.00633223918938315*G0_1_1_4_3 + 0.0608648494362883*G0_1_1_4_4 - 0.00415298986727629*G0_1_1_4_5 + 0.00935493078350381*G0_1_1_4_6 + 0.00137576709005303*G0_1_1_4_7 - 0.00676323676323787*G0_1_1_4_8 + 0.0136320822035131*G0_1_1_4_9 - 0.0289432789432838*G0_1_1_5_0 - 0.0051883037597332*G0_1_1_5_1 - 0.00414125556982769*G0_1_1_5_2 + 0.00145568716997314*G0_1_1_5_3 - 0.00415298986727629*G0_1_1_5_4 - 0.0387812187812252*G0_1_1_5_5 + 0.0130669330669352*G0_1_1_5_6 - 0.0424875124875196*G0_1_1_5_7 + 0.020569430569434*G0_1_1_5_8 - 0.0279920079920127*G0_1_1_5_9 + 0.0157220557220584*G0_1_1_6_0 + 0.00340215340215398*G0_1_1_6_1 + 0.00219288647860114*G0_1_1_6_2 - 0.00520194091622751*G0_1_1_6_3 + 0.00935493078350381*G0_1_1_6_4 + 0.0130669330669352*G0_1_1_6_5 + 0.000796346510632389*G0_1_1_6_6 + 0.0219180819180856*G0_1_1_6_7 - 0.0134893677750843*G0_1_1_6_8 + 0.0157299843014155*G0_1_1_6_9 - 0.0671273171273285*G0_1_1_7_0 - 0.0130345844631581*G0_1_1_7_1 - 0.00563785420928372*G0_1_1_7_2 - 0.00264449835878448*G0_1_1_7_3 + 0.00137576709005302*G0_1_1_7_4 - 0.0424875124875196*G0_1_1_7_5 + 0.0219180819180856*G0_1_1_7_6 - 0.138581418581442*G0_1_1_7_7 + 0.0575724275724374*G0_1_1_7_8 - 0.0306893106893159*G0_1_1_7_9 + 0.0276212676212723*G0_1_1_8_0 + 0.00462394748109111*G0_1_1_8_1 + 0.00392258535115743*G0_1_1_8_2 + 0.00940773512202236*G0_1_1_8_3 - 0.00676323676323787*G0_1_1_8_4 + 0.020569430569434*G0_1_1_8_5 - 0.0134893677750843*G0_1_1_8_6 + 0.0575724275724374*G0_1_1_8_7 - 0.0067561010418168*G0_1_1_8_8 + 0.0250806336520664*G0_1_1_8_9 - 0.00438228438228514*G0_1_1_9_0 - 0.00385138670853022*G0_1_1_9_1 - 0.00177536748965351*G0_1_1_9_2 + 0.0168431568431597*G0_1_1_9_3 + 0.0136320822035131*G0_1_1_9_4 - 0.0279920079920127*G0_1_1_9_5 + 0.0157299843014155*G0_1_1_9_6 - 0.0306893106893159*G0_1_1_9_7 + 0.0250806336520664*G0_1_1_9_8 + 0.0528157556729073*G0_1_1_9_9; + A[180] = A[12] + 0.00231632564965939*G0_0_1_0_1 - 0.00231632564965938*G0_0_1_0_2 + 0.000502830502830565*G0_0_1_0_3 - 0.000502830502830579*G0_0_1_0_4 - 0.0381840381840447*G0_0_1_0_5 + 0.0118992118992139*G0_0_1_0_6 + 0.0381840381840447*G0_0_1_0_7 - 0.011899211899214*G0_0_1_0_8 + 0.00231632564965939*G0_0_1_1_0 + 0.00151284341760559*G0_0_1_1_1 + 0.000586873444016399*G0_0_1_1_3 - 0.000544851973423492*G0_0_1_1_4 - 0.000449550449550509*G0_0_1_1_5 + 0.000520431949003464*G0_0_1_1_6 + 0.00889332889333042*G0_0_1_1_7 - 0.00243106100248999*G0_0_1_1_8 + 0.00207601921887673*G0_0_1_1_9 - 0.00231632564965938*G0_0_1_2_0 - 0.00151284341760558*G0_0_1_2_2 + 0.000544851973423489*G0_0_1_2_3 - 0.000586873444016391*G0_0_1_2_4 - 0.00889332889333041*G0_0_1_2_5 + 0.00243106100248998*G0_0_1_2_6 + 0.000449550449550526*G0_0_1_2_7 - 0.000520431949003468*G0_0_1_2_8 - 0.00207601921887672*G0_0_1_2_9 + 0.000502830502830565*G0_0_1_3_0 + 0.000586873444016401*G0_0_1_3_1 + 0.000544851973423489*G0_0_1_3_2 + 0.0023547880690741*G0_0_1_3_3 - 0.00156129584701039*G0_0_1_3_6 - 0.0015084915084918*G0_0_1_3_7 - 0.00321107463964665*G0_0_1_3_9 - 0.000502830502830579*G0_0_1_4_0 - 0.000544851973423492*G0_0_1_4_1 - 0.00058687344401639*G0_0_1_4_2 - 0.00235478806907419*G0_0_1_4_4 + 0.00150849150849177*G0_0_1_4_5 + 0.00156129584701039*G0_0_1_4_8 + 0.00321107463964663*G0_0_1_4_9 - 0.0381840381840447*G0_0_1_5_0 - 0.000449550449550507*G0_0_1_5_1 - 0.00889332889333042*G0_0_1_5_2 + 0.00150849150849177*G0_0_1_5_4 - 0.0998001998002166*G0_0_1_5_5 + 0.0445054945055021*G0_0_1_5_6 + 0.00134865134865154*G0_0_1_5_8 - 0.00269730269730312*G0_0_1_5_9 + 0.0118992118992139*G0_0_1_6_0 + 0.000520431949003464*G0_0_1_6_1 + 0.00243106100248998*G0_0_1_6_2 - 0.00156129584701039*G0_0_1_6_3 + 0.0445054945055021*G0_0_1_6_5 - 0.00755244755244882*G0_0_1_6_6 - 0.0013486513486516*G0_0_1_6_7 + 0.00935064935065094*G0_0_1_6_9 + 0.0381840381840447*G0_0_1_7_0 + 0.00889332889333042*G0_0_1_7_1 + 0.000449550449550526*G0_0_1_7_2 - 0.0015084915084918*G0_0_1_7_3 - 0.0013486513486516*G0_0_1_7_6 + 0.0998001998002168*G0_0_1_7_7 - 0.0445054945055021*G0_0_1_7_8 + 0.00269730269730324*G0_0_1_7_9 - 0.011899211899214*G0_0_1_8_0 - 0.00243106100248999*G0_0_1_8_1 - 0.000520431949003469*G0_0_1_8_2 + 0.00156129584701039*G0_0_1_8_4 + 0.00134865134865154*G0_0_1_8_5 - 0.0445054945055021*G0_0_1_8_7 + 0.00755244755244888*G0_0_1_8_8 - 0.00935064935065099*G0_0_1_8_9 + 0.00207601921887673*G0_0_1_9_1 - 0.00207601921887671*G0_0_1_9_2 - 0.00321107463964664*G0_0_1_9_3 + 0.00321107463964663*G0_0_1_9_4 - 0.00269730269730312*G0_0_1_9_5 + 0.00935064935065094*G0_0_1_9_6 + 0.00269730269730324*G0_0_1_9_7 - 0.00935064935065099*G0_0_1_9_8 - 0.00231632564965939*G0_1_0_0_1 + 0.00231632564965938*G0_1_0_0_2 - 0.000502830502830565*G0_1_0_0_3 + 0.000502830502830579*G0_1_0_0_4 + 0.0381840381840447*G0_1_0_0_5 - 0.0118992118992139*G0_1_0_0_6 - 0.0381840381840447*G0_1_0_0_7 + 0.011899211899214*G0_1_0_0_8 - 0.00231632564965939*G0_1_0_1_0 - 0.00151284341760559*G0_1_0_1_1 - 0.000586873444016398*G0_1_0_1_3 + 0.000544851973423491*G0_1_0_1_4 + 0.000449550449550509*G0_1_0_1_5 - 0.000520431949003464*G0_1_0_1_6 - 0.00889332889333042*G0_1_0_1_7 + 0.00243106100248999*G0_1_0_1_8 - 0.00207601921887673*G0_1_0_1_9 + 0.00231632564965938*G0_1_0_2_0 + 0.00151284341760558*G0_1_0_2_2 - 0.000544851973423489*G0_1_0_2_3 + 0.000586873444016391*G0_1_0_2_4 + 0.00889332889333041*G0_1_0_2_5 - 0.00243106100248998*G0_1_0_2_6 - 0.000449550449550526*G0_1_0_2_7 + 0.000520431949003469*G0_1_0_2_8 + 0.00207601921887672*G0_1_0_2_9 - 0.000502830502830565*G0_1_0_3_0 - 0.000586873444016399*G0_1_0_3_1 - 0.000544851973423489*G0_1_0_3_2 - 0.0023547880690741*G0_1_0_3_3 + 0.00156129584701039*G0_1_0_3_6 + 0.0015084915084918*G0_1_0_3_7 + 0.00321107463964664*G0_1_0_3_9 + 0.000502830502830579*G0_1_0_4_0 + 0.000544851973423492*G0_1_0_4_1 + 0.000586873444016391*G0_1_0_4_2 + 0.00235478806907419*G0_1_0_4_4 - 0.00150849150849177*G0_1_0_4_5 - 0.00156129584701039*G0_1_0_4_8 - 0.00321107463964663*G0_1_0_4_9 + 0.0381840381840447*G0_1_0_5_0 + 0.000449550449550506*G0_1_0_5_1 + 0.00889332889333041*G0_1_0_5_2 - 0.00150849150849177*G0_1_0_5_4 + 0.0998001998002166*G0_1_0_5_5 - 0.0445054945055021*G0_1_0_5_6 - 0.00134865134865154*G0_1_0_5_8 + 0.00269730269730311*G0_1_0_5_9 - 0.0118992118992139*G0_1_0_6_0 - 0.000520431949003463*G0_1_0_6_1 - 0.00243106100248998*G0_1_0_6_2 + 0.00156129584701039*G0_1_0_6_3 - 0.0445054945055021*G0_1_0_6_5 + 0.00755244755244882*G0_1_0_6_6 + 0.0013486513486516*G0_1_0_6_7 - 0.00935064935065094*G0_1_0_6_9 - 0.0381840381840447*G0_1_0_7_0 - 0.00889332889333042*G0_1_0_7_1 - 0.000449550449550527*G0_1_0_7_2 + 0.0015084915084918*G0_1_0_7_3 + 0.0013486513486516*G0_1_0_7_6 - 0.0998001998002168*G0_1_0_7_7 + 0.0445054945055021*G0_1_0_7_8 - 0.00269730269730325*G0_1_0_7_9 + 0.011899211899214*G0_1_0_8_0 + 0.00243106100248999*G0_1_0_8_1 + 0.000520431949003469*G0_1_0_8_2 - 0.00156129584701039*G0_1_0_8_4 - 0.00134865134865153*G0_1_0_8_5 + 0.0445054945055021*G0_1_0_8_7 - 0.00755244755244888*G0_1_0_8_8 + 0.00935064935065099*G0_1_0_8_9 - 0.00207601921887673*G0_1_0_9_1 + 0.00207601921887672*G0_1_0_9_2 + 0.00321107463964664*G0_1_0_9_3 - 0.00321107463964663*G0_1_0_9_4 + 0.00269730269730311*G0_1_0_9_5 - 0.00935064935065094*G0_1_0_9_6 - 0.00269730269730325*G0_1_0_9_7 + 0.00935064935065099*G0_1_0_9_8; + A[131] = -A[86] + 0.0223759309473634*G0_1_0_0_0 - 0.00349900540376795*G0_1_0_0_1 - 0.000180419228038306*G0_1_0_0_2 + 0.000402560402560463*G0_1_0_0_3 - 0.000383954669669022*G0_1_0_0_4 - 0.00268260839689455*G0_1_0_0_5 - 0.00178319035461924*G0_1_0_0_6 - 0.00427424427424492*G0_1_0_0_7 - 0.00379091807663304*G0_1_0_0_8 - 0.00931386074243373*G0_1_0_0_9 - 0.00349900540376795*G0_1_0_1_0 - 0.093555826889177*G0_1_0_1_1 - 0.00156598251836376*G0_1_0_1_2 - 0.0109934509934531*G0_1_0_1_3 + 0.00540538826253213*G0_1_0_1_4 + 0.00119922405636717*G0_1_0_1_5 - 0.00110704110704132*G0_1_0_1_6 + 0.0124738753310205*G0_1_0_1_7 - 0.0361061161061226*G0_1_0_1_8 + 0.000662194947909297*G0_1_0_1_9 - 0.000180419228038306*G0_1_0_2_0 - 0.00156598251836375*G0_1_0_2_1 + 0.000592000592000684*G0_1_0_2_4 - 0.00167536167536196*G0_1_0_2_5 - 0.000592000592000689*G0_1_0_2_6 + 0.00122205836491572*G0_1_0_2_7 + 0.000524343381486314*G0_1_0_2_8 + 0.00166944166944196*G0_1_0_2_9 + 0.000402560402560463*G0_1_0_3_0 - 0.0109934509934531*G0_1_0_3_1 + 0.0366490652205001*G0_1_0_3_3 + 0.00283145426002621*G0_1_0_3_4 - 0.004148232719662*G0_1_0_3_5 + 0.00681223538366514*G0_1_0_3_6 + 0.00228343085485984*G0_1_0_3_7 - 0.00420151277294215*G0_1_0_3_8 - 0.00655344655344758*G0_1_0_3_9 - 0.000383954669669022*G0_1_0_4_0 + 0.00540538826253213*G0_1_0_4_1 + 0.000592000592000684*G0_1_0_4_2 + 0.00283145426002621*G0_1_0_4_3 - 0.0111888111888131*G0_1_0_4_4 + 0.00464297607154829*G0_1_0_4_5 - 0.0114552114552134*G0_1_0_4_6 - 0.00300271157414067*G0_1_0_4_7 + 0.0019180819180823*G0_1_0_4_8 - 0.0142942771514225*G0_1_0_4_9 - 0.00268260839689454*G0_1_0_5_0 + 0.00119922405636717*G0_1_0_5_1 - 0.00167536167536196*G0_1_0_5_2 - 0.004148232719662*G0_1_0_5_3 + 0.00464297607154829*G0_1_0_5_4 - 0.0304533561676469*G0_1_0_5_5 + 0.018640407211839*G0_1_0_5_6 + 0.000281623138766071*G0_1_0_5_7 - 0.000106560106560139*G0_1_0_5_8 + 0.0281547024404215*G0_1_0_5_9 - 0.00178319035461924*G0_1_0_6_0 - 0.00110704110704132*G0_1_0_6_1 - 0.000592000592000689*G0_1_0_6_2 + 0.00681223538366514*G0_1_0_6_3 - 0.0114552114552134*G0_1_0_6_4 + 0.018640407211839*G0_1_0_6_5 + 0.0340992340992398*G0_1_0_6_6 - 0.000175063032205916*G0_1_0_6_7 - 0.00087150944293812*G0_1_0_6_8 - 0.0186327957756562*G0_1_0_6_9 - 0.00427424427424492*G0_1_0_7_0 + 0.0124738753310205*G0_1_0_7_1 + 0.00122205836491572*G0_1_0_7_2 + 0.00228343085485984*G0_1_0_7_3 - 0.00300271157414067*G0_1_0_7_4 + 0.000281623138766071*G0_1_0_7_5 - 0.000175063032205916*G0_1_0_7_6 - 0.0397088625660121*G0_1_0_7_7 + 0.0353931782503271*G0_1_0_7_8 + 0.028291708291713*G0_1_0_7_9 - 0.00379091807663304*G0_1_0_8_0 - 0.0361061161061226*G0_1_0_8_1 + 0.000524343381486314*G0_1_0_8_2 - 0.00420151277294215*G0_1_0_8_3 + 0.0019180819180823*G0_1_0_8_4 - 0.00010656010656014*G0_1_0_8_5 - 0.00087150944293812*G0_1_0_8_6 + 0.0353931782503271*G0_1_0_8_7 + 0.110495219066666*G0_1_0_8_8 - 0.00582274867989247*G0_1_0_8_9 - 0.00931386074243373*G0_1_0_9_0 + 0.000662194947909298*G0_1_0_9_1 + 0.00166944166944196*G0_1_0_9_2 - 0.00655344655344758*G0_1_0_9_3 - 0.0142942771514225*G0_1_0_9_4 + 0.0281547024404215*G0_1_0_9_5 - 0.0186327957756562*G0_1_0_9_6 + 0.028291708291713*G0_1_0_9_7 - 0.00582274867989247*G0_1_0_9_8 - 0.0411017553874767*G0_1_0_9_9 - 0.0024525738811458*G0_1_1_0_0 - 0.00795324604848557*G0_1_1_0_1 - 0.000126998222236343*G0_1_1_0_2 + 0.00239125953411707*G0_1_1_0_3 - 0.000287543144686056*G0_1_1_0_5 - 0.00038522324236616*G0_1_1_0_6 + 0.00142925857211596*G0_1_1_0_7 - 0.0101058729630176*G0_1_1_0_8 + 0.00125081267938431*G0_1_1_0_9 - 0.00795324604848557*G0_1_1_1_0 - 0.125800125800148*G0_1_1_1_1 - 0.00305993829803407*G0_1_1_1_2 - 0.0207555407555445*G0_1_1_1_3 + 0.0125089725089747*G0_1_1_1_4 + 0.00138147566719024*G0_1_1_1_5 - 0.000511234796949189*G0_1_1_1_6 + 0.0359048359048422*G0_1_1_1_7 - 0.0861597661597812*G0_1_1_1_8 - 0.00667776667776785*G0_1_1_1_9 - 0.000126998222236343*G0_1_1_2_0 - 0.00305993829803407*G0_1_1_2_1 + 0.00284160284160331*G0_1_1_2_2 + 0.00359048359048419*G0_1_1_2_3 - 0.000503200503200588*G0_1_1_2_4 + 0.000121360121360146*G0_1_1_2_5 + 0.000592000592000682*G0_1_1_2_6 + 0.000795395081109506*G0_1_1_2_7 - 0.00363699792271283*G0_1_1_2_8 + 0.00143856143856166*G0_1_1_2_9 + 0.00239125953411707*G0_1_1_3_0 - 0.0207555407555445*G0_1_1_3_1 + 0.00359048359048419*G0_1_1_3_2 + 0.086260406260421*G0_1_1_3_3 - 0.0179667951096553*G0_1_1_3_4 - 0.0066562009419163*G0_1_1_3_5 + 0.00352790067075838*G0_1_1_3_6 - 0.00517958232244026*G0_1_1_3_7 - 0.00772560772560919*G0_1_1_3_8 + 0.030392464678184*G0_1_1_3_9 + 0.0125089725089747*G0_1_1_4_1 - 0.000503200503200588*G0_1_1_4_2 - 0.0179667951096553*G0_1_1_4_3 + 0.00905760905761058*G0_1_1_4_4 + 0.0020665049236481*G0_1_1_4_5 - 0.0055944055944065*G0_1_1_4_6 - 0.00215403643975114*G0_1_1_4_7 + 0.0129051900480495*G0_1_1_4_8 - 0.0084486941629812*G0_1_1_4_9 - 0.000287543144686057*G0_1_1_5_0 + 0.00138147566719024*G0_1_1_5_1 + 0.000121360121360147*G0_1_1_5_2 - 0.0066562009419163*G0_1_1_5_3 + 0.0020665049236481*G0_1_1_5_4 + 0.00464297607154827*G0_1_1_5_5 + 0.00102373816659548*G0_1_1_5_6 + 0.0025422196850772*G0_1_1_5_7 - 0.00215023072165957*G0_1_1_5_8 + 0.000548023405166315*G0_1_1_5_9 - 0.00038522324236616*G0_1_1_6_0 - 0.000511234796949189*G0_1_1_6_1 + 0.000592000592000682*G0_1_1_6_2 + 0.00352790067075838*G0_1_1_6_3 - 0.0055944055944065*G0_1_1_6_4 + 0.00102373816659548*G0_1_1_6_5 - 0.0170496170496198*G0_1_1_6_6 - 0.000391988963417583*G0_1_1_6_7 + 0.00522525093953748*G0_1_1_6_8 - 0.0113714856572018*G0_1_1_6_9 + 0.00142925857211596*G0_1_1_7_0 + 0.0359048359048422*G0_1_1_7_1 + 0.000795395081109506*G0_1_1_7_2 - 0.00517958232244026*G0_1_1_7_3 - 0.00215403643975113*G0_1_1_7_4 + 0.0025422196850772*G0_1_1_7_5 - 0.000391988963417582*G0_1_1_7_6 - 0.0166690452404768*G0_1_1_7_7 + 0.05595547309834*G0_1_1_7_8 - 0.00296846011131775*G0_1_1_7_9 - 0.0101058729630176*G0_1_1_8_0 - 0.0861597661597812*G0_1_1_8_1 - 0.00363699792271283*G0_1_1_8_2 - 0.00772560772560919*G0_1_1_8_3 + 0.0129051900480495*G0_1_1_8_4 - 0.00215023072165957*G0_1_1_8_5 + 0.00522525093953748*G0_1_1_8_6 + 0.05595547309834*G0_1_1_8_7 - 0.201878121878157*G0_1_1_8_8 - 0.00577708006279546*G0_1_1_8_9 + 0.00125081267938431*G0_1_1_9_0 - 0.00667776667776785*G0_1_1_9_1 + 0.00143856143856166*G0_1_1_9_2 + 0.030392464678184*G0_1_1_9_3 - 0.0084486941629812*G0_1_1_9_4 + 0.000548023405166315*G0_1_1_9_5 - 0.0113714856572018*G0_1_1_9_6 - 0.00296846011131775*G0_1_1_9_7 - 0.00577708006279546*G0_1_1_9_8 + 0.00438418724133077*G0_1_1_9_9; + A[123] = -A[131] - 0.00245257388114574*G0_0_0_0_0 - 0.00012699822223634*G0_0_0_0_1 - 0.00795324604848549*G0_0_0_0_2 + 0.0023912595341171*G0_0_0_0_4 + 0.00142925857211595*G0_0_0_0_5 - 0.0101058729630175*G0_0_0_0_6 - 0.000287543144686061*G0_0_0_0_7 - 0.000385223242366163*G0_0_0_0_8 + 0.00125081267938433*G0_0_0_0_9 - 0.00012699822223634*G0_0_0_1_0 + 0.00284160284160324*G0_0_0_1_1 - 0.00305993829803405*G0_0_0_1_2 - 0.000503200503200613*G0_0_0_1_3 + 0.00359048359048423*G0_0_0_1_4 + 0.000795395081109496*G0_0_0_1_5 - 0.00363699792271282*G0_0_0_1_6 + 0.000121360121360146*G0_0_0_1_7 + 0.00059200059200067*G0_0_0_1_8 + 0.00143856143856169*G0_0_0_1_9 - 0.00795324604848549*G0_0_0_2_0 - 0.00305993829803405*G0_0_0_2_1 - 0.125800125800147*G0_0_0_2_2 + 0.0125089725089745*G0_0_0_2_3 - 0.0207555407555441*G0_0_0_2_4 + 0.0359048359048419*G0_0_0_2_5 - 0.0861597661597805*G0_0_0_2_6 + 0.00138147566719017*G0_0_0_2_7 - 0.000511234796949175*G0_0_0_2_8 - 0.00667776667776776*G0_0_0_2_9 - 0.000503200503200612*G0_0_0_3_1 + 0.0125089725089745*G0_0_0_3_2 + 0.00905760905761057*G0_0_0_3_3 - 0.0179667951096554*G0_0_0_3_4 - 0.00215403643975104*G0_0_0_3_5 + 0.0129051900480492*G0_0_0_3_6 + 0.00206650492364813*G0_0_0_3_7 - 0.00559440559440649*G0_0_0_3_8 - 0.00844869416298131*G0_0_0_3_9 + 0.0023912595341171*G0_0_0_4_0 + 0.00359048359048423*G0_0_0_4_1 - 0.0207555407555441*G0_0_0_4_2 - 0.0179667951096554*G0_0_0_4_3 + 0.0862604062604209*G0_0_0_4_4 - 0.0051795823224404*G0_0_0_4_5 - 0.00772560772560887*G0_0_0_4_6 - 0.00665620094191635*G0_0_0_4_7 + 0.00352790067075836*G0_0_0_4_8 + 0.0303924646781841*G0_0_0_4_9 + 0.00142925857211595*G0_0_0_5_0 + 0.000795395081109496*G0_0_0_5_1 + 0.0359048359048419*G0_0_0_5_2 - 0.00215403643975104*G0_0_0_5_3 - 0.0051795823224404*G0_0_0_5_4 - 0.0166690452404766*G0_0_0_5_5 + 0.0559554730983396*G0_0_0_5_6 + 0.00254221968507726*G0_0_0_5_7 - 0.000391988963417586*G0_0_0_5_8 - 0.00296846011131781*G0_0_0_5_9 - 0.0101058729630175*G0_0_0_6_0 - 0.00363699792271282*G0_0_0_6_1 - 0.0861597661597805*G0_0_0_6_2 + 0.0129051900480492*G0_0_0_6_3 - 0.00772560772560887*G0_0_0_6_4 + 0.0559554730983396*G0_0_0_6_5 - 0.201878121878156*G0_0_0_6_6 - 0.00215023072165968*G0_0_0_6_7 + 0.00522525093953747*G0_0_0_6_8 - 0.00577708006279517*G0_0_0_6_9 - 0.000287543144686061*G0_0_0_7_0 + 0.000121360121360146*G0_0_0_7_1 + 0.00138147566719017*G0_0_0_7_2 + 0.00206650492364813*G0_0_0_7_3 - 0.00665620094191635*G0_0_0_7_4 + 0.00254221968507725*G0_0_0_7_5 - 0.00215023072165968*G0_0_0_7_6 + 0.00464297607154826*G0_0_0_7_7 + 0.00102373816659548*G0_0_0_7_8 + 0.000548023405166332*G0_0_0_7_9 - 0.000385223242366163*G0_0_0_8_0 + 0.00059200059200067*G0_0_0_8_1 - 0.000511234796949175*G0_0_0_8_2 - 0.00559440559440649*G0_0_0_8_3 + 0.00352790067075836*G0_0_0_8_4 - 0.000391988963417586*G0_0_0_8_5 + 0.00522525093953747*G0_0_0_8_6 + 0.00102373816659548*G0_0_0_8_7 - 0.0170496170496197*G0_0_0_8_8 - 0.0113714856572018*G0_0_0_8_9 + 0.00125081267938433*G0_0_0_9_0 + 0.00143856143856169*G0_0_0_9_1 - 0.00667776667776776*G0_0_0_9_2 - 0.00844869416298131*G0_0_0_9_3 + 0.0303924646781841*G0_0_0_9_4 - 0.00296846011131781*G0_0_0_9_5 - 0.00577708006279517*G0_0_0_9_6 + 0.000548023405166332*G0_0_0_9_7 - 0.0113714856572018*G0_0_0_9_8 + 0.00438418724133084*G0_0_0_9_9 + 0.0223759309473635*G0_1_0_0_0 - 0.000180419228038309*G0_1_0_0_1 - 0.0034990054037679*G0_1_0_0_2 - 0.000383954669669037*G0_1_0_0_3 + 0.000402560402560478*G0_1_0_0_4 - 0.00427424427424497*G0_1_0_0_5 - 0.00379091807663299*G0_1_0_0_6 - 0.0026826083968945*G0_1_0_0_7 - 0.00178319035461925*G0_1_0_0_8 - 0.00931386074243373*G0_1_0_0_9 - 0.000180419228038309*G0_1_0_1_0 - 0.00156598251836374*G0_1_0_1_2 + 0.00059200059200061*G0_1_0_1_3 + 0.00122205836491573*G0_1_0_1_5 + 0.000524343381486322*G0_1_0_1_6 - 0.0016753616753619*G0_1_0_1_7 - 0.000592000592000802*G0_1_0_1_8 + 0.00166944166944193*G0_1_0_1_9 - 0.0034990054037679*G0_1_0_2_0 - 0.00156598251836374*G0_1_0_2_1 - 0.0935558268891759*G0_1_0_2_2 + 0.00540538826253197*G0_1_0_2_3 - 0.0109934509934528*G0_1_0_2_4 + 0.0124738753310202*G0_1_0_2_5 - 0.0361061161061221*G0_1_0_2_6 + 0.00119922405636711*G0_1_0_2_7 - 0.0011070411070413*G0_1_0_2_8 + 0.000662194947909384*G0_1_0_2_9 - 0.000383954669669037*G0_1_0_3_0 + 0.000592000592000608*G0_1_0_3_1 + 0.00540538826253197*G0_1_0_3_2 - 0.0111888111888133*G0_1_0_3_3 + 0.00283145426002613*G0_1_0_3_4 - 0.00300271157414065*G0_1_0_3_5 + 0.00191808191808228*G0_1_0_3_6 + 0.0046429760715483*G0_1_0_3_7 - 0.0114552114552134*G0_1_0_3_8 - 0.0142942771514224*G0_1_0_3_9 + 0.000402560402560478*G0_1_0_4_0 - 0.0109934509934528*G0_1_0_4_2 + 0.00283145426002613*G0_1_0_4_3 + 0.0366490652205001*G0_1_0_4_4 + 0.00228343085485979*G0_1_0_4_5 - 0.00420151277294206*G0_1_0_4_6 - 0.00414823271966199*G0_1_0_4_7 + 0.0068122353836651*G0_1_0_4_8 - 0.00655344655344774*G0_1_0_4_9 - 0.00427424427424497*G0_1_0_5_0 + 0.00122205836491573*G0_1_0_5_1 + 0.0124738753310202*G0_1_0_5_2 - 0.00300271157414065*G0_1_0_5_3 + 0.00228343085485979*G0_1_0_5_4 - 0.0397088625660119*G0_1_0_5_5 + 0.035393178250327*G0_1_0_5_6 + 0.000281623138766096*G0_1_0_5_7 - 0.000175063032205955*G0_1_0_5_8 + 0.0282917082917131*G0_1_0_5_9 - 0.00379091807663299*G0_1_0_6_0 + 0.000524343381486322*G0_1_0_6_1 - 0.0361061161061221*G0_1_0_6_2 + 0.00191808191808228*G0_1_0_6_3 - 0.00420151277294206*G0_1_0_6_4 + 0.035393178250327*G0_1_0_6_5 + 0.110495219066666*G0_1_0_6_6 - 0.000106560106560123*G0_1_0_6_7 - 0.000871509442938115*G0_1_0_6_8 - 0.00582274867989271*G0_1_0_6_9 - 0.0026826083968945*G0_1_0_7_0 - 0.0016753616753619*G0_1_0_7_1 + 0.00119922405636711*G0_1_0_7_2 + 0.0046429760715483*G0_1_0_7_3 - 0.00414823271966199*G0_1_0_7_4 + 0.000281623138766096*G0_1_0_7_5 - 0.000106560106560123*G0_1_0_7_6 - 0.030453356167647*G0_1_0_7_7 + 0.0186404072118389*G0_1_0_7_8 + 0.0281547024404215*G0_1_0_7_9 - 0.00178319035461925*G0_1_0_8_0 - 0.000592000592000802*G0_1_0_8_1 - 0.0011070411070413*G0_1_0_8_2 - 0.0114552114552134*G0_1_0_8_3 + 0.0068122353836651*G0_1_0_8_4 - 0.000175063032205955*G0_1_0_8_5 - 0.000871509442938114*G0_1_0_8_6 + 0.0186404072118389*G0_1_0_8_7 + 0.03409923409924*G0_1_0_8_8 - 0.018632795775656*G0_1_0_8_9 - 0.00931386074243373*G0_1_0_9_0 + 0.00166944166944193*G0_1_0_9_1 + 0.000662194947909384*G0_1_0_9_2 - 0.0142942771514224*G0_1_0_9_3 - 0.00655344655344775*G0_1_0_9_4 + 0.0282917082917131*G0_1_0_9_5 - 0.00582274867989271*G0_1_0_9_6 + 0.0281547024404215*G0_1_0_9_7 - 0.018632795775656*G0_1_0_9_8 - 0.0411017553874766*G0_1_0_9_9; + A[74] = A[214] + 0.000779749351178035*G0_0_1_0_0 - 0.000544006258292068*G0_0_1_0_1 + 0.00208236208236242*G0_0_1_0_2 + 0.0100585129156575*G0_0_1_0_3 - 0.0176395033537921*G0_0_1_0_4 - 0.00152419009561894*G0_0_1_0_5 + 0.00205508776937382*G0_0_1_0_6 - 0.00207601921887674*G0_0_1_0_7 + 0.00327291755863243*G0_0_1_0_8 + 0.00461253032681682*G0_0_1_0_9 - 0.000544006258292068*G0_0_1_1_0 + 0.0145632145632171*G0_0_1_1_1 + 0.000473600473600536*G0_0_1_1_2 - 0.00375624375624433*G0_0_1_1_3 - 0.0235992578849763*G0_0_1_1_4 + 0.00419009561866776*G0_0_1_1_5 + 0.00285999714571193*G0_0_1_1_6 - 0.00122163550735002*G0_0_1_1_7 + 0.00839160839160987*G0_0_1_1_8 - 0.00666761809619062*G0_0_1_1_9 + 0.00208236208236242*G0_0_1_2_0 + 0.000473600473600536*G0_0_1_2_1 + 0.0379472379472441*G0_0_1_2_2 - 0.00237096237096267*G0_0_1_2_3 - 0.018514818514822*G0_0_1_2_4 - 0.0114285714285733*G0_0_1_2_5 + 0.0267732267732311*G0_0_1_2_6 + 0.00151848151848177*G0_0_1_2_7 - 0.0115084915084935*G0_0_1_2_9 + 0.0100585129156575*G0_0_1_3_0 - 0.00375624375624433*G0_0_1_3_1 - 0.00237096237096267*G0_0_1_3_2 + 0.0723390894819591*G0_0_1_3_3 + 0.129470529470552*G0_0_1_3_4 - 0.0247638076209547*G0_0_1_3_5 - 0.00179820179820206*G0_0_1_3_6 - 0.0233937491080388*G0_0_1_3_7 + 0.0167318395889852*G0_0_1_3_8 + 0.0667903525046495*G0_0_1_3_9 - 0.0176395033537921*G0_0_1_4_0 - 0.0235992578849763*G0_0_1_4_1 - 0.018514818514822*G0_0_1_4_2 + 0.129470529470552*G0_0_1_4_3 - 0.670369630369744*G0_0_1_4_4 + 0.0597002997003098*G0_0_1_4_5 - 0.0579020979021078*G0_0_1_4_6 + 0.0207906379334986*G0_0_1_4_7 + 0.00666190951905355*G0_0_1_4_8 - 0.0848751248751389*G0_0_1_4_9 - 0.00152419009561894*G0_0_1_5_0 + 0.00419009561866776*G0_0_1_5_1 - 0.0114285714285733*G0_0_1_5_2 - 0.0247638076209547*G0_0_1_5_3 + 0.0597002997003098*G0_0_1_5_4 + 0.00952190666476554*G0_0_1_5_5 - 0.0135464535464556*G0_0_1_5_6 + 0.00356215213358127*G0_0_1_5_7 - 0.00578849721706964*G0_0_1_5_8 - 0.00226059654631117*G0_0_1_5_9 + 0.00205508776937382*G0_0_1_6_0 + 0.00285999714571193*G0_0_1_6_1 + 0.0267732267732311*G0_0_1_6_2 - 0.00179820179820205*G0_0_1_6_3 - 0.0579020979021078*G0_0_1_6_4 - 0.0135464535464557*G0_0_1_6_5 + 0.107652347652366*G0_0_1_6_6 + 0.00222634508348838*G0_0_1_6_7 - 0.00774083059797476*G0_0_1_6_8 + 0.0381218781218847*G0_0_1_6_9 - 0.00207601921887674*G0_0_1_7_0 - 0.00122163550735002*G0_0_1_7_1 + 0.00151848151848177*G0_0_1_7_2 - 0.0233937491080388*G0_0_1_7_3 + 0.0207906379334986*G0_0_1_7_4 + 0.00356215213358127*G0_0_1_7_5 + 0.00222634508348838*G0_0_1_7_6 + 0.0173312401883855*G0_0_1_7_7 - 0.0111831026116759*G0_0_1_7_8 - 0.0182902811474271*G0_0_1_7_9 + 0.00327291755863243*G0_0_1_8_0 + 0.00839160839160987*G0_0_1_8_1 + 0.0167318395889852*G0_0_1_8_3 + 0.00666190951905355*G0_0_1_8_4 - 0.00578849721706964*G0_0_1_8_5 - 0.00774083059797475*G0_0_1_8_6 - 0.0111831026116759*G0_0_1_8_7 + 0.0490823462252112*G0_0_1_8_8 + 0.0066790352504648*G0_0_1_8_9 + 0.00461253032681682*G0_0_1_9_0 - 0.00666761809619062*G0_0_1_9_1 - 0.0115084915084935*G0_0_1_9_2 + 0.0667903525046495*G0_0_1_9_3 - 0.0848751248751389*G0_0_1_9_4 - 0.00226059654631117*G0_0_1_9_5 + 0.0381218781218847*G0_0_1_9_6 - 0.0182902811474271*G0_0_1_9_7 + 0.0066790352504648*G0_0_1_9_8 + 0.231813900385368*G0_0_1_9_9 - 0.000779749351178035*G0_1_0_0_0 + 0.000544006258292068*G0_1_0_0_1 - 0.00208236208236242*G0_1_0_0_2 - 0.0100585129156575*G0_1_0_0_3 + 0.0176395033537921*G0_1_0_0_4 + 0.00152419009561894*G0_1_0_0_5 - 0.00205508776937382*G0_1_0_0_6 + 0.00207601921887674*G0_1_0_0_7 - 0.00327291755863243*G0_1_0_0_8 - 0.00461253032681682*G0_1_0_0_9 + 0.000544006258292068*G0_1_0_1_0 - 0.0145632145632171*G0_1_0_1_1 - 0.000473600473600536*G0_1_0_1_2 + 0.00375624375624433*G0_1_0_1_3 + 0.0235992578849763*G0_1_0_1_4 - 0.00419009561866776*G0_1_0_1_5 - 0.00285999714571193*G0_1_0_1_6 + 0.00122163550735002*G0_1_0_1_7 - 0.00839160839160987*G0_1_0_1_8 + 0.00666761809619062*G0_1_0_1_9 - 0.00208236208236242*G0_1_0_2_0 - 0.000473600473600536*G0_1_0_2_1 - 0.0379472379472441*G0_1_0_2_2 + 0.00237096237096267*G0_1_0_2_3 + 0.018514818514822*G0_1_0_2_4 + 0.0114285714285733*G0_1_0_2_5 - 0.0267732267732311*G0_1_0_2_6 - 0.00151848151848177*G0_1_0_2_7 + 0.0115084915084935*G0_1_0_2_9 - 0.0100585129156575*G0_1_0_3_0 + 0.00375624375624433*G0_1_0_3_1 + 0.00237096237096267*G0_1_0_3_2 - 0.0723390894819591*G0_1_0_3_3 - 0.129470529470552*G0_1_0_3_4 + 0.0247638076209547*G0_1_0_3_5 + 0.00179820179820206*G0_1_0_3_6 + 0.0233937491080388*G0_1_0_3_7 - 0.0167318395889852*G0_1_0_3_8 - 0.0667903525046495*G0_1_0_3_9 + 0.0176395033537921*G0_1_0_4_0 + 0.0235992578849763*G0_1_0_4_1 + 0.018514818514822*G0_1_0_4_2 - 0.129470529470552*G0_1_0_4_3 + 0.670369630369744*G0_1_0_4_4 - 0.0597002997003098*G0_1_0_4_5 + 0.0579020979021078*G0_1_0_4_6 - 0.0207906379334986*G0_1_0_4_7 - 0.00666190951905355*G0_1_0_4_8 + 0.0848751248751389*G0_1_0_4_9 + 0.00152419009561894*G0_1_0_5_0 - 0.00419009561866776*G0_1_0_5_1 + 0.0114285714285733*G0_1_0_5_2 + 0.0247638076209547*G0_1_0_5_3 - 0.0597002997003098*G0_1_0_5_4 - 0.00952190666476553*G0_1_0_5_5 + 0.0135464535464556*G0_1_0_5_6 - 0.00356215213358127*G0_1_0_5_7 + 0.00578849721706964*G0_1_0_5_8 + 0.00226059654631117*G0_1_0_5_9 - 0.00205508776937382*G0_1_0_6_0 - 0.00285999714571193*G0_1_0_6_1 - 0.0267732267732311*G0_1_0_6_2 + 0.00179820179820205*G0_1_0_6_3 + 0.0579020979021078*G0_1_0_6_4 + 0.0135464535464557*G0_1_0_6_5 - 0.107652347652366*G0_1_0_6_6 - 0.00222634508348838*G0_1_0_6_7 + 0.00774083059797476*G0_1_0_6_8 - 0.0381218781218847*G0_1_0_6_9 + 0.00207601921887674*G0_1_0_7_0 + 0.00122163550735002*G0_1_0_7_1 - 0.00151848151848177*G0_1_0_7_2 + 0.0233937491080388*G0_1_0_7_3 - 0.0207906379334986*G0_1_0_7_4 - 0.00356215213358127*G0_1_0_7_5 - 0.00222634508348838*G0_1_0_7_6 - 0.0173312401883855*G0_1_0_7_7 + 0.0111831026116759*G0_1_0_7_8 + 0.0182902811474271*G0_1_0_7_9 - 0.00327291755863243*G0_1_0_8_0 - 0.00839160839160987*G0_1_0_8_1 - 0.0167318395889852*G0_1_0_8_3 - 0.00666190951905355*G0_1_0_8_4 + 0.00578849721706964*G0_1_0_8_5 + 0.00774083059797475*G0_1_0_8_6 + 0.0111831026116759*G0_1_0_8_7 - 0.0490823462252112*G0_1_0_8_8 - 0.0066790352504648*G0_1_0_8_9 - 0.00461253032681682*G0_1_0_9_0 + 0.00666761809619062*G0_1_0_9_1 + 0.0115084915084935*G0_1_0_9_2 - 0.0667903525046495*G0_1_0_9_3 + 0.0848751248751389*G0_1_0_9_4 + 0.00226059654631117*G0_1_0_9_5 - 0.0381218781218847*G0_1_0_9_6 + 0.0182902811474271*G0_1_0_9_7 - 0.0066790352504648*G0_1_0_9_8 - 0.231813900385368*G0_1_0_9_9; + A[199] = A[74] + 0.00684521827379089*G0_0_0_0_0 + 0.00333296333296392*G0_0_0_0_1 + 0.0106407877836467*G0_0_0_0_2 - 0.00278578564292897*G0_0_0_0_3 + 0.0442985585842805*G0_0_0_0_4 - 0.0295323723895203*G0_0_0_0_5 + 0.0416878359735575*G0_0_0_0_6 - 0.00778649921507196*G0_0_0_0_7 + 0.00390466676181027*G0_0_0_0_8 + 0.0403710575139216*G0_0_0_0_9 + 0.00333296333296392*G0_0_0_1_0 + 0.0236800236800277*G0_0_0_1_1 + 0.00694754980469386*G0_0_0_1_2 + 0.0244403215831829*G0_0_0_1_3 + 0.00948384948385122*G0_0_0_1_4 - 0.0065762808619963*G0_0_0_1_5 + 0.0288854003139767*G0_0_0_1_6 - 0.00834213405642118*G0_0_0_1_7 + 0.013122115979261*G0_0_0_1_8 + 0.0212359069501963*G0_0_0_1_9 + 0.0106407877836467*G0_0_0_2_0 + 0.00694754980469386*G0_0_0_2_1 + 0.0672512672512784*G0_0_0_2_2 - 0.00927072927073084*G0_0_0_2_3 + 0.0148651348651376*G0_0_0_2_4 - 0.054771894771904*G0_0_0_2_5 + 0.127925407925429*G0_0_0_2_6 - 0.00123305266162429*G0_0_0_2_7 + 0.00235193378050562*G0_0_0_2_8 - 0.0169430569430598*G0_0_0_2_9 - 0.00278578564292897*G0_0_0_3_0 + 0.0244403215831829*G0_0_0_3_1 - 0.00927072927073085*G0_0_0_3_2 + 0.0709690309690438*G0_0_0_3_3 - 0.144198658484397*G0_0_0_3_4 + 0.0252090766376523*G0_0_0_3_5 - 0.108988154702459*G0_0_0_3_6 - 0.0139745968317421*G0_0_0_3_7 + 0.0433623519337879*G0_0_0_3_8 - 0.0357585271871044*G0_0_0_3_9 + 0.0442985585842805*G0_0_0_4_0 + 0.00948384948385122*G0_0_0_4_1 + 0.0148651348651376*G0_0_0_4_2 - 0.144198658484397*G0_0_0_4_3 + 0.916843156843313*G0_0_0_4_4 - 0.15522762951337*G0_0_0_4_5 + 0.264215784215829*G0_0_0_4_6 - 0.0534322820037196*G0_0_0_4_7 - 0.0293877551020458*G0_0_0_4_8 + 0.361284429855919*G0_0_0_4_9 - 0.0295323723895203*G0_0_0_5_0 - 0.0065762808619963*G0_0_0_5_1 - 0.054771894771904*G0_0_0_5_2 + 0.0252090766376523*G0_0_0_5_3 - 0.15522762951337*G0_0_0_5_4 + 0.153994576851746*G0_0_0_5_5 - 0.164133009847323*G0_0_0_5_6 + 0.0212359069501962*G0_0_0_5_7 - 0.00260311117454019*G0_0_0_5_8 - 0.115906950192684*G0_0_0_5_9 + 0.0416878359735575*G0_0_0_6_0 + 0.0288854003139767*G0_0_0_6_1 + 0.127925407925429*G0_0_0_6_2 - 0.108988154702459*G0_0_0_6_3 + 0.264215784215829*G0_0_0_6_4 - 0.164133009847323*G0_0_0_6_5 + 0.971508491508656*G0_0_0_6_6 - 0.018632795775656*G0_0_0_6_7 - 0.0356900242614587*G0_0_0_6_8 + 0.268805480234097*G0_0_0_6_9 - 0.00778649921507196*G0_0_0_7_0 - 0.00834213405642118*G0_0_0_7_1 - 0.00123305266162429*G0_0_0_7_2 - 0.0139745968317421*G0_0_0_7_3 - 0.0534322820037196*G0_0_0_7_4 + 0.0212359069501962*G0_0_0_7_5 - 0.018632795775656*G0_0_0_7_6 + 0.0073983159697459*G0_0_0_7_7 - 0.0187012987013019*G0_0_0_7_8 - 0.0838475809904522*G0_0_0_7_9 + 0.00390466676181027*G0_0_0_8_0 + 0.013122115979261*G0_0_0_8_1 + 0.00235193378050562*G0_0_0_8_2 + 0.0433623519337879*G0_0_0_8_3 - 0.0293877551020458*G0_0_0_8_4 - 0.00260311117454019*G0_0_0_8_5 - 0.0356900242614587*G0_0_0_8_6 - 0.0187012987013019*G0_0_0_8_7 + 0.0341144569716055*G0_0_0_8_8 - 0.00493221064649719*G0_0_0_8_9 + 0.0403710575139216*G0_0_0_9_0 + 0.0212359069501963*G0_0_0_9_1 - 0.0169430569430598*G0_0_0_9_2 - 0.0357585271871044*G0_0_0_9_3 + 0.361284429855919*G0_0_0_9_4 - 0.115906950192684*G0_0_0_9_5 + 0.268805480234097*G0_0_0_9_6 - 0.0838475809904522*G0_0_0_9_7 - 0.00493221064649718*G0_0_0_9_8 + 0.488288854003222*G0_0_0_9_9 + 0.00343043200186119*G0_0_1_0_1 - 0.00343043200186113*G0_0_1_0_2 - 0.0268417296988772*G0_0_1_0_3 + 0.0268417296988772*G0_0_1_0_4 - 0.00199990485704806*G0_0_1_0_5 + 0.00161362447076762*G0_0_1_0_6 + 0.00199990485704807*G0_0_1_0_7 - 0.0016136244707676*G0_0_1_0_8 + 0.00343043200186119*G0_0_1_1_0 + 0.0462766862766944*G0_0_1_1_1 + 0.0108957708957727*G0_0_1_1_3 + 0.0079729794015523*G0_0_1_1_4 - 0.00208933923219676*G0_0_1_1_5 + 0.000245468816897468*G0_0_1_1_6 - 0.0133923219637529*G0_0_1_1_7 + 0.0278921078921128*G0_0_1_1_8 + 0.00488654202940003*G0_0_1_1_9 - 0.00343043200186113*G0_0_1_2_0 - 0.0462766862766938*G0_0_1_2_2 - 0.00797297940155228*G0_0_1_2_3 - 0.0108957708957723*G0_0_1_2_4 + 0.0133923219637527*G0_0_1_2_5 - 0.0278921078921124*G0_0_1_2_6 + 0.00208933923219671*G0_0_1_2_7 - 0.000245468816897409*G0_0_1_2_8 - 0.00488654202939992*G0_0_1_2_9 - 0.0268417296988772*G0_0_1_3_0 + 0.0108957708957727*G0_0_1_3_1 - 0.00797297940155229*G0_0_1_3_2 - 0.728528614243024*G0_0_1_3_3 + 0.0433966033966106*G0_0_1_3_5 - 0.000736406450692434*G0_0_1_3_6 + 0.0805251890966312*G0_0_1_3_7 - 0.0812615955473234*G0_0_1_3_8 - 0.175710004281463*G0_0_1_3_9 + 0.0268417296988772*G0_0_1_4_0 + 0.0079729794015523*G0_0_1_4_1 - 0.0108957708957723*G0_0_1_4_2 + 0.728528614243024*G0_0_1_4_4 - 0.0805251890966314*G0_0_1_4_5 + 0.0812615955473239*G0_0_1_4_6 - 0.0433966033966107*G0_0_1_4_7 + 0.000736406450692121*G0_0_1_4_8 + 0.175710004281462*G0_0_1_4_9 - 0.00199990485704806*G0_0_1_5_0 - 0.00208933923219676*G0_0_1_5_1 + 0.0133923219637527*G0_0_1_5_2 + 0.0433966033966106*G0_0_1_5_3 - 0.0805251890966314*G0_0_1_5_4 + 0.0193863279577602*G0_0_1_5_5 + 0.00258598544312863*G0_0_1_5_6 + 0.00626801769659013*G0_0_1_5_8 - 0.0125360353931804*G0_0_1_5_9 + 0.00161362447076762*G0_0_1_6_0 + 0.000245468816897468*G0_0_1_6_1 - 0.0278921078921124*G0_0_1_6_2 - 0.000736406450692434*G0_0_1_6_3 + 0.0812615955473239*G0_0_1_6_4 + 0.00258598544312864*G0_0_1_6_5 + 0.006131011845299*G0_0_1_6_6 - 0.00626801769659024*G0_0_1_6_7 + 0.0161324389895847*G0_0_1_6_9 + 0.00199990485704807*G0_0_1_7_0 - 0.0133923219637529*G0_0_1_7_1 + 0.00208933923219671*G0_0_1_7_2 + 0.0805251890966312*G0_0_1_7_3 - 0.0433966033966107*G0_0_1_7_4 - 0.00626801769659024*G0_0_1_7_6 - 0.0193863279577592*G0_0_1_7_7 - 0.00258598544312888*G0_0_1_7_8 + 0.0125360353931803*G0_0_1_7_9 - 0.0016136244707676*G0_0_1_8_0 + 0.0278921078921128*G0_0_1_8_1 - 0.000245468816897409*G0_0_1_8_2 - 0.0812615955473234*G0_0_1_8_3 + 0.00073640645069212*G0_0_1_8_4 + 0.00626801769659013*G0_0_1_8_5 - 0.00258598544312888*G0_0_1_8_7 - 0.00613101184529789*G0_0_1_8_8 - 0.0161324389895844*G0_0_1_8_9 + 0.00488654202940003*G0_0_1_9_1 - 0.00488654202939992*G0_0_1_9_2 - 0.175710004281463*G0_0_1_9_3 + 0.175710004281462*G0_0_1_9_4 - 0.0125360353931804*G0_0_1_9_5 + 0.0161324389895847*G0_0_1_9_6 + 0.0125360353931803*G0_0_1_9_7 - 0.0161324389895844*G0_0_1_9_8 + 0.000804063661206678*G0_1_0_0_1 - 0.000804063661206634*G0_1_0_0_2 + 0.000856286570572474*G0_1_0_0_3 - 0.000856286570572419*G0_1_0_0_4 - 0.0014480757337903*G0_1_0_0_5 + 0.000395794681509071*G0_1_0_0_6 + 0.00144807573379022*G0_1_0_0_7 - 0.000395794681508993*G0_1_0_0_8 + 0.000804063661206678*G0_1_0_1_0 + 0.022892662892667*G0_1_0_1_1 + 0.0256543456543501*G0_1_0_1_3 - 0.0132553161124612*G0_1_0_1_4 + 0.000582274867989247*G0_1_0_1_5 + 0.00306550592264934*G0_1_0_1_6 - 0.00318538604252954*G0_1_0_1_7 + 0.00951048951049132*G0_1_0_1_8 + 0.00972741544170285*G0_1_0_1_9 - 0.000804063661206634*G0_1_0_2_0 - 0.0228926628926664*G0_1_0_2_2 + 0.0132553161124611*G0_1_0_2_3 - 0.0256543456543498*G0_1_0_2_4 + 0.00318538604252932*G0_1_0_2_5 - 0.0095104895104909*G0_1_0_2_6 - 0.000582274867989266*G0_1_0_2_7 - 0.00306550592264927*G0_1_0_2_8 - 0.00972741544170276*G0_1_0_2_9 + 0.000856286570572474*G0_1_0_3_0 + 0.0256543456543501*G0_1_0_3_1 + 0.0132553161124611*G0_1_0_3_2 + 0.0141801056086807*G0_1_0_3_3 - 0.00215784215784257*G0_1_0_3_5 - 0.00919651776794803*G0_1_0_3_6 - 0.00256885971171747*G0_1_0_3_7 - 0.00662765805623029*G0_1_0_3_8 - 0.0240445269016736*G0_1_0_3_9 - 0.000856286570572419*G0_1_0_4_0 - 0.0132553161124612*G0_1_0_4_1 - 0.0256543456543498*G0_1_0_4_2 - 0.0141801056086786*G0_1_0_4_4 + 0.00256885971171721*G0_1_0_4_5 + 0.00662765805623082*G0_1_0_4_6 + 0.00215784215784254*G0_1_0_4_7 + 0.00919651776794775*G0_1_0_4_8 + 0.0240445269016739*G0_1_0_4_9 - 0.0014480757337903*G0_1_0_5_0 + 0.000582274867989247*G0_1_0_5_1 + 0.00318538604252932*G0_1_0_5_2 - 0.00215784215784256*G0_1_0_5_3 + 0.00256885971171721*G0_1_0_5_4 + 0.0115769944341395*G0_1_0_5_5 + 0.000222634508348743*G0_1_0_5_6 - 0.00174682460396778*G0_1_0_5_8 + 0.00349364920793553*G0_1_0_5_9 + 0.000395794681509072*G0_1_0_6_0 + 0.00306550592264934*G0_1_0_6_1 - 0.0095104895104909*G0_1_0_6_2 - 0.00919651776794802*G0_1_0_6_3 + 0.00662765805623082*G0_1_0_6_4 + 0.000222634508348746*G0_1_0_6_5 + 0.0647010132724538*G0_1_0_6_6 + 0.00174682460396776*G0_1_0_6_7 + 0.0475752818610043*G0_1_0_6_9 + 0.00144807573379022*G0_1_0_7_0 - 0.00318538604252954*G0_1_0_7_1 - 0.000582274867989268*G0_1_0_7_2 - 0.00256885971171747*G0_1_0_7_3 + 0.00215784215784253*G0_1_0_7_4 + 0.00174682460396776*G0_1_0_7_6 - 0.011576994434139*G0_1_0_7_7 - 0.000222634508348989*G0_1_0_7_8 - 0.00349364920793555*G0_1_0_7_9 - 0.000395794681508993*G0_1_0_8_0 + 0.00951048951049132*G0_1_0_8_1 - 0.00306550592264927*G0_1_0_8_2 - 0.00662765805623029*G0_1_0_8_3 + 0.00919651776794776*G0_1_0_8_4 - 0.00174682460396778*G0_1_0_8_5 - 0.000222634508348986*G0_1_0_8_7 - 0.0647010132724519*G0_1_0_8_8 - 0.047575281861004*G0_1_0_8_9 + 0.00972741544170285*G0_1_0_9_1 - 0.00972741544170276*G0_1_0_9_2 - 0.0240445269016736*G0_1_0_9_3 + 0.0240445269016739*G0_1_0_9_4 + 0.00349364920793553*G0_1_0_9_5 + 0.0475752818610043*G0_1_0_9_6 - 0.00349364920793555*G0_1_0_9_7 - 0.047575281861004*G0_1_0_9_8 - 0.00684521827379086*G0_1_1_0_0 - 0.0106407877836468*G0_1_1_0_1 - 0.00333296333296389*G0_1_1_0_2 - 0.0442985585842805*G0_1_1_0_3 + 0.00278578564292899*G0_1_1_0_4 + 0.00778649921507197*G0_1_1_0_5 - 0.00390466676181028*G0_1_1_0_6 + 0.0295323723895203*G0_1_1_0_7 - 0.0416878359735574*G0_1_1_0_8 - 0.0403710575139216*G0_1_1_0_9 - 0.0106407877836468*G0_1_1_1_0 - 0.0672512672512787*G0_1_1_1_1 - 0.00694754980469381*G0_1_1_1_2 - 0.0148651348651374*G0_1_1_1_3 + 0.00927072927073088*G0_1_1_1_4 + 0.00123305266162435*G0_1_1_1_5 - 0.00235193378050563*G0_1_1_1_6 + 0.0547718947719041*G0_1_1_1_7 - 0.12792540792543*G0_1_1_1_8 + 0.0169430569430598*G0_1_1_1_9 - 0.00333296333296389*G0_1_1_2_0 - 0.00694754980469381*G0_1_1_2_1 - 0.0236800236800275*G0_1_1_2_2 - 0.0094838494838511*G0_1_1_2_3 - 0.0244403215831827*G0_1_1_2_4 + 0.00834213405642113*G0_1_1_2_5 - 0.013122115979261*G0_1_1_2_6 + 0.00657628086199624*G0_1_1_2_7 - 0.0288854003139765*G0_1_1_2_8 - 0.0212359069501961*G0_1_1_2_9 - 0.0442985585842805*G0_1_1_3_0 - 0.0148651348651374*G0_1_1_3_1 - 0.0094838494838511*G0_1_1_3_2 - 0.916843156843313*G0_1_1_3_3 + 0.144198658484397*G0_1_1_3_4 + 0.0534322820037195*G0_1_1_3_5 + 0.0293877551020456*G0_1_1_3_6 + 0.15522762951337*G0_1_1_3_7 - 0.264215784215829*G0_1_1_3_8 - 0.36128442985592*G0_1_1_3_9 + 0.00278578564292899*G0_1_1_4_0 + 0.00927072927073088*G0_1_1_4_1 - 0.0244403215831826*G0_1_1_4_2 + 0.144198658484397*G0_1_1_4_3 - 0.0709690309690418*G0_1_1_4_4 + 0.013974596831742*G0_1_1_4_5 - 0.0433623519337876*G0_1_1_4_6 - 0.0252090766376523*G0_1_1_4_7 + 0.108988154702459*G0_1_1_4_8 + 0.0357585271871046*G0_1_1_4_9 + 0.00778649921507197*G0_1_1_5_0 + 0.00123305266162435*G0_1_1_5_1 + 0.00834213405642113*G0_1_1_5_2 + 0.0534322820037195*G0_1_1_5_3 + 0.013974596831742*G0_1_1_5_4 - 0.00739831596974562*G0_1_1_5_5 + 0.0187012987013018*G0_1_1_5_6 - 0.0212359069501962*G0_1_1_5_7 + 0.0186327957756561*G0_1_1_5_8 + 0.0838475809904524*G0_1_1_5_9 - 0.00390466676181028*G0_1_1_6_0 - 0.00235193378050563*G0_1_1_6_1 - 0.013122115979261*G0_1_1_6_2 + 0.0293877551020456*G0_1_1_6_3 - 0.0433623519337876*G0_1_1_6_4 + 0.0187012987013018*G0_1_1_6_5 - 0.0341144569716054*G0_1_1_6_6 + 0.00260311117454016*G0_1_1_6_7 + 0.0356900242614586*G0_1_1_6_8 + 0.00493221064649717*G0_1_1_6_9 + 0.0295323723895203*G0_1_1_7_0 + 0.0547718947719041*G0_1_1_7_1 + 0.00657628086199624*G0_1_1_7_2 + 0.15522762951337*G0_1_1_7_3 - 0.0252090766376523*G0_1_1_7_4 - 0.0212359069501962*G0_1_1_7_5 + 0.00260311117454016*G0_1_1_7_6 - 0.153994576851745*G0_1_1_7_7 + 0.164133009847323*G0_1_1_7_8 + 0.115906950192684*G0_1_1_7_9 - 0.0416878359735574*G0_1_1_8_0 - 0.12792540792543*G0_1_1_8_1 - 0.0288854003139765*G0_1_1_8_2 - 0.264215784215829*G0_1_1_8_3 + 0.108988154702459*G0_1_1_8_4 + 0.0186327957756561*G0_1_1_8_5 + 0.0356900242614586*G0_1_1_8_6 + 0.164133009847323*G0_1_1_8_7 - 0.971508491508656*G0_1_1_8_8 - 0.268805480234097*G0_1_1_8_9 - 0.0403710575139215*G0_1_1_9_0 + 0.0169430569430598*G0_1_1_9_1 - 0.0212359069501961*G0_1_1_9_2 - 0.36128442985592*G0_1_1_9_3 + 0.0357585271871046*G0_1_1_9_4 + 0.0838475809904524*G0_1_1_9_5 + 0.00493221064649716*G0_1_1_9_6 + 0.115906950192684*G0_1_1_9_7 - 0.268805480234097*G0_1_1_9_8 - 0.488288854003222*G0_1_1_9_9; + A[73] = A[199] - 0.000779749351178064*G0_0_1_0_0 - 0.00208236208236244*G0_0_1_0_1 + 0.000544006258292083*G0_0_1_0_2 + 0.0176395033537921*G0_0_1_0_3 - 0.0100585129156575*G0_0_1_0_4 + 0.0020760192188767*G0_0_1_0_5 - 0.00327291755863237*G0_0_1_0_6 + 0.00152419009561888*G0_0_1_0_7 - 0.00205508776937382*G0_0_1_0_8 - 0.00461253032681684*G0_0_1_0_9 - 0.00208236208236244*G0_0_1_1_0 - 0.0379472379472445*G0_0_1_1_1 - 0.000473600473600543*G0_0_1_1_2 + 0.0185148185148217*G0_0_1_1_3 + 0.00237096237096275*G0_0_1_1_4 - 0.00151848151848176*G0_0_1_1_5 + 0.0114285714285734*G0_0_1_1_7 - 0.0267732267732313*G0_0_1_1_8 + 0.0115084915084934*G0_0_1_1_9 + 0.000544006258292082*G0_0_1_2_0 - 0.000473600473600543*G0_0_1_2_1 - 0.0145632145632167*G0_0_1_2_2 + 0.0235992578849761*G0_0_1_2_3 + 0.00375624375624448*G0_0_1_2_4 + 0.00122163550734991*G0_0_1_2_5 - 0.00839160839160957*G0_0_1_2_6 - 0.00419009561866775*G0_0_1_2_7 - 0.0028599971457119*G0_0_1_2_8 + 0.00666761809619068*G0_0_1_2_9 + 0.0176395033537921*G0_0_1_3_0 + 0.0185148185148217*G0_0_1_3_1 + 0.0235992578849761*G0_0_1_3_2 + 0.670369630369745*G0_0_1_3_3 - 0.129470529470551*G0_0_1_3_4 - 0.0207906379334985*G0_0_1_3_5 - 0.00666190951905354*G0_0_1_3_6 - 0.0597002997003099*G0_0_1_3_7 + 0.0579020979021079*G0_0_1_3_8 + 0.0848751248751396*G0_0_1_3_9 - 0.0100585129156575*G0_0_1_4_0 + 0.00237096237096275*G0_0_1_4_1 + 0.00375624375624448*G0_0_1_4_2 - 0.129470529470551*G0_0_1_4_3 - 0.0723390894819593*G0_0_1_4_4 + 0.0233937491080388*G0_0_1_4_5 - 0.0167318395889853*G0_0_1_4_6 + 0.0247638076209547*G0_0_1_4_7 + 0.00179820179820209*G0_0_1_4_8 - 0.0667903525046496*G0_0_1_4_9 + 0.0020760192188767*G0_0_1_5_0 - 0.00151848151848176*G0_0_1_5_1 + 0.00122163550734991*G0_0_1_5_2 - 0.0207906379334985*G0_0_1_5_3 + 0.0233937491080388*G0_0_1_5_4 - 0.0173312401883862*G0_0_1_5_5 + 0.0111831026116758*G0_0_1_5_6 - 0.00356215213358133*G0_0_1_5_7 - 0.00222634508348827*G0_0_1_5_8 + 0.0182902811474271*G0_0_1_5_9 - 0.00327291755863237*G0_0_1_6_0 - 0.00839160839160957*G0_0_1_6_2 - 0.00666190951905354*G0_0_1_6_3 - 0.0167318395889853*G0_0_1_6_4 + 0.0111831026116758*G0_0_1_6_5 - 0.0490823462252113*G0_0_1_6_6 + 0.00578849721706962*G0_0_1_6_7 + 0.00774083059797471*G0_0_1_6_8 - 0.006679035250465*G0_0_1_6_9 + 0.00152419009561888*G0_0_1_7_0 + 0.0114285714285734*G0_0_1_7_1 - 0.00419009561866775*G0_0_1_7_2 - 0.0597002997003099*G0_0_1_7_3 + 0.0247638076209547*G0_0_1_7_4 - 0.00356215213358133*G0_0_1_7_5 + 0.00578849721706962*G0_0_1_7_6 - 0.00952190666476531*G0_0_1_7_7 + 0.0135464535464558*G0_0_1_7_8 + 0.00226059654631125*G0_0_1_7_9 - 0.00205508776937382*G0_0_1_8_0 - 0.0267732267732313*G0_0_1_8_1 - 0.0028599971457119*G0_0_1_8_2 + 0.0579020979021079*G0_0_1_8_3 + 0.00179820179820209*G0_0_1_8_4 - 0.00222634508348827*G0_0_1_8_5 + 0.00774083059797471*G0_0_1_8_6 + 0.0135464535464558*G0_0_1_8_7 - 0.107652347652365*G0_0_1_8_8 - 0.0381218781218844*G0_0_1_8_9 - 0.00461253032681685*G0_0_1_9_0 + 0.0115084915084934*G0_0_1_9_1 + 0.00666761809619068*G0_0_1_9_2 + 0.0848751248751396*G0_0_1_9_3 - 0.0667903525046496*G0_0_1_9_4 + 0.0182902811474271*G0_0_1_9_5 - 0.00667903525046501*G0_0_1_9_6 + 0.00226059654631126*G0_0_1_9_7 - 0.0381218781218844*G0_0_1_9_8 - 0.231813900385368*G0_0_1_9_9 + 0.000779749351178064*G0_1_0_0_0 + 0.00208236208236244*G0_1_0_0_1 - 0.000544006258292082*G0_1_0_0_2 - 0.0176395033537921*G0_1_0_0_3 + 0.0100585129156575*G0_1_0_0_4 - 0.0020760192188767*G0_1_0_0_5 + 0.00327291755863237*G0_1_0_0_6 - 0.00152419009561888*G0_1_0_0_7 + 0.00205508776937382*G0_1_0_0_8 + 0.00461253032681685*G0_1_0_0_9 + 0.00208236208236244*G0_1_0_1_0 + 0.0379472379472445*G0_1_0_1_1 + 0.000473600473600542*G0_1_0_1_2 - 0.0185148185148217*G0_1_0_1_3 - 0.00237096237096275*G0_1_0_1_4 + 0.00151848151848176*G0_1_0_1_5 - 0.0114285714285734*G0_1_0_1_7 + 0.0267732267732313*G0_1_0_1_8 - 0.0115084915084934*G0_1_0_1_9 - 0.000544006258292082*G0_1_0_2_0 + 0.000473600473600542*G0_1_0_2_1 + 0.0145632145632167*G0_1_0_2_2 - 0.0235992578849761*G0_1_0_2_3 - 0.00375624375624448*G0_1_0_2_4 - 0.00122163550734991*G0_1_0_2_5 + 0.00839160839160957*G0_1_0_2_6 + 0.00419009561866775*G0_1_0_2_7 + 0.0028599971457119*G0_1_0_2_8 - 0.00666761809619068*G0_1_0_2_9 - 0.0176395033537921*G0_1_0_3_0 - 0.0185148185148217*G0_1_0_3_1 - 0.0235992578849761*G0_1_0_3_2 - 0.670369630369746*G0_1_0_3_3 + 0.129470529470551*G0_1_0_3_4 + 0.0207906379334985*G0_1_0_3_5 + 0.00666190951905354*G0_1_0_3_6 + 0.0597002997003099*G0_1_0_3_7 - 0.0579020979021079*G0_1_0_3_8 - 0.0848751248751396*G0_1_0_3_9 + 0.0100585129156575*G0_1_0_4_0 - 0.00237096237096275*G0_1_0_4_1 - 0.00375624375624448*G0_1_0_4_2 + 0.129470529470551*G0_1_0_4_3 + 0.0723390894819592*G0_1_0_4_4 - 0.0233937491080388*G0_1_0_4_5 + 0.0167318395889853*G0_1_0_4_6 - 0.0247638076209547*G0_1_0_4_7 - 0.00179820179820208*G0_1_0_4_8 + 0.0667903525046496*G0_1_0_4_9 - 0.0020760192188767*G0_1_0_5_0 + 0.00151848151848176*G0_1_0_5_1 - 0.00122163550734991*G0_1_0_5_2 + 0.0207906379334985*G0_1_0_5_3 - 0.0233937491080388*G0_1_0_5_4 + 0.0173312401883862*G0_1_0_5_5 - 0.0111831026116758*G0_1_0_5_6 + 0.00356215213358134*G0_1_0_5_7 + 0.00222634508348827*G0_1_0_5_8 - 0.0182902811474271*G0_1_0_5_9 + 0.00327291755863237*G0_1_0_6_0 + 0.00839160839160957*G0_1_0_6_2 + 0.00666190951905354*G0_1_0_6_3 + 0.0167318395889853*G0_1_0_6_4 - 0.0111831026116758*G0_1_0_6_5 + 0.0490823462252113*G0_1_0_6_6 - 0.00578849721706962*G0_1_0_6_7 - 0.00774083059797471*G0_1_0_6_8 + 0.006679035250465*G0_1_0_6_9 - 0.00152419009561888*G0_1_0_7_0 - 0.0114285714285734*G0_1_0_7_1 + 0.00419009561866775*G0_1_0_7_2 + 0.0597002997003099*G0_1_0_7_3 - 0.0247638076209547*G0_1_0_7_4 + 0.00356215213358133*G0_1_0_7_5 - 0.00578849721706962*G0_1_0_7_6 + 0.00952190666476531*G0_1_0_7_7 - 0.0135464535464558*G0_1_0_7_8 - 0.00226059654631126*G0_1_0_7_9 + 0.00205508776937382*G0_1_0_8_0 + 0.0267732267732313*G0_1_0_8_1 + 0.0028599971457119*G0_1_0_8_2 - 0.0579020979021079*G0_1_0_8_3 - 0.00179820179820209*G0_1_0_8_4 + 0.00222634508348827*G0_1_0_8_5 - 0.00774083059797471*G0_1_0_8_6 - 0.0135464535464559*G0_1_0_8_7 + 0.107652347652365*G0_1_0_8_8 + 0.0381218781218844*G0_1_0_8_9 + 0.00461253032681685*G0_1_0_9_0 - 0.0115084915084934*G0_1_0_9_1 - 0.00666761809619068*G0_1_0_9_2 - 0.0848751248751396*G0_1_0_9_3 + 0.0667903525046496*G0_1_0_9_4 - 0.0182902811474271*G0_1_0_9_5 + 0.006679035250465*G0_1_0_9_6 - 0.00226059654631126*G0_1_0_9_7 + 0.0381218781218844*G0_1_0_9_8 + 0.231813900385368*G0_1_0_9_9; + A[40] = 0.00967520134186969*G0_1_0_0_0 + 9.16279487708162e-05*G0_1_0_0_2 + 2.48560962846732e-05*G0_1_0_0_3 + 0.000185528756957356*G0_1_0_0_4 - 0.000383703597989366*G0_1_0_0_5 + 1.53616225044735e-05*G0_1_0_0_6 - 0.000928595214309641*G0_1_0_0_7 + 0.000606595785167316*G0_1_0_0_8 - 0.00160208838780293*G0_1_0_0_9 - 0.00967520134186976*G0_1_0_1_1 - 9.16279487708296e-05*G0_1_0_1_2 + 0.000383703597989349*G0_1_0_1_3 - 1.53616225044753e-05*G0_1_0_1_4 - 2.48560962846655e-05*G0_1_0_1_5 - 0.000185528756957364*G0_1_0_1_6 - 0.0006065957851673*G0_1_0_1_7 + 0.000928595214309622*G0_1_0_1_8 + 0.00160208838780294*G0_1_0_1_9 + 9.16279487708162e-05*G0_1_0_2_0 - 9.16279487708296e-05*G0_1_0_2_1 + 0.000616605616605747*G0_1_0_2_3 - 0.00104090354090377*G0_1_0_2_4 - 0.000616605616605694*G0_1_0_2_5 + 0.00104090354090366*G0_1_0_2_6 - 0.000284596356024975*G0_1_0_2_7 + 0.00028459635602498*G0_1_0_2_8 + 2.48560962846731e-05*G0_1_0_3_0 + 0.000383703597989349*G0_1_0_3_1 + 0.000616605616605747*G0_1_0_3_2 + 0.00807371200228486*G0_1_0_3_3 - 0.00113350934779524*G0_1_0_3_4 + 0.000556586270872091*G0_1_0_3_6 - 7.4568288854016e-05*G0_1_0_3_7 + 0.00092835735692896*G0_1_0_3_8 - 0.00465712858570076*G0_1_0_3_9 + 0.000185528756957356*G0_1_0_4_0 - 1.53616225044752e-05*G0_1_0_4_1 - 0.00104090354090377*G0_1_0_4_2 - 0.00113350934779524*G0_1_0_4_3 - 0.00304195804195859*G0_1_0_4_4 - 0.000556586270872065*G0_1_0_4_5 + 0.000148601398601427*G0_1_0_4_7 - 0.000853789068074939*G0_1_0_4_8 + 0.00111317254174414*G0_1_0_4_9 - 0.000383703597989366*G0_1_0_5_0 - 2.48560962846655e-05*G0_1_0_5_1 - 0.000616605616605695*G0_1_0_5_2 - 0.000556586270872065*G0_1_0_5_4 - 0.00807371200228476*G0_1_0_5_5 + 0.00113350934779527*G0_1_0_5_6 - 0.000928357356928937*G0_1_0_5_7 + 7.45682888540069e-05*G0_1_0_5_8 + 0.00465712858570078*G0_1_0_5_9 + 1.53616225044736e-05*G0_1_0_6_0 - 0.000185528756957363*G0_1_0_6_1 + 0.00104090354090366*G0_1_0_6_2 + 0.000556586270872091*G0_1_0_6_3 + 0.00113350934779528*G0_1_0_6_5 + 0.0030419580419585*G0_1_0_6_6 + 0.000853789068074925*G0_1_0_6_7 - 0.000148601398601422*G0_1_0_6_8 - 0.00111317254174417*G0_1_0_6_9 - 0.000928595214309641*G0_1_0_7_0 - 0.000606595785167299*G0_1_0_7_1 - 0.000284596356024975*G0_1_0_7_2 - 7.45682888540158e-05*G0_1_0_7_3 + 0.000148601398601427*G0_1_0_7_4 - 0.000928357356928937*G0_1_0_7_5 + 0.000853789068074926*G0_1_0_7_6 - 0.0354342086485003*G0_1_0_7_7 + 0.00309868702725893*G0_1_0_7_9 + 0.000606595785167316*G0_1_0_8_0 + 0.000928595214309622*G0_1_0_8_1 + 0.00028459635602498*G0_1_0_8_2 + 0.00092835735692896*G0_1_0_8_3 - 0.000853789068074939*G0_1_0_8_4 + 7.45682888540072e-05*G0_1_0_8_5 - 0.000148601398601422*G0_1_0_8_6 + 0.0354342086485005*G0_1_0_8_8 - 0.00309868702725891*G0_1_0_8_9 - 0.00160208838780293*G0_1_0_9_0 + 0.00160208838780294*G0_1_0_9_1 - 0.00465712858570075*G0_1_0_9_3 + 0.00111317254174414*G0_1_0_9_4 + 0.00465712858570078*G0_1_0_9_5 - 0.00111317254174417*G0_1_0_9_6 + 0.00309868702725893*G0_1_0_9_7 - 0.00309868702725891*G0_1_0_9_8 - 0.00165920499253859*G0_1_1_0_0 - 0.00026510746748847*G0_1_1_0_1 - 0.000148328303090231*G0_1_1_0_2 + 0.00017044463473038*G0_1_1_0_3 - 8.25166896595601e-05*G0_1_1_0_4 - 0.00026104847533423*G0_1_1_0_5 + 0.000297500118928743*G0_1_1_0_6 - 0.00331010259581743*G0_1_1_0_7 + 0.000302653695510891*G0_1_1_0_8 - 0.000490818705104501*G0_1_1_0_9 - 0.000265107467488469*G0_1_1_1_0 - 0.0113344063344084*G0_1_1_1_1 - 0.000239956251861057*G0_1_1_1_2 + 0.000122655122655107*G0_1_1_1_3 + 0.000282138496424275*G0_1_1_1_4 + 0.000145588538445709*G0_1_1_1_5 - 0.00026804544661692*G0_1_1_1_6 - 0.000303942089656405*G0_1_1_1_7 - 0.00238150738150783*G0_1_1_1_8 + 0.00111126968269843*G0_1_1_1_9 - 0.000148328303090231*G0_1_1_2_0 - 0.000239956251861057*G0_1_1_2_1 - 0.00168535168535197*G0_1_1_2_2 + 0.00118145743145763*G0_1_1_2_3 - 0.00142302142302166*G0_1_1_2_4 + 0.000564851814851904*G0_1_1_2_5 - 0.00038211788211793*G0_1_1_2_6 + 0.000406042370328154*G0_1_1_2_7 + 0.000690638726353131*G0_1_1_2_8 - 0.000800033300033426*G0_1_1_2_9 + 0.00017044463473038*G0_1_1_3_0 + 0.000122655122655106*G0_1_1_3_1 + 0.00118145743145763*G0_1_1_3_2 + 0.011689738832598*G0_1_1_3_3 - 0.00248233908948237*G0_1_1_3_4 - 0.000518945340373992*G0_1_1_3_5 + 0.0008939275010705*G0_1_1_3_6 - 0.000421542742971388*G0_1_1_3_7 + 0.00240366776081103*G0_1_1_3_8 - 0.00249072356215253*G0_1_1_3_9 - 8.25166896595601e-05*G0_1_1_4_0 + 0.000282138496424275*G0_1_1_4_1 - 0.00142302142302166*G0_1_1_4_2 - 0.00248233908948237*G0_1_1_4_3 - 0.00384865134865197*G0_1_1_4_4 + 0.00033734123019842*G0_1_1_4_5 - 0.00123126873126892*G0_1_1_4_6 - 0.000530184101612766*G0_1_1_4_7 - 0.00198212501783965*G0_1_1_4_8 + 0.00172541743970344*G0_1_1_4_9 - 0.00026104847533423*G0_1_1_5_0 + 0.000145588538445709*G0_1_1_5_1 + 0.000564851814851904*G0_1_1_5_2 - 0.000518945340373992*G0_1_1_5_3 + 0.00033734123019842*G0_1_1_5_4 + 0.00361602683031315*G0_1_1_5_5 - 0.00134882974168713*G0_1_1_5_6 + 0.00147531040388208*G0_1_1_5_7 - 0.000346974454117371*G0_1_1_5_8 + 0.00216640502354824*G0_1_1_5_9 + 0.000297500118928742*G0_1_1_6_0 - 0.00026804544661692*G0_1_1_6_1 - 0.00038211788211793*G0_1_1_6_2 + 0.0008939275010705*G0_1_1_6_3 - 0.00123126873126892*G0_1_1_6_4 - 0.00134882974168713*G0_1_1_6_5 - 0.000806693306693404*G0_1_1_6_6 - 0.00112833594976471*G0_1_1_6_7 - 0.000678785500214186*G0_1_1_6_8 + 0.000612244897959278*G0_1_1_6_9 - 0.00331010259581743*G0_1_1_7_0 - 0.000303942089656405*G0_1_1_7_1 + 0.000406042370328154*G0_1_1_7_2 - 0.000421542742971388*G0_1_1_7_3 - 0.000530184101612766*G0_1_1_7_4 + 0.00147531040388208*G0_1_1_7_5 - 0.00112833594976471*G0_1_1_7_6 + 0.0125492364778101*G0_1_1_7_7 + 0.00698604966462226*G0_1_1_7_8 + 0.00372912801484293*G0_1_1_7_9 + 0.000302653695510891*G0_1_1_8_0 - 0.00238150738150783*G0_1_1_8_1 + 0.000690638726353131*G0_1_1_8_2 + 0.00240366776081103*G0_1_1_8_3 - 0.00198212501783965*G0_1_1_8_4 - 0.000346974454117371*G0_1_1_8_5 - 0.000678785500214186*G0_1_1_8_6 + 0.00698604966462226*G0_1_1_8_7 + 0.0479834451263105*G0_1_1_8_8 + 0.000630440987584013*G0_1_1_8_9 - 0.000490818705104501*G0_1_1_9_0 + 0.00111126968269843*G0_1_1_9_1 - 0.000800033300033426*G0_1_1_9_2 - 0.00249072356215253*G0_1_1_9_3 + 0.00172541743970344*G0_1_1_9_4 + 0.00216640502354824*G0_1_1_9_5 + 0.000612244897959278*G0_1_1_9_6 + 0.00372912801484293*G0_1_1_9_7 + 0.000630440987584013*G0_1_1_9_8 - 0.0196132438989614*G0_1_1_9_9; + A[145] = A[159] + 0.000749867416533889*G0_0_1_0_0 + 0.00266005599338976*G0_0_1_0_1 - 0.000741974075307546*G0_0_1_0_2 - 0.000319680319680373*G0_0_1_0_3 + 0.00133200133200156*G0_0_1_0_4 - 0.00435120435120518*G0_0_1_0_5 + 0.0024420024420029*G0_0_1_0_6 + 0.0198912198912231*G0_0_1_0_7 - 0.0143412143412167*G0_0_1_0_8 - 0.0071928071928084*G0_0_1_0_9 + 0.00266005599338976*G0_0_1_1_0 - 0.00047360047360058*G0_0_1_1_1 + 0.000699335937431293*G0_0_1_1_2 - 0.00311688311688361*G0_0_1_1_3 + 0.000167451596023029*G0_0_1_1_4 + 0.00626611483754446*G0_0_1_1_5 - 0.00363446077731853*G0_0_1_1_6 + 0.0162047476333218*G0_0_1_1_7 - 0.0104162504162522*G0_0_1_1_8 + 0.00611198325484143*G0_0_1_1_9 - 0.000741974075307546*G0_0_1_2_0 + 0.000699335937431294*G0_0_1_2_1 + 0.00203309917595665*G0_0_1_2_2 - 0.000598132026703552*G0_0_1_2_3 - 0.00323739752311236*G0_0_1_2_4 + 0.00856349999207284*G0_0_1_2_5 - 0.00669362383648209*G0_0_1_2_6 + 0.0279244564958897*G0_0_1_2_7 - 0.00285999714571191*G0_0_1_2_8 + 0.0181494695780441*G0_0_1_2_9 - 0.000319680319680373*G0_0_1_3_0 - 0.00311688311688361*G0_0_1_3_1 - 0.000598132026703554*G0_0_1_3_2 - 0.00565149136577772*G0_0_1_3_3 + 0.000770657913515174*G0_0_1_3_4 - 0.00465249036677688*G0_0_1_3_5 + 0.00236905951191706*G0_0_1_3_6 - 0.00757528186099752*G0_0_1_3_7 + 0.0075296132439002*G0_0_1_3_8 - 0.00318538604252946*G0_0_1_3_9 + 0.00133200133200156*G0_0_1_4_0 + 0.000167451596023032*G0_0_1_4_1 - 0.00323739752311236*G0_0_1_4_2 + 0.000770657913515167*G0_0_1_4_3 + 0.00349364920793552*G0_0_1_4_4 - 0.0125303268160432*G0_0_1_4_5 + 0.0101612673041262*G0_0_1_4_6 - 0.0396175253318177*G0_0_1_4_7 - 0.0293877551020457*G0_0_1_4_9 - 0.00435120435120518*G0_0_1_5_0 + 0.00626611483754446*G0_0_1_5_1 + 0.00856349999207284*G0_0_1_5_2 - 0.00465249036677688*G0_0_1_5_3 - 0.0125303268160432*G0_0_1_5_4 + 0.0310089910089962*G0_0_1_5_5 - 0.0289310689310737*G0_0_1_5_6 + 0.11964035964038*G0_0_1_5_7 - 0.0273326673326719*G0_0_1_5_8 + 0.076243756243769*G0_0_1_5_9 + 0.00244200244200291*G0_0_1_6_0 - 0.00363446077731853*G0_0_1_6_1 - 0.00669362383648209*G0_0_1_6_2 + 0.00236905951191707*G0_0_1_6_3 + 0.0101612673041262*G0_0_1_6_4 - 0.0289310689310737*G0_0_1_6_5 + 0.0212815755672934*G0_0_1_6_6 - 0.0923076923077076*G0_0_1_6_7 + 0.0140088482945649*G0_0_1_6_8 - 0.0591865277579662*G0_0_1_6_9 + 0.0198912198912231*G0_0_1_7_0 + 0.0162047476333218*G0_0_1_7_1 + 0.0279244564958897*G0_0_1_7_2 - 0.00757528186099752*G0_0_1_7_3 - 0.0396175253318177*G0_0_1_7_4 + 0.11964035964038*G0_0_1_7_5 - 0.0923076923077076*G0_0_1_7_6 + 0.624815184815289*G0_0_1_7_7 - 0.0659340659340769*G0_0_1_7_8 + 0.206193806193841*G0_0_1_7_9 - 0.0143412143412167*G0_0_1_8_0 - 0.0104162504162522*G0_0_1_8_1 - 0.00285999714571191*G0_0_1_8_2 + 0.00752961324390019*G0_0_1_8_3 - 0.0273326673326719*G0_0_1_8_5 + 0.0140088482945649*G0_0_1_8_6 - 0.0659340659340769*G0_0_1_8_7 + 0.0684344227201482*G0_0_1_8_8 - 0.0184272869987187*G0_0_1_8_9 - 0.0071928071928084*G0_0_1_9_0 + 0.00611198325484143*G0_0_1_9_1 + 0.018149469578044*G0_0_1_9_2 - 0.00318538604252946*G0_0_1_9_3 - 0.0293877551020457*G0_0_1_9_4 + 0.076243756243769*G0_0_1_9_5 - 0.0591865277579662*G0_0_1_9_6 + 0.206193806193841*G0_0_1_9_7 - 0.0184272869987187*G0_0_1_9_8 + 0.170161267304153*G0_0_1_9_9 - 0.000749867416533899*G0_1_0_0_0 - 0.00266005599338976*G0_1_0_0_1 + 0.000741974075307546*G0_1_0_0_2 + 0.000319680319680375*G0_1_0_0_3 - 0.00133200133200156*G0_1_0_0_4 + 0.00435120435120518*G0_1_0_0_5 - 0.0024420024420029*G0_1_0_0_6 - 0.0198912198912231*G0_1_0_0_7 + 0.0143412143412167*G0_1_0_0_8 + 0.0071928071928084*G0_1_0_0_9 - 0.00266005599338976*G0_1_0_1_0 + 0.00047360047360058*G0_1_0_1_1 - 0.000699335937431292*G0_1_0_1_2 + 0.00311688311688362*G0_1_0_1_3 - 0.000167451596023035*G0_1_0_1_4 - 0.00626611483754446*G0_1_0_1_5 + 0.00363446077731853*G0_1_0_1_6 - 0.0162047476333218*G0_1_0_1_7 + 0.0104162504162522*G0_1_0_1_8 - 0.00611198325484143*G0_1_0_1_9 + 0.000741974075307546*G0_1_0_2_0 - 0.000699335937431293*G0_1_0_2_1 - 0.00203309917595665*G0_1_0_2_2 + 0.000598132026703552*G0_1_0_2_3 + 0.00323739752311236*G0_1_0_2_4 - 0.00856349999207284*G0_1_0_2_5 + 0.00669362383648209*G0_1_0_2_6 - 0.0279244564958897*G0_1_0_2_7 + 0.00285999714571191*G0_1_0_2_8 - 0.018149469578044*G0_1_0_2_9 + 0.000319680319680375*G0_1_0_3_0 + 0.00311688311688362*G0_1_0_3_1 + 0.000598132026703556*G0_1_0_3_2 + 0.00565149136577775*G0_1_0_3_3 - 0.000770657913515174*G0_1_0_3_4 + 0.00465249036677688*G0_1_0_3_5 - 0.00236905951191707*G0_1_0_3_6 + 0.00757528186099752*G0_1_0_3_7 - 0.0075296132439002*G0_1_0_3_8 + 0.00318538604252946*G0_1_0_3_9 - 0.00133200133200156*G0_1_0_4_0 - 0.000167451596023035*G0_1_0_4_1 + 0.00323739752311236*G0_1_0_4_2 - 0.000770657913515174*G0_1_0_4_3 - 0.00349364920793552*G0_1_0_4_4 + 0.0125303268160432*G0_1_0_4_5 - 0.0101612673041262*G0_1_0_4_6 + 0.0396175253318177*G0_1_0_4_7 + 0.0293877551020457*G0_1_0_4_9 + 0.00435120435120518*G0_1_0_5_0 - 0.00626611483754446*G0_1_0_5_1 - 0.00856349999207284*G0_1_0_5_2 + 0.00465249036677688*G0_1_0_5_3 + 0.0125303268160432*G0_1_0_5_4 - 0.0310089910089962*G0_1_0_5_5 + 0.0289310689310737*G0_1_0_5_6 - 0.11964035964038*G0_1_0_5_7 + 0.0273326673326719*G0_1_0_5_8 - 0.076243756243769*G0_1_0_5_9 - 0.0024420024420029*G0_1_0_6_0 + 0.00363446077731853*G0_1_0_6_1 + 0.00669362383648209*G0_1_0_6_2 - 0.00236905951191707*G0_1_0_6_3 - 0.0101612673041262*G0_1_0_6_4 + 0.0289310689310737*G0_1_0_6_5 - 0.0212815755672934*G0_1_0_6_6 + 0.0923076923077076*G0_1_0_6_7 - 0.0140088482945649*G0_1_0_6_8 + 0.0591865277579662*G0_1_0_6_9 - 0.0198912198912231*G0_1_0_7_0 - 0.0162047476333218*G0_1_0_7_1 - 0.0279244564958897*G0_1_0_7_2 + 0.00757528186099752*G0_1_0_7_3 + 0.0396175253318177*G0_1_0_7_4 - 0.11964035964038*G0_1_0_7_5 + 0.0923076923077076*G0_1_0_7_6 - 0.624815184815289*G0_1_0_7_7 + 0.0659340659340769*G0_1_0_7_8 - 0.206193806193841*G0_1_0_7_9 + 0.0143412143412167*G0_1_0_8_0 + 0.0104162504162522*G0_1_0_8_1 + 0.00285999714571191*G0_1_0_8_2 - 0.0075296132439002*G0_1_0_8_3 + 0.0273326673326719*G0_1_0_8_5 - 0.0140088482945649*G0_1_0_8_6 + 0.0659340659340769*G0_1_0_8_7 - 0.0684344227201482*G0_1_0_8_8 + 0.0184272869987187*G0_1_0_8_9 + 0.0071928071928084*G0_1_0_9_0 - 0.00611198325484143*G0_1_0_9_1 - 0.018149469578044*G0_1_0_9_2 + 0.00318538604252946*G0_1_0_9_3 + 0.0293877551020457*G0_1_0_9_4 - 0.076243756243769*G0_1_0_9_5 + 0.0591865277579662*G0_1_0_9_6 - 0.206193806193841*G0_1_0_9_7 + 0.0184272869987187*G0_1_0_9_8 - 0.170161267304153*G0_1_0_9_9; + A[151] = -A[61] + 0.0167024069405051*G0_0_0_0_0 + 0.00303250761584151*G0_0_0_0_1 + 0.00242005128909933*G0_0_0_0_2 + 0.000175399996828617*G0_0_0_0_3 + 0.000919655741084456*G0_0_0_0_4 + 0.0106597767312072*G0_0_0_0_5 - 0.00285337678194871*G0_0_0_0_6 + 0.00550691372120037*G0_0_0_0_7 - 0.00495048602191542*G0_0_0_0_8 + 0.000553256267542097*G0_0_0_0_9 + 0.00303250761584151*G0_0_0_1_0 + 0.110111801778488*G0_0_0_1_1 + 0.00534883326550084*G0_0_0_1_2 + 0.0522463647463737*G0_0_0_1_3 - 0.0202702852702887*G0_0_0_1_4 + 0.000720806970807058*G0_0_0_1_5 + 0.00122363747363769*G0_0_0_1_6 - 0.00837107337107492*G0_0_0_1_7 + 0.0140623265623292*G0_0_0_1_8 + 0.00402430902430975*G0_0_0_1_9 + 0.00242005128909933*G0_0_0_2_0 + 0.00534883326550084*G0_0_0_2_1 + 0.0182152503581106*G0_0_0_2_2 + 0.00394284287141499*G0_0_0_2_3 + 0.00307585271871037*G0_0_0_2_4 - 0.00339822875537217*G0_0_0_2_5 + 0.0112466501752235*G0_0_0_2_6 + 0.00144008769008792*G0_0_0_2_7 - 0.000274150452721905*G0_0_0_2_8 + 0.00262927548641879*G0_0_0_2_9 + 0.000175399996828616*G0_0_0_3_0 + 0.0522463647463737*G0_0_0_3_1 + 0.00394284287141499*G0_0_0_3_2 + 0.067427572427584*G0_0_0_3_3 - 0.0392470029970097*G0_0_0_3_4 + 0.0004573997431141*G0_0_0_3_5 - 0.00727433281004831*G0_0_0_3_6 - 0.00412962037962116*G0_0_0_3_7 + 0.00691058941059074*G0_0_0_3_8 - 0.00381368631368687*G0_0_0_3_9 + 0.000919655741084457*G0_0_0_4_0 - 0.0202702852702887*G0_0_0_4_1 + 0.00307585271871037*G0_0_0_4_2 - 0.0392470029970097*G0_0_0_4_3 + 0.0315513058370253*G0_0_0_4_4 - 0.00636238761238867*G0_0_0_4_5 + 0.013636720422437*G0_0_0_4_6 - 0.00173790495219091*G0_0_0_4_7 - 0.00278096903096958*G0_0_0_4_8 + 0.00483694876552093*G0_0_0_4_9 + 0.0106597767312072*G0_0_0_5_0 + 0.000720806970807058*G0_0_0_5_1 - 0.00339822875537217*G0_0_0_5_2 + 0.0004573997431141*G0_0_0_5_3 - 0.00636238761238867*G0_0_0_5_4 + 0.0589481946624903*G0_0_0_5_5 - 0.0206249108034857*G0_0_0_5_6 + 0.0136895247609556*G0_0_0_5_7 - 0.00576584130155657*G0_0_0_5_8 + 0.00987191380048689*G0_0_0_5_9 - 0.00285337678194871*G0_0_0_6_0 + 0.00122363747363769*G0_0_0_6_1 + 0.0112466501752235*G0_0_0_6_2 - 0.00727433281004831*G0_0_0_6_3 + 0.013636720422437*G0_0_0_6_4 - 0.0206249108034857*G0_0_0_6_5 + 0.0613029827315645*G0_0_0_6_6 - 0.00792368345939906*G0_0_0_6_7 + 0.000377479663194007*G0_0_0_6_8 + 0.00666083916084024*G0_0_0_6_9 + 0.00550691372120037*G0_0_0_7_0 - 0.00837107337107491*G0_0_0_7_1 + 0.00144008769008792*G0_0_0_7_2 - 0.00412962037962115*G0_0_0_7_3 - 0.00173790495219091*G0_0_0_7_4 + 0.0136895247609556*G0_0_0_7_5 - 0.00792368345939906*G0_0_0_7_6 + 0.0239988582845766*G0_0_0_7_7 + 0.00525849150849227*G0_0_0_7_8 + 0.0141875981161719*G0_0_0_7_9 - 0.00495048602191542*G0_0_0_8_0 + 0.0140623265623292*G0_0_0_8_1 - 0.000274150452721905*G0_0_0_8_2 + 0.00691058941059074*G0_0_0_8_3 - 0.00278096903096958*G0_0_0_8_4 - 0.00576584130155657*G0_0_0_8_5 + 0.000377479663194008*G0_0_0_8_6 + 0.00525849150849227*G0_0_0_8_7 - 0.0323726273726325*G0_0_0_8_8 - 0.00651098901099004*G0_0_0_8_9 + 0.000553256267542098*G0_0_0_9_0 + 0.00402430902430975*G0_0_0_9_1 + 0.00262927548641879*G0_0_0_9_2 - 0.00381368631368687*G0_0_0_9_3 + 0.00483694876552093*G0_0_0_9_4 + 0.0098719138004869*G0_0_0_9_5 + 0.00666083916084024*G0_0_0_9_6 + 0.0141875981161719*G0_0_0_9_7 - 0.00651098901099004*G0_0_0_9_8 + 0.048512915655781*G0_0_0_9_9 - 0.00151284341760558*G0_1_0_0_0 - 0.00231632564965939*G0_1_0_0_1 + 0.000449550449550538*G0_1_0_0_3 - 0.000520431949003472*G0_1_0_0_4 - 0.000586873444016392*G0_1_0_0_5 + 0.000544851973423489*G0_1_0_0_6 + 0.00243106100248999*G0_1_0_0_7 - 0.00889332889333041*G0_1_0_0_8 - 0.00207601921887671*G0_1_0_0_9 - 0.00231632564965938*G0_1_0_1_0 + 0.00231632564965937*G0_1_0_1_2 + 0.0381840381840446*G0_1_0_1_3 - 0.0118992118992139*G0_1_0_1_4 - 0.00050283050283057*G0_1_0_1_5 + 0.000502830502830574*G0_1_0_1_6 + 0.0118992118992139*G0_1_0_1_7 - 0.0381840381840447*G0_1_0_1_8 + 0.00231632564965937*G0_1_0_2_1 + 0.00151284341760556*G0_1_0_2_2 + 0.0088933288933304*G0_1_0_2_3 - 0.00243106100248998*G0_1_0_2_4 - 0.000544851973423489*G0_1_0_2_5 + 0.000586873444016391*G0_1_0_2_6 + 0.000520431949003462*G0_1_0_2_7 - 0.00044955044955051*G0_1_0_2_8 + 0.00207601921887673*G0_1_0_2_9 + 0.000449550449550537*G0_1_0_3_0 + 0.0381840381840446*G0_1_0_3_1 + 0.0088933288933304*G0_1_0_3_2 + 0.0998001998002168*G0_1_0_3_3 - 0.0445054945055021*G0_1_0_3_4 - 0.00150849150849178*G0_1_0_3_6 - 0.00134865134865161*G0_1_0_3_7 + 0.00269730269730323*G0_1_0_3_9 - 0.000520431949003472*G0_1_0_4_0 - 0.0118992118992139*G0_1_0_4_1 - 0.00243106100248998*G0_1_0_4_2 - 0.0445054945055021*G0_1_0_4_3 + 0.00755244755244882*G0_1_0_4_4 + 0.00156129584701039*G0_1_0_4_5 + 0.00134865134865154*G0_1_0_4_8 - 0.00935064935065097*G0_1_0_4_9 - 0.000586873444016392*G0_1_0_5_0 - 0.00050283050283057*G0_1_0_5_1 - 0.000544851973423489*G0_1_0_5_2 + 0.00156129584701039*G0_1_0_5_4 - 0.00235478806907416*G0_1_0_5_5 + 0.00150849150849179*G0_1_0_5_8 + 0.00321107463964661*G0_1_0_5_9 + 0.000544851973423489*G0_1_0_6_0 + 0.000502830502830574*G0_1_0_6_1 + 0.000586873444016391*G0_1_0_6_2 - 0.00150849150849178*G0_1_0_6_3 + 0.00235478806907417*G0_1_0_6_6 - 0.00156129584701039*G0_1_0_6_7 - 0.00321107463964662*G0_1_0_6_9 + 0.00243106100248999*G0_1_0_7_0 + 0.0118992118992139*G0_1_0_7_1 + 0.000520431949003462*G0_1_0_7_2 - 0.00134865134865161*G0_1_0_7_3 - 0.00156129584701039*G0_1_0_7_6 - 0.00755244755244884*G0_1_0_7_7 + 0.0445054945055021*G0_1_0_7_8 + 0.00935064935065093*G0_1_0_7_9 - 0.00889332889333041*G0_1_0_8_0 - 0.0381840381840447*G0_1_0_8_1 - 0.00044955044955051*G0_1_0_8_2 + 0.00134865134865154*G0_1_0_8_4 + 0.00150849150849179*G0_1_0_8_5 + 0.0445054945055021*G0_1_0_8_7 - 0.0998001998002166*G0_1_0_8_8 - 0.00269730269730311*G0_1_0_8_9 - 0.00207601921887671*G0_1_0_9_0 + 0.00207601921887673*G0_1_0_9_2 + 0.00269730269730323*G0_1_0_9_3 - 0.00935064935065097*G0_1_0_9_4 + 0.00321107463964661*G0_1_0_9_5 - 0.00321107463964662*G0_1_0_9_6 + 0.00935064935065093*G0_1_0_9_7 - 0.00269730269730311*G0_1_0_9_8; + A[102] = A[186] - 0.0996139662806495*G0_0_1_0_0 - 0.00889382222715704*G0_0_1_0_1 - 0.00790123456790255*G0_0_1_0_2 + 0.00426240426240498*G0_0_1_0_3 + 0.00175824175824205*G0_0_1_0_4 - 0.0919968919969073*G0_0_1_0_5 + 0.0332112332112387*G0_0_1_0_6 - 0.0745920745920869*G0_0_1_0_7 + 0.0378288378288441*G0_0_1_0_8 - 0.0223776223776262*G0_0_1_0_9 - 0.00889382222715704*G0_0_1_1_0 - 0.000519832900785404*G0_0_1_1_1 - 0.0017221579126344*G0_0_1_1_2 - 0.00123558980701862*G0_0_1_1_3 + 0.000446537589394828*G0_0_1_1_4 + 0.008296465439324*G0_0_1_1_5 + 0.00634793777651026*G0_0_1_1_6 - 0.0125233496662089*G0_0_1_1_7 + 0.00363572935001562*G0_0_1_1_8 + 0.00544978830693207*G0_0_1_1_9 - 0.00790123456790255*G0_0_1_2_0 - 0.0017221579126344*G0_0_1_2_1 - 0.00667776667776778*G0_0_1_2_2 + 0.00257266542980871*G0_0_1_2_3 - 0.00298368298368347*G0_0_1_2_4 - 0.0129851101279694*G0_0_1_2_5 + 0.00234432234432273*G0_0_1_2_6 - 0.0171181199752657*G0_0_1_2_7 + 0.00535845107273767*G0_0_1_2_8 - 0.00983397554826289*G0_0_1_2_9 + 0.00426240426240498*G0_0_1_3_0 - 0.00123558980701862*G0_0_1_3_1 + 0.00257266542980871*G0_0_1_3_2 - 0.0022834308548603*G0_0_1_3_3 + 0.00162123590695048*G0_0_1_3_4 - 0.0255287569573326*G0_0_1_3_5 - 0.00566290852005229*G0_0_1_3_6 + 0.000593692022263621*G0_0_1_3_7 + 0.00210075638647098*G0_0_1_3_8 - 0.0175367489653234*G0_0_1_3_9 + 0.00175824175824205*G0_0_1_4_0 + 0.000446537589394828*G0_0_1_4_1 - 0.00298368298368347*G0_0_1_4_2 + 0.00162123590695047*G0_0_1_4_3 - 0.0191351505637255*G0_0_1_4_4 + 0.00810617953475232*G0_0_1_4_5 - 0.00244327101470005*G0_0_1_4_6 + 0.0163493649207962*G0_0_1_4_7 - 0.00269444840873457*G0_0_1_4_8 + 0.013289567575284*G0_0_1_4_9 - 0.0919968919969073*G0_0_1_5_0 + 0.008296465439324*G0_0_1_5_1 - 0.0129851101279694*G0_0_1_5_2 - 0.0255287569573326*G0_0_1_5_3 + 0.00810617953475232*G0_0_1_5_4 + 0.372107892107955*G0_0_1_5_5 + 0.0652147852147962*G0_0_1_5_6 - 0.0532267732267819*G0_0_1_5_7 - 0.0115084915084936*G0_0_1_5_8 + 0.0901498501498654*G0_0_1_5_9 + 0.0332112332112387*G0_0_1_6_0 + 0.00634793777651026*G0_0_1_6_1 + 0.00234432234432273*G0_0_1_6_2 - 0.00566290852005229*G0_0_1_6_3 - 0.00244327101470004*G0_0_1_6_4 + 0.0652147852147962*G0_0_1_6_5 + 0.0131525617239925*G0_0_1_6_6 + 0.0647352647352755*G0_0_1_6_7 - 0.0242500356786111*G0_0_1_6_8 + 0.0408277436848933*G0_0_1_6_9 - 0.0745920745920869*G0_0_1_7_0 - 0.0125233496662089*G0_0_1_7_1 - 0.0171181199752657*G0_0_1_7_2 + 0.00059369202226362*G0_0_1_7_3 + 0.0163493649207962*G0_0_1_7_4 - 0.0532267732267819*G0_0_1_7_5 + 0.0647352647352755*G0_0_1_7_6 - 0.230489510489548*G0_0_1_7_7 + 0.0615384615384717*G0_0_1_7_8 - 0.0623376623376727*G0_0_1_7_9 + 0.0378288378288441*G0_0_1_8_0 + 0.00363572935001562*G0_0_1_8_1 + 0.00535845107273767*G0_0_1_8_2 + 0.00210075638647097*G0_0_1_8_3 - 0.00269444840873457*G0_0_1_8_4 - 0.0115084915084936*G0_0_1_8_5 - 0.0242500356786111*G0_0_1_8_6 + 0.0615384615384717*G0_0_1_8_7 - 0.0245697159982914*G0_0_1_8_8 - 0.0109604681033271*G0_0_1_8_9 - 0.0223776223776262*G0_0_1_9_0 + 0.00544978830693207*G0_0_1_9_1 - 0.0098339755482629*G0_0_1_9_2 - 0.0175367489653234*G0_0_1_9_3 + 0.013289567575284*G0_0_1_9_4 + 0.0901498501498655*G0_0_1_9_5 + 0.0408277436848933*G0_0_1_9_6 - 0.0623376623376727*G0_0_1_9_7 - 0.0109604681033271*G0_0_1_9_8 + 0.00657628086199633*G0_0_1_9_9 + 0.0996139662806495*G0_1_0_0_0 + 0.00889382222715704*G0_1_0_0_1 + 0.00790123456790255*G0_1_0_0_2 - 0.00426240426240498*G0_1_0_0_3 - 0.00175824175824205*G0_1_0_0_4 + 0.0919968919969073*G0_1_0_0_5 - 0.0332112332112387*G0_1_0_0_6 + 0.0745920745920869*G0_1_0_0_7 - 0.0378288378288441*G0_1_0_0_8 + 0.0223776223776262*G0_1_0_0_9 + 0.00889382222715704*G0_1_0_1_0 + 0.000519832900785404*G0_1_0_1_1 + 0.00172215791263439*G0_1_0_1_2 + 0.00123558980701862*G0_1_0_1_3 - 0.000446537589394828*G0_1_0_1_4 - 0.00829646543932401*G0_1_0_1_5 - 0.00634793777651026*G0_1_0_1_6 + 0.0125233496662089*G0_1_0_1_7 - 0.00363572935001562*G0_1_0_1_8 - 0.00544978830693208*G0_1_0_1_9 + 0.00790123456790255*G0_1_0_2_0 + 0.00172215791263439*G0_1_0_2_1 + 0.00667776667776778*G0_1_0_2_2 - 0.00257266542980871*G0_1_0_2_3 + 0.00298368298368347*G0_1_0_2_4 + 0.0129851101279694*G0_1_0_2_5 - 0.00234432234432273*G0_1_0_2_6 + 0.0171181199752657*G0_1_0_2_7 - 0.00535845107273767*G0_1_0_2_8 + 0.0098339755482629*G0_1_0_2_9 - 0.00426240426240498*G0_1_0_3_0 + 0.00123558980701862*G0_1_0_3_1 - 0.00257266542980871*G0_1_0_3_2 + 0.0022834308548603*G0_1_0_3_3 - 0.00162123590695049*G0_1_0_3_4 + 0.0255287569573326*G0_1_0_3_5 + 0.00566290852005229*G0_1_0_3_6 - 0.000593692022263621*G0_1_0_3_7 - 0.00210075638647098*G0_1_0_3_8 + 0.0175367489653234*G0_1_0_3_9 - 0.00175824175824205*G0_1_0_4_0 - 0.000446537589394828*G0_1_0_4_1 + 0.00298368298368347*G0_1_0_4_2 - 0.00162123590695048*G0_1_0_4_3 + 0.0191351505637255*G0_1_0_4_4 - 0.00810617953475232*G0_1_0_4_5 + 0.00244327101470004*G0_1_0_4_6 - 0.0163493649207962*G0_1_0_4_7 + 0.00269444840873457*G0_1_0_4_8 - 0.013289567575284*G0_1_0_4_9 + 0.0919968919969073*G0_1_0_5_0 - 0.008296465439324*G0_1_0_5_1 + 0.0129851101279694*G0_1_0_5_2 + 0.0255287569573326*G0_1_0_5_3 - 0.00810617953475232*G0_1_0_5_4 - 0.372107892107955*G0_1_0_5_5 - 0.0652147852147962*G0_1_0_5_6 + 0.0532267732267819*G0_1_0_5_7 + 0.0115084915084936*G0_1_0_5_8 - 0.0901498501498655*G0_1_0_5_9 - 0.0332112332112387*G0_1_0_6_0 - 0.00634793777651026*G0_1_0_6_1 - 0.00234432234432273*G0_1_0_6_2 + 0.00566290852005229*G0_1_0_6_3 + 0.00244327101470004*G0_1_0_6_4 - 0.0652147852147962*G0_1_0_6_5 - 0.0131525617239925*G0_1_0_6_6 - 0.0647352647352755*G0_1_0_6_7 + 0.0242500356786111*G0_1_0_6_8 - 0.0408277436848933*G0_1_0_6_9 + 0.0745920745920869*G0_1_0_7_0 + 0.0125233496662089*G0_1_0_7_1 + 0.0171181199752657*G0_1_0_7_2 - 0.000593692022263621*G0_1_0_7_3 - 0.0163493649207962*G0_1_0_7_4 + 0.0532267732267819*G0_1_0_7_5 - 0.0647352647352755*G0_1_0_7_6 + 0.230489510489548*G0_1_0_7_7 - 0.0615384615384717*G0_1_0_7_8 + 0.0623376623376727*G0_1_0_7_9 - 0.0378288378288441*G0_1_0_8_0 - 0.00363572935001562*G0_1_0_8_1 - 0.00535845107273767*G0_1_0_8_2 - 0.00210075638647097*G0_1_0_8_3 + 0.00269444840873457*G0_1_0_8_4 + 0.0115084915084936*G0_1_0_8_5 + 0.0242500356786111*G0_1_0_8_6 - 0.0615384615384717*G0_1_0_8_7 + 0.0245697159982914*G0_1_0_8_8 + 0.0109604681033271*G0_1_0_8_9 + 0.0223776223776262*G0_1_0_9_0 - 0.00544978830693207*G0_1_0_9_1 + 0.0098339755482629*G0_1_0_9_2 + 0.0175367489653234*G0_1_0_9_3 - 0.013289567575284*G0_1_0_9_4 - 0.0901498501498655*G0_1_0_9_5 - 0.0408277436848933*G0_1_0_9_6 + 0.0623376623376727*G0_1_0_9_7 + 0.0109604681033271*G0_1_0_9_8 - 0.0065762808619963*G0_1_0_9_9; + A[189] = A[102] + 0.167102033768729*G0_0_0_0_0 + 0.00995012042631255*G0_0_0_0_1 + 0.0220593515831649*G0_0_0_0_2 - 0.00929610072467373*G0_0_0_0_3 + 0.00132185275042441*G0_0_0_0_4 + 0.24808968808973*G0_0_0_0_5 - 0.10275946275948*G0_0_0_0_6 + 0.0769186369186497*G0_0_0_0_7 - 0.0455722055722132*G0_0_0_0_8 + 0.0236563436563477*G0_0_0_0_9 + 0.00995012042631255*G0_0_0_1_0 - 0.00886760505808285*G0_0_0_1_1 + 0.00236997570330944*G0_0_0_1_2 - 0.0236791779648963*G0_0_0_1_3 + 0.0112953712953732*G0_0_0_1_4 + 0.0498295355438296*G0_0_0_1_5 - 0.00854256854256995*G0_0_0_1_6 + 0.0188763617335077*G0_0_0_1_7 - 0.0155958327386925*G0_0_0_1_8 + 0.022956091527524*G0_0_0_1_9 + 0.0220593515831649*G0_0_0_2_0 + 0.00236997570330944*G0_0_0_2_1 + 0.0124793724793747*G0_0_0_2_2 - 0.0132540475397641*G0_0_0_2_3 + 0.0148017062302803*G0_0_0_2_4 + 0.0635910121624515*G0_0_0_2_5 - 0.0262391576677335*G0_0_0_2_6 + 0.0225882054453521*G0_0_0_2_7 - 0.0137944595087475*G0_0_0_2_8 + 0.00898149469578197*G0_0_0_2_9 - 0.00929610072467373*G0_0_0_3_0 - 0.0236791779648963*G0_0_0_3_1 - 0.0132540475397641*G0_0_0_3_2 - 0.0987812187812352*G0_0_0_3_3 + 0.00335664335664387*G0_0_0_3_4 - 0.0469016697588203*G0_0_0_3_5 - 0.00216925931211684*G0_0_0_3_6 - 0.0136777508206103*G0_0_0_3_8 - 0.0690509490509606*G0_0_0_3_9 + 0.00132185275042441*G0_0_0_4_0 + 0.0112953712953732*G0_0_0_4_1 + 0.0148017062302803*G0_0_0_4_2 + 0.00335664335664388*G0_0_0_4_3 + 0.108782645925522*G0_0_0_4_4 - 0.0317625231911001*G0_0_0_4_5 + 0.0339317825032169*G0_0_0_4_6 - 0.0219666048237514*G0_0_0_4_7 + 0.0135864135864159*G0_0_0_4_8 + 0.0365805622948541*G0_0_0_4_9 + 0.24808968808973*G0_0_0_5_0 + 0.0498295355438296*G0_0_0_5_1 + 0.0635910121624515*G0_0_0_5_2 - 0.0469016697588203*G0_0_0_5_3 - 0.0317625231911001*G0_0_0_5_4 + 1.47340659340684*G0_0_0_5_5 - 0.304997859283625*G0_0_0_5_6 + 0.272847152847198*G0_0_0_5_7 - 0.177285571571316*G0_0_0_5_8 + 0.283602112173589*G0_0_0_5_9 - 0.10275946275948*G0_0_0_6_0 - 0.00854256854256995*G0_0_0_6_1 - 0.0262391576677335*G0_0_0_6_2 - 0.00216925931211684*G0_0_0_6_3 + 0.0339317825032169*G0_0_0_6_4 - 0.304997859283625*G0_0_0_6_5 + 0.173084058798374*G0_0_0_6_6 - 0.0955615812758829*G0_0_0_6_7 + 0.0474040245468896*G0_0_0_6_8 - 0.0226059654631122*G0_0_0_6_9 + 0.0769186369186497*G0_0_0_7_0 + 0.0188763617335077*G0_0_0_7_1 + 0.0225882054453521*G0_0_0_7_2 - 0.0219666048237514*G0_0_0_7_4 + 0.272847152847198*G0_0_0_7_5 - 0.0955615812758829*G0_0_0_7_6 + 0.141938061938086*G0_0_0_7_7 - 0.0528842585985531*G0_0_0_7_8 + 0.120154131582723*G0_0_0_7_9 - 0.0455722055722132*G0_0_0_8_0 - 0.0155958327386925*G0_0_0_8_1 - 0.0137944595087475*G0_0_0_8_2 - 0.0136777508206103*G0_0_0_8_3 + 0.0135864135864159*G0_0_0_8_4 - 0.177285571571316*G0_0_0_8_5 + 0.0474040245468896*G0_0_0_8_6 - 0.0528842585985531*G0_0_0_8_7 + 0.0112344798059103*G0_0_0_8_8 - 0.0960411017554037*G0_0_0_8_9 + 0.0236563436563477*G0_0_0_9_0 + 0.022956091527524*G0_0_0_9_1 + 0.00898149469578197*G0_0_0_9_2 - 0.0690509490509606*G0_0_0_9_3 + 0.0365805622948541*G0_0_0_9_4 + 0.283602112173589*G0_0_0_9_5 - 0.0226059654631122*G0_0_0_9_6 + 0.120154131582723*G0_0_0_9_7 - 0.0960411017554037*G0_0_0_9_8 + 0.162762951334407*G0_0_0_9_9 + 0.000843177986035263*G0_0_1_0_1 - 0.000843177986035265*G0_0_1_0_2 - 0.0063479377765103*G0_0_1_0_3 + 0.0063479377765103*G0_0_1_0_4 - 0.00232656232656273*G0_0_1_0_5 + 0.00710400710400831*G0_0_1_0_6 + 0.0023265623265627*G0_0_1_0_7 - 0.00710400710400826*G0_0_1_0_8 + 0.000843177986035263*G0_0_1_1_0 - 0.0133318533318557*G0_0_1_1_1 - 0.0204544661687554*G0_0_1_1_3 + 0.0134012019726329*G0_0_1_1_4 - 0.0096360782075084*G0_0_1_1_5 + 0.00363065505922711*G0_0_1_1_6 + 0.00218701932987682*G0_0_1_1_7 - 0.00298875727447206*G0_0_1_1_8 + 0.000182674468388771*G0_0_1_1_9 - 0.000843177986035265*G0_0_1_2_0 + 0.0133318533318556*G0_0_1_2_2 - 0.0134012019726328*G0_0_1_2_3 + 0.0204544661687554*G0_0_1_2_4 - 0.00218701932987686*G0_0_1_2_5 + 0.00298875727447208*G0_0_1_2_6 + 0.00963607820750836*G0_0_1_2_7 - 0.00363065505922709*G0_0_1_2_8 - 0.000182674468388797*G0_0_1_2_9 - 0.0063479377765103*G0_0_1_3_0 - 0.0204544661687554*G0_0_1_3_1 - 0.0134012019726328*G0_0_1_3_2 - 0.115906950192684*G0_0_1_3_3 + 0.023976023976028*G0_0_1_3_5 - 0.0108919651776813*G0_0_1_3_6 + 0.0190438133295308*G0_0_1_3_7 - 0.0299357785072121*G0_0_1_3_8 - 0.0386356500642281*G0_0_1_3_9 + 0.0063479377765103*G0_0_1_4_0 + 0.0134012019726329*G0_0_1_4_1 + 0.0204544661687554*G0_0_1_4_2 + 0.115906950192684*G0_0_1_4_4 - 0.0190438133295308*G0_0_1_4_5 + 0.0299357785072122*G0_0_1_4_6 - 0.023976023976028*G0_0_1_4_7 + 0.0108919651776813*G0_0_1_4_8 + 0.038635650064228*G0_0_1_4_9 - 0.00232656232656273*G0_0_1_5_0 - 0.00963607820750839*G0_0_1_5_1 - 0.00218701932987686*G0_0_1_5_2 + 0.023976023976028*G0_0_1_5_3 - 0.0190438133295308*G0_0_1_5_4 - 0.131068931068953*G0_0_1_5_5 - 0.00673612102183642*G0_0_1_5_6 + 0.0289082346225252*G0_0_1_5_8 - 0.0578164692450504*G0_0_1_5_9 + 0.00710400710400831*G0_0_1_6_0 + 0.00363065505922711*G0_0_1_6_1 + 0.00298875727447208*G0_0_1_6_2 - 0.0108919651776813*G0_0_1_6_3 + 0.0299357785072121*G0_0_1_6_4 - 0.00673612102183642*G0_0_1_6_5 + 0.0345711431425775*G0_0_1_6_6 - 0.0289082346225251*G0_0_1_6_7 + 0.022331953760529*G0_0_1_6_9 + 0.0023265623265627*G0_0_1_7_0 + 0.00218701932987683*G0_0_1_7_1 + 0.00963607820750836*G0_0_1_7_2 + 0.0190438133295308*G0_0_1_7_3 - 0.023976023976028*G0_0_1_7_4 - 0.0289082346225251*G0_0_1_7_6 + 0.131068931068952*G0_0_1_7_7 + 0.0067361210218365*G0_0_1_7_8 + 0.0578164692450502*G0_0_1_7_9 - 0.00710400710400826*G0_0_1_8_0 - 0.00298875727447207*G0_0_1_8_1 - 0.00363065505922709*G0_0_1_8_2 - 0.0299357785072121*G0_0_1_8_3 + 0.0108919651776813*G0_0_1_8_4 + 0.0289082346225252*G0_0_1_8_5 + 0.00673612102183648*G0_0_1_8_7 - 0.0345711431425776*G0_0_1_8_8 - 0.0223319537605289*G0_0_1_8_9 + 0.00018267446838877*G0_0_1_9_1 - 0.000182674468388796*G0_0_1_9_2 - 0.0386356500642281*G0_0_1_9_3 + 0.038635650064228*G0_0_1_9_4 - 0.0578164692450504*G0_0_1_9_5 + 0.022331953760529*G0_0_1_9_6 + 0.0578164692450503*G0_0_1_9_7 - 0.0223319537605289*G0_0_1_9_8 - 0.000149409673219201*G0_1_0_0_1 + 0.000149409673219224*G0_1_0_0_2 - 0.00384377527234739*G0_1_0_0_3 + 0.00384377527234738*G0_1_0_0_4 - 0.019731379731383*G0_1_0_0_5 + 0.00248640248640292*G0_1_0_0_6 + 0.0197313797313832*G0_1_0_0_7 - 0.00248640248640301*G0_1_0_0_8 - 0.000149409673219202*G0_1_0_1_0 - 0.00717391955487319*G0_1_0_1_1 - 0.0187063729920905*G0_1_0_1_3 + 0.0112750741322189*G0_1_0_1_4 + 0.0157785072070813*G0_1_0_1_5 + 0.00462014176299969*G0_1_0_1_6 + 0.00264877979163743*G0_1_0_1_7 - 0.00169735026877916*G0_1_0_1_8 + 0.0154664383235838*G0_1_0_1_9 + 0.000149409673219224*G0_1_0_2_0 + 0.00717391955487325*G0_1_0_2_2 - 0.0112750741322189*G0_1_0_2_3 + 0.0187063729920906*G0_1_0_2_4 - 0.00264877979163737*G0_1_0_2_5 + 0.00169735026877915*G0_1_0_2_6 - 0.0157785072070812*G0_1_0_2_7 - 0.00462014176299968*G0_1_0_2_8 - 0.0154664383235837*G0_1_0_2_9 - 0.00384377527234739*G0_1_0_3_0 - 0.0187063729920905*G0_1_0_3_1 - 0.0112750741322189*G0_1_0_3_2 - 0.0990552304838189*G0_1_0_3_3 - 0.0179020979021008*G0_1_0_3_5 - 0.013860425288999*G0_1_0_3_6 + 0.0115313258170421*G0_1_0_3_7 - 0.0253917511060411*G0_1_0_3_8 - 0.0694619666048354*G0_1_0_3_9 + 0.00384377527234738*G0_1_0_4_0 + 0.0112750741322189*G0_1_0_4_1 + 0.0187063729920906*G0_1_0_4_2 + 0.099055230483819*G0_1_0_4_4 - 0.0115313258170421*G0_1_0_4_5 + 0.0253917511060411*G0_1_0_4_6 + 0.0179020979021009*G0_1_0_4_7 + 0.013860425288999*G0_1_0_4_8 + 0.0694619666048354*G0_1_0_4_9 - 0.019731379731383*G0_1_0_5_0 + 0.0157785072070813*G0_1_0_5_1 - 0.00264877979163737*G0_1_0_5_2 - 0.0179020979021008*G0_1_0_5_3 - 0.0115313258170421*G0_1_0_5_4 + 0.471528471528551*G0_1_0_5_5 - 0.00305979734551202*G0_1_0_5_6 - 0.047335521621244*G0_1_0_5_8 + 0.094671043242488*G0_1_0_5_9 + 0.00248640248640292*G0_1_0_6_0 + 0.00462014176299969*G0_1_0_6_1 + 0.00169735026877915*G0_1_0_6_2 - 0.013860425288999*G0_1_0_6_3 + 0.0253917511060411*G0_1_0_6_4 - 0.00305979734551203*G0_1_0_6_5 + 0.0722934208648616*G0_1_0_6_6 + 0.0473355216212437*G0_1_0_6_7 + 0.0741201655487493*G0_1_0_6_9 + 0.0197313797313832*G0_1_0_7_0 + 0.00264877979163743*G0_1_0_7_1 - 0.0157785072070812*G0_1_0_7_2 + 0.0115313258170421*G0_1_0_7_3 + 0.0179020979021009*G0_1_0_7_4 + 0.0473355216212437*G0_1_0_7_6 - 0.47152847152855*G0_1_0_7_7 + 0.00305979734551197*G0_1_0_7_8 - 0.0946710432424877*G0_1_0_7_9 - 0.002486402486403*G0_1_0_8_0 - 0.00169735026877916*G0_1_0_8_1 - 0.00462014176299968*G0_1_0_8_2 - 0.0253917511060411*G0_1_0_8_3 + 0.013860425288999*G0_1_0_8_4 - 0.047335521621244*G0_1_0_8_5 + 0.00305979734551196*G0_1_0_8_7 - 0.0722934208648613*G0_1_0_8_8 - 0.0741201655487495*G0_1_0_8_9 + 0.0154664383235838*G0_1_0_9_1 - 0.0154664383235837*G0_1_0_9_2 - 0.0694619666048354*G0_1_0_9_3 + 0.0694619666048354*G0_1_0_9_4 + 0.094671043242488*G0_1_0_9_5 + 0.0741201655487493*G0_1_0_9_6 - 0.0946710432424877*G0_1_0_9_7 - 0.0741201655487495*G0_1_0_9_8 - 0.167102033768729*G0_1_1_0_0 - 0.0220593515831648*G0_1_1_0_1 - 0.00995012042631255*G0_1_1_0_2 - 0.00132185275042435*G0_1_1_0_3 + 0.00929610072467372*G0_1_1_0_4 - 0.0769186369186498*G0_1_1_0_5 + 0.0455722055722132*G0_1_1_0_6 - 0.24808968808973*G0_1_1_0_7 + 0.10275946275948*G0_1_1_0_8 - 0.0236563436563478*G0_1_1_0_9 - 0.0220593515831648*G0_1_1_1_0 - 0.0124793724793746*G0_1_1_1_1 - 0.00236997570330943*G0_1_1_1_2 - 0.0148017062302802*G0_1_1_1_3 + 0.0132540475397641*G0_1_1_1_4 - 0.0225882054453521*G0_1_1_1_5 + 0.0137944595087475*G0_1_1_1_6 - 0.0635910121624514*G0_1_1_1_7 + 0.0262391576677335*G0_1_1_1_8 - 0.00898149469578195*G0_1_1_1_9 - 0.00995012042631255*G0_1_1_2_0 - 0.00236997570330943*G0_1_1_2_1 + 0.00886760505808283*G0_1_1_2_2 - 0.0112953712953732*G0_1_1_2_3 + 0.0236791779648963*G0_1_1_2_4 - 0.0188763617335077*G0_1_1_2_5 + 0.0155958327386925*G0_1_1_2_6 - 0.0498295355438296*G0_1_1_2_7 + 0.00854256854256997*G0_1_1_2_8 - 0.0229560915275239*G0_1_1_2_9 - 0.00132185275042435*G0_1_1_3_0 - 0.0148017062302802*G0_1_1_3_1 - 0.0112953712953732*G0_1_1_3_2 - 0.108782645925522*G0_1_1_3_3 - 0.003356643356644*G0_1_1_3_4 + 0.0219666048237514*G0_1_1_3_5 - 0.0135864135864159*G0_1_1_3_6 + 0.0317625231911003*G0_1_1_3_7 - 0.0339317825032169*G0_1_1_3_8 - 0.0365805622948542*G0_1_1_3_9 + 0.00929610072467372*G0_1_1_4_0 + 0.0132540475397641*G0_1_1_4_1 + 0.0236791779648963*G0_1_1_4_2 - 0.00335664335664401*G0_1_1_4_3 + 0.0987812187812354*G0_1_1_4_4 + 0.0136777508206103*G0_1_1_4_6 + 0.0469016697588205*G0_1_1_4_7 + 0.0021692593121168*G0_1_1_4_8 + 0.0690509490509606*G0_1_1_4_9 - 0.0769186369186498*G0_1_1_5_0 - 0.0225882054453521*G0_1_1_5_1 - 0.0188763617335077*G0_1_1_5_2 + 0.0219666048237514*G0_1_1_5_3 - 0.141938061938085*G0_1_1_5_5 + 0.0528842585985531*G0_1_1_5_6 - 0.272847152847198*G0_1_1_5_7 + 0.0955615812758829*G0_1_1_5_8 - 0.120154131582723*G0_1_1_5_9 + 0.0455722055722132*G0_1_1_6_0 + 0.0137944595087475*G0_1_1_6_1 + 0.0155958327386925*G0_1_1_6_2 - 0.0135864135864159*G0_1_1_6_3 + 0.0136777508206103*G0_1_1_6_4 + 0.0528842585985531*G0_1_1_6_5 - 0.0112344798059101*G0_1_1_6_6 + 0.177285571571315*G0_1_1_6_7 - 0.0474040245468896*G0_1_1_6_8 + 0.0960411017554036*G0_1_1_6_9 - 0.24808968808973*G0_1_1_7_0 - 0.0635910121624514*G0_1_1_7_1 - 0.0498295355438296*G0_1_1_7_2 + 0.0317625231911003*G0_1_1_7_3 + 0.0469016697588205*G0_1_1_7_4 - 0.272847152847198*G0_1_1_7_5 + 0.177285571571315*G0_1_1_7_6 - 1.47340659340684*G0_1_1_7_7 + 0.304997859283625*G0_1_1_7_8 - 0.283602112173589*G0_1_1_7_9 + 0.10275946275948*G0_1_1_8_0 + 0.0262391576677335*G0_1_1_8_1 + 0.00854256854256997*G0_1_1_8_2 - 0.0339317825032169*G0_1_1_8_3 + 0.0021692593121168*G0_1_1_8_4 + 0.095561581275883*G0_1_1_8_5 - 0.0474040245468896*G0_1_1_8_6 + 0.304997859283625*G0_1_1_8_7 - 0.173084058798373*G0_1_1_8_8 + 0.0226059654631123*G0_1_1_8_9 - 0.0236563436563478*G0_1_1_9_0 - 0.00898149469578195*G0_1_1_9_1 - 0.0229560915275239*G0_1_1_9_2 - 0.0365805622948542*G0_1_1_9_3 + 0.0690509490509606*G0_1_1_9_4 - 0.120154131582723*G0_1_1_9_5 + 0.0960411017554036*G0_1_1_9_6 - 0.283602112173589*G0_1_1_9_7 + 0.0226059654631123*G0_1_1_9_8 - 0.162762951334407*G0_1_1_9_9; + A[147] = A[189] + 0.0996139662806497*G0_0_1_0_0 + 0.00790123456790257*G0_0_1_0_1 + 0.00889382222715704*G0_0_1_0_2 - 0.00175824175824207*G0_0_1_0_3 - 0.00426240426240497*G0_0_1_0_4 + 0.074592074592087*G0_0_1_0_5 - 0.0378288378288441*G0_0_1_0_6 + 0.0919968919969074*G0_0_1_0_7 - 0.0332112332112388*G0_0_1_0_8 + 0.0223776223776262*G0_0_1_0_9 + 0.00790123456790257*G0_0_1_1_0 + 0.00667776667776788*G0_0_1_1_1 + 0.0017221579126344*G0_0_1_1_2 + 0.00298368298368352*G0_0_1_1_3 - 0.00257266542980874*G0_0_1_1_4 + 0.0171181199752657*G0_0_1_1_5 - 0.00535845107273768*G0_0_1_1_6 + 0.0129851101279695*G0_0_1_1_7 - 0.00234432234432271*G0_0_1_1_8 + 0.00983397554826294*G0_0_1_1_9 + 0.00889382222715704*G0_0_1_2_0 + 0.0017221579126344*G0_0_1_2_1 + 0.0005198329007854*G0_0_1_2_2 - 0.000446537589394818*G0_0_1_2_3 + 0.0012355898070186*G0_0_1_2_4 + 0.0125233496662089*G0_0_1_2_5 - 0.00363572935001566*G0_0_1_2_6 - 0.00829646543932395*G0_0_1_2_7 - 0.00634793777651026*G0_0_1_2_8 - 0.00544978830693205*G0_0_1_2_9 - 0.00175824175824207*G0_0_1_3_0 + 0.00298368298368352*G0_0_1_3_1 - 0.000446537589394816*G0_0_1_3_2 + 0.0191351505637255*G0_0_1_3_3 - 0.00162123590695049*G0_0_1_3_4 - 0.0163493649207962*G0_0_1_3_5 + 0.00269444840873455*G0_0_1_3_6 - 0.0081061795347523*G0_0_1_3_7 + 0.0024432710147001*G0_0_1_3_8 - 0.013289567575284*G0_0_1_3_9 - 0.00426240426240497*G0_0_1_4_0 - 0.00257266542980874*G0_0_1_4_1 + 0.0012355898070186*G0_0_1_4_2 - 0.00162123590695049*G0_0_1_4_3 + 0.00228343085486019*G0_0_1_4_4 - 0.000593692022263616*G0_0_1_4_5 - 0.00210075638647097*G0_0_1_4_6 + 0.0255287569573326*G0_0_1_4_7 + 0.00566290852005231*G0_0_1_4_8 + 0.0175367489653233*G0_0_1_4_9 + 0.074592074592087*G0_0_1_5_0 + 0.0171181199752657*G0_0_1_5_1 + 0.0125233496662089*G0_0_1_5_2 - 0.0163493649207962*G0_0_1_5_3 - 0.000593692022263616*G0_0_1_5_4 + 0.230489510489549*G0_0_1_5_5 - 0.0615384615384718*G0_0_1_5_6 + 0.0532267732267822*G0_0_1_5_7 - 0.0647352647352756*G0_0_1_5_8 + 0.062337662337673*G0_0_1_5_9 - 0.0378288378288441*G0_0_1_6_0 - 0.00535845107273768*G0_0_1_6_1 - 0.00363572935001566*G0_0_1_6_2 + 0.00269444840873455*G0_0_1_6_3 - 0.00210075638647097*G0_0_1_6_4 - 0.0615384615384718*G0_0_1_6_5 + 0.0245697159982916*G0_0_1_6_6 + 0.0115084915084934*G0_0_1_6_7 + 0.0242500356786112*G0_0_1_6_8 + 0.010960468103327*G0_0_1_6_9 + 0.0919968919969074*G0_0_1_7_0 + 0.0129851101279695*G0_0_1_7_1 - 0.00829646543932395*G0_0_1_7_2 - 0.0081061795347523*G0_0_1_7_3 + 0.0255287569573326*G0_0_1_7_4 + 0.0532267732267822*G0_0_1_7_5 + 0.0115084915084934*G0_0_1_7_6 - 0.372107892107955*G0_0_1_7_7 - 0.0652147852147963*G0_0_1_7_8 - 0.0901498501498653*G0_0_1_7_9 - 0.0332112332112388*G0_0_1_8_0 - 0.00234432234432271*G0_0_1_8_1 - 0.00634793777651026*G0_0_1_8_2 + 0.00244327101470009*G0_0_1_8_3 + 0.00566290852005231*G0_0_1_8_4 - 0.0647352647352756*G0_0_1_8_5 + 0.0242500356786112*G0_0_1_8_6 - 0.0652147852147962*G0_0_1_8_7 - 0.0131525617239922*G0_0_1_8_8 - 0.0408277436848934*G0_0_1_8_9 + 0.0223776223776262*G0_0_1_9_0 + 0.00983397554826295*G0_0_1_9_1 - 0.00544978830693205*G0_0_1_9_2 - 0.013289567575284*G0_0_1_9_3 + 0.0175367489653233*G0_0_1_9_4 + 0.062337662337673*G0_0_1_9_5 + 0.010960468103327*G0_0_1_9_6 - 0.0901498501498653*G0_0_1_9_7 - 0.0408277436848935*G0_0_1_9_8 - 0.00657628086199602*G0_0_1_9_9 - 0.0996139662806497*G0_1_0_0_0 - 0.00790123456790257*G0_1_0_0_1 - 0.00889382222715704*G0_1_0_0_2 + 0.00175824175824207*G0_1_0_0_3 + 0.00426240426240497*G0_1_0_0_4 - 0.074592074592087*G0_1_0_0_5 + 0.0378288378288441*G0_1_0_0_6 - 0.0919968919969074*G0_1_0_0_7 + 0.0332112332112388*G0_1_0_0_8 - 0.0223776223776262*G0_1_0_0_9 - 0.00790123456790257*G0_1_0_1_0 - 0.00667776667776788*G0_1_0_1_1 - 0.0017221579126344*G0_1_0_1_2 - 0.00298368298368352*G0_1_0_1_3 + 0.00257266542980874*G0_1_0_1_4 - 0.0171181199752657*G0_1_0_1_5 + 0.00535845107273768*G0_1_0_1_6 - 0.0129851101279695*G0_1_0_1_7 + 0.00234432234432271*G0_1_0_1_8 - 0.00983397554826294*G0_1_0_1_9 - 0.00889382222715704*G0_1_0_2_0 - 0.0017221579126344*G0_1_0_2_1 - 0.0005198329007854*G0_1_0_2_2 + 0.000446537589394818*G0_1_0_2_3 - 0.0012355898070186*G0_1_0_2_4 - 0.0125233496662089*G0_1_0_2_5 + 0.00363572935001566*G0_1_0_2_6 + 0.00829646543932395*G0_1_0_2_7 + 0.00634793777651026*G0_1_0_2_8 + 0.00544978830693205*G0_1_0_2_9 + 0.00175824175824207*G0_1_0_3_0 - 0.00298368298368352*G0_1_0_3_1 + 0.00044653758939482*G0_1_0_3_2 - 0.0191351505637255*G0_1_0_3_3 + 0.00162123590695048*G0_1_0_3_4 + 0.0163493649207962*G0_1_0_3_5 - 0.00269444840873455*G0_1_0_3_6 + 0.0081061795347523*G0_1_0_3_7 - 0.00244327101470009*G0_1_0_3_8 + 0.013289567575284*G0_1_0_3_9 + 0.00426240426240497*G0_1_0_4_0 + 0.00257266542980874*G0_1_0_4_1 - 0.0012355898070186*G0_1_0_4_2 + 0.00162123590695049*G0_1_0_4_3 - 0.00228343085486019*G0_1_0_4_4 + 0.000593692022263616*G0_1_0_4_5 + 0.00210075638647097*G0_1_0_4_6 - 0.0255287569573326*G0_1_0_4_7 - 0.00566290852005231*G0_1_0_4_8 - 0.0175367489653233*G0_1_0_4_9 - 0.074592074592087*G0_1_0_5_0 - 0.0171181199752657*G0_1_0_5_1 - 0.0125233496662089*G0_1_0_5_2 + 0.0163493649207962*G0_1_0_5_3 + 0.000593692022263616*G0_1_0_5_4 - 0.230489510489549*G0_1_0_5_5 + 0.0615384615384718*G0_1_0_5_6 - 0.0532267732267822*G0_1_0_5_7 + 0.0647352647352756*G0_1_0_5_8 - 0.062337662337673*G0_1_0_5_9 + 0.0378288378288441*G0_1_0_6_0 + 0.00535845107273768*G0_1_0_6_1 + 0.00363572935001566*G0_1_0_6_2 - 0.00269444840873455*G0_1_0_6_3 + 0.00210075638647097*G0_1_0_6_4 + 0.0615384615384718*G0_1_0_6_5 - 0.0245697159982916*G0_1_0_6_6 - 0.0115084915084934*G0_1_0_6_7 - 0.0242500356786112*G0_1_0_6_8 - 0.010960468103327*G0_1_0_6_9 - 0.0919968919969074*G0_1_0_7_0 - 0.0129851101279695*G0_1_0_7_1 + 0.00829646543932395*G0_1_0_7_2 + 0.0081061795347523*G0_1_0_7_3 - 0.0255287569573326*G0_1_0_7_4 - 0.0532267732267821*G0_1_0_7_5 - 0.0115084915084934*G0_1_0_7_6 + 0.372107892107955*G0_1_0_7_7 + 0.0652147852147963*G0_1_0_7_8 + 0.0901498501498652*G0_1_0_7_9 + 0.0332112332112388*G0_1_0_8_0 + 0.00234432234432271*G0_1_0_8_1 + 0.00634793777651026*G0_1_0_8_2 - 0.00244327101470009*G0_1_0_8_3 - 0.00566290852005231*G0_1_0_8_4 + 0.0647352647352756*G0_1_0_8_5 - 0.0242500356786112*G0_1_0_8_6 + 0.0652147852147963*G0_1_0_8_7 + 0.0131525617239922*G0_1_0_8_8 + 0.0408277436848934*G0_1_0_8_9 - 0.0223776223776262*G0_1_0_9_0 - 0.00983397554826295*G0_1_0_9_1 + 0.00544978830693205*G0_1_0_9_2 + 0.013289567575284*G0_1_0_9_3 - 0.0175367489653233*G0_1_0_9_4 - 0.062337662337673*G0_1_0_9_5 - 0.010960468103327*G0_1_0_9_6 + 0.0901498501498652*G0_1_0_9_7 + 0.0408277436848935*G0_1_0_9_8 + 0.00657628086199602*G0_1_0_9_9; + A[114] = A[142] + 0.195838729172096*G0_0_1_0_0 + 0.00578458578458679*G0_0_1_0_1 + 0.00337514337514393*G0_0_1_0_2 + 0.000597180597180625*G0_0_1_0_3 - 0.000255300255300288*G0_0_1_0_4 + 0.0192252192252224*G0_0_1_0_5 - 0.0144078144078168*G0_0_1_0_6 + 0.0608724608724712*G0_0_1_0_7 - 0.0265734265734311*G0_0_1_0_8 - 0.00293040293040333*G0_0_1_0_9 + 0.00578458578458678*G0_0_1_1_0 + 0.000523497666354886*G0_0_1_1_1 - 0.000380466094751881*G0_0_1_1_2 - 0.000148740148740176*G0_0_1_1_4 - 0.0016862502576791*G0_0_1_1_5 + 0.000874998017855303*G0_0_1_1_6 + 0.000847089418518147*G0_0_1_1_7 + 0.00141382427096737*G0_0_1_1_9 + 0.00337514337514393*G0_0_1_2_0 - 0.000380466094751882*G0_0_1_2_1 - 0.00312773646107038*G0_0_1_2_2 + 0.00121180406894716*G0_0_1_2_3 - 0.00179185893471645*G0_0_1_2_4 - 0.00725591868449136*G0_0_1_2_5 + 0.00236017950303705*G0_0_1_2_6 - 0.0054424940139235*G0_0_1_2_7 + 0.00065997494568935*G0_0_1_2_8 - 0.00183245326102501*G0_0_1_2_9 + 0.000597180597180625*G0_0_1_3_0 + 0.00121180406894716*G0_0_1_3_2 - 0.00307692307692375*G0_0_1_3_3 + 0.000545169116597839*G0_0_1_3_4 + 0.00079634651063232*G0_0_1_3_5 - 0.000950478093335376*G0_0_1_3_6 - 0.000117025831311563*G0_0_1_3_7 + 0.000422434708149088*G0_0_1_3_8 - 0.00400742115027895*G0_0_1_3_9 - 0.000255300255300288*G0_0_1_4_0 - 0.000148740148740176*G0_0_1_4_1 - 0.00179185893471645*G0_0_1_4_2 + 0.000545169116597838*G0_0_1_4_3 - 0.0107835022120758*G0_0_1_4_4 + 0.00244041672613147*G0_0_1_4_5 - 0.00148993863279607*G0_0_1_4_6 + 0.00770943342372045*G0_0_1_4_7 - 0.000305408876837515*G0_0_1_4_8 + 0.000616526330812111*G0_0_1_4_9 + 0.0192252192252224*G0_0_1_5_0 - 0.0016862502576791*G0_0_1_5_1 - 0.00725591868449136*G0_0_1_5_2 + 0.00079634651063232*G0_0_1_5_3 + 0.00244041672613146*G0_0_1_5_4 - 0.133706293706316*G0_0_1_5_5 + 0.0355044955045015*G0_0_1_5_6 - 0.0247352647352689*G0_0_1_5_7 + 0.00673326673326787*G0_0_1_5_8 - 0.00467532467532551*G0_0_1_5_9 - 0.0144078144078168*G0_0_1_6_0 + 0.000874998017855304*G0_0_1_6_1 + 0.00236017950303705*G0_0_1_6_2 - 0.000950478093335377*G0_0_1_6_3 - 0.00148993863279607*G0_0_1_6_4 + 0.0355044955045015*G0_0_1_6_5 - 0.0133295276152442*G0_0_1_6_6 + 0.018001998002001*G0_0_1_6_7 - 0.00313971742543225*G0_0_1_6_8 + 0.0073983159697458*G0_0_1_6_9 + 0.0608724608724712*G0_0_1_7_0 + 0.000847089418518148*G0_0_1_7_1 - 0.0054424940139235*G0_0_1_7_2 - 0.000117025831311563*G0_0_1_7_3 + 0.00770943342372045*G0_0_1_7_4 - 0.0247352647352689*G0_0_1_7_5 + 0.018001998002001*G0_0_1_7_6 - 0.142497502497527*G0_0_1_7_7 - 0.00517482517482605*G0_0_1_7_8 - 0.0272127872127918*G0_0_1_7_9 - 0.0265734265734311*G0_0_1_8_0 + 0.00065997494568935*G0_0_1_8_2 + 0.000422434708149088*G0_0_1_8_3 - 0.000305408876837514*G0_0_1_8_4 + 0.00673326673326787*G0_0_1_8_5 - 0.00313971742543225*G0_0_1_8_6 - 0.00517482517482605*G0_0_1_8_7 - 0.00389895818467305*G0_0_1_8_8 - 0.00363065505922708*G0_0_1_8_9 - 0.00293040293040333*G0_0_1_9_0 + 0.00141382427096736*G0_0_1_9_1 - 0.00183245326102501*G0_0_1_9_2 - 0.00400742115027895*G0_0_1_9_3 + 0.000616526330812106*G0_0_1_9_4 - 0.00467532467532551*G0_0_1_9_5 + 0.0073983159697458*G0_0_1_9_6 - 0.0272127872127918*G0_0_1_9_7 - 0.00363065505922708*G0_0_1_9_8 + 0.0355530184101673*G0_0_1_9_9 - 0.195838729172096*G0_1_0_0_0 - 0.00578458578458679*G0_1_0_0_1 - 0.00337514337514393*G0_1_0_0_2 - 0.000597180597180625*G0_1_0_0_3 + 0.000255300255300288*G0_1_0_0_4 - 0.0192252192252224*G0_1_0_0_5 + 0.0144078144078168*G0_1_0_0_6 - 0.0608724608724712*G0_1_0_0_7 + 0.0265734265734311*G0_1_0_0_8 + 0.00293040293040333*G0_1_0_0_9 - 0.00578458578458678*G0_1_0_1_0 - 0.000523497666354886*G0_1_0_1_1 + 0.000380466094751881*G0_1_0_1_2 + 0.000148740148740176*G0_1_0_1_4 + 0.0016862502576791*G0_1_0_1_5 - 0.000874998017855303*G0_1_0_1_6 - 0.000847089418518148*G0_1_0_1_7 - 0.00141382427096737*G0_1_0_1_9 - 0.00337514337514393*G0_1_0_2_0 + 0.000380466094751882*G0_1_0_2_1 + 0.00312773646107038*G0_1_0_2_2 - 0.00121180406894716*G0_1_0_2_3 + 0.00179185893471645*G0_1_0_2_4 + 0.00725591868449135*G0_1_0_2_5 - 0.00236017950303705*G0_1_0_2_6 + 0.0054424940139235*G0_1_0_2_7 - 0.00065997494568935*G0_1_0_2_8 + 0.00183245326102501*G0_1_0_2_9 - 0.000597180597180625*G0_1_0_3_0 - 0.00121180406894716*G0_1_0_3_2 + 0.00307692307692375*G0_1_0_3_3 - 0.000545169116597841*G0_1_0_3_4 - 0.000796346510632319*G0_1_0_3_5 + 0.000950478093335375*G0_1_0_3_6 + 0.000117025831311563*G0_1_0_3_7 - 0.000422434708149089*G0_1_0_3_8 + 0.00400742115027894*G0_1_0_3_9 + 0.000255300255300288*G0_1_0_4_0 + 0.000148740148740176*G0_1_0_4_1 + 0.00179185893471645*G0_1_0_4_2 - 0.00054516911659784*G0_1_0_4_3 + 0.0107835022120758*G0_1_0_4_4 - 0.00244041672613147*G0_1_0_4_5 + 0.00148993863279607*G0_1_0_4_6 - 0.00770943342372045*G0_1_0_4_7 + 0.000305408876837514*G0_1_0_4_8 - 0.00061652633081211*G0_1_0_4_9 - 0.0192252192252224*G0_1_0_5_0 + 0.0016862502576791*G0_1_0_5_1 + 0.00725591868449135*G0_1_0_5_2 - 0.000796346510632319*G0_1_0_5_3 - 0.00244041672613147*G0_1_0_5_4 + 0.133706293706316*G0_1_0_5_5 - 0.0355044955045015*G0_1_0_5_6 + 0.0247352647352689*G0_1_0_5_7 - 0.00673326673326787*G0_1_0_5_8 + 0.0046753246753255*G0_1_0_5_9 + 0.0144078144078168*G0_1_0_6_0 - 0.000874998017855303*G0_1_0_6_1 - 0.00236017950303705*G0_1_0_6_2 + 0.000950478093335377*G0_1_0_6_3 + 0.00148993863279607*G0_1_0_6_4 - 0.0355044955045015*G0_1_0_6_5 + 0.0133295276152442*G0_1_0_6_6 - 0.018001998002001*G0_1_0_6_7 + 0.00313971742543225*G0_1_0_6_8 - 0.0073983159697458*G0_1_0_6_9 - 0.0608724608724712*G0_1_0_7_0 - 0.000847089418518149*G0_1_0_7_1 + 0.0054424940139235*G0_1_0_7_2 + 0.000117025831311563*G0_1_0_7_3 - 0.00770943342372045*G0_1_0_7_4 + 0.0247352647352689*G0_1_0_7_5 - 0.018001998002001*G0_1_0_7_6 + 0.142497502497526*G0_1_0_7_7 + 0.00517482517482605*G0_1_0_7_8 + 0.0272127872127918*G0_1_0_7_9 + 0.0265734265734311*G0_1_0_8_0 - 0.00065997494568935*G0_1_0_8_2 - 0.000422434708149089*G0_1_0_8_3 + 0.000305408876837514*G0_1_0_8_4 - 0.00673326673326786*G0_1_0_8_5 + 0.00313971742543225*G0_1_0_8_6 + 0.00517482517482605*G0_1_0_8_7 + 0.00389895818467305*G0_1_0_8_8 + 0.00363065505922708*G0_1_0_8_9 + 0.00293040293040333*G0_1_0_9_0 - 0.00141382427096737*G0_1_0_9_1 + 0.00183245326102501*G0_1_0_9_2 + 0.00400742115027895*G0_1_0_9_3 - 0.000616526330812103*G0_1_0_9_4 + 0.0046753246753255*G0_1_0_9_5 - 0.0073983159697458*G0_1_0_9_6 + 0.0272127872127918*G0_1_0_9_7 + 0.00363065505922708*G0_1_0_9_8 - 0.0355530184101673*G0_1_0_9_9; + A[196] = A[28] - 0.00151284341760555*G0_0_1_0_0 - 0.00231632564965937*G0_0_1_0_1 + 0.00044955044955054*G0_0_1_0_3 - 0.000520431949003474*G0_0_1_0_4 - 0.000586873444016383*G0_0_1_0_5 + 0.000544851973423483*G0_0_1_0_6 + 0.00243106100248999*G0_0_1_0_7 - 0.00889332889333041*G0_0_1_0_8 - 0.00207601921887671*G0_0_1_0_9 - 0.00231632564965937*G0_0_1_1_0 + 0.00231632564965938*G0_0_1_1_2 + 0.0381840381840447*G0_0_1_1_3 - 0.0118992118992139*G0_0_1_1_4 - 0.000502830502830573*G0_0_1_1_5 + 0.000502830502830572*G0_0_1_1_6 + 0.0118992118992139*G0_0_1_1_7 - 0.0381840381840446*G0_0_1_1_8 + 0.00231632564965938*G0_0_1_2_1 + 0.00151284341760555*G0_0_1_2_2 + 0.0088933288933304*G0_0_1_2_3 - 0.00243106100248998*G0_0_1_2_4 - 0.000544851973423484*G0_0_1_2_5 + 0.000586873444016376*G0_0_1_2_6 + 0.000520431949003459*G0_0_1_2_7 - 0.000449550449550505*G0_0_1_2_8 + 0.00207601921887672*G0_0_1_2_9 + 0.00044955044955054*G0_0_1_3_0 + 0.0381840381840447*G0_0_1_3_1 + 0.0088933288933304*G0_0_1_3_2 + 0.0998001998002168*G0_0_1_3_3 - 0.0445054945055021*G0_0_1_3_4 - 0.00150849150849178*G0_0_1_3_6 - 0.00134865134865162*G0_0_1_3_7 + 0.00269730269730323*G0_0_1_3_9 - 0.000520431949003474*G0_0_1_4_0 - 0.0118992118992139*G0_0_1_4_1 - 0.00243106100248998*G0_0_1_4_2 - 0.0445054945055021*G0_0_1_4_3 + 0.00755244755244883*G0_0_1_4_4 + 0.00156129584701039*G0_0_1_4_5 + 0.00134865134865152*G0_0_1_4_8 - 0.00935064935065098*G0_0_1_4_9 - 0.000586873444016383*G0_0_1_5_0 - 0.000502830502830572*G0_0_1_5_1 - 0.000544851973423483*G0_0_1_5_2 + 0.00156129584701039*G0_0_1_5_4 - 0.00235478806907419*G0_0_1_5_5 + 0.0015084915084918*G0_0_1_5_8 + 0.00321107463964661*G0_0_1_5_9 + 0.000544851973423483*G0_0_1_6_0 + 0.000502830502830573*G0_0_1_6_1 + 0.000586873444016376*G0_0_1_6_2 - 0.00150849150849178*G0_0_1_6_3 + 0.00235478806907413*G0_0_1_6_6 - 0.00156129584701038*G0_0_1_6_7 - 0.00321107463964663*G0_0_1_6_9 + 0.00243106100248999*G0_0_1_7_0 + 0.0118992118992139*G0_0_1_7_1 + 0.000520431949003459*G0_0_1_7_2 - 0.00134865134865162*G0_0_1_7_3 - 0.00156129584701038*G0_0_1_7_6 - 0.00755244755244884*G0_0_1_7_7 + 0.044505494505502*G0_0_1_7_8 + 0.00935064935065092*G0_0_1_7_9 - 0.00889332889333041*G0_0_1_8_0 - 0.0381840381840446*G0_0_1_8_1 - 0.000449550449550505*G0_0_1_8_2 + 0.00134865134865152*G0_0_1_8_4 + 0.0015084915084918*G0_0_1_8_5 + 0.044505494505502*G0_0_1_8_7 - 0.0998001998002165*G0_0_1_8_8 - 0.00269730269730309*G0_0_1_8_9 - 0.00207601921887671*G0_0_1_9_0 + 0.00207601921887672*G0_0_1_9_2 + 0.00269730269730323*G0_0_1_9_3 - 0.00935064935065098*G0_0_1_9_4 + 0.00321107463964661*G0_0_1_9_5 - 0.00321107463964663*G0_0_1_9_6 + 0.00935064935065092*G0_0_1_9_7 - 0.00269730269730309*G0_0_1_9_8 + 0.00151284341760555*G0_1_0_0_0 + 0.00231632564965937*G0_1_0_0_1 - 0.00044955044955054*G0_1_0_0_3 + 0.000520431949003474*G0_1_0_0_4 + 0.000586873444016382*G0_1_0_0_5 - 0.000544851973423483*G0_1_0_0_6 - 0.00243106100248999*G0_1_0_0_7 + 0.00889332889333041*G0_1_0_0_8 + 0.00207601921887671*G0_1_0_0_9 + 0.00231632564965937*G0_1_0_1_0 - 0.00231632564965938*G0_1_0_1_2 - 0.0381840381840447*G0_1_0_1_3 + 0.0118992118992139*G0_1_0_1_4 + 0.000502830502830573*G0_1_0_1_5 - 0.000502830502830572*G0_1_0_1_6 - 0.0118992118992139*G0_1_0_1_7 + 0.0381840381840446*G0_1_0_1_8 - 0.00231632564965938*G0_1_0_2_1 - 0.00151284341760555*G0_1_0_2_2 - 0.0088933288933304*G0_1_0_2_3 + 0.00243106100248998*G0_1_0_2_4 + 0.000544851973423484*G0_1_0_2_5 - 0.000586873444016376*G0_1_0_2_6 - 0.000520431949003459*G0_1_0_2_7 + 0.000449550449550505*G0_1_0_2_8 - 0.00207601921887672*G0_1_0_2_9 - 0.00044955044955054*G0_1_0_3_0 - 0.0381840381840447*G0_1_0_3_1 - 0.0088933288933304*G0_1_0_3_2 - 0.0998001998002168*G0_1_0_3_3 + 0.0445054945055021*G0_1_0_3_4 + 0.00150849150849178*G0_1_0_3_6 + 0.00134865134865162*G0_1_0_3_7 - 0.00269730269730323*G0_1_0_3_9 + 0.000520431949003474*G0_1_0_4_0 + 0.0118992118992139*G0_1_0_4_1 + 0.00243106100248998*G0_1_0_4_2 + 0.0445054945055021*G0_1_0_4_3 - 0.00755244755244884*G0_1_0_4_4 - 0.00156129584701039*G0_1_0_4_5 - 0.00134865134865152*G0_1_0_4_8 + 0.00935064935065097*G0_1_0_4_9 + 0.000586873444016382*G0_1_0_5_0 + 0.000502830502830572*G0_1_0_5_1 + 0.000544851973423483*G0_1_0_5_2 - 0.00156129584701039*G0_1_0_5_4 + 0.00235478806907419*G0_1_0_5_5 - 0.0015084915084918*G0_1_0_5_8 - 0.00321107463964661*G0_1_0_5_9 - 0.000544851973423482*G0_1_0_6_0 - 0.000502830502830572*G0_1_0_6_1 - 0.000586873444016376*G0_1_0_6_2 + 0.00150849150849178*G0_1_0_6_3 - 0.00235478806907413*G0_1_0_6_6 + 0.00156129584701038*G0_1_0_6_7 + 0.00321107463964663*G0_1_0_6_9 - 0.00243106100248999*G0_1_0_7_0 - 0.0118992118992139*G0_1_0_7_1 - 0.000520431949003459*G0_1_0_7_2 + 0.00134865134865162*G0_1_0_7_3 + 0.00156129584701038*G0_1_0_7_6 + 0.00755244755244884*G0_1_0_7_7 - 0.044505494505502*G0_1_0_7_8 - 0.00935064935065092*G0_1_0_7_9 + 0.00889332889333041*G0_1_0_8_0 + 0.0381840381840446*G0_1_0_8_1 + 0.000449550449550505*G0_1_0_8_2 - 0.00134865134865152*G0_1_0_8_4 - 0.0015084915084918*G0_1_0_8_5 - 0.044505494505502*G0_1_0_8_7 + 0.0998001998002165*G0_1_0_8_8 + 0.00269730269730309*G0_1_0_8_9 + 0.00207601921887671*G0_1_0_9_0 - 0.00207601921887672*G0_1_0_9_2 - 0.00269730269730323*G0_1_0_9_3 + 0.00935064935065097*G0_1_0_9_4 - 0.00321107463964661*G0_1_0_9_5 + 0.00321107463964663*G0_1_0_9_6 - 0.00935064935065092*G0_1_0_9_7 + 0.00269730269730309*G0_1_0_9_8; + A[13] = A[195] + 0.000801544134877591*G0_0_1_0_1 - 0.000797104130437617*G0_0_1_0_2 - 0.000498390498390587*G0_0_1_0_3 + 0.000493950493950585*G0_0_1_0_4 - 0.010966810966813*G0_0_1_0_5 + 0.0027528027528033*G0_0_1_0_6 + 0.0109668109668127*G0_0_1_0_7 - 0.00674880674880782*G0_0_1_0_8 + 0.00399600399600466*G0_0_1_0_9 + 0.000801544134877591*G0_0_1_1_0 + 0.00237293570626944*G0_0_1_1_1 + 0.000945562374133957*G0_0_1_1_3 - 0.000133992991135877*G0_0_1_1_5 + 0.000287014572728912*G0_0_1_1_6 + 0.00223522509236831*G0_0_1_1_7 - 0.00435770578627794*G0_0_1_1_8 - 0.00133390419104727*G0_0_1_1_9 - 0.000797104130437617*G0_0_1_2_0 + 0.000273025034929841*G0_0_1_2_2 + 0.000216291644863111*G0_0_1_2_3 - 0.000408321836893336*G0_0_1_2_4 - 0.00222697936983691*G0_0_1_2_5 - 0.00142825428539737*G0_0_1_2_6 + 0.00124462838748573*G0_0_1_2_7 - 0.00139891854177591*G0_0_1_2_8 - 0.00371628371628435*G0_0_1_2_9 - 0.000498390498390587*G0_0_1_3_0 + 0.00094556237413396*G0_0_1_3_1 + 0.00021629164486311*G0_0_1_3_2 - 0.000299700299700403*G0_0_1_3_3 - 0.00102754388468691*G0_0_1_3_4 + 0.000685029256457946*G0_0_1_3_5 - 0.000333951762523257*G0_0_1_3_6 + 0.00202226345083522*G0_0_1_3_7 - 0.00674611103182645*G0_0_1_3_8 + 0.000493950493950586*G0_0_1_4_0 - 0.000408321836893336*G0_0_1_4_2 - 0.00102754388468692*G0_0_1_4_3 - 0.00175538746967347*G0_0_1_4_4 - 0.000954759526188264*G0_0_1_4_5 + 0.00128871128871152*G0_0_1_4_6 - 0.00287141429998621*G0_0_1_4_7 + 0.00472384758099123*G0_0_1_4_8 + 0.0130583702012296*G0_0_1_4_9 - 0.010966810966813*G0_0_1_5_0 - 0.000133992991135877*G0_0_1_5_1 - 0.00222697936983691*G0_0_1_5_2 + 0.000685029256457947*G0_0_1_5_3 - 0.000954759526188264*G0_0_1_5_4 - 0.0317482517482572*G0_0_1_5_5 + 0.0173126873126903*G0_0_1_5_6 + 0.00227772227772258*G0_0_1_5_7 + 0.000929070929071128*G0_0_1_5_8 - 0.0138461538461562*G0_0_1_5_9 + 0.0027528027528033*G0_0_1_6_0 + 0.000287014572728912*G0_0_1_6_1 - 0.00142825428539737*G0_0_1_6_2 - 0.000333951762523257*G0_0_1_6_3 + 0.00128871128871152*G0_0_1_6_4 + 0.0173126873126903*G0_0_1_6_5 - 0.010383901812475*G0_0_1_6_6 - 0.0032067932067937*G0_0_1_6_7 + 0.00140430997573875*G0_0_1_6_8 + 0.0118167546738996*G0_0_1_6_9 + 0.0109668109668127*G0_0_1_7_0 + 0.00223522509236831*G0_0_1_7_1 + 0.00124462838748573*G0_0_1_7_2 + 0.00202226345083522*G0_0_1_7_3 - 0.00287141429998621*G0_0_1_7_4 + 0.00227772227772258*G0_0_1_7_5 - 0.0032067932067937*G0_0_1_7_6 + 0.0271928071928116*G0_0_1_7_7 + 0.0043856143856152*G0_0_1_7_8 - 0.00557442557442655*G0_0_1_7_9 - 0.00674880674880782*G0_0_1_8_0 - 0.00435770578627794*G0_0_1_8_1 - 0.00139891854177591*G0_0_1_8_2 - 0.00674611103182645*G0_0_1_8_3 + 0.00472384758099123*G0_0_1_8_4 + 0.000929070929071128*G0_0_1_8_5 + 0.00140430997573875*G0_0_1_8_6 + 0.0043856143856152*G0_0_1_8_7 - 0.0318824033109802*G0_0_1_8_8 - 0.00544598258884066*G0_0_1_8_9 + 0.00399600399600466*G0_0_1_9_0 - 0.00133390419104727*G0_0_1_9_1 - 0.00371628371628435*G0_0_1_9_2 + 0.0130583702012296*G0_0_1_9_4 - 0.0138461538461562*G0_0_1_9_5 + 0.0118167546738996*G0_0_1_9_6 - 0.00557442557442655*G0_0_1_9_7 - 0.00544598258884066*G0_0_1_9_8 + 0.0267161410018598*G0_0_1_9_9 - 0.000801544134877591*G0_1_0_0_1 + 0.000797104130437617*G0_1_0_0_2 + 0.000498390498390587*G0_1_0_0_3 - 0.000493950493950586*G0_1_0_0_4 + 0.010966810966813*G0_1_0_0_5 - 0.0027528027528033*G0_1_0_0_6 - 0.0109668109668127*G0_1_0_0_7 + 0.00674880674880783*G0_1_0_0_8 - 0.00399600399600466*G0_1_0_0_9 - 0.000801544134877591*G0_1_0_1_0 - 0.00237293570626944*G0_1_0_1_1 - 0.000945562374133953*G0_1_0_1_3 + 0.000133992991135877*G0_1_0_1_5 - 0.000287014572728912*G0_1_0_1_6 - 0.00223522509236831*G0_1_0_1_7 + 0.00435770578627794*G0_1_0_1_8 + 0.00133390419104727*G0_1_0_1_9 + 0.000797104130437617*G0_1_0_2_0 - 0.000273025034929841*G0_1_0_2_2 - 0.000216291644863109*G0_1_0_2_3 + 0.000408321836893336*G0_1_0_2_4 + 0.00222697936983691*G0_1_0_2_5 + 0.00142825428539737*G0_1_0_2_6 - 0.00124462838748573*G0_1_0_2_7 + 0.00139891854177591*G0_1_0_2_8 + 0.00371628371628435*G0_1_0_2_9 + 0.000498390498390588*G0_1_0_3_0 - 0.000945562374133957*G0_1_0_3_1 - 0.000216291644863109*G0_1_0_3_2 + 0.000299700299700431*G0_1_0_3_3 + 0.00102754388468692*G0_1_0_3_4 - 0.000685029256457947*G0_1_0_3_5 + 0.000333951762523257*G0_1_0_3_6 - 0.00202226345083522*G0_1_0_3_7 + 0.00674611103182645*G0_1_0_3_8 - 0.000493950493950585*G0_1_0_4_0 + 0.000408321836893336*G0_1_0_4_2 + 0.00102754388468692*G0_1_0_4_3 + 0.00175538746967347*G0_1_0_4_4 + 0.000954759526188264*G0_1_0_4_5 - 0.00128871128871152*G0_1_0_4_6 + 0.00287141429998621*G0_1_0_4_7 - 0.00472384758099123*G0_1_0_4_8 - 0.0130583702012296*G0_1_0_4_9 + 0.010966810966813*G0_1_0_5_0 + 0.000133992991135877*G0_1_0_5_1 + 0.00222697936983691*G0_1_0_5_2 - 0.000685029256457947*G0_1_0_5_3 + 0.000954759526188264*G0_1_0_5_4 + 0.0317482517482572*G0_1_0_5_5 - 0.0173126873126903*G0_1_0_5_6 - 0.00227772227772258*G0_1_0_5_7 - 0.000929070929071128*G0_1_0_5_8 + 0.0138461538461562*G0_1_0_5_9 - 0.0027528027528033*G0_1_0_6_0 - 0.000287014572728912*G0_1_0_6_1 + 0.00142825428539737*G0_1_0_6_2 + 0.000333951762523257*G0_1_0_6_3 - 0.00128871128871152*G0_1_0_6_4 - 0.0173126873126903*G0_1_0_6_5 + 0.010383901812475*G0_1_0_6_6 + 0.0032067932067937*G0_1_0_6_7 - 0.00140430997573875*G0_1_0_6_8 - 0.0118167546738996*G0_1_0_6_9 - 0.0109668109668127*G0_1_0_7_0 - 0.00223522509236831*G0_1_0_7_1 - 0.00124462838748573*G0_1_0_7_2 - 0.00202226345083522*G0_1_0_7_3 + 0.00287141429998621*G0_1_0_7_4 - 0.00227772227772258*G0_1_0_7_5 + 0.0032067932067937*G0_1_0_7_6 - 0.0271928071928116*G0_1_0_7_7 - 0.0043856143856152*G0_1_0_7_8 + 0.00557442557442656*G0_1_0_7_9 + 0.00674880674880783*G0_1_0_8_0 + 0.00435770578627794*G0_1_0_8_1 + 0.00139891854177591*G0_1_0_8_2 + 0.00674611103182645*G0_1_0_8_3 - 0.00472384758099123*G0_1_0_8_4 - 0.000929070929071128*G0_1_0_8_5 - 0.00140430997573875*G0_1_0_8_6 - 0.0043856143856152*G0_1_0_8_7 + 0.0318824033109802*G0_1_0_8_8 + 0.00544598258884066*G0_1_0_8_9 - 0.00399600399600466*G0_1_0_9_0 + 0.00133390419104727*G0_1_0_9_1 + 0.00371628371628435*G0_1_0_9_2 - 0.0130583702012296*G0_1_0_9_4 + 0.0138461538461562*G0_1_0_9_5 - 0.0118167546738996*G0_1_0_9_6 + 0.00557442557442656*G0_1_0_9_7 + 0.00544598258884066*G0_1_0_9_8 - 0.0267161410018598*G0_1_0_9_9; + A[53] = -A[173] - 0.00245257388114574*G0_0_0_0_0 - 0.00012699822223634*G0_0_0_0_1 - 0.00795324604848549*G0_0_0_0_2 + 0.0023912595341171*G0_0_0_0_4 + 0.00142925857211595*G0_0_0_0_5 - 0.0101058729630175*G0_0_0_0_6 - 0.000287543144686061*G0_0_0_0_7 - 0.000385223242366162*G0_0_0_0_8 + 0.00125081267938433*G0_0_0_0_9 - 0.00012699822223634*G0_0_0_1_0 + 0.00284160284160324*G0_0_0_1_1 - 0.00305993829803405*G0_0_0_1_2 - 0.000503200503200611*G0_0_0_1_3 + 0.00359048359048423*G0_0_0_1_4 + 0.000795395081109497*G0_0_0_1_5 - 0.00363699792271282*G0_0_0_1_6 + 0.000121360121360146*G0_0_0_1_7 + 0.00059200059200067*G0_0_0_1_8 + 0.00143856143856169*G0_0_0_1_9 - 0.00795324604848549*G0_0_0_2_0 - 0.00305993829803405*G0_0_0_2_1 - 0.125800125800147*G0_0_0_2_2 + 0.0125089725089745*G0_0_0_2_3 - 0.0207555407555441*G0_0_0_2_4 + 0.0359048359048419*G0_0_0_2_5 - 0.0861597661597805*G0_0_0_2_6 + 0.00138147566719017*G0_0_0_2_7 - 0.000511234796949175*G0_0_0_2_8 - 0.00667776667776776*G0_0_0_2_9 - 0.000503200503200612*G0_0_0_3_1 + 0.0125089725089745*G0_0_0_3_2 + 0.00905760905761057*G0_0_0_3_3 - 0.0179667951096554*G0_0_0_3_4 - 0.00215403643975104*G0_0_0_3_5 + 0.0129051900480492*G0_0_0_3_6 + 0.00206650492364813*G0_0_0_3_7 - 0.00559440559440649*G0_0_0_3_8 - 0.00844869416298131*G0_0_0_3_9 + 0.0023912595341171*G0_0_0_4_0 + 0.00359048359048423*G0_0_0_4_1 - 0.0207555407555441*G0_0_0_4_2 - 0.0179667951096554*G0_0_0_4_3 + 0.0862604062604209*G0_0_0_4_4 - 0.0051795823224404*G0_0_0_4_5 - 0.00772560772560886*G0_0_0_4_6 - 0.00665620094191635*G0_0_0_4_7 + 0.00352790067075836*G0_0_0_4_8 + 0.0303924646781841*G0_0_0_4_9 + 0.00142925857211595*G0_0_0_5_0 + 0.000795395081109497*G0_0_0_5_1 + 0.0359048359048419*G0_0_0_5_2 - 0.00215403643975104*G0_0_0_5_3 - 0.00517958232244041*G0_0_0_5_4 - 0.0166690452404766*G0_0_0_5_5 + 0.0559554730983396*G0_0_0_5_6 + 0.00254221968507725*G0_0_0_5_7 - 0.000391988963417586*G0_0_0_5_8 - 0.00296846011131781*G0_0_0_5_9 - 0.0101058729630175*G0_0_0_6_0 - 0.00363699792271282*G0_0_0_6_1 - 0.0861597661597805*G0_0_0_6_2 + 0.0129051900480492*G0_0_0_6_3 - 0.00772560772560887*G0_0_0_6_4 + 0.0559554730983396*G0_0_0_6_5 - 0.201878121878156*G0_0_0_6_6 - 0.00215023072165968*G0_0_0_6_7 + 0.00522525093953747*G0_0_0_6_8 - 0.00577708006279518*G0_0_0_6_9 - 0.000287543144686061*G0_0_0_7_0 + 0.000121360121360146*G0_0_0_7_1 + 0.00138147566719017*G0_0_0_7_2 + 0.00206650492364813*G0_0_0_7_3 - 0.00665620094191635*G0_0_0_7_4 + 0.00254221968507725*G0_0_0_7_5 - 0.00215023072165968*G0_0_0_7_6 + 0.00464297607154826*G0_0_0_7_7 + 0.00102373816659548*G0_0_0_7_8 + 0.000548023405166332*G0_0_0_7_9 - 0.000385223242366163*G0_0_0_8_0 + 0.00059200059200067*G0_0_0_8_1 - 0.000511234796949175*G0_0_0_8_2 - 0.00559440559440649*G0_0_0_8_3 + 0.00352790067075836*G0_0_0_8_4 - 0.000391988963417586*G0_0_0_8_5 + 0.00522525093953747*G0_0_0_8_6 + 0.00102373816659548*G0_0_0_8_7 - 0.0170496170496197*G0_0_0_8_8 - 0.0113714856572018*G0_0_0_8_9 + 0.00125081267938433*G0_0_0_9_0 + 0.00143856143856169*G0_0_0_9_1 - 0.00667776667776776*G0_0_0_9_2 - 0.00844869416298131*G0_0_0_9_3 + 0.0303924646781841*G0_0_0_9_4 - 0.00296846011131781*G0_0_0_9_5 - 0.00577708006279518*G0_0_0_9_6 + 0.000548023405166332*G0_0_0_9_7 - 0.0113714856572018*G0_0_0_9_8 + 0.00438418724133084*G0_0_0_9_9 + 0.0223759309473635*G0_0_1_0_0 - 0.000180419228038308*G0_0_1_0_1 - 0.0034990054037679*G0_0_1_0_2 - 0.000383954669669037*G0_0_1_0_3 + 0.000402560402560478*G0_0_1_0_4 - 0.00427424427424497*G0_0_1_0_5 - 0.00379091807663299*G0_0_1_0_6 - 0.00268260839689449*G0_0_1_0_7 - 0.00178319035461925*G0_0_1_0_8 - 0.00931386074243373*G0_0_1_0_9 - 0.000180419228038309*G0_0_1_1_0 - 0.00156598251836374*G0_0_1_1_2 + 0.000592000592000608*G0_0_1_1_3 + 0.00122205836491573*G0_0_1_1_5 + 0.000524343381486322*G0_0_1_1_6 - 0.0016753616753619*G0_0_1_1_7 - 0.000592000592000802*G0_0_1_1_8 + 0.00166944166944193*G0_0_1_1_9 - 0.0034990054037679*G0_0_1_2_0 - 0.00156598251836374*G0_0_1_2_1 - 0.0935558268891759*G0_0_1_2_2 + 0.00540538826253198*G0_0_1_2_3 - 0.0109934509934528*G0_0_1_2_4 + 0.0124738753310202*G0_0_1_2_5 - 0.0361061161061221*G0_0_1_2_6 + 0.00119922405636711*G0_0_1_2_7 - 0.0011070411070413*G0_0_1_2_8 + 0.000662194947909384*G0_0_1_2_9 - 0.000383954669669037*G0_0_1_3_0 + 0.000592000592000608*G0_0_1_3_1 + 0.00540538826253197*G0_0_1_3_2 - 0.0111888111888133*G0_0_1_3_3 + 0.00283145426002614*G0_0_1_3_4 - 0.00300271157414065*G0_0_1_3_5 + 0.00191808191808229*G0_0_1_3_6 + 0.0046429760715483*G0_0_1_3_7 - 0.0114552114552134*G0_0_1_3_8 - 0.0142942771514224*G0_0_1_3_9 + 0.000402560402560478*G0_0_1_4_0 - 0.0109934509934528*G0_0_1_4_2 + 0.00283145426002613*G0_0_1_4_3 + 0.0366490652205001*G0_0_1_4_4 + 0.00228343085485979*G0_0_1_4_5 - 0.00420151277294206*G0_0_1_4_6 - 0.00414823271966199*G0_0_1_4_7 + 0.0068122353836651*G0_0_1_4_8 - 0.00655344655344774*G0_0_1_4_9 - 0.00427424427424497*G0_0_1_5_0 + 0.00122205836491573*G0_0_1_5_1 + 0.0124738753310202*G0_0_1_5_2 - 0.00300271157414065*G0_0_1_5_3 + 0.00228343085485979*G0_0_1_5_4 - 0.0397088625660119*G0_0_1_5_5 + 0.035393178250327*G0_0_1_5_6 + 0.000281623138766095*G0_0_1_5_7 - 0.000175063032205953*G0_0_1_5_8 + 0.0282917082917131*G0_0_1_5_9 - 0.00379091807663299*G0_0_1_6_0 + 0.000524343381486322*G0_0_1_6_1 - 0.0361061161061221*G0_0_1_6_2 + 0.00191808191808229*G0_0_1_6_3 - 0.00420151277294206*G0_0_1_6_4 + 0.035393178250327*G0_0_1_6_5 + 0.110495219066666*G0_0_1_6_6 - 0.000106560106560122*G0_0_1_6_7 - 0.000871509442938116*G0_0_1_6_8 - 0.00582274867989271*G0_0_1_6_9 - 0.00268260839689449*G0_0_1_7_0 - 0.0016753616753619*G0_0_1_7_1 + 0.00119922405636711*G0_0_1_7_2 + 0.0046429760715483*G0_0_1_7_3 - 0.00414823271966199*G0_0_1_7_4 + 0.000281623138766095*G0_0_1_7_5 - 0.000106560106560123*G0_0_1_7_6 - 0.030453356167647*G0_0_1_7_7 + 0.0186404072118389*G0_0_1_7_8 + 0.0281547024404215*G0_0_1_7_9 - 0.00178319035461925*G0_0_1_8_0 - 0.000592000592000803*G0_0_1_8_1 - 0.0011070411070413*G0_0_1_8_2 - 0.0114552114552134*G0_0_1_8_3 + 0.0068122353836651*G0_0_1_8_4 - 0.000175063032205954*G0_0_1_8_5 - 0.000871509442938115*G0_0_1_8_6 + 0.0186404072118389*G0_0_1_8_7 + 0.03409923409924*G0_0_1_8_8 - 0.018632795775656*G0_0_1_8_9 - 0.00931386074243373*G0_0_1_9_0 + 0.00166944166944193*G0_0_1_9_1 + 0.000662194947909384*G0_0_1_9_2 - 0.0142942771514224*G0_0_1_9_3 - 0.00655344655344775*G0_0_1_9_4 + 0.0282917082917131*G0_0_1_9_5 - 0.00582274867989271*G0_0_1_9_6 + 0.0281547024404215*G0_0_1_9_7 - 0.018632795775656*G0_0_1_9_8 - 0.0411017553874767*G0_0_1_9_9; + A[51] = -A[53] - 0.00414625938435534*G0_0_0_0_0 - 0.000823726538012391*G0_0_0_0_1 - 0.0085028199313928*G0_0_0_0_2 - 0.00145209288066459*G0_0_0_0_3 + 0.0017015788444363*G0_0_0_0_4 - 0.00335833478690679*G0_0_0_0_5 - 0.00501762787477158*G0_0_0_0_6 - 0.0015307443878875*G0_0_0_0_7 + 0.000750149321578023*G0_0_0_0_8 - 0.00137513280370448*G0_0_0_0_9 - 0.000823726538012391*G0_0_0_1_0 - 0.00548587215253974*G0_0_0_1_1 - 0.00491134967325526*G0_0_0_1_2 - 0.0112184112184132*G0_0_0_1_3 + 0.00943902658188537*G0_0_0_1_4 - 0.000432160432160491*G0_0_0_1_5 - 0.00341330627044971*G0_0_0_1_6 + 0.00221661935947688*G0_0_0_1_7 - 0.00339808339808396*G0_0_0_1_8 - 0.00213627642199107*G0_0_0_1_9 - 0.0085028199313928*G0_0_0_2_0 - 0.00491134967325526*G0_0_0_2_1 - 0.151646871646897*G0_0_0_2_2 + 0.0144008372579824*G0_0_0_2_3 - 0.0242957042957082*G0_0_0_2_4 + 0.0350024578596065*G0_0_0_2_5 - 0.0804173604173738*G0_0_0_2_6 + 0.00128041270898434*G0_0_0_2_7 + 0.000214811643383091*G0_0_0_2_8 - 0.00194852766281366*G0_0_0_2_9 - 0.00145209288066459*G0_0_0_3_0 - 0.0112184112184132*G0_0_0_3_1 + 0.0144008372579824*G0_0_0_3_2 - 0.0892364778079222*G0_0_0_3_3 - 0.0158926787498243*G0_0_0_3_4 + 0.0014613957471103*G0_0_0_3_5 + 0.0129698872556036*G0_0_0_3_6 + 0.00708624708624835*G0_0_0_3_7 - 0.00917178060035363*G0_0_0_3_8 - 0.00776366490652354*G0_0_0_3_9 + 0.0017015788444363*G0_0_0_4_0 + 0.00943902658188537*G0_0_0_4_1 - 0.0242957042957082*G0_0_0_4_2 - 0.0158926787498243*G0_0_0_4_3 + 0.100744969316415*G0_0_0_4_4 - 0.00237476808905426*G0_0_0_4_5 - 0.0105951191665494*G0_0_0_4_6 - 0.00583797155225826*G0_0_0_4_7 + 0.00208553351410528*G0_0_0_4_8 + 0.0105951191665495*G0_0_0_4_9 - 0.00335833478690679*G0_0_0_5_0 - 0.000432160432160491*G0_0_0_5_1 + 0.0350024578596065*G0_0_0_5_2 + 0.0014613957471103*G0_0_0_5_3 - 0.00237476808905426*G0_0_0_5_4 - 0.1058598544313*G0_0_0_5_5 + 0.0442072213500858*G0_0_0_5_6 - 0.00291518005803762*G0_0_0_5_7 + 0.0040264497407361*G0_0_0_5_8 - 0.0039275010703588*G0_0_0_5_9 - 0.00501762787477159*G0_0_0_6_0 - 0.00341330627044971*G0_0_0_6_1 - 0.0804173604173738*G0_0_0_6_2 + 0.0129698872556036*G0_0_0_6_3 - 0.0105951191665494*G0_0_0_6_4 + 0.0442072213500858*G0_0_0_6_5 - 0.142212073640669*G0_0_0_6_6 - 0.00111126968269847*G0_0_0_6_7 + 0.00343275771847256*G0_0_0_6_8 - 0.0200941915227663*G0_0_0_6_9 - 0.0015307443878875*G0_0_0_7_0 + 0.00221661935947688*G0_0_0_7_1 + 0.00128041270898434*G0_0_0_7_2 + 0.00708624708624835*G0_0_0_7_3 - 0.00583797155225826*G0_0_0_7_4 - 0.00291518005803762*G0_0_0_7_5 - 0.00111126968269847*G0_0_0_7_6 + 0.00610437181865859*G0_0_0_7_7 - 0.00101993244850409*G0_0_0_7_8 + 0.00634793777651034*G0_0_0_7_9 + 0.000750149321578023*G0_0_0_8_0 - 0.00339808339808396*G0_0_0_8_1 + 0.000214811643383091*G0_0_0_8_2 - 0.00917178060035363*G0_0_0_8_3 + 0.00208553351410528*G0_0_0_8_4 + 0.0040264497407361*G0_0_0_8_5 + 0.00343275771847256*G0_0_0_8_6 - 0.00101993244850409*G0_0_0_8_7 - 0.00238999096141981*G0_0_0_8_8 + 0.0022377622377626*G0_0_0_8_9 - 0.00137513280370448*G0_0_0_9_0 - 0.00213627642199107*G0_0_0_9_1 - 0.00194852766281366*G0_0_0_9_2 - 0.00776366490652354*G0_0_0_9_3 + 0.0105951191665495*G0_0_0_9_4 - 0.0039275010703588*G0_0_0_9_5 - 0.0200941915227663*G0_0_0_9_6 + 0.00634793777651034*G0_0_0_9_7 + 0.0022377622377626*G0_0_0_9_8 + 0.0032881404309981*G0_0_0_9_9 + 0.00343134819325362*G0_0_1_0_0 - 0.000345051773623254*G0_0_1_0_1 - 0.00358611406230514*G0_0_1_0_2 - 0.000725623582766577*G0_0_1_0_3 - 0.000497280497280578*G0_0_1_0_4 + 0.00125588697017291*G0_0_1_0_5 - 0.00105798962941837*G0_0_1_0_6 + 0.000535337678194909*G0_0_1_0_8 - 0.00497787926359441*G0_0_1_0_9 - 0.000345051773623255*G0_0_1_1_0 - 0.00327573660907042*G0_0_1_1_1 - 0.00303245255626258*G0_0_1_1_2 - 0.00809856809856945*G0_0_1_1_3 + 0.00551067979639501*G0_0_1_1_4 + 0.000301920301920365*G0_0_1_1_5 + 0.000431314717029073*G0_0_1_1_6 + 0.00103515532086977*G0_0_1_1_7 - 0.00207031064173957*G0_0_1_1_9 - 0.00358611406230514*G0_0_1_2_0 - 0.00303245255626258*G0_0_1_2_1 - 0.119134199134219*G0_0_1_2_2 + 0.00848421419850127*G0_0_1_2_3 - 0.014273979988268*G0_0_1_2_4 + 0.0161666904524074*G0_0_1_2_5 - 0.0333228676085874*G0_0_1_2_6 + 0.000499817642674863*G0_0_1_2_7 - 0.000535337678194915*G0_0_1_2_8 + 0.00404928404928477*G0_0_1_2_9 - 0.000725623582766578*G0_0_1_3_0 - 0.00809856809856945*G0_0_1_3_1 + 0.00848421419850127*G0_0_1_3_2 - 0.0836877408306124*G0_0_1_3_3 - 0.00509205080633745*G0_0_1_3_4 - 0.000114171542743019*G0_0_1_3_5 + 0.000205508776937413*G0_0_1_3_6 + 0.00367632367632429*G0_0_1_3_7 - 0.00678178963893361*G0_0_1_3_8 - 0.00114171542742993*G0_0_1_3_9 - 0.000497280497280578*G0_0_1_4_0 + 0.00551067979639501*G0_0_1_4_1 - 0.014273979988268*G0_0_1_4_2 - 0.00509205080633746*G0_0_1_4_3 + 0.0603510774939449*G0_0_1_4_4 + 0.00299129441986635*G0_0_1_4_5 - 0.00319680319680374*G0_0_1_4_6 - 0.000753532182103721*G0_0_1_4_7 + 0.00310546596260932*G0_0_1_4_8 - 0.018130440987587*G0_0_1_4_9 + 0.00125588697017291*G0_0_1_5_0 + 0.000301920301920365*G0_0_1_5_1 + 0.0161666904524074*G0_0_1_5_2 - 0.000114171542743018*G0_0_1_5_3 + 0.00299129441986635*G0_0_1_5_4 - 0.0578393035535987*G0_0_1_5_5 + 0.00317396888825507*G0_0_1_5_6 - 0.000593692022263492*G0_0_1_5_7 + 0.000593692022263498*G0_0_1_5_8 + 0.0137462537462562*G0_0_1_5_9 - 0.00105798962941837*G0_0_1_6_0 + 0.000431314717029074*G0_0_1_6_1 - 0.0333228676085874*G0_0_1_6_2 + 0.000205508776937412*G0_0_1_6_3 - 0.00319680319680374*G0_0_1_6_4 + 0.00317396888825507*G0_0_1_6_5 + 0.105563008420169*G0_0_1_6_6 - 0.000593692022263519*G0_0_1_6_8 - 0.0125588697017291*G0_0_1_6_9 + 0.00103515532086977*G0_0_1_7_1 + 0.000499817642674863*G0_0_1_7_2 + 0.00367632367632429*G0_0_1_7_3 - 0.000753532182103721*G0_0_1_7_4 - 0.000593692022263492*G0_0_1_7_5 + 0.00235193378050565*G0_0_1_7_7 - 0.0031054659626094*G0_0_1_7_8 + 0.0149336377907832*G0_0_1_7_9 + 0.000535337678194909*G0_0_1_8_0 - 0.000535337678194915*G0_0_1_8_2 - 0.00678178963893361*G0_0_1_8_3 + 0.00310546596260932*G0_0_1_8_4 + 0.000593692022263498*G0_0_1_8_5 - 0.000593692022263519*G0_0_1_8_6 - 0.0031054659626094*G0_0_1_8_7 + 0.00678178963893375*G0_0_1_8_8 - 0.0049778792635944*G0_0_1_9_0 - 0.00207031064173957*G0_0_1_9_1 + 0.00404928404928477*G0_0_1_9_2 - 0.00114171542742993*G0_0_1_9_3 - 0.018130440987587*G0_0_1_9_4 + 0.0137462537462562*G0_0_1_9_5 - 0.0125588697017291*G0_0_1_9_6 + 0.0149336377907832*G0_0_1_9_7 - 0.0298672755815663*G0_0_1_9_9 - 0.00196205910491661*G0_1_0_0_0 - 0.00108166965309839*G0_1_0_0_1 - 0.00101203910727737*G0_1_0_0_2 - 0.00127364698793293*G0_1_0_0_3 - 0.00182843611415075*G0_1_0_0_5 + 0.000493051921623459*G0_1_0_0_6 - 0.00150283578855036*G0_1_0_0_7 - 0.00128379556951008*G0_1_0_0_9 - 0.00108166965309839*G0_1_0_1_0 - 0.0133792133792154*G0_1_0_1_1 - 0.00238350714541229*G0_1_0_1_2 - 0.0152972952972979*G0_1_0_1_3 + 0.00523328523328613*G0_1_0_1_4 - 0.00091083519654964*G0_1_0_1_5 + 0.00243904243904277*G0_1_0_1_7 - 0.00601472601472682*G0_1_0_1_8 - 0.00340992340992398*G0_1_0_1_9 - 0.00101203910727737*G0_1_0_2_0 - 0.00238350714541229*G0_1_0_2_1 - 0.00859584859584977*G0_1_0_2_2 + 0.000708709280137885*G0_1_0_2_3 - 0.00743045314473996*G0_1_0_2_4 + 0.00145293859579592*G0_1_0_2_5 - 0.0045753188610338*G0_1_0_2_6 + 0.000109097251954403*G0_1_0_2_7 - 0.000360274645988979*G0_1_0_2_8 - 0.00223268794697401*G0_1_0_2_9 - 0.00127364698793293*G0_1_0_3_0 - 0.0152972952972979*G0_1_0_3_1 + 0.000708709280137885*G0_1_0_3_2 - 0.0563170163170262*G0_1_0_3_3 + 0.0217763189191797*G0_1_0_3_4 + 0.00154512154512183*G0_1_0_3_5 + 0.00371438085723858*G0_1_0_3_6 + 0.00728414442700281*G0_1_0_3_7 - 0.0118281718281738*G0_1_0_3_8 - 0.00433851862423372*G0_1_0_3_9 + 0.00523328523328613*G0_1_0_4_1 - 0.00743045314473996*G0_1_0_4_2 + 0.0217763189191797*G0_1_0_4_3 - 0.016859331145048*G0_1_0_4_4 + 0.00373721516578718*G0_1_0_4_5 - 0.00745159602302576*G0_1_0_4_6 - 0.00175824175824205*G0_1_0_4_7 + 0.00454402740117096*G0_1_0_4_8 - 0.000776366490652288*G0_1_0_4_9 - 0.00182843611415075*G0_1_0_5_0 - 0.00091083519654964*G0_1_0_5_1 + 0.00145293859579592*G0_1_0_5_2 + 0.00154512154512183*G0_1_0_5_3 + 0.00373721516578718*G0_1_0_5_4 - 0.0245925503068402*G0_1_0_5_5 + 0.00872270586556444*G0_1_0_5_6 - 0.00933162076019377*G0_1_0_5_7 + 0.00619570905285296*G0_1_0_5_8 - 0.00854003139717569*G0_1_0_5_9 + 0.000493051921623459*G0_1_0_6_0 - 0.0045753188610338*G0_1_0_6_2 + 0.00371438085723858*G0_1_0_6_3 - 0.00745159602302576*G0_1_0_6_4 + 0.00872270586556444*G0_1_0_6_5 - 0.0113943199657504*G0_1_0_6_6 + 0.00313591170734081*G0_1_0_6_7 - 0.00106560106560127*G0_1_0_6_8 - 0.000730697873555118*G0_1_0_6_9 - 0.00150283578855036*G0_1_0_7_0 + 0.00243904243904277*G0_1_0_7_1 + 0.000109097251954403*G0_1_0_7_2 + 0.00728414442700281*G0_1_0_7_3 - 0.00175824175824205*G0_1_0_7_4 - 0.00933162076019377*G0_1_0_7_5 + 0.00313591170734081*G0_1_0_7_6 - 0.00775605347034043*G0_1_0_7_7 + 0.00795395081109483*G0_1_0_7_8 - 0.0024204367061514*G0_1_0_7_9 - 0.00601472601472682*G0_1_0_8_1 - 0.000360274645988979*G0_1_0_8_2 - 0.0118281718281738*G0_1_0_8_3 + 0.00454402740117096*G0_1_0_8_4 + 0.00619570905285296*G0_1_0_8_5 - 0.00106560106560127*G0_1_0_8_6 + 0.00795395081109483*G0_1_0_8_7 - 0.0111355311355324*G0_1_0_8_8 + 0.00114171542742997*G0_1_0_8_9 - 0.00128379556951008*G0_1_0_9_0 - 0.00340992340992398*G0_1_0_9_1 - 0.00223268794697401*G0_1_0_9_2 - 0.00433851862423372*G0_1_0_9_3 - 0.000776366490652289*G0_1_0_9_4 - 0.00854003139717569*G0_1_0_9_5 - 0.000730697873555118*G0_1_0_9_6 - 0.0024204367061514*G0_1_0_9_7 + 0.00114171542742997*G0_1_0_9_8 - 0.0134265734265757*G0_1_0_9_9 + 0.00663378949093366*G0_1_1_0_0 + 0.00130183749231395*G0_1_1_0_1 - 0.000913372341943922*G0_1_1_0_3 - 0.000200434486148809*G0_1_1_0_4 + 0.00274688274688325*G0_1_1_0_5 - 0.00095988667417257*G0_1_1_0_6 + 0.00592761735618985*G0_1_1_0_7 - 0.000760297903155163*G0_1_1_0_8 + 0.000948892377463974*G0_1_1_0_9 + 0.00130183749231395*G0_1_1_1_0 - 0.00130183749231387*G0_1_1_1_2 - 0.00928256928257067*G0_1_1_1_3 + 0.00279424279424318*G0_1_1_1_4 - 0.000827109398538113*G0_1_1_1_5 + 0.000827109398538109*G0_1_1_1_6 - 0.0027942427942434*G0_1_1_1_7 + 0.00928256928257118*G0_1_1_1_8 - 0.00130183749231387*G0_1_1_2_1 - 0.00663378949093323*G0_1_1_2_2 + 0.000760297903155129*G0_1_1_2_3 - 0.00592761735618967*G0_1_1_2_4 + 0.000959886674172516*G0_1_1_2_5 - 0.00274688274688314*G0_1_1_2_6 + 0.000200434486148799*G0_1_1_2_7 + 0.000913372341943937*G0_1_1_2_8 - 0.000948892377463939*G0_1_1_2_9 - 0.000913372341943922*G0_1_1_3_0 - 0.00928256928257067*G0_1_1_3_1 + 0.000760297903155129*G0_1_1_3_2 - 0.0451814851814928*G0_1_1_3_3 + 0.0138223681080846*G0_1_1_3_4 + 0.00261072261072304*G0_1_1_3_5 - 0.00248132819561434*G0_1_1_3_6 + 0.00274011702583171*G0_1_1_3_7 - 0.00548023405166355*G0_1_1_3_9 - 0.000200434486148809*G0_1_1_4_0 + 0.00279424279424318*G0_1_1_4_1 - 0.00592761735618967*G0_1_1_4_2 + 0.0138223681080846*G0_1_1_4_3 - 0.00910327767470757*G0_1_1_4_4 + 0.000601303458446399*G0_1_1_4_5 + 0.00188002473716795*G0_1_1_4_6 - 0.00274011702583185*G0_1_1_4_8 + 0.00164407021549903*G0_1_1_4_9 + 0.00274688274688325*G0_1_1_5_0 - 0.000827109398538113*G0_1_1_5_1 + 0.000959886674172516*G0_1_1_5_2 + 0.00261072261072304*G0_1_1_5_3 + 0.000601303458446399*G0_1_1_5_4 - 0.0131982303410897*G0_1_1_5_5 - 0.00188002473716786*G0_1_1_5_7 + 0.00248132819561428*G0_1_1_5_8 - 0.0078093335236205*G0_1_1_5_9 - 0.00095988667417257*G0_1_1_6_0 + 0.000827109398538109*G0_1_1_6_1 - 0.00274688274688314*G0_1_1_6_2 - 0.00248132819561434*G0_1_1_6_3 + 0.00188002473716795*G0_1_1_6_4 + 0.0131982303410898*G0_1_1_6_6 - 0.000601303458446432*G0_1_1_6_7 - 0.00261072261072304*G0_1_1_6_8 + 0.00780933352362051*G0_1_1_6_9 + 0.00592761735618985*G0_1_1_7_0 - 0.0027942427942434*G0_1_1_7_1 + 0.000200434486148799*G0_1_1_7_2 + 0.00274011702583171*G0_1_1_7_3 - 0.00188002473716786*G0_1_1_7_5 - 0.000601303458446432*G0_1_1_7_6 + 0.00910327767470792*G0_1_1_7_7 - 0.013822368108085*G0_1_1_7_8 - 0.00164407021549904*G0_1_1_7_9 - 0.000760297903155163*G0_1_1_8_0 + 0.00928256928257118*G0_1_1_8_1 + 0.000913372341943937*G0_1_1_8_2 - 0.00274011702583185*G0_1_1_8_4 + 0.00248132819561428*G0_1_1_8_5 - 0.00261072261072304*G0_1_1_8_6 - 0.013822368108085*G0_1_1_8_7 + 0.0451814851814933*G0_1_1_8_8 + 0.00548023405166361*G0_1_1_8_9 + 0.000948892377463973*G0_1_1_9_0 - 0.000948892377463939*G0_1_1_9_2 - 0.00548023405166355*G0_1_1_9_3 + 0.00164407021549903*G0_1_1_9_4 - 0.0078093335236205*G0_1_1_9_5 + 0.0078093335236205*G0_1_1_9_6 - 0.00164407021549904*G0_1_1_9_7 + 0.0054802340516636*G0_1_1_9_8; + A[30] = -A[31] + 0.011445970255496*G0_1_0_0_0 - 0.000177401963116286*G0_1_0_0_3 + 0.000225013082155981*G0_1_0_0_4 + 0.00202962381533845*G0_1_0_0_5 - 0.00202784649213255*G0_1_0_0_6 + 0.00672761101332644*G0_1_0_0_7 - 0.00356501302929936*G0_1_0_0_8 - 0.000146004788861948*G0_1_0_0_9 - 0.0114459702554961*G0_1_0_1_1 - 0.00202962381533848*G0_1_0_1_3 + 0.00202784649213256*G0_1_0_1_4 + 0.000177401963116286*G0_1_0_1_5 - 0.000225013082155981*G0_1_0_1_6 + 0.00356501302929937*G0_1_0_1_7 - 0.00672761101332649*G0_1_0_1_8 + 0.00014600478886195*G0_1_0_1_9 - 0.0015371665371668*G0_1_0_2_3 + 0.00469798719798799*G0_1_0_2_4 + 0.00153716653716679*G0_1_0_2_5 - 0.00469798719798798*G0_1_0_2_6 + 0.000402415045272256*G0_1_0_2_7 - 0.000402415045272257*G0_1_0_2_8 - 0.000177401963116286*G0_1_0_3_0 - 0.00202962381533848*G0_1_0_3_1 - 0.0015371665371668*G0_1_0_3_2 + 0.00510548974834775*G0_1_0_3_3 - 0.00554600161743111*G0_1_0_3_4 + 0.000675039246467929*G0_1_0_3_6 + 0.000532205889348839*G0_1_0_3_7 - 0.00173945102516562*G0_1_0_3_8 - 0.00150242614528354*G0_1_0_3_9 + 0.000225013082155981*G0_1_0_4_0 + 0.00202784649213256*G0_1_0_4_1 + 0.00469798719798799*G0_1_0_4_2 - 0.00554600161743111*G0_1_0_4_3 + 0.0132384282384305*G0_1_0_4_4 - 0.000675039246467933*G0_1_0_4_5 - 0.000941142191142352*G0_1_0_4_7 + 0.00120724513581678*G0_1_0_4_8 + 0.00135007849293586*G0_1_0_4_9 + 0.00202962381533845*G0_1_0_5_0 + 0.000177401963116286*G0_1_0_5_1 + 0.00153716653716679*G0_1_0_5_2 - 0.000675039246467933*G0_1_0_5_4 - 0.00510548974834774*G0_1_0_5_5 + 0.00554600161743111*G0_1_0_5_6 + 0.0017394510251656*G0_1_0_5_7 - 0.000532205889348833*G0_1_0_5_8 + 0.00150242614528354*G0_1_0_5_9 - 0.00202784649213255*G0_1_0_6_0 - 0.000225013082155981*G0_1_0_6_1 - 0.00469798719798798*G0_1_0_6_2 + 0.000675039246467929*G0_1_0_6_3 + 0.00554600161743112*G0_1_0_6_5 - 0.0132384282384305*G0_1_0_6_6 - 0.00120724513581677*G0_1_0_6_7 + 0.000941142191142346*G0_1_0_6_8 - 0.00135007849293586*G0_1_0_6_9 + 0.00672761101332644*G0_1_0_7_0 + 0.00356501302929937*G0_1_0_7_1 + 0.000402415045272256*G0_1_0_7_2 + 0.000532205889348839*G0_1_0_7_3 - 0.000941142191142353*G0_1_0_7_4 + 0.0017394510251656*G0_1_0_7_5 - 0.00120724513581677*G0_1_0_7_6 + 0.00813293849008271*G0_1_0_7_7 + 0.00285250463821941*G0_1_0_7_9 - 0.00356501302929936*G0_1_0_8_0 - 0.00672761101332649*G0_1_0_8_1 - 0.000402415045272257*G0_1_0_8_2 - 0.00173945102516562*G0_1_0_8_3 + 0.00120724513581678*G0_1_0_8_4 - 0.000532205889348833*G0_1_0_8_5 + 0.000941142191142346*G0_1_0_8_6 - 0.00813293849008276*G0_1_0_8_8 - 0.00285250463821941*G0_1_0_8_9 - 0.000146004788861948*G0_1_0_9_0 + 0.00014600478886195*G0_1_0_9_1 - 0.00150242614528354*G0_1_0_9_3 + 0.00135007849293586*G0_1_0_9_4 + 0.00150242614528354*G0_1_0_9_5 - 0.00135007849293586*G0_1_0_9_6 + 0.00285250463821941*G0_1_0_9_7 - 0.00285250463821941*G0_1_0_9_8 + 0.0108191962358647*G0_1_1_0_0 + 0.000620316081625712*G0_1_1_0_1 + 0.00052394860430584*G0_1_1_0_2 - 0.000174902808831416*G0_1_1_0_3 + 0.000227512236440852*G0_1_1_0_4 + 0.00189433251933284*G0_1_1_0_5 - 0.0011546324046326*G0_1_1_0_6 + 0.00659231971732084*G0_1_1_0_7 - 0.0026917989417994*G0_1_1_0_8 + 0.000290959040959099*G0_1_1_0_9 + 0.000620316081625712*G0_1_1_1_0 - 0.00062677401963128*G0_1_1_1_1 + 0.000620316081625715*G0_1_1_1_2 - 0.000135291296005611*G0_1_1_1_3 + 0.000873214087499956*G0_1_1_1_4 + 0.000873214087499954*G0_1_1_1_7 - 0.000135291296005612*G0_1_1_1_8 + 0.000436963829821047*G0_1_1_1_9 + 0.00052394860430584*G0_1_1_2_0 + 0.000620316081625715*G0_1_1_2_1 + 0.0108191962358648*G0_1_1_2_2 - 0.00269179894179941*G0_1_1_2_3 + 0.00659231971732087*G0_1_1_2_4 - 0.00115463240463262*G0_1_1_2_5 + 0.00189433251933288*G0_1_1_2_6 + 0.000227512236440846*G0_1_1_2_7 - 0.00017490280883141*G0_1_1_2_8 + 0.000290959040959094*G0_1_1_2_9 - 0.000174902808831416*G0_1_1_3_0 - 0.000135291296005611*G0_1_1_3_1 - 0.00269179894179941*G0_1_1_3_2 + 0.00261839351125111*G0_1_1_3_3 - 0.00481814316635828*G0_1_1_3_4 + 0.00051332595975462*G0_1_1_3_5 - 0.000516938418724229*G0_1_1_3_6 - 0.00134142643071237*G0_1_1_3_9 + 0.000227512236440852*G0_1_1_4_0 + 0.000873214087499956*G0_1_1_4_1 + 0.00659231971732087*G0_1_1_4_2 - 0.00481814316635828*G0_1_1_4_3 + 0.0107513320013339*G0_1_1_4_4 - 0.00119197766519216*G0_1_1_4_5 + 0.00170891608391639*G0_1_1_4_6 - 0.000427816231387732*G0_1_1_4_7 + 0.00151107820750704*G0_1_1_4_9 + 0.00189433251933284*G0_1_1_5_0 - 0.00115463240463262*G0_1_1_5_2 + 0.00051332595975462*G0_1_1_5_3 - 0.00119197766519216*G0_1_1_5_4 - 0.00248709623709664*G0_1_1_5_5 + 0.00072785845107284*G0_1_1_5_6 + 0.00170891608391637*G0_1_1_5_7 - 0.000516938418724222*G0_1_1_5_8 + 0.000160999714571166*G0_1_1_5_9 - 0.0011546324046326*G0_1_1_6_0 + 0.00189433251933288*G0_1_1_6_2 - 0.000516938418724229*G0_1_1_6_3 + 0.00170891608391639*G0_1_1_6_4 + 0.00072785845107284*G0_1_1_6_5 - 0.00248709623709662*G0_1_1_6_6 - 0.00119197766519215*G0_1_1_6_7 + 0.000513325959754618*G0_1_1_6_8 + 0.000160999714571176*G0_1_1_6_9 + 0.00659231971732084*G0_1_1_7_0 + 0.000873214087499954*G0_1_1_7_1 + 0.000227512236440846*G0_1_1_7_2 - 0.000427816231387732*G0_1_1_7_4 + 0.00170891608391637*G0_1_1_7_5 - 0.00119197766519215*G0_1_1_7_6 + 0.0107513320013338*G0_1_1_7_7 - 0.00481814316635827*G0_1_1_7_8 + 0.00151107820750704*G0_1_1_7_9 - 0.0026917989417994*G0_1_1_8_0 - 0.000135291296005612*G0_1_1_8_1 - 0.00017490280883141*G0_1_1_8_2 - 0.000516938418724222*G0_1_1_8_5 + 0.000513325959754618*G0_1_1_8_6 - 0.00481814316635827*G0_1_1_8_7 + 0.00261839351125108*G0_1_1_8_8 - 0.00134142643071237*G0_1_1_8_9 + 0.000290959040959099*G0_1_1_9_0 + 0.000436963829821047*G0_1_1_9_1 + 0.000290959040959094*G0_1_1_9_2 - 0.00134142643071237*G0_1_1_9_3 + 0.00151107820750704*G0_1_1_9_4 + 0.000160999714571166*G0_1_1_9_5 + 0.000160999714571176*G0_1_1_9_6 + 0.00151107820750704*G0_1_1_9_7 - 0.00134142643071237*G0_1_1_9_8 + 0.00183352361923823*G0_1_1_9_9; + A[23] = -A[21] + 0.00631312250359978*G0_0_0_0_0 + 0.0022110341157964*G0_0_0_0_2 - 0.000737886452172292*G0_0_0_0_3 - 0.000249327392184578*G0_0_0_0_4 + 0.00890712462141186*G0_0_0_0_5 - 0.00241885099027998*G0_0_0_0_6 + 0.00188747760176364*G0_0_0_0_7 - 0.00148645005787887*G0_0_0_0_8 + 0.00097172668601257*G0_0_0_0_9 - 0.00572760572760661*G0_0_0_1_1 - 0.00599659599659702*G0_0_0_1_3 + 0.00151034151034176*G0_0_0_1_4 + 0.000712726427012255*G0_0_0_1_5 + 0.000830545116259544*G0_0_0_1_6 + 0.000589780589780657*G0_0_0_1_7 - 0.00233951233951265*G0_0_0_1_8 - 0.00114552114552134*G0_0_0_1_9 + 0.0022110341157964*G0_0_0_2_0 + 0.0274342941009653*G0_0_0_2_2 - 0.00349893492750694*G0_0_0_2_3 + 0.00353339781911269*G0_0_0_2_4 - 0.00537726823441197*G0_0_0_2_5 + 0.0147061404204286*G0_0_0_2_6 - 0.000401873259016183*G0_0_0_2_7 - 0.000327344613058947*G0_0_0_2_8 - 0.000776366490652341*G0_0_0_2_9 - 0.000737886452172292*G0_0_0_3_0 - 0.00599659599659702*G0_0_0_3_1 - 0.00349893492750694*G0_0_0_3_2 - 0.0142390942390967*G0_0_0_3_3 + 0.0116164787593379*G0_0_0_3_4 - 0.000199800199800219*G0_0_0_3_5 - 0.00201655487369806*G0_0_0_3_6 + 0.00268873983159743*G0_0_0_3_7 - 0.00414585414585483*G0_0_0_3_8 - 0.00194091622663085*G0_0_0_3_9 - 0.000249327392184578*G0_0_0_4_0 + 0.00151034151034176*G0_0_0_4_1 + 0.00353339781911269*G0_0_0_4_2 + 0.0116164787593379*G0_0_0_4_3 - 0.0233927976785158*G0_0_0_4_4 + 0.00122306265163428*G0_0_0_4_5 + 0.000793492222063783*G0_0_0_4_6 + 0.000739260739260863*G0_0_0_4_7 + 0.0014571143142574*G0_0_0_4_8 - 0.000117025831311536*G0_0_0_4_9 + 0.00890712462141186*G0_0_0_5_0 + 0.000712726427012255*G0_0_0_5_1 - 0.00537726823441197*G0_0_0_5_2 - 0.000199800199800219*G0_0_0_5_3 + 0.00122306265163428*G0_0_0_5_4 + 0.0599762142619385*G0_0_0_5_5 - 0.0138713667285119*G0_0_0_5_6 - 0.00166309880595622*G0_0_0_5_8 + 0.000411017553874751*G0_0_0_5_9 - 0.00241885099027998*G0_0_0_6_0 + 0.000830545116259544*G0_0_0_6_1 + 0.0147061404204286*G0_0_0_6_2 - 0.00201655487369806*G0_0_0_6_3 + 0.000793492222063783*G0_0_0_6_4 - 0.0138713667285119*G0_0_0_6_5 + 0.032674944103521*G0_0_0_6_6 + 0.00168070025212911*G0_0_0_6_7 - 0.000992340992341159*G0_0_0_6_8 + 0.00636220921935314*G0_0_0_6_9 + 0.00188747760176364*G0_0_0_7_0 + 0.000589780589780657*G0_0_0_7_1 - 0.000401873259016183*G0_0_0_7_2 + 0.00268873983159743*G0_0_0_7_3 + 0.000739260739260863*G0_0_0_7_4 + 0.00168070025212911*G0_0_0_7_6 - 0.0102135959278833*G0_0_0_7_7 + 0.00493696779411141*G0_0_0_7_8 - 0.00627658056229592*G0_0_0_7_9 - 0.00148645005787887*G0_0_0_8_0 - 0.00233951233951265*G0_0_0_8_1 - 0.000327344613058947*G0_0_0_8_2 - 0.00414585414585483*G0_0_0_8_3 + 0.0014571143142574*G0_0_0_8_4 - 0.00166309880595622*G0_0_0_8_5 - 0.000992340992341158*G0_0_0_8_6 + 0.00493696779411141*G0_0_0_8_7 - 0.00404262404262456*G0_0_0_8_8 + 0.0005223348080492*G0_0_0_8_9 + 0.00097172668601257*G0_0_0_9_0 - 0.00114552114552134*G0_0_0_9_1 - 0.000776366490652341*G0_0_0_9_2 - 0.00194091622663085*G0_0_0_9_3 - 0.000117025831311538*G0_0_0_9_4 + 0.000411017553874751*G0_0_0_9_5 + 0.00636220921935314*G0_0_0_9_6 - 0.00627658056229592*G0_0_0_9_7 + 0.0005223348080492*G0_0_0_9_8 - 0.0086313686313701*G0_0_0_9_9 - 0.0211211715973658*G0_0_1_0_0 - 0.000410541839113327*G0_0_1_0_3 + 0.000152545866831605*G0_0_1_0_4 - 0.00579901579901682*G0_0_1_0_5 + 0.00295841724413205*G0_0_1_0_6 - 0.00164592021734912*G0_0_1_0_7 + 0.00201248486962811*G0_0_1_0_8 + 0.00174809317666489*G0_0_1_0_9 - 0.00365708365708419*G0_0_1_1_3 + 0.000920560920561033*G0_0_1_1_4 - 0.000117818689247291*G0_0_1_1_5 + 0.00011781868924728*G0_0_1_1_6 - 0.000920560920561148*G0_0_1_1_7 + 0.00365708365708442*G0_0_1_1_8 + 0.0211211715973656*G0_0_1_2_2 - 0.00201248486962806*G0_0_1_2_3 + 0.00164592021734906*G0_0_1_2_4 - 0.00295841724413202*G0_0_1_2_5 + 0.00579901579901675*G0_0_1_2_6 - 0.000152545866831611*G0_0_1_2_7 + 0.000410541839113345*G0_0_1_2_8 - 0.0017480931766649*G0_0_1_2_9 - 0.000410541839113327*G0_0_1_3_0 - 0.00365708365708419*G0_0_1_3_1 - 0.00201248486962806*G0_0_1_3_2 - 0.0101964701964719*G0_0_1_3_3 + 0.00667951096522635*G0_0_1_3_4 + 0.000792540792540938*G0_0_1_3_5 - 0.000353456067741849*G0_0_1_3_6 + 0.00123162551733999*G0_0_1_3_7 - 0.00246325103468002*G0_0_1_3_9 + 0.000152545866831605*G0_0_1_4_0 + 0.000920560920561033*G0_0_1_4_1 + 0.00164592021734906*G0_0_1_4_2 + 0.00667951096522636*G0_0_1_4_3 - 0.0131792017506325*G0_0_1_4_4 - 0.000457637600494824*G0_0_1_4_5 + 0.000811093668236668*G0_0_1_4_6 - 0.00123162551734004*G0_0_1_4_8 + 0.00615955473098435*G0_0_1_4_9 - 0.00579901579901682*G0_0_1_5_0 - 0.000117818689247292*G0_0_1_5_1 - 0.00295841724413202*G0_0_1_5_2 + 0.000792540792540938*G0_0_1_5_3 - 0.000457637600494824*G0_0_1_5_4 + 0.0273012701584175*G0_0_1_5_5 - 0.000811093668236695*G0_0_1_5_7 + 0.000353456067741859*G0_0_1_5_8 - 0.00595119166547841*G0_0_1_5_9 + 0.00295841724413205*G0_0_1_6_0 + 0.00011781868924728*G0_0_1_6_1 + 0.00579901579901675*G0_0_1_6_2 - 0.000353456067741849*G0_0_1_6_3 + 0.000811093668236667*G0_0_1_6_4 - 0.0273012701584177*G0_0_1_6_6 + 0.000457637600494828*G0_0_1_6_7 - 0.000792540792540937*G0_0_1_6_8 + 0.0059511916654784*G0_0_1_6_9 - 0.00164592021734912*G0_0_1_7_0 - 0.000920560920561148*G0_0_1_7_1 - 0.000152545866831612*G0_0_1_7_2 + 0.00123162551733999*G0_0_1_7_3 - 0.000811093668236695*G0_0_1_7_5 + 0.000457637600494828*G0_0_1_7_6 + 0.0131792017506325*G0_0_1_7_7 - 0.00667951096522643*G0_0_1_7_8 - 0.00615955473098435*G0_0_1_7_9 + 0.00201248486962811*G0_0_1_8_0 + 0.00365708365708443*G0_0_1_8_1 + 0.000410541839113345*G0_0_1_8_2 - 0.00123162551734004*G0_0_1_8_4 + 0.000353456067741859*G0_0_1_8_5 - 0.000792540792540937*G0_0_1_8_6 - 0.00667951096522643*G0_0_1_8_7 + 0.0101964701964721*G0_0_1_8_8 + 0.00246325103468005*G0_0_1_8_9 + 0.00174809317666489*G0_0_1_9_0 - 0.0017480931766649*G0_0_1_9_2 - 0.00246325103468002*G0_0_1_9_3 + 0.00615955473098435*G0_0_1_9_4 - 0.00595119166547841*G0_0_1_9_5 + 0.0059511916654784*G0_0_1_9_6 - 0.00615955473098435*G0_0_1_9_7 + 0.00246325103468005*G0_0_1_9_8; + A[20] = -A[23] - 0.0036748789129748*G0_0_1_0_0 + 0.00342487318677856*G0_0_1_0_1 + 0.000628533723771926*G0_0_1_0_2 + 0.001099878957022*G0_0_1_0_4 + 0.000525823382966322*G0_0_1_0_5 + 0.00108526394240698*G0_0_1_0_6 - 0.000899418042275366*G0_0_1_0_7 + 0.00476158761873132*G0_0_1_0_8 + 0.00346225203368119*G0_0_1_0_9 + 0.00342487318677856*G0_0_1_1_0 + 0.0591889591889697*G0_0_1_1_1 + 0.00182148539291428*G0_0_1_1_2 + 0.0103481703481722*G0_0_1_1_3 - 0.00446146446146527*G0_0_1_1_4 - 0.000948390234104711*G0_0_1_1_5 + 0.00016176944748377*G0_0_1_1_6 - 0.0148836348836375*G0_0_1_1_7 + 0.0359388759388823*G0_0_1_1_8 + 0.00259518259518306*G0_0_1_1_9 + 0.000628533723771926*G0_0_1_2_0 + 0.00182148539291428*G0_0_1_2_1 + 0.0153463820130513*G0_0_1_2_2 - 0.00171310171310199*G0_0_1_2_3 + 0.00367595367595429*G0_0_1_2_4 - 0.00169238169238197*G0_0_1_2_5 + 0.00497095497095579*G0_0_1_2_6 - 0.000738600024314437*G0_0_1_2_7 + 0.00171355099926558*G0_0_1_2_8 - 0.000668220668220782*G0_0_1_2_9 + 0.0103481703481722*G0_0_1_3_1 - 0.00171310171310199*G0_0_1_3_2 - 0.010256410256412*G0_0_1_3_3 - 0.0067434946006386*G0_0_1_3_4 + 0.00288330716902193*G0_0_1_3_5 - 0.003179915322773*G0_0_1_3_6 - 0.00246777032491363*G0_0_1_3_7 + 0.0103030303030321*G0_0_1_3_8 - 0.0028500071357219*G0_0_1_3_9 + 0.001099878957022*G0_0_1_4_0 - 0.00446146446146527*G0_0_1_4_1 + 0.00367595367595429*G0_0_1_4_2 - 0.0067434946006386*G0_0_1_4_3 + 0.0230103230103268*G0_0_1_4_4 - 0.0059942438513877*G0_0_1_4_5 + 0.0091741591741607*G0_0_1_4_6 + 0.000805385091099534*G0_0_1_4_7 - 0.00783525997811847*G0_0_1_4_8 + 0.0139931497074377*G0_0_1_4_9 + 0.000525823382966322*G0_0_1_5_0 - 0.000948390234104711*G0_0_1_5_1 - 0.00169238169238197*G0_0_1_5_2 + 0.00288330716902193*G0_0_1_5_3 - 0.0059942438513877*G0_0_1_5_4 + 0.00807763664906653*G0_0_1_5_5 - 0.00793849008134855*G0_0_1_5_6 + 0.000328243185386097*G0_0_1_5_7 + 0.000150563721992301*G0_0_1_5_8 - 0.0106878835450282*G0_0_1_5_9 + 0.00108526394240698*G0_0_1_6_0 + 0.00016176944748377*G0_0_1_6_1 + 0.00497095497095579*G0_0_1_6_2 - 0.003179915322773*G0_0_1_6_3 + 0.0091741591741607*G0_0_1_6_4 - 0.00793849008134855*G0_0_1_6_5 - 0.0206793206793242*G0_0_1_6_6 - 0.000478806907378421*G0_0_1_6_7 - 0.00146567717996313*G0_0_1_6_8 + 0.00836449265020835*G0_0_1_6_9 - 0.000899418042275367*G0_0_1_7_0 - 0.0148836348836375*G0_0_1_7_1 - 0.000738600024314437*G0_0_1_7_2 - 0.00246777032491363*G0_0_1_7_3 + 0.000805385091099534*G0_0_1_7_4 + 0.000328243185386097*G0_0_1_7_5 - 0.000478806907378421*G0_0_1_7_6 + 0.0146910232624543*G0_0_1_7_7 - 0.0263500784929402*G0_0_1_7_8 - 0.00942914228628674*G0_0_1_7_9 + 0.00476158761873132*G0_0_1_8_0 + 0.0359388759388823*G0_0_1_8_1 + 0.00171355099926558*G0_0_1_8_2 + 0.0103030303030321*G0_0_1_8_3 - 0.00783525997811847*G0_0_1_8_4 + 0.000150563721992301*G0_0_1_8_5 - 0.00146567717996313*G0_0_1_8_6 - 0.0263500784929402*G0_0_1_8_7 + 0.058881118881129*G0_0_1_8_8 + 0.00788497217068781*G0_0_1_8_9 + 0.00346225203368119*G0_0_1_9_0 + 0.00259518259518306*G0_0_1_9_1 - 0.000668220668220782*G0_0_1_9_2 - 0.0028500071357219*G0_0_1_9_3 + 0.0139931497074377*G0_0_1_9_4 - 0.0106878835450282*G0_0_1_9_5 + 0.00836449265020835*G0_0_1_9_6 - 0.00942914228628674*G0_0_1_9_7 + 0.00788497217068781*G0_0_1_9_8 + 0.0213900385328993*G0_0_1_9_9; + A[5] = -A[20] - 0.00326925279306287*G0_0_0_0_0 - 0.00110764015525939*G0_0_0_0_2 + 0.000261325975611732*G0_0_0_0_3 + 0.000927643784786804*G0_0_0_0_4 - 0.00209430780859387*G0_0_0_0_5 - 0.00147936719365317*G0_0_0_0_6 - 0.00206026777455383*G0_0_0_0_7 + 0.00119647548218996*G0_0_0_0_8 - 0.000339977482834682*G0_0_0_0_9 + 0.0032692527930628*G0_0_0_1_1 + 0.00110764015525939*G0_0_0_1_2 + 0.00209430780859386*G0_0_0_1_3 + 0.00147936719365317*G0_0_0_1_4 - 0.000261325975611731*G0_0_0_1_5 - 0.000927643784786803*G0_0_0_1_6 - 0.00119647548218995*G0_0_0_1_7 + 0.0020602677745538*G0_0_0_1_8 + 0.00033997748283468*G0_0_0_1_9 - 0.00110764015525939*G0_0_0_2_0 + 0.00110764015525939*G0_0_0_2_1 - 0.00380656380656445*G0_0_0_2_3 + 0.011999851999854*G0_0_0_2_4 + 0.00380656380656444*G0_0_0_2_5 - 0.011999851999854*G0_0_0_2_6 - 0.000332683189826102*G0_0_0_2_7 + 0.000332683189826099*G0_0_0_2_8 + 0.000261325975611732*G0_0_0_3_0 + 0.00209430780859386*G0_0_0_3_1 - 0.00380656380656445*G0_0_0_3_2 + 0.00890918605204472*G0_0_0_3_3 - 0.0159431045145358*G0_0_0_3_4 + 0.00278293135436038*G0_0_0_3_6 - 0.000783977926835199*G0_0_0_3_7 + 0.0017820274963135*G0_0_0_3_8 + 0.000548023405166362*G0_0_0_3_9 + 0.000927643784786804*G0_0_0_4_0 + 0.00147936719365317*G0_0_0_4_1 + 0.011999851999854*G0_0_0_4_2 - 0.0159431045145358*G0_0_0_4_3 + 0.053053613053622*G0_0_0_4_4 - 0.00278293135436039*G0_0_0_4_5 - 0.000892440892441042*G0_0_0_4_7 - 0.0009980495694783*G0_0_0_4_8 + 0.00556586270872077*G0_0_0_4_9 - 0.00209430780859387*G0_0_0_5_0 - 0.000261325975611731*G0_0_0_5_1 + 0.00380656380656444*G0_0_0_5_2 - 0.00278293135436039*G0_0_0_5_4 - 0.00890918605204467*G0_0_0_5_5 + 0.0159431045145358*G0_0_0_5_6 - 0.0017820274963135*G0_0_0_5_7 + 0.000783977926835199*G0_0_0_5_8 - 0.00054802340516636*G0_0_0_5_9 - 0.00147936719365317*G0_0_0_6_0 - 0.000927643784786803*G0_0_0_6_1 - 0.011999851999854*G0_0_0_6_2 + 0.00278293135436038*G0_0_0_6_3 + 0.0159431045145358*G0_0_0_6_5 - 0.053053613053622*G0_0_0_6_6 + 0.0009980495694783*G0_0_0_6_7 + 0.000892440892441038*G0_0_0_6_8 - 0.00556586270872077*G0_0_0_6_9 - 0.00206026777455383*G0_0_0_7_0 - 0.00119647548218995*G0_0_0_7_1 - 0.000332683189826102*G0_0_0_7_2 - 0.000783977926835199*G0_0_0_7_3 - 0.000892440892441042*G0_0_0_7_4 - 0.0017820274963135*G0_0_0_7_5 + 0.0009980495694783*G0_0_0_7_6 - 0.00117025831311565*G0_0_0_7_7 - 0.000976166690452572*G0_0_0_7_9 + 0.00119647548218996*G0_0_0_8_0 + 0.0020602677745538*G0_0_0_8_1 + 0.000332683189826099*G0_0_0_8_2 + 0.0017820274963135*G0_0_0_8_3 - 0.0009980495694783*G0_0_0_8_4 + 0.000783977926835199*G0_0_0_8_5 + 0.000892440892441038*G0_0_0_8_6 + 0.0011702583131156*G0_0_0_8_8 + 0.000976166690452565*G0_0_0_8_9 - 0.000339977482834682*G0_0_0_9_0 + 0.00033997748283468*G0_0_0_9_1 + 0.000548023405166362*G0_0_0_9_3 + 0.00556586270872077*G0_0_0_9_4 - 0.00054802340516636*G0_0_0_9_5 - 0.00556586270872077*G0_0_0_9_6 - 0.000976166690452572*G0_0_0_9_7 + 0.000976166690452565*G0_0_0_9_8 - 0.00246342722533236*G0_0_1_0_0 + 0.00296736772927302*G0_0_1_0_1 + 0.000195043052185946*G0_0_1_0_2 + 0.000435120435120514*G0_0_1_0_3 + 0.00175189889475634*G0_0_1_0_4 - 0.000812837955695221*G0_0_1_0_5 + 0.000113854399568696*G0_0_1_0_6 - 0.00503401360544303*G0_0_1_0_7 + 0.00545835117263783*G0_0_1_0_8 + 0.0017753674896535*G0_0_1_0_9 + 0.00296736772927302*G0_0_1_1_0 + 0.0636696636696748*G0_0_1_1_1 + 0.00249563487658768*G0_0_1_1_2 + 0.0111038168181045*G0_0_1_1_3 - 0.00395350681065036*G0_0_1_1_4 - 0.000698983556126558*G0_0_1_1_5 - 0.000113854399568694*G0_0_1_1_6 - 0.0153833468119209*G0_0_1_1_7 + 0.0338645481502683*G0_0_1_1_8 + 0.00124827553399005*G0_0_1_1_9 + 0.000195043052185946*G0_0_1_2_0 + 0.00249563487658768*G0_0_1_2_1 + 0.00420813754147158*G0_0_1_2_2 - 0.00441241298384229*G0_0_1_2_3 + 0.0107048507048525*G0_0_1_2_4 - 0.000585129156557826*G0_0_1_2_5 - 0.00112332112332131*G0_0_1_2_7 + 0.0016615130900848*G0_0_1_2_8 + 0.00117025831311565*G0_0_1_2_9 + 0.000435120435120513*G0_0_1_3_0 + 0.0111038168181045*G0_0_1_3_1 - 0.00441241298384229*G0_0_1_3_2 - 0.00973597830740857*G0_0_1_3_3 - 0.0129927215641523*G0_0_1_3_4 + 0.00144427001569882*G0_0_1_3_5 - 0.00175538746967347*G0_0_1_3_6 - 0.00340231197374114*G0_0_1_3_7 + 0.0104838019123751*G0_0_1_3_8 + 0.00305979734551215*G0_0_1_3_9 + 0.00175189889475633*G0_0_1_4_0 - 0.00395350681065036*G0_0_1_4_1 + 0.0107048507048525*G0_0_1_4_2 - 0.0129927215641523*G0_0_1_4_3 + 0.0876352219209508*G0_0_1_4_4 - 0.00735264735264856*G0_0_1_4_5 + 0.00910803482232205*G0_0_1_4_6 + 0.000105608677037285*G0_0_1_4_7 - 0.007081489938634*G0_0_1_4_8 + 0.0111945197659502*G0_0_1_4_9 - 0.000812837955695221*G0_0_1_5_0 - 0.000698983556126558*G0_0_1_5_1 - 0.000585129156557826*G0_0_1_5_2 + 0.00144427001569882*G0_0_1_5_3 - 0.00735264735264856*G0_0_1_5_4 - 0.000311117453974664*G0_0_1_5_5 + 0.00175538746967349*G0_0_1_5_6 - 0.00127301270158433*G0_0_1_5_7 - 0.0053261024689605*G0_0_1_5_9 + 0.000113854399568696*G0_0_1_6_0 - 0.000113854399568694*G0_0_1_6_1 - 0.00175538746967347*G0_0_1_6_3 + 0.00910803482232205*G0_0_1_6_4 + 0.00175538746967349*G0_0_1_6_5 - 0.0091080348223221*G0_0_1_6_6 + 0.00127301270158434*G0_0_1_6_7 - 0.00127301270158433*G0_0_1_6_8 - 0.00503401360544303*G0_0_1_7_0 - 0.0153833468119209*G0_0_1_7_1 - 0.00112332112332131*G0_0_1_7_2 - 0.00340231197374113*G0_0_1_7_3 + 0.000105608677037285*G0_0_1_7_4 - 0.00127301270158433*G0_0_1_7_5 + 0.00127301270158434*G0_0_1_7_6 + 0.000830597973455281*G0_0_1_7_7 - 0.0163750535179135*G0_0_1_7_8 - 0.0078721278721292*G0_0_1_7_9 + 0.00545835117263783*G0_0_1_8_0 + 0.0338645481502683*G0_0_1_8_1 + 0.0016615130900848*G0_0_1_8_2 + 0.0104838019123751*G0_0_1_8_3 - 0.007081489938634*G0_0_1_8_4 - 0.00127301270158433*G0_0_1_8_6 - 0.0163750535179135*G0_0_1_8_7 + 0.0461909519052455*G0_0_1_8_8 + 0.0104181532752979*G0_0_1_8_9 + 0.0017753674896535*G0_0_1_9_0 + 0.00124827553399005*G0_0_1_9_1 + 0.00117025831311565*G0_0_1_9_2 + 0.00305979734551215*G0_0_1_9_3 + 0.0111945197659502*G0_0_1_9_4 - 0.0053261024689605*G0_0_1_9_5 - 0.0078721278721292*G0_0_1_9_7 + 0.0104181532752979*G0_0_1_9_8 + 0.010652204937921*G0_0_1_9_9 - 0.00286380286380335*G0_1_0_0_0 - 0.000177115653306158*G0_1_0_0_1 + 0.000293789103312976*G0_1_0_0_2 + 0.000684474255902952*G0_1_0_0_4 - 0.00233951233951273*G0_1_0_0_5 + 0.000387205387205454*G0_1_0_0_6 - 0.00182854182854213*G0_1_0_0_7 + 0.000830465830465968*G0_1_0_0_8 - 0.000740370740370863*G0_1_0_0_9 - 0.000177115653306158*G0_1_0_1_0 + 0.000405449929259519*G0_1_0_1_1 + 0.00140142925857236*G0_1_0_1_2 - 0.000245204530918863*G0_1_0_1_3 + 0.00186657258085862*G0_1_0_1_4 - 0.000311989597703937*G0_1_0_1_5 - 0.000243169528883853*G0_1_0_1_6 - 0.000366009651723998*G0_1_0_1_7 + 0.000231725946011701*G0_1_0_1_8 - 0.000400393257536182*G0_1_0_1_9 + 0.000293789103312976*G0_1_0_2_0 + 0.00140142925857236*G0_1_0_2_1 + 0.0229535896202604*G0_1_0_2_2 - 0.00651311651311765*G0_1_0_2_3 + 0.0157790357790385*G0_1_0_2_4 - 0.0027065527065532*G0_1_0_2_5 + 0.0037791837791845*G0_1_0_2_6 - 0.000380016808588301*G0_1_0_2_7 + 0.000905760905761069*G0_1_0_2_9 - 0.000245204530918863*G0_1_0_3_1 - 0.00651311651311765*G0_1_0_3_2 + 0.00303173017458786*G0_1_0_3_3 - 0.0101943294800455*G0_1_0_3_4 + 0.000485229056657718*G0_1_0_3_5 + 0.00084701013272454*G0_1_0_3_6 + 0.000269492412349598*G0_1_0_3_7 - 0.000528994814709183*G0_1_0_3_8 + 0.000662194947909349*G0_1_0_3_9 + 0.000684474255902952*G0_1_0_4_0 + 0.00186657258085862*G0_1_0_4_1 + 0.0157790357790385*G0_1_0_4_2 - 0.0101943294800455*G0_1_0_4_3 + 0.0367765567765631*G0_1_0_4_4 - 0.00193592122163585*G0_1_0_4_5 + 0.00108891108891131*G0_1_0_4_6 - 0.000515436944008458*G0_1_0_4_7 + 0.000259502402359585*G0_1_0_4_8 + 0.00115455972598849*G0_1_0_4_9 - 0.00233951233951273*G0_1_0_5_0 - 0.000311989597703937*G0_1_0_5_1 - 0.0027065527065532*G0_1_0_5_2 + 0.000485229056657718*G0_1_0_5_3 - 0.00193592122163585*G0_1_0_5_4 - 0.00587745587745684*G0_1_0_5_5 + 0.00574877503449025*G0_1_0_5_6 - 0.00231102231102269*G0_1_0_5_7 + 0.0010534703391848*G0_1_0_5_8 + 0.000114171542742985*G0_1_0_5_9 + 0.000387205387205454*G0_1_0_6_0 - 0.000243169528883853*G0_1_0_6_1 + 0.0037791837791845*G0_1_0_6_2 + 0.00084701013272454*G0_1_0_6_3 + 0.00108891108891131*G0_1_0_6_4 + 0.00574877503449025*G0_1_0_6_5 - 0.016277056277059*G0_1_0_6_6 + 0.00125755197183789*G0_1_0_6_7 + 0.000377003948432583*G0_1_0_6_8 - 0.00441130298273229*G0_1_0_6_9 - 0.00182854182854213*G0_1_0_7_0 - 0.000366009651723998*G0_1_0_7_1 - 0.000380016808588301*G0_1_0_7_2 + 0.000269492412349598*G0_1_0_7_3 - 0.000515436944008458*G0_1_0_7_4 - 0.00231102231102269*G0_1_0_7_5 + 0.00125755197183789*G0_1_0_7_6 - 0.00278721278721323*G0_1_0_7_7 + 0.00176038247466847*G0_1_0_7_8 - 0.000293991722563204*G0_1_0_7_9 + 0.000830465830465968*G0_1_0_8_0 + 0.0002317259460117*G0_1_0_8_1 - 0.000528994814709183*G0_1_0_8_3 + 0.000259502402359585*G0_1_0_8_4 + 0.0010534703391848*G0_1_0_8_5 + 0.000377003948432583*G0_1_0_8_6 + 0.00176038247466847*G0_1_0_8_7 - 0.00161695447409758*G0_1_0_8_8 + 0.000682174967889375*G0_1_0_8_9 - 0.000740370740370863*G0_1_0_9_0 - 0.000400393257536182*G0_1_0_9_1 + 0.000905760905761068*G0_1_0_9_2 + 0.000662194947909349*G0_1_0_9_3 + 0.00115455972598849*G0_1_0_9_4 + 0.000114171542742985*G0_1_0_9_5 - 0.00441130298273229*G0_1_0_9_6 - 0.000293991722563204*G0_1_0_9_7 + 0.000682174967889375*G0_1_0_9_8 - 0.00217496788925397*G0_1_0_9_9 - 0.00286380286380331*G0_1_1_0_0 - 0.000317310555405843*G0_1_1_0_1 + 0.000158333729762333*G0_1_1_0_2 + 0.0001460708603566*G0_1_1_0_3 + 0.000763390049104467*G0_1_1_0_4 - 0.000510970510970583*G0_1_1_0_5 - 0.00024068524068529*G0_1_1_0_6 - 0.00365708365708427*G0_1_1_0_7 + 0.00112313612313631*G0_1_1_0_8 - 0.000405150405150479*G0_1_1_0_9 - 0.000317310555405843*G0_1_1_1_0 + 0.00448070448070529*G0_1_1_1_1 + 0.000809604857224047*G0_1_1_1_2 - 0.00107289535860981*G0_1_1_1_3 + 0.00113584827870562*G0_1_1_1_4 - 0.000354539640253986*G0_1_1_1_6 - 0.000792382220953798*G0_1_1_1_7 - 0.000245785960071684*G0_1_1_1_8 - 0.00168212739641339*G0_1_1_1_9 + 0.000158333729762333*G0_1_1_2_0 + 0.000809604857224047*G0_1_1_2_1 + 0.00590767257434027*G0_1_1_2_2 - 0.00428542357113859*G0_1_1_2_3 + 0.00915232915233074*G0_1_1_2_4 - 0.00112044040615489*G0_1_1_2_5 + 0.00165575165575195*G0_1_1_2_6 - 0.000425896854468355*G0_1_1_2_7 + 0.00137211994354875*G0_1_1_2_9 + 0.0001460708603566*G0_1_1_3_0 - 0.00107289535860981*G0_1_1_3_1 - 0.00428542357113859*G0_1_1_3_2 - 0.00410161267304195*G0_1_1_3_3 - 0.00367703724846646*G0_1_1_3_4 - 0.0004769040483327*G0_1_1_3_5 + 0.00142119784976951*G0_1_1_3_6 - 0.000295418866847474*G0_1_1_3_8 + 0.00520764949336466*G0_1_1_3_9 + 0.000763390049104468*G0_1_1_4_0 + 0.00113584827870562*G0_1_1_4_1 + 0.00915232915233074*G0_1_1_4_2 - 0.00367703724846646*G0_1_1_4_3 + 0.0569444840873508*G0_1_1_4_4 - 0.00193259121830582*G0_1_1_4_5 + 0.000511393368536313*G0_1_1_4_6 - 0.000685029256457935*G0_1_1_4_7 + 0.000376052518909715*G0_1_1_4_8 - 0.00025117739403462*G0_1_1_4_9 - 0.000510970510970583*G0_1_1_5_0 - 0.00112044040615489*G0_1_1_5_2 - 0.0004769040483327*G0_1_1_5_3 - 0.00193259121830582*G0_1_1_5_4 - 0.00125541125541147*G0_1_1_5_5 + 0.003176585319443*G0_1_1_5_6 - 0.00183483183483214*G0_1_1_5_7 + 0.000199562342419518*G0_1_1_5_8 + 0.000816326530612395*G0_1_1_5_9 - 0.00024068524068529*G0_1_1_6_0 - 0.000354539640253986*G0_1_1_6_1 + 0.00165575165575195*G0_1_1_6_2 + 0.00142119784976951*G0_1_1_6_3 + 0.000511393368536313*G0_1_1_6_4 + 0.003176585319443*G0_1_1_6_5 - 0.00859664145378577*G0_1_1_6_6 + 0.00163526949241263*G0_1_1_6_7 + 0.000362256790828278*G0_1_1_6_8 - 0.00695875553018529*G0_1_1_6_9 - 0.00365708365708427*G0_1_1_7_0 - 0.000792382220953798*G0_1_1_7_1 - 0.000425896854468355*G0_1_1_7_2 - 0.000685029256457934*G0_1_1_7_4 - 0.00183483183483214*G0_1_1_7_5 + 0.00163526949241263*G0_1_1_7_6 - 0.00836163836163975*G0_1_1_7_7 + 0.00586770372484756*G0_1_1_7_8 - 0.00205508776937383*G0_1_1_7_9 + 0.00112313612313631*G0_1_1_8_0 - 0.000245785960071684*G0_1_1_8_1 - 0.000295418866847474*G0_1_1_8_3 + 0.000376052518909715*G0_1_1_8_4 + 0.000199562342419518*G0_1_1_8_5 + 0.000362256790828278*G0_1_1_8_6 + 0.00586770372484756*G0_1_1_8_7 - 0.00711574140145677*G0_1_1_8_8 + 0.00429427715142075*G0_1_1_8_9 - 0.000405150405150479*G0_1_1_9_0 - 0.00168212739641339*G0_1_1_9_1 + 0.00137211994354875*G0_1_1_9_2 + 0.00520764949336466*G0_1_1_9_3 - 0.00025117739403462*G0_1_1_9_4 + 0.000816326530612395*G0_1_1_9_5 - 0.00695875553018529*G0_1_1_9_6 - 0.00205508776937383*G0_1_1_9_7 + 0.00429427715142075*G0_1_1_9_8 - 0.00645640074211617*G0_1_1_9_9; + A[8] = -A[5] - 0.0591889591889693*G0_0_1_0_0 - 0.00342487318677853*G0_0_1_0_1 - 0.00182148539291427*G0_0_1_0_2 + 0.000948390234104706*G0_0_1_0_3 - 0.000161769447483769*G0_0_1_0_4 - 0.0103481703481721*G0_0_1_0_5 + 0.0044614644614652*G0_0_1_0_6 - 0.035938875938882*G0_0_1_0_7 + 0.0148836348836374*G0_0_1_0_8 - 0.00259518259518307*G0_0_1_0_9 - 0.00342487318677853*G0_0_1_1_0 + 0.00367487891297482*G0_0_1_1_1 - 0.000628533723771925*G0_0_1_1_2 - 0.000525823382966311*G0_0_1_1_3 - 0.00108526394240699*G0_0_1_1_4 - 0.001099878957022*G0_0_1_1_6 - 0.00476158761873129*G0_0_1_1_7 + 0.000899418042275357*G0_0_1_1_8 - 0.00346225203368119*G0_0_1_1_9 - 0.00182148539291427*G0_0_1_2_0 - 0.000628533723771925*G0_0_1_2_1 - 0.0153463820130513*G0_0_1_2_2 + 0.00169238169238198*G0_0_1_2_3 - 0.0049709549709558*G0_0_1_2_4 + 0.00171310171310201*G0_0_1_2_5 - 0.0036759536759543*G0_0_1_2_6 - 0.00171355099926557*G0_0_1_2_7 + 0.000738600024314432*G0_0_1_2_8 + 0.00066822066822078*G0_0_1_2_9 + 0.000948390234104706*G0_0_1_3_0 - 0.000525823382966311*G0_0_1_3_1 + 0.00169238169238198*G0_0_1_3_2 - 0.00807763664906664*G0_0_1_3_3 + 0.00793849008134856*G0_0_1_3_4 - 0.00288330716902193*G0_0_1_3_5 + 0.00599424385138771*G0_0_1_3_6 - 0.000150563721992294*G0_0_1_3_7 - 0.000328243185386109*G0_0_1_3_8 + 0.0106878835450282*G0_0_1_3_9 - 0.000161769447483769*G0_0_1_4_0 - 0.00108526394240699*G0_0_1_4_1 - 0.0049709549709558*G0_0_1_4_2 + 0.00793849008134856*G0_0_1_4_3 + 0.0206793206793241*G0_0_1_4_4 + 0.00317991532277301*G0_0_1_4_5 - 0.00917415917416073*G0_0_1_4_6 + 0.00146567717996314*G0_0_1_4_7 + 0.000478806907378419*G0_0_1_4_8 - 0.00836449265020837*G0_0_1_4_9 - 0.0103481703481721*G0_0_1_5_0 + 0.00171310171310201*G0_0_1_5_2 - 0.00288330716902193*G0_0_1_5_3 + 0.00317991532277301*G0_0_1_5_4 + 0.010256410256412*G0_0_1_5_5 + 0.00674349460063861*G0_0_1_5_6 - 0.010303030303032*G0_0_1_5_7 + 0.0024677703249136*G0_0_1_5_8 + 0.00285000713572191*G0_0_1_5_9 + 0.0044614644614652*G0_0_1_6_0 - 0.001099878957022*G0_0_1_6_1 - 0.0036759536759543*G0_0_1_6_2 + 0.00599424385138771*G0_0_1_6_3 - 0.00917415917416073*G0_0_1_6_4 + 0.00674349460063861*G0_0_1_6_5 - 0.0230103230103269*G0_0_1_6_6 + 0.00783525997811844*G0_0_1_6_7 - 0.000805385091099515*G0_0_1_6_8 - 0.0139931497074378*G0_0_1_6_9 - 0.035938875938882*G0_0_1_7_0 - 0.00476158761873129*G0_0_1_7_1 - 0.00171355099926557*G0_0_1_7_2 - 0.000150563721992294*G0_0_1_7_3 + 0.00146567717996314*G0_0_1_7_4 - 0.010303030303032*G0_0_1_7_5 + 0.00783525997811844*G0_0_1_7_6 - 0.0588811188811289*G0_0_1_7_7 + 0.0263500784929401*G0_0_1_7_8 - 0.00788497217068782*G0_0_1_7_9 + 0.0148836348836374*G0_0_1_8_0 + 0.000899418042275357*G0_0_1_8_1 + 0.000738600024314432*G0_0_1_8_2 - 0.000328243185386109*G0_0_1_8_3 + 0.000478806907378419*G0_0_1_8_4 + 0.0024677703249136*G0_0_1_8_5 - 0.000805385091099514*G0_0_1_8_6 + 0.0263500784929401*G0_0_1_8_7 - 0.0146910232624544*G0_0_1_8_8 + 0.00942914228628674*G0_0_1_8_9 - 0.00259518259518308*G0_0_1_9_0 - 0.00346225203368119*G0_0_1_9_1 + 0.00066822066822078*G0_0_1_9_2 + 0.0106878835450282*G0_0_1_9_3 - 0.00836449265020837*G0_0_1_9_4 + 0.00285000713572191*G0_0_1_9_5 - 0.0139931497074378*G0_0_1_9_6 - 0.00788497217068782*G0_0_1_9_7 + 0.00942914228628674*G0_0_1_9_8 - 0.0213900385328993*G0_0_1_9_9 - 0.0591889591889693*G0_1_1_0_0 - 0.00342487318677853*G0_1_1_0_1 - 0.00182148539291427*G0_1_1_0_2 + 0.000948390234104707*G0_1_1_0_3 - 0.000161769447483772*G0_1_1_0_4 - 0.0103481703481721*G0_1_1_0_5 + 0.0044614644614652*G0_1_1_0_6 - 0.035938875938882*G0_1_1_0_7 + 0.0148836348836374*G0_1_1_0_8 - 0.00259518259518308*G0_1_1_0_9 - 0.00342487318677853*G0_1_1_1_0 + 0.00367487891297483*G0_1_1_1_1 - 0.000628533723771928*G0_1_1_1_2 - 0.000525823382966307*G0_1_1_1_3 - 0.00108526394240699*G0_1_1_1_4 - 0.001099878957022*G0_1_1_1_6 - 0.0047615876187313*G0_1_1_1_7 + 0.000899418042275366*G0_1_1_1_8 - 0.00346225203368119*G0_1_1_1_9 - 0.00182148539291427*G0_1_1_2_0 - 0.000628533723771928*G0_1_1_2_1 - 0.0153463820130514*G0_1_1_2_2 + 0.00169238169238199*G0_1_1_2_3 - 0.00497095497095583*G0_1_1_2_4 + 0.00171310171310202*G0_1_1_2_5 - 0.00367595367595433*G0_1_1_2_6 - 0.00171355099926557*G0_1_1_2_7 + 0.000738600024314434*G0_1_1_2_8 + 0.000668220668220778*G0_1_1_2_9 + 0.000948390234104707*G0_1_1_3_0 - 0.000525823382966306*G0_1_1_3_1 + 0.00169238169238199*G0_1_1_3_2 - 0.00807763664906663*G0_1_1_3_3 + 0.00793849008134857*G0_1_1_3_4 - 0.00288330716902194*G0_1_1_3_5 + 0.00599424385138773*G0_1_1_3_6 - 0.000150563721992296*G0_1_1_3_7 - 0.000328243185386103*G0_1_1_3_8 + 0.0106878835450282*G0_1_1_3_9 - 0.000161769447483772*G0_1_1_4_0 - 0.00108526394240699*G0_1_1_4_1 - 0.00497095497095583*G0_1_1_4_2 + 0.00793849008134857*G0_1_1_4_3 + 0.0206793206793241*G0_1_1_4_4 + 0.00317991532277302*G0_1_1_4_5 - 0.00917415917416075*G0_1_1_4_6 + 0.00146567717996314*G0_1_1_4_7 + 0.000478806907378415*G0_1_1_4_8 - 0.00836449265020839*G0_1_1_4_9 - 0.0103481703481721*G0_1_1_5_0 + 0.00171310171310202*G0_1_1_5_2 - 0.00288330716902194*G0_1_1_5_3 + 0.00317991532277302*G0_1_1_5_4 + 0.010256410256412*G0_1_1_5_5 + 0.00674349460063863*G0_1_1_5_6 - 0.010303030303032*G0_1_1_5_7 + 0.0024677703249136*G0_1_1_5_8 + 0.00285000713572191*G0_1_1_5_9 + 0.00446146446146519*G0_1_1_6_0 - 0.001099878957022*G0_1_1_6_1 - 0.00367595367595433*G0_1_1_6_2 + 0.00599424385138772*G0_1_1_6_3 - 0.00917415917416075*G0_1_1_6_4 + 0.00674349460063863*G0_1_1_6_5 - 0.0230103230103269*G0_1_1_6_6 + 0.00783525997811844*G0_1_1_6_7 - 0.000805385091099514*G0_1_1_6_8 - 0.0139931497074378*G0_1_1_6_9 - 0.035938875938882*G0_1_1_7_0 - 0.0047615876187313*G0_1_1_7_1 - 0.00171355099926557*G0_1_1_7_2 - 0.000150563721992296*G0_1_1_7_3 + 0.00146567717996314*G0_1_1_7_4 - 0.010303030303032*G0_1_1_7_5 + 0.00783525997811844*G0_1_1_7_6 - 0.0588811188811289*G0_1_1_7_7 + 0.0263500784929401*G0_1_1_7_8 - 0.00788497217068782*G0_1_1_7_9 + 0.0148836348836374*G0_1_1_8_0 + 0.000899418042275366*G0_1_1_8_1 + 0.000738600024314434*G0_1_1_8_2 - 0.000328243185386104*G0_1_1_8_3 + 0.000478806907378415*G0_1_1_8_4 + 0.0024677703249136*G0_1_1_8_5 - 0.000805385091099514*G0_1_1_8_6 + 0.0263500784929401*G0_1_1_8_7 - 0.0146910232624543*G0_1_1_8_8 + 0.00942914228628675*G0_1_1_8_9 - 0.00259518259518308*G0_1_1_9_0 - 0.00346225203368119*G0_1_1_9_1 + 0.000668220668220778*G0_1_1_9_2 + 0.0106878835450282*G0_1_1_9_3 - 0.00836449265020839*G0_1_1_9_4 + 0.00285000713572191*G0_1_1_9_5 - 0.0139931497074378*G0_1_1_9_6 - 0.00788497217068782*G0_1_1_9_7 + 0.00942914228628675*G0_1_1_9_8 - 0.0213900385328994*G0_1_1_9_9; + A[45] = A[5] + 0.000335449383068487*G0_0_0_0_1 - 0.000611099658718815*G0_0_0_0_2 + 0.000814053671196672*G0_0_0_0_3 - 0.000538403395546347*G0_0_0_0_4 - 0.00131757131757156*G0_0_0_0_5 + 0.000735930735930873*G0_0_0_0_6 + 0.00131757131757152*G0_0_0_0_7 - 0.00107115107115124*G0_0_0_0_8 + 0.000335220335220391*G0_0_0_0_9 + 0.000335449383068487*G0_0_0_1_0 + 0.00550222264508071*G0_0_0_1_1 - 0.000591824401348314*G0_0_0_1_2 + 0.00939753368324956*G0_0_0_1_3 - 0.00615199615199719*G0_0_0_1_4 - 0.000113907256764421*G0_0_0_1_5 + 0.000237011665583137*G0_0_0_1_6 - 0.000754430754430887*G0_0_0_1_7 + 0.00142402570974024*G0_0_0_1_8 + 0.00177251320108494*G0_0_0_1_9 - 0.000611099658718815*G0_0_0_2_0 - 0.000591824401348314*G0_0_0_2_1 - 0.0184728851395549*G0_0_0_2_2 + 0.00764896479182322*G0_0_0_2_3 - 0.0168519311376483*G0_0_0_2_4 + 0.00191417048559938*G0_0_0_2_5 - 0.00402496973925613*G0_0_0_2_6 + 0.000432689004117646*G0_0_0_2_7 - 0.000307206021491787*G0_0_0_2_8 - 0.00258788830217445*G0_0_0_2_9 + 0.000814053671196672*G0_0_0_3_0 + 0.00939753368324956*G0_0_0_3_1 + 0.00764896479182322*G0_0_0_3_2 + 0.053912753912763*G0_0_0_3_3 + 0.00651729223157905*G0_0_0_3_4 - 0.00117025831311564*G0_0_0_3_5 - 0.00047095761381484*G0_0_0_3_6 - 0.00220208363065543*G0_0_0_3_7 + 0.0010403881832455*G0_0_0_3_8 - 0.000913372341943916*G0_0_0_3_9 - 0.000538403395546347*G0_0_0_4_0 - 0.00615199615199719*G0_0_0_4_1 - 0.0168519311376483*G0_0_0_4_2 + 0.00651729223157905*G0_0_0_4_3 - 0.0408781694496049*G0_0_0_4_4 + 0.00185528756957359*G0_0_0_4_5 - 0.00138432995575875*G0_0_0_4_6 + 0.00116169544740992*G0_0_0_4_8 + 0.00405308976737619*G0_0_0_4_9 - 0.00131757131757156*G0_0_0_5_0 - 0.000113907256764421*G0_0_0_5_1 + 0.00191417048559937*G0_0_0_5_2 - 0.00117025831311564*G0_0_0_5_3 + 0.00185528756957359*G0_0_0_5_4 - 0.00248418248418291*G0_0_0_5_5 + 0.00011892869035729*G0_0_0_5_6 + 0.000476190476190543*G0_0_0_5_7 + 0.000581799153227831*G0_0_0_5_8 - 0.00216925931211683*G0_0_0_5_9 + 0.000735930735930873*G0_0_0_6_0 + 0.000237011665583137*G0_0_0_6_1 - 0.00402496973925613*G0_0_0_6_2 - 0.00047095761381484*G0_0_0_6_3 - 0.00138432995575875*G0_0_0_6_4 + 0.000118928690357291*G0_0_0_6_5 + 0.00916131487560216*G0_0_0_6_6 - 0.00105798962941837*G0_0_0_6_7 + 0.00870558013415304*G0_0_0_6_9 + 0.00131757131757152*G0_0_0_7_0 - 0.000754430754430887*G0_0_0_7_1 + 0.000432689004117646*G0_0_0_7_2 - 0.00220208363065543*G0_0_0_7_3 + 0.000476190476190543*G0_0_0_7_5 - 0.00105798962941837*G0_0_0_7_6 + 0.00153180153180176*G0_0_0_7_7 + 0.00141620284477452*G0_0_0_7_8 + 0.00111031825317558*G0_0_0_7_9 - 0.00107115107115124*G0_0_0_8_0 + 0.00142402570974024*G0_0_0_8_1 - 0.000307206021491787*G0_0_0_8_2 + 0.0010403881832455*G0_0_0_8_3 + 0.00116169544740992*G0_0_0_8_4 + 0.000581799153227831*G0_0_0_8_5 + 0.00141620284477452*G0_0_0_8_7 - 0.00697968697968815*G0_0_0_8_8 - 0.00764093049807464*G0_0_0_8_9 + 0.000335220335220392*G0_0_0_9_0 + 0.00177251320108494*G0_0_0_9_1 - 0.00258788830217445*G0_0_0_9_2 - 0.000913372341943916*G0_0_0_9_3 + 0.00405308976737619*G0_0_0_9_4 - 0.00216925931211683*G0_0_0_9_5 + 0.00870558013415304*G0_0_0_9_6 + 0.00111031825317558*G0_0_0_9_7 - 0.00764093049807464*G0_0_0_9_8 - 0.00428143285286215*G0_0_0_9_9 + 0.000475644285168174*G0_0_1_0_1 - 0.000475644285168178*G0_0_1_0_2 + 0.000617319188747867*G0_0_1_0_3 - 0.000617319188747867*G0_0_1_0_4 - 0.00314611314611371*G0_0_1_0_5 + 0.00136382136382161*G0_0_1_0_6 + 0.00314611314611365*G0_0_1_0_7 - 0.00136382136382158*G0_0_1_0_8 + 0.000475644285168173*G0_0_1_1_0 + 0.00142696809363495*G0_0_1_1_1 + 0.0102252245109405*G0_0_1_1_3 - 0.00542127184984419*G0_0_1_1_4 - 0.000478569049997702*G0_0_1_1_5 + 0.000348381776953267*G0_0_1_1_6 - 0.000328058185201096*G0_0_1_1_7 + 0.00190153761582364*G0_0_1_1_8 + 0.00305424733996215*G0_0_1_1_9 - 0.000475644285168178*G0_0_1_2_0 - 0.00142696809363496*G0_0_1_2_2 + 0.00542127184984418*G0_0_1_2_3 - 0.0102252245109405*G0_0_1_2_4 + 0.00032805818520109*G0_0_1_2_5 - 0.00190153761582363*G0_0_1_2_6 + 0.0004785690499977*G0_0_1_2_7 - 0.000348381776953262*G0_0_1_2_8 - 0.00305424733996214*G0_0_1_2_9 + 0.000617319188747867*G0_0_1_3_0 + 0.0102252245109405*G0_0_1_3_1 + 0.00542127184984418*G0_0_1_3_2 + 0.0610460967603928*G0_0_1_3_3 - 0.000208125208125226*G0_0_1_3_5 - 0.0010451453308598*G0_0_1_3_6 - 0.00185195756624359*G0_0_1_3_7 + 0.000806812235383802*G0_0_1_3_8 - 0.00545882688739923*G0_0_1_3_9 - 0.000617319188747867*G0_0_1_4_0 - 0.00542127184984419*G0_0_1_4_1 - 0.0102252245109405*G0_0_1_4_2 - 0.0610460967603927*G0_0_1_4_4 + 0.00185195756624357*G0_0_1_4_5 - 0.000806812235383778*G0_0_1_4_6 + 0.000208125208125237*G0_0_1_4_7 + 0.00104514533085978*G0_0_1_4_8 + 0.00545882688739928*G0_0_1_4_9 - 0.00314611314611371*G0_0_1_5_0 - 0.000478569049997702*G0_0_1_5_1 + 0.00032805818520109*G0_0_1_5_2 - 0.000208125208125226*G0_0_1_5_3 + 0.00185195756624357*G0_0_1_5_4 - 0.00710622710622829*G0_0_1_5_5 + 0.00269111840540456*G0_0_1_5_6 + 0.00143570714999311*G0_0_1_5_8 - 0.00287141429998624*G0_0_1_5_9 + 0.00136382136382161*G0_0_1_6_0 + 0.000348381776953267*G0_0_1_6_1 - 0.00190153761582363*G0_0_1_6_2 - 0.0010451453308598*G0_0_1_6_3 - 0.000806812235383777*G0_0_1_6_4 + 0.00269111840540456*G0_0_1_6_5 + 0.00148090005232891*G0_0_1_6_6 - 0.00143570714999311*G0_0_1_6_7 + 0.011253032681606*G0_0_1_6_9 + 0.00314611314611365*G0_0_1_7_0 - 0.000328058185201096*G0_0_1_7_1 + 0.0004785690499977*G0_0_1_7_2 - 0.00185195756624359*G0_0_1_7_3 + 0.000208125208125237*G0_0_1_7_4 - 0.00143570714999311*G0_0_1_7_6 + 0.0071062271062283*G0_0_1_7_7 - 0.00269111840540457*G0_0_1_7_8 + 0.0028714142999862*G0_0_1_7_9 - 0.00136382136382158*G0_0_1_8_0 + 0.00190153761582364*G0_0_1_8_1 - 0.000348381776953262*G0_0_1_8_2 + 0.000806812235383803*G0_0_1_8_3 + 0.00104514533085978*G0_0_1_8_4 + 0.00143570714999311*G0_0_1_8_5 - 0.00269111840540457*G0_0_1_8_7 - 0.00148090005232882*G0_0_1_8_8 - 0.011253032681606*G0_0_1_8_9 + 0.00305424733996215*G0_0_1_9_1 - 0.00305424733996214*G0_0_1_9_2 - 0.00545882688739923*G0_0_1_9_3 + 0.00545882688739928*G0_0_1_9_4 - 0.00287141429998624*G0_0_1_9_5 + 0.011253032681606*G0_0_1_9_6 + 0.0028714142999862*G0_0_1_9_7 - 0.011253032681606*G0_0_1_9_8 + 0.000470904756619123*G0_1_0_0_1 - 0.000470904756619135*G0_1_0_0_2 + 0.000735137877995154*G0_1_0_0_3 - 0.000735137877995154*G0_1_0_0_4 + 0.000510970510970557*G0_1_0_0_5 + 0.000443260443260535*G0_1_0_0_6 - 0.000510970510970645*G0_1_0_0_7 - 0.000443260443260495*G0_1_0_0_8 + 0.000470904756619123*G0_1_0_1_0 + 0.0225481396910007*G0_1_0_1_1 + 0.0160242403099573*G0_1_0_1_3 - 0.00837968909397623*G0_1_0_1_4 + 0.000195835910121659*G0_1_0_1_6 - 0.00234054305482919*G0_1_0_1_7 + 0.00354745783317275*G0_1_0_1_8 + 0.00130615416329725*G0_1_0_1_9 - 0.000470904756619135*G0_1_0_2_0 - 0.0225481396910008*G0_1_0_2_2 + 0.00837968909397625*G0_1_0_2_3 - 0.0160242403099574*G0_1_0_2_4 + 0.00234054305482918*G0_1_0_2_5 - 0.00354745783317277*G0_1_0_2_6 - 0.000195835910121653*G0_1_0_2_8 - 0.00130615416329725*G0_1_0_2_9 + 0.000735137877995154*G0_1_0_3_0 + 0.0160242403099573*G0_1_0_3_1 + 0.00837968909397624*G0_1_0_3_2 + 0.0337448266019751*G0_1_0_3_3 - 0.00100066600066617*G0_1_0_3_5 - 0.000587507730364962*G0_1_0_3_6 - 0.00220541363398544*G0_1_0_3_7 + 0.00161790590362048*G0_1_0_3_8 + 0.000492364778079161*G0_1_0_3_9 - 0.000735137877995154*G0_1_0_4_0 - 0.00837968909397623*G0_1_0_4_1 - 0.0160242403099574*G0_1_0_4_2 - 0.0337448266019753*G0_1_0_4_4 + 0.00220541363398545*G0_1_0_4_5 - 0.00161790590362049*G0_1_0_4_6 + 0.00100066600066618*G0_1_0_4_7 + 0.000587507730364961*G0_1_0_4_8 - 0.000492364778079146*G0_1_0_4_9 + 0.000510970510970557*G0_1_0_5_0 + 0.00234054305482918*G0_1_0_5_2 - 0.00100066600066617*G0_1_0_5_3 + 0.00220541363398545*G0_1_0_5_4 + 0.00309024309024355*G0_1_0_5_5 - 0.00398839255982176*G0_1_0_5_6 + 0.000204081632653112*G0_1_0_5_8 - 0.000408163265306203*G0_1_0_5_9 + 0.000443260443260535*G0_1_0_6_0 + 0.000195835910121659*G0_1_0_6_1 - 0.00354745783317277*G0_1_0_6_2 - 0.000587507730364962*G0_1_0_6_3 - 0.00161790590362049*G0_1_0_6_4 - 0.00398839255982176*G0_1_0_6_5 + 0.0146601018029614*G0_1_0_6_6 - 0.000204081632653075*G0_1_0_6_7 + 0.00509347795062167*G0_1_0_6_9 - 0.000510970510970645*G0_1_0_7_0 - 0.00234054305482919*G0_1_0_7_1 - 0.00220541363398544*G0_1_0_7_3 + 0.00100066600066618*G0_1_0_7_4 - 0.000204081632653075*G0_1_0_7_6 - 0.00309024309024368*G0_1_0_7_7 + 0.00398839255982182*G0_1_0_7_8 + 0.000408163265306172*G0_1_0_7_9 - 0.000443260443260495*G0_1_0_8_0 + 0.00354745783317275*G0_1_0_8_1 - 0.000195835910121653*G0_1_0_8_2 + 0.00161790590362048*G0_1_0_8_3 + 0.000587507730364961*G0_1_0_8_4 + 0.000204081632653112*G0_1_0_8_5 + 0.00398839255982182*G0_1_0_8_7 - 0.0146601018029614*G0_1_0_8_8 - 0.00509347795062166*G0_1_0_8_9 + 0.00130615416329725*G0_1_0_9_1 - 0.00130615416329725*G0_1_0_9_2 + 0.000492364778079161*G0_1_0_9_3 - 0.000492364778079145*G0_1_0_9_4 - 0.000408163265306203*G0_1_0_9_5 + 0.00509347795062167*G0_1_0_9_6 + 0.000408163265306172*G0_1_0_9_7 - 0.00509347795062166*G0_1_0_9_8 + 0.00061109965871881*G0_1_1_0_1 - 0.000335449383068495*G0_1_1_0_2 + 0.000538403395546349*G0_1_1_0_3 - 0.000814053671196672*G0_1_1_0_4 - 0.00131757131757159*G0_1_1_0_5 + 0.00107115107115128*G0_1_1_0_6 + 0.00131757131757149*G0_1_1_0_7 - 0.000735930735930834*G0_1_1_0_8 - 0.000335220335220391*G0_1_1_0_9 + 0.00061109965871881*G0_1_1_1_0 + 0.0184728851395549*G0_1_1_1_1 + 0.000591824401348304*G0_1_1_1_2 + 0.0168519311376483*G0_1_1_1_3 - 0.00764896479182323*G0_1_1_1_4 - 0.000432689004117655*G0_1_1_1_5 + 0.000307206021491791*G0_1_1_1_6 - 0.0019141704855994*G0_1_1_1_7 + 0.00402496973925616*G0_1_1_1_8 + 0.00258788830217446*G0_1_1_1_9 - 0.000335449383068495*G0_1_1_2_0 + 0.000591824401348304*G0_1_1_2_1 - 0.00550222264508074*G0_1_1_2_2 + 0.0061519961519972*G0_1_1_2_3 - 0.00939753368324959*G0_1_1_2_4 + 0.000754430754430883*G0_1_1_2_5 - 0.00142402570974024*G0_1_1_2_6 + 0.000113907256764415*G0_1_1_2_7 - 0.000237011665583129*G0_1_1_2_8 - 0.00177251320108493*G0_1_1_2_9 + 0.000538403395546349*G0_1_1_3_0 + 0.0168519311376483*G0_1_1_3_1 + 0.0061519961519972*G0_1_1_3_2 + 0.0408781694496049*G0_1_1_3_3 - 0.00651729223157902*G0_1_1_3_4 - 0.00116169544740993*G0_1_1_3_6 - 0.0018552875695736*G0_1_1_3_7 + 0.00138432995575878*G0_1_1_3_8 - 0.00405308976737615*G0_1_1_3_9 - 0.000814053671196672*G0_1_1_4_0 - 0.00764896479182323*G0_1_1_4_1 - 0.00939753368324959*G0_1_1_4_2 - 0.00651729223157902*G0_1_1_4_3 - 0.053912753912763*G0_1_1_4_4 + 0.00220208363065542*G0_1_1_4_5 - 0.0010403881832455*G0_1_1_4_6 + 0.00117025831311565*G0_1_1_4_7 + 0.000470957613814822*G0_1_1_4_8 + 0.000913372341943955*G0_1_1_4_9 - 0.00131757131757159*G0_1_1_5_0 - 0.000432689004117655*G0_1_1_5_1 + 0.000754430754430883*G0_1_1_5_2 + 0.00220208363065542*G0_1_1_5_4 - 0.00153180153180183*G0_1_1_5_5 - 0.0014162028447745*G0_1_1_5_6 - 0.000476190476190579*G0_1_1_5_7 + 0.00105798962941839*G0_1_1_5_8 - 0.00111031825317561*G0_1_1_5_9 + 0.00107115107115128*G0_1_1_6_0 + 0.00030720602149179*G0_1_1_6_1 - 0.00142402570974024*G0_1_1_6_2 - 0.00116169544740993*G0_1_1_6_3 - 0.0010403881832455*G0_1_1_6_4 - 0.0014162028447745*G0_1_1_6_5 + 0.00697968697968816*G0_1_1_6_6 - 0.00058179915322781*G0_1_1_6_7 + 0.00764093049807466*G0_1_1_6_9 + 0.00131757131757149*G0_1_1_7_0 - 0.0019141704855994*G0_1_1_7_1 + 0.000113907256764414*G0_1_1_7_2 - 0.0018552875695736*G0_1_1_7_3 + 0.00117025831311565*G0_1_1_7_4 - 0.000476190476190579*G0_1_1_7_5 - 0.00058179915322781*G0_1_1_7_6 + 0.00248418248418286*G0_1_1_7_7 - 0.000118928690357291*G0_1_1_7_8 + 0.0021692593121168*G0_1_1_7_9 - 0.000735930735930833*G0_1_1_8_0 + 0.00402496973925616*G0_1_1_8_1 - 0.00023701166558313*G0_1_1_8_2 + 0.00138432995575878*G0_1_1_8_3 + 0.000470957613814822*G0_1_1_8_4 + 0.00105798962941839*G0_1_1_8_5 - 0.000118928690357291*G0_1_1_8_7 - 0.00916131487560208*G0_1_1_8_8 - 0.00870558013415301*G0_1_1_8_9 - 0.000335220335220391*G0_1_1_9_0 + 0.00258788830217446*G0_1_1_9_1 - 0.00177251320108493*G0_1_1_9_2 - 0.00405308976737615*G0_1_1_9_3 + 0.000913372341943955*G0_1_1_9_4 - 0.00111031825317561*G0_1_1_9_5 + 0.00764093049807466*G0_1_1_9_6 + 0.0021692593121168*G0_1_1_9_7 - 0.00870558013415301*G0_1_1_9_8 + 0.0042814328528622*G0_1_1_9_9; + A[165] = -A[45] - 0.0591889591889696*G0_0_0_0_0 - 0.00182148539291429*G0_0_0_0_1 - 0.00342487318677854*G0_0_0_0_2 - 0.000161769447483746*G0_0_0_0_3 + 0.000948390234104684*G0_0_0_0_4 - 0.0359388759388822*G0_0_0_0_5 + 0.0148836348836375*G0_0_0_0_6 - 0.0103481703481722*G0_0_0_0_7 + 0.00446146446146526*G0_0_0_0_8 - 0.00259518259518307*G0_0_0_0_9 - 0.00182148539291429*G0_0_0_1_0 - 0.0153463820130513*G0_0_0_1_1 - 0.000628533723771925*G0_0_0_1_2 - 0.00497095497095581*G0_0_0_1_3 + 0.00169238169238198*G0_0_0_1_4 - 0.00171355099926557*G0_0_0_1_5 + 0.000738600024314436*G0_0_0_1_6 + 0.001713101713102*G0_0_0_1_7 - 0.00367595367595431*G0_0_0_1_8 + 0.000668220668220778*G0_0_0_1_9 - 0.00342487318677854*G0_0_0_2_0 - 0.000628533723771925*G0_0_0_2_1 + 0.00367487891297477*G0_0_0_2_2 - 0.00108526394240698*G0_0_0_2_3 - 0.000525823382966334*G0_0_0_2_4 - 0.00476158761873129*G0_0_0_2_5 + 0.000899418042275346*G0_0_0_2_6 - 0.00109987895702199*G0_0_0_2_8 - 0.00346225203368119*G0_0_0_2_9 - 0.000161769447483746*G0_0_0_3_0 - 0.00497095497095582*G0_0_0_3_1 - 0.00108526394240698*G0_0_0_3_2 + 0.0206793206793242*G0_0_0_3_3 + 0.00793849008134856*G0_0_0_3_4 + 0.00146567717996315*G0_0_0_3_5 + 0.000478806907378406*G0_0_0_3_6 + 0.003179915322773*G0_0_0_3_7 - 0.00917415917416072*G0_0_0_3_8 - 0.00836449265020834*G0_0_0_3_9 + 0.000948390234104685*G0_0_0_4_0 + 0.00169238169238198*G0_0_0_4_1 - 0.000525823382966334*G0_0_0_4_2 + 0.00793849008134856*G0_0_0_4_3 - 0.00807763664906654*G0_0_0_4_4 - 0.000150563721992322*G0_0_0_4_5 - 0.000328243185386082*G0_0_0_4_6 - 0.00288330716902194*G0_0_0_4_7 + 0.00599424385138771*G0_0_0_4_8 + 0.0106878835450282*G0_0_0_4_9 - 0.0359388759388822*G0_0_0_5_0 - 0.00171355099926557*G0_0_0_5_1 - 0.00476158761873129*G0_0_0_5_2 + 0.00146567717996315*G0_0_0_5_3 - 0.000150563721992322*G0_0_0_5_4 - 0.0588811188811289*G0_0_0_5_5 + 0.0263500784929401*G0_0_0_5_6 - 0.0103030303030321*G0_0_0_5_7 + 0.00783525997811847*G0_0_0_5_8 - 0.00788497217068784*G0_0_0_5_9 + 0.0148836348836375*G0_0_0_6_0 + 0.000738600024314436*G0_0_0_6_1 + 0.000899418042275346*G0_0_0_6_2 + 0.000478806907378406*G0_0_0_6_3 - 0.000328243185386082*G0_0_0_6_4 + 0.0263500784929401*G0_0_0_6_5 - 0.0146910232624543*G0_0_0_6_6 + 0.00246777032491361*G0_0_0_6_7 - 0.00080538509109953*G0_0_0_6_8 + 0.00942914228628677*G0_0_0_6_9 - 0.0103481703481722*G0_0_0_7_0 + 0.001713101713102*G0_0_0_7_1 + 0.003179915322773*G0_0_0_7_3 - 0.00288330716902194*G0_0_0_7_4 - 0.0103030303030321*G0_0_0_7_5 + 0.00246777032491361*G0_0_0_7_6 + 0.0102564102564119*G0_0_0_7_7 + 0.00674349460063863*G0_0_0_7_8 + 0.00285000713572189*G0_0_0_7_9 + 0.00446146446146526*G0_0_0_8_0 - 0.00367595367595431*G0_0_0_8_1 - 0.00109987895702199*G0_0_0_8_2 - 0.00917415917416072*G0_0_0_8_3 + 0.00599424385138771*G0_0_0_8_4 + 0.00783525997811847*G0_0_0_8_5 - 0.00080538509109953*G0_0_0_8_6 + 0.00674349460063863*G0_0_0_8_7 - 0.0230103230103269*G0_0_0_8_8 - 0.0139931497074378*G0_0_0_8_9 - 0.00259518259518307*G0_0_0_9_0 + 0.000668220668220778*G0_0_0_9_1 - 0.00346225203368119*G0_0_0_9_2 - 0.00836449265020834*G0_0_0_9_3 + 0.0106878835450282*G0_0_0_9_4 - 0.00788497217068784*G0_0_0_9_5 + 0.00942914228628677*G0_0_0_9_6 + 0.00285000713572189*G0_0_0_9_7 - 0.0139931497074378*G0_0_0_9_8 - 0.0213900385328993*G0_0_0_9_9 - 0.0591889591889696*G0_0_1_0_0 - 0.00182148539291429*G0_0_1_0_1 - 0.00342487318677854*G0_0_1_0_2 - 0.000161769447483748*G0_0_1_0_3 + 0.000948390234104685*G0_0_1_0_4 - 0.0359388759388822*G0_0_1_0_5 + 0.0148836348836375*G0_0_1_0_6 - 0.0103481703481722*G0_0_1_0_7 + 0.00446146446146526*G0_0_1_0_8 - 0.00259518259518307*G0_0_1_0_9 - 0.00182148539291429*G0_0_1_1_0 - 0.0153463820130513*G0_0_1_1_1 - 0.000628533723771924*G0_0_1_1_2 - 0.00497095497095582*G0_0_1_1_3 + 0.00169238169238198*G0_0_1_1_4 - 0.00171355099926557*G0_0_1_1_5 + 0.000738600024314437*G0_0_1_1_6 + 0.001713101713102*G0_0_1_1_7 - 0.00367595367595432*G0_0_1_1_8 + 0.000668220668220776*G0_0_1_1_9 - 0.00342487318677854*G0_0_1_2_0 - 0.000628533723771924*G0_0_1_2_1 + 0.00367487891297481*G0_0_1_2_2 - 0.00108526394240698*G0_0_1_2_3 - 0.000525823382966328*G0_0_1_2_4 - 0.0047615876187313*G0_0_1_2_5 + 0.00089941804227536*G0_0_1_2_6 - 0.00109987895702199*G0_0_1_2_8 - 0.00346225203368119*G0_0_1_2_9 - 0.000161769447483748*G0_0_1_3_0 - 0.00497095497095581*G0_0_1_3_1 - 0.00108526394240698*G0_0_1_3_2 + 0.0206793206793242*G0_0_1_3_3 + 0.00793849008134855*G0_0_1_3_4 + 0.00146567717996315*G0_0_1_3_5 + 0.000478806907378403*G0_0_1_3_6 + 0.003179915322773*G0_0_1_3_7 - 0.00917415917416071*G0_0_1_3_8 - 0.00836449265020834*G0_0_1_3_9 + 0.000948390234104685*G0_0_1_4_0 + 0.00169238169238198*G0_0_1_4_1 - 0.000525823382966328*G0_0_1_4_2 + 0.00793849008134856*G0_0_1_4_3 - 0.00807763664906654*G0_0_1_4_4 - 0.000150563721992325*G0_0_1_4_5 - 0.000328243185386076*G0_0_1_4_6 - 0.00288330716902194*G0_0_1_4_7 + 0.0059942438513877*G0_0_1_4_8 + 0.0106878835450282*G0_0_1_4_9 - 0.0359388759388822*G0_0_1_5_0 - 0.00171355099926557*G0_0_1_5_1 - 0.0047615876187313*G0_0_1_5_2 + 0.00146567717996315*G0_0_1_5_3 - 0.000150563721992325*G0_0_1_5_4 - 0.0588811188811289*G0_0_1_5_5 + 0.0263500784929401*G0_0_1_5_6 - 0.0103030303030321*G0_0_1_5_7 + 0.00783525997811847*G0_0_1_5_8 - 0.00788497217068784*G0_0_1_5_9 + 0.0148836348836375*G0_0_1_6_0 + 0.000738600024314437*G0_0_1_6_1 + 0.000899418042275359*G0_0_1_6_2 + 0.000478806907378403*G0_0_1_6_3 - 0.000328243185386076*G0_0_1_6_4 + 0.0263500784929401*G0_0_1_6_5 - 0.0146910232624543*G0_0_1_6_6 + 0.00246777032491361*G0_0_1_6_7 - 0.000805385091099537*G0_0_1_6_8 + 0.00942914228628677*G0_0_1_6_9 - 0.0103481703481722*G0_0_1_7_0 + 0.001713101713102*G0_0_1_7_1 + 0.00317991532277301*G0_0_1_7_3 - 0.00288330716902194*G0_0_1_7_4 - 0.0103030303030321*G0_0_1_7_5 + 0.00246777032491361*G0_0_1_7_6 + 0.0102564102564119*G0_0_1_7_7 + 0.00674349460063862*G0_0_1_7_8 + 0.00285000713572188*G0_0_1_7_9 + 0.00446146446146526*G0_0_1_8_0 - 0.00367595367595432*G0_0_1_8_1 - 0.00109987895702199*G0_0_1_8_2 - 0.00917415917416071*G0_0_1_8_3 + 0.0059942438513877*G0_0_1_8_4 + 0.00783525997811847*G0_0_1_8_5 - 0.000805385091099537*G0_0_1_8_6 + 0.00674349460063862*G0_0_1_8_7 - 0.0230103230103268*G0_0_1_8_8 - 0.0139931497074377*G0_0_1_8_9 - 0.00259518259518307*G0_0_1_9_0 + 0.000668220668220776*G0_0_1_9_1 - 0.00346225203368119*G0_0_1_9_2 - 0.00836449265020834*G0_0_1_9_3 + 0.0106878835450282*G0_0_1_9_4 - 0.00788497217068784*G0_0_1_9_5 + 0.00942914228628677*G0_0_1_9_6 + 0.00285000713572188*G0_0_1_9_7 - 0.0139931497074377*G0_0_1_9_8 - 0.0213900385328993*G0_0_1_9_9; + A[75] = A[5] + 0.000140194902099687*G0_0_1_0_1 + 0.000135455373550642*G0_0_1_0_2 - 0.000196734482448805*G0_0_1_0_3 - 0.00182854182854215*G0_0_1_0_5 + 0.000627890627890742*G0_0_1_0_6 + 0.00182854182854213*G0_0_1_0_7 - 0.00029267029267034*G0_0_1_0_8 - 0.000335220335220386*G0_0_1_0_9 + 0.000140194902099687*G0_0_1_1_0 - 0.00407525455144575*G0_0_1_1_1 + 0.000591824401348317*G0_0_1_1_2 + 0.000827690827690954*G0_0_1_1_3 + 0.000730724302153006*G0_0_1_1_4 - 0.000364661793233282*G0_0_1_1_5 + 0.000111370111370132*G0_0_1_1_6 + 0.000426372569229792*G0_0_1_1_7 + 0.000477511906083402*G0_0_1_1_8 + 0.00128173413887721*G0_0_1_1_9 + 0.000135455373550641*G0_0_1_2_0 + 0.000591824401348318*G0_0_1_2_1 + 0.0170459170459201*G0_0_1_2_2 - 0.00222769294197906*G0_0_1_2_3 + 0.0066267066267078*G0_0_1_2_4 - 0.0015861123003983*G0_0_1_2_5 + 0.00212343212343254*G0_0_1_2_6 - 0.000466359037787681*G0_0_1_2_9 - 0.000196734482448805*G0_0_1_3_0 + 0.000827690827690954*G0_0_1_3_1 - 0.00222769294197906*G0_0_1_3_2 + 0.00713334284762982*G0_0_1_3_3 - 0.00651729223157907*G0_0_1_3_4 + 0.000962133104990417*G0_0_1_3_5 - 0.00057418771704497*G0_0_1_3_6 + 0.000350126064411835*G0_0_1_3_7 - 0.000233575947861698*G0_0_1_3_8 - 0.00454545454545531*G0_0_1_3_9 + 0.000730724302153006*G0_0_1_4_1 + 0.0066267066267078*G0_0_1_4_2 - 0.00651729223157907*G0_0_1_4_3 - 0.0201679273107877*G0_0_1_4_4 + 0.000577517720374991*G0_0_1_4_6 + 0.00016959231244948*G0_0_1_4_7 - 0.000116550116550138*G0_0_1_4_8 + 0.0014057371200231*G0_0_1_4_9 - 0.00182854182854215*G0_0_1_5_0 - 0.000364661793233282*G0_0_1_5_1 - 0.00158611230039831*G0_0_1_5_2 + 0.000962133104990417*G0_0_1_5_3 - 0.00462204462204538*G0_0_1_5_5 + 0.00257218971504726*G0_0_1_5_6 - 0.000476190476190546*G0_0_1_5_7 + 0.00085390799676528*G0_0_1_5_8 - 0.000702154987869405*G0_0_1_5_9 + 0.000627890627890742*G0_0_1_6_0 + 0.000111370111370132*G0_0_1_6_1 + 0.00212343212343254*G0_0_1_6_2 - 0.00057418771704497*G0_0_1_6_3 + 0.000577517720374992*G0_0_1_6_4 + 0.00257218971504726*G0_0_1_6_5 - 0.00768041482327321*G0_0_1_6_6 - 0.000377717520574734*G0_0_1_6_7 + 0.00254745254745299*G0_0_1_6_9 + 0.00182854182854213*G0_0_1_7_0 + 0.000426372569229791*G0_0_1_7_1 + 0.000350126064411835*G0_0_1_7_3 + 0.00016959231244948*G0_0_1_7_4 - 0.000476190476190545*G0_0_1_7_5 - 0.000377717520574734*G0_0_1_7_6 + 0.00557442557442654*G0_0_1_7_7 - 0.00410732125017909*G0_0_1_7_8 + 0.00176109604681063*G0_0_1_7_9 - 0.00029267029267034*G0_0_1_8_0 + 0.000477511906083402*G0_0_1_8_1 - 0.000233575947861698*G0_0_1_8_3 - 0.000116550116550138*G0_0_1_8_4 + 0.00085390799676528*G0_0_1_8_5 - 0.0041073212501791*G0_0_1_8_7 + 0.00549878692735932*G0_0_1_8_8 - 0.00361210218353136*G0_0_1_8_9 - 0.000335220335220386*G0_0_1_9_0 + 0.00128173413887721*G0_0_1_9_1 - 0.000466359037787681*G0_0_1_9_2 - 0.00454545454545531*G0_0_1_9_3 + 0.0014057371200231*G0_0_1_9_4 - 0.000702154987869405*G0_0_1_9_5 + 0.00254745254745299*G0_0_1_9_6 + 0.00176109604681063*G0_0_1_9_7 - 0.00361210218353136*G0_0_1_9_8 + 0.00428143285286217*G0_0_1_9_9 - 0.000140194902099687*G0_1_0_0_1 - 0.000135455373550642*G0_1_0_0_2 + 0.000196734482448805*G0_1_0_0_3 + 0.00182854182854215*G0_1_0_0_5 - 0.000627890627890742*G0_1_0_0_6 - 0.00182854182854213*G0_1_0_0_7 + 0.00029267029267034*G0_1_0_0_8 + 0.000335220335220386*G0_1_0_0_9 - 0.000140194902099687*G0_1_0_1_0 + 0.00407525455144575*G0_1_0_1_1 - 0.000591824401348317*G0_1_0_1_2 - 0.000827690827690954*G0_1_0_1_3 - 0.000730724302153006*G0_1_0_1_4 + 0.000364661793233282*G0_1_0_1_5 - 0.000111370111370132*G0_1_0_1_6 - 0.000426372569229792*G0_1_0_1_7 - 0.000477511906083402*G0_1_0_1_8 - 0.00128173413887721*G0_1_0_1_9 - 0.000135455373550641*G0_1_0_2_0 - 0.000591824401348318*G0_1_0_2_1 - 0.0170459170459201*G0_1_0_2_2 + 0.00222769294197906*G0_1_0_2_3 - 0.0066267066267078*G0_1_0_2_4 + 0.0015861123003983*G0_1_0_2_5 - 0.00212343212343254*G0_1_0_2_6 + 0.000466359037787681*G0_1_0_2_9 + 0.000196734482448805*G0_1_0_3_0 - 0.000827690827690954*G0_1_0_3_1 + 0.00222769294197906*G0_1_0_3_2 - 0.00713334284762982*G0_1_0_3_3 + 0.00651729223157907*G0_1_0_3_4 - 0.000962133104990417*G0_1_0_3_5 + 0.00057418771704497*G0_1_0_3_6 - 0.000350126064411835*G0_1_0_3_7 + 0.000233575947861698*G0_1_0_3_8 + 0.00454545454545531*G0_1_0_3_9 - 0.000730724302153006*G0_1_0_4_1 - 0.0066267066267078*G0_1_0_4_2 + 0.00651729223157907*G0_1_0_4_3 + 0.0201679273107877*G0_1_0_4_4 - 0.000577517720374991*G0_1_0_4_6 - 0.00016959231244948*G0_1_0_4_7 + 0.000116550116550138*G0_1_0_4_8 - 0.0014057371200231*G0_1_0_4_9 + 0.00182854182854215*G0_1_0_5_0 + 0.000364661793233282*G0_1_0_5_1 + 0.0015861123003983*G0_1_0_5_2 - 0.000962133104990417*G0_1_0_5_3 + 0.00462204462204538*G0_1_0_5_5 - 0.00257218971504726*G0_1_0_5_6 + 0.000476190476190546*G0_1_0_5_7 - 0.00085390799676528*G0_1_0_5_8 + 0.000702154987869405*G0_1_0_5_9 - 0.000627890627890742*G0_1_0_6_0 - 0.000111370111370132*G0_1_0_6_1 - 0.00212343212343254*G0_1_0_6_2 + 0.00057418771704497*G0_1_0_6_3 - 0.000577517720374992*G0_1_0_6_4 - 0.00257218971504726*G0_1_0_6_5 + 0.00768041482327322*G0_1_0_6_6 + 0.000377717520574734*G0_1_0_6_7 - 0.00254745254745299*G0_1_0_6_9 - 0.00182854182854213*G0_1_0_7_0 - 0.000426372569229791*G0_1_0_7_1 - 0.000350126064411835*G0_1_0_7_3 - 0.00016959231244948*G0_1_0_7_4 + 0.000476190476190544*G0_1_0_7_5 + 0.000377717520574734*G0_1_0_7_6 - 0.00557442557442654*G0_1_0_7_7 + 0.0041073212501791*G0_1_0_7_8 - 0.00176109604681063*G0_1_0_7_9 + 0.00029267029267034*G0_1_0_8_0 - 0.000477511906083402*G0_1_0_8_1 + 0.000233575947861698*G0_1_0_8_3 + 0.000116550116550138*G0_1_0_8_4 - 0.000853907996765279*G0_1_0_8_5 + 0.0041073212501791*G0_1_0_8_7 - 0.00549878692735932*G0_1_0_8_8 + 0.00361210218353136*G0_1_0_8_9 + 0.000335220335220386*G0_1_0_9_0 - 0.00128173413887721*G0_1_0_9_1 + 0.000466359037787681*G0_1_0_9_2 + 0.00454545454545531*G0_1_0_9_3 - 0.0014057371200231*G0_1_0_9_4 + 0.000702154987869405*G0_1_0_9_5 - 0.00254745254745298*G0_1_0_9_6 - 0.00176109604681063*G0_1_0_9_7 + 0.00361210218353136*G0_1_0_9_8 - 0.00428143285286217*G0_1_0_9_9; + A[120] = -A[75] - 0.0591889591889693*G0_1_0_0_0 - 0.00342487318677853*G0_1_0_0_1 - 0.00182148539291427*G0_1_0_0_2 + 0.000948390234104706*G0_1_0_0_3 - 0.000161769447483769*G0_1_0_0_4 - 0.0103481703481721*G0_1_0_0_5 + 0.0044614644614652*G0_1_0_0_6 - 0.035938875938882*G0_1_0_0_7 + 0.0148836348836374*G0_1_0_0_8 - 0.00259518259518307*G0_1_0_0_9 - 0.00342487318677853*G0_1_0_1_0 + 0.00367487891297482*G0_1_0_1_1 - 0.000628533723771925*G0_1_0_1_2 - 0.000525823382966311*G0_1_0_1_3 - 0.00108526394240699*G0_1_0_1_4 - 0.001099878957022*G0_1_0_1_6 - 0.00476158761873129*G0_1_0_1_7 + 0.000899418042275357*G0_1_0_1_8 - 0.00346225203368119*G0_1_0_1_9 - 0.00182148539291427*G0_1_0_2_0 - 0.000628533723771925*G0_1_0_2_1 - 0.0153463820130513*G0_1_0_2_2 + 0.00169238169238198*G0_1_0_2_3 - 0.0049709549709558*G0_1_0_2_4 + 0.001713101713102*G0_1_0_2_5 - 0.0036759536759543*G0_1_0_2_6 - 0.00171355099926557*G0_1_0_2_7 + 0.000738600024314432*G0_1_0_2_8 + 0.00066822066822078*G0_1_0_2_9 + 0.000948390234104706*G0_1_0_3_0 - 0.000525823382966311*G0_1_0_3_1 + 0.00169238169238198*G0_1_0_3_2 - 0.00807763664906664*G0_1_0_3_3 + 0.00793849008134856*G0_1_0_3_4 - 0.00288330716902193*G0_1_0_3_5 + 0.00599424385138771*G0_1_0_3_6 - 0.000150563721992294*G0_1_0_3_7 - 0.000328243185386109*G0_1_0_3_8 + 0.0106878835450282*G0_1_0_3_9 - 0.000161769447483769*G0_1_0_4_0 - 0.00108526394240699*G0_1_0_4_1 - 0.0049709549709558*G0_1_0_4_2 + 0.00793849008134856*G0_1_0_4_3 + 0.0206793206793241*G0_1_0_4_4 + 0.00317991532277301*G0_1_0_4_5 - 0.00917415917416073*G0_1_0_4_6 + 0.00146567717996314*G0_1_0_4_7 + 0.000478806907378419*G0_1_0_4_8 - 0.00836449265020837*G0_1_0_4_9 - 0.0103481703481721*G0_1_0_5_0 + 0.001713101713102*G0_1_0_5_2 - 0.00288330716902193*G0_1_0_5_3 + 0.00317991532277301*G0_1_0_5_4 + 0.010256410256412*G0_1_0_5_5 + 0.00674349460063861*G0_1_0_5_6 - 0.010303030303032*G0_1_0_5_7 + 0.0024677703249136*G0_1_0_5_8 + 0.00285000713572191*G0_1_0_5_9 + 0.0044614644614652*G0_1_0_6_0 - 0.001099878957022*G0_1_0_6_1 - 0.0036759536759543*G0_1_0_6_2 + 0.00599424385138771*G0_1_0_6_3 - 0.00917415917416073*G0_1_0_6_4 + 0.00674349460063861*G0_1_0_6_5 - 0.0230103230103269*G0_1_0_6_6 + 0.00783525997811844*G0_1_0_6_7 - 0.000805385091099515*G0_1_0_6_8 - 0.0139931497074378*G0_1_0_6_9 - 0.035938875938882*G0_1_0_7_0 - 0.00476158761873129*G0_1_0_7_1 - 0.00171355099926557*G0_1_0_7_2 - 0.000150563721992294*G0_1_0_7_3 + 0.00146567717996314*G0_1_0_7_4 - 0.010303030303032*G0_1_0_7_5 + 0.00783525997811844*G0_1_0_7_6 - 0.0588811188811289*G0_1_0_7_7 + 0.0263500784929401*G0_1_0_7_8 - 0.00788497217068782*G0_1_0_7_9 + 0.0148836348836374*G0_1_0_8_0 + 0.000899418042275357*G0_1_0_8_1 + 0.000738600024314432*G0_1_0_8_2 - 0.000328243185386109*G0_1_0_8_3 + 0.000478806907378419*G0_1_0_8_4 + 0.0024677703249136*G0_1_0_8_5 - 0.000805385091099515*G0_1_0_8_6 + 0.0263500784929401*G0_1_0_8_7 - 0.0146910232624544*G0_1_0_8_8 + 0.00942914228628674*G0_1_0_8_9 - 0.00259518259518307*G0_1_0_9_0 - 0.00346225203368119*G0_1_0_9_1 + 0.00066822066822078*G0_1_0_9_2 + 0.0106878835450282*G0_1_0_9_3 - 0.00836449265020837*G0_1_0_9_4 + 0.00285000713572191*G0_1_0_9_5 - 0.0139931497074378*G0_1_0_9_6 - 0.00788497217068782*G0_1_0_9_7 + 0.00942914228628674*G0_1_0_9_8 - 0.0213900385328993*G0_1_0_9_9 - 0.0591889591889693*G0_1_1_0_0 - 0.00342487318677853*G0_1_1_0_1 - 0.00182148539291427*G0_1_1_0_2 + 0.000948390234104708*G0_1_1_0_3 - 0.000161769447483772*G0_1_1_0_4 - 0.0103481703481721*G0_1_1_0_5 + 0.0044614644614652*G0_1_1_0_6 - 0.035938875938882*G0_1_1_0_7 + 0.0148836348836374*G0_1_1_0_8 - 0.00259518259518308*G0_1_1_0_9 - 0.00342487318677853*G0_1_1_1_0 + 0.00367487891297483*G0_1_1_1_1 - 0.000628533723771928*G0_1_1_1_2 - 0.000525823382966306*G0_1_1_1_3 - 0.00108526394240699*G0_1_1_1_4 - 0.001099878957022*G0_1_1_1_6 - 0.0047615876187313*G0_1_1_1_7 + 0.000899418042275366*G0_1_1_1_8 - 0.00346225203368119*G0_1_1_1_9 - 0.00182148539291427*G0_1_1_2_0 - 0.000628533723771928*G0_1_1_2_1 - 0.0153463820130514*G0_1_1_2_2 + 0.00169238169238199*G0_1_1_2_3 - 0.00497095497095583*G0_1_1_2_4 + 0.00171310171310202*G0_1_1_2_5 - 0.00367595367595433*G0_1_1_2_6 - 0.00171355099926557*G0_1_1_2_7 + 0.000738600024314434*G0_1_1_2_8 + 0.000668220668220778*G0_1_1_2_9 + 0.000948390234104707*G0_1_1_3_0 - 0.000525823382966306*G0_1_1_3_1 + 0.00169238169238199*G0_1_1_3_2 - 0.00807763664906663*G0_1_1_3_3 + 0.00793849008134857*G0_1_1_3_4 - 0.00288330716902194*G0_1_1_3_5 + 0.00599424385138773*G0_1_1_3_6 - 0.000150563721992296*G0_1_1_3_7 - 0.000328243185386104*G0_1_1_3_8 + 0.0106878835450282*G0_1_1_3_9 - 0.000161769447483772*G0_1_1_4_0 - 0.00108526394240699*G0_1_1_4_1 - 0.00497095497095583*G0_1_1_4_2 + 0.00793849008134857*G0_1_1_4_3 + 0.0206793206793241*G0_1_1_4_4 + 0.00317991532277302*G0_1_1_4_5 - 0.00917415917416075*G0_1_1_4_6 + 0.00146567717996314*G0_1_1_4_7 + 0.000478806907378415*G0_1_1_4_8 - 0.00836449265020839*G0_1_1_4_9 - 0.0103481703481721*G0_1_1_5_0 + 0.00171310171310202*G0_1_1_5_2 - 0.00288330716902194*G0_1_1_5_3 + 0.00317991532277302*G0_1_1_5_4 + 0.010256410256412*G0_1_1_5_5 + 0.00674349460063863*G0_1_1_5_6 - 0.010303030303032*G0_1_1_5_7 + 0.0024677703249136*G0_1_1_5_8 + 0.00285000713572191*G0_1_1_5_9 + 0.00446146446146519*G0_1_1_6_0 - 0.001099878957022*G0_1_1_6_1 - 0.00367595367595433*G0_1_1_6_2 + 0.00599424385138772*G0_1_1_6_3 - 0.00917415917416075*G0_1_1_6_4 + 0.00674349460063863*G0_1_1_6_5 - 0.0230103230103269*G0_1_1_6_6 + 0.00783525997811844*G0_1_1_6_7 - 0.000805385091099514*G0_1_1_6_8 - 0.0139931497074378*G0_1_1_6_9 - 0.035938875938882*G0_1_1_7_0 - 0.0047615876187313*G0_1_1_7_1 - 0.00171355099926557*G0_1_1_7_2 - 0.000150563721992296*G0_1_1_7_3 + 0.00146567717996314*G0_1_1_7_4 - 0.010303030303032*G0_1_1_7_5 + 0.00783525997811844*G0_1_1_7_6 - 0.0588811188811289*G0_1_1_7_7 + 0.0263500784929401*G0_1_1_7_8 - 0.00788497217068782*G0_1_1_7_9 + 0.0148836348836374*G0_1_1_8_0 + 0.000899418042275366*G0_1_1_8_1 + 0.000738600024314434*G0_1_1_8_2 - 0.000328243185386104*G0_1_1_8_3 + 0.000478806907378416*G0_1_1_8_4 + 0.0024677703249136*G0_1_1_8_5 - 0.000805385091099514*G0_1_1_8_6 + 0.0263500784929401*G0_1_1_8_7 - 0.0146910232624543*G0_1_1_8_8 + 0.00942914228628675*G0_1_1_8_9 - 0.00259518259518308*G0_1_1_9_0 - 0.00346225203368119*G0_1_1_9_1 + 0.000668220668220778*G0_1_1_9_2 + 0.0106878835450282*G0_1_1_9_3 - 0.00836449265020839*G0_1_1_9_4 + 0.00285000713572191*G0_1_1_9_5 - 0.0139931497074378*G0_1_1_9_6 - 0.00788497217068782*G0_1_1_9_7 + 0.00942914228628675*G0_1_1_9_8 - 0.0213900385328994*G0_1_1_9_9; + A[24] = -A[20] - 0.0216595045166512*G0_0_0_0_0 - 0.00180270346937046*G0_0_0_0_1 - 0.00283956783956833*G0_0_0_0_2 - 0.000975664547093292*G0_0_0_0_3 + 0.00098792741649902*G0_0_0_0_4 - 0.0138780795923677*G0_0_0_0_5 + 0.00411123268266198*G0_0_0_0_6 - 0.00556343127771796*G0_0_0_0_7 + 0.00319955177098089*G0_0_0_0_8 - 0.000303506017791803*G0_0_0_0_9 - 0.00180270346937046*G0_0_0_1_0 - 0.0534613534613627*G0_0_0_1_1 - 0.00340135173468565*G0_0_0_1_2 - 0.0299422799422851*G0_0_0_1_3 + 0.0133732933732957*G0_0_0_1_4 - 0.000874495874496007*G0_0_0_1_5 + 0.000117845117845132*G0_0_0_1_6 + 0.00387168387168458*G0_0_0_1_7 - 0.00800865800865948*G0_0_0_1_8 - 0.00144966144966172*G0_0_0_1_9 - 0.00283956783956833*G0_0_0_2_0 - 0.00340135173468565*G0_0_0_2_1 - 0.0237594151879906*G0_0_0_2_2 - 0.00126265269122434*G0_0_0_2_3 - 0.00263397977683736*G0_0_0_2_4 + 0.004292004292005*G0_0_0_2_5 - 0.0152319638033949*G0_0_0_2_6 - 0.000698005698005812*G0_0_0_2_7 + 0.000402956831528317*G0_0_0_2_8 - 0.00268588554302885*G0_0_0_2_9 - 0.000975664547093292*G0_0_0_3_0 - 0.0299422799422851*G0_0_0_3_1 - 0.00126265269122434*G0_0_0_3_2 - 0.0446420246420323*G0_0_0_3_3 + 0.0147335997336023*G0_0_0_3_4 + 0.00166547737976338*G0_0_0_3_5 + 0.00186599115170575*G0_0_0_3_6 + 0.00514652014652106*G0_0_0_3_7 - 0.00615717615717728*G0_0_0_3_8 - 0.00594405594405699*G0_0_0_3_9 + 0.00098792741649902*G0_0_0_4_0 + 0.0133732933732957*G0_0_0_4_1 - 0.00263397977683736*G0_0_0_4_2 + 0.0147335997336023*G0_0_0_4_3 + 0.00870177441606156*G0_0_0_4_4 - 0.000744255744255869*G0_0_0_4_5 - 0.00112173540744988*G0_0_0_4_6 - 0.00154464583036039*G0_0_0_4_7 + 0.00101065601065622*G0_0_0_4_8 + 0.00954616811759831*G0_0_0_4_9 - 0.0138780795923677*G0_0_0_5_0 - 0.000874495874496007*G0_0_0_5_1 + 0.004292004292005*G0_0_0_5_2 + 0.00166547737976338*G0_0_0_5_3 - 0.000744255744255869*G0_0_0_5_4 - 0.0392968935826145*G0_0_0_5_5 + 0.0218098568098605*G0_0_0_5_6 - 0.00915655772798784*G0_0_0_5_7 + 0.00484301412872924*G0_0_0_5_8 - 0.00877551020408313*G0_0_0_5_9 + 0.00411123268266198*G0_0_0_6_0 + 0.000117845117845132*G0_0_0_6_1 - 0.0152319638033949*G0_0_0_6_2 + 0.00186599115170575*G0_0_0_6_3 - 0.00112173540744988*G0_0_0_6_4 + 0.0218098568098605*G0_0_0_6_5 - 0.0407525807525876*G0_0_0_6_6 + 0.0043135435992586*G0_0_0_6_7 - 0.00189096617668078*G0_0_0_6_8 + 0.00432567432567508*G0_0_0_6_9 - 0.00556343127771796*G0_0_0_7_0 + 0.00387168387168458*G0_0_0_7_1 - 0.000698005698005812*G0_0_0_7_2 + 0.00514652014652106*G0_0_0_7_3 - 0.00154464583036039*G0_0_0_7_4 - 0.00915655772798784*G0_0_0_7_5 + 0.0043135435992586*G0_0_0_7_6 - 0.0127967270824435*G0_0_0_7_7 + 0.00180652680652717*G0_0_0_7_8 - 0.00771656914514186*G0_0_0_7_9 + 0.00319955177098089*G0_0_0_8_0 - 0.00800865800865948*G0_0_0_8_1 + 0.000402956831528317*G0_0_0_8_2 - 0.00615717615717728*G0_0_0_8_3 + 0.00101065601065622*G0_0_0_8_4 + 0.00484301412872924*G0_0_0_8_5 - 0.00189096617668078*G0_0_0_8_6 + 0.00180652680652717*G0_0_0_8_7 + 0.0142990342990366*G0_0_0_8_8 + 0.0023276723276727*G0_0_0_8_9 - 0.000303506017791803*G0_0_0_9_0 - 0.00144966144966172*G0_0_0_9_1 - 0.00268588554302885*G0_0_0_9_2 - 0.00594405594405699*G0_0_0_9_3 + 0.00954616811759831*G0_0_0_9_4 - 0.00877551020408313*G0_0_0_9_5 + 0.00432567432567508*G0_0_0_9_6 - 0.00771656914514186*G0_0_0_9_7 + 0.0023276723276727*G0_0_0_9_8 - 0.0127586699015292*G0_0_0_9_9 + 0.00209991067133961*G0_0_1_0_0 + 0.00159864826531521*G0_0_1_0_1 - 0.00137862137862162*G0_0_1_0_3 + 0.00168593311450483*G0_0_1_0_4 + 0.0013538842110273*G0_0_1_0_5 - 0.000180771609343068*G0_0_1_0_6 - 0.00292945150088056*G0_0_1_0_7 + 0.00446220446220523*G0_0_1_0_8 + 0.00238237952523707*G0_0_1_0_9 + 0.00159864826531521*G0_0_1_1_0 - 0.0015986482653152*G0_0_1_1_2 - 0.0219336219336256*G0_0_1_1_3 + 0.00950160950161108*G0_0_1_1_4 - 0.000992340992341171*G0_0_1_1_5 + 0.000992340992341167*G0_0_1_1_6 - 0.00950160950161114*G0_0_1_1_7 + 0.0219336219336257*G0_0_1_1_8 - 0.0015986482653152*G0_0_1_2_1 - 0.0020999106713396*G0_0_1_2_2 - 0.00446220446220522*G0_0_1_2_3 + 0.00292945150088056*G0_0_1_2_4 + 0.000180771609343071*G0_0_1_2_5 - 0.0013538842110273*G0_0_1_2_6 - 0.00168593311450482*G0_0_1_2_7 + 0.00137862137862161*G0_0_1_2_8 - 0.00238237952523708*G0_0_1_2_9 - 0.00137862137862162*G0_0_1_3_0 - 0.0219336219336256*G0_0_1_3_1 - 0.00446220446220522*G0_0_1_3_2 - 0.058941058941069*G0_0_1_3_3 + 0.0129270729270752*G0_0_1_3_4 + 0.00355644355644415*G0_0_1_3_5 - 0.00297702297702347*G0_0_1_3_6 + 0.00413586413586486*G0_0_1_3_7 - 0.00827172827172971*G0_0_1_3_9 + 0.00168593311450483*G0_0_1_4_0 + 0.00950160950161108*G0_0_1_4_1 + 0.00292945150088056*G0_0_1_4_2 + 0.0129270729270752*G0_0_1_4_3 + 0.021498501498505*G0_0_1_4_4 - 0.00505779934351447*G0_0_1_4_5 + 0.00803482232053794*G0_0_1_4_6 - 0.00413586413586482*G0_0_1_4_8 + 0.0172627372627402*G0_0_1_4_9 + 0.0013538842110273*G0_0_1_5_0 - 0.000992340992341171*G0_0_1_5_1 + 0.000180771609343071*G0_0_1_5_2 + 0.00355644355644415*G0_0_1_5_3 - 0.00505779934351447*G0_0_1_5_4 + 0.0014556871699731*G0_0_1_5_5 - 0.00803482232053794*G0_0_1_5_7 + 0.00297702297702346*G0_0_1_5_8 - 0.0131011845297582*G0_0_1_5_9 - 0.000180771609343068*G0_0_1_6_0 + 0.000992340992341167*G0_0_1_6_1 - 0.0013538842110273*G0_0_1_6_2 - 0.00297702297702347*G0_0_1_6_3 + 0.00803482232053794*G0_0_1_6_4 - 0.00145568716997317*G0_0_1_6_6 + 0.00505779934351446*G0_0_1_6_7 - 0.00355644355644414*G0_0_1_6_8 + 0.0131011845297582*G0_0_1_6_9 - 0.00292945150088056*G0_0_1_7_0 - 0.00950160950161114*G0_0_1_7_1 - 0.00168593311450482*G0_0_1_7_2 + 0.00413586413586486*G0_0_1_7_3 - 0.00803482232053794*G0_0_1_7_5 + 0.00505779934351446*G0_0_1_7_6 - 0.021498501498505*G0_0_1_7_7 - 0.0129270729270751*G0_0_1_7_8 - 0.0172627372627402*G0_0_1_7_9 + 0.00446220446220523*G0_0_1_8_0 + 0.0219336219336257*G0_0_1_8_1 + 0.0013786213786216*G0_0_1_8_2 - 0.00413586413586482*G0_0_1_8_4 + 0.00297702297702346*G0_0_1_8_5 - 0.00355644355644414*G0_0_1_8_6 - 0.0129270729270752*G0_0_1_8_7 + 0.0589410589410689*G0_0_1_8_8 + 0.00827172827172966*G0_0_1_8_9 + 0.00238237952523707*G0_0_1_9_0 - 0.00238237952523708*G0_0_1_9_2 - 0.00827172827172971*G0_0_1_9_3 + 0.0172627372627402*G0_0_1_9_4 - 0.0131011845297582*G0_0_1_9_5 + 0.0131011845297582*G0_0_1_9_6 - 0.0172627372627402*G0_0_1_9_7 + 0.00827172827172966*G0_0_1_9_8; + A[3] = A[45] + 0.000135455373550636*G0_0_1_0_1 + 0.000140194902099684*G0_0_1_0_2 - 0.000196734482448804*G0_0_1_0_4 + 0.00182854182854212*G0_0_1_0_5 - 0.000292670292670335*G0_0_1_0_6 - 0.00182854182854217*G0_0_1_0_7 + 0.000627890627890748*G0_0_1_0_8 - 0.000335220335220398*G0_0_1_0_9 + 0.000135455373550636*G0_0_1_1_0 + 0.01704591704592*G0_0_1_1_1 + 0.00059182440134831*G0_0_1_1_2 + 0.00662670662670776*G0_0_1_1_3 - 0.00222769294197904*G0_0_1_1_4 - 0.0015861123003983*G0_0_1_1_7 + 0.00212343212343251*G0_0_1_1_8 - 0.000466359037787685*G0_0_1_1_9 + 0.000140194902099684*G0_0_1_2_0 + 0.00059182440134831*G0_0_1_2_1 - 0.00407525455144576*G0_0_1_2_2 + 0.000730724302153004*G0_0_1_2_3 + 0.000827690827690958*G0_0_1_2_4 + 0.000426372569229788*G0_0_1_2_5 + 0.000477511906083399*G0_0_1_2_6 - 0.000364661793233286*G0_0_1_2_7 + 0.000111370111370132*G0_0_1_2_8 + 0.00128173413887721*G0_0_1_2_9 + 0.00662670662670776*G0_0_1_3_1 + 0.000730724302153004*G0_0_1_3_2 - 0.0201679273107878*G0_0_1_3_3 - 0.00651729223157905*G0_0_1_3_4 + 0.000169592312449472*G0_0_1_3_5 - 0.00011655011655013*G0_0_1_3_6 + 0.00057751772037498*G0_0_1_3_8 + 0.00140573712002308*G0_0_1_3_9 - 0.000196734482448804*G0_0_1_4_0 - 0.00222769294197904*G0_0_1_4_1 + 0.000827690827690958*G0_0_1_4_2 - 0.00651729223157905*G0_0_1_4_3 + 0.00713334284762973*G0_0_1_4_4 + 0.000350126064411849*G0_0_1_4_5 - 0.000233575947861718*G0_0_1_4_6 + 0.000962133104990418*G0_0_1_4_7 - 0.000574187717044959*G0_0_1_4_8 - 0.00454545454545533*G0_0_1_4_9 + 0.00182854182854212*G0_0_1_5_0 + 0.000426372569229788*G0_0_1_5_2 + 0.000169592312449472*G0_0_1_5_3 + 0.000350126064411849*G0_0_1_5_4 + 0.00557442557442646*G0_0_1_5_5 - 0.00410732125017906*G0_0_1_5_6 - 0.000476190476190578*G0_0_1_5_7 - 0.000377717520574718*G0_0_1_5_8 + 0.00176109604681063*G0_0_1_5_9 - 0.000292670292670335*G0_0_1_6_0 + 0.000477511906083399*G0_0_1_6_2 - 0.00011655011655013*G0_0_1_6_3 - 0.000233575947861718*G0_0_1_6_4 - 0.00410732125017906*G0_0_1_6_5 + 0.00549878692735924*G0_0_1_6_6 + 0.000853907996765297*G0_0_1_6_7 - 0.00361210218353137*G0_0_1_6_9 - 0.00182854182854216*G0_0_1_7_0 - 0.0015861123003983*G0_0_1_7_1 - 0.000364661793233286*G0_0_1_7_2 + 0.000962133104990418*G0_0_1_7_4 - 0.000476190476190578*G0_0_1_7_5 + 0.000853907996765297*G0_0_1_7_6 - 0.00462204462204544*G0_0_1_7_7 + 0.0025721897150473*G0_0_1_7_8 - 0.000702154987869403*G0_0_1_7_9 + 0.000627890627890748*G0_0_1_8_0 + 0.00212343212343251*G0_0_1_8_1 + 0.000111370111370132*G0_0_1_8_2 + 0.000577517720374979*G0_0_1_8_3 - 0.000574187717044959*G0_0_1_8_4 - 0.000377717520574719*G0_0_1_8_5 + 0.0025721897150473*G0_0_1_8_7 - 0.00768041482327328*G0_0_1_8_8 + 0.00254745254745298*G0_0_1_8_9 - 0.000335220335220398*G0_0_1_9_0 - 0.000466359037787685*G0_0_1_9_1 + 0.00128173413887721*G0_0_1_9_2 + 0.00140573712002309*G0_0_1_9_3 - 0.00454545454545533*G0_0_1_9_4 + 0.00176109604681063*G0_0_1_9_5 - 0.00361210218353137*G0_0_1_9_6 - 0.000702154987869403*G0_0_1_9_7 + 0.00254745254745298*G0_0_1_9_8 + 0.00428143285286214*G0_0_1_9_9 - 0.000135455373550636*G0_1_0_0_1 - 0.000140194902099684*G0_1_0_0_2 + 0.000196734482448804*G0_1_0_0_4 - 0.00182854182854212*G0_1_0_0_5 + 0.000292670292670335*G0_1_0_0_6 + 0.00182854182854217*G0_1_0_0_7 - 0.000627890627890748*G0_1_0_0_8 + 0.000335220335220398*G0_1_0_0_9 - 0.000135455373550636*G0_1_0_1_0 - 0.01704591704592*G0_1_0_1_1 - 0.00059182440134831*G0_1_0_1_2 - 0.00662670662670776*G0_1_0_1_3 + 0.00222769294197904*G0_1_0_1_4 + 0.0015861123003983*G0_1_0_1_7 - 0.00212343212343251*G0_1_0_1_8 + 0.000466359037787685*G0_1_0_1_9 - 0.000140194902099684*G0_1_0_2_0 - 0.00059182440134831*G0_1_0_2_1 + 0.00407525455144576*G0_1_0_2_2 - 0.000730724302153005*G0_1_0_2_3 - 0.000827690827690958*G0_1_0_2_4 - 0.000426372569229788*G0_1_0_2_5 - 0.000477511906083399*G0_1_0_2_6 + 0.000364661793233286*G0_1_0_2_7 - 0.000111370111370132*G0_1_0_2_8 - 0.00128173413887721*G0_1_0_2_9 - 0.00662670662670777*G0_1_0_3_1 - 0.000730724302153004*G0_1_0_3_2 + 0.0201679273107878*G0_1_0_3_3 + 0.00651729223157905*G0_1_0_3_4 - 0.000169592312449472*G0_1_0_3_5 + 0.00011655011655013*G0_1_0_3_6 - 0.00057751772037498*G0_1_0_3_8 - 0.00140573712002308*G0_1_0_3_9 + 0.000196734482448804*G0_1_0_4_0 + 0.00222769294197904*G0_1_0_4_1 - 0.000827690827690958*G0_1_0_4_2 + 0.00651729223157905*G0_1_0_4_3 - 0.00713334284762973*G0_1_0_4_4 - 0.000350126064411849*G0_1_0_4_5 + 0.000233575947861718*G0_1_0_4_6 - 0.000962133104990418*G0_1_0_4_7 + 0.000574187717044959*G0_1_0_4_8 + 0.00454545454545533*G0_1_0_4_9 - 0.00182854182854212*G0_1_0_5_0 - 0.000426372569229788*G0_1_0_5_2 - 0.000169592312449472*G0_1_0_5_3 - 0.000350126064411849*G0_1_0_5_4 - 0.00557442557442646*G0_1_0_5_5 + 0.00410732125017906*G0_1_0_5_6 + 0.000476190476190578*G0_1_0_5_7 + 0.000377717520574718*G0_1_0_5_8 - 0.00176109604681063*G0_1_0_5_9 + 0.000292670292670335*G0_1_0_6_0 - 0.000477511906083399*G0_1_0_6_2 + 0.00011655011655013*G0_1_0_6_3 + 0.000233575947861718*G0_1_0_6_4 + 0.00410732125017906*G0_1_0_6_5 - 0.00549878692735924*G0_1_0_6_6 - 0.000853907996765297*G0_1_0_6_7 + 0.00361210218353137*G0_1_0_6_9 + 0.00182854182854216*G0_1_0_7_0 + 0.0015861123003983*G0_1_0_7_1 + 0.000364661793233286*G0_1_0_7_2 - 0.000962133104990418*G0_1_0_7_4 + 0.000476190476190578*G0_1_0_7_5 - 0.000853907996765297*G0_1_0_7_6 + 0.00462204462204544*G0_1_0_7_7 - 0.0025721897150473*G0_1_0_7_8 + 0.000702154987869403*G0_1_0_7_9 - 0.000627890627890748*G0_1_0_8_0 - 0.00212343212343251*G0_1_0_8_1 - 0.000111370111370132*G0_1_0_8_2 - 0.00057751772037498*G0_1_0_8_3 + 0.000574187717044959*G0_1_0_8_4 + 0.000377717520574719*G0_1_0_8_5 - 0.0025721897150473*G0_1_0_8_7 + 0.00768041482327328*G0_1_0_8_8 - 0.00254745254745298*G0_1_0_8_9 + 0.000335220335220398*G0_1_0_9_0 + 0.000466359037787685*G0_1_0_9_1 - 0.00128173413887721*G0_1_0_9_2 - 0.00140573712002309*G0_1_0_9_3 + 0.00454545454545533*G0_1_0_9_4 - 0.00176109604681063*G0_1_0_9_5 + 0.00361210218353137*G0_1_0_9_6 + 0.000702154987869403*G0_1_0_9_7 - 0.00254745254745298*G0_1_0_9_8 - 0.00428143285286215*G0_1_0_9_9; + A[11] = -A[3] - 0.0591889591889696*G0_0_0_0_0 - 0.00182148539291429*G0_0_0_0_1 - 0.00342487318677854*G0_0_0_0_2 - 0.000161769447483746*G0_0_0_0_3 + 0.000948390234104685*G0_0_0_0_4 - 0.0359388759388822*G0_0_0_0_5 + 0.0148836348836375*G0_0_0_0_6 - 0.0103481703481722*G0_0_0_0_7 + 0.00446146446146526*G0_0_0_0_8 - 0.00259518259518307*G0_0_0_0_9 - 0.00182148539291429*G0_0_0_1_0 - 0.0153463820130513*G0_0_0_1_1 - 0.000628533723771925*G0_0_0_1_2 - 0.00497095497095582*G0_0_0_1_3 + 0.00169238169238198*G0_0_0_1_4 - 0.00171355099926557*G0_0_0_1_5 + 0.000738600024314436*G0_0_0_1_6 + 0.001713101713102*G0_0_0_1_7 - 0.00367595367595431*G0_0_0_1_8 + 0.000668220668220778*G0_0_0_1_9 - 0.00342487318677854*G0_0_0_2_0 - 0.000628533723771925*G0_0_0_2_1 + 0.00367487891297477*G0_0_0_2_2 - 0.00108526394240698*G0_0_0_2_3 - 0.000525823382966334*G0_0_0_2_4 - 0.00476158761873129*G0_0_0_2_5 + 0.000899418042275346*G0_0_0_2_6 - 0.00109987895702199*G0_0_0_2_8 - 0.00346225203368119*G0_0_0_2_9 - 0.000161769447483746*G0_0_0_3_0 - 0.00497095497095582*G0_0_0_3_1 - 0.00108526394240698*G0_0_0_3_2 + 0.0206793206793242*G0_0_0_3_3 + 0.00793849008134856*G0_0_0_3_4 + 0.00146567717996315*G0_0_0_3_5 + 0.000478806907378406*G0_0_0_3_6 + 0.003179915322773*G0_0_0_3_7 - 0.00917415917416072*G0_0_0_3_8 - 0.00836449265020835*G0_0_0_3_9 + 0.000948390234104685*G0_0_0_4_0 + 0.00169238169238198*G0_0_0_4_1 - 0.000525823382966334*G0_0_0_4_2 + 0.00793849008134856*G0_0_0_4_3 - 0.00807763664906654*G0_0_0_4_4 - 0.000150563721992322*G0_0_0_4_5 - 0.000328243185386082*G0_0_0_4_6 - 0.00288330716902194*G0_0_0_4_7 + 0.00599424385138771*G0_0_0_4_8 + 0.0106878835450282*G0_0_0_4_9 - 0.0359388759388822*G0_0_0_5_0 - 0.00171355099926557*G0_0_0_5_1 - 0.00476158761873129*G0_0_0_5_2 + 0.00146567717996315*G0_0_0_5_3 - 0.000150563721992322*G0_0_0_5_4 - 0.0588811188811289*G0_0_0_5_5 + 0.0263500784929401*G0_0_0_5_6 - 0.0103030303030321*G0_0_0_5_7 + 0.00783525997811847*G0_0_0_5_8 - 0.00788497217068784*G0_0_0_5_9 + 0.0148836348836375*G0_0_0_6_0 + 0.000738600024314436*G0_0_0_6_1 + 0.000899418042275346*G0_0_0_6_2 + 0.000478806907378406*G0_0_0_6_3 - 0.000328243185386082*G0_0_0_6_4 + 0.0263500784929401*G0_0_0_6_5 - 0.0146910232624543*G0_0_0_6_6 + 0.00246777032491361*G0_0_0_6_7 - 0.00080538509109953*G0_0_0_6_8 + 0.00942914228628677*G0_0_0_6_9 - 0.0103481703481722*G0_0_0_7_0 + 0.001713101713102*G0_0_0_7_1 + 0.003179915322773*G0_0_0_7_3 - 0.00288330716902194*G0_0_0_7_4 - 0.0103030303030321*G0_0_0_7_5 + 0.00246777032491361*G0_0_0_7_6 + 0.0102564102564119*G0_0_0_7_7 + 0.00674349460063863*G0_0_0_7_8 + 0.00285000713572189*G0_0_0_7_9 + 0.00446146446146526*G0_0_0_8_0 - 0.00367595367595431*G0_0_0_8_1 - 0.00109987895702199*G0_0_0_8_2 - 0.00917415917416072*G0_0_0_8_3 + 0.00599424385138771*G0_0_0_8_4 + 0.00783525997811847*G0_0_0_8_5 - 0.00080538509109953*G0_0_0_8_6 + 0.00674349460063863*G0_0_0_8_7 - 0.0230103230103269*G0_0_0_8_8 - 0.0139931497074378*G0_0_0_8_9 - 0.00259518259518307*G0_0_0_9_0 + 0.000668220668220778*G0_0_0_9_1 - 0.00346225203368119*G0_0_0_9_2 - 0.00836449265020834*G0_0_0_9_3 + 0.0106878835450282*G0_0_0_9_4 - 0.00788497217068784*G0_0_0_9_5 + 0.00942914228628677*G0_0_0_9_6 + 0.00285000713572189*G0_0_0_9_7 - 0.0139931497074378*G0_0_0_9_8 - 0.0213900385328993*G0_0_0_9_9 - 0.0591889591889696*G0_1_0_0_0 - 0.00182148539291429*G0_1_0_0_1 - 0.00342487318677854*G0_1_0_0_2 - 0.000161769447483748*G0_1_0_0_3 + 0.000948390234104685*G0_1_0_0_4 - 0.0359388759388822*G0_1_0_0_5 + 0.0148836348836375*G0_1_0_0_6 - 0.0103481703481722*G0_1_0_0_7 + 0.00446146446146526*G0_1_0_0_8 - 0.00259518259518307*G0_1_0_0_9 - 0.00182148539291429*G0_1_0_1_0 - 0.0153463820130513*G0_1_0_1_1 - 0.000628533723771924*G0_1_0_1_2 - 0.00497095497095582*G0_1_0_1_3 + 0.00169238169238198*G0_1_0_1_4 - 0.00171355099926557*G0_1_0_1_5 + 0.000738600024314437*G0_1_0_1_6 + 0.001713101713102*G0_1_0_1_7 - 0.00367595367595432*G0_1_0_1_8 + 0.000668220668220776*G0_1_0_1_9 - 0.00342487318677854*G0_1_0_2_0 - 0.000628533723771924*G0_1_0_2_1 + 0.00367487891297481*G0_1_0_2_2 - 0.00108526394240698*G0_1_0_2_3 - 0.000525823382966328*G0_1_0_2_4 - 0.0047615876187313*G0_1_0_2_5 + 0.00089941804227536*G0_1_0_2_6 - 0.00109987895702199*G0_1_0_2_8 - 0.00346225203368119*G0_1_0_2_9 - 0.000161769447483748*G0_1_0_3_0 - 0.00497095497095581*G0_1_0_3_1 - 0.00108526394240698*G0_1_0_3_2 + 0.0206793206793242*G0_1_0_3_3 + 0.00793849008134855*G0_1_0_3_4 + 0.00146567717996316*G0_1_0_3_5 + 0.000478806907378402*G0_1_0_3_6 + 0.00317991532277301*G0_1_0_3_7 - 0.00917415917416071*G0_1_0_3_8 - 0.00836449265020834*G0_1_0_3_9 + 0.000948390234104685*G0_1_0_4_0 + 0.00169238169238198*G0_1_0_4_1 - 0.000525823382966328*G0_1_0_4_2 + 0.00793849008134856*G0_1_0_4_3 - 0.00807763664906654*G0_1_0_4_4 - 0.000150563721992325*G0_1_0_4_5 - 0.000328243185386077*G0_1_0_4_6 - 0.00288330716902194*G0_1_0_4_7 + 0.0059942438513877*G0_1_0_4_8 + 0.0106878835450282*G0_1_0_4_9 - 0.0359388759388822*G0_1_0_5_0 - 0.00171355099926557*G0_1_0_5_1 - 0.0047615876187313*G0_1_0_5_2 + 0.00146567717996315*G0_1_0_5_3 - 0.000150563721992324*G0_1_0_5_4 - 0.0588811188811289*G0_1_0_5_5 + 0.0263500784929401*G0_1_0_5_6 - 0.0103030303030321*G0_1_0_5_7 + 0.00783525997811846*G0_1_0_5_8 - 0.00788497217068784*G0_1_0_5_9 + 0.0148836348836375*G0_1_0_6_0 + 0.000738600024314437*G0_1_0_6_1 + 0.00089941804227536*G0_1_0_6_2 + 0.000478806907378403*G0_1_0_6_3 - 0.000328243185386076*G0_1_0_6_4 + 0.0263500784929401*G0_1_0_6_5 - 0.0146910232624543*G0_1_0_6_6 + 0.00246777032491361*G0_1_0_6_7 - 0.000805385091099537*G0_1_0_6_8 + 0.00942914228628677*G0_1_0_6_9 - 0.0103481703481722*G0_1_0_7_0 + 0.001713101713102*G0_1_0_7_1 + 0.00317991532277301*G0_1_0_7_3 - 0.00288330716902194*G0_1_0_7_4 - 0.0103030303030321*G0_1_0_7_5 + 0.00246777032491361*G0_1_0_7_6 + 0.0102564102564119*G0_1_0_7_7 + 0.00674349460063862*G0_1_0_7_8 + 0.00285000713572188*G0_1_0_7_9 + 0.00446146446146526*G0_1_0_8_0 - 0.00367595367595432*G0_1_0_8_1 - 0.00109987895702199*G0_1_0_8_2 - 0.00917415917416071*G0_1_0_8_3 + 0.0059942438513877*G0_1_0_8_4 + 0.00783525997811846*G0_1_0_8_5 - 0.000805385091099537*G0_1_0_8_6 + 0.00674349460063862*G0_1_0_8_7 - 0.0230103230103268*G0_1_0_8_8 - 0.0139931497074377*G0_1_0_8_9 - 0.00259518259518307*G0_1_0_9_0 + 0.000668220668220776*G0_1_0_9_1 - 0.00346225203368119*G0_1_0_9_2 - 0.00836449265020834*G0_1_0_9_3 + 0.0106878835450282*G0_1_0_9_4 - 0.00788497217068784*G0_1_0_9_5 + 0.00942914228628677*G0_1_0_9_6 + 0.00285000713572188*G0_1_0_9_7 - 0.0139931497074377*G0_1_0_9_8 - 0.0213900385328993*G0_1_0_9_9; + A[128] = -A[125] - 0.00184140374616597*G0_0_1_0_0 - 0.00107419916943745*G0_0_1_0_1 + 0.00879614212947696*G0_0_1_0_2 + 0.00370296370296434*G0_0_1_0_3 - 0.0102031302031319*G0_0_1_0_4 + 0.00298368298368351*G0_0_1_0_5 - 0.00737928737928869*G0_0_1_0_6 + 0.000279085993371761*G0_0_1_0_7 + 0.00136371564943017*G0_0_1_0_8 - 0.00868464868465017*G0_0_1_0_9 - 0.00107419916943745*G0_0_1_1_0 - 0.00184140374616592*G0_0_1_1_1 + 0.00879614212947695*G0_0_1_1_2 + 0.0029836829836835*G0_0_1_1_3 - 0.00737928737928864*G0_0_1_1_4 + 0.00370296370296434*G0_0_1_1_5 - 0.010203130203132*G0_0_1_1_6 + 0.00136371564943015*G0_0_1_1_7 + 0.000279085993371792*G0_0_1_1_8 - 0.00868464868465015*G0_0_1_1_9 + 0.00879614212947696*G0_0_1_2_0 + 0.00879614212947695*G0_0_1_2_1 + 0.294322960989677*G0_0_1_2_2 - 0.039516039516046*G0_0_1_2_3 + 0.0811632811632947*G0_0_1_2_4 - 0.0395160395160461*G0_0_1_2_5 + 0.0811632811632945*G0_0_1_2_6 - 0.000666000666000762*G0_0_1_2_7 - 0.000666000666000751*G0_0_1_2_8 + 0.00426240426240494*G0_0_1_2_9 + 0.00370296370296434*G0_0_1_3_0 + 0.0029836829836835*G0_0_1_3_1 - 0.039516039516046*G0_0_1_3_2 - 0.0103896103896121*G0_0_1_3_3 + 0.0307692307692359*G0_0_1_3_4 - 0.0143856143856168*G0_0_1_3_5 + 0.0371628371628434*G0_0_1_3_6 - 0.00455544455544532*G0_0_1_3_7 - 0.00399600399600464*G0_0_1_3_8 + 0.035164835164841*G0_0_1_3_9 - 0.0102031302031319*G0_0_1_4_0 - 0.00737928737928864*G0_0_1_4_1 + 0.0811632811632947*G0_0_1_4_2 + 0.0307692307692359*G0_0_1_4_3 - 0.148651348651374*G0_0_1_4_4 + 0.0371628371628435*G0_0_1_4_5 - 0.0743256743256869*G0_0_1_4_6 + 0.0130269730269752*G0_0_1_4_7 + 0.00855144855144997*G0_0_1_4_8 - 0.0871128871129017*G0_0_1_4_9 + 0.00298368298368351*G0_0_1_5_0 + 0.00370296370296434*G0_0_1_5_1 - 0.0395160395160461*G0_0_1_5_2 - 0.0143856143856168*G0_0_1_5_3 + 0.0371628371628435*G0_0_1_5_4 - 0.0103896103896122*G0_0_1_5_5 + 0.0307692307692362*G0_0_1_5_6 - 0.00399600399600466*G0_0_1_5_7 - 0.00455544455544532*G0_0_1_5_8 + 0.0351648351648411*G0_0_1_5_9 - 0.00737928737928869*G0_0_1_6_0 - 0.010203130203132*G0_0_1_6_1 + 0.0811632811632945*G0_0_1_6_2 + 0.0371628371628434*G0_0_1_6_3 - 0.0743256743256869*G0_0_1_6_4 + 0.0307692307692362*G0_0_1_6_5 - 0.148651348651374*G0_0_1_6_6 + 0.00855144855144998*G0_0_1_6_7 + 0.0130269730269752*G0_0_1_6_8 - 0.0871128871129017*G0_0_1_6_9 + 0.000279085993371761*G0_0_1_7_0 + 0.00136371564943015*G0_0_1_7_1 - 0.000666000666000761*G0_0_1_7_2 - 0.00455544455544532*G0_0_1_7_3 + 0.0130269730269752*G0_0_1_7_4 - 0.00399600399600466*G0_0_1_7_5 + 0.00855144855144998*G0_0_1_7_6 - 0.00632510346796155*G0_0_1_7_7 - 0.00046810332524628*G0_0_1_7_8 + 0.00895104895105045*G0_0_1_7_9 + 0.00136371564943017*G0_0_1_8_0 + 0.000279085993371792*G0_0_1_8_1 - 0.000666000666000751*G0_0_1_8_2 - 0.00399600399600464*G0_0_1_8_3 + 0.00855144855144997*G0_0_1_8_4 - 0.00455544455544532*G0_0_1_8_5 + 0.0130269730269752*G0_0_1_8_6 - 0.000468103325246281*G0_0_1_8_7 - 0.00632510346796145*G0_0_1_8_8 + 0.00895104895105046*G0_0_1_8_9 - 0.00868464868465017*G0_0_1_9_0 - 0.00868464868465015*G0_0_1_9_1 + 0.00426240426240494*G0_0_1_9_2 + 0.035164835164841*G0_0_1_9_3 - 0.0871128871129017*G0_0_1_9_4 + 0.0351648351648411*G0_0_1_9_5 - 0.0871128871129017*G0_0_1_9_6 + 0.00895104895105045*G0_0_1_9_7 + 0.00895104895105046*G0_0_1_9_8 - 0.0671328671328783*G0_0_1_9_9 + 0.044346482441728*G0_1_1_0_0 + 0.00420489563346779*G0_1_1_0_1 + 0.00902406235739724*G0_1_1_0_2 - 0.00190370476084796*G0_1_1_0_3 + 0.00487808487808572*G0_1_1_0_4 + 0.00577454291740102*G0_1_1_0_5 + 0.00368520368520437*G0_1_1_0_6 + 0.0310191395905734*G0_1_1_0_7 - 0.0150947465233205*G0_1_1_0_8 + 0.00626421197849882*G0_1_1_0_9 + 0.00420489563346779*G0_1_1_1_0 + 0.00472698377460377*G0_1_1_1_1 + 0.00797622130955601*G0_1_1_1_2 - 0.00649086363372184*G0_1_1_1_3 + 0.00770192770192899*G0_1_1_1_4 + 0.00224706510420833*G0_1_1_1_5 + 0.0160136160136188*G0_1_1_1_6 + 0.00474530760245123*G0_1_1_1_7 - 0.00443408443408508*G0_1_1_1_8 + 0.013999968285685*G0_1_1_1_9 + 0.00902406235739724*G0_1_1_2_0 + 0.00797622130955601*G0_1_1_2_1 + 0.259513326180037*G0_1_1_2_2 - 0.0346468346468404*G0_1_1_2_3 + 0.0714248714248835*G0_1_1_2_4 - 0.0311540311540363*G0_1_1_2_5 + 0.061686461686472*G0_1_1_2_6 + 0.00542864542864635*G0_1_1_2_7 + 0.00120176120176142*G0_1_1_2_8 + 0.00150960150960173*G0_1_1_2_9 - 0.00190370476084796*G0_1_1_3_0 - 0.00649086363372184*G0_1_1_3_1 - 0.0346468346468404*G0_1_1_3_2 + 0.0329803529803586*G0_1_1_3_3 - 0.0319147519147573*G0_1_1_3_4 + 0.00492840492840575*G0_1_1_3_5 - 0.0589277389277488*G0_1_1_3_6 - 0.00517577660434897*G0_1_1_3_7 + 0.0196679510965259*G0_1_1_3_8 - 0.031648351648357*G0_1_1_3_9 + 0.00487808487808572*G0_1_1_4_0 + 0.007701927701929*G0_1_1_4_1 + 0.0714248714248835*G0_1_1_4_2 - 0.0319147519147573*G0_1_1_4_3 + 0.0101232101232117*G0_1_1_4_4 - 0.0255211455211498*G0_1_1_4_5 + 0.0844488844488987*G0_1_1_4_6 - 0.0100166500166517*G0_1_1_4_7 - 0.0144921744921769*G0_1_1_4_8 + 0.0465134865134944*G0_1_1_4_9 + 0.00577454291740102*G0_1_1_5_0 + 0.00224706510420833*G0_1_1_5_1 - 0.0311540311540363*G0_1_1_5_2 + 0.00492840492840575*G0_1_1_5_3 - 0.0255211455211498*G0_1_1_5_4 + 0.101018981018998*G0_1_1_5_5 - 0.0570629370629466*G0_1_1_5_6 + 0.0448009133723494*G0_1_1_5_7 - 0.0176280861995177*G0_1_1_5_8 + 0.0164635364635392*G0_1_1_5_9 + 0.00368520368520437*G0_1_1_6_0 + 0.0160136160136188*G0_1_1_6_1 + 0.061686461686472*G0_1_1_6_2 - 0.0589277389277488*G0_1_1_6_3 + 0.0844488844488987*G0_1_1_6_4 - 0.0570629370629466*G0_1_1_6_5 + 0.327672327672384*G0_1_1_6_6 - 0.0271728271728317*G0_1_1_6_7 - 0.0203796203796238*G0_1_1_6_8 + 0.113326673326693*G0_1_1_6_9 + 0.0310191395905734*G0_1_1_7_0 + 0.00474530760245123*G0_1_1_7_1 + 0.00542864542864634*G0_1_1_7_2 - 0.00517577660434897*G0_1_1_7_3 - 0.0100166500166517*G0_1_1_7_4 + 0.0448009133723494*G0_1_1_7_5 - 0.0271728271728317*G0_1_1_7_6 + 0.188748394462712*G0_1_1_7_7 - 0.0296617668046291*G0_1_1_7_8 + 0.0355530184101673*G0_1_1_7_9 - 0.0150947465233205*G0_1_1_8_0 - 0.00443408443408508*G0_1_1_8_1 + 0.00120176120176142*G0_1_1_8_2 + 0.0196679510965259*G0_1_1_8_3 - 0.0144921744921769*G0_1_1_8_4 - 0.0176280861995177*G0_1_1_8_5 - 0.0203796203796238*G0_1_1_8_6 - 0.0296617668046291*G0_1_1_8_7 + 0.088756957328401*G0_1_1_8_8 - 0.013015555872701*G0_1_1_8_9 + 0.00626421197849882*G0_1_1_9_0 + 0.013999968285685*G0_1_1_9_1 + 0.00150960150960173*G0_1_1_9_2 - 0.031648351648357*G0_1_1_9_3 + 0.0465134865134944*G0_1_1_9_4 + 0.0164635364635392*G0_1_1_9_5 + 0.113326673326693*G0_1_1_9_6 + 0.0355530184101673*G0_1_1_9_7 - 0.013015555872701*G0_1_1_9_8 + 0.258941058941103*G0_1_1_9_9; + A[63] = -A[71] - 0.000348434634148947*G0_0_0_0_0 - 0.00117043450376804*G0_0_0_0_1 - 0.00707077754696922*G0_0_0_0_2 + 0.00632224917939311*G0_0_0_0_3 - 0.00716711859569125*G0_0_0_0_4 + 0.00969379826522849*G0_0_0_0_5 - 0.0145857317285914*G0_0_0_0_6 + 0.00190095618667079*G0_0_0_0_7 - 0.00192664478378797*G0_0_0_0_8 - 0.00482374768089139*G0_0_0_0_9 - 0.00117043450376804*G0_0_0_1_0 + 0.0139514806181495*G0_0_0_1_1 - 0.00173036839703536*G0_0_0_1_2 + 0.000710400710400801*G0_0_0_1_3 - 0.016239316239319*G0_0_0_1_4 + 0.00429570429570502*G0_0_0_1_5 - 0.0104895104895123*G0_0_0_1_6 + 0.00192030192030225*G0_0_0_1_7 + 0.00295260295260343*G0_0_0_1_8 - 0.0113886113886133*G0_0_0_1_9 - 0.00707077754696922*G0_0_0_2_0 - 0.00173036839703537*G0_0_0_2_1 - 0.0961024161024321*G0_0_0_2_2 + 0.00556586270872071*G0_0_0_2_3 - 0.0294105894105943*G0_0_0_2_4 + 0.0330761302189929*G0_0_0_2_5 - 0.0708447108447227*G0_0_0_2_6 + 0.00287997716569192*G0_0_0_2_7 - 0.00586556300842114*G0_0_0_2_8 - 0.00673612102183642*G0_0_0_2_9 + 0.00632224917939311*G0_0_0_3_0 + 0.000710400710400801*G0_0_0_3_1 + 0.00556586270872071*G0_0_0_3_2 + 0.0683316683316797*G0_0_0_3_3 + 0.0878121878122028*G0_0_0_3_4 - 0.0216640502354824*G0_0_0_3_5 + 0.0429427715142072*G0_0_0_3_6 - 0.00749250749250871*G0_0_0_3_7 - 0.0215784215784252*G0_0_0_3_8 + 0.0491508491508573*G0_0_0_3_9 - 0.00716711859569125*G0_0_0_4_0 - 0.016239316239319*G0_0_0_4_1 - 0.0294105894105943*G0_0_0_4_2 + 0.0878121878122028*G0_0_0_4_3 - 0.140345368916821*G0_0_0_4_4 + 0.0329755958327442*G0_0_0_4_5 - 0.0759183673469515*G0_0_0_4_6 + 0.000693592122163657*G0_0_0_4_7 + 0.0290709290709339*G0_0_0_4_8 - 0.0457428285999791*G0_0_0_4_9 + 0.00969379826522849*G0_0_0_5_0 + 0.00429570429570502*G0_0_0_5_1 + 0.0330761302189929*G0_0_0_5_2 - 0.0216640502354824*G0_0_0_5_3 + 0.0329755958327442*G0_0_0_5_4 - 0.0455886970172761*G0_0_0_5_5 + 0.0570201227344181*G0_0_0_5_6 - 0.00142143570715025*G0_0_0_5_7 - 0.0014128728414445*G0_0_0_5_8 + 0.0172969887255631*G0_0_0_5_9 - 0.0145857317285914*G0_0_0_6_0 - 0.0104895104895123*G0_0_0_6_1 - 0.0708447108447227*G0_0_0_6_2 + 0.0429427715142072*G0_0_0_6_3 - 0.0759183673469515*G0_0_0_6_4 + 0.0570201227344181*G0_0_0_6_5 - 0.29331240188388*G0_0_0_6_6 + 0.00283430854859473*G0_0_0_6_7 + 0.0187954902240648*G0_0_0_6_8 - 0.0656771799629052*G0_0_0_6_9 + 0.00190095618667079*G0_0_0_7_0 + 0.00192030192030225*G0_0_0_7_1 + 0.00287997716569192*G0_0_0_7_2 - 0.00749250749250872*G0_0_0_7_3 + 0.000693592122163656*G0_0_0_7_4 - 0.00142143570715025*G0_0_0_7_5 + 0.00283430854859473*G0_0_0_7_6 - 0.000685029256458069*G0_0_0_7_7 + 0.00869130869131019*G0_0_0_7_8 + 0.0088026259454846*G0_0_0_7_9 - 0.00192664478378797*G0_0_0_8_0 + 0.00295260295260343*G0_0_0_8_1 - 0.00586556300842114*G0_0_0_8_2 - 0.0215784215784252*G0_0_0_8_3 + 0.0290709290709339*G0_0_0_8_4 - 0.0014128728414445*G0_0_0_8_5 + 0.0187954902240648*G0_0_0_8_6 + 0.00869130869131019*G0_0_0_8_7 - 0.0659340659340768*G0_0_0_8_8 - 0.023976023976028*G0_0_0_8_9 - 0.00482374768089139*G0_0_0_9_0 - 0.0113886113886133*G0_0_0_9_1 - 0.00673612102183642*G0_0_0_9_2 + 0.0491508491508573*G0_0_0_9_3 - 0.0457428285999791*G0_0_0_9_4 + 0.0172969887255631*G0_0_0_9_5 - 0.0656771799629052*G0_0_0_9_6 + 0.0088026259454846*G0_0_0_9_7 - 0.023976023976028*G0_0_0_9_8 - 0.110152704438438*G0_0_0_9_9 + 0.00255659684231161*G0_1_0_0_0 + 0.00504261170927931*G0_1_0_0_1 + 0.00031886984267942*G0_1_0_0_2 + 0.0262382062382107*G0_1_0_0_3 - 0.0019849991278566*G0_1_0_0_4 - 0.00316064887493513*G0_1_0_0_5 - 0.000746872175443724*G0_1_0_0_6 - 0.00676466390752223*G0_1_0_0_7 + 0.00941058941059104*G0_1_0_0_8 + 0.0195632938490114*G0_1_0_0_9 + 0.00504261170927931*G0_1_0_1_0 + 0.196588596588631*G0_1_0_1_1 + 0.00603519936853374*G0_1_0_1_2 + 0.0391164391164461*G0_1_0_1_3 - 0.0287490287490337*G0_1_0_1_4 + 0.00192918192918217*G0_1_0_1_5 - 0.000574980574980651*G0_1_0_1_6 - 0.0241314241314285*G0_1_0_1_7 + 0.0565212565212667*G0_1_0_1_8 - 0.0101232101232117*G0_1_0_1_9 + 0.00031886984267942*G0_1_0_2_0 + 0.00603519936853374*G0_1_0_2_1 - 0.00360133693467079*G0_1_0_2_2 + 0.00894882894883042*G0_1_0_2_3 - 0.00805607091321513*G0_1_0_2_4 + 0.00137925566497017*G0_1_0_2_5 - 0.00490874205159999*G0_1_0_2_6 - 0.00297448583162919*G0_1_0_2_7 + 0.000823620823620972*G0_1_0_2_8 + 0.00427952999381641*G0_1_0_2_9 + 0.0262382062382108*G0_1_0_3_0 + 0.0391164391164461*G0_1_0_3_1 + 0.00894882894883042*G0_1_0_3_2 + 0.491108891108975*G0_1_0_3_3 - 0.0304295704295754*G0_1_0_3_4 - 0.0388211788211853*G0_1_0_3_5 - 0.00513486513486597*G0_1_0_3_6 - 0.0855744255744401*G0_1_0_3_7 + 0.0949050949051111*G0_1_0_3_8 + 0.201518481518516*G0_1_0_3_9 - 0.0019849991278566*G0_1_0_4_0 - 0.0287490287490337*G0_1_0_4_1 - 0.00805607091321513*G0_1_0_4_2 - 0.0304295704295754*G0_1_0_4_3 + 0.0551048951049044*G0_1_0_4_4 - 0.000904809476238213*G0_1_0_4_5 + 0.0060396746111042*G0_1_0_4_6 + 0.0108691308691327*G0_1_0_4_7 - 0.00933066933067095*G0_1_0_4_8 - 0.0110289710289728*G0_1_0_4_9 - 0.00316064887493513*G0_1_0_5_0 + 0.00192918192918217*G0_1_0_5_1 + 0.00137925566497017*G0_1_0_5_2 - 0.0388211788211853*G0_1_0_5_3 - 0.000904809476238214*G0_1_0_5_4 + 0.00041672613101172*G0_1_0_5_5 + 0.00131582703011293*G0_1_0_5_6 + 0.0105837020122752*G0_1_0_5_7 - 0.0126473526473548*G0_1_0_5_8 - 0.0333951762523247*G0_1_0_5_9 - 0.000746872175443724*G0_1_0_6_0 - 0.000574980574980651*G0_1_0_6_1 - 0.00490874205159999*G0_1_0_6_2 - 0.00513486513486597*G0_1_0_6_3 + 0.0060396746111042*G0_1_0_6_4 + 0.00131582703011293*G0_1_0_6_5 - 0.0164349935778536*G0_1_0_6_6 + 0.00206365063507954*G0_1_0_6_7 + 0.00305694305694356*G0_1_0_6_8 - 0.00256885971171726*G0_1_0_6_9 - 0.00676466390752223*G0_1_0_7_0 - 0.0241314241314285*G0_1_0_7_1 - 0.00297448583162919*G0_1_0_7_2 - 0.0855744255744401*G0_1_0_7_3 + 0.0108691308691327*G0_1_0_7_4 + 0.0105837020122752*G0_1_0_7_5 + 0.00206365063507954*G0_1_0_7_6 + 0.0173826173826204*G0_1_0_7_7 - 0.0341058941059*G0_1_0_7_8 - 0.0628171828171934*G0_1_0_7_9 + 0.00941058941059104*G0_1_0_8_0 + 0.0565212565212666*G0_1_0_8_1 + 0.000823620823620974*G0_1_0_8_2 + 0.0949050949051111*G0_1_0_8_3 - 0.00933066933067095*G0_1_0_8_4 - 0.0126473526473548*G0_1_0_8_5 + 0.00305694305694356*G0_1_0_8_6 - 0.0341058941059*G0_1_0_8_7 - 0.11148851148853*G0_1_0_8_8 + 0.0490309690309772*G0_1_0_8_9 + 0.0195632938490114*G0_1_0_9_0 - 0.0101232101232117*G0_1_0_9_1 + 0.00427952999381641*G0_1_0_9_2 + 0.201518481518516*G0_1_0_9_3 - 0.0110289710289728*G0_1_0_9_4 - 0.0333951762523247*G0_1_0_9_5 - 0.00256885971171726*G0_1_0_9_6 - 0.0628171828171933*G0_1_0_9_7 + 0.0490309690309772*G0_1_0_9_8 + 0.20571428571432*G0_1_0_9_9; + A[77] = -A[122] - 0.0089056270008666*G0_1_1_0_0 - 0.00133135823612038*G0_1_1_0_1 - 0.00456796290129701*G0_1_1_0_2 - 0.00100547600547617*G0_1_1_0_3 - 0.000491545491545574*G0_1_1_0_4 - 0.00117956117956138*G0_1_1_0_5 + 0.000338920338920403*G0_1_1_0_6 - 0.0055419712562579*G0_1_1_0_7 + 0.00176056747485347*G0_1_1_0_8 - 0.000881340881341044*G0_1_1_0_9 - 0.00133135823612038*G0_1_1_1_0 - 0.00890562700086671*G0_1_1_1_1 - 0.00456796290129701*G0_1_1_1_2 - 0.00117956117956141*G0_1_1_1_3 + 0.000338920338920403*G0_1_1_1_4 - 0.00100547600547617*G0_1_1_1_5 - 0.000491545491545578*G0_1_1_1_6 + 0.00176056747485352*G0_1_1_1_7 - 0.00554197125625798*G0_1_1_1_8 - 0.000881340881341046*G0_1_1_1_9 - 0.00456796290129701*G0_1_1_2_0 - 0.00456796290129701*G0_1_1_2_1 - 0.1426931093598*G0_1_1_2_2 + 0.0185148185148216*G0_1_1_2_3 - 0.0380452880452944*G0_1_1_2_4 + 0.0185148185148216*G0_1_1_2_5 - 0.0380452880452944*G0_1_1_2_6 - 0.0010221260221262*G0_1_1_2_7 - 0.00102212602212621*G0_1_1_2_8 - 0.00203130203130235*G0_1_1_2_9 - 0.00100547600547618*G0_1_1_3_0 - 0.00117956117956141*G0_1_1_3_1 + 0.0185148185148216*G0_1_1_3_2 - 0.0180619380619411*G0_1_1_3_3 + 0.00641858141858251*G0_1_1_3_4 + 0.00206793206793242*G0_1_1_3_5 + 0.00337162837162892*G0_1_1_3_6 + 0.00491341991342076*G0_1_1_3_7 - 0.00987678987679155*G0_1_1_3_8 - 0.00718281718281837*G0_1_1_3_9 - 0.000491545491545575*G0_1_1_4_0 + 0.000338920338920405*G0_1_1_4_1 - 0.0380452880452944*G0_1_1_4_2 + 0.00641858141858251*G0_1_1_4_3 - 0.0134865134865157*G0_1_1_4_4 + 0.00337162837162892*G0_1_1_4_5 - 0.00674325674325785*G0_1_1_4_6 + 0.00132201132201154*G0_1_1_4_7 + 0.00496336996337081*G0_1_1_4_8 - 0.00064935064935079*G0_1_1_4_9 - 0.00117956117956138*G0_1_1_5_0 - 0.00100547600547617*G0_1_1_5_1 + 0.0185148185148216*G0_1_1_5_2 + 0.00206793206793242*G0_1_1_5_3 + 0.00337162837162893*G0_1_1_5_4 - 0.018061938061941*G0_1_1_5_5 + 0.00641858141858242*G0_1_1_5_6 - 0.00987678987679151*G0_1_1_5_7 + 0.00491341991342074*G0_1_1_5_8 - 0.00718281718281837*G0_1_1_5_9 + 0.000338920338920403*G0_1_1_6_0 - 0.000491545491545578*G0_1_1_6_1 - 0.0380452880452944*G0_1_1_6_2 + 0.00337162837162893*G0_1_1_6_3 - 0.00674325674325784*G0_1_1_6_4 + 0.00641858141858242*G0_1_1_6_5 - 0.0134865134865157*G0_1_1_6_6 + 0.00496336996337079*G0_1_1_6_7 + 0.00132201132201154*G0_1_1_6_8 - 0.000649350649350811*G0_1_1_6_9 - 0.0055419712562579*G0_1_1_7_0 + 0.00176056747485352*G0_1_1_7_1 - 0.0010221260221262*G0_1_1_7_2 + 0.00491341991342076*G0_1_1_7_3 + 0.00132201132201154*G0_1_1_7_4 - 0.00987678987679151*G0_1_1_7_5 + 0.00496336996337079*G0_1_1_7_6 - 0.0513438942010457*G0_1_1_7_7 + 0.0110258788830237*G0_1_1_7_8 - 0.0072827172827185*G0_1_1_7_9 + 0.00176056747485347*G0_1_1_8_0 - 0.00554197125625798*G0_1_1_8_1 - 0.00102212602212621*G0_1_1_8_2 - 0.00987678987679155*G0_1_1_8_3 + 0.00496336996337081*G0_1_1_8_4 + 0.00491341991342074*G0_1_1_8_5 + 0.00132201132201154*G0_1_1_8_6 + 0.0110258788830237*G0_1_1_8_7 - 0.0513438942010458*G0_1_1_8_8 - 0.0072827172827185*G0_1_1_8_9 - 0.000881340881341044*G0_1_1_9_0 - 0.000881340881341046*G0_1_1_9_1 - 0.00203130203130235*G0_1_1_9_2 - 0.00718281718281837*G0_1_1_9_3 - 0.00064935064935079*G0_1_1_9_4 - 0.00718281718281837*G0_1_1_9_5 - 0.000649350649350811*G0_1_1_9_6 - 0.0072827172827185*G0_1_1_9_7 - 0.0072827172827185*G0_1_1_9_8 - 0.0600599400599501*G0_1_1_9_9; + A[171] = -A[51] - 0.0322442989109711*G0_0_0_0_0 - 0.00149395577967032*G0_0_0_0_1 - 0.00445424064471759*G0_0_0_0_2 + 0.000595806310092106*G0_0_0_0_3 + 0.000182251610823076*G0_0_0_0_4 - 0.0500536500536586*G0_0_0_0_5 + 0.0234309605738217*G0_0_0_0_6 - 0.00976208976209143*G0_0_0_0_7 + 0.0071035842464426*G0_0_0_0_8 - 0.0073399616256772*G0_0_0_0_9 - 0.00149395577967032*G0_0_0_1_0 + 0.00284160284160329*G0_0_0_1_1 + 0.00118400118400138*G0_0_0_1_3 + 0.00179672179672211*G0_0_0_1_4 - 0.00416134130419912*G0_0_0_1_5 - 0.000426663283806217*G0_0_0_1_6 + 0.0035845635845642*G0_0_0_1_7 - 0.00109520109520131*G0_0_0_1_8 - 0.00023088023088026*G0_0_0_1_9 - 0.00445424064471759*G0_0_0_2_0 - 0.0248285048285089*G0_0_0_2_2 + 0.00139796711225303*G0_0_0_2_3 + 0.00239506525220859*G0_0_0_2_4 - 0.0063149548863846*G0_0_0_2_5 + 0.00570350284636106*G0_0_0_2_6 + 0.00198869913155661*G0_0_0_2_7 + 0.00035985178842328*G0_0_0_2_8 + 0.0105646734218181*G0_0_0_2_9 + 0.000595806310092105*G0_0_0_3_0 + 0.00118400118400138*G0_0_0_3_1 + 0.00139796711225303*G0_0_0_3_2 - 0.0511488511488602*G0_0_0_3_3 - 0.0176166690452435*G0_0_0_3_4 + 0.00609676038247561*G0_0_0_3_5 - 0.000216925931211665*G0_0_0_3_6 - 0.00328433471290666*G0_0_0_3_7 + 0.00586080586080683*G0_0_0_3_8 + 0.00726131011845407*G0_0_0_3_9 + 0.000182251610823076*G0_0_0_4_0 + 0.00179672179672211*G0_0_0_4_1 + 0.00239506525220859*G0_0_0_4_2 - 0.0176166690452435*G0_0_0_4_3 + 0.0350963322391953*G0_0_0_4_4 - 0.00204367061509951*G0_0_0_4_5 + 0.00226059654631121*G0_0_0_4_6 - 0.00250796822225436*G0_0_0_4_7 - 0.00257647114790016*G0_0_0_4_8 - 0.0276066790352552*G0_0_0_4_9 - 0.0500536500536586*G0_0_0_5_0 - 0.00416134130419911*G0_0_0_5_1 - 0.0063149548863846*G0_0_0_5_2 + 0.00609676038247561*G0_0_0_5_3 - 0.00204367061509951*G0_0_0_5_4 - 0.312373340944822*G0_0_0_5_5 + 0.0205622948480126*G0_0_0_5_6 - 0.00352409495266688*G0_0_0_5_7 + 0.010987108129967*G0_0_0_5_8 + 0.0234309605738217*G0_0_0_6_0 - 0.000426663283806217*G0_0_0_6_1 + 0.00570350284636106*G0_0_0_6_2 - 0.000216925931211664*G0_0_0_6_3 + 0.00226059654631121*G0_0_0_6_4 + 0.0205622948480126*G0_0_0_6_5 + 0.0230398173255355*G0_0_0_6_6 - 0.00746301317730014*G0_0_0_6_7 + 0.000848675134389574*G0_0_0_6_8 - 0.0312601684030309*G0_0_0_6_9 - 0.00976208976209143*G0_0_0_7_0 + 0.0035845635845642*G0_0_0_7_1 + 0.00198869913155661*G0_0_0_7_2 - 0.00328433471290666*G0_0_0_7_3 - 0.00250796822225436*G0_0_0_7_4 - 0.00352409495266688*G0_0_0_7_5 - 0.00746301317730014*G0_0_0_7_6 + 0.0496113410399207*G0_0_0_7_7 - 0.0207982493696814*G0_0_0_7_8 + 0.0369459112316318*G0_0_0_7_9 + 0.0071035842464426*G0_0_0_8_0 - 0.00109520109520131*G0_0_0_8_1 + 0.00035985178842328*G0_0_0_8_2 + 0.00586080586080683*G0_0_0_8_3 - 0.00257647114790016*G0_0_0_8_4 + 0.010987108129967*G0_0_0_8_5 + 0.000848675134389574*G0_0_0_8_6 - 0.0207982493696814*G0_0_0_8_7 + 0.0202464202464239*G0_0_0_8_8 + 0.0058455829884411*G0_0_0_8_9 - 0.0073399616256772*G0_0_0_9_0 - 0.00023088023088026*G0_0_0_9_1 + 0.0105646734218181*G0_0_0_9_2 + 0.00726131011845407*G0_0_0_9_3 - 0.0276066790352552*G0_0_0_9_4 - 0.0312601684030309*G0_0_0_9_6 + 0.0369459112316318*G0_0_0_9_7 + 0.0058455829884411*G0_0_0_9_8 + 0.0454859426288075*G0_0_0_9_9 + 0.0935558268891767*G0_0_1_0_0 + 0.00156598251836375*G0_0_1_0_1 + 0.00349900540376792*G0_0_1_0_2 + 0.00110704110704127*G0_0_1_0_3 - 0.00119922405636712*G0_0_1_0_4 + 0.0361061161061224*G0_0_1_0_5 - 0.0124738753310204*G0_0_1_0_6 + 0.010993450993453*G0_0_1_0_7 - 0.00540538826253212*G0_0_1_0_8 - 0.000662194947909306*G0_0_1_0_9 + 0.00156598251836375*G0_0_1_1_0 + 0.000180419228038305*G0_0_1_1_2 + 0.000592000592000651*G0_0_1_1_3 + 0.00167536167536198*G0_0_1_1_4 - 0.000524343381486297*G0_0_1_1_5 - 0.00122205836491572*G0_0_1_1_6 - 0.000592000592000747*G0_0_1_1_8 - 0.00166944166944195*G0_0_1_1_9 + 0.00349900540376792*G0_0_1_2_0 + 0.000180419228038305*G0_0_1_2_1 - 0.0223759309473633*G0_0_1_2_2 + 0.00178319035461922*G0_0_1_2_3 + 0.0026826083968946*G0_0_1_2_4 + 0.00379091807663299*G0_0_1_2_5 + 0.00427424427424501*G0_0_1_2_6 - 0.00040256040256046*G0_0_1_2_7 + 0.000383954669669017*G0_0_1_2_8 + 0.00931386074243375*G0_0_1_2_9 + 0.00110704110704127*G0_0_1_3_0 + 0.000592000592000651*G0_0_1_3_1 + 0.00178319035461922*G0_0_1_3_2 - 0.03409923409924*G0_0_1_3_3 - 0.0186404072118389*G0_0_1_3_4 + 0.000871509442938077*G0_0_1_3_5 + 0.000175063032205943*G0_0_1_3_6 - 0.0068122353836651*G0_0_1_3_7 + 0.0114552114552134*G0_0_1_3_8 + 0.018632795775656*G0_0_1_3_9 - 0.00119922405636712*G0_0_1_4_0 + 0.00167536167536198*G0_0_1_4_1 + 0.0026826083968946*G0_0_1_4_2 - 0.018640407211839*G0_0_1_4_3 + 0.0304533561676469*G0_0_1_4_4 + 0.000106560106560153*G0_0_1_4_5 - 0.000281623138766076*G0_0_1_4_6 + 0.00414823271966199*G0_0_1_4_7 - 0.00464297607154828*G0_0_1_4_8 - 0.0281547024404216*G0_0_1_4_9 + 0.0361061161061224*G0_0_1_5_0 - 0.000524343381486297*G0_0_1_5_1 + 0.00379091807663299*G0_0_1_5_2 + 0.000871509442938077*G0_0_1_5_3 + 0.000106560106560154*G0_0_1_5_4 - 0.110495219066666*G0_0_1_5_5 - 0.0353931782503271*G0_0_1_5_6 + 0.00420151277294219*G0_0_1_5_7 - 0.00191808191808235*G0_0_1_5_8 + 0.00582274867989271*G0_0_1_5_9 - 0.0124738753310204*G0_0_1_6_0 - 0.00122205836491572*G0_0_1_6_1 + 0.00427424427424501*G0_0_1_6_2 + 0.000175063032205942*G0_0_1_6_3 - 0.000281623138766076*G0_0_1_6_4 - 0.0353931782503271*G0_0_1_6_5 + 0.0397088625660121*G0_0_1_6_6 - 0.00228343085485984*G0_0_1_6_7 + 0.00300271157414068*G0_0_1_6_8 - 0.0282917082917132*G0_0_1_6_9 + 0.010993450993453*G0_0_1_7_0 - 0.00040256040256046*G0_0_1_7_2 - 0.0068122353836651*G0_0_1_7_3 + 0.00414823271966199*G0_0_1_7_4 + 0.00420151277294219*G0_0_1_7_5 - 0.00228343085485984*G0_0_1_7_6 - 0.0366490652204998*G0_0_1_7_7 - 0.00283145426002626*G0_0_1_7_8 + 0.00655344655344772*G0_0_1_7_9 - 0.00540538826253212*G0_0_1_8_0 - 0.000592000592000748*G0_0_1_8_1 + 0.000383954669669017*G0_0_1_8_2 + 0.0114552114552134*G0_0_1_8_3 - 0.00464297607154828*G0_0_1_8_4 - 0.00191808191808235*G0_0_1_8_5 + 0.00300271157414068*G0_0_1_8_6 - 0.00283145426002626*G0_0_1_8_7 + 0.0111888111888132*G0_0_1_8_8 + 0.0142942771514224*G0_0_1_8_9 - 0.000662194947909305*G0_0_1_9_0 - 0.00166944166944195*G0_0_1_9_1 + 0.00931386074243375*G0_0_1_9_2 + 0.018632795775656*G0_0_1_9_3 - 0.0281547024404216*G0_0_1_9_4 + 0.00582274867989271*G0_0_1_9_5 - 0.0282917082917132*G0_0_1_9_6 + 0.00655344655344772*G0_0_1_9_7 + 0.0142942771514224*G0_0_1_9_8 + 0.0411017553874767*G0_0_1_9_9; + A[57] = -A[171] - 0.0237826371159745*G0_0_0_0_0 + 0.000261044070567933*G0_0_0_0_1 - 0.00393666298428271*G0_0_0_0_2 + 0.0100885358028233*G0_0_0_0_3 + 0.00102458388172691*G0_0_0_0_4 - 0.0373945631088552*G0_0_0_0_5 + 0.0108505251362413*G0_0_0_0_6 - 0.00734292162863719*G0_0_0_0_7 + 0.00323570609284952*G0_0_0_0_8 - 0.00687566401852231*G0_0_0_0_9 + 0.000261044070567933*G0_0_0_1_0 + 0.0244693578026953*G0_0_0_1_1 + 0.00402489926299519*G0_0_0_1_2 + 0.0450246050246128*G0_0_0_1_3 - 0.0240834297977197*G0_0_0_1_4 + 0.00059707488278927*G0_0_0_1_5 - 0.00229780801209415*G0_0_0_1_7 + 0.00988936988937159*G0_0_0_1_8 + 0.0193837908123656*G0_0_0_1_9 - 0.00393666298428271*G0_0_0_2_0 + 0.00402489926299519*G0_0_0_2_1 - 0.00509120509120591*G0_0_0_2_2 + 0.0101282844140004*G0_0_0_2_3 - 0.0143348714777311*G0_0_0_2_4 - 0.0151467580039034*G0_0_0_2_6 + 0.00372918087203862*G0_0_0_2_7 - 0.00243608243608282*G0_0_0_2_8 - 0.00977308405879997*G0_0_0_2_9 + 0.0100885358028233*G0_0_0_3_0 + 0.0450246050246128*G0_0_0_3_1 + 0.0101282844140004*G0_0_0_3_2 + 0.440108462965681*G0_0_0_3_3 - 0.0222063650635118*G0_0_0_3_4 - 0.0153446553446579*G0_0_0_3_5 - 0.00151848151848179*G0_0_0_3_6 - 0.0316331287759914*G0_0_0_3_7 + 0.0256924028352646*G0_0_0_3_8 + 0.00511488511488634*G0_0_0_3_9 + 0.00102458388172691*G0_0_0_4_0 - 0.0240834297977197*G0_0_0_4_1 - 0.0143348714777311*G0_0_0_4_2 - 0.0222063650635118*G0_0_0_4_3 - 0.0123990295418889*G0_0_0_4_4 - 0.00444127301270234*G0_0_0_4_5 + 0.00595975453118412*G0_0_0_4_6 - 0.00644688644688749*G0_0_0_4_7 + 0.00594072594072684*G0_0_0_4_8 + 0.0382017982018046*G0_0_0_4_9 - 0.0373945631088552*G0_0_0_5_0 + 0.00059707488278927*G0_0_0_5_1 - 0.0153446553446579*G0_0_0_5_3 - 0.00444127301270234*G0_0_0_5_4 - 0.0573141144569814*G0_0_0_5_5 + 0.0439217924932285*G0_0_0_5_6 + 0.0157138099995269*G0_0_0_5_7 - 0.00315874601588939*G0_0_0_5_8 + 0.0269444840873457*G0_0_0_5_9 + 0.0108505251362413*G0_0_0_6_0 - 0.0151467580039034*G0_0_0_6_2 - 0.00151848151848179*G0_0_0_6_3 + 0.00595975453118412*G0_0_0_6_4 + 0.0439217924932285*G0_0_0_6_5 + 0.0292507492507543*G0_0_0_6_6 - 0.0125550639836375*G0_0_0_6_7 + 0.00426240426240494*G0_0_0_6_8 + 0.0323562152133636*G0_0_0_6_9 - 0.00734292162863719*G0_0_0_7_0 - 0.00229780801209415*G0_0_0_7_1 + 0.00372918087203863*G0_0_0_7_2 - 0.0316331287759914*G0_0_0_7_3 - 0.00644688644688749*G0_0_0_7_4 + 0.0157138099995269*G0_0_0_7_5 - 0.0125550639836375*G0_0_0_7_6 + 0.0447476333190693*G0_0_0_7_7 - 0.00994053565482307*G0_0_0_7_8 + 0.0457371200228419*G0_0_0_7_9 + 0.00323570609284952*G0_0_0_8_0 + 0.00988936988937159*G0_0_0_8_1 - 0.00243608243608282*G0_0_0_8_2 + 0.0256924028352646*G0_0_0_8_3 + 0.00594072594072684*G0_0_0_8_4 - 0.00315874601588939*G0_0_0_8_5 + 0.00426240426240494*G0_0_0_8_6 - 0.00994053565482307*G0_0_0_8_7 - 0.0276371247799862*G0_0_0_8_8 - 0.0700328243185503*G0_0_0_8_9 - 0.00687566401852231*G0_0_0_9_0 + 0.0193837908123656*G0_0_0_9_1 - 0.00977308405879997*G0_0_0_9_2 + 0.00511488511488634*G0_0_0_9_3 + 0.0382017982018046*G0_0_0_9_4 + 0.0269444840873457*G0_0_0_9_5 + 0.0323562152133636*G0_0_0_9_6 + 0.045737120022842*G0_0_0_9_7 - 0.0700328243185503*G0_0_0_9_8 + 0.130429570429593*G0_0_0_9_9 + 0.0905681972348798*G0_0_1_0_0 + 0.00172229886515633*G0_0_1_0_1 + 0.00241663098805999*G0_0_1_0_2 + 0.00349872349872416*G0_0_1_0_3 + 0.00188763617335076*G0_0_1_0_4 + 0.0342256685113888*G0_0_1_0_5 - 0.0122840122840145*G0_0_1_0_6 + 0.0126785383928264*G0_0_1_0_7 - 0.0128185042470779*G0_0_1_0_8 - 0.00594199451342401*G0_0_1_0_9 + 0.00172229886515633*G0_0_1_1_0 + 0.0113466780133465*G0_0_1_1_1 + 0.00283173616506998*G0_0_1_1_2 + 0.0304702704702757*G0_0_1_1_3 - 0.0175287146715748*G0_0_1_1_4 - 0.000484594770309116*G0_0_1_1_5 - 0.000734503591646575*G0_0_1_1_6 - 0.00139077853363591*G0_0_1_1_7 - 0.00226736226736264*G0_0_1_1_8 + 0.013129727415444*G0_0_1_1_9 + 0.00241663098805998*G0_0_1_2_0 + 0.00283173616506998*G0_0_1_2_1 + 0.00504553647410876*G0_0_1_2_2 + 0.00302385445242643*G0_0_1_2_3 - 0.00902378045235347*G0_0_1_2_4 + 0.00477786763501131*G0_0_1_2_5 + 0.000351817494674651*G0_0_1_2_6 + 0.00247625390482574*G0_0_1_2_7 - 0.00543329686186917*G0_0_1_2_8 - 0.0120590520590541*G0_0_1_2_9 + 0.00349872349872416*G0_0_1_3_0 + 0.0304702704702757*G0_0_1_3_1 + 0.00302385445242643*G0_0_1_3_2 + 0.362429951001442*G0_0_1_3_3 + 0.0057009657009666*G0_0_1_3_4 - 0.00573902288188104*G0_0_1_3_5 + 0.00463917035345682*G0_0_1_3_6 - 0.00806051091765534*G0_0_1_3_7 - 0.0106750392464693*G0_0_1_3_8 - 0.0232681604110211*G0_0_1_3_9 + 0.00188763617335076*G0_0_1_4_0 - 0.0175287146715748*G0_0_1_4_1 - 0.00902378045235347*G0_0_1_4_2 + 0.00570096570096661*G0_0_1_4_3 - 0.0383121640264563*G0_0_1_4_4 - 0.00322724894153518*G0_0_1_4_5 - 0.00141192141192164*G0_0_1_4_6 - 0.00776366490652331*G0_0_1_4_7 + 0.0187355501641246*G0_0_1_4_8 + 0.0426316540602326*G0_0_1_4_9 + 0.0342256685113888*G0_0_1_5_0 - 0.000484594770309116*G0_0_1_5_1 + 0.00477786763501131*G0_0_1_5_2 - 0.00573902288188104*G0_0_1_5_3 - 0.00322724894153517*G0_0_1_5_4 - 0.0633766233766336*G0_0_1_5_5 - 0.025083487940635*G0_0_1_5_6 + 0.00110365824651568*G0_0_1_5_7 + 0.00388944388944446*G0_0_1_5_8 + 0.0100470957613832*G0_0_1_5_9 - 0.0122840122840145*G0_0_1_6_0 - 0.000734503591646575*G0_0_1_6_1 + 0.000351817494674651*G0_0_1_6_2 + 0.00463917035345682*G0_0_1_6_3 - 0.00141192141192164*G0_0_1_6_4 - 0.025083487940635*G0_0_1_6_5 - 0.00419009561866767*G0_0_1_6_6 - 0.00499310213596013*G0_0_1_6_7 + 0.00803387089101507*G0_0_1_6_8 + 0.0268988154702486*G0_0_1_6_9 + 0.0126785383928264*G0_0_1_7_0 - 0.00139077853363591*G0_0_1_7_1 + 0.00247625390482574*G0_0_1_7_2 - 0.00806051091765533*G0_0_1_7_3 - 0.00776366490652331*G0_0_1_7_4 + 0.00110365824651568*G0_0_1_7_5 - 0.00499310213596013*G0_0_1_7_6 - 0.0617477760335005*G0_0_1_7_7 + 0.033882308168028*G0_0_1_7_8 + 0.0278121878121924*G0_0_1_7_9 - 0.0128185042470779*G0_0_1_8_0 - 0.00226736226736264*G0_0_1_8_1 - 0.00543329686186917*G0_0_1_8_2 - 0.0106750392464693*G0_0_1_8_3 + 0.0187355501641246*G0_0_1_8_4 + 0.00388944388944446*G0_0_1_8_5 + 0.00803387089101506*G0_0_1_8_6 + 0.033882308168028*G0_0_1_8_7 - 0.0640768755054573*G0_0_1_8_8 - 0.0768602825745811*G0_0_1_8_9 - 0.00594199451342401*G0_0_1_9_0 + 0.013129727415444*G0_0_1_9_1 - 0.0120590520590541*G0_0_1_9_2 - 0.0232681604110211*G0_0_1_9_3 + 0.0426316540602326*G0_0_1_9_4 + 0.0100470957613832*G0_0_1_9_5 + 0.0268988154702486*G0_0_1_9_6 + 0.0278121878121924*G0_0_1_9_7 - 0.0768602825745811*G0_0_1_9_8 + 0.102891394319984*G0_0_1_9_9 + 0.00376117709451114*G0_1_0_0_0 + 0.00237533189914185*G0_1_0_0_1 + 0.00073295311390563*G0_1_0_0_2 + 0.00547473690330931*G0_1_0_0_3 - 0.00147704147704174*G0_1_0_0_4 + 0.00475503332646278*G0_1_0_0_5 - 0.00324078038363811*G0_1_0_0_6 + 0.00339681482538685*G0_1_0_0_7 - 0.00296000296000347*G0_1_0_0_8 - 0.000299383156526028*G0_1_0_0_9 + 0.00237533189914185*G0_1_0_1_0 + 0.0452091118757866*G0_1_0_1_1 + 0.00564528945481424*G0_1_0_1_2 + 0.062136382136393*G0_1_0_1_3 - 0.024710104710109*G0_1_0_1_4 + 0.00265089407946594*G0_1_0_1_5 - 0.00236377379234562*G0_1_0_1_6 - 0.00654752654752773*G0_1_0_1_7 + 0.0135212935212959*G0_1_0_1_8 + 0.00674880674880796*G0_1_0_1_9 + 0.00073295311390563*G0_1_0_2_0 + 0.00564528945481424*G0_1_0_2_1 + 0.00287712287712336*G0_1_0_2_2 + 0.0102348445205606*G0_1_0_2_3 - 0.000801737944595251*G0_1_0_2_4 + 0.00223776223776263*G0_1_0_2_5 - 0.00118738404452711*G0_1_0_2_6 + 0.00121994407708713*G0_1_0_2_7 - 0.00172948744377342*G0_1_0_2_8 + 0.000882926597212479*G0_1_0_2_9 + 0.00547473690330931*G0_1_0_3_0 + 0.062136382136393*G0_1_0_3_1 + 0.0102348445205606*G0_1_0_3_2 + 0.24735264735269*G0_1_0_3_3 - 0.0582389039531998*G0_1_0_3_4 - 0.0103553589267892*G0_1_0_3_5 + 0.00342514628228966*G0_1_0_3_6 - 0.0200903858046751*G0_1_0_3_7 + 0.018568098568102*G0_1_0_3_8 + 0.0199343513629264*G0_1_0_3_9 - 0.00147704147704174*G0_1_0_4_0 - 0.024710104710109*G0_1_0_4_1 - 0.000801737944595252*G0_1_0_4_2 - 0.0582389039531998*G0_1_0_4_3 + 0.0119765948337397*G0_1_0_4_4 + 0.00076494933637802*G0_1_0_4_5 - 0.0041900956186677*G0_1_0_4_6 + 0.0022187336473055*G0_1_0_4_7 + 0.00152228723657309*G0_1_0_4_8 - 0.0041786784643935*G0_1_0_4_9 + 0.00475503332646278*G0_1_0_5_0 + 0.00265089407946594*G0_1_0_5_1 + 0.00223776223776263*G0_1_0_5_2 - 0.0103553589267892*G0_1_0_5_3 + 0.00076494933637802*G0_1_0_5_4 + 0.0511145996860371*G0_1_0_5_5 - 0.00643927501070473*G0_1_0_5_6 + 0.0189448646591536*G0_1_0_5_7 - 0.011618857333145*G0_1_0_5_8 + 0.0241358641358682*G0_1_0_5_9 - 0.00324078038363811*G0_1_0_6_0 - 0.00236377379234562*G0_1_0_6_1 - 0.00118738404452711*G0_1_0_6_2 + 0.00342514628228966*G0_1_0_6_3 - 0.0041900956186677*G0_1_0_6_4 - 0.00643927501070473*G0_1_0_6_5 - 0.004395604395605*G0_1_0_6_6 - 0.00732600732600857*G0_1_0_6_7 + 0.00797297940155215*G0_1_0_6_8 - 0.00949907235621676*G0_1_0_6_9 + 0.00339681482538685*G0_1_0_7_0 - 0.00654752654752773*G0_1_0_7_1 + 0.00121994407708713*G0_1_0_7_2 - 0.0200903858046751*G0_1_0_7_3 + 0.0022187336473055*G0_1_0_7_4 + 0.0189448646591536*G0_1_0_7_5 - 0.00732600732600857*G0_1_0_7_6 + 0.0140925740925765*G0_1_0_7_7 + 0.000243565957851686*G0_1_0_7_8 + 0.0155501641215953*G0_1_0_7_9 - 0.00296000296000347*G0_1_0_8_0 + 0.0135212935212959*G0_1_0_8_1 - 0.00172948744377342*G0_1_0_8_2 + 0.018568098568102*G0_1_0_8_3 + 0.00152228723657309*G0_1_0_8_4 - 0.011618857333145*G0_1_0_8_5 + 0.00797297940155215*G0_1_0_8_6 + 0.000243565957851686*G0_1_0_8_7 - 0.0359373959374021*G0_1_0_8_8 - 0.02329099471957*G0_1_0_8_9 - 0.000299383156526028*G0_1_0_9_0 + 0.00674880674880795*G0_1_0_9_1 + 0.000882926597212479*G0_1_0_9_2 + 0.0199343513629264*G0_1_0_9_3 - 0.0041786784643935*G0_1_0_9_4 + 0.0241358641358682*G0_1_0_9_5 - 0.00949907235621676*G0_1_0_9_6 + 0.0155501641215953*G0_1_0_9_7 - 0.02329099471957*G0_1_0_9_8 + 0.0346624803767724*G0_1_0_9_9 - 0.00288106954773688*G0_1_1_0_0 - 0.00259169402026589*G0_1_1_0_1 - 0.000412145174050006*G0_1_1_0_2 - 0.000887578030435276*G0_1_1_0_3 + 0.00159248159248184*G0_1_1_0_4 + 0.000433429004857604*G0_1_1_0_5 + 0.00487681630538853*G0_1_1_0_7 - 0.010192558763989*G0_1_1_0_8 - 0.00262340833769447*G0_1_1_0_9 - 0.00259169402026589*G0_1_1_1_0 + 0.00230161373018556*G0_1_1_1_2 + 0.0327021127021184*G0_1_1_1_3 - 0.0101350501350519*G0_1_1_1_4 + 0.00109139537710985*G0_1_1_1_5 - 0.000801315087029519*G0_1_1_1_6 + 0.0132608132608155*G0_1_1_1_7 - 0.0327021127021182*G0_1_1_1_8 - 0.0031257631257636*G0_1_1_1_9 - 0.000412145174050006*G0_1_1_2_0 + 0.00230161373018556*G0_1_1_2_1 + 0.00241310717501233*G0_1_1_2_2 + 0.00350379778951271*G0_1_1_2_3 + 0.00294435723007198*G0_1_1_2_4 + 0.000570857713714954*G0_1_1_2_5 + 0.00131297274154438*G0_1_1_2_6 + 0.00241197955483708*G0_1_1_2_7 - 0.00691583548726519*G0_1_1_2_8 - 0.00243565957851712*G0_1_1_2_9 - 0.000887578030435276*G0_1_1_3_0 + 0.0327021127021184*G0_1_1_3_1 + 0.00350379778951271*G0_1_1_3_2 + 0.175664335664366*G0_1_1_3_3 - 0.0305408876837502*G0_1_1_3_4 - 0.0023519337805056*G0_1_1_3_5 + 0.00649636078207612*G0_1_1_3_6 + 0.00675514961229346*G0_1_1_3_7 - 0.0315950715950766*G0_1_1_3_8 - 0.00413300984729606*G0_1_1_3_9 + 0.00159248159248184*G0_1_1_4_0 - 0.0101350501350519*G0_1_1_4_1 + 0.00294435723007198*G0_1_1_4_2 - 0.0305408876837502*G0_1_1_4_3 + 0.000548023405166346*G0_1_1_4_4 - 0.000685029256457944*G0_1_1_4_5 - 0.00581133152561818*G0_1_1_4_6 - 0.0080528994814722*G0_1_1_4_7 + 0.0248399219827832*G0_1_1_4_8 + 0.00867703724846724*G0_1_1_4_9 + 0.000433429004857604*G0_1_1_5_0 + 0.00109139537710985*G0_1_1_5_1 + 0.000570857713714954*G0_1_1_5_2 - 0.0023519337805056*G0_1_1_5_3 - 0.000685029256457943*G0_1_1_5_4 + 0.00997859283573735*G0_1_1_5_5 - 0.000867703724846739*G0_1_1_5_6 + 0.00232529375386556*G0_1_1_5_7 + 0.000818229389658101*G0_1_1_5_8 + 0.00623376623376725*G0_1_1_5_9 - 0.000801315087029519*G0_1_1_6_1 + 0.00131297274154438*G0_1_1_6_2 + 0.00649636078207612*G0_1_1_6_3 - 0.00581133152561818*G0_1_1_6_4 - 0.000867703724846739*G0_1_1_6_5 - 0.0117140002854308*G0_1_1_6_6 - 0.00314352314352365*G0_1_1_6_7 + 0.00952951810094823*G0_1_1_6_8 - 0.00568574282860087*G0_1_1_6_9 + 0.00487681630538853*G0_1_1_7_0 + 0.0132608132608155*G0_1_1_7_1 + 0.00241197955483708*G0_1_1_7_2 + 0.00675514961229347*G0_1_1_7_3 - 0.0080528994814722*G0_1_1_7_4 + 0.00232529375386556*G0_1_1_7_5 - 0.00314352314352365*G0_1_1_7_6 - 0.025178630892921*G0_1_1_7_7 + 0.0433813805242448*G0_1_1_7_8 + 0.0141572713001307*G0_1_1_7_9 - 0.010192558763989*G0_1_1_8_0 - 0.0327021127021182*G0_1_1_8_1 - 0.00691583548726519*G0_1_1_8_2 - 0.0315950715950767*G0_1_1_8_3 + 0.0248399219827832*G0_1_1_8_4 + 0.000818229389658101*G0_1_1_8_5 + 0.00952951810094823*G0_1_1_8_6 + 0.0433813805242448*G0_1_1_8_7 - 0.112474192474211*G0_1_1_8_8 - 0.0403025545882756*G0_1_1_8_9 - 0.00262340833769448*G0_1_1_9_0 - 0.0031257631257636*G0_1_1_9_1 - 0.00243565957851712*G0_1_1_9_2 - 0.00413300984729606*G0_1_1_9_3 + 0.00867703724846724*G0_1_1_9_4 + 0.00623376623376725*G0_1_1_9_5 - 0.00568574282860087*G0_1_1_9_6 + 0.0141572713001307*G0_1_1_9_7 - 0.0403025545882756*G0_1_1_9_8 - 0.00493221064649673*G0_1_1_9_9; + A[101] = A[171] - 0.088504088504104*G0_0_1_0_0 - 0.00111141063522037*G0_0_1_0_1 - 0.00303654017939785*G0_0_1_0_2 - 0.000241451670023107*G0_0_1_0_3 + 0.000324331752903238*G0_0_1_0_4 - 0.0311984311984366*G0_0_1_0_5 + 0.0125444925444947*G0_0_1_0_6 - 0.009294409294411*G0_0_1_0_7 + 0.00560624560624661*G0_0_1_0_8 + 0.000497280497280548*G0_0_1_0_9 - 0.00111141063522037*G0_0_1_1_0 + 0.00505173838507265*G0_0_1_1_1 + 0.000282045996331767*G0_0_1_1_2 + 0.00431568431568517*G0_0_1_1_3 - 0.00160474446188763*G0_0_1_1_4 + 0.00138993281850445*G0_0_1_1_5 + 0.000347166061451843*G0_0_1_1_6 + 0.000206777349634519*G0_0_1_1_7 + 0.00229104229104264*G0_0_1_1_8 + 0.00150452721881318*G0_0_1_1_9 - 0.00303654017939785*G0_0_1_2_0 + 0.000282045996331767*G0_0_1_2_1 + 0.000341668913097546*G0_0_1_2_2 + 0.000386068957497617*G0_0_1_2_3 - 0.000231725946011707*G0_0_1_2_4 - 0.00162165876451618*G0_0_1_2_5 - 0.00182336182336212*G0_0_1_2_6 + 0.000468949040377679*G0_0_1_2_7 - 0.0003175660318518*G0_0_1_2_8 - 0.00352916924345556*G0_0_1_2_9 - 0.000241451670023107*G0_0_1_3_0 + 0.00431568431568517*G0_0_1_3_1 + 0.000386068957497616*G0_0_1_3_2 + 0.00895866038723379*G0_0_1_3_3 - 0.0018305504019794*G0_0_1_3_4 - 0.00210456210456241*G0_0_1_3_5 - 0.000277817420674634*G0_0_1_3_6 + 0.00148803577375028*G0_0_1_3_7 - 0.00320441463298658*G0_0_1_3_8 - 0.00748965320394011*G0_0_1_3_9 + 0.000324331752903238*G0_0_1_4_0 - 0.00160474446188763*G0_0_1_4_1 - 0.000231725946011707*G0_0_1_4_2 - 0.0018305504019794*G0_0_1_4_3 + 0.00114932686361288*G0_0_1_4_4 - 0.000209314495028831*G0_0_1_4_5 + 0.000487131915703451*G0_0_1_4_6 - 0.00157176157176183*G0_0_1_4_7 + 0.0017163788592363*G0_0_1_4_8 + 0.0110061367204243*G0_0_1_4_9 - 0.0311984311984366*G0_0_1_5_0 + 0.00138993281850445*G0_0_1_5_1 - 0.00162165876451618*G0_0_1_5_2 - 0.00210456210456241*G0_0_1_5_3 - 0.000209314495028831*G0_0_1_5_4 + 0.0853546453546594*G0_0_1_5_5 + 0.0149222206365089*G0_0_1_5_6 + 0.00404928404928461*G0_0_1_5_7 - 0.00340611769183247*G0_0_1_5_8 + 0.0053203938918232*G0_0_1_5_9 + 0.0125444925444947*G0_0_1_6_0 + 0.000347166061451842*G0_0_1_6_1 - 0.00182336182336212*G0_0_1_6_2 - 0.000277817420674634*G0_0_1_6_3 + 0.000487131915703451*G0_0_1_6_4 + 0.0149222206365089*G0_0_1_6_5 - 0.00810617953475229*G0_0_1_6_6 - 0.000643166357452146*G0_0_1_6_7 - 0.000426240426240515*G0_0_1_6_8 + 0.011143142571716*G0_0_1_6_9 - 0.009294409294411*G0_0_1_7_0 + 0.000206777349634518*G0_0_1_7_1 + 0.00046894904037768*G0_0_1_7_2 + 0.00148803577375028*G0_0_1_7_3 - 0.00157176157176183*G0_0_1_7_4 + 0.00404928404928461*G0_0_1_7_5 - 0.000643166357452146*G0_0_1_7_6 + 0.0456077256077331*G0_0_1_7_7 - 0.00639741211169873*G0_0_1_7_8 - 0.000205508776937461*G0_0_1_7_9 + 0.00560624560624661*G0_0_1_8_0 + 0.00229104229104264*G0_0_1_8_1 - 0.0003175660318518*G0_0_1_8_2 - 0.00320441463298658*G0_0_1_8_3 + 0.00171637885923629*G0_0_1_8_4 - 0.00340611769183247*G0_0_1_8_5 - 0.000426240426240514*G0_0_1_8_6 - 0.00639741211169873*G0_0_1_8_7 - 0.00223015080158019*G0_0_1_8_8 - 0.00794633937491213*G0_0_1_8_9 + 0.000497280497280548*G0_0_1_9_0 + 0.00150452721881318*G0_0_1_9_1 - 0.00352916924345556*G0_0_1_9_2 - 0.0074896532039401*G0_0_1_9_3 + 0.0110061367204243*G0_0_1_9_4 + 0.0053203938918232*G0_0_1_9_5 + 0.011143142571716*G0_0_1_9_6 - 0.000205508776937457*G0_0_1_9_7 - 0.00794633937491214*G0_0_1_9_8 - 0.0287712287712337*G0_0_1_9_9 + 0.088504088504104*G0_1_0_0_0 + 0.00111141063522037*G0_1_0_0_1 + 0.00303654017939785*G0_1_0_0_2 + 0.000241451670023107*G0_1_0_0_3 - 0.000324331752903238*G0_1_0_0_4 + 0.0311984311984366*G0_1_0_0_5 - 0.0125444925444947*G0_1_0_0_6 + 0.009294409294411*G0_1_0_0_7 - 0.00560624560624661*G0_1_0_0_8 - 0.000497280497280548*G0_1_0_0_9 + 0.00111141063522037*G0_1_0_1_0 - 0.00505173838507265*G0_1_0_1_1 - 0.000282045996331767*G0_1_0_1_2 - 0.00431568431568517*G0_1_0_1_3 + 0.00160474446188763*G0_1_0_1_4 - 0.00138993281850445*G0_1_0_1_5 - 0.000347166061451843*G0_1_0_1_6 - 0.000206777349634518*G0_1_0_1_7 - 0.00229104229104264*G0_1_0_1_8 - 0.00150452721881318*G0_1_0_1_9 + 0.00303654017939785*G0_1_0_2_0 - 0.000282045996331767*G0_1_0_2_1 - 0.000341668913097546*G0_1_0_2_2 - 0.000386068957497616*G0_1_0_2_3 + 0.000231725946011707*G0_1_0_2_4 + 0.00162165876451618*G0_1_0_2_5 + 0.00182336182336212*G0_1_0_2_6 - 0.000468949040377679*G0_1_0_2_7 + 0.0003175660318518*G0_1_0_2_8 + 0.00352916924345556*G0_1_0_2_9 + 0.000241451670023107*G0_1_0_3_0 - 0.00431568431568517*G0_1_0_3_1 - 0.000386068957497616*G0_1_0_3_2 - 0.00895866038723377*G0_1_0_3_3 + 0.0018305504019794*G0_1_0_3_4 + 0.00210456210456241*G0_1_0_3_5 + 0.000277817420674634*G0_1_0_3_6 - 0.00148803577375028*G0_1_0_3_7 + 0.00320441463298658*G0_1_0_3_8 + 0.00748965320394011*G0_1_0_3_9 - 0.000324331752903238*G0_1_0_4_0 + 0.00160474446188763*G0_1_0_4_1 + 0.000231725946011707*G0_1_0_4_2 + 0.0018305504019794*G0_1_0_4_3 - 0.00114932686361288*G0_1_0_4_4 + 0.000209314495028831*G0_1_0_4_5 - 0.000487131915703452*G0_1_0_4_6 + 0.00157176157176183*G0_1_0_4_7 - 0.0017163788592363*G0_1_0_4_8 - 0.0110061367204243*G0_1_0_4_9 + 0.0311984311984366*G0_1_0_5_0 - 0.00138993281850445*G0_1_0_5_1 + 0.00162165876451618*G0_1_0_5_2 + 0.00210456210456241*G0_1_0_5_3 + 0.000209314495028831*G0_1_0_5_4 - 0.0853546453546594*G0_1_0_5_5 - 0.0149222206365089*G0_1_0_5_6 - 0.00404928404928461*G0_1_0_5_7 + 0.00340611769183247*G0_1_0_5_8 - 0.0053203938918232*G0_1_0_5_9 - 0.0125444925444947*G0_1_0_6_0 - 0.000347166061451842*G0_1_0_6_1 + 0.00182336182336212*G0_1_0_6_2 + 0.000277817420674634*G0_1_0_6_3 - 0.000487131915703452*G0_1_0_6_4 - 0.0149222206365089*G0_1_0_6_5 + 0.00810617953475229*G0_1_0_6_6 + 0.000643166357452146*G0_1_0_6_7 + 0.000426240426240515*G0_1_0_6_8 - 0.011143142571716*G0_1_0_6_9 + 0.009294409294411*G0_1_0_7_0 - 0.000206777349634518*G0_1_0_7_1 - 0.000468949040377679*G0_1_0_7_2 - 0.00148803577375028*G0_1_0_7_3 + 0.00157176157176183*G0_1_0_7_4 - 0.00404928404928461*G0_1_0_7_5 + 0.000643166357452145*G0_1_0_7_6 - 0.0456077256077331*G0_1_0_7_7 + 0.00639741211169873*G0_1_0_7_8 + 0.000205508776937461*G0_1_0_7_9 - 0.00560624560624661*G0_1_0_8_0 - 0.00229104229104264*G0_1_0_8_1 + 0.0003175660318518*G0_1_0_8_2 + 0.00320441463298658*G0_1_0_8_3 - 0.0017163788592363*G0_1_0_8_4 + 0.00340611769183247*G0_1_0_8_5 + 0.000426240426240515*G0_1_0_8_6 + 0.00639741211169873*G0_1_0_8_7 + 0.00223015080158019*G0_1_0_8_8 + 0.00794633937491213*G0_1_0_8_9 - 0.000497280497280548*G0_1_0_9_0 - 0.00150452721881318*G0_1_0_9_1 + 0.00352916924345556*G0_1_0_9_2 + 0.00748965320394011*G0_1_0_9_3 - 0.0110061367204243*G0_1_0_9_4 - 0.0053203938918232*G0_1_0_9_5 - 0.011143142571716*G0_1_0_9_6 + 0.000205508776937457*G0_1_0_9_7 + 0.00794633937491214*G0_1_0_9_8 + 0.0287712287712337*G0_1_0_9_9; + A[129] = A[101] + 0.023916823916828*G0_0_0_0_0 + 0.000797227463894266*G0_0_0_0_1 + 0.00260282926949637*G0_0_0_0_2 - 0.00182336182336214*G0_0_0_0_3 + 0.0393384393384461*G0_0_0_0_5 - 0.0175824175824206*G0_0_0_0_6 + 0.00577200577200677*G0_0_0_0_7 - 0.00500832500832586*G0_0_0_0_8 + 0.00376512376512443*G0_0_0_0_9 + 0.000797227463894266*G0_0_0_1_0 - 0.00453528834481293*G0_0_0_1_1 - 0.00060299488870929*G0_0_0_1_2 - 0.0059715945430242*G0_0_0_1_3 + 0.00329152329152387*G0_0_0_1_4 + 0.00273335130478032*G0_0_0_1_5 - 0.000263017405874599*G0_0_0_1_6 - 0.00244919102062001*G0_0_0_1_7 - 0.000148000148000143*G0_0_0_1_8 - 0.00239506525220853*G0_0_0_1_9 + 0.00260282926949637*G0_0_0_2_0 - 0.00060299488870929*G0_0_0_2_1 - 0.00101824101824138*G0_0_0_2_2 - 0.00230034515748838*G0_0_0_2_3 + 0.00334734049019813*G0_0_0_2_4 + 0.00820681963539252*G0_0_0_2_5 - 0.0092436663865252*G0_0_0_2_6 - 0.00126265269122433*G0_0_0_2_7 - 0.000460914746629114*G0_0_0_2_8 - 0.00583543440686398*G0_0_0_2_9 - 0.00182336182336214*G0_0_0_3_0 - 0.0059715945430242*G0_0_0_3_1 - 0.00230034515748838*G0_0_0_3_2 - 0.0380419580419647*G0_0_0_3_3 + 0.00586841729698984*G0_0_0_3_4 - 0.00248132819561429*G0_0_0_3_5 + 0.00302174016459784*G0_0_0_3_6 + 0.00770277341706045*G0_0_0_3_7 - 0.0113182056039218*G0_0_0_3_8 - 0.00822035107749532*G0_0_0_3_9 + 0.00329152329152387*G0_0_0_4_1 + 0.00334734049019813*G0_0_0_4_2 + 0.00586841729698984*G0_0_0_4_3 + 0.0245697159982915*G0_0_0_4_4 + 0.00210836782265391*G0_0_0_4_5 - 0.00513010798725176*G0_0_0_4_6 + 0.000715475001189411*G0_0_0_4_7 + 0.00361543218686138*G0_0_0_4_8 + 0.0132895675752841*G0_0_0_4_9 + 0.0393384393384461*G0_0_0_5_0 + 0.00273335130478032*G0_0_0_5_1 + 0.00820681963539252*G0_0_0_5_2 - 0.00248132819561428*G0_0_0_5_3 + 0.00210836782265391*G0_0_0_5_4 + 0.21407925407929*G0_0_0_5_5 - 0.0184881784881816*G0_0_0_5_6 - 0.00596736596736694*G0_0_0_5_8 + 0.000639360639360704*G0_0_0_5_9 - 0.0175824175824206*G0_0_0_6_0 - 0.000263017405874599*G0_0_0_6_1 - 0.0092436663865252*G0_0_0_6_2 + 0.00302174016459784*G0_0_0_6_3 - 0.00513010798725176*G0_0_0_6_4 - 0.0184881784881816*G0_0_0_6_5 - 0.00855525426954153*G0_0_0_6_6 + 0.00602064602064703*G0_0_0_6_7 + 0.0114628228913963*G0_0_0_6_9 + 0.00577200577200677*G0_0_0_7_0 - 0.00244919102062001*G0_0_0_7_1 - 0.00126265269122433*G0_0_0_7_2 + 0.00770277341706045*G0_0_0_7_3 + 0.000715475001189411*G0_0_0_7_4 + 0.00602064602064703*G0_0_0_7_6 - 0.0349517149517208*G0_0_0_7_7 + 0.0187545787545819*G0_0_0_7_8 - 0.0233366633366673*G0_0_0_7_9 - 0.00500832500832586*G0_0_0_8_0 - 0.000148000148000143*G0_0_0_8_1 - 0.000460914746629114*G0_0_0_8_2 - 0.0113182056039218*G0_0_0_8_3 + 0.00361543218686138*G0_0_0_8_4 - 0.00596736596736694*G0_0_0_8_5 + 0.0187545787545819*G0_0_0_8_7 - 0.0187850244993135*G0_0_0_8_8 + 0.00376512376512443*G0_0_0_9_0 - 0.00239506525220853*G0_0_0_9_1 - 0.00583543440686398*G0_0_0_9_2 - 0.00822035107749532*G0_0_0_9_3 + 0.0132895675752841*G0_0_0_9_4 + 0.000639360639360705*G0_0_0_9_5 + 0.0114628228913963*G0_0_0_9_6 - 0.0233366633366673*G0_0_0_9_7 - 0.0465819894391402*G0_0_0_9_9 - 0.00118230975373853*G0_0_1_0_3 + 0.00118230975373854*G0_0_1_0_4 - 0.000325600325600425*G0_0_1_0_5 + 0.000544640544640644*G0_0_1_0_6 + 0.000325600325600347*G0_0_1_0_7 - 0.000544640544640598*G0_0_1_0_8 - 0.00478336478336557*G0_0_1_1_1 - 0.00786684215255785*G0_0_1_1_3 + 0.00452457595314818*G0_0_1_1_4 - 0.00101993244850405*G0_0_1_1_5 + 0.000276548847977463*G0_0_1_1_6 + 0.000986103843246828*G0_0_1_1_7 - 0.001439407153693*G0_0_1_1_8 - 0.00117723546294995*G0_0_1_1_9 + 0.00478336478336549*G0_0_1_2_2 - 0.00452457595314817*G0_0_1_2_3 + 0.0078668421525578*G0_0_1_2_4 - 0.000986103843246848*G0_0_1_2_5 + 0.00143940715369305*G0_0_1_2_6 + 0.00101993244850404*G0_0_1_2_7 - 0.000276548847977457*G0_0_1_2_8 + 0.00117723546294995*G0_0_1_2_9 - 0.00118230975373853*G0_0_1_3_0 - 0.00786684215255785*G0_0_1_3_1 - 0.00452457595314817*G0_0_1_3_2 - 0.0394576851719779*G0_0_1_3_3 + 0.00330336330336385*G0_0_1_3_5 - 0.000829646543932385*G0_0_1_3_6 + 0.00354692926121559*G0_0_1_3_7 - 0.00437657580514797*G0_0_1_3_8 - 0.00356215213358137*G0_0_1_3_9 + 0.00118230975373854*G0_0_1_4_0 + 0.00452457595314818*G0_0_1_4_1 + 0.0078668421525578*G0_0_1_4_2 + 0.0394576851719778*G0_0_1_4_4 - 0.00354692926121558*G0_0_1_4_5 + 0.00437657580514797*G0_0_1_4_6 - 0.00330336330336386*G0_0_1_4_7 + 0.000829646543932376*G0_0_1_4_8 + 0.00356215213358132*G0_0_1_4_9 - 0.000325600325600425*G0_0_1_5_0 - 0.00101993244850405*G0_0_1_5_1 - 0.000986103843246848*G0_0_1_5_2 + 0.00330336330336385*G0_0_1_5_3 - 0.00354692926121558*G0_0_1_5_4 - 0.0168364968364997*G0_0_1_5_5 + 0.000768755054469545*G0_0_1_5_6 + 0.00305979734551214*G0_0_1_5_8 - 0.00611959469102425*G0_0_1_5_9 + 0.000544640544640643*G0_0_1_6_0 + 0.000276548847977463*G0_0_1_6_1 + 0.00143940715369305*G0_0_1_6_2 - 0.000829646543932385*G0_0_1_6_3 + 0.00437657580514797*G0_0_1_6_4 + 0.000768755054469545*G0_0_1_6_5 - 0.000258788830217592*G0_0_1_6_6 - 0.00305979734551212*G0_0_1_6_7 - 0.00187241330098508*G0_0_1_6_9 + 0.000325600325600347*G0_0_1_7_0 + 0.000986103843246828*G0_0_1_7_1 + 0.00101993244850404*G0_0_1_7_2 + 0.00354692926121559*G0_0_1_7_3 - 0.00330336330336385*G0_0_1_7_4 - 0.00305979734551212*G0_0_1_7_6 + 0.0168364968364995*G0_0_1_7_7 - 0.000768755054469579*G0_0_1_7_8 + 0.00611959469102429*G0_0_1_7_9 - 0.000544640544640598*G0_0_1_8_0 - 0.001439407153693*G0_0_1_8_1 - 0.000276548847977457*G0_0_1_8_2 - 0.00437657580514797*G0_0_1_8_3 + 0.000829646543932376*G0_0_1_8_4 + 0.00305979734551214*G0_0_1_8_5 - 0.000768755054469579*G0_0_1_8_7 + 0.000258788830217863*G0_0_1_8_8 + 0.00187241330098507*G0_0_1_8_9 - 0.00117723546294995*G0_0_1_9_1 + 0.00117723546294995*G0_0_1_9_2 - 0.00356215213358137*G0_0_1_9_3 + 0.00356215213358132*G0_0_1_9_4 - 0.00611959469102425*G0_0_1_9_5 - 0.00187241330098508*G0_0_1_9_6 + 0.00611959469102429*G0_0_1_9_7 + 0.00187241330098507*G0_0_1_9_8 + 0.00185549899835645*G0_1_0_0_1 - 0.00185549899835648*G0_1_0_0_2 - 0.00174809317666491*G0_1_0_0_3 + 0.00174809317666492*G0_1_0_0_4 - 0.0222296222296262*G0_1_0_0_5 + 0.00748288748288883*G0_1_0_0_6 + 0.0222296222296259*G0_1_0_0_7 - 0.0074828874828887*G0_1_0_0_8 + 0.00185549899835645*G0_1_0_1_0 - 0.003319431890861*G0_1_0_1_3 + 0.00253376253376295*G0_1_0_1_4 + 0.000941280941281104*G0_1_0_1_6 + 0.00281453995739755*G0_1_0_1_7 + 0.00267499696071174*G0_1_0_1_8 + 0.00385646099931879*G0_1_0_1_9 - 0.00185549899835648*G0_1_0_2_0 - 0.00253376253376293*G0_1_0_2_3 + 0.00331943189086097*G0_1_0_2_4 - 0.00281453995739757*G0_1_0_2_5 - 0.00267499696071173*G0_1_0_2_6 - 0.000941280941281092*G0_1_0_2_8 - 0.00385646099931881*G0_1_0_2_9 - 0.00174809317666491*G0_1_0_3_0 - 0.003319431890861*G0_1_0_3_1 - 0.00253376253376293*G0_1_0_3_2 - 0.0316483516483568*G0_1_0_3_3 + 0.00277056277056326*G0_1_0_3_5 - 0.0028238428238433*G0_1_0_3_6 + 0.00524427952999468*G0_1_0_3_7 - 0.00806812235383796*G0_1_0_3_8 - 0.0220579420579457*G0_1_0_3_9 + 0.00174809317666492*G0_1_0_4_0 + 0.00253376253376295*G0_1_0_4_1 + 0.00331943189086097*G0_1_0_4_2 + 0.0316483516483571*G0_1_0_4_4 - 0.0052442795299947*G0_1_0_4_5 + 0.008068122353838*G0_1_0_4_6 - 0.00277056277056323*G0_1_0_4_7 + 0.00282384282384328*G0_1_0_4_8 + 0.0220579420579458*G0_1_0_4_9 - 0.0222296222296262*G0_1_0_5_0 - 0.00281453995739757*G0_1_0_5_2 + 0.00277056277056326*G0_1_0_5_3 - 0.0052442795299947*G0_1_0_5_4 + 0.0229104229104264*G0_1_0_5_5 + 0.0220883878026773*G0_1_0_5_6 + 0.000296846011131841*G0_1_0_5_8 - 0.000593692022263693*G0_1_0_5_9 + 0.00748288748288884*G0_1_0_6_0 + 0.000941280941281104*G0_1_0_6_1 - 0.00267499696071173*G0_1_0_6_2 - 0.0028238428238433*G0_1_0_6_3 + 0.008068122353838*G0_1_0_6_4 + 0.0220883878026773*G0_1_0_6_5 - 0.00613481756339007*G0_1_0_6_6 - 0.000296846011131746*G0_1_0_6_7 + 0.017217068645643*G0_1_0_6_9 + 0.0222296222296259*G0_1_0_7_0 + 0.00281453995739755*G0_1_0_7_1 + 0.00524427952999468*G0_1_0_7_3 - 0.00277056277056323*G0_1_0_7_4 - 0.000296846011131746*G0_1_0_7_6 - 0.0229104229104269*G0_1_0_7_7 - 0.0220883878026772*G0_1_0_7_8 + 0.000593692022263473*G0_1_0_7_9 - 0.0074828874828887*G0_1_0_8_0 + 0.00267499696071174*G0_1_0_8_1 - 0.000941280941281091*G0_1_0_8_2 - 0.00806812235383796*G0_1_0_8_3 + 0.00282384282384328*G0_1_0_8_4 + 0.000296846011131841*G0_1_0_8_5 - 0.0220883878026772*G0_1_0_8_7 + 0.00613481756339009*G0_1_0_8_8 - 0.0172170686456429*G0_1_0_8_9 + 0.00385646099931879*G0_1_0_9_1 - 0.0038564609993188*G0_1_0_9_2 - 0.0220579420579457*G0_1_0_9_3 + 0.0220579420579458*G0_1_0_9_4 - 0.00059369202226369*G0_1_0_9_5 + 0.017217068645643*G0_1_0_9_6 + 0.000593692022263475*G0_1_0_9_7 - 0.0172170686456429*G0_1_0_9_8 - 0.0239168239168277*G0_1_1_0_0 - 0.00260282926949636*G0_1_1_0_1 - 0.000797227463894255*G0_1_1_0_2 + 0.00182336182336213*G0_1_1_0_4 - 0.00577200577200667*G0_1_1_0_5 + 0.00500832500832581*G0_1_1_0_6 - 0.0393384393384459*G0_1_1_0_7 + 0.0175824175824205*G0_1_1_0_8 - 0.00376512376512441*G0_1_1_0_9 - 0.00260282926949636*G0_1_1_1_0 + 0.00101824101824126*G0_1_1_1_1 + 0.000602994888709283*G0_1_1_1_2 - 0.00334734049019817*G0_1_1_1_3 + 0.0023003451574884*G0_1_1_1_4 + 0.00126265269122433*G0_1_1_1_5 + 0.000460914746629111*G0_1_1_1_6 - 0.00820681963539248*G0_1_1_1_7 + 0.00924366638652518*G0_1_1_1_8 + 0.00583543440686398*G0_1_1_1_9 - 0.000797227463894255*G0_1_1_2_0 + 0.000602994888709283*G0_1_1_2_1 + 0.00453528834481285*G0_1_1_2_2 - 0.00329152329152385*G0_1_1_2_3 + 0.00597159454302414*G0_1_1_2_4 + 0.00244919102062003*G0_1_1_2_5 + 0.000148000148000139*G0_1_1_2_6 - 0.00273335130478033*G0_1_1_2_7 + 0.000263017405874597*G0_1_1_2_8 + 0.00239506525220852*G0_1_1_2_9 - 0.00334734049019817*G0_1_1_3_1 - 0.00329152329152385*G0_1_1_3_2 - 0.0245697159982914*G0_1_1_3_3 - 0.00586841729698979*G0_1_1_3_4 - 0.000715475001189412*G0_1_1_3_5 - 0.00361543218686137*G0_1_1_3_6 - 0.00210836782265386*G0_1_1_3_7 + 0.00513010798725176*G0_1_1_3_8 - 0.0132895675752841*G0_1_1_3_9 + 0.00182336182336213*G0_1_1_4_0 + 0.0023003451574884*G0_1_1_4_1 + 0.00597159454302414*G0_1_1_4_2 - 0.00586841729698979*G0_1_1_4_3 + 0.0380419580419647*G0_1_1_4_4 - 0.00770277341706045*G0_1_1_4_5 + 0.0113182056039218*G0_1_1_4_6 + 0.00248132819561432*G0_1_1_4_7 - 0.00302174016459785*G0_1_1_4_8 + 0.00822035107749531*G0_1_1_4_9 - 0.00577200577200667*G0_1_1_5_0 + 0.00126265269122433*G0_1_1_5_1 + 0.00244919102062003*G0_1_1_5_2 - 0.000715475001189411*G0_1_1_5_3 - 0.00770277341706045*G0_1_1_5_4 + 0.0349517149517209*G0_1_1_5_5 - 0.0187545787545819*G0_1_1_5_6 - 0.00602064602064708*G0_1_1_5_8 + 0.0233366633366673*G0_1_1_5_9 + 0.00500832500832581*G0_1_1_6_0 + 0.000460914746629111*G0_1_1_6_1 + 0.000148000148000139*G0_1_1_6_2 - 0.00361543218686137*G0_1_1_6_3 + 0.0113182056039218*G0_1_1_6_4 - 0.0187545787545819*G0_1_1_6_5 + 0.0187850244993134*G0_1_1_6_6 + 0.00596736596736694*G0_1_1_6_7 - 0.0393384393384459*G0_1_1_7_0 - 0.00820681963539248*G0_1_1_7_1 - 0.00273335130478033*G0_1_1_7_2 - 0.00210836782265386*G0_1_1_7_3 + 0.00248132819561432*G0_1_1_7_4 + 0.00596736596736693*G0_1_1_7_6 - 0.21407925407929*G0_1_1_7_7 + 0.0184881784881815*G0_1_1_7_8 - 0.00063936063936082*G0_1_1_7_9 + 0.0175824175824205*G0_1_1_8_0 + 0.00924366638652518*G0_1_1_8_1 + 0.000263017405874597*G0_1_1_8_2 + 0.00513010798725176*G0_1_1_8_3 - 0.00302174016459784*G0_1_1_8_4 - 0.00602064602064708*G0_1_1_8_5 + 0.0184881784881815*G0_1_1_8_7 + 0.00855525426954175*G0_1_1_8_8 - 0.0114628228913962*G0_1_1_8_9 - 0.00376512376512441*G0_1_1_9_0 + 0.00583543440686398*G0_1_1_9_1 + 0.00239506525220852*G0_1_1_9_2 - 0.0132895675752841*G0_1_1_9_3 + 0.00822035107749531*G0_1_1_9_4 + 0.0233366633366673*G0_1_1_9_5 - 0.000639360639360819*G0_1_1_9_7 - 0.0114628228913962*G0_1_1_9_8 + 0.0465819894391402*G0_1_1_9_9; + A[143] = A[129] + 0.0885040885041037*G0_0_1_0_0 + 0.00303654017939785*G0_0_1_0_1 + 0.00111141063522034*G0_0_1_0_2 - 0.000324331752903269*G0_0_1_0_3 + 0.000241451670023142*G0_0_1_0_4 + 0.00929440929441085*G0_0_1_0_5 - 0.00560624560624655*G0_0_1_0_6 + 0.0311984311984365*G0_0_1_0_7 - 0.0125444925444947*G0_0_1_0_8 - 0.000497280497280527*G0_0_1_0_9 + 0.00303654017939785*G0_0_1_1_0 - 0.000341668913097614*G0_0_1_1_1 - 0.000282045996331767*G0_0_1_1_2 + 0.000231725946011682*G0_0_1_1_3 - 0.000386068957497599*G0_0_1_1_4 - 0.000468949040377685*G0_0_1_1_5 + 0.000317566031851799*G0_0_1_1_6 + 0.0016216587645162*G0_0_1_1_7 + 0.0018233618233621*G0_0_1_1_8 + 0.00352916924345555*G0_0_1_1_9 + 0.00111141063522034*G0_0_1_2_0 - 0.000282045996331767*G0_0_1_2_1 - 0.00505173838507262*G0_0_1_2_2 + 0.00160474446188762*G0_0_1_2_3 - 0.00431568431568512*G0_0_1_2_4 - 0.000206777349634536*G0_0_1_2_5 - 0.00229104229104266*G0_0_1_2_6 - 0.00138993281850447*G0_0_1_2_7 - 0.000347166061451834*G0_0_1_2_8 - 0.00150452721881319*G0_0_1_2_9 - 0.000324331752903269*G0_0_1_3_0 + 0.000231725946011682*G0_0_1_3_1 + 0.00160474446188762*G0_0_1_3_2 - 0.00114932686361272*G0_0_1_3_3 + 0.00183055040197935*G0_0_1_3_4 + 0.00157176157176182*G0_0_1_3_5 - 0.00171637885923628*G0_0_1_3_6 + 0.000209314495028818*G0_0_1_3_7 - 0.000487131915703413*G0_0_1_3_8 - 0.0110061367204243*G0_0_1_3_9 + 0.000241451670023142*G0_0_1_4_0 - 0.000386068957497599*G0_0_1_4_1 - 0.00431568431568512*G0_0_1_4_2 + 0.00183055040197936*G0_0_1_4_3 - 0.00895866038723356*G0_0_1_4_4 - 0.00148803577375029*G0_0_1_4_5 + 0.00320441463298658*G0_0_1_4_6 + 0.00210456210456245*G0_0_1_4_7 + 0.000277817420674609*G0_0_1_4_8 + 0.00748965320394017*G0_0_1_4_9 + 0.00929440929441085*G0_0_1_5_0 - 0.000468949040377685*G0_0_1_5_1 - 0.000206777349634536*G0_0_1_5_2 + 0.00157176157176182*G0_0_1_5_3 - 0.00148803577375029*G0_0_1_5_4 - 0.0456077256077333*G0_0_1_5_5 + 0.00639741211169889*G0_0_1_5_6 - 0.00404928404928471*G0_0_1_5_7 + 0.000643166357452175*G0_0_1_5_8 + 0.000205508776937357*G0_0_1_5_9 - 0.00560624560624655*G0_0_1_6_0 + 0.000317566031851799*G0_0_1_6_1 - 0.00229104229104266*G0_0_1_6_2 - 0.00171637885923628*G0_0_1_6_3 + 0.00320441463298658*G0_0_1_6_4 + 0.00639741211169889*G0_0_1_6_5 + 0.00223015080157981*G0_0_1_6_6 + 0.00340611769183252*G0_0_1_6_7 + 0.000426240426240499*G0_0_1_6_8 + 0.00794633937491216*G0_0_1_6_9 + 0.0311984311984365*G0_0_1_7_0 + 0.0016216587645162*G0_0_1_7_1 - 0.00138993281850447*G0_0_1_7_2 + 0.000209314495028818*G0_0_1_7_3 + 0.00210456210456245*G0_0_1_7_4 - 0.00404928404928471*G0_0_1_7_5 + 0.00340611769183252*G0_0_1_7_6 - 0.0853546453546595*G0_0_1_7_7 - 0.0149222206365089*G0_0_1_7_8 - 0.00532039389182336*G0_0_1_7_9 - 0.0125444925444947*G0_0_1_8_0 + 0.0018233618233621*G0_0_1_8_1 - 0.000347166061451834*G0_0_1_8_2 - 0.000487131915703414*G0_0_1_8_3 + 0.000277817420674608*G0_0_1_8_4 + 0.000643166357452176*G0_0_1_8_5 + 0.000426240426240499*G0_0_1_8_6 - 0.0149222206365089*G0_0_1_8_7 + 0.00810617953475241*G0_0_1_8_8 - 0.0111431425717159*G0_0_1_8_9 - 0.000497280497280527*G0_0_1_9_0 + 0.00352916924345555*G0_0_1_9_1 - 0.00150452721881319*G0_0_1_9_2 - 0.0110061367204243*G0_0_1_9_3 + 0.00748965320394017*G0_0_1_9_4 + 0.000205508776937357*G0_0_1_9_5 + 0.00794633937491216*G0_0_1_9_6 - 0.00532039389182336*G0_0_1_9_7 - 0.0111431425717159*G0_0_1_9_8 + 0.0287712287712337*G0_0_1_9_9 - 0.0885040885041037*G0_1_0_0_0 - 0.00303654017939785*G0_1_0_0_1 - 0.00111141063522034*G0_1_0_0_2 + 0.000324331752903269*G0_1_0_0_3 - 0.000241451670023142*G0_1_0_0_4 - 0.00929440929441085*G0_1_0_0_5 + 0.00560624560624655*G0_1_0_0_6 - 0.0311984311984365*G0_1_0_0_7 + 0.0125444925444947*G0_1_0_0_8 + 0.000497280497280528*G0_1_0_0_9 - 0.00303654017939785*G0_1_0_1_0 + 0.000341668913097614*G0_1_0_1_1 + 0.000282045996331767*G0_1_0_1_2 - 0.000231725946011682*G0_1_0_1_3 + 0.000386068957497599*G0_1_0_1_4 + 0.000468949040377685*G0_1_0_1_5 - 0.000317566031851798*G0_1_0_1_6 - 0.0016216587645162*G0_1_0_1_7 - 0.0018233618233621*G0_1_0_1_8 - 0.00352916924345555*G0_1_0_1_9 - 0.00111141063522034*G0_1_0_2_0 + 0.000282045996331767*G0_1_0_2_1 + 0.00505173838507262*G0_1_0_2_2 - 0.00160474446188762*G0_1_0_2_3 + 0.00431568431568512*G0_1_0_2_4 + 0.000206777349634536*G0_1_0_2_5 + 0.00229104229104266*G0_1_0_2_6 + 0.00138993281850447*G0_1_0_2_7 + 0.000347166061451834*G0_1_0_2_8 + 0.00150452721881319*G0_1_0_2_9 + 0.000324331752903269*G0_1_0_3_0 - 0.000231725946011682*G0_1_0_3_1 - 0.00160474446188762*G0_1_0_3_2 + 0.00114932686361272*G0_1_0_3_3 - 0.00183055040197935*G0_1_0_3_4 - 0.00157176157176182*G0_1_0_3_5 + 0.00171637885923628*G0_1_0_3_6 - 0.000209314495028818*G0_1_0_3_7 + 0.000487131915703413*G0_1_0_3_8 + 0.0110061367204243*G0_1_0_3_9 - 0.000241451670023142*G0_1_0_4_0 + 0.000386068957497599*G0_1_0_4_1 + 0.00431568431568512*G0_1_0_4_2 - 0.00183055040197935*G0_1_0_4_3 + 0.00895866038723356*G0_1_0_4_4 + 0.00148803577375029*G0_1_0_4_5 - 0.00320441463298658*G0_1_0_4_6 - 0.00210456210456245*G0_1_0_4_7 - 0.000277817420674609*G0_1_0_4_8 - 0.00748965320394017*G0_1_0_4_9 - 0.00929440929441085*G0_1_0_5_0 + 0.000468949040377685*G0_1_0_5_1 + 0.000206777349634536*G0_1_0_5_2 - 0.00157176157176182*G0_1_0_5_3 + 0.00148803577375029*G0_1_0_5_4 + 0.0456077256077333*G0_1_0_5_5 - 0.00639741211169889*G0_1_0_5_6 + 0.00404928404928471*G0_1_0_5_7 - 0.000643166357452175*G0_1_0_5_8 - 0.000205508776937361*G0_1_0_5_9 + 0.00560624560624655*G0_1_0_6_0 - 0.000317566031851798*G0_1_0_6_1 + 0.00229104229104266*G0_1_0_6_2 + 0.00171637885923628*G0_1_0_6_3 - 0.00320441463298658*G0_1_0_6_4 - 0.00639741211169889*G0_1_0_6_5 - 0.00223015080157981*G0_1_0_6_6 - 0.00340611769183252*G0_1_0_6_7 - 0.0004262404262405*G0_1_0_6_8 - 0.00794633937491216*G0_1_0_6_9 - 0.0311984311984365*G0_1_0_7_0 - 0.0016216587645162*G0_1_0_7_1 + 0.00138993281850447*G0_1_0_7_2 - 0.000209314495028818*G0_1_0_7_3 - 0.00210456210456245*G0_1_0_7_4 + 0.00404928404928471*G0_1_0_7_5 - 0.00340611769183252*G0_1_0_7_6 + 0.0853546453546595*G0_1_0_7_7 + 0.0149222206365089*G0_1_0_7_8 + 0.00532039389182335*G0_1_0_7_9 + 0.0125444925444947*G0_1_0_8_0 - 0.0018233618233621*G0_1_0_8_1 + 0.000347166061451834*G0_1_0_8_2 + 0.000487131915703414*G0_1_0_8_3 - 0.000277817420674608*G0_1_0_8_4 - 0.000643166357452175*G0_1_0_8_5 - 0.000426240426240499*G0_1_0_8_6 + 0.0149222206365089*G0_1_0_8_7 - 0.00810617953475241*G0_1_0_8_8 + 0.0111431425717159*G0_1_0_8_9 + 0.000497280497280528*G0_1_0_9_0 - 0.00352916924345555*G0_1_0_9_1 + 0.00150452721881319*G0_1_0_9_2 + 0.0110061367204243*G0_1_0_9_3 - 0.00748965320394017*G0_1_0_9_4 - 0.00020550877693736*G0_1_0_9_5 - 0.00794633937491216*G0_1_0_9_6 + 0.00532039389182336*G0_1_0_9_7 + 0.0111431425717159*G0_1_0_9_8 - 0.0287712287712337*G0_1_0_9_9; + A[84] = -A[129] + 0.0935558268891762*G0_1_0_0_0 + 0.00349900540376791*G0_1_0_0_1 + 0.00156598251836372*G0_1_0_0_2 - 0.00119922405636715*G0_1_0_0_3 + 0.00110704110704131*G0_1_0_0_4 + 0.0109934509934528*G0_1_0_0_5 - 0.00540538826253201*G0_1_0_0_6 + 0.0361061161061222*G0_1_0_0_7 - 0.0124738753310203*G0_1_0_0_8 - 0.000662194947909273*G0_1_0_0_9 + 0.00349900540376791*G0_1_0_1_0 - 0.0223759309473636*G0_1_0_1_1 + 0.000180419228038297*G0_1_0_1_2 + 0.0026826083968945*G0_1_0_1_3 + 0.00178319035461926*G0_1_0_1_4 - 0.000402560402560464*G0_1_0_1_5 + 0.000383954669669025*G0_1_0_1_6 + 0.00379091807663304*G0_1_0_1_7 + 0.00427424427424491*G0_1_0_1_8 + 0.00931386074243374*G0_1_0_1_9 + 0.00156598251836372*G0_1_0_2_0 + 0.000180419228038297*G0_1_0_2_1 + 0.00167536167536198*G0_1_0_2_3 + 0.000592000592000654*G0_1_0_2_4 - 0.000592000592000721*G0_1_0_2_6 - 0.000524343381486324*G0_1_0_2_7 - 0.00122205836491571*G0_1_0_2_8 - 0.00166944166944196*G0_1_0_2_9 - 0.00119922405636715*G0_1_0_3_0 + 0.0026826083968945*G0_1_0_3_1 + 0.00167536167536198*G0_1_0_3_2 + 0.0304533561676473*G0_1_0_3_3 - 0.018640407211839*G0_1_0_3_4 + 0.00414823271966198*G0_1_0_3_5 - 0.0046429760715483*G0_1_0_3_6 + 0.000106560106560122*G0_1_0_3_7 - 0.000281623138765998*G0_1_0_3_8 - 0.0281547024404214*G0_1_0_3_9 + 0.00110704110704131*G0_1_0_4_0 + 0.00178319035461926*G0_1_0_4_1 + 0.000592000592000654*G0_1_0_4_2 - 0.018640407211839*G0_1_0_4_3 - 0.0340992340992397*G0_1_0_4_4 - 0.00681223538366514*G0_1_0_4_5 + 0.0114552114552134*G0_1_0_4_6 + 0.000871509442938145*G0_1_0_4_7 + 0.000175063032205897*G0_1_0_4_8 + 0.0186327957756561*G0_1_0_4_9 + 0.0109934509934528*G0_1_0_5_0 - 0.000402560402560464*G0_1_0_5_1 + 0.00414823271966199*G0_1_0_5_3 - 0.00681223538366514*G0_1_0_5_4 - 0.0366490652205*G0_1_0_5_5 - 0.00283145426002616*G0_1_0_5_6 + 0.00420151277294206*G0_1_0_5_7 - 0.00228343085485981*G0_1_0_5_8 + 0.00655344655344757*G0_1_0_5_9 - 0.00540538826253201*G0_1_0_6_0 + 0.000383954669669025*G0_1_0_6_1 - 0.000592000592000721*G0_1_0_6_2 - 0.0046429760715483*G0_1_0_6_3 + 0.0114552114552134*G0_1_0_6_4 - 0.00283145426002616*G0_1_0_6_5 + 0.0111888111888131*G0_1_0_6_6 - 0.00191808191808226*G0_1_0_6_7 + 0.00300271157414064*G0_1_0_6_8 + 0.0142942771514225*G0_1_0_6_9 + 0.0361061161061222*G0_1_0_7_0 + 0.00379091807663304*G0_1_0_7_1 - 0.000524343381486324*G0_1_0_7_2 + 0.000106560106560122*G0_1_0_7_3 + 0.000871509442938144*G0_1_0_7_4 + 0.00420151277294206*G0_1_0_7_5 - 0.00191808191808227*G0_1_0_7_6 - 0.110495219066666*G0_1_0_7_7 - 0.0353931782503271*G0_1_0_7_8 + 0.00582274867989246*G0_1_0_7_9 - 0.0124738753310203*G0_1_0_8_0 + 0.00427424427424491*G0_1_0_8_1 - 0.00122205836491571*G0_1_0_8_2 - 0.000281623138766*G0_1_0_8_3 + 0.000175063032205897*G0_1_0_8_4 - 0.00228343085485981*G0_1_0_8_5 + 0.00300271157414064*G0_1_0_8_6 - 0.0353931782503271*G0_1_0_8_7 + 0.0397088625660124*G0_1_0_8_8 - 0.028291708291713*G0_1_0_8_9 - 0.000662194947909272*G0_1_0_9_0 + 0.00931386074243374*G0_1_0_9_1 - 0.00166944166944196*G0_1_0_9_2 - 0.0281547024404214*G0_1_0_9_3 + 0.0186327957756561*G0_1_0_9_4 + 0.00655344655344756*G0_1_0_9_5 + 0.0142942771514225*G0_1_0_9_6 + 0.00582274867989245*G0_1_0_9_7 - 0.028291708291713*G0_1_0_9_8 + 0.0411017553874768*G0_1_0_9_9 - 0.032244298910971*G0_1_1_0_0 - 0.0044542406447176*G0_1_1_0_1 - 0.00149395577967031*G0_1_1_0_2 + 0.000182251610823096*G0_1_1_0_3 + 0.000595806310092107*G0_1_1_0_4 - 0.00976208976209138*G0_1_1_0_5 + 0.00710358424644258*G0_1_1_0_6 - 0.0500536500536585*G0_1_1_0_7 + 0.0234309605738217*G0_1_1_0_8 - 0.00733996162567716*G0_1_1_0_9 - 0.0044542406447176*G0_1_1_1_0 - 0.0248285048285093*G0_1_1_1_1 + 0.00239506525220847*G0_1_1_1_3 + 0.00139796711225308*G0_1_1_1_4 + 0.00198869913155661*G0_1_1_1_5 + 0.000359851788423281*G0_1_1_1_6 - 0.0063149548863845*G0_1_1_1_7 + 0.00570350284636089*G0_1_1_1_8 + 0.0105646734218181*G0_1_1_1_9 - 0.00149395577967032*G0_1_1_2_0 + 0.00284160284160324*G0_1_1_2_2 + 0.00179672179672212*G0_1_1_2_3 + 0.00118400118400136*G0_1_1_2_4 + 0.00358456358456421*G0_1_1_2_5 - 0.00109520109520131*G0_1_1_2_6 - 0.00416134130419913*G0_1_1_2_7 - 0.000426663283806214*G0_1_1_2_8 - 0.000230880230880274*G0_1_1_2_9 + 0.000182251610823096*G0_1_1_3_0 + 0.00239506525220847*G0_1_1_3_1 + 0.00179672179672212*G0_1_1_3_2 + 0.0350963322391957*G0_1_1_3_3 - 0.0176166690452435*G0_1_1_3_4 - 0.00250796822225434*G0_1_1_3_5 - 0.00257647114790017*G0_1_1_3_6 - 0.00204367061509947*G0_1_1_3_7 + 0.00226059654631123*G0_1_1_3_8 - 0.027606679035255*G0_1_1_3_9 + 0.000595806310092106*G0_1_1_4_0 + 0.00139796711225308*G0_1_1_4_1 + 0.00118400118400136*G0_1_1_4_2 - 0.0176166690452435*G0_1_1_4_3 - 0.05114885114886*G0_1_1_4_4 - 0.00328433471290669*G0_1_1_4_5 + 0.00586080586080684*G0_1_1_4_6 + 0.00609676038247568*G0_1_1_4_7 - 0.000216925931211684*G0_1_1_4_8 + 0.00726131011845417*G0_1_1_4_9 - 0.00976208976209138*G0_1_1_5_0 + 0.00198869913155662*G0_1_1_5_1 + 0.00358456358456421*G0_1_1_5_2 - 0.00250796822225434*G0_1_1_5_3 - 0.0032843347129067*G0_1_1_5_4 + 0.0496113410399208*G0_1_1_5_5 - 0.0207982493696815*G0_1_1_5_6 - 0.00352409495266694*G0_1_1_5_7 - 0.00746301317730016*G0_1_1_5_8 + 0.0369459112316317*G0_1_1_5_9 + 0.00710358424644258*G0_1_1_6_0 + 0.000359851788423281*G0_1_1_6_1 - 0.00109520109520131*G0_1_1_6_2 - 0.00257647114790017*G0_1_1_6_3 + 0.00586080586080684*G0_1_1_6_4 - 0.0207982493696815*G0_1_1_6_5 + 0.0202464202464237*G0_1_1_6_6 + 0.0109871081299671*G0_1_1_6_7 + 0.000848675134389564*G0_1_1_6_8 + 0.00584558298844116*G0_1_1_6_9 - 0.0500536500536585*G0_1_1_7_0 - 0.0063149548863845*G0_1_1_7_1 - 0.00416134130419913*G0_1_1_7_2 - 0.00204367061509947*G0_1_1_7_3 + 0.00609676038247568*G0_1_1_7_4 - 0.00352409495266695*G0_1_1_7_5 + 0.0109871081299671*G0_1_1_7_6 - 0.312373340944822*G0_1_1_7_7 + 0.0205622948480126*G0_1_1_7_8 + 0.0234309605738217*G0_1_1_8_0 + 0.00570350284636088*G0_1_1_8_1 - 0.000426663283806214*G0_1_1_8_2 + 0.00226059654631123*G0_1_1_8_3 - 0.000216925931211684*G0_1_1_8_4 - 0.00746301317730016*G0_1_1_8_5 + 0.000848675134389563*G0_1_1_8_6 + 0.0205622948480126*G0_1_1_8_7 + 0.0230398173255356*G0_1_1_8_8 - 0.0312601684030308*G0_1_1_8_9 - 0.00733996162567716*G0_1_1_9_0 + 0.0105646734218181*G0_1_1_9_1 - 0.000230880230880274*G0_1_1_9_2 - 0.027606679035255*G0_1_1_9_3 + 0.00726131011845418*G0_1_1_9_4 + 0.0369459112316317*G0_1_1_9_5 + 0.00584558298844116*G0_1_1_9_6 - 0.0312601684030308*G0_1_1_9_8 + 0.0454859426288075*G0_1_1_9_9; + A[93] = -A[101] - 0.0322442989109711*G0_0_0_0_0 - 0.00149395577967032*G0_0_0_0_1 - 0.00445424064471759*G0_0_0_0_2 + 0.000595806310092105*G0_0_0_0_3 + 0.000182251610823077*G0_0_0_0_4 - 0.0500536500536586*G0_0_0_0_5 + 0.0234309605738217*G0_0_0_0_6 - 0.00976208976209143*G0_0_0_0_7 + 0.0071035842464426*G0_0_0_0_8 - 0.0073399616256772*G0_0_0_0_9 - 0.00149395577967032*G0_0_0_1_0 + 0.00284160284160329*G0_0_0_1_1 + 0.00118400118400137*G0_0_0_1_3 + 0.00179672179672211*G0_0_0_1_4 - 0.00416134130419911*G0_0_0_1_5 - 0.000426663283806217*G0_0_0_1_6 + 0.0035845635845642*G0_0_0_1_7 - 0.00109520109520131*G0_0_0_1_8 - 0.00023088023088026*G0_0_0_1_9 - 0.00445424064471759*G0_0_0_2_0 - 0.0248285048285089*G0_0_0_2_2 + 0.00139796711225303*G0_0_0_2_3 + 0.00239506525220859*G0_0_0_2_4 - 0.00631495488638459*G0_0_0_2_5 + 0.00570350284636105*G0_0_0_2_6 + 0.00198869913155661*G0_0_0_2_7 + 0.00035985178842328*G0_0_0_2_8 + 0.0105646734218181*G0_0_0_2_9 + 0.000595806310092105*G0_0_0_3_0 + 0.00118400118400138*G0_0_0_3_1 + 0.00139796711225303*G0_0_0_3_2 - 0.0511488511488602*G0_0_0_3_3 - 0.0176166690452435*G0_0_0_3_4 + 0.00609676038247561*G0_0_0_3_5 - 0.000216925931211665*G0_0_0_3_6 - 0.00328433471290666*G0_0_0_3_7 + 0.00586080586080682*G0_0_0_3_8 + 0.00726131011845407*G0_0_0_3_9 + 0.000182251610823077*G0_0_0_4_0 + 0.00179672179672211*G0_0_0_4_1 + 0.00239506525220859*G0_0_0_4_2 - 0.0176166690452435*G0_0_0_4_3 + 0.0350963322391953*G0_0_0_4_4 - 0.00204367061509951*G0_0_0_4_5 + 0.00226059654631121*G0_0_0_4_6 - 0.00250796822225436*G0_0_0_4_7 - 0.00257647114790016*G0_0_0_4_8 - 0.0276066790352552*G0_0_0_4_9 - 0.0500536500536586*G0_0_0_5_0 - 0.00416134130419911*G0_0_0_5_1 - 0.00631495488638459*G0_0_0_5_2 + 0.00609676038247561*G0_0_0_5_3 - 0.00204367061509951*G0_0_0_5_4 - 0.312373340944822*G0_0_0_5_5 + 0.0205622948480126*G0_0_0_5_6 - 0.00352409495266687*G0_0_0_5_7 + 0.010987108129967*G0_0_0_5_8 + 0.0234309605738217*G0_0_0_6_0 - 0.000426663283806217*G0_0_0_6_1 + 0.00570350284636105*G0_0_0_6_2 - 0.000216925931211664*G0_0_0_6_3 + 0.00226059654631121*G0_0_0_6_4 + 0.0205622948480126*G0_0_0_6_5 + 0.0230398173255355*G0_0_0_6_6 - 0.00746301317730014*G0_0_0_6_7 + 0.000848675134389574*G0_0_0_6_8 - 0.0312601684030309*G0_0_0_6_9 - 0.00976208976209143*G0_0_0_7_0 + 0.0035845635845642*G0_0_0_7_1 + 0.00198869913155661*G0_0_0_7_2 - 0.00328433471290666*G0_0_0_7_3 - 0.00250796822225436*G0_0_0_7_4 - 0.00352409495266687*G0_0_0_7_5 - 0.00746301317730014*G0_0_0_7_6 + 0.0496113410399207*G0_0_0_7_7 - 0.0207982493696814*G0_0_0_7_8 + 0.0369459112316318*G0_0_0_7_9 + 0.0071035842464426*G0_0_0_8_0 - 0.00109520109520131*G0_0_0_8_1 + 0.00035985178842328*G0_0_0_8_2 + 0.00586080586080683*G0_0_0_8_3 - 0.00257647114790016*G0_0_0_8_4 + 0.010987108129967*G0_0_0_8_5 + 0.000848675134389574*G0_0_0_8_6 - 0.0207982493696814*G0_0_0_8_7 + 0.0202464202464239*G0_0_0_8_8 + 0.0058455829884411*G0_0_0_8_9 - 0.0073399616256772*G0_0_0_9_0 - 0.00023088023088026*G0_0_0_9_1 + 0.0105646734218181*G0_0_0_9_2 + 0.00726131011845407*G0_0_0_9_3 - 0.0276066790352552*G0_0_0_9_4 - 0.0312601684030309*G0_0_0_9_6 + 0.0369459112316318*G0_0_0_9_7 + 0.0058455829884411*G0_0_0_9_8 + 0.0454859426288075*G0_0_0_9_9 + 0.0935558268891767*G0_1_0_0_0 + 0.00156598251836375*G0_1_0_0_1 + 0.00349900540376792*G0_1_0_0_2 + 0.00110704110704127*G0_1_0_0_3 - 0.00119922405636712*G0_1_0_0_4 + 0.0361061161061224*G0_1_0_0_5 - 0.0124738753310204*G0_1_0_0_6 + 0.010993450993453*G0_1_0_0_7 - 0.00540538826253212*G0_1_0_0_8 - 0.000662194947909306*G0_1_0_0_9 + 0.00156598251836375*G0_1_0_1_0 + 0.000180419228038305*G0_1_0_1_2 + 0.000592000592000652*G0_1_0_1_3 + 0.00167536167536198*G0_1_0_1_4 - 0.000524343381486297*G0_1_0_1_5 - 0.00122205836491572*G0_1_0_1_6 - 0.000592000592000747*G0_1_0_1_8 - 0.00166944166944195*G0_1_0_1_9 + 0.00349900540376792*G0_1_0_2_0 + 0.000180419228038305*G0_1_0_2_1 - 0.0223759309473633*G0_1_0_2_2 + 0.00178319035461922*G0_1_0_2_3 + 0.0026826083968946*G0_1_0_2_4 + 0.00379091807663299*G0_1_0_2_5 + 0.00427424427424501*G0_1_0_2_6 - 0.00040256040256046*G0_1_0_2_7 + 0.000383954669669018*G0_1_0_2_8 + 0.00931386074243375*G0_1_0_2_9 + 0.00110704110704127*G0_1_0_3_0 + 0.000592000592000652*G0_1_0_3_1 + 0.00178319035461922*G0_1_0_3_2 - 0.03409923409924*G0_1_0_3_3 - 0.0186404072118389*G0_1_0_3_4 + 0.000871509442938077*G0_1_0_3_5 + 0.000175063032205943*G0_1_0_3_6 - 0.0068122353836651*G0_1_0_3_7 + 0.0114552114552134*G0_1_0_3_8 + 0.018632795775656*G0_1_0_3_9 - 0.00119922405636712*G0_1_0_4_0 + 0.00167536167536198*G0_1_0_4_1 + 0.0026826083968946*G0_1_0_4_2 - 0.0186404072118389*G0_1_0_4_3 + 0.0304533561676469*G0_1_0_4_4 + 0.000106560106560153*G0_1_0_4_5 - 0.000281623138766078*G0_1_0_4_6 + 0.00414823271966199*G0_1_0_4_7 - 0.00464297607154828*G0_1_0_4_8 - 0.0281547024404216*G0_1_0_4_9 + 0.0361061161061224*G0_1_0_5_0 - 0.000524343381486297*G0_1_0_5_1 + 0.00379091807663299*G0_1_0_5_2 + 0.000871509442938076*G0_1_0_5_3 + 0.000106560106560154*G0_1_0_5_4 - 0.110495219066666*G0_1_0_5_5 - 0.0353931782503271*G0_1_0_5_6 + 0.00420151277294219*G0_1_0_5_7 - 0.00191808191808234*G0_1_0_5_8 + 0.00582274867989271*G0_1_0_5_9 - 0.0124738753310204*G0_1_0_6_0 - 0.00122205836491572*G0_1_0_6_1 + 0.00427424427424501*G0_1_0_6_2 + 0.000175063032205943*G0_1_0_6_3 - 0.000281623138766076*G0_1_0_6_4 - 0.0353931782503271*G0_1_0_6_5 + 0.0397088625660121*G0_1_0_6_6 - 0.00228343085485984*G0_1_0_6_7 + 0.00300271157414068*G0_1_0_6_8 - 0.0282917082917132*G0_1_0_6_9 + 0.010993450993453*G0_1_0_7_0 - 0.00040256040256046*G0_1_0_7_2 - 0.0068122353836651*G0_1_0_7_3 + 0.00414823271966199*G0_1_0_7_4 + 0.00420151277294219*G0_1_0_7_5 - 0.00228343085485984*G0_1_0_7_6 - 0.0366490652204998*G0_1_0_7_7 - 0.00283145426002626*G0_1_0_7_8 + 0.00655344655344773*G0_1_0_7_9 - 0.00540538826253212*G0_1_0_8_0 - 0.000592000592000747*G0_1_0_8_1 + 0.000383954669669017*G0_1_0_8_2 + 0.0114552114552134*G0_1_0_8_3 - 0.00464297607154828*G0_1_0_8_4 - 0.00191808191808234*G0_1_0_8_5 + 0.00300271157414068*G0_1_0_8_6 - 0.00283145426002626*G0_1_0_8_7 + 0.0111888111888132*G0_1_0_8_8 + 0.0142942771514224*G0_1_0_8_9 - 0.000662194947909305*G0_1_0_9_0 - 0.00166944166944195*G0_1_0_9_1 + 0.00931386074243375*G0_1_0_9_2 + 0.018632795775656*G0_1_0_9_3 - 0.0281547024404216*G0_1_0_9_4 + 0.0058227486798927*G0_1_0_9_5 - 0.0282917082917132*G0_1_0_9_6 + 0.00655344655344772*G0_1_0_9_7 + 0.0142942771514224*G0_1_0_9_8 + 0.0411017553874767*G0_1_0_9_9; + A[177] = -A[57] + 0.0459708193041605*G0_0_0_0_0 + 0.00147718242956362*G0_0_0_0_1 + 0.00411553173458006*G0_0_0_0_2 + 0.000745920745920912*G0_0_0_0_3 + 0.00395033537890748*G0_0_0_0_4 + 0.0641618698761666*G0_0_0_0_5 - 0.0331807874665074*G0_0_0_0_6 + 0.013236287522004*G0_0_0_0_7 - 0.01216307502022*G0_0_0_0_8 - 0.0041710670282105*G0_0_0_0_9 + 0.00147718242956362*G0_0_0_1_0 - 0.0160234826901524*G0_0_0_1_1 - 0.000125447744495396*G0_0_0_1_2 - 0.00612720612720721*G0_0_0_1_3 - 0.00447552447552521*G0_0_0_1_4 + 0.0114932686361277*G0_0_0_1_5 + 0.00102754388468694*G0_0_0_1_6 + 0.00184704184704219*G0_0_0_1_7 + 0.00381840381840438*G0_0_0_1_8 + 0.0306893106893159*G0_0_0_1_9 + 0.00411553173458006*G0_0_0_2_0 - 0.000125447744495396*G0_0_0_2_1 - 0.00722240722240839*G0_0_0_2_2 - 0.00290249433106625*G0_0_0_2_3 - 0.0124776810491118*G0_0_0_2_4 + 0.0185313099598845*G0_0_0_2_5 - 0.0287966002251765*G0_0_0_2_6 + 0.00530517101945761*G0_0_0_2_7 - 0.0132971790114669*G0_0_0_2_8 - 0.0296237096237146*G0_0_0_2_9 + 0.000745920745920912*G0_0_0_3_0 - 0.00612720612720722*G0_0_0_3_1 - 0.00290249433106625*G0_0_0_3_2 + 0.212587412587449*G0_0_0_3_3 + 0.044549735978315*G0_0_0_3_4 - 0.019135150563725*G0_0_0_3_5 - 0.0015298986727561*G0_0_0_3_6 - 0.000685029256458018*G0_0_0_3_7 - 0.0407592407592475*G0_0_0_3_8 - 0.0906978735550314*G0_0_0_3_9 + 0.00395033537890748*G0_0_0_4_0 - 0.00447552447552521*G0_0_0_4_1 - 0.0124776810491118*G0_0_0_4_2 + 0.044549735978315*G0_0_0_4_3 - 0.0289539032396224*G0_0_0_4_4 - 0.0102982731554178*G0_0_0_4_5 + 0.0118281718281739*G0_0_0_4_6 - 0.0146596260882*G0_0_0_4_7 + 0.0414442700157055*G0_0_0_4_8 + 0.109467675181979*G0_0_0_4_9 + 0.0641618698761666*G0_0_0_5_0 + 0.0114932686361277*G0_0_0_5_1 + 0.0185313099598845*G0_0_0_5_2 - 0.019135150563725*G0_0_0_5_3 - 0.0102982731554178*G0_0_0_5_4 + 0.554097331240281*G0_0_0_5_5 - 0.0263279577565336*G0_0_0_5_6 + 0.0472898530041465*G0_0_0_5_7 - 0.0329270729270784*G0_0_0_5_8 + 0.0783673469387885*G0_0_0_5_9 - 0.0331807874665074*G0_0_0_6_0 + 0.00102754388468694*G0_0_0_6_1 - 0.0287966002251765*G0_0_0_6_2 - 0.0015298986727561*G0_0_0_6_3 + 0.0118281718281739*G0_0_0_6_4 - 0.0263279577565336*G0_0_0_6_5 + 0.101841016126748*G0_0_0_6_6 - 0.0143627800770682*G0_0_0_6_7 + 0.0176280861995177*G0_0_0_6_8 + 0.0919309262166561*G0_0_0_6_9 + 0.013236287522004*G0_0_0_7_0 + 0.00184704184704219*G0_0_0_7_1 + 0.00530517101945761*G0_0_0_7_2 - 0.000685029256458018*G0_0_0_7_3 - 0.0146596260882*G0_0_0_7_4 + 0.0472898530041465*G0_0_0_7_5 - 0.0143627800770682*G0_0_0_7_6 - 0.0131525617239926*G0_0_0_7_7 + 0.0189068074782392*G0_0_0_7_8 + 0.041238761238768*G0_0_0_7_9 - 0.01216307502022*G0_0_0_8_0 + 0.00381840381840438*G0_0_0_8_1 - 0.0132971790114669*G0_0_0_8_2 - 0.0407592407592475*G0_0_0_8_3 + 0.0414442700157055*G0_0_0_8_4 - 0.0329270729270784*G0_0_0_8_5 + 0.0176280861995177*G0_0_0_8_6 + 0.0189068074782392*G0_0_0_8_7 - 0.143856143856168*G0_0_0_8_8 - 0.174956472099359*G0_0_0_8_9 - 0.0041710670282105*G0_0_0_9_0 + 0.0306893106893159*G0_0_0_9_1 - 0.0296237096237146*G0_0_0_9_2 - 0.0906978735550314*G0_0_0_9_3 + 0.109467675181979*G0_0_0_9_4 + 0.0783673469387885*G0_0_0_9_5 + 0.0919309262166561*G0_0_0_9_6 + 0.041238761238768*G0_0_0_9_7 - 0.174956472099359*G0_0_0_9_8 + 0.0641187384044636*G0_0_0_9_9 + 0.0120373453706808*G0_0_1_0_0 + 0.000440053773387192*G0_0_1_0_1 - 0.00150650055411986*G0_0_1_0_2 - 0.00302681445538632*G0_0_1_0_3 + 0.00602318316604132*G0_0_1_0_4 + 0.00651285222713904*G0_0_1_0_5 + 0.00152736152736177*G0_0_1_0_6 - 0.0161387818530702*G0_0_1_0_7 - 0.0097071182785485*G0_0_1_0_8 - 0.0166842681128423*G0_0_1_0_9 + 0.000440053773387192*G0_0_1_1_0 - 0.000795254128587599*G0_0_1_1_2 - 0.00390720390720455*G0_0_1_1_3 - 0.00433344433344509*G0_0_1_1_4 - 0.00285936285936334*G0_0_1_1_5 + 0.00321456321456377*G0_0_1_1_6 - 0.0178310578310608*G0_0_1_1_7 + 0.00390720390720457*G0_0_1_1_8 + 0.0221645021645059*G0_0_1_1_9 - 0.00150650055411986*G0_0_1_2_0 - 0.0007952541285876*G0_0_1_2_1 + 0.0015301805777999*G0_0_1_2_2 - 0.00629719486862446*G0_0_1_2_3 - 0.00902970045827349*G0_0_1_2_4 + 0.002197167911454*G0_0_1_2_5 - 0.000900686614972532*G0_0_1_2_6 - 0.00274519131662034*G0_0_1_2_7 - 0.00654329797187045*G0_0_1_2_8 - 0.0311155511155563*G0_0_1_2_9 - 0.00302681445538633*G0_0_1_3_0 - 0.00390720390720455*G0_0_1_3_1 - 0.00629719486862446*G0_0_1_3_2 + 0.164635364635394*G0_0_1_3_3 + 0.0596203796203897*G0_0_1_3_4 + 0.00242043670615137*G0_0_1_3_5 + 0.00317396888825508*G0_0_1_3_6 + 0.0218981018981054*G0_0_1_3_7 - 0.0543456543456632*G0_0_1_3_8 - 0.110289710289729*G0_0_1_3_9 + 0.00602318316604132*G0_0_1_4_0 - 0.00433344433344509*G0_0_1_4_1 - 0.00902970045827349*G0_0_1_4_2 + 0.0596203796203897*G0_0_1_4_3 - 0.0503268160411102*G0_0_1_4_4 - 0.00525189096617756*G0_0_1_4_5 + 0.00207792207792247*G0_0_1_4_6 - 0.0113258170401046*G0_0_1_4_7 + 0.0324475524475577*G0_0_1_4_8 + 0.103850435279024*G0_0_1_4_9 + 0.00651285222713904*G0_0_1_5_0 - 0.00285936285936334*G0_0_1_5_1 + 0.002197167911454*G0_0_1_5_2 + 0.00242043670615137*G0_0_1_5_3 - 0.00525189096617756*G0_0_1_5_4 - 0.00223776223776246*G0_0_1_5_5 - 0.00730697873555133*G0_0_1_5_6 - 0.0424489795918438*G0_0_1_5_7 + 0.0213957471100364*G0_0_1_5_8 + 0.00726131011845419*G0_0_1_5_9 + 0.00152736152736177*G0_0_1_6_0 + 0.00321456321456377*G0_0_1_6_1 - 0.000900686614972532*G0_0_1_6_2 + 0.00317396888825508*G0_0_1_6_3 + 0.00207792207792247*G0_0_1_6_4 - 0.00730697873555133*G0_0_1_6_5 - 0.01237619523334*G0_0_1_6_6 + 0.0210532324818074*G0_0_1_6_7 - 0.00141572713001314*G0_0_1_6_8 + 0.0869987155701589*G0_0_1_6_9 - 0.0161387818530702*G0_0_1_7_0 - 0.0178310578310608*G0_0_1_7_1 - 0.00274519131662034*G0_0_1_7_2 + 0.0218981018981054*G0_0_1_7_3 - 0.0113258170401046*G0_0_1_7_4 - 0.0424489795918438*G0_0_1_7_5 + 0.0210532324818074*G0_0_1_7_6 - 0.222954188668511*G0_0_1_7_7 + 0.127712287712309*G0_0_1_7_8 + 0.00794633937491212*G0_0_1_7_9 - 0.0097071182785485*G0_0_1_8_0 + 0.00390720390720457*G0_0_1_8_1 - 0.00654329797187045*G0_0_1_8_2 - 0.0543456543456632*G0_0_1_8_3 + 0.0324475524475577*G0_0_1_8_4 + 0.0213957471100364*G0_0_1_8_5 - 0.00141572713001315*G0_0_1_8_6 + 0.127712287712309*G0_0_1_8_7 - 0.0559440559440646*G0_0_1_8_8 - 0.131388611388633*G0_0_1_8_9 - 0.0166842681128423*G0_0_1_9_0 + 0.0221645021645059*G0_0_1_9_1 - 0.0311155511155563*G0_0_1_9_2 - 0.110289710289729*G0_0_1_9_3 + 0.103850435279024*G0_0_1_9_4 + 0.00726131011845419*G0_0_1_9_5 + 0.0869987155701589*G0_0_1_9_6 + 0.00794633937491211*G0_0_1_9_7 - 0.131388611388633*G0_0_1_9_8 + 0.0723390894819594*G0_0_1_9_9; + A[191] = A[177] - 0.0137344137344162*G0_0_1_0_0 - 0.00220449744259309*G0_0_1_0_1 + 0.000153638248876362*G0_0_1_0_2 + 0.00080934938077806*G0_0_1_0_3 - 0.00233417376274558*G0_0_1_0_4 - 0.00824064824064969*G0_0_1_0_5 + 0.00197389911675662*G0_0_1_0_6 + 0.0161260961260988*G0_0_1_0_7 + 0.00545486259772067*G0_0_1_0_8 + 0.0115389372532249*G0_0_1_0_9 - 0.00220449744259309*G0_0_1_1_0 - 0.0288106954773673*G0_0_1_1_1 - 0.0017362531648249*G0_0_1_1_2 - 0.0234432234432275*G0_0_1_1_3 + 0.00991008991009163*G0_0_1_1_4 + 0.00111380682809274*G0_0_1_1_5 - 0.00123812695241289*G0_0_1_1_6 + 0.0231945831945872*G0_0_1_1_7 - 0.0174048174048205*G0_0_1_1_8 - 0.0142790542790567*G0_0_1_1_9 + 0.000153638248876362*G0_0_1_2_0 - 0.00173625316482489*G0_0_1_2_1 + 0.000979901932283038*G0_0_1_2_2 - 0.000527726242012068*G0_0_1_2_3 + 0.000575932004503553*G0_0_1_2_4 - 0.00127872127872151*G0_0_1_2_5 + 0.000616526330812167*G0_0_1_2_6 + 0.00447045018473663*G0_0_1_2_7 + 0.00252192252192291*G0_0_1_2_8 + 0.0146444032158342*G0_0_1_2_9 + 0.000809349380778061*G0_0_1_3_0 - 0.0234432234432275*G0_0_1_3_1 - 0.000527726242012069*G0_0_1_3_2 - 0.0405994005994078*G0_0_1_3_3 + 0.00248893963179728*G0_0_1_3_4 - 0.00223776223776256*G0_0_1_3_6 - 0.00838019123733542*G0_0_1_3_7 + 0.0218981018981053*G0_0_1_3_8 + 0.0595975453118409*G0_0_1_3_9 - 0.00233417376274558*G0_0_1_4_0 + 0.00991008991009163*G0_0_1_4_1 + 0.000575932004503552*G0_0_1_4_2 + 0.00248893963179728*G0_0_1_4_3 + 0.00118738404452688*G0_0_1_4_4 + 0.00105037819323554*G0_0_1_4_5 + 0.00118738404452703*G0_0_1_4_6 - 0.000228343085485987*G0_0_1_4_7 - 0.0135179106607699*G0_0_1_4_8 - 0.0460339660339738*G0_0_1_4_9 - 0.00824064824064969*G0_0_1_5_0 + 0.00111380682809274*G0_0_1_5_1 - 0.00127872127872151*G0_0_1_5_2 + 0.00105037819323554*G0_0_1_5_4 - 0.0268988154702487*G0_0_1_5_5 + 0.00358498644212995*G0_0_1_5_6 + 0.0286570572284905*G0_0_1_5_7 - 0.00929356357927937*G0_0_1_5_8 - 0.0160296846011158*G0_0_1_5_9 + 0.00197389911675662*G0_0_1_6_0 - 0.00123812695241289*G0_0_1_6_1 + 0.000616526330812167*G0_0_1_6_2 - 0.00223776223776256*G0_0_1_6_3 + 0.00118738404452703*G0_0_1_6_4 + 0.00358498644212995*G0_0_1_6_5 + 0.00447552447552508*G0_0_1_6_6 - 0.0193634936492111*G0_0_1_6_7 + 0.00105037819323555*G0_0_1_6_8 - 0.0394576851719776*G0_0_1_6_9 + 0.0161260961260988*G0_0_1_7_0 + 0.0231945831945872*G0_0_1_7_1 + 0.00447045018473663*G0_0_1_7_2 - 0.00838019123733542*G0_0_1_7_3 - 0.000228343085485989*G0_0_1_7_4 + 0.0286570572284905*G0_0_1_7_5 - 0.0193634936492111*G0_0_1_7_6 + 0.192721564150168*G0_0_1_7_7 - 0.100470957613831*G0_0_1_7_8 + 0.00411017553874765*G0_0_1_7_9 + 0.00545486259772067*G0_0_1_8_0 - 0.0174048174048205*G0_0_1_8_1 + 0.00252192252192291*G0_0_1_8_2 + 0.0218981018981053*G0_0_1_8_3 - 0.0135179106607699*G0_0_1_8_4 - 0.00929356357927937*G0_0_1_8_5 + 0.00105037819323555*G0_0_1_8_6 - 0.100470957613831*G0_0_1_8_7 + 0.0255744255744292*G0_0_1_8_8 + 0.06987298415871*G0_0_1_8_9 + 0.0115389372532249*G0_0_1_9_0 - 0.0142790542790567*G0_0_1_9_1 + 0.0146444032158342*G0_0_1_9_2 + 0.0595975453118409*G0_0_1_9_3 - 0.0460339660339738*G0_0_1_9_4 - 0.0160296846011158*G0_0_1_9_5 - 0.0394576851719776*G0_0_1_9_6 + 0.00411017553874767*G0_0_1_9_7 + 0.06987298415871*G0_0_1_9_8 - 0.032881404309982*G0_0_1_9_9 + 0.0137344137344162*G0_1_0_0_0 + 0.00220449744259309*G0_1_0_0_1 - 0.000153638248876362*G0_1_0_0_2 - 0.00080934938077806*G0_1_0_0_3 + 0.00233417376274558*G0_1_0_0_4 + 0.00824064824064969*G0_1_0_0_5 - 0.00197389911675662*G0_1_0_0_6 - 0.0161260961260988*G0_1_0_0_7 - 0.00545486259772067*G0_1_0_0_8 - 0.0115389372532249*G0_1_0_0_9 + 0.00220449744259309*G0_1_0_1_0 + 0.0288106954773673*G0_1_0_1_1 + 0.0017362531648249*G0_1_0_1_2 + 0.0234432234432275*G0_1_0_1_3 - 0.00991008991009163*G0_1_0_1_4 - 0.00111380682809274*G0_1_0_1_5 + 0.00123812695241289*G0_1_0_1_6 - 0.0231945831945872*G0_1_0_1_7 + 0.0174048174048205*G0_1_0_1_8 + 0.0142790542790567*G0_1_0_1_9 - 0.000153638248876362*G0_1_0_2_0 + 0.00173625316482489*G0_1_0_2_1 - 0.000979901932283037*G0_1_0_2_2 + 0.000527726242012068*G0_1_0_2_3 - 0.000575932004503553*G0_1_0_2_4 + 0.00127872127872151*G0_1_0_2_5 - 0.000616526330812167*G0_1_0_2_6 - 0.00447045018473663*G0_1_0_2_7 - 0.00252192252192291*G0_1_0_2_8 - 0.0146444032158342*G0_1_0_2_9 - 0.000809349380778061*G0_1_0_3_0 + 0.0234432234432275*G0_1_0_3_1 + 0.000527726242012069*G0_1_0_3_2 + 0.0405994005994078*G0_1_0_3_3 - 0.00248893963179728*G0_1_0_3_4 + 0.00223776223776256*G0_1_0_3_6 + 0.00838019123733542*G0_1_0_3_7 - 0.0218981018981053*G0_1_0_3_8 - 0.0595975453118409*G0_1_0_3_9 + 0.00233417376274558*G0_1_0_4_0 - 0.00991008991009163*G0_1_0_4_1 - 0.000575932004503552*G0_1_0_4_2 - 0.00248893963179728*G0_1_0_4_3 - 0.00118738404452689*G0_1_0_4_4 - 0.00105037819323554*G0_1_0_4_5 - 0.00118738404452703*G0_1_0_4_6 + 0.000228343085485987*G0_1_0_4_7 + 0.0135179106607699*G0_1_0_4_8 + 0.0460339660339738*G0_1_0_4_9 + 0.00824064824064969*G0_1_0_5_0 - 0.00111380682809274*G0_1_0_5_1 + 0.0012787212787215*G0_1_0_5_2 - 0.00105037819323554*G0_1_0_5_4 + 0.0268988154702487*G0_1_0_5_5 - 0.00358498644212996*G0_1_0_5_6 - 0.0286570572284905*G0_1_0_5_7 + 0.00929356357927938*G0_1_0_5_8 + 0.0160296846011158*G0_1_0_5_9 - 0.00197389911675662*G0_1_0_6_0 + 0.00123812695241289*G0_1_0_6_1 - 0.000616526330812167*G0_1_0_6_2 + 0.00223776223776256*G0_1_0_6_3 - 0.00118738404452703*G0_1_0_6_4 - 0.00358498644212995*G0_1_0_6_5 - 0.00447552447552507*G0_1_0_6_6 + 0.0193634936492111*G0_1_0_6_7 - 0.00105037819323555*G0_1_0_6_8 + 0.0394576851719776*G0_1_0_6_9 - 0.0161260961260988*G0_1_0_7_0 - 0.0231945831945872*G0_1_0_7_1 - 0.00447045018473663*G0_1_0_7_2 + 0.00838019123733542*G0_1_0_7_3 + 0.000228343085485987*G0_1_0_7_4 - 0.0286570572284905*G0_1_0_7_5 + 0.0193634936492111*G0_1_0_7_6 - 0.192721564150168*G0_1_0_7_7 + 0.100470957613831*G0_1_0_7_8 - 0.00411017553874766*G0_1_0_7_9 - 0.00545486259772067*G0_1_0_8_0 + 0.0174048174048205*G0_1_0_8_1 - 0.00252192252192291*G0_1_0_8_2 - 0.0218981018981053*G0_1_0_8_3 + 0.0135179106607699*G0_1_0_8_4 + 0.00929356357927937*G0_1_0_8_5 - 0.00105037819323555*G0_1_0_8_6 + 0.100470957613831*G0_1_0_8_7 - 0.0255744255744292*G0_1_0_8_8 - 0.06987298415871*G0_1_0_8_9 - 0.0115389372532249*G0_1_0_9_0 + 0.0142790542790567*G0_1_0_9_1 - 0.0146444032158342*G0_1_0_9_2 - 0.0595975453118409*G0_1_0_9_3 + 0.0460339660339738*G0_1_0_9_4 + 0.0160296846011158*G0_1_0_9_5 + 0.0394576851719776*G0_1_0_9_6 - 0.00411017553874767*G0_1_0_9_7 - 0.06987298415871*G0_1_0_9_8 + 0.0328814043099819*G0_1_0_9_9; + A[132] = A[191] - 0.0429555629555703*G0_0_0_0_0 - 0.00285767142910051*G0_0_0_0_2 + 0.0059267716410584*G0_0_0_0_3 - 0.00199673342530525*G0_0_0_0_4 - 0.0670948099519643*G0_0_0_0_5 + 0.0366414537843171*G0_0_0_0_6 - 0.0152406323834921*G0_0_0_0_7 + 0.010326181754755*G0_0_0_0_8 + 0.00368393511250709*G0_0_0_0_9 + 0.0335444449730224*G0_0_0_1_1 + 0.00124573838859573*G0_0_0_1_2 + 0.0422358593787239*G0_0_0_1_3 - 0.0198201798201833*G0_0_0_1_4 - 0.0105748220033952*G0_0_0_1_5 + 0.00567559424702374*G0_0_0_1_6 - 0.0071648985934713*G0_0_0_1_7 + 0.00460999318142267*G0_0_0_1_8 - 0.0112649255506417*G0_0_0_1_9 - 0.00285767142910051*G0_0_0_2_0 + 0.00124573838859573*G0_0_0_2_1 + 0.001112961112961*G0_0_0_2_2 + 0.0208654837226302*G0_0_0_2_3 - 0.0312119626405396*G0_0_0_2_4 - 0.0235853035853075*G0_0_0_2_5 + 0.0371082885368661*G0_0_0_2_6 - 0.00393003821575315*G0_0_0_2_7 + 0.0112014969157845*G0_0_0_2_8 + 0.0171409542838143*G0_0_0_2_9 + 0.0059267716410584*G0_0_0_3_0 + 0.0422358593787239*G0_0_0_3_1 + 0.0208654837226302*G0_0_0_3_2 + 0.188931068931101*G0_0_0_3_3 - 0.0303467960610867*G0_0_0_3_4 + 0.00936206650492508*G0_0_0_3_5 - 0.021806764663911*G0_0_0_3_6 - 0.022560296846015*G0_0_0_3_7 + 0.0609447695162084*G0_0_0_3_8 + 0.0789153703439551*G0_0_0_3_9 - 0.00199673342530525*G0_0_0_4_0 - 0.0198201798201833*G0_0_0_4_1 - 0.0312119626405396*G0_0_0_4_2 - 0.0303467960610867*G0_0_0_4_3 - 0.134539745968341*G0_0_0_4_4 + 0.00121021835307588*G0_0_0_4_5 + 0.0205965463108352*G0_0_0_4_6 + 0.0112801484230075*G0_0_0_4_7 - 0.0383844726701934*G0_0_0_4_8 - 0.0538432995575945*G0_0_0_4_9 - 0.0670948099519643*G0_0_0_5_0 - 0.0105748220033952*G0_0_0_5_1 - 0.0235853035853075*G0_0_0_5_2 + 0.00936206650492508*G0_0_0_5_3 + 0.00121021835307588*G0_0_0_5_4 - 0.372153560725052*G0_0_0_5_5 + 0.00838019123733565*G0_0_0_5_6 - 0.0339546168117653*G0_0_0_5_7 + 0.0269444840873457*G0_0_0_5_8 - 0.0649407735122128*G0_0_0_5_9 + 0.0366414537843171*G0_0_0_6_0 + 0.00567559424702374*G0_0_0_6_1 + 0.0371082885368661*G0_0_0_6_2 - 0.021806764663911*G0_0_0_6_3 + 0.0205965463108352*G0_0_0_6_4 + 0.00838019123733565*G0_0_0_6_5 + 0.0313286713286762*G0_0_0_6_6 + 0.00701013272441961*G0_0_0_6_7 - 0.0229256457827925*G0_0_0_6_8 - 0.00780933352362073*G0_0_0_6_9 - 0.0152406323834921*G0_0_0_7_0 - 0.0071648985934713*G0_0_0_7_1 - 0.00393003821575315*G0_0_0_7_2 - 0.022560296846015*G0_0_0_7_3 + 0.0112801484230075*G0_0_0_7_4 - 0.0339546168117653*G0_0_0_7_5 + 0.00701013272441961*G0_0_0_7_6 + 0.0129698872556038*G0_0_0_7_7 - 0.00922506065363367*G0_0_0_7_8 - 0.0250720707863606*G0_0_0_7_9 + 0.010326181754755*G0_0_0_8_0 + 0.00460999318142267*G0_0_0_8_1 + 0.0112014969157845*G0_0_0_8_2 + 0.0609447695162084*G0_0_0_8_3 - 0.0383844726701934*G0_0_0_8_4 + 0.0269444840873457*G0_0_0_8_5 - 0.0229256457827925*G0_0_0_8_6 - 0.00922506065363367*G0_0_0_8_7 + 0.109147994862299*G0_0_0_8_8 + 0.110563721992312*G0_0_0_8_9 + 0.00368393511250709*G0_0_0_9_0 - 0.0112649255506417*G0_0_0_9_1 + 0.0171409542838143*G0_0_0_9_2 + 0.0789153703439551*G0_0_0_9_3 - 0.0538432995575946*G0_0_0_9_4 - 0.0649407735122128*G0_0_0_9_5 - 0.00780933352362073*G0_0_0_9_6 - 0.0250720707863606*G0_0_0_9_7 + 0.110563721992312*G0_0_0_9_8 + 0.0246610532324859*G0_0_0_9_9 + 0.0015727482394152*G0_0_1_0_1 - 0.00157274823941518*G0_0_1_0_2 + 0.00576946862661252*G0_0_1_0_3 - 0.00576946862661253*G0_0_1_0_4 + 0.00103261817547555*G0_0_1_0_5 + 0.000263863121006*G0_0_1_0_6 - 0.00103261817547547*G0_0_1_0_7 - 0.000263863121006023*G0_0_1_0_8 + 0.0015727482394152*G0_0_1_1_0 + 0.0375486242152976*G0_0_1_1_1 + 0.0550712779284303*G0_0_1_1_3 - 0.0304203732775214*G0_0_1_1_4 + 0.000411017553874766*G0_0_1_1_5 - 0.000357737500594722*G0_0_1_1_6 - 0.00779918494204349*G0_0_1_1_7 + 0.01326927041213*G0_0_1_1_8 + 0.00468864468864552*G0_0_1_1_9 - 0.00157274823941518*G0_0_1_2_0 - 0.0375486242152974*G0_0_1_2_2 + 0.0304203732775214*G0_0_1_2_3 - 0.0550712779284304*G0_0_1_2_4 + 0.00779918494204344*G0_0_1_2_5 - 0.0132692704121298*G0_0_1_2_6 - 0.000411017553874762*G0_0_1_2_7 + 0.000357737500594725*G0_0_1_2_8 - 0.00468864468864547*G0_0_1_2_9 + 0.00576946862661252*G0_0_1_3_0 + 0.0550712779284303*G0_0_1_3_1 + 0.0304203732775214*G0_0_1_3_2 + 0.195918367346972*G0_0_1_3_3 - 0.00927072927073085*G0_0_1_3_5 + 0.00107321250178416*G0_0_1_3_6 - 0.0173084058798375*G0_0_1_3_7 + 0.0183816183816217*G0_0_1_3_8 + 0.0205508776937385*G0_0_1_3_9 - 0.00576946862661253*G0_0_1_4_0 - 0.0304203732775214*G0_0_1_4_1 - 0.0550712779284303*G0_0_1_4_2 - 0.195918367346973*G0_0_1_4_4 + 0.0173084058798375*G0_0_1_4_5 - 0.0183816183816216*G0_0_1_4_6 + 0.00927072927073088*G0_0_1_4_7 - 0.0010732125017842*G0_0_1_4_8 - 0.0205508776937384*G0_0_1_4_9 + 0.00103261817547555*G0_0_1_5_0 + 0.000411017553874766*G0_0_1_5_1 + 0.00779918494204344*G0_0_1_5_2 - 0.00927072927073085*G0_0_1_5_3 + 0.0173084058798375*G0_0_1_5_4 + 0.0201855287569608*G0_0_1_5_5 - 0.00591408591408697*G0_0_1_5_6 - 0.00123305266162431*G0_0_1_5_8 + 0.00246610532324861*G0_0_1_5_9 + 0.000263863121006*G0_0_1_6_0 - 0.000357737500594721*G0_0_1_6_1 - 0.0132692704121298*G0_0_1_6_2 + 0.00107321250178416*G0_0_1_6_3 - 0.0183816183816216*G0_0_1_6_4 - 0.00591408591408697*G0_0_1_6_5 + 0.0312830027115794*G0_0_1_6_6 + 0.00123305266162427*G0_0_1_6_7 + 0.0119195090623681*G0_0_1_6_9 - 0.00103261817547547*G0_0_1_7_0 - 0.00779918494204349*G0_0_1_7_1 - 0.000411017553874762*G0_0_1_7_2 - 0.0173084058798375*G0_0_1_7_3 + 0.00927072927073088*G0_0_1_7_4 + 0.00123305266162427*G0_0_1_7_6 - 0.0201855287569604*G0_0_1_7_7 + 0.00591408591408682*G0_0_1_7_8 - 0.00246610532324858*G0_0_1_7_9 - 0.000263863121006022*G0_0_1_8_0 + 0.01326927041213*G0_0_1_8_1 + 0.000357737500594725*G0_0_1_8_2 + 0.0183816183816217*G0_0_1_8_3 - 0.0010732125017842*G0_0_1_8_4 - 0.00123305266162431*G0_0_1_8_5 + 0.00591408591408682*G0_0_1_8_7 - 0.0312830027115792*G0_0_1_8_8 - 0.0119195090623681*G0_0_1_8_9 + 0.00468864468864552*G0_0_1_9_1 - 0.00468864468864547*G0_0_1_9_2 + 0.0205508776937385*G0_0_1_9_3 - 0.0205508776937384*G0_0_1_9_4 + 0.00246610532324861*G0_0_1_9_5 + 0.0119195090623681*G0_0_1_9_6 - 0.00246610532324858*G0_0_1_9_7 - 0.0119195090623681*G0_0_1_9_8 - 0.000785387452054258*G0_1_0_0_1 + 0.00078538745205423*G0_1_0_0_2 + 0.00891299177013615*G0_1_0_0_3 - 0.00891299177013618*G0_1_0_0_4 - 0.023334126191273*G0_1_0_0_5 - 0.00321710035995804*G0_1_0_0_6 + 0.0233341261912729*G0_1_0_0_7 + 0.00321710035995809*G0_1_0_0_8 - 0.000785387452054257*G0_1_0_1_0 + 0.00775802680564729*G0_1_0_1_1 + 0.0310521224806993*G0_1_0_1_3 - 0.0199825571254177*G0_1_0_1_4 - 0.00294562580276914*G0_1_0_1_5 - 0.00411778697493054*G0_1_0_1_6 + 0.0166741195312652*G0_1_0_1_7 - 0.00475207332350262*G0_1_0_1_8 - 0.0242348128062454*G0_1_0_1_9 + 0.00078538745205423*G0_1_0_2_0 - 0.00775802680564743*G0_1_0_2_2 + 0.0199825571254177*G0_1_0_2_3 - 0.0310521224806994*G0_1_0_2_4 - 0.0166741195312652*G0_1_0_2_5 + 0.00475207332350259*G0_1_0_2_6 + 0.00294562580276913*G0_1_0_2_7 + 0.00411778697493051*G0_1_0_2_8 + 0.0242348128062454*G0_1_0_2_9 + 0.00891299177013615*G0_1_0_3_0 + 0.0310521224806993*G0_1_0_3_1 + 0.0199825571254177*G0_1_0_3_2 + 0.154131582703037*G0_1_0_3_3 - 0.00895104895105048*G0_1_0_3_5 + 0.0123533609247916*G0_1_0_3_6 - 0.0267389753104084*G0_1_0_3_7 + 0.0390923362351999*G0_1_0_3_8 + 0.126182389039553*G0_1_0_3_9 - 0.00891299177013618*G0_1_0_4_0 - 0.0199825571254177*G0_1_0_4_1 - 0.0310521224806994*G0_1_0_4_2 - 0.154131582703038*G0_1_0_4_4 + 0.0267389753104085*G0_1_0_4_5 - 0.0390923362352001*G0_1_0_4_6 + 0.00895104895105051*G0_1_0_4_7 - 0.0123533609247915*G0_1_0_4_8 - 0.126182389039553*G0_1_0_4_9 - 0.023334126191273*G0_1_0_5_0 - 0.00294562580276914*G0_1_0_5_1 - 0.0166741195312652*G0_1_0_5_2 - 0.00895104895105048*G0_1_0_5_3 + 0.0267389753104085*G0_1_0_5_4 - 0.199434850863456*G0_1_0_5_5 + 0.0981418581418748*G0_1_0_5_6 + 0.00883687740830753*G0_1_0_5_8 - 0.017673754816615*G0_1_0_5_9 - 0.00321710035995804*G0_1_0_6_0 - 0.00411778697493054*G0_1_0_6_1 + 0.00475207332350259*G0_1_0_6_2 + 0.0123533609247916*G0_1_0_6_3 - 0.0390923362352001*G0_1_0_6_4 + 0.0981418581418748*G0_1_0_6_5 + 0.010184101612675*G0_1_0_6_6 - 0.00883687740830738*G0_1_0_6_7 - 0.0974111602683195*G0_1_0_6_9 + 0.0233341261912729*G0_1_0_7_0 + 0.0166741195312652*G0_1_0_7_1 + 0.00294562580276913*G0_1_0_7_2 - 0.0267389753104084*G0_1_0_7_3 + 0.00895104895105051*G0_1_0_7_4 - 0.00883687740830738*G0_1_0_7_6 + 0.199434850863455*G0_1_0_7_7 - 0.0981418581418746*G0_1_0_7_8 + 0.0176737548166149*G0_1_0_7_9 + 0.00321710035995809*G0_1_0_8_0 - 0.00475207332350262*G0_1_0_8_1 + 0.00411778697493052*G0_1_0_8_2 + 0.0390923362351999*G0_1_0_8_3 - 0.0123533609247915*G0_1_0_8_4 + 0.00883687740830752*G0_1_0_8_5 - 0.0981418581418746*G0_1_0_8_7 - 0.0101841016126753*G0_1_0_8_8 + 0.0974111602683194*G0_1_0_8_9 - 0.0242348128062454*G0_1_0_9_1 + 0.0242348128062454*G0_1_0_9_2 + 0.126182389039553*G0_1_0_9_3 - 0.126182389039553*G0_1_0_9_4 - 0.017673754816615*G0_1_0_9_5 - 0.0974111602683195*G0_1_0_9_6 + 0.0176737548166149*G0_1_0_9_7 + 0.0974111602683194*G0_1_0_9_8 + 0.0429555629555703*G0_1_1_0_0 + 0.0028576714291005*G0_1_1_0_1 + 0.00199673342530523*G0_1_1_0_3 - 0.00592677164105842*G0_1_1_0_4 + 0.0152406323834921*G0_1_1_0_5 - 0.010326181754755*G0_1_1_0_6 + 0.0670948099519642*G0_1_1_0_7 - 0.0366414537843171*G0_1_1_0_8 - 0.00368393511250713*G0_1_1_0_9 + 0.0028576714291005*G0_1_1_1_0 - 0.00111296111296114*G0_1_1_1_1 - 0.00124573838859575*G0_1_1_1_2 + 0.0312119626405395*G0_1_1_1_3 - 0.0208654837226302*G0_1_1_1_4 + 0.00393003821575318*G0_1_1_1_5 - 0.0112014969157846*G0_1_1_1_6 + 0.0235853035853075*G0_1_1_1_7 - 0.0371082885368661*G0_1_1_1_8 - 0.0171409542838143*G0_1_1_1_9 - 0.00124573838859575*G0_1_1_2_1 - 0.0335444449730223*G0_1_1_2_2 + 0.0198201798201833*G0_1_1_2_3 - 0.0422358593787239*G0_1_1_2_4 + 0.00716489859347125*G0_1_1_2_5 - 0.0046099931814226*G0_1_1_2_6 + 0.0105748220033952*G0_1_1_2_7 - 0.00567559424702373*G0_1_1_2_8 + 0.0112649255506417*G0_1_1_2_9 + 0.00199673342530523*G0_1_1_3_0 + 0.0312119626405395*G0_1_1_3_1 + 0.0198201798201833*G0_1_1_3_2 + 0.13453974596834*G0_1_1_3_3 + 0.0303467960610869*G0_1_1_3_4 - 0.0112801484230075*G0_1_1_3_5 + 0.0383844726701934*G0_1_1_3_6 - 0.00121021835307593*G0_1_1_3_7 - 0.0205965463108352*G0_1_1_3_8 + 0.0538432995575944*G0_1_1_3_9 - 0.00592677164105842*G0_1_1_4_0 - 0.0208654837226302*G0_1_1_4_1 - 0.0422358593787239*G0_1_1_4_2 + 0.0303467960610869*G0_1_1_4_3 - 0.188931068931102*G0_1_1_4_4 + 0.022560296846015*G0_1_1_4_5 - 0.0609447695162085*G0_1_1_4_6 - 0.00936206650492514*G0_1_1_4_7 + 0.021806764663911*G0_1_1_4_8 - 0.0789153703439551*G0_1_1_4_9 + 0.0152406323834921*G0_1_1_5_0 + 0.00393003821575318*G0_1_1_5_1 + 0.00716489859347125*G0_1_1_5_2 - 0.0112801484230075*G0_1_1_5_3 + 0.022560296846015*G0_1_1_5_4 - 0.0129698872556037*G0_1_1_5_5 + 0.00922506065363372*G0_1_1_5_6 + 0.0339546168117654*G0_1_1_5_7 - 0.00701013272441963*G0_1_1_5_8 + 0.0250720707863608*G0_1_1_5_9 - 0.010326181754755*G0_1_1_6_0 - 0.0112014969157846*G0_1_1_6_1 - 0.0046099931814226*G0_1_1_6_2 + 0.0383844726701934*G0_1_1_6_3 - 0.0609447695162085*G0_1_1_6_4 + 0.00922506065363372*G0_1_1_6_5 - 0.109147994862299*G0_1_1_6_6 - 0.0269444840873457*G0_1_1_6_7 + 0.0229256457827925*G0_1_1_6_8 - 0.110563721992312*G0_1_1_6_9 + 0.0670948099519642*G0_1_1_7_0 + 0.0235853035853075*G0_1_1_7_1 + 0.0105748220033952*G0_1_1_7_2 - 0.00121021835307593*G0_1_1_7_3 - 0.00936206650492514*G0_1_1_7_4 + 0.0339546168117654*G0_1_1_7_5 - 0.0269444840873457*G0_1_1_7_6 + 0.372153560725053*G0_1_1_7_7 - 0.00838019123733576*G0_1_1_7_8 + 0.0649407735122131*G0_1_1_7_9 - 0.0366414537843171*G0_1_1_8_0 - 0.0371082885368661*G0_1_1_8_1 - 0.00567559424702373*G0_1_1_8_2 - 0.0205965463108352*G0_1_1_8_3 + 0.021806764663911*G0_1_1_8_4 - 0.00701013272441963*G0_1_1_8_5 + 0.0229256457827925*G0_1_1_8_6 - 0.00838019123733576*G0_1_1_8_7 - 0.0313286713286762*G0_1_1_8_8 + 0.00780933352362061*G0_1_1_8_9 - 0.00368393511250713*G0_1_1_9_0 - 0.0171409542838143*G0_1_1_9_1 + 0.0112649255506417*G0_1_1_9_2 + 0.0538432995575945*G0_1_1_9_3 - 0.0789153703439551*G0_1_1_9_4 + 0.0250720707863607*G0_1_1_9_5 - 0.110563721992312*G0_1_1_9_6 + 0.0649407735122131*G0_1_1_9_7 + 0.00780933352362062*G0_1_1_9_8 - 0.0246610532324855*G0_1_1_9_9; + A[188] = A[132] + 0.013734413734416*G0_0_1_0_0 - 0.000153638248876372*G0_0_1_0_1 + 0.00220449744259305*G0_0_1_0_2 + 0.00233417376274557*G0_0_1_0_3 - 0.000809349380778075*G0_0_1_0_4 - 0.0161260961260989*G0_0_1_0_5 - 0.00545486259772066*G0_0_1_0_6 + 0.00824064824064958*G0_0_1_0_7 - 0.00197389911675656*G0_0_1_0_8 - 0.0115389372532249*G0_0_1_0_9 - 0.000153638248876372*G0_0_1_1_0 - 0.000979901932283021*G0_0_1_1_1 + 0.00173625316482489*G0_0_1_1_2 - 0.000575932004503523*G0_0_1_1_3 + 0.000527726242012055*G0_0_1_1_4 - 0.00447045018473664*G0_0_1_1_5 - 0.00252192252192293*G0_0_1_1_6 + 0.00127872127872148*G0_0_1_1_7 - 0.000616526330812113*G0_0_1_1_8 - 0.0146444032158342*G0_0_1_1_9 + 0.00220449744259305*G0_0_1_2_0 + 0.00173625316482489*G0_0_1_2_1 + 0.0288106954773669*G0_0_1_2_2 - 0.00991008991009158*G0_0_1_2_3 + 0.0234432234432274*G0_0_1_2_4 - 0.0231945831945871*G0_0_1_2_5 + 0.0174048174048203*G0_0_1_2_6 - 0.00111380682809275*G0_0_1_2_7 + 0.00123812695241288*G0_0_1_2_8 + 0.0142790542790566*G0_0_1_2_9 + 0.00233417376274557*G0_0_1_3_0 - 0.000575932004503522*G0_0_1_3_1 - 0.00991008991009158*G0_0_1_3_2 - 0.00118738404452723*G0_0_1_3_3 - 0.00248893963179725*G0_0_1_3_4 + 0.000228343085485967*G0_0_1_3_5 + 0.01351791066077*G0_0_1_3_6 - 0.00105037819323551*G0_0_1_3_7 - 0.0011873840445271*G0_0_1_3_8 + 0.0460339660339737*G0_0_1_3_9 - 0.000809349380778076*G0_0_1_4_0 + 0.000527726242012057*G0_0_1_4_1 + 0.0234432234432274*G0_0_1_4_2 - 0.00248893963179725*G0_0_1_4_3 + 0.0405994005994076*G0_0_1_4_4 + 0.0083801912373355*G0_0_1_4_5 - 0.0218981018981055*G0_0_1_4_6 + 0.0022377622377626*G0_0_1_4_8 - 0.059597545311841*G0_0_1_4_9 - 0.0161260961260989*G0_0_1_5_0 - 0.00447045018473664*G0_0_1_5_1 - 0.0231945831945871*G0_0_1_5_2 + 0.000228343085485969*G0_0_1_5_3 + 0.0083801912373355*G0_0_1_5_4 - 0.192721564150168*G0_0_1_5_5 + 0.100470957613832*G0_0_1_5_6 - 0.0286570572284907*G0_0_1_5_7 + 0.0193634936492112*G0_0_1_5_8 - 0.00411017553874775*G0_0_1_5_9 - 0.00545486259772066*G0_0_1_6_0 - 0.00252192252192293*G0_0_1_6_1 + 0.0174048174048203*G0_0_1_6_2 + 0.01351791066077*G0_0_1_6_3 - 0.0218981018981055*G0_0_1_6_4 + 0.100470957613832*G0_0_1_6_5 - 0.0255744255744295*G0_0_1_6_6 + 0.00929356357927947*G0_0_1_6_7 - 0.00105037819323555*G0_0_1_6_8 - 0.06987298415871*G0_0_1_6_9 + 0.00824064824064958*G0_0_1_7_0 + 0.00127872127872148*G0_0_1_7_1 - 0.00111380682809275*G0_0_1_7_2 - 0.00105037819323551*G0_0_1_7_3 - 0.0286570572284907*G0_0_1_7_5 + 0.00929356357927947*G0_0_1_7_6 + 0.0268988154702482*G0_0_1_7_7 - 0.00358498644212991*G0_0_1_7_8 + 0.0160296846011158*G0_0_1_7_9 - 0.00197389911675656*G0_0_1_8_0 - 0.000616526330812113*G0_0_1_8_1 + 0.00123812695241288*G0_0_1_8_2 - 0.0011873840445271*G0_0_1_8_3 + 0.0022377622377626*G0_0_1_8_4 + 0.0193634936492112*G0_0_1_8_5 - 0.00105037819323554*G0_0_1_8_6 - 0.00358498644212991*G0_0_1_8_7 - 0.00447552447552532*G0_0_1_8_8 + 0.0394576851719775*G0_0_1_8_9 - 0.0115389372532249*G0_0_1_9_0 - 0.0146444032158342*G0_0_1_9_1 + 0.0142790542790567*G0_0_1_9_2 + 0.0460339660339737*G0_0_1_9_3 - 0.059597545311841*G0_0_1_9_4 - 0.00411017553874775*G0_0_1_9_5 - 0.06987298415871*G0_0_1_9_6 + 0.0160296846011158*G0_0_1_9_7 + 0.0394576851719775*G0_0_1_9_8 + 0.0328814043099812*G0_0_1_9_9 - 0.013734413734416*G0_1_0_0_0 + 0.000153638248876372*G0_1_0_0_1 - 0.00220449744259305*G0_1_0_0_2 - 0.00233417376274557*G0_1_0_0_3 + 0.000809349380778075*G0_1_0_0_4 + 0.0161260961260989*G0_1_0_0_5 + 0.00545486259772066*G0_1_0_0_6 - 0.00824064824064958*G0_1_0_0_7 + 0.00197389911675656*G0_1_0_0_8 + 0.0115389372532249*G0_1_0_0_9 + 0.000153638248876372*G0_1_0_1_0 + 0.000979901932283021*G0_1_0_1_1 - 0.00173625316482489*G0_1_0_1_2 + 0.000575932004503523*G0_1_0_1_3 - 0.000527726242012057*G0_1_0_1_4 + 0.00447045018473664*G0_1_0_1_5 + 0.00252192252192293*G0_1_0_1_6 - 0.00127872127872148*G0_1_0_1_7 + 0.000616526330812112*G0_1_0_1_8 + 0.0146444032158342*G0_1_0_1_9 - 0.00220449744259305*G0_1_0_2_0 - 0.00173625316482489*G0_1_0_2_1 - 0.0288106954773669*G0_1_0_2_2 + 0.00991008991009157*G0_1_0_2_3 - 0.0234432234432274*G0_1_0_2_4 + 0.0231945831945871*G0_1_0_2_5 - 0.0174048174048203*G0_1_0_2_6 + 0.00111380682809275*G0_1_0_2_7 - 0.00123812695241288*G0_1_0_2_8 - 0.0142790542790566*G0_1_0_2_9 - 0.00233417376274557*G0_1_0_3_0 + 0.000575932004503522*G0_1_0_3_1 + 0.00991008991009158*G0_1_0_3_2 + 0.00118738404452723*G0_1_0_3_3 + 0.00248893963179726*G0_1_0_3_4 - 0.000228343085485967*G0_1_0_3_5 - 0.01351791066077*G0_1_0_3_6 + 0.00105037819323551*G0_1_0_3_7 + 0.0011873840445271*G0_1_0_3_8 - 0.0460339660339737*G0_1_0_3_9 + 0.000809349380778076*G0_1_0_4_0 - 0.000527726242012055*G0_1_0_4_1 - 0.0234432234432274*G0_1_0_4_2 + 0.00248893963179725*G0_1_0_4_3 - 0.0405994005994076*G0_1_0_4_4 - 0.00838019123733549*G0_1_0_4_5 + 0.0218981018981055*G0_1_0_4_6 - 0.0022377622377626*G0_1_0_4_8 + 0.059597545311841*G0_1_0_4_9 + 0.0161260961260989*G0_1_0_5_0 + 0.00447045018473664*G0_1_0_5_1 + 0.0231945831945871*G0_1_0_5_2 - 0.000228343085485967*G0_1_0_5_3 - 0.00838019123733549*G0_1_0_5_4 + 0.192721564150168*G0_1_0_5_5 - 0.100470957613832*G0_1_0_5_6 + 0.0286570572284907*G0_1_0_5_7 - 0.0193634936492112*G0_1_0_5_8 + 0.00411017553874774*G0_1_0_5_9 + 0.00545486259772066*G0_1_0_6_0 + 0.00252192252192293*G0_1_0_6_1 - 0.0174048174048203*G0_1_0_6_2 - 0.01351791066077*G0_1_0_6_3 + 0.0218981018981055*G0_1_0_6_4 - 0.100470957613832*G0_1_0_6_5 + 0.0255744255744295*G0_1_0_6_6 - 0.00929356357927947*G0_1_0_6_7 + 0.00105037819323555*G0_1_0_6_8 + 0.06987298415871*G0_1_0_6_9 - 0.00824064824064958*G0_1_0_7_0 - 0.00127872127872148*G0_1_0_7_1 + 0.00111380682809275*G0_1_0_7_2 + 0.00105037819323551*G0_1_0_7_3 + 0.0286570572284907*G0_1_0_7_5 - 0.00929356357927947*G0_1_0_7_6 - 0.0268988154702482*G0_1_0_7_7 + 0.00358498644212991*G0_1_0_7_8 - 0.0160296846011158*G0_1_0_7_9 + 0.00197389911675656*G0_1_0_8_0 + 0.000616526330812113*G0_1_0_8_1 - 0.00123812695241288*G0_1_0_8_2 + 0.0011873840445271*G0_1_0_8_3 - 0.0022377622377626*G0_1_0_8_4 - 0.0193634936492112*G0_1_0_8_5 + 0.00105037819323554*G0_1_0_8_6 + 0.00358498644212991*G0_1_0_8_7 + 0.00447552447552532*G0_1_0_8_8 - 0.0394576851719775*G0_1_0_8_9 + 0.0115389372532249*G0_1_0_9_0 + 0.0146444032158342*G0_1_0_9_1 - 0.0142790542790567*G0_1_0_9_2 - 0.0460339660339737*G0_1_0_9_3 + 0.059597545311841*G0_1_0_9_4 + 0.00411017553874774*G0_1_0_9_5 + 0.06987298415871*G0_1_0_9_6 - 0.0160296846011158*G0_1_0_9_7 - 0.0394576851719775*G0_1_0_9_8 - 0.0328814043099812*G0_1_0_9_9; + A[104] = A[132] + 0.0160234826901521*G0_0_0_0_0 + 0.00228117561450934*G0_0_0_0_1 + 0.00181377705187264*G0_0_0_0_2 - 0.00214642500356824*G0_0_0_0_3 + 0.0103058845916008*G0_0_0_0_4 + 0.0383514897800676*G0_0_0_0_5 - 0.00582528582528673*G0_0_0_0_6 + 0.0136853622567931*G0_0_0_0_7 - 0.00797678511964361*G0_0_0_0_8 + 0.0109604681033271*G0_0_0_0_9 + 0.00228117561450934*G0_0_0_1_0 + 0.00180870276108403*G0_0_0_1_1 + 0.00746879223069831*G0_0_0_1_2 - 0.0105240790955095*G0_0_0_1_3 + 0.0161768390339848*G0_0_0_1_4 - 0.00217687074829973*G0_0_0_1_5 + 0.00108082393796704*G0_0_0_1_6 + 0.00320695177838088*G0_0_0_1_7 - 0.00085755514326957*G0_0_0_1_8 + 0.00133961276818443*G0_0_0_1_9 + 0.00181377705187264*G0_0_0_2_0 + 0.00746879223069831*G0_0_0_2_1 + 0.0291264291264347*G0_0_0_2_2 - 0.0353779553779616*G0_0_0_2_3 + 0.0801332001332142*G0_0_0_2_4 + 0.0144921744921768*G0_0_0_2_5 - 0.00554112554112612*G0_0_0_2_6 + 0.00412539841111338*G0_0_0_2_7 - 0.00369915798487289*G0_0_0_2_8 + 0.00596736596736702*G0_0_0_2_9 - 0.00214642500356823*G0_0_0_3_0 - 0.0105240790955095*G0_0_0_3_1 - 0.0353779553779616*G0_0_0_3_2 + 0.0719737405451816*G0_0_0_3_3 - 0.0681832453261144*G0_0_0_3_4 + 0.0110518053375215*G0_0_0_3_5 - 0.0123761952333404*G0_0_0_3_6 - 0.00269444840873459*G0_0_0_3_7 + 0.000730697873555176*G0_0_0_3_8 + 0.0013700585129159*G0_0_0_3_9 + 0.0103058845916008*G0_0_0_4_0 + 0.0161768390339848*G0_0_0_4_1 + 0.0801332001332143*G0_0_0_4_2 - 0.0681832453261144*G0_0_0_4_3 + 0.565194805194903*G0_0_0_4_4 - 0.0400513771942413*G0_0_0_4_5 + 0.0524275724275817*G0_0_0_4_6 - 0.0170800627943514*G0_0_0_4_7 + 0.0019637505351794*G0_0_0_4_8 + 0.0622006564863814*G0_0_0_4_9 + 0.0383514897800676*G0_0_0_5_0 - 0.00217687074829973*G0_0_0_5_1 + 0.0144921744921768*G0_0_0_5_2 + 0.0110518053375215*G0_0_0_5_3 - 0.0400513771942413*G0_0_0_5_4 - 0.0639360639360749*G0_0_0_5_5 - 0.0827058655630226*G0_0_0_5_6 + 0.0241130298273195*G0_0_0_5_7 - 0.00260311117454014*G0_0_0_5_8 - 0.027675181960901*G0_0_0_5_9 - 0.00582528582528672*G0_0_0_6_0 + 0.00108082393796704*G0_0_0_6_1 - 0.00554112554112612*G0_0_0_6_2 - 0.0123761952333404*G0_0_0_6_3 + 0.0524275724275817*G0_0_0_6_4 - 0.0827058655630226*G0_0_0_6_5 + 0.116363636363657*G0_0_0_6_6 - 0.0215099186527794*G0_0_0_6_7 + 0.00849436278007846*G0_0_0_6_8 + 0.00685029256457954*G0_0_0_6_9 + 0.0136853622567931*G0_0_0_7_0 + 0.00320695177838088*G0_0_0_7_1 + 0.00412539841111338*G0_0_0_7_2 - 0.00269444840873459*G0_0_0_7_3 - 0.0170800627943514*G0_0_0_7_4 + 0.0241130298273195*G0_0_0_7_5 - 0.0215099186527794*G0_0_0_7_6 + 0.034890823462258*G0_0_0_7_7 - 0.0147052947052972*G0_0_0_7_8 + 0.0101384329955776*G0_0_0_7_9 - 0.00797678511964361*G0_0_0_8_0 - 0.00085755514326957*G0_0_0_8_1 - 0.00369915798487289*G0_0_0_8_2 + 0.000730697873555176*G0_0_0_8_3 + 0.0019637505351794*G0_0_0_8_4 - 0.00260311117454014*G0_0_0_8_5 + 0.00849436278007846*G0_0_0_8_6 - 0.0147052947052972*G0_0_0_8_7 - 0.000182674468388697*G0_0_0_8_8 - 0.00794633937491211*G0_0_0_8_9 + 0.0109604681033271*G0_0_0_9_0 + 0.00133961276818443*G0_0_0_9_1 + 0.00596736596736702*G0_0_0_9_2 + 0.0013700585129159*G0_0_0_9_3 + 0.0622006564863815*G0_0_0_9_4 - 0.027675181960901*G0_0_0_9_5 + 0.00685029256457954*G0_0_0_9_6 + 0.0101384329955776*G0_0_0_9_7 - 0.00794633937491211*G0_0_0_9_8 + 0.00328814043099837*G0_0_0_9_9 + 0.0062673129339807*G0_0_1_0_0 + 0.00181885134266117*G0_0_1_0_1 + 0.00401827449446568*G0_0_1_0_2 - 0.00241536241536284*G0_0_1_0_3 + 0.0139948939948965*G0_0_1_0_4 + 0.00805289948147225*G0_0_1_0_5 - 0.00197897340754517*G0_0_1_0_6 + 0.0120159205873512*G0_0_1_0_7 - 0.00661687518830486*G0_0_1_0_8 + 0.0176889776889807*G0_0_1_0_9 + 0.00181885134266117*G0_0_1_1_0 + 0.000828800828800966*G0_0_1_1_1 + 0.00951373141849497*G0_0_1_1_2 - 0.0123863438149174*G0_0_1_1_3 + 0.0225197025197065*G0_0_1_1_4 - 0.0110771767914644*G0_0_1_1_5 + 0.00298875727447208*G0_0_1_1_6 - 0.00132946418660726*G0_0_1_1_7 - 0.000187748759177377*G0_0_1_1_8 - 0.0133047904476498*G0_0_1_1_9 + 0.00401827449446568*G0_0_1_2_0 + 0.00951373141849497*G0_0_1_2_1 + 0.0814277080943887*G0_0_1_2_2 - 0.0486218543361484*G0_0_1_2_3 + 0.113486513486533*G0_0_1_2_4 - 0.0180035837178725*G0_0_1_2_5 + 0.0260361860361905*G0_0_1_2_6 - 0.00148676720105318*G0_0_1_2_7 + 0.000142080142080165*G0_0_1_2_8 + 0.00197897340754516*G0_0_1_2_9 - 0.00241536241536284*G0_0_1_3_0 - 0.0123863438149174*G0_0_1_3_1 - 0.0486218543361484*G0_0_1_3_2 + 0.0716083916084038*G0_0_1_3_3 - 0.0938946767518357*G0_0_1_3_4 + 0.0218295989724598*G0_0_1_3_5 - 0.0121478521478543*G0_0_1_3_6 + 0.00406450692165044*G0_0_1_3_7 - 0.00045668617097197*G0_0_1_3_8 + 0.0317853574996486*G0_0_1_3_9 + 0.0139948939948965*G0_0_1_4_0 + 0.0225197025197065*G0_0_1_4_1 + 0.113486513486533*G0_0_1_4_2 - 0.0938946767518357*G0_0_1_4_3 + 0.622645925503175*G0_0_1_4_4 - 0.0451662623091272*G0_0_1_4_5 + 0.0573141144569815*G0_0_1_4_6 - 0.0171714000285458*G0_0_1_4_7 - 0.0036078207506785*G0_0_1_4_8 + 0.0843956043956188*G0_0_1_4_9 + 0.00805289948147225*G0_0_1_5_0 - 0.0110771767914644*G0_0_1_5_1 - 0.0180035837178725*G0_0_1_5_2 + 0.0218295989724598*G0_0_1_5_3 - 0.0451662623091272*G0_0_1_5_4 - 0.126776081061817*G0_0_1_5_5 + 0.0177650920508093*G0_0_1_5_6 - 0.0313286713286766*G0_0_1_5_7 + 0.0300499500499551*G0_0_1_5_8 - 0.113166833166852*G0_0_1_5_9 - 0.00197897340754517*G0_0_1_6_0 + 0.00298875727447208*G0_0_1_6_1 + 0.0260361860361905*G0_0_1_6_2 - 0.0121478521478543*G0_0_1_6_3 + 0.0573141144569815*G0_0_1_6_4 + 0.0177650920508093*G0_0_1_6_5 - 0.0390923362351999*G0_0_1_6_6 + 0.0012787212787215*G0_0_1_6_7 - 0.00310546596260934*G0_0_1_6_8 + 0.018358784073073*G0_0_1_6_9 + 0.0120159205873512*G0_0_1_7_0 - 0.00132946418660726*G0_0_1_7_1 - 0.00148676720105318*G0_0_1_7_2 + 0.00406450692165044*G0_0_1_7_3 - 0.0171714000285458*G0_0_1_7_4 - 0.0313286713286766*G0_0_1_7_5 + 0.0012787212787215*G0_0_1_7_6 + 0.0449379192236406*G0_0_1_7_7 + 0.00493221064649719*G0_0_1_7_8 - 0.0556243756243851*G0_0_1_7_9 - 0.00661687518830487*G0_0_1_8_0 - 0.000187748759177377*G0_0_1_8_1 + 0.000142080142080165*G0_0_1_8_2 - 0.00045668617097197*G0_0_1_8_3 - 0.0036078207506785*G0_0_1_8_4 + 0.0300499500499551*G0_0_1_8_5 - 0.00310546596260934*G0_0_1_8_6 + 0.00493221064649719*G0_0_1_8_7 - 0.00548023405166393*G0_0_1_8_8 + 0.0471300128443065*G0_0_1_8_9 + 0.0176889776889807*G0_0_1_9_0 - 0.0133047904476498*G0_0_1_9_1 + 0.00197897340754516*G0_0_1_9_2 + 0.0317853574996486*G0_0_1_9_3 + 0.0843956043956188*G0_0_1_9_4 - 0.113166833166852*G0_0_1_9_5 + 0.018358784073073*G0_0_1_9_6 - 0.0556243756243851*G0_0_1_9_7 + 0.0471300128443065*G0_0_1_9_8 + 0.0361695447409797*G0_0_1_9_9 - 0.0362777962778027*G0_1_0_0_0 + 0.000236236426712643*G0_1_0_0_1 - 0.000390720390720423*G0_1_0_0_2 - 0.00598766313052127*G0_1_0_0_3 + 0.0159180502037673*G0_1_0_0_4 + 0.00677417820275066*G0_1_0_0_5 + 0.0266704723847627*G0_1_0_0_6 - 0.0196679510965261*G0_1_0_0_7 + 0.0052671138385434*G0_1_0_0_8 + 0.0149488606631489*G0_1_0_0_9 + 0.000236236426712644*G0_1_0_1_0 + 0.00278860469336707*G0_1_0_1_1 + 0.00793111650254647*G0_1_0_1_2 - 0.0111938854796017*G0_1_0_1_3 + 0.0207132549989729*G0_1_0_1_4 - 0.00408480408480482*G0_1_0_1_5 + 0.0099811299811317*G0_1_0_1_6 - 0.00313591170734084*G0_1_0_1_7 + 0.00100470957613833*G0_1_0_1_8 + 0.0159840159840187*G0_1_0_1_9 - 0.000390720390720423*G0_1_0_2_0 + 0.00793111650254647*G0_1_0_2_1 + 0.038882598882606*G0_1_0_2_2 - 0.0367378653093003*G0_1_0_2_3 + 0.0818026418026562*G0_1_0_2_4 + 0.0106458620744352*G0_1_0_2_5 + 0.0247574647574692*G0_1_0_2_6 + 0.000436389007817643*G0_1_0_2_7 - 0.00343022057307829*G0_1_0_2_8 - 0.000761143618286551*G0_1_0_2_9 - 0.00598766313052127*G0_1_0_3_0 - 0.0111938854796017*G0_1_0_3_1 - 0.0367378653093003*G0_1_0_3_2 + 0.0772713001284564*G0_1_0_3_3 - 0.0878207506779087*G0_1_0_3_4 + 0.0226516340802093*G0_1_0_3_5 - 0.0450292564578355*G0_1_0_3_6 + 0.00287712287712334*G0_1_0_3_7 + 0.00191808191808228*G0_1_0_3_8 - 0.0537062937063026*G0_1_0_3_9 + 0.0159180502037673*G0_1_0_4_0 + 0.0207132549989729*G0_1_0_4_1 + 0.0818026418026562*G0_1_0_4_2 - 0.0878207506779087*G0_1_0_4_3 + 0.555147709433519*G0_1_0_4_4 - 0.0628400171257421*G0_1_0_4_5 + 0.107869273583578*G0_1_0_4_6 - 0.016988725560157*G0_1_0_4_7 - 0.00479520479520562*G0_1_0_4_8 + 0.127963465106344*G0_1_0_4_9 + 0.00677417820275066*G0_1_0_5_0 - 0.00408480408480482*G0_1_0_5_1 + 0.0106458620744352*G0_1_0_5_2 + 0.0226516340802093*G0_1_0_5_3 - 0.0628400171257421*G0_1_0_5_4 + 0.091519908662781*G0_1_0_5_5 - 0.183176823176854*G0_1_0_5_6 + 0.0192264877979195*G0_1_0_5_7 - 0.00283145426002616*G0_1_0_5_8 - 0.0391836734693943*G0_1_0_5_9 + 0.0266704723847627*G0_1_0_6_0 + 0.0099811299811317*G0_1_0_6_1 + 0.0247574647574692*G0_1_0_6_2 - 0.0450292564578355*G0_1_0_6_3 + 0.107869273583578*G0_1_0_6_4 - 0.183176823176854*G0_1_0_6_5 + 0.179203653489398*G0_1_0_6_6 - 0.0163950335378934*G0_1_0_6_7 - 0.0022834308548598*G0_1_0_6_8 + 0.0923419437705306*G0_1_0_6_9 - 0.0196679510965261*G0_1_0_7_0 - 0.00313591170734084*G0_1_0_7_1 + 0.000436389007817643*G0_1_0_7_2 + 0.00287712287712334*G0_1_0_7_3 - 0.016988725560157*G0_1_0_7_4 + 0.0192264877979195*G0_1_0_7_5 - 0.0163950335378934*G0_1_0_7_6 - 0.0225602968460154*G0_1_0_7_7 + 0.0110061367204244*G0_1_0_7_8 - 0.0120565149136598*G0_1_0_7_9 + 0.0052671138385434*G0_1_0_8_0 + 0.00100470957613833*G0_1_0_8_1 - 0.00343022057307829*G0_1_0_8_2 + 0.00191808191808228*G0_1_0_8_3 - 0.00479520479520562*G0_1_0_8_4 - 0.00283145426002616*G0_1_0_8_5 - 0.0022834308548598*G0_1_0_8_6 + 0.0110061367204244*G0_1_0_8_7 + 0.000182674468388844*G0_1_0_8_8 - 0.0383616383616447*G0_1_0_8_9 + 0.0149488606631489*G0_1_0_9_0 + 0.0159840159840187*G0_1_0_9_1 - 0.000761143618286553*G0_1_0_9_2 - 0.0537062937063026*G0_1_0_9_3 + 0.127963465106344*G0_1_0_9_4 - 0.0391836734693943*G0_1_0_9_5 + 0.0923419437705306*G0_1_0_9_6 - 0.0120565149136598*G0_1_0_9_7 - 0.0383616383616447*G0_1_0_9_8 - 0.0295932638789829*G0_1_0_9_9 - 0.0751603951604083*G0_1_1_0_0 - 0.00769488007583379*G0_1_1_0_1 - 0.00255744255744295*G0_1_1_0_3 + 0.0154816611959496*G0_1_1_0_4 - 0.0179832865547183*G0_1_1_0_5 + 0.0160246103103274*G0_1_1_0_6 - 0.101470592899182*G0_1_1_0_7 + 0.0420049791478435*G0_1_1_0_8 + 0.0157100042814355*G0_1_1_0_9 - 0.00769488007583378*G0_1_1_1_0 + 0.0076948800758338*G0_1_1_1_2 - 0.01219859505574*G0_1_1_1_3 + 0.0238491667063137*G0_1_1_1_4 - 0.0140659340659365*G0_1_1_1_5 + 0.0140659340659365*G0_1_1_1_6 - 0.0238491667063136*G0_1_1_1_7 + 0.01219859505574*G0_1_1_1_8 + 0.0076948800758338*G0_1_1_2_1 + 0.0751603951604081*G0_1_1_2_2 - 0.0420049791478435*G0_1_1_2_3 + 0.101470592899182*G0_1_1_2_4 - 0.0160246103103273*G0_1_1_2_5 + 0.0179832865547182*G0_1_1_2_6 - 0.0154816611959495*G0_1_1_2_7 + 0.002557442557443*G0_1_1_2_8 - 0.0157100042814355*G0_1_1_2_9 - 0.00255744255744295*G0_1_1_3_0 - 0.01219859505574*G0_1_1_3_1 - 0.0420049791478435*G0_1_1_3_2 + 0.0770886256600675*G0_1_1_3_3 - 0.098826887398333*G0_1_1_3_4 + 0.0249350649350692*G0_1_1_3_5 - 0.0421978021978093*G0_1_1_3_6 + 0.00767232767232907*G0_1_1_3_7 - 0.0153446553446577*G0_1_1_3_9 + 0.0154816611959496*G0_1_1_4_0 + 0.0238491667063137*G0_1_1_4_1 + 0.101470592899182*G0_1_1_4_2 - 0.098826887398333*G0_1_1_4_3 + 0.577708006279534*G0_1_1_4_4 - 0.0464449835878487*G0_1_1_4_5 + 0.0886427857856581*G0_1_1_4_6 - 0.00767232767232898*G0_1_1_4_8 + 0.140019980020004*G0_1_1_4_9 - 0.0179832865547183*G0_1_1_5_0 - 0.0140659340659365*G0_1_1_5_1 - 0.0160246103103273*G0_1_1_5_2 + 0.0249350649350691*G0_1_1_5_3 - 0.0464449835878487*G0_1_1_5_4 - 0.0876837448266166*G0_1_1_5_5 - 0.0886427857856578*G0_1_1_5_7 + 0.0421978021978093*G0_1_1_5_8 - 0.131525617239925*G0_1_1_5_9 + 0.0160246103103274*G0_1_1_6_0 + 0.0140659340659365*G0_1_1_6_1 + 0.0179832865547182*G0_1_1_6_2 - 0.0421978021978093*G0_1_1_6_3 + 0.0886427857856581*G0_1_1_6_4 + 0.0876837448266168*G0_1_1_6_6 + 0.0464449835878485*G0_1_1_6_7 - 0.0249350649350692*G0_1_1_6_8 + 0.131525617239925*G0_1_1_6_9 - 0.101470592899182*G0_1_1_7_0 - 0.0238491667063137*G0_1_1_7_1 - 0.0154816611959495*G0_1_1_7_2 + 0.00767232767232907*G0_1_1_7_3 - 0.0886427857856578*G0_1_1_7_5 + 0.0464449835878485*G0_1_1_7_6 - 0.577708006279533*G0_1_1_7_7 + 0.0988268873983329*G0_1_1_7_8 - 0.140019980020004*G0_1_1_7_9 + 0.0420049791478435*G0_1_1_8_0 + 0.01219859505574*G0_1_1_8_1 + 0.002557442557443*G0_1_1_8_2 - 0.00767232767232898*G0_1_1_8_4 + 0.0421978021978093*G0_1_1_8_5 - 0.0249350649350692*G0_1_1_8_6 + 0.0988268873983329*G0_1_1_8_7 - 0.0770886256600674*G0_1_1_8_8 + 0.0153446553446581*G0_1_1_8_9 + 0.0157100042814355*G0_1_1_9_0 - 0.0157100042814355*G0_1_1_9_2 - 0.0153446553446578*G0_1_1_9_3 + 0.140019980020004*G0_1_1_9_4 - 0.131525617239925*G0_1_1_9_5 + 0.131525617239925*G0_1_1_9_6 - 0.140019980020004*G0_1_1_9_7 + 0.0153446553446581*G0_1_1_9_8; + A[216] = A[104] - 0.0288106954773675*G0_0_1_0_0 - 0.0017362531648249*G0_0_1_0_1 - 0.00220449744259305*G0_0_1_0_2 - 0.00123812695241286*G0_0_1_0_3 + 0.00111380682809272*G0_0_1_0_4 - 0.0174048174048205*G0_0_1_0_5 + 0.0231945831945872*G0_0_1_0_6 - 0.0234432234432276*G0_0_1_0_7 + 0.0099100899100917*G0_0_1_0_8 - 0.0142790542790567*G0_0_1_0_9 - 0.0017362531648249*G0_0_1_1_0 + 0.000979901932283086*G0_0_1_1_1 + 0.000153638248876388*G0_0_1_1_2 + 0.000616526330812182*G0_0_1_1_3 - 0.00127872127872149*G0_0_1_1_4 + 0.00252192252192291*G0_0_1_1_5 + 0.00447045018473668*G0_0_1_1_6 - 0.000527726242012108*G0_0_1_1_7 + 0.000575932004503593*G0_0_1_1_8 + 0.0146444032158343*G0_0_1_1_9 - 0.00220449744259305*G0_0_1_2_0 + 0.000153638248876388*G0_0_1_2_1 - 0.0137344137344157*G0_0_1_2_2 + 0.00197389911675652*G0_0_1_2_3 - 0.00824064824064946*G0_0_1_2_4 + 0.00545486259772058*G0_0_1_2_5 + 0.016126096126099*G0_0_1_2_6 + 0.000809349380778074*G0_0_1_2_7 - 0.00233417376274557*G0_0_1_2_8 + 0.0115389372532249*G0_0_1_2_9 - 0.00123812695241286*G0_0_1_3_0 + 0.000616526330812182*G0_0_1_3_1 + 0.00197389911675652*G0_0_1_3_2 + 0.00447552447552536*G0_0_1_3_3 + 0.0035849864421298*G0_0_1_3_4 + 0.00105037819323552*G0_0_1_3_5 - 0.0193634936492112*G0_0_1_3_6 - 0.00223776223776261*G0_0_1_3_7 + 0.00118738404452715*G0_0_1_3_8 - 0.0394576851719775*G0_0_1_3_9 + 0.00111380682809272*G0_0_1_4_0 - 0.00127872127872149*G0_0_1_4_1 - 0.00824064824064948*G0_0_1_4_2 + 0.00358498644212979*G0_0_1_4_3 - 0.0268988154702487*G0_0_1_4_4 - 0.00929356357927941*G0_0_1_4_5 + 0.0286570572284906*G0_0_1_4_6 + 0.00105037819323548*G0_0_1_4_8 - 0.016029684601116*G0_0_1_4_9 - 0.0174048174048205*G0_0_1_5_0 + 0.00252192252192291*G0_0_1_5_1 + 0.00545486259772058*G0_0_1_5_2 + 0.00105037819323552*G0_0_1_5_3 - 0.00929356357927941*G0_0_1_5_4 + 0.0255744255744297*G0_0_1_5_5 - 0.100470957613832*G0_0_1_5_6 + 0.0218981018981055*G0_0_1_5_7 - 0.01351791066077*G0_0_1_5_8 + 0.0698729841587102*G0_0_1_5_9 + 0.0231945831945872*G0_0_1_6_0 + 0.00447045018473668*G0_0_1_6_1 + 0.016126096126099*G0_0_1_6_2 - 0.0193634936492112*G0_0_1_6_3 + 0.0286570572284906*G0_0_1_6_4 - 0.100470957613832*G0_0_1_6_5 + 0.192721564150168*G0_0_1_6_6 - 0.00838019123733542*G0_0_1_6_7 - 0.000228343085486006*G0_0_1_6_8 + 0.00411017553874756*G0_0_1_6_9 - 0.0234432234432276*G0_0_1_7_0 - 0.000527726242012107*G0_0_1_7_1 + 0.000809349380778074*G0_0_1_7_2 - 0.00223776223776261*G0_0_1_7_3 + 0.0218981018981055*G0_0_1_7_5 - 0.00838019123733542*G0_0_1_7_6 - 0.0405994005994077*G0_0_1_7_7 + 0.00248893963179732*G0_0_1_7_8 + 0.059597545311841*G0_0_1_7_9 + 0.0099100899100917*G0_0_1_8_0 + 0.000575932004503592*G0_0_1_8_1 - 0.00233417376274557*G0_0_1_8_2 + 0.00118738404452715*G0_0_1_8_3 + 0.00105037819323548*G0_0_1_8_4 - 0.01351791066077*G0_0_1_8_5 - 0.000228343085486008*G0_0_1_8_6 + 0.00248893963179732*G0_0_1_8_7 + 0.00118738404452746*G0_0_1_8_8 - 0.0460339660339737*G0_0_1_8_9 - 0.0142790542790567*G0_0_1_9_0 + 0.0146444032158343*G0_0_1_9_1 + 0.0115389372532249*G0_0_1_9_2 - 0.0394576851719775*G0_0_1_9_3 - 0.016029684601116*G0_0_1_9_4 + 0.0698729841587102*G0_0_1_9_5 + 0.00411017553874758*G0_0_1_9_6 + 0.059597545311841*G0_0_1_9_7 - 0.0460339660339737*G0_0_1_9_8 - 0.0328814043099815*G0_0_1_9_9 + 0.0288106954773675*G0_1_0_0_0 + 0.0017362531648249*G0_1_0_0_1 + 0.00220449744259305*G0_1_0_0_2 + 0.00123812695241286*G0_1_0_0_3 - 0.00111380682809272*G0_1_0_0_4 + 0.0174048174048205*G0_1_0_0_5 - 0.0231945831945872*G0_1_0_0_6 + 0.0234432234432276*G0_1_0_0_7 - 0.0099100899100917*G0_1_0_0_8 + 0.0142790542790567*G0_1_0_0_9 + 0.0017362531648249*G0_1_0_1_0 - 0.000979901932283086*G0_1_0_1_1 - 0.000153638248876388*G0_1_0_1_2 - 0.000616526330812182*G0_1_0_1_3 + 0.00127872127872149*G0_1_0_1_4 - 0.00252192252192291*G0_1_0_1_5 - 0.00447045018473668*G0_1_0_1_6 + 0.000527726242012107*G0_1_0_1_7 - 0.000575932004503592*G0_1_0_1_8 - 0.0146444032158343*G0_1_0_1_9 + 0.00220449744259305*G0_1_0_2_0 - 0.000153638248876388*G0_1_0_2_1 + 0.0137344137344157*G0_1_0_2_2 - 0.00197389911675652*G0_1_0_2_3 + 0.00824064824064945*G0_1_0_2_4 - 0.00545486259772059*G0_1_0_2_5 - 0.016126096126099*G0_1_0_2_6 - 0.000809349380778075*G0_1_0_2_7 + 0.00233417376274557*G0_1_0_2_8 - 0.0115389372532249*G0_1_0_2_9 + 0.00123812695241286*G0_1_0_3_0 - 0.000616526330812182*G0_1_0_3_1 - 0.00197389911675652*G0_1_0_3_2 - 0.00447552447552535*G0_1_0_3_3 - 0.00358498644212979*G0_1_0_3_4 - 0.00105037819323551*G0_1_0_3_5 + 0.0193634936492112*G0_1_0_3_6 + 0.00223776223776261*G0_1_0_3_7 - 0.00118738404452715*G0_1_0_3_8 + 0.0394576851719775*G0_1_0_3_9 - 0.00111380682809272*G0_1_0_4_0 + 0.00127872127872149*G0_1_0_4_1 + 0.00824064824064947*G0_1_0_4_2 - 0.00358498644212978*G0_1_0_4_3 + 0.0268988154702487*G0_1_0_4_4 + 0.00929356357927941*G0_1_0_4_5 - 0.0286570572284906*G0_1_0_4_6 - 0.00105037819323548*G0_1_0_4_8 + 0.016029684601116*G0_1_0_4_9 + 0.0174048174048205*G0_1_0_5_0 - 0.00252192252192291*G0_1_0_5_1 - 0.00545486259772059*G0_1_0_5_2 - 0.00105037819323551*G0_1_0_5_3 + 0.00929356357927941*G0_1_0_5_4 - 0.0255744255744297*G0_1_0_5_5 + 0.100470957613832*G0_1_0_5_6 - 0.0218981018981055*G0_1_0_5_7 + 0.01351791066077*G0_1_0_5_8 - 0.0698729841587102*G0_1_0_5_9 - 0.0231945831945872*G0_1_0_6_0 - 0.00447045018473668*G0_1_0_6_1 - 0.016126096126099*G0_1_0_6_2 + 0.0193634936492112*G0_1_0_6_3 - 0.0286570572284906*G0_1_0_6_4 + 0.100470957613832*G0_1_0_6_5 - 0.192721564150168*G0_1_0_6_6 + 0.00838019123733542*G0_1_0_6_7 + 0.000228343085486001*G0_1_0_6_8 - 0.00411017553874756*G0_1_0_6_9 + 0.0234432234432276*G0_1_0_7_0 + 0.000527726242012106*G0_1_0_7_1 - 0.000809349380778074*G0_1_0_7_2 + 0.00223776223776261*G0_1_0_7_3 - 0.0218981018981055*G0_1_0_7_5 + 0.00838019123733543*G0_1_0_7_6 + 0.0405994005994077*G0_1_0_7_7 - 0.00248893963179731*G0_1_0_7_8 - 0.059597545311841*G0_1_0_7_9 - 0.0099100899100917*G0_1_0_8_0 - 0.000575932004503592*G0_1_0_8_1 + 0.00233417376274557*G0_1_0_8_2 - 0.00118738404452715*G0_1_0_8_3 - 0.00105037819323548*G0_1_0_8_4 + 0.01351791066077*G0_1_0_8_5 + 0.000228343085486004*G0_1_0_8_6 - 0.00248893963179732*G0_1_0_8_7 - 0.00118738404452745*G0_1_0_8_8 + 0.0460339660339737*G0_1_0_8_9 + 0.0142790542790567*G0_1_0_9_0 - 0.0146444032158343*G0_1_0_9_1 - 0.0115389372532249*G0_1_0_9_2 + 0.0394576851719775*G0_1_0_9_3 + 0.016029684601116*G0_1_0_9_4 - 0.0698729841587102*G0_1_0_9_5 - 0.00411017553874757*G0_1_0_9_6 - 0.059597545311841*G0_1_0_9_7 + 0.0460339660339737*G0_1_0_9_8 + 0.0328814043099814*G0_1_0_9_9; + A[148] = A[216] - 0.0482283148949898*G0_0_0_0_0 - 0.00227440989345789*G0_0_0_0_1 - 0.00665098569860591*G0_0_0_0_2 + 0.0117013145584595*G0_0_0_0_3 - 0.0108665937237385*G0_0_0_0_4 - 0.0727272727272851*G0_0_0_0_5 + 0.0111888111888131*G0_0_0_0_6 - 0.0164280164280192*G0_0_0_0_7 + 0.013675213675216*G0_0_0_0_8 + 0.00106560106560122*G0_0_0_0_9 - 0.00227440989345789*G0_0_0_1_0 + 0.0398072474263018*G0_0_0_1_1 - 0.00101965054346027*G0_0_0_1_2 + 0.0697588126159674*G0_0_0_1_3 - 0.0383616383616449*G0_0_0_1_4 - 0.00272996844425459*G0_0_0_1_5 - 0.00419897562754781*G0_0_0_1_6 - 0.012066663495237*G0_0_0_1_7 + 0.0142308485165652*G0_0_0_1_8 - 0.00578469149897814*G0_0_0_1_9 - 0.00665098569860591*G0_0_0_2_0 - 0.00101965054346027*G0_0_0_2_1 - 0.0302393902393957*G0_0_0_2_2 + 0.038361638361645*G0_0_0_2_3 - 0.0611198325484146*G0_0_0_2_4 - 0.0147560376131829*G0_0_0_2_5 - 0.01936856794*G0_0_0_2_6 - 0.0142612942612966*G0_0_0_2_7 + 0.00656359513502482*G0_0_0_2_8 - 0.0231083202511813*G0_0_0_2_9 + 0.0117013145584595*G0_0_0_3_0 + 0.0697588126159674*G0_0_0_3_1 + 0.038361638361645*G0_0_0_3_2 + 0.316803196803251*G0_0_0_3_3 - 0.000296846011131752*G0_0_0_3_4 - 0.0204138718424467*G0_0_0_3_5 + 0.0265106322249224*G0_0_0_3_6 - 0.0211902383330991*G0_0_0_3_7 + 0.0269673183958945*G0_0_0_3_8 + 0.0597345511631328*G0_0_0_3_9 - 0.0108665937237385*G0_0_0_4_0 - 0.0383616383616449*G0_0_0_4_1 - 0.0611198325484146*G0_0_0_4_2 - 0.000296846011131745*G0_0_0_4_3 - 0.353566433566494*G0_0_0_4_4 + 0.0465134865134944*G0_0_0_4_5 - 0.0730241187384169*G0_0_0_4_6 + 0.0307349793064131*G0_0_0_4_7 - 0.00577708006279537*G0_0_0_4_8 - 0.0237020122734448*G0_0_0_4_9 - 0.0727272727272851*G0_0_0_5_0 - 0.00272996844425459*G0_0_0_5_1 - 0.0147560376131829*G0_0_0_5_2 - 0.0204138718424467*G0_0_0_5_3 + 0.0465134865134944*G0_0_0_5_4 - 0.141618381618405*G0_0_0_5_5 + 0.17315256172402*G0_0_0_5_6 - 0.0788011988012119*G0_0_0_5_7 + 0.022103610675043*G0_0_0_5_8 - 0.0474040245468897*G0_0_0_5_9 + 0.0111888111888131*G0_0_0_6_0 - 0.00419897562754781*G0_0_0_6_1 - 0.01936856794*G0_0_0_6_2 + 0.0265106322249224*G0_0_0_6_3 - 0.0730241187384169*G0_0_0_6_4 + 0.17315256172402*G0_0_0_6_5 - 0.2247809333524*G0_0_0_6_6 + 0.056697588126169*G0_0_0_6_7 - 0.0105037819323551*G0_0_0_6_8 + 0.0163036963036992*G0_0_0_6_9 - 0.0164280164280192*G0_0_0_7_0 - 0.012066663495237*G0_0_0_7_1 - 0.0142612942612966*G0_0_0_7_2 - 0.0211902383330991*G0_0_0_7_3 + 0.0307349793064131*G0_0_0_7_4 - 0.0788011988012119*G0_0_0_7_5 + 0.056697588126169*G0_0_0_7_6 - 0.135544455544478*G0_0_0_7_7 + 0.0239303553589308*G0_0_0_7_8 - 0.116591979449142*G0_0_0_7_9 + 0.013675213675216*G0_0_0_8_0 + 0.0142308485165652*G0_0_0_8_1 + 0.00656359513502482*G0_0_0_8_2 + 0.0269673183958945*G0_0_0_8_3 - 0.00577708006279538*G0_0_0_8_4 + 0.022103610675043*G0_0_0_8_5 - 0.0105037819323551*G0_0_0_8_6 + 0.0239303553589308*G0_0_0_8_7 - 0.0212815755672934*G0_0_0_8_8 + 0.0289082346225252*G0_0_0_8_9 + 0.00106560106560123*G0_0_0_9_0 - 0.00578469149897814*G0_0_0_9_1 - 0.0231083202511813*G0_0_0_9_2 + 0.0597345511631328*G0_0_0_9_3 - 0.0237020122734448*G0_0_0_9_4 - 0.0474040245468897*G0_0_0_9_5 + 0.0163036963036992*G0_0_0_9_6 - 0.116591979449142*G0_0_0_9_7 + 0.0289082346225252*G0_0_0_9_8 - 0.0279491936634838*G0_0_0_9_9 + 0.000158430634621186*G0_0_1_0_1 - 0.000158430634621125*G0_0_1_0_2 + 0.0129927215641524*G0_0_1_0_3 - 0.0129927215641524*G0_0_1_0_4 - 0.00310800310800324*G0_0_1_0_5 - 0.0181862581862615*G0_0_1_0_6 + 0.00310800310800403*G0_0_1_0_7 + 0.0181862581862611*G0_0_1_0_8 + 0.000158430634621186*G0_0_1_1_0 + 0.0283359673835912*G0_0_1_1_1 + 0.0619444048015582*G0_0_1_1_3 - 0.0374685631828553*G0_0_1_1_4 + 0.00746681889539161*G0_0_1_1_5 - 0.00929356357927946*G0_0_1_1_6 - 0.00289234574948907*G0_0_1_1_7 + 0.0285048285048333*G0_0_1_1_8 + 0.00748965320394022*G0_0_1_1_9 - 0.000158430634621125*G0_0_1_2_0 - 0.0283359673835915*G0_0_1_2_2 + 0.0374685631828553*G0_0_1_2_3 - 0.0619444048015584*G0_0_1_2_4 + 0.00289234574948919*G0_0_1_2_5 - 0.0285048285048334*G0_0_1_2_6 - 0.00746681889539155*G0_0_1_2_7 + 0.00929356357927941*G0_0_1_2_8 - 0.00748965320394018*G0_0_1_2_9 + 0.0129927215641524*G0_0_1_3_0 + 0.0619444048015582*G0_0_1_3_1 + 0.0374685631828553*G0_0_1_3_2 + 0.323744826602024*G0_0_1_3_3 - 0.0306893106893158*G0_0_1_3_5 + 0.0278806907378383*G0_0_1_3_6 - 0.038978164692457*G0_0_1_3_7 + 0.0668588554302953*G0_0_1_3_8 + 0.0554873697730935*G0_0_1_3_9 - 0.0129927215641524*G0_0_1_4_0 - 0.0374685631828553*G0_0_1_4_1 - 0.0619444048015584*G0_0_1_4_2 - 0.323744826602025*G0_0_1_4_4 + 0.038978164692457*G0_0_1_4_5 - 0.0668588554302954*G0_0_1_4_6 + 0.0306893106893158*G0_0_1_4_7 - 0.0278806907378383*G0_0_1_4_8 - 0.0554873697730934*G0_0_1_4_9 - 0.00310800310800324*G0_0_1_5_0 + 0.00746681889539161*G0_0_1_5_1 + 0.00289234574948919*G0_0_1_5_2 - 0.0306893106893158*G0_0_1_5_3 + 0.038978164692457*G0_0_1_5_4 + 0.08535464535466*G0_0_1_5_5 + 0.0960411017554036*G0_0_1_5_6 - 0.0224004566861748*G0_0_1_5_8 + 0.0448009133723495*G0_0_1_5_9 - 0.0181862581862615*G0_0_1_6_0 - 0.00929356357927946*G0_0_1_6_1 - 0.0285048285048334*G0_0_1_6_2 + 0.0278806907378383*G0_0_1_6_3 - 0.0668588554302953*G0_0_1_6_4 + 0.0960411017554036*G0_0_1_6_5 - 0.189205080633684*G0_0_1_6_6 + 0.0224004566861746*G0_0_1_6_7 - 0.0332924218638559*G0_0_1_6_9 + 0.00310800310800403*G0_0_1_7_0 - 0.00289234574948907*G0_0_1_7_1 - 0.00746681889539156*G0_0_1_7_2 - 0.038978164692457*G0_0_1_7_3 + 0.0306893106893158*G0_0_1_7_4 + 0.0224004566861746*G0_0_1_7_6 - 0.0853546453546593*G0_0_1_7_7 - 0.0960411017554038*G0_0_1_7_8 - 0.0448009133723495*G0_0_1_7_9 + 0.0181862581862611*G0_0_1_8_0 + 0.0285048285048333*G0_0_1_8_1 + 0.00929356357927941*G0_0_1_8_2 + 0.0668588554302953*G0_0_1_8_3 - 0.0278806907378383*G0_0_1_8_4 - 0.0224004566861748*G0_0_1_8_5 - 0.0960411017554038*G0_0_1_8_7 + 0.189205080633684*G0_0_1_8_8 + 0.0332924218638561*G0_0_1_8_9 + 0.00748965320394022*G0_0_1_9_1 - 0.00748965320394018*G0_0_1_9_2 + 0.0554873697730935*G0_0_1_9_3 - 0.0554873697730934*G0_0_1_9_4 + 0.0448009133723495*G0_0_1_9_5 - 0.033292421863856*G0_0_1_9_6 - 0.0448009133723495*G0_0_1_9_7 + 0.0332924218638561*G0_0_1_9_8 + 0.000626674912389321*G0_1_0_0_1 - 0.00062667491238932*G0_1_0_0_2 + 0.0106407877836468*G0_1_0_0_3 - 0.0106407877836468*G0_1_0_0_4 + 0.0029304029304034*G0_1_0_0_5 - 0.00490176490176571*G0_1_0_0_6 - 0.0029304029304034*G0_1_0_0_7 + 0.00490176490176573*G0_1_0_0_8 + 0.000626674912389321*G0_1_0_1_0 + 0.0430502830502904*G0_1_0_1_1 + 0.0708015793730201*G0_1_0_1_3 - 0.0407211835783334*G0_1_0_1_4 + 0.00917939203653643*G0_1_0_1_5 - 0.0024889396317972*G0_1_0_1_6 - 0.00887493458922184*G0_1_0_1_7 + 0.0129546643832381*G0_1_0_1_8 + 0.0105951191665496*G0_1_0_1_9 - 0.00062667491238932*G0_1_0_2_0 - 0.0430502830502903*G0_1_0_2_2 + 0.0407211835783333*G0_1_0_2_3 - 0.07080157937302*G0_1_0_2_4 + 0.00887493458922182*G0_1_0_2_5 - 0.012954664383238*G0_1_0_2_6 - 0.00917939203653643*G0_1_0_2_7 + 0.00248893963179721*G0_1_0_2_8 - 0.0105951191665495*G0_1_0_2_9 + 0.0106407877836468*G0_1_0_3_0 + 0.0708015793730201*G0_1_0_3_1 + 0.0407211835783333*G0_1_0_3_2 + 0.355119166547799*G0_1_0_3_3 - 0.0297302697302747*G0_1_0_3_5 + 0.00746681889539157*G0_1_0_3_6 - 0.0319223633509403*G0_1_0_3_7 + 0.0393891822463319*G0_1_0_3_8 + 0.0320593692022321*G0_1_0_3_9 - 0.0106407877836468*G0_1_0_4_0 - 0.0407211835783334*G0_1_0_4_1 - 0.07080157937302*G0_1_0_4_2 - 0.355119166547799*G0_1_0_4_4 + 0.0319223633509402*G0_1_0_4_5 - 0.0393891822463318*G0_1_0_4_6 + 0.0297302697302747*G0_1_0_4_7 - 0.00746681889539166*G0_1_0_4_8 - 0.0320593692022318*G0_1_0_4_9 + 0.0029304029304034*G0_1_0_5_0 + 0.00917939203653643*G0_1_0_5_1 + 0.00887493458922182*G0_1_0_5_2 - 0.0297302697302747*G0_1_0_5_3 + 0.0319223633509402*G0_1_0_5_4 + 0.151528471528497*G0_1_0_5_5 - 0.00691879549022521*G0_1_0_5_6 - 0.0275381761096093*G0_1_0_5_8 + 0.0550763522192187*G0_1_0_5_9 - 0.00490176490176571*G0_1_0_6_0 - 0.0024889396317972*G0_1_0_6_1 - 0.012954664383238*G0_1_0_6_2 + 0.00746681889539157*G0_1_0_6_3 - 0.0393891822463318*G0_1_0_6_4 - 0.00691879549022521*G0_1_0_6_5 + 0.002329099471957*G0_1_0_6_6 + 0.0275381761096093*G0_1_0_6_7 + 0.0168517197088654*G0_1_0_6_9 - 0.0029304029304034*G0_1_0_7_0 - 0.00887493458922184*G0_1_0_7_1 - 0.00917939203653643*G0_1_0_7_2 - 0.0319223633509403*G0_1_0_7_3 + 0.0297302697302747*G0_1_0_7_4 + 0.0275381761096093*G0_1_0_7_6 - 0.151528471528496*G0_1_0_7_7 + 0.00691879549022507*G0_1_0_7_8 - 0.0550763522192186*G0_1_0_7_9 + 0.00490176490176574*G0_1_0_8_0 + 0.0129546643832381*G0_1_0_8_1 + 0.00248893963179721*G0_1_0_8_2 + 0.0393891822463319*G0_1_0_8_3 - 0.00746681889539166*G0_1_0_8_4 - 0.0275381761096093*G0_1_0_8_5 + 0.00691879549022507*G0_1_0_8_7 - 0.00232909947195655*G0_1_0_8_8 - 0.0168517197088653*G0_1_0_8_9 + 0.0105951191665496*G0_1_0_9_1 - 0.0105951191665495*G0_1_0_9_2 + 0.0320593692022321*G0_1_0_9_3 - 0.0320593692022318*G0_1_0_9_4 + 0.0550763522192187*G0_1_0_9_5 + 0.0168517197088654*G0_1_0_9_6 - 0.0550763522192186*G0_1_0_9_7 - 0.0168517197088653*G0_1_0_9_8 + 0.04822831489499*G0_1_1_0_0 + 0.0066509856986059*G0_1_1_0_1 + 0.00227440989345788*G0_1_1_0_2 + 0.0108665937237385*G0_1_1_0_3 - 0.0117013145584594*G0_1_1_0_4 + 0.0164280164280192*G0_1_1_0_5 - 0.013675213675216*G0_1_1_0_6 + 0.0727272727272851*G0_1_1_0_7 - 0.0111888111888131*G0_1_1_0_8 - 0.00106560106560119*G0_1_1_0_9 + 0.0066509856986059*G0_1_1_1_0 + 0.0302393902393954*G0_1_1_1_1 + 0.00101965054346022*G0_1_1_1_2 + 0.0611198325484144*G0_1_1_1_3 - 0.0383616383616449*G0_1_1_1_4 + 0.0142612942612967*G0_1_1_1_5 - 0.00656359513502481*G0_1_1_1_6 + 0.0147560376131829*G0_1_1_1_7 + 0.0193685679399998*G0_1_1_1_8 + 0.0231083202511813*G0_1_1_1_9 + 0.00227440989345788*G0_1_1_2_0 + 0.00101965054346022*G0_1_1_2_1 - 0.0398072474263018*G0_1_1_2_2 + 0.0383616383616449*G0_1_1_2_3 - 0.0697588126159674*G0_1_1_2_4 + 0.012066663495237*G0_1_1_2_5 - 0.0142308485165652*G0_1_1_2_6 + 0.0027299684442546*G0_1_1_2_7 + 0.00419897562754775*G0_1_1_2_8 + 0.00578469149897818*G0_1_1_2_9 + 0.0108665937237385*G0_1_1_3_0 + 0.0611198325484144*G0_1_1_3_1 + 0.0383616383616449*G0_1_1_3_2 + 0.353566433566494*G0_1_1_3_3 + 0.000296846011131925*G0_1_1_3_4 - 0.030734979306413*G0_1_1_3_5 + 0.00577708006279533*G0_1_1_3_6 - 0.0465134865134945*G0_1_1_3_7 + 0.0730241187384168*G0_1_1_3_8 + 0.0237020122734451*G0_1_1_3_9 - 0.0117013145584594*G0_1_1_4_0 - 0.0383616383616449*G0_1_1_4_1 - 0.0697588126159674*G0_1_1_4_2 + 0.000296846011131925*G0_1_1_4_3 - 0.316803196803251*G0_1_1_4_4 + 0.021190238333099*G0_1_1_4_5 - 0.0269673183958944*G0_1_1_4_6 + 0.0204138718424467*G0_1_1_4_7 - 0.0265106322249224*G0_1_1_4_8 - 0.0597345511631326*G0_1_1_4_9 + 0.0164280164280192*G0_1_1_5_0 + 0.0142612942612966*G0_1_1_5_1 + 0.012066663495237*G0_1_1_5_2 - 0.030734979306413*G0_1_1_5_3 + 0.021190238333099*G0_1_1_5_4 + 0.135544455544478*G0_1_1_5_5 - 0.0239303553589308*G0_1_1_5_6 + 0.0788011988012119*G0_1_1_5_7 - 0.056697588126169*G0_1_1_5_8 + 0.116591979449142*G0_1_1_5_9 - 0.013675213675216*G0_1_1_6_0 - 0.00656359513502481*G0_1_1_6_1 - 0.0142308485165652*G0_1_1_6_2 + 0.00577708006279534*G0_1_1_6_3 - 0.0269673183958944*G0_1_1_6_4 - 0.0239303553589308*G0_1_1_6_5 + 0.0212815755672934*G0_1_1_6_6 - 0.0221036106750429*G0_1_1_6_7 + 0.0105037819323551*G0_1_1_6_8 - 0.0289082346225252*G0_1_1_6_9 + 0.0727272727272851*G0_1_1_7_0 + 0.0147560376131829*G0_1_1_7_1 + 0.0027299684442546*G0_1_1_7_2 - 0.0465134865134945*G0_1_1_7_3 + 0.0204138718424467*G0_1_1_7_4 + 0.0788011988012119*G0_1_1_7_5 - 0.0221036106750429*G0_1_1_7_6 + 0.141618381618406*G0_1_1_7_7 - 0.173152561724019*G0_1_1_7_8 + 0.0474040245468896*G0_1_1_7_9 - 0.0111888111888131*G0_1_1_8_0 + 0.0193685679399998*G0_1_1_8_1 + 0.00419897562754775*G0_1_1_8_2 + 0.0730241187384168*G0_1_1_8_3 - 0.0265106322249224*G0_1_1_8_4 - 0.056697588126169*G0_1_1_8_5 + 0.0105037819323551*G0_1_1_8_6 - 0.173152561724019*G0_1_1_8_7 + 0.2247809333524*G0_1_1_8_8 - 0.0163036963036991*G0_1_1_8_9 - 0.00106560106560119*G0_1_1_9_0 + 0.0231083202511813*G0_1_1_9_1 + 0.00578469149897818*G0_1_1_9_2 + 0.0237020122734451*G0_1_1_9_3 - 0.0597345511631326*G0_1_1_9_4 + 0.116591979449142*G0_1_1_9_5 - 0.0289082346225252*G0_1_1_9_6 + 0.0474040245468896*G0_1_1_9_7 - 0.0163036963036991*G0_1_1_9_8 + 0.027949193663484*G0_1_1_9_9; + A[204] = A[148] + 0.0288106954773665*G0_0_1_0_0 + 0.00220449744259304*G0_0_1_0_1 + 0.00173625316482486*G0_0_1_0_2 - 0.0011138068280927*G0_0_1_0_3 + 0.00123812695241288*G0_0_1_0_4 + 0.0234432234432271*G0_0_1_0_5 - 0.00991008991009147*G0_0_1_0_6 + 0.0174048174048202*G0_0_1_0_7 - 0.023194583194587*G0_0_1_0_8 + 0.0142790542790567*G0_0_1_0_9 + 0.00220449744259304*G0_0_1_1_0 + 0.0137344137344161*G0_0_1_1_1 - 0.000153638248876366*G0_0_1_1_2 + 0.00824064824064967*G0_0_1_1_3 - 0.00197389911675662*G0_0_1_1_4 - 0.000809349380778099*G0_0_1_1_5 + 0.00233417376274558*G0_0_1_1_6 - 0.00545486259772066*G0_0_1_1_7 - 0.0161260961260988*G0_0_1_1_8 - 0.0115389372532249*G0_0_1_1_9 + 0.00173625316482486*G0_0_1_2_0 - 0.000153638248876366*G0_0_1_2_1 - 0.000979901932283064*G0_0_1_2_2 + 0.00127872127872152*G0_0_1_2_3 - 0.000616526330812191*G0_0_1_2_4 + 0.000527726242012041*G0_0_1_2_5 - 0.00057593200450355*G0_0_1_2_6 - 0.00252192252192295*G0_0_1_2_7 - 0.00447045018473663*G0_0_1_2_8 - 0.0146444032158343*G0_0_1_2_9 - 0.0011138068280927*G0_0_1_3_0 + 0.00824064824064968*G0_0_1_3_1 + 0.00127872127872152*G0_0_1_3_2 + 0.0268988154702494*G0_0_1_3_3 - 0.00358498644212991*G0_0_1_3_4 - 0.00105037819323552*G0_0_1_3_6 + 0.00929356357927931*G0_0_1_3_7 - 0.0286570572284905*G0_0_1_3_8 + 0.0160296846011161*G0_0_1_3_9 + 0.00123812695241288*G0_0_1_4_0 - 0.00197389911675662*G0_0_1_4_1 - 0.000616526330812191*G0_0_1_4_2 - 0.0035849864421299*G0_0_1_4_3 - 0.00447552447552509*G0_0_1_4_4 + 0.00223776223776259*G0_0_1_4_5 - 0.00118738404452708*G0_0_1_4_6 - 0.00105037819323552*G0_0_1_4_7 + 0.0193634936492111*G0_0_1_4_8 + 0.0394576851719776*G0_0_1_4_9 + 0.0234432234432271*G0_0_1_5_0 - 0.000809349380778099*G0_0_1_5_1 + 0.00052772624201204*G0_0_1_5_2 + 0.00223776223776259*G0_0_1_5_4 + 0.0405994005994073*G0_0_1_5_5 - 0.00248893963179709*G0_0_1_5_6 - 0.0218981018981056*G0_0_1_5_7 + 0.00838019123733554*G0_0_1_5_8 - 0.0595975453118411*G0_0_1_5_9 - 0.00991008991009147*G0_0_1_6_0 + 0.00233417376274558*G0_0_1_6_1 - 0.000575932004503549*G0_0_1_6_2 - 0.00105037819323552*G0_0_1_6_3 - 0.00118738404452708*G0_0_1_6_4 - 0.00248893963179709*G0_0_1_6_5 - 0.00118738404452717*G0_0_1_6_6 + 0.0135179106607701*G0_0_1_6_7 + 0.000228343085485945*G0_0_1_6_8 + 0.0460339660339738*G0_0_1_6_9 + 0.0174048174048202*G0_0_1_7_0 - 0.00545486259772066*G0_0_1_7_1 - 0.00252192252192294*G0_0_1_7_2 + 0.00929356357927931*G0_0_1_7_3 - 0.00105037819323552*G0_0_1_7_4 - 0.0218981018981056*G0_0_1_7_5 + 0.0135179106607701*G0_0_1_7_6 - 0.0255744255744293*G0_0_1_7_7 + 0.100470957613832*G0_0_1_7_8 - 0.0698729841587101*G0_0_1_7_9 - 0.023194583194587*G0_0_1_8_0 - 0.0161260961260988*G0_0_1_8_1 - 0.00447045018473663*G0_0_1_8_2 - 0.0286570572284905*G0_0_1_8_3 + 0.0193634936492111*G0_0_1_8_4 + 0.00838019123733554*G0_0_1_8_5 + 0.000228343085485942*G0_0_1_8_6 + 0.100470957613832*G0_0_1_8_7 - 0.192721564150168*G0_0_1_8_8 - 0.00411017553874769*G0_0_1_8_9 + 0.0142790542790567*G0_0_1_9_0 - 0.0115389372532249*G0_0_1_9_1 - 0.0146444032158343*G0_0_1_9_2 + 0.016029684601116*G0_0_1_9_3 + 0.0394576851719776*G0_0_1_9_4 - 0.059597545311841*G0_0_1_9_5 + 0.0460339660339738*G0_0_1_9_6 - 0.0698729841587101*G0_0_1_9_7 - 0.00411017553874768*G0_0_1_9_8 + 0.0328814043099818*G0_0_1_9_9 - 0.0288106954773665*G0_1_0_0_0 - 0.00220449744259304*G0_1_0_0_1 - 0.00173625316482486*G0_1_0_0_2 + 0.0011138068280927*G0_1_0_0_3 - 0.00123812695241288*G0_1_0_0_4 - 0.0234432234432271*G0_1_0_0_5 + 0.00991008991009147*G0_1_0_0_6 - 0.0174048174048202*G0_1_0_0_7 + 0.023194583194587*G0_1_0_0_8 - 0.0142790542790567*G0_1_0_0_9 - 0.00220449744259304*G0_1_0_1_0 - 0.0137344137344161*G0_1_0_1_1 + 0.000153638248876366*G0_1_0_1_2 - 0.00824064824064968*G0_1_0_1_3 + 0.00197389911675662*G0_1_0_1_4 + 0.000809349380778099*G0_1_0_1_5 - 0.00233417376274558*G0_1_0_1_6 + 0.00545486259772066*G0_1_0_1_7 + 0.0161260961260988*G0_1_0_1_8 + 0.0115389372532249*G0_1_0_1_9 - 0.00173625316482486*G0_1_0_2_0 + 0.000153638248876366*G0_1_0_2_1 + 0.000979901932283064*G0_1_0_2_2 - 0.00127872127872152*G0_1_0_2_3 + 0.000616526330812191*G0_1_0_2_4 - 0.000527726242012041*G0_1_0_2_5 + 0.00057593200450355*G0_1_0_2_6 + 0.00252192252192295*G0_1_0_2_7 + 0.00447045018473663*G0_1_0_2_8 + 0.0146444032158343*G0_1_0_2_9 + 0.0011138068280927*G0_1_0_3_0 - 0.00824064824064968*G0_1_0_3_1 - 0.00127872127872152*G0_1_0_3_2 - 0.0268988154702494*G0_1_0_3_3 + 0.00358498644212994*G0_1_0_3_4 + 0.00105037819323552*G0_1_0_3_6 - 0.00929356357927931*G0_1_0_3_7 + 0.0286570572284905*G0_1_0_3_8 - 0.0160296846011161*G0_1_0_3_9 - 0.00123812695241288*G0_1_0_4_0 + 0.00197389911675662*G0_1_0_4_1 + 0.000616526330812191*G0_1_0_4_2 + 0.00358498644212991*G0_1_0_4_3 + 0.00447552447552509*G0_1_0_4_4 - 0.0022377622377626*G0_1_0_4_5 + 0.00118738404452708*G0_1_0_4_6 + 0.00105037819323552*G0_1_0_4_7 - 0.0193634936492111*G0_1_0_4_8 - 0.0394576851719776*G0_1_0_4_9 - 0.0234432234432271*G0_1_0_5_0 + 0.000809349380778099*G0_1_0_5_1 - 0.00052772624201204*G0_1_0_5_2 - 0.00223776223776259*G0_1_0_5_4 - 0.0405994005994073*G0_1_0_5_5 + 0.00248893963179709*G0_1_0_5_6 + 0.0218981018981056*G0_1_0_5_7 - 0.00838019123733554*G0_1_0_5_8 + 0.0595975453118411*G0_1_0_5_9 + 0.00991008991009147*G0_1_0_6_0 - 0.00233417376274558*G0_1_0_6_1 + 0.000575932004503549*G0_1_0_6_2 + 0.00105037819323552*G0_1_0_6_3 + 0.00118738404452708*G0_1_0_6_4 + 0.00248893963179709*G0_1_0_6_5 + 0.00118738404452717*G0_1_0_6_6 - 0.0135179106607701*G0_1_0_6_7 - 0.000228343085485945*G0_1_0_6_8 - 0.0460339660339738*G0_1_0_6_9 - 0.0174048174048202*G0_1_0_7_0 + 0.00545486259772066*G0_1_0_7_1 + 0.00252192252192295*G0_1_0_7_2 - 0.00929356357927931*G0_1_0_7_3 + 0.00105037819323551*G0_1_0_7_4 + 0.0218981018981056*G0_1_0_7_5 - 0.0135179106607701*G0_1_0_7_6 + 0.0255744255744293*G0_1_0_7_7 - 0.100470957613832*G0_1_0_7_8 + 0.0698729841587101*G0_1_0_7_9 + 0.023194583194587*G0_1_0_8_0 + 0.0161260961260988*G0_1_0_8_1 + 0.00447045018473663*G0_1_0_8_2 + 0.0286570572284905*G0_1_0_8_3 - 0.0193634936492111*G0_1_0_8_4 - 0.00838019123733554*G0_1_0_8_5 - 0.000228343085485945*G0_1_0_8_6 - 0.100470957613832*G0_1_0_8_7 + 0.192721564150168*G0_1_0_8_8 + 0.00411017553874768*G0_1_0_8_9 - 0.0142790542790567*G0_1_0_9_0 + 0.0115389372532249*G0_1_0_9_1 + 0.0146444032158343*G0_1_0_9_2 - 0.016029684601116*G0_1_0_9_3 - 0.0394576851719776*G0_1_0_9_4 + 0.059597545311841*G0_1_0_9_5 - 0.0460339660339738*G0_1_0_9_6 + 0.0698729841587101*G0_1_0_9_7 + 0.00411017553874768*G0_1_0_9_8 - 0.0328814043099818*G0_1_0_9_9; + A[183] = -A[191] + 0.0459708193041605*G0_0_0_0_0 + 0.00147718242956362*G0_0_0_0_1 + 0.00411553173458006*G0_0_0_0_2 + 0.000745920745920912*G0_0_0_0_3 + 0.00395033537890748*G0_0_0_0_4 + 0.0641618698761666*G0_0_0_0_5 - 0.0331807874665074*G0_0_0_0_6 + 0.013236287522004*G0_0_0_0_7 - 0.01216307502022*G0_0_0_0_8 - 0.00417106702821049*G0_0_0_0_9 + 0.00147718242956362*G0_0_0_1_0 - 0.0160234826901524*G0_0_0_1_1 - 0.000125447744495398*G0_0_0_1_2 - 0.00612720612720723*G0_0_0_1_3 - 0.00447552447552521*G0_0_0_1_4 + 0.0114932686361277*G0_0_0_1_5 + 0.00102754388468694*G0_0_0_1_6 + 0.00184704184704219*G0_0_0_1_7 + 0.00381840381840437*G0_0_0_1_8 + 0.0306893106893158*G0_0_0_1_9 + 0.00411553173458006*G0_0_0_2_0 - 0.000125447744495397*G0_0_0_2_1 - 0.00722240722240839*G0_0_0_2_2 - 0.00290249433106625*G0_0_0_2_3 - 0.0124776810491118*G0_0_0_2_4 + 0.0185313099598845*G0_0_0_2_5 - 0.0287966002251765*G0_0_0_2_6 + 0.00530517101945761*G0_0_0_2_7 - 0.0132971790114669*G0_0_0_2_8 - 0.0296237096237146*G0_0_0_2_9 + 0.000745920745920911*G0_0_0_3_0 - 0.00612720612720723*G0_0_0_3_1 - 0.00290249433106625*G0_0_0_3_2 + 0.212587412587449*G0_0_0_3_3 + 0.044549735978315*G0_0_0_3_4 - 0.019135150563725*G0_0_0_3_5 - 0.0015298986727561*G0_0_0_3_6 - 0.000685029256458015*G0_0_0_3_7 - 0.0407592407592475*G0_0_0_3_8 - 0.0906978735550314*G0_0_0_3_9 + 0.00395033537890748*G0_0_0_4_0 - 0.00447552447552521*G0_0_0_4_1 - 0.0124776810491118*G0_0_0_4_2 + 0.044549735978315*G0_0_0_4_3 - 0.0289539032396224*G0_0_0_4_4 - 0.0102982731554178*G0_0_0_4_5 + 0.0118281718281739*G0_0_0_4_6 - 0.0146596260882*G0_0_0_4_7 + 0.0414442700157055*G0_0_0_4_8 + 0.109467675181979*G0_0_0_4_9 + 0.0641618698761666*G0_0_0_5_0 + 0.0114932686361277*G0_0_0_5_1 + 0.0185313099598845*G0_0_0_5_2 - 0.019135150563725*G0_0_0_5_3 - 0.0102982731554178*G0_0_0_5_4 + 0.554097331240282*G0_0_0_5_5 - 0.0263279577565336*G0_0_0_5_6 + 0.0472898530041465*G0_0_0_5_7 - 0.0329270729270784*G0_0_0_5_8 + 0.0783673469387885*G0_0_0_5_9 - 0.0331807874665074*G0_0_0_6_0 + 0.00102754388468694*G0_0_0_6_1 - 0.0287966002251765*G0_0_0_6_2 - 0.0015298986727561*G0_0_0_6_3 + 0.0118281718281739*G0_0_0_6_4 - 0.0263279577565336*G0_0_0_6_5 + 0.101841016126748*G0_0_0_6_6 - 0.0143627800770682*G0_0_0_6_7 + 0.0176280861995177*G0_0_0_6_8 + 0.0919309262166561*G0_0_0_6_9 + 0.013236287522004*G0_0_0_7_0 + 0.00184704184704219*G0_0_0_7_1 + 0.00530517101945761*G0_0_0_7_2 - 0.000685029256458018*G0_0_0_7_3 - 0.0146596260882*G0_0_0_7_4 + 0.0472898530041465*G0_0_0_7_5 - 0.0143627800770682*G0_0_0_7_6 - 0.0131525617239926*G0_0_0_7_7 + 0.0189068074782392*G0_0_0_7_8 + 0.041238761238768*G0_0_0_7_9 - 0.01216307502022*G0_0_0_8_0 + 0.00381840381840438*G0_0_0_8_1 - 0.0132971790114669*G0_0_0_8_2 - 0.0407592407592475*G0_0_0_8_3 + 0.0414442700157055*G0_0_0_8_4 - 0.0329270729270784*G0_0_0_8_5 + 0.0176280861995177*G0_0_0_8_6 + 0.0189068074782392*G0_0_0_8_7 - 0.143856143856168*G0_0_0_8_8 - 0.174956472099359*G0_0_0_8_9 - 0.0041710670282105*G0_0_0_9_0 + 0.0306893106893158*G0_0_0_9_1 - 0.0296237096237146*G0_0_0_9_2 - 0.0906978735550314*G0_0_0_9_3 + 0.109467675181979*G0_0_0_9_4 + 0.0783673469387885*G0_0_0_9_5 + 0.0919309262166561*G0_0_0_9_6 + 0.041238761238768*G0_0_0_9_7 - 0.174956472099359*G0_0_0_9_8 + 0.0641187384044636*G0_0_0_9_9 + 0.0120373453706808*G0_1_0_0_0 + 0.000440053773387192*G0_1_0_0_1 - 0.00150650055411986*G0_1_0_0_2 - 0.00302681445538632*G0_1_0_0_3 + 0.00602318316604132*G0_1_0_0_4 + 0.00651285222713904*G0_1_0_0_5 + 0.00152736152736177*G0_1_0_0_6 - 0.0161387818530702*G0_1_0_0_7 - 0.0097071182785485*G0_1_0_0_8 - 0.0166842681128423*G0_1_0_0_9 + 0.000440053773387191*G0_1_0_1_0 - 0.000795254128587599*G0_1_0_1_2 - 0.00390720390720455*G0_1_0_1_3 - 0.00433344433344509*G0_1_0_1_4 - 0.00285936285936334*G0_1_0_1_5 + 0.00321456321456377*G0_1_0_1_6 - 0.0178310578310608*G0_1_0_1_7 + 0.00390720390720457*G0_1_0_1_8 + 0.0221645021645059*G0_1_0_1_9 - 0.00150650055411986*G0_1_0_2_0 - 0.000795254128587599*G0_1_0_2_1 + 0.0015301805777999*G0_1_0_2_2 - 0.00629719486862446*G0_1_0_2_3 - 0.00902970045827349*G0_1_0_2_4 + 0.002197167911454*G0_1_0_2_5 - 0.000900686614972532*G0_1_0_2_6 - 0.00274519131662034*G0_1_0_2_7 - 0.00654329797187045*G0_1_0_2_8 - 0.0311155511155563*G0_1_0_2_9 - 0.00302681445538633*G0_1_0_3_0 - 0.00390720390720454*G0_1_0_3_1 - 0.00629719486862446*G0_1_0_3_2 + 0.164635364635394*G0_1_0_3_3 + 0.0596203796203897*G0_1_0_3_4 + 0.00242043670615137*G0_1_0_3_5 + 0.00317396888825508*G0_1_0_3_6 + 0.0218981018981054*G0_1_0_3_7 - 0.0543456543456632*G0_1_0_3_8 - 0.110289710289729*G0_1_0_3_9 + 0.00602318316604132*G0_1_0_4_0 - 0.00433344433344509*G0_1_0_4_1 - 0.00902970045827349*G0_1_0_4_2 + 0.0596203796203897*G0_1_0_4_3 - 0.0503268160411102*G0_1_0_4_4 - 0.00525189096617756*G0_1_0_4_5 + 0.00207792207792247*G0_1_0_4_6 - 0.0113258170401046*G0_1_0_4_7 + 0.0324475524475577*G0_1_0_4_8 + 0.103850435279024*G0_1_0_4_9 + 0.00651285222713904*G0_1_0_5_0 - 0.00285936285936334*G0_1_0_5_1 + 0.002197167911454*G0_1_0_5_2 + 0.00242043670615137*G0_1_0_5_3 - 0.00525189096617756*G0_1_0_5_4 - 0.00223776223776246*G0_1_0_5_5 - 0.00730697873555133*G0_1_0_5_6 - 0.0424489795918438*G0_1_0_5_7 + 0.0213957471100364*G0_1_0_5_8 + 0.00726131011845419*G0_1_0_5_9 + 0.00152736152736177*G0_1_0_6_0 + 0.00321456321456377*G0_1_0_6_1 - 0.000900686614972533*G0_1_0_6_2 + 0.00317396888825508*G0_1_0_6_3 + 0.00207792207792247*G0_1_0_6_4 - 0.00730697873555133*G0_1_0_6_5 - 0.01237619523334*G0_1_0_6_6 + 0.0210532324818074*G0_1_0_6_7 - 0.00141572713001314*G0_1_0_6_8 + 0.0869987155701589*G0_1_0_6_9 - 0.0161387818530702*G0_1_0_7_0 - 0.0178310578310608*G0_1_0_7_1 - 0.00274519131662034*G0_1_0_7_2 + 0.0218981018981054*G0_1_0_7_3 - 0.0113258170401046*G0_1_0_7_4 - 0.0424489795918438*G0_1_0_7_5 + 0.0210532324818074*G0_1_0_7_6 - 0.222954188668511*G0_1_0_7_7 + 0.127712287712309*G0_1_0_7_8 + 0.00794633937491211*G0_1_0_7_9 - 0.0097071182785485*G0_1_0_8_0 + 0.00390720390720457*G0_1_0_8_1 - 0.00654329797187045*G0_1_0_8_2 - 0.0543456543456632*G0_1_0_8_3 + 0.0324475524475577*G0_1_0_8_4 + 0.0213957471100364*G0_1_0_8_5 - 0.00141572713001315*G0_1_0_8_6 + 0.127712287712309*G0_1_0_8_7 - 0.0559440559440646*G0_1_0_8_8 - 0.131388611388633*G0_1_0_8_9 - 0.0166842681128423*G0_1_0_9_0 + 0.0221645021645059*G0_1_0_9_1 - 0.0311155511155563*G0_1_0_9_2 - 0.110289710289729*G0_1_0_9_3 + 0.103850435279024*G0_1_0_9_4 + 0.00726131011845419*G0_1_0_9_5 + 0.0869987155701589*G0_1_0_9_6 + 0.0079463393749121*G0_1_0_9_7 - 0.131388611388633*G0_1_0_9_8 + 0.0723390894819594*G0_1_0_9_9; + A[213] = -A[183] + 0.00616357187785864*G0_0_0_0_0 + 0.00375159232302155*G0_0_0_0_1 + 0.00513518227804029*G0_0_0_0_2 + 0.00347588919017553*G0_0_0_0_3 + 0.00814931100645527*G0_0_0_0_4 - 0.0055969427398008*G0_0_0_0_5 + 0.00518085089513758*G0_0_0_0_6 - 0.000994560994561173*G0_0_0_0_7 + 0.00161362447076766*G0_0_0_0_9 + 0.00375159232302155*G0_0_0_1_0 + 0.0322048322048377*G0_0_0_1_1 + 0.00652553795411049*G0_0_0_1_2 + 0.0666000666000779*G0_0_0_1_3 - 0.0156643356643383*G0_0_0_1_4 - 0.0002080459223317*G0_0_0_1_5 + 0.0118941376084254*G0_0_0_1_6 - 0.0118281718281739*G0_0_0_1_7 + 0.0202464202464237*G0_0_0_1_8 + 0.0296237096237147*G0_0_0_1_9 + 0.00513518227804029*G0_0_0_2_0 + 0.00652553795411049*G0_0_0_2_1 + 0.0230169830169867*G0_0_0_2_2 + 0.0118535432821167*G0_0_0_2_3 + 0.00689088689088806*G0_0_0_2_4 - 0.0198303284017603*G0_0_0_2_5 + 0.0323232323232378*G0_0_0_2_6 - 0.00125842411556719*G0_0_0_2_7 + 0.000964115249829712*G0_0_0_2_8 - 0.00651538937253332*G0_0_0_2_9 + 0.00347588919017553*G0_0_0_3_0 + 0.0666000666000779*G0_0_0_3_1 + 0.0118535432821167*G0_0_0_3_2 + 0.354205794205855*G0_0_0_3_3 - 0.128602825745705*G0_0_0_3_4 + 0.00127872127872159*G0_0_0_3_5 - 0.0480433851862503*G0_0_0_3_6 - 0.022788639931501*G0_0_0_3_7 + 0.0380419580419646*G0_0_0_3_8 - 0.0432938490081417*G0_0_0_3_9 + 0.00814931100645527*G0_0_0_4_0 - 0.0156643356643383*G0_0_0_4_1 + 0.00689088689088805*G0_0_0_4_2 - 0.128602825745705*G0_0_0_4_3 + 0.195827030112777*G0_0_0_4_4 - 0.0368089053803402*G0_0_0_4_5 + 0.0848522905665905*G0_0_0_4_6 - 0.00415584415584483*G0_0_0_4_7 - 0.0152533181104636*G0_0_0_4_8 + 0.0931639788782802*G0_0_0_4_9 - 0.0055969427398008*G0_0_0_5_0 - 0.000208045922331699*G0_0_0_5_1 - 0.0198303284017603*G0_0_0_5_2 + 0.00127872127872159*G0_0_0_5_3 - 0.0368089053803402*G0_0_0_5_4 + 0.237294134437031*G0_0_0_5_5 - 0.0260311117454019*G0_0_0_5_6 + 0.0203225346082522*G0_0_0_5_7 - 0.0117368345939794*G0_0_0_5_8 + 0.0186327957756559*G0_0_0_5_9 + 0.00518085089513758*G0_0_0_6_0 + 0.0118941376084254*G0_0_0_6_1 + 0.0323232323232378*G0_0_0_6_2 - 0.0480433851862503*G0_0_0_6_3 + 0.0848522905665905*G0_0_0_6_4 - 0.0260311117454019*G0_0_0_6_5 + 0.455407449693241*G0_0_0_6_6 - 0.00858570001427284*G0_0_0_6_7 - 0.0131068931068952*G0_0_0_6_8 + 0.115632938490101*G0_0_0_6_9 - 0.000994560994561173*G0_0_0_7_0 - 0.0118281718281739*G0_0_0_7_1 - 0.00125842411556718*G0_0_0_7_2 - 0.022788639931501*G0_0_0_7_3 - 0.00415584415584483*G0_0_0_7_4 + 0.0203225346082522*G0_0_0_7_5 - 0.00858570001427284*G0_0_0_7_6 + 0.00812901384330094*G0_0_0_7_7 - 0.00502354788069161*G0_0_0_7_8 + 0.0123305266162429*G0_0_0_7_9 + 0.0202464202464237*G0_0_0_8_1 + 0.000964115249829712*G0_0_0_8_2 + 0.0380419580419646*G0_0_0_8_3 - 0.0152533181104636*G0_0_0_8_4 - 0.0117368345939794*G0_0_0_8_5 - 0.0131068931068952*G0_0_0_8_6 - 0.00502354788069161*G0_0_0_8_7 - 0.00831168831168968*G0_0_0_8_8 - 0.0583644926502167*G0_0_0_8_9 + 0.00161362447076766*G0_0_0_9_0 + 0.0296237096237147*G0_0_0_9_1 - 0.00651538937253332*G0_0_0_9_2 - 0.0432938490081417*G0_0_0_9_3 + 0.0931639788782802*G0_0_0_9_4 + 0.0186327957756559*G0_0_0_9_5 + 0.115632938490101*G0_0_0_9_6 + 0.0123305266162429*G0_0_0_9_7 - 0.0583644926502167*G0_0_0_9_8 + 0.0920679320679478*G0_0_0_9_9 + 0.00226313369170553*G0_0_1_0_0 + 0.00463733797067213*G0_0_1_0_1 + 0.000866012294583873*G0_0_1_0_2 + 0.00938743795886817*G0_0_1_0_3 - 0.00276041418898609*G0_0_1_0_4 + 0.000426240426240525*G0_0_1_0_5 - 0.00108082393796699*G0_0_1_0_6 - 0.00185211613783076*G0_0_1_0_7 + 0.00371945514802724*G0_0_1_0_8 + 0.00173540744969348*G0_0_1_0_9 + 0.00463733797067213*G0_0_1_1_0 + 0.0770390103723573*G0_0_1_1_1 + 0.00822880822880964*G0_0_1_1_2 + 0.093062493062509*G0_0_1_1_3 - 0.039285159285166*G0_0_1_1_4 + 0.000177600177600194*G0_0_1_1_5 - 0.000888000888001034*G0_0_1_1_6 - 0.018683538683542*G0_0_1_1_7 + 0.0369408369408435*G0_0_1_1_8 + 0.0132134532134555*G0_0_1_1_9 + 0.000866012294583873*G0_0_1_2_0 + 0.00822880822880963*G0_0_1_2_1 + 0.00092352092352108*G0_0_1_2_2 + 0.0181761096046841*G0_0_1_2_3 - 0.00971219256933705*G0_0_1_2_4 + 0.000385646099931893*G0_0_1_2_5 - 0.001441098583956*G0_0_1_2_6 - 0.00174048174048204*G0_0_1_2_7 + 0.00427255284398215*G0_0_1_2_8 + 0.000974263831406869*G0_0_1_2_9 + 0.00938743795886817*G0_0_1_3_0 + 0.093062493062509*G0_0_1_3_1 + 0.0181761096046841*G0_0_1_3_2 + 0.267572427572473*G0_0_1_3_3 - 0.0796003996004132*G0_0_1_3_4 - 0.0103667760810635*G0_0_1_3_5 - 0.00529755958327479*G0_0_1_3_6 - 0.0361238761238823*G0_0_1_3_7 + 0.0569030969031067*G0_0_1_3_8 + 0.0326073926073983*G0_0_1_3_9 - 0.00276041418898609*G0_0_1_4_0 - 0.039285159285166*G0_0_1_4_1 - 0.00971219256933705*G0_0_1_4_2 - 0.0796003996004132*G0_0_1_4_3 + 0.034388468674189*G0_0_1_4_4 + 0.000319680319680333*G0_0_1_4_5 + 0.00497787926359444*G0_0_1_4_6 + 0.0107321250178411*G0_0_1_4_7 - 0.0207792207792244*G0_0_1_4_8 - 0.00356215213358131*G0_0_1_4_9 + 0.000426240426240526*G0_0_1_5_0 + 0.000177600177600194*G0_0_1_5_1 + 0.000385646099931893*G0_0_1_5_2 - 0.0103667760810635*G0_0_1_5_3 + 0.000319680319680333*G0_0_1_5_4 + 0.0338404452690226*G0_0_1_5_5 - 0.00328814043099812*G0_0_1_5_6 + 0.0112344798059103*G0_0_1_5_7 - 0.00849436278007852*G0_0_1_5_8 + 0.0117825032110766*G0_0_1_5_9 - 0.00108082393796699*G0_0_1_6_0 - 0.000888000888001034*G0_0_1_6_1 - 0.001441098583956*G0_0_1_6_2 - 0.00529755958327479*G0_0_1_6_3 + 0.00497787926359444*G0_0_1_6_4 - 0.00328814043099812*G0_0_1_6_5 + 0.025346082488944*G0_0_1_6_6 - 0.00274011702583178*G0_0_1_6_7 - 0.00109604681033272*G0_0_1_6_8 + 0.00767232767232898*G0_0_1_6_9 - 0.00185211613783076*G0_0_1_7_0 - 0.018683538683542*G0_0_1_7_1 - 0.00174048174048204*G0_0_1_7_2 - 0.0361238761238823*G0_0_1_7_3 + 0.0107321250178411*G0_0_1_7_4 + 0.0112344798059103*G0_0_1_7_5 - 0.00274011702583179*G0_0_1_7_6 + 0.0177650920508094*G0_0_1_7_7 - 0.0195004995005029*G0_0_1_7_8 + 0.000274011702583165*G0_0_1_7_9 + 0.00371945514802724*G0_0_1_8_0 + 0.0369408369408435*G0_0_1_8_1 + 0.00427255284398215*G0_0_1_8_2 + 0.0569030969031067*G0_0_1_8_3 - 0.0207792207792244*G0_0_1_8_4 - 0.00849436278007852*G0_0_1_8_5 - 0.00109604681033272*G0_0_1_8_6 - 0.0195004995005029*G0_0_1_8_7 + 0.024615384615389*G0_0_1_8_8 + 0.00191808191808234*G0_0_1_8_9 + 0.00173540744969348*G0_0_1_9_0 + 0.0132134532134555*G0_0_1_9_1 + 0.00097426383140687*G0_0_1_9_2 + 0.0326073926073983*G0_0_1_9_3 - 0.00356215213358131*G0_0_1_9_4 + 0.0117825032110766*G0_0_1_9_5 + 0.00767232767232898*G0_0_1_9_6 + 0.000274011702583166*G0_0_1_9_7 + 0.00191808191808234*G0_0_1_9_8 + 0.0608305979734658*G0_0_1_9_9 + 0.00154596726025325*G0_1_0_0_0 + 0.00113664113664134*G0_1_0_0_1 - 0.000333211761783242*G0_1_0_0_2 + 0.00969189540618284*G0_1_0_0_3 + 0.00539904539904632*G0_1_0_0_4 - 0.000685029256457957*G0_1_0_0_5 + 0.00114171542742992*G0_1_0_0_6 - 0.00128886986029866*G0_1_0_0_7 - 0.00106052677481265*G0_1_0_0_8 + 0.0112344798059103*G0_1_0_0_9 + 0.00113664113664134*G0_1_0_1_0 + 0.0194176194176227*G0_1_0_1_1 + 0.00349280349280409*G0_1_0_1_2 + 0.0483072483072566*G0_1_0_1_3 - 0.0105139305139323*G0_1_0_1_4 - 0.00280608280608329*G0_1_0_1_5 + 0.00220224220224258*G0_1_0_1_6 - 0.00340992340992403*G0_1_0_1_7 + 0.00681984681984802*G0_1_0_1_9 - 0.000333211761783243*G0_1_0_2_0 + 0.00349280349280409*G0_1_0_2_1 - 0.010300810300812*G0_1_0_2_2 + 0.0168060510917682*G0_1_0_2_3 - 0.00203986489700806*G0_1_0_2_4 + 0.00327799184942096*G0_1_0_2_5 - 0.00996590710876591*G0_1_0_2_6 - 0.00234939663511133*G0_1_0_2_7 + 0.00106052677481269*G0_1_0_2_8 - 0.00395794681509034*G0_1_0_2_9 + 0.00969189540618283*G0_1_0_3_0 + 0.0483072483072566*G0_1_0_3_1 + 0.0168060510917682*G0_1_0_3_2 + 0.417182817182889*G0_1_0_3_3 - 0.117962037962058*G0_1_0_3_4 - 0.0068046239474822*G0_1_0_3_5 - 0.0136549165120617*G0_1_0_3_6 - 0.0361238761238824*G0_1_0_3_7 + 0.0463536463536544*G0_1_0_3_8 + 0.0517882117882209*G0_1_0_3_9 + 0.00539904539904633*G0_1_0_4_0 - 0.0105139305139323*G0_1_0_4_1 - 0.00203986489700806*G0_1_0_4_2 - 0.117962037962058*G0_1_0_4_3 + 0.177970600827774*G0_1_0_4_4 - 0.0232453261024729*G0_1_0_4_5 + 0.0369002426145346*G0_1_0_4_6 - 0.00105037819323547*G0_1_0_4_7 - 0.010229770229772*G0_1_0_4_8 + 0.0583644926502167*G0_1_0_4_9 - 0.000685029256457957*G0_1_0_5_0 - 0.00280608280608329*G0_1_0_5_1 + 0.00327799184942096*G0_1_0_5_2 - 0.0068046239474822*G0_1_0_5_3 - 0.0232453261024729*G0_1_0_5_4 + 0.00917939203653643*G0_1_0_5_5 - 0.00342514628228974*G0_1_0_5_6 - 0.00137005851291591*G0_1_0_5_7 + 0.00137005851291591*G0_1_0_5_8 - 0.0364435564435627*G0_1_0_5_9 + 0.00114171542742992*G0_1_0_6_0 + 0.00220224220224258*G0_1_0_6_1 - 0.0099659071087659*G0_1_0_6_2 - 0.0136549165120617*G0_1_0_6_3 + 0.0369002426145346*G0_1_0_6_4 - 0.00342514628228974*G0_1_0_6_5 - 0.00945340373911951*G0_1_0_6_6 - 0.00137005851291594*G0_1_0_6_8 + 0.0391836734693945*G0_1_0_6_9 - 0.00128886986029866*G0_1_0_7_0 - 0.00340992340992403*G0_1_0_7_1 - 0.00234939663511133*G0_1_0_7_2 - 0.0361238761238824*G0_1_0_7_3 - 0.00105037819323547*G0_1_0_7_4 - 0.00137005851291591*G0_1_0_7_5 - 0.0112801484230074*G0_1_0_7_7 + 0.0102297702297718*G0_1_0_7_8 - 0.033703439417731*G0_1_0_7_9 - 0.00106052677481265*G0_1_0_8_0 + 0.00106052677481269*G0_1_0_8_2 + 0.0463536463536544*G0_1_0_8_3 - 0.010229770229772*G0_1_0_8_4 + 0.00137005851291591*G0_1_0_8_5 - 0.00137005851291594*G0_1_0_8_6 + 0.0102297702297718*G0_1_0_8_7 - 0.0463536463536539*G0_1_0_8_8 + 0.0112344798059103*G0_1_0_9_0 + 0.00681984681984802*G0_1_0_9_1 - 0.00395794681509034*G0_1_0_9_2 + 0.0517882117882209*G0_1_0_9_3 + 0.0583644926502167*G0_1_0_9_4 - 0.0364435564435627*G0_1_0_9_5 + 0.0391836734693945*G0_1_0_9_6 - 0.033703439417731*G0_1_0_9_7 + 0.0674068788354618*G0_1_0_9_9 + 0.00133961276818444*G0_1_1_0_0 - 0.00359147025813753*G0_1_1_0_1 + 0.00511488511488602*G0_1_1_0_3 - 0.00101993244850406*G0_1_1_0_4 + 0.00186733901019648*G0_1_1_0_5 - 0.00146647003789887*G0_1_1_0_6 + 0.00786007643150636*G0_1_1_0_7 - 0.0144566544566569*G0_1_1_0_8 + 0.000761143618286634*G0_1_1_0_9 - 0.00359147025813753*G0_1_1_1_0 + 0.00359147025813754*G0_1_1_1_2 + 0.0561216561216657*G0_1_1_1_3 - 0.0206016206016241*G0_1_1_1_4 + 0.00106560106560126*G0_1_1_1_5 - 0.00106560106560127*G0_1_1_1_6 + 0.0206016206016241*G0_1_1_1_7 - 0.0561216561216656*G0_1_1_1_8 + 0.00359147025813754*G0_1_1_2_1 - 0.00133961276818438*G0_1_1_2_2 + 0.0144566544566569*G0_1_1_2_3 - 0.00786007643150629*G0_1_1_2_4 + 0.00146647003789885*G0_1_1_2_5 - 0.00186733901019645*G0_1_1_2_6 + 0.00101993244850403*G0_1_1_2_7 - 0.00511488511488594*G0_1_1_2_8 - 0.000761143618286585*G0_1_1_2_9 + 0.00511488511488602*G0_1_1_3_0 + 0.0561216561216657*G0_1_1_3_1 + 0.0144566544566569*G0_1_1_3_2 + 0.242957042957085*G0_1_1_3_3 - 0.0600999000999104*G0_1_1_3_4 - 0.00927072927073081*G0_1_1_3_5 + 0.00319680319680368*G0_1_1_3_6 - 0.0153446553446581*G0_1_1_3_7 + 0.0306893106893161*G0_1_1_3_9 - 0.00101993244850405*G0_1_1_4_0 - 0.0206016206016241*G0_1_1_4_1 - 0.00786007643150629*G0_1_1_4_2 - 0.0600999000999104*G0_1_1_4_3 + 0.0166233766233797*G0_1_1_4_4 + 0.0030597973455121*G0_1_1_4_5 - 0.0062566005423158*G0_1_1_4_6 + 0.0153446553446578*G0_1_1_4_8 - 0.00383616383616447*G0_1_1_4_9 + 0.00186733901019648*G0_1_1_5_0 + 0.00106560106560127*G0_1_1_5_1 + 0.00146647003789885*G0_1_1_5_2 - 0.00927072927073081*G0_1_1_5_3 + 0.0030597973455121*G0_1_1_5_4 + 0.00849436278007852*G0_1_1_5_5 + 0.00625660054231587*G0_1_1_5_7 - 0.0031968031968037*G0_1_1_5_8 + 0.00411017553874762*G0_1_1_5_9 - 0.00146647003789887*G0_1_1_6_0 - 0.00106560106560127*G0_1_1_6_1 - 0.00186733901019645*G0_1_1_6_2 + 0.00319680319680368*G0_1_1_6_3 - 0.0062566005423158*G0_1_1_6_4 - 0.00849436278007844*G0_1_1_6_6 - 0.00305979734551213*G0_1_1_6_7 + 0.00927072927073075*G0_1_1_6_8 - 0.00411017553874762*G0_1_1_6_9 + 0.00786007643150636*G0_1_1_7_0 + 0.0206016206016241*G0_1_1_7_1 + 0.00101993244850403*G0_1_1_7_2 - 0.0153446553446581*G0_1_1_7_3 + 0.00625660054231587*G0_1_1_7_5 - 0.00305979734551213*G0_1_1_7_6 - 0.0166233766233794*G0_1_1_7_7 + 0.0600999000999101*G0_1_1_7_8 + 0.0038361638361644*G0_1_1_7_9 - 0.0144566544566569*G0_1_1_8_0 - 0.0561216561216656*G0_1_1_8_1 - 0.00511488511488593*G0_1_1_8_2 + 0.0153446553446578*G0_1_1_8_4 - 0.0031968031968037*G0_1_1_8_5 + 0.00927072927073075*G0_1_1_8_6 + 0.0600999000999101*G0_1_1_8_7 - 0.242957042957084*G0_1_1_8_8 - 0.0306893106893158*G0_1_1_8_9 + 0.000761143618286634*G0_1_1_9_0 - 0.000761143618286585*G0_1_1_9_2 + 0.0306893106893161*G0_1_1_9_3 - 0.00383616383616448*G0_1_1_9_4 + 0.00411017553874762*G0_1_1_9_5 - 0.00411017553874762*G0_1_1_9_6 + 0.0038361638361644*G0_1_1_9_7 - 0.0306893106893158*G0_1_1_9_8; + A[185] = -A[188] + 0.0120373453706806*G0_0_1_0_0 - 0.00150650055411986*G0_0_1_0_1 + 0.000440053773387169*G0_0_1_0_2 + 0.00602318316604131*G0_0_1_0_3 - 0.00302681445538636*G0_0_1_0_4 - 0.0161387818530703*G0_0_1_0_5 - 0.00970711827854849*G0_0_1_0_6 + 0.006512852227139*G0_0_1_0_7 + 0.0015273615273618*G0_0_1_0_8 - 0.0166842681128424*G0_0_1_0_9 - 0.00150650055411986*G0_0_1_1_0 + 0.00153018057780002*G0_0_1_1_1 - 0.000795254128587599*G0_0_1_1_2 - 0.00902970045827338*G0_0_1_1_3 - 0.0062971948686245*G0_0_1_1_4 - 0.00274519131662033*G0_0_1_1_5 - 0.0065432979718705*G0_0_1_1_6 + 0.00219716791145397*G0_0_1_1_7 - 0.000900686614972414*G0_0_1_1_8 - 0.0311155511155563*G0_0_1_1_9 + 0.00044005377338717*G0_0_1_2_0 - 0.000795254128587599*G0_0_1_2_1 - 0.00433344433344505*G0_0_1_2_3 - 0.00390720390720463*G0_0_1_2_4 - 0.0178310578310609*G0_0_1_2_5 + 0.00390720390720449*G0_0_1_2_6 - 0.00285936285936334*G0_0_1_2_7 + 0.00321456321456375*G0_0_1_2_8 + 0.0221645021645059*G0_0_1_2_9 + 0.00602318316604131*G0_0_1_3_0 - 0.00902970045827339*G0_0_1_3_1 - 0.00433344433344505*G0_0_1_3_2 - 0.0503268160411108*G0_0_1_3_3 + 0.0596203796203897*G0_0_1_3_4 - 0.0113258170401047*G0_0_1_3_5 + 0.0324475524475579*G0_0_1_3_6 - 0.00525189096617751*G0_0_1_3_7 + 0.00207792207792236*G0_0_1_3_8 + 0.103850435279024*G0_0_1_3_9 - 0.00302681445538636*G0_0_1_4_0 - 0.0062971948686245*G0_0_1_4_1 - 0.00390720390720462*G0_0_1_4_2 + 0.0596203796203897*G0_0_1_4_3 + 0.164635364635393*G0_0_1_4_4 + 0.0218981018981056*G0_0_1_4_5 - 0.0543456543456634*G0_0_1_4_6 + 0.00242043670615137*G0_0_1_4_7 + 0.00317396888825514*G0_0_1_4_8 - 0.110289710289729*G0_0_1_4_9 - 0.0161387818530703*G0_0_1_5_0 - 0.00274519131662033*G0_0_1_5_1 - 0.0178310578310609*G0_0_1_5_2 - 0.0113258170401047*G0_0_1_5_3 + 0.0218981018981056*G0_0_1_5_4 - 0.222954188668512*G0_0_1_5_5 + 0.127712287712309*G0_0_1_5_6 - 0.0424489795918438*G0_0_1_5_7 + 0.0210532324818075*G0_0_1_5_8 + 0.00794633937491213*G0_0_1_5_9 - 0.00970711827854849*G0_0_1_6_0 - 0.0065432979718705*G0_0_1_6_1 + 0.00390720390720449*G0_0_1_6_2 + 0.0324475524475579*G0_0_1_6_3 - 0.0543456543456634*G0_0_1_6_4 + 0.127712287712309*G0_0_1_6_5 - 0.0559440559440649*G0_0_1_6_6 + 0.0213957471100364*G0_0_1_6_7 - 0.00141572713001311*G0_0_1_6_8 - 0.131388611388633*G0_0_1_6_9 + 0.006512852227139*G0_0_1_7_0 + 0.00219716791145397*G0_0_1_7_1 - 0.00285936285936335*G0_0_1_7_2 - 0.00525189096617751*G0_0_1_7_3 + 0.00242043670615137*G0_0_1_7_4 - 0.0424489795918438*G0_0_1_7_5 + 0.0213957471100364*G0_0_1_7_6 - 0.00223776223776264*G0_0_1_7_7 - 0.00730697873555137*G0_0_1_7_8 + 0.0072613101184542*G0_0_1_7_9 + 0.0015273615273618*G0_0_1_8_0 - 0.000900686614972414*G0_0_1_8_1 + 0.00321456321456375*G0_0_1_8_2 + 0.00207792207792237*G0_0_1_8_3 + 0.00317396888825514*G0_0_1_8_4 + 0.0210532324818074*G0_0_1_8_5 - 0.00141572713001311*G0_0_1_8_6 - 0.00730697873555137*G0_0_1_8_7 - 0.0123761952333403*G0_0_1_8_8 + 0.0869987155701587*G0_0_1_8_9 - 0.0166842681128424*G0_0_1_9_0 - 0.0311155511155563*G0_0_1_9_1 + 0.0221645021645059*G0_0_1_9_2 + 0.103850435279024*G0_0_1_9_3 - 0.110289710289729*G0_0_1_9_4 + 0.00794633937491213*G0_0_1_9_5 - 0.131388611388633*G0_0_1_9_6 + 0.0072613101184542*G0_0_1_9_7 + 0.0869987155701587*G0_0_1_9_8 + 0.0723390894819584*G0_0_1_9_9 + 0.0459708193041604*G0_1_1_0_0 + 0.00411553173458005*G0_1_1_0_1 + 0.00147718242956362*G0_1_1_0_2 + 0.00395033537890744*G0_1_1_0_3 + 0.000745920745920919*G0_1_1_0_4 + 0.013236287522004*G0_1_1_0_5 - 0.01216307502022*G0_1_1_0_6 + 0.0641618698761665*G0_1_1_0_7 - 0.0331807874665074*G0_1_1_0_8 - 0.00417106702821057*G0_1_1_0_9 + 0.00411553173458005*G0_1_1_1_0 - 0.00722240722240843*G0_1_1_1_1 - 0.000125447744495388*G0_1_1_1_2 - 0.0124776810491117*G0_1_1_1_3 - 0.00290249433106623*G0_1_1_1_4 + 0.00530517101945763*G0_1_1_1_5 - 0.013297179011467*G0_1_1_1_6 + 0.0185313099598845*G0_1_1_1_7 - 0.0287966002251765*G0_1_1_1_8 - 0.0296237096237146*G0_1_1_1_9 + 0.00147718242956362*G0_1_1_2_0 - 0.000125447744495389*G0_1_1_2_1 - 0.0160234826901522*G0_1_1_2_2 - 0.00447552447552522*G0_1_1_2_3 - 0.00612720612720721*G0_1_1_2_4 + 0.00184704184704215*G0_1_1_2_5 + 0.00381840381840445*G0_1_1_2_6 + 0.0114932686361277*G0_1_1_2_7 + 0.0010275438846869*G0_1_1_2_8 + 0.0306893106893159*G0_1_1_2_9 + 0.00395033537890744*G0_1_1_3_0 - 0.0124776810491117*G0_1_1_3_1 - 0.00447552447552523*G0_1_1_3_2 - 0.028953903239623*G0_1_1_3_3 + 0.044549735978315*G0_1_1_3_4 - 0.0146596260882*G0_1_1_3_5 + 0.0414442700157056*G0_1_1_3_6 - 0.0102982731554178*G0_1_1_3_7 + 0.0118281718281737*G0_1_1_3_8 + 0.109467675181979*G0_1_1_3_9 + 0.00074592074592092*G0_1_1_4_0 - 0.00290249433106623*G0_1_1_4_1 - 0.00612720612720721*G0_1_1_4_2 + 0.044549735978315*G0_1_1_4_3 + 0.212587412587449*G0_1_1_4_4 - 0.000685029256457963*G0_1_1_4_5 - 0.0407592407592476*G0_1_1_4_6 - 0.0191351505637252*G0_1_1_4_7 - 0.00152989867275605*G0_1_1_4_8 - 0.0906978735550315*G0_1_1_4_9 + 0.013236287522004*G0_1_1_5_0 + 0.00530517101945763*G0_1_1_5_1 + 0.00184704184704215*G0_1_1_5_2 - 0.0146596260882*G0_1_1_5_3 - 0.000685029256457963*G0_1_1_5_4 - 0.0131525617239926*G0_1_1_5_5 + 0.0189068074782393*G0_1_1_5_6 + 0.0472898530041466*G0_1_1_5_7 - 0.0143627800770682*G0_1_1_5_8 + 0.0412387612387682*G0_1_1_5_9 - 0.01216307502022*G0_1_1_6_0 - 0.013297179011467*G0_1_1_6_1 + 0.00381840381840445*G0_1_1_6_2 + 0.0414442700157056*G0_1_1_6_3 - 0.0407592407592476*G0_1_1_6_4 + 0.0189068074782393*G0_1_1_6_5 - 0.143856143856168*G0_1_1_6_6 - 0.0329270729270784*G0_1_1_6_7 + 0.0176280861995178*G0_1_1_6_8 - 0.174956472099359*G0_1_1_6_9 + 0.0641618698761665*G0_1_1_7_0 + 0.0185313099598845*G0_1_1_7_1 + 0.0114932686361277*G0_1_1_7_2 - 0.0102982731554178*G0_1_1_7_3 - 0.0191351505637252*G0_1_1_7_4 + 0.0472898530041466*G0_1_1_7_5 - 0.0329270729270784*G0_1_1_7_6 + 0.554097331240282*G0_1_1_7_7 - 0.0263279577565337*G0_1_1_7_8 + 0.0783673469387889*G0_1_1_7_9 - 0.0331807874665074*G0_1_1_8_0 - 0.0287966002251765*G0_1_1_8_1 + 0.00102754388468691*G0_1_1_8_2 + 0.0118281718281737*G0_1_1_8_3 - 0.00152989867275605*G0_1_1_8_4 - 0.0143627800770682*G0_1_1_8_5 + 0.0176280861995178*G0_1_1_8_6 - 0.0263279577565337*G0_1_1_8_7 + 0.101841016126748*G0_1_1_8_8 + 0.0919309262166559*G0_1_1_8_9 - 0.00417106702821058*G0_1_1_9_0 - 0.0296237096237146*G0_1_1_9_1 + 0.0306893106893159*G0_1_1_9_2 + 0.109467675181979*G0_1_1_9_3 - 0.0906978735550315*G0_1_1_9_4 + 0.0412387612387682*G0_1_1_9_5 - 0.174956472099359*G0_1_1_9_6 + 0.0783673469387889*G0_1_1_9_7 + 0.0919309262166559*G0_1_1_9_8 + 0.0641187384044631*G0_1_1_9_9; + A[87] = -A[132] + 0.0120373453706806*G0_1_0_0_0 - 0.00150650055411986*G0_1_0_0_1 + 0.00044005377338717*G0_1_0_0_2 + 0.00602318316604131*G0_1_0_0_3 - 0.00302681445538636*G0_1_0_0_4 - 0.0161387818530703*G0_1_0_0_5 - 0.00970711827854849*G0_1_0_0_6 + 0.006512852227139*G0_1_0_0_7 + 0.0015273615273618*G0_1_0_0_8 - 0.0166842681128424*G0_1_0_0_9 - 0.00150650055411986*G0_1_0_1_0 + 0.00153018057780002*G0_1_0_1_1 - 0.0007952541285876*G0_1_0_1_2 - 0.00902970045827338*G0_1_0_1_3 - 0.0062971948686245*G0_1_0_1_4 - 0.00274519131662033*G0_1_0_1_5 - 0.0065432979718705*G0_1_0_1_6 + 0.00219716791145397*G0_1_0_1_7 - 0.000900686614972413*G0_1_0_1_8 - 0.0311155511155563*G0_1_0_1_9 + 0.00044005377338717*G0_1_0_2_0 - 0.0007952541285876*G0_1_0_2_1 - 0.00433344433344504*G0_1_0_2_3 - 0.00390720390720462*G0_1_0_2_4 - 0.0178310578310609*G0_1_0_2_5 + 0.00390720390720449*G0_1_0_2_6 - 0.00285936285936334*G0_1_0_2_7 + 0.00321456321456375*G0_1_0_2_8 + 0.0221645021645059*G0_1_0_2_9 + 0.00602318316604131*G0_1_0_3_0 - 0.00902970045827338*G0_1_0_3_1 - 0.00433344433344505*G0_1_0_3_2 - 0.0503268160411108*G0_1_0_3_3 + 0.0596203796203897*G0_1_0_3_4 - 0.0113258170401047*G0_1_0_3_5 + 0.0324475524475579*G0_1_0_3_6 - 0.00525189096617751*G0_1_0_3_7 + 0.00207792207792236*G0_1_0_3_8 + 0.103850435279024*G0_1_0_3_9 - 0.00302681445538636*G0_1_0_4_0 - 0.0062971948686245*G0_1_0_4_1 - 0.00390720390720463*G0_1_0_4_2 + 0.0596203796203897*G0_1_0_4_3 + 0.164635364635393*G0_1_0_4_4 + 0.0218981018981056*G0_1_0_4_5 - 0.0543456543456634*G0_1_0_4_6 + 0.00242043670615137*G0_1_0_4_7 + 0.00317396888825514*G0_1_0_4_8 - 0.110289710289729*G0_1_0_4_9 - 0.0161387818530703*G0_1_0_5_0 - 0.00274519131662033*G0_1_0_5_1 - 0.0178310578310609*G0_1_0_5_2 - 0.0113258170401047*G0_1_0_5_3 + 0.0218981018981056*G0_1_0_5_4 - 0.222954188668512*G0_1_0_5_5 + 0.127712287712309*G0_1_0_5_6 - 0.0424489795918438*G0_1_0_5_7 + 0.0210532324818075*G0_1_0_5_8 + 0.00794633937491213*G0_1_0_5_9 - 0.00970711827854849*G0_1_0_6_0 - 0.0065432979718705*G0_1_0_6_1 + 0.00390720390720449*G0_1_0_6_2 + 0.0324475524475579*G0_1_0_6_3 - 0.0543456543456634*G0_1_0_6_4 + 0.127712287712309*G0_1_0_6_5 - 0.0559440559440648*G0_1_0_6_6 + 0.0213957471100364*G0_1_0_6_7 - 0.00141572713001311*G0_1_0_6_8 - 0.131388611388633*G0_1_0_6_9 + 0.006512852227139*G0_1_0_7_0 + 0.00219716791145397*G0_1_0_7_1 - 0.00285936285936334*G0_1_0_7_2 - 0.00525189096617751*G0_1_0_7_3 + 0.00242043670615137*G0_1_0_7_4 - 0.0424489795918438*G0_1_0_7_5 + 0.0213957471100364*G0_1_0_7_6 - 0.00223776223776264*G0_1_0_7_7 - 0.00730697873555137*G0_1_0_7_8 + 0.0072613101184542*G0_1_0_7_9 + 0.0015273615273618*G0_1_0_8_0 - 0.000900686614972414*G0_1_0_8_1 + 0.00321456321456375*G0_1_0_8_2 + 0.00207792207792237*G0_1_0_8_3 + 0.00317396888825514*G0_1_0_8_4 + 0.0210532324818075*G0_1_0_8_5 - 0.00141572713001311*G0_1_0_8_6 - 0.00730697873555137*G0_1_0_8_7 - 0.0123761952333403*G0_1_0_8_8 + 0.0869987155701587*G0_1_0_8_9 - 0.0166842681128424*G0_1_0_9_0 - 0.0311155511155563*G0_1_0_9_1 + 0.0221645021645059*G0_1_0_9_2 + 0.103850435279024*G0_1_0_9_3 - 0.110289710289729*G0_1_0_9_4 + 0.00794633937491213*G0_1_0_9_5 - 0.131388611388633*G0_1_0_9_6 + 0.0072613101184542*G0_1_0_9_7 + 0.0869987155701587*G0_1_0_9_8 + 0.0723390894819583*G0_1_0_9_9 + 0.0459708193041604*G0_1_1_0_0 + 0.00411553173458005*G0_1_1_0_1 + 0.00147718242956362*G0_1_1_0_2 + 0.00395033537890744*G0_1_1_0_3 + 0.000745920745920919*G0_1_1_0_4 + 0.013236287522004*G0_1_1_0_5 - 0.01216307502022*G0_1_1_0_6 + 0.0641618698761665*G0_1_1_0_7 - 0.0331807874665074*G0_1_1_0_8 - 0.00417106702821057*G0_1_1_0_9 + 0.00411553173458005*G0_1_1_1_0 - 0.00722240722240843*G0_1_1_1_1 - 0.000125447744495389*G0_1_1_1_2 - 0.0124776810491117*G0_1_1_1_3 - 0.00290249433106623*G0_1_1_1_4 + 0.00530517101945763*G0_1_1_1_5 - 0.013297179011467*G0_1_1_1_6 + 0.0185313099598845*G0_1_1_1_7 - 0.0287966002251765*G0_1_1_1_8 - 0.0296237096237146*G0_1_1_1_9 + 0.00147718242956362*G0_1_1_2_0 - 0.000125447744495389*G0_1_1_2_1 - 0.0160234826901522*G0_1_1_2_2 - 0.00447552447552523*G0_1_1_2_3 - 0.00612720612720721*G0_1_1_2_4 + 0.00184704184704215*G0_1_1_2_5 + 0.00381840381840445*G0_1_1_2_6 + 0.0114932686361277*G0_1_1_2_7 + 0.0010275438846869*G0_1_1_2_8 + 0.0306893106893159*G0_1_1_2_9 + 0.00395033537890744*G0_1_1_3_0 - 0.0124776810491117*G0_1_1_3_1 - 0.00447552447552523*G0_1_1_3_2 - 0.028953903239623*G0_1_1_3_3 + 0.044549735978315*G0_1_1_3_4 - 0.0146596260882*G0_1_1_3_5 + 0.0414442700157056*G0_1_1_3_6 - 0.0102982731554178*G0_1_1_3_7 + 0.0118281718281737*G0_1_1_3_8 + 0.109467675181979*G0_1_1_3_9 + 0.00074592074592092*G0_1_1_4_0 - 0.00290249433106624*G0_1_1_4_1 - 0.00612720612720721*G0_1_1_4_2 + 0.044549735978315*G0_1_1_4_3 + 0.212587412587449*G0_1_1_4_4 - 0.000685029256457963*G0_1_1_4_5 - 0.0407592407592476*G0_1_1_4_6 - 0.0191351505637252*G0_1_1_4_7 - 0.00152989867275605*G0_1_1_4_8 - 0.0906978735550315*G0_1_1_4_9 + 0.013236287522004*G0_1_1_5_0 + 0.00530517101945763*G0_1_1_5_1 + 0.00184704184704215*G0_1_1_5_2 - 0.0146596260882*G0_1_1_5_3 - 0.000685029256457963*G0_1_1_5_4 - 0.0131525617239926*G0_1_1_5_5 + 0.0189068074782393*G0_1_1_5_6 + 0.0472898530041466*G0_1_1_5_7 - 0.0143627800770682*G0_1_1_5_8 + 0.0412387612387682*G0_1_1_5_9 - 0.01216307502022*G0_1_1_6_0 - 0.013297179011467*G0_1_1_6_1 + 0.00381840381840445*G0_1_1_6_2 + 0.0414442700157056*G0_1_1_6_3 - 0.0407592407592476*G0_1_1_6_4 + 0.0189068074782393*G0_1_1_6_5 - 0.143856143856168*G0_1_1_6_6 - 0.0329270729270784*G0_1_1_6_7 + 0.0176280861995178*G0_1_1_6_8 - 0.174956472099359*G0_1_1_6_9 + 0.0641618698761665*G0_1_1_7_0 + 0.0185313099598845*G0_1_1_7_1 + 0.0114932686361277*G0_1_1_7_2 - 0.0102982731554178*G0_1_1_7_3 - 0.0191351505637252*G0_1_1_7_4 + 0.0472898530041466*G0_1_1_7_5 - 0.0329270729270784*G0_1_1_7_6 + 0.554097331240282*G0_1_1_7_7 - 0.0263279577565337*G0_1_1_7_8 + 0.0783673469387889*G0_1_1_7_9 - 0.0331807874665074*G0_1_1_8_0 - 0.0287966002251765*G0_1_1_8_1 + 0.0010275438846869*G0_1_1_8_2 + 0.0118281718281737*G0_1_1_8_3 - 0.00152989867275605*G0_1_1_8_4 - 0.0143627800770682*G0_1_1_8_5 + 0.0176280861995178*G0_1_1_8_6 - 0.0263279577565337*G0_1_1_8_7 + 0.101841016126748*G0_1_1_8_8 + 0.0919309262166559*G0_1_1_8_9 - 0.00417106702821057*G0_1_1_9_0 - 0.0296237096237146*G0_1_1_9_1 + 0.0306893106893159*G0_1_1_9_2 + 0.109467675181979*G0_1_1_9_3 - 0.0906978735550315*G0_1_1_9_4 + 0.0412387612387682*G0_1_1_9_5 - 0.174956472099359*G0_1_1_9_6 + 0.0783673469387889*G0_1_1_9_7 + 0.0919309262166559*G0_1_1_9_8 + 0.0641187384044631*G0_1_1_9_9; + A[221] = -A[213] - 0.00875258780020847*G0_0_0_0_0 + 0.000669806384092208*G0_0_0_0_1 + 0.0056220322886999*G0_0_0_0_2 - 0.00675388103959652*G0_0_0_0_3 + 0.00805036233607802*G0_0_0_0_4 - 0.0278959136102041*G0_0_0_0_5 + 0.0163341420484307*G0_0_0_0_6 - 0.00344798059083831*G0_0_0_0_7 + 0.00339470053755825*G0_0_0_0_8 + 0.00149184149184176*G0_0_0_0_9 + 0.000669806384092208*G0_0_0_1_0 - 0.0160234826901522*G0_0_0_1_1 + 0.00103712865617646*G0_0_0_1_2 + 0.0196780996781031*G0_0_0_1_4 - 0.00218701932987685*G0_0_0_1_5 + 0.0143526314954911*G0_0_0_1_6 - 0.000142080142080121*G0_0_0_1_7 - 0.00222000222000266*G0_0_0_1_8 + 0.00852480852480993*G0_0_0_1_9 + 0.0056220322886999*G0_0_0_2_0 + 0.00103712865617645*G0_0_0_2_1 + 0.0339334739334794*G0_0_0_2_2 - 0.00245595674167142*G0_0_0_2_3 + 0.0293750693750744*G0_0_0_2_4 - 0.0347081489938691*G0_0_0_2_5 + 0.0576490176490273*G0_0_0_2_6 - 0.00207284778713383*G0_0_0_2_7 + 0.00377273520130725*G0_0_0_2_8 + 0.0125132010846318*G0_0_0_2_9 - 0.00675388103959652*G0_0_0_3_0 - 0.00245595674167142*G0_0_0_3_2 - 0.0879120879121031*G0_0_0_3_3 - 0.10880548023407*G0_0_0_3_4 + 0.0190438133295309*G0_0_0_3_5 - 0.0543228200371146*G0_0_0_3_6 + 0.00899671756814772*G0_0_0_3_7 + 0.0135864135864157*G0_0_0_3_8 - 0.0435678607107252*G0_0_0_3_9 + 0.00805036233607802*G0_0_0_4_0 + 0.0196780996781031*G0_0_0_4_1 + 0.0293750693750744*G0_0_0_4_2 - 0.10880548023407*G0_0_0_4_3 + 0.209801626944519*G0_0_0_4_4 - 0.0354160125588757*G0_0_0_4_5 + 0.0897388325959904*G0_0_0_4_6 - 0.00333380904809534*G0_0_0_4_7 - 0.0225831311545634*G0_0_0_4_8 + 0.0332924218638559*G0_0_0_4_9 - 0.027895913610204*G0_0_0_5_0 - 0.00218701932987685*G0_0_0_5_1 - 0.0347081489938691*G0_0_0_5_2 + 0.0190438133295309*G0_0_0_5_3 - 0.0354160125588757*G0_0_0_5_4 + 0.114217211360088*G0_0_0_5_5 - 0.0190209790209823*G0_0_0_5_6 + 0.00975024975025138*G0_0_0_5_7 - 0.00470386756101118*G0_0_0_5_8 + 0.00493221064649712*G0_0_0_5_9 + 0.0163341420484307*G0_0_0_6_0 + 0.0143526314954911*G0_0_0_6_1 + 0.0576490176490273*G0_0_0_6_2 - 0.0543228200371146*G0_0_0_6_3 + 0.0897388325959904*G0_0_0_6_4 - 0.0190209790209823*G0_0_0_6_5 + 0.556335093478044*G0_0_0_6_6 - 0.00504638218924015*G0_0_0_6_7 - 0.0215555872698764*G0_0_0_6_8 + 0.071106036820334*G0_0_0_6_9 - 0.00344798059083831*G0_0_0_7_0 - 0.00014208014208012*G0_0_0_7_1 - 0.00207284778713383*G0_0_0_7_2 + 0.00899671756814772*G0_0_0_7_3 - 0.00333380904809534*G0_0_0_7_4 + 0.00975024975025138*G0_0_0_7_5 - 0.00504638218924015*G0_0_0_7_6 + 0.0213729128014879*G0_0_0_7_7 - 0.0150706436420747*G0_0_0_7_8 + 0.00561723990295515*G0_0_0_7_9 + 0.00339470053755825*G0_0_0_8_0 - 0.00222000222000266*G0_0_0_8_1 + 0.00377273520130725*G0_0_0_8_2 + 0.0135864135864157*G0_0_0_8_3 - 0.0225831311545634*G0_0_0_8_4 - 0.00470386756101118*G0_0_0_8_5 - 0.0215555872698764*G0_0_0_8_6 - 0.0150706436420747*G0_0_0_8_7 + 0.0479520479520557*G0_0_0_8_8 + 0.0195918367346971*G0_0_0_8_9 + 0.00149184149184176*G0_0_0_9_0 + 0.00852480852480993*G0_0_0_9_1 + 0.0125132010846318*G0_0_0_9_2 - 0.0435678607107252*G0_0_0_9_3 + 0.0332924218638559*G0_0_0_9_4 + 0.00493221064649712*G0_0_0_9_5 + 0.071106036820334*G0_0_0_9_6 + 0.00561723990295515*G0_0_0_9_7 + 0.0195918367346971*G0_0_0_9_8 - 0.00822035107749555*G0_0_0_9_9 - 0.00153018057780002*G0_1_0_0_0 + 0.000795254128587606*G0_1_0_0_1 + 0.00150650055411986*G0_1_0_0_2 + 0.00654329797187048*G0_1_0_0_3 + 0.00274519131662039*G0_1_0_0_4 + 0.000900686614972437*G0_1_0_0_5 - 0.00219716791145394*G0_1_0_0_6 + 0.00902970045827336*G0_1_0_0_7 + 0.00629719486862451*G0_1_0_0_8 + 0.0311155511155564*G0_1_0_0_9 + 0.000795254128587606*G0_1_0_1_0 - 0.000440053773387168*G0_1_0_1_2 - 0.00390720390720451*G0_1_0_1_3 + 0.0178310578310609*G0_1_0_1_4 - 0.00321456321456378*G0_1_0_1_5 + 0.00285936285936335*G0_1_0_1_6 + 0.00433344433344501*G0_1_0_1_7 + 0.00390720390720469*G0_1_0_1_8 - 0.0221645021645059*G0_1_0_1_9 + 0.00150650055411986*G0_1_0_2_0 - 0.000440053773387167*G0_1_0_2_1 - 0.0120373453706807*G0_1_0_2_2 + 0.00970711827854845*G0_1_0_2_3 + 0.0161387818530704*G0_1_0_2_4 - 0.0015273615273618*G0_1_0_2_5 - 0.00651285222713896*G0_1_0_2_6 - 0.00602318316604132*G0_1_0_2_7 + 0.00302681445538638*G0_1_0_2_8 + 0.0166842681128423*G0_1_0_2_9 + 0.00654329797187048*G0_1_0_3_0 - 0.00390720390720451*G0_1_0_3_1 + 0.00970711827854845*G0_1_0_3_2 + 0.0559440559440654*G0_1_0_3_3 - 0.127712287712309*G0_1_0_3_4 + 0.00141572713001315*G0_1_0_3_5 - 0.0213957471100365*G0_1_0_3_6 - 0.0324475524475579*G0_1_0_3_7 + 0.0543456543456635*G0_1_0_3_8 + 0.131388611388633*G0_1_0_3_9 + 0.00274519131662039*G0_1_0_4_0 + 0.0178310578310609*G0_1_0_4_1 + 0.0161387818530704*G0_1_0_4_2 - 0.127712287712309*G0_1_0_4_3 + 0.222954188668512*G0_1_0_4_4 - 0.0210532324818075*G0_1_0_4_5 + 0.042448979591844*G0_1_0_4_6 + 0.0113258170401047*G0_1_0_4_7 - 0.0218981018981056*G0_1_0_4_8 - 0.00794633937491209*G0_1_0_4_9 + 0.000900686614972436*G0_1_0_5_0 - 0.00321456321456378*G0_1_0_5_1 - 0.0015273615273618*G0_1_0_5_2 + 0.00141572713001315*G0_1_0_5_3 - 0.0210532324818075*G0_1_0_5_4 + 0.01237619523334*G0_1_0_5_5 + 0.00730697873555128*G0_1_0_5_6 - 0.00207792207792249*G0_1_0_5_7 - 0.00317396888825506*G0_1_0_5_8 - 0.0869987155701589*G0_1_0_5_9 - 0.00219716791145394*G0_1_0_6_0 + 0.00285936285936335*G0_1_0_6_1 - 0.00651285222713896*G0_1_0_6_2 - 0.0213957471100365*G0_1_0_6_3 + 0.042448979591844*G0_1_0_6_4 + 0.00730697873555128*G0_1_0_6_5 + 0.00223776223776261*G0_1_0_6_6 + 0.00525189096617756*G0_1_0_6_7 - 0.00242043670615142*G0_1_0_6_8 - 0.00726131011845419*G0_1_0_6_9 + 0.00902970045827336*G0_1_0_7_0 + 0.00433344433344501*G0_1_0_7_1 - 0.00602318316604132*G0_1_0_7_2 - 0.0324475524475579*G0_1_0_7_3 + 0.0113258170401047*G0_1_0_7_4 - 0.00207792207792249*G0_1_0_7_5 + 0.00525189096617756*G0_1_0_7_6 + 0.0503268160411102*G0_1_0_7_7 - 0.0596203796203897*G0_1_0_7_8 - 0.103850435279024*G0_1_0_7_9 + 0.00629719486862451*G0_1_0_8_0 + 0.00390720390720469*G0_1_0_8_1 + 0.00302681445538638*G0_1_0_8_2 + 0.0543456543456635*G0_1_0_8_3 - 0.0218981018981056*G0_1_0_8_4 - 0.00317396888825506*G0_1_0_8_5 - 0.00242043670615142*G0_1_0_8_6 - 0.0596203796203897*G0_1_0_8_7 - 0.164635364635393*G0_1_0_8_8 + 0.110289710289729*G0_1_0_8_9 + 0.0311155511155564*G0_1_0_9_0 - 0.0221645021645059*G0_1_0_9_1 + 0.0166842681128423*G0_1_0_9_2 + 0.131388611388633*G0_1_0_9_3 - 0.0079463393749121*G0_1_0_9_4 - 0.0869987155701589*G0_1_0_9_5 - 0.0072613101184542*G0_1_0_9_6 - 0.103850435279024*G0_1_0_9_7 + 0.110289710289729*G0_1_0_9_8 - 0.0723390894819591*G0_1_0_9_9; + A[149] = A[221] - 0.0201460620508276*G0_0_0_0_0 - 0.00252135871183533*G0_0_0_0_2 + 0.00351648351648413*G0_0_0_0_3 + 0.00219209362066544*G0_0_0_0_4 - 0.013208378922667*G0_0_0_0_5 + 0.010889428032287*G0_0_0_0_6 - 0.0114476000190307*G0_0_0_0_7 + 0.00618048618048728*G0_0_0_0_8 - 0.00182674468388789*G0_0_0_0_9 + 0.0201460620508274*G0_0_0_1_1 + 0.00252135871183533*G0_0_0_1_2 + 0.0132083789226669*G0_0_0_1_3 - 0.010889428032287*G0_0_0_1_4 - 0.00351648351648411*G0_0_0_1_5 - 0.00219209362066541*G0_0_0_1_6 - 0.00618048618048726*G0_0_0_1_7 + 0.0114476000190306*G0_0_0_1_8 + 0.00182674468388786*G0_0_0_1_9 - 0.00252135871183533*G0_0_0_2_0 + 0.00252135871183533*G0_0_0_2_1 - 0.0029836829836835*G0_0_0_2_3 - 0.00127872127872148*G0_0_0_2_4 + 0.00298368298368345*G0_0_0_2_5 + 0.00127872127872155*G0_0_0_2_6 - 0.000913372341943922*G0_0_0_2_7 + 0.000913372341943933*G0_0_0_2_8 + 0.00351648351648413*G0_0_0_3_0 + 0.0132083789226669*G0_0_0_3_1 - 0.0029836829836835*G0_0_0_3_2 + 0.082842871414314*G0_0_0_3_3 + 0.0151619808762692*G0_0_0_3_4 + 0.00657628086199617*G0_0_0_3_6 - 0.0105494505494523*G0_0_0_3_7 + 0.0132895675752841*G0_0_0_3_8 + 0.0156186670472411*G0_0_0_3_9 + 0.00219209362066544*G0_0_0_4_0 - 0.010889428032287*G0_0_0_4_1 - 0.00127872127872148*G0_0_0_4_2 + 0.0151619808762692*G0_0_0_4_3 + 0.140659340659365*G0_0_0_4_4 - 0.00657628086199622*G0_0_0_4_5 - 0.00191808191808225*G0_0_0_4_7 - 0.0027401170258318*G0_0_0_4_8 + 0.0131525617239925*G0_0_0_4_9 - 0.013208378922667*G0_0_0_5_0 - 0.00351648351648411*G0_0_0_5_1 + 0.00298368298368345*G0_0_0_5_2 - 0.00657628086199622*G0_0_0_5_4 - 0.0828428714143139*G0_0_0_5_5 - 0.0151619808762692*G0_0_0_5_6 - 0.0132895675752841*G0_0_0_5_7 + 0.0105494505494523*G0_0_0_5_8 - 0.015618667047241*G0_0_0_5_9 + 0.010889428032287*G0_0_0_6_0 - 0.00219209362066541*G0_0_0_6_1 + 0.00127872127872155*G0_0_0_6_2 + 0.00657628086199617*G0_0_0_6_3 - 0.0151619808762692*G0_0_0_6_5 - 0.140659340659364*G0_0_0_6_6 + 0.00274011702583176*G0_0_0_6_7 + 0.00191808191808217*G0_0_0_6_8 - 0.0131525617239924*G0_0_0_6_9 - 0.0114476000190307*G0_0_0_7_0 - 0.00618048618048726*G0_0_0_7_1 - 0.000913372341943922*G0_0_0_7_2 - 0.0105494505494523*G0_0_0_7_3 - 0.00191808191808225*G0_0_0_7_4 - 0.0132895675752841*G0_0_0_7_5 + 0.00274011702583176*G0_0_0_7_6 + 0.00618048618048728*G0_0_0_8_0 + 0.0114476000190306*G0_0_0_8_1 + 0.000913372341943934*G0_0_0_8_2 + 0.0132895675752841*G0_0_0_8_3 - 0.0027401170258318*G0_0_0_8_4 + 0.0105494505494523*G0_0_0_8_5 + 0.00191808191808218*G0_0_0_8_6 - 0.00182674468388789*G0_0_0_9_0 + 0.00182674468388786*G0_0_0_9_1 + 0.0156186670472411*G0_0_0_9_3 + 0.0131525617239925*G0_0_0_9_4 - 0.015618667047241*G0_0_0_9_5 - 0.0131525617239924*G0_0_0_9_6 - 0.0200276619324277*G0_0_1_0_0 + 0.00112029064410034*G0_0_1_0_1 - 0.000102331530902997*G0_0_1_0_2 + 0.00706087563230542*G0_0_1_0_3 + 0.000507429078857751*G0_0_1_0_4 - 0.00484087341230293*G0_0_1_0_5 + 0.00248132819561439*G0_0_1_0_6 - 0.0189626246769138*G0_0_1_0_7 + 0.00612466898181297*G0_0_1_0_8 + 0.0147357404500286*G0_0_1_0_9 + 0.00112029064410035*G0_0_1_1_0 + 0.0314391781058503*G0_0_1_1_1 + 0.00283060854489473*G0_0_1_1_2 + 0.0215809587238195*G0_0_1_1_3 - 0.0128531785674665*G0_0_1_1_4 - 0.00245341959627716*G0_0_1_1_5 + 0.00178615035757922*G0_0_1_1_6 - 0.0124573838859575*G0_0_1_1_7 + 0.0113816342387791*G0_0_1_1_8 - 0.00779411065125483*G0_0_1_1_9 - 0.000102331530902997*G0_0_1_2_0 + 0.00283060854489473*G0_0_1_2_1 + 0.00301525634859013*G0_0_1_2_2 + 0.00319680319680373*G0_0_1_2_3 - 0.00396555825127322*G0_0_1_2_4 - 0.00157303014445896*G0_0_1_2_5 - 0.000971726686012592*G0_0_1_2_6 + 0.000903223760366767*G0_0_1_2_7 + 0.00772307058021473*G0_0_1_2_8 - 0.000487131915703443*G0_0_1_2_9 + 0.00706087563230542*G0_0_1_3_0 + 0.0215809587238195*G0_0_1_3_1 + 0.00319680319680373*G0_0_1_3_2 + 0.101886684743844*G0_0_1_3_3 - 0.0120336806051111*G0_0_1_3_4 - 0.00529755958327477*G0_0_1_3_5 - 0.00858570001427281*G0_0_1_3_6 - 0.0244098758384514*G0_0_1_3_7 + 0.0508063365206307*G0_0_1_3_8 + 0.0722020836306673*G0_0_1_3_9 + 0.000507429078857751*G0_0_1_4_0 - 0.0128531785674665*G0_0_1_4_1 - 0.00396555825127322*G0_0_1_4_2 - 0.0120336806051111*G0_0_1_4_3 + 0.161758241758269*G0_0_1_4_4 - 0.00474953617810837*G0_0_1_4_5 + 0.0133352361923812*G0_0_1_4_6 - 0.00050235478806916*G0_0_1_4_7 - 0.0263964606821794*G0_0_1_4_8 + 0.010960468103327*G0_0_1_4_9 - 0.00484087341230293*G0_0_1_5_0 - 0.00245341959627716*G0_0_1_5_1 - 0.00157303014445896*G0_0_1_5_2 - 0.00529755958327477*G0_0_1_5_3 - 0.00474953617810837*G0_0_1_5_4 - 0.00342514628228981*G0_0_1_5_5 + 0.00376766091051874*G0_0_1_5_6 + 0.00180391037533918*G0_0_1_5_7 + 0.0041330098472963*G0_0_1_5_8 - 0.0524732410446785*G0_0_1_5_9 + 0.00248132819561439*G0_0_1_6_0 + 0.00178615035757922*G0_0_1_6_1 - 0.000971726686012592*G0_0_1_6_2 - 0.00858570001427281*G0_0_1_6_3 + 0.0133352361923812*G0_0_1_6_4 + 0.00376766091051874*G0_0_1_6_5 + 0.0200028542885717*G0_0_1_6_6 - 0.00593692022263546*G0_0_1_6_7 - 0.0126502069359233*G0_0_1_6_8 + 0.018632795775656*G0_0_1_6_9 - 0.0189626246769138*G0_0_1_7_0 - 0.0124573838859575*G0_0_1_7_1 + 0.000903223760366767*G0_0_1_7_2 - 0.0244098758384514*G0_0_1_7_3 - 0.00050235478806916*G0_0_1_7_4 + 0.00180391037533918*G0_0_1_7_5 - 0.00593692022263546*G0_0_1_7_6 + 0.205600114171577*G0_0_1_7_7 + 0.0142029399172281*G0_0_1_7_8 - 0.0323333809048149*G0_0_1_7_9 + 0.00612466898181297*G0_0_1_8_0 + 0.0113816342387791*G0_0_1_8_1 + 0.00772307058021473*G0_0_1_8_2 + 0.0508063365206307*G0_0_1_8_3 - 0.0263964606821794*G0_0_1_8_4 + 0.0041330098472963*G0_0_1_8_5 - 0.0126502069359233*G0_0_1_8_6 + 0.0142029399172281*G0_0_1_8_7 + 0.032424718139009*G0_0_1_8_8 + 0.0761752533181233*G0_0_1_8_9 + 0.0147357404500286*G0_0_1_9_0 - 0.00779411065125483*G0_0_1_9_1 - 0.000487131915703443*G0_0_1_9_2 + 0.0722020836306673*G0_0_1_9_3 + 0.010960468103327*G0_0_1_9_4 - 0.0524732410446785*G0_0_1_9_5 + 0.018632795775656*G0_0_1_9_6 - 0.0323333809048149*G0_0_1_9_7 + 0.0761752533181232*G0_0_1_9_8 + 0.0887797916369495*G0_0_1_9_9 + 0.011293116055023*G0_1_0_0_0 + 0.00112029064410036*G0_1_0_0_1 + 0.00030924983305942*G0_1_0_0_2 + 0.00106306392020697*G0_1_0_0_3 + 0.00397824397824469*G0_1_0_0_4 + 0.00837257980115268*G0_1_0_0_5 - 0.00196375053517946*G0_1_0_0_6 - 0.00627689770547027*G0_1_0_0_8 - 0.00962085533514264*G0_1_0_0_9 + 0.00112029064410036*G0_1_0_1_0 + 0.000118400118399855*G0_1_0_1_1 + 0.00241902718093235*G0_1_0_1_2 + 0.00836750551036396*G0_1_0_1_3 - 0.00840809983667262*G0_1_0_1_4 + 0.00354439211582129*G0_1_0_1_5 - 0.00168466454180768*G0_1_0_1_6 - 0.00751502465788321*G0_1_0_1_8 + 0.0165624851339165*G0_1_0_1_9 + 0.000309249833059419*G0_1_0_2_0 + 0.00241902718093235*G0_1_0_2_1 + 0.00301525634859026*G0_1_0_2_2 - 0.00455671312814253*G0_1_0_2_3 - 0.00225044796473398*G0_1_0_2_4 + 0.0061804861804872*G0_1_0_2_5 - 0.00268683697255167*G0_1_0_2_6 + 0.00680969823827084*G0_1_0_2_7 + 0.00181659610231068*G0_1_0_2_8 - 0.000487131915703412*G0_1_0_2_9 + 0.00106306392020697*G0_1_0_3_0 + 0.00836750551036396*G0_1_0_3_1 - 0.00455671312814253*G0_1_0_3_2 + 0.0794177251320245*G0_1_0_3_3 + 0.0189296417867879*G0_1_0_3_4 - 0.00529755958327477*G0_1_0_3_5 + 0.00182674468388784*G0_1_0_3_6 - 0.00641644070215608*G0_1_0_3_7 + 0.0150934779506233*G0_1_0_3_8 - 0.0368545739974372*G0_1_0_3_9 + 0.00397824397824469*G0_1_0_4_0 - 0.00840809983667262*G0_1_0_4_1 - 0.00225044796473398*G0_1_0_4_2 + 0.0189296417867879*G0_1_0_4_3 + 0.160662194947937*G0_1_0_4_4 - 0.0151619808762692*G0_1_0_4_5 + 0.0133352361923814*G0_1_0_4_6 - 0.0145682888540057*G0_1_0_4_7 - 0.00867703724846724*G0_1_0_4_8 + 0.0317853574996486*G0_1_0_4_9 + 0.00837257980115268*G0_1_0_5_0 + 0.00354439211582129*G0_1_0_5_1 + 0.0061804861804872*G0_1_0_5_2 - 0.00529755958327476*G0_1_0_5_3 - 0.0151619808762692*G0_1_0_5_4 + 0.0190438133295308*G0_1_0_5_5 - 0.0271956614813804*G0_1_0_5_6 + 0.0375167689453468*G0_1_0_5_7 - 0.0138604252889991*G0_1_0_5_8 + 0.0565834165834262*G0_1_0_5_9 - 0.00196375053517946*G0_1_0_6_0 - 0.00168466454180768*G0_1_0_6_1 - 0.00268683697255167*G0_1_0_6_2 + 0.00182674468388784*G0_1_0_6_3 + 0.0133352361923814*G0_1_0_6_4 - 0.0271956614813804*G0_1_0_6_5 + 0.0210989010989048*G0_1_0_6_6 - 0.0236563436563477*G0_1_0_6_7 + 0.00141572713001312*G0_1_0_6_8 - 0.00219209362066541*G0_1_0_6_9 + 0.00680969823827084*G0_1_0_7_2 - 0.00641644070215608*G0_1_0_7_3 - 0.0145682888540057*G0_1_0_7_4 + 0.0375167689453468*G0_1_0_7_5 - 0.0236563436563477*G0_1_0_7_6 + 0.0324247181390101*G0_1_0_7_7 + 0.0142029399172279*G0_1_0_7_8 + 0.0761752533181234*G0_1_0_7_9 - 0.00627689770547027*G0_1_0_8_0 - 0.00751502465788321*G0_1_0_8_1 + 0.00181659610231068*G0_1_0_8_2 + 0.0150934779506233*G0_1_0_8_3 - 0.00867703724846724*G0_1_0_8_4 - 0.0138604252889991*G0_1_0_8_5 + 0.00141572713001312*G0_1_0_8_6 + 0.0142029399172279*G0_1_0_8_7 + 0.205600114171578*G0_1_0_8_8 - 0.0323333809048149*G0_1_0_8_9 - 0.00962085533514264*G0_1_0_9_0 + 0.0165624851339165*G0_1_0_9_1 - 0.000487131915703412*G0_1_0_9_2 - 0.0368545739974372*G0_1_0_9_3 + 0.0317853574996486*G0_1_0_9_4 + 0.0565834165834262*G0_1_0_9_5 - 0.00219209362066541*G0_1_0_9_6 + 0.0761752533181235*G0_1_0_9_7 - 0.0323333809048149*G0_1_0_9_8 + 0.0887797916369495*G0_1_0_9_9 + 0.0175209622828701*G0_1_1_0_0 + 0.00112029064410035*G0_1_1_0_1 + 0.0014704167085122*G0_1_1_0_2 + 0.00670313813171068*G0_1_1_0_3 + 0.000918446632732556*G0_1_1_0_4 + 0.00842839699982702*G0_1_1_0_5 - 0.00531785674642908*G0_1_1_0_6 + 0.0361086532515166*G0_1_1_0_7 - 0.0242957042957085*G0_1_1_0_8 + 0.0194243851386742*G0_1_1_0_9 + 0.00112029064410035*G0_1_1_1_0 - 0.00610944610944737*G0_1_1_1_1 + 0.00125786030547957*G0_1_1_1_2 + 0.00831168831168963*G0_1_1_1_3 - 0.00505399362542298*G0_1_1_1_4 - 0.00209568209568243*G0_1_1_1_5 + 0.00137513280370445*G0_1_1_1_6 + 0.0179629893915639*G0_1_1_1_7 - 0.0436896436896512*G0_1_1_1_8 - 0.0124827553399003*G0_1_1_1_9 + 0.0014704167085122*G0_1_1_2_0 + 0.00125786030547957*G0_1_1_2_1 + 0.00301525634859021*G0_1_1_2_2 + 0.00346066631780969*G0_1_1_2_3 - 0.00293294007579763*G0_1_1_2_4 - 0.001836893265465*G0_1_1_2_5 - 0.00200434486148804*G0_1_1_2_6 + 0.00667269238697923*G0_1_1_2_7 + 0.00195360195360227*G0_1_1_2_8 - 0.000487131915703436*G0_1_1_2_9 + 0.00670313813171068*G0_1_1_3_0 + 0.00831168831168963*G0_1_1_3_1 + 0.00346066631780969*G0_1_1_3_2 + 0.133169687455424*G0_1_1_3_3 - 0.017947766519198*G0_1_1_3_4 - 0.00529755958327473*G0_1_1_3_5 - 0.00735264735264857*G0_1_1_3_6 - 0.0233366633366673*G0_1_1_3_7 + 0.0324247181390092*G0_1_1_3_8 + 0.0841215926930354*G0_1_1_3_9 + 0.000918446632732555*G0_1_1_4_0 - 0.00505399362542298*G0_1_1_4_1 - 0.00293294007579763*G0_1_1_4_2 - 0.017947766519198*G0_1_1_4_3 + 0.18194377051523*G0_1_1_4_4 - 0.00598258883973277*G0_1_1_4_5 + 0.0133352361923814*G0_1_1_4_6 - 0.00977308405880004*G0_1_1_4_7 - 0.00908805480234198*G0_1_1_4_8 + 0.0134265734265758*G0_1_1_4_9 + 0.00842839699982702*G0_1_1_5_0 - 0.00209568209568243*G0_1_1_5_1 - 0.001836893265465*G0_1_1_5_2 - 0.00529755958327473*G0_1_1_5_3 - 0.00598258883973277*G0_1_1_5_4 - 0.0347081489938691*G0_1_1_5_5 + 0.00968174682460556*G0_1_1_5_6 + 0.0201855287569607*G0_1_1_5_7 + 0.00305979734551221*G0_1_1_5_8 - 0.0643927501070467*G0_1_1_5_9 - 0.00531785674642908*G0_1_1_6_0 + 0.00137513280370445*G0_1_1_6_1 - 0.00200434486148804*G0_1_1_6_2 - 0.00735264735264857*G0_1_1_6_3 + 0.0133352361923814*G0_1_1_6_4 + 0.00968174682460556*G0_1_1_6_5 - 0.000182674468388798*G0_1_1_6_6 - 0.0232453261024729*G0_1_1_6_7 - 0.00337947766519253*G0_1_1_6_8 + 0.0161666904524075*G0_1_1_6_9 + 0.0361086532515166*G0_1_1_7_0 + 0.0179629893915639*G0_1_1_7_1 + 0.00667269238697923*G0_1_1_7_2 - 0.0233366633366673*G0_1_1_7_3 - 0.00977308405880004*G0_1_1_7_4 + 0.0201855287569607*G0_1_1_7_5 - 0.0232453261024729*G0_1_1_7_6 + 0.40151848151855*G0_1_1_7_7 + 0.014202939917228*G0_1_1_7_8 - 0.0117825032110765*G0_1_1_7_9 - 0.0242957042957085*G0_1_1_8_0 - 0.0436896436896512*G0_1_1_8_1 + 0.00195360195360227*G0_1_1_8_2 + 0.0324247181390092*G0_1_1_8_3 - 0.00908805480234199*G0_1_1_8_4 + 0.00305979734551221*G0_1_1_8_5 - 0.00337947766519253*G0_1_1_8_6 + 0.014202939917228*G0_1_1_8_7 - 0.163493649207963*G0_1_1_8_8 + 0.0556243756243849*G0_1_1_8_9 + 0.0194243851386742*G0_1_1_9_0 - 0.0124827553399003*G0_1_1_9_1 - 0.000487131915703437*G0_1_1_9_2 + 0.0841215926930354*G0_1_1_9_3 + 0.0134265734265758*G0_1_1_9_4 - 0.0643927501070467*G0_1_1_9_5 + 0.0161666904524075*G0_1_1_9_6 - 0.0117825032110765*G0_1_1_9_7 + 0.0556243756243849*G0_1_1_9_8 + 0.0887797916369491*G0_1_1_9_9; + A[133] = A[221] + 0.0105612905612925*G0_0_0_0_0 + 0.00161136923041713*G0_0_0_0_1 + 0.00184675994199838*G0_0_0_0_2 + 0.00457701029129679*G0_0_0_0_3 - 0.006969538398111*G0_0_0_0_4 + 0.0173718345146946*G0_0_0_0_5 - 0.000157303014445899*G0_0_0_0_6 + 0.00259042544756874*G0_0_0_0_7 - 0.000187748759177368*G0_0_0_0_8 - 0.000152228723657314*G0_0_0_0_9 + 0.00161136923041713*G0_0_0_1_0 + 0.0320469653803042*G0_0_0_1_1 + 0.000776648395696167*G0_0_0_1_2 + 0.0384402898688678*G0_0_0_1_3 - 0.0255033855033898*G0_0_0_1_4 - 0.00404674690389041*G0_0_0_1_6 - 0.00783470497756348*G0_0_0_1_7 + 0.0159053644767958*G0_0_0_1_8 + 0.00243565957851717*G0_0_0_1_9 + 0.00184675994199838*G0_0_0_2_0 + 0.000776648395696167*G0_0_0_2_1 - 0.00480704480704516*G0_0_0_2_2 + 0.0169481312338483*G0_0_0_2_3 - 0.0349161949162006*G0_0_0_2_4 - 0.000669806384092321*G0_0_0_2_5 + 0.0224841824841865*G0_0_0_2_6 - 0.00162631019773905*G0_0_0_2_7 + 0.000352663209806138*G0_0_0_2_8 - 0.00654583511726477*G0_0_0_2_9 + 0.00457701029129679*G0_0_0_3_0 + 0.0384402898688678*G0_0_0_3_1 + 0.0169481312338483*G0_0_0_3_2 + 0.0239760239760284*G0_0_0_3_3 + 0.0260996146710475*G0_0_0_3_4 - 0.00799200799200934*G0_0_0_3_5 + 0.0142714428428737*G0_0_0_3_6 - 0.0115998287426879*G0_0_0_3_7 + 0.0105266162409038*G0_0_0_3_8 + 0.0158926787498243*G0_0_0_3_9 - 0.006969538398111*G0_0_0_4_0 - 0.0255033855033898*G0_0_0_4_1 - 0.0349161949162006*G0_0_0_4_2 + 0.0260996146710475*G0_0_0_4_3 - 0.0934379905808628*G0_0_0_4_4 + 0.0230398173255354*G0_0_0_4_5 - 0.0373112601684091*G0_0_0_4_6 + 0.0118281718281738*G0_0_0_4_7 + 0.00107321250178406*G0_0_0_4_8 - 0.0264421292992765*G0_0_0_4_9 + 0.0173718345146946*G0_0_0_5_0 - 0.000669806384092317*G0_0_0_5_2 - 0.00799200799200934*G0_0_0_5_3 + 0.0230398173255354*G0_0_0_5_4 - 0.0422434708149064*G0_0_0_5_5 - 0.0491622663051319*G0_0_0_5_6 - 0.00901955187669624*G0_0_0_5_7 + 0.00200941915227662*G0_0_0_5_8 - 0.0035621521335813*G0_0_0_5_9 - 0.000157303014445899*G0_0_0_6_0 - 0.0040467469038904*G0_0_0_6_1 + 0.0224841824841865*G0_0_0_6_2 + 0.0142714428428737*G0_0_0_6_3 - 0.0373112601684091*G0_0_0_6_4 - 0.0491622663051319*G0_0_0_6_5 + 0.00885971171685684*G0_0_0_6_6 + 0.00701013272441962*G0_0_0_6_7 + 0.00447552447552518*G0_0_0_6_8 - 0.00890538033395308*G0_0_0_6_9 + 0.00259042544756874*G0_0_0_7_0 - 0.00783470497756348*G0_0_0_7_1 - 0.00162631019773905*G0_0_0_7_2 - 0.0115998287426879*G0_0_0_7_3 + 0.0118281718281738*G0_0_0_7_4 - 0.00901955187669623*G0_0_0_7_5 + 0.00701013272441961*G0_0_0_7_6 - 0.0215555872698767*G0_0_0_7_7 + 0.000365348936777599*G0_0_0_7_8 - 0.0135635792778673*G0_0_0_7_9 - 0.000187748759177367*G0_0_0_8_0 + 0.0159053644767958*G0_0_0_8_1 + 0.000352663209806138*G0_0_0_8_2 + 0.0105266162409038*G0_0_0_8_3 + 0.00107321250178406*G0_0_0_8_4 + 0.00200941915227662*G0_0_0_8_5 + 0.00447552447552518*G0_0_0_8_6 + 0.000365348936777599*G0_0_0_8_7 - 0.0130612244897979*G0_0_0_8_8 - 0.00945340373911958*G0_0_0_8_9 - 0.000152228723657315*G0_0_0_9_0 + 0.00243565957851717*G0_0_0_9_1 - 0.00654583511726477*G0_0_0_9_2 + 0.0158926787498243*G0_0_0_9_3 - 0.0264421292992765*G0_0_0_9_4 - 0.0035621521335813*G0_0_0_9_5 - 0.00890538033395308*G0_0_0_9_6 - 0.0135635792778673*G0_0_0_9_7 - 0.00945340373911958*G0_0_0_9_8 + 0.0115084915084937*G0_0_0_9_9 + 0.00219857743667307*G0_0_1_0_1 - 0.00219857743667303*G0_0_1_0_2 + 0.00637838352124175*G0_0_1_0_3 - 0.00637838352124172*G0_0_1_0_4 + 0.00124573838859571*G0_0_1_0_5 - 0.00506414220700015*G0_0_1_0_6 - 0.00124573838859578*G0_0_1_0_7 + 0.00506414220700023*G0_0_1_0_8 + 0.00219857743667307*G0_0_1_1_0 + 0.0385668652335386*G0_0_1_1_1 + 0.0477034077034158*G0_0_1_1_3 - 0.0270408956123287*G0_0_1_1_4 + 0.00150706436420745*G0_0_1_1_5 - 0.00480281623138845*G0_0_1_1_6 - 0.0112699998414304*G0_0_1_1_7 + 0.0251126651126695*G0_0_1_1_8 + 0.00755054469340314*G0_0_1_1_9 - 0.00219857743667303*G0_0_1_2_0 - 0.0385668652335379*G0_0_1_2_2 + 0.0270408956123286*G0_0_1_2_3 - 0.0477034077034155*G0_0_1_2_4 + 0.0112699998414302*G0_0_1_2_5 - 0.025112665112669*G0_0_1_2_6 - 0.00150706436420748*G0_0_1_2_7 + 0.00480281623138847*G0_0_1_2_8 - 0.00755054469340304*G0_0_1_2_9 + 0.00637838352124175*G0_0_1_3_0 + 0.0477034077034158*G0_0_1_3_1 + 0.0270408956123286*G0_0_1_3_2 + 0.0372655915513124*G0_0_1_3_3 - 0.0118281718281738*G0_0_1_3_5 + 0.0144084486941653*G0_0_1_3_6 - 0.0191351505637252*G0_0_1_3_7 + 0.0335435992578907*G0_0_1_3_8 + 0.0156186670472411*G0_0_1_3_9 - 0.00637838352124172*G0_0_1_4_0 - 0.0270408956123287*G0_0_1_4_1 - 0.0477034077034155*G0_0_1_4_2 - 0.0372655915513116*G0_0_1_4_4 + 0.0191351505637251*G0_0_1_4_5 - 0.0335435992578904*G0_0_1_4_6 + 0.0118281718281738*G0_0_1_4_7 - 0.0144084486941655*G0_0_1_4_8 - 0.015618667047241*G0_0_1_4_9 + 0.00124573838859571*G0_0_1_5_0 + 0.00150706436420745*G0_0_1_5_1 + 0.0112699998414302*G0_0_1_5_2 - 0.0118281718281738*G0_0_1_5_3 + 0.0191351505637251*G0_0_1_5_4 - 0.00411017553874764*G0_0_1_5_5 + 0.0221264449835914*G0_0_1_5_6 - 0.0045211930926224*G0_0_1_5_8 + 0.00904238618524475*G0_0_1_5_9 - 0.00506414220700015*G0_0_1_6_0 - 0.00480281623138845*G0_0_1_6_1 - 0.025112665112669*G0_0_1_6_2 + 0.0144084486941653*G0_0_1_6_3 - 0.0335435992578904*G0_0_1_6_4 + 0.0221264449835914*G0_0_1_6_5 - 0.0305523048380238*G0_0_1_6_6 + 0.0045211930926224*G0_0_1_6_7 - 0.00616526330812141*G0_0_1_6_9 - 0.00124573838859578*G0_0_1_7_0 - 0.0112699998414304*G0_0_1_7_1 - 0.00150706436420748*G0_0_1_7_2 - 0.0191351505637252*G0_0_1_7_3 + 0.0118281718281738*G0_0_1_7_4 + 0.0045211930926224*G0_0_1_7_6 + 0.00411017553874775*G0_0_1_7_7 - 0.0221264449835916*G0_0_1_7_8 - 0.00904238618524487*G0_0_1_7_9 + 0.00506414220700023*G0_0_1_8_0 + 0.0251126651126695*G0_0_1_8_1 + 0.00480281623138847*G0_0_1_8_2 + 0.0335435992578907*G0_0_1_8_3 - 0.0144084486941655*G0_0_1_8_4 - 0.0045211930926224*G0_0_1_8_5 - 0.0221264449835916*G0_0_1_8_7 + 0.0305523048380249*G0_0_1_8_8 + 0.0061652633081216*G0_0_1_8_9 + 0.00755054469340314*G0_0_1_9_1 - 0.00755054469340304*G0_0_1_9_2 + 0.0156186670472411*G0_0_1_9_3 - 0.015618667047241*G0_0_1_9_4 + 0.00904238618524475*G0_0_1_9_5 - 0.0061652633081214*G0_0_1_9_6 - 0.00904238618524487*G0_0_1_9_7 + 0.0061652633081216*G0_0_1_9_8 + 0.00101993244850404*G0_1_0_0_1 - 0.00101993244850404*G0_1_0_0_2 + 0.000631749203177905*G0_1_0_0_3 - 0.000631749203177881*G0_1_0_0_4 + 0.00941534655820534*G0_1_0_0_5 + 0.00267922553636879*G0_1_0_0_6 - 0.00941534655820528*G0_1_0_0_7 - 0.00267922553636885*G0_1_0_0_8 + 0.00101993244850404*G0_1_0_1_0 + 0.0114532381199064*G0_1_0_1_1 + 0.0342184799327713*G0_1_0_1_3 - 0.0174251145679746*G0_1_0_1_4 - 0.000205508776937377*G0_1_0_1_5 - 0.00433090718805079*G0_1_0_1_6 - 0.00919461490890212*G0_1_0_1_7 - 0.000509966224252172*G0_1_0_1_8 + 0.0205813234384698*G0_1_0_1_9 - 0.00101993244850404*G0_1_0_2_0 - 0.0114532381199064*G0_1_0_2_2 + 0.0174251145679746*G0_1_0_2_3 - 0.0342184799327712*G0_1_0_2_4 + 0.00919461490890216*G0_1_0_2_5 + 0.000509966224252088*G0_1_0_2_6 + 0.000205508776937386*G0_1_0_2_7 + 0.00433090718805077*G0_1_0_2_8 - 0.0205813234384697*G0_1_0_2_9 + 0.000631749203177905*G0_1_0_3_0 + 0.0342184799327713*G0_1_0_3_1 + 0.0174251145679746*G0_1_0_3_2 + 0.0371285857000212*G0_1_0_3_3 - 0.000639360639360765*G0_1_0_3_5 + 0.0129927215641523*G0_1_0_3_6 - 0.00189524760953367*G0_1_0_3_7 + 0.014887969173686*G0_1_0_3_8 - 0.0579534750963418*G0_1_0_3_9 - 0.000631749203177881*G0_1_0_4_0 - 0.0174251145679746*G0_1_0_4_1 - 0.0342184799327712*G0_1_0_4_2 - 0.03712858570002*G0_1_0_4_4 + 0.0018952476095336*G0_1_0_4_5 - 0.0148879691736859*G0_1_0_4_6 + 0.000639360639360726*G0_1_0_4_7 - 0.0129927215641523*G0_1_0_4_8 + 0.057953475096342*G0_1_0_4_9 + 0.00941534655820534*G0_1_0_5_0 - 0.000205508776937377*G0_1_0_5_1 + 0.00919461490890216*G0_1_0_5_2 - 0.000639360639360761*G0_1_0_5_3 + 0.0018952476095336*G0_1_0_5_4 + 0.0371285857000206*G0_1_0_5_5 - 0.0437048665620168*G0_1_0_5_6 + 0.000616526330812119*G0_1_0_5_8 - 0.00123305266162428*G0_1_0_5_9 + 0.00267922553636879*G0_1_0_6_0 - 0.00433090718805079*G0_1_0_6_1 + 0.00050996622425209*G0_1_0_6_2 + 0.0129927215641523*G0_1_0_6_3 - 0.0148879691736859*G0_1_0_6_4 - 0.0437048665620168*G0_1_0_6_5 - 0.183724846582021*G0_1_0_6_6 - 0.000616526330812177*G0_1_0_6_7 + 0.0357585271871047*G0_1_0_6_9 - 0.00941534655820528*G0_1_0_7_0 - 0.00919461490890212*G0_1_0_7_1 + 0.000205508776937386*G0_1_0_7_2 - 0.00189524760953367*G0_1_0_7_3 + 0.000639360639360726*G0_1_0_7_4 - 0.000616526330812177*G0_1_0_7_6 - 0.0371285857000207*G0_1_0_7_7 + 0.0437048665620169*G0_1_0_7_8 + 0.00123305266162426*G0_1_0_7_9 - 0.00267922553636885*G0_1_0_8_0 - 0.000509966224252172*G0_1_0_8_1 + 0.00433090718805077*G0_1_0_8_2 + 0.014887969173686*G0_1_0_8_3 - 0.0129927215641523*G0_1_0_8_4 + 0.000616526330812117*G0_1_0_8_5 + 0.0437048665620169*G0_1_0_8_7 + 0.183724846582021*G0_1_0_8_8 - 0.0357585271871046*G0_1_0_8_9 + 0.0205813234384698*G0_1_0_9_1 - 0.0205813234384697*G0_1_0_9_2 - 0.0579534750963418*G0_1_0_9_3 + 0.057953475096342*G0_1_0_9_4 - 0.00123305266162428*G0_1_0_9_5 + 0.0357585271871047*G0_1_0_9_6 + 0.00123305266162428*G0_1_0_9_7 - 0.0357585271871046*G0_1_0_9_8 - 0.0105612905612922*G0_1_1_0_0 - 0.00184675994199835*G0_1_1_0_1 - 0.00161136923041711*G0_1_1_0_2 + 0.00696953839811102*G0_1_1_0_3 - 0.00457701029129678*G0_1_1_0_4 - 0.0025904254475687*G0_1_1_0_5 + 0.000187748759177355*G0_1_1_0_6 - 0.0173718345146945*G0_1_1_0_7 + 0.000157303014445876*G0_1_1_0_8 + 0.000152228723657334*G0_1_1_0_9 - 0.00184675994199835*G0_1_1_1_0 + 0.00480704480704537*G0_1_1_1_1 - 0.000776648395696136*G0_1_1_1_2 + 0.0349161949162007*G0_1_1_1_3 - 0.0169481312338483*G0_1_1_1_4 + 0.00162631019773904*G0_1_1_1_5 - 0.000352663209806136*G0_1_1_1_6 + 0.000669806384092225*G0_1_1_1_7 - 0.0224841824841863*G0_1_1_1_8 + 0.0065458351172648*G0_1_1_1_9 - 0.00161136923041711*G0_1_1_2_0 - 0.000776648395696136*G0_1_1_2_1 - 0.0320469653803037*G0_1_1_2_2 + 0.0255033855033897*G0_1_1_2_3 - 0.0384402898688676*G0_1_1_2_4 + 0.00783470497756336*G0_1_1_2_5 - 0.0159053644767955*G0_1_1_2_6 + 0.00404674690389043*G0_1_1_2_8 - 0.00243565957851711*G0_1_1_2_9 + 0.00696953839811102*G0_1_1_3_0 + 0.0349161949162007*G0_1_1_3_1 + 0.0255033855033897*G0_1_1_3_2 + 0.093437990580864*G0_1_1_3_3 - 0.0260996146710477*G0_1_1_3_4 - 0.0118281718281738*G0_1_1_3_5 - 0.00107321250178413*G0_1_1_3_6 - 0.0230398173255355*G0_1_1_3_7 + 0.0373112601684093*G0_1_1_3_8 + 0.0264421292992767*G0_1_1_3_9 - 0.00457701029129678*G0_1_1_4_0 - 0.0169481312338483*G0_1_1_4_1 - 0.0384402898688676*G0_1_1_4_2 - 0.0260996146710477*G0_1_1_4_3 - 0.0239760239760277*G0_1_1_4_4 + 0.0115998287426878*G0_1_1_4_5 - 0.0105266162409037*G0_1_1_4_6 + 0.00799200799200932*G0_1_1_4_7 - 0.0142714428428738*G0_1_1_4_8 - 0.0158926787498242*G0_1_1_4_9 - 0.0025904254475687*G0_1_1_5_0 + 0.00162631019773904*G0_1_1_5_1 + 0.00783470497756336*G0_1_1_5_2 - 0.0118281718281738*G0_1_1_5_3 + 0.0115998287426878*G0_1_1_5_4 + 0.0215555872698765*G0_1_1_5_5 - 0.000365348936777628*G0_1_1_5_6 + 0.00901955187669621*G0_1_1_5_7 - 0.00701013272441956*G0_1_1_5_8 + 0.0135635792778672*G0_1_1_5_9 + 0.000187748759177355*G0_1_1_6_0 - 0.000352663209806136*G0_1_1_6_1 - 0.0159053644767955*G0_1_1_6_2 - 0.00107321250178413*G0_1_1_6_3 - 0.0105266162409037*G0_1_1_6_4 - 0.000365348936777629*G0_1_1_6_5 + 0.0130612244897979*G0_1_1_6_6 - 0.00200941915227661*G0_1_1_6_7 - 0.00447552447552523*G0_1_1_6_8 + 0.0094534037391196*G0_1_1_6_9 - 0.0173718345146945*G0_1_1_7_0 + 0.000669806384092225*G0_1_1_7_1 - 0.0230398173255355*G0_1_1_7_3 + 0.00799200799200932*G0_1_1_7_4 + 0.00901955187669621*G0_1_1_7_5 - 0.00200941915227661*G0_1_1_7_6 + 0.0422434708149066*G0_1_1_7_7 + 0.0491622663051317*G0_1_1_7_8 + 0.00356215213358124*G0_1_1_7_9 + 0.000157303014445876*G0_1_1_8_0 - 0.0224841824841863*G0_1_1_8_1 + 0.00404674690389043*G0_1_1_8_2 + 0.0373112601684093*G0_1_1_8_3 - 0.0142714428428738*G0_1_1_8_4 - 0.00701013272441956*G0_1_1_8_5 - 0.00447552447552522*G0_1_1_8_6 + 0.0491622663051317*G0_1_1_8_7 - 0.00885971171685596*G0_1_1_8_8 + 0.00890538033395329*G0_1_1_8_9 + 0.000152228723657333*G0_1_1_9_0 + 0.00654583511726479*G0_1_1_9_1 - 0.00243565957851711*G0_1_1_9_2 + 0.0264421292992767*G0_1_1_9_3 - 0.0158926787498242*G0_1_1_9_4 + 0.0135635792778672*G0_1_1_9_5 + 0.0094534037391196*G0_1_1_9_6 + 0.00356215213358124*G0_1_1_9_7 + 0.00890538033395328*G0_1_1_9_8 - 0.0115084915084941*G0_1_1_9_9; + A[88] = -A[133] - 0.00153018057779988*G0_1_0_0_0 + 0.00150650055411984*G0_1_0_0_1 + 0.000795254128587598*G0_1_0_0_2 + 0.00274519131662038*G0_1_0_0_3 + 0.0065432979718705*G0_1_0_0_4 + 0.00902970045827342*G0_1_0_0_5 + 0.00629719486862449*G0_1_0_0_6 + 0.000900686614972447*G0_1_0_0_7 - 0.002197167911454*G0_1_0_0_8 + 0.0311155511155564*G0_1_0_0_9 + 0.00150650055411984*G0_1_0_1_0 - 0.0120373453706809*G0_1_0_1_1 - 0.000440053773387178*G0_1_0_1_2 + 0.0161387818530703*G0_1_0_1_3 + 0.00970711827854851*G0_1_0_1_4 - 0.00602318316604133*G0_1_0_1_5 + 0.00302681445538637*G0_1_0_1_6 - 0.00152736152736174*G0_1_0_1_7 - 0.00651285222713916*G0_1_0_1_8 + 0.0166842681128424*G0_1_0_1_9 + 0.000795254128587598*G0_1_0_2_0 - 0.000440053773387179*G0_1_0_2_1 + 0.0178310578310608*G0_1_0_2_3 - 0.0039072039072045*G0_1_0_2_4 + 0.00433344433344508*G0_1_0_2_5 + 0.0039072039072046*G0_1_0_2_6 - 0.00321456321456375*G0_1_0_2_7 + 0.00285936285936333*G0_1_0_2_8 - 0.0221645021645059*G0_1_0_2_9 + 0.00274519131662038*G0_1_0_3_0 + 0.0161387818530703*G0_1_0_3_1 + 0.0178310578310608*G0_1_0_3_2 + 0.222954188668513*G0_1_0_3_3 - 0.127712287712309*G0_1_0_3_4 + 0.0113258170401047*G0_1_0_3_5 - 0.0218981018981056*G0_1_0_3_6 - 0.0210532324818075*G0_1_0_3_7 + 0.0424489795918439*G0_1_0_3_8 - 0.00794633937491197*G0_1_0_3_9 + 0.0065432979718705*G0_1_0_4_0 + 0.00970711827854851*G0_1_0_4_1 - 0.00390720390720449*G0_1_0_4_2 - 0.127712287712309*G0_1_0_4_3 + 0.055944055944065*G0_1_0_4_4 - 0.0324475524475579*G0_1_0_4_5 + 0.0543456543456634*G0_1_0_4_6 + 0.00141572713001309*G0_1_0_4_7 - 0.0213957471100364*G0_1_0_4_8 + 0.131388611388633*G0_1_0_4_9 + 0.00902970045827342*G0_1_0_5_0 - 0.00602318316604133*G0_1_0_5_1 + 0.00433344433344508*G0_1_0_5_2 + 0.0113258170401047*G0_1_0_5_3 - 0.0324475524475579*G0_1_0_5_4 + 0.05032681604111*G0_1_0_5_5 - 0.0596203796203898*G0_1_0_5_6 - 0.00207792207792245*G0_1_0_5_7 + 0.00525189096617759*G0_1_0_5_8 - 0.103850435279024*G0_1_0_5_9 + 0.00629719486862449*G0_1_0_6_0 + 0.00302681445538637*G0_1_0_6_1 + 0.0039072039072046*G0_1_0_6_2 - 0.0218981018981056*G0_1_0_6_3 + 0.0543456543456634*G0_1_0_6_4 - 0.0596203796203898*G0_1_0_6_5 - 0.164635364635393*G0_1_0_6_6 - 0.00317396888825516*G0_1_0_6_7 - 0.0024204367061514*G0_1_0_6_8 + 0.110289710289729*G0_1_0_6_9 + 0.000900686614972448*G0_1_0_7_0 - 0.00152736152736174*G0_1_0_7_1 - 0.00321456321456375*G0_1_0_7_2 - 0.0210532324818075*G0_1_0_7_3 + 0.00141572713001309*G0_1_0_7_4 - 0.00207792207792245*G0_1_0_7_5 - 0.00317396888825516*G0_1_0_7_6 + 0.01237619523334*G0_1_0_7_7 + 0.00730697873555149*G0_1_0_7_8 - 0.0869987155701588*G0_1_0_7_9 - 0.002197167911454*G0_1_0_8_0 - 0.00651285222713916*G0_1_0_8_1 + 0.00285936285936333*G0_1_0_8_2 + 0.0424489795918439*G0_1_0_8_3 - 0.0213957471100364*G0_1_0_8_4 + 0.00525189096617759*G0_1_0_8_5 - 0.0024204367061514*G0_1_0_8_6 + 0.00730697873555149*G0_1_0_8_7 + 0.00223776223776237*G0_1_0_8_8 - 0.0072613101184542*G0_1_0_8_9 + 0.0311155511155564*G0_1_0_9_0 + 0.0166842681128424*G0_1_0_9_1 - 0.0221645021645059*G0_1_0_9_2 - 0.00794633937491197*G0_1_0_9_3 + 0.131388611388634*G0_1_0_9_4 - 0.103850435279024*G0_1_0_9_5 + 0.110289710289729*G0_1_0_9_6 - 0.0869987155701588*G0_1_0_9_7 - 0.0072613101184542*G0_1_0_9_8 - 0.0723390894819586*G0_1_0_9_9 - 0.00875258780020815*G0_1_1_0_0 + 0.00562203228869994*G0_1_1_0_1 + 0.000669806384092231*G0_1_1_0_2 + 0.00805036233607803*G0_1_1_0_3 - 0.00675388103959652*G0_1_1_0_4 - 0.00344798059083826*G0_1_1_0_5 + 0.00339470053755823*G0_1_1_0_6 - 0.0278959136102039*G0_1_1_0_7 + 0.0163341420484306*G0_1_1_0_8 + 0.00149184149184175*G0_1_1_0_9 + 0.00562203228869994*G0_1_1_1_0 + 0.0339334739334797*G0_1_1_1_1 + 0.00103712865617646*G0_1_1_1_2 + 0.0293750693750744*G0_1_1_1_3 - 0.00245595674167147*G0_1_1_1_4 - 0.00207284778713387*G0_1_1_1_5 + 0.00377273520130727*G0_1_1_1_6 - 0.0347081489938692*G0_1_1_1_7 + 0.0576490176490275*G0_1_1_1_8 + 0.0125132010846318*G0_1_1_1_9 + 0.000669806384092231*G0_1_1_2_0 + 0.00103712865617646*G0_1_1_2_1 - 0.0160234826901518*G0_1_1_2_2 + 0.019678099678103*G0_1_1_2_3 - 0.000142080142080216*G0_1_1_2_5 - 0.00222000222000248*G0_1_1_2_6 - 0.00218701932987684*G0_1_1_2_7 + 0.014352631495491*G0_1_1_2_8 + 0.00852480852480996*G0_1_1_2_9 + 0.00805036233607803*G0_1_1_3_0 + 0.0293750693750744*G0_1_1_3_1 + 0.019678099678103*G0_1_1_3_2 + 0.209801626944521*G0_1_1_3_3 - 0.10880548023407*G0_1_1_3_4 - 0.00333380904809533*G0_1_1_3_5 - 0.0225831311545635*G0_1_1_3_6 - 0.0354160125588758*G0_1_1_3_7 + 0.0897388325959906*G0_1_1_3_8 + 0.0332924218638562*G0_1_1_3_9 - 0.00675388103959652*G0_1_1_4_0 - 0.00245595674167147*G0_1_1_4_1 - 0.10880548023407*G0_1_1_4_3 - 0.0879120879121032*G0_1_1_4_4 + 0.00899671756814773*G0_1_1_4_5 + 0.0135864135864157*G0_1_1_4_6 + 0.0190438133295309*G0_1_1_4_7 - 0.0543228200371149*G0_1_1_4_8 - 0.0435678607107254*G0_1_1_4_9 - 0.00344798059083826*G0_1_1_5_0 - 0.00207284778713387*G0_1_1_5_1 - 0.000142080142080216*G0_1_1_5_2 - 0.00333380904809533*G0_1_1_5_3 + 0.00899671756814773*G0_1_1_5_4 + 0.0213729128014877*G0_1_1_5_5 - 0.0150706436420747*G0_1_1_5_6 + 0.0097502497502514*G0_1_1_5_7 - 0.00504638218924026*G0_1_1_5_8 + 0.00561723990295515*G0_1_1_5_9 + 0.00339470053755823*G0_1_1_6_0 + 0.00377273520130727*G0_1_1_6_1 - 0.00222000222000248*G0_1_1_6_2 - 0.0225831311545635*G0_1_1_6_3 + 0.0135864135864157*G0_1_1_6_4 - 0.0150706436420747*G0_1_1_6_5 + 0.0479520479520557*G0_1_1_6_6 - 0.00470386756101119*G0_1_1_6_7 - 0.0215555872698765*G0_1_1_6_8 + 0.0195918367346971*G0_1_1_6_9 - 0.0278959136102039*G0_1_1_7_0 - 0.0347081489938692*G0_1_1_7_1 - 0.00218701932987684*G0_1_1_7_2 - 0.0354160125588758*G0_1_1_7_3 + 0.0190438133295309*G0_1_1_7_4 + 0.0097502497502514*G0_1_1_7_5 - 0.00470386756101119*G0_1_1_7_6 + 0.114217211360088*G0_1_1_7_7 - 0.0190209790209825*G0_1_1_7_8 + 0.00493221064649713*G0_1_1_7_9 + 0.0163341420484306*G0_1_1_8_0 + 0.0576490176490275*G0_1_1_8_1 + 0.014352631495491*G0_1_1_8_2 + 0.0897388325959906*G0_1_1_8_3 - 0.0543228200371149*G0_1_1_8_4 - 0.00504638218924026*G0_1_1_8_5 - 0.0215555872698765*G0_1_1_8_6 - 0.0190209790209825*G0_1_1_8_7 + 0.556335093478045*G0_1_1_8_8 + 0.0711060368203347*G0_1_1_8_9 + 0.00149184149184175*G0_1_1_9_0 + 0.0125132010846318*G0_1_1_9_1 + 0.00852480852480996*G0_1_1_9_2 + 0.0332924218638563*G0_1_1_9_3 - 0.0435678607107254*G0_1_1_9_4 + 0.00561723990295516*G0_1_1_9_5 + 0.0195918367346971*G0_1_1_9_6 + 0.00493221064649713*G0_1_1_9_7 + 0.0711060368203347*G0_1_1_9_8 - 0.0082203510774956*G0_1_1_9_9; + A[193] = -A[88] - 0.0308573260954266*G0_0_0_0_0 - 0.00186170090932028*G0_0_0_0_1 - 0.00494856113903818*G0_0_0_0_2 - 0.0206041577470185*G0_0_0_0_3 - 0.00301412872841498*G0_0_0_0_4 - 0.0366236937665571*G0_0_0_0_5 + 0.0215124557981737*G0_0_0_0_6 + 0.00182674468388787*G0_0_0_0_7 + 0.0018343561200707*G0_0_0_0_8 - 0.00540411968983503*G0_0_0_0_9 - 0.00186170090932028*G0_0_0_1_0 - 0.0321969388636111*G0_0_0_1_1 - 0.00135709088090066*G0_0_0_1_2 - 0.0444837701980636*G0_0_0_1_3 + 0.0359691102548306*G0_0_0_1_4 - 0.0195842252985143*G0_0_0_1_5 - 0.00812901384330098*G0_0_0_1_6 + 0.00330082615796962*G0_0_0_1_7 - 0.00616526330812158*G0_0_0_1_9 - 0.00494856113903818*G0_0_0_2_0 - 0.00135709088090066*G0_0_0_2_1 - 0.00108928108928172*G0_0_0_2_2 - 0.0281724624581814*G0_0_0_2_3 + 0.0662093462093572*G0_0_0_2_4 - 0.00757084185655735*G0_0_0_2_5 + 0.0100876900876916*G0_0_0_2_6 - 0.00850958565244422*G0_0_0_2_7 - 0.00957518671804548*G0_0_0_2_8 + 0.00462775319918252*G0_0_0_2_9 - 0.0206041577470185*G0_0_0_3_0 - 0.0444837701980636*G0_0_0_3_1 - 0.0281724624581814*G0_0_0_3_2 - 0.717453974596953*G0_0_0_3_3 - 0.0170800627943512*G0_0_0_3_4 + 0.0585471671186053*G0_0_0_3_5 + 0.0278578564292897*G0_0_0_3_6 + 0.0652832881404422*G0_0_0_3_7 - 0.0974796631939655*G0_0_0_3_8 - 0.11207078635652*G0_0_0_3_9 - 0.00301412872841498*G0_0_0_4_0 + 0.0359691102548306*G0_0_0_4_1 + 0.0662093462093572*G0_0_0_4_2 - 0.0170800627943512*G0_0_0_4_3 - 0.100927643784804*G0_0_0_4_4 + 0.0125132010846319*G0_0_0_4_5 - 0.0403710575139216*G0_0_0_4_6 + 0.0155501641215953*G0_0_0_4_7 + 0.0321963750535234*G0_0_0_4_8 - 0.0389096617668112*G0_0_0_4_9 - 0.0366236937665571*G0_0_0_5_0 - 0.0195842252985143*G0_0_0_5_1 - 0.00757084185655735*G0_0_0_5_2 + 0.0585471671186053*G0_0_0_5_3 + 0.0125132010846319*G0_0_0_5_4 - 0.734077351220332*G0_0_0_5_5 + 0.0430198373055587*G0_0_0_5_6 - 0.0912230626516493*G0_0_0_5_7 + 0.0622234907949299*G0_0_0_5_8 - 0.108234622520355*G0_0_0_5_9 + 0.0215124557981737*G0_0_0_6_0 - 0.00812901384330097*G0_0_0_6_1 + 0.0100876900876916*G0_0_0_6_2 + 0.0278578564292897*G0_0_0_6_3 - 0.0403710575139216*G0_0_0_6_4 + 0.0430198373055587*G0_0_0_6_5 - 0.343884686741889*G0_0_0_6_6 + 0.0289995718567195*G0_0_0_6_7 + 0.0248208933923261*G0_0_0_6_8 - 0.0695989724561271*G0_0_0_6_9 + 0.00182674468388787*G0_0_0_7_0 + 0.00330082615796962*G0_0_0_7_1 - 0.00850958565244422*G0_0_0_7_2 + 0.0652832881404422*G0_0_0_7_3 + 0.0155501641215953*G0_0_0_7_4 - 0.0912230626516493*G0_0_0_7_5 + 0.0289995718567195*G0_0_0_7_6 - 0.0547566718995383*G0_0_0_7_7 + 0.0125132010846318*G0_0_0_7_8 - 0.0417867846439345*G0_0_0_7_9 + 0.0018343561200707*G0_0_0_8_0 - 0.00957518671804548*G0_0_0_8_2 - 0.0974796631939655*G0_0_0_8_3 + 0.0321963750535234*G0_0_0_8_4 + 0.0622234907949299*G0_0_0_8_5 + 0.0248208933923261*G0_0_0_8_6 + 0.0125132010846318*G0_0_0_8_7 - 0.0632510346796168*G0_0_0_8_8 - 0.0458969601826823*G0_0_0_8_9 - 0.00540411968983503*G0_0_0_9_0 - 0.00616526330812158*G0_0_0_9_1 + 0.00462775319918252*G0_0_0_9_2 - 0.11207078635652*G0_0_0_9_3 - 0.0389096617668112*G0_0_0_9_4 - 0.108234622520355*G0_0_0_9_5 - 0.0695989724561271*G0_0_0_9_6 - 0.0417867846439345*G0_0_0_9_7 - 0.0458969601826823*G0_0_0_9_8 - 1.30539175110626*G0_0_0_9_9 - 0.0118659471040442*G0_0_1_0_0 - 0.00231782327020461*G0_0_1_0_1 + 0.00138274423988733*G0_0_1_0_2 - 0.0189930704216452*G0_0_1_0_3 + 0.00126857269714429*G0_0_1_0_4 - 0.0157176157176182*G0_0_1_0_5 + 0.00943056943057092*G0_0_1_0_6 - 0.00558171986743496*G0_0_1_0_7 + 0.00357483786055267*G0_0_1_0_8 + 0.00223776223776262*G0_0_1_0_9 - 0.00231782327020461*G0_0_1_1_0 - 0.0237510637510678*G0_0_1_1_1 - 0.000558453891787342*G0_0_1_1_2 - 0.0412742812742884*G0_0_1_1_3 + 0.0365907108764313*G0_0_1_1_4 - 0.00700505843363101*G0_0_1_1_5 + 0.00400868972297609*G0_0_1_1_6 + 0.00327291755863245*G0_0_1_1_7 + 0.00255744255744293*G0_0_1_1_8 + 0.00538889681746912*G0_0_1_1_9 + 0.00138274423988733*G0_0_1_2_0 - 0.000558453891787342*G0_0_1_2_1 + 0.0358910225576948*G0_0_1_2_2 - 0.0286900401186162*G0_0_1_2_3 + 0.0690255775970176*G0_0_1_2_4 - 0.0186530929388102*G0_0_1_2_5 + 0.029435960864537*G0_0_1_2_6 - 0.00659404087975626*G0_0_1_2_7 - 0.0141293627007937*G0_0_1_2_8 - 0.0119042861900025*G0_0_1_2_9 - 0.0189930704216452*G0_0_1_3_0 - 0.0412742812742884*G0_0_1_3_1 - 0.0286900401186162*G0_0_1_3_2 - 0.699711716854693*G0_0_1_3_3 - 0.0366033966034027*G0_0_1_3_4 + 0.0379277864992213*G0_0_1_3_5 - 0.00988725560154289*G0_0_1_3_6 + 0.0591180248323206*G0_0_1_3_7 - 0.103644926502087*G0_0_1_3_8 - 0.134402740117049*G0_0_1_3_9 + 0.0012685726971443*G0_0_1_4_0 + 0.0365907108764313*G0_0_1_4_1 + 0.0690255775970176*G0_0_1_4_2 - 0.0366033966034027*G0_0_1_4_3 - 0.131411445697183*G0_0_1_4_4 - 0.00166690452404755*G0_0_1_4_5 + 0.0115541601255904*G0_0_1_4_6 + 0.00691879549022529*G0_0_1_4_7 + 0.0445269016697664*G0_0_1_4_8 + 0.0390466676181027*G0_0_1_4_9 - 0.0157176157176182*G0_0_1_5_0 - 0.00700505843363101*G0_0_1_5_1 - 0.0186530929388102*G0_0_1_5_2 + 0.0379277864992213*G0_0_1_5_3 - 0.00166690452404755*G0_0_1_5_4 - 0.0832767232767373*G0_0_1_5_5 + 0.0137234194377074*G0_0_1_5_6 - 0.0450749250749325*G0_0_1_5_7 + 0.0231539888682784*G0_0_1_5_8 - 0.0530212644498448*G0_0_1_5_9 + 0.00943056943057092*G0_0_1_6_0 + 0.00400868972297609*G0_0_1_6_1 + 0.029435960864537*G0_0_1_6_2 - 0.00988725560154289*G0_0_1_6_3 + 0.0115541601255904*G0_0_1_6_4 + 0.0137234194377074*G0_0_1_6_5 + 0.0178335949764546*G0_0_1_6_6 + 0.0219209362066541*G0_0_1_6_7 + 0.0141116026830337*G0_0_1_6_8 + 0.0554873697730933*G0_0_1_6_9 - 0.00558171986743496*G0_0_1_7_0 + 0.00327291755863245*G0_0_1_7_1 - 0.00659404087975626*G0_0_1_7_2 + 0.0591180248323206*G0_0_1_7_3 + 0.00691879549022528*G0_0_1_7_4 - 0.0450749250749325*G0_0_1_7_5 + 0.0219209362066541*G0_0_1_7_6 - 0.0731382902811597*G0_0_1_7_7 + 0.0172170686456429*G0_0_1_7_8 - 0.0505551591265963*G0_0_1_7_9 + 0.00357483786055266*G0_0_1_8_0 + 0.00255744255744293*G0_0_1_8_1 - 0.0141293627007937*G0_0_1_8_2 - 0.103644926502087*G0_0_1_8_3 + 0.0445269016697664*G0_0_1_8_4 + 0.0231539888682784*G0_0_1_8_5 + 0.0141116026830337*G0_0_1_8_6 + 0.0172170686456429*G0_0_1_8_7 - 0.177673754816643*G0_0_1_8_8 - 0.10522049379194*G0_0_1_8_9 + 0.00223776223776263*G0_0_1_9_0 + 0.00538889681746912*G0_0_1_9_1 - 0.0119042861900025*G0_0_1_9_2 - 0.134402740117049*G0_0_1_9_3 + 0.0390466676181027*G0_0_1_9_4 - 0.0530212644498448*G0_0_1_9_5 + 0.0554873697730933*G0_0_1_9_6 - 0.0505551591265963*G0_0_1_9_7 - 0.10522049379194*G0_0_1_9_8 - 0.148788354502666*G0_0_1_9_9 - 0.00520283948855467*G0_1_0_0_0 + 0.00147577290434456*G0_1_0_0_1 + 0.00210244781673389*G0_1_0_0_2 - 0.0108691308691328*G0_1_0_0_3 - 0.00022834308548602*G0_1_0_0_4 - 0.00448567305710235*G0_1_0_0_5 + 0.00257012828441444*G0_1_0_0_6 - 0.001555270126699*G0_1_0_0_7 - 0.0023316366173513*G0_1_0_0_8 + 0.00482565053993696*G0_1_0_0_9 + 0.00147577290434456*G0_1_0_1_0 - 0.0318022718022774*G0_1_0_1_1 - 0.000306994592708949*G0_1_0_1_2 - 0.0144921744921771*G0_1_0_1_3 + 0.0357128585700075*G0_1_0_1_4 - 0.00568574282860092*G0_1_0_1_5 + 0.000799200799200929*G0_1_0_1_6 + 0.000619063476206479*G0_1_0_1_7 - 0.00227328227328278*G0_1_0_1_8 + 0.00487131915703421*G0_1_0_1_9 + 0.00210244781673389*G0_1_0_2_0 - 0.000306994592708948*G0_1_0_2_1 + 0.011248011248013*G0_1_0_2_2 - 0.0050083250083258*G0_1_0_2_3 + 0.0563094048808429*G0_1_0_2_4 - 0.00825587111301533*G0_1_0_2_5 + 0.0106813821099553*G0_1_0_2_6 + 0.0034936492079355*G0_1_0_2_7 - 0.00168973883259628*G0_1_0_2_8 + 0.0154664383235838*G0_1_0_2_9 - 0.0108691308691328*G0_1_0_3_0 - 0.0144921744921771*G0_1_0_3_1 - 0.00500832500832581*G0_1_0_3_2 - 0.423690595119238*G0_1_0_3_3 - 0.150774939346393*G0_1_0_3_4 + 0.0311231625517392*G0_1_0_3_5 - 0.0149793064078803*G0_1_0_3_6 + 0.0200256885971207*G0_1_0_3_7 - 0.012513201084632*G0_1_0_3_8 - 0.0546653346653444*G0_1_0_3_9 - 0.000228343085486019*G0_1_0_4_0 + 0.0357128585700075*G0_1_0_4_1 + 0.0563094048808429*G0_1_0_4_2 - 0.150774939346393*G0_1_0_4_3 - 0.0685714285714413*G0_1_0_4_4 - 0.0118966747538196*G0_1_0_4_5 + 0.0268759811616998*G0_1_0_4_6 + 0.00139289282146452*G0_1_0_4_7 - 0.00751248751248866*G0_1_0_4_8 - 0.0226059654631122*G0_1_0_4_9 - 0.00448567305710235*G0_1_0_5_0 - 0.00568574282860092*G0_1_0_5_1 - 0.00825587111301533*G0_1_0_5_2 + 0.0311231625517392*G0_1_0_5_3 - 0.0118966747538196*G0_1_0_5_4 + 0.00121021835307544*G0_1_0_5_5 + 0.0025117739403457*G0_1_0_5_6 + 0.0185871271585587*G0_1_0_5_7 + 0.00447552447552527*G0_1_0_5_8 - 0.0234280005708615*G0_1_0_5_9 + 0.00257012828441444*G0_1_0_6_0 + 0.000799200799200928*G0_1_0_6_1 + 0.0106813821099553*G0_1_0_6_2 - 0.0149793064078803*G0_1_0_6_3 + 0.0268759811616998*G0_1_0_6_4 + 0.0025117739403457*G0_1_0_6_5 + 0.0144997859283595*G0_1_0_6_6 - 0.023062651634084*G0_1_0_6_7 + 0.0076266590552318*G0_1_0_6_8 - 0.0164407021549908*G0_1_0_6_9 - 0.001555270126699*G0_1_0_7_0 + 0.000619063476206478*G0_1_0_7_1 + 0.0034936492079355*G0_1_0_7_2 + 0.0200256885971207*G0_1_0_7_3 + 0.00139289282146452*G0_1_0_7_4 + 0.0185871271585587*G0_1_0_7_5 - 0.023062651634084*G0_1_0_7_6 + 0.152738689881572*G0_1_0_7_7 - 0.00440702154987922*G0_1_0_7_8 + 0.0316483516483569*G0_1_0_7_9 - 0.0023316366173513*G0_1_0_8_0 - 0.00227328227328277*G0_1_0_8_1 - 0.00168973883259628*G0_1_0_8_2 - 0.012513201084632*G0_1_0_8_3 - 0.00751248751248867*G0_1_0_8_4 + 0.00447552447552527*G0_1_0_8_5 + 0.00762665905523179*G0_1_0_8_6 - 0.00440702154987922*G0_1_0_8_7 + 0.0168288854003165*G0_1_0_8_8 + 0.000411017553874716*G0_1_0_8_9 + 0.00482565053993696*G0_1_0_9_0 + 0.00487131915703421*G0_1_0_9_1 + 0.0154664383235838*G0_1_0_9_2 - 0.0546653346653444*G0_1_0_9_3 - 0.0226059654631122*G0_1_0_9_4 - 0.0234280005708615*G0_1_0_9_5 - 0.0164407021549908*G0_1_0_9_6 + 0.0316483516483569*G0_1_0_9_7 + 0.000411017553874708*G0_1_0_9_8 - 1.12865420294011*G0_1_0_9_9 - 0.0164508507365676*G0_1_1_0_0 + 0.00178276749705354*G0_1_1_0_1 - 0.00917939203653652*G0_1_1_0_3 - 0.0037219922934216*G0_1_1_0_4 - 0.0151670551670576*G0_1_1_0_5 + 0.0108259993974297*G0_1_1_0_6 - 0.0578646750075417*G0_1_1_0_7 + 0.00267668839097457*G0_1_1_0_8 - 0.0106407877836467*G0_1_1_0_9 + 0.00178276749705354*G0_1_1_1_0 - 0.00178276749705352*G0_1_1_1_2 - 0.0122188922188943*G0_1_1_1_3 + 0.035093795093801*G0_1_1_1_4 - 0.00648494362780185*G0_1_1_1_5 + 0.00648494362780185*G0_1_1_1_6 - 0.035093795093801*G0_1_1_1_7 + 0.0122188922188943*G0_1_1_1_8 - 0.00178276749705352*G0_1_1_2_1 + 0.0164508507365677*G0_1_1_2_2 - 0.00267668839097447*G0_1_1_2_3 + 0.0578646750075418*G0_1_1_2_4 - 0.0108259993974298*G0_1_1_2_5 + 0.0151670551670577*G0_1_1_2_6 + 0.00372199229342151*G0_1_1_2_7 + 0.00917939203653644*G0_1_1_2_8 + 0.0106407877836467*G0_1_1_2_9 - 0.00917939203653652*G0_1_1_3_0 - 0.0122188922188944*G0_1_1_3_1 - 0.00267668839097447*G0_1_1_3_2 - 0.440519480519555*G0_1_1_3_3 - 0.146367917796514*G0_1_1_3_4 + 0.0234965034965074*G0_1_1_3_5 - 0.0194548308834056*G0_1_1_3_6 + 0.0275381761096093*G0_1_1_3_7 - 0.0550763522192189*G0_1_1_3_9 - 0.0037219922934216*G0_1_1_4_0 + 0.035093795093801*G0_1_1_4_1 + 0.0578646750075418*G0_1_1_4_2 - 0.146367917796514*G0_1_1_4_3 - 0.221310118453014*G0_1_1_4_4 + 0.0111659768802646*G0_1_1_4_5 + 0.00828885400314086*G0_1_1_4_6 - 0.0275381761096094*G0_1_1_4_8 - 0.0542543171114695*G0_1_1_4_9 - 0.0151670551670576*G0_1_1_5_0 - 0.00648494362780185*G0_1_1_5_1 - 0.0108259993974298*G0_1_1_5_2 + 0.0234965034965074*G0_1_1_5_3 + 0.0111659768802646*G0_1_1_5_4 - 0.013289567575284*G0_1_1_5_5 - 0.00828885400314095*G0_1_1_5_7 + 0.0194548308834055*G0_1_1_5_8 - 0.00698729841587098*G0_1_1_5_9 + 0.0108259993974297*G0_1_1_6_0 + 0.00648494362780185*G0_1_1_6_1 + 0.0151670551670577*G0_1_1_6_2 - 0.0194548308834056*G0_1_1_6_3 + 0.00828885400314086*G0_1_1_6_4 + 0.013289567575284*G0_1_1_6_6 - 0.0111659768802645*G0_1_1_6_7 - 0.0234965034965073*G0_1_1_6_8 + 0.00698729841587093*G0_1_1_6_9 - 0.0578646750075417*G0_1_1_7_0 - 0.035093795093801*G0_1_1_7_1 + 0.00372199229342151*G0_1_1_7_2 + 0.0275381761096093*G0_1_1_7_3 - 0.00828885400314095*G0_1_1_7_5 - 0.0111659768802645*G0_1_1_7_6 + 0.221310118453014*G0_1_1_7_7 + 0.146367917796514*G0_1_1_7_8 + 0.0542543171114692*G0_1_1_7_9 + 0.00267668839097457*G0_1_1_8_0 + 0.0122188922188943*G0_1_1_8_1 + 0.00917939203653644*G0_1_1_8_2 - 0.0275381761096093*G0_1_1_8_4 + 0.0194548308834055*G0_1_1_8_5 - 0.0234965034965073*G0_1_1_8_6 + 0.146367917796514*G0_1_1_8_7 + 0.440519480519556*G0_1_1_8_8 + 0.0550763522192189*G0_1_1_8_9 - 0.0106407877836467*G0_1_1_9_0 + 0.0106407877836467*G0_1_1_9_2 - 0.0550763522192189*G0_1_1_9_3 - 0.0542543171114695*G0_1_1_9_4 - 0.00698729841587099*G0_1_1_9_5 + 0.00698729841587093*G0_1_1_9_6 + 0.0542543171114692*G0_1_1_9_7 + 0.055076352219219*G0_1_1_9_8; + A[222] = A[193] + 0.0125977725977747*G0_0_0_0_0 - 0.00041947470518905*G0_0_0_0_1 - 0.000737463594606594*G0_0_0_0_2 + 0.0190590362018967*G0_0_0_0_3 - 0.00724608724608859*G0_0_0_0_4 - 0.0107169021454753*G0_0_0_0_5 - 0.0350126064411838*G0_0_0_0_6 - 0.016136244707676*G0_0_0_0_7 + 0.0057846914989782*G0_0_0_0_8 - 0.00657628086199614*G0_0_0_0_9 - 0.000419474705189051*G0_0_0_1_0 + 0.0326243069100268*G0_0_0_1_1 - 0.0022394536680255*G0_0_0_1_2 + 0.0639969554255379*G0_0_0_1_3 - 0.0328205128205185*G0_0_0_1_4 + 0.0254526425955041*G0_0_0_1_5 + 0.00700252128823678*G0_0_0_1_6 - 0.00615004043575582*G0_0_0_1_7 + 0.0015222872365733*G0_0_0_1_8 + 0.00584558298844123*G0_0_0_1_9 - 0.000737463594606594*G0_0_0_2_0 - 0.0022394536680255*G0_0_0_2_1 - 0.0280371480371529*G0_0_0_2_2 + 0.0487740830598057*G0_0_0_2_3 - 0.0728871128871255*G0_0_0_2_4 + 0.0078550021407178*G0_0_0_2_5 - 0.0780019980020112*G0_0_0_2_6 + 0.00572380000951525*G0_0_0_2_7 + 0.011934731934734*G0_0_0_2_8 - 0.0105951191665495*G0_0_0_2_9 + 0.0190590362018967*G0_0_0_3_0 + 0.0639969554255379*G0_0_0_3_1 + 0.0487740830598057*G0_0_0_3_2 + 0.560079920080015*G0_0_0_3_3 - 0.0465819894391399*G0_0_0_3_4 - 0.0695989724561268*G0_0_0_3_5 - 0.0153446553446579*G0_0_0_3_6 - 0.0515142000856375*G0_0_0_3_7 + 0.081655487369787*G0_0_0_3_8 + 0.0854916512059517*G0_0_0_3_9 - 0.00724608724608859*G0_0_0_4_0 - 0.0328205128205185*G0_0_0_4_1 - 0.0728871128871255*G0_0_0_4_2 - 0.0465819894391399*G0_0_0_4_3 - 0.455955473098409*G0_0_0_4_4 + 0.0274011702583178*G0_0_0_4_5 - 0.01205651491366*G0_0_0_4_6 - 0.000548023405166281*G0_0_0_4_7 - 0.0301412872841496*G0_0_0_4_8 - 0.0230169830169871*G0_0_0_4_9 - 0.0107169021454753*G0_0_0_5_0 + 0.0254526425955041*G0_0_0_5_1 + 0.0078550021407178*G0_0_0_5_2 - 0.0695989724561268*G0_0_0_5_3 + 0.0274011702583178*G0_0_0_5_4 + 0.883413729128164*G0_0_0_5_5 + 0.171531325817069*G0_0_0_5_6 + 0.0822035107749531*G0_0_0_5_7 - 0.0706950192664598*G0_0_0_5_8 + 0.161118881118908*G0_0_0_5_9 - 0.0350126064411838*G0_0_0_6_0 + 0.00700252128823678*G0_0_0_6_1 - 0.0780019980020113*G0_0_0_6_2 - 0.0153446553446579*G0_0_0_6_3 - 0.01205651491366*G0_0_0_6_4 + 0.171531325817069*G0_0_0_6_5 + 0.219209362066543*G0_0_0_6_6 - 0.0115084915084934*G0_0_0_6_7 - 0.0312373340944823*G0_0_0_6_8 + 0.0624746681889647*G0_0_0_6_9 - 0.016136244707676*G0_0_0_7_0 - 0.00615004043575582*G0_0_0_7_1 + 0.00572380000951525*G0_0_0_7_2 - 0.0515142000856375*G0_0_0_7_3 - 0.000548023405166281*G0_0_0_7_4 + 0.0822035107749531*G0_0_0_7_5 - 0.0115084915084934*G0_0_0_7_6 + 0.0416497787926429*G0_0_0_7_7 + 0.00219209362066538*G0_0_0_7_8 + 0.0427458256029756*G0_0_0_7_9 + 0.0057846914989782*G0_0_0_8_0 + 0.0015222872365733*G0_0_0_8_1 + 0.011934731934734*G0_0_0_8_2 + 0.081655487369787*G0_0_0_8_3 - 0.0301412872841496*G0_0_0_8_4 - 0.0706950192664598*G0_0_0_8_5 - 0.0312373340944823*G0_0_0_8_6 + 0.00219209362066538*G0_0_0_8_7 + 0.0416497787926431*G0_0_0_8_8 + 0.0427458256029757*G0_0_0_8_9 - 0.00657628086199614*G0_0_0_9_0 + 0.00584558298844123*G0_0_0_9_1 - 0.0105951191665495*G0_0_0_9_2 + 0.0854916512059517*G0_0_0_9_3 - 0.0230169830169871*G0_0_0_9_4 + 0.161118881118908*G0_0_0_9_5 + 0.0624746681889647*G0_0_0_9_6 + 0.0427458256029756*G0_0_0_9_7 + 0.0427458256029757*G0_0_0_9_8 + 1.30210361067526*G0_0_0_9_9 + 0.00150199007341886*G0_0_1_0_1 - 0.00150199007341894*G0_0_1_0_2 + 0.0138832595975478*G0_0_1_0_3 - 0.0138832595975478*G0_0_1_0_4 + 0.00889015746158732*G0_0_1_0_5 - 0.00079158936301808*G0_0_1_0_6 - 0.00889015746158783*G0_0_1_0_7 + 0.000791589363018241*G0_0_1_0_8 + 0.00150199007341886*G0_0_1_1_0 + 0.0210752210752246*G0_0_1_1_1 + 0.0625964511678905*G0_0_1_1_3 - 0.0382398553827192*G0_0_1_1_4 - 0.0010960468103327*G0_0_1_1_5 - 0.0133352361923813*G0_0_1_1_6 - 0.0106560106560125*G0_0_1_1_7 + 0.00176585319442495*G0_0_1_1_8 - 0.0248437277008747*G0_0_1_1_9 - 0.00150199007341894*G0_0_1_2_0 - 0.0210752210752249*G0_0_1_2_2 + 0.0382398553827192*G0_0_1_2_3 - 0.0625964511678907*G0_0_1_2_4 + 0.0106560106560125*G0_0_1_2_5 - 0.00176585319442511*G0_0_1_2_6 + 0.00109604681033266*G0_0_1_2_7 + 0.0133352361923813*G0_0_1_2_8 + 0.0248437277008747*G0_0_1_2_9 + 0.0138832595975478*G0_0_1_3_0 + 0.0625964511678905*G0_0_1_3_1 + 0.0382398553827192*G0_0_1_3_2 + 0.531034679606198*G0_0_1_3_3 - 0.0191808191808224*G0_0_1_3_5 + 0.0400057085771439*G0_0_1_3_6 - 0.041649778792643*G0_0_1_3_7 + 0.0816554873697869*G0_0_1_3_8 + 0.15783074068791*G0_0_1_3_9 - 0.0138832595975478*G0_0_1_4_0 - 0.0382398553827192*G0_0_1_4_1 - 0.0625964511678907*G0_0_1_4_2 - 0.5310346796062*G0_0_1_4_4 + 0.0416497787926432*G0_0_1_4_5 - 0.0816554873697872*G0_0_1_4_6 + 0.0191808191808225*G0_0_1_4_7 - 0.0400057085771439*G0_0_1_4_8 - 0.15783074068791*G0_0_1_4_9 + 0.00889015746158732*G0_0_1_5_0 - 0.0010960468103327*G0_0_1_5_1 + 0.0106560106560125*G0_0_1_5_2 - 0.0191808191808224*G0_0_1_5_3 + 0.0416497787926432*G0_0_1_5_4 + 0.0142486085343253*G0_0_1_5_5 - 0.0186327957756556*G0_0_1_5_6 + 0.00328814043099818*G0_0_1_5_8 - 0.00657628086199606*G0_0_1_5_9 - 0.000791589363018078*G0_0_1_6_0 - 0.0133352361923813*G0_0_1_6_1 - 0.00176585319442511*G0_0_1_6_2 + 0.0400057085771439*G0_0_1_6_3 - 0.0816554873697872*G0_0_1_6_4 - 0.0186327957756556*G0_0_1_6_5 - 0.164955044955073*G0_0_1_6_6 - 0.00328814043099794*G0_0_1_6_7 - 0.154542600256912*G0_0_1_6_9 - 0.00889015746158784*G0_0_1_7_0 - 0.0106560106560125*G0_0_1_7_1 + 0.00109604681033266*G0_0_1_7_2 - 0.041649778792643*G0_0_1_7_3 + 0.0191808191808225*G0_0_1_7_4 - 0.00328814043099794*G0_0_1_7_6 - 0.0142486085343267*G0_0_1_7_7 + 0.0186327957756563*G0_0_1_7_8 + 0.00657628086199612*G0_0_1_7_9 + 0.000791589363018243*G0_0_1_8_0 + 0.00176585319442495*G0_0_1_8_1 + 0.0133352361923813*G0_0_1_8_2 + 0.0816554873697869*G0_0_1_8_3 - 0.0400057085771439*G0_0_1_8_4 + 0.00328814043099817*G0_0_1_8_5 + 0.0186327957756563*G0_0_1_8_7 + 0.164955044955073*G0_0_1_8_8 + 0.154542600256912*G0_0_1_8_9 - 0.0248437277008747*G0_0_1_9_1 + 0.0248437277008747*G0_0_1_9_2 + 0.15783074068791*G0_0_1_9_3 - 0.15783074068791*G0_0_1_9_4 - 0.00657628086199606*G0_0_1_9_5 - 0.154542600256912*G0_0_1_9_6 + 0.00657628086199613*G0_0_1_9_7 + 0.154542600256912*G0_0_1_9_8 + 0.00031798888941752*G0_1_0_0_1 - 0.00031798888941754*G0_1_0_0_2 + 0.00621093192521882*G0_1_0_0_3 - 0.00621093192521881*G0_1_0_0_4 + 0.00164407021549902*G0_1_0_0_5 + 0.000913372341943935*G0_1_0_0_6 - 0.00164407021549906*G0_1_0_0_7 - 0.000913372341943911*G0_1_0_0_8 + 0.00031798888941752*G0_1_0_1_0 + 0.0195596995597029*G0_1_0_1_1 + 0.0566290852005235*G0_1_0_1_3 - 0.0314200085628712*G0_1_0_1_4 + 0.00657628086199626*G0_1_0_1_5 + 0.00200941915227662*G0_1_0_1_6 - 0.00554112554112648*G0_1_0_1_7 + 0.00304457447314644*G0_1_0_1_8 + 0.0288625660054281*G0_1_0_1_9 - 0.00031798888941754*G0_1_0_2_0 - 0.019559699559703*G0_1_0_2_2 + 0.0314200085628712*G0_1_0_2_3 - 0.0566290852005237*G0_1_0_2_4 + 0.00554112554112654*G0_1_0_2_5 - 0.00304457447314653*G0_1_0_2_6 - 0.00657628086199624*G0_1_0_2_7 - 0.0020094191522766*G0_1_0_2_8 - 0.028862566005428*G0_1_0_2_9 + 0.00621093192521882*G0_1_0_3_0 + 0.0566290852005235*G0_1_0_3_1 + 0.0314200085628712*G0_1_0_3_2 + 0.485000713572225*G0_1_0_3_3 - 0.0191808191808224*G0_1_0_3_5 - 0.00602825745682983*G0_1_0_3_6 - 0.0186327957756563*G0_1_0_3_7 + 0.0126045383188265*G0_1_0_3_8 - 0.0493221064649714*G0_1_0_3_9 - 0.00621093192521881*G0_1_0_4_0 - 0.0314200085628712*G0_1_0_4_1 - 0.0566290852005237*G0_1_0_4_2 - 0.485000713572226*G0_1_0_4_4 + 0.0186327957756562*G0_1_0_4_5 - 0.0126045383188265*G0_1_0_4_6 + 0.0191808191808225*G0_1_0_4_7 + 0.00602825745682981*G0_1_0_4_8 + 0.0493221064649717*G0_1_0_4_9 + 0.00164407021549902*G0_1_0_5_0 + 0.00657628086199626*G0_1_0_5_1 + 0.00554112554112654*G0_1_0_5_2 - 0.0191808191808224*G0_1_0_5_3 + 0.0186327957756562*G0_1_0_5_4 + 0.152350506636247*G0_1_0_5_5 - 0.0301412872841494*G0_1_0_5_6 - 0.0197288425859888*G0_1_0_5_8 + 0.0394576851719776*G0_1_0_5_9 + 0.000913372341943936*G0_1_0_6_0 + 0.00200941915227662*G0_1_0_6_1 - 0.00304457447314653*G0_1_0_6_2 - 0.00602825745682984*G0_1_0_6_3 - 0.0126045383188264*G0_1_0_6_4 - 0.0301412872841494*G0_1_0_6_5 + 0.0191808191808223*G0_1_0_6_6 + 0.0197288425859887*G0_1_0_6_7 + 0.0986442129299438*G0_1_0_6_9 - 0.00164407021549906*G0_1_0_7_0 - 0.00554112554112648*G0_1_0_7_1 - 0.00657628086199624*G0_1_0_7_2 - 0.0186327957756563*G0_1_0_7_3 + 0.0191808191808225*G0_1_0_7_4 + 0.0197288425859887*G0_1_0_7_6 - 0.152350506636246*G0_1_0_7_7 + 0.0301412872841493*G0_1_0_7_8 - 0.0394576851719775*G0_1_0_7_9 - 0.000913372341943912*G0_1_0_8_0 + 0.00304457447314643*G0_1_0_8_1 - 0.00200941915227661*G0_1_0_8_2 + 0.0126045383188265*G0_1_0_8_3 + 0.00602825745682982*G0_1_0_8_4 - 0.0197288425859888*G0_1_0_8_5 + 0.0301412872841493*G0_1_0_8_7 - 0.019180819180822*G0_1_0_8_8 - 0.0986442129299437*G0_1_0_8_9 + 0.0288625660054281*G0_1_0_9_1 - 0.028862566005428*G0_1_0_9_2 - 0.0493221064649714*G0_1_0_9_3 + 0.0493221064649717*G0_1_0_9_4 + 0.0394576851719776*G0_1_0_9_5 + 0.0986442129299438*G0_1_0_9_6 - 0.0394576851719775*G0_1_0_9_7 - 0.0986442129299437*G0_1_0_9_8 - 0.0125977725977751*G0_1_1_0_0 + 0.000737463594606537*G0_1_1_0_1 + 0.000419474705189025*G0_1_1_0_2 + 0.00724608724608861*G0_1_1_0_3 - 0.0190590362018967*G0_1_1_0_4 + 0.0161362447076758*G0_1_1_0_5 - 0.00578469149897814*G0_1_1_0_6 + 0.010716902145475*G0_1_1_0_7 + 0.0350126064411839*G0_1_1_0_8 + 0.00657628086199607*G0_1_1_0_9 + 0.000737463594606537*G0_1_1_1_0 + 0.0280371480371528*G0_1_1_1_1 + 0.00223945366802543*G0_1_1_1_2 + 0.0728871128871253*G0_1_1_1_3 - 0.0487740830598057*G0_1_1_1_4 - 0.00572380000951526*G0_1_1_1_5 - 0.0119347319347339*G0_1_1_1_6 - 0.00785500214071781*G0_1_1_1_7 + 0.0780019980020112*G0_1_1_1_8 + 0.0105951191665495*G0_1_1_1_9 + 0.000419474705189025*G0_1_1_2_0 + 0.00223945366802543*G0_1_1_2_1 - 0.0326243069100269*G0_1_1_2_2 + 0.0328205128205185*G0_1_1_2_3 - 0.0639969554255381*G0_1_1_2_4 + 0.00615004043575578*G0_1_1_2_5 - 0.00152228723657329*G0_1_1_2_6 - 0.025452642595504*G0_1_1_2_7 - 0.00700252128823676*G0_1_1_2_8 - 0.00584558298844117*G0_1_1_2_9 + 0.00724608724608861*G0_1_1_3_0 + 0.0728871128871253*G0_1_1_3_1 + 0.0328205128205185*G0_1_1_3_2 + 0.455955473098409*G0_1_1_3_3 + 0.0465819894391405*G0_1_1_3_4 + 0.000548023405166305*G0_1_1_3_5 + 0.0301412872841495*G0_1_1_3_6 - 0.0274011702583177*G0_1_1_3_7 + 0.0120565149136599*G0_1_1_3_8 + 0.0230169830169871*G0_1_1_3_9 - 0.0190590362018967*G0_1_1_4_0 - 0.0487740830598057*G0_1_1_4_1 - 0.0639969554255381*G0_1_1_4_2 + 0.0465819894391405*G0_1_1_4_3 - 0.560079920080016*G0_1_1_4_4 + 0.0515142000856375*G0_1_1_4_5 - 0.0816554873697871*G0_1_1_4_6 + 0.0695989724561271*G0_1_1_4_7 + 0.015344655344658*G0_1_1_4_8 - 0.0854916512059513*G0_1_1_4_9 + 0.0161362447076758*G0_1_1_5_0 - 0.00572380000951526*G0_1_1_5_1 + 0.00615004043575578*G0_1_1_5_2 + 0.000548023405166308*G0_1_1_5_3 + 0.0515142000856375*G0_1_1_5_4 - 0.041649778792643*G0_1_1_5_5 - 0.00219209362066524*G0_1_1_5_6 - 0.0822035107749534*G0_1_1_5_7 + 0.0115084915084935*G0_1_1_5_8 - 0.0427458256029754*G0_1_1_5_9 - 0.00578469149897814*G0_1_1_6_0 - 0.0119347319347339*G0_1_1_6_1 - 0.00152228723657329*G0_1_1_6_2 + 0.0301412872841495*G0_1_1_6_3 - 0.0816554873697871*G0_1_1_6_4 - 0.00219209362066524*G0_1_1_6_5 - 0.041649778792643*G0_1_1_6_6 + 0.0706950192664598*G0_1_1_6_7 + 0.0312373340944821*G0_1_1_6_8 - 0.0427458256029757*G0_1_1_6_9 + 0.010716902145475*G0_1_1_7_0 - 0.00785500214071782*G0_1_1_7_1 - 0.025452642595504*G0_1_1_7_2 - 0.0274011702583177*G0_1_1_7_3 + 0.0695989724561271*G0_1_1_7_4 - 0.0822035107749534*G0_1_1_7_5 + 0.0706950192664598*G0_1_1_7_6 - 0.883413729128166*G0_1_1_7_7 - 0.171531325817069*G0_1_1_7_8 - 0.161118881118909*G0_1_1_7_9 + 0.0350126064411839*G0_1_1_8_0 + 0.0780019980020111*G0_1_1_8_1 - 0.00700252128823676*G0_1_1_8_2 + 0.0120565149136599*G0_1_1_8_3 + 0.015344655344658*G0_1_1_8_4 + 0.0115084915084935*G0_1_1_8_5 + 0.0312373340944821*G0_1_1_8_6 - 0.171531325817069*G0_1_1_8_7 - 0.219209362066543*G0_1_1_8_8 - 0.0624746681889646*G0_1_1_8_9 + 0.00657628086199607*G0_1_1_9_0 + 0.0105951191665495*G0_1_1_9_1 - 0.00584558298844117*G0_1_1_9_2 + 0.0230169830169872*G0_1_1_9_3 - 0.0854916512059513*G0_1_1_9_4 - 0.0427458256029754*G0_1_1_9_5 - 0.0427458256029757*G0_1_1_9_6 - 0.161118881118909*G0_1_1_9_7 - 0.0624746681889646*G0_1_1_9_8 - 1.30210361067526*G0_1_1_9_9; + A[179] = A[221] - 0.00251008251008309*G0_0_1_0_0 + 0.0025315072934125*G0_0_1_0_1 + 0.00135286230524348*G0_0_1_0_2 + 0.00402137544994755*G0_0_1_0_3 - 0.0017252588681163*G0_0_1_0_4 + 0.000284160284160284*G0_0_1_0_5 - 0.00091844663273246*G0_0_1_0_6 + 0.00845376845376982*G0_0_1_0_7 + 0.00682492111063657*G0_0_1_0_8 + 0.0164711478997221*G0_0_1_0_9 + 0.0025315072934125*G0_0_1_1_0 + 0.0288106954773674*G0_0_1_1_1 + 0.00176444366920588*G0_0_1_1_2 + 0.0134976134976159*G0_0_1_1_3 - 0.0053635253635263*G0_0_1_1_4 - 0.0019764362621509*G0_0_1_1_5 + 0.00174555603127061*G0_0_1_1_6 - 0.0055766455766466*G0_0_1_1_7 + 0.0273504273504322*G0_0_1_1_8 - 0.00788544788544921*G0_0_1_1_9 + 0.00135286230524348*G0_0_1_2_0 + 0.00176444366920588*G0_0_1_2_1 + 0.00169706836373529*G0_0_1_2_2 + 0.00425225568082782*G0_0_1_2_3 - 0.00350126064411837*G0_0_1_2_5 + 0.0017277960135106*G0_0_1_2_6 - 0.00368900940329574*G0_0_1_2_7 + 0.0022174650746083*G0_0_1_2_8 + 0.00514533085961744*G0_0_1_2_9 + 0.00402137544994755*G0_0_1_3_0 + 0.0134976134976159*G0_0_1_3_1 + 0.00425225568082782*G0_0_1_3_2 + 0.0303696303696353*G0_0_1_3_3 - 0.0272413300984775*G0_0_1_3_4 + 0.000365348936777595*G0_0_1_3_5 - 0.012102183530757*G0_0_1_3_6 - 0.0189296417867878*G0_0_1_3_7 + 0.0324475524475579*G0_0_1_3_8 + 0.0615156272299233*G0_0_1_3_9 - 0.0017252588681163*G0_0_1_4_0 - 0.00536352536352631*G0_0_1_4_1 - 0.0272413300984775*G0_0_1_4_3 + 0.0302326245183437*G0_0_1_4_4 - 0.00168973883259627*G0_0_1_4_5 + 0.0137919223633532*G0_0_1_4_6 + 0.0115541601255906*G0_0_1_4_7 - 0.0135179106607701*G0_0_1_4_8 - 0.0120565149136598*G0_0_1_4_9 + 0.000284160284160284*G0_0_1_5_0 - 0.0019764362621509*G0_0_1_5_1 - 0.00350126064411837*G0_0_1_5_2 + 0.000365348936777594*G0_0_1_5_3 - 0.00168973883259627*G0_0_1_5_4 + 0.00790067075781481*G0_0_1_5_5 + 0.00372199229342146*G0_0_1_5_6 - 0.00326530612244957*G0_0_1_5_7 - 0.000936206650492477*G0_0_1_5_8 - 0.0475410303981813*G0_0_1_5_9 - 0.000918446632732459*G0_0_1_6_0 + 0.00174555603127061*G0_0_1_6_1 + 0.0017277960135106*G0_0_1_6_2 - 0.012102183530757*G0_0_1_6_3 + 0.0137919223633532*G0_0_1_6_4 + 0.00372199229342146*G0_0_1_6_5 + 0.0291365777080109*G0_0_1_6_6 + 0.00420151277294205*G0_0_1_6_7 - 0.00251177394034578*G0_0_1_6_8 + 0.00876837448266159*G0_0_1_6_9 + 0.00845376845376982*G0_0_1_7_0 - 0.0055766455766466*G0_0_1_7_1 - 0.00368900940329574*G0_0_1_7_2 - 0.0189296417867878*G0_0_1_7_3 + 0.0115541601255906*G0_0_1_7_4 - 0.00326530612244957*G0_0_1_7_5 + 0.00420151277294205*G0_0_1_7_6 + 0.0491394319965832*G0_0_1_7_7 - 0.0621093192521869*G0_0_1_7_8 - 0.0578164692450504*G0_0_1_7_9 + 0.00682492111063657*G0_0_1_8_0 + 0.0273504273504322*G0_0_1_8_1 + 0.0022174650746083*G0_0_1_8_2 + 0.0324475524475579*G0_0_1_8_3 - 0.0135179106607701*G0_0_1_8_4 - 0.000936206650492477*G0_0_1_8_5 - 0.00251177394034578*G0_0_1_8_6 - 0.0621093192521869*G0_0_1_8_7 - 0.124035964035985*G0_0_1_8_8 + 0.0506921649778877*G0_0_1_8_9 + 0.0164711478997221*G0_0_1_9_0 - 0.00788544788544921*G0_0_1_9_1 + 0.00514533085961744*G0_0_1_9_2 + 0.0615156272299233*G0_0_1_9_3 - 0.0120565149136598*G0_0_1_9_4 - 0.0475410303981813*G0_0_1_9_5 + 0.00876837448266159*G0_0_1_9_6 - 0.0578164692450504*G0_0_1_9_7 + 0.0506921649778877*G0_0_1_9_8 - 0.0394576851719776*G0_0_1_9_9 + 0.00251008251008309*G0_1_0_0_0 - 0.0025315072934125*G0_1_0_0_1 - 0.00135286230524348*G0_1_0_0_2 - 0.00402137544994755*G0_1_0_0_3 + 0.0017252588681163*G0_1_0_0_4 - 0.000284160284160284*G0_1_0_0_5 + 0.000918446632732459*G0_1_0_0_6 - 0.00845376845376982*G0_1_0_0_7 - 0.00682492111063657*G0_1_0_0_8 - 0.0164711478997221*G0_1_0_0_9 - 0.0025315072934125*G0_1_0_1_0 - 0.0288106954773674*G0_1_0_1_1 - 0.00176444366920588*G0_1_0_1_2 - 0.0134976134976159*G0_1_0_1_3 + 0.0053635253635263*G0_1_0_1_4 + 0.0019764362621509*G0_1_0_1_5 - 0.00174555603127061*G0_1_0_1_6 + 0.0055766455766466*G0_1_0_1_7 - 0.0273504273504322*G0_1_0_1_8 + 0.00788544788544921*G0_1_0_1_9 - 0.00135286230524348*G0_1_0_2_0 - 0.00176444366920588*G0_1_0_2_1 - 0.00169706836373529*G0_1_0_2_2 - 0.00425225568082782*G0_1_0_2_3 + 0.00350126064411837*G0_1_0_2_5 - 0.0017277960135106*G0_1_0_2_6 + 0.00368900940329574*G0_1_0_2_7 - 0.0022174650746083*G0_1_0_2_8 - 0.00514533085961744*G0_1_0_2_9 - 0.00402137544994755*G0_1_0_3_0 - 0.0134976134976159*G0_1_0_3_1 - 0.00425225568082782*G0_1_0_3_2 - 0.0303696303696353*G0_1_0_3_3 + 0.0272413300984775*G0_1_0_3_4 - 0.000365348936777597*G0_1_0_3_5 + 0.012102183530757*G0_1_0_3_6 + 0.0189296417867878*G0_1_0_3_7 - 0.0324475524475579*G0_1_0_3_8 - 0.0615156272299233*G0_1_0_3_9 + 0.0017252588681163*G0_1_0_4_0 + 0.00536352536352631*G0_1_0_4_1 + 0.0272413300984775*G0_1_0_4_3 - 0.0302326245183437*G0_1_0_4_4 + 0.00168973883259627*G0_1_0_4_5 - 0.0137919223633532*G0_1_0_4_6 - 0.0115541601255906*G0_1_0_4_7 + 0.0135179106607701*G0_1_0_4_8 + 0.0120565149136598*G0_1_0_4_9 - 0.000284160284160284*G0_1_0_5_0 + 0.0019764362621509*G0_1_0_5_1 + 0.00350126064411837*G0_1_0_5_2 - 0.000365348936777594*G0_1_0_5_3 + 0.00168973883259627*G0_1_0_5_4 - 0.00790067075781481*G0_1_0_5_5 - 0.00372199229342146*G0_1_0_5_6 + 0.00326530612244957*G0_1_0_5_7 + 0.000936206650492477*G0_1_0_5_8 + 0.0475410303981813*G0_1_0_5_9 + 0.000918446632732459*G0_1_0_6_0 - 0.00174555603127061*G0_1_0_6_1 - 0.0017277960135106*G0_1_0_6_2 + 0.012102183530757*G0_1_0_6_3 - 0.0137919223633532*G0_1_0_6_4 - 0.00372199229342146*G0_1_0_6_5 - 0.029136577708011*G0_1_0_6_6 - 0.00420151277294205*G0_1_0_6_7 + 0.00251177394034578*G0_1_0_6_8 - 0.00876837448266159*G0_1_0_6_9 - 0.00845376845376982*G0_1_0_7_0 + 0.0055766455766466*G0_1_0_7_1 + 0.00368900940329574*G0_1_0_7_2 + 0.0189296417867878*G0_1_0_7_3 - 0.0115541601255906*G0_1_0_7_4 + 0.00326530612244957*G0_1_0_7_5 - 0.00420151277294205*G0_1_0_7_6 - 0.0491394319965831*G0_1_0_7_7 + 0.0621093192521869*G0_1_0_7_8 + 0.0578164692450504*G0_1_0_7_9 - 0.00682492111063657*G0_1_0_8_0 - 0.0273504273504322*G0_1_0_8_1 - 0.0022174650746083*G0_1_0_8_2 - 0.0324475524475579*G0_1_0_8_3 + 0.0135179106607701*G0_1_0_8_4 + 0.000936206650492477*G0_1_0_8_5 + 0.00251177394034578*G0_1_0_8_6 + 0.0621093192521869*G0_1_0_8_7 + 0.124035964035985*G0_1_0_8_8 - 0.0506921649778877*G0_1_0_8_9 - 0.0164711478997221*G0_1_0_9_0 + 0.00788544788544921*G0_1_0_9_1 - 0.00514533085961744*G0_1_0_9_2 - 0.0615156272299233*G0_1_0_9_3 + 0.0120565149136598*G0_1_0_9_4 + 0.0475410303981813*G0_1_0_9_5 - 0.00876837448266159*G0_1_0_9_6 + 0.0578164692450504*G0_1_0_9_7 - 0.0506921649778877*G0_1_0_9_8 + 0.0394576851719776*G0_1_0_9_9; + A[219] = A[149] + 0.0288106954773675*G0_0_1_0_0 + 0.00253150729341252*G0_0_1_0_1 + 0.00176444366920589*G0_0_1_0_2 - 0.0019764362621509*G0_0_1_0_3 + 0.00174555603127065*G0_0_1_0_4 + 0.0134976134976159*G0_0_1_0_5 - 0.00536352536352631*G0_0_1_0_6 + 0.0273504273504323*G0_0_1_0_7 - 0.00557664557664667*G0_0_1_0_8 - 0.00788544788544916*G0_0_1_0_9 + 0.00253150729341252*G0_0_1_1_0 - 0.00251008251008303*G0_0_1_1_1 + 0.0013528623052435*G0_0_1_1_2 + 0.000284160284160277*G0_0_1_1_3 - 0.00091844663273247*G0_0_1_1_4 + 0.00402137544994755*G0_0_1_1_5 - 0.00172525886811629*G0_0_1_1_6 + 0.0068249211106366*G0_0_1_1_7 + 0.00845376845376983*G0_0_1_1_8 + 0.0164711478997221*G0_0_1_1_9 + 0.00176444366920589*G0_0_1_2_0 + 0.0013528623052435*G0_0_1_2_1 + 0.00169706836373542*G0_0_1_2_2 - 0.00350126064411843*G0_0_1_2_3 + 0.00172779601351069*G0_0_1_2_4 + 0.0042522556808278*G0_0_1_2_5 + 0.00221746507460834*G0_0_1_2_7 - 0.00368900940329575*G0_0_1_2_8 + 0.00514533085961747*G0_0_1_2_9 - 0.0019764362621509*G0_0_1_3_0 + 0.000284160284160277*G0_0_1_3_1 - 0.00350126064411844*G0_0_1_3_2 + 0.00790067075781532*G0_0_1_3_3 + 0.00372199229342146*G0_0_1_3_4 + 0.000365348936777596*G0_0_1_3_5 - 0.00168973883259631*G0_0_1_3_6 - 0.000936206650492504*G0_0_1_3_7 - 0.0032653061224495*G0_0_1_3_8 - 0.0475410303981812*G0_0_1_3_9 + 0.00174555603127065*G0_0_1_4_0 - 0.00091844663273247*G0_0_1_4_1 + 0.00172779601351069*G0_0_1_4_2 + 0.00372199229342145*G0_0_1_4_3 + 0.0291365777080121*G0_0_1_4_4 - 0.0121021835307571*G0_0_1_4_5 + 0.0137919223633534*G0_0_1_4_6 - 0.00251177394034588*G0_0_1_4_7 + 0.00420151277294205*G0_0_1_4_8 + 0.00876837448266181*G0_0_1_4_9 + 0.0134976134976159*G0_0_1_5_0 + 0.00402137544994755*G0_0_1_5_1 + 0.0042522556808278*G0_0_1_5_2 + 0.000365348936777595*G0_0_1_5_3 - 0.0121021835307571*G0_0_1_5_4 + 0.0303696303696354*G0_0_1_5_5 - 0.0272413300984777*G0_0_1_5_6 + 0.032447552447558*G0_0_1_5_7 - 0.0189296417867879*G0_0_1_5_8 + 0.0615156272299233*G0_0_1_5_9 - 0.00536352536352631*G0_0_1_6_0 - 0.00172525886811629*G0_0_1_6_1 - 0.00168973883259631*G0_0_1_6_3 + 0.0137919223633534*G0_0_1_6_4 - 0.0272413300984777*G0_0_1_6_5 + 0.0302326245183441*G0_0_1_6_6 - 0.0135179106607702*G0_0_1_6_7 + 0.0115541601255907*G0_0_1_6_8 - 0.0120565149136598*G0_0_1_6_9 + 0.0273504273504323*G0_0_1_7_0 + 0.0068249211106366*G0_0_1_7_1 + 0.00221746507460834*G0_0_1_7_2 - 0.000936206650492502*G0_0_1_7_3 - 0.00251177394034588*G0_0_1_7_4 + 0.032447552447558*G0_0_1_7_5 - 0.0135179106607702*G0_0_1_7_6 - 0.124035964035984*G0_0_1_7_7 - 0.062109319252187*G0_0_1_7_8 + 0.0506921649778879*G0_0_1_7_9 - 0.00557664557664667*G0_0_1_8_0 + 0.00845376845376983*G0_0_1_8_1 - 0.00368900940329575*G0_0_1_8_2 - 0.00326530612244951*G0_0_1_8_3 + 0.00420151277294205*G0_0_1_8_4 - 0.0189296417867879*G0_0_1_8_5 + 0.0115541601255907*G0_0_1_8_6 - 0.062109319252187*G0_0_1_8_7 + 0.0491394319965835*G0_0_1_8_8 - 0.0578164692450504*G0_0_1_8_9 - 0.00788544788544916*G0_0_1_9_0 + 0.0164711478997221*G0_0_1_9_1 + 0.00514533085961747*G0_0_1_9_2 - 0.0475410303981812*G0_0_1_9_3 + 0.00876837448266181*G0_0_1_9_4 + 0.0615156272299233*G0_0_1_9_5 - 0.0120565149136598*G0_0_1_9_6 + 0.0506921649778879*G0_0_1_9_7 - 0.0578164692450504*G0_0_1_9_8 - 0.0394576851719776*G0_0_1_9_9 - 0.0288106954773675*G0_1_0_0_0 - 0.00253150729341252*G0_1_0_0_1 - 0.00176444366920589*G0_1_0_0_2 + 0.0019764362621509*G0_1_0_0_3 - 0.00174555603127065*G0_1_0_0_4 - 0.0134976134976159*G0_1_0_0_5 + 0.00536352536352631*G0_1_0_0_6 - 0.0273504273504323*G0_1_0_0_7 + 0.00557664557664667*G0_1_0_0_8 + 0.00788544788544917*G0_1_0_0_9 - 0.00253150729341252*G0_1_0_1_0 + 0.00251008251008303*G0_1_0_1_1 - 0.0013528623052435*G0_1_0_1_2 - 0.000284160284160277*G0_1_0_1_3 + 0.000918446632732469*G0_1_0_1_4 - 0.00402137544994755*G0_1_0_1_5 + 0.00172525886811629*G0_1_0_1_6 - 0.0068249211106366*G0_1_0_1_7 - 0.00845376845376983*G0_1_0_1_8 - 0.0164711478997221*G0_1_0_1_9 - 0.00176444366920589*G0_1_0_2_0 - 0.0013528623052435*G0_1_0_2_1 - 0.00169706836373542*G0_1_0_2_2 + 0.00350126064411843*G0_1_0_2_3 - 0.00172779601351069*G0_1_0_2_4 - 0.0042522556808278*G0_1_0_2_5 - 0.00221746507460834*G0_1_0_2_7 + 0.00368900940329575*G0_1_0_2_8 - 0.00514533085961747*G0_1_0_2_9 + 0.0019764362621509*G0_1_0_3_0 - 0.000284160284160281*G0_1_0_3_1 + 0.00350126064411844*G0_1_0_3_2 - 0.00790067075781531*G0_1_0_3_3 - 0.00372199229342145*G0_1_0_3_4 - 0.000365348936777596*G0_1_0_3_5 + 0.00168973883259631*G0_1_0_3_6 + 0.000936206650492503*G0_1_0_3_7 + 0.00326530612244951*G0_1_0_3_8 + 0.0475410303981812*G0_1_0_3_9 - 0.00174555603127065*G0_1_0_4_0 + 0.000918446632732469*G0_1_0_4_1 - 0.00172779601351069*G0_1_0_4_2 - 0.00372199229342145*G0_1_0_4_3 - 0.0291365777080121*G0_1_0_4_4 + 0.0121021835307571*G0_1_0_4_5 - 0.0137919223633534*G0_1_0_4_6 + 0.00251177394034588*G0_1_0_4_7 - 0.00420151277294205*G0_1_0_4_8 - 0.00876837448266181*G0_1_0_4_9 - 0.0134976134976159*G0_1_0_5_0 - 0.00402137544994755*G0_1_0_5_1 - 0.0042522556808278*G0_1_0_5_2 - 0.000365348936777597*G0_1_0_5_3 + 0.0121021835307571*G0_1_0_5_4 - 0.0303696303696355*G0_1_0_5_5 + 0.0272413300984777*G0_1_0_5_6 - 0.032447552447558*G0_1_0_5_7 + 0.0189296417867879*G0_1_0_5_8 - 0.0615156272299233*G0_1_0_5_9 + 0.00536352536352631*G0_1_0_6_0 + 0.00172525886811629*G0_1_0_6_1 + 0.00168973883259631*G0_1_0_6_3 - 0.0137919223633534*G0_1_0_6_4 + 0.0272413300984777*G0_1_0_6_5 - 0.0302326245183441*G0_1_0_6_6 + 0.0135179106607702*G0_1_0_6_7 - 0.0115541601255907*G0_1_0_6_8 + 0.0120565149136598*G0_1_0_6_9 - 0.0273504273504323*G0_1_0_7_0 - 0.0068249211106366*G0_1_0_7_1 - 0.00221746507460834*G0_1_0_7_2 + 0.000936206650492501*G0_1_0_7_3 + 0.00251177394034587*G0_1_0_7_4 - 0.032447552447558*G0_1_0_7_5 + 0.0135179106607702*G0_1_0_7_6 + 0.124035964035984*G0_1_0_7_7 + 0.062109319252187*G0_1_0_7_8 - 0.0506921649778879*G0_1_0_7_9 + 0.00557664557664667*G0_1_0_8_0 - 0.00845376845376983*G0_1_0_8_1 + 0.00368900940329575*G0_1_0_8_2 + 0.00326530612244951*G0_1_0_8_3 - 0.00420151277294206*G0_1_0_8_4 + 0.0189296417867879*G0_1_0_8_5 - 0.0115541601255907*G0_1_0_8_6 + 0.062109319252187*G0_1_0_8_7 - 0.0491394319965835*G0_1_0_8_8 + 0.0578164692450504*G0_1_0_8_9 + 0.00788544788544917*G0_1_0_9_0 - 0.0164711478997221*G0_1_0_9_1 - 0.00514533085961747*G0_1_0_9_2 + 0.0475410303981812*G0_1_0_9_3 - 0.00876837448266181*G0_1_0_9_4 - 0.0615156272299233*G0_1_0_9_5 + 0.0120565149136598*G0_1_0_9_6 - 0.0506921649778879*G0_1_0_9_7 + 0.0578164692450504*G0_1_0_9_8 + 0.0394576851719776*G0_1_0_9_9; + A[103] = A[219] + 0.0482283148949902*G0_0_0_0_0 + 0.00308178593892933*G0_0_0_0_1 + 0.00548840929793404*G0_0_0_0_2 + 0.00197897340754521*G0_0_0_0_3 - 0.00245849388706574*G0_0_0_0_4 + 0.0666888666888781*G0_0_0_0_5 - 0.0353424353424414*G0_0_0_0_6 + 0.0224664224664264*G0_0_0_0_7 - 0.0116860916860937*G0_0_0_0_8 + 0.0210989010989047*G0_0_0_0_9 + 0.00308178593892933*G0_0_0_1_0 + 0.014916159678067*G0_0_0_1_1 - 0.000486850010659606*G0_0_0_1_2 + 0.0222989708704033*G0_0_0_1_3 - 0.0111532911532931*G0_0_0_1_4 + 0.0102297702297719*G0_0_0_1_5 - 0.00349111206254123*G0_0_0_1_7 + 0.00245341959627718*G0_0_0_1_8 + 0.00012178297892589*G0_0_0_1_9 + 0.00548840929793404*G0_0_0_2_0 - 0.000486850010659606*G0_0_0_2_1 - 0.0109164909164927*G0_0_0_2_2 + 0.0148778205921088*G0_0_0_2_3 - 0.0253257853257895*G0_0_0_2_4 + 0.0143095000237882*G0_0_0_2_5 - 0.0224841824841863*G0_0_0_2_6 - 0.00280861995147757*G0_0_0_2_7 + 0.000814423671566673*G0_0_0_2_8 - 0.0190285904571651*G0_0_0_2_9 + 0.00197897340754521*G0_0_0_3_0 + 0.0222989708704033*G0_0_0_3_1 + 0.0148778205921088*G0_0_0_3_2 + 0.123076923076945*G0_0_0_3_3 - 0.00701013272441979*G0_0_0_3_4 - 0.0177650920508093*G0_0_0_3_5 - 0.0013928928214645*G0_0_0_3_6 - 0.00703296703296833*G0_0_0_3_7 + 0.0105722848580011*G0_0_0_3_8 + 0.0137005851291591*G0_0_0_3_9 - 0.00245849388706574*G0_0_0_4_0 - 0.0111532911532931*G0_0_0_4_1 - 0.0253257853257895*G0_0_0_4_2 - 0.00701013272441979*G0_0_0_4_3 - 0.100927643784803*G0_0_0_4_4 + 0.00627943485086439*G0_0_0_4_5 - 0.00488654202939996*G0_0_0_4_6 + 0.00844869416298131*G0_0_0_4_7 - 0.00353931782503276*G0_0_0_4_8 + 0.0445269016697664*G0_0_0_4_9 + 0.0666888666888781*G0_0_0_5_0 + 0.0102297702297719*G0_0_0_5_1 + 0.0143095000237882*G0_0_0_5_2 - 0.0177650920508093*G0_0_0_5_3 + 0.00627943485086439*G0_0_0_5_4 + 0.442117882117957*G0_0_0_5_5 - 0.0197973455116344*G0_0_0_5_6 + 0.0244555444555486*G0_0_0_5_7 - 0.0317853574996486*G0_0_0_5_8 + 0.000274011702583236*G0_0_0_5_9 - 0.0353424353424414*G0_0_0_6_0 - 0.0224841824841863*G0_0_0_6_2 - 0.0013928928214645*G0_0_0_6_3 - 0.00488654202939996*G0_0_0_6_4 - 0.0197973455116344*G0_0_0_6_5 - 0.0139745968317422*G0_0_0_6_6 + 0.00732981304409999*G0_0_0_6_7 - 0.000822035107749546*G0_0_0_6_8 + 0.0598715570144243*G0_0_0_6_9 + 0.0224664224664264*G0_0_0_7_0 - 0.00349111206254123*G0_0_0_7_1 - 0.00280861995147757*G0_0_0_7_2 - 0.00703296703296833*G0_0_0_7_3 + 0.00844869416298131*G0_0_0_7_4 + 0.0244555444555485*G0_0_0_7_5 + 0.00732981304409999*G0_0_0_7_6 - 0.0562637362637458*G0_0_0_7_7 + 0.0100470957613831*G0_0_0_7_8 - 0.077956329384914*G0_0_0_7_9 - 0.0116860916860937*G0_0_0_8_0 + 0.00245341959627718*G0_0_0_8_1 + 0.000814423671566673*G0_0_0_8_2 + 0.0105722848580011*G0_0_0_8_3 - 0.00353931782503276*G0_0_0_8_4 - 0.0317853574996486*G0_0_0_8_5 - 0.000822035107749546*G0_0_0_8_6 + 0.0100470957613831*G0_0_0_8_7 - 0.0132438989581868*G0_0_0_8_8 + 0.0067132867132879*G0_0_0_8_9 + 0.0210989010989047*G0_0_0_9_0 + 0.00012178297892589*G0_0_0_9_1 - 0.0190285904571651*G0_0_0_9_2 + 0.0137005851291591*G0_0_0_9_3 + 0.0445269016697664*G0_0_0_9_4 + 0.000274011702583237*G0_0_0_9_5 + 0.0598715570144243*G0_0_0_9_6 - 0.077956329384914*G0_0_0_9_7 + 0.0067132867132879*G0_0_0_9_8 + 0.100288283145443*G0_0_0_9_9 + 0.000208891637463093*G0_0_1_0_1 - 0.000208891637463119*G0_0_1_0_2 + 0.00354692926121563*G0_0_1_0_3 - 0.00354692926121561*G0_0_1_0_4 + 0.000976800976801003*G0_0_1_0_5 - 0.00163392163392187*G0_0_1_0_6 - 0.0009768009768014*G0_0_1_0_7 + 0.00163392163392205*G0_0_1_0_8 + 0.000208891637463093*G0_0_1_1_0 + 0.0143500943500969*G0_0_1_1_1 + 0.0236005264576735*G0_0_1_1_3 - 0.0135737278594445*G0_0_1_1_4 + 0.00305979734551213*G0_0_1_1_5 - 0.000829646543932398*G0_0_1_1_6 - 0.00295831152974072*G0_0_1_1_7 + 0.0043182214610795*G0_0_1_1_8 + 0.00353170638884986*G0_0_1_1_9 - 0.000208891637463119*G0_0_1_2_0 - 0.0143500943500967*G0_0_1_2_2 + 0.0135737278594445*G0_0_1_2_3 - 0.0236005264576733*G0_0_1_2_4 + 0.00295831152974057*G0_0_1_2_5 - 0.00431822146107935*G0_0_1_2_6 - 0.00305979734551219*G0_0_1_2_7 + 0.000829646543932441*G0_0_1_2_8 - 0.00353170638884984*G0_0_1_2_9 + 0.00354692926121563*G0_0_1_3_0 + 0.0236005264576735*G0_0_1_3_1 + 0.0135737278594445*G0_0_1_3_2 + 0.118373055515933*G0_0_1_3_3 - 0.00991008991009159*G0_0_1_3_5 + 0.0024889396317972*G0_0_1_3_6 - 0.0106407877836468*G0_0_1_3_7 + 0.0131297274154441*G0_0_1_3_8 + 0.0106864564007441*G0_0_1_3_9 - 0.00354692926121561*G0_0_1_4_0 - 0.0135737278594445*G0_0_1_4_1 - 0.0236005264576733*G0_0_1_4_2 - 0.118373055515933*G0_0_1_4_4 + 0.0106407877836468*G0_0_1_4_5 - 0.013129727415444*G0_0_1_4_6 + 0.00991008991009167*G0_0_1_4_7 - 0.00248893963179732*G0_0_1_4_8 - 0.010686456400744*G0_0_1_4_9 + 0.000976800976801003*G0_0_1_5_0 + 0.00305979734551213*G0_0_1_5_1 + 0.00295831152974057*G0_0_1_5_2 - 0.00991008991009159*G0_0_1_5_3 + 0.0106407877836468*G0_0_1_5_4 + 0.0505094905094989*G0_0_1_5_5 - 0.00230626516340817*G0_0_1_5_6 - 0.00917939203653638*G0_0_1_5_8 + 0.0183587840730728*G0_0_1_5_9 - 0.00163392163392187*G0_0_1_6_0 - 0.000829646543932398*G0_0_1_6_1 - 0.00431822146107935*G0_0_1_6_2 + 0.00248893963179721*G0_0_1_6_3 - 0.013129727415444*G0_0_1_6_4 - 0.00230626516340817*G0_0_1_6_5 + 0.000776366490652037*G0_0_1_6_6 + 0.00917939203653659*G0_0_1_6_7 + 0.00561723990295513*G0_0_1_6_9 - 0.000976800976801398*G0_0_1_7_0 - 0.00295831152974072*G0_0_1_7_1 - 0.00305979734551219*G0_0_1_7_2 - 0.0106407877836468*G0_0_1_7_3 + 0.00991008991009167*G0_0_1_7_4 + 0.00917939203653659*G0_0_1_7_6 - 0.0505094905094999*G0_0_1_7_7 + 0.00230626516340848*G0_0_1_7_8 - 0.0183587840730731*G0_0_1_7_9 + 0.00163392163392205*G0_0_1_8_0 + 0.0043182214610795*G0_0_1_8_1 + 0.000829646543932441*G0_0_1_8_2 + 0.0131297274154441*G0_0_1_8_3 - 0.00248893963179732*G0_0_1_8_4 - 0.00917939203653638*G0_0_1_8_5 + 0.00230626516340848*G0_0_1_8_7 - 0.000776366490651513*G0_0_1_8_8 - 0.0056172399029549*G0_0_1_8_9 + 0.00353170638884986*G0_0_1_9_1 - 0.00353170638884984*G0_0_1_9_2 + 0.0106864564007441*G0_0_1_9_3 - 0.010686456400744*G0_0_1_9_4 + 0.0183587840730728*G0_0_1_9_5 + 0.00561723990295513*G0_0_1_9_6 - 0.0183587840730731*G0_0_1_9_7 - 0.0056172399029549*G0_0_1_9_8 + 0.000975955261669732*G0_1_0_0_1 - 0.000975955261669704*G0_1_0_0_2 - 0.00017506303220592*G0_1_0_0_3 + 0.000175063032205925*G0_1_0_0_4 - 0.0128760128760149*G0_1_0_0_5 - 0.00142080142080171*G0_1_0_0_6 + 0.0128760128760152*G0_1_0_0_7 + 0.00142080142080159*G0_1_0_0_8 + 0.000975955261669732*G0_1_0_1_0 + 0.0101429434762784*G0_1_0_1_1 + 0.022156890728323*G0_1_0_1_3 - 0.0109909138480585*G0_1_0_1_4 + 0.0048637077208514*G0_1_0_1_5 + 0.00113410399124704*G0_1_0_1_6 - 0.000385646099931868*G0_1_0_1_7 + 0.0127593041878777*G0_1_0_1_8 + 0.0148575234289545*G0_1_0_1_9 - 0.000975955261669704*G0_1_0_2_0 - 0.0101429434762784*G0_1_0_2_2 + 0.0109909138480585*G0_1_0_2_3 - 0.022156890728323*G0_1_0_2_4 + 0.000385646099931878*G0_1_0_2_5 - 0.0127593041878777*G0_1_0_2_6 - 0.00486370772085139*G0_1_0_2_7 - 0.00113410399124704*G0_1_0_2_8 - 0.0148575234289545*G0_1_0_2_9 - 0.000175063032205921*G0_1_0_3_0 + 0.022156890728323*G0_1_0_3_1 + 0.0109909138480585*G0_1_0_3_2 + 0.0971371485657366*G0_1_0_3_3 - 0.00703296703296813*G0_1_0_3_5 - 0.00340231197374115*G0_1_0_3_6 + 0.000525189096617787*G0_1_0_3_7 - 0.00392750107035884*G0_1_0_3_8 - 0.0456229484800989*G0_1_0_3_9 + 0.000175063032205925*G0_1_0_4_0 - 0.0109909138480585*G0_1_0_4_1 - 0.0221568907283229*G0_1_0_4_2 - 0.0971371485657361*G0_1_0_4_4 - 0.000525189096617843*G0_1_0_4_5 + 0.00392750107035895*G0_1_0_4_6 + 0.00703296703296819*G0_1_0_4_7 + 0.0034023119737411*G0_1_0_4_8 + 0.0456229484800991*G0_1_0_4_9 - 0.0128760128760149*G0_1_0_5_0 + 0.0048637077208514*G0_1_0_5_1 + 0.000385646099931877*G0_1_0_5_2 - 0.00703296703296814*G0_1_0_5_3 - 0.000525189096617842*G0_1_0_5_4 + 0.20491508491512*G0_1_0_5_5 + 0.0325617239903009*G0_1_0_5_6 - 0.0145911231625542*G0_1_0_5_8 + 0.0291822463251084*G0_1_0_5_9 - 0.00142080142080171*G0_1_0_6_0 + 0.00113410399124704*G0_1_0_6_1 - 0.0127593041878777*G0_1_0_6_2 - 0.00340231197374115*G0_1_0_6_3 + 0.00392750107035895*G0_1_0_6_4 + 0.0325617239903009*G0_1_0_6_5 - 0.0181304409875869*G0_1_0_6_6 + 0.0145911231625541*G0_1_0_6_7 + 0.0513771942343458*G0_1_0_6_9 + 0.0128760128760152*G0_1_0_7_0 - 0.000385646099931869*G0_1_0_7_1 - 0.00486370772085139*G0_1_0_7_2 + 0.000525189096617787*G0_1_0_7_3 + 0.00703296703296819*G0_1_0_7_4 + 0.0145911231625541*G0_1_0_7_6 - 0.20491508491512*G0_1_0_7_7 - 0.0325617239903008*G0_1_0_7_8 - 0.0291822463251085*G0_1_0_7_9 + 0.00142080142080159*G0_1_0_8_0 + 0.0127593041878777*G0_1_0_8_1 - 0.00113410399124704*G0_1_0_8_2 - 0.00392750107035884*G0_1_0_8_3 + 0.0034023119737411*G0_1_0_8_4 - 0.0145911231625542*G0_1_0_8_5 - 0.0325617239903009*G0_1_0_8_7 + 0.0181304409875872*G0_1_0_8_8 - 0.0513771942343457*G0_1_0_8_9 + 0.0148575234289545*G0_1_0_9_1 - 0.0148575234289545*G0_1_0_9_2 - 0.0456229484800989*G0_1_0_9_3 + 0.0456229484800991*G0_1_0_9_4 + 0.0291822463251084*G0_1_0_9_5 + 0.0513771942343458*G0_1_0_9_6 - 0.0291822463251085*G0_1_0_9_7 - 0.0513771942343457*G0_1_0_9_8 - 0.0482283148949893*G0_1_1_0_0 - 0.00548840929793402*G0_1_1_0_1 - 0.0030817859389293*G0_1_1_0_2 + 0.00245849388706577*G0_1_1_0_3 - 0.00197897340754522*G0_1_1_0_4 - 0.0224664224664261*G0_1_1_0_5 + 0.0116860916860936*G0_1_1_0_6 - 0.0666888666888779*G0_1_1_0_7 + 0.0353424353424413*G0_1_1_0_8 - 0.0210989010989047*G0_1_1_0_9 - 0.00548840929793402*G0_1_1_1_0 + 0.0109164909164927*G0_1_1_1_1 + 0.000486850010659611*G0_1_1_1_2 + 0.0253257853257896*G0_1_1_1_3 - 0.0148778205921088*G0_1_1_1_4 + 0.00280861995147757*G0_1_1_1_5 - 0.000814423671566671*G0_1_1_1_6 - 0.0143095000237882*G0_1_1_1_7 + 0.0224841824841863*G0_1_1_1_8 + 0.0190285904571651*G0_1_1_1_9 - 0.0030817859389293*G0_1_1_2_0 + 0.000486850010659611*G0_1_1_2_1 - 0.0149161596780669*G0_1_1_2_2 + 0.011153291153293*G0_1_1_2_3 - 0.0222989708704032*G0_1_1_2_4 + 0.00349111206254122*G0_1_1_2_5 - 0.00245341959627715*G0_1_1_2_6 - 0.0102297702297719*G0_1_1_2_7 - 0.000121782978925843*G0_1_1_2_9 + 0.00245849388706577*G0_1_1_3_0 + 0.0253257853257896*G0_1_1_3_1 + 0.011153291153293*G0_1_1_3_2 + 0.100927643784804*G0_1_1_3_3 + 0.00701013272441962*G0_1_1_3_4 - 0.00844869416298127*G0_1_1_3_5 + 0.00353931782503271*G0_1_1_3_6 - 0.00627943485086438*G0_1_1_3_7 + 0.00488654202940004*G0_1_1_3_8 - 0.0445269016697663*G0_1_1_3_9 - 0.00197897340754522*G0_1_1_4_0 - 0.0148778205921088*G0_1_1_4_1 - 0.0222989708704032*G0_1_1_4_2 + 0.00701013272441963*G0_1_1_4_3 - 0.123076923076944*G0_1_1_4_4 + 0.00703296703296827*G0_1_1_4_5 - 0.010572284858001*G0_1_1_4_6 + 0.0177650920508093*G0_1_1_4_7 + 0.00139289282146445*G0_1_1_4_8 - 0.013700585129159*G0_1_1_4_9 - 0.0224664224664261*G0_1_1_5_0 + 0.00280861995147757*G0_1_1_5_1 + 0.00349111206254122*G0_1_1_5_2 - 0.00844869416298127*G0_1_1_5_3 + 0.00703296703296827*G0_1_1_5_4 + 0.0562637362637459*G0_1_1_5_5 - 0.0100470957613831*G0_1_1_5_6 - 0.0244555444555485*G0_1_1_5_7 - 0.00732981304410004*G0_1_1_5_8 + 0.077956329384914*G0_1_1_5_9 + 0.0116860916860936*G0_1_1_6_0 - 0.00081442367156667*G0_1_1_6_1 - 0.00245341959627715*G0_1_1_6_2 + 0.00353931782503271*G0_1_1_6_3 - 0.010572284858001*G0_1_1_6_4 - 0.0100470957613831*G0_1_1_6_5 + 0.0132438989581868*G0_1_1_6_6 + 0.0317853574996485*G0_1_1_6_7 + 0.000822035107749537*G0_1_1_6_8 - 0.0067132867132879*G0_1_1_6_9 - 0.0666888666888779*G0_1_1_7_0 - 0.0143095000237882*G0_1_1_7_1 - 0.0102297702297719*G0_1_1_7_2 - 0.00627943485086438*G0_1_1_7_3 + 0.0177650920508093*G0_1_1_7_4 - 0.0244555444555485*G0_1_1_7_5 + 0.0317853574996485*G0_1_1_7_6 - 0.442117882117957*G0_1_1_7_7 + 0.0197973455116345*G0_1_1_7_8 - 0.000274011702583336*G0_1_1_7_9 + 0.0353424353424413*G0_1_1_8_0 + 0.0224841824841863*G0_1_1_8_1 + 0.00488654202940004*G0_1_1_8_3 + 0.00139289282146445*G0_1_1_8_4 - 0.00732981304410004*G0_1_1_8_5 + 0.000822035107749538*G0_1_1_8_6 + 0.0197973455116345*G0_1_1_8_7 + 0.0139745968317425*G0_1_1_8_8 - 0.0598715570144241*G0_1_1_8_9 - 0.0210989010989047*G0_1_1_9_0 + 0.0190285904571651*G0_1_1_9_1 - 0.000121782978925842*G0_1_1_9_2 - 0.0445269016697663*G0_1_1_9_3 - 0.013700585129159*G0_1_1_9_4 + 0.077956329384914*G0_1_1_9_5 - 0.0067132867132879*G0_1_1_9_6 - 0.00027401170258334*G0_1_1_9_7 - 0.0598715570144241*G0_1_1_9_8 - 0.100288283145443*G0_1_1_9_9; + A[201] = A[103] - 0.0288106954773669*G0_0_1_0_0 - 0.00176444366920588*G0_0_1_0_1 - 0.00253150729341248*G0_0_1_0_2 - 0.00174555603127065*G0_0_1_0_3 + 0.00197643626215089*G0_0_1_0_4 - 0.0273504273504318*G0_0_1_0_5 + 0.00557664557664647*G0_0_1_0_6 - 0.0134976134976157*G0_0_1_0_7 + 0.0053635253635262*G0_0_1_0_8 + 0.00788544788544922*G0_0_1_0_9 - 0.00176444366920588*G0_0_1_1_0 - 0.00169706836373544*G0_0_1_1_1 - 0.0013528623052435*G0_0_1_1_2 - 0.00172779601351073*G0_0_1_1_3 + 0.00350126064411844*G0_0_1_1_4 - 0.00221746507460828*G0_0_1_1_5 + 0.00368900940329573*G0_0_1_1_6 - 0.00425225568082775*G0_0_1_1_7 - 0.00514533085961745*G0_0_1_1_9 - 0.00253150729341248*G0_0_1_2_0 - 0.0013528623052435*G0_0_1_2_1 + 0.0025100825100829*G0_0_1_2_2 + 0.000918446632732477*G0_0_1_2_3 - 0.000284160284160315*G0_0_1_2_4 - 0.00682492111063649*G0_0_1_2_5 - 0.00845376845376992*G0_0_1_2_6 - 0.00402137544994753*G0_0_1_2_7 + 0.00172525886811627*G0_0_1_2_8 - 0.0164711478997221*G0_0_1_2_9 - 0.00174555603127065*G0_0_1_3_0 - 0.00172779601351073*G0_0_1_3_1 + 0.000918446632732476*G0_0_1_3_2 - 0.0291365777080121*G0_0_1_3_3 - 0.00372199229342139*G0_0_1_3_4 + 0.00251177394034586*G0_0_1_3_5 - 0.00420151277294204*G0_0_1_3_6 + 0.0121021835307571*G0_0_1_3_7 - 0.0137919223633535*G0_0_1_3_8 - 0.00876837448266184*G0_0_1_3_9 + 0.00197643626215089*G0_0_1_4_0 + 0.00350126064411844*G0_0_1_4_1 - 0.000284160284160319*G0_0_1_4_2 - 0.0037219922934214*G0_0_1_4_3 - 0.00790067075781509*G0_0_1_4_4 + 0.000936206650492488*G0_0_1_4_5 + 0.00326530612244954*G0_0_1_4_6 - 0.000365348936777601*G0_0_1_4_7 + 0.00168973883259636*G0_0_1_4_8 + 0.0475410303981813*G0_0_1_4_9 - 0.0273504273504318*G0_0_1_5_0 - 0.00221746507460828*G0_0_1_5_1 - 0.00682492111063649*G0_0_1_5_2 + 0.00251177394034585*G0_0_1_5_3 + 0.00093620665049249*G0_0_1_5_4 + 0.124035964035985*G0_0_1_5_5 + 0.0621093192521867*G0_0_1_5_6 - 0.0324475524475577*G0_0_1_5_7 + 0.01351791066077*G0_0_1_5_8 - 0.0506921649778877*G0_0_1_5_9 + 0.00557664557664647*G0_0_1_6_0 + 0.00368900940329573*G0_0_1_6_1 - 0.00845376845376992*G0_0_1_6_2 - 0.00420151277294204*G0_0_1_6_3 + 0.00326530612244953*G0_0_1_6_4 + 0.0621093192521867*G0_0_1_6_5 - 0.049139431996583*G0_0_1_6_6 + 0.0189296417867877*G0_0_1_6_7 - 0.0115541601255906*G0_0_1_6_8 + 0.0578164692450504*G0_0_1_6_9 - 0.0134976134976157*G0_0_1_7_0 - 0.00425225568082775*G0_0_1_7_1 - 0.00402137544994753*G0_0_1_7_2 + 0.0121021835307571*G0_0_1_7_3 - 0.000365348936777602*G0_0_1_7_4 - 0.0324475524475577*G0_0_1_7_5 + 0.0189296417867877*G0_0_1_7_6 - 0.0303696303696356*G0_0_1_7_7 + 0.0272413300984777*G0_0_1_7_8 - 0.0615156272299232*G0_0_1_7_9 + 0.0053635253635262*G0_0_1_8_0 + 0.00172525886811627*G0_0_1_8_2 - 0.0137919223633535*G0_0_1_8_3 + 0.00168973883259636*G0_0_1_8_4 + 0.01351791066077*G0_0_1_8_5 - 0.0115541601255906*G0_0_1_8_6 + 0.0272413300984777*G0_0_1_8_7 - 0.0302326245183448*G0_0_1_8_8 + 0.0120565149136596*G0_0_1_8_9 + 0.00788544788544923*G0_0_1_9_0 - 0.00514533085961745*G0_0_1_9_1 - 0.0164711478997221*G0_0_1_9_2 - 0.00876837448266184*G0_0_1_9_3 + 0.0475410303981813*G0_0_1_9_4 - 0.0506921649778877*G0_0_1_9_5 + 0.0578164692450504*G0_0_1_9_6 - 0.0615156272299232*G0_0_1_9_7 + 0.0120565149136596*G0_0_1_9_8 + 0.0394576851719777*G0_0_1_9_9 + 0.0288106954773669*G0_1_0_0_0 + 0.00176444366920588*G0_1_0_0_1 + 0.00253150729341248*G0_1_0_0_2 + 0.00174555603127065*G0_1_0_0_3 - 0.00197643626215089*G0_1_0_0_4 + 0.0273504273504318*G0_1_0_0_5 - 0.00557664557664647*G0_1_0_0_6 + 0.0134976134976157*G0_1_0_0_7 - 0.0053635253635262*G0_1_0_0_8 - 0.00788544788544923*G0_1_0_0_9 + 0.00176444366920588*G0_1_0_1_0 + 0.00169706836373544*G0_1_0_1_1 + 0.0013528623052435*G0_1_0_1_2 + 0.00172779601351072*G0_1_0_1_3 - 0.00350126064411844*G0_1_0_1_4 + 0.00221746507460828*G0_1_0_1_5 - 0.00368900940329573*G0_1_0_1_6 + 0.00425225568082775*G0_1_0_1_7 + 0.00514533085961745*G0_1_0_1_9 + 0.00253150729341248*G0_1_0_2_0 + 0.0013528623052435*G0_1_0_2_1 - 0.0025100825100829*G0_1_0_2_2 - 0.000918446632732478*G0_1_0_2_3 + 0.000284160284160322*G0_1_0_2_4 + 0.00682492111063649*G0_1_0_2_5 + 0.00845376845376992*G0_1_0_2_6 + 0.00402137544994753*G0_1_0_2_7 - 0.00172525886811627*G0_1_0_2_8 + 0.0164711478997221*G0_1_0_2_9 + 0.00174555603127065*G0_1_0_3_0 + 0.00172779601351073*G0_1_0_3_1 - 0.000918446632732478*G0_1_0_3_2 + 0.0291365777080121*G0_1_0_3_3 + 0.0037219922934214*G0_1_0_3_4 - 0.00251177394034586*G0_1_0_3_5 + 0.00420151277294205*G0_1_0_3_6 - 0.0121021835307571*G0_1_0_3_7 + 0.0137919223633535*G0_1_0_3_8 + 0.00876837448266184*G0_1_0_3_9 - 0.00197643626215089*G0_1_0_4_0 - 0.00350126064411844*G0_1_0_4_1 + 0.000284160284160319*G0_1_0_4_2 + 0.0037219922934214*G0_1_0_4_3 + 0.0079006707578151*G0_1_0_4_4 - 0.00093620665049249*G0_1_0_4_5 - 0.00326530612244954*G0_1_0_4_6 + 0.0003653489367776*G0_1_0_4_7 - 0.00168973883259636*G0_1_0_4_8 - 0.0475410303981813*G0_1_0_4_9 + 0.0273504273504318*G0_1_0_5_0 + 0.00221746507460828*G0_1_0_5_1 + 0.00682492111063649*G0_1_0_5_2 - 0.00251177394034585*G0_1_0_5_3 - 0.000936206650492489*G0_1_0_5_4 - 0.124035964035985*G0_1_0_5_5 - 0.0621093192521867*G0_1_0_5_6 + 0.0324475524475577*G0_1_0_5_7 - 0.01351791066077*G0_1_0_5_8 + 0.0506921649778877*G0_1_0_5_9 - 0.00557664557664647*G0_1_0_6_0 - 0.00368900940329573*G0_1_0_6_1 + 0.00845376845376992*G0_1_0_6_2 + 0.00420151277294204*G0_1_0_6_3 - 0.00326530612244953*G0_1_0_6_4 - 0.0621093192521867*G0_1_0_6_5 + 0.049139431996583*G0_1_0_6_6 - 0.0189296417867877*G0_1_0_6_7 + 0.0115541601255906*G0_1_0_6_8 - 0.0578164692450505*G0_1_0_6_9 + 0.0134976134976157*G0_1_0_7_0 + 0.00425225568082775*G0_1_0_7_1 + 0.00402137544994753*G0_1_0_7_2 - 0.0121021835307571*G0_1_0_7_3 + 0.000365348936777601*G0_1_0_7_4 + 0.0324475524475577*G0_1_0_7_5 - 0.0189296417867877*G0_1_0_7_6 + 0.0303696303696356*G0_1_0_7_7 - 0.0272413300984777*G0_1_0_7_8 + 0.0615156272299232*G0_1_0_7_9 - 0.0053635253635262*G0_1_0_8_0 - 0.00172525886811627*G0_1_0_8_2 + 0.0137919223633535*G0_1_0_8_3 - 0.00168973883259636*G0_1_0_8_4 - 0.01351791066077*G0_1_0_8_5 + 0.0115541601255906*G0_1_0_8_6 - 0.0272413300984777*G0_1_0_8_7 + 0.0302326245183448*G0_1_0_8_8 - 0.0120565149136596*G0_1_0_8_9 - 0.00788544788544923*G0_1_0_9_0 + 0.00514533085961745*G0_1_0_9_1 + 0.0164711478997221*G0_1_0_9_2 + 0.00876837448266184*G0_1_0_9_3 - 0.0475410303981813*G0_1_0_9_4 + 0.0506921649778877*G0_1_0_9_5 - 0.0578164692450505*G0_1_0_9_6 + 0.0615156272299232*G0_1_0_9_7 - 0.0120565149136596*G0_1_0_9_8 - 0.0394576851719777*G0_1_0_9_9; + A[207] = A[193] + 0.00568320568320643*G0_0_1_0_0 + 0.0036399579256728*G0_0_1_0_1 + 0.00245595674167142*G0_0_1_0_2 + 0.00365348936777569*G0_0_1_0_3 - 0.00401883830455327*G0_0_1_0_4 + 0.0106560106560123*G0_0_1_0_5 - 0.00633271490414449*G0_0_1_0_6 + 0.00340992340992384*G0_0_1_0_7 - 0.00462775319918248*G0_0_1_0_8 - 0.0120565149136599*G0_0_1_0_9 + 0.0036399579256728*G0_0_1_1_0 + 0.00568320568320661*G0_0_1_1_1 + 0.00245595674167143*G0_0_1_1_2 + 0.0106560106560124*G0_0_1_1_3 - 0.00633271490414452*G0_0_1_1_4 + 0.00365348936777568*G0_0_1_1_5 - 0.00401883830455326*G0_0_1_1_6 - 0.00462775319918256*G0_0_1_1_7 + 0.00340992340992393*G0_0_1_1_8 - 0.0120565149136598*G0_0_1_1_9 + 0.00245595674167142*G0_0_1_2_0 + 0.00245595674167143*G0_0_1_2_1 + 0.00416768416768482*G0_0_1_2_2 + 0.000487131915703421*G0_0_1_2_3 + 0.00468864468864546*G0_0_1_2_4 + 0.000487131915703412*G0_0_1_2_5 + 0.00468864468864546*G0_0_1_2_6 + 0.0113258170401046*G0_0_1_2_7 + 0.0113258170401047*G0_0_1_2_8 + 0.0416497787926429*G0_0_1_2_9 + 0.00365348936777569*G0_0_1_3_0 + 0.0106560106560124*G0_0_1_3_1 + 0.000487131915703419*G0_0_1_3_2 + 0.0832995575852854*G0_0_1_3_3 - 0.0137005851291587*G0_0_1_3_4 - 0.00657628086199621*G0_0_1_3_5 + 0.00328814043099816*G0_0_1_3_6 - 0.0197288425859887*G0_0_1_3_7 + 0.0624746681889642*G0_0_1_3_8 + 0.0756272299129567*G0_0_1_3_9 - 0.00401883830455327*G0_0_1_4_0 - 0.00633271490414453*G0_0_1_4_1 + 0.00468864468864547*G0_0_1_4_2 - 0.0137005851291587*G0_0_1_4_3 + 0.037265591551312*G0_0_1_4_4 + 0.00328814043099816*G0_0_1_4_5 - 0.00657628086199632*G0_0_1_4_6 - 0.00657628086199628*G0_0_1_4_7 - 0.0427458256029756*G0_0_1_4_8 - 0.131525617239925*G0_0_1_4_9 + 0.0106560106560123*G0_0_1_5_0 + 0.00365348936777568*G0_0_1_5_1 + 0.000487131915703412*G0_0_1_5_2 - 0.00657628086199621*G0_0_1_5_3 + 0.00328814043099816*G0_0_1_5_4 + 0.0832995575852857*G0_0_1_5_5 - 0.0137005851291587*G0_0_1_5_6 + 0.0624746681889641*G0_0_1_5_7 - 0.0197288425859887*G0_0_1_5_8 + 0.0756272299129572*G0_0_1_5_9 - 0.00633271490414449*G0_0_1_6_0 - 0.00401883830455326*G0_0_1_6_1 + 0.00468864468864546*G0_0_1_6_2 + 0.00328814043099817*G0_0_1_6_3 - 0.00657628086199632*G0_0_1_6_4 - 0.0137005851291587*G0_0_1_6_5 + 0.0372655915513119*G0_0_1_6_6 - 0.0427458256029755*G0_0_1_6_7 - 0.00657628086199626*G0_0_1_6_8 - 0.131525617239925*G0_0_1_6_9 + 0.00340992340992384*G0_0_1_7_0 - 0.00462775319918257*G0_0_1_7_1 + 0.0113258170401046*G0_0_1_7_2 - 0.0197288425859887*G0_0_1_7_3 - 0.00657628086199628*G0_0_1_7_4 + 0.0624746681889641*G0_0_1_7_5 - 0.0427458256029755*G0_0_1_7_6 + 0.221401455687206*G0_0_1_7_7 - 0.025209076637652*G0_0_1_7_8 + 0.121661195946931*G0_0_1_7_9 - 0.00462775319918247*G0_0_1_8_0 + 0.00340992340992393*G0_0_1_8_1 + 0.0113258170401047*G0_0_1_8_2 + 0.0624746681889642*G0_0_1_8_3 - 0.0427458256029756*G0_0_1_8_4 - 0.0197288425859887*G0_0_1_8_5 - 0.00657628086199626*G0_0_1_8_6 - 0.025209076637652*G0_0_1_8_7 + 0.221401455687207*G0_0_1_8_8 + 0.121661195946931*G0_0_1_8_9 - 0.0120565149136599*G0_0_1_9_0 - 0.0120565149136598*G0_0_1_9_1 + 0.0416497787926429*G0_0_1_9_2 + 0.0756272299129567*G0_0_1_9_3 - 0.131525617239925*G0_0_1_9_4 + 0.0756272299129571*G0_0_1_9_5 - 0.131525617239925*G0_0_1_9_6 + 0.121661195946931*G0_0_1_9_7 + 0.121661195946931*G0_0_1_9_8 - 0.946984444127461*G0_0_1_9_9 - 0.00568320568320644*G0_1_0_0_0 - 0.0036399579256728*G0_1_0_0_1 - 0.00245595674167142*G0_1_0_0_2 - 0.00365348936777569*G0_1_0_0_3 + 0.00401883830455327*G0_1_0_0_4 - 0.0106560106560123*G0_1_0_0_5 + 0.00633271490414449*G0_1_0_0_6 - 0.00340992340992384*G0_1_0_0_7 + 0.00462775319918248*G0_1_0_0_8 + 0.0120565149136599*G0_1_0_0_9 - 0.0036399579256728*G0_1_0_1_0 - 0.0056832056832066*G0_1_0_1_1 - 0.00245595674167143*G0_1_0_1_2 - 0.0106560106560124*G0_1_0_1_3 + 0.00633271490414452*G0_1_0_1_4 - 0.00365348936777568*G0_1_0_1_5 + 0.00401883830455326*G0_1_0_1_6 + 0.00462775319918256*G0_1_0_1_7 - 0.00340992340992393*G0_1_0_1_8 + 0.0120565149136598*G0_1_0_1_9 - 0.00245595674167142*G0_1_0_2_0 - 0.00245595674167143*G0_1_0_2_1 - 0.00416768416768482*G0_1_0_2_2 - 0.000487131915703419*G0_1_0_2_3 - 0.00468864468864546*G0_1_0_2_4 - 0.000487131915703411*G0_1_0_2_5 - 0.00468864468864546*G0_1_0_2_6 - 0.0113258170401046*G0_1_0_2_7 - 0.0113258170401047*G0_1_0_2_8 - 0.0416497787926429*G0_1_0_2_9 - 0.0036534893677757*G0_1_0_3_0 - 0.0106560106560124*G0_1_0_3_1 - 0.000487131915703414*G0_1_0_3_2 - 0.0832995575852854*G0_1_0_3_3 + 0.0137005851291587*G0_1_0_3_4 + 0.00657628086199622*G0_1_0_3_5 - 0.00328814043099816*G0_1_0_3_6 + 0.0197288425859887*G0_1_0_3_7 - 0.0624746681889642*G0_1_0_3_8 - 0.0756272299129567*G0_1_0_3_9 + 0.00401883830455327*G0_1_0_4_0 + 0.00633271490414453*G0_1_0_4_1 - 0.00468864468864547*G0_1_0_4_2 + 0.0137005851291587*G0_1_0_4_3 - 0.037265591551312*G0_1_0_4_4 - 0.00328814043099816*G0_1_0_4_5 + 0.00657628086199631*G0_1_0_4_6 + 0.00657628086199628*G0_1_0_4_7 + 0.0427458256029756*G0_1_0_4_8 + 0.131525617239925*G0_1_0_4_9 - 0.0106560106560123*G0_1_0_5_0 - 0.00365348936777568*G0_1_0_5_1 - 0.000487131915703412*G0_1_0_5_2 + 0.00657628086199622*G0_1_0_5_3 - 0.00328814043099816*G0_1_0_5_4 - 0.0832995575852857*G0_1_0_5_5 + 0.0137005851291587*G0_1_0_5_6 - 0.0624746681889641*G0_1_0_5_7 + 0.0197288425859887*G0_1_0_5_8 - 0.0756272299129572*G0_1_0_5_9 + 0.00633271490414449*G0_1_0_6_0 + 0.00401883830455326*G0_1_0_6_1 - 0.00468864468864546*G0_1_0_6_2 - 0.00328814043099817*G0_1_0_6_3 + 0.00657628086199632*G0_1_0_6_4 + 0.0137005851291587*G0_1_0_6_5 - 0.0372655915513119*G0_1_0_6_6 + 0.0427458256029755*G0_1_0_6_7 + 0.00657628086199626*G0_1_0_6_8 + 0.131525617239925*G0_1_0_6_9 - 0.00340992340992383*G0_1_0_7_0 + 0.00462775319918256*G0_1_0_7_1 - 0.0113258170401046*G0_1_0_7_2 + 0.0197288425859887*G0_1_0_7_3 + 0.00657628086199628*G0_1_0_7_4 - 0.0624746681889641*G0_1_0_7_5 + 0.0427458256029755*G0_1_0_7_6 - 0.221401455687206*G0_1_0_7_7 + 0.025209076637652*G0_1_0_7_8 - 0.121661195946931*G0_1_0_7_9 + 0.00462775319918247*G0_1_0_8_0 - 0.00340992340992394*G0_1_0_8_1 - 0.0113258170401047*G0_1_0_8_2 - 0.0624746681889642*G0_1_0_8_3 + 0.0427458256029756*G0_1_0_8_4 + 0.0197288425859887*G0_1_0_8_5 + 0.00657628086199627*G0_1_0_8_6 + 0.025209076637652*G0_1_0_8_7 - 0.221401455687207*G0_1_0_8_8 - 0.121661195946931*G0_1_0_8_9 + 0.0120565149136599*G0_1_0_9_0 + 0.0120565149136598*G0_1_0_9_1 - 0.0416497787926429*G0_1_0_9_2 - 0.0756272299129567*G0_1_0_9_3 + 0.131525617239925*G0_1_0_9_4 - 0.0756272299129572*G0_1_0_9_5 + 0.131525617239925*G0_1_0_9_6 - 0.121661195946931*G0_1_0_9_7 - 0.121661195946931*G0_1_0_9_8 + 0.946984444127461*G0_1_0_9_9; + A[194] = A[222] + 0.00568320568320672*G0_0_1_0_0 + 0.00245595674167146*G0_0_1_0_1 + 0.00363995792567282*G0_0_1_0_2 - 0.00401883830455327*G0_0_1_0_3 + 0.00365348936777574*G0_0_1_0_4 + 0.00340992340992399*G0_0_1_0_5 - 0.00462775319918247*G0_0_1_0_6 + 0.0106560106560126*G0_0_1_0_7 - 0.00633271490414463*G0_0_1_0_8 - 0.0120565149136598*G0_0_1_0_9 + 0.00245595674167146*G0_0_1_1_0 + 0.00416768416768486*G0_0_1_1_1 + 0.00245595674167145*G0_0_1_1_2 + 0.00468864468864544*G0_0_1_1_3 + 0.000487131915703437*G0_0_1_1_4 + 0.0113258170401046*G0_0_1_1_5 + 0.0113258170401047*G0_0_1_1_6 + 0.000487131915703469*G0_0_1_1_7 + 0.00468864468864542*G0_0_1_1_8 + 0.0416497787926429*G0_0_1_1_9 + 0.00363995792567282*G0_0_1_2_0 + 0.00245595674167145*G0_0_1_2_1 + 0.00568320568320669*G0_0_1_2_2 - 0.00633271490414458*G0_0_1_2_3 + 0.0106560106560125*G0_0_1_2_4 - 0.00462775319918253*G0_0_1_2_5 + 0.00340992340992404*G0_0_1_2_6 + 0.00365348936777573*G0_0_1_2_7 - 0.00401883830455327*G0_0_1_2_8 - 0.0120565149136598*G0_0_1_2_9 - 0.00401883830455327*G0_0_1_3_0 + 0.00468864468864544*G0_0_1_3_1 - 0.00633271490414459*G0_0_1_3_2 + 0.0372655915513126*G0_0_1_3_3 - 0.0137005851291588*G0_0_1_3_4 - 0.0065762808619962*G0_0_1_3_5 - 0.0427458256029756*G0_0_1_3_6 + 0.00328814043099808*G0_0_1_3_7 - 0.00657628086199622*G0_0_1_3_8 - 0.131525617239925*G0_0_1_3_9 + 0.00365348936777574*G0_0_1_4_0 + 0.000487131915703435*G0_0_1_4_1 + 0.0106560106560125*G0_0_1_4_2 - 0.0137005851291588*G0_0_1_4_3 + 0.0832995575852864*G0_0_1_4_4 - 0.0197288425859889*G0_0_1_4_5 + 0.0624746681889644*G0_0_1_4_6 - 0.00657628086199634*G0_0_1_4_7 + 0.00328814043099814*G0_0_1_4_8 + 0.075627229912957*G0_0_1_4_9 + 0.00340992340992399*G0_0_1_5_0 + 0.0113258170401046*G0_0_1_5_1 - 0.00462775319918253*G0_0_1_5_2 - 0.0065762808619962*G0_0_1_5_3 - 0.0197288425859889*G0_0_1_5_4 + 0.221401455687207*G0_0_1_5_5 - 0.0252090766376525*G0_0_1_5_6 + 0.0624746681889645*G0_0_1_5_7 - 0.0427458256029757*G0_0_1_5_8 + 0.121661195946931*G0_0_1_5_9 - 0.00462775319918247*G0_0_1_6_0 + 0.0113258170401047*G0_0_1_6_1 + 0.00340992340992404*G0_0_1_6_2 - 0.0427458256029756*G0_0_1_6_3 + 0.0624746681889644*G0_0_1_6_4 - 0.0252090766376525*G0_0_1_6_5 + 0.221401455687207*G0_0_1_6_6 - 0.0197288425859888*G0_0_1_6_7 - 0.00657628086199621*G0_0_1_6_8 + 0.121661195946931*G0_0_1_6_9 + 0.0106560106560126*G0_0_1_7_0 + 0.000487131915703469*G0_0_1_7_1 + 0.00365348936777573*G0_0_1_7_2 + 0.00328814043099808*G0_0_1_7_3 - 0.00657628086199633*G0_0_1_7_4 + 0.0624746681889645*G0_0_1_7_5 - 0.0197288425859888*G0_0_1_7_6 + 0.0832995575852872*G0_0_1_7_7 - 0.013700585129159*G0_0_1_7_8 + 0.0756272299129572*G0_0_1_7_9 - 0.00633271490414463*G0_0_1_8_0 + 0.00468864468864542*G0_0_1_8_1 - 0.00401883830455327*G0_0_1_8_2 - 0.00657628086199622*G0_0_1_8_3 + 0.00328814043099814*G0_0_1_8_4 - 0.0427458256029757*G0_0_1_8_5 - 0.00657628086199621*G0_0_1_8_6 - 0.013700585129159*G0_0_1_8_7 + 0.0372655915513124*G0_0_1_8_8 - 0.131525617239925*G0_0_1_8_9 - 0.0120565149136598*G0_0_1_9_0 + 0.0416497787926429*G0_0_1_9_1 - 0.0120565149136598*G0_0_1_9_2 - 0.131525617239925*G0_0_1_9_3 + 0.075627229912957*G0_0_1_9_4 + 0.121661195946931*G0_0_1_9_5 + 0.121661195946931*G0_0_1_9_6 + 0.0756272299129572*G0_0_1_9_7 - 0.131525617239925*G0_0_1_9_8 - 0.946984444127461*G0_0_1_9_9 - 0.00568320568320672*G0_1_0_0_0 - 0.00245595674167146*G0_1_0_0_1 - 0.00363995792567282*G0_1_0_0_2 + 0.00401883830455327*G0_1_0_0_3 - 0.00365348936777574*G0_1_0_0_4 - 0.00340992340992399*G0_1_0_0_5 + 0.00462775319918247*G0_1_0_0_6 - 0.0106560106560126*G0_1_0_0_7 + 0.00633271490414463*G0_1_0_0_8 + 0.0120565149136598*G0_1_0_0_9 - 0.00245595674167146*G0_1_0_1_0 - 0.00416768416768486*G0_1_0_1_1 - 0.00245595674167145*G0_1_0_1_2 - 0.00468864468864544*G0_1_0_1_3 - 0.00048713191570344*G0_1_0_1_4 - 0.0113258170401046*G0_1_0_1_5 - 0.0113258170401047*G0_1_0_1_6 - 0.000487131915703469*G0_1_0_1_7 - 0.00468864468864542*G0_1_0_1_8 - 0.0416497787926429*G0_1_0_1_9 - 0.00363995792567282*G0_1_0_2_0 - 0.00245595674167145*G0_1_0_2_1 - 0.00568320568320669*G0_1_0_2_2 + 0.00633271490414459*G0_1_0_2_3 - 0.0106560106560125*G0_1_0_2_4 + 0.00462775319918252*G0_1_0_2_5 - 0.00340992340992404*G0_1_0_2_6 - 0.00365348936777574*G0_1_0_2_7 + 0.00401883830455327*G0_1_0_2_8 + 0.0120565149136598*G0_1_0_2_9 + 0.00401883830455327*G0_1_0_3_0 - 0.00468864468864544*G0_1_0_3_1 + 0.00633271490414459*G0_1_0_3_2 - 0.0372655915513126*G0_1_0_3_3 + 0.0137005851291588*G0_1_0_3_4 + 0.0065762808619962*G0_1_0_3_5 + 0.0427458256029756*G0_1_0_3_6 - 0.00328814043099808*G0_1_0_3_7 + 0.00657628086199622*G0_1_0_3_8 + 0.131525617239925*G0_1_0_3_9 - 0.00365348936777574*G0_1_0_4_0 - 0.000487131915703435*G0_1_0_4_1 - 0.0106560106560125*G0_1_0_4_2 + 0.0137005851291588*G0_1_0_4_3 - 0.0832995575852865*G0_1_0_4_4 + 0.0197288425859889*G0_1_0_4_5 - 0.0624746681889644*G0_1_0_4_6 + 0.00657628086199634*G0_1_0_4_7 - 0.00328814043099814*G0_1_0_4_8 - 0.075627229912957*G0_1_0_4_9 - 0.00340992340992399*G0_1_0_5_0 - 0.0113258170401047*G0_1_0_5_1 + 0.00462775319918253*G0_1_0_5_2 + 0.0065762808619962*G0_1_0_5_3 + 0.0197288425859889*G0_1_0_5_4 - 0.221401455687207*G0_1_0_5_5 + 0.0252090766376525*G0_1_0_5_6 - 0.0624746681889645*G0_1_0_5_7 + 0.0427458256029757*G0_1_0_5_8 - 0.121661195946931*G0_1_0_5_9 + 0.00462775319918247*G0_1_0_6_0 - 0.0113258170401047*G0_1_0_6_1 - 0.00340992340992404*G0_1_0_6_2 + 0.0427458256029756*G0_1_0_6_3 - 0.0624746681889644*G0_1_0_6_4 + 0.0252090766376525*G0_1_0_6_5 - 0.221401455687207*G0_1_0_6_6 + 0.0197288425859888*G0_1_0_6_7 + 0.00657628086199621*G0_1_0_6_8 - 0.12166119594693*G0_1_0_6_9 - 0.0106560106560126*G0_1_0_7_0 - 0.000487131915703469*G0_1_0_7_1 - 0.00365348936777573*G0_1_0_7_2 - 0.00328814043099808*G0_1_0_7_3 + 0.00657628086199633*G0_1_0_7_4 - 0.0624746681889645*G0_1_0_7_5 + 0.0197288425859888*G0_1_0_7_6 - 0.0832995575852872*G0_1_0_7_7 + 0.013700585129159*G0_1_0_7_8 - 0.0756272299129572*G0_1_0_7_9 + 0.00633271490414463*G0_1_0_8_0 - 0.00468864468864542*G0_1_0_8_1 + 0.00401883830455327*G0_1_0_8_2 + 0.00657628086199622*G0_1_0_8_3 - 0.00328814043099814*G0_1_0_8_4 + 0.0427458256029757*G0_1_0_8_5 + 0.00657628086199621*G0_1_0_8_6 + 0.013700585129159*G0_1_0_8_7 - 0.0372655915513124*G0_1_0_8_8 + 0.131525617239925*G0_1_0_8_9 + 0.0120565149136598*G0_1_0_9_0 - 0.0416497787926429*G0_1_0_9_1 + 0.0120565149136598*G0_1_0_9_2 + 0.131525617239925*G0_1_0_9_3 - 0.075627229912957*G0_1_0_9_4 - 0.121661195946931*G0_1_0_9_5 - 0.12166119594693*G0_1_0_9_6 - 0.0756272299129572*G0_1_0_9_7 + 0.131525617239925*G0_1_0_9_8 + 0.946984444127461*G0_1_0_9_9; + A[200] = A[88] + 0.000979901932283049*G0_0_1_0_0 + 0.000153638248876371*G0_0_1_0_1 - 0.00173625316482487*G0_0_1_0_2 + 0.00447045018473667*G0_0_1_0_3 + 0.00252192252192296*G0_0_1_0_4 + 0.000575932004503505*G0_0_1_0_5 - 0.000527726242011996*G0_0_1_0_6 + 0.00061652633081212*G0_0_1_0_7 - 0.00127872127872149*G0_0_1_0_8 + 0.0146444032158343*G0_0_1_0_9 + 0.000153638248876371*G0_0_1_1_0 - 0.0137344137344161*G0_0_1_1_1 - 0.00220449744259304*G0_0_1_1_2 + 0.0161260961260989*G0_0_1_1_3 + 0.00545486259772068*G0_0_1_1_4 - 0.00233417376274559*G0_0_1_1_5 + 0.000809349380778101*G0_0_1_1_6 + 0.00197389911675659*G0_0_1_1_7 - 0.00824064824064965*G0_0_1_1_8 + 0.0115389372532249*G0_0_1_1_9 - 0.00173625316482487*G0_0_1_2_0 - 0.00220449744259304*G0_0_1_2_1 - 0.0288106954773666*G0_0_1_2_2 + 0.023194583194587*G0_0_1_2_3 - 0.0174048174048202*G0_0_1_2_4 + 0.00991008991009147*G0_0_1_2_5 - 0.0234432234432271*G0_0_1_2_6 - 0.00123812695241288*G0_0_1_2_7 + 0.00111380682809274*G0_0_1_2_8 - 0.0142790542790566*G0_0_1_2_9 + 0.00447045018473667*G0_0_1_3_0 + 0.0161260961260989*G0_0_1_3_1 + 0.023194583194587*G0_0_1_3_2 + 0.192721564150169*G0_0_1_3_3 - 0.100470957613832*G0_0_1_3_4 - 0.000228343085485916*G0_0_1_3_5 - 0.0083801912373356*G0_0_1_3_6 - 0.0193634936492112*G0_0_1_3_7 + 0.0286570572284907*G0_0_1_3_8 + 0.00411017553874779*G0_0_1_3_9 + 0.00252192252192296*G0_0_1_4_0 + 0.00545486259772068*G0_0_1_4_1 - 0.0174048174048202*G0_0_1_4_2 - 0.100470957613832*G0_0_1_4_3 + 0.0255744255744298*G0_0_1_4_4 - 0.0135179106607702*G0_0_1_4_5 + 0.0218981018981057*G0_0_1_4_6 + 0.00105037819323552*G0_0_1_4_7 - 0.00929356357927947*G0_0_1_4_8 + 0.0698729841587102*G0_0_1_4_9 + 0.000575932004503505*G0_0_1_5_0 - 0.00233417376274559*G0_0_1_5_1 + 0.00991008991009147*G0_0_1_5_2 - 0.000228343085485918*G0_0_1_5_3 - 0.0135179106607702*G0_0_1_5_4 + 0.00118738404452702*G0_0_1_5_5 + 0.00248893963179698*G0_0_1_5_6 + 0.00118738404452709*G0_0_1_5_7 + 0.00105037819323555*G0_0_1_5_8 - 0.0460339660339739*G0_0_1_5_9 - 0.000527726242011996*G0_0_1_6_0 + 0.000809349380778101*G0_0_1_6_1 - 0.0234432234432271*G0_0_1_6_2 - 0.0083801912373356*G0_0_1_6_3 + 0.0218981018981057*G0_0_1_6_4 + 0.00248893963179698*G0_0_1_6_5 - 0.0405994005994071*G0_0_1_6_6 - 0.00223776223776263*G0_0_1_6_7 + 0.0595975453118411*G0_0_1_6_9 + 0.00061652633081212*G0_0_1_7_0 + 0.00197389911675659*G0_0_1_7_1 - 0.00123812695241288*G0_0_1_7_2 - 0.0193634936492112*G0_0_1_7_3 + 0.00105037819323552*G0_0_1_7_4 + 0.00118738404452709*G0_0_1_7_5 - 0.00223776223776263*G0_0_1_7_6 + 0.00447552447552522*G0_0_1_7_7 + 0.00358498644212991*G0_0_1_7_8 - 0.0394576851719775*G0_0_1_7_9 - 0.00127872127872149*G0_0_1_8_0 - 0.00824064824064965*G0_0_1_8_1 + 0.00111380682809273*G0_0_1_8_2 + 0.0286570572284907*G0_0_1_8_3 - 0.00929356357927947*G0_0_1_8_4 + 0.00105037819323555*G0_0_1_8_5 + 0.00358498644212991*G0_0_1_8_7 - 0.0268988154702481*G0_0_1_8_8 - 0.0160296846011158*G0_0_1_8_9 + 0.0146444032158343*G0_0_1_9_0 + 0.0115389372532249*G0_0_1_9_1 - 0.0142790542790566*G0_0_1_9_2 + 0.00411017553874778*G0_0_1_9_3 + 0.0698729841587102*G0_0_1_9_4 - 0.0460339660339739*G0_0_1_9_5 + 0.0595975453118411*G0_0_1_9_6 - 0.0394576851719775*G0_0_1_9_7 - 0.0160296846011158*G0_0_1_9_8 - 0.0328814043099811*G0_0_1_9_9 - 0.000979901932283049*G0_1_0_0_0 - 0.000153638248876371*G0_1_0_0_1 + 0.00173625316482487*G0_1_0_0_2 - 0.00447045018473667*G0_1_0_0_3 - 0.00252192252192296*G0_1_0_0_4 - 0.000575932004503504*G0_1_0_0_5 + 0.000527726242011996*G0_1_0_0_6 - 0.00061652633081212*G0_1_0_0_7 + 0.00127872127872149*G0_1_0_0_8 - 0.0146444032158343*G0_1_0_0_9 - 0.000153638248876371*G0_1_0_1_0 + 0.0137344137344161*G0_1_0_1_1 + 0.00220449744259304*G0_1_0_1_2 - 0.0161260961260989*G0_1_0_1_3 - 0.00545486259772068*G0_1_0_1_4 + 0.00233417376274559*G0_1_0_1_5 - 0.000809349380778102*G0_1_0_1_6 - 0.00197389911675659*G0_1_0_1_7 + 0.00824064824064965*G0_1_0_1_8 - 0.0115389372532249*G0_1_0_1_9 + 0.00173625316482487*G0_1_0_2_0 + 0.00220449744259304*G0_1_0_2_1 + 0.0288106954773666*G0_1_0_2_2 - 0.023194583194587*G0_1_0_2_3 + 0.0174048174048202*G0_1_0_2_4 - 0.00991008991009147*G0_1_0_2_5 + 0.0234432234432271*G0_1_0_2_6 + 0.00123812695241288*G0_1_0_2_7 - 0.00111380682809274*G0_1_0_2_8 + 0.0142790542790566*G0_1_0_2_9 - 0.00447045018473667*G0_1_0_3_0 - 0.0161260961260989*G0_1_0_3_1 - 0.023194583194587*G0_1_0_3_2 - 0.192721564150169*G0_1_0_3_3 + 0.100470957613832*G0_1_0_3_4 + 0.000228343085485911*G0_1_0_3_5 + 0.0083801912373356*G0_1_0_3_6 + 0.0193634936492112*G0_1_0_3_7 - 0.0286570572284907*G0_1_0_3_8 - 0.00411017553874777*G0_1_0_3_9 - 0.00252192252192296*G0_1_0_4_0 - 0.00545486259772068*G0_1_0_4_1 + 0.0174048174048202*G0_1_0_4_2 + 0.100470957613832*G0_1_0_4_3 - 0.0255744255744298*G0_1_0_4_4 + 0.0135179106607702*G0_1_0_4_5 - 0.0218981018981057*G0_1_0_4_6 - 0.00105037819323552*G0_1_0_4_7 + 0.00929356357927947*G0_1_0_4_8 - 0.0698729841587102*G0_1_0_4_9 - 0.000575932004503505*G0_1_0_5_0 + 0.00233417376274559*G0_1_0_5_1 - 0.00991008991009147*G0_1_0_5_2 + 0.000228343085485914*G0_1_0_5_3 + 0.0135179106607702*G0_1_0_5_4 - 0.00118738404452702*G0_1_0_5_5 - 0.00248893963179698*G0_1_0_5_6 - 0.00118738404452709*G0_1_0_5_7 - 0.00105037819323555*G0_1_0_5_8 + 0.0460339660339739*G0_1_0_5_9 + 0.000527726242011996*G0_1_0_6_0 - 0.000809349380778102*G0_1_0_6_1 + 0.0234432234432271*G0_1_0_6_2 + 0.0083801912373356*G0_1_0_6_3 - 0.0218981018981057*G0_1_0_6_4 - 0.00248893963179698*G0_1_0_6_5 + 0.0405994005994071*G0_1_0_6_6 + 0.00223776223776263*G0_1_0_6_7 - 0.0595975453118411*G0_1_0_6_9 - 0.00061652633081212*G0_1_0_7_0 - 0.00197389911675659*G0_1_0_7_1 + 0.00123812695241288*G0_1_0_7_2 + 0.0193634936492112*G0_1_0_7_3 - 0.00105037819323552*G0_1_0_7_4 - 0.00118738404452709*G0_1_0_7_5 + 0.00223776223776263*G0_1_0_7_6 - 0.00447552447552522*G0_1_0_7_7 - 0.00358498644212991*G0_1_0_7_8 + 0.0394576851719775*G0_1_0_7_9 + 0.00127872127872149*G0_1_0_8_0 + 0.00824064824064965*G0_1_0_8_1 - 0.00111380682809274*G0_1_0_8_2 - 0.0286570572284907*G0_1_0_8_3 + 0.00929356357927946*G0_1_0_8_4 - 0.00105037819323555*G0_1_0_8_5 - 0.00358498644212991*G0_1_0_8_7 + 0.0268988154702481*G0_1_0_8_8 + 0.0160296846011158*G0_1_0_8_9 - 0.0146444032158343*G0_1_0_9_0 - 0.0115389372532249*G0_1_0_9_1 + 0.0142790542790566*G0_1_0_9_2 - 0.00411017553874778*G0_1_0_9_3 - 0.0698729841587102*G0_1_0_9_4 + 0.0460339660339739*G0_1_0_9_5 - 0.0595975453118411*G0_1_0_9_6 + 0.0394576851719775*G0_1_0_9_7 + 0.0160296846011158*G0_1_0_9_8 + 0.0328814043099811*G0_1_0_9_9; + A[223] = A[207] + 0.0326243069100268*G0_0_0_0_0 - 0.000419474705189068*G0_0_0_0_1 - 0.0022394536680255*G0_0_0_0_2 + 0.0254526425955042*G0_0_0_0_3 + 0.0070025212882368*G0_0_0_0_4 + 0.0639969554255377*G0_0_0_0_5 - 0.0328205128205185*G0_0_0_0_6 + 0.00152228723657319*G0_0_0_0_7 - 0.00615004043575574*G0_0_0_0_8 + 0.00584558298844126*G0_0_0_0_9 - 0.000419474705189069*G0_0_0_1_0 + 0.0125977725977748*G0_0_0_1_1 - 0.000737463594606575*G0_0_0_1_2 - 0.0107169021454751*G0_0_0_1_3 - 0.0350126064411838*G0_0_0_1_4 + 0.0190590362018965*G0_0_0_1_5 - 0.00724608724608853*G0_0_0_1_6 + 0.00578469149897815*G0_0_0_1_7 - 0.0161362447076759*G0_0_0_1_8 - 0.0065762808619962*G0_0_0_1_9 - 0.0022394536680255*G0_0_0_2_0 - 0.000737463594606576*G0_0_0_2_1 - 0.0280371480371528*G0_0_0_2_2 + 0.00785500214071773*G0_0_0_2_3 - 0.0780019980020112*G0_0_0_2_4 + 0.0487740830598056*G0_0_0_2_5 - 0.0728871128871253*G0_0_0_2_6 + 0.0119347319347339*G0_0_0_2_7 + 0.00572380000951526*G0_0_0_2_8 - 0.0105951191665495*G0_0_0_2_9 + 0.0254526425955042*G0_0_0_3_0 - 0.0107169021454751*G0_0_0_3_1 + 0.00785500214071772*G0_0_0_3_2 + 0.883413729128164*G0_0_0_3_3 + 0.171531325817069*G0_0_0_3_4 - 0.0695989724561269*G0_0_0_3_5 + 0.0274011702583177*G0_0_0_3_6 - 0.0706950192664599*G0_0_0_3_7 + 0.0822035107749533*G0_0_0_3_8 + 0.161118881118909*G0_0_0_3_9 + 0.0070025212882368*G0_0_0_4_0 - 0.0350126064411838*G0_0_0_4_1 - 0.0780019980020112*G0_0_0_4_2 + 0.171531325817069*G0_0_0_4_3 + 0.219209362066543*G0_0_0_4_4 - 0.015344655344658*G0_0_0_4_5 - 0.0120565149136597*G0_0_0_4_6 - 0.0312373340944822*G0_0_0_4_7 - 0.0115084915084935*G0_0_0_4_8 + 0.0624746681889646*G0_0_0_4_9 + 0.0639969554255377*G0_0_0_5_0 + 0.0190590362018965*G0_0_0_5_1 + 0.0487740830598056*G0_0_0_5_2 - 0.0695989724561269*G0_0_0_5_3 - 0.015344655344658*G0_0_0_5_4 + 0.560079920080014*G0_0_0_5_5 - 0.0465819894391398*G0_0_0_5_6 + 0.0816554873697867*G0_0_0_5_7 - 0.0515142000856373*G0_0_0_5_8 + 0.0854916512059513*G0_0_0_5_9 - 0.0328205128205185*G0_0_0_6_0 - 0.00724608724608853*G0_0_0_6_1 - 0.0728871128871253*G0_0_0_6_2 + 0.0274011702583177*G0_0_0_6_3 - 0.0120565149136597*G0_0_0_6_4 - 0.0465819894391399*G0_0_0_6_5 - 0.455955473098407*G0_0_0_6_6 - 0.0301412872841495*G0_0_0_6_7 - 0.000548023405166447*G0_0_0_6_8 - 0.0230169830169866*G0_0_0_6_9 + 0.00152228723657319*G0_0_0_7_0 + 0.00578469149897815*G0_0_0_7_1 + 0.0119347319347339*G0_0_0_7_2 - 0.0706950192664599*G0_0_0_7_3 - 0.0312373340944822*G0_0_0_7_4 + 0.0816554873697867*G0_0_0_7_5 - 0.0301412872841495*G0_0_0_7_6 + 0.0416497787926428*G0_0_0_7_7 + 0.00219209362066537*G0_0_0_7_8 + 0.0427458256029755*G0_0_0_7_9 - 0.00615004043575574*G0_0_0_8_0 - 0.0161362447076759*G0_0_0_8_1 + 0.00572380000951526*G0_0_0_8_2 + 0.0822035107749533*G0_0_0_8_3 - 0.0115084915084935*G0_0_0_8_4 - 0.0515142000856373*G0_0_0_8_5 - 0.000548023405166447*G0_0_0_8_6 + 0.00219209362066538*G0_0_0_8_7 + 0.041649778792643*G0_0_0_8_8 + 0.0427458256029757*G0_0_0_8_9 + 0.00584558298844126*G0_0_0_9_0 - 0.0065762808619962*G0_0_0_9_1 - 0.0105951191665495*G0_0_0_9_2 + 0.161118881118909*G0_0_0_9_3 + 0.0624746681889646*G0_0_0_9_4 + 0.0854916512059513*G0_0_0_9_5 - 0.0230169830169866*G0_0_0_9_6 + 0.0427458256029755*G0_0_0_9_7 + 0.0427458256029757*G0_0_0_9_8 + 1.30210361067526*G0_0_0_9_9 + 0.0115490858348021*G0_0_1_0_0 - 0.00192146477860795*G0_0_1_0_1 - 0.00223945366802551*G0_0_1_0_2 + 0.0265486894058369*G0_0_1_0_3 + 0.0203377574806182*G0_0_1_0_4 + 0.0014005042576473*G0_0_1_0_5 + 0.00541934256220062*G0_0_1_0_6 - 0.000243565957851657*G0_0_1_0_7 + 0.0045059702202567*G0_0_1_0_8 + 0.030689310689316*G0_0_1_0_9 - 0.00192146477860795*G0_0_1_1_0 + 0.0125977725977748*G0_0_1_1_1 + 0.000764526478812326*G0_0_1_1_2 - 0.0196070596070627*G0_0_1_1_3 - 0.0342210170781658*G0_0_1_1_4 + 0.00517577660434889*G0_0_1_1_5 + 0.00663717235145916*G0_0_1_1_6 + 0.00499310213596012*G0_0_1_1_7 - 0.00724608724608839*G0_0_1_1_8 - 0.0065762808619962*G0_0_1_1_9 - 0.00223945366802551*G0_0_1_2_0 + 0.000764526478812327*G0_0_1_2_1 - 0.00696192696192823*G0_0_1_2_2 - 0.00280100851529472*G0_0_1_2_3 - 0.0762361448075863*G0_0_1_2_4 + 0.0105342276770867*G0_0_1_2_5 - 0.0102906617192351*G0_0_1_2_6 - 0.00140050425764734*G0_0_1_2_7 + 0.00462775319918255*G0_0_1_2_8 - 0.0354388468674243*G0_0_1_2_9 + 0.0265486894058369*G0_0_1_3_0 - 0.0196070596070627*G0_0_1_3_1 - 0.00280100851529472*G0_0_1_3_2 + 0.86916512059384*G0_0_1_3_3 + 0.190164121592725*G0_0_1_3_4 - 0.0504181532753046*G0_0_1_3_5 - 0.014248608534325*G0_0_1_3_6 - 0.0739831596974581*G0_0_1_3_7 + 0.0822035107749533*G0_0_1_3_8 + 0.167695161980905*G0_0_1_3_9 + 0.0203377574806182*G0_0_1_4_0 - 0.0342210170781658*G0_0_1_4_1 - 0.0762361448075863*G0_0_1_4_2 + 0.190164121592725*G0_0_1_4_3 + 0.384164407021616*G0_0_1_4_4 - 0.0553503639218019*G0_0_1_4_5 + 0.069598972456127*G0_0_1_4_6 - 0.0312373340944823*G0_0_1_4_7 - 0.00822035107749532*G0_0_1_4_8 + 0.217017268445877*G0_0_1_4_9 + 0.0014005042576473*G0_0_1_5_0 + 0.00517577660434889*G0_0_1_5_1 + 0.0105342276770867*G0_0_1_5_2 - 0.0504181532753046*G0_0_1_5_3 - 0.0553503639218019*G0_0_1_5_4 + 0.0290452404738166*G0_0_1_5_5 - 0.0465819894391399*G0_0_1_5_6 - 0.00986442129299437*G0_0_1_5_8 - 0.072339089481959*G0_0_1_5_9 + 0.00541934256220062*G0_0_1_6_0 + 0.00663717235145916*G0_0_1_6_1 - 0.0102906617192351*G0_0_1_6_2 - 0.014248608534325*G0_0_1_6_3 + 0.069598972456127*G0_0_1_6_4 - 0.0465819894391399*G0_0_1_6_5 + 0.0750792065077894*G0_0_1_6_6 + 0.00986442129299434*G0_0_1_6_7 - 0.0197288425859887*G0_0_1_6_8 + 0.134813757670923*G0_0_1_6_9 - 0.000243565957851656*G0_0_1_7_0 + 0.00499310213596012*G0_0_1_7_1 - 0.00140050425764733*G0_0_1_7_2 - 0.0739831596974581*G0_0_1_7_3 - 0.0312373340944823*G0_0_1_7_4 + 0.00986442129299434*G0_0_1_7_6 - 0.123305266162429*G0_0_1_7_7 - 0.0164407021549909*G0_0_1_7_8 - 0.111796774653936*G0_0_1_7_9 + 0.0045059702202567*G0_0_1_8_0 - 0.00724608724608839*G0_0_1_8_1 + 0.00462775319918255*G0_0_1_8_2 + 0.0822035107749533*G0_0_1_8_3 - 0.00822035107749532*G0_0_1_8_4 - 0.00986442129299438*G0_0_1_8_5 - 0.0197288425859887*G0_0_1_8_6 - 0.0164407021549909*G0_0_1_8_7 + 0.055898387326968*G0_0_1_8_8 + 0.0361695447409793*G0_0_1_8_9 + 0.030689310689316*G0_0_1_9_0 - 0.00657628086199619*G0_0_1_9_1 - 0.0354388468674243*G0_0_1_9_2 + 0.167695161980905*G0_0_1_9_3 + 0.217017268445877*G0_0_1_9_4 - 0.072339089481959*G0_0_1_9_5 + 0.134813757670923*G0_0_1_9_6 - 0.111796774653936*G0_0_1_9_7 + 0.0361695447409793*G0_0_1_9_8 + 1.30210361067526*G0_0_1_9_9 + 0.0130646073503237*G0_1_0_0_0 - 0.000737463594606589*G0_1_0_0_1 - 0.0022394536680255*G0_1_0_0_2 + 0.0188763617335079*G0_1_0_0_3 + 0.00499310213596019*G0_1_0_0_4 + 0.00736787022501415*G0_1_0_0_5 - 0.00140050425764732*G0_1_0_0_6 - 0.00152228723657328*G0_1_0_0_7 - 0.000608914894629229*G0_1_0_0_8 - 0.0230169830169868*G0_1_0_0_9 - 0.000737463594606589*G0_1_0_1_0 + 0.0125977725977748*G0_1_0_1_1 - 0.000419474705189052*G0_1_0_1_2 - 0.0123609723609742*G0_1_0_1_3 - 0.0359259787831277*G0_1_0_1_4 + 0.0128481042766778*G0_1_0_1_5 - 0.00103515532086978*G0_1_0_1_6 + 0.00669806384092209*G0_1_0_1_7 - 0.0144921744921769*G0_1_0_1_8 - 0.00657628086199624*G0_1_0_1_9 - 0.0022394536680255*G0_1_0_2_0 - 0.000419474705189053*G0_1_0_2_1 - 0.00847744847744984*G0_1_0_2_2 + 0.00231387659959122*G0_1_0_2_3 - 0.0749574235288647*G0_1_0_2_4 + 0.0173540744969345*G0_1_0_2_5 - 0.0162580276866019*G0_1_0_2_6 + 0.0139441510870106*G0_1_0_2_7 + 0.0123000808715115*G0_1_0_2_8 + 0.0182674468388785*G0_1_0_2_9 + 0.0188763617335079*G0_1_0_3_0 - 0.0123609723609742*G0_1_0_3_1 + 0.00231387659959122*G0_1_0_3_2 + 0.731063222491917*G0_1_0_3_3 + 0.201672613101219*G0_1_0_3_4 - 0.0504181532753045*G0_1_0_3_5 + 0.00876837448266172*G0_1_0_3_6 - 0.0509661766804711*G0_1_0_3_7 + 0.0822035107749532*G0_1_0_3_8 + 0.121661195946931*G0_1_0_3_9 + 0.00499310213596018*G0_1_0_4_0 - 0.0359259787831277*G0_1_0_4_1 - 0.0749574235288647*G0_1_0_4_2 + 0.201672613101219*G0_1_0_4_3 + 0.200028542885721*G0_1_0_4_4 - 0.00931639788782806*G0_1_0_4_5 + 0.000548023405166419*G0_1_0_4_6 - 0.0312373340944823*G0_1_0_4_7 - 0.0312373340944822*G0_1_0_4_8 - 0.0361695447409794*G0_1_0_4_9 + 0.00736787022501415*G0_1_0_5_0 + 0.0128481042766778*G0_1_0_5_1 + 0.0173540744969345*G0_1_0_5_2 - 0.0504181532753045*G0_1_0_5_3 - 0.00931639788782806*G0_1_0_5_4 + 0.0750792065077905*G0_1_0_5_5 - 0.0465819894391398*G0_1_0_5_6 + 0.0690509490509605*G0_1_0_5_7 - 0.0328814043099812*G0_1_0_5_8 + 0.134813757670923*G0_1_0_5_9 - 0.00140050425764732*G0_1_0_6_0 - 0.00103515532086978*G0_1_0_6_1 - 0.0162580276866019*G0_1_0_6_2 + 0.00876837448266172*G0_1_0_6_3 + 0.000548023405166419*G0_1_0_6_4 - 0.0465819894391398*G0_1_0_6_5 + 0.0290452404738168*G0_1_0_6_6 - 0.0361695447409793*G0_1_0_6_7 - 0.0197288425859888*G0_1_0_6_8 - 0.0723390894819588*G0_1_0_6_9 - 0.00152228723657329*G0_1_0_7_0 + 0.00669806384092209*G0_1_0_7_1 + 0.0139441510870106*G0_1_0_7_2 - 0.0509661766804711*G0_1_0_7_3 - 0.0312373340944823*G0_1_0_7_4 + 0.0690509490509605*G0_1_0_7_5 - 0.0361695447409793*G0_1_0_7_6 + 0.0608305979734655*G0_1_0_7_7 - 0.027949193663484*G0_1_0_7_8 + 0.14139003853292*G0_1_0_7_9 - 0.000608914894629223*G0_1_0_8_0 - 0.0144921744921769*G0_1_0_8_1 + 0.0123000808715115*G0_1_0_8_2 + 0.0822035107749532*G0_1_0_8_3 - 0.0312373340944822*G0_1_0_8_4 - 0.0328814043099812*G0_1_0_8_5 - 0.0197288425859888*G0_1_0_8_6 - 0.027949193663484*G0_1_0_8_7 + 0.19400028542889*G0_1_0_8_8 + 0.0822035107749533*G0_1_0_8_9 - 0.0230169830169868*G0_1_0_9_0 - 0.00657628086199624*G0_1_0_9_1 + 0.0182674468388785*G0_1_0_9_2 + 0.121661195946931*G0_1_0_9_3 - 0.0361695447409793*G0_1_0_9_4 + 0.134813757670923*G0_1_0_9_5 - 0.0723390894819588*G0_1_0_9_6 + 0.14139003853292*G0_1_0_9_7 + 0.0822035107749533*G0_1_0_9_8 + 1.30210361067526*G0_1_0_9_9 + 0.0200265343122518*G0_1_1_0_0 - 0.00150199007341893*G0_1_1_0_1 + 0.0142486085343253*G0_1_1_0_3 + 0.00639360639360761*G0_1_1_0_4 + 0.0176585319442491*G0_1_1_0_5 - 0.0119347319347339*G0_1_1_0_6 + 0.0747138575710129*G0_1_1_0_7 + 0.00219209362066539*G0_1_1_0_8 + 0.0124218638504374*G0_1_1_0_9 - 0.00150199007341893*G0_1_1_1_0 + 0.00150199007341891*G0_1_1_1_2 - 0.00511488511488588*G0_1_1_1_3 - 0.0409190809190878*G0_1_1_1_4 + 0.00621093192521868*G0_1_1_1_5 - 0.00621093192521867*G0_1_1_1_6 + 0.0409190809190878*G0_1_1_1_7 + 0.00511488511488593*G0_1_1_1_8 + 0.00150199007341891*G0_1_1_2_1 - 0.0200265343122518*G0_1_1_2_2 - 0.00219209362066552*G0_1_1_2_3 - 0.074713857571013*G0_1_1_2_4 + 0.0119347319347339*G0_1_1_2_5 - 0.0176585319442491*G0_1_1_2_6 - 0.00639360639360749*G0_1_1_2_7 - 0.0142486085343252*G0_1_1_2_8 - 0.0124218638504374*G0_1_1_2_9 + 0.0142486085343253*G0_1_1_3_0 - 0.00511488511488587*G0_1_1_3_1 - 0.00219209362066551*G0_1_1_3_2 + 0.67516483516495*G0_1_1_3_3 + 0.218113315256209*G0_1_1_3_4 - 0.0306893106893158*G0_1_1_3_5 + 0.018632795775656*G0_1_1_3_6 - 0.0427458256029757*G0_1_1_3_7 + 0.0854916512059516*G0_1_1_3_9 + 0.0063936063936076*G0_1_1_4_0 - 0.0409190809190878*G0_1_1_4_1 - 0.074713857571013*G0_1_1_4_2 + 0.218113315256209*G0_1_1_4_3 + 0.323333809048151*G0_1_1_4_4 - 0.0191808191808226*G0_1_1_4_5 + 0.000548023405166609*G0_1_1_4_6 + 0.0427458256029757*G0_1_1_4_8 + 0.0756272299129574*G0_1_1_4_9 + 0.0176585319442491*G0_1_1_5_0 + 0.00621093192521868*G0_1_1_5_1 + 0.0119347319347339*G0_1_1_5_2 - 0.0306893106893158*G0_1_1_5_3 - 0.0191808191808226*G0_1_1_5_4 - 0.00054802340516651*G0_1_1_5_7 - 0.0186327957756559*G0_1_1_5_8 - 0.0119347319347339*G0_1_1_6_0 - 0.00621093192521867*G0_1_1_6_1 - 0.0176585319442491*G0_1_1_6_2 + 0.018632795775656*G0_1_1_6_3 + 0.000548023405166609*G0_1_1_6_4 + 0.0191808191808224*G0_1_1_6_7 + 0.0306893106893157*G0_1_1_6_8 + 0.0747138575710129*G0_1_1_7_0 + 0.0409190809190878*G0_1_1_7_1 - 0.00639360639360749*G0_1_1_7_2 - 0.0427458256029757*G0_1_1_7_3 - 0.000548023405166515*G0_1_1_7_5 + 0.0191808191808224*G0_1_1_7_6 - 0.32333380904815*G0_1_1_7_7 - 0.218113315256209*G0_1_1_7_8 - 0.075627229912957*G0_1_1_7_9 + 0.00219209362066539*G0_1_1_8_0 + 0.00511488511488593*G0_1_1_8_1 - 0.0142486085343252*G0_1_1_8_2 + 0.0427458256029757*G0_1_1_8_4 - 0.0186327957756559*G0_1_1_8_5 + 0.0306893106893157*G0_1_1_8_6 - 0.218113315256209*G0_1_1_8_7 - 0.675164835164951*G0_1_1_8_8 - 0.0854916512059518*G0_1_1_8_9 + 0.0124218638504374*G0_1_1_9_0 - 0.0124218638504374*G0_1_1_9_2 + 0.0854916512059516*G0_1_1_9_3 + 0.0756272299129574*G0_1_1_9_4 - 0.075627229912957*G0_1_1_9_7 - 0.0854916512059518*G0_1_1_9_8; + A[192] = A[223] + 0.081797567511867*G0_0_0_0_0 + 0.00759113901971173*G0_0_0_0_1 + 0.019870922728069*G0_0_0_0_2 + 0.0032272489415352*G0_0_0_0_3 + 0.0138223681080848*G0_0_0_0_4 + 0.112649255506417*G0_0_0_0_5 - 0.058516721373874*G0_0_0_0_6 + 0.0268531468531513*G0_0_0_0_7 - 0.0140659340659364*G0_0_0_0_8 + 0.035804195804202*G0_0_0_0_9 + 0.00759113901971173*G0_0_0_1_0 + 0.0348164005306922*G0_0_0_1_1 + 0.00746259031973445*G0_0_0_1_2 + 0.0372047000618493*G0_0_0_1_3 + 0.00797678511964365*G0_0_0_1_4 + 0.0530973788116734*G0_0_0_1_5 + 0.0214946957804138*G0_0_0_1_6 + 0.00809856809856942*G0_0_0_1_7 - 0.0098035298035314*G0_0_0_1_8 + 0.020459540459544*G0_0_0_1_9 + 0.019870922728069*G0_0_0_2_0 + 0.00746259031973445*G0_0_0_2_1 + 0.0496333296333381*G0_0_0_2_2 + 0.00700252128823672*G0_0_0_2_3 + 0.0285581085581135*G0_0_0_2_4 + 0.0138223681080848*G0_0_0_2_5 - 0.000426240426240454*G0_0_0_2_6 + 0.0169278340706941*G0_0_0_2_7 + 0.00925550639836508*G0_0_0_2_8 + 0.0252090766376523*G0_0_0_2_9 + 0.0032272489415352*G0_0_0_3_0 + 0.0372047000618493*G0_0_0_3_1 + 0.00700252128823672*G0_0_0_3_2 + 0.301412872841495*G0_0_0_3_3 - 0.209892964178714*G0_0_0_3_4 - 0.0641187384044632*G0_0_0_3_5 - 0.10522049379194*G0_0_0_3_6 - 0.0504181532753046*G0_0_0_3_7 + 0.118921078921099*G0_0_0_3_8 + 0.0394576851719777*G0_0_0_3_9 + 0.0138223681080848*G0_0_0_4_0 + 0.00797678511964365*G0_0_0_4_1 + 0.0285581085581135*G0_0_0_4_2 - 0.209892964178714*G0_0_0_4_3 + 0.403345226202437*G0_0_0_4_4 - 0.0822035107749534*G0_0_0_4_5 + 0.187424004566893*G0_0_0_4_6 - 0.0257571000428187*G0_0_0_4_7 - 0.0685029256457943*G0_0_0_4_8 + 0.0887797916369492*G0_0_0_4_9 + 0.112649255506417*G0_0_0_5_0 + 0.0530973788116734*G0_0_0_5_1 + 0.0138223681080848*G0_0_0_5_2 - 0.0641187384044632*G0_0_0_5_3 - 0.0822035107749534*G0_0_0_5_4 + 1.79751676894564*G0_0_0_5_5 - 0.186875981161727*G0_0_0_5_6 + 0.291548451548501*G0_0_0_5_7 - 0.200028542885719*G0_0_0_5_8 + 0.292644498358834*G0_0_0_5_9 - 0.058516721373874*G0_0_0_6_0 + 0.0214946957804138*G0_0_0_6_1 - 0.000426240426240454*G0_0_0_6_2 - 0.10522049379194*G0_0_0_6_3 + 0.187424004566893*G0_0_0_6_4 - 0.186875981161726*G0_0_0_6_5 + 0.955752818610124*G0_0_0_6_6 - 0.091519908662781*G0_0_0_6_7 - 0.0257571000428186*G0_0_0_6_8 + 0.134813757670923*G0_0_0_6_9 + 0.0268531468531513*G0_0_0_7_0 + 0.00809856809856942*G0_0_0_7_1 + 0.0169278340706941*G0_0_0_7_2 - 0.0504181532753046*G0_0_0_7_3 - 0.0257571000428187*G0_0_0_7_4 + 0.291548451548501*G0_0_0_7_5 - 0.091519908662781*G0_0_0_7_6 + 0.168791208791237*G0_0_0_7_7 - 0.0876837448266167*G0_0_0_7_8 + 0.075627229912957*G0_0_0_7_9 - 0.0140659340659364*G0_0_0_8_0 - 0.00980352980353141*G0_0_0_8_1 + 0.00925550639836508*G0_0_0_8_2 + 0.118921078921099*G0_0_0_8_3 - 0.0685029256457943*G0_0_0_8_4 - 0.200028542885719*G0_0_0_8_5 - 0.0257571000428186*G0_0_0_8_6 - 0.0876837448266167*G0_0_0_8_7 + 0.168791208791237*G0_0_0_8_8 + 0.0756272299129568*G0_0_0_8_9 + 0.035804195804202*G0_0_0_9_0 + 0.020459540459544*G0_0_0_9_1 + 0.0252090766376523*G0_0_0_9_2 + 0.0394576851719777*G0_0_0_9_3 + 0.0887797916369493*G0_0_0_9_4 + 0.292644498358834*G0_0_0_9_5 + 0.134813757670923*G0_0_0_9_6 + 0.075627229912957*G0_0_0_9_7 + 0.0756272299129568*G0_0_0_9_8 + 1.53884972170712*G0_0_0_9_9 + 0.0264810321953223*G0_0_1_0_0 + 0.00453303310446244*G0_0_1_0_1 + 0.00453303310446246*G0_0_1_0_2 - 0.00219209362066543*G0_0_1_0_3 - 0.0021920936206654*G0_0_1_0_4 + 0.0337338851624621*G0_0_1_0_5 - 0.0121174064031227*G0_0_1_0_6 + 0.0337338851624621*G0_0_1_0_7 - 0.0121174064031227*G0_0_1_0_8 + 0.0241130298273197*G0_0_1_0_9 + 0.00453303310446244*G0_0_1_1_0 + 0.0174758574758604*G0_0_1_1_1 + 0.00397824397824467*G0_0_1_1_2 + 0.0354388468674243*G0_0_1_1_3 + 0.010229770229772*G0_0_1_1_4 + 0.00219209362066541*G0_0_1_1_5 + 0.00383616383616452*G0_0_1_1_6 + 0.0090728319299763*G0_0_1_1_7 - 0.0102906617192349*G0_0_1_1_8 + 0.0109604681033271*G0_0_1_1_9 + 0.00453303310446246*G0_0_1_2_0 + 0.00397824397824467*G0_0_1_2_1 + 0.0174758574758606*G0_0_1_2_2 + 0.0102297702297719*G0_0_1_2_3 + 0.0354388468674245*G0_0_1_2_4 + 0.0090728319299762*G0_0_1_2_5 - 0.0102906617192347*G0_0_1_2_6 + 0.00219209362066542*G0_0_1_2_7 + 0.00383616383616448*G0_0_1_2_8 + 0.0109604681033271*G0_0_1_2_9 - 0.00219209362066542*G0_0_1_3_0 + 0.0354388468674243*G0_0_1_3_1 + 0.0102297702297719*G0_0_1_3_2 + 0.195644355644389*G0_0_1_3_3 - 0.184135864135895*G0_0_1_3_4 + 0.0115084915084935*G0_0_1_3_5 - 0.0345254745254805*G0_0_1_3_6 - 0.0164407021549907*G0_0_1_3_7 + 0.050966176680471*G0_0_1_3_8 - 0.0021920936206654*G0_0_1_4_0 + 0.010229770229772*G0_0_1_4_1 + 0.0354388468674245*G0_0_1_4_2 - 0.184135864135895*G0_0_1_4_3 + 0.195644355644389*G0_0_1_4_4 - 0.0164407021549907*G0_0_1_4_5 + 0.0509661766804711*G0_0_1_4_6 + 0.0115084915084934*G0_0_1_4_7 - 0.0345254745254803*G0_0_1_4_8 + 0.0337338851624621*G0_0_1_5_0 + 0.00219209362066541*G0_0_1_5_1 + 0.0090728319299762*G0_0_1_5_2 + 0.0115084915084935*G0_0_1_5_3 - 0.0164407021549907*G0_0_1_5_4 + 0.0569944341373013*G0_0_1_5_5 - 0.0580904809476336*G0_0_1_5_6 + 0.0591865277579663*G0_0_1_5_7 - 0.0295932638789831*G0_0_1_5_8 - 0.0131525617239926*G0_0_1_5_9 - 0.0121174064031226*G0_0_1_6_0 + 0.00383616383616452*G0_0_1_6_1 - 0.0102906617192347*G0_0_1_6_2 - 0.0345254745254805*G0_0_1_6_3 + 0.0509661766804712*G0_0_1_6_4 - 0.0580904809476336*G0_0_1_6_5 + 0.00931639788782924*G0_0_1_6_6 - 0.0295932638789832*G0_0_1_6_7 + 0.0361695447409795*G0_0_1_6_9 + 0.0337338851624621*G0_0_1_7_0 + 0.0090728319299763*G0_0_1_7_1 + 0.00219209362066542*G0_0_1_7_2 - 0.0164407021549907*G0_0_1_7_3 + 0.0115084915084934*G0_0_1_7_4 + 0.0591865277579663*G0_0_1_7_5 - 0.0295932638789832*G0_0_1_7_6 + 0.056994434137301*G0_0_1_7_7 - 0.0580904809476334*G0_0_1_7_8 - 0.0131525617239923*G0_0_1_7_9 - 0.0121174064031227*G0_0_1_8_0 - 0.0102906617192349*G0_0_1_8_1 + 0.00383616383616448*G0_0_1_8_2 + 0.050966176680471*G0_0_1_8_3 - 0.0345254745254803*G0_0_1_8_4 - 0.0295932638789831*G0_0_1_8_5 - 0.0580904809476335*G0_0_1_8_7 + 0.00931639788782808*G0_0_1_8_8 + 0.0361695447409794*G0_0_1_8_9 + 0.0241130298273197*G0_0_1_9_0 + 0.0109604681033271*G0_0_1_9_1 + 0.0109604681033271*G0_0_1_9_2 - 0.0131525617239925*G0_0_1_9_5 + 0.0361695447409795*G0_0_1_9_6 - 0.0131525617239923*G0_0_1_9_7 + 0.0361695447409794*G0_0_1_9_8 + 1.10481518481537*G0_0_1_9_9 + 0.0306487163630071*G0_1_0_0_0 + 0.00698898984613387*G0_1_0_0_1 + 0.00698898984613387*G0_1_0_0_2 + 0.00913372341943928*G0_1_0_0_3 + 0.00913372341943931*G0_1_0_0_4 + 0.0384225298511076*G0_1_0_0_5 - 0.0116302744874192*G0_1_0_0_6 + 0.0384225298511076*G0_1_0_0_7 - 0.0116302744874193*G0_1_0_0_8 + 0.0657628086199626*G0_1_0_0_9 + 0.00698898984613387*G0_1_0_1_0 + 0.023159063159067*G0_1_0_1_1 + 0.00761820190391748*G0_1_0_1_2 + 0.0388487702773483*G0_1_0_1_3 + 0.00560201703058945*G0_1_0_1_4 - 0.00182674468388786*G0_1_0_1_5 + 0.00748965320394019*G0_1_0_1_6 + 0.00274011702583177*G0_1_0_1_7 + 0.000365348936777541*G0_1_0_1_8 - 0.00109604681033266*G0_1_0_1_9 + 0.00698898984613387*G0_1_0_2_0 + 0.00761820190391748*G0_1_0_2_1 + 0.023159063159067*G0_1_0_2_2 + 0.00560201703058937*G0_1_0_2_3 + 0.0388487702773483*G0_1_0_2_4 + 0.00274011702583176*G0_1_0_2_5 + 0.000365348936777586*G0_1_0_2_6 - 0.00182674468388784*G0_1_0_2_7 + 0.00748965320394015*G0_1_0_2_8 - 0.00109604681033274*G0_1_0_2_9 + 0.00913372341943928*G0_1_0_3_0 + 0.0388487702773483*G0_1_0_3_1 + 0.00560201703058937*G0_1_0_3_2 + 0.417045811331597*G0_1_0_3_3 - 0.209344940773547*G0_1_0_3_4 + 0.0049322106464972*G0_1_0_3_5 - 0.054254317111469*G0_1_0_3_6 - 0.0591865277579663*G0_1_0_3_7 + 0.113440844869435*G0_1_0_3_8 + 0.121661195946931*G0_1_0_3_9 + 0.00913372341943931*G0_1_0_4_0 + 0.00560201703058944*G0_1_0_4_1 + 0.0388487702773483*G0_1_0_4_2 - 0.209344940773547*G0_1_0_4_3 + 0.417045811331596*G0_1_0_4_4 - 0.0591865277579664*G0_1_0_4_5 + 0.113440844869435*G0_1_0_4_6 + 0.00493221064649716*G0_1_0_4_7 - 0.054254317111469*G0_1_0_4_8 + 0.121661195946931*G0_1_0_4_9 + 0.0384225298511076*G0_1_0_5_0 - 0.00182674468388786*G0_1_0_5_1 + 0.00274011702583176*G0_1_0_5_2 + 0.00493221064649721*G0_1_0_5_3 - 0.0591865277579664*G0_1_0_5_4 + 0.0942600256886131*G0_1_0_5_5 - 0.0717910660767924*G0_1_0_5_6 + 0.05261024689597*G0_1_0_5_7 - 0.026305123447985*G0_1_0_5_8 - 0.144678178963917*G0_1_0_5_9 - 0.0116302744874192*G0_1_0_6_0 + 0.00748965320394019*G0_1_0_6_1 + 0.000365348936777586*G0_1_0_6_2 - 0.054254317111469*G0_1_0_6_3 + 0.113440844869435*G0_1_0_6_4 - 0.0717910660767924*G0_1_0_6_5 + 0.0926159554731138*G0_1_0_6_6 - 0.026305123447985*G0_1_0_6_7 - 0.00657628086199624*G0_1_0_6_8 + 0.111796774653936*G0_1_0_6_9 + 0.0384225298511076*G0_1_0_7_0 + 0.00274011702583177*G0_1_0_7_1 - 0.00182674468388784*G0_1_0_7_2 - 0.0591865277579663*G0_1_0_7_3 + 0.00493221064649716*G0_1_0_7_4 + 0.05261024689597*G0_1_0_7_5 - 0.026305123447985*G0_1_0_7_6 + 0.0942600256886127*G0_1_0_7_7 - 0.0717910660767923*G0_1_0_7_8 - 0.144678178963917*G0_1_0_7_9 - 0.0116302744874193*G0_1_0_8_0 + 0.000365348936777542*G0_1_0_8_1 + 0.00748965320394015*G0_1_0_8_2 + 0.113440844869435*G0_1_0_8_3 - 0.054254317111469*G0_1_0_8_4 - 0.026305123447985*G0_1_0_8_5 - 0.00657628086199624*G0_1_0_8_6 - 0.0717910660767923*G0_1_0_8_7 + 0.0926159554731135*G0_1_0_8_8 + 0.111796774653936*G0_1_0_8_9 + 0.0657628086199626*G0_1_0_9_0 - 0.00109604681033266*G0_1_0_9_1 - 0.00109604681033275*G0_1_0_9_2 + 0.121661195946931*G0_1_0_9_3 + 0.121661195946931*G0_1_0_9_4 - 0.144678178963917*G0_1_0_9_5 + 0.111796774653936*G0_1_0_9_6 - 0.144678178963917*G0_1_0_9_7 + 0.111796774653936*G0_1_0_9_8 + 0.15783074068791*G0_1_0_9_9 + 0.081797567511867*G0_1_1_0_0 + 0.019870922728069*G0_1_1_0_1 + 0.00759113901971172*G0_1_1_0_2 + 0.0138223681080847*G0_1_1_0_3 + 0.00322724894153525*G0_1_1_0_4 + 0.0268531468531513*G0_1_1_0_5 - 0.0140659340659364*G0_1_1_0_6 + 0.112649255506417*G0_1_1_0_7 - 0.0585167213738741*G0_1_1_0_8 + 0.0358041958042021*G0_1_1_0_9 + 0.019870922728069*G0_1_1_1_0 + 0.049633329633338*G0_1_1_1_1 + 0.00746259031973444*G0_1_1_1_2 + 0.0285581085581134*G0_1_1_1_3 + 0.00700252128823678*G0_1_1_1_4 + 0.016927834070694*G0_1_1_1_5 + 0.00925550639836512*G0_1_1_1_6 + 0.0138223681080847*G0_1_1_1_7 - 0.000426240426240516*G0_1_1_1_8 + 0.0252090766376523*G0_1_1_1_9 + 0.00759113901971172*G0_1_1_2_0 + 0.00746259031973444*G0_1_1_2_1 + 0.0348164005306921*G0_1_1_2_2 + 0.00797678511964355*G0_1_1_2_3 + 0.0372047000618493*G0_1_1_2_4 + 0.00809856809856947*G0_1_1_2_5 - 0.00980352980353145*G0_1_1_2_6 + 0.0530973788116734*G0_1_1_2_7 + 0.0214946957804136*G0_1_1_2_8 + 0.0204595404595439*G0_1_1_2_9 + 0.0138223681080847*G0_1_1_3_0 + 0.0285581085581134*G0_1_1_3_1 + 0.00797678511964355*G0_1_1_3_2 + 0.403345226202438*G0_1_1_3_3 - 0.209892964178714*G0_1_1_3_4 - 0.0257571000428187*G0_1_1_3_5 - 0.0685029256457942*G0_1_1_3_6 - 0.0822035107749536*G0_1_1_3_7 + 0.187424004566893*G0_1_1_3_8 + 0.0887797916369498*G0_1_1_3_9 + 0.00322724894153525*G0_1_1_4_0 + 0.00700252128823678*G0_1_1_4_1 + 0.0372047000618493*G0_1_1_4_2 - 0.209892964178714*G0_1_1_4_3 + 0.301412872841496*G0_1_1_4_4 - 0.0504181532753047*G0_1_1_4_5 + 0.118921078921099*G0_1_1_4_6 - 0.0641187384044634*G0_1_1_4_7 - 0.10522049379194*G0_1_1_4_8 + 0.0394576851719774*G0_1_1_4_9 + 0.0268531468531513*G0_1_1_5_0 + 0.016927834070694*G0_1_1_5_1 + 0.00809856809856948*G0_1_1_5_2 - 0.0257571000428187*G0_1_1_5_3 - 0.0504181532753046*G0_1_1_5_4 + 0.168791208791237*G0_1_1_5_5 - 0.0876837448266166*G0_1_1_5_6 + 0.2915484515485*G0_1_1_5_7 - 0.0915199086627812*G0_1_1_5_8 + 0.0756272299129566*G0_1_1_5_9 - 0.0140659340659364*G0_1_1_6_0 + 0.00925550639836512*G0_1_1_6_1 - 0.00980352980353145*G0_1_1_6_2 - 0.0685029256457942*G0_1_1_6_3 + 0.118921078921099*G0_1_1_6_4 - 0.0876837448266166*G0_1_1_6_5 + 0.168791208791237*G0_1_1_6_6 - 0.200028542885719*G0_1_1_6_7 - 0.0257571000428185*G0_1_1_6_8 + 0.0756272299129569*G0_1_1_6_9 + 0.112649255506417*G0_1_1_7_0 + 0.0138223681080847*G0_1_1_7_1 + 0.0530973788116734*G0_1_1_7_2 - 0.0822035107749536*G0_1_1_7_3 - 0.0641187384044634*G0_1_1_7_4 + 0.2915484515485*G0_1_1_7_5 - 0.200028542885719*G0_1_1_7_6 + 1.79751676894564*G0_1_1_7_7 - 0.186875981161727*G0_1_1_7_8 + 0.292644498358834*G0_1_1_7_9 - 0.0585167213738741*G0_1_1_8_0 - 0.000426240426240516*G0_1_1_8_1 + 0.0214946957804136*G0_1_1_8_2 + 0.187424004566893*G0_1_1_8_3 - 0.10522049379194*G0_1_1_8_4 - 0.0915199086627812*G0_1_1_8_5 - 0.0257571000428185*G0_1_1_8_6 - 0.186875981161727*G0_1_1_8_7 + 0.955752818610123*G0_1_1_8_8 + 0.134813757670923*G0_1_1_8_9 + 0.0358041958042021*G0_1_1_9_0 + 0.0252090766376524*G0_1_1_9_1 + 0.0204595404595439*G0_1_1_9_2 + 0.0887797916369498*G0_1_1_9_3 + 0.0394576851719774*G0_1_1_9_4 + 0.0756272299129566*G0_1_1_9_5 + 0.0756272299129569*G0_1_1_9_6 + 0.292644498358834*G0_1_1_9_7 + 0.134813757670923*G0_1_1_9_8 + 1.53884972170712*G0_1_1_9_9; + A[208] = A[192] - 0.0670077012934269*G0_0_0_0_0 - 0.0109063423349156*G0_0_0_0_2 + 0.0434765234765309*G0_0_0_0_3 - 0.00657628086199629*G0_0_0_0_4 - 0.150158413015581*G0_0_0_0_5 + 0.0643014128728524*G0_0_0_0_6 - 0.054315208600932*G0_0_0_0_7 + 0.0340992340992398*G0_0_0_0_8 - 0.0277665191950953*G0_0_0_0_9 + 0.0670077012934269*G0_0_0_1_1 + 0.0109063423349156*G0_0_0_1_2 + 0.150158413015581*G0_0_0_1_3 - 0.0643014128728523*G0_0_0_1_4 - 0.0434765234765308*G0_0_0_1_5 + 0.00657628086199624*G0_0_0_1_6 - 0.0340992340992399*G0_0_0_1_7 + 0.0543152086009321*G0_0_0_1_8 + 0.0277665191950954*G0_0_0_1_9 - 0.0109063423349156*G0_0_0_2_0 + 0.0109063423349156*G0_0_0_2_1 + 0.0477389277389358*G0_0_0_2_3 - 0.0238694638694681*G0_0_0_2_4 - 0.0477389277389358*G0_0_0_2_5 + 0.023869463869468*G0_0_0_2_6 - 0.0138832595975476*G0_0_0_2_7 + 0.0138832595975477*G0_0_0_2_8 + 0.0434765234765309*G0_0_0_3_0 + 0.150158413015581*G0_0_0_3_1 + 0.0477389277389358*G0_0_0_3_2 + 1.172770087056*G0_0_0_3_3 - 0.195096332239222*G0_0_0_3_4 - 0.0197288425859887*G0_0_0_3_6 - 0.130429570429593*G0_0_0_3_7 + 0.172079349222236*G0_0_0_3_8 + 0.177559583273899*G0_0_0_3_9 - 0.00657628086199629*G0_0_0_4_0 - 0.0643014128728523*G0_0_0_4_1 - 0.0238694638694681*G0_0_0_4_2 - 0.195096332239222*G0_0_0_4_3 - 0.122757242757265*G0_0_0_4_4 + 0.0197288425859889*G0_0_0_4_5 + 0.0306893106893159*G0_0_0_4_7 - 0.041649778792643*G0_0_0_4_8 - 0.0394576851719776*G0_0_0_4_9 - 0.150158413015581*G0_0_0_5_0 - 0.0434765234765308*G0_0_0_5_1 - 0.0477389277389359*G0_0_0_5_2 + 0.0197288425859889*G0_0_0_5_4 - 1.172770087056*G0_0_0_5_5 + 0.195096332239222*G0_0_0_5_6 - 0.172079349222235*G0_0_0_5_7 + 0.130429570429592*G0_0_0_5_8 - 0.177559583273899*G0_0_0_5_9 + 0.0643014128728524*G0_0_0_6_0 + 0.00657628086199624*G0_0_0_6_1 + 0.023869463869468*G0_0_0_6_2 - 0.0197288425859887*G0_0_0_6_3 + 0.195096332239222*G0_0_0_6_5 + 0.122757242757264*G0_0_0_6_6 + 0.0416497787926428*G0_0_0_6_7 - 0.0306893106893158*G0_0_0_6_8 + 0.0394576851719775*G0_0_0_6_9 - 0.054315208600932*G0_0_0_7_0 - 0.0340992340992399*G0_0_0_7_1 - 0.0138832595975476*G0_0_0_7_2 - 0.130429570429593*G0_0_0_7_3 + 0.0306893106893159*G0_0_0_7_4 - 0.172079349222235*G0_0_0_7_5 + 0.0416497787926428*G0_0_0_7_6 + 0.0340992340992398*G0_0_0_8_0 + 0.0543152086009321*G0_0_0_8_1 + 0.0138832595975477*G0_0_0_8_2 + 0.172079349222236*G0_0_0_8_3 - 0.041649778792643*G0_0_0_8_4 + 0.130429570429592*G0_0_0_8_5 - 0.0306893106893158*G0_0_0_8_6 - 0.0277665191950953*G0_0_0_9_0 + 0.0277665191950954*G0_0_0_9_1 + 0.177559583273899*G0_0_0_9_3 - 0.0394576851719777*G0_0_0_9_4 - 0.177559583273899*G0_0_0_9_5 + 0.0394576851719775*G0_0_0_9_6 - 0.0263727806584993*G0_0_1_0_0 - 0.0016914302628591*G0_0_1_0_1 - 0.00276717991003751*G0_0_1_0_2 + 0.0367784596356089*G0_0_1_0_3 - 0.0103515532086979*G0_0_1_0_4 - 0.0351343894201095*G0_0_1_0_5 + 0.00998620427192017*G0_0_1_0_6 - 0.0453032681604186*G0_0_1_0_7 + 0.0120565149136598*G0_0_1_0_8 - 0.033246753246759*G0_0_1_0_9 - 0.0016914302628591*G0_0_1_1_0 + 0.0406349206349275*G0_0_1_1_1 + 0.00813916242487806*G0_0_1_1_2 + 0.115024023595472*G0_0_1_1_3 - 0.0543152086009321*G0_0_1_1_4 - 0.00669806384092208*G0_0_1_1_5 - 0.00377527234670158*G0_0_1_1_6 - 0.02204271918558*G0_0_1_1_7 + 0.00901194044051337*G0_0_1_1_8 - 0.0054802340516635*G0_0_1_1_9 - 0.00276717991003751*G0_0_1_2_0 + 0.00813916242487806*G0_0_1_2_1 - 0.00359936359936431*G0_0_1_2_2 + 0.0350734979306468*G0_0_1_2_3 - 0.0166233766233797*G0_0_1_2_4 - 0.0126654298082891*G0_0_1_2_5 + 0.00724608724608844*G0_0_1_2_6 - 0.00560201703058939*G0_0_1_2_7 + 0.00828124256695827*G0_0_1_2_8 + 0.0219209362066542*G0_0_1_2_9 + 0.0367784596356089*G0_0_1_3_0 + 0.115024023595472*G0_0_1_3_1 + 0.0350734979306468*G0_0_1_3_2 + 1.12344798059103*G0_0_1_3_3 - 0.121113172541764*G0_0_1_3_4 - 0.0493221064649718*G0_0_1_3_5 + 0.0197288425859887*G0_0_1_3_6 - 0.101932353360942*G0_0_1_3_7 + 0.118373055515933*G0_0_1_3_8 + 0.220305408876875*G0_0_1_3_9 - 0.0103515532086979*G0_0_1_4_0 - 0.0543152086009321*G0_0_1_4_1 - 0.0166233766233797*G0_0_1_4_2 - 0.121113172541764*G0_0_1_4_3 - 0.20167261310122*G0_0_1_4_4 + 0.0394576851719776*G0_0_1_4_5 - 0.0591865277579664*G0_0_1_4_6 + 0.0197288425859888*G0_0_1_4_7 - 0.0164407021549907*G0_0_1_4_8 - 0.144678178963918*G0_0_1_4_9 - 0.0351343894201095*G0_0_1_5_0 - 0.00669806384092208*G0_0_1_5_1 - 0.0126654298082891*G0_0_1_5_2 - 0.0493221064649718*G0_0_1_5_3 + 0.0394576851719776*G0_0_1_5_4 - 0.0493221064649719*G0_0_1_5_5 + 0.0739831596974578*G0_0_1_5_6 - 0.0537062937063027*G0_0_1_5_7 + 0.0284972170686504*G0_0_1_5_8 + 0.0427458256029759*G0_0_1_5_9 + 0.00998620427192017*G0_0_1_6_0 - 0.00377527234670158*G0_0_1_6_1 + 0.00724608724608844*G0_0_1_6_2 + 0.0197288425859887*G0_0_1_6_3 - 0.0591865277579665*G0_0_1_6_4 + 0.0739831596974578*G0_0_1_6_5 - 0.0789153703439546*G0_0_1_6_6 + 0.0252090766376523*G0_0_1_6_7 - 0.0109604681033271*G0_0_1_6_8 - 0.10522049379194*G0_0_1_6_9 - 0.0453032681604186*G0_0_1_7_0 - 0.02204271918558*G0_0_1_7_1 - 0.0056020170305894*G0_0_1_7_2 - 0.101932353360942*G0_0_1_7_3 + 0.0197288425859888*G0_0_1_7_4 - 0.0537062937063027*G0_0_1_7_5 + 0.0252090766376523*G0_0_1_7_6 - 0.00986442129299431*G0_0_1_7_7 + 0.0887797916369494*G0_0_1_7_8 + 0.0493221064649719*G0_0_1_7_9 + 0.0120565149136598*G0_0_1_8_0 + 0.00901194044051336*G0_0_1_8_1 + 0.00828124256695827*G0_0_1_8_2 + 0.118373055515933*G0_0_1_8_3 - 0.0164407021549907*G0_0_1_8_4 + 0.0284972170686504*G0_0_1_8_5 - 0.0109604681033271*G0_0_1_8_6 + 0.0887797916369494*G0_0_1_8_7 - 0.00986442129299424*G0_0_1_8_8 + 0.0493221064649721*G0_0_1_8_9 - 0.033246753246759*G0_0_1_9_0 - 0.0054802340516635*G0_0_1_9_1 + 0.0219209362066542*G0_0_1_9_2 + 0.220305408876875*G0_0_1_9_3 - 0.144678178963918*G0_0_1_9_4 + 0.0427458256029759*G0_0_1_9_5 - 0.10522049379194*G0_0_1_9_6 + 0.0493221064649719*G0_0_1_9_7 + 0.0493221064649721*G0_0_1_9_8 - 1.02589981447142*G0_0_1_9_9 - 0.0263727806584993*G0_1_0_0_0 - 0.0016914302628591*G0_1_0_0_1 - 0.00276717991003751*G0_1_0_0_2 + 0.0367784596356089*G0_1_0_0_3 - 0.0103515532086979*G0_1_0_0_4 - 0.0351343894201095*G0_1_0_0_5 + 0.00998620427192018*G0_1_0_0_6 - 0.0453032681604186*G0_1_0_0_7 + 0.0120565149136598*G0_1_0_0_8 - 0.033246753246759*G0_1_0_0_9 - 0.0016914302628591*G0_1_0_1_0 + 0.0406349206349275*G0_1_0_1_1 + 0.00813916242487806*G0_1_0_1_2 + 0.115024023595472*G0_1_0_1_3 - 0.0543152086009321*G0_1_0_1_4 - 0.00669806384092208*G0_1_0_1_5 - 0.00377527234670158*G0_1_0_1_6 - 0.02204271918558*G0_1_0_1_7 + 0.00901194044051337*G0_1_0_1_8 - 0.0054802340516635*G0_1_0_1_9 - 0.00276717991003751*G0_1_0_2_0 + 0.00813916242487806*G0_1_0_2_1 - 0.00359936359936431*G0_1_0_2_2 + 0.0350734979306468*G0_1_0_2_3 - 0.0166233766233797*G0_1_0_2_4 - 0.0126654298082891*G0_1_0_2_5 + 0.00724608724608845*G0_1_0_2_6 - 0.00560201703058939*G0_1_0_2_7 + 0.00828124256695827*G0_1_0_2_8 + 0.0219209362066542*G0_1_0_2_9 + 0.0367784596356089*G0_1_0_3_0 + 0.115024023595472*G0_1_0_3_1 + 0.0350734979306468*G0_1_0_3_2 + 1.12344798059103*G0_1_0_3_3 - 0.121113172541764*G0_1_0_3_4 - 0.0493221064649718*G0_1_0_3_5 + 0.0197288425859887*G0_1_0_3_6 - 0.101932353360942*G0_1_0_3_7 + 0.118373055515933*G0_1_0_3_8 + 0.220305408876875*G0_1_0_3_9 - 0.0103515532086979*G0_1_0_4_0 - 0.0543152086009321*G0_1_0_4_1 - 0.0166233766233797*G0_1_0_4_2 - 0.121113172541764*G0_1_0_4_3 - 0.20167261310122*G0_1_0_4_4 + 0.0394576851719776*G0_1_0_4_5 - 0.0591865277579664*G0_1_0_4_6 + 0.0197288425859888*G0_1_0_4_7 - 0.0164407021549907*G0_1_0_4_8 - 0.144678178963918*G0_1_0_4_9 - 0.0351343894201095*G0_1_0_5_0 - 0.00669806384092208*G0_1_0_5_1 - 0.0126654298082891*G0_1_0_5_2 - 0.0493221064649718*G0_1_0_5_3 + 0.0394576851719776*G0_1_0_5_4 - 0.0493221064649719*G0_1_0_5_5 + 0.0739831596974578*G0_1_0_5_6 - 0.0537062937063027*G0_1_0_5_7 + 0.0284972170686504*G0_1_0_5_8 + 0.042745825602976*G0_1_0_5_9 + 0.00998620427192017*G0_1_0_6_0 - 0.00377527234670158*G0_1_0_6_1 + 0.00724608724608845*G0_1_0_6_2 + 0.0197288425859887*G0_1_0_6_3 - 0.0591865277579664*G0_1_0_6_4 + 0.0739831596974578*G0_1_0_6_5 - 0.0789153703439546*G0_1_0_6_6 + 0.0252090766376523*G0_1_0_6_7 - 0.0109604681033271*G0_1_0_6_8 - 0.10522049379194*G0_1_0_6_9 - 0.0453032681604186*G0_1_0_7_0 - 0.02204271918558*G0_1_0_7_1 - 0.0056020170305894*G0_1_0_7_2 - 0.101932353360942*G0_1_0_7_3 + 0.0197288425859888*G0_1_0_7_4 - 0.0537062937063027*G0_1_0_7_5 + 0.0252090766376523*G0_1_0_7_6 - 0.00986442129299431*G0_1_0_7_7 + 0.0887797916369494*G0_1_0_7_8 + 0.049322106464972*G0_1_0_7_9 + 0.0120565149136598*G0_1_0_8_0 + 0.00901194044051336*G0_1_0_8_1 + 0.00828124256695827*G0_1_0_8_2 + 0.118373055515933*G0_1_0_8_3 - 0.0164407021549907*G0_1_0_8_4 + 0.0284972170686504*G0_1_0_8_5 - 0.0109604681033271*G0_1_0_8_6 + 0.0887797916369494*G0_1_0_8_7 - 0.00986442129299421*G0_1_0_8_8 + 0.0493221064649721*G0_1_0_8_9 - 0.033246753246759*G0_1_0_9_0 - 0.0054802340516635*G0_1_0_9_1 + 0.0219209362066542*G0_1_0_9_2 + 0.220305408876875*G0_1_0_9_3 - 0.144678178963918*G0_1_0_9_4 + 0.0427458256029759*G0_1_0_9_5 - 0.10522049379194*G0_1_0_9_6 + 0.049322106464972*G0_1_0_9_7 + 0.0493221064649721*G0_1_0_9_8 - 1.02589981447142*G0_1_0_9_9 - 0.0706070648927911*G0_1_1_0_0 - 0.00169143026285912*G0_1_1_0_1 - 0.00384292955721592*G0_1_1_0_2 + 0.0488349745492687*G0_1_1_0_3 - 0.00925550639836519*G0_1_1_0_4 - 0.0369002426145345*G0_1_1_0_5 + 0.0193634936492111*G0_1_1_0_6 - 0.17695066837927*G0_1_1_0_7 + 0.101445221445239*G0_1_1_0_8 - 0.00584558298844128*G0_1_1_0_9 - 0.00169143026285912*G0_1_1_1_0 + 0.0848692048692191*G0_1_1_1_1 + 0.00921491207205644*G0_1_1_1_2 + 0.116789876789897*G0_1_1_1_3 - 0.0636924979782231*G0_1_1_1_4 - 0.0187545787545819*G0_1_1_1_5 - 0.00487131915703426*G0_1_1_1_6 - 0.111431425717159*G0_1_1_1_7 + 0.140659340659364*G0_1_1_1_8 - 0.0328814043099813*G0_1_1_1_9 - 0.00384292955721592*G0_1_1_2_0 + 0.00921491207205644*G0_1_1_2_1 - 0.00359936359936438*G0_1_1_2_2 + 0.0371438085723863*G0_1_1_2_3 - 0.0267922553636887*G0_1_1_2_4 - 0.0147357404500286*G0_1_1_2_5 + 0.0174149659863974*G0_1_1_2_6 - 0.0527320298748958*G0_1_1_2_7 + 0.0554112554112647*G0_1_1_2_8 + 0.0219209362066542*G0_1_1_2_9 + 0.0488349745492687*G0_1_1_3_0 + 0.116789876789897*G0_1_1_3_1 + 0.0371438085723863*G0_1_1_3_2 + 1.19249892964199*G0_1_1_3_3 - 0.106316540602272*G0_1_1_3_4 - 0.0493221064649718*G0_1_1_3_5 + 0.0230169830169869*G0_1_1_3_6 - 0.138101898101921*G0_1_1_3_7 + 0.295932638789831*G0_1_1_3_8 + 0.374848009133787*G0_1_1_3_9 - 0.00925550639836519*G0_1_1_4_0 - 0.0636924979782231*G0_1_1_4_1 - 0.0267922553636887*G0_1_1_4_2 - 0.106316540602272*G0_1_1_4_3 - 0.162214927929242*G0_1_1_4_4 + 0.0361695447409795*G0_1_1_4_5 - 0.0591865277579665*G0_1_1_4_6 + 0.0887797916369493*G0_1_1_4_7 - 0.15783074068791*G0_1_1_4_8 - 0.138101898101921*G0_1_1_4_9 - 0.0369002426145346*G0_1_1_5_0 - 0.0187545787545819*G0_1_1_5_1 - 0.0147357404500286*G0_1_1_5_2 - 0.0493221064649718*G0_1_1_5_3 + 0.0361695447409795*G0_1_1_5_4 - 0.118373055515932*G0_1_1_5_5 + 0.0591865277579664*G0_1_1_5_6 - 0.231265876980201*G0_1_1_5_7 + 0.0646667618096297*G0_1_1_5_8 - 0.111796774653936*G0_1_1_5_9 + 0.0193634936492112*G0_1_1_6_0 - 0.00487131915703426*G0_1_1_6_1 + 0.0174149659863974*G0_1_1_6_2 + 0.023016983016987*G0_1_1_6_3 - 0.0591865277579665*G0_1_1_6_4 + 0.0591865277579664*G0_1_1_6_5 - 0.118373055515933*G0_1_1_6_6 + 0.166599115170572*G0_1_1_6_7 - 0.0800114171542876*G0_1_1_6_8 - 0.111796774653936*G0_1_1_6_9 - 0.17695066837927*G0_1_1_7_0 - 0.111431425717159*G0_1_1_7_1 - 0.0527320298748958*G0_1_1_7_2 - 0.138101898101921*G0_1_1_7_3 + 0.0887797916369493*G0_1_1_7_4 - 0.231265876980201*G0_1_1_7_5 + 0.166599115170572*G0_1_1_7_6 - 1.33498501498524*G0_1_1_7_7 + 0.0887797916369497*G0_1_1_7_8 - 0.315661481375821*G0_1_1_7_9 + 0.101445221445239*G0_1_1_8_0 + 0.140659340659364*G0_1_1_8_1 + 0.0554112554112647*G0_1_1_8_2 + 0.295932638789831*G0_1_1_8_3 - 0.15783074068791*G0_1_1_8_4 + 0.0646667618096297*G0_1_1_8_5 - 0.0800114171542876*G0_1_1_8_6 + 0.0887797916369497*G0_1_1_8_7 + 1.31525617239925*G0_1_1_8_8 + 0.414305694305765*G0_1_1_8_9 - 0.00584558298844128*G0_1_1_9_0 - 0.0328814043099813*G0_1_1_9_1 + 0.0219209362066542*G0_1_1_9_2 + 0.374848009133787*G0_1_1_9_3 - 0.138101898101921*G0_1_1_9_4 - 0.111796774653936*G0_1_1_9_5 - 0.111796774653936*G0_1_1_9_6 - 0.315661481375821*G0_1_1_9_7 + 0.414305694305765*G0_1_1_9_8 - 1.02589981447141*G0_1_1_9_9; + A[203] = -A[200] - 0.00153018057779988*G0_0_1_0_0 + 0.00150650055411984*G0_0_1_0_1 + 0.000795254128587598*G0_0_1_0_2 + 0.00274519131662038*G0_0_1_0_3 + 0.0065432979718705*G0_0_1_0_4 + 0.00902970045827342*G0_0_1_0_5 + 0.00629719486862449*G0_0_1_0_6 + 0.000900686614972448*G0_0_1_0_7 - 0.002197167911454*G0_0_1_0_8 + 0.0311155511155564*G0_0_1_0_9 + 0.00150650055411984*G0_0_1_1_0 - 0.0120373453706809*G0_0_1_1_1 - 0.000440053773387179*G0_0_1_1_2 + 0.0161387818530703*G0_0_1_1_3 + 0.00970711827854851*G0_0_1_1_4 - 0.00602318316604133*G0_0_1_1_5 + 0.00302681445538637*G0_0_1_1_6 - 0.00152736152736174*G0_0_1_1_7 - 0.00651285222713916*G0_0_1_1_8 + 0.0166842681128424*G0_0_1_1_9 + 0.000795254128587598*G0_0_1_2_0 - 0.000440053773387179*G0_0_1_2_1 + 0.0178310578310608*G0_0_1_2_3 - 0.0039072039072045*G0_0_1_2_4 + 0.00433344433344508*G0_0_1_2_5 + 0.0039072039072046*G0_0_1_2_6 - 0.00321456321456375*G0_0_1_2_7 + 0.00285936285936333*G0_0_1_2_8 - 0.0221645021645059*G0_0_1_2_9 + 0.00274519131662038*G0_0_1_3_0 + 0.0161387818530703*G0_0_1_3_1 + 0.0178310578310608*G0_0_1_3_2 + 0.222954188668513*G0_0_1_3_3 - 0.127712287712309*G0_0_1_3_4 + 0.0113258170401047*G0_0_1_3_5 - 0.0218981018981056*G0_0_1_3_6 - 0.0210532324818075*G0_0_1_3_7 + 0.0424489795918439*G0_0_1_3_8 - 0.00794633937491195*G0_0_1_3_9 + 0.0065432979718705*G0_0_1_4_0 + 0.00970711827854851*G0_0_1_4_1 - 0.00390720390720449*G0_0_1_4_2 - 0.127712287712309*G0_0_1_4_3 + 0.055944055944065*G0_0_1_4_4 - 0.0324475524475579*G0_0_1_4_5 + 0.0543456543456634*G0_0_1_4_6 + 0.00141572713001309*G0_0_1_4_7 - 0.0213957471100364*G0_0_1_4_8 + 0.131388611388633*G0_0_1_4_9 + 0.00902970045827342*G0_0_1_5_0 - 0.00602318316604133*G0_0_1_5_1 + 0.00433344433344508*G0_0_1_5_2 + 0.0113258170401047*G0_0_1_5_3 - 0.0324475524475579*G0_0_1_5_4 + 0.05032681604111*G0_0_1_5_5 - 0.0596203796203898*G0_0_1_5_6 - 0.00207792207792245*G0_0_1_5_7 + 0.00525189096617759*G0_0_1_5_8 - 0.103850435279024*G0_0_1_5_9 + 0.00629719486862449*G0_0_1_6_0 + 0.00302681445538637*G0_0_1_6_1 + 0.0039072039072046*G0_0_1_6_2 - 0.0218981018981056*G0_0_1_6_3 + 0.0543456543456634*G0_0_1_6_4 - 0.0596203796203898*G0_0_1_6_5 - 0.164635364635393*G0_0_1_6_6 - 0.00317396888825516*G0_0_1_6_7 - 0.0024204367061514*G0_0_1_6_8 + 0.110289710289729*G0_0_1_6_9 + 0.000900686614972448*G0_0_1_7_0 - 0.00152736152736174*G0_0_1_7_1 - 0.00321456321456375*G0_0_1_7_2 - 0.0210532324818075*G0_0_1_7_3 + 0.00141572713001309*G0_0_1_7_4 - 0.00207792207792245*G0_0_1_7_5 - 0.00317396888825516*G0_0_1_7_6 + 0.01237619523334*G0_0_1_7_7 + 0.00730697873555149*G0_0_1_7_8 - 0.0869987155701588*G0_0_1_7_9 - 0.002197167911454*G0_0_1_8_0 - 0.00651285222713916*G0_0_1_8_1 + 0.00285936285936333*G0_0_1_8_2 + 0.0424489795918439*G0_0_1_8_3 - 0.0213957471100364*G0_0_1_8_4 + 0.00525189096617759*G0_0_1_8_5 - 0.0024204367061514*G0_0_1_8_6 + 0.00730697873555149*G0_0_1_8_7 + 0.00223776223776238*G0_0_1_8_8 - 0.0072613101184542*G0_0_1_8_9 + 0.0311155511155564*G0_0_1_9_0 + 0.0166842681128424*G0_0_1_9_1 - 0.0221645021645059*G0_0_1_9_2 - 0.00794633937491196*G0_0_1_9_3 + 0.131388611388633*G0_0_1_9_4 - 0.103850435279024*G0_0_1_9_5 + 0.110289710289729*G0_0_1_9_6 - 0.0869987155701588*G0_0_1_9_7 - 0.00726131011845419*G0_0_1_9_8 - 0.0723390894819586*G0_0_1_9_9 - 0.00875258780020815*G0_1_1_0_0 + 0.00562203228869994*G0_1_1_0_1 + 0.000669806384092231*G0_1_1_0_2 + 0.00805036233607803*G0_1_1_0_3 - 0.00675388103959652*G0_1_1_0_4 - 0.00344798059083826*G0_1_1_0_5 + 0.00339470053755823*G0_1_1_0_6 - 0.0278959136102039*G0_1_1_0_7 + 0.0163341420484306*G0_1_1_0_8 + 0.00149184149184175*G0_1_1_0_9 + 0.00562203228869994*G0_1_1_1_0 + 0.0339334739334797*G0_1_1_1_1 + 0.00103712865617646*G0_1_1_1_2 + 0.0293750693750744*G0_1_1_1_3 - 0.00245595674167147*G0_1_1_1_4 - 0.00207284778713387*G0_1_1_1_5 + 0.00377273520130727*G0_1_1_1_6 - 0.0347081489938692*G0_1_1_1_7 + 0.0576490176490275*G0_1_1_1_8 + 0.0125132010846318*G0_1_1_1_9 + 0.000669806384092231*G0_1_1_2_0 + 0.00103712865617646*G0_1_1_2_1 - 0.0160234826901518*G0_1_1_2_2 + 0.019678099678103*G0_1_1_2_3 - 0.000142080142080216*G0_1_1_2_5 - 0.00222000222000248*G0_1_1_2_6 - 0.00218701932987684*G0_1_1_2_7 + 0.014352631495491*G0_1_1_2_8 + 0.00852480852480996*G0_1_1_2_9 + 0.00805036233607803*G0_1_1_3_0 + 0.0293750693750744*G0_1_1_3_1 + 0.019678099678103*G0_1_1_3_2 + 0.209801626944521*G0_1_1_3_3 - 0.10880548023407*G0_1_1_3_4 - 0.00333380904809533*G0_1_1_3_5 - 0.0225831311545635*G0_1_1_3_6 - 0.0354160125588758*G0_1_1_3_7 + 0.0897388325959906*G0_1_1_3_8 + 0.0332924218638562*G0_1_1_3_9 - 0.00675388103959652*G0_1_1_4_0 - 0.00245595674167147*G0_1_1_4_1 - 0.10880548023407*G0_1_1_4_3 - 0.0879120879121032*G0_1_1_4_4 + 0.00899671756814773*G0_1_1_4_5 + 0.0135864135864157*G0_1_1_4_6 + 0.0190438133295309*G0_1_1_4_7 - 0.0543228200371149*G0_1_1_4_8 - 0.0435678607107254*G0_1_1_4_9 - 0.00344798059083826*G0_1_1_5_0 - 0.00207284778713387*G0_1_1_5_1 - 0.000142080142080216*G0_1_1_5_2 - 0.00333380904809533*G0_1_1_5_3 + 0.00899671756814773*G0_1_1_5_4 + 0.0213729128014877*G0_1_1_5_5 - 0.0150706436420747*G0_1_1_5_6 + 0.0097502497502514*G0_1_1_5_7 - 0.00504638218924026*G0_1_1_5_8 + 0.00561723990295515*G0_1_1_5_9 + 0.00339470053755823*G0_1_1_6_0 + 0.00377273520130727*G0_1_1_6_1 - 0.00222000222000248*G0_1_1_6_2 - 0.0225831311545635*G0_1_1_6_3 + 0.0135864135864157*G0_1_1_6_4 - 0.0150706436420747*G0_1_1_6_5 + 0.0479520479520557*G0_1_1_6_6 - 0.00470386756101119*G0_1_1_6_7 - 0.0215555872698765*G0_1_1_6_8 + 0.0195918367346971*G0_1_1_6_9 - 0.0278959136102039*G0_1_1_7_0 - 0.0347081489938692*G0_1_1_7_1 - 0.00218701932987684*G0_1_1_7_2 - 0.0354160125588758*G0_1_1_7_3 + 0.0190438133295309*G0_1_1_7_4 + 0.0097502497502514*G0_1_1_7_5 - 0.00470386756101119*G0_1_1_7_6 + 0.114217211360088*G0_1_1_7_7 - 0.0190209790209825*G0_1_1_7_8 + 0.00493221064649713*G0_1_1_7_9 + 0.0163341420484306*G0_1_1_8_0 + 0.0576490176490275*G0_1_1_8_1 + 0.014352631495491*G0_1_1_8_2 + 0.0897388325959906*G0_1_1_8_3 - 0.0543228200371149*G0_1_1_8_4 - 0.00504638218924026*G0_1_1_8_5 - 0.0215555872698765*G0_1_1_8_6 - 0.0190209790209825*G0_1_1_8_7 + 0.556335093478045*G0_1_1_8_8 + 0.0711060368203347*G0_1_1_8_9 + 0.00149184149184175*G0_1_1_9_0 + 0.0125132010846318*G0_1_1_9_1 + 0.00852480852480996*G0_1_1_9_2 + 0.0332924218638563*G0_1_1_9_3 - 0.0435678607107254*G0_1_1_9_4 + 0.00561723990295516*G0_1_1_9_5 + 0.0195918367346971*G0_1_1_9_6 + 0.00493221064649714*G0_1_1_9_7 + 0.0711060368203347*G0_1_1_9_8 - 0.0082203510774956*G0_1_1_9_9; + A[59] = -A[179] - 0.00875258780020847*G0_0_0_0_0 + 0.000669806384092208*G0_0_0_0_1 + 0.0056220322886999*G0_0_0_0_2 - 0.00675388103959652*G0_0_0_0_3 + 0.00805036233607802*G0_0_0_0_4 - 0.0278959136102041*G0_0_0_0_5 + 0.0163341420484307*G0_0_0_0_6 - 0.00344798059083831*G0_0_0_0_7 + 0.00339470053755825*G0_0_0_0_8 + 0.00149184149184176*G0_0_0_0_9 + 0.000669806384092208*G0_0_0_1_0 - 0.0160234826901522*G0_0_0_1_1 + 0.00103712865617646*G0_0_0_1_2 + 0.0196780996781031*G0_0_0_1_4 - 0.00218701932987685*G0_0_0_1_5 + 0.0143526314954911*G0_0_0_1_6 - 0.000142080142080121*G0_0_0_1_7 - 0.00222000222000267*G0_0_0_1_8 + 0.00852480852480993*G0_0_0_1_9 + 0.0056220322886999*G0_0_0_2_0 + 0.00103712865617646*G0_0_0_2_1 + 0.0339334739334794*G0_0_0_2_2 - 0.00245595674167142*G0_0_0_2_3 + 0.0293750693750744*G0_0_0_2_4 - 0.0347081489938691*G0_0_0_2_5 + 0.0576490176490273*G0_0_0_2_6 - 0.00207284778713383*G0_0_0_2_7 + 0.00377273520130725*G0_0_0_2_8 + 0.0125132010846318*G0_0_0_2_9 - 0.00675388103959652*G0_0_0_3_0 - 0.00245595674167142*G0_0_0_3_2 - 0.0879120879121031*G0_0_0_3_3 - 0.10880548023407*G0_0_0_3_4 + 0.0190438133295309*G0_0_0_3_5 - 0.0543228200371146*G0_0_0_3_6 + 0.00899671756814772*G0_0_0_3_7 + 0.0135864135864157*G0_0_0_3_8 - 0.0435678607107252*G0_0_0_3_9 + 0.00805036233607802*G0_0_0_4_0 + 0.0196780996781031*G0_0_0_4_1 + 0.0293750693750744*G0_0_0_4_2 - 0.10880548023407*G0_0_0_4_3 + 0.209801626944519*G0_0_0_4_4 - 0.0354160125588757*G0_0_0_4_5 + 0.0897388325959904*G0_0_0_4_6 - 0.00333380904809533*G0_0_0_4_7 - 0.0225831311545634*G0_0_0_4_8 + 0.0332924218638559*G0_0_0_4_9 - 0.0278959136102041*G0_0_0_5_0 - 0.00218701932987685*G0_0_0_5_1 - 0.0347081489938691*G0_0_0_5_2 + 0.0190438133295309*G0_0_0_5_3 - 0.0354160125588757*G0_0_0_5_4 + 0.114217211360088*G0_0_0_5_5 - 0.0190209790209823*G0_0_0_5_6 + 0.00975024975025138*G0_0_0_5_7 - 0.00470386756101118*G0_0_0_5_8 + 0.00493221064649712*G0_0_0_5_9 + 0.0163341420484307*G0_0_0_6_0 + 0.0143526314954911*G0_0_0_6_1 + 0.0576490176490273*G0_0_0_6_2 - 0.0543228200371146*G0_0_0_6_3 + 0.0897388325959904*G0_0_0_6_4 - 0.0190209790209823*G0_0_0_6_5 + 0.556335093478044*G0_0_0_6_6 - 0.00504638218924015*G0_0_0_6_7 - 0.0215555872698764*G0_0_0_6_8 + 0.071106036820334*G0_0_0_6_9 - 0.00344798059083831*G0_0_0_7_0 - 0.000142080142080121*G0_0_0_7_1 - 0.00207284778713384*G0_0_0_7_2 + 0.00899671756814772*G0_0_0_7_3 - 0.00333380904809533*G0_0_0_7_4 + 0.00975024975025138*G0_0_0_7_5 - 0.00504638218924015*G0_0_0_7_6 + 0.0213729128014879*G0_0_0_7_7 - 0.0150706436420747*G0_0_0_7_8 + 0.00561723990295515*G0_0_0_7_9 + 0.00339470053755825*G0_0_0_8_0 - 0.00222000222000266*G0_0_0_8_1 + 0.00377273520130725*G0_0_0_8_2 + 0.0135864135864157*G0_0_0_8_3 - 0.0225831311545634*G0_0_0_8_4 - 0.00470386756101118*G0_0_0_8_5 - 0.0215555872698764*G0_0_0_8_6 - 0.0150706436420747*G0_0_0_8_7 + 0.0479520479520557*G0_0_0_8_8 + 0.0195918367346971*G0_0_0_8_9 + 0.00149184149184176*G0_0_0_9_0 + 0.00852480852480993*G0_0_0_9_1 + 0.0125132010846318*G0_0_0_9_2 - 0.0435678607107252*G0_0_0_9_3 + 0.0332924218638559*G0_0_0_9_4 + 0.00493221064649712*G0_0_0_9_5 + 0.071106036820334*G0_0_0_9_6 + 0.00561723990295515*G0_0_0_9_7 + 0.0195918367346971*G0_0_0_9_8 - 0.00822035107749555*G0_0_0_9_9 - 0.00153018057780002*G0_0_1_0_0 + 0.000795254128587606*G0_0_1_0_1 + 0.00150650055411986*G0_0_1_0_2 + 0.00654329797187048*G0_0_1_0_3 + 0.00274519131662039*G0_0_1_0_4 + 0.000900686614972437*G0_0_1_0_5 - 0.00219716791145394*G0_0_1_0_6 + 0.00902970045827336*G0_0_1_0_7 + 0.00629719486862451*G0_0_1_0_8 + 0.0311155511155564*G0_0_1_0_9 + 0.000795254128587606*G0_0_1_1_0 - 0.000440053773387167*G0_0_1_1_2 - 0.00390720390720451*G0_0_1_1_3 + 0.0178310578310609*G0_0_1_1_4 - 0.00321456321456378*G0_0_1_1_5 + 0.00285936285936335*G0_0_1_1_6 + 0.00433344433344501*G0_0_1_1_7 + 0.00390720390720469*G0_0_1_1_8 - 0.0221645021645059*G0_0_1_1_9 + 0.00150650055411986*G0_0_1_2_0 - 0.000440053773387166*G0_0_1_2_1 - 0.0120373453706807*G0_0_1_2_2 + 0.00970711827854845*G0_0_1_2_3 + 0.0161387818530704*G0_0_1_2_4 - 0.0015273615273618*G0_0_1_2_5 - 0.00651285222713896*G0_0_1_2_6 - 0.00602318316604132*G0_0_1_2_7 + 0.00302681445538638*G0_0_1_2_8 + 0.0166842681128423*G0_0_1_2_9 + 0.00654329797187048*G0_0_1_3_0 - 0.00390720390720451*G0_0_1_3_1 + 0.00970711827854845*G0_0_1_3_2 + 0.0559440559440654*G0_0_1_3_3 - 0.127712287712309*G0_0_1_3_4 + 0.00141572713001315*G0_0_1_3_5 - 0.0213957471100365*G0_0_1_3_6 - 0.0324475524475579*G0_0_1_3_7 + 0.0543456543456635*G0_0_1_3_8 + 0.131388611388633*G0_0_1_3_9 + 0.00274519131662039*G0_0_1_4_0 + 0.0178310578310609*G0_0_1_4_1 + 0.0161387818530704*G0_0_1_4_2 - 0.127712287712309*G0_0_1_4_3 + 0.222954188668512*G0_0_1_4_4 - 0.0210532324818075*G0_0_1_4_5 + 0.042448979591844*G0_0_1_4_6 + 0.0113258170401047*G0_0_1_4_7 - 0.0218981018981056*G0_0_1_4_8 - 0.00794633937491209*G0_0_1_4_9 + 0.000900686614972436*G0_0_1_5_0 - 0.00321456321456378*G0_0_1_5_1 - 0.00152736152736181*G0_0_1_5_2 + 0.00141572713001315*G0_0_1_5_3 - 0.0210532324818075*G0_0_1_5_4 + 0.01237619523334*G0_0_1_5_5 + 0.00730697873555128*G0_0_1_5_6 - 0.00207792207792249*G0_0_1_5_7 - 0.00317396888825506*G0_0_1_5_8 - 0.0869987155701589*G0_0_1_5_9 - 0.00219716791145394*G0_0_1_6_0 + 0.00285936285936335*G0_0_1_6_1 - 0.00651285222713896*G0_0_1_6_2 - 0.0213957471100365*G0_0_1_6_3 + 0.042448979591844*G0_0_1_6_4 + 0.00730697873555128*G0_0_1_6_5 + 0.00223776223776261*G0_0_1_6_6 + 0.00525189096617756*G0_0_1_6_7 - 0.00242043670615142*G0_0_1_6_8 - 0.00726131011845419*G0_0_1_6_9 + 0.00902970045827336*G0_0_1_7_0 + 0.00433344433344501*G0_0_1_7_1 - 0.00602318316604132*G0_0_1_7_2 - 0.0324475524475579*G0_0_1_7_3 + 0.0113258170401047*G0_0_1_7_4 - 0.00207792207792249*G0_0_1_7_5 + 0.00525189096617756*G0_0_1_7_6 + 0.0503268160411102*G0_0_1_7_7 - 0.0596203796203897*G0_0_1_7_8 - 0.103850435279024*G0_0_1_7_9 + 0.00629719486862451*G0_0_1_8_0 + 0.00390720390720469*G0_0_1_8_1 + 0.00302681445538638*G0_0_1_8_2 + 0.0543456543456635*G0_0_1_8_3 - 0.0218981018981056*G0_0_1_8_4 - 0.00317396888825506*G0_0_1_8_5 - 0.00242043670615142*G0_0_1_8_6 - 0.0596203796203897*G0_0_1_8_7 - 0.164635364635393*G0_0_1_8_8 + 0.110289710289729*G0_0_1_8_9 + 0.0311155511155564*G0_0_1_9_0 - 0.0221645021645059*G0_0_1_9_1 + 0.0166842681128423*G0_0_1_9_2 + 0.131388611388633*G0_0_1_9_3 - 0.0079463393749121*G0_0_1_9_4 - 0.0869987155701589*G0_0_1_9_5 - 0.0072613101184542*G0_0_1_9_6 - 0.103850435279024*G0_0_1_9_7 + 0.110289710289729*G0_0_1_9_8 - 0.0723390894819591*G0_0_1_9_9; + A[224] = A[208] - 0.00359936359936415*G0_0_0_0_0 - 0.00384292955721592*G0_0_0_0_1 + 0.00921491207205653*G0_0_0_0_2 - 0.0527320298748961*G0_0_0_0_3 + 0.0554112554112651*G0_0_0_0_4 - 0.0267922553636885*G0_0_0_0_5 + 0.0371438085723866*G0_0_0_0_6 + 0.0174149659863975*G0_0_0_0_7 - 0.0147357404500287*G0_0_0_0_8 + 0.0219209362066542*G0_0_0_0_9 - 0.00384292955721592*G0_0_0_1_0 - 0.0706070648927911*G0_0_0_1_1 - 0.00169143026285902*G0_0_0_1_2 - 0.17695066837927*G0_0_0_1_3 + 0.101445221445239*G0_0_0_1_4 - 0.00925550639836515*G0_0_0_1_5 + 0.0488349745492687*G0_0_0_1_6 + 0.0193634936492113*G0_0_0_1_7 - 0.0369002426145346*G0_0_0_1_8 - 0.00584558298844118*G0_0_0_1_9 + 0.00921491207205653*G0_0_0_2_0 - 0.00169143026285902*G0_0_0_2_1 + 0.0848692048692195*G0_0_0_2_2 - 0.111431425717159*G0_0_0_2_3 + 0.140659340659365*G0_0_0_2_4 - 0.063692497978223*G0_0_0_2_5 + 0.116789876789897*G0_0_0_2_6 - 0.00487131915703426*G0_0_0_2_7 - 0.0187545787545819*G0_0_0_2_8 - 0.0328814043099813*G0_0_0_2_9 - 0.0527320298748961*G0_0_0_3_0 - 0.17695066837927*G0_0_0_3_1 - 0.111431425717159*G0_0_0_3_2 - 1.33498501498524*G0_0_0_3_3 + 0.0887797916369487*G0_0_0_3_4 + 0.0887797916369493*G0_0_0_3_5 - 0.138101898101921*G0_0_0_3_6 + 0.166599115170572*G0_0_0_3_7 - 0.231265876980202*G0_0_0_3_8 - 0.315661481375821*G0_0_0_3_9 + 0.0554112554112651*G0_0_0_4_0 + 0.101445221445239*G0_0_0_4_1 + 0.140659340659365*G0_0_0_4_2 + 0.0887797916369486*G0_0_0_4_3 + 1.31525617239926*G0_0_0_4_4 - 0.15783074068791*G0_0_0_4_5 + 0.295932638789832*G0_0_0_4_6 - 0.0800114171542878*G0_0_0_4_7 + 0.0646667618096298*G0_0_0_4_8 + 0.414305694305764*G0_0_0_4_9 - 0.0267922553636885*G0_0_0_5_0 - 0.00925550639836515*G0_0_0_5_1 - 0.063692497978223*G0_0_0_5_2 + 0.0887797916369493*G0_0_0_5_3 - 0.15783074068791*G0_0_0_5_4 - 0.162214927929241*G0_0_0_5_5 - 0.106316540602273*G0_0_0_5_6 - 0.0591865277579662*G0_0_0_5_7 + 0.0361695447409794*G0_0_0_5_8 - 0.138101898101921*G0_0_0_5_9 + 0.0371438085723866*G0_0_0_6_0 + 0.0488349745492687*G0_0_0_6_1 + 0.116789876789897*G0_0_0_6_2 - 0.138101898101921*G0_0_0_6_3 + 0.295932638789832*G0_0_0_6_4 - 0.106316540602273*G0_0_0_6_5 + 1.19249892964199*G0_0_0_6_6 + 0.023016983016987*G0_0_0_6_7 - 0.0493221064649718*G0_0_0_6_8 + 0.374848009133786*G0_0_0_6_9 + 0.0174149659863975*G0_0_0_7_0 + 0.0193634936492113*G0_0_0_7_1 - 0.00487131915703426*G0_0_0_7_2 + 0.166599115170572*G0_0_0_7_3 - 0.0800114171542878*G0_0_0_7_4 - 0.0591865277579662*G0_0_0_7_5 + 0.023016983016987*G0_0_0_7_6 - 0.118373055515932*G0_0_0_7_7 + 0.0591865277579663*G0_0_0_7_8 - 0.111796774653936*G0_0_0_7_9 - 0.0147357404500287*G0_0_0_8_0 - 0.0369002426145346*G0_0_0_8_1 - 0.0187545787545819*G0_0_0_8_2 - 0.231265876980202*G0_0_0_8_3 + 0.0646667618096298*G0_0_0_8_4 + 0.0361695447409794*G0_0_0_8_5 - 0.0493221064649718*G0_0_0_8_6 + 0.0591865277579663*G0_0_0_8_7 - 0.118373055515933*G0_0_0_8_8 - 0.111796774653936*G0_0_0_8_9 + 0.0219209362066542*G0_0_0_9_0 - 0.00584558298844118*G0_0_0_9_1 - 0.0328814043099813*G0_0_0_9_2 - 0.315661481375821*G0_0_0_9_3 + 0.414305694305764*G0_0_0_9_4 - 0.138101898101921*G0_0_0_9_5 + 0.374848009133786*G0_0_0_9_6 - 0.111796774653936*G0_0_0_9_7 - 0.111796774653936*G0_0_0_9_8 - 1.02589981447142*G0_0_0_9_9 - 0.00107574964717838*G0_0_1_0_1 + 0.00107574964717844*G0_0_1_0_2 - 0.0471300128443068*G0_0_1_0_3 + 0.0471300128443068*G0_0_1_0_4 - 0.010168878740309*G0_0_1_0_5 + 0.00207031064173962*G0_0_1_0_6 + 0.0101688787403091*G0_0_1_0_7 - 0.00207031064173965*G0_0_1_0_8 - 0.00107574964717839*G0_0_1_1_0 - 0.0442342842342917*G0_0_1_1_1 - 0.131647400218851*G0_0_1_1_3 + 0.0893887065315791*G0_0_1_1_4 + 0.00109604681033266*G0_0_1_1_5 + 0.0120565149136599*G0_0_1_1_6 + 0.00937728937729099*G0_0_1_1_7 - 0.00176585319442496*G0_0_1_1_8 + 0.0274011702583177*G0_0_1_1_9 + 0.00107574964717844*G0_0_1_2_0 + 0.0442342842342922*G0_0_1_2_2 - 0.089388706531579*G0_0_1_2_3 + 0.131647400218852*G0_0_1_2_4 - 0.00937728937729105*G0_0_1_2_5 + 0.00176585319442517*G0_0_1_2_6 - 0.00109604681033271*G0_0_1_2_7 - 0.0120565149136598*G0_0_1_2_8 - 0.0274011702583176*G0_0_1_2_9 - 0.0471300128443068*G0_0_1_3_0 - 0.131647400218851*G0_0_1_3_1 - 0.089388706531579*G0_0_1_3_2 - 1.32512059369225*G0_0_1_3_3 + 0.0690509490509607*G0_0_1_3_5 - 0.0361695447409795*G0_0_1_3_6 + 0.14139003853292*G0_0_1_3_7 - 0.177559583273899*G0_0_1_3_8 - 0.364983587840793*G0_0_1_3_9 + 0.0471300128443068*G0_0_1_4_0 + 0.0893887065315791*G0_0_1_4_1 + 0.131647400218852*G0_0_1_4_2 + 1.32512059369225*G0_0_1_4_4 - 0.14139003853292*G0_0_1_4_5 + 0.1775595832739*G0_0_1_4_6 - 0.0690509490509607*G0_0_1_4_7 + 0.0361695447409794*G0_0_1_4_8 + 0.364983587840792*G0_0_1_4_9 - 0.010168878740309*G0_0_1_5_0 + 0.00109604681033266*G0_0_1_5_1 - 0.00937728937729105*G0_0_1_5_2 + 0.0690509490509607*G0_0_1_5_3 - 0.14139003853292*G0_0_1_5_4 + 0.0394576851719774*G0_0_1_5_5 + 0.0147966319394912*G0_0_1_5_6 - 0.00328814043099813*G0_0_1_5_8 + 0.00657628086199593*G0_0_1_5_9 + 0.00207031064173962*G0_0_1_6_0 + 0.0120565149136599*G0_0_1_6_1 + 0.00176585319442517*G0_0_1_6_2 - 0.0361695447409795*G0_0_1_6_3 + 0.1775595832739*G0_0_1_6_4 + 0.0147966319394912*G0_0_1_6_5 + 0.0690509490509603*G0_0_1_6_6 + 0.00328814043099803*G0_0_1_6_7 + 0.154542600256912*G0_0_1_6_9 + 0.0101688787403091*G0_0_1_7_0 + 0.00937728937729099*G0_0_1_7_1 - 0.00109604681033271*G0_0_1_7_2 + 0.14139003853292*G0_0_1_7_3 - 0.0690509490509607*G0_0_1_7_4 + 0.00328814043099803*G0_0_1_7_6 - 0.0394576851719769*G0_0_1_7_7 - 0.0147966319394916*G0_0_1_7_8 - 0.00657628086199628*G0_0_1_7_9 - 0.00207031064173965*G0_0_1_8_0 - 0.00176585319442496*G0_0_1_8_1 - 0.0120565149136598*G0_0_1_8_2 - 0.177559583273899*G0_0_1_8_3 + 0.0361695447409794*G0_0_1_8_4 - 0.00328814043099813*G0_0_1_8_5 - 0.0147966319394916*G0_0_1_8_7 - 0.0690509490509605*G0_0_1_8_8 - 0.154542600256912*G0_0_1_8_9 + 0.0274011702583177*G0_0_1_9_1 - 0.0274011702583176*G0_0_1_9_2 - 0.364983587840793*G0_0_1_9_3 + 0.364983587840792*G0_0_1_9_4 + 0.00657628086199592*G0_0_1_9_5 + 0.154542600256912*G0_0_1_9_6 - 0.00657628086199628*G0_0_1_9_7 - 0.154542600256912*G0_0_1_9_8 - 0.00107574964717838*G0_1_0_0_1 + 0.00107574964717844*G0_1_0_0_2 - 0.0471300128443068*G0_1_0_0_3 + 0.0471300128443068*G0_1_0_0_4 - 0.010168878740309*G0_1_0_0_5 + 0.00207031064173962*G0_1_0_0_6 + 0.0101688787403091*G0_1_0_0_7 - 0.00207031064173965*G0_1_0_0_8 - 0.00107574964717838*G0_1_0_1_0 - 0.0442342842342917*G0_1_0_1_1 - 0.131647400218851*G0_1_0_1_3 + 0.0893887065315791*G0_1_0_1_4 + 0.00109604681033266*G0_1_0_1_5 + 0.0120565149136599*G0_1_0_1_6 + 0.00937728937729099*G0_1_0_1_7 - 0.00176585319442495*G0_1_0_1_8 + 0.0274011702583177*G0_1_0_1_9 + 0.00107574964717844*G0_1_0_2_0 + 0.0442342842342922*G0_1_0_2_2 - 0.089388706531579*G0_1_0_2_3 + 0.131647400218852*G0_1_0_2_4 - 0.00937728937729105*G0_1_0_2_5 + 0.00176585319442517*G0_1_0_2_6 - 0.00109604681033271*G0_1_0_2_7 - 0.0120565149136598*G0_1_0_2_8 - 0.0274011702583176*G0_1_0_2_9 - 0.0471300128443068*G0_1_0_3_0 - 0.131647400218851*G0_1_0_3_1 - 0.089388706531579*G0_1_0_3_2 - 1.32512059369225*G0_1_0_3_3 + 0.0690509490509607*G0_1_0_3_5 - 0.0361695447409795*G0_1_0_3_6 + 0.14139003853292*G0_1_0_3_7 - 0.177559583273899*G0_1_0_3_8 - 0.364983587840793*G0_1_0_3_9 + 0.0471300128443068*G0_1_0_4_0 + 0.0893887065315791*G0_1_0_4_1 + 0.131647400218852*G0_1_0_4_2 + 1.32512059369225*G0_1_0_4_4 - 0.14139003853292*G0_1_0_4_5 + 0.1775595832739*G0_1_0_4_6 - 0.0690509490509607*G0_1_0_4_7 + 0.0361695447409794*G0_1_0_4_8 + 0.364983587840792*G0_1_0_4_9 - 0.010168878740309*G0_1_0_5_0 + 0.00109604681033266*G0_1_0_5_1 - 0.00937728937729105*G0_1_0_5_2 + 0.0690509490509607*G0_1_0_5_3 - 0.14139003853292*G0_1_0_5_4 + 0.0394576851719774*G0_1_0_5_5 + 0.0147966319394912*G0_1_0_5_6 - 0.00328814043099813*G0_1_0_5_8 + 0.00657628086199592*G0_1_0_5_9 + 0.00207031064173962*G0_1_0_6_0 + 0.0120565149136599*G0_1_0_6_1 + 0.00176585319442517*G0_1_0_6_2 - 0.0361695447409795*G0_1_0_6_3 + 0.1775595832739*G0_1_0_6_4 + 0.0147966319394912*G0_1_0_6_5 + 0.0690509490509603*G0_1_0_6_6 + 0.00328814043099804*G0_1_0_6_7 + 0.154542600256912*G0_1_0_6_9 + 0.0101688787403091*G0_1_0_7_0 + 0.00937728937729099*G0_1_0_7_1 - 0.00109604681033271*G0_1_0_7_2 + 0.14139003853292*G0_1_0_7_3 - 0.0690509490509607*G0_1_0_7_4 + 0.00328814043099804*G0_1_0_7_6 - 0.0394576851719769*G0_1_0_7_7 - 0.0147966319394916*G0_1_0_7_8 - 0.00657628086199629*G0_1_0_7_9 - 0.00207031064173965*G0_1_0_8_0 - 0.00176585319442495*G0_1_0_8_1 - 0.0120565149136598*G0_1_0_8_2 - 0.177559583273899*G0_1_0_8_3 + 0.0361695447409794*G0_1_0_8_4 - 0.00328814043099813*G0_1_0_8_5 - 0.0147966319394916*G0_1_0_8_7 - 0.0690509490509605*G0_1_0_8_8 - 0.154542600256912*G0_1_0_8_9 + 0.0274011702583177*G0_1_0_9_1 - 0.0274011702583176*G0_1_0_9_2 - 0.364983587840793*G0_1_0_9_3 + 0.364983587840792*G0_1_0_9_4 + 0.00657628086199592*G0_1_0_9_5 + 0.154542600256912*G0_1_0_9_6 - 0.00657628086199629*G0_1_0_9_7 - 0.154542600256912*G0_1_0_9_8 + 0.00359936359936441*G0_1_1_0_0 - 0.00921491207205646*G0_1_1_0_1 + 0.00384292955721598*G0_1_1_0_2 - 0.055411255411265*G0_1_1_0_3 + 0.0527320298748962*G0_1_1_0_4 - 0.0174149659863974*G0_1_1_0_5 + 0.0147357404500287*G0_1_1_0_6 + 0.0267922553636887*G0_1_1_0_7 - 0.0371438085723865*G0_1_1_0_8 - 0.0219209362066541*G0_1_1_0_9 - 0.00921491207205646*G0_1_1_1_0 - 0.0848692048692191*G0_1_1_1_1 + 0.00169143026285921*G0_1_1_1_2 - 0.140659340659365*G0_1_1_1_3 + 0.111431425717159*G0_1_1_1_4 + 0.00487131915703424*G0_1_1_1_5 + 0.0187545787545819*G0_1_1_1_6 + 0.0636924979782231*G0_1_1_1_7 - 0.116789876789896*G0_1_1_1_8 + 0.0328814043099813*G0_1_1_1_9 + 0.00384292955721598*G0_1_1_2_0 + 0.00169143026285921*G0_1_1_2_1 + 0.0706070648927914*G0_1_1_2_2 - 0.101445221445239*G0_1_1_2_3 + 0.17695066837927*G0_1_1_2_4 - 0.0193634936492113*G0_1_1_2_5 + 0.0369002426145347*G0_1_1_2_6 + 0.00925550639836507*G0_1_1_2_7 - 0.0488349745492684*G0_1_1_2_8 + 0.00584558298844117*G0_1_1_2_9 - 0.055411255411265*G0_1_1_3_0 - 0.140659340659365*G0_1_1_3_1 - 0.101445221445239*G0_1_1_3_2 - 1.31525617239925*G0_1_1_3_3 - 0.0887797916369504*G0_1_1_3_4 + 0.0800114171542877*G0_1_1_3_5 - 0.06466676180963*G0_1_1_3_6 + 0.15783074068791*G0_1_1_3_7 - 0.295932638789831*G0_1_1_3_8 - 0.414305694305764*G0_1_1_3_9 + 0.0527320298748962*G0_1_1_4_0 + 0.111431425717159*G0_1_1_4_1 + 0.17695066837927*G0_1_1_4_2 - 0.0887797916369504*G0_1_1_4_3 + 1.33498501498524*G0_1_1_4_4 - 0.166599115170572*G0_1_1_4_5 + 0.231265876980202*G0_1_1_4_6 - 0.0887797916369494*G0_1_1_4_7 + 0.138101898101921*G0_1_1_4_8 + 0.31566148137582*G0_1_1_4_9 - 0.0174149659863974*G0_1_1_5_0 + 0.00487131915703425*G0_1_1_5_1 - 0.0193634936492113*G0_1_1_5_2 + 0.0800114171542877*G0_1_1_5_3 - 0.166599115170572*G0_1_1_5_4 + 0.118373055515933*G0_1_1_5_5 - 0.0591865277579665*G0_1_1_5_6 + 0.0591865277579664*G0_1_1_5_7 - 0.0230169830169869*G0_1_1_5_8 + 0.111796774653936*G0_1_1_5_9 + 0.0147357404500287*G0_1_1_6_0 + 0.0187545787545819*G0_1_1_6_1 + 0.0369002426145347*G0_1_1_6_2 - 0.06466676180963*G0_1_1_6_3 + 0.231265876980202*G0_1_1_6_4 - 0.0591865277579665*G0_1_1_6_5 + 0.118373055515933*G0_1_1_6_6 - 0.0361695447409794*G0_1_1_6_7 + 0.0493221064649718*G0_1_1_6_8 + 0.111796774653936*G0_1_1_6_9 + 0.0267922553636887*G0_1_1_7_0 + 0.0636924979782231*G0_1_1_7_1 + 0.00925550639836507*G0_1_1_7_2 + 0.15783074068791*G0_1_1_7_3 - 0.0887797916369494*G0_1_1_7_4 + 0.0591865277579664*G0_1_1_7_5 - 0.0361695447409794*G0_1_1_7_6 + 0.162214927929242*G0_1_1_7_7 + 0.106316540602272*G0_1_1_7_8 + 0.138101898101921*G0_1_1_7_9 - 0.0371438085723865*G0_1_1_8_0 - 0.116789876789896*G0_1_1_8_1 - 0.0488349745492684*G0_1_1_8_2 - 0.295932638789831*G0_1_1_8_3 + 0.138101898101921*G0_1_1_8_4 - 0.0230169830169869*G0_1_1_8_5 + 0.0493221064649718*G0_1_1_8_6 + 0.106316540602272*G0_1_1_8_7 - 1.19249892964199*G0_1_1_8_8 - 0.374848009133787*G0_1_1_8_9 - 0.0219209362066541*G0_1_1_9_0 + 0.0328814043099813*G0_1_1_9_1 + 0.00584558298844117*G0_1_1_9_2 - 0.414305694305764*G0_1_1_9_3 + 0.31566148137582*G0_1_1_9_4 + 0.111796774653936*G0_1_1_9_5 + 0.111796774653936*G0_1_1_9_6 + 0.138101898101921*G0_1_1_9_7 - 0.374848009133787*G0_1_1_9_8 + 1.02589981447141*G0_1_1_9_9; + A[209] = A[223] - 0.00416768416768484*G0_0_1_0_0 - 0.00245595674167144*G0_0_1_0_1 - 0.00245595674167141*G0_0_1_0_2 - 0.0113258170401047*G0_0_1_0_3 - 0.0113258170401047*G0_0_1_0_4 - 0.00468864468864544*G0_0_1_0_5 - 0.000487131915703448*G0_0_1_0_6 - 0.00468864468864546*G0_0_1_0_7 - 0.000487131915703448*G0_0_1_0_8 - 0.0416497787926429*G0_0_1_0_9 - 0.00245595674167144*G0_0_1_1_0 - 0.00568320568320659*G0_0_1_1_1 - 0.00363995792567281*G0_0_1_1_2 - 0.00340992340992397*G0_0_1_1_3 + 0.00462775319918256*G0_0_1_1_4 + 0.00401883830455327*G0_0_1_1_5 - 0.00365348936777567*G0_0_1_1_6 + 0.00633271490414453*G0_0_1_1_7 - 0.0106560106560124*G0_0_1_1_8 + 0.0120565149136598*G0_0_1_1_9 - 0.00245595674167141*G0_0_1_2_0 - 0.00363995792567281*G0_0_1_2_1 - 0.00568320568320643*G0_0_1_2_2 + 0.00462775319918253*G0_0_1_2_3 - 0.00340992340992382*G0_0_1_2_4 + 0.00633271490414444*G0_0_1_2_5 - 0.0106560106560123*G0_0_1_2_6 + 0.00401883830455326*G0_0_1_2_7 - 0.00365348936777567*G0_0_1_2_8 + 0.0120565149136599*G0_0_1_2_9 - 0.0113258170401047*G0_0_1_3_0 - 0.00340992340992397*G0_0_1_3_1 + 0.00462775319918252*G0_0_1_3_2 - 0.221401455687208*G0_0_1_3_3 + 0.025209076637652*G0_0_1_3_4 + 0.00657628086199627*G0_0_1_3_5 + 0.0197288425859886*G0_0_1_3_6 + 0.0427458256029757*G0_0_1_3_7 - 0.0624746681889643*G0_0_1_3_8 - 0.121661195946931*G0_0_1_3_9 - 0.0113258170401047*G0_0_1_4_0 + 0.00462775319918256*G0_0_1_4_1 - 0.00340992340992382*G0_0_1_4_2 + 0.025209076637652*G0_0_1_4_3 - 0.221401455687207*G0_0_1_4_4 + 0.0427458256029757*G0_0_1_4_5 - 0.0624746681889643*G0_0_1_4_6 + 0.00657628086199628*G0_0_1_4_7 + 0.0197288425859887*G0_0_1_4_8 - 0.121661195946931*G0_0_1_4_9 - 0.00468864468864544*G0_0_1_5_0 + 0.00401883830455327*G0_0_1_5_1 + 0.00633271490414444*G0_0_1_5_2 + 0.00657628086199626*G0_0_1_5_3 + 0.0427458256029757*G0_0_1_5_4 - 0.0372655915513118*G0_0_1_5_5 + 0.0137005851291588*G0_0_1_5_6 + 0.00657628086199633*G0_0_1_5_7 - 0.00328814043099816*G0_0_1_5_8 + 0.131525617239925*G0_0_1_5_9 - 0.000487131915703451*G0_0_1_6_0 - 0.00365348936777567*G0_0_1_6_1 - 0.0106560106560123*G0_0_1_6_2 + 0.0197288425859886*G0_0_1_6_3 - 0.0624746681889643*G0_0_1_6_4 + 0.0137005851291588*G0_0_1_6_5 - 0.0832995575852846*G0_0_1_6_6 - 0.00328814043099817*G0_0_1_6_7 + 0.00657628086199617*G0_0_1_6_8 - 0.0756272299129568*G0_0_1_6_9 - 0.00468864468864546*G0_0_1_7_0 + 0.00633271490414453*G0_0_1_7_1 + 0.00401883830455326*G0_0_1_7_2 + 0.0427458256029757*G0_0_1_7_3 + 0.00657628086199628*G0_0_1_7_4 + 0.00657628086199633*G0_0_1_7_5 - 0.00328814043099817*G0_0_1_7_6 - 0.0372655915513117*G0_0_1_7_7 + 0.0137005851291589*G0_0_1_7_8 + 0.131525617239925*G0_0_1_7_9 - 0.000487131915703446*G0_0_1_8_0 - 0.0106560106560124*G0_0_1_8_1 - 0.00365348936777567*G0_0_1_8_2 - 0.0624746681889643*G0_0_1_8_3 + 0.0197288425859887*G0_0_1_8_4 - 0.00328814043099816*G0_0_1_8_5 + 0.00657628086199617*G0_0_1_8_6 + 0.0137005851291589*G0_0_1_8_7 - 0.0832995575852854*G0_0_1_8_8 - 0.0756272299129568*G0_0_1_8_9 - 0.0416497787926429*G0_0_1_9_0 + 0.0120565149136598*G0_0_1_9_1 + 0.0120565149136599*G0_0_1_9_2 - 0.121661195946931*G0_0_1_9_3 - 0.121661195946931*G0_0_1_9_4 + 0.131525617239925*G0_0_1_9_5 - 0.0756272299129568*G0_0_1_9_6 + 0.131525617239925*G0_0_1_9_7 - 0.0756272299129568*G0_0_1_9_8 + 0.946984444127461*G0_0_1_9_9 + 0.00416768416768484*G0_1_0_0_0 + 0.00245595674167144*G0_1_0_0_1 + 0.00245595674167141*G0_1_0_0_2 + 0.0113258170401047*G0_1_0_0_3 + 0.0113258170401047*G0_1_0_0_4 + 0.00468864468864544*G0_1_0_0_5 + 0.000487131915703448*G0_1_0_0_6 + 0.00468864468864546*G0_1_0_0_7 + 0.000487131915703448*G0_1_0_0_8 + 0.0416497787926429*G0_1_0_0_9 + 0.00245595674167144*G0_1_0_1_0 + 0.00568320568320659*G0_1_0_1_1 + 0.00363995792567281*G0_1_0_1_2 + 0.00340992340992397*G0_1_0_1_3 - 0.00462775319918256*G0_1_0_1_4 - 0.00401883830455327*G0_1_0_1_5 + 0.00365348936777567*G0_1_0_1_6 - 0.00633271490414453*G0_1_0_1_7 + 0.0106560106560124*G0_1_0_1_8 - 0.0120565149136598*G0_1_0_1_9 + 0.00245595674167141*G0_1_0_2_0 + 0.00363995792567281*G0_1_0_2_1 + 0.00568320568320643*G0_1_0_2_2 - 0.00462775319918252*G0_1_0_2_3 + 0.00340992340992382*G0_1_0_2_4 - 0.00633271490414444*G0_1_0_2_5 + 0.0106560106560123*G0_1_0_2_6 - 0.00401883830455326*G0_1_0_2_7 + 0.00365348936777567*G0_1_0_2_8 - 0.0120565149136599*G0_1_0_2_9 + 0.0113258170401047*G0_1_0_3_0 + 0.00340992340992397*G0_1_0_3_1 - 0.00462775319918252*G0_1_0_3_2 + 0.221401455687208*G0_1_0_3_3 - 0.025209076637652*G0_1_0_3_4 - 0.00657628086199627*G0_1_0_3_5 - 0.0197288425859886*G0_1_0_3_6 - 0.0427458256029757*G0_1_0_3_7 + 0.0624746681889643*G0_1_0_3_8 + 0.121661195946931*G0_1_0_3_9 + 0.0113258170401047*G0_1_0_4_0 - 0.00462775319918256*G0_1_0_4_1 + 0.00340992340992382*G0_1_0_4_2 - 0.025209076637652*G0_1_0_4_3 + 0.221401455687207*G0_1_0_4_4 - 0.0427458256029757*G0_1_0_4_5 + 0.0624746681889643*G0_1_0_4_6 - 0.00657628086199628*G0_1_0_4_7 - 0.0197288425859887*G0_1_0_4_8 + 0.121661195946931*G0_1_0_4_9 + 0.00468864468864544*G0_1_0_5_0 - 0.00401883830455327*G0_1_0_5_1 - 0.00633271490414444*G0_1_0_5_2 - 0.00657628086199627*G0_1_0_5_3 - 0.0427458256029756*G0_1_0_5_4 + 0.0372655915513118*G0_1_0_5_5 - 0.0137005851291588*G0_1_0_5_6 - 0.00657628086199632*G0_1_0_5_7 + 0.00328814043099816*G0_1_0_5_8 - 0.131525617239925*G0_1_0_5_9 + 0.00048713191570345*G0_1_0_6_0 + 0.00365348936777567*G0_1_0_6_1 + 0.0106560106560123*G0_1_0_6_2 - 0.0197288425859886*G0_1_0_6_3 + 0.0624746681889643*G0_1_0_6_4 - 0.0137005851291588*G0_1_0_6_5 + 0.0832995575852846*G0_1_0_6_6 + 0.00328814043099817*G0_1_0_6_7 - 0.00657628086199617*G0_1_0_6_8 + 0.0756272299129568*G0_1_0_6_9 + 0.00468864468864546*G0_1_0_7_0 - 0.00633271490414453*G0_1_0_7_1 - 0.00401883830455326*G0_1_0_7_2 - 0.0427458256029757*G0_1_0_7_3 - 0.00657628086199628*G0_1_0_7_4 - 0.00657628086199633*G0_1_0_7_5 + 0.00328814043099817*G0_1_0_7_6 + 0.0372655915513117*G0_1_0_7_7 - 0.0137005851291589*G0_1_0_7_8 - 0.131525617239925*G0_1_0_7_9 + 0.000487131915703447*G0_1_0_8_0 + 0.0106560106560124*G0_1_0_8_1 + 0.00365348936777567*G0_1_0_8_2 + 0.0624746681889643*G0_1_0_8_3 - 0.0197288425859887*G0_1_0_8_4 + 0.00328814043099816*G0_1_0_8_5 - 0.00657628086199617*G0_1_0_8_6 - 0.0137005851291589*G0_1_0_8_7 + 0.0832995575852854*G0_1_0_8_8 + 0.0756272299129568*G0_1_0_8_9 + 0.0416497787926429*G0_1_0_9_0 - 0.0120565149136598*G0_1_0_9_1 - 0.0120565149136599*G0_1_0_9_2 + 0.121661195946931*G0_1_0_9_3 + 0.121661195946931*G0_1_0_9_4 - 0.131525617239925*G0_1_0_9_5 + 0.0756272299129568*G0_1_0_9_6 - 0.131525617239925*G0_1_0_9_7 + 0.0756272299129568*G0_1_0_9_8 - 0.946984444127461*G0_1_0_9_9; + A[140] = -A[143] + 0.0935558268891762*G0_0_1_0_0 + 0.00349900540376791*G0_0_1_0_1 + 0.00156598251836372*G0_0_1_0_2 - 0.00119922405636715*G0_0_1_0_3 + 0.00110704110704131*G0_0_1_0_4 + 0.0109934509934528*G0_0_1_0_5 - 0.00540538826253201*G0_0_1_0_6 + 0.0361061161061222*G0_0_1_0_7 - 0.0124738753310203*G0_0_1_0_8 - 0.000662194947909272*G0_0_1_0_9 + 0.00349900540376791*G0_0_1_1_0 - 0.0223759309473636*G0_0_1_1_1 + 0.000180419228038297*G0_0_1_1_2 + 0.0026826083968945*G0_0_1_1_3 + 0.00178319035461926*G0_0_1_1_4 - 0.000402560402560464*G0_0_1_1_5 + 0.000383954669669026*G0_0_1_1_6 + 0.00379091807663304*G0_0_1_1_7 + 0.00427424427424491*G0_0_1_1_8 + 0.00931386074243374*G0_0_1_1_9 + 0.00156598251836372*G0_0_1_2_0 + 0.000180419228038297*G0_0_1_2_1 + 0.00167536167536198*G0_0_1_2_3 + 0.000592000592000655*G0_0_1_2_4 - 0.000592000592000721*G0_0_1_2_6 - 0.000524343381486324*G0_0_1_2_7 - 0.00122205836491571*G0_0_1_2_8 - 0.00166944166944196*G0_0_1_2_9 - 0.00119922405636715*G0_0_1_3_0 + 0.0026826083968945*G0_0_1_3_1 + 0.00167536167536198*G0_0_1_3_2 + 0.0304533561676473*G0_0_1_3_3 - 0.018640407211839*G0_0_1_3_4 + 0.00414823271966199*G0_0_1_3_5 - 0.0046429760715483*G0_0_1_3_6 + 0.000106560106560122*G0_0_1_3_7 - 0.000281623138765998*G0_0_1_3_8 - 0.0281547024404214*G0_0_1_3_9 + 0.00110704110704131*G0_0_1_4_0 + 0.00178319035461926*G0_0_1_4_1 + 0.000592000592000655*G0_0_1_4_2 - 0.018640407211839*G0_0_1_4_3 - 0.0340992340992397*G0_0_1_4_4 - 0.00681223538366514*G0_0_1_4_5 + 0.0114552114552134*G0_0_1_4_6 + 0.000871509442938145*G0_0_1_4_7 + 0.000175063032205896*G0_0_1_4_8 + 0.0186327957756561*G0_0_1_4_9 + 0.0109934509934528*G0_0_1_5_0 - 0.000402560402560464*G0_0_1_5_1 + 0.00414823271966199*G0_0_1_5_3 - 0.00681223538366514*G0_0_1_5_4 - 0.0366490652205*G0_0_1_5_5 - 0.00283145426002616*G0_0_1_5_6 + 0.00420151277294206*G0_0_1_5_7 - 0.00228343085485981*G0_0_1_5_8 + 0.00655344655344756*G0_0_1_5_9 - 0.00540538826253201*G0_0_1_6_0 + 0.000383954669669026*G0_0_1_6_1 - 0.000592000592000721*G0_0_1_6_2 - 0.0046429760715483*G0_0_1_6_3 + 0.0114552114552134*G0_0_1_6_4 - 0.00283145426002616*G0_0_1_6_5 + 0.0111888111888131*G0_0_1_6_6 - 0.00191808191808226*G0_0_1_6_7 + 0.00300271157414064*G0_0_1_6_8 + 0.0142942771514225*G0_0_1_6_9 + 0.0361061161061222*G0_0_1_7_0 + 0.00379091807663304*G0_0_1_7_1 - 0.000524343381486324*G0_0_1_7_2 + 0.000106560106560121*G0_0_1_7_3 + 0.000871509442938144*G0_0_1_7_4 + 0.00420151277294206*G0_0_1_7_5 - 0.00191808191808227*G0_0_1_7_6 - 0.110495219066666*G0_0_1_7_7 - 0.0353931782503271*G0_0_1_7_8 + 0.00582274867989245*G0_0_1_7_9 - 0.0124738753310203*G0_0_1_8_0 + 0.00427424427424491*G0_0_1_8_1 - 0.00122205836491571*G0_0_1_8_2 - 0.000281623138765998*G0_0_1_8_3 + 0.000175063032205896*G0_0_1_8_4 - 0.00228343085485981*G0_0_1_8_5 + 0.00300271157414064*G0_0_1_8_6 - 0.0353931782503271*G0_0_1_8_7 + 0.0397088625660124*G0_0_1_8_8 - 0.028291708291713*G0_0_1_8_9 - 0.000662194947909272*G0_0_1_9_0 + 0.00931386074243374*G0_0_1_9_1 - 0.00166944166944196*G0_0_1_9_2 - 0.0281547024404214*G0_0_1_9_3 + 0.0186327957756561*G0_0_1_9_4 + 0.00655344655344756*G0_0_1_9_5 + 0.0142942771514225*G0_0_1_9_6 + 0.00582274867989245*G0_0_1_9_7 - 0.028291708291713*G0_0_1_9_8 + 0.0411017553874768*G0_0_1_9_9 - 0.032244298910971*G0_1_1_0_0 - 0.0044542406447176*G0_1_1_0_1 - 0.00149395577967032*G0_1_1_0_2 + 0.000182251610823096*G0_1_1_0_3 + 0.000595806310092106*G0_1_1_0_4 - 0.00976208976209138*G0_1_1_0_5 + 0.00710358424644258*G0_1_1_0_6 - 0.0500536500536585*G0_1_1_0_7 + 0.0234309605738217*G0_1_1_0_8 - 0.00733996162567716*G0_1_1_0_9 - 0.0044542406447176*G0_1_1_1_0 - 0.0248285048285093*G0_1_1_1_1 + 0.00239506525220847*G0_1_1_1_3 + 0.00139796711225308*G0_1_1_1_4 + 0.00198869913155661*G0_1_1_1_5 + 0.000359851788423281*G0_1_1_1_6 - 0.0063149548863845*G0_1_1_1_7 + 0.00570350284636088*G0_1_1_1_8 + 0.0105646734218181*G0_1_1_1_9 - 0.00149395577967032*G0_1_1_2_0 + 0.00284160284160324*G0_1_1_2_2 + 0.00179672179672212*G0_1_1_2_3 + 0.00118400118400136*G0_1_1_2_4 + 0.00358456358456421*G0_1_1_2_5 - 0.00109520109520131*G0_1_1_2_6 - 0.00416134130419913*G0_1_1_2_7 - 0.000426663283806214*G0_1_1_2_8 - 0.000230880230880273*G0_1_1_2_9 + 0.000182251610823096*G0_1_1_3_0 + 0.00239506525220847*G0_1_1_3_1 + 0.00179672179672212*G0_1_1_3_2 + 0.0350963322391957*G0_1_1_3_3 - 0.0176166690452435*G0_1_1_3_4 - 0.00250796822225434*G0_1_1_3_5 - 0.00257647114790017*G0_1_1_3_6 - 0.00204367061509947*G0_1_1_3_7 + 0.00226059654631123*G0_1_1_3_8 - 0.027606679035255*G0_1_1_3_9 + 0.000595806310092107*G0_1_1_4_0 + 0.00139796711225308*G0_1_1_4_1 + 0.00118400118400136*G0_1_1_4_2 - 0.0176166690452435*G0_1_1_4_3 - 0.05114885114886*G0_1_1_4_4 - 0.00328433471290669*G0_1_1_4_5 + 0.00586080586080685*G0_1_1_4_6 + 0.00609676038247568*G0_1_1_4_7 - 0.000216925931211685*G0_1_1_4_8 + 0.00726131011845417*G0_1_1_4_9 - 0.00976208976209138*G0_1_1_5_0 + 0.00198869913155662*G0_1_1_5_1 + 0.00358456358456421*G0_1_1_5_2 - 0.00250796822225434*G0_1_1_5_3 - 0.00328433471290669*G0_1_1_5_4 + 0.0496113410399208*G0_1_1_5_5 - 0.0207982493696815*G0_1_1_5_6 - 0.00352409495266694*G0_1_1_5_7 - 0.00746301317730016*G0_1_1_5_8 + 0.0369459112316317*G0_1_1_5_9 + 0.00710358424644258*G0_1_1_6_0 + 0.000359851788423281*G0_1_1_6_1 - 0.00109520109520131*G0_1_1_6_2 - 0.00257647114790017*G0_1_1_6_3 + 0.00586080586080685*G0_1_1_6_4 - 0.0207982493696815*G0_1_1_6_5 + 0.0202464202464237*G0_1_1_6_6 + 0.0109871081299671*G0_1_1_6_7 + 0.000848675134389563*G0_1_1_6_8 + 0.00584558298844116*G0_1_1_6_9 - 0.0500536500536585*G0_1_1_7_0 - 0.0063149548863845*G0_1_1_7_1 - 0.00416134130419913*G0_1_1_7_2 - 0.00204367061509947*G0_1_1_7_3 + 0.00609676038247568*G0_1_1_7_4 - 0.00352409495266694*G0_1_1_7_5 + 0.0109871081299671*G0_1_1_7_6 - 0.312373340944822*G0_1_1_7_7 + 0.0205622948480126*G0_1_1_7_8 + 0.0234309605738217*G0_1_1_8_0 + 0.00570350284636088*G0_1_1_8_1 - 0.000426663283806214*G0_1_1_8_2 + 0.00226059654631123*G0_1_1_8_3 - 0.000216925931211685*G0_1_1_8_4 - 0.00746301317730016*G0_1_1_8_5 + 0.000848675134389563*G0_1_1_8_6 + 0.0205622948480126*G0_1_1_8_7 + 0.0230398173255356*G0_1_1_8_8 - 0.0312601684030308*G0_1_1_8_9 - 0.00733996162567716*G0_1_1_9_0 + 0.0105646734218181*G0_1_1_9_1 - 0.000230880230880274*G0_1_1_9_2 - 0.027606679035255*G0_1_1_9_3 + 0.00726131011845418*G0_1_1_9_4 + 0.0369459112316317*G0_1_1_9_5 + 0.00584558298844116*G0_1_1_9_6 - 0.0312601684030308*G0_1_1_9_8 + 0.0454859426288075*G0_1_1_9_9; + A[152] = A[40] + 0.00967520134186969*G0_0_1_0_0 + 0.000185528756957356*G0_0_1_0_4 - 0.000383703597989366*G0_0_1_0_5 - 0.000928595214309641*G0_0_1_0_7 + 0.000606595785167316*G0_0_1_0_8 - 0.00160208838780293*G0_0_1_0_9 - 0.00967520134186976*G0_0_1_1_1 + 0.00038370359798935*G0_0_1_1_3 - 0.000185528756957364*G0_0_1_1_6 - 0.0006065957851673*G0_0_1_1_7 + 0.000928595214309623*G0_0_1_1_8 + 0.00160208838780294*G0_0_1_1_9 + 0.000616605616605747*G0_0_1_2_3 - 0.00104090354090377*G0_0_1_2_4 - 0.000616605616605695*G0_0_1_2_5 + 0.00104090354090366*G0_0_1_2_6 - 0.000284596356024975*G0_0_1_2_7 + 0.000284596356024979*G0_0_1_2_8 + 0.000383703597989349*G0_0_1_3_1 + 0.000616605616605747*G0_0_1_3_2 + 0.00807371200228485*G0_0_1_3_3 - 0.00113350934779524*G0_0_1_3_4 + 0.000556586270872092*G0_0_1_3_6 + 0.000928357356928955*G0_0_1_3_8 - 0.00465712858570076*G0_0_1_3_9 + 0.000185528756957356*G0_0_1_4_0 - 0.00104090354090377*G0_0_1_4_2 - 0.00113350934779524*G0_0_1_4_3 - 0.0030419580419586*G0_0_1_4_4 - 0.000556586270872065*G0_0_1_4_5 + 0.000148601398601427*G0_0_1_4_7 - 0.000853789068074935*G0_0_1_4_8 + 0.00111317254174415*G0_0_1_4_9 - 0.000383703597989366*G0_0_1_5_0 - 0.000616605616605695*G0_0_1_5_2 - 0.000556586270872065*G0_0_1_5_4 - 0.00807371200228477*G0_0_1_5_5 + 0.00113350934779528*G0_0_1_5_6 - 0.00092835735692894*G0_0_1_5_7 + 0.00465712858570078*G0_0_1_5_9 - 0.000185528756957364*G0_0_1_6_1 + 0.00104090354090366*G0_0_1_6_2 + 0.000556586270872092*G0_0_1_6_3 + 0.00113350934779528*G0_0_1_6_5 + 0.0030419580419585*G0_0_1_6_6 + 0.000853789068074927*G0_0_1_6_7 - 0.00014860139860142*G0_0_1_6_8 - 0.00111317254174416*G0_0_1_6_9 - 0.000928595214309641*G0_0_1_7_0 - 0.0006065957851673*G0_0_1_7_1 - 0.000284596356024975*G0_0_1_7_2 + 0.000148601398601427*G0_0_1_7_4 - 0.00092835735692894*G0_0_1_7_5 + 0.000853789068074928*G0_0_1_7_6 - 0.0354342086485003*G0_0_1_7_7 + 0.00309868702725893*G0_0_1_7_9 + 0.000606595785167316*G0_0_1_8_0 + 0.000928595214309623*G0_0_1_8_1 + 0.000284596356024979*G0_0_1_8_2 + 0.000928357356928955*G0_0_1_8_3 - 0.000853789068074935*G0_0_1_8_4 - 0.000148601398601421*G0_0_1_8_6 + 0.0354342086485005*G0_0_1_8_8 - 0.00309868702725892*G0_0_1_8_9 - 0.00160208838780293*G0_0_1_9_0 + 0.00160208838780294*G0_0_1_9_1 - 0.00465712858570076*G0_0_1_9_3 + 0.00111317254174415*G0_0_1_9_4 + 0.00465712858570078*G0_0_1_9_5 - 0.00111317254174416*G0_0_1_9_6 + 0.00309868702725893*G0_0_1_9_7 - 0.00309868702725892*G0_0_1_9_8 - 0.00967520134186969*G0_1_0_0_0 - 0.000185528756957356*G0_1_0_0_4 + 0.000383703597989366*G0_1_0_0_5 + 0.000928595214309641*G0_1_0_0_7 - 0.000606595785167316*G0_1_0_0_8 + 0.00160208838780293*G0_1_0_0_9 + 0.00967520134186976*G0_1_0_1_1 - 0.00038370359798935*G0_1_0_1_3 + 0.000185528756957364*G0_1_0_1_6 + 0.0006065957851673*G0_1_0_1_7 - 0.000928595214309623*G0_1_0_1_8 - 0.00160208838780294*G0_1_0_1_9 - 0.000616605616605747*G0_1_0_2_3 + 0.00104090354090377*G0_1_0_2_4 + 0.000616605616605695*G0_1_0_2_5 - 0.00104090354090366*G0_1_0_2_6 + 0.000284596356024975*G0_1_0_2_7 - 0.000284596356024979*G0_1_0_2_8 - 0.000383703597989349*G0_1_0_3_1 - 0.000616605616605747*G0_1_0_3_2 - 0.00807371200228485*G0_1_0_3_3 + 0.00113350934779524*G0_1_0_3_4 - 0.000556586270872092*G0_1_0_3_6 - 0.000928357356928955*G0_1_0_3_8 + 0.00465712858570076*G0_1_0_3_9 - 0.000185528756957356*G0_1_0_4_0 + 0.00104090354090377*G0_1_0_4_2 + 0.00113350934779524*G0_1_0_4_3 + 0.0030419580419586*G0_1_0_4_4 + 0.000556586270872065*G0_1_0_4_5 - 0.000148601398601427*G0_1_0_4_7 + 0.000853789068074935*G0_1_0_4_8 - 0.00111317254174415*G0_1_0_4_9 + 0.000383703597989366*G0_1_0_5_0 + 0.000616605616605695*G0_1_0_5_2 + 0.000556586270872065*G0_1_0_5_4 + 0.00807371200228477*G0_1_0_5_5 - 0.00113350934779528*G0_1_0_5_6 + 0.00092835735692894*G0_1_0_5_7 - 0.00465712858570078*G0_1_0_5_9 + 0.000185528756957364*G0_1_0_6_1 - 0.00104090354090366*G0_1_0_6_2 - 0.000556586270872092*G0_1_0_6_3 - 0.00113350934779528*G0_1_0_6_5 - 0.0030419580419585*G0_1_0_6_6 - 0.000853789068074927*G0_1_0_6_7 + 0.00014860139860142*G0_1_0_6_8 + 0.00111317254174416*G0_1_0_6_9 + 0.000928595214309641*G0_1_0_7_0 + 0.0006065957851673*G0_1_0_7_1 + 0.000284596356024975*G0_1_0_7_2 - 0.000148601398601427*G0_1_0_7_4 + 0.00092835735692894*G0_1_0_7_5 - 0.000853789068074928*G0_1_0_7_6 + 0.0354342086485003*G0_1_0_7_7 - 0.00309868702725893*G0_1_0_7_9 - 0.000606595785167316*G0_1_0_8_0 - 0.000928595214309623*G0_1_0_8_1 - 0.000284596356024979*G0_1_0_8_2 - 0.000928357356928955*G0_1_0_8_3 + 0.000853789068074935*G0_1_0_8_4 + 0.000148601398601421*G0_1_0_8_6 - 0.0354342086485005*G0_1_0_8_8 + 0.00309868702725892*G0_1_0_8_9 + 0.00160208838780293*G0_1_0_9_0 - 0.00160208838780294*G0_1_0_9_1 + 0.00465712858570076*G0_1_0_9_3 - 0.00111317254174415*G0_1_0_9_4 - 0.00465712858570078*G0_1_0_9_5 + 0.00111317254174416*G0_1_0_9_6 - 0.00309868702725893*G0_1_0_9_7 + 0.00309868702725892*G0_1_0_9_8; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f2_p3_q4_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f2_p3_q4_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f2_p3_q4_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 2; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q4_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q4_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q4_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q4_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q4_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f2_p3_q4_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f2_p3_q4_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f2_p3_q4_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f2_p3_q4_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p1_q1_quadrature.h b/laplacian_2d/laplacian_f3_p1_q1_quadrature.h new file mode 100644 index 0000000..e907c61 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p1_q1_quadrature.h @@ -0,0 +1,1500 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P1_Q1_QUADRATURE_H +#define __LAPLACIAN_F3_P1_Q1_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q1_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q1_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q1_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q1_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q1_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q1_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q1_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q1_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p1_q1_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p1_q1_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q1_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W6[6] = {0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333}; + // Quadrature points on the UFC reference element: (0.659027622374092, 0.231933368553031), (0.659027622374092, 0.109039009072877), (0.231933368553031, 0.659027622374092), (0.231933368553031, 0.109039009072877), (0.109039009072877, 0.659027622374092), (0.109039009072877, 0.231933368553031) + + // Value of basis functions at quadrature points. + static const double FE0[6][3] = \ + {{0.109039009072877, 0.659027622374092, 0.231933368553031}, + {0.231933368553031, 0.659027622374092, 0.109039009072877}, + {0.109039009072877, 0.231933368553031, 0.659027622374092}, + {0.659027622374092, 0.231933368553031, 0.109039009072877}, + {0.231933368553031, 0.109039009072877, 0.659027622374092}, + {0.659027622374092, 0.109039009072877, 0.231933368553031}}; + + static const double FE0_D01[6][2] = \ + {{-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}}; + + // Array of non-zero columns + static const unsigned int nzc1[2] = {0, 1}; + + // Array of non-zero columns + static const unsigned int nzc0[2] = {0, 2}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 9; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 468 + for (unsigned int ip = 0; ip < 6; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + double F2 = 0.0; + + // Total number of operations to compute function values = 18 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[2][r]; + F1 += FE0[ip][r]*w[0][r]; + F2 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 12 + double I[3]; + // Number of operations: 4 + I[0] = F0*F1*F2*G[0]*W6[ip]; + + // Number of operations: 4 + I[1] = F0*F1*F2*G[1]*W6[ip]; + + // Number of operations: 4 + I[2] = F0*F1*F2*G[2]*W6[ip]; + + + // Number of operations for primary indices: 48 + for (unsigned int j = 0; j < 2; j++) + { + for (unsigned int k = 0; k < 2; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p1_q1_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p1_q1_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q1_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q1_quadrature_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f3_p1_q1_quadrature_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f3_p1_q1_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q1_quadrature_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q1_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q1_quadrature_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f3_p1_q1_quadrature_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f3_p1_q1_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q1_quadrature_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q1_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q1_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p1_q1_tensor.h b/laplacian_2d/laplacian_f3_p1_q1_tensor.h new file mode 100644 index 0000000..4054b08 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p1_q1_tensor.h @@ -0,0 +1,1531 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P1_Q1_TENSOR_H +#define __LAPLACIAN_F3_P1_Q1_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q1_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q1_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q1_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q1_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q1_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q1_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q1_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q1_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p1_q1_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p1_q1_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q1_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 378 + // Number of operations (multiply-add pairs) for tensor contraction: 294 + // Total number of operations (multiply-add pairs): 683 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[1] = -0.05*G0_0_0_0_0_0 - 0.0166666666666667*G0_0_0_0_0_1 - 0.0166666666666667*G0_0_0_0_0_2 - 0.0166666666666667*G0_0_0_0_1_0 - 0.0166666666666667*G0_0_0_0_1_1 - 0.00833333333333333*G0_0_0_0_1_2 - 0.0166666666666667*G0_0_0_0_2_0 - 0.00833333333333333*G0_0_0_0_2_1 - 0.0166666666666667*G0_0_0_0_2_2 - 0.0166666666666667*G0_0_0_1_0_0 - 0.0166666666666667*G0_0_0_1_0_1 - 0.00833333333333333*G0_0_0_1_0_2 - 0.0166666666666667*G0_0_0_1_1_0 - 0.05*G0_0_0_1_1_1 - 0.0166666666666667*G0_0_0_1_1_2 - 0.00833333333333333*G0_0_0_1_2_0 - 0.0166666666666667*G0_0_0_1_2_1 - 0.0166666666666667*G0_0_0_1_2_2 - 0.0166666666666667*G0_0_0_2_0_0 - 0.00833333333333333*G0_0_0_2_0_1 - 0.0166666666666667*G0_0_0_2_0_2 - 0.00833333333333333*G0_0_0_2_1_0 - 0.0166666666666667*G0_0_0_2_1_1 - 0.0166666666666667*G0_0_0_2_1_2 - 0.0166666666666667*G0_0_0_2_2_0 - 0.0166666666666667*G0_0_0_2_2_1 - 0.0499999999999999*G0_0_0_2_2_2 - 0.0499999999999999*G0_1_0_0_0_0 - 0.0166666666666667*G0_1_0_0_0_1 - 0.0166666666666667*G0_1_0_0_0_2 - 0.0166666666666667*G0_1_0_0_1_0 - 0.0166666666666667*G0_1_0_0_1_1 - 0.00833333333333332*G0_1_0_0_1_2 - 0.0166666666666667*G0_1_0_0_2_0 - 0.00833333333333333*G0_1_0_0_2_1 - 0.0166666666666667*G0_1_0_0_2_2 - 0.0166666666666667*G0_1_0_1_0_0 - 0.0166666666666667*G0_1_0_1_0_1 - 0.00833333333333332*G0_1_0_1_0_2 - 0.0166666666666667*G0_1_0_1_1_0 - 0.0499999999999999*G0_1_0_1_1_1 - 0.0166666666666667*G0_1_0_1_1_2 - 0.00833333333333332*G0_1_0_1_2_0 - 0.0166666666666667*G0_1_0_1_2_1 - 0.0166666666666667*G0_1_0_1_2_2 - 0.0166666666666667*G0_1_0_2_0_0 - 0.00833333333333333*G0_1_0_2_0_1 - 0.0166666666666667*G0_1_0_2_0_2 - 0.00833333333333333*G0_1_0_2_1_0 - 0.0166666666666667*G0_1_0_2_1_1 - 0.0166666666666667*G0_1_0_2_1_2 - 0.0166666666666667*G0_1_0_2_2_0 - 0.0166666666666667*G0_1_0_2_2_1 - 0.0499999999999999*G0_1_0_2_2_2; + A[5] = 0.0499999999999999*G0_0_1_0_0_0 + 0.0166666666666667*G0_0_1_0_0_1 + 0.0166666666666667*G0_0_1_0_0_2 + 0.0166666666666667*G0_0_1_0_1_0 + 0.0166666666666667*G0_0_1_0_1_1 + 0.00833333333333332*G0_0_1_0_1_2 + 0.0166666666666667*G0_0_1_0_2_0 + 0.00833333333333333*G0_0_1_0_2_1 + 0.0166666666666667*G0_0_1_0_2_2 + 0.0166666666666667*G0_0_1_1_0_0 + 0.0166666666666667*G0_0_1_1_0_1 + 0.00833333333333332*G0_0_1_1_0_2 + 0.0166666666666667*G0_0_1_1_1_0 + 0.0499999999999999*G0_0_1_1_1_1 + 0.0166666666666667*G0_0_1_1_1_2 + 0.00833333333333332*G0_0_1_1_2_0 + 0.0166666666666667*G0_0_1_1_2_1 + 0.0166666666666667*G0_0_1_1_2_2 + 0.0166666666666667*G0_0_1_2_0_0 + 0.00833333333333333*G0_0_1_2_0_1 + 0.0166666666666667*G0_0_1_2_0_2 + 0.00833333333333333*G0_0_1_2_1_0 + 0.0166666666666667*G0_0_1_2_1_1 + 0.0166666666666667*G0_0_1_2_1_2 + 0.0166666666666667*G0_0_1_2_2_0 + 0.0166666666666667*G0_0_1_2_2_1 + 0.0499999999999999*G0_0_1_2_2_2; + A[0] = -A[1] + 0.0499999999999999*G0_0_1_0_0_0 + 0.0166666666666667*G0_0_1_0_0_1 + 0.0166666666666667*G0_0_1_0_0_2 + 0.0166666666666667*G0_0_1_0_1_0 + 0.0166666666666667*G0_0_1_0_1_1 + 0.00833333333333332*G0_0_1_0_1_2 + 0.0166666666666667*G0_0_1_0_2_0 + 0.00833333333333332*G0_0_1_0_2_1 + 0.0166666666666667*G0_0_1_0_2_2 + 0.0166666666666667*G0_0_1_1_0_0 + 0.0166666666666667*G0_0_1_1_0_1 + 0.00833333333333332*G0_0_1_1_0_2 + 0.0166666666666667*G0_0_1_1_1_0 + 0.0499999999999999*G0_0_1_1_1_1 + 0.0166666666666667*G0_0_1_1_1_2 + 0.00833333333333332*G0_0_1_1_2_0 + 0.0166666666666667*G0_0_1_1_2_1 + 0.0166666666666667*G0_0_1_1_2_2 + 0.0166666666666667*G0_0_1_2_0_0 + 0.00833333333333332*G0_0_1_2_0_1 + 0.0166666666666667*G0_0_1_2_0_2 + 0.00833333333333332*G0_0_1_2_1_0 + 0.0166666666666667*G0_0_1_2_1_1 + 0.0166666666666667*G0_0_1_2_1_2 + 0.0166666666666667*G0_0_1_2_2_0 + 0.0166666666666667*G0_0_1_2_2_1 + 0.0499999999999999*G0_0_1_2_2_2 + 0.0499999999999999*G0_1_1_0_0_0 + 0.0166666666666667*G0_1_1_0_0_1 + 0.0166666666666667*G0_1_1_0_0_2 + 0.0166666666666667*G0_1_1_0_1_0 + 0.0166666666666667*G0_1_1_0_1_1 + 0.00833333333333332*G0_1_1_0_1_2 + 0.0166666666666667*G0_1_1_0_2_0 + 0.00833333333333332*G0_1_1_0_2_1 + 0.0166666666666667*G0_1_1_0_2_2 + 0.0166666666666667*G0_1_1_1_0_0 + 0.0166666666666667*G0_1_1_1_0_1 + 0.00833333333333332*G0_1_1_1_0_2 + 0.0166666666666667*G0_1_1_1_1_0 + 0.0499999999999999*G0_1_1_1_1_1 + 0.0166666666666667*G0_1_1_1_1_2 + 0.00833333333333332*G0_1_1_1_2_0 + 0.0166666666666667*G0_1_1_1_2_1 + 0.0166666666666667*G0_1_1_1_2_2 + 0.0166666666666667*G0_1_1_2_0_0 + 0.00833333333333332*G0_1_1_2_0_1 + 0.0166666666666667*G0_1_1_2_0_2 + 0.00833333333333332*G0_1_1_2_1_0 + 0.0166666666666667*G0_1_1_2_1_1 + 0.0166666666666667*G0_1_1_2_1_2 + 0.0166666666666667*G0_1_1_2_2_0 + 0.0166666666666667*G0_1_1_2_2_1 + 0.0499999999999999*G0_1_1_2_2_2; + A[7] = 0.0499999999999999*G0_1_0_0_0_0 + 0.0166666666666667*G0_1_0_0_0_1 + 0.0166666666666667*G0_1_0_0_0_2 + 0.0166666666666667*G0_1_0_0_1_0 + 0.0166666666666667*G0_1_0_0_1_1 + 0.00833333333333332*G0_1_0_0_1_2 + 0.0166666666666667*G0_1_0_0_2_0 + 0.00833333333333333*G0_1_0_0_2_1 + 0.0166666666666667*G0_1_0_0_2_2 + 0.0166666666666667*G0_1_0_1_0_0 + 0.0166666666666667*G0_1_0_1_0_1 + 0.00833333333333332*G0_1_0_1_0_2 + 0.0166666666666667*G0_1_0_1_1_0 + 0.0499999999999999*G0_1_0_1_1_1 + 0.0166666666666667*G0_1_0_1_1_2 + 0.00833333333333332*G0_1_0_1_2_0 + 0.0166666666666667*G0_1_0_1_2_1 + 0.0166666666666667*G0_1_0_1_2_2 + 0.0166666666666667*G0_1_0_2_0_0 + 0.00833333333333333*G0_1_0_2_0_1 + 0.0166666666666667*G0_1_0_2_0_2 + 0.00833333333333333*G0_1_0_2_1_0 + 0.0166666666666667*G0_1_0_2_1_1 + 0.0166666666666667*G0_1_0_2_1_2 + 0.0166666666666667*G0_1_0_2_2_0 + 0.0166666666666667*G0_1_0_2_2_1 + 0.0499999999999999*G0_1_0_2_2_2; + A[6] = -A[7] - 0.0499999999999999*G0_1_1_0_0_0 - 0.0166666666666667*G0_1_1_0_0_1 - 0.0166666666666667*G0_1_1_0_0_2 - 0.0166666666666667*G0_1_1_0_1_0 - 0.0166666666666667*G0_1_1_0_1_1 - 0.00833333333333332*G0_1_1_0_1_2 - 0.0166666666666667*G0_1_1_0_2_0 - 0.00833333333333332*G0_1_1_0_2_1 - 0.0166666666666667*G0_1_1_0_2_2 - 0.0166666666666667*G0_1_1_1_0_0 - 0.0166666666666667*G0_1_1_1_0_1 - 0.00833333333333332*G0_1_1_1_0_2 - 0.0166666666666667*G0_1_1_1_1_0 - 0.0499999999999999*G0_1_1_1_1_1 - 0.0166666666666667*G0_1_1_1_1_2 - 0.00833333333333332*G0_1_1_1_2_0 - 0.0166666666666667*G0_1_1_1_2_1 - 0.0166666666666667*G0_1_1_1_2_2 - 0.0166666666666667*G0_1_1_2_0_0 - 0.00833333333333332*G0_1_1_2_0_1 - 0.0166666666666667*G0_1_1_2_0_2 - 0.00833333333333332*G0_1_1_2_1_0 - 0.0166666666666667*G0_1_1_2_1_1 - 0.0166666666666667*G0_1_1_2_1_2 - 0.0166666666666667*G0_1_1_2_2_0 - 0.0166666666666667*G0_1_1_2_2_1 - 0.0499999999999999*G0_1_1_2_2_2; + A[8] = 0.0499999999999999*G0_1_1_0_0_0 + 0.0166666666666667*G0_1_1_0_0_1 + 0.0166666666666667*G0_1_1_0_0_2 + 0.0166666666666667*G0_1_1_0_1_0 + 0.0166666666666667*G0_1_1_0_1_1 + 0.00833333333333332*G0_1_1_0_1_2 + 0.0166666666666667*G0_1_1_0_2_0 + 0.00833333333333332*G0_1_1_0_2_1 + 0.0166666666666667*G0_1_1_0_2_2 + 0.0166666666666667*G0_1_1_1_0_0 + 0.0166666666666667*G0_1_1_1_0_1 + 0.00833333333333332*G0_1_1_1_0_2 + 0.0166666666666667*G0_1_1_1_1_0 + 0.0499999999999999*G0_1_1_1_1_1 + 0.0166666666666667*G0_1_1_1_1_2 + 0.00833333333333332*G0_1_1_1_2_0 + 0.0166666666666667*G0_1_1_1_2_1 + 0.0166666666666667*G0_1_1_1_2_2 + 0.0166666666666667*G0_1_1_2_0_0 + 0.00833333333333332*G0_1_1_2_0_1 + 0.0166666666666667*G0_1_1_2_0_2 + 0.00833333333333332*G0_1_1_2_1_0 + 0.0166666666666667*G0_1_1_2_1_1 + 0.0166666666666667*G0_1_1_2_1_2 + 0.0166666666666667*G0_1_1_2_2_0 + 0.0166666666666667*G0_1_1_2_2_1 + 0.0499999999999999*G0_1_1_2_2_2; + A[2] = -A[8] - 0.0499999999999999*G0_0_1_0_0_0 - 0.0166666666666667*G0_0_1_0_0_1 - 0.0166666666666667*G0_0_1_0_0_2 - 0.0166666666666667*G0_0_1_0_1_0 - 0.0166666666666667*G0_0_1_0_1_1 - 0.00833333333333332*G0_0_1_0_1_2 - 0.0166666666666667*G0_0_1_0_2_0 - 0.00833333333333333*G0_0_1_0_2_1 - 0.0166666666666667*G0_0_1_0_2_2 - 0.0166666666666667*G0_0_1_1_0_0 - 0.0166666666666667*G0_0_1_1_0_1 - 0.00833333333333332*G0_0_1_1_0_2 - 0.0166666666666667*G0_0_1_1_1_0 - 0.0499999999999999*G0_0_1_1_1_1 - 0.0166666666666667*G0_0_1_1_1_2 - 0.00833333333333332*G0_0_1_1_2_0 - 0.0166666666666667*G0_0_1_1_2_1 - 0.0166666666666667*G0_0_1_1_2_2 - 0.0166666666666667*G0_0_1_2_0_0 - 0.00833333333333333*G0_0_1_2_0_1 - 0.0166666666666667*G0_0_1_2_0_2 - 0.00833333333333333*G0_0_1_2_1_0 - 0.0166666666666667*G0_0_1_2_1_1 - 0.0166666666666667*G0_0_1_2_1_2 - 0.0166666666666667*G0_0_1_2_2_0 - 0.0166666666666667*G0_0_1_2_2_1 - 0.0499999999999999*G0_0_1_2_2_2; + A[4] = 0.05*G0_0_0_0_0_0 + 0.0166666666666667*G0_0_0_0_0_1 + 0.0166666666666667*G0_0_0_0_0_2 + 0.0166666666666667*G0_0_0_0_1_0 + 0.0166666666666667*G0_0_0_0_1_1 + 0.00833333333333333*G0_0_0_0_1_2 + 0.0166666666666667*G0_0_0_0_2_0 + 0.00833333333333333*G0_0_0_0_2_1 + 0.0166666666666667*G0_0_0_0_2_2 + 0.0166666666666667*G0_0_0_1_0_0 + 0.0166666666666667*G0_0_0_1_0_1 + 0.00833333333333333*G0_0_0_1_0_2 + 0.0166666666666667*G0_0_0_1_1_0 + 0.05*G0_0_0_1_1_1 + 0.0166666666666667*G0_0_0_1_1_2 + 0.00833333333333333*G0_0_0_1_2_0 + 0.0166666666666667*G0_0_0_1_2_1 + 0.0166666666666667*G0_0_0_1_2_2 + 0.0166666666666667*G0_0_0_2_0_0 + 0.00833333333333333*G0_0_0_2_0_1 + 0.0166666666666667*G0_0_0_2_0_2 + 0.00833333333333333*G0_0_0_2_1_0 + 0.0166666666666667*G0_0_0_2_1_1 + 0.0166666666666667*G0_0_0_2_1_2 + 0.0166666666666667*G0_0_0_2_2_0 + 0.0166666666666667*G0_0_0_2_2_1 + 0.0499999999999999*G0_0_0_2_2_2; + A[3] = -A[4] - 0.0499999999999999*G0_0_1_0_0_0 - 0.0166666666666667*G0_0_1_0_0_1 - 0.0166666666666667*G0_0_1_0_0_2 - 0.0166666666666667*G0_0_1_0_1_0 - 0.0166666666666667*G0_0_1_0_1_1 - 0.00833333333333332*G0_0_1_0_1_2 - 0.0166666666666667*G0_0_1_0_2_0 - 0.00833333333333332*G0_0_1_0_2_1 - 0.0166666666666667*G0_0_1_0_2_2 - 0.0166666666666667*G0_0_1_1_0_0 - 0.0166666666666667*G0_0_1_1_0_1 - 0.00833333333333332*G0_0_1_1_0_2 - 0.0166666666666667*G0_0_1_1_1_0 - 0.0499999999999999*G0_0_1_1_1_1 - 0.0166666666666667*G0_0_1_1_1_2 - 0.00833333333333332*G0_0_1_1_2_0 - 0.0166666666666667*G0_0_1_1_2_1 - 0.0166666666666667*G0_0_1_1_2_2 - 0.0166666666666667*G0_0_1_2_0_0 - 0.00833333333333332*G0_0_1_2_0_1 - 0.0166666666666667*G0_0_1_2_0_2 - 0.00833333333333332*G0_0_1_2_1_0 - 0.0166666666666667*G0_0_1_2_1_1 - 0.0166666666666667*G0_0_1_2_1_2 - 0.0166666666666667*G0_0_1_2_2_0 - 0.0166666666666667*G0_0_1_2_2_1 - 0.0499999999999999*G0_0_1_2_2_2; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p1_q1_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p1_q1_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q1_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q1_tensor_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f3_p1_q1_tensor_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f3_p1_q1_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q1_tensor_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q1_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q1_tensor_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f3_p1_q1_tensor_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f3_p1_q1_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q1_tensor_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q1_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q1_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p1_q2_quadrature.h b/laplacian_2d/laplacian_f3_p1_q2_quadrature.h new file mode 100644 index 0000000..4ce06d5 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p1_q2_quadrature.h @@ -0,0 +1,3419 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P1_Q2_QUADRATURE_H +#define __LAPLACIAN_F3_P1_Q2_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q2_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q2_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q2_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q2_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q2_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q2_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q2_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q2_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q2_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q2_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q2_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q2_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p1_q2_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p1_q2_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W7[7] = {0.1125, 0.0629695902724136, 0.0629695902724136, 0.0629695902724136, 0.0661970763942531, 0.0661970763942531, 0.0661970763942531}; + // Quadrature points on the UFC reference element: (0.333333333333333, 0.333333333333333), (0.797426985353087, 0.101286507323456), (0.101286507323456, 0.797426985353087), (0.101286507323456, 0.101286507323456), (0.0597158717897698, 0.470142064105115), (0.470142064105115, 0.0597158717897698), (0.470142064105115, 0.470142064105115) + + // Value of basis functions at quadrature points. + static const double FE0[7][3] = \ + {{0.333333333333333, 0.333333333333333, 0.333333333333333}, + {0.101286507323456, 0.797426985353087, 0.101286507323456}, + {0.101286507323457, 0.101286507323456, 0.797426985353087}, + {0.797426985353087, 0.101286507323456, 0.101286507323456}, + {0.470142064105115, 0.0597158717897698, 0.470142064105115}, + {0.470142064105115, 0.470142064105115, 0.0597158717897697}, + {0.0597158717897699, 0.470142064105115, 0.470142064105115}}; + + static const double FE1_D01[7][5] = \ + {{-0.333333333333333, 0.333333333333334, 1.33333333333333, 0.0, -1.33333333333333}, + {0.594853970706174, -0.594853970706174, 3.18970794141235, 0.0, -3.18970794141235}, + {0.594853970706175, 2.18970794141235, 0.405146029293824, -2.78456191211852, -0.405146029293825}, + {-2.18970794141235, -0.594853970706174, 0.405146029293825, 2.78456191211852, -0.405146029293825}, + {-0.880568256420461, 0.88056825642046, 0.238863487159079, 0.0, -0.238863487159079}, + {-0.88056825642046, -0.761136512840921, 1.88056825642046, 1.64170476926138, -1.88056825642046}, + {0.761136512840921, 0.88056825642046, 1.88056825642046, -1.64170476926138, -1.88056825642046}}; + + // Array of non-zero columns + static const unsigned int nzc0[5] = {0, 2, 3, 4, 5}; + + static const double FE1_D10[7][5] = \ + {{-0.333333333333333, 0.333333333333333, 1.33333333333333, -1.33333333333333, 0.0}, + {0.594853970706174, 2.18970794141235, 0.405146029293824, -0.405146029293824, -2.78456191211852}, + {0.594853970706175, -0.594853970706175, 3.18970794141235, -3.18970794141235, 0.0}, + {-2.18970794141235, -0.594853970706175, 0.405146029293824, -0.405146029293824, 2.78456191211852}, + {-0.880568256420461, -0.761136512840922, 1.88056825642046, -1.88056825642046, 1.64170476926138}, + {-0.88056825642046, 0.88056825642046, 0.238863487159078, -0.238863487159078, 0.0}, + {0.761136512840921, 0.88056825642046, 1.88056825642046, -1.88056825642046, -1.64170476926138}}; + + // Array of non-zero columns + static const unsigned int nzc1[5] = {0, 1, 3, 4, 5}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 36; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 2310 + for (unsigned int ip = 0; ip < 7; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + double F2 = 0.0; + + // Total number of operations to compute function values = 18 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[2][r]; + F1 += FE0[ip][r]*w[0][r]; + F2 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 12 + double I[3]; + // Number of operations: 4 + I[0] = F0*F1*F2*G[0]*W7[ip]; + + // Number of operations: 4 + I[1] = F0*F1*F2*G[1]*W7[ip]; + + // Number of operations: 4 + I[2] = F0*F1*F2*G[2]*W7[ip]; + + + // Number of operations for primary indices: 300 + for (unsigned int j = 0; j < 5; j++) + { + for (unsigned int k = 0; k < 5; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p1_q2_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p1_q2_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q2_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q2_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q2_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q2_quadrature_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q2_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q2_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q2_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q2_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q2_quadrature_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q2_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q2_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p1_q2_tensor.h b/laplacian_2d/laplacian_f3_p1_q2_tensor.h new file mode 100644 index 0000000..63d504e --- /dev/null +++ b/laplacian_2d/laplacian_f3_p1_q2_tensor.h @@ -0,0 +1,3466 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P1_Q2_TENSOR_H +#define __LAPLACIAN_F3_P1_Q2_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q2_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q2_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q2_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q2_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q2_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q2_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q2_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q2_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q2_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q2_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q2_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q2_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p1_q2_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p1_q2_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 378 + // Number of operations (multiply-add pairs) for tensor contraction: 1639 + // Total number of operations (multiply-add pairs): 2028 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[9] = -0.0142857142857143*G0_0_0_0_0_0 + 0.00158730158730158*G0_0_0_0_0_1 - 0.00952380952380954*G0_0_0_0_0_2 + 0.00158730158730158*G0_0_0_0_1_0 + 0.00793650793650792*G0_0_0_0_1_1 + 0.00158730158730159*G0_0_0_0_1_2 - 0.00952380952380954*G0_0_0_0_2_0 + 0.00158730158730159*G0_0_0_0_2_1 - 0.0142857142857143*G0_0_0_0_2_2 + 0.00158730158730158*G0_0_0_1_0_0 + 0.00793650793650792*G0_0_0_1_0_1 + 0.00158730158730159*G0_0_0_1_0_2 + 0.00793650793650792*G0_0_0_1_1_0 + 0.0428571428571427*G0_0_0_1_1_1 + 0.0158730158730159*G0_0_0_1_1_2 + 0.00158730158730159*G0_0_0_1_2_0 + 0.0158730158730159*G0_0_0_1_2_1 + 0.00476190476190475*G0_0_0_1_2_2 - 0.00952380952380954*G0_0_0_2_0_0 + 0.00158730158730159*G0_0_0_2_0_1 - 0.0142857142857143*G0_0_0_2_0_2 + 0.00158730158730159*G0_0_0_2_1_0 + 0.0158730158730159*G0_0_0_2_1_1 + 0.00476190476190476*G0_0_0_2_1_2 - 0.0142857142857143*G0_0_0_2_2_0 + 0.00476190476190475*G0_0_0_2_2_1 - 0.0571428571428571*G0_0_0_2_2_2 + 0.00476190476190477*G0_0_1_0_0_0 + 0.0158730158730159*G0_0_1_0_0_1 + 0.00158730158730159*G0_0_1_0_0_2 + 0.0158730158730159*G0_0_1_0_1_0 + 0.0428571428571429*G0_0_1_0_1_1 + 0.00793650793650794*G0_0_1_0_1_2 + 0.00158730158730159*G0_0_1_0_2_0 + 0.00793650793650794*G0_0_1_0_2_1 + 0.00158730158730159*G0_0_1_0_2_2 + 0.0158730158730159*G0_0_1_1_0_0 + 0.0428571428571429*G0_0_1_1_0_1 + 0.00793650793650794*G0_0_1_1_0_2 + 0.0428571428571429*G0_0_1_1_1_0 + 0.247619047619047*G0_0_1_1_1_1 + 0.0428571428571428*G0_0_1_1_1_2 + 0.00793650793650794*G0_0_1_1_2_0 + 0.0428571428571428*G0_0_1_1_2_1 + 0.0158730158730159*G0_0_1_1_2_2 + 0.00158730158730159*G0_0_1_2_0_0 + 0.00793650793650794*G0_0_1_2_0_1 + 0.00158730158730159*G0_0_1_2_0_2 + 0.00793650793650794*G0_0_1_2_1_0 + 0.0428571428571428*G0_0_1_2_1_1 + 0.0158730158730159*G0_0_1_2_1_2 + 0.00158730158730159*G0_0_1_2_2_0 + 0.0158730158730159*G0_0_1_2_2_1 + 0.00476190476190478*G0_0_1_2_2_2; + A[13] = 0.00238095238095236*G0_1_0_0_0_0 - 0.00396825396825397*G0_1_0_0_0_1 - 0.00396825396825398*G0_1_0_0_0_2 - 0.00396825396825397*G0_1_0_0_1_0 - 0.00873015873015873*G0_1_0_0_1_1 - 0.00119047619047619*G0_1_0_0_1_2 - 0.00396825396825398*G0_1_0_0_2_0 - 0.00119047619047619*G0_1_0_0_2_1 - 0.00873015873015874*G0_1_0_0_2_2 - 0.00396825396825397*G0_1_0_1_0_0 - 0.00873015873015873*G0_1_0_1_0_1 - 0.00119047619047619*G0_1_0_1_0_2 - 0.00873015873015873*G0_1_0_1_1_0 - 0.0404761904761904*G0_1_0_1_1_1 - 0.000793650793650786*G0_1_0_1_1_2 - 0.00119047619047619*G0_1_0_1_2_0 - 0.000793650793650786*G0_1_0_1_2_1 - 0.0007936507936508*G0_1_0_1_2_2 - 0.00396825396825398*G0_1_0_2_0_0 - 0.00119047619047619*G0_1_0_2_0_1 - 0.00873015873015874*G0_1_0_2_0_2 - 0.00119047619047619*G0_1_0_2_1_0 - 0.000793650793650788*G0_1_0_2_1_1 - 0.0007936507936508*G0_1_0_2_1_2 - 0.00873015873015874*G0_1_0_2_2_0 - 0.0007936507936508*G0_1_0_2_2_1 - 0.0404761904761905*G0_1_0_2_2_2; + A[17] = -0.0428571428571428*G0_1_0_0_0_0 - 0.00476190476190476*G0_1_0_0_0_1 + 0.00317460317460319*G0_1_0_0_0_2 - 0.00476190476190476*G0_1_0_0_1_0 + 0.00476190476190476*G0_1_0_0_1_1 + 0.00317460317460319*G0_1_0_0_2_0 + 0.00793650793650795*G0_1_0_0_2_2 - 0.00476190476190476*G0_1_0_1_0_0 + 0.00476190476190475*G0_1_0_1_0_1 + 0.00476190476190475*G0_1_0_1_1_0 + 0.0428571428571427*G0_1_0_1_1_1 - 0.00317460317460318*G0_1_0_1_1_2 - 0.00317460317460318*G0_1_0_1_2_1 - 0.00793650793650792*G0_1_0_1_2_2 + 0.00317460317460318*G0_1_0_2_0_0 + 0.00793650793650795*G0_1_0_2_0_2 - 0.00317460317460318*G0_1_0_2_1_1 - 0.00793650793650792*G0_1_0_2_1_2 + 0.00793650793650795*G0_1_0_2_2_0 - 0.00793650793650792*G0_1_0_2_2_1 + 0.0142857142857143*G0_1_1_0_0_0 + 0.00952380952380953*G0_1_1_0_0_1 - 0.00158730158730159*G0_1_1_0_0_2 + 0.00952380952380952*G0_1_1_0_1_0 + 0.0142857142857143*G0_1_1_0_1_1 - 0.00158730158730159*G0_1_1_0_1_2 - 0.00158730158730159*G0_1_1_0_2_0 - 0.00158730158730159*G0_1_1_0_2_1 - 0.00793650793650794*G0_1_1_0_2_2 + 0.00952380952380953*G0_1_1_1_0_0 + 0.0142857142857143*G0_1_1_1_0_1 - 0.00158730158730159*G0_1_1_1_0_2 + 0.0142857142857143*G0_1_1_1_1_0 + 0.0571428571428571*G0_1_1_1_1_1 - 0.00476190476190477*G0_1_1_1_1_2 - 0.00158730158730159*G0_1_1_1_2_0 - 0.00476190476190477*G0_1_1_1_2_1 - 0.0158730158730159*G0_1_1_1_2_2 - 0.00158730158730159*G0_1_1_2_0_0 - 0.00158730158730159*G0_1_1_2_0_1 - 0.00793650793650793*G0_1_1_2_0_2 - 0.00158730158730159*G0_1_1_2_1_0 - 0.00476190476190477*G0_1_1_2_1_1 - 0.0158730158730159*G0_1_1_2_1_2 - 0.00793650793650793*G0_1_1_2_2_0 - 0.0158730158730159*G0_1_1_2_2_1 - 0.0428571428571428*G0_1_1_2_2_2; + A[8] = 0.00238095238095237*G0_0_1_0_0_0 - 0.00396825396825397*G0_0_1_0_0_1 - 0.00396825396825398*G0_0_1_0_0_2 - 0.00396825396825397*G0_0_1_0_1_0 - 0.00873015873015873*G0_0_1_0_1_1 - 0.00119047619047619*G0_0_1_0_1_2 - 0.00396825396825398*G0_0_1_0_2_0 - 0.00119047619047619*G0_0_1_0_2_1 - 0.00873015873015874*G0_0_1_0_2_2 - 0.00396825396825397*G0_0_1_1_0_0 - 0.00873015873015873*G0_0_1_1_0_1 - 0.00119047619047619*G0_0_1_1_0_2 - 0.00873015873015873*G0_0_1_1_1_0 - 0.0404761904761904*G0_0_1_1_1_1 - 0.000793650793650787*G0_0_1_1_1_2 - 0.00119047619047619*G0_0_1_1_2_0 - 0.000793650793650787*G0_0_1_1_2_1 - 0.0007936507936508*G0_0_1_1_2_2 - 0.00396825396825398*G0_0_1_2_0_0 - 0.00119047619047619*G0_0_1_2_0_1 - 0.00873015873015874*G0_0_1_2_0_2 - 0.00119047619047619*G0_0_1_2_1_0 - 0.000793650793650787*G0_0_1_2_1_1 - 0.0007936507936508*G0_0_1_2_1_2 - 0.00873015873015874*G0_0_1_2_2_0 - 0.0007936507936508*G0_0_1_2_2_1 - 0.0404761904761905*G0_0_1_2_2_2; + A[11] = -A[9] - 0.0761904761904762*G0_0_0_0_0_0 - 0.00952380952380954*G0_0_0_0_0_1 - 0.0253968253968254*G0_0_0_0_0_2 - 0.00952380952380954*G0_0_0_0_1_0 - 0.0190476190476191*G0_0_0_0_1_1 - 0.00476190476190477*G0_0_0_0_1_2 - 0.0253968253968254*G0_0_0_0_2_0 - 0.00476190476190477*G0_0_0_0_2_1 - 0.0253968253968254*G0_0_0_0_2_2 - 0.00952380952380954*G0_0_0_1_0_0 - 0.0190476190476191*G0_0_0_1_0_1 - 0.00476190476190477*G0_0_0_1_0_2 - 0.0190476190476191*G0_0_0_1_1_0 - 0.161904761904762*G0_0_0_1_1_1 - 0.019047619047619*G0_0_0_1_1_2 - 0.00476190476190477*G0_0_0_1_2_0 - 0.019047619047619*G0_0_0_1_2_1 - 0.00952380952380952*G0_0_0_1_2_2 - 0.0253968253968254*G0_0_0_2_0_0 - 0.00476190476190477*G0_0_0_2_0_1 - 0.0253968253968254*G0_0_0_2_0_2 - 0.00476190476190477*G0_0_0_2_1_0 - 0.019047619047619*G0_0_0_2_1_1 - 0.00952380952380952*G0_0_0_2_1_2 - 0.0253968253968254*G0_0_0_2_2_0 - 0.00952380952380952*G0_0_0_2_2_1 - 0.0761904761904762*G0_0_0_2_2_2; + A[7] = 0.0214285714285714*G0_0_0_0_0_0 + 0.0103174603174603*G0_0_0_0_0_1 + 0.00714285714285715*G0_0_0_0_0_2 + 0.0103174603174603*G0_0_0_0_1_0 + 0.0261904761904762*G0_0_0_0_1_1 + 0.00515873015873016*G0_0_0_0_1_2 + 0.00714285714285715*G0_0_0_0_2_0 + 0.00515873015873016*G0_0_0_0_2_1 + 0.00714285714285716*G0_0_0_0_2_2 + 0.0103174603174603*G0_0_0_1_0_0 + 0.0261904761904762*G0_0_0_1_0_1 + 0.00515873015873016*G0_0_0_1_0_2 + 0.0261904761904762*G0_0_0_1_1_0 + 0.164285714285714*G0_0_0_1_1_1 + 0.0261904761904762*G0_0_0_1_1_2 + 0.00515873015873016*G0_0_0_1_2_0 + 0.0261904761904762*G0_0_0_1_2_1 + 0.0103174603174603*G0_0_0_1_2_2 + 0.00714285714285715*G0_0_0_2_0_0 + 0.00515873015873016*G0_0_0_2_0_1 + 0.00714285714285716*G0_0_0_2_0_2 + 0.00515873015873016*G0_0_0_2_1_0 + 0.0261904761904762*G0_0_0_2_1_1 + 0.0103174603174603*G0_0_0_2_1_2 + 0.00714285714285716*G0_0_0_2_2_0 + 0.0103174603174603*G0_0_0_2_2_1 + 0.0214285714285714*G0_0_0_2_2_2; + A[1] = -A[13] + 0.0404761904761905*G0_0_0_0_0_0 + 0.000793650793650794*G0_0_0_0_0_1 + 0.00873015873015874*G0_0_0_0_0_2 + 0.000793650793650794*G0_0_0_0_1_0 + 0.00079365079365079*G0_0_0_0_1_1 + 0.00119047619047619*G0_0_0_0_1_2 + 0.00873015873015874*G0_0_0_0_2_0 + 0.00119047619047619*G0_0_0_0_2_1 + 0.00396825396825397*G0_0_0_0_2_2 + 0.000793650793650794*G0_0_0_1_0_0 + 0.00079365079365079*G0_0_0_1_0_1 + 0.00119047619047619*G0_0_0_1_0_2 + 0.000793650793650788*G0_0_0_1_1_0 + 0.0404761904761904*G0_0_0_1_1_1 + 0.00873015873015871*G0_0_0_1_1_2 + 0.00119047619047619*G0_0_0_1_2_0 + 0.00873015873015871*G0_0_0_1_2_1 + 0.00396825396825396*G0_0_0_1_2_2 + 0.00873015873015874*G0_0_0_2_0_0 + 0.00119047619047619*G0_0_0_2_0_1 + 0.00396825396825397*G0_0_0_2_0_2 + 0.00119047619047619*G0_0_0_2_1_0 + 0.00873015873015871*G0_0_0_2_1_1 + 0.00396825396825396*G0_0_0_2_1_2 + 0.00396825396825397*G0_0_0_2_2_0 + 0.00396825396825396*G0_0_0_2_2_1 - 0.00238095238095239*G0_0_0_2_2_2 + 0.0428571428571428*G0_1_0_0_0_0 - 0.00317460317460318*G0_1_0_0_0_1 + 0.00476190476190476*G0_1_0_0_0_2 - 0.00317460317460318*G0_1_0_0_1_0 - 0.00793650793650793*G0_1_0_0_1_1 + 0.00476190476190476*G0_1_0_0_2_0 - 0.00476190476190477*G0_1_0_0_2_2 - 0.00317460317460318*G0_1_0_1_0_0 - 0.00793650793650793*G0_1_0_1_0_1 - 0.00793650793650793*G0_1_0_1_1_0 + 0.00793650793650794*G0_1_0_1_1_2 + 0.00793650793650794*G0_1_0_1_2_1 + 0.00317460317460317*G0_1_0_1_2_2 + 0.00476190476190476*G0_1_0_2_0_0 - 0.00476190476190477*G0_1_0_2_0_2 + 0.00793650793650794*G0_1_0_2_1_1 + 0.00317460317460317*G0_1_0_2_1_2 - 0.00476190476190477*G0_1_0_2_2_0 + 0.00317460317460317*G0_1_0_2_2_1 - 0.0428571428571429*G0_1_0_2_2_2; + A[34] = -0.0571428571428571*G0_0_0_0_0_0 - 0.00634920634920635*G0_0_0_0_0_1 - 0.0253968253968254*G0_0_0_0_0_2 - 0.00634920634920634*G0_0_0_0_1_0 + 0.00634920634920634*G0_0_0_0_1_1 - 0.0253968253968254*G0_0_0_0_2_0 - 0.0190476190476191*G0_0_0_0_2_2 - 0.00634920634920634*G0_0_0_1_0_0 + 0.00634920634920634*G0_0_0_1_0_1 + 0.00634920634920634*G0_0_0_1_1_0 + 0.057142857142857*G0_0_0_1_1_1 + 0.0253968253968254*G0_0_0_1_1_2 + 0.0253968253968254*G0_0_0_1_2_1 + 0.019047619047619*G0_0_0_1_2_2 - 0.0253968253968254*G0_0_0_2_0_0 - 0.0190476190476191*G0_0_0_2_0_2 + 0.0253968253968254*G0_0_0_2_1_1 + 0.019047619047619*G0_0_0_2_1_2 - 0.0190476190476191*G0_0_0_2_2_0 + 0.019047619047619*G0_0_0_2_2_1 + 0.247619047619048*G0_0_1_0_0_0 + 0.0317460317460318*G0_0_1_0_0_1 + 0.0317460317460318*G0_0_1_0_0_2 + 0.0317460317460318*G0_0_1_0_1_0 + 0.00634920634920635*G0_0_1_0_1_1 + 0.00634920634920635*G0_0_1_0_1_2 + 0.0317460317460318*G0_0_1_0_2_0 + 0.00634920634920635*G0_0_1_0_2_1 + 0.00634920634920636*G0_0_1_0_2_2 + 0.0317460317460318*G0_0_1_1_0_0 + 0.00634920634920634*G0_0_1_1_0_1 + 0.00634920634920635*G0_0_1_1_0_2 + 0.00634920634920634*G0_0_1_1_1_0 + 0.0190476190476189*G0_0_1_1_1_1 + 0.019047619047619*G0_0_1_1_1_2 + 0.00634920634920635*G0_0_1_1_2_0 + 0.019047619047619*G0_0_1_1_2_1 + 0.019047619047619*G0_0_1_1_2_2 + 0.0317460317460318*G0_0_1_2_0_0 + 0.00634920634920635*G0_0_1_2_0_1 + 0.00634920634920636*G0_0_1_2_0_2 + 0.00634920634920635*G0_0_1_2_1_0 + 0.019047619047619*G0_0_1_2_1_1 + 0.019047619047619*G0_0_1_2_1_2 + 0.00634920634920636*G0_0_1_2_2_0 + 0.019047619047619*G0_0_1_2_2_1 + 0.019047619047619*G0_0_1_2_2_2 + 0.019047619047619*G0_1_0_0_0_0 + 0.0126984126984127*G0_1_0_0_0_1 + 0.0126984126984127*G0_1_0_0_0_2 + 0.0126984126984127*G0_1_0_0_1_0 + 0.019047619047619*G0_1_0_0_1_1 + 0.0126984126984127*G0_1_0_0_1_2 + 0.0126984126984127*G0_1_0_0_2_0 + 0.0126984126984127*G0_1_0_0_2_1 + 0.019047619047619*G0_1_0_0_2_2 + 0.0126984126984127*G0_1_0_1_0_0 + 0.019047619047619*G0_1_0_1_0_1 + 0.0126984126984127*G0_1_0_1_0_2 + 0.019047619047619*G0_1_0_1_1_0 + 0.076190476190476*G0_1_0_1_1_1 + 0.0380952380952381*G0_1_0_1_1_2 + 0.0126984126984127*G0_1_0_1_2_0 + 0.0380952380952381*G0_1_0_1_2_1 + 0.0380952380952381*G0_1_0_1_2_2 + 0.0126984126984127*G0_1_0_2_0_0 + 0.0126984126984127*G0_1_0_2_0_1 + 0.019047619047619*G0_1_0_2_0_2 + 0.0126984126984127*G0_1_0_2_1_0 + 0.0380952380952381*G0_1_0_2_1_1 + 0.0380952380952381*G0_1_0_2_1_2 + 0.019047619047619*G0_1_0_2_2_0 + 0.0380952380952381*G0_1_0_2_2_1 + 0.076190476190476*G0_1_0_2_2_2 - 0.0571428571428572*G0_1_1_0_0_0 - 0.0253968253968254*G0_1_1_0_0_1 - 0.00634920634920635*G0_1_1_0_0_2 - 0.0253968253968254*G0_1_1_0_1_0 - 0.0190476190476191*G0_1_1_0_1_1 - 0.00634920634920635*G0_1_1_0_2_0 + 0.00634920634920635*G0_1_1_0_2_2 - 0.0253968253968254*G0_1_1_1_0_0 - 0.0190476190476191*G0_1_1_1_0_1 - 0.0190476190476191*G0_1_1_1_1_0 + 0.019047619047619*G0_1_1_1_1_2 + 0.019047619047619*G0_1_1_1_2_1 + 0.0253968253968254*G0_1_1_1_2_2 - 0.00634920634920635*G0_1_1_2_0_0 + 0.00634920634920635*G0_1_1_2_0_2 + 0.019047619047619*G0_1_1_2_1_1 + 0.0253968253968254*G0_1_1_2_1_2 + 0.00634920634920634*G0_1_1_2_2_0 + 0.0253968253968254*G0_1_1_2_2_1 + 0.057142857142857*G0_1_1_2_2_2; + A[33] = -A[34] + 0.285714285714286*G0_0_1_0_0_0 + 0.0317460317460318*G0_0_1_0_0_1 + 0.0380952380952381*G0_0_1_0_0_2 + 0.0317460317460318*G0_0_1_0_1_0 - 0.0317460317460317*G0_0_1_0_1_1 + 0.0380952380952381*G0_0_1_0_2_0 + 0.00634920634920635*G0_0_1_0_2_2 + 0.0317460317460318*G0_0_1_1_0_0 - 0.0317460317460317*G0_0_1_1_0_1 - 0.0317460317460317*G0_0_1_1_1_0 - 0.285714285714285*G0_0_1_1_1_1 - 0.0380952380952381*G0_0_1_1_1_2 - 0.0380952380952381*G0_0_1_1_2_1 - 0.00634920634920634*G0_0_1_1_2_2 + 0.0380952380952381*G0_0_1_2_0_0 + 0.00634920634920635*G0_0_1_2_0_2 - 0.0380952380952381*G0_0_1_2_1_1 - 0.00634920634920635*G0_0_1_2_1_2 + 0.00634920634920635*G0_0_1_2_2_0 - 0.00634920634920635*G0_0_1_2_2_1 - 0.0952380952380953*G0_1_1_0_0_0 - 0.0634920634920635*G0_1_1_0_0_1 - 0.019047619047619*G0_1_1_0_0_2 - 0.0634920634920635*G0_1_1_0_1_0 - 0.0952380952380953*G0_1_1_0_1_1 - 0.019047619047619*G0_1_1_0_1_2 - 0.019047619047619*G0_1_1_0_2_0 - 0.019047619047619*G0_1_1_0_2_1 - 0.00634920634920635*G0_1_1_0_2_2 - 0.0634920634920635*G0_1_1_1_0_0 - 0.0952380952380953*G0_1_1_1_0_1 - 0.019047619047619*G0_1_1_1_0_2 - 0.0952380952380953*G0_1_1_1_1_0 - 0.380952380952381*G0_1_1_1_1_1 - 0.0571428571428571*G0_1_1_1_1_2 - 0.019047619047619*G0_1_1_1_2_0 - 0.0571428571428571*G0_1_1_1_2_1 - 0.0126984126984127*G0_1_1_1_2_2 - 0.019047619047619*G0_1_1_2_0_0 - 0.019047619047619*G0_1_1_2_0_1 - 0.00634920634920635*G0_1_1_2_0_2 - 0.019047619047619*G0_1_1_2_1_0 - 0.0571428571428571*G0_1_1_2_1_1 - 0.0126984126984127*G0_1_1_2_1_2 - 0.00634920634920635*G0_1_1_2_2_0 - 0.0126984126984127*G0_1_1_2_2_1 + 0.019047619047619*G0_1_1_2_2_2; + A[21] = -A[33] + 0.0952380952380952*G0_0_0_0_0_0 + 0.019047619047619*G0_0_0_0_0_1 + 0.0634920634920635*G0_0_0_0_0_2 + 0.019047619047619*G0_0_0_0_1_0 + 0.00634920634920635*G0_0_0_0_1_1 + 0.019047619047619*G0_0_0_0_1_2 + 0.0634920634920635*G0_0_0_0_2_0 + 0.019047619047619*G0_0_0_0_2_1 + 0.0952380952380952*G0_0_0_0_2_2 + 0.019047619047619*G0_0_0_1_0_0 + 0.00634920634920635*G0_0_0_1_0_1 + 0.019047619047619*G0_0_0_1_0_2 + 0.00634920634920635*G0_0_0_1_1_0 - 0.0190476190476189*G0_0_0_1_1_1 + 0.0126984126984127*G0_0_0_1_1_2 + 0.019047619047619*G0_0_0_1_2_0 + 0.0126984126984127*G0_0_0_1_2_1 + 0.0571428571428571*G0_0_0_1_2_2 + 0.0634920634920635*G0_0_0_2_0_0 + 0.019047619047619*G0_0_0_2_0_1 + 0.0952380952380952*G0_0_0_2_0_2 + 0.019047619047619*G0_0_0_2_1_0 + 0.0126984126984127*G0_0_0_2_1_1 + 0.0571428571428571*G0_0_0_2_1_2 + 0.0952380952380952*G0_0_0_2_2_0 + 0.0571428571428571*G0_0_0_2_2_1 + 0.38095238095238*G0_0_0_2_2_2 + 0.0571428571428571*G0_0_1_0_0_0 + 0.0126984126984127*G0_0_1_0_0_1 + 0.019047619047619*G0_0_1_0_0_2 + 0.0126984126984127*G0_0_1_0_1_0 - 0.0190476190476191*G0_0_1_0_1_1 + 0.00634920634920634*G0_0_1_0_1_2 + 0.019047619047619*G0_0_1_0_2_0 + 0.00634920634920634*G0_0_1_0_2_1 + 0.019047619047619*G0_0_1_0_2_2 + 0.0126984126984127*G0_0_1_1_0_0 - 0.0190476190476191*G0_0_1_1_0_1 + 0.00634920634920634*G0_0_1_1_0_2 - 0.0190476190476191*G0_0_1_1_1_0 - 0.228571428571428*G0_0_1_1_1_1 - 0.019047619047619*G0_0_1_1_1_2 + 0.00634920634920634*G0_0_1_1_2_0 - 0.019047619047619*G0_0_1_1_2_1 + 0.0126984126984127*G0_0_1_1_2_2 + 0.019047619047619*G0_0_1_2_0_0 + 0.00634920634920634*G0_0_1_2_0_1 + 0.019047619047619*G0_0_1_2_0_2 + 0.00634920634920634*G0_0_1_2_1_0 - 0.019047619047619*G0_0_1_2_1_1 + 0.0126984126984127*G0_0_1_2_1_2 + 0.019047619047619*G0_0_1_2_2_0 + 0.0126984126984127*G0_0_1_2_2_1 + 0.0571428571428569*G0_0_1_2_2_2; + A[0] = A[7] + 0.142857142857143*G0_0_0_0_0_0 + 0.0158730158730159*G0_0_0_0_0_1 + 0.019047619047619*G0_0_0_0_0_2 + 0.0158730158730159*G0_0_0_0_1_0 - 0.0158730158730159*G0_0_0_0_1_1 + 0.019047619047619*G0_0_0_0_2_0 + 0.00317460317460317*G0_0_0_0_2_2 + 0.0158730158730159*G0_0_0_1_0_0 - 0.0158730158730159*G0_0_0_1_0_1 - 0.0158730158730159*G0_0_0_1_1_0 - 0.142857142857143*G0_0_0_1_1_1 - 0.019047619047619*G0_0_0_1_1_2 - 0.019047619047619*G0_0_0_1_2_1 - 0.00317460317460318*G0_0_0_1_2_2 + 0.019047619047619*G0_0_0_2_0_0 + 0.00317460317460317*G0_0_0_2_0_2 - 0.019047619047619*G0_0_0_2_1_1 - 0.00317460317460317*G0_0_0_2_1_2 + 0.00317460317460317*G0_0_0_2_2_0 - 0.00317460317460317*G0_0_0_2_2_1 + 0.164285714285714*G0_0_1_0_0_0 + 0.0261904761904762*G0_0_1_0_0_1 + 0.0261904761904762*G0_0_1_0_0_2 + 0.0261904761904762*G0_0_1_0_1_0 + 0.0103174603174603*G0_0_1_0_1_1 + 0.00515873015873016*G0_0_1_0_1_2 + 0.0261904761904762*G0_0_1_0_2_0 + 0.00515873015873016*G0_0_1_0_2_1 + 0.0103174603174603*G0_0_1_0_2_2 + 0.0261904761904762*G0_0_1_1_0_0 + 0.0103174603174603*G0_0_1_1_0_1 + 0.00515873015873016*G0_0_1_1_0_2 + 0.0103174603174603*G0_0_1_1_1_0 + 0.0214285714285714*G0_0_1_1_1_1 + 0.00714285714285714*G0_0_1_1_1_2 + 0.00515873015873016*G0_0_1_1_2_0 + 0.00714285714285714*G0_0_1_1_2_1 + 0.00714285714285714*G0_0_1_1_2_2 + 0.0261904761904762*G0_0_1_2_0_0 + 0.00515873015873016*G0_0_1_2_0_1 + 0.0103174603174603*G0_0_1_2_0_2 + 0.00515873015873016*G0_0_1_2_1_0 + 0.00714285714285714*G0_0_1_2_1_1 + 0.00714285714285714*G0_0_1_2_1_2 + 0.0103174603174603*G0_0_1_2_2_0 + 0.00714285714285714*G0_0_1_2_2_1 + 0.0214285714285714*G0_0_1_2_2_2 + 0.164285714285714*G0_1_0_0_0_0 + 0.0261904761904762*G0_1_0_0_0_1 + 0.0261904761904762*G0_1_0_0_0_2 + 0.0261904761904762*G0_1_0_0_1_0 + 0.0103174603174603*G0_1_0_0_1_1 + 0.00515873015873016*G0_1_0_0_1_2 + 0.0261904761904762*G0_1_0_0_2_0 + 0.00515873015873016*G0_1_0_0_2_1 + 0.0103174603174603*G0_1_0_0_2_2 + 0.0261904761904762*G0_1_0_1_0_0 + 0.0103174603174603*G0_1_0_1_0_1 + 0.00515873015873016*G0_1_0_1_0_2 + 0.0103174603174603*G0_1_0_1_1_0 + 0.0214285714285714*G0_1_0_1_1_1 + 0.00714285714285714*G0_1_0_1_1_2 + 0.00515873015873016*G0_1_0_1_2_0 + 0.00714285714285714*G0_1_0_1_2_1 + 0.00714285714285714*G0_1_0_1_2_2 + 0.0261904761904762*G0_1_0_2_0_0 + 0.00515873015873016*G0_1_0_2_0_1 + 0.0103174603174603*G0_1_0_2_0_2 + 0.00515873015873016*G0_1_0_2_1_0 + 0.00714285714285714*G0_1_0_2_1_1 + 0.00714285714285714*G0_1_0_2_1_2 + 0.0103174603174603*G0_1_0_2_2_0 + 0.00714285714285714*G0_1_0_2_2_1 + 0.0214285714285714*G0_1_0_2_2_2 + 0.164285714285714*G0_1_1_0_0_0 + 0.0261904761904762*G0_1_1_0_0_1 + 0.0261904761904762*G0_1_1_0_0_2 + 0.0261904761904762*G0_1_1_0_1_0 + 0.0103174603174603*G0_1_1_0_1_1 + 0.00515873015873016*G0_1_1_0_1_2 + 0.0261904761904762*G0_1_1_0_2_0 + 0.00515873015873016*G0_1_1_0_2_1 + 0.0103174603174603*G0_1_1_0_2_2 + 0.0261904761904762*G0_1_1_1_0_0 + 0.0103174603174603*G0_1_1_1_0_1 + 0.00515873015873016*G0_1_1_1_0_2 + 0.0103174603174603*G0_1_1_1_1_0 + 0.0214285714285714*G0_1_1_1_1_1 + 0.00714285714285714*G0_1_1_1_1_2 + 0.00515873015873016*G0_1_1_1_2_0 + 0.00714285714285714*G0_1_1_1_2_1 + 0.00714285714285714*G0_1_1_1_2_2 + 0.0261904761904762*G0_1_1_2_0_0 + 0.00515873015873016*G0_1_1_2_0_1 + 0.0103174603174603*G0_1_1_2_0_2 + 0.00515873015873016*G0_1_1_2_1_0 + 0.00714285714285714*G0_1_1_2_1_1 + 0.00714285714285714*G0_1_1_2_1_2 + 0.0103174603174603*G0_1_1_2_2_0 + 0.00714285714285714*G0_1_1_2_2_1 + 0.0214285714285714*G0_1_1_2_2_2; + A[14] = 0.0214285714285714*G0_1_1_0_0_0 + 0.00714285714285715*G0_1_1_0_0_1 + 0.0103174603174603*G0_1_1_0_0_2 + 0.00714285714285715*G0_1_1_0_1_0 + 0.00714285714285715*G0_1_1_0_1_1 + 0.00515873015873016*G0_1_1_0_1_2 + 0.0103174603174603*G0_1_1_0_2_0 + 0.00515873015873016*G0_1_1_0_2_1 + 0.0261904761904762*G0_1_1_0_2_2 + 0.00714285714285715*G0_1_1_1_0_0 + 0.00714285714285715*G0_1_1_1_0_1 + 0.00515873015873016*G0_1_1_1_0_2 + 0.00714285714285715*G0_1_1_1_1_0 + 0.0214285714285714*G0_1_1_1_1_1 + 0.0103174603174603*G0_1_1_1_1_2 + 0.00515873015873016*G0_1_1_1_2_0 + 0.0103174603174603*G0_1_1_1_2_1 + 0.0261904761904762*G0_1_1_1_2_2 + 0.0103174603174603*G0_1_1_2_0_0 + 0.00515873015873016*G0_1_1_2_0_1 + 0.0261904761904762*G0_1_1_2_0_2 + 0.00515873015873016*G0_1_1_2_1_0 + 0.0103174603174603*G0_1_1_2_1_1 + 0.0261904761904762*G0_1_1_2_1_2 + 0.0261904761904762*G0_1_1_2_2_0 + 0.0261904761904762*G0_1_1_2_2_1 + 0.164285714285714*G0_1_1_2_2_2; + A[10] = -A[9] - 0.0380952380952381*G0_0_1_0_0_0 + 0.0190476190476191*G0_0_1_0_0_1 - 0.00317460317460318*G0_0_1_0_0_2 + 0.0190476190476191*G0_0_1_0_1_0 + 0.0507936507936508*G0_0_1_0_1_1 + 0.00793650793650794*G0_0_1_0_1_2 - 0.00317460317460318*G0_0_1_0_2_0 + 0.00793650793650794*G0_0_1_0_2_1 + 0.00634920634920636*G0_0_1_0_2_2 + 0.0190476190476191*G0_0_1_1_0_0 + 0.0507936507936508*G0_0_1_1_0_1 + 0.00793650793650794*G0_0_1_1_0_2 + 0.0507936507936508*G0_0_1_1_1_0 + 0.247619047619047*G0_0_1_1_1_1 + 0.0349206349206349*G0_0_1_1_1_2 + 0.00793650793650794*G0_0_1_1_2_0 + 0.0349206349206349*G0_0_1_1_2_1 + 0.0126984126984127*G0_0_1_1_2_2 - 0.00317460317460318*G0_0_1_2_0_0 + 0.00793650793650794*G0_0_1_2_0_1 + 0.00634920634920636*G0_0_1_2_0_2 + 0.00793650793650794*G0_0_1_2_1_0 + 0.0349206349206349*G0_0_1_2_1_1 + 0.0126984126984127*G0_0_1_2_1_2 + 0.00634920634920636*G0_0_1_2_2_0 + 0.0126984126984127*G0_0_1_2_2_1 + 0.0476190476190476*G0_0_1_2_2_2; + A[25] = A[10] + 0.0428571428571429*G0_0_1_0_0_0 - 0.00317460317460318*G0_0_1_0_0_1 + 0.00476190476190477*G0_0_1_0_0_2 - 0.00317460317460318*G0_0_1_0_1_0 - 0.00793650793650796*G0_0_1_0_1_1 + 0.00476190476190477*G0_0_1_0_2_0 - 0.00476190476190477*G0_0_1_0_2_2 - 0.00317460317460318*G0_0_1_1_0_0 - 0.00793650793650795*G0_0_1_1_0_1 - 0.00793650793650796*G0_0_1_1_1_0 + 0.00793650793650792*G0_0_1_1_1_2 + 0.00793650793650792*G0_0_1_1_2_1 + 0.00317460317460317*G0_0_1_1_2_2 + 0.00476190476190477*G0_0_1_2_0_0 - 0.00476190476190477*G0_0_1_2_0_2 + 0.00793650793650792*G0_0_1_2_1_1 + 0.00317460317460316*G0_0_1_2_1_2 - 0.00476190476190477*G0_0_1_2_2_0 + 0.00317460317460317*G0_0_1_2_2_1 - 0.0428571428571428*G0_0_1_2_2_2 - 0.0428571428571429*G0_1_0_0_0_0 + 0.00317460317460318*G0_1_0_0_0_1 - 0.00476190476190477*G0_1_0_0_0_2 + 0.00317460317460318*G0_1_0_0_1_0 + 0.00793650793650796*G0_1_0_0_1_1 - 0.00476190476190477*G0_1_0_0_2_0 + 0.00476190476190477*G0_1_0_0_2_2 + 0.00317460317460318*G0_1_0_1_0_0 + 0.00793650793650795*G0_1_0_1_0_1 + 0.00793650793650796*G0_1_0_1_1_0 - 0.00793650793650792*G0_1_0_1_1_2 - 0.00793650793650792*G0_1_0_1_2_1 - 0.00317460317460317*G0_1_0_1_2_2 - 0.00476190476190477*G0_1_0_2_0_0 + 0.00476190476190477*G0_1_0_2_0_2 - 0.00793650793650792*G0_1_0_2_1_1 - 0.00317460317460316*G0_1_0_2_1_2 + 0.00476190476190477*G0_1_0_2_2_0 - 0.00317460317460317*G0_1_0_2_2_1 + 0.0428571428571428*G0_1_0_2_2_2; + A[6] = -A[8] + 0.0404761904761905*G0_0_0_0_0_0 + 0.000793650793650794*G0_0_0_0_0_1 + 0.00873015873015874*G0_0_0_0_0_2 + 0.000793650793650794*G0_0_0_0_1_0 + 0.00079365079365079*G0_0_0_0_1_1 + 0.00119047619047619*G0_0_0_0_1_2 + 0.00873015873015874*G0_0_0_0_2_0 + 0.00119047619047619*G0_0_0_0_2_1 + 0.00396825396825397*G0_0_0_0_2_2 + 0.000793650793650794*G0_0_0_1_0_0 + 0.00079365079365079*G0_0_0_1_0_1 + 0.00119047619047619*G0_0_0_1_0_2 + 0.000793650793650788*G0_0_0_1_1_0 + 0.0404761904761904*G0_0_0_1_1_1 + 0.00873015873015871*G0_0_0_1_1_2 + 0.00119047619047619*G0_0_0_1_2_0 + 0.00873015873015871*G0_0_0_1_2_1 + 0.00396825396825396*G0_0_0_1_2_2 + 0.00873015873015874*G0_0_0_2_0_0 + 0.00119047619047619*G0_0_0_2_0_1 + 0.00396825396825397*G0_0_0_2_0_2 + 0.00119047619047619*G0_0_0_2_1_0 + 0.00873015873015871*G0_0_0_2_1_1 + 0.00396825396825396*G0_0_0_2_1_2 + 0.00396825396825397*G0_0_0_2_2_0 + 0.00396825396825396*G0_0_0_2_2_1 - 0.00238095238095239*G0_0_0_2_2_2 + 0.0428571428571428*G0_0_1_0_0_0 - 0.00317460317460318*G0_0_1_0_0_1 + 0.00476190476190476*G0_0_1_0_0_2 - 0.00317460317460318*G0_0_1_0_1_0 - 0.00793650793650794*G0_0_1_0_1_1 + 0.00476190476190476*G0_0_1_0_2_0 - 0.00476190476190477*G0_0_1_0_2_2 - 0.00317460317460318*G0_0_1_1_0_0 - 0.00793650793650793*G0_0_1_1_0_1 - 0.00793650793650793*G0_0_1_1_1_0 + 0.00793650793650794*G0_0_1_1_1_2 + 0.00793650793650794*G0_0_1_1_2_1 + 0.00317460317460317*G0_0_1_1_2_2 + 0.00476190476190476*G0_0_1_2_0_0 - 0.00476190476190477*G0_0_1_2_0_2 + 0.00793650793650794*G0_0_1_2_1_1 + 0.00317460317460317*G0_0_1_2_1_2 - 0.00476190476190477*G0_0_1_2_2_0 + 0.00317460317460317*G0_0_1_2_2_1 - 0.0428571428571429*G0_0_1_2_2_2; + A[35] = -A[33] + 0.323809523809524*G0_0_0_0_0_0 + 0.0444444444444445*G0_0_0_0_0_1 + 0.0761904761904763*G0_0_0_0_0_2 + 0.0444444444444445*G0_0_0_0_1_0 + 0.0317460317460318*G0_0_0_0_1_1 + 0.0126984126984127*G0_0_0_0_1_2 + 0.0761904761904763*G0_0_0_0_2_0 + 0.0126984126984127*G0_0_0_0_2_1 + 0.0444444444444445*G0_0_0_0_2_2 + 0.0444444444444445*G0_0_0_1_0_0 + 0.0317460317460318*G0_0_0_1_0_1 + 0.0126984126984127*G0_0_0_1_0_2 + 0.0317460317460318*G0_0_0_1_1_0 + 0.209523809523809*G0_0_0_1_1_1 + 0.0253968253968254*G0_0_0_1_1_2 + 0.0126984126984127*G0_0_0_1_2_0 + 0.0253968253968254*G0_0_0_1_2_1 + 0.00634920634920636*G0_0_0_1_2_2 + 0.0761904761904763*G0_0_0_2_0_0 + 0.0126984126984127*G0_0_0_2_0_1 + 0.0444444444444445*G0_0_0_2_0_2 + 0.0126984126984127*G0_0_0_2_1_0 + 0.0253968253968254*G0_0_0_2_1_1 + 0.00634920634920635*G0_0_0_2_1_2 + 0.0444444444444445*G0_0_0_2_2_0 + 0.00634920634920635*G0_0_0_2_2_1 + 0.0380952380952382*G0_0_0_2_2_2 - 0.0571428571428571*G0_1_0_0_0_0 - 0.0126984126984127*G0_1_0_0_0_1 - 0.019047619047619*G0_1_0_0_0_2 - 0.0126984126984127*G0_1_0_0_1_0 + 0.0190476190476191*G0_1_0_0_1_1 - 0.00634920634920635*G0_1_0_0_1_2 - 0.019047619047619*G0_1_0_0_2_0 - 0.00634920634920634*G0_1_0_0_2_1 - 0.019047619047619*G0_1_0_0_2_2 - 0.0126984126984127*G0_1_0_1_0_0 + 0.0190476190476191*G0_1_0_1_0_1 - 0.00634920634920634*G0_1_0_1_0_2 + 0.0190476190476191*G0_1_0_1_1_0 + 0.228571428571428*G0_1_0_1_1_1 + 0.019047619047619*G0_1_0_1_1_2 - 0.00634920634920634*G0_1_0_1_2_0 + 0.019047619047619*G0_1_0_1_2_1 - 0.0126984126984127*G0_1_0_1_2_2 - 0.019047619047619*G0_1_0_2_0_0 - 0.00634920634920635*G0_1_0_2_0_1 - 0.019047619047619*G0_1_0_2_0_2 - 0.00634920634920634*G0_1_0_2_1_0 + 0.019047619047619*G0_1_0_2_1_1 - 0.0126984126984127*G0_1_0_2_1_2 - 0.019047619047619*G0_1_0_2_2_0 - 0.0126984126984127*G0_1_0_2_2_1 - 0.057142857142857*G0_1_0_2_2_2; + A[23] = A[33] - 0.0571428571428571*G0_0_1_0_0_0 - 0.0126984126984127*G0_0_1_0_0_1 - 0.019047619047619*G0_0_1_0_0_2 - 0.0126984126984127*G0_0_1_0_1_0 + 0.0190476190476191*G0_0_1_0_1_1 - 0.00634920634920635*G0_0_1_0_1_2 - 0.019047619047619*G0_0_1_0_2_0 - 0.00634920634920635*G0_0_1_0_2_1 - 0.019047619047619*G0_0_1_0_2_2 - 0.0126984126984127*G0_0_1_1_0_0 + 0.0190476190476191*G0_0_1_1_0_1 - 0.00634920634920635*G0_0_1_1_0_2 + 0.0190476190476191*G0_0_1_1_1_0 + 0.228571428571428*G0_0_1_1_1_1 + 0.019047619047619*G0_0_1_1_1_2 - 0.00634920634920635*G0_0_1_1_2_0 + 0.019047619047619*G0_0_1_1_2_1 - 0.0126984126984127*G0_0_1_1_2_2 - 0.019047619047619*G0_0_1_2_0_0 - 0.00634920634920635*G0_0_1_2_0_1 - 0.019047619047619*G0_0_1_2_0_2 - 0.00634920634920635*G0_0_1_2_1_0 + 0.019047619047619*G0_0_1_2_1_1 - 0.0126984126984127*G0_0_1_2_1_2 - 0.019047619047619*G0_0_1_2_2_0 - 0.0126984126984127*G0_0_1_2_2_1 - 0.057142857142857*G0_0_1_2_2_2 + 0.0571428571428571*G0_1_0_0_0_0 + 0.0126984126984127*G0_1_0_0_0_1 + 0.019047619047619*G0_1_0_0_0_2 + 0.0126984126984127*G0_1_0_0_1_0 - 0.0190476190476191*G0_1_0_0_1_1 + 0.00634920634920635*G0_1_0_0_1_2 + 0.019047619047619*G0_1_0_0_2_0 + 0.00634920634920635*G0_1_0_0_2_1 + 0.019047619047619*G0_1_0_0_2_2 + 0.0126984126984127*G0_1_0_1_0_0 - 0.0190476190476191*G0_1_0_1_0_1 + 0.00634920634920635*G0_1_0_1_0_2 - 0.0190476190476191*G0_1_0_1_1_0 - 0.228571428571428*G0_1_0_1_1_1 - 0.019047619047619*G0_1_0_1_1_2 + 0.00634920634920635*G0_1_0_1_2_0 - 0.019047619047619*G0_1_0_1_2_1 + 0.0126984126984127*G0_1_0_1_2_2 + 0.019047619047619*G0_1_0_2_0_0 + 0.00634920634920635*G0_1_0_2_0_1 + 0.019047619047619*G0_1_0_2_0_2 + 0.00634920634920635*G0_1_0_2_1_0 - 0.019047619047619*G0_1_0_2_1_1 + 0.0126984126984127*G0_1_0_2_1_2 + 0.019047619047619*G0_1_0_2_2_0 + 0.0126984126984127*G0_1_0_2_2_1 + 0.057142857142857*G0_1_0_2_2_2; + A[29] = -A[23] + 0.285714285714286*G0_1_0_0_0_0 + 0.0317460317460318*G0_1_0_0_0_1 + 0.0380952380952381*G0_1_0_0_0_2 + 0.0317460317460318*G0_1_0_0_1_0 - 0.0317460317460317*G0_1_0_0_1_1 + 0.0380952380952381*G0_1_0_0_2_0 + 0.00634920634920635*G0_1_0_0_2_2 + 0.0317460317460318*G0_1_0_1_0_0 - 0.0317460317460317*G0_1_0_1_0_1 - 0.0317460317460317*G0_1_0_1_1_0 - 0.285714285714285*G0_1_0_1_1_1 - 0.0380952380952381*G0_1_0_1_1_2 - 0.0380952380952381*G0_1_0_1_2_1 - 0.00634920634920634*G0_1_0_1_2_2 + 0.0380952380952381*G0_1_0_2_0_0 + 0.00634920634920635*G0_1_0_2_0_2 - 0.0380952380952381*G0_1_0_2_1_1 - 0.00634920634920635*G0_1_0_2_1_2 + 0.00634920634920635*G0_1_0_2_2_0 - 0.00634920634920635*G0_1_0_2_2_1 - 0.0952380952380953*G0_1_1_0_0_0 - 0.0634920634920635*G0_1_1_0_0_1 - 0.019047619047619*G0_1_1_0_0_2 - 0.0634920634920635*G0_1_1_0_1_0 - 0.0952380952380953*G0_1_1_0_1_1 - 0.019047619047619*G0_1_1_0_1_2 - 0.019047619047619*G0_1_1_0_2_0 - 0.019047619047619*G0_1_1_0_2_1 - 0.00634920634920635*G0_1_1_0_2_2 - 0.0634920634920635*G0_1_1_1_0_0 - 0.0952380952380953*G0_1_1_1_0_1 - 0.019047619047619*G0_1_1_1_0_2 - 0.0952380952380953*G0_1_1_1_1_0 - 0.380952380952381*G0_1_1_1_1_1 - 0.0571428571428571*G0_1_1_1_1_2 - 0.019047619047619*G0_1_1_1_2_0 - 0.0571428571428571*G0_1_1_1_2_1 - 0.0126984126984127*G0_1_1_1_2_2 - 0.019047619047619*G0_1_1_2_0_0 - 0.019047619047619*G0_1_1_2_0_1 - 0.00634920634920635*G0_1_1_2_0_2 - 0.019047619047619*G0_1_1_2_1_0 - 0.0571428571428571*G0_1_1_2_1_1 - 0.0126984126984127*G0_1_1_2_1_2 - 0.00634920634920635*G0_1_1_2_2_0 - 0.0126984126984127*G0_1_1_2_2_1 + 0.019047619047619*G0_1_1_2_2_2; + A[22] = -A[34] - 0.0952380952380952*G0_0_0_0_0_0 - 0.019047619047619*G0_0_0_0_0_1 - 0.0634920634920635*G0_0_0_0_0_2 - 0.019047619047619*G0_0_0_0_1_0 - 0.00634920634920635*G0_0_0_0_1_1 - 0.019047619047619*G0_0_0_0_1_2 - 0.0634920634920635*G0_0_0_0_2_0 - 0.019047619047619*G0_0_0_0_2_1 - 0.0952380952380952*G0_0_0_0_2_2 - 0.019047619047619*G0_0_0_1_0_0 - 0.00634920634920635*G0_0_0_1_0_1 - 0.019047619047619*G0_0_0_1_0_2 - 0.00634920634920635*G0_0_0_1_1_0 + 0.0190476190476189*G0_0_0_1_1_1 - 0.0126984126984127*G0_0_0_1_1_2 - 0.019047619047619*G0_0_0_1_2_0 - 0.0126984126984127*G0_0_0_1_2_1 - 0.0571428571428571*G0_0_0_1_2_2 - 0.0634920634920635*G0_0_0_2_0_0 - 0.019047619047619*G0_0_0_2_0_1 - 0.0952380952380952*G0_0_0_2_0_2 - 0.019047619047619*G0_0_0_2_1_0 - 0.0126984126984127*G0_0_0_2_1_1 - 0.0571428571428571*G0_0_0_2_1_2 - 0.0952380952380952*G0_0_0_2_2_0 - 0.0571428571428571*G0_0_0_2_2_1 - 0.38095238095238*G0_0_0_2_2_2 + 0.285714285714286*G0_0_1_0_0_0 + 0.0380952380952381*G0_0_1_0_0_1 + 0.0317460317460318*G0_0_1_0_0_2 + 0.0380952380952381*G0_0_1_0_1_0 + 0.00634920634920633*G0_0_1_0_1_1 + 0.0317460317460318*G0_0_1_0_2_0 - 0.0317460317460317*G0_0_1_0_2_2 + 0.0380952380952381*G0_0_1_1_0_0 + 0.00634920634920633*G0_0_1_1_0_1 + 0.00634920634920633*G0_0_1_1_1_0 - 0.00634920634920636*G0_0_1_1_1_2 - 0.00634920634920636*G0_0_1_1_2_1 - 0.0380952380952381*G0_0_1_1_2_2 + 0.0317460317460318*G0_0_1_2_0_0 - 0.0317460317460317*G0_0_1_2_0_2 - 0.00634920634920636*G0_0_1_2_1_1 - 0.0380952380952381*G0_0_1_2_1_2 - 0.0317460317460317*G0_0_1_2_2_0 - 0.0380952380952381*G0_0_1_2_2_1 - 0.285714285714285*G0_0_1_2_2_2; + A[28] = -A[22] - 0.057142857142857*G0_1_0_0_0_0 - 0.019047619047619*G0_1_0_0_0_1 - 0.0126984126984127*G0_1_0_0_0_2 - 0.019047619047619*G0_1_0_0_1_0 - 0.019047619047619*G0_1_0_0_1_1 - 0.00634920634920634*G0_1_0_0_1_2 - 0.0126984126984127*G0_1_0_0_2_0 - 0.00634920634920634*G0_1_0_0_2_1 + 0.0190476190476191*G0_1_0_0_2_2 - 0.019047619047619*G0_1_0_1_0_0 - 0.019047619047619*G0_1_0_1_0_1 - 0.00634920634920634*G0_1_0_1_0_2 - 0.019047619047619*G0_1_0_1_1_0 - 0.057142857142857*G0_1_0_1_1_1 - 0.0126984126984127*G0_1_0_1_1_2 - 0.00634920634920634*G0_1_0_1_2_0 - 0.0126984126984127*G0_1_0_1_2_1 + 0.019047619047619*G0_1_0_1_2_2 - 0.0126984126984127*G0_1_0_2_0_0 - 0.00634920634920634*G0_1_0_2_0_1 + 0.019047619047619*G0_1_0_2_0_2 - 0.00634920634920634*G0_1_0_2_1_0 - 0.0126984126984127*G0_1_0_2_1_1 + 0.019047619047619*G0_1_0_2_1_2 + 0.0190476190476191*G0_1_0_2_2_0 + 0.019047619047619*G0_1_0_2_2_1 + 0.228571428571428*G0_1_0_2_2_2 + 0.323809523809524*G0_1_1_0_0_0 + 0.0761904761904763*G0_1_1_0_0_1 + 0.0444444444444445*G0_1_1_0_0_2 + 0.0761904761904763*G0_1_1_0_1_0 + 0.0444444444444445*G0_1_1_0_1_1 + 0.0126984126984127*G0_1_1_0_1_2 + 0.0444444444444445*G0_1_1_0_2_0 + 0.0126984126984127*G0_1_1_0_2_1 + 0.0317460317460318*G0_1_1_0_2_2 + 0.0761904761904763*G0_1_1_1_0_0 + 0.0444444444444445*G0_1_1_1_0_1 + 0.0126984126984127*G0_1_1_1_0_2 + 0.0444444444444445*G0_1_1_1_1_0 + 0.0380952380952383*G0_1_1_1_1_1 + 0.00634920634920636*G0_1_1_1_1_2 + 0.0126984126984127*G0_1_1_1_2_0 + 0.00634920634920636*G0_1_1_1_2_1 + 0.0253968253968254*G0_1_1_1_2_2 + 0.0444444444444445*G0_1_1_2_0_0 + 0.0126984126984127*G0_1_1_2_0_1 + 0.0317460317460318*G0_1_1_2_0_2 + 0.0126984126984127*G0_1_1_2_1_0 + 0.00634920634920636*G0_1_1_2_1_1 + 0.0253968253968254*G0_1_1_2_1_2 + 0.0317460317460318*G0_1_1_2_2_0 + 0.0253968253968254*G0_1_1_2_2_1 + 0.209523809523809*G0_1_1_2_2_2; + A[19] = -A[25] - 0.0380952380952381*G0_1_0_0_0_0 + 0.0190476190476191*G0_1_0_0_0_1 - 0.00317460317460318*G0_1_0_0_0_2 + 0.0190476190476191*G0_1_0_0_1_0 + 0.0507936507936508*G0_1_0_0_1_1 + 0.00793650793650794*G0_1_0_0_1_2 - 0.00317460317460318*G0_1_0_0_2_0 + 0.00793650793650794*G0_1_0_0_2_1 + 0.00634920634920636*G0_1_0_0_2_2 + 0.0190476190476191*G0_1_0_1_0_0 + 0.0507936507936508*G0_1_0_1_0_1 + 0.00793650793650794*G0_1_0_1_0_2 + 0.0507936507936508*G0_1_0_1_1_0 + 0.247619047619047*G0_1_0_1_1_1 + 0.0349206349206349*G0_1_0_1_1_2 + 0.00793650793650794*G0_1_0_1_2_0 + 0.0349206349206349*G0_1_0_1_2_1 + 0.0126984126984127*G0_1_0_1_2_2 - 0.00317460317460318*G0_1_0_2_0_0 + 0.00793650793650794*G0_1_0_2_0_1 + 0.00634920634920636*G0_1_0_2_0_2 + 0.00793650793650794*G0_1_0_2_1_0 + 0.0349206349206349*G0_1_0_2_1_1 + 0.0126984126984127*G0_1_0_2_1_2 + 0.00634920634920636*G0_1_0_2_2_0 + 0.0126984126984127*G0_1_0_2_2_1 + 0.0476190476190476*G0_1_0_2_2_2; + A[18] = -A[19] - 0.0571428571428571*G0_0_0_0_0_0 - 0.00634920634920634*G0_0_0_0_0_1 - 0.0253968253968254*G0_0_0_0_0_2 - 0.00634920634920634*G0_0_0_0_1_0 + 0.00634920634920634*G0_0_0_0_1_1 - 0.0253968253968254*G0_0_0_0_2_0 - 0.0190476190476191*G0_0_0_0_2_2 - 0.00634920634920634*G0_0_0_1_0_0 + 0.00634920634920634*G0_0_0_1_0_1 + 0.00634920634920634*G0_0_0_1_1_0 + 0.057142857142857*G0_0_0_1_1_1 + 0.0253968253968254*G0_0_0_1_1_2 + 0.0253968253968254*G0_0_0_1_2_1 + 0.019047619047619*G0_0_0_1_2_2 - 0.0253968253968254*G0_0_0_2_0_0 - 0.0190476190476191*G0_0_0_2_0_2 + 0.0253968253968254*G0_0_0_2_1_1 + 0.019047619047619*G0_0_0_2_1_2 - 0.0190476190476191*G0_0_0_2_2_0 + 0.019047619047619*G0_0_0_2_2_1 - 0.0428571428571428*G0_0_1_0_0_0 - 0.00793650793650792*G0_0_1_0_0_1 - 0.0158730158730159*G0_0_1_0_0_2 - 0.00793650793650792*G0_0_1_0_1_0 - 0.00158730158730158*G0_0_1_0_1_1 - 0.00158730158730158*G0_0_1_0_1_2 - 0.0158730158730159*G0_0_1_0_2_0 - 0.00158730158730158*G0_0_1_0_2_1 - 0.00476190476190476*G0_0_1_0_2_2 - 0.00793650793650792*G0_0_1_1_0_0 - 0.00158730158730158*G0_0_1_1_0_1 - 0.00158730158730158*G0_0_1_1_0_2 - 0.00158730158730158*G0_0_1_1_1_0 + 0.0142857142857143*G0_0_1_1_1_1 + 0.00952380952380952*G0_0_1_1_1_2 - 0.00158730158730158*G0_0_1_1_2_0 + 0.00952380952380952*G0_0_1_1_2_1 + 0.0142857142857143*G0_0_1_1_2_2 - 0.0158730158730159*G0_0_1_2_0_0 - 0.00158730158730158*G0_0_1_2_0_1 - 0.00476190476190476*G0_0_1_2_0_2 - 0.00158730158730158*G0_0_1_2_1_0 + 0.00952380952380952*G0_0_1_2_1_1 + 0.0142857142857143*G0_0_1_2_1_2 - 0.00476190476190476*G0_0_1_2_2_0 + 0.0142857142857143*G0_0_1_2_2_1 + 0.057142857142857*G0_0_1_2_2_2 - 0.0380952380952381*G0_1_0_0_0_0 - 0.00634920634920634*G0_1_0_0_0_2 + 0.0380952380952381*G0_1_0_0_1_1 + 0.00634920634920635*G0_1_0_0_1_2 - 0.00634920634920634*G0_1_0_0_2_0 + 0.00634920634920635*G0_1_0_0_2_1 + 0.0380952380952381*G0_1_0_1_0_1 + 0.00634920634920635*G0_1_0_1_0_2 + 0.0380952380952381*G0_1_0_1_1_0 + 0.304761904761904*G0_1_0_1_1_1 + 0.0571428571428571*G0_1_0_1_1_2 + 0.00634920634920635*G0_1_0_1_2_0 + 0.0571428571428571*G0_1_0_1_2_1 + 0.0253968253968254*G0_1_0_1_2_2 - 0.00634920634920634*G0_1_0_2_0_0 + 0.00634920634920635*G0_1_0_2_0_1 + 0.00634920634920635*G0_1_0_2_1_0 + 0.0571428571428571*G0_1_0_2_1_1 + 0.0253968253968254*G0_1_0_2_1_2 + 0.0253968253968254*G0_1_0_2_2_1 + 0.019047619047619*G0_1_0_2_2_2 - 0.0428571428571428*G0_1_1_0_0_0 - 0.0158730158730159*G0_1_1_0_0_1 - 0.00793650793650793*G0_1_1_0_0_2 - 0.0158730158730159*G0_1_1_0_1_0 - 0.00476190476190476*G0_1_1_0_1_1 - 0.00158730158730158*G0_1_1_0_1_2 - 0.00793650793650793*G0_1_1_0_2_0 - 0.00158730158730158*G0_1_1_0_2_1 - 0.00158730158730159*G0_1_1_0_2_2 - 0.0158730158730159*G0_1_1_1_0_0 - 0.00476190476190476*G0_1_1_1_0_1 - 0.00158730158730158*G0_1_1_1_0_2 - 0.00476190476190476*G0_1_1_1_1_0 + 0.0571428571428571*G0_1_1_1_1_1 + 0.0142857142857143*G0_1_1_1_1_2 - 0.00158730158730158*G0_1_1_1_2_0 + 0.0142857142857143*G0_1_1_1_2_1 + 0.00952380952380952*G0_1_1_1_2_2 - 0.00793650793650793*G0_1_1_2_0_0 - 0.00158730158730158*G0_1_1_2_0_1 - 0.00158730158730159*G0_1_1_2_0_2 - 0.00158730158730158*G0_1_1_2_1_0 + 0.0142857142857143*G0_1_1_2_1_1 + 0.00952380952380951*G0_1_1_2_1_2 - 0.00158730158730159*G0_1_1_2_2_0 + 0.00952380952380951*G0_1_1_2_2_1 + 0.0142857142857143*G0_1_1_2_2_2; + A[31] = -A[19] - 0.0761904761904762*G0_0_0_0_0_0 - 0.00952380952380954*G0_0_0_0_0_1 - 0.0253968253968254*G0_0_0_0_0_2 - 0.00952380952380954*G0_0_0_0_1_0 - 0.0190476190476191*G0_0_0_0_1_1 - 0.00476190476190477*G0_0_0_0_1_2 - 0.0253968253968254*G0_0_0_0_2_0 - 0.00476190476190477*G0_0_0_0_2_1 - 0.0253968253968254*G0_0_0_0_2_2 - 0.00952380952380954*G0_0_0_1_0_0 - 0.0190476190476191*G0_0_0_1_0_1 - 0.00476190476190477*G0_0_0_1_0_2 - 0.0190476190476191*G0_0_0_1_1_0 - 0.161904761904762*G0_0_0_1_1_1 - 0.019047619047619*G0_0_0_1_1_2 - 0.00476190476190477*G0_0_0_1_2_0 - 0.019047619047619*G0_0_0_1_2_1 - 0.00952380952380952*G0_0_0_1_2_2 - 0.0253968253968254*G0_0_0_2_0_0 - 0.00476190476190477*G0_0_0_2_0_1 - 0.0253968253968254*G0_0_0_2_0_2 - 0.00476190476190477*G0_0_0_2_1_0 - 0.019047619047619*G0_0_0_2_1_1 - 0.00952380952380952*G0_0_0_2_1_2 - 0.0253968253968254*G0_0_0_2_2_0 - 0.00952380952380952*G0_0_0_2_2_1 - 0.0761904761904762*G0_0_0_2_2_2; + A[3] = A[18] - 0.00793650793650795*G0_0_1_0_0_1 + 0.00793650793650794*G0_0_1_0_0_2 - 0.00793650793650795*G0_0_1_0_1_0 - 0.00317460317460319*G0_0_1_0_1_1 + 0.00793650793650794*G0_0_1_0_2_0 + 0.00317460317460318*G0_0_1_0_2_2 - 0.00793650793650795*G0_0_1_1_0_0 - 0.00317460317460319*G0_0_1_1_0_1 - 0.00317460317460319*G0_0_1_1_1_0 + 0.0428571428571427*G0_0_1_1_1_1 + 0.00476190476190475*G0_0_1_1_1_2 + 0.00476190476190474*G0_0_1_1_2_1 - 0.00476190476190476*G0_0_1_1_2_2 + 0.00793650793650794*G0_0_1_2_0_0 + 0.00317460317460318*G0_0_1_2_0_2 + 0.00476190476190474*G0_0_1_2_1_1 - 0.00476190476190476*G0_0_1_2_1_2 + 0.00317460317460318*G0_0_1_2_2_0 - 0.00476190476190476*G0_0_1_2_2_1 - 0.0428571428571428*G0_0_1_2_2_2 + 0.00793650793650795*G0_1_0_0_0_1 - 0.00793650793650794*G0_1_0_0_0_2 + 0.00793650793650795*G0_1_0_0_1_0 + 0.00317460317460319*G0_1_0_0_1_1 - 0.00793650793650794*G0_1_0_0_2_0 - 0.00317460317460318*G0_1_0_0_2_2 + 0.00793650793650795*G0_1_0_1_0_0 + 0.00317460317460319*G0_1_0_1_0_1 + 0.00317460317460319*G0_1_0_1_1_0 - 0.0428571428571427*G0_1_0_1_1_1 - 0.00476190476190475*G0_1_0_1_1_2 - 0.00476190476190475*G0_1_0_1_2_1 + 0.00476190476190476*G0_1_0_1_2_2 - 0.00793650793650794*G0_1_0_2_0_0 - 0.00317460317460318*G0_1_0_2_0_2 - 0.00476190476190475*G0_1_0_2_1_1 + 0.00476190476190476*G0_1_0_2_1_2 - 0.00317460317460318*G0_1_0_2_2_0 + 0.00476190476190476*G0_1_0_2_2_1 + 0.0428571428571428*G0_1_0_2_2_2; + A[24] = -A[18] - 0.247619047619048*G0_1_0_0_0_0 - 0.0507936507936508*G0_1_0_0_0_1 - 0.0349206349206349*G0_1_0_0_0_2 - 0.0507936507936508*G0_1_0_0_1_0 - 0.0190476190476191*G0_1_0_0_1_1 - 0.00793650793650794*G0_1_0_0_1_2 - 0.0349206349206349*G0_1_0_0_2_0 - 0.00793650793650794*G0_1_0_0_2_1 - 0.0126984126984127*G0_1_0_0_2_2 - 0.0507936507936508*G0_1_0_1_0_0 - 0.0190476190476191*G0_1_0_1_0_1 - 0.00793650793650794*G0_1_0_1_0_2 - 0.0190476190476191*G0_1_0_1_1_0 + 0.0380952380952379*G0_1_0_1_1_1 + 0.00317460317460316*G0_1_0_1_1_2 - 0.00793650793650794*G0_1_0_1_2_0 + 0.00317460317460316*G0_1_0_1_2_1 - 0.00634920634920635*G0_1_0_1_2_2 - 0.0349206349206349*G0_1_0_2_0_0 - 0.00793650793650794*G0_1_0_2_0_1 - 0.0126984126984127*G0_1_0_2_0_2 - 0.00793650793650794*G0_1_0_2_1_0 + 0.00317460317460316*G0_1_0_2_1_1 - 0.00634920634920635*G0_1_0_2_1_2 - 0.0126984126984127*G0_1_0_2_2_0 - 0.00634920634920635*G0_1_0_2_2_1 - 0.0476190476190476*G0_1_0_2_2_2 - 0.247619047619048*G0_1_1_0_0_0 - 0.0507936507936508*G0_1_1_0_0_1 - 0.0349206349206349*G0_1_1_0_0_2 - 0.0507936507936508*G0_1_1_0_1_0 - 0.0190476190476191*G0_1_1_0_1_1 - 0.00793650793650793*G0_1_1_0_1_2 - 0.0349206349206349*G0_1_1_0_2_0 - 0.00793650793650794*G0_1_1_0_2_1 - 0.0126984126984127*G0_1_1_0_2_2 - 0.0507936507936508*G0_1_1_1_0_0 - 0.0190476190476191*G0_1_1_1_0_1 - 0.00793650793650793*G0_1_1_1_0_2 - 0.0190476190476191*G0_1_1_1_1_0 + 0.038095238095238*G0_1_1_1_1_1 + 0.00317460317460317*G0_1_1_1_1_2 - 0.00793650793650793*G0_1_1_1_2_0 + 0.00317460317460317*G0_1_1_1_2_1 - 0.00634920634920635*G0_1_1_1_2_2 - 0.0349206349206349*G0_1_1_2_0_0 - 0.00793650793650794*G0_1_1_2_0_1 - 0.0126984126984127*G0_1_1_2_0_2 - 0.00793650793650793*G0_1_1_2_1_0 + 0.00317460317460317*G0_1_1_2_1_1 - 0.00634920634920635*G0_1_1_2_1_2 - 0.0126984126984127*G0_1_1_2_2_0 - 0.00634920634920635*G0_1_1_2_2_1 - 0.0476190476190476*G0_1_1_2_2_2; + A[30] = -A[18] - 0.247619047619048*G0_0_0_0_0_0 - 0.0349206349206349*G0_0_0_0_0_1 - 0.0507936507936508*G0_0_0_0_0_2 - 0.0349206349206349*G0_0_0_0_1_0 - 0.0126984126984127*G0_0_0_0_1_1 - 0.00793650793650793*G0_0_0_0_1_2 - 0.0507936507936508*G0_0_0_0_2_0 - 0.00793650793650793*G0_0_0_0_2_1 - 0.0190476190476191*G0_0_0_0_2_2 - 0.0349206349206349*G0_0_0_1_0_0 - 0.0126984126984127*G0_0_0_1_0_1 - 0.00793650793650793*G0_0_0_1_0_2 - 0.0126984126984127*G0_0_0_1_1_0 - 0.0476190476190475*G0_0_0_1_1_1 - 0.00634920634920633*G0_0_0_1_1_2 - 0.00793650793650793*G0_0_0_1_2_0 - 0.00634920634920633*G0_0_0_1_2_1 + 0.00317460317460318*G0_0_0_1_2_2 - 0.0507936507936508*G0_0_0_2_0_0 - 0.00793650793650793*G0_0_0_2_0_1 - 0.019047619047619*G0_0_0_2_0_2 - 0.00793650793650793*G0_0_0_2_1_0 - 0.00634920634920633*G0_0_0_2_1_1 + 0.00317460317460318*G0_0_0_2_1_2 - 0.019047619047619*G0_0_0_2_2_0 + 0.00317460317460318*G0_0_0_2_2_1 + 0.038095238095238*G0_0_0_2_2_2 - 0.247619047619048*G0_0_1_0_0_0 - 0.0349206349206349*G0_0_1_0_0_1 - 0.0507936507936508*G0_0_1_0_0_2 - 0.0349206349206349*G0_0_1_0_1_0 - 0.0126984126984127*G0_0_1_0_1_1 - 0.00793650793650794*G0_0_1_0_1_2 - 0.0507936507936508*G0_0_1_0_2_0 - 0.00793650793650794*G0_0_1_0_2_1 - 0.0190476190476191*G0_0_1_0_2_2 - 0.0349206349206349*G0_0_1_1_0_0 - 0.0126984126984127*G0_0_1_1_0_1 - 0.00793650793650794*G0_0_1_1_0_2 - 0.0126984126984127*G0_0_1_1_1_0 - 0.0476190476190476*G0_0_1_1_1_1 - 0.00634920634920634*G0_0_1_1_1_2 - 0.00793650793650794*G0_0_1_1_2_0 - 0.00634920634920634*G0_0_1_1_2_1 + 0.00317460317460317*G0_0_1_1_2_2 - 0.0507936507936508*G0_0_1_2_0_0 - 0.00793650793650794*G0_0_1_2_0_1 - 0.0190476190476191*G0_0_1_2_0_2 - 0.00793650793650794*G0_0_1_2_1_0 - 0.00634920634920634*G0_0_1_2_1_1 + 0.00317460317460317*G0_0_1_2_1_2 - 0.0190476190476191*G0_0_1_2_2_0 + 0.00317460317460317*G0_0_1_2_2_1 + 0.038095238095238*G0_0_1_2_2_2; + A[4] = -A[3] - 0.247619047619048*G0_0_1_0_0_0 - 0.0507936507936508*G0_0_1_0_0_1 - 0.0349206349206349*G0_0_1_0_0_2 - 0.0507936507936508*G0_0_1_0_1_0 - 0.0190476190476191*G0_0_1_0_1_1 - 0.00793650793650794*G0_0_1_0_1_2 - 0.0349206349206349*G0_0_1_0_2_0 - 0.00793650793650794*G0_0_1_0_2_1 - 0.0126984126984127*G0_0_1_0_2_2 - 0.0507936507936508*G0_0_1_1_0_0 - 0.0190476190476191*G0_0_1_1_0_1 - 0.00793650793650794*G0_0_1_1_0_2 - 0.0190476190476191*G0_0_1_1_1_0 + 0.0380952380952379*G0_0_1_1_1_1 + 0.00317460317460316*G0_0_1_1_1_2 - 0.00793650793650794*G0_0_1_1_2_0 + 0.00317460317460316*G0_0_1_1_2_1 - 0.00634920634920635*G0_0_1_1_2_2 - 0.0349206349206349*G0_0_1_2_0_0 - 0.00793650793650794*G0_0_1_2_0_1 - 0.0126984126984127*G0_0_1_2_0_2 - 0.00793650793650794*G0_0_1_2_1_0 + 0.00317460317460316*G0_0_1_2_1_1 - 0.00634920634920635*G0_0_1_2_1_2 - 0.0126984126984127*G0_0_1_2_2_0 - 0.00634920634920635*G0_0_1_2_2_1 - 0.0476190476190476*G0_0_1_2_2_2 - 0.247619047619048*G0_1_1_0_0_0 - 0.0507936507936508*G0_1_1_0_0_1 - 0.0349206349206349*G0_1_1_0_0_2 - 0.0507936507936508*G0_1_1_0_1_0 - 0.019047619047619*G0_1_1_0_1_1 - 0.00793650793650793*G0_1_1_0_1_2 - 0.0349206349206349*G0_1_1_0_2_0 - 0.00793650793650793*G0_1_1_0_2_1 - 0.0126984126984127*G0_1_1_0_2_2 - 0.0507936507936508*G0_1_1_1_0_0 - 0.019047619047619*G0_1_1_1_0_1 - 0.00793650793650793*G0_1_1_1_0_2 - 0.0190476190476191*G0_1_1_1_1_0 + 0.038095238095238*G0_1_1_1_1_1 + 0.00317460317460318*G0_1_1_1_1_2 - 0.00793650793650793*G0_1_1_1_2_0 + 0.00317460317460317*G0_1_1_1_2_1 - 0.00634920634920635*G0_1_1_1_2_2 - 0.0349206349206349*G0_1_1_2_0_0 - 0.00793650793650793*G0_1_1_2_0_1 - 0.0126984126984127*G0_1_1_2_0_2 - 0.00793650793650793*G0_1_1_2_1_0 + 0.00317460317460317*G0_1_1_2_1_1 - 0.00634920634920635*G0_1_1_2_1_2 - 0.0126984126984127*G0_1_1_2_2_0 - 0.00634920634920635*G0_1_1_2_2_1 - 0.0476190476190476*G0_1_1_2_2_2; + A[5] = -A[3] - 0.247619047619048*G0_0_0_0_0_0 - 0.0349206349206349*G0_0_0_0_0_1 - 0.0507936507936508*G0_0_0_0_0_2 - 0.0349206349206349*G0_0_0_0_1_0 - 0.0126984126984127*G0_0_0_0_1_1 - 0.00793650793650793*G0_0_0_0_1_2 - 0.0507936507936508*G0_0_0_0_2_0 - 0.00793650793650793*G0_0_0_0_2_1 - 0.0190476190476191*G0_0_0_0_2_2 - 0.0349206349206349*G0_0_0_1_0_0 - 0.0126984126984127*G0_0_0_1_0_1 - 0.00793650793650793*G0_0_0_1_0_2 - 0.0126984126984127*G0_0_0_1_1_0 - 0.0476190476190475*G0_0_0_1_1_1 - 0.00634920634920633*G0_0_0_1_1_2 - 0.00793650793650793*G0_0_0_1_2_0 - 0.00634920634920633*G0_0_0_1_2_1 + 0.00317460317460318*G0_0_0_1_2_2 - 0.0507936507936508*G0_0_0_2_0_0 - 0.00793650793650793*G0_0_0_2_0_1 - 0.0190476190476191*G0_0_0_2_0_2 - 0.00793650793650793*G0_0_0_2_1_0 - 0.00634920634920633*G0_0_0_2_1_1 + 0.00317460317460318*G0_0_0_2_1_2 - 0.0190476190476191*G0_0_0_2_2_0 + 0.00317460317460318*G0_0_0_2_2_1 + 0.038095238095238*G0_0_0_2_2_2 - 0.247619047619048*G0_1_0_0_0_0 - 0.0349206349206349*G0_1_0_0_0_1 - 0.0507936507936508*G0_1_0_0_0_2 - 0.0349206349206349*G0_1_0_0_1_0 - 0.0126984126984127*G0_1_0_0_1_1 - 0.00793650793650794*G0_1_0_0_1_2 - 0.0507936507936508*G0_1_0_0_2_0 - 0.00793650793650794*G0_1_0_0_2_1 - 0.0190476190476191*G0_1_0_0_2_2 - 0.0349206349206349*G0_1_0_1_0_0 - 0.0126984126984127*G0_1_0_1_0_1 - 0.00793650793650794*G0_1_0_1_0_2 - 0.0126984126984127*G0_1_0_1_1_0 - 0.0476190476190476*G0_1_0_1_1_1 - 0.00634920634920634*G0_1_0_1_1_2 - 0.00793650793650794*G0_1_0_1_2_0 - 0.00634920634920634*G0_1_0_1_2_1 + 0.00317460317460317*G0_1_0_1_2_2 - 0.0507936507936508*G0_1_0_2_0_0 - 0.00793650793650794*G0_1_0_2_0_1 - 0.0190476190476191*G0_1_0_2_0_2 - 0.00793650793650794*G0_1_0_2_1_0 - 0.00634920634920634*G0_1_0_2_1_1 + 0.00317460317460317*G0_1_0_2_1_2 - 0.0190476190476191*G0_1_0_2_2_0 + 0.00317460317460317*G0_1_0_2_2_1 + 0.038095238095238*G0_1_0_2_2_2; + A[12] = -A[13] + 0.0428571428571428*G0_1_0_0_0_0 + 0.00476190476190476*G0_1_0_0_0_1 - 0.00317460317460319*G0_1_0_0_0_2 + 0.00476190476190476*G0_1_0_0_1_0 - 0.00476190476190476*G0_1_0_0_1_1 - 0.00317460317460319*G0_1_0_0_2_0 - 0.00793650793650794*G0_1_0_0_2_2 + 0.00476190476190476*G0_1_0_1_0_0 - 0.00476190476190476*G0_1_0_1_0_1 - 0.00476190476190476*G0_1_0_1_1_0 - 0.0428571428571428*G0_1_0_1_1_1 + 0.00317460317460318*G0_1_0_1_1_2 + 0.00317460317460318*G0_1_0_1_2_1 + 0.00793650793650793*G0_1_0_1_2_2 - 0.00317460317460318*G0_1_0_2_0_0 - 0.00793650793650794*G0_1_0_2_0_2 + 0.00317460317460318*G0_1_0_2_1_1 + 0.00793650793650793*G0_1_0_2_1_2 - 0.00793650793650794*G0_1_0_2_2_0 + 0.00793650793650793*G0_1_0_2_2_1 + 0.0404761904761905*G0_1_1_0_0_0 + 0.00873015873015873*G0_1_1_0_0_1 + 0.000793650793650788*G0_1_1_0_0_2 + 0.00873015873015873*G0_1_1_0_1_0 + 0.00396825396825397*G0_1_1_0_1_1 + 0.00119047619047619*G0_1_1_0_1_2 + 0.000793650793650787*G0_1_1_0_2_0 + 0.00119047619047619*G0_1_1_0_2_1 + 0.000793650793650796*G0_1_1_0_2_2 + 0.00873015873015873*G0_1_1_1_0_0 + 0.00396825396825397*G0_1_1_1_0_1 + 0.00119047619047619*G0_1_1_1_0_2 + 0.00396825396825397*G0_1_1_1_1_0 - 0.00238095238095237*G0_1_1_1_1_1 + 0.00396825396825397*G0_1_1_1_1_2 + 0.00119047619047619*G0_1_1_1_2_0 + 0.00396825396825397*G0_1_1_1_2_1 + 0.00873015873015873*G0_1_1_1_2_2 + 0.000793650793650788*G0_1_1_2_0_0 + 0.00119047619047619*G0_1_1_2_0_1 + 0.000793650793650797*G0_1_1_2_0_2 + 0.00119047619047619*G0_1_1_2_1_0 + 0.00396825396825397*G0_1_1_2_1_1 + 0.00873015873015873*G0_1_1_2_1_2 + 0.000793650793650797*G0_1_1_2_2_0 + 0.00873015873015872*G0_1_1_2_2_1 + 0.0404761904761904*G0_1_1_2_2_2; + A[27] = -A[29] - 0.0952380952380952*G0_0_0_0_0_0 - 0.019047619047619*G0_0_0_0_0_1 - 0.0634920634920635*G0_0_0_0_0_2 - 0.019047619047619*G0_0_0_0_1_0 - 0.00634920634920635*G0_0_0_0_1_1 - 0.019047619047619*G0_0_0_0_1_2 - 0.0634920634920635*G0_0_0_0_2_0 - 0.019047619047619*G0_0_0_0_2_1 - 0.0952380952380952*G0_0_0_0_2_2 - 0.019047619047619*G0_0_0_1_0_0 - 0.00634920634920635*G0_0_0_1_0_1 - 0.019047619047619*G0_0_0_1_0_2 - 0.00634920634920635*G0_0_0_1_1_0 + 0.0190476190476189*G0_0_0_1_1_1 - 0.0126984126984127*G0_0_0_1_1_2 - 0.019047619047619*G0_0_0_1_2_0 - 0.0126984126984127*G0_0_0_1_2_1 - 0.0571428571428571*G0_0_0_1_2_2 - 0.0634920634920635*G0_0_0_2_0_0 - 0.019047619047619*G0_0_0_2_0_1 - 0.0952380952380952*G0_0_0_2_0_2 - 0.019047619047619*G0_0_0_2_1_0 - 0.0126984126984127*G0_0_0_2_1_1 - 0.0571428571428571*G0_0_0_2_1_2 - 0.0952380952380952*G0_0_0_2_2_0 - 0.0571428571428571*G0_0_0_2_2_1 - 0.38095238095238*G0_0_0_2_2_2 + 0.285714285714286*G0_1_0_0_0_0 + 0.0380952380952381*G0_1_0_0_0_1 + 0.0317460317460318*G0_1_0_0_0_2 + 0.0380952380952381*G0_1_0_0_1_0 + 0.00634920634920633*G0_1_0_0_1_1 + 0.0317460317460318*G0_1_0_0_2_0 - 0.0317460317460317*G0_1_0_0_2_2 + 0.0380952380952381*G0_1_0_1_0_0 + 0.00634920634920633*G0_1_0_1_0_1 + 0.00634920634920633*G0_1_0_1_1_0 - 0.00634920634920636*G0_1_0_1_1_2 - 0.00634920634920636*G0_1_0_1_2_1 - 0.0380952380952381*G0_1_0_1_2_2 + 0.0317460317460318*G0_1_0_2_0_0 - 0.0317460317460317*G0_1_0_2_0_2 - 0.00634920634920636*G0_1_0_2_1_1 - 0.0380952380952381*G0_1_0_2_1_2 - 0.0317460317460317*G0_1_0_2_2_0 - 0.0380952380952381*G0_1_0_2_2_1 - 0.285714285714285*G0_1_0_2_2_2; + A[15] = -A[17] - 0.0380952380952381*G0_1_0_0_0_0 - 0.00317460317460316*G0_1_0_0_0_1 + 0.0190476190476191*G0_1_0_0_0_2 - 0.00317460317460317*G0_1_0_0_1_0 + 0.00634920634920636*G0_1_0_0_1_1 + 0.00793650793650794*G0_1_0_0_1_2 + 0.0190476190476191*G0_1_0_0_2_0 + 0.00793650793650794*G0_1_0_0_2_1 + 0.0507936507936508*G0_1_0_0_2_2 - 0.00317460317460317*G0_1_0_1_0_0 + 0.00634920634920636*G0_1_0_1_0_1 + 0.00793650793650794*G0_1_0_1_0_2 + 0.00634920634920636*G0_1_0_1_1_0 + 0.0476190476190475*G0_1_0_1_1_1 + 0.0126984126984127*G0_1_0_1_1_2 + 0.00793650793650794*G0_1_0_1_2_0 + 0.0126984126984127*G0_1_0_1_2_1 + 0.0349206349206349*G0_1_0_1_2_2 + 0.0190476190476191*G0_1_0_2_0_0 + 0.00793650793650794*G0_1_0_2_0_1 + 0.0507936507936508*G0_1_0_2_0_2 + 0.00793650793650794*G0_1_0_2_1_0 + 0.0126984126984127*G0_1_0_2_1_1 + 0.0349206349206349*G0_1_0_2_1_2 + 0.0507936507936508*G0_1_0_2_2_0 + 0.0349206349206349*G0_1_0_2_2_1 + 0.247619047619047*G0_1_0_2_2_2; + A[16] = -A[15] - 0.0761904761904762*G0_1_1_0_0_0 - 0.0253968253968254*G0_1_1_0_0_1 - 0.00952380952380952*G0_1_1_0_0_2 - 0.0253968253968254*G0_1_1_0_1_0 - 0.0253968253968254*G0_1_1_0_1_1 - 0.00476190476190476*G0_1_1_0_1_2 - 0.00952380952380952*G0_1_1_0_2_0 - 0.00476190476190476*G0_1_1_0_2_1 - 0.0190476190476191*G0_1_1_0_2_2 - 0.0253968253968254*G0_1_1_1_0_0 - 0.0253968253968254*G0_1_1_1_0_1 - 0.00476190476190476*G0_1_1_1_0_2 - 0.0253968253968254*G0_1_1_1_1_0 - 0.0761904761904761*G0_1_1_1_1_1 - 0.0095238095238095*G0_1_1_1_1_2 - 0.00476190476190476*G0_1_1_1_2_0 - 0.00952380952380951*G0_1_1_1_2_1 - 0.019047619047619*G0_1_1_1_2_2 - 0.00952380952380952*G0_1_1_2_0_0 - 0.00476190476190476*G0_1_1_2_0_1 - 0.0190476190476191*G0_1_1_2_0_2 - 0.00476190476190476*G0_1_1_2_1_0 - 0.00952380952380951*G0_1_1_2_1_1 - 0.019047619047619*G0_1_1_2_1_2 - 0.0190476190476191*G0_1_1_2_2_0 - 0.019047619047619*G0_1_1_2_2_1 - 0.161904761904762*G0_1_1_2_2_2; + A[32] = A[17] - 0.0428571428571428*G0_0_1_0_0_0 - 0.00476190476190476*G0_0_1_0_0_1 + 0.00317460317460318*G0_0_1_0_0_2 - 0.00476190476190476*G0_0_1_0_1_0 + 0.00476190476190476*G0_0_1_0_1_1 + 0.00317460317460318*G0_0_1_0_2_0 + 0.00793650793650795*G0_0_1_0_2_2 - 0.00476190476190476*G0_0_1_1_0_0 + 0.00476190476190476*G0_0_1_1_0_1 + 0.00476190476190476*G0_0_1_1_1_0 + 0.0428571428571428*G0_0_1_1_1_1 - 0.00317460317460318*G0_0_1_1_1_2 - 0.00317460317460318*G0_0_1_1_2_1 - 0.00793650793650792*G0_0_1_1_2_2 + 0.00317460317460318*G0_0_1_2_0_0 + 0.00793650793650794*G0_0_1_2_0_2 - 0.00317460317460318*G0_0_1_2_1_1 - 0.00793650793650792*G0_0_1_2_1_2 + 0.00793650793650794*G0_0_1_2_2_0 - 0.00793650793650793*G0_0_1_2_2_1 + 0.0428571428571428*G0_1_0_0_0_0 + 0.00476190476190476*G0_1_0_0_0_1 - 0.00317460317460319*G0_1_0_0_0_2 + 0.00476190476190476*G0_1_0_0_1_0 - 0.00476190476190476*G0_1_0_0_1_1 - 0.00317460317460319*G0_1_0_0_2_0 - 0.00793650793650795*G0_1_0_0_2_2 + 0.00476190476190476*G0_1_0_1_0_0 - 0.00476190476190475*G0_1_0_1_0_1 - 0.00476190476190475*G0_1_0_1_1_0 - 0.0428571428571427*G0_1_0_1_1_1 + 0.00317460317460318*G0_1_0_1_1_2 + 0.00317460317460318*G0_1_0_1_2_1 + 0.00793650793650792*G0_1_0_1_2_2 - 0.00317460317460318*G0_1_0_2_0_0 - 0.00793650793650795*G0_1_0_2_0_2 + 0.00317460317460318*G0_1_0_2_1_1 + 0.00793650793650792*G0_1_0_2_1_2 - 0.00793650793650795*G0_1_0_2_2_0 + 0.00793650793650792*G0_1_0_2_2_1; + A[20] = -A[32] - 0.0380952380952381*G0_0_1_0_0_0 - 0.00317460317460316*G0_0_1_0_0_1 + 0.0190476190476191*G0_0_1_0_0_2 - 0.00317460317460316*G0_0_1_0_1_0 + 0.00634920634920636*G0_0_1_0_1_1 + 0.00793650793650794*G0_0_1_0_1_2 + 0.0190476190476191*G0_0_1_0_2_0 + 0.00793650793650794*G0_0_1_0_2_1 + 0.0507936507936508*G0_0_1_0_2_2 - 0.00317460317460316*G0_0_1_1_0_0 + 0.00634920634920636*G0_0_1_1_0_1 + 0.00793650793650794*G0_0_1_1_0_2 + 0.00634920634920636*G0_0_1_1_1_0 + 0.0476190476190476*G0_0_1_1_1_1 + 0.0126984126984127*G0_0_1_1_1_2 + 0.00793650793650794*G0_0_1_1_2_0 + 0.0126984126984127*G0_0_1_1_2_1 + 0.0349206349206349*G0_0_1_1_2_2 + 0.0190476190476191*G0_0_1_2_0_0 + 0.00793650793650794*G0_0_1_2_0_1 + 0.0507936507936508*G0_0_1_2_0_2 + 0.00793650793650794*G0_0_1_2_1_0 + 0.0126984126984127*G0_0_1_2_1_1 + 0.0349206349206349*G0_0_1_2_1_2 + 0.0507936507936508*G0_0_1_2_2_0 + 0.0349206349206349*G0_0_1_2_2_1 + 0.247619047619047*G0_0_1_2_2_2; + A[26] = -A[20] - 0.0761904761904762*G0_1_1_0_0_0 - 0.0253968253968254*G0_1_1_0_0_1 - 0.00952380952380952*G0_1_1_0_0_2 - 0.0253968253968254*G0_1_1_0_1_0 - 0.0253968253968254*G0_1_1_0_1_1 - 0.00476190476190476*G0_1_1_0_1_2 - 0.00952380952380952*G0_1_1_0_2_0 - 0.00476190476190476*G0_1_1_0_2_1 - 0.0190476190476191*G0_1_1_0_2_2 - 0.0253968253968254*G0_1_1_1_0_0 - 0.0253968253968254*G0_1_1_1_0_1 - 0.00476190476190476*G0_1_1_1_0_2 - 0.0253968253968254*G0_1_1_1_1_0 - 0.0761904761904761*G0_1_1_1_1_1 - 0.00952380952380951*G0_1_1_1_1_2 - 0.00476190476190476*G0_1_1_1_2_0 - 0.00952380952380951*G0_1_1_1_2_1 - 0.019047619047619*G0_1_1_1_2_2 - 0.00952380952380952*G0_1_1_2_0_0 - 0.00476190476190476*G0_1_1_2_0_1 - 0.0190476190476191*G0_1_1_2_0_2 - 0.00476190476190476*G0_1_1_2_1_0 - 0.00952380952380951*G0_1_1_2_1_1 - 0.019047619047619*G0_1_1_2_1_2 - 0.0190476190476191*G0_1_1_2_2_0 - 0.019047619047619*G0_1_1_2_2_1 - 0.161904761904762*G0_1_1_2_2_2; + A[2] = -A[8] + 0.0428571428571428*G0_0_1_0_0_0 + 0.00476190476190476*G0_0_1_0_0_1 - 0.00317460317460319*G0_0_1_0_0_2 + 0.00476190476190476*G0_0_1_0_1_0 - 0.00476190476190476*G0_0_1_0_1_1 - 0.00317460317460319*G0_0_1_0_2_0 - 0.00793650793650794*G0_0_1_0_2_2 + 0.00476190476190476*G0_0_1_1_0_0 - 0.00476190476190476*G0_0_1_1_0_1 - 0.00476190476190476*G0_0_1_1_1_0 - 0.0428571428571428*G0_0_1_1_1_1 + 0.00317460317460318*G0_0_1_1_1_2 + 0.00317460317460318*G0_0_1_1_2_1 + 0.00793650793650793*G0_0_1_1_2_2 - 0.00317460317460319*G0_0_1_2_0_0 - 0.00793650793650794*G0_0_1_2_0_2 + 0.00317460317460318*G0_0_1_2_1_1 + 0.00793650793650793*G0_0_1_2_1_2 - 0.00793650793650794*G0_0_1_2_2_0 + 0.00793650793650793*G0_0_1_2_2_1 + 0.0404761904761905*G0_1_1_0_0_0 + 0.00873015873015873*G0_1_1_0_0_1 + 0.000793650793650787*G0_1_1_0_0_2 + 0.00873015873015873*G0_1_1_0_1_0 + 0.00396825396825397*G0_1_1_0_1_1 + 0.00119047619047619*G0_1_1_0_1_2 + 0.000793650793650787*G0_1_1_0_2_0 + 0.00119047619047619*G0_1_1_0_2_1 + 0.000793650793650796*G0_1_1_0_2_2 + 0.00873015873015873*G0_1_1_1_0_0 + 0.00396825396825397*G0_1_1_1_0_1 + 0.00119047619047619*G0_1_1_1_0_2 + 0.00396825396825397*G0_1_1_1_1_0 - 0.00238095238095237*G0_1_1_1_1_1 + 0.00396825396825397*G0_1_1_1_1_2 + 0.00119047619047619*G0_1_1_1_2_0 + 0.00396825396825397*G0_1_1_1_2_1 + 0.00873015873015873*G0_1_1_1_2_2 + 0.000793650793650787*G0_1_1_2_0_0 + 0.00119047619047619*G0_1_1_2_0_1 + 0.000793650793650796*G0_1_1_2_0_2 + 0.00119047619047619*G0_1_1_2_1_0 + 0.00396825396825397*G0_1_1_2_1_1 + 0.00873015873015873*G0_1_1_2_1_2 + 0.000793650793650796*G0_1_1_2_2_0 + 0.00873015873015872*G0_1_1_2_2_1 + 0.0404761904761904*G0_1_1_2_2_2; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p1_q2_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p1_q2_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q2_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q2_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q2_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q2_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q2_tensor_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q2_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q2_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q2_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q2_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q2_tensor_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q2_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q2_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p1_q3_quadrature.h b/laplacian_2d/laplacian_f3_p1_q3_quadrature.h new file mode 100644 index 0000000..71aac60 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p1_q3_quadrature.h @@ -0,0 +1,4646 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P1_Q3_QUADRATURE_H +#define __LAPLACIAN_F3_P1_Q3_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q3_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q3_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q3_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q3_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q3_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q3_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q3_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q3_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q3_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q3_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q3_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q3_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p1_q3_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p1_q3_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W16[16] = {0.0235683681933823, 0.0353880678980859, 0.0225840492823699, 0.00542322591052525, 0.0441850885223617, 0.0663442161070497, 0.0423397245217463, 0.0101672595644788, 0.0441850885223617, 0.0663442161070497, 0.0423397245217463, 0.0101672595644788, 0.0235683681933823, 0.0353880678980859, 0.0225840492823699, 0.00542322591052525}; + // Quadrature points on the UFC reference element: (0.0654669945550145, 0.0571041961145177), (0.0502101232113698, 0.276843013638124), (0.028912084224389, 0.583590432368917), (0.00970378512694614, 0.860240135656219), (0.311164552244357, 0.0571041961145177), (0.238648659731443, 0.276843013638124), (0.137419104134574, 0.583590432368917), (0.0461220799064521, 0.860240135656219), (0.631731251641125, 0.0571041961145177), (0.484508326630433, 0.276843013638124), (0.278990463496509, 0.583590432368917), (0.0936377844373285, 0.860240135656219), (0.877428809330468, 0.0571041961145177), (0.672946863150506, 0.276843013638124), (0.387497483406694, 0.583590432368917), (0.130056079216834, 0.860240135656219) + + // Value of basis functions at quadrature points. + static const double FE0[16][3] = \ + {{0.877428809330468, 0.0654669945550145, 0.0571041961145176}, + {0.672946863150506, 0.0502101232113698, 0.276843013638124}, + {0.387497483406694, 0.028912084224389, 0.583590432368917}, + {0.130056079216834, 0.0097037851269462, 0.860240135656219}, + {0.631731251641125, 0.311164552244357, 0.0571041961145176}, + {0.484508326630433, 0.238648659731443, 0.276843013638124}, + {0.278990463496509, 0.137419104134574, 0.583590432368917}, + {0.0936377844373285, 0.0461220799064521, 0.860240135656219}, + {0.311164552244357, 0.631731251641125, 0.0571041961145176}, + {0.238648659731443, 0.484508326630433, 0.276843013638124}, + {0.137419104134574, 0.278990463496509, 0.583590432368917}, + {0.0461220799064521, 0.0936377844373286, 0.860240135656219}, + {0.0654669945550145, 0.877428809330468, 0.0571041961145176}, + {0.0502101232113698, 0.672946863150506, 0.276843013638124}, + {0.028912084224389, 0.387497483406694, 0.583590432368917}, + {0.00970378512694609, 0.130056079216835, 0.860240135656219}}; + + static const double FE1_D01[16][9] = \ + {{-3.4965384745074, 0.530084239356792, -0.236741455920669, -0.193663592902933, 5.3491055952874, -2.38265136013679, -1.2563494557394, 0.236741455920668, 1.45001304864234}, + {-1.05705422007088, -0.456919391039896, -0.191911292067001, 0.149363134823218, -0.699008549928808, 2.21298216103958, -0.686350558213112, 0.191911292067002, 0.536987423389894}, + {0.460394305432211, 0.345486310839029, -0.118819612718074, 0.325461645786587, -3.19627392928782, 2.39039331301657, -0.172386337669062, 0.118819612718075, -0.153075308117525}, + {-0.057842167555441, 3.24801550751074, -0.0423958265530895, 0.181717773646284, 0.493429735317233, -3.68360307527254, 0.00959205439758343, 0.0423958265530895, -0.191309828043865}, + {-0.70205778828072, 0.530084239356792, -0.0931248743582835, -0.920482841487917, 1.82780566047573, -1.6558321115518, -3.9072135604037, 0.0931248743582843, 4.82769640189162}, + {0.191472638921894, -0.456919391039896, -0.305051001104703, 0.709922813548805, -1.38697573019599, 1.652422482314, -2.04801712624359, 0.305051001104704, 1.33809431269478}, + {0.460132508721622, 0.345486310839029, -0.363451831160072, 1.54691884013084, -1.97455493823297, 1.16893611867232, -0.416756759400472, 0.363451831160073, -1.13016208073037}, + {-0.275628408167522, 3.24801550751074, -0.178831535137919, 0.863704375858747, 1.39320257814178, -4.365589677485, 0.0909425864248334, 0.17883153513792, -0.954646962283579}, + {0.493365359457892, 0.530084239356792, 2.54484842066578, -1.86877898967968, -0.315913635454648, -0.707535963360036, -2.46466341311824, -2.54484842066578, 4.33344240279792}, + {0.378969969896197, -0.456919391039896, 0.988814830915056, 1.44129665264566, -0.843099222073445, 0.921048643217145, -0.94164862519813, -0.988814830915056, -0.499648027447527}, + {-0.0181622002343421, 0.345486310839029, -0.204675422987332, 3.14057937517148, 0.0974003057636252, -0.424724416368311, 0.220314357728232, 0.204675422987333, -3.36089373289971}, + {-0.613619105283045, 3.24801550751074, -0.303001561864499, 1.75350644047874, 2.62099533987729, -5.25539174210499, 0.304763256813776, 0.3030015618645, -2.05826969729251}, + {-0.468657068581765, 0.530084239356792, 6.44496811649451, -2.59559823826466, -0.0807104559999763, 0.0192832852249485, 2.39747871075014, -6.44496811649451, 0.19811952751453}, + {-0.582143153481834, -0.456919391039896, 3.08531510424816, 2.00185633137125, 0.678573580030173, 0.360488964491556, 2.115964771513, -3.08531510424816, -4.11782110288425}, + {-0.751076008272174, 0.345486310839029, 0.283344369897911, 4.36203656951573, 2.05177130814571, -1.64618161071257, 1.44124795865131, -0.283344369897911, -5.80328452816704}, + {-0.913937140375651, 3.24801550751074, -0.356905475968805, 2.4354930426912, 3.60329997718236, -5.93737834431745, 0.551177377802077, 0.356905475968805, -2.98667042049328}}; + + // Array of non-zero columns + static const unsigned int nzc0[9] = {0, 2, 3, 4, 5, 6, 7, 8, 9}; + + static const double FE1_D10[16][9] = \ + {{-3.4965384745074, 0.468657068581765, -0.156030999920696, -0.21294687812788, -1.09586252120711, 0.21294687812788, 5.18861866075511, -2.16073725482947, 1.25189352112781}, + {-1.05705422007088, 0.582143153481835, -0.870484872097176, -0.211125829668338, -3.78432365417697, 0.211125829668338, 2.39896454603505, -1.924053479446, 4.65480852627414}, + {0.460394305432211, 0.751076008272174, -2.17059092086379, 1.97164325649915, -3.47961829918573, -1.97164325649915, 0.110958032228849, -1.32242834593323, 5.65020922004951}, + {-0.0578421675554415, 0.913937140375651, -3.64569580373545, 6.11909611796373, 0.85033521128604, -6.11909611796373, -0.347313421571225, -0.508781551248987, 2.79536059244941}, + {-0.702057788280719, -0.493365359457892, 0.222788761096362, -0.212946878127879, -0.717042760190054, 0.21294687812788, -1.36236513973792, 2.55778828747653, 0.494253999093691}, + {0.191472638921894, -0.378969969896196, 0.53804822096874, -0.211125829668338, -2.37579056111105, 0.211125829668338, -1.05920229532853, 1.24669962630283, 1.83774234014231}, + {0.460132508721622, 0.0181622002343421, -0.460852136923699, 1.97164325649915, -1.76987951524564, -1.97164325649915, -0.621432182387805, 0.14313747343184, 2.23073165216934}, + {-0.275628408167522, 0.613619105283045, -2.79982687501521, 6.11909611796373, 1.69620414000628, -6.11909611796374, -0.212058975439669, -0.125931721675855, 1.10362273500893}, + {0.493365359457892, 0.70205778828072, 0.717042760190053, -0.212946878127879, -0.222788761096363, 0.212946878127879, -2.55778828747653, 1.36236513973792, -0.49425399909369}, + {0.378969969896197, -0.191472638921894, 2.37579056111105, -0.211125829668337, -0.538048220968741, 0.211125829668338, -1.24669962630283, 1.05920229532853, -1.83774234014231}, + {-0.0181622002343423, -0.460132508721622, 1.76987951524564, 1.97164325649916, 0.460852136923698, -1.97164325649916, -0.143137473431841, 0.621432182387805, -2.23073165216934}, + {-0.613619105283045, 0.275628408167522, -1.69620414000628, 6.11909611796373, 2.79982687501521, -6.11909611796374, 0.125931721675853, 0.212058975439669, -1.10362273500893}, + {-0.468657068581766, 3.4965384745074, 1.09586252120711, -0.212946878127879, 0.156030999920692, 0.212946878127879, 2.16073725482947, -5.18861866075511, -1.2518935211278}, + {-0.582143153481834, 1.05705422007088, 3.78432365417697, -0.211125829668336, 0.870484872097176, 0.211125829668337, 1.924053479446, -2.39896454603504, -4.65480852627414}, + {-0.751076008272174, -0.460394305432211, 3.47961829918573, 1.97164325649916, 2.17059092086379, -1.97164325649916, 1.32242834593323, -0.110958032228849, -5.65020922004951}, + {-0.913937140375651, 0.0578421675554404, -0.850335211286036, 6.11909611796373, 3.64569580373545, -6.11909611796374, 0.508781551248985, 0.347313421571224, -2.79536059244941}}; + + // Array of non-zero columns + static const unsigned int nzc1[9] = {0, 1, 3, 4, 5, 6, 7, 8, 9}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 100; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 16032 + for (unsigned int ip = 0; ip < 16; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + double F2 = 0.0; + + // Total number of operations to compute function values = 18 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[2][r]; + F1 += FE0[ip][r]*w[0][r]; + F2 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 12 + double I[3]; + // Number of operations: 4 + I[0] = F0*F1*F2*G[0]*W16[ip]; + + // Number of operations: 4 + I[1] = F0*F1*F2*G[1]*W16[ip]; + + // Number of operations: 4 + I[2] = F0*F1*F2*G[2]*W16[ip]; + + + // Number of operations for primary indices: 972 + for (unsigned int j = 0; j < 9; j++) + { + for (unsigned int k = 0; k < 9; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p1_q3_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p1_q3_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q3_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q3_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q3_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q3_quadrature_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q3_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q3_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q3_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q3_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q3_quadrature_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q3_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q3_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p1_q3_tensor.h b/laplacian_2d/laplacian_f3_p1_q3_tensor.h new file mode 100644 index 0000000..5bbf1a8 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p1_q3_tensor.h @@ -0,0 +1,4730 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P1_Q3_TENSOR_H +#define __LAPLACIAN_F3_P1_Q3_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q3_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q3_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q3_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q3_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q3_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q3_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q3_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q3_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q3_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q3_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q3_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q3_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p1_q3_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p1_q3_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 378 + // Number of operations (multiply-add pairs) for tensor contraction: 5208 + // Total number of operations (multiply-add pairs): 5597 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[73] = -0.0482142857142858*G0_0_0_0_0_0 - 0.0160714285714286*G0_0_0_0_0_1 - 0.0160714285714286*G0_0_0_0_0_2 - 0.0160714285714286*G0_0_0_0_1_0 - 0.0140625*G0_0_0_0_1_1 - 0.0060267857142857*G0_0_0_0_1_2 - 0.0160714285714286*G0_0_0_0_2_0 - 0.0060267857142857*G0_0_0_0_2_1 - 0.00602678571428571*G0_0_0_0_2_2 - 0.0160714285714286*G0_0_0_1_0_0 - 0.0140625*G0_0_0_1_0_1 - 0.0060267857142857*G0_0_0_1_0_2 - 0.0140625*G0_0_0_1_1_0 + 0.0783482142857141*G0_0_0_1_1_1 + 0.0281249999999999*G0_0_0_1_1_2 - 0.0060267857142857*G0_0_0_1_2_0 + 0.0281249999999999*G0_0_0_1_2_1 + 0.0180803571428571*G0_0_0_1_2_2 - 0.0160714285714286*G0_0_0_2_0_0 - 0.0060267857142857*G0_0_0_2_0_1 - 0.00602678571428571*G0_0_0_2_0_2 - 0.0060267857142857*G0_0_0_2_1_0 + 0.0281249999999999*G0_0_0_2_1_1 + 0.0180803571428571*G0_0_0_2_1_2 - 0.00602678571428571*G0_0_0_2_2_0 + 0.0180803571428571*G0_0_0_2_2_1 + 0.0241071428571427*G0_0_0_2_2_2 - 0.0301339285714285*G0_0_1_0_0_0 - 0.0180803571428571*G0_0_1_0_0_1 - 0.00401785714285714*G0_0_1_0_0_2 - 0.0180803571428571*G0_0_1_0_1_0 - 0.0180803571428572*G0_0_1_0_1_1 - 0.00200892857142858*G0_0_1_0_1_2 - 0.00401785714285714*G0_0_1_0_2_0 - 0.00200892857142858*G0_0_1_0_2_1 - 0.0180803571428571*G0_0_1_1_0_0 - 0.0180803571428572*G0_0_1_1_0_1 - 0.00200892857142858*G0_0_1_1_0_2 - 0.0180803571428572*G0_0_1_1_1_0 + 0.204910714285714*G0_0_1_1_1_1 + 0.0301339285714285*G0_0_1_1_1_2 - 0.00200892857142858*G0_0_1_1_2_0 + 0.0301339285714285*G0_0_1_1_2_1 + 0.0100446428571428*G0_0_1_1_2_2 - 0.00401785714285714*G0_0_1_2_0_0 - 0.00200892857142858*G0_0_1_2_0_1 - 0.00200892857142858*G0_0_1_2_1_0 + 0.0301339285714285*G0_0_1_2_1_1 + 0.0100446428571428*G0_0_1_2_1_2 + 0.0100446428571428*G0_0_1_2_2_1 + 0.00602678571428567*G0_0_1_2_2_2 - 0.0120535714285714*G0_1_0_0_0_0 - 0.0160714285714285*G0_1_0_0_0_1 - 0.00401785714285713*G0_1_0_0_0_2 - 0.0160714285714285*G0_1_0_0_1_0 - 0.0120535714285714*G0_1_0_0_1_1 - 0.00401785714285713*G0_1_0_0_1_2 - 0.00401785714285713*G0_1_0_0_2_0 - 0.00401785714285713*G0_1_0_0_2_1 - 0.0160714285714285*G0_1_0_1_0_0 - 0.0120535714285714*G0_1_0_1_0_1 - 0.00401785714285713*G0_1_0_1_0_2 - 0.0120535714285714*G0_1_0_1_1_0 + 0.0964285714285712*G0_1_0_1_1_1 + 0.0361607142857142*G0_1_0_1_1_2 - 0.00401785714285713*G0_1_0_1_2_0 + 0.0361607142857142*G0_1_0_1_2_1 + 0.0241071428571428*G0_1_0_1_2_2 - 0.00401785714285713*G0_1_0_2_0_0 - 0.00401785714285713*G0_1_0_2_0_1 - 0.00401785714285713*G0_1_0_2_1_0 + 0.0361607142857142*G0_1_0_2_1_1 + 0.0241071428571428*G0_1_0_2_1_2 + 0.0241071428571428*G0_1_0_2_2_1 + 0.0241071428571426*G0_1_0_2_2_2 + 0.00602678571428558*G0_1_1_0_0_0 - 0.0120535714285715*G0_1_1_0_0_1 + 0.00200892857142855*G0_1_1_0_0_2 - 0.0120535714285715*G0_1_1_0_1_0 - 0.0120535714285715*G0_1_1_0_1_1 + 0.00200892857142855*G0_1_1_0_2_0 + 0.00200892857142856*G0_1_1_0_2_2 - 0.0120535714285715*G0_1_1_1_0_0 - 0.0120535714285715*G0_1_1_1_0_1 - 0.0120535714285715*G0_1_1_1_1_0 + 0.241071428571428*G0_1_1_1_1_1 + 0.0361607142857142*G0_1_1_1_1_2 + 0.0361607142857142*G0_1_1_1_2_1 + 0.0120535714285714*G0_1_1_1_2_2 + 0.00200892857142855*G0_1_1_2_0_0 + 0.00200892857142856*G0_1_1_2_0_2 + 0.0361607142857142*G0_1_1_2_1_1 + 0.0120535714285714*G0_1_1_2_1_2 + 0.00200892857142856*G0_1_1_2_2_0 + 0.0120535714285714*G0_1_1_2_2_1 + 0.00602678571428568*G0_1_1_2_2_2; + A[69] = -0.0241071428571428*G0_0_0_0_0_2 - 0.0241071428571428*G0_0_0_0_2_0 - 0.0482142857142856*G0_0_0_0_2_2 + 0.0241071428571429*G0_0_0_1_1_2 + 0.0241071428571429*G0_0_0_1_2_1 + 0.0482142857142857*G0_0_0_1_2_2 - 0.0241071428571428*G0_0_0_2_0_0 - 0.0482142857142856*G0_0_0_2_0_2 + 0.0241071428571429*G0_0_0_2_1_1 + 0.0482142857142857*G0_0_0_2_1_2 - 0.0482142857142856*G0_0_0_2_2_0 + 0.0482142857142857*G0_0_0_2_2_1 + 0.024107142857143*G0_0_1_0_0_0 + 0.0120535714285715*G0_0_1_0_0_1 + 0.0120535714285714*G0_0_1_0_0_2 + 0.0120535714285715*G0_0_1_0_1_0 + 0.0120535714285715*G0_0_1_0_1_1 + 0.0120535714285714*G0_0_1_0_1_2 + 0.0120535714285714*G0_0_1_0_2_0 + 0.0120535714285714*G0_0_1_0_2_1 + 0.0361607142857143*G0_0_1_0_2_2 + 0.0120535714285715*G0_0_1_1_0_0 + 0.0120535714285715*G0_0_1_1_0_1 + 0.0120535714285714*G0_0_1_1_0_2 + 0.0120535714285715*G0_0_1_1_1_0 + 0.024107142857143*G0_0_1_1_1_1 + 0.0361607142857143*G0_0_1_1_1_2 + 0.0120535714285714*G0_0_1_1_2_0 + 0.0361607142857143*G0_0_1_1_2_1 + 0.084375*G0_0_1_1_2_2 + 0.0120535714285714*G0_0_1_2_0_0 + 0.0120535714285714*G0_0_1_2_0_1 + 0.0361607142857143*G0_0_1_2_0_2 + 0.0120535714285714*G0_0_1_2_1_0 + 0.0361607142857143*G0_0_1_2_1_1 + 0.084375*G0_0_1_2_1_2 + 0.0361607142857143*G0_0_1_2_2_0 + 0.084375*G0_0_1_2_2_1 + 0.313392857142857*G0_0_1_2_2_2 + 0.0964285714285713*G0_1_0_0_0_0 + 0.0120535714285714*G0_1_0_0_0_1 + 0.0843749999999999*G0_1_0_0_0_2 + 0.0120535714285714*G0_1_0_0_1_0 + 0.0120535714285714*G0_1_0_0_1_2 + 0.0843749999999999*G0_1_0_0_2_0 + 0.0120535714285714*G0_1_0_0_2_1 + 0.0723214285714284*G0_1_0_0_2_2 + 0.0120535714285714*G0_1_0_1_0_0 + 0.0120535714285714*G0_1_0_1_0_2 - 0.0120535714285714*G0_1_0_1_1_1 + 0.0120535714285714*G0_1_0_1_1_2 + 0.0120535714285714*G0_1_0_1_2_0 + 0.0120535714285714*G0_1_0_1_2_1 + 0.0482142857142856*G0_1_0_1_2_2 + 0.0843749999999999*G0_1_0_2_0_0 + 0.0120535714285714*G0_1_0_2_0_1 + 0.0723214285714284*G0_1_0_2_0_2 + 0.0120535714285714*G0_1_0_2_1_0 + 0.0120535714285714*G0_1_0_2_1_1 + 0.0482142857142856*G0_1_0_2_1_2 + 0.0723214285714284*G0_1_0_2_2_0 + 0.0482142857142856*G0_1_0_2_2_1 + 0.16875*G0_1_0_2_2_2 - 0.120535714285714*G0_1_1_0_0_0 - 0.0482142857142857*G0_1_1_0_0_1 - 0.0482142857142857*G0_1_1_0_1_0 - 0.0361607142857143*G0_1_1_0_1_1 + 0.0120535714285714*G0_1_1_0_2_2 - 0.0482142857142857*G0_1_1_1_0_0 - 0.0361607142857143*G0_1_1_1_0_1 - 0.0361607142857143*G0_1_1_1_1_0 - 0.0482142857142856*G0_1_1_1_1_1 + 0.0120535714285714*G0_1_1_1_1_2 + 0.0120535714285714*G0_1_1_1_2_1 + 0.0482142857142857*G0_1_1_1_2_2 + 0.0120535714285714*G0_1_1_2_0_2 + 0.0120535714285714*G0_1_1_2_1_1 + 0.0482142857142857*G0_1_1_2_1_2 + 0.0120535714285714*G0_1_1_2_2_0 + 0.0482142857142857*G0_1_1_2_2_1 + 0.204910714285715*G0_1_1_2_2_2; + A[16] = -0.000669642857142854*G0_0_0_0_0_0 - 0.000223214285714285*G0_0_0_0_0_1 - 0.003125*G0_0_0_0_0_2 - 0.000223214285714285*G0_0_0_0_1_0 + 0.00178571428571429*G0_0_0_0_1_1 + 0.00044642857142857*G0_0_0_0_1_2 - 0.003125*G0_0_0_0_2_0 + 0.00044642857142857*G0_0_0_0_2_1 - 0.00870535714285715*G0_0_0_0_2_2 - 0.000223214285714285*G0_0_0_1_0_0 + 0.00178571428571429*G0_0_0_1_0_1 + 0.00044642857142857*G0_0_0_1_0_2 + 0.00178571428571429*G0_0_0_1_1_0 + 0.0174107142857143*G0_0_0_1_1_1 + 0.00491071428571428*G0_0_0_1_1_2 + 0.00044642857142857*G0_0_0_1_2_0 + 0.00491071428571428*G0_0_0_1_2_1 + 0.00334821428571426*G0_0_0_1_2_2 - 0.003125*G0_0_0_2_0_0 + 0.00044642857142857*G0_0_0_2_0_1 - 0.00870535714285715*G0_0_0_2_0_2 + 0.00044642857142857*G0_0_0_2_1_0 + 0.00491071428571428*G0_0_0_2_1_1 + 0.00334821428571426*G0_0_0_2_1_2 - 0.00870535714285715*G0_0_0_2_2_0 + 0.00334821428571426*G0_0_0_2_2_1 - 0.0508928571428573*G0_0_0_2_2_2 + 0.00200892857142859*G0_0_1_0_0_0 + 0.000446428571428575*G0_0_1_0_0_1 + 0.00558035714285714*G0_0_1_0_0_2 + 0.000446428571428574*G0_0_1_0_1_0 - 0.00178571428571428*G0_0_1_0_1_1 - 0.000669642857142856*G0_0_1_0_1_2 + 0.00558035714285714*G0_0_1_0_2_0 - 0.000669642857142856*G0_0_1_0_2_1 + 0.00245535714285712*G0_0_1_0_2_2 + 0.000446428571428575*G0_0_1_1_0_0 - 0.00178571428571428*G0_0_1_1_0_1 - 0.000669642857142855*G0_0_1_1_0_2 - 0.00178571428571428*G0_0_1_1_1_0 + 0.00178571428571428*G0_0_1_1_1_2 - 0.000669642857142856*G0_0_1_1_2_0 + 0.00178571428571428*G0_0_1_1_2_1 + 0.000892857142857123*G0_0_1_1_2_2 + 0.00558035714285714*G0_0_1_2_0_0 - 0.000669642857142856*G0_0_1_2_0_1 + 0.00245535714285712*G0_0_1_2_0_2 - 0.000669642857142856*G0_0_1_2_1_0 + 0.00178571428571428*G0_0_1_2_1_1 + 0.000892857142857123*G0_0_1_2_1_2 + 0.00245535714285712*G0_0_1_2_2_0 + 0.000892857142857123*G0_0_1_2_2_1 - 0.0261160714285716*G0_0_1_2_2_2; + A[37] = A[73] + 0.0180803571428571*G0_0_1_0_0_0 + 0.00200892857142861*G0_0_1_0_0_1 + 0.00200892857142861*G0_0_1_0_1_0 + 0.00602678571428575*G0_0_1_0_1_1 - 0.00200892857142855*G0_0_1_0_1_2 - 0.00200892857142855*G0_0_1_0_2_1 + 0.00200892857142861*G0_0_1_1_0_0 + 0.00602678571428575*G0_0_1_1_0_1 - 0.00200892857142855*G0_0_1_1_0_2 + 0.00602678571428575*G0_0_1_1_1_0 - 0.108482142857143*G0_0_1_1_1_1 + 0.00602678571428574*G0_0_1_1_1_2 - 0.00200892857142855*G0_0_1_1_2_0 + 0.00602678571428574*G0_0_1_1_2_1 + 0.0140625*G0_0_1_1_2_2 - 0.00200892857142855*G0_0_1_2_0_1 - 0.00200892857142855*G0_0_1_2_1_0 + 0.00602678571428574*G0_0_1_2_1_1 + 0.0140625*G0_0_1_2_1_2 + 0.0140625*G0_0_1_2_2_1 + 0.018080357142857*G0_0_1_2_2_2 - 0.0180803571428571*G0_1_0_0_0_0 - 0.00200892857142861*G0_1_0_0_0_1 - 0.00200892857142861*G0_1_0_0_1_0 - 0.00602678571428577*G0_1_0_0_1_1 + 0.00200892857142855*G0_1_0_0_1_2 + 0.00200892857142855*G0_1_0_0_2_1 - 0.00200892857142861*G0_1_0_1_0_0 - 0.00602678571428577*G0_1_0_1_0_1 + 0.00200892857142855*G0_1_0_1_0_2 - 0.00602678571428575*G0_1_0_1_1_0 + 0.108482142857143*G0_1_0_1_1_1 - 0.00602678571428576*G0_1_0_1_1_2 + 0.00200892857142855*G0_1_0_1_2_0 - 0.00602678571428575*G0_1_0_1_2_1 - 0.0140625*G0_1_0_1_2_2 + 0.00200892857142855*G0_1_0_2_0_1 + 0.00200892857142855*G0_1_0_2_1_0 - 0.00602678571428576*G0_1_0_2_1_1 - 0.0140625*G0_1_0_2_1_2 - 0.0140625*G0_1_0_2_2_1 - 0.018080357142857*G0_1_0_2_2_2; + A[25] = 0.0113839285714286*G0_1_0_0_0_0 + 0.00245535714285714*G0_1_0_0_0_1 + 0.00892857142857142*G0_1_0_0_0_2 + 0.00245535714285714*G0_1_0_0_1_0 + 0.00111607142857142*G0_1_0_0_1_1 + 0.003125*G0_1_0_0_1_2 + 0.00892857142857142*G0_1_0_0_2_0 + 0.003125*G0_1_0_0_2_1 + 0.00937500000000002*G0_1_0_0_2_2 + 0.00245535714285714*G0_1_0_1_0_0 + 0.00111607142857142*G0_1_0_1_0_1 + 0.003125*G0_1_0_1_0_2 + 0.00111607142857142*G0_1_0_1_1_0 - 0.000669642857142879*G0_1_0_1_1_1 + 0.00357142857142857*G0_1_0_1_1_2 + 0.003125*G0_1_0_1_2_0 + 0.00357142857142857*G0_1_0_1_2_1 + 0.0174107142857143*G0_1_0_1_2_2 + 0.00892857142857143*G0_1_0_2_0_0 + 0.003125*G0_1_0_2_0_1 + 0.00937500000000002*G0_1_0_2_0_2 + 0.003125*G0_1_0_2_1_0 + 0.00357142857142857*G0_1_0_2_1_1 + 0.0174107142857143*G0_1_0_2_1_2 + 0.00937500000000002*G0_1_0_2_2_0 + 0.0174107142857143*G0_1_0_2_2_1 + 0.141964285714286*G0_1_0_2_2_2 + 0.0622767857142856*G0_1_1_0_0_0 + 0.0111607142857143*G0_1_1_0_0_1 + 0.00558035714285713*G0_1_1_0_0_2 + 0.0111607142857143*G0_1_1_0_1_0 + 0.00424107142857142*G0_1_1_0_1_1 + 0.00267857142857143*G0_1_1_0_1_2 + 0.00558035714285713*G0_1_1_0_2_0 + 0.00267857142857143*G0_1_1_0_2_1 + 0.00446428571428574*G0_1_1_0_2_2 + 0.0111607142857143*G0_1_1_1_0_0 + 0.00424107142857142*G0_1_1_1_0_1 + 0.00267857142857143*G0_1_1_1_0_2 + 0.00424107142857142*G0_1_1_1_1_0 + 0.00379464285714286*G0_1_1_1_1_2 + 0.00267857142857143*G0_1_1_1_2_0 + 0.00379464285714286*G0_1_1_1_2_1 + 0.015625*G0_1_1_1_2_2 + 0.00558035714285713*G0_1_1_2_0_0 + 0.00267857142857143*G0_1_1_2_0_1 + 0.00446428571428574*G0_1_1_2_0_2 + 0.00267857142857143*G0_1_1_2_1_0 + 0.00379464285714286*G0_1_1_2_1_1 + 0.015625*G0_1_1_2_1_2 + 0.00446428571428574*G0_1_1_2_2_0 + 0.015625*G0_1_1_2_2_1 + 0.124553571428572*G0_1_1_2_2_2; + A[85] = A[37] + 0.1265625*G0_0_0_0_0_0 + 0.00200892857142857*G0_0_0_0_0_1 + 0.0441964285714286*G0_0_0_0_0_2 + 0.00200892857142857*G0_0_0_0_1_0 - 0.00200892857142856*G0_0_0_0_1_1 + 0.0441964285714286*G0_0_0_0_2_0 + 0.0241071428571428*G0_0_0_0_2_2 + 0.00200892857142857*G0_0_0_1_0_0 - 0.00200892857142856*G0_0_0_1_0_1 - 0.00200892857142857*G0_0_0_1_1_0 - 0.1265625*G0_0_0_1_1_1 - 0.0441964285714284*G0_0_0_1_1_2 - 0.0441964285714284*G0_0_0_1_2_1 - 0.0241071428571428*G0_0_0_1_2_2 + 0.0441964285714286*G0_0_0_2_0_0 + 0.0241071428571428*G0_0_0_2_0_2 - 0.0441964285714285*G0_0_0_2_1_1 - 0.0241071428571428*G0_0_0_2_1_2 + 0.0241071428571428*G0_0_0_2_2_0 - 0.0241071428571428*G0_0_0_2_2_1 - 0.114508928571428*G0_0_1_0_0_0 + 0.0200892857142857*G0_0_1_0_0_1 + 0.0020089285714286*G0_0_1_0_0_2 + 0.0200892857142857*G0_0_1_0_1_0 + 0.0140625*G0_0_1_0_1_1 + 0.0020089285714286*G0_0_1_0_2_0 + 0.0080357142857143*G0_0_1_0_2_2 + 0.0200892857142857*G0_0_1_1_0_0 + 0.0140625*G0_0_1_1_0_1 + 0.0140625*G0_0_1_1_1_0 - 0.114508928571428*G0_0_1_1_1_1 - 0.0482142857142856*G0_0_1_1_1_2 - 0.0482142857142856*G0_0_1_1_2_1 - 0.0301339285714285*G0_0_1_1_2_2 + 0.0020089285714286*G0_0_1_2_0_0 + 0.0080357142857143*G0_0_1_2_0_2 - 0.0482142857142856*G0_0_1_2_1_1 - 0.0301339285714285*G0_0_1_2_1_2 + 0.00803571428571431*G0_0_1_2_2_0 - 0.0301339285714285*G0_0_1_2_2_1 - 0.0060267857142856*G0_0_1_2_2_2 + 0.0120535714285713*G0_1_0_0_0_0 + 0.0160714285714286*G0_1_0_0_0_1 - 0.00401785714285715*G0_1_0_0_0_2 + 0.0160714285714286*G0_1_0_0_1_0 + 0.0180803571428572*G0_1_0_0_1_1 - 0.00401785714285715*G0_1_0_0_2_0 - 0.0060267857142857*G0_1_0_0_2_2 + 0.0160714285714286*G0_1_0_1_0_0 + 0.0180803571428572*G0_1_0_1_0_1 + 0.0180803571428572*G0_1_0_1_1_0 - 0.241071428571428*G0_1_0_1_1_1 - 0.0421874999999999*G0_1_0_1_1_2 - 0.0421874999999999*G0_1_0_1_2_1 - 0.0160714285714285*G0_1_0_1_2_2 - 0.00401785714285715*G0_1_0_2_0_0 - 0.0060267857142857*G0_1_0_2_0_2 - 0.0421874999999999*G0_1_0_2_1_1 - 0.0160714285714285*G0_1_0_2_1_2 - 0.0060267857142857*G0_1_0_2_2_0 - 0.0160714285714285*G0_1_0_2_2_1 - 0.00602678571428569*G0_1_0_2_2_2 + 0.0120535714285714*G0_1_1_0_0_0 + 0.0160714285714286*G0_1_1_0_0_1 - 0.00401785714285713*G0_1_1_0_0_2 + 0.0160714285714286*G0_1_1_0_1_0 + 0.0180803571428572*G0_1_1_0_1_1 - 0.00401785714285713*G0_1_1_0_2_0 - 0.00602678571428569*G0_1_1_0_2_2 + 0.0160714285714286*G0_1_1_1_0_0 + 0.0180803571428572*G0_1_1_1_0_1 + 0.0180803571428572*G0_1_1_1_1_0 - 0.241071428571428*G0_1_1_1_1_1 - 0.0421874999999999*G0_1_1_1_1_2 - 0.0421874999999999*G0_1_1_1_2_1 - 0.0160714285714285*G0_1_1_1_2_2 - 0.00401785714285713*G0_1_1_2_0_0 - 0.00602678571428569*G0_1_1_2_0_2 - 0.0421874999999999*G0_1_1_2_1_1 - 0.0160714285714285*G0_1_1_2_1_2 - 0.00602678571428569*G0_1_1_2_2_0 - 0.0160714285714285*G0_1_1_2_2_1 - 0.00602678571428568*G0_1_1_2_2_2; + A[58] = A[85] + 0.108482142857142*G0_0_1_0_0_0 - 0.00602678571428574*G0_0_1_0_0_1 - 0.00602678571428575*G0_0_1_0_0_2 - 0.00602678571428574*G0_0_1_0_1_0 - 0.00200892857142856*G0_0_1_0_1_1 + 0.00200892857142856*G0_0_1_0_1_2 - 0.00602678571428575*G0_0_1_0_2_0 + 0.00200892857142856*G0_0_1_0_2_1 - 0.0140625*G0_0_1_0_2_2 - 0.00602678571428574*G0_0_1_1_0_0 - 0.00200892857142856*G0_0_1_1_0_1 + 0.00200892857142856*G0_0_1_1_0_2 - 0.00200892857142856*G0_0_1_1_1_0 - 0.0180803571428569*G0_0_1_1_1_1 + 0.00200892857142856*G0_0_1_1_2_0 - 0.00602678571428575*G0_0_1_2_0_0 + 0.00200892857142856*G0_0_1_2_0_1 - 0.0140625*G0_0_1_2_0_2 + 0.00200892857142856*G0_0_1_2_1_0 - 0.0140625*G0_0_1_2_2_0 - 0.0180803571428571*G0_0_1_2_2_2 - 0.108482142857142*G0_1_0_0_0_0 + 0.00602678571428574*G0_1_0_0_0_1 + 0.00602678571428575*G0_1_0_0_0_2 + 0.00602678571428574*G0_1_0_0_1_0 + 0.00200892857142856*G0_1_0_0_1_1 - 0.00200892857142856*G0_1_0_0_1_2 + 0.00602678571428576*G0_1_0_0_2_0 - 0.00200892857142856*G0_1_0_0_2_1 + 0.0140625*G0_1_0_0_2_2 + 0.00602678571428574*G0_1_0_1_0_0 + 0.00200892857142856*G0_1_0_1_0_1 - 0.00200892857142856*G0_1_0_1_0_2 + 0.00200892857142857*G0_1_0_1_1_0 + 0.0180803571428569*G0_1_0_1_1_1 - 0.00200892857142856*G0_1_0_1_2_0 + 0.00602678571428575*G0_1_0_2_0_0 - 0.00200892857142856*G0_1_0_2_0_1 + 0.0140625*G0_1_0_2_0_2 - 0.00200892857142856*G0_1_0_2_1_0 + 0.0140625*G0_1_0_2_2_0 + 0.0180803571428571*G0_1_0_2_2_2; + A[11] = 0.0125*G0_0_0_0_0_0 + 0.0050595238095238*G0_0_0_0_0_1 + 0.00416666666666666*G0_0_0_0_0_2 + 0.0050595238095238*G0_0_0_0_1_0 + 0.0193452380952381*G0_0_0_0_1_1 + 0.0025297619047619*G0_0_0_0_1_2 + 0.00416666666666666*G0_0_0_0_2_0 + 0.0025297619047619*G0_0_0_0_2_1 + 0.00416666666666666*G0_0_0_0_2_2 + 0.0050595238095238*G0_0_0_1_0_0 + 0.0193452380952381*G0_0_0_1_0_1 + 0.0025297619047619*G0_0_0_1_0_2 + 0.0193452380952381*G0_0_0_1_1_0 + 0.213392857142857*G0_0_0_1_1_1 + 0.0193452380952381*G0_0_0_1_1_2 + 0.0025297619047619*G0_0_0_1_2_0 + 0.0193452380952381*G0_0_0_1_2_1 + 0.0050595238095238*G0_0_0_1_2_2 + 0.00416666666666666*G0_0_0_2_0_0 + 0.0025297619047619*G0_0_0_2_0_1 + 0.00416666666666666*G0_0_0_2_0_2 + 0.0025297619047619*G0_0_0_2_1_0 + 0.0193452380952381*G0_0_0_2_1_1 + 0.0050595238095238*G0_0_0_2_1_2 + 0.00416666666666666*G0_0_0_2_2_0 + 0.0050595238095238*G0_0_0_2_2_1 + 0.0125*G0_0_0_2_2_2; + A[75] = A[73] - 0.108482142857143*G0_0_0_0_0_0 + 0.0200892857142857*G0_0_0_0_0_1 - 0.0160714285714286*G0_0_0_0_0_2 + 0.0200892857142857*G0_0_0_0_1_0 + 0.028125*G0_0_0_0_1_1 + 0.0120535714285714*G0_0_0_0_1_2 - 0.0160714285714286*G0_0_0_0_2_0 + 0.0120535714285714*G0_0_0_0_2_1 + 0.0200892857142857*G0_0_0_1_0_0 + 0.028125*G0_0_0_1_0_1 + 0.0120535714285714*G0_0_0_1_0_2 + 0.028125*G0_0_0_1_1_0 - 0.0361607142857142*G0_0_0_1_1_1 - 0.00803571428571426*G0_0_0_1_1_2 + 0.0120535714285714*G0_0_0_1_2_0 - 0.00803571428571426*G0_0_0_1_2_1 - 0.0160714285714286*G0_0_0_2_0_0 + 0.0120535714285714*G0_0_0_2_0_1 + 0.0120535714285714*G0_0_0_2_1_0 - 0.00803571428571426*G0_0_0_2_1_1 + 0.439955357142856*G0_0_1_0_0_0 + 0.0462053571428571*G0_0_1_0_0_1 + 0.032142857142857*G0_0_1_0_0_2 + 0.0462053571428571*G0_0_1_0_1_0 + 0.0261160714285714*G0_0_1_0_1_1 + 0.0100446428571428*G0_0_1_0_1_2 + 0.032142857142857*G0_0_1_0_2_0 + 0.0100446428571428*G0_0_1_0_2_1 + 0.00803571428571427*G0_0_1_0_2_2 + 0.0462053571428571*G0_0_1_1_0_0 + 0.0261160714285714*G0_0_1_1_0_1 + 0.0100446428571428*G0_0_1_1_0_2 + 0.0261160714285714*G0_0_1_1_1_0 - 0.174776785714285*G0_0_1_1_1_1 - 0.0120535714285714*G0_0_1_1_1_2 + 0.0100446428571428*G0_0_1_1_2_0 - 0.0120535714285714*G0_0_1_1_2_1 + 0.00803571428571429*G0_0_1_1_2_2 + 0.032142857142857*G0_0_1_2_0_0 + 0.0100446428571428*G0_0_1_2_0_1 + 0.00803571428571427*G0_0_1_2_0_2 + 0.0100446428571428*G0_0_1_2_1_0 - 0.0120535714285714*G0_0_1_2_1_1 + 0.00803571428571428*G0_0_1_2_1_2 + 0.00803571428571427*G0_0_1_2_2_0 + 0.00803571428571429*G0_0_1_2_2_1 + 0.0241071428571429*G0_0_1_2_2_2 + 0.132589285714286*G0_1_0_0_0_0 + 0.0562499999999999*G0_1_0_0_0_1 + 0.0441964285714285*G0_1_0_0_0_2 + 0.0562499999999999*G0_1_0_0_1_0 + 0.0361607142857142*G0_1_0_0_1_1 + 0.0200892857142857*G0_1_0_0_1_2 + 0.0441964285714285*G0_1_0_0_2_0 + 0.0200892857142857*G0_1_0_0_2_1 + 0.0241071428571428*G0_1_0_0_2_2 + 0.0562499999999999*G0_1_0_1_0_0 + 0.0361607142857142*G0_1_0_1_0_1 + 0.0200892857142857*G0_1_0_1_0_2 + 0.0361607142857142*G0_1_0_1_1_0 - 0.0482142857142856*G0_1_0_1_1_1 - 0.0120535714285714*G0_1_0_1_1_2 + 0.0200892857142857*G0_1_0_1_2_0 - 0.0120535714285714*G0_1_0_1_2_1 + 0.0441964285714285*G0_1_0_2_0_0 + 0.0200892857142857*G0_1_0_2_0_1 + 0.0241071428571428*G0_1_0_2_0_2 + 0.0200892857142857*G0_1_0_2_1_0 - 0.0120535714285714*G0_1_0_2_1_1 + 0.0241071428571428*G0_1_0_2_2_0 + 0.024107142857143*G0_1_0_2_2_2 - 0.162723214285714*G0_1_1_0_0_0 - 0.0200892857142857*G0_1_1_0_0_1 + 0.00200892857142857*G0_1_1_0_0_2 - 0.0200892857142857*G0_1_1_0_1_0 + 0.00602678571428574*G0_1_1_0_1_1 + 0.00602678571428571*G0_1_1_0_1_2 + 0.00200892857142857*G0_1_1_0_2_0 + 0.00602678571428571*G0_1_1_0_2_1 + 0.0120535714285714*G0_1_1_0_2_2 - 0.0200892857142857*G0_1_1_1_0_0 + 0.00602678571428574*G0_1_1_1_0_1 + 0.00602678571428571*G0_1_1_1_0_2 + 0.00602678571428575*G0_1_1_1_1_0 - 0.216964285714285*G0_1_1_1_1_1 - 0.0180803571428571*G0_1_1_1_1_2 + 0.00602678571428571*G0_1_1_1_2_0 - 0.0180803571428571*G0_1_1_1_2_1 + 0.00803571428571427*G0_1_1_1_2_2 + 0.00200892857142858*G0_1_1_2_0_0 + 0.00602678571428571*G0_1_1_2_0_1 + 0.0120535714285714*G0_1_1_2_0_2 + 0.00602678571428571*G0_1_1_2_1_0 - 0.0180803571428571*G0_1_1_2_1_1 + 0.00803571428571427*G0_1_1_2_1_2 + 0.0120535714285714*G0_1_1_2_2_0 + 0.00803571428571427*G0_1_1_2_2_1 + 0.0361607142857142*G0_1_1_2_2_2; + A[78] = -A[73] - 0.331473214285714*G0_0_0_0_0_0 - 0.0703124999999999*G0_0_0_0_0_1 - 0.0602678571428571*G0_0_0_0_0_2 - 0.0703124999999999*G0_0_0_0_1_0 - 0.0683035714285714*G0_0_0_0_1_1 - 0.0200892857142857*G0_0_0_0_1_2 - 0.0602678571428571*G0_0_0_0_2_0 - 0.0200892857142857*G0_0_0_0_2_1 - 0.0220982142857142*G0_0_0_0_2_2 - 0.0703124999999999*G0_0_0_1_0_0 - 0.0683035714285714*G0_0_0_1_0_1 - 0.0200892857142857*G0_0_0_1_0_2 - 0.0683035714285714*G0_0_0_1_1_0 - 0.204910714285714*G0_0_0_1_1_1 - 0.0160714285714285*G0_0_0_1_1_2 - 0.0200892857142857*G0_0_0_1_2_0 - 0.0160714285714285*G0_0_0_1_2_1 + 0.00200892857142856*G0_0_0_1_2_2 - 0.0602678571428571*G0_0_0_2_0_0 - 0.0200892857142857*G0_0_0_2_0_1 - 0.0220982142857142*G0_0_0_2_0_2 - 0.0200892857142857*G0_0_0_2_1_0 - 0.0160714285714285*G0_0_0_2_1_1 + 0.00200892857142857*G0_0_0_2_1_2 - 0.0220982142857142*G0_0_0_2_2_0 + 0.00200892857142856*G0_0_0_2_2_1 + 0.0120535714285714*G0_0_0_2_2_2 - 0.0904017857142858*G0_1_0_0_0_0 - 0.0883928571428571*G0_1_0_0_0_1 - 0.0180803571428571*G0_1_0_0_0_2 - 0.0883928571428571*G0_1_0_0_1_0 - 0.0843749999999999*G0_1_0_0_1_1 - 0.0200892857142857*G0_1_0_0_1_2 - 0.0180803571428571*G0_1_0_0_2_0 - 0.0200892857142857*G0_1_0_0_2_1 - 0.00602678571428572*G0_1_0_0_2_2 - 0.0883928571428571*G0_1_0_1_0_0 - 0.084375*G0_1_0_1_0_1 - 0.0200892857142857*G0_1_0_1_0_2 - 0.084375*G0_1_0_1_1_0 - 0.216964285714285*G0_1_0_1_1_1 - 0.0120535714285714*G0_1_0_1_1_2 - 0.0200892857142857*G0_1_0_1_2_0 - 0.0120535714285714*G0_1_0_1_2_1 + 0.00803571428571426*G0_1_0_1_2_2 - 0.0180803571428571*G0_1_0_2_0_0 - 0.0200892857142857*G0_1_0_2_0_1 - 0.00602678571428572*G0_1_0_2_0_2 - 0.0200892857142857*G0_1_0_2_1_0 - 0.0120535714285714*G0_1_0_2_1_1 + 0.00803571428571426*G0_1_0_2_1_2 - 0.00602678571428572*G0_1_0_2_2_0 + 0.00803571428571426*G0_1_0_2_2_1 + 0.0180803571428569*G0_1_0_2_2_2; + A[21] = 0.000446428571428567*G0_1_0_0_0_0 + 0.000595238095238094*G0_1_0_0_0_1 + 0.000595238095238094*G0_1_0_0_0_2 + 0.000595238095238094*G0_1_0_0_1_0 + 0.00372023809523809*G0_1_0_0_1_1 + 0.000520833333333332*G0_1_0_0_1_2 + 0.000595238095238095*G0_1_0_0_2_0 + 0.000520833333333332*G0_1_0_0_2_1 + 0.0037202380952381*G0_1_0_0_2_2 + 0.000595238095238094*G0_1_0_1_0_0 + 0.00372023809523809*G0_1_0_1_0_1 + 0.000520833333333332*G0_1_0_1_0_2 + 0.00372023809523809*G0_1_0_1_1_0 + 0.0285714285714285*G0_1_0_1_1_1 + 0.000148809523809518*G0_1_0_1_1_2 + 0.000520833333333332*G0_1_0_1_2_0 + 0.000148809523809518*G0_1_0_1_2_1 + 0.000148809523809532*G0_1_0_1_2_2 + 0.000595238095238094*G0_1_0_2_0_0 + 0.000520833333333332*G0_1_0_2_0_1 + 0.0037202380952381*G0_1_0_2_0_2 + 0.000520833333333332*G0_1_0_2_1_0 + 0.000148809523809518*G0_1_0_2_1_1 + 0.000148809523809532*G0_1_0_2_1_2 + 0.0037202380952381*G0_1_0_2_2_0 + 0.000148809523809532*G0_1_0_2_2_1 + 0.0285714285714287*G0_1_0_2_2_2; + A[1] = -A[21] - 0.0285714285714285*G0_0_0_0_0_0 - 0.000148809523809522*G0_0_0_0_0_1 - 0.00372023809523809*G0_0_0_0_0_2 - 0.000148809523809522*G0_0_0_0_1_0 - 0.000148809523809529*G0_0_0_0_1_1 - 0.000520833333333332*G0_0_0_0_1_2 - 0.00372023809523809*G0_0_0_0_2_0 - 0.000520833333333332*G0_0_0_0_2_1 - 0.000595238095238096*G0_0_0_0_2_2 - 0.000148809523809522*G0_0_0_1_0_0 - 0.000148809523809529*G0_0_0_1_0_1 - 0.000520833333333332*G0_0_0_1_0_2 - 0.000148809523809529*G0_0_0_1_1_0 - 0.0285714285714286*G0_0_0_1_1_1 - 0.00372023809523809*G0_0_0_1_1_2 - 0.000520833333333332*G0_0_0_1_2_0 - 0.00372023809523809*G0_0_0_1_2_1 - 0.000595238095238095*G0_0_0_1_2_2 - 0.00372023809523809*G0_0_0_2_0_0 - 0.000520833333333332*G0_0_0_2_0_1 - 0.000595238095238096*G0_0_0_2_0_2 - 0.000520833333333332*G0_0_0_2_1_0 - 0.00372023809523809*G0_0_0_2_1_1 - 0.000595238095238095*G0_0_0_2_1_2 - 0.000595238095238096*G0_0_0_2_2_0 - 0.000595238095238095*G0_0_0_2_2_1 - 0.000446428571428593*G0_0_0_2_2_2 - 0.028125*G0_1_0_0_0_0 + 0.000446428571428572*G0_1_0_0_0_1 - 0.00312499999999999*G0_1_0_0_0_2 + 0.000446428571428572*G0_1_0_0_1_0 + 0.00357142857142856*G0_1_0_0_1_1 - 0.00312499999999999*G0_1_0_0_2_0 + 0.003125*G0_1_0_0_2_2 + 0.000446428571428573*G0_1_0_1_0_0 + 0.00357142857142856*G0_1_0_1_0_1 + 0.00357142857142856*G0_1_0_1_1_0 - 0.00357142857142857*G0_1_0_1_1_2 - 0.00357142857142857*G0_1_0_1_2_1 - 0.000446428571428562*G0_1_0_1_2_2 - 0.00312499999999999*G0_1_0_2_0_0 + 0.003125*G0_1_0_2_0_2 - 0.00357142857142857*G0_1_0_2_1_1 - 0.000446428571428562*G0_1_0_2_1_2 + 0.003125*G0_1_0_2_2_0 - 0.000446428571428562*G0_1_0_2_2_1 + 0.0281250000000001*G0_1_0_2_2_2; + A[15] = A[16] - 0.0241071428571428*G0_0_0_0_0_0 + 0.00267857142857142*G0_0_0_0_0_1 - 0.00803571428571428*G0_0_0_0_0_2 + 0.00267857142857142*G0_0_0_0_1_0 + 0.00133928571428569*G0_0_0_0_1_1 + 0.000669642857142855*G0_0_0_0_1_2 - 0.00803571428571428*G0_0_0_0_2_0 + 0.000669642857142854*G0_0_0_0_2_1 + 0.00267857142857142*G0_0_0_1_0_0 + 0.00133928571428569*G0_0_0_1_0_1 + 0.000669642857142855*G0_0_0_1_0_2 + 0.00133928571428569*G0_0_0_1_1_0 - 0.00133928571428572*G0_0_0_1_1_2 + 0.000669642857142854*G0_0_0_1_2_0 - 0.00133928571428572*G0_0_0_1_2_1 - 0.00401785714285711*G0_0_0_1_2_2 - 0.00803571428571428*G0_0_0_2_0_0 + 0.000669642857142854*G0_0_0_2_0_1 + 0.000669642857142854*G0_0_0_2_1_0 - 0.00133928571428572*G0_0_0_2_1_1 - 0.00401785714285711*G0_0_0_2_1_2 - 0.00401785714285711*G0_0_0_2_2_1 + 0.048214285714286*G0_0_0_2_2_2 + 0.0241071428571428*G0_0_1_0_0_0 - 0.00133928571428572*G0_0_1_0_0_1 - 0.00803571428571428*G0_0_1_0_0_2 - 0.00133928571428572*G0_0_1_0_1_0 + 0.00133928571428571*G0_0_1_0_1_2 - 0.00803571428571428*G0_0_1_0_2_0 + 0.00133928571428571*G0_0_1_0_2_1 - 0.00803571428571424*G0_0_1_0_2_2 - 0.00133928571428572*G0_0_1_1_0_0 + 0.00133928571428571*G0_0_1_1_0_2 + 0.00133928571428571*G0_0_1_1_2_0 - 0.00133928571428569*G0_0_1_1_2_2 - 0.00803571428571428*G0_0_1_2_0_0 + 0.00133928571428571*G0_0_1_2_0_1 - 0.00803571428571424*G0_0_1_2_0_2 + 0.00133928571428571*G0_0_1_2_1_0 - 0.00133928571428569*G0_0_1_2_1_2 - 0.00803571428571424*G0_0_1_2_2_0 - 0.00133928571428569*G0_0_1_2_2_1 + 0.0241071428571432*G0_0_1_2_2_2; + A[51] = A[15] - 0.0261160714285714*G0_0_1_0_0_0 + 0.000892857142857145*G0_0_1_0_0_1 + 0.00245535714285713*G0_0_1_0_0_2 + 0.000892857142857144*G0_0_1_0_1_0 + 0.00178571428571429*G0_0_1_0_1_1 - 0.000669642857142856*G0_0_1_0_1_2 + 0.00245535714285713*G0_0_1_0_2_0 - 0.000669642857142856*G0_0_1_0_2_1 + 0.00558035714285712*G0_0_1_0_2_2 + 0.000892857142857143*G0_0_1_1_0_0 + 0.00178571428571429*G0_0_1_1_0_1 - 0.000669642857142856*G0_0_1_1_0_2 + 0.00178571428571429*G0_0_1_1_1_0 - 0.00178571428571428*G0_0_1_1_1_2 - 0.000669642857142857*G0_0_1_1_2_0 - 0.00178571428571428*G0_0_1_1_2_1 + 0.000446428571428563*G0_0_1_1_2_2 + 0.00245535714285713*G0_0_1_2_0_0 - 0.000669642857142856*G0_0_1_2_0_1 + 0.00558035714285712*G0_0_1_2_0_2 - 0.000669642857142856*G0_0_1_2_1_0 - 0.00178571428571428*G0_0_1_2_1_1 + 0.000446428571428563*G0_0_1_2_1_2 + 0.00558035714285712*G0_0_1_2_2_0 + 0.000446428571428563*G0_0_1_2_2_1 + 0.00200892857142843*G0_0_1_2_2_2 + 0.0261160714285714*G0_1_0_0_0_0 - 0.000892857142857143*G0_1_0_0_0_1 - 0.00245535714285713*G0_1_0_0_0_2 - 0.000892857142857144*G0_1_0_0_1_0 - 0.00178571428571429*G0_1_0_0_1_1 + 0.000669642857142856*G0_1_0_0_1_2 - 0.00245535714285713*G0_1_0_0_2_0 + 0.000669642857142856*G0_1_0_0_2_1 - 0.00558035714285712*G0_1_0_0_2_2 - 0.000892857142857143*G0_1_0_1_0_0 - 0.00178571428571429*G0_1_0_1_0_1 + 0.000669642857142856*G0_1_0_1_0_2 - 0.00178571428571429*G0_1_0_1_1_0 + 0.00178571428571428*G0_1_0_1_1_2 + 0.000669642857142857*G0_1_0_1_2_0 + 0.00178571428571428*G0_1_0_1_2_1 - 0.000446428571428563*G0_1_0_1_2_2 - 0.00245535714285713*G0_1_0_2_0_0 + 0.000669642857142856*G0_1_0_2_0_1 - 0.00558035714285712*G0_1_0_2_0_2 + 0.000669642857142857*G0_1_0_2_1_0 + 0.00178571428571428*G0_1_0_2_1_1 - 0.000446428571428563*G0_1_0_2_1_2 - 0.00558035714285712*G0_1_0_2_2_0 - 0.000446428571428563*G0_1_0_2_2_1 - 0.00200892857142843*G0_1_0_2_2_2; + A[31] = -A[51] - 0.0361607142857143*G0_0_0_0_0_0 + 0.00133928571428572*G0_0_0_0_0_1 - 0.01875*G0_0_0_0_0_2 + 0.00133928571428571*G0_0_0_0_1_0 + 0.0107142857142857*G0_0_0_0_1_1 - 0.01875*G0_0_0_0_2_0 - 0.0200892857142857*G0_0_0_0_2_2 + 0.00133928571428571*G0_0_0_1_0_0 + 0.0107142857142857*G0_0_0_1_0_1 + 0.0107142857142857*G0_0_0_1_1_0 + 0.120535714285714*G0_0_0_1_1_1 + 0.01875*G0_0_0_1_1_2 + 0.01875*G0_0_0_1_2_1 - 0.00401785714285713*G0_0_0_1_2_2 - 0.01875*G0_0_0_2_0_0 - 0.0200892857142857*G0_0_0_2_0_2 + 0.01875*G0_0_0_2_1_1 - 0.00401785714285713*G0_0_0_2_1_2 - 0.0200892857142857*G0_0_0_2_2_0 - 0.00401785714285713*G0_0_0_2_2_1 - 0.0482142857142856*G0_0_0_2_2_2 + 0.0267857142857142*G0_1_0_0_0_0 + 0.00624999999999998*G0_1_0_0_0_1 - 0.00223214285714286*G0_1_0_0_0_2 + 0.00624999999999998*G0_1_0_0_1_0 + 0.0370535714285714*G0_1_0_0_1_1 + 0.00424107142857142*G0_1_0_0_1_2 - 0.00223214285714286*G0_1_0_0_2_0 + 0.00424107142857142*G0_1_0_0_2_1 - 0.00535714285714283*G0_1_0_0_2_2 + 0.00624999999999998*G0_1_0_1_0_0 + 0.0370535714285714*G0_1_0_1_0_1 + 0.00424107142857142*G0_1_0_1_0_2 + 0.0370535714285714*G0_1_0_1_1_0 + 0.412499999999999*G0_1_0_1_1_1 + 0.0406249999999999*G0_1_0_1_1_2 + 0.00424107142857142*G0_1_0_1_2_0 + 0.0406249999999999*G0_1_0_1_2_1 + 0.00669642857142857*G0_1_0_1_2_2 - 0.00223214285714286*G0_1_0_2_0_0 + 0.00424107142857142*G0_1_0_2_0_1 - 0.00535714285714283*G0_1_0_2_0_2 + 0.00424107142857142*G0_1_0_2_1_0 + 0.0406249999999999*G0_1_0_2_1_1 + 0.00669642857142857*G0_1_0_2_1_2 - 0.00535714285714283*G0_1_0_2_2_0 + 0.00669642857142857*G0_1_0_2_2_1 - 0.00133928571428558*G0_1_0_2_2_2; + A[22] = 0.0125*G0_1_1_0_0_0 + 0.00416666666666666*G0_1_1_0_0_1 + 0.0050595238095238*G0_1_1_0_0_2 + 0.00416666666666666*G0_1_1_0_1_0 + 0.00416666666666666*G0_1_1_0_1_1 + 0.0025297619047619*G0_1_1_0_1_2 + 0.0050595238095238*G0_1_1_0_2_0 + 0.0025297619047619*G0_1_1_0_2_1 + 0.0193452380952381*G0_1_1_0_2_2 + 0.00416666666666666*G0_1_1_1_0_0 + 0.00416666666666666*G0_1_1_1_0_1 + 0.0025297619047619*G0_1_1_1_0_2 + 0.00416666666666666*G0_1_1_1_1_0 + 0.0125*G0_1_1_1_1_1 + 0.00505952380952381*G0_1_1_1_1_2 + 0.0025297619047619*G0_1_1_1_2_0 + 0.00505952380952381*G0_1_1_1_2_1 + 0.0193452380952381*G0_1_1_1_2_2 + 0.0050595238095238*G0_1_1_2_0_0 + 0.0025297619047619*G0_1_1_2_0_1 + 0.0193452380952381*G0_1_1_2_0_2 + 0.0025297619047619*G0_1_1_2_1_0 + 0.00505952380952381*G0_1_1_2_1_1 + 0.0193452380952381*G0_1_1_2_1_2 + 0.0193452380952381*G0_1_1_2_2_0 + 0.0193452380952381*G0_1_1_2_2_1 + 0.213392857142857*G0_1_1_2_2_2; + A[35] = -A[85] + 0.114508928571429*G0_0_0_0_0_0 - 0.0180803571428571*G0_0_0_0_0_1 + 0.0522321428571429*G0_0_0_0_0_2 - 0.0180803571428571*G0_0_0_0_1_0 - 0.0200892857142857*G0_0_0_0_1_1 - 0.00602678571428569*G0_0_0_0_1_2 + 0.0522321428571429*G0_0_0_0_2_0 - 0.00602678571428569*G0_0_0_0_2_1 + 0.0421874999999999*G0_0_0_0_2_2 - 0.0180803571428571*G0_0_0_1_0_0 - 0.0200892857142857*G0_0_0_1_0_1 - 0.00602678571428569*G0_0_0_1_0_2 - 0.0200892857142857*G0_0_0_1_1_0 - 0.0120535714285712*G0_0_0_1_1_1 + 0.00803571428571429*G0_0_0_1_1_2 - 0.00602678571428569*G0_0_0_1_2_0 + 0.00803571428571429*G0_0_0_1_2_1 + 0.0180803571428571*G0_0_0_1_2_2 + 0.0522321428571429*G0_0_0_2_0_0 - 0.00602678571428569*G0_0_0_2_0_1 + 0.0421874999999999*G0_0_0_2_0_2 - 0.00602678571428569*G0_0_0_2_1_0 + 0.00803571428571429*G0_0_0_2_1_1 + 0.0180803571428571*G0_0_0_2_1_2 + 0.0421874999999999*G0_0_0_2_2_0 + 0.0180803571428571*G0_0_0_2_2_1 + 0.0241071428571424*G0_0_0_2_2_2 - 0.1265625*G0_0_1_0_0_0 + 0.0100446428571429*G0_0_1_0_0_2 - 0.00401785714285712*G0_0_1_0_1_1 - 0.0060267857142857*G0_0_1_0_1_2 + 0.0100446428571429*G0_0_1_0_2_0 - 0.0060267857142857*G0_0_1_0_2_1 + 0.0261160714285714*G0_0_1_0_2_2 - 0.00401785714285712*G0_0_1_1_0_1 - 0.0060267857142857*G0_0_1_1_0_2 - 0.00401785714285712*G0_0_1_1_1_0 + 0.00401785714285714*G0_0_1_1_1_2 - 0.0060267857142857*G0_0_1_1_2_0 + 0.00401785714285714*G0_0_1_1_2_1 + 0.0120535714285714*G0_0_1_1_2_2 + 0.0100446428571429*G0_0_1_2_0_0 - 0.0060267857142857*G0_0_1_2_0_1 + 0.0261160714285714*G0_0_1_2_0_2 - 0.00602678571428569*G0_0_1_2_1_0 + 0.00401785714285714*G0_0_1_2_1_1 + 0.0120535714285714*G0_0_1_2_1_2 + 0.0261160714285714*G0_0_1_2_2_0 + 0.0120535714285714*G0_0_1_2_2_1 + 0.0180803571428567*G0_0_1_2_2_2; + A[86] = -A[35] + 0.0361607142857144*G0_0_0_0_0_0 + 0.028125*G0_0_0_0_0_2 - 0.00200892857142854*G0_0_0_0_1_1 + 0.028125*G0_0_0_0_2_0 + 0.0301339285714286*G0_0_0_0_2_2 - 0.00200892857142854*G0_0_0_1_0_1 - 0.00200892857142854*G0_0_0_1_1_0 + 0.0180803571428571*G0_0_0_1_1_1 + 0.0200892857142857*G0_0_0_1_1_2 + 0.0200892857142857*G0_0_0_1_2_1 + 0.0180803571428571*G0_0_0_1_2_2 + 0.028125*G0_0_0_2_0_0 + 0.0301339285714285*G0_0_0_2_0_2 + 0.0200892857142857*G0_0_0_2_1_1 + 0.0180803571428571*G0_0_0_2_1_2 + 0.0301339285714285*G0_0_0_2_2_0 + 0.0180803571428571*G0_0_0_2_2_1 - 0.0180803571428572*G0_0_1_0_0_1 - 0.0020089285714286*G0_0_1_0_0_2 - 0.0180803571428572*G0_0_1_0_1_0 - 0.0160714285714286*G0_0_1_0_1_1 - 0.0020089285714286*G0_0_1_0_2_0 + 0.00803571428571427*G0_0_1_0_2_2 - 0.0180803571428572*G0_0_1_1_0_0 - 0.0160714285714286*G0_0_1_1_0_1 - 0.0160714285714286*G0_0_1_1_1_0 + 0.0160714285714285*G0_0_1_1_1_2 + 0.0160714285714285*G0_0_1_1_2_1 + 0.0180803571428571*G0_0_1_1_2_2 - 0.0020089285714286*G0_0_1_2_0_0 + 0.00803571428571426*G0_0_1_2_0_2 + 0.0160714285714285*G0_0_1_2_1_1 + 0.0180803571428571*G0_0_1_2_1_2 + 0.00803571428571426*G0_0_1_2_2_0 + 0.0180803571428571*G0_0_1_2_2_1 - 0.0180803571428572*G0_0_1_2_2_2 + 0.0180803571428571*G0_1_0_0_0_0 + 0.00602678571428569*G0_1_0_0_0_2 - 0.00602678571428576*G0_1_0_0_1_1 + 0.00602678571428569*G0_1_0_0_2_0 - 0.00602678571428576*G0_1_0_1_0_1 - 0.00602678571428576*G0_1_0_1_1_0 + 0.00602678571428568*G0_1_0_1_1_2 + 0.00602678571428569*G0_1_0_1_2_1 + 0.00602678571428569*G0_1_0_2_0_0 + 0.00602678571428569*G0_1_0_2_1_1 - 0.036160714285714*G0_1_0_2_2_2 - 0.0180803571428569*G0_1_1_0_0_0 + 0.00602678571428571*G0_1_1_0_0_2 + 0.00602678571428571*G0_1_1_0_2_0 + 0.0060267857142857*G0_1_1_0_2_2 + 0.00602678571428571*G0_1_1_2_0_0 + 0.00602678571428569*G0_1_1_2_0_2 + 0.0060267857142857*G0_1_1_2_2_0 - 0.018080357142857*G0_1_1_2_2_2; + A[36] = -A[86] + 0.00602678571428572*G0_0_0_0_0_0 + 0.00602678571428574*G0_0_0_0_0_1 + 0.0160714285714286*G0_0_0_0_0_2 + 0.00602678571428574*G0_0_0_0_1_0 + 0.00401785714285716*G0_0_0_0_1_1 + 0.0160714285714286*G0_0_0_0_2_0 + 0.0421875*G0_0_0_0_2_2 + 0.00602678571428574*G0_0_0_1_0_0 + 0.00401785714285716*G0_0_0_1_0_1 + 0.00401785714285716*G0_0_0_1_1_0 - 0.0120535714285715*G0_0_0_1_1_1 - 0.0160714285714286*G0_0_0_1_1_2 - 0.0160714285714286*G0_0_0_1_2_1 - 0.018080357142857*G0_0_0_1_2_2 + 0.0160714285714286*G0_0_0_2_0_0 + 0.0421875*G0_0_0_2_0_2 - 0.0160714285714286*G0_0_0_2_1_1 - 0.018080357142857*G0_0_0_2_1_2 + 0.0421875*G0_0_0_2_2_0 - 0.018080357142857*G0_0_0_2_2_1 + 0.241071428571429*G0_0_0_2_2_2 - 0.0180803571428572*G0_0_1_0_0_0 - 0.0120535714285714*G0_0_1_0_0_1 - 0.0261160714285714*G0_0_1_0_0_2 - 0.0120535714285714*G0_0_1_0_1_0 - 0.00401785714285714*G0_0_1_0_1_1 + 0.00602678571428571*G0_0_1_0_1_2 - 0.0261160714285714*G0_0_1_0_2_0 + 0.00602678571428571*G0_0_1_0_2_1 - 0.0100446428571428*G0_0_1_0_2_2 - 0.0120535714285714*G0_0_1_1_0_0 - 0.00401785714285714*G0_0_1_1_0_1 + 0.00602678571428571*G0_0_1_1_0_2 - 0.00401785714285714*G0_0_1_1_1_0 + 0.00401785714285715*G0_0_1_1_1_2 + 0.00602678571428571*G0_0_1_1_2_0 + 0.00401785714285716*G0_0_1_1_2_1 - 0.0261160714285714*G0_0_1_2_0_0 + 0.00602678571428571*G0_0_1_2_0_1 - 0.0100446428571428*G0_0_1_2_0_2 + 0.00602678571428571*G0_0_1_2_1_0 + 0.00401785714285716*G0_0_1_2_1_1 - 0.0100446428571428*G0_0_1_2_2_0 + 0.126562500000001*G0_0_1_2_2_2; + A[64] = A[35] - 0.0482142857142858*G0_0_0_0_0_0 - 0.0482142857142857*G0_0_0_0_0_2 - 0.0120535714285714*G0_0_0_0_1_2 - 0.0482142857142857*G0_0_0_0_2_0 - 0.0120535714285714*G0_0_0_0_2_1 - 0.120535714285714*G0_0_0_0_2_2 - 0.0120535714285714*G0_0_0_1_0_2 - 0.0482142857142857*G0_0_0_1_1_1 - 0.0482142857142857*G0_0_0_1_1_2 - 0.0120535714285714*G0_0_0_1_2_0 - 0.0482142857142857*G0_0_0_1_2_1 - 0.120535714285714*G0_0_0_1_2_2 - 0.0482142857142857*G0_0_0_2_0_0 - 0.0120535714285714*G0_0_0_2_0_1 - 0.120535714285714*G0_0_0_2_0_2 - 0.0120535714285714*G0_0_0_2_1_0 - 0.0482142857142857*G0_0_0_2_1_1 - 0.120535714285714*G0_0_0_2_1_2 - 0.120535714285714*G0_0_0_2_2_0 - 0.120535714285714*G0_0_0_2_2_1 - 0.84375*G0_0_0_2_2_2 - 0.00602678571428561*G0_0_1_0_0_0 - 0.0220982142857143*G0_0_1_0_0_2 - 0.00803571428571429*G0_0_1_0_1_2 - 0.0220982142857143*G0_0_1_0_2_0 - 0.00803571428571429*G0_0_1_0_2_1 - 0.0542410714285714*G0_0_1_0_2_2 - 0.00803571428571429*G0_0_1_1_0_2 - 0.0421875000000001*G0_0_1_1_1_1 - 0.0462053571428571*G0_0_1_1_1_2 - 0.00803571428571429*G0_0_1_1_2_0 - 0.0462053571428571*G0_0_1_1_2_1 - 0.0904017857142857*G0_0_1_1_2_2 - 0.0220982142857143*G0_0_1_2_0_0 - 0.00803571428571429*G0_0_1_2_0_1 - 0.0542410714285714*G0_0_1_2_0_2 - 0.00803571428571429*G0_0_1_2_1_0 - 0.0462053571428571*G0_0_1_2_1_1 - 0.0904017857142857*G0_0_1_2_1_2 - 0.0542410714285714*G0_0_1_2_2_0 - 0.0904017857142857*G0_0_1_2_2_1 - 0.277232142857143*G0_0_1_2_2_2 - 0.00602678571428557*G0_1_0_0_0_0 - 0.00200892857142856*G0_1_0_0_0_2 - 0.00401785714285714*G0_1_0_0_1_2 - 0.00200892857142857*G0_1_0_0_2_0 - 0.00401785714285714*G0_1_0_0_2_1 - 0.0301339285714287*G0_1_0_0_2_2 - 0.00401785714285714*G0_1_0_1_0_2 - 0.0421874999999997*G0_1_0_1_1_1 - 0.0261160714285714*G0_1_0_1_1_2 - 0.00401785714285714*G0_1_0_1_2_0 - 0.0261160714285714*G0_1_0_1_2_1 - 0.0662946428571429*G0_1_0_1_2_2 - 0.00200892857142856*G0_1_0_2_0_0 - 0.00401785714285714*G0_1_0_2_0_1 - 0.0301339285714287*G0_1_0_2_0_2 - 0.00401785714285714*G0_1_0_2_1_0 - 0.0261160714285714*G0_1_0_2_1_1 - 0.066294642857143*G0_1_0_2_1_2 - 0.0301339285714287*G0_1_0_2_2_0 - 0.0662946428571429*G0_1_0_2_2_1 - 0.566517857142858*G0_1_0_2_2_2 + 0.0602678571428571*G0_1_1_0_0_0 + 0.0241071428571428*G0_1_1_0_0_1 + 0.0120535714285714*G0_1_1_0_0_2 + 0.0241071428571428*G0_1_1_0_1_0 + 0.0241071428571428*G0_1_1_0_1_1 + 0.00602678571428571*G0_1_1_0_1_2 + 0.0120535714285714*G0_1_1_0_2_0 + 0.00602678571428571*G0_1_1_0_2_1 + 0.0241071428571428*G0_1_1_1_0_0 + 0.0241071428571428*G0_1_1_1_0_1 + 0.00602678571428571*G0_1_1_1_0_2 + 0.0241071428571428*G0_1_1_1_1_0 + 0.0241071428571429*G0_1_1_1_1_1 - 0.0120535714285714*G0_1_1_1_1_2 + 0.00602678571428571*G0_1_1_1_2_0 - 0.0120535714285714*G0_1_1_1_2_1 - 0.0361607142857143*G0_1_1_1_2_2 + 0.0120535714285714*G0_1_1_2_0_0 + 0.00602678571428571*G0_1_1_2_0_1 + 0.00602678571428571*G0_1_1_2_1_0 - 0.0120535714285714*G0_1_1_2_1_1 - 0.0361607142857143*G0_1_1_2_1_2 - 0.0361607142857143*G0_1_1_2_2_1 - 0.156696428571429*G0_1_1_2_2_2; + A[46] = A[64] + 0.0180803571428573*G0_0_1_0_0_0 + 0.00602678571428575*G0_0_1_0_0_1 + 0.0160714285714285*G0_0_1_0_0_2 + 0.00602678571428575*G0_0_1_0_1_0 + 0.00602678571428575*G0_0_1_0_1_1 + 0.00803571428571428*G0_0_1_0_1_2 + 0.0160714285714285*G0_0_1_0_2_0 + 0.00803571428571428*G0_0_1_0_2_1 + 0.0120535714285713*G0_0_1_0_2_2 + 0.00602678571428575*G0_0_1_1_0_0 + 0.00602678571428575*G0_0_1_1_0_1 + 0.00803571428571428*G0_0_1_1_0_2 + 0.00602678571428575*G0_0_1_1_1_0 + 0.0180803571428573*G0_0_1_1_1_1 + 0.0160714285714286*G0_0_1_1_1_2 + 0.00803571428571428*G0_0_1_1_2_0 + 0.0160714285714286*G0_0_1_1_2_1 + 0.0120535714285713*G0_0_1_1_2_2 + 0.0160714285714285*G0_0_1_2_0_0 + 0.00803571428571428*G0_0_1_2_0_1 + 0.0120535714285713*G0_0_1_2_0_2 + 0.00803571428571428*G0_0_1_2_1_0 + 0.0160714285714286*G0_0_1_2_1_1 + 0.0120535714285713*G0_0_1_2_1_2 + 0.0120535714285713*G0_0_1_2_2_0 + 0.0120535714285713*G0_0_1_2_2_1 - 0.289285714285715*G0_0_1_2_2_2 - 0.0180803571428573*G0_1_0_0_0_0 - 0.00602678571428575*G0_1_0_0_0_1 - 0.0160714285714285*G0_1_0_0_0_2 - 0.00602678571428575*G0_1_0_0_1_0 - 0.00602678571428575*G0_1_0_0_1_1 - 0.00803571428571428*G0_1_0_0_1_2 - 0.0160714285714285*G0_1_0_0_2_0 - 0.00803571428571428*G0_1_0_0_2_1 - 0.0120535714285713*G0_1_0_0_2_2 - 0.00602678571428575*G0_1_0_1_0_0 - 0.00602678571428575*G0_1_0_1_0_1 - 0.00803571428571428*G0_1_0_1_0_2 - 0.00602678571428575*G0_1_0_1_1_0 - 0.0180803571428573*G0_1_0_1_1_1 - 0.0160714285714286*G0_1_0_1_1_2 - 0.00803571428571427*G0_1_0_1_2_0 - 0.0160714285714286*G0_1_0_1_2_1 - 0.0120535714285713*G0_1_0_1_2_2 - 0.0160714285714285*G0_1_0_2_0_0 - 0.00803571428571428*G0_1_0_2_0_1 - 0.0120535714285713*G0_1_0_2_0_2 - 0.00803571428571427*G0_1_0_2_1_0 - 0.0160714285714286*G0_1_0_2_1_1 - 0.0120535714285713*G0_1_0_2_1_2 - 0.0120535714285713*G0_1_0_2_2_0 - 0.0120535714285713*G0_1_0_2_2_1 + 0.289285714285715*G0_1_0_2_2_2; + A[92] = -0.0120535714285714*G0_0_1_0_0_0 - 0.00133928571428571*G0_0_1_0_0_1 - 0.00535714285714286*G0_0_1_0_0_2 - 0.00133928571428571*G0_0_1_0_1_0 + 0.00133928571428572*G0_0_1_0_1_1 - 0.00535714285714286*G0_0_1_0_2_0 + 0.00803571428571426*G0_0_1_0_2_2 - 0.00133928571428571*G0_0_1_1_0_0 + 0.00133928571428572*G0_0_1_1_0_1 + 0.00133928571428572*G0_0_1_1_1_0 + 0.0120535714285714*G0_0_1_1_1_1 + 0.00535714285714284*G0_0_1_1_1_2 + 0.00535714285714284*G0_0_1_1_2_1 - 0.0080357142857143*G0_0_1_1_2_2 - 0.00535714285714286*G0_0_1_2_0_0 + 0.00803571428571426*G0_0_1_2_0_2 + 0.00535714285714284*G0_0_1_2_1_1 - 0.0080357142857143*G0_0_1_2_1_2 + 0.00803571428571426*G0_0_1_2_2_0 - 0.0080357142857143*G0_0_1_2_2_1 + 0.0361607142857143*G0_1_1_0_0_0 + 0.01875*G0_1_1_0_0_1 - 0.00133928571428572*G0_1_1_0_0_2 + 0.01875*G0_1_1_0_1_0 + 0.0200892857142857*G0_1_1_0_1_1 - 0.00133928571428572*G0_1_1_0_2_0 - 0.0107142857142857*G0_1_1_0_2_2 + 0.01875*G0_1_1_1_0_0 + 0.0200892857142857*G0_1_1_1_0_1 + 0.0200892857142857*G0_1_1_1_1_0 + 0.0482142857142857*G0_1_1_1_1_1 + 0.00401785714285712*G0_1_1_1_1_2 + 0.00401785714285712*G0_1_1_1_2_1 - 0.01875*G0_1_1_1_2_2 - 0.00133928571428572*G0_1_1_2_0_0 - 0.0107142857142857*G0_1_1_2_0_2 + 0.00401785714285712*G0_1_1_2_1_1 - 0.01875*G0_1_1_2_1_2 - 0.0107142857142857*G0_1_1_2_2_0 - 0.01875*G0_1_1_2_2_1 - 0.120535714285714*G0_1_1_2_2_2; + A[61] = A[51] + 0.0241071428571428*G0_0_0_0_0_0 - 0.00267857142857142*G0_0_0_0_0_1 + 0.00803571428571428*G0_0_0_0_0_2 - 0.00267857142857142*G0_0_0_0_1_0 - 0.00133928571428569*G0_0_0_0_1_1 - 0.000669642857142855*G0_0_0_0_1_2 + 0.00803571428571428*G0_0_0_0_2_0 - 0.000669642857142854*G0_0_0_0_2_1 - 0.00267857142857142*G0_0_0_1_0_0 - 0.00133928571428569*G0_0_0_1_0_1 - 0.000669642857142855*G0_0_0_1_0_2 - 0.00133928571428569*G0_0_0_1_1_0 + 0.00133928571428572*G0_0_0_1_1_2 - 0.000669642857142855*G0_0_0_1_2_0 + 0.00133928571428572*G0_0_0_1_2_1 + 0.00401785714285711*G0_0_0_1_2_2 + 0.00803571428571428*G0_0_0_2_0_0 - 0.000669642857142854*G0_0_0_2_0_1 - 0.000669642857142854*G0_0_0_2_1_0 + 0.00133928571428572*G0_0_0_2_1_1 + 0.00401785714285711*G0_0_0_2_1_2 + 0.00401785714285711*G0_0_0_2_2_1 - 0.048214285714286*G0_0_0_2_2_2 - 0.0241071428571428*G0_1_0_0_0_0 + 0.00133928571428572*G0_1_0_0_0_1 + 0.00803571428571428*G0_1_0_0_0_2 + 0.00133928571428572*G0_1_0_0_1_0 - 0.00133928571428571*G0_1_0_0_1_2 + 0.00803571428571428*G0_1_0_0_2_0 - 0.00133928571428571*G0_1_0_0_2_1 + 0.00803571428571424*G0_1_0_0_2_2 + 0.00133928571428572*G0_1_0_1_0_0 - 0.00133928571428571*G0_1_0_1_0_2 - 0.00133928571428571*G0_1_0_1_2_0 + 0.00133928571428569*G0_1_0_1_2_2 + 0.00803571428571428*G0_1_0_2_0_0 - 0.00133928571428571*G0_1_0_2_0_1 + 0.00803571428571424*G0_1_0_2_0_2 - 0.00133928571428571*G0_1_0_2_1_0 + 0.00133928571428569*G0_1_0_2_1_2 + 0.00803571428571424*G0_1_0_2_2_0 + 0.00133928571428569*G0_1_0_2_2_1 - 0.0241071428571432*G0_1_0_2_2_2; + A[41] = -A[61] + 0.00267857142857143*G0_1_0_0_0_0 - 0.00312499999999998*G0_1_0_0_0_1 + 0.00446428571428571*G0_1_0_0_0_2 - 0.00312499999999999*G0_1_0_0_1_0 - 0.0191964285714285*G0_1_0_0_1_1 - 0.00379464285714284*G0_1_0_0_1_2 + 0.00446428571428571*G0_1_0_0_2_0 - 0.00379464285714284*G0_1_0_0_2_1 - 0.00312499999999999*G0_1_0_1_0_0 - 0.0191964285714285*G0_1_0_1_0_1 - 0.00379464285714285*G0_1_0_1_0_2 - 0.0191964285714285*G0_1_0_1_1_0 - 0.141964285714285*G0_1_0_1_1_1 - 0.00758928571428568*G0_1_0_1_1_2 - 0.00379464285714284*G0_1_0_1_2_0 - 0.00758928571428568*G0_1_0_1_2_1 - 0.00803571428571428*G0_1_0_1_2_2 + 0.00446428571428571*G0_1_0_2_0_0 - 0.00379464285714284*G0_1_0_2_0_1 - 0.00379464285714284*G0_1_0_2_1_0 - 0.00758928571428568*G0_1_0_2_1_1 - 0.00803571428571428*G0_1_0_2_1_2 - 0.00803571428571428*G0_1_0_2_2_1 - 0.0375000000000001*G0_1_0_2_2_2; + A[40] = -A[41] + 0.0180803571428572*G0_0_0_0_0_0 + 0.00200892857142858*G0_0_0_0_0_1 + 0.00803571428571428*G0_0_0_0_0_2 + 0.00200892857142858*G0_0_0_0_1_0 - 0.00200892857142857*G0_0_0_0_1_1 + 0.00803571428571428*G0_0_0_0_2_0 + 0.0120535714285714*G0_0_0_0_2_2 + 0.00200892857142858*G0_0_0_1_0_0 - 0.00200892857142857*G0_0_0_1_0_1 - 0.00200892857142857*G0_0_0_1_1_0 - 0.0180803571428572*G0_0_0_1_1_1 - 0.00803571428571428*G0_0_0_1_1_2 - 0.00803571428571428*G0_0_0_1_2_1 - 0.0120535714285714*G0_0_0_1_2_2 + 0.00803571428571428*G0_0_0_2_0_0 + 0.0120535714285714*G0_0_0_2_0_2 - 0.00803571428571428*G0_0_0_2_1_1 - 0.0120535714285714*G0_0_0_2_1_2 + 0.0120535714285714*G0_0_0_2_2_0 - 0.0120535714285714*G0_0_0_2_2_1 + 0.0174107142857144*G0_0_1_0_0_0 + 0.0017857142857143*G0_0_1_0_0_1 + 0.00491071428571428*G0_0_1_0_0_2 + 0.0017857142857143*G0_0_1_0_1_0 - 0.000223214285714284*G0_0_1_0_1_1 + 0.00044642857142857*G0_0_1_0_1_2 + 0.00491071428571428*G0_0_1_0_2_0 + 0.00044642857142857*G0_0_1_0_2_1 + 0.00334821428571426*G0_0_1_0_2_2 + 0.0017857142857143*G0_0_1_1_0_0 - 0.000223214285714284*G0_0_1_1_0_1 + 0.00044642857142857*G0_0_1_1_0_2 - 0.000223214285714284*G0_0_1_1_1_0 - 0.00066964285714287*G0_0_1_1_1_1 - 0.00312500000000001*G0_0_1_1_1_2 + 0.00044642857142857*G0_0_1_1_2_0 - 0.00312500000000001*G0_0_1_1_2_1 - 0.00870535714285717*G0_0_1_1_2_2 + 0.00491071428571428*G0_0_1_2_0_0 + 0.00044642857142857*G0_0_1_2_0_1 + 0.00334821428571426*G0_0_1_2_0_2 + 0.00044642857142857*G0_0_1_2_1_0 - 0.00312500000000001*G0_0_1_2_1_1 - 0.00870535714285717*G0_0_1_2_1_2 + 0.00334821428571426*G0_0_1_2_2_0 - 0.00870535714285717*G0_0_1_2_2_1 - 0.0508928571428574*G0_0_1_2_2_2 + 0.0180803571428573*G0_1_0_0_0_0 + 0.00200892857142858*G0_1_0_0_0_2 - 0.0180803571428571*G0_1_0_0_1_1 - 0.00200892857142856*G0_1_0_0_1_2 + 0.00200892857142858*G0_1_0_0_2_0 - 0.00200892857142856*G0_1_0_0_2_1 - 0.0180803571428571*G0_1_0_1_0_1 - 0.00200892857142856*G0_1_0_1_0_2 - 0.0180803571428571*G0_1_0_1_1_0 - 0.144642857142857*G0_1_0_1_1_1 - 0.0180803571428571*G0_1_0_1_1_2 - 0.00200892857142856*G0_1_0_1_2_0 - 0.0180803571428571*G0_1_0_1_2_1 - 0.0200892857142857*G0_1_0_1_2_2 + 0.00200892857142858*G0_1_0_2_0_0 - 0.00200892857142856*G0_1_0_2_0_1 - 0.00200892857142856*G0_1_0_2_1_0 - 0.0180803571428571*G0_1_0_2_1_1 - 0.0200892857142857*G0_1_0_2_1_2 - 0.0200892857142857*G0_1_0_2_2_1 - 0.0361607142857143*G0_1_0_2_2_2 + 0.0174107142857145*G0_1_1_0_0_0 + 0.00357142857142859*G0_1_1_0_0_1 + 0.00312500000000001*G0_1_1_0_0_2 + 0.00357142857142859*G0_1_1_0_1_0 - 0.000669642857142848*G0_1_1_0_1_1 + 0.00111607142857143*G0_1_1_0_1_2 + 0.00312500000000001*G0_1_1_0_2_0 + 0.00111607142857143*G0_1_1_0_2_1 + 0.00245535714285713*G0_1_1_0_2_2 + 0.00357142857142859*G0_1_1_1_0_0 - 0.000669642857142847*G0_1_1_1_0_1 + 0.00111607142857143*G0_1_1_1_0_2 - 0.000669642857142847*G0_1_1_1_1_0 - 0.0026785714285714*G0_1_1_1_1_1 - 0.00870535714285712*G0_1_1_1_1_2 + 0.00111607142857143*G0_1_1_1_2_0 - 0.00870535714285712*G0_1_1_1_2_1 - 0.0111607142857143*G0_1_1_1_2_2 + 0.00312500000000001*G0_1_1_2_0_0 + 0.00111607142857143*G0_1_1_2_0_1 + 0.00245535714285713*G0_1_1_2_0_2 + 0.00111607142857143*G0_1_1_2_1_0 - 0.00870535714285712*G0_1_1_2_1_1 - 0.0111607142857143*G0_1_1_2_1_2 + 0.00245535714285713*G0_1_1_2_2_0 - 0.0111607142857143*G0_1_1_2_2_1 - 0.0247767857142858*G0_1_1_2_2_2; + A[4] = A[40] + 0.00178571428571429*G0_0_1_0_0_1 - 0.00178571428571428*G0_0_1_0_0_2 + 0.00178571428571429*G0_0_1_0_1_0 - 0.000446428571428566*G0_0_1_0_1_1 + 0.000669642857142856*G0_0_1_0_1_2 - 0.00178571428571428*G0_0_1_0_2_0 + 0.000669642857142856*G0_0_1_0_2_1 - 0.000892857142857134*G0_0_1_0_2_2 + 0.00178571428571429*G0_0_1_1_0_0 - 0.000446428571428565*G0_0_1_1_0_1 + 0.000669642857142856*G0_0_1_1_0_2 - 0.000446428571428565*G0_0_1_1_1_0 - 0.00200892857142851*G0_0_1_1_1_1 - 0.00558035714285712*G0_0_1_1_1_2 + 0.000669642857142856*G0_0_1_1_2_0 - 0.00558035714285712*G0_0_1_1_2_1 - 0.00245535714285712*G0_0_1_1_2_2 - 0.00178571428571428*G0_0_1_2_0_0 + 0.000669642857142856*G0_0_1_2_0_1 - 0.000892857142857133*G0_0_1_2_0_2 + 0.000669642857142856*G0_0_1_2_1_0 - 0.00558035714285712*G0_0_1_2_1_1 - 0.00245535714285712*G0_0_1_2_1_2 - 0.000892857142857134*G0_0_1_2_2_0 - 0.00245535714285712*G0_0_1_2_2_1 + 0.0261160714285716*G0_0_1_2_2_2 - 0.00178571428571429*G0_1_0_0_0_1 + 0.00178571428571428*G0_1_0_0_0_2 - 0.00178571428571429*G0_1_0_0_1_0 + 0.000446428571428565*G0_1_0_0_1_1 - 0.000669642857142856*G0_1_0_0_1_2 + 0.00178571428571428*G0_1_0_0_2_0 - 0.000669642857142856*G0_1_0_0_2_1 + 0.000892857142857136*G0_1_0_0_2_2 - 0.00178571428571429*G0_1_0_1_0_0 + 0.000446428571428564*G0_1_0_1_0_1 - 0.000669642857142856*G0_1_0_1_0_2 + 0.000446428571428565*G0_1_0_1_1_0 + 0.00200892857142851*G0_1_0_1_1_1 + 0.00558035714285712*G0_1_0_1_1_2 - 0.000669642857142856*G0_1_0_1_2_0 + 0.00558035714285712*G0_1_0_1_2_1 + 0.00245535714285712*G0_1_0_1_2_2 + 0.00178571428571428*G0_1_0_2_0_0 - 0.000669642857142856*G0_1_0_2_0_1 + 0.000892857142857133*G0_1_0_2_0_2 - 0.000669642857142856*G0_1_0_2_1_0 + 0.00558035714285712*G0_1_0_2_1_1 + 0.00245535714285712*G0_1_0_2_1_2 + 0.000892857142857135*G0_1_0_2_2_0 + 0.00245535714285712*G0_1_0_2_2_1 - 0.0261160714285716*G0_1_0_2_2_2; + A[7] = -A[4] - 0.291964285714285*G0_0_0_0_0_0 - 0.0218749999999999*G0_0_0_0_0_1 - 0.0263392857142856*G0_0_0_0_0_2 - 0.0218749999999999*G0_0_0_0_1_0 - 0.0107142857142857*G0_0_0_0_1_1 - 0.00424107142857142*G0_0_0_0_1_2 - 0.0263392857142856*G0_0_0_0_2_0 - 0.00424107142857142*G0_0_0_0_2_1 - 0.00491071428571429*G0_0_0_0_2_2 - 0.0218749999999999*G0_0_0_1_0_0 - 0.0107142857142857*G0_0_0_1_0_1 - 0.00424107142857142*G0_0_0_1_0_2 - 0.0107142857142857*G0_0_0_1_1_0 - 0.046875*G0_0_0_1_1_1 - 0.0147321428571428*G0_0_0_1_1_2 - 0.00424107142857142*G0_0_0_1_2_0 - 0.0147321428571428*G0_0_0_1_2_1 - 0.0165178571428572*G0_0_0_1_2_2 - 0.0263392857142856*G0_0_0_2_0_0 - 0.00424107142857142*G0_0_0_2_0_1 - 0.0049107142857143*G0_0_0_2_0_2 - 0.00424107142857142*G0_0_0_2_1_0 - 0.0147321428571428*G0_0_0_2_1_1 - 0.0165178571428572*G0_0_0_2_1_2 - 0.00491071428571429*G0_0_0_2_2_0 - 0.0165178571428572*G0_0_0_2_2_1 - 0.0629464285714288*G0_0_0_2_2_2 + 0.120535714285714*G0_0_1_0_0_0 + 0.01875*G0_0_1_0_0_1 + 0.0107142857142857*G0_0_1_0_0_2 + 0.01875*G0_0_1_0_1_0 - 0.00401785714285712*G0_0_1_0_1_1 + 0.0107142857142857*G0_0_1_0_2_0 + 0.00133928571428571*G0_0_1_0_2_2 + 0.01875*G0_0_1_1_0_0 - 0.00401785714285713*G0_0_1_1_0_1 - 0.00401785714285713*G0_0_1_1_1_0 - 0.0482142857142856*G0_0_1_1_1_1 - 0.0200892857142857*G0_0_1_1_1_2 - 0.0200892857142857*G0_0_1_1_2_1 - 0.01875*G0_0_1_1_2_2 + 0.0107142857142857*G0_0_1_2_0_0 + 0.00133928571428571*G0_0_1_2_0_2 - 0.0200892857142857*G0_0_1_2_1_1 - 0.01875*G0_0_1_2_1_2 + 0.00133928571428571*G0_0_1_2_2_0 - 0.01875*G0_0_1_2_2_1 - 0.0361607142857143*G0_0_1_2_2_2 - 0.291964285714285*G0_1_0_0_0_0 - 0.021875*G0_1_0_0_0_1 - 0.0263392857142856*G0_1_0_0_0_2 - 0.021875*G0_1_0_0_1_0 - 0.0107142857142857*G0_1_0_0_1_1 - 0.00424107142857142*G0_1_0_0_1_2 - 0.0263392857142856*G0_1_0_0_2_0 - 0.00424107142857142*G0_1_0_0_2_1 - 0.00491071428571429*G0_1_0_0_2_2 - 0.021875*G0_1_0_1_0_0 - 0.0107142857142857*G0_1_0_1_0_1 - 0.00424107142857142*G0_1_0_1_0_2 - 0.0107142857142857*G0_1_0_1_1_0 - 0.0468749999999999*G0_1_0_1_1_1 - 0.0147321428571428*G0_1_0_1_1_2 - 0.00424107142857142*G0_1_0_1_2_0 - 0.0147321428571428*G0_1_0_1_2_1 - 0.0165178571428572*G0_1_0_1_2_2 - 0.0263392857142856*G0_1_0_2_0_0 - 0.00424107142857142*G0_1_0_2_0_1 - 0.00491071428571429*G0_1_0_2_0_2 - 0.00424107142857142*G0_1_0_2_1_0 - 0.0147321428571428*G0_1_0_2_1_1 - 0.0165178571428572*G0_1_0_2_1_2 - 0.00491071428571429*G0_1_0_2_2_0 - 0.0165178571428571*G0_1_0_2_2_1 - 0.0629464285714288*G0_1_0_2_2_2 + 0.120535714285714*G0_1_1_0_0_0 + 0.01875*G0_1_1_0_0_1 + 0.0107142857142857*G0_1_1_0_0_2 + 0.01875*G0_1_1_0_1_0 - 0.00401785714285712*G0_1_1_0_1_1 + 0.0107142857142857*G0_1_1_0_2_0 + 0.00133928571428571*G0_1_1_0_2_2 + 0.01875*G0_1_1_1_0_0 - 0.00401785714285712*G0_1_1_1_0_1 - 0.00401785714285712*G0_1_1_1_1_0 - 0.0482142857142856*G0_1_1_1_1_1 - 0.0200892857142857*G0_1_1_1_1_2 - 0.0200892857142857*G0_1_1_1_2_1 - 0.01875*G0_1_1_1_2_2 + 0.0107142857142857*G0_1_1_2_0_0 + 0.00133928571428571*G0_1_1_2_0_2 - 0.0200892857142857*G0_1_1_2_1_1 - 0.01875*G0_1_1_2_1_2 + 0.00133928571428571*G0_1_1_2_2_0 - 0.01875*G0_1_1_2_2_1 - 0.0361607142857143*G0_1_1_2_2_2; + A[60] = -A[40] + 0.141964285714286*G0_1_0_0_0_0 + 0.0191964285714286*G0_1_0_0_0_1 + 0.00758928571428569*G0_1_0_0_0_2 + 0.0191964285714286*G0_1_0_0_1_0 + 0.00312500000000001*G0_1_0_0_1_1 + 0.00379464285714285*G0_1_0_0_1_2 + 0.0075892857142857*G0_1_0_0_2_0 + 0.00379464285714285*G0_1_0_0_2_1 + 0.00803571428571427*G0_1_0_0_2_2 + 0.0191964285714286*G0_1_0_1_0_0 + 0.00312500000000001*G0_1_0_1_0_1 + 0.00379464285714285*G0_1_0_1_0_2 + 0.00312500000000001*G0_1_0_1_1_0 - 0.00267857142857137*G0_1_0_1_1_1 - 0.0044642857142857*G0_1_0_1_1_2 + 0.00379464285714285*G0_1_0_1_2_0 - 0.0044642857142857*G0_1_0_1_2_1 + 0.0075892857142857*G0_1_0_2_0_0 + 0.00379464285714285*G0_1_0_2_0_1 + 0.00803571428571427*G0_1_0_2_0_2 + 0.00379464285714285*G0_1_0_2_1_0 - 0.0044642857142857*G0_1_0_2_1_1 + 0.00803571428571428*G0_1_0_2_2_0 + 0.0375000000000001*G0_1_0_2_2_2 + 0.141964285714286*G0_1_1_0_0_0 + 0.0191964285714286*G0_1_1_0_0_1 + 0.0075892857142857*G0_1_1_0_0_2 + 0.0191964285714286*G0_1_1_0_1_0 + 0.00312500000000001*G0_1_1_0_1_1 + 0.00379464285714285*G0_1_1_0_1_2 + 0.0075892857142857*G0_1_1_0_2_0 + 0.00379464285714285*G0_1_1_0_2_1 + 0.00803571428571428*G0_1_1_0_2_2 + 0.0191964285714286*G0_1_1_1_0_0 + 0.00312500000000001*G0_1_1_1_0_1 + 0.00379464285714285*G0_1_1_1_0_2 + 0.00312500000000001*G0_1_1_1_1_0 - 0.0026785714285714*G0_1_1_1_1_1 - 0.0044642857142857*G0_1_1_1_1_2 + 0.00379464285714285*G0_1_1_1_2_0 - 0.0044642857142857*G0_1_1_1_2_1 + 0.0075892857142857*G0_1_1_2_0_0 + 0.00379464285714285*G0_1_1_2_0_1 + 0.00803571428571428*G0_1_1_2_0_2 + 0.00379464285714285*G0_1_1_2_1_0 - 0.0044642857142857*G0_1_1_2_1_1 + 0.00803571428571428*G0_1_1_2_2_0 + 0.0375000000000001*G0_1_1_2_2_2; + A[71] = -A[41] + 0.0629464285714285*G0_0_0_0_0_0 + 0.00580357142857142*G0_0_0_0_0_1 + 0.0142857142857143*G0_0_0_0_0_2 + 0.00580357142857142*G0_0_0_0_1_0 + 0.00267857142857141*G0_0_0_0_1_1 + 0.00223214285714285*G0_0_0_0_1_2 + 0.0142857142857143*G0_0_0_0_2_0 + 0.00223214285714285*G0_0_0_0_2_1 + 0.0129464285714286*G0_0_0_0_2_2 + 0.00580357142857142*G0_0_0_1_0_0 + 0.00267857142857141*G0_0_0_1_0_1 + 0.00223214285714285*G0_0_0_1_0_2 + 0.00267857142857141*G0_0_0_1_1_0 + 0.107142857142857*G0_0_0_1_1_1 + 0.0107142857142857*G0_0_0_1_1_2 + 0.00223214285714285*G0_0_0_1_2_0 + 0.0107142857142857*G0_0_0_1_2_1 + 0.000446428571428581*G0_0_0_1_2_2 + 0.0142857142857143*G0_0_0_2_0_0 + 0.00223214285714285*G0_0_0_2_0_1 + 0.0129464285714286*G0_0_0_2_0_2 + 0.00223214285714285*G0_0_0_2_1_0 + 0.0107142857142857*G0_0_0_2_1_1 + 0.000446428571428581*G0_0_0_2_1_2 + 0.0129464285714286*G0_0_0_2_2_0 + 0.000446428571428581*G0_0_0_2_2_1 + 0.0508928571428573*G0_0_0_2_2_2 + 0.0120535714285714*G0_1_0_0_0_0 + 0.00535714285714286*G0_1_0_0_0_1 + 0.00133928571428571*G0_1_0_0_0_2 + 0.00535714285714286*G0_1_0_0_1_0 - 0.00803571428571428*G0_1_0_0_1_1 + 0.00133928571428571*G0_1_0_0_2_0 - 0.0013392857142857*G0_1_0_0_2_2 + 0.00535714285714286*G0_1_0_1_0_0 - 0.00803571428571428*G0_1_0_1_0_1 - 0.00803571428571428*G0_1_0_1_1_0 + 0.00803571428571429*G0_1_0_1_1_2 + 0.00803571428571428*G0_1_0_1_2_1 - 0.00535714285714284*G0_1_0_1_2_2 + 0.00133928571428572*G0_1_0_2_0_0 - 0.0013392857142857*G0_1_0_2_0_2 + 0.00803571428571429*G0_1_0_2_1_1 - 0.00535714285714284*G0_1_0_2_1_2 - 0.0013392857142857*G0_1_0_2_2_0 - 0.00535714285714284*G0_1_0_2_2_1 - 0.0120535714285713*G0_1_0_2_2_2; + A[57] = A[75] - 0.289285714285714*G0_0_1_0_0_0 + 0.0120535714285715*G0_0_1_0_0_1 + 0.0120535714285715*G0_0_1_0_0_2 + 0.0120535714285715*G0_0_1_0_1_0 + 0.0160714285714286*G0_0_1_0_1_1 + 0.00803571428571428*G0_0_1_0_1_2 + 0.0120535714285715*G0_0_1_0_2_0 + 0.00803571428571428*G0_0_1_0_2_1 + 0.0160714285714285*G0_0_1_0_2_2 + 0.0120535714285715*G0_0_1_1_0_0 + 0.0160714285714286*G0_0_1_1_0_1 + 0.00803571428571428*G0_0_1_1_0_2 + 0.0160714285714286*G0_0_1_1_1_0 + 0.0180803571428571*G0_0_1_1_1_1 + 0.0060267857142857*G0_0_1_1_1_2 + 0.00803571428571428*G0_0_1_1_2_0 + 0.00602678571428571*G0_0_1_1_2_1 + 0.0060267857142857*G0_0_1_1_2_2 + 0.0120535714285715*G0_0_1_2_0_0 + 0.00803571428571428*G0_0_1_2_0_1 + 0.0160714285714285*G0_0_1_2_0_2 + 0.00803571428571428*G0_0_1_2_1_0 + 0.0060267857142857*G0_0_1_2_1_1 + 0.0060267857142857*G0_0_1_2_1_2 + 0.0160714285714285*G0_0_1_2_2_0 + 0.00602678571428571*G0_0_1_2_2_1 + 0.0180803571428571*G0_0_1_2_2_2 + 0.289285714285714*G0_1_0_0_0_0 - 0.0120535714285715*G0_1_0_0_0_1 - 0.0120535714285715*G0_1_0_0_0_2 - 0.0120535714285715*G0_1_0_0_1_0 - 0.0160714285714286*G0_1_0_0_1_1 - 0.00803571428571428*G0_1_0_0_1_2 - 0.0120535714285715*G0_1_0_0_2_0 - 0.00803571428571428*G0_1_0_0_2_1 - 0.0160714285714285*G0_1_0_0_2_2 - 0.0120535714285715*G0_1_0_1_0_0 - 0.0160714285714286*G0_1_0_1_0_1 - 0.00803571428571428*G0_1_0_1_0_2 - 0.0160714285714286*G0_1_0_1_1_0 - 0.0180803571428571*G0_1_0_1_1_1 - 0.00602678571428571*G0_1_0_1_1_2 - 0.00803571428571428*G0_1_0_1_2_0 - 0.00602678571428571*G0_1_0_1_2_1 - 0.0060267857142857*G0_1_0_1_2_2 - 0.0120535714285715*G0_1_0_2_0_0 - 0.00803571428571428*G0_1_0_2_0_1 - 0.0160714285714285*G0_1_0_2_0_2 - 0.00803571428571428*G0_1_0_2_1_0 - 0.00602678571428571*G0_1_0_2_1_1 - 0.00602678571428571*G0_1_0_2_1_2 - 0.0160714285714285*G0_1_0_2_2_0 - 0.0060267857142857*G0_1_0_2_2_1 - 0.0180803571428571*G0_1_0_2_2_2; + A[74] = -A[86] - 0.0180803571428572*G0_0_0_0_0_0 + 0.00602678571428573*G0_0_0_0_0_1 + 0.00602678571428573*G0_0_0_0_1_0 + 0.00602678571428574*G0_0_0_0_1_1 + 0.00602678571428573*G0_0_0_1_0_0 + 0.00602678571428574*G0_0_0_1_0_1 + 0.00602678571428574*G0_0_0_1_1_0 - 0.0180803571428571*G0_0_0_1_1_1 - 0.00200892857142858*G0_0_1_0_0_1 - 0.0180803571428572*G0_0_1_0_0_2 - 0.00200892857142857*G0_0_1_0_1_0 + 0.00803571428571431*G0_0_1_0_1_1 - 0.0180803571428572*G0_0_1_0_2_0 - 0.0160714285714285*G0_0_1_0_2_2 - 0.00200892857142857*G0_0_1_1_0_0 + 0.00803571428571431*G0_0_1_1_0_1 + 0.00803571428571431*G0_0_1_1_1_0 - 0.018080357142857*G0_0_1_1_1_1 + 0.0180803571428571*G0_0_1_1_1_2 + 0.0180803571428571*G0_0_1_1_2_1 + 0.0160714285714286*G0_0_1_1_2_2 - 0.0180803571428572*G0_0_1_2_0_0 - 0.0160714285714285*G0_0_1_2_0_2 + 0.0180803571428571*G0_0_1_2_1_1 + 0.0160714285714286*G0_0_1_2_1_2 - 0.0160714285714285*G0_0_1_2_2_0 + 0.0160714285714286*G0_0_1_2_2_1 + 0.0180803571428572*G0_1_0_0_0_0 + 0.00602678571428573*G0_1_0_0_0_1 + 0.00602678571428573*G0_1_0_0_1_0 - 0.00602678571428564*G0_1_0_0_2_2 + 0.00602678571428573*G0_1_0_1_0_0 - 0.0361607142857143*G0_1_0_1_1_1 + 0.00602678571428574*G0_1_0_1_2_2 - 0.00602678571428564*G0_1_0_2_0_2 + 0.00602678571428574*G0_1_0_2_1_2 - 0.00602678571428564*G0_1_0_2_2_0 + 0.00602678571428574*G0_1_0_2_2_1 + 0.0361607142857146*G0_1_1_0_0_0 + 0.0281250000000001*G0_1_1_0_0_1 + 0.0281250000000001*G0_1_1_0_1_0 + 0.0301339285714286*G0_1_1_0_1_1 - 0.00200892857142854*G0_1_1_0_2_2 + 0.0281250000000001*G0_1_1_1_0_0 + 0.0301339285714286*G0_1_1_1_0_1 + 0.0301339285714286*G0_1_1_1_1_0 + 0.0180803571428571*G0_1_1_1_1_2 + 0.0180803571428571*G0_1_1_1_2_1 + 0.0200892857142857*G0_1_1_1_2_2 - 0.00200892857142854*G0_1_1_2_0_2 + 0.0180803571428571*G0_1_1_2_1_1 + 0.0200892857142857*G0_1_1_2_1_2 - 0.00200892857142854*G0_1_1_2_2_0 + 0.0200892857142857*G0_1_1_2_2_1 + 0.0180803571428573*G0_1_1_2_2_2; + A[76] = -A[74] - 0.1265625*G0_0_1_0_0_0 + 0.0100446428571429*G0_0_1_0_0_1 + 0.0100446428571429*G0_0_1_0_1_0 + 0.0261160714285714*G0_0_1_0_1_1 - 0.0060267857142857*G0_0_1_0_1_2 - 0.0060267857142857*G0_0_1_0_2_1 - 0.00401785714285713*G0_0_1_0_2_2 + 0.0100446428571429*G0_0_1_1_0_0 + 0.0261160714285714*G0_0_1_1_0_1 - 0.0060267857142857*G0_0_1_1_0_2 + 0.0261160714285714*G0_0_1_1_1_0 + 0.0180803571428572*G0_0_1_1_1_1 + 0.0120535714285714*G0_0_1_1_1_2 - 0.0060267857142857*G0_0_1_1_2_0 + 0.0120535714285714*G0_0_1_1_2_1 + 0.00401785714285714*G0_0_1_1_2_2 - 0.0060267857142857*G0_0_1_2_0_1 - 0.00401785714285712*G0_0_1_2_0_2 - 0.0060267857142857*G0_0_1_2_1_0 + 0.0120535714285714*G0_0_1_2_1_1 + 0.00401785714285714*G0_0_1_2_1_2 - 0.00401785714285712*G0_0_1_2_2_0 + 0.00401785714285714*G0_0_1_2_2_1 + 0.114508928571429*G0_1_1_0_0_0 + 0.0522321428571429*G0_1_1_0_0_1 - 0.0180803571428571*G0_1_1_0_0_2 + 0.0522321428571429*G0_1_1_0_1_0 + 0.0421875*G0_1_1_0_1_1 - 0.0060267857142857*G0_1_1_0_1_2 - 0.0180803571428571*G0_1_1_0_2_0 - 0.00602678571428569*G0_1_1_0_2_1 - 0.0200892857142857*G0_1_1_0_2_2 + 0.0522321428571429*G0_1_1_1_0_0 + 0.0421875*G0_1_1_1_0_1 - 0.0060267857142857*G0_1_1_1_0_2 + 0.0421875*G0_1_1_1_1_0 + 0.0241071428571431*G0_1_1_1_1_1 + 0.0180803571428571*G0_1_1_1_1_2 - 0.0060267857142857*G0_1_1_1_2_0 + 0.0180803571428571*G0_1_1_1_2_1 + 0.00803571428571428*G0_1_1_1_2_2 - 0.0180803571428571*G0_1_1_2_0_0 - 0.0060267857142857*G0_1_1_2_0_1 - 0.0200892857142857*G0_1_1_2_0_2 - 0.0060267857142857*G0_1_1_2_1_0 + 0.0180803571428571*G0_1_1_2_1_1 + 0.00803571428571427*G0_1_1_2_1_2 - 0.0200892857142857*G0_1_1_2_2_0 + 0.00803571428571427*G0_1_1_2_2_1 - 0.0120535714285715*G0_1_1_2_2_2; + A[67] = A[76] + 0.108482142857142*G0_0_1_0_0_0 - 0.00602678571428577*G0_0_1_0_0_1 - 0.00602678571428576*G0_0_1_0_0_2 - 0.00602678571428577*G0_0_1_0_1_0 - 0.0140625*G0_0_1_0_1_1 + 0.00200892857142856*G0_0_1_0_1_2 - 0.00602678571428576*G0_0_1_0_2_0 + 0.00200892857142856*G0_0_1_0_2_1 - 0.00200892857142861*G0_0_1_0_2_2 - 0.00602678571428577*G0_0_1_1_0_0 - 0.0140625*G0_0_1_1_0_1 + 0.00200892857142856*G0_0_1_1_0_2 - 0.0140625*G0_0_1_1_1_0 - 0.0180803571428571*G0_0_1_1_1_1 + 0.00200892857142856*G0_0_1_1_2_0 - 0.00602678571428576*G0_0_1_2_0_0 + 0.00200892857142856*G0_0_1_2_0_1 - 0.00200892857142862*G0_0_1_2_0_2 + 0.00200892857142856*G0_0_1_2_1_0 - 0.00200892857142862*G0_0_1_2_2_0 - 0.0180803571428573*G0_0_1_2_2_2 - 0.108482142857143*G0_1_0_0_0_0 + 0.00602678571428577*G0_1_0_0_0_1 + 0.00602678571428576*G0_1_0_0_0_2 + 0.00602678571428577*G0_1_0_0_1_0 + 0.0140625*G0_1_0_0_1_1 - 0.00200892857142856*G0_1_0_0_1_2 + 0.00602678571428576*G0_1_0_0_2_0 - 0.00200892857142856*G0_1_0_0_2_1 + 0.00200892857142862*G0_1_0_0_2_2 + 0.00602678571428577*G0_1_0_1_0_0 + 0.0140625*G0_1_0_1_0_1 - 0.00200892857142856*G0_1_0_1_0_2 + 0.0140625*G0_1_0_1_1_0 + 0.0180803571428571*G0_1_0_1_1_1 - 0.00200892857142856*G0_1_0_1_2_0 + 0.00602678571428576*G0_1_0_2_0_0 - 0.00200892857142856*G0_1_0_2_0_1 + 0.00200892857142862*G0_1_0_2_0_2 - 0.00200892857142856*G0_1_0_2_1_0 + 0.00200892857142862*G0_1_0_2_2_0 + 0.0180803571428573*G0_1_0_2_2_2; + A[45] = A[67] - 0.0120535714285715*G0_0_0_0_0_0 + 0.00401785714285716*G0_0_0_0_0_1 - 0.0160714285714285*G0_0_0_0_0_2 + 0.00401785714285716*G0_0_0_0_1_0 + 0.00602678571428573*G0_0_0_0_1_1 - 0.0160714285714285*G0_0_0_0_2_0 - 0.018080357142857*G0_0_0_0_2_2 + 0.00401785714285715*G0_0_0_1_0_0 + 0.00602678571428573*G0_0_0_1_0_1 + 0.00602678571428573*G0_0_0_1_1_0 + 0.00602678571428578*G0_0_0_1_1_1 + 0.0160714285714286*G0_0_0_1_1_2 + 0.0160714285714286*G0_0_0_1_2_1 + 0.0421875000000001*G0_0_0_1_2_2 - 0.0160714285714285*G0_0_0_2_0_0 - 0.018080357142857*G0_0_0_2_0_2 + 0.0160714285714286*G0_0_0_2_1_1 + 0.0421875000000001*G0_0_0_2_1_2 - 0.018080357142857*G0_0_0_2_2_0 + 0.0421875000000001*G0_0_0_2_2_1 + 0.241071428571429*G0_0_0_2_2_2 - 0.0120535714285715*G0_0_1_0_0_0 + 0.00401785714285716*G0_0_1_0_0_1 - 0.0160714285714285*G0_0_1_0_0_2 + 0.00401785714285716*G0_0_1_0_1_0 + 0.00602678571428573*G0_0_1_0_1_1 - 0.0160714285714285*G0_0_1_0_2_0 - 0.018080357142857*G0_0_1_0_2_2 + 0.00401785714285716*G0_0_1_1_0_0 + 0.00602678571428573*G0_0_1_1_0_1 + 0.00602678571428573*G0_0_1_1_1_0 + 0.00602678571428577*G0_0_1_1_1_1 + 0.0160714285714286*G0_0_1_1_1_2 + 0.0160714285714286*G0_0_1_1_2_1 + 0.0421875000000001*G0_0_1_1_2_2 - 0.0160714285714285*G0_0_1_2_0_0 - 0.018080357142857*G0_0_1_2_0_2 + 0.0160714285714286*G0_0_1_2_1_1 + 0.0421875000000001*G0_0_1_2_1_2 - 0.018080357142857*G0_0_1_2_2_0 + 0.0421875000000001*G0_0_1_2_2_1 + 0.241071428571429*G0_0_1_2_2_2 + 0.114508928571428*G0_1_0_0_0_0 - 0.00200892857142856*G0_1_0_0_0_1 - 0.0200892857142857*G0_1_0_0_0_2 - 0.00200892857142855*G0_1_0_0_1_0 - 0.00803571428571424*G0_1_0_0_1_1 - 0.0200892857142857*G0_1_0_0_2_0 - 0.0140624999999999*G0_1_0_0_2_2 - 0.00200892857142855*G0_1_0_1_0_0 - 0.00803571428571424*G0_1_0_1_0_1 - 0.00803571428571425*G0_1_0_1_1_0 + 0.00602678571428588*G0_1_0_1_1_1 + 0.0301339285714286*G0_1_0_1_1_2 + 0.0301339285714286*G0_1_0_1_2_1 + 0.0482142857142857*G0_1_0_1_2_2 - 0.0200892857142857*G0_1_0_2_0_0 - 0.0140624999999999*G0_1_0_2_0_2 + 0.0301339285714286*G0_1_0_2_1_1 + 0.0482142857142857*G0_1_0_2_1_2 - 0.0140624999999999*G0_1_0_2_2_0 + 0.0482142857142857*G0_1_0_2_2_1 + 0.114508928571429*G0_1_0_2_2_2 - 0.1265625*G0_1_1_0_0_0 - 0.0441964285714286*G0_1_1_0_0_1 - 0.00200892857142856*G0_1_1_0_0_2 - 0.0441964285714286*G0_1_1_0_1_0 - 0.0241071428571428*G0_1_1_0_1_1 - 0.00200892857142856*G0_1_1_0_2_0 + 0.0020089285714286*G0_1_1_0_2_2 - 0.0441964285714286*G0_1_1_1_0_0 - 0.0241071428571428*G0_1_1_1_0_1 - 0.0241071428571428*G0_1_1_1_1_0 + 0.0241071428571428*G0_1_1_1_1_2 + 0.0241071428571428*G0_1_1_1_2_1 + 0.0441964285714286*G0_1_1_1_2_2 - 0.00200892857142856*G0_1_1_2_0_0 + 0.0020089285714286*G0_1_1_2_0_2 + 0.0241071428571428*G0_1_1_2_1_1 + 0.0441964285714286*G0_1_1_2_1_2 + 0.00200892857142861*G0_1_1_2_2_0 + 0.0441964285714286*G0_1_1_2_2_1 + 0.1265625*G0_1_1_2_2_2; + A[54] = A[45] + 0.0180803571428574*G0_0_1_0_0_0 + 0.00200892857142861*G0_0_1_0_0_2 - 0.00200892857142856*G0_0_1_0_1_2 + 0.00200892857142861*G0_0_1_0_2_0 - 0.00200892857142856*G0_0_1_0_2_1 + 0.00602678571428567*G0_0_1_0_2_2 - 0.00200892857142856*G0_0_1_1_0_2 + 0.0180803571428572*G0_0_1_1_1_1 + 0.0140625*G0_0_1_1_1_2 - 0.00200892857142856*G0_0_1_1_2_0 + 0.0140625*G0_0_1_1_2_1 + 0.00602678571428563*G0_0_1_1_2_2 + 0.00200892857142861*G0_0_1_2_0_0 - 0.00200892857142856*G0_0_1_2_0_1 + 0.00602678571428567*G0_0_1_2_0_2 - 0.00200892857142856*G0_0_1_2_1_0 + 0.0140625*G0_0_1_2_1_1 + 0.00602678571428563*G0_0_1_2_1_2 + 0.00602678571428567*G0_0_1_2_2_0 + 0.00602678571428563*G0_0_1_2_2_1 - 0.108482142857143*G0_0_1_2_2_2 - 0.0180803571428574*G0_1_0_0_0_0 - 0.00200892857142861*G0_1_0_0_0_2 + 0.00200892857142856*G0_1_0_0_1_2 - 0.00200892857142861*G0_1_0_0_2_0 + 0.00200892857142856*G0_1_0_0_2_1 - 0.00602678571428566*G0_1_0_0_2_2 + 0.00200892857142856*G0_1_0_1_0_2 - 0.0180803571428572*G0_1_0_1_1_1 - 0.0140625*G0_1_0_1_1_2 + 0.00200892857142856*G0_1_0_1_2_0 - 0.0140625*G0_1_0_1_2_1 - 0.00602678571428563*G0_1_0_1_2_2 - 0.00200892857142861*G0_1_0_2_0_0 + 0.00200892857142856*G0_1_0_2_0_1 - 0.00602678571428566*G0_1_0_2_0_2 + 0.00200892857142856*G0_1_0_2_1_0 - 0.0140625*G0_1_0_2_1_1 - 0.00602678571428563*G0_1_0_2_1_2 - 0.00602678571428566*G0_1_0_2_2_0 - 0.00602678571428562*G0_1_0_2_2_1 + 0.108482142857143*G0_1_0_2_2_2; + A[13] = -A[15] - 0.0361607142857143*G0_0_0_0_0_0 + 0.00133928571428572*G0_0_0_0_0_1 - 0.01875*G0_0_0_0_0_2 + 0.00133928571428571*G0_0_0_0_1_0 + 0.0107142857142857*G0_0_0_0_1_1 - 0.01875*G0_0_0_0_2_0 - 0.0200892857142857*G0_0_0_0_2_2 + 0.00133928571428571*G0_0_0_1_0_0 + 0.0107142857142857*G0_0_0_1_0_1 + 0.0107142857142857*G0_0_0_1_1_0 + 0.120535714285714*G0_0_0_1_1_1 + 0.01875*G0_0_0_1_1_2 + 0.01875*G0_0_0_1_2_1 - 0.00401785714285713*G0_0_0_1_2_2 - 0.01875*G0_0_0_2_0_0 - 0.0200892857142857*G0_0_0_2_0_2 + 0.01875*G0_0_0_2_1_1 - 0.00401785714285713*G0_0_0_2_1_2 - 0.0200892857142857*G0_0_0_2_2_0 - 0.00401785714285713*G0_0_0_2_2_1 - 0.0482142857142856*G0_0_0_2_2_2 + 0.0267857142857142*G0_0_1_0_0_0 + 0.00624999999999998*G0_0_1_0_0_1 - 0.00223214285714286*G0_0_1_0_0_2 + 0.00624999999999998*G0_0_1_0_1_0 + 0.0370535714285714*G0_0_1_0_1_1 + 0.00424107142857142*G0_0_1_0_1_2 - 0.00223214285714286*G0_0_1_0_2_0 + 0.00424107142857142*G0_0_1_0_2_1 - 0.00535714285714283*G0_0_1_0_2_2 + 0.00624999999999998*G0_0_1_1_0_0 + 0.0370535714285714*G0_0_1_1_0_1 + 0.00424107142857142*G0_0_1_1_0_2 + 0.0370535714285714*G0_0_1_1_1_0 + 0.412499999999999*G0_0_1_1_1_1 + 0.0406249999999999*G0_0_1_1_1_2 + 0.00424107142857142*G0_0_1_1_2_0 + 0.0406249999999999*G0_0_1_1_2_1 + 0.00669642857142856*G0_0_1_1_2_2 - 0.00223214285714286*G0_0_1_2_0_0 + 0.00424107142857142*G0_0_1_2_0_1 - 0.00535714285714283*G0_0_1_2_0_2 + 0.00424107142857142*G0_0_1_2_1_0 + 0.0406249999999999*G0_0_1_2_1_1 + 0.00669642857142856*G0_0_1_2_1_2 - 0.00535714285714283*G0_0_1_2_2_0 + 0.00669642857142856*G0_0_1_2_2_1 - 0.00133928571428558*G0_0_1_2_2_2; + A[30] = A[4] + 0.00133928571428571*G0_0_0_0_0_1 - 0.00133928571428571*G0_0_0_0_0_2 + 0.00133928571428571*G0_0_0_0_1_0 + 0.00267857142857142*G0_0_0_0_1_1 + 0.000669642857142857*G0_0_0_0_1_2 - 0.00133928571428571*G0_0_0_0_2_0 + 0.000669642857142858*G0_0_0_0_2_1 - 0.00401785714285711*G0_0_0_0_2_2 + 0.00133928571428571*G0_0_0_1_0_0 + 0.00267857142857142*G0_0_0_1_0_1 + 0.000669642857142857*G0_0_0_1_0_2 + 0.00267857142857142*G0_0_0_1_1_0 - 0.0241071428571428*G0_0_0_1_1_1 - 0.00803571428571425*G0_0_0_1_1_2 + 0.000669642857142857*G0_0_0_1_2_0 - 0.00803571428571425*G0_0_0_1_2_1 - 0.00133928571428571*G0_0_0_2_0_0 + 0.000669642857142858*G0_0_0_2_0_1 - 0.00401785714285711*G0_0_0_2_0_2 + 0.000669642857142857*G0_0_0_2_1_0 - 0.00803571428571425*G0_0_0_2_1_1 - 0.00401785714285711*G0_0_0_2_2_0 + 0.0482142857142861*G0_0_0_2_2_2 - 0.000446428571428585*G0_0_1_0_0_1 + 0.00044642857142857*G0_0_1_0_0_2 - 0.000446428571428586*G0_0_1_0_1_0 + 0.00312499999999999*G0_0_1_0_1_1 + 0.00044642857142857*G0_0_1_0_2_0 - 0.00312499999999998*G0_0_1_0_2_2 - 0.000446428571428585*G0_0_1_1_0_0 + 0.00312499999999999*G0_0_1_1_0_1 + 0.00312499999999999*G0_0_1_1_1_0 - 0.0220982142857143*G0_0_1_1_1_1 - 0.00245535714285712*G0_0_1_1_1_2 - 0.00245535714285712*G0_0_1_1_2_1 + 0.00245535714285717*G0_0_1_1_2_2 + 0.00044642857142857*G0_0_1_2_0_0 - 0.00312499999999998*G0_0_1_2_0_2 - 0.00245535714285712*G0_0_1_2_1_1 + 0.00245535714285717*G0_0_1_2_1_2 - 0.00312499999999998*G0_0_1_2_2_0 + 0.00245535714285717*G0_0_1_2_2_1 + 0.0220982142857145*G0_0_1_2_2_2 + 0.00312499999999997*G0_1_0_0_0_1 - 0.00312500000000001*G0_1_0_0_0_2 + 0.00312499999999997*G0_1_0_0_1_0 + 0.00357142857142855*G0_1_0_0_1_1 - 0.00312500000000001*G0_1_0_0_2_0 - 0.00357142857142855*G0_1_0_0_2_2 + 0.00312499999999997*G0_1_0_1_0_0 + 0.00357142857142855*G0_1_0_1_0_1 + 0.00357142857142855*G0_1_0_1_1_0 - 0.0502232142857143*G0_1_0_1_1_1 - 0.00558035714285712*G0_1_0_1_1_2 - 0.00558035714285712*G0_1_0_1_2_1 + 0.00558035714285718*G0_1_0_1_2_2 - 0.00312500000000001*G0_1_0_2_0_0 - 0.00357142857142855*G0_1_0_2_0_2 - 0.00558035714285712*G0_1_0_2_1_1 + 0.00558035714285718*G0_1_0_2_1_2 - 0.00357142857142855*G0_1_0_2_2_0 + 0.00558035714285718*G0_1_0_2_2_1 + 0.0502232142857145*G0_1_0_2_2_2 + 0.00133928571428568*G0_1_1_0_0_1 - 0.00133928571428573*G0_1_1_0_0_2 + 0.00133928571428568*G0_1_1_0_1_0 + 0.00401785714285713*G0_1_1_0_1_1 - 0.000669642857142856*G0_1_1_0_1_2 - 0.00133928571428573*G0_1_1_0_2_0 - 0.000669642857142857*G0_1_1_0_2_1 - 0.00267857142857142*G0_1_1_0_2_2 + 0.00133928571428568*G0_1_1_1_0_0 + 0.00401785714285713*G0_1_1_1_0_1 - 0.000669642857142856*G0_1_1_1_0_2 + 0.00401785714285713*G0_1_1_1_1_0 - 0.0482142857142856*G0_1_1_1_1_1 - 0.000669642857142856*G0_1_1_1_2_0 + 0.0080357142857143*G0_1_1_1_2_2 - 0.00133928571428573*G0_1_1_2_0_0 - 0.000669642857142857*G0_1_1_2_0_1 - 0.00267857142857142*G0_1_1_2_0_2 - 0.000669642857142857*G0_1_1_2_1_0 + 0.0080357142857143*G0_1_1_2_1_2 - 0.00267857142857142*G0_1_1_2_2_0 + 0.0080357142857143*G0_1_1_2_2_1 + 0.0241071428571429*G0_1_1_2_2_2; + A[80] = -A[30] + 0.141964285714286*G0_0_0_0_0_0 + 0.0075892857142857*G0_0_0_0_0_1 + 0.0191964285714285*G0_0_0_0_0_2 + 0.0075892857142857*G0_0_0_0_1_0 + 0.00803571428571428*G0_0_0_0_1_1 + 0.00379464285714285*G0_0_0_0_1_2 + 0.0191964285714285*G0_0_0_0_2_0 + 0.00379464285714285*G0_0_0_0_2_1 + 0.003125*G0_0_0_0_2_2 + 0.0075892857142857*G0_0_0_1_0_0 + 0.00803571428571428*G0_0_0_1_0_1 + 0.00379464285714285*G0_0_0_1_0_2 + 0.00803571428571428*G0_0_0_1_1_0 + 0.0375*G0_0_0_1_1_1 + 0.00379464285714285*G0_0_0_1_2_0 - 0.0044642857142857*G0_0_0_1_2_2 + 0.0191964285714285*G0_0_0_2_0_0 + 0.00379464285714285*G0_0_0_2_0_1 + 0.003125*G0_0_0_2_0_2 + 0.00379464285714285*G0_0_0_2_1_0 - 0.00446428571428569*G0_0_0_2_1_2 + 0.003125*G0_0_0_2_2_0 - 0.0044642857142857*G0_0_0_2_2_1 - 0.0026785714285713*G0_0_0_2_2_2 + 0.141964285714286*G0_0_1_0_0_0 + 0.00758928571428569*G0_0_1_0_0_1 + 0.0191964285714285*G0_0_1_0_0_2 + 0.00758928571428569*G0_0_1_0_1_0 + 0.00803571428571427*G0_0_1_0_1_1 + 0.00379464285714285*G0_0_1_0_1_2 + 0.0191964285714285*G0_0_1_0_2_0 + 0.00379464285714285*G0_0_1_0_2_1 + 0.003125*G0_0_1_0_2_2 + 0.00758928571428569*G0_0_1_1_0_0 + 0.00803571428571427*G0_0_1_1_0_1 + 0.00379464285714285*G0_0_1_1_0_2 + 0.00803571428571427*G0_0_1_1_1_0 + 0.0375*G0_0_1_1_1_1 + 0.00379464285714285*G0_0_1_1_2_0 - 0.00446428571428569*G0_0_1_1_2_2 + 0.0191964285714285*G0_0_1_2_0_0 + 0.00379464285714285*G0_0_1_2_0_1 + 0.003125*G0_0_1_2_0_2 + 0.00379464285714285*G0_0_1_2_1_0 - 0.00446428571428569*G0_0_1_2_1_2 + 0.003125*G0_0_1_2_2_0 - 0.00446428571428569*G0_0_1_2_2_1 - 0.00267857142857132*G0_0_1_2_2_2; + A[14] = -A[16] + 0.00267857142857143*G0_0_1_0_0_0 - 0.00312499999999999*G0_0_1_0_0_1 + 0.00446428571428571*G0_0_1_0_0_2 - 0.00312499999999999*G0_0_1_0_1_0 - 0.0191964285714285*G0_0_1_0_1_1 - 0.00379464285714284*G0_0_1_0_1_2 + 0.00446428571428571*G0_0_1_0_2_0 - 0.00379464285714284*G0_0_1_0_2_1 - 0.00312499999999999*G0_0_1_1_0_0 - 0.0191964285714285*G0_0_1_1_0_1 - 0.00379464285714284*G0_0_1_1_0_2 - 0.0191964285714285*G0_0_1_1_1_0 - 0.141964285714285*G0_0_1_1_1_1 - 0.00758928571428568*G0_0_1_1_1_2 - 0.00379464285714285*G0_0_1_1_2_0 - 0.00758928571428568*G0_0_1_1_2_1 - 0.00803571428571428*G0_0_1_1_2_2 + 0.00446428571428571*G0_0_1_2_0_0 - 0.00379464285714285*G0_0_1_2_0_1 - 0.00379464285714284*G0_0_1_2_1_0 - 0.00758928571428568*G0_0_1_2_1_1 - 0.00803571428571428*G0_0_1_2_1_2 - 0.00803571428571428*G0_0_1_2_2_1 - 0.0375000000000001*G0_0_1_2_2_2; + A[23] = -A[25] + 0.0120535714285714*G0_1_0_0_0_0 + 0.00133928571428571*G0_1_0_0_0_1 + 0.00535714285714286*G0_1_0_0_0_2 + 0.00133928571428571*G0_1_0_0_1_0 - 0.00133928571428572*G0_1_0_0_1_1 + 0.00535714285714286*G0_1_0_0_2_0 - 0.00803571428571426*G0_1_0_0_2_2 + 0.00133928571428571*G0_1_0_1_0_0 - 0.00133928571428572*G0_1_0_1_0_1 - 0.00133928571428572*G0_1_0_1_1_0 - 0.0120535714285714*G0_1_0_1_1_1 - 0.00535714285714284*G0_1_0_1_1_2 - 0.00535714285714284*G0_1_0_1_2_1 + 0.0080357142857143*G0_1_0_1_2_2 + 0.00535714285714286*G0_1_0_2_0_0 - 0.00803571428571426*G0_1_0_2_0_2 - 0.00535714285714284*G0_1_0_2_1_1 + 0.0080357142857143*G0_1_0_2_1_2 - 0.00803571428571426*G0_1_0_2_2_0 + 0.0080357142857143*G0_1_0_2_2_1 + 0.0629464285714285*G0_1_1_0_0_0 + 0.0142857142857143*G0_1_1_0_0_1 + 0.00580357142857142*G0_1_1_0_0_2 + 0.0142857142857143*G0_1_1_0_1_0 + 0.0129464285714285*G0_1_1_0_1_1 + 0.00223214285714285*G0_1_1_0_1_2 + 0.00580357142857142*G0_1_1_0_2_0 + 0.00223214285714285*G0_1_1_0_2_1 + 0.00267857142857147*G0_1_1_0_2_2 + 0.0142857142857143*G0_1_1_1_0_0 + 0.0129464285714285*G0_1_1_1_0_1 + 0.00223214285714285*G0_1_1_1_0_2 + 0.0129464285714285*G0_1_1_1_1_0 + 0.050892857142857*G0_1_1_1_1_1 + 0.000446428571428571*G0_1_1_1_1_2 + 0.00223214285714285*G0_1_1_1_2_0 + 0.000446428571428571*G0_1_1_1_2_1 + 0.0107142857142858*G0_1_1_1_2_2 + 0.00580357142857142*G0_1_1_2_0_0 + 0.00223214285714285*G0_1_1_2_0_1 + 0.00267857142857147*G0_1_1_2_0_2 + 0.00223214285714285*G0_1_1_2_1_0 + 0.000446428571428571*G0_1_1_2_1_1 + 0.0107142857142858*G0_1_1_2_1_2 + 0.00267857142857147*G0_1_1_2_2_0 + 0.0107142857142858*G0_1_1_2_2_1 + 0.107142857142858*G0_1_1_2_2_2; + A[28] = -A[23] + 0.00267857142857145*G0_1_0_0_0_0 + 0.00446428571428571*G0_1_0_0_0_1 - 0.00312499999999999*G0_1_0_0_0_2 + 0.00446428571428571*G0_1_0_0_1_0 - 0.00379464285714285*G0_1_0_0_1_2 - 0.00312499999999999*G0_1_0_0_2_0 - 0.00379464285714285*G0_1_0_0_2_1 - 0.0191964285714286*G0_1_0_0_2_2 + 0.00446428571428571*G0_1_0_1_0_0 - 0.00379464285714285*G0_1_0_1_0_2 - 0.0374999999999999*G0_1_0_1_1_1 - 0.00803571428571427*G0_1_0_1_1_2 - 0.00379464285714285*G0_1_0_1_2_0 - 0.00803571428571427*G0_1_0_1_2_1 - 0.00758928571428574*G0_1_0_1_2_2 - 0.00312499999999999*G0_1_0_2_0_0 - 0.00379464285714285*G0_1_0_2_0_1 - 0.0191964285714286*G0_1_0_2_0_2 - 0.00379464285714285*G0_1_0_2_1_0 - 0.00803571428571427*G0_1_0_2_1_1 - 0.00758928571428574*G0_1_0_2_1_2 - 0.0191964285714286*G0_1_0_2_2_0 - 0.00758928571428574*G0_1_0_2_2_1 - 0.141964285714286*G0_1_0_2_2_2; + A[82] = A[28] + 0.00200892857142861*G0_0_1_0_0_0 + 0.00558035714285714*G0_0_1_0_0_1 + 0.000446428571428572*G0_0_1_0_0_2 + 0.00558035714285714*G0_0_1_0_1_0 + 0.00245535714285715*G0_0_1_0_1_1 - 0.000669642857142856*G0_0_1_0_1_2 + 0.000446428571428573*G0_0_1_0_2_0 - 0.000669642857142856*G0_0_1_0_2_1 - 0.0017857142857143*G0_0_1_0_2_2 + 0.00558035714285714*G0_0_1_1_0_0 + 0.00245535714285715*G0_0_1_1_0_1 - 0.000669642857142856*G0_0_1_1_0_2 + 0.00245535714285715*G0_0_1_1_1_0 - 0.0261160714285713*G0_0_1_1_1_1 + 0.000892857142857141*G0_0_1_1_1_2 - 0.000669642857142856*G0_0_1_1_2_0 + 0.000892857142857142*G0_0_1_1_2_1 + 0.00178571428571427*G0_0_1_1_2_2 + 0.000446428571428573*G0_0_1_2_0_0 - 0.000669642857142856*G0_0_1_2_0_1 - 0.0017857142857143*G0_0_1_2_0_2 - 0.000669642857142856*G0_0_1_2_1_0 + 0.000892857142857141*G0_0_1_2_1_1 + 0.00178571428571427*G0_0_1_2_1_2 - 0.0017857142857143*G0_0_1_2_2_0 + 0.00178571428571427*G0_0_1_2_2_1 - 0.00200892857142861*G0_1_0_0_0_0 - 0.00558035714285714*G0_1_0_0_0_1 - 0.000446428571428572*G0_1_0_0_0_2 - 0.00558035714285714*G0_1_0_0_1_0 - 0.00245535714285715*G0_1_0_0_1_1 + 0.000669642857142856*G0_1_0_0_1_2 - 0.000446428571428573*G0_1_0_0_2_0 + 0.000669642857142856*G0_1_0_0_2_1 + 0.0017857142857143*G0_1_0_0_2_2 - 0.00558035714285714*G0_1_0_1_0_0 - 0.00245535714285715*G0_1_0_1_0_1 + 0.000669642857142856*G0_1_0_1_0_2 - 0.00245535714285715*G0_1_0_1_1_0 + 0.0261160714285713*G0_1_0_1_1_1 - 0.000892857142857142*G0_1_0_1_1_2 + 0.000669642857142856*G0_1_0_1_2_0 - 0.000892857142857142*G0_1_0_1_2_1 - 0.00178571428571427*G0_1_0_1_2_2 - 0.000446428571428572*G0_1_0_2_0_0 + 0.000669642857142856*G0_1_0_2_0_1 + 0.0017857142857143*G0_1_0_2_0_2 + 0.000669642857142856*G0_1_0_2_1_0 - 0.000892857142857142*G0_1_0_2_1_1 - 0.00178571428571427*G0_1_0_2_1_2 + 0.0017857142857143*G0_1_0_2_2_0 - 0.00178571428571427*G0_1_0_2_2_1; + A[32] = -A[82] + 0.00267857142857145*G0_0_1_0_0_0 + 0.00446428571428571*G0_0_1_0_0_1 - 0.00312499999999999*G0_0_1_0_0_2 + 0.00446428571428571*G0_0_1_0_1_0 - 0.00379464285714285*G0_0_1_0_1_2 - 0.00312499999999999*G0_0_1_0_2_0 - 0.00379464285714285*G0_0_1_0_2_1 - 0.0191964285714286*G0_0_1_0_2_2 + 0.00446428571428571*G0_0_1_1_0_0 - 0.00379464285714285*G0_0_1_1_0_2 - 0.0374999999999999*G0_0_1_1_1_1 - 0.00803571428571427*G0_0_1_1_1_2 - 0.00379464285714285*G0_0_1_1_2_0 - 0.00803571428571427*G0_0_1_1_2_1 - 0.00758928571428574*G0_0_1_1_2_2 - 0.00312499999999999*G0_0_1_2_0_0 - 0.00379464285714285*G0_0_1_2_0_1 - 0.0191964285714286*G0_0_1_2_0_2 - 0.00379464285714285*G0_0_1_2_1_0 - 0.00803571428571427*G0_0_1_2_1_1 - 0.00758928571428574*G0_0_1_2_1_2 - 0.0191964285714286*G0_0_1_2_2_0 - 0.00758928571428574*G0_0_1_2_2_1 - 0.141964285714286*G0_0_1_2_2_2; + A[72] = A[82] + 0.0241071428571427*G0_0_1_0_0_0 - 0.00803571428571429*G0_0_1_0_0_1 - 0.00133928571428572*G0_0_1_0_0_2 - 0.00803571428571428*G0_0_1_0_1_0 - 0.00803571428571428*G0_0_1_0_1_1 + 0.00133928571428571*G0_0_1_0_1_2 - 0.00133928571428572*G0_0_1_0_2_0 + 0.00133928571428571*G0_0_1_0_2_1 - 0.00803571428571429*G0_0_1_1_0_0 - 0.00803571428571429*G0_0_1_1_0_1 + 0.00133928571428571*G0_0_1_1_0_2 - 0.00803571428571428*G0_0_1_1_1_0 + 0.0241071428571427*G0_0_1_1_1_1 - 0.00133928571428571*G0_0_1_1_1_2 + 0.00133928571428571*G0_0_1_1_2_0 - 0.00133928571428571*G0_0_1_1_2_1 - 0.00133928571428572*G0_0_1_2_0_0 + 0.00133928571428571*G0_0_1_2_0_1 + 0.00133928571428571*G0_0_1_2_1_0 - 0.00133928571428571*G0_0_1_2_1_1 - 0.0241071428571428*G0_1_1_0_0_0 - 0.00803571428571427*G0_1_1_0_0_1 + 0.00267857142857144*G0_1_1_0_0_2 - 0.00803571428571427*G0_1_1_0_1_0 + 0.000669642857142856*G0_1_1_0_1_2 + 0.00267857142857144*G0_1_1_0_2_0 + 0.000669642857142856*G0_1_1_0_2_1 + 0.00133928571428574*G0_1_1_0_2_2 - 0.00803571428571426*G0_1_1_1_0_0 + 0.000669642857142857*G0_1_1_1_0_2 + 0.0482142857142856*G0_1_1_1_1_1 - 0.00401785714285715*G0_1_1_1_1_2 + 0.000669642857142857*G0_1_1_1_2_0 - 0.00401785714285715*G0_1_1_1_2_1 - 0.0013392857142857*G0_1_1_1_2_2 + 0.00267857142857144*G0_1_1_2_0_0 + 0.000669642857142856*G0_1_1_2_0_1 + 0.00133928571428574*G0_1_1_2_0_2 + 0.000669642857142856*G0_1_1_2_1_0 - 0.00401785714285715*G0_1_1_2_1_1 - 0.0013392857142857*G0_1_1_2_1_2 + 0.00133928571428574*G0_1_1_2_2_0 - 0.0013392857142857*G0_1_1_2_2_1; + A[27] = A[28] + 0.0241071428571427*G0_1_0_0_0_0 - 0.00803571428571429*G0_1_0_0_0_1 - 0.00133928571428572*G0_1_0_0_0_2 - 0.00803571428571429*G0_1_0_0_1_0 - 0.00803571428571429*G0_1_0_0_1_1 + 0.00133928571428571*G0_1_0_0_1_2 - 0.00133928571428572*G0_1_0_0_2_0 + 0.00133928571428571*G0_1_0_0_2_1 - 0.00803571428571429*G0_1_0_1_0_0 - 0.00803571428571429*G0_1_0_1_0_1 + 0.00133928571428571*G0_1_0_1_0_2 - 0.00803571428571429*G0_1_0_1_1_0 + 0.0241071428571427*G0_1_0_1_1_1 - 0.00133928571428571*G0_1_0_1_1_2 + 0.00133928571428571*G0_1_0_1_2_0 - 0.00133928571428571*G0_1_0_1_2_1 - 0.00133928571428572*G0_1_0_2_0_0 + 0.00133928571428571*G0_1_0_2_0_1 + 0.00133928571428571*G0_1_0_2_1_0 - 0.00133928571428571*G0_1_0_2_1_1 - 0.0241071428571428*G0_1_1_0_0_0 - 0.00803571428571427*G0_1_1_0_0_1 + 0.00267857142857144*G0_1_1_0_0_2 - 0.00803571428571427*G0_1_1_0_1_0 + 0.000669642857142856*G0_1_1_0_1_2 + 0.00267857142857144*G0_1_1_0_2_0 + 0.000669642857142856*G0_1_1_0_2_1 + 0.00133928571428574*G0_1_1_0_2_2 - 0.00803571428571426*G0_1_1_1_0_0 + 0.000669642857142857*G0_1_1_1_0_2 + 0.0482142857142856*G0_1_1_1_1_1 - 0.00401785714285715*G0_1_1_1_1_2 + 0.000669642857142857*G0_1_1_1_2_0 - 0.00401785714285715*G0_1_1_1_2_1 - 0.0013392857142857*G0_1_1_1_2_2 + 0.00267857142857144*G0_1_1_2_0_0 + 0.000669642857142857*G0_1_1_2_0_1 + 0.00133928571428574*G0_1_1_2_0_2 + 0.000669642857142856*G0_1_1_2_1_0 - 0.00401785714285715*G0_1_1_2_1_1 - 0.0013392857142857*G0_1_1_2_1_2 + 0.00133928571428574*G0_1_1_2_2_0 - 0.0013392857142857*G0_1_1_2_2_1; + A[87] = A[78] - 0.108482142857143*G0_0_1_0_0_0 - 0.0904017857142857*G0_0_1_0_0_1 - 0.0180803571428571*G0_0_1_0_0_2 - 0.0904017857142857*G0_0_1_0_1_0 - 0.0904017857142857*G0_0_1_0_1_1 - 0.0180803571428571*G0_0_1_0_1_2 - 0.0180803571428571*G0_0_1_0_2_0 - 0.0180803571428571*G0_0_1_0_2_1 - 0.00602678571428571*G0_0_1_0_2_2 - 0.0904017857142857*G0_0_1_1_0_0 - 0.0904017857142857*G0_0_1_1_0_1 - 0.0180803571428571*G0_0_1_1_0_2 - 0.0904017857142857*G0_0_1_1_1_0 - 0.108482142857143*G0_0_1_1_1_1 - 0.0180803571428571*G0_0_1_1_1_2 - 0.0180803571428571*G0_0_1_1_2_0 - 0.0180803571428571*G0_0_1_1_2_1 - 0.00602678571428571*G0_0_1_1_2_2 - 0.0180803571428571*G0_0_1_2_0_0 - 0.0180803571428571*G0_0_1_2_0_1 - 0.00602678571428571*G0_0_1_2_0_2 - 0.0180803571428571*G0_0_1_2_1_0 - 0.0180803571428571*G0_0_1_2_1_1 - 0.00602678571428571*G0_0_1_2_1_2 - 0.00602678571428571*G0_0_1_2_2_0 - 0.00602678571428571*G0_0_1_2_2_1 + 0.108482142857143*G0_1_0_0_0_0 + 0.0904017857142857*G0_1_0_0_0_1 + 0.0180803571428571*G0_1_0_0_0_2 + 0.0904017857142857*G0_1_0_0_1_0 + 0.0904017857142857*G0_1_0_0_1_1 + 0.0180803571428571*G0_1_0_0_1_2 + 0.0180803571428571*G0_1_0_0_2_0 + 0.0180803571428571*G0_1_0_0_2_1 + 0.00602678571428571*G0_1_0_0_2_2 + 0.0904017857142857*G0_1_0_1_0_0 + 0.0904017857142857*G0_1_0_1_0_1 + 0.0180803571428571*G0_1_0_1_0_2 + 0.0904017857142857*G0_1_0_1_1_0 + 0.108482142857143*G0_1_0_1_1_1 + 0.0180803571428571*G0_1_0_1_1_2 + 0.0180803571428571*G0_1_0_1_2_0 + 0.0180803571428571*G0_1_0_1_2_1 + 0.00602678571428572*G0_1_0_1_2_2 + 0.0180803571428571*G0_1_0_2_0_0 + 0.0180803571428571*G0_1_0_2_0_1 + 0.00602678571428571*G0_1_0_2_0_2 + 0.0180803571428571*G0_1_0_2_1_0 + 0.0180803571428571*G0_1_0_2_1_1 + 0.00602678571428571*G0_1_0_2_1_2 + 0.00602678571428571*G0_1_0_2_2_0 + 0.00602678571428571*G0_1_0_2_2_1; + A[42] = -A[72] + 0.0267857142857142*G0_0_1_0_0_0 - 0.00223214285714286*G0_0_1_0_0_1 + 0.00624999999999999*G0_0_1_0_0_2 - 0.00223214285714286*G0_0_1_0_1_0 - 0.00535714285714286*G0_0_1_0_1_1 + 0.00424107142857143*G0_0_1_0_1_2 + 0.00624999999999999*G0_0_1_0_2_0 + 0.00424107142857143*G0_0_1_0_2_1 + 0.0370535714285714*G0_0_1_0_2_2 - 0.00223214285714286*G0_0_1_1_0_0 - 0.00535714285714286*G0_0_1_1_0_1 + 0.00424107142857143*G0_0_1_1_0_2 - 0.00535714285714286*G0_0_1_1_1_0 - 0.00133928571428575*G0_0_1_1_1_1 + 0.00669642857142858*G0_0_1_1_1_2 + 0.00424107142857143*G0_0_1_1_2_0 + 0.00669642857142858*G0_0_1_1_2_1 + 0.0406250000000001*G0_0_1_1_2_2 + 0.00624999999999999*G0_0_1_2_0_0 + 0.00424107142857143*G0_0_1_2_0_1 + 0.0370535714285714*G0_0_1_2_0_2 + 0.00424107142857143*G0_0_1_2_1_0 + 0.00669642857142858*G0_0_1_2_1_1 + 0.0406250000000001*G0_0_1_2_1_2 + 0.0370535714285714*G0_0_1_2_2_0 + 0.0406250000000001*G0_0_1_2_2_1 + 0.4125*G0_0_1_2_2_2 - 0.0361607142857143*G0_1_1_0_0_0 - 0.01875*G0_1_1_0_0_1 + 0.00133928571428572*G0_1_1_0_0_2 - 0.01875*G0_1_1_0_1_0 - 0.0200892857142857*G0_1_1_0_1_1 + 0.00133928571428572*G0_1_1_0_2_0 + 0.0107142857142857*G0_1_1_0_2_2 - 0.01875*G0_1_1_1_0_0 - 0.0200892857142857*G0_1_1_1_0_1 - 0.0200892857142857*G0_1_1_1_1_0 - 0.0482142857142857*G0_1_1_1_1_1 - 0.00401785714285712*G0_1_1_1_1_2 - 0.00401785714285712*G0_1_1_1_2_1 + 0.01875*G0_1_1_1_2_2 + 0.00133928571428572*G0_1_1_2_0_0 + 0.0107142857142857*G0_1_1_2_0_2 - 0.00401785714285712*G0_1_1_2_1_1 + 0.01875*G0_1_1_2_1_2 + 0.0107142857142857*G0_1_1_2_2_0 + 0.01875*G0_1_1_2_2_1 + 0.120535714285715*G0_1_1_2_2_2; + A[62] = -A[42] - 0.0575892857142857*G0_1_1_0_0_0 - 0.0191964285714285*G0_1_1_0_0_1 - 0.0116071428571428*G0_1_1_0_0_2 - 0.0191964285714285*G0_1_1_0_1_0 - 0.0191964285714285*G0_1_1_0_1_1 - 0.00580357142857143*G0_1_1_0_1_2 - 0.0116071428571428*G0_1_1_0_2_0 - 0.00580357142857143*G0_1_1_0_2_1 - 0.0160714285714286*G0_1_1_0_2_2 - 0.0191964285714285*G0_1_1_1_0_0 - 0.0191964285714285*G0_1_1_1_0_1 - 0.00580357142857142*G0_1_1_1_0_2 - 0.0191964285714285*G0_1_1_1_1_0 - 0.0575892857142856*G0_1_1_1_1_1 - 0.0116071428571428*G0_1_1_1_1_2 - 0.00580357142857142*G0_1_1_1_2_0 - 0.0116071428571428*G0_1_1_1_2_1 - 0.0160714285714286*G0_1_1_1_2_2 - 0.0116071428571428*G0_1_1_2_0_0 - 0.00580357142857143*G0_1_1_2_0_1 - 0.0160714285714286*G0_1_1_2_0_2 - 0.00580357142857142*G0_1_1_2_1_0 - 0.0116071428571428*G0_1_1_2_1_1 - 0.0160714285714286*G0_1_1_2_1_2 - 0.0160714285714286*G0_1_1_2_2_0 - 0.0160714285714286*G0_1_1_2_2_1 - 0.20625*G0_1_1_2_2_2; + A[96] = A[69] + 0.0723214285714283*G0_0_1_0_0_0 + 0.0723214285714284*G0_0_1_0_0_2 - 0.0120535714285715*G0_0_1_0_1_1 + 0.0723214285714284*G0_0_1_0_2_0 + 0.0361607142857141*G0_0_1_0_2_2 - 0.0120535714285715*G0_0_1_1_0_1 - 0.0120535714285715*G0_0_1_1_1_0 - 0.0361607142857144*G0_0_1_1_1_1 - 0.0241071428571429*G0_0_1_1_1_2 - 0.0241071428571429*G0_0_1_1_2_1 - 0.0361607142857144*G0_0_1_1_2_2 + 0.0723214285714284*G0_0_1_2_0_0 + 0.0361607142857141*G0_0_1_2_0_2 - 0.0241071428571429*G0_0_1_2_1_1 - 0.0361607142857144*G0_0_1_2_1_2 + 0.0361607142857141*G0_0_1_2_2_0 - 0.0361607142857144*G0_0_1_2_2_1 - 0.144642857142858*G0_0_1_2_2_2 - 0.0723214285714283*G0_1_0_0_0_0 - 0.0723214285714284*G0_1_0_0_0_2 + 0.0120535714285715*G0_1_0_0_1_1 - 0.0723214285714284*G0_1_0_0_2_0 - 0.0361607142857141*G0_1_0_0_2_2 + 0.0120535714285715*G0_1_0_1_0_1 + 0.0120535714285715*G0_1_0_1_1_0 + 0.0361607142857144*G0_1_0_1_1_1 + 0.0241071428571429*G0_1_0_1_1_2 + 0.0241071428571429*G0_1_0_1_2_1 + 0.0361607142857144*G0_1_0_1_2_2 - 0.0723214285714284*G0_1_0_2_0_0 - 0.0361607142857141*G0_1_0_2_0_2 + 0.0241071428571429*G0_1_0_2_1_1 + 0.0361607142857144*G0_1_0_2_1_2 - 0.0361607142857141*G0_1_0_2_2_0 + 0.0361607142857144*G0_1_0_2_2_1 + 0.144642857142858*G0_1_0_2_2_2; + A[89] = A[96] - 0.120535714285714*G0_0_0_0_0_0 - 0.0241071428571429*G0_0_0_0_0_2 + 0.0120535714285714*G0_0_0_0_1_1 - 0.0241071428571429*G0_0_0_0_2_0 + 0.0120535714285714*G0_0_0_0_2_2 + 0.0120535714285714*G0_0_0_1_0_1 + 0.0120535714285714*G0_0_0_1_1_0 + 0.204910714285714*G0_0_0_1_1_1 + 0.0241071428571427*G0_0_0_1_1_2 + 0.0241071428571427*G0_0_0_1_2_1 - 0.0361607142857143*G0_0_0_1_2_2 - 0.0241071428571429*G0_0_0_2_0_0 + 0.0120535714285714*G0_0_0_2_0_2 + 0.0241071428571427*G0_0_0_2_1_1 - 0.0361607142857143*G0_0_0_2_1_2 + 0.0120535714285714*G0_0_0_2_2_0 - 0.0361607142857143*G0_0_0_2_2_1 - 0.048214285714286*G0_0_0_2_2_2 + 0.0723214285714286*G0_0_1_0_0_1 - 0.0723214285714285*G0_0_1_0_0_2 + 0.0723214285714286*G0_0_1_0_1_0 + 0.0723214285714286*G0_0_1_0_1_1 - 0.0723214285714285*G0_0_1_0_2_0 - 0.0723214285714284*G0_0_1_0_2_2 + 0.0723214285714286*G0_0_1_1_0_0 + 0.0723214285714286*G0_0_1_1_0_1 + 0.0723214285714286*G0_0_1_1_1_0 + 0.180803571428571*G0_0_1_1_1_1 + 0.0361607142857142*G0_0_1_1_1_2 + 0.0361607142857142*G0_0_1_1_2_1 - 0.0361607142857142*G0_0_1_1_2_2 - 0.0723214285714285*G0_0_1_2_0_0 - 0.0723214285714284*G0_0_1_2_0_2 + 0.0361607142857142*G0_0_1_2_1_1 - 0.0361607142857142*G0_0_1_2_1_2 - 0.0723214285714284*G0_0_1_2_2_0 - 0.0361607142857142*G0_0_1_2_2_1 - 0.180803571428571*G0_0_1_2_2_2 + 0.0241071428571428*G0_1_0_0_1_1 - 0.0241071428571429*G0_1_0_0_2_2 + 0.0241071428571428*G0_1_0_1_0_1 + 0.0241071428571428*G0_1_0_1_1_0 + 0.289285714285713*G0_1_0_1_1_1 + 0.0482142857142855*G0_1_0_1_1_2 + 0.0482142857142855*G0_1_0_1_2_1 - 0.0482142857142858*G0_1_0_1_2_2 - 0.0241071428571429*G0_1_0_2_0_2 + 0.0482142857142855*G0_1_0_2_1_1 - 0.0482142857142858*G0_1_0_2_1_2 - 0.0241071428571429*G0_1_0_2_2_0 - 0.0482142857142858*G0_1_0_2_2_1 - 0.289285714285715*G0_1_0_2_2_2 + 0.120535714285714*G0_1_1_0_0_0 + 0.0241071428571428*G0_1_1_0_0_1 + 0.0241071428571428*G0_1_1_0_1_0 - 0.0120535714285715*G0_1_1_0_1_1 - 0.0120535714285714*G0_1_1_0_2_2 + 0.0241071428571428*G0_1_1_1_0_0 - 0.0120535714285715*G0_1_1_1_0_1 - 0.0120535714285715*G0_1_1_1_1_0 + 0.0482142857142852*G0_1_1_1_1_1 + 0.0361607142857142*G0_1_1_1_1_2 + 0.0361607142857142*G0_1_1_1_2_1 - 0.0241071428571429*G0_1_1_1_2_2 - 0.0120535714285714*G0_1_1_2_0_2 + 0.0361607142857142*G0_1_1_2_1_1 - 0.0241071428571429*G0_1_1_2_1_2 - 0.0120535714285714*G0_1_1_2_2_0 - 0.0241071428571429*G0_1_1_2_2_1 - 0.204910714285715*G0_1_1_2_2_2; + A[94] = -A[96] + 0.108482142857143*G0_0_1_0_0_0 + 0.0120535714285714*G0_0_1_0_0_1 + 0.0964285714285713*G0_0_1_0_0_2 + 0.0120535714285714*G0_0_1_0_1_0 - 0.0120535714285715*G0_0_1_0_1_1 + 0.0964285714285713*G0_0_1_0_2_0 + 0.0723214285714284*G0_0_1_0_2_2 + 0.0120535714285714*G0_0_1_1_0_0 - 0.0120535714285715*G0_0_1_1_0_1 - 0.0120535714285715*G0_0_1_1_1_0 - 0.108482142857143*G0_0_1_1_1_1 - 0.0964285714285714*G0_0_1_1_1_2 - 0.0964285714285714*G0_0_1_1_2_1 - 0.0723214285714285*G0_0_1_1_2_2 + 0.0964285714285712*G0_0_1_2_0_0 + 0.0723214285714284*G0_0_1_2_0_2 - 0.0964285714285714*G0_0_1_2_1_1 - 0.0723214285714285*G0_0_1_2_1_2 + 0.0723214285714284*G0_0_1_2_2_0 - 0.0723214285714285*G0_0_1_2_2_1 - 0.180803571428572*G0_1_1_0_0_0 - 0.0964285714285715*G0_1_1_0_0_1 - 0.0120535714285715*G0_1_1_0_0_2 - 0.0964285714285715*G0_1_1_0_1_0 - 0.108482142857143*G0_1_1_0_1_1 - 0.0241071428571428*G0_1_1_0_1_2 - 0.0120535714285715*G0_1_1_0_2_0 - 0.0241071428571428*G0_1_1_0_2_1 - 0.0241071428571428*G0_1_1_0_2_2 - 0.0964285714285715*G0_1_1_1_0_0 - 0.108482142857143*G0_1_1_1_0_1 - 0.0241071428571428*G0_1_1_1_0_2 - 0.108482142857143*G0_1_1_1_1_0 - 0.289285714285714*G0_1_1_1_1_1 - 0.108482142857143*G0_1_1_1_1_2 - 0.0241071428571428*G0_1_1_1_2_0 - 0.108482142857143*G0_1_1_1_2_1 - 0.0964285714285713*G0_1_1_1_2_2 - 0.0120535714285715*G0_1_1_2_0_0 - 0.0241071428571428*G0_1_1_2_0_1 - 0.0241071428571428*G0_1_1_2_0_2 - 0.0241071428571428*G0_1_1_2_1_0 - 0.108482142857143*G0_1_1_2_1_1 - 0.0964285714285713*G0_1_1_2_1_2 - 0.0241071428571428*G0_1_1_2_2_0 - 0.0964285714285713*G0_1_1_2_2_1 - 0.0723214285714281*G0_1_1_2_2_2; + A[98] = A[89] - 0.0723214285714286*G0_0_1_0_0_0 - 0.0723214285714286*G0_0_1_0_0_1 - 0.0723214285714286*G0_0_1_0_1_0 - 0.0361607142857143*G0_0_1_0_1_1 + 0.0120535714285714*G0_0_1_0_2_2 - 0.0723214285714286*G0_0_1_1_0_0 - 0.0361607142857143*G0_0_1_1_0_1 - 0.0361607142857143*G0_0_1_1_1_0 + 0.144642857142857*G0_0_1_1_1_1 + 0.0361607142857142*G0_0_1_1_1_2 + 0.0361607142857142*G0_0_1_1_2_1 + 0.0241071428571428*G0_0_1_1_2_2 + 0.0120535714285714*G0_0_1_2_0_2 + 0.0361607142857142*G0_0_1_2_1_1 + 0.0241071428571428*G0_0_1_2_1_2 + 0.0120535714285714*G0_0_1_2_2_0 + 0.0241071428571428*G0_0_1_2_2_1 + 0.0361607142857141*G0_0_1_2_2_2 + 0.0723214285714286*G0_1_0_0_0_0 + 0.0723214285714286*G0_1_0_0_0_1 + 0.0723214285714286*G0_1_0_0_1_0 + 0.0361607142857143*G0_1_0_0_1_1 - 0.0120535714285714*G0_1_0_0_2_2 + 0.0723214285714286*G0_1_0_1_0_0 + 0.0361607142857143*G0_1_0_1_0_1 + 0.0361607142857143*G0_1_0_1_1_0 - 0.144642857142857*G0_1_0_1_1_1 - 0.0361607142857142*G0_1_0_1_1_2 - 0.0361607142857142*G0_1_0_1_2_1 - 0.0241071428571428*G0_1_0_1_2_2 - 0.0120535714285714*G0_1_0_2_0_2 - 0.0361607142857142*G0_1_0_2_1_1 - 0.0241071428571428*G0_1_0_2_1_2 - 0.0120535714285714*G0_1_0_2_2_0 - 0.0241071428571428*G0_1_0_2_2_1 - 0.036160714285714*G0_1_0_2_2_2; + A[93] = -A[98] - 0.180803571428571*G0_0_0_0_0_0 - 0.0120535714285714*G0_0_0_0_0_1 - 0.0964285714285714*G0_0_0_0_0_2 - 0.0120535714285714*G0_0_0_0_1_0 - 0.0241071428571429*G0_0_0_0_1_1 - 0.0241071428571428*G0_0_0_0_1_2 - 0.0964285714285714*G0_0_0_0_2_0 - 0.0241071428571428*G0_0_0_0_2_1 - 0.108482142857143*G0_0_0_0_2_2 - 0.0120535714285714*G0_0_0_1_0_0 - 0.0241071428571429*G0_0_0_1_0_1 - 0.0241071428571428*G0_0_0_1_0_2 - 0.0241071428571429*G0_0_0_1_1_0 - 0.0723214285714288*G0_0_0_1_1_1 - 0.0964285714285713*G0_0_0_1_1_2 - 0.0241071428571428*G0_0_0_1_2_0 - 0.0964285714285713*G0_0_0_1_2_1 - 0.108482142857143*G0_0_0_1_2_2 - 0.0964285714285714*G0_0_0_2_0_0 - 0.0241071428571428*G0_0_0_2_0_1 - 0.108482142857143*G0_0_0_2_0_2 - 0.0241071428571428*G0_0_0_2_1_0 - 0.0964285714285713*G0_0_0_2_1_1 - 0.108482142857143*G0_0_0_2_1_2 - 0.108482142857143*G0_0_0_2_2_0 - 0.108482142857143*G0_0_0_2_2_1 - 0.289285714285714*G0_0_0_2_2_2 + 0.108482142857143*G0_1_0_0_0_0 + 0.0964285714285714*G0_1_0_0_0_1 + 0.0120535714285714*G0_1_0_0_0_2 + 0.0964285714285715*G0_1_0_0_1_0 + 0.0723214285714286*G0_1_0_0_1_1 + 0.0120535714285714*G0_1_0_0_2_0 - 0.0120535714285714*G0_1_0_0_2_2 + 0.0964285714285715*G0_1_0_1_0_0 + 0.0723214285714286*G0_1_0_1_0_1 + 0.0723214285714286*G0_1_0_1_1_0 - 0.0723214285714285*G0_1_0_1_1_2 - 0.0723214285714285*G0_1_0_1_2_1 - 0.0964285714285712*G0_1_0_1_2_2 + 0.0120535714285714*G0_1_0_2_0_0 - 0.0120535714285714*G0_1_0_2_0_2 - 0.0723214285714285*G0_1_0_2_1_1 - 0.0964285714285712*G0_1_0_2_1_2 - 0.0120535714285714*G0_1_0_2_2_0 - 0.0964285714285712*G0_1_0_2_2_1 - 0.108482142857142*G0_1_0_2_2_2; + A[39] = A[93] + 0.0361607142857141*G0_0_1_0_0_0 + 0.0241071428571428*G0_0_1_0_0_1 + 0.0120535714285714*G0_0_1_0_0_2 + 0.0241071428571428*G0_0_1_0_1_0 + 0.0361607142857142*G0_0_1_0_1_1 + 0.0120535714285714*G0_0_1_0_2_0 + 0.0241071428571428*G0_0_1_1_0_0 + 0.0361607142857142*G0_0_1_1_0_1 + 0.0361607142857142*G0_0_1_1_1_0 + 0.144642857142857*G0_0_1_1_1_1 - 0.0361607142857143*G0_0_1_1_1_2 - 0.0361607142857143*G0_0_1_1_2_1 - 0.0723214285714284*G0_0_1_1_2_2 + 0.0120535714285714*G0_0_1_2_0_0 - 0.0361607142857143*G0_0_1_2_1_1 - 0.0723214285714284*G0_0_1_2_1_2 - 0.0723214285714284*G0_0_1_2_2_1 - 0.0723214285714283*G0_0_1_2_2_2 - 0.0361607142857141*G0_1_0_0_0_0 - 0.0241071428571428*G0_1_0_0_0_1 - 0.0120535714285714*G0_1_0_0_0_2 - 0.0241071428571428*G0_1_0_0_1_0 - 0.0361607142857142*G0_1_0_0_1_1 - 0.0120535714285714*G0_1_0_0_2_0 - 0.0241071428571428*G0_1_0_1_0_0 - 0.0361607142857142*G0_1_0_1_0_1 - 0.0361607142857142*G0_1_0_1_1_0 - 0.144642857142857*G0_1_0_1_1_1 + 0.0361607142857143*G0_1_0_1_1_2 + 0.0361607142857143*G0_1_0_1_2_1 + 0.0723214285714284*G0_1_0_1_2_2 - 0.0120535714285714*G0_1_0_2_0_0 + 0.0361607142857143*G0_1_0_2_1_1 + 0.0723214285714284*G0_1_0_2_1_2 + 0.0723214285714284*G0_1_0_2_2_1 + 0.0723214285714283*G0_1_0_2_2_2; + A[65] = -A[45] - 0.0904017857142855*G0_1_0_0_0_0 - 0.0180803571428571*G0_1_0_0_0_1 - 0.088392857142857*G0_1_0_0_0_2 - 0.0180803571428571*G0_1_0_0_1_0 - 0.00602678571428567*G0_1_0_0_1_1 - 0.0200892857142857*G0_1_0_0_1_2 - 0.088392857142857*G0_1_0_0_2_0 - 0.0200892857142857*G0_1_0_0_2_1 - 0.0843749999999999*G0_1_0_0_2_2 - 0.0180803571428571*G0_1_0_1_0_0 - 0.00602678571428567*G0_1_0_1_0_1 - 0.0200892857142857*G0_1_0_1_0_2 - 0.00602678571428567*G0_1_0_1_1_0 + 0.0180803571428573*G0_1_0_1_1_1 + 0.0080357142857143*G0_1_0_1_1_2 - 0.0200892857142857*G0_1_0_1_2_0 + 0.0080357142857143*G0_1_0_1_2_1 - 0.0120535714285714*G0_1_0_1_2_2 - 0.088392857142857*G0_1_0_2_0_0 - 0.0200892857142857*G0_1_0_2_0_1 - 0.0843749999999999*G0_1_0_2_0_2 - 0.0200892857142857*G0_1_0_2_1_0 + 0.0080357142857143*G0_1_0_2_1_1 - 0.0120535714285714*G0_1_0_2_1_2 - 0.0843749999999999*G0_1_0_2_2_0 - 0.0120535714285714*G0_1_0_2_2_1 - 0.216964285714286*G0_1_0_2_2_2 - 0.331473214285714*G0_1_1_0_0_0 - 0.0602678571428571*G0_1_1_0_0_1 - 0.0703124999999998*G0_1_1_0_0_2 - 0.0602678571428571*G0_1_1_0_1_0 - 0.0220982142857143*G0_1_1_0_1_1 - 0.0200892857142857*G0_1_1_0_1_2 - 0.0703124999999998*G0_1_1_0_2_0 - 0.0200892857142857*G0_1_1_0_2_1 - 0.0683035714285713*G0_1_1_0_2_2 - 0.0602678571428571*G0_1_1_1_0_0 - 0.0220982142857143*G0_1_1_1_0_1 - 0.0200892857142857*G0_1_1_1_0_2 - 0.0220982142857143*G0_1_1_1_1_0 + 0.0120535714285714*G0_1_1_1_1_1 + 0.00200892857142857*G0_1_1_1_1_2 - 0.0200892857142857*G0_1_1_1_2_0 + 0.00200892857142857*G0_1_1_1_2_1 - 0.0160714285714286*G0_1_1_1_2_2 - 0.0703124999999998*G0_1_1_2_0_0 - 0.0200892857142857*G0_1_1_2_0_1 - 0.0683035714285713*G0_1_1_2_0_2 - 0.0200892857142857*G0_1_1_2_1_0 + 0.00200892857142857*G0_1_1_2_1_1 - 0.0160714285714286*G0_1_1_2_1_2 - 0.0683035714285713*G0_1_1_2_2_0 - 0.0160714285714286*G0_1_1_2_2_1 - 0.204910714285714*G0_1_1_2_2_2; + A[53] = -A[58] + 0.114508928571429*G0_0_0_0_0_0 - 0.0180803571428571*G0_0_0_0_0_1 + 0.0522321428571429*G0_0_0_0_0_2 - 0.0180803571428571*G0_0_0_0_1_0 - 0.0200892857142857*G0_0_0_0_1_1 - 0.00602678571428569*G0_0_0_0_1_2 + 0.0522321428571429*G0_0_0_0_2_0 - 0.00602678571428569*G0_0_0_0_2_1 + 0.0421874999999999*G0_0_0_0_2_2 - 0.0180803571428571*G0_0_0_1_0_0 - 0.0200892857142857*G0_0_0_1_0_1 - 0.00602678571428569*G0_0_0_1_0_2 - 0.0200892857142857*G0_0_0_1_1_0 - 0.0120535714285712*G0_0_0_1_1_1 + 0.00803571428571429*G0_0_0_1_1_2 - 0.00602678571428569*G0_0_0_1_2_0 + 0.00803571428571429*G0_0_0_1_2_1 + 0.0180803571428571*G0_0_0_1_2_2 + 0.0522321428571429*G0_0_0_2_0_0 - 0.00602678571428569*G0_0_0_2_0_1 + 0.0421874999999999*G0_0_0_2_0_2 - 0.00602678571428569*G0_0_0_2_1_0 + 0.00803571428571429*G0_0_0_2_1_1 + 0.0180803571428571*G0_0_0_2_1_2 + 0.0421874999999999*G0_0_0_2_2_0 + 0.0180803571428571*G0_0_0_2_2_1 + 0.0241071428571424*G0_0_0_2_2_2 - 0.1265625*G0_1_0_0_0_0 + 0.0100446428571429*G0_1_0_0_0_2 - 0.00401785714285712*G0_1_0_0_1_1 - 0.0060267857142857*G0_1_0_0_1_2 + 0.0100446428571429*G0_1_0_0_2_0 - 0.0060267857142857*G0_1_0_0_2_1 + 0.0261160714285714*G0_1_0_0_2_2 - 0.00401785714285712*G0_1_0_1_0_1 - 0.0060267857142857*G0_1_0_1_0_2 - 0.00401785714285712*G0_1_0_1_1_0 + 0.00401785714285714*G0_1_0_1_1_2 - 0.0060267857142857*G0_1_0_1_2_0 + 0.00401785714285713*G0_1_0_1_2_1 + 0.0120535714285714*G0_1_0_1_2_2 + 0.0100446428571429*G0_1_0_2_0_0 - 0.0060267857142857*G0_1_0_2_0_1 + 0.0261160714285714*G0_1_0_2_0_2 - 0.0060267857142857*G0_1_0_2_1_0 + 0.00401785714285714*G0_1_0_2_1_1 + 0.0120535714285714*G0_1_0_2_1_2 + 0.0261160714285714*G0_1_0_2_2_0 + 0.0120535714285714*G0_1_0_2_2_1 + 0.0180803571428567*G0_1_0_2_2_2; + A[70] = A[7] - 0.412499999999999*G0_0_1_0_0_0 - 0.0388392857142857*G0_0_1_0_0_1 - 0.0388392857142856*G0_0_1_0_0_2 - 0.0388392857142857*G0_0_1_0_1_0 - 0.00714285714285713*G0_0_1_0_1_1 - 0.00357142857142856*G0_0_1_0_1_2 - 0.0388392857142856*G0_0_1_0_2_0 - 0.00357142857142856*G0_0_1_0_2_1 - 0.00714285714285713*G0_0_1_0_2_2 - 0.0388392857142857*G0_0_1_1_0_0 - 0.00714285714285713*G0_0_1_1_0_1 - 0.00357142857142856*G0_0_1_1_0_2 - 0.00714285714285713*G0_0_1_1_1_0 - 0.000669642857142813*G0_0_1_1_1_1 - 0.000223214285714281*G0_0_1_1_1_2 - 0.00357142857142856*G0_0_1_1_2_0 - 0.000223214285714283*G0_0_1_1_2_1 - 0.000223214285714288*G0_0_1_1_2_2 - 0.0388392857142856*G0_0_1_2_0_0 - 0.00357142857142856*G0_0_1_2_0_1 - 0.00714285714285713*G0_0_1_2_0_2 - 0.00357142857142856*G0_0_1_2_1_0 - 0.00022321428571428*G0_0_1_2_1_1 - 0.000223214285714287*G0_0_1_2_1_2 - 0.00714285714285713*G0_0_1_2_2_0 - 0.000223214285714287*G0_0_1_2_2_1 - 0.000669642857142858*G0_0_1_2_2_2 + 0.412499999999999*G0_1_0_0_0_0 + 0.0388392857142857*G0_1_0_0_0_1 + 0.0388392857142856*G0_1_0_0_0_2 + 0.0388392857142857*G0_1_0_0_1_0 + 0.00714285714285713*G0_1_0_0_1_1 + 0.00357142857142856*G0_1_0_0_1_2 + 0.0388392857142856*G0_1_0_0_2_0 + 0.00357142857142856*G0_1_0_0_2_1 + 0.00714285714285713*G0_1_0_0_2_2 + 0.0388392857142857*G0_1_0_1_0_0 + 0.00714285714285713*G0_1_0_1_0_1 + 0.00357142857142856*G0_1_0_1_0_2 + 0.00714285714285713*G0_1_0_1_1_0 + 0.000669642857142813*G0_1_0_1_1_1 + 0.00022321428571428*G0_1_0_1_1_2 + 0.00357142857142856*G0_1_0_1_2_0 + 0.000223214285714278*G0_1_0_1_2_1 + 0.000223214285714286*G0_1_0_1_2_2 + 0.0388392857142856*G0_1_0_2_0_0 + 0.00357142857142856*G0_1_0_2_0_1 + 0.00714285714285713*G0_1_0_2_0_2 + 0.00357142857142856*G0_1_0_2_1_0 + 0.00022321428571428*G0_1_0_2_1_1 + 0.000223214285714288*G0_1_0_2_1_2 + 0.00714285714285713*G0_1_0_2_2_0 + 0.000223214285714287*G0_1_0_2_2_1 + 0.00066964285714286*G0_1_0_2_2_2; + A[5] = A[70] + 0.412499999999999*G0_0_0_0_0_0 + 0.03125*G0_0_0_0_0_1 + 0.0464285714285714*G0_0_0_0_0_2 + 0.03125*G0_0_0_0_1_0 + 0.00937499999999999*G0_0_0_0_1_1 + 0.00357142857142857*G0_0_0_0_1_2 + 0.0464285714285714*G0_0_0_0_2_0 + 0.00357142857142857*G0_0_0_0_2_1 + 0.00491071428571428*G0_0_0_0_2_2 + 0.03125*G0_0_0_1_0_0 + 0.00937499999999999*G0_0_0_1_0_1 + 0.00357142857142857*G0_0_0_1_0_2 + 0.00937499999999999*G0_0_0_1_1_0 + 0.0348214285714286*G0_0_0_1_1_1 + 0.00401785714285713*G0_0_0_1_1_2 + 0.00357142857142857*G0_0_0_1_2_0 + 0.00401785714285713*G0_0_0_1_2_1 - 0.00357142857142858*G0_0_0_1_2_2 + 0.0464285714285714*G0_0_0_2_0_0 + 0.00357142857142857*G0_0_0_2_0_1 + 0.00491071428571428*G0_0_0_2_0_2 + 0.00357142857142857*G0_0_0_2_1_0 + 0.00401785714285713*G0_0_0_2_1_1 - 0.00357142857142858*G0_0_0_2_1_2 + 0.00491071428571428*G0_0_0_2_2_0 - 0.00357142857142858*G0_0_0_2_2_1 - 0.0334821428571429*G0_0_0_2_2_2 - 0.0075892857142857*G0_0_1_0_0_1 + 0.00758928571428571*G0_0_1_0_0_2 - 0.0075892857142857*G0_0_1_0_1_0 + 0.00223214285714285*G0_0_1_0_1_1 + 0.00758928571428572*G0_0_1_0_2_0 - 0.00223214285714286*G0_0_1_0_2_2 - 0.0075892857142857*G0_0_1_1_0_0 + 0.00223214285714285*G0_0_1_1_0_1 + 0.00223214285714285*G0_0_1_1_1_0 + 0.0341517857142857*G0_0_1_1_1_1 + 0.00379464285714284*G0_0_1_1_1_2 + 0.00379464285714284*G0_0_1_1_2_1 - 0.00379464285714287*G0_0_1_1_2_2 + 0.00758928571428572*G0_0_1_2_0_0 - 0.00223214285714286*G0_0_1_2_0_2 + 0.00379464285714284*G0_0_1_2_1_1 - 0.00379464285714286*G0_0_1_2_1_2 - 0.00223214285714286*G0_0_1_2_2_0 - 0.00379464285714286*G0_0_1_2_2_1 - 0.0341517857142858*G0_0_1_2_2_2 - 0.00758928571428571*G0_1_0_0_0_1 + 0.00758928571428571*G0_1_0_0_0_2 - 0.00758928571428571*G0_1_0_0_1_0 + 0.00223214285714285*G0_1_0_0_1_1 + 0.00758928571428571*G0_1_0_0_2_0 - 0.00223214285714286*G0_1_0_0_2_2 - 0.00758928571428571*G0_1_0_1_0_0 + 0.00223214285714286*G0_1_0_1_0_1 + 0.00223214285714286*G0_1_0_1_1_0 + 0.0341517857142857*G0_1_0_1_1_1 + 0.00379464285714285*G0_1_0_1_1_2 + 0.00379464285714285*G0_1_0_1_2_1 - 0.00379464285714287*G0_1_0_1_2_2 + 0.00758928571428571*G0_1_0_2_0_0 - 0.00223214285714286*G0_1_0_2_0_2 + 0.00379464285714285*G0_1_0_2_1_1 - 0.00379464285714287*G0_1_0_2_1_2 - 0.00223214285714286*G0_1_0_2_2_0 - 0.00379464285714287*G0_1_0_2_2_1 - 0.0341517857142858*G0_1_0_2_2_2 - 0.4125*G0_1_1_0_0_0 - 0.0464285714285714*G0_1_1_0_0_1 - 0.0312499999999999*G0_1_1_0_0_2 - 0.0464285714285714*G0_1_1_0_1_0 - 0.00491071428571429*G0_1_1_0_1_1 - 0.00357142857142857*G0_1_1_0_1_2 - 0.0312499999999999*G0_1_1_0_2_0 - 0.00357142857142857*G0_1_1_0_2_1 - 0.009375*G0_1_1_0_2_2 - 0.0464285714285714*G0_1_1_1_0_0 - 0.00491071428571429*G0_1_1_1_0_1 - 0.00357142857142857*G0_1_1_1_0_2 - 0.00491071428571429*G0_1_1_1_1_0 + 0.0334821428571428*G0_1_1_1_1_1 + 0.00357142857142855*G0_1_1_1_1_2 - 0.00357142857142857*G0_1_1_1_2_0 + 0.00357142857142856*G0_1_1_1_2_1 - 0.00401785714285715*G0_1_1_1_2_2 - 0.0312499999999999*G0_1_1_2_0_0 - 0.00357142857142857*G0_1_1_2_0_1 - 0.009375*G0_1_1_2_0_2 - 0.00357142857142857*G0_1_1_2_1_0 + 0.00357142857142856*G0_1_1_2_1_1 - 0.00401785714285716*G0_1_1_2_1_2 - 0.009375*G0_1_1_2_2_0 - 0.00401785714285715*G0_1_1_2_2_1 - 0.0348214285714286*G0_1_1_2_2_2; + A[50] = A[5] + 0.412499999999999*G0_0_1_0_0_0 + 0.0388392857142857*G0_0_1_0_0_1 + 0.0388392857142856*G0_0_1_0_0_2 + 0.0388392857142857*G0_0_1_0_1_0 + 0.00714285714285714*G0_0_1_0_1_1 + 0.00357142857142856*G0_0_1_0_1_2 + 0.0388392857142856*G0_0_1_0_2_0 + 0.00357142857142856*G0_0_1_0_2_1 + 0.00714285714285713*G0_0_1_0_2_2 + 0.0388392857142857*G0_0_1_1_0_0 + 0.00714285714285714*G0_0_1_1_0_1 + 0.00357142857142856*G0_0_1_1_0_2 + 0.00714285714285714*G0_0_1_1_1_0 + 0.000669642857142872*G0_0_1_1_1_1 + 0.000223214285714287*G0_0_1_1_1_2 + 0.00357142857142856*G0_0_1_1_2_0 + 0.000223214285714285*G0_0_1_1_2_1 + 0.000223214285714285*G0_0_1_1_2_2 + 0.0388392857142856*G0_0_1_2_0_0 + 0.00357142857142856*G0_0_1_2_0_1 + 0.00714285714285713*G0_0_1_2_0_2 + 0.00357142857142856*G0_0_1_2_1_0 + 0.000223214285714287*G0_0_1_2_1_1 + 0.000223214285714283*G0_0_1_2_1_2 + 0.00714285714285713*G0_0_1_2_2_0 + 0.000223214285714283*G0_0_1_2_2_1 + 0.000669642857142855*G0_0_1_2_2_2 - 0.412499999999999*G0_1_0_0_0_0 - 0.0388392857142857*G0_1_0_0_0_1 - 0.0388392857142856*G0_1_0_0_0_2 - 0.0388392857142857*G0_1_0_0_1_0 - 0.00714285714285714*G0_1_0_0_1_1 - 0.00357142857142856*G0_1_0_0_1_2 - 0.0388392857142856*G0_1_0_0_2_0 - 0.00357142857142856*G0_1_0_0_2_1 - 0.00714285714285713*G0_1_0_0_2_2 - 0.0388392857142857*G0_1_0_1_0_0 - 0.00714285714285714*G0_1_0_1_0_1 - 0.00357142857142856*G0_1_0_1_0_2 - 0.00714285714285714*G0_1_0_1_1_0 - 0.00066964285714287*G0_1_0_1_1_1 - 0.000223214285714287*G0_1_0_1_1_2 - 0.00357142857142856*G0_1_0_1_2_0 - 0.000223214285714285*G0_1_0_1_2_1 - 0.000223214285714283*G0_1_0_1_2_2 - 0.0388392857142856*G0_1_0_2_0_0 - 0.00357142857142856*G0_1_0_2_0_1 - 0.00714285714285713*G0_1_0_2_0_2 - 0.00357142857142856*G0_1_0_2_1_0 - 0.000223214285714287*G0_1_0_2_1_1 - 0.000223214285714283*G0_1_0_2_1_2 - 0.00714285714285713*G0_1_0_2_2_0 - 0.000223214285714283*G0_1_0_2_2_1 - 0.000669642857142848*G0_1_0_2_2_2; + A[6] = -A[4] + 0.141964285714286*G0_0_1_0_0_0 + 0.0191964285714286*G0_0_1_0_0_1 + 0.00758928571428569*G0_0_1_0_0_2 + 0.0191964285714286*G0_0_1_0_1_0 + 0.00312500000000001*G0_0_1_0_1_1 + 0.00379464285714285*G0_0_1_0_1_2 + 0.00758928571428569*G0_0_1_0_2_0 + 0.00379464285714285*G0_0_1_0_2_1 + 0.00803571428571427*G0_0_1_0_2_2 + 0.0191964285714286*G0_0_1_1_0_0 + 0.00312500000000001*G0_0_1_1_0_1 + 0.00379464285714285*G0_0_1_1_0_2 + 0.00312500000000001*G0_0_1_1_1_0 - 0.00267857142857137*G0_0_1_1_1_1 - 0.0044642857142857*G0_0_1_1_1_2 + 0.00379464285714285*G0_0_1_1_2_0 - 0.0044642857142857*G0_0_1_1_2_1 + 0.0075892857142857*G0_0_1_2_0_0 + 0.00379464285714285*G0_0_1_2_0_1 + 0.00803571428571427*G0_0_1_2_0_2 + 0.00379464285714285*G0_0_1_2_1_0 - 0.0044642857142857*G0_0_1_2_1_1 + 0.00803571428571427*G0_0_1_2_2_0 + 0.0375000000000001*G0_0_1_2_2_2 + 0.141964285714286*G0_1_1_0_0_0 + 0.0191964285714286*G0_1_1_0_0_1 + 0.0075892857142857*G0_1_1_0_0_2 + 0.0191964285714286*G0_1_1_0_1_0 + 0.00312500000000001*G0_1_1_0_1_1 + 0.00379464285714285*G0_1_1_0_1_2 + 0.0075892857142857*G0_1_1_0_2_0 + 0.00379464285714285*G0_1_1_0_2_1 + 0.00803571428571428*G0_1_1_0_2_2 + 0.0191964285714286*G0_1_1_1_0_0 + 0.00312500000000001*G0_1_1_1_0_1 + 0.00379464285714285*G0_1_1_1_0_2 + 0.00312500000000001*G0_1_1_1_1_0 - 0.0026785714285714*G0_1_1_1_1_1 - 0.0044642857142857*G0_1_1_1_1_2 + 0.00379464285714285*G0_1_1_1_2_0 - 0.0044642857142857*G0_1_1_1_2_1 + 0.0075892857142857*G0_1_1_2_0_0 + 0.00379464285714285*G0_1_1_2_0_1 + 0.00803571428571428*G0_1_1_2_0_2 + 0.00379464285714285*G0_1_1_2_1_0 - 0.0044642857142857*G0_1_1_2_1_1 + 0.00803571428571428*G0_1_1_2_2_0 + 0.0375000000000001*G0_1_1_2_2_2; + A[17] = -A[14] + 0.0629464285714285*G0_0_0_0_0_0 + 0.00580357142857142*G0_0_0_0_0_1 + 0.0142857142857143*G0_0_0_0_0_2 + 0.00580357142857142*G0_0_0_0_1_0 + 0.00267857142857141*G0_0_0_0_1_1 + 0.00223214285714285*G0_0_0_0_1_2 + 0.0142857142857143*G0_0_0_0_2_0 + 0.00223214285714285*G0_0_0_0_2_1 + 0.0129464285714286*G0_0_0_0_2_2 + 0.00580357142857142*G0_0_0_1_0_0 + 0.00267857142857141*G0_0_0_1_0_1 + 0.00223214285714285*G0_0_0_1_0_2 + 0.00267857142857141*G0_0_0_1_1_0 + 0.107142857142857*G0_0_0_1_1_1 + 0.0107142857142857*G0_0_0_1_1_2 + 0.00223214285714285*G0_0_0_1_2_0 + 0.0107142857142857*G0_0_0_1_2_1 + 0.000446428571428581*G0_0_0_1_2_2 + 0.0142857142857143*G0_0_0_2_0_0 + 0.00223214285714285*G0_0_0_2_0_1 + 0.0129464285714286*G0_0_0_2_0_2 + 0.00223214285714285*G0_0_0_2_1_0 + 0.0107142857142857*G0_0_0_2_1_1 + 0.00044642857142858*G0_0_0_2_1_2 + 0.0129464285714286*G0_0_0_2_2_0 + 0.00044642857142858*G0_0_0_2_2_1 + 0.0508928571428573*G0_0_0_2_2_2 + 0.0120535714285714*G0_0_1_0_0_0 + 0.00535714285714286*G0_0_1_0_0_1 + 0.00133928571428571*G0_0_1_0_0_2 + 0.00535714285714286*G0_0_1_0_1_0 - 0.00803571428571428*G0_0_1_0_1_1 + 0.00133928571428572*G0_0_1_0_2_0 - 0.0013392857142857*G0_0_1_0_2_2 + 0.00535714285714286*G0_0_1_1_0_0 - 0.00803571428571428*G0_0_1_1_0_1 - 0.00803571428571428*G0_0_1_1_1_0 + 0.00803571428571428*G0_0_1_1_1_2 + 0.00803571428571428*G0_0_1_1_2_1 - 0.00535714285714284*G0_0_1_1_2_2 + 0.00133928571428572*G0_0_1_2_0_0 - 0.0013392857142857*G0_0_1_2_0_2 + 0.00803571428571428*G0_0_1_2_1_1 - 0.00535714285714284*G0_0_1_2_1_2 - 0.0013392857142857*G0_0_1_2_2_0 - 0.00535714285714285*G0_0_1_2_2_1 - 0.0120535714285713*G0_0_1_2_2_2; + A[34] = -A[36] - 0.0180803571428571*G0_0_1_0_0_0 + 0.00602678571428571*G0_0_1_0_0_1 - 0.00803571428571428*G0_0_1_0_0_2 + 0.00602678571428571*G0_0_1_0_1_0 + 0.0180803571428571*G0_0_1_0_1_1 + 0.0200892857142857*G0_0_1_0_1_2 - 0.00803571428571428*G0_0_1_0_2_0 + 0.0200892857142857*G0_0_1_0_2_1 + 0.0120535714285714*G0_0_1_0_2_2 + 0.00602678571428571*G0_0_1_1_0_0 + 0.0180803571428571*G0_0_1_1_0_1 + 0.0200892857142857*G0_0_1_1_0_2 + 0.0180803571428571*G0_0_1_1_1_0 + 0.0904017857142858*G0_0_1_1_1_1 + 0.0883928571428571*G0_0_1_1_1_2 + 0.0200892857142857*G0_0_1_1_2_0 + 0.0883928571428571*G0_0_1_1_2_1 + 0.0843749999999999*G0_0_1_1_2_2 - 0.00803571428571428*G0_0_1_2_0_0 + 0.0200892857142857*G0_0_1_2_0_1 + 0.0120535714285714*G0_0_1_2_0_2 + 0.0200892857142857*G0_0_1_2_1_0 + 0.0883928571428571*G0_0_1_2_1_1 + 0.0843749999999999*G0_0_1_2_1_2 + 0.0120535714285714*G0_0_1_2_2_0 + 0.0843749999999999*G0_0_1_2_2_1 + 0.216964285714286*G0_0_1_2_2_2 - 0.00602678571428579*G0_1_1_0_0_0 - 0.0160714285714286*G0_1_1_0_0_1 - 0.00602678571428569*G0_1_1_0_0_2 - 0.0160714285714286*G0_1_1_0_1_0 - 0.0421874999999999*G0_1_1_0_1_1 - 0.00602678571428569*G0_1_1_0_2_0 - 0.00401785714285712*G0_1_1_0_2_2 - 0.0160714285714286*G0_1_1_1_0_0 - 0.0421874999999999*G0_1_1_1_0_1 - 0.0421874999999999*G0_1_1_1_1_0 - 0.241071428571428*G0_1_1_1_1_1 + 0.0180803571428572*G0_1_1_1_1_2 + 0.0180803571428572*G0_1_1_1_2_1 + 0.0160714285714286*G0_1_1_1_2_2 - 0.00602678571428569*G0_1_1_2_0_0 - 0.00401785714285712*G0_1_1_2_0_2 + 0.0180803571428572*G0_1_1_2_1_1 + 0.0160714285714286*G0_1_1_2_1_2 - 0.00401785714285712*G0_1_1_2_2_0 + 0.0160714285714286*G0_1_1_2_2_1 + 0.0120535714285713*G0_1_1_2_2_2; + A[24] = -A[27] + 0.0267857142857142*G0_1_0_0_0_0 - 0.00223214285714286*G0_1_0_0_0_1 + 0.00624999999999999*G0_1_0_0_0_2 - 0.00223214285714287*G0_1_0_0_1_0 - 0.00535714285714286*G0_1_0_0_1_1 + 0.00424107142857143*G0_1_0_0_1_2 + 0.00624999999999999*G0_1_0_0_2_0 + 0.00424107142857143*G0_1_0_0_2_1 + 0.0370535714285714*G0_1_0_0_2_2 - 0.00223214285714287*G0_1_0_1_0_0 - 0.00535714285714286*G0_1_0_1_0_1 + 0.00424107142857143*G0_1_0_1_0_2 - 0.00535714285714286*G0_1_0_1_1_0 - 0.00133928571428575*G0_1_0_1_1_1 + 0.00669642857142858*G0_1_0_1_1_2 + 0.00424107142857143*G0_1_0_1_2_0 + 0.00669642857142858*G0_1_0_1_2_1 + 0.0406250000000001*G0_1_0_1_2_2 + 0.00624999999999999*G0_1_0_2_0_0 + 0.00424107142857143*G0_1_0_2_0_1 + 0.0370535714285714*G0_1_0_2_0_2 + 0.00424107142857143*G0_1_0_2_1_0 + 0.00669642857142858*G0_1_0_2_1_1 + 0.0406250000000001*G0_1_0_2_1_2 + 0.0370535714285714*G0_1_0_2_2_0 + 0.0406250000000001*G0_1_0_2_2_1 + 0.4125*G0_1_0_2_2_2 - 0.0361607142857143*G0_1_1_0_0_0 - 0.01875*G0_1_1_0_0_1 + 0.00133928571428572*G0_1_1_0_0_2 - 0.01875*G0_1_1_0_1_0 - 0.0200892857142857*G0_1_1_0_1_1 + 0.00133928571428572*G0_1_1_0_2_0 + 0.0107142857142857*G0_1_1_0_2_2 - 0.01875*G0_1_1_1_0_0 - 0.0200892857142857*G0_1_1_1_0_1 - 0.0200892857142857*G0_1_1_1_1_0 - 0.0482142857142857*G0_1_1_1_1_1 - 0.00401785714285712*G0_1_1_1_1_2 - 0.00401785714285712*G0_1_1_1_2_1 + 0.01875*G0_1_1_1_2_2 + 0.00133928571428572*G0_1_1_2_0_0 + 0.0107142857142857*G0_1_1_2_0_2 - 0.00401785714285712*G0_1_1_2_1_1 + 0.01875*G0_1_1_2_1_2 + 0.0107142857142857*G0_1_1_2_2_0 + 0.01875*G0_1_1_2_2_1 + 0.120535714285715*G0_1_1_2_2_2; + A[26] = -A[24] - 0.0575892857142857*G0_1_1_0_0_0 - 0.0191964285714285*G0_1_1_0_0_1 - 0.0116071428571428*G0_1_1_0_0_2 - 0.0191964285714285*G0_1_1_0_1_0 - 0.0191964285714286*G0_1_1_0_1_1 - 0.00580357142857143*G0_1_1_0_1_2 - 0.0116071428571428*G0_1_1_0_2_0 - 0.00580357142857143*G0_1_1_0_2_1 - 0.0160714285714286*G0_1_1_0_2_2 - 0.0191964285714285*G0_1_1_1_0_0 - 0.0191964285714286*G0_1_1_1_0_1 - 0.00580357142857142*G0_1_1_1_0_2 - 0.0191964285714286*G0_1_1_1_1_0 - 0.0575892857142856*G0_1_1_1_1_1 - 0.0116071428571428*G0_1_1_1_1_2 - 0.00580357142857143*G0_1_1_1_2_0 - 0.0116071428571428*G0_1_1_1_2_1 - 0.0160714285714286*G0_1_1_1_2_2 - 0.0116071428571428*G0_1_1_2_0_0 - 0.00580357142857143*G0_1_1_2_0_1 - 0.0160714285714286*G0_1_1_2_0_2 - 0.00580357142857143*G0_1_1_2_1_0 - 0.0116071428571428*G0_1_1_2_1_1 - 0.0160714285714286*G0_1_1_2_1_2 - 0.0160714285714286*G0_1_1_2_2_0 - 0.0160714285714286*G0_1_1_2_2_1 - 0.20625*G0_1_1_2_2_2; + A[59] = A[93] - 0.216964285714286*G0_0_0_0_0_0 - 0.0241071428571428*G0_0_0_0_0_1 - 0.0964285714285713*G0_0_0_0_0_2 - 0.0241071428571428*G0_0_0_0_1_0 + 0.0241071428571428*G0_0_0_0_1_1 - 0.0964285714285713*G0_0_0_0_2_0 - 0.0482142857142857*G0_0_0_0_2_2 - 0.0241071428571428*G0_0_0_1_0_0 + 0.0241071428571428*G0_0_0_1_0_1 + 0.0241071428571429*G0_0_0_1_1_0 + 0.216964285714285*G0_0_0_1_1_1 + 0.0964285714285713*G0_0_0_1_1_2 + 0.0964285714285713*G0_0_0_1_2_1 + 0.0482142857142856*G0_0_0_1_2_2 - 0.0964285714285713*G0_0_0_2_0_0 - 0.0482142857142857*G0_0_0_2_0_2 + 0.0964285714285713*G0_0_0_2_1_1 + 0.0482142857142856*G0_0_0_2_1_2 - 0.0482142857142856*G0_0_0_2_2_0 + 0.0482142857142856*G0_0_0_2_2_1 - 0.0843750000000002*G0_0_1_0_0_0 - 0.0241071428571429*G0_0_1_0_0_1 - 0.0120535714285714*G0_0_1_0_0_2 - 0.0241071428571429*G0_0_1_0_1_0 + 0.0120535714285714*G0_0_1_0_1_1 - 0.0120535714285714*G0_0_1_0_2_0 - 0.0241071428571429*G0_0_1_1_0_0 + 0.0120535714285714*G0_0_1_1_0_1 + 0.0120535714285714*G0_0_1_1_1_0 + 0.241071428571428*G0_0_1_1_1_1 + 0.0361607142857142*G0_0_1_1_1_2 + 0.0361607142857142*G0_0_1_1_2_1 - 0.0241071428571429*G0_0_1_1_2_2 - 0.0120535714285714*G0_0_1_2_0_0 + 0.0361607142857142*G0_0_1_2_1_1 - 0.0241071428571429*G0_0_1_2_1_2 - 0.0241071428571429*G0_0_1_2_2_1 - 0.120535714285714*G0_0_1_2_2_2 + 0.024107142857143*G0_1_0_0_0_0 - 0.0120535714285714*G0_1_0_0_0_1 - 0.060267857142857*G0_1_0_0_0_2 - 0.0120535714285714*G0_1_0_0_1_0 - 0.060267857142857*G0_1_0_0_2_0 - 0.0723214285714285*G0_1_0_0_2_2 - 0.0120535714285714*G0_1_0_1_0_0 + 0.132589285714286*G0_1_0_1_1_1 + 0.0843749999999999*G0_1_0_1_1_2 + 0.0843749999999999*G0_1_0_1_2_1 + 0.0482142857142856*G0_1_0_1_2_2 - 0.060267857142857*G0_1_0_2_0_0 - 0.0723214285714285*G0_1_0_2_0_2 + 0.0843749999999999*G0_1_0_2_1_1 + 0.0482142857142856*G0_1_0_2_1_2 - 0.0723214285714285*G0_1_0_2_2_0 + 0.0482142857142856*G0_1_0_2_2_1 - 0.120535714285714*G0_1_0_2_2_2 + 0.204910714285715*G0_1_1_0_0_0 + 0.0241071428571428*G0_1_1_0_0_1 + 0.0120535714285714*G0_1_1_0_0_2 + 0.0241071428571428*G0_1_1_0_1_0 - 0.0361607142857143*G0_1_1_0_1_1 + 0.0120535714285714*G0_1_1_0_2_0 + 0.0241071428571428*G0_1_1_1_0_0 - 0.0361607142857143*G0_1_1_1_0_1 - 0.0361607142857143*G0_1_1_1_1_0 - 0.0482142857142861*G0_1_1_1_1_1 + 0.0120535714285714*G0_1_1_1_1_2 + 0.0120535714285714*G0_1_1_1_2_1 - 0.0241071428571429*G0_1_1_1_2_2 + 0.0120535714285714*G0_1_1_2_0_0 + 0.0120535714285714*G0_1_1_2_1_1 - 0.0241071428571429*G0_1_1_2_1_2 - 0.0241071428571429*G0_1_1_2_2_1 - 0.120535714285714*G0_1_1_2_2_2; + A[47] = -A[67] - 0.1265625*G0_1_0_0_0_0 + 0.0100446428571429*G0_1_0_0_0_1 + 0.0100446428571429*G0_1_0_0_1_0 + 0.0261160714285714*G0_1_0_0_1_1 - 0.0060267857142857*G0_1_0_0_1_2 - 0.0060267857142857*G0_1_0_0_2_1 - 0.00401785714285713*G0_1_0_0_2_2 + 0.0100446428571429*G0_1_0_1_0_0 + 0.0261160714285714*G0_1_0_1_0_1 - 0.0060267857142857*G0_1_0_1_0_2 + 0.0261160714285714*G0_1_0_1_1_0 + 0.0180803571428572*G0_1_0_1_1_1 + 0.0120535714285714*G0_1_0_1_1_2 - 0.0060267857142857*G0_1_0_1_2_0 + 0.0120535714285714*G0_1_0_1_2_1 + 0.00401785714285714*G0_1_0_1_2_2 - 0.0060267857142857*G0_1_0_2_0_1 - 0.00401785714285712*G0_1_0_2_0_2 - 0.0060267857142857*G0_1_0_2_1_0 + 0.0120535714285714*G0_1_0_2_1_1 + 0.00401785714285714*G0_1_0_2_1_2 - 0.00401785714285712*G0_1_0_2_2_0 + 0.00401785714285714*G0_1_0_2_2_1 + 0.114508928571429*G0_1_1_0_0_0 + 0.0522321428571429*G0_1_1_0_0_1 - 0.0180803571428571*G0_1_1_0_0_2 + 0.0522321428571429*G0_1_1_0_1_0 + 0.0421875*G0_1_1_0_1_1 - 0.0060267857142857*G0_1_1_0_1_2 - 0.0180803571428571*G0_1_1_0_2_0 - 0.0060267857142857*G0_1_1_0_2_1 - 0.0200892857142857*G0_1_1_0_2_2 + 0.0522321428571429*G0_1_1_1_0_0 + 0.0421875*G0_1_1_1_0_1 - 0.0060267857142857*G0_1_1_1_0_2 + 0.0421875*G0_1_1_1_1_0 + 0.024107142857143*G0_1_1_1_1_1 + 0.0180803571428571*G0_1_1_1_1_2 - 0.0060267857142857*G0_1_1_1_2_0 + 0.0180803571428571*G0_1_1_1_2_1 + 0.00803571428571427*G0_1_1_1_2_2 - 0.0180803571428571*G0_1_1_2_0_0 - 0.0060267857142857*G0_1_1_2_0_1 - 0.0200892857142857*G0_1_1_2_0_2 - 0.0060267857142857*G0_1_1_2_1_0 + 0.0180803571428571*G0_1_1_2_1_1 + 0.00803571428571427*G0_1_1_2_1_2 - 0.0200892857142857*G0_1_1_2_2_0 + 0.00803571428571427*G0_1_1_2_2_1 - 0.0120535714285715*G0_1_1_2_2_2; + A[91] = 0.0361607142857143*G0_0_0_0_0_0 - 0.00133928571428571*G0_0_0_0_0_1 + 0.01875*G0_0_0_0_0_2 - 0.00133928571428571*G0_0_0_0_1_0 - 0.0107142857142857*G0_0_0_0_1_1 + 0.01875*G0_0_0_0_2_0 + 0.0200892857142857*G0_0_0_0_2_2 - 0.00133928571428571*G0_0_0_1_0_0 - 0.0107142857142857*G0_0_0_1_0_1 - 0.0107142857142857*G0_0_0_1_1_0 - 0.120535714285714*G0_0_0_1_1_1 - 0.01875*G0_0_0_1_1_2 - 0.01875*G0_0_0_1_2_1 + 0.00401785714285713*G0_0_0_1_2_2 + 0.01875*G0_0_0_2_0_0 + 0.0200892857142857*G0_0_0_2_0_2 - 0.01875*G0_0_0_2_1_1 + 0.00401785714285713*G0_0_0_2_1_2 + 0.0200892857142857*G0_0_0_2_2_0 + 0.00401785714285713*G0_0_0_2_2_1 + 0.0482142857142856*G0_0_0_2_2_2 - 0.0120535714285714*G0_1_0_0_0_0 - 0.00535714285714286*G0_1_0_0_0_1 - 0.00133928571428571*G0_1_0_0_0_2 - 0.00535714285714286*G0_1_0_0_1_0 + 0.00803571428571429*G0_1_0_0_1_1 - 0.00133928571428571*G0_1_0_0_2_0 + 0.0013392857142857*G0_1_0_0_2_2 - 0.00535714285714286*G0_1_0_1_0_0 + 0.00803571428571429*G0_1_0_1_0_1 + 0.00803571428571429*G0_1_0_1_1_0 - 0.00803571428571426*G0_1_0_1_1_2 - 0.00803571428571427*G0_1_0_1_2_1 + 0.00535714285714285*G0_1_0_1_2_2 - 0.00133928571428571*G0_1_0_2_0_0 + 0.0013392857142857*G0_1_0_2_0_2 - 0.00803571428571427*G0_1_0_2_1_1 + 0.00535714285714285*G0_1_0_2_1_2 + 0.0013392857142857*G0_1_0_2_2_0 + 0.00535714285714285*G0_1_0_2_2_1 + 0.0120535714285713*G0_1_0_2_2_2; + A[90] = -A[91] - 0.084375*G0_0_0_0_0_0 - 0.0120535714285714*G0_0_0_0_0_1 - 0.0120535714285714*G0_0_0_0_1_0 - 0.0120535714285714*G0_0_0_0_1_1 + 0.0241071428571428*G0_0_0_0_2_2 - 0.0120535714285714*G0_0_0_1_0_0 - 0.0120535714285714*G0_0_0_1_0_1 - 0.0120535714285714*G0_0_0_1_1_0 - 0.0843749999999998*G0_0_0_1_1_1 + 0.0241071428571428*G0_0_0_1_2_2 + 0.0241071428571428*G0_0_0_2_0_2 + 0.0241071428571428*G0_0_0_2_1_2 + 0.0241071428571428*G0_0_0_2_2_0 + 0.0241071428571428*G0_0_0_2_2_1 + 0.0964285714285712*G0_0_0_2_2_2 - 0.120535714285714*G0_0_1_0_0_0 - 0.0107142857142857*G0_0_1_0_0_1 - 0.01875*G0_0_1_0_0_2 - 0.0107142857142857*G0_0_1_0_1_0 - 0.00133928571428572*G0_0_1_0_1_1 - 0.01875*G0_0_1_0_2_0 + 0.00401785714285714*G0_0_1_0_2_2 - 0.0107142857142857*G0_0_1_1_0_0 - 0.00133928571428572*G0_0_1_1_0_1 - 0.00133928571428572*G0_0_1_1_1_0 + 0.0361607142857141*G0_0_1_1_1_1 + 0.0187499999999999*G0_0_1_1_1_2 + 0.0187499999999999*G0_0_1_1_2_1 + 0.0200892857142857*G0_0_1_1_2_2 - 0.01875*G0_0_1_2_0_0 + 0.00401785714285713*G0_0_1_2_0_2 + 0.0187499999999999*G0_0_1_2_1_1 + 0.0200892857142857*G0_0_1_2_1_2 + 0.00401785714285714*G0_0_1_2_2_0 + 0.0200892857142857*G0_0_1_2_2_1 + 0.0482142857142856*G0_0_1_2_2_2 - 0.132589285714286*G0_1_0_0_0_0 - 0.0241071428571429*G0_1_0_0_0_1 - 0.0120535714285714*G0_1_0_0_0_2 - 0.0241071428571429*G0_1_0_0_1_0 + 0.0120535714285714*G0_1_0_0_1_1 - 0.0120535714285714*G0_1_0_0_2_0 - 0.0241071428571429*G0_1_0_1_0_0 + 0.0120535714285714*G0_1_0_1_0_1 + 0.0120535714285714*G0_1_0_1_1_0 + 0.0482142857142858*G0_1_0_1_1_1 + 0.0120535714285714*G0_1_0_1_1_2 + 0.0120535714285714*G0_1_0_1_2_1 + 0.0241071428571428*G0_1_0_1_2_2 - 0.0120535714285714*G0_1_0_2_0_0 + 0.0120535714285714*G0_1_0_2_1_1 + 0.0241071428571428*G0_1_0_2_1_2 + 0.0241071428571428*G0_1_0_2_2_1 + 0.0482142857142856*G0_1_0_2_2_2 - 0.120535714285715*G0_1_1_0_0_0 - 0.01875*G0_1_1_0_0_1 - 0.0107142857142857*G0_1_1_0_0_2 - 0.01875*G0_1_1_0_1_0 + 0.00401785714285711*G0_1_1_0_1_1 - 0.0107142857142857*G0_1_1_0_2_0 - 0.00133928571428571*G0_1_1_0_2_2 - 0.01875*G0_1_1_1_0_0 + 0.00401785714285711*G0_1_1_1_0_1 + 0.00401785714285711*G0_1_1_1_1_0 + 0.0482142857142855*G0_1_1_1_1_1 + 0.0200892857142857*G0_1_1_1_1_2 + 0.0200892857142857*G0_1_1_1_2_1 + 0.01875*G0_1_1_1_2_2 - 0.0107142857142857*G0_1_1_2_0_0 - 0.00133928571428571*G0_1_1_2_0_2 + 0.0200892857142857*G0_1_1_2_1_1 + 0.01875*G0_1_1_2_1_2 - 0.00133928571428571*G0_1_1_2_2_0 + 0.01875*G0_1_1_2_2_1 + 0.0361607142857143*G0_1_1_2_2_2; + A[19] = A[91] - 0.0120535714285714*G0_0_1_0_0_0 - 0.00535714285714286*G0_0_1_0_0_1 - 0.00133928571428572*G0_0_1_0_0_2 - 0.00535714285714286*G0_0_1_0_1_0 + 0.00803571428571429*G0_0_1_0_1_1 - 0.00133928571428572*G0_0_1_0_2_0 + 0.0013392857142857*G0_0_1_0_2_2 - 0.00535714285714286*G0_0_1_1_0_0 + 0.00803571428571429*G0_0_1_1_0_1 + 0.00803571428571429*G0_0_1_1_1_0 - 0.00803571428571425*G0_0_1_1_1_2 - 0.00803571428571426*G0_0_1_1_2_1 + 0.00535714285714285*G0_0_1_1_2_2 - 0.00133928571428572*G0_0_1_2_0_0 + 0.0013392857142857*G0_0_1_2_0_2 - 0.00803571428571425*G0_0_1_2_1_1 + 0.00535714285714285*G0_0_1_2_1_2 + 0.0013392857142857*G0_0_1_2_2_0 + 0.00535714285714285*G0_0_1_2_2_1 + 0.0120535714285713*G0_0_1_2_2_2 + 0.0120535714285714*G0_1_0_0_0_0 + 0.00535714285714286*G0_1_0_0_0_1 + 0.00133928571428572*G0_1_0_0_0_2 + 0.00535714285714286*G0_1_0_0_1_0 - 0.00803571428571429*G0_1_0_0_1_1 + 0.00133928571428572*G0_1_0_0_2_0 - 0.0013392857142857*G0_1_0_0_2_2 + 0.00535714285714286*G0_1_0_1_0_0 - 0.00803571428571429*G0_1_0_1_0_1 - 0.00803571428571429*G0_1_0_1_1_0 + 0.00803571428571425*G0_1_0_1_1_2 + 0.00803571428571426*G0_1_0_1_2_1 - 0.00535714285714285*G0_1_0_1_2_2 + 0.00133928571428572*G0_1_0_2_0_0 - 0.0013392857142857*G0_1_0_2_0_2 + 0.00803571428571426*G0_1_0_2_1_1 - 0.00535714285714285*G0_1_0_2_1_2 - 0.0013392857142857*G0_1_0_2_2_0 - 0.00535714285714285*G0_1_0_2_2_1 - 0.0120535714285713*G0_1_0_2_2_2; + A[9] = A[90] - 0.00803571428571431*G0_0_1_0_0_1 + 0.00803571428571427*G0_0_1_0_0_2 - 0.00803571428571431*G0_0_1_0_1_0 + 0.00535714285714284*G0_0_1_0_1_1 + 0.00803571428571427*G0_0_1_0_2_0 - 0.00535714285714285*G0_0_1_0_2_2 - 0.00803571428571431*G0_0_1_1_0_0 + 0.00535714285714284*G0_0_1_1_0_1 + 0.00535714285714284*G0_0_1_1_1_0 + 0.0120535714285714*G0_0_1_1_1_1 + 0.00133928571428572*G0_0_1_1_1_2 + 0.00133928571428573*G0_0_1_1_2_1 - 0.0013392857142857*G0_0_1_1_2_2 + 0.00803571428571428*G0_0_1_2_0_0 - 0.00535714285714284*G0_0_1_2_0_2 + 0.00133928571428573*G0_0_1_2_1_1 - 0.0013392857142857*G0_0_1_2_1_2 - 0.00535714285714285*G0_0_1_2_2_0 - 0.0013392857142857*G0_0_1_2_2_1 - 0.0120535714285713*G0_0_1_2_2_2 + 0.00803571428571431*G0_1_0_0_0_1 - 0.00803571428571427*G0_1_0_0_0_2 + 0.00803571428571431*G0_1_0_0_1_0 - 0.00535714285714284*G0_1_0_0_1_1 - 0.00803571428571427*G0_1_0_0_2_0 + 0.00535714285714285*G0_1_0_0_2_2 + 0.00803571428571431*G0_1_0_1_0_0 - 0.00535714285714284*G0_1_0_1_0_1 - 0.00535714285714284*G0_1_0_1_1_0 - 0.0120535714285714*G0_1_0_1_1_1 - 0.00133928571428572*G0_1_0_1_1_2 - 0.00133928571428573*G0_1_0_1_2_1 + 0.0013392857142857*G0_1_0_1_2_2 - 0.00803571428571427*G0_1_0_2_0_0 + 0.00535714285714284*G0_1_0_2_0_2 - 0.00133928571428573*G0_1_0_2_1_1 + 0.0013392857142857*G0_1_0_2_1_2 + 0.00535714285714285*G0_1_0_2_2_0 + 0.00133928571428569*G0_1_0_2_2_1 + 0.0120535714285713*G0_1_0_2_2_2; + A[66] = -A[64] - 0.0180803571428573*G0_0_1_0_0_0 - 0.00602678571428575*G0_0_1_0_0_1 - 0.0160714285714285*G0_0_1_0_0_2 - 0.00602678571428575*G0_0_1_0_1_0 - 0.00602678571428575*G0_0_1_0_1_1 - 0.00803571428571427*G0_0_1_0_1_2 - 0.0160714285714285*G0_0_1_0_2_0 - 0.00803571428571427*G0_0_1_0_2_1 - 0.0120535714285713*G0_0_1_0_2_2 - 0.00602678571428575*G0_0_1_1_0_0 - 0.00602678571428575*G0_0_1_1_0_1 - 0.00803571428571427*G0_0_1_1_0_2 - 0.00602678571428575*G0_0_1_1_1_0 - 0.0180803571428573*G0_0_1_1_1_1 - 0.0160714285714286*G0_0_1_1_1_2 - 0.00803571428571427*G0_0_1_1_2_0 - 0.0160714285714286*G0_0_1_1_2_1 - 0.0120535714285713*G0_0_1_1_2_2 - 0.0160714285714285*G0_0_1_2_0_0 - 0.00803571428571427*G0_0_1_2_0_1 - 0.0120535714285713*G0_0_1_2_0_2 - 0.00803571428571427*G0_0_1_2_1_0 - 0.0160714285714286*G0_0_1_2_1_1 - 0.0120535714285713*G0_0_1_2_1_2 - 0.0120535714285713*G0_0_1_2_2_0 - 0.0120535714285713*G0_0_1_2_2_1 + 0.289285714285715*G0_0_1_2_2_2 + 0.247098214285714*G0_1_1_0_0_0 + 0.0602678571428571*G0_1_1_0_0_1 + 0.074330357142857*G0_1_1_0_0_2 + 0.0602678571428571*G0_1_1_0_1_0 + 0.0381696428571428*G0_1_1_0_1_1 + 0.0220982142857143*G0_1_1_0_1_2 + 0.074330357142857*G0_1_1_0_2_0 + 0.0220982142857143*G0_1_1_0_2_1 + 0.0763392857142857*G0_1_1_0_2_2 + 0.0602678571428571*G0_1_1_1_0_0 + 0.0381696428571428*G0_1_1_1_0_1 + 0.0220982142857143*G0_1_1_1_0_2 + 0.0381696428571428*G0_1_1_1_1_0 + 0.0482142857142856*G0_1_1_1_1_1 + 0.0140625*G0_1_1_1_1_2 + 0.0220982142857143*G0_1_1_1_2_0 + 0.0140625*G0_1_1_1_2_1 + 0.0321428571428572*G0_1_1_1_2_2 + 0.074330357142857*G0_1_1_2_0_0 + 0.0220982142857143*G0_1_1_2_0_1 + 0.0763392857142857*G0_1_1_2_0_2 + 0.0220982142857143*G0_1_1_2_1_0 + 0.0140625*G0_1_1_2_1_1 + 0.0321428571428572*G0_1_1_2_1_2 + 0.0763392857142857*G0_1_1_2_2_0 + 0.0321428571428572*G0_1_1_2_2_1 + 0.373660714285715*G0_1_1_2_2_2; + A[55] = A[66] + 0.229017857142857*G0_0_0_0_0_0 + 0.0361607142857143*G0_0_0_0_0_1 + 0.0964285714285713*G0_0_0_0_0_2 + 0.0361607142857143*G0_0_0_0_1_0 + 0.0120535714285714*G0_0_0_0_1_1 + 0.0120535714285714*G0_0_0_0_1_2 + 0.0964285714285713*G0_0_0_0_2_0 + 0.0120535714285714*G0_0_0_0_2_1 + 0.0361607142857143*G0_0_0_1_0_0 + 0.0120535714285714*G0_0_0_1_0_1 + 0.0120535714285714*G0_0_0_1_0_2 + 0.0120535714285714*G0_0_0_1_1_0 + 0.0120535714285714*G0_0_0_1_1_1 + 0.0120535714285714*G0_0_0_1_2_0 - 0.0482142857142859*G0_0_0_1_2_2 + 0.0964285714285713*G0_0_0_2_0_0 + 0.0120535714285714*G0_0_0_2_0_1 + 0.0120535714285714*G0_0_0_2_1_0 - 0.0482142857142859*G0_0_0_2_1_2 - 0.0482142857142859*G0_0_0_2_2_1 - 0.602678571428572*G0_0_0_2_2_2 - 0.0241071428571428*G0_0_1_0_0_0 + 0.00602678571428571*G0_0_1_0_0_1 + 0.0542410714285713*G0_0_1_0_0_2 + 0.00602678571428571*G0_0_1_0_1_0 + 0.00602678571428571*G0_0_1_0_1_1 + 0.0120535714285714*G0_0_1_0_1_2 + 0.0542410714285713*G0_0_1_0_2_0 + 0.0120535714285714*G0_0_1_0_2_1 + 0.0421874999999998*G0_0_1_0_2_2 + 0.00602678571428571*G0_0_1_1_0_0 + 0.00602678571428571*G0_0_1_1_0_1 + 0.0120535714285714*G0_0_1_1_0_2 + 0.00602678571428571*G0_0_1_1_1_0 + 0.0120535714285714*G0_0_1_1_1_1 + 0.00602678571428568*G0_0_1_1_1_2 + 0.0120535714285714*G0_0_1_1_2_0 + 0.00602678571428568*G0_0_1_1_2_1 - 0.0180803571428573*G0_0_1_1_2_2 + 0.0542410714285713*G0_0_1_2_0_0 + 0.0120535714285714*G0_0_1_2_0_1 + 0.0421874999999998*G0_0_1_2_0_2 + 0.0120535714285714*G0_0_1_2_1_0 + 0.00602678571428567*G0_0_1_2_1_1 - 0.0180803571428573*G0_0_1_2_1_2 + 0.0421874999999998*G0_0_1_2_2_0 - 0.0180803571428573*G0_0_1_2_2_1 - 0.349553571428573*G0_0_1_2_2_2 - 0.0241071428571428*G0_1_0_0_0_0 + 0.00602678571428571*G0_1_0_0_0_1 + 0.0542410714285713*G0_1_0_0_0_2 + 0.00602678571428571*G0_1_0_0_1_0 + 0.00602678571428571*G0_1_0_0_1_1 + 0.0120535714285714*G0_1_0_0_1_2 + 0.0542410714285713*G0_1_0_0_2_0 + 0.0120535714285714*G0_1_0_0_2_1 + 0.0421874999999998*G0_1_0_0_2_2 + 0.00602678571428571*G0_1_0_1_0_0 + 0.00602678571428571*G0_1_0_1_0_1 + 0.0120535714285714*G0_1_0_1_0_2 + 0.00602678571428571*G0_1_0_1_1_0 + 0.0120535714285714*G0_1_0_1_1_1 + 0.00602678571428567*G0_1_0_1_1_2 + 0.0120535714285714*G0_1_0_1_2_0 + 0.00602678571428567*G0_1_0_1_2_1 - 0.0180803571428573*G0_1_0_1_2_2 + 0.0542410714285713*G0_1_0_2_0_0 + 0.0120535714285714*G0_1_0_2_0_1 + 0.0421874999999998*G0_1_0_2_0_2 + 0.0120535714285714*G0_1_0_2_1_0 + 0.00602678571428567*G0_1_0_2_1_1 - 0.0180803571428573*G0_1_0_2_1_2 + 0.0421874999999998*G0_1_0_2_2_0 - 0.0180803571428573*G0_1_0_2_2_1 - 0.349553571428573*G0_1_0_2_2_2 + 0.325446428571428*G0_1_1_0_0_0 + 0.0241071428571428*G0_1_1_0_0_1 + 0.0120535714285713*G0_1_1_0_0_2 + 0.0241071428571428*G0_1_1_0_1_0 + 0.0120535714285713*G0_1_1_0_2_0 - 0.0120535714285716*G0_1_1_0_2_2 + 0.0241071428571428*G0_1_1_1_0_0 - 0.024107142857143*G0_1_1_1_2_2 + 0.0120535714285713*G0_1_1_2_0_0 - 0.0120535714285716*G0_1_1_2_0_2 - 0.024107142857143*G0_1_1_2_1_2 - 0.0120535714285715*G0_1_1_2_2_0 - 0.024107142857143*G0_1_1_2_2_1 - 0.325446428571429*G0_1_1_2_2_2; + A[56] = A[65] - 0.108482142857143*G0_0_1_0_0_0 - 0.0180803571428571*G0_0_1_0_0_1 - 0.0904017857142856*G0_0_1_0_0_2 - 0.0180803571428571*G0_0_1_0_1_0 - 0.00602678571428571*G0_0_1_0_1_1 - 0.0180803571428571*G0_0_1_0_1_2 - 0.0904017857142856*G0_0_1_0_2_0 - 0.0180803571428571*G0_0_1_0_2_1 - 0.0904017857142855*G0_0_1_0_2_2 - 0.0180803571428571*G0_0_1_1_0_0 - 0.00602678571428571*G0_0_1_1_0_1 - 0.0180803571428571*G0_0_1_1_0_2 - 0.00602678571428571*G0_0_1_1_1_0 - 0.00602678571428568*G0_0_1_1_1_2 - 0.0180803571428571*G0_0_1_1_2_0 - 0.00602678571428568*G0_0_1_1_2_1 - 0.0180803571428571*G0_0_1_1_2_2 - 0.0904017857142856*G0_0_1_2_0_0 - 0.0180803571428571*G0_0_1_2_0_1 - 0.0904017857142856*G0_0_1_2_0_2 - 0.0180803571428571*G0_0_1_2_1_0 - 0.00602678571428569*G0_0_1_2_1_1 - 0.0180803571428571*G0_0_1_2_1_2 - 0.0904017857142856*G0_0_1_2_2_0 - 0.0180803571428571*G0_0_1_2_2_1 - 0.108482142857142*G0_0_1_2_2_2 + 0.108482142857143*G0_1_0_0_0_0 + 0.0180803571428571*G0_1_0_0_0_1 + 0.0904017857142856*G0_1_0_0_0_2 + 0.0180803571428571*G0_1_0_0_1_0 + 0.00602678571428571*G0_1_0_0_1_1 + 0.0180803571428571*G0_1_0_0_1_2 + 0.0904017857142856*G0_1_0_0_2_0 + 0.0180803571428571*G0_1_0_0_2_1 + 0.0904017857142856*G0_1_0_0_2_2 + 0.0180803571428571*G0_1_0_1_0_0 + 0.00602678571428571*G0_1_0_1_0_1 + 0.0180803571428571*G0_1_0_1_0_2 + 0.00602678571428571*G0_1_0_1_1_0 + 0.00602678571428568*G0_1_0_1_1_2 + 0.0180803571428571*G0_1_0_1_2_0 + 0.00602678571428568*G0_1_0_1_2_1 + 0.0180803571428571*G0_1_0_1_2_2 + 0.0904017857142856*G0_1_0_2_0_0 + 0.0180803571428571*G0_1_0_2_0_1 + 0.0904017857142856*G0_1_0_2_0_2 + 0.0180803571428571*G0_1_0_2_1_0 + 0.00602678571428569*G0_1_0_2_1_1 + 0.0180803571428571*G0_1_0_2_1_2 + 0.0904017857142856*G0_1_0_2_2_0 + 0.0180803571428571*G0_1_0_2_2_1 + 0.108482142857142*G0_1_0_2_2_2; + A[3] = A[30] + 0.00178571428571426*G0_0_1_0_0_1 - 0.0017857142857143*G0_0_1_0_0_2 + 0.00178571428571426*G0_0_1_0_1_0 + 0.000892857142857125*G0_0_1_0_1_1 - 0.000669642857142857*G0_0_1_0_1_2 - 0.0017857142857143*G0_0_1_0_2_0 - 0.000669642857142859*G0_0_1_0_2_1 + 0.000446428571428568*G0_0_1_0_2_2 + 0.00178571428571426*G0_0_1_1_0_0 + 0.000892857142857125*G0_0_1_1_0_1 - 0.000669642857142857*G0_0_1_1_0_2 + 0.000892857142857126*G0_0_1_1_1_0 - 0.0261160714285715*G0_0_1_1_1_1 + 0.00245535714285713*G0_0_1_1_1_2 - 0.000669642857142858*G0_0_1_1_2_0 + 0.00245535714285712*G0_0_1_1_2_1 + 0.00558035714285712*G0_0_1_1_2_2 - 0.0017857142857143*G0_0_1_2_0_0 - 0.000669642857142859*G0_0_1_2_0_1 + 0.000446428571428568*G0_0_1_2_0_2 - 0.000669642857142858*G0_0_1_2_1_0 + 0.00245535714285713*G0_0_1_2_1_1 + 0.00558035714285712*G0_0_1_2_1_2 + 0.000446428571428568*G0_0_1_2_2_0 + 0.00558035714285712*G0_0_1_2_2_1 + 0.00200892857142848*G0_0_1_2_2_2 - 0.00178571428571426*G0_1_0_0_0_1 + 0.0017857142857143*G0_1_0_0_0_2 - 0.00178571428571426*G0_1_0_0_1_0 - 0.000892857142857126*G0_1_0_0_1_1 + 0.000669642857142857*G0_1_0_0_1_2 + 0.0017857142857143*G0_1_0_0_2_0 + 0.000669642857142858*G0_1_0_0_2_1 - 0.000446428571428567*G0_1_0_0_2_2 - 0.00178571428571426*G0_1_0_1_0_0 - 0.000892857142857125*G0_1_0_1_0_1 + 0.000669642857142858*G0_1_0_1_0_2 - 0.000892857142857126*G0_1_0_1_1_0 + 0.0261160714285715*G0_1_0_1_1_1 - 0.00245535714285713*G0_1_0_1_1_2 + 0.000669642857142858*G0_1_0_1_2_0 - 0.00245535714285713*G0_1_0_1_2_1 - 0.00558035714285712*G0_1_0_1_2_2 + 0.0017857142857143*G0_1_0_2_0_0 + 0.000669642857142858*G0_1_0_2_0_1 - 0.000446428571428567*G0_1_0_2_0_2 + 0.000669642857142858*G0_1_0_2_1_0 - 0.00245535714285712*G0_1_0_2_1_1 - 0.00558035714285712*G0_1_0_2_1_2 - 0.000446428571428567*G0_1_0_2_2_0 - 0.00558035714285712*G0_1_0_2_2_1 - 0.00200892857142847*G0_1_0_2_2_2; + A[8] = -A[3] + 0.141964285714286*G0_0_0_0_0_0 + 0.0075892857142857*G0_0_0_0_0_1 + 0.0191964285714285*G0_0_0_0_0_2 + 0.0075892857142857*G0_0_0_0_1_0 + 0.00803571428571428*G0_0_0_0_1_1 + 0.00379464285714285*G0_0_0_0_1_2 + 0.0191964285714285*G0_0_0_0_2_0 + 0.00379464285714285*G0_0_0_0_2_1 + 0.003125*G0_0_0_0_2_2 + 0.0075892857142857*G0_0_0_1_0_0 + 0.00803571428571428*G0_0_0_1_0_1 + 0.00379464285714285*G0_0_0_1_0_2 + 0.00803571428571428*G0_0_0_1_1_0 + 0.0375*G0_0_0_1_1_1 + 0.00379464285714285*G0_0_0_1_2_0 - 0.00446428571428569*G0_0_0_1_2_2 + 0.0191964285714285*G0_0_0_2_0_0 + 0.00379464285714285*G0_0_0_2_0_1 + 0.003125*G0_0_0_2_0_2 + 0.00379464285714285*G0_0_0_2_1_0 - 0.00446428571428569*G0_0_0_2_1_2 + 0.003125*G0_0_0_2_2_0 - 0.00446428571428569*G0_0_0_2_2_1 - 0.0026785714285713*G0_0_0_2_2_2 + 0.141964285714286*G0_1_0_0_0_0 + 0.00758928571428569*G0_1_0_0_0_1 + 0.0191964285714285*G0_1_0_0_0_2 + 0.00758928571428569*G0_1_0_0_1_0 + 0.00803571428571427*G0_1_0_0_1_1 + 0.00379464285714285*G0_1_0_0_1_2 + 0.0191964285714285*G0_1_0_0_2_0 + 0.00379464285714285*G0_1_0_0_2_1 + 0.003125*G0_1_0_0_2_2 + 0.00758928571428569*G0_1_0_1_0_0 + 0.00803571428571427*G0_1_0_1_0_1 + 0.00379464285714285*G0_1_0_1_0_2 + 0.00803571428571427*G0_1_0_1_1_0 + 0.0375*G0_1_0_1_1_1 + 0.00379464285714285*G0_1_0_1_2_0 - 0.00446428571428569*G0_1_0_1_2_2 + 0.0191964285714285*G0_1_0_2_0_0 + 0.00379464285714285*G0_1_0_2_0_1 + 0.003125*G0_1_0_2_0_2 + 0.00379464285714285*G0_1_0_2_1_0 - 0.00446428571428569*G0_1_0_2_1_2 + 0.003125*G0_1_0_2_2_0 - 0.00446428571428569*G0_1_0_2_2_1 - 0.00267857142857131*G0_1_0_2_2_2; + A[12] = 0.000446428571428567*G0_0_1_0_0_0 + 0.000595238095238094*G0_0_1_0_0_1 + 0.000595238095238094*G0_0_1_0_0_2 + 0.000595238095238094*G0_0_1_0_1_0 + 0.00372023809523809*G0_0_1_0_1_1 + 0.000520833333333332*G0_0_1_0_1_2 + 0.000595238095238095*G0_0_1_0_2_0 + 0.000520833333333332*G0_0_1_0_2_1 + 0.0037202380952381*G0_0_1_0_2_2 + 0.000595238095238095*G0_0_1_1_0_0 + 0.00372023809523809*G0_0_1_1_0_1 + 0.000520833333333332*G0_0_1_1_0_2 + 0.00372023809523809*G0_0_1_1_1_0 + 0.0285714285714285*G0_0_1_1_1_1 + 0.000148809523809518*G0_0_1_1_1_2 + 0.000520833333333332*G0_0_1_1_2_0 + 0.000148809523809518*G0_0_1_1_2_1 + 0.000148809523809532*G0_0_1_1_2_2 + 0.000595238095238095*G0_0_1_2_0_0 + 0.000520833333333332*G0_0_1_2_0_1 + 0.0037202380952381*G0_0_1_2_0_2 + 0.000520833333333332*G0_0_1_2_1_0 + 0.000148809523809518*G0_0_1_2_1_1 + 0.000148809523809532*G0_0_1_2_1_2 + 0.0037202380952381*G0_0_1_2_2_0 + 0.000148809523809532*G0_0_1_2_2_1 + 0.0285714285714287*G0_0_1_2_2_2; + A[10] = -A[12] - 0.0285714285714285*G0_0_0_0_0_0 - 0.000148809523809523*G0_0_0_0_0_1 - 0.00372023809523809*G0_0_0_0_0_2 - 0.000148809523809523*G0_0_0_0_1_0 - 0.00014880952380953*G0_0_0_0_1_1 - 0.000520833333333332*G0_0_0_0_1_2 - 0.00372023809523809*G0_0_0_0_2_0 - 0.000520833333333332*G0_0_0_0_2_1 - 0.000595238095238096*G0_0_0_0_2_2 - 0.000148809523809523*G0_0_0_1_0_0 - 0.00014880952380953*G0_0_0_1_0_1 - 0.000520833333333332*G0_0_0_1_0_2 - 0.00014880952380953*G0_0_0_1_1_0 - 0.0285714285714286*G0_0_0_1_1_1 - 0.00372023809523809*G0_0_0_1_1_2 - 0.000520833333333332*G0_0_0_1_2_0 - 0.00372023809523809*G0_0_0_1_2_1 - 0.000595238095238095*G0_0_0_1_2_2 - 0.00372023809523809*G0_0_0_2_0_0 - 0.000520833333333332*G0_0_0_2_0_1 - 0.000595238095238096*G0_0_0_2_0_2 - 0.000520833333333332*G0_0_0_2_1_0 - 0.00372023809523809*G0_0_0_2_1_1 - 0.000595238095238095*G0_0_0_2_1_2 - 0.000595238095238096*G0_0_0_2_2_0 - 0.000595238095238095*G0_0_0_2_2_1 - 0.000446428571428594*G0_0_0_2_2_2 - 0.028125*G0_0_1_0_0_0 + 0.000446428571428572*G0_0_1_0_0_1 - 0.00312499999999999*G0_0_1_0_0_2 + 0.000446428571428572*G0_0_1_0_1_0 + 0.00357142857142856*G0_0_1_0_1_1 - 0.00312499999999999*G0_0_1_0_2_0 + 0.003125*G0_0_1_0_2_2 + 0.000446428571428573*G0_0_1_1_0_0 + 0.00357142857142856*G0_0_1_1_0_1 + 0.00357142857142856*G0_0_1_1_1_0 - 0.00357142857142857*G0_0_1_1_1_2 - 0.00357142857142857*G0_0_1_1_2_1 - 0.000446428571428562*G0_0_1_1_2_2 - 0.00312499999999999*G0_0_1_2_0_0 + 0.003125*G0_0_1_2_0_2 - 0.00357142857142857*G0_0_1_2_1_1 - 0.000446428571428562*G0_0_1_2_1_2 + 0.003125*G0_0_1_2_2_0 - 0.000446428571428562*G0_0_1_2_2_1 + 0.0281250000000001*G0_0_1_2_2_2; + A[2] = -A[12] - 0.0281249999999999*G0_0_1_0_0_0 - 0.00312499999999999*G0_0_1_0_0_1 + 0.000446428571428575*G0_0_1_0_0_2 - 0.00312499999999999*G0_0_1_0_1_0 + 0.00312499999999999*G0_0_1_0_1_1 + 0.000446428571428575*G0_0_1_0_2_0 + 0.00357142857142857*G0_0_1_0_2_2 - 0.00312499999999999*G0_0_1_1_0_0 + 0.00312499999999999*G0_0_1_1_0_1 + 0.00312499999999999*G0_0_1_1_1_0 + 0.0281249999999999*G0_0_1_1_1_1 - 0.000446428571428582*G0_0_1_1_1_2 - 0.000446428571428582*G0_0_1_1_2_1 - 0.00357142857142858*G0_0_1_1_2_2 + 0.000446428571428576*G0_0_1_2_0_0 + 0.00357142857142857*G0_0_1_2_0_2 - 0.000446428571428582*G0_0_1_2_1_1 - 0.00357142857142858*G0_0_1_2_1_2 + 0.00357142857142857*G0_0_1_2_2_0 - 0.00357142857142858*G0_0_1_2_2_1 - 0.0285714285714285*G0_1_1_0_0_0 - 0.00372023809523809*G0_1_1_0_0_1 - 0.000148809523809521*G0_1_1_0_0_2 - 0.00372023809523809*G0_1_1_0_1_0 - 0.000595238095238096*G0_1_1_0_1_1 - 0.000520833333333334*G0_1_1_0_1_2 - 0.000148809523809521*G0_1_1_0_2_0 - 0.000520833333333333*G0_1_1_0_2_1 - 0.000148809523809536*G0_1_1_0_2_2 - 0.00372023809523809*G0_1_1_1_0_0 - 0.000595238095238096*G0_1_1_1_0_1 - 0.000520833333333334*G0_1_1_1_0_2 - 0.000595238095238096*G0_1_1_1_1_0 - 0.000446428571428581*G0_1_1_1_1_1 - 0.000595238095238101*G0_1_1_1_1_2 - 0.000520833333333334*G0_1_1_1_2_0 - 0.000595238095238101*G0_1_1_1_2_1 - 0.00372023809523811*G0_1_1_1_2_2 - 0.000148809523809522*G0_1_1_2_0_0 - 0.000520833333333333*G0_1_1_2_0_1 - 0.000148809523809536*G0_1_1_2_0_2 - 0.000520833333333334*G0_1_1_2_1_0 - 0.000595238095238101*G0_1_1_2_1_1 - 0.00372023809523811*G0_1_1_2_1_2 - 0.000148809523809536*G0_1_1_2_2_0 - 0.00372023809523811*G0_1_1_2_2_1 - 0.0285714285714287*G0_1_1_2_2_2; + A[49] = A[94] - 0.0361607142857143*G0_0_1_0_0_0 - 0.0120535714285714*G0_0_1_0_0_1 - 0.0241071428571428*G0_0_1_0_0_2 - 0.0120535714285714*G0_0_1_0_1_0 - 0.0241071428571428*G0_0_1_0_2_0 - 0.0361607142857143*G0_0_1_0_2_2 - 0.0120535714285714*G0_0_1_1_0_0 + 0.0723214285714285*G0_0_1_1_1_1 + 0.0723214285714284*G0_0_1_1_1_2 + 0.0723214285714284*G0_0_1_1_2_1 + 0.0361607142857141*G0_0_1_1_2_2 - 0.0241071428571428*G0_0_1_2_0_0 - 0.0361607142857143*G0_0_1_2_0_2 + 0.0723214285714284*G0_0_1_2_1_1 + 0.0361607142857141*G0_0_1_2_1_2 - 0.0361607142857143*G0_0_1_2_2_0 + 0.0361607142857141*G0_0_1_2_2_1 - 0.144642857142858*G0_0_1_2_2_2 + 0.0361607142857142*G0_1_0_0_0_0 + 0.0120535714285714*G0_1_0_0_0_1 + 0.0241071428571428*G0_1_0_0_0_2 + 0.0120535714285714*G0_1_0_0_1_0 + 0.0241071428571428*G0_1_0_0_2_0 + 0.0361607142857143*G0_1_0_0_2_2 + 0.0120535714285714*G0_1_0_1_0_0 - 0.0723214285714285*G0_1_0_1_1_1 - 0.0723214285714284*G0_1_0_1_1_2 - 0.0723214285714284*G0_1_0_1_2_1 - 0.0361607142857141*G0_1_0_1_2_2 + 0.0241071428571428*G0_1_0_2_0_0 + 0.0361607142857143*G0_1_0_2_0_2 - 0.0723214285714284*G0_1_0_2_1_1 - 0.0361607142857141*G0_1_0_2_1_2 + 0.0361607142857143*G0_1_0_2_2_0 - 0.0361607142857141*G0_1_0_2_2_1 + 0.144642857142858*G0_1_0_2_2_2; + A[97] = A[49] + 0.204910714285714*G0_0_0_0_0_0 + 0.0120535714285714*G0_0_0_0_0_1 + 0.0241071428571429*G0_0_0_0_0_2 + 0.0120535714285714*G0_0_0_0_1_0 + 0.0241071428571429*G0_0_0_0_2_0 - 0.0361607142857142*G0_0_0_0_2_2 + 0.0120535714285714*G0_0_0_1_0_0 - 0.120535714285714*G0_0_0_1_1_1 - 0.0241071428571427*G0_0_0_1_1_2 - 0.0241071428571427*G0_0_0_1_2_1 + 0.0120535714285715*G0_0_0_1_2_2 + 0.0241071428571429*G0_0_0_2_0_0 - 0.0361607142857142*G0_0_0_2_0_2 - 0.0241071428571427*G0_0_0_2_1_1 + 0.0120535714285715*G0_0_0_2_1_2 - 0.0361607142857142*G0_0_0_2_2_0 + 0.0120535714285715*G0_0_0_2_2_1 - 0.0482142857142852*G0_0_0_2_2_2 - 0.0843749999999999*G0_0_1_0_0_0 - 0.0120535714285714*G0_0_1_0_0_1 - 0.0241071428571428*G0_0_1_0_0_2 - 0.0120535714285714*G0_0_1_0_1_0 - 0.0241071428571428*G0_0_1_0_2_0 + 0.0120535714285715*G0_0_1_0_2_2 - 0.0120535714285714*G0_0_1_1_0_0 - 0.120535714285714*G0_0_1_1_1_1 - 0.0241071428571427*G0_0_1_1_1_2 - 0.0241071428571426*G0_0_1_1_2_1 + 0.0361607142857145*G0_0_1_1_2_2 - 0.0241071428571428*G0_0_1_2_0_0 + 0.0120535714285715*G0_0_1_2_0_2 - 0.0241071428571427*G0_0_1_2_1_1 + 0.0361607142857145*G0_0_1_2_1_2 + 0.0120535714285715*G0_0_1_2_2_0 + 0.0361607142857145*G0_0_1_2_2_1 + 0.241071428571429*G0_0_1_2_2_2 + 0.0241071428571432*G0_1_0_0_0_0 - 0.0602678571428571*G0_1_0_0_0_1 - 0.0120535714285714*G0_1_0_0_0_2 - 0.0602678571428571*G0_1_0_0_1_0 - 0.0723214285714285*G0_1_0_0_1_1 - 0.0120535714285714*G0_1_0_0_2_0 - 0.0602678571428571*G0_1_0_1_0_0 - 0.0723214285714285*G0_1_0_1_0_1 - 0.0723214285714285*G0_1_0_1_1_0 - 0.120535714285714*G0_1_0_1_1_1 + 0.0482142857142858*G0_1_0_1_1_2 + 0.0482142857142858*G0_1_0_1_2_1 + 0.0843749999999999*G0_1_0_1_2_2 - 0.0120535714285714*G0_1_0_2_0_0 + 0.0482142857142858*G0_1_0_2_1_1 + 0.0843749999999999*G0_1_0_2_1_2 + 0.0843749999999999*G0_1_0_2_2_1 + 0.132589285714286*G0_1_0_2_2_2 - 0.216964285714286*G0_1_1_0_0_0 - 0.0964285714285714*G0_1_1_0_0_1 - 0.0241071428571428*G0_1_1_0_0_2 - 0.0964285714285714*G0_1_1_0_1_0 - 0.0482142857142857*G0_1_1_0_1_1 - 0.0241071428571428*G0_1_1_0_2_0 + 0.0241071428571428*G0_1_1_0_2_2 - 0.0964285714285714*G0_1_1_1_0_0 - 0.0482142857142857*G0_1_1_1_0_1 - 0.0482142857142857*G0_1_1_1_1_0 + 0.0482142857142858*G0_1_1_1_1_2 + 0.0482142857142858*G0_1_1_1_2_1 + 0.0964285714285714*G0_1_1_1_2_2 - 0.0241071428571428*G0_1_1_2_0_0 + 0.0241071428571428*G0_1_1_2_0_2 + 0.0482142857142858*G0_1_1_2_1_1 + 0.0964285714285714*G0_1_1_2_1_2 + 0.0241071428571428*G0_1_1_2_2_0 + 0.0964285714285714*G0_1_1_2_2_1 + 0.216964285714286*G0_1_1_2_2_2; + A[99] = -A[97] + 0.542410714285714*G0_0_0_0_0_0 + 0.0602678571428571*G0_0_0_0_0_1 + 0.241071428571428*G0_0_0_0_0_2 + 0.0602678571428571*G0_0_0_0_1_0 + 0.0482142857142857*G0_0_0_0_1_1 + 0.0482142857142857*G0_0_0_0_1_2 + 0.241071428571428*G0_0_0_0_2_0 + 0.0482142857142857*G0_0_0_0_2_1 + 0.204910714285714*G0_0_0_0_2_2 + 0.0602678571428571*G0_0_0_1_0_0 + 0.0482142857142857*G0_0_0_1_0_1 + 0.0482142857142857*G0_0_0_1_0_2 + 0.0482142857142857*G0_0_0_1_1_0 + 0.216964285714285*G0_0_0_1_1_1 + 0.144642857142857*G0_0_0_1_1_2 + 0.0482142857142857*G0_0_0_1_2_0 + 0.144642857142857*G0_0_0_1_2_1 + 0.156696428571428*G0_0_0_1_2_2 + 0.241071428571428*G0_0_0_2_0_0 + 0.0482142857142857*G0_0_0_2_0_1 + 0.204910714285714*G0_0_0_2_0_2 + 0.0482142857142857*G0_0_0_2_1_0 + 0.144642857142857*G0_0_0_2_1_1 + 0.156696428571428*G0_0_0_2_1_2 + 0.204910714285714*G0_0_0_2_2_0 + 0.156696428571428*G0_0_0_2_2_1 + 0.43392857142857*G0_0_0_2_2_2 - 0.0120535714285713*G0_0_1_0_0_0 - 0.0120535714285714*G0_0_1_0_0_2 + 0.0120535714285714*G0_0_1_0_1_1 + 0.0120535714285714*G0_0_1_0_1_2 - 0.0120535714285714*G0_0_1_0_2_0 + 0.0120535714285714*G0_0_1_0_2_1 + 0.0120535714285714*G0_0_1_1_0_1 + 0.0120535714285714*G0_0_1_1_0_2 + 0.0120535714285714*G0_0_1_1_1_0 + 0.0964285714285714*G0_0_1_1_1_1 + 0.108482142857143*G0_0_1_1_1_2 + 0.0120535714285714*G0_0_1_1_2_0 + 0.108482142857143*G0_0_1_1_2_1 + 0.120535714285714*G0_0_1_1_2_2 - 0.0120535714285714*G0_0_1_2_0_0 + 0.0120535714285714*G0_0_1_2_0_1 + 0.0120535714285714*G0_0_1_2_1_0 + 0.108482142857143*G0_0_1_2_1_1 + 0.120535714285714*G0_0_1_2_1_2 + 0.120535714285714*G0_0_1_2_2_1 + 0.16875*G0_0_1_2_2_2 + 0.132589285714286*G0_1_0_0_0_0 - 0.0361607142857143*G0_1_0_0_0_1 + 0.0241071428571428*G0_1_0_0_0_2 - 0.0361607142857142*G0_1_0_0_1_0 - 0.0602678571428571*G0_1_0_0_1_1 + 0.0120535714285714*G0_1_0_0_1_2 + 0.0241071428571429*G0_1_0_0_2_0 + 0.0120535714285714*G0_1_0_0_2_1 + 0.0241071428571428*G0_1_0_0_2_2 - 0.0361607142857143*G0_1_0_1_0_0 - 0.0602678571428571*G0_1_0_1_0_1 + 0.0120535714285714*G0_1_0_1_0_2 - 0.0602678571428571*G0_1_0_1_1_0 + 0.0241071428571428*G0_1_0_1_1_1 + 0.108482142857143*G0_1_0_1_1_2 + 0.0120535714285714*G0_1_0_1_2_0 + 0.108482142857143*G0_1_0_1_2_1 + 0.132589285714285*G0_1_0_1_2_2 + 0.0241071428571428*G0_1_0_2_0_0 + 0.0120535714285714*G0_1_0_2_0_1 + 0.0241071428571428*G0_1_0_2_0_2 + 0.0120535714285714*G0_1_0_2_1_0 + 0.108482142857143*G0_1_0_2_1_1 + 0.132589285714285*G0_1_0_2_1_2 + 0.0241071428571428*G0_1_0_2_2_0 + 0.132589285714285*G0_1_0_2_2_1 + 0.204910714285714*G0_1_0_2_2_2 + 0.0602678571428575*G0_1_1_0_0_0 + 0.0482142857142859*G0_1_1_0_0_1 + 0.0120535714285714*G0_1_1_0_0_2 + 0.0482142857142859*G0_1_1_0_1_0 + 0.0723214285714287*G0_1_1_0_1_1 + 0.0241071428571428*G0_1_1_0_1_2 + 0.0120535714285715*G0_1_1_0_2_0 + 0.0241071428571429*G0_1_1_0_2_1 + 0.0361607142857142*G0_1_1_0_2_2 + 0.0482142857142859*G0_1_1_1_0_0 + 0.0723214285714286*G0_1_1_1_0_1 + 0.0241071428571429*G0_1_1_1_0_2 + 0.0723214285714286*G0_1_1_1_1_0 + 0.241071428571429*G0_1_1_1_1_1 + 0.120535714285714*G0_1_1_1_1_2 + 0.0241071428571429*G0_1_1_1_2_0 + 0.120535714285714*G0_1_1_1_2_1 + 0.144642857142857*G0_1_1_1_2_2 + 0.0120535714285714*G0_1_1_2_0_0 + 0.0241071428571429*G0_1_1_2_0_1 + 0.0361607142857142*G0_1_1_2_0_2 + 0.0241071428571429*G0_1_1_2_1_0 + 0.120535714285714*G0_1_1_2_1_1 + 0.144642857142857*G0_1_1_2_1_2 + 0.0361607142857142*G0_1_1_2_2_0 + 0.144642857142857*G0_1_1_2_2_1 + 0.277232142857143*G0_1_1_2_2_2; + A[29] = A[92] + 0.0120535714285714*G0_0_1_0_0_0 + 0.00133928571428571*G0_0_1_0_0_1 + 0.00535714285714285*G0_0_1_0_0_2 + 0.00133928571428571*G0_0_1_0_1_0 - 0.00133928571428572*G0_0_1_0_1_1 + 0.00535714285714285*G0_0_1_0_2_0 - 0.00803571428571426*G0_0_1_0_2_2 + 0.00133928571428571*G0_0_1_1_0_0 - 0.00133928571428572*G0_0_1_1_0_1 - 0.00133928571428572*G0_0_1_1_1_0 - 0.0120535714285714*G0_0_1_1_1_1 - 0.00535714285714284*G0_0_1_1_1_2 - 0.00535714285714284*G0_0_1_1_2_1 + 0.00803571428571429*G0_0_1_1_2_2 + 0.00535714285714285*G0_0_1_2_0_0 - 0.00803571428571426*G0_0_1_2_0_2 - 0.00535714285714284*G0_0_1_2_1_1 + 0.00803571428571429*G0_0_1_2_1_2 - 0.00803571428571426*G0_0_1_2_2_0 + 0.00803571428571429*G0_0_1_2_2_1 - 0.0120535714285714*G0_1_0_0_0_0 - 0.00133928571428571*G0_1_0_0_0_1 - 0.00535714285714285*G0_1_0_0_0_2 - 0.00133928571428571*G0_1_0_0_1_0 + 0.00133928571428572*G0_1_0_0_1_1 - 0.00535714285714285*G0_1_0_0_2_0 + 0.00803571428571426*G0_1_0_0_2_2 - 0.00133928571428571*G0_1_0_1_0_0 + 0.00133928571428572*G0_1_0_1_0_1 + 0.00133928571428572*G0_1_0_1_1_0 + 0.0120535714285714*G0_1_0_1_1_1 + 0.00535714285714284*G0_1_0_1_1_2 + 0.00535714285714284*G0_1_0_1_2_1 - 0.00803571428571429*G0_1_0_1_2_2 - 0.00535714285714285*G0_1_0_2_0_0 + 0.00803571428571426*G0_1_0_2_0_2 + 0.00535714285714284*G0_1_0_2_1_1 - 0.00803571428571429*G0_1_0_2_1_2 + 0.00803571428571426*G0_1_0_2_2_0 - 0.00803571428571429*G0_1_0_2_2_1; + A[81] = -A[31] - 0.0575892857142857*G0_0_0_0_0_0 - 0.0116071428571428*G0_0_0_0_0_1 - 0.0191964285714285*G0_0_0_0_0_2 - 0.0116071428571428*G0_0_0_0_1_0 - 0.0160714285714285*G0_0_0_0_1_1 - 0.00580357142857141*G0_0_0_0_1_2 - 0.0191964285714285*G0_0_0_0_2_0 - 0.00580357142857141*G0_0_0_0_2_1 - 0.0191964285714285*G0_0_0_0_2_2 - 0.0116071428571428*G0_0_0_1_0_0 - 0.0160714285714285*G0_0_0_1_0_1 - 0.00580357142857141*G0_0_0_1_0_2 - 0.0160714285714285*G0_0_0_1_1_0 - 0.20625*G0_0_0_1_1_1 - 0.0160714285714285*G0_0_0_1_1_2 - 0.00580357142857141*G0_0_0_1_2_0 - 0.0160714285714285*G0_0_0_1_2_1 - 0.0116071428571428*G0_0_0_1_2_2 - 0.0191964285714285*G0_0_0_2_0_0 - 0.00580357142857141*G0_0_0_2_0_1 - 0.0191964285714285*G0_0_0_2_0_2 - 0.00580357142857141*G0_0_0_2_1_0 - 0.0160714285714285*G0_0_0_2_1_1 - 0.0116071428571428*G0_0_0_2_1_2 - 0.0191964285714285*G0_0_0_2_2_0 - 0.0116071428571428*G0_0_0_2_2_1 - 0.0575892857142857*G0_0_0_2_2_2; + A[44] = -A[64] + 0.0180803571428573*G0_1_0_0_0_0 + 0.00602678571428575*G0_1_0_0_0_1 + 0.0160714285714285*G0_1_0_0_0_2 + 0.00602678571428575*G0_1_0_0_1_0 + 0.00602678571428575*G0_1_0_0_1_1 + 0.00803571428571428*G0_1_0_0_1_2 + 0.0160714285714285*G0_1_0_0_2_0 + 0.00803571428571428*G0_1_0_0_2_1 + 0.0120535714285713*G0_1_0_0_2_2 + 0.00602678571428575*G0_1_0_1_0_0 + 0.00602678571428575*G0_1_0_1_0_1 + 0.00803571428571428*G0_1_0_1_0_2 + 0.00602678571428575*G0_1_0_1_1_0 + 0.0180803571428573*G0_1_0_1_1_1 + 0.0160714285714286*G0_1_0_1_1_2 + 0.00803571428571428*G0_1_0_1_2_0 + 0.0160714285714286*G0_1_0_1_2_1 + 0.0120535714285714*G0_1_0_1_2_2 + 0.0160714285714285*G0_1_0_2_0_0 + 0.00803571428571428*G0_1_0_2_0_1 + 0.0120535714285713*G0_1_0_2_0_2 + 0.00803571428571428*G0_1_0_2_1_0 + 0.0160714285714286*G0_1_0_2_1_1 + 0.0120535714285714*G0_1_0_2_1_2 + 0.0120535714285713*G0_1_0_2_2_0 + 0.0120535714285714*G0_1_0_2_2_1 - 0.289285714285715*G0_1_0_2_2_2 + 0.066294642857143*G0_1_1_0_0_0 + 0.0441964285714286*G0_1_1_0_0_1 + 0.0301339285714285*G0_1_1_0_0_2 + 0.0441964285714286*G0_1_1_0_1_0 + 0.0662946428571428*G0_1_1_0_1_1 + 0.0301339285714285*G0_1_1_0_1_2 + 0.0301339285714285*G0_1_1_0_2_0 + 0.0301339285714285*G0_1_1_0_2_1 + 0.0441964285714284*G0_1_1_0_2_2 + 0.0441964285714286*G0_1_1_1_0_0 + 0.0662946428571428*G0_1_1_1_0_1 + 0.0301339285714285*G0_1_1_1_0_2 + 0.0662946428571428*G0_1_1_1_1_0 + 0.265178571428571*G0_1_1_1_1_1 + 0.0904017857142856*G0_1_1_1_1_2 + 0.0301339285714285*G0_1_1_1_2_0 + 0.0904017857142856*G0_1_1_1_2_1 + 0.088392857142857*G0_1_1_1_2_2 + 0.0301339285714285*G0_1_1_2_0_0 + 0.0301339285714285*G0_1_1_2_0_1 + 0.0441964285714284*G0_1_1_2_0_2 + 0.0301339285714285*G0_1_1_2_1_0 + 0.0904017857142856*G0_1_1_2_1_1 + 0.0883928571428571*G0_1_1_2_1_2 + 0.0441964285714284*G0_1_1_2_2_0 + 0.0883928571428571*G0_1_1_2_2_1 + 0.0843749999999996*G0_1_1_2_2_2; + A[33] = A[44] + 0.0120535714285714*G0_0_0_0_0_0 + 0.0120535714285714*G0_0_0_0_0_1 + 0.0120535714285714*G0_0_0_0_1_0 + 0.0361607142857142*G0_0_0_0_1_1 + 0.0120535714285714*G0_0_0_0_1_2 + 0.0120535714285714*G0_0_0_0_2_1 - 0.0482142857142858*G0_0_0_0_2_2 + 0.0120535714285714*G0_0_0_1_0_0 + 0.0361607142857142*G0_0_0_1_0_1 + 0.0120535714285714*G0_0_0_1_0_2 + 0.0361607142857142*G0_0_0_1_1_0 + 0.229017857142857*G0_0_0_1_1_1 + 0.0964285714285712*G0_0_0_1_1_2 + 0.0120535714285714*G0_0_0_1_2_0 + 0.0964285714285712*G0_0_0_1_2_1 + 0.0120535714285714*G0_0_0_2_0_1 - 0.0482142857142858*G0_0_0_2_0_2 + 0.0120535714285714*G0_0_0_2_1_0 + 0.0964285714285712*G0_0_0_2_1_1 - 0.0482142857142858*G0_0_0_2_2_0 - 0.602678571428572*G0_0_0_2_2_2 + 0.0060267857142857*G0_0_1_0_0_1 - 0.00602678571428571*G0_0_1_0_0_2 + 0.0060267857142857*G0_0_1_0_1_0 + 0.0301339285714285*G0_0_1_0_1_1 - 0.00602678571428571*G0_0_1_0_2_0 - 0.0301339285714286*G0_0_1_0_2_2 + 0.0060267857142857*G0_0_1_1_0_0 + 0.0301339285714285*G0_0_1_1_0_1 + 0.0301339285714285*G0_0_1_1_1_0 + 0.253124999999999*G0_0_1_1_1_1 + 0.0421874999999998*G0_0_1_1_1_2 + 0.0421874999999998*G0_0_1_1_2_1 - 0.0421875000000001*G0_0_1_1_2_2 - 0.00602678571428571*G0_0_1_2_0_0 - 0.0301339285714286*G0_0_1_2_0_2 + 0.0421874999999998*G0_0_1_2_1_1 - 0.0421875000000001*G0_0_1_2_1_2 - 0.0301339285714286*G0_0_1_2_2_0 - 0.0421875000000001*G0_0_1_2_2_1 - 0.253125*G0_0_1_2_2_2 + 0.0060267857142857*G0_1_0_0_0_1 - 0.00602678571428571*G0_1_0_0_0_2 + 0.0060267857142857*G0_1_0_0_1_0 + 0.0301339285714285*G0_1_0_0_1_1 - 0.00602678571428571*G0_1_0_0_2_0 - 0.0301339285714286*G0_1_0_0_2_2 + 0.0060267857142857*G0_1_0_1_0_0 + 0.0301339285714285*G0_1_0_1_0_1 + 0.0301339285714285*G0_1_0_1_1_0 + 0.253124999999999*G0_1_0_1_1_1 + 0.0421874999999998*G0_1_0_1_1_2 + 0.0421874999999998*G0_1_0_1_2_1 - 0.0421875000000001*G0_1_0_1_2_2 - 0.00602678571428571*G0_1_0_2_0_0 - 0.0301339285714286*G0_1_0_2_0_2 + 0.0421874999999998*G0_1_0_2_1_1 - 0.0421875000000001*G0_1_0_2_1_2 - 0.0301339285714286*G0_1_0_2_2_0 - 0.0421875000000001*G0_1_0_2_2_1 - 0.253125*G0_1_0_2_2_2 - 0.0120535714285715*G0_1_1_0_0_0 - 0.0120535714285714*G0_1_1_0_0_2 + 0.0482142857142856*G0_1_1_0_1_1 - 0.0120535714285714*G0_1_1_0_1_2 - 0.0120535714285714*G0_1_1_0_2_0 - 0.0120535714285714*G0_1_1_0_2_1 - 0.0361607142857142*G0_1_1_0_2_2 + 0.0482142857142856*G0_1_1_1_0_1 - 0.0120535714285714*G0_1_1_1_0_2 + 0.0482142857142856*G0_1_1_1_1_0 + 0.60267857142857*G0_1_1_1_1_1 - 0.0120535714285714*G0_1_1_1_2_0 - 0.0964285714285714*G0_1_1_1_2_2 - 0.0120535714285714*G0_1_1_2_0_0 - 0.0120535714285714*G0_1_1_2_0_1 - 0.0361607142857142*G0_1_1_2_0_2 - 0.0120535714285714*G0_1_1_2_1_0 - 0.0964285714285714*G0_1_1_2_1_2 - 0.0361607142857142*G0_1_1_2_2_0 - 0.0964285714285714*G0_1_1_2_2_1 - 0.229017857142857*G0_1_1_2_2_2; + A[83] = -A[33] + 0.0662946428571429*G0_0_0_0_0_0 + 0.0301339285714285*G0_0_0_0_0_1 + 0.0441964285714285*G0_0_0_0_0_2 + 0.0301339285714285*G0_0_0_0_1_0 + 0.0441964285714285*G0_0_0_0_1_1 + 0.0301339285714285*G0_0_0_0_1_2 + 0.0441964285714285*G0_0_0_0_2_0 + 0.0301339285714285*G0_0_0_0_2_1 + 0.0662946428571428*G0_0_0_0_2_2 + 0.0301339285714285*G0_0_0_1_0_0 + 0.0441964285714285*G0_0_0_1_0_1 + 0.0301339285714285*G0_0_0_1_0_2 + 0.0441964285714285*G0_0_0_1_1_0 + 0.0843749999999999*G0_0_0_1_1_1 + 0.088392857142857*G0_0_0_1_1_2 + 0.0301339285714285*G0_0_0_1_2_0 + 0.088392857142857*G0_0_0_1_2_1 + 0.0904017857142855*G0_0_0_1_2_2 + 0.0441964285714285*G0_0_0_2_0_0 + 0.0301339285714285*G0_0_0_2_0_1 + 0.0662946428571428*G0_0_0_2_0_2 + 0.0301339285714285*G0_0_0_2_1_0 + 0.088392857142857*G0_0_0_2_1_1 + 0.0904017857142855*G0_0_0_2_1_2 + 0.0662946428571428*G0_0_0_2_2_0 + 0.0904017857142855*G0_0_0_2_2_1 + 0.265178571428571*G0_0_0_2_2_2 + 0.0180803571428572*G0_0_1_0_0_0 + 0.0160714285714286*G0_0_1_0_0_1 + 0.00602678571428572*G0_0_1_0_0_2 + 0.0160714285714286*G0_0_1_0_1_0 + 0.0120535714285715*G0_0_1_0_1_1 + 0.0080357142857143*G0_0_1_0_1_2 + 0.00602678571428572*G0_0_1_0_2_0 + 0.0080357142857143*G0_0_1_0_2_1 + 0.00602678571428569*G0_0_1_0_2_2 + 0.0160714285714286*G0_0_1_1_0_0 + 0.0120535714285715*G0_0_1_1_0_1 + 0.0080357142857143*G0_0_1_1_0_2 + 0.0120535714285715*G0_0_1_1_1_0 - 0.289285714285714*G0_0_1_1_1_1 + 0.0120535714285715*G0_0_1_1_1_2 + 0.0080357142857143*G0_0_1_1_2_0 + 0.0120535714285715*G0_0_1_1_2_1 + 0.0160714285714285*G0_0_1_1_2_2 + 0.00602678571428572*G0_0_1_2_0_0 + 0.0080357142857143*G0_0_1_2_0_1 + 0.00602678571428569*G0_0_1_2_0_2 + 0.0080357142857143*G0_0_1_2_1_0 + 0.0120535714285715*G0_0_1_2_1_1 + 0.0160714285714285*G0_0_1_2_1_2 + 0.00602678571428569*G0_0_1_2_2_0 + 0.0160714285714286*G0_0_1_2_2_1 + 0.018080357142857*G0_0_1_2_2_2; + A[63] = A[36] + 0.0180803571428571*G0_0_1_0_0_0 + 0.0140625*G0_0_1_0_0_2 - 0.00200892857142858*G0_0_1_0_1_2 + 0.0140625*G0_0_1_0_2_0 - 0.00200892857142858*G0_0_1_0_2_1 + 0.00602678571428561*G0_0_1_0_2_2 - 0.00200892857142858*G0_0_1_1_0_2 + 0.0180803571428572*G0_0_1_1_1_1 + 0.00200892857142855*G0_0_1_1_1_2 - 0.00200892857142858*G0_0_1_1_2_0 + 0.00200892857142855*G0_0_1_1_2_1 + 0.00602678571428562*G0_0_1_1_2_2 + 0.0140625*G0_0_1_2_0_0 - 0.00200892857142858*G0_0_1_2_0_1 + 0.00602678571428561*G0_0_1_2_0_2 - 0.00200892857142858*G0_0_1_2_1_0 + 0.00200892857142855*G0_0_1_2_1_1 + 0.00602678571428562*G0_0_1_2_1_2 + 0.00602678571428561*G0_0_1_2_2_0 + 0.00602678571428561*G0_0_1_2_2_1 - 0.108482142857144*G0_0_1_2_2_2 - 0.0180803571428571*G0_1_0_0_0_0 - 0.0140625*G0_1_0_0_0_2 + 0.00200892857142858*G0_1_0_0_1_2 - 0.0140625*G0_1_0_0_2_0 + 0.00200892857142858*G0_1_0_0_2_1 - 0.00602678571428561*G0_1_0_0_2_2 + 0.00200892857142858*G0_1_0_1_0_2 - 0.0180803571428572*G0_1_0_1_1_1 - 0.00200892857142855*G0_1_0_1_1_2 + 0.00200892857142858*G0_1_0_1_2_0 - 0.00200892857142855*G0_1_0_1_2_1 - 0.00602678571428562*G0_1_0_1_2_2 - 0.0140625*G0_1_0_2_0_0 + 0.00200892857142858*G0_1_0_2_0_1 - 0.00602678571428561*G0_1_0_2_0_2 + 0.00200892857142858*G0_1_0_2_1_0 - 0.00200892857142855*G0_1_0_2_1_1 - 0.00602678571428562*G0_1_0_2_1_2 - 0.00602678571428561*G0_1_0_2_2_0 - 0.00602678571428562*G0_1_0_2_2_1 + 0.108482142857144*G0_1_0_2_2_2; + A[68] = -A[63] + 0.00602678571428572*G0_0_0_0_0_0 + 0.00602678571428574*G0_0_0_0_0_1 + 0.0160714285714286*G0_0_0_0_0_2 + 0.00602678571428574*G0_0_0_0_1_0 + 0.00401785714285716*G0_0_0_0_1_1 + 0.0160714285714286*G0_0_0_0_2_0 + 0.0421875*G0_0_0_0_2_2 + 0.00602678571428574*G0_0_0_1_0_0 + 0.00401785714285716*G0_0_0_1_0_1 + 0.00401785714285716*G0_0_0_1_1_0 - 0.0120535714285715*G0_0_0_1_1_1 - 0.0160714285714286*G0_0_0_1_1_2 - 0.0160714285714286*G0_0_0_1_2_1 - 0.0180803571428571*G0_0_0_1_2_2 + 0.0160714285714286*G0_0_0_2_0_0 + 0.0421875*G0_0_0_2_0_2 - 0.0160714285714286*G0_0_0_2_1_1 - 0.018080357142857*G0_0_0_2_1_2 + 0.0421875*G0_0_0_2_2_0 - 0.018080357142857*G0_0_0_2_2_1 + 0.241071428571429*G0_0_0_2_2_2 - 0.0180803571428572*G0_1_0_0_0_0 - 0.0120535714285714*G0_1_0_0_0_1 - 0.0261160714285714*G0_1_0_0_0_2 - 0.0120535714285714*G0_1_0_0_1_0 - 0.00401785714285714*G0_1_0_0_1_1 + 0.00602678571428571*G0_1_0_0_1_2 - 0.0261160714285714*G0_1_0_0_2_0 + 0.00602678571428571*G0_1_0_0_2_1 - 0.0100446428571428*G0_1_0_0_2_2 - 0.0120535714285714*G0_1_0_1_0_0 - 0.00401785714285714*G0_1_0_1_0_1 + 0.00602678571428571*G0_1_0_1_0_2 - 0.00401785714285714*G0_1_0_1_1_0 + 0.00401785714285715*G0_1_0_1_1_2 + 0.00602678571428571*G0_1_0_1_2_0 + 0.00401785714285716*G0_1_0_1_2_1 - 0.0261160714285714*G0_1_0_2_0_0 + 0.00602678571428571*G0_1_0_2_0_1 - 0.0100446428571428*G0_1_0_2_0_2 + 0.00602678571428571*G0_1_0_2_1_0 + 0.00401785714285715*G0_1_0_2_1_1 - 0.0100446428571428*G0_1_0_2_2_0 + 0.126562500000001*G0_1_0_2_2_2; + A[48] = -A[68] - 0.0180803571428573*G0_1_0_0_0_0 - 0.0261160714285715*G0_1_0_0_0_1 - 0.0120535714285714*G0_1_0_0_0_2 - 0.0261160714285715*G0_1_0_0_1_0 - 0.0100446428571429*G0_1_0_0_1_1 + 0.00602678571428569*G0_1_0_0_1_2 - 0.0120535714285714*G0_1_0_0_2_0 + 0.00602678571428569*G0_1_0_0_2_1 - 0.00401785714285714*G0_1_0_0_2_2 - 0.0261160714285715*G0_1_0_1_0_0 - 0.0100446428571429*G0_1_0_1_0_1 + 0.00602678571428569*G0_1_0_1_0_2 - 0.0100446428571429*G0_1_0_1_1_0 + 0.1265625*G0_1_0_1_1_1 + 0.00602678571428569*G0_1_0_1_2_0 + 0.00401785714285713*G0_1_0_1_2_2 - 0.0120535714285714*G0_1_0_2_0_0 + 0.00602678571428569*G0_1_0_2_0_1 - 0.00401785714285714*G0_1_0_2_0_2 + 0.00602678571428569*G0_1_0_2_1_0 + 0.00401785714285713*G0_1_0_2_1_2 - 0.00401785714285714*G0_1_0_2_2_0 + 0.00401785714285713*G0_1_0_2_2_1 + 0.00602678571428582*G0_1_1_0_0_0 + 0.0160714285714286*G0_1_1_0_0_1 + 0.00602678571428571*G0_1_1_0_0_2 + 0.0160714285714286*G0_1_1_0_1_0 + 0.0421874999999999*G0_1_1_0_1_1 + 0.00602678571428571*G0_1_1_0_2_0 + 0.00401785714285714*G0_1_1_0_2_2 + 0.0160714285714286*G0_1_1_1_0_0 + 0.0421874999999999*G0_1_1_1_0_1 + 0.0421874999999999*G0_1_1_1_1_0 + 0.241071428571428*G0_1_1_1_1_1 - 0.0180803571428572*G0_1_1_1_1_2 - 0.0180803571428572*G0_1_1_1_2_1 - 0.0160714285714286*G0_1_1_1_2_2 + 0.00602678571428571*G0_1_1_2_0_0 + 0.00401785714285714*G0_1_1_2_0_2 - 0.0180803571428572*G0_1_1_2_1_1 - 0.0160714285714286*G0_1_1_2_1_2 + 0.00401785714285714*G0_1_1_2_2_0 - 0.0160714285714286*G0_1_1_2_2_1 - 0.0120535714285713*G0_1_1_2_2_2; + A[84] = A[48] - 0.0180803571428571*G0_0_1_0_0_0 - 0.0140625000000001*G0_0_1_0_0_1 - 0.0140625000000001*G0_0_1_0_1_0 - 0.00602678571428579*G0_0_1_0_1_1 + 0.00200892857142856*G0_0_1_0_1_2 + 0.00200892857142856*G0_0_1_0_2_1 - 0.0140625000000001*G0_0_1_1_0_0 - 0.0060267857142858*G0_0_1_1_0_1 + 0.00200892857142856*G0_0_1_1_0_2 - 0.0060267857142858*G0_0_1_1_1_0 + 0.108482142857142*G0_0_1_1_1_1 - 0.00602678571428573*G0_0_1_1_1_2 + 0.00200892857142856*G0_0_1_1_2_0 - 0.00602678571428572*G0_0_1_1_2_1 - 0.00200892857142857*G0_0_1_1_2_2 + 0.00200892857142856*G0_0_1_2_0_1 + 0.00200892857142856*G0_0_1_2_1_0 - 0.00602678571428572*G0_0_1_2_1_1 - 0.00200892857142857*G0_0_1_2_1_2 - 0.00200892857142857*G0_0_1_2_2_1 - 0.018080357142857*G0_0_1_2_2_2 + 0.0180803571428571*G0_1_0_0_0_0 + 0.0140625000000001*G0_1_0_0_0_1 + 0.0140625000000001*G0_1_0_0_1_0 + 0.00602678571428579*G0_1_0_0_1_1 - 0.00200892857142856*G0_1_0_0_1_2 - 0.00200892857142856*G0_1_0_0_2_1 + 0.0140625000000001*G0_1_0_1_0_0 + 0.0060267857142858*G0_1_0_1_0_1 - 0.00200892857142856*G0_1_0_1_0_2 + 0.0060267857142858*G0_1_0_1_1_0 - 0.108482142857142*G0_1_0_1_1_1 + 0.00602678571428573*G0_1_0_1_1_2 - 0.00200892857142856*G0_1_0_1_2_0 + 0.00602678571428573*G0_1_0_1_2_1 + 0.00200892857142857*G0_1_0_1_2_2 - 0.00200892857142856*G0_1_0_2_0_1 - 0.00200892857142856*G0_1_0_2_1_0 + 0.00602678571428572*G0_1_0_2_1_1 + 0.00200892857142857*G0_1_0_2_1_2 + 0.00200892857142857*G0_1_0_2_2_1 + 0.018080357142857*G0_1_0_2_2_2; + A[0] = A[11] + 0.200892857142857*G0_0_0_0_0_0 + 0.0142857142857143*G0_0_0_0_0_1 + 0.0151785714285714*G0_0_0_0_0_2 + 0.0142857142857143*G0_0_0_0_1_0 - 0.0142857142857143*G0_0_0_0_1_1 + 0.0151785714285714*G0_0_0_0_2_0 + 0.000892857142857139*G0_0_0_0_2_2 + 0.0142857142857143*G0_0_0_1_0_0 - 0.0142857142857143*G0_0_0_1_0_1 - 0.0142857142857143*G0_0_0_1_1_0 - 0.200892857142857*G0_0_0_1_1_1 - 0.0151785714285714*G0_0_0_1_1_2 - 0.0151785714285714*G0_0_0_1_2_1 - 0.00089285714285714*G0_0_0_1_2_2 + 0.0151785714285714*G0_0_0_2_0_0 + 0.000892857142857139*G0_0_0_2_0_2 - 0.0151785714285714*G0_0_0_2_1_1 - 0.00089285714285714*G0_0_0_2_1_2 + 0.000892857142857139*G0_0_0_2_2_0 - 0.000892857142857141*G0_0_0_2_2_1 + 0.213392857142857*G0_0_1_0_0_0 + 0.0193452380952381*G0_0_1_0_0_1 + 0.0193452380952381*G0_0_1_0_0_2 + 0.0193452380952381*G0_0_1_0_1_0 + 0.0050595238095238*G0_0_1_0_1_1 + 0.0025297619047619*G0_0_1_0_1_2 + 0.0193452380952381*G0_0_1_0_2_0 + 0.0025297619047619*G0_0_1_0_2_1 + 0.0050595238095238*G0_0_1_0_2_2 + 0.0193452380952381*G0_0_1_1_0_0 + 0.0050595238095238*G0_0_1_1_0_1 + 0.0025297619047619*G0_0_1_1_0_2 + 0.0050595238095238*G0_0_1_1_1_0 + 0.0125*G0_0_1_1_1_1 + 0.00416666666666666*G0_0_1_1_1_2 + 0.0025297619047619*G0_0_1_1_2_0 + 0.00416666666666666*G0_0_1_1_2_1 + 0.00416666666666666*G0_0_1_1_2_2 + 0.0193452380952381*G0_0_1_2_0_0 + 0.0025297619047619*G0_0_1_2_0_1 + 0.0050595238095238*G0_0_1_2_0_2 + 0.0025297619047619*G0_0_1_2_1_0 + 0.00416666666666666*G0_0_1_2_1_1 + 0.00416666666666666*G0_0_1_2_1_2 + 0.0050595238095238*G0_0_1_2_2_0 + 0.00416666666666666*G0_0_1_2_2_1 + 0.0125*G0_0_1_2_2_2 + 0.213392857142857*G0_1_0_0_0_0 + 0.0193452380952381*G0_1_0_0_0_1 + 0.0193452380952381*G0_1_0_0_0_2 + 0.0193452380952381*G0_1_0_0_1_0 + 0.0050595238095238*G0_1_0_0_1_1 + 0.0025297619047619*G0_1_0_0_1_2 + 0.0193452380952381*G0_1_0_0_2_0 + 0.0025297619047619*G0_1_0_0_2_1 + 0.0050595238095238*G0_1_0_0_2_2 + 0.0193452380952381*G0_1_0_1_0_0 + 0.0050595238095238*G0_1_0_1_0_1 + 0.0025297619047619*G0_1_0_1_0_2 + 0.0050595238095238*G0_1_0_1_1_0 + 0.0125*G0_1_0_1_1_1 + 0.00416666666666666*G0_1_0_1_1_2 + 0.0025297619047619*G0_1_0_1_2_0 + 0.00416666666666666*G0_1_0_1_2_1 + 0.00416666666666666*G0_1_0_1_2_2 + 0.0193452380952381*G0_1_0_2_0_0 + 0.0025297619047619*G0_1_0_2_0_1 + 0.0050595238095238*G0_1_0_2_0_2 + 0.0025297619047619*G0_1_0_2_1_0 + 0.00416666666666666*G0_1_0_2_1_1 + 0.00416666666666666*G0_1_0_2_1_2 + 0.0050595238095238*G0_1_0_2_2_0 + 0.00416666666666666*G0_1_0_2_2_1 + 0.0125*G0_1_0_2_2_2 + 0.213392857142857*G0_1_1_0_0_0 + 0.0193452380952381*G0_1_1_0_0_1 + 0.0193452380952381*G0_1_1_0_0_2 + 0.0193452380952381*G0_1_1_0_1_0 + 0.0050595238095238*G0_1_1_0_1_1 + 0.0025297619047619*G0_1_1_0_1_2 + 0.0193452380952381*G0_1_1_0_2_0 + 0.0025297619047619*G0_1_1_0_2_1 + 0.0050595238095238*G0_1_1_0_2_2 + 0.0193452380952381*G0_1_1_1_0_0 + 0.0050595238095238*G0_1_1_1_0_1 + 0.0025297619047619*G0_1_1_1_0_2 + 0.0050595238095238*G0_1_1_1_1_0 + 0.0125*G0_1_1_1_1_1 + 0.00416666666666666*G0_1_1_1_1_2 + 0.0025297619047619*G0_1_1_1_2_0 + 0.00416666666666666*G0_1_1_1_2_1 + 0.00416666666666666*G0_1_1_1_2_2 + 0.0193452380952381*G0_1_1_2_0_0 + 0.0025297619047619*G0_1_1_2_0_1 + 0.0050595238095238*G0_1_1_2_0_2 + 0.0025297619047619*G0_1_1_2_1_0 + 0.00416666666666666*G0_1_1_2_1_1 + 0.00416666666666666*G0_1_1_2_1_2 + 0.0050595238095238*G0_1_1_2_2_0 + 0.00416666666666666*G0_1_1_2_2_1 + 0.0125*G0_1_1_2_2_2; + A[79] = A[97] + 0.144642857142857*G0_0_1_0_0_0 - 0.0361607142857143*G0_0_1_0_0_1 + 0.0361607142857142*G0_0_1_0_0_2 - 0.0361607142857143*G0_0_1_0_1_0 - 0.0723214285714286*G0_0_1_0_1_1 + 0.0361607142857142*G0_0_1_0_2_0 + 0.0241071428571428*G0_0_1_0_2_2 - 0.0361607142857143*G0_0_1_1_0_0 - 0.0723214285714286*G0_0_1_1_0_1 - 0.0723214285714286*G0_0_1_1_1_0 - 0.0723214285714286*G0_0_1_1_1_1 + 0.0120535714285714*G0_0_1_1_2_2 + 0.0361607142857142*G0_0_1_2_0_0 + 0.0241071428571428*G0_0_1_2_0_2 + 0.0120535714285714*G0_0_1_2_1_2 + 0.0241071428571428*G0_0_1_2_2_0 + 0.0120535714285714*G0_0_1_2_2_1 + 0.036160714285714*G0_0_1_2_2_2 - 0.144642857142857*G0_1_0_0_0_0 + 0.0361607142857143*G0_1_0_0_0_1 - 0.0361607142857142*G0_1_0_0_0_2 + 0.0361607142857143*G0_1_0_0_1_0 + 0.0723214285714286*G0_1_0_0_1_1 - 0.0361607142857142*G0_1_0_0_2_0 - 0.0241071428571428*G0_1_0_0_2_2 + 0.0361607142857143*G0_1_0_1_0_0 + 0.0723214285714286*G0_1_0_1_0_1 + 0.0723214285714286*G0_1_0_1_1_0 + 0.0723214285714286*G0_1_0_1_1_1 - 0.0120535714285714*G0_1_0_1_2_2 - 0.0361607142857142*G0_1_0_2_0_0 - 0.0241071428571428*G0_1_0_2_0_2 - 0.0120535714285714*G0_1_0_2_1_2 - 0.0241071428571428*G0_1_0_2_2_0 - 0.0120535714285714*G0_1_0_2_2_1 - 0.0361607142857141*G0_1_0_2_2_2; + A[38] = -A[33] + 0.0662946428571429*G0_0_0_0_0_0 + 0.0301339285714285*G0_0_0_0_0_1 + 0.0441964285714285*G0_0_0_0_0_2 + 0.0301339285714285*G0_0_0_0_1_0 + 0.0441964285714285*G0_0_0_0_1_1 + 0.0301339285714285*G0_0_0_0_1_2 + 0.0441964285714285*G0_0_0_0_2_0 + 0.0301339285714285*G0_0_0_0_2_1 + 0.0662946428571428*G0_0_0_0_2_2 + 0.0301339285714285*G0_0_0_1_0_0 + 0.0441964285714285*G0_0_0_1_0_1 + 0.0301339285714285*G0_0_0_1_0_2 + 0.0441964285714285*G0_0_0_1_1_0 + 0.0843749999999999*G0_0_0_1_1_1 + 0.088392857142857*G0_0_0_1_1_2 + 0.0301339285714285*G0_0_0_1_2_0 + 0.088392857142857*G0_0_0_1_2_1 + 0.0904017857142855*G0_0_0_1_2_2 + 0.0441964285714285*G0_0_0_2_0_0 + 0.0301339285714285*G0_0_0_2_0_1 + 0.0662946428571428*G0_0_0_2_0_2 + 0.0301339285714285*G0_0_0_2_1_0 + 0.088392857142857*G0_0_0_2_1_1 + 0.0904017857142855*G0_0_0_2_1_2 + 0.0662946428571428*G0_0_0_2_2_0 + 0.0904017857142855*G0_0_0_2_2_1 + 0.265178571428571*G0_0_0_2_2_2 + 0.0180803571428571*G0_1_0_0_0_0 + 0.0160714285714286*G0_1_0_0_0_1 + 0.00602678571428572*G0_1_0_0_0_2 + 0.0160714285714286*G0_1_0_0_1_0 + 0.0120535714285715*G0_1_0_0_1_1 + 0.0080357142857143*G0_1_0_0_1_2 + 0.00602678571428572*G0_1_0_0_2_0 + 0.0080357142857143*G0_1_0_0_2_1 + 0.00602678571428569*G0_1_0_0_2_2 + 0.0160714285714286*G0_1_0_1_0_0 + 0.0120535714285715*G0_1_0_1_0_1 + 0.00803571428571429*G0_1_0_1_0_2 + 0.0120535714285715*G0_1_0_1_1_0 - 0.289285714285714*G0_1_0_1_1_1 + 0.0120535714285715*G0_1_0_1_1_2 + 0.0080357142857143*G0_1_0_1_2_0 + 0.0120535714285715*G0_1_0_1_2_1 + 0.0160714285714285*G0_1_0_1_2_2 + 0.00602678571428572*G0_1_0_2_0_0 + 0.0080357142857143*G0_1_0_2_0_1 + 0.00602678571428569*G0_1_0_2_0_2 + 0.0080357142857143*G0_1_0_2_1_0 + 0.0120535714285715*G0_1_0_2_1_1 + 0.0160714285714285*G0_1_0_2_1_2 + 0.00602678571428569*G0_1_0_2_2_0 + 0.0160714285714285*G0_1_0_2_2_1 + 0.018080357142857*G0_1_0_2_2_2; + A[20] = -A[21] - 0.0281249999999999*G0_1_0_0_0_0 - 0.00312499999999999*G0_1_0_0_0_1 + 0.000446428571428575*G0_1_0_0_0_2 - 0.00312499999999999*G0_1_0_0_1_0 + 0.00312499999999999*G0_1_0_0_1_1 + 0.000446428571428575*G0_1_0_0_2_0 + 0.00357142857142857*G0_1_0_0_2_2 - 0.00312499999999999*G0_1_0_1_0_0 + 0.00312499999999999*G0_1_0_1_0_1 + 0.00312499999999999*G0_1_0_1_1_0 + 0.0281249999999999*G0_1_0_1_1_1 - 0.000446428571428581*G0_1_0_1_1_2 - 0.000446428571428582*G0_1_0_1_2_1 - 0.00357142857142858*G0_1_0_1_2_2 + 0.000446428571428575*G0_1_0_2_0_0 + 0.00357142857142857*G0_1_0_2_0_2 - 0.000446428571428581*G0_1_0_2_1_1 - 0.00357142857142858*G0_1_0_2_1_2 + 0.00357142857142857*G0_1_0_2_2_0 - 0.00357142857142858*G0_1_0_2_2_1 - 0.0285714285714285*G0_1_1_0_0_0 - 0.00372023809523809*G0_1_1_0_0_1 - 0.000148809523809521*G0_1_1_0_0_2 - 0.00372023809523809*G0_1_1_0_1_0 - 0.000595238095238096*G0_1_1_0_1_1 - 0.000520833333333334*G0_1_1_0_1_2 - 0.000148809523809521*G0_1_1_0_2_0 - 0.000520833333333333*G0_1_1_0_2_1 - 0.000148809523809536*G0_1_1_0_2_2 - 0.00372023809523809*G0_1_1_1_0_0 - 0.000595238095238096*G0_1_1_1_0_1 - 0.000520833333333334*G0_1_1_1_0_2 - 0.000595238095238096*G0_1_1_1_1_0 - 0.000446428571428582*G0_1_1_1_1_1 - 0.000595238095238101*G0_1_1_1_1_2 - 0.000520833333333334*G0_1_1_1_2_0 - 0.000595238095238101*G0_1_1_1_2_1 - 0.00372023809523811*G0_1_1_1_2_2 - 0.000148809523809522*G0_1_1_2_0_0 - 0.000520833333333333*G0_1_1_2_0_1 - 0.000148809523809536*G0_1_1_2_0_2 - 0.000520833333333334*G0_1_1_2_1_0 - 0.000595238095238102*G0_1_1_2_1_1 - 0.00372023809523811*G0_1_1_2_1_2 - 0.000148809523809536*G0_1_1_2_2_0 - 0.00372023809523811*G0_1_1_2_2_1 - 0.0285714285714287*G0_1_1_2_2_2; + A[18] = -A[13] - 0.0575892857142857*G0_0_0_0_0_0 - 0.0116071428571428*G0_0_0_0_0_1 - 0.0191964285714285*G0_0_0_0_0_2 - 0.0116071428571428*G0_0_0_0_1_0 - 0.0160714285714285*G0_0_0_0_1_1 - 0.00580357142857141*G0_0_0_0_1_2 - 0.0191964285714285*G0_0_0_0_2_0 - 0.00580357142857141*G0_0_0_0_2_1 - 0.0191964285714285*G0_0_0_0_2_2 - 0.0116071428571428*G0_0_0_1_0_0 - 0.0160714285714285*G0_0_0_1_0_1 - 0.00580357142857141*G0_0_0_1_0_2 - 0.0160714285714285*G0_0_0_1_1_0 - 0.20625*G0_0_0_1_1_1 - 0.0160714285714285*G0_0_0_1_1_2 - 0.00580357142857141*G0_0_0_1_2_0 - 0.0160714285714285*G0_0_0_1_2_1 - 0.0116071428571428*G0_0_0_1_2_2 - 0.0191964285714285*G0_0_0_2_0_0 - 0.00580357142857141*G0_0_0_2_0_1 - 0.0191964285714285*G0_0_0_2_0_2 - 0.00580357142857141*G0_0_0_2_1_0 - 0.0160714285714285*G0_0_0_2_1_1 - 0.0116071428571428*G0_0_0_2_1_2 - 0.0191964285714285*G0_0_0_2_2_0 - 0.0116071428571428*G0_0_0_2_2_1 - 0.0575892857142857*G0_0_0_2_2_2; + A[88] = -A[83] + 0.247098214285714*G0_0_0_0_0_0 + 0.0743303571428571*G0_0_0_0_0_1 + 0.0602678571428571*G0_0_0_0_0_2 + 0.0743303571428571*G0_0_0_0_1_0 + 0.0763392857142857*G0_0_0_0_1_1 + 0.0220982142857142*G0_0_0_0_1_2 + 0.0602678571428571*G0_0_0_0_2_0 + 0.0220982142857142*G0_0_0_0_2_1 + 0.0381696428571428*G0_0_0_0_2_2 + 0.0743303571428571*G0_0_0_1_0_0 + 0.0763392857142857*G0_0_0_1_0_1 + 0.0220982142857142*G0_0_0_1_0_2 + 0.0763392857142857*G0_0_0_1_1_0 + 0.373660714285714*G0_0_0_1_1_1 + 0.032142857142857*G0_0_0_1_1_2 + 0.0220982142857142*G0_0_0_1_2_0 + 0.032142857142857*G0_0_0_1_2_1 + 0.0140625*G0_0_0_1_2_2 + 0.0602678571428571*G0_0_0_2_0_0 + 0.0220982142857142*G0_0_0_2_0_1 + 0.0381696428571428*G0_0_0_2_0_2 + 0.0220982142857142*G0_0_0_2_1_0 + 0.032142857142857*G0_0_0_2_1_1 + 0.0140625*G0_0_0_2_1_2 + 0.0381696428571428*G0_0_0_2_2_0 + 0.0140625*G0_0_0_2_2_1 + 0.0482142857142857*G0_0_0_2_2_2 - 0.0180803571428571*G0_1_0_0_0_0 - 0.0160714285714286*G0_1_0_0_0_1 - 0.00602678571428572*G0_1_0_0_0_2 - 0.0160714285714286*G0_1_0_0_1_0 - 0.0120535714285715*G0_1_0_0_1_1 - 0.00803571428571429*G0_1_0_0_1_2 - 0.00602678571428572*G0_1_0_0_2_0 - 0.00803571428571429*G0_1_0_0_2_1 - 0.0060267857142857*G0_1_0_0_2_2 - 0.0160714285714286*G0_1_0_1_0_0 - 0.0120535714285715*G0_1_0_1_0_1 - 0.00803571428571429*G0_1_0_1_0_2 - 0.0120535714285715*G0_1_0_1_1_0 + 0.289285714285714*G0_1_0_1_1_1 - 0.0120535714285714*G0_1_0_1_1_2 - 0.00803571428571429*G0_1_0_1_2_0 - 0.0120535714285715*G0_1_0_1_2_1 - 0.0160714285714285*G0_1_0_1_2_2 - 0.00602678571428572*G0_1_0_2_0_0 - 0.00803571428571429*G0_1_0_2_0_1 - 0.0060267857142857*G0_1_0_2_0_2 - 0.00803571428571429*G0_1_0_2_1_0 - 0.0120535714285714*G0_1_0_2_1_1 - 0.0160714285714285*G0_1_0_2_1_2 - 0.0060267857142857*G0_1_0_2_2_0 - 0.0160714285714285*G0_1_0_2_2_1 - 0.018080357142857*G0_1_0_2_2_2; + A[77] = A[88] + 0.325446428571428*G0_0_0_0_0_0 + 0.0120535714285714*G0_0_0_0_0_1 + 0.0241071428571428*G0_0_0_0_0_2 + 0.0120535714285714*G0_0_0_0_1_0 - 0.0120535714285714*G0_0_0_0_1_1 + 0.0241071428571428*G0_0_0_0_2_0 + 0.0120535714285714*G0_0_0_1_0_0 - 0.0120535714285714*G0_0_0_1_0_1 - 0.0120535714285714*G0_0_0_1_1_0 - 0.325446428571428*G0_0_0_1_1_1 - 0.0241071428571428*G0_0_0_1_1_2 - 0.0241071428571428*G0_0_0_1_2_1 + 0.0241071428571428*G0_0_0_2_0_0 - 0.0241071428571428*G0_0_0_2_1_1 - 0.0241071428571427*G0_0_1_0_0_0 + 0.0542410714285715*G0_0_1_0_0_1 + 0.00602678571428572*G0_0_1_0_0_2 + 0.0542410714285715*G0_0_1_0_1_0 + 0.0421875*G0_0_1_0_1_1 + 0.0120535714285714*G0_0_1_0_1_2 + 0.00602678571428572*G0_0_1_0_2_0 + 0.0120535714285714*G0_0_1_0_2_1 + 0.0060267857142857*G0_0_1_0_2_2 + 0.0542410714285715*G0_0_1_1_0_0 + 0.0421875*G0_0_1_1_0_1 + 0.0120535714285714*G0_0_1_1_0_2 + 0.0421875*G0_0_1_1_1_0 - 0.349553571428571*G0_0_1_1_1_1 - 0.0180803571428571*G0_0_1_1_1_2 + 0.0120535714285714*G0_0_1_1_2_0 - 0.0180803571428571*G0_0_1_1_2_1 + 0.0060267857142857*G0_0_1_1_2_2 + 0.00602678571428572*G0_0_1_2_0_0 + 0.0120535714285714*G0_0_1_2_0_1 + 0.0060267857142857*G0_0_1_2_0_2 + 0.0120535714285714*G0_0_1_2_1_0 - 0.0180803571428571*G0_0_1_2_1_1 + 0.0060267857142857*G0_0_1_2_1_2 + 0.0060267857142857*G0_0_1_2_2_0 + 0.0060267857142857*G0_0_1_2_2_1 + 0.0120535714285714*G0_0_1_2_2_2 - 0.0241071428571427*G0_1_0_0_0_0 + 0.0542410714285715*G0_1_0_0_0_1 + 0.00602678571428572*G0_1_0_0_0_2 + 0.0542410714285715*G0_1_0_0_1_0 + 0.0421875*G0_1_0_0_1_1 + 0.0120535714285714*G0_1_0_0_1_2 + 0.00602678571428572*G0_1_0_0_2_0 + 0.0120535714285714*G0_1_0_0_2_1 + 0.0060267857142857*G0_1_0_0_2_2 + 0.0542410714285715*G0_1_0_1_0_0 + 0.0421875*G0_1_0_1_0_1 + 0.0120535714285714*G0_1_0_1_0_2 + 0.0421875*G0_1_0_1_1_0 - 0.349553571428571*G0_1_0_1_1_1 - 0.0180803571428571*G0_1_0_1_1_2 + 0.0120535714285714*G0_1_0_1_2_0 - 0.0180803571428571*G0_1_0_1_2_1 + 0.0060267857142857*G0_1_0_1_2_2 + 0.00602678571428572*G0_1_0_2_0_0 + 0.0120535714285714*G0_1_0_2_0_1 + 0.0060267857142857*G0_1_0_2_0_2 + 0.0120535714285714*G0_1_0_2_1_0 - 0.0180803571428571*G0_1_0_2_1_1 + 0.0060267857142857*G0_1_0_2_1_2 + 0.0060267857142857*G0_1_0_2_2_0 + 0.0060267857142857*G0_1_0_2_2_1 + 0.0120535714285714*G0_1_0_2_2_2 + 0.229017857142857*G0_1_1_0_0_0 + 0.0964285714285714*G0_1_1_0_0_1 + 0.0361607142857142*G0_1_1_0_0_2 + 0.0964285714285714*G0_1_1_0_1_0 + 0.0120535714285714*G0_1_1_0_1_2 + 0.0361607142857142*G0_1_1_0_2_0 + 0.0120535714285714*G0_1_1_0_2_1 + 0.0120535714285714*G0_1_1_0_2_2 + 0.0964285714285714*G0_1_1_1_0_0 + 0.0120535714285714*G0_1_1_1_0_2 - 0.602678571428571*G0_1_1_1_1_1 - 0.0482142857142856*G0_1_1_1_1_2 + 0.0120535714285714*G0_1_1_1_2_0 - 0.0482142857142856*G0_1_1_1_2_1 + 0.0361607142857142*G0_1_1_2_0_0 + 0.0120535714285714*G0_1_1_2_0_1 + 0.0120535714285714*G0_1_1_2_0_2 + 0.0120535714285714*G0_1_1_2_1_0 - 0.0482142857142856*G0_1_1_2_1_1 + 0.0120535714285714*G0_1_1_2_2_0 + 0.0120535714285714*G0_1_1_2_2_2; + A[43] = -A[63] - 0.0180803571428571*G0_1_0_0_0_0 + 0.00602678571428571*G0_1_0_0_0_1 - 0.00803571428571428*G0_1_0_0_0_2 + 0.00602678571428571*G0_1_0_0_1_0 + 0.0180803571428571*G0_1_0_0_1_1 + 0.0200892857142857*G0_1_0_0_1_2 - 0.00803571428571428*G0_1_0_0_2_0 + 0.0200892857142857*G0_1_0_0_2_1 + 0.0120535714285714*G0_1_0_0_2_2 + 0.00602678571428571*G0_1_0_1_0_0 + 0.0180803571428571*G0_1_0_1_0_1 + 0.0200892857142857*G0_1_0_1_0_2 + 0.0180803571428571*G0_1_0_1_1_0 + 0.0904017857142858*G0_1_0_1_1_1 + 0.0883928571428571*G0_1_0_1_1_2 + 0.0200892857142857*G0_1_0_1_2_0 + 0.0883928571428571*G0_1_0_1_2_1 + 0.0843749999999999*G0_1_0_1_2_2 - 0.00803571428571428*G0_1_0_2_0_0 + 0.0200892857142857*G0_1_0_2_0_1 + 0.0120535714285714*G0_1_0_2_0_2 + 0.0200892857142857*G0_1_0_2_1_0 + 0.0883928571428571*G0_1_0_2_1_1 + 0.0843749999999999*G0_1_0_2_1_2 + 0.0120535714285714*G0_1_0_2_2_0 + 0.0843749999999999*G0_1_0_2_2_1 + 0.216964285714286*G0_1_0_2_2_2 - 0.00602678571428579*G0_1_1_0_0_0 - 0.0160714285714286*G0_1_1_0_0_1 - 0.00602678571428569*G0_1_1_0_0_2 - 0.0160714285714286*G0_1_1_0_1_0 - 0.0421874999999999*G0_1_1_0_1_1 - 0.00602678571428569*G0_1_1_0_2_0 - 0.00401785714285712*G0_1_1_0_2_2 - 0.0160714285714286*G0_1_1_1_0_0 - 0.0421874999999999*G0_1_1_1_0_1 - 0.0421874999999999*G0_1_1_1_1_0 - 0.241071428571428*G0_1_1_1_1_1 + 0.0180803571428572*G0_1_1_1_1_2 + 0.0180803571428572*G0_1_1_1_2_1 + 0.0160714285714286*G0_1_1_1_2_2 - 0.00602678571428569*G0_1_1_2_0_0 - 0.00401785714285712*G0_1_1_2_0_2 + 0.0180803571428572*G0_1_1_2_1_1 + 0.0160714285714286*G0_1_1_2_1_2 - 0.00401785714285712*G0_1_1_2_2_0 + 0.0160714285714286*G0_1_1_2_2_1 + 0.0120535714285713*G0_1_1_2_2_2; + A[95] = A[59] + 0.144642857142857*G0_0_1_0_0_0 + 0.0361607142857143*G0_0_1_0_0_1 - 0.0361607142857142*G0_0_1_0_0_2 + 0.0361607142857143*G0_0_1_0_1_0 + 0.0241071428571429*G0_0_1_0_1_1 - 0.0361607142857142*G0_0_1_0_2_0 - 0.0723214285714284*G0_0_1_0_2_2 + 0.0361607142857143*G0_0_1_1_0_0 + 0.0241071428571429*G0_0_1_1_0_1 + 0.0241071428571429*G0_0_1_1_1_0 + 0.0361607142857143*G0_0_1_1_1_1 + 0.0120535714285714*G0_0_1_1_1_2 + 0.0120535714285714*G0_0_1_1_2_1 - 0.0361607142857142*G0_0_1_2_0_0 - 0.0723214285714284*G0_0_1_2_0_2 + 0.0120535714285714*G0_0_1_2_1_1 - 0.0723214285714284*G0_0_1_2_2_0 - 0.0723214285714283*G0_0_1_2_2_2 - 0.144642857142857*G0_1_0_0_0_0 - 0.0361607142857143*G0_1_0_0_0_1 + 0.0361607142857142*G0_1_0_0_0_2 - 0.0361607142857143*G0_1_0_0_1_0 - 0.0241071428571429*G0_1_0_0_1_1 + 0.0361607142857142*G0_1_0_0_2_0 + 0.0723214285714284*G0_1_0_0_2_2 - 0.0361607142857143*G0_1_0_1_0_0 - 0.0241071428571429*G0_1_0_1_0_1 - 0.0241071428571429*G0_1_0_1_1_0 - 0.0361607142857143*G0_1_0_1_1_1 - 0.0120535714285714*G0_1_0_1_1_2 - 0.0120535714285714*G0_1_0_1_2_1 + 0.0361607142857142*G0_1_0_2_0_0 + 0.0723214285714284*G0_1_0_2_0_2 - 0.0120535714285714*G0_1_0_2_1_1 + 0.0723214285714284*G0_1_0_2_2_0 + 0.0723214285714282*G0_1_0_2_2_2; + A[52] = -A[32] + 0.0120535714285714*G0_0_1_0_0_0 + 0.00133928571428571*G0_0_1_0_0_1 + 0.00535714285714286*G0_0_1_0_0_2 + 0.00133928571428571*G0_0_1_0_1_0 - 0.00133928571428572*G0_0_1_0_1_1 + 0.00535714285714286*G0_0_1_0_2_0 - 0.00803571428571426*G0_0_1_0_2_2 + 0.00133928571428571*G0_0_1_1_0_0 - 0.00133928571428572*G0_0_1_1_0_1 - 0.00133928571428572*G0_0_1_1_1_0 - 0.0120535714285714*G0_0_1_1_1_1 - 0.00535714285714284*G0_0_1_1_1_2 - 0.00535714285714284*G0_0_1_1_2_1 + 0.0080357142857143*G0_0_1_1_2_2 + 0.00535714285714286*G0_0_1_2_0_0 - 0.00803571428571426*G0_0_1_2_0_2 - 0.00535714285714285*G0_0_1_2_1_1 + 0.0080357142857143*G0_0_1_2_1_2 - 0.00803571428571426*G0_0_1_2_2_0 + 0.0080357142857143*G0_0_1_2_2_1 + 0.0629464285714284*G0_1_1_0_0_0 + 0.0142857142857143*G0_1_1_0_0_1 + 0.00580357142857142*G0_1_1_0_0_2 + 0.0142857142857143*G0_1_1_0_1_0 + 0.0129464285714285*G0_1_1_0_1_1 + 0.00223214285714285*G0_1_1_0_1_2 + 0.00580357142857142*G0_1_1_0_2_0 + 0.00223214285714285*G0_1_1_0_2_1 + 0.00267857142857147*G0_1_1_0_2_2 + 0.0142857142857143*G0_1_1_1_0_0 + 0.0129464285714285*G0_1_1_1_0_1 + 0.00223214285714285*G0_1_1_1_0_2 + 0.0129464285714285*G0_1_1_1_1_0 + 0.050892857142857*G0_1_1_1_1_1 + 0.00044642857142857*G0_1_1_1_1_2 + 0.00223214285714285*G0_1_1_1_2_0 + 0.00044642857142857*G0_1_1_1_2_1 + 0.0107142857142858*G0_1_1_1_2_2 + 0.00580357142857142*G0_1_1_2_0_0 + 0.00223214285714285*G0_1_1_2_0_1 + 0.00267857142857147*G0_1_1_2_0_2 + 0.00223214285714285*G0_1_1_2_1_0 + 0.000446428571428571*G0_1_1_2_1_1 + 0.0107142857142858*G0_1_1_2_1_2 + 0.00267857142857147*G0_1_1_2_2_0 + 0.0107142857142858*G0_1_1_2_2_1 + 0.107142857142858*G0_1_1_2_2_2; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p1_q3_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p1_q3_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q3_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q3_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q3_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q3_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q3_tensor_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q3_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q3_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q3_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q3_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q3_tensor_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q3_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q3_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p1_q4_quadrature.h b/laplacian_2d/laplacian_f3_p1_q4_quadrature.h new file mode 100644 index 0000000..599f70d --- /dev/null +++ b/laplacian_2d/laplacian_f3_p1_q4_quadrature.h @@ -0,0 +1,6526 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P1_Q4_QUADRATURE_H +#define __LAPLACIAN_F3_P1_Q4_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q4_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q4_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q4_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q4_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q4_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q4_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q4_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q4_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q4_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q4_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q4_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q4_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p1_q4_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p1_q4_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W25[25] = {0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0275289856644697, 0.0475518970579538, 0.0416389652151948, 0.021022967487322, 0.00447940679728133, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783}; + // Quadrature points on the UFC reference element: (0.0450425935698037, 0.0398098570514687), (0.0376212523451112, 0.198013417873608), (0.0263646449444709, 0.437974810247386), (0.0142857943955714, 0.695464273353636), (0.00462228846504642, 0.901464914201174), (0.221578609552379, 0.0398098570514687), (0.185070710267389, 0.198013417873608), (0.129695936782254, 0.437974810247386), (0.0702762920082817, 0.695464273353636), (0.022738483063764, 0.901464914201174), (0.480095071474266, 0.0398098570514687), (0.400993291063196, 0.198013417873608), (0.281012594876307, 0.437974810247386), (0.152267863323182, 0.695464273353636), (0.0492675428994132, 0.901464914201174), (0.738611533396152, 0.0398098570514687), (0.616915871859002, 0.198013417873608), (0.43232925297036, 0.437974810247386), (0.234259434638082, 0.695464273353636), (0.0757966027350624, 0.901464914201174), (0.915147549378728, 0.0398098570514687), (0.764365329781281, 0.198013417873608), (0.535660544808143, 0.437974810247386), (0.290249932250792, 0.695464273353636), (0.09391279733378, 0.901464914201174) + + // Value of basis functions at quadrature points. + static const double FE0[25][3] = \ + {{0.915147549378728, 0.0450425935698037, 0.0398098570514687}, + {0.764365329781281, 0.0376212523451112, 0.198013417873608}, + {0.535660544808143, 0.026364644944471, 0.437974810247386}, + {0.290249932250793, 0.0142857943955714, 0.695464273353636}, + {0.0939127973337801, 0.00462228846504648, 0.901464914201173}, + {0.738611533396152, 0.221578609552379, 0.0398098570514687}, + {0.616915871859002, 0.185070710267389, 0.198013417873608}, + {0.43232925297036, 0.129695936782254, 0.437974810247386}, + {0.234259434638082, 0.0702762920082818, 0.695464273353636}, + {0.0757966027350624, 0.0227384830637641, 0.901464914201173}, + {0.480095071474266, 0.480095071474266, 0.0398098570514687}, + {0.400993291063196, 0.400993291063196, 0.198013417873608}, + {0.281012594876307, 0.281012594876307, 0.437974810247386}, + {0.152267863323182, 0.152267863323182, 0.695464273353636}, + {0.0492675428994133, 0.0492675428994133, 0.901464914201173}, + {0.221578609552379, 0.738611533396152, 0.0398098570514687}, + {0.185070710267389, 0.616915871859002, 0.198013417873608}, + {0.129695936782254, 0.43232925297036, 0.437974810247386}, + {0.0702762920082818, 0.234259434638082, 0.695464273353636}, + {0.0227384830637641, 0.0757966027350624, 0.901464914201173}, + {0.0450425935698037, 0.915147549378728, 0.0398098570514687}, + {0.0376212523451112, 0.764365329781281, 0.198013417873608}, + {0.026364644944471, 0.535660544808143, 0.437974810247386}, + {0.0142857943955715, 0.290249932250793, 0.695464273353636}, + {0.00462228846504648, 0.0939127973337801, 0.901464914201173}}; + + static const double FE1_D01[25][14] = \ + {{-4.92348092472479, -0.489501772856739, 0.179203488876249, 0.100666813761961, 0.134603486992305, 8.63375492668695, -5.79126584504057, 2.57049361593515, -2.43064495934601, 0.933695301413292, -0.179203488876251, 3.14676539989352, -1.03436211517524, -0.850723927539827}, + {-1.22072339702365, 0.353412468851741, 0.157627099145873, -0.0746718571074941, -0.0873088916887541, -1.74300688822412, 4.51684211570302, -1.90652429930699, -1.17372701640678, 0.653887982994551, -0.157627099145872, 0.673966720836549, -0.579216125887057, 0.587069187258981}, + {0.358599061347387, -0.199260154242238, 0.11915032151674, -0.236201006974522, 0.0489368169731712, -3.17391758456232, 1.80243660692675, 1.21214207053042, -0.205074293683275, 0.309924093033935, -0.119150321516738, -0.697548150238492, -0.0737230860594163, 0.853685626948599}, + {-0.256528017544188, 0.335981245709448, 0.0697846126615126, -0.245883039206206, 0.324765406089899, 1.6058038662832, -5.69992944155756, 4.01467234710911, 0.0351330450820346, 0.0712264684545085, -0.0697846126615112, -0.398938571740192, 0.174656570751691, 0.0390401205682623}, + {0.0106140386976448, 4.47094346923701, 0.023972721189482, -0.112725965267303, 0.238775264288607, -0.15332389817035, 0.879973096214445, -5.20820670597875, -0.00208846471084578, -0.00451319159940933, -0.0239727211894847, 0.0244881945022275, 0.117239156866706, -0.261174994079983}, + {-0.839131599831696, -0.48950177285674, 0.0748108288829812, 0.0686708574696078, 0.662156663835007, 2.56379098442514, -3.27809805082916, 2.04294043909245, -6.18031729659934, 0.494625653780274, -0.0748108288829797, 8.85005639822322, -0.563296511249881, -3.33189576545889}, + {0.202323839685595, 0.353412468851741, 0.161465637815132, -0.112302905481113, -0.429499753205215, -1.75503086478979, 2.76362799404298, -1.56433343779053, -2.69567005199158, 0.756622320539373, -0.161465637815132, 0.747255447904154, -0.644319415058259, 2.37791435729265}, + {0.183058222345733, -0.199260154242238, 0.246520964624723, -0.625066207389066, 0.240735512799229, -0.923343083643203, -0.080798359164653, 1.02034337470436, -0.206029746712401, 0.613791028172696, -0.246520964624722, -3.16049155954138, 0.0112751792163715, 3.12578579345455}, + {-0.350190108838501, 0.335981245709448, 0.231575301617104, -0.922258421214661, 1.59762263690684, 1.87432390421406, -4.60193015737717, 2.74181511629217, 0.1851747050734, 0.176637588713045, -0.231575301617103, -1.40021356037656, 0.745620832501613, -0.38258378160367}, + {0.145502825089315, 4.47094346923701, 0.105228292166946, -0.513593117920688, 1.17461022697504, -0.858753730257821, 2.38634910459668, -6.14404166866518, -0.0276892592294179, -0.0325456124950437, -0.105228292166949, 0.219762882063215, 0.546138730415726, -1.36668384980883}, + {0.300790618534486, -0.48950177285674, -0.0938175098322176, -1.20457509757173, 1.43469692987617, -0.25744128910517, -0.824247729623862, 1.27040017305129, -1.97325425970202, -5.02098794019842, 0.0938175098322148, 5.0510574614487, 6.22556303777016, -4.51250013162285}, + {0.0858949745717573, 0.353412468851741, -0.255769112851834, 0.565857929720685, -0.9305984685516, -0.305589684505477, 0.92951696352612, -1.06323472244414, -0.100890713389922, -2.13896290361542, 0.255769112851833, -2.50237537066618, 1.57310497389473, 3.5338645526077}, + {-0.277867342742944, -0.199260154242238, -0.0814276204367423, 0.349126846459827, 0.521602394099412, 1.03258701566852, -1.29493601208752, 0.739476493404178, 0.714772028659139, -0.174033767171633, 0.0814276204367425, -4.60210481528708, -0.175093079288193, 3.36573039252853}, + {-0.270988583314474, 0.335981245709448, 0.22078989418089, -1.08663594700873, 3.46157400122766, 1.2250859535242, -2.16794236789051, 0.877863751971334, 0.219884789139037, 0.0519405716871661, -0.22078989418089, -1.02926474507045, 1.03469537532157, -2.65219404529625}, + {0.388816964556487, 4.47094346923701, 0.190189287582516, -0.982902206430993, 2.54503167978712, -2.05527310001484, 4.70997578769861, -7.51446312147727, -0.122720710220877, -0.0958673055551886, -0.19018928758252, 0.798690474834211, 1.07876951198618, -3.22100144440045}, + {-0.3573245679932, -0.489501772856741, 3.67417591105398, -3.93531150769328, 2.20723719591734, 0.176854297338599, 0.172112136501218, 0.497859907010124, 1.89326182738164, -4.4613954198682, -3.67417591105398, -1.32237543567259, 8.39670692756148, -2.77812358762638}, + {-0.340773582195419, 0.353412468851741, 1.12915777685523, 2.11546133033649, -1.43169718389799, 0.582648622018157, -0.033151501576722, -0.562136007097758, 1.31220636814439, -1.74046453867549, -1.12915777685523, -2.82743880134114, -0.374996791661011, 2.94692961709474}, + {-0.187879798307207, -0.199260154242237, -0.227593922486541, 3.15784151189363, 0.802469275399596, 0.603082393870928, -0.674552053425481, 0.458609612103994, 0.351965301970183, -0.0473808869682165, 0.227593922486542, -1.09106634580247, -3.11046062492541, -0.063368231567311}, + {0.191532755133864, 0.335981245709449, 0.0418084423543278, -0.269250078420215, 5.32552536554849, -0.789235204472549, 1.24780881597873, -0.986087612349495, -0.343848708253603, -0.0258287211950972, -0.0418084423543293, 1.90365444045913, 0.295078799615313, -6.88533109775401}, + {0.690818483697246, 4.47094346923701, 0.238984215828931, -1.3123152230897, 3.9154531325992, -3.45037592129704, 7.17349854265214, -8.88488457428935, -0.298960853390353, -0.172833753280059, -0.238984215828935, 1.73861890348643, 1.48514897636976, -5.35511118269528}, + {0.432860334906831, -0.489501772856743, 10.7820243913322, -6.63755958969328, 2.73479037276005, 0.0713069027774886, 0.0150278050049932, -0.0296932698325705, -2.4803228061571, 6.22985279104878, -10.7820243913322, -0.335676392472756, 0.40770679864449, 0.081208825869822}, + {0.513886950347987, 0.353412468851742, 4.43471670367803, 3.6743905576189, -1.77388804541445, -0.457548926037692, -0.189805347580739, -0.219945145581301, -2.37468364726229, 4.39732387101058, -4.43471670367803, 2.60391745686038, -8.07171442862948, 1.54465423581636}, + {0.645901171050298, -0.199260154242236, 0.232818028669783, 6.1299830446049, 0.994267971225654, -1.51667164669493, 0.803219713608937, 0.266810916277931, -2.0006750758256, 1.93189047262638, -0.232818028669786, 5.51968863591294, -8.06187351723128, -4.51328153131299}, + {0.800146649057353, 0.33598124570945, -0.104550979384442, 0.853052384530374, 6.59838259636543, -3.02166899671853, 4.14448594511816, -2.25894484316643, -1.29020890800348, 0.165558162892518, 0.10455097938444, 5.59613700148209, -1.01861054742289, -10.904310689844}, + {0.933227768613883, 4.47094346923701, 0.253980335569297, -1.45688033140528, 4.85128809528563, -4.51962829624728, 8.93617659537217, -9.82071953697578, -0.473343193721761, -0.225864578124923, -0.253980335569301, 2.59527922553586, 1.6827449095302, -6.97322412709974}}; + + // Array of non-zero columns + static const unsigned int nzc0[14] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + static const double FE1_D10[25][14] = \ + {{-4.92348092472479, -0.432860334906833, 0.107896586098764, 0.0856390087569554, 0.164296756824886, -2.14826946464529, 0.846293744652697, -0.164296756824886, 8.35137943198624, -5.29615748963549, 2.30111931728087, 2.73905860124902, -0.698685722702495, -0.931932753409652}, + {-1.22072339702365, -0.513886950347988, 0.61517602518356, 0.115133490473251, 0.132636253892541, -6.17772359190216, 0.842451558084123, -0.132636253892543, 3.26098968727126, -3.74343588801603, 2.21705654811641, 8.74568114946603, -3.18313358274743, -0.957585048557372}, + {0.358599061347386, -0.645901171050299, 1.63582196821167, -1.03942072058345, -0.217874099304767, -3.4067356132321, -4.32754643767815, 0.217874099304766, 0.0277437349865084, -1.62196637959246, 1.88152475430886, 7.3643253669928, -5.59341172197236, 5.3669671582616}, + {-0.256528017544188, -0.800146649057355, 3.09145360938005, -4.39036898432437, 2.58371024925633, 1.71035484566764, -6.55298182608794, -2.58371024925633, -0.0694179343024073, -0.0943316944380133, 1.22042429534196, 0.619671975682703, -5.42148043073039, 10.9433508104123}, + {0.0106140386976428, -0.93322776861388, 4.54360101743677, -9.04890256063947, 10.0594948012644, -0.407304233739641, 2.33685342761973, -10.0594948012644, 0.251891870858455, 0.221351386525507, 0.449370472532274, -1.65825671502798, -2.47804006866914, 6.71204913301973}, + {-0.839131599831697, 0.357324567993201, -0.102043468455618, -0.103441279031611, 0.164296756824885, -1.11038492662884, 0.657213456864125, -0.164296756824885, -2.50614138554535, 4.95602107364847, -1.96807265626462, 0.453349470661745, 0.759078924422711, -0.553772177832514}, + {0.202323839685595, 0.340773582195419, -0.421182984203023, -0.0791514039043915, 0.132636253892542, -2.88418864164502, 0.648166663706482, -0.132636253892543, -1.56651227513635, 2.49708685921486, -1.47367200595952, 1.12225223956517, 2.18311938628288, -0.56901525980209}, + {0.183058222345733, 0.187879798307206, -0.356561429246204, 0.0494858460364144, -0.217874099304766, -0.695749161156662, -3.23863987105828, 0.217874099304766, -0.433623669198942, 0.661171915140911, -0.598486266594907, -0.0500309346159661, 1.10234152501883, 3.18915402502186}, + {-0.350190108838501, -0.191532755133865, 1.02081050608965, -2.17006723719339, 2.58371024925633, 1.83251546185973, -4.33268007895696, -2.58371024925633, 0.22698314742773, 0.202466309908141, 0.112273406636495, -1.69529235999188, -1.15803360795751, 6.50274731615034}, + {0.145502825089312, -0.690818483697242, 3.55560421346399, -7.68709166057282, 10.0594948012644, -1.09773794608675, 3.69866432768638, -10.0594948012644, 0.211294956599518, 0.140288140785009, 0.193732561223402, -1.26538609430655, -1.19248017307069, 3.98842733288643}, + {0.300790618534486, -0.300790618534487, 0.163623779272956, -0.380327367947866, 0.164296756824884, -0.163623779272954, 0.38032736794787, -0.164296756824884, -2.06707176953424, 0.0, 2.06707176953424, -1.17450557632146, 1.17450557632145, 0.0}, + {0.085894974571757, -0.0858949745717575, 0.0498205716536449, -0.363659033805437, 0.132636253892543, -0.0498205716536459, 0.363659033805436, -0.132636253892543, -0.356659826241754, 0.0, 0.356659826241756, -4.07548034456091, 4.07548034456091, 0.0}, + {-0.277867342742944, 0.277867342742944, -1.11401463610527, 1.64406285854735, -0.217874099304766, 1.11401463610526, -1.64406285854735, 0.217874099304766, 0.633344408222398, 0.0, -0.633344408222397, -4.42701173599888, 4.42701173599888, 0.0}, + {-0.270988583314474, 0.270988583314474, -1.00429605934332, 1.08130642088178, 2.58371024925633, 1.00429605934331, -1.08130642088178, -2.58371024925633, 0.440674683319929, 0.0, -0.44067468331993, -2.06396012039201, 2.06396012039201, 0.0}, + {0.388816964556484, -0.388816964556484, 2.24546238759736, -5.6928779941296, 10.0594948012644, -2.24546238759735, 5.6928779941296, -10.0594948012644, 0.0674685773616459, 0.0, -0.0674685773616422, -0.280079037151977, 0.280079037151975, -1.6970983117735e-14}, + {-0.357324567993201, 0.839131599831695, 1.11038492662884, -0.657213456864119, 0.164296756824883, 0.102043468455623, 0.103441279031613, -0.164296756824883, 1.96807265626462, -4.95602107364847, 2.50614138554536, -0.759078924422717, -0.453349470661745, 0.553772177832506}, + {-0.340773582195419, -0.202323839685595, 2.88418864164502, -0.648166663706484, 0.132636253892543, 0.421182984203023, 0.0791514039043915, -0.132636253892543, 1.47367200595952, -2.49708685921486, 1.56651227513635, -2.18311938628288, -1.12225223956516, 0.569015259802091}, + {-0.187879798307206, -0.183058222345732, 0.695749161156661, 3.23863987105828, -0.217874099304765, 0.356561429246203, -0.0494858460364157, 0.217874099304765, 0.598486266594908, -0.661171915140912, 0.433623669198941, -1.10234152501884, 0.0500309346159713, -3.18915402502186}, + {0.191532755133864, 0.3501901088385, -1.83251546185973, 4.33268007895695, 2.58371024925633, -1.02081050608966, 2.17006723719339, -2.58371024925633, -0.112273406636495, -0.202466309908141, -0.22698314742773, 1.15803360795751, 1.69529235999188, -6.50274731615035}, + {0.690818483697243, -0.145502825089313, 1.09773794608676, -3.69866432768638, 10.0594948012644, -3.55560421346399, 7.68709166057283, -10.0594948012644, -0.1937325612234, -0.140288140785019, -0.211294956599513, 1.1924801730707, 1.26538609430654, -3.98842733288646}, + {0.432860334906832, 4.92348092472478, 2.14826946464528, -0.846293744652684, 0.164296756824883, -0.10789658609876, -0.0856390087569605, -0.164296756824883, -2.30111931728086, 5.29615748963548, -8.35137943198624, 0.6986857227025, -2.73905860124902, 0.931932753409644}, + {0.513886950347989, 1.22072339702365, 6.17772359190216, -0.84245155808413, 0.132636253892544, -0.615176025183567, -0.115133490473247, -0.132636253892544, -2.21705654811641, 3.74343588801603, -3.26098968727125, 3.18313358274743, -8.74568114946602, 0.957585048557374}, + {0.645901171050299, -0.358599061347386, 3.40673561323211, 4.32754643767814, -0.217874099304764, -1.63582196821167, 1.03942072058346, 0.217874099304764, -1.88152475430886, 1.62196637959245, -0.0277437349865067, 5.59341172197235, -7.36432536699278, -5.3669671582616}, + {0.800146649057353, 0.256528017544187, -1.71035484566764, 6.55298182608793, 2.58371024925633, -3.09145360938005, 4.39036898432437, -2.58371024925633, -1.22042429534196, 0.0943316944380134, 0.0694179343024074, 5.42148043073038, -0.619671975682697, -10.9433508104123}, + {0.93322776861388, -0.0106140386976432, 0.407304233739652, -2.33685342761973, 10.0594948012644, -4.54360101743676, 9.04890256063948, -10.0594948012644, -0.449370472532272, -0.221351386525517, -0.25189187085845, 2.47804006866915, 1.65825671502797, -6.71204913301977}}; + + // Array of non-zero columns + static const unsigned int nzc1[14] = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 225; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 59550 + for (unsigned int ip = 0; ip < 25; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + double F2 = 0.0; + + // Total number of operations to compute function values = 18 + for (unsigned int r = 0; r < 3; r++) + { + F0 += FE0[ip][r]*w[2][r]; + F1 += FE0[ip][r]*w[0][r]; + F2 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 12 + double I[3]; + // Number of operations: 4 + I[0] = F0*F1*F2*G[0]*W25[ip]; + + // Number of operations: 4 + I[1] = F0*F1*F2*G[1]*W25[ip]; + + // Number of operations: 4 + I[2] = F0*F1*F2*G[2]*W25[ip]; + + + // Number of operations for primary indices: 2352 + for (unsigned int j = 0; j < 14; j++) + { + for (unsigned int k = 0; k < 14; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*15 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*15 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p1_q4_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p1_q4_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q4_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q4_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q4_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q4_quadrature_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q4_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q4_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q4_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q4_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q4_quadrature_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q4_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q4_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p1_q4_tensor.h b/laplacian_2d/laplacian_f3_p1_q4_tensor.h new file mode 100644 index 0000000..2c340b8 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p1_q4_tensor.h @@ -0,0 +1,6708 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P1_Q4_TENSOR_H +#define __LAPLACIAN_F3_P1_Q4_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q4_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q4_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q4_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p1_q4_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p1_q4_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 15; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Compute value(s). + for (unsigned int r = 0; r < 15; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 15; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, -0.0412393049421161, -0.0238095238095238, 0.0289800294976278, 0.0224478343233825, 0.012960263189329, -0.0395942580610999, -0.0334632556631574, -0.025920526378658, -0.014965222882255, 0.0321247254366312, 0.0283313448138523, 0.023944356611608, 0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0412393049421161, -0.0238095238095238, 0.0289800294976278, -0.0224478343233825, 0.012960263189329, 0.0395942580610999, -0.0334632556631574, 0.025920526378658, -0.014965222882255, 0.0321247254366312, -0.0283313448138523, 0.023944356611608, -0.0185472188784818, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.0, 0.0, 0.0476190476190476, 0.0, 0.0, 0.038880789567987, 0.0, 0.0, 0.0, 0.0598608915290199, 0.0, 0.0, 0.0, 0.0, 0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.131965775814772, -0.0253968253968253, 0.139104141588614, -0.0718330698348239, 0.0311046316543896, 0.0633508128977599, 0.0267706045305259, -0.0622092633087791, 0.0478887132232159, 0.0, 0.0566626896277046, -0.0838052481406279, 0.0834624849531682, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527355, 0.0109971479845642, 0.00634920634920636, 0.0, 0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.0, 0.0, 0.0838052481406279, -0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, 0.0439885919382572, 0.126984126984127, 0.0, 0.035916534917412, 0.155523158271948, 0.0, 0.0, 0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, 0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, -0.131965775814772, -0.0253968253968254, 0.139104141588614, 0.0718330698348239, 0.0311046316543895, -0.0633508128977599, 0.0267706045305259, 0.0622092633087791, 0.0478887132232159, 0.0, -0.0566626896277046, -0.0838052481406278, -0.0834624849531681, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527353, -0.0109971479845644, 0.00634920634920625, 0.0, -0.188561808316413, -0.163299316185545, 0.0, 0.0936971158568409, 0.0, -0.0419026240703138, 0.0, 0.0, 0.0838052481406278, 0.139104141588614, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0439885919382572, 0.126984126984127, 0.0, -0.0359165349174119, 0.155523158271948, 0.0, 0.0, -0.103682105514632, -0.011972178305804, 0.0, 0.0, 0.0, -0.0927360943924091, -0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210942, -0.0879771838765144, -0.101587301587302, 0.0927360943924091, 0.107749604752236, 0.0725774738602423, 0.0791885161221998, -0.013385302265263, -0.0518410527573159, -0.0419026240703139, -0.128498901746525, -0.0566626896277046, -0.011972178305804, 0.00927360943924089, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 10: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {-0.0314269680527354, 0.0, -0.0126984126984126, -0.243432247780074, 0.0, 0.0544331053951817, 0.0, 0.0936971158568408, 0.0, -0.0419026240703139, 0.192748352619787, 0.0, -0.023944356611608, 0.0, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 11: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.125707872210941, 0.0879771838765144, -0.101587301587302, 0.0927360943924091, -0.107749604752236, 0.0725774738602423, -0.0791885161221998, -0.013385302265263, 0.051841052757316, -0.0419026240703139, -0.128498901746525, 0.0566626896277046, -0.011972178305804, -0.00927360943924091, 0.0107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 12: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, -0.351908735506058, -0.203174603174603, -0.139104141588614, -0.107749604752236, -0.0622092633087791, 0.19005243869328, -0.0267706045305259, 0.124418526617558, 0.155638317975452, 0.0, 0.169988068883114, 0.0838052481406278, -0.0278208283177227, -0.053541209061052}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 13: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421884, 0.351908735506058, -0.203174603174603, -0.139104141588614, 0.107749604752236, -0.0622092633087792, -0.19005243869328, -0.0267706045305259, -0.124418526617558, 0.155638317975452, 0.0, -0.169988068883114, 0.0838052481406278, 0.0278208283177227, -0.0535412090610519}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 14: + { + + // Array of basisvalues. + double basisvalues[15] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[10] = basisvalues[6]*1.75*tmp0 - basisvalues[3]*0.75*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[11] = basisvalues[6]*(3.5 + 4.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[14] = basisvalues[9]*(0.0285714285714286 + Y*1.8) - basisvalues[5]*0.771428571428571; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[13] = basisvalues[8]*(0.285714285714286 + Y*2.0) - basisvalues[4]*0.714285714285714; + basisvalues[12] = basisvalues[7]*(1.02040816326531 + Y*2.57142857142857) - basisvalues[3]*0.551020408163265; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[14] *= std::sqrt(2.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[13] *= std::sqrt(7.5); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[12] *= std::sqrt(12.5); + basisvalues[6] *= std::sqrt(14.0); + basisvalues[11] *= std::sqrt(17.5); + basisvalues[10] *= std::sqrt(22.5); + + // Table(s) of coefficients. + static const double coefficients0[15] = \ + {0.251415744421883, 0.0, 0.406349206349206, 0.0, 0.0, -0.186627789926337, 0.0, -0.187394231713682, 0.0, -0.203527031198668, 0.0, 0.0, -0.167610496281256, 0.0, 0.107082418122104}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050513, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.61101009266078, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 1.36319883402694e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 10.9544511501033, 0.0, 0.0, -3.83325938999965, 0.0, 17.7482393492989, 0.0, 0.553283335172492, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.73286382647969, 0.0, 3.3466401061363, 4.36435780471985, 0.0, -5.07468037933237, 0.0, 17.0084012854152, 0.0, 1.52127765851133, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 2.44948974278318, 0.0, 0.0, 9.14285714285714, 0.0, 0.0, 0.0, 14.8461497791618, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.09838667696593, 0.0, 7.66811580507233, 0.0, 0.0, 10.733126291999, 0.0, 0.0, 0.0, 9.2951600308978, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[15][15] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175278, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.0, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470958, 6.83130051063974, -1.05830052442584, 0.305505046330393, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865477, 6.26099033699942, -1.80739222823013, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238572, 4.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.8284271247462, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.68328157299975, 5.47722557505166, -1.89736659610103, 7.4230748895809, -1.91662969499982, 0.663940002206988, 8.87411967464942, -1.07142857142857, 0.276641667586246, -0.0958314847499898, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.36643191323985, 2.89827534923789, 1.67332005306816, 2.18217890235992, 5.74704893215391, -2.53734018966618, 10.0623058987491, 8.50420064270762, -2.1957751641342, 0.760638829255666, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 1.22474487139159, 3.53553390593274, -7.37711113563318, 4.57142857142858, 1.64957219768465, 0.0, 11.4997781699989, 7.42307488958091, -2.57142857142857, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.54919333848296, 6.64078308635359, 3.83405790253616, 0.0, -6.19677335393187, 5.36656314599949, 0.0, 0.0, 13.4164078649987, 4.6475800154489, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-3.57770876399967, 0.0, 8.85437744847147, 0.0, 0.0, -3.09838667696593, 0.0, 0.0, 0.0, 16.0996894379985, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[15][15] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; t++) + { + for (unsigned int u = 0; u < 15; u++) + { + for (unsigned int tu = 0; tu < 15; 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 < 15; s++) + { + for (unsigned int t = 0; t < 15; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 15; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 10: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 11: + { + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 12: + { + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 13: + { + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 14: + { + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.75*x[1][0] + 0.25*x[2][0]; + y[1] = 0.75*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.25*x[1][0] + 0.75*x[2][0]; + y[1] = 0.25*x[1][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[2][0]; + y[1] = 0.75*x[0][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[2][0]; + y[1] = 0.25*x[0][1] + 0.75*x[2][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.75*x[0][0] + 0.25*x[1][0]; + y[1] = 0.75*x[0][1] + 0.25*x[1][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[10] = vals[0]; + y[0] = 0.25*x[0][0] + 0.75*x[1][0]; + y[1] = 0.25*x[0][1] + 0.75*x[1][1]; + f.evaluate(vals, y, c); + values[11] = vals[0]; + y[0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + y[1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[12] = vals[0]; + y[0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + y[1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + f.evaluate(vals, y, c); + values[13] = vals[0]; + y[0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + y[1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[14] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p1_q4_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q4_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q4_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q4_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p1_q4_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p1_q4_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 3*m.num_entities[1] + 3*m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 15; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 15; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 5; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 3; + break; + } + case 2: + { + return 3; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 3*c.entity_indices[1][0]; + dofs[4] = offset + 3*c.entity_indices[1][0] + 1; + dofs[5] = offset + 3*c.entity_indices[1][0] + 2; + dofs[6] = offset + 3*c.entity_indices[1][1]; + dofs[7] = offset + 3*c.entity_indices[1][1] + 1; + dofs[8] = offset + 3*c.entity_indices[1][1] + 2; + dofs[9] = offset + 3*c.entity_indices[1][2]; + dofs[10] = offset + 3*c.entity_indices[1][2] + 1; + dofs[11] = offset + 3*c.entity_indices[1][2] + 2; + offset += 3*m.num_entities[1]; + dofs[12] = offset + 3*c.entity_indices[2][0]; + dofs[13] = offset + 3*c.entity_indices[2][0] + 1; + dofs[14] = offset + 3*c.entity_indices[2][0] + 2; + offset += 3*m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + dofs[4] = 5; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 6; + dofs[3] = 7; + dofs[4] = 8; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 9; + dofs[3] = 10; + dofs[4] = 11; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + dofs[2] = 5; + break; + } + case 1: + { + dofs[0] = 6; + dofs[1] = 7; + dofs[2] = 8; + break; + } + case 2: + { + dofs[0] = 9; + dofs[1] = 10; + dofs[2] = 11; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 12; + dofs[1] = 13; + dofs[2] = 14; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.75*x[1][0] + 0.25*x[2][0]; + coordinates[3][1] = 0.75*x[1][1] + 0.25*x[2][1]; + coordinates[4][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.25*x[1][0] + 0.75*x[2][0]; + coordinates[5][1] = 0.25*x[1][1] + 0.75*x[2][1]; + coordinates[6][0] = 0.75*x[0][0] + 0.25*x[2][0]; + coordinates[6][1] = 0.75*x[0][1] + 0.25*x[2][1]; + coordinates[7][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[7][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[8][0] = 0.25*x[0][0] + 0.75*x[2][0]; + coordinates[8][1] = 0.25*x[0][1] + 0.75*x[2][1]; + coordinates[9][0] = 0.75*x[0][0] + 0.25*x[1][0]; + coordinates[9][1] = 0.75*x[0][1] + 0.25*x[1][1]; + coordinates[10][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[10][1] = 0.5*x[0][1] + 0.5*x[1][1]; + coordinates[11][0] = 0.25*x[0][0] + 0.75*x[1][0]; + coordinates[11][1] = 0.25*x[0][1] + 0.75*x[1][1]; + coordinates[12][0] = 0.5*x[0][0] + 0.25*x[1][0] + 0.25*x[2][0]; + coordinates[12][1] = 0.5*x[0][1] + 0.25*x[1][1] + 0.25*x[2][1]; + coordinates[13][0] = 0.25*x[0][0] + 0.5*x[1][0] + 0.25*x[2][0]; + coordinates[13][1] = 0.25*x[0][1] + 0.5*x[1][1] + 0.25*x[2][1]; + coordinates[14][0] = 0.25*x[0][0] + 0.25*x[1][0] + 0.5*x[2][0]; + coordinates[14][1] = 0.25*x[0][1] + 0.25*x[1][1] + 0.5*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p1_q4_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p1_q4_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p1_q4_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 378 + // Number of operations (multiply-add pairs) for tensor contraction: 13986 + // Total number of operations (multiply-add pairs): 14375 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[108] = -0.0166233766233765*G0_0_0_0_0_0 + 0.00107744107744108*G0_0_0_0_0_1 - 0.0217027417027416*G0_0_0_0_0_2 + 0.00107744107744108*G0_0_0_0_1_0 + 0.00256533589866922*G0_0_0_0_1_1 + 0.00143658810325478*G0_0_0_0_1_2 - 0.0217027417027416*G0_0_0_0_2_0 + 0.00143658810325478*G0_0_0_0_2_1 - 0.0322206188872854*G0_0_0_0_2_2 + 0.00107744107744108*G0_0_0_1_0_0 + 0.00256533589866922*G0_0_0_1_0_1 + 0.00143658810325478*G0_0_0_1_0_2 + 0.00256533589866922*G0_0_0_1_1_0 + 0.00415584415584425*G0_0_0_1_1_1 + 0.00343755010421686*G0_0_0_1_1_2 + 0.00143658810325478*G0_0_0_1_2_0 + 0.00343755010421686*G0_0_0_1_2_1 - 0.00318101651434978*G0_0_0_1_2_2 - 0.0217027417027416*G0_0_0_2_0_0 + 0.00143658810325478*G0_0_0_2_0_1 - 0.0322206188872854*G0_0_0_2_0_2 + 0.00143658810325478*G0_0_0_2_1_0 + 0.00343755010421686*G0_0_0_2_1_1 - 0.00318101651434978*G0_0_0_2_1_2 - 0.0322206188872854*G0_0_0_2_2_0 - 0.00318101651434978*G0_0_0_2_2_1 + 0.00153920153920122*G0_0_0_2_2_2 - 0.000179573512906838*G0_0_1_0_0_0 - 0.000179573512906862*G0_0_1_0_0_1 - 0.00359147025813692*G0_0_1_0_0_2 - 0.000179573512906862*G0_0_1_0_1_0 + 0.000359147025813609*G0_0_1_0_1_1 - 0.000743947410614075*G0_0_1_0_1_2 - 0.00359147025813692*G0_0_1_0_2_0 - 0.000743947410614075*G0_0_1_0_2_1 - 0.00525893859227193*G0_0_1_0_2_2 - 0.000179573512906862*G0_0_1_1_0_0 + 0.000359147025813609*G0_0_1_1_0_1 - 0.000743947410614075*G0_0_1_1_0_2 + 0.000359147025813609*G0_0_1_1_1_0 - 0.00795254128587544*G0_0_1_1_1_1 - 0.000872214205547534*G0_0_1_1_1_2 - 0.000743947410614075*G0_0_1_1_2_0 - 0.000872214205547534*G0_0_1_1_2_1 - 0.000641333974667327*G0_0_1_1_2_2 - 0.00359147025813692*G0_0_1_2_0_0 - 0.000743947410614075*G0_0_1_2_0_1 - 0.00525893859227192*G0_0_1_2_0_2 - 0.000743947410614075*G0_0_1_2_1_0 - 0.000872214205547534*G0_0_1_2_1_1 - 0.000641333974667327*G0_0_1_2_1_2 - 0.00525893859227193*G0_0_1_2_2_0 - 0.000641333974667327*G0_0_1_2_2_1 + 0.000820907487573767*G0_0_1_2_2_2 + 0.0155972422639086*G0_1_0_0_0_0 - 0.000359147025813714*G0_1_0_0_0_1 - 0.000359147025813714*G0_1_0_0_1_0 + 0.000359147025813693*G0_1_0_0_1_2 + 0.000359147025813693*G0_1_0_0_2_1 - 0.0155972422639089*G0_1_0_0_2_2 - 0.000359147025813713*G0_1_0_1_0_0 + 0.000359147025813693*G0_1_0_1_0_2 - 0.00425845759179089*G0_1_0_1_1_1 - 0.000820907487574096*G0_1_0_1_1_2 + 0.000359147025813693*G0_1_0_1_2_0 - 0.000820907487574095*G0_1_0_1_2_1 - 0.00292448292448286*G0_1_0_1_2_2 + 0.000359147025813693*G0_1_0_2_0_1 - 0.0155972422639089*G0_1_0_2_0_2 + 0.000359147025813693*G0_1_0_2_1_0 - 0.000820907487574096*G0_1_0_2_1_1 - 0.00292448292448286*G0_1_0_2_1_2 - 0.0155972422639089*G0_1_0_2_2_0 - 0.00292448292448286*G0_1_0_2_2_1 + 0.00328362995029643*G0_1_0_2_2_2 - 0.00100048100048108*G0_1_1_0_0_0 + 0.000461760461760432*G0_1_1_0_0_1 + 0.00166746833413499*G0_1_1_0_0_2 + 0.000461760461760432*G0_1_1_0_1_0 + 0.00123136123136116*G0_1_1_0_1_1 + 0.00166746833413499*G0_1_1_0_2_0 - 0.001667468334135*G0_1_1_0_2_2 + 0.000461760461760432*G0_1_1_1_0_0 + 0.00123136123136116*G0_1_1_1_0_1 + 0.00123136123136116*G0_1_1_1_1_0 - 0.00123136123136123*G0_1_1_1_1_2 - 0.00123136123136123*G0_1_1_1_2_1 - 0.00046176046176048*G0_1_1_1_2_2 + 0.00166746833413499*G0_1_1_2_0_0 - 0.001667468334135*G0_1_1_2_0_2 - 0.00123136123136123*G0_1_1_2_1_1 - 0.000461760461760479*G0_1_1_2_1_2 - 0.001667468334135*G0_1_1_2_2_0 - 0.000461760461760479*G0_1_1_2_2_1 + 0.0010004810004807*G0_1_1_2_2_2; + A[181] = -0.0568478435145098*G0_0_0_0_0_0 - 0.00053872053872052*G0_0_0_0_0_1 - 0.0210614077280743*G0_0_0_0_0_2 - 0.00053872053872052*G0_0_0_0_1_0 + 0.00387365720699055*G0_0_0_0_1_1 - 0.00107744107744107*G0_0_0_0_1_2 - 0.0210614077280743*G0_0_0_0_2_0 - 0.00107744107744107*G0_0_0_0_2_1 - 0.0131345198011864*G0_0_0_0_2_2 - 0.00053872053872052*G0_0_0_1_0_0 + 0.00387365720699055*G0_0_0_1_0_1 - 0.00107744107744107*G0_0_0_1_0_2 + 0.00387365720699055*G0_0_0_1_1_0 + 0.0595157928491262*G0_0_0_1_1_1 + 0.00715728715728713*G0_0_0_1_1_2 - 0.00107744107744107*G0_0_0_1_2_0 + 0.00715728715728713*G0_0_0_1_2_1 - 0.00128266794933462*G0_0_0_1_2_2 - 0.0210614077280743*G0_0_0_2_0_0 - 0.00107744107744107*G0_0_0_2_0_1 - 0.0131345198011864*G0_0_0_2_0_2 - 0.00107744107744107*G0_0_0_2_1_0 + 0.00715728715728713*G0_0_0_2_1_1 - 0.00128266794933462*G0_0_0_2_1_2 - 0.0131345198011864*G0_0_0_2_2_0 - 0.00128266794933462*G0_0_0_2_2_1 - 0.00590027256693927*G0_0_0_2_2_2 + 0.0112361712361711*G0_1_0_0_0_0 + 0.00287317620650952*G0_1_0_0_0_1 - 0.00112874779541446*G0_1_0_0_0_2 + 0.00287317620650952*G0_1_0_0_1_0 - 0.00333493666826997*G0_1_0_0_1_1 - 0.000949174282507608*G0_1_0_0_1_2 - 0.00112874779541446*G0_1_0_0_2_0 - 0.000949174282507608*G0_1_0_0_2_1 - 0.00243706910373576*G0_1_0_0_2_2 + 0.00287317620650952*G0_1_0_1_0_0 - 0.00333493666826997*G0_1_0_1_0_1 - 0.000949174282507608*G0_1_0_1_0_2 - 0.00333493666826997*G0_1_0_1_1_0 + 0.00333493666827*G0_1_0_1_1_2 - 0.000949174282507608*G0_1_0_1_2_0 + 0.00333493666827*G0_1_0_1_2_1 - 0.000974827641494311*G0_1_0_1_2_2 - 0.00112874779541446*G0_1_0_2_0_0 - 0.000949174282507608*G0_1_0_2_0_1 - 0.00243706910373576*G0_1_0_2_0_2 - 0.000949174282507608*G0_1_0_2_1_0 + 0.00333493666827*G0_1_0_2_1_1 - 0.000974827641494311*G0_1_0_2_1_2 - 0.00243706910373576*G0_1_0_2_2_0 - 0.000974827641494311*G0_1_0_2_2_1 - 0.000538720538720568*G0_1_0_2_2_2; + A[176] = 0.173416706750039*G0_0_0_0_0_0 + 0.0450815028592805*G0_0_0_0_0_1 + 0.0343412965635186*G0_0_0_0_0_2 + 0.0450815028592805*G0_0_0_0_1_0 + 0.0786703008925228*G0_0_0_0_1_1 + 0.0116979316979316*G0_0_0_0_1_2 + 0.0343412965635186*G0_0_0_0_2_0 + 0.0116979316979316*G0_0_0_0_2_1 + 0.0171706482817593*G0_0_0_0_2_2 + 0.0450815028592805*G0_0_0_1_0_0 + 0.0786703008925228*G0_0_0_1_0_1 + 0.0116979316979316*G0_0_0_1_0_2 + 0.0786703008925228*G0_0_0_1_1_0 + 0.804489337822668*G0_0_0_1_1_1 + 0.0649885094329535*G0_0_0_1_1_2 + 0.0116979316979316*G0_0_0_1_2_0 + 0.0649885094329535*G0_0_0_1_2_1 + 0.0136133825022713*G0_0_0_1_2_2 + 0.0343412965635186*G0_0_0_2_0_0 + 0.0116979316979316*G0_0_0_2_0_1 + 0.0171706482817593*G0_0_0_2_0_2 + 0.0116979316979316*G0_0_0_2_1_0 + 0.0649885094329535*G0_0_0_2_1_1 + 0.0136133825022713*G0_0_0_2_1_2 + 0.0171706482817593*G0_0_0_2_2_0 + 0.0136133825022713*G0_0_0_2_2_1 + 0.0188808722142054*G0_0_0_2_2_2 - 0.00513067179733856*G0_0_1_0_0_0 - 0.00530169419058306*G0_0_1_0_0_1 - 0.000855111966223082*G0_0_1_0_0_2 - 0.00530169419058306*G0_0_1_0_1_0 + 0.0157340601785046*G0_0_1_0_1_1 + 0.000855111966223072*G0_0_1_0_1_2 - 0.000855111966223082*G0_0_1_0_2_0 + 0.000855111966223072*G0_0_1_0_2_1 - 0.00530169419058306*G0_0_1_1_0_0 + 0.0157340601785046*G0_0_1_1_0_1 + 0.000855111966223072*G0_0_1_1_0_2 + 0.0157340601785046*G0_0_1_1_1_0 + 0.817829084495747*G0_0_1_1_1_1 + 0.0581476137031689*G0_0_1_1_1_2 + 0.000855111966223072*G0_0_1_1_2_0 + 0.0581476137031689*G0_0_1_1_2_1 + 0.00872214205547533*G0_0_1_1_2_2 - 0.000855111966223082*G0_0_1_2_0_0 + 0.000855111966223071*G0_0_1_2_0_1 + 0.000855111966223071*G0_0_1_2_1_0 + 0.0581476137031689*G0_0_1_2_1_1 + 0.00872214205547533*G0_0_1_2_1_2 + 0.00872214205547533*G0_0_1_2_2_1 + 0.00256533589866922*G0_0_1_2_2_2 - 0.00513067179733856*G0_1_0_0_0_0 - 0.00530169419058306*G0_1_0_0_0_1 - 0.000855111966223082*G0_1_0_0_0_2 - 0.00530169419058306*G0_1_0_0_1_0 + 0.0157340601785046*G0_1_0_0_1_1 + 0.000855111966223072*G0_1_0_0_1_2 - 0.000855111966223082*G0_1_0_0_2_0 + 0.000855111966223071*G0_1_0_0_2_1 - 0.00530169419058306*G0_1_0_1_0_0 + 0.0157340601785046*G0_1_0_1_0_1 + 0.000855111966223071*G0_1_0_1_0_2 + 0.0157340601785046*G0_1_0_1_1_0 + 0.817829084495747*G0_1_0_1_1_1 + 0.0581476137031689*G0_1_0_1_1_2 + 0.000855111966223071*G0_1_0_1_2_0 + 0.0581476137031689*G0_1_0_1_2_1 + 0.00872214205547533*G0_1_0_1_2_2 - 0.000855111966223082*G0_1_0_2_0_0 + 0.000855111966223071*G0_1_0_2_0_1 + 0.000855111966223071*G0_1_0_2_1_0 + 0.0581476137031689*G0_1_0_2_1_1 + 0.00872214205547533*G0_1_0_2_1_2 + 0.00872214205547533*G0_1_0_2_2_1 + 0.00256533589866922*G0_1_0_2_2_2 + 0.00513067179733845*G0_1_1_0_0_0 + 0.0157340601785045*G0_1_1_0_0_1 + 0.00171022393244614*G0_1_1_0_0_2 + 0.0157340601785045*G0_1_1_0_1_0 + 0.100561167227833*G0_1_1_0_1_1 + 0.00786703008925227*G0_1_1_0_1_2 + 0.00171022393244614*G0_1_1_0_2_0 + 0.00786703008925226*G0_1_1_0_2_1 + 0.00171022393244614*G0_1_1_0_2_2 + 0.0157340601785045*G0_1_1_1_0_0 + 0.100561167227833*G0_1_1_1_0_1 + 0.00786703008925227*G0_1_1_1_0_2 + 0.100561167227833*G0_1_1_1_1_0 + 1.33397466730799*G0_1_1_1_1_1 + 0.100561167227833*G0_1_1_1_1_2 + 0.00786703008925227*G0_1_1_1_2_0 + 0.100561167227833*G0_1_1_1_2_1 + 0.0157340601785045*G0_1_1_1_2_2 + 0.00171022393244614*G0_1_1_2_0_0 + 0.00786703008925226*G0_1_1_2_0_1 + 0.00171022393244614*G0_1_1_2_0_2 + 0.00786703008925226*G0_1_1_2_1_0 + 0.100561167227833*G0_1_1_2_1_1 + 0.0157340601785045*G0_1_1_2_1_2 + 0.00171022393244614*G0_1_1_2_2_0 + 0.0157340601785045*G0_1_1_2_2_1 + 0.00513067179733843*G0_1_1_2_2_2; + A[21] = 0.0288985088985087*G0_0_0_0_0_0 - 0.00153492597937041*G0_0_0_0_0_1 + 0.00847415958527063*G0_0_0_0_0_2 - 0.00153492597937041*G0_0_0_0_1_0 - 0.00120143231254341*G0_0_0_0_1_1 - 0.000226604671049116*G0_0_0_0_1_2 + 0.00847415958527063*G0_0_0_0_2_0 - 0.000226604671049116*G0_0_0_0_2_1 + 0.00332210998877662*G0_0_0_0_2_2 - 0.00153492597937042*G0_0_0_1_0_0 - 0.00120143231254341*G0_0_0_1_0_1 - 0.000226604671049116*G0_0_0_1_0_2 - 0.00120143231254341*G0_0_0_1_1_0 - 0.0100689434022766*G0_0_0_1_1_1 - 0.00142803698359253*G0_0_0_1_1_2 - 0.000226604671049116*G0_0_0_1_2_0 - 0.00142803698359253*G0_0_0_1_2_1 - 0.000320666987333647*G0_0_0_1_2_2 + 0.00847415958527063*G0_0_0_2_0_0 - 0.000226604671049116*G0_0_0_2_0_1 + 0.00332210998877662*G0_0_0_2_0_2 - 0.000226604671049116*G0_0_0_2_1_0 - 0.00142803698359253*G0_0_0_2_1_1 - 0.000320666987333647*G0_0_0_2_1_2 + 0.00332210998877662*G0_0_0_2_2_0 - 0.000320666987333647*G0_0_0_2_2_1 + 0.00292448292448288*G0_0_0_2_2_2 - 0.0167644700978036*G0_0_1_0_0_0 + 0.000333493666826986*G0_0_1_0_0_1 + 0.00288600288600285*G0_0_1_0_0_2 + 0.000333493666826986*G0_0_1_0_1_0 + 0.000714018491796271*G0_0_1_0_1_1 - 5.98578376356166e-05*G0_0_1_0_1_2 + 0.00288600288600285*G0_0_1_0_2_0 - 5.98578376356167e-05*G0_0_1_0_2_1 + 0.00197103308214417*G0_0_1_0_2_2 + 0.000333493666826986*G0_0_1_1_0_0 + 0.000714018491796271*G0_0_1_1_0_1 - 5.98578376356166e-05*G0_0_1_1_0_2 + 0.000714018491796271*G0_0_1_1_1_0 - 0.000714018491796262*G0_0_1_1_1_2 - 5.98578376356166e-05*G0_0_1_1_2_0 - 0.000714018491796262*G0_0_1_1_2_1 - 0.000213777991555759*G0_0_1_1_2_2 + 0.00288600288600285*G0_0_1_2_0_0 - 5.98578376356167e-05*G0_0_1_2_0_1 + 0.00197103308214417*G0_0_1_2_0_2 - 5.98578376356167e-05*G0_0_1_2_1_0 - 0.000714018491796262*G0_0_1_2_1_1 - 0.000213777991555759*G0_0_1_2_1_2 + 0.00197103308214417*G0_0_1_2_2_0 - 0.000213777991555759*G0_0_1_2_2_1 + 0.00219336219336221*G0_0_1_2_2_2; + A[52] = A[108] + 0.0157768157768154*G0_0_1_0_0_0 - 0.000179573512906852*G0_0_1_0_0_1 + 0.00359147025813685*G0_0_1_0_0_2 - 0.000179573512906851*G0_0_1_0_1_0 - 0.000359147025813626*G0_0_1_0_1_1 + 0.00110309443642777*G0_0_1_0_1_2 + 0.00359147025813685*G0_0_1_0_2_0 + 0.00110309443642777*G0_0_1_0_2_1 - 0.010338303671637*G0_0_1_0_2_2 - 0.000179573512906851*G0_0_1_1_0_0 - 0.000359147025813626*G0_0_1_1_0_1 + 0.00110309443642777*G0_0_1_1_0_2 - 0.000359147025813626*G0_0_1_1_1_0 + 0.00369408369408455*G0_0_1_1_1_1 + 0.00110309443642777*G0_0_1_1_2_0 - 0.00228314894981554*G0_0_1_1_2_2 + 0.00359147025813685*G0_0_1_2_0_0 + 0.00110309443642777*G0_0_1_2_0_1 - 0.010338303671637*G0_0_1_2_0_2 + 0.00110309443642777*G0_0_1_2_1_0 - 0.00228314894981554*G0_0_1_2_1_2 - 0.010338303671637*G0_0_1_2_2_0 - 0.00228314894981554*G0_0_1_2_2_1 + 0.00246272246272266*G0_0_1_2_2_2 - 0.0157768157768154*G0_1_0_0_0_0 + 0.000179573512906852*G0_1_0_0_0_1 - 0.00359147025813685*G0_1_0_0_0_2 + 0.000179573512906852*G0_1_0_0_1_0 + 0.000359147025813625*G0_1_0_0_1_1 - 0.00110309443642777*G0_1_0_0_1_2 - 0.00359147025813685*G0_1_0_0_2_0 - 0.00110309443642777*G0_1_0_0_2_1 + 0.010338303671637*G0_1_0_0_2_2 + 0.000179573512906851*G0_1_0_1_0_0 + 0.000359147025813625*G0_1_0_1_0_1 - 0.00110309443642777*G0_1_0_1_0_2 + 0.000359147025813625*G0_1_0_1_1_0 - 0.00369408369408455*G0_1_0_1_1_1 - 0.00110309443642777*G0_1_0_1_2_0 + 0.00228314894981554*G0_1_0_1_2_2 - 0.00359147025813685*G0_1_0_2_0_0 - 0.00110309443642777*G0_1_0_2_0_1 + 0.010338303671637*G0_1_0_2_0_2 - 0.00110309443642777*G0_1_0_2_1_0 + 0.00228314894981554*G0_1_0_2_1_2 + 0.010338303671637*G0_1_0_2_2_0 + 0.00228314894981554*G0_1_0_2_2_1 - 0.00246272246272266*G0_1_0_2_2_2; + A[35] = 0.000192400192400197*G0_1_0_0_0_0 + 6.4133397466737e-05*G0_1_0_0_0_1 + 0.00397627064293729*G0_1_0_0_0_2 + 6.4133397466737e-05*G0_1_0_0_1_0 + 6.41333974667396e-05*G0_1_0_0_1_1 + 0.00198813532146865*G0_1_0_0_1_2 + 0.00397627064293729*G0_1_0_0_2_0 + 0.00198813532146865*G0_1_0_0_2_1 + 0.0335417668751*G0_1_0_0_2_2 + 6.4133397466737e-05*G0_1_0_1_0_0 + 6.41333974667396e-05*G0_1_0_1_0_1 + 0.00198813532146865*G0_1_0_1_0_2 + 6.41333974667396e-05*G0_1_0_1_1_0 + 0.000192400192400221*G0_1_0_1_1_1 + 0.00397627064293729*G0_1_0_1_1_2 + 0.00198813532146865*G0_1_0_1_2_0 + 0.00397627064293729*G0_1_0_1_2_1 + 0.0335417668751*G0_1_0_1_2_2 + 0.00397627064293729*G0_1_0_2_0_0 + 0.00198813532146865*G0_1_0_2_0_1 + 0.0335417668751*G0_1_0_2_0_2 + 0.00198813532146865*G0_1_0_2_1_0 + 0.0039762706429373*G0_1_0_2_1_1 + 0.0335417668751*G0_1_0_2_1_2 + 0.0335417668751*G0_1_0_2_2_0 + 0.0335417668751*G0_1_0_2_2_1 + 0.541029341029338*G0_1_0_2_2_2 - 0.00886323552990213*G0_1_1_0_0_0 - 0.00590882368660143*G0_1_1_0_0_1 - 0.00074822297044519*G0_1_1_0_0_2 - 0.00590882368660143*G0_1_1_0_1_0 - 0.00886323552990216*G0_1_1_0_1_1 - 0.000748222970445189*G0_1_1_0_1_2 - 0.00074822297044519*G0_1_1_0_2_0 - 0.000748222970445189*G0_1_1_0_2_1 + 0.00784565229009669*G0_1_1_0_2_2 - 0.00590882368660143*G0_1_1_1_0_0 - 0.00886323552990216*G0_1_1_1_0_1 - 0.000748222970445189*G0_1_1_1_0_2 - 0.00886323552990216*G0_1_1_1_1_0 - 0.0354529421196088*G0_1_1_1_1_1 - 0.00224466891133557*G0_1_1_1_1_2 - 0.00074822297044519*G0_1_1_1_2_0 - 0.00224466891133558*G0_1_1_1_2_1 + 0.0156913045801934*G0_1_1_1_2_2 - 0.00074822297044519*G0_1_1_2_0_0 - 0.000748222970445189*G0_1_1_2_0_1 + 0.00784565229009669*G0_1_1_2_0_2 - 0.000748222970445189*G0_1_1_2_1_0 - 0.00224466891133557*G0_1_1_2_1_1 + 0.0156913045801934*G0_1_1_2_1_2 + 0.00784565229009669*G0_1_1_2_2_0 + 0.0156913045801934*G0_1_1_2_2_1 + 0.158473625140291*G0_1_1_2_2_2; + A[26] = -0.0356453423120088*G0_0_0_0_0_0 - 0.00622093955427287*G0_0_0_0_0_1 - 0.00892736892736887*G0_0_0_0_0_2 - 0.00622093955427287*G0_0_0_0_1_0 - 0.0178504622949067*G0_0_0_0_1_1 - 0.00273635829191384*G0_0_0_0_1_2 - 0.00892736892736887*G0_0_0_0_2_0 - 0.00273635829191384*G0_0_0_0_2_1 - 0.00597295708406815*G0_0_0_0_2_2 - 0.00622093955427287*G0_0_0_1_0_0 - 0.0178504622949067*G0_0_0_1_0_1 - 0.00273635829191384*G0_0_0_1_0_2 - 0.0178504622949067*G0_0_0_1_1_0 - 0.382555715889047*G0_0_0_1_1_1 - 0.0256961145850033*G0_0_0_1_1_2 - 0.00273635829191384*G0_0_0_1_2_0 - 0.0256961145850033*G0_0_0_1_2_1 - 0.00472449361338248*G0_0_0_1_2_2 - 0.00892736892736887*G0_0_0_2_0_0 - 0.00273635829191384*G0_0_0_2_0_1 - 0.00597295708406815*G0_0_0_2_0_2 - 0.00273635829191384*G0_0_0_2_1_0 - 0.0256961145850033*G0_0_0_2_1_1 - 0.00472449361338248*G0_0_0_2_1_2 - 0.00597295708406815*G0_0_0_2_2_0 - 0.00472449361338248*G0_0_0_2_2_1 - 0.00905563572230233*G0_0_0_2_2_2 - 0.000192400192400167*G0_0_1_0_0_0 - 0.00397627064293728*G0_0_1_0_0_1 - 6.41333974667284e-05*G0_0_1_0_0_2 - 0.00397627064293728*G0_0_1_0_1_0 - 0.0335417668751*G0_0_1_0_1_1 - 0.00198813532146864*G0_0_1_0_1_2 - 6.41333974667285e-05*G0_0_1_0_2_0 - 0.00198813532146864*G0_0_1_0_2_1 - 6.41333974667308e-05*G0_0_1_0_2_2 - 0.00397627064293728*G0_0_1_1_0_0 - 0.0335417668751*G0_0_1_1_0_1 - 0.00198813532146864*G0_0_1_1_0_2 - 0.0335417668751*G0_0_1_1_1_0 - 0.541029341029338*G0_0_1_1_1_1 - 0.0335417668751*G0_0_1_1_1_2 - 0.00198813532146864*G0_0_1_1_2_0 - 0.0335417668751*G0_0_1_1_2_1 - 0.00397627064293729*G0_0_1_1_2_2 - 6.41333974667285e-05*G0_0_1_2_0_0 - 0.00198813532146864*G0_0_1_2_0_1 - 6.41333974667308e-05*G0_0_1_2_0_2 - 0.00198813532146864*G0_0_1_2_1_0 - 0.0335417668751*G0_0_1_2_1_1 - 0.00397627064293728*G0_0_1_2_1_2 - 6.41333974667309e-05*G0_0_1_2_2_0 - 0.00397627064293728*G0_0_1_2_2_1 - 0.000192400192400197*G0_0_1_2_2_2; + A[158] = -A[52] - 0.0156228956228954*G0_0_0_0_0_0 - 0.000590027256693905*G0_0_0_0_0_1 - 0.022164502164502*G0_0_0_0_0_2 - 0.000590027256693906*G0_0_0_0_1_0 + 0.00423280423280418*G0_0_0_0_1_1 + 0.00143658810325478*G0_0_0_0_1_2 - 0.022164502164502*G0_0_0_0_2_0 + 0.00143658810325478*G0_0_0_0_2_1 - 0.0334519801186466*G0_0_0_0_2_2 - 0.000590027256693905*G0_0_0_1_0_0 + 0.00423280423280418*G0_0_0_1_0_1 + 0.00143658810325478*G0_0_0_1_0_2 + 0.00423280423280418*G0_0_0_1_1_0 + 0.0031553631553632*G0_0_0_1_1_1 + 0.0038993105659773*G0_0_0_1_1_2 + 0.00143658810325478*G0_0_0_1_2_0 + 0.0038993105659773*G0_0_0_1_2_1 - 0.00194965528298852*G0_0_0_1_2_2 - 0.022164502164502*G0_0_0_2_0_0 + 0.00143658810325478*G0_0_0_2_0_1 - 0.0334519801186466*G0_0_0_2_0_2 + 0.00143658810325478*G0_0_0_2_1_0 + 0.0038993105659773*G0_0_0_2_1_1 - 0.00194965528298852*G0_0_0_2_1_2 - 0.0334519801186466*G0_0_0_2_2_0 - 0.00194965528298852*G0_0_0_2_2_1 + 0.00153920153920182*G0_0_0_2_2_2 + 0.0133140933140926*G0_0_1_0_0_0 + 0.0135706269039601*G0_0_1_0_0_1 + 0.00246272246272235*G0_0_1_0_0_2 + 0.0135706269039601*G0_0_1_0_1_0 + 0.00166746833413494*G0_0_1_0_1_1 + 0.00246272246272235*G0_0_1_0_2_0 - 0.0160076960076959*G0_0_1_0_2_2 + 0.0135706269039601*G0_0_1_1_0_0 + 0.00166746833413494*G0_0_1_1_0_1 + 0.00166746833413494*G0_0_1_1_1_0 - 0.0208561808561806*G0_0_1_1_1_1 - 0.00169312169312163*G0_0_1_1_2_2 + 0.00246272246272235*G0_0_1_2_0_0 - 0.0160076960076959*G0_0_1_2_0_2 - 0.00169312169312163*G0_0_1_2_1_2 - 0.0160076960076959*G0_0_1_2_2_0 - 0.00169312169312163*G0_0_1_2_2_1 + 0.0075420875420878*G0_0_1_2_2_2 + 0.00341189674523*G0_1_0_0_0_1 - 0.00341189674523009*G0_1_0_0_0_2 + 0.00341189674523*G0_1_0_0_1_0 + 0.00561808561808543*G0_1_0_0_1_1 - 0.00341189674523009*G0_1_0_0_2_0 - 0.00561808561808566*G0_1_0_0_2_2 + 0.00341189674523*G0_1_0_1_0_0 + 0.00561808561808543*G0_1_0_1_0_1 + 0.00561808561808543*G0_1_0_1_1_0 - 0.00877344877344963*G0_1_0_1_1_1 - 0.000230880230880254*G0_1_0_1_1_2 - 0.000230880230880253*G0_1_0_1_2_1 + 0.000230880230880176*G0_1_0_1_2_2 - 0.00341189674523009*G0_1_0_2_0_0 - 0.00561808561808566*G0_1_0_2_0_2 - 0.000230880230880254*G0_1_0_2_1_1 + 0.000230880230880175*G0_1_0_2_1_2 - 0.00561808561808566*G0_1_0_2_2_0 + 0.000230880230880175*G0_1_0_2_2_1 + 0.00877344877344809*G0_1_0_2_2_2 - 0.00256533589866952*G0_1_1_0_0_0 - 0.0125701459034792*G0_1_1_0_0_1 + 0.00159050825717493*G0_1_1_0_0_2 - 0.0125701459034792*G0_1_1_0_1_0 - 0.0152124418791085*G0_1_1_0_1_1 + 0.00182138848805515*G0_1_1_0_1_2 + 0.00159050825717493*G0_1_1_0_2_0 + 0.00182138848805515*G0_1_1_0_2_1 + 0.00223184223184227*G0_1_1_0_2_2 - 0.0125701459034792*G0_1_1_1_0_0 - 0.0152124418791085*G0_1_1_1_0_1 + 0.00182138848805515*G0_1_1_1_0_2 - 0.0152124418791085*G0_1_1_1_1_0 - 0.03304152637486*G0_1_1_1_1_1 + 0.000846560846560809*G0_1_1_1_1_2 + 0.00182138848805515*G0_1_1_1_2_0 + 0.000846560846560809*G0_1_1_1_2_1 + 0.00297578964245627*G0_1_1_1_2_2 + 0.00159050825717493*G0_1_1_2_0_0 + 0.00182138848805515*G0_1_1_2_0_1 + 0.00223184223184227*G0_1_1_2_0_2 + 0.00182138848805515*G0_1_1_2_1_0 + 0.000846560846560809*G0_1_1_2_1_1 + 0.00297578964245627*G0_1_1_2_1_2 + 0.00223184223184227*G0_1_1_2_2_0 + 0.00297578964245627*G0_1_1_2_2_1 + 0.0173673240339904*G0_1_1_2_2_2; + A[135] = A[26] - 0.346910373577039*G0_0_0_0_0_0 - 0.0116295227406338*G0_0_0_0_0_1 - 0.0167687456576345*G0_0_0_0_0_2 - 0.0116295227406338*G0_0_0_0_1_0 + 0.0116295227406338*G0_0_0_0_1_1 - 0.0167687456576345*G0_0_0_0_2_0 + 0.00124846347068567*G0_0_0_0_2_2 - 0.0116295227406338*G0_0_0_1_0_0 + 0.0116295227406338*G0_0_0_1_0_1 + 0.0116295227406338*G0_0_0_1_1_0 + 0.346910373577039*G0_0_0_1_1_1 + 0.0167687456576345*G0_0_0_1_1_2 + 0.0167687456576345*G0_0_0_1_2_1 - 0.00124846347068567*G0_0_0_1_2_2 - 0.0167687456576345*G0_0_0_2_0_0 + 0.00124846347068567*G0_0_0_2_0_2 + 0.0167687456576345*G0_0_0_2_1_1 - 0.00124846347068567*G0_0_0_2_1_2 + 0.00124846347068567*G0_0_0_2_2_0 - 0.00124846347068567*G0_0_0_2_2_1 - 0.382363315696648*G0_0_1_0_0_0 - 0.0138741916519694*G0_0_1_0_0_1 - 0.0256319811875366*G0_0_1_0_0_2 - 0.0138741916519694*G0_0_1_0_1_0 + 0.0273208273208272*G0_0_1_0_1_1 - 0.000748222970445196*G0_0_1_0_1_2 - 0.0256319811875366*G0_0_1_0_2_0 - 0.000748222970445196*G0_0_1_0_2_1 - 0.00466036021591575*G0_0_1_0_2_2 - 0.0138741916519694*G0_0_1_1_0_0 + 0.0273208273208272*G0_0_1_1_0_1 - 0.000748222970445196*G0_0_1_1_0_2 + 0.0273208273208272*G0_0_1_1_1_0 + 0.505383998717329*G0_0_1_1_1_1 + 0.0246143979477312*G0_0_1_1_1_2 - 0.000748222970445196*G0_0_1_1_2_0 + 0.0246143979477312*G0_0_1_1_2_1 - 0.00199668644113086*G0_0_1_1_2_2 - 0.0256319811875366*G0_0_1_2_0_0 - 0.000748222970445196*G0_0_1_2_0_1 - 0.00466036021591575*G0_0_1_2_0_2 - 0.000748222970445196*G0_0_1_2_1_0 + 0.0246143979477312*G0_0_1_2_1_1 - 0.00199668644113087*G0_0_1_2_1_2 - 0.00466036021591575*G0_0_1_2_2_0 - 0.00199668644113087*G0_0_1_2_2_1 - 0.00886323552990212*G0_0_1_2_2_2 + 0.158473625140291*G0_1_0_0_0_0 + 0.0156913045801934*G0_1_0_0_0_1 + 0.00784565229009668*G0_1_0_0_0_2 + 0.0156913045801934*G0_1_0_0_1_0 - 0.00224466891133558*G0_1_0_0_1_1 - 0.000748222970445195*G0_1_0_0_1_2 + 0.00784565229009668*G0_1_0_0_2_0 - 0.000748222970445195*G0_1_0_0_2_1 - 0.000748222970445194*G0_1_0_0_2_2 + 0.0156913045801934*G0_1_0_1_0_0 - 0.00224466891133558*G0_1_0_1_0_1 - 0.000748222970445195*G0_1_0_1_0_2 - 0.00224466891133558*G0_1_0_1_1_0 - 0.0354529421196086*G0_1_0_1_1_1 - 0.00886323552990215*G0_1_0_1_1_2 - 0.000748222970445195*G0_1_0_1_2_0 - 0.00886323552990215*G0_1_0_1_2_1 - 0.00590882368660143*G0_1_0_1_2_2 + 0.00784565229009668*G0_1_0_2_0_0 - 0.000748222970445195*G0_1_0_2_0_1 - 0.000748222970445194*G0_1_0_2_0_2 - 0.000748222970445195*G0_1_0_2_1_0 - 0.00886323552990215*G0_1_0_2_1_1 - 0.00590882368660143*G0_1_0_2_1_2 - 0.000748222970445194*G0_1_0_2_2_0 - 0.00590882368660143*G0_1_0_2_2_1 - 0.00886323552990214*G0_1_0_2_2_2 + 0.158473625140291*G0_1_1_0_0_0 + 0.0156913045801934*G0_1_1_0_0_1 + 0.00784565229009667*G0_1_1_0_0_2 + 0.0156913045801934*G0_1_1_0_1_0 - 0.00224466891133555*G0_1_1_0_1_1 - 0.000748222970445194*G0_1_1_0_1_2 + 0.00784565229009667*G0_1_1_0_2_0 - 0.000748222970445194*G0_1_1_0_2_1 - 0.000748222970445198*G0_1_1_0_2_2 + 0.0156913045801934*G0_1_1_1_0_0 - 0.00224466891133555*G0_1_1_1_0_1 - 0.000748222970445194*G0_1_1_1_0_2 - 0.00224466891133555*G0_1_1_1_1_0 - 0.0354529421196084*G0_1_1_1_1_1 - 0.00886323552990213*G0_1_1_1_1_2 - 0.000748222970445194*G0_1_1_1_2_0 - 0.00886323552990213*G0_1_1_1_2_1 - 0.00590882368660143*G0_1_1_1_2_2 + 0.00784565229009667*G0_1_1_2_0_0 - 0.000748222970445194*G0_1_1_2_0_1 - 0.000748222970445198*G0_1_1_2_0_2 - 0.000748222970445194*G0_1_1_2_1_0 - 0.00886323552990213*G0_1_1_2_1_1 - 0.00590882368660143*G0_1_1_2_1_2 - 0.000748222970445197*G0_1_1_2_2_0 - 0.00590882368660143*G0_1_1_2_2_1 - 0.00886323552990215*G0_1_1_2_2_2; + A[211] = A[181] + 0.0514862914862911*G0_0_0_0_0_0 + 0.000230880230880212*G0_0_0_0_0_1 + 0.0103639570306236*G0_0_0_0_0_2 + 0.000230880230880212*G0_0_0_0_1_0 + 0.000949174282507604*G0_0_0_0_1_2 + 0.0103639570306236*G0_0_0_0_2_0 + 0.000949174282507604*G0_0_0_0_2_1 - 0.00679814013147344*G0_0_0_0_2_2 + 0.000230880230880211*G0_0_0_1_0_0 + 0.000949174282507604*G0_0_0_1_0_2 + 0.000949174282507604*G0_0_0_1_2_0 - 0.00212922879589542*G0_0_0_1_2_2 + 0.0103639570306236*G0_0_0_2_0_0 + 0.000949174282507604*G0_0_0_2_0_1 - 0.00679814013147344*G0_0_0_2_0_2 + 0.000949174282507604*G0_0_0_2_1_0 - 0.00212922879589542*G0_0_0_2_1_2 - 0.00679814013147344*G0_0_0_2_2_0 - 0.00212922879589542*G0_0_0_2_2_1 - 0.0621837421837417*G0_0_0_2_2_2 - 0.0106974506974505*G0_1_0_0_0_0 - 0.00189834856501521*G0_1_0_0_0_1 + 0.00356581689915023*G0_1_0_0_0_2 - 0.00189834856501521*G0_1_0_0_1_0 + 0.00189834856501522*G0_1_0_0_1_2 + 0.00356581689915023*G0_1_0_0_2_0 + 0.00189834856501521*G0_1_0_0_2_1 + 0.00356581689915022*G0_1_0_0_2_2 - 0.00189834856501521*G0_1_0_1_0_0 + 0.00189834856501522*G0_1_0_1_0_2 + 0.00189834856501522*G0_1_0_1_2_0 - 0.0018983485650152*G0_1_0_1_2_2 + 0.00356581689915023*G0_1_0_2_0_0 + 0.00189834856501521*G0_1_0_2_0_1 + 0.00356581689915022*G0_1_0_2_0_2 + 0.00189834856501522*G0_1_0_2_1_0 - 0.0018983485650152*G0_1_0_2_1_2 + 0.00356581689915022*G0_1_0_2_2_0 - 0.0018983485650152*G0_1_0_2_2_1 - 0.0106974506974506*G0_1_0_2_2_2; + A[16] = 0.00821709155042485*G0_0_0_0_0_0 + 0.0025359414248303*G0_0_0_0_0_1 + 0.00273903051680828*G0_0_0_0_0_2 + 0.0025359414248303*G0_0_0_0_1_0 + 0.0138768638768638*G0_0_0_0_1_1 + 0.00126797071241515*G0_0_0_0_1_2 + 0.00273903051680828*G0_0_0_0_2_0 + 0.00126797071241515*G0_0_0_0_2_1 + 0.00273903051680828*G0_0_0_0_2_2 + 0.0025359414248303*G0_0_0_1_0_0 + 0.0138768638768638*G0_0_0_1_0_1 + 0.00126797071241515*G0_0_0_1_0_2 + 0.0138768638768638*G0_0_0_1_1_0 + 0.234062850729516*G0_0_0_1_1_1 + 0.0138768638768638*G0_0_0_1_1_2 + 0.00126797071241515*G0_0_0_1_2_0 + 0.0138768638768638*G0_0_0_1_2_1 + 0.0025359414248303*G0_0_0_1_2_2 + 0.00273903051680828*G0_0_0_2_0_0 + 0.00126797071241515*G0_0_0_2_0_1 + 0.00273903051680828*G0_0_0_2_0_2 + 0.00126797071241515*G0_0_0_2_1_0 + 0.0138768638768638*G0_0_0_2_1_1 + 0.0025359414248303*G0_0_0_2_1_2 + 0.00273903051680828*G0_0_0_2_2_0 + 0.0025359414248303*G0_0_0_2_2_1 + 0.00821709155042483*G0_0_0_2_2_2; + A[36] = -0.0120955587622254*G0_1_0_0_0_0 - 0.00153492597937042*G0_1_0_0_0_1 - 0.00527604083159634*G0_1_0_0_0_2 - 0.00153492597937042*G0_1_0_0_1_0 - 0.000226604671049128*G0_1_0_0_1_1 - 0.00120143231254342*G0_1_0_0_1_2 - 0.00527604083159634*G0_1_0_0_2_0 - 0.00120143231254342*G0_1_0_0_2_1 - 0.00339907006573669*G0_1_0_0_2_2 - 0.00153492597937042*G0_1_0_1_0_0 - 0.000226604671049128*G0_1_0_1_0_1 - 0.00120143231254342*G0_1_0_1_0_2 - 0.000226604671049128*G0_1_0_1_1_0 - 0.000320666987333709*G0_1_0_1_1_1 - 0.00142803698359254*G0_1_0_1_1_2 - 0.00120143231254342*G0_1_0_1_2_0 - 0.00142803698359254*G0_1_0_1_2_1 - 0.0100689434022767*G0_1_0_1_2_2 - 0.00527604083159634*G0_1_0_2_0_0 - 0.00120143231254342*G0_1_0_2_0_1 - 0.00339907006573669*G0_1_0_2_0_2 - 0.00120143231254342*G0_1_0_2_1_0 - 0.00142803698359254*G0_1_0_2_1_1 - 0.0100689434022767*G0_1_0_2_1_2 - 0.00339907006573669*G0_1_0_2_2_0 - 0.0100689434022767*G0_1_0_2_2_1 - 0.117748917748917*G0_1_0_2_2_2 - 0.0577585377585375*G0_1_1_0_0_0 - 0.0071230826786382*G0_1_1_0_0_1 - 0.00340762118539894*G0_1_1_0_0_2 - 0.0071230826786382*G0_1_1_0_1_0 - 0.00157768157768158*G0_1_1_0_1_1 - 0.00103468547912992*G0_1_1_0_1_2 - 0.00340762118539894*G0_1_1_0_2_0 - 0.00103468547912992*G0_1_1_0_2_1 - 0.00148361926139703*G0_1_1_0_2_2 - 0.0071230826786382*G0_1_1_1_0_0 - 0.00157768157768158*G0_1_1_1_0_1 - 0.00103468547912992*G0_1_1_1_0_2 - 0.00157768157768158*G0_1_1_1_1_0 - 0.00105178771845442*G0_1_1_1_1_1 - 0.00132114798781466*G0_1_1_1_1_2 - 0.00103468547912992*G0_1_1_1_2_0 - 0.00132114798781466*G0_1_1_1_2_1 - 0.00935492491048043*G0_1_1_1_2_2 - 0.00340762118539894*G0_1_1_2_0_0 - 0.00103468547912992*G0_1_1_2_0_1 - 0.00148361926139703*G0_1_1_2_0_2 - 0.00103468547912992*G0_1_1_2_1_0 - 0.00132114798781466*G0_1_1_2_1_1 - 0.00935492491048043*G0_1_1_2_1_2 - 0.00148361926139703*G0_1_1_2_2_0 - 0.00935492491048043*G0_1_1_2_2_1 - 0.10767997434664*G0_1_1_2_2_2; + A[122] = -0.000192400192400201*G0_0_1_0_0_0 - 6.41333974667374e-05*G0_0_1_0_0_1 - 0.00397627064293729*G0_0_1_0_0_2 - 6.41333974667374e-05*G0_0_1_0_1_0 - 6.41333974667395e-05*G0_0_1_0_1_1 - 0.00198813532146865*G0_0_1_0_1_2 - 0.00397627064293729*G0_0_1_0_2_0 - 0.00198813532146865*G0_0_1_0_2_1 - 0.0335417668751*G0_0_1_0_2_2 - 6.41333974667373e-05*G0_0_1_1_0_0 - 6.41333974667395e-05*G0_0_1_1_0_1 - 0.00198813532146865*G0_0_1_1_0_2 - 6.41333974667395e-05*G0_0_1_1_1_0 - 0.000192400192400221*G0_0_1_1_1_1 - 0.00397627064293729*G0_0_1_1_1_2 - 0.00198813532146865*G0_0_1_1_2_0 - 0.00397627064293729*G0_0_1_1_2_1 - 0.0335417668751*G0_0_1_1_2_2 - 0.00397627064293729*G0_0_1_2_0_0 - 0.00198813532146865*G0_0_1_2_0_1 - 0.0335417668751*G0_0_1_2_0_2 - 0.00198813532146865*G0_0_1_2_1_0 - 0.00397627064293729*G0_0_1_2_1_1 - 0.0335417668751*G0_0_1_2_1_2 - 0.0335417668751*G0_0_1_2_2_0 - 0.0335417668751*G0_0_1_2_2_1 - 0.541029341029337*G0_0_1_2_2_2 - 0.0356453423120088*G0_1_1_0_0_0 - 0.00892736892736889*G0_1_1_0_0_1 - 0.00622093955427287*G0_1_1_0_0_2 - 0.00892736892736889*G0_1_1_0_1_0 - 0.00597295708406817*G0_1_1_0_1_1 - 0.00273635829191384*G0_1_1_0_1_2 - 0.00622093955427287*G0_1_1_0_2_0 - 0.00273635829191384*G0_1_1_0_2_1 - 0.0178504622949067*G0_1_1_0_2_2 - 0.00892736892736889*G0_1_1_1_0_0 - 0.00597295708406817*G0_1_1_1_0_1 - 0.00273635829191384*G0_1_1_1_0_2 - 0.00597295708406817*G0_1_1_1_1_0 - 0.0090556357223024*G0_1_1_1_1_1 - 0.00472449361338249*G0_1_1_1_1_2 - 0.00273635829191384*G0_1_1_1_2_0 - 0.00472449361338249*G0_1_1_1_2_1 - 0.0256961145850033*G0_1_1_1_2_2 - 0.00622093955427287*G0_1_1_2_0_0 - 0.00273635829191384*G0_1_1_2_0_1 - 0.0178504622949067*G0_1_1_2_0_2 - 0.00273635829191384*G0_1_1_2_1_0 - 0.00472449361338249*G0_1_1_2_1_1 - 0.0256961145850033*G0_1_1_2_1_2 - 0.0178504622949067*G0_1_1_2_2_0 - 0.0256961145850034*G0_1_1_2_2_1 - 0.382555715889047*G0_1_1_2_2_2; + A[191] = -A[108] + 0.212922879589545*G0_0_0_0_0_0 - 0.00723424723424725*G0_0_0_0_0_1 + 0.0505371172037835*G0_0_0_0_0_2 - 0.00723424723424725*G0_0_0_0_1_0 - 0.0305788039121372*G0_0_0_0_1_1 + 0.0505371172037835*G0_0_0_0_2_0 + 0.00759339426006085*G0_0_0_0_2_2 - 0.00723424723424724*G0_0_0_1_0_0 - 0.0305788039121372*G0_0_0_1_0_1 - 0.0305788039121372*G0_0_0_1_1_0 - 0.200352733686066*G0_0_0_1_1_1 - 0.034324194324194*G0_0_0_1_1_2 - 0.034324194324194*G0_0_0_1_2_1 - 0.0068751002084334*G0_0_0_1_2_2 + 0.0505371172037835*G0_0_0_2_0_0 + 0.00759339426006085*G0_0_0_2_0_2 - 0.034324194324194*G0_0_0_2_1_1 - 0.0068751002084334*G0_0_0_2_1_2 + 0.00759339426006085*G0_0_0_2_2_0 - 0.0068751002084334*G0_0_0_2_2_1 + 0.0331441398108061*G0_0_0_2_2_2 - 0.0234728234728235*G0_0_1_0_0_0 - 0.00161616161616166*G0_0_1_0_0_1 - 0.0104665704665705*G0_0_1_0_0_2 - 0.00161616161616166*G0_0_1_0_1_0 + 0.00128266794933446*G0_0_1_0_1_1 - 0.00248837582170917*G0_0_1_0_1_2 - 0.0104665704665705*G0_0_1_0_2_0 - 0.00248837582170917*G0_0_1_0_2_1 - 0.00792688792688795*G0_0_1_0_2_2 - 0.00161616161616166*G0_0_1_1_0_0 + 0.00128266794933446*G0_0_1_1_0_1 - 0.00248837582170917*G0_0_1_1_0_2 + 0.00128266794933446*G0_0_1_1_1_0 - 0.157768157768159*G0_0_1_1_1_1 - 0.0325797659130991*G0_0_1_1_1_2 - 0.00248837582170917*G0_0_1_1_2_0 - 0.0325797659130991*G0_0_1_1_2_1 - 0.0100817700817701*G0_0_1_1_2_2 - 0.0104665704665705*G0_0_1_2_0_0 - 0.00248837582170917*G0_0_1_2_0_1 - 0.00792688792688795*G0_0_1_2_0_2 - 0.00248837582170917*G0_0_1_2_1_0 - 0.0325797659130991*G0_0_1_2_1_1 - 0.0100817700817701*G0_0_1_2_1_2 - 0.00792688792688795*G0_0_1_2_2_0 - 0.0100817700817701*G0_0_1_2_2_1 - 0.000615680615681081*G0_0_1_2_2_2 - 0.0489466089466087*G0_1_0_0_0_0 - 0.0220105820105818*G0_1_0_0_0_1 + 0.000410453743787048*G0_1_0_0_0_2 - 0.0220105820105818*G0_1_0_0_1_0 - 0.00779862113195439*G0_1_0_0_1_1 - 0.00179573512906844*G0_1_0_0_1_2 + 0.000410453743787047*G0_1_0_0_2_0 - 0.00179573512906844*G0_1_0_0_2_1 - 0.00933782267115596*G0_1_0_0_2_2 - 0.0220105820105818*G0_1_0_1_0_0 - 0.00779862113195439*G0_1_0_1_0_1 - 0.00179573512906844*G0_1_0_1_0_2 - 0.0077986211319544*G0_1_0_1_1_0 - 0.101741221741221*G0_1_0_1_1_1 - 0.0309892576559241*G0_1_0_1_1_2 - 0.00179573512906845*G0_1_0_1_2_0 - 0.0309892576559241*G0_1_0_1_2_1 - 0.00672118005451326*G0_1_0_1_2_2 + 0.000410453743787047*G0_1_0_2_0_0 - 0.00179573512906845*G0_1_0_2_0_1 - 0.00933782267115596*G0_1_0_2_0_2 - 0.00179573512906845*G0_1_0_2_1_0 - 0.0309892576559241*G0_1_0_2_1_1 - 0.00672118005451326*G0_1_0_2_1_2 - 0.00933782267115596*G0_1_0_2_2_0 - 0.00672118005451326*G0_1_0_2_2_1 + 0.00985088985088971*G0_1_0_2_2_2 - 0.0105435305435307*G0_1_1_0_0_0 + 0.00436107102773761*G0_1_1_0_0_1 + 0.00279621612954941*G0_1_1_0_0_2 + 0.00436107102773761*G0_1_1_0_1_0 + 0.0186756453423117*G0_1_1_0_1_1 + 0.00123136123136119*G0_1_1_0_1_2 + 0.00279621612954941*G0_1_1_0_2_0 + 0.00123136123136119*G0_1_1_0_2_1 + 0.000487413820747104*G0_1_1_0_2_2 + 0.00436107102773761*G0_1_1_1_0_0 + 0.0186756453423117*G0_1_1_1_0_1 + 0.00123136123136119*G0_1_1_1_0_2 + 0.0186756453423117*G0_1_1_1_1_0 - 0.018675645342312*G0_1_1_1_1_2 + 0.00123136123136119*G0_1_1_1_2_0 - 0.018675645342312*G0_1_1_1_2_1 - 0.00682379349046019*G0_1_1_1_2_2 + 0.00279621612954941*G0_1_1_2_0_0 + 0.00123136123136119*G0_1_1_2_0_1 + 0.000487413820747104*G0_1_1_2_0_2 + 0.00123136123136119*G0_1_1_2_1_0 - 0.018675645342312*G0_1_1_2_1_1 - 0.00682379349046019*G0_1_1_2_1_2 + 0.000487413820747105*G0_1_1_2_2_0 - 0.00682379349046019*G0_1_1_2_2_1 + 0.000692640692640323*G0_1_1_2_2_2; + A[110] = A[191] - 0.226544813211478*G0_0_0_0_0_0 + 0.00941478274811608*G0_0_0_0_0_1 - 0.0819881353214681*G0_0_0_0_0_2 + 0.00941478274811608*G0_0_0_0_1_0 + 0.0343498476831809*G0_0_0_0_1_1 + 0.00194965528298861*G0_0_0_0_1_2 - 0.0819881353214681*G0_0_0_0_2_0 + 0.00194965528298861*G0_0_0_0_2_1 - 0.0503318903318902*G0_0_0_0_2_2 + 0.00941478274811608*G0_0_0_1_0_0 + 0.0343498476831809*G0_0_0_1_0_1 + 0.00194965528298861*G0_0_0_1_0_2 + 0.0343498476831809*G0_0_0_1_1_0 + 0.208433541766875*G0_0_0_1_1_1 + 0.0495622895622893*G0_0_0_1_1_2 + 0.00194965528298861*G0_0_0_1_2_0 + 0.0495622895622893*G0_0_0_1_2_1 + 0.0619272085938749*G0_0_0_1_2_2 - 0.0819881353214681*G0_0_0_2_0_0 + 0.00194965528298861*G0_0_0_2_0_1 - 0.0503318903318902*G0_0_0_2_0_2 + 0.00194965528298861*G0_0_0_2_1_0 + 0.0495622895622893*G0_0_0_2_1_1 + 0.0619272085938748*G0_0_0_2_1_2 - 0.0503318903318902*G0_0_0_2_2_0 + 0.0619272085938748*G0_0_0_2_2_1 + 0.564066057399386*G0_0_0_2_2_2 + 0.0199583132916466*G0_0_1_0_0_0 + 0.000615680615680622*G0_0_1_0_0_1 - 0.00420715087381757*G0_0_1_0_0_2 + 0.000615680615680622*G0_0_1_0_1_0 - 0.00420715087381757*G0_0_1_0_2_0 - 0.00990219656886331*G0_0_1_0_2_2 + 0.000615680615680622*G0_0_1_1_0_0 + 0.161718775052108*G0_0_1_1_1_1 + 0.0544877344877342*G0_0_1_1_1_2 + 0.0544877344877342*G0_0_1_1_2_1 + 0.0730607663940993*G0_0_1_1_2_2 - 0.00420715087381757*G0_0_1_2_0_0 - 0.00990219656886331*G0_0_1_2_0_2 + 0.0544877344877342*G0_0_1_2_1_1 + 0.0730607663940993*G0_0_1_2_1_2 - 0.00990219656886331*G0_0_1_2_2_0 + 0.0730607663940993*G0_0_1_2_2_1 + 0.280545133878465*G0_0_1_2_2_2 + 0.0529741863075191*G0_1_0_0_0_0 + 0.0200096200096198*G0_1_0_0_0_1 - 0.0148532948532949*G0_1_0_0_0_2 + 0.0200096200096198*G0_1_0_0_1_0 + 0.00777296777296769*G0_1_0_0_1_1 + 0.000436107102773753*G0_1_0_0_1_2 - 0.0148532948532949*G0_1_0_0_2_0 + 0.000436107102773754*G0_1_0_0_2_1 - 0.0324258457591791*G0_1_0_0_2_2 + 0.0200096200096198*G0_1_0_1_0_0 + 0.00777296777296769*G0_1_0_1_0_1 + 0.000436107102773754*G0_1_0_1_0_2 + 0.00777296777296769*G0_1_0_1_1_0 + 0.100458553791887*G0_1_0_1_1_1 + 0.0390700657367322*G0_1_0_1_1_2 + 0.000436107102773755*G0_1_0_1_2_0 + 0.0390700657367322*G0_1_0_1_2_1 + 0.0474074074074071*G0_1_0_1_2_2 - 0.0148532948532949*G0_1_0_2_0_0 + 0.000436107102773754*G0_1_0_2_0_1 - 0.0324258457591791*G0_1_0_2_0_2 + 0.000436107102773754*G0_1_0_2_1_0 + 0.0390700657367322*G0_1_0_2_1_1 + 0.0474074074074071*G0_1_0_2_1_2 - 0.0324258457591791*G0_1_0_2_2_0 + 0.0474074074074071*G0_1_0_2_2_1 + 0.44724066057399*G0_1_0_2_2_2 - 0.0414045214045209*G0_1_1_0_0_0 - 0.0213949013949012*G0_1_1_0_0_1 - 0.0173416706750039*G0_1_1_0_0_2 - 0.0213949013949012*G0_1_1_0_1_0 - 0.0261151194484526*G0_1_1_0_1_1 - 0.00723424723424718*G0_1_1_0_1_2 - 0.0173416706750039*G0_1_1_0_2_0 - 0.00723424723424718*G0_1_1_0_2_1 - 0.0239602372935706*G0_1_1_0_2_2 - 0.0213949013949012*G0_1_1_1_0_0 - 0.0261151194484526*G0_1_1_1_0_1 - 0.00723424723424718*G0_1_1_1_0_2 - 0.0261151194484526*G0_1_1_1_1_0 + 0.00708032708032735*G0_1_1_1_1_1 + 0.0325797659130991*G0_1_1_1_1_2 - 0.00723424723424718*G0_1_1_1_2_0 + 0.0325797659130991*G0_1_1_1_2_1 + 0.0497162097162094*G0_1_1_1_2_2 - 0.0173416706750039*G0_1_1_2_0_0 - 0.00723424723424718*G0_1_1_2_0_1 - 0.0239602372935706*G0_1_1_2_0_2 - 0.00723424723424718*G0_1_1_2_1_0 + 0.0325797659130991*G0_1_1_2_1_1 + 0.0497162097162094*G0_1_1_2_1_2 - 0.0239602372935706*G0_1_1_2_2_0 + 0.0497162097162094*G0_1_1_2_2_1 + 0.198864838864837*G0_1_1_2_2_2; + A[117] = -A[110] + 0.0153920153920151*G0_0_0_0_0_0 + 0.00548981882315213*G0_0_0_0_0_1 - 0.0468430335097001*G0_0_0_0_0_2 + 0.00548981882315212*G0_0_0_0_1_0 + 0.00359147025813694*G0_0_0_0_1_1 + 0.010671797338464*G0_0_0_0_1_2 - 0.0468430335097001*G0_0_0_0_2_0 + 0.010671797338464*G0_0_0_0_2_1 - 0.0309892576559244*G0_0_0_0_2_2 + 0.00548981882315212*G0_0_0_1_0_0 + 0.00359147025813694*G0_0_0_1_0_1 + 0.010671797338464*G0_0_0_1_0_2 + 0.00359147025813694*G0_0_0_1_1_0 + 0.0204713804713805*G0_0_0_1_1_1 + 0.0470482603815936*G0_0_0_1_1_2 + 0.010671797338464*G0_0_0_1_2_0 + 0.0470482603815936*G0_0_0_1_2_1 + 0.127958954625621*G0_0_0_1_2_2 - 0.0468430335097001*G0_0_0_2_0_0 + 0.010671797338464*G0_0_0_2_0_1 - 0.0309892576559244*G0_0_0_2_0_2 + 0.010671797338464*G0_0_0_2_1_0 + 0.0470482603815936*G0_0_0_2_1_1 + 0.127958954625621*G0_0_0_2_1_2 - 0.0309892576559244*G0_0_0_2_2_0 + 0.127958954625621*G0_0_0_2_2_1 + 0.749591149591145*G0_0_0_2_2_2 + 0.132961359628026*G0_0_1_0_0_0 + 0.0377360910694243*G0_0_1_0_0_1 + 0.0477152477152474*G0_0_1_0_0_2 + 0.0377360910694242*G0_0_1_0_1_0 + 0.0193426326759659*G0_0_1_0_1_1 + 0.0224979958313291*G0_0_1_0_1_2 + 0.0477152477152474*G0_0_1_0_2_0 + 0.0224979958313291*G0_0_1_0_2_1 + 0.0635433702100365*G0_0_1_0_2_2 + 0.0377360910694243*G0_0_1_1_0_0 + 0.0193426326759659*G0_0_1_1_0_1 + 0.0224979958313291*G0_0_1_1_0_2 + 0.0193426326759659*G0_0_1_1_1_0 + 0.0403783870450533*G0_0_1_1_1_1 + 0.0638768638768636*G0_0_1_1_1_2 + 0.0224979958313291*G0_0_1_1_2_0 + 0.0638768638768636*G0_0_1_1_2_1 + 0.150662177328843*G0_0_1_1_2_2 + 0.0477152477152474*G0_0_1_2_0_0 + 0.0224979958313291*G0_0_1_2_0_1 + 0.0635433702100365*G0_0_1_2_0_2 + 0.0224979958313291*G0_0_1_2_1_0 + 0.0638768638768636*G0_0_1_2_1_1 + 0.150662177328843*G0_0_1_2_1_2 + 0.0635433702100365*G0_0_1_2_2_0 + 0.150662177328843*G0_0_1_2_2_1 + 0.583254769921433*G0_0_1_2_2_2 + 0.24709315375982*G0_1_0_0_0_0 + 0.0126727593394261*G0_1_0_0_0_1 + 0.115542728876062*G0_1_0_0_0_2 + 0.0126727593394261*G0_1_0_0_1_0 + 0.000205226871893606*G0_1_0_0_1_1 + 0.0142119608786275*G0_1_0_0_1_2 + 0.115542728876062*G0_1_0_0_2_0 + 0.0142119608786275*G0_1_0_0_2_1 + 0.0547955747955744*G0_1_0_0_2_2 + 0.0126727593394261*G0_1_0_1_0_0 + 0.000205226871893606*G0_1_0_1_0_1 + 0.0142119608786275*G0_1_0_1_0_2 + 0.000205226871893606*G0_1_0_1_1_0 + 0.0139041205707873*G0_1_0_1_1_1 + 0.0383774250440916*G0_1_0_1_1_2 + 0.0142119608786275*G0_1_0_1_2_0 + 0.0383774250440916*G0_1_0_1_2_1 + 0.113336540003206*G0_1_0_1_2_2 + 0.115542728876062*G0_1_0_2_0_0 + 0.0142119608786275*G0_1_0_2_0_1 + 0.0547955747955744*G0_1_0_2_0_2 + 0.0142119608786275*G0_1_0_2_1_0 + 0.0383774250440916*G0_1_0_2_1_1 + 0.113336540003206*G0_1_0_2_1_2 + 0.0547955747955744*G0_1_0_2_2_0 + 0.113336540003206*G0_1_0_2_2_1 + 0.689151835818498*G0_1_0_2_2_2 - 0.450293410293407*G0_1_1_0_0_0 - 0.112926086259419*G0_1_1_0_0_1 - 0.015828122494789*G0_1_1_0_0_2 - 0.112926086259419*G0_1_1_0_1_0 - 0.0445342312008976*G0_1_1_0_1_1 - 0.015828122494789*G0_1_1_0_2_0 + 0.0158281224947892*G0_1_1_0_2_2 - 0.112926086259419*G0_1_1_1_0_0 - 0.0445342312008976*G0_1_1_1_0_1 - 0.0445342312008976*G0_1_1_1_1_0 + 0.0445342312008977*G0_1_1_1_1_2 + 0.0445342312008977*G0_1_1_1_2_1 + 0.112926086259419*G0_1_1_1_2_2 - 0.015828122494789*G0_1_1_2_0_0 + 0.0158281224947892*G0_1_1_2_0_2 + 0.0445342312008977*G0_1_1_2_1_1 + 0.112926086259419*G0_1_1_2_1_2 + 0.0158281224947892*G0_1_1_2_2_0 + 0.112926086259419*G0_1_1_2_2_1 + 0.450293410293408*G0_1_1_2_2_2; + A[65] = -A[110] - 0.000923520923520923*G0_0_0_0_0_0 - 0.000102613435946766*G0_0_0_0_0_1 - 0.0215488215488215*G0_0_0_0_0_2 - 0.000102613435946767*G0_0_0_0_1_0 + 0.000102613435946784*G0_0_0_0_1_1 - 0.0215488215488215*G0_0_0_0_2_0 - 0.0687510020843351*G0_0_0_0_2_2 - 0.000102613435946767*G0_0_0_1_0_0 + 0.000102613435946784*G0_0_0_1_0_1 + 0.000102613435946784*G0_0_0_1_1_0 + 0.000923520923520991*G0_0_0_1_1_1 + 0.0215488215488215*G0_0_0_1_1_2 + 0.0215488215488215*G0_0_0_1_2_1 + 0.0687510020843352*G0_0_0_1_2_2 - 0.0215488215488215*G0_0_0_2_0_0 - 0.0687510020843351*G0_0_0_2_0_2 + 0.0215488215488215*G0_0_0_2_1_1 + 0.0687510020843352*G0_0_0_2_1_2 - 0.0687510020843351*G0_0_0_2_2_0 + 0.0687510020843352*G0_0_0_2_2_1 - 0.00420715087381754*G0_0_1_0_0_0 - 0.00933782267115604*G0_0_1_0_0_2 + 0.00420715087381757*G0_0_1_0_1_1 + 0.00933782267115599*G0_0_1_0_1_2 - 0.00933782267115604*G0_0_1_0_2_0 + 0.00933782267115599*G0_0_1_0_2_1 + 0.00420715087381757*G0_0_1_1_0_1 + 0.00933782267115599*G0_0_1_1_0_2 + 0.00420715087381757*G0_0_1_1_1_0 + 0.0336572069905402*G0_0_1_1_1_1 + 0.0840404040404037*G0_0_1_1_1_2 + 0.00933782267115599*G0_0_1_1_2_0 + 0.0840404040404037*G0_0_1_1_2_1 + 0.17752124418791*G0_0_1_1_2_2 - 0.00933782267115604*G0_0_1_2_0_0 + 0.00933782267115599*G0_0_1_2_0_1 + 0.00933782267115599*G0_0_1_2_1_0 + 0.0840404040404037*G0_0_1_2_1_1 + 0.17752124418791*G0_0_1_2_1_2 + 0.17752124418791*G0_0_1_2_2_1 + 0.432002565335896*G0_0_1_2_2_2 - 0.0125188391855058*G0_1_0_0_0_0 - 0.00287317620650949*G0_1_0_0_0_1 - 0.017341670675004*G0_1_0_0_0_2 - 0.00287317620650949*G0_1_0_0_1_0 - 0.00277056277056269*G0_1_0_0_1_1 - 0.0039506172839506*G0_1_0_0_1_2 - 0.017341670675004*G0_1_0_0_2_0 - 0.0039506172839506*G0_1_0_0_2_1 - 0.0407888407888407*G0_1_0_0_2_2 - 0.00287317620650949*G0_1_0_1_0_0 - 0.00277056277056269*G0_1_0_1_0_1 - 0.0039506172839506*G0_1_0_1_0_2 - 0.00277056277056269*G0_1_0_1_1_0 - 0.0115953182619845*G0_1_0_1_1_1 + 0.00420715087381758*G0_1_0_1_1_2 - 0.0039506172839506*G0_1_0_1_2_0 + 0.00420715087381758*G0_1_0_1_2_1 + 0.0279621612954945*G0_1_0_1_2_2 - 0.017341670675004*G0_1_0_2_0_0 - 0.0039506172839506*G0_1_0_2_0_1 - 0.0407888407888407*G0_1_0_2_0_2 - 0.0039506172839506*G0_1_0_2_1_0 + 0.00420715087381758*G0_1_0_2_1_1 + 0.0279621612954945*G0_1_0_2_1_2 - 0.0407888407888407*G0_1_0_2_2_0 + 0.0279621612954945*G0_1_0_2_2_1 + 0.311944845278177*G0_1_0_2_2_2 - 0.0604906204906199*G0_1_1_0_0_0 - 0.0341702741702739*G0_1_1_0_0_1 - 0.0204713804713804*G0_1_1_0_0_2 - 0.0341702741702739*G0_1_1_0_1_0 - 0.0562834696168027*G0_1_1_0_1_1 - 0.0111335578002244*G0_1_1_0_1_2 - 0.0204713804713804*G0_1_1_0_2_0 - 0.0111335578002244*G0_1_1_0_2_1 - 0.0310405643738976*G0_1_1_0_2_2 - 0.0341702741702739*G0_1_1_1_0_0 - 0.0562834696168027*G0_1_1_1_0_1 - 0.0111335578002244*G0_1_1_1_0_2 - 0.0562834696168027*G0_1_1_1_1_0 - 0.302299182299182*G0_1_1_1_1_1 - 0.000359147025813767*G0_1_1_1_1_2 - 0.0111335578002244*G0_1_1_1_2_0 - 0.00035914702581377*G0_1_1_1_2_1 + 0.0487413820747151*G0_1_1_1_2_2 - 0.0204713804713804*G0_1_1_2_0_0 - 0.0111335578002244*G0_1_1_2_0_1 - 0.0310405643738976*G0_1_1_2_0_2 - 0.0111335578002244*G0_1_1_2_1_0 - 0.000359147025813774*G0_1_1_2_1_1 + 0.0487413820747151*G0_1_1_2_1_2 - 0.0310405643738976*G0_1_1_2_2_0 + 0.0487413820747151*G0_1_1_2_2_1 + 0.15161135161135*G0_1_1_2_2_2; + A[212] = -0.00161616161616153*G0_0_1_0_0_0 - 0.000179573512906829*G0_0_1_0_0_1 - 0.00102613435946771*G0_0_1_0_0_2 - 0.00017957351290683*G0_0_1_0_1_0 + 0.00017957351290685*G0_0_1_0_1_1 - 0.00102613435946771*G0_0_1_0_2_0 + 0.0109026775693441*G0_0_1_0_2_2 - 0.00017957351290683*G0_0_1_1_0_0 + 0.00017957351290685*G0_0_1_1_0_1 + 0.00017957351290685*G0_0_1_1_1_0 + 0.00161616161616155*G0_0_1_1_1_1 + 0.00102613435946766*G0_0_1_1_1_2 + 0.00102613435946766*G0_0_1_1_2_1 - 0.0109026775693443*G0_0_1_1_2_2 - 0.00102613435946771*G0_0_1_2_0_0 + 0.0109026775693441*G0_0_1_2_0_2 + 0.00102613435946766*G0_0_1_2_1_1 - 0.0109026775693443*G0_0_1_2_1_2 + 0.0109026775693441*G0_0_1_2_2_0 - 0.0109026775693443*G0_0_1_2_2_1 + 0.0368125701459034*G0_1_1_0_0_0 + 0.0184960718294051*G0_1_1_0_0_1 + 0.00282186948853613*G0_1_1_0_0_2 + 0.0184960718294051*G0_1_1_0_1_0 + 0.0186756453423119*G0_1_1_0_1_1 + 0.00205226871893537*G0_1_1_0_1_2 + 0.00282186948853613*G0_1_1_0_2_0 + 0.00205226871893537*G0_1_1_0_2_1 - 0.0105178771845438*G0_1_1_0_2_2 + 0.0184960718294051*G0_1_1_1_0_0 + 0.0186756453423119*G0_1_1_1_0_1 + 0.00205226871893537*G0_1_1_1_0_2 + 0.0186756453423119*G0_1_1_1_1_0 + 0.038428731762065*G0_1_1_1_1_1 + 0.00384800384800381*G0_1_1_1_1_2 + 0.00205226871893537*G0_1_1_1_2_0 + 0.00384800384800381*G0_1_1_1_2_1 - 0.021420554753888*G0_1_1_1_2_2 + 0.00282186948853613*G0_1_1_2_0_0 + 0.00205226871893537*G0_1_1_2_0_1 - 0.0105178771845438*G0_1_1_2_0_2 + 0.00205226871893537*G0_1_1_2_1_0 + 0.00384800384800381*G0_1_1_2_1_1 - 0.021420554753888*G0_1_1_2_1_2 - 0.0105178771845438*G0_1_1_2_2_0 - 0.021420554753888*G0_1_1_2_2_1 - 0.20792047458714*G0_1_1_2_2_2; + A[1] = 0.0212361712361712*G0_0_0_0_0_0 + 5.39789428678374e-05*G0_0_0_0_0_1 + 0.00190208967986745*G0_0_0_0_0_2 + 5.39789428678375e-05*G0_0_0_0_1_0 + 5.39789428678363e-05*G0_0_0_0_1_1 + 0.000130137352359575*G0_0_0_0_1_2 + 0.00190208967986745*G0_0_0_0_2_0 + 0.000130137352359575*G0_0_0_0_2_1 + 0.000286996953663617*G0_0_0_0_2_2 + 5.39789428678374e-05*G0_0_0_1_0_0 + 5.39789428678363e-05*G0_0_0_1_0_1 + 0.000130137352359574*G0_0_0_1_0_2 + 5.39789428678364e-05*G0_0_0_1_1_0 + 0.0212361712361712*G0_0_0_1_1_1 + 0.00190208967986745*G0_0_0_1_1_2 + 0.000130137352359574*G0_0_0_1_2_0 + 0.00190208967986745*G0_0_0_1_2_1 + 0.000286996953663615*G0_0_0_1_2_2 + 0.00190208967986745*G0_0_0_2_0_0 + 0.000130137352359575*G0_0_0_2_0_1 + 0.000286996953663617*G0_0_0_2_0_2 + 0.000130137352359574*G0_0_0_2_1_0 + 0.00190208967986745*G0_0_0_2_1_1 + 0.000286996953663615*G0_0_0_2_1_2 + 0.000286996953663617*G0_0_0_2_2_0 + 0.000286996953663615*G0_0_0_2_2_1 - 9.78034311367793e-05*G0_0_0_2_2_2 + 0.0212361712361712*G0_1_0_0_0_0 + 5.39789428678377e-05*G0_1_0_0_0_1 + 0.00190208967986745*G0_1_0_0_0_2 + 5.39789428678376e-05*G0_1_0_0_1_0 + 5.39789428678356e-05*G0_1_0_0_1_1 + 0.000130137352359574*G0_1_0_0_1_2 + 0.00190208967986745*G0_1_0_0_2_0 + 0.000130137352359574*G0_1_0_0_2_1 + 0.000286996953663616*G0_1_0_0_2_2 + 5.39789428678375e-05*G0_1_0_1_0_0 + 5.39789428678354e-05*G0_1_0_1_0_1 + 0.000130137352359574*G0_1_0_1_0_2 + 5.39789428678355e-05*G0_1_0_1_1_0 + 0.0212361712361711*G0_1_0_1_1_1 + 0.00190208967986744*G0_1_0_1_1_2 + 0.000130137352359574*G0_1_0_1_2_0 + 0.00190208967986744*G0_1_0_1_2_1 + 0.000286996953663615*G0_1_0_1_2_2 + 0.00190208967986745*G0_1_0_2_0_0 + 0.000130137352359574*G0_1_0_2_0_1 + 0.000286996953663616*G0_1_0_2_0_2 + 0.000130137352359574*G0_1_0_2_1_0 + 0.00190208967986744*G0_1_0_2_1_1 + 0.000286996953663615*G0_1_0_2_1_2 + 0.000286996953663616*G0_1_0_2_2_0 + 0.000286996953663615*G0_1_0_2_2_1 - 9.78034311367895e-05*G0_1_0_2_2_2; + A[27] = A[181] + 0.0112361712361711*G0_0_1_0_0_0 + 0.00287317620650952*G0_0_1_0_0_1 - 0.00112874779541446*G0_0_1_0_0_2 + 0.00287317620650952*G0_0_1_0_1_0 - 0.00333493666826996*G0_0_1_0_1_1 - 0.000949174282507608*G0_0_1_0_1_2 - 0.00112874779541446*G0_0_1_0_2_0 - 0.000949174282507608*G0_0_1_0_2_1 - 0.00243706910373576*G0_0_1_0_2_2 + 0.00287317620650952*G0_0_1_1_0_0 - 0.00333493666826996*G0_0_1_1_0_1 - 0.000949174282507608*G0_0_1_1_0_2 - 0.00333493666826996*G0_0_1_1_1_0 + 0.00333493666827*G0_0_1_1_1_2 - 0.000949174282507608*G0_0_1_1_2_0 + 0.00333493666827*G0_0_1_1_2_1 - 0.00097482764149431*G0_0_1_1_2_2 - 0.00112874779541446*G0_0_1_2_0_0 - 0.000949174282507608*G0_0_1_2_0_1 - 0.00243706910373576*G0_0_1_2_0_2 - 0.000949174282507608*G0_0_1_2_1_0 + 0.00333493666827*G0_0_1_2_1_1 - 0.000974827641494309*G0_0_1_2_1_2 - 0.00243706910373576*G0_0_1_2_2_0 - 0.000974827641494308*G0_0_1_2_2_1 - 0.000538720538720557*G0_0_1_2_2_2 - 0.0112361712361711*G0_1_0_0_0_0 - 0.00287317620650952*G0_1_0_0_0_1 + 0.00112874779541446*G0_1_0_0_0_2 - 0.00287317620650952*G0_1_0_0_1_0 + 0.00333493666826996*G0_1_0_0_1_1 + 0.000949174282507608*G0_1_0_0_1_2 + 0.00112874779541446*G0_1_0_0_2_0 + 0.000949174282507608*G0_1_0_0_2_1 + 0.00243706910373576*G0_1_0_0_2_2 - 0.00287317620650952*G0_1_0_1_0_0 + 0.00333493666826996*G0_1_0_1_0_1 + 0.000949174282507608*G0_1_0_1_0_2 + 0.00333493666826996*G0_1_0_1_1_0 - 0.00333493666827*G0_1_0_1_1_2 + 0.000949174282507608*G0_1_0_1_2_0 - 0.00333493666827*G0_1_0_1_2_1 + 0.000974827641494308*G0_1_0_1_2_2 + 0.00112874779541446*G0_1_0_2_0_0 + 0.000949174282507608*G0_1_0_2_0_1 + 0.00243706910373576*G0_1_0_2_0_2 + 0.000949174282507608*G0_1_0_2_1_0 - 0.00333493666827*G0_1_0_2_1_1 + 0.000974827641494308*G0_1_0_2_1_2 + 0.00243706910373576*G0_1_0_2_2_0 + 0.000974827641494308*G0_1_0_2_2_1 + 0.000538720538720557*G0_1_0_2_2_2; + A[132] = A[191] - 0.239089305755971*G0_0_0_0_0_0 + 0.00944043610710277*G0_0_0_0_0_1 - 0.0683405483405478*G0_0_0_0_0_2 + 0.00944043610710277*G0_0_0_0_1_0 + 0.0352990219656885*G0_0_0_0_1_1 + 0.00266794933461598*G0_0_0_0_1_2 - 0.0683405483405478*G0_0_0_0_2_0 + 0.00266794933461598*G0_0_0_0_2_1 - 0.0223697290363956*G0_0_0_0_2_2 + 0.00944043610710277*G0_0_0_1_0_0 + 0.0352990219656885*G0_0_0_1_0_1 + 0.00266794933461598*G0_0_0_1_0_2 + 0.0352990219656885*G0_0_0_1_1_0 + 0.20420073753407*G0_0_0_1_1_1 + 0.0313997113997112*G0_0_0_1_1_2 + 0.00266794933461598*G0_0_0_1_2_0 + 0.0313997113997112*G0_0_0_1_2_1 - 0.0137502004168672*G0_0_0_1_2_2 - 0.0683405483405478*G0_0_0_2_0_0 + 0.00266794933461598*G0_0_0_2_0_1 - 0.0223697290363956*G0_0_0_2_0_2 + 0.00266794933461598*G0_0_0_2_1_0 + 0.0313997113997112*G0_0_0_2_1_1 - 0.0137502004168672*G0_0_0_2_1_2 - 0.0223697290363956*G0_0_0_2_2_0 - 0.0137502004168672*G0_0_0_2_2_1 - 0.0316049382716058*G0_0_0_2_2_2 - 0.00543851210517864*G0_0_1_0_0_1 + 0.00543851210517879*G0_0_1_0_0_2 - 0.00543851210517864*G0_0_1_0_1_0 - 0.00359147025813682*G0_0_1_0_1_1 + 0.00543851210517879*G0_0_1_0_2_0 + 0.00359147025813691*G0_0_1_0_2_2 - 0.00543851210517864*G0_0_1_1_0_0 - 0.00359147025813682*G0_0_1_1_0_1 - 0.00359147025813682*G0_0_1_1_1_0 + 0.148379028379028*G0_0_1_1_1_1 + 0.0222671156004488*G0_0_1_1_1_2 + 0.0222671156004488*G0_0_1_1_2_1 - 0.0222671156004489*G0_0_1_1_2_2 + 0.00543851210517879*G0_0_1_2_0_0 + 0.00359147025813691*G0_0_1_2_0_2 + 0.0222671156004488*G0_0_1_2_1_1 - 0.0222671156004489*G0_0_1_2_1_2 + 0.00359147025813691*G0_0_1_2_2_0 - 0.0222671156004489*G0_0_1_2_2_1 - 0.148379028379028*G0_0_1_2_2_2 + 0.0220618887285552*G0_1_0_0_0_1 - 0.0220618887285553*G0_1_0_0_0_2 + 0.0220618887285552*G0_1_0_0_1_0 + 0.0140580407247073*G0_1_0_0_1_1 - 0.0220618887285553*G0_1_0_0_2_0 - 0.0140580407247073*G0_1_0_0_2_2 + 0.0220618887285552*G0_1_0_1_0_0 + 0.0140580407247073*G0_1_0_1_0_1 + 0.0140580407247073*G0_1_0_1_1_0 + 0.104050024050023*G0_1_0_1_1_1 + 0.0263716530383195*G0_1_0_1_1_2 + 0.0263716530383195*G0_1_0_1_2_1 - 0.0263716530383197*G0_1_0_1_2_2 - 0.0220618887285553*G0_1_0_2_0_0 - 0.0140580407247073*G0_1_0_2_0_2 + 0.0263716530383195*G0_1_0_2_1_1 - 0.0263716530383197*G0_1_0_2_1_2 - 0.0140580407247073*G0_1_0_2_2_0 - 0.0263716530383197*G0_1_0_2_2_1 - 0.104050024050024*G0_1_0_2_2_2 + 0.239089305755972*G0_1_1_0_0_0 + 0.0683405483405481*G0_1_1_0_0_1 - 0.00944043610710273*G0_1_1_0_0_2 + 0.0683405483405481*G0_1_1_0_1_0 + 0.0223697290363957*G0_1_1_0_1_1 - 0.00266794933461598*G0_1_1_0_1_2 - 0.00944043610710273*G0_1_1_0_2_0 - 0.00266794933461598*G0_1_1_0_2_1 - 0.0352990219656885*G0_1_1_0_2_2 + 0.0683405483405481*G0_1_1_1_0_0 + 0.0223697290363957*G0_1_1_1_0_1 - 0.00266794933461598*G0_1_1_1_0_2 + 0.0223697290363957*G0_1_1_1_1_0 + 0.0316049382716052*G0_1_1_1_1_1 + 0.013750200416867*G0_1_1_1_1_2 - 0.00266794933461598*G0_1_1_1_2_0 + 0.013750200416867*G0_1_1_1_2_1 - 0.0313997113997113*G0_1_1_1_2_2 - 0.00944043610710274*G0_1_1_2_0_0 - 0.00266794933461598*G0_1_1_2_0_1 - 0.0352990219656885*G0_1_1_2_0_2 - 0.00266794933461598*G0_1_1_2_1_0 + 0.013750200416867*G0_1_1_2_1_1 - 0.0313997113997113*G0_1_1_2_1_2 - 0.0352990219656885*G0_1_1_2_2_0 - 0.0313997113997113*G0_1_1_2_2_1 - 0.20420073753407*G0_1_1_2_2_2; + A[46] = -0.00886323552990215*G0_0_0_0_0_0 - 0.000748222970445198*G0_0_0_0_0_1 - 0.00590882368660143*G0_0_0_0_0_2 - 0.000748222970445198*G0_0_0_0_1_0 + 0.00784565229009665*G0_0_0_0_1_1 - 0.000748222970445195*G0_0_0_0_1_2 - 0.00590882368660143*G0_0_0_0_2_0 - 0.000748222970445195*G0_0_0_0_2_1 - 0.00886323552990215*G0_0_0_0_2_2 - 0.000748222970445198*G0_0_0_1_0_0 + 0.00784565229009665*G0_0_0_1_0_1 - 0.000748222970445195*G0_0_0_1_0_2 + 0.00784565229009665*G0_0_0_1_1_0 + 0.15847362514029*G0_0_0_1_1_1 + 0.0156913045801934*G0_0_0_1_1_2 - 0.000748222970445195*G0_0_0_1_2_0 + 0.0156913045801934*G0_0_0_1_2_1 - 0.00224466891133558*G0_0_0_1_2_2 - 0.00590882368660143*G0_0_0_2_0_0 - 0.000748222970445195*G0_0_0_2_0_1 - 0.00886323552990215*G0_0_0_2_0_2 - 0.000748222970445195*G0_0_0_2_1_0 + 0.0156913045801934*G0_0_0_2_1_1 - 0.00224466891133558*G0_0_0_2_1_2 - 0.00886323552990215*G0_0_0_2_2_0 - 0.00224466891133558*G0_0_0_2_2_1 - 0.0354529421196086*G0_0_0_2_2_2 + 0.000192400192400178*G0_1_0_0_0_0 + 0.00397627064293729*G0_1_0_0_0_1 + 6.41333974667263e-05*G0_1_0_0_0_2 + 0.00397627064293729*G0_1_0_0_1_0 + 0.0335417668751*G0_1_0_0_1_1 + 0.00198813532146864*G0_1_0_0_1_2 + 6.41333974667262e-05*G0_1_0_0_2_0 + 0.00198813532146864*G0_1_0_0_2_1 + 6.41333974667282e-05*G0_1_0_0_2_2 + 0.00397627064293729*G0_1_0_1_0_0 + 0.0335417668751*G0_1_0_1_0_1 + 0.00198813532146864*G0_1_0_1_0_2 + 0.0335417668751*G0_1_0_1_1_0 + 0.541029341029338*G0_1_0_1_1_1 + 0.0335417668751*G0_1_0_1_1_2 + 0.00198813532146864*G0_1_0_1_2_0 + 0.0335417668751*G0_1_0_1_2_1 + 0.00397627064293729*G0_1_0_1_2_2 + 6.41333974667263e-05*G0_1_0_2_0_0 + 0.00198813532146864*G0_1_0_2_0_1 + 6.41333974667282e-05*G0_1_0_2_0_2 + 0.00198813532146864*G0_1_0_2_1_0 + 0.0335417668751*G0_1_0_2_1_1 + 0.00397627064293729*G0_1_0_2_1_2 + 6.41333974667283e-05*G0_1_0_2_2_0 + 0.00397627064293729*G0_1_0_2_2_1 + 0.000192400192400204*G0_1_0_2_2_2; + A[144] = A[176] + 0.631072631072629*G0_0_0_0_0_0 + 0.0335887980332423*G0_0_0_0_0_1 + 0.030647212869435*G0_0_0_0_0_2 + 0.0335887980332423*G0_0_0_0_1_0 - 0.0335887980332424*G0_0_0_0_1_1 + 0.030647212869435*G0_0_0_0_2_0 - 0.00355726577948794*G0_0_0_0_2_2 + 0.0335887980332423*G0_0_0_1_0_0 - 0.0335887980332424*G0_0_0_1_0_1 - 0.0335887980332424*G0_0_0_1_1_0 - 0.631072631072628*G0_0_0_1_1_1 - 0.0306472128694349*G0_0_0_1_1_2 - 0.0306472128694349*G0_0_0_1_2_1 + 0.00355726577948798*G0_0_0_1_2_2 + 0.030647212869435*G0_0_0_2_0_0 - 0.00355726577948794*G0_0_0_2_0_2 - 0.0306472128694349*G0_0_0_2_1_1 + 0.00355726577948798*G0_0_0_2_1_2 - 0.00355726577948794*G0_0_0_2_2_0 + 0.00355726577948798*G0_0_0_2_2_1 - 0.00820907487574138*G0_0_1_0_0_0 + 0.0682379349046012*G0_0_1_0_0_1 + 0.00769600769600769*G0_0_1_0_0_2 + 0.0682379349046012*G0_0_1_0_1_0 + 0.0346491368713589*G0_0_1_0_1_1 + 0.00998770776548551*G0_0_1_0_1_2 + 0.00769600769600769*G0_0_1_0_2_0 + 0.00998770776548551*G0_0_1_0_2_1 + 0.00489124044679599*G0_0_1_0_2_2 + 0.0682379349046012*G0_0_1_1_0_0 + 0.0346491368713589*G0_0_1_1_0_1 + 0.00998770776548551*G0_0_1_1_0_2 + 0.0346491368713589*G0_0_1_1_1_0 - 0.63928170594837*G0_0_1_1_1_1 - 0.0229512051734272*G0_0_1_1_1_2 + 0.00998770776548551*G0_0_1_1_2_0 - 0.0229512051734272*G0_0_1_1_2_1 + 0.00844850622628398*G0_0_1_1_2_2 + 0.00769600769600769*G0_0_1_2_0_0 + 0.00998770776548551*G0_0_1_2_0_1 + 0.00489124044679599*G0_0_1_2_0_2 + 0.00998770776548551*G0_0_1_2_1_0 - 0.0229512051734272*G0_0_1_2_1_1 + 0.00844850622628398*G0_0_1_2_1_2 + 0.00489124044679599*G0_0_1_2_2_0 + 0.00844850622628398*G0_0_1_2_2_1 + 0.013750200416867*G0_0_1_2_2_2 - 0.00820907487574138*G0_1_0_0_0_0 + 0.0682379349046012*G0_1_0_0_0_1 + 0.00769600769600769*G0_1_0_0_0_2 + 0.0682379349046012*G0_1_0_0_1_0 + 0.0346491368713589*G0_1_0_0_1_1 + 0.00998770776548551*G0_1_0_0_1_2 + 0.00769600769600769*G0_1_0_0_2_0 + 0.00998770776548551*G0_1_0_0_2_1 + 0.00489124044679599*G0_1_0_0_2_2 + 0.0682379349046012*G0_1_0_1_0_0 + 0.0346491368713589*G0_1_0_1_0_1 + 0.00998770776548551*G0_1_0_1_0_2 + 0.0346491368713589*G0_1_0_1_1_0 - 0.63928170594837*G0_1_0_1_1_1 - 0.0229512051734272*G0_1_0_1_1_2 + 0.00998770776548551*G0_1_0_1_2_0 - 0.0229512051734272*G0_1_0_1_2_1 + 0.00844850622628398*G0_1_0_1_2_2 + 0.00769600769600769*G0_1_0_2_0_0 + 0.00998770776548551*G0_1_0_2_0_1 + 0.00489124044679599*G0_1_0_2_0_2 + 0.00998770776548551*G0_1_0_2_1_0 - 0.0229512051734272*G0_1_0_2_1_1 + 0.00844850622628398*G0_1_0_2_1_2 + 0.00489124044679599*G0_1_0_2_2_0 + 0.00844850622628398*G0_1_0_2_2_1 + 0.013750200416867*G0_1_0_2_2_2 + 0.497675164341829*G0_1_1_0_0_0 + 0.132029287584843*G0_1_1_0_0_1 + 0.0475442253220029*G0_1_1_0_0_2 + 0.132029287584843*G0_1_1_0_1_0 - 0.0291422158088823*G0_1_1_0_1_1 + 0.00998770776548551*G0_1_1_0_1_2 + 0.0475442253220029*G0_1_1_0_2_0 + 0.00998770776548552*G0_1_1_0_2_1 + 0.0101929346373791*G0_1_1_0_2_2 + 0.132029287584843*G0_1_1_1_0_0 - 0.0291422158088823*G0_1_1_1_0_1 + 0.00998770776548551*G0_1_1_1_0_2 - 0.0291422158088823*G0_1_1_1_1_0 - 1.14516594516594*G0_1_1_1_1_1 - 0.0627994227994224*G0_1_1_1_1_2 + 0.00998770776548552*G0_1_1_1_2_0 - 0.0627994227994224*G0_1_1_1_2_1 + 0.00314681203570095*G0_1_1_1_2_2 + 0.0475442253220029*G0_1_1_2_0_0 + 0.00998770776548552*G0_1_1_2_0_1 + 0.0101929346373791*G0_1_1_2_0_2 + 0.00998770776548552*G0_1_1_2_1_0 - 0.0627994227994224*G0_1_1_2_1_1 + 0.00314681203570095*G0_1_1_2_1_2 + 0.0101929346373791*G0_1_1_2_2_0 + 0.00314681203570094*G0_1_1_2_2_1 + 0.0137502004168671*G0_1_1_2_2_2; + A[89] = 0.000923520923520921*G0_0_0_0_0_0 + 0.000102613435946764*G0_0_0_0_0_1 + 0.0215488215488215*G0_0_0_0_0_2 + 0.000102613435946764*G0_0_0_0_1_0 - 0.000102613435946787*G0_0_0_0_1_1 + 0.0215488215488215*G0_0_0_0_2_0 + 0.068751002084335*G0_0_0_0_2_2 + 0.000102613435946763*G0_0_0_1_0_0 - 0.000102613435946787*G0_0_0_1_0_1 - 0.000102613435946787*G0_0_0_1_1_0 - 0.000923520923520999*G0_0_0_1_1_1 - 0.0215488215488215*G0_0_0_1_1_2 - 0.0215488215488215*G0_0_0_1_2_1 - 0.0687510020843353*G0_0_0_1_2_2 + 0.0215488215488215*G0_0_0_2_0_0 + 0.068751002084335*G0_0_0_2_0_2 - 0.0215488215488215*G0_0_0_2_1_1 - 0.0687510020843353*G0_0_0_2_1_2 + 0.068751002084335*G0_0_0_2_2_0 - 0.0687510020843353*G0_0_0_2_2_1 - 0.00749078082411408*G0_0_1_0_0_0 - 0.0037966971300304*G0_0_1_0_0_1 - 0.00677248677248676*G0_0_1_0_0_2 - 0.0037966971300304*G0_0_1_0_1_0 - 0.00389931056597716*G0_0_1_0_1_1 - 0.00810646143979476*G0_0_1_0_1_2 - 0.00677248677248676*G0_0_1_0_2_0 - 0.00810646143979476*G0_0_1_0_2_1 - 0.0415584415584414*G0_0_1_0_2_2 - 0.0037966971300304*G0_0_1_1_0_0 - 0.00389931056597716*G0_0_1_1_0_1 - 0.00810646143979476*G0_0_1_1_0_2 - 0.00389931056597716*G0_0_1_1_1_0 - 0.00841430174763494*G0_0_1_1_1_1 - 0.0283213083213082*G0_0_1_1_1_2 - 0.00810646143979476*G0_0_1_1_2_0 - 0.0283213083213082*G0_0_1_1_2_1 - 0.110309443642777*G0_0_1_1_2_2 - 0.00677248677248676*G0_0_1_2_0_0 - 0.00810646143979476*G0_0_1_2_0_1 - 0.0415584415584414*G0_0_1_2_0_2 - 0.00810646143979476*G0_0_1_2_1_0 - 0.0283213083213082*G0_0_1_2_1_1 - 0.110309443642777*G0_0_1_2_1_2 - 0.0415584415584414*G0_0_1_2_2_0 - 0.110309443642777*G0_0_1_2_2_1 - 0.638255571588902*G0_0_1_2_2_2 + 0.00420715087381754*G0_1_0_0_0_0 + 0.00933782267115603*G0_1_0_0_0_2 - 0.00420715087381757*G0_1_0_0_1_1 - 0.009337822671156*G0_1_0_0_1_2 + 0.00933782267115603*G0_1_0_0_2_0 - 0.009337822671156*G0_1_0_0_2_1 - 0.00420715087381757*G0_1_0_1_0_1 - 0.009337822671156*G0_1_0_1_0_2 - 0.00420715087381757*G0_1_0_1_1_0 - 0.0336572069905401*G0_1_0_1_1_1 - 0.0840404040404037*G0_1_0_1_1_2 - 0.009337822671156*G0_1_0_1_2_0 - 0.0840404040404037*G0_1_0_1_2_1 - 0.17752124418791*G0_1_0_1_2_2 + 0.00933782267115603*G0_1_0_2_0_0 - 0.009337822671156*G0_1_0_2_0_1 - 0.009337822671156*G0_1_0_2_1_0 - 0.0840404040404037*G0_1_0_2_1_1 - 0.17752124418791*G0_1_0_2_1_2 - 0.17752124418791*G0_1_0_2_2_1 - 0.432002565335897*G0_1_0_2_2_2 - 0.0612602212602209*G0_1_1_0_0_0 - 0.0469969536636201*G0_1_1_0_0_1 - 0.0136475869809203*G0_1_1_0_0_2 - 0.0469969536636201*G0_1_1_0_1_0 - 0.0654673721340385*G0_1_1_0_1_1 - 0.0229854096520763*G0_1_1_0_1_2 - 0.0136475869809203*G0_1_1_0_2_0 - 0.0229854096520763*G0_1_1_0_2_1 - 0.0446368446368446*G0_1_1_0_2_2 - 0.0469969536636201*G0_1_1_1_0_0 - 0.0654673721340385*G0_1_1_1_0_1 - 0.0229854096520763*G0_1_1_1_0_2 - 0.0654673721340385*G0_1_1_1_1_0 - 0.184704184704184*G0_1_1_1_1_1 - 0.101997755331088*G0_1_1_1_1_2 - 0.0229854096520763*G0_1_1_1_2_0 - 0.101997755331088*G0_1_1_1_2_1 - 0.200096200096199*G0_1_1_1_2_2 - 0.0136475869809203*G0_1_1_2_0_0 - 0.0229854096520763*G0_1_1_2_0_1 - 0.0446368446368446*G0_1_1_2_0_2 - 0.0229854096520763*G0_1_1_2_1_0 - 0.101997755331088*G0_1_1_2_1_1 - 0.200096200096199*G0_1_1_2_1_2 - 0.0446368446368446*G0_1_1_2_2_0 - 0.200096200096199*G0_1_1_2_2_1 - 0.635690235690233*G0_1_1_2_2_2; + A[113] = -A[110] - 0.028090428090428*G0_0_1_0_0_0 - 0.00525893859227194*G0_0_1_0_0_1 - 0.0625941959275292*G0_0_1_0_0_2 - 0.00525893859227194*G0_0_1_0_1_0 - 0.00115440115440122*G0_0_1_0_1_1 - 0.01333974667308*G0_0_1_0_1_2 - 0.0625941959275292*G0_0_1_0_2_0 - 0.01333974667308*G0_0_1_0_2_1 - 0.115953182619849*G0_0_1_0_2_2 - 0.00525893859227194*G0_0_1_1_0_0 - 0.00115440115440122*G0_0_1_1_0_1 - 0.01333974667308*G0_0_1_1_0_2 - 0.00115440115440122*G0_0_1_1_1_0 + 0.00885040885040834*G0_0_1_1_1_1 + 0.00923520923520911*G0_0_1_1_1_2 - 0.01333974667308*G0_0_1_1_2_0 + 0.00923520923520911*G0_0_1_1_2_1 - 0.00718294051627397*G0_0_1_1_2_2 - 0.0625941959275292*G0_0_1_2_0_0 - 0.01333974667308*G0_0_1_2_0_1 - 0.115953182619849*G0_0_1_2_0_2 - 0.01333974667308*G0_0_1_2_1_0 + 0.00923520923520911*G0_0_1_2_1_1 - 0.00718294051627397*G0_0_1_2_1_2 - 0.115953182619849*G0_0_1_2_2_0 - 0.00718294051627398*G0_0_1_2_2_1 - 0.469456469456468*G0_0_1_2_2_2 - 0.370511463844795*G0_1_1_0_0_0 - 0.0668013468013465*G0_1_1_0_0_1 - 0.078524931858265*G0_1_1_0_0_2 - 0.0668013468013465*G0_1_1_0_1_0 - 0.0261407728074394*G0_1_1_0_1_1 - 0.0204970338303671*G0_1_1_0_1_2 - 0.078524931858265*G0_1_1_0_2_0 - 0.0204970338303671*G0_1_1_0_2_1 - 0.104152637485971*G0_1_1_0_2_2 - 0.0668013468013465*G0_1_1_1_0_0 - 0.0261407728074394*G0_1_1_1_0_1 - 0.0204970338303671*G0_1_1_1_0_2 - 0.0261407728074394*G0_1_1_1_1_0 - 0.00456629789963152*G0_1_1_1_1_1 + 0.000230880230880149*G0_1_1_1_1_2 - 0.0204970338303671*G0_1_1_1_2_0 + 0.000230880230880149*G0_1_1_1_2_1 - 0.0220618887285555*G0_1_1_1_2_2 - 0.078524931858265*G0_1_1_2_0_0 - 0.0204970338303671*G0_1_1_2_0_1 - 0.104152637485971*G0_1_1_2_0_2 - 0.0204970338303671*G0_1_1_2_1_0 + 0.000230880230880146*G0_1_1_2_1_1 - 0.0220618887285555*G0_1_1_2_1_2 - 0.104152637485971*G0_1_1_2_2_0 - 0.0220618887285555*G0_1_1_2_2_1 - 0.45509058842392*G0_1_1_2_2_2; + A[97] = A[113] - 0.0439442039442037*G0_0_0_0_0_0 - 0.00813211479878143*G0_0_0_0_0_1 - 0.00436107102773771*G0_0_0_0_0_2 - 0.00813211479878142*G0_0_0_0_1_0 - 0.00305274971941638*G0_0_0_0_1_1 - 0.00461760461760462*G0_0_0_0_1_2 - 0.00436107102773771*G0_0_0_0_2_0 - 0.00461760461760462*G0_0_0_0_2_1 - 0.0260125060125061*G0_0_0_0_2_2 - 0.00813211479878142*G0_0_0_1_0_0 - 0.00305274971941638*G0_0_0_1_0_1 - 0.00461760461760462*G0_0_0_1_0_2 - 0.00305274971941638*G0_0_0_1_1_0 - 0.00561808561808563*G0_0_0_1_1_1 - 0.00487413820747155*G0_0_0_1_1_2 - 0.00461760461760462*G0_0_0_1_2_0 - 0.00487413820747154*G0_0_0_1_2_1 + 0.0106204906204905*G0_0_0_1_2_2 - 0.00436107102773771*G0_0_0_2_0_0 - 0.00461760461760462*G0_0_0_2_0_1 - 0.0260125060125061*G0_0_0_2_0_2 - 0.00461760461760462*G0_0_0_2_1_0 - 0.00487413820747154*G0_0_0_2_1_1 + 0.0106204906204905*G0_0_0_2_1_2 - 0.0260125060125061*G0_0_0_2_2_0 + 0.0106204906204905*G0_0_0_2_2_1 + 0.286291486291483*G0_0_0_2_2_2 - 0.175084175084175*G0_0_1_0_0_0 - 0.0173673240339907*G0_0_1_0_0_1 - 0.05700176366843*G0_0_1_0_0_2 - 0.0173673240339907*G0_0_1_0_1_0 - 0.00397627064293731*G0_0_1_0_1_1 - 0.00461760461760459*G0_0_1_0_1_2 - 0.05700176366843*G0_0_1_0_2_0 - 0.00461760461760459*G0_0_1_0_2_1 + 0.0266281866281867*G0_0_1_0_2_2 - 0.0173673240339907*G0_0_1_1_0_0 - 0.00397627064293731*G0_0_1_1_0_1 - 0.00461760461760459*G0_0_1_1_0_2 - 0.00397627064293731*G0_0_1_1_1_0 - 0.00561808561808557*G0_0_1_1_1_1 - 0.00395061728395059*G0_0_1_1_1_2 - 0.00461760461760459*G0_0_1_1_2_0 - 0.00395061728395059*G0_0_1_1_2_1 + 0.0198556998556998*G0_0_1_1_2_2 - 0.05700176366843*G0_0_1_2_0_0 - 0.00461760461760459*G0_0_1_2_0_1 + 0.0266281866281868*G0_0_1_2_0_2 - 0.00461760461760458*G0_0_1_2_1_0 - 0.00395061728395059*G0_0_1_2_1_1 + 0.0198556998556998*G0_0_1_2_1_2 + 0.0266281866281868*G0_0_1_2_2_0 + 0.0198556998556998*G0_0_1_2_2_1 + 0.417431457431455*G0_0_1_2_2_2 + 0.0833477633477635*G0_1_0_0_0_0 + 0.00374539041205711*G0_1_0_0_0_1 + 0.00659291325957988*G0_1_0_0_0_2 + 0.00374539041205711*G0_1_0_0_1_0 - 0.00138528138528137*G0_1_0_0_1_1 - 0.00461760461760461*G0_1_0_0_1_2 + 0.00659291325957988*G0_1_0_0_2_0 - 0.00461760461760461*G0_1_0_0_2_1 - 0.0369664902998236*G0_1_0_0_2_2 + 0.00374539041205711*G0_1_0_1_0_0 - 0.00138528138528137*G0_1_0_1_0_1 - 0.00461760461760461*G0_1_0_1_0_2 - 0.00138528138528137*G0_1_0_1_1_0 - 0.00561808561808563*G0_1_0_1_1_1 - 0.00654160654160652*G0_1_0_1_1_2 - 0.00461760461760461*G0_1_0_1_2_0 - 0.00654160654160652*G0_1_0_1_2_1 - 0.001257014590348*G0_1_0_1_2_2 + 0.00659291325957988*G0_1_0_2_0_0 - 0.00461760461760461*G0_1_0_2_0_1 - 0.0369664902998236*G0_1_0_2_0_2 - 0.00461760461760461*G0_1_0_2_1_0 - 0.00654160654160652*G0_1_0_2_1_1 - 0.00125701459034799*G0_1_0_2_1_2 - 0.0369664902998236*G0_1_0_2_2_0 - 0.00125701459034799*G0_1_0_2_2_1 + 0.158999518999517*G0_1_0_2_2_2 - 0.334083694083692*G0_1_1_0_0_0 - 0.0161103094436427*G0_1_1_0_0_1 - 0.0200352733686065*G0_1_1_0_0_2 - 0.0161103094436427*G0_1_1_0_1_0 + 0.00256533589866921*G0_1_1_0_1_1 - 0.0200352733686065*G0_1_1_0_2_0 + 0.0200352733686068*G0_1_1_0_2_2 - 0.0161103094436427*G0_1_1_1_0_0 + 0.00256533589866921*G0_1_1_1_0_1 + 0.00256533589866921*G0_1_1_1_1_0 - 0.00256533589866921*G0_1_1_1_1_2 - 0.00256533589866921*G0_1_1_1_2_1 + 0.0161103094436428*G0_1_1_1_2_2 - 0.0200352733686065*G0_1_1_2_0_0 + 0.0200352733686068*G0_1_1_2_0_2 - 0.00256533589866921*G0_1_1_2_1_1 + 0.0161103094436428*G0_1_1_2_1_2 + 0.0200352733686068*G0_1_1_2_2_0 + 0.0161103094436428*G0_1_1_2_2_1 + 0.334083694083692*G0_1_1_2_2_2; + A[111] = A[97] + 0.294757094757095*G0_0_1_0_0_0 + 0.0271925605258939*G0_0_1_0_0_1 + 0.129549462882796*G0_0_1_0_0_2 + 0.0271925605258939*G0_0_1_0_1_0 + 0.00464325797659132*G0_0_1_0_1_1 + 0.0133140933140933*G0_0_1_0_1_2 + 0.129549462882796*G0_0_1_0_2_0 + 0.0133140933140933*G0_0_1_0_2_1 + 0.0659547859547856*G0_0_1_0_2_2 + 0.0271925605258939*G0_0_1_1_0_0 + 0.00464325797659132*G0_0_1_1_0_1 + 0.0133140933140933*G0_0_1_1_0_2 + 0.00464325797659132*G0_0_1_1_1_0 + 0.00205226871893538*G0_0_1_1_1_2 + 0.0133140933140933*G0_0_1_1_2_0 + 0.00205226871893538*G0_0_1_1_2_1 + 0.00607984607984605*G0_0_1_1_2_2 + 0.129549462882796*G0_0_1_2_0_0 + 0.0133140933140933*G0_0_1_2_0_1 + 0.0659547859547856*G0_0_1_2_0_2 + 0.0133140933140933*G0_0_1_2_1_0 + 0.00205226871893538*G0_0_1_2_1_1 + 0.00607984607984605*G0_0_1_2_1_2 + 0.0659547859547856*G0_0_1_2_2_0 + 0.00607984607984605*G0_0_1_2_2_1 + 0.0363251563251558*G0_0_1_2_2_2 - 0.294757094757095*G0_1_0_0_0_0 - 0.0271925605258939*G0_1_0_0_0_1 - 0.129549462882796*G0_1_0_0_0_2 - 0.0271925605258939*G0_1_0_0_1_0 - 0.00464325797659132*G0_1_0_0_1_1 - 0.0133140933140933*G0_1_0_0_1_2 - 0.129549462882796*G0_1_0_0_2_0 - 0.0133140933140933*G0_1_0_0_2_1 - 0.0659547859547856*G0_1_0_0_2_2 - 0.0271925605258939*G0_1_0_1_0_0 - 0.00464325797659132*G0_1_0_1_0_1 - 0.0133140933140933*G0_1_0_1_0_2 - 0.00464325797659132*G0_1_0_1_1_0 - 0.00205226871893538*G0_1_0_1_1_2 - 0.0133140933140933*G0_1_0_1_2_0 - 0.00205226871893538*G0_1_0_1_2_1 - 0.00607984607984604*G0_1_0_1_2_2 - 0.129549462882796*G0_1_0_2_0_0 - 0.0133140933140933*G0_1_0_2_0_1 - 0.0659547859547856*G0_1_0_2_0_2 - 0.0133140933140933*G0_1_0_2_1_0 - 0.00205226871893538*G0_1_0_2_1_1 - 0.00607984607984603*G0_1_0_2_1_2 - 0.0659547859547856*G0_1_0_2_2_0 - 0.00607984607984603*G0_1_0_2_2_1 - 0.0363251563251557*G0_1_0_2_2_2; + A[195] = A[181] + 0.116363636363636*G0_0_0_0_0_0 + 0.00441237774571106*G0_0_0_0_0_1 + 0.0282186948853614*G0_0_0_0_0_2 + 0.00441237774571106*G0_0_0_0_1_0 - 0.00441237774571108*G0_0_0_0_1_1 + 0.0282186948853614*G0_0_0_0_2_0 + 0.0118518518518518*G0_0_0_0_2_2 + 0.00441237774571106*G0_0_0_1_0_0 - 0.00441237774571108*G0_0_0_1_0_1 - 0.00441237774571108*G0_0_0_1_1_0 - 0.116363636363636*G0_0_0_1_1_1 - 0.0282186948853614*G0_0_0_1_1_2 - 0.0282186948853614*G0_0_0_1_2_1 - 0.0118518518518518*G0_0_0_1_2_2 + 0.0282186948853614*G0_0_0_2_0_0 + 0.0118518518518518*G0_0_0_2_0_2 - 0.0282186948853614*G0_0_0_2_1_1 - 0.0118518518518518*G0_0_0_2_1_2 + 0.0118518518518518*G0_0_0_2_2_0 - 0.0118518518518518*G0_0_0_2_2_1 + 0.059515792849126*G0_0_1_0_0_0 + 0.00387365720699055*G0_0_1_0_0_1 + 0.00715728715728711*G0_0_1_0_0_2 + 0.00387365720699055*G0_0_1_0_1_0 - 0.000538720538720515*G0_0_1_0_1_1 - 0.00107744107744107*G0_0_1_0_1_2 + 0.00715728715728711*G0_0_1_0_2_0 - 0.00107744107744107*G0_0_1_0_2_1 - 0.00128266794933463*G0_0_1_0_2_2 + 0.00387365720699055*G0_0_1_1_0_0 - 0.000538720538720515*G0_0_1_1_0_1 - 0.00107744107744107*G0_0_1_1_0_2 - 0.000538720538720516*G0_0_1_1_1_0 - 0.0568478435145097*G0_0_1_1_1_1 - 0.0210614077280742*G0_0_1_1_1_2 - 0.00107744107744107*G0_0_1_1_2_0 - 0.0210614077280742*G0_0_1_1_2_1 - 0.0131345198011864*G0_0_1_1_2_2 + 0.00715728715728711*G0_0_1_2_0_0 - 0.00107744107744107*G0_0_1_2_0_1 - 0.00128266794933463*G0_0_1_2_0_2 - 0.00107744107744107*G0_0_1_2_1_0 - 0.0210614077280742*G0_0_1_2_1_1 - 0.0131345198011864*G0_0_1_2_1_2 - 0.00128266794933463*G0_0_1_2_2_0 - 0.0131345198011864*G0_0_1_2_2_1 - 0.00590027256693925*G0_0_1_2_2_2 + 0.0482796216129543*G0_1_0_0_0_0 + 0.00433541766875097*G0_1_0_0_0_1 + 0.00495109828443158*G0_1_0_0_0_2 + 0.00433541766875097*G0_1_0_0_1_0 + 0.00082090748757415*G0_1_0_0_1_2 + 0.00495109828443158*G0_1_0_0_2_0 + 0.00082090748757415*G0_1_0_0_2_1 + 0.00212922879589546*G0_1_0_0_2_2 + 0.00433541766875097*G0_1_0_1_0_0 + 0.00082090748757415*G0_1_0_1_0_2 - 0.0680840147506811*G0_1_0_1_1_1 - 0.0232675966009298*G0_1_0_1_1_2 + 0.00082090748757415*G0_1_0_1_2_0 - 0.0232675966009298*G0_1_0_1_2_1 - 0.0097226230559563*G0_1_0_1_2_2 + 0.00495109828443158*G0_1_0_2_0_0 + 0.00082090748757415*G0_1_0_2_0_1 + 0.00212922879589546*G0_1_0_2_0_2 + 0.00082090748757415*G0_1_0_2_1_0 - 0.0232675966009298*G0_1_0_2_1_1 - 0.00972262305595631*G0_1_0_2_1_2 + 0.00212922879589546*G0_1_0_2_2_0 - 0.0097226230559563*G0_1_0_2_2_1 - 0.00482283148949812*G0_1_0_2_2_2 + 0.0595157928491255*G0_1_1_0_0_0 + 0.00720859387526052*G0_1_1_0_0_1 + 0.00382235048901712*G0_1_1_0_0_2 + 0.00720859387526052*G0_1_1_0_1_0 - 0.00341189674523002*G0_1_1_0_1_1 - 0.000128266794933453*G0_1_1_0_1_2 + 0.00382235048901712*G0_1_1_0_2_0 - 0.000128266794933453*G0_1_1_0_2_1 - 0.000307840307840303*G0_1_1_0_2_2 + 0.00720859387526052*G0_1_1_1_0_0 - 0.00341189674523001*G0_1_1_1_0_1 - 0.000128266794933453*G0_1_1_1_0_2 - 0.00341189674523001*G0_1_1_1_1_0 - 0.0680840147506807*G0_1_1_1_1_1 - 0.0199326599326597*G0_1_1_1_1_2 - 0.000128266794933453*G0_1_1_1_2_0 - 0.0199326599326597*G0_1_1_1_2_1 - 0.0106974506974506*G0_1_1_1_2_2 + 0.00382235048901712*G0_1_1_2_0_0 - 0.000128266794933453*G0_1_1_2_0_1 - 0.000307840307840303*G0_1_1_2_0_2 - 0.000128266794933453*G0_1_1_2_1_0 - 0.0199326599326597*G0_1_1_2_1_1 - 0.0106974506974506*G0_1_1_2_1_2 - 0.000307840307840303*G0_1_1_2_2_0 - 0.0106974506974506*G0_1_1_2_2_1 - 0.00536155202821865*G0_1_1_2_2_2; + A[188] = A[132] - 0.0412506012506013*G0_0_1_0_0_0 + 0.00728555395222051*G0_0_1_0_0_1 - 0.0202148468815134*G0_0_1_0_0_2 + 0.00728555395222051*G0_0_1_0_1_0 + 0.00892736892736886*G0_0_1_0_1_1 - 0.000410453743787075*G0_0_1_0_1_2 - 0.0202148468815134*G0_0_1_0_2_0 - 0.000410453743787075*G0_0_1_0_2_1 - 0.00872214205547528*G0_0_1_0_2_2 + 0.00728555395222052*G0_0_1_1_0_0 + 0.00892736892736886*G0_0_1_1_0_1 - 0.000410453743787075*G0_0_1_1_0_2 + 0.00892736892736886*G0_0_1_1_1_0 + 0.00800384800384795*G0_0_1_1_1_1 + 0.00564373897707226*G0_0_1_1_1_2 - 0.000410453743787075*G0_0_1_1_2_0 + 0.00564373897707227*G0_0_1_1_2_1 + 0.00153920153920153*G0_0_1_1_2_2 - 0.0202148468815134*G0_0_1_2_0_0 - 0.000410453743787075*G0_0_1_2_0_1 - 0.00872214205547529*G0_0_1_2_0_2 - 0.000410453743787075*G0_0_1_2_1_0 + 0.00564373897707226*G0_0_1_2_1_1 + 0.00153920153920152*G0_0_1_2_1_2 - 0.00872214205547528*G0_0_1_2_2_0 + 0.00153920153920152*G0_0_1_2_2_1 + 0.0523328523328519*G0_0_1_2_2_2 + 0.0412506012506014*G0_1_0_0_0_0 - 0.00728555395222051*G0_1_0_0_0_1 + 0.0202148468815134*G0_1_0_0_0_2 - 0.00728555395222051*G0_1_0_0_1_0 - 0.00892736892736886*G0_1_0_0_1_1 + 0.000410453743787077*G0_1_0_0_1_2 + 0.0202148468815134*G0_1_0_0_2_0 + 0.000410453743787077*G0_1_0_0_2_1 + 0.00872214205547528*G0_1_0_0_2_2 - 0.00728555395222051*G0_1_0_1_0_0 - 0.00892736892736886*G0_1_0_1_0_1 + 0.000410453743787076*G0_1_0_1_0_2 - 0.00892736892736886*G0_1_0_1_1_0 - 0.00800384800384795*G0_1_0_1_1_1 - 0.00564373897707226*G0_1_0_1_1_2 + 0.000410453743787076*G0_1_0_1_2_0 - 0.00564373897707226*G0_1_0_1_2_1 - 0.00153920153920153*G0_1_0_1_2_2 + 0.0202148468815134*G0_1_0_2_0_0 + 0.000410453743787075*G0_1_0_2_0_1 + 0.00872214205547529*G0_1_0_2_0_2 + 0.000410453743787075*G0_1_0_2_1_0 - 0.00564373897707226*G0_1_0_2_1_1 - 0.00153920153920153*G0_1_0_2_1_2 + 0.00872214205547528*G0_1_0_2_2_0 - 0.00153920153920153*G0_1_0_2_2_1 - 0.0523328523328519*G0_1_0_2_2_2; + A[14] = A[195] + 0.000230880230880229*G0_0_0_0_1_1 + 0.000949174282507614*G0_0_0_0_1_2 + 0.000949174282507614*G0_0_0_0_2_1 - 0.00212922879589541*G0_0_0_0_2_2 + 0.000230880230880228*G0_0_0_1_0_1 + 0.000949174282507614*G0_0_0_1_0_2 + 0.000230880230880228*G0_0_0_1_1_0 + 0.0514862914862911*G0_0_0_1_1_1 + 0.0103639570306236*G0_0_0_1_1_2 + 0.000949174282507615*G0_0_0_1_2_0 + 0.0103639570306236*G0_0_0_1_2_1 - 0.0067981401314734*G0_0_0_1_2_2 + 0.000949174282507614*G0_0_0_2_0_1 - 0.00212922879589541*G0_0_0_2_0_2 + 0.000949174282507615*G0_0_0_2_1_0 + 0.0103639570306236*G0_0_0_2_1_1 - 0.0067981401314734*G0_0_0_2_1_2 - 0.00212922879589541*G0_0_0_2_2_0 - 0.0067981401314734*G0_0_0_2_2_1 - 0.0621837421837417*G0_0_0_2_2_2 + 0.00328362995029662*G0_0_1_0_0_1 - 0.00328362995029656*G0_0_1_0_0_2 + 0.00328362995029662*G0_0_1_0_1_0 - 0.000743947410614085*G0_0_1_0_1_1 - 0.00328362995029656*G0_0_1_0_2_0 + 0.000743947410614101*G0_0_1_0_2_2 + 0.00328362995029663*G0_0_1_1_0_0 - 0.000743947410614084*G0_0_1_1_0_1 - 0.000743947410614084*G0_0_1_1_1_0 + 0.0509475709475705*G0_0_1_1_1_1 + 0.00792688792688783*G0_0_1_1_1_2 + 0.00792688792688783*G0_0_1_1_2_1 - 0.00792688792688787*G0_0_1_1_2_2 - 0.00328362995029656*G0_0_1_2_0_0 + 0.000743947410614101*G0_0_1_2_0_2 + 0.00792688792688784*G0_0_1_2_1_1 - 0.00792688792688787*G0_0_1_2_1_2 + 0.0007439474106141*G0_0_1_2_2_0 - 0.00792688792688787*G0_0_1_2_2_1 - 0.0509475709475705*G0_0_1_2_2_2 - 0.00338624338624332*G0_1_0_0_0_1 + 0.00338624338624342*G0_1_0_0_0_2 - 0.00338624338624332*G0_1_0_0_1_0 + 0.00310405643738975*G0_1_0_0_1_1 + 0.00338624338624342*G0_1_0_0_2_0 - 0.00310405643738975*G0_1_0_0_2_2 - 0.00338624338624332*G0_1_0_1_0_0 + 0.00310405643738975*G0_1_0_1_0_1 + 0.00310405643738975*G0_1_0_1_1_0 + 0.0627224627224623*G0_1_0_1_1_1 + 0.00923520923520917*G0_1_0_1_1_2 + 0.00923520923520917*G0_1_0_1_2_1 - 0.00923520923520917*G0_1_0_1_2_2 + 0.00338624338624342*G0_1_0_2_0_0 - 0.00310405643738975*G0_1_0_2_0_2 + 0.00923520923520917*G0_1_0_2_1_1 - 0.00923520923520917*G0_1_0_2_1_2 - 0.00310405643738975*G0_1_0_2_2_0 - 0.00923520923520917*G0_1_0_2_2_1 - 0.0627224627224624*G0_1_0_2_2_2 + 0.00212922879589539*G0_1_1_0_1_1 - 0.000949174282507614*G0_1_1_0_1_2 - 0.000949174282507614*G0_1_1_0_2_1 - 0.000230880230880229*G0_1_1_0_2_2 + 0.00212922879589539*G0_1_1_1_0_1 - 0.000949174282507614*G0_1_1_1_0_2 + 0.00212922879589539*G0_1_1_1_1_0 + 0.0621837421837415*G0_1_1_1_1_1 + 0.00679814013147336*G0_1_1_1_1_2 - 0.000949174282507614*G0_1_1_1_2_0 + 0.00679814013147336*G0_1_1_1_2_1 - 0.0103639570306236*G0_1_1_1_2_2 - 0.000949174282507614*G0_1_1_2_0_1 - 0.000230880230880228*G0_1_1_2_0_2 - 0.000949174282507614*G0_1_1_2_1_0 + 0.00679814013147337*G0_1_1_2_1_1 - 0.0103639570306236*G0_1_1_2_1_2 - 0.000230880230880228*G0_1_1_2_2_0 - 0.0103639570306236*G0_1_1_2_2_1 - 0.0514862914862912*G0_1_1_2_2_2; + A[56] = -A[176] + 0.208613115279781*G0_0_0_0_0_0 + 0.0559243225909891*G0_0_0_0_0_1 + 0.0515119448452778*G0_0_0_0_0_2 + 0.0559243225909891*G0_0_0_0_1_0 + 0.0855111966223074*G0_0_0_0_1_1 + 0.0165891721447276*G0_0_0_0_1_2 + 0.0515119448452778*G0_0_0_0_2_0 + 0.0165891721447276*G0_0_0_0_2_1 + 0.0334861845972955*G0_0_0_0_2_2 + 0.0559243225909891*G0_0_0_1_0_0 + 0.0855111966223074*G0_0_0_1_0_1 + 0.0165891721447276*G0_0_0_1_0_2 + 0.0855111966223074*G0_0_0_1_1_0 + 0.539746673080005*G0_0_0_1_1_1 + 0.0294158516380738*G0_0_0_1_1_2 + 0.0165891721447276*G0_0_0_1_2_0 + 0.0294158516380738*G0_0_0_1_2_1 + 0.0104323659879215*G0_0_0_1_2_2 + 0.0515119448452778*G0_0_0_2_0_0 + 0.0165891721447276*G0_0_0_2_0_1 + 0.0334861845972955*G0_0_0_2_0_2 + 0.0165891721447276*G0_0_0_2_1_0 + 0.0294158516380738*G0_0_0_2_1_1 + 0.0104323659879215*G0_0_0_2_1_2 + 0.0334861845972955*G0_0_0_2_2_0 + 0.0104323659879215*G0_0_0_2_2_1 + 0.0463812730479394*G0_0_0_2_2_2 - 0.00769600769600778*G0_0_1_0_0_0 - 0.0123136123136122*G0_0_1_0_0_1 - 0.00256533589866923*G0_0_1_0_0_2 - 0.0123136123136122*G0_0_1_0_1_0 - 0.0266794933461598*G0_0_1_0_1_1 - 0.00615680615680612*G0_0_1_0_1_2 - 0.00256533589866923*G0_0_1_0_2_0 - 0.00615680615680612*G0_0_1_0_2_1 - 0.00256533589866921*G0_0_1_0_2_2 - 0.0123136123136122*G0_0_1_1_0_0 - 0.0266794933461598*G0_0_1_1_0_1 - 0.00615680615680612*G0_0_1_1_0_2 - 0.0266794933461598*G0_0_1_1_1_0 + 0.301683501683502*G0_0_1_1_1_1 - 0.0266794933461598*G0_0_1_1_1_2 - 0.00615680615680612*G0_0_1_1_2_0 - 0.0266794933461598*G0_0_1_1_2_1 - 0.0123136123136123*G0_0_1_1_2_2 - 0.00256533589866923*G0_0_1_2_0_0 - 0.00615680615680612*G0_0_1_2_0_1 - 0.00256533589866921*G0_0_1_2_0_2 - 0.00615680615680612*G0_0_1_2_1_0 - 0.0266794933461599*G0_0_1_2_1_1 - 0.0123136123136123*G0_0_1_2_1_2 - 0.00256533589866921*G0_0_1_2_2_0 - 0.0123136123136123*G0_0_1_2_2_1 - 0.00769600769600762*G0_0_1_2_2_2; + A[99] = A[56] - 0.299939073272405*G0_0_0_0_0_0 - 0.004001924001924*G0_0_0_0_0_1 - 0.052743306076639*G0_0_0_0_0_2 - 0.004001924001924*G0_0_0_0_1_0 + 0.00400192400192397*G0_0_0_0_1_1 - 0.052743306076639*G0_0_0_0_2_0 - 0.019496552829886*G0_0_0_0_2_2 - 0.004001924001924*G0_0_0_1_0_0 + 0.00400192400192396*G0_0_0_1_0_1 + 0.00400192400192396*G0_0_0_1_1_0 + 0.299939073272404*G0_0_0_1_1_1 + 0.0527433060766391*G0_0_0_1_1_2 + 0.0527433060766391*G0_0_0_1_2_1 + 0.019496552829886*G0_0_0_1_2_2 - 0.052743306076639*G0_0_0_2_0_0 - 0.019496552829886*G0_0_0_2_0_2 + 0.0527433060766391*G0_0_0_2_1_1 + 0.019496552829886*G0_0_0_2_1_2 - 0.019496552829886*G0_0_0_2_2_0 + 0.019496552829886*G0_0_0_2_2_1 + 0.253968253968252*G0_0_1_0_0_0 + 0.0562663673774781*G0_0_1_0_0_1 + 0.0509646731868952*G0_0_1_0_0_2 + 0.0562663673774781*G0_0_1_0_1_0 + 0.0602682913794021*G0_0_1_0_1_1 + 0.0189150766928544*G0_0_1_0_1_2 + 0.0509646731868952*G0_0_1_0_2_0 + 0.0189150766928544*G0_0_1_0_2_1 + 0.020420073753407*G0_0_1_0_2_2 + 0.0562663673774781*G0_0_1_1_0_0 + 0.0602682913794021*G0_0_1_1_0_1 + 0.0189150766928544*G0_0_1_1_0_2 + 0.0602682913794021*G0_0_1_1_1_0 + 0.553907327240657*G0_0_1_1_1_1 + 0.103707979263534*G0_0_1_1_1_2 + 0.0189150766928544*G0_0_1_1_2_0 + 0.103707979263534*G0_0_1_1_2_1 + 0.0399166265832931*G0_0_1_1_2_2 + 0.0509646731868952*G0_0_1_2_0_0 + 0.0189150766928544*G0_0_1_2_0_1 + 0.020420073753407*G0_0_1_2_0_2 + 0.0189150766928544*G0_0_1_2_1_0 + 0.103707979263534*G0_0_1_2_1_1 + 0.0399166265832931*G0_0_1_2_1_2 + 0.020420073753407*G0_0_1_2_2_0 + 0.0399166265832931*G0_0_1_2_2_1 + 0.0480230880230878*G0_0_1_2_2_2 + 0.547955747955746*G0_1_0_0_0_0 + 0.0172732617177062*G0_1_0_0_0_1 + 0.0217198439420661*G0_1_0_0_0_2 + 0.0172732617177062*G0_1_0_0_1_0 + 0.0212751857196301*G0_1_0_0_1_1 + 0.00660146437924214*G0_1_0_0_1_2 + 0.0217198439420661*G0_1_0_0_2_0 + 0.00660146437924214*G0_1_0_0_2_1 + 0.00554112554112554*G0_1_0_0_2_2 + 0.0172732617177062*G0_1_0_1_0_0 + 0.0212751857196301*G0_1_0_1_0_1 + 0.00660146437924214*G0_1_0_1_0_2 + 0.0212751857196301*G0_1_0_1_1_0 + 0.847894821228151*G0_1_0_1_1_1 + 0.0744631500187052*G0_1_0_1_1_2 + 0.00660146437924214*G0_1_0_1_2_0 + 0.0744631500187052*G0_1_0_1_2_1 + 0.0250376783710115*G0_1_0_1_2_2 + 0.0217198439420661*G0_1_0_2_0_0 + 0.00660146437924214*G0_1_0_2_0_1 + 0.00554112554112554*G0_1_0_2_0_2 + 0.00660146437924214*G0_1_0_2_1_0 + 0.0744631500187052*G0_1_0_2_1_1 + 0.0250376783710115*G0_1_0_2_1_2 + 0.00554112554112554*G0_1_0_2_2_0 + 0.0250376783710115*G0_1_0_2_2_1 + 0.0326310726310724*G0_1_0_2_2_2 - 0.259611992945325*G0_1_1_0_0_0 - 0.0198385976163753*G0_1_1_0_0_1 + 0.0085511196622308*G0_1_1_0_0_2 - 0.0198385976163753*G0_1_1_0_1_0 + 0.0973801507134835*G0_1_1_0_1_1 + 0.0127582705360483*G0_1_1_0_1_2 + 0.0085511196622308*G0_1_1_0_2_0 + 0.0127582705360483*G0_1_1_0_2_1 + 0.0125530436641547*G0_1_1_0_2_2 - 0.0198385976163753*G0_1_1_1_0_0 + 0.0973801507134835*G0_1_1_1_0_1 + 0.0127582705360483*G0_1_1_1_0_2 + 0.0973801507134835*G0_1_1_1_1_0 + 1.36147506814173*G0_1_1_1_1_1 + 0.11687670354337*G0_1_1_1_1_2 + 0.0127582705360483*G0_1_1_1_2_0 + 0.11687670354337*G0_1_1_1_2_1 + 0.0329047084602639*G0_1_1_1_2_2 + 0.0085511196622308*G0_1_1_2_0_0 + 0.0127582705360483*G0_1_1_2_0_1 + 0.0125530436641547*G0_1_1_2_0_2 + 0.0127582705360483*G0_1_1_2_1_0 + 0.11687670354337*G0_1_1_2_1_1 + 0.0329047084602639*G0_1_1_2_1_2 + 0.0125530436641547*G0_1_1_2_2_0 + 0.0329047084602639*G0_1_1_2_2_1 + 0.0403270803270801*G0_1_1_2_2_2; + A[125] = A[56] - 0.0403270803270801*G0_0_0_0_0_0 - 0.0125530436641547*G0_0_0_0_0_1 - 0.0329047084602638*G0_0_0_0_0_2 - 0.0125530436641547*G0_0_0_0_1_0 - 0.00855111966223076*G0_0_0_0_1_1 - 0.0127582705360483*G0_0_0_0_1_2 - 0.0329047084602638*G0_0_0_0_2_0 - 0.0127582705360483*G0_0_0_0_2_1 - 0.11687670354337*G0_0_0_0_2_2 - 0.0125530436641547*G0_0_0_1_0_0 - 0.00855111966223077*G0_0_0_1_0_1 - 0.0127582705360483*G0_0_0_1_0_2 - 0.00855111966223077*G0_0_0_1_1_0 + 0.259611992945324*G0_0_0_1_1_1 + 0.0198385976163752*G0_0_0_1_1_2 - 0.0127582705360483*G0_0_0_1_2_0 + 0.0198385976163752*G0_0_0_1_2_1 - 0.0973801507134836*G0_0_0_1_2_2 - 0.0329047084602638*G0_0_0_2_0_0 - 0.0127582705360483*G0_0_0_2_0_1 - 0.11687670354337*G0_0_0_2_0_2 - 0.0127582705360483*G0_0_0_2_1_0 + 0.0198385976163752*G0_0_0_2_1_1 - 0.0973801507134836*G0_0_0_2_1_2 - 0.11687670354337*G0_0_0_2_2_0 - 0.0973801507134836*G0_0_0_2_2_1 - 1.36147506814173*G0_0_0_2_2_2 + 0.00530169419058306*G0_0_1_0_0_1 - 0.00530169419058307*G0_0_1_0_0_2 + 0.00530169419058306*G0_0_1_0_1_0 + 0.0398482176259951*G0_0_1_0_1_1 - 0.00530169419058307*G0_0_1_0_2_0 - 0.0398482176259953*G0_0_1_0_2_2 + 0.00530169419058306*G0_0_1_1_0_0 + 0.0398482176259951*G0_0_1_1_0_1 + 0.0398482176259951*G0_0_1_1_1_0 + 0.505884239217569*G0_0_1_1_1_1 + 0.0637913526802412*G0_0_1_1_1_2 + 0.0637913526802412*G0_0_1_1_2_1 - 0.0637913526802413*G0_0_1_1_2_2 - 0.00530169419058307*G0_0_1_2_0_0 - 0.0398482176259953*G0_0_1_2_0_2 + 0.0637913526802412*G0_0_1_2_1_1 - 0.0637913526802413*G0_0_1_2_1_2 - 0.0398482176259953*G0_0_1_2_2_0 - 0.0637913526802412*G0_0_1_2_2_1 - 0.50588423921757*G0_0_1_2_2_2 - 0.00444658222435997*G0_1_0_0_0_1 + 0.00444658222436*G0_1_0_0_0_2 - 0.00444658222435997*G0_1_0_0_1_0 + 0.0157340601785046*G0_1_0_0_1_1 + 0.00444658222436*G0_1_0_0_2_0 - 0.0157340601785045*G0_1_0_0_2_2 - 0.00444658222435997*G0_1_0_1_0_0 + 0.0157340601785046*G0_1_0_1_0_1 + 0.0157340601785046*G0_1_0_1_1_0 + 0.815263748597078*G0_1_0_1_1_1 + 0.0494254716476936*G0_1_0_1_1_2 + 0.0494254716476936*G0_1_0_1_2_1 - 0.0494254716476936*G0_1_0_1_2_2 + 0.00444658222436*G0_1_0_2_0_0 - 0.0157340601785045*G0_1_0_2_0_2 + 0.0494254716476936*G0_1_0_2_1_1 - 0.0494254716476936*G0_1_0_2_1_2 - 0.0157340601785045*G0_1_0_2_2_0 - 0.0494254716476936*G0_1_0_2_2_1 - 0.815263748597077*G0_1_0_2_2_2 + 0.0403270803270801*G0_1_1_0_0_0 + 0.0329047084602638*G0_1_1_0_0_1 + 0.0125530436641548*G0_1_1_0_0_2 + 0.0329047084602638*G0_1_1_0_1_0 + 0.11687670354337*G0_1_1_0_1_1 + 0.0127582705360483*G0_1_1_0_1_2 + 0.0125530436641548*G0_1_1_0_2_0 + 0.0127582705360483*G0_1_1_0_2_1 + 0.00855111966223082*G0_1_1_0_2_2 + 0.0329047084602638*G0_1_1_1_0_0 + 0.11687670354337*G0_1_1_1_0_1 + 0.0127582705360483*G0_1_1_1_0_2 + 0.11687670354337*G0_1_1_1_1_0 + 1.36147506814173*G0_1_1_1_1_1 + 0.0973801507134835*G0_1_1_1_1_2 + 0.0127582705360483*G0_1_1_1_2_0 + 0.0973801507134835*G0_1_1_1_2_1 - 0.0198385976163752*G0_1_1_1_2_2 + 0.0125530436641548*G0_1_1_2_0_0 + 0.0127582705360483*G0_1_1_2_0_1 + 0.00855111966223082*G0_1_1_2_0_2 + 0.0127582705360483*G0_1_1_2_1_0 + 0.0973801507134835*G0_1_1_2_1_1 - 0.0198385976163752*G0_1_1_2_1_2 + 0.00855111966223082*G0_1_1_2_2_0 - 0.0198385976163752*G0_1_1_2_2_1 - 0.259611992945324*G0_1_1_2_2_2; + A[83] = A[125] + 0.00769600769600763*G0_0_1_0_0_0 + 0.00256533589866918*G0_0_1_0_0_1 + 0.0123136123136123*G0_0_1_0_0_2 + 0.00256533589866918*G0_0_1_0_1_0 + 0.00256533589866917*G0_0_1_0_1_1 + 0.00615680615680614*G0_0_1_0_1_2 + 0.0123136123136123*G0_0_1_0_2_0 + 0.00615680615680614*G0_0_1_0_2_1 + 0.02667949334616*G0_0_1_0_2_2 + 0.00256533589866918*G0_0_1_1_0_0 + 0.00256533589866917*G0_0_1_1_0_1 + 0.00615680615680614*G0_0_1_1_0_2 + 0.00256533589866917*G0_0_1_1_1_0 + 0.00769600769600748*G0_0_1_1_1_1 + 0.0123136123136123*G0_0_1_1_1_2 + 0.00615680615680614*G0_0_1_1_2_0 + 0.0123136123136123*G0_0_1_1_2_1 + 0.0266794933461599*G0_0_1_1_2_2 + 0.0123136123136123*G0_0_1_2_0_0 + 0.00615680615680614*G0_0_1_2_0_1 + 0.02667949334616*G0_0_1_2_0_2 + 0.00615680615680614*G0_0_1_2_1_0 + 0.0123136123136123*G0_0_1_2_1_1 + 0.0266794933461599*G0_0_1_2_1_2 + 0.02667949334616*G0_0_1_2_2_0 + 0.0266794933461599*G0_0_1_2_2_1 - 0.301683501683499*G0_0_1_2_2_2 - 0.00769600769600763*G0_1_0_0_0_0 - 0.00256533589866918*G0_1_0_0_0_1 - 0.0123136123136123*G0_1_0_0_0_2 - 0.00256533589866918*G0_1_0_0_1_0 - 0.00256533589866917*G0_1_0_0_1_1 - 0.00615680615680614*G0_1_0_0_1_2 - 0.0123136123136123*G0_1_0_0_2_0 - 0.00615680615680614*G0_1_0_0_2_1 - 0.02667949334616*G0_1_0_0_2_2 - 0.00256533589866918*G0_1_0_1_0_0 - 0.00256533589866917*G0_1_0_1_0_1 - 0.00615680615680614*G0_1_0_1_0_2 - 0.00256533589866917*G0_1_0_1_1_0 - 0.00769600769600748*G0_1_0_1_1_1 - 0.0123136123136123*G0_1_0_1_1_2 - 0.00615680615680614*G0_1_0_1_2_0 - 0.0123136123136123*G0_1_0_1_2_1 - 0.0266794933461599*G0_1_0_1_2_2 - 0.0123136123136123*G0_1_0_2_0_0 - 0.00615680615680614*G0_1_0_2_0_1 - 0.02667949334616*G0_1_0_2_0_2 - 0.00615680615680614*G0_1_0_2_1_0 - 0.0123136123136123*G0_1_0_2_1_1 - 0.0266794933461599*G0_1_0_2_1_2 - 0.02667949334616*G0_1_0_2_2_0 - 0.0266794933461599*G0_1_0_2_2_1 + 0.301683501683499*G0_1_0_2_2_2; + A[80] = -A[125] + 0.00769600769600763*G0_1_0_0_0_0 + 0.00256533589866918*G0_1_0_0_0_1 + 0.0123136123136123*G0_1_0_0_0_2 + 0.00256533589866918*G0_1_0_0_1_0 + 0.00256533589866917*G0_1_0_0_1_1 + 0.00615680615680615*G0_1_0_0_1_2 + 0.0123136123136123*G0_1_0_0_2_0 + 0.00615680615680615*G0_1_0_0_2_1 + 0.02667949334616*G0_1_0_0_2_2 + 0.00256533589866918*G0_1_0_1_0_0 + 0.00256533589866917*G0_1_0_1_0_1 + 0.00615680615680615*G0_1_0_1_0_2 + 0.00256533589866917*G0_1_0_1_1_0 + 0.00769600769600748*G0_1_0_1_1_1 + 0.0123136123136123*G0_1_0_1_1_2 + 0.00615680615680615*G0_1_0_1_2_0 + 0.0123136123136123*G0_1_0_1_2_1 + 0.0266794933461599*G0_1_0_1_2_2 + 0.0123136123136123*G0_1_0_2_0_0 + 0.00615680615680615*G0_1_0_2_0_1 + 0.0266794933461601*G0_1_0_2_0_2 + 0.00615680615680615*G0_1_0_2_1_0 + 0.0123136123136123*G0_1_0_2_1_1 + 0.0266794933461599*G0_1_0_2_1_2 + 0.02667949334616*G0_1_0_2_2_0 + 0.0266794933461599*G0_1_0_2_2_1 - 0.301683501683499*G0_1_0_2_2_2 + 0.054077280743947*G0_1_1_0_0_0 + 0.0360515204959647*G0_1_1_0_0_1 + 0.0227459783015338*G0_1_1_0_0_2 + 0.0360515204959647*G0_1_1_0_1_0 + 0.0540772807439472*G0_1_1_0_1_1 + 0.0227459783015338*G0_1_1_0_1_2 + 0.0227459783015338*G0_1_1_0_2_0 + 0.0227459783015338*G0_1_1_0_2_1 + 0.0560953449842338*G0_1_1_0_2_2 + 0.0360515204959647*G0_1_1_1_0_0 + 0.0540772807439472*G0_1_1_1_0_1 + 0.0227459783015338*G0_1_1_1_0_2 + 0.0540772807439472*G0_1_1_1_1_0 + 0.216309122975789*G0_1_1_1_1_1 + 0.0682379349046014*G0_1_1_1_1_2 + 0.0227459783015338*G0_1_1_1_2_0 + 0.0682379349046014*G0_1_1_1_2_1 + 0.112190689968467*G0_1_1_1_2_2 + 0.0227459783015338*G0_1_1_2_0_0 + 0.0227459783015338*G0_1_1_2_0_1 + 0.0560953449842338*G0_1_1_2_0_2 + 0.0227459783015338*G0_1_1_2_1_0 + 0.0682379349046014*G0_1_1_2_1_1 + 0.112190689968467*G0_1_1_2_1_2 + 0.0560953449842338*G0_1_1_2_2_0 + 0.112190689968467*G0_1_1_2_2_1 + 0.238063171396504*G0_1_1_2_2_2; + A[31] = 9.78034311367816e-05*G0_1_0_0_0_0 - 0.00028699695366362*G0_1_0_0_0_1 - 0.000286996953663616*G0_1_0_0_0_2 - 0.00028699695366362*G0_1_0_0_1_0 - 0.00190208967986746*G0_1_0_0_1_1 - 0.000130137352359575*G0_1_0_0_1_2 - 0.000286996953663616*G0_1_0_0_2_0 - 0.000130137352359575*G0_1_0_0_2_1 - 0.00190208967986745*G0_1_0_0_2_2 - 0.00028699695366362*G0_1_0_1_0_0 - 0.00190208967986746*G0_1_0_1_0_1 - 0.000130137352359575*G0_1_0_1_0_2 - 0.00190208967986746*G0_1_0_1_1_0 - 0.0212361712361713*G0_1_0_1_1_1 - 5.39789428678382e-05*G0_1_0_1_1_2 - 0.000130137352359575*G0_1_0_1_2_0 - 5.39789428678384e-05*G0_1_0_1_2_1 - 5.39789428678356e-05*G0_1_0_1_2_2 - 0.000286996953663616*G0_1_0_2_0_0 - 0.000130137352359575*G0_1_0_2_0_1 - 0.00190208967986745*G0_1_0_2_0_2 - 0.000130137352359575*G0_1_0_2_1_0 - 5.39789428678384e-05*G0_1_0_2_1_1 - 5.39789428678356e-05*G0_1_0_2_1_2 - 0.00190208967986745*G0_1_0_2_2_0 - 5.39789428678357e-05*G0_1_0_2_2_1 - 0.0212361712361711*G0_1_0_2_2_2; + A[42] = 0.0112361712361711*G0_1_0_0_0_0 - 0.00112874779541445*G0_1_0_0_0_1 + 0.0028731762065095*G0_1_0_0_0_2 - 0.00112874779541445*G0_1_0_0_1_0 - 0.00243706910373575*G0_1_0_0_1_1 - 0.000949174282507602*G0_1_0_0_1_2 + 0.00287317620650951*G0_1_0_0_2_0 - 0.000949174282507602*G0_1_0_0_2_1 - 0.00333493666826997*G0_1_0_0_2_2 - 0.00112874779541445*G0_1_0_1_0_0 - 0.00243706910373575*G0_1_0_1_0_1 - 0.000949174282507602*G0_1_0_1_0_2 - 0.00243706910373575*G0_1_0_1_1_0 - 0.000538720538720525*G0_1_0_1_1_1 - 0.000974827641494269*G0_1_0_1_1_2 - 0.000949174282507601*G0_1_0_1_2_0 - 0.000974827641494269*G0_1_0_1_2_1 + 0.00333493666827004*G0_1_0_1_2_2 + 0.0028731762065095*G0_1_0_2_0_0 - 0.000949174282507602*G0_1_0_2_0_1 - 0.00333493666826997*G0_1_0_2_0_2 - 0.000949174282507601*G0_1_0_2_1_0 - 0.000974827641494268*G0_1_0_2_1_1 + 0.00333493666827004*G0_1_0_2_1_2 - 0.00333493666826997*G0_1_0_2_2_0 + 0.00333493666827004*G0_1_0_2_2_1 - 0.05684784351451*G0_1_1_0_0_0 - 0.0210614077280743*G0_1_1_0_0_1 - 0.000538720538720523*G0_1_1_0_0_2 - 0.0210614077280743*G0_1_1_0_1_0 - 0.0131345198011864*G0_1_1_0_1_1 - 0.00107744107744106*G0_1_1_0_1_2 - 0.000538720538720523*G0_1_1_0_2_0 - 0.00107744107744106*G0_1_1_0_2_1 + 0.00387365720699055*G0_1_1_0_2_2 - 0.0210614077280743*G0_1_1_1_0_0 - 0.0131345198011864*G0_1_1_1_0_1 - 0.00107744107744106*G0_1_1_1_0_2 - 0.0131345198011864*G0_1_1_1_1_0 - 0.00590027256693915*G0_1_1_1_1_1 - 0.00128266794933457*G0_1_1_1_1_2 - 0.00107744107744106*G0_1_1_1_2_0 - 0.00128266794933457*G0_1_1_1_2_1 + 0.00715728715728718*G0_1_1_1_2_2 - 0.000538720538720523*G0_1_1_2_0_0 - 0.00107744107744106*G0_1_1_2_0_1 + 0.00387365720699055*G0_1_1_2_0_2 - 0.00107744107744106*G0_1_1_2_1_0 - 0.00128266794933457*G0_1_1_2_1_1 + 0.00715728715728718*G0_1_1_2_1_2 + 0.00387365720699055*G0_1_1_2_2_0 + 0.00715728715728718*G0_1_1_2_2_1 + 0.0595157928491261*G0_1_1_2_2_2; + A[104] = A[132] + 0.0523328523328519*G0_0_0_0_0_0 + 0.00554112554112553*G0_0_0_0_0_1 - 0.0127240660573993*G0_0_0_0_0_2 + 0.00554112554112553*G0_0_0_0_1_0 + 0.00102613435946773*G0_0_0_0_1_1 + 0.00246272246272248*G0_0_0_0_1_2 - 0.0127240660573994*G0_0_0_0_2_0 + 0.00246272246272248*G0_0_0_0_2_1 + 0.00123136123136145*G0_0_0_0_2_2 + 0.00554112554112553*G0_0_0_1_0_0 + 0.00102613435946773*G0_0_0_1_0_1 + 0.00246272246272248*G0_0_0_1_0_2 + 0.00102613435946773*G0_0_0_1_1_0 + 0.0264742664742665*G0_0_0_1_1_1 + 0.0447394580727913*G0_0_0_1_1_2 + 0.00246272246272248*G0_0_0_1_2_0 + 0.0447394580727913*G0_0_0_1_2_1 + 0.097277537277537*G0_0_0_1_2_2 - 0.0127240660573994*G0_0_0_2_0_0 + 0.00246272246272248*G0_0_0_2_0_1 + 0.00123136123136145*G0_0_0_2_0_2 + 0.00246272246272248*G0_0_0_2_1_0 + 0.0447394580727913*G0_0_0_2_1_1 + 0.097277537277537*G0_0_0_2_1_2 + 0.00123136123136145*G0_0_0_2_2_0 + 0.097277537277537*G0_0_0_2_2_1 + 0.307840307840308*G0_0_0_2_2_2 - 0.0313997113997117*G0_0_1_0_0_0 + 0.000820907487573978*G0_0_1_0_0_1 - 0.0326310726310726*G0_0_1_0_0_2 + 0.00082090748757398*G0_0_1_0_1_0 + 0.00841430174763494*G0_0_1_0_1_1 + 0.00205226871893539*G0_0_1_0_1_2 - 0.0326310726310726*G0_0_1_0_2_0 + 0.00205226871893539*G0_0_1_0_2_1 - 0.0077986211319544*G0_0_1_0_2_2 + 0.000820907487573974*G0_0_1_1_0_0 + 0.00841430174763494*G0_0_1_1_0_1 + 0.00205226871893539*G0_0_1_1_0_2 + 0.00841430174763494*G0_0_1_1_1_0 + 0.0344781144781142*G0_0_1_1_1_1 + 0.051922398589065*G0_0_1_1_1_2 + 0.00205226871893539*G0_0_1_1_2_0 + 0.051922398589065*G0_0_1_1_2_1 + 0.11082251082251*G0_0_1_1_2_2 - 0.0326310726310726*G0_0_1_2_0_0 + 0.00205226871893539*G0_0_1_2_0_1 - 0.00779862113195439*G0_0_1_2_0_2 + 0.00205226871893539*G0_0_1_2_1_0 + 0.051922398589065*G0_0_1_2_1_1 + 0.11082251082251*G0_0_1_2_1_2 - 0.0077986211319544*G0_0_1_2_2_0 + 0.11082251082251*G0_0_1_2_2_1 + 0.402655122655121*G0_0_1_2_2_2 - 0.0424819624819631*G0_1_0_0_0_0 - 0.00800384800384805*G0_1_0_0_0_1 - 0.00369408369408378*G0_1_0_0_0_2 - 0.00800384800384805*G0_1_0_0_1_0 - 0.00615680615680613*G0_1_0_0_1_1 + 0.00287317620650954*G0_1_0_0_1_2 - 0.00369408369408377*G0_1_0_0_2_0 + 0.00287317620650954*G0_1_0_0_2_1 + 0.0211383678050344*G0_1_0_0_2_2 - 0.00800384800384806*G0_1_0_1_0_0 - 0.00615680615680613*G0_1_0_1_0_1 + 0.00287317620650954*G0_1_0_1_0_2 - 0.00615680615680613*G0_1_0_1_1_0 + 0.0184704184704185*G0_1_0_1_1_1 + 0.0373512906846239*G0_1_0_1_1_2 + 0.00287317620650954*G0_1_0_1_2_0 + 0.0373512906846239*G0_1_0_1_2_1 + 0.101997755331088*G0_1_0_1_2_2 - 0.00369408369408377*G0_1_0_2_0_0 + 0.00287317620650954*G0_1_0_2_0_1 + 0.0211383678050344*G0_1_0_2_0_2 + 0.00287317620650954*G0_1_0_2_1_0 + 0.0373512906846239*G0_1_0_2_1_1 + 0.101997755331088*G0_1_0_2_1_2 + 0.0211383678050344*G0_1_0_2_2_0 + 0.101997755331088*G0_1_0_2_2_1 + 0.391572871572871*G0_1_0_2_2_2 - 0.434054834054833*G0_1_1_0_0_0 - 0.110001603334936*G0_1_1_0_0_1 - 0.0248324514991181*G0_1_1_0_0_2 - 0.110001603334936*G0_1_1_0_1_0 - 0.04350809684143*G0_1_1_0_1_1 - 0.0248324514991181*G0_1_1_0_2_0 + 0.0248324514991182*G0_1_1_0_2_2 - 0.110001603334936*G0_1_1_1_0_0 - 0.04350809684143*G0_1_1_1_0_1 - 0.04350809684143*G0_1_1_1_1_0 + 0.04350809684143*G0_1_1_1_1_2 + 0.04350809684143*G0_1_1_1_2_1 + 0.110001603334936*G0_1_1_1_2_2 - 0.0248324514991181*G0_1_1_2_0_0 + 0.0248324514991182*G0_1_1_2_0_2 + 0.04350809684143*G0_1_1_2_1_1 + 0.110001603334936*G0_1_1_2_1_2 + 0.0248324514991182*G0_1_1_2_2_0 + 0.110001603334936*G0_1_1_2_2_1 + 0.434054834054832*G0_1_1_2_2_2; + A[182] = A[42] + 0.0112361712361711*G0_0_1_0_0_0 - 0.00112874779541445*G0_0_1_0_0_1 + 0.0028731762065095*G0_0_1_0_0_2 - 0.00112874779541445*G0_0_1_0_1_0 - 0.00243706910373575*G0_0_1_0_1_1 - 0.000949174282507603*G0_0_1_0_1_2 + 0.0028731762065095*G0_0_1_0_2_0 - 0.000949174282507603*G0_0_1_0_2_1 - 0.00333493666826997*G0_0_1_0_2_2 - 0.00112874779541445*G0_0_1_1_0_0 - 0.00243706910373575*G0_0_1_1_0_1 - 0.000949174282507603*G0_0_1_1_0_2 - 0.00243706910373575*G0_0_1_1_1_0 - 0.000538720538720536*G0_0_1_1_1_1 - 0.000974827641494277*G0_0_1_1_1_2 - 0.000949174282507603*G0_0_1_1_2_0 - 0.000974827641494277*G0_0_1_1_2_1 + 0.00333493666827004*G0_0_1_1_2_2 + 0.0028731762065095*G0_0_1_2_0_0 - 0.000949174282507603*G0_0_1_2_0_1 - 0.00333493666826997*G0_0_1_2_0_2 - 0.000949174282507603*G0_0_1_2_1_0 - 0.000974827641494277*G0_0_1_2_1_1 + 0.00333493666827004*G0_0_1_2_1_2 - 0.00333493666826997*G0_0_1_2_2_0 + 0.00333493666827004*G0_0_1_2_2_1 - 0.0112361712361711*G0_1_0_0_0_0 + 0.00112874779541445*G0_1_0_0_0_1 - 0.0028731762065095*G0_1_0_0_0_2 + 0.00112874779541445*G0_1_0_0_1_0 + 0.00243706910373575*G0_1_0_0_1_1 + 0.000949174282507603*G0_1_0_0_1_2 - 0.0028731762065095*G0_1_0_0_2_0 + 0.000949174282507603*G0_1_0_0_2_1 + 0.00333493666826997*G0_1_0_0_2_2 + 0.00112874779541445*G0_1_0_1_0_0 + 0.00243706910373575*G0_1_0_1_0_1 + 0.000949174282507603*G0_1_0_1_0_2 + 0.00243706910373575*G0_1_0_1_1_0 + 0.00053872053872054*G0_1_0_1_1_1 + 0.000974827641494278*G0_1_0_1_1_2 + 0.000949174282507603*G0_1_0_1_2_0 + 0.000974827641494278*G0_1_0_1_2_1 - 0.00333493666827004*G0_1_0_1_2_2 - 0.0028731762065095*G0_1_0_2_0_0 + 0.000949174282507603*G0_1_0_2_0_1 + 0.00333493666826997*G0_1_0_2_0_2 + 0.000949174282507603*G0_1_0_2_1_0 + 0.000974827641494277*G0_1_0_2_1_1 - 0.00333493666827004*G0_1_0_2_1_2 + 0.00333493666826997*G0_1_0_2_2_0 - 0.00333493666827004*G0_1_0_2_2_1; + A[198] = A[89] - 0.0621837421837419*G0_0_0_0_0_0 - 0.0137502004168671*G0_0_0_0_0_1 - 0.0685457752124416*G0_0_0_0_0_2 - 0.0137502004168671*G0_0_0_0_1_0 - 0.0445342312008977*G0_0_0_0_1_1 - 0.0229854096520762*G0_0_0_0_1_2 - 0.0685457752124416*G0_0_0_0_2_0 - 0.0229854096520762*G0_0_0_0_2_1 - 0.134218374218374*G0_0_0_0_2_2 - 0.0137502004168671*G0_0_0_1_0_0 - 0.0445342312008977*G0_0_0_1_0_1 - 0.0229854096520762*G0_0_0_1_0_2 - 0.0445342312008977*G0_0_0_1_1_0 - 0.634766714766711*G0_0_0_1_1_1 - 0.178547378547378*G0_0_0_1_1_2 - 0.0229854096520762*G0_0_0_1_2_0 - 0.178547378547378*G0_0_0_1_2_1 - 0.0332467532467529*G0_0_0_1_2_2 - 0.0685457752124416*G0_0_0_2_0_0 - 0.0229854096520762*G0_0_0_2_0_1 - 0.134218374218374*G0_0_0_2_0_2 - 0.0229854096520762*G0_0_0_2_1_0 - 0.178547378547378*G0_0_0_2_1_1 - 0.0332467532467529*G0_0_0_2_1_2 - 0.134218374218374*G0_0_0_2_2_0 - 0.0332467532467529*G0_0_0_2_2_1 - 0.184704184704182*G0_0_0_2_2_2 - 0.0029757896424564*G0_0_1_0_0_1 + 0.00297578964245625*G0_0_1_0_0_2 - 0.0029757896424564*G0_0_1_0_1_0 - 0.0376591309924642*G0_0_1_0_1_1 + 0.00297578964245625*G0_0_1_0_2_0 + 0.0376591309924642*G0_0_1_0_2_2 - 0.0029757896424564*G0_0_1_1_0_0 - 0.0376591309924642*G0_0_1_1_0_1 - 0.0376591309924642*G0_0_1_1_1_0 - 0.629841269841267*G0_0_1_1_1_1 - 0.0819881353214682*G0_0_1_1_1_2 - 0.0819881353214682*G0_0_1_1_2_1 + 0.0819881353214684*G0_0_1_1_2_2 + 0.00297578964245625*G0_0_1_2_0_0 + 0.0376591309924642*G0_0_1_2_0_2 - 0.0819881353214682*G0_0_1_2_1_1 + 0.0819881353214684*G0_0_1_2_1_2 + 0.0376591309924642*G0_0_1_2_2_0 + 0.0819881353214684*G0_0_1_2_2_1 + 0.629841269841267*G0_0_1_2_2_2 + 0.00933782267115595*G0_1_0_0_0_1 - 0.00933782267115607*G0_1_0_0_0_2 + 0.00933782267115595*G0_1_0_0_1_0 + 0.00420715087381743*G0_1_0_0_1_1 - 0.00933782267115607*G0_1_0_0_2_0 - 0.00420715087381761*G0_1_0_0_2_2 + 0.00933782267115595*G0_1_0_1_0_0 + 0.00420715087381744*G0_1_0_1_0_1 + 0.00420715087381744*G0_1_0_1_1_0 - 0.398345358345357*G0_1_0_1_1_1 - 0.0934808401475064*G0_1_0_1_1_2 - 0.0934808401475063*G0_1_0_1_2_1 + 0.0934808401475066*G0_1_0_1_2_2 - 0.00933782267115607*G0_1_0_2_0_0 - 0.00420715087381761*G0_1_0_2_0_2 - 0.0934808401475064*G0_1_0_2_1_1 + 0.0934808401475066*G0_1_0_2_1_2 - 0.00420715087381761*G0_1_0_2_2_0 + 0.0934808401475065*G0_1_0_2_2_1 + 0.398345358345357*G0_1_0_2_2_2 + 0.0621837421837418*G0_1_1_0_0_0 + 0.0685457752124414*G0_1_1_0_0_1 + 0.013750200416867*G0_1_1_0_0_2 + 0.0685457752124414*G0_1_1_0_1_0 + 0.134218374218373*G0_1_1_0_1_1 + 0.0229854096520762*G0_1_1_0_1_2 + 0.013750200416867*G0_1_1_0_2_0 + 0.0229854096520762*G0_1_1_0_2_1 + 0.0445342312008978*G0_1_1_0_2_2 + 0.0685457752124414*G0_1_1_1_0_0 + 0.134218374218373*G0_1_1_1_0_1 + 0.0229854096520762*G0_1_1_1_0_2 + 0.134218374218373*G0_1_1_1_1_0 + 0.184704184704183*G0_1_1_1_1_1 + 0.0332467532467531*G0_1_1_1_1_2 + 0.0229854096520762*G0_1_1_1_2_0 + 0.0332467532467531*G0_1_1_1_2_1 + 0.178547378547378*G0_1_1_1_2_2 + 0.013750200416867*G0_1_1_2_0_0 + 0.0229854096520762*G0_1_1_2_0_1 + 0.0445342312008978*G0_1_1_2_0_2 + 0.0229854096520762*G0_1_1_2_1_0 + 0.0332467532467531*G0_1_1_2_1_1 + 0.178547378547378*G0_1_1_2_1_2 + 0.0445342312008978*G0_1_1_2_2_0 + 0.178547378547378*G0_1_1_2_2_1 + 0.634766714766712*G0_1_1_2_2_2; + A[32] = 0.00821709155042485*G0_1_1_0_0_0 + 0.00273903051680828*G0_1_1_0_0_1 + 0.0025359414248303*G0_1_1_0_0_2 + 0.00273903051680828*G0_1_1_0_1_0 + 0.00273903051680829*G0_1_1_0_1_1 + 0.00126797071241515*G0_1_1_0_1_2 + 0.0025359414248303*G0_1_1_0_2_0 + 0.00126797071241515*G0_1_1_0_2_1 + 0.0138768638768638*G0_1_1_0_2_2 + 0.00273903051680828*G0_1_1_1_0_0 + 0.00273903051680829*G0_1_1_1_0_1 + 0.00126797071241515*G0_1_1_1_0_2 + 0.00273903051680829*G0_1_1_1_1_0 + 0.00821709155042489*G0_1_1_1_1_1 + 0.0025359414248303*G0_1_1_1_1_2 + 0.00126797071241515*G0_1_1_1_2_0 + 0.0025359414248303*G0_1_1_1_2_1 + 0.0138768638768638*G0_1_1_1_2_2 + 0.0025359414248303*G0_1_1_2_0_0 + 0.00126797071241515*G0_1_1_2_0_1 + 0.0138768638768638*G0_1_1_2_0_2 + 0.00126797071241515*G0_1_1_2_1_0 + 0.0025359414248303*G0_1_1_2_1_1 + 0.0138768638768638*G0_1_1_2_1_2 + 0.0138768638768638*G0_1_1_2_2_0 + 0.0138768638768638*G0_1_1_2_2_1 + 0.234062850729516*G0_1_1_2_2_2; + A[107] = A[32] + 0.0016257816257816*G0_0_1_0_0_0 + 0.00036235369568703*G0_0_1_0_0_1 + 0.00400833734167068*G0_0_1_0_0_2 + 0.00036235369568703*G0_0_1_0_1_0 + 0.000182780182780193*G0_0_1_0_1_1 + 0.00174763508096841*G0_0_1_0_1_2 + 0.00400833734167068*G0_0_1_0_2_0 + 0.00174763508096841*G0_0_1_0_2_1 + 0.0115279781946448*G0_0_1_0_2_2 + 0.00036235369568703*G0_0_1_1_0_0 + 0.000182780182780193*G0_0_1_1_0_1 + 0.00174763508096841*G0_0_1_1_0_2 + 0.000182780182780193*G0_0_1_1_1_0 + 0.00298220298220298*G0_0_1_1_1_2 + 0.00174763508096841*G0_0_1_1_2_0 + 0.00298220298220298*G0_0_1_1_2_1 + 0.022430655763989*G0_0_1_1_2_2 + 0.00400833734167067*G0_0_1_2_0_0 + 0.00174763508096841*G0_0_1_2_0_1 + 0.0115279781946448*G0_0_1_2_0_2 + 0.00174763508096841*G0_0_1_2_1_0 + 0.00298220298220298*G0_0_1_2_1_1 + 0.022430655763989*G0_0_1_2_1_2 + 0.0115279781946448*G0_0_1_2_2_0 + 0.022430655763989*G0_0_1_2_2_1 + 0.288792688792687*G0_0_1_2_2_2 + 0.0557335257335254*G0_1_1_0_0_0 + 0.00867030089252307*G0_1_1_0_0_1 + 0.00450269894714336*G0_1_1_0_0_2 + 0.00867030089252307*G0_1_1_0_1_0 + 0.00178558067446955*G0_1_1_0_1_1 + 0.00110496499385388*G0_1_1_0_1_2 + 0.00450269894714336*G0_1_1_0_2_0 + 0.00110496499385388*G0_1_1_0_2_1 - 0.00847362514029177*G0_1_1_0_2_2 + 0.00867030089252307*G0_1_1_1_0_0 + 0.00178558067446955*G0_1_1_1_0_1 + 0.00110496499385388*G0_1_1_1_0_2 + 0.00178558067446955*G0_1_1_1_1_0 - 0.00622895622895618*G0_1_1_1_1_1 + 0.000686761797872914*G0_1_1_1_1_2 + 0.00110496499385388*G0_1_1_1_2_0 + 0.000686761797872913*G0_1_1_1_2_1 + 0.0053952220618887*G0_1_1_1_2_2 + 0.00450269894714336*G0_1_1_2_0_0 + 0.00110496499385388*G0_1_1_2_0_1 - 0.00847362514029177*G0_1_1_2_0_2 + 0.00110496499385388*G0_1_1_2_1_0 + 0.000686761797872914*G0_1_1_2_1_1 + 0.0053952220618887*G0_1_1_2_1_2 - 0.00847362514029177*G0_1_1_2_2_0 + 0.00539522206188869*G0_1_1_2_2_1 + 0.00087381754048399*G0_1_1_2_2_2; + A[25] = A[16] + 0.0557335257335256*G0_0_0_0_0_0 + 0.00450269894714338*G0_0_0_0_0_1 + 0.00867030089252306*G0_0_0_0_0_2 + 0.00450269894714338*G0_0_0_0_1_0 - 0.00847362514029174*G0_0_0_0_1_1 + 0.00110496499385388*G0_0_0_0_1_2 + 0.00867030089252306*G0_0_0_0_2_0 + 0.00110496499385388*G0_0_0_0_2_1 + 0.00178558067446955*G0_0_0_0_2_2 + 0.00450269894714338*G0_0_0_1_0_0 - 0.00847362514029174*G0_0_0_1_0_1 + 0.00110496499385388*G0_0_0_1_0_2 - 0.00847362514029174*G0_0_0_1_1_0 + 0.000873817540484545*G0_0_0_1_1_1 + 0.00539522206188872*G0_0_0_1_1_2 + 0.00110496499385388*G0_0_0_1_2_0 + 0.00539522206188872*G0_0_0_1_2_1 + 0.00068676179787291*G0_0_0_1_2_2 + 0.00867030089252306*G0_0_0_2_0_0 + 0.00110496499385388*G0_0_0_2_0_1 + 0.00178558067446955*G0_0_0_2_0_2 + 0.00110496499385388*G0_0_0_2_1_0 + 0.00539522206188872*G0_0_0_2_1_1 + 0.00068676179787291*G0_0_0_2_1_2 + 0.00178558067446955*G0_0_0_2_2_0 + 0.00068676179787291*G0_0_0_2_2_1 - 0.00622895622895617*G0_0_0_2_2_2 + 0.00162578162578163*G0_0_1_0_0_0 + 0.00400833734167068*G0_0_1_0_0_1 + 0.000362353695687023*G0_0_1_0_0_2 + 0.00400833734167068*G0_0_1_0_1_0 + 0.0115279781946448*G0_0_1_0_1_1 + 0.00174763508096841*G0_0_1_0_1_2 + 0.000362353695687023*G0_0_1_0_2_0 + 0.00174763508096841*G0_0_1_0_2_1 + 0.000182780182780174*G0_0_1_0_2_2 + 0.00400833734167068*G0_0_1_1_0_0 + 0.0115279781946448*G0_0_1_1_0_1 + 0.00174763508096841*G0_0_1_1_0_2 + 0.0115279781946448*G0_0_1_1_1_0 + 0.288792688792687*G0_0_1_1_1_1 + 0.022430655763989*G0_0_1_1_1_2 + 0.00174763508096841*G0_0_1_1_2_0 + 0.022430655763989*G0_0_1_1_2_1 + 0.00298220298220297*G0_0_1_1_2_2 + 0.000362353695687023*G0_0_1_2_0_0 + 0.00174763508096841*G0_0_1_2_0_1 + 0.000182780182780173*G0_0_1_2_0_2 + 0.00174763508096841*G0_0_1_2_1_0 + 0.022430655763989*G0_0_1_2_1_1 + 0.00298220298220297*G0_0_1_2_1_2 + 0.000182780182780173*G0_0_1_2_2_0 + 0.00298220298220297*G0_0_1_2_2_1; + A[159] = A[97] - 0.606701940035271*G0_0_0_0_0_0 - 0.0731120731120727*G0_0_0_0_0_1 - 0.0708032708032705*G0_0_0_0_0_2 - 0.0731120731120727*G0_0_0_0_1_0 - 0.0580535513868845*G0_0_0_0_1_1 - 0.00936347603014264*G0_0_0_0_1_2 - 0.0708032708032705*G0_0_0_0_2_0 - 0.00936347603014264*G0_0_0_0_2_1 + 0.000590027256694008*G0_0_0_0_2_2 - 0.0731120731120727*G0_0_0_1_0_0 - 0.0580535513868845*G0_0_0_1_0_1 - 0.00936347603014264*G0_0_0_1_0_2 - 0.0580535513868845*G0_0_0_1_1_0 - 0.310020843354176*G0_0_0_1_1_1 - 0.0326310726310724*G0_0_0_1_1_2 - 0.00936347603014264*G0_0_0_1_2_0 - 0.0326310726310724*G0_0_0_1_2_1 + 0.0301426968093634*G0_0_0_1_2_2 - 0.0708032708032705*G0_0_0_2_0_0 - 0.00936347603014264*G0_0_0_2_0_1 + 0.000590027256694011*G0_0_0_2_0_2 - 0.00936347603014264*G0_0_0_2_1_0 - 0.0326310726310724*G0_0_0_2_1_1 + 0.0301426968093634*G0_0_0_2_1_2 + 0.000590027256694018*G0_0_0_2_2_0 + 0.0301426968093634*G0_0_0_2_2_1 + 0.297732884399549*G0_0_0_2_2_2 - 0.0867083533750194*G0_0_1_0_0_1 + 0.0867083533750197*G0_0_1_0_0_2 - 0.0867083533750194*G0_0_1_0_1_0 - 0.070751964085297*G0_0_1_0_1_1 + 0.0867083533750197*G0_0_1_0_2_0 + 0.0707519640852971*G0_0_1_0_2_2 - 0.0867083533750194*G0_0_1_1_0_0 - 0.070751964085297*G0_0_1_1_0_1 - 0.070751964085297*G0_0_1_1_1_0 - 0.322462722462721*G0_0_1_1_1_1 - 0.0334519801186466*G0_0_1_1_1_2 - 0.0334519801186466*G0_0_1_1_2_1 + 0.0334519801186466*G0_0_1_1_2_2 + 0.0867083533750197*G0_0_1_2_0_0 + 0.0707519640852971*G0_0_1_2_0_2 - 0.0334519801186466*G0_0_1_2_1_1 + 0.0334519801186466*G0_0_1_2_1_2 + 0.0707519640852971*G0_0_1_2_2_0 + 0.0334519801186466*G0_0_1_2_2_1 + 0.32246272246272*G0_0_1_2_2_2 + 0.0156485489818822*G0_1_0_0_0_1 - 0.0156485489818823*G0_1_0_0_0_2 + 0.0156485489818822*G0_1_0_0_1_0 - 0.00944043610710278*G0_1_0_0_1_1 - 0.0156485489818823*G0_1_0_0_2_0 + 0.00944043610710281*G0_1_0_0_2_2 + 0.0156485489818822*G0_1_0_1_0_0 - 0.00944043610710278*G0_1_0_1_0_1 - 0.00944043610710278*G0_1_0_1_1_0 - 0.286214526214525*G0_1_0_1_1_1 - 0.0294244027577359*G0_1_0_1_1_2 - 0.0294244027577359*G0_1_0_1_2_1 + 0.029424402757736*G0_1_0_1_2_2 - 0.0156485489818823*G0_1_0_2_0_0 + 0.00944043610710281*G0_1_0_2_0_2 - 0.0294244027577359*G0_1_0_2_1_1 + 0.029424402757736*G0_1_0_2_1_2 + 0.00944043610710282*G0_1_0_2_2_0 + 0.029424402757736*G0_1_0_2_2_1 + 0.286214526214525*G0_1_0_2_2_2 + 0.60670194003527*G0_1_1_0_0_0 + 0.0708032708032705*G0_1_1_0_0_1 + 0.0731120731120728*G0_1_1_0_0_2 + 0.0708032708032705*G0_1_1_0_1_0 - 0.000590027256693913*G0_1_1_0_1_1 + 0.00936347603014267*G0_1_1_0_1_2 + 0.0731120731120728*G0_1_1_0_2_0 + 0.00936347603014267*G0_1_1_0_2_1 + 0.0580535513868845*G0_1_1_0_2_2 + 0.0708032708032705*G0_1_1_1_0_0 - 0.000590027256693913*G0_1_1_1_0_1 + 0.00936347603014267*G0_1_1_1_0_2 - 0.000590027256693906*G0_1_1_1_1_0 - 0.297732884399549*G0_1_1_1_1_1 - 0.0301426968093633*G0_1_1_1_1_2 + 0.00936347603014267*G0_1_1_1_2_0 - 0.0301426968093633*G0_1_1_1_2_1 + 0.0326310726310725*G0_1_1_1_2_2 + 0.0731120731120728*G0_1_1_2_0_0 + 0.00936347603014267*G0_1_1_2_0_1 + 0.0580535513868845*G0_1_1_2_0_2 + 0.00936347603014267*G0_1_1_2_1_0 - 0.0301426968093633*G0_1_1_2_1_1 + 0.0326310726310725*G0_1_1_2_1_2 + 0.0580535513868845*G0_1_1_2_2_0 + 0.0326310726310725*G0_1_1_2_2_1 + 0.310020843354175*G0_1_1_2_2_2; + A[79] = A[65] - 0.00205226871893541*G0_0_1_0_0_1 - 0.00464325797659129*G0_0_1_0_0_2 - 0.00205226871893541*G0_0_1_0_1_0 - 0.00607984607984609*G0_0_1_0_1_1 - 0.0133140933140933*G0_0_1_0_1_2 - 0.0046432579765913*G0_0_1_0_2_0 - 0.0133140933140933*G0_0_1_0_2_1 - 0.0271925605258938*G0_0_1_0_2_2 - 0.00205226871893541*G0_0_1_1_0_0 - 0.00607984607984609*G0_0_1_1_0_1 - 0.0133140933140933*G0_0_1_1_0_2 - 0.00607984607984609*G0_0_1_1_1_0 - 0.0363251563251562*G0_0_1_1_1_1 - 0.0659547859547857*G0_0_1_1_1_2 - 0.0133140933140933*G0_0_1_1_2_0 - 0.0659547859547857*G0_0_1_1_2_1 - 0.129549462882796*G0_0_1_1_2_2 - 0.0046432579765913*G0_0_1_2_0_0 - 0.0133140933140933*G0_0_1_2_0_1 - 0.0271925605258938*G0_0_1_2_0_2 - 0.0133140933140933*G0_0_1_2_1_0 - 0.0659547859547857*G0_0_1_2_1_1 - 0.129549462882796*G0_0_1_2_1_2 - 0.0271925605258938*G0_0_1_2_2_0 - 0.129549462882796*G0_0_1_2_2_1 - 0.294757094757093*G0_0_1_2_2_2 + 0.00205226871893541*G0_1_0_0_0_1 + 0.0046432579765913*G0_1_0_0_0_2 + 0.00205226871893541*G0_1_0_0_1_0 + 0.00607984607984609*G0_1_0_0_1_1 + 0.0133140933140933*G0_1_0_0_1_2 + 0.0046432579765913*G0_1_0_0_2_0 + 0.0133140933140933*G0_1_0_0_2_1 + 0.0271925605258938*G0_1_0_0_2_2 + 0.00205226871893541*G0_1_0_1_0_0 + 0.00607984607984609*G0_1_0_1_0_1 + 0.0133140933140933*G0_1_0_1_0_2 + 0.00607984607984609*G0_1_0_1_1_0 + 0.0363251563251562*G0_1_0_1_1_1 + 0.0659547859547857*G0_1_0_1_1_2 + 0.0133140933140933*G0_1_0_1_2_0 + 0.0659547859547857*G0_1_0_1_2_1 + 0.129549462882796*G0_1_0_1_2_2 + 0.0046432579765913*G0_1_0_2_0_0 + 0.0133140933140933*G0_1_0_2_0_1 + 0.0271925605258938*G0_1_0_2_0_2 + 0.0133140933140933*G0_1_0_2_1_0 + 0.0659547859547857*G0_1_0_2_1_1 + 0.129549462882796*G0_1_0_2_1_2 + 0.0271925605258938*G0_1_0_2_2_0 + 0.129549462882796*G0_1_0_2_2_1 + 0.294757094757093*G0_1_0_2_2_2; + A[106] = 0.00338303671637*G0_0_0_0_0_0 + 6.7340067340061e-05*G0_0_0_0_0_1 + 0.00635561968895299*G0_0_0_0_0_2 + 6.73400673400612e-05*G0_0_0_0_1_0 - 0.000663780663780691*G0_0_0_0_1_1 - 0.000497033830367163*G0_0_0_0_1_2 + 0.00635561968895299*G0_0_0_0_2_0 - 0.000497033830367163*G0_0_0_0_2_1 + 0.00888568221901552*G0_0_0_0_2_2 + 6.73400673400612e-05*G0_0_0_1_0_0 - 0.000663780663780691*G0_0_0_1_0_1 - 0.000497033830367164*G0_0_0_1_0_2 - 0.000663780663780691*G0_0_0_1_1_0 - 0.00565977232643937*G0_0_0_1_1_1 - 0.00108385441718776*G0_0_0_1_1_2 - 0.000497033830367164*G0_0_0_1_2_0 - 0.00108385441718776*G0_0_0_1_2_1 + 0.000381593714927031*G0_0_0_1_2_2 + 0.00635561968895299*G0_0_0_2_0_0 - 0.000497033830367163*G0_0_0_2_0_1 + 0.00888568221901552*G0_0_0_2_0_2 - 0.000497033830367164*G0_0_0_2_1_0 - 0.00108385441718776*G0_0_0_2_1_1 + 0.000381593714927031*G0_0_0_2_1_2 + 0.00888568221901552*G0_0_0_2_2_0 + 0.000381593714927032*G0_0_0_2_2_1 + 0.00575917909251242*G0_0_0_2_2_2 - 0.00237614237614218*G0_1_0_0_0_0 - 0.000314253647586967*G0_1_0_0_0_1 - 0.00253006253006248*G0_1_0_0_0_2 - 0.000314253647586968*G0_1_0_0_1_0 + 0.000420073753407066*G0_1_0_0_1_1 - 0.00253006253006248*G0_1_0_0_2_0 + 0.00253006253006254*G0_1_0_0_2_2 - 0.000314253647586968*G0_1_0_1_0_0 + 0.000420073753407066*G0_1_0_1_0_1 + 0.000420073753407066*G0_1_0_1_1_0 - 0.000420073753407095*G0_1_0_1_1_2 - 0.000420073753407095*G0_1_0_1_2_1 + 0.000314253647586966*G0_1_0_1_2_2 - 0.00253006253006248*G0_1_0_2_0_0 + 0.00253006253006254*G0_1_0_2_0_2 - 0.000420073753407095*G0_1_0_2_1_1 + 0.000314253647586965*G0_1_0_2_1_2 + 0.00253006253006254*G0_1_0_2_2_0 + 0.000314253647586966*G0_1_0_2_2_1 + 0.00237614237614237*G0_1_0_2_2_2; + A[60] = A[106] - 0.0090428090428092*G0_0_0_0_0_0 - 0.000731120731120743*G0_0_0_0_0_1 - 0.00743947410614075*G0_0_0_0_0_2 - 0.000731120731120743*G0_0_0_0_1_0 + 0.000731120731120752*G0_0_0_0_1_1 - 0.00743947410614075*G0_0_0_0_2_0 - 0.00850408850408848*G0_0_0_0_2_2 - 0.000731120731120743*G0_0_0_1_0_0 + 0.000731120731120752*G0_0_0_1_0_1 + 0.000731120731120752*G0_0_0_1_1_0 + 0.00904280904280937*G0_0_0_1_1_1 + 0.00743947410614072*G0_0_0_1_1_2 + 0.00743947410614072*G0_0_0_1_2_1 + 0.00850408850408844*G0_0_0_1_2_2 - 0.00743947410614075*G0_0_0_2_0_0 - 0.00850408850408848*G0_0_0_2_0_2 + 0.00743947410614072*G0_0_0_2_1_1 + 0.00850408850408844*G0_0_0_2_1_2 - 0.00850408850408848*G0_0_0_2_2_0 + 0.00850408850408844*G0_0_0_2_2_1 - 0.0056597723264392*G0_0_1_0_0_0 - 0.000663780663780683*G0_0_1_0_0_1 - 0.00108385441718776*G0_0_1_0_0_2 - 0.000663780663780683*G0_0_1_0_1_0 - 0.000497033830367167*G0_0_1_0_1_2 - 0.00108385441718776*G0_0_1_0_2_0 - 0.000497033830367167*G0_0_1_0_2_1 + 0.000381593714927014*G0_0_1_0_2_2 - 0.000663780663780683*G0_0_1_1_0_0 - 0.000497033830367167*G0_0_1_1_0_2 + 0.00338303671636999*G0_0_1_1_1_1 + 0.00635561968895295*G0_0_1_1_1_2 - 0.000497033830367167*G0_0_1_1_2_0 + 0.00635561968895295*G0_0_1_1_2_1 + 0.00888568221901545*G0_0_1_1_2_2 - 0.00108385441718776*G0_0_1_2_0_0 - 0.000497033830367167*G0_0_1_2_0_1 + 0.000381593714927014*G0_0_1_2_0_2 - 0.000497033830367167*G0_0_1_2_1_0 + 0.00635561968895295*G0_0_1_2_1_1 + 0.00888568221901545*G0_0_1_2_1_2 + 0.000381593714927014*G0_0_1_2_2_0 + 0.00888568221901545*G0_0_1_2_2_1 + 0.00575917909251208*G0_0_1_2_2_2 - 0.00328362995029721*G0_1_0_0_0_0 - 0.000769600769600806*G0_1_0_0_0_1 + 0.0018662818662818*G0_1_0_0_0_2 - 0.000769600769600805*G0_1_0_0_1_0 - 0.000497033830367166*G0_1_0_0_1_2 + 0.0018662818662818*G0_1_0_0_2_0 - 0.000497033830367166*G0_1_0_0_2_1 - 0.00246272246272247*G0_1_0_0_2_2 - 0.000769600769600805*G0_1_0_1_0_0 - 0.000497033830367166*G0_1_0_1_0_2 + 0.00575917909251254*G0_1_0_1_1_1 + 0.00930575597242257*G0_1_0_1_1_2 - 0.000497033830367166*G0_1_0_1_2_0 + 0.00930575597242257*G0_1_0_1_2_1 + 0.00604136604136601*G0_1_0_1_2_2 + 0.0018662818662818*G0_1_0_2_0_0 - 0.000497033830367167*G0_1_0_2_0_1 - 0.00246272246272247*G0_1_0_2_0_2 - 0.000497033830367166*G0_1_0_2_1_0 + 0.00930575597242257*G0_1_0_2_1_1 + 0.00604136604136601*G0_1_0_2_1_2 - 0.00246272246272247*G0_1_0_2_2_0 + 0.00604136604136601*G0_1_0_2_2_1 + 0.00100689434022771*G0_1_0_2_2_2 - 0.00565977232643947*G0_1_1_0_0_0 - 0.00108385441718779*G0_1_1_0_0_1 - 0.000663780663780686*G0_1_1_0_0_2 - 0.00108385441718779*G0_1_1_0_1_0 + 0.00038159371492702*G0_1_1_0_1_1 - 0.000497033830367168*G0_1_1_0_1_2 - 0.000663780663780686*G0_1_1_0_2_0 - 0.000497033830367168*G0_1_1_0_2_1 - 0.00108385441718779*G0_1_1_1_0_0 + 0.000381593714927021*G0_1_1_1_0_1 - 0.000497033830367168*G0_1_1_1_0_2 + 0.00038159371492702*G0_1_1_1_1_0 + 0.00575917909251218*G0_1_1_1_1_1 + 0.00888568221901545*G0_1_1_1_1_2 - 0.000497033830367168*G0_1_1_1_2_0 + 0.00888568221901545*G0_1_1_1_2_1 + 0.00635561968895295*G0_1_1_1_2_2 - 0.000663780663780686*G0_1_1_2_0_0 - 0.000497033830367168*G0_1_1_2_0_1 - 0.000497033830367168*G0_1_1_2_1_0 + 0.00888568221901545*G0_1_1_2_1_1 + 0.00635561968895295*G0_1_1_2_1_2 + 0.00635561968895295*G0_1_1_2_2_1 + 0.00338303671636995*G0_1_1_2_2_2; + A[4] = A[60] - 0.000420073753407089*G0_0_1_0_0_1 + 0.000420073753407079*G0_0_1_0_0_2 - 0.000420073753407089*G0_0_1_0_1_0 + 0.000314253647586976*G0_0_1_0_1_1 + 0.000420073753407079*G0_0_1_0_2_0 - 0.000314253647586964*G0_0_1_0_2_2 - 0.000420073753407089*G0_0_1_1_0_0 + 0.000314253647586975*G0_0_1_1_0_1 + 0.000314253647586975*G0_0_1_1_1_0 + 0.00237614237614223*G0_0_1_1_1_1 + 0.00253006253006253*G0_0_1_1_1_2 + 0.00253006253006253*G0_0_1_1_2_1 - 0.00253006253006247*G0_0_1_1_2_2 + 0.000420073753407079*G0_0_1_2_0_0 - 0.000314253647586964*G0_0_1_2_0_2 + 0.00253006253006253*G0_0_1_2_1_1 - 0.00253006253006247*G0_0_1_2_1_2 - 0.000314253647586964*G0_0_1_2_2_0 - 0.00253006253006247*G0_0_1_2_2_1 - 0.00237614237614212*G0_0_1_2_2_2 + 0.000420073753407089*G0_1_0_0_0_1 - 0.000420073753407079*G0_1_0_0_0_2 + 0.000420073753407089*G0_1_0_0_1_0 - 0.000314253647586976*G0_1_0_0_1_1 - 0.000420073753407079*G0_1_0_0_2_0 + 0.000314253647586963*G0_1_0_0_2_2 + 0.000420073753407089*G0_1_0_1_0_0 - 0.000314253647586975*G0_1_0_1_0_1 - 0.000314253647586975*G0_1_0_1_1_0 - 0.00237614237614224*G0_1_0_1_1_1 - 0.00253006253006253*G0_1_0_1_1_2 - 0.00253006253006253*G0_1_0_1_2_1 + 0.00253006253006247*G0_1_0_1_2_2 - 0.000420073753407079*G0_1_0_2_0_0 + 0.000314253647586963*G0_1_0_2_0_2 - 0.00253006253006253*G0_1_0_2_1_1 + 0.00253006253006247*G0_1_0_2_1_2 + 0.000314253647586963*G0_1_0_2_2_0 + 0.00253006253006247*G0_1_0_2_2_1 + 0.00237614237614212*G0_1_0_2_2_2; + A[187] = A[117] + 0.122366522366522*G0_0_1_0_0_0 - 0.0242424242424241*G0_0_1_0_0_1 + 0.0711880711880709*G0_0_1_0_0_2 - 0.0242424242424241*G0_0_1_0_1_0 - 0.0182395382395381*G0_0_1_0_1_1 - 0.00831168831168825*G0_0_1_0_1_2 + 0.0711880711880709*G0_0_1_0_2_0 - 0.00831168831168826*G0_0_1_0_2_1 + 0.00484848484848471*G0_0_1_0_2_2 - 0.0242424242424241*G0_0_1_1_0_0 - 0.0182395382395381*G0_0_1_1_0_1 - 0.00831168831168825*G0_0_1_1_0_2 - 0.0182395382395381*G0_0_1_1_1_0 - 0.0175468975468976*G0_0_1_1_1_1 - 0.0116209716209716*G0_0_1_1_1_2 - 0.00831168831168826*G0_0_1_1_2_0 - 0.0116209716209716*G0_0_1_1_2_1 - 0.0173160173160173*G0_0_1_1_2_2 + 0.0711880711880709*G0_0_1_2_0_0 - 0.00831168831168826*G0_0_1_2_0_1 + 0.00484848484848471*G0_0_1_2_0_2 - 0.00831168831168825*G0_0_1_2_1_0 - 0.0116209716209716*G0_0_1_2_1_1 - 0.0173160173160173*G0_0_1_2_1_2 + 0.0048484848484847*G0_0_1_2_2_0 - 0.0173160173160173*G0_0_1_2_2_1 - 0.0688023088023087*G0_0_1_2_2_2 - 0.122366522366522*G0_1_0_0_0_0 + 0.0242424242424241*G0_1_0_0_0_1 - 0.0711880711880709*G0_1_0_0_0_2 + 0.0242424242424241*G0_1_0_0_1_0 + 0.0182395382395381*G0_1_0_0_1_1 + 0.00831168831168825*G0_1_0_0_1_2 - 0.0711880711880709*G0_1_0_0_2_0 + 0.00831168831168826*G0_1_0_0_2_1 - 0.00484848484848471*G0_1_0_0_2_2 + 0.0242424242424241*G0_1_0_1_0_0 + 0.0182395382395381*G0_1_0_1_0_1 + 0.00831168831168825*G0_1_0_1_0_2 + 0.0182395382395381*G0_1_0_1_1_0 + 0.0175468975468976*G0_1_0_1_1_1 + 0.0116209716209716*G0_1_0_1_1_2 + 0.00831168831168825*G0_1_0_1_2_0 + 0.0116209716209716*G0_1_0_1_2_1 + 0.0173160173160173*G0_1_0_1_2_2 - 0.0711880711880709*G0_1_0_2_0_0 + 0.00831168831168826*G0_1_0_2_0_1 - 0.00484848484848471*G0_1_0_2_0_2 + 0.00831168831168825*G0_1_0_2_1_0 + 0.0116209716209716*G0_1_0_2_1_1 + 0.0173160173160173*G0_1_0_2_1_2 - 0.00484848484848471*G0_1_0_2_2_0 + 0.0173160173160173*G0_1_0_2_2_1 + 0.0688023088023088*G0_1_0_2_2_2; + A[216] = A[104] - 0.0523328523328528*G0_0_1_0_0_0 - 0.00153920153920152*G0_0_1_0_0_1 + 0.00872214205547538*G0_0_1_0_0_2 - 0.00153920153920153*G0_0_1_0_1_0 - 0.00564373897707222*G0_0_1_0_1_1 + 0.000410453743787074*G0_0_1_0_1_2 + 0.00872214205547537*G0_0_1_0_2_0 + 0.000410453743787076*G0_0_1_0_2_1 + 0.0202148468815135*G0_0_1_0_2_2 - 0.00153920153920152*G0_0_1_1_0_0 - 0.00564373897707222*G0_0_1_1_0_1 + 0.000410453743787076*G0_0_1_1_0_2 - 0.00564373897707222*G0_0_1_1_1_0 - 0.00800384800384776*G0_0_1_1_1_1 - 0.00892736892736892*G0_0_1_1_1_2 + 0.000410453743787074*G0_0_1_1_2_0 - 0.00892736892736892*G0_0_1_1_2_1 - 0.00728555395222059*G0_0_1_1_2_2 + 0.00872214205547539*G0_0_1_2_0_0 + 0.000410453743787076*G0_0_1_2_0_1 + 0.0202148468815135*G0_0_1_2_0_2 + 0.000410453743787075*G0_0_1_2_1_0 - 0.00892736892736892*G0_0_1_2_1_1 - 0.00728555395222061*G0_0_1_2_1_2 + 0.0202148468815135*G0_0_1_2_2_0 - 0.00728555395222061*G0_0_1_2_2_1 + 0.0412506012506017*G0_0_1_2_2_2 + 0.0523328523328528*G0_1_0_0_0_0 + 0.00153920153920153*G0_1_0_0_0_1 - 0.00872214205547537*G0_1_0_0_0_2 + 0.00153920153920152*G0_1_0_0_1_0 + 0.00564373897707222*G0_1_0_0_1_1 - 0.000410453743787076*G0_1_0_0_1_2 - 0.00872214205547537*G0_1_0_0_2_0 - 0.000410453743787074*G0_1_0_0_2_1 - 0.0202148468815135*G0_1_0_0_2_2 + 0.00153920153920152*G0_1_0_1_0_0 + 0.00564373897707222*G0_1_0_1_0_1 - 0.000410453743787075*G0_1_0_1_0_2 + 0.00564373897707222*G0_1_0_1_1_0 + 0.00800384800384776*G0_1_0_1_1_1 + 0.00892736892736892*G0_1_0_1_1_2 - 0.000410453743787074*G0_1_0_1_2_0 + 0.00892736892736892*G0_1_0_1_2_1 + 0.00728555395222059*G0_1_0_1_2_2 - 0.00872214205547537*G0_1_0_2_0_0 - 0.000410453743787075*G0_1_0_2_0_1 - 0.0202148468815135*G0_1_0_2_0_2 - 0.000410453743787074*G0_1_0_2_1_0 + 0.00892736892736892*G0_1_0_2_1_1 + 0.00728555395222059*G0_1_0_2_1_2 - 0.0202148468815135*G0_1_0_2_2_0 + 0.00728555395222061*G0_1_0_2_2_1 - 0.0412506012506016*G0_1_0_2_2_2; + A[15] = 0.0212361712361712*G0_0_0_0_0_0 + 5.39789428678374e-05*G0_0_0_0_0_1 + 0.00190208967986745*G0_0_0_0_0_2 + 5.39789428678375e-05*G0_0_0_0_1_0 + 5.3978942867836e-05*G0_0_0_0_1_1 + 0.000130137352359574*G0_0_0_0_1_2 + 0.00190208967986745*G0_0_0_0_2_0 + 0.000130137352359574*G0_0_0_0_2_1 + 0.000286996953663617*G0_0_0_0_2_2 + 5.39789428678375e-05*G0_0_0_1_0_0 + 5.39789428678362e-05*G0_0_0_1_0_1 + 0.000130137352359574*G0_0_0_1_0_2 + 5.39789428678364e-05*G0_0_0_1_1_0 + 0.0212361712361712*G0_0_0_1_1_1 + 0.00190208967986745*G0_0_0_1_1_2 + 0.000130137352359574*G0_0_0_1_2_0 + 0.00190208967986745*G0_0_0_1_2_1 + 0.000286996953663615*G0_0_0_1_2_2 + 0.00190208967986745*G0_0_0_2_0_0 + 0.000130137352359574*G0_0_0_2_0_1 + 0.000286996953663617*G0_0_0_2_0_2 + 0.000130137352359574*G0_0_0_2_1_0 + 0.00190208967986745*G0_0_0_2_1_1 + 0.000286996953663615*G0_0_0_2_1_2 + 0.000286996953663617*G0_0_0_2_2_0 + 0.000286996953663615*G0_0_0_2_2_1 - 9.78034311367794e-05*G0_0_0_2_2_2 + 0.0212361712361712*G0_0_1_0_0_0 + 5.39789428678378e-05*G0_0_1_0_0_1 + 0.00190208967986745*G0_0_1_0_0_2 + 5.39789428678376e-05*G0_0_1_0_1_0 + 5.39789428678358e-05*G0_0_1_0_1_1 + 0.000130137352359574*G0_0_1_0_1_2 + 0.00190208967986745*G0_0_1_0_2_0 + 0.000130137352359574*G0_0_1_0_2_1 + 0.000286996953663616*G0_0_1_0_2_2 + 5.39789428678376e-05*G0_0_1_1_0_0 + 5.39789428678358e-05*G0_0_1_1_0_1 + 0.000130137352359574*G0_0_1_1_0_2 + 5.39789428678359e-05*G0_0_1_1_1_0 + 0.0212361712361711*G0_0_1_1_1_1 + 0.00190208967986744*G0_0_1_1_1_2 + 0.000130137352359574*G0_0_1_1_2_0 + 0.00190208967986744*G0_0_1_1_2_1 + 0.000286996953663615*G0_0_1_1_2_2 + 0.00190208967986745*G0_0_1_2_0_0 + 0.000130137352359574*G0_0_1_2_0_1 + 0.000286996953663616*G0_0_1_2_0_2 + 0.000130137352359574*G0_0_1_2_1_0 + 0.00190208967986744*G0_0_1_2_1_1 + 0.000286996953663615*G0_0_1_2_1_2 + 0.000286996953663616*G0_0_1_2_2_0 + 0.000286996953663615*G0_0_1_2_2_1 - 9.78034311367894e-05*G0_0_1_2_2_2; + A[37] = A[107] - 0.00162578162578158*G0_0_1_0_0_0 - 0.000362353695687029*G0_0_1_0_0_1 - 0.00400833734167067*G0_0_1_0_0_2 - 0.000362353695687029*G0_0_1_0_1_0 - 0.000182780182780193*G0_0_1_0_1_1 - 0.00174763508096841*G0_0_1_0_1_2 - 0.00400833734167067*G0_0_1_0_2_0 - 0.00174763508096841*G0_0_1_0_2_1 - 0.0115279781946448*G0_0_1_0_2_2 - 0.000362353695687029*G0_0_1_1_0_0 - 0.000182780182780193*G0_0_1_1_0_1 - 0.00174763508096841*G0_0_1_1_0_2 - 0.000182780182780193*G0_0_1_1_1_0 - 0.00298220298220298*G0_0_1_1_1_2 - 0.00174763508096841*G0_0_1_1_2_0 - 0.00298220298220298*G0_0_1_1_2_1 - 0.022430655763989*G0_0_1_1_2_2 - 0.00400833734167067*G0_0_1_2_0_0 - 0.00174763508096841*G0_0_1_2_0_1 - 0.0115279781946448*G0_0_1_2_0_2 - 0.00174763508096841*G0_0_1_2_1_0 - 0.00298220298220298*G0_0_1_2_1_1 - 0.022430655763989*G0_0_1_2_1_2 - 0.0115279781946448*G0_0_1_2_2_0 - 0.022430655763989*G0_0_1_2_2_1 - 0.288792688792687*G0_0_1_2_2_2 + 0.00162578162578158*G0_1_0_0_0_0 + 0.000362353695687029*G0_1_0_0_0_1 + 0.00400833734167067*G0_1_0_0_0_2 + 0.000362353695687029*G0_1_0_0_1_0 + 0.000182780182780193*G0_1_0_0_1_1 + 0.00174763508096841*G0_1_0_0_1_2 + 0.00400833734167067*G0_1_0_0_2_0 + 0.00174763508096841*G0_1_0_0_2_1 + 0.0115279781946448*G0_1_0_0_2_2 + 0.000362353695687029*G0_1_0_1_0_0 + 0.000182780182780193*G0_1_0_1_0_1 + 0.00174763508096841*G0_1_0_1_0_2 + 0.000182780182780193*G0_1_0_1_1_0 + 0.00298220298220298*G0_1_0_1_1_2 + 0.00174763508096841*G0_1_0_1_2_0 + 0.00298220298220298*G0_1_0_1_2_1 + 0.022430655763989*G0_1_0_1_2_2 + 0.00400833734167067*G0_1_0_2_0_0 + 0.00174763508096841*G0_1_0_2_0_1 + 0.0115279781946448*G0_1_0_2_0_2 + 0.00174763508096841*G0_1_0_2_1_0 + 0.00298220298220298*G0_1_0_2_1_1 + 0.022430655763989*G0_1_0_2_1_2 + 0.0115279781946448*G0_1_0_2_2_0 + 0.022430655763989*G0_1_0_2_2_1 + 0.288792688792687*G0_1_0_2_2_2; + A[148] = A[216] - 0.247298380631713*G0_0_0_0_0_0 - 0.0398140131473462*G0_0_0_0_0_1 - 0.0289369889369887*G0_0_0_0_0_2 - 0.0398140131473462*G0_0_0_0_1_0 - 0.0114927048260381*G0_0_0_0_1_1 - 0.00513067179733843*G0_0_0_0_1_2 - 0.0289369889369887*G0_0_0_0_2_0 - 0.00513067179733843*G0_0_0_0_2_1 - 0.0223697290363957*G0_0_0_0_2_2 - 0.0398140131473462*G0_0_0_1_0_0 - 0.0114927048260381*G0_0_0_1_0_1 - 0.00513067179733843*G0_0_0_1_0_2 - 0.0114927048260381*G0_0_0_1_1_0 + 0.203379830046496*G0_0_0_1_1_1 + 0.0338624338624336*G0_0_0_1_1_2 - 0.00513067179733843*G0_0_0_1_2_0 + 0.0338624338624336*G0_0_0_1_2_1 - 0.0400192400192399*G0_0_0_1_2_2 - 0.0289369889369887*G0_0_0_2_0_0 - 0.00513067179733844*G0_0_0_2_0_1 - 0.0223697290363957*G0_0_0_2_0_2 - 0.00513067179733844*G0_0_0_2_1_0 + 0.0338624338624336*G0_0_0_2_1_1 - 0.0400192400192399*G0_0_0_2_1_2 - 0.0223697290363957*G0_0_0_2_2_0 - 0.0400192400192399*G0_0_0_2_2_1 - 0.276235369568702*G0_0_0_2_2_2 - 0.0177521244187908*G0_0_1_0_0_1 + 0.0177521244187911*G0_0_1_0_0_2 - 0.0177521244187908*G0_0_1_0_1_0 + 0.0132371332371332*G0_0_1_0_1_1 + 0.0177521244187911*G0_0_1_0_2_0 - 0.0132371332371333*G0_0_1_0_2_2 - 0.0177521244187908*G0_0_1_1_0_0 + 0.0132371332371332*G0_0_1_1_0_1 + 0.0132371332371332*G0_0_1_1_1_0 + 0.269052429052428*G0_0_1_1_1_1 + 0.0382748116081447*G0_0_1_1_1_2 + 0.0382748116081447*G0_0_1_1_2_1 - 0.0382748116081448*G0_0_1_1_2_2 + 0.0177521244187911*G0_0_1_2_0_0 - 0.0132371332371332*G0_0_1_2_0_2 + 0.0382748116081447*G0_0_1_2_1_1 - 0.0382748116081448*G0_0_1_2_1_2 - 0.0132371332371332*G0_0_1_2_2_0 - 0.0382748116081448*G0_0_1_2_2_1 - 0.269052429052428*G0_0_1_2_2_2 - 0.0280134680134677*G0_1_0_0_0_1 + 0.028013468013468*G0_1_0_0_0_2 - 0.0280134680134677*G0_1_0_0_1_0 - 0.0126214526214524*G0_1_0_0_1_1 + 0.028013468013468*G0_1_0_0_2_0 + 0.0126214526214526*G0_1_0_0_2_2 - 0.0280134680134677*G0_1_0_1_0_0 - 0.0126214526214524*G0_1_0_1_0_1 - 0.0126214526214524*G0_1_0_1_1_0 + 0.219797979797979*G0_1_0_1_1_1 + 0.0366329966329965*G0_1_0_1_1_2 + 0.0366329966329965*G0_1_0_1_2_1 - 0.0366329966329964*G0_1_0_1_2_2 + 0.028013468013468*G0_1_0_2_0_0 + 0.0126214526214526*G0_1_0_2_0_2 + 0.0366329966329965*G0_1_0_2_1_1 - 0.0366329966329964*G0_1_0_2_1_2 + 0.0126214526214526*G0_1_0_2_2_0 - 0.0366329966329964*G0_1_0_2_2_1 - 0.219797979797978*G0_1_0_2_2_2 + 0.247298380631714*G0_1_1_0_0_0 + 0.0289369889369889*G0_1_1_0_0_1 + 0.0398140131473463*G0_1_1_0_0_2 + 0.0289369889369889*G0_1_1_0_1_0 + 0.0223697290363956*G0_1_1_0_1_1 + 0.00513067179733844*G0_1_1_0_1_2 + 0.0398140131473463*G0_1_1_0_2_0 + 0.00513067179733844*G0_1_1_0_2_1 + 0.0114927048260381*G0_1_1_0_2_2 + 0.0289369889369889*G0_1_1_1_0_0 + 0.0223697290363956*G0_1_1_1_0_1 + 0.00513067179733844*G0_1_1_1_0_2 + 0.0223697290363956*G0_1_1_1_1_0 + 0.276235369568702*G0_1_1_1_1_1 + 0.0400192400192399*G0_1_1_1_1_2 + 0.00513067179733844*G0_1_1_1_2_0 + 0.0400192400192399*G0_1_1_1_2_1 - 0.0338624338624336*G0_1_1_1_2_2 + 0.0398140131473463*G0_1_1_2_0_0 + 0.00513067179733844*G0_1_1_2_0_1 + 0.0114927048260381*G0_1_1_2_0_2 + 0.00513067179733844*G0_1_1_2_1_0 + 0.0400192400192399*G0_1_1_2_1_1 - 0.0338624338624336*G0_1_1_2_1_2 + 0.0114927048260381*G0_1_1_2_2_0 - 0.0338624338624336*G0_1_1_2_2_1 - 0.203379830046495*G0_1_1_2_2_2; + A[91] = A[21] + 0.0167644700978036*G0_0_1_0_0_0 - 0.000333493666826982*G0_0_1_0_0_1 - 0.00288600288600285*G0_0_1_0_0_2 - 0.000333493666826982*G0_0_1_0_1_0 - 0.00071401849179627*G0_0_1_0_1_1 - 0.00288600288600285*G0_0_1_0_2_0 - 0.00197103308214418*G0_0_1_0_2_2 - 0.000333493666826983*G0_0_1_1_0_0 - 0.00071401849179627*G0_0_1_1_0_1 - 0.00071401849179627*G0_0_1_1_1_0 + 0.000714018491796263*G0_0_1_1_1_2 + 0.000714018491796263*G0_0_1_1_2_1 + 0.000213777991555758*G0_0_1_1_2_2 - 0.00288600288600285*G0_0_1_2_0_0 - 0.00197103308214418*G0_0_1_2_0_2 + 0.000714018491796263*G0_0_1_2_1_1 + 0.000213777991555758*G0_0_1_2_1_2 - 0.00197103308214418*G0_0_1_2_2_0 + 0.000213777991555758*G0_0_1_2_2_1 - 0.00219336219336225*G0_0_1_2_2_2 - 0.0167644700978036*G0_1_0_0_0_0 + 0.000333493666826982*G0_1_0_0_0_1 + 0.00288600288600285*G0_1_0_0_0_2 + 0.000333493666826982*G0_1_0_0_1_0 + 0.00071401849179627*G0_1_0_0_1_1 + 0.00288600288600285*G0_1_0_0_2_0 + 0.00197103308214418*G0_1_0_0_2_2 + 0.000333493666826982*G0_1_0_1_0_0 + 0.00071401849179627*G0_1_0_1_0_1 + 0.00071401849179627*G0_1_0_1_1_0 - 0.000714018491796263*G0_1_0_1_1_2 - 0.000714018491796263*G0_1_0_1_2_1 - 0.000213777991555758*G0_1_0_1_2_2 + 0.00288600288600285*G0_1_0_2_0_0 + 0.00197103308214418*G0_1_0_2_0_2 - 0.000714018491796263*G0_1_0_2_1_1 - 0.000213777991555758*G0_1_0_2_1_2 + 0.00197103308214418*G0_1_0_2_2_0 - 0.000213777991555758*G0_1_0_2_2_1 + 0.00219336219336225*G0_1_0_2_2_2; + A[82] = A[110] - 0.00823472823472812*G0_0_1_0_0_0 - 0.000820907487574111*G0_0_1_0_0_1 - 0.00336059002725665*G0_0_1_0_0_2 - 0.000820907487574111*G0_0_1_0_1_0 - 0.000897867564534169*G0_0_1_0_1_1 - 0.00336059002725665*G0_0_1_0_2_0 - 0.0135962802629468*G0_0_1_0_2_2 - 0.000820907487574111*G0_0_1_1_0_0 - 0.000897867564534169*G0_0_1_1_0_1 - 0.000897867564534169*G0_0_1_1_1_0 - 0.00892736892736847*G0_0_1_1_1_1 - 0.0138784672118004*G0_0_1_1_1_2 - 0.0138784672118004*G0_0_1_1_2_1 - 0.0200096200096199*G0_0_1_1_2_2 - 0.00336059002725665*G0_0_1_2_0_0 - 0.0135962802629468*G0_0_1_2_0_2 - 0.0138784672118004*G0_0_1_2_1_1 - 0.0200096200096199*G0_0_1_2_1_2 - 0.0135962802629468*G0_0_1_2_2_0 - 0.0200096200096199*G0_0_1_2_2_1 + 0.174699374699373*G0_0_1_2_2_2 + 0.00823472823472812*G0_1_0_0_0_0 + 0.000820907487574111*G0_1_0_0_0_1 + 0.00336059002725665*G0_1_0_0_0_2 + 0.000820907487574111*G0_1_0_0_1_0 + 0.000897867564534169*G0_1_0_0_1_1 + 0.00336059002725665*G0_1_0_0_2_0 + 0.0135962802629468*G0_1_0_0_2_2 + 0.000820907487574111*G0_1_0_1_0_0 + 0.000897867564534169*G0_1_0_1_0_1 + 0.000897867564534169*G0_1_0_1_1_0 + 0.00892736892736847*G0_1_0_1_1_1 + 0.0138784672118004*G0_1_0_1_1_2 + 0.0138784672118004*G0_1_0_1_2_1 + 0.0200096200096199*G0_1_0_1_2_2 + 0.00336059002725665*G0_1_0_2_0_0 + 0.0135962802629468*G0_1_0_2_0_2 + 0.0138784672118004*G0_1_0_2_1_1 + 0.0200096200096199*G0_1_0_2_1_2 + 0.0135962802629468*G0_1_0_2_2_0 + 0.0200096200096199*G0_1_0_2_2_1 - 0.174699374699373*G0_1_0_2_2_2; + A[153] = A[82] - 0.0539490139490137*G0_0_0_0_0_0 - 0.0173160173160172*G0_0_0_0_0_1 - 0.00774731441398098*G0_0_0_0_0_2 - 0.0173160173160172*G0_0_0_0_1_0 - 0.0230110630110629*G0_0_0_0_1_1 - 0.00651595318261982*G0_0_0_0_1_2 - 0.00774731441398097*G0_0_0_0_2_0 - 0.00651595318261982*G0_0_0_0_2_1 + 0.00184704184704202*G0_0_0_0_2_2 - 0.0173160173160172*G0_0_0_1_0_0 - 0.0230110630110629*G0_0_0_1_0_1 - 0.00651595318261982*G0_0_0_1_0_2 - 0.0230110630110629*G0_0_0_1_1_0 + 0.194632034632033*G0_0_0_1_1_1 + 0.0315536315536313*G0_0_0_1_1_2 - 0.00651595318261982*G0_0_0_1_2_0 + 0.0315536315536313*G0_0_0_1_2_1 - 0.0430976430976429*G0_0_0_1_2_2 - 0.00774731441398097*G0_0_0_2_0_0 - 0.00651595318261982*G0_0_0_2_0_1 + 0.00184704184704201*G0_0_0_2_0_2 - 0.00651595318261982*G0_0_0_2_1_0 + 0.0315536315536313*G0_0_0_2_1_1 - 0.0430976430976428*G0_0_0_2_1_2 + 0.00184704184704201*G0_0_0_2_2_0 - 0.0430976430976429*G0_0_0_2_2_1 - 0.588590668590664*G0_0_0_2_2_2 - 0.0128010261343594*G0_0_1_0_0_1 + 0.0128010261343594*G0_0_1_0_0_2 - 0.0128010261343594*G0_0_1_0_1_0 - 0.0261407728074393*G0_0_1_0_1_1 + 0.0128010261343594*G0_0_1_0_2_0 + 0.0261407728074395*G0_0_1_0_2_2 - 0.0128010261343594*G0_0_1_1_0_0 - 0.0261407728074393*G0_0_1_1_0_1 - 0.0261407728074393*G0_0_1_1_1_0 + 0.450832130832129*G0_0_1_1_1_1 + 0.0347089947089946*G0_0_1_1_1_2 + 0.0347089947089946*G0_0_1_1_2_1 - 0.0347089947089945*G0_0_1_1_2_2 + 0.0128010261343594*G0_0_1_2_0_0 + 0.0261407728074395*G0_0_1_2_0_2 + 0.0347089947089946*G0_0_1_2_1_1 - 0.0347089947089945*G0_0_1_2_1_2 + 0.0261407728074395*G0_0_1_2_2_0 - 0.0347089947089945*G0_0_1_2_2_1 - 0.450832130832127*G0_0_1_2_2_2 - 0.0102613435946768*G0_1_0_0_0_1 + 0.010261343594677*G0_1_0_0_0_2 - 0.0102613435946768*G0_1_0_0_1_0 - 0.0134423601090267*G0_1_0_0_1_1 + 0.010261343594677*G0_1_0_0_2_0 + 0.0134423601090269*G0_1_0_0_2_2 - 0.0102613435946768*G0_1_0_1_0_0 - 0.0134423601090267*G0_1_0_1_0_1 - 0.0134423601090267*G0_1_0_1_1_0 + 0.267205387205386*G0_1_0_1_1_1 + 0.0408401475068139*G0_1_0_1_1_2 + 0.0408401475068139*G0_1_0_1_2_1 - 0.0408401475068139*G0_1_0_1_2_2 + 0.010261343594677*G0_1_0_2_0_0 + 0.0134423601090269*G0_1_0_2_0_2 + 0.0408401475068139*G0_1_0_2_1_1 - 0.0408401475068139*G0_1_0_2_1_2 + 0.0134423601090269*G0_1_0_2_2_0 - 0.0408401475068139*G0_1_0_2_2_1 - 0.267205387205385*G0_1_0_2_2_2 + 0.0539490139490135*G0_1_1_0_0_0 + 0.00774731441398108*G0_1_1_0_0_1 + 0.0173160173160173*G0_1_1_0_0_2 + 0.00774731441398108*G0_1_1_0_1_0 - 0.00184704184704174*G0_1_1_0_1_1 + 0.00651595318261984*G0_1_1_0_1_2 + 0.0173160173160173*G0_1_1_0_2_0 + 0.00651595318261985*G0_1_1_0_2_1 + 0.023011063011063*G0_1_1_0_2_2 + 0.00774731441398108*G0_1_1_1_0_0 - 0.00184704184704174*G0_1_1_1_0_1 + 0.00651595318261985*G0_1_1_1_0_2 - 0.00184704184704175*G0_1_1_1_1_0 + 0.588590668590666*G0_1_1_1_1_1 + 0.0430976430976429*G0_1_1_1_1_2 + 0.00651595318261985*G0_1_1_1_2_0 + 0.0430976430976429*G0_1_1_1_2_1 - 0.0315536315536313*G0_1_1_1_2_2 + 0.0173160173160173*G0_1_1_2_0_0 + 0.00651595318261985*G0_1_1_2_0_1 + 0.023011063011063*G0_1_1_2_0_2 + 0.00651595318261985*G0_1_1_2_1_0 + 0.0430976430976429*G0_1_1_2_1_1 - 0.0315536315536313*G0_1_1_2_1_2 + 0.023011063011063*G0_1_1_2_2_0 - 0.0315536315536313*G0_1_1_2_2_1 - 0.194632034632033*G0_1_1_2_2_2; + A[100] = A[153] + 0.249504569504568*G0_0_0_0_0_0 - 0.00559243225909887*G0_0_0_0_0_1 + 0.0608497675164337*G0_0_0_0_0_2 - 0.00559243225909887*G0_0_0_0_1_0 + 0.00559243225909883*G0_0_0_0_1_1 + 0.0608497675164337*G0_0_0_0_2_0 + 0.0238063171396503*G0_0_0_0_2_2 - 0.00559243225909886*G0_0_0_1_0_0 + 0.00559243225909883*G0_0_0_1_0_1 + 0.00559243225909883*G0_0_0_1_1_0 - 0.249504569504568*G0_0_0_1_1_1 - 0.0608497675164339*G0_0_0_1_1_2 - 0.0608497675164339*G0_0_0_1_2_1 - 0.0238063171396503*G0_0_0_1_2_2 + 0.0608497675164337*G0_0_0_2_0_0 + 0.0238063171396503*G0_0_0_2_0_2 - 0.0608497675164339*G0_0_0_2_1_1 - 0.0238063171396503*G0_0_0_2_1_2 + 0.0238063171396503*G0_0_0_2_2_0 - 0.0238063171396503*G0_0_0_2_2_1 - 0.0689818823152153*G0_0_1_0_0_0 + 0.00520763187429845*G0_0_1_0_0_1 - 0.0186243386243386*G0_0_1_0_0_2 + 0.00520763187429845*G0_0_1_0_1_0 + 0.0210357543690874*G0_0_1_0_1_1 - 0.00253968253968255*G0_0_1_0_1_2 - 0.0186243386243386*G0_0_1_0_2_0 - 0.00253968253968255*G0_0_1_0_2_1 - 0.00761904761904761*G0_0_1_0_2_2 + 0.00520763187429845*G0_0_1_1_0_0 + 0.0210357543690874*G0_0_1_1_0_1 - 0.00253968253968255*G0_0_1_1_0_2 + 0.0210357543690874*G0_0_1_1_1_0 - 0.501420554753887*G0_0_1_1_1_1 - 0.0602853936187267*G0_0_1_1_1_2 - 0.00253968253968255*G0_0_1_1_2_0 - 0.0602853936187267*G0_0_1_1_2_1 - 0.0184447651114317*G0_0_1_1_2_2 - 0.0186243386243386*G0_0_1_2_0_0 - 0.00253968253968255*G0_0_1_2_0_1 - 0.00761904761904761*G0_0_1_2_0_2 - 0.00253968253968255*G0_0_1_2_1_0 - 0.0602853936187267*G0_0_1_2_1_1 - 0.0184447651114317*G0_0_1_2_1_2 - 0.00761904761904761*G0_0_1_2_2_0 - 0.0184447651114317*G0_0_1_2_2_1 - 0.0077986211319544*G0_0_1_2_2_2 - 0.251915985249318*G0_1_0_0_0_0 + 0.0154433221099886*G0_1_0_0_0_1 + 0.000564373897707121*G0_1_0_0_0_2 + 0.0154433221099886*G0_1_0_0_1_0 + 0.0108000641333974*G0_1_0_0_1_1 - 0.00253968253968254*G0_1_0_0_1_2 + 0.00056437389770713*G0_1_0_0_2_0 - 0.00253968253968254*G0_1_0_0_2_1 + 0.00536155202821861*G0_1_0_0_2_2 + 0.0154433221099886*G0_1_0_1_0_0 + 0.0108000641333974*G0_1_0_1_0_1 - 0.00253968253968254*G0_1_0_1_0_2 + 0.0108000641333974*G0_1_0_1_1_0 - 0.318486451819783*G0_1_0_1_1_1 - 0.0794741061407723*G0_1_0_1_1_2 - 0.00253968253968254*G0_1_0_1_2_0 - 0.0794741061407723*G0_1_0_1_2_1 - 0.0314253647586979*G0_1_0_1_2_2 + 0.000564373897707123*G0_1_0_2_0_0 - 0.00253968253968254*G0_1_0_2_0_1 + 0.00536155202821861*G0_1_0_2_0_2 - 0.00253968253968254*G0_1_0_2_1_0 - 0.0794741061407723*G0_1_0_2_1_1 - 0.0314253647586979*G0_1_0_2_1_2 + 0.00536155202821861*G0_1_0_2_2_0 - 0.0314253647586979*G0_1_0_2_2_1 - 0.00779862113195436*G0_1_0_2_2_2 + 0.0583100849767505*G0_1_1_0_0_0 + 0.0161616161616159*G0_1_1_0_0_1 - 0.00674683341350016*G0_1_1_0_0_2 + 0.0161616161616159*G0_1_1_0_1_0 + 0.0100817700817699*G0_1_1_0_1_1 - 0.00253968253968255*G0_1_1_0_1_2 - 0.00674683341350016*G0_1_1_0_2_0 - 0.00253968253968255*G0_1_1_0_2_1 - 0.00595157928491262*G0_1_1_0_2_2 + 0.0161616161616159*G0_1_1_1_0_0 + 0.0100817700817699*G0_1_1_1_0_1 - 0.00253968253968256*G0_1_1_1_0_2 + 0.0100817700817699*G0_1_1_1_1_0 - 0.628712522045852*G0_1_1_1_1_1 - 0.0721628988295651*G0_1_1_1_1_2 - 0.00253968253968255*G0_1_1_1_2_0 - 0.0721628988295651*G0_1_1_1_2_1 - 0.0201122334455667*G0_1_1_1_2_2 - 0.00674683341350016*G0_1_1_2_0_0 - 0.00253968253968255*G0_1_1_2_0_1 - 0.00595157928491262*G0_1_1_2_0_2 - 0.00253968253968255*G0_1_1_2_1_0 - 0.0721628988295651*G0_1_1_2_1_1 - 0.0201122334455667*G0_1_1_2_1_2 - 0.00595157928491262*G0_1_1_2_2_0 - 0.0201122334455667*G0_1_1_2_2_1 - 0.0077986211319544*G0_1_1_2_2_2; + A[163] = -A[153] + 0.20078884078884*G0_0_0_0_0_0 + 0.0214205547538879*G0_0_0_0_0_1 + 0.0520763187429851*G0_0_0_0_0_2 + 0.0214205547538879*G0_0_0_0_1_0 - 0.021420554753888*G0_0_0_0_1_1 + 0.0520763187429851*G0_0_0_0_2_0 + 0.0207279140612473*G0_0_0_0_2_2 + 0.0214205547538879*G0_0_0_1_0_0 - 0.021420554753888*G0_0_0_1_0_1 - 0.021420554753888*G0_0_0_1_1_0 - 0.20078884078884*G0_0_0_1_1_1 - 0.0520763187429851*G0_0_0_1_1_2 - 0.0520763187429851*G0_0_0_1_2_1 - 0.0207279140612472*G0_0_0_1_2_2 + 0.0520763187429851*G0_0_0_2_0_0 + 0.0207279140612473*G0_0_0_2_0_2 - 0.0520763187429851*G0_0_0_2_1_1 - 0.0207279140612472*G0_0_0_2_1_2 + 0.0207279140612473*G0_0_0_2_2_0 - 0.0207279140612472*G0_0_0_2_2_1 + 0.00482283148949752*G0_0_1_0_0_0 - 0.057771364438031*G0_0_1_0_0_1 - 0.00179573512906847*G0_0_1_0_0_2 - 0.057771364438031*G0_0_1_0_1_0 - 0.155767195767195*G0_0_1_0_1_1 - 0.0116466249799582*G0_0_1_0_1_2 - 0.00179573512906847*G0_0_1_0_2_0 - 0.0116466249799582*G0_0_1_0_2_1 - 0.000102613435946754*G0_0_1_0_2_2 - 0.057771364438031*G0_0_1_1_0_0 - 0.155767195767195*G0_0_1_1_0_1 - 0.0116466249799582*G0_0_1_1_0_2 - 0.155767195767195*G0_0_1_1_1_0 - 0.204200737534069*G0_0_1_1_1_1 - 0.0661343594676923*G0_0_1_1_1_2 - 0.0116466249799582*G0_0_1_1_2_0 - 0.0661343594676923*G0_0_1_1_2_1 - 0.0271925605258936*G0_0_1_1_2_2 - 0.00179573512906847*G0_0_1_2_0_0 - 0.0116466249799582*G0_0_1_2_0_1 - 0.000102613435946753*G0_0_1_2_0_2 - 0.0116466249799582*G0_0_1_2_1_0 - 0.0661343594676923*G0_0_1_2_1_1 - 0.0271925605258936*G0_0_1_2_1_2 - 0.000102613435946753*G0_0_1_2_2_0 - 0.0271925605258936*G0_0_1_2_2_1 - 0.0150328683662016*G0_0_1_2_2_2 - 0.0557447490780823*G0_1_0_0_0_0 - 0.0495622895622893*G0_1_0_0_0_1 - 0.0182908449575116*G0_1_0_0_0_2 - 0.0495622895622893*G0_1_0_0_1_0 - 0.0709828443161773*G0_1_0_0_1_1 - 0.0199839666506332*G0_1_0_0_1_2 - 0.0182908449575116*G0_1_0_0_2_0 - 0.0199839666506332*G0_1_0_0_2_1 - 0.0108257174923842*G0_1_0_0_2_2 - 0.0495622895622893*G0_1_0_1_0_0 - 0.0709828443161773*G0_1_0_1_0_1 - 0.0199839666506332*G0_1_0_1_0_2 - 0.0709828443161773*G0_1_0_1_1_0 - 0.256533589866922*G0_1_0_1_1_1 - 0.0703671637004966*G0_1_0_1_1_2 - 0.0199839666506332*G0_1_0_1_2_0 - 0.0703671637004966*G0_1_0_1_2_1 - 0.0315536315536313*G0_1_0_1_2_2 - 0.0182908449575116*G0_1_0_2_0_0 - 0.0199839666506332*G0_1_0_2_0_1 - 0.0108257174923842*G0_1_0_2_0_2 - 0.0199839666506332*G0_1_0_2_1_0 - 0.0703671637004966*G0_1_0_2_1_1 - 0.0315536315536313*G0_1_0_2_1_2 - 0.0108257174923842*G0_1_0_2_2_0 - 0.0315536315536313*G0_1_0_2_2_1 - 0.0236523969857302*G0_1_0_2_2_2 - 0.13083213083213*G0_1_1_0_0_0 - 0.149661696328362*G0_1_1_0_0_1 - 0.0163668430335096*G0_1_1_0_0_2 - 0.149661696328362*G0_1_1_0_1_0 - 0.236010902677568*G0_1_1_0_1_1 - 0.02349847683181*G0_1_1_0_1_2 - 0.0163668430335096*G0_1_1_0_2_0 - 0.02349847683181*G0_1_1_0_2_1 - 0.00472021805355135*G0_1_1_0_2_2 - 0.149661696328362*G0_1_1_1_0_0 - 0.236010902677568*G0_1_1_1_0_1 - 0.02349847683181*G0_1_1_1_0_2 - 0.236010902677568*G0_1_1_1_1_0 - 0.186243386243385*G0_1_1_1_1_1 - 0.0856822190155518*G0_1_1_1_1_2 - 0.02349847683181*G0_1_1_1_2_0 - 0.0856822190155518*G0_1_1_1_2_1 - 0.0403783870450534*G0_1_1_1_2_2 - 0.0163668430335096*G0_1_1_2_0_0 - 0.0234984768318101*G0_1_1_2_0_1 - 0.00472021805355135*G0_1_1_2_0_2 - 0.0234984768318101*G0_1_1_2_1_0 - 0.0856822190155518*G0_1_1_2_1_1 - 0.0403783870450534*G0_1_1_2_1_2 - 0.00472021805355135*G0_1_1_2_2_0 - 0.0403783870450534*G0_1_1_2_2_1 - 0.0260125060125058*G0_1_1_2_2_2; + A[205] = A[163] - 0.0688023088023081*G0_0_1_0_0_0 + 0.00484848484848492*G0_0_1_0_0_1 - 0.0173160173160173*G0_0_1_0_0_2 + 0.00484848484848492*G0_0_1_0_1_0 + 0.0711880711880709*G0_0_1_0_1_1 - 0.00831168831168829*G0_0_1_0_1_2 - 0.0173160173160173*G0_0_1_0_2_0 - 0.00831168831168828*G0_0_1_0_2_1 - 0.0116209716209717*G0_0_1_0_2_2 + 0.00484848484848492*G0_0_1_1_0_0 + 0.0711880711880709*G0_0_1_1_0_1 - 0.00831168831168829*G0_0_1_1_0_2 + 0.0711880711880709*G0_0_1_1_1_0 + 0.122366522366522*G0_0_1_1_1_1 - 0.0242424242424241*G0_0_1_1_1_2 - 0.00831168831168828*G0_0_1_1_2_0 - 0.0242424242424241*G0_0_1_1_2_1 - 0.0182395382395382*G0_0_1_1_2_2 - 0.0173160173160173*G0_0_1_2_0_0 - 0.00831168831168829*G0_0_1_2_0_1 - 0.0116209716209717*G0_0_1_2_0_2 - 0.00831168831168829*G0_0_1_2_1_0 - 0.0242424242424241*G0_0_1_2_1_1 - 0.0182395382395382*G0_0_1_2_1_2 - 0.0116209716209717*G0_0_1_2_2_0 - 0.0182395382395382*G0_0_1_2_2_1 - 0.0175468975468975*G0_0_1_2_2_2 + 0.0688023088023081*G0_1_0_0_0_0 - 0.00484848484848492*G0_1_0_0_0_1 + 0.0173160173160173*G0_1_0_0_0_2 - 0.00484848484848492*G0_1_0_0_1_0 - 0.071188071188071*G0_1_0_0_1_1 + 0.00831168831168829*G0_1_0_0_1_2 + 0.0173160173160173*G0_1_0_0_2_0 + 0.00831168831168829*G0_1_0_0_2_1 + 0.0116209716209717*G0_1_0_0_2_2 - 0.00484848484848492*G0_1_0_1_0_0 - 0.071188071188071*G0_1_0_1_0_1 + 0.00831168831168829*G0_1_0_1_0_2 - 0.071188071188071*G0_1_0_1_1_0 - 0.122366522366522*G0_1_0_1_1_1 + 0.0242424242424241*G0_1_0_1_1_2 + 0.00831168831168829*G0_1_0_1_2_0 + 0.0242424242424241*G0_1_0_1_2_1 + 0.0182395382395382*G0_1_0_1_2_2 + 0.0173160173160173*G0_1_0_2_0_0 + 0.00831168831168829*G0_1_0_2_0_1 + 0.0116209716209717*G0_1_0_2_0_2 + 0.00831168831168829*G0_1_0_2_1_0 + 0.0242424242424241*G0_1_0_2_1_1 + 0.0182395382395382*G0_1_0_2_1_2 + 0.0116209716209717*G0_1_0_2_2_0 + 0.0182395382395382*G0_1_0_2_2_1 + 0.0175468975468975*G0_1_0_2_2_2; + A[208] = -A[163] + 0.563270803270801*G0_0_0_0_0_0 + 0.139836459836459*G0_0_0_0_0_1 + 0.251813371813371*G0_0_0_0_0_2 + 0.139836459836459*G0_0_0_0_1_0 + 0.127215007215007*G0_0_0_0_1_1 + 0.0885040885040882*G0_0_0_0_1_2 + 0.251813371813371*G0_0_0_0_2_0 + 0.0885040885040882*G0_0_0_0_2_1 + 0.211640211640211*G0_0_0_0_2_2 + 0.139836459836459*G0_0_0_1_0_0 + 0.127215007215007*G0_0_0_1_0_1 + 0.0885040885040882*G0_0_0_1_0_2 + 0.127215007215007*G0_0_0_1_1_0 + 0.577123617123614*G0_0_0_1_1_1 + 0.264126984126983*G0_0_0_1_1_2 + 0.0885040885040882*G0_0_0_1_2_0 + 0.264126984126983*G0_0_0_1_2_1 + 0.185781625781625*G0_0_0_1_2_2 + 0.251813371813371*G0_0_0_2_0_0 + 0.0885040885040882*G0_0_0_2_0_1 + 0.211640211640211*G0_0_0_2_0_2 + 0.0885040885040882*G0_0_0_2_1_0 + 0.264126984126983*G0_0_0_2_1_1 + 0.185781625781625*G0_0_0_2_1_2 + 0.211640211640211*G0_0_0_2_2_0 + 0.185781625781625*G0_0_0_2_2_1 + 0.374641654641653*G0_0_0_2_2_2 + 0.0631842231842225*G0_0_1_0_0_0 - 0.00700336700336703*G0_0_1_0_0_1 + 0.0115440115440116*G0_0_1_0_0_2 - 0.00700336700336703*G0_0_1_0_1_0 - 0.061260221260221*G0_0_1_0_1_1 + 0.0140836940836941*G0_0_1_0_1_2 + 0.0115440115440116*G0_0_1_0_2_0 + 0.0140836940836941*G0_0_1_0_2_1 + 0.0116209716209717*G0_0_1_0_2_2 - 0.00700336700336703*G0_0_1_1_0_0 - 0.061260221260221*G0_0_1_1_0_1 + 0.0140836940836941*G0_0_1_1_0_2 - 0.061260221260221*G0_0_1_1_1_0 + 0.123905723905723*G0_0_1_1_1_1 + 0.19132275132275*G0_0_1_1_1_2 + 0.0140836940836941*G0_0_1_1_2_0 + 0.19132275132275*G0_0_1_1_2_1 + 0.119672919672919*G0_0_1_1_2_2 + 0.0115440115440116*G0_0_1_2_0_0 + 0.0140836940836941*G0_0_1_2_0_1 + 0.0116209716209717*G0_0_1_2_0_2 + 0.0140836940836941*G0_0_1_2_1_0 + 0.19132275132275*G0_0_1_2_1_1 + 0.119672919672919*G0_0_1_2_1_2 + 0.0116209716209717*G0_0_1_2_2_0 + 0.119672919672919*G0_0_1_2_2_1 + 0.0989706589706585*G0_0_1_2_2_2 - 0.00561808561808561*G0_1_0_0_0_0 - 0.0021548821548821*G0_1_0_0_0_1 - 0.00577200577200573*G0_1_0_0_0_2 - 0.0021548821548821*G0_1_0_0_1_0 + 0.00992784992784992*G0_1_0_0_1_1 + 0.00577200577200578*G0_1_0_0_1_2 - 0.00577200577200573*G0_1_0_0_2_0 + 0.00577200577200577*G0_1_0_0_2_1 - 0.0021548821548821*G0_1_0_1_0_0 + 0.00992784992784994*G0_1_0_1_0_1 + 0.00577200577200578*G0_1_0_1_0_2 + 0.00992784992784994*G0_1_0_1_1_0 + 0.246272246272245*G0_1_0_1_1_1 + 0.167080327080326*G0_1_0_1_1_2 + 0.00577200577200578*G0_1_0_1_2_0 + 0.167080327080326*G0_1_0_1_2_1 + 0.101433381433381*G0_1_0_1_2_2 - 0.00577200577200573*G0_1_0_2_0_0 + 0.00577200577200577*G0_1_0_2_0_1 + 0.00577200577200578*G0_1_0_2_1_0 + 0.167080327080326*G0_1_0_2_1_1 + 0.101433381433381*G0_1_0_2_1_2 + 0.101433381433381*G0_1_0_2_2_1 + 0.0814237614237609*G0_1_0_2_2_2 + 0.0299374699374697*G0_1_1_0_0_0 + 0.052178932178932*G0_1_1_0_0_1 + 0.00592592592592589*G0_1_1_0_0_2 + 0.052178932178932*G0_1_1_0_1_0 + 0.143915343915343*G0_1_1_0_1_1 + 0.0240115440115439*G0_1_1_0_1_2 + 0.00592592592592589*G0_1_1_0_2_0 + 0.0240115440115439*G0_1_1_0_2_1 + 0.0174699374699374*G0_1_1_0_2_2 + 0.052178932178932*G0_1_1_1_0_0 + 0.143915343915343*G0_1_1_1_0_1 + 0.0240115440115439*G0_1_1_1_0_2 + 0.143915343915343*G0_1_1_1_1_0 + 0.781914381914378*G0_1_1_1_1_1 + 0.225493025493024*G0_1_1_1_1_2 + 0.0240115440115439*G0_1_1_1_2_0 + 0.225493025493024*G0_1_1_1_2_1 + 0.139913419913419*G0_1_1_1_2_2 + 0.00592592592592589*G0_1_1_2_0_0 + 0.0240115440115439*G0_1_1_2_0_1 + 0.0174699374699374*G0_1_1_2_0_2 + 0.0240115440115439*G0_1_1_2_1_0 + 0.225493025493024*G0_1_1_2_1_1 + 0.139913419913419*G0_1_1_2_1_2 + 0.0174699374699374*G0_1_1_2_2_0 + 0.139913419913419*G0_1_1_2_2_1 + 0.133833573833573*G0_1_1_2_2_2; + A[192] = A[208] + 0.664935064935062*G0_0_0_0_0_0 + 0.0246272246272245*G0_0_0_0_0_1 + 0.177316017316017*G0_0_0_0_0_2 + 0.0246272246272245*G0_0_0_0_1_0 - 0.0246272246272245*G0_0_0_0_1_1 + 0.177316017316017*G0_0_0_0_2_0 + 0.0394035594035593*G0_0_0_0_2_2 + 0.0246272246272245*G0_0_0_1_0_0 - 0.0246272246272244*G0_0_0_1_0_1 - 0.0246272246272244*G0_0_0_1_1_0 - 0.664935064935061*G0_0_0_1_1_1 - 0.177316017316016*G0_0_0_1_1_2 - 0.177316017316016*G0_0_0_1_2_1 - 0.0394035594035591*G0_0_0_1_2_2 + 0.177316017316017*G0_0_0_2_0_0 + 0.0394035594035593*G0_0_0_2_0_2 - 0.177316017316016*G0_0_0_2_1_1 - 0.0394035594035591*G0_0_0_2_1_2 + 0.0394035594035593*G0_0_0_2_2_0 - 0.0394035594035591*G0_0_0_2_2_1 + 0.147763347763347*G0_0_1_0_0_0 + 0.0221645021645021*G0_0_1_0_0_1 + 0.0467917267917265*G0_0_1_0_0_2 + 0.0221645021645021*G0_0_1_0_1_0 - 0.00246272246272237*G0_0_1_0_1_1 + 0.0344781144781144*G0_0_1_0_1_2 + 0.0467917267917265*G0_0_1_0_2_0 + 0.0344781144781144*G0_0_1_0_2_1 + 0.0541798941798939*G0_0_1_0_2_2 + 0.0221645021645021*G0_0_1_1_0_0 - 0.00246272246272239*G0_0_1_1_0_1 + 0.0344781144781144*G0_0_1_1_0_2 - 0.00246272246272239*G0_0_1_1_1_0 - 0.517171717171714*G0_0_1_1_1_1 - 0.13052429052429*G0_0_1_1_1_2 + 0.0344781144781144*G0_0_1_1_2_0 - 0.13052429052429*G0_0_1_1_2_1 + 0.0147763347763349*G0_0_1_1_2_2 + 0.0467917267917265*G0_0_1_2_0_0 + 0.0344781144781144*G0_0_1_2_0_1 + 0.0541798941798939*G0_0_1_2_0_2 + 0.0344781144781144*G0_0_1_2_1_0 - 0.13052429052429*G0_0_1_2_1_1 + 0.0147763347763349*G0_0_1_2_1_2 + 0.0541798941798939*G0_0_1_2_2_0 + 0.0147763347763349*G0_0_1_2_2_1 + 0.147763347763347*G0_0_1_2_2_2 + 0.147763347763347*G0_1_0_0_0_0 + 0.0221645021645021*G0_1_0_0_0_1 + 0.0467917267917265*G0_1_0_0_0_2 + 0.0221645021645021*G0_1_0_0_1_0 - 0.00246272246272237*G0_1_0_0_1_1 + 0.0344781144781144*G0_1_0_0_1_2 + 0.0467917267917265*G0_1_0_0_2_0 + 0.0344781144781144*G0_1_0_0_2_1 + 0.0541798941798939*G0_1_0_0_2_2 + 0.0221645021645021*G0_1_0_1_0_0 - 0.00246272246272239*G0_1_0_1_0_1 + 0.0344781144781144*G0_1_0_1_0_2 - 0.00246272246272239*G0_1_0_1_1_0 - 0.517171717171714*G0_1_0_1_1_1 - 0.13052429052429*G0_1_0_1_1_2 + 0.0344781144781144*G0_1_0_1_2_0 - 0.13052429052429*G0_1_0_1_2_1 + 0.0147763347763349*G0_1_0_1_2_2 + 0.0467917267917265*G0_1_0_2_0_0 + 0.0344781144781144*G0_1_0_2_0_1 + 0.0541798941798939*G0_1_0_2_0_2 + 0.0344781144781144*G0_1_0_2_1_0 - 0.13052429052429*G0_1_0_2_1_1 + 0.0147763347763349*G0_1_0_2_1_2 + 0.0541798941798939*G0_1_0_2_2_0 + 0.0147763347763349*G0_1_0_2_2_1 + 0.147763347763347*G0_1_0_2_2_2 + 0.812698412698409*G0_1_1_0_0_0 + 0.167465127465127*G0_1_1_0_0_1 + 0.103434343434343*G0_1_1_0_0_2 + 0.167465127465127*G0_1_1_0_1_0 - 0.147763347763347*G0_1_1_0_1_1 + 0.0344781144781144*G0_1_1_0_1_2 + 0.103434343434343*G0_1_1_0_2_0 + 0.0344781144781143*G0_1_1_0_2_1 + 0.0788071188071185*G0_1_1_0_2_2 + 0.167465127465127*G0_1_1_1_0_0 - 0.147763347763347*G0_1_1_1_0_1 + 0.0344781144781144*G0_1_1_1_0_2 - 0.147763347763347*G0_1_1_1_1_0 - 1.18210678210678*G0_1_1_1_1_1 - 0.187166907166906*G0_1_1_1_1_2 + 0.0344781144781143*G0_1_1_1_2_0 - 0.187166907166906*G0_1_1_1_2_1 - 0.00985088985088972*G0_1_1_1_2_2 + 0.103434343434343*G0_1_1_2_0_0 + 0.0344781144781144*G0_1_1_2_0_1 + 0.0788071188071185*G0_1_1_2_0_2 + 0.0344781144781144*G0_1_1_2_1_0 - 0.187166907166906*G0_1_1_2_1_1 - 0.00985088985088969*G0_1_1_2_1_2 + 0.0788071188071185*G0_1_1_2_2_0 - 0.00985088985088967*G0_1_1_2_2_1 + 0.147763347763348*G0_1_1_2_2_2; + A[168] = -A[176] + 0.208613115279781*G0_0_0_0_0_0 + 0.0559243225909891*G0_0_0_0_0_1 + 0.0515119448452778*G0_0_0_0_0_2 + 0.0559243225909891*G0_0_0_0_1_0 + 0.0855111966223074*G0_0_0_0_1_1 + 0.0165891721447276*G0_0_0_0_1_2 + 0.0515119448452778*G0_0_0_0_2_0 + 0.0165891721447276*G0_0_0_0_2_1 + 0.0334861845972955*G0_0_0_0_2_2 + 0.0559243225909891*G0_0_0_1_0_0 + 0.0855111966223074*G0_0_0_1_0_1 + 0.0165891721447276*G0_0_0_1_0_2 + 0.0855111966223074*G0_0_0_1_1_0 + 0.539746673080005*G0_0_0_1_1_1 + 0.0294158516380738*G0_0_0_1_1_2 + 0.0165891721447276*G0_0_0_1_2_0 + 0.0294158516380738*G0_0_0_1_2_1 + 0.0104323659879215*G0_0_0_1_2_2 + 0.0515119448452778*G0_0_0_2_0_0 + 0.0165891721447276*G0_0_0_2_0_1 + 0.0334861845972955*G0_0_0_2_0_2 + 0.0165891721447276*G0_0_0_2_1_0 + 0.0294158516380738*G0_0_0_2_1_1 + 0.0104323659879215*G0_0_0_2_1_2 + 0.0334861845972955*G0_0_0_2_2_0 + 0.0104323659879215*G0_0_0_2_2_1 + 0.0463812730479394*G0_0_0_2_2_2 - 0.00769600769600779*G0_1_0_0_0_0 - 0.0123136123136122*G0_1_0_0_0_1 - 0.00256533589866923*G0_1_0_0_0_2 - 0.0123136123136122*G0_1_0_0_1_0 - 0.0266794933461598*G0_1_0_0_1_1 - 0.00615680615680612*G0_1_0_0_1_2 - 0.00256533589866923*G0_1_0_0_2_0 - 0.00615680615680612*G0_1_0_0_2_1 - 0.00256533589866921*G0_1_0_0_2_2 - 0.0123136123136122*G0_1_0_1_0_0 - 0.0266794933461598*G0_1_0_1_0_1 - 0.00615680615680612*G0_1_0_1_0_2 - 0.0266794933461598*G0_1_0_1_1_0 + 0.301683501683502*G0_1_0_1_1_1 - 0.0266794933461599*G0_1_0_1_1_2 - 0.00615680615680612*G0_1_0_1_2_0 - 0.0266794933461599*G0_1_0_1_2_1 - 0.0123136123136123*G0_1_0_1_2_2 - 0.00256533589866923*G0_1_0_2_0_0 - 0.00615680615680613*G0_1_0_2_0_1 - 0.00256533589866921*G0_1_0_2_0_2 - 0.00615680615680613*G0_1_0_2_1_0 - 0.0266794933461599*G0_1_0_2_1_1 - 0.0123136123136123*G0_1_0_2_1_2 - 0.00256533589866921*G0_1_0_2_2_0 - 0.0123136123136123*G0_1_0_2_2_1 - 0.00769600769600762*G0_1_0_2_2_2; + A[204] = A[148] + 0.0523328523328516*G0_0_1_0_0_0 - 0.0087221420554753*G0_0_1_0_0_1 + 0.00153920153920153*G0_0_1_0_0_2 - 0.0087221420554753*G0_0_1_0_1_0 - 0.0202148468815134*G0_0_1_0_1_1 - 0.000410453743787047*G0_0_1_0_1_2 + 0.00153920153920154*G0_0_1_0_2_0 - 0.000410453743787045*G0_0_1_0_2_1 + 0.00564373897707232*G0_0_1_0_2_2 - 0.0087221420554753*G0_0_1_1_0_0 - 0.0202148468815134*G0_0_1_1_0_1 - 0.000410453743787047*G0_0_1_1_0_2 - 0.0202148468815134*G0_0_1_1_1_0 - 0.0412506012506012*G0_0_1_1_1_1 + 0.00728555395222066*G0_0_1_1_1_2 - 0.000410453743787047*G0_0_1_1_2_0 + 0.00728555395222066*G0_0_1_1_2_1 + 0.00892736892736899*G0_0_1_1_2_2 + 0.00153920153920153*G0_0_1_2_0_0 - 0.000410453743787047*G0_0_1_2_0_1 + 0.00564373897707231*G0_0_1_2_0_2 - 0.000410453743787047*G0_0_1_2_1_0 + 0.00728555395222066*G0_0_1_2_1_1 + 0.00892736892736899*G0_0_1_2_1_2 + 0.00564373897707231*G0_0_1_2_2_0 + 0.00892736892736899*G0_0_1_2_2_1 + 0.008003848003848*G0_0_1_2_2_2 - 0.0523328523328516*G0_1_0_0_0_0 + 0.0087221420554753*G0_1_0_0_0_1 - 0.00153920153920153*G0_1_0_0_0_2 + 0.0087221420554753*G0_1_0_0_1_0 + 0.0202148468815134*G0_1_0_0_1_1 + 0.000410453743787046*G0_1_0_0_1_2 - 0.00153920153920154*G0_1_0_0_2_0 + 0.000410453743787045*G0_1_0_0_2_1 - 0.00564373897707231*G0_1_0_0_2_2 + 0.0087221420554753*G0_1_0_1_0_0 + 0.0202148468815134*G0_1_0_1_0_1 + 0.000410453743787046*G0_1_0_1_0_2 + 0.0202148468815134*G0_1_0_1_1_0 + 0.0412506012506013*G0_1_0_1_1_1 - 0.00728555395222066*G0_1_0_1_1_2 + 0.000410453743787046*G0_1_0_1_2_0 - 0.00728555395222066*G0_1_0_1_2_1 - 0.00892736892736899*G0_1_0_1_2_2 - 0.00153920153920153*G0_1_0_2_0_0 + 0.000410453743787049*G0_1_0_2_0_1 - 0.00564373897707231*G0_1_0_2_0_2 + 0.000410453743787048*G0_1_0_2_1_0 - 0.00728555395222066*G0_1_0_2_1_1 - 0.00892736892736899*G0_1_0_2_1_2 - 0.00564373897707231*G0_1_0_2_2_0 - 0.00892736892736899*G0_1_0_2_2_1 - 0.00800384800384801*G0_1_0_2_2_2; + A[18] = -A[26] - 0.044508577841911*G0_0_0_0_0_0 - 0.00696916252471807*G0_0_0_0_0_1 - 0.0148361926139703*G0_0_0_0_0_2 - 0.00696916252471807*G0_0_0_0_1_0 - 0.01000481000481*G0_0_0_0_1_1 - 0.00348458126235903*G0_0_0_0_1_2 - 0.0148361926139703*G0_0_0_0_2_0 - 0.00348458126235903*G0_0_0_0_2_1 - 0.0148361926139703*G0_0_0_0_2_2 - 0.00696916252471807*G0_0_0_1_0_0 - 0.01000481000481*G0_0_0_1_0_1 - 0.00348458126235903*G0_0_0_1_0_2 - 0.01000481000481*G0_0_0_1_1_0 - 0.224082090748757*G0_0_0_1_1_1 - 0.01000481000481*G0_0_0_1_1_2 - 0.00348458126235903*G0_0_0_1_2_0 - 0.01000481000481*G0_0_0_1_2_1 - 0.00696916252471806*G0_0_0_1_2_2 - 0.0148361926139703*G0_0_0_2_0_0 - 0.00348458126235903*G0_0_0_2_0_1 - 0.0148361926139703*G0_0_0_2_0_2 - 0.00348458126235903*G0_0_0_2_1_0 - 0.01000481000481*G0_0_0_2_1_1 - 0.00696916252471806*G0_0_0_2_1_2 - 0.0148361926139703*G0_0_0_2_2_0 - 0.00696916252471806*G0_0_0_2_2_1 - 0.0445085778419109*G0_0_0_2_2_2; + A[68] = -A[65] - 0.0088504088504085*G0_0_1_0_0_0 + 0.00115440115440127*G0_0_1_0_0_1 - 0.0092352092352092*G0_0_1_0_0_2 + 0.00115440115440127*G0_0_1_0_1_0 + 0.00525893859227204*G0_0_1_0_1_1 + 0.01333974667308*G0_0_1_0_1_2 - 0.00923520923520921*G0_0_1_0_2_0 + 0.01333974667308*G0_0_1_0_2_1 + 0.00718294051627376*G0_0_1_0_2_2 + 0.00115440115440127*G0_0_1_1_0_0 + 0.00525893859227204*G0_0_1_1_0_1 + 0.01333974667308*G0_0_1_1_0_2 + 0.00525893859227204*G0_0_1_1_1_0 + 0.0280904280904284*G0_0_1_1_1_1 + 0.0625941959275291*G0_0_1_1_1_2 + 0.01333974667308*G0_0_1_1_2_0 + 0.0625941959275291*G0_0_1_1_2_1 + 0.115953182619849*G0_0_1_1_2_2 - 0.00923520923520921*G0_0_1_2_0_0 + 0.01333974667308*G0_0_1_2_0_1 + 0.00718294051627376*G0_0_1_2_0_2 + 0.01333974667308*G0_0_1_2_1_0 + 0.0625941959275291*G0_0_1_2_1_1 + 0.115953182619849*G0_0_1_2_1_2 + 0.00718294051627376*G0_0_1_2_2_0 + 0.115953182619849*G0_0_1_2_2_1 + 0.469456469456466*G0_0_1_2_2_2 - 0.0134167067500396*G0_1_1_0_0_0 - 0.0249863716530381*G0_1_1_0_0_1 - 0.00900432900432897*G0_1_1_0_0_2 - 0.0249863716530381*G0_1_1_0_1_0 - 0.0615424082090746*G0_1_1_0_1_1 - 0.00715728715728712*G0_1_1_0_1_2 - 0.00900432900432897*G0_1_1_0_2_0 - 0.00715728715728712*G0_1_1_0_2_1 - 0.0148789482122816*G0_1_1_0_2_2 - 0.0249863716530381*G0_1_1_1_0_0 - 0.0615424082090746*G0_1_1_1_0_1 - 0.00715728715728712*G0_1_1_1_0_2 - 0.0615424082090746*G0_1_1_1_1_0 - 0.342421035754369*G0_1_1_1_1_1 - 0.015930735930736*G0_1_1_1_1_2 - 0.00715728715728712*G0_1_1_1_2_0 - 0.015930735930736*G0_1_1_1_2_1 + 0.0118005451338784*G0_1_1_1_2_2 - 0.00900432900432897*G0_1_1_2_0_0 - 0.00715728715728712*G0_1_1_2_0_1 - 0.0148789482122816*G0_1_1_2_0_2 - 0.00715728715728712*G0_1_1_2_1_0 - 0.015930735930736*G0_1_1_2_1_1 + 0.0118005451338784*G0_1_1_2_1_2 - 0.0148789482122816*G0_1_1_2_2_0 + 0.0118005451338784*G0_1_1_2_2_1 + 0.0143658810325472*G0_1_1_2_2_2; + A[169] = A[68] - 0.00779862113195439*G0_0_0_0_0_0 - 0.00595157928491258*G0_0_0_0_0_1 - 0.0201122334455667*G0_0_0_0_0_2 - 0.00595157928491258*G0_0_0_0_1_0 - 0.00674683341350001*G0_0_0_0_1_1 - 0.00253968253968252*G0_0_0_0_1_2 - 0.0201122334455667*G0_0_0_0_2_0 - 0.00253968253968252*G0_0_0_0_2_1 - 0.072162898829565*G0_0_0_0_2_2 - 0.00595157928491258*G0_0_0_1_0_0 - 0.00674683341350001*G0_0_0_1_0_1 - 0.00253968253968252*G0_0_0_1_0_2 - 0.00674683341350001*G0_0_0_1_1_0 + 0.0583100849767511*G0_0_0_1_1_1 + 0.0161616161616162*G0_0_0_1_1_2 - 0.00253968253968252*G0_0_0_1_2_0 + 0.0161616161616162*G0_0_0_1_2_1 + 0.0100817700817702*G0_0_0_1_2_2 - 0.0201122334455667*G0_0_0_2_0_0 - 0.00253968253968252*G0_0_0_2_0_1 - 0.072162898829565*G0_0_0_2_0_2 - 0.00253968253968252*G0_0_0_2_1_0 + 0.0161616161616162*G0_0_0_2_1_1 + 0.0100817700817702*G0_0_0_2_1_2 - 0.072162898829565*G0_0_0_2_2_0 + 0.0100817700817702*G0_0_0_2_2_1 - 0.628712522045849*G0_0_0_2_2_2 - 0.0113131313131313*G0_0_1_0_0_1 + 0.0113131313131313*G0_0_1_0_0_2 - 0.0113131313131313*G0_0_1_0_1_0 - 0.00731120731120726*G0_0_1_0_1_1 + 0.0113131313131313*G0_0_1_0_2_0 + 0.00731120731120741*G0_0_1_0_2_2 - 0.0113131313131313*G0_0_1_1_0_0 - 0.00731120731120726*G0_0_1_1_0_1 - 0.00731120731120726*G0_0_1_1_1_0 + 0.31022607022607*G0_0_1_1_1_1 + 0.000718294051627498*G0_0_1_1_1_2 + 0.000718294051627507*G0_0_1_1_2_1 - 0.000718294051627244*G0_0_1_1_2_2 + 0.0113131313131313*G0_0_1_2_0_0 + 0.00731120731120741*G0_0_1_2_0_2 + 0.000718294051627505*G0_0_1_2_1_1 - 0.000718294051627247*G0_0_1_2_1_2 + 0.00731120731120741*G0_0_1_2_2_0 - 0.000718294051627242*G0_0_1_2_2_1 - 0.310226070226067*G0_0_1_2_2_2 + 0.001667468334135*G0_1_0_0_0_1 - 0.00166746833413499*G0_1_0_0_0_2 + 0.001667468334135*G0_1_0_0_1_0 + 0.0118775052108385*G0_1_0_0_1_1 - 0.00166746833413499*G0_1_0_0_2_0 - 0.0118775052108385*G0_1_0_0_2_2 + 0.001667468334135*G0_1_0_1_0_0 + 0.0118775052108385*G0_1_0_1_0_1 + 0.0118775052108385*G0_1_0_1_1_0 + 0.127291967291966*G0_1_0_1_1_1 + 0.0109539842873176*G0_1_0_1_1_2 + 0.0109539842873176*G0_1_0_1_2_1 - 0.0109539842873174*G0_1_0_1_2_2 - 0.00166746833413499*G0_1_0_2_0_0 - 0.0118775052108385*G0_1_0_2_0_2 + 0.0109539842873176*G0_1_0_2_1_1 - 0.0109539842873174*G0_1_0_2_1_2 - 0.0118775052108385*G0_1_0_2_2_0 - 0.0109539842873174*G0_1_0_2_2_1 - 0.127291967291966*G0_1_0_2_2_2 + 0.00779862113195408*G0_1_1_0_0_0 + 0.0201122334455666*G0_1_1_0_0_1 + 0.00595157928491261*G0_1_1_0_0_2 + 0.0201122334455666*G0_1_1_0_1_0 + 0.0721628988295652*G0_1_1_0_1_1 + 0.00253968253968254*G0_1_1_0_1_2 + 0.00595157928491261*G0_1_1_0_2_0 + 0.00253968253968254*G0_1_1_0_2_1 + 0.00674683341350015*G0_1_1_0_2_2 + 0.0201122334455666*G0_1_1_1_0_0 + 0.0721628988295652*G0_1_1_1_0_1 + 0.00253968253968254*G0_1_1_1_0_2 + 0.0721628988295652*G0_1_1_1_1_0 + 0.628712522045854*G0_1_1_1_1_1 - 0.0100817700817699*G0_1_1_1_1_2 + 0.00253968253968254*G0_1_1_1_2_0 - 0.0100817700817699*G0_1_1_1_2_1 - 0.016161616161616*G0_1_1_1_2_2 + 0.00595157928491261*G0_1_1_2_0_0 + 0.00253968253968254*G0_1_1_2_0_1 + 0.00674683341350015*G0_1_1_2_0_2 + 0.00253968253968254*G0_1_1_2_1_0 - 0.0100817700817699*G0_1_1_2_1_1 - 0.016161616161616*G0_1_1_2_1_2 + 0.00674683341350015*G0_1_1_2_2_0 - 0.016161616161616*G0_1_1_2_2_1 - 0.0583100849767504*G0_1_1_2_2_2; + A[71] = A[169] + 0.00892736892736876*G0_0_1_0_0_0 + 0.0138784672118005*G0_0_1_0_0_1 + 0.000897867564534235*G0_0_1_0_0_2 + 0.0138784672118005*G0_0_1_0_1_0 + 0.0200096200096198*G0_0_1_0_1_1 + 0.000897867564534235*G0_0_1_0_2_0 + 0.000820907487574149*G0_0_1_0_2_2 + 0.0138784672118005*G0_0_1_1_0_0 + 0.0200096200096198*G0_0_1_1_0_1 + 0.0200096200096198*G0_0_1_1_1_0 - 0.174699374699376*G0_0_1_1_1_1 + 0.0135962802629468*G0_0_1_1_1_2 + 0.0135962802629468*G0_0_1_1_2_1 + 0.00336059002725664*G0_0_1_1_2_2 + 0.000897867564534235*G0_0_1_2_0_0 + 0.000820907487574149*G0_0_1_2_0_2 + 0.0135962802629468*G0_0_1_2_1_1 + 0.00336059002725664*G0_0_1_2_1_2 + 0.000820907487574149*G0_0_1_2_2_0 + 0.00336059002725664*G0_0_1_2_2_1 + 0.00823472823472806*G0_0_1_2_2_2 - 0.00892736892736876*G0_1_0_0_0_0 - 0.0138784672118005*G0_1_0_0_0_1 - 0.000897867564534235*G0_1_0_0_0_2 - 0.0138784672118005*G0_1_0_0_1_0 - 0.0200096200096198*G0_1_0_0_1_1 - 0.000897867564534235*G0_1_0_0_2_0 - 0.000820907487574149*G0_1_0_0_2_2 - 0.0138784672118005*G0_1_0_1_0_0 - 0.0200096200096198*G0_1_0_1_0_1 - 0.0200096200096198*G0_1_0_1_1_0 + 0.174699374699376*G0_1_0_1_1_1 - 0.0135962802629468*G0_1_0_1_1_2 - 0.0135962802629468*G0_1_0_1_2_1 - 0.00336059002725664*G0_1_0_1_2_2 - 0.000897867564534235*G0_1_0_2_0_0 - 0.000820907487574149*G0_1_0_2_0_2 - 0.0135962802629468*G0_1_0_2_1_1 - 0.00336059002725664*G0_1_0_2_1_2 - 0.000820907487574149*G0_1_0_2_2_0 - 0.00336059002725664*G0_1_0_2_2_1 - 0.00823472823472806*G0_1_0_2_2_2; + A[38] = -A[35] - 0.044508577841911*G0_1_1_0_0_0 - 0.0148361926139703*G0_1_1_0_0_1 - 0.00696916252471806*G0_1_1_0_0_2 - 0.0148361926139703*G0_1_1_0_1_0 - 0.0148361926139703*G0_1_1_0_1_1 - 0.00348458126235903*G0_1_1_0_1_2 - 0.00696916252471805*G0_1_1_0_2_0 - 0.00348458126235903*G0_1_1_0_2_1 - 0.01000481000481*G0_1_1_0_2_2 - 0.0148361926139703*G0_1_1_1_0_0 - 0.0148361926139703*G0_1_1_1_0_1 - 0.00348458126235903*G0_1_1_1_0_2 - 0.0148361926139703*G0_1_1_1_1_0 - 0.0445085778419112*G0_1_1_1_1_1 - 0.00696916252471806*G0_1_1_1_1_2 - 0.00348458126235903*G0_1_1_1_2_0 - 0.00696916252471806*G0_1_1_1_2_1 - 0.01000481000481*G0_1_1_1_2_2 - 0.00696916252471805*G0_1_1_2_0_0 - 0.00348458126235903*G0_1_1_2_0_1 - 0.01000481000481*G0_1_1_2_0_2 - 0.00348458126235903*G0_1_1_2_1_0 - 0.00696916252471806*G0_1_1_2_1_1 - 0.01000481000481*G0_1_1_2_1_2 - 0.01000481000481*G0_1_1_2_2_0 - 0.01000481000481*G0_1_1_2_2_1 - 0.224082090748756*G0_1_1_2_2_2; + A[116] = -A[108] - 0.0181882315215646*G0_0_0_0_0_0 + 0.001000481000481*G0_0_0_0_0_1 - 0.0347346480679812*G0_0_0_0_0_2 + 0.001000481000481*G0_0_0_0_1_0 + 0.00646464646464644*G0_0_0_0_1_1 + 0.00325797659130993*G0_0_0_0_1_2 - 0.0347346480679812*G0_0_0_0_2_0 + 0.00325797659130993*G0_0_0_0_2_1 - 0.048664421997755*G0_0_0_0_2_2 + 0.001000481000481*G0_0_0_1_0_0 + 0.00646464646464644*G0_0_0_1_0_1 + 0.00325797659130993*G0_0_0_1_0_2 + 0.00646464646464644*G0_0_0_1_1_0 + 0.0205226871893543*G0_0_0_1_1_1 + 0.00687510020843361*G0_0_0_1_1_2 + 0.00325797659130993*G0_0_0_1_2_0 + 0.00687510020843361*G0_0_0_1_2_1 - 0.00110309443642769*G0_0_0_1_2_2 - 0.0347346480679812*G0_0_0_2_0_0 + 0.00325797659130993*G0_0_0_2_0_1 - 0.048664421997755*G0_0_0_2_0_2 + 0.00325797659130993*G0_0_0_2_1_0 + 0.00687510020843361*G0_0_0_2_1_1 - 0.00110309443642769*G0_0_0_2_1_2 - 0.048664421997755*G0_0_0_2_2_0 - 0.00110309443642769*G0_0_0_2_2_1 - 0.0315023248356582*G0_0_0_2_2_2 + 0.0133140933140923*G0_1_0_0_0_0 + 0.00210357543690866*G0_1_0_0_0_1 + 0.0139297739297737*G0_1_0_0_0_2 + 0.00210357543690866*G0_1_0_0_1_0 - 0.000410453743787108*G0_1_0_0_1_1 + 0.0139297739297737*G0_1_0_0_2_0 - 0.0139297739297739*G0_1_0_0_2_2 + 0.00210357543690866*G0_1_0_1_0_0 - 0.000410453743787108*G0_1_0_1_0_1 - 0.000410453743787109*G0_1_0_1_1_0 + 0.000410453743787123*G0_1_0_1_1_2 + 0.000410453743787124*G0_1_0_1_2_1 - 0.0021035754369087*G0_1_0_1_2_2 + 0.0139297739297737*G0_1_0_2_0_0 - 0.0139297739297739*G0_1_0_2_0_2 + 0.000410453743787124*G0_1_0_2_1_1 - 0.0021035754369087*G0_1_0_2_1_2 - 0.0139297739297739*G0_1_0_2_2_0 - 0.0021035754369087*G0_1_0_2_2_1 - 0.0133140933140933*G0_1_0_2_2_2; + A[139] = A[116] + 0.0179316979316979*G0_0_0_0_0_0 + 0.00397627064293724*G0_0_0_0_0_1 + 0.0164694564694564*G0_0_0_0_0_2 + 0.00397627064293724*G0_0_0_0_1_0 - 0.00397627064293731*G0_0_0_0_1_1 + 0.0164694564694564*G0_0_0_0_2_0 + 0.0185217251883917*G0_0_0_0_2_2 + 0.00397627064293724*G0_0_0_1_0_0 - 0.00397627064293731*G0_0_0_1_0_1 - 0.00397627064293731*G0_0_0_1_1_0 - 0.0179316979316982*G0_0_0_1_1_1 - 0.0164694564694563*G0_0_0_1_1_2 - 0.0164694564694563*G0_0_0_1_2_1 - 0.0185217251883917*G0_0_0_1_2_2 + 0.0164694564694564*G0_0_0_2_0_0 + 0.0185217251883917*G0_0_0_2_0_2 - 0.0164694564694563*G0_0_0_2_1_1 - 0.0185217251883917*G0_0_0_2_1_2 + 0.0185217251883917*G0_0_0_2_2_0 - 0.0185217251883917*G0_0_0_2_2_1 + 0.0119288119288124*G0_0_1_0_0_0 + 0.00413019079685741*G0_0_1_0_0_1 - 0.00138528138528134*G0_0_1_0_0_2 + 0.00413019079685741*G0_0_1_0_1_0 - 0.00218053551386893*G0_0_1_0_1_1 + 0.00143658810325478*G0_0_1_0_1_2 - 0.00138528138528134*G0_0_1_0_2_0 + 0.00143658810325478*G0_0_1_0_2_1 - 0.00400192400192396*G0_0_1_0_2_2 + 0.00413019079685741*G0_0_1_1_0_0 - 0.00218053551386893*G0_0_1_1_0_1 + 0.00143658810325478*G0_0_1_1_0_2 - 0.00218053551386893*G0_0_1_1_1_0 - 0.00723424723424769*G0_0_1_1_1_1 - 0.0278338945005609*G0_0_1_1_1_2 + 0.00143658810325478*G0_0_1_1_2_0 - 0.0278338945005609*G0_0_1_1_2_1 - 0.0187526054192719*G0_0_1_1_2_2 - 0.00138528138528134*G0_0_1_2_0_0 + 0.00143658810325478*G0_0_1_2_0_1 - 0.00400192400192396*G0_0_1_2_0_2 + 0.00143658810325478*G0_0_1_2_1_0 - 0.0278338945005609*G0_0_1_2_1_1 - 0.0187526054192719*G0_0_1_2_1_2 - 0.00400192400192396*G0_0_1_2_2_0 - 0.0187526054192719*G0_0_1_2_2_1 - 0.0156228956228956*G0_0_1_2_2_2 + 0.0106974506974509*G0_1_0_0_0_0 + 0.00179573512906841*G0_1_0_0_0_1 - 0.0113644380311046*G0_1_0_0_0_2 + 0.00179573512906841*G0_1_0_0_1_0 + 0.000153920153920128*G0_1_0_0_1_1 + 0.00143658810325476*G0_1_0_0_1_2 - 0.0113644380311046*G0_1_0_0_2_0 + 0.00143658810325476*G0_1_0_0_2_1 - 0.000230880230880238*G0_1_0_0_2_2 + 0.00179573512906841*G0_1_0_1_0_0 + 0.000153920153920128*G0_1_0_1_0_1 + 0.00143658810325476*G0_1_0_1_0_2 + 0.000153920153920129*G0_1_0_1_1_0 - 0.0060028860028864*G0_1_0_1_1_1 - 0.0178547378547377*G0_1_0_1_1_2 + 0.00143658810325476*G0_1_0_1_2_0 - 0.0178547378547377*G0_1_0_1_2_1 - 0.0225236491903158*G0_1_0_1_2_2 - 0.0113644380311046*G0_1_0_2_0_0 + 0.00143658810325476*G0_1_0_2_0_1 - 0.000230880230880238*G0_1_0_2_0_2 + 0.00143658810325476*G0_1_0_2_1_0 - 0.0178547378547377*G0_1_0_2_1_1 - 0.0225236491903158*G0_1_0_2_1_2 - 0.00023088023088024*G0_1_0_2_2_0 - 0.0225236491903158*G0_1_0_2_2_1 - 0.0156228956228959*G0_1_0_2_2_2 + 0.0031553631553626*G0_1_1_0_0_0 + 0.0038993105659771*G0_1_1_0_0_1 + 0.00423280423280421*G0_1_1_0_0_2 + 0.0038993105659771*G0_1_1_0_1_0 - 0.00194965528298872*G0_1_1_0_1_1 + 0.00143658810325476*G0_1_1_0_1_2 + 0.00423280423280421*G0_1_1_0_2_0 + 0.00143658810325476*G0_1_1_0_2_1 - 0.000590027256693906*G0_1_1_0_2_2 + 0.0038993105659771*G0_1_1_1_0_0 - 0.00194965528298872*G0_1_1_1_0_1 + 0.00143658810325476*G0_1_1_1_0_2 - 0.00194965528298872*G0_1_1_1_1_0 + 0.00153920153920078*G0_1_1_1_1_1 - 0.0334519801186466*G0_1_1_1_1_2 + 0.00143658810325476*G0_1_1_1_2_0 - 0.0334519801186466*G0_1_1_1_2_1 - 0.0221645021645021*G0_1_1_1_2_2 + 0.00423280423280421*G0_1_1_2_0_0 + 0.00143658810325476*G0_1_1_2_0_1 - 0.000590027256693906*G0_1_1_2_0_2 + 0.00143658810325476*G0_1_1_2_1_0 - 0.0334519801186466*G0_1_1_2_1_1 - 0.0221645021645021*G0_1_1_2_1_2 - 0.000590027256693906*G0_1_1_2_2_0 - 0.0221645021645021*G0_1_1_2_2_1 - 0.0156228956228956*G0_1_1_2_2_2; + A[55] = A[153] + 0.00823472823472834*G0_0_1_0_0_0 + 0.00336059002725669*G0_0_1_0_0_1 + 0.000820907487574192*G0_0_1_0_0_2 + 0.00336059002725669*G0_0_1_0_1_0 + 0.0135962802629468*G0_0_1_0_1_1 + 0.000820907487574192*G0_0_1_0_2_0 + 0.000897867564534264*G0_0_1_0_2_2 + 0.00336059002725669*G0_0_1_1_0_0 + 0.0135962802629468*G0_0_1_1_0_1 + 0.0135962802629468*G0_0_1_1_1_0 - 0.174699374699375*G0_0_1_1_1_1 + 0.0200096200096198*G0_0_1_1_1_2 + 0.0200096200096198*G0_0_1_1_2_1 + 0.0138784672118005*G0_0_1_1_2_2 + 0.000820907487574192*G0_0_1_2_0_0 + 0.000897867564534264*G0_0_1_2_0_2 + 0.0200096200096198*G0_0_1_2_1_1 + 0.0138784672118004*G0_0_1_2_1_2 + 0.000897867564534264*G0_0_1_2_2_0 + 0.0138784672118005*G0_0_1_2_2_1 + 0.00892736892736895*G0_0_1_2_2_2 - 0.00823472823472834*G0_1_0_0_0_0 - 0.00336059002725669*G0_1_0_0_0_1 - 0.000820907487574192*G0_1_0_0_0_2 - 0.00336059002725669*G0_1_0_0_1_0 - 0.0135962802629468*G0_1_0_0_1_1 - 0.000820907487574192*G0_1_0_0_2_0 - 0.000897867564534264*G0_1_0_0_2_2 - 0.00336059002725669*G0_1_0_1_0_0 - 0.0135962802629468*G0_1_0_1_0_1 - 0.0135962802629468*G0_1_0_1_1_0 + 0.174699374699375*G0_1_0_1_1_1 - 0.0200096200096198*G0_1_0_1_1_2 - 0.0200096200096198*G0_1_0_1_2_1 - 0.0138784672118004*G0_1_0_1_2_2 - 0.000820907487574192*G0_1_0_2_0_0 - 0.000897867564534263*G0_1_0_2_0_2 - 0.0200096200096198*G0_1_0_2_1_1 - 0.0138784672118004*G0_1_0_2_1_2 - 0.000897867564534263*G0_1_0_2_2_0 - 0.0138784672118004*G0_1_0_2_2_1 - 0.00892736892736895*G0_1_0_2_2_2; + A[175] = -A[55] - 0.370511463844796*G0_0_0_0_0_0 - 0.0785249318582649*G0_0_0_0_0_1 - 0.0668013468013464*G0_0_0_0_0_2 - 0.0785249318582649*G0_0_0_0_1_0 - 0.10415263748597*G0_0_0_0_1_1 - 0.0204970338303671*G0_0_0_0_1_2 - 0.0668013468013464*G0_0_0_0_2_0 - 0.0204970338303671*G0_0_0_0_2_1 - 0.0261407728074393*G0_0_0_0_2_2 - 0.0785249318582649*G0_0_0_1_0_0 - 0.10415263748597*G0_0_0_1_0_1 - 0.0204970338303671*G0_0_0_1_0_2 - 0.10415263748597*G0_0_0_1_1_0 - 0.45509058842392*G0_0_0_1_1_1 - 0.0220618887285553*G0_0_0_1_1_2 - 0.0204970338303671*G0_0_0_1_2_0 - 0.0220618887285553*G0_0_0_1_2_1 + 0.000230880230880212*G0_0_0_1_2_2 - 0.0668013468013464*G0_0_0_2_0_0 - 0.0204970338303671*G0_0_0_2_0_1 - 0.0261407728074393*G0_0_0_2_0_2 - 0.0204970338303671*G0_0_0_2_1_0 - 0.0220618887285553*G0_0_0_2_1_1 + 0.000230880230880214*G0_0_0_2_1_2 - 0.0261407728074393*G0_0_0_2_2_0 + 0.000230880230880214*G0_0_0_2_2_1 - 0.00456629789963131*G0_0_0_2_2_2 - 0.028090428090428*G0_0_1_0_0_0 - 0.062594195927529*G0_0_1_0_0_1 - 0.00525893859227187*G0_0_1_0_0_2 - 0.062594195927529*G0_0_1_0_1_0 - 0.115953182619849*G0_0_1_0_1_1 - 0.01333974667308*G0_0_1_0_1_2 - 0.00525893859227188*G0_0_1_0_2_0 - 0.01333974667308*G0_0_1_0_2_1 - 0.00115440115440111*G0_0_1_0_2_2 - 0.062594195927529*G0_0_1_1_0_0 - 0.115953182619849*G0_0_1_1_0_1 - 0.01333974667308*G0_0_1_1_0_2 - 0.115953182619849*G0_0_1_1_1_0 - 0.469456469456468*G0_0_1_1_1_1 - 0.00718294051627383*G0_0_1_1_1_2 - 0.01333974667308*G0_0_1_1_2_0 - 0.00718294051627383*G0_0_1_1_2_1 + 0.00923520923520917*G0_0_1_1_2_2 - 0.00525893859227187*G0_0_1_2_0_0 - 0.01333974667308*G0_0_1_2_0_1 - 0.00115440115440111*G0_0_1_2_0_2 - 0.01333974667308*G0_0_1_2_1_0 - 0.00718294051627384*G0_0_1_2_1_1 + 0.00923520923520917*G0_0_1_2_1_2 - 0.00115440115440111*G0_0_1_2_2_0 + 0.00923520923520917*G0_0_1_2_2_1 + 0.00885040885040889*G0_0_1_2_2_2; + A[29] = A[27] + 0.0514862914862912*G0_0_0_0_0_0 + 0.000230880230880212*G0_0_0_0_0_1 + 0.0103639570306236*G0_0_0_0_0_2 + 0.000230880230880212*G0_0_0_0_1_0 + 0.000949174282507604*G0_0_0_0_1_2 + 0.0103639570306236*G0_0_0_0_2_0 + 0.000949174282507604*G0_0_0_0_2_1 - 0.00679814013147344*G0_0_0_0_2_2 + 0.000230880230880211*G0_0_0_1_0_0 + 0.000949174282507604*G0_0_0_1_0_2 + 0.000949174282507604*G0_0_0_1_2_0 - 0.00212922879589542*G0_0_0_1_2_2 + 0.0103639570306236*G0_0_0_2_0_0 + 0.000949174282507604*G0_0_0_2_0_1 - 0.00679814013147344*G0_0_0_2_0_2 + 0.000949174282507604*G0_0_0_2_1_0 - 0.00212922879589542*G0_0_0_2_1_2 - 0.00679814013147344*G0_0_0_2_2_0 - 0.00212922879589542*G0_0_0_2_2_1 - 0.0621837421837417*G0_0_0_2_2_2 - 0.0106974506974505*G0_0_1_0_0_0 - 0.00189834856501521*G0_0_1_0_0_1 + 0.00356581689915023*G0_0_1_0_0_2 - 0.00189834856501521*G0_0_1_0_1_0 + 0.00189834856501521*G0_0_1_0_1_2 + 0.00356581689915023*G0_0_1_0_2_0 + 0.00189834856501521*G0_0_1_0_2_1 + 0.00356581689915022*G0_0_1_0_2_2 - 0.00189834856501521*G0_0_1_1_0_0 + 0.00189834856501522*G0_0_1_1_0_2 + 0.00189834856501522*G0_0_1_1_2_0 - 0.00189834856501519*G0_0_1_1_2_2 + 0.00356581689915023*G0_0_1_2_0_0 + 0.00189834856501521*G0_0_1_2_0_1 + 0.00356581689915022*G0_0_1_2_0_2 + 0.00189834856501521*G0_0_1_2_1_0 - 0.00189834856501519*G0_0_1_2_1_2 + 0.00356581689915022*G0_0_1_2_2_0 - 0.0018983485650152*G0_0_1_2_2_1 - 0.0106974506974506*G0_0_1_2_2_2; + A[43] = A[42] - 0.0106974506974505*G0_1_0_0_0_0 + 0.00356581689915021*G0_1_0_0_0_1 - 0.00189834856501519*G0_1_0_0_0_2 + 0.00356581689915021*G0_1_0_0_1_0 + 0.0035658168991502*G0_1_0_0_1_1 + 0.0018983485650152*G0_1_0_0_1_2 - 0.00189834856501519*G0_1_0_0_2_0 + 0.0018983485650152*G0_1_0_0_2_1 + 0.00356581689915021*G0_1_0_1_0_0 + 0.0035658168991502*G0_1_0_1_0_1 + 0.0018983485650152*G0_1_0_1_0_2 + 0.0035658168991502*G0_1_0_1_1_0 - 0.0106974506974506*G0_1_0_1_1_1 - 0.00189834856501529*G0_1_0_1_1_2 + 0.0018983485650152*G0_1_0_1_2_0 - 0.00189834856501529*G0_1_0_1_2_1 - 0.00189834856501519*G0_1_0_2_0_0 + 0.0018983485650152*G0_1_0_2_0_1 + 0.0018983485650152*G0_1_0_2_1_0 - 0.00189834856501529*G0_1_0_2_1_1 + 0.0514862914862912*G0_1_1_0_0_0 + 0.0103639570306236*G0_1_1_0_0_1 + 0.000230880230880213*G0_1_1_0_0_2 + 0.0103639570306236*G0_1_1_0_1_0 - 0.00679814013147348*G0_1_1_0_1_1 + 0.000949174282507595*G0_1_1_0_1_2 + 0.000230880230880212*G0_1_1_0_2_0 + 0.000949174282507595*G0_1_1_0_2_1 + 0.0103639570306236*G0_1_1_1_0_0 - 0.00679814013147348*G0_1_1_1_0_1 + 0.000949174282507595*G0_1_1_1_0_2 - 0.00679814013147348*G0_1_1_1_1_0 - 0.0621837421837421*G0_1_1_1_1_1 - 0.00212922879589553*G0_1_1_1_1_2 + 0.000949174282507595*G0_1_1_1_2_0 - 0.00212922879589553*G0_1_1_1_2_1 + 0.000230880230880212*G0_1_1_2_0_0 + 0.000949174282507595*G0_1_1_2_0_1 + 0.000949174282507595*G0_1_1_2_1_0 - 0.00212922879589553*G0_1_1_2_1_1; + A[183] = -A[191] + 0.30866121532788*G0_0_0_0_0_0 - 0.008003848003848*G0_0_0_0_0_1 + 0.114721821388487*G0_0_0_0_0_2 - 0.008003848003848*G0_0_0_0_1_0 - 0.0391983325316657*G0_0_0_0_1_1 + 0.0043097643097643*G0_0_0_0_1_2 + 0.114721821388487*G0_0_0_0_2_0 + 0.0043097643097643*G0_0_0_0_2_1 + 0.0728555395222058*G0_0_0_0_2_2 - 0.008003848003848*G0_0_0_1_0_0 - 0.0391983325316657*G0_0_0_1_0_1 + 0.0043097643097643*G0_0_0_1_0_2 - 0.0391983325316657*G0_0_0_1_1_0 - 0.0348885682219018*G0_0_0_1_1_1 + 0.0289369889369888*G0_0_0_1_1_2 + 0.0043097643097643*G0_0_0_1_2_0 + 0.0289369889369888*G0_0_0_1_2_1 + 0.0322206188872854*G0_0_0_1_2_2 + 0.114721821388487*G0_0_0_2_0_0 + 0.0043097643097643*G0_0_0_2_0_1 + 0.0728555395222058*G0_0_0_2_0_2 + 0.0043097643097643*G0_0_0_2_1_0 + 0.0289369889369888*G0_0_0_2_1_1 + 0.0322206188872855*G0_0_0_2_1_2 + 0.0728555395222058*G0_0_0_2_2_0 + 0.0322206188872854*G0_0_0_2_2_1 + 0.0439185505852173*G0_0_0_2_2_2 - 0.0652621452621445*G0_1_0_0_0_0 - 0.0250376783710115*G0_1_0_0_0_1 + 0.00451499118165792*G0_1_0_0_0_2 - 0.0250376783710115*G0_1_0_0_1_0 - 0.0205226871893537*G0_1_0_0_1_1 + 0.000410453743787109*G0_1_0_0_1_2 + 0.00451499118165792*G0_1_0_0_2_0 + 0.000410453743787108*G0_1_0_0_2_1 + 0.0131345198011865*G0_1_0_0_2_2 - 0.0250376783710115*G0_1_0_1_0_0 - 0.0205226871893537*G0_1_0_1_0_1 + 0.000410453743787108*G0_1_0_1_0_2 - 0.0205226871893537*G0_1_0_1_1_0 + 0.0205226871893538*G0_1_0_1_1_2 + 0.000410453743787108*G0_1_0_1_2_0 + 0.0205226871893538*G0_1_0_1_2_1 + 0.0242167708834375*G0_1_0_1_2_2 + 0.00451499118165792*G0_1_0_2_0_0 + 0.000410453743787106*G0_1_0_2_0_1 + 0.0131345198011865*G0_1_0_2_0_2 + 0.000410453743787107*G0_1_0_2_1_0 + 0.0205226871893538*G0_1_0_2_1_1 + 0.0242167708834375*G0_1_0_2_1_2 + 0.0131345198011865*G0_1_0_2_2_0 + 0.0242167708834375*G0_1_0_2_2_1 + 0.0123136123136123*G0_1_0_2_2_2; + A[57] = A[183] - 0.024011544011544*G0_0_1_0_0_0 - 0.00482283148949816*G0_0_1_0_0_1 - 0.00277056277056278*G0_0_1_0_0_2 - 0.00482283148949816*G0_0_1_0_1_0 - 0.0118005451338784*G0_0_1_0_1_1 + 0.000820907487574146*G0_0_1_0_1_2 - 0.00277056277056278*G0_0_1_0_2_0 + 0.000820907487574145*G0_0_1_0_2_1 + 0.00420715087381752*G0_0_1_0_2_2 - 0.00482283148949816*G0_0_1_1_0_0 - 0.0118005451338784*G0_0_1_1_0_1 + 0.000820907487574146*G0_0_1_1_0_2 - 0.0118005451338784*G0_0_1_1_1_0 - 0.0523328523328524*G0_0_1_1_1_1 + 0.0189834856501523*G0_0_1_1_1_2 + 0.000820907487574146*G0_0_1_1_2_0 + 0.0189834856501523*G0_0_1_1_2_1 + 0.0185730319063652*G0_0_1_1_2_2 - 0.00277056277056278*G0_0_1_2_0_0 + 0.000820907487574146*G0_0_1_2_0_1 + 0.00420715087381751*G0_0_1_2_0_2 + 0.000820907487574148*G0_0_1_2_1_0 + 0.0189834856501523*G0_0_1_2_1_1 + 0.0185730319063652*G0_0_1_2_1_2 + 0.00420715087381751*G0_0_1_2_2_0 + 0.0185730319063652*G0_0_1_2_2_1 + 0.00430976430976429*G0_0_1_2_2_2 + 0.024011544011544*G0_1_0_0_0_0 + 0.00482283148949816*G0_1_0_0_0_1 + 0.00277056277056278*G0_1_0_0_0_2 + 0.00482283148949816*G0_1_0_0_1_0 + 0.0118005451338784*G0_1_0_0_1_1 - 0.000820907487574147*G0_1_0_0_1_2 + 0.00277056277056278*G0_1_0_0_2_0 - 0.000820907487574147*G0_1_0_0_2_1 - 0.00420715087381752*G0_1_0_0_2_2 + 0.00482283148949816*G0_1_0_1_0_0 + 0.0118005451338784*G0_1_0_1_0_1 - 0.000820907487574147*G0_1_0_1_0_2 + 0.0118005451338784*G0_1_0_1_1_0 + 0.0523328523328524*G0_1_0_1_1_1 - 0.0189834856501522*G0_1_0_1_1_2 - 0.000820907487574148*G0_1_0_1_2_0 - 0.0189834856501523*G0_1_0_1_2_1 - 0.0185730319063652*G0_1_0_1_2_2 + 0.00277056277056278*G0_1_0_2_0_0 - 0.000820907487574146*G0_1_0_2_0_1 - 0.00420715087381751*G0_1_0_2_0_2 - 0.000820907487574147*G0_1_0_2_1_0 - 0.0189834856501522*G0_1_0_2_1_1 - 0.0185730319063652*G0_1_0_2_1_2 - 0.00420715087381751*G0_1_0_2_2_0 - 0.0185730319063652*G0_1_0_2_2_1 - 0.00430976430976427*G0_1_0_2_2_2; + A[213] = -A[183] + 0.105281385281385*G0_0_0_0_0_0 + 0.00348885682219015*G0_0_0_0_0_1 + 0.0808593875260537*G0_0_0_0_0_2 + 0.00348885682219015*G0_0_0_0_1_0 + 0.000615680615680611*G0_0_0_0_1_1 + 0.00944043610710275*G0_0_0_0_1_2 + 0.0808593875260537*G0_0_0_0_2_0 + 0.00944043610710275*G0_0_0_0_2_1 + 0.112874779541446*G0_0_0_0_2_2 + 0.00348885682219015*G0_0_0_1_0_0 + 0.00061568061568061*G0_0_0_1_0_1 + 0.00944043610710275*G0_0_0_1_0_2 + 0.000615680615680608*G0_0_0_1_1_0 + 0.212409812409811*G0_0_0_1_1_1 + 0.0578739778739775*G0_0_0_1_1_2 + 0.00944043610710275*G0_0_0_1_2_0 + 0.0578739778739775*G0_0_0_1_2_1 + 0.054590347923681*G0_0_0_1_2_2 + 0.0808593875260537*G0_0_0_2_0_0 + 0.00944043610710275*G0_0_0_2_0_1 + 0.112874779541446*G0_0_0_2_0_2 + 0.00944043610710275*G0_0_0_2_1_0 + 0.0578739778739776*G0_0_0_2_1_1 + 0.054590347923681*G0_0_0_2_1_2 + 0.112874779541446*G0_0_0_2_2_0 + 0.054590347923681*G0_0_0_2_2_1 + 0.320153920153918*G0_0_0_2_2_2 + 0.0244219977553311*G0_0_1_0_0_0 + 0.00451499118165787*G0_0_1_0_0_1 + 0.0116979316979317*G0_0_1_0_0_2 + 0.00451499118165787*G0_0_1_0_1_0 + 0.01333974667308*G0_0_1_0_1_1 + 0.0047202180535514*G0_0_1_0_1_2 + 0.0116979316979317*G0_0_1_0_2_0 + 0.0047202180535514*G0_0_1_0_2_1 + 0.010671797338464*G0_0_1_0_2_2 + 0.00451499118165787*G0_0_1_1_0_0 + 0.01333974667308*G0_0_1_1_0_1 + 0.0047202180535514*G0_0_1_1_0_2 + 0.01333974667308*G0_0_1_1_1_0 + 0.299631232964566*G0_0_1_1_1_1 + 0.0482283148949814*G0_0_1_1_1_2 + 0.0047202180535514*G0_0_1_1_2_0 + 0.0482283148949814*G0_0_1_1_2_1 + 0.0147763347763348*G0_0_1_1_2_2 + 0.0116979316979317*G0_0_1_2_0_0 + 0.0047202180535514*G0_0_1_2_0_1 + 0.010671797338464*G0_0_1_2_0_2 + 0.0047202180535514*G0_0_1_2_1_0 + 0.0482283148949814*G0_0_1_2_1_1 + 0.0147763347763348*G0_0_1_2_1_2 + 0.010671797338464*G0_0_1_2_2_0 + 0.0147763347763348*G0_0_1_2_2_1 + 0.0151867885201219*G0_0_1_2_2_2 - 0.00759339426006088*G0_1_0_0_0_0 - 0.00595157928491258*G0_1_0_0_0_1 - 0.00595157928491258*G0_1_0_0_1_0 + 0.00595157928491262*G0_1_0_0_1_2 + 0.00595157928491262*G0_1_0_0_2_1 + 0.00759339426006095*G0_1_0_0_2_2 - 0.00595157928491258*G0_1_0_1_0_0 + 0.00595157928491262*G0_1_0_1_0_2 + 0.194965528298861*G0_1_0_1_1_1 + 0.075933942600609*G0_1_0_1_1_2 + 0.00595157928491262*G0_1_0_1_2_0 + 0.075933942600609*G0_1_0_1_2_1 + 0.0535642135642134*G0_1_0_1_2_2 + 0.00595157928491262*G0_1_0_2_0_1 + 0.00759339426006094*G0_1_0_2_0_2 + 0.00595157928491262*G0_1_0_2_1_0 + 0.075933942600609*G0_1_0_2_1_1 + 0.0535642135642134*G0_1_0_2_1_2 + 0.00759339426006095*G0_1_0_2_2_0 + 0.0535642135642134*G0_1_0_2_2_1 + 0.0607471540804874*G0_1_0_2_2_2 + 0.00923520923520923*G0_1_1_0_0_0 - 0.0102613435946769*G0_1_1_0_0_1 + 0.00102613435946769*G0_1_1_0_0_2 - 0.0102613435946769*G0_1_1_0_1_0 - 0.0348885682219013*G0_1_1_0_1_1 + 0.00102613435946769*G0_1_1_0_2_0 - 0.00102613435946767*G0_1_1_0_2_2 - 0.0102613435946769*G0_1_1_1_0_0 - 0.0348885682219013*G0_1_1_1_0_1 - 0.0348885682219013*G0_1_1_1_1_0 + 0.0348885682219015*G0_1_1_1_1_2 + 0.0348885682219015*G0_1_1_1_2_1 + 0.0102613435946769*G0_1_1_1_2_2 + 0.00102613435946769*G0_1_1_2_0_0 - 0.00102613435946767*G0_1_1_2_0_2 + 0.0348885682219015*G0_1_1_2_1_1 + 0.0102613435946769*G0_1_1_2_1_2 - 0.00102613435946767*G0_1_1_2_2_0 + 0.0102613435946769*G0_1_1_2_2_1 - 0.00923520923520895*G0_1_1_2_2_2; + A[119] = A[205] - 0.385569985569984*G0_0_0_0_0_0 - 0.0551034151034148*G0_0_0_0_0_1 - 0.209485329485329*G0_0_0_0_0_2 - 0.0551034151034148*G0_0_0_0_1_0 - 0.00631072631072628*G0_0_0_0_1_1 - 0.0300144300144299*G0_0_0_0_1_2 - 0.209485329485329*G0_0_0_0_2_0 - 0.0300144300144299*G0_0_0_0_2_1 - 0.254891774891774*G0_0_0_0_2_2 - 0.0551034151034148*G0_0_0_1_0_0 - 0.00631072631072628*G0_0_0_1_0_1 - 0.0300144300144299*G0_0_0_1_0_2 - 0.00631072631072628*G0_0_0_1_1_0 + 0.369408369408367*G0_0_0_1_1_1 + 0.0432515632515628*G0_0_0_1_1_2 - 0.0300144300144299*G0_0_0_1_2_0 + 0.0432515632515628*G0_0_0_1_2_1 - 0.108051948051948*G0_0_0_1_2_2 - 0.209485329485329*G0_0_0_2_0_0 - 0.0300144300144299*G0_0_0_2_0_1 - 0.254891774891774*G0_0_0_2_0_2 - 0.0300144300144299*G0_0_0_2_1_0 + 0.0432515632515628*G0_0_0_2_1_1 - 0.108051948051948*G0_0_0_2_1_2 - 0.254891774891774*G0_0_0_2_2_0 - 0.108051948051948*G0_0_0_2_2_1 - 0.774834054834053*G0_0_0_2_2_2 + 0.0210101010101009*G0_0_1_0_0_1 - 0.0210101010101008*G0_0_1_0_0_2 + 0.0210101010101009*G0_0_1_0_1_0 + 0.0467147667147665*G0_0_1_0_1_1 - 0.0210101010101008*G0_0_1_0_2_0 - 0.0467147667147664*G0_0_1_0_2_2 + 0.0210101010101009*G0_0_1_1_0_0 + 0.0467147667147665*G0_0_1_1_0_1 + 0.0467147667147665*G0_0_1_1_1_0 + 0.500086580086577*G0_0_1_1_1_1 + 0.0796536796536791*G0_0_1_1_1_2 + 0.0796536796536791*G0_0_1_1_2_1 - 0.0796536796536794*G0_0_1_1_2_2 - 0.0210101010101008*G0_0_1_2_0_0 - 0.0467147667147664*G0_0_1_2_0_2 + 0.0796536796536791*G0_0_1_2_1_1 - 0.0796536796536794*G0_0_1_2_1_2 - 0.0467147667147664*G0_0_1_2_2_0 - 0.0796536796536794*G0_0_1_2_2_1 - 0.500086580086577*G0_0_1_2_2_2 + 0.0431746031746032*G0_1_0_0_0_1 - 0.0431746031746031*G0_1_0_0_0_2 + 0.0431746031746032*G0_1_0_0_1_0 + 0.129523809523809*G0_1_0_0_1_1 - 0.0431746031746031*G0_1_0_0_2_0 - 0.129523809523809*G0_1_0_0_2_2 + 0.0431746031746032*G0_1_0_1_0_0 + 0.129523809523809*G0_1_0_1_0_1 + 0.129523809523809*G0_1_0_1_1_0 + 0.639999999999997*G0_1_0_1_1_1 + 0.0736507936507932*G0_1_0_1_1_2 + 0.0736507936507932*G0_1_0_1_2_1 - 0.0736507936507935*G0_1_0_1_2_2 - 0.0431746031746031*G0_1_0_2_0_0 - 0.129523809523809*G0_1_0_2_0_2 + 0.0736507936507932*G0_1_0_2_1_1 - 0.0736507936507935*G0_1_0_2_1_2 - 0.129523809523809*G0_1_0_2_2_0 - 0.0736507936507935*G0_1_0_2_2_1 - 0.639999999999998*G0_1_0_2_2_2 + 0.385569985569984*G0_1_1_0_0_0 + 0.209485329485329*G0_1_1_0_0_1 + 0.0551034151034149*G0_1_1_0_0_2 + 0.209485329485329*G0_1_1_0_1_0 + 0.254891774891774*G0_1_1_0_1_1 + 0.0300144300144299*G0_1_1_0_1_2 + 0.0551034151034149*G0_1_1_0_2_0 + 0.0300144300144299*G0_1_1_0_2_1 + 0.00631072631072625*G0_1_1_0_2_2 + 0.209485329485329*G0_1_1_1_0_0 + 0.254891774891774*G0_1_1_1_0_1 + 0.0300144300144299*G0_1_1_1_0_2 + 0.254891774891774*G0_1_1_1_1_0 + 0.774834054834051*G0_1_1_1_1_1 + 0.108051948051947*G0_1_1_1_1_2 + 0.0300144300144299*G0_1_1_1_2_0 + 0.108051948051947*G0_1_1_1_2_1 - 0.043251563251563*G0_1_1_1_2_2 + 0.0551034151034149*G0_1_1_2_0_0 + 0.0300144300144299*G0_1_1_2_0_1 + 0.00631072631072625*G0_1_1_2_0_2 + 0.0300144300144299*G0_1_1_2_1_0 + 0.108051948051947*G0_1_1_2_1_1 - 0.0432515632515631*G0_1_1_2_1_2 + 0.00631072631072625*G0_1_1_2_2_0 - 0.0432515632515631*G0_1_1_2_2_1 - 0.369408369408367*G0_1_1_2_2_2; + A[197] = A[182] - 0.0106974506974505*G0_0_1_0_0_0 + 0.00356581689915021*G0_0_1_0_0_1 - 0.00189834856501519*G0_0_1_0_0_2 + 0.00356581689915021*G0_0_1_0_1_0 + 0.0035658168991502*G0_0_1_0_1_1 + 0.0018983485650152*G0_0_1_0_1_2 - 0.00189834856501519*G0_0_1_0_2_0 + 0.0018983485650152*G0_0_1_0_2_1 + 0.00356581689915021*G0_0_1_1_0_0 + 0.0035658168991502*G0_0_1_1_0_1 + 0.0018983485650152*G0_0_1_1_0_2 + 0.0035658168991502*G0_0_1_1_1_0 - 0.0106974506974506*G0_0_1_1_1_1 - 0.0018983485650153*G0_0_1_1_1_2 + 0.0018983485650152*G0_0_1_1_2_0 - 0.0018983485650153*G0_0_1_1_2_1 - 0.00189834856501519*G0_0_1_2_0_0 + 0.0018983485650152*G0_0_1_2_0_1 + 0.0018983485650152*G0_0_1_2_1_0 - 0.0018983485650153*G0_0_1_2_1_1 + 0.0514862914862912*G0_1_1_0_0_0 + 0.0103639570306236*G0_1_1_0_0_1 + 0.000230880230880213*G0_1_1_0_0_2 + 0.0103639570306236*G0_1_1_0_1_0 - 0.00679814013147348*G0_1_1_0_1_1 + 0.000949174282507595*G0_1_1_0_1_2 + 0.000230880230880212*G0_1_1_0_2_0 + 0.000949174282507595*G0_1_1_0_2_1 + 0.0103639570306236*G0_1_1_1_0_0 - 0.00679814013147348*G0_1_1_1_0_1 + 0.000949174282507595*G0_1_1_1_0_2 - 0.00679814013147348*G0_1_1_1_1_0 - 0.0621837421837421*G0_1_1_1_1_1 - 0.00212922879589553*G0_1_1_1_1_2 + 0.000949174282507595*G0_1_1_1_2_0 - 0.00212922879589553*G0_1_1_1_2_1 + 0.000230880230880211*G0_1_1_2_0_0 + 0.000949174282507595*G0_1_1_2_0_1 + 0.000949174282507595*G0_1_1_2_1_0 - 0.00212922879589553*G0_1_1_2_1_1; + A[19] = -A[25] + 0.0659291325957991*G0_0_0_0_0_0 + 0.00727914061247393*G0_0_0_0_0_1 + 0.015751162417829*G0_0_0_0_0_2 + 0.00727914061247393*G0_0_0_0_1_0 + 0.00224466891133562*G0_0_0_0_1_1 + 0.00299823633156966*G0_0_0_0_1_2 + 0.015751162417829*G0_0_0_0_2_0 + 0.00299823633156966*G0_0_0_0_2_1 + 0.0155715889049221*G0_0_0_0_2_2 + 0.00727914061247393*G0_0_0_1_0_0 + 0.00224466891133562*G0_0_0_1_0_1 + 0.00299823633156966*G0_0_0_1_0_2 + 0.00224466891133562*G0_0_0_1_1_0 + 0.181080647747314*G0_0_0_1_1_1 + 0.0131473464806798*G0_0_0_1_1_2 + 0.00299823633156966*G0_0_0_1_2_0 + 0.0131473464806798*G0_0_0_1_2_1 + 0.00625300625300621*G0_0_0_1_2_2 + 0.015751162417829*G0_0_0_2_0_0 + 0.00299823633156966*G0_0_0_2_0_1 + 0.0155715889049221*G0_0_0_2_0_2 + 0.00299823633156966*G0_0_0_2_1_0 + 0.0131473464806798*G0_0_0_2_1_1 + 0.00625300625300621*G0_0_0_2_1_2 + 0.0155715889049221*G0_0_0_2_2_0 + 0.00625300625300621*G0_0_0_2_2_1 + 0.0643129709796372*G0_0_0_2_2_2 + 0.00161616161616161*G0_0_1_0_0_0 + 0.00102613435946771*G0_0_1_0_0_1 + 0.000179573512906848*G0_0_1_0_0_2 + 0.00102613435946771*G0_0_1_0_1_0 - 0.0109026775693442*G0_0_1_0_1_1 + 0.000179573512906848*G0_0_1_0_2_0 - 0.000179573512906848*G0_0_1_0_2_2 + 0.00102613435946771*G0_0_1_1_0_0 - 0.0109026775693442*G0_0_1_1_0_1 - 0.0109026775693442*G0_0_1_1_1_0 + 0.0109026775693441*G0_0_1_1_1_2 + 0.0109026775693441*G0_0_1_1_2_1 - 0.0010261343594677*G0_0_1_1_2_2 + 0.000179573512906848*G0_0_1_2_0_0 - 0.000179573512906849*G0_0_1_2_0_2 + 0.0109026775693441*G0_0_1_2_1_1 - 0.00102613435946769*G0_0_1_2_1_2 - 0.000179573512906849*G0_0_1_2_2_0 - 0.0010261343594677*G0_0_1_2_2_1 - 0.00161616161616164*G0_0_1_2_2_2; + A[7] = A[19] - 0.0558345358345358*G0_0_0_0_0_0 - 0.00339907006573674*G0_0_0_0_0_1 - 0.0104665704665704*G0_0_0_0_0_2 - 0.00339907006573674*G0_0_0_0_1_0 + 0.00339907006573669*G0_0_0_0_1_1 - 0.0104665704665704*G0_0_0_0_2_0 - 0.00801667468334131*G0_0_0_0_2_2 - 0.00339907006573674*G0_0_0_1_0_0 + 0.00339907006573669*G0_0_0_1_0_1 + 0.00339907006573669*G0_0_0_1_1_0 + 0.0558345358345352*G0_0_0_1_1_1 + 0.0104665704665704*G0_0_0_1_1_2 + 0.0104665704665704*G0_0_0_1_2_1 + 0.00801667468334131*G0_0_0_1_2_2 - 0.0104665704665704*G0_0_0_2_0_0 - 0.00801667468334131*G0_0_0_2_0_2 + 0.0104665704665704*G0_0_0_2_1_1 + 0.00801667468334132*G0_0_0_2_1_2 - 0.00801667468334131*G0_0_0_2_2_0 + 0.00801667468334131*G0_0_0_2_2_1 + 0.23494628827962*G0_0_1_0_0_0 + 0.0222542889209555*G0_0_1_0_0_1 + 0.00558601891935223*G0_0_1_0_0_2 + 0.0222542889209555*G0_0_1_0_1_0 + 0.0256533589866922*G0_0_1_0_1_1 + 0.00412057078723744*G0_0_1_0_1_2 + 0.00558601891935223*G0_0_1_0_2_0 + 0.00412057078723744*G0_0_1_0_2_1 + 0.00740099406766071*G0_0_1_0_2_2 + 0.0222542889209555*G0_0_1_1_0_0 + 0.0256533589866922*G0_0_1_1_0_1 + 0.00412057078723744*G0_0_1_1_0_2 + 0.0256533589866922*G0_0_1_1_1_0 + 0.290780824114156*G0_0_1_1_1_1 + 0.0160525893859227*G0_0_1_1_1_2 + 0.00412057078723744*G0_0_1_1_2_0 + 0.0160525893859227*G0_0_1_1_2_1 + 0.015417668751002*G0_0_1_1_2_2 + 0.00558601891935223*G0_0_1_2_0_0 + 0.00412057078723744*G0_0_1_2_0_1 + 0.00740099406766071*G0_0_1_2_0_2 + 0.00412057078723744*G0_0_1_2_1_0 + 0.0160525893859227*G0_0_1_2_1_1 + 0.015417668751002*G0_0_1_2_1_2 + 0.00740099406766071*G0_0_1_2_2_0 + 0.015417668751002*G0_0_1_2_2_1 + 0.0655763989097319*G0_0_1_2_2_2 - 0.0538560205226872*G0_1_0_0_0_0 - 0.00315856982523649*G0_1_0_0_0_1 - 0.00612473945807278*G0_1_0_0_0_2 - 0.00315856982523649*G0_1_0_0_1_0 + 0.000240500240500248*G0_1_0_0_1_1 + 0.000625300625300626*G0_1_0_0_1_2 - 0.00612473945807278*G0_1_0_0_2_0 + 0.000625300625300626*G0_1_0_0_2_1 + 0.00303030303030303*G0_1_0_0_2_2 - 0.00315856982523649*G0_1_0_1_0_0 + 0.000240500240500248*G0_1_0_1_0_1 + 0.000625300625300625*G0_1_0_1_0_2 + 0.000240500240500248*G0_1_0_1_1_0 + 0.00197851531184865*G0_1_0_1_1_1 + 0.00434183100849766*G0_1_0_1_1_2 + 0.000625300625300625*G0_1_0_1_2_0 + 0.00434183100849766*G0_1_0_1_2_1 + 0.0110469777136443*G0_1_0_1_2_2 - 0.00612473945807278*G0_1_0_2_0_0 + 0.000625300625300625*G0_1_0_2_0_1 + 0.00303030303030303*G0_1_0_2_0_2 + 0.000625300625300625*G0_1_0_2_1_0 + 0.00434183100849766*G0_1_0_2_1_1 + 0.0110469777136443*G0_1_0_2_1_2 + 0.00303030303030303*G0_1_0_2_2_0 + 0.0110469777136443*G0_1_0_2_2_1 + 0.0623248356581689*G0_1_0_2_2_2 + 0.23493666827*G0_1_1_0_0_0 + 0.0192720859387525*G0_1_1_0_0_1 + 0.00540323873657206*G0_1_1_0_0_2 + 0.0192720859387525*G0_1_1_0_1_0 + 0.00322270322270324*G0_1_1_0_1_1 + 0.00237293570626904*G0_1_1_0_1_2 + 0.00540323873657206*G0_1_1_0_2_0 + 0.00237293570626904*G0_1_1_0_2_1 + 0.0070386403719737*G0_1_1_0_2_2 + 0.0192720859387525*G0_1_1_1_0_0 + 0.00322270322270324*G0_1_1_1_0_1 + 0.00237293570626904*G0_1_1_1_0_2 + 0.00322270322270324*G0_1_1_1_1_0 + 0.00198813532146875*G0_1_1_1_1_1 + 0.00452461119127785*G0_1_1_1_1_2 + 0.00237293570626904*G0_1_1_1_2_0 + 0.00452461119127785*G0_1_1_1_2_1 + 0.0114093314093314*G0_1_1_1_2_2 + 0.00540323873657206*G0_1_1_2_0_0 + 0.00237293570626904*G0_1_1_2_0_1 + 0.0070386403719737*G0_1_1_2_0_2 + 0.00237293570626904*G0_1_1_2_1_0 + 0.00452461119127785*G0_1_1_2_1_1 + 0.0114093314093314*G0_1_1_2_1_2 + 0.0070386403719737*G0_1_1_2_2_0 + 0.0114093314093314*G0_1_1_2_2_1 + 0.0639506172839504*G0_1_1_2_2_2; + A[61] = A[19] + 0.00298220298220297*G0_0_1_0_0_1 + 0.000182780182780178*G0_0_1_0_0_2 + 0.00298220298220297*G0_0_1_0_1_0 + 0.022430655763989*G0_0_1_0_1_1 + 0.00174763508096841*G0_0_1_0_1_2 + 0.000182780182780178*G0_0_1_0_2_0 + 0.00174763508096841*G0_0_1_0_2_1 + 0.00036235369568702*G0_0_1_0_2_2 + 0.00298220298220297*G0_0_1_1_0_0 + 0.022430655763989*G0_0_1_1_0_1 + 0.00174763508096841*G0_0_1_1_0_2 + 0.022430655763989*G0_0_1_1_1_0 + 0.288792688792688*G0_0_1_1_1_1 + 0.0115279781946448*G0_0_1_1_1_2 + 0.00174763508096841*G0_0_1_1_2_0 + 0.0115279781946448*G0_0_1_1_2_1 + 0.00400833734167065*G0_0_1_1_2_2 + 0.000182780182780178*G0_0_1_2_0_0 + 0.00174763508096841*G0_0_1_2_0_1 + 0.00036235369568702*G0_0_1_2_0_2 + 0.00174763508096841*G0_0_1_2_1_0 + 0.0115279781946448*G0_0_1_2_1_1 + 0.00400833734167065*G0_0_1_2_1_2 + 0.00036235369568702*G0_0_1_2_2_0 + 0.00400833734167065*G0_0_1_2_2_1 + 0.00162578162578153*G0_0_1_2_2_2 - 0.00298220298220297*G0_1_0_0_0_1 - 0.000182780182780178*G0_1_0_0_0_2 - 0.00298220298220297*G0_1_0_0_1_0 - 0.022430655763989*G0_1_0_0_1_1 - 0.00174763508096841*G0_1_0_0_1_2 - 0.000182780182780178*G0_1_0_0_2_0 - 0.00174763508096841*G0_1_0_0_2_1 - 0.00036235369568702*G0_1_0_0_2_2 - 0.00298220298220297*G0_1_0_1_0_0 - 0.022430655763989*G0_1_0_1_0_1 - 0.00174763508096841*G0_1_0_1_0_2 - 0.022430655763989*G0_1_0_1_1_0 - 0.288792688792688*G0_1_0_1_1_1 - 0.0115279781946448*G0_1_0_1_1_2 - 0.00174763508096841*G0_1_0_1_2_0 - 0.0115279781946448*G0_1_0_1_2_1 - 0.00400833734167065*G0_1_0_1_2_2 - 0.000182780182780178*G0_1_0_2_0_0 - 0.00174763508096841*G0_1_0_2_0_1 - 0.00036235369568702*G0_1_0_2_0_2 - 0.00174763508096841*G0_1_0_2_1_0 - 0.0115279781946448*G0_1_0_2_1_1 - 0.00400833734167065*G0_1_0_2_1_2 - 0.00036235369568702*G0_1_0_2_2_0 - 0.00400833734167065*G0_1_0_2_2_1 - 0.00162578162578153*G0_1_0_2_2_2; + A[33] = -A[36] - 0.0117748917748917*G0_1_0_0_0_0 - 0.00130832130832131*G0_1_0_0_0_1 - 0.00384800384800382*G0_1_0_0_0_2 - 0.00130832130832131*G0_1_0_0_1_0 + 0.00130832130832129*G0_1_0_0_1_1 - 0.00384800384800382*G0_1_0_0_2_0 + 0.00666987333653998*G0_1_0_0_2_2 - 0.00130832130832131*G0_1_0_1_0_0 + 0.00130832130832129*G0_1_0_1_0_1 + 0.00130832130832129*G0_1_0_1_1_0 + 0.0117748917748917*G0_1_0_1_1_1 + 0.00384800384800383*G0_1_0_1_1_2 + 0.00384800384800383*G0_1_0_1_2_1 - 0.00666987333653995*G0_1_0_1_2_2 - 0.00384800384800382*G0_1_0_2_0_0 + 0.00666987333653999*G0_1_0_2_0_2 + 0.00384800384800383*G0_1_0_2_1_1 - 0.00666987333653995*G0_1_0_2_1_2 + 0.00666987333653999*G0_1_0_2_2_0 - 0.00666987333653995*G0_1_0_2_2_1 - 0.0584896584896582*G0_1_1_0_0_0 - 0.00847415958527067*G0_1_1_0_0_1 - 0.00330073218962106*G0_1_1_0_0_2 - 0.00847415958527067*G0_1_1_0_1_0 - 0.00716583827694939*G0_1_1_0_1_1 - 0.000867938645716424*G0_1_1_0_1_2 - 0.00330073218962106*G0_1_1_0_2_0 - 0.000867938645716424*G0_1_1_0_2_1 - 0.000769600769600781*G0_1_1_0_2_2 - 0.00847415958527067*G0_1_1_1_0_0 - 0.00716583827694939*G0_1_1_1_0_1 - 0.000867938645716424*G0_1_1_1_0_2 - 0.00716583827694939*G0_1_1_1_1_0 - 0.0467147667147668*G0_1_1_1_1_1 + 0.000547271658382748*G0_1_1_1_1_2 - 0.000867938645716424*G0_1_1_1_2_0 + 0.000547271658382747*G0_1_1_1_2_1 - 0.00743947410614076*G0_1_1_1_2_2 - 0.00330073218962106*G0_1_1_2_0_0 - 0.000867938645716424*G0_1_1_2_0_1 - 0.000769600769600781*G0_1_1_2_0_2 - 0.000867938645716424*G0_1_1_2_1_0 + 0.000547271658382747*G0_1_1_2_1_1 - 0.00743947410614076*G0_1_1_2_1_2 - 0.000769600769600781*G0_1_1_2_2_0 - 0.00743947410614076*G0_1_1_2_2_1 - 0.097611030944364*G0_1_1_2_2_2; + A[41] = -A[33] - 0.00187269520602862*G0_1_0_0_0_0 - 0.00174442841109508*G0_1_0_0_0_1 + 0.00164181497514828*G0_1_0_0_0_2 - 0.00174442841109508*G0_1_0_0_1_0 - 0.00135107690663246*G0_1_0_0_1_1 + 0.00126129015017903*G0_1_0_0_1_2 + 0.00164181497514828*G0_1_0_0_2_0 + 0.00126129015017903*G0_1_0_0_2_1 + 0.0107829618940729*G0_1_0_0_2_2 - 0.00174442841109508*G0_1_0_1_0_0 - 0.00135107690663246*G0_1_0_1_0_1 + 0.00126129015017903*G0_1_0_1_0_2 - 0.00135107690663246*G0_1_0_1_1_0 + 0.0288600288600289*G0_1_0_1_1_1 + 0.00494254716476939*G0_1_0_1_1_2 + 0.00126129015017903*G0_1_0_1_2_0 + 0.00494254716476938*G0_1_0_1_2_1 + 0.00268505157394046*G0_1_0_1_2_2 + 0.00164181497514828*G0_1_0_2_0_0 + 0.00126129015017903*G0_1_0_2_0_1 + 0.0107829618940729*G0_1_0_2_0_2 + 0.00126129015017903*G0_1_0_2_1_0 + 0.00494254716476938*G0_1_0_2_1_1 + 0.00268505157394046*G0_1_0_2_1_2 + 0.0107829618940729*G0_1_0_2_2_0 + 0.00268505157394046*G0_1_0_2_2_1 + 0.117748917748917*G0_1_0_2_2_2; + A[127] = A[113] + 0.0363251563251561*G0_0_1_0_0_0 + 0.00607984607984605*G0_0_1_0_0_1 + 0.0659547859547858*G0_0_1_0_0_2 + 0.00607984607984605*G0_0_1_0_1_0 + 0.00205226871893539*G0_0_1_0_1_1 + 0.0133140933140933*G0_0_1_0_1_2 + 0.0659547859547858*G0_0_1_0_2_0 + 0.0133140933140933*G0_0_1_0_2_1 + 0.129549462882796*G0_0_1_0_2_2 + 0.00607984607984605*G0_0_1_1_0_0 + 0.00205226871893539*G0_0_1_1_0_1 + 0.0133140933140933*G0_0_1_1_0_2 + 0.00205226871893539*G0_0_1_1_1_0 + 0.00464325797659132*G0_0_1_1_1_2 + 0.0133140933140933*G0_0_1_1_2_0 + 0.00464325797659132*G0_0_1_1_2_1 + 0.0271925605258939*G0_0_1_1_2_2 + 0.0659547859547858*G0_0_1_2_0_0 + 0.0133140933140933*G0_0_1_2_0_1 + 0.129549462882796*G0_0_1_2_0_2 + 0.0133140933140933*G0_0_1_2_1_0 + 0.00464325797659132*G0_0_1_2_1_1 + 0.0271925605258939*G0_0_1_2_1_2 + 0.129549462882796*G0_0_1_2_2_0 + 0.0271925605258939*G0_0_1_2_2_1 + 0.294757094757094*G0_0_1_2_2_2 - 0.0363251563251561*G0_1_0_0_0_0 - 0.00607984607984604*G0_1_0_0_0_1 - 0.0659547859547858*G0_1_0_0_0_2 - 0.00607984607984605*G0_1_0_0_1_0 - 0.00205226871893539*G0_1_0_0_1_1 - 0.0133140933140933*G0_1_0_0_1_2 - 0.0659547859547858*G0_1_0_0_2_0 - 0.0133140933140933*G0_1_0_0_2_1 - 0.129549462882796*G0_1_0_0_2_2 - 0.00607984607984605*G0_1_0_1_0_0 - 0.00205226871893539*G0_1_0_1_0_1 - 0.0133140933140933*G0_1_0_1_0_2 - 0.00205226871893539*G0_1_0_1_1_0 - 0.00464325797659132*G0_1_0_1_1_2 - 0.0133140933140933*G0_1_0_1_2_0 - 0.00464325797659132*G0_1_0_1_2_1 - 0.0271925605258939*G0_1_0_1_2_2 - 0.0659547859547858*G0_1_0_2_0_0 - 0.0133140933140933*G0_1_0_2_0_1 - 0.129549462882796*G0_1_0_2_0_2 - 0.0133140933140933*G0_1_0_2_1_0 - 0.00464325797659132*G0_1_0_2_1_1 - 0.0271925605258939*G0_1_0_2_1_2 - 0.129549462882796*G0_1_0_2_2_0 - 0.0271925605258939*G0_1_0_2_2_1 - 0.294757094757094*G0_1_0_2_2_2; + A[62] = -A[107] + 0.00161616161616153*G0_0_1_0_0_0 + 0.000179573512906829*G0_0_1_0_0_1 + 0.00102613435946771*G0_0_1_0_0_2 + 0.000179573512906829*G0_0_1_0_1_0 - 0.000179573512906852*G0_0_1_0_1_1 + 0.00102613435946771*G0_0_1_0_2_0 - 0.0109026775693441*G0_0_1_0_2_2 + 0.000179573512906829*G0_0_1_1_0_0 - 0.000179573512906852*G0_0_1_1_0_1 - 0.000179573512906852*G0_0_1_1_1_0 - 0.00161616161616157*G0_0_1_1_1_1 - 0.00102613435946767*G0_0_1_1_1_2 - 0.00102613435946767*G0_0_1_1_2_1 + 0.0109026775693442*G0_0_1_1_2_2 + 0.0010261343594677*G0_0_1_2_0_0 - 0.0109026775693441*G0_0_1_2_0_2 - 0.00102613435946767*G0_0_1_2_1_1 + 0.0109026775693442*G0_0_1_2_1_2 - 0.0109026775693441*G0_0_1_2_2_0 + 0.0109026775693442*G0_0_1_2_2_1 + 0.0659291325957988*G0_1_1_0_0_0 + 0.015751162417829*G0_1_1_0_0_1 + 0.0072791406124739*G0_1_1_0_0_2 + 0.015751162417829*G0_1_1_0_1_0 + 0.0155715889049222*G0_1_1_0_1_1 + 0.00299823633156965*G0_1_1_0_1_2 + 0.0072791406124739*G0_1_1_0_2_0 + 0.00299823633156965*G0_1_1_0_2_1 + 0.00224466891133559*G0_1_1_0_2_2 + 0.015751162417829*G0_1_1_1_0_0 + 0.0155715889049222*G0_1_1_1_0_1 + 0.00299823633156965*G0_1_1_1_0_2 + 0.0155715889049222*G0_1_1_1_1_0 + 0.0643129709796377*G0_1_1_1_1_1 + 0.00625300625300626*G0_1_1_1_1_2 + 0.00299823633156965*G0_1_1_1_2_0 + 0.00625300625300626*G0_1_1_1_2_1 + 0.0131473464806798*G0_1_1_1_2_2 + 0.0072791406124739*G0_1_1_2_0_0 + 0.00299823633156965*G0_1_1_2_0_1 + 0.00224466891133559*G0_1_1_2_0_2 + 0.00299823633156965*G0_1_1_2_1_0 + 0.00625300625300626*G0_1_1_2_1_1 + 0.0131473464806798*G0_1_1_2_1_2 + 0.00224466891133559*G0_1_1_2_2_0 + 0.0131473464806798*G0_1_1_2_2_1 + 0.181080647747313*G0_1_1_2_2_2; + A[44] = A[212] + 0.00161616161616154*G0_0_1_0_0_0 + 0.000179573512906829*G0_0_1_0_0_1 + 0.00102613435946771*G0_0_1_0_0_2 + 0.000179573512906829*G0_0_1_0_1_0 - 0.000179573512906852*G0_0_1_0_1_1 + 0.00102613435946771*G0_0_1_0_2_0 - 0.0109026775693441*G0_0_1_0_2_2 + 0.000179573512906829*G0_0_1_1_0_0 - 0.000179573512906852*G0_0_1_1_0_1 - 0.000179573512906852*G0_0_1_1_1_0 - 0.00161616161616156*G0_0_1_1_1_1 - 0.00102613435946767*G0_0_1_1_1_2 - 0.00102613435946767*G0_0_1_1_2_1 + 0.0109026775693443*G0_0_1_1_2_2 + 0.00102613435946771*G0_0_1_2_0_0 - 0.0109026775693441*G0_0_1_2_0_2 - 0.00102613435946767*G0_0_1_2_1_1 + 0.0109026775693443*G0_0_1_2_1_2 - 0.0109026775693441*G0_0_1_2_2_0 + 0.0109026775693443*G0_0_1_2_2_1 - 0.00161616161616154*G0_1_0_0_0_0 - 0.000179573512906829*G0_1_0_0_0_1 - 0.00102613435946771*G0_1_0_0_0_2 - 0.000179573512906829*G0_1_0_0_1_0 + 0.000179573512906852*G0_1_0_0_1_1 - 0.00102613435946771*G0_1_0_0_2_0 + 0.0109026775693441*G0_1_0_0_2_2 - 0.000179573512906829*G0_1_0_1_0_0 + 0.000179573512906852*G0_1_0_1_0_1 + 0.000179573512906852*G0_1_0_1_1_0 + 0.00161616161616156*G0_1_0_1_1_1 + 0.00102613435946767*G0_1_0_1_1_2 + 0.00102613435946767*G0_1_0_1_2_1 - 0.0109026775693443*G0_1_0_1_2_2 - 0.00102613435946771*G0_1_0_2_0_0 + 0.0109026775693441*G0_1_0_2_0_2 + 0.00102613435946767*G0_1_0_2_1_1 - 0.0109026775693443*G0_1_0_2_1_2 + 0.0109026775693441*G0_1_0_2_2_0 - 0.0109026775693443*G0_1_0_2_2_1; + A[141] = A[99] + 0.301683501683501*G0_0_1_0_0_0 - 0.0266794933461598*G0_0_1_0_0_1 - 0.0266794933461599*G0_0_1_0_0_2 - 0.0266794933461598*G0_0_1_0_1_0 - 0.0123136123136122*G0_0_1_0_1_1 - 0.00615680615680613*G0_0_1_0_1_2 - 0.0266794933461599*G0_0_1_0_2_0 - 0.00615680615680612*G0_0_1_0_2_1 - 0.0123136123136123*G0_0_1_0_2_2 - 0.0266794933461598*G0_0_1_1_0_0 - 0.0123136123136122*G0_0_1_1_0_1 - 0.00615680615680613*G0_0_1_1_0_2 - 0.0123136123136122*G0_0_1_1_1_0 - 0.00769600769600781*G0_0_1_1_1_1 - 0.00256533589866928*G0_0_1_1_1_2 - 0.00615680615680612*G0_0_1_1_2_0 - 0.00256533589866928*G0_0_1_1_2_1 - 0.00256533589866928*G0_0_1_1_2_2 - 0.0266794933461599*G0_0_1_2_0_0 - 0.00615680615680612*G0_0_1_2_0_1 - 0.0123136123136123*G0_0_1_2_0_2 - 0.00615680615680612*G0_0_1_2_1_0 - 0.00256533589866928*G0_0_1_2_1_1 - 0.00256533589866928*G0_0_1_2_1_2 - 0.0123136123136123*G0_0_1_2_2_0 - 0.00256533589866928*G0_0_1_2_2_1 - 0.00769600769600777*G0_0_1_2_2_2 - 0.301683501683501*G0_1_0_0_0_0 + 0.0266794933461598*G0_1_0_0_0_1 + 0.0266794933461599*G0_1_0_0_0_2 + 0.0266794933461598*G0_1_0_0_1_0 + 0.0123136123136122*G0_1_0_0_1_1 + 0.00615680615680612*G0_1_0_0_1_2 + 0.0266794933461599*G0_1_0_0_2_0 + 0.00615680615680612*G0_1_0_0_2_1 + 0.0123136123136123*G0_1_0_0_2_2 + 0.0266794933461598*G0_1_0_1_0_0 + 0.0123136123136122*G0_1_0_1_0_1 + 0.00615680615680612*G0_1_0_1_0_2 + 0.0123136123136122*G0_1_0_1_1_0 + 0.00769600769600781*G0_1_0_1_1_1 + 0.00256533589866928*G0_1_0_1_1_2 + 0.00615680615680612*G0_1_0_1_2_0 + 0.00256533589866928*G0_1_0_1_2_1 + 0.00256533589866928*G0_1_0_1_2_2 + 0.0266794933461599*G0_1_0_2_0_0 + 0.00615680615680612*G0_1_0_2_0_1 + 0.0123136123136123*G0_1_0_2_0_2 + 0.00615680615680612*G0_1_0_2_1_0 + 0.00256533589866928*G0_1_0_2_1_1 + 0.00256533589866928*G0_1_0_2_1_2 + 0.0123136123136123*G0_1_0_2_2_0 + 0.00256533589866928*G0_1_0_2_2_1 + 0.00769600769600777*G0_1_0_2_2_2; + A[172] = -A[52] - 0.0181882315215646*G0_0_0_0_0_0 + 0.001000481000481*G0_0_0_0_0_1 - 0.0347346480679812*G0_0_0_0_0_2 + 0.001000481000481*G0_0_0_0_1_0 + 0.00646464646464644*G0_0_0_0_1_1 + 0.00325797659130993*G0_0_0_0_1_2 - 0.0347346480679812*G0_0_0_0_2_0 + 0.00325797659130993*G0_0_0_0_2_1 - 0.048664421997755*G0_0_0_0_2_2 + 0.001000481000481*G0_0_0_1_0_0 + 0.00646464646464644*G0_0_0_1_0_1 + 0.00325797659130993*G0_0_0_1_0_2 + 0.00646464646464644*G0_0_0_1_1_0 + 0.0205226871893543*G0_0_0_1_1_1 + 0.00687510020843361*G0_0_0_1_1_2 + 0.00325797659130993*G0_0_0_1_2_0 + 0.00687510020843361*G0_0_0_1_2_1 - 0.00110309443642769*G0_0_0_1_2_2 - 0.0347346480679812*G0_0_0_2_0_0 + 0.00325797659130993*G0_0_0_2_0_1 - 0.048664421997755*G0_0_0_2_0_2 + 0.00325797659130993*G0_0_0_2_1_0 + 0.00687510020843361*G0_0_0_2_1_1 - 0.00110309443642769*G0_0_0_2_1_2 - 0.048664421997755*G0_0_0_2_2_0 - 0.00110309443642769*G0_0_0_2_2_1 - 0.0315023248356582*G0_0_0_2_2_2 + 0.0133140933140923*G0_0_1_0_0_0 + 0.00210357543690866*G0_0_1_0_0_1 + 0.0139297739297737*G0_0_1_0_0_2 + 0.00210357543690866*G0_0_1_0_1_0 - 0.000410453743787109*G0_0_1_0_1_1 + 0.0139297739297737*G0_0_1_0_2_0 - 0.0139297739297739*G0_0_1_0_2_2 + 0.00210357543690866*G0_0_1_1_0_0 - 0.000410453743787109*G0_0_1_1_0_1 - 0.000410453743787108*G0_0_1_1_1_0 + 0.000410453743787122*G0_0_1_1_1_2 + 0.000410453743787121*G0_0_1_1_2_1 - 0.0021035754369087*G0_0_1_1_2_2 + 0.0139297739297737*G0_0_1_2_0_0 - 0.0139297739297739*G0_0_1_2_0_2 + 0.000410453743787122*G0_0_1_2_1_1 - 0.0021035754369087*G0_0_1_2_1_2 - 0.0139297739297739*G0_0_1_2_2_0 - 0.0021035754369087*G0_0_1_2_2_1 - 0.0133140933140933*G0_0_1_2_2_2; + A[155] = -A[158] + 0.0133140933140929*G0_0_1_0_0_0 + 0.0139297739297738*G0_0_1_0_0_1 + 0.00210357543690871*G0_0_1_0_0_2 + 0.0139297739297738*G0_0_1_0_1_0 - 0.0139297739297739*G0_0_1_0_1_1 + 0.00210357543690871*G0_0_1_0_2_0 - 0.000410453743787064*G0_0_1_0_2_2 + 0.0139297739297738*G0_0_1_1_0_0 - 0.0139297739297739*G0_0_1_1_0_1 - 0.0139297739297739*G0_0_1_1_1_0 - 0.0133140933140927*G0_0_1_1_1_1 - 0.00210357543690881*G0_0_1_1_1_2 - 0.00210357543690881*G0_0_1_1_2_1 + 0.000410453743787035*G0_0_1_1_2_2 + 0.00210357543690871*G0_0_1_2_0_0 - 0.000410453743787064*G0_0_1_2_0_2 - 0.0021035754369088*G0_0_1_2_1_1 + 0.000410453743787035*G0_0_1_2_1_2 - 0.000410453743787063*G0_0_1_2_2_0 + 0.000410453743787036*G0_0_1_2_2_1 - 0.018188231521565*G0_1_1_0_0_0 - 0.0347346480679812*G0_1_1_0_0_1 + 0.00100048100048103*G0_1_1_0_0_2 - 0.0347346480679812*G0_1_1_0_1_0 - 0.048664421997755*G0_1_1_0_1_1 + 0.00325797659130993*G0_1_1_0_1_2 + 0.00100048100048103*G0_1_1_0_2_0 + 0.00325797659130993*G0_1_1_0_2_1 + 0.00646464646464653*G0_1_1_0_2_2 - 0.0347346480679812*G0_1_1_1_0_0 - 0.048664421997755*G0_1_1_1_0_1 + 0.00325797659130993*G0_1_1_1_0_2 - 0.048664421997755*G0_1_1_1_1_0 - 0.0315023248356573*G0_1_1_1_1_1 - 0.00110309443642777*G0_1_1_1_1_2 + 0.00325797659130993*G0_1_1_1_2_0 - 0.00110309443642777*G0_1_1_1_2_1 + 0.00687510020843352*G0_1_1_1_2_2 + 0.00100048100048103*G0_1_1_2_0_0 + 0.00325797659130993*G0_1_1_2_0_1 + 0.00646464646464653*G0_1_1_2_0_2 + 0.00325797659130993*G0_1_1_2_1_0 - 0.00110309443642778*G0_1_1_2_1_1 + 0.00687510020843351*G0_1_1_2_1_2 + 0.00646464646464653*G0_1_1_2_2_0 + 0.00687510020843352*G0_1_1_2_2_1 + 0.0205226871893539*G0_1_1_2_2_2; + A[85] = A[155] - 0.0157768157768157*G0_0_1_0_0_0 - 0.00359147025813681*G0_0_1_0_0_1 + 0.000179573512906871*G0_0_1_0_0_2 - 0.00359147025813681*G0_0_1_0_1_0 + 0.010338303671637*G0_0_1_0_1_1 - 0.00110309443642775*G0_0_1_0_1_2 + 0.000179573512906871*G0_0_1_0_2_0 - 0.00110309443642775*G0_0_1_0_2_1 + 0.000359147025813753*G0_0_1_0_2_2 - 0.00359147025813681*G0_0_1_1_0_0 + 0.010338303671637*G0_0_1_1_0_1 - 0.00110309443642775*G0_0_1_1_0_2 + 0.010338303671637*G0_0_1_1_1_0 - 0.00246272246272287*G0_0_1_1_1_1 + 0.00228314894981565*G0_0_1_1_1_2 - 0.00110309443642775*G0_0_1_1_2_0 + 0.00228314894981565*G0_0_1_1_2_1 + 0.00017957351290687*G0_0_1_2_0_0 - 0.00110309443642775*G0_0_1_2_0_1 + 0.000359147025813752*G0_0_1_2_0_2 - 0.00110309443642775*G0_0_1_2_1_0 + 0.00228314894981565*G0_0_1_2_1_1 + 0.000359147025813753*G0_0_1_2_2_0 - 0.00369408369408321*G0_0_1_2_2_2 + 0.0157768157768157*G0_1_0_0_0_0 + 0.00359147025813681*G0_1_0_0_0_1 - 0.000179573512906871*G0_1_0_0_0_2 + 0.00359147025813681*G0_1_0_0_1_0 - 0.010338303671637*G0_1_0_0_1_1 + 0.00110309443642775*G0_1_0_0_1_2 - 0.000179573512906871*G0_1_0_0_2_0 + 0.00110309443642775*G0_1_0_0_2_1 - 0.000359147025813753*G0_1_0_0_2_2 + 0.00359147025813681*G0_1_0_1_0_0 - 0.010338303671637*G0_1_0_1_0_1 + 0.00110309443642775*G0_1_0_1_0_2 - 0.010338303671637*G0_1_0_1_1_0 + 0.00246272246272283*G0_1_0_1_1_1 - 0.00228314894981565*G0_1_0_1_1_2 + 0.00110309443642775*G0_1_0_1_2_0 - 0.00228314894981565*G0_1_0_1_2_1 - 0.00017957351290687*G0_1_0_2_0_0 + 0.00110309443642775*G0_1_0_2_0_1 - 0.000359147025813752*G0_1_0_2_0_2 + 0.00110309443642775*G0_1_0_2_1_0 - 0.00228314894981565*G0_1_0_2_1_1 - 0.000359147025813752*G0_1_0_2_2_0 + 0.00369408369408321*G0_1_0_2_2_2; + A[130] = -A[85] + 0.0133140933140929*G0_1_0_0_0_0 + 0.0139297739297738*G0_1_0_0_0_1 + 0.00210357543690871*G0_1_0_0_0_2 + 0.0139297739297738*G0_1_0_0_1_0 - 0.0139297739297739*G0_1_0_0_1_1 + 0.00210357543690871*G0_1_0_0_2_0 - 0.000410453743787064*G0_1_0_0_2_2 + 0.0139297739297738*G0_1_0_1_0_0 - 0.0139297739297739*G0_1_0_1_0_1 - 0.0139297739297739*G0_1_0_1_1_0 - 0.0133140933140927*G0_1_0_1_1_1 - 0.00210357543690881*G0_1_0_1_1_2 - 0.00210357543690881*G0_1_0_1_2_1 + 0.000410453743787036*G0_1_0_1_2_2 + 0.00210357543690871*G0_1_0_2_0_0 - 0.000410453743787064*G0_1_0_2_0_2 - 0.00210357543690881*G0_1_0_2_1_1 + 0.000410453743787036*G0_1_0_2_1_2 - 0.000410453743787065*G0_1_0_2_2_0 + 0.000410453743787036*G0_1_0_2_2_1 - 0.018188231521565*G0_1_1_0_0_0 - 0.0347346480679812*G0_1_1_0_0_1 + 0.00100048100048103*G0_1_1_0_0_2 - 0.0347346480679812*G0_1_1_0_1_0 - 0.048664421997755*G0_1_1_0_1_1 + 0.00325797659130993*G0_1_1_0_1_2 + 0.00100048100048103*G0_1_1_0_2_0 + 0.00325797659130993*G0_1_1_0_2_1 + 0.00646464646464653*G0_1_1_0_2_2 - 0.0347346480679812*G0_1_1_1_0_0 - 0.048664421997755*G0_1_1_1_0_1 + 0.00325797659130993*G0_1_1_1_0_2 - 0.048664421997755*G0_1_1_1_1_0 - 0.0315023248356574*G0_1_1_1_1_1 - 0.00110309443642778*G0_1_1_1_1_2 + 0.00325797659130993*G0_1_1_1_2_0 - 0.00110309443642778*G0_1_1_1_2_1 + 0.00687510020843351*G0_1_1_1_2_2 + 0.00100048100048103*G0_1_1_2_0_0 + 0.00325797659130993*G0_1_1_2_0_1 + 0.00646464646464653*G0_1_1_2_0_2 + 0.00325797659130993*G0_1_1_2_1_0 - 0.00110309443642778*G0_1_1_2_1_1 + 0.00687510020843351*G0_1_1_2_1_2 + 0.00646464646464653*G0_1_1_2_2_0 + 0.00687510020843351*G0_1_1_2_2_1 + 0.0205226871893539*G0_1_1_2_2_2; + A[105] = A[7] - 0.288792688792688*G0_0_1_0_0_0 - 0.022430655763989*G0_0_1_0_0_1 - 0.0115279781946448*G0_0_1_0_0_2 - 0.022430655763989*G0_0_1_0_1_0 - 0.00298220298220297*G0_0_1_0_1_1 - 0.00174763508096841*G0_0_1_0_1_2 - 0.0115279781946448*G0_0_1_0_2_0 - 0.00174763508096841*G0_0_1_0_2_1 - 0.00400833734167066*G0_0_1_0_2_2 - 0.022430655763989*G0_0_1_1_0_0 - 0.00298220298220297*G0_0_1_1_0_1 - 0.00174763508096841*G0_0_1_1_0_2 - 0.00298220298220297*G0_0_1_1_1_0 - 0.000182780182780181*G0_0_1_1_1_2 - 0.00174763508096841*G0_0_1_1_2_0 - 0.000182780182780182*G0_0_1_1_2_1 - 0.000362353695687012*G0_0_1_1_2_2 - 0.0115279781946448*G0_0_1_2_0_0 - 0.00174763508096841*G0_0_1_2_0_1 - 0.00400833734167066*G0_0_1_2_0_2 - 0.00174763508096841*G0_0_1_2_1_0 - 0.000182780182780182*G0_0_1_2_1_1 - 0.000362353695687012*G0_0_1_2_1_2 - 0.00400833734167066*G0_0_1_2_2_0 - 0.000362353695687014*G0_0_1_2_2_1 - 0.00162578162578143*G0_0_1_2_2_2 + 0.288792688792688*G0_1_0_0_0_0 + 0.022430655763989*G0_1_0_0_0_1 + 0.0115279781946448*G0_1_0_0_0_2 + 0.022430655763989*G0_1_0_0_1_0 + 0.00298220298220297*G0_1_0_0_1_1 + 0.00174763508096841*G0_1_0_0_1_2 + 0.0115279781946448*G0_1_0_0_2_0 + 0.00174763508096841*G0_1_0_0_2_1 + 0.00400833734167066*G0_1_0_0_2_2 + 0.022430655763989*G0_1_0_1_0_0 + 0.00298220298220297*G0_1_0_1_0_1 + 0.00174763508096841*G0_1_0_1_0_2 + 0.00298220298220297*G0_1_0_1_1_0 + 0.000182780182780181*G0_1_0_1_1_2 + 0.00174763508096841*G0_1_0_1_2_0 + 0.000182780182780182*G0_1_0_1_2_1 + 0.000362353695687012*G0_1_0_1_2_2 + 0.0115279781946448*G0_1_0_2_0_0 + 0.00174763508096841*G0_1_0_2_0_1 + 0.00400833734167066*G0_1_0_2_0_2 + 0.00174763508096841*G0_1_0_2_1_0 + 0.000182780182780182*G0_1_0_2_1_1 + 0.000362353695687012*G0_1_0_2_1_2 + 0.00400833734167066*G0_1_0_2_2_0 + 0.000362353695687014*G0_1_0_2_2_1 + 0.00162578162578144*G0_1_0_2_2_2; + A[10] = A[105] + 0.288792688792688*G0_0_0_0_0_0 + 0.00856180856180857*G0_0_0_0_0_1 + 0.0253968253968253*G0_0_0_0_0_2 + 0.00856180856180857*G0_0_0_0_1_0 + 0.00679814013147343*G0_0_0_0_1_1 + 0.00174763508096841*G0_0_0_0_1_2 + 0.0253968253968253*G0_0_0_0_2_0 + 0.00174763508096841*G0_0_0_0_2_1 + 0.000192400192400193*G0_0_0_0_2_2 + 0.00856180856180857*G0_0_0_1_0_0 + 0.00679814013147343*G0_0_0_1_0_1 + 0.00174763508096841*G0_0_0_1_0_2 + 0.00679814013147343*G0_0_0_1_1_0 + 0.0619721019721017*G0_0_0_1_1_1 + 0.00706750040083368*G0_0_0_1_1_2 + 0.00174763508096841*G0_0_0_1_2_0 + 0.00706750040083368*G0_0_0_1_2_1 - 0.00652236652236649*G0_0_0_1_2_2 + 0.0253968253968253*G0_0_0_2_0_0 + 0.00174763508096841*G0_0_0_2_0_1 + 0.000192400192400194*G0_0_0_2_0_2 + 0.00174763508096841*G0_0_0_2_1_0 + 0.00706750040083368*G0_0_0_2_1_1 - 0.00652236652236649*G0_0_0_2_1_2 + 0.000192400192400194*G0_0_0_2_2_0 - 0.00652236652236649*G0_0_0_2_2_1 - 0.0603367003367*G0_0_0_2_2_2 - 0.00296616963283625*G0_0_1_0_0_1 + 0.00296616963283632*G0_0_1_0_0_2 - 0.00296616963283625*G0_0_1_0_1_0 + 0.00278980278980278*G0_0_1_0_1_1 + 0.00296616963283632*G0_0_1_0_2_0 - 0.00278980278980279*G0_0_1_0_2_2 - 0.00296616963283625*G0_0_1_1_0_0 + 0.00278980278980278*G0_0_1_1_0_1 + 0.00278980278980278*G0_0_1_1_1_0 + 0.06034632034632*G0_0_1_1_1_1 + 0.00670514670514665*G0_0_1_1_1_2 + 0.00670514670514665*G0_0_1_1_2_1 - 0.00670514670514669*G0_0_1_1_2_2 + 0.00296616963283632*G0_0_1_2_0_0 - 0.00278980278980279*G0_0_1_2_0_2 + 0.00670514670514665*G0_0_1_2_1_1 - 0.00670514670514669*G0_0_1_2_1_2 - 0.00278980278980279*G0_0_1_2_2_0 - 0.00670514670514669*G0_0_1_2_2_1 - 0.0603463203463202*G0_0_1_2_2_2 - 0.0138688472021804*G0_1_0_0_0_1 + 0.0138688472021805*G0_1_0_0_0_2 - 0.0138688472021804*G0_1_0_0_1_0 + 0.00381593714927044*G0_1_0_0_1_1 + 0.0138688472021805*G0_1_0_0_2_0 - 0.00381593714927048*G0_1_0_0_2_2 - 0.0138688472021804*G0_1_0_1_0_0 + 0.00381593714927044*G0_1_0_1_0_1 + 0.00381593714927044*G0_1_0_1_1_0 + 0.0619624819624815*G0_1_0_1_1_1 + 0.00688472021805348*G0_1_0_1_1_2 + 0.00688472021805348*G0_1_0_1_2_1 - 0.00688472021805352*G0_1_0_1_2_2 + 0.0138688472021805*G0_1_0_2_0_0 - 0.00381593714927048*G0_1_0_2_0_2 + 0.00688472021805348*G0_1_0_2_1_1 - 0.00688472021805352*G0_1_0_2_1_2 - 0.00381593714927048*G0_1_0_2_2_0 - 0.00688472021805352*G0_1_0_2_2_1 - 0.0619624819624816*G0_1_0_2_2_2 - 0.288792688792687*G0_1_1_0_0_0 - 0.0253968253968253*G0_1_1_0_0_1 - 0.00856180856180852*G0_1_1_0_0_2 - 0.0253968253968253*G0_1_1_0_1_0 - 0.000192400192400224*G0_1_1_0_1_1 - 0.00174763508096842*G0_1_1_0_1_2 - 0.00856180856180852*G0_1_1_0_2_0 - 0.00174763508096842*G0_1_1_0_2_1 - 0.00679814013147346*G0_1_1_0_2_2 - 0.0253968253968253*G0_1_1_1_0_0 - 0.000192400192400223*G0_1_1_1_0_1 - 0.00174763508096842*G0_1_1_1_0_2 - 0.000192400192400224*G0_1_1_1_1_0 + 0.0603367003366999*G0_1_1_1_1_1 + 0.00652236652236644*G0_1_1_1_1_2 - 0.00174763508096842*G0_1_1_1_2_0 + 0.00652236652236644*G0_1_1_1_2_1 - 0.00706750040083372*G0_1_1_1_2_2 - 0.00856180856180852*G0_1_1_2_0_0 - 0.00174763508096842*G0_1_1_2_0_1 - 0.00679814013147346*G0_1_1_2_0_2 - 0.00174763508096842*G0_1_1_2_1_0 + 0.00652236652236645*G0_1_1_2_1_1 - 0.00706750040083372*G0_1_1_2_1_2 - 0.00679814013147346*G0_1_1_2_2_0 - 0.00706750040083372*G0_1_1_2_2_1 - 0.0619721019721018*G0_1_1_2_2_2; + A[150] = A[10] + 0.288792688792688*G0_0_1_0_0_0 + 0.0115279781946448*G0_0_1_0_0_1 + 0.022430655763989*G0_0_1_0_0_2 + 0.0115279781946448*G0_0_1_0_1_0 + 0.00400833734167064*G0_0_1_0_1_1 + 0.00174763508096841*G0_0_1_0_1_2 + 0.022430655763989*G0_0_1_0_2_0 + 0.00174763508096841*G0_0_1_0_2_1 + 0.00298220298220296*G0_0_1_0_2_2 + 0.0115279781946448*G0_0_1_1_0_0 + 0.00400833734167064*G0_0_1_1_0_1 + 0.00174763508096841*G0_0_1_1_0_2 + 0.00400833734167064*G0_0_1_1_1_0 + 0.00162578162578153*G0_0_1_1_1_1 + 0.000362353695687016*G0_0_1_1_1_2 + 0.00174763508096841*G0_0_1_1_2_0 + 0.000362353695687016*G0_0_1_1_2_1 + 0.000182780182780178*G0_0_1_1_2_2 + 0.022430655763989*G0_0_1_2_0_0 + 0.00174763508096841*G0_0_1_2_0_1 + 0.00298220298220296*G0_0_1_2_0_2 + 0.00174763508096841*G0_0_1_2_1_0 + 0.000362353695687016*G0_0_1_2_1_1 + 0.000182780182780179*G0_0_1_2_1_2 + 0.00298220298220296*G0_0_1_2_2_0 + 0.000182780182780179*G0_0_1_2_2_1 - 0.288792688792688*G0_1_0_0_0_0 - 0.0115279781946448*G0_1_0_0_0_1 - 0.022430655763989*G0_1_0_0_0_2 - 0.0115279781946448*G0_1_0_0_1_0 - 0.00400833734167064*G0_1_0_0_1_1 - 0.00174763508096841*G0_1_0_0_1_2 - 0.022430655763989*G0_1_0_0_2_0 - 0.00174763508096841*G0_1_0_0_2_1 - 0.00298220298220296*G0_1_0_0_2_2 - 0.0115279781946448*G0_1_0_1_0_0 - 0.00400833734167064*G0_1_0_1_0_1 - 0.00174763508096841*G0_1_0_1_0_2 - 0.00400833734167064*G0_1_0_1_1_0 - 0.00162578162578153*G0_1_0_1_1_1 - 0.000362353695687016*G0_1_0_1_1_2 - 0.00174763508096841*G0_1_0_1_2_0 - 0.000362353695687016*G0_1_0_1_2_1 - 0.000182780182780179*G0_1_0_1_2_2 - 0.022430655763989*G0_1_0_2_0_0 - 0.00174763508096841*G0_1_0_2_0_1 - 0.00298220298220296*G0_1_0_2_0_2 - 0.00174763508096841*G0_1_0_2_1_0 - 0.000362353695687016*G0_1_0_2_1_1 - 0.000182780182780179*G0_1_0_2_1_2 - 0.00298220298220296*G0_1_0_2_2_0 - 0.000182780182780179*G0_1_0_2_2_1; + A[173] = -0.00246272246272246*G0_0_0_0_0_0 - 0.0006156806156806*G0_0_0_0_0_1 - 0.00143658810325476*G0_0_0_0_0_2 - 0.0006156806156806*G0_0_0_0_1_0 - 0.0016760194537972*G0_0_0_0_1_1 + 3.42044786489267e-05*G0_0_0_0_1_2 - 0.00143658810325476*G0_0_0_0_2_0 + 3.42044786489267e-05*G0_0_0_0_2_1 - 0.00311260755705196*G0_0_0_0_2_2 - 0.0006156806156806*G0_0_0_1_0_0 - 0.0016760194537972*G0_0_0_1_0_1 + 3.42044786489267e-05*G0_0_0_1_0_2 - 0.0016760194537972*G0_0_0_1_1_0 + 0.00933782267115583*G0_0_0_1_1_1 + 0.00136817914595692*G0_0_0_1_1_2 + 3.42044786489267e-05*G0_0_0_1_2_0 + 0.00136817914595692*G0_0_0_1_2_1 + 0.00311260755705199*G0_0_0_1_2_2 - 0.00143658810325476*G0_0_0_2_0_0 + 3.42044786489268e-05*G0_0_0_2_0_1 - 0.00311260755705196*G0_0_0_2_0_2 + 3.42044786489268e-05*G0_0_0_2_1_0 + 0.00136817914595692*G0_0_0_2_1_1 + 0.00311260755705199*G0_0_0_2_1_2 - 0.00311260755705196*G0_0_0_2_2_0 + 0.00311260755705199*G0_0_0_2_2_1 + 0.0106717973384642*G0_0_1_0_0_0 + 0.00256533589866924*G0_0_1_0_0_1 + 0.00256533589866925*G0_0_1_0_0_2 + 0.00256533589866924*G0_0_1_0_1_0 + 0.00646464646464642*G0_0_1_0_1_1 + 0.00256533589866925*G0_0_1_0_2_0 + 0.00646464646464643*G0_0_1_0_2_2 + 0.00256533589866924*G0_0_1_1_0_0 + 0.00646464646464642*G0_0_1_1_0_1 + 0.00646464646464642*G0_0_1_1_1_0 + 0.0183678050344712*G0_0_1_1_1_1 + 0.00256533589866925*G0_0_1_2_0_0 + 0.00646464646464643*G0_0_1_2_0_2 + 0.00646464646464643*G0_0_1_2_2_0 + 0.0183678050344715*G0_0_1_2_2_2 + 0.000820907487574149*G0_1_0_0_0_0 + 0.000718294051627369*G0_1_0_0_0_1 + 0.000718294051627378*G0_1_0_0_0_2 + 0.000718294051627369*G0_1_0_0_1_0 + 0.00311260755705193*G0_1_0_0_1_1 + 0.000684089572978455*G0_1_0_0_1_2 + 0.000718294051627378*G0_1_0_0_2_0 + 0.000684089572978455*G0_1_0_0_2_1 + 0.00311260755705197*G0_1_0_0_2_2 + 0.000718294051627369*G0_1_0_1_0_0 + 0.00311260755705193*G0_1_0_1_0_1 + 0.000684089572978455*G0_1_0_1_0_2 + 0.00311260755705193*G0_1_0_1_1_0 + 0.0277056277056271*G0_1_0_1_1_1 + 0.00304419859975413*G0_1_0_1_1_2 + 0.000684089572978455*G0_1_0_1_2_0 + 0.00304419859975413*G0_1_0_1_2_1 + 0.00304419859975413*G0_1_0_1_2_2 + 0.000718294051627378*G0_1_0_2_0_0 + 0.000684089572978455*G0_1_0_2_0_1 + 0.00311260755705197*G0_1_0_2_0_2 + 0.000684089572978455*G0_1_0_2_1_0 + 0.00304419859975413*G0_1_0_2_1_1 + 0.00304419859975413*G0_1_0_2_1_2 + 0.00311260755705197*G0_1_0_2_2_0 + 0.00304419859975413*G0_1_0_2_2_1 + 0.0277056277056274*G0_1_0_2_2_2 - 0.00246272246272254*G0_1_1_0_0_0 - 0.00143658810325478*G0_1_1_0_0_1 - 0.000615680615680617*G0_1_1_0_0_2 - 0.00143658810325478*G0_1_1_0_1_0 - 0.00311260755705204*G0_1_1_0_1_1 + 3.42044786489188e-05*G0_1_1_0_1_2 - 0.000615680615680617*G0_1_1_0_2_0 + 3.42044786489187e-05*G0_1_1_0_2_1 - 0.00167601945379722*G0_1_1_0_2_2 - 0.00143658810325478*G0_1_1_1_0_0 - 0.00311260755705204*G0_1_1_1_0_1 + 3.42044786489189e-05*G0_1_1_1_0_2 - 0.00311260755705204*G0_1_1_1_1_0 + 0.00311260755705199*G0_1_1_1_1_2 + 3.42044786489187e-05*G0_1_1_1_2_0 + 0.00311260755705199*G0_1_1_1_2_1 + 0.00136817914595693*G0_1_1_1_2_2 - 0.000615680615680617*G0_1_1_2_0_0 + 3.42044786489188e-05*G0_1_1_2_0_1 - 0.00167601945379722*G0_1_1_2_0_2 + 3.42044786489188e-05*G0_1_1_2_1_0 + 0.00311260755705199*G0_1_1_2_1_1 + 0.00136817914595692*G0_1_1_2_1_2 - 0.00167601945379722*G0_1_1_2_2_0 + 0.00136817914595692*G0_1_1_2_2_1 + 0.00933782267115589*G0_1_1_2_2_2; + A[170] = -A[173] + 0.0138528138528141*G0_0_1_0_0_0 + 0.0107060018171129*G0_0_1_0_0_1 + 0.00253113142002033*G0_0_1_0_0_2 + 0.0107060018171129*G0_0_1_0_1_0 + 0.015494628827962*G0_0_1_0_1_1 - 0.00136817914595693*G0_0_1_0_1_2 + 0.00253113142002034*G0_0_1_0_2_0 - 0.00136817914595693*G0_0_1_0_2_1 + 0.00335203890759444*G0_0_1_0_2_2 + 0.0107060018171129*G0_0_1_1_0_0 + 0.015494628827962*G0_0_1_1_0_1 - 0.00136817914595693*G0_0_1_1_0_2 + 0.015494628827962*G0_0_1_1_1_0 - 0.0924547057880399*G0_0_1_1_1_1 + 0.000205226871893501*G0_0_1_1_1_2 - 0.00136817914595693*G0_0_1_1_2_0 + 0.000205226871893502*G0_0_1_1_2_1 - 0.00335203890759447*G0_0_1_1_2_2 + 0.00253113142002034*G0_0_1_2_0_0 - 0.00136817914595693*G0_0_1_2_0_1 + 0.00335203890759444*G0_0_1_2_0_2 - 0.00136817914595693*G0_0_1_2_1_0 + 0.000205226871893506*G0_0_1_2_1_1 - 0.00335203890759447*G0_0_1_2_1_2 + 0.00335203890759444*G0_0_1_2_2_0 - 0.00335203890759447*G0_0_1_2_2_1 - 0.00461760461760469*G0_1_1_0_0_0 - 0.00766180321735877*G0_1_1_0_0_1 - 0.00126556571001016*G0_1_1_0_0_2 - 0.00766180321735877*G0_1_1_0_1_0 - 0.0308182352626797*G0_1_1_0_1_1 + 0.000102613435946763*G0_1_1_0_1_2 - 0.00126556571001016*G0_1_1_0_2_0 + 0.000102613435946763*G0_1_1_0_2_1 - 0.00335203890759444*G0_1_1_0_2_2 - 0.00766180321735877*G0_1_1_1_0_0 - 0.0308182352626797*G0_1_1_1_0_1 + 0.000102613435946763*G0_1_1_1_0_2 - 0.0308182352626797*G0_1_1_1_1_0 - 0.250376783710117*G0_1_1_1_1_1 + 0.0102955480733258*G0_1_1_1_1_2 + 0.000102613435946763*G0_1_1_1_2_0 + 0.0102955480733258*G0_1_1_1_2_1 + 0.00540430762652984*G0_1_1_1_2_2 - 0.00126556571001016*G0_1_1_2_0_0 + 0.000102613435946763*G0_1_1_2_0_1 - 0.00335203890759444*G0_1_1_2_0_2 + 0.000102613435946763*G0_1_1_2_1_0 + 0.0102955480733258*G0_1_1_2_1_1 + 0.00540430762652984*G0_1_1_2_1_2 - 0.00335203890759444*G0_1_1_2_2_0 + 0.00540430762652984*G0_1_1_2_2_1 - 0.0020522687189354*G0_1_1_2_2_2; + A[86] = A[170] - 0.00400192400192398*G0_0_1_0_0_0 - 0.00885895997007103*G0_0_1_0_0_1 - 0.000684089572978462*G0_0_1_0_0_2 - 0.00885895997007103*G0_0_1_0_1_0 - 0.0121425899203675*G0_0_1_0_1_1 + 0.000684089572978472*G0_0_1_0_1_2 - 0.000684089572978461*G0_0_1_0_2_0 + 0.000684089572978472*G0_0_1_0_2_1 - 0.00885895997007103*G0_0_1_1_0_0 - 0.0121425899203675*G0_0_1_1_0_1 + 0.000684089572978472*G0_0_1_1_0_2 - 0.0121425899203675*G0_0_1_1_1_0 + 0.0831168831168839*G0_0_1_1_1_1 - 0.00324942547164764*G0_0_1_1_1_2 + 0.000684089572978472*G0_0_1_1_2_0 - 0.00324942547164764*G0_0_1_1_2_1 + 0.000307840307840322*G0_0_1_1_2_2 - 0.000684089572978462*G0_0_1_2_0_0 + 0.000684089572978472*G0_0_1_2_0_1 + 0.000684089572978472*G0_0_1_2_1_0 - 0.00324942547164764*G0_0_1_2_1_1 + 0.000307840307840321*G0_0_1_2_1_2 + 0.000307840307840322*G0_0_1_2_2_1 - 0.00933782267115578*G0_0_1_2_2_2 + 0.00400192400192398*G0_1_0_0_0_0 + 0.00885895997007103*G0_1_0_0_0_1 + 0.000684089572978462*G0_1_0_0_0_2 + 0.00885895997007103*G0_1_0_0_1_0 + 0.0121425899203675*G0_1_0_0_1_1 - 0.000684089572978472*G0_1_0_0_1_2 + 0.000684089572978462*G0_1_0_0_2_0 - 0.000684089572978472*G0_1_0_0_2_1 + 0.00885895997007103*G0_1_0_1_0_0 + 0.0121425899203675*G0_1_0_1_0_1 - 0.000684089572978472*G0_1_0_1_0_2 + 0.0121425899203675*G0_1_0_1_1_0 - 0.0831168831168839*G0_1_0_1_1_1 + 0.00324942547164763*G0_1_0_1_1_2 - 0.000684089572978472*G0_1_0_1_2_0 + 0.00324942547164764*G0_1_0_1_2_1 - 0.000307840307840323*G0_1_0_1_2_2 + 0.000684089572978462*G0_1_0_2_0_0 - 0.000684089572978472*G0_1_0_2_0_1 - 0.000684089572978471*G0_1_0_2_1_0 + 0.00324942547164764*G0_1_0_2_1_1 - 0.000307840307840322*G0_1_0_2_1_2 - 0.000307840307840322*G0_1_0_2_2_1 + 0.00933782267115577*G0_1_0_2_2_2; + A[50] = -A[170] + 0.00461760461760457*G0_0_0_0_0_0 + 0.00126556571001013*G0_0_0_0_0_1 + 0.00766180321735871*G0_0_0_0_0_2 + 0.00126556571001014*G0_0_0_0_1_0 + 0.00335203890759441*G0_0_0_0_1_1 - 0.000102613435946775*G0_0_0_0_1_2 + 0.00766180321735871*G0_0_0_0_2_0 - 0.000102613435946775*G0_0_0_0_2_1 + 0.0308182352626795*G0_0_0_0_2_2 + 0.00126556571001013*G0_0_0_1_0_0 + 0.00335203890759441*G0_0_0_1_0_1 - 0.000102613435946775*G0_0_0_1_0_2 + 0.00335203890759441*G0_0_0_1_1_0 + 0.00205226871893545*G0_0_0_1_1_1 - 0.00540430762652981*G0_0_0_1_1_2 - 0.000102613435946775*G0_0_0_1_2_0 - 0.00540430762652981*G0_0_0_1_2_1 - 0.0102955480733258*G0_0_0_1_2_2 + 0.00766180321735871*G0_0_0_2_0_0 - 0.000102613435946775*G0_0_0_2_0_1 + 0.0308182352626795*G0_0_0_2_0_2 - 0.000102613435946775*G0_0_0_2_1_0 - 0.00540430762652981*G0_0_0_2_1_1 - 0.0102955480733258*G0_0_0_2_1_2 + 0.0308182352626795*G0_0_0_2_2_0 - 0.0102955480733258*G0_0_0_2_2_1 + 0.250376783710115*G0_0_0_2_2_2 + 0.00379669713003047*G0_0_1_0_0_0 + 0.00670407781518889*G0_0_1_0_0_1 - 0.00147079258190367*G0_0_1_0_0_2 + 0.00670407781518888*G0_0_1_0_1_0 + 0.00205226871893528*G0_0_1_0_1_1 - 0.0087563465341243*G0_0_1_0_1_2 - 0.00147079258190367*G0_0_1_0_2_0 - 0.0087563465341243*G0_0_1_0_2_1 - 0.0100903212014323*G0_0_1_0_2_2 + 0.00670407781518888*G0_0_1_1_0_0 + 0.00205226871893528*G0_0_1_1_0_1 - 0.0087563465341243*G0_0_1_1_0_2 + 0.00205226871893528*G0_0_1_1_1_0 - 0.166233766233767*G0_0_1_1_1_1 - 0.0389931056597723*G0_0_1_1_1_2 - 0.0087563465341243*G0_0_1_1_2_0 - 0.0389931056597723*G0_0_1_1_2_1 - 0.0425503714392602*G0_0_1_1_2_2 - 0.00147079258190367*G0_0_1_2_0_0 - 0.0087563465341243*G0_0_1_2_0_1 - 0.0100903212014323*G0_0_1_2_0_2 - 0.0087563465341243*G0_0_1_2_1_0 - 0.0389931056597723*G0_0_1_2_1_1 - 0.0425503714392602*G0_0_1_2_1_2 - 0.0100903212014323*G0_0_1_2_2_0 - 0.0425503714392602*G0_0_1_2_2_1 - 0.073779060445727*G0_0_1_2_2_2; + A[78] = -A[86] + 0.00461760461760457*G0_0_0_0_0_0 + 0.00126556571001013*G0_0_0_0_0_1 + 0.00766180321735871*G0_0_0_0_0_2 + 0.00126556571001014*G0_0_0_0_1_0 + 0.00335203890759441*G0_0_0_0_1_1 - 0.000102613435946775*G0_0_0_0_1_2 + 0.00766180321735871*G0_0_0_0_2_0 - 0.000102613435946775*G0_0_0_0_2_1 + 0.0308182352626795*G0_0_0_0_2_2 + 0.00126556571001014*G0_0_0_1_0_0 + 0.00335203890759441*G0_0_0_1_0_1 - 0.000102613435946775*G0_0_0_1_0_2 + 0.00335203890759441*G0_0_0_1_1_0 + 0.00205226871893545*G0_0_0_1_1_1 - 0.00540430762652981*G0_0_0_1_1_2 - 0.000102613435946775*G0_0_0_1_2_0 - 0.00540430762652981*G0_0_0_1_2_1 - 0.0102955480733258*G0_0_0_1_2_2 + 0.00766180321735871*G0_0_0_2_0_0 - 0.000102613435946775*G0_0_0_2_0_1 + 0.0308182352626795*G0_0_0_2_0_2 - 0.000102613435946775*G0_0_0_2_1_0 - 0.00540430762652981*G0_0_0_2_1_1 - 0.0102955480733258*G0_0_0_2_1_2 + 0.0308182352626795*G0_0_0_2_2_0 - 0.0102955480733258*G0_0_0_2_2_1 + 0.250376783710115*G0_0_0_2_2_2 + 0.00379669713003047*G0_1_0_0_0_0 + 0.00670407781518889*G0_1_0_0_0_1 - 0.00147079258190367*G0_1_0_0_0_2 + 0.00670407781518888*G0_1_0_0_1_0 + 0.00205226871893528*G0_1_0_0_1_1 - 0.0087563465341243*G0_1_0_0_1_2 - 0.00147079258190367*G0_1_0_0_2_0 - 0.0087563465341243*G0_1_0_0_2_1 - 0.0100903212014323*G0_1_0_0_2_2 + 0.00670407781518888*G0_1_0_1_0_0 + 0.00205226871893528*G0_1_0_1_0_1 - 0.0087563465341243*G0_1_0_1_0_2 + 0.00205226871893528*G0_1_0_1_1_0 - 0.166233766233767*G0_1_0_1_1_1 - 0.0389931056597723*G0_1_0_1_1_2 - 0.0087563465341243*G0_1_0_1_2_0 - 0.0389931056597723*G0_1_0_1_2_1 - 0.0425503714392602*G0_1_0_1_2_2 - 0.00147079258190367*G0_1_0_2_0_0 - 0.0087563465341243*G0_1_0_2_0_1 - 0.0100903212014323*G0_1_0_2_0_2 - 0.0087563465341243*G0_1_0_2_1_0 - 0.0389931056597723*G0_1_0_2_1_1 - 0.0425503714392602*G0_1_0_2_1_2 - 0.0100903212014323*G0_1_0_2_2_0 - 0.0425503714392602*G0_1_0_2_2_1 - 0.073779060445727*G0_1_0_2_2_2; + A[138] = -A[78] + 0.0368382235048901*G0_0_0_0_0_0 + 0.00796964352519906*G0_0_0_0_0_1 + 0.0138870183314627*G0_0_0_0_0_2 + 0.00796964352519906*G0_0_0_0_1_0 + 0.0103297525519747*G0_0_0_0_1_1 + 0.00201806424028645*G0_0_0_0_1_2 + 0.0138870183314627*G0_0_0_0_2_0 + 0.00201806424028645*G0_0_0_0_2_1 + 0.0292448292448291*G0_0_0_0_2_2 + 0.00796964352519906*G0_0_0_1_0_0 + 0.0103297525519747*G0_0_0_1_0_1 + 0.00201806424028645*G0_0_0_1_0_2 + 0.0103297525519747*G0_0_0_1_1_0 - 0.109796376463042*G0_0_0_1_1_1 - 0.0359831115386669*G0_0_0_1_1_2 + 0.00201806424028645*G0_0_0_1_2_0 - 0.0359831115386669*G0_0_0_1_2_1 - 0.0202148468815135*G0_0_0_1_2_2 + 0.0138870183314627*G0_0_0_2_0_0 + 0.00201806424028645*G0_0_0_2_0_1 + 0.0292448292448291*G0_0_0_2_0_2 + 0.00201806424028645*G0_0_0_2_1_0 - 0.0359831115386669*G0_0_0_2_1_1 - 0.0202148468815135*G0_0_0_2_1_2 + 0.0292448292448291*G0_0_0_2_2_0 - 0.0202148468815135*G0_0_0_2_2_1 + 0.24832451499118*G0_0_0_2_2_2 + 0.0171364438031106*G0_0_1_0_0_0 + 0.00779862113195443*G0_0_1_0_0_1 + 0.00215488215488216*G0_0_1_0_0_2 + 0.00779862113195444*G0_0_1_0_1_0 + 0.0133397466730799*G0_0_1_0_1_1 + 0.00143658810325476*G0_0_1_0_1_2 + 0.00215488215488216*G0_0_1_0_2_0 + 0.00143658810325476*G0_0_1_0_2_1 + 0.0031810165143498*G0_0_1_0_2_2 + 0.00779862113195444*G0_0_1_1_0_0 + 0.0133397466730799*G0_0_1_1_0_1 + 0.00143658810325476*G0_0_1_1_0_2 + 0.0133397466730799*G0_0_1_1_1_0 - 0.194965528298861*G0_0_1_1_1_1 - 0.0215488215488215*G0_0_1_1_1_2 + 0.00143658810325476*G0_0_1_1_2_0 - 0.0215488215488215*G0_0_1_1_2_1 - 0.00246272246272249*G0_0_1_1_2_2 + 0.00215488215488216*G0_0_1_2_0_0 + 0.00143658810325476*G0_0_1_2_0_1 + 0.0031810165143498*G0_0_1_2_0_2 + 0.00143658810325476*G0_0_1_2_1_0 - 0.0215488215488215*G0_0_1_2_1_1 - 0.00246272246272249*G0_0_1_2_1_2 + 0.0031810165143498*G0_0_1_2_2_0 - 0.00246272246272249*G0_0_1_2_2_1 + 0.026371653038319*G0_0_1_2_2_2 + 0.00759339426006091*G0_1_0_0_0_0 + 0.00595157928491259*G0_1_0_0_0_1 + 0.00595157928491259*G0_1_0_0_1_0 - 0.00595157928491261*G0_1_0_0_1_2 - 0.00595157928491261*G0_1_0_0_2_1 - 0.00759339426006091*G0_1_0_0_2_2 + 0.00595157928491259*G0_1_0_1_0_0 - 0.00595157928491261*G0_1_0_1_0_2 - 0.194965528298861*G0_1_0_1_1_1 - 0.075933942600609*G0_1_0_1_1_2 - 0.00595157928491261*G0_1_0_1_2_0 - 0.075933942600609*G0_1_0_1_2_1 - 0.0535642135642134*G0_1_0_1_2_2 - 0.00595157928491261*G0_1_0_2_0_1 - 0.00759339426006091*G0_1_0_2_0_2 - 0.00595157928491261*G0_1_0_2_1_0 - 0.075933942600609*G0_1_0_2_1_1 - 0.0535642135642134*G0_1_0_2_1_2 - 0.00759339426006091*G0_1_0_2_2_0 - 0.0535642135642134*G0_1_0_2_2_1 - 0.0607471540804872*G0_1_0_2_2_2 - 0.00923520923520925*G0_1_1_0_0_0 + 0.0102613435946769*G0_1_1_0_0_1 - 0.00102613435946769*G0_1_1_0_0_2 + 0.0102613435946769*G0_1_1_0_1_0 + 0.0348885682219014*G0_1_1_0_1_1 - 0.00102613435946769*G0_1_1_0_2_0 + 0.00102613435946767*G0_1_1_0_2_2 + 0.0102613435946769*G0_1_1_1_0_0 + 0.0348885682219014*G0_1_1_1_0_1 + 0.0348885682219014*G0_1_1_1_1_0 - 0.0348885682219014*G0_1_1_1_1_2 - 0.0348885682219014*G0_1_1_1_2_1 - 0.0102613435946769*G0_1_1_1_2_2 - 0.00102613435946769*G0_1_1_2_0_0 + 0.00102613435946767*G0_1_1_2_0_2 - 0.0348885682219014*G0_1_1_2_1_1 - 0.0102613435946769*G0_1_1_2_1_2 + 0.00102613435946767*G0_1_1_2_2_0 - 0.0102613435946769*G0_1_1_2_2_1 + 0.00923520923520895*G0_1_1_2_2_2; + A[146] = -A[138] + 0.324155844155843*G0_0_0_0_0_0 + 0.0322548233659344*G0_0_0_0_0_1 + 0.0409085564641118*G0_0_0_0_0_2 + 0.0322548233659344*G0_0_0_0_1_0 + 0.0335887980332424*G0_0_0_0_1_1 + 0.00865373309817751*G0_0_0_0_1_2 + 0.0409085564641118*G0_0_0_0_2_0 + 0.00865373309817751*G0_0_0_0_2_1 + 0.0091325957992624*G0_0_0_0_2_2 + 0.0322548233659344*G0_0_0_1_0_0 + 0.0335887980332424*G0_0_0_1_0_1 + 0.00865373309817751*G0_0_0_1_0_2 + 0.0335887980332424*G0_0_0_1_1_0 + 0.168286034952701*G0_0_0_1_1_1 + 0.00129977018865908*G0_0_0_1_1_2 + 0.00865373309817751*G0_0_0_1_2_0 + 0.00129977018865908*G0_0_0_1_2_1 - 0.00543851210517876*G0_0_0_1_2_2 + 0.0409085564641118*G0_0_0_2_0_0 + 0.00865373309817751*G0_0_0_2_0_1 + 0.0091325957992624*G0_0_0_2_0_2 + 0.00865373309817751*G0_0_0_2_1_0 + 0.00129977018865907*G0_0_0_2_1_1 - 0.00543851210517875*G0_0_0_2_1_2 + 0.0091325957992624*G0_0_0_2_2_0 - 0.00543851210517875*G0_0_0_2_2_1 + 0.000820907487574179*G0_0_0_2_2_2 + 0.0737790604457267*G0_1_0_0_0_0 + 0.0425503714392601*G0_1_0_0_0_1 + 0.0100903212014323*G0_1_0_0_0_2 + 0.0425503714392601*G0_1_0_0_1_0 + 0.0389931056597721*G0_1_0_0_1_1 + 0.00875634653412427*G0_1_0_0_1_2 + 0.0100903212014323*G0_1_0_0_2_0 + 0.00875634653412428*G0_1_0_0_2_1 + 0.0014707925819037*G0_1_0_0_2_2 + 0.0425503714392601*G0_1_0_1_0_0 + 0.0389931056597721*G0_1_0_1_0_1 + 0.00875634653412427*G0_1_0_1_0_2 + 0.0389931056597721*G0_1_0_1_1_0 + 0.166233766233765*G0_1_0_1_1_1 - 0.00205226871893543*G0_1_0_1_1_2 + 0.00875634653412427*G0_1_0_1_2_0 - 0.00205226871893542*G0_1_0_1_2_1 - 0.00670407781518891*G0_1_0_1_2_2 + 0.0100903212014323*G0_1_0_2_0_0 + 0.00875634653412427*G0_1_0_2_0_1 + 0.0014707925819037*G0_1_0_2_0_2 + 0.00875634653412427*G0_1_0_2_1_0 - 0.00205226871893542*G0_1_0_2_1_1 - 0.00670407781518891*G0_1_0_2_1_2 + 0.0014707925819037*G0_1_0_2_2_0 - 0.00670407781518891*G0_1_0_2_2_1 - 0.00379669713003035*G0_1_0_2_2_2; + A[126] = A[146] - 0.278082411415744*G0_0_0_0_0_0 - 0.0232590454812676*G0_0_0_0_0_1 - 0.037282881727326*G0_0_0_0_0_2 - 0.0232590454812676*G0_0_0_0_1_0 - 0.0242851798407353*G0_0_0_0_1_1 - 0.00663566885789105*G0_0_0_0_1_2 - 0.037282881727326*G0_0_0_0_2_0 - 0.00663566885789105*G0_0_0_0_2_1 - 0.0147763347763348*G0_0_0_0_2_2 - 0.0232590454812676*G0_0_0_1_0_0 - 0.0242851798407353*G0_0_0_1_0_1 - 0.00663566885789105*G0_0_0_1_0_2 - 0.0242851798407353*G0_0_0_1_1_0 - 0.287317620650953*G0_0_0_1_1_1 - 0.0270215381326491*G0_0_0_1_1_2 - 0.00663566885789106*G0_0_0_1_2_0 - 0.0270215381326491*G0_0_0_1_2_1 + 0.0201122334455666*G0_0_0_1_2_2 - 0.037282881727326*G0_0_0_2_0_0 - 0.00663566885789105*G0_0_0_2_0_1 - 0.0147763347763348*G0_0_0_2_0_2 - 0.00663566885789105*G0_0_0_2_1_0 - 0.0270215381326491*G0_0_0_2_1_1 + 0.0201122334455666*G0_0_0_2_1_2 - 0.0147763347763348*G0_0_0_2_2_0 + 0.0201122334455666*G0_0_0_2_2_1 + 0.247503607503605*G0_0_0_2_2_2 + 0.00564373897707232*G0_0_1_0_0_1 - 0.00564373897707227*G0_0_1_0_0_2 + 0.00564373897707232*G0_0_1_0_1_0 + 0.0101587301587301*G0_0_1_0_1_1 - 0.00564373897707227*G0_0_1_0_2_0 - 0.0101587301587301*G0_0_1_0_2_2 + 0.00564373897707232*G0_0_1_1_0_0 + 0.0101587301587301*G0_0_1_1_0_1 + 0.0101587301587301*G0_0_1_1_1_0 - 0.22133718133718*G0_0_1_1_1_1 - 0.019086099086099*G0_0_1_1_1_2 - 0.019086099086099*G0_0_1_1_2_1 + 0.019086099086099*G0_0_1_1_2_2 - 0.00564373897707227*G0_0_1_2_0_0 - 0.0101587301587301*G0_0_1_2_0_2 - 0.019086099086099*G0_0_1_2_1_1 + 0.019086099086099*G0_0_1_2_1_2 - 0.0101587301587301*G0_0_1_2_2_0 + 0.019086099086099*G0_0_1_2_2_1 + 0.22133718133718*G0_0_1_2_2_2 - 0.0265084709529152*G0_1_0_0_0_1 + 0.0265084709529153*G0_1_0_0_0_2 - 0.0265084709529152*G0_1_0_0_1_0 - 0.0299289188178075*G0_1_0_0_1_1 + 0.0265084709529153*G0_1_0_0_2_0 + 0.0299289188178076*G0_1_0_0_2_2 - 0.0265084709529152*G0_1_0_1_0_0 - 0.0299289188178075*G0_1_0_1_0_1 - 0.0299289188178075*G0_1_0_1_1_0 - 0.304248837582169*G0_1_0_1_1_1 - 0.027021538132649*G0_1_0_1_1_2 - 0.027021538132649*G0_1_0_1_2_1 + 0.0270215381326491*G0_1_0_1_2_2 + 0.0265084709529153*G0_1_0_2_0_0 + 0.0299289188178076*G0_1_0_2_0_2 - 0.027021538132649*G0_1_0_2_1_1 + 0.0270215381326491*G0_1_0_2_1_2 + 0.0299289188178076*G0_1_0_2_2_0 + 0.0270215381326491*G0_1_0_2_2_1 + 0.304248837582169*G0_1_0_2_2_2 + 0.278082411415744*G0_1_1_0_0_0 + 0.037282881727326*G0_1_1_0_0_1 + 0.0232590454812676*G0_1_1_0_0_2 + 0.037282881727326*G0_1_1_0_1_0 + 0.0147763347763347*G0_1_1_0_1_1 + 0.00663566885789106*G0_1_1_0_1_2 + 0.0232590454812676*G0_1_1_0_2_0 + 0.00663566885789106*G0_1_1_0_2_1 + 0.0242851798407353*G0_1_1_0_2_2 + 0.037282881727326*G0_1_1_1_0_0 + 0.0147763347763347*G0_1_1_1_0_1 + 0.00663566885789106*G0_1_1_1_0_2 + 0.0147763347763347*G0_1_1_1_1_0 - 0.247503607503606*G0_1_1_1_1_1 - 0.0201122334455666*G0_1_1_1_1_2 + 0.00663566885789106*G0_1_1_1_2_0 - 0.0201122334455666*G0_1_1_1_2_1 + 0.0270215381326491*G0_1_1_1_2_2 + 0.0232590454812676*G0_1_1_2_0_0 + 0.00663566885789106*G0_1_1_2_0_1 + 0.0242851798407353*G0_1_1_2_0_2 + 0.00663566885789106*G0_1_1_2_1_0 - 0.0201122334455666*G0_1_1_2_1_1 + 0.0270215381326491*G0_1_1_2_1_2 + 0.0242851798407353*G0_1_1_2_2_0 + 0.0270215381326491*G0_1_1_2_2_1 + 0.287317620650953*G0_1_1_2_2_2; + A[54] = A[138] - 0.00933782267115614*G0_0_1_0_0_0 + 0.000307840307840299*G0_0_1_0_0_1 + 0.000307840307840296*G0_0_1_0_1_0 - 0.00324942547164766*G0_0_1_0_1_1 + 0.00068408957297846*G0_0_1_0_1_2 + 0.00068408957297846*G0_0_1_0_2_1 - 0.000684089572978449*G0_0_1_0_2_2 + 0.000307840307840296*G0_0_1_1_0_0 - 0.00324942547164766*G0_0_1_1_0_1 + 0.000684089572978461*G0_0_1_1_0_2 - 0.00324942547164766*G0_0_1_1_1_0 + 0.0831168831168832*G0_0_1_1_1_1 - 0.0121425899203676*G0_0_1_1_1_2 + 0.00068408957297846*G0_0_1_1_2_0 - 0.0121425899203676*G0_0_1_1_2_1 - 0.00885895997007104*G0_0_1_1_2_2 + 0.00068408957297846*G0_0_1_2_0_1 - 0.000684089572978449*G0_0_1_2_0_2 + 0.000684089572978461*G0_0_1_2_1_0 - 0.0121425899203676*G0_0_1_2_1_1 - 0.00885895997007104*G0_0_1_2_1_2 - 0.000684089572978449*G0_0_1_2_2_0 - 0.00885895997007104*G0_0_1_2_2_1 - 0.00400192400192389*G0_0_1_2_2_2 + 0.00933782267115614*G0_1_0_0_0_0 - 0.000307840307840299*G0_1_0_0_0_1 - 0.000307840307840294*G0_1_0_0_1_0 + 0.00324942547164766*G0_1_0_0_1_1 - 0.000684089572978461*G0_1_0_0_1_2 - 0.000684089572978461*G0_1_0_0_2_1 + 0.000684089572978449*G0_1_0_0_2_2 - 0.000307840307840296*G0_1_0_1_0_0 + 0.00324942547164766*G0_1_0_1_0_1 - 0.000684089572978461*G0_1_0_1_0_2 + 0.00324942547164767*G0_1_0_1_1_0 - 0.0831168831168833*G0_1_0_1_1_1 + 0.0121425899203676*G0_1_0_1_1_2 - 0.000684089572978461*G0_1_0_1_2_0 + 0.0121425899203676*G0_1_0_1_2_1 + 0.00885895997007104*G0_1_0_1_2_2 - 0.000684089572978461*G0_1_0_2_0_1 + 0.00068408957297845*G0_1_0_2_0_2 - 0.000684089572978461*G0_1_0_2_1_0 + 0.0121425899203676*G0_1_0_2_1_1 + 0.00885895997007104*G0_1_0_2_1_2 + 0.000684089572978449*G0_1_0_2_2_0 + 0.00885895997007104*G0_1_0_2_2_1 + 0.00400192400192389*G0_1_0_2_2_2; + A[174] = -A[54] + 0.324155844155843*G0_0_0_0_0_0 + 0.0322548233659344*G0_0_0_0_0_1 + 0.0409085564641118*G0_0_0_0_0_2 + 0.0322548233659344*G0_0_0_0_1_0 + 0.0335887980332424*G0_0_0_0_1_1 + 0.00865373309817751*G0_0_0_0_1_2 + 0.0409085564641118*G0_0_0_0_2_0 + 0.00865373309817751*G0_0_0_0_2_1 + 0.0091325957992624*G0_0_0_0_2_2 + 0.0322548233659344*G0_0_0_1_0_0 + 0.0335887980332424*G0_0_0_1_0_1 + 0.00865373309817751*G0_0_0_1_0_2 + 0.0335887980332424*G0_0_0_1_1_0 + 0.168286034952701*G0_0_0_1_1_1 + 0.00129977018865907*G0_0_0_1_1_2 + 0.00865373309817751*G0_0_0_1_2_0 + 0.00129977018865908*G0_0_0_1_2_1 - 0.00543851210517875*G0_0_0_1_2_2 + 0.0409085564641118*G0_0_0_2_0_0 + 0.00865373309817751*G0_0_0_2_0_1 + 0.0091325957992624*G0_0_0_2_0_2 + 0.00865373309817751*G0_0_0_2_1_0 + 0.00129977018865908*G0_0_0_2_1_1 - 0.00543851210517876*G0_0_0_2_1_2 + 0.0091325957992624*G0_0_0_2_2_0 - 0.00543851210517875*G0_0_0_2_2_1 + 0.000820907487574181*G0_0_0_2_2_2 + 0.0737790604457267*G0_0_1_0_0_0 + 0.0425503714392601*G0_0_1_0_0_1 + 0.0100903212014323*G0_0_1_0_0_2 + 0.0425503714392601*G0_0_1_0_1_0 + 0.0389931056597721*G0_0_1_0_1_1 + 0.00875634653412427*G0_0_1_0_1_2 + 0.0100903212014323*G0_0_1_0_2_0 + 0.00875634653412428*G0_0_1_0_2_1 + 0.0014707925819037*G0_0_1_0_2_2 + 0.0425503714392601*G0_0_1_1_0_0 + 0.0389931056597721*G0_0_1_1_0_1 + 0.00875634653412427*G0_0_1_1_0_2 + 0.0389931056597721*G0_0_1_1_1_0 + 0.166233766233765*G0_0_1_1_1_1 - 0.00205226871893542*G0_0_1_1_1_2 + 0.00875634653412427*G0_0_1_1_2_0 - 0.00205226871893542*G0_0_1_1_2_1 - 0.00670407781518891*G0_0_1_1_2_2 + 0.0100903212014323*G0_0_1_2_0_0 + 0.00875634653412427*G0_0_1_2_0_1 + 0.0014707925819037*G0_0_1_2_0_2 + 0.00875634653412427*G0_0_1_2_1_0 - 0.00205226871893542*G0_0_1_2_1_1 - 0.00670407781518891*G0_0_1_2_1_2 + 0.0014707925819037*G0_0_1_2_2_0 - 0.00670407781518891*G0_0_1_2_2_1 - 0.00379669713003035*G0_0_1_2_2_2; + A[98] = A[126] + 0.083116883116883*G0_0_1_0_0_0 + 0.0100903212014323*G0_0_1_0_0_1 + 0.0422425311314199*G0_0_1_0_0_2 + 0.0100903212014323*G0_0_1_0_1_0 + 0.00215488215488217*G0_0_1_0_1_1 + 0.00807225696114583*G0_0_1_0_1_2 + 0.0422425311314199*G0_0_1_0_2_0 + 0.00807225696114583*G0_0_1_0_2_1 + 0.0422425311314199*G0_0_1_0_2_2 + 0.0100903212014323*G0_0_1_1_0_0 + 0.00215488215488217*G0_0_1_1_0_1 + 0.00807225696114583*G0_0_1_1_0_2 + 0.00215488215488217*G0_0_1_1_1_0 + 0.000205226871893597*G0_0_1_1_1_1 + 0.00215488215488217*G0_0_1_1_1_2 + 0.00807225696114583*G0_0_1_1_2_0 + 0.00215488215488217*G0_0_1_1_2_1 + 0.0100903212014323*G0_0_1_1_2_2 + 0.0422425311314199*G0_0_1_2_0_0 + 0.00807225696114583*G0_0_1_2_0_1 + 0.0422425311314199*G0_0_1_2_0_2 + 0.00807225696114583*G0_0_1_2_1_0 + 0.00215488215488217*G0_0_1_2_1_1 + 0.0100903212014323*G0_0_1_2_1_2 + 0.0422425311314199*G0_0_1_2_2_0 + 0.0100903212014323*G0_0_1_2_2_1 + 0.0831168831168823*G0_0_1_2_2_2 - 0.083116883116883*G0_1_0_0_0_0 - 0.0100903212014323*G0_1_0_0_0_1 - 0.0422425311314199*G0_1_0_0_0_2 - 0.0100903212014323*G0_1_0_0_1_0 - 0.00215488215488217*G0_1_0_0_1_1 - 0.00807225696114583*G0_1_0_0_1_2 - 0.0422425311314199*G0_1_0_0_2_0 - 0.00807225696114583*G0_1_0_0_2_1 - 0.0422425311314199*G0_1_0_0_2_2 - 0.0100903212014323*G0_1_0_1_0_0 - 0.00215488215488218*G0_1_0_1_0_1 - 0.00807225696114583*G0_1_0_1_0_2 - 0.00215488215488217*G0_1_0_1_1_0 - 0.000205226871893598*G0_1_0_1_1_1 - 0.00215488215488217*G0_1_0_1_1_2 - 0.00807225696114583*G0_1_0_1_2_0 - 0.00215488215488217*G0_1_0_1_2_1 - 0.0100903212014323*G0_1_0_1_2_2 - 0.0422425311314199*G0_1_0_2_0_0 - 0.00807225696114583*G0_1_0_2_0_1 - 0.0422425311314199*G0_1_0_2_0_2 - 0.00807225696114583*G0_1_0_2_1_0 - 0.00215488215488217*G0_1_0_2_1_1 - 0.0100903212014323*G0_1_0_2_1_2 - 0.0422425311314199*G0_1_0_2_2_0 - 0.0100903212014323*G0_1_0_2_2_1 - 0.0831168831168823*G0_1_0_2_2_2; + A[95] = -A[98] + 0.0737790604457271*G0_0_1_0_0_0 + 0.0100903212014324*G0_0_1_0_0_1 + 0.0425503714392602*G0_0_1_0_0_2 + 0.0100903212014324*G0_0_1_0_1_0 + 0.00147079258190377*G0_0_1_0_1_1 + 0.0087563465341243*G0_0_1_0_1_2 + 0.0425503714392602*G0_0_1_0_2_0 + 0.0087563465341243*G0_0_1_0_2_1 + 0.0389931056597722*G0_0_1_0_2_2 + 0.0100903212014324*G0_0_1_1_0_0 + 0.00147079258190377*G0_0_1_1_0_1 + 0.00875634653412429*G0_0_1_1_0_2 + 0.00147079258190377*G0_0_1_1_1_0 - 0.00379669713003014*G0_0_1_1_1_1 - 0.00670407781518883*G0_0_1_1_1_2 + 0.0087563465341243*G0_0_1_1_2_0 - 0.00670407781518883*G0_0_1_1_2_1 - 0.00205226871893533*G0_0_1_1_2_2 + 0.0425503714392602*G0_0_1_2_0_0 + 0.00875634653412429*G0_0_1_2_0_1 + 0.0389931056597722*G0_0_1_2_0_2 + 0.0087563465341243*G0_0_1_2_1_0 - 0.00670407781518883*G0_0_1_2_1_1 - 0.00205226871893533*G0_0_1_2_1_2 + 0.0389931056597722*G0_0_1_2_2_0 - 0.00205226871893533*G0_0_1_2_2_1 + 0.166233766233765*G0_0_1_2_2_2 + 0.324155844155842*G0_1_1_0_0_0 + 0.0409085564641118*G0_1_1_0_0_1 + 0.0322548233659343*G0_1_1_0_0_2 + 0.0409085564641118*G0_1_1_0_1_0 + 0.00913259579926246*G0_1_1_0_1_1 + 0.00865373309817752*G0_1_1_0_1_2 + 0.0322548233659343*G0_1_1_0_2_0 + 0.00865373309817752*G0_1_1_0_2_1 + 0.0335887980332424*G0_1_1_0_2_2 + 0.0409085564641118*G0_1_1_1_0_0 + 0.00913259579926246*G0_1_1_1_0_1 + 0.00865373309817752*G0_1_1_1_0_2 + 0.00913259579926246*G0_1_1_1_1_0 + 0.000820907487574334*G0_1_1_1_1_1 - 0.00543851210517868*G0_1_1_1_1_2 + 0.00865373309817752*G0_1_1_1_2_0 - 0.00543851210517868*G0_1_1_1_2_1 + 0.00129977018865918*G0_1_1_1_2_2 + 0.0322548233659343*G0_1_1_2_0_0 + 0.00865373309817752*G0_1_1_2_0_1 + 0.0335887980332424*G0_1_1_2_0_2 + 0.00865373309817752*G0_1_1_2_1_0 - 0.00543851210517869*G0_1_1_2_1_1 + 0.00129977018865918*G0_1_1_2_1_2 + 0.0335887980332424*G0_1_1_2_2_0 + 0.00129977018865918*G0_1_1_2_2_1 + 0.168286034952701*G0_1_1_2_2_2; + A[217] = A[119] + 0.0688023088023093*G0_0_1_0_0_0 + 0.0173160173160173*G0_0_1_0_0_1 - 0.00484848484848495*G0_0_1_0_0_2 + 0.0173160173160173*G0_0_1_0_1_0 + 0.0116209716209716*G0_0_1_0_1_1 + 0.00831168831168827*G0_0_1_0_1_2 - 0.00484848484848495*G0_0_1_0_2_0 + 0.00831168831168827*G0_0_1_0_2_1 - 0.0711880711880712*G0_0_1_0_2_2 + 0.0173160173160173*G0_0_1_1_0_0 + 0.0116209716209716*G0_0_1_1_0_1 + 0.00831168831168827*G0_0_1_1_0_2 + 0.0116209716209716*G0_0_1_1_1_0 + 0.0175468975468973*G0_0_1_1_1_1 + 0.0182395382395382*G0_0_1_1_1_2 + 0.00831168831168826*G0_0_1_1_2_0 + 0.0182395382395382*G0_0_1_1_2_1 + 0.0242424242424241*G0_0_1_1_2_2 - 0.00484848484848494*G0_0_1_2_0_0 + 0.00831168831168827*G0_0_1_2_0_1 - 0.0711880711880712*G0_0_1_2_0_2 + 0.00831168831168826*G0_0_1_2_1_0 + 0.0182395382395382*G0_0_1_2_1_1 + 0.0242424242424241*G0_0_1_2_1_2 - 0.0711880711880712*G0_0_1_2_2_0 + 0.0242424242424241*G0_0_1_2_2_1 - 0.122366522366523*G0_0_1_2_2_2 - 0.0688023088023093*G0_1_0_0_0_0 - 0.0173160173160173*G0_1_0_0_0_1 + 0.00484848484848494*G0_1_0_0_0_2 - 0.0173160173160173*G0_1_0_0_1_0 - 0.0116209716209716*G0_1_0_0_1_1 - 0.00831168831168827*G0_1_0_0_1_2 + 0.00484848484848492*G0_1_0_0_2_0 - 0.00831168831168827*G0_1_0_0_2_1 + 0.0711880711880712*G0_1_0_0_2_2 - 0.0173160173160173*G0_1_0_1_0_0 - 0.0116209716209716*G0_1_0_1_0_1 - 0.00831168831168827*G0_1_0_1_0_2 - 0.0116209716209716*G0_1_0_1_1_0 - 0.0175468975468973*G0_1_0_1_1_1 - 0.0182395382395382*G0_1_0_1_1_2 - 0.00831168831168827*G0_1_0_1_2_0 - 0.0182395382395382*G0_1_0_1_2_1 - 0.0242424242424241*G0_1_0_1_2_2 + 0.00484848484848494*G0_1_0_2_0_0 - 0.00831168831168827*G0_1_0_2_0_1 + 0.0711880711880712*G0_1_0_2_0_2 - 0.00831168831168827*G0_1_0_2_1_0 - 0.0182395382395382*G0_1_0_2_1_1 - 0.0242424242424241*G0_1_0_2_1_2 + 0.0711880711880712*G0_1_0_2_2_0 - 0.0242424242424241*G0_1_0_2_2_1 + 0.122366522366523*G0_1_0_2_2_2; + A[22] = A[106] - 0.00237614237614217*G0_0_1_0_0_0 - 0.000314253647586967*G0_0_1_0_0_1 - 0.00253006253006249*G0_0_1_0_0_2 - 0.000314253647586967*G0_0_1_0_1_0 + 0.000420073753407065*G0_0_1_0_1_1 - 0.00253006253006249*G0_0_1_0_2_0 + 0.00253006253006252*G0_0_1_0_2_2 - 0.000314253647586967*G0_0_1_1_0_0 + 0.000420073753407065*G0_0_1_1_0_1 + 0.000420073753407065*G0_0_1_1_1_0 - 0.000420073753407094*G0_0_1_1_1_2 - 0.000420073753407094*G0_0_1_1_2_1 + 0.000314253647586961*G0_0_1_1_2_2 - 0.00253006253006249*G0_0_1_2_0_0 + 0.00253006253006252*G0_0_1_2_0_2 - 0.000420073753407094*G0_0_1_2_1_1 + 0.000314253647586961*G0_0_1_2_1_2 + 0.00253006253006253*G0_0_1_2_2_0 + 0.000314253647586961*G0_0_1_2_2_1 + 0.00237614237614225*G0_0_1_2_2_2 + 0.00237614237614217*G0_1_0_0_0_0 + 0.000314253647586966*G0_1_0_0_0_1 + 0.00253006253006249*G0_1_0_0_0_2 + 0.000314253647586967*G0_1_0_0_1_0 - 0.000420073753407065*G0_1_0_0_1_1 + 0.00253006253006249*G0_1_0_0_2_0 - 0.00253006253006252*G0_1_0_0_2_2 + 0.000314253647586967*G0_1_0_1_0_0 - 0.000420073753407065*G0_1_0_1_0_1 - 0.000420073753407065*G0_1_0_1_1_0 + 0.000420073753407094*G0_1_0_1_1_2 + 0.000420073753407094*G0_1_0_1_2_1 - 0.000314253647586961*G0_1_0_1_2_2 + 0.00253006253006249*G0_1_0_2_0_0 - 0.00253006253006252*G0_1_0_2_0_2 + 0.000420073753407094*G0_1_0_2_1_1 - 0.000314253647586961*G0_1_0_2_1_2 - 0.00253006253006252*G0_1_0_2_2_0 - 0.000314253647586961*G0_1_0_2_2_1 - 0.00237614237614225*G0_1_0_2_2_2; + A[9] = A[135] + 0.541029341029339*G0_0_1_0_0_0 + 0.0335417668751001*G0_0_1_0_0_1 + 0.0335417668751*G0_0_1_0_0_2 + 0.0335417668751001*G0_0_1_0_1_0 + 0.00397627064293729*G0_0_1_0_1_1 + 0.00198813532146864*G0_0_1_0_1_2 + 0.0335417668751*G0_0_1_0_2_0 + 0.00198813532146864*G0_0_1_0_2_1 + 0.00397627064293729*G0_0_1_0_2_2 + 0.0335417668751001*G0_0_1_1_0_0 + 0.00397627064293729*G0_0_1_1_0_1 + 0.00198813532146864*G0_0_1_1_0_2 + 0.00397627064293729*G0_0_1_1_1_0 + 0.000192400192400168*G0_0_1_1_1_1 + 0.00198813532146864*G0_0_1_1_2_0 + 0.0335417668751*G0_0_1_2_0_0 + 0.00198813532146864*G0_0_1_2_0_1 + 0.00397627064293729*G0_0_1_2_0_2 + 0.00198813532146864*G0_0_1_2_1_0 + 0.00397627064293729*G0_0_1_2_2_0 + 0.000192400192400168*G0_0_1_2_2_2 - 0.541029341029339*G0_1_0_0_0_0 - 0.0335417668751001*G0_1_0_0_0_1 - 0.0335417668751*G0_1_0_0_0_2 - 0.0335417668751001*G0_1_0_0_1_0 - 0.00397627064293729*G0_1_0_0_1_1 - 0.00198813532146864*G0_1_0_0_1_2 - 0.0335417668751*G0_1_0_0_2_0 - 0.00198813532146864*G0_1_0_0_2_1 - 0.00397627064293729*G0_1_0_0_2_2 - 0.0335417668751001*G0_1_0_1_0_0 - 0.00397627064293729*G0_1_0_1_0_1 - 0.00198813532146864*G0_1_0_1_0_2 - 0.00397627064293729*G0_1_0_1_1_0 - 0.000192400192400168*G0_1_0_1_1_1 - 0.00198813532146864*G0_1_0_1_2_0 - 0.0335417668751*G0_1_0_2_0_0 - 0.00198813532146864*G0_1_0_2_0_1 - 0.00397627064293729*G0_1_0_2_0_2 - 0.00198813532146864*G0_1_0_2_1_0 - 0.00397627064293729*G0_1_0_2_2_0 - 0.000192400192400168*G0_1_0_2_2_2; + A[90] = A[9] + 0.541029341029339*G0_0_0_0_0_0 + 0.0256961145850034*G0_0_0_0_0_1 + 0.0413874191651967*G0_0_0_0_0_2 + 0.0256961145850034*G0_0_0_0_1_0 + 0.00547271658382766*G0_0_0_0_1_1 + 0.00198813532146864*G0_0_0_0_1_2 + 0.0413874191651967*G0_0_0_0_2_0 + 0.00198813532146864*G0_0_0_0_2_1 + 0.0024798247020469*G0_0_0_0_2_2 + 0.0256961145850034*G0_0_0_1_0_0 + 0.00547271658382766*G0_0_0_1_0_1 + 0.00198813532146864*G0_0_0_1_0_2 + 0.00547271658382766*G0_0_0_1_1_0 + 0.0267821067821066*G0_0_0_1_1_1 + 0.00301854524076744*G0_0_0_1_1_2 + 0.00198813532146864*G0_0_0_1_2_0 + 0.00301854524076744*G0_0_0_1_2_1 - 0.00289027844583399*G0_0_0_1_2_2 + 0.0413874191651967*G0_0_0_2_0_0 + 0.00198813532146864*G0_0_0_2_0_1 + 0.0024798247020469*G0_0_0_2_0_2 + 0.00198813532146864*G0_0_0_2_1_0 + 0.00301854524076744*G0_0_0_2_1_1 - 0.00289027844583399*G0_0_0_2_1_2 + 0.0024798247020469*G0_0_0_2_2_0 - 0.00289027844583399*G0_0_0_2_2_1 - 0.0263973063973062*G0_0_0_2_2_2 - 0.00784565229009673*G0_0_1_0_0_1 + 0.00784565229009665*G0_0_1_0_0_2 - 0.00784565229009673*G0_0_1_0_1_0 + 0.00149644594089037*G0_0_1_0_1_1 + 0.00784565229009665*G0_0_1_0_2_0 - 0.0014964459408904*G0_0_1_0_2_2 - 0.00784565229009673*G0_0_1_1_0_0 + 0.00149644594089037*G0_0_1_1_0_1 + 0.00149644594089037*G0_0_1_1_1_0 + 0.0265897065897064*G0_0_1_1_1_1 + 0.00295441184330072*G0_0_1_1_1_2 + 0.00295441184330072*G0_0_1_1_2_1 - 0.00295441184330072*G0_0_1_1_2_2 + 0.00784565229009665*G0_0_1_2_0_0 - 0.0014964459408904*G0_0_1_2_0_2 + 0.00295441184330072*G0_0_1_2_1_1 - 0.00295441184330071*G0_0_1_2_1_2 - 0.0014964459408904*G0_0_1_2_2_0 - 0.00295441184330071*G0_0_1_2_2_1 - 0.0265897065897065*G0_0_1_2_2_2 - 0.00784565229009668*G0_1_0_0_0_1 + 0.0078456522900967*G0_1_0_0_0_2 - 0.00784565229009668*G0_1_0_0_1_0 + 0.00149644594089037*G0_1_0_0_1_1 + 0.00784565229009669*G0_1_0_0_2_0 - 0.00149644594089039*G0_1_0_0_2_2 - 0.00784565229009668*G0_1_0_1_0_0 + 0.00149644594089037*G0_1_0_1_0_1 + 0.00149644594089037*G0_1_0_1_1_0 + 0.0265897065897064*G0_1_0_1_1_1 + 0.0029544118433007*G0_1_0_1_1_2 + 0.00295441184330071*G0_1_0_1_2_1 - 0.00295441184330072*G0_1_0_1_2_2 + 0.00784565229009669*G0_1_0_2_0_0 - 0.00149644594089039*G0_1_0_2_0_2 + 0.00295441184330071*G0_1_0_2_1_1 - 0.00295441184330072*G0_1_0_2_1_2 - 0.00149644594089039*G0_1_0_2_2_0 - 0.00295441184330072*G0_1_0_2_2_1 - 0.0265897065897065*G0_1_0_2_2_2 - 0.541029341029339*G0_1_1_0_0_0 - 0.0413874191651968*G0_1_1_0_0_1 - 0.0256961145850033*G0_1_1_0_0_2 - 0.0413874191651968*G0_1_1_0_1_0 - 0.00247982470204692*G0_1_1_0_1_1 - 0.00198813532146865*G0_1_1_0_1_2 - 0.0256961145850033*G0_1_1_0_2_0 - 0.00198813532146865*G0_1_1_0_2_1 - 0.00547271658382768*G0_1_1_0_2_2 - 0.0413874191651968*G0_1_1_1_0_0 - 0.00247982470204692*G0_1_1_1_0_1 - 0.00198813532146865*G0_1_1_1_0_2 - 0.00247982470204692*G0_1_1_1_1_0 + 0.0263973063973062*G0_1_1_1_1_1 + 0.00289027844583398*G0_1_1_1_1_2 - 0.00198813532146865*G0_1_1_1_2_0 + 0.00289027844583398*G0_1_1_1_2_1 - 0.00301854524076744*G0_1_1_1_2_2 - 0.0256961145850033*G0_1_1_2_0_0 - 0.00198813532146865*G0_1_1_2_0_1 - 0.00547271658382768*G0_1_1_2_0_2 - 0.00198813532146865*G0_1_1_2_1_0 + 0.00289027844583398*G0_1_1_2_1_1 - 0.00301854524076745*G0_1_1_2_1_2 - 0.00547271658382768*G0_1_1_2_2_0 - 0.00301854524076745*G0_1_1_2_2_1 - 0.0267821067821067*G0_1_1_2_2_2; + A[6] = A[90] - 0.541029341029338*G0_0_1_0_0_0 - 0.0335417668751*G0_0_1_0_0_1 - 0.0335417668751*G0_0_1_0_0_2 - 0.0335417668751*G0_0_1_0_1_0 - 0.00397627064293729*G0_0_1_0_1_1 - 0.00198813532146864*G0_0_1_0_1_2 - 0.0335417668751*G0_0_1_0_2_0 - 0.00198813532146864*G0_0_1_0_2_1 - 0.00397627064293728*G0_0_1_0_2_2 - 0.0335417668751*G0_0_1_1_0_0 - 0.00397627064293729*G0_0_1_1_0_1 - 0.00198813532146864*G0_0_1_1_0_2 - 0.00397627064293729*G0_0_1_1_1_0 - 0.000192400192400168*G0_0_1_1_1_1 - 0.00198813532146864*G0_0_1_1_2_0 - 0.0335417668751*G0_0_1_2_0_0 - 0.00198813532146864*G0_0_1_2_0_1 - 0.00397627064293728*G0_0_1_2_0_2 - 0.00198813532146864*G0_0_1_2_1_0 - 0.00397627064293727*G0_0_1_2_2_0 - 0.000192400192400133*G0_0_1_2_2_2 + 0.541029341029338*G0_1_0_0_0_0 + 0.0335417668751*G0_1_0_0_0_1 + 0.0335417668751*G0_1_0_0_0_2 + 0.0335417668751*G0_1_0_0_1_0 + 0.00397627064293729*G0_1_0_0_1_1 + 0.00198813532146864*G0_1_0_0_1_2 + 0.0335417668751*G0_1_0_0_2_0 + 0.00198813532146864*G0_1_0_0_2_1 + 0.00397627064293727*G0_1_0_0_2_2 + 0.0335417668751*G0_1_0_1_0_0 + 0.00397627064293729*G0_1_0_1_0_1 + 0.00198813532146864*G0_1_0_1_0_2 + 0.00397627064293729*G0_1_0_1_1_0 + 0.000192400192400169*G0_1_0_1_1_1 + 0.00198813532146864*G0_1_0_1_2_0 + 0.0335417668751*G0_1_0_2_0_0 + 0.00198813532146864*G0_1_0_2_0_1 + 0.00397627064293728*G0_1_0_2_0_2 + 0.00198813532146864*G0_1_0_2_1_0 + 0.00397627064293728*G0_1_0_2_2_0 + 0.000192400192400133*G0_1_0_2_2_2; + A[49] = -A[169] - 0.01341670675004*G0_0_0_0_0_0 - 0.00900432900432896*G0_0_0_0_0_1 - 0.0249863716530382*G0_0_0_0_0_2 - 0.00900432900432896*G0_0_0_0_1_0 - 0.0148789482122815*G0_0_0_0_1_1 - 0.00715728715728715*G0_0_0_0_1_2 - 0.0249863716530382*G0_0_0_0_2_0 - 0.00715728715728715*G0_0_0_0_2_1 - 0.0615424082090745*G0_0_0_0_2_2 - 0.00900432900432896*G0_0_0_1_0_0 - 0.0148789482122815*G0_0_0_1_0_1 - 0.00715728715728715*G0_0_0_1_0_2 - 0.0148789482122815*G0_0_0_1_1_0 + 0.0143658810325473*G0_0_0_1_1_1 + 0.0118005451338783*G0_0_0_1_1_2 - 0.00715728715728715*G0_0_0_1_2_0 + 0.0118005451338783*G0_0_0_1_2_1 - 0.0159307359307359*G0_0_0_1_2_2 - 0.0249863716530382*G0_0_0_2_0_0 - 0.00715728715728715*G0_0_0_2_0_1 - 0.0615424082090745*G0_0_0_2_0_2 - 0.00715728715728715*G0_0_0_2_1_0 + 0.0118005451338783*G0_0_0_2_1_1 - 0.0159307359307359*G0_0_0_2_1_2 - 0.0615424082090745*G0_0_0_2_2_0 - 0.0159307359307359*G0_0_0_2_2_1 - 0.342421035754367*G0_0_0_2_2_2 - 0.00885040885040872*G0_0_1_0_0_0 - 0.00923520923520917*G0_0_1_0_0_1 + 0.00115440115440112*G0_0_1_0_0_2 - 0.00923520923520917*G0_0_1_0_1_0 + 0.00718294051627396*G0_0_1_0_1_1 + 0.01333974667308*G0_0_1_0_1_2 + 0.00115440115440112*G0_0_1_0_2_0 + 0.01333974667308*G0_0_1_0_2_1 + 0.00525893859227189*G0_0_1_0_2_2 - 0.00923520923520917*G0_0_1_1_0_0 + 0.00718294051627395*G0_0_1_1_0_1 + 0.01333974667308*G0_0_1_1_0_2 + 0.00718294051627395*G0_0_1_1_1_0 + 0.469456469456469*G0_0_1_1_1_1 + 0.115953182619849*G0_0_1_1_1_2 + 0.01333974667308*G0_0_1_1_2_0 + 0.115953182619849*G0_0_1_1_2_1 + 0.0625941959275291*G0_0_1_1_2_2 + 0.00115440115440112*G0_0_1_2_0_0 + 0.01333974667308*G0_0_1_2_0_1 + 0.00525893859227189*G0_0_1_2_0_2 + 0.01333974667308*G0_0_1_2_1_0 + 0.115953182619849*G0_0_1_2_1_1 + 0.0625941959275291*G0_0_1_2_1_2 + 0.00525893859227189*G0_0_1_2_2_0 + 0.0625941959275291*G0_0_1_2_2_1 + 0.0280904280904281*G0_0_1_2_2_2; + A[34] = -A[37] + 0.00161616161616154*G0_1_0_0_0_0 + 0.000179573512906829*G0_1_0_0_0_1 + 0.00102613435946771*G0_1_0_0_0_2 + 0.000179573512906829*G0_1_0_0_1_0 - 0.000179573512906852*G0_1_0_0_1_1 + 0.00102613435946771*G0_1_0_0_2_0 - 0.0109026775693441*G0_1_0_0_2_2 + 0.000179573512906829*G0_1_0_1_0_0 - 0.000179573512906852*G0_1_0_1_0_1 - 0.000179573512906852*G0_1_0_1_1_0 - 0.00161616161616157*G0_1_0_1_1_1 - 0.00102613435946767*G0_1_0_1_1_2 - 0.00102613435946767*G0_1_0_1_2_1 + 0.0109026775693442*G0_1_0_1_2_2 + 0.0010261343594677*G0_1_0_2_0_0 - 0.0109026775693441*G0_1_0_2_0_2 - 0.00102613435946767*G0_1_0_2_1_1 + 0.0109026775693442*G0_1_0_2_1_2 - 0.0109026775693441*G0_1_0_2_2_0 + 0.0109026775693442*G0_1_0_2_2_1 + 0.0659291325957988*G0_1_1_0_0_0 + 0.015751162417829*G0_1_1_0_0_1 + 0.0072791406124739*G0_1_1_0_0_2 + 0.015751162417829*G0_1_1_0_1_0 + 0.0155715889049222*G0_1_1_0_1_1 + 0.00299823633156965*G0_1_1_0_1_2 + 0.0072791406124739*G0_1_1_0_2_0 + 0.00299823633156965*G0_1_1_0_2_1 + 0.00224466891133559*G0_1_1_0_2_2 + 0.015751162417829*G0_1_1_1_0_0 + 0.0155715889049222*G0_1_1_1_0_1 + 0.00299823633156965*G0_1_1_1_0_2 + 0.0155715889049222*G0_1_1_1_1_0 + 0.0643129709796377*G0_1_1_1_1_1 + 0.00625300625300626*G0_1_1_1_1_2 + 0.00299823633156965*G0_1_1_1_2_0 + 0.00625300625300626*G0_1_1_1_2_1 + 0.0131473464806798*G0_1_1_1_2_2 + 0.0072791406124739*G0_1_1_2_0_0 + 0.00299823633156965*G0_1_1_2_0_1 + 0.00224466891133559*G0_1_1_2_0_2 + 0.00299823633156965*G0_1_1_2_1_0 + 0.00625300625300626*G0_1_1_2_1_1 + 0.0131473464806798*G0_1_1_2_1_2 + 0.00224466891133559*G0_1_1_2_2_0 + 0.0131473464806798*G0_1_1_2_2_1 + 0.181080647747313*G0_1_1_2_2_2; + A[124] = -A[79] - 0.0088504088504085*G0_1_0_0_0_0 + 0.00115440115440127*G0_1_0_0_0_1 - 0.00923520923520921*G0_1_0_0_0_2 + 0.00115440115440127*G0_1_0_0_1_0 + 0.00525893859227204*G0_1_0_0_1_1 + 0.01333974667308*G0_1_0_0_1_2 - 0.00923520923520921*G0_1_0_0_2_0 + 0.01333974667308*G0_1_0_0_2_1 + 0.00718294051627376*G0_1_0_0_2_2 + 0.00115440115440127*G0_1_0_1_0_0 + 0.00525893859227204*G0_1_0_1_0_1 + 0.01333974667308*G0_1_0_1_0_2 + 0.00525893859227204*G0_1_0_1_1_0 + 0.0280904280904284*G0_1_0_1_1_1 + 0.0625941959275291*G0_1_0_1_1_2 + 0.01333974667308*G0_1_0_1_2_0 + 0.0625941959275291*G0_1_0_1_2_1 + 0.115953182619849*G0_1_0_1_2_2 - 0.00923520923520921*G0_1_0_2_0_0 + 0.01333974667308*G0_1_0_2_0_1 + 0.00718294051627376*G0_1_0_2_0_2 + 0.01333974667308*G0_1_0_2_1_0 + 0.0625941959275291*G0_1_0_2_1_1 + 0.115953182619849*G0_1_0_2_1_2 + 0.00718294051627376*G0_1_0_2_2_0 + 0.115953182619849*G0_1_0_2_2_1 + 0.469456469456466*G0_1_0_2_2_2 - 0.0134167067500396*G0_1_1_0_0_0 - 0.0249863716530381*G0_1_1_0_0_1 - 0.00900432900432897*G0_1_1_0_0_2 - 0.0249863716530381*G0_1_1_0_1_0 - 0.0615424082090746*G0_1_1_0_1_1 - 0.00715728715728712*G0_1_1_0_1_2 - 0.00900432900432897*G0_1_1_0_2_0 - 0.00715728715728712*G0_1_1_0_2_1 - 0.0148789482122816*G0_1_1_0_2_2 - 0.0249863716530381*G0_1_1_1_0_0 - 0.0615424082090746*G0_1_1_1_0_1 - 0.00715728715728712*G0_1_1_1_0_2 - 0.0615424082090746*G0_1_1_1_1_0 - 0.342421035754369*G0_1_1_1_1_1 - 0.0159307359307359*G0_1_1_1_1_2 - 0.00715728715728712*G0_1_1_1_2_0 - 0.015930735930736*G0_1_1_1_2_1 + 0.0118005451338784*G0_1_1_1_2_2 - 0.00900432900432897*G0_1_1_2_0_0 - 0.00715728715728712*G0_1_1_2_0_1 - 0.0148789482122816*G0_1_1_2_0_2 - 0.00715728715728712*G0_1_1_2_1_0 - 0.015930735930736*G0_1_1_2_1_1 + 0.0118005451338784*G0_1_1_2_1_2 - 0.0148789482122816*G0_1_1_2_2_0 + 0.0118005451338784*G0_1_1_2_2_1 + 0.0143658810325472*G0_1_1_2_2_2; + A[161] = -A[153] - 0.370511463844796*G0_0_0_0_0_0 - 0.0785249318582649*G0_0_0_0_0_1 - 0.0668013468013464*G0_0_0_0_0_2 - 0.0785249318582649*G0_0_0_0_1_0 - 0.10415263748597*G0_0_0_0_1_1 - 0.0204970338303671*G0_0_0_0_1_2 - 0.0668013468013464*G0_0_0_0_2_0 - 0.0204970338303671*G0_0_0_0_2_1 - 0.0261407728074393*G0_0_0_0_2_2 - 0.0785249318582649*G0_0_0_1_0_0 - 0.10415263748597*G0_0_0_1_0_1 - 0.0204970338303671*G0_0_0_1_0_2 - 0.10415263748597*G0_0_0_1_1_0 - 0.455090588423921*G0_0_0_1_1_1 - 0.0220618887285553*G0_0_0_1_1_2 - 0.0204970338303671*G0_0_0_1_2_0 - 0.0220618887285553*G0_0_0_1_2_1 + 0.00023088023088021*G0_0_0_1_2_2 - 0.0668013468013464*G0_0_0_2_0_0 - 0.0204970338303671*G0_0_0_2_0_1 - 0.0261407728074393*G0_0_0_2_0_2 - 0.0204970338303671*G0_0_0_2_1_0 - 0.0220618887285553*G0_0_0_2_1_1 + 0.000230880230880212*G0_0_0_2_1_2 - 0.0261407728074393*G0_0_0_2_2_0 + 0.000230880230880212*G0_0_0_2_2_1 - 0.00456629789963131*G0_0_0_2_2_2 - 0.028090428090428*G0_1_0_0_0_0 - 0.062594195927529*G0_1_0_0_0_1 - 0.00525893859227187*G0_1_0_0_0_2 - 0.062594195927529*G0_1_0_0_1_0 - 0.115953182619849*G0_1_0_0_1_1 - 0.01333974667308*G0_1_0_0_1_2 - 0.00525893859227187*G0_1_0_0_2_0 - 0.01333974667308*G0_1_0_0_2_1 - 0.00115440115440111*G0_1_0_0_2_2 - 0.062594195927529*G0_1_0_1_0_0 - 0.115953182619849*G0_1_0_1_0_1 - 0.01333974667308*G0_1_0_1_0_2 - 0.115953182619849*G0_1_0_1_1_0 - 0.469456469456468*G0_1_0_1_1_1 - 0.00718294051627383*G0_1_0_1_1_2 - 0.01333974667308*G0_1_0_1_2_0 - 0.00718294051627383*G0_1_0_1_2_1 + 0.00923520923520917*G0_1_0_1_2_2 - 0.00525893859227187*G0_1_0_2_0_0 - 0.01333974667308*G0_1_0_2_0_1 - 0.00115440115440111*G0_1_0_2_0_2 - 0.01333974667308*G0_1_0_2_1_0 - 0.00718294051627384*G0_1_0_2_1_1 + 0.00923520923520917*G0_1_0_2_1_2 - 0.00115440115440111*G0_1_0_2_2_0 + 0.00923520923520917*G0_1_0_2_2_1 + 0.00885040885040889*G0_1_0_2_2_2; + A[96] = A[144] - 0.301683501683501*G0_0_0_0_0_0 - 0.0294158516380737*G0_0_0_0_0_1 + 0.0827748383303936*G0_0_0_0_0_2 - 0.0294158516380737*G0_0_0_0_1_0 - 0.0331783442894552*G0_0_0_0_1_1 + 0.00615680615680614*G0_0_0_0_1_2 + 0.0827748383303936*G0_0_0_0_2_0 + 0.00615680615680614*G0_0_0_0_2_1 + 0.0578055689166798*G0_0_0_0_2_2 - 0.0294158516380737*G0_0_0_1_0_0 - 0.0331783442894552*G0_0_0_1_0_1 + 0.00615680615680614*G0_0_0_1_0_2 - 0.0331783442894552*G0_0_0_1_1_0 - 0.154535834535834*G0_0_0_1_1_1 - 0.0154604243493131*G0_0_0_1_1_2 + 0.00615680615680615*G0_0_0_1_2_0 - 0.0154604243493131*G0_0_0_1_2_1 + 0.0205910961466516*G0_0_0_1_2_2 + 0.0827748383303936*G0_0_0_2_0_0 + 0.00615680615680615*G0_0_0_2_0_1 + 0.0578055689166798*G0_0_0_2_0_2 + 0.00615680615680614*G0_0_0_2_1_0 - 0.0154604243493131*G0_0_0_2_1_1 + 0.0205910961466516*G0_0_0_2_1_2 + 0.0578055689166798*G0_0_0_2_2_0 + 0.0205910961466516*G0_0_0_2_2_1 + 0.169927849927849*G0_0_0_2_2_2 - 0.0560953449842335*G0_0_1_0_0_1 + 0.0560953449842337*G0_0_1_0_0_2 - 0.0560953449842335*G0_0_1_0_1_0 - 0.0454919566030675*G0_0_1_0_1_1 + 0.0560953449842337*G0_0_1_0_2_0 + 0.0454919566030675*G0_0_1_0_2_2 - 0.0560953449842335*G0_0_1_1_0_0 - 0.0454919566030675*G0_0_1_1_0_1 - 0.0454919566030675*G0_0_1_1_1_0 - 0.162231842231841*G0_0_1_1_1_1 - 0.0180257602479824*G0_0_1_1_1_2 - 0.0180257602479824*G0_0_1_1_2_1 + 0.0180257602479824*G0_0_1_1_2_2 + 0.0560953449842337*G0_0_1_2_0_0 + 0.0454919566030675*G0_0_1_2_0_2 - 0.0180257602479824*G0_0_1_2_1_1 + 0.0180257602479824*G0_0_1_2_1_2 + 0.0454919566030675*G0_0_1_2_2_0 + 0.0180257602479824*G0_0_1_2_2_1 + 0.162231842231841*G0_0_1_2_2_2 - 0.0560953449842335*G0_1_0_0_0_1 + 0.0560953449842337*G0_1_0_0_0_2 - 0.0560953449842335*G0_1_0_0_1_0 - 0.0454919566030675*G0_1_0_0_1_1 + 0.0560953449842337*G0_1_0_0_2_0 + 0.0454919566030675*G0_1_0_0_2_2 - 0.0560953449842335*G0_1_0_1_0_0 - 0.0454919566030675*G0_1_0_1_0_1 - 0.0454919566030675*G0_1_0_1_1_0 - 0.162231842231841*G0_1_0_1_1_1 - 0.0180257602479824*G0_1_0_1_1_2 - 0.0180257602479824*G0_1_0_1_2_1 + 0.0180257602479824*G0_1_0_1_2_2 + 0.0560953449842337*G0_1_0_2_0_0 + 0.0454919566030675*G0_1_0_2_0_2 - 0.0180257602479824*G0_1_0_2_1_1 + 0.0180257602479824*G0_1_0_2_1_2 + 0.0454919566030675*G0_1_0_2_2_0 + 0.0180257602479824*G0_1_0_2_2_1 + 0.162231842231841*G0_1_0_2_2_2 + 0.3016835016835*G0_1_1_0_0_0 - 0.0827748383303934*G0_1_1_0_0_1 + 0.0294158516380737*G0_1_1_0_0_2 - 0.0827748383303934*G0_1_1_0_1_0 - 0.0578055689166797*G0_1_1_0_1_1 - 0.00615680615680612*G0_1_1_0_1_2 + 0.0294158516380737*G0_1_1_0_2_0 - 0.00615680615680612*G0_1_1_0_2_1 + 0.0331783442894553*G0_1_1_0_2_2 - 0.0827748383303934*G0_1_1_1_0_0 - 0.0578055689166797*G0_1_1_1_0_1 - 0.00615680615680612*G0_1_1_1_0_2 - 0.0578055689166797*G0_1_1_1_1_0 - 0.169927849927849*G0_1_1_1_1_1 - 0.0205910961466516*G0_1_1_1_1_2 - 0.00615680615680612*G0_1_1_1_2_0 - 0.0205910961466516*G0_1_1_1_2_1 + 0.0154604243493131*G0_1_1_1_2_2 + 0.0294158516380737*G0_1_1_2_0_0 - 0.00615680615680612*G0_1_1_2_0_1 + 0.0331783442894553*G0_1_1_2_0_2 - 0.00615680615680612*G0_1_1_2_1_0 - 0.0205910961466516*G0_1_1_2_1_1 + 0.0154604243493131*G0_1_1_2_1_2 + 0.0331783442894553*G0_1_1_2_2_0 + 0.0154604243493131*G0_1_1_2_2_1 + 0.154535834535834*G0_1_1_2_2_2; + A[81] = A[95] + 0.00933782267115585*G0_0_1_0_0_0 - 0.00030784030784028*G0_0_1_0_0_2 + 0.000684089572978407*G0_0_1_0_1_1 - 0.000684089572978461*G0_0_1_0_1_2 - 0.00030784030784028*G0_0_1_0_2_0 - 0.000684089572978462*G0_0_1_0_2_1 + 0.00324942547164769*G0_0_1_0_2_2 + 0.000684089572978406*G0_0_1_1_0_1 - 0.000684089572978461*G0_0_1_1_0_2 + 0.000684089572978407*G0_0_1_1_1_0 + 0.00400192400192374*G0_0_1_1_1_1 + 0.008858959970071*G0_0_1_1_1_2 - 0.000684089572978462*G0_0_1_1_2_0 + 0.008858959970071*G0_0_1_1_2_1 + 0.0121425899203676*G0_0_1_1_2_2 - 0.00030784030784028*G0_0_1_2_0_0 - 0.000684089572978461*G0_0_1_2_0_1 + 0.00324942547164768*G0_0_1_2_0_2 - 0.000684089572978462*G0_0_1_2_1_0 + 0.008858959970071*G0_0_1_2_1_1 + 0.0121425899203676*G0_0_1_2_1_2 + 0.00324942547164769*G0_0_1_2_2_0 + 0.0121425899203676*G0_0_1_2_2_1 - 0.0831168831168829*G0_0_1_2_2_2 - 0.00933782267115585*G0_1_0_0_0_0 + 0.000307840307840282*G0_1_0_0_0_2 - 0.000684089572978407*G0_1_0_0_1_1 + 0.000684089572978461*G0_1_0_0_1_2 + 0.00030784030784028*G0_1_0_0_2_0 + 0.000684089572978461*G0_1_0_0_2_1 - 0.00324942547164769*G0_1_0_0_2_2 - 0.000684089572978406*G0_1_0_1_0_1 + 0.000684089572978462*G0_1_0_1_0_2 - 0.000684089572978407*G0_1_0_1_1_0 - 0.00400192400192374*G0_1_0_1_1_1 - 0.008858959970071*G0_1_0_1_1_2 + 0.000684089572978462*G0_1_0_1_2_0 - 0.008858959970071*G0_1_0_1_2_1 - 0.0121425899203676*G0_1_0_1_2_2 + 0.00030784030784028*G0_1_0_2_0_0 + 0.000684089572978462*G0_1_0_2_0_1 - 0.00324942547164768*G0_1_0_2_0_2 + 0.000684089572978462*G0_1_0_2_1_0 - 0.008858959970071*G0_1_0_2_1_1 - 0.0121425899203676*G0_1_0_2_1_2 - 0.00324942547164769*G0_1_0_2_2_0 - 0.0121425899203676*G0_1_0_2_2_1 + 0.0831168831168829*G0_1_0_2_2_2; + A[156] = A[100] - 0.174699374699375*G0_0_1_0_0_0 + 0.0135962802629469*G0_0_1_0_0_1 + 0.0200096200096199*G0_0_1_0_0_2 + 0.0135962802629469*G0_0_1_0_1_0 + 0.00336059002725674*G0_0_1_0_1_1 + 0.0200096200096199*G0_0_1_0_2_0 + 0.0138784672118005*G0_0_1_0_2_2 + 0.0135962802629469*G0_0_1_1_0_0 + 0.00336059002725674*G0_0_1_1_0_1 + 0.00336059002725674*G0_0_1_1_1_0 + 0.00823472823472852*G0_0_1_1_1_1 + 0.000820907487574195*G0_0_1_1_1_2 + 0.000820907487574199*G0_0_1_1_2_1 + 0.000897867564534248*G0_0_1_1_2_2 + 0.0200096200096199*G0_0_1_2_0_0 + 0.0138784672118005*G0_0_1_2_0_2 + 0.000820907487574199*G0_0_1_2_1_1 + 0.000897867564534251*G0_0_1_2_1_2 + 0.0138784672118005*G0_0_1_2_2_0 + 0.000897867564534249*G0_0_1_2_2_1 + 0.008927368927369*G0_0_1_2_2_2 + 0.174699374699375*G0_1_0_0_0_0 - 0.0135962802629468*G0_1_0_0_0_1 - 0.0200096200096199*G0_1_0_0_0_2 - 0.0135962802629468*G0_1_0_0_1_0 - 0.00336059002725674*G0_1_0_0_1_1 - 0.0200096200096199*G0_1_0_0_2_0 - 0.0138784672118005*G0_1_0_0_2_2 - 0.0135962802629468*G0_1_0_1_0_0 - 0.00336059002725674*G0_1_0_1_0_1 - 0.00336059002725674*G0_1_0_1_1_0 - 0.00823472823472852*G0_1_0_1_1_1 - 0.000820907487574195*G0_1_0_1_1_2 - 0.000820907487574195*G0_1_0_1_2_1 - 0.000897867564534249*G0_1_0_1_2_2 - 0.0200096200096199*G0_1_0_2_0_0 - 0.0138784672118005*G0_1_0_2_0_2 - 0.000820907487574195*G0_1_0_2_1_1 - 0.000897867564534253*G0_1_0_2_1_2 - 0.0138784672118005*G0_1_0_2_2_0 - 0.000897867564534251*G0_1_0_2_2_1 - 0.00892736892736899*G0_1_0_2_2_2; + A[142] = A[156] - 0.137245470578803*G0_0_0_0_0_0 + 0.0161616161616161*G0_0_0_0_0_1 - 0.0369408369408366*G0_0_0_0_0_2 + 0.0161616161616161*G0_0_0_0_1_0 + 0.0114670514670515*G0_0_0_0_1_1 + 0.0039762706429373*G0_0_0_0_1_2 - 0.0369408369408366*G0_0_0_0_2_0 + 0.0039762706429373*G0_0_0_0_2_1 - 0.0155715889049221*G0_0_0_0_2_2 + 0.0161616161616161*G0_0_0_1_0_0 + 0.0114670514670515*G0_0_0_1_0_1 + 0.00397627064293729*G0_0_0_1_0_2 + 0.0114670514670515*G0_0_0_1_1_0 + 0.0470739137405805*G0_0_0_1_1_1 + 0.00918390251723582*G0_0_0_1_1_2 + 0.0039762706429373*G0_0_0_1_2_0 + 0.00918390251723582*G0_0_0_1_2_1 - 0.0052589385922719*G0_0_0_1_2_2 - 0.0369408369408366*G0_0_0_2_0_0 + 0.0039762706429373*G0_0_0_2_0_1 - 0.0155715889049221*G0_0_0_2_0_2 + 0.0039762706429373*G0_0_0_2_1_0 + 0.00918390251723582*G0_0_0_2_1_1 - 0.0052589385922719*G0_0_0_2_1_2 - 0.0155715889049221*G0_0_0_2_2_0 - 0.0052589385922719*G0_0_0_2_2_1 - 0.0401218534551865*G0_0_0_2_2_2 - 0.00461760461760459*G0_0_1_0_0_1 + 0.00461760461760464*G0_0_1_0_0_2 - 0.00461760461760459*G0_0_1_0_1_0 + 0.00800384800384796*G0_0_1_0_1_1 + 0.00461760461760463*G0_0_1_0_2_0 - 0.00800384800384797*G0_0_1_0_2_2 - 0.00461760461760459*G0_0_1_1_0_0 + 0.00800384800384796*G0_0_1_1_0_1 + 0.00800384800384796*G0_0_1_1_1_0 + 0.0434824434824432*G0_0_1_1_1_1 + 0.00720859387526048*G0_0_1_1_1_2 + 0.00720859387526048*G0_0_1_1_2_1 - 0.00720859387526052*G0_0_1_1_2_2 + 0.00461760461760464*G0_0_1_2_0_0 - 0.00800384800384797*G0_0_1_2_0_2 + 0.00720859387526048*G0_0_1_2_1_1 - 0.00720859387526052*G0_0_1_2_1_2 - 0.00800384800384797*G0_0_1_2_2_0 - 0.00720859387526052*G0_0_1_2_2_1 - 0.0434824434824432*G0_0_1_2_2_2 - 0.0110309443642776*G0_1_0_0_0_1 + 0.0110309443642777*G0_1_0_0_0_2 - 0.0110309443642776*G0_1_0_0_1_0 - 0.00251402918069575*G0_1_0_0_1_1 + 0.0110309443642777*G0_1_0_0_2_0 + 0.00251402918069583*G0_1_0_0_2_2 - 0.0110309443642776*G0_1_0_1_0_0 - 0.00251402918069575*G0_1_0_1_0_1 - 0.00251402918069575*G0_1_0_1_1_0 + 0.0427898027898029*G0_1_0_1_1_1 + 0.00713163379830042*G0_1_0_1_1_2 + 0.00713163379830042*G0_1_0_1_2_1 - 0.00713163379830048*G0_1_0_1_2_2 + 0.0110309443642777*G0_1_0_2_0_0 + 0.00251402918069583*G0_1_0_2_0_2 + 0.00713163379830042*G0_1_0_2_1_1 - 0.00713163379830048*G0_1_0_2_1_2 + 0.00251402918069583*G0_1_0_2_2_0 - 0.00713163379830048*G0_1_0_2_2_1 - 0.0427898027898026*G0_1_0_2_2_2 + 0.137245470578803*G0_1_1_0_0_0 + 0.0369408369408367*G0_1_1_0_0_1 - 0.0161616161616161*G0_1_1_0_0_2 + 0.0369408369408368*G0_1_1_0_1_0 + 0.0155715889049222*G0_1_1_0_1_1 - 0.00397627064293731*G0_1_1_0_1_2 - 0.0161616161616161*G0_1_1_0_2_0 - 0.00397627064293731*G0_1_1_0_2_1 - 0.0114670514670514*G0_1_1_0_2_2 + 0.0369408369408368*G0_1_1_1_0_0 + 0.0155715889049222*G0_1_1_1_0_1 - 0.00397627064293731*G0_1_1_1_0_2 + 0.0155715889049222*G0_1_1_1_1_0 + 0.0401218534551866*G0_1_1_1_1_1 + 0.00525893859227185*G0_1_1_1_1_2 - 0.00397627064293731*G0_1_1_1_2_0 + 0.00525893859227185*G0_1_1_1_2_1 - 0.00918390251723587*G0_1_1_1_2_2 - 0.0161616161616161*G0_1_1_2_0_0 - 0.00397627064293731*G0_1_1_2_0_1 - 0.0114670514670514*G0_1_1_2_0_2 - 0.00397627064293731*G0_1_1_2_1_0 + 0.00525893859227185*G0_1_1_2_1_1 - 0.00918390251723587*G0_1_1_2_1_2 - 0.0114670514670514*G0_1_1_2_2_0 - 0.00918390251723587*G0_1_1_2_2_1 - 0.0470739137405802*G0_1_1_2_2_2; + A[223] = -A[213] - 0.0415584415584417*G0_0_0_0_0_0 - 0.00297578964245634*G0_0_0_0_0_1 - 0.0502805836139169*G0_0_0_0_0_2 - 0.00297578964245634*G0_0_0_0_1_0 + 0.00297578964245627*G0_0_0_0_1_1 - 0.0502805836139169*G0_0_0_0_2_0 - 0.0580792047458714*G0_0_0_0_2_2 - 0.00297578964245634*G0_0_0_1_0_0 + 0.00297578964245627*G0_0_0_1_0_1 + 0.00297578964245627*G0_0_0_1_1_0 + 0.0415584415584412*G0_0_0_1_1_1 + 0.0502805836139167*G0_0_0_1_1_2 + 0.0502805836139166*G0_0_0_1_2_1 + 0.0580792047458711*G0_0_0_1_2_2 - 0.0502805836139169*G0_0_0_2_0_0 - 0.0580792047458714*G0_0_0_2_0_2 + 0.0502805836139167*G0_0_0_2_1_1 + 0.0580792047458711*G0_0_0_2_1_2 - 0.0580792047458714*G0_0_0_2_2_0 + 0.0580792047458711*G0_0_0_2_2_1 + 0.0232932499599164*G0_0_1_0_0_0 + 0.0123136123136122*G0_0_1_0_0_1 + 0.0140580407247072*G0_0_1_0_0_2 + 0.0123136123136122*G0_0_1_0_1_0 + 0.0382748116081447*G0_0_1_0_1_1 + 0.0171364438031104*G0_0_1_0_1_2 + 0.0140580407247072*G0_0_1_0_2_0 + 0.0171364438031104*G0_0_1_0_2_1 + 0.0320153920153917*G0_0_1_0_2_2 + 0.0123136123136122*G0_0_1_1_0_0 + 0.0382748116081447*G0_0_1_1_0_1 + 0.0171364438031104*G0_0_1_1_0_2 + 0.0382748116081447*G0_0_1_1_1_0 + 0.271720378387044*G0_0_1_1_1_1 + 0.127958954625621*G0_0_1_1_1_2 + 0.0171364438031104*G0_0_1_1_2_0 + 0.127958954625621*G0_0_1_1_2_1 + 0.116774090107423*G0_0_1_1_2_2 + 0.0140580407247072*G0_0_1_2_0_0 + 0.0171364438031104*G0_0_1_2_0_1 + 0.0320153920153917*G0_0_1_2_0_2 + 0.0171364438031104*G0_0_1_2_1_0 + 0.127958954625621*G0_0_1_2_1_1 + 0.116774090107423*G0_0_1_2_1_2 + 0.0320153920153917*G0_0_1_2_2_0 + 0.116774090107423*G0_0_1_2_2_1 + 0.135654962321628*G0_0_1_2_2_2 + 0.0448420715087382*G0_1_0_0_0_0 + 0.0460734327400993*G0_1_0_0_0_1 + 0.0445342312008977*G0_1_0_0_0_2 + 0.0460734327400993*G0_1_0_0_1_0 + 0.0490492223825557*G0_1_0_0_1_1 + 0.0470995670995669*G0_1_0_0_1_2 + 0.0445342312008977*G0_1_0_0_2_0 + 0.0470995670995669*G0_1_0_0_2_1 + 0.0370434503767836*G0_1_0_0_2_2 + 0.0460734327400993*G0_1_0_1_0_0 + 0.0490492223825557*G0_1_0_1_0_1 + 0.0470995670995669*G0_1_0_1_0_2 + 0.0490492223825557*G0_1_0_1_1_0 + 0.0864005130671795*G0_1_0_1_1_1 + 0.0948148148148143*G0_1_0_1_1_2 + 0.0470995670995669*G0_1_0_1_2_0 + 0.0948148148148143*G0_1_0_1_2_1 + 0.0951226551226547*G0_1_0_1_2_2 + 0.0445342312008977*G0_1_0_2_0_0 + 0.0470995670995669*G0_1_0_2_0_1 + 0.0370434503767836*G0_1_0_2_0_2 + 0.0470995670995669*G0_1_0_2_1_0 + 0.0948148148148143*G0_1_0_2_1_1 + 0.0951226551226547*G0_1_0_2_1_2 + 0.0370434503767836*G0_1_0_2_2_0 + 0.0951226551226547*G0_1_0_2_2_1 + 0.0439185505852176*G0_1_0_2_2_2 - 0.0680327080327077*G0_1_1_0_0_0 - 0.0950200416867079*G0_1_1_0_0_1 - 0.00400192400192397*G0_1_1_0_0_2 - 0.0950200416867079*G0_1_1_0_1_0 - 0.155356742023408*G0_1_1_0_1_1 - 0.00246272246272243*G0_1_1_0_1_2 - 0.00400192400192397*G0_1_1_0_2_0 - 0.00246272246272243*G0_1_1_0_2_1 - 0.00256533589866915*G0_1_1_0_2_2 - 0.0950200416867079*G0_1_1_1_0_0 - 0.155356742023408*G0_1_1_1_0_1 - 0.00246272246272243*G0_1_1_1_0_2 - 0.155356742023408*G0_1_1_1_1_0 - 0.307840307840307*G0_1_1_1_1_1 + 0.0568478435145098*G0_1_1_1_1_2 - 0.00246272246272242*G0_1_1_1_2_0 + 0.0568478435145098*G0_1_1_1_2_1 + 0.0630046496713161*G0_1_1_1_2_2 - 0.00400192400192397*G0_1_1_2_0_0 - 0.00246272246272242*G0_1_1_2_0_1 - 0.00256533589866915*G0_1_1_2_0_2 - 0.00246272246272242*G0_1_1_2_1_0 + 0.0568478435145098*G0_1_1_2_1_1 + 0.0630046496713161*G0_1_1_2_1_2 - 0.00256533589866915*G0_1_1_2_2_0 + 0.0630046496713161*G0_1_1_2_2_1 - 0.0107744107744098*G0_1_1_2_2_2; + A[185] = -A[188] - 0.065262145262145*G0_0_1_0_0_0 + 0.00451499118165784*G0_0_1_0_0_1 - 0.0250376783710115*G0_0_1_0_0_2 + 0.00451499118165784*G0_0_1_0_1_0 + 0.0131345198011864*G0_0_1_0_1_1 + 0.000410453743787079*G0_0_1_0_1_2 - 0.0250376783710115*G0_0_1_0_2_0 + 0.00041045374378708*G0_0_1_0_2_1 - 0.0205226871893536*G0_0_1_0_2_2 + 0.00451499118165784*G0_0_1_1_0_0 + 0.0131345198011864*G0_0_1_1_0_1 + 0.000410453743787078*G0_0_1_1_0_2 + 0.0131345198011864*G0_0_1_1_1_0 + 0.0123136123136123*G0_0_1_1_1_1 + 0.0242167708834374*G0_0_1_1_1_2 + 0.000410453743787079*G0_0_1_1_2_0 + 0.0242167708834374*G0_0_1_1_2_1 + 0.0205226871893537*G0_0_1_1_2_2 - 0.0250376783710115*G0_0_1_2_0_0 + 0.000410453743787078*G0_0_1_2_0_1 - 0.0205226871893536*G0_0_1_2_0_2 + 0.000410453743787078*G0_0_1_2_1_0 + 0.0242167708834374*G0_0_1_2_1_1 + 0.0205226871893537*G0_0_1_2_1_2 - 0.0205226871893536*G0_0_1_2_2_0 + 0.0205226871893537*G0_0_1_2_2_1 + 0.30866121532788*G0_1_1_0_0_0 + 0.114721821388487*G0_1_1_0_0_1 - 0.00800384800384804*G0_1_1_0_0_2 + 0.114721821388487*G0_1_1_0_1_0 + 0.0728555395222058*G0_1_1_0_1_1 + 0.00430976430976426*G0_1_1_0_1_2 - 0.00800384800384804*G0_1_1_0_2_0 + 0.00430976430976426*G0_1_1_0_2_1 - 0.0391983325316658*G0_1_1_0_2_2 + 0.114721821388487*G0_1_1_1_0_0 + 0.0728555395222058*G0_1_1_1_0_1 + 0.00430976430976427*G0_1_1_1_0_2 + 0.0728555395222058*G0_1_1_1_1_0 + 0.0439185505852169*G0_1_1_1_1_1 + 0.0322206188872853*G0_1_1_1_1_2 + 0.00430976430976427*G0_1_1_1_2_0 + 0.0322206188872853*G0_1_1_1_2_1 + 0.0289369889369887*G0_1_1_1_2_2 - 0.00800384800384804*G0_1_1_2_0_0 + 0.00430976430976427*G0_1_1_2_0_1 - 0.0391983325316658*G0_1_1_2_0_2 + 0.00430976430976427*G0_1_1_2_1_0 + 0.0322206188872853*G0_1_1_2_1_1 + 0.0289369889369887*G0_1_1_2_1_2 - 0.0391983325316658*G0_1_1_2_2_0 + 0.0289369889369887*G0_1_1_2_2_1 - 0.0348885682219017*G0_1_1_2_2_2; + A[210] = A[14] - 0.00333493666827*G0_0_1_0_0_1 + 0.00333493666826999*G0_0_1_0_0_2 - 0.00333493666827*G0_0_1_0_1_0 + 0.000974827641494305*G0_0_1_0_1_1 + 0.000949174282507613*G0_0_1_0_1_2 + 0.00333493666826999*G0_0_1_0_2_0 + 0.000949174282507612*G0_0_1_0_2_1 - 0.00287317620650952*G0_0_1_0_2_2 - 0.00333493666827*G0_0_1_1_0_0 + 0.000974827641494305*G0_0_1_1_0_1 + 0.000949174282507612*G0_0_1_1_0_2 + 0.000974827641494305*G0_0_1_1_1_0 + 0.000538720538720582*G0_0_1_1_1_1 + 0.00243706910373577*G0_0_1_1_1_2 + 0.000949174282507612*G0_0_1_1_2_0 + 0.00243706910373577*G0_0_1_1_2_1 + 0.00112874779541445*G0_0_1_1_2_2 + 0.00333493666826999*G0_0_1_2_0_0 + 0.000949174282507612*G0_0_1_2_0_1 - 0.00287317620650952*G0_0_1_2_0_2 + 0.000949174282507612*G0_0_1_2_1_0 + 0.00243706910373577*G0_0_1_2_1_1 + 0.00112874779541445*G0_0_1_2_1_2 - 0.00287317620650952*G0_0_1_2_2_0 + 0.00112874779541445*G0_0_1_2_2_1 - 0.0112361712361713*G0_0_1_2_2_2 + 0.00333493666827*G0_1_0_0_0_1 - 0.00333493666826999*G0_1_0_0_0_2 + 0.00333493666827*G0_1_0_0_1_0 - 0.000974827641494304*G0_1_0_0_1_1 - 0.000949174282507612*G0_1_0_0_1_2 - 0.00333493666826999*G0_1_0_0_2_0 - 0.000949174282507612*G0_1_0_0_2_1 + 0.00287317620650952*G0_1_0_0_2_2 + 0.00333493666827*G0_1_0_1_0_0 - 0.000974827641494303*G0_1_0_1_0_1 - 0.000949174282507612*G0_1_0_1_0_2 - 0.000974827641494304*G0_1_0_1_1_0 - 0.000538720538720578*G0_1_0_1_1_1 - 0.00243706910373577*G0_1_0_1_1_2 - 0.000949174282507612*G0_1_0_1_2_0 - 0.00243706910373577*G0_1_0_1_2_1 - 0.00112874779541445*G0_1_0_1_2_2 - 0.00333493666826999*G0_1_0_2_0_0 - 0.000949174282507612*G0_1_0_2_0_1 + 0.00287317620650952*G0_1_0_2_0_2 - 0.000949174282507612*G0_1_0_2_1_0 - 0.00243706910373576*G0_1_0_2_1_1 - 0.00112874779541445*G0_1_0_2_1_2 + 0.00287317620650952*G0_1_0_2_2_0 - 0.00112874779541445*G0_1_0_2_2_1 + 0.0112361712361713*G0_1_0_2_2_2; + A[17] = 9.78034311367808e-05*G0_0_1_0_0_0 - 0.00028699695366362*G0_0_1_0_0_1 - 0.000286996953663616*G0_0_1_0_0_2 - 0.00028699695366362*G0_0_1_0_1_0 - 0.00190208967986746*G0_0_1_0_1_1 - 0.000130137352359575*G0_0_1_0_1_2 - 0.000286996953663616*G0_0_1_0_2_0 - 0.000130137352359575*G0_0_1_0_2_1 - 0.00190208967986745*G0_0_1_0_2_2 - 0.00028699695366362*G0_0_1_1_0_0 - 0.00190208967986746*G0_0_1_1_0_1 - 0.000130137352359575*G0_0_1_1_0_2 - 0.00190208967986746*G0_0_1_1_1_0 - 0.0212361712361713*G0_0_1_1_1_1 - 5.39789428678382e-05*G0_0_1_1_1_2 - 0.000130137352359575*G0_0_1_1_2_0 - 5.39789428678384e-05*G0_0_1_1_2_1 - 5.39789428678356e-05*G0_0_1_1_2_2 - 0.000286996953663616*G0_0_1_2_0_0 - 0.000130137352359575*G0_0_1_2_0_1 - 0.00190208967986745*G0_0_1_2_0_2 - 0.000130137352359575*G0_0_1_2_1_0 - 5.39789428678384e-05*G0_0_1_2_1_1 - 5.39789428678356e-05*G0_0_1_2_1_2 - 0.00190208967986745*G0_0_1_2_2_0 - 5.39789428678357e-05*G0_0_1_2_2_1 - 0.0212361712361711*G0_0_1_2_2_2; + A[2] = -A[17] + 0.0213339746673079*G0_0_1_0_0_0 + 0.00161509272620383*G0_0_1_0_0_1 - 0.000233018010795783*G0_0_1_0_0_2 + 0.00161509272620383*G0_0_1_0_1_0 - 0.00161509272620384*G0_0_1_0_1_1 - 0.000233018010795783*G0_0_1_0_2_0 - 0.00184811073699961*G0_0_1_0_2_2 + 0.00161509272620383*G0_0_1_1_0_0 - 0.00161509272620384*G0_0_1_1_0_1 - 0.00161509272620384*G0_0_1_1_1_0 - 0.021333974667308*G0_0_1_1_1_1 + 0.000233018010795783*G0_0_1_1_1_2 + 0.000233018010795783*G0_0_1_1_2_1 + 0.00184811073699961*G0_0_1_1_2_2 - 0.000233018010795783*G0_0_1_2_0_0 - 0.00184811073699961*G0_0_1_2_0_2 + 0.000233018010795783*G0_0_1_2_1_1 + 0.00184811073699961*G0_0_1_2_1_2 - 0.00184811073699961*G0_0_1_2_2_0 + 0.00184811073699961*G0_0_1_2_2_1 + 0.0212361712361712*G0_1_1_0_0_0 + 0.00190208967986745*G0_1_1_0_0_1 + 0.00190208967986745*G0_1_1_0_1_0 + 0.000286996953663616*G0_1_1_0_1_1 + 0.000130137352359575*G0_1_1_0_1_2 + 0.000130137352359575*G0_1_1_0_2_1 + 0.00190208967986745*G0_1_1_1_0_0 + 0.000286996953663616*G0_1_1_1_0_1 + 0.000130137352359575*G0_1_1_1_0_2 + 0.000286996953663616*G0_1_1_1_1_0 + 0.000286996953663621*G0_1_1_1_1_2 + 0.000130137352359575*G0_1_1_1_2_0 + 0.000286996953663621*G0_1_1_1_2_1 + 0.00190208967986746*G0_1_1_1_2_2 + 0.000130137352359575*G0_1_1_2_0_1 + 0.000130137352359575*G0_1_1_2_1_0 + 0.000286996953663621*G0_1_1_2_1_1 + 0.00190208967986746*G0_1_1_2_1_2 + 0.00190208967986746*G0_1_1_2_2_1 + 0.0212361712361713*G0_1_1_2_2_2; + A[134] = -A[89] + 0.0369408369408365*G0_1_0_0_0_0 + 0.00410453743787067*G0_1_0_0_0_1 + 0.0718294051627384*G0_1_0_0_0_2 + 0.00410453743787067*G0_1_0_0_1_0 - 0.00410453743787082*G0_1_0_0_1_1 + 0.0718294051627384*G0_1_0_0_2_0 + 0.108770242103575*G0_1_0_0_2_2 + 0.00410453743787067*G0_1_0_1_0_0 - 0.00410453743787082*G0_1_0_1_0_1 - 0.00410453743787082*G0_1_0_1_1_0 - 0.0369408369408367*G0_1_0_1_1_1 - 0.0718294051627382*G0_1_0_1_1_2 - 0.0718294051627382*G0_1_0_1_2_1 - 0.108770242103575*G0_1_0_1_2_2 + 0.0718294051627384*G0_1_0_2_0_0 + 0.108770242103575*G0_1_0_2_0_2 - 0.0718294051627382*G0_1_0_2_1_1 - 0.108770242103575*G0_1_0_2_1_2 + 0.108770242103575*G0_1_0_2_2_0 - 0.108770242103575*G0_1_0_2_2_1 - 0.204816418149751*G0_1_1_0_0_0 - 0.104460477793811*G0_1_1_0_0_1 - 0.0248324514991181*G0_1_1_0_0_2 - 0.104460477793811*G0_1_1_0_1_0 - 0.108565015231681*G0_1_1_0_1_1 - 0.0285265351932018*G0_1_1_0_1_2 - 0.0248324514991181*G0_1_1_0_2_0 - 0.0285265351932018*G0_1_1_0_2_1 - 0.0256533589866923*G0_1_1_0_2_2 - 0.104460477793811*G0_1_1_1_0_0 - 0.108565015231681*G0_1_1_1_0_1 - 0.0285265351932018*G0_1_1_1_0_2 - 0.108565015231681*G0_1_1_1_1_0 - 0.241757255090588*G0_1_1_1_1_1 - 0.0966618566618563*G0_1_1_1_1_2 - 0.0285265351932018*G0_1_1_1_2_0 - 0.0966618566618563*G0_1_1_1_2_1 - 0.134423601090267*G0_1_1_1_2_2 - 0.0248324514991181*G0_1_1_2_0_0 - 0.0285265351932018*G0_1_1_2_0_1 - 0.0256533589866923*G0_1_1_2_0_2 - 0.0285265351932018*G0_1_1_2_1_0 - 0.0966618566618563*G0_1_1_2_1_1 - 0.134423601090267*G0_1_1_2_1_2 - 0.0256533589866923*G0_1_1_2_2_0 - 0.134423601090267*G0_1_1_2_2_1 - 0.201122334455667*G0_1_1_2_2_2; + A[186] = A[134] - 0.634766714766712*G0_0_0_0_0_0 - 0.0445342312008977*G0_0_0_0_0_1 - 0.178547378547378*G0_0_0_0_0_2 - 0.0445342312008977*G0_0_0_0_1_0 - 0.0137502004168671*G0_0_0_0_1_1 - 0.0229854096520763*G0_0_0_0_1_2 - 0.178547378547378*G0_0_0_0_2_0 - 0.0229854096520763*G0_0_0_0_2_1 - 0.0332467532467534*G0_0_0_0_2_2 - 0.0445342312008977*G0_0_0_1_0_0 - 0.0137502004168671*G0_0_0_1_0_1 - 0.0229854096520763*G0_0_0_1_0_2 - 0.0137502004168671*G0_0_0_1_1_0 - 0.0621837421837422*G0_0_0_1_1_1 - 0.0685457752124417*G0_0_0_1_1_2 - 0.0229854096520763*G0_0_0_1_2_0 - 0.0685457752124417*G0_0_0_1_2_1 - 0.134218374218374*G0_0_0_1_2_2 - 0.178547378547378*G0_0_0_2_0_0 - 0.0229854096520763*G0_0_0_2_0_1 - 0.0332467532467534*G0_0_0_2_0_2 - 0.0229854096520763*G0_0_0_2_1_0 - 0.0685457752124417*G0_0_0_2_1_1 - 0.134218374218374*G0_0_0_2_1_2 - 0.0332467532467534*G0_0_0_2_2_0 - 0.134218374218374*G0_0_0_2_2_1 - 0.184704184704186*G0_0_0_2_2_2 - 0.00492544492544585*G0_0_1_0_0_0 - 0.00687510020843354*G0_0_1_0_0_1 - 0.0965592432259096*G0_0_1_0_0_2 - 0.00687510020843355*G0_0_1_0_1_0 - 0.0107744107744107*G0_0_1_0_1_1 - 0.0229854096520763*G0_0_1_0_1_2 - 0.0965592432259096*G0_0_1_0_2_0 - 0.0229854096520763*G0_0_1_0_2_1 - 0.115234888568222*G0_0_1_0_2_2 - 0.00687510020843354*G0_0_1_1_0_0 - 0.0107744107744107*G0_0_1_1_0_1 - 0.0229854096520763*G0_0_1_1_0_2 - 0.0107744107744107*G0_0_1_1_1_0 - 0.0621837421837418*G0_0_1_1_1_1 - 0.0715215648548979*G0_0_1_1_1_2 - 0.0229854096520763*G0_0_1_1_2_0 - 0.0715215648548979*G0_0_1_1_2_1 - 0.171877505210838*G0_0_1_1_2_2 - 0.0965592432259096*G0_0_1_2_0_0 - 0.0229854096520763*G0_0_1_2_0_1 - 0.115234888568222*G0_0_1_2_0_2 - 0.0229854096520763*G0_0_1_2_1_0 - 0.0715215648548979*G0_0_1_2_1_1 - 0.171877505210838*G0_0_1_2_1_2 - 0.115234888568222*G0_0_1_2_2_0 - 0.171877505210838*G0_0_1_2_2_1 - 0.81454545454545*G0_0_1_2_2_2 - 0.236421356421354*G0_1_0_0_0_0 - 0.048741382074715*G0_1_0_0_0_1 - 0.0850665383998715*G0_1_0_0_0_2 - 0.048741382074715*G0_1_0_0_1_0 - 0.0230880230880229*G0_1_0_0_1_1 - 0.0229854096520763*G0_1_0_0_1_2 - 0.0850665383998715*G0_1_0_0_2_0 - 0.0229854096520763*G0_1_0_0_2_1 - 0.12672759339426*G0_1_0_0_2_2 - 0.048741382074715*G0_1_0_1_0_0 - 0.0230880230880229*G0_1_0_1_0_1 - 0.0229854096520763*G0_1_0_1_0_2 - 0.0230880230880229*G0_1_0_1_1_0 - 0.0621837421837421*G0_1_0_1_1_1 - 0.0592079525412857*G0_1_0_1_1_2 - 0.0229854096520763*G0_1_0_1_2_0 - 0.0592079525412857*G0_1_0_1_2_1 - 0.130011223344556*G0_1_0_1_2_2 - 0.0850665383998715*G0_1_0_2_0_0 - 0.0229854096520763*G0_1_0_2_0_1 - 0.12672759339426*G0_1_0_2_0_2 - 0.0229854096520763*G0_1_0_2_1_0 - 0.0592079525412857*G0_1_0_2_1_1 - 0.130011223344556*G0_1_0_2_1_2 - 0.12672759339426*G0_1_0_2_2_0 - 0.130011223344556*G0_1_0_2_2_1 - 0.583049543049543*G0_1_0_2_2_2 + 0.578124098124096*G0_1_1_0_0_0 + 0.123136123136123*G0_1_1_0_0_1 + 0.03016835016835*G0_1_1_0_0_2 + 0.123136123136123*G0_1_1_0_1_0 + 0.0484335417668749*G0_1_1_0_1_1 + 0.03016835016835*G0_1_1_0_2_0 - 0.0301683501683501*G0_1_1_0_2_2 + 0.123136123136123*G0_1_1_1_0_0 + 0.0484335417668749*G0_1_1_1_0_1 + 0.0484335417668749*G0_1_1_1_1_0 - 0.0484335417668749*G0_1_1_1_1_2 - 0.0484335417668749*G0_1_1_1_2_1 - 0.123136123136123*G0_1_1_1_2_2 + 0.03016835016835*G0_1_1_2_0_0 - 0.0301683501683501*G0_1_1_2_0_2 - 0.0484335417668749*G0_1_1_2_1_1 - 0.123136123136123*G0_1_1_2_1_2 - 0.0301683501683501*G0_1_1_2_2_0 - 0.123136123136123*G0_1_1_2_2_1 - 0.578124098124095*G0_1_1_2_2_2; + A[218] = A[134] + 0.0252429052429049*G0_0_1_0_0_0 + 0.000307840307840302*G0_0_1_0_0_1 + 0.0557190957190956*G0_0_1_0_0_2 + 0.000307840307840301*G0_0_1_0_1_0 - 0.00379669713003041*G0_0_1_0_1_1 + 0.00123136123136125*G0_0_1_0_1_2 + 0.0557190957190956*G0_0_1_0_2_0 + 0.00123136123136125*G0_0_1_0_2_1 + 0.067211800545134*G0_0_1_0_2_2 + 0.000307840307840302*G0_0_1_1_0_0 - 0.00379669713003041*G0_0_1_1_0_1 + 0.00123136123136125*G0_0_1_1_0_2 - 0.00379669713003041*G0_0_1_1_1_0 - 0.0116979316979315*G0_0_1_1_1_1 - 0.0161103094436427*G0_0_1_1_1_2 + 0.00123136123136125*G0_0_1_1_2_0 - 0.0161103094436427*G0_0_1_1_2_1 - 0.0415584415584412*G0_0_1_1_2_2 + 0.0557190957190956*G0_0_1_2_0_0 + 0.00123136123136125*G0_0_1_2_0_1 + 0.067211800545134*G0_0_1_2_0_2 + 0.00123136123136125*G0_0_1_2_1_0 - 0.0161103094436427*G0_0_1_2_1_1 - 0.0415584415584412*G0_0_1_2_1_2 + 0.067211800545134*G0_0_1_2_2_0 - 0.0415584415584412*G0_0_1_2_2_1 - 0.206253006253003*G0_0_1_2_2_2 - 0.0252429052429049*G0_1_0_0_0_0 - 0.000307840307840302*G0_1_0_0_0_1 - 0.0557190957190956*G0_1_0_0_0_2 - 0.000307840307840302*G0_1_0_0_1_0 + 0.00379669713003041*G0_1_0_0_1_1 - 0.00123136123136125*G0_1_0_0_1_2 - 0.0557190957190956*G0_1_0_0_2_0 - 0.00123136123136125*G0_1_0_0_2_1 - 0.067211800545134*G0_1_0_0_2_2 - 0.000307840307840302*G0_1_0_1_0_0 + 0.00379669713003041*G0_1_0_1_0_1 - 0.00123136123136125*G0_1_0_1_0_2 + 0.00379669713003041*G0_1_0_1_1_0 + 0.0116979316979315*G0_1_0_1_1_1 + 0.0161103094436427*G0_1_0_1_1_2 - 0.00123136123136125*G0_1_0_1_2_0 + 0.0161103094436427*G0_1_0_1_2_1 + 0.0415584415584413*G0_1_0_1_2_2 - 0.0557190957190956*G0_1_0_2_0_0 - 0.00123136123136125*G0_1_0_2_0_1 - 0.067211800545134*G0_1_0_2_0_2 - 0.00123136123136125*G0_1_0_2_1_0 + 0.0161103094436427*G0_1_0_2_1_1 + 0.0415584415584413*G0_1_0_2_1_2 - 0.067211800545134*G0_1_0_2_2_0 + 0.0415584415584413*G0_1_0_2_2_1 + 0.206253006253003*G0_1_0_2_2_2; + A[215] = -A[218] + 0.0369408369408365*G0_0_1_0_0_0 + 0.00410453743787067*G0_0_1_0_0_1 + 0.0718294051627384*G0_0_1_0_0_2 + 0.00410453743787067*G0_0_1_0_1_0 - 0.00410453743787082*G0_0_1_0_1_1 + 0.0718294051627384*G0_0_1_0_2_0 + 0.108770242103575*G0_0_1_0_2_2 + 0.00410453743787067*G0_0_1_1_0_0 - 0.00410453743787082*G0_0_1_1_0_1 - 0.00410453743787082*G0_0_1_1_1_0 - 0.0369408369408367*G0_0_1_1_1_1 - 0.0718294051627382*G0_0_1_1_1_2 - 0.0718294051627382*G0_0_1_1_2_1 - 0.108770242103575*G0_0_1_1_2_2 + 0.0718294051627384*G0_0_1_2_0_0 + 0.108770242103575*G0_0_1_2_0_2 - 0.0718294051627382*G0_0_1_2_1_1 - 0.108770242103575*G0_0_1_2_1_2 + 0.108770242103575*G0_0_1_2_2_0 - 0.108770242103575*G0_0_1_2_2_1 - 0.204816418149751*G0_1_1_0_0_0 - 0.104460477793811*G0_1_1_0_0_1 - 0.0248324514991181*G0_1_1_0_0_2 - 0.104460477793811*G0_1_1_0_1_0 - 0.108565015231681*G0_1_1_0_1_1 - 0.0285265351932018*G0_1_1_0_1_2 - 0.0248324514991181*G0_1_1_0_2_0 - 0.0285265351932018*G0_1_1_0_2_1 - 0.0256533589866923*G0_1_1_0_2_2 - 0.104460477793811*G0_1_1_1_0_0 - 0.108565015231681*G0_1_1_1_0_1 - 0.0285265351932018*G0_1_1_1_0_2 - 0.108565015231681*G0_1_1_1_1_0 - 0.241757255090588*G0_1_1_1_1_1 - 0.0966618566618563*G0_1_1_1_1_2 - 0.0285265351932018*G0_1_1_1_2_0 - 0.0966618566618563*G0_1_1_1_2_1 - 0.134423601090267*G0_1_1_1_2_2 - 0.0248324514991181*G0_1_1_2_0_0 - 0.0285265351932018*G0_1_1_2_0_1 - 0.0256533589866923*G0_1_1_2_0_2 - 0.0285265351932018*G0_1_1_2_1_0 - 0.0966618566618563*G0_1_1_2_1_1 - 0.134423601090267*G0_1_1_2_1_2 - 0.0256533589866923*G0_1_1_2_2_0 - 0.134423601090267*G0_1_1_2_2_1 - 0.201122334455667*G0_1_1_2_2_2; + A[69] = A[139] - 0.00369408369408463*G0_0_1_0_0_0 + 0.000359147025813658*G0_0_1_0_0_2 + 0.00228314894981558*G0_0_1_0_1_1 - 0.00110309443642778*G0_0_1_0_1_2 + 0.000359147025813658*G0_0_1_0_2_0 - 0.00110309443642778*G0_0_1_0_2_1 + 0.000179573512906818*G0_0_1_0_2_2 + 0.00228314894981558*G0_0_1_1_0_1 - 0.00110309443642778*G0_0_1_1_0_2 + 0.00228314894981558*G0_0_1_1_1_0 - 0.00246272246272288*G0_0_1_1_1_1 + 0.0103383036716369*G0_0_1_1_1_2 - 0.00110309443642778*G0_0_1_1_2_0 + 0.0103383036716369*G0_0_1_1_2_1 - 0.00359147025813697*G0_0_1_1_2_2 + 0.000359147025813658*G0_0_1_2_0_0 - 0.00110309443642778*G0_0_1_2_0_1 + 0.000179573512906817*G0_0_1_2_0_2 - 0.00110309443642778*G0_0_1_2_1_0 + 0.0103383036716369*G0_0_1_2_1_1 - 0.00359147025813697*G0_0_1_2_1_2 + 0.000179573512906817*G0_0_1_2_2_0 - 0.00359147025813698*G0_0_1_2_2_1 - 0.015776815776816*G0_0_1_2_2_2 + 0.00369408369408463*G0_1_0_0_0_0 - 0.000359147025813658*G0_1_0_0_0_2 - 0.00228314894981558*G0_1_0_0_1_1 + 0.00110309443642778*G0_1_0_0_1_2 - 0.000359147025813658*G0_1_0_0_2_0 + 0.00110309443642778*G0_1_0_0_2_1 - 0.000179573512906818*G0_1_0_0_2_2 - 0.00228314894981558*G0_1_0_1_0_1 + 0.00110309443642778*G0_1_0_1_0_2 - 0.00228314894981558*G0_1_0_1_1_0 + 0.00246272246272286*G0_1_0_1_1_1 - 0.0103383036716369*G0_1_0_1_1_2 + 0.00110309443642778*G0_1_0_1_2_0 - 0.0103383036716369*G0_1_0_1_2_1 + 0.00359147025813697*G0_1_0_1_2_2 - 0.000359147025813658*G0_1_0_2_0_0 + 0.00110309443642778*G0_1_0_2_0_1 - 0.000179573512906818*G0_1_0_2_0_2 + 0.00110309443642778*G0_1_0_2_1_0 - 0.0103383036716369*G0_1_0_2_1_1 + 0.00359147025813697*G0_1_0_2_1_2 - 0.000179573512906817*G0_1_0_2_2_0 + 0.00359147025813698*G0_1_0_2_2_1 + 0.015776815776816*G0_1_0_2_2_2; + A[94] = A[69] - 0.0122109988776657*G0_0_0_0_0_0 - 0.00133397466730797*G0_0_0_0_0_1 - 0.00133397466730797*G0_0_0_0_1_0 + 0.00115440115440115*G0_0_0_0_1_1 - 0.000384800384800394*G0_0_0_0_1_2 - 0.000384800384800394*G0_0_0_0_2_1 - 0.00525893859227198*G0_0_0_0_2_2 - 0.00133397466730797*G0_0_0_1_0_0 + 0.00115440115440115*G0_0_0_1_0_1 - 0.000384800384800394*G0_0_0_1_0_2 + 0.00115440115440115*G0_0_0_1_1_0 - 0.0150585217251884*G0_0_0_1_1_1 - 0.00867083533750204*G0_0_0_1_1_2 - 0.000384800384800393*G0_0_0_1_2_0 - 0.00867083533750204*G0_0_0_1_2_1 - 0.0157768157768158*G0_0_0_1_2_2 - 0.000384800384800394*G0_0_0_2_0_1 - 0.00525893859227198*G0_0_0_2_0_2 - 0.000384800384800394*G0_0_0_2_1_0 - 0.00867083533750204*G0_0_0_2_1_1 - 0.0157768157768158*G0_0_0_2_1_2 - 0.00525893859227198*G0_0_0_2_2_0 - 0.0157768157768158*G0_0_0_2_2_1 + 0.0345807279140601*G0_0_0_2_2_2 - 0.00169312169312159*G0_0_1_0_0_1 + 0.00169312169312178*G0_0_1_0_0_2 - 0.00169312169312159*G0_0_1_0_1_0 + 0.00169312169312165*G0_0_1_0_1_1 + 0.00169312169312178*G0_0_1_0_2_0 - 0.00169312169312165*G0_0_1_0_2_2 - 0.00169312169312159*G0_0_1_1_0_0 + 0.00169312169312165*G0_0_1_1_0_1 + 0.00169312169312165*G0_0_1_1_1_0 - 0.0304761904761907*G0_0_1_1_1_1 - 0.00507936507936515*G0_0_1_1_1_2 - 0.00507936507936515*G0_0_1_1_2_1 + 0.005079365079365*G0_0_1_1_2_2 + 0.00169312169312178*G0_0_1_2_0_0 - 0.00169312169312165*G0_0_1_2_0_2 - 0.00507936507936516*G0_0_1_2_1_1 + 0.00507936507936499*G0_0_1_2_1_2 - 0.00169312169312165*G0_0_1_2_2_0 + 0.005079365079365*G0_0_1_2_2_1 + 0.0304761904761902*G0_0_1_2_2_2 - 0.00210357543690868*G0_1_0_0_0_1 + 0.00210357543690877*G0_1_0_0_0_2 - 0.00210357543690868*G0_1_0_0_1_0 + 0.00379669713003048*G0_1_0_0_1_1 + 0.00210357543690877*G0_1_0_0_2_0 - 0.00379669713003046*G0_1_0_0_2_2 - 0.00210357543690868*G0_1_0_1_0_0 + 0.00379669713003047*G0_1_0_1_0_1 + 0.00379669713003047*G0_1_0_1_1_0 - 0.0171620971620974*G0_1_0_1_1_1 + 0.00885040885040881*G0_1_0_1_1_2 + 0.0088504088504088*G0_1_0_1_2_1 - 0.00885040885040879*G0_1_0_1_2_2 + 0.00210357543690877*G0_1_0_2_0_0 - 0.00379669713003046*G0_1_0_2_0_2 + 0.0088504088504088*G0_1_0_2_1_1 - 0.00885040885040879*G0_1_0_2_1_2 - 0.00379669713003046*G0_1_0_2_2_0 - 0.0088504088504088*G0_1_0_2_2_1 + 0.0171620971620969*G0_1_0_2_2_2 + 0.0122109988776668*G0_1_1_0_0_0 + 0.00133397466730808*G0_1_1_0_0_2 + 0.00525893859227194*G0_1_1_0_1_1 + 0.000384800384800394*G0_1_1_0_1_2 + 0.00133397466730808*G0_1_1_0_2_0 + 0.000384800384800394*G0_1_1_0_2_1 - 0.00115440115440113*G0_1_1_0_2_2 + 0.00525893859227194*G0_1_1_1_0_1 + 0.000384800384800393*G0_1_1_1_0_2 + 0.00525893859227193*G0_1_1_1_1_0 - 0.0345807279140612*G0_1_1_1_1_1 + 0.0157768157768157*G0_1_1_1_1_2 + 0.000384800384800393*G0_1_1_1_2_0 + 0.0157768157768157*G0_1_1_1_2_1 + 0.00867083533750198*G0_1_1_1_2_2 + 0.00133397466730808*G0_1_1_2_0_0 + 0.000384800384800393*G0_1_1_2_0_1 - 0.00115440115440113*G0_1_1_2_0_2 + 0.000384800384800393*G0_1_1_2_1_0 + 0.0157768157768157*G0_1_1_2_1_1 + 0.00867083533750198*G0_1_1_2_1_2 - 0.00115440115440113*G0_1_1_2_2_0 + 0.00867083533750198*G0_1_1_2_2_1 + 0.0150585217251881*G0_1_1_2_2_2; + A[66] = A[94] + 0.00369408369408415*G0_0_1_0_0_0 - 0.000359147025813611*G0_0_1_0_0_1 - 0.000359147025813611*G0_0_1_0_1_0 - 0.000179573512906758*G0_0_1_0_1_1 + 0.00110309443642777*G0_0_1_0_1_2 + 0.00110309443642777*G0_0_1_0_2_1 - 0.00228314894981563*G0_0_1_0_2_2 - 0.00035914702581361*G0_0_1_1_0_0 - 0.000179573512906757*G0_0_1_1_0_1 + 0.00110309443642777*G0_0_1_1_0_2 - 0.000179573512906756*G0_0_1_1_1_0 + 0.0157768157768162*G0_0_1_1_1_1 + 0.00359147025813706*G0_0_1_1_1_2 + 0.00110309443642777*G0_0_1_1_2_0 + 0.00359147025813706*G0_0_1_1_2_1 - 0.0103383036716368*G0_0_1_1_2_2 + 0.00110309443642777*G0_0_1_2_0_1 - 0.00228314894981563*G0_0_1_2_0_2 + 0.00110309443642777*G0_0_1_2_1_0 + 0.00359147025813706*G0_0_1_2_1_1 - 0.0103383036716368*G0_0_1_2_1_2 - 0.00228314894981563*G0_0_1_2_2_0 - 0.0103383036716368*G0_0_1_2_2_1 + 0.00246272246272268*G0_0_1_2_2_2 - 0.00369408369408415*G0_1_0_0_0_0 + 0.000359147025813611*G0_1_0_0_0_1 + 0.000359147025813611*G0_1_0_0_1_0 + 0.000179573512906759*G0_1_0_0_1_1 - 0.00110309443642777*G0_1_0_0_1_2 - 0.00110309443642777*G0_1_0_0_2_1 + 0.00228314894981563*G0_1_0_0_2_2 + 0.000359147025813611*G0_1_0_1_0_0 + 0.000179573512906758*G0_1_0_1_0_1 - 0.00110309443642777*G0_1_0_1_0_2 + 0.000179573512906758*G0_1_0_1_1_0 - 0.0157768157768162*G0_1_0_1_1_1 - 0.00359147025813705*G0_1_0_1_1_2 - 0.00110309443642777*G0_1_0_1_2_0 - 0.00359147025813705*G0_1_0_1_2_1 + 0.0103383036716368*G0_1_0_1_2_2 - 0.00110309443642777*G0_1_0_2_0_1 + 0.00228314894981563*G0_1_0_2_0_2 - 0.00110309443642777*G0_1_0_2_1_0 - 0.00359147025813705*G0_1_0_2_1_1 + 0.0103383036716368*G0_1_0_2_1_2 + 0.00228314894981563*G0_1_0_2_2_0 + 0.0103383036716368*G0_1_0_2_2_1 - 0.00246272246272268*G0_1_0_2_2_2; + A[48] = -A[56] + 0.0540772807439471*G0_0_0_0_0_0 + 0.0227459783015338*G0_0_0_0_0_1 + 0.0360515204959647*G0_0_0_0_0_2 + 0.0227459783015338*G0_0_0_0_1_0 + 0.0560953449842336*G0_0_0_0_1_1 + 0.0227459783015338*G0_0_0_0_1_2 + 0.0360515204959647*G0_0_0_0_2_0 + 0.0227459783015338*G0_0_0_0_2_1 + 0.0540772807439471*G0_0_0_0_2_2 + 0.0227459783015338*G0_0_0_1_0_0 + 0.0560953449842336*G0_0_0_1_0_1 + 0.0227459783015338*G0_0_0_1_0_2 + 0.0560953449842336*G0_0_0_1_1_0 + 0.238063171396505*G0_0_0_1_1_1 + 0.112190689968467*G0_0_0_1_1_2 + 0.0227459783015338*G0_0_0_1_2_0 + 0.112190689968467*G0_0_0_1_2_1 + 0.0682379349046014*G0_0_0_1_2_2 + 0.0360515204959647*G0_0_0_2_0_0 + 0.0227459783015338*G0_0_0_2_0_1 + 0.0540772807439471*G0_0_0_2_0_2 + 0.0227459783015338*G0_0_0_2_1_0 + 0.112190689968467*G0_0_0_2_1_1 + 0.0682379349046014*G0_0_0_2_1_2 + 0.0540772807439471*G0_0_0_2_2_0 + 0.0682379349046014*G0_0_0_2_2_1 + 0.216309122975788*G0_0_0_2_2_2 + 0.00769600769600771*G0_1_0_0_0_0 + 0.0123136123136122*G0_1_0_0_0_1 + 0.00256533589866924*G0_1_0_0_0_2 + 0.0123136123136122*G0_1_0_0_1_0 + 0.0266794933461597*G0_1_0_0_1_1 + 0.00615680615680612*G0_1_0_0_1_2 + 0.00256533589866924*G0_1_0_0_2_0 + 0.00615680615680613*G0_1_0_0_2_1 + 0.00256533589866923*G0_1_0_0_2_2 + 0.0123136123136122*G0_1_0_1_0_0 + 0.0266794933461597*G0_1_0_1_0_1 + 0.00615680615680612*G0_1_0_1_0_2 + 0.0266794933461597*G0_1_0_1_1_0 - 0.301683501683502*G0_1_0_1_1_1 + 0.0266794933461599*G0_1_0_1_1_2 + 0.00615680615680613*G0_1_0_1_2_0 + 0.0266794933461599*G0_1_0_1_2_1 + 0.0123136123136123*G0_1_0_1_2_2 + 0.00256533589866924*G0_1_0_2_0_0 + 0.00615680615680612*G0_1_0_2_0_1 + 0.00256533589866923*G0_1_0_2_0_2 + 0.00615680615680613*G0_1_0_2_1_0 + 0.0266794933461599*G0_1_0_2_1_1 + 0.0123136123136123*G0_1_0_2_1_2 + 0.00256533589866923*G0_1_0_2_2_0 + 0.0123136123136123*G0_1_0_2_2_1 + 0.00769600769600758*G0_1_0_2_2_2; + A[39] = A[41] - 0.0145711079044412*G0_1_0_0_0_0 + 0.00485703596814706*G0_1_0_0_0_1 + 0.000119715675271235*G0_1_0_0_0_2 + 0.00485703596814706*G0_1_0_0_1_0 + 0.00485703596814705*G0_1_0_0_1_1 - 0.000119715675271232*G0_1_0_0_1_2 + 0.000119715675271235*G0_1_0_0_2_0 - 0.000119715675271232*G0_1_0_0_2_1 + 0.00485703596814706*G0_1_0_1_0_0 + 0.00485703596814705*G0_1_0_1_0_1 - 0.000119715675271232*G0_1_0_1_0_2 + 0.00485703596814705*G0_1_0_1_1_0 - 0.0145711079044413*G0_1_0_1_1_1 + 0.000119715675271214*G0_1_0_1_1_2 - 0.000119715675271232*G0_1_0_1_2_0 + 0.000119715675271214*G0_1_0_1_2_1 + 0.000119715675271235*G0_1_0_2_0_0 - 0.000119715675271232*G0_1_0_2_0_1 - 0.000119715675271232*G0_1_0_2_1_0 + 0.000119715675271214*G0_1_0_2_1_1 + 0.028167388167388*G0_1_1_0_0_0 + 0.00712308267863819*G0_1_1_0_0_1 - 0.00142803698359253*G0_1_1_0_0_2 + 0.00712308267863819*G0_1_1_0_1_0 - 0.00226604671049119*G0_1_1_0_1_1 - 0.00142803698359253*G0_1_1_0_2_0 - 0.000487413820747149*G0_1_1_0_2_2 + 0.00712308267863819*G0_1_1_1_0_0 - 0.00226604671049118*G0_1_1_1_0_1 - 0.00226604671049118*G0_1_1_1_1_0 - 0.0427384960718295*G0_1_1_1_1_1 + 0.00154775265886374*G0_1_1_1_1_2 + 0.00154775265886374*G0_1_1_1_2_1 + 0.000487413820747142*G0_1_1_1_2_2 - 0.00142803698359254*G0_1_1_2_0_0 - 0.00048741382074715*G0_1_1_2_0_2 + 0.00154775265886374*G0_1_1_2_1_1 + 0.000487413820747142*G0_1_1_2_1_2 - 0.000487413820747149*G0_1_1_2_2_0 + 0.000487413820747142*G0_1_1_2_2_1; + A[137] = A[39] - 0.0167644700978034*G0_0_1_0_0_0 + 0.00288600288600287*G0_0_1_0_0_1 + 0.000333493666826997*G0_0_1_0_0_2 + 0.00288600288600287*G0_0_1_0_1_0 + 0.00197103308214417*G0_0_1_0_1_1 + 0.000333493666826997*G0_0_1_0_2_0 + 0.000714018491796277*G0_0_1_0_2_2 + 0.00288600288600287*G0_0_1_1_0_0 + 0.00197103308214417*G0_0_1_1_0_1 + 0.00197103308214417*G0_0_1_1_1_0 + 0.00219336219336221*G0_0_1_1_1_1 - 0.000213777991555775*G0_0_1_1_1_2 - 0.000213777991555775*G0_0_1_1_2_1 - 0.000714018491796262*G0_0_1_1_2_2 + 0.000333493666826997*G0_0_1_2_0_0 + 0.000714018491796277*G0_0_1_2_0_2 - 0.000213777991555775*G0_0_1_2_1_1 - 0.000714018491796262*G0_0_1_2_1_2 + 0.000714018491796277*G0_0_1_2_2_0 - 0.000714018491796262*G0_0_1_2_2_1 + 0.0167644700978034*G0_1_0_0_0_0 - 0.00288600288600287*G0_1_0_0_0_1 - 0.000333493666826997*G0_1_0_0_0_2 - 0.00288600288600287*G0_1_0_0_1_0 - 0.00197103308214417*G0_1_0_0_1_1 - 0.000333493666826997*G0_1_0_0_2_0 - 0.000714018491796277*G0_1_0_0_2_2 - 0.00288600288600287*G0_1_0_1_0_0 - 0.00197103308214417*G0_1_0_1_0_1 - 0.00197103308214417*G0_1_0_1_1_0 - 0.00219336219336221*G0_1_0_1_1_1 + 0.000213777991555775*G0_1_0_1_1_2 + 0.000213777991555775*G0_1_0_1_2_1 + 0.000714018491796262*G0_1_0_1_2_2 - 0.000333493666826996*G0_1_0_2_0_0 - 0.000714018491796277*G0_1_0_2_0_2 + 0.000213777991555775*G0_1_0_2_1_1 + 0.000714018491796261*G0_1_0_2_1_2 - 0.000714018491796277*G0_1_0_2_2_0 + 0.000714018491796262*G0_1_0_2_2_1; + A[167] = A[137] + 0.0145711079044412*G0_0_1_0_0_0 - 0.00485703596814706*G0_0_1_0_0_1 - 0.000119715675271235*G0_0_1_0_0_2 - 0.00485703596814706*G0_0_1_0_1_0 - 0.00485703596814705*G0_0_1_0_1_1 + 0.000119715675271232*G0_0_1_0_1_2 - 0.000119715675271235*G0_0_1_0_2_0 + 0.000119715675271232*G0_0_1_0_2_1 - 0.00485703596814706*G0_0_1_1_0_0 - 0.00485703596814705*G0_0_1_1_0_1 + 0.000119715675271232*G0_0_1_1_0_2 - 0.00485703596814705*G0_0_1_1_1_0 + 0.0145711079044413*G0_0_1_1_1_1 - 0.000119715675271214*G0_0_1_1_1_2 + 0.000119715675271232*G0_0_1_1_2_0 - 0.000119715675271214*G0_0_1_1_2_1 - 0.000119715675271236*G0_0_1_2_0_0 + 0.000119715675271232*G0_0_1_2_0_1 + 0.000119715675271232*G0_0_1_2_1_0 - 0.000119715675271214*G0_0_1_2_1_1 - 0.028167388167388*G0_1_1_0_0_0 - 0.00712308267863819*G0_1_1_0_0_1 + 0.00142803698359253*G0_1_1_0_0_2 - 0.00712308267863819*G0_1_1_0_1_0 + 0.00226604671049118*G0_1_1_0_1_1 + 0.00142803698359253*G0_1_1_0_2_0 + 0.00048741382074715*G0_1_1_0_2_2 - 0.00712308267863819*G0_1_1_1_0_0 + 0.00226604671049118*G0_1_1_1_0_1 + 0.00226604671049118*G0_1_1_1_1_0 + 0.0427384960718295*G0_1_1_1_1_1 - 0.00154775265886374*G0_1_1_1_1_2 - 0.00154775265886374*G0_1_1_1_2_1 - 0.000487413820747142*G0_1_1_1_2_2 + 0.00142803698359254*G0_1_1_2_0_0 + 0.00048741382074715*G0_1_1_2_0_2 - 0.00154775265886374*G0_1_1_2_1_1 - 0.000487413820747142*G0_1_1_2_1_2 + 0.00048741382074715*G0_1_1_2_2_0 - 0.000487413820747141*G0_1_1_2_2_1; + A[47] = -A[167] - 0.00187269520602862*G0_0_1_0_0_0 - 0.00174442841109508*G0_0_1_0_0_1 + 0.00164181497514828*G0_0_1_0_0_2 - 0.00174442841109508*G0_0_1_0_1_0 - 0.00135107690663246*G0_0_1_0_1_1 + 0.00126129015017904*G0_0_1_0_1_2 + 0.00164181497514828*G0_0_1_0_2_0 + 0.00126129015017903*G0_0_1_0_2_1 + 0.0107829618940729*G0_0_1_0_2_2 - 0.00174442841109508*G0_0_1_1_0_0 - 0.00135107690663246*G0_0_1_1_0_1 + 0.00126129015017903*G0_0_1_1_0_2 - 0.00135107690663246*G0_0_1_1_1_0 + 0.0288600288600289*G0_0_1_1_1_1 + 0.00494254716476939*G0_0_1_1_1_2 + 0.00126129015017903*G0_0_1_1_2_0 + 0.00494254716476938*G0_0_1_1_2_1 + 0.00268505157394046*G0_0_1_1_2_2 + 0.00164181497514828*G0_0_1_2_0_0 + 0.00126129015017903*G0_0_1_2_0_1 + 0.0107829618940729*G0_0_1_2_0_2 + 0.00126129015017903*G0_0_1_2_1_0 + 0.00494254716476938*G0_0_1_2_1_1 + 0.00268505157394046*G0_0_1_2_1_2 + 0.0107829618940729*G0_0_1_2_2_0 + 0.00268505157394046*G0_0_1_2_2_1 + 0.117748917748917*G0_0_1_2_2_2; + A[92] = -A[47] - 0.0117748917748917*G0_0_1_0_0_0 - 0.00130832130832131*G0_0_1_0_0_1 - 0.00384800384800382*G0_0_1_0_0_2 - 0.00130832130832131*G0_0_1_0_1_0 + 0.00130832130832129*G0_0_1_0_1_1 - 0.00384800384800382*G0_0_1_0_2_0 + 0.00666987333653998*G0_0_1_0_2_2 - 0.00130832130832131*G0_0_1_1_0_0 + 0.00130832130832129*G0_0_1_1_0_1 + 0.00130832130832129*G0_0_1_1_1_0 + 0.0117748917748917*G0_0_1_1_1_1 + 0.00384800384800383*G0_0_1_1_1_2 + 0.00384800384800383*G0_0_1_1_2_1 - 0.00666987333653995*G0_0_1_1_2_2 - 0.00384800384800382*G0_0_1_2_0_0 + 0.00666987333653999*G0_0_1_2_0_2 + 0.00384800384800383*G0_0_1_2_1_1 - 0.00666987333653995*G0_0_1_2_1_2 + 0.00666987333653999*G0_0_1_2_2_0 - 0.00666987333653995*G0_0_1_2_2_1 - 0.0584896584896582*G0_1_1_0_0_0 - 0.00847415958527067*G0_1_1_0_0_1 - 0.00330073218962106*G0_1_1_0_0_2 - 0.00847415958527067*G0_1_1_0_1_0 - 0.00716583827694939*G0_1_1_0_1_1 - 0.000867938645716424*G0_1_1_0_1_2 - 0.00330073218962106*G0_1_1_0_2_0 - 0.000867938645716424*G0_1_1_0_2_1 - 0.000769600769600781*G0_1_1_0_2_2 - 0.00847415958527067*G0_1_1_1_0_0 - 0.00716583827694939*G0_1_1_1_0_1 - 0.000867938645716424*G0_1_1_1_0_2 - 0.00716583827694939*G0_1_1_1_1_0 - 0.0467147667147668*G0_1_1_1_1_1 + 0.000547271658382748*G0_1_1_1_1_2 - 0.000867938645716424*G0_1_1_1_2_0 + 0.000547271658382748*G0_1_1_1_2_1 - 0.00743947410614076*G0_1_1_1_2_2 - 0.00330073218962106*G0_1_1_2_0_0 - 0.000867938645716424*G0_1_1_2_0_1 - 0.000769600769600781*G0_1_1_2_0_2 - 0.000867938645716424*G0_1_1_2_1_0 + 0.000547271658382747*G0_1_1_2_1_1 - 0.00743947410614076*G0_1_1_2_1_2 - 0.000769600769600781*G0_1_1_2_2_0 - 0.00743947410614076*G0_1_1_2_2_1 - 0.097611030944364*G0_1_1_2_2_2; + A[121] = A[91] - 0.028167388167388*G0_0_0_0_0_0 + 0.00142803698359253*G0_0_0_0_0_1 - 0.00712308267863817*G0_0_0_0_0_2 + 0.00142803698359253*G0_0_0_0_1_0 + 0.000487413820747155*G0_0_0_0_1_1 - 0.00712308267863817*G0_0_0_0_2_0 + 0.00226604671049116*G0_0_0_0_2_2 + 0.00142803698359253*G0_0_0_1_0_0 + 0.000487413820747155*G0_0_0_1_0_1 + 0.000487413820747155*G0_0_0_1_1_0 - 0.000487413820747139*G0_0_0_1_1_2 - 0.000487413820747139*G0_0_0_1_2_1 - 0.00154775265886376*G0_0_0_1_2_2 - 0.00712308267863817*G0_0_0_2_0_0 + 0.00226604671049116*G0_0_0_2_0_2 - 0.000487413820747139*G0_0_0_2_1_1 - 0.00154775265886376*G0_0_0_2_1_2 + 0.00226604671049116*G0_0_0_2_2_0 - 0.00154775265886376*G0_0_0_2_2_1 + 0.0427384960718292*G0_0_0_2_2_2 + 0.0145711079044413*G0_1_0_0_0_0 - 0.00011971567527122*G0_1_0_0_0_1 - 0.00485703596814705*G0_1_0_0_0_2 - 0.00011971567527122*G0_1_0_0_1_0 + 0.000119715675271233*G0_1_0_0_1_2 - 0.00485703596814705*G0_1_0_0_2_0 + 0.000119715675271233*G0_1_0_0_2_1 - 0.00485703596814706*G0_1_0_0_2_2 - 0.000119715675271221*G0_1_0_1_0_0 + 0.000119715675271233*G0_1_0_1_0_2 + 0.000119715675271233*G0_1_0_1_2_0 - 0.00011971567527123*G0_1_0_1_2_2 - 0.00485703596814705*G0_1_0_2_0_0 + 0.000119715675271233*G0_1_0_2_0_1 - 0.00485703596814706*G0_1_0_2_0_2 + 0.000119715675271233*G0_1_0_2_1_0 - 0.00011971567527123*G0_1_0_2_1_2 - 0.00485703596814706*G0_1_0_2_2_0 - 0.00011971567527123*G0_1_0_2_2_1 + 0.0145711079044411*G0_1_0_2_2_2; + A[70] = A[121] - 0.00954304954304944*G0_0_0_0_0_0 + 0.0013767302656192*G0_0_0_0_0_1 + 0.000265084709529149*G0_0_0_0_0_2 + 0.0013767302656192*G0_0_0_0_1_0 + 0.009525947303725*G0_0_0_0_1_1 + 0.00024370691037357*G0_0_0_0_1_2 + 0.00026508470952915*G0_0_0_0_2_0 + 0.00024370691037357*G0_0_0_0_2_1 - 0.00516487627598736*G0_0_0_0_2_2 + 0.0013767302656192*G0_0_0_1_0_0 + 0.009525947303725*G0_0_0_1_0_1 + 0.000243706910373569*G0_0_0_1_0_2 + 0.009525947303725*G0_0_0_1_1_0 + 0.000795254128587213*G0_0_0_1_1_1 + 0.00830313719202592*G0_0_0_1_1_2 + 0.000243706910373569*G0_0_0_1_2_0 + 0.00830313719202592*G0_0_0_1_2_1 + 0.00683234461012226*G0_0_0_1_2_2 + 0.000265084709529151*G0_0_0_2_0_0 + 0.000243706910373569*G0_0_0_2_0_1 - 0.00516487627598736*G0_0_0_2_0_2 + 0.00024370691037357*G0_0_0_2_1_0 + 0.00830313719202593*G0_0_0_2_1_1 + 0.00683234461012226*G0_0_0_2_1_2 - 0.00516487627598736*G0_0_0_2_2_0 + 0.00683234461012226*G0_0_0_2_2_1 - 0.0476639409972739*G0_0_0_2_2_2 + 0.00835016835016828*G0_0_1_0_0_0 + 0.0108898508898508*G0_0_1_0_0_1 + 0.000654160654160622*G0_0_1_0_0_2 + 0.0108898508898508*G0_0_1_0_1_0 + 0.0163155363155362*G0_0_1_0_1_1 + 0.00284752284752283*G0_0_1_0_1_2 + 0.000654160654160623*G0_0_1_0_2_0 + 0.00284752284752283*G0_0_1_0_2_1 - 0.000538720538720578*G0_0_1_0_2_2 + 0.0108898508898508*G0_0_1_1_0_0 + 0.0163155363155362*G0_0_1_1_0_1 + 0.00284752284752283*G0_0_1_1_0_2 + 0.0163155363155362*G0_0_1_1_1_0 - 0.0111592111592111*G0_0_1_1_1_1 + 0.0138912938912937*G0_0_1_1_1_2 + 0.00284752284752283*G0_0_1_1_2_0 + 0.0138912938912937*G0_0_1_1_2_1 + 0.0145839345839345*G0_0_1_1_2_2 + 0.000654160654160622*G0_0_1_2_0_0 + 0.00284752284752283*G0_0_1_2_0_1 - 0.000538720538720579*G0_0_1_2_0_2 + 0.00284752284752283*G0_0_1_2_1_0 + 0.0138912938912938*G0_0_1_2_1_1 + 0.0145839345839345*G0_0_1_2_1_2 - 0.000538720538720578*G0_0_1_2_2_0 + 0.0145839345839345*G0_0_1_2_2_1 + 0.015161135161135*G0_0_1_2_2_2 + 0.0037325637325636*G0_1_0_0_0_0 + 0.010522152744375*G0_1_0_0_0_1 + 0.000277911389022522*G0_1_0_0_0_2 + 0.010522152744375*G0_1_0_0_1_0 + 0.0292619314841536*G0_1_0_0_1_1 - 0.00225322003099781*G0_1_0_0_1_2 + 0.000277911389022522*G0_1_0_0_2_0 - 0.00225322003099781*G0_1_0_0_2_1 + 0.010522152744375*G0_1_0_1_0_0 + 0.0292619314841536*G0_1_0_1_0_1 - 0.00225322003099781*G0_1_0_1_0_2 + 0.0292619314841536*G0_1_0_1_1_0 - 0.0342472342472352*G0_1_0_1_1_1 + 0.0282657260435036*G0_1_0_1_1_2 - 0.00225322003099781*G0_1_0_1_2_0 + 0.0282657260435036*G0_1_0_1_2_1 + 0.0147635080968413*G0_1_0_1_2_2 + 0.000277911389022522*G0_1_0_2_0_0 - 0.00225322003099781*G0_1_0_2_0_1 - 0.00225322003099781*G0_1_0_2_1_0 + 0.0282657260435035*G0_1_0_2_1_1 + 0.0147635080968413*G0_1_0_2_1_2 + 0.0147635080968413*G0_1_0_2_2_1 - 0.00841430174763503*G0_1_0_2_2_2 + 0.0167003367003367*G0_1_1_0_0_0 + 0.0253198653198652*G0_1_1_0_0_1 - 0.00223184223184225*G0_1_1_0_0_2 + 0.0253198653198652*G0_1_1_0_1_0 + 0.0438672438672436*G0_1_1_0_1_1 + 0.000654160654160637*G0_1_1_0_1_2 - 0.00223184223184225*G0_1_1_0_2_0 + 0.000654160654160636*G0_1_1_0_2_1 - 0.00223184223184224*G0_1_1_0_2_2 + 0.0253198653198652*G0_1_1_1_0_0 + 0.0438672438672436*G0_1_1_1_0_1 + 0.000654160654160637*G0_1_1_1_0_2 + 0.0438672438672436*G0_1_1_1_1_0 - 0.0454064454064458*G0_1_1_1_1_1 + 0.0438672438672436*G0_1_1_1_1_2 + 0.000654160654160636*G0_1_1_1_2_0 + 0.0438672438672436*G0_1_1_1_2_1 + 0.0253198653198651*G0_1_1_1_2_2 - 0.00223184223184225*G0_1_1_2_0_0 + 0.000654160654160636*G0_1_1_2_0_1 - 0.00223184223184224*G0_1_1_2_0_2 + 0.000654160654160636*G0_1_1_2_1_0 + 0.0438672438672436*G0_1_1_2_1_1 + 0.0253198653198651*G0_1_1_2_1_2 - 0.00223184223184224*G0_1_1_2_2_0 + 0.0253198653198651*G0_1_1_2_2_1 + 0.0167003367003367*G0_1_1_2_2_2; + A[157] = A[70] - 0.000461760461760777*G0_0_0_0_0_0 + 0.00754208754208745*G0_0_0_0_0_1 + 0.00477152477152471*G0_0_0_0_0_2 + 0.00754208754208745*G0_0_0_0_1_0 - 0.00754208754208745*G0_0_0_0_1_1 + 0.00477152477152471*G0_0_0_0_2_0 + 0.00454064454064446*G0_0_0_0_2_2 + 0.00754208754208745*G0_0_0_1_0_0 - 0.00754208754208745*G0_0_0_1_0_1 - 0.00754208754208745*G0_0_0_1_1_0 + 0.000461760461760431*G0_0_0_1_1_1 - 0.00477152477152461*G0_0_0_1_1_2 - 0.00477152477152461*G0_0_0_1_2_1 - 0.00454064454064446*G0_0_0_1_2_2 + 0.00477152477152471*G0_0_0_2_0_0 + 0.00454064454064446*G0_0_0_2_0_2 - 0.00477152477152462*G0_0_0_2_1_1 - 0.00454064454064446*G0_0_0_2_1_2 + 0.00454064454064446*G0_0_0_2_2_0 - 0.00454064454064446*G0_0_0_2_2_1 + 0.0166233766233773*G0_0_1_0_0_0 - 0.0320538720538717*G0_0_1_0_0_1 - 0.0218181818181816*G0_0_1_0_0_2 - 0.0320538720538717*G0_0_1_0_1_0 - 0.0257816257816255*G0_0_1_0_1_1 - 0.000577200577200549*G0_0_1_0_1_2 - 0.0218181818181816*G0_0_1_0_2_0 - 0.000577200577200549*G0_0_1_0_2_1 - 0.00892736892736882*G0_0_1_0_2_2 - 0.0320538720538717*G0_0_1_1_0_0 - 0.0257816257816255*G0_0_1_1_0_1 - 0.000577200577200549*G0_0_1_1_0_2 - 0.0257816257816255*G0_0_1_1_1_0 + 0.000808080808080744*G0_0_1_1_1_1 - 0.0105820105820104*G0_0_1_1_1_2 - 0.000577200577200549*G0_0_1_1_2_0 - 0.0105820105820104*G0_0_1_1_2_1 - 0.0112746512746512*G0_0_1_1_2_2 - 0.0218181818181816*G0_0_1_2_0_0 - 0.00057720057720055*G0_0_1_2_0_1 - 0.00892736892736882*G0_0_1_2_0_2 - 0.000577200577200551*G0_0_1_2_1_0 - 0.0105820105820104*G0_0_1_2_1_1 - 0.0112746512746512*G0_0_1_2_1_2 - 0.00892736892736882*G0_0_1_2_2_0 - 0.0112746512746512*G0_0_1_2_2_1 - 0.0255122655122655*G0_0_1_2_2_2 + 0.000346320346320462*G0_1_0_0_0_0 - 0.0182395382395382*G0_1_0_0_0_1 - 0.00581048581048589*G0_1_0_0_0_2 - 0.0182395382395382*G0_1_0_0_1_0 - 0.0395959595959594*G0_1_0_0_1_1 - 0.000577200577200573*G0_1_0_0_1_2 - 0.00581048581048589*G0_1_0_0_2_0 - 0.000577200577200572*G0_1_0_0_2_1 - 0.00673400673400684*G0_1_0_0_2_2 - 0.0182395382395382*G0_1_0_1_0_0 - 0.0395959595959594*G0_1_0_1_0_1 - 0.000577200577200572*G0_1_0_1_0_2 - 0.0395959595959594*G0_1_0_1_1_0 + 0.0170851370851376*G0_1_0_1_1_1 - 0.0265897065897063*G0_1_0_1_1_2 - 0.000577200577200572*G0_1_0_1_2_0 - 0.0265897065897063*G0_1_0_1_2_1 - 0.0134680134680133*G0_1_0_1_2_2 - 0.00581048581048589*G0_1_0_2_0_0 - 0.000577200577200572*G0_1_0_2_0_1 - 0.00673400673400684*G0_1_0_2_0_2 - 0.000577200577200571*G0_1_0_2_1_0 - 0.0265897065897063*G0_1_0_2_1_1 - 0.0134680134680133*G0_1_0_2_1_2 - 0.00673400673400684*G0_1_0_2_2_0 - 0.0134680134680133*G0_1_0_2_2_1 - 0.0255122655122656*G0_1_0_2_2_2 - 0.0259740259740252*G0_1_1_0_0_0 - 0.0189321789321787*G0_1_1_0_0_1 + 0.0110437710437711*G0_1_1_0_0_2 - 0.0189321789321787*G0_1_1_0_1_0 - 0.0389033189033186*G0_1_1_0_1_1 - 0.00057720057720055*G0_1_1_0_1_2 + 0.0110437710437711*G0_1_1_0_2_0 - 0.000577200577200548*G0_1_1_0_2_1 + 0.00350168350168347*G0_1_1_0_2_2 - 0.0189321789321787*G0_1_1_1_0_0 - 0.0389033189033186*G0_1_1_1_0_1 - 0.00057720057720055*G0_1_1_1_0_2 - 0.0389033189033186*G0_1_1_1_1_0 + 0.0434054834054837*G0_1_1_1_1_1 - 0.0434439634439631*G0_1_1_1_1_2 - 0.000577200577200548*G0_1_1_1_2_0 - 0.0434439634439631*G0_1_1_1_2_1 - 0.0237037037037035*G0_1_1_1_2_2 + 0.0110437710437711*G0_1_1_2_0_0 - 0.000577200577200548*G0_1_1_2_0_1 + 0.00350168350168347*G0_1_1_2_0_2 - 0.000577200577200548*G0_1_1_2_1_0 - 0.0434439634439631*G0_1_1_2_1_1 - 0.0237037037037035*G0_1_1_2_1_2 + 0.00350168350168347*G0_1_1_2_2_0 - 0.0237037037037035*G0_1_1_2_2_1 - 0.0255122655122654*G0_1_1_2_2_2; + A[76] = -A[121] - 0.00187269520602862*G0_1_0_0_0_0 + 0.0016418149751483*G0_1_0_0_0_1 - 0.00174442841109509*G0_1_0_0_0_2 + 0.0016418149751483*G0_1_0_0_1_0 + 0.010782961894073*G0_1_0_0_1_1 + 0.00126129015017904*G0_1_0_0_1_2 - 0.00174442841109509*G0_1_0_0_2_0 + 0.00126129015017904*G0_1_0_0_2_1 - 0.00135107690663248*G0_1_0_0_2_2 + 0.0016418149751483*G0_1_0_1_0_0 + 0.010782961894073*G0_1_0_1_0_1 + 0.00126129015017904*G0_1_0_1_0_2 + 0.010782961894073*G0_1_0_1_1_0 + 0.117748917748918*G0_1_0_1_1_1 + 0.00268505157394047*G0_1_0_1_1_2 + 0.00126129015017904*G0_1_0_1_2_0 + 0.00268505157394047*G0_1_0_1_2_1 + 0.00494254716476936*G0_1_0_1_2_2 - 0.00174442841109509*G0_1_0_2_0_0 + 0.00126129015017904*G0_1_0_2_0_1 - 0.00135107690663247*G0_1_0_2_0_2 + 0.00126129015017904*G0_1_0_2_1_0 + 0.00268505157394047*G0_1_0_2_1_1 + 0.00494254716476936*G0_1_0_2_1_2 - 0.00135107690663247*G0_1_0_2_2_0 + 0.00494254716476936*G0_1_0_2_2_1 + 0.0288600288600286*G0_1_0_2_2_2; + A[154] = A[70] - 0.00681096681096695*G0_0_1_0_0_0 - 0.000153920153920052*G0_0_1_0_0_1 - 0.0023472823472823*G0_0_1_0_0_2 - 0.000153920153920047*G0_0_1_0_1_0 + 0.0136604136604137*G0_0_1_0_1_1 - 0.00504088504088502*G0_0_1_0_1_2 - 0.0023472823472823*G0_0_1_0_2_0 - 0.00504088504088502*G0_0_1_0_2_1 - 0.00234728234728229*G0_0_1_0_2_2 - 0.000153920153920049*G0_0_1_1_0_0 + 0.0136604136604137*G0_0_1_1_0_1 - 0.00504088504088502*G0_0_1_1_0_2 + 0.0136604136604137*G0_0_1_1_1_0 - 0.0230880230880238*G0_0_1_1_1_1 + 0.0136604136604136*G0_0_1_1_1_2 - 0.00504088504088502*G0_0_1_1_2_0 + 0.0136604136604136*G0_0_1_1_2_1 - 0.000153920153920177*G0_0_1_1_2_2 - 0.0023472823472823*G0_0_1_2_0_0 - 0.00504088504088502*G0_0_1_2_0_1 - 0.00234728234728229*G0_0_1_2_0_2 - 0.00504088504088503*G0_0_1_2_1_0 + 0.0136604136604135*G0_0_1_2_1_1 - 0.000153920153920184*G0_0_1_2_1_2 - 0.00234728234728229*G0_0_1_2_2_0 - 0.000153920153920179*G0_0_1_2_2_1 - 0.00681096681096659*G0_0_1_2_2_2 + 0.00681096681096695*G0_1_0_0_0_0 + 0.000153920153920052*G0_1_0_0_0_1 + 0.0023472823472823*G0_1_0_0_0_2 + 0.000153920153920047*G0_1_0_0_1_0 - 0.0136604136604137*G0_1_0_0_1_1 + 0.00504088504088502*G0_1_0_0_1_2 + 0.0023472823472823*G0_1_0_0_2_0 + 0.00504088504088502*G0_1_0_0_2_1 + 0.00234728234728229*G0_1_0_0_2_2 + 0.000153920153920049*G0_1_0_1_0_0 - 0.0136604136604137*G0_1_0_1_0_1 + 0.00504088504088502*G0_1_0_1_0_2 - 0.0136604136604137*G0_1_0_1_1_0 + 0.0230880230880238*G0_1_0_1_1_1 - 0.0136604136604136*G0_1_0_1_1_2 + 0.00504088504088502*G0_1_0_1_2_0 - 0.0136604136604136*G0_1_0_1_2_1 + 0.000153920153920175*G0_1_0_1_2_2 + 0.0023472823472823*G0_1_0_2_0_0 + 0.00504088504088502*G0_1_0_2_0_1 + 0.00234728234728229*G0_1_0_2_0_2 + 0.00504088504088503*G0_1_0_2_1_0 - 0.0136604136604136*G0_1_0_2_1_1 + 0.000153920153920179*G0_1_0_2_1_2 + 0.00234728234728229*G0_1_0_2_2_0 + 0.000153920153920174*G0_1_0_2_2_1 + 0.00681096681096659*G0_1_0_2_2_2; + A[109] = A[70] + 0.0255122655122654*G0_0_0_0_0_0 - 0.00350168350168353*G0_0_0_0_0_1 + 0.0237037037037036*G0_0_0_0_0_2 - 0.00350168350168353*G0_0_0_0_1_0 - 0.011043771043771*G0_0_0_0_1_1 + 0.000577200577200586*G0_0_0_0_1_2 + 0.0237037037037036*G0_0_0_0_2_0 + 0.000577200577200585*G0_0_0_0_2_1 + 0.0434439634439634*G0_0_0_0_2_2 - 0.00350168350168353*G0_0_0_1_0_0 - 0.011043771043771*G0_0_0_1_0_1 + 0.000577200577200586*G0_0_0_1_0_2 - 0.011043771043771*G0_0_0_1_1_0 + 0.025974025974026*G0_0_0_1_1_1 + 0.018932178932179*G0_0_0_1_1_2 + 0.000577200577200585*G0_0_0_1_2_0 + 0.018932178932179*G0_0_0_1_2_1 + 0.0389033189033189*G0_0_0_1_2_2 + 0.0237037037037036*G0_0_0_2_0_0 + 0.000577200577200585*G0_0_0_2_0_1 + 0.0434439634439634*G0_0_0_2_0_2 + 0.000577200577200585*G0_0_0_2_1_0 + 0.018932178932179*G0_0_0_2_1_1 + 0.0389033189033189*G0_0_0_2_1_2 + 0.0434439634439634*G0_0_0_2_2_0 + 0.0389033189033189*G0_0_0_2_2_1 - 0.0434054834054816*G0_0_0_2_2_2 - 0.0102356902356901*G0_0_1_0_0_1 + 0.0102356902356903*G0_0_1_0_0_2 - 0.0102356902356901*G0_0_1_0_1_0 - 0.0168542568542566*G0_0_1_0_1_1 + 0.0102356902356903*G0_0_1_0_2_0 + 0.016854256854257*G0_0_1_0_2_2 - 0.0102356902356901*G0_0_1_1_0_0 - 0.0168542568542566*G0_0_1_1_0_1 - 0.0168542568542566*G0_0_1_1_1_0 + 0.0263203463203471*G0_0_1_1_1_1 + 0.000692640692640903*G0_0_1_1_1_2 + 0.000692640692640906*G0_0_1_1_2_1 - 0.000692640692640484*G0_0_1_1_2_2 + 0.0102356902356903*G0_0_1_2_0_0 + 0.016854256854257*G0_0_1_2_0_2 + 0.000692640692640901*G0_0_1_2_1_1 - 0.000692640692640488*G0_0_1_2_1_2 + 0.016854256854257*G0_0_1_2_2_0 - 0.000692640692640486*G0_0_1_2_2_1 - 0.0263203463203449*G0_0_1_2_2_2 - 0.0124290524290525*G0_1_0_0_0_1 + 0.0124290524290524*G0_1_0_0_0_2 - 0.0124290524290525*G0_1_0_0_1_0 - 0.0328619528619527*G0_1_0_0_1_1 + 0.0124290524290524*G0_1_0_0_2_0 + 0.0328619528619528*G0_1_0_0_2_2 - 0.0124290524290525*G0_1_0_1_0_0 - 0.0328619528619528*G0_1_0_1_0_1 - 0.0328619528619527*G0_1_0_1_1_0 + 0.0425974025974032*G0_1_0_1_1_1 - 0.013121693121693*G0_1_0_1_1_2 - 0.013121693121693*G0_1_0_1_2_1 + 0.0131216931216931*G0_1_0_1_2_2 + 0.0124290524290524*G0_1_0_2_0_0 + 0.0328619528619528*G0_1_0_2_0_2 - 0.013121693121693*G0_1_0_2_1_1 + 0.0131216931216931*G0_1_0_2_1_2 + 0.0328619528619528*G0_1_0_2_2_0 + 0.0131216931216931*G0_1_0_2_2_1 - 0.0425974025974012*G0_1_0_2_2_2 - 0.0255122655122662*G0_1_1_0_0_0 - 0.0237037037037036*G0_1_1_0_0_1 + 0.00350168350168345*G0_1_1_0_0_2 - 0.0237037037037036*G0_1_1_0_1_0 - 0.0434439634439632*G0_1_1_0_1_1 - 0.000577200577200569*G0_1_1_0_1_2 + 0.00350168350168345*G0_1_1_0_2_0 - 0.000577200577200569*G0_1_1_0_2_1 + 0.0110437710437711*G0_1_1_0_2_2 - 0.0237037037037036*G0_1_1_1_0_0 - 0.0434439634439632*G0_1_1_1_0_1 - 0.00057720057720057*G0_1_1_1_0_2 - 0.0434439634439632*G0_1_1_1_1_0 + 0.0434054834054844*G0_1_1_1_1_1 - 0.0389033189033186*G0_1_1_1_1_2 - 0.000577200577200569*G0_1_1_1_2_0 - 0.0389033189033186*G0_1_1_1_2_1 - 0.0189321789321787*G0_1_1_1_2_2 + 0.00350168350168345*G0_1_1_2_0_0 - 0.000577200577200569*G0_1_1_2_0_1 + 0.0110437710437711*G0_1_1_2_0_2 - 0.000577200577200569*G0_1_1_2_1_0 - 0.0389033189033186*G0_1_1_2_1_1 - 0.0189321789321787*G0_1_1_2_1_2 + 0.0110437710437711*G0_1_1_2_2_0 - 0.0189321789321787*G0_1_1_2_2_1 - 0.025974025974025*G0_1_1_2_2_2; + A[67] = A[109] - 0.00681096681096741*G0_0_1_0_0_0 - 0.00234728234728246*G0_0_1_0_0_1 - 0.000153920153920253*G0_0_1_0_0_2 - 0.00234728234728246*G0_0_1_0_1_0 - 0.00234728234728246*G0_0_1_0_1_1 - 0.00504088504088506*G0_0_1_0_1_2 - 0.000153920153920255*G0_0_1_0_2_0 - 0.00504088504088506*G0_0_1_0_2_1 + 0.0136604136604135*G0_0_1_0_2_2 - 0.00234728234728246*G0_0_1_1_0_0 - 0.00234728234728246*G0_0_1_1_0_1 - 0.00504088504088506*G0_0_1_1_0_2 - 0.00234728234728246*G0_0_1_1_1_0 - 0.00681096681096773*G0_0_1_1_1_1 - 0.000153920153920347*G0_0_1_1_1_2 - 0.00504088504088506*G0_0_1_1_2_0 - 0.000153920153920347*G0_0_1_1_2_1 + 0.0136604136604134*G0_0_1_1_2_2 - 0.000153920153920257*G0_0_1_2_0_0 - 0.00504088504088506*G0_0_1_2_0_1 + 0.0136604136604135*G0_0_1_2_0_2 - 0.00504088504088506*G0_0_1_2_1_0 - 0.000153920153920347*G0_0_1_2_1_1 + 0.0136604136604134*G0_0_1_2_1_2 + 0.0136604136604135*G0_0_1_2_2_0 + 0.0136604136604134*G0_0_1_2_2_1 - 0.0230880230880228*G0_0_1_2_2_2 + 0.00681096681096741*G0_1_0_0_0_0 + 0.00234728234728246*G0_1_0_0_0_1 + 0.000153920153920253*G0_1_0_0_0_2 + 0.00234728234728246*G0_1_0_0_1_0 + 0.00234728234728246*G0_1_0_0_1_1 + 0.00504088504088506*G0_1_0_0_1_2 + 0.000153920153920255*G0_1_0_0_2_0 + 0.00504088504088506*G0_1_0_0_2_1 - 0.0136604136604135*G0_1_0_0_2_2 + 0.00234728234728246*G0_1_0_1_0_0 + 0.00234728234728246*G0_1_0_1_0_1 + 0.00504088504088506*G0_1_0_1_0_2 + 0.00234728234728246*G0_1_0_1_1_0 + 0.00681096681096773*G0_1_0_1_1_1 + 0.000153920153920344*G0_1_0_1_1_2 + 0.00504088504088506*G0_1_0_1_2_0 + 0.000153920153920345*G0_1_0_1_2_1 - 0.0136604136604134*G0_1_0_1_2_2 + 0.000153920153920259*G0_1_0_2_0_0 + 0.00504088504088506*G0_1_0_2_0_1 - 0.0136604136604135*G0_1_0_2_0_2 + 0.00504088504088506*G0_1_0_2_1_0 + 0.000153920153920349*G0_1_0_2_1_1 - 0.0136604136604134*G0_1_0_2_1_2 - 0.0136604136604135*G0_1_0_2_2_0 - 0.0136604136604134*G0_1_0_2_2_1 + 0.0230880230880229*G0_1_0_2_2_2; + A[136] = -A[76] - 0.0584896584896583*G0_0_0_0_0_0 - 0.00330073218962107*G0_0_0_0_0_1 - 0.00847415958527065*G0_0_0_0_0_2 - 0.00330073218962107*G0_0_0_0_1_0 - 0.00076960076960079*G0_0_0_0_1_1 - 0.000867938645716421*G0_0_0_0_1_2 - 0.00847415958527065*G0_0_0_0_2_0 - 0.000867938645716421*G0_0_0_0_2_1 - 0.00716583827694935*G0_0_0_0_2_2 - 0.00330073218962107*G0_0_0_1_0_0 - 0.00076960076960079*G0_0_0_1_0_1 - 0.000867938645716421*G0_0_0_1_0_2 - 0.000769600769600787*G0_0_0_1_1_0 - 0.0976110309443641*G0_0_0_1_1_1 - 0.00743947410614075*G0_0_0_1_1_2 - 0.000867938645716421*G0_0_0_1_2_0 - 0.00743947410614075*G0_0_0_1_2_1 + 0.00054727165838276*G0_0_0_1_2_2 - 0.00847415958527065*G0_0_0_2_0_0 - 0.000867938645716421*G0_0_0_2_0_1 - 0.00716583827694935*G0_0_0_2_0_2 - 0.000867938645716421*G0_0_0_2_1_0 - 0.00743947410614075*G0_0_0_2_1_1 + 0.000547271658382759*G0_0_0_2_1_2 - 0.00716583827694935*G0_0_0_2_2_0 + 0.000547271658382759*G0_0_0_2_2_1 - 0.0467147667147665*G0_0_0_2_2_2 - 0.0117748917748917*G0_1_0_0_0_0 - 0.00384800384800382*G0_1_0_0_0_1 - 0.00130832130832131*G0_1_0_0_0_2 - 0.00384800384800382*G0_1_0_0_1_0 + 0.00666987333653999*G0_1_0_0_1_1 - 0.00130832130832131*G0_1_0_0_2_0 + 0.00130832130832129*G0_1_0_0_2_2 - 0.00384800384800382*G0_1_0_1_0_0 + 0.00666987333654*G0_1_0_1_0_1 + 0.00666987333654*G0_1_0_1_1_0 - 0.00666987333653995*G0_1_0_1_1_2 - 0.00666987333653995*G0_1_0_1_2_1 + 0.00384800384800382*G0_1_0_1_2_2 - 0.00130832130832131*G0_1_0_2_0_0 + 0.0013083213083213*G0_1_0_2_0_2 - 0.00666987333653995*G0_1_0_2_1_1 + 0.00384800384800382*G0_1_0_2_1_2 + 0.0013083213083213*G0_1_0_2_2_0 + 0.00384800384800382*G0_1_0_2_2_1 + 0.0117748917748917*G0_1_0_2_2_2; + A[87] = -A[132] - 0.0652621452621451*G0_1_0_0_0_0 + 0.00451499118165783*G0_1_0_0_0_1 - 0.0250376783710115*G0_1_0_0_0_2 + 0.00451499118165783*G0_1_0_0_1_0 + 0.0131345198011864*G0_1_0_0_1_1 + 0.000410453743787077*G0_1_0_0_1_2 - 0.0250376783710115*G0_1_0_0_2_0 + 0.000410453743787077*G0_1_0_0_2_1 - 0.0205226871893536*G0_1_0_0_2_2 + 0.00451499118165783*G0_1_0_1_0_0 + 0.0131345198011864*G0_1_0_1_0_1 + 0.000410453743787077*G0_1_0_1_0_2 + 0.0131345198011864*G0_1_0_1_1_0 + 0.0123136123136123*G0_1_0_1_1_1 + 0.0242167708834373*G0_1_0_1_1_2 + 0.000410453743787077*G0_1_0_1_2_0 + 0.0242167708834374*G0_1_0_1_2_1 + 0.0205226871893537*G0_1_0_1_2_2 - 0.0250376783710115*G0_1_0_2_0_0 + 0.000410453743787079*G0_1_0_2_0_1 - 0.0205226871893536*G0_1_0_2_0_2 + 0.000410453743787078*G0_1_0_2_1_0 + 0.0242167708834373*G0_1_0_2_1_1 + 0.0205226871893537*G0_1_0_2_1_2 - 0.0205226871893536*G0_1_0_2_2_0 + 0.0205226871893537*G0_1_0_2_2_1 + 0.30866121532788*G0_1_1_0_0_0 + 0.114721821388487*G0_1_1_0_0_1 - 0.00800384800384804*G0_1_1_0_0_2 + 0.114721821388487*G0_1_1_0_1_0 + 0.0728555395222058*G0_1_1_0_1_1 + 0.00430976430976427*G0_1_1_0_1_2 - 0.00800384800384804*G0_1_1_0_2_0 + 0.00430976430976426*G0_1_1_0_2_1 - 0.0391983325316658*G0_1_1_0_2_2 + 0.114721821388487*G0_1_1_1_0_0 + 0.0728555395222058*G0_1_1_1_0_1 + 0.00430976430976427*G0_1_1_1_0_2 + 0.0728555395222058*G0_1_1_1_1_0 + 0.0439185505852169*G0_1_1_1_1_1 + 0.0322206188872853*G0_1_1_1_1_2 + 0.00430976430976427*G0_1_1_1_2_0 + 0.0322206188872853*G0_1_1_1_2_1 + 0.0289369889369887*G0_1_1_1_2_2 - 0.00800384800384804*G0_1_1_2_0_0 + 0.00430976430976427*G0_1_1_2_0_1 - 0.0391983325316658*G0_1_1_2_0_2 + 0.00430976430976426*G0_1_1_2_1_0 + 0.0322206188872853*G0_1_1_2_1_1 + 0.0289369889369887*G0_1_1_2_1_2 - 0.0391983325316658*G0_1_1_2_2_0 + 0.0289369889369887*G0_1_1_2_2_1 - 0.0348885682219018*G0_1_1_2_2_2; + A[202] = A[87] + 0.0416354016354017*G0_0_0_0_0_0 + 0.0048997915664582*G0_0_0_0_0_1 + 0.0573096039762705*G0_0_0_0_0_2 + 0.0048997915664582*G0_0_0_0_1_0 + 0.0014622414622414*G0_0_0_0_1_1 - 0.00523328523328524*G0_0_0_0_1_2 + 0.0573096039762705*G0_0_0_0_2_0 - 0.00523328523328524*G0_0_0_0_2_1 + 0.0856309122975787*G0_0_0_0_2_2 + 0.0048997915664582*G0_0_0_1_0_0 + 0.0014622414622414*G0_0_0_1_0_1 - 0.00523328523328524*G0_0_0_1_0_2 + 0.0014622414622414*G0_0_0_1_1_0 - 0.0114670514670517*G0_0_0_1_1_1 - 0.0283726150392818*G0_0_0_1_1_2 - 0.00523328523328524*G0_0_0_1_2_0 - 0.0283726150392818*G0_0_0_1_2_1 - 0.0363764630431298*G0_0_0_1_2_2 + 0.0573096039762705*G0_0_0_2_0_0 - 0.00523328523328524*G0_0_0_2_0_1 + 0.0856309122975786*G0_0_0_2_0_2 - 0.00523328523328524*G0_0_0_2_1_0 - 0.0283726150392818*G0_0_0_2_1_1 - 0.0363764630431298*G0_0_0_2_1_2 + 0.0856309122975786*G0_0_0_2_2_0 - 0.0363764630431298*G0_0_0_2_2_1 + 0.153920153920152*G0_0_0_2_2_2 - 0.09771364438031*G0_0_1_0_0_0 + 0.000974827641494432*G0_0_1_0_0_1 - 0.022908449575116*G0_0_1_0_0_2 + 0.000974827641494432*G0_0_1_0_1_0 + 0.00310405643738978*G0_0_1_0_1_1 - 0.00182138848805518*G0_0_1_0_1_2 - 0.022908449575116*G0_0_1_0_2_0 - 0.00182138848805518*G0_0_1_0_2_1 + 0.0123136123136123*G0_0_1_0_2_2 + 0.000974827641494432*G0_0_1_1_0_0 + 0.00310405643738978*G0_0_1_1_0_1 - 0.00182138848805518*G0_0_1_1_0_2 + 0.00310405643738978*G0_0_1_1_1_0 + 0.00056437389770702*G0_0_1_1_1_1 - 0.020599647266314*G0_0_1_1_1_2 - 0.00182138848805518*G0_0_1_1_2_0 - 0.020599647266314*G0_0_1_1_2_1 - 0.0475613275613275*G0_0_1_1_2_2 - 0.022908449575116*G0_0_1_2_0_0 - 0.00182138848805518*G0_0_1_2_0_1 + 0.0123136123136123*G0_0_1_2_0_2 - 0.00182138848805518*G0_0_1_2_1_0 - 0.020599647266314*G0_0_1_2_1_1 - 0.0475613275613275*G0_0_1_2_1_2 + 0.0123136123136123*G0_0_1_2_2_0 - 0.0475613275613275*G0_0_1_2_2_1 - 0.0573096039762712*G0_0_1_2_2_2 - 0.00951739618406273*G0_1_0_0_0_0 + 0.00274490941157602*G0_1_0_0_0_1 + 0.00274490941157602*G0_1_0_0_1_0 + 0.00328362995029645*G0_1_0_0_1_1 - 0.00264229597562933*G0_1_0_0_1_2 - 0.00264229597562933*G0_1_0_0_2_1 + 0.00602853936187264*G0_1_0_0_2_2 + 0.00274490941157602*G0_1_0_1_0_0 + 0.00328362995029645*G0_1_0_1_0_1 - 0.00264229597562933*G0_1_0_1_0_2 + 0.00328362995029645*G0_1_0_1_1_0 - 0.00374539041205805*G0_1_0_1_1_1 - 0.0435594035594035*G0_1_0_1_1_2 - 0.00264229597562933*G0_1_0_1_2_0 - 0.0435594035594035*G0_1_0_1_2_1 - 0.0655443322109987*G0_1_0_1_2_2 - 0.00264229597562933*G0_1_0_2_0_1 + 0.00602853936187264*G0_1_0_2_0_2 - 0.00264229597562933*G0_1_0_2_1_0 - 0.0435594035594035*G0_1_0_2_1_1 - 0.0655443322109987*G0_1_0_2_1_2 + 0.00602853936187265*G0_1_0_2_2_0 - 0.0655443322109987*G0_1_0_2_2_1 - 0.0691614558281232*G0_1_0_2_2_2 - 0.0610293410293411*G0_1_1_0_0_0 - 0.0504858104858102*G0_1_1_0_0_1 - 0.0103896103896103*G0_1_1_0_0_2 - 0.0504858104858102*G0_1_1_0_1_0 - 0.0384287317620649*G0_1_1_0_1_1 - 0.00590027256693921*G0_1_1_0_1_2 - 0.0103896103896103*G0_1_1_0_2_0 - 0.00590027256693921*G0_1_1_0_2_1 - 0.00402757736091063*G0_1_1_0_2_2 - 0.0504858104858102*G0_1_1_1_0_0 - 0.038428731762065*G0_1_1_1_0_1 - 0.00590027256693921*G0_1_1_1_0_2 - 0.038428731762065*G0_1_1_1_1_0 - 0.0083116883116888*G0_1_1_1_1_1 - 0.0413019079685745*G0_1_1_1_1_2 - 0.00590027256693921*G0_1_1_1_2_0 - 0.0413019079685745*G0_1_1_1_2_1 - 0.0747025813692477*G0_1_1_1_2_2 - 0.0103896103896103*G0_1_1_2_0_0 - 0.00590027256693921*G0_1_1_2_0_1 - 0.00402757736091063*G0_1_1_2_0_2 - 0.00590027256693921*G0_1_1_2_1_0 - 0.0413019079685745*G0_1_1_2_1_1 - 0.0747025813692477*G0_1_1_2_1_2 - 0.00402757736091063*G0_1_1_2_2_0 - 0.0747025813692478*G0_1_1_2_2_1 - 0.151534391534391*G0_1_1_2_2_2; + A[149] = A[87] - 0.0872214205547538*G0_0_0_0_0_0 + 0.00287317620650956*G0_0_0_0_0_1 - 0.00595157928491255*G0_0_0_0_0_2 + 0.00287317620650956*G0_0_0_0_1_0 + 0.00697771364438028*G0_0_0_0_1_1 + 0.00143658810325475*G0_0_0_0_1_2 - 0.00595157928491255*G0_0_0_0_2_0 + 0.00143658810325475*G0_0_0_0_2_1 + 0.0158024691358023*G0_0_0_0_2_2 + 0.00287317620650956*G0_0_0_1_0_0 + 0.00697771364438028*G0_0_0_1_0_1 + 0.00143658810325475*G0_0_0_1_0_2 + 0.00697771364438028*G0_0_0_1_1_0 + 0.00513067179733828*G0_0_0_1_1_1 + 0.0149815616482281*G0_0_0_1_1_2 + 0.00143658810325475*G0_0_0_1_2_0 + 0.0149815616482281*G0_0_0_1_2_1 + 0.0129292929292927*G0_0_0_1_2_2 - 0.00595157928491256*G0_0_0_2_0_0 + 0.00143658810325475*G0_0_0_2_0_1 + 0.0158024691358023*G0_0_0_2_0_2 + 0.00143658810325475*G0_0_0_2_1_0 + 0.0149815616482281*G0_0_0_2_1_1 + 0.0129292929292927*G0_0_0_2_1_2 + 0.0158024691358023*G0_0_0_2_2_0 + 0.0129292929292927*G0_0_0_2_2_1 + 0.066083052749718*G0_0_0_2_2_2 - 0.00348885682219081*G0_0_1_0_0_0 + 0.0281160814494146*G0_0_1_0_0_1 - 0.00656725990059322*G0_0_1_0_0_2 + 0.0281160814494146*G0_0_1_0_1_0 + 0.0238063171396504*G0_0_1_0_1_1 + 0.00225749559082891*G0_0_1_0_1_2 - 0.00656725990059323*G0_0_1_0_2_0 + 0.00225749559082891*G0_0_1_0_2_1 - 0.000205226871893563*G0_0_1_0_2_2 + 0.0281160814494146*G0_0_1_1_0_0 + 0.0238063171396504*G0_0_1_1_0_1 + 0.00225749559082891*G0_0_1_1_0_2 + 0.0238063171396504*G0_0_1_1_1_0 + 0.00944043610710261*G0_0_1_1_1_1 + 0.0209331409331407*G0_0_1_1_1_2 + 0.00225749559082891*G0_0_1_1_2_0 + 0.0209331409331407*G0_0_1_1_2_1 + 0.003899310565977*G0_0_1_1_2_2 - 0.00656725990059323*G0_0_1_2_0_0 + 0.00225749559082891*G0_0_1_2_0_1 - 0.000205226871893565*G0_0_1_2_0_2 + 0.00225749559082891*G0_0_1_2_1_0 + 0.0209331409331407*G0_0_1_2_1_1 + 0.003899310565977*G0_0_1_2_1_2 - 0.000205226871893565*G0_0_1_2_2_0 + 0.003899310565977*G0_0_1_2_2_1 - 0.093993907327241*G0_0_1_2_2_2 + 0.0728555395222064*G0_1_0_0_0_0 + 0.0119031585698253*G0_1_0_0_0_1 + 0.0100561167227833*G0_1_0_0_0_2 + 0.0119031585698253*G0_1_0_0_1_0 + 0.00102613435946772*G0_1_0_0_1_1 + 0.000615680615680615*G0_1_0_0_1_2 + 0.0100561167227833*G0_1_0_0_2_0 + 0.000615680615680614*G0_1_0_0_2_1 + 0.016418149751483*G0_1_0_0_2_2 + 0.0119031585698253*G0_1_0_1_0_0 + 0.00102613435946772*G0_1_0_1_0_1 + 0.000615680615680615*G0_1_0_1_0_2 + 0.00102613435946772*G0_1_0_1_1_0 + 0.000820907487574047*G0_1_0_1_1_1 - 0.00184704184704179*G0_1_0_1_1_2 + 0.000615680615680615*G0_1_0_1_2_0 - 0.00184704184704179*G0_1_0_1_2_1 - 0.0123136123136122*G0_1_0_1_2_2 + 0.0100561167227833*G0_1_0_2_0_0 + 0.000615680615680615*G0_1_0_2_0_1 + 0.016418149751483*G0_1_0_2_0_2 + 0.000615680615680615*G0_1_0_2_1_0 - 0.00184704184704179*G0_1_0_2_1_1 - 0.0123136123136122*G0_1_0_2_1_2 + 0.016418149751483*G0_1_0_2_2_0 - 0.0123136123136122*G0_1_0_2_2_1 - 0.0176495109828442*G0_1_0_2_2_2 + 0.0905050505050506*G0_1_1_0_0_0 + 0.0242167708834375*G0_1_1_0_0_1 - 0.00636203302869965*G0_1_1_0_0_2 + 0.0242167708834375*G0_1_1_0_1_0 + 0.00287317620650958*G0_1_1_0_1_1 - 0.00636203302869966*G0_1_1_0_2_0 + 0.00636203302869968*G0_1_1_0_2_2 + 0.0242167708834375*G0_1_1_1_0_0 + 0.00287317620650954*G0_1_1_1_0_1 + 0.00287317620650955*G0_1_1_1_1_0 - 0.0028731762065095*G0_1_1_1_1_2 - 0.0028731762065095*G0_1_1_1_2_1 - 0.0242167708834374*G0_1_1_1_2_2 - 0.00636203302869965*G0_1_1_2_0_0 + 0.00636203302869968*G0_1_1_2_0_2 - 0.0028731762065095*G0_1_1_2_1_1 - 0.0242167708834374*G0_1_1_2_1_2 + 0.00636203302869968*G0_1_1_2_2_0 - 0.0242167708834374*G0_1_1_2_2_1 - 0.0905050505050501*G0_1_1_2_2_2; + A[164] = A[202] - 0.0330928330928329*G0_0_0_0_0_0 - 0.0138528138528138*G0_0_0_0_0_1 - 0.0614141414141412*G0_0_0_0_0_2 - 0.0138528138528138*G0_0_0_0_1_0 - 0.00938912938912931*G0_0_0_0_1_1 + 0.00631072631072631*G0_0_0_0_1_2 - 0.0614141414141412*G0_0_0_0_2_0 + 0.00631072631072631*G0_0_0_0_2_1 - 0.0735738335738333*G0_0_0_0_2_2 - 0.0138528138528138*G0_0_0_1_0_0 - 0.00938912938912931*G0_0_0_1_0_1 + 0.00631072631072631*G0_0_0_1_0_2 - 0.00938912938912931*G0_0_0_1_1_0 + 0.0292448292448295*G0_0_0_1_1_1 + 0.0140067340067342*G0_0_0_1_1_2 + 0.00631072631072631*G0_0_0_1_2_0 + 0.0140067340067342*G0_0_0_1_2_1 + 0.0135449735449737*G0_0_0_1_2_2 - 0.0614141414141412*G0_0_0_2_0_0 + 0.00631072631072631*G0_0_0_2_0_1 - 0.0735738335738333*G0_0_0_2_0_2 + 0.00631072631072631*G0_0_0_2_1_0 + 0.0140067340067342*G0_0_0_2_1_1 + 0.0135449735449737*G0_0_0_2_1_2 - 0.0735738335738333*G0_0_0_2_2_0 + 0.0135449735449737*G0_0_0_2_2_1 - 0.149918229918229*G0_0_0_2_2_2 - 0.0293217893217891*G0_0_1_0_0_1 + 0.0293217893217892*G0_0_1_0_0_2 - 0.0293217893217891*G0_0_1_0_1_0 + 0.00561808561808565*G0_0_1_0_1_1 + 0.0293217893217891*G0_0_1_0_2_0 - 0.00561808561808565*G0_0_1_0_2_2 - 0.0293217893217891*G0_0_1_1_0_0 + 0.00561808561808565*G0_0_1_1_0_1 + 0.00561808561808565*G0_0_1_1_1_0 + 0.0905050505050502*G0_0_1_1_1_1 - 0.00469456469456451*G0_0_1_1_1_2 - 0.00469456469456451*G0_0_1_1_2_1 + 0.00469456469456488*G0_0_1_1_2_2 + 0.0293217893217892*G0_0_1_2_0_0 - 0.00561808561808566*G0_0_1_2_0_2 - 0.00469456469456451*G0_0_1_2_1_1 + 0.00469456469456488*G0_0_1_2_1_2 - 0.00561808561808566*G0_0_1_2_2_0 + 0.00469456469456488*G0_0_1_2_2_1 - 0.0905050505050494*G0_0_1_2_2_2 - 0.0102356902356901*G0_1_0_0_0_1 + 0.0102356902356903*G0_1_0_0_0_2 - 0.0102356902356901*G0_1_0_0_1_0 - 0.0168542568542566*G0_1_0_0_1_1 + 0.0102356902356903*G0_1_0_0_2_0 + 0.0168542568542569*G0_1_0_0_2_2 - 0.0102356902356901*G0_1_0_1_0_0 - 0.0168542568542566*G0_1_0_1_0_1 - 0.0168542568542566*G0_1_0_1_1_0 + 0.0263203463203471*G0_1_0_1_1_1 + 0.000692640692640885*G0_1_0_1_1_2 + 0.000692640692640889*G0_1_0_1_2_1 - 0.000692640692640504*G0_1_0_1_2_2 + 0.0102356902356903*G0_1_0_2_0_0 + 0.0168542568542569*G0_1_0_2_0_2 + 0.000692640692640887*G0_1_0_2_1_1 - 0.000692640692640504*G0_1_0_2_1_2 + 0.0168542568542569*G0_1_0_2_2_0 - 0.000692640692640507*G0_1_0_2_2_1 - 0.026320346320345*G0_1_0_2_2_2 + 0.0330928330928337*G0_1_1_0_0_0 + 0.0614141414141412*G0_1_1_0_0_1 + 0.0138528138528138*G0_1_1_0_0_2 + 0.0614141414141412*G0_1_1_0_1_0 + 0.0735738335738332*G0_1_1_0_1_1 - 0.0063107263107263*G0_1_1_0_1_2 + 0.0138528138528138*G0_1_1_0_2_0 - 0.0063107263107263*G0_1_1_0_2_1 + 0.0093891293891293*G0_1_1_0_2_2 + 0.0614141414141412*G0_1_1_1_0_0 + 0.0735738335738332*G0_1_1_1_0_1 - 0.0063107263107263*G0_1_1_1_0_2 + 0.0735738335738332*G0_1_1_1_1_0 + 0.14991822991823*G0_1_1_1_1_1 - 0.0135449735449734*G0_1_1_1_1_2 - 0.0063107263107263*G0_1_1_1_2_0 - 0.0135449735449734*G0_1_1_1_2_1 - 0.0140067340067339*G0_1_1_1_2_2 + 0.0138528138528138*G0_1_1_2_0_0 - 0.0063107263107263*G0_1_1_2_0_1 + 0.0093891293891293*G0_1_1_2_0_2 - 0.0063107263107263*G0_1_1_2_1_0 - 0.0135449735449734*G0_1_1_2_1_1 - 0.0140067340067339*G0_1_1_2_1_2 + 0.0093891293891293*G0_1_1_2_2_0 - 0.0140067340067339*G0_1_1_2_2_1 - 0.0292448292448287*G0_1_1_2_2_2; + A[72] = A[202] - 0.0623376623376621*G0_0_0_0_0_0 - 0.00446368446368444*G0_0_0_0_0_1 - 0.0754208754208752*G0_0_0_0_0_2 - 0.00446368446368444*G0_0_0_0_1_0 + 0.00446368446368446*G0_0_0_0_1_1 - 0.0754208754208752*G0_0_0_0_2_0 - 0.0871188071188069*G0_0_0_0_2_2 - 0.00446368446368444*G0_0_0_1_0_0 + 0.00446368446368446*G0_0_0_1_0_1 + 0.00446368446368446*G0_0_0_1_1_0 + 0.062337662337662*G0_0_0_1_1_1 + 0.0754208754208751*G0_0_0_1_1_2 + 0.0754208754208751*G0_0_0_1_2_1 + 0.0871188071188067*G0_0_0_1_2_2 - 0.0754208754208752*G0_0_0_2_0_0 - 0.0871188071188069*G0_0_0_2_0_2 + 0.0754208754208751*G0_0_0_2_1_1 + 0.0871188071188067*G0_0_0_2_1_2 - 0.0871188071188069*G0_0_0_2_2_0 + 0.0871188071188067*G0_0_0_2_2_1 + 0.0612602212602212*G0_0_1_0_0_0 - 0.0187012987012985*G0_0_1_0_0_1 + 0.0150072150072149*G0_0_1_0_0_2 - 0.0187012987012985*G0_0_1_0_1_0 - 0.00885040885040871*G0_0_1_0_1_1 - 0.00631072631072624*G0_0_1_0_1_2 + 0.0150072150072149*G0_0_1_0_2_0 - 0.00631072631072623*G0_0_1_0_2_1 - 0.0154689754689755*G0_0_1_0_2_2 - 0.0187012987012985*G0_0_1_1_0_0 - 0.00885040885040871*G0_0_1_1_0_1 - 0.00631072631072623*G0_0_1_1_0_2 - 0.00885040885040871*G0_0_1_1_1_0 + 0.059413179413179*G0_0_1_1_1_1 + 0.0679557479557476*G0_0_1_1_1_2 - 0.00631072631072624*G0_0_1_1_2_0 + 0.0679557479557477*G0_0_1_1_2_1 + 0.0907359307359304*G0_0_1_1_2_2 + 0.0150072150072149*G0_0_1_2_0_0 - 0.00631072631072623*G0_0_1_2_0_1 - 0.0154689754689755*G0_0_1_2_0_2 - 0.00631072631072624*G0_0_1_2_1_0 + 0.0679557479557476*G0_0_1_2_1_1 + 0.0907359307359304*G0_0_1_2_1_2 - 0.0154689754689755*G0_0_1_2_2_0 + 0.0907359307359304*G0_0_1_2_2_1 + 0.0330928330928335*G0_0_1_2_2_2 - 0.00292448292448312*G0_1_0_0_0_0 - 0.0133140933140932*G0_1_0_0_0_1 - 0.00746512746512764*G0_1_0_0_0_2 - 0.0133140933140932*G0_1_0_0_1_0 - 0.0142376142376141*G0_1_0_0_1_1 - 0.00631072631072628*G0_1_0_0_1_2 - 0.00746512746512764*G0_1_0_0_2_0 - 0.00631072631072628*G0_1_0_0_2_1 + 0.00361712361712344*G0_1_0_0_2_2 - 0.0133140933140932*G0_1_0_1_0_0 - 0.0142376142376141*G0_1_0_1_0_1 - 0.00631072631072628*G0_1_0_1_0_2 - 0.0142376142376141*G0_1_0_1_1_0 + 0.123597883597883*G0_1_0_1_1_1 + 0.0904280904280901*G0_1_0_1_1_2 - 0.00631072631072628*G0_1_0_1_2_0 + 0.0904280904280901*G0_1_0_1_2_1 + 0.0716498316498314*G0_1_0_1_2_2 - 0.00746512746512763*G0_1_0_2_0_0 - 0.00631072631072628*G0_1_0_2_0_1 + 0.00361712361712344*G0_1_0_2_0_2 - 0.00631072631072628*G0_1_0_2_1_0 + 0.0904280904280901*G0_1_0_2_1_1 + 0.0716498316498314*G0_1_0_2_1_2 + 0.00361712361712344*G0_1_0_2_2_0 + 0.0716498316498314*G0_1_0_2_2_1 + 0.0330928330928335*G0_1_0_2_2_2 - 0.0292448292448278*G0_1_1_0_0_0 - 0.0140067340067338*G0_1_1_0_0_1 + 0.00938912938912941*G0_1_1_0_0_2 - 0.0140067340067338*G0_1_1_0_1_0 - 0.0135449735449734*G0_1_1_0_1_1 - 0.00631072631072627*G0_1_1_0_1_2 + 0.00938912938912941*G0_1_1_0_2_0 - 0.00631072631072627*G0_1_1_0_2_1 + 0.0138528138528138*G0_1_1_0_2_2 - 0.0140067340067338*G0_1_1_1_0_0 - 0.0135449735449734*G0_1_1_1_0_1 - 0.00631072631072627*G0_1_1_1_0_2 - 0.0135449735449734*G0_1_1_1_1_0 + 0.14991822991823*G0_1_1_1_1_1 + 0.0735738335738333*G0_1_1_1_1_2 - 0.00631072631072627*G0_1_1_1_2_0 + 0.0735738335738333*G0_1_1_1_2_1 + 0.0614141414141412*G0_1_1_1_2_2 + 0.00938912938912941*G0_1_1_2_0_0 - 0.00631072631072627*G0_1_1_2_0_1 + 0.0138528138528138*G0_1_1_2_0_2 - 0.00631072631072627*G0_1_1_2_1_0 + 0.0735738335738333*G0_1_1_2_1_1 + 0.0614141414141412*G0_1_1_2_1_2 + 0.0138528138528138*G0_1_1_2_2_0 + 0.0614141414141412*G0_1_1_2_2_1 + 0.0330928330928336*G0_1_1_2_2_2; + A[184] = A[72] + 0.00438672438672413*G0_0_1_0_0_1 - 0.00438672438672454*G0_0_1_0_0_2 + 0.00438672438672413*G0_0_1_0_1_0 - 0.00100048100048112*G0_0_1_0_1_1 - 0.00438672438672454*G0_0_1_0_2_0 + 0.00100048100048087*G0_0_1_0_2_2 + 0.00438672438672413*G0_0_1_1_0_0 - 0.00100048100048112*G0_0_1_1_0_1 - 0.00100048100048112*G0_0_1_1_1_0 + 0.0641847041847036*G0_0_1_1_1_1 + 0.018085618085618*G0_0_1_1_1_2 + 0.018085618085618*G0_0_1_1_2_1 - 0.018085618085618*G0_0_1_1_2_2 - 0.00438672438672454*G0_0_1_2_0_0 + 0.00100048100048087*G0_0_1_2_0_2 + 0.018085618085618*G0_0_1_2_1_1 - 0.018085618085618*G0_0_1_2_1_2 + 0.00100048100048087*G0_0_1_2_2_0 - 0.018085618085618*G0_0_1_2_2_1 - 0.0641847041847042*G0_0_1_2_2_2 - 0.00438672438672413*G0_1_0_0_0_1 + 0.00438672438672454*G0_1_0_0_0_2 - 0.00438672438672413*G0_1_0_0_1_0 + 0.00100048100048112*G0_1_0_0_1_1 + 0.00438672438672454*G0_1_0_0_2_0 - 0.00100048100048087*G0_1_0_0_2_2 - 0.00438672438672413*G0_1_0_1_0_0 + 0.00100048100048112*G0_1_0_1_0_1 + 0.00100048100048112*G0_1_0_1_1_0 - 0.0641847041847036*G0_1_0_1_1_1 - 0.018085618085618*G0_1_0_1_1_2 - 0.018085618085618*G0_1_0_1_2_1 + 0.018085618085618*G0_1_0_1_2_2 + 0.00438672438672453*G0_1_0_2_0_0 - 0.00100048100048087*G0_1_0_2_0_2 - 0.018085618085618*G0_1_0_2_1_1 + 0.018085618085618*G0_1_0_2_1_2 - 0.00100048100048087*G0_1_0_2_2_0 + 0.018085618085618*G0_1_0_2_2_1 + 0.0641847041847042*G0_1_0_2_2_2; + A[219] = A[149] + 0.0523328523328535*G0_0_1_0_0_0 - 0.018983485650152*G0_0_1_0_0_1 + 0.0118005451338785*G0_0_1_0_0_2 - 0.018983485650152*G0_0_1_0_1_0 - 0.0185730319063651*G0_0_1_0_1_1 - 0.000820907487574137*G0_0_1_0_1_2 + 0.0118005451338785*G0_0_1_0_2_0 - 0.000820907487574137*G0_0_1_0_2_1 + 0.00482283148949819*G0_0_1_0_2_2 - 0.018983485650152*G0_0_1_1_0_0 - 0.018573031906365*G0_0_1_1_0_1 - 0.000820907487574136*G0_0_1_1_0_2 - 0.0185730319063651*G0_0_1_1_1_0 - 0.00430976430976417*G0_0_1_1_1_1 - 0.00420715087381742*G0_0_1_1_1_2 - 0.000820907487574137*G0_0_1_1_2_0 - 0.00420715087381741*G0_0_1_1_2_1 + 0.00277056277056293*G0_0_1_1_2_2 + 0.0118005451338785*G0_0_1_2_0_0 - 0.000820907487574136*G0_0_1_2_0_1 + 0.00482283148949819*G0_0_1_2_0_2 - 0.000820907487574137*G0_0_1_2_1_0 - 0.00420715087381741*G0_0_1_2_1_1 + 0.00277056277056294*G0_0_1_2_1_2 + 0.00482283148949819*G0_0_1_2_2_0 + 0.00277056277056293*G0_0_1_2_2_1 + 0.0240115440115446*G0_0_1_2_2_2 - 0.0523328523328535*G0_1_0_0_0_0 + 0.018983485650152*G0_1_0_0_0_1 - 0.0118005451338785*G0_1_0_0_0_2 + 0.018983485650152*G0_1_0_0_1_0 + 0.018573031906365*G0_1_0_0_1_1 + 0.000820907487574135*G0_1_0_0_1_2 - 0.0118005451338785*G0_1_0_0_2_0 + 0.000820907487574135*G0_1_0_0_2_1 - 0.00482283148949819*G0_1_0_0_2_2 + 0.018983485650152*G0_1_0_1_0_0 + 0.018573031906365*G0_1_0_1_0_1 + 0.000820907487574136*G0_1_0_1_0_2 + 0.018573031906365*G0_1_0_1_1_0 + 0.00430976430976415*G0_1_0_1_1_1 + 0.00420715087381741*G0_1_0_1_1_2 + 0.000820907487574135*G0_1_0_1_2_0 + 0.0042071508738174*G0_1_0_1_2_1 - 0.00277056277056295*G0_1_0_1_2_2 - 0.0118005451338785*G0_1_0_2_0_0 + 0.000820907487574136*G0_1_0_2_0_1 - 0.00482283148949819*G0_1_0_2_0_2 + 0.000820907487574135*G0_1_0_2_1_0 + 0.00420715087381741*G0_1_0_2_1_1 - 0.00277056277056296*G0_1_0_2_1_2 - 0.00482283148949819*G0_1_0_2_2_0 - 0.00277056277056295*G0_1_0_2_2_1 - 0.0240115440115446*G0_1_0_2_2_2; + A[103] = A[219] + 0.247298380631713*G0_0_0_0_0_0 - 0.00779862113195443*G0_0_0_0_0_1 + 0.0765496232162895*G0_0_0_0_0_2 - 0.00779862113195442*G0_0_0_0_1_0 - 0.00451499118165782*G0_0_0_0_1_1 + 0.00554112554112554*G0_0_0_0_1_2 + 0.0765496232162895*G0_0_0_0_2_0 + 0.00554112554112554*G0_0_0_0_2_1 + 0.0375565175565174*G0_0_0_0_2_2 - 0.00779862113195442*G0_0_0_1_0_0 - 0.00451499118165782*G0_0_0_1_0_1 + 0.00554112554112554*G0_0_0_1_0_2 - 0.00451499118165782*G0_0_0_1_1_0 + 0.0736764470097803*G0_0_0_1_1_1 + 0.0211383678050345*G0_0_0_1_1_2 + 0.00554112554112554*G0_0_0_1_2_0 + 0.0211383678050345*G0_0_0_1_2_1 + 0.00266794933461616*G0_0_0_1_2_2 + 0.0765496232162896*G0_0_0_2_0_0 + 0.00554112554112554*G0_0_0_2_0_1 + 0.0375565175565174*G0_0_0_2_0_2 + 0.00554112554112554*G0_0_0_2_1_0 + 0.0211383678050345*G0_0_0_2_1_1 + 0.00266794933461615*G0_0_0_2_1_2 + 0.0375565175565174*G0_0_0_2_2_0 + 0.00266794933461616*G0_0_0_2_2_1 - 0.0537694404361065*G0_0_0_2_2_2 - 0.00933782267115605*G0_0_1_0_0_1 + 0.00933782267115596*G0_0_1_0_0_2 - 0.00933782267115605*G0_0_1_0_1_0 - 0.0042071508738174*G0_0_1_0_1_1 + 0.00933782267115596*G0_0_1_0_2_0 + 0.00420715087381749*G0_0_1_0_2_2 - 0.00933782267115605*G0_0_1_1_0_0 - 0.0042071508738174*G0_0_1_1_0_1 - 0.0042071508738174*G0_0_1_1_1_0 + 0.0732659932659936*G0_0_1_1_1_1 + 0.0122109988776656*G0_0_1_1_1_2 + 0.0122109988776655*G0_0_1_1_2_1 - 0.0122109988776655*G0_0_1_1_2_2 + 0.00933782267115596*G0_0_1_2_0_0 + 0.00420715087381749*G0_0_1_2_0_2 + 0.0122109988776656*G0_0_1_2_1_1 - 0.0122109988776655*G0_0_1_2_1_2 + 0.00420715087381749*G0_0_1_2_2_0 - 0.0122109988776655*G0_0_1_2_2_1 - 0.0732659932659929*G0_0_1_2_2_2 - 0.0401218534551865*G0_1_0_0_0_1 + 0.0401218534551867*G0_1_0_0_0_2 - 0.0401218534551865*G0_1_0_0_1_0 - 0.0276030142696808*G0_1_0_0_1_1 + 0.0401218534551867*G0_1_0_0_2_0 + 0.0276030142696808*G0_1_0_0_2_2 - 0.0401218534551865*G0_1_0_1_0_0 - 0.0276030142696808*G0_1_0_1_0_1 - 0.0276030142696808*G0_1_0_1_1_0 + 0.0449446849446847*G0_1_0_1_1_1 + 0.00523328523328524*G0_1_0_1_1_2 + 0.00523328523328524*G0_1_0_1_2_1 - 0.00523328523328509*G0_1_0_1_2_2 + 0.0401218534551867*G0_1_0_2_0_0 + 0.0276030142696808*G0_1_0_2_0_2 + 0.00523328523328524*G0_1_0_2_1_1 - 0.00523328523328509*G0_1_0_2_1_2 + 0.0276030142696808*G0_1_0_2_2_0 - 0.00523328523328509*G0_1_0_2_2_1 - 0.0449446849446841*G0_1_0_2_2_2 - 0.247298380631712*G0_1_1_0_0_0 - 0.0765496232162894*G0_1_1_0_0_1 + 0.00779862113195451*G0_1_1_0_0_2 - 0.0765496232162894*G0_1_1_0_1_0 - 0.0375565175565173*G0_1_1_0_1_1 - 0.00554112554112553*G0_1_1_0_1_2 + 0.00779862113195452*G0_1_1_0_2_0 - 0.00554112554112553*G0_1_1_0_2_1 + 0.00451499118165781*G0_1_1_0_2_2 - 0.0765496232162894*G0_1_1_1_0_0 - 0.0375565175565173*G0_1_1_1_0_1 - 0.00554112554112553*G0_1_1_1_0_2 - 0.0375565175565173*G0_1_1_1_1_0 + 0.0537694404361069*G0_1_1_1_1_1 - 0.00266794933461606*G0_1_1_1_1_2 - 0.00554112554112553*G0_1_1_1_2_0 - 0.00266794933461606*G0_1_1_1_2_1 - 0.0211383678050345*G0_1_1_1_2_2 + 0.00779862113195451*G0_1_1_2_0_0 - 0.00554112554112553*G0_1_1_2_0_1 + 0.00451499118165781*G0_1_1_2_0_2 - 0.00554112554112553*G0_1_1_2_1_0 - 0.00266794933461606*G0_1_1_2_1_1 - 0.0211383678050345*G0_1_1_2_1_2 + 0.00451499118165781*G0_1_1_2_2_0 - 0.0211383678050345*G0_1_1_2_2_1 - 0.0736764470097799*G0_1_1_2_2_2; + A[201] = A[103] - 0.0523328523328521*G0_0_1_0_0_0 - 0.0118005451338785*G0_0_1_0_0_1 + 0.0189834856501522*G0_0_1_0_0_2 - 0.0118005451338785*G0_0_1_0_1_0 - 0.00482283148949831*G0_0_1_0_1_1 + 0.000820907487574148*G0_0_1_0_1_2 + 0.0189834856501522*G0_0_1_0_2_0 + 0.000820907487574147*G0_0_1_0_2_1 + 0.0185730319063652*G0_0_1_0_2_2 - 0.0118005451338785*G0_0_1_1_0_0 - 0.00482283148949831*G0_0_1_1_0_1 + 0.000820907487574148*G0_0_1_1_0_2 - 0.00482283148949831*G0_0_1_1_1_0 - 0.0240115440115447*G0_0_1_1_1_1 - 0.0027705627705629*G0_0_1_1_1_2 + 0.000820907487574147*G0_0_1_1_2_0 - 0.0027705627705629*G0_0_1_1_2_1 + 0.00420715087381746*G0_0_1_1_2_2 + 0.0189834856501522*G0_0_1_2_0_0 + 0.000820907487574148*G0_0_1_2_0_1 + 0.0185730319063652*G0_0_1_2_0_2 + 0.000820907487574148*G0_0_1_2_1_0 - 0.0027705627705629*G0_0_1_2_1_1 + 0.00420715087381746*G0_0_1_2_1_2 + 0.0185730319063652*G0_0_1_2_2_0 + 0.00420715087381747*G0_0_1_2_2_1 + 0.00430976430976417*G0_0_1_2_2_2 + 0.0523328523328522*G0_1_0_0_0_0 + 0.0118005451338785*G0_1_0_0_0_1 - 0.0189834856501522*G0_1_0_0_0_2 + 0.0118005451338785*G0_1_0_0_1_0 + 0.00482283148949831*G0_1_0_0_1_1 - 0.000820907487574146*G0_1_0_0_1_2 - 0.0189834856501522*G0_1_0_0_2_0 - 0.000820907487574148*G0_1_0_0_2_1 - 0.0185730319063652*G0_1_0_0_2_2 + 0.0118005451338785*G0_1_0_1_0_0 + 0.00482283148949831*G0_1_0_1_0_1 - 0.000820907487574146*G0_1_0_1_0_2 + 0.00482283148949831*G0_1_0_1_1_0 + 0.0240115440115447*G0_1_0_1_1_1 + 0.0027705627705629*G0_1_0_1_1_2 - 0.000820907487574148*G0_1_0_1_2_0 + 0.0027705627705629*G0_1_0_1_2_1 - 0.00420715087381747*G0_1_0_1_2_2 - 0.0189834856501522*G0_1_0_2_0_0 - 0.000820907487574147*G0_1_0_2_0_1 - 0.0185730319063652*G0_1_0_2_0_2 - 0.000820907487574147*G0_1_0_2_1_0 + 0.0027705627705629*G0_1_0_2_1_1 - 0.00420715087381746*G0_1_0_2_1_2 - 0.0185730319063652*G0_1_0_2_2_0 - 0.00420715087381747*G0_1_0_2_2_1 - 0.00430976430976416*G0_1_0_2_2_2; + A[220] = A[164] + 0.0641847041847035*G0_0_1_0_0_0 + 0.018085618085618*G0_0_1_0_0_1 - 0.00100048100048091*G0_0_1_0_0_2 + 0.018085618085618*G0_0_1_0_1_0 - 0.018085618085618*G0_0_1_0_1_1 - 0.00100048100048091*G0_0_1_0_2_0 + 0.00438672438672453*G0_0_1_0_2_2 + 0.018085618085618*G0_0_1_1_0_0 - 0.018085618085618*G0_0_1_1_0_1 - 0.018085618085618*G0_0_1_1_1_0 - 0.0641847041847037*G0_0_1_1_1_1 + 0.00100048100048097*G0_0_1_1_1_2 + 0.00100048100048097*G0_0_1_1_2_1 - 0.0043867243867244*G0_0_1_1_2_2 - 0.00100048100048091*G0_0_1_2_0_0 + 0.00438672438672453*G0_0_1_2_0_2 + 0.00100048100048097*G0_0_1_2_1_1 - 0.0043867243867244*G0_0_1_2_1_2 + 0.00438672438672453*G0_0_1_2_2_0 - 0.0043867243867244*G0_0_1_2_2_1 - 0.0641847041847034*G0_1_0_0_0_0 - 0.018085618085618*G0_1_0_0_0_1 + 0.00100048100048091*G0_1_0_0_0_2 - 0.018085618085618*G0_1_0_0_1_0 + 0.018085618085618*G0_1_0_0_1_1 + 0.00100048100048091*G0_1_0_0_2_0 - 0.00438672438672453*G0_1_0_0_2_2 - 0.018085618085618*G0_1_0_1_0_0 + 0.018085618085618*G0_1_0_1_0_1 + 0.018085618085618*G0_1_0_1_1_0 + 0.0641847041847038*G0_1_0_1_1_1 - 0.00100048100048096*G0_1_0_1_1_2 - 0.00100048100048097*G0_1_0_1_2_1 + 0.00438672438672441*G0_1_0_1_2_2 + 0.00100048100048091*G0_1_0_2_0_0 - 0.00438672438672453*G0_1_0_2_0_2 - 0.00100048100048097*G0_1_0_2_1_1 + 0.00438672438672441*G0_1_0_2_1_2 - 0.00438672438672453*G0_1_0_2_2_0 + 0.00438672438672441*G0_1_0_2_2_1; + A[118] = A[202] + 0.0641847041847036*G0_0_1_0_0_0 - 0.00100048100048108*G0_0_1_0_0_1 + 0.018085618085618*G0_0_1_0_0_2 - 0.00100048100048108*G0_0_1_0_1_0 + 0.00438672438672425*G0_0_1_0_1_1 + 0.018085618085618*G0_0_1_0_2_0 - 0.018085618085618*G0_0_1_0_2_2 - 0.00100048100048108*G0_0_1_1_0_0 + 0.00438672438672425*G0_0_1_1_0_1 + 0.00438672438672425*G0_0_1_1_1_0 - 0.00438672438672442*G0_0_1_1_1_2 - 0.00438672438672442*G0_0_1_1_2_1 + 0.00100048100048098*G0_0_1_1_2_2 + 0.018085618085618*G0_0_1_2_0_0 - 0.018085618085618*G0_0_1_2_0_2 - 0.00438672438672443*G0_0_1_2_1_1 + 0.00100048100048098*G0_0_1_2_1_2 - 0.018085618085618*G0_0_1_2_2_0 + 0.00100048100048098*G0_0_1_2_2_1 - 0.0641847041847042*G0_0_1_2_2_2 - 0.0641847041847036*G0_1_0_0_0_0 + 0.00100048100048108*G0_1_0_0_0_1 - 0.018085618085618*G0_1_0_0_0_2 + 0.00100048100048108*G0_1_0_0_1_0 - 0.00438672438672425*G0_1_0_0_1_1 - 0.018085618085618*G0_1_0_0_2_0 + 0.018085618085618*G0_1_0_0_2_2 + 0.00100048100048108*G0_1_0_1_0_0 - 0.00438672438672425*G0_1_0_1_0_1 - 0.00438672438672425*G0_1_0_1_1_0 + 0.00438672438672443*G0_1_0_1_1_2 + 0.00438672438672443*G0_1_0_1_2_1 - 0.00100048100048098*G0_1_0_1_2_2 - 0.018085618085618*G0_1_0_2_0_0 + 0.018085618085618*G0_1_0_2_0_2 + 0.00438672438672443*G0_1_0_2_1_1 - 0.00100048100048098*G0_1_0_2_1_2 + 0.018085618085618*G0_1_0_2_2_0 - 0.00100048100048098*G0_1_0_2_2_1 + 0.0641847041847042*G0_1_0_2_2_2; + A[64] = A[99] + 0.277979797979796*G0_0_0_0_0_0 + 0.00131687242798353*G0_0_0_0_0_1 + 0.0624317246539465*G0_0_0_0_0_2 + 0.00131687242798353*G0_0_0_0_1_0 + 0.00885895997007102*G0_0_0_0_1_1 + 0.0184661429105873*G0_0_0_0_1_2 + 0.0624317246539465*G0_0_0_0_2_0 + 0.0184661429105873*G0_0_0_0_2_1 + 0.103229116562449*G0_0_0_0_2_2 + 0.00131687242798353*G0_0_0_1_0_0 + 0.00885895997007102*G0_0_0_1_0_1 + 0.0184661429105873*G0_0_0_1_0_2 + 0.00885895997007102*G0_0_0_1_1_0 + 0.0819368286034946*G0_0_0_1_1_1 + 0.0974229063117947*G0_0_0_1_1_2 + 0.0184661429105873*G0_0_0_1_2_0 + 0.0974229063117947*G0_0_0_1_2_1 + 0.165310245310245*G0_0_0_1_2_2 + 0.0624317246539465*G0_0_0_2_0_0 + 0.0184661429105873*G0_0_0_2_0_1 + 0.103229116562449*G0_0_0_2_0_2 + 0.0184661429105873*G0_0_0_2_1_0 + 0.0974229063117947*G0_0_0_2_1_1 + 0.165310245310245*G0_0_0_2_1_2 + 0.103229116562449*G0_0_0_2_2_0 + 0.165310245310245*G0_0_0_2_2_1 + 0.799820426487088*G0_0_0_2_2_2 - 0.24782427449094*G0_0_1_0_0_0 - 0.0440596440596438*G0_0_1_0_0_1 - 0.0440596440596439*G0_0_1_0_0_2 - 0.0440596440596438*G0_0_1_0_1_0 - 0.00066698733365401*G0_0_1_0_1_2 - 0.0440596440596439*G0_0_1_0_2_0 - 0.000666987333654008*G0_0_1_0_2_1 - 0.0440596440596438*G0_0_1_1_0_0 - 0.000666987333654011*G0_0_1_1_0_2 + 0.0973031906365226*G0_0_1_1_1_1 + 0.0631200897867561*G0_0_1_1_1_2 - 0.000666987333654006*G0_0_1_1_2_0 + 0.0631200897867561*G0_0_1_1_2_1 + 0.0631200897867562*G0_0_1_1_2_2 - 0.0440596440596439*G0_0_1_2_0_0 - 0.00066698733365401*G0_0_1_2_0_1 - 0.000666987333654008*G0_0_1_2_1_0 + 0.0631200897867561*G0_0_1_2_1_1 + 0.0631200897867562*G0_0_1_2_1_2 + 0.0631200897867562*G0_0_1_2_2_1 + 0.0973031906365231*G0_0_1_2_2_2 - 0.549507776174441*G0_1_0_0_0_0 - 0.0173801507134841*G0_1_0_0_0_1 - 0.017380150713484*G0_1_0_0_0_2 - 0.0173801507134841*G0_1_0_0_1_0 + 0.0123136123136121*G0_1_0_0_1_1 + 0.00548981882315211*G0_1_0_0_1_2 - 0.017380150713484*G0_1_0_0_2_0 + 0.00548981882315211*G0_1_0_0_2_1 + 0.0123136123136122*G0_1_0_0_2_2 - 0.0173801507134841*G0_1_0_1_0_0 + 0.0123136123136121*G0_1_0_1_0_1 + 0.00548981882315211*G0_1_0_1_0_2 + 0.0123136123136121*G0_1_0_1_1_0 + 0.10499919833253*G0_1_0_1_1_1 + 0.0656854256854253*G0_1_0_1_1_2 + 0.00548981882315212*G0_1_0_1_2_0 + 0.0656854256854253*G0_1_0_1_2_1 + 0.0656854256854254*G0_1_0_1_2_2 - 0.017380150713484*G0_1_0_2_0_0 + 0.00548981882315211*G0_1_0_2_0_1 + 0.0123136123136122*G0_1_0_2_0_2 + 0.00548981882315212*G0_1_0_2_1_0 + 0.0656854256854253*G0_1_0_2_1_1 + 0.0656854256854254*G0_1_0_2_1_2 + 0.0123136123136122*G0_1_0_2_2_0 + 0.0656854256854254*G0_1_0_2_2_1 + 0.104999198332531*G0_1_0_2_2_2 + 0.277979797979796*G0_1_1_0_0_0 + 0.0624317246539466*G0_1_1_0_0_1 + 0.00131687242798349*G0_1_1_0_0_2 + 0.0624317246539466*G0_1_1_0_1_0 + 0.103229116562449*G0_1_1_0_1_1 + 0.0184661429105873*G0_1_1_0_1_2 + 0.00131687242798348*G0_1_1_0_2_0 + 0.0184661429105873*G0_1_1_0_2_1 + 0.00885895997007103*G0_1_1_0_2_2 + 0.0624317246539466*G0_1_1_1_0_0 + 0.103229116562449*G0_1_1_1_0_1 + 0.0184661429105873*G0_1_1_1_0_2 + 0.103229116562449*G0_1_1_1_1_0 + 0.799820426487091*G0_1_1_1_1_1 + 0.165310245310245*G0_1_1_1_1_2 + 0.0184661429105873*G0_1_1_1_2_0 + 0.165310245310245*G0_1_1_1_2_1 + 0.0974229063117948*G0_1_1_1_2_2 + 0.00131687242798349*G0_1_1_2_0_0 + 0.0184661429105873*G0_1_1_2_0_1 + 0.00885895997007103*G0_1_1_2_0_2 + 0.0184661429105873*G0_1_1_2_1_0 + 0.165310245310245*G0_1_1_2_1_1 + 0.0974229063117948*G0_1_1_2_1_2 + 0.00885895997007103*G0_1_1_2_2_0 + 0.0974229063117948*G0_1_1_2_2_1 + 0.0819368286034948*G0_1_1_2_2_2; + A[160] = A[64] + 0.661087061087058*G0_0_0_0_0_0 + 0.124059644059643*G0_0_0_0_0_1 + 0.0571813371813368*G0_0_0_0_0_2 + 0.124059644059643*G0_0_0_0_1_0 + 0.112515632515632*G0_0_0_0_1_1 + 0.000885040885040857*G0_0_0_0_1_2 + 0.0571813371813368*G0_0_0_0_2_0 + 0.000885040885040857*G0_0_0_0_2_1 - 0.075420875420875*G0_0_0_0_2_2 + 0.124059644059643*G0_0_0_1_0_0 + 0.112515632515632*G0_0_0_1_0_1 + 0.00088504088504086*G0_0_0_1_0_2 + 0.112515632515632*G0_0_0_1_1_0 + 0.557190957190955*G0_0_0_1_1_1 - 0.0305531505531504*G0_0_0_1_1_2 + 0.00088504088504086*G0_0_0_1_2_0 - 0.0305531505531504*G0_0_0_1_2_1 - 0.156998556998556*G0_0_0_1_2_2 + 0.0571813371813368*G0_0_0_2_0_0 + 0.000885040885040857*G0_0_0_2_0_1 - 0.075420875420875*G0_0_0_2_0_2 + 0.00088504088504086*G0_0_0_2_1_0 - 0.0305531505531504*G0_0_0_2_1_1 - 0.156998556998556*G0_0_0_2_1_2 - 0.075420875420875*G0_0_0_2_2_0 - 0.156998556998556*G0_0_0_2_2_1 - 0.808003848003842*G0_0_0_2_2_2 - 0.0215103415103412*G0_0_1_0_0_0 + 0.0273977873977874*G0_0_1_0_0_1 - 0.00334776334776335*G0_0_1_0_0_2 + 0.0273977873977874*G0_0_1_0_1_0 + 0.0817700817700816*G0_0_1_0_1_1 + 0.000885040885040898*G0_0_1_0_1_2 - 0.00334776334776335*G0_0_1_0_2_0 + 0.000885040885040898*G0_0_1_0_2_1 - 0.0148917748917748*G0_0_1_0_2_2 + 0.0273977873977874*G0_0_1_1_0_0 + 0.0817700817700816*G0_0_1_1_0_1 + 0.0008850408850409*G0_0_1_1_0_2 + 0.0817700817700816*G0_0_1_1_1_0 + 0.557190957190955*G0_0_1_1_1_1 + 0.000192400192400174*G0_0_1_1_1_2 + 0.000885040885040897*G0_0_1_1_2_0 + 0.000192400192400174*G0_0_1_1_2_1 - 0.0603367003367001*G0_0_1_1_2_2 - 0.00334776334776334*G0_0_1_2_0_0 + 0.0008850408850409*G0_0_1_2_0_1 - 0.0148917748917748*G0_0_1_2_0_2 + 0.000885040885040898*G0_0_1_2_1_0 + 0.000192400192400188*G0_0_1_2_1_1 - 0.0603367003367001*G0_0_1_2_1_2 - 0.0148917748917748*G0_0_1_2_2_0 - 0.0603367003367001*G0_0_1_2_2_1 - 0.125406445406444*G0_0_1_2_2_2 - 0.0215103415103412*G0_1_0_0_0_0 + 0.0273977873977874*G0_1_0_0_0_1 - 0.00334776334776334*G0_1_0_0_0_2 + 0.0273977873977874*G0_1_0_0_1_0 + 0.0817700817700816*G0_1_0_0_1_1 + 0.0008850408850409*G0_1_0_0_1_2 - 0.00334776334776334*G0_1_0_0_2_0 + 0.000885040885040898*G0_1_0_0_2_1 - 0.0148917748917748*G0_1_0_0_2_2 + 0.0273977873977874*G0_1_0_1_0_0 + 0.0817700817700816*G0_1_0_1_0_1 + 0.0008850408850409*G0_1_0_1_0_2 + 0.0817700817700816*G0_1_0_1_1_0 + 0.557190957190955*G0_1_0_1_1_1 + 0.000192400192400188*G0_1_0_1_1_2 + 0.000885040885040898*G0_1_0_1_2_0 + 0.000192400192400202*G0_1_0_1_2_1 - 0.0603367003367001*G0_1_0_1_2_2 - 0.00334776334776334*G0_1_0_2_0_0 + 0.000885040885040898*G0_1_0_2_0_1 - 0.0148917748917748*G0_1_0_2_0_2 + 0.000885040885040898*G0_1_0_2_1_0 + 0.000192400192400202*G0_1_0_2_1_1 - 0.0603367003367001*G0_1_0_2_1_2 - 0.0148917748917748*G0_1_0_2_2_0 - 0.0603367003367001*G0_1_0_2_2_1 - 0.125406445406444*G0_1_0_2_2_2 + 0.103896103896103*G0_1_1_0_0_0 + 0.0877344877344874*G0_1_1_0_0_1 + 0.0115440115440115*G0_1_1_0_0_2 + 0.0877344877344874*G0_1_1_0_1_0 + 0.0815776815776812*G0_1_1_0_1_1 + 0.0115440115440115*G0_1_1_0_2_0 - 0.0115440115440115*G0_1_1_0_2_2 + 0.0877344877344874*G0_1_1_1_0_0 + 0.0815776815776812*G0_1_1_1_0_1 + 0.0815776815776812*G0_1_1_1_1_0 - 0.0815776815776814*G0_1_1_1_1_2 - 0.0815776815776815*G0_1_1_1_2_1 - 0.0877344877344875*G0_1_1_1_2_2 + 0.0115440115440115*G0_1_1_2_0_0 - 0.0115440115440115*G0_1_1_2_0_2 - 0.0815776815776814*G0_1_1_2_1_1 - 0.0877344877344875*G0_1_1_2_1_2 - 0.0115440115440115*G0_1_1_2_2_0 - 0.0877344877344875*G0_1_1_2_2_1 - 0.103896103896103*G0_1_1_2_2_2; + A[112] = A[160] - 0.557190957190955*G0_0_0_0_0_0 - 0.112515632515632*G0_0_0_0_0_1 + 0.0305531505531507*G0_0_0_0_0_2 - 0.112515632515632*G0_0_0_0_1_0 - 0.124059644059644*G0_0_0_0_1_1 - 0.000885040885040819*G0_0_0_0_1_2 + 0.0305531505531507*G0_0_0_0_2_0 - 0.000885040885040815*G0_0_0_0_2_1 + 0.156998556998557*G0_0_0_0_2_2 - 0.112515632515632*G0_0_0_1_0_0 - 0.124059644059644*G0_0_0_1_0_1 - 0.000885040885040822*G0_0_0_1_0_2 - 0.124059644059644*G0_0_0_1_1_0 - 0.661087061087059*G0_0_0_1_1_1 - 0.0571813371813368*G0_0_0_1_1_2 - 0.000885040885040822*G0_0_0_1_2_0 - 0.0571813371813368*G0_0_0_1_2_1 + 0.0754208754208752*G0_0_0_1_2_2 + 0.0305531505531507*G0_0_0_2_0_0 - 0.000885040885040819*G0_0_0_2_0_1 + 0.156998556998557*G0_0_0_2_0_2 - 0.000885040885040822*G0_0_0_2_1_0 - 0.0571813371813368*G0_0_0_2_1_1 + 0.0754208754208752*G0_0_0_2_1_2 + 0.156998556998557*G0_0_0_2_2_0 + 0.0754208754208752*G0_0_0_2_2_1 + 0.808003848003844*G0_0_0_2_2_2 - 0.0307455507455507*G0_0_1_0_0_1 + 0.0307455507455508*G0_0_1_0_0_2 - 0.0307455507455507*G0_0_1_0_1_0 - 0.0966618566618563*G0_0_1_0_1_1 + 0.0307455507455508*G0_0_1_0_2_0 + 0.0966618566618566*G0_0_1_0_2_2 - 0.0307455507455507*G0_0_1_1_0_0 - 0.0966618566618563*G0_0_1_1_0_1 - 0.0966618566618563*G0_0_1_1_1_0 - 0.6825974025974*G0_0_1_1_1_1 - 0.0605291005291002*G0_0_1_1_1_2 - 0.0605291005291002*G0_0_1_1_2_1 + 0.0605291005291003*G0_0_1_1_2_2 + 0.0307455507455508*G0_0_1_2_0_0 + 0.0966618566618566*G0_0_1_2_0_2 - 0.0605291005291002*G0_0_1_2_1_1 + 0.0605291005291003*G0_0_1_2_1_2 + 0.0966618566618566*G0_0_1_2_2_0 + 0.0605291005291003*G0_0_1_2_2_1 + 0.682597402597399*G0_0_1_2_2_2 - 0.0307455507455507*G0_1_0_0_0_1 + 0.0307455507455508*G0_1_0_0_0_2 - 0.0307455507455507*G0_1_0_0_1_0 - 0.0966618566618563*G0_1_0_0_1_1 + 0.0307455507455508*G0_1_0_0_2_0 + 0.0966618566618566*G0_1_0_0_2_2 - 0.0307455507455507*G0_1_0_1_0_0 - 0.0966618566618563*G0_1_0_1_0_1 - 0.0966618566618563*G0_1_0_1_1_0 - 0.6825974025974*G0_1_0_1_1_1 - 0.0605291005291002*G0_1_0_1_1_2 - 0.0605291005291002*G0_1_0_1_2_1 + 0.0605291005291003*G0_1_0_1_2_2 + 0.0307455507455508*G0_1_0_2_0_0 + 0.0966618566618566*G0_1_0_2_0_2 - 0.0605291005291002*G0_1_0_2_1_1 + 0.0605291005291003*G0_1_0_2_1_2 + 0.0966618566618566*G0_1_0_2_2_0 + 0.0605291005291003*G0_1_0_2_2_1 + 0.682597402597399*G0_1_0_2_2_2 + 0.557190957190954*G0_1_1_0_0_0 - 0.0305531505531506*G0_1_1_0_0_1 + 0.112515632515632*G0_1_1_0_0_2 - 0.0305531505531506*G0_1_1_0_1_0 - 0.156998556998556*G0_1_1_0_1_1 + 0.000885040885040916*G0_1_1_0_1_2 + 0.112515632515632*G0_1_1_0_2_0 + 0.000885040885040916*G0_1_1_0_2_1 + 0.124059644059644*G0_1_1_0_2_2 - 0.0305531505531506*G0_1_1_1_0_0 - 0.156998556998556*G0_1_1_1_0_1 + 0.000885040885040916*G0_1_1_1_0_2 - 0.156998556998556*G0_1_1_1_1_0 - 0.808003848003844*G0_1_1_1_1_1 - 0.075420875420875*G0_1_1_1_1_2 + 0.000885040885040916*G0_1_1_1_2_0 - 0.0754208754208749*G0_1_1_1_2_1 + 0.057181337181337*G0_1_1_1_2_2 + 0.112515632515632*G0_1_1_2_0_0 + 0.000885040885040916*G0_1_1_2_0_1 + 0.124059644059644*G0_1_1_2_0_2 + 0.000885040885040912*G0_1_1_2_1_0 - 0.075420875420875*G0_1_1_2_1_1 + 0.0571813371813369*G0_1_1_2_1_2 + 0.124059644059644*G0_1_1_2_2_0 + 0.0571813371813369*G0_1_1_2_2_1 + 0.661087061087058*G0_1_1_2_2_2; + A[162] = A[187] - 0.411736411736409*G0_0_0_0_0_0 - 0.00400192400192392*G0_0_0_0_0_1 - 0.0583357383357378*G0_0_0_0_0_2 - 0.00400192400192391*G0_0_0_0_1_0 + 0.0352477152477151*G0_0_0_0_1_1 - 0.00415584415584412*G0_0_0_0_1_2 - 0.0583357383357378*G0_0_0_0_2_0 - 0.00415584415584412*G0_0_0_0_2_1 - 0.0153920153920152*G0_0_0_0_2_2 - 0.00400192400192392*G0_0_0_1_0_0 + 0.0352477152477151*G0_0_0_1_0_1 - 0.00415584415584412*G0_0_0_1_0_2 + 0.0352477152477151*G0_0_0_1_1_0 + 0.235189995189994*G0_0_0_1_1_1 + 0.034324194324194*G0_0_0_1_1_2 - 0.00415584415584412*G0_0_0_1_2_0 + 0.034324194324194*G0_0_0_1_2_1 - 0.0403270803270803*G0_0_0_1_2_2 - 0.0583357383357378*G0_0_0_2_0_0 - 0.00415584415584412*G0_0_0_2_0_1 - 0.0153920153920152*G0_0_0_2_0_2 - 0.00415584415584412*G0_0_0_2_1_0 + 0.034324194324194*G0_0_0_2_1_1 - 0.0403270803270803*G0_0_0_2_1_2 - 0.0153920153920152*G0_0_0_2_2_0 - 0.0403270803270803*G0_0_0_2_2_1 - 0.161000481000481*G0_0_0_2_2_2 + 0.115670995670995*G0_0_1_0_0_1 - 0.115670995670995*G0_0_1_0_0_2 + 0.115670995670995*G0_0_1_0_1_0 + 0.0807311207311202*G0_0_1_0_1_1 - 0.115670995670995*G0_0_1_0_2_0 - 0.0807311207311204*G0_0_1_0_2_2 + 0.115670995670995*G0_0_1_1_0_0 + 0.0807311207311202*G0_0_1_1_0_1 + 0.0807311207311202*G0_0_1_1_1_0 + 0.224415584415583*G0_0_1_1_1_1 + 0.0402501202501199*G0_0_1_1_1_2 + 0.0402501202501199*G0_0_1_1_2_1 - 0.0402501202501202*G0_0_1_1_2_2 - 0.115670995670995*G0_0_1_2_0_0 - 0.0807311207311204*G0_0_1_2_0_2 + 0.0402501202501199*G0_0_1_2_1_1 - 0.0402501202501202*G0_0_1_2_1_2 - 0.0807311207311204*G0_0_1_2_2_0 - 0.0402501202501202*G0_0_1_2_2_1 - 0.224415584415584*G0_0_1_2_2_2 + 0.0202405002405001*G0_1_0_0_0_1 - 0.0202405002405*G0_1_0_0_0_2 + 0.0202405002405002*G0_1_0_0_1_0 + 0.0576430976430974*G0_1_0_0_1_1 - 0.0202405002405*G0_1_0_0_2_0 - 0.0576430976430974*G0_1_0_0_2_2 + 0.0202405002405002*G0_1_0_1_0_0 + 0.0576430976430974*G0_1_0_1_0_1 + 0.0576430976430974*G0_1_0_1_1_0 + 0.275670995670994*G0_1_0_1_1_1 + 0.0459451659451656*G0_1_0_1_1_2 + 0.0459451659451655*G0_1_0_1_2_1 - 0.045945165945166*G0_1_0_1_2_2 - 0.0202405002405*G0_1_0_2_0_0 - 0.0576430976430974*G0_1_0_2_0_2 + 0.0459451659451655*G0_1_0_2_1_1 - 0.0459451659451659*G0_1_0_2_1_2 - 0.0576430976430974*G0_1_0_2_2_0 - 0.045945165945166*G0_1_0_2_2_1 - 0.275670995670995*G0_1_0_2_2_2 + 0.411736411736409*G0_1_1_0_0_0 + 0.0583357383357378*G0_1_1_0_0_1 + 0.00400192400192384*G0_1_1_0_0_2 + 0.0583357383357378*G0_1_1_0_1_0 + 0.0153920153920152*G0_1_1_0_1_1 + 0.00415584415584408*G0_1_1_0_1_2 + 0.00400192400192384*G0_1_1_0_2_0 + 0.00415584415584408*G0_1_1_0_2_1 - 0.0352477152477153*G0_1_1_0_2_2 + 0.0583357383357378*G0_1_1_1_0_0 + 0.0153920153920152*G0_1_1_1_0_1 + 0.00415584415584408*G0_1_1_1_0_2 + 0.0153920153920152*G0_1_1_1_1_0 + 0.16100048100048*G0_1_1_1_1_1 + 0.04032708032708*G0_1_1_1_1_2 + 0.00415584415584408*G0_1_1_1_2_0 + 0.04032708032708*G0_1_1_1_2_1 - 0.0343241943241943*G0_1_1_1_2_2 + 0.00400192400192385*G0_1_1_2_0_0 + 0.00415584415584408*G0_1_1_2_0_1 - 0.0352477152477153*G0_1_1_2_0_2 + 0.00415584415584408*G0_1_1_2_1_0 + 0.04032708032708*G0_1_1_2_1_1 - 0.0343241943241943*G0_1_1_2_1_2 - 0.0352477152477153*G0_1_1_2_2_0 - 0.0343241943241943*G0_1_1_2_2_1 - 0.235189995189995*G0_1_1_2_2_2; + A[214] = A[162] + 0.369408369408367*G0_0_0_0_0_0 - 0.00631072631072636*G0_0_0_0_0_1 + 0.0432515632515629*G0_0_0_0_0_2 - 0.00631072631072636*G0_0_0_0_1_0 - 0.0551034151034149*G0_0_0_0_1_1 - 0.03001443001443*G0_0_0_0_1_2 + 0.0432515632515629*G0_0_0_0_2_0 - 0.03001443001443*G0_0_0_0_2_1 - 0.108051948051948*G0_0_0_0_2_2 - 0.00631072631072636*G0_0_0_1_0_0 - 0.0551034151034149*G0_0_0_1_0_1 - 0.03001443001443*G0_0_0_1_0_2 - 0.0551034151034149*G0_0_0_1_1_0 - 0.385569985569984*G0_0_0_1_1_1 - 0.209485329485328*G0_0_0_1_1_2 - 0.03001443001443*G0_0_0_1_2_0 - 0.209485329485328*G0_0_0_1_2_1 - 0.254891774891774*G0_0_0_1_2_2 + 0.0432515632515629*G0_0_0_2_0_0 - 0.03001443001443*G0_0_0_2_0_1 - 0.108051948051948*G0_0_0_2_0_2 - 0.03001443001443*G0_0_0_2_1_0 - 0.209485329485328*G0_0_0_2_1_1 - 0.254891774891774*G0_0_0_2_1_2 - 0.108051948051948*G0_0_0_2_2_0 - 0.254891774891774*G0_0_0_2_2_1 - 0.77483405483405*G0_0_0_2_2_2 - 0.270591630591629*G0_0_1_0_0_0 - 0.135834535834535*G0_0_1_0_0_1 - 0.0303992303992303*G0_0_1_0_0_2 - 0.135834535834535*G0_0_1_0_1_0 - 0.0982780182780177*G0_0_1_0_1_1 - 0.0300144300144299*G0_0_1_0_1_2 - 0.0303992303992303*G0_0_1_0_2_0 - 0.0300144300144299*G0_0_1_0_2_1 - 0.0344011544011544*G0_0_1_0_2_2 - 0.135834535834535*G0_0_1_1_0_0 - 0.0982780182780177*G0_0_1_1_0_1 - 0.0300144300144299*G0_0_1_1_0_2 - 0.0982780182780177*G0_0_1_1_1_0 - 0.385569985569984*G0_0_1_1_1_1 - 0.166310726310726*G0_0_1_1_1_2 - 0.0300144300144299*G0_0_1_1_2_0 - 0.166310726310726*G0_0_1_1_2_1 - 0.125367965367965*G0_0_1_1_2_2 - 0.0303992303992303*G0_0_1_2_0_0 - 0.0300144300144299*G0_0_1_2_0_1 - 0.0344011544011544*G0_0_1_2_0_2 - 0.0300144300144299*G0_0_1_2_1_0 - 0.166310726310726*G0_0_1_2_1_1 - 0.125367965367965*G0_0_1_2_1_2 - 0.0344011544011544*G0_0_1_2_2_0 - 0.125367965367965*G0_0_1_2_2_1 - 0.134834054834055*G0_0_1_2_2_2 - 0.130678210678211*G0_1_0_0_0_0 - 0.053025493025493*G0_1_0_0_0_1 - 0.0364021164021164*G0_1_0_0_0_2 - 0.053025493025493*G0_1_0_0_1_0 - 0.076113516113516*G0_1_0_0_1_1 - 0.03001443001443*G0_1_0_0_1_2 - 0.0364021164021164*G0_1_0_0_2_0 - 0.03001443001443*G0_1_0_0_2_1 - 0.0283982683982685*G0_1_0_0_2_2 - 0.053025493025493*G0_1_0_1_0_0 - 0.076113516113516*G0_1_0_1_0_1 - 0.03001443001443*G0_1_0_1_0_2 - 0.076113516113516*G0_1_0_1_1_0 - 0.385569985569984*G0_1_0_1_1_1 - 0.188475228475228*G0_1_0_1_1_2 - 0.03001443001443*G0_1_0_1_2_0 - 0.188475228475228*G0_1_0_1_2_1 - 0.208177008177007*G0_1_0_1_2_2 - 0.0364021164021164*G0_1_0_2_0_0 - 0.03001443001443*G0_1_0_2_0_1 - 0.0283982683982685*G0_1_0_2_0_2 - 0.03001443001443*G0_1_0_2_1_0 - 0.188475228475228*G0_1_0_2_1_1 - 0.208177008177007*G0_1_0_2_1_2 - 0.0283982683982685*G0_1_0_2_2_0 - 0.208177008177007*G0_1_0_2_2_1 - 0.274747474747474*G0_1_0_2_2_2 + 0.00415584415584415*G0_1_1_0_0_0 + 0.072342472342472*G0_1_1_0_0_1 - 0.00200096200096202*G0_1_1_0_0_2 + 0.072342472342472*G0_1_1_0_1_0 + 0.0901972101972098*G0_1_1_0_1_1 - 0.00200096200096202*G0_1_1_0_2_0 + 0.00200096200096196*G0_1_1_0_2_2 + 0.072342472342472*G0_1_1_1_0_0 + 0.0901972101972098*G0_1_1_1_0_1 + 0.0901972101972098*G0_1_1_1_1_0 - 0.0901972101972097*G0_1_1_1_1_2 - 0.0901972101972097*G0_1_1_1_2_1 - 0.072342472342472*G0_1_1_1_2_2 - 0.00200096200096202*G0_1_1_2_0_0 + 0.00200096200096196*G0_1_1_2_0_2 - 0.0901972101972097*G0_1_1_2_1_1 - 0.072342472342472*G0_1_1_2_1_2 + 0.00200096200096196*G0_1_1_2_2_0 - 0.072342472342472*G0_1_1_2_2_1 - 0.00415584415584468*G0_1_1_2_2_2; + A[166] = -A[46] - 0.044508577841911*G0_0_0_0_0_0 - 0.00696916252471807*G0_0_0_0_0_1 - 0.0148361926139703*G0_0_0_0_0_2 - 0.00696916252471807*G0_0_0_0_1_0 - 0.01000481000481*G0_0_0_0_1_1 - 0.00348458126235903*G0_0_0_0_1_2 - 0.0148361926139703*G0_0_0_0_2_0 - 0.00348458126235903*G0_0_0_0_2_1 - 0.0148361926139703*G0_0_0_0_2_2 - 0.00696916252471807*G0_0_0_1_0_0 - 0.01000481000481*G0_0_0_1_0_1 - 0.00348458126235903*G0_0_0_1_0_2 - 0.01000481000481*G0_0_0_1_1_0 - 0.224082090748757*G0_0_0_1_1_1 - 0.01000481000481*G0_0_0_1_1_2 - 0.00348458126235903*G0_0_0_1_2_0 - 0.01000481000481*G0_0_0_1_2_1 - 0.00696916252471806*G0_0_0_1_2_2 - 0.0148361926139703*G0_0_0_2_0_0 - 0.00348458126235903*G0_0_0_2_0_1 - 0.0148361926139703*G0_0_0_2_0_2 - 0.00348458126235903*G0_0_0_2_1_0 - 0.01000481000481*G0_0_0_2_1_1 - 0.00696916252471806*G0_0_0_2_1_2 - 0.0148361926139703*G0_0_0_2_2_0 - 0.00696916252471806*G0_0_0_2_2_1 - 0.0445085778419109*G0_0_0_2_2_2; + A[115] = A[157] - 0.0230880230880238*G0_0_1_0_0_0 + 0.0136604136604135*G0_0_1_0_0_1 + 0.0136604136604134*G0_0_1_0_0_2 + 0.0136604136604135*G0_0_1_0_1_0 - 0.000153920153920193*G0_0_1_0_1_1 - 0.00504088504088505*G0_0_1_0_1_2 + 0.0136604136604134*G0_0_1_0_2_0 - 0.00504088504088505*G0_0_1_0_2_1 - 0.000153920153920305*G0_0_1_0_2_2 + 0.0136604136604135*G0_0_1_1_0_0 - 0.000153920153920193*G0_0_1_1_0_1 - 0.00504088504088505*G0_0_1_1_0_2 - 0.000153920153920193*G0_0_1_1_1_0 - 0.00681096681096688*G0_0_1_1_1_1 - 0.00234728234728233*G0_0_1_1_1_2 - 0.00504088504088505*G0_0_1_1_2_0 - 0.00234728234728233*G0_0_1_1_2_1 - 0.00234728234728233*G0_0_1_1_2_2 + 0.0136604136604134*G0_0_1_2_0_0 - 0.00504088504088505*G0_0_1_2_0_1 - 0.000153920153920304*G0_0_1_2_0_2 - 0.00504088504088505*G0_0_1_2_1_0 - 0.00234728234728233*G0_0_1_2_1_1 - 0.00234728234728233*G0_0_1_2_1_2 - 0.000153920153920304*G0_0_1_2_2_0 - 0.00234728234728233*G0_0_1_2_2_1 - 0.00681096681096667*G0_0_1_2_2_2 + 0.0230880230880239*G0_1_0_0_0_0 - 0.0136604136604135*G0_1_0_0_0_1 - 0.0136604136604134*G0_1_0_0_0_2 - 0.0136604136604135*G0_1_0_0_1_0 + 0.000153920153920193*G0_1_0_0_1_1 + 0.00504088504088505*G0_1_0_0_1_2 - 0.0136604136604134*G0_1_0_0_2_0 + 0.00504088504088505*G0_1_0_0_2_1 + 0.000153920153920305*G0_1_0_0_2_2 - 0.0136604136604135*G0_1_0_1_0_0 + 0.000153920153920193*G0_1_0_1_0_1 + 0.00504088504088505*G0_1_0_1_0_2 + 0.000153920153920193*G0_1_0_1_1_0 + 0.00681096681096688*G0_1_0_1_1_1 + 0.00234728234728233*G0_1_0_1_1_2 + 0.00504088504088505*G0_1_0_1_2_0 + 0.00234728234728233*G0_1_0_1_2_1 + 0.00234728234728233*G0_1_0_1_2_2 - 0.0136604136604134*G0_1_0_2_0_0 + 0.00504088504088505*G0_1_0_2_0_1 + 0.000153920153920307*G0_1_0_2_0_2 + 0.00504088504088505*G0_1_0_2_1_0 + 0.00234728234728233*G0_1_0_2_1_1 + 0.00234728234728233*G0_1_0_2_1_2 + 0.000153920153920307*G0_1_0_2_2_0 + 0.00234728234728233*G0_1_0_2_2_1 + 0.00681096681096667*G0_1_0_2_2_2; + A[224] = A[208] - 0.147763347763347*G0_0_0_0_0_0 - 0.0788071188071185*G0_0_0_0_0_1 + 0.00985088985088978*G0_0_0_0_0_2 - 0.0788071188071185*G0_0_0_0_1_0 - 0.103434343434343*G0_0_0_0_1_1 - 0.0344781144781143*G0_0_0_0_1_2 + 0.00985088985088978*G0_0_0_0_2_0 - 0.0344781144781143*G0_0_0_0_2_1 + 0.187166907166906*G0_0_0_0_2_2 - 0.0788071188071185*G0_0_0_1_0_0 - 0.103434343434343*G0_0_0_1_0_1 - 0.0344781144781143*G0_0_0_1_0_2 - 0.103434343434343*G0_0_0_1_1_0 - 0.812698412698408*G0_0_0_1_1_1 - 0.167465127465126*G0_0_0_1_1_2 - 0.0344781144781143*G0_0_0_1_2_0 - 0.167465127465126*G0_0_0_1_2_1 + 0.147763347763348*G0_0_0_1_2_2 + 0.0098508898508898*G0_0_0_2_0_0 - 0.0344781144781143*G0_0_0_2_0_1 + 0.187166907166906*G0_0_0_2_0_2 - 0.0344781144781143*G0_0_0_2_1_0 - 0.167465127465126*G0_0_0_2_1_1 + 0.147763347763348*G0_0_0_2_1_2 + 0.187166907166906*G0_0_0_2_2_0 + 0.147763347763348*G0_0_0_2_2_1 + 1.18210678210678*G0_0_0_2_2_2 - 0.0246272246272244*G0_0_1_0_0_1 + 0.0246272246272244*G0_0_1_0_0_2 - 0.0246272246272244*G0_0_1_0_1_0 - 0.0566426166426163*G0_0_1_0_1_1 + 0.0246272246272244*G0_0_1_0_2_0 + 0.0566426166426164*G0_0_1_0_2_2 - 0.0246272246272244*G0_0_1_1_0_0 - 0.0566426166426163*G0_0_1_1_0_1 - 0.0566426166426163*G0_0_1_1_1_0 - 0.664935064935061*G0_0_1_1_1_1 - 0.145300625300624*G0_0_1_1_1_2 - 0.145300625300624*G0_0_1_1_2_1 + 0.145300625300625*G0_0_1_1_2_2 + 0.0246272246272244*G0_0_1_2_0_0 + 0.0566426166426164*G0_0_1_2_0_2 - 0.145300625300624*G0_0_1_2_1_1 + 0.145300625300625*G0_0_1_2_1_2 + 0.0566426166426164*G0_0_1_2_2_0 + 0.145300625300625*G0_0_1_2_2_1 + 0.664935064935063*G0_0_1_2_2_2 - 0.0246272246272244*G0_1_0_0_0_1 + 0.0246272246272244*G0_1_0_0_0_2 - 0.0246272246272244*G0_1_0_0_1_0 - 0.0566426166426163*G0_1_0_0_1_1 + 0.0246272246272244*G0_1_0_0_2_0 + 0.0566426166426164*G0_1_0_0_2_2 - 0.0246272246272244*G0_1_0_1_0_0 - 0.0566426166426163*G0_1_0_1_0_1 - 0.0566426166426163*G0_1_0_1_1_0 - 0.664935064935061*G0_1_0_1_1_1 - 0.145300625300624*G0_1_0_1_1_2 - 0.145300625300624*G0_1_0_1_2_1 + 0.145300625300625*G0_1_0_1_2_2 + 0.0246272246272244*G0_1_0_2_0_0 + 0.0566426166426164*G0_1_0_2_0_2 - 0.145300625300624*G0_1_0_2_1_1 + 0.145300625300625*G0_1_0_2_1_2 + 0.0566426166426164*G0_1_0_2_2_0 + 0.145300625300625*G0_1_0_2_2_1 + 0.664935064935063*G0_1_0_2_2_2 + 0.147763347763348*G0_1_1_0_0_0 - 0.00985088985088992*G0_1_1_0_0_1 + 0.0788071188071185*G0_1_1_0_0_2 - 0.00985088985088992*G0_1_1_0_1_0 - 0.187166907166906*G0_1_1_0_1_1 + 0.0344781144781144*G0_1_1_0_1_2 + 0.0788071188071185*G0_1_1_0_2_0 + 0.0344781144781144*G0_1_1_0_2_1 + 0.103434343434343*G0_1_1_0_2_2 - 0.00985088985088992*G0_1_1_1_0_0 - 0.187166907166906*G0_1_1_1_0_1 + 0.0344781144781144*G0_1_1_1_0_2 - 0.187166907166906*G0_1_1_1_1_0 - 1.18210678210678*G0_1_1_1_1_1 - 0.147763347763347*G0_1_1_1_1_2 + 0.0344781144781144*G0_1_1_1_2_0 - 0.147763347763347*G0_1_1_1_2_1 + 0.167465127465127*G0_1_1_1_2_2 + 0.0788071188071185*G0_1_1_2_0_0 + 0.0344781144781144*G0_1_1_2_0_1 + 0.103434343434343*G0_1_1_2_0_2 + 0.0344781144781144*G0_1_1_2_1_0 - 0.147763347763347*G0_1_1_2_1_1 + 0.167465127465127*G0_1_1_2_1_2 + 0.103434343434343*G0_1_1_2_2_0 + 0.167465127465127*G0_1_1_2_2_1 + 0.812698412698409*G0_1_1_2_2_2; + A[190] = A[162] - 0.122366522366521*G0_0_1_0_0_0 - 0.0711880711880706*G0_0_1_0_0_1 + 0.0242424242424244*G0_0_1_0_0_2 - 0.0711880711880706*G0_0_1_0_1_0 - 0.00484848484848463*G0_0_1_0_1_1 + 0.00831168831168831*G0_0_1_0_1_2 + 0.0242424242424244*G0_0_1_0_2_0 + 0.00831168831168831*G0_0_1_0_2_1 + 0.0182395382395383*G0_0_1_0_2_2 - 0.0711880711880706*G0_0_1_1_0_0 - 0.00484848484848463*G0_0_1_1_0_1 + 0.00831168831168831*G0_0_1_1_0_2 - 0.00484848484848463*G0_0_1_1_1_0 + 0.0688023088023089*G0_0_1_1_1_1 + 0.0173160173160172*G0_0_1_1_1_2 + 0.00831168831168831*G0_0_1_1_2_0 + 0.0173160173160172*G0_0_1_1_2_1 + 0.0116209716209716*G0_0_1_1_2_2 + 0.0242424242424243*G0_0_1_2_0_0 + 0.00831168831168831*G0_0_1_2_0_1 + 0.0182395382395383*G0_0_1_2_0_2 + 0.00831168831168831*G0_0_1_2_1_0 + 0.0173160173160172*G0_0_1_2_1_1 + 0.0116209716209716*G0_0_1_2_1_2 + 0.0182395382395383*G0_0_1_2_2_0 + 0.0116209716209716*G0_0_1_2_2_1 + 0.0175468975468976*G0_0_1_2_2_2 + 0.122366522366521*G0_1_0_0_0_0 + 0.0711880711880706*G0_1_0_0_0_1 - 0.0242424242424244*G0_1_0_0_0_2 + 0.0711880711880706*G0_1_0_0_1_0 + 0.00484848484848462*G0_1_0_0_1_1 - 0.00831168831168831*G0_1_0_0_1_2 - 0.0242424242424244*G0_1_0_0_2_0 - 0.00831168831168831*G0_1_0_0_2_1 - 0.0182395382395383*G0_1_0_0_2_2 + 0.0711880711880706*G0_1_0_1_0_0 + 0.00484848484848463*G0_1_0_1_0_1 - 0.00831168831168831*G0_1_0_1_0_2 + 0.00484848484848463*G0_1_0_1_1_0 - 0.0688023088023089*G0_1_0_1_1_1 - 0.0173160173160172*G0_1_0_1_1_2 - 0.00831168831168831*G0_1_0_1_2_0 - 0.0173160173160172*G0_1_0_1_2_1 - 0.0116209716209716*G0_1_0_1_2_2 - 0.0242424242424244*G0_1_0_2_0_0 - 0.00831168831168831*G0_1_0_2_0_1 - 0.0182395382395383*G0_1_0_2_0_2 - 0.00831168831168831*G0_1_0_2_1_0 - 0.0173160173160172*G0_1_0_2_1_1 - 0.0116209716209716*G0_1_0_2_1_2 - 0.0182395382395383*G0_1_0_2_2_0 - 0.0116209716209716*G0_1_0_2_2_1 - 0.0175468975468976*G0_1_0_2_2_2; + A[206] = -A[198] - 0.20481641814975*G0_0_0_0_0_0 - 0.0248324514991181*G0_0_0_0_0_1 - 0.104460477793811*G0_0_0_0_0_2 - 0.0248324514991181*G0_0_0_0_1_0 - 0.0256533589866922*G0_0_0_0_1_1 - 0.0285265351932018*G0_0_0_0_1_2 - 0.104460477793811*G0_0_0_0_2_0 - 0.0285265351932018*G0_0_0_0_2_1 - 0.108565015231681*G0_0_0_0_2_2 - 0.0248324514991181*G0_0_0_1_0_0 - 0.0256533589866922*G0_0_0_1_0_1 - 0.0285265351932018*G0_0_0_1_0_2 - 0.0256533589866922*G0_0_0_1_1_0 - 0.201122334455667*G0_0_0_1_1_1 - 0.134423601090267*G0_0_0_1_1_2 - 0.0285265351932018*G0_0_0_1_2_0 - 0.134423601090267*G0_0_0_1_2_1 - 0.0966618566618563*G0_0_0_1_2_2 - 0.104460477793811*G0_0_0_2_0_0 - 0.0285265351932018*G0_0_0_2_0_1 - 0.108565015231681*G0_0_0_2_0_2 - 0.0285265351932018*G0_0_0_2_1_0 - 0.134423601090267*G0_0_0_2_1_1 - 0.0966618566618563*G0_0_0_2_1_2 - 0.108565015231681*G0_0_0_2_2_0 - 0.0966618566618563*G0_0_0_2_2_1 - 0.241757255090588*G0_0_0_2_2_2 + 0.0369408369408369*G0_1_0_0_0_0 + 0.0718294051627382*G0_1_0_0_0_1 + 0.0041045374378707*G0_1_0_0_0_2 + 0.0718294051627382*G0_1_0_0_1_0 + 0.108770242103575*G0_1_0_0_1_1 + 0.0041045374378707*G0_1_0_0_2_0 - 0.00410453743787088*G0_1_0_0_2_2 + 0.0718294051627382*G0_1_0_1_0_0 + 0.108770242103575*G0_1_0_1_0_1 + 0.108770242103575*G0_1_0_1_1_0 - 0.108770242103575*G0_1_0_1_1_2 - 0.108770242103575*G0_1_0_1_2_1 - 0.0718294051627383*G0_1_0_1_2_2 + 0.0041045374378707*G0_1_0_2_0_0 - 0.00410453743787088*G0_1_0_2_0_2 - 0.108770242103575*G0_1_0_2_1_1 - 0.0718294051627383*G0_1_0_2_1_2 - 0.00410453743787088*G0_1_0_2_2_0 - 0.0718294051627383*G0_1_0_2_2_1 - 0.0369408369408373*G0_1_0_2_2_2; + A[178] = A[206] + 0.0252429052429052*G0_0_1_0_0_0 + 0.0557190957190955*G0_0_1_0_0_1 + 0.00030784030784026*G0_0_1_0_0_2 + 0.0557190957190955*G0_0_1_0_1_0 + 0.0672118005451336*G0_0_1_0_1_1 + 0.0012313612313612*G0_0_1_0_1_2 + 0.00030784030784026*G0_0_1_0_2_0 + 0.00123136123136119*G0_0_1_0_2_1 - 0.00379669713003051*G0_0_1_0_2_2 + 0.0557190957190955*G0_0_1_1_0_0 + 0.0672118005451336*G0_0_1_1_0_1 + 0.00123136123136119*G0_0_1_1_0_2 + 0.0672118005451336*G0_0_1_1_1_0 - 0.206253006253005*G0_0_1_1_1_1 - 0.0415584415584415*G0_0_1_1_1_2 + 0.00123136123136119*G0_0_1_1_2_0 - 0.0415584415584415*G0_0_1_1_2_1 - 0.0161103094436428*G0_0_1_1_2_2 + 0.00030784030784026*G0_0_1_2_0_0 + 0.00123136123136119*G0_0_1_2_0_1 - 0.00379669713003051*G0_0_1_2_0_2 + 0.00123136123136119*G0_0_1_2_1_0 - 0.0415584415584415*G0_0_1_2_1_1 - 0.0161103094436428*G0_0_1_2_1_2 - 0.00379669713003051*G0_0_1_2_2_0 - 0.0161103094436428*G0_0_1_2_2_1 - 0.0116979316979318*G0_0_1_2_2_2 - 0.0252429052429052*G0_1_0_0_0_0 - 0.0557190957190955*G0_1_0_0_0_1 - 0.000307840307840257*G0_1_0_0_0_2 - 0.0557190957190955*G0_1_0_0_1_0 - 0.0672118005451336*G0_1_0_0_1_1 - 0.00123136123136119*G0_1_0_0_1_2 - 0.000307840307840257*G0_1_0_0_2_0 - 0.00123136123136119*G0_1_0_0_2_1 + 0.00379669713003051*G0_1_0_0_2_2 - 0.0557190957190955*G0_1_0_1_0_0 - 0.0672118005451336*G0_1_0_1_0_1 - 0.00123136123136119*G0_1_0_1_0_2 - 0.0672118005451336*G0_1_0_1_1_0 + 0.206253006253005*G0_1_0_1_1_1 + 0.0415584415584415*G0_1_0_1_1_2 - 0.00123136123136119*G0_1_0_1_2_0 + 0.0415584415584415*G0_1_0_1_2_1 + 0.0161103094436428*G0_1_0_1_2_2 - 0.000307840307840257*G0_1_0_2_0_0 - 0.00123136123136119*G0_1_0_2_0_1 + 0.00379669713003051*G0_1_0_2_0_2 - 0.00123136123136119*G0_1_0_2_1_0 + 0.0415584415584415*G0_1_0_2_1_1 + 0.0161103094436428*G0_1_0_2_1_2 + 0.00379669713003051*G0_1_0_2_2_0 + 0.0161103094436428*G0_1_0_2_2_1 + 0.0116979316979318*G0_1_0_2_2_2; + A[0] = A[16] + 0.225845759179092*G0_0_0_0_0_0 + 0.0113409224520335*G0_0_0_0_0_1 + 0.0111378333600555*G0_0_0_0_0_2 + 0.0113409224520335*G0_0_0_0_1_0 - 0.0113409224520335*G0_0_0_0_1_1 + 0.0111378333600555*G0_0_0_0_2_0 - 0.000203089091977975*G0_0_0_0_2_2 + 0.0113409224520335*G0_0_0_1_0_0 - 0.0113409224520335*G0_0_0_1_0_1 - 0.0113409224520335*G0_0_0_1_1_0 - 0.225845759179091*G0_0_0_1_1_1 - 0.0111378333600555*G0_0_0_1_1_2 - 0.0111378333600555*G0_0_0_1_2_1 + 0.000203089091977975*G0_0_0_1_2_2 + 0.0111378333600555*G0_0_0_2_0_0 - 0.000203089091977975*G0_0_0_2_0_2 - 0.0111378333600555*G0_0_0_2_1_1 + 0.000203089091977975*G0_0_0_2_1_2 - 0.000203089091977975*G0_0_0_2_2_0 + 0.000203089091977975*G0_0_0_2_2_1 + 0.234062850729517*G0_0_1_0_0_0 + 0.0138768638768638*G0_0_1_0_0_1 + 0.0138768638768638*G0_0_1_0_0_2 + 0.0138768638768638*G0_0_1_0_1_0 + 0.0025359414248303*G0_0_1_0_1_1 + 0.00126797071241515*G0_0_1_0_1_2 + 0.0138768638768638*G0_0_1_0_2_0 + 0.00126797071241515*G0_0_1_0_2_1 + 0.0025359414248303*G0_0_1_0_2_2 + 0.0138768638768638*G0_0_1_1_0_0 + 0.0025359414248303*G0_0_1_1_0_1 + 0.00126797071241515*G0_0_1_1_0_2 + 0.0025359414248303*G0_0_1_1_1_0 + 0.00821709155042479*G0_0_1_1_1_1 + 0.00273903051680827*G0_0_1_1_1_2 + 0.00126797071241515*G0_0_1_1_2_0 + 0.00273903051680827*G0_0_1_1_2_1 + 0.00273903051680827*G0_0_1_1_2_2 + 0.0138768638768638*G0_0_1_2_0_0 + 0.00126797071241515*G0_0_1_2_0_1 + 0.0025359414248303*G0_0_1_2_0_2 + 0.00126797071241515*G0_0_1_2_1_0 + 0.00273903051680827*G0_0_1_2_1_1 + 0.00273903051680827*G0_0_1_2_1_2 + 0.0025359414248303*G0_0_1_2_2_0 + 0.00273903051680827*G0_0_1_2_2_1 + 0.00821709155042485*G0_0_1_2_2_2 + 0.234062850729517*G0_1_0_0_0_0 + 0.0138768638768638*G0_1_0_0_0_1 + 0.0138768638768638*G0_1_0_0_0_2 + 0.0138768638768638*G0_1_0_0_1_0 + 0.0025359414248303*G0_1_0_0_1_1 + 0.00126797071241515*G0_1_0_0_1_2 + 0.0138768638768638*G0_1_0_0_2_0 + 0.00126797071241515*G0_1_0_0_2_1 + 0.0025359414248303*G0_1_0_0_2_2 + 0.0138768638768638*G0_1_0_1_0_0 + 0.0025359414248303*G0_1_0_1_0_1 + 0.00126797071241515*G0_1_0_1_0_2 + 0.0025359414248303*G0_1_0_1_1_0 + 0.00821709155042479*G0_1_0_1_1_1 + 0.00273903051680827*G0_1_0_1_1_2 + 0.00126797071241515*G0_1_0_1_2_0 + 0.00273903051680827*G0_1_0_1_2_1 + 0.00273903051680827*G0_1_0_1_2_2 + 0.0138768638768638*G0_1_0_2_0_0 + 0.00126797071241515*G0_1_0_2_0_1 + 0.0025359414248303*G0_1_0_2_0_2 + 0.00126797071241515*G0_1_0_2_1_0 + 0.00273903051680827*G0_1_0_2_1_1 + 0.00273903051680827*G0_1_0_2_1_2 + 0.0025359414248303*G0_1_0_2_2_0 + 0.00273903051680827*G0_1_0_2_2_1 + 0.00821709155042485*G0_1_0_2_2_2 + 0.234062850729517*G0_1_1_0_0_0 + 0.0138768638768638*G0_1_1_0_0_1 + 0.0138768638768638*G0_1_1_0_0_2 + 0.0138768638768638*G0_1_1_0_1_0 + 0.0025359414248303*G0_1_1_0_1_1 + 0.00126797071241515*G0_1_1_0_1_2 + 0.0138768638768638*G0_1_1_0_2_0 + 0.00126797071241515*G0_1_1_0_2_1 + 0.00253594142483031*G0_1_1_0_2_2 + 0.0138768638768638*G0_1_1_1_0_0 + 0.0025359414248303*G0_1_1_1_0_1 + 0.00126797071241515*G0_1_1_1_0_2 + 0.0025359414248303*G0_1_1_1_1_0 + 0.00821709155042481*G0_1_1_1_1_1 + 0.00273903051680827*G0_1_1_1_1_2 + 0.00126797071241515*G0_1_1_1_2_0 + 0.00273903051680827*G0_1_1_1_2_1 + 0.00273903051680827*G0_1_1_1_2_2 + 0.0138768638768638*G0_1_1_2_0_0 + 0.00126797071241515*G0_1_1_2_0_1 + 0.00253594142483031*G0_1_1_2_0_2 + 0.00126797071241515*G0_1_1_2_1_0 + 0.00273903051680827*G0_1_1_2_1_1 + 0.00273903051680827*G0_1_1_2_1_2 + 0.00253594142483031*G0_1_1_2_2_0 + 0.00273903051680827*G0_1_1_2_2_1 + 0.00821709155042486*G0_1_1_2_2_2; + A[58] = -A[178] - 0.20481641814975*G0_0_0_0_0_0 - 0.0248324514991181*G0_0_0_0_0_1 - 0.104460477793811*G0_0_0_0_0_2 - 0.0248324514991181*G0_0_0_0_1_0 - 0.0256533589866922*G0_0_0_0_1_1 - 0.0285265351932018*G0_0_0_0_1_2 - 0.104460477793811*G0_0_0_0_2_0 - 0.0285265351932018*G0_0_0_0_2_1 - 0.108565015231681*G0_0_0_0_2_2 - 0.0248324514991181*G0_0_0_1_0_0 - 0.0256533589866922*G0_0_0_1_0_1 - 0.0285265351932018*G0_0_0_1_0_2 - 0.0256533589866922*G0_0_0_1_1_0 - 0.201122334455667*G0_0_0_1_1_1 - 0.134423601090267*G0_0_0_1_1_2 - 0.0285265351932018*G0_0_0_1_2_0 - 0.134423601090267*G0_0_0_1_2_1 - 0.0966618566618563*G0_0_0_1_2_2 - 0.104460477793811*G0_0_0_2_0_0 - 0.0285265351932018*G0_0_0_2_0_1 - 0.108565015231681*G0_0_0_2_0_2 - 0.0285265351932018*G0_0_0_2_1_0 - 0.134423601090267*G0_0_0_2_1_1 - 0.0966618566618563*G0_0_0_2_1_2 - 0.108565015231681*G0_0_0_2_2_0 - 0.0966618566618563*G0_0_0_2_2_1 - 0.241757255090588*G0_0_0_2_2_2 + 0.0369408369408369*G0_0_1_0_0_0 + 0.0718294051627382*G0_0_1_0_0_1 + 0.0041045374378707*G0_0_1_0_0_2 + 0.0718294051627382*G0_0_1_0_1_0 + 0.108770242103575*G0_0_1_0_1_1 + 0.0041045374378707*G0_0_1_0_2_0 - 0.00410453743787088*G0_0_1_0_2_2 + 0.0718294051627382*G0_0_1_1_0_0 + 0.108770242103575*G0_0_1_1_0_1 + 0.108770242103575*G0_0_1_1_1_0 - 0.108770242103575*G0_0_1_1_1_2 - 0.108770242103575*G0_0_1_1_2_1 - 0.0718294051627383*G0_0_1_1_2_2 + 0.0041045374378707*G0_0_1_2_0_0 - 0.00410453743787088*G0_0_1_2_0_2 - 0.108770242103575*G0_0_1_2_1_1 - 0.0718294051627383*G0_0_1_2_1_2 - 0.00410453743787088*G0_0_1_2_2_0 - 0.0718294051627383*G0_0_1_2_2_1 - 0.0369408369408373*G0_0_1_2_2_2; + A[28] = 0.0368125701459033*G0_0_0_0_0_0 + 0.00282186948853613*G0_0_0_0_0_1 + 0.0184960718294051*G0_0_0_0_0_2 + 0.00282186948853613*G0_0_0_0_1_0 - 0.0105178771845438*G0_0_0_0_1_1 + 0.00205226871893538*G0_0_0_0_1_2 + 0.0184960718294051*G0_0_0_0_2_0 + 0.00205226871893538*G0_0_0_0_2_1 + 0.0186756453423119*G0_0_0_0_2_2 + 0.00282186948853613*G0_0_0_1_0_0 - 0.0105178771845438*G0_0_0_1_0_1 + 0.00205226871893538*G0_0_0_1_0_2 - 0.0105178771845438*G0_0_0_1_1_0 - 0.20792047458714*G0_0_0_1_1_1 - 0.0214205547538879*G0_0_0_1_1_2 + 0.00205226871893538*G0_0_0_1_2_0 - 0.0214205547538879*G0_0_0_1_2_1 + 0.00384800384800384*G0_0_0_1_2_2 + 0.0184960718294051*G0_0_0_2_0_0 + 0.00205226871893538*G0_0_0_2_0_1 + 0.0186756453423119*G0_0_0_2_0_2 + 0.00205226871893538*G0_0_0_2_1_0 - 0.0214205547538879*G0_0_0_2_1_1 + 0.00384800384800384*G0_0_0_2_1_2 + 0.0186756453423119*G0_0_0_2_2_0 + 0.00384800384800384*G0_0_0_2_2_1 + 0.0384287317620649*G0_0_0_2_2_2 - 0.00161616161616164*G0_0_1_0_0_0 - 0.00102613435946771*G0_0_1_0_0_1 - 0.000179573512906838*G0_0_1_0_0_2 - 0.00102613435946771*G0_0_1_0_1_0 + 0.0109026775693441*G0_0_1_0_1_1 - 0.000179573512906838*G0_0_1_0_2_0 + 0.000179573512906865*G0_0_1_0_2_2 - 0.00102613435946771*G0_0_1_1_0_0 + 0.0109026775693441*G0_0_1_1_0_1 + 0.0109026775693441*G0_0_1_1_1_0 - 0.0109026775693442*G0_0_1_1_1_2 - 0.0109026775693442*G0_0_1_1_2_1 + 0.0010261343594677*G0_0_1_1_2_2 - 0.000179573512906838*G0_0_1_2_0_0 + 0.000179573512906865*G0_0_1_2_0_2 - 0.0109026775693442*G0_0_1_2_1_1 + 0.0010261343594677*G0_0_1_2_1_2 + 0.000179573512906865*G0_0_1_2_2_0 + 0.0010261343594677*G0_0_1_2_2_1 + 0.00161616161616169*G0_0_1_2_2_2; + A[12] = A[28] - 0.244733044733043*G0_0_0_0_0_0 - 0.0133397466730799*G0_0_0_0_0_1 - 0.039916626583293*G0_0_0_0_0_2 - 0.0133397466730799*G0_0_0_0_1_0 + 0.01333974667308*G0_0_0_0_1_1 - 0.039916626583293*G0_0_0_0_2_0 - 0.0148276414943081*G0_0_0_0_2_2 - 0.0133397466730799*G0_0_0_1_0_0 + 0.0133397466730799*G0_0_0_1_0_1 + 0.0133397466730799*G0_0_0_1_1_0 + 0.244733044733043*G0_0_0_1_1_1 + 0.039916626583293*G0_0_0_1_1_2 + 0.039916626583293*G0_0_0_1_2_1 + 0.014827641494308*G0_0_0_1_2_2 - 0.039916626583293*G0_0_0_2_0_0 - 0.0148276414943081*G0_0_0_2_0_2 + 0.039916626583293*G0_0_0_2_1_1 + 0.0148276414943081*G0_0_0_2_1_2 - 0.0148276414943081*G0_0_0_2_2_0 + 0.014827641494308*G0_0_0_2_2_1 - 0.206304312970979*G0_0_1_0_0_0 - 0.0203944203944203*G0_0_1_0_0_1 - 0.010338303671637*G0_0_1_0_0_2 - 0.0203944203944203*G0_0_1_0_1_0 - 0.00705467372134032*G0_0_1_0_1_1 + 0.00205226871893538*G0_0_1_0_1_2 - 0.010338303671637*G0_0_1_0_2_0 + 0.00205226871893538*G0_0_1_0_2_1 + 0.00264229597562928*G0_0_1_0_2_2 - 0.0203944203944203*G0_0_1_1_0_0 - 0.00705467372134032*G0_0_1_1_0_1 + 0.00205226871893538*G0_0_1_1_0_2 - 0.00705467372134031*G0_0_1_1_1_0 + 0.0384287317620651*G0_0_1_1_1_1 + 0.0295783229116561*G0_0_1_1_1_2 + 0.00205226871893538*G0_0_1_1_2_0 + 0.0295783229116561*G0_0_1_1_2_1 + 0.0174699374699374*G0_0_1_1_2_2 - 0.010338303671637*G0_0_1_2_0_0 + 0.00205226871893538*G0_0_1_2_0_1 + 0.00264229597562928*G0_0_1_2_0_2 + 0.00205226871893538*G0_0_1_2_1_0 + 0.0295783229116561*G0_0_1_2_1_1 + 0.0174699374699373*G0_0_1_2_1_2 + 0.00264229597562928*G0_0_1_2_2_0 + 0.0174699374699374*G0_0_1_2_2_1 + 0.0351964085297416*G0_0_1_2_2_2 - 0.20792047458714*G0_1_0_0_0_0 - 0.0105178771845438*G0_1_0_0_0_1 - 0.0214205547538879*G0_1_0_0_0_2 - 0.0105178771845438*G0_1_0_0_1_0 + 0.00282186948853614*G0_1_0_0_1_1 + 0.00205226871893538*G0_1_0_0_1_2 - 0.0214205547538879*G0_1_0_0_2_0 + 0.00205226871893538*G0_1_0_0_2_1 + 0.00384800384800386*G0_1_0_0_2_2 - 0.0105178771845438*G0_1_0_1_0_0 + 0.00282186948853614*G0_1_0_1_0_1 + 0.00205226871893538*G0_1_0_1_0_2 + 0.00282186948853614*G0_1_0_1_1_0 + 0.0368125701459032*G0_1_0_1_1_1 + 0.018496071829405*G0_1_0_1_1_2 + 0.00205226871893538*G0_1_0_1_2_0 + 0.018496071829405*G0_1_0_1_2_1 + 0.0186756453423119*G0_1_0_1_2_2 - 0.0214205547538879*G0_1_0_2_0_0 + 0.00205226871893538*G0_1_0_2_0_1 + 0.00384800384800386*G0_1_0_2_0_2 + 0.00205226871893538*G0_1_0_2_1_0 + 0.018496071829405*G0_1_0_2_1_1 + 0.0186756453423119*G0_1_0_2_1_2 + 0.00384800384800386*G0_1_0_2_2_0 + 0.0186756453423119*G0_1_0_2_2_1 + 0.0384287317620649*G0_1_0_2_2_2 - 0.20792047458714*G0_1_1_0_0_0 - 0.021420554753888*G0_1_1_0_0_1 - 0.0105178771845438*G0_1_1_0_0_2 - 0.021420554753888*G0_1_1_0_1_0 + 0.00384800384800378*G0_1_1_0_1_1 + 0.00205226871893538*G0_1_1_0_1_2 - 0.0105178771845438*G0_1_1_0_2_0 + 0.00205226871893538*G0_1_1_0_2_1 + 0.00282186948853615*G0_1_1_0_2_2 - 0.021420554753888*G0_1_1_1_0_0 + 0.00384800384800378*G0_1_1_1_0_1 + 0.00205226871893538*G0_1_1_1_0_2 + 0.00384800384800378*G0_1_1_1_1_0 + 0.0384287317620647*G0_1_1_1_1_1 + 0.0186756453423119*G0_1_1_1_1_2 + 0.00205226871893537*G0_1_1_1_2_0 + 0.0186756453423119*G0_1_1_1_2_1 + 0.018496071829405*G0_1_1_1_2_2 - 0.0105178771845438*G0_1_1_2_0_0 + 0.00205226871893538*G0_1_1_2_0_1 + 0.00282186948853615*G0_1_1_2_0_2 + 0.00205226871893537*G0_1_1_2_1_0 + 0.0186756453423119*G0_1_1_2_1_1 + 0.018496071829405*G0_1_1_2_1_2 + 0.00282186948853615*G0_1_1_2_2_0 + 0.018496071829405*G0_1_1_2_2_1 + 0.0368125701459033*G0_1_1_2_2_2; + A[180] = A[12] + 0.0109026775693442*G0_0_1_0_0_1 - 0.0109026775693441*G0_0_1_0_0_2 + 0.0109026775693442*G0_0_1_0_1_0 - 0.00102613435946768*G0_0_1_0_1_1 - 0.0109026775693441*G0_0_1_0_2_0 + 0.00102613435946772*G0_0_1_0_2_2 + 0.0109026775693442*G0_0_1_1_0_0 - 0.00102613435946768*G0_0_1_1_0_1 - 0.00102613435946768*G0_0_1_1_1_0 - 0.00161616161616166*G0_0_1_1_1_1 - 0.000179573512906872*G0_0_1_1_1_2 - 0.000179573512906876*G0_0_1_1_2_1 + 0.000179573512906837*G0_0_1_1_2_2 - 0.0109026775693441*G0_0_1_2_0_0 + 0.00102613435946772*G0_0_1_2_0_2 - 0.000179573512906876*G0_0_1_2_1_1 + 0.000179573512906837*G0_0_1_2_1_2 + 0.00102613435946772*G0_0_1_2_2_0 + 0.000179573512906837*G0_0_1_2_2_1 + 0.00161616161616163*G0_0_1_2_2_2 - 0.0109026775693442*G0_1_0_0_0_1 + 0.0109026775693441*G0_1_0_0_0_2 - 0.0109026775693442*G0_1_0_0_1_0 + 0.00102613435946768*G0_1_0_0_1_1 + 0.0109026775693441*G0_1_0_0_2_0 - 0.00102613435946772*G0_1_0_0_2_2 - 0.0109026775693442*G0_1_0_1_0_0 + 0.00102613435946768*G0_1_0_1_0_1 + 0.00102613435946768*G0_1_0_1_1_0 + 0.00161616161616166*G0_1_0_1_1_1 + 0.000179573512906876*G0_1_0_1_1_2 + 0.000179573512906876*G0_1_0_1_2_1 - 0.000179573512906834*G0_1_0_1_2_2 + 0.0109026775693441*G0_1_0_2_0_0 - 0.00102613435946772*G0_1_0_2_0_2 + 0.000179573512906876*G0_1_0_2_1_1 - 0.000179573512906834*G0_1_0_2_1_2 - 0.00102613435946772*G0_1_0_2_2_0 - 0.000179573512906834*G0_1_0_2_2_1 - 0.00161616161616163*G0_1_0_2_2_2; + A[131] = -A[86] + 0.0138528138528141*G0_1_0_0_0_0 + 0.0107060018171129*G0_1_0_0_0_1 + 0.00253113142002034*G0_1_0_0_0_2 + 0.0107060018171129*G0_1_0_0_1_0 + 0.015494628827962*G0_1_0_0_1_1 - 0.00136817914595693*G0_1_0_0_1_2 + 0.00253113142002034*G0_1_0_0_2_0 - 0.00136817914595693*G0_1_0_0_2_1 + 0.00335203890759444*G0_1_0_0_2_2 + 0.0107060018171129*G0_1_0_1_0_0 + 0.015494628827962*G0_1_0_1_0_1 - 0.00136817914595693*G0_1_0_1_0_2 + 0.015494628827962*G0_1_0_1_1_0 - 0.0924547057880399*G0_1_0_1_1_1 + 0.000205226871893498*G0_1_0_1_1_2 - 0.00136817914595693*G0_1_0_1_2_0 + 0.000205226871893501*G0_1_0_1_2_1 - 0.00335203890759447*G0_1_0_1_2_2 + 0.00253113142002034*G0_1_0_2_0_0 - 0.00136817914595693*G0_1_0_2_0_1 + 0.00335203890759444*G0_1_0_2_0_2 - 0.00136817914595693*G0_1_0_2_1_0 + 0.000205226871893501*G0_1_0_2_1_1 - 0.00335203890759447*G0_1_0_2_1_2 + 0.00335203890759444*G0_1_0_2_2_0 - 0.00335203890759447*G0_1_0_2_2_1 - 0.0046176046176047*G0_1_1_0_0_0 - 0.00766180321735877*G0_1_1_0_0_1 - 0.00126556571001016*G0_1_1_0_0_2 - 0.00766180321735877*G0_1_1_0_1_0 - 0.0308182352626797*G0_1_1_0_1_1 + 0.000102613435946763*G0_1_1_0_1_2 - 0.00126556571001016*G0_1_1_0_2_0 + 0.000102613435946763*G0_1_1_0_2_1 - 0.00335203890759444*G0_1_1_0_2_2 - 0.00766180321735877*G0_1_1_1_0_0 - 0.0308182352626797*G0_1_1_1_0_1 + 0.000102613435946763*G0_1_1_1_0_2 - 0.0308182352626797*G0_1_1_1_1_0 - 0.250376783710117*G0_1_1_1_1_1 + 0.0102955480733258*G0_1_1_1_1_2 + 0.000102613435946763*G0_1_1_1_2_0 + 0.0102955480733258*G0_1_1_1_2_1 + 0.00540430762652984*G0_1_1_1_2_2 - 0.00126556571001016*G0_1_1_2_0_0 + 0.000102613435946763*G0_1_1_2_0_1 - 0.00335203890759444*G0_1_1_2_0_2 + 0.000102613435946763*G0_1_1_2_1_0 + 0.0102955480733258*G0_1_1_2_1_1 + 0.00540430762652984*G0_1_1_2_1_2 - 0.00335203890759444*G0_1_1_2_2_0 + 0.00540430762652984*G0_1_1_2_2_1 - 0.00205226871893539*G0_1_1_2_2_2; + A[123] = -A[131] - 0.00461760461760461*G0_0_0_0_0_0 - 0.00126556571001013*G0_0_0_0_0_1 - 0.00766180321735872*G0_0_0_0_0_2 - 0.00126556571001013*G0_0_0_0_1_0 - 0.0033520389075944*G0_0_0_0_1_1 + 0.000102613435946777*G0_0_0_0_1_2 - 0.00766180321735872*G0_0_0_0_2_0 + 0.000102613435946777*G0_0_0_0_2_1 - 0.0308182352626795*G0_0_0_0_2_2 - 0.00126556571001013*G0_0_0_1_0_0 - 0.0033520389075944*G0_0_0_1_0_1 + 0.000102613435946777*G0_0_0_1_0_2 - 0.0033520389075944*G0_0_0_1_1_0 - 0.00205226871893543*G0_0_0_1_1_1 + 0.00540430762652981*G0_0_0_1_1_2 + 0.000102613435946777*G0_0_0_1_2_0 + 0.00540430762652981*G0_0_0_1_2_1 + 0.0102955480733258*G0_0_0_1_2_2 - 0.00766180321735872*G0_0_0_2_0_0 + 0.000102613435946777*G0_0_0_2_0_1 - 0.0308182352626795*G0_0_0_2_0_2 + 0.000102613435946777*G0_0_0_2_1_0 + 0.00540430762652981*G0_0_0_2_1_1 + 0.0102955480733258*G0_0_0_2_1_2 - 0.0308182352626795*G0_0_0_2_2_0 + 0.0102955480733258*G0_0_0_2_2_1 - 0.250376783710115*G0_0_0_2_2_2 + 0.0138528138528142*G0_1_0_0_0_0 + 0.00253113142002032*G0_1_0_0_0_1 + 0.0107060018171129*G0_1_0_0_0_2 + 0.00253113142002032*G0_1_0_0_1_0 + 0.00335203890759443*G0_1_0_0_1_1 - 0.00136817914595692*G0_1_0_0_1_2 + 0.0107060018171129*G0_1_0_0_2_0 - 0.00136817914595692*G0_1_0_0_2_1 + 0.0154946288279621*G0_1_0_0_2_2 + 0.00253113142002032*G0_1_0_1_0_0 + 0.00335203890759443*G0_1_0_1_0_1 - 0.00136817914595692*G0_1_0_1_0_2 + 0.00335203890759443*G0_1_0_1_1_0 - 0.00335203890759452*G0_1_0_1_1_2 - 0.00136817914595692*G0_1_0_1_2_0 - 0.00335203890759452*G0_1_0_1_2_1 + 0.000205226871893492*G0_1_0_1_2_2 + 0.0107060018171129*G0_1_0_2_0_0 - 0.00136817914595692*G0_1_0_2_0_1 + 0.0154946288279621*G0_1_0_2_0_2 - 0.00136817914595692*G0_1_0_2_1_0 - 0.00335203890759452*G0_1_0_2_1_1 + 0.000205226871893491*G0_1_0_2_1_2 + 0.0154946288279621*G0_1_0_2_2_0 + 0.00020522687189349*G0_1_0_2_2_1 - 0.0924547057880384*G0_1_0_2_2_2; + A[74] = A[214] + 0.0175468975468973*G0_0_1_0_0_0 + 0.0116209716209714*G0_0_1_0_0_1 + 0.0182395382395382*G0_0_1_0_0_2 + 0.0116209716209714*G0_0_1_0_1_0 + 0.0173160173160171*G0_0_1_0_1_1 + 0.00831168831168825*G0_0_1_0_1_2 + 0.0182395382395382*G0_0_1_0_2_0 + 0.00831168831168824*G0_0_1_0_2_1 + 0.0242424242424241*G0_0_1_0_2_2 + 0.0116209716209714*G0_0_1_1_0_0 + 0.0173160173160171*G0_0_1_1_0_1 + 0.00831168831168824*G0_0_1_1_0_2 + 0.0173160173160171*G0_0_1_1_1_0 + 0.0688023088023085*G0_0_1_1_1_1 - 0.00484848484848474*G0_0_1_1_1_2 + 0.00831168831168824*G0_0_1_1_2_0 - 0.00484848484848474*G0_0_1_1_2_1 - 0.0711880711880708*G0_0_1_1_2_2 + 0.0182395382395382*G0_0_1_2_0_0 + 0.00831168831168825*G0_0_1_2_0_1 + 0.0242424242424241*G0_0_1_2_0_2 + 0.00831168831168824*G0_0_1_2_1_0 - 0.00484848484848471*G0_0_1_2_1_1 - 0.0711880711880708*G0_0_1_2_1_2 + 0.0242424242424241*G0_0_1_2_2_0 - 0.0711880711880708*G0_0_1_2_2_1 - 0.122366522366522*G0_0_1_2_2_2 - 0.0175468975468973*G0_1_0_0_0_0 - 0.0116209716209714*G0_1_0_0_0_1 - 0.0182395382395382*G0_1_0_0_0_2 - 0.0116209716209714*G0_1_0_0_1_0 - 0.0173160173160171*G0_1_0_0_1_1 - 0.00831168831168825*G0_1_0_0_1_2 - 0.0182395382395382*G0_1_0_0_2_0 - 0.00831168831168824*G0_1_0_0_2_1 - 0.0242424242424242*G0_1_0_0_2_2 - 0.0116209716209714*G0_1_0_1_0_0 - 0.0173160173160171*G0_1_0_1_0_1 - 0.00831168831168824*G0_1_0_1_0_2 - 0.0173160173160171*G0_1_0_1_1_0 - 0.0688023088023085*G0_1_0_1_1_1 + 0.00484848484848471*G0_1_0_1_1_2 - 0.00831168831168824*G0_1_0_1_2_0 + 0.0048484848484847*G0_1_0_1_2_1 + 0.0711880711880708*G0_1_0_1_2_2 - 0.0182395382395382*G0_1_0_2_0_0 - 0.00831168831168825*G0_1_0_2_0_1 - 0.0242424242424242*G0_1_0_2_0_2 - 0.00831168831168824*G0_1_0_2_1_0 + 0.00484848484848471*G0_1_0_2_1_1 + 0.0711880711880708*G0_1_0_2_1_2 - 0.0242424242424242*G0_1_0_2_2_0 + 0.0711880711880708*G0_1_0_2_2_1 + 0.122366522366522*G0_1_0_2_2_2; + A[199] = A[74] + 0.0464838864838864*G0_0_0_0_0_0 + 0.00831168831168831*G0_0_0_0_0_1 + 0.0874266474266471*G0_0_0_0_0_2 + 0.00831168831168831*G0_0_0_0_1_0 + 0.0218566618566618*G0_0_0_0_1_1 + 0.0341702741702741*G0_0_0_0_1_2 + 0.0874266474266471*G0_0_0_0_2_0 + 0.0341702741702741*G0_0_0_0_2_1 + 0.213641173641173*G0_0_0_0_2_2 + 0.00831168831168831*G0_0_0_1_0_0 + 0.0218566618566618*G0_0_0_1_0_1 + 0.0341702741702741*G0_0_0_1_0_2 + 0.0218566618566618*G0_0_0_1_1_0 + 0.146224146224146*G0_0_0_1_1_1 + 0.102818662818663*G0_0_0_1_1_2 + 0.0341702741702741*G0_0_0_1_2_0 + 0.102818662818663*G0_0_0_1_2_1 + 0.205021645021644*G0_0_0_1_2_2 + 0.0874266474266471*G0_0_0_2_0_0 + 0.0341702741702741*G0_0_0_2_0_1 + 0.213641173641173*G0_0_0_2_0_2 + 0.0341702741702741*G0_0_0_2_1_0 + 0.102818662818663*G0_0_0_2_1_1 + 0.205021645021644*G0_0_0_2_1_2 + 0.213641173641173*G0_0_0_2_2_0 + 0.205021645021644*G0_0_0_2_2_1 + 0.935834535834531*G0_0_0_2_2_2 - 0.00361712361712342*G0_0_1_0_0_1 + 0.00361712361712372*G0_0_1_0_0_2 - 0.00361712361712342*G0_0_1_0_1_0 - 0.00992784992784969*G0_0_1_0_1_1 + 0.00361712361712372*G0_0_1_0_2_0 + 0.0099278499278501*G0_0_1_0_2_2 - 0.00361712361712342*G0_0_1_1_0_0 - 0.0099278499278497*G0_0_1_1_0_1 - 0.00992784992784969*G0_0_1_1_1_0 - 0.164848484848484*G0_0_1_1_1_1 - 0.0656469456469452*G0_0_1_1_1_2 - 0.0656469456469452*G0_0_1_1_2_1 + 0.0656469456469456*G0_0_1_1_2_2 + 0.00361712361712372*G0_0_1_2_0_0 + 0.0099278499278501*G0_0_1_2_0_2 - 0.0656469456469453*G0_0_1_2_1_1 + 0.0656469456469456*G0_0_1_2_1_2 + 0.0099278499278501*G0_0_1_2_2_0 + 0.0656469456469455*G0_0_1_2_2_1 + 0.164848484848485*G0_0_1_2_2_2 - 0.0102356902356901*G0_1_0_0_0_1 + 0.0102356902356903*G0_1_0_0_0_2 - 0.0102356902356901*G0_1_0_0_1_0 - 0.0168542568542566*G0_1_0_0_1_1 + 0.0102356902356903*G0_1_0_0_2_0 + 0.016854256854257*G0_1_0_0_2_2 - 0.0102356902356901*G0_1_0_1_0_0 - 0.0168542568542566*G0_1_0_1_0_1 - 0.0168542568542566*G0_1_0_1_1_0 + 0.0263203463203475*G0_1_0_1_1_1 + 0.000692640692640981*G0_1_0_1_1_2 + 0.000692640692640981*G0_1_0_1_2_1 - 0.000692640692640439*G0_1_0_1_2_2 + 0.0102356902356903*G0_1_0_2_0_0 + 0.016854256854257*G0_1_0_2_0_2 + 0.000692640692640994*G0_1_0_2_1_1 - 0.000692640692640425*G0_1_0_2_1_2 + 0.016854256854257*G0_1_0_2_2_0 - 0.000692640692640425*G0_1_0_2_2_1 - 0.0263203463203446*G0_1_0_2_2_2 - 0.0464838864838859*G0_1_1_0_0_0 - 0.0874266474266469*G0_1_1_0_0_1 - 0.00831168831168821*G0_1_1_0_0_2 - 0.0874266474266469*G0_1_1_0_1_0 - 0.213641173641173*G0_1_1_0_1_1 - 0.034170274170274*G0_1_1_0_1_2 - 0.00831168831168821*G0_1_1_0_2_0 - 0.034170274170274*G0_1_1_0_2_1 - 0.0218566618566617*G0_1_1_0_2_2 - 0.0874266474266469*G0_1_1_1_0_0 - 0.213641173641173*G0_1_1_1_0_1 - 0.034170274170274*G0_1_1_1_0_2 - 0.213641173641173*G0_1_1_1_1_0 - 0.935834535834532*G0_1_1_1_1_1 - 0.205021645021644*G0_1_1_1_1_2 - 0.034170274170274*G0_1_1_1_2_0 - 0.205021645021644*G0_1_1_1_2_1 - 0.102818662818662*G0_1_1_1_2_2 - 0.00831168831168821*G0_1_1_2_0_0 - 0.034170274170274*G0_1_1_2_0_1 - 0.0218566618566617*G0_1_1_2_0_2 - 0.034170274170274*G0_1_1_2_1_0 - 0.205021645021644*G0_1_1_2_1_1 - 0.102818662818662*G0_1_1_2_1_2 - 0.0218566618566617*G0_1_1_2_2_0 - 0.102818662818662*G0_1_1_2_2_1 - 0.146224146224145*G0_1_1_2_2_2; + A[73] = A[199] - 0.0175468975468975*G0_0_1_0_0_0 - 0.0182395382395381*G0_0_1_0_0_1 - 0.0116209716209716*G0_0_1_0_0_2 - 0.0182395382395381*G0_0_1_0_1_0 - 0.024242424242424*G0_0_1_0_1_1 - 0.00831168831168827*G0_0_1_0_1_2 - 0.0116209716209716*G0_0_1_0_2_0 - 0.00831168831168827*G0_0_1_0_2_1 - 0.0173160173160172*G0_0_1_0_2_2 - 0.0182395382395381*G0_0_1_1_0_0 - 0.024242424242424*G0_0_1_1_0_1 - 0.00831168831168827*G0_0_1_1_0_2 - 0.024242424242424*G0_0_1_1_1_0 + 0.122366522366523*G0_0_1_1_1_1 + 0.071188071188071*G0_0_1_1_1_2 - 0.00831168831168827*G0_0_1_1_2_0 + 0.071188071188071*G0_0_1_1_2_1 + 0.00484848484848481*G0_0_1_1_2_2 - 0.0116209716209716*G0_0_1_2_0_0 - 0.00831168831168827*G0_0_1_2_0_1 - 0.0173160173160172*G0_0_1_2_0_2 - 0.00831168831168827*G0_0_1_2_1_0 + 0.071188071188071*G0_0_1_2_1_1 + 0.00484848484848482*G0_0_1_2_1_2 - 0.0173160173160172*G0_0_1_2_2_0 + 0.00484848484848484*G0_0_1_2_2_1 - 0.0688023088023078*G0_0_1_2_2_2 + 0.0175468975468975*G0_1_0_0_0_0 + 0.0182395382395381*G0_1_0_0_0_1 + 0.0116209716209716*G0_1_0_0_0_2 + 0.0182395382395381*G0_1_0_0_1_0 + 0.024242424242424*G0_1_0_0_1_1 + 0.00831168831168827*G0_1_0_0_1_2 + 0.0116209716209716*G0_1_0_0_2_0 + 0.00831168831168827*G0_1_0_0_2_1 + 0.0173160173160172*G0_1_0_0_2_2 + 0.0182395382395381*G0_1_0_1_0_0 + 0.024242424242424*G0_1_0_1_0_1 + 0.00831168831168827*G0_1_0_1_0_2 + 0.024242424242424*G0_1_0_1_1_0 - 0.122366522366523*G0_1_0_1_1_1 - 0.071188071188071*G0_1_0_1_1_2 + 0.00831168831168827*G0_1_0_1_2_0 - 0.071188071188071*G0_1_0_1_2_1 - 0.0048484848484848*G0_1_0_1_2_2 + 0.0116209716209716*G0_1_0_2_0_0 + 0.00831168831168827*G0_1_0_2_0_1 + 0.0173160173160172*G0_1_0_2_0_2 + 0.00831168831168827*G0_1_0_2_1_0 - 0.071188071188071*G0_1_0_2_1_1 - 0.00484848484848481*G0_1_0_2_1_2 + 0.0173160173160172*G0_1_0_2_2_0 - 0.00484848484848482*G0_1_0_2_2_1 + 0.0688023088023078*G0_1_0_2_2_2; + A[40] = -0.00237614237614229*G0_1_0_0_0_0 - 0.00253006253006251*G0_1_0_0_0_1 - 0.000314253647586969*G0_1_0_0_0_2 - 0.00253006253006251*G0_1_0_0_1_0 + 0.00253006253006254*G0_1_0_0_1_1 - 0.000314253647586969*G0_1_0_0_2_0 + 0.000420073753407072*G0_1_0_0_2_2 - 0.00253006253006251*G0_1_0_1_0_0 + 0.00253006253006254*G0_1_0_1_0_1 + 0.00253006253006254*G0_1_0_1_1_0 + 0.00237614237614231*G0_1_0_1_1_1 + 0.000314253647586988*G0_1_0_1_1_2 + 0.000314253647586988*G0_1_0_1_2_1 - 0.000420073753407092*G0_1_0_1_2_2 - 0.000314253647586968*G0_1_0_2_0_0 + 0.000420073753407073*G0_1_0_2_0_2 + 0.000314253647586988*G0_1_0_2_1_1 - 0.000420073753407092*G0_1_0_2_1_2 + 0.000420073753407073*G0_1_0_2_2_0 - 0.000420073753407092*G0_1_0_2_2_1 + 0.00338303671637008*G0_1_1_0_0_0 + 0.00635561968895301*G0_1_1_0_0_1 + 6.73400673400679e-05*G0_1_1_0_0_2 + 0.00635561968895301*G0_1_1_0_1_0 + 0.00888568221901554*G0_1_1_0_1_1 - 0.000497033830367159*G0_1_1_0_1_2 + 6.73400673400681e-05*G0_1_1_0_2_0 - 0.000497033830367159*G0_1_1_0_2_1 - 0.000663780663780657*G0_1_1_0_2_2 + 0.00635561968895301*G0_1_1_1_0_0 + 0.00888568221901554*G0_1_1_1_0_1 - 0.000497033830367159*G0_1_1_1_0_2 + 0.00888568221901554*G0_1_1_1_1_0 + 0.00575917909251233*G0_1_1_1_1_1 + 0.000381593714927055*G0_1_1_1_1_2 - 0.000497033830367159*G0_1_1_1_2_0 + 0.000381593714927054*G0_1_1_1_2_1 - 0.00108385441718773*G0_1_1_1_2_2 + 6.73400673400679e-05*G0_1_1_2_0_0 - 0.000497033830367159*G0_1_1_2_0_1 - 0.000663780663780657*G0_1_1_2_0_2 - 0.000497033830367159*G0_1_1_2_1_0 + 0.000381593714927055*G0_1_1_2_1_1 - 0.00108385441718773*G0_1_1_2_1_2 - 0.000663780663780657*G0_1_1_2_2_0 - 0.00108385441718773*G0_1_1_2_2_1 - 0.00565977232643889*G0_1_1_2_2_2; + A[145] = A[159] + 0.294757094757093*G0_0_1_0_0_0 + 0.129549462882795*G0_0_1_0_0_1 + 0.0271925605258937*G0_0_1_0_0_2 + 0.129549462882795*G0_0_1_0_1_0 + 0.0659547859547856*G0_0_1_0_1_1 + 0.0133140933140932*G0_0_1_0_1_2 + 0.0271925605258937*G0_0_1_0_2_0 + 0.0133140933140932*G0_0_1_0_2_1 + 0.00464325797659129*G0_0_1_0_2_2 + 0.129549462882795*G0_0_1_1_0_0 + 0.0659547859547856*G0_0_1_1_0_1 + 0.0133140933140932*G0_0_1_1_0_2 + 0.0659547859547856*G0_0_1_1_1_0 + 0.036325156325156*G0_0_1_1_1_1 + 0.00607984607984605*G0_0_1_1_1_2 + 0.0133140933140932*G0_0_1_1_2_0 + 0.00607984607984606*G0_0_1_1_2_1 + 0.00205226871893539*G0_0_1_1_2_2 + 0.0271925605258937*G0_0_1_2_0_0 + 0.0133140933140932*G0_0_1_2_0_1 + 0.0046432579765913*G0_0_1_2_0_2 + 0.0133140933140932*G0_0_1_2_1_0 + 0.00607984607984605*G0_0_1_2_1_1 + 0.00205226871893539*G0_0_1_2_1_2 + 0.0046432579765913*G0_0_1_2_2_0 + 0.00205226871893539*G0_0_1_2_2_1 - 0.294757094757093*G0_1_0_0_0_0 - 0.129549462882795*G0_1_0_0_0_1 - 0.0271925605258937*G0_1_0_0_0_2 - 0.129549462882795*G0_1_0_0_1_0 - 0.0659547859547856*G0_1_0_0_1_1 - 0.0133140933140932*G0_1_0_0_1_2 - 0.0271925605258937*G0_1_0_0_2_0 - 0.0133140933140932*G0_1_0_0_2_1 - 0.0046432579765913*G0_1_0_0_2_2 - 0.129549462882795*G0_1_0_1_0_0 - 0.0659547859547856*G0_1_0_1_0_1 - 0.0133140933140932*G0_1_0_1_0_2 - 0.0659547859547856*G0_1_0_1_1_0 - 0.036325156325156*G0_1_0_1_1_1 - 0.00607984607984606*G0_1_0_1_1_2 - 0.0133140933140932*G0_1_0_1_2_0 - 0.00607984607984606*G0_1_0_1_2_1 - 0.00205226871893539*G0_1_0_1_2_2 - 0.0271925605258937*G0_1_0_2_0_0 - 0.0133140933140932*G0_1_0_2_0_1 - 0.0046432579765913*G0_1_0_2_0_2 - 0.0133140933140932*G0_1_0_2_1_0 - 0.00607984607984605*G0_1_0_2_1_1 - 0.00205226871893539*G0_1_0_2_1_2 - 0.0046432579765913*G0_1_0_2_2_0 - 0.00205226871893539*G0_1_0_2_2_1; + A[151] = -A[61] + 0.065929132595799*G0_0_0_0_0_0 + 0.00727914061247393*G0_0_0_0_0_1 + 0.015751162417829*G0_0_0_0_0_2 + 0.00727914061247393*G0_0_0_0_1_0 + 0.00224466891133563*G0_0_0_0_1_1 + 0.00299823633156966*G0_0_0_0_1_2 + 0.015751162417829*G0_0_0_0_2_0 + 0.00299823633156966*G0_0_0_0_2_1 + 0.0155715889049222*G0_0_0_0_2_2 + 0.00727914061247393*G0_0_0_1_0_0 + 0.00224466891133563*G0_0_0_1_0_1 + 0.00299823633156966*G0_0_0_1_0_2 + 0.00224466891133563*G0_0_0_1_1_0 + 0.181080647747314*G0_0_0_1_1_1 + 0.0131473464806798*G0_0_0_1_1_2 + 0.00299823633156966*G0_0_0_1_2_0 + 0.0131473464806798*G0_0_0_1_2_1 + 0.00625300625300621*G0_0_0_1_2_2 + 0.015751162417829*G0_0_0_2_0_0 + 0.00299823633156966*G0_0_0_2_0_1 + 0.0155715889049222*G0_0_0_2_0_2 + 0.00299823633156966*G0_0_0_2_1_0 + 0.0131473464806798*G0_0_0_2_1_1 + 0.00625300625300621*G0_0_0_2_1_2 + 0.0155715889049221*G0_0_0_2_2_0 + 0.00625300625300621*G0_0_0_2_2_1 + 0.0643129709796372*G0_0_0_2_2_2 + 0.00161616161616161*G0_1_0_0_0_0 + 0.0010261343594677*G0_1_0_0_0_1 + 0.000179573512906848*G0_1_0_0_0_2 + 0.0010261343594677*G0_1_0_0_1_0 - 0.0109026775693442*G0_1_0_0_1_1 + 0.000179573512906848*G0_1_0_0_2_0 - 0.000179573512906848*G0_1_0_0_2_2 + 0.0010261343594677*G0_1_0_1_0_0 - 0.0109026775693442*G0_1_0_1_0_1 - 0.0109026775693442*G0_1_0_1_1_0 + 0.0109026775693441*G0_1_0_1_1_2 + 0.0109026775693441*G0_1_0_1_2_1 - 0.0010261343594677*G0_1_0_1_2_2 + 0.000179573512906848*G0_1_0_2_0_0 - 0.000179573512906849*G0_1_0_2_0_2 + 0.0109026775693441*G0_1_0_2_1_1 - 0.00102613435946769*G0_1_0_2_1_2 - 0.000179573512906848*G0_1_0_2_2_0 - 0.0010261343594677*G0_1_0_2_2_1 - 0.00161616161616164*G0_1_0_2_2_2; + A[102] = A[186] - 0.206253006253004*G0_0_1_0_0_0 - 0.0415584415584411*G0_0_1_0_0_1 + 0.0672118005451337*G0_0_1_0_0_2 - 0.0415584415584411*G0_0_1_0_1_0 - 0.0161103094436426*G0_0_1_0_1_1 + 0.00123136123136125*G0_0_1_0_1_2 + 0.0672118005451337*G0_0_1_0_2_0 + 0.00123136123136125*G0_0_1_0_2_1 + 0.0557190957190955*G0_0_1_0_2_2 - 0.0415584415584411*G0_0_1_1_0_0 - 0.0161103094436426*G0_0_1_1_0_1 + 0.00123136123136125*G0_0_1_1_0_2 - 0.0161103094436426*G0_0_1_1_1_0 - 0.0116979316979318*G0_0_1_1_1_1 - 0.00379669713003053*G0_0_1_1_1_2 + 0.00123136123136125*G0_0_1_1_2_0 - 0.00379669713003053*G0_0_1_1_2_1 + 0.000307840307840229*G0_0_1_1_2_2 + 0.0672118005451337*G0_0_1_2_0_0 + 0.00123136123136125*G0_0_1_2_0_1 + 0.0557190957190955*G0_0_1_2_0_2 + 0.00123136123136125*G0_0_1_2_1_0 - 0.00379669713003053*G0_0_1_2_1_1 + 0.000307840307840243*G0_0_1_2_1_2 + 0.0557190957190955*G0_0_1_2_2_0 + 0.000307840307840229*G0_0_1_2_2_1 + 0.025242905242905*G0_0_1_2_2_2 + 0.206253006253004*G0_1_0_0_0_0 + 0.0415584415584411*G0_1_0_0_0_1 - 0.0672118005451337*G0_1_0_0_0_2 + 0.0415584415584411*G0_1_0_0_1_0 + 0.0161103094436426*G0_1_0_0_1_1 - 0.00123136123136125*G0_1_0_0_1_2 - 0.0672118005451337*G0_1_0_0_2_0 - 0.00123136123136125*G0_1_0_0_2_1 - 0.0557190957190954*G0_1_0_0_2_2 + 0.0415584415584411*G0_1_0_1_0_0 + 0.0161103094436426*G0_1_0_1_0_1 - 0.00123136123136125*G0_1_0_1_0_2 + 0.0161103094436426*G0_1_0_1_1_0 + 0.0116979316979318*G0_1_0_1_1_1 + 0.00379669713003052*G0_1_0_1_1_2 - 0.00123136123136125*G0_1_0_1_2_0 + 0.00379669713003053*G0_1_0_1_2_1 - 0.000307840307840236*G0_1_0_1_2_2 - 0.0672118005451337*G0_1_0_2_0_0 - 0.00123136123136125*G0_1_0_2_0_1 - 0.0557190957190954*G0_1_0_2_0_2 - 0.00123136123136125*G0_1_0_2_1_0 + 0.00379669713003052*G0_1_0_2_1_1 - 0.000307840307840236*G0_1_0_2_1_2 - 0.0557190957190954*G0_1_0_2_2_0 - 0.000307840307840236*G0_1_0_2_2_1 - 0.025242905242905*G0_1_0_2_2_2; + A[189] = A[102] + 1.0702581369248*G0_0_0_0_0_0 + 0.0636203302869966*G0_0_0_0_0_1 + 0.265768799102131*G0_0_0_0_0_2 + 0.0636203302869966*G0_0_0_0_1_0 + 0.00246272246272244*G0_0_0_0_1_1 + 0.0174442841109507*G0_0_0_0_1_2 + 0.265768799102131*G0_0_0_0_2_0 + 0.0174442841109507*G0_0_0_0_2_1 + 0.10733365400032*G0_0_0_0_2_2 + 0.0636203302869966*G0_0_0_1_0_0 + 0.00246272246272244*G0_0_0_1_0_1 + 0.0174442841109507*G0_0_0_1_0_2 + 0.00246272246272244*G0_0_0_1_1_0 - 0.0822959756293085*G0_0_0_1_1_1 - 0.0104665704665703*G0_0_0_1_1_2 + 0.0174442841109507*G0_0_0_1_2_0 - 0.0104665704665703*G0_0_0_1_2_1 + 0.0223697290363957*G0_0_0_1_2_2 + 0.265768799102131*G0_0_0_2_0_0 + 0.0174442841109507*G0_0_0_2_0_1 + 0.10733365400032*G0_0_0_2_0_2 + 0.0174442841109507*G0_0_0_2_1_0 - 0.0104665704665703*G0_0_0_2_1_1 + 0.0223697290363957*G0_0_0_2_1_2 + 0.10733365400032*G0_0_0_2_2_0 + 0.0223697290363957*G0_0_0_2_2_1 + 0.127651114317781*G0_0_0_2_2_2 + 0.0220618887285551*G0_0_1_0_0_1 - 0.0220618887285554*G0_0_1_0_0_2 + 0.0220618887285551*G0_0_1_0_1_0 + 0.00502805836139159*G0_0_1_0_1_1 - 0.0220618887285554*G0_0_1_0_2_0 - 0.00502805836139166*G0_0_1_0_2_2 + 0.0220618887285551*G0_0_1_1_0_0 + 0.00502805836139159*G0_0_1_1_0_1 + 0.00502805836139158*G0_0_1_1_1_0 - 0.0855796055796051*G0_0_1_1_1_1 - 0.0142632675966008*G0_0_1_1_1_2 - 0.0142632675966008*G0_0_1_1_2_1 + 0.0142632675966009*G0_0_1_1_2_2 - 0.0220618887285554*G0_0_1_2_0_0 - 0.00502805836139166*G0_0_1_2_0_2 - 0.0142632675966008*G0_0_1_2_1_1 + 0.0142632675966009*G0_0_1_2_1_2 - 0.00502805836139166*G0_0_1_2_2_0 + 0.0142632675966009*G0_0_1_2_2_1 + 0.0855796055796052*G0_0_1_2_2_2 - 0.0867083533750194*G0_1_0_0_0_1 + 0.0867083533750198*G0_1_0_0_0_2 - 0.0867083533750194*G0_1_0_0_1_0 - 0.0668013468013464*G0_1_0_0_1_1 + 0.0867083533750198*G0_1_0_0_2_0 + 0.0668013468013465*G0_1_0_0_2_2 - 0.0867083533750194*G0_1_0_1_0_0 - 0.0668013468013464*G0_1_0_1_0_1 - 0.0668013468013464*G0_1_0_1_1_0 - 0.122520442520442*G0_1_0_1_1_1 - 0.0183678050344716*G0_1_0_1_1_2 - 0.0183678050344716*G0_1_0_1_2_1 + 0.0183678050344716*G0_1_0_1_2_2 + 0.0867083533750198*G0_1_0_2_0_0 + 0.0668013468013465*G0_1_0_2_0_2 - 0.0183678050344716*G0_1_0_2_1_1 + 0.0183678050344716*G0_1_0_2_1_2 + 0.0668013468013465*G0_1_0_2_2_0 + 0.0183678050344716*G0_1_0_2_2_1 + 0.122520442520442*G0_1_0_2_2_2 - 1.0702581369248*G0_1_1_0_0_0 - 0.265768799102131*G0_1_1_0_0_1 - 0.0636203302869966*G0_1_1_0_0_2 - 0.265768799102131*G0_1_1_0_1_0 - 0.10733365400032*G0_1_1_0_1_1 - 0.0174442841109507*G0_1_1_0_1_2 - 0.0636203302869966*G0_1_1_0_2_0 - 0.0174442841109507*G0_1_1_0_2_1 - 0.00246272246272243*G0_1_1_0_2_2 - 0.265768799102131*G0_1_1_1_0_0 - 0.10733365400032*G0_1_1_1_0_1 - 0.0174442841109507*G0_1_1_1_0_2 - 0.10733365400032*G0_1_1_1_1_0 - 0.12765111431778*G0_1_1_1_1_1 - 0.0223697290363956*G0_1_1_1_1_2 - 0.0174442841109507*G0_1_1_1_2_0 - 0.0223697290363957*G0_1_1_1_2_1 + 0.0104665704665703*G0_1_1_1_2_2 - 0.0636203302869966*G0_1_1_2_0_0 - 0.0174442841109507*G0_1_1_2_0_1 - 0.00246272246272243*G0_1_1_2_0_2 - 0.0174442841109507*G0_1_1_2_1_0 - 0.0223697290363957*G0_1_1_2_1_1 + 0.0104665704665704*G0_1_1_2_1_2 - 0.00246272246272243*G0_1_1_2_2_0 + 0.0104665704665703*G0_1_1_2_2_1 + 0.0822959756293086*G0_1_1_2_2_2; + A[147] = A[189] + 0.206253006253006*G0_0_1_0_0_0 - 0.0672118005451334*G0_0_1_0_0_1 + 0.0415584415584415*G0_0_1_0_0_2 - 0.0672118005451334*G0_0_1_0_1_0 - 0.0557190957190953*G0_0_1_0_1_1 - 0.0012313612313612*G0_0_1_0_1_2 + 0.0415584415584415*G0_0_1_0_2_0 - 0.0012313612313612*G0_0_1_0_2_1 + 0.0161103094436427*G0_0_1_0_2_2 - 0.0672118005451334*G0_0_1_1_0_0 - 0.0557190957190953*G0_0_1_1_0_1 - 0.0012313612313612*G0_0_1_1_0_2 - 0.0557190957190953*G0_0_1_1_1_0 - 0.0252429052429049*G0_0_1_1_1_1 - 0.000307840307840257*G0_0_1_1_1_2 - 0.0012313612313612*G0_0_1_1_2_0 - 0.00030784030784025*G0_0_1_1_2_1 + 0.00379669713003052*G0_0_1_1_2_2 + 0.0415584415584415*G0_0_1_2_0_0 - 0.0012313612313612*G0_0_1_2_0_1 + 0.0161103094436427*G0_0_1_2_0_2 - 0.0012313612313612*G0_0_1_2_1_0 - 0.000307840307840243*G0_0_1_2_1_1 + 0.00379669713003053*G0_0_1_2_1_2 + 0.0161103094436427*G0_0_1_2_2_0 + 0.00379669713003053*G0_0_1_2_2_1 + 0.0116979316979318*G0_0_1_2_2_2 - 0.206253006253006*G0_1_0_0_0_0 + 0.0672118005451334*G0_1_0_0_0_1 - 0.0415584415584415*G0_1_0_0_0_2 + 0.0672118005451334*G0_1_0_0_1_0 + 0.0557190957190953*G0_1_0_0_1_1 + 0.0012313612313612*G0_1_0_0_1_2 - 0.0415584415584415*G0_1_0_0_2_0 + 0.0012313612313612*G0_1_0_0_2_1 - 0.0161103094436427*G0_1_0_0_2_2 + 0.0672118005451334*G0_1_0_1_0_0 + 0.0557190957190953*G0_1_0_1_0_1 + 0.0012313612313612*G0_1_0_1_0_2 + 0.0557190957190953*G0_1_0_1_1_0 + 0.025242905242905*G0_1_0_1_1_1 + 0.000307840307840257*G0_1_0_1_1_2 + 0.00123136123136119*G0_1_0_1_2_0 + 0.000307840307840243*G0_1_0_1_2_1 - 0.00379669713003053*G0_1_0_1_2_2 - 0.0415584415584415*G0_1_0_2_0_0 + 0.0012313612313612*G0_1_0_2_0_1 - 0.0161103094436427*G0_1_0_2_0_2 + 0.00123136123136119*G0_1_0_2_1_0 + 0.000307840307840243*G0_1_0_2_1_1 - 0.00379669713003053*G0_1_0_2_1_2 - 0.0161103094436428*G0_1_0_2_2_0 - 0.00379669713003053*G0_1_0_2_2_1 - 0.0116979316979318*G0_1_0_2_2_2; + A[177] = -A[57] + 0.30866121532788*G0_0_0_0_0_0 - 0.008003848003848*G0_0_0_0_0_1 + 0.114721821388487*G0_0_0_0_0_2 - 0.008003848003848*G0_0_0_0_1_0 - 0.0391983325316657*G0_0_0_0_1_1 + 0.0043097643097643*G0_0_0_0_1_2 + 0.114721821388487*G0_0_0_0_2_0 + 0.0043097643097643*G0_0_0_0_2_1 + 0.0728555395222058*G0_0_0_0_2_2 - 0.008003848003848*G0_0_0_1_0_0 - 0.0391983325316657*G0_0_0_1_0_1 + 0.0043097643097643*G0_0_0_1_0_2 - 0.0391983325316657*G0_0_0_1_1_0 - 0.0348885682219018*G0_0_0_1_1_1 + 0.0289369889369888*G0_0_0_1_1_2 + 0.0043097643097643*G0_0_0_1_2_0 + 0.0289369889369888*G0_0_0_1_2_1 + 0.0322206188872854*G0_0_0_1_2_2 + 0.114721821388487*G0_0_0_2_0_0 + 0.0043097643097643*G0_0_0_2_0_1 + 0.0728555395222058*G0_0_0_2_0_2 + 0.0043097643097643*G0_0_0_2_1_0 + 0.0289369889369888*G0_0_0_2_1_1 + 0.0322206188872855*G0_0_0_2_1_2 + 0.0728555395222058*G0_0_0_2_2_0 + 0.0322206188872854*G0_0_0_2_2_1 + 0.0439185505852173*G0_0_0_2_2_2 - 0.0652621452621445*G0_0_1_0_0_0 - 0.0250376783710115*G0_0_1_0_0_1 + 0.00451499118165792*G0_0_1_0_0_2 - 0.0250376783710115*G0_0_1_0_1_0 - 0.0205226871893537*G0_0_1_0_1_1 + 0.000410453743787107*G0_0_1_0_1_2 + 0.00451499118165792*G0_0_1_0_2_0 + 0.000410453743787106*G0_0_1_0_2_1 + 0.0131345198011865*G0_0_1_0_2_2 - 0.0250376783710115*G0_0_1_1_0_0 - 0.0205226871893537*G0_0_1_1_0_1 + 0.000410453743787107*G0_0_1_1_0_2 - 0.0205226871893537*G0_0_1_1_1_0 + 0.0205226871893538*G0_0_1_1_1_2 + 0.000410453743787106*G0_0_1_1_2_0 + 0.0205226871893538*G0_0_1_1_2_1 + 0.0242167708834375*G0_0_1_1_2_2 + 0.00451499118165792*G0_0_1_2_0_0 + 0.000410453743787107*G0_0_1_2_0_1 + 0.0131345198011865*G0_0_1_2_0_2 + 0.000410453743787108*G0_0_1_2_1_0 + 0.0205226871893538*G0_0_1_2_1_1 + 0.0242167708834375*G0_0_1_2_1_2 + 0.0131345198011865*G0_0_1_2_2_0 + 0.0242167708834375*G0_0_1_2_2_1 + 0.0123136123136124*G0_0_1_2_2_2; + A[114] = A[142] + 0.174699374699374*G0_0_1_0_0_0 - 0.0200096200096199*G0_0_1_0_0_1 - 0.0135962802629468*G0_0_1_0_0_2 - 0.0200096200096199*G0_0_1_0_1_0 - 0.0138784672118005*G0_0_1_0_1_1 - 0.0135962802629468*G0_0_1_0_2_0 - 0.00336059002725668*G0_0_1_0_2_2 - 0.0200096200096199*G0_0_1_1_0_0 - 0.0138784672118005*G0_0_1_1_0_1 - 0.0138784672118005*G0_0_1_1_1_0 - 0.00892736892736887*G0_0_1_1_1_1 - 0.000897867564534255*G0_0_1_1_1_2 - 0.000897867564534251*G0_0_1_1_2_1 - 0.000820907487574206*G0_0_1_1_2_2 - 0.0135962802629468*G0_0_1_2_0_0 - 0.00336059002725668*G0_0_1_2_0_2 - 0.000897867564534253*G0_0_1_2_1_1 - 0.000820907487574206*G0_0_1_2_1_2 - 0.00336059002725668*G0_0_1_2_2_0 - 0.000820907487574206*G0_0_1_2_2_1 - 0.00823472823472839*G0_0_1_2_2_2 - 0.174699374699374*G0_1_0_0_0_0 + 0.0200096200096199*G0_1_0_0_0_1 + 0.0135962802629468*G0_1_0_0_0_2 + 0.0200096200096199*G0_1_0_0_1_0 + 0.0138784672118005*G0_1_0_0_1_1 + 0.0135962802629468*G0_1_0_0_2_0 + 0.00336059002725668*G0_1_0_0_2_2 + 0.0200096200096199*G0_1_0_1_0_0 + 0.0138784672118005*G0_1_0_1_0_1 + 0.0138784672118005*G0_1_0_1_1_0 + 0.00892736892736887*G0_1_0_1_1_1 + 0.000897867564534255*G0_1_0_1_1_2 + 0.000897867564534253*G0_1_0_1_2_1 + 0.000820907487574206*G0_1_0_1_2_2 + 0.0135962802629468*G0_1_0_2_0_0 + 0.00336059002725668*G0_1_0_2_0_2 + 0.000897867564534255*G0_1_0_2_1_1 + 0.000820907487574206*G0_1_0_2_1_2 + 0.00336059002725668*G0_1_0_2_2_0 + 0.000820907487574206*G0_1_0_2_2_1 + 0.00823472823472839*G0_1_0_2_2_2; + A[221] = -A[213] + 0.0316049382716046*G0_0_0_0_0_0 + 0.00800384800384795*G0_0_0_0_0_1 + 0.0597210197210194*G0_0_0_0_0_2 + 0.00800384800384795*G0_0_0_0_1_0 + 0.00841430174763499*G0_0_0_0_1_1 + 0.00389931056597721*G0_0_0_0_1_2 + 0.0597210197210194*G0_0_0_0_2_0 + 0.00389931056597721*G0_0_0_0_2_1 + 0.11020683020683*G0_0_0_0_2_2 + 0.00800384800384795*G0_0_0_1_0_0 + 0.00841430174763499*G0_0_0_1_0_1 + 0.00389931056597721*G0_0_0_1_0_2 + 0.00841430174763498*G0_0_0_1_1_0 - 0.0348885682219018*G0_0_0_1_1_1 - 0.018675645342312*G0_0_0_1_1_2 + 0.00389931056597721*G0_0_0_1_2_0 - 0.018675645342312*G0_0_0_1_2_1 + 0.0170338303671636*G0_0_0_1_2_2 + 0.0597210197210194*G0_0_0_2_0_0 + 0.00389931056597721*G0_0_0_2_0_1 + 0.11020683020683*G0_0_0_2_0_2 + 0.00389931056597721*G0_0_0_2_1_0 - 0.018675645342312*G0_0_0_2_1_1 + 0.0170338303671636*G0_0_0_2_1_2 + 0.11020683020683*G0_0_0_2_2_0 + 0.0170338303671636*G0_0_0_2_2_1 + 0.373923360590025*G0_0_0_2_2_2 - 0.0123136123136127*G0_1_0_0_0_0 - 0.0242167708834375*G0_1_0_0_0_1 - 0.0131345198011865*G0_1_0_0_0_2 - 0.0242167708834375*G0_1_0_0_1_0 - 0.0205226871893537*G0_1_0_0_1_1 - 0.000410453743787069*G0_1_0_0_1_2 - 0.0131345198011865*G0_1_0_0_2_0 - 0.000410453743787069*G0_1_0_0_2_1 - 0.00451499118165783*G0_1_0_0_2_2 - 0.0242167708834375*G0_1_0_1_0_0 - 0.0205226871893537*G0_1_0_1_0_1 - 0.00041045374378707*G0_1_0_1_0_2 - 0.0205226871893537*G0_1_0_1_1_0 + 0.0205226871893539*G0_1_0_1_1_2 - 0.000410453743787067*G0_1_0_1_2_0 + 0.0205226871893539*G0_1_0_1_2_1 + 0.0250376783710116*G0_1_0_1_2_2 - 0.0131345198011865*G0_1_0_2_0_0 - 0.000410453743787071*G0_1_0_2_0_1 - 0.00451499118165783*G0_1_0_2_0_2 - 0.00041045374378707*G0_1_0_2_1_0 + 0.0205226871893539*G0_1_0_2_1_1 + 0.0250376783710116*G0_1_0_2_1_2 - 0.00451499118165783*G0_1_0_2_2_0 + 0.0250376783710116*G0_1_0_2_2_1 + 0.0652621452621452*G0_1_0_2_2_2; + A[133] = A[221] - 0.0051306717973383*G0_0_0_0_0_0 - 0.00697771364438025*G0_0_0_0_0_1 - 0.0149815616482282*G0_0_0_0_0_2 - 0.00697771364438025*G0_0_0_0_1_0 - 0.00287317620650948*G0_0_0_0_1_1 - 0.00143658810325475*G0_0_0_0_1_2 - 0.0149815616482282*G0_0_0_0_2_0 - 0.00143658810325475*G0_0_0_0_2_1 - 0.0129292929292927*G0_0_0_0_2_2 - 0.00697771364438025*G0_0_0_1_0_0 - 0.00287317620650948*G0_0_0_1_0_1 - 0.00143658810325475*G0_0_0_1_0_2 - 0.00287317620650948*G0_0_0_1_1_0 + 0.0872214205547536*G0_0_0_1_1_1 + 0.00595157928491267*G0_0_0_1_1_2 - 0.00143658810325475*G0_0_0_1_2_0 + 0.00595157928491267*G0_0_0_1_2_1 - 0.0158024691358022*G0_0_0_1_2_2 - 0.0149815616482282*G0_0_0_2_0_0 - 0.00143658810325475*G0_0_0_2_0_1 - 0.0129292929292927*G0_0_0_2_0_2 - 0.00143658810325475*G0_0_0_2_1_0 + 0.00595157928491267*G0_0_0_2_1_1 - 0.0158024691358022*G0_0_0_2_1_2 - 0.0129292929292927*G0_0_0_2_2_0 - 0.0158024691358022*G0_0_0_2_2_1 - 0.0660830527497177*G0_0_0_2_2_2 - 0.00174442841109501*G0_0_1_0_0_1 + 0.00174442841109508*G0_0_1_0_0_2 - 0.00174442841109501*G0_0_1_0_1_0 + 0.00625941959275302*G0_0_1_0_1_1 + 0.00174442841109508*G0_0_1_0_2_0 - 0.00625941959275279*G0_0_1_0_2_2 - 0.00174442841109501*G0_0_1_1_0_0 + 0.00625941959275302*G0_0_1_1_0_1 + 0.00625941959275302*G0_0_1_1_1_0 + 0.136065416065416*G0_0_1_1_1_1 + 0.0111848645181978*G0_0_1_1_1_2 + 0.0111848645181978*G0_0_1_1_2_1 - 0.0111848645181977*G0_0_1_1_2_2 + 0.00174442841109508*G0_0_1_2_0_0 - 0.00625941959275279*G0_0_1_2_0_2 + 0.0111848645181978*G0_0_1_2_1_1 - 0.0111848645181977*G0_0_1_2_1_2 - 0.00625941959275279*G0_0_1_2_2_0 - 0.0111848645181977*G0_0_1_2_2_1 - 0.136065416065414*G0_0_1_2_2_2 + 0.0126214526214525*G0_1_0_0_0_1 - 0.0126214526214527*G0_1_0_0_0_2 + 0.0126214526214525*G0_1_0_0_1_0 + 0.0280134680134679*G0_1_0_0_1_1 - 0.0126214526214527*G0_1_0_0_2_0 - 0.028013468013468*G0_1_0_0_2_2 + 0.0126214526214525*G0_1_0_1_0_0 + 0.0280134680134678*G0_1_0_1_0_1 + 0.0280134680134678*G0_1_0_1_1_0 + 0.107744107744107*G0_1_0_1_1_1 + 0.00420715087381764*G0_1_0_1_1_2 + 0.00420715087381764*G0_1_0_1_2_1 - 0.00420715087381738*G0_1_0_1_2_2 - 0.0126214526214527*G0_1_0_2_0_0 - 0.028013468013468*G0_1_0_2_0_2 + 0.00420715087381764*G0_1_0_2_1_1 - 0.00420715087381738*G0_1_0_2_1_2 - 0.028013468013468*G0_1_0_2_2_0 - 0.00420715087381738*G0_1_0_2_2_1 - 0.107744107744107*G0_1_0_2_2_2 + 0.00513067179733854*G0_1_1_0_0_0 + 0.0149815616482282*G0_1_1_0_0_1 + 0.00697771364438022*G0_1_1_0_0_2 + 0.0149815616482282*G0_1_1_0_1_0 + 0.0129292929292928*G0_1_1_0_1_1 + 0.00143658810325473*G0_1_1_0_1_2 + 0.00697771364438022*G0_1_1_0_2_0 + 0.00143658810325473*G0_1_1_0_2_1 + 0.00287317620650949*G0_1_1_0_2_2 + 0.0149815616482282*G0_1_1_1_0_0 + 0.0129292929292928*G0_1_1_1_0_1 + 0.00143658810325473*G0_1_1_1_0_2 + 0.0129292929292928*G0_1_1_1_1_0 + 0.0660830527497191*G0_1_1_1_1_1 + 0.0158024691358025*G0_1_1_1_1_2 + 0.00143658810325473*G0_1_1_1_2_0 + 0.0158024691358025*G0_1_1_1_2_1 - 0.0059515792849125*G0_1_1_1_2_2 + 0.00697771364438022*G0_1_1_2_0_0 + 0.00143658810325473*G0_1_1_2_0_1 + 0.00287317620650949*G0_1_1_2_0_2 + 0.00143658810325473*G0_1_1_2_1_0 + 0.0158024691358025*G0_1_1_2_1_1 - 0.0059515792849125*G0_1_1_2_1_2 + 0.00287317620650949*G0_1_1_2_2_0 - 0.0059515792849125*G0_1_1_2_2_1 - 0.0872214205547525*G0_1_1_2_2_2; + A[88] = -A[133] - 0.0123136123136127*G0_1_0_0_0_0 - 0.0131345198011865*G0_1_0_0_0_1 - 0.0242167708834376*G0_1_0_0_0_2 - 0.0131345198011865*G0_1_0_0_1_0 - 0.00451499118165788*G0_1_0_0_1_1 - 0.000410453743787077*G0_1_0_0_1_2 - 0.0242167708834376*G0_1_0_0_2_0 - 0.000410453743787077*G0_1_0_0_2_1 - 0.020522687189354*G0_1_0_0_2_2 - 0.0131345198011865*G0_1_0_1_0_0 - 0.00451499118165788*G0_1_0_1_0_1 - 0.000410453743787077*G0_1_0_1_0_2 - 0.00451499118165788*G0_1_0_1_1_0 + 0.065262145262145*G0_1_0_1_1_1 + 0.0250376783710118*G0_1_0_1_1_2 - 0.000410453743787078*G0_1_0_1_2_0 + 0.0250376783710118*G0_1_0_1_2_1 + 0.0205226871893539*G0_1_0_1_2_2 - 0.0242167708834376*G0_1_0_2_0_0 - 0.000410453743787077*G0_1_0_2_0_1 - 0.020522687189354*G0_1_0_2_0_2 - 0.000410453743787078*G0_1_0_2_1_0 + 0.0250376783710118*G0_1_0_2_1_1 + 0.0205226871893539*G0_1_0_2_1_2 - 0.020522687189354*G0_1_0_2_2_0 + 0.0205226871893539*G0_1_0_2_2_1 + 0.031604938271605*G0_1_1_0_0_0 + 0.0597210197210194*G0_1_1_0_0_1 + 0.00800384800384793*G0_1_1_0_0_2 + 0.0597210197210194*G0_1_1_0_1_0 + 0.11020683020683*G0_1_1_0_1_1 + 0.00389931056597719*G0_1_1_0_1_2 + 0.00800384800384793*G0_1_1_0_2_0 + 0.00389931056597719*G0_1_1_0_2_1 + 0.00841430174763497*G0_1_1_0_2_2 + 0.0597210197210194*G0_1_1_1_0_0 + 0.11020683020683*G0_1_1_1_0_1 + 0.00389931056597719*G0_1_1_1_0_2 + 0.11020683020683*G0_1_1_1_1_0 + 0.373923360590026*G0_1_1_1_1_1 + 0.0170338303671637*G0_1_1_1_1_2 + 0.00389931056597719*G0_1_1_1_2_0 + 0.0170338303671637*G0_1_1_1_2_1 - 0.0186756453423119*G0_1_1_1_2_2 + 0.00800384800384793*G0_1_1_2_0_0 + 0.00389931056597719*G0_1_1_2_0_1 + 0.00841430174763497*G0_1_1_2_0_2 + 0.00389931056597719*G0_1_1_2_1_0 + 0.0170338303671637*G0_1_1_2_1_1 - 0.0186756453423119*G0_1_1_2_1_2 + 0.00841430174763497*G0_1_1_2_2_0 - 0.0186756453423119*G0_1_1_2_2_1 - 0.0348885682219011*G0_1_1_2_2_2; + A[193] = -A[88] - 0.420202020202018*G0_0_0_0_0_0 - 0.0803463203463201*G0_0_0_0_0_1 - 0.208305274971941*G0_0_0_0_0_2 - 0.0803463203463201*G0_0_0_0_1_0 - 0.0813724547057878*G0_0_0_0_1_1 - 0.0640307840307838*G0_0_0_0_1_2 - 0.208305274971941*G0_0_0_0_2_0 - 0.0640307840307838*G0_0_0_0_2_1 - 0.170133076799743*G0_0_0_0_2_2 - 0.0803463203463201*G0_0_0_1_0_0 - 0.0813724547057878*G0_0_0_1_0_1 - 0.0640307840307838*G0_0_0_1_0_2 - 0.0813724547057878*G0_0_0_1_1_0 - 0.429437229437227*G0_0_0_1_1_1 - 0.198043931377264*G0_0_0_1_1_2 - 0.0640307840307838*G0_0_0_1_2_0 - 0.198043931377264*G0_0_0_1_2_1 - 0.135244508577841*G0_0_0_1_2_2 - 0.208305274971941*G0_0_0_2_0_0 - 0.0640307840307838*G0_0_0_2_0_1 - 0.170133076799743*G0_0_0_2_0_2 - 0.0640307840307838*G0_0_0_2_1_0 - 0.198043931377264*G0_0_0_2_1_1 - 0.135244508577841*G0_0_0_2_1_2 - 0.170133076799743*G0_0_0_2_2_0 - 0.135244508577841*G0_0_0_2_2_1 - 0.20933140933141*G0_0_0_2_2_2 - 0.122007375340708*G0_0_1_0_0_0 - 0.0475100208433541*G0_0_1_0_0_1 - 0.0246272246272246*G0_0_1_0_0_2 - 0.0475100208433541*G0_0_1_0_1_0 - 0.064030784030784*G0_0_1_0_1_1 - 0.0148789482122815*G0_0_1_0_1_2 - 0.0246272246272246*G0_0_1_0_2_0 - 0.0148789482122815*G0_0_1_0_2_1 - 0.00112874779541464*G0_0_1_0_2_2 - 0.0475100208433541*G0_0_1_1_0_0 - 0.064030784030784*G0_0_1_1_0_1 - 0.0148789482122815*G0_0_1_1_0_2 - 0.064030784030784*G0_0_1_1_1_0 - 0.415994869328201*G0_0_1_1_1_1 - 0.156588103254769*G0_0_1_1_1_2 - 0.0148789482122815*G0_0_1_1_2_0 - 0.156588103254769*G0_0_1_1_2_1 - 0.0813724547057876*G0_0_1_1_2_2 - 0.0246272246272246*G0_0_1_2_0_0 - 0.0148789482122815*G0_0_1_2_0_1 - 0.00112874779541464*G0_0_1_2_0_2 - 0.0148789482122815*G0_0_1_2_1_0 - 0.156588103254769*G0_0_1_2_1_1 - 0.0813724547057876*G0_0_1_2_1_2 - 0.00112874779541464*G0_0_1_2_2_0 - 0.0813724547057876*G0_0_1_2_2_1 + 0.0599262465929114*G0_0_1_2_2_2 + 0.00297578964245559*G0_1_0_0_0_0 - 0.0145711079044415*G0_1_0_0_0_1 - 0.0425845759179092*G0_1_0_0_0_2 - 0.0145711079044415*G0_1_0_0_1_0 - 0.0294500561167229*G0_1_0_0_1_1 - 0.0440211640211639*G0_1_0_0_1_2 - 0.0425845759179092*G0_1_0_0_2_0 - 0.0440211640211639*G0_1_0_0_2_1 - 0.0420715087381753*G0_1_0_0_2_2 - 0.0145711079044415*G0_1_0_1_0_0 - 0.0294500561167229*G0_1_0_1_0_1 - 0.0440211640211639*G0_1_0_1_0_2 - 0.0294500561167229*G0_1_0_1_1_0 - 0.241757255090587*G0_1_0_1_1_1 - 0.148686868686868*G0_1_0_1_1_2 - 0.0440211640211639*G0_1_0_1_2_0 - 0.148686868686868*G0_1_0_1_2_1 - 0.112053872053871*G0_1_0_1_2_2 - 0.0425845759179092*G0_1_0_2_0_0 - 0.0440211640211639*G0_1_0_2_0_1 - 0.0420715087381753*G0_1_0_2_0_2 - 0.0440211640211639*G0_1_0_2_1_0 - 0.148686868686868*G0_1_0_2_1_1 - 0.112053872053871*G0_1_0_2_1_2 - 0.0420715087381753*G0_1_0_2_2_0 - 0.112053872053871*G0_1_0_2_2_1 - 0.021959275292609*G0_1_0_2_2_2 + 0.0249350649350651*G0_1_1_0_0_0 + 0.0974827641494303*G0_1_1_0_0_1 - 0.000513067179733879*G0_1_1_0_0_2 + 0.0974827641494303*G0_1_1_0_1_0 + 0.119236812570145*G0_1_1_0_1_1 - 0.000513067179733878*G0_1_1_0_2_0 + 0.000513067179733764*G0_1_1_0_2_2 + 0.0974827641494303*G0_1_1_1_0_0 + 0.119236812570145*G0_1_1_1_0_1 + 0.119236812570145*G0_1_1_1_1_0 - 0.119236812570145*G0_1_1_1_1_2 - 0.119236812570145*G0_1_1_1_2_1 - 0.0974827641494304*G0_1_1_1_2_2 - 0.000513067179733878*G0_1_1_2_0_0 + 0.000513067179733763*G0_1_1_2_0_2 - 0.119236812570145*G0_1_1_2_1_1 - 0.0974827641494304*G0_1_1_2_1_2 + 0.000513067179733764*G0_1_1_2_2_0 - 0.0974827641494304*G0_1_1_2_2_1 - 0.0249350649350656*G0_1_1_2_2_2; + A[222] = A[193] + 0.418662818662817*G0_0_0_0_0_0 + 0.0788071188071186*G0_0_0_0_0_1 + 0.26104858104858*G0_0_0_0_0_2 + 0.0788071188071186*G0_0_0_0_1_0 + 0.0763443963443961*G0_0_0_0_1_1 + 0.0615680615680614*G0_0_0_0_1_2 + 0.26104858104858*G0_0_0_0_2_0 + 0.0615680615680614*G0_0_0_0_2_1 + 0.192092352092352*G0_0_0_0_2_2 + 0.0788071188071186*G0_0_0_1_0_0 + 0.0763443963443961*G0_0_0_1_0_1 + 0.0615680615680614*G0_0_0_1_0_2 + 0.0763443963443961*G0_0_0_1_1_0 + 0.35216931216931*G0_0_0_1_1_1 + 0.113285233285233*G0_0_0_1_1_2 + 0.0615680615680614*G0_0_0_1_2_0 + 0.113285233285233*G0_0_0_1_2_1 + 0.0147763347763346*G0_0_0_1_2_2 + 0.26104858104858*G0_0_0_2_0_0 + 0.0615680615680614*G0_0_0_2_0_1 + 0.192092352092352*G0_0_0_2_0_2 + 0.0615680615680614*G0_0_0_2_1_0 + 0.113285233285233*G0_0_0_2_1_1 + 0.0147763347763346*G0_0_0_2_1_2 + 0.192092352092352*G0_0_0_2_2_0 + 0.0147763347763346*G0_0_0_2_2_1 - 0.0985088985088978*G0_0_0_2_2_2 + 0.0246272246272243*G0_0_1_0_0_1 - 0.0246272246272244*G0_0_1_0_0_2 + 0.0246272246272243*G0_0_1_0_1_0 + 0.0566426166426163*G0_0_1_0_1_1 - 0.0246272246272244*G0_0_1_0_2_0 - 0.0566426166426164*G0_0_1_0_2_2 + 0.0246272246272243*G0_0_1_1_0_0 + 0.0566426166426163*G0_0_1_1_0_1 + 0.0566426166426163*G0_0_1_1_1_0 + 0.339855699855698*G0_0_1_1_1_1 + 0.0640307840307835*G0_0_1_1_1_2 + 0.0640307840307835*G0_0_1_1_2_1 - 0.064030784030784*G0_0_1_1_2_2 - 0.0246272246272244*G0_0_1_2_0_0 - 0.0566426166426164*G0_0_1_2_0_2 + 0.0640307840307835*G0_0_1_2_1_1 - 0.064030784030784*G0_0_1_2_1_2 - 0.0566426166426164*G0_0_1_2_2_0 - 0.064030784030784*G0_0_1_2_2_1 - 0.339855699855699*G0_0_1_2_2_2 - 0.0295526695526692*G0_1_0_0_0_1 + 0.0295526695526696*G0_1_0_0_0_2 - 0.0295526695526692*G0_1_0_0_1_0 - 0.0246272246272244*G0_1_0_0_1_1 + 0.0295526695526696*G0_1_0_0_2_0 + 0.0246272246272245*G0_1_0_0_2_2 - 0.0295526695526692*G0_1_0_1_0_0 - 0.0246272246272244*G0_1_0_1_0_1 - 0.0246272246272244*G0_1_0_1_1_0 + 0.177316017316017*G0_1_0_1_1_1 + 0.0369408369408368*G0_1_0_1_1_2 + 0.0369408369408368*G0_1_0_1_2_1 - 0.0369408369408368*G0_1_0_1_2_2 + 0.0295526695526696*G0_1_0_2_0_0 + 0.0246272246272245*G0_1_0_2_0_2 + 0.0369408369408368*G0_1_0_2_1_1 - 0.0369408369408368*G0_1_0_2_1_2 + 0.0246272246272245*G0_1_0_2_2_0 - 0.0369408369408368*G0_1_0_2_2_1 - 0.177316017316017*G0_1_0_2_2_2 - 0.418662818662818*G0_1_1_0_0_0 - 0.26104858104858*G0_1_1_0_0_1 - 0.0788071188071184*G0_1_1_0_0_2 - 0.26104858104858*G0_1_1_0_1_0 - 0.192092352092351*G0_1_1_0_1_1 - 0.0615680615680613*G0_1_1_0_1_2 - 0.0788071188071184*G0_1_1_0_2_0 - 0.0615680615680613*G0_1_1_0_2_1 - 0.076344396344396*G0_1_1_0_2_2 - 0.26104858104858*G0_1_1_1_0_0 - 0.192092352092351*G0_1_1_1_0_1 - 0.0615680615680613*G0_1_1_1_0_2 - 0.192092352092351*G0_1_1_1_1_0 + 0.0985088985088976*G0_1_1_1_1_1 - 0.0147763347763348*G0_1_1_1_1_2 - 0.0615680615680613*G0_1_1_1_2_0 - 0.0147763347763348*G0_1_1_1_2_1 - 0.113285233285233*G0_1_1_1_2_2 - 0.0788071188071184*G0_1_1_2_0_0 - 0.0615680615680613*G0_1_1_2_0_1 - 0.076344396344396*G0_1_1_2_0_2 - 0.0615680615680613*G0_1_1_2_1_0 - 0.0147763347763348*G0_1_1_2_1_1 - 0.113285233285233*G0_1_1_2_1_2 - 0.0763443963443961*G0_1_1_2_2_0 - 0.113285233285233*G0_1_1_2_2_1 - 0.352169312169311*G0_1_1_2_2_2; + A[179] = A[221] - 0.00430976430976466*G0_0_1_0_0_0 - 0.0185730319063652*G0_0_1_0_0_1 - 0.00420715087381758*G0_0_1_0_0_2 - 0.0185730319063652*G0_0_1_0_1_0 - 0.0189834856501522*G0_0_1_0_1_1 - 0.000820907487574152*G0_0_1_0_1_2 - 0.00420715087381759*G0_0_1_0_2_0 - 0.000820907487574151*G0_0_1_0_2_1 + 0.00277056277056271*G0_0_1_0_2_2 - 0.0185730319063652*G0_0_1_1_0_0 - 0.0189834856501522*G0_0_1_1_0_1 - 0.000820907487574151*G0_0_1_1_0_2 - 0.0189834856501522*G0_0_1_1_1_0 + 0.0523328523328523*G0_0_1_1_1_1 + 0.0118005451338784*G0_0_1_1_1_2 - 0.000820907487574151*G0_0_1_1_2_0 + 0.0118005451338784*G0_0_1_1_2_1 + 0.0048228314894981*G0_0_1_1_2_2 - 0.00420715087381758*G0_0_1_2_0_0 - 0.000820907487574151*G0_0_1_2_0_1 + 0.00277056277056271*G0_0_1_2_0_2 - 0.000820907487574151*G0_0_1_2_1_0 + 0.0118005451338784*G0_0_1_2_1_1 + 0.0048228314894981*G0_0_1_2_1_2 + 0.00277056277056271*G0_0_1_2_2_0 + 0.0048228314894981*G0_0_1_2_2_1 + 0.0240115440115438*G0_0_1_2_2_2 + 0.00430976430976466*G0_1_0_0_0_0 + 0.0185730319063652*G0_1_0_0_0_1 + 0.00420715087381758*G0_1_0_0_0_2 + 0.0185730319063652*G0_1_0_0_1_0 + 0.0189834856501522*G0_1_0_0_1_1 + 0.000820907487574151*G0_1_0_0_1_2 + 0.00420715087381758*G0_1_0_0_2_0 + 0.00082090748757415*G0_1_0_0_2_1 - 0.00277056277056271*G0_1_0_0_2_2 + 0.0185730319063652*G0_1_0_1_0_0 + 0.0189834856501522*G0_1_0_1_0_1 + 0.000820907487574151*G0_1_0_1_0_2 + 0.0189834856501522*G0_1_0_1_1_0 - 0.0523328523328524*G0_1_0_1_1_1 - 0.0118005451338784*G0_1_0_1_1_2 + 0.000820907487574149*G0_1_0_1_2_0 - 0.0118005451338784*G0_1_0_1_2_1 - 0.0048228314894981*G0_1_0_1_2_2 + 0.00420715087381758*G0_1_0_2_0_0 + 0.000820907487574151*G0_1_0_2_0_1 - 0.00277056277056271*G0_1_0_2_0_2 + 0.00082090748757415*G0_1_0_2_1_0 - 0.0118005451338784*G0_1_0_2_1_1 - 0.0048228314894981*G0_1_0_2_1_2 - 0.00277056277056271*G0_1_0_2_2_0 - 0.0048228314894981*G0_1_0_2_2_1 - 0.0240115440115438*G0_1_0_2_2_2; + A[207] = A[193] + 0.132987012987012*G0_0_1_0_0_0 + 0.0418662818662815*G0_0_1_0_0_1 - 0.0123136123136123*G0_0_1_0_0_2 + 0.0418662818662815*G0_0_1_0_1_0 + 0.0418662818662816*G0_0_1_0_1_1 - 0.0295526695526695*G0_0_1_0_1_2 - 0.0123136123136123*G0_0_1_0_2_0 - 0.0295526695526695*G0_0_1_0_2_1 - 0.0394035594035592*G0_0_1_0_2_2 + 0.0418662818662815*G0_0_1_1_0_0 + 0.0418662818662816*G0_0_1_1_0_1 - 0.0295526695526695*G0_0_1_1_0_2 + 0.0418662818662816*G0_0_1_1_1_0 + 0.132987012987012*G0_0_1_1_1_1 - 0.0123136123136124*G0_0_1_1_1_2 - 0.0295526695526695*G0_0_1_1_2_0 - 0.0123136123136124*G0_0_1_1_2_1 - 0.0394035594035593*G0_0_1_1_2_2 - 0.0123136123136123*G0_0_1_2_0_0 - 0.0295526695526695*G0_0_1_2_0_1 - 0.0394035594035592*G0_0_1_2_0_2 - 0.0295526695526695*G0_0_1_2_1_0 - 0.0123136123136124*G0_0_1_2_1_1 - 0.0394035594035593*G0_0_1_2_1_2 - 0.0394035594035592*G0_0_1_2_2_0 - 0.0394035594035593*G0_0_1_2_2_1 - 0.0295526695526697*G0_0_1_2_2_2 - 0.132987012987012*G0_1_0_0_0_0 - 0.0418662818662815*G0_1_0_0_0_1 + 0.0123136123136123*G0_1_0_0_0_2 - 0.0418662818662815*G0_1_0_0_1_0 - 0.0418662818662816*G0_1_0_0_1_1 + 0.0295526695526695*G0_1_0_0_1_2 + 0.0123136123136123*G0_1_0_0_2_0 + 0.0295526695526695*G0_1_0_0_2_1 + 0.0394035594035592*G0_1_0_0_2_2 - 0.0418662818662815*G0_1_0_1_0_0 - 0.0418662818662816*G0_1_0_1_0_1 + 0.0295526695526695*G0_1_0_1_0_2 - 0.0418662818662816*G0_1_0_1_1_0 - 0.132987012987012*G0_1_0_1_1_1 + 0.0123136123136124*G0_1_0_1_1_2 + 0.0295526695526695*G0_1_0_1_2_0 + 0.0123136123136124*G0_1_0_1_2_1 + 0.0394035594035593*G0_1_0_1_2_2 + 0.0123136123136123*G0_1_0_2_0_0 + 0.0295526695526695*G0_1_0_2_0_1 + 0.0394035594035592*G0_1_0_2_0_2 + 0.0295526695526695*G0_1_0_2_1_0 + 0.0123136123136124*G0_1_0_2_1_1 + 0.0394035594035593*G0_1_0_2_1_2 + 0.0394035594035592*G0_1_0_2_2_0 + 0.0394035594035593*G0_1_0_2_2_1 + 0.0295526695526697*G0_1_0_2_2_2; + A[194] = A[222] + 0.132987012987013*G0_0_1_0_0_0 - 0.0123136123136121*G0_0_1_0_0_1 + 0.0418662818662817*G0_0_1_0_0_2 - 0.0123136123136121*G0_0_1_0_1_0 - 0.0394035594035592*G0_0_1_0_1_1 - 0.0295526695526694*G0_0_1_0_1_2 + 0.0418662818662817*G0_0_1_0_2_0 - 0.0295526695526694*G0_0_1_0_2_1 + 0.0418662818662817*G0_0_1_0_2_2 - 0.0123136123136121*G0_0_1_1_0_0 - 0.0394035594035592*G0_0_1_1_0_1 - 0.0295526695526694*G0_0_1_1_0_2 - 0.0394035594035592*G0_0_1_1_1_0 - 0.0295526695526693*G0_0_1_1_1_1 - 0.0394035594035592*G0_0_1_1_1_2 - 0.0295526695526694*G0_0_1_1_2_0 - 0.0394035594035592*G0_0_1_1_2_1 - 0.0123136123136121*G0_0_1_1_2_2 + 0.0418662818662817*G0_0_1_2_0_0 - 0.0295526695526694*G0_0_1_2_0_1 + 0.0418662818662817*G0_0_1_2_0_2 - 0.0295526695526694*G0_0_1_2_1_0 - 0.0394035594035592*G0_0_1_2_1_1 - 0.0123136123136121*G0_0_1_2_1_2 + 0.0418662818662817*G0_0_1_2_2_0 - 0.0123136123136121*G0_0_1_2_2_1 + 0.132987012987013*G0_0_1_2_2_2 - 0.132987012987013*G0_1_0_0_0_0 + 0.0123136123136121*G0_1_0_0_0_1 - 0.0418662818662817*G0_1_0_0_0_2 + 0.0123136123136121*G0_1_0_0_1_0 + 0.0394035594035592*G0_1_0_0_1_1 + 0.0295526695526694*G0_1_0_0_1_2 - 0.0418662818662817*G0_1_0_0_2_0 + 0.0295526695526694*G0_1_0_0_2_1 - 0.0418662818662817*G0_1_0_0_2_2 + 0.0123136123136121*G0_1_0_1_0_0 + 0.0394035594035592*G0_1_0_1_0_1 + 0.0295526695526694*G0_1_0_1_0_2 + 0.0394035594035592*G0_1_0_1_1_0 + 0.0295526695526693*G0_1_0_1_1_1 + 0.0394035594035591*G0_1_0_1_1_2 + 0.0295526695526694*G0_1_0_1_2_0 + 0.0394035594035591*G0_1_0_1_2_1 + 0.0123136123136121*G0_1_0_1_2_2 - 0.0418662818662817*G0_1_0_2_0_0 + 0.0295526695526694*G0_1_0_2_0_1 - 0.0418662818662817*G0_1_0_2_0_2 + 0.0295526695526694*G0_1_0_2_1_0 + 0.0394035594035591*G0_1_0_2_1_1 + 0.0123136123136121*G0_1_0_2_1_2 - 0.0418662818662817*G0_1_0_2_2_0 + 0.0123136123136121*G0_1_0_2_2_1 - 0.132987012987013*G0_1_0_2_2_2; + A[200] = A[88] - 0.00800384800384806*G0_0_1_0_0_0 - 0.00892736892736886*G0_0_1_0_0_1 - 0.00564373897707231*G0_0_1_0_0_2 - 0.00892736892736886*G0_0_1_0_1_0 - 0.00728555395222047*G0_0_1_0_1_1 + 0.000410453743787097*G0_0_1_0_1_2 - 0.00564373897707231*G0_0_1_0_2_0 + 0.000410453743787098*G0_0_1_0_2_1 - 0.00153920153920145*G0_0_1_0_2_2 - 0.00892736892736886*G0_0_1_1_0_0 - 0.00728555395222047*G0_0_1_1_0_1 + 0.000410453743787097*G0_0_1_1_0_2 - 0.00728555395222048*G0_0_1_1_1_0 + 0.0412506012506015*G0_0_1_1_1_1 + 0.0202148468815136*G0_0_1_1_1_2 + 0.000410453743787097*G0_0_1_1_2_0 + 0.0202148468815136*G0_0_1_1_2_1 + 0.00872214205547549*G0_0_1_1_2_2 - 0.00564373897707232*G0_0_1_2_0_0 + 0.000410453743787098*G0_0_1_2_0_1 - 0.00153920153920145*G0_0_1_2_0_2 + 0.000410453743787097*G0_0_1_2_1_0 + 0.0202148468815136*G0_0_1_2_1_1 + 0.0087221420554755*G0_0_1_2_1_2 - 0.00153920153920145*G0_0_1_2_2_0 + 0.0087221420554755*G0_0_1_2_2_1 - 0.0523328523328508*G0_0_1_2_2_2 + 0.00800384800384806*G0_1_0_0_0_0 + 0.00892736892736886*G0_1_0_0_0_1 + 0.00564373897707232*G0_1_0_0_0_2 + 0.00892736892736886*G0_1_0_0_1_0 + 0.00728555395222048*G0_1_0_0_1_1 - 0.000410453743787096*G0_1_0_0_1_2 + 0.00564373897707231*G0_1_0_0_2_0 - 0.000410453743787097*G0_1_0_0_2_1 + 0.00153920153920145*G0_1_0_0_2_2 + 0.00892736892736886*G0_1_0_1_0_0 + 0.00728555395222048*G0_1_0_1_0_1 - 0.000410453743787096*G0_1_0_1_0_2 + 0.00728555395222048*G0_1_0_1_1_0 - 0.0412506012506015*G0_1_0_1_1_1 - 0.0202148468815136*G0_1_0_1_1_2 - 0.000410453743787097*G0_1_0_1_2_0 - 0.0202148468815136*G0_1_0_1_2_1 - 0.00872214205547549*G0_1_0_1_2_2 + 0.00564373897707232*G0_1_0_2_0_0 - 0.000410453743787096*G0_1_0_2_0_1 + 0.00153920153920145*G0_1_0_2_0_2 - 0.000410453743787095*G0_1_0_2_1_0 - 0.0202148468815136*G0_1_0_2_1_1 - 0.00872214205547549*G0_1_0_2_1_2 + 0.00153920153920145*G0_1_0_2_2_0 - 0.00872214205547549*G0_1_0_2_2_1 + 0.0523328523328508*G0_1_0_2_2_2; + A[203] = -A[200] - 0.0123136123136127*G0_0_1_0_0_0 - 0.0131345198011865*G0_0_1_0_0_1 - 0.0242167708834376*G0_0_1_0_0_2 - 0.0131345198011865*G0_0_1_0_1_0 - 0.00451499118165787*G0_0_1_0_1_1 - 0.000410453743787076*G0_0_1_0_1_2 - 0.0242167708834376*G0_0_1_0_2_0 - 0.000410453743787076*G0_0_1_0_2_1 - 0.020522687189354*G0_0_1_0_2_2 - 0.0131345198011865*G0_0_1_1_0_0 - 0.00451499118165787*G0_0_1_1_0_1 - 0.000410453743787076*G0_0_1_1_0_2 - 0.00451499118165788*G0_0_1_1_1_0 + 0.0652621452621451*G0_0_1_1_1_1 + 0.0250376783710118*G0_0_1_1_1_2 - 0.000410453743787078*G0_0_1_1_2_0 + 0.0250376783710118*G0_0_1_1_2_1 + 0.0205226871893539*G0_0_1_1_2_2 - 0.0242167708834376*G0_0_1_2_0_0 - 0.000410453743787076*G0_0_1_2_0_1 - 0.020522687189354*G0_0_1_2_0_2 - 0.000410453743787076*G0_0_1_2_1_0 + 0.0250376783710118*G0_0_1_2_1_1 + 0.0205226871893539*G0_0_1_2_1_2 - 0.020522687189354*G0_0_1_2_2_0 + 0.0205226871893539*G0_0_1_2_2_1 + 0.031604938271605*G0_1_1_0_0_0 + 0.0597210197210194*G0_1_1_0_0_1 + 0.00800384800384793*G0_1_1_0_0_2 + 0.0597210197210194*G0_1_1_0_1_0 + 0.11020683020683*G0_1_1_0_1_1 + 0.00389931056597719*G0_1_1_0_1_2 + 0.00800384800384793*G0_1_1_0_2_0 + 0.00389931056597719*G0_1_1_0_2_1 + 0.00841430174763497*G0_1_1_0_2_2 + 0.0597210197210194*G0_1_1_1_0_0 + 0.11020683020683*G0_1_1_1_0_1 + 0.00389931056597719*G0_1_1_1_0_2 + 0.11020683020683*G0_1_1_1_1_0 + 0.373923360590026*G0_1_1_1_1_1 + 0.0170338303671637*G0_1_1_1_1_2 + 0.00389931056597719*G0_1_1_1_2_0 + 0.0170338303671637*G0_1_1_1_2_1 - 0.0186756453423119*G0_1_1_1_2_2 + 0.00800384800384793*G0_1_1_2_0_0 + 0.00389931056597719*G0_1_1_2_0_1 + 0.00841430174763497*G0_1_1_2_0_2 + 0.00389931056597719*G0_1_1_2_1_0 + 0.0170338303671637*G0_1_1_2_1_1 - 0.0186756453423119*G0_1_1_2_1_2 + 0.00841430174763497*G0_1_1_2_2_0 - 0.0186756453423119*G0_1_1_2_2_1 - 0.0348885682219011*G0_1_1_2_2_2; + A[59] = -A[179] + 0.0316049382716046*G0_0_0_0_0_0 + 0.00800384800384795*G0_0_0_0_0_1 + 0.0597210197210194*G0_0_0_0_0_2 + 0.00800384800384795*G0_0_0_0_1_0 + 0.00841430174763499*G0_0_0_0_1_1 + 0.00389931056597721*G0_0_0_0_1_2 + 0.0597210197210194*G0_0_0_0_2_0 + 0.00389931056597721*G0_0_0_0_2_1 + 0.11020683020683*G0_0_0_0_2_2 + 0.00800384800384795*G0_0_0_1_0_0 + 0.00841430174763499*G0_0_0_1_0_1 + 0.00389931056597721*G0_0_0_1_0_2 + 0.00841430174763498*G0_0_0_1_1_0 - 0.0348885682219018*G0_0_0_1_1_1 - 0.018675645342312*G0_0_0_1_1_2 + 0.00389931056597721*G0_0_0_1_2_0 - 0.018675645342312*G0_0_0_1_2_1 + 0.0170338303671636*G0_0_0_1_2_2 + 0.0597210197210194*G0_0_0_2_0_0 + 0.00389931056597721*G0_0_0_2_0_1 + 0.11020683020683*G0_0_0_2_0_2 + 0.00389931056597721*G0_0_0_2_1_0 - 0.018675645342312*G0_0_0_2_1_1 + 0.0170338303671636*G0_0_0_2_1_2 + 0.11020683020683*G0_0_0_2_2_0 + 0.0170338303671636*G0_0_0_2_2_1 + 0.373923360590025*G0_0_0_2_2_2 - 0.0123136123136127*G0_0_1_0_0_0 - 0.0242167708834375*G0_0_1_0_0_1 - 0.0131345198011865*G0_0_1_0_0_2 - 0.0242167708834375*G0_0_1_0_1_0 - 0.0205226871893537*G0_0_1_0_1_1 - 0.000410453743787069*G0_0_1_0_1_2 - 0.0131345198011865*G0_0_1_0_2_0 - 0.00041045374378707*G0_0_1_0_2_1 - 0.00451499118165783*G0_0_1_0_2_2 - 0.0242167708834375*G0_0_1_1_0_0 - 0.0205226871893537*G0_0_1_1_0_1 - 0.00041045374378707*G0_0_1_1_0_2 - 0.0205226871893537*G0_0_1_1_1_0 + 0.0205226871893539*G0_0_1_1_1_2 - 0.000410453743787069*G0_0_1_1_2_0 + 0.0205226871893539*G0_0_1_1_2_1 + 0.0250376783710116*G0_0_1_1_2_2 - 0.0131345198011865*G0_0_1_2_0_0 - 0.000410453743787072*G0_0_1_2_0_1 - 0.00451499118165783*G0_0_1_2_0_2 - 0.00041045374378707*G0_0_1_2_1_0 + 0.0205226871893539*G0_0_1_2_1_1 + 0.0250376783710116*G0_0_1_2_1_2 - 0.00451499118165783*G0_0_1_2_2_0 + 0.0250376783710116*G0_0_1_2_2_1 + 0.0652621452621452*G0_0_1_2_2_2; + A[196] = A[28] + 0.00161616161616165*G0_0_1_0_0_0 + 0.00102613435946771*G0_0_1_0_0_1 + 0.000179573512906842*G0_0_1_0_0_2 + 0.00102613435946771*G0_0_1_0_1_0 - 0.0109026775693441*G0_0_1_0_1_1 + 0.000179573512906841*G0_0_1_0_2_0 - 0.000179573512906858*G0_0_1_0_2_2 + 0.00102613435946771*G0_0_1_1_0_0 - 0.0109026775693441*G0_0_1_1_0_1 - 0.0109026775693441*G0_0_1_1_1_0 + 0.0109026775693442*G0_0_1_1_1_2 + 0.0109026775693442*G0_0_1_1_2_1 - 0.0010261343594677*G0_0_1_1_2_2 + 0.000179573512906842*G0_0_1_2_0_0 - 0.000179573512906858*G0_0_1_2_0_2 + 0.0109026775693442*G0_0_1_2_1_1 - 0.0010261343594677*G0_0_1_2_1_2 - 0.000179573512906858*G0_0_1_2_2_0 - 0.00102613435946769*G0_0_1_2_2_1 - 0.00161616161616168*G0_0_1_2_2_2 - 0.00161616161616164*G0_1_0_0_0_0 - 0.00102613435946771*G0_1_0_0_0_1 - 0.000179573512906842*G0_1_0_0_0_2 - 0.00102613435946771*G0_1_0_0_1_0 + 0.0109026775693441*G0_1_0_0_1_1 - 0.000179573512906841*G0_1_0_0_2_0 + 0.000179573512906858*G0_1_0_0_2_2 - 0.00102613435946771*G0_1_0_1_0_0 + 0.0109026775693441*G0_1_0_1_0_1 + 0.0109026775693441*G0_1_0_1_1_0 - 0.0109026775693442*G0_1_0_1_1_2 - 0.0109026775693442*G0_1_0_1_2_1 + 0.0010261343594677*G0_1_0_1_2_2 - 0.000179573512906842*G0_1_0_2_0_0 + 0.000179573512906858*G0_1_0_2_0_2 - 0.0109026775693442*G0_1_0_2_1_1 + 0.0010261343594677*G0_1_0_2_1_2 + 0.000179573512906858*G0_1_0_2_2_0 + 0.00102613435946769*G0_1_0_2_2_1 + 0.00161616161616168*G0_1_0_2_2_2; + A[209] = A[223] + 0.0295526695526699*G0_0_1_0_0_0 + 0.0394035594035595*G0_0_1_0_0_1 + 0.0394035594035594*G0_0_1_0_0_2 + 0.0394035594035595*G0_0_1_0_1_0 + 0.0123136123136125*G0_0_1_0_1_1 + 0.0295526695526695*G0_0_1_0_1_2 + 0.0394035594035594*G0_0_1_0_2_0 + 0.0295526695526695*G0_0_1_0_2_1 + 0.0123136123136125*G0_0_1_0_2_2 + 0.0394035594035595*G0_0_1_1_0_0 + 0.0123136123136125*G0_0_1_1_0_1 + 0.0295526695526695*G0_0_1_1_0_2 + 0.0123136123136125*G0_0_1_1_1_0 - 0.132987012987012*G0_0_1_1_1_1 - 0.0418662818662819*G0_0_1_1_1_2 + 0.0295526695526695*G0_0_1_1_2_0 - 0.0418662818662819*G0_0_1_1_2_1 - 0.0418662818662818*G0_0_1_1_2_2 + 0.0394035594035594*G0_0_1_2_0_0 + 0.0295526695526695*G0_0_1_2_0_1 + 0.0123136123136125*G0_0_1_2_0_2 + 0.0295526695526695*G0_0_1_2_1_0 - 0.0418662818662819*G0_0_1_2_1_1 - 0.0418662818662818*G0_0_1_2_1_2 + 0.0123136123136125*G0_0_1_2_2_0 - 0.0418662818662818*G0_0_1_2_2_1 - 0.132987012987012*G0_0_1_2_2_2 - 0.0295526695526699*G0_1_0_0_0_0 - 0.0394035594035595*G0_1_0_0_0_1 - 0.0394035594035594*G0_1_0_0_0_2 - 0.0394035594035595*G0_1_0_0_1_0 - 0.0123136123136125*G0_1_0_0_1_1 - 0.0295526695526695*G0_1_0_0_1_2 - 0.0394035594035594*G0_1_0_0_2_0 - 0.0295526695526695*G0_1_0_0_2_1 - 0.0123136123136125*G0_1_0_0_2_2 - 0.0394035594035595*G0_1_0_1_0_0 - 0.0123136123136125*G0_1_0_1_0_1 - 0.0295526695526695*G0_1_0_1_0_2 - 0.0123136123136125*G0_1_0_1_1_0 + 0.132987012987012*G0_1_0_1_1_1 + 0.0418662818662819*G0_1_0_1_1_2 - 0.0295526695526695*G0_1_0_1_2_0 + 0.0418662818662819*G0_1_0_1_2_1 + 0.0418662818662819*G0_1_0_1_2_2 - 0.0394035594035594*G0_1_0_2_0_0 - 0.0295526695526695*G0_1_0_2_0_1 - 0.0123136123136125*G0_1_0_2_0_2 - 0.0295526695526695*G0_1_0_2_1_0 + 0.0418662818662819*G0_1_0_2_1_1 + 0.0418662818662819*G0_1_0_2_1_2 - 0.0123136123136125*G0_1_0_2_2_0 + 0.0418662818662819*G0_1_0_2_2_1 + 0.132987012987012*G0_1_0_2_2_2; + A[13] = A[195] + 0.00333493666826994*G0_0_1_0_0_1 - 0.00333493666826999*G0_0_1_0_0_2 + 0.00333493666826994*G0_0_1_0_1_0 - 0.00287317620650953*G0_0_1_0_1_1 + 0.00094917428250761*G0_0_1_0_1_2 - 0.00333493666826999*G0_0_1_0_2_0 + 0.000949174282507611*G0_0_1_0_2_1 + 0.000974827641494327*G0_0_1_0_2_2 + 0.00333493666826994*G0_0_1_1_0_0 - 0.00287317620650953*G0_0_1_1_0_1 + 0.00094917428250761*G0_0_1_1_0_2 - 0.00287317620650953*G0_0_1_1_1_0 - 0.0112361712361712*G0_0_1_1_1_1 + 0.00112874779541442*G0_0_1_1_1_2 + 0.000949174282507611*G0_0_1_1_2_0 + 0.00112874779541443*G0_0_1_1_2_1 + 0.00243706910373575*G0_0_1_1_2_2 - 0.00333493666826999*G0_0_1_2_0_0 + 0.00094917428250761*G0_0_1_2_0_1 + 0.000974827641494328*G0_0_1_2_0_2 + 0.00094917428250761*G0_0_1_2_1_0 + 0.00112874779541443*G0_0_1_2_1_1 + 0.00243706910373575*G0_0_1_2_1_2 + 0.000974827641494326*G0_0_1_2_2_0 + 0.00243706910373575*G0_0_1_2_2_1 + 0.000538720538720573*G0_0_1_2_2_2 - 0.00333493666826994*G0_1_0_0_0_1 + 0.00333493666826999*G0_1_0_0_0_2 - 0.00333493666826994*G0_1_0_0_1_0 + 0.00287317620650953*G0_1_0_0_1_1 - 0.00094917428250761*G0_1_0_0_1_2 + 0.00333493666826999*G0_1_0_0_2_0 - 0.000949174282507611*G0_1_0_0_2_1 - 0.000974827641494328*G0_1_0_0_2_2 - 0.00333493666826994*G0_1_0_1_0_0 + 0.00287317620650953*G0_1_0_1_0_1 - 0.000949174282507611*G0_1_0_1_0_2 + 0.00287317620650953*G0_1_0_1_1_0 + 0.0112361712361712*G0_1_0_1_1_1 - 0.00112874779541442*G0_1_0_1_1_2 - 0.000949174282507611*G0_1_0_1_2_0 - 0.00112874779541443*G0_1_0_1_2_1 - 0.00243706910373575*G0_1_0_1_2_2 + 0.00333493666826999*G0_1_0_2_0_0 - 0.00094917428250761*G0_1_0_2_0_1 - 0.000974827641494329*G0_1_0_2_0_2 - 0.00094917428250761*G0_1_0_2_1_0 - 0.00112874779541443*G0_1_0_2_1_1 - 0.00243706910373575*G0_1_0_2_1_2 - 0.000974827641494328*G0_1_0_2_2_0 - 0.00243706910373575*G0_1_0_2_2_1 - 0.000538720538720575*G0_1_0_2_2_2; + A[53] = A[123] + 0.00400192400192409*G0_0_1_0_0_0 + 0.000684089572978452*G0_0_1_0_0_1 + 0.00885895997007106*G0_0_1_0_0_2 + 0.000684089572978452*G0_0_1_0_1_0 - 0.000684089572978469*G0_0_1_0_1_2 + 0.00885895997007106*G0_0_1_0_2_0 - 0.000684089572978468*G0_0_1_0_2_1 + 0.0121425899203676*G0_0_1_0_2_2 + 0.000684089572978452*G0_0_1_1_0_0 - 0.000684089572978468*G0_0_1_1_0_2 + 0.00933782267115545*G0_0_1_1_1_1 - 0.0003078403078404*G0_0_1_1_1_2 - 0.000684089572978469*G0_0_1_1_2_0 - 0.000307840307840401*G0_0_1_1_2_1 + 0.00324942547164759*G0_0_1_1_2_2 + 0.00885895997007106*G0_0_1_2_0_0 - 0.000684089572978469*G0_0_1_2_0_1 + 0.0121425899203676*G0_0_1_2_0_2 - 0.000684089572978469*G0_0_1_2_1_0 - 0.0003078403078404*G0_0_1_2_1_1 + 0.00324942547164759*G0_0_1_2_1_2 + 0.0121425899203676*G0_0_1_2_2_0 + 0.00324942547164759*G0_0_1_2_2_1 - 0.083116883116883*G0_0_1_2_2_2 - 0.0040019240019241*G0_1_0_0_0_0 - 0.000684089572978452*G0_1_0_0_0_1 - 0.00885895997007107*G0_1_0_0_0_2 - 0.000684089572978452*G0_1_0_0_1_0 + 0.000684089572978468*G0_1_0_0_1_2 - 0.00885895997007106*G0_1_0_0_2_0 + 0.000684089572978468*G0_1_0_0_2_1 - 0.0121425899203676*G0_1_0_0_2_2 - 0.000684089572978452*G0_1_0_1_0_0 + 0.000684089572978469*G0_1_0_1_0_2 - 0.00933782267115545*G0_1_0_1_1_1 + 0.000307840307840401*G0_1_0_1_1_2 + 0.000684089572978468*G0_1_0_1_2_0 + 0.000307840307840401*G0_1_0_1_2_1 - 0.00324942547164759*G0_1_0_1_2_2 - 0.00885895997007106*G0_1_0_2_0_0 + 0.000684089572978469*G0_1_0_2_0_1 - 0.0121425899203676*G0_1_0_2_0_2 + 0.000684089572978469*G0_1_0_2_1_0 + 0.000307840307840401*G0_1_0_2_1_1 - 0.00324942547164759*G0_1_0_2_1_2 - 0.0121425899203676*G0_1_0_2_2_0 - 0.00324942547164759*G0_1_0_2_2_1 + 0.083116883116883*G0_1_0_2_2_2; + A[51] = -A[53] - 0.0388904922238252*G0_0_0_0_0_0 + 0.00078670300892525*G0_0_0_0_0_1 - 0.0205910961466515*G0_0_0_0_0_2 + 0.00078670300892525*G0_0_0_0_1_0 - 0.000239431350542434*G0_0_0_0_1_1 - 0.000547271658382762*G0_0_0_0_1_2 - 0.0205910961466515*G0_0_0_0_2_0 - 0.000547271658382763*G0_0_0_0_2_1 - 0.0330415263748594*G0_0_0_0_2_2 + 0.00078670300892525*G0_0_0_1_0_0 - 0.000239431350542434*G0_0_0_1_0_1 - 0.000547271658382762*G0_0_0_1_0_2 - 0.000239431350542434*G0_0_0_1_1_0 - 0.0481257014590347*G0_0_0_1_1_1 - 0.0103297525519748*G0_0_0_1_1_2 - 0.000547271658382762*G0_0_0_1_2_0 - 0.0103297525519748*G0_0_0_1_2_1 + 0.00184704184704183*G0_0_0_1_2_2 - 0.0205910961466515*G0_0_0_2_0_0 - 0.000547271658382763*G0_0_0_2_0_1 - 0.0330415263748594*G0_0_0_2_0_2 - 0.000547271658382763*G0_0_0_2_1_0 - 0.0103297525519748*G0_0_0_2_1_1 + 0.00184704184704183*G0_0_0_2_1_2 - 0.0330415263748594*G0_0_0_2_2_0 + 0.00184704184704183*G0_0_0_2_2_1 - 0.266794933461598*G0_0_0_2_2_2 - 0.00584896584896542*G0_0_1_0_0_0 + 0.00133397466730802*G0_0_1_0_0_1 + 0.00133397466730802*G0_0_1_0_1_0 - 0.001333974667308*G0_0_1_0_1_2 - 0.001333974667308*G0_0_1_0_2_1 + 0.00584896584896588*G0_0_1_0_2_2 + 0.00133397466730802*G0_0_1_1_0_0 - 0.001333974667308*G0_0_1_1_0_2 - 0.0367356100689433*G0_0_1_1_1_1 - 0.0129292929292929*G0_0_1_1_1_2 - 0.001333974667308*G0_0_1_1_2_0 - 0.0129292929292929*G0_0_1_1_2_1 - 0.0037966971300305*G0_0_1_1_2_2 - 0.001333974667308*G0_0_1_2_0_1 + 0.00584896584896587*G0_0_1_2_0_2 - 0.001333974667308*G0_0_1_2_1_0 - 0.0129292929292929*G0_0_1_2_1_1 - 0.0037966971300305*G0_0_1_2_1_2 + 0.00584896584896588*G0_0_1_2_2_0 - 0.0037966971300305*G0_0_1_2_2_1 - 0.123957030623696*G0_0_1_2_2_2 - 0.0191887125220458*G0_1_0_0_0_0 - 0.00239431350542457*G0_1_0_0_0_1 - 0.0055069210624766*G0_1_0_0_0_2 - 0.00239431350542457*G0_1_0_0_1_0 - 0.00304419859975403*G0_1_0_0_1_1 - 0.00133397466730799*G0_1_0_0_1_2 - 0.0055069210624766*G0_1_0_0_2_0 - 0.00133397466730799*G0_1_0_0_2_1 - 0.00444658222435995*G0_1_0_0_2_2 - 0.00239431350542457*G0_1_0_1_0_0 - 0.00304419859975403*G0_1_0_1_0_1 - 0.00133397466730799*G0_1_0_1_0_2 - 0.00304419859975403*G0_1_0_1_1_0 - 0.0554112554112546*G0_1_0_1_1_1 - 0.00926941371385812*G0_1_0_1_1_2 - 0.00133397466730799*G0_1_0_1_2_0 - 0.00926941371385812*G0_1_0_1_2_1 - 0.00519908075463623*G0_1_0_1_2_2 - 0.0055069210624766*G0_1_0_2_0_0 - 0.00133397466730799*G0_1_0_2_0_1 - 0.00444658222435995*G0_1_0_2_0_2 - 0.00133397466730799*G0_1_0_2_1_0 - 0.00926941371385812*G0_1_0_2_1_1 - 0.00519908075463623*G0_1_0_2_1_2 - 0.00444658222435995*G0_1_0_2_2_0 - 0.00519908075463623*G0_1_0_2_2_1 - 0.0309892576559234*G0_1_0_2_2_2 + 0.0118005451338786*G0_1_1_0_0_0 + 0.00280476724921172*G0_1_1_0_0_1 - 0.0010603388381166*G0_1_1_0_0_2 + 0.00280476724921172*G0_1_1_0_1_0 + 0.00622521511410405*G0_1_1_0_1_1 - 0.0010603388381166*G0_1_1_0_2_0 + 0.00106033883811664*G0_1_1_0_2_2 + 0.00280476724921172*G0_1_1_1_0_0 + 0.00622521511410405*G0_1_1_1_0_1 + 0.00622521511410405*G0_1_1_1_1_0 - 0.00622521511410396*G0_1_1_1_1_2 - 0.00622521511410396*G0_1_1_1_2_1 - 0.00280476724921164*G0_1_1_1_2_2 - 0.0010603388381166*G0_1_1_2_0_0 + 0.00106033883811664*G0_1_1_2_0_2 - 0.00622521511410396*G0_1_1_2_1_1 - 0.00280476724921164*G0_1_1_2_1_2 + 0.00106033883811664*G0_1_1_2_2_0 - 0.00280476724921164*G0_1_1_2_2_1 - 0.0118005451338778*G0_1_1_2_2_2; + A[30] = -A[31] + 0.0213339746673079*G0_1_0_0_0_0 + 0.00161509272620383*G0_1_0_0_0_1 - 0.000233018010795783*G0_1_0_0_0_2 + 0.00161509272620383*G0_1_0_0_1_0 - 0.00161509272620384*G0_1_0_0_1_1 - 0.000233018010795783*G0_1_0_0_2_0 - 0.00184811073699961*G0_1_0_0_2_2 + 0.00161509272620383*G0_1_0_1_0_0 - 0.00161509272620384*G0_1_0_1_0_1 - 0.00161509272620384*G0_1_0_1_1_0 - 0.021333974667308*G0_1_0_1_1_1 + 0.000233018010795783*G0_1_0_1_1_2 + 0.000233018010795783*G0_1_0_1_2_1 + 0.00184811073699961*G0_1_0_1_2_2 - 0.000233018010795783*G0_1_0_2_0_0 - 0.00184811073699961*G0_1_0_2_0_2 + 0.000233018010795783*G0_1_0_2_1_1 + 0.00184811073699961*G0_1_0_2_1_2 - 0.00184811073699961*G0_1_0_2_2_0 + 0.00184811073699961*G0_1_0_2_2_1 + 0.0212361712361712*G0_1_1_0_0_0 + 0.00190208967986745*G0_1_1_0_0_1 + 0.00190208967986745*G0_1_1_0_1_0 + 0.000286996953663616*G0_1_1_0_1_1 + 0.000130137352359575*G0_1_1_0_1_2 + 0.000130137352359575*G0_1_1_0_2_1 + 0.00190208967986745*G0_1_1_1_0_0 + 0.000286996953663616*G0_1_1_1_0_1 + 0.000130137352359575*G0_1_1_1_0_2 + 0.000286996953663616*G0_1_1_1_1_0 + 0.000286996953663621*G0_1_1_1_1_2 + 0.000130137352359575*G0_1_1_1_2_0 + 0.000286996953663621*G0_1_1_1_2_1 + 0.00190208967986746*G0_1_1_1_2_2 + 0.000130137352359575*G0_1_1_2_0_1 + 0.000130137352359575*G0_1_1_2_1_0 + 0.000286996953663621*G0_1_1_2_1_1 + 0.00190208967986746*G0_1_1_2_1_2 + 0.00190208967986746*G0_1_1_2_2_1 + 0.0212361712361713*G0_1_1_2_2_2; + A[23] = A[21] - 0.028167388167388*G0_0_0_0_0_0 + 0.00142803698359253*G0_0_0_0_0_1 - 0.00712308267863817*G0_0_0_0_0_2 + 0.00142803698359253*G0_0_0_0_1_0 + 0.000487413820747155*G0_0_0_0_1_1 - 0.00712308267863817*G0_0_0_0_2_0 + 0.00226604671049116*G0_0_0_0_2_2 + 0.00142803698359253*G0_0_0_1_0_0 + 0.000487413820747155*G0_0_0_1_0_1 + 0.000487413820747155*G0_0_0_1_1_0 - 0.000487413820747139*G0_0_0_1_1_2 - 0.000487413820747139*G0_0_0_1_2_1 - 0.00154775265886376*G0_0_0_1_2_2 - 0.00712308267863817*G0_0_0_2_0_0 + 0.00226604671049116*G0_0_0_2_0_2 - 0.000487413820747139*G0_0_0_2_1_1 - 0.00154775265886376*G0_0_0_2_1_2 + 0.00226604671049116*G0_0_0_2_2_0 - 0.00154775265886376*G0_0_0_2_2_1 + 0.0427384960718292*G0_0_0_2_2_2 + 0.0145711079044413*G0_0_1_0_0_0 - 0.00011971567527122*G0_0_1_0_0_1 - 0.00485703596814705*G0_0_1_0_0_2 - 0.00011971567527122*G0_0_1_0_1_0 + 0.000119715675271233*G0_0_1_0_1_2 - 0.00485703596814705*G0_0_1_0_2_0 + 0.000119715675271233*G0_0_1_0_2_1 - 0.00485703596814706*G0_0_1_0_2_2 - 0.00011971567527122*G0_0_1_1_0_0 + 0.000119715675271233*G0_0_1_1_0_2 + 0.000119715675271233*G0_0_1_1_2_0 - 0.00011971567527123*G0_0_1_1_2_2 - 0.00485703596814705*G0_0_1_2_0_0 + 0.000119715675271233*G0_0_1_2_0_1 - 0.00485703596814706*G0_0_1_2_0_2 + 0.000119715675271233*G0_0_1_2_1_0 - 0.00011971567527123*G0_0_1_2_1_2 - 0.00485703596814706*G0_0_1_2_2_0 - 0.00011971567527123*G0_0_1_2_2_1 + 0.0145711079044411*G0_0_1_2_2_2; + A[20] = -A[23] - 0.00187269520602862*G0_0_1_0_0_0 + 0.0016418149751483*G0_0_1_0_0_1 - 0.00174442841109509*G0_0_1_0_0_2 + 0.0016418149751483*G0_0_1_0_1_0 + 0.010782961894073*G0_0_1_0_1_1 + 0.00126129015017904*G0_0_1_0_1_2 - 0.00174442841109509*G0_0_1_0_2_0 + 0.00126129015017904*G0_0_1_0_2_1 - 0.00135107690663247*G0_0_1_0_2_2 + 0.0016418149751483*G0_0_1_1_0_0 + 0.010782961894073*G0_0_1_1_0_1 + 0.00126129015017904*G0_0_1_1_0_2 + 0.010782961894073*G0_0_1_1_1_0 + 0.117748917748918*G0_0_1_1_1_1 + 0.00268505157394047*G0_0_1_1_1_2 + 0.00126129015017904*G0_0_1_1_2_0 + 0.00268505157394047*G0_0_1_1_2_1 + 0.00494254716476936*G0_0_1_1_2_2 - 0.00174442841109509*G0_0_1_2_0_0 + 0.00126129015017904*G0_0_1_2_0_1 - 0.00135107690663247*G0_0_1_2_0_2 + 0.00126129015017904*G0_0_1_2_1_0 + 0.00268505157394047*G0_0_1_2_1_1 + 0.00494254716476936*G0_0_1_2_1_2 - 0.00135107690663247*G0_0_1_2_2_0 + 0.00494254716476936*G0_0_1_2_2_1 + 0.0288600288600286*G0_0_1_2_2_2; + A[5] = -A[20] - 0.0108000641333974*G0_0_0_0_0_0 - 0.000607129496018382*G0_0_0_0_0_1 - 0.00326652771097213*G0_0_0_0_0_2 - 0.000607129496018382*G0_0_0_0_1_0 + 0.00060712949601837*G0_0_0_0_1_1 - 0.00326652771097213*G0_0_0_0_2_0 - 0.00745657634546519*G0_0_0_0_2_2 - 0.000607129496018382*G0_0_0_1_0_0 + 0.00060712949601837*G0_0_0_1_0_1 + 0.00060712949601837*G0_0_0_1_1_0 + 0.0108000641333973*G0_0_0_1_1_1 + 0.00326652771097213*G0_0_0_1_1_2 + 0.00326652771097213*G0_0_0_1_2_1 + 0.00745657634546518*G0_0_0_1_2_2 - 0.00326652771097213*G0_0_0_2_0_0 - 0.00745657634546519*G0_0_0_2_0_2 + 0.00326652771097213*G0_0_0_2_1_1 + 0.00745657634546518*G0_0_0_2_1_2 - 0.00745657634546519*G0_0_0_2_2_0 + 0.00745657634546518*G0_0_0_2_2_1 - 0.0097482764149429*G0_0_1_0_0_0 - 0.000974827641494304*G0_0_1_0_0_2 + 0.00974827641494306*G0_0_1_0_1_1 + 0.000974827641494305*G0_0_1_0_1_2 - 0.000974827641494304*G0_0_1_0_2_0 + 0.000974827641494305*G0_0_1_0_2_1 + 0.00974827641494306*G0_0_1_1_0_1 + 0.000974827641494305*G0_0_1_1_0_2 + 0.00974827641494306*G0_0_1_1_1_0 + 0.120673400673401*G0_0_1_1_1_1 + 0.00672118005451335*G0_0_1_1_1_2 + 0.000974827641494305*G0_0_1_1_2_0 + 0.00672118005451335*G0_0_1_1_2_1 + 0.013750200416867*G0_0_1_1_2_2 - 0.000974827641494304*G0_0_1_2_0_0 + 0.000974827641494305*G0_0_1_2_0_1 + 0.000974827641494305*G0_0_1_2_1_0 + 0.00672118005451335*G0_0_1_2_1_1 + 0.013750200416867*G0_0_1_2_1_2 + 0.013750200416867*G0_0_1_2_2_1 + 0.0409940676607339*G0_0_1_2_2_2 - 0.0100689434022766*G0_1_0_0_0_0 - 0.000714018491796262*G0_1_0_0_0_1 - 0.00191545080433968*G0_1_0_0_0_2 - 0.000714018491796262*G0_1_0_0_1_0 - 0.00010688899577788*G0_1_0_0_1_1 - 0.000166746833413499*G0_1_0_0_1_2 - 0.00191545080433968*G0_1_0_0_2_0 - 0.000166746833413499*G0_1_0_0_2_1 - 0.0018684196461974*G0_1_0_0_2_2 - 0.000714018491796262*G0_1_0_1_0_0 - 0.000106888995777881*G0_1_0_1_0_1 - 0.000166746833413499*G0_1_0_1_0_2 - 0.00010688899577788*G0_1_0_1_1_0 + 0.000731120731120737*G0_1_0_1_1_1 + 0.00135107690663246*G0_1_0_1_1_2 - 0.000166746833413499*G0_1_0_1_2_0 + 0.00135107690663246*G0_1_0_1_2_1 + 0.00558815669926779*G0_1_0_1_2_2 - 0.00191545080433968*G0_1_0_2_0_0 - 0.000166746833413499*G0_1_0_2_0_1 - 0.0018684196461974*G0_1_0_2_0_2 - 0.000166746833413499*G0_1_0_2_1_0 + 0.00135107690663246*G0_1_0_2_1_1 + 0.0055881566992678*G0_1_0_2_1_2 - 0.0018684196461974*G0_1_0_2_2_0 + 0.0055881566992678*G0_1_0_2_2_1 + 0.0456629789963125*G0_1_0_2_2_2 - 0.0100689434022765*G0_1_1_0_0_0 - 0.00142803698359252*G0_1_1_0_0_1 - 0.00120143231254341*G0_1_1_0_0_2 - 0.00142803698359252*G0_1_1_0_1_0 - 0.000320666987333628*G0_1_1_0_1_1 - 0.000226604671049116*G0_1_1_0_1_2 - 0.00120143231254341*G0_1_1_0_2_0 - 0.000226604671049116*G0_1_1_0_2_1 - 0.00153492597937042*G0_1_1_0_2_2 - 0.00142803698359252*G0_1_1_1_0_0 - 0.000320666987333629*G0_1_1_1_0_1 - 0.000226604671049116*G0_1_1_1_0_2 - 0.000320666987333628*G0_1_1_1_1_0 + 0.00292448292448304*G0_1_1_1_1_1 + 0.00332210998877663*G0_1_1_1_1_2 - 0.000226604671049116*G0_1_1_1_2_0 + 0.00332210998877663*G0_1_1_1_2_1 + 0.00847415958527062*G0_1_1_1_2_2 - 0.00120143231254342*G0_1_1_2_0_0 - 0.000226604671049116*G0_1_1_2_0_1 - 0.00153492597937042*G0_1_1_2_0_2 - 0.000226604671049116*G0_1_1_2_1_0 + 0.00332210998877663*G0_1_1_2_1_1 + 0.00847415958527062*G0_1_1_2_1_2 - 0.00153492597937042*G0_1_1_2_2_0 + 0.00847415958527062*G0_1_1_2_2_1 + 0.0288985088985087*G0_1_1_2_2_2; + A[8] = -A[5] - 0.117748917748917*G0_0_1_0_0_0 - 0.010782961894073*G0_0_1_0_0_1 - 0.00268505157394045*G0_0_1_0_0_2 - 0.010782961894073*G0_0_1_0_1_0 - 0.0016418149751483*G0_0_1_0_1_1 - 0.00126129015017904*G0_0_1_0_1_2 - 0.00268505157394045*G0_0_1_0_2_0 - 0.00126129015017904*G0_0_1_0_2_1 - 0.00494254716476937*G0_0_1_0_2_2 - 0.010782961894073*G0_0_1_1_0_0 - 0.0016418149751483*G0_0_1_1_0_1 - 0.00126129015017904*G0_0_1_1_0_2 - 0.0016418149751483*G0_0_1_1_1_0 + 0.0018726952060286*G0_0_1_1_1_1 + 0.00174442841109505*G0_0_1_1_1_2 - 0.00126129015017904*G0_0_1_1_2_0 + 0.00174442841109505*G0_0_1_1_2_1 + 0.00135107690663241*G0_0_1_1_2_2 - 0.00268505157394045*G0_0_1_2_0_0 - 0.00126129015017904*G0_0_1_2_0_1 - 0.00494254716476937*G0_0_1_2_0_2 - 0.00126129015017904*G0_0_1_2_1_0 + 0.00174442841109505*G0_0_1_2_1_1 + 0.00135107690663241*G0_0_1_2_1_2 - 0.00494254716476937*G0_0_1_2_2_0 + 0.00135107690663241*G0_0_1_2_2_1 - 0.0288600288600288*G0_0_1_2_2_2 - 0.117748917748917*G0_1_1_0_0_0 - 0.010782961894073*G0_1_1_0_0_1 - 0.00268505157394045*G0_1_1_0_0_2 - 0.010782961894073*G0_1_1_0_1_0 - 0.00164181497514829*G0_1_1_0_1_1 - 0.00126129015017904*G0_1_1_0_1_2 - 0.00268505157394045*G0_1_1_0_2_0 - 0.00126129015017904*G0_1_1_0_2_1 - 0.00494254716476939*G0_1_1_0_2_2 - 0.010782961894073*G0_1_1_1_0_0 - 0.00164181497514829*G0_1_1_1_0_1 - 0.00126129015017904*G0_1_1_1_0_2 - 0.00164181497514829*G0_1_1_1_1_0 + 0.00187269520602862*G0_1_1_1_1_1 + 0.00174442841109505*G0_1_1_1_1_2 - 0.00126129015017904*G0_1_1_1_2_0 + 0.00174442841109505*G0_1_1_1_2_1 + 0.0013510769066324*G0_1_1_1_2_2 - 0.00268505157394045*G0_1_1_2_0_0 - 0.00126129015017904*G0_1_1_2_0_1 - 0.00494254716476939*G0_1_1_2_0_2 - 0.00126129015017904*G0_1_1_2_1_0 + 0.00174442841109505*G0_1_1_2_1_1 + 0.0013510769066324*G0_1_1_2_1_2 - 0.00494254716476939*G0_1_1_2_2_0 + 0.0013510769066324*G0_1_1_2_2_1 - 0.028860028860029*G0_1_1_2_2_2; + A[45] = A[5] - 0.000487413820747162*G0_0_0_0_0_1 + 0.00048741382074715*G0_0_0_0_0_2 - 0.000487413820747162*G0_0_0_0_1_0 - 0.00142803698359254*G0_0_0_0_1_1 + 0.000487413820747151*G0_0_0_0_2_0 + 0.00154775265886377*G0_0_0_0_2_2 - 0.000487413820747162*G0_0_0_1_0_0 - 0.00142803698359254*G0_0_0_1_0_1 - 0.00142803698359254*G0_0_0_1_1_0 + 0.028167388167388*G0_0_0_1_1_1 + 0.00712308267863818*G0_0_0_1_1_2 + 0.00712308267863818*G0_0_0_1_2_1 - 0.00226604671049113*G0_0_0_1_2_2 + 0.000487413820747151*G0_0_0_2_0_0 + 0.00154775265886377*G0_0_0_2_0_2 + 0.00712308267863818*G0_0_0_2_1_1 - 0.00226604671049113*G0_0_0_2_1_2 + 0.00154775265886377*G0_0_0_2_2_0 - 0.00226604671049113*G0_0_0_2_2_1 - 0.0427384960718291*G0_0_0_2_2_2 + 0.000226604671049103*G0_0_1_0_0_1 - 0.000226604671049115*G0_0_1_0_0_2 + 0.000226604671049103*G0_0_1_0_1_0 - 0.00121425899203677*G0_0_1_0_1_1 - 0.000226604671049115*G0_0_1_0_2_0 + 0.00121425899203678*G0_0_1_0_2_2 + 0.000226604671049103*G0_0_1_1_0_0 - 0.00121425899203677*G0_0_1_1_0_1 - 0.00121425899203677*G0_0_1_1_1_0 + 0.0259740259740256*G0_0_1_1_1_1 + 0.00515204959649399*G0_0_1_1_1_2 + 0.00515204959649399*G0_0_1_1_2_1 - 0.00515204959649398*G0_0_1_1_2_2 - 0.000226604671049115*G0_0_1_2_0_0 + 0.00121425899203678*G0_0_1_2_0_2 + 0.00515204959649399*G0_0_1_2_1_1 - 0.00515204959649398*G0_0_1_2_1_2 + 0.00121425899203678*G0_0_1_2_2_0 - 0.00515204959649398*G0_0_1_2_2_1 - 0.0259740259740256*G0_0_1_2_2_2 - 0.00120143231254343*G0_1_0_0_0_1 + 0.00120143231254341*G0_1_0_0_0_2 - 0.00120143231254343*G0_1_0_0_1_0 - 0.00176153065041952*G0_1_0_0_1_1 + 0.00120143231254341*G0_1_0_0_2_0 + 0.00176153065041952*G0_1_0_0_2_2 - 0.00120143231254343*G0_1_0_1_0_0 - 0.00176153065041953*G0_1_0_1_0_1 - 0.00176153065041953*G0_1_0_1_1_0 + 0.0449318582651915*G0_1_0_1_1_1 + 0.00423707979263532*G0_1_0_1_1_2 + 0.00423707979263532*G0_1_0_1_2_1 - 0.00423707979263534*G0_1_0_1_2_2 + 0.00120143231254341*G0_1_0_2_0_0 + 0.00176153065041952*G0_1_0_2_0_2 + 0.00423707979263532*G0_1_0_2_1_1 - 0.00423707979263534*G0_1_0_2_1_2 + 0.00176153065041952*G0_1_0_2_2_0 - 0.00423707979263534*G0_1_0_2_2_1 - 0.0449318582651916*G0_1_0_2_2_2 - 0.000487413820747166*G0_1_1_0_0_1 + 0.000487413820747144*G0_1_1_0_0_2 - 0.000487413820747165*G0_1_1_0_1_0 - 0.00154775265886376*G0_1_1_0_1_1 + 0.000487413820747144*G0_1_1_0_2_0 + 0.00142803698359254*G0_1_1_0_2_2 - 0.000487413820747165*G0_1_1_1_0_0 - 0.00154775265886376*G0_1_1_1_0_1 - 0.00154775265886376*G0_1_1_1_1_0 + 0.0427384960718291*G0_1_1_1_1_1 + 0.00226604671049114*G0_1_1_1_1_2 + 0.00226604671049114*G0_1_1_1_2_1 - 0.00712308267863817*G0_1_1_1_2_2 + 0.000487413820747144*G0_1_1_2_0_0 + 0.00142803698359254*G0_1_1_2_0_2 + 0.00226604671049114*G0_1_1_2_1_1 - 0.00712308267863817*G0_1_1_2_1_2 + 0.00142803698359254*G0_1_1_2_2_0 - 0.00712308267863817*G0_1_1_2_2_1 - 0.028167388167388*G0_1_1_2_2_2; + A[165] = -A[45] - 0.117748917748918*G0_0_0_0_0_0 - 0.00268505157394048*G0_0_0_0_0_1 - 0.0107829618940729*G0_0_0_0_0_2 - 0.00268505157394048*G0_0_0_0_1_0 - 0.00494254716476937*G0_0_0_0_1_1 - 0.00126129015017904*G0_0_0_0_1_2 - 0.0107829618940729*G0_0_0_0_2_0 - 0.00126129015017904*G0_0_0_0_2_1 - 0.00164181497514829*G0_0_0_0_2_2 - 0.00268505157394048*G0_0_0_1_0_0 - 0.00494254716476937*G0_0_0_1_0_1 - 0.00126129015017904*G0_0_0_1_0_2 - 0.00494254716476937*G0_0_0_1_1_0 - 0.0288600288600288*G0_0_0_1_1_1 + 0.00135107690663245*G0_0_0_1_1_2 - 0.00126129015017904*G0_0_0_1_2_0 + 0.00135107690663245*G0_0_0_1_2_1 + 0.00174442841109508*G0_0_0_1_2_2 - 0.0107829618940729*G0_0_0_2_0_0 - 0.00126129015017904*G0_0_0_2_0_1 - 0.00164181497514829*G0_0_0_2_0_2 - 0.00126129015017904*G0_0_0_2_1_0 + 0.00135107690663245*G0_0_0_2_1_1 + 0.00174442841109508*G0_0_0_2_1_2 - 0.00164181497514828*G0_0_0_2_2_0 + 0.00174442841109508*G0_0_0_2_2_1 + 0.00187269520602859*G0_0_0_2_2_2 - 0.117748917748918*G0_0_1_0_0_0 - 0.00268505157394047*G0_0_1_0_0_1 - 0.0107829618940729*G0_0_1_0_0_2 - 0.00268505157394047*G0_0_1_0_1_0 - 0.00494254716476936*G0_0_1_0_1_1 - 0.00126129015017903*G0_0_1_0_1_2 - 0.0107829618940729*G0_0_1_0_2_0 - 0.00126129015017903*G0_0_1_0_2_1 - 0.00164181497514828*G0_0_1_0_2_2 - 0.00268505157394047*G0_0_1_1_0_0 - 0.00494254716476936*G0_0_1_1_0_1 - 0.00126129015017903*G0_0_1_1_0_2 - 0.00494254716476936*G0_0_1_1_1_0 - 0.0288600288600288*G0_0_1_1_1_1 + 0.00135107690663244*G0_0_1_1_1_2 - 0.00126129015017903*G0_0_1_1_2_0 + 0.00135107690663244*G0_0_1_1_2_1 + 0.00174442841109507*G0_0_1_1_2_2 - 0.0107829618940729*G0_0_1_2_0_0 - 0.00126129015017903*G0_0_1_2_0_1 - 0.00164181497514828*G0_0_1_2_0_2 - 0.00126129015017903*G0_0_1_2_1_0 + 0.00135107690663244*G0_0_1_2_1_1 + 0.00174442841109507*G0_0_1_2_1_2 - 0.00164181497514828*G0_0_1_2_2_0 + 0.00174442841109507*G0_0_1_2_2_1 + 0.00187269520602864*G0_0_1_2_2_2; + A[75] = A[5] + 0.000714018491796264*G0_0_1_0_0_1 - 0.000714018491796267*G0_0_1_0_0_2 + 0.000714018491796264*G0_0_1_0_1_0 + 0.000213777991555767*G0_0_1_0_1_1 - 0.000714018491796267*G0_0_1_0_2_0 - 0.000333493666826981*G0_0_1_0_2_2 + 0.000714018491796264*G0_0_1_1_0_0 + 0.000213777991555767*G0_0_1_1_0_1 + 0.000213777991555768*G0_0_1_1_1_0 - 0.00219336219336224*G0_0_1_1_1_1 - 0.00197103308214417*G0_0_1_1_1_2 - 0.00197103308214417*G0_0_1_1_2_1 - 0.00288600288600283*G0_0_1_1_2_2 - 0.000714018491796267*G0_0_1_2_0_0 - 0.000333493666826982*G0_0_1_2_0_2 - 0.00197103308214417*G0_0_1_2_1_1 - 0.00288600288600283*G0_0_1_2_1_2 - 0.000333493666826982*G0_0_1_2_2_0 - 0.00288600288600283*G0_0_1_2_2_1 + 0.0167644700978037*G0_0_1_2_2_2 - 0.000714018491796265*G0_1_0_0_0_1 + 0.000714018491796267*G0_1_0_0_0_2 - 0.000714018491796265*G0_1_0_0_1_0 - 0.000213777991555768*G0_1_0_0_1_1 + 0.000714018491796267*G0_1_0_0_2_0 + 0.000333493666826982*G0_1_0_0_2_2 - 0.000714018491796264*G0_1_0_1_0_0 - 0.000213777991555767*G0_1_0_1_0_1 - 0.000213777991555768*G0_1_0_1_1_0 + 0.00219336219336224*G0_1_0_1_1_1 + 0.00197103308214417*G0_1_0_1_1_2 + 0.00197103308214417*G0_1_0_1_2_1 + 0.00288600288600283*G0_1_0_1_2_2 + 0.000714018491796267*G0_1_0_2_0_0 + 0.000333493666826982*G0_1_0_2_0_2 + 0.00197103308214417*G0_1_0_2_1_1 + 0.00288600288600283*G0_1_0_2_1_2 + 0.000333493666826982*G0_1_0_2_2_0 + 0.00288600288600283*G0_1_0_2_2_1 - 0.0167644700978037*G0_1_0_2_2_2; + A[120] = -A[75] - 0.117748917748917*G0_1_0_0_0_0 - 0.010782961894073*G0_1_0_0_0_1 - 0.00268505157394045*G0_1_0_0_0_2 - 0.010782961894073*G0_1_0_0_1_0 - 0.0016418149751483*G0_1_0_0_1_1 - 0.00126129015017904*G0_1_0_0_1_2 - 0.00268505157394045*G0_1_0_0_2_0 - 0.00126129015017904*G0_1_0_0_2_1 - 0.00494254716476937*G0_1_0_0_2_2 - 0.010782961894073*G0_1_0_1_0_0 - 0.0016418149751483*G0_1_0_1_0_1 - 0.00126129015017904*G0_1_0_1_0_2 - 0.0016418149751483*G0_1_0_1_1_0 + 0.0018726952060286*G0_1_0_1_1_1 + 0.00174442841109505*G0_1_0_1_1_2 - 0.00126129015017904*G0_1_0_1_2_0 + 0.00174442841109505*G0_1_0_1_2_1 + 0.00135107690663241*G0_1_0_1_2_2 - 0.00268505157394045*G0_1_0_2_0_0 - 0.00126129015017904*G0_1_0_2_0_1 - 0.00494254716476937*G0_1_0_2_0_2 - 0.00126129015017904*G0_1_0_2_1_0 + 0.00174442841109505*G0_1_0_2_1_1 + 0.00135107690663241*G0_1_0_2_1_2 - 0.00494254716476937*G0_1_0_2_2_0 + 0.00135107690663242*G0_1_0_2_2_1 - 0.0288600288600288*G0_1_0_2_2_2 - 0.117748917748917*G0_1_1_0_0_0 - 0.010782961894073*G0_1_1_0_0_1 - 0.00268505157394045*G0_1_1_0_0_2 - 0.010782961894073*G0_1_1_0_1_0 - 0.00164181497514829*G0_1_1_0_1_1 - 0.00126129015017904*G0_1_1_0_1_2 - 0.00268505157394045*G0_1_1_0_2_0 - 0.00126129015017904*G0_1_1_0_2_1 - 0.00494254716476939*G0_1_1_0_2_2 - 0.010782961894073*G0_1_1_1_0_0 - 0.00164181497514829*G0_1_1_1_0_1 - 0.00126129015017904*G0_1_1_1_0_2 - 0.00164181497514829*G0_1_1_1_1_0 + 0.00187269520602862*G0_1_1_1_1_1 + 0.00174442841109505*G0_1_1_1_1_2 - 0.00126129015017904*G0_1_1_1_2_0 + 0.00174442841109505*G0_1_1_1_2_1 + 0.0013510769066324*G0_1_1_1_2_2 - 0.00268505157394045*G0_1_1_2_0_0 - 0.00126129015017904*G0_1_1_2_0_1 - 0.00494254716476939*G0_1_1_2_0_2 - 0.00126129015017904*G0_1_1_2_1_0 + 0.00174442841109505*G0_1_1_2_1_1 + 0.0013510769066324*G0_1_1_2_1_2 - 0.00494254716476939*G0_1_1_2_2_0 + 0.0013510769066324*G0_1_1_2_2_1 - 0.028860028860029*G0_1_1_2_2_2; + A[24] = -A[20] - 0.0584896584896583*G0_0_0_0_0_0 - 0.00330073218962107*G0_0_0_0_0_1 - 0.00847415958527065*G0_0_0_0_0_2 - 0.00330073218962107*G0_0_0_0_1_0 - 0.00076960076960079*G0_0_0_0_1_1 - 0.000867938645716422*G0_0_0_0_1_2 - 0.00847415958527065*G0_0_0_0_2_0 - 0.000867938645716422*G0_0_0_0_2_1 - 0.00716583827694935*G0_0_0_0_2_2 - 0.00330073218962107*G0_0_0_1_0_0 - 0.00076960076960079*G0_0_0_1_0_1 - 0.000867938645716421*G0_0_0_1_0_2 - 0.000769600769600787*G0_0_0_1_1_0 - 0.0976110309443641*G0_0_0_1_1_1 - 0.00743947410614075*G0_0_0_1_1_2 - 0.000867938645716421*G0_0_0_1_2_0 - 0.00743947410614075*G0_0_0_1_2_1 + 0.000547271658382759*G0_0_0_1_2_2 - 0.00847415958527065*G0_0_0_2_0_0 - 0.000867938645716422*G0_0_0_2_0_1 - 0.00716583827694935*G0_0_0_2_0_2 - 0.000867938645716422*G0_0_0_2_1_0 - 0.00743947410614075*G0_0_0_2_1_1 + 0.000547271658382759*G0_0_0_2_1_2 - 0.00716583827694935*G0_0_0_2_2_0 + 0.000547271658382759*G0_0_0_2_2_1 - 0.0467147667147665*G0_0_0_2_2_2 - 0.0117748917748917*G0_0_1_0_0_0 - 0.00384800384800382*G0_0_1_0_0_1 - 0.00130832130832131*G0_0_1_0_0_2 - 0.00384800384800383*G0_0_1_0_1_0 + 0.00666987333654*G0_0_1_0_1_1 - 0.00130832130832131*G0_0_1_0_2_0 + 0.0013083213083213*G0_0_1_0_2_2 - 0.00384800384800383*G0_0_1_1_0_0 + 0.00666987333654*G0_0_1_1_0_1 + 0.00666987333654*G0_0_1_1_1_0 - 0.00666987333653995*G0_0_1_1_1_2 - 0.00666987333653995*G0_0_1_1_2_1 + 0.00384800384800382*G0_0_1_1_2_2 - 0.00130832130832131*G0_0_1_2_0_0 + 0.0013083213083213*G0_0_1_2_0_2 - 0.00666987333653995*G0_0_1_2_1_1 + 0.00384800384800382*G0_0_1_2_1_2 + 0.0013083213083213*G0_0_1_2_2_0 + 0.00384800384800382*G0_0_1_2_2_1 + 0.0117748917748917*G0_0_1_2_2_2; + A[3] = A[45] - 0.000714018491796268*G0_0_1_0_0_1 + 0.000714018491796258*G0_0_1_0_0_2 - 0.000714018491796268*G0_0_1_0_1_0 - 0.000333493666826988*G0_0_1_0_1_1 + 0.000714018491796258*G0_0_1_0_2_0 + 0.000213777991555757*G0_0_1_0_2_2 - 0.000714018491796268*G0_0_1_1_0_0 - 0.000333493666826988*G0_0_1_1_0_1 - 0.000333493666826989*G0_0_1_1_1_0 + 0.0167644700978036*G0_0_1_1_1_1 - 0.00288600288600284*G0_0_1_1_1_2 - 0.00288600288600284*G0_0_1_1_2_1 - 0.00197103308214418*G0_0_1_1_2_2 + 0.000714018491796258*G0_0_1_2_0_0 + 0.000213777991555757*G0_0_1_2_0_2 - 0.00288600288600284*G0_0_1_2_1_1 - 0.00197103308214418*G0_0_1_2_1_2 + 0.000213777991555757*G0_0_1_2_2_0 - 0.00197103308214418*G0_0_1_2_2_1 - 0.0021933621933623*G0_0_1_2_2_2 + 0.000714018491796268*G0_1_0_0_0_1 - 0.000714018491796257*G0_1_0_0_0_2 + 0.000714018491796268*G0_1_0_0_1_0 + 0.000333493666826988*G0_1_0_0_1_1 - 0.000714018491796257*G0_1_0_0_2_0 - 0.000213777991555757*G0_1_0_0_2_2 + 0.000714018491796268*G0_1_0_1_0_0 + 0.000333493666826988*G0_1_0_1_0_1 + 0.000333493666826989*G0_1_0_1_1_0 - 0.0167644700978036*G0_1_0_1_1_1 + 0.00288600288600284*G0_1_0_1_1_2 + 0.00288600288600284*G0_1_0_1_2_1 + 0.00197103308214418*G0_1_0_1_2_2 - 0.000714018491796258*G0_1_0_2_0_0 - 0.000213777991555757*G0_1_0_2_0_2 + 0.00288600288600284*G0_1_0_2_1_1 + 0.00197103308214418*G0_1_0_2_1_2 - 0.000213777991555757*G0_1_0_2_2_0 + 0.00197103308214418*G0_1_0_2_2_1 + 0.0021933621933623*G0_1_0_2_2_2; + A[11] = -A[3] - 0.117748917748918*G0_0_0_0_0_0 - 0.00268505157394048*G0_0_0_0_0_1 - 0.0107829618940729*G0_0_0_0_0_2 - 0.00268505157394048*G0_0_0_0_1_0 - 0.00494254716476937*G0_0_0_0_1_1 - 0.00126129015017904*G0_0_0_0_1_2 - 0.0107829618940729*G0_0_0_0_2_0 - 0.00126129015017904*G0_0_0_0_2_1 - 0.00164181497514828*G0_0_0_0_2_2 - 0.00268505157394048*G0_0_0_1_0_0 - 0.00494254716476937*G0_0_0_1_0_1 - 0.00126129015017904*G0_0_0_1_0_2 - 0.00494254716476937*G0_0_0_1_1_0 - 0.0288600288600288*G0_0_0_1_1_1 + 0.00135107690663245*G0_0_0_1_1_2 - 0.00126129015017904*G0_0_0_1_2_0 + 0.00135107690663245*G0_0_0_1_2_1 + 0.00174442841109508*G0_0_0_1_2_2 - 0.0107829618940729*G0_0_0_2_0_0 - 0.00126129015017904*G0_0_0_2_0_1 - 0.00164181497514828*G0_0_0_2_0_2 - 0.00126129015017904*G0_0_0_2_1_0 + 0.00135107690663245*G0_0_0_2_1_1 + 0.00174442841109508*G0_0_0_2_1_2 - 0.00164181497514828*G0_0_0_2_2_0 + 0.00174442841109508*G0_0_0_2_2_1 + 0.00187269520602859*G0_0_0_2_2_2 - 0.117748917748918*G0_1_0_0_0_0 - 0.00268505157394047*G0_1_0_0_0_1 - 0.0107829618940729*G0_1_0_0_0_2 - 0.00268505157394047*G0_1_0_0_1_0 - 0.00494254716476936*G0_1_0_0_1_1 - 0.00126129015017903*G0_1_0_0_1_2 - 0.0107829618940729*G0_1_0_0_2_0 - 0.00126129015017903*G0_1_0_0_2_1 - 0.00164181497514828*G0_1_0_0_2_2 - 0.00268505157394047*G0_1_0_1_0_0 - 0.00494254716476936*G0_1_0_1_0_1 - 0.00126129015017903*G0_1_0_1_0_2 - 0.00494254716476936*G0_1_0_1_1_0 - 0.0288600288600288*G0_1_0_1_1_1 + 0.00135107690663244*G0_1_0_1_1_2 - 0.00126129015017903*G0_1_0_1_2_0 + 0.00135107690663244*G0_1_0_1_2_1 + 0.00174442841109507*G0_1_0_1_2_2 - 0.0107829618940729*G0_1_0_2_0_0 - 0.00126129015017903*G0_1_0_2_0_1 - 0.00164181497514828*G0_1_0_2_0_2 - 0.00126129015017903*G0_1_0_2_1_0 + 0.00135107690663244*G0_1_0_2_1_1 + 0.00174442841109507*G0_1_0_2_1_2 - 0.00164181497514828*G0_1_0_2_2_0 + 0.00174442841109507*G0_1_0_2_2_1 + 0.00187269520602865*G0_1_0_2_2_2; + A[128] = -A[125] - 0.0076960076960076*G0_0_1_0_0_0 - 0.00256533589866918*G0_0_1_0_0_1 - 0.0123136123136123*G0_0_1_0_0_2 - 0.00256533589866918*G0_0_1_0_1_0 - 0.00256533589866917*G0_0_1_0_1_1 - 0.00615680615680614*G0_0_1_0_1_2 - 0.0123136123136123*G0_0_1_0_2_0 - 0.00615680615680614*G0_0_1_0_2_1 - 0.02667949334616*G0_0_1_0_2_2 - 0.00256533589866918*G0_0_1_1_0_0 - 0.00256533589866917*G0_0_1_1_0_1 - 0.00615680615680614*G0_0_1_1_0_2 - 0.00256533589866917*G0_0_1_1_1_0 - 0.00769600769600748*G0_0_1_1_1_1 - 0.0123136123136123*G0_0_1_1_1_2 - 0.00615680615680614*G0_0_1_1_2_0 - 0.0123136123136123*G0_0_1_1_2_1 - 0.02667949334616*G0_0_1_1_2_2 - 0.0123136123136123*G0_0_1_2_0_0 - 0.00615680615680614*G0_0_1_2_0_1 - 0.02667949334616*G0_0_1_2_0_2 - 0.00615680615680614*G0_0_1_2_1_0 - 0.0123136123136123*G0_0_1_2_1_1 - 0.0266794933461599*G0_0_1_2_1_2 - 0.02667949334616*G0_0_1_2_2_0 - 0.0266794933461599*G0_0_1_2_2_1 + 0.301683501683499*G0_0_1_2_2_2 + 0.208613115279781*G0_1_1_0_0_0 + 0.0515119448452779*G0_1_1_0_0_1 + 0.0559243225909892*G0_1_1_0_0_2 + 0.0515119448452779*G0_1_1_0_1_0 + 0.0334861845972956*G0_1_1_0_1_1 + 0.0165891721447277*G0_1_1_0_1_2 + 0.0559243225909892*G0_1_1_0_2_0 + 0.0165891721447277*G0_1_1_0_2_1 + 0.0855111966223077*G0_1_1_0_2_2 + 0.0515119448452779*G0_1_1_1_0_0 + 0.0334861845972956*G0_1_1_1_0_1 + 0.0165891721447277*G0_1_1_1_0_2 + 0.0334861845972956*G0_1_1_1_1_0 + 0.0463812730479398*G0_1_1_1_1_1 + 0.0104323659879215*G0_1_1_1_1_2 + 0.0165891721447277*G0_1_1_1_2_0 + 0.0104323659879215*G0_1_1_1_2_1 + 0.0294158516380738*G0_1_1_1_2_2 + 0.0559243225909892*G0_1_1_2_0_0 + 0.0165891721447277*G0_1_1_2_0_1 + 0.0855111966223077*G0_1_1_2_0_2 + 0.0165891721447277*G0_1_1_2_1_0 + 0.0104323659879215*G0_1_1_2_1_1 + 0.0294158516380738*G0_1_1_2_1_2 + 0.0855111966223076*G0_1_1_2_2_0 + 0.0294158516380738*G0_1_1_2_2_1 + 0.539746673080004*G0_1_1_2_2_2; + A[63] = -A[71] - 0.01341670675004*G0_0_0_0_0_0 - 0.00900432900432896*G0_0_0_0_0_1 - 0.0249863716530382*G0_0_0_0_0_2 - 0.00900432900432896*G0_0_0_0_1_0 - 0.0148789482122815*G0_0_0_0_1_1 - 0.00715728715728715*G0_0_0_0_1_2 - 0.0249863716530382*G0_0_0_0_2_0 - 0.00715728715728715*G0_0_0_0_2_1 - 0.0615424082090745*G0_0_0_0_2_2 - 0.00900432900432896*G0_0_0_1_0_0 - 0.0148789482122815*G0_0_0_1_0_1 - 0.00715728715728715*G0_0_0_1_0_2 - 0.0148789482122815*G0_0_0_1_1_0 + 0.0143658810325473*G0_0_0_1_1_1 + 0.0118005451338783*G0_0_0_1_1_2 - 0.00715728715728715*G0_0_0_1_2_0 + 0.0118005451338783*G0_0_0_1_2_1 - 0.0159307359307359*G0_0_0_1_2_2 - 0.0249863716530382*G0_0_0_2_0_0 - 0.00715728715728715*G0_0_0_2_0_1 - 0.0615424082090745*G0_0_0_2_0_2 - 0.00715728715728715*G0_0_0_2_1_0 + 0.0118005451338783*G0_0_0_2_1_1 - 0.0159307359307359*G0_0_0_2_1_2 - 0.0615424082090745*G0_0_0_2_2_0 - 0.0159307359307359*G0_0_0_2_2_1 - 0.342421035754367*G0_0_0_2_2_2 - 0.00885040885040872*G0_1_0_0_0_0 - 0.00923520923520917*G0_1_0_0_0_1 + 0.00115440115440112*G0_1_0_0_0_2 - 0.00923520923520917*G0_1_0_0_1_0 + 0.00718294051627396*G0_1_0_0_1_1 + 0.01333974667308*G0_1_0_0_1_2 + 0.00115440115440112*G0_1_0_0_2_0 + 0.01333974667308*G0_1_0_0_2_1 + 0.00525893859227189*G0_1_0_0_2_2 - 0.00923520923520917*G0_1_0_1_0_0 + 0.00718294051627396*G0_1_0_1_0_1 + 0.01333974667308*G0_1_0_1_0_2 + 0.00718294051627396*G0_1_0_1_1_0 + 0.469456469456469*G0_1_0_1_1_1 + 0.115953182619849*G0_1_0_1_1_2 + 0.01333974667308*G0_1_0_1_2_0 + 0.115953182619849*G0_1_0_1_2_1 + 0.0625941959275291*G0_1_0_1_2_2 + 0.00115440115440112*G0_1_0_2_0_0 + 0.01333974667308*G0_1_0_2_0_1 + 0.00525893859227189*G0_1_0_2_0_2 + 0.01333974667308*G0_1_0_2_1_0 + 0.115953182619849*G0_1_0_2_1_1 + 0.0625941959275291*G0_1_0_2_1_2 + 0.00525893859227189*G0_1_0_2_2_0 + 0.0625941959275291*G0_1_0_2_2_1 + 0.0280904280904281*G0_1_0_2_2_2; + A[77] = -A[122] - 0.044508577841911*G0_1_1_0_0_0 - 0.0148361926139703*G0_1_1_0_0_1 - 0.00696916252471806*G0_1_1_0_0_2 - 0.0148361926139703*G0_1_1_0_1_0 - 0.0148361926139703*G0_1_1_0_1_1 - 0.00348458126235903*G0_1_1_0_1_2 - 0.00696916252471805*G0_1_1_0_2_0 - 0.00348458126235903*G0_1_1_0_2_1 - 0.01000481000481*G0_1_1_0_2_2 - 0.0148361926139703*G0_1_1_1_0_0 - 0.0148361926139703*G0_1_1_1_0_1 - 0.00348458126235903*G0_1_1_1_0_2 - 0.0148361926139703*G0_1_1_1_1_0 - 0.0445085778419112*G0_1_1_1_1_1 - 0.00696916252471806*G0_1_1_1_1_2 - 0.00348458126235903*G0_1_1_1_2_0 - 0.00696916252471806*G0_1_1_1_2_1 - 0.01000481000481*G0_1_1_1_2_2 - 0.00696916252471806*G0_1_1_2_0_0 - 0.00348458126235903*G0_1_1_2_0_1 - 0.01000481000481*G0_1_1_2_0_2 - 0.00348458126235903*G0_1_1_2_1_0 - 0.00696916252471806*G0_1_1_2_1_1 - 0.01000481000481*G0_1_1_2_1_2 - 0.01000481000481*G0_1_1_2_2_0 - 0.01000481000481*G0_1_1_2_2_1 - 0.224082090748756*G0_1_1_2_2_2; + A[171] = -A[51] - 0.157922077922077*G0_0_0_0_0_0 + 0.0100903212014323*G0_0_0_0_0_1 - 0.0463128640906415*G0_0_0_0_0_2 + 0.0100903212014323*G0_0_0_0_1_0 + 0.00875634653412432*G0_0_0_0_1_1 + 0.00147079258190369*G0_0_0_0_1_2 - 0.0463128640906415*G0_0_0_0_2_0 + 0.00147079258190369*G0_0_0_0_2_1 - 0.0183678050344715*G0_0_0_0_2_2 + 0.0100903212014323*G0_0_0_1_0_0 + 0.00875634653412432*G0_0_0_1_0_1 + 0.00147079258190369*G0_0_0_1_0_2 + 0.00875634653412432*G0_0_0_1_1_0 - 0.00205226871893543*G0_0_0_1_1_1 - 0.00670407781518895*G0_0_0_1_1_2 + 0.00147079258190369*G0_0_0_1_2_0 - 0.00670407781518895*G0_0_0_1_2_1 - 0.00379669713003048*G0_0_0_1_2_2 - 0.0463128640906415*G0_0_0_2_0_0 + 0.00147079258190369*G0_0_0_2_0_1 - 0.0183678050344715*G0_0_0_2_0_2 + 0.00147079258190369*G0_0_0_2_1_0 - 0.00670407781518895*G0_0_0_2_1_1 - 0.00379669713003048*G0_0_0_2_1_2 - 0.0183678050344715*G0_0_0_2_2_0 - 0.00379669713003048*G0_0_0_2_2_1 - 0.0184704184704181*G0_0_0_2_2_2 + 0.0924547057880398*G0_0_1_0_0_0 - 0.000205226871893453*G0_0_1_0_0_1 - 0.0154946288279619*G0_0_1_0_0_2 - 0.000205226871893455*G0_0_1_0_1_0 + 0.00335203890759448*G0_0_1_0_1_1 + 0.00136817914595693*G0_0_1_0_1_2 - 0.0154946288279619*G0_0_1_0_2_0 + 0.00136817914595693*G0_0_1_0_2_1 - 0.0107060018171128*G0_0_1_0_2_2 - 0.000205226871893455*G0_0_1_1_0_0 + 0.00335203890759448*G0_0_1_1_0_1 + 0.00136817914595693*G0_0_1_1_0_2 + 0.00335203890759448*G0_0_1_1_1_0 - 0.00335203890759445*G0_0_1_1_1_2 + 0.00136817914595693*G0_0_1_1_2_0 - 0.00335203890759445*G0_0_1_1_2_1 - 0.00253113142002032*G0_0_1_1_2_2 - 0.0154946288279619*G0_0_1_2_0_0 + 0.00136817914595693*G0_0_1_2_0_1 - 0.0107060018171128*G0_0_1_2_0_2 + 0.00136817914595693*G0_0_1_2_1_0 - 0.00335203890759445*G0_0_1_2_1_1 - 0.00253113142002032*G0_0_1_2_1_2 - 0.0107060018171128*G0_0_1_2_2_0 - 0.00253113142002032*G0_0_1_2_2_1 - 0.0138528138528139*G0_0_1_2_2_2; + A[101] = A[171] - 0.0831168831168835*G0_0_1_0_0_0 + 0.00324942547164759*G0_0_1_0_0_1 + 0.0121425899203676*G0_0_1_0_0_2 + 0.0032494254716476*G0_0_1_0_1_0 - 0.000307840307840383*G0_0_1_0_1_1 - 0.000684089572978468*G0_0_1_0_1_2 + 0.0121425899203676*G0_0_1_0_2_0 - 0.000684089572978468*G0_0_1_0_2_1 + 0.00885895997007101*G0_0_1_0_2_2 + 0.0032494254716476*G0_0_1_1_0_0 - 0.000307840307840382*G0_0_1_1_0_1 - 0.000684089572978468*G0_0_1_1_0_2 - 0.000307840307840382*G0_0_1_1_1_0 + 0.00933782267115592*G0_0_1_1_1_1 - 0.000684089572978468*G0_0_1_1_2_0 + 0.00068408957297849*G0_0_1_1_2_2 + 0.0121425899203676*G0_0_1_2_0_0 - 0.000684089572978468*G0_0_1_2_0_1 + 0.00885895997007101*G0_0_1_2_0_2 - 0.000684089572978468*G0_0_1_2_1_0 + 0.00068408957297849*G0_0_1_2_1_2 + 0.00885895997007101*G0_0_1_2_2_0 + 0.000684089572978489*G0_0_1_2_2_1 + 0.00400192400192401*G0_0_1_2_2_2 + 0.0831168831168835*G0_1_0_0_0_0 - 0.00324942547164759*G0_1_0_0_0_1 - 0.0121425899203676*G0_1_0_0_0_2 - 0.0032494254716476*G0_1_0_0_1_0 + 0.000307840307840382*G0_1_0_0_1_1 + 0.000684089572978468*G0_1_0_0_1_2 - 0.0121425899203676*G0_1_0_0_2_0 + 0.000684089572978467*G0_1_0_0_2_1 - 0.00885895997007102*G0_1_0_0_2_2 - 0.0032494254716476*G0_1_0_1_0_0 + 0.000307840307840381*G0_1_0_1_0_1 + 0.000684089572978467*G0_1_0_1_0_2 + 0.000307840307840382*G0_1_0_1_1_0 - 0.00933782267115592*G0_1_0_1_1_1 + 0.000684089572978468*G0_1_0_1_2_0 - 0.00068408957297849*G0_1_0_1_2_2 - 0.0121425899203676*G0_1_0_2_0_0 + 0.000684089572978467*G0_1_0_2_0_1 - 0.00885895997007102*G0_1_0_2_0_2 + 0.000684089572978467*G0_1_0_2_1_0 - 0.00068408957297849*G0_1_0_2_1_2 - 0.00885895997007101*G0_1_0_2_2_0 - 0.00068408957297849*G0_1_0_2_2_1 - 0.00400192400192401*G0_1_0_2_2_2; + A[129] = A[101] + 0.111848645181978*G0_0_0_0_0_0 - 0.00697771364438032*G0_0_0_0_0_1 + 0.030578803912137*G0_0_0_0_0_2 - 0.00697771364438032*G0_0_0_0_1_0 - 0.00670407781518894*G0_0_0_0_1_1 - 0.00212067767623323*G0_0_0_0_1_2 + 0.030578803912137*G0_0_0_0_2_0 - 0.00212067767623323*G0_0_0_0_2_1 + 0.00991929880818758*G0_0_0_0_2_2 - 0.00697771364438032*G0_0_0_1_0_0 - 0.00670407781518894*G0_0_0_1_0_1 - 0.00212067767623323*G0_0_0_1_0_2 - 0.00670407781518894*G0_0_0_1_1_0 - 0.0322206188872855*G0_0_0_1_1_1 - 0.00622521511410399*G0_0_0_1_1_2 - 0.00212067767623323*G0_0_0_1_2_0 - 0.00622521511410399*G0_0_0_1_2_1 + 0.00157340601785043*G0_0_0_1_2_2 + 0.030578803912137*G0_0_0_2_0_0 - 0.00212067767623323*G0_0_0_2_0_1 + 0.00991929880818758*G0_0_0_2_0_2 - 0.00212067767623323*G0_0_0_2_1_0 - 0.00622521511410399*G0_0_0_2_1_1 + 0.00157340601785043*G0_0_0_2_1_2 + 0.00991929880818758*G0_0_0_2_2_0 + 0.00157340601785043*G0_0_0_2_2_1 + 0.00205226871893491*G0_0_0_2_2_2 + 0.00311260755705197*G0_0_1_0_0_1 - 0.00311260755705199*G0_0_1_0_0_2 + 0.00311260755705197*G0_0_1_0_1_0 + 0.00140238362460589*G0_0_1_0_1_1 - 0.00311260755705199*G0_0_1_0_2_0 - 0.00140238362460586*G0_0_1_0_2_2 + 0.00311260755705197*G0_0_1_1_0_0 + 0.00140238362460589*G0_0_1_1_0_1 + 0.00140238362460589*G0_0_1_1_1_0 - 0.0244219977553308*G0_0_1_1_1_1 - 0.00407033295922185*G0_0_1_1_1_2 - 0.00407033295922185*G0_0_1_1_2_1 + 0.00407033295922183*G0_0_1_1_2_2 - 0.00311260755705199*G0_0_1_2_0_0 - 0.00140238362460586*G0_0_1_2_0_2 - 0.00407033295922185*G0_0_1_2_1_1 + 0.00407033295922183*G0_0_1_2_1_2 - 0.00140238362460586*G0_0_1_2_2_0 + 0.00407033295922183*G0_0_1_2_2_1 + 0.0244219977553307*G0_0_1_2_2_2 - 0.00578055689166799*G0_1_0_0_0_1 + 0.00578055689166791*G0_1_0_0_0_2 - 0.00578055689166799*G0_1_0_0_1_0 - 0.0077644166533055*G0_1_0_0_1_1 + 0.00578055689166791*G0_1_0_0_2_0 + 0.00776441665330548*G0_1_0_0_2_2 - 0.00578055689166799*G0_1_0_1_0_0 - 0.0077644166533055*G0_1_0_1_0_1 - 0.0077644166533055*G0_1_0_1_1_0 - 0.0190860990860989*G0_1_0_1_1_1 - 0.00475442253220025*G0_1_0_1_1_2 - 0.00475442253220025*G0_1_0_1_2_1 + 0.0047544225322003*G0_1_0_1_2_2 + 0.00578055689166791*G0_1_0_2_0_0 + 0.00776441665330548*G0_1_0_2_0_2 - 0.00475442253220025*G0_1_0_2_1_1 + 0.0047544225322003*G0_1_0_2_1_2 + 0.00776441665330548*G0_1_0_2_2_0 + 0.0047544225322003*G0_1_0_2_2_1 + 0.0190860990860988*G0_1_0_2_2_2 - 0.111848645181978*G0_1_1_0_0_0 - 0.0305788039121371*G0_1_1_0_0_1 + 0.00697771364438034*G0_1_1_0_0_2 - 0.0305788039121371*G0_1_1_0_1_0 - 0.00991929880818761*G0_1_1_0_1_1 + 0.00212067767623324*G0_1_1_0_1_2 + 0.00697771364438034*G0_1_1_0_2_0 + 0.00212067767623324*G0_1_1_0_2_1 + 0.00670407781518891*G0_1_1_0_2_2 - 0.0305788039121371*G0_1_1_1_0_0 - 0.00991929880818761*G0_1_1_1_0_1 + 0.00212067767623324*G0_1_1_1_0_2 - 0.00991929880818761*G0_1_1_1_1_0 - 0.00205226871893517*G0_1_1_1_1_1 - 0.00157340601785042*G0_1_1_1_1_2 + 0.00212067767623324*G0_1_1_1_2_0 - 0.00157340601785042*G0_1_1_1_2_1 + 0.00622521511410399*G0_1_1_1_2_2 + 0.00697771364438034*G0_1_1_2_0_0 + 0.00212067767623324*G0_1_1_2_0_1 + 0.00670407781518891*G0_1_1_2_0_2 + 0.00212067767623324*G0_1_1_2_1_0 - 0.00157340601785042*G0_1_1_2_1_1 + 0.00622521511410399*G0_1_1_2_1_2 + 0.00670407781518891*G0_1_1_2_2_0 + 0.00622521511410399*G0_1_1_2_2_1 + 0.0322206188872853*G0_1_1_2_2_2; + A[143] = A[129] + 0.0831168831168831*G0_0_1_0_0_0 - 0.0121425899203676*G0_0_1_0_0_1 - 0.00324942547164765*G0_0_1_0_0_2 - 0.0121425899203676*G0_0_1_0_1_0 - 0.008858959970071*G0_0_1_0_1_1 + 0.000684089572978467*G0_0_1_0_1_2 - 0.00324942547164765*G0_0_1_0_2_0 + 0.000684089572978469*G0_0_1_0_2_1 + 0.000307840307840324*G0_0_1_0_2_2 - 0.0121425899203676*G0_0_1_1_0_0 - 0.008858959970071*G0_0_1_1_0_1 + 0.000684089572978468*G0_0_1_1_0_2 - 0.008858959970071*G0_0_1_1_1_0 - 0.00400192400192399*G0_0_1_1_1_1 - 0.000684089572978447*G0_0_1_1_1_2 + 0.000684089572978469*G0_0_1_1_2_0 - 0.000684089572978447*G0_0_1_1_2_1 - 0.00324942547164765*G0_0_1_2_0_0 + 0.000684089572978468*G0_0_1_2_0_1 + 0.000307840307840322*G0_0_1_2_0_2 + 0.000684089572978468*G0_0_1_2_1_0 - 0.000684089572978447*G0_0_1_2_1_1 + 0.000307840307840324*G0_0_1_2_2_0 - 0.009337822671156*G0_0_1_2_2_2 - 0.0831168831168831*G0_1_0_0_0_0 + 0.0121425899203676*G0_1_0_0_0_1 + 0.00324942547164765*G0_1_0_0_0_2 + 0.0121425899203676*G0_1_0_0_1_0 + 0.008858959970071*G0_1_0_0_1_1 - 0.000684089572978468*G0_1_0_0_1_2 + 0.00324942547164765*G0_1_0_0_2_0 - 0.000684089572978468*G0_1_0_0_2_1 - 0.000307840307840324*G0_1_0_0_2_2 + 0.0121425899203676*G0_1_0_1_0_0 + 0.008858959970071*G0_1_0_1_0_1 - 0.000684089572978468*G0_1_0_1_0_2 + 0.008858959970071*G0_1_0_1_1_0 + 0.00400192400192399*G0_1_0_1_1_1 + 0.000684089572978447*G0_1_0_1_1_2 - 0.000684089572978469*G0_1_0_1_2_0 + 0.000684089572978447*G0_1_0_1_2_1 + 0.00324942547164765*G0_1_0_2_0_0 - 0.000684089572978468*G0_1_0_2_0_1 - 0.000307840307840323*G0_1_0_2_0_2 - 0.000684089572978468*G0_1_0_2_1_0 + 0.000684089572978447*G0_1_0_2_1_1 - 0.000307840307840324*G0_1_0_2_2_0 + 0.009337822671156*G0_1_0_2_2_2; + A[84] = -A[129] + 0.0924547057880388*G0_1_0_0_0_0 - 0.015494628827962*G0_1_0_0_0_1 - 0.000205226871893515*G0_1_0_0_0_2 - 0.015494628827962*G0_1_0_0_1_0 - 0.0107060018171128*G0_1_0_0_1_1 + 0.00136817914595694*G0_1_0_0_1_2 - 0.000205226871893515*G0_1_0_0_2_0 + 0.00136817914595694*G0_1_0_0_2_1 + 0.00335203890759447*G0_1_0_0_2_2 - 0.015494628827962*G0_1_0_1_0_0 - 0.0107060018171128*G0_1_0_1_0_1 + 0.00136817914595694*G0_1_0_1_0_2 - 0.0107060018171128*G0_1_0_1_1_0 - 0.0138528138528139*G0_1_0_1_1_1 - 0.00253113142002023*G0_1_0_1_1_2 + 0.00136817914595694*G0_1_0_1_2_0 - 0.00253113142002023*G0_1_0_1_2_1 - 0.00335203890759437*G0_1_0_1_2_2 - 0.000205226871893513*G0_1_0_2_0_0 + 0.00136817914595694*G0_1_0_2_0_1 + 0.00335203890759447*G0_1_0_2_0_2 + 0.00136817914595694*G0_1_0_2_1_0 - 0.00253113142002023*G0_1_0_2_1_1 - 0.00335203890759437*G0_1_0_2_1_2 + 0.00335203890759447*G0_1_0_2_2_0 - 0.00335203890759437*G0_1_0_2_2_1 - 0.157922077922077*G0_1_1_0_0_0 - 0.0463128640906416*G0_1_1_0_0_1 + 0.0100903212014323*G0_1_1_0_0_2 - 0.0463128640906416*G0_1_1_0_1_0 - 0.0183678050344716*G0_1_1_0_1_1 + 0.0014707925819037*G0_1_1_0_1_2 + 0.0100903212014323*G0_1_1_0_2_0 + 0.0014707925819037*G0_1_1_0_2_1 + 0.00875634653412429*G0_1_1_0_2_2 - 0.0463128640906416*G0_1_1_1_0_0 - 0.0183678050344716*G0_1_1_1_0_1 + 0.0014707925819037*G0_1_1_1_0_2 - 0.0183678050344716*G0_1_1_1_1_0 - 0.0184704184704185*G0_1_1_1_1_1 - 0.00379669713003041*G0_1_1_1_1_2 + 0.0014707925819037*G0_1_1_1_2_0 - 0.00379669713003042*G0_1_1_1_2_1 - 0.00670407781518889*G0_1_1_1_2_2 + 0.0100903212014323*G0_1_1_2_0_0 + 0.0014707925819037*G0_1_1_2_0_1 + 0.00875634653412429*G0_1_1_2_0_2 + 0.0014707925819037*G0_1_1_2_1_0 - 0.00379669713003041*G0_1_1_2_1_1 - 0.00670407781518889*G0_1_1_2_1_2 + 0.00875634653412429*G0_1_1_2_2_0 - 0.00670407781518889*G0_1_1_2_2_1 - 0.00205226871893548*G0_1_1_2_2_2; + A[93] = -A[101] - 0.157922077922077*G0_0_0_0_0_0 + 0.0100903212014323*G0_0_0_0_0_1 - 0.0463128640906415*G0_0_0_0_0_2 + 0.0100903212014323*G0_0_0_0_1_0 + 0.00875634653412432*G0_0_0_0_1_1 + 0.00147079258190369*G0_0_0_0_1_2 - 0.0463128640906415*G0_0_0_0_2_0 + 0.00147079258190369*G0_0_0_0_2_1 - 0.0183678050344715*G0_0_0_0_2_2 + 0.0100903212014323*G0_0_0_1_0_0 + 0.00875634653412432*G0_0_0_1_0_1 + 0.00147079258190369*G0_0_0_1_0_2 + 0.00875634653412432*G0_0_0_1_1_0 - 0.00205226871893543*G0_0_0_1_1_1 - 0.00670407781518895*G0_0_0_1_1_2 + 0.00147079258190369*G0_0_0_1_2_0 - 0.00670407781518895*G0_0_0_1_2_1 - 0.00379669713003048*G0_0_0_1_2_2 - 0.0463128640906415*G0_0_0_2_0_0 + 0.00147079258190369*G0_0_0_2_0_1 - 0.0183678050344715*G0_0_0_2_0_2 + 0.00147079258190369*G0_0_0_2_1_0 - 0.00670407781518895*G0_0_0_2_1_1 - 0.00379669713003048*G0_0_0_2_1_2 - 0.0183678050344715*G0_0_0_2_2_0 - 0.00379669713003048*G0_0_0_2_2_1 - 0.0184704184704181*G0_0_0_2_2_2 + 0.0924547057880398*G0_1_0_0_0_0 - 0.000205226871893453*G0_1_0_0_0_1 - 0.015494628827962*G0_1_0_0_0_2 - 0.000205226871893456*G0_1_0_0_1_0 + 0.00335203890759448*G0_1_0_0_1_1 + 0.00136817914595693*G0_1_0_0_1_2 - 0.015494628827962*G0_1_0_0_2_0 + 0.00136817914595693*G0_1_0_0_2_1 - 0.0107060018171128*G0_1_0_0_2_2 - 0.00020522687189346*G0_1_0_1_0_0 + 0.00335203890759448*G0_1_0_1_0_1 + 0.00136817914595693*G0_1_0_1_0_2 + 0.00335203890759448*G0_1_0_1_1_0 - 0.00335203890759445*G0_1_0_1_1_2 + 0.00136817914595693*G0_1_0_1_2_0 - 0.00335203890759445*G0_1_0_1_2_1 - 0.00253113142002032*G0_1_0_1_2_2 - 0.015494628827962*G0_1_0_2_0_0 + 0.00136817914595693*G0_1_0_2_0_1 - 0.0107060018171128*G0_1_0_2_0_2 + 0.00136817914595693*G0_1_0_2_1_0 - 0.00335203890759445*G0_1_0_2_1_1 - 0.00253113142002032*G0_1_0_2_1_2 - 0.0107060018171128*G0_1_0_2_2_0 - 0.00253113142002032*G0_1_0_2_2_1 - 0.0138528138528139*G0_1_0_2_2_2; + A[140] = -A[143] + 0.0924547057880388*G0_0_1_0_0_0 - 0.015494628827962*G0_0_1_0_0_1 - 0.000205226871893515*G0_0_1_0_0_2 - 0.015494628827962*G0_0_1_0_1_0 - 0.0107060018171128*G0_0_1_0_1_1 + 0.00136817914595694*G0_0_1_0_1_2 - 0.000205226871893516*G0_0_1_0_2_0 + 0.00136817914595694*G0_0_1_0_2_1 + 0.00335203890759447*G0_0_1_0_2_2 - 0.015494628827962*G0_0_1_1_0_0 - 0.0107060018171128*G0_0_1_1_0_1 + 0.00136817914595694*G0_0_1_1_0_2 - 0.0107060018171128*G0_0_1_1_1_0 - 0.0138528138528139*G0_0_1_1_1_1 - 0.00253113142002023*G0_0_1_1_1_2 + 0.00136817914595694*G0_0_1_1_2_0 - 0.00253113142002023*G0_0_1_1_2_1 - 0.00335203890759437*G0_0_1_1_2_2 - 0.000205226871893516*G0_0_1_2_0_0 + 0.00136817914595694*G0_0_1_2_0_1 + 0.00335203890759447*G0_0_1_2_0_2 + 0.00136817914595694*G0_0_1_2_1_0 - 0.00253113142002023*G0_0_1_2_1_1 - 0.00335203890759437*G0_0_1_2_1_2 + 0.00335203890759447*G0_0_1_2_2_0 - 0.00335203890759437*G0_0_1_2_2_1 - 0.157922077922077*G0_1_1_0_0_0 - 0.0463128640906416*G0_1_1_0_0_1 + 0.0100903212014323*G0_1_1_0_0_2 - 0.0463128640906416*G0_1_1_0_1_0 - 0.0183678050344716*G0_1_1_0_1_1 + 0.0014707925819037*G0_1_1_0_1_2 + 0.0100903212014323*G0_1_1_0_2_0 + 0.0014707925819037*G0_1_1_0_2_1 + 0.00875634653412429*G0_1_1_0_2_2 - 0.0463128640906416*G0_1_1_1_0_0 - 0.0183678050344716*G0_1_1_1_0_1 + 0.0014707925819037*G0_1_1_1_0_2 - 0.0183678050344716*G0_1_1_1_1_0 - 0.0184704184704185*G0_1_1_1_1_1 - 0.00379669713003041*G0_1_1_1_1_2 + 0.0014707925819037*G0_1_1_1_2_0 - 0.00379669713003042*G0_1_1_1_2_1 - 0.00670407781518889*G0_1_1_1_2_2 + 0.0100903212014323*G0_1_1_2_0_0 + 0.0014707925819037*G0_1_1_2_0_1 + 0.00875634653412429*G0_1_1_2_0_2 + 0.0014707925819037*G0_1_1_2_1_0 - 0.00379669713003042*G0_1_1_2_1_1 - 0.00670407781518888*G0_1_1_2_1_2 + 0.00875634653412429*G0_1_1_2_2_0 - 0.00670407781518889*G0_1_1_2_2_1 - 0.00205226871893548*G0_1_1_2_2_2; + A[152] = A[40] - 0.0023761423761423*G0_0_1_0_0_0 - 0.00253006253006251*G0_0_1_0_0_1 - 0.000314253647586972*G0_0_1_0_0_2 - 0.00253006253006251*G0_0_1_0_1_0 + 0.00253006253006254*G0_0_1_0_1_1 - 0.000314253647586973*G0_0_1_0_2_0 + 0.000420073753407071*G0_0_1_0_2_2 - 0.00253006253006251*G0_0_1_1_0_0 + 0.00253006253006254*G0_0_1_1_0_1 + 0.00253006253006254*G0_0_1_1_1_0 + 0.0023761423761423*G0_0_1_1_1_1 + 0.000314253647586985*G0_0_1_1_1_2 + 0.000314253647586984*G0_0_1_1_2_1 - 0.000420073753407094*G0_0_1_1_2_2 - 0.000314253647586972*G0_0_1_2_0_0 + 0.000420073753407071*G0_0_1_2_0_2 + 0.000314253647586984*G0_0_1_2_1_1 - 0.000420073753407094*G0_0_1_2_1_2 + 0.000420073753407071*G0_0_1_2_2_0 - 0.000420073753407094*G0_0_1_2_2_1 + 0.0023761423761423*G0_1_0_0_0_0 + 0.00253006253006251*G0_1_0_0_0_1 + 0.000314253647586972*G0_1_0_0_0_2 + 0.00253006253006251*G0_1_0_0_1_0 - 0.00253006253006254*G0_1_0_0_1_1 + 0.000314253647586972*G0_1_0_0_2_0 - 0.000420073753407071*G0_1_0_0_2_2 + 0.00253006253006251*G0_1_0_1_0_0 - 0.00253006253006254*G0_1_0_1_0_1 - 0.00253006253006254*G0_1_0_1_1_0 - 0.0023761423761423*G0_1_0_1_1_1 - 0.000314253647586984*G0_1_0_1_1_2 - 0.000314253647586983*G0_1_0_1_2_1 + 0.000420073753407094*G0_1_0_1_2_2 + 0.000314253647586971*G0_1_0_2_0_0 - 0.000420073753407071*G0_1_0_2_0_2 - 0.000314253647586983*G0_1_0_2_1_1 + 0.000420073753407094*G0_1_0_2_1_2 - 0.000420073753407071*G0_1_0_2_2_0 + 0.000420073753407094*G0_1_0_2_2_1; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p1_q4_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p1_q4_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p1_q4_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 4, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q4_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q4_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q4_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q4_tensor_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q4_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q4_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p1_q4_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p1_q4_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p1_q4_tensor_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p1_q4_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p1_q4_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p2_q1_quadrature.h b/laplacian_2d/laplacian_f3_p2_q1_quadrature.h new file mode 100644 index 0000000..ccd2865 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p2_q1_quadrature.h @@ -0,0 +1,3420 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P2_Q1_QUADRATURE_H +#define __LAPLACIAN_F3_P2_Q1_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q1_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q1_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q1_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q1_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q1_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q1_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q1_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q1_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q1_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q1_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q1_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q1_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p2_q1_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p2_q1_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W12[12] = {0.0254224531851035, 0.0254224531851035, 0.0254224531851035, 0.0583931378631895, 0.0583931378631895, 0.0583931378631895, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187, 0.041425537809187}; + // Quadrature points on the UFC reference element: (0.873821971016996, 0.063089014491502), (0.063089014491502, 0.873821971016996), (0.063089014491502, 0.063089014491502), (0.501426509658179, 0.24928674517091), (0.24928674517091, 0.501426509658179), (0.24928674517091, 0.24928674517091), (0.636502499121399, 0.310352451033785), (0.636502499121399, 0.053145049844816), (0.310352451033785, 0.636502499121399), (0.310352451033785, 0.053145049844816), (0.053145049844816, 0.636502499121399), (0.053145049844816, 0.310352451033785) + + // Value of basis functions at quadrature points. + static const double FE0_D01[12][2] = \ + {{-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}, + {-1.0, 1.0}}; + + // Array of non-zero columns + static const unsigned int nzc1[2] = {0, 1}; + + // Array of non-zero columns + static const unsigned int nzc0[2] = {0, 2}; + + static const double FE1[12][6] = \ + {{-0.055128566992484, 0.65330770304706, -0.0551285669924841, 0.220514267969936, 0.0159208949980358, 0.220514267969936}, + {-0.055128566992484, -0.055128566992484, 0.65330770304706, 0.220514267969936, 0.220514267969936, 0.015920894998036}, + {0.65330770304706, -0.0551285669924841, -0.0551285669924841, 0.0159208949980358, 0.220514267969936, 0.220514267969936}, + {-0.124998982535097, 0.00143057951778883, -0.124998982535098, 0.499995930140389, 0.248575525271626, 0.499995930140391}, + {-0.124998982535097, -0.124998982535098, 0.00143057951778883, 0.499995930140389, 0.499995930140391, 0.248575525271626}, + {0.00143057951778989, -0.124998982535098, -0.124998982535098, 0.248575525271625, 0.49999593014039, 0.49999593014039}, + {-0.0474962571988, 0.173768363654174, -0.117715163308429, 0.790160442765823, 0.0659747859186053, 0.135307828168627}, + {-0.117715163308429, 0.173768363654174, -0.0474962571988, 0.135307828168627, 0.0659747859186052, 0.790160442765823}, + {-0.0474962571987999, -0.117715163308429, 0.173768363654174, 0.790160442765823, 0.135307828168627, 0.0659747859186054}, + {0.173768363654174, -0.117715163308429, -0.0474962571988, 0.0659747859186052, 0.135307828168627, 0.790160442765823}, + {-0.117715163308429, -0.0474962571988, 0.173768363654174, 0.135307828168627, 0.790160442765823, 0.0659747859186054}, + {0.173768363654174, -0.0474962571988001, -0.117715163308429, 0.0659747859186053, 0.790160442765823, 0.135307828168627}}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 9; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 1152 + for (unsigned int ip = 0; ip < 12; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + double F2 = 0.0; + + // Total number of operations to compute function values = 36 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE1[ip][r]*w[2][r]; + F1 += FE1[ip][r]*w[0][r]; + F2 += FE1[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 12 + double I[3]; + // Number of operations: 4 + I[0] = F0*F1*F2*G[0]*W12[ip]; + + // Number of operations: 4 + I[1] = F0*F1*F2*G[1]*W12[ip]; + + // Number of operations: 4 + I[2] = F0*F1*F2*G[2]*W12[ip]; + + + // Number of operations for primary indices: 48 + for (unsigned int j = 0; j < 2; j++) + { + for (unsigned int k = 0; k < 2; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*3 + nzc1[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p2_q1_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p2_q1_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q1_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p2_q1_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p2_q1_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q1_quadrature_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q1_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q1_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p2_q1_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p2_q1_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q1_quadrature_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q1_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q1_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p2_q1_tensor.h b/laplacian_2d/laplacian_f3_p2_q1_tensor.h new file mode 100644 index 0000000..b9b413f --- /dev/null +++ b/laplacian_2d/laplacian_f3_p2_q1_tensor.h @@ -0,0 +1,3907 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P2_Q1_TENSOR_H +#define __LAPLACIAN_F3_P2_Q1_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q1_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q1_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q1_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q1_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q1_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 3; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// 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}; + + // Compute value(s). + for (unsigned int r = 0; r < 3; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + 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 pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 3; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q1_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q1_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q1_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q1_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q1_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q1_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return false; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 3; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 3; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 2; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 0; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + dofs[0] = c.entity_indices[0][0]; + dofs[1] = c.entity_indices[0][1]; + dofs[2] = c.entity_indices[0][2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q1_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p2_q1_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p2_q1_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 2016 + // Number of operations (multiply-add pairs) for tensor contraction: 1581 + // Total number of operations (multiply-add pairs): 3608 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[1] = -0.00714285714285721*G0_0_0_0_0_0 + 0.000793650793650796*G0_0_0_0_0_1 + 0.000793650793650796*G0_0_0_0_0_2 - 0.00158730158730157*G0_0_0_0_0_3 - 0.00476190476190478*G0_0_0_0_0_4 - 0.00476190476190478*G0_0_0_0_0_5 + 0.000793650793650796*G0_0_0_0_1_0 + 0.000793650793650794*G0_0_0_0_1_1 - 0.000396825396825395*G0_0_0_0_1_2 + 0.0015873015873016*G0_0_0_0_1_5 + 0.000793650793650796*G0_0_0_0_2_0 - 0.000396825396825395*G0_0_0_0_2_1 + 0.000793650793650793*G0_0_0_0_2_2 + 0.0015873015873016*G0_0_0_0_2_4 - 0.00158730158730157*G0_0_0_0_3_0 + 0.00634920634920629*G0_0_0_0_3_3 + 0.00317460317460314*G0_0_0_0_3_4 + 0.00317460317460314*G0_0_0_0_3_5 - 0.00476190476190478*G0_0_0_0_4_0 + 0.0015873015873016*G0_0_0_0_4_2 + 0.00317460317460314*G0_0_0_0_4_3 - 0.00476190476190478*G0_0_0_0_5_0 + 0.0015873015873016*G0_0_0_0_5_1 + 0.00317460317460314*G0_0_0_0_5_3 + 0.000793650793650797*G0_0_0_1_0_0 + 0.000793650793650794*G0_0_0_1_0_1 - 0.000396825396825395*G0_0_0_1_0_2 + 0.0015873015873016*G0_0_0_1_0_5 + 0.000793650793650794*G0_0_0_1_1_0 - 0.00714285714285721*G0_0_0_1_1_1 + 0.000793650793650796*G0_0_0_1_1_2 - 0.00476190476190478*G0_0_0_1_1_3 - 0.00158730158730158*G0_0_0_1_1_4 - 0.00476190476190478*G0_0_0_1_1_5 - 0.000396825396825395*G0_0_0_1_2_0 + 0.000793650793650796*G0_0_0_1_2_1 + 0.000793650793650795*G0_0_0_1_2_2 + 0.0015873015873016*G0_0_0_1_2_3 - 0.00476190476190478*G0_0_0_1_3_1 + 0.0015873015873016*G0_0_0_1_3_2 + 0.00317460317460315*G0_0_0_1_3_4 - 0.00158730158730158*G0_0_0_1_4_1 + 0.00317460317460315*G0_0_0_1_4_3 + 0.00634920634920632*G0_0_0_1_4_4 + 0.00317460317460316*G0_0_0_1_4_5 + 0.0015873015873016*G0_0_0_1_5_0 - 0.00476190476190478*G0_0_0_1_5_1 + 0.00317460317460316*G0_0_0_1_5_4 + 0.000793650793650796*G0_0_0_2_0_0 - 0.000396825396825395*G0_0_0_2_0_1 + 0.000793650793650793*G0_0_0_2_0_2 + 0.0015873015873016*G0_0_0_2_0_4 - 0.000396825396825395*G0_0_0_2_1_0 + 0.000793650793650796*G0_0_0_2_1_1 + 0.000793650793650795*G0_0_0_2_1_2 + 0.0015873015873016*G0_0_0_2_1_3 + 0.000793650793650793*G0_0_0_2_2_0 + 0.000793650793650795*G0_0_0_2_2_1 - 0.00714285714285721*G0_0_0_2_2_2 - 0.00476190476190478*G0_0_0_2_2_3 - 0.00476190476190478*G0_0_0_2_2_4 - 0.00158730158730158*G0_0_0_2_2_5 + 0.0015873015873016*G0_0_0_2_3_1 - 0.00476190476190478*G0_0_0_2_3_2 + 0.00317460317460315*G0_0_0_2_3_5 + 0.0015873015873016*G0_0_0_2_4_0 - 0.00476190476190478*G0_0_0_2_4_2 + 0.00317460317460316*G0_0_0_2_4_5 - 0.00158730158730158*G0_0_0_2_5_2 + 0.00317460317460315*G0_0_0_2_5_3 + 0.00317460317460316*G0_0_0_2_5_4 + 0.00634920634920633*G0_0_0_2_5_5 - 0.00158730158730157*G0_0_0_3_0_0 + 0.00634920634920629*G0_0_0_3_0_3 + 0.00317460317460314*G0_0_0_3_0_4 + 0.00317460317460314*G0_0_0_3_0_5 - 0.00476190476190478*G0_0_0_3_1_1 + 0.0015873015873016*G0_0_0_3_1_2 + 0.00317460317460315*G0_0_0_3_1_4 + 0.0015873015873016*G0_0_0_3_2_1 - 0.00476190476190478*G0_0_0_3_2_2 + 0.00317460317460315*G0_0_0_3_2_5 + 0.00634920634920629*G0_0_0_3_3_0 - 0.0571428571428575*G0_0_0_3_3_3 - 0.0190476190476189*G0_0_0_3_3_4 - 0.0190476190476189*G0_0_0_3_3_5 + 0.00317460317460314*G0_0_0_3_4_0 + 0.00317460317460315*G0_0_0_3_4_1 - 0.0190476190476189*G0_0_0_3_4_3 - 0.0190476190476189*G0_0_0_3_4_4 - 0.0126984126984126*G0_0_0_3_4_5 + 0.00317460317460314*G0_0_0_3_5_0 + 0.00317460317460315*G0_0_0_3_5_2 - 0.0190476190476189*G0_0_0_3_5_3 - 0.0126984126984126*G0_0_0_3_5_4 - 0.0190476190476189*G0_0_0_3_5_5 - 0.00476190476190478*G0_0_0_4_0_0 + 0.0015873015873016*G0_0_0_4_0_2 + 0.00317460317460314*G0_0_0_4_0_3 - 0.00158730158730158*G0_0_0_4_1_1 + 0.00317460317460315*G0_0_0_4_1_3 + 0.00634920634920632*G0_0_0_4_1_4 + 0.00317460317460316*G0_0_0_4_1_5 + 0.0015873015873016*G0_0_0_4_2_0 - 0.00476190476190478*G0_0_0_4_2_2 + 0.00317460317460316*G0_0_0_4_2_5 + 0.00317460317460314*G0_0_0_4_3_0 + 0.00317460317460315*G0_0_0_4_3_1 - 0.0190476190476189*G0_0_0_4_3_3 - 0.0190476190476189*G0_0_0_4_3_4 - 0.0126984126984126*G0_0_0_4_3_5 + 0.00634920634920632*G0_0_0_4_4_1 - 0.0190476190476189*G0_0_0_4_4_3 - 0.0571428571428576*G0_0_0_4_4_4 - 0.019047619047619*G0_0_0_4_4_5 + 0.00317460317460316*G0_0_0_4_5_1 + 0.00317460317460316*G0_0_0_4_5_2 - 0.0126984126984126*G0_0_0_4_5_3 - 0.019047619047619*G0_0_0_4_5_4 - 0.019047619047619*G0_0_0_4_5_5 - 0.00476190476190478*G0_0_0_5_0_0 + 0.0015873015873016*G0_0_0_5_0_1 + 0.00317460317460314*G0_0_0_5_0_3 + 0.0015873015873016*G0_0_0_5_1_0 - 0.00476190476190478*G0_0_0_5_1_1 + 0.00317460317460316*G0_0_0_5_1_4 - 0.00158730158730158*G0_0_0_5_2_2 + 0.00317460317460315*G0_0_0_5_2_3 + 0.00317460317460316*G0_0_0_5_2_4 + 0.00634920634920633*G0_0_0_5_2_5 + 0.00317460317460314*G0_0_0_5_3_0 + 0.00317460317460315*G0_0_0_5_3_2 - 0.0190476190476189*G0_0_0_5_3_3 - 0.0126984126984126*G0_0_0_5_3_4 - 0.0190476190476189*G0_0_0_5_3_5 + 0.00317460317460316*G0_0_0_5_4_1 + 0.00317460317460316*G0_0_0_5_4_2 - 0.0126984126984126*G0_0_0_5_4_3 - 0.019047619047619*G0_0_0_5_4_4 - 0.019047619047619*G0_0_0_5_4_5 + 0.00634920634920633*G0_0_0_5_5_2 - 0.0190476190476189*G0_0_0_5_5_3 - 0.019047619047619*G0_0_0_5_5_4 - 0.0571428571428577*G0_0_0_5_5_5 - 0.00714285714285721*G0_1_0_0_0_0 + 0.000793650793650796*G0_1_0_0_0_1 + 0.000793650793650796*G0_1_0_0_0_2 - 0.00158730158730157*G0_1_0_0_0_3 - 0.00476190476190478*G0_1_0_0_0_4 - 0.00476190476190478*G0_1_0_0_0_5 + 0.000793650793650796*G0_1_0_0_1_0 + 0.000793650793650794*G0_1_0_0_1_1 - 0.000396825396825395*G0_1_0_0_1_2 + 0.0015873015873016*G0_1_0_0_1_5 + 0.000793650793650796*G0_1_0_0_2_0 - 0.000396825396825395*G0_1_0_0_2_1 + 0.000793650793650793*G0_1_0_0_2_2 + 0.0015873015873016*G0_1_0_0_2_4 - 0.00158730158730157*G0_1_0_0_3_0 + 0.00634920634920629*G0_1_0_0_3_3 + 0.00317460317460314*G0_1_0_0_3_4 + 0.00317460317460314*G0_1_0_0_3_5 - 0.00476190476190478*G0_1_0_0_4_0 + 0.0015873015873016*G0_1_0_0_4_2 + 0.00317460317460314*G0_1_0_0_4_3 - 0.00476190476190478*G0_1_0_0_5_0 + 0.0015873015873016*G0_1_0_0_5_1 + 0.00317460317460314*G0_1_0_0_5_3 + 0.000793650793650797*G0_1_0_1_0_0 + 0.000793650793650794*G0_1_0_1_0_1 - 0.000396825396825395*G0_1_0_1_0_2 + 0.0015873015873016*G0_1_0_1_0_5 + 0.000793650793650794*G0_1_0_1_1_0 - 0.00714285714285721*G0_1_0_1_1_1 + 0.000793650793650796*G0_1_0_1_1_2 - 0.00476190476190478*G0_1_0_1_1_3 - 0.00158730158730158*G0_1_0_1_1_4 - 0.00476190476190478*G0_1_0_1_1_5 - 0.000396825396825395*G0_1_0_1_2_0 + 0.000793650793650796*G0_1_0_1_2_1 + 0.000793650793650795*G0_1_0_1_2_2 + 0.0015873015873016*G0_1_0_1_2_3 - 0.00476190476190478*G0_1_0_1_3_1 + 0.0015873015873016*G0_1_0_1_3_2 + 0.00317460317460315*G0_1_0_1_3_4 - 0.00158730158730158*G0_1_0_1_4_1 + 0.00317460317460315*G0_1_0_1_4_3 + 0.00634920634920632*G0_1_0_1_4_4 + 0.00317460317460316*G0_1_0_1_4_5 + 0.0015873015873016*G0_1_0_1_5_0 - 0.00476190476190478*G0_1_0_1_5_1 + 0.00317460317460316*G0_1_0_1_5_4 + 0.000793650793650796*G0_1_0_2_0_0 - 0.000396825396825395*G0_1_0_2_0_1 + 0.000793650793650793*G0_1_0_2_0_2 + 0.0015873015873016*G0_1_0_2_0_4 - 0.000396825396825395*G0_1_0_2_1_0 + 0.000793650793650796*G0_1_0_2_1_1 + 0.000793650793650795*G0_1_0_2_1_2 + 0.0015873015873016*G0_1_0_2_1_3 + 0.000793650793650793*G0_1_0_2_2_0 + 0.000793650793650795*G0_1_0_2_2_1 - 0.00714285714285721*G0_1_0_2_2_2 - 0.00476190476190478*G0_1_0_2_2_3 - 0.00476190476190478*G0_1_0_2_2_4 - 0.00158730158730158*G0_1_0_2_2_5 + 0.0015873015873016*G0_1_0_2_3_1 - 0.00476190476190478*G0_1_0_2_3_2 + 0.00317460317460315*G0_1_0_2_3_5 + 0.0015873015873016*G0_1_0_2_4_0 - 0.00476190476190478*G0_1_0_2_4_2 + 0.00317460317460316*G0_1_0_2_4_5 - 0.00158730158730158*G0_1_0_2_5_2 + 0.00317460317460315*G0_1_0_2_5_3 + 0.00317460317460316*G0_1_0_2_5_4 + 0.00634920634920633*G0_1_0_2_5_5 - 0.00158730158730157*G0_1_0_3_0_0 + 0.00634920634920629*G0_1_0_3_0_3 + 0.00317460317460314*G0_1_0_3_0_4 + 0.00317460317460314*G0_1_0_3_0_5 - 0.00476190476190478*G0_1_0_3_1_1 + 0.0015873015873016*G0_1_0_3_1_2 + 0.00317460317460315*G0_1_0_3_1_4 + 0.0015873015873016*G0_1_0_3_2_1 - 0.00476190476190478*G0_1_0_3_2_2 + 0.00317460317460315*G0_1_0_3_2_5 + 0.00634920634920629*G0_1_0_3_3_0 - 0.0571428571428575*G0_1_0_3_3_3 - 0.0190476190476189*G0_1_0_3_3_4 - 0.0190476190476189*G0_1_0_3_3_5 + 0.00317460317460314*G0_1_0_3_4_0 + 0.00317460317460315*G0_1_0_3_4_1 - 0.0190476190476189*G0_1_0_3_4_3 - 0.0190476190476189*G0_1_0_3_4_4 - 0.0126984126984126*G0_1_0_3_4_5 + 0.00317460317460314*G0_1_0_3_5_0 + 0.00317460317460315*G0_1_0_3_5_2 - 0.0190476190476189*G0_1_0_3_5_3 - 0.0126984126984126*G0_1_0_3_5_4 - 0.0190476190476189*G0_1_0_3_5_5 - 0.00476190476190478*G0_1_0_4_0_0 + 0.0015873015873016*G0_1_0_4_0_2 + 0.00317460317460314*G0_1_0_4_0_3 - 0.00158730158730158*G0_1_0_4_1_1 + 0.00317460317460315*G0_1_0_4_1_3 + 0.00634920634920632*G0_1_0_4_1_4 + 0.00317460317460316*G0_1_0_4_1_5 + 0.0015873015873016*G0_1_0_4_2_0 - 0.00476190476190478*G0_1_0_4_2_2 + 0.00317460317460316*G0_1_0_4_2_5 + 0.00317460317460314*G0_1_0_4_3_0 + 0.00317460317460315*G0_1_0_4_3_1 - 0.0190476190476189*G0_1_0_4_3_3 - 0.0190476190476189*G0_1_0_4_3_4 - 0.0126984126984126*G0_1_0_4_3_5 + 0.00634920634920632*G0_1_0_4_4_1 - 0.0190476190476189*G0_1_0_4_4_3 - 0.0571428571428576*G0_1_0_4_4_4 - 0.019047619047619*G0_1_0_4_4_5 + 0.00317460317460316*G0_1_0_4_5_1 + 0.00317460317460316*G0_1_0_4_5_2 - 0.0126984126984126*G0_1_0_4_5_3 - 0.019047619047619*G0_1_0_4_5_4 - 0.019047619047619*G0_1_0_4_5_5 - 0.00476190476190478*G0_1_0_5_0_0 + 0.0015873015873016*G0_1_0_5_0_1 + 0.00317460317460314*G0_1_0_5_0_3 + 0.0015873015873016*G0_1_0_5_1_0 - 0.00476190476190478*G0_1_0_5_1_1 + 0.00317460317460316*G0_1_0_5_1_4 - 0.00158730158730158*G0_1_0_5_2_2 + 0.00317460317460315*G0_1_0_5_2_3 + 0.00317460317460316*G0_1_0_5_2_4 + 0.00634920634920633*G0_1_0_5_2_5 + 0.00317460317460314*G0_1_0_5_3_0 + 0.00317460317460315*G0_1_0_5_3_2 - 0.0190476190476189*G0_1_0_5_3_3 - 0.0126984126984126*G0_1_0_5_3_4 - 0.0190476190476189*G0_1_0_5_3_5 + 0.00317460317460316*G0_1_0_5_4_1 + 0.00317460317460316*G0_1_0_5_4_2 - 0.0126984126984126*G0_1_0_5_4_3 - 0.019047619047619*G0_1_0_5_4_4 - 0.019047619047619*G0_1_0_5_4_5 + 0.00634920634920633*G0_1_0_5_5_2 - 0.0190476190476189*G0_1_0_5_5_3 - 0.019047619047619*G0_1_0_5_5_4 - 0.0571428571428577*G0_1_0_5_5_5; + A[5] = 0.00714285714285721*G0_0_1_0_0_0 - 0.000793650793650796*G0_0_1_0_0_1 - 0.000793650793650796*G0_0_1_0_0_2 + 0.00158730158730157*G0_0_1_0_0_3 + 0.00476190476190478*G0_0_1_0_0_4 + 0.00476190476190478*G0_0_1_0_0_5 - 0.000793650793650796*G0_0_1_0_1_0 - 0.000793650793650794*G0_0_1_0_1_1 + 0.000396825396825395*G0_0_1_0_1_2 - 0.0015873015873016*G0_0_1_0_1_5 - 0.000793650793650796*G0_0_1_0_2_0 + 0.000396825396825395*G0_0_1_0_2_1 - 0.000793650793650793*G0_0_1_0_2_2 - 0.0015873015873016*G0_0_1_0_2_4 + 0.00158730158730157*G0_0_1_0_3_0 - 0.00634920634920629*G0_0_1_0_3_3 - 0.00317460317460314*G0_0_1_0_3_4 - 0.00317460317460314*G0_0_1_0_3_5 + 0.00476190476190478*G0_0_1_0_4_0 - 0.0015873015873016*G0_0_1_0_4_2 - 0.00317460317460314*G0_0_1_0_4_3 + 0.00476190476190478*G0_0_1_0_5_0 - 0.0015873015873016*G0_0_1_0_5_1 - 0.00317460317460314*G0_0_1_0_5_3 - 0.000793650793650797*G0_0_1_1_0_0 - 0.000793650793650794*G0_0_1_1_0_1 + 0.000396825396825395*G0_0_1_1_0_2 - 0.0015873015873016*G0_0_1_1_0_5 - 0.000793650793650794*G0_0_1_1_1_0 + 0.00714285714285721*G0_0_1_1_1_1 - 0.000793650793650796*G0_0_1_1_1_2 + 0.00476190476190478*G0_0_1_1_1_3 + 0.00158730158730158*G0_0_1_1_1_4 + 0.00476190476190478*G0_0_1_1_1_5 + 0.000396825396825395*G0_0_1_1_2_0 - 0.000793650793650796*G0_0_1_1_2_1 - 0.000793650793650795*G0_0_1_1_2_2 - 0.0015873015873016*G0_0_1_1_2_3 + 0.00476190476190478*G0_0_1_1_3_1 - 0.0015873015873016*G0_0_1_1_3_2 - 0.00317460317460315*G0_0_1_1_3_4 + 0.00158730158730158*G0_0_1_1_4_1 - 0.00317460317460315*G0_0_1_1_4_3 - 0.00634920634920632*G0_0_1_1_4_4 - 0.00317460317460316*G0_0_1_1_4_5 - 0.0015873015873016*G0_0_1_1_5_0 + 0.00476190476190478*G0_0_1_1_5_1 - 0.00317460317460316*G0_0_1_1_5_4 - 0.000793650793650796*G0_0_1_2_0_0 + 0.000396825396825395*G0_0_1_2_0_1 - 0.000793650793650793*G0_0_1_2_0_2 - 0.0015873015873016*G0_0_1_2_0_4 + 0.000396825396825395*G0_0_1_2_1_0 - 0.000793650793650796*G0_0_1_2_1_1 - 0.000793650793650795*G0_0_1_2_1_2 - 0.0015873015873016*G0_0_1_2_1_3 - 0.000793650793650793*G0_0_1_2_2_0 - 0.000793650793650795*G0_0_1_2_2_1 + 0.00714285714285721*G0_0_1_2_2_2 + 0.00476190476190478*G0_0_1_2_2_3 + 0.00476190476190478*G0_0_1_2_2_4 + 0.00158730158730158*G0_0_1_2_2_5 - 0.0015873015873016*G0_0_1_2_3_1 + 0.00476190476190478*G0_0_1_2_3_2 - 0.00317460317460315*G0_0_1_2_3_5 - 0.0015873015873016*G0_0_1_2_4_0 + 0.00476190476190478*G0_0_1_2_4_2 - 0.00317460317460316*G0_0_1_2_4_5 + 0.00158730158730158*G0_0_1_2_5_2 - 0.00317460317460315*G0_0_1_2_5_3 - 0.00317460317460316*G0_0_1_2_5_4 - 0.00634920634920633*G0_0_1_2_5_5 + 0.00158730158730157*G0_0_1_3_0_0 - 0.00634920634920629*G0_0_1_3_0_3 - 0.00317460317460314*G0_0_1_3_0_4 - 0.00317460317460314*G0_0_1_3_0_5 + 0.00476190476190478*G0_0_1_3_1_1 - 0.0015873015873016*G0_0_1_3_1_2 - 0.00317460317460315*G0_0_1_3_1_4 - 0.0015873015873016*G0_0_1_3_2_1 + 0.00476190476190478*G0_0_1_3_2_2 - 0.00317460317460315*G0_0_1_3_2_5 - 0.00634920634920629*G0_0_1_3_3_0 + 0.0571428571428575*G0_0_1_3_3_3 + 0.0190476190476189*G0_0_1_3_3_4 + 0.0190476190476189*G0_0_1_3_3_5 - 0.00317460317460314*G0_0_1_3_4_0 - 0.00317460317460315*G0_0_1_3_4_1 + 0.0190476190476189*G0_0_1_3_4_3 + 0.0190476190476189*G0_0_1_3_4_4 + 0.0126984126984126*G0_0_1_3_4_5 - 0.00317460317460314*G0_0_1_3_5_0 - 0.00317460317460315*G0_0_1_3_5_2 + 0.0190476190476189*G0_0_1_3_5_3 + 0.0126984126984126*G0_0_1_3_5_4 + 0.0190476190476189*G0_0_1_3_5_5 + 0.00476190476190478*G0_0_1_4_0_0 - 0.0015873015873016*G0_0_1_4_0_2 - 0.00317460317460314*G0_0_1_4_0_3 + 0.00158730158730158*G0_0_1_4_1_1 - 0.00317460317460315*G0_0_1_4_1_3 - 0.00634920634920632*G0_0_1_4_1_4 - 0.00317460317460316*G0_0_1_4_1_5 - 0.0015873015873016*G0_0_1_4_2_0 + 0.00476190476190478*G0_0_1_4_2_2 - 0.00317460317460316*G0_0_1_4_2_5 - 0.00317460317460314*G0_0_1_4_3_0 - 0.00317460317460315*G0_0_1_4_3_1 + 0.0190476190476189*G0_0_1_4_3_3 + 0.0190476190476189*G0_0_1_4_3_4 + 0.0126984126984126*G0_0_1_4_3_5 - 0.00634920634920632*G0_0_1_4_4_1 + 0.0190476190476189*G0_0_1_4_4_3 + 0.0571428571428576*G0_0_1_4_4_4 + 0.019047619047619*G0_0_1_4_4_5 - 0.00317460317460316*G0_0_1_4_5_1 - 0.00317460317460316*G0_0_1_4_5_2 + 0.0126984126984126*G0_0_1_4_5_3 + 0.019047619047619*G0_0_1_4_5_4 + 0.019047619047619*G0_0_1_4_5_5 + 0.00476190476190478*G0_0_1_5_0_0 - 0.0015873015873016*G0_0_1_5_0_1 - 0.00317460317460314*G0_0_1_5_0_3 - 0.0015873015873016*G0_0_1_5_1_0 + 0.00476190476190478*G0_0_1_5_1_1 - 0.00317460317460316*G0_0_1_5_1_4 + 0.00158730158730158*G0_0_1_5_2_2 - 0.00317460317460315*G0_0_1_5_2_3 - 0.00317460317460316*G0_0_1_5_2_4 - 0.00634920634920633*G0_0_1_5_2_5 - 0.00317460317460314*G0_0_1_5_3_0 - 0.00317460317460315*G0_0_1_5_3_2 + 0.0190476190476189*G0_0_1_5_3_3 + 0.0126984126984126*G0_0_1_5_3_4 + 0.0190476190476189*G0_0_1_5_3_5 - 0.00317460317460316*G0_0_1_5_4_1 - 0.00317460317460316*G0_0_1_5_4_2 + 0.0126984126984126*G0_0_1_5_4_3 + 0.019047619047619*G0_0_1_5_4_4 + 0.019047619047619*G0_0_1_5_4_5 - 0.00634920634920633*G0_0_1_5_5_2 + 0.0190476190476189*G0_0_1_5_5_3 + 0.019047619047619*G0_0_1_5_5_4 + 0.0571428571428577*G0_0_1_5_5_5; + A[0] = -A[1] + 0.00714285714285721*G0_0_1_0_0_0 - 0.000793650793650796*G0_0_1_0_0_1 - 0.000793650793650796*G0_0_1_0_0_2 + 0.00158730158730157*G0_0_1_0_0_3 + 0.00476190476190478*G0_0_1_0_0_4 + 0.00476190476190478*G0_0_1_0_0_5 - 0.000793650793650796*G0_0_1_0_1_0 - 0.000793650793650794*G0_0_1_0_1_1 + 0.000396825396825395*G0_0_1_0_1_2 - 0.0015873015873016*G0_0_1_0_1_5 - 0.000793650793650796*G0_0_1_0_2_0 + 0.000396825396825395*G0_0_1_0_2_1 - 0.000793650793650793*G0_0_1_0_2_2 - 0.0015873015873016*G0_0_1_0_2_4 + 0.00158730158730157*G0_0_1_0_3_0 - 0.00634920634920629*G0_0_1_0_3_3 - 0.00317460317460314*G0_0_1_0_3_4 - 0.00317460317460314*G0_0_1_0_3_5 + 0.00476190476190478*G0_0_1_0_4_0 - 0.0015873015873016*G0_0_1_0_4_2 - 0.00317460317460314*G0_0_1_0_4_3 + 0.00476190476190478*G0_0_1_0_5_0 - 0.0015873015873016*G0_0_1_0_5_1 - 0.00317460317460314*G0_0_1_0_5_3 - 0.000793650793650797*G0_0_1_1_0_0 - 0.000793650793650794*G0_0_1_1_0_1 + 0.000396825396825395*G0_0_1_1_0_2 - 0.0015873015873016*G0_0_1_1_0_5 - 0.000793650793650794*G0_0_1_1_1_0 + 0.00714285714285721*G0_0_1_1_1_1 - 0.000793650793650796*G0_0_1_1_1_2 + 0.00476190476190478*G0_0_1_1_1_3 + 0.00158730158730158*G0_0_1_1_1_4 + 0.00476190476190478*G0_0_1_1_1_5 + 0.000396825396825395*G0_0_1_1_2_0 - 0.000793650793650796*G0_0_1_1_2_1 - 0.000793650793650795*G0_0_1_1_2_2 - 0.0015873015873016*G0_0_1_1_2_3 + 0.00476190476190478*G0_0_1_1_3_1 - 0.0015873015873016*G0_0_1_1_3_2 - 0.00317460317460315*G0_0_1_1_3_4 + 0.00158730158730158*G0_0_1_1_4_1 - 0.00317460317460315*G0_0_1_1_4_3 - 0.00634920634920632*G0_0_1_1_4_4 - 0.00317460317460316*G0_0_1_1_4_5 - 0.0015873015873016*G0_0_1_1_5_0 + 0.00476190476190478*G0_0_1_1_5_1 - 0.00317460317460316*G0_0_1_1_5_4 - 0.000793650793650796*G0_0_1_2_0_0 + 0.000396825396825395*G0_0_1_2_0_1 - 0.000793650793650793*G0_0_1_2_0_2 - 0.0015873015873016*G0_0_1_2_0_4 + 0.000396825396825395*G0_0_1_2_1_0 - 0.000793650793650796*G0_0_1_2_1_1 - 0.000793650793650795*G0_0_1_2_1_2 - 0.0015873015873016*G0_0_1_2_1_3 - 0.000793650793650793*G0_0_1_2_2_0 - 0.000793650793650795*G0_0_1_2_2_1 + 0.00714285714285721*G0_0_1_2_2_2 + 0.00476190476190478*G0_0_1_2_2_3 + 0.00476190476190478*G0_0_1_2_2_4 + 0.00158730158730158*G0_0_1_2_2_5 - 0.0015873015873016*G0_0_1_2_3_1 + 0.00476190476190478*G0_0_1_2_3_2 - 0.00317460317460315*G0_0_1_2_3_5 - 0.0015873015873016*G0_0_1_2_4_0 + 0.00476190476190478*G0_0_1_2_4_2 - 0.00317460317460316*G0_0_1_2_4_5 + 0.00158730158730158*G0_0_1_2_5_2 - 0.00317460317460315*G0_0_1_2_5_3 - 0.00317460317460316*G0_0_1_2_5_4 - 0.00634920634920633*G0_0_1_2_5_5 + 0.00158730158730157*G0_0_1_3_0_0 - 0.00634920634920629*G0_0_1_3_0_3 - 0.00317460317460314*G0_0_1_3_0_4 - 0.00317460317460314*G0_0_1_3_0_5 + 0.00476190476190478*G0_0_1_3_1_1 - 0.0015873015873016*G0_0_1_3_1_2 - 0.00317460317460315*G0_0_1_3_1_4 - 0.0015873015873016*G0_0_1_3_2_1 + 0.00476190476190478*G0_0_1_3_2_2 - 0.00317460317460315*G0_0_1_3_2_5 - 0.00634920634920629*G0_0_1_3_3_0 + 0.0571428571428575*G0_0_1_3_3_3 + 0.0190476190476189*G0_0_1_3_3_4 + 0.0190476190476189*G0_0_1_3_3_5 - 0.00317460317460314*G0_0_1_3_4_0 - 0.00317460317460315*G0_0_1_3_4_1 + 0.0190476190476189*G0_0_1_3_4_3 + 0.0190476190476189*G0_0_1_3_4_4 + 0.0126984126984126*G0_0_1_3_4_5 - 0.00317460317460314*G0_0_1_3_5_0 - 0.00317460317460315*G0_0_1_3_5_2 + 0.0190476190476189*G0_0_1_3_5_3 + 0.0126984126984126*G0_0_1_3_5_4 + 0.0190476190476189*G0_0_1_3_5_5 + 0.00476190476190478*G0_0_1_4_0_0 - 0.0015873015873016*G0_0_1_4_0_2 - 0.00317460317460314*G0_0_1_4_0_3 + 0.00158730158730158*G0_0_1_4_1_1 - 0.00317460317460315*G0_0_1_4_1_3 - 0.00634920634920632*G0_0_1_4_1_4 - 0.00317460317460316*G0_0_1_4_1_5 - 0.0015873015873016*G0_0_1_4_2_0 + 0.00476190476190478*G0_0_1_4_2_2 - 0.00317460317460316*G0_0_1_4_2_5 - 0.00317460317460314*G0_0_1_4_3_0 - 0.00317460317460315*G0_0_1_4_3_1 + 0.0190476190476189*G0_0_1_4_3_3 + 0.0190476190476189*G0_0_1_4_3_4 + 0.0126984126984126*G0_0_1_4_3_5 - 0.00634920634920632*G0_0_1_4_4_1 + 0.0190476190476189*G0_0_1_4_4_3 + 0.0571428571428576*G0_0_1_4_4_4 + 0.019047619047619*G0_0_1_4_4_5 - 0.00317460317460316*G0_0_1_4_5_1 - 0.00317460317460316*G0_0_1_4_5_2 + 0.0126984126984126*G0_0_1_4_5_3 + 0.019047619047619*G0_0_1_4_5_4 + 0.019047619047619*G0_0_1_4_5_5 + 0.00476190476190478*G0_0_1_5_0_0 - 0.0015873015873016*G0_0_1_5_0_1 - 0.00317460317460314*G0_0_1_5_0_3 - 0.0015873015873016*G0_0_1_5_1_0 + 0.00476190476190478*G0_0_1_5_1_1 - 0.00317460317460316*G0_0_1_5_1_4 + 0.00158730158730158*G0_0_1_5_2_2 - 0.00317460317460315*G0_0_1_5_2_3 - 0.00317460317460316*G0_0_1_5_2_4 - 0.00634920634920633*G0_0_1_5_2_5 - 0.00317460317460314*G0_0_1_5_3_0 - 0.00317460317460315*G0_0_1_5_3_2 + 0.0190476190476189*G0_0_1_5_3_3 + 0.0126984126984126*G0_0_1_5_3_4 + 0.0190476190476189*G0_0_1_5_3_5 - 0.00317460317460316*G0_0_1_5_4_1 - 0.00317460317460316*G0_0_1_5_4_2 + 0.0126984126984126*G0_0_1_5_4_3 + 0.019047619047619*G0_0_1_5_4_4 + 0.019047619047619*G0_0_1_5_4_5 - 0.00634920634920633*G0_0_1_5_5_2 + 0.0190476190476189*G0_0_1_5_5_3 + 0.019047619047619*G0_0_1_5_5_4 + 0.0571428571428577*G0_0_1_5_5_5 + 0.00714285714285721*G0_1_1_0_0_0 - 0.000793650793650796*G0_1_1_0_0_1 - 0.000793650793650796*G0_1_1_0_0_2 + 0.00158730158730157*G0_1_1_0_0_3 + 0.00476190476190478*G0_1_1_0_0_4 + 0.00476190476190478*G0_1_1_0_0_5 - 0.000793650793650796*G0_1_1_0_1_0 - 0.000793650793650794*G0_1_1_0_1_1 + 0.000396825396825395*G0_1_1_0_1_2 - 0.0015873015873016*G0_1_1_0_1_5 - 0.000793650793650796*G0_1_1_0_2_0 + 0.000396825396825395*G0_1_1_0_2_1 - 0.000793650793650793*G0_1_1_0_2_2 - 0.0015873015873016*G0_1_1_0_2_4 + 0.00158730158730157*G0_1_1_0_3_0 - 0.00634920634920629*G0_1_1_0_3_3 - 0.00317460317460314*G0_1_1_0_3_4 - 0.00317460317460314*G0_1_1_0_3_5 + 0.00476190476190478*G0_1_1_0_4_0 - 0.0015873015873016*G0_1_1_0_4_2 - 0.00317460317460314*G0_1_1_0_4_3 + 0.00476190476190478*G0_1_1_0_5_0 - 0.0015873015873016*G0_1_1_0_5_1 - 0.00317460317460314*G0_1_1_0_5_3 - 0.000793650793650797*G0_1_1_1_0_0 - 0.000793650793650794*G0_1_1_1_0_1 + 0.000396825396825395*G0_1_1_1_0_2 - 0.0015873015873016*G0_1_1_1_0_5 - 0.000793650793650794*G0_1_1_1_1_0 + 0.00714285714285721*G0_1_1_1_1_1 - 0.000793650793650796*G0_1_1_1_1_2 + 0.00476190476190478*G0_1_1_1_1_3 + 0.00158730158730158*G0_1_1_1_1_4 + 0.00476190476190478*G0_1_1_1_1_5 + 0.000396825396825395*G0_1_1_1_2_0 - 0.000793650793650796*G0_1_1_1_2_1 - 0.000793650793650795*G0_1_1_1_2_2 - 0.0015873015873016*G0_1_1_1_2_3 + 0.00476190476190478*G0_1_1_1_3_1 - 0.0015873015873016*G0_1_1_1_3_2 - 0.00317460317460315*G0_1_1_1_3_4 + 0.00158730158730158*G0_1_1_1_4_1 - 0.00317460317460315*G0_1_1_1_4_3 - 0.00634920634920632*G0_1_1_1_4_4 - 0.00317460317460316*G0_1_1_1_4_5 - 0.0015873015873016*G0_1_1_1_5_0 + 0.00476190476190478*G0_1_1_1_5_1 - 0.00317460317460316*G0_1_1_1_5_4 - 0.000793650793650796*G0_1_1_2_0_0 + 0.000396825396825395*G0_1_1_2_0_1 - 0.000793650793650793*G0_1_1_2_0_2 - 0.0015873015873016*G0_1_1_2_0_4 + 0.000396825396825395*G0_1_1_2_1_0 - 0.000793650793650796*G0_1_1_2_1_1 - 0.000793650793650795*G0_1_1_2_1_2 - 0.0015873015873016*G0_1_1_2_1_3 - 0.000793650793650793*G0_1_1_2_2_0 - 0.000793650793650795*G0_1_1_2_2_1 + 0.00714285714285721*G0_1_1_2_2_2 + 0.00476190476190478*G0_1_1_2_2_3 + 0.00476190476190478*G0_1_1_2_2_4 + 0.00158730158730158*G0_1_1_2_2_5 - 0.0015873015873016*G0_1_1_2_3_1 + 0.00476190476190478*G0_1_1_2_3_2 - 0.00317460317460315*G0_1_1_2_3_5 - 0.0015873015873016*G0_1_1_2_4_0 + 0.00476190476190478*G0_1_1_2_4_2 - 0.00317460317460316*G0_1_1_2_4_5 + 0.00158730158730158*G0_1_1_2_5_2 - 0.00317460317460315*G0_1_1_2_5_3 - 0.00317460317460316*G0_1_1_2_5_4 - 0.00634920634920633*G0_1_1_2_5_5 + 0.00158730158730157*G0_1_1_3_0_0 - 0.00634920634920629*G0_1_1_3_0_3 - 0.00317460317460314*G0_1_1_3_0_4 - 0.00317460317460314*G0_1_1_3_0_5 + 0.00476190476190478*G0_1_1_3_1_1 - 0.0015873015873016*G0_1_1_3_1_2 - 0.00317460317460315*G0_1_1_3_1_4 - 0.0015873015873016*G0_1_1_3_2_1 + 0.00476190476190478*G0_1_1_3_2_2 - 0.00317460317460315*G0_1_1_3_2_5 - 0.00634920634920629*G0_1_1_3_3_0 + 0.0571428571428575*G0_1_1_3_3_3 + 0.0190476190476189*G0_1_1_3_3_4 + 0.0190476190476189*G0_1_1_3_3_5 - 0.00317460317460314*G0_1_1_3_4_0 - 0.00317460317460315*G0_1_1_3_4_1 + 0.0190476190476189*G0_1_1_3_4_3 + 0.0190476190476189*G0_1_1_3_4_4 + 0.0126984126984126*G0_1_1_3_4_5 - 0.00317460317460314*G0_1_1_3_5_0 - 0.00317460317460315*G0_1_1_3_5_2 + 0.0190476190476189*G0_1_1_3_5_3 + 0.0126984126984126*G0_1_1_3_5_4 + 0.0190476190476189*G0_1_1_3_5_5 + 0.00476190476190478*G0_1_1_4_0_0 - 0.0015873015873016*G0_1_1_4_0_2 - 0.00317460317460314*G0_1_1_4_0_3 + 0.00158730158730158*G0_1_1_4_1_1 - 0.00317460317460315*G0_1_1_4_1_3 - 0.00634920634920632*G0_1_1_4_1_4 - 0.00317460317460316*G0_1_1_4_1_5 - 0.0015873015873016*G0_1_1_4_2_0 + 0.00476190476190478*G0_1_1_4_2_2 - 0.00317460317460316*G0_1_1_4_2_5 - 0.00317460317460314*G0_1_1_4_3_0 - 0.00317460317460315*G0_1_1_4_3_1 + 0.0190476190476189*G0_1_1_4_3_3 + 0.0190476190476189*G0_1_1_4_3_4 + 0.0126984126984126*G0_1_1_4_3_5 - 0.00634920634920632*G0_1_1_4_4_1 + 0.0190476190476189*G0_1_1_4_4_3 + 0.0571428571428576*G0_1_1_4_4_4 + 0.019047619047619*G0_1_1_4_4_5 - 0.00317460317460316*G0_1_1_4_5_1 - 0.00317460317460316*G0_1_1_4_5_2 + 0.0126984126984126*G0_1_1_4_5_3 + 0.019047619047619*G0_1_1_4_5_4 + 0.019047619047619*G0_1_1_4_5_5 + 0.00476190476190478*G0_1_1_5_0_0 - 0.0015873015873016*G0_1_1_5_0_1 - 0.00317460317460314*G0_1_1_5_0_3 - 0.0015873015873016*G0_1_1_5_1_0 + 0.00476190476190478*G0_1_1_5_1_1 - 0.00317460317460316*G0_1_1_5_1_4 + 0.00158730158730158*G0_1_1_5_2_2 - 0.00317460317460315*G0_1_1_5_2_3 - 0.00317460317460316*G0_1_1_5_2_4 - 0.00634920634920633*G0_1_1_5_2_5 - 0.00317460317460314*G0_1_1_5_3_0 - 0.00317460317460315*G0_1_1_5_3_2 + 0.0190476190476189*G0_1_1_5_3_3 + 0.0126984126984126*G0_1_1_5_3_4 + 0.0190476190476189*G0_1_1_5_3_5 - 0.00317460317460316*G0_1_1_5_4_1 - 0.00317460317460316*G0_1_1_5_4_2 + 0.0126984126984126*G0_1_1_5_4_3 + 0.019047619047619*G0_1_1_5_4_4 + 0.019047619047619*G0_1_1_5_4_5 - 0.00634920634920633*G0_1_1_5_5_2 + 0.0190476190476189*G0_1_1_5_5_3 + 0.019047619047619*G0_1_1_5_5_4 + 0.0571428571428577*G0_1_1_5_5_5; + A[7] = 0.00714285714285721*G0_1_0_0_0_0 - 0.000793650793650796*G0_1_0_0_0_1 - 0.000793650793650796*G0_1_0_0_0_2 + 0.00158730158730157*G0_1_0_0_0_3 + 0.00476190476190478*G0_1_0_0_0_4 + 0.00476190476190478*G0_1_0_0_0_5 - 0.000793650793650796*G0_1_0_0_1_0 - 0.000793650793650794*G0_1_0_0_1_1 + 0.000396825396825395*G0_1_0_0_1_2 - 0.0015873015873016*G0_1_0_0_1_5 - 0.000793650793650796*G0_1_0_0_2_0 + 0.000396825396825395*G0_1_0_0_2_1 - 0.000793650793650793*G0_1_0_0_2_2 - 0.0015873015873016*G0_1_0_0_2_4 + 0.00158730158730157*G0_1_0_0_3_0 - 0.00634920634920629*G0_1_0_0_3_3 - 0.00317460317460314*G0_1_0_0_3_4 - 0.00317460317460314*G0_1_0_0_3_5 + 0.00476190476190478*G0_1_0_0_4_0 - 0.0015873015873016*G0_1_0_0_4_2 - 0.00317460317460314*G0_1_0_0_4_3 + 0.00476190476190478*G0_1_0_0_5_0 - 0.0015873015873016*G0_1_0_0_5_1 - 0.00317460317460314*G0_1_0_0_5_3 - 0.000793650793650797*G0_1_0_1_0_0 - 0.000793650793650794*G0_1_0_1_0_1 + 0.000396825396825395*G0_1_0_1_0_2 - 0.0015873015873016*G0_1_0_1_0_5 - 0.000793650793650794*G0_1_0_1_1_0 + 0.00714285714285721*G0_1_0_1_1_1 - 0.000793650793650796*G0_1_0_1_1_2 + 0.00476190476190478*G0_1_0_1_1_3 + 0.00158730158730158*G0_1_0_1_1_4 + 0.00476190476190478*G0_1_0_1_1_5 + 0.000396825396825395*G0_1_0_1_2_0 - 0.000793650793650796*G0_1_0_1_2_1 - 0.000793650793650795*G0_1_0_1_2_2 - 0.0015873015873016*G0_1_0_1_2_3 + 0.00476190476190478*G0_1_0_1_3_1 - 0.0015873015873016*G0_1_0_1_3_2 - 0.00317460317460315*G0_1_0_1_3_4 + 0.00158730158730158*G0_1_0_1_4_1 - 0.00317460317460315*G0_1_0_1_4_3 - 0.00634920634920632*G0_1_0_1_4_4 - 0.00317460317460316*G0_1_0_1_4_5 - 0.0015873015873016*G0_1_0_1_5_0 + 0.00476190476190478*G0_1_0_1_5_1 - 0.00317460317460316*G0_1_0_1_5_4 - 0.000793650793650796*G0_1_0_2_0_0 + 0.000396825396825395*G0_1_0_2_0_1 - 0.000793650793650793*G0_1_0_2_0_2 - 0.0015873015873016*G0_1_0_2_0_4 + 0.000396825396825395*G0_1_0_2_1_0 - 0.000793650793650796*G0_1_0_2_1_1 - 0.000793650793650795*G0_1_0_2_1_2 - 0.0015873015873016*G0_1_0_2_1_3 - 0.000793650793650793*G0_1_0_2_2_0 - 0.000793650793650795*G0_1_0_2_2_1 + 0.00714285714285721*G0_1_0_2_2_2 + 0.00476190476190478*G0_1_0_2_2_3 + 0.00476190476190478*G0_1_0_2_2_4 + 0.00158730158730158*G0_1_0_2_2_5 - 0.0015873015873016*G0_1_0_2_3_1 + 0.00476190476190478*G0_1_0_2_3_2 - 0.00317460317460315*G0_1_0_2_3_5 - 0.0015873015873016*G0_1_0_2_4_0 + 0.00476190476190478*G0_1_0_2_4_2 - 0.00317460317460316*G0_1_0_2_4_5 + 0.00158730158730158*G0_1_0_2_5_2 - 0.00317460317460315*G0_1_0_2_5_3 - 0.00317460317460316*G0_1_0_2_5_4 - 0.00634920634920633*G0_1_0_2_5_5 + 0.00158730158730157*G0_1_0_3_0_0 - 0.00634920634920629*G0_1_0_3_0_3 - 0.00317460317460314*G0_1_0_3_0_4 - 0.00317460317460314*G0_1_0_3_0_5 + 0.00476190476190478*G0_1_0_3_1_1 - 0.0015873015873016*G0_1_0_3_1_2 - 0.00317460317460315*G0_1_0_3_1_4 - 0.0015873015873016*G0_1_0_3_2_1 + 0.00476190476190478*G0_1_0_3_2_2 - 0.00317460317460315*G0_1_0_3_2_5 - 0.00634920634920629*G0_1_0_3_3_0 + 0.0571428571428575*G0_1_0_3_3_3 + 0.0190476190476189*G0_1_0_3_3_4 + 0.0190476190476189*G0_1_0_3_3_5 - 0.00317460317460314*G0_1_0_3_4_0 - 0.00317460317460315*G0_1_0_3_4_1 + 0.0190476190476189*G0_1_0_3_4_3 + 0.0190476190476189*G0_1_0_3_4_4 + 0.0126984126984126*G0_1_0_3_4_5 - 0.00317460317460314*G0_1_0_3_5_0 - 0.00317460317460315*G0_1_0_3_5_2 + 0.0190476190476189*G0_1_0_3_5_3 + 0.0126984126984126*G0_1_0_3_5_4 + 0.0190476190476189*G0_1_0_3_5_5 + 0.00476190476190478*G0_1_0_4_0_0 - 0.0015873015873016*G0_1_0_4_0_2 - 0.00317460317460314*G0_1_0_4_0_3 + 0.00158730158730158*G0_1_0_4_1_1 - 0.00317460317460315*G0_1_0_4_1_3 - 0.00634920634920632*G0_1_0_4_1_4 - 0.00317460317460316*G0_1_0_4_1_5 - 0.0015873015873016*G0_1_0_4_2_0 + 0.00476190476190478*G0_1_0_4_2_2 - 0.00317460317460316*G0_1_0_4_2_5 - 0.00317460317460314*G0_1_0_4_3_0 - 0.00317460317460315*G0_1_0_4_3_1 + 0.0190476190476189*G0_1_0_4_3_3 + 0.0190476190476189*G0_1_0_4_3_4 + 0.0126984126984126*G0_1_0_4_3_5 - 0.00634920634920632*G0_1_0_4_4_1 + 0.0190476190476189*G0_1_0_4_4_3 + 0.0571428571428576*G0_1_0_4_4_4 + 0.019047619047619*G0_1_0_4_4_5 - 0.00317460317460316*G0_1_0_4_5_1 - 0.00317460317460316*G0_1_0_4_5_2 + 0.0126984126984126*G0_1_0_4_5_3 + 0.019047619047619*G0_1_0_4_5_4 + 0.019047619047619*G0_1_0_4_5_5 + 0.00476190476190478*G0_1_0_5_0_0 - 0.0015873015873016*G0_1_0_5_0_1 - 0.00317460317460314*G0_1_0_5_0_3 - 0.0015873015873016*G0_1_0_5_1_0 + 0.00476190476190478*G0_1_0_5_1_1 - 0.00317460317460316*G0_1_0_5_1_4 + 0.00158730158730158*G0_1_0_5_2_2 - 0.00317460317460315*G0_1_0_5_2_3 - 0.00317460317460316*G0_1_0_5_2_4 - 0.00634920634920633*G0_1_0_5_2_5 - 0.00317460317460314*G0_1_0_5_3_0 - 0.00317460317460315*G0_1_0_5_3_2 + 0.0190476190476189*G0_1_0_5_3_3 + 0.0126984126984126*G0_1_0_5_3_4 + 0.0190476190476189*G0_1_0_5_3_5 - 0.00317460317460316*G0_1_0_5_4_1 - 0.00317460317460316*G0_1_0_5_4_2 + 0.0126984126984126*G0_1_0_5_4_3 + 0.019047619047619*G0_1_0_5_4_4 + 0.019047619047619*G0_1_0_5_4_5 - 0.00634920634920633*G0_1_0_5_5_2 + 0.0190476190476189*G0_1_0_5_5_3 + 0.019047619047619*G0_1_0_5_5_4 + 0.0571428571428577*G0_1_0_5_5_5; + A[6] = -A[7] - 0.00714285714285721*G0_1_1_0_0_0 + 0.000793650793650796*G0_1_1_0_0_1 + 0.000793650793650796*G0_1_1_0_0_2 - 0.00158730158730157*G0_1_1_0_0_3 - 0.00476190476190478*G0_1_1_0_0_4 - 0.00476190476190478*G0_1_1_0_0_5 + 0.000793650793650796*G0_1_1_0_1_0 + 0.000793650793650794*G0_1_1_0_1_1 - 0.000396825396825395*G0_1_1_0_1_2 + 0.0015873015873016*G0_1_1_0_1_5 + 0.000793650793650796*G0_1_1_0_2_0 - 0.000396825396825395*G0_1_1_0_2_1 + 0.000793650793650793*G0_1_1_0_2_2 + 0.0015873015873016*G0_1_1_0_2_4 - 0.00158730158730157*G0_1_1_0_3_0 + 0.00634920634920629*G0_1_1_0_3_3 + 0.00317460317460314*G0_1_1_0_3_4 + 0.00317460317460314*G0_1_1_0_3_5 - 0.00476190476190478*G0_1_1_0_4_0 + 0.0015873015873016*G0_1_1_0_4_2 + 0.00317460317460314*G0_1_1_0_4_3 - 0.00476190476190478*G0_1_1_0_5_0 + 0.0015873015873016*G0_1_1_0_5_1 + 0.00317460317460314*G0_1_1_0_5_3 + 0.000793650793650797*G0_1_1_1_0_0 + 0.000793650793650794*G0_1_1_1_0_1 - 0.000396825396825395*G0_1_1_1_0_2 + 0.0015873015873016*G0_1_1_1_0_5 + 0.000793650793650794*G0_1_1_1_1_0 - 0.00714285714285721*G0_1_1_1_1_1 + 0.000793650793650796*G0_1_1_1_1_2 - 0.00476190476190478*G0_1_1_1_1_3 - 0.00158730158730158*G0_1_1_1_1_4 - 0.00476190476190478*G0_1_1_1_1_5 - 0.000396825396825395*G0_1_1_1_2_0 + 0.000793650793650796*G0_1_1_1_2_1 + 0.000793650793650795*G0_1_1_1_2_2 + 0.0015873015873016*G0_1_1_1_2_3 - 0.00476190476190478*G0_1_1_1_3_1 + 0.0015873015873016*G0_1_1_1_3_2 + 0.00317460317460315*G0_1_1_1_3_4 - 0.00158730158730158*G0_1_1_1_4_1 + 0.00317460317460315*G0_1_1_1_4_3 + 0.00634920634920632*G0_1_1_1_4_4 + 0.00317460317460316*G0_1_1_1_4_5 + 0.0015873015873016*G0_1_1_1_5_0 - 0.00476190476190478*G0_1_1_1_5_1 + 0.00317460317460316*G0_1_1_1_5_4 + 0.000793650793650796*G0_1_1_2_0_0 - 0.000396825396825395*G0_1_1_2_0_1 + 0.000793650793650793*G0_1_1_2_0_2 + 0.0015873015873016*G0_1_1_2_0_4 - 0.000396825396825395*G0_1_1_2_1_0 + 0.000793650793650796*G0_1_1_2_1_1 + 0.000793650793650795*G0_1_1_2_1_2 + 0.0015873015873016*G0_1_1_2_1_3 + 0.000793650793650793*G0_1_1_2_2_0 + 0.000793650793650795*G0_1_1_2_2_1 - 0.00714285714285721*G0_1_1_2_2_2 - 0.00476190476190478*G0_1_1_2_2_3 - 0.00476190476190478*G0_1_1_2_2_4 - 0.00158730158730158*G0_1_1_2_2_5 + 0.0015873015873016*G0_1_1_2_3_1 - 0.00476190476190478*G0_1_1_2_3_2 + 0.00317460317460315*G0_1_1_2_3_5 + 0.0015873015873016*G0_1_1_2_4_0 - 0.00476190476190478*G0_1_1_2_4_2 + 0.00317460317460316*G0_1_1_2_4_5 - 0.00158730158730158*G0_1_1_2_5_2 + 0.00317460317460315*G0_1_1_2_5_3 + 0.00317460317460316*G0_1_1_2_5_4 + 0.00634920634920633*G0_1_1_2_5_5 - 0.00158730158730157*G0_1_1_3_0_0 + 0.00634920634920629*G0_1_1_3_0_3 + 0.00317460317460314*G0_1_1_3_0_4 + 0.00317460317460314*G0_1_1_3_0_5 - 0.00476190476190478*G0_1_1_3_1_1 + 0.0015873015873016*G0_1_1_3_1_2 + 0.00317460317460315*G0_1_1_3_1_4 + 0.0015873015873016*G0_1_1_3_2_1 - 0.00476190476190478*G0_1_1_3_2_2 + 0.00317460317460315*G0_1_1_3_2_5 + 0.00634920634920629*G0_1_1_3_3_0 - 0.0571428571428575*G0_1_1_3_3_3 - 0.0190476190476189*G0_1_1_3_3_4 - 0.0190476190476189*G0_1_1_3_3_5 + 0.00317460317460314*G0_1_1_3_4_0 + 0.00317460317460315*G0_1_1_3_4_1 - 0.0190476190476189*G0_1_1_3_4_3 - 0.0190476190476189*G0_1_1_3_4_4 - 0.0126984126984126*G0_1_1_3_4_5 + 0.00317460317460314*G0_1_1_3_5_0 + 0.00317460317460315*G0_1_1_3_5_2 - 0.0190476190476189*G0_1_1_3_5_3 - 0.0126984126984126*G0_1_1_3_5_4 - 0.0190476190476189*G0_1_1_3_5_5 - 0.00476190476190478*G0_1_1_4_0_0 + 0.0015873015873016*G0_1_1_4_0_2 + 0.00317460317460314*G0_1_1_4_0_3 - 0.00158730158730158*G0_1_1_4_1_1 + 0.00317460317460315*G0_1_1_4_1_3 + 0.00634920634920632*G0_1_1_4_1_4 + 0.00317460317460316*G0_1_1_4_1_5 + 0.0015873015873016*G0_1_1_4_2_0 - 0.00476190476190478*G0_1_1_4_2_2 + 0.00317460317460316*G0_1_1_4_2_5 + 0.00317460317460314*G0_1_1_4_3_0 + 0.00317460317460315*G0_1_1_4_3_1 - 0.0190476190476189*G0_1_1_4_3_3 - 0.0190476190476189*G0_1_1_4_3_4 - 0.0126984126984126*G0_1_1_4_3_5 + 0.00634920634920632*G0_1_1_4_4_1 - 0.0190476190476189*G0_1_1_4_4_3 - 0.0571428571428576*G0_1_1_4_4_4 - 0.019047619047619*G0_1_1_4_4_5 + 0.00317460317460316*G0_1_1_4_5_1 + 0.00317460317460316*G0_1_1_4_5_2 - 0.0126984126984126*G0_1_1_4_5_3 - 0.019047619047619*G0_1_1_4_5_4 - 0.019047619047619*G0_1_1_4_5_5 - 0.00476190476190478*G0_1_1_5_0_0 + 0.0015873015873016*G0_1_1_5_0_1 + 0.00317460317460314*G0_1_1_5_0_3 + 0.0015873015873016*G0_1_1_5_1_0 - 0.00476190476190478*G0_1_1_5_1_1 + 0.00317460317460316*G0_1_1_5_1_4 - 0.00158730158730158*G0_1_1_5_2_2 + 0.00317460317460315*G0_1_1_5_2_3 + 0.00317460317460316*G0_1_1_5_2_4 + 0.00634920634920633*G0_1_1_5_2_5 + 0.00317460317460314*G0_1_1_5_3_0 + 0.00317460317460315*G0_1_1_5_3_2 - 0.0190476190476189*G0_1_1_5_3_3 - 0.0126984126984126*G0_1_1_5_3_4 - 0.0190476190476189*G0_1_1_5_3_5 + 0.00317460317460316*G0_1_1_5_4_1 + 0.00317460317460316*G0_1_1_5_4_2 - 0.0126984126984126*G0_1_1_5_4_3 - 0.019047619047619*G0_1_1_5_4_4 - 0.019047619047619*G0_1_1_5_4_5 + 0.00634920634920633*G0_1_1_5_5_2 - 0.0190476190476189*G0_1_1_5_5_3 - 0.019047619047619*G0_1_1_5_5_4 - 0.0571428571428577*G0_1_1_5_5_5; + A[8] = 0.00714285714285721*G0_1_1_0_0_0 - 0.000793650793650796*G0_1_1_0_0_1 - 0.000793650793650796*G0_1_1_0_0_2 + 0.00158730158730157*G0_1_1_0_0_3 + 0.00476190476190478*G0_1_1_0_0_4 + 0.00476190476190478*G0_1_1_0_0_5 - 0.000793650793650796*G0_1_1_0_1_0 - 0.000793650793650794*G0_1_1_0_1_1 + 0.000396825396825395*G0_1_1_0_1_2 - 0.0015873015873016*G0_1_1_0_1_5 - 0.000793650793650796*G0_1_1_0_2_0 + 0.000396825396825395*G0_1_1_0_2_1 - 0.000793650793650793*G0_1_1_0_2_2 - 0.0015873015873016*G0_1_1_0_2_4 + 0.00158730158730157*G0_1_1_0_3_0 - 0.00634920634920629*G0_1_1_0_3_3 - 0.00317460317460314*G0_1_1_0_3_4 - 0.00317460317460314*G0_1_1_0_3_5 + 0.00476190476190478*G0_1_1_0_4_0 - 0.0015873015873016*G0_1_1_0_4_2 - 0.00317460317460314*G0_1_1_0_4_3 + 0.00476190476190478*G0_1_1_0_5_0 - 0.0015873015873016*G0_1_1_0_5_1 - 0.00317460317460314*G0_1_1_0_5_3 - 0.000793650793650797*G0_1_1_1_0_0 - 0.000793650793650794*G0_1_1_1_0_1 + 0.000396825396825395*G0_1_1_1_0_2 - 0.0015873015873016*G0_1_1_1_0_5 - 0.000793650793650794*G0_1_1_1_1_0 + 0.00714285714285721*G0_1_1_1_1_1 - 0.000793650793650796*G0_1_1_1_1_2 + 0.00476190476190478*G0_1_1_1_1_3 + 0.00158730158730158*G0_1_1_1_1_4 + 0.00476190476190478*G0_1_1_1_1_5 + 0.000396825396825395*G0_1_1_1_2_0 - 0.000793650793650796*G0_1_1_1_2_1 - 0.000793650793650795*G0_1_1_1_2_2 - 0.0015873015873016*G0_1_1_1_2_3 + 0.00476190476190478*G0_1_1_1_3_1 - 0.0015873015873016*G0_1_1_1_3_2 - 0.00317460317460315*G0_1_1_1_3_4 + 0.00158730158730158*G0_1_1_1_4_1 - 0.00317460317460315*G0_1_1_1_4_3 - 0.00634920634920632*G0_1_1_1_4_4 - 0.00317460317460316*G0_1_1_1_4_5 - 0.0015873015873016*G0_1_1_1_5_0 + 0.00476190476190478*G0_1_1_1_5_1 - 0.00317460317460316*G0_1_1_1_5_4 - 0.000793650793650796*G0_1_1_2_0_0 + 0.000396825396825395*G0_1_1_2_0_1 - 0.000793650793650793*G0_1_1_2_0_2 - 0.0015873015873016*G0_1_1_2_0_4 + 0.000396825396825395*G0_1_1_2_1_0 - 0.000793650793650796*G0_1_1_2_1_1 - 0.000793650793650795*G0_1_1_2_1_2 - 0.0015873015873016*G0_1_1_2_1_3 - 0.000793650793650793*G0_1_1_2_2_0 - 0.000793650793650795*G0_1_1_2_2_1 + 0.00714285714285721*G0_1_1_2_2_2 + 0.00476190476190478*G0_1_1_2_2_3 + 0.00476190476190478*G0_1_1_2_2_4 + 0.00158730158730158*G0_1_1_2_2_5 - 0.0015873015873016*G0_1_1_2_3_1 + 0.00476190476190478*G0_1_1_2_3_2 - 0.00317460317460315*G0_1_1_2_3_5 - 0.0015873015873016*G0_1_1_2_4_0 + 0.00476190476190478*G0_1_1_2_4_2 - 0.00317460317460316*G0_1_1_2_4_5 + 0.00158730158730158*G0_1_1_2_5_2 - 0.00317460317460315*G0_1_1_2_5_3 - 0.00317460317460316*G0_1_1_2_5_4 - 0.00634920634920633*G0_1_1_2_5_5 + 0.00158730158730157*G0_1_1_3_0_0 - 0.00634920634920629*G0_1_1_3_0_3 - 0.00317460317460314*G0_1_1_3_0_4 - 0.00317460317460314*G0_1_1_3_0_5 + 0.00476190476190478*G0_1_1_3_1_1 - 0.0015873015873016*G0_1_1_3_1_2 - 0.00317460317460315*G0_1_1_3_1_4 - 0.0015873015873016*G0_1_1_3_2_1 + 0.00476190476190478*G0_1_1_3_2_2 - 0.00317460317460315*G0_1_1_3_2_5 - 0.00634920634920629*G0_1_1_3_3_0 + 0.0571428571428575*G0_1_1_3_3_3 + 0.0190476190476189*G0_1_1_3_3_4 + 0.0190476190476189*G0_1_1_3_3_5 - 0.00317460317460314*G0_1_1_3_4_0 - 0.00317460317460315*G0_1_1_3_4_1 + 0.0190476190476189*G0_1_1_3_4_3 + 0.0190476190476189*G0_1_1_3_4_4 + 0.0126984126984126*G0_1_1_3_4_5 - 0.00317460317460314*G0_1_1_3_5_0 - 0.00317460317460315*G0_1_1_3_5_2 + 0.0190476190476189*G0_1_1_3_5_3 + 0.0126984126984126*G0_1_1_3_5_4 + 0.0190476190476189*G0_1_1_3_5_5 + 0.00476190476190478*G0_1_1_4_0_0 - 0.0015873015873016*G0_1_1_4_0_2 - 0.00317460317460314*G0_1_1_4_0_3 + 0.00158730158730158*G0_1_1_4_1_1 - 0.00317460317460315*G0_1_1_4_1_3 - 0.00634920634920632*G0_1_1_4_1_4 - 0.00317460317460316*G0_1_1_4_1_5 - 0.0015873015873016*G0_1_1_4_2_0 + 0.00476190476190478*G0_1_1_4_2_2 - 0.00317460317460316*G0_1_1_4_2_5 - 0.00317460317460314*G0_1_1_4_3_0 - 0.00317460317460315*G0_1_1_4_3_1 + 0.0190476190476189*G0_1_1_4_3_3 + 0.0190476190476189*G0_1_1_4_3_4 + 0.0126984126984126*G0_1_1_4_3_5 - 0.00634920634920632*G0_1_1_4_4_1 + 0.0190476190476189*G0_1_1_4_4_3 + 0.0571428571428576*G0_1_1_4_4_4 + 0.019047619047619*G0_1_1_4_4_5 - 0.00317460317460316*G0_1_1_4_5_1 - 0.00317460317460316*G0_1_1_4_5_2 + 0.0126984126984126*G0_1_1_4_5_3 + 0.019047619047619*G0_1_1_4_5_4 + 0.019047619047619*G0_1_1_4_5_5 + 0.00476190476190478*G0_1_1_5_0_0 - 0.0015873015873016*G0_1_1_5_0_1 - 0.00317460317460314*G0_1_1_5_0_3 - 0.0015873015873016*G0_1_1_5_1_0 + 0.00476190476190478*G0_1_1_5_1_1 - 0.00317460317460316*G0_1_1_5_1_4 + 0.00158730158730158*G0_1_1_5_2_2 - 0.00317460317460315*G0_1_1_5_2_3 - 0.00317460317460316*G0_1_1_5_2_4 - 0.00634920634920633*G0_1_1_5_2_5 - 0.00317460317460314*G0_1_1_5_3_0 - 0.00317460317460315*G0_1_1_5_3_2 + 0.0190476190476189*G0_1_1_5_3_3 + 0.0126984126984126*G0_1_1_5_3_4 + 0.0190476190476189*G0_1_1_5_3_5 - 0.00317460317460316*G0_1_1_5_4_1 - 0.00317460317460316*G0_1_1_5_4_2 + 0.0126984126984126*G0_1_1_5_4_3 + 0.019047619047619*G0_1_1_5_4_4 + 0.019047619047619*G0_1_1_5_4_5 - 0.00634920634920633*G0_1_1_5_5_2 + 0.0190476190476189*G0_1_1_5_5_3 + 0.019047619047619*G0_1_1_5_5_4 + 0.0571428571428577*G0_1_1_5_5_5; + A[2] = -A[8] - 0.00714285714285721*G0_0_1_0_0_0 + 0.000793650793650796*G0_0_1_0_0_1 + 0.000793650793650796*G0_0_1_0_0_2 - 0.00158730158730157*G0_0_1_0_0_3 - 0.00476190476190478*G0_0_1_0_0_4 - 0.00476190476190478*G0_0_1_0_0_5 + 0.000793650793650796*G0_0_1_0_1_0 + 0.000793650793650794*G0_0_1_0_1_1 - 0.000396825396825395*G0_0_1_0_1_2 + 0.0015873015873016*G0_0_1_0_1_5 + 0.000793650793650796*G0_0_1_0_2_0 - 0.000396825396825395*G0_0_1_0_2_1 + 0.000793650793650793*G0_0_1_0_2_2 + 0.0015873015873016*G0_0_1_0_2_4 - 0.00158730158730157*G0_0_1_0_3_0 + 0.00634920634920629*G0_0_1_0_3_3 + 0.00317460317460314*G0_0_1_0_3_4 + 0.00317460317460314*G0_0_1_0_3_5 - 0.00476190476190478*G0_0_1_0_4_0 + 0.0015873015873016*G0_0_1_0_4_2 + 0.00317460317460314*G0_0_1_0_4_3 - 0.00476190476190478*G0_0_1_0_5_0 + 0.0015873015873016*G0_0_1_0_5_1 + 0.00317460317460314*G0_0_1_0_5_3 + 0.000793650793650797*G0_0_1_1_0_0 + 0.000793650793650794*G0_0_1_1_0_1 - 0.000396825396825395*G0_0_1_1_0_2 + 0.0015873015873016*G0_0_1_1_0_5 + 0.000793650793650794*G0_0_1_1_1_0 - 0.00714285714285721*G0_0_1_1_1_1 + 0.000793650793650796*G0_0_1_1_1_2 - 0.00476190476190478*G0_0_1_1_1_3 - 0.00158730158730158*G0_0_1_1_1_4 - 0.00476190476190478*G0_0_1_1_1_5 - 0.000396825396825395*G0_0_1_1_2_0 + 0.000793650793650796*G0_0_1_1_2_1 + 0.000793650793650795*G0_0_1_1_2_2 + 0.0015873015873016*G0_0_1_1_2_3 - 0.00476190476190478*G0_0_1_1_3_1 + 0.0015873015873016*G0_0_1_1_3_2 + 0.00317460317460315*G0_0_1_1_3_4 - 0.00158730158730158*G0_0_1_1_4_1 + 0.00317460317460315*G0_0_1_1_4_3 + 0.00634920634920632*G0_0_1_1_4_4 + 0.00317460317460316*G0_0_1_1_4_5 + 0.0015873015873016*G0_0_1_1_5_0 - 0.00476190476190478*G0_0_1_1_5_1 + 0.00317460317460316*G0_0_1_1_5_4 + 0.000793650793650796*G0_0_1_2_0_0 - 0.000396825396825395*G0_0_1_2_0_1 + 0.000793650793650793*G0_0_1_2_0_2 + 0.0015873015873016*G0_0_1_2_0_4 - 0.000396825396825395*G0_0_1_2_1_0 + 0.000793650793650796*G0_0_1_2_1_1 + 0.000793650793650795*G0_0_1_2_1_2 + 0.0015873015873016*G0_0_1_2_1_3 + 0.000793650793650793*G0_0_1_2_2_0 + 0.000793650793650795*G0_0_1_2_2_1 - 0.00714285714285721*G0_0_1_2_2_2 - 0.00476190476190478*G0_0_1_2_2_3 - 0.00476190476190478*G0_0_1_2_2_4 - 0.00158730158730158*G0_0_1_2_2_5 + 0.0015873015873016*G0_0_1_2_3_1 - 0.00476190476190478*G0_0_1_2_3_2 + 0.00317460317460315*G0_0_1_2_3_5 + 0.0015873015873016*G0_0_1_2_4_0 - 0.00476190476190478*G0_0_1_2_4_2 + 0.00317460317460316*G0_0_1_2_4_5 - 0.00158730158730158*G0_0_1_2_5_2 + 0.00317460317460315*G0_0_1_2_5_3 + 0.00317460317460316*G0_0_1_2_5_4 + 0.00634920634920633*G0_0_1_2_5_5 - 0.00158730158730157*G0_0_1_3_0_0 + 0.00634920634920629*G0_0_1_3_0_3 + 0.00317460317460314*G0_0_1_3_0_4 + 0.00317460317460314*G0_0_1_3_0_5 - 0.00476190476190478*G0_0_1_3_1_1 + 0.0015873015873016*G0_0_1_3_1_2 + 0.00317460317460315*G0_0_1_3_1_4 + 0.0015873015873016*G0_0_1_3_2_1 - 0.00476190476190478*G0_0_1_3_2_2 + 0.00317460317460315*G0_0_1_3_2_5 + 0.00634920634920629*G0_0_1_3_3_0 - 0.0571428571428575*G0_0_1_3_3_3 - 0.0190476190476189*G0_0_1_3_3_4 - 0.0190476190476189*G0_0_1_3_3_5 + 0.00317460317460314*G0_0_1_3_4_0 + 0.00317460317460315*G0_0_1_3_4_1 - 0.0190476190476189*G0_0_1_3_4_3 - 0.0190476190476189*G0_0_1_3_4_4 - 0.0126984126984126*G0_0_1_3_4_5 + 0.00317460317460314*G0_0_1_3_5_0 + 0.00317460317460315*G0_0_1_3_5_2 - 0.0190476190476189*G0_0_1_3_5_3 - 0.0126984126984126*G0_0_1_3_5_4 - 0.0190476190476189*G0_0_1_3_5_5 - 0.00476190476190478*G0_0_1_4_0_0 + 0.0015873015873016*G0_0_1_4_0_2 + 0.00317460317460314*G0_0_1_4_0_3 - 0.00158730158730158*G0_0_1_4_1_1 + 0.00317460317460315*G0_0_1_4_1_3 + 0.00634920634920632*G0_0_1_4_1_4 + 0.00317460317460316*G0_0_1_4_1_5 + 0.0015873015873016*G0_0_1_4_2_0 - 0.00476190476190478*G0_0_1_4_2_2 + 0.00317460317460316*G0_0_1_4_2_5 + 0.00317460317460314*G0_0_1_4_3_0 + 0.00317460317460315*G0_0_1_4_3_1 - 0.0190476190476189*G0_0_1_4_3_3 - 0.0190476190476189*G0_0_1_4_3_4 - 0.0126984126984126*G0_0_1_4_3_5 + 0.00634920634920632*G0_0_1_4_4_1 - 0.0190476190476189*G0_0_1_4_4_3 - 0.0571428571428576*G0_0_1_4_4_4 - 0.019047619047619*G0_0_1_4_4_5 + 0.00317460317460316*G0_0_1_4_5_1 + 0.00317460317460316*G0_0_1_4_5_2 - 0.0126984126984126*G0_0_1_4_5_3 - 0.019047619047619*G0_0_1_4_5_4 - 0.019047619047619*G0_0_1_4_5_5 - 0.00476190476190478*G0_0_1_5_0_0 + 0.0015873015873016*G0_0_1_5_0_1 + 0.00317460317460314*G0_0_1_5_0_3 + 0.0015873015873016*G0_0_1_5_1_0 - 0.00476190476190478*G0_0_1_5_1_1 + 0.00317460317460316*G0_0_1_5_1_4 - 0.00158730158730158*G0_0_1_5_2_2 + 0.00317460317460315*G0_0_1_5_2_3 + 0.00317460317460316*G0_0_1_5_2_4 + 0.00634920634920633*G0_0_1_5_2_5 + 0.00317460317460314*G0_0_1_5_3_0 + 0.00317460317460315*G0_0_1_5_3_2 - 0.0190476190476189*G0_0_1_5_3_3 - 0.0126984126984126*G0_0_1_5_3_4 - 0.0190476190476189*G0_0_1_5_3_5 + 0.00317460317460316*G0_0_1_5_4_1 + 0.00317460317460316*G0_0_1_5_4_2 - 0.0126984126984126*G0_0_1_5_4_3 - 0.019047619047619*G0_0_1_5_4_4 - 0.019047619047619*G0_0_1_5_4_5 + 0.00634920634920633*G0_0_1_5_5_2 - 0.0190476190476189*G0_0_1_5_5_3 - 0.019047619047619*G0_0_1_5_5_4 - 0.0571428571428577*G0_0_1_5_5_5; + A[4] = 0.00714285714285721*G0_0_0_0_0_0 - 0.000793650793650796*G0_0_0_0_0_1 - 0.000793650793650796*G0_0_0_0_0_2 + 0.00158730158730157*G0_0_0_0_0_3 + 0.00476190476190478*G0_0_0_0_0_4 + 0.00476190476190478*G0_0_0_0_0_5 - 0.000793650793650796*G0_0_0_0_1_0 - 0.000793650793650794*G0_0_0_0_1_1 + 0.000396825396825395*G0_0_0_0_1_2 - 0.0015873015873016*G0_0_0_0_1_5 - 0.000793650793650796*G0_0_0_0_2_0 + 0.000396825396825395*G0_0_0_0_2_1 - 0.000793650793650793*G0_0_0_0_2_2 - 0.0015873015873016*G0_0_0_0_2_4 + 0.00158730158730157*G0_0_0_0_3_0 - 0.00634920634920629*G0_0_0_0_3_3 - 0.00317460317460314*G0_0_0_0_3_4 - 0.00317460317460314*G0_0_0_0_3_5 + 0.00476190476190478*G0_0_0_0_4_0 - 0.0015873015873016*G0_0_0_0_4_2 - 0.00317460317460314*G0_0_0_0_4_3 + 0.00476190476190478*G0_0_0_0_5_0 - 0.0015873015873016*G0_0_0_0_5_1 - 0.00317460317460314*G0_0_0_0_5_3 - 0.000793650793650797*G0_0_0_1_0_0 - 0.000793650793650794*G0_0_0_1_0_1 + 0.000396825396825395*G0_0_0_1_0_2 - 0.0015873015873016*G0_0_0_1_0_5 - 0.000793650793650794*G0_0_0_1_1_0 + 0.00714285714285721*G0_0_0_1_1_1 - 0.000793650793650796*G0_0_0_1_1_2 + 0.00476190476190478*G0_0_0_1_1_3 + 0.00158730158730158*G0_0_0_1_1_4 + 0.00476190476190478*G0_0_0_1_1_5 + 0.000396825396825395*G0_0_0_1_2_0 - 0.000793650793650796*G0_0_0_1_2_1 - 0.000793650793650795*G0_0_0_1_2_2 - 0.0015873015873016*G0_0_0_1_2_3 + 0.00476190476190478*G0_0_0_1_3_1 - 0.0015873015873016*G0_0_0_1_3_2 - 0.00317460317460315*G0_0_0_1_3_4 + 0.00158730158730158*G0_0_0_1_4_1 - 0.00317460317460315*G0_0_0_1_4_3 - 0.00634920634920632*G0_0_0_1_4_4 - 0.00317460317460316*G0_0_0_1_4_5 - 0.0015873015873016*G0_0_0_1_5_0 + 0.00476190476190478*G0_0_0_1_5_1 - 0.00317460317460316*G0_0_0_1_5_4 - 0.000793650793650796*G0_0_0_2_0_0 + 0.000396825396825395*G0_0_0_2_0_1 - 0.000793650793650793*G0_0_0_2_0_2 - 0.0015873015873016*G0_0_0_2_0_4 + 0.000396825396825395*G0_0_0_2_1_0 - 0.000793650793650796*G0_0_0_2_1_1 - 0.000793650793650795*G0_0_0_2_1_2 - 0.0015873015873016*G0_0_0_2_1_3 - 0.000793650793650793*G0_0_0_2_2_0 - 0.000793650793650795*G0_0_0_2_2_1 + 0.00714285714285721*G0_0_0_2_2_2 + 0.00476190476190478*G0_0_0_2_2_3 + 0.00476190476190478*G0_0_0_2_2_4 + 0.00158730158730158*G0_0_0_2_2_5 - 0.0015873015873016*G0_0_0_2_3_1 + 0.00476190476190478*G0_0_0_2_3_2 - 0.00317460317460315*G0_0_0_2_3_5 - 0.0015873015873016*G0_0_0_2_4_0 + 0.00476190476190478*G0_0_0_2_4_2 - 0.00317460317460316*G0_0_0_2_4_5 + 0.00158730158730158*G0_0_0_2_5_2 - 0.00317460317460315*G0_0_0_2_5_3 - 0.00317460317460316*G0_0_0_2_5_4 - 0.00634920634920633*G0_0_0_2_5_5 + 0.00158730158730157*G0_0_0_3_0_0 - 0.00634920634920629*G0_0_0_3_0_3 - 0.00317460317460314*G0_0_0_3_0_4 - 0.00317460317460314*G0_0_0_3_0_5 + 0.00476190476190478*G0_0_0_3_1_1 - 0.0015873015873016*G0_0_0_3_1_2 - 0.00317460317460315*G0_0_0_3_1_4 - 0.0015873015873016*G0_0_0_3_2_1 + 0.00476190476190478*G0_0_0_3_2_2 - 0.00317460317460315*G0_0_0_3_2_5 - 0.00634920634920629*G0_0_0_3_3_0 + 0.0571428571428575*G0_0_0_3_3_3 + 0.0190476190476189*G0_0_0_3_3_4 + 0.0190476190476189*G0_0_0_3_3_5 - 0.00317460317460314*G0_0_0_3_4_0 - 0.00317460317460315*G0_0_0_3_4_1 + 0.0190476190476189*G0_0_0_3_4_3 + 0.0190476190476189*G0_0_0_3_4_4 + 0.0126984126984126*G0_0_0_3_4_5 - 0.00317460317460314*G0_0_0_3_5_0 - 0.00317460317460315*G0_0_0_3_5_2 + 0.0190476190476189*G0_0_0_3_5_3 + 0.0126984126984126*G0_0_0_3_5_4 + 0.0190476190476189*G0_0_0_3_5_5 + 0.00476190476190478*G0_0_0_4_0_0 - 0.0015873015873016*G0_0_0_4_0_2 - 0.00317460317460314*G0_0_0_4_0_3 + 0.00158730158730158*G0_0_0_4_1_1 - 0.00317460317460315*G0_0_0_4_1_3 - 0.00634920634920632*G0_0_0_4_1_4 - 0.00317460317460316*G0_0_0_4_1_5 - 0.0015873015873016*G0_0_0_4_2_0 + 0.00476190476190478*G0_0_0_4_2_2 - 0.00317460317460316*G0_0_0_4_2_5 - 0.00317460317460314*G0_0_0_4_3_0 - 0.00317460317460315*G0_0_0_4_3_1 + 0.0190476190476189*G0_0_0_4_3_3 + 0.0190476190476189*G0_0_0_4_3_4 + 0.0126984126984126*G0_0_0_4_3_5 - 0.00634920634920632*G0_0_0_4_4_1 + 0.0190476190476189*G0_0_0_4_4_3 + 0.0571428571428576*G0_0_0_4_4_4 + 0.019047619047619*G0_0_0_4_4_5 - 0.00317460317460316*G0_0_0_4_5_1 - 0.00317460317460316*G0_0_0_4_5_2 + 0.0126984126984126*G0_0_0_4_5_3 + 0.019047619047619*G0_0_0_4_5_4 + 0.019047619047619*G0_0_0_4_5_5 + 0.00476190476190478*G0_0_0_5_0_0 - 0.0015873015873016*G0_0_0_5_0_1 - 0.00317460317460314*G0_0_0_5_0_3 - 0.0015873015873016*G0_0_0_5_1_0 + 0.00476190476190478*G0_0_0_5_1_1 - 0.00317460317460316*G0_0_0_5_1_4 + 0.00158730158730158*G0_0_0_5_2_2 - 0.00317460317460315*G0_0_0_5_2_3 - 0.00317460317460316*G0_0_0_5_2_4 - 0.00634920634920633*G0_0_0_5_2_5 - 0.00317460317460314*G0_0_0_5_3_0 - 0.00317460317460315*G0_0_0_5_3_2 + 0.0190476190476189*G0_0_0_5_3_3 + 0.0126984126984126*G0_0_0_5_3_4 + 0.0190476190476189*G0_0_0_5_3_5 - 0.00317460317460316*G0_0_0_5_4_1 - 0.00317460317460316*G0_0_0_5_4_2 + 0.0126984126984126*G0_0_0_5_4_3 + 0.019047619047619*G0_0_0_5_4_4 + 0.019047619047619*G0_0_0_5_4_5 - 0.00634920634920633*G0_0_0_5_5_2 + 0.0190476190476189*G0_0_0_5_5_3 + 0.019047619047619*G0_0_0_5_5_4 + 0.0571428571428577*G0_0_0_5_5_5; + A[3] = -A[4] - 0.00714285714285721*G0_0_1_0_0_0 + 0.000793650793650796*G0_0_1_0_0_1 + 0.000793650793650796*G0_0_1_0_0_2 - 0.00158730158730157*G0_0_1_0_0_3 - 0.00476190476190478*G0_0_1_0_0_4 - 0.00476190476190478*G0_0_1_0_0_5 + 0.000793650793650796*G0_0_1_0_1_0 + 0.000793650793650794*G0_0_1_0_1_1 - 0.000396825396825395*G0_0_1_0_1_2 + 0.0015873015873016*G0_0_1_0_1_5 + 0.000793650793650796*G0_0_1_0_2_0 - 0.000396825396825395*G0_0_1_0_2_1 + 0.000793650793650793*G0_0_1_0_2_2 + 0.0015873015873016*G0_0_1_0_2_4 - 0.00158730158730157*G0_0_1_0_3_0 + 0.00634920634920629*G0_0_1_0_3_3 + 0.00317460317460314*G0_0_1_0_3_4 + 0.00317460317460314*G0_0_1_0_3_5 - 0.00476190476190478*G0_0_1_0_4_0 + 0.0015873015873016*G0_0_1_0_4_2 + 0.00317460317460314*G0_0_1_0_4_3 - 0.00476190476190478*G0_0_1_0_5_0 + 0.0015873015873016*G0_0_1_0_5_1 + 0.00317460317460314*G0_0_1_0_5_3 + 0.000793650793650797*G0_0_1_1_0_0 + 0.000793650793650794*G0_0_1_1_0_1 - 0.000396825396825395*G0_0_1_1_0_2 + 0.0015873015873016*G0_0_1_1_0_5 + 0.000793650793650794*G0_0_1_1_1_0 - 0.00714285714285721*G0_0_1_1_1_1 + 0.000793650793650796*G0_0_1_1_1_2 - 0.00476190476190478*G0_0_1_1_1_3 - 0.00158730158730158*G0_0_1_1_1_4 - 0.00476190476190478*G0_0_1_1_1_5 - 0.000396825396825395*G0_0_1_1_2_0 + 0.000793650793650796*G0_0_1_1_2_1 + 0.000793650793650795*G0_0_1_1_2_2 + 0.0015873015873016*G0_0_1_1_2_3 - 0.00476190476190478*G0_0_1_1_3_1 + 0.0015873015873016*G0_0_1_1_3_2 + 0.00317460317460315*G0_0_1_1_3_4 - 0.00158730158730158*G0_0_1_1_4_1 + 0.00317460317460315*G0_0_1_1_4_3 + 0.00634920634920632*G0_0_1_1_4_4 + 0.00317460317460316*G0_0_1_1_4_5 + 0.0015873015873016*G0_0_1_1_5_0 - 0.00476190476190478*G0_0_1_1_5_1 + 0.00317460317460316*G0_0_1_1_5_4 + 0.000793650793650796*G0_0_1_2_0_0 - 0.000396825396825395*G0_0_1_2_0_1 + 0.000793650793650793*G0_0_1_2_0_2 + 0.0015873015873016*G0_0_1_2_0_4 - 0.000396825396825395*G0_0_1_2_1_0 + 0.000793650793650796*G0_0_1_2_1_1 + 0.000793650793650795*G0_0_1_2_1_2 + 0.0015873015873016*G0_0_1_2_1_3 + 0.000793650793650793*G0_0_1_2_2_0 + 0.000793650793650795*G0_0_1_2_2_1 - 0.00714285714285721*G0_0_1_2_2_2 - 0.00476190476190478*G0_0_1_2_2_3 - 0.00476190476190478*G0_0_1_2_2_4 - 0.00158730158730158*G0_0_1_2_2_5 + 0.0015873015873016*G0_0_1_2_3_1 - 0.00476190476190478*G0_0_1_2_3_2 + 0.00317460317460315*G0_0_1_2_3_5 + 0.0015873015873016*G0_0_1_2_4_0 - 0.00476190476190478*G0_0_1_2_4_2 + 0.00317460317460316*G0_0_1_2_4_5 - 0.00158730158730158*G0_0_1_2_5_2 + 0.00317460317460315*G0_0_1_2_5_3 + 0.00317460317460316*G0_0_1_2_5_4 + 0.00634920634920633*G0_0_1_2_5_5 - 0.00158730158730157*G0_0_1_3_0_0 + 0.00634920634920629*G0_0_1_3_0_3 + 0.00317460317460314*G0_0_1_3_0_4 + 0.00317460317460314*G0_0_1_3_0_5 - 0.00476190476190478*G0_0_1_3_1_1 + 0.0015873015873016*G0_0_1_3_1_2 + 0.00317460317460315*G0_0_1_3_1_4 + 0.0015873015873016*G0_0_1_3_2_1 - 0.00476190476190478*G0_0_1_3_2_2 + 0.00317460317460315*G0_0_1_3_2_5 + 0.00634920634920629*G0_0_1_3_3_0 - 0.0571428571428575*G0_0_1_3_3_3 - 0.0190476190476189*G0_0_1_3_3_4 - 0.0190476190476189*G0_0_1_3_3_5 + 0.00317460317460314*G0_0_1_3_4_0 + 0.00317460317460315*G0_0_1_3_4_1 - 0.0190476190476189*G0_0_1_3_4_3 - 0.0190476190476189*G0_0_1_3_4_4 - 0.0126984126984126*G0_0_1_3_4_5 + 0.00317460317460314*G0_0_1_3_5_0 + 0.00317460317460315*G0_0_1_3_5_2 - 0.0190476190476189*G0_0_1_3_5_3 - 0.0126984126984126*G0_0_1_3_5_4 - 0.0190476190476189*G0_0_1_3_5_5 - 0.00476190476190478*G0_0_1_4_0_0 + 0.0015873015873016*G0_0_1_4_0_2 + 0.00317460317460314*G0_0_1_4_0_3 - 0.00158730158730158*G0_0_1_4_1_1 + 0.00317460317460315*G0_0_1_4_1_3 + 0.00634920634920632*G0_0_1_4_1_4 + 0.00317460317460316*G0_0_1_4_1_5 + 0.0015873015873016*G0_0_1_4_2_0 - 0.00476190476190478*G0_0_1_4_2_2 + 0.00317460317460316*G0_0_1_4_2_5 + 0.00317460317460314*G0_0_1_4_3_0 + 0.00317460317460315*G0_0_1_4_3_1 - 0.0190476190476189*G0_0_1_4_3_3 - 0.0190476190476189*G0_0_1_4_3_4 - 0.0126984126984126*G0_0_1_4_3_5 + 0.00634920634920632*G0_0_1_4_4_1 - 0.0190476190476189*G0_0_1_4_4_3 - 0.0571428571428576*G0_0_1_4_4_4 - 0.019047619047619*G0_0_1_4_4_5 + 0.00317460317460316*G0_0_1_4_5_1 + 0.00317460317460316*G0_0_1_4_5_2 - 0.0126984126984126*G0_0_1_4_5_3 - 0.019047619047619*G0_0_1_4_5_4 - 0.019047619047619*G0_0_1_4_5_5 - 0.00476190476190478*G0_0_1_5_0_0 + 0.0015873015873016*G0_0_1_5_0_1 + 0.00317460317460314*G0_0_1_5_0_3 + 0.0015873015873016*G0_0_1_5_1_0 - 0.00476190476190478*G0_0_1_5_1_1 + 0.00317460317460316*G0_0_1_5_1_4 - 0.00158730158730158*G0_0_1_5_2_2 + 0.00317460317460315*G0_0_1_5_2_3 + 0.00317460317460316*G0_0_1_5_2_4 + 0.00634920634920633*G0_0_1_5_2_5 + 0.00317460317460314*G0_0_1_5_3_0 + 0.00317460317460315*G0_0_1_5_3_2 - 0.0190476190476189*G0_0_1_5_3_3 - 0.0126984126984126*G0_0_1_5_3_4 - 0.0190476190476189*G0_0_1_5_3_5 + 0.00317460317460316*G0_0_1_5_4_1 + 0.00317460317460316*G0_0_1_5_4_2 - 0.0126984126984126*G0_0_1_5_4_3 - 0.019047619047619*G0_0_1_5_4_4 - 0.019047619047619*G0_0_1_5_4_5 + 0.00634920634920633*G0_0_1_5_5_2 - 0.0190476190476189*G0_0_1_5_5_3 - 0.019047619047619*G0_0_1_5_5_4 - 0.0571428571428577*G0_0_1_5_5_5; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p2_q1_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p2_q1_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q1_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 1, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q1_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p2_q1_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p2_q1_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q1_tensor_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q1_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q1_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p2_q1_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p2_q1_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q1_tensor_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q1_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q1_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p2_q2_quadrature.h b/laplacian_2d/laplacian_f3_p2_q2_quadrature.h new file mode 100644 index 0000000..29778a5 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p2_q2_quadrature.h @@ -0,0 +1,2329 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P2_Q2_QUADRATURE_H +#define __LAPLACIAN_F3_P2_Q2_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q2_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q2_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q2_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q2_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q2_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q2_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q2_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q2_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p2_q2_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p2_q2_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q2_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W25[25] = {0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0275289856644697, 0.0475518970579538, 0.0416389652151948, 0.021022967487322, 0.00447940679728133, 0.0231612219294983, 0.0400072873861603, 0.0350325045033716, 0.0176874521104834, 0.0037687016953276, 0.0114650803515925, 0.0198040831320473, 0.0173415064313656, 0.0087554991821638, 0.00186555216687783}; + // Quadrature points on the UFC reference element: (0.0450425935698037, 0.0398098570514687), (0.0376212523451112, 0.198013417873608), (0.0263646449444709, 0.437974810247386), (0.0142857943955714, 0.695464273353636), (0.00462228846504642, 0.901464914201174), (0.221578609552379, 0.0398098570514687), (0.185070710267389, 0.198013417873608), (0.129695936782254, 0.437974810247386), (0.0702762920082817, 0.695464273353636), (0.022738483063764, 0.901464914201174), (0.480095071474266, 0.0398098570514687), (0.400993291063196, 0.198013417873608), (0.281012594876307, 0.437974810247386), (0.152267863323182, 0.695464273353636), (0.0492675428994132, 0.901464914201174), (0.738611533396152, 0.0398098570514687), (0.616915871859002, 0.198013417873608), (0.43232925297036, 0.437974810247386), (0.234259434638082, 0.695464273353636), (0.0757966027350624, 0.901464914201174), (0.915147549378728, 0.0398098570514687), (0.764365329781281, 0.198013417873608), (0.535660544808143, 0.437974810247386), (0.290249932250792, 0.695464273353636), (0.09391279733378, 0.901464914201174) + + // Value of basis functions at quadrature points. + static const double FE0[25][6] = \ + {{0.759842524889054, -0.0409849230988147, -0.036640207614552, 0.00717255684496523, 0.145727572487076, 0.164882476492272}, + {0.404143384962011, -0.0347905350890822, -0.119594790557632, 0.0297980510461639, 0.605418365816316, 0.115025523822223}, + {0.0382038937201701, -0.0249744559383749, -0.0543309414249183, 0.0461882014671774, 0.938423301877431, 0.0564900002985142}, + {-0.121759885907613, -0.0138776265525463, 0.271876837668966, 0.0397410384743819, 0.807433832894958, 0.0165858034218535}, + {-0.0762735703276686, -0.00457955736373816, 0.723813068870285, 0.0166673234982246, 0.338636367163553, 0.00173636815934486}, + {0.352482461135478, -0.123384449130048, -0.036640207614552, 0.0352840510877737, 0.117616078244268, 0.65464206627708}, + {0.144254514044104, -0.116568374669637, -0.119594790557632, 0.146585935553368, 0.488630481309112, 0.456692234320686}, + {-0.0585120870225411, -0.0960538647466012, -0.0543309414249183, 0.227214213208259, 0.75739729013635, 0.224285389849452}, + {-0.124504469204174, -0.0603987775714151, 0.271876837668966, 0.19549860142211, 0.65167626994723, 0.0658515377372835}, + {-0.0643063527627086, -0.0217044058396818, 0.723813068870285, 0.0819917787365634, 0.273311911925214, 0.00689399907032842}, + {-0.0191125161665051, -0.0191125161665051, -0.036640207614552, 0.0764500646660207, 0.0764500646660208, 0.921965110615521}, + {-0.0794020521078099, -0.07940205210781, -0.119594790557632, 0.31760820843124, 0.31760820843124, 0.643182477910772}, + {-0.123076437918076, -0.123076437918076, -0.0543309414249183, 0.492305751672304, 0.492305751672304, 0.315872313916462}, + {-0.105896858921167, -0.105896858921167, 0.271876837668966, 0.42358743568467, 0.42358743568467, 0.092742008804029}, + {-0.0444129613327221, -0.0444129613327221, 0.723813068870285, 0.177651845330889, 0.177651845330889, 0.00970916313338224}, + {-0.123384449130048, 0.352482461135478, -0.036640207614552, 0.117616078244268, 0.0352840510877737, 0.65464206627708}, + {-0.116568374669637, 0.144254514044104, -0.119594790557632, 0.488630481309112, 0.146585935553368, 0.456692234320686}, + {-0.0960538647466011, -0.0585120870225411, -0.0543309414249183, 0.75739729013635, 0.227214213208259, 0.224285389849452}, + {-0.0603987775714151, -0.124504469204174, 0.271876837668966, 0.651676269947229, 0.19549860142211, 0.0658515377372836}, + {-0.0217044058396817, -0.0643063527627086, 0.723813068870285, 0.273311911925214, 0.0819917787365632, 0.00689399907032842}, + {-0.0409849230988146, 0.759842524889054, -0.036640207614552, 0.145727572487076, 0.00717255684496521, 0.164882476492272}, + {-0.034790535089082, 0.404143384962011, -0.119594790557632, 0.605418365816316, 0.0297980510461639, 0.115025523822223}, + {-0.0249744559383748, 0.03820389372017, -0.0543309414249183, 0.938423301877431, 0.0461882014671775, 0.0564900002985144}, + {-0.0138776265525463, -0.121759885907613, 0.271876837668966, 0.807433832894958, 0.0397410384743822, 0.0165858034218536}, + {-0.00457955736373805, -0.0762735703276686, 0.723813068870285, 0.338636367163553, 0.0166673234982244, 0.00173636815934486}}; + + static const double FE0_D01[25][5] = \ + {{-2.66059019751491, -0.840760571794125, 0.180170374279214, 3.50135076930903, -0.180170374279215}, + {-2.05746131912512, -0.207946328505567, 0.150485009380445, 2.26540764763069, -0.150485009380445}, + {-1.14264217923257, 0.751899240989545, 0.105458579777883, 0.390742938243027, -0.105458579777883}, + {-0.16099972900317, 1.78185709341454, 0.0571431775822844, -1.62085736441137, -0.0571431775822849}, + {0.62434881066488, 2.60585965680469, 0.0184891538601843, -3.23020846746957, -0.0184891538601846}, + {-1.95444613358461, -0.840760571794125, 0.886314438209516, 2.79520670537873, -0.886314438209517}, + {-1.46766348743601, -0.207946328505567, 0.740282841069557, 1.67560981594158, -0.740282841069557}, + {-0.729317011881439, 0.751899240989545, 0.518783747129016, -0.0225822291081054, -0.518783747129016}, + {0.062962261447671, 1.78185709341454, 0.281105168033126, -1.84481935486221, -0.281105168033126}, + {0.696813589059751, 2.60585965680469, 0.0909539322550548, -3.30267324586444, -0.0909539322550551}, + {-0.920380285897062, -0.840760571794125, 1.92038028589706, 1.76114085769119, -1.92038028589706}, + {-0.603973164252783, -0.207946328505567, 1.60397316425278, 0.811919492758351, -1.60397316425278}, + {-0.124050379505228, 0.751899240989545, 1.12405037950523, -0.627848861484317, -1.12405037950523}, + {0.390928546707272, 1.78185709341454, 0.609071453292727, -2.17278564012182, -0.609071453292727}, + {0.802929828402348, 2.60585965680469, 0.197070171597651, -3.40878948520704, -0.197070171597652}, + {0.113685561790483, -0.840760571794125, 2.95444613358461, 0.727075010003643, -2.95444613358461}, + {0.259717158930442, -0.207946328505567, 2.46766348743601, -0.0517708304248746, -2.46766348743601}, + {0.481216252870984, 0.751899240989545, 1.72931701188144, -1.23311549386053, -1.72931701188144}, + {0.718894831966873, 1.78185709341454, 0.937037738552328, -2.50075192538142, -0.937037738552329}, + {0.909046067744944, 2.60585965680469, 0.303186410940248, -3.51490572454964, -0.303186410940249}, + {0.819829625720785, -0.840760571794125, 3.66059019751491, 0.0209309460733413, -3.66059019751491}, + {0.849514990619555, -0.207946328505567, 3.05746131912512, -0.641568662113987, -3.05746131912512}, + {0.894541420222116, 0.751899240989545, 2.14264217923257, -1.64644066121166, -2.14264217923257}, + {0.942856822417714, 1.78185709341454, 1.16099972900317, -2.72471391583226, -1.16099972900317}, + {0.981510846139815, 2.60585965680469, 0.375651189335118, -3.58737050294451, -0.375651189335119}}; + + // Array of non-zero columns + static const unsigned int nzc0[5] = {0, 2, 3, 4, 5}; + + static const double FE0_D10[25][5] = \ + {{-2.66059019751491, -0.819829625720785, 0.159239428205874, -0.159239428205874, 3.4804198232357}, + {-2.05746131912512, -0.849514990619555, 0.792053671494432, -0.792053671494432, 2.90697630974468}, + {-1.14264217923257, -0.894541420222117, 1.75189924098954, -1.75189924098954, 2.03718359945469}, + {-0.16099972900317, -0.942856822417715, 2.78185709341454, -2.78185709341454, 1.10385655142089}, + {0.624348810664881, -0.981510846139815, 3.60585965680469, -3.60585965680469, 0.357162035474935}, + {-1.95444613358461, -0.113685561790483, 0.159239428205874, -0.159239428205874, 2.06813169537509}, + {-1.46766348743601, -0.259717158930443, 0.792053671494432, -0.792053671494432, 1.72738064636645}, + {-0.729317011881439, -0.481216252870984, 1.75189924098954, -1.75189924098954, 1.21053326475242}, + {0.0629622614476716, -0.718894831966874, 2.78185709341454, -2.78185709341454, 0.655932570519203}, + {0.696813589059751, -0.909046067744944, 3.60585965680469, -3.60585965680469, 0.212232478685194}, + {-0.920380285897062, 0.920380285897063, 0.159239428205874, -0.159239428205874, 0.0}, + {-0.603973164252783, 0.603973164252784, 0.792053671494432, -0.792053671494432, 0.0}, + {-0.124050379505227, 0.124050379505228, 1.75189924098954, -1.75189924098954, 0.0}, + {0.390928546707273, -0.390928546707272, 2.78185709341454, -2.78185709341454, 0.0}, + {0.802929828402348, -0.802929828402348, 3.60585965680469, -3.60585965680469, 0.0}, + {0.113685561790483, 1.95444613358461, 0.159239428205874, -0.159239428205874, -2.06813169537509}, + {0.259717158930442, 1.46766348743601, 0.792053671494432, -0.792053671494432, -1.72738064636645}, + {0.481216252870984, 0.729317011881439, 1.75189924098954, -1.75189924098954, -1.21053326475242}, + {0.718894831966873, -0.0629622614476714, 2.78185709341454, -2.78185709341454, -0.655932570519202}, + {0.909046067744945, -0.696813589059751, 3.60585965680469, -3.60585965680469, -0.212232478685193}, + {0.819829625720784, 2.66059019751491, 0.159239428205873, -0.159239428205873, -3.48041982323569}, + {0.849514990619555, 2.05746131912512, 0.792053671494432, -0.792053671494432, -2.90697630974468}, + {0.894541420222116, 1.14264217923257, 1.75189924098954, -1.75189924098954, -2.03718359945469}, + {0.942856822417715, 0.16099972900317, 2.78185709341454, -2.78185709341454, -1.10385655142088}, + {0.981510846139815, -0.62434881066488, 3.60585965680469, -3.60585965680469, -0.357162035474934}}; + + // Array of non-zero columns + static const unsigned int nzc1[5] = {0, 1, 3, 4, 5}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 36; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 8700 + for (unsigned int ip = 0; ip < 25; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + double F2 = 0.0; + + // Total number of operations to compute function values = 36 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE0[ip][r]*w[2][r]; + F1 += FE0[ip][r]*w[0][r]; + F2 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 12 + double I[3]; + // Number of operations: 4 + I[0] = F0*F1*F2*G[0]*W25[ip]; + + // Number of operations: 4 + I[1] = F0*F1*F2*G[1]*W25[ip]; + + // Number of operations: 4 + I[2] = F0*F1*F2*G[2]*W25[ip]; + + + // Number of operations for primary indices: 300 + for (unsigned int j = 0; j < 5; j++) + { + for (unsigned int k = 0; k < 5; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc0[k]] += FE0_D01[ip][j]*FE0_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*6 + nzc1[k]] += FE0_D01[ip][j]*FE0_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc0[k]] += FE0_D01[ip][k]*FE0_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*6 + nzc1[k]] += FE0_D10[ip][j]*FE0_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p2_q2_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p2_q2_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q2_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q2_quadrature_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f3_p2_q2_quadrature_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f3_p2_q2_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q2_quadrature_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q2_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q2_quadrature_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f3_p2_q2_quadrature_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f3_p2_q2_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q2_quadrature_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q2_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q2_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p2_q2_tensor.h b/laplacian_2d/laplacian_f3_p2_q2_tensor.h new file mode 100644 index 0000000..e9a3642 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p2_q2_tensor.h @@ -0,0 +1,3078 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P2_Q2_TENSOR_H +#define __LAPLACIAN_F3_P2_Q2_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q2_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q2_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q2_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q2_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q2_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q2_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q2_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q2_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p2_q2_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p2_q2_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q2_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 3024 + // Number of operations (multiply-add pairs) for tensor contraction: 13210 + // Total number of operations (multiply-add pairs): 16245 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_3 = det*(w[2][0]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_4 = det*(w[2][0]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_3 = det*(w[2][0]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_5 = det*(w[2][0]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_1 = det*(w[2][0]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_2 = det*(w[2][0]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_1 = det*(w[2][0]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_4 = det*(w[2][0]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_5 = det*(w[2][0]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_2 = det*(w[2][0]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_4 = det*(w[2][0]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_5 = det*(w[2][0]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_3 = det*(w[2][1]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_4 = det*(w[2][1]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_4 = det*(w[2][1]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_5 = det*(w[2][1]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_0 = det*(w[2][1]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_3 = det*(w[2][1]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_5 = det*(w[2][1]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_0 = det*(w[2][1]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_2 = det*(w[2][1]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_2 = det*(w[2][1]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_3 = det*(w[2][1]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_5 = det*(w[2][1]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_3 = det*(w[2][2]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_5 = det*(w[2][2]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_4 = det*(w[2][2]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_5 = det*(w[2][2]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_0 = det*(w[2][2]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_3 = det*(w[2][2]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_4 = det*(w[2][2]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_1 = det*(w[2][2]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_3 = det*(w[2][2]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_4 = det*(w[2][2]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_0 = det*(w[2][2]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_1 = det*(w[2][2]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_1 = det*(w[2][3]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_2 = det*(w[2][3]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_0 = det*(w[2][3]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_3 = det*(w[2][3]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_5 = det*(w[2][3]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_0 = det*(w[2][3]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_3 = det*(w[2][3]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_4 = det*(w[2][3]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_1 = det*(w[2][3]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_2 = det*(w[2][3]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_2 = det*(w[2][3]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_1 = det*(w[2][3]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_1 = det*(w[2][4]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_4 = det*(w[2][4]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_5 = det*(w[2][4]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_0 = det*(w[2][4]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_2 = det*(w[2][4]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_1 = det*(w[2][4]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_3 = det*(w[2][4]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_4 = det*(w[2][4]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_2 = det*(w[2][4]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_0 = det*(w[2][4]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_2 = det*(w[2][4]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_0 = det*(w[2][4]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_2 = det*(w[2][5]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_4 = det*(w[2][5]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_5 = det*(w[2][5]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_2 = det*(w[2][5]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_3 = det*(w[2][5]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_5 = det*(w[2][5]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_0 = det*(w[2][5]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_1 = det*(w[2][5]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_1 = det*(w[2][5]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_0 = det*(w[2][5]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_0 = det*(w[2][5]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_1 = det*(w[2][5]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_3 = det*(w[2][0]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_4 = det*(w[2][0]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_3 = det*(w[2][0]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_5 = det*(w[2][0]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_1 = det*(w[2][0]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_2 = det*(w[2][0]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_1 = det*(w[2][0]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_4 = det*(w[2][0]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_5 = det*(w[2][0]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_2 = det*(w[2][0]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_4 = det*(w[2][0]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_5 = det*(w[2][0]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_3 = det*(w[2][1]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_4 = det*(w[2][1]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_4 = det*(w[2][1]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_5 = det*(w[2][1]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_0 = det*(w[2][1]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_3 = det*(w[2][1]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_5 = det*(w[2][1]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_0 = det*(w[2][1]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_2 = det*(w[2][1]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_2 = det*(w[2][1]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_3 = det*(w[2][1]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_5 = det*(w[2][1]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_3 = det*(w[2][2]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_5 = det*(w[2][2]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_4 = det*(w[2][2]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_5 = det*(w[2][2]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_0 = det*(w[2][2]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_3 = det*(w[2][2]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_4 = det*(w[2][2]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_1 = det*(w[2][2]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_3 = det*(w[2][2]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_4 = det*(w[2][2]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_0 = det*(w[2][2]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_1 = det*(w[2][2]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_1 = det*(w[2][3]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_2 = det*(w[2][3]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_0 = det*(w[2][3]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_3 = det*(w[2][3]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_5 = det*(w[2][3]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_0 = det*(w[2][3]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_3 = det*(w[2][3]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_4 = det*(w[2][3]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_1 = det*(w[2][3]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_2 = det*(w[2][3]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_2 = det*(w[2][3]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_1 = det*(w[2][3]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_1 = det*(w[2][4]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_4 = det*(w[2][4]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_5 = det*(w[2][4]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_0 = det*(w[2][4]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_2 = det*(w[2][4]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_1 = det*(w[2][4]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_3 = det*(w[2][4]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_4 = det*(w[2][4]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_2 = det*(w[2][4]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_0 = det*(w[2][4]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_2 = det*(w[2][4]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_0 = det*(w[2][4]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_2 = det*(w[2][5]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_4 = det*(w[2][5]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_5 = det*(w[2][5]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_2 = det*(w[2][5]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_3 = det*(w[2][5]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_5 = det*(w[2][5]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_0 = det*(w[2][5]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_1 = det*(w[2][5]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_1 = det*(w[2][5]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_0 = det*(w[2][5]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_0 = det*(w[2][5]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_1 = det*(w[2][5]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_3 = det*(w[2][0]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_4 = det*(w[2][0]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_3 = det*(w[2][0]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_5 = det*(w[2][0]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_1 = det*(w[2][0]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_2 = det*(w[2][0]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_1 = det*(w[2][0]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_4 = det*(w[2][0]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_5 = det*(w[2][0]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_2 = det*(w[2][0]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_4 = det*(w[2][0]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_5 = det*(w[2][0]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_3 = det*(w[2][1]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_4 = det*(w[2][1]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_4 = det*(w[2][1]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_5 = det*(w[2][1]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_0 = det*(w[2][1]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_3 = det*(w[2][1]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_5 = det*(w[2][1]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_0 = det*(w[2][1]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_2 = det*(w[2][1]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_2 = det*(w[2][1]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_3 = det*(w[2][1]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_5 = det*(w[2][1]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_3 = det*(w[2][2]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_5 = det*(w[2][2]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_4 = det*(w[2][2]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_5 = det*(w[2][2]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_0 = det*(w[2][2]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_3 = det*(w[2][2]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_4 = det*(w[2][2]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_1 = det*(w[2][2]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_3 = det*(w[2][2]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_4 = det*(w[2][2]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_0 = det*(w[2][2]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_1 = det*(w[2][2]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_1 = det*(w[2][3]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_2 = det*(w[2][3]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_0 = det*(w[2][3]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_3 = det*(w[2][3]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_5 = det*(w[2][3]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_0 = det*(w[2][3]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_3 = det*(w[2][3]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_4 = det*(w[2][3]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_1 = det*(w[2][3]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_2 = det*(w[2][3]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_2 = det*(w[2][3]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_1 = det*(w[2][3]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_1 = det*(w[2][4]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_4 = det*(w[2][4]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_5 = det*(w[2][4]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_0 = det*(w[2][4]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_2 = det*(w[2][4]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_1 = det*(w[2][4]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_3 = det*(w[2][4]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_4 = det*(w[2][4]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_2 = det*(w[2][4]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_0 = det*(w[2][4]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_2 = det*(w[2][4]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_0 = det*(w[2][4]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_2 = det*(w[2][5]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_4 = det*(w[2][5]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_5 = det*(w[2][5]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_2 = det*(w[2][5]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_3 = det*(w[2][5]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_5 = det*(w[2][5]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_0 = det*(w[2][5]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_1 = det*(w[2][5]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_1 = det*(w[2][5]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_0 = det*(w[2][5]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_0 = det*(w[2][5]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_1 = det*(w[2][5]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_3 = det*(w[2][0]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_4 = det*(w[2][0]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_3 = det*(w[2][0]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_5 = det*(w[2][0]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_1 = det*(w[2][0]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_2 = det*(w[2][0]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_1 = det*(w[2][0]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_4 = det*(w[2][0]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_5 = det*(w[2][0]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_2 = det*(w[2][0]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_4 = det*(w[2][0]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_5 = det*(w[2][0]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_3 = det*(w[2][1]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_4 = det*(w[2][1]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_4 = det*(w[2][1]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_5 = det*(w[2][1]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_0 = det*(w[2][1]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_3 = det*(w[2][1]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_5 = det*(w[2][1]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_0 = det*(w[2][1]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_2 = det*(w[2][1]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_2 = det*(w[2][1]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_3 = det*(w[2][1]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_5 = det*(w[2][1]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_3 = det*(w[2][2]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_5 = det*(w[2][2]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_4 = det*(w[2][2]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_5 = det*(w[2][2]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_0 = det*(w[2][2]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_3 = det*(w[2][2]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_4 = det*(w[2][2]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_1 = det*(w[2][2]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_3 = det*(w[2][2]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_4 = det*(w[2][2]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_0 = det*(w[2][2]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_1 = det*(w[2][2]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_1 = det*(w[2][3]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_2 = det*(w[2][3]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_0 = det*(w[2][3]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_3 = det*(w[2][3]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_5 = det*(w[2][3]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_0 = det*(w[2][3]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_3 = det*(w[2][3]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_4 = det*(w[2][3]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_1 = det*(w[2][3]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_2 = det*(w[2][3]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_2 = det*(w[2][3]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_1 = det*(w[2][3]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_1 = det*(w[2][4]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_4 = det*(w[2][4]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_5 = det*(w[2][4]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_0 = det*(w[2][4]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_2 = det*(w[2][4]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_1 = det*(w[2][4]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_3 = det*(w[2][4]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_4 = det*(w[2][4]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_2 = det*(w[2][4]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_0 = det*(w[2][4]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_2 = det*(w[2][4]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_0 = det*(w[2][4]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_2 = det*(w[2][5]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_4 = det*(w[2][5]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_5 = det*(w[2][5]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_2 = det*(w[2][5]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_3 = det*(w[2][5]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_5 = det*(w[2][5]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_0 = det*(w[2][5]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_1 = det*(w[2][5]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_1 = det*(w[2][5]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_0 = det*(w[2][5]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_0 = det*(w[2][5]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_1 = det*(w[2][5]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[9] = -0.00158730158730157*G0_0_0_0_0_0 + 0.000317460317460315*G0_0_0_0_0_1 - 0.00021164021164021*G0_0_0_0_0_2 + 0.000423280423280419*G0_0_0_0_0_3 - 0.00211640211640211*G0_0_0_0_0_4 + 0.000317460317460315*G0_0_0_0_1_0 - 0.000529100529100523*G0_0_0_0_1_1 - 0.000105820105820105*G0_0_0_0_1_2 - 0.00063492063492063*G0_0_0_0_1_3 - 0.00021164021164021*G0_0_0_0_1_4 - 0.000423280423280418*G0_0_0_0_1_5 - 0.00021164021164021*G0_0_0_0_2_0 - 0.000105820105820105*G0_0_0_0_2_1 + 0.00158730158730158*G0_0_0_0_2_2 + 0.00148148148148147*G0_0_0_0_2_3 + 0.00275132275132274*G0_0_0_0_2_4 + 0.000846560846560843*G0_0_0_0_2_5 + 0.00042328042328042*G0_0_0_0_3_0 - 0.00063492063492063*G0_0_0_0_3_1 + 0.00148148148148147*G0_0_0_0_3_2 - 0.00465608465608462*G0_0_0_0_3_3 - 0.000423280423280421*G0_0_0_0_3_4 - 0.00253968253968253*G0_0_0_0_3_5 - 0.00211640211640211*G0_0_0_0_4_0 - 0.00021164021164021*G0_0_0_0_4_1 + 0.00275132275132274*G0_0_0_0_4_2 - 0.000423280423280421*G0_0_0_0_4_3 + 0.00126984126984126*G0_0_0_0_4_4 - 0.00126984126984126*G0_0_0_0_4_5 - 0.000423280423280418*G0_0_0_0_5_1 + 0.000846560846560843*G0_0_0_0_5_2 - 0.00253968253968253*G0_0_0_0_5_3 - 0.00126984126984126*G0_0_0_0_5_4 - 0.00296296296296294*G0_0_0_0_5_5 + 0.000317460317460315*G0_0_0_1_0_0 - 0.000529100529100523*G0_0_0_1_0_1 - 0.000105820105820105*G0_0_0_1_0_2 - 0.00063492063492063*G0_0_0_1_0_3 - 0.00021164021164021*G0_0_0_1_0_4 - 0.000423280423280418*G0_0_0_1_0_5 - 0.000529100529100523*G0_0_0_1_1_0 + 0.00476190476190471*G0_0_0_1_1_1 - 0.00105820105820105*G0_0_0_1_1_2 + 0.00423280423280421*G0_0_0_1_1_3 + 0.0021164021164021*G0_0_0_1_1_5 - 0.000105820105820105*G0_0_0_1_2_0 - 0.00105820105820105*G0_0_0_1_2_1 + 0.00158730158730158*G0_0_0_1_2_2 - 0.000634920634920632*G0_0_0_1_2_3 + 0.000634920634920631*G0_0_0_1_2_4 - 0.00042328042328042*G0_0_0_1_2_5 - 0.00063492063492063*G0_0_0_1_3_0 + 0.00423280423280421*G0_0_0_1_3_1 - 0.000634920634920632*G0_0_0_1_3_2 + 0.00634920634920632*G0_0_0_1_3_3 + 0.00126984126984126*G0_0_0_1_3_4 + 0.0021164021164021*G0_0_0_1_3_5 - 0.00021164021164021*G0_0_0_1_4_0 + 0.000634920634920631*G0_0_0_1_4_2 + 0.00126984126984126*G0_0_0_1_4_3 + 0.00380952380952379*G0_0_0_1_4_4 + 0.000846560846560843*G0_0_0_1_4_5 - 0.000423280423280418*G0_0_0_1_5_0 + 0.0021164021164021*G0_0_0_1_5_1 - 0.00042328042328042*G0_0_0_1_5_2 + 0.0021164021164021*G0_0_0_1_5_3 + 0.000846560846560843*G0_0_0_1_5_4 + 0.0021164021164021*G0_0_0_1_5_5 - 0.00021164021164021*G0_0_0_2_0_0 - 0.000105820105820105*G0_0_0_2_0_1 + 0.00158730158730158*G0_0_0_2_0_2 + 0.00148148148148147*G0_0_0_2_0_3 + 0.00275132275132274*G0_0_0_2_0_4 + 0.000846560846560843*G0_0_0_2_0_5 - 0.000105820105820105*G0_0_0_2_1_0 - 0.00105820105820105*G0_0_0_2_1_1 + 0.00158730158730158*G0_0_0_2_1_2 - 0.000634920634920632*G0_0_0_2_1_3 + 0.000634920634920631*G0_0_0_2_1_4 - 0.00042328042328042*G0_0_0_2_1_5 + 0.00158730158730158*G0_0_0_2_2_0 + 0.00158730158730158*G0_0_0_2_2_1 - 0.0190476190476189*G0_0_0_2_2_2 - 0.00423280423280421*G0_0_0_2_2_3 - 0.00846560846560842*G0_0_0_2_2_4 + 0.00148148148148147*G0_0_0_2_3_0 - 0.000634920634920632*G0_0_0_2_3_1 - 0.00423280423280421*G0_0_0_2_3_2 - 0.00846560846560842*G0_0_0_2_3_3 - 0.00423280423280421*G0_0_0_2_3_4 - 0.00296296296296295*G0_0_0_2_3_5 + 0.00275132275132274*G0_0_0_2_4_0 + 0.000634920634920631*G0_0_0_2_4_1 - 0.00846560846560841*G0_0_0_2_4_2 - 0.00423280423280421*G0_0_0_2_4_3 - 0.00846560846560843*G0_0_0_2_4_4 - 0.00126984126984127*G0_0_0_2_4_5 + 0.000846560846560843*G0_0_0_2_5_0 - 0.00042328042328042*G0_0_0_2_5_1 - 0.00296296296296295*G0_0_0_2_5_3 - 0.00126984126984127*G0_0_0_2_5_4 - 0.00253968253968253*G0_0_0_2_5_5 + 0.000423280423280419*G0_0_0_3_0_0 - 0.00063492063492063*G0_0_0_3_0_1 + 0.00148148148148147*G0_0_0_3_0_2 - 0.00465608465608462*G0_0_0_3_0_3 - 0.000423280423280421*G0_0_0_3_0_4 - 0.00253968253968253*G0_0_0_3_0_5 - 0.00063492063492063*G0_0_0_3_1_0 + 0.00423280423280421*G0_0_0_3_1_1 - 0.000634920634920632*G0_0_0_3_1_2 + 0.00634920634920632*G0_0_0_3_1_3 + 0.00126984126984126*G0_0_0_3_1_4 + 0.00211640211640211*G0_0_0_3_1_5 + 0.00148148148148147*G0_0_0_3_2_0 - 0.000634920634920632*G0_0_0_3_2_1 - 0.00423280423280421*G0_0_0_3_2_2 - 0.00846560846560842*G0_0_0_3_2_3 - 0.00423280423280421*G0_0_0_3_2_4 - 0.00296296296296295*G0_0_0_3_2_5 - 0.00465608465608462*G0_0_0_3_3_0 + 0.00634920634920632*G0_0_0_3_3_1 - 0.00846560846560842*G0_0_0_3_3_2 + 0.0609523809523806*G0_0_0_3_3_3 + 0.00677248677248675*G0_0_0_3_3_4 + 0.0152380952380952*G0_0_0_3_3_5 - 0.000423280423280421*G0_0_0_3_4_0 + 0.00126984126984126*G0_0_0_3_4_1 - 0.00423280423280421*G0_0_0_3_4_2 + 0.00677248677248675*G0_0_0_3_4_3 - 0.00677248677248674*G0_0_0_3_4_4 + 0.00338624338624337*G0_0_0_3_4_5 - 0.00253968253968253*G0_0_0_3_5_0 + 0.0021164021164021*G0_0_0_3_5_1 - 0.00296296296296295*G0_0_0_3_5_2 + 0.0152380952380952*G0_0_0_3_5_3 + 0.00338624338624337*G0_0_0_3_5_4 + 0.0101587301587301*G0_0_0_3_5_5 - 0.00211640211640211*G0_0_0_4_0_0 - 0.00021164021164021*G0_0_0_4_0_1 + 0.00275132275132274*G0_0_0_4_0_2 - 0.000423280423280421*G0_0_0_4_0_3 + 0.00126984126984126*G0_0_0_4_0_4 - 0.00126984126984126*G0_0_0_4_0_5 - 0.00021164021164021*G0_0_0_4_1_0 + 0.000634920634920631*G0_0_0_4_1_2 + 0.00126984126984126*G0_0_0_4_1_3 + 0.00380952380952379*G0_0_0_4_1_4 + 0.000846560846560843*G0_0_0_4_1_5 + 0.00275132275132274*G0_0_0_4_2_0 + 0.000634920634920631*G0_0_0_4_2_1 - 0.00846560846560842*G0_0_0_4_2_2 - 0.00423280423280421*G0_0_0_4_2_3 - 0.00846560846560843*G0_0_0_4_2_4 - 0.00126984126984127*G0_0_0_4_2_5 - 0.000423280423280421*G0_0_0_4_3_0 + 0.00126984126984126*G0_0_0_4_3_1 - 0.00423280423280421*G0_0_0_4_3_2 + 0.00677248677248675*G0_0_0_4_3_3 - 0.00677248677248674*G0_0_0_4_3_4 + 0.00338624338624337*G0_0_0_4_3_5 + 0.00126984126984126*G0_0_0_4_4_0 + 0.00380952380952379*G0_0_0_4_4_1 - 0.00846560846560843*G0_0_0_4_4_2 - 0.00677248677248674*G0_0_0_4_4_3 - 0.0609523809523807*G0_0_0_4_4_4 - 0.00507936507936507*G0_0_0_4_4_5 - 0.00126984126984126*G0_0_0_4_5_0 + 0.000846560846560843*G0_0_0_4_5_1 - 0.00126984126984127*G0_0_0_4_5_2 + 0.00338624338624337*G0_0_0_4_5_3 - 0.00507936507936507*G0_0_0_4_5_4 + 0.00338624338624337*G0_0_0_4_5_5 - 0.000423280423280418*G0_0_0_5_0_1 + 0.000846560846560843*G0_0_0_5_0_2 - 0.00253968253968253*G0_0_0_5_0_3 - 0.00126984126984126*G0_0_0_5_0_4 - 0.00296296296296294*G0_0_0_5_0_5 - 0.000423280423280418*G0_0_0_5_1_0 + 0.0021164021164021*G0_0_0_5_1_1 - 0.00042328042328042*G0_0_0_5_1_2 + 0.0021164021164021*G0_0_0_5_1_3 + 0.000846560846560843*G0_0_0_5_1_4 + 0.0021164021164021*G0_0_0_5_1_5 + 0.000846560846560843*G0_0_0_5_2_0 - 0.00042328042328042*G0_0_0_5_2_1 - 0.00296296296296295*G0_0_0_5_2_3 - 0.00126984126984127*G0_0_0_5_2_4 - 0.00253968253968253*G0_0_0_5_2_5 - 0.00253968253968253*G0_0_0_5_3_0 + 0.00211640211640211*G0_0_0_5_3_1 - 0.00296296296296295*G0_0_0_5_3_2 + 0.0152380952380952*G0_0_0_5_3_3 + 0.00338624338624337*G0_0_0_5_3_4 + 0.0101587301587301*G0_0_0_5_3_5 - 0.00126984126984126*G0_0_0_5_4_0 + 0.000846560846560843*G0_0_0_5_4_1 - 0.00126984126984127*G0_0_0_5_4_2 + 0.00338624338624337*G0_0_0_5_4_3 - 0.00507936507936506*G0_0_0_5_4_4 + 0.00338624338624337*G0_0_0_5_4_5 - 0.00296296296296294*G0_0_0_5_5_0 + 0.0021164021164021*G0_0_0_5_5_1 - 0.00253968253968253*G0_0_0_5_5_2 + 0.0101587301587301*G0_0_0_5_5_3 + 0.00338624338624337*G0_0_0_5_5_4 + 0.0152380952380951*G0_0_0_5_5_5 - 0.00158730158730158*G0_0_1_0_0_0 + 0.00126984126984126*G0_0_1_0_0_1 - 0.000317460317460315*G0_0_1_0_0_2 + 0.00169312169312168*G0_0_1_0_0_3 + 0.0021164021164021*G0_0_1_0_0_5 + 0.00126984126984126*G0_0_1_0_1_0 - 0.00582010582010577*G0_0_1_0_1_1 + 0.000740740740740735*G0_0_1_0_1_2 - 0.00317460317460315*G0_0_1_0_1_3 - 0.00042328042328042*G0_0_1_0_1_4 - 0.00529100529100525*G0_0_1_0_1_5 - 0.000317460317460315*G0_0_1_0_2_0 + 0.000740740740740735*G0_0_1_0_2_1 - 0.000317460317460316*G0_0_1_0_2_2 + 0.00190476190476189*G0_0_1_0_2_3 + 0.000846560846560842*G0_0_1_0_2_4 + 0.00190476190476189*G0_0_1_0_2_5 + 0.00169312169312168*G0_0_1_0_3_0 - 0.00317460317460315*G0_0_1_0_3_1 + 0.00190476190476189*G0_0_1_0_3_2 - 0.00973544973544967*G0_0_1_0_3_3 - 0.00253968253968253*G0_0_1_0_3_4 - 0.00719576719576715*G0_0_1_0_3_5 - 0.00042328042328042*G0_0_1_0_4_1 + 0.000846560846560842*G0_0_1_0_4_2 - 0.00253968253968253*G0_0_1_0_4_3 - 0.00126984126984127*G0_0_1_0_4_4 - 0.00296296296296295*G0_0_1_0_4_5 + 0.0021164021164021*G0_0_1_0_5_0 - 0.00529100529100525*G0_0_1_0_5_1 + 0.00190476190476189*G0_0_1_0_5_2 - 0.00719576719576715*G0_0_1_0_5_3 - 0.00296296296296295*G0_0_1_0_5_4 - 0.0139682539682539*G0_0_1_0_5_5 + 0.00126984126984126*G0_0_1_1_0_0 - 0.00582010582010577*G0_0_1_1_0_1 + 0.000740740740740735*G0_0_1_1_0_2 - 0.00317460317460315*G0_0_1_1_0_3 - 0.00042328042328042*G0_0_1_1_0_4 - 0.00529100529100525*G0_0_1_1_0_5 - 0.00582010582010577*G0_0_1_1_1_0 + 0.0634920634920631*G0_0_1_1_1_1 - 0.00582010582010579*G0_0_1_1_1_2 + 0.0253968253968252*G0_0_1_1_1_3 + 0.00211640211640211*G0_0_1_1_1_4 + 0.0253968253968252*G0_0_1_1_1_5 + 0.000740740740740735*G0_0_1_1_2_0 - 0.00582010582010579*G0_0_1_1_2_1 + 0.00126984126984126*G0_0_1_1_2_2 - 0.00529100529100526*G0_0_1_1_2_3 - 0.000423280423280422*G0_0_1_1_2_4 - 0.00317460317460316*G0_0_1_1_2_5 - 0.00317460317460315*G0_0_1_1_3_0 + 0.0253968253968252*G0_0_1_1_3_1 - 0.00529100529100526*G0_0_1_1_3_2 + 0.0253968253968253*G0_0_1_1_3_3 + 0.00211640211640211*G0_0_1_1_3_4 + 0.0126984126984126*G0_0_1_1_3_5 - 0.00042328042328042*G0_0_1_1_4_0 + 0.00211640211640211*G0_0_1_1_4_1 - 0.000423280423280422*G0_0_1_1_4_2 + 0.00211640211640211*G0_0_1_1_4_3 + 0.000846560846560842*G0_0_1_1_4_4 + 0.0021164021164021*G0_0_1_1_4_5 - 0.00529100529100525*G0_0_1_1_5_0 + 0.0253968253968252*G0_0_1_1_5_1 - 0.00317460317460316*G0_0_1_1_5_2 + 0.0126984126984126*G0_0_1_1_5_3 + 0.0021164021164021*G0_0_1_1_5_4 + 0.0253968253968252*G0_0_1_1_5_5 - 0.000317460317460315*G0_0_1_2_0_0 + 0.000740740740740735*G0_0_1_2_0_1 - 0.000317460317460316*G0_0_1_2_0_2 + 0.00190476190476189*G0_0_1_2_0_3 + 0.000846560846560842*G0_0_1_2_0_4 + 0.00190476190476189*G0_0_1_2_0_5 + 0.000740740740740735*G0_0_1_2_1_0 - 0.00582010582010579*G0_0_1_2_1_1 + 0.00126984126984126*G0_0_1_2_1_2 - 0.00529100529100526*G0_0_1_2_1_3 - 0.000423280423280422*G0_0_1_2_1_4 - 0.00317460317460316*G0_0_1_2_1_5 - 0.000317460317460316*G0_0_1_2_2_0 + 0.00126984126984126*G0_0_1_2_2_1 - 0.00158730158730157*G0_0_1_2_2_2 + 0.00211640211640211*G0_0_1_2_2_3 + 0.00169312169312169*G0_0_1_2_2_5 + 0.00190476190476189*G0_0_1_2_3_0 - 0.00529100529100526*G0_0_1_2_3_1 + 0.00211640211640211*G0_0_1_2_3_2 - 0.0139682539682539*G0_0_1_2_3_3 - 0.00296296296296295*G0_0_1_2_3_4 - 0.00719576719576716*G0_0_1_2_3_5 + 0.000846560846560842*G0_0_1_2_4_0 - 0.000423280423280422*G0_0_1_2_4_1 - 0.00296296296296295*G0_0_1_2_4_3 - 0.00126984126984126*G0_0_1_2_4_4 - 0.00253968253968253*G0_0_1_2_4_5 + 0.00190476190476189*G0_0_1_2_5_0 - 0.00317460317460316*G0_0_1_2_5_1 + 0.00169312169312169*G0_0_1_2_5_2 - 0.00719576719576716*G0_0_1_2_5_3 - 0.00253968253968253*G0_0_1_2_5_4 - 0.00973544973544969*G0_0_1_2_5_5 + 0.00169312169312168*G0_0_1_3_0_0 - 0.00317460317460315*G0_0_1_3_0_1 + 0.00190476190476189*G0_0_1_3_0_2 - 0.00973544973544967*G0_0_1_3_0_3 - 0.00253968253968253*G0_0_1_3_0_4 - 0.00719576719576715*G0_0_1_3_0_5 - 0.00317460317460315*G0_0_1_3_1_0 + 0.0253968253968252*G0_0_1_3_1_1 - 0.00529100529100526*G0_0_1_3_1_2 + 0.0253968253968253*G0_0_1_3_1_3 + 0.00211640211640211*G0_0_1_3_1_4 + 0.0126984126984126*G0_0_1_3_1_5 + 0.00190476190476189*G0_0_1_3_2_0 - 0.00529100529100526*G0_0_1_3_2_1 + 0.00211640211640211*G0_0_1_3_2_2 - 0.0139682539682539*G0_0_1_3_2_3 - 0.00296296296296295*G0_0_1_3_2_4 - 0.00719576719576716*G0_0_1_3_2_5 - 0.00973544973544967*G0_0_1_3_3_0 + 0.0253968253968253*G0_0_1_3_3_1 - 0.0139682539682539*G0_0_1_3_3_2 + 0.101587301587301*G0_0_1_3_3_3 + 0.0152380952380952*G0_0_1_3_3_4 + 0.0338624338624337*G0_0_1_3_3_5 - 0.00253968253968253*G0_0_1_3_4_0 + 0.00211640211640211*G0_0_1_3_4_1 - 0.00296296296296295*G0_0_1_3_4_2 + 0.0152380952380952*G0_0_1_3_4_3 + 0.00338624338624337*G0_0_1_3_4_4 + 0.0101587301587301*G0_0_1_3_4_5 - 0.00719576719576715*G0_0_1_3_5_0 + 0.0126984126984126*G0_0_1_3_5_1 - 0.00719576719576716*G0_0_1_3_5_2 + 0.0338624338624337*G0_0_1_3_5_3 + 0.0101587301587301*G0_0_1_3_5_4 + 0.0338624338624337*G0_0_1_3_5_5 - 0.00042328042328042*G0_0_1_4_0_1 + 0.000846560846560842*G0_0_1_4_0_2 - 0.00253968253968253*G0_0_1_4_0_3 - 0.00126984126984127*G0_0_1_4_0_4 - 0.00296296296296295*G0_0_1_4_0_5 - 0.00042328042328042*G0_0_1_4_1_0 + 0.00211640211640211*G0_0_1_4_1_1 - 0.000423280423280422*G0_0_1_4_1_2 + 0.00211640211640211*G0_0_1_4_1_3 + 0.000846560846560842*G0_0_1_4_1_4 + 0.0021164021164021*G0_0_1_4_1_5 + 0.000846560846560842*G0_0_1_4_2_0 - 0.000423280423280422*G0_0_1_4_2_1 - 0.00296296296296295*G0_0_1_4_2_3 - 0.00126984126984126*G0_0_1_4_2_4 - 0.00253968253968253*G0_0_1_4_2_5 - 0.00253968253968253*G0_0_1_4_3_0 + 0.00211640211640211*G0_0_1_4_3_1 - 0.00296296296296295*G0_0_1_4_3_2 + 0.0152380952380952*G0_0_1_4_3_3 + 0.00338624338624337*G0_0_1_4_3_4 + 0.0101587301587301*G0_0_1_4_3_5 - 0.00126984126984127*G0_0_1_4_4_0 + 0.000846560846560842*G0_0_1_4_4_1 - 0.00126984126984126*G0_0_1_4_4_2 + 0.00338624338624337*G0_0_1_4_4_3 - 0.00507936507936505*G0_0_1_4_4_4 + 0.00338624338624337*G0_0_1_4_4_5 - 0.00296296296296295*G0_0_1_4_5_0 + 0.0021164021164021*G0_0_1_4_5_1 - 0.00253968253968253*G0_0_1_4_5_2 + 0.0101587301587301*G0_0_1_4_5_3 + 0.00338624338624337*G0_0_1_4_5_4 + 0.0152380952380952*G0_0_1_4_5_5 + 0.0021164021164021*G0_0_1_5_0_0 - 0.00529100529100525*G0_0_1_5_0_1 + 0.00190476190476189*G0_0_1_5_0_2 - 0.00719576719576715*G0_0_1_5_0_3 - 0.00296296296296295*G0_0_1_5_0_4 - 0.0139682539682539*G0_0_1_5_0_5 - 0.00529100529100525*G0_0_1_5_1_0 + 0.0253968253968252*G0_0_1_5_1_1 - 0.00317460317460316*G0_0_1_5_1_2 + 0.0126984126984126*G0_0_1_5_1_3 + 0.0021164021164021*G0_0_1_5_1_4 + 0.0253968253968252*G0_0_1_5_1_5 + 0.00190476190476189*G0_0_1_5_2_0 - 0.00317460317460316*G0_0_1_5_2_1 + 0.00169312169312169*G0_0_1_5_2_2 - 0.00719576719576716*G0_0_1_5_2_3 - 0.00253968253968253*G0_0_1_5_2_4 - 0.00973544973544969*G0_0_1_5_2_5 - 0.00719576719576715*G0_0_1_5_3_0 + 0.0126984126984126*G0_0_1_5_3_1 - 0.00719576719576716*G0_0_1_5_3_2 + 0.0338624338624337*G0_0_1_5_3_3 + 0.0101587301587301*G0_0_1_5_3_4 + 0.0338624338624337*G0_0_1_5_3_5 - 0.00296296296296295*G0_0_1_5_4_0 + 0.0021164021164021*G0_0_1_5_4_1 - 0.00253968253968253*G0_0_1_5_4_2 + 0.0101587301587301*G0_0_1_5_4_3 + 0.00338624338624337*G0_0_1_5_4_4 + 0.0152380952380952*G0_0_1_5_4_5 - 0.0139682539682539*G0_0_1_5_5_0 + 0.0253968253968252*G0_0_1_5_5_1 - 0.00973544973544969*G0_0_1_5_5_2 + 0.0338624338624337*G0_0_1_5_5_3 + 0.0152380952380952*G0_0_1_5_5_4 + 0.101587301587301*G0_0_1_5_5_5; + A[13] = 0.00396825396825395*G0_1_0_0_0_0 - 0.000476190476190473*G0_1_0_0_0_1 - 0.000476190476190474*G0_1_0_0_0_2 - 0.000105820105820105*G0_1_0_0_0_3 + 0.000529100529100526*G0_1_0_0_0_4 + 0.000529100529100527*G0_1_0_0_0_5 - 0.000476190476190473*G0_1_0_0_1_0 + 0.00132275132275131*G0_1_0_0_1_1 - 0.000238095238095236*G0_1_0_0_1_2 + 0.00042328042328042*G0_1_0_0_1_3 - 0.000211640211640211*G0_1_0_0_1_4 + 0.00116402116402116*G0_1_0_0_1_5 - 0.000476190476190474*G0_1_0_0_2_0 - 0.000238095238095236*G0_1_0_0_2_1 + 0.00132275132275131*G0_1_0_0_2_2 + 0.000423280423280421*G0_1_0_0_2_3 + 0.00116402116402116*G0_1_0_0_2_4 - 0.00021164021164021*G0_1_0_0_2_5 - 0.000105820105820105*G0_1_0_0_3_0 + 0.00042328042328042*G0_1_0_0_3_1 + 0.000423280423280421*G0_1_0_0_3_2 - 0.00042328042328042*G0_1_0_0_3_3 + 0.000634920634920632*G0_1_0_0_3_4 + 0.00063492063492063*G0_1_0_0_3_5 + 0.000529100529100526*G0_1_0_0_4_0 - 0.000211640211640211*G0_1_0_0_4_1 + 0.00116402116402116*G0_1_0_0_4_2 + 0.000634920634920632*G0_1_0_0_4_3 + 0.00338624338624337*G0_1_0_0_4_4 + 0.000846560846560842*G0_1_0_0_4_5 + 0.000529100529100527*G0_1_0_0_5_0 + 0.00116402116402116*G0_1_0_0_5_1 - 0.00021164021164021*G0_1_0_0_5_2 + 0.00063492063492063*G0_1_0_0_5_3 + 0.000846560846560842*G0_1_0_0_5_4 + 0.00338624338624336*G0_1_0_0_5_5 - 0.000476190476190473*G0_1_0_1_0_0 + 0.00132275132275131*G0_1_0_1_0_1 - 0.000238095238095236*G0_1_0_1_0_2 + 0.00042328042328042*G0_1_0_1_0_3 - 0.000211640211640211*G0_1_0_1_0_4 + 0.00116402116402116*G0_1_0_1_0_5 + 0.00132275132275131*G0_1_0_1_1_0 - 0.0134920634920634*G0_1_0_1_1_1 + 0.000793650793650789*G0_1_0_1_1_2 - 0.00370370370370368*G0_1_0_1_1_3 - 0.000529100529100526*G0_1_0_1_1_4 - 0.00582010582010578*G0_1_0_1_1_5 - 0.000238095238095236*G0_1_0_1_2_0 + 0.000793650793650789*G0_1_0_1_2_1 + 0.000793650793650789*G0_1_0_1_2_2 + 0.000952380952380947*G0_1_0_1_2_3 + 0.000634920634920631*G0_1_0_1_2_4 + 0.000634920634920631*G0_1_0_1_2_5 + 0.00042328042328042*G0_1_0_1_3_0 - 0.00370370370370368*G0_1_0_1_3_1 + 0.000952380952380947*G0_1_0_1_3_2 - 0.0021164021164021*G0_1_0_1_3_3 + 0.000211640211640211*G0_1_0_1_3_4 - 0.0021164021164021*G0_1_0_1_3_5 - 0.000211640211640211*G0_1_0_1_4_0 - 0.000529100529100526*G0_1_0_1_4_1 + 0.000634920634920631*G0_1_0_1_4_2 + 0.000211640211640211*G0_1_0_1_4_3 + 0.00169312169312169*G0_1_0_1_4_4 - 0.000211640211640209*G0_1_0_1_4_5 + 0.00116402116402116*G0_1_0_1_5_0 - 0.00582010582010578*G0_1_0_1_5_1 + 0.000634920634920631*G0_1_0_1_5_2 - 0.0021164021164021*G0_1_0_1_5_3 - 0.00021164021164021*G0_1_0_1_5_4 - 0.00634920634920631*G0_1_0_1_5_5 - 0.000476190476190474*G0_1_0_2_0_0 - 0.000238095238095236*G0_1_0_2_0_1 + 0.00132275132275131*G0_1_0_2_0_2 + 0.000423280423280421*G0_1_0_2_0_3 + 0.00116402116402116*G0_1_0_2_0_4 - 0.00021164021164021*G0_1_0_2_0_5 - 0.000238095238095236*G0_1_0_2_1_0 + 0.000793650793650789*G0_1_0_2_1_1 + 0.000793650793650789*G0_1_0_2_1_2 + 0.000952380952380947*G0_1_0_2_1_3 + 0.000634920634920631*G0_1_0_2_1_4 + 0.000634920634920631*G0_1_0_2_1_5 + 0.00132275132275131*G0_1_0_2_2_0 + 0.000793650793650789*G0_1_0_2_2_1 - 0.0134920634920634*G0_1_0_2_2_2 - 0.00370370370370368*G0_1_0_2_2_3 - 0.00582010582010579*G0_1_0_2_2_4 - 0.000529100529100529*G0_1_0_2_2_5 + 0.000423280423280421*G0_1_0_2_3_0 + 0.000952380952380947*G0_1_0_2_3_1 - 0.00370370370370368*G0_1_0_2_3_2 - 0.00211640211640211*G0_1_0_2_3_3 - 0.00211640211640211*G0_1_0_2_3_4 + 0.000211640211640209*G0_1_0_2_3_5 + 0.00116402116402116*G0_1_0_2_4_0 + 0.000634920634920631*G0_1_0_2_4_1 - 0.00582010582010579*G0_1_0_2_4_2 - 0.00211640211640211*G0_1_0_2_4_3 - 0.00634920634920632*G0_1_0_2_4_4 - 0.000211640211640213*G0_1_0_2_4_5 - 0.00021164021164021*G0_1_0_2_5_0 + 0.000634920634920631*G0_1_0_2_5_1 - 0.000529100529100529*G0_1_0_2_5_2 + 0.000211640211640209*G0_1_0_2_5_3 - 0.000211640211640213*G0_1_0_2_5_4 + 0.00169312169312168*G0_1_0_2_5_5 - 0.000105820105820105*G0_1_0_3_0_0 + 0.00042328042328042*G0_1_0_3_0_1 + 0.000423280423280421*G0_1_0_3_0_2 - 0.00042328042328042*G0_1_0_3_0_3 + 0.000634920634920632*G0_1_0_3_0_4 + 0.00063492063492063*G0_1_0_3_0_5 + 0.00042328042328042*G0_1_0_3_1_0 - 0.00370370370370368*G0_1_0_3_1_1 + 0.000952380952380947*G0_1_0_3_1_2 - 0.0021164021164021*G0_1_0_3_1_3 + 0.000211640211640211*G0_1_0_3_1_4 - 0.0021164021164021*G0_1_0_3_1_5 + 0.000423280423280421*G0_1_0_3_2_0 + 0.000952380952380947*G0_1_0_3_2_1 - 0.00370370370370368*G0_1_0_3_2_2 - 0.00211640211640211*G0_1_0_3_2_3 - 0.00211640211640211*G0_1_0_3_2_4 + 0.000211640211640209*G0_1_0_3_2_5 - 0.00042328042328042*G0_1_0_3_3_0 - 0.0021164021164021*G0_1_0_3_3_1 - 0.00211640211640211*G0_1_0_3_3_2 + 0.0165079365079364*G0_1_0_3_3_3 + 0.000423280423280423*G0_1_0_3_3_4 + 0.000423280423280428*G0_1_0_3_3_5 + 0.000634920634920632*G0_1_0_3_4_0 + 0.000211640211640211*G0_1_0_3_4_1 - 0.00211640211640211*G0_1_0_3_4_2 + 0.000423280423280422*G0_1_0_3_4_3 - 0.00465608465608464*G0_1_0_3_4_4 - 0.000846560846560842*G0_1_0_3_4_5 + 0.00063492063492063*G0_1_0_3_5_0 - 0.0021164021164021*G0_1_0_3_5_1 + 0.000211640211640209*G0_1_0_3_5_2 + 0.000423280423280428*G0_1_0_3_5_3 - 0.000846560846560842*G0_1_0_3_5_4 - 0.00465608465608462*G0_1_0_3_5_5 + 0.000529100529100526*G0_1_0_4_0_0 - 0.000211640211640211*G0_1_0_4_0_1 + 0.00116402116402116*G0_1_0_4_0_2 + 0.000634920634920632*G0_1_0_4_0_3 + 0.00338624338624337*G0_1_0_4_0_4 + 0.000846560846560842*G0_1_0_4_0_5 - 0.000211640211640211*G0_1_0_4_1_0 - 0.000529100529100526*G0_1_0_4_1_1 + 0.000634920634920631*G0_1_0_4_1_2 + 0.000211640211640211*G0_1_0_4_1_3 + 0.00169312169312169*G0_1_0_4_1_4 - 0.000211640211640209*G0_1_0_4_1_5 + 0.00116402116402116*G0_1_0_4_2_0 + 0.000634920634920631*G0_1_0_4_2_1 - 0.00582010582010579*G0_1_0_4_2_2 - 0.00211640211640211*G0_1_0_4_2_3 - 0.00634920634920632*G0_1_0_4_2_4 - 0.000211640211640213*G0_1_0_4_2_5 + 0.000634920634920632*G0_1_0_4_3_0 + 0.000211640211640211*G0_1_0_4_3_1 - 0.00211640211640211*G0_1_0_4_3_2 + 0.000423280423280422*G0_1_0_4_3_3 - 0.00465608465608464*G0_1_0_4_3_4 - 0.000846560846560842*G0_1_0_4_3_5 + 0.00338624338624337*G0_1_0_4_4_0 + 0.00169312169312169*G0_1_0_4_4_1 - 0.00634920634920632*G0_1_0_4_4_2 - 0.00465608465608464*G0_1_0_4_4_3 - 0.0292063492063491*G0_1_0_4_4_4 - 0.00296296296296295*G0_1_0_4_4_5 + 0.000846560846560842*G0_1_0_4_5_0 - 0.00021164021164021*G0_1_0_4_5_1 - 0.000211640211640213*G0_1_0_4_5_2 - 0.000846560846560842*G0_1_0_4_5_3 - 0.00296296296296295*G0_1_0_4_5_4 - 0.00296296296296295*G0_1_0_4_5_5 + 0.000529100529100527*G0_1_0_5_0_0 + 0.00116402116402116*G0_1_0_5_0_1 - 0.00021164021164021*G0_1_0_5_0_2 + 0.00063492063492063*G0_1_0_5_0_3 + 0.000846560846560842*G0_1_0_5_0_4 + 0.00338624338624336*G0_1_0_5_0_5 + 0.00116402116402116*G0_1_0_5_1_0 - 0.00582010582010578*G0_1_0_5_1_1 + 0.000634920634920631*G0_1_0_5_1_2 - 0.0021164021164021*G0_1_0_5_1_3 - 0.00021164021164021*G0_1_0_5_1_4 - 0.00634920634920631*G0_1_0_5_1_5 - 0.00021164021164021*G0_1_0_5_2_0 + 0.000634920634920631*G0_1_0_5_2_1 - 0.00052910052910053*G0_1_0_5_2_2 + 0.000211640211640209*G0_1_0_5_2_3 - 0.000211640211640213*G0_1_0_5_2_4 + 0.00169312169312168*G0_1_0_5_2_5 + 0.00063492063492063*G0_1_0_5_3_0 - 0.0021164021164021*G0_1_0_5_3_1 + 0.000211640211640209*G0_1_0_5_3_2 + 0.000423280423280427*G0_1_0_5_3_3 - 0.000846560846560842*G0_1_0_5_3_4 - 0.00465608465608462*G0_1_0_5_3_5 + 0.000846560846560842*G0_1_0_5_4_0 - 0.000211640211640209*G0_1_0_5_4_1 - 0.000211640211640213*G0_1_0_5_4_2 - 0.000846560846560842*G0_1_0_5_4_3 - 0.00296296296296296*G0_1_0_5_4_4 - 0.00296296296296295*G0_1_0_5_4_5 + 0.00338624338624336*G0_1_0_5_5_0 - 0.00634920634920631*G0_1_0_5_5_1 + 0.00169312169312168*G0_1_0_5_5_2 - 0.00465608465608462*G0_1_0_5_5_3 - 0.00296296296296295*G0_1_0_5_5_4 - 0.029206349206349*G0_1_0_5_5_5; + A[8] = 0.00396825396825395*G0_0_1_0_0_0 - 0.000476190476190473*G0_0_1_0_0_1 - 0.000476190476190474*G0_0_1_0_0_2 - 0.000105820105820105*G0_0_1_0_0_3 + 0.000529100529100526*G0_0_1_0_0_4 + 0.000529100529100527*G0_0_1_0_0_5 - 0.000476190476190473*G0_0_1_0_1_0 + 0.00132275132275131*G0_0_1_0_1_1 - 0.000238095238095236*G0_0_1_0_1_2 + 0.00042328042328042*G0_0_1_0_1_3 - 0.000211640211640211*G0_0_1_0_1_4 + 0.00116402116402116*G0_0_1_0_1_5 - 0.000476190476190474*G0_0_1_0_2_0 - 0.000238095238095236*G0_0_1_0_2_1 + 0.00132275132275131*G0_0_1_0_2_2 + 0.000423280423280421*G0_0_1_0_2_3 + 0.00116402116402116*G0_0_1_0_2_4 - 0.00021164021164021*G0_0_1_0_2_5 - 0.000105820105820105*G0_0_1_0_3_0 + 0.00042328042328042*G0_0_1_0_3_1 + 0.000423280423280421*G0_0_1_0_3_2 - 0.00042328042328042*G0_0_1_0_3_3 + 0.000634920634920632*G0_0_1_0_3_4 + 0.00063492063492063*G0_0_1_0_3_5 + 0.000529100529100526*G0_0_1_0_4_0 - 0.000211640211640211*G0_0_1_0_4_1 + 0.00116402116402116*G0_0_1_0_4_2 + 0.000634920634920632*G0_0_1_0_4_3 + 0.00338624338624337*G0_0_1_0_4_4 + 0.000846560846560842*G0_0_1_0_4_5 + 0.000529100529100527*G0_0_1_0_5_0 + 0.00116402116402116*G0_0_1_0_5_1 - 0.00021164021164021*G0_0_1_0_5_2 + 0.00063492063492063*G0_0_1_0_5_3 + 0.000846560846560842*G0_0_1_0_5_4 + 0.00338624338624336*G0_0_1_0_5_5 - 0.000476190476190473*G0_0_1_1_0_0 + 0.00132275132275131*G0_0_1_1_0_1 - 0.000238095238095236*G0_0_1_1_0_2 + 0.00042328042328042*G0_0_1_1_0_3 - 0.000211640211640211*G0_0_1_1_0_4 + 0.00116402116402116*G0_0_1_1_0_5 + 0.00132275132275131*G0_0_1_1_1_0 - 0.0134920634920634*G0_0_1_1_1_1 + 0.000793650793650789*G0_0_1_1_1_2 - 0.00370370370370368*G0_0_1_1_1_3 - 0.000529100529100526*G0_0_1_1_1_4 - 0.00582010582010578*G0_0_1_1_1_5 - 0.000238095238095236*G0_0_1_1_2_0 + 0.000793650793650789*G0_0_1_1_2_1 + 0.000793650793650789*G0_0_1_1_2_2 + 0.000952380952380947*G0_0_1_1_2_3 + 0.000634920634920631*G0_0_1_1_2_4 + 0.000634920634920631*G0_0_1_1_2_5 + 0.00042328042328042*G0_0_1_1_3_0 - 0.00370370370370368*G0_0_1_1_3_1 + 0.000952380952380947*G0_0_1_1_3_2 - 0.0021164021164021*G0_0_1_1_3_3 + 0.000211640211640211*G0_0_1_1_3_4 - 0.0021164021164021*G0_0_1_1_3_5 - 0.000211640211640211*G0_0_1_1_4_0 - 0.000529100529100526*G0_0_1_1_4_1 + 0.000634920634920631*G0_0_1_1_4_2 + 0.000211640211640211*G0_0_1_1_4_3 + 0.00169312169312169*G0_0_1_1_4_4 - 0.000211640211640209*G0_0_1_1_4_5 + 0.00116402116402116*G0_0_1_1_5_0 - 0.00582010582010578*G0_0_1_1_5_1 + 0.000634920634920631*G0_0_1_1_5_2 - 0.0021164021164021*G0_0_1_1_5_3 - 0.00021164021164021*G0_0_1_1_5_4 - 0.00634920634920631*G0_0_1_1_5_5 - 0.000476190476190474*G0_0_1_2_0_0 - 0.000238095238095236*G0_0_1_2_0_1 + 0.00132275132275131*G0_0_1_2_0_2 + 0.000423280423280421*G0_0_1_2_0_3 + 0.00116402116402116*G0_0_1_2_0_4 - 0.00021164021164021*G0_0_1_2_0_5 - 0.000238095238095236*G0_0_1_2_1_0 + 0.000793650793650789*G0_0_1_2_1_1 + 0.000793650793650789*G0_0_1_2_1_2 + 0.000952380952380947*G0_0_1_2_1_3 + 0.000634920634920631*G0_0_1_2_1_4 + 0.000634920634920631*G0_0_1_2_1_5 + 0.00132275132275131*G0_0_1_2_2_0 + 0.000793650793650789*G0_0_1_2_2_1 - 0.0134920634920634*G0_0_1_2_2_2 - 0.00370370370370368*G0_0_1_2_2_3 - 0.00582010582010579*G0_0_1_2_2_4 - 0.000529100529100529*G0_0_1_2_2_5 + 0.000423280423280421*G0_0_1_2_3_0 + 0.000952380952380947*G0_0_1_2_3_1 - 0.00370370370370368*G0_0_1_2_3_2 - 0.00211640211640211*G0_0_1_2_3_3 - 0.00211640211640211*G0_0_1_2_3_4 + 0.000211640211640209*G0_0_1_2_3_5 + 0.00116402116402116*G0_0_1_2_4_0 + 0.000634920634920631*G0_0_1_2_4_1 - 0.00582010582010579*G0_0_1_2_4_2 - 0.00211640211640211*G0_0_1_2_4_3 - 0.00634920634920632*G0_0_1_2_4_4 - 0.000211640211640213*G0_0_1_2_4_5 - 0.00021164021164021*G0_0_1_2_5_0 + 0.000634920634920631*G0_0_1_2_5_1 - 0.000529100529100529*G0_0_1_2_5_2 + 0.000211640211640209*G0_0_1_2_5_3 - 0.000211640211640213*G0_0_1_2_5_4 + 0.00169312169312168*G0_0_1_2_5_5 - 0.000105820105820105*G0_0_1_3_0_0 + 0.00042328042328042*G0_0_1_3_0_1 + 0.000423280423280421*G0_0_1_3_0_2 - 0.00042328042328042*G0_0_1_3_0_3 + 0.000634920634920632*G0_0_1_3_0_4 + 0.00063492063492063*G0_0_1_3_0_5 + 0.00042328042328042*G0_0_1_3_1_0 - 0.00370370370370368*G0_0_1_3_1_1 + 0.000952380952380947*G0_0_1_3_1_2 - 0.0021164021164021*G0_0_1_3_1_3 + 0.000211640211640211*G0_0_1_3_1_4 - 0.0021164021164021*G0_0_1_3_1_5 + 0.000423280423280421*G0_0_1_3_2_0 + 0.000952380952380947*G0_0_1_3_2_1 - 0.00370370370370368*G0_0_1_3_2_2 - 0.00211640211640211*G0_0_1_3_2_3 - 0.00211640211640211*G0_0_1_3_2_4 + 0.000211640211640209*G0_0_1_3_2_5 - 0.00042328042328042*G0_0_1_3_3_0 - 0.0021164021164021*G0_0_1_3_3_1 - 0.00211640211640211*G0_0_1_3_3_2 + 0.0165079365079364*G0_0_1_3_3_3 + 0.000423280423280423*G0_0_1_3_3_4 + 0.000423280423280428*G0_0_1_3_3_5 + 0.000634920634920632*G0_0_1_3_4_0 + 0.000211640211640211*G0_0_1_3_4_1 - 0.00211640211640211*G0_0_1_3_4_2 + 0.000423280423280422*G0_0_1_3_4_3 - 0.00465608465608464*G0_0_1_3_4_4 - 0.000846560846560842*G0_0_1_3_4_5 + 0.00063492063492063*G0_0_1_3_5_0 - 0.0021164021164021*G0_0_1_3_5_1 + 0.000211640211640209*G0_0_1_3_5_2 + 0.000423280423280428*G0_0_1_3_5_3 - 0.000846560846560842*G0_0_1_3_5_4 - 0.00465608465608462*G0_0_1_3_5_5 + 0.000529100529100526*G0_0_1_4_0_0 - 0.000211640211640211*G0_0_1_4_0_1 + 0.00116402116402116*G0_0_1_4_0_2 + 0.000634920634920632*G0_0_1_4_0_3 + 0.00338624338624337*G0_0_1_4_0_4 + 0.000846560846560842*G0_0_1_4_0_5 - 0.000211640211640211*G0_0_1_4_1_0 - 0.000529100529100526*G0_0_1_4_1_1 + 0.000634920634920631*G0_0_1_4_1_2 + 0.000211640211640211*G0_0_1_4_1_3 + 0.00169312169312169*G0_0_1_4_1_4 - 0.000211640211640209*G0_0_1_4_1_5 + 0.00116402116402116*G0_0_1_4_2_0 + 0.000634920634920631*G0_0_1_4_2_1 - 0.00582010582010579*G0_0_1_4_2_2 - 0.00211640211640211*G0_0_1_4_2_3 - 0.00634920634920632*G0_0_1_4_2_4 - 0.000211640211640213*G0_0_1_4_2_5 + 0.000634920634920632*G0_0_1_4_3_0 + 0.000211640211640211*G0_0_1_4_3_1 - 0.00211640211640211*G0_0_1_4_3_2 + 0.000423280423280422*G0_0_1_4_3_3 - 0.00465608465608464*G0_0_1_4_3_4 - 0.000846560846560842*G0_0_1_4_3_5 + 0.00338624338624337*G0_0_1_4_4_0 + 0.00169312169312169*G0_0_1_4_4_1 - 0.00634920634920632*G0_0_1_4_4_2 - 0.00465608465608464*G0_0_1_4_4_3 - 0.0292063492063491*G0_0_1_4_4_4 - 0.00296296296296295*G0_0_1_4_4_5 + 0.000846560846560842*G0_0_1_4_5_0 - 0.00021164021164021*G0_0_1_4_5_1 - 0.000211640211640213*G0_0_1_4_5_2 - 0.000846560846560842*G0_0_1_4_5_3 - 0.00296296296296295*G0_0_1_4_5_4 - 0.00296296296296295*G0_0_1_4_5_5 + 0.000529100529100527*G0_0_1_5_0_0 + 0.00116402116402116*G0_0_1_5_0_1 - 0.00021164021164021*G0_0_1_5_0_2 + 0.00063492063492063*G0_0_1_5_0_3 + 0.000846560846560842*G0_0_1_5_0_4 + 0.00338624338624336*G0_0_1_5_0_5 + 0.00116402116402116*G0_0_1_5_1_0 - 0.00582010582010578*G0_0_1_5_1_1 + 0.000634920634920631*G0_0_1_5_1_2 - 0.0021164021164021*G0_0_1_5_1_3 - 0.00021164021164021*G0_0_1_5_1_4 - 0.00634920634920631*G0_0_1_5_1_5 - 0.00021164021164021*G0_0_1_5_2_0 + 0.000634920634920631*G0_0_1_5_2_1 - 0.00052910052910053*G0_0_1_5_2_2 + 0.000211640211640209*G0_0_1_5_2_3 - 0.000211640211640213*G0_0_1_5_2_4 + 0.00169312169312168*G0_0_1_5_2_5 + 0.00063492063492063*G0_0_1_5_3_0 - 0.0021164021164021*G0_0_1_5_3_1 + 0.000211640211640209*G0_0_1_5_3_2 + 0.000423280423280427*G0_0_1_5_3_3 - 0.000846560846560842*G0_0_1_5_3_4 - 0.00465608465608462*G0_0_1_5_3_5 + 0.000846560846560842*G0_0_1_5_4_0 - 0.000211640211640209*G0_0_1_5_4_1 - 0.000211640211640213*G0_0_1_5_4_2 - 0.000846560846560842*G0_0_1_5_4_3 - 0.00296296296296296*G0_0_1_5_4_4 - 0.00296296296296295*G0_0_1_5_4_5 + 0.00338624338624336*G0_0_1_5_5_0 - 0.00634920634920631*G0_0_1_5_5_1 + 0.00169312169312168*G0_0_1_5_5_2 - 0.00465608465608462*G0_0_1_5_5_3 - 0.00296296296296295*G0_0_1_5_5_4 - 0.029206349206349*G0_0_1_5_5_5; + A[11] = -A[9] - 0.019047619047619*G0_0_0_0_0_0 + 0.000634920634920634*G0_0_0_0_0_1 + 0.00169312169312169*G0_0_0_0_0_2 - 0.00126984126984126*G0_0_0_0_0_3 - 0.0105820105820105*G0_0_0_0_0_4 - 0.00634920634920631*G0_0_0_0_0_5 + 0.000634920634920634*G0_0_0_0_1_0 + 0.0042328042328042*G0_0_0_0_1_1 - 0.000952380952380947*G0_0_0_0_1_2 + 0.0021164021164021*G0_0_0_0_1_3 + 0.000846560846560845*G0_0_0_0_1_4 + 0.00423280423280421*G0_0_0_0_1_5 + 0.00169312169312169*G0_0_0_0_2_0 - 0.000952380952380947*G0_0_0_0_2_1 + 0.00169312169312168*G0_0_0_0_2_2 + 0.000423280423280421*G0_0_0_0_2_3 + 0.00465608465608464*G0_0_0_0_2_4 + 0.000423280423280424*G0_0_0_0_2_5 - 0.00126984126984126*G0_0_0_0_3_0 + 0.0021164021164021*G0_0_0_0_3_1 + 0.000423280423280422*G0_0_0_0_3_2 + 0.00253968253968252*G0_0_0_0_3_3 + 0.00084656084656084*G0_0_0_0_3_4 + 0.00169312169312168*G0_0_0_0_3_5 - 0.0105820105820105*G0_0_0_0_4_0 + 0.000846560846560845*G0_0_0_0_4_1 + 0.00465608465608464*G0_0_0_0_4_2 + 0.00084656084656084*G0_0_0_0_4_3 - 0.00592592592592591*G0_0_0_0_4_4 - 0.00253968253968253*G0_0_0_0_4_5 - 0.00634920634920631*G0_0_0_0_5_0 + 0.00423280423280421*G0_0_0_0_5_1 + 0.000423280423280424*G0_0_0_0_5_2 + 0.00169312169312168*G0_0_0_0_5_3 - 0.00253968253968253*G0_0_0_0_5_4 + 0.00253968253968252*G0_0_0_0_5_5 + 0.000634920634920634*G0_0_0_1_0_0 + 0.0042328042328042*G0_0_0_1_0_1 - 0.000952380952380947*G0_0_0_1_0_2 + 0.0021164021164021*G0_0_0_1_0_3 + 0.000846560846560844*G0_0_0_1_0_4 + 0.00423280423280421*G0_0_0_1_0_5 + 0.0042328042328042*G0_0_0_1_1_0 - 0.0539682539682537*G0_0_0_1_1_1 + 0.00423280423280421*G0_0_0_1_1_2 - 0.0190476190476189*G0_0_0_1_1_3 - 0.00211640211640211*G0_0_0_1_1_4 - 0.0190476190476189*G0_0_0_1_1_5 - 0.000952380952380947*G0_0_0_1_2_0 + 0.00423280423280421*G0_0_0_1_2_1 + 0.000634920634920629*G0_0_0_1_2_2 + 0.00423280423280421*G0_0_0_1_2_3 + 0.000846560846560841*G0_0_0_1_2_4 + 0.00211640211640211*G0_0_0_1_2_5 + 0.0021164021164021*G0_0_0_1_3_0 - 0.0190476190476189*G0_0_0_1_3_1 + 0.00423280423280421*G0_0_0_1_3_2 - 0.0169312169312168*G0_0_0_1_3_3 - 0.00846560846560842*G0_0_0_1_3_5 + 0.000846560846560845*G0_0_0_1_4_0 - 0.00211640211640211*G0_0_0_1_4_1 + 0.000846560846560841*G0_0_0_1_4_2 + 0.00677248677248674*G0_0_0_1_4_4 + 0.00423280423280421*G0_0_0_1_5_0 - 0.0190476190476189*G0_0_0_1_5_1 + 0.00211640211640211*G0_0_0_1_5_2 - 0.00846560846560842*G0_0_0_1_5_3 - 0.0169312169312168*G0_0_0_1_5_5 + 0.00169312169312169*G0_0_0_2_0_0 - 0.000952380952380947*G0_0_0_2_0_1 + 0.00169312169312168*G0_0_0_2_0_2 + 0.000423280423280421*G0_0_0_2_0_3 + 0.00465608465608463*G0_0_0_2_0_4 + 0.000423280423280424*G0_0_0_2_0_5 - 0.000952380952380947*G0_0_0_2_1_0 + 0.00423280423280421*G0_0_0_2_1_1 + 0.000634920634920629*G0_0_0_2_1_2 + 0.00423280423280421*G0_0_0_2_1_3 + 0.000846560846560841*G0_0_0_2_1_4 + 0.00211640211640211*G0_0_0_2_1_5 + 0.00169312169312168*G0_0_0_2_2_0 + 0.000634920634920629*G0_0_0_2_2_1 - 0.0190476190476189*G0_0_0_2_2_2 - 0.00634920634920631*G0_0_0_2_2_3 - 0.0105820105820105*G0_0_0_2_2_4 - 0.00126984126984127*G0_0_0_2_2_5 + 0.000423280423280422*G0_0_0_2_3_0 + 0.00423280423280421*G0_0_0_2_3_1 - 0.00634920634920631*G0_0_0_2_3_2 + 0.00253968253968253*G0_0_0_2_3_3 - 0.00253968253968252*G0_0_0_2_3_4 + 0.00169312169312169*G0_0_0_2_3_5 + 0.00465608465608464*G0_0_0_2_4_0 + 0.000846560846560841*G0_0_0_2_4_1 - 0.0105820105820105*G0_0_0_2_4_2 - 0.00253968253968252*G0_0_0_2_4_3 - 0.0059259259259259*G0_0_0_2_4_4 + 0.000846560846560842*G0_0_0_2_4_5 + 0.000423280423280424*G0_0_0_2_5_0 + 0.00211640211640211*G0_0_0_2_5_1 - 0.00126984126984127*G0_0_0_2_5_2 + 0.00169312169312169*G0_0_0_2_5_3 + 0.000846560846560842*G0_0_0_2_5_4 + 0.00253968253968253*G0_0_0_2_5_5 - 0.00126984126984126*G0_0_0_3_0_0 + 0.0021164021164021*G0_0_0_3_0_1 + 0.000423280423280422*G0_0_0_3_0_2 + 0.00253968253968252*G0_0_0_3_0_3 + 0.00084656084656084*G0_0_0_3_0_4 + 0.00169312169312168*G0_0_0_3_0_5 + 0.0021164021164021*G0_0_0_3_1_0 - 0.0190476190476189*G0_0_0_3_1_1 + 0.00423280423280421*G0_0_0_3_1_2 - 0.0169312169312168*G0_0_0_3_1_3 - 0.00846560846560842*G0_0_0_3_1_5 + 0.000423280423280421*G0_0_0_3_2_0 + 0.00423280423280421*G0_0_0_3_2_1 - 0.00634920634920631*G0_0_0_3_2_2 + 0.00253968253968253*G0_0_0_3_2_3 - 0.00253968253968252*G0_0_0_3_2_4 + 0.00169312169312169*G0_0_0_3_2_5 + 0.00253968253968252*G0_0_0_3_3_0 - 0.0169312169312168*G0_0_0_3_3_1 + 0.00253968253968253*G0_0_0_3_3_2 - 0.0253968253968253*G0_0_0_3_3_3 - 0.00507936507936506*G0_0_0_3_3_4 - 0.00846560846560843*G0_0_0_3_3_5 + 0.00084656084656084*G0_0_0_3_4_0 - 0.00253968253968252*G0_0_0_3_4_2 - 0.00507936507936506*G0_0_0_3_4_3 - 0.0152380952380952*G0_0_0_3_4_4 - 0.00338624338624338*G0_0_0_3_4_5 + 0.00169312169312168*G0_0_0_3_5_0 - 0.00846560846560842*G0_0_0_3_5_1 + 0.00169312169312169*G0_0_0_3_5_2 - 0.00846560846560843*G0_0_0_3_5_3 - 0.00338624338624338*G0_0_0_3_5_4 - 0.00846560846560842*G0_0_0_3_5_5 - 0.0105820105820105*G0_0_0_4_0_0 + 0.000846560846560844*G0_0_0_4_0_1 + 0.00465608465608464*G0_0_0_4_0_2 + 0.00084656084656084*G0_0_0_4_0_3 - 0.00592592592592591*G0_0_0_4_0_4 - 0.00253968253968253*G0_0_0_4_0_5 + 0.000846560846560844*G0_0_0_4_1_0 - 0.00211640211640211*G0_0_0_4_1_1 + 0.000846560846560841*G0_0_0_4_1_2 + 0.00677248677248675*G0_0_0_4_1_4 + 0.00465608465608464*G0_0_0_4_2_0 + 0.000846560846560841*G0_0_0_4_2_1 - 0.0105820105820105*G0_0_0_4_2_2 - 0.00253968253968252*G0_0_0_4_2_3 - 0.0059259259259259*G0_0_0_4_2_4 + 0.000846560846560842*G0_0_0_4_2_5 + 0.00084656084656084*G0_0_0_4_3_0 - 0.00253968253968252*G0_0_0_4_3_2 - 0.00507936507936506*G0_0_0_4_3_3 - 0.0152380952380952*G0_0_0_4_3_4 - 0.00338624338624338*G0_0_0_4_3_5 - 0.00592592592592591*G0_0_0_4_4_0 + 0.00677248677248675*G0_0_0_4_4_1 - 0.0059259259259259*G0_0_0_4_4_2 - 0.0152380952380952*G0_0_0_4_4_3 - 0.116825396825396*G0_0_0_4_4_4 - 0.0152380952380952*G0_0_0_4_4_5 - 0.00253968253968253*G0_0_0_4_5_0 + 0.000846560846560842*G0_0_0_4_5_2 - 0.00338624338624338*G0_0_0_4_5_3 - 0.0152380952380952*G0_0_0_4_5_4 - 0.00507936507936507*G0_0_0_4_5_5 - 0.00634920634920631*G0_0_0_5_0_0 + 0.00423280423280421*G0_0_0_5_0_1 + 0.000423280423280424*G0_0_0_5_0_2 + 0.00169312169312168*G0_0_0_5_0_3 - 0.00253968253968253*G0_0_0_5_0_4 + 0.00253968253968252*G0_0_0_5_0_5 + 0.00423280423280421*G0_0_0_5_1_0 - 0.0190476190476189*G0_0_0_5_1_1 + 0.00211640211640211*G0_0_0_5_1_2 - 0.00846560846560842*G0_0_0_5_1_3 - 0.0169312169312168*G0_0_0_5_1_5 + 0.000423280423280424*G0_0_0_5_2_0 + 0.00211640211640211*G0_0_0_5_2_1 - 0.00126984126984127*G0_0_0_5_2_2 + 0.00169312169312169*G0_0_0_5_2_3 + 0.000846560846560842*G0_0_0_5_2_4 + 0.00253968253968253*G0_0_0_5_2_5 + 0.00169312169312168*G0_0_0_5_3_0 - 0.00846560846560842*G0_0_0_5_3_1 + 0.00169312169312169*G0_0_0_5_3_2 - 0.00846560846560843*G0_0_0_5_3_3 - 0.00338624338624338*G0_0_0_5_3_4 - 0.00846560846560842*G0_0_0_5_3_5 - 0.00253968253968253*G0_0_0_5_4_0 + 0.000846560846560842*G0_0_0_5_4_2 - 0.00338624338624338*G0_0_0_5_4_3 - 0.0152380952380952*G0_0_0_5_4_4 - 0.00507936507936507*G0_0_0_5_4_5 + 0.00253968253968252*G0_0_0_5_5_0 - 0.0169312169312168*G0_0_0_5_5_1 + 0.00253968253968253*G0_0_0_5_5_2 - 0.00846560846560842*G0_0_0_5_5_3 - 0.00507936507936507*G0_0_0_5_5_4 - 0.0253968253968253*G0_0_0_5_5_5; + A[7] = 0.00396825396825395*G0_0_0_0_0_0 + 0.000476190476190471*G0_0_0_0_0_1 - 0.000582010582010579*G0_0_0_0_0_2 + 0.00116402116402116*G0_0_0_0_0_3 + 0.00264550264550263*G0_0_0_0_0_4 + 0.00264550264550263*G0_0_0_0_0_5 + 0.000476190476190471*G0_0_0_0_1_0 - 0.00396825396825394*G0_0_0_0_1_1 + 0.000608465608465604*G0_0_0_0_1_2 - 0.0021164021164021*G0_0_0_0_1_3 - 0.000423280423280421*G0_0_0_0_1_4 - 0.00370370370370368*G0_0_0_0_1_5 - 0.000582010582010579*G0_0_0_0_2_0 + 0.000608465608465604*G0_0_0_0_2_1 - 0.000582010582010578*G0_0_0_0_2_2 + 0.000846560846560841*G0_0_0_0_2_3 - 0.000740740740740739*G0_0_0_0_2_4 + 0.000846560846560841*G0_0_0_0_2_5 + 0.00116402116402116*G0_0_0_0_3_0 - 0.0021164021164021*G0_0_0_0_3_1 + 0.000846560846560841*G0_0_0_0_3_2 - 0.00550264550264547*G0_0_0_0_3_3 - 0.00148148148148147*G0_0_0_0_3_4 - 0.004021164021164*G0_0_0_0_3_5 + 0.00264550264550263*G0_0_0_0_4_0 - 0.000423280423280421*G0_0_0_0_4_1 - 0.000740740740740739*G0_0_0_0_4_2 - 0.00148148148148147*G0_0_0_0_4_3 + 0.000846560846560845*G0_0_0_0_4_4 - 0.000846560846560841*G0_0_0_0_4_5 + 0.00264550264550263*G0_0_0_0_5_0 - 0.00370370370370368*G0_0_0_0_5_1 + 0.000846560846560841*G0_0_0_0_5_2 - 0.004021164021164*G0_0_0_0_5_3 - 0.000846560846560841*G0_0_0_0_5_4 - 0.00761904761904757*G0_0_0_0_5_5 + 0.000476190476190471*G0_0_0_1_0_0 - 0.00396825396825394*G0_0_0_1_0_1 + 0.000608465608465604*G0_0_0_1_0_2 - 0.0021164021164021*G0_0_0_1_0_3 - 0.000423280423280421*G0_0_0_1_0_4 - 0.00370370370370368*G0_0_0_1_0_5 - 0.00396825396825394*G0_0_0_1_1_0 + 0.045238095238095*G0_0_0_1_1_1 - 0.00396825396825395*G0_0_0_1_1_2 + 0.0174603174603174*G0_0_0_1_1_3 + 0.00158730158730158*G0_0_0_1_1_4 + 0.0174603174603174*G0_0_0_1_1_5 + 0.000608465608465604*G0_0_0_1_2_0 - 0.00396825396825395*G0_0_0_1_2_1 + 0.000476190476190474*G0_0_0_1_2_2 - 0.00370370370370368*G0_0_0_1_2_3 - 0.000423280423280421*G0_0_0_1_2_4 - 0.00211640211640211*G0_0_0_1_2_5 - 0.0021164021164021*G0_0_0_1_3_0 + 0.0174603174603174*G0_0_0_1_3_1 - 0.00370370370370368*G0_0_0_1_3_2 + 0.0169312169312168*G0_0_0_1_3_3 + 0.00105820105820105*G0_0_0_1_3_4 + 0.00846560846560842*G0_0_0_1_3_5 - 0.000423280423280421*G0_0_0_1_4_0 + 0.00158730158730158*G0_0_0_1_4_1 - 0.000423280423280421*G0_0_0_1_4_2 + 0.00105820105820105*G0_0_0_1_4_3 - 0.00126984126984127*G0_0_0_1_4_4 + 0.00105820105820105*G0_0_0_1_4_5 - 0.00370370370370368*G0_0_0_1_5_0 + 0.0174603174603174*G0_0_0_1_5_1 - 0.00211640211640211*G0_0_0_1_5_2 + 0.00846560846560842*G0_0_0_1_5_3 + 0.00105820105820105*G0_0_0_1_5_4 + 0.0169312169312168*G0_0_0_1_5_5 - 0.000582010582010579*G0_0_0_2_0_0 + 0.000608465608465604*G0_0_0_2_0_1 - 0.000582010582010578*G0_0_0_2_0_2 + 0.000846560846560841*G0_0_0_2_0_3 - 0.000740740740740738*G0_0_0_2_0_4 + 0.000846560846560841*G0_0_0_2_0_5 + 0.000608465608465604*G0_0_0_2_1_0 - 0.00396825396825395*G0_0_0_2_1_1 + 0.000476190476190474*G0_0_0_2_1_2 - 0.00370370370370368*G0_0_0_2_1_3 - 0.000423280423280421*G0_0_0_2_1_4 - 0.00211640211640211*G0_0_0_2_1_5 - 0.000582010582010578*G0_0_0_2_2_0 + 0.000476190476190474*G0_0_0_2_2_1 + 0.00396825396825395*G0_0_0_2_2_2 + 0.00264550264550263*G0_0_0_2_2_3 + 0.00264550264550263*G0_0_0_2_2_4 + 0.00116402116402116*G0_0_0_2_2_5 + 0.000846560846560841*G0_0_0_2_3_0 - 0.00370370370370368*G0_0_0_2_3_1 + 0.00264550264550263*G0_0_0_2_3_2 - 0.00761904761904758*G0_0_0_2_3_3 - 0.000846560846560843*G0_0_0_2_3_4 - 0.004021164021164*G0_0_0_2_3_5 - 0.000740740740740738*G0_0_0_2_4_0 - 0.000423280423280421*G0_0_0_2_4_1 + 0.00264550264550263*G0_0_0_2_4_2 - 0.000846560846560844*G0_0_0_2_4_3 + 0.000846560846560844*G0_0_0_2_4_4 - 0.00148148148148148*G0_0_0_2_4_5 + 0.000846560846560841*G0_0_0_2_5_0 - 0.00211640211640211*G0_0_0_2_5_1 + 0.00116402116402116*G0_0_0_2_5_2 - 0.004021164021164*G0_0_0_2_5_3 - 0.00148148148148148*G0_0_0_2_5_4 - 0.00550264550264548*G0_0_0_2_5_5 + 0.00116402116402116*G0_0_0_3_0_0 - 0.0021164021164021*G0_0_0_3_0_1 + 0.000846560846560841*G0_0_0_3_0_2 - 0.00550264550264547*G0_0_0_3_0_3 - 0.00148148148148147*G0_0_0_3_0_4 - 0.004021164021164*G0_0_0_3_0_5 - 0.0021164021164021*G0_0_0_3_1_0 + 0.0174603174603174*G0_0_0_3_1_1 - 0.00370370370370368*G0_0_0_3_1_2 + 0.0169312169312168*G0_0_0_3_1_3 + 0.00105820105820105*G0_0_0_3_1_4 + 0.00846560846560842*G0_0_0_3_1_5 + 0.000846560846560841*G0_0_0_3_2_0 - 0.00370370370370368*G0_0_0_3_2_1 + 0.00264550264550263*G0_0_0_3_2_2 - 0.00761904761904758*G0_0_0_3_2_3 - 0.000846560846560843*G0_0_0_3_2_4 - 0.004021164021164*G0_0_0_3_2_5 - 0.00550264550264547*G0_0_0_3_3_0 + 0.0169312169312168*G0_0_0_3_3_1 - 0.00761904761904758*G0_0_0_3_3_2 + 0.0571428571428569*G0_0_0_3_3_3 + 0.00888888888888885*G0_0_0_3_3_4 + 0.019047619047619*G0_0_0_3_3_5 - 0.00148148148148147*G0_0_0_3_4_0 + 0.00105820105820105*G0_0_0_3_4_1 - 0.000846560846560843*G0_0_0_3_4_2 + 0.00888888888888885*G0_0_0_3_4_3 + 0.00550264550264548*G0_0_0_3_4_4 + 0.0059259259259259*G0_0_0_3_4_5 - 0.004021164021164*G0_0_0_3_5_0 + 0.00846560846560842*G0_0_0_3_5_1 - 0.004021164021164*G0_0_0_3_5_2 + 0.019047619047619*G0_0_0_3_5_3 + 0.0059259259259259*G0_0_0_3_5_4 + 0.019047619047619*G0_0_0_3_5_5 + 0.00264550264550263*G0_0_0_4_0_0 - 0.000423280423280421*G0_0_0_4_0_1 - 0.000740740740740738*G0_0_0_4_0_2 - 0.00148148148148147*G0_0_0_4_0_3 + 0.000846560846560845*G0_0_0_4_0_4 - 0.000846560846560841*G0_0_0_4_0_5 - 0.000423280423280421*G0_0_0_4_1_0 + 0.00158730158730158*G0_0_0_4_1_1 - 0.000423280423280421*G0_0_0_4_1_2 + 0.00105820105820105*G0_0_0_4_1_3 - 0.00126984126984127*G0_0_0_4_1_4 + 0.00105820105820105*G0_0_0_4_1_5 - 0.000740740740740738*G0_0_0_4_2_0 - 0.000423280423280421*G0_0_0_4_2_1 + 0.00264550264550263*G0_0_0_4_2_2 - 0.000846560846560843*G0_0_0_4_2_3 + 0.000846560846560844*G0_0_0_4_2_4 - 0.00148148148148148*G0_0_0_4_2_5 - 0.00148148148148147*G0_0_0_4_3_0 + 0.00105820105820105*G0_0_0_4_3_1 - 0.000846560846560843*G0_0_0_4_3_2 + 0.00888888888888885*G0_0_0_4_3_3 + 0.00550264550264548*G0_0_0_4_3_4 + 0.0059259259259259*G0_0_0_4_3_5 + 0.000846560846560845*G0_0_0_4_4_0 - 0.00126984126984127*G0_0_0_4_4_1 + 0.000846560846560844*G0_0_0_4_4_2 + 0.00550264550264548*G0_0_0_4_4_3 + 0.0266666666666666*G0_0_0_4_4_4 + 0.00550264550264549*G0_0_0_4_4_5 - 0.000846560846560841*G0_0_0_4_5_0 + 0.00105820105820105*G0_0_0_4_5_1 - 0.00148148148148148*G0_0_0_4_5_2 + 0.0059259259259259*G0_0_0_4_5_3 + 0.00550264550264549*G0_0_0_4_5_4 + 0.00888888888888885*G0_0_0_4_5_5 + 0.00264550264550263*G0_0_0_5_0_0 - 0.00370370370370368*G0_0_0_5_0_1 + 0.000846560846560841*G0_0_0_5_0_2 - 0.004021164021164*G0_0_0_5_0_3 - 0.000846560846560841*G0_0_0_5_0_4 - 0.00761904761904757*G0_0_0_5_0_5 - 0.00370370370370368*G0_0_0_5_1_0 + 0.0174603174603174*G0_0_0_5_1_1 - 0.00211640211640211*G0_0_0_5_1_2 + 0.00846560846560842*G0_0_0_5_1_3 + 0.00105820105820105*G0_0_0_5_1_4 + 0.0169312169312168*G0_0_0_5_1_5 + 0.000846560846560841*G0_0_0_5_2_0 - 0.00211640211640211*G0_0_0_5_2_1 + 0.00116402116402116*G0_0_0_5_2_2 - 0.00402116402116401*G0_0_0_5_2_3 - 0.00148148148148148*G0_0_0_5_2_4 - 0.00550264550264548*G0_0_0_5_2_5 - 0.004021164021164*G0_0_0_5_3_0 + 0.00846560846560842*G0_0_0_5_3_1 - 0.00402116402116401*G0_0_0_5_3_2 + 0.019047619047619*G0_0_0_5_3_3 + 0.0059259259259259*G0_0_0_5_3_4 + 0.019047619047619*G0_0_0_5_3_5 - 0.000846560846560841*G0_0_0_5_4_0 + 0.00105820105820105*G0_0_0_5_4_1 - 0.00148148148148148*G0_0_0_5_4_2 + 0.0059259259259259*G0_0_0_5_4_3 + 0.00550264550264549*G0_0_0_5_4_4 + 0.00888888888888885*G0_0_0_5_4_5 - 0.00761904761904757*G0_0_0_5_5_0 + 0.0169312169312168*G0_0_0_5_5_1 - 0.00550264550264548*G0_0_0_5_5_2 + 0.019047619047619*G0_0_0_5_5_3 + 0.00888888888888885*G0_0_0_5_5_4 + 0.0571428571428568*G0_0_0_5_5_5; + A[34] = -A[8] - 0.0063492063492063*G0_0_0_0_0_0 + 0.00084656084656084*G0_0_0_0_0_1 + 0.000846560846560842*G0_0_0_0_0_2 + 0.000423280423280418*G0_0_0_0_0_3 - 0.00634920634920632*G0_0_0_0_0_4 - 0.0021164021164021*G0_0_0_0_0_5 + 0.00084656084656084*G0_0_0_0_1_0 - 0.000846560846560838*G0_0_0_0_1_1 - 0.00042328042328042*G0_0_0_0_1_3 + 0.000423280423280423*G0_0_0_0_1_4 + 0.000846560846560842*G0_0_0_0_2_0 + 0.000846560846560842*G0_0_0_0_2_3 + 0.00338624338624337*G0_0_0_0_2_4 + 0.00126984126984126*G0_0_0_0_2_5 + 0.000423280423280418*G0_0_0_0_3_0 - 0.00042328042328042*G0_0_0_0_3_1 + 0.000846560846560842*G0_0_0_0_3_2 - 0.00846560846560841*G0_0_0_0_3_3 - 0.00169312169312168*G0_0_0_0_3_4 - 0.00338624338624337*G0_0_0_0_3_5 - 0.00634920634920632*G0_0_0_0_4_0 + 0.000423280423280423*G0_0_0_0_4_1 + 0.00338624338624337*G0_0_0_0_4_2 - 0.00169312169312168*G0_0_0_0_4_3 - 0.00507936507936506*G0_0_0_0_4_4 - 0.00338624338624337*G0_0_0_0_4_5 - 0.0021164021164021*G0_0_0_0_5_0 + 0.00126984126984126*G0_0_0_0_5_2 - 0.00338624338624337*G0_0_0_0_5_3 - 0.00338624338624337*G0_0_0_0_5_4 - 0.00507936507936504*G0_0_0_0_5_5 + 0.000846560846560841*G0_0_0_1_0_0 - 0.000846560846560838*G0_0_0_1_0_1 - 0.00042328042328042*G0_0_0_1_0_3 + 0.000423280423280423*G0_0_0_1_0_4 - 0.000846560846560838*G0_0_0_1_1_0 + 0.00634920634920628*G0_0_0_1_1_1 - 0.000846560846560841*G0_0_0_1_1_2 + 0.00634920634920631*G0_0_0_1_1_3 - 0.000423280423280422*G0_0_0_1_1_4 + 0.00211640211640209*G0_0_0_1_1_5 - 0.000846560846560841*G0_0_0_1_2_1 - 0.00338624338624337*G0_0_0_1_2_3 - 0.000846560846560843*G0_0_0_1_2_4 - 0.00126984126984126*G0_0_0_1_2_5 - 0.00042328042328042*G0_0_0_1_3_0 + 0.00634920634920631*G0_0_0_1_3_1 - 0.00338624338624337*G0_0_0_1_3_2 + 0.00507936507936506*G0_0_0_1_3_3 + 0.00169312169312169*G0_0_0_1_3_4 + 0.00338624338624337*G0_0_0_1_3_5 + 0.000423280423280423*G0_0_0_1_4_0 - 0.000423280423280422*G0_0_0_1_4_1 - 0.000846560846560843*G0_0_0_1_4_2 + 0.00169312169312169*G0_0_0_1_4_3 + 0.00846560846560842*G0_0_0_1_4_4 + 0.00338624338624337*G0_0_0_1_4_5 + 0.00211640211640209*G0_0_0_1_5_1 - 0.00126984126984126*G0_0_0_1_5_2 + 0.00338624338624337*G0_0_0_1_5_3 + 0.00338624338624337*G0_0_0_1_5_4 + 0.00507936507936504*G0_0_0_1_5_5 + 0.000846560846560842*G0_0_0_2_0_0 + 0.000846560846560842*G0_0_0_2_0_3 + 0.00338624338624337*G0_0_0_2_0_4 + 0.00126984126984126*G0_0_0_2_0_5 - 0.000846560846560841*G0_0_0_2_1_1 - 0.00338624338624337*G0_0_0_2_1_3 - 0.000846560846560843*G0_0_0_2_1_4 - 0.00126984126984126*G0_0_0_2_1_5 + 0.00423280423280421*G0_0_0_2_2_3 - 0.00423280423280421*G0_0_0_2_2_4 + 0.000846560846560842*G0_0_0_2_3_0 - 0.00338624338624337*G0_0_0_2_3_1 + 0.00423280423280421*G0_0_0_2_3_2 - 0.00169312169312168*G0_0_0_2_3_5 + 0.00338624338624337*G0_0_0_2_4_0 - 0.000846560846560843*G0_0_0_2_4_1 - 0.00423280423280421*G0_0_0_2_4_2 + 0.00169312169312168*G0_0_0_2_4_5 + 0.00126984126984126*G0_0_0_2_5_0 - 0.00126984126984126*G0_0_0_2_5_1 - 0.00169312169312168*G0_0_0_2_5_3 + 0.00169312169312168*G0_0_0_2_5_4 + 0.000423280423280418*G0_0_0_3_0_0 - 0.00042328042328042*G0_0_0_3_0_1 + 0.000846560846560843*G0_0_0_3_0_2 - 0.00846560846560841*G0_0_0_3_0_3 - 0.00169312169312168*G0_0_0_3_0_4 - 0.00338624338624337*G0_0_0_3_0_5 - 0.00042328042328042*G0_0_0_3_1_0 + 0.00634920634920631*G0_0_0_3_1_1 - 0.00338624338624337*G0_0_0_3_1_2 + 0.00507936507936506*G0_0_0_3_1_3 + 0.00169312169312169*G0_0_0_3_1_4 + 0.00338624338624337*G0_0_0_3_1_5 + 0.000846560846560843*G0_0_0_3_2_0 - 0.00338624338624337*G0_0_0_3_2_1 + 0.00423280423280421*G0_0_0_3_2_2 - 0.00169312169312168*G0_0_0_3_2_5 - 0.00846560846560841*G0_0_0_3_3_0 + 0.00507936507936506*G0_0_0_3_3_1 + 0.121904761904761*G0_0_0_3_3_3 + 0.0135449735449735*G0_0_0_3_3_4 + 0.0203174603174602*G0_0_0_3_3_5 - 0.00169312169312168*G0_0_0_3_4_0 + 0.00169312169312169*G0_0_0_3_4_1 + 0.0135449735449735*G0_0_0_3_4_3 - 0.0135449735449735*G0_0_0_3_4_4 - 0.00338624338624337*G0_0_0_3_5_0 + 0.00338624338624337*G0_0_0_3_5_1 - 0.00169312169312168*G0_0_0_3_5_2 + 0.0203174603174602*G0_0_0_3_5_3 + 0.00677248677248674*G0_0_0_3_5_5 - 0.00634920634920632*G0_0_0_4_0_0 + 0.000423280423280423*G0_0_0_4_0_1 + 0.00338624338624337*G0_0_0_4_0_2 - 0.00169312169312168*G0_0_0_4_0_3 - 0.00507936507936506*G0_0_0_4_0_4 - 0.00338624338624337*G0_0_0_4_0_5 + 0.000423280423280423*G0_0_0_4_1_0 - 0.000423280423280421*G0_0_0_4_1_1 - 0.000846560846560843*G0_0_0_4_1_2 + 0.00169312169312169*G0_0_0_4_1_3 + 0.00846560846560842*G0_0_0_4_1_4 + 0.00338624338624337*G0_0_0_4_1_5 + 0.00338624338624337*G0_0_0_4_2_0 - 0.000846560846560843*G0_0_0_4_2_1 - 0.00423280423280421*G0_0_0_4_2_2 + 0.00169312169312168*G0_0_0_4_2_5 - 0.00169312169312168*G0_0_0_4_3_0 + 0.00169312169312169*G0_0_0_4_3_1 + 0.0135449735449735*G0_0_0_4_3_3 - 0.0135449735449735*G0_0_0_4_3_4 - 0.00507936507936506*G0_0_0_4_4_0 + 0.00846560846560842*G0_0_0_4_4_1 - 0.0135449735449735*G0_0_0_4_4_3 - 0.121904761904761*G0_0_0_4_4_4 - 0.0203174603174602*G0_0_0_4_4_5 - 0.00338624338624337*G0_0_0_4_5_0 + 0.00338624338624337*G0_0_0_4_5_1 + 0.00169312169312169*G0_0_0_4_5_2 - 0.0203174603174602*G0_0_0_4_5_4 - 0.00677248677248674*G0_0_0_4_5_5 - 0.0021164021164021*G0_0_0_5_0_0 + 0.00126984126984126*G0_0_0_5_0_2 - 0.00338624338624337*G0_0_0_5_0_3 - 0.00338624338624337*G0_0_0_5_0_4 - 0.00507936507936504*G0_0_0_5_0_5 + 0.00211640211640209*G0_0_0_5_1_1 - 0.00126984126984126*G0_0_0_5_1_2 + 0.00338624338624337*G0_0_0_5_1_3 + 0.00338624338624337*G0_0_0_5_1_4 + 0.00507936507936504*G0_0_0_5_1_5 + 0.00126984126984126*G0_0_0_5_2_0 - 0.00126984126984126*G0_0_0_5_2_1 - 0.00169312169312168*G0_0_0_5_2_3 + 0.00169312169312168*G0_0_0_5_2_4 - 0.00338624338624337*G0_0_0_5_3_0 + 0.00338624338624337*G0_0_0_5_3_1 - 0.00169312169312168*G0_0_0_5_3_2 + 0.0203174603174602*G0_0_0_5_3_3 + 0.00677248677248674*G0_0_0_5_3_5 - 0.00338624338624337*G0_0_0_5_4_0 + 0.00338624338624337*G0_0_0_5_4_1 + 0.00169312169312169*G0_0_0_5_4_2 - 0.0203174603174602*G0_0_0_5_4_4 - 0.00677248677248674*G0_0_0_5_4_5 - 0.00507936507936504*G0_0_0_5_5_0 + 0.00507936507936504*G0_0_0_5_5_1 + 0.00677248677248674*G0_0_0_5_5_3 - 0.00677248677248674*G0_0_0_5_5_4 + 0.0801587301587298*G0_0_1_0_0_0 - 0.007037037037037*G0_0_1_0_0_1 - 0.007037037037037*G0_0_1_0_0_2 + 0.00243386243386243*G0_0_1_0_0_3 + 0.0280423280423279*G0_0_1_0_0_4 + 0.0280423280423279*G0_0_1_0_0_5 - 0.007037037037037*G0_0_1_0_1_0 + 0.00280423280423279*G0_0_1_0_1_1 + 0.000608465608465606*G0_0_1_0_1_2 - 0.00359788359788358*G0_0_1_0_1_4 - 0.00349206349206348*G0_0_1_0_1_5 - 0.007037037037037*G0_0_1_0_2_0 + 0.000608465608465607*G0_0_1_0_2_1 + 0.00280423280423279*G0_0_1_0_2_2 - 0.00349206349206348*G0_0_1_0_2_4 - 0.00359788359788358*G0_0_1_0_2_5 + 0.00243386243386243*G0_0_1_0_3_0 - 0.00550264550264546*G0_0_1_0_3_3 + 0.00232804232804232*G0_0_1_0_3_4 + 0.00232804232804232*G0_0_1_0_3_5 + 0.0280423280423279*G0_0_1_0_4_0 - 0.00359788359788358*G0_0_1_0_4_1 - 0.00349206349206348*G0_0_1_0_4_2 + 0.00232804232804232*G0_0_1_0_4_3 + 0.032169312169312*G0_0_1_0_4_4 + 0.0143915343915343*G0_0_1_0_4_5 + 0.0280423280423279*G0_0_1_0_5_0 - 0.00349206349206348*G0_0_1_0_5_1 - 0.00359788359788358*G0_0_1_0_5_2 + 0.00232804232804232*G0_0_1_0_5_3 + 0.0143915343915343*G0_0_1_0_5_4 + 0.032169312169312*G0_0_1_0_5_5 - 0.007037037037037*G0_0_1_1_0_0 + 0.00280423280423279*G0_0_1_1_0_1 + 0.000608465608465606*G0_0_1_1_0_2 - 0.00359788359788358*G0_0_1_1_0_4 - 0.00349206349206348*G0_0_1_1_0_5 + 0.00280423280423279*G0_0_1_1_1_0 - 0.0134920634920634*G0_0_1_1_1_1 + 0.000158730158730159*G0_0_1_1_1_2 + 0.000529100529100523*G0_0_1_1_1_3 + 0.000740740740740738*G0_0_1_1_1_4 - 0.00582010582010579*G0_0_1_1_1_5 + 0.000608465608465606*G0_0_1_1_2_0 + 0.000158730158730159*G0_0_1_1_2_1 + 0.000158730158730157*G0_0_1_1_2_2 - 0.00116402116402116*G0_0_1_1_2_3 + 0.0019047619047619*G0_0_1_1_2_4 + 0.0019047619047619*G0_0_1_1_2_5 + 0.000529100529100523*G0_0_1_1_3_1 - 0.00116402116402116*G0_0_1_1_3_2 - 0.000423280423280422*G0_0_1_1_3_3 - 0.00148148148148148*G0_0_1_1_3_4 - 0.00380952380952379*G0_0_1_1_3_5 - 0.00359788359788358*G0_0_1_1_4_0 + 0.000740740740740738*G0_0_1_1_4_1 + 0.0019047619047619*G0_0_1_1_4_2 - 0.00148148148148148*G0_0_1_1_4_3 - 0.00338624338624338*G0_0_1_1_4_4 - 0.00529100529100527*G0_0_1_1_4_5 - 0.00349206349206348*G0_0_1_1_5_0 - 0.00582010582010579*G0_0_1_1_5_1 + 0.0019047619047619*G0_0_1_1_5_2 - 0.00380952380952379*G0_0_1_1_5_3 - 0.00529100529100527*G0_0_1_1_5_4 - 0.0215873015873015*G0_0_1_1_5_5 - 0.007037037037037*G0_0_1_2_0_0 + 0.000608465608465606*G0_0_1_2_0_1 + 0.00280423280423279*G0_0_1_2_0_2 - 0.00349206349206348*G0_0_1_2_0_4 - 0.00359788359788358*G0_0_1_2_0_5 + 0.000608465608465606*G0_0_1_2_1_0 + 0.000158730158730159*G0_0_1_2_1_1 + 0.000158730158730157*G0_0_1_2_1_2 - 0.00116402116402116*G0_0_1_2_1_3 + 0.0019047619047619*G0_0_1_2_1_4 + 0.0019047619047619*G0_0_1_2_1_5 + 0.00280423280423279*G0_0_1_2_2_0 + 0.000158730158730157*G0_0_1_2_2_1 - 0.0134920634920634*G0_0_1_2_2_2 + 0.000529100529100524*G0_0_1_2_2_3 - 0.00582010582010579*G0_0_1_2_2_4 + 0.000740740740740736*G0_0_1_2_2_5 - 0.00116402116402116*G0_0_1_2_3_1 + 0.000529100529100522*G0_0_1_2_3_2 - 0.000423280423280424*G0_0_1_2_3_3 - 0.00380952380952379*G0_0_1_2_3_4 - 0.00148148148148147*G0_0_1_2_3_5 - 0.00349206349206348*G0_0_1_2_4_0 + 0.0019047619047619*G0_0_1_2_4_1 - 0.00582010582010579*G0_0_1_2_4_2 - 0.00380952380952379*G0_0_1_2_4_3 - 0.0215873015873015*G0_0_1_2_4_4 - 0.00529100529100527*G0_0_1_2_4_5 - 0.00359788359788358*G0_0_1_2_5_0 + 0.0019047619047619*G0_0_1_2_5_1 + 0.000740740740740736*G0_0_1_2_5_2 - 0.00148148148148148*G0_0_1_2_5_3 - 0.00529100529100527*G0_0_1_2_5_4 - 0.00338624338624337*G0_0_1_2_5_5 + 0.00243386243386243*G0_0_1_3_0_0 - 0.00550264550264546*G0_0_1_3_0_3 + 0.00232804232804232*G0_0_1_3_0_4 + 0.00232804232804232*G0_0_1_3_0_5 + 0.000529100529100524*G0_0_1_3_1_1 - 0.00116402116402116*G0_0_1_3_1_2 - 0.000423280423280422*G0_0_1_3_1_3 - 0.00148148148148148*G0_0_1_3_1_4 - 0.00380952380952379*G0_0_1_3_1_5 - 0.00116402116402116*G0_0_1_3_2_1 + 0.000529100529100523*G0_0_1_3_2_2 - 0.000423280423280425*G0_0_1_3_2_3 - 0.00380952380952379*G0_0_1_3_2_4 - 0.00148148148148148*G0_0_1_3_2_5 - 0.00550264550264546*G0_0_1_3_3_0 - 0.000423280423280421*G0_0_1_3_3_1 - 0.000423280423280425*G0_0_1_3_3_2 + 0.118095238095237*G0_0_1_3_3_3 + 0.0139682539682539*G0_0_1_3_3_4 + 0.0139682539682539*G0_0_1_3_3_5 + 0.00232804232804232*G0_0_1_3_4_0 - 0.00148148148148148*G0_0_1_3_4_1 - 0.00380952380952379*G0_0_1_3_4_2 + 0.0139682539682539*G0_0_1_3_4_3 + 0.00211640211640211*G0_0_1_3_4_4 + 0.0059259259259259*G0_0_1_3_4_5 + 0.00232804232804232*G0_0_1_3_5_0 - 0.00380952380952379*G0_0_1_3_5_1 - 0.00148148148148148*G0_0_1_3_5_2 + 0.0139682539682539*G0_0_1_3_5_3 + 0.0059259259259259*G0_0_1_3_5_4 + 0.00211640211640212*G0_0_1_3_5_5 + 0.0280423280423279*G0_0_1_4_0_0 - 0.00359788359788358*G0_0_1_4_0_1 - 0.00349206349206348*G0_0_1_4_0_2 + 0.00232804232804232*G0_0_1_4_0_3 + 0.032169312169312*G0_0_1_4_0_4 + 0.0143915343915343*G0_0_1_4_0_5 - 0.00359788359788358*G0_0_1_4_1_0 + 0.000740740740740738*G0_0_1_4_1_1 + 0.0019047619047619*G0_0_1_4_1_2 - 0.00148148148148148*G0_0_1_4_1_3 - 0.00338624338624338*G0_0_1_4_1_4 - 0.00529100529100527*G0_0_1_4_1_5 - 0.00349206349206348*G0_0_1_4_2_0 + 0.0019047619047619*G0_0_1_4_2_1 - 0.00582010582010579*G0_0_1_4_2_2 - 0.00380952380952379*G0_0_1_4_2_3 - 0.0215873015873015*G0_0_1_4_2_4 - 0.00529100529100527*G0_0_1_4_2_5 + 0.00232804232804232*G0_0_1_4_3_0 - 0.00148148148148148*G0_0_1_4_3_1 - 0.00380952380952379*G0_0_1_4_3_2 + 0.0139682539682539*G0_0_1_4_3_3 + 0.00211640211640211*G0_0_1_4_3_4 + 0.0059259259259259*G0_0_1_4_3_5 + 0.032169312169312*G0_0_1_4_4_0 - 0.00338624338624338*G0_0_1_4_4_1 - 0.0215873015873015*G0_0_1_4_4_2 + 0.00211640211640211*G0_0_1_4_4_3 + 0.0114285714285714*G0_0_1_4_4_4 + 0.0173544973544973*G0_0_1_4_4_5 + 0.0143915343915343*G0_0_1_4_5_0 - 0.00529100529100527*G0_0_1_4_5_1 - 0.00529100529100527*G0_0_1_4_5_2 + 0.0059259259259259*G0_0_1_4_5_3 + 0.0173544973544973*G0_0_1_4_5_4 + 0.0173544973544973*G0_0_1_4_5_5 + 0.0280423280423279*G0_0_1_5_0_0 - 0.00349206349206348*G0_0_1_5_0_1 - 0.00359788359788358*G0_0_1_5_0_2 + 0.00232804232804232*G0_0_1_5_0_3 + 0.0143915343915343*G0_0_1_5_0_4 + 0.032169312169312*G0_0_1_5_0_5 - 0.00349206349206348*G0_0_1_5_1_0 - 0.00582010582010579*G0_0_1_5_1_1 + 0.0019047619047619*G0_0_1_5_1_2 - 0.00380952380952379*G0_0_1_5_1_3 - 0.00529100529100527*G0_0_1_5_1_4 - 0.0215873015873015*G0_0_1_5_1_5 - 0.00359788359788358*G0_0_1_5_2_0 + 0.0019047619047619*G0_0_1_5_2_1 + 0.000740740740740736*G0_0_1_5_2_2 - 0.00148148148148147*G0_0_1_5_2_3 - 0.00529100529100527*G0_0_1_5_2_4 - 0.00338624338624337*G0_0_1_5_2_5 + 0.00232804232804232*G0_0_1_5_3_0 - 0.00380952380952379*G0_0_1_5_3_1 - 0.00148148148148147*G0_0_1_5_3_2 + 0.0139682539682539*G0_0_1_5_3_3 + 0.0059259259259259*G0_0_1_5_3_4 + 0.00211640211640212*G0_0_1_5_3_5 + 0.0143915343915343*G0_0_1_5_4_0 - 0.00529100529100527*G0_0_1_5_4_1 - 0.00529100529100527*G0_0_1_5_4_2 + 0.0059259259259259*G0_0_1_5_4_3 + 0.0173544973544973*G0_0_1_5_4_4 + 0.0173544973544973*G0_0_1_5_4_5 + 0.032169312169312*G0_0_1_5_5_0 - 0.0215873015873015*G0_0_1_5_5_1 - 0.00338624338624337*G0_0_1_5_5_2 + 0.00211640211640212*G0_0_1_5_5_3 + 0.0173544973544973*G0_0_1_5_5_4 + 0.0114285714285713*G0_0_1_5_5_5 - 0.000211640211640211*G0_1_0_0_0_1 - 0.000211640211640211*G0_1_0_0_0_2 + 0.00253968253968252*G0_1_0_0_0_3 + 0.0021164021164021*G0_1_0_0_0_4 + 0.0021164021164021*G0_1_0_0_0_5 - 0.000211640211640211*G0_1_0_0_1_0 - 0.00105820105820105*G0_1_0_0_1_1 + 0.00042328042328042*G0_1_0_0_1_2 + 0.000423280423280422*G0_1_0_0_1_3 + 0.000846560846560841*G0_1_0_0_1_4 - 0.000423280423280417*G0_1_0_0_1_5 - 0.000211640211640211*G0_1_0_0_2_0 + 0.00042328042328042*G0_1_0_0_2_1 - 0.00105820105820105*G0_1_0_0_2_2 + 0.000423280423280422*G0_1_0_0_2_3 - 0.000423280423280419*G0_1_0_0_2_4 + 0.000846560846560842*G0_1_0_0_2_5 + 0.00253968253968252*G0_1_0_0_3_0 + 0.000423280423280422*G0_1_0_0_3_1 + 0.000423280423280422*G0_1_0_0_3_2 - 0.0152380952380951*G0_1_0_0_3_3 - 0.00677248677248673*G0_1_0_0_3_4 - 0.00677248677248674*G0_1_0_0_3_5 + 0.0021164021164021*G0_1_0_0_4_0 + 0.000846560846560841*G0_1_0_0_4_1 - 0.000423280423280419*G0_1_0_0_4_2 - 0.00677248677248673*G0_1_0_0_4_3 - 0.00507936507936505*G0_1_0_0_4_4 - 0.00338624338624337*G0_1_0_0_4_5 + 0.0021164021164021*G0_1_0_0_5_0 - 0.000423280423280417*G0_1_0_0_5_1 + 0.000846560846560842*G0_1_0_0_5_2 - 0.00677248677248674*G0_1_0_0_5_3 - 0.00338624338624337*G0_1_0_0_5_4 - 0.00507936507936505*G0_1_0_0_5_5 - 0.000211640211640211*G0_1_0_1_0_0 - 0.00105820105820105*G0_1_0_1_0_1 + 0.00042328042328042*G0_1_0_1_0_2 + 0.000423280423280422*G0_1_0_1_0_3 + 0.000846560846560841*G0_1_0_1_0_4 - 0.000423280423280417*G0_1_0_1_0_5 - 0.00105820105820105*G0_1_0_1_1_0 + 0.00634920634920628*G0_1_0_1_1_1 - 0.00105820105820105*G0_1_0_1_1_2 + 0.00846560846560842*G0_1_0_1_1_3 + 0.00211640211640211*G0_1_0_1_1_4 + 0.0042328042328042*G0_1_0_1_1_5 + 0.00042328042328042*G0_1_0_1_2_0 - 0.00105820105820105*G0_1_0_1_2_1 - 0.00105820105820105*G0_1_0_1_2_2 - 0.00380952380952379*G0_1_0_1_2_3 - 0.00042328042328042*G0_1_0_1_2_4 - 0.000423280423280421*G0_1_0_1_2_5 + 0.000423280423280422*G0_1_0_1_3_0 + 0.00846560846560842*G0_1_0_1_3_1 - 0.00380952380952379*G0_1_0_1_3_2 - 0.00507936507936505*G0_1_0_1_3_4 + 0.000846560846560841*G0_1_0_1_4_0 + 0.00211640211640211*G0_1_0_1_4_1 - 0.00042328042328042*G0_1_0_1_4_2 - 0.00507936507936505*G0_1_0_1_4_3 - 0.00677248677248674*G0_1_0_1_4_4 - 0.00338624338624337*G0_1_0_1_4_5 - 0.000423280423280417*G0_1_0_1_5_0 + 0.0042328042328042*G0_1_0_1_5_1 - 0.000423280423280421*G0_1_0_1_5_2 - 0.00338624338624337*G0_1_0_1_5_4 - 0.000211640211640211*G0_1_0_2_0_0 + 0.00042328042328042*G0_1_0_2_0_1 - 0.00105820105820105*G0_1_0_2_0_2 + 0.000423280423280422*G0_1_0_2_0_3 - 0.000423280423280419*G0_1_0_2_0_4 + 0.000846560846560842*G0_1_0_2_0_5 + 0.00042328042328042*G0_1_0_2_1_0 - 0.00105820105820105*G0_1_0_2_1_1 - 0.00105820105820105*G0_1_0_2_1_2 - 0.00380952380952379*G0_1_0_2_1_3 - 0.00042328042328042*G0_1_0_2_1_4 - 0.000423280423280421*G0_1_0_2_1_5 - 0.00105820105820105*G0_1_0_2_2_0 - 0.00105820105820105*G0_1_0_2_2_1 + 0.00634920634920629*G0_1_0_2_2_2 + 0.00846560846560841*G0_1_0_2_2_3 + 0.0042328042328042*G0_1_0_2_2_4 + 0.00211640211640211*G0_1_0_2_2_5 + 0.000423280423280422*G0_1_0_2_3_0 - 0.00380952380952379*G0_1_0_2_3_1 + 0.00846560846560841*G0_1_0_2_3_2 - 0.00507936507936505*G0_1_0_2_3_5 - 0.000423280423280419*G0_1_0_2_4_0 - 0.00042328042328042*G0_1_0_2_4_1 + 0.0042328042328042*G0_1_0_2_4_2 - 0.00338624338624337*G0_1_0_2_4_5 + 0.000846560846560842*G0_1_0_2_5_0 - 0.000423280423280421*G0_1_0_2_5_1 + 0.00211640211640211*G0_1_0_2_5_2 - 0.00507936507936505*G0_1_0_2_5_3 - 0.00338624338624337*G0_1_0_2_5_4 - 0.00677248677248674*G0_1_0_2_5_5 + 0.00253968253968252*G0_1_0_3_0_0 + 0.000423280423280422*G0_1_0_3_0_1 + 0.000423280423280422*G0_1_0_3_0_2 - 0.0152380952380951*G0_1_0_3_0_3 - 0.00677248677248673*G0_1_0_3_0_4 - 0.00677248677248674*G0_1_0_3_0_5 + 0.000423280423280422*G0_1_0_3_1_0 + 0.00846560846560842*G0_1_0_3_1_1 - 0.00380952380952379*G0_1_0_3_1_2 - 0.00507936507936505*G0_1_0_3_1_4 + 0.000423280423280422*G0_1_0_3_2_0 - 0.00380952380952379*G0_1_0_3_2_1 + 0.00846560846560841*G0_1_0_3_2_2 - 0.00507936507936505*G0_1_0_3_2_5 - 0.0152380952380951*G0_1_0_3_3_0 + 0.162539682539682*G0_1_0_3_3_3 + 0.0406349206349204*G0_1_0_3_3_4 + 0.0406349206349205*G0_1_0_3_3_5 - 0.00677248677248673*G0_1_0_3_4_0 - 0.00507936507936505*G0_1_0_3_4_1 + 0.0406349206349204*G0_1_0_3_4_3 + 0.027089947089947*G0_1_0_3_4_4 + 0.0203174603174602*G0_1_0_3_4_5 - 0.00677248677248674*G0_1_0_3_5_0 - 0.00507936507936505*G0_1_0_3_5_2 + 0.0406349206349205*G0_1_0_3_5_3 + 0.0203174603174602*G0_1_0_3_5_4 + 0.027089947089947*G0_1_0_3_5_5 + 0.0021164021164021*G0_1_0_4_0_0 + 0.000846560846560841*G0_1_0_4_0_1 - 0.000423280423280419*G0_1_0_4_0_2 - 0.00677248677248673*G0_1_0_4_0_3 - 0.00507936507936505*G0_1_0_4_0_4 - 0.00338624338624337*G0_1_0_4_0_5 + 0.000846560846560841*G0_1_0_4_1_0 + 0.00211640211640211*G0_1_0_4_1_1 - 0.00042328042328042*G0_1_0_4_1_2 - 0.00507936507936505*G0_1_0_4_1_3 - 0.00677248677248674*G0_1_0_4_1_4 - 0.00338624338624337*G0_1_0_4_1_5 - 0.000423280423280419*G0_1_0_4_2_0 - 0.00042328042328042*G0_1_0_4_2_1 + 0.0042328042328042*G0_1_0_4_2_2 - 0.00338624338624337*G0_1_0_4_2_5 - 0.00677248677248673*G0_1_0_4_3_0 - 0.00507936507936505*G0_1_0_4_3_1 + 0.0406349206349204*G0_1_0_4_3_3 + 0.027089947089947*G0_1_0_4_3_4 + 0.0203174603174602*G0_1_0_4_3_5 - 0.00507936507936505*G0_1_0_4_4_0 - 0.00677248677248674*G0_1_0_4_4_1 + 0.027089947089947*G0_1_0_4_4_3 + 0.0406349206349204*G0_1_0_4_4_4 + 0.0203174603174602*G0_1_0_4_4_5 - 0.00338624338624337*G0_1_0_4_5_0 - 0.00338624338624337*G0_1_0_4_5_1 - 0.00338624338624337*G0_1_0_4_5_2 + 0.0203174603174602*G0_1_0_4_5_3 + 0.0203174603174602*G0_1_0_4_5_4 + 0.0203174603174602*G0_1_0_4_5_5 + 0.0021164021164021*G0_1_0_5_0_0 - 0.000423280423280417*G0_1_0_5_0_1 + 0.000846560846560842*G0_1_0_5_0_2 - 0.00677248677248674*G0_1_0_5_0_3 - 0.00338624338624337*G0_1_0_5_0_4 - 0.00507936507936505*G0_1_0_5_0_5 - 0.000423280423280417*G0_1_0_5_1_0 + 0.0042328042328042*G0_1_0_5_1_1 - 0.000423280423280421*G0_1_0_5_1_2 - 0.00338624338624337*G0_1_0_5_1_4 + 0.000846560846560842*G0_1_0_5_2_0 - 0.000423280423280421*G0_1_0_5_2_1 + 0.00211640211640211*G0_1_0_5_2_2 - 0.00507936507936505*G0_1_0_5_2_3 - 0.00338624338624337*G0_1_0_5_2_4 - 0.00677248677248674*G0_1_0_5_2_5 - 0.00677248677248674*G0_1_0_5_3_0 - 0.00507936507936505*G0_1_0_5_3_2 + 0.0406349206349205*G0_1_0_5_3_3 + 0.0203174603174602*G0_1_0_5_3_4 + 0.027089947089947*G0_1_0_5_3_5 - 0.00338624338624337*G0_1_0_5_4_0 - 0.00338624338624337*G0_1_0_5_4_1 - 0.00338624338624337*G0_1_0_5_4_2 + 0.0203174603174602*G0_1_0_5_4_3 + 0.0203174603174602*G0_1_0_5_4_4 + 0.0203174603174602*G0_1_0_5_4_5 - 0.00507936507936505*G0_1_0_5_5_0 - 0.00677248677248674*G0_1_0_5_5_2 + 0.027089947089947*G0_1_0_5_5_3 + 0.0203174603174602*G0_1_0_5_5_4 + 0.0406349206349204*G0_1_0_5_5_5 - 0.00634920634920631*G0_1_1_0_0_0 + 0.000846560846560842*G0_1_1_0_0_1 + 0.000846560846560842*G0_1_1_0_0_2 + 0.000423280423280418*G0_1_1_0_0_3 - 0.00211640211640211*G0_1_1_0_0_4 - 0.00634920634920632*G0_1_1_0_0_5 + 0.000846560846560842*G0_1_1_0_1_0 + 0.000846560846560843*G0_1_1_0_1_3 + 0.00126984126984126*G0_1_1_0_1_4 + 0.00338624338624337*G0_1_1_0_1_5 + 0.000846560846560842*G0_1_1_0_2_0 - 0.000846560846560839*G0_1_1_0_2_2 - 0.00042328042328042*G0_1_1_0_2_3 + 0.000423280423280421*G0_1_1_0_2_5 + 0.000423280423280418*G0_1_1_0_3_0 + 0.000846560846560843*G0_1_1_0_3_1 - 0.00042328042328042*G0_1_1_0_3_2 - 0.00846560846560841*G0_1_1_0_3_3 - 0.00338624338624337*G0_1_1_0_3_4 - 0.00169312169312168*G0_1_1_0_3_5 - 0.00211640211640211*G0_1_1_0_4_0 + 0.00126984126984126*G0_1_1_0_4_1 - 0.00338624338624337*G0_1_1_0_4_3 - 0.00507936507936505*G0_1_1_0_4_4 - 0.00338624338624337*G0_1_1_0_4_5 - 0.00634920634920632*G0_1_1_0_5_0 + 0.00338624338624337*G0_1_1_0_5_1 + 0.000423280423280421*G0_1_1_0_5_2 - 0.00169312169312168*G0_1_1_0_5_3 - 0.00338624338624337*G0_1_1_0_5_4 - 0.00507936507936505*G0_1_1_0_5_5 + 0.000846560846560842*G0_1_1_1_0_0 + 0.000846560846560843*G0_1_1_1_0_3 + 0.00126984126984126*G0_1_1_1_0_4 + 0.00338624338624337*G0_1_1_1_0_5 + 0.0042328042328042*G0_1_1_1_1_3 - 0.00423280423280422*G0_1_1_1_1_5 - 0.00084656084656084*G0_1_1_1_2_2 - 0.00338624338624337*G0_1_1_1_2_3 - 0.00126984126984126*G0_1_1_1_2_4 - 0.000846560846560842*G0_1_1_1_2_5 + 0.000846560846560843*G0_1_1_1_3_0 + 0.0042328042328042*G0_1_1_1_3_1 - 0.00338624338624337*G0_1_1_1_3_2 - 0.00169312169312168*G0_1_1_1_3_4 + 0.00126984126984126*G0_1_1_1_4_0 - 0.00126984126984126*G0_1_1_1_4_2 - 0.00169312169312168*G0_1_1_1_4_3 + 0.00169312169312168*G0_1_1_1_4_5 + 0.00338624338624337*G0_1_1_1_5_0 - 0.00423280423280422*G0_1_1_1_5_1 - 0.000846560846560842*G0_1_1_1_5_2 + 0.00169312169312168*G0_1_1_1_5_4 + 0.000846560846560842*G0_1_1_2_0_0 - 0.000846560846560839*G0_1_1_2_0_2 - 0.00042328042328042*G0_1_1_2_0_3 + 0.000423280423280421*G0_1_1_2_0_5 - 0.00084656084656084*G0_1_1_2_1_2 - 0.00338624338624337*G0_1_1_2_1_3 - 0.00126984126984126*G0_1_1_2_1_4 - 0.000846560846560842*G0_1_1_2_1_5 - 0.000846560846560839*G0_1_1_2_2_0 - 0.00084656084656084*G0_1_1_2_2_1 + 0.00634920634920629*G0_1_1_2_2_2 + 0.00634920634920631*G0_1_1_2_2_3 + 0.0021164021164021*G0_1_1_2_2_4 - 0.00042328042328042*G0_1_1_2_2_5 - 0.00042328042328042*G0_1_1_2_3_0 - 0.00338624338624337*G0_1_1_2_3_1 + 0.00634920634920631*G0_1_1_2_3_2 + 0.00507936507936505*G0_1_1_2_3_3 + 0.00338624338624337*G0_1_1_2_3_4 + 0.00169312169312169*G0_1_1_2_3_5 - 0.00126984126984126*G0_1_1_2_4_1 + 0.0021164021164021*G0_1_1_2_4_2 + 0.00338624338624337*G0_1_1_2_4_3 + 0.00507936507936505*G0_1_1_2_4_4 + 0.00338624338624337*G0_1_1_2_4_5 + 0.000423280423280421*G0_1_1_2_5_0 - 0.000846560846560842*G0_1_1_2_5_1 - 0.00042328042328042*G0_1_1_2_5_2 + 0.00169312169312169*G0_1_1_2_5_3 + 0.00338624338624337*G0_1_1_2_5_4 + 0.00846560846560842*G0_1_1_2_5_5 + 0.000423280423280418*G0_1_1_3_0_0 + 0.000846560846560843*G0_1_1_3_0_1 - 0.00042328042328042*G0_1_1_3_0_2 - 0.00846560846560841*G0_1_1_3_0_3 - 0.00338624338624337*G0_1_1_3_0_4 - 0.00169312169312168*G0_1_1_3_0_5 + 0.000846560846560843*G0_1_1_3_1_0 + 0.0042328042328042*G0_1_1_3_1_1 - 0.00338624338624337*G0_1_1_3_1_2 - 0.00169312169312168*G0_1_1_3_1_4 - 0.00042328042328042*G0_1_1_3_2_0 - 0.00338624338624337*G0_1_1_3_2_1 + 0.00634920634920631*G0_1_1_3_2_2 + 0.00507936507936505*G0_1_1_3_2_3 + 0.00338624338624337*G0_1_1_3_2_4 + 0.00169312169312169*G0_1_1_3_2_5 - 0.00846560846560841*G0_1_1_3_3_0 + 0.00507936507936505*G0_1_1_3_3_2 + 0.121904761904761*G0_1_1_3_3_3 + 0.0203174603174602*G0_1_1_3_3_4 + 0.0135449735449735*G0_1_1_3_3_5 - 0.00338624338624337*G0_1_1_3_4_0 - 0.00169312169312168*G0_1_1_3_4_1 + 0.00338624338624337*G0_1_1_3_4_2 + 0.0203174603174602*G0_1_1_3_4_3 + 0.00677248677248674*G0_1_1_3_4_4 - 0.00169312169312168*G0_1_1_3_5_0 + 0.00169312169312169*G0_1_1_3_5_2 + 0.0135449735449735*G0_1_1_3_5_3 - 0.0135449735449735*G0_1_1_3_5_5 - 0.00211640211640211*G0_1_1_4_0_0 + 0.00126984126984126*G0_1_1_4_0_1 - 0.00338624338624337*G0_1_1_4_0_3 - 0.00507936507936505*G0_1_1_4_0_4 - 0.00338624338624337*G0_1_1_4_0_5 + 0.00126984126984126*G0_1_1_4_1_0 - 0.00126984126984126*G0_1_1_4_1_2 - 0.00169312169312168*G0_1_1_4_1_3 + 0.00169312169312168*G0_1_1_4_1_5 - 0.00126984126984126*G0_1_1_4_2_1 + 0.0021164021164021*G0_1_1_4_2_2 + 0.00338624338624337*G0_1_1_4_2_3 + 0.00507936507936505*G0_1_1_4_2_4 + 0.00338624338624337*G0_1_1_4_2_5 - 0.00338624338624337*G0_1_1_4_3_0 - 0.00169312169312168*G0_1_1_4_3_1 + 0.00338624338624337*G0_1_1_4_3_2 + 0.0203174603174602*G0_1_1_4_3_3 + 0.00677248677248674*G0_1_1_4_3_4 - 0.00507936507936505*G0_1_1_4_4_0 + 0.00507936507936505*G0_1_1_4_4_2 + 0.00677248677248674*G0_1_1_4_4_3 - 0.00677248677248674*G0_1_1_4_4_5 - 0.00338624338624337*G0_1_1_4_5_0 + 0.00169312169312168*G0_1_1_4_5_1 + 0.00338624338624337*G0_1_1_4_5_2 - 0.00677248677248674*G0_1_1_4_5_4 - 0.0203174603174602*G0_1_1_4_5_5 - 0.00634920634920632*G0_1_1_5_0_0 + 0.00338624338624337*G0_1_1_5_0_1 + 0.000423280423280421*G0_1_1_5_0_2 - 0.00169312169312168*G0_1_1_5_0_3 - 0.00338624338624337*G0_1_1_5_0_4 - 0.00507936507936505*G0_1_1_5_0_5 + 0.00338624338624337*G0_1_1_5_1_0 - 0.00423280423280422*G0_1_1_5_1_1 - 0.000846560846560842*G0_1_1_5_1_2 + 0.00169312169312168*G0_1_1_5_1_4 + 0.000423280423280421*G0_1_1_5_2_0 - 0.000846560846560842*G0_1_1_5_2_1 - 0.00042328042328042*G0_1_1_5_2_2 + 0.00169312169312169*G0_1_1_5_2_3 + 0.00338624338624337*G0_1_1_5_2_4 + 0.00846560846560842*G0_1_1_5_2_5 - 0.00169312169312168*G0_1_1_5_3_0 + 0.00169312169312169*G0_1_1_5_3_2 + 0.0135449735449735*G0_1_1_5_3_3 - 0.0135449735449735*G0_1_1_5_3_5 - 0.00338624338624337*G0_1_1_5_4_0 + 0.00169312169312168*G0_1_1_5_4_1 + 0.00338624338624337*G0_1_1_5_4_2 - 0.00677248677248674*G0_1_1_5_4_4 - 0.0203174603174602*G0_1_1_5_4_5 - 0.00507936507936505*G0_1_1_5_5_0 + 0.00846560846560842*G0_1_1_5_5_2 - 0.0135449735449735*G0_1_1_5_5_3 - 0.0203174603174602*G0_1_1_5_5_4 - 0.121904761904761*G0_1_1_5_5_5; + A[33] = -A[34] + 0.0825396825396821*G0_0_1_0_0_0 - 0.00888888888888884*G0_0_1_0_0_1 - 0.00677248677248674*G0_0_1_0_0_2 + 0.000846560846560854*G0_0_1_0_0_3 + 0.0296296296296295*G0_0_1_0_0_4 + 0.0296296296296295*G0_0_1_0_0_5 - 0.00888888888888884*G0_0_1_0_1_0 + 0.00888888888888882*G0_0_1_0_1_1 + 0.00338624338624336*G0_0_1_0_1_3 - 0.00338624338624337*G0_0_1_0_1_4 - 0.00677248677248674*G0_0_1_0_2_0 + 0.00211640211640211*G0_0_1_0_2_2 - 0.00253968253968252*G0_0_1_0_2_3 - 0.0059259259259259*G0_0_1_0_2_4 - 0.0059259259259259*G0_0_1_0_2_5 + 0.000846560846560854*G0_0_1_0_3_0 + 0.00338624338624336*G0_0_1_0_3_1 - 0.00253968253968252*G0_0_1_0_3_2 + 0.00846560846560841*G0_0_1_0_3_3 + 0.00507936507936506*G0_0_1_0_3_4 + 0.0101587301587301*G0_0_1_0_3_5 + 0.0296296296296295*G0_0_1_0_4_0 - 0.00338624338624337*G0_0_1_0_4_1 - 0.0059259259259259*G0_0_1_0_4_2 + 0.00507936507936506*G0_0_1_0_4_3 + 0.032169312169312*G0_0_1_0_4_4 + 0.0186243386243385*G0_0_1_0_4_5 + 0.0296296296296295*G0_0_1_0_5_0 - 0.0059259259259259*G0_0_1_0_5_2 + 0.0101587301587301*G0_0_1_0_5_3 + 0.0186243386243385*G0_0_1_0_5_4 + 0.0491005291005288*G0_0_1_0_5_5 - 0.00888888888888884*G0_0_1_1_0_0 + 0.00888888888888882*G0_0_1_1_0_1 + 0.00338624338624336*G0_0_1_1_0_3 - 0.00338624338624337*G0_0_1_1_0_4 + 0.00888888888888882*G0_0_1_1_1_0 - 0.082539682539682*G0_0_1_1_1_1 + 0.00677248677248673*G0_0_1_1_1_2 - 0.0296296296296295*G0_0_1_1_1_3 - 0.000846560846560842*G0_0_1_1_1_4 - 0.0296296296296294*G0_0_1_1_1_5 + 0.00677248677248673*G0_0_1_1_2_1 - 0.00211640211640211*G0_0_1_1_2_2 + 0.0059259259259259*G0_0_1_1_2_3 + 0.00253968253968253*G0_0_1_1_2_4 + 0.0059259259259259*G0_0_1_1_2_5 + 0.00338624338624336*G0_0_1_1_3_0 - 0.0296296296296295*G0_0_1_1_3_1 + 0.0059259259259259*G0_0_1_1_3_2 - 0.032169312169312*G0_0_1_1_3_3 - 0.00507936507936506*G0_0_1_1_3_4 - 0.0186243386243385*G0_0_1_1_3_5 - 0.00338624338624337*G0_0_1_1_4_0 - 0.000846560846560842*G0_0_1_1_4_1 + 0.00253968253968253*G0_0_1_1_4_2 - 0.00507936507936506*G0_0_1_1_4_3 - 0.00846560846560843*G0_0_1_1_4_4 - 0.0101587301587301*G0_0_1_1_4_5 - 0.0296296296296294*G0_0_1_1_5_1 + 0.0059259259259259*G0_0_1_1_5_2 - 0.0186243386243385*G0_0_1_1_5_3 - 0.0101587301587301*G0_0_1_1_5_4 - 0.0491005291005288*G0_0_1_1_5_5 - 0.00677248677248674*G0_0_1_2_0_0 + 0.00211640211640211*G0_0_1_2_0_2 - 0.00253968253968252*G0_0_1_2_0_3 - 0.0059259259259259*G0_0_1_2_0_4 - 0.0059259259259259*G0_0_1_2_0_5 + 0.00677248677248673*G0_0_1_2_1_1 - 0.00211640211640211*G0_0_1_2_1_2 + 0.0059259259259259*G0_0_1_2_1_3 + 0.00253968253968253*G0_0_1_2_1_4 + 0.0059259259259259*G0_0_1_2_1_5 + 0.00211640211640211*G0_0_1_2_2_0 - 0.00211640211640211*G0_0_1_2_2_1 - 0.00253968253968252*G0_0_1_2_3_0 + 0.0059259259259259*G0_0_1_2_3_1 + 0.0169312169312168*G0_0_1_2_3_3 + 0.00507936507936506*G0_0_1_2_3_5 - 0.0059259259259259*G0_0_1_2_4_0 + 0.00253968253968253*G0_0_1_2_4_1 - 0.0169312169312169*G0_0_1_2_4_4 - 0.00507936507936506*G0_0_1_2_4_5 - 0.0059259259259259*G0_0_1_2_5_0 + 0.00592592592592589*G0_0_1_2_5_1 + 0.00507936507936506*G0_0_1_2_5_3 - 0.00507936507936506*G0_0_1_2_5_4 + 0.000846560846560854*G0_0_1_3_0_0 + 0.00338624338624336*G0_0_1_3_0_1 - 0.00253968253968252*G0_0_1_3_0_2 + 0.00846560846560842*G0_0_1_3_0_3 + 0.00507936507936506*G0_0_1_3_0_4 + 0.0101587301587301*G0_0_1_3_0_5 + 0.00338624338624336*G0_0_1_3_1_0 - 0.0296296296296295*G0_0_1_3_1_1 + 0.0059259259259259*G0_0_1_3_1_2 - 0.032169312169312*G0_0_1_3_1_3 - 0.00507936507936506*G0_0_1_3_1_4 - 0.0186243386243385*G0_0_1_3_1_5 - 0.00253968253968252*G0_0_1_3_2_0 + 0.0059259259259259*G0_0_1_3_2_1 + 0.0169312169312168*G0_0_1_3_2_3 + 0.00507936507936506*G0_0_1_3_2_5 + 0.00846560846560841*G0_0_1_3_3_0 - 0.032169312169312*G0_0_1_3_3_1 + 0.0169312169312168*G0_0_1_3_3_2 - 0.0609523809523806*G0_0_1_3_3_3 - 0.00677248677248674*G0_0_1_3_3_4 - 0.027089947089947*G0_0_1_3_3_5 + 0.00507936507936506*G0_0_1_3_4_0 - 0.00507936507936506*G0_0_1_3_4_1 - 0.00677248677248674*G0_0_1_3_4_3 + 0.00677248677248675*G0_0_1_3_4_4 + 0.0101587301587301*G0_0_1_3_5_0 - 0.0186243386243385*G0_0_1_3_5_1 + 0.00507936507936506*G0_0_1_3_5_2 - 0.027089947089947*G0_0_1_3_5_3 - 0.0203174603174602*G0_0_1_3_5_5 + 0.0296296296296295*G0_0_1_4_0_0 - 0.00338624338624337*G0_0_1_4_0_1 - 0.0059259259259259*G0_0_1_4_0_2 + 0.00507936507936506*G0_0_1_4_0_3 + 0.032169312169312*G0_0_1_4_0_4 + 0.0186243386243385*G0_0_1_4_0_5 - 0.00338624338624337*G0_0_1_4_1_0 - 0.000846560846560843*G0_0_1_4_1_1 + 0.00253968253968253*G0_0_1_4_1_2 - 0.00507936507936506*G0_0_1_4_1_3 - 0.00846560846560843*G0_0_1_4_1_4 - 0.0101587301587301*G0_0_1_4_1_5 - 0.0059259259259259*G0_0_1_4_2_0 + 0.00253968253968253*G0_0_1_4_2_1 - 0.0169312169312169*G0_0_1_4_2_4 - 0.00507936507936506*G0_0_1_4_2_5 + 0.00507936507936506*G0_0_1_4_3_0 - 0.00507936507936506*G0_0_1_4_3_1 - 0.00677248677248674*G0_0_1_4_3_3 + 0.00677248677248674*G0_0_1_4_3_4 + 0.032169312169312*G0_0_1_4_4_0 - 0.00846560846560843*G0_0_1_4_4_1 - 0.0169312169312169*G0_0_1_4_4_2 + 0.00677248677248674*G0_0_1_4_4_3 + 0.0609523809523807*G0_0_1_4_4_4 + 0.027089947089947*G0_0_1_4_4_5 + 0.0186243386243385*G0_0_1_4_5_0 - 0.0101587301587301*G0_0_1_4_5_1 - 0.00507936507936506*G0_0_1_4_5_2 + 0.027089947089947*G0_0_1_4_5_4 + 0.0203174603174602*G0_0_1_4_5_5 + 0.0296296296296295*G0_0_1_5_0_0 - 0.0059259259259259*G0_0_1_5_0_2 + 0.0101587301587301*G0_0_1_5_0_3 + 0.0186243386243385*G0_0_1_5_0_4 + 0.0491005291005288*G0_0_1_5_0_5 - 0.0296296296296294*G0_0_1_5_1_1 + 0.0059259259259259*G0_0_1_5_1_2 - 0.0186243386243385*G0_0_1_5_1_3 - 0.0101587301587301*G0_0_1_5_1_4 - 0.0491005291005288*G0_0_1_5_1_5 - 0.0059259259259259*G0_0_1_5_2_0 + 0.00592592592592589*G0_0_1_5_2_1 + 0.00507936507936506*G0_0_1_5_2_3 - 0.00507936507936506*G0_0_1_5_2_4 + 0.0101587301587301*G0_0_1_5_3_0 - 0.0186243386243385*G0_0_1_5_3_1 + 0.00507936507936506*G0_0_1_5_3_2 - 0.027089947089947*G0_0_1_5_3_3 - 0.0203174603174602*G0_0_1_5_3_5 + 0.0186243386243385*G0_0_1_5_4_0 - 0.0101587301587301*G0_0_1_5_4_1 - 0.00507936507936506*G0_0_1_5_4_2 + 0.027089947089947*G0_0_1_5_4_4 + 0.0203174603174602*G0_0_1_5_4_5 + 0.0491005291005288*G0_0_1_5_5_0 - 0.0491005291005288*G0_0_1_5_5_1 - 0.0203174603174602*G0_0_1_5_5_3 + 0.0203174603174602*G0_0_1_5_5_4 - 0.00634920634920632*G0_1_1_0_0_0 - 0.000423280423280416*G0_1_1_0_0_1 + 0.00169312169312168*G0_1_1_0_0_2 - 0.00338624338624336*G0_1_1_0_0_3 - 0.00423280423280421*G0_1_1_0_0_4 - 0.0126984126984126*G0_1_1_0_0_5 - 0.000423280423280416*G0_1_1_0_1_0 + 0.0084656084656084*G0_1_1_0_1_1 - 0.00126984126984126*G0_1_1_0_1_2 + 0.00507936507936504*G0_1_1_0_1_3 + 0.00169312169312168*G0_1_1_0_1_4 + 0.0118518518518518*G0_1_1_0_1_5 + 0.00169312169312168*G0_1_1_0_2_0 - 0.00126984126984126*G0_1_1_0_2_1 - 0.00338624338624336*G0_1_1_0_2_3 - 0.00084656084656084*G0_1_1_0_2_4 - 0.00253968253968253*G0_1_1_0_2_5 - 0.00338624338624336*G0_1_1_0_3_0 + 0.00507936507936504*G0_1_1_0_3_1 - 0.00338624338624336*G0_1_1_0_3_2 + 0.0118518518518518*G0_1_1_0_3_3 + 0.00338624338624337*G0_1_1_0_3_4 + 0.0118518518518518*G0_1_1_0_3_5 - 0.00423280423280421*G0_1_1_0_4_0 + 0.00169312169312168*G0_1_1_0_4_1 - 0.00084656084656084*G0_1_1_0_4_2 + 0.00338624338624337*G0_1_1_0_4_3 - 0.00169312169312169*G0_1_1_0_4_4 + 0.00169312169312168*G0_1_1_0_4_5 - 0.0126984126984126*G0_1_1_0_5_0 + 0.0118518518518518*G0_1_1_0_5_1 - 0.00253968253968253*G0_1_1_0_5_2 + 0.0118518518518518*G0_1_1_0_5_3 + 0.00169312169312168*G0_1_1_0_5_4 + 0.0152380952380951*G0_1_1_0_5_5 - 0.000423280423280416*G0_1_1_1_0_0 + 0.0084656084656084*G0_1_1_1_0_1 - 0.00126984126984126*G0_1_1_1_0_2 + 0.00507936507936504*G0_1_1_1_0_3 + 0.00169312169312168*G0_1_1_1_0_4 + 0.0118518518518518*G0_1_1_1_0_5 + 0.00846560846560841*G0_1_1_1_1_0 - 0.0888888888888884*G0_1_1_1_1_1 + 0.00846560846560842*G0_1_1_1_1_2 - 0.0338624338624337*G0_1_1_1_1_3 - 0.00423280423280421*G0_1_1_1_1_4 - 0.0423280423280421*G0_1_1_1_1_5 - 0.00126984126984126*G0_1_1_1_2_0 + 0.00846560846560842*G0_1_1_1_2_1 - 0.0021164021164021*G0_1_1_1_2_2 + 0.00507936507936506*G0_1_1_1_2_3 - 0.000846560846560842*G0_1_1_1_2_4 + 0.00338624338624337*G0_1_1_1_2_5 + 0.00507936507936504*G0_1_1_1_3_0 - 0.0338624338624337*G0_1_1_1_3_1 + 0.00507936507936506*G0_1_1_1_3_2 - 0.0338624338624337*G0_1_1_1_3_3 - 0.00169312169312169*G0_1_1_1_3_4 - 0.0169312169312168*G0_1_1_1_3_5 + 0.00169312169312168*G0_1_1_1_4_0 - 0.00423280423280421*G0_1_1_1_4_1 - 0.000846560846560842*G0_1_1_1_4_2 - 0.00169312169312169*G0_1_1_1_4_3 + 0.00338624338624337*G0_1_1_1_4_4 + 0.00169312169312169*G0_1_1_1_4_5 + 0.0118518518518518*G0_1_1_1_5_0 - 0.0423280423280421*G0_1_1_1_5_1 + 0.00338624338624337*G0_1_1_1_5_2 - 0.0169312169312168*G0_1_1_1_5_3 + 0.00169312169312169*G0_1_1_1_5_4 - 0.0338624338624337*G0_1_1_1_5_5 + 0.00169312169312168*G0_1_1_2_0_0 - 0.00126984126984126*G0_1_1_2_0_1 - 0.00338624338624337*G0_1_1_2_0_3 - 0.00084656084656084*G0_1_1_2_0_4 - 0.00253968253968253*G0_1_1_2_0_5 - 0.00126984126984126*G0_1_1_2_1_0 + 0.00846560846560842*G0_1_1_2_1_1 - 0.0021164021164021*G0_1_1_2_1_2 + 0.00507936507936506*G0_1_1_2_1_3 - 0.000846560846560842*G0_1_1_2_1_4 + 0.00338624338624337*G0_1_1_2_1_5 - 0.0021164021164021*G0_1_1_2_2_1 + 0.0063492063492063*G0_1_1_2_2_2 - 0.00423280423280421*G0_1_1_2_2_5 - 0.00338624338624337*G0_1_1_2_3_0 + 0.00507936507936506*G0_1_1_2_3_1 + 0.0253968253968253*G0_1_1_2_3_3 + 0.00846560846560842*G0_1_1_2_3_4 + 0.0152380952380952*G0_1_1_2_3_5 - 0.00084656084656084*G0_1_1_2_4_0 - 0.000846560846560842*G0_1_1_2_4_1 + 0.00846560846560842*G0_1_1_2_4_3 + 0.00846560846560842*G0_1_1_2_4_4 + 0.0101587301587301*G0_1_1_2_4_5 - 0.00253968253968253*G0_1_1_2_5_0 + 0.00338624338624337*G0_1_1_2_5_1 - 0.00423280423280421*G0_1_1_2_5_2 + 0.0152380952380952*G0_1_1_2_5_3 + 0.0101587301587301*G0_1_1_2_5_4 + 0.0287830687830686*G0_1_1_2_5_5 - 0.00338624338624336*G0_1_1_3_0_0 + 0.00507936507936504*G0_1_1_3_0_1 - 0.00338624338624336*G0_1_1_3_0_2 + 0.0118518518518518*G0_1_1_3_0_3 + 0.00338624338624337*G0_1_1_3_0_4 + 0.0118518518518518*G0_1_1_3_0_5 + 0.00507936507936504*G0_1_1_3_1_0 - 0.0338624338624337*G0_1_1_3_1_1 + 0.00507936507936506*G0_1_1_3_1_2 - 0.0338624338624337*G0_1_1_3_1_3 - 0.00169312169312169*G0_1_1_3_1_4 - 0.0169312169312168*G0_1_1_3_1_5 - 0.00338624338624336*G0_1_1_3_2_0 + 0.00507936507936506*G0_1_1_3_2_1 + 0.0253968253968253*G0_1_1_3_2_3 + 0.00846560846560843*G0_1_1_3_2_4 + 0.0152380952380952*G0_1_1_3_2_5 + 0.0118518518518518*G0_1_1_3_3_0 - 0.0338624338624337*G0_1_1_3_3_1 + 0.0253968253968253*G0_1_1_3_3_2 - 0.0812698412698409*G0_1_1_3_3_3 - 0.0203174603174602*G0_1_1_3_3_4 - 0.0541798941798939*G0_1_1_3_3_5 + 0.00338624338624337*G0_1_1_3_4_0 - 0.00169312169312169*G0_1_1_3_4_1 + 0.00846560846560843*G0_1_1_3_4_2 - 0.0203174603174602*G0_1_1_3_4_3 - 0.0135449735449735*G0_1_1_3_4_4 - 0.027089947089947*G0_1_1_3_4_5 + 0.0118518518518518*G0_1_1_3_5_0 - 0.0169312169312168*G0_1_1_3_5_1 + 0.0152380952380952*G0_1_1_3_5_2 - 0.0541798941798939*G0_1_1_3_5_3 - 0.027089947089947*G0_1_1_3_5_4 - 0.0812698412698409*G0_1_1_3_5_5 - 0.00423280423280421*G0_1_1_4_0_0 + 0.00169312169312168*G0_1_1_4_0_1 - 0.00084656084656084*G0_1_1_4_0_2 + 0.00338624338624337*G0_1_1_4_0_3 - 0.00169312169312169*G0_1_1_4_0_4 + 0.00169312169312168*G0_1_1_4_0_5 + 0.00169312169312168*G0_1_1_4_1_0 - 0.00423280423280421*G0_1_1_4_1_1 - 0.000846560846560842*G0_1_1_4_1_2 - 0.00169312169312169*G0_1_1_4_1_3 + 0.00338624338624337*G0_1_1_4_1_4 + 0.00169312169312169*G0_1_1_4_1_5 - 0.00084656084656084*G0_1_1_4_2_0 - 0.000846560846560842*G0_1_1_4_2_1 + 0.00846560846560843*G0_1_1_4_2_3 + 0.00846560846560842*G0_1_1_4_2_4 + 0.0101587301587301*G0_1_1_4_2_5 + 0.00338624338624337*G0_1_1_4_3_0 - 0.00169312169312169*G0_1_1_4_3_1 + 0.00846560846560843*G0_1_1_4_3_2 - 0.0203174603174602*G0_1_1_4_3_3 - 0.0135449735449735*G0_1_1_4_3_4 - 0.027089947089947*G0_1_1_4_3_5 - 0.00169312169312169*G0_1_1_4_4_0 + 0.00338624338624337*G0_1_1_4_4_1 + 0.00846560846560842*G0_1_1_4_4_2 - 0.0135449735449735*G0_1_1_4_4_3 - 0.0203174603174602*G0_1_1_4_4_4 - 0.027089947089947*G0_1_1_4_4_5 + 0.00169312169312168*G0_1_1_4_5_0 + 0.00169312169312169*G0_1_1_4_5_1 + 0.0101587301587301*G0_1_1_4_5_2 - 0.027089947089947*G0_1_1_4_5_3 - 0.027089947089947*G0_1_1_4_5_4 - 0.0609523809523806*G0_1_1_4_5_5 - 0.0126984126984126*G0_1_1_5_0_0 + 0.0118518518518518*G0_1_1_5_0_1 - 0.00253968253968253*G0_1_1_5_0_2 + 0.0118518518518518*G0_1_1_5_0_3 + 0.00169312169312168*G0_1_1_5_0_4 + 0.0152380952380951*G0_1_1_5_0_5 + 0.0118518518518518*G0_1_1_5_1_0 - 0.0423280423280421*G0_1_1_5_1_1 + 0.00338624338624337*G0_1_1_5_1_2 - 0.0169312169312168*G0_1_1_5_1_3 + 0.00169312169312169*G0_1_1_5_1_4 - 0.0338624338624337*G0_1_1_5_1_5 - 0.00253968253968252*G0_1_1_5_2_0 + 0.00338624338624337*G0_1_1_5_2_1 - 0.00423280423280421*G0_1_1_5_2_2 + 0.0152380952380952*G0_1_1_5_2_3 + 0.0101587301587301*G0_1_1_5_2_4 + 0.0287830687830686*G0_1_1_5_2_5 + 0.0118518518518518*G0_1_1_5_3_0 - 0.0169312169312168*G0_1_1_5_3_1 + 0.0152380952380952*G0_1_1_5_3_2 - 0.0541798941798939*G0_1_1_5_3_3 - 0.027089947089947*G0_1_1_5_3_4 - 0.0812698412698409*G0_1_1_5_3_5 + 0.00169312169312168*G0_1_1_5_4_0 + 0.00169312169312169*G0_1_1_5_4_1 + 0.0101587301587301*G0_1_1_5_4_2 - 0.027089947089947*G0_1_1_5_4_3 - 0.027089947089947*G0_1_1_5_4_4 - 0.0609523809523806*G0_1_1_5_4_5 + 0.0152380952380951*G0_1_1_5_5_0 - 0.0338624338624337*G0_1_1_5_5_1 + 0.0287830687830686*G0_1_1_5_5_2 - 0.0812698412698409*G0_1_1_5_5_3 - 0.0609523809523806*G0_1_1_5_5_4 - 0.325079365079363*G0_1_1_5_5_5; + A[21] = -A[33] + 0.0063492063492063*G0_0_0_0_0_0 - 0.00169312169312168*G0_0_0_0_0_1 + 0.000423280423280417*G0_0_0_0_0_2 + 0.00338624338624337*G0_0_0_0_0_3 + 0.0126984126984126*G0_0_0_0_0_4 + 0.00423280423280421*G0_0_0_0_0_5 - 0.00169312169312168*G0_0_0_0_1_0 + 0.00126984126984126*G0_0_0_0_1_2 + 0.00338624338624336*G0_0_0_0_1_3 + 0.00253968253968252*G0_0_0_0_1_4 + 0.000846560846560841*G0_0_0_0_1_5 + 0.000423280423280417*G0_0_0_0_2_0 + 0.00126984126984126*G0_0_0_0_2_1 - 0.00846560846560839*G0_0_0_0_2_2 - 0.00507936507936504*G0_0_0_0_2_3 - 0.0118518518518518*G0_0_0_0_2_4 - 0.00169312169312169*G0_0_0_0_2_5 + 0.00338624338624337*G0_0_0_0_3_0 + 0.00338624338624336*G0_0_0_0_3_1 - 0.00507936507936504*G0_0_0_0_3_2 - 0.0118518518518518*G0_0_0_0_3_3 - 0.0118518518518518*G0_0_0_0_3_4 - 0.00338624338624337*G0_0_0_0_3_5 + 0.0126984126984126*G0_0_0_0_4_0 + 0.00253968253968252*G0_0_0_0_4_1 - 0.0118518518518518*G0_0_0_0_4_2 - 0.0118518518518518*G0_0_0_0_4_3 - 0.0152380952380951*G0_0_0_0_4_4 - 0.00169312169312168*G0_0_0_0_4_5 + 0.00423280423280421*G0_0_0_0_5_0 + 0.00084656084656084*G0_0_0_0_5_1 - 0.00169312169312169*G0_0_0_0_5_2 - 0.00338624338624337*G0_0_0_0_5_3 - 0.00169312169312168*G0_0_0_0_5_4 + 0.00169312169312167*G0_0_0_0_5_5 - 0.00169312169312168*G0_0_0_1_0_0 + 0.00126984126984126*G0_0_0_1_0_2 + 0.00338624338624336*G0_0_0_1_0_3 + 0.00253968253968252*G0_0_0_1_0_4 + 0.000846560846560841*G0_0_0_1_0_5 - 0.00634920634920629*G0_0_0_1_1_1 + 0.0021164021164021*G0_0_0_1_1_2 + 0.00423280423280421*G0_0_0_1_1_4 + 0.00126984126984126*G0_0_0_1_2_0 + 0.0021164021164021*G0_0_0_1_2_1 - 0.0084656084656084*G0_0_0_1_2_2 - 0.00507936507936504*G0_0_0_1_2_3 - 0.00338624338624336*G0_0_0_1_2_4 + 0.00084656084656084*G0_0_0_1_2_5 + 0.00338624338624336*G0_0_0_1_3_0 - 0.00507936507936504*G0_0_0_1_3_2 - 0.0253968253968253*G0_0_0_1_3_3 - 0.0152380952380952*G0_0_0_1_3_4 - 0.00846560846560842*G0_0_0_1_3_5 + 0.00253968253968252*G0_0_0_1_4_0 + 0.00423280423280421*G0_0_0_1_4_1 - 0.00338624338624336*G0_0_0_1_4_2 - 0.0152380952380952*G0_0_0_1_4_3 - 0.0287830687830686*G0_0_0_1_4_4 - 0.0101587301587301*G0_0_0_1_4_5 + 0.00084656084656084*G0_0_0_1_5_0 + 0.00084656084656084*G0_0_0_1_5_2 - 0.00846560846560842*G0_0_0_1_5_3 - 0.0101587301587301*G0_0_0_1_5_4 - 0.00846560846560841*G0_0_0_1_5_5 + 0.000423280423280417*G0_0_0_2_0_0 + 0.00126984126984126*G0_0_0_2_0_1 - 0.00846560846560839*G0_0_0_2_0_2 - 0.00507936507936504*G0_0_0_2_0_3 - 0.0118518518518518*G0_0_0_2_0_4 - 0.00169312169312169*G0_0_0_2_0_5 + 0.00126984126984126*G0_0_0_2_1_0 + 0.0021164021164021*G0_0_0_2_1_1 - 0.0084656084656084*G0_0_0_2_1_2 - 0.00507936507936504*G0_0_0_2_1_3 - 0.00338624338624336*G0_0_0_2_1_4 + 0.00084656084656084*G0_0_0_2_1_5 - 0.00846560846560839*G0_0_0_2_2_0 - 0.0084656084656084*G0_0_0_2_2_1 + 0.0888888888888883*G0_0_0_2_2_2 + 0.0338624338624336*G0_0_0_2_2_3 + 0.042328042328042*G0_0_0_2_2_4 + 0.00423280423280423*G0_0_0_2_2_5 - 0.00507936507936504*G0_0_0_2_3_0 - 0.00507936507936504*G0_0_0_2_3_1 + 0.0338624338624336*G0_0_0_2_3_2 + 0.0338624338624336*G0_0_0_2_3_3 + 0.0169312169312168*G0_0_0_2_3_4 + 0.0016931216931217*G0_0_0_2_3_5 - 0.0118518518518518*G0_0_0_2_4_0 - 0.00338624338624336*G0_0_0_2_4_1 + 0.042328042328042*G0_0_0_2_4_2 + 0.0169312169312168*G0_0_0_2_4_3 + 0.0338624338624336*G0_0_0_2_4_4 - 0.00169312169312168*G0_0_0_2_4_5 - 0.00169312169312169*G0_0_0_2_5_0 + 0.00084656084656084*G0_0_0_2_5_1 + 0.00423280423280423*G0_0_0_2_5_2 + 0.0016931216931217*G0_0_0_2_5_3 - 0.00169312169312168*G0_0_0_2_5_4 - 0.00338624338624337*G0_0_0_2_5_5 + 0.00338624338624337*G0_0_0_3_0_0 + 0.00338624338624336*G0_0_0_3_0_1 - 0.00507936507936504*G0_0_0_3_0_2 - 0.0118518518518518*G0_0_0_3_0_3 - 0.0118518518518518*G0_0_0_3_0_4 - 0.00338624338624337*G0_0_0_3_0_5 + 0.00338624338624336*G0_0_0_3_1_0 - 0.00507936507936504*G0_0_0_3_1_2 - 0.0253968253968253*G0_0_0_3_1_3 - 0.0152380952380952*G0_0_0_3_1_4 - 0.00846560846560842*G0_0_0_3_1_5 - 0.00507936507936504*G0_0_0_3_2_0 - 0.00507936507936504*G0_0_0_3_2_1 + 0.0338624338624336*G0_0_0_3_2_2 + 0.0338624338624336*G0_0_0_3_2_3 + 0.0169312169312168*G0_0_0_3_2_4 + 0.0016931216931217*G0_0_0_3_2_5 - 0.0118518518518518*G0_0_0_3_3_0 - 0.0253968253968253*G0_0_0_3_3_1 + 0.0338624338624336*G0_0_0_3_3_2 + 0.0812698412698408*G0_0_0_3_3_3 + 0.0541798941798939*G0_0_0_3_3_4 + 0.0203174603174602*G0_0_0_3_3_5 - 0.0118518518518518*G0_0_0_3_4_0 - 0.0152380952380952*G0_0_0_3_4_1 + 0.0169312169312168*G0_0_0_3_4_2 + 0.0541798941798939*G0_0_0_3_4_3 + 0.0812698412698408*G0_0_0_3_4_4 + 0.027089947089947*G0_0_0_3_4_5 - 0.00338624338624337*G0_0_0_3_5_0 - 0.00846560846560843*G0_0_0_3_5_1 + 0.0016931216931217*G0_0_0_3_5_2 + 0.0203174603174602*G0_0_0_3_5_3 + 0.027089947089947*G0_0_0_3_5_4 + 0.0135449735449735*G0_0_0_3_5_5 + 0.0126984126984126*G0_0_0_4_0_0 + 0.00253968253968252*G0_0_0_4_0_1 - 0.0118518518518518*G0_0_0_4_0_2 - 0.0118518518518518*G0_0_0_4_0_3 - 0.0152380952380951*G0_0_0_4_0_4 - 0.00169312169312168*G0_0_0_4_0_5 + 0.00253968253968252*G0_0_0_4_1_0 + 0.00423280423280421*G0_0_0_4_1_1 - 0.00338624338624336*G0_0_0_4_1_2 - 0.0152380952380952*G0_0_0_4_1_3 - 0.0287830687830686*G0_0_0_4_1_4 - 0.0101587301587301*G0_0_0_4_1_5 - 0.0118518518518518*G0_0_0_4_2_0 - 0.00338624338624336*G0_0_0_4_2_1 + 0.042328042328042*G0_0_0_4_2_2 + 0.0169312169312168*G0_0_0_4_2_3 + 0.0338624338624337*G0_0_0_4_2_4 - 0.00169312169312168*G0_0_0_4_2_5 - 0.0118518518518518*G0_0_0_4_3_0 - 0.0152380952380952*G0_0_0_4_3_1 + 0.0169312169312168*G0_0_0_4_3_2 + 0.0541798941798939*G0_0_0_4_3_3 + 0.0812698412698408*G0_0_0_4_3_4 + 0.027089947089947*G0_0_0_4_3_5 - 0.0152380952380951*G0_0_0_4_4_0 - 0.0287830687830686*G0_0_0_4_4_1 + 0.0338624338624336*G0_0_0_4_4_2 + 0.0812698412698408*G0_0_0_4_4_3 + 0.325079365079363*G0_0_0_4_4_4 + 0.0609523809523807*G0_0_0_4_4_5 - 0.00169312169312168*G0_0_0_4_5_0 - 0.0101587301587301*G0_0_0_4_5_1 - 0.00169312169312168*G0_0_0_4_5_2 + 0.027089947089947*G0_0_0_4_5_3 + 0.0609523809523807*G0_0_0_4_5_4 + 0.027089947089947*G0_0_0_4_5_5 + 0.00423280423280421*G0_0_0_5_0_0 + 0.00084656084656084*G0_0_0_5_0_1 - 0.00169312169312169*G0_0_0_5_0_2 - 0.00338624338624337*G0_0_0_5_0_3 - 0.00169312169312168*G0_0_0_5_0_4 + 0.00169312169312167*G0_0_0_5_0_5 + 0.00084656084656084*G0_0_0_5_1_0 + 0.00084656084656084*G0_0_0_5_1_2 - 0.00846560846560843*G0_0_0_5_1_3 - 0.0101587301587301*G0_0_0_5_1_4 - 0.00846560846560841*G0_0_0_5_1_5 - 0.00169312169312169*G0_0_0_5_2_0 + 0.00084656084656084*G0_0_0_5_2_1 + 0.00423280423280423*G0_0_0_5_2_2 + 0.0016931216931217*G0_0_0_5_2_3 - 0.00169312169312168*G0_0_0_5_2_4 - 0.00338624338624337*G0_0_0_5_2_5 - 0.00338624338624337*G0_0_0_5_3_0 - 0.00846560846560842*G0_0_0_5_3_1 + 0.0016931216931217*G0_0_0_5_3_2 + 0.0203174603174602*G0_0_0_5_3_3 + 0.027089947089947*G0_0_0_5_3_4 + 0.0135449735449735*G0_0_0_5_3_5 - 0.00169312169312168*G0_0_0_5_4_0 - 0.0101587301587301*G0_0_0_5_4_1 - 0.00169312169312168*G0_0_0_5_4_2 + 0.027089947089947*G0_0_0_5_4_3 + 0.0609523809523807*G0_0_0_5_4_4 + 0.027089947089947*G0_0_0_5_4_5 + 0.00169312169312167*G0_0_0_5_5_0 - 0.00846560846560841*G0_0_0_5_5_1 - 0.00338624338624337*G0_0_0_5_5_2 + 0.0135449735449735*G0_0_0_5_5_3 + 0.027089947089947*G0_0_0_5_5_4 + 0.0203174603174602*G0_0_0_5_5_5 + 0.00634920634920631*G0_0_1_0_0_0 - 0.00253968253968252*G0_0_1_0_0_1 - 0.000423280423280422*G0_0_1_0_0_2 + 0.000846560846560842*G0_0_1_0_0_3 + 0.00423280423280421*G0_0_1_0_0_4 + 0.00423280423280421*G0_0_1_0_0_5 - 0.00253968253968252*G0_0_1_0_1_0 + 0.0063492063492063*G0_0_1_0_1_1 - 0.00042328042328042*G0_0_1_0_1_2 + 0.0042328042328042*G0_0_1_0_1_3 + 0.00084656084656084*G0_0_1_0_1_4 + 0.0042328042328042*G0_0_1_0_1_5 - 0.000423280423280422*G0_0_1_0_2_0 - 0.00042328042328042*G0_0_1_0_2_1 - 0.000423280423280416*G0_0_1_0_2_2 - 0.00169312169312168*G0_0_1_0_2_3 - 0.00169312169312168*G0_0_1_0_2_4 - 0.00169312169312168*G0_0_1_0_2_5 + 0.000846560846560842*G0_0_1_0_3_0 + 0.0042328042328042*G0_0_1_0_3_1 - 0.00169312169312168*G0_0_1_0_3_2 - 0.00169312169312169*G0_0_1_0_3_3 - 0.00338624338624336*G0_0_1_0_3_4 + 0.00169312169312168*G0_0_1_0_3_5 + 0.00423280423280421*G0_0_1_0_4_0 + 0.00084656084656084*G0_0_1_0_4_1 - 0.00169312169312168*G0_0_1_0_4_2 - 0.00338624338624336*G0_0_1_0_4_3 - 0.00169312169312167*G0_0_1_0_4_4 + 0.00169312169312168*G0_0_1_0_4_5 + 0.00423280423280421*G0_0_1_0_5_0 + 0.0042328042328042*G0_0_1_0_5_1 - 0.00169312169312168*G0_0_1_0_5_2 + 0.00169312169312168*G0_0_1_0_5_3 + 0.00169312169312168*G0_0_1_0_5_4 + 0.0152380952380951*G0_0_1_0_5_5 - 0.00253968253968252*G0_0_1_1_0_0 + 0.0063492063492063*G0_0_1_1_0_1 - 0.00042328042328042*G0_0_1_1_0_2 + 0.0042328042328042*G0_0_1_1_0_3 + 0.00084656084656084*G0_0_1_1_0_4 + 0.0042328042328042*G0_0_1_1_0_5 + 0.0063492063492063*G0_0_1_1_1_0 - 0.0761904761904757*G0_0_1_1_1_1 + 0.00634920634920631*G0_0_1_1_1_2 - 0.0253968253968252*G0_0_1_1_1_3 - 0.0253968253968252*G0_0_1_1_1_5 - 0.00042328042328042*G0_0_1_1_2_0 + 0.00634920634920631*G0_0_1_1_2_1 - 0.00253968253968252*G0_0_1_1_2_2 + 0.00423280423280421*G0_0_1_1_2_3 + 0.000846560846560844*G0_0_1_1_2_4 + 0.00423280423280421*G0_0_1_1_2_5 + 0.0042328042328042*G0_0_1_1_3_0 - 0.0253968253968252*G0_0_1_1_3_1 + 0.00423280423280422*G0_0_1_1_3_2 - 0.0338624338624337*G0_0_1_1_3_3 - 0.00846560846560842*G0_0_1_1_3_4 - 0.0169312169312168*G0_0_1_1_3_5 + 0.00084656084656084*G0_0_1_1_4_0 + 0.000846560846560844*G0_0_1_1_4_2 - 0.00846560846560842*G0_0_1_1_4_3 - 0.0101587301587301*G0_0_1_1_4_4 - 0.00846560846560842*G0_0_1_1_4_5 + 0.0042328042328042*G0_0_1_1_5_0 - 0.0253968253968252*G0_0_1_1_5_1 + 0.00423280423280421*G0_0_1_1_5_2 - 0.0169312169312168*G0_0_1_1_5_3 - 0.00846560846560842*G0_0_1_1_5_4 - 0.0338624338624336*G0_0_1_1_5_5 - 0.000423280423280422*G0_0_1_2_0_0 - 0.00042328042328042*G0_0_1_2_0_1 - 0.000423280423280416*G0_0_1_2_0_2 - 0.00169312169312168*G0_0_1_2_0_3 - 0.00169312169312168*G0_0_1_2_0_4 - 0.00169312169312168*G0_0_1_2_0_5 - 0.00042328042328042*G0_0_1_2_1_0 + 0.00634920634920631*G0_0_1_2_1_1 - 0.00253968253968252*G0_0_1_2_1_2 + 0.00423280423280422*G0_0_1_2_1_3 + 0.000846560846560844*G0_0_1_2_1_4 + 0.00423280423280421*G0_0_1_2_1_5 - 0.000423280423280416*G0_0_1_2_2_0 - 0.00253968253968252*G0_0_1_2_2_1 + 0.00634920634920627*G0_0_1_2_2_2 + 0.00423280423280419*G0_0_1_2_2_3 + 0.00423280423280419*G0_0_1_2_2_4 + 0.000846560846560844*G0_0_1_2_2_5 - 0.00169312169312168*G0_0_1_2_3_0 + 0.00423280423280422*G0_0_1_2_3_1 + 0.00423280423280419*G0_0_1_2_3_2 + 0.0152380952380951*G0_0_1_2_3_3 + 0.00169312169312168*G0_0_1_2_3_4 + 0.00169312169312169*G0_0_1_2_3_5 - 0.00169312169312168*G0_0_1_2_4_0 + 0.000846560846560844*G0_0_1_2_4_1 + 0.00423280423280419*G0_0_1_2_4_2 + 0.00169312169312168*G0_0_1_2_4_3 - 0.0016931216931217*G0_0_1_2_4_4 - 0.00338624338624337*G0_0_1_2_4_5 - 0.00169312169312168*G0_0_1_2_5_0 + 0.00423280423280421*G0_0_1_2_5_1 + 0.000846560846560844*G0_0_1_2_5_2 + 0.00169312169312169*G0_0_1_2_5_3 - 0.00338624338624337*G0_0_1_2_5_4 - 0.00169312169312168*G0_0_1_2_5_5 + 0.000846560846560842*G0_0_1_3_0_0 + 0.0042328042328042*G0_0_1_3_0_1 - 0.00169312169312168*G0_0_1_3_0_2 - 0.00169312169312169*G0_0_1_3_0_3 - 0.00338624338624337*G0_0_1_3_0_4 + 0.00169312169312168*G0_0_1_3_0_5 + 0.0042328042328042*G0_0_1_3_1_0 - 0.0253968253968252*G0_0_1_3_1_1 + 0.00423280423280421*G0_0_1_3_1_2 - 0.0338624338624337*G0_0_1_3_1_3 - 0.00846560846560842*G0_0_1_3_1_4 - 0.0169312169312168*G0_0_1_3_1_5 - 0.00169312169312168*G0_0_1_3_2_0 + 0.00423280423280421*G0_0_1_3_2_1 + 0.00423280423280419*G0_0_1_3_2_2 + 0.0152380952380951*G0_0_1_3_2_3 + 0.00169312169312168*G0_0_1_3_2_4 + 0.00169312169312169*G0_0_1_3_2_5 - 0.00169312169312169*G0_0_1_3_3_0 - 0.0338624338624337*G0_0_1_3_3_1 + 0.0152380952380951*G0_0_1_3_3_2 + 0.0203174603174602*G0_0_1_3_3_4 - 0.00338624338624337*G0_0_1_3_4_0 - 0.00846560846560842*G0_0_1_3_4_1 + 0.00169312169312168*G0_0_1_3_4_2 + 0.0203174603174602*G0_0_1_3_4_3 + 0.0270899470899469*G0_0_1_3_4_4 + 0.0135449735449735*G0_0_1_3_4_5 + 0.00169312169312168*G0_0_1_3_5_0 - 0.0169312169312168*G0_0_1_3_5_1 + 0.00169312169312169*G0_0_1_3_5_2 + 0.0135449735449735*G0_0_1_3_5_4 + 0.00423280423280421*G0_0_1_4_0_0 + 0.00084656084656084*G0_0_1_4_0_1 - 0.00169312169312168*G0_0_1_4_0_2 - 0.00338624338624337*G0_0_1_4_0_3 - 0.00169312169312167*G0_0_1_4_0_4 + 0.00169312169312168*G0_0_1_4_0_5 + 0.00084656084656084*G0_0_1_4_1_0 + 0.000846560846560844*G0_0_1_4_1_2 - 0.00846560846560842*G0_0_1_4_1_3 - 0.0101587301587301*G0_0_1_4_1_4 - 0.00846560846560842*G0_0_1_4_1_5 - 0.00169312169312168*G0_0_1_4_2_0 + 0.000846560846560844*G0_0_1_4_2_1 + 0.00423280423280419*G0_0_1_4_2_2 + 0.00169312169312168*G0_0_1_4_2_3 - 0.0016931216931217*G0_0_1_4_2_4 - 0.00338624338624337*G0_0_1_4_2_5 - 0.00338624338624336*G0_0_1_4_3_0 - 0.00846560846560842*G0_0_1_4_3_1 + 0.00169312169312168*G0_0_1_4_3_2 + 0.0203174603174602*G0_0_1_4_3_3 + 0.0270899470899469*G0_0_1_4_3_4 + 0.0135449735449735*G0_0_1_4_3_5 - 0.00169312169312167*G0_0_1_4_4_0 - 0.0101587301587301*G0_0_1_4_4_1 - 0.0016931216931217*G0_0_1_4_4_2 + 0.0270899470899469*G0_0_1_4_4_3 + 0.0609523809523806*G0_0_1_4_4_4 + 0.027089947089947*G0_0_1_4_4_5 + 0.00169312169312168*G0_0_1_4_5_0 - 0.00846560846560842*G0_0_1_4_5_1 - 0.00338624338624337*G0_0_1_4_5_2 + 0.0135449735449735*G0_0_1_4_5_3 + 0.027089947089947*G0_0_1_4_5_4 + 0.0203174603174602*G0_0_1_4_5_5 + 0.00423280423280421*G0_0_1_5_0_0 + 0.0042328042328042*G0_0_1_5_0_1 - 0.00169312169312168*G0_0_1_5_0_2 + 0.00169312169312168*G0_0_1_5_0_3 + 0.00169312169312168*G0_0_1_5_0_4 + 0.0152380952380951*G0_0_1_5_0_5 + 0.0042328042328042*G0_0_1_5_1_0 - 0.0253968253968252*G0_0_1_5_1_1 + 0.00423280423280421*G0_0_1_5_1_2 - 0.0169312169312168*G0_0_1_5_1_3 - 0.00846560846560842*G0_0_1_5_1_4 - 0.0338624338624336*G0_0_1_5_1_5 - 0.00169312169312168*G0_0_1_5_2_0 + 0.00423280423280421*G0_0_1_5_2_1 + 0.000846560846560844*G0_0_1_5_2_2 + 0.00169312169312169*G0_0_1_5_2_3 - 0.00338624338624337*G0_0_1_5_2_4 - 0.00169312169312168*G0_0_1_5_2_5 + 0.00169312169312168*G0_0_1_5_3_0 - 0.0169312169312168*G0_0_1_5_3_1 + 0.00169312169312169*G0_0_1_5_3_2 + 0.0135449735449735*G0_0_1_5_3_4 + 0.00169312169312168*G0_0_1_5_4_0 - 0.00846560846560842*G0_0_1_5_4_1 - 0.00338624338624337*G0_0_1_5_4_2 + 0.0135449735449735*G0_0_1_5_4_3 + 0.027089947089947*G0_0_1_5_4_4 + 0.0203174603174602*G0_0_1_5_4_5 + 0.0152380952380951*G0_0_1_5_5_0 - 0.0338624338624336*G0_0_1_5_5_1 - 0.00169312169312168*G0_0_1_5_5_2 + 0.0203174603174602*G0_0_1_5_5_4; + A[0] = A[7] + 0.0412698412698411*G0_0_0_0_0_0 - 0.00444444444444442*G0_0_0_0_0_1 - 0.00338624338624337*G0_0_0_0_0_2 + 0.000423280423280427*G0_0_0_0_0_3 + 0.0148148148148147*G0_0_0_0_0_4 + 0.0148148148148147*G0_0_0_0_0_5 - 0.00444444444444442*G0_0_0_0_1_0 + 0.00444444444444441*G0_0_0_0_1_1 + 0.00169312169312168*G0_0_0_0_1_3 - 0.00169312169312169*G0_0_0_0_1_4 - 0.00338624338624337*G0_0_0_0_2_0 + 0.00105820105820105*G0_0_0_0_2_2 - 0.00126984126984126*G0_0_0_0_2_3 - 0.00296296296296295*G0_0_0_0_2_4 - 0.00296296296296295*G0_0_0_0_2_5 + 0.000423280423280427*G0_0_0_0_3_0 + 0.00169312169312168*G0_0_0_0_3_1 - 0.00126984126984126*G0_0_0_0_3_2 + 0.00423280423280421*G0_0_0_0_3_3 + 0.00253968253968253*G0_0_0_0_3_4 + 0.00507936507936505*G0_0_0_0_3_5 + 0.0148148148148147*G0_0_0_0_4_0 - 0.00169312169312169*G0_0_0_0_4_1 - 0.00296296296296295*G0_0_0_0_4_2 + 0.00253968253968253*G0_0_0_0_4_3 + 0.016084656084656*G0_0_0_0_4_4 + 0.00931216931216927*G0_0_0_0_4_5 + 0.0148148148148147*G0_0_0_0_5_0 - 0.00296296296296295*G0_0_0_0_5_2 + 0.00507936507936505*G0_0_0_0_5_3 + 0.00931216931216927*G0_0_0_0_5_4 + 0.0245502645502644*G0_0_0_0_5_5 - 0.00444444444444442*G0_0_0_1_0_0 + 0.00444444444444441*G0_0_0_1_0_1 + 0.00169312169312168*G0_0_0_1_0_3 - 0.00169312169312169*G0_0_0_1_0_4 + 0.00444444444444441*G0_0_0_1_1_0 - 0.041269841269841*G0_0_0_1_1_1 + 0.00338624338624337*G0_0_0_1_1_2 - 0.0148148148148147*G0_0_0_1_1_3 - 0.000423280423280422*G0_0_0_1_1_4 - 0.0148148148148147*G0_0_0_1_1_5 + 0.00338624338624337*G0_0_0_1_2_1 - 0.00105820105820105*G0_0_0_1_2_2 + 0.00296296296296295*G0_0_0_1_2_3 + 0.00126984126984126*G0_0_0_1_2_4 + 0.00296296296296295*G0_0_0_1_2_5 + 0.00169312169312168*G0_0_0_1_3_0 - 0.0148148148148147*G0_0_0_1_3_1 + 0.00296296296296295*G0_0_0_1_3_2 - 0.016084656084656*G0_0_0_1_3_3 - 0.00253968253968253*G0_0_0_1_3_4 - 0.00931216931216926*G0_0_0_1_3_5 - 0.00169312169312169*G0_0_0_1_4_0 - 0.000423280423280422*G0_0_0_1_4_1 + 0.00126984126984126*G0_0_0_1_4_2 - 0.00253968253968253*G0_0_0_1_4_3 - 0.00423280423280421*G0_0_0_1_4_4 - 0.00507936507936505*G0_0_0_1_4_5 - 0.0148148148148147*G0_0_0_1_5_1 + 0.00296296296296295*G0_0_0_1_5_2 - 0.00931216931216926*G0_0_0_1_5_3 - 0.00507936507936506*G0_0_0_1_5_4 - 0.0245502645502644*G0_0_0_1_5_5 - 0.00338624338624337*G0_0_0_2_0_0 + 0.00105820105820105*G0_0_0_2_0_2 - 0.00126984126984126*G0_0_0_2_0_3 - 0.00296296296296295*G0_0_0_2_0_4 - 0.00296296296296295*G0_0_0_2_0_5 + 0.00338624338624337*G0_0_0_2_1_1 - 0.00105820105820105*G0_0_0_2_1_2 + 0.00296296296296295*G0_0_0_2_1_3 + 0.00126984126984126*G0_0_0_2_1_4 + 0.00296296296296295*G0_0_0_2_1_5 + 0.00105820105820105*G0_0_0_2_2_0 - 0.00105820105820105*G0_0_0_2_2_1 - 0.00126984126984126*G0_0_0_2_3_0 + 0.00296296296296295*G0_0_0_2_3_1 + 0.00846560846560843*G0_0_0_2_3_3 + 0.00253968253968253*G0_0_0_2_3_5 - 0.00296296296296295*G0_0_0_2_4_0 + 0.00126984126984126*G0_0_0_2_4_1 - 0.00846560846560843*G0_0_0_2_4_4 - 0.00253968253968253*G0_0_0_2_4_5 - 0.00296296296296295*G0_0_0_2_5_0 + 0.00296296296296295*G0_0_0_2_5_1 + 0.00253968253968253*G0_0_0_2_5_3 - 0.00253968253968253*G0_0_0_2_5_4 + 0.000423280423280427*G0_0_0_3_0_0 + 0.00169312169312168*G0_0_0_3_0_1 - 0.00126984126984126*G0_0_0_3_0_2 + 0.00423280423280421*G0_0_0_3_0_3 + 0.00253968253968253*G0_0_0_3_0_4 + 0.00507936507936505*G0_0_0_3_0_5 + 0.00169312169312168*G0_0_0_3_1_0 - 0.0148148148148147*G0_0_0_3_1_1 + 0.00296296296296295*G0_0_0_3_1_2 - 0.016084656084656*G0_0_0_3_1_3 - 0.00253968253968253*G0_0_0_3_1_4 - 0.00931216931216926*G0_0_0_3_1_5 - 0.00126984126984126*G0_0_0_3_2_0 + 0.00296296296296295*G0_0_0_3_2_1 + 0.00846560846560843*G0_0_0_3_2_3 + 0.00253968253968253*G0_0_0_3_2_5 + 0.00423280423280421*G0_0_0_3_3_0 - 0.016084656084656*G0_0_0_3_3_1 + 0.00846560846560843*G0_0_0_3_3_2 - 0.0304761904761903*G0_0_0_3_3_3 - 0.00338624338624338*G0_0_0_3_3_4 - 0.0135449735449735*G0_0_0_3_3_5 + 0.00253968253968253*G0_0_0_3_4_0 - 0.00253968253968253*G0_0_0_3_4_1 - 0.00338624338624338*G0_0_0_3_4_3 + 0.00338624338624337*G0_0_0_3_4_4 + 0.00507936507936505*G0_0_0_3_5_0 - 0.00931216931216926*G0_0_0_3_5_1 + 0.00253968253968253*G0_0_0_3_5_2 - 0.0135449735449735*G0_0_0_3_5_3 - 0.0101587301587301*G0_0_0_3_5_5 + 0.0148148148148148*G0_0_0_4_0_0 - 0.00169312169312169*G0_0_0_4_0_1 - 0.00296296296296295*G0_0_0_4_0_2 + 0.00253968253968253*G0_0_0_4_0_3 + 0.016084656084656*G0_0_0_4_0_4 + 0.00931216931216927*G0_0_0_4_0_5 - 0.00169312169312169*G0_0_0_4_1_0 - 0.000423280423280422*G0_0_0_4_1_1 + 0.00126984126984126*G0_0_0_4_1_2 - 0.00253968253968253*G0_0_0_4_1_3 - 0.00423280423280421*G0_0_0_4_1_4 - 0.00507936507936505*G0_0_0_4_1_5 - 0.00296296296296295*G0_0_0_4_2_0 + 0.00126984126984126*G0_0_0_4_2_1 - 0.00846560846560843*G0_0_0_4_2_4 - 0.00253968253968253*G0_0_0_4_2_5 + 0.00253968253968253*G0_0_0_4_3_0 - 0.00253968253968253*G0_0_0_4_3_1 - 0.00338624338624338*G0_0_0_4_3_3 + 0.00338624338624337*G0_0_0_4_3_4 + 0.016084656084656*G0_0_0_4_4_0 - 0.00423280423280421*G0_0_0_4_4_1 - 0.00846560846560843*G0_0_0_4_4_2 + 0.00338624338624337*G0_0_0_4_4_3 + 0.0304761904761903*G0_0_0_4_4_4 + 0.0135449735449735*G0_0_0_4_4_5 + 0.00931216931216927*G0_0_0_4_5_0 - 0.00507936507936505*G0_0_0_4_5_1 - 0.00253968253968253*G0_0_0_4_5_2 + 0.0135449735449735*G0_0_0_4_5_4 + 0.0101587301587301*G0_0_0_4_5_5 + 0.0148148148148147*G0_0_0_5_0_0 - 0.00296296296296295*G0_0_0_5_0_2 + 0.00507936507936505*G0_0_0_5_0_3 + 0.00931216931216927*G0_0_0_5_0_4 + 0.0245502645502644*G0_0_0_5_0_5 - 0.0148148148148147*G0_0_0_5_1_1 + 0.00296296296296295*G0_0_0_5_1_2 - 0.00931216931216926*G0_0_0_5_1_3 - 0.00507936507936506*G0_0_0_5_1_4 - 0.0245502645502644*G0_0_0_5_1_5 - 0.00296296296296295*G0_0_0_5_2_0 + 0.00296296296296295*G0_0_0_5_2_1 + 0.00253968253968253*G0_0_0_5_2_3 - 0.00253968253968253*G0_0_0_5_2_4 + 0.00507936507936505*G0_0_0_5_3_0 - 0.00931216931216926*G0_0_0_5_3_1 + 0.00253968253968253*G0_0_0_5_3_2 - 0.0135449735449735*G0_0_0_5_3_3 - 0.0101587301587301*G0_0_0_5_3_5 + 0.00931216931216927*G0_0_0_5_4_0 - 0.00507936507936506*G0_0_0_5_4_1 - 0.00253968253968253*G0_0_0_5_4_2 + 0.0135449735449735*G0_0_0_5_4_4 + 0.0101587301587301*G0_0_0_5_4_5 + 0.0245502645502644*G0_0_0_5_5_0 - 0.0245502645502644*G0_0_0_5_5_1 - 0.0101587301587301*G0_0_0_5_5_3 + 0.0101587301587301*G0_0_0_5_5_4 + 0.045238095238095*G0_0_1_0_0_0 - 0.00396825396825395*G0_0_1_0_0_1 - 0.00396825396825395*G0_0_1_0_0_2 + 0.00158730158730158*G0_0_1_0_0_3 + 0.0174603174603174*G0_0_1_0_0_4 + 0.0174603174603174*G0_0_1_0_0_5 - 0.00396825396825395*G0_0_1_0_1_0 + 0.000476190476190475*G0_0_1_0_1_1 + 0.000608465608465606*G0_0_1_0_1_2 - 0.000423280423280421*G0_0_1_0_1_3 - 0.00211640211640211*G0_0_1_0_1_4 - 0.00370370370370368*G0_0_1_0_1_5 - 0.00396825396825395*G0_0_1_0_2_0 + 0.000608465608465606*G0_0_1_0_2_1 + 0.000476190476190475*G0_0_1_0_2_2 - 0.000423280423280422*G0_0_1_0_2_3 - 0.00370370370370369*G0_0_1_0_2_4 - 0.00211640211640211*G0_0_1_0_2_5 + 0.00158730158730158*G0_0_1_0_3_0 - 0.000423280423280422*G0_0_1_0_3_1 - 0.000423280423280422*G0_0_1_0_3_2 - 0.00126984126984126*G0_0_1_0_3_3 + 0.00105820105820106*G0_0_1_0_3_4 + 0.00105820105820105*G0_0_1_0_3_5 + 0.0174603174603174*G0_0_1_0_4_0 - 0.00211640211640211*G0_0_1_0_4_1 - 0.00370370370370369*G0_0_1_0_4_2 + 0.00105820105820106*G0_0_1_0_4_3 + 0.0169312169312169*G0_0_1_0_4_4 + 0.00846560846560843*G0_0_1_0_4_5 + 0.0174603174603174*G0_0_1_0_5_0 - 0.00370370370370368*G0_0_1_0_5_1 - 0.00211640211640211*G0_0_1_0_5_2 + 0.00105820105820105*G0_0_1_0_5_3 + 0.00846560846560843*G0_0_1_0_5_4 + 0.0169312169312168*G0_0_1_0_5_5 - 0.00396825396825395*G0_0_1_1_0_0 + 0.000476190476190475*G0_0_1_1_0_1 + 0.000608465608465606*G0_0_1_1_0_2 - 0.000423280423280422*G0_0_1_1_0_3 - 0.00211640211640211*G0_0_1_1_0_4 - 0.00370370370370368*G0_0_1_1_0_5 + 0.000476190476190475*G0_0_1_1_1_0 + 0.00396825396825394*G0_0_1_1_1_1 - 0.000582010582010579*G0_0_1_1_1_2 + 0.00264550264550263*G0_0_1_1_1_3 + 0.00116402116402116*G0_0_1_1_1_4 + 0.00264550264550263*G0_0_1_1_1_5 + 0.000608465608465606*G0_0_1_1_2_0 - 0.000582010582010579*G0_0_1_1_2_1 - 0.000582010582010579*G0_0_1_1_2_2 - 0.000740740740740737*G0_0_1_1_2_3 + 0.000846560846560843*G0_0_1_1_2_4 + 0.000846560846560842*G0_0_1_1_2_5 - 0.000423280423280422*G0_0_1_1_3_0 + 0.00264550264550263*G0_0_1_1_3_1 - 0.000740740740740737*G0_0_1_1_3_2 + 0.000846560846560842*G0_0_1_1_3_3 - 0.00148148148148147*G0_0_1_1_3_4 - 0.000846560846560843*G0_0_1_1_3_5 - 0.00211640211640211*G0_0_1_1_4_0 + 0.00116402116402116*G0_0_1_1_4_1 + 0.000846560846560843*G0_0_1_1_4_2 - 0.00148148148148147*G0_0_1_1_4_3 - 0.00550264550264548*G0_0_1_1_4_4 - 0.004021164021164*G0_0_1_1_4_5 - 0.00370370370370368*G0_0_1_1_5_0 + 0.00264550264550263*G0_0_1_1_5_1 + 0.000846560846560842*G0_0_1_1_5_2 - 0.000846560846560843*G0_0_1_1_5_3 - 0.004021164021164*G0_0_1_1_5_4 - 0.00761904761904757*G0_0_1_1_5_5 - 0.00396825396825395*G0_0_1_2_0_0 + 0.000608465608465606*G0_0_1_2_0_1 + 0.000476190476190475*G0_0_1_2_0_2 - 0.000423280423280422*G0_0_1_2_0_3 - 0.00370370370370369*G0_0_1_2_0_4 - 0.00211640211640211*G0_0_1_2_0_5 + 0.000608465608465606*G0_0_1_2_1_0 - 0.000582010582010579*G0_0_1_2_1_1 - 0.000582010582010579*G0_0_1_2_1_2 - 0.000740740740740737*G0_0_1_2_1_3 + 0.000846560846560843*G0_0_1_2_1_4 + 0.000846560846560842*G0_0_1_2_1_5 + 0.000476190476190475*G0_0_1_2_2_0 - 0.000582010582010579*G0_0_1_2_2_1 + 0.00396825396825395*G0_0_1_2_2_2 + 0.00264550264550263*G0_0_1_2_2_3 + 0.00264550264550263*G0_0_1_2_2_4 + 0.00116402116402116*G0_0_1_2_2_5 - 0.000423280423280422*G0_0_1_2_3_0 - 0.000740740740740737*G0_0_1_2_3_1 + 0.00264550264550263*G0_0_1_2_3_2 + 0.000846560846560843*G0_0_1_2_3_3 - 0.000846560846560843*G0_0_1_2_3_4 - 0.00148148148148147*G0_0_1_2_3_5 - 0.00370370370370369*G0_0_1_2_4_0 + 0.000846560846560843*G0_0_1_2_4_1 + 0.00264550264550263*G0_0_1_2_4_2 - 0.000846560846560843*G0_0_1_2_4_3 - 0.00761904761904759*G0_0_1_2_4_4 - 0.00402116402116401*G0_0_1_2_4_5 - 0.00211640211640211*G0_0_1_2_5_0 + 0.000846560846560842*G0_0_1_2_5_1 + 0.00116402116402116*G0_0_1_2_5_2 - 0.00148148148148147*G0_0_1_2_5_3 - 0.00402116402116401*G0_0_1_2_5_4 - 0.00550264550264548*G0_0_1_2_5_5 + 0.00158730158730158*G0_0_1_3_0_0 - 0.000423280423280421*G0_0_1_3_0_1 - 0.000423280423280422*G0_0_1_3_0_2 - 0.00126984126984126*G0_0_1_3_0_3 + 0.00105820105820106*G0_0_1_3_0_4 + 0.00105820105820105*G0_0_1_3_0_5 - 0.000423280423280422*G0_0_1_3_1_0 + 0.00264550264550263*G0_0_1_3_1_1 - 0.000740740740740737*G0_0_1_3_1_2 + 0.000846560846560842*G0_0_1_3_1_3 - 0.00148148148148147*G0_0_1_3_1_4 - 0.000846560846560843*G0_0_1_3_1_5 - 0.000423280423280422*G0_0_1_3_2_0 - 0.000740740740740737*G0_0_1_3_2_1 + 0.00264550264550263*G0_0_1_3_2_2 + 0.000846560846560843*G0_0_1_3_2_3 - 0.000846560846560843*G0_0_1_3_2_4 - 0.00148148148148147*G0_0_1_3_2_5 - 0.00126984126984126*G0_0_1_3_3_0 + 0.000846560846560842*G0_0_1_3_3_1 + 0.000846560846560843*G0_0_1_3_3_2 + 0.0266666666666665*G0_0_1_3_3_3 + 0.00550264550264548*G0_0_1_3_3_4 + 0.00550264550264548*G0_0_1_3_3_5 + 0.00105820105820106*G0_0_1_3_4_0 - 0.00148148148148147*G0_0_1_3_4_1 - 0.000846560846560843*G0_0_1_3_4_2 + 0.00550264550264548*G0_0_1_3_4_3 + 0.00888888888888885*G0_0_1_3_4_4 + 0.0059259259259259*G0_0_1_3_4_5 + 0.00105820105820105*G0_0_1_3_5_0 - 0.000846560846560843*G0_0_1_3_5_1 - 0.00148148148148147*G0_0_1_3_5_2 + 0.00550264550264548*G0_0_1_3_5_3 + 0.0059259259259259*G0_0_1_3_5_4 + 0.00888888888888884*G0_0_1_3_5_5 + 0.0174603174603174*G0_0_1_4_0_0 - 0.00211640211640211*G0_0_1_4_0_1 - 0.00370370370370369*G0_0_1_4_0_2 + 0.00105820105820106*G0_0_1_4_0_3 + 0.0169312169312169*G0_0_1_4_0_4 + 0.00846560846560843*G0_0_1_4_0_5 - 0.00211640211640211*G0_0_1_4_1_0 + 0.00116402116402116*G0_0_1_4_1_1 + 0.000846560846560843*G0_0_1_4_1_2 - 0.00148148148148147*G0_0_1_4_1_3 - 0.00550264550264548*G0_0_1_4_1_4 - 0.004021164021164*G0_0_1_4_1_5 - 0.00370370370370369*G0_0_1_4_2_0 + 0.000846560846560843*G0_0_1_4_2_1 + 0.00264550264550263*G0_0_1_4_2_2 - 0.000846560846560843*G0_0_1_4_2_3 - 0.00761904761904759*G0_0_1_4_2_4 - 0.00402116402116401*G0_0_1_4_2_5 + 0.00105820105820106*G0_0_1_4_3_0 - 0.00148148148148147*G0_0_1_4_3_1 - 0.000846560846560843*G0_0_1_4_3_2 + 0.00550264550264548*G0_0_1_4_3_3 + 0.00888888888888885*G0_0_1_4_3_4 + 0.0059259259259259*G0_0_1_4_3_5 + 0.0169312169312169*G0_0_1_4_4_0 - 0.00550264550264548*G0_0_1_4_4_1 - 0.00761904761904759*G0_0_1_4_4_2 + 0.00888888888888885*G0_0_1_4_4_3 + 0.0571428571428569*G0_0_1_4_4_4 + 0.019047619047619*G0_0_1_4_4_5 + 0.00846560846560843*G0_0_1_4_5_0 - 0.004021164021164*G0_0_1_4_5_1 - 0.00402116402116401*G0_0_1_4_5_2 + 0.0059259259259259*G0_0_1_4_5_3 + 0.019047619047619*G0_0_1_4_5_4 + 0.019047619047619*G0_0_1_4_5_5 + 0.0174603174603174*G0_0_1_5_0_0 - 0.00370370370370368*G0_0_1_5_0_1 - 0.00211640211640211*G0_0_1_5_0_2 + 0.00105820105820105*G0_0_1_5_0_3 + 0.00846560846560843*G0_0_1_5_0_4 + 0.0169312169312168*G0_0_1_5_0_5 - 0.00370370370370368*G0_0_1_5_1_0 + 0.00264550264550263*G0_0_1_5_1_1 + 0.000846560846560842*G0_0_1_5_1_2 - 0.000846560846560843*G0_0_1_5_1_3 - 0.004021164021164*G0_0_1_5_1_4 - 0.00761904761904757*G0_0_1_5_1_5 - 0.00211640211640211*G0_0_1_5_2_0 + 0.000846560846560842*G0_0_1_5_2_1 + 0.00116402116402116*G0_0_1_5_2_2 - 0.00148148148148147*G0_0_1_5_2_3 - 0.00402116402116401*G0_0_1_5_2_4 - 0.00550264550264548*G0_0_1_5_2_5 + 0.00105820105820105*G0_0_1_5_3_0 - 0.000846560846560843*G0_0_1_5_3_1 - 0.00148148148148147*G0_0_1_5_3_2 + 0.00550264550264548*G0_0_1_5_3_3 + 0.0059259259259259*G0_0_1_5_3_4 + 0.00888888888888884*G0_0_1_5_3_5 + 0.00846560846560843*G0_0_1_5_4_0 - 0.004021164021164*G0_0_1_5_4_1 - 0.00402116402116401*G0_0_1_5_4_2 + 0.0059259259259259*G0_0_1_5_4_3 + 0.019047619047619*G0_0_1_5_4_4 + 0.019047619047619*G0_0_1_5_4_5 + 0.0169312169312168*G0_0_1_5_5_0 - 0.00761904761904757*G0_0_1_5_5_1 - 0.00550264550264548*G0_0_1_5_5_2 + 0.00888888888888884*G0_0_1_5_5_3 + 0.019047619047619*G0_0_1_5_5_4 + 0.0571428571428568*G0_0_1_5_5_5 + 0.045238095238095*G0_1_0_0_0_0 - 0.00396825396825395*G0_1_0_0_0_1 - 0.00396825396825395*G0_1_0_0_0_2 + 0.00158730158730158*G0_1_0_0_0_3 + 0.0174603174603174*G0_1_0_0_0_4 + 0.0174603174603174*G0_1_0_0_0_5 - 0.00396825396825395*G0_1_0_0_1_0 + 0.000476190476190475*G0_1_0_0_1_1 + 0.000608465608465606*G0_1_0_0_1_2 - 0.000423280423280421*G0_1_0_0_1_3 - 0.00211640211640211*G0_1_0_0_1_4 - 0.00370370370370368*G0_1_0_0_1_5 - 0.00396825396825395*G0_1_0_0_2_0 + 0.000608465608465606*G0_1_0_0_2_1 + 0.000476190476190475*G0_1_0_0_2_2 - 0.000423280423280422*G0_1_0_0_2_3 - 0.00370370370370369*G0_1_0_0_2_4 - 0.00211640211640211*G0_1_0_0_2_5 + 0.00158730158730158*G0_1_0_0_3_0 - 0.000423280423280421*G0_1_0_0_3_1 - 0.000423280423280422*G0_1_0_0_3_2 - 0.00126984126984126*G0_1_0_0_3_3 + 0.00105820105820106*G0_1_0_0_3_4 + 0.00105820105820105*G0_1_0_0_3_5 + 0.0174603174603174*G0_1_0_0_4_0 - 0.00211640211640211*G0_1_0_0_4_1 - 0.00370370370370369*G0_1_0_0_4_2 + 0.00105820105820106*G0_1_0_0_4_3 + 0.0169312169312169*G0_1_0_0_4_4 + 0.00846560846560843*G0_1_0_0_4_5 + 0.0174603174603174*G0_1_0_0_5_0 - 0.00370370370370368*G0_1_0_0_5_1 - 0.00211640211640211*G0_1_0_0_5_2 + 0.00105820105820105*G0_1_0_0_5_3 + 0.00846560846560843*G0_1_0_0_5_4 + 0.0169312169312168*G0_1_0_0_5_5 - 0.00396825396825395*G0_1_0_1_0_0 + 0.000476190476190475*G0_1_0_1_0_1 + 0.000608465608465606*G0_1_0_1_0_2 - 0.000423280423280421*G0_1_0_1_0_3 - 0.00211640211640211*G0_1_0_1_0_4 - 0.00370370370370368*G0_1_0_1_0_5 + 0.000476190476190475*G0_1_0_1_1_0 + 0.00396825396825394*G0_1_0_1_1_1 - 0.000582010582010579*G0_1_0_1_1_2 + 0.00264550264550263*G0_1_0_1_1_3 + 0.00116402116402116*G0_1_0_1_1_4 + 0.00264550264550263*G0_1_0_1_1_5 + 0.000608465608465606*G0_1_0_1_2_0 - 0.000582010582010579*G0_1_0_1_2_1 - 0.000582010582010579*G0_1_0_1_2_2 - 0.000740740740740737*G0_1_0_1_2_3 + 0.000846560846560843*G0_1_0_1_2_4 + 0.000846560846560842*G0_1_0_1_2_5 - 0.000423280423280421*G0_1_0_1_3_0 + 0.00264550264550263*G0_1_0_1_3_1 - 0.000740740740740737*G0_1_0_1_3_2 + 0.000846560846560842*G0_1_0_1_3_3 - 0.00148148148148147*G0_1_0_1_3_4 - 0.000846560846560843*G0_1_0_1_3_5 - 0.00211640211640211*G0_1_0_1_4_0 + 0.00116402116402116*G0_1_0_1_4_1 + 0.000846560846560843*G0_1_0_1_4_2 - 0.00148148148148147*G0_1_0_1_4_3 - 0.00550264550264548*G0_1_0_1_4_4 - 0.004021164021164*G0_1_0_1_4_5 - 0.00370370370370368*G0_1_0_1_5_0 + 0.00264550264550263*G0_1_0_1_5_1 + 0.000846560846560842*G0_1_0_1_5_2 - 0.000846560846560843*G0_1_0_1_5_3 - 0.004021164021164*G0_1_0_1_5_4 - 0.00761904761904757*G0_1_0_1_5_5 - 0.00396825396825395*G0_1_0_2_0_0 + 0.000608465608465606*G0_1_0_2_0_1 + 0.000476190476190475*G0_1_0_2_0_2 - 0.000423280423280422*G0_1_0_2_0_3 - 0.00370370370370369*G0_1_0_2_0_4 - 0.00211640211640211*G0_1_0_2_0_5 + 0.000608465608465606*G0_1_0_2_1_0 - 0.000582010582010579*G0_1_0_2_1_1 - 0.000582010582010579*G0_1_0_2_1_2 - 0.000740740740740737*G0_1_0_2_1_3 + 0.000846560846560843*G0_1_0_2_1_4 + 0.000846560846560842*G0_1_0_2_1_5 + 0.000476190476190475*G0_1_0_2_2_0 - 0.000582010582010579*G0_1_0_2_2_1 + 0.00396825396825395*G0_1_0_2_2_2 + 0.00264550264550263*G0_1_0_2_2_3 + 0.00264550264550263*G0_1_0_2_2_4 + 0.00116402116402116*G0_1_0_2_2_5 - 0.000423280423280422*G0_1_0_2_3_0 - 0.000740740740740737*G0_1_0_2_3_1 + 0.00264550264550263*G0_1_0_2_3_2 + 0.000846560846560842*G0_1_0_2_3_3 - 0.000846560846560843*G0_1_0_2_3_4 - 0.00148148148148147*G0_1_0_2_3_5 - 0.00370370370370369*G0_1_0_2_4_0 + 0.000846560846560843*G0_1_0_2_4_1 + 0.00264550264550263*G0_1_0_2_4_2 - 0.000846560846560843*G0_1_0_2_4_3 - 0.00761904761904759*G0_1_0_2_4_4 - 0.00402116402116401*G0_1_0_2_4_5 - 0.00211640211640211*G0_1_0_2_5_0 + 0.000846560846560842*G0_1_0_2_5_1 + 0.00116402116402116*G0_1_0_2_5_2 - 0.00148148148148147*G0_1_0_2_5_3 - 0.00402116402116401*G0_1_0_2_5_4 - 0.00550264550264548*G0_1_0_2_5_5 + 0.00158730158730158*G0_1_0_3_0_0 - 0.000423280423280421*G0_1_0_3_0_1 - 0.000423280423280422*G0_1_0_3_0_2 - 0.00126984126984126*G0_1_0_3_0_3 + 0.00105820105820106*G0_1_0_3_0_4 + 0.00105820105820105*G0_1_0_3_0_5 - 0.000423280423280422*G0_1_0_3_1_0 + 0.00264550264550263*G0_1_0_3_1_1 - 0.000740740740740737*G0_1_0_3_1_2 + 0.000846560846560842*G0_1_0_3_1_3 - 0.00148148148148147*G0_1_0_3_1_4 - 0.000846560846560842*G0_1_0_3_1_5 - 0.000423280423280422*G0_1_0_3_2_0 - 0.000740740740740737*G0_1_0_3_2_1 + 0.00264550264550263*G0_1_0_3_2_2 + 0.000846560846560842*G0_1_0_3_2_3 - 0.000846560846560842*G0_1_0_3_2_4 - 0.00148148148148147*G0_1_0_3_2_5 - 0.00126984126984126*G0_1_0_3_3_0 + 0.000846560846560842*G0_1_0_3_3_1 + 0.000846560846560842*G0_1_0_3_3_2 + 0.0266666666666665*G0_1_0_3_3_3 + 0.00550264550264548*G0_1_0_3_3_4 + 0.00550264550264548*G0_1_0_3_3_5 + 0.00105820105820106*G0_1_0_3_4_0 - 0.00148148148148147*G0_1_0_3_4_1 - 0.000846560846560842*G0_1_0_3_4_2 + 0.00550264550264548*G0_1_0_3_4_3 + 0.00888888888888885*G0_1_0_3_4_4 + 0.0059259259259259*G0_1_0_3_4_5 + 0.00105820105820105*G0_1_0_3_5_0 - 0.000846560846560842*G0_1_0_3_5_1 - 0.00148148148148147*G0_1_0_3_5_2 + 0.00550264550264548*G0_1_0_3_5_3 + 0.0059259259259259*G0_1_0_3_5_4 + 0.00888888888888884*G0_1_0_3_5_5 + 0.0174603174603174*G0_1_0_4_0_0 - 0.00211640211640211*G0_1_0_4_0_1 - 0.00370370370370369*G0_1_0_4_0_2 + 0.00105820105820106*G0_1_0_4_0_3 + 0.0169312169312169*G0_1_0_4_0_4 + 0.00846560846560843*G0_1_0_4_0_5 - 0.00211640211640211*G0_1_0_4_1_0 + 0.00116402116402116*G0_1_0_4_1_1 + 0.000846560846560843*G0_1_0_4_1_2 - 0.00148148148148147*G0_1_0_4_1_3 - 0.00550264550264548*G0_1_0_4_1_4 - 0.004021164021164*G0_1_0_4_1_5 - 0.00370370370370369*G0_1_0_4_2_0 + 0.000846560846560843*G0_1_0_4_2_1 + 0.00264550264550263*G0_1_0_4_2_2 - 0.000846560846560843*G0_1_0_4_2_3 - 0.00761904761904759*G0_1_0_4_2_4 - 0.00402116402116401*G0_1_0_4_2_5 + 0.00105820105820106*G0_1_0_4_3_0 - 0.00148148148148147*G0_1_0_4_3_1 - 0.000846560846560843*G0_1_0_4_3_2 + 0.00550264550264548*G0_1_0_4_3_3 + 0.00888888888888885*G0_1_0_4_3_4 + 0.0059259259259259*G0_1_0_4_3_5 + 0.0169312169312169*G0_1_0_4_4_0 - 0.00550264550264548*G0_1_0_4_4_1 - 0.00761904761904759*G0_1_0_4_4_2 + 0.00888888888888885*G0_1_0_4_4_3 + 0.0571428571428569*G0_1_0_4_4_4 + 0.019047619047619*G0_1_0_4_4_5 + 0.00846560846560843*G0_1_0_4_5_0 - 0.004021164021164*G0_1_0_4_5_1 - 0.00402116402116401*G0_1_0_4_5_2 + 0.0059259259259259*G0_1_0_4_5_3 + 0.019047619047619*G0_1_0_4_5_4 + 0.019047619047619*G0_1_0_4_5_5 + 0.0174603174603174*G0_1_0_5_0_0 - 0.00370370370370368*G0_1_0_5_0_1 - 0.00211640211640211*G0_1_0_5_0_2 + 0.00105820105820105*G0_1_0_5_0_3 + 0.00846560846560843*G0_1_0_5_0_4 + 0.0169312169312168*G0_1_0_5_0_5 - 0.00370370370370368*G0_1_0_5_1_0 + 0.00264550264550263*G0_1_0_5_1_1 + 0.000846560846560842*G0_1_0_5_1_2 - 0.000846560846560843*G0_1_0_5_1_3 - 0.004021164021164*G0_1_0_5_1_4 - 0.00761904761904757*G0_1_0_5_1_5 - 0.00211640211640211*G0_1_0_5_2_0 + 0.000846560846560842*G0_1_0_5_2_1 + 0.00116402116402116*G0_1_0_5_2_2 - 0.00148148148148147*G0_1_0_5_2_3 - 0.00402116402116401*G0_1_0_5_2_4 - 0.00550264550264548*G0_1_0_5_2_5 + 0.00105820105820105*G0_1_0_5_3_0 - 0.000846560846560842*G0_1_0_5_3_1 - 0.00148148148148147*G0_1_0_5_3_2 + 0.00550264550264548*G0_1_0_5_3_3 + 0.0059259259259259*G0_1_0_5_3_4 + 0.00888888888888884*G0_1_0_5_3_5 + 0.00846560846560843*G0_1_0_5_4_0 - 0.004021164021164*G0_1_0_5_4_1 - 0.00402116402116401*G0_1_0_5_4_2 + 0.0059259259259259*G0_1_0_5_4_3 + 0.019047619047619*G0_1_0_5_4_4 + 0.019047619047619*G0_1_0_5_4_5 + 0.0169312169312168*G0_1_0_5_5_0 - 0.00761904761904757*G0_1_0_5_5_1 - 0.00550264550264548*G0_1_0_5_5_2 + 0.00888888888888884*G0_1_0_5_5_3 + 0.019047619047619*G0_1_0_5_5_4 + 0.0571428571428568*G0_1_0_5_5_5 + 0.045238095238095*G0_1_1_0_0_0 - 0.00396825396825395*G0_1_1_0_0_1 - 0.00396825396825395*G0_1_1_0_0_2 + 0.00158730158730158*G0_1_1_0_0_3 + 0.0174603174603174*G0_1_1_0_0_4 + 0.0174603174603174*G0_1_1_0_0_5 - 0.00396825396825395*G0_1_1_0_1_0 + 0.000476190476190474*G0_1_1_0_1_1 + 0.000608465608465606*G0_1_1_0_1_2 - 0.000423280423280422*G0_1_1_0_1_3 - 0.00211640211640211*G0_1_1_0_1_4 - 0.00370370370370368*G0_1_1_0_1_5 - 0.00396825396825395*G0_1_1_0_2_0 + 0.000608465608465606*G0_1_1_0_2_1 + 0.000476190476190475*G0_1_1_0_2_2 - 0.000423280423280421*G0_1_1_0_2_3 - 0.00370370370370369*G0_1_1_0_2_4 - 0.00211640211640211*G0_1_1_0_2_5 + 0.00158730158730158*G0_1_1_0_3_0 - 0.000423280423280422*G0_1_1_0_3_1 - 0.000423280423280421*G0_1_1_0_3_2 - 0.00126984126984126*G0_1_1_0_3_3 + 0.00105820105820106*G0_1_1_0_3_4 + 0.00105820105820105*G0_1_1_0_3_5 + 0.0174603174603174*G0_1_1_0_4_0 - 0.00211640211640211*G0_1_1_0_4_1 - 0.00370370370370369*G0_1_1_0_4_2 + 0.00105820105820106*G0_1_1_0_4_3 + 0.0169312169312169*G0_1_1_0_4_4 + 0.00846560846560843*G0_1_1_0_4_5 + 0.0174603174603174*G0_1_1_0_5_0 - 0.00370370370370368*G0_1_1_0_5_1 - 0.00211640211640211*G0_1_1_0_5_2 + 0.00105820105820105*G0_1_1_0_5_3 + 0.00846560846560843*G0_1_1_0_5_4 + 0.0169312169312168*G0_1_1_0_5_5 - 0.00396825396825395*G0_1_1_1_0_0 + 0.000476190476190474*G0_1_1_1_0_1 + 0.000608465608465606*G0_1_1_1_0_2 - 0.000423280423280422*G0_1_1_1_0_3 - 0.00211640211640211*G0_1_1_1_0_4 - 0.00370370370370369*G0_1_1_1_0_5 + 0.000476190476190474*G0_1_1_1_1_0 + 0.00396825396825395*G0_1_1_1_1_1 - 0.00058201058201058*G0_1_1_1_1_2 + 0.00264550264550263*G0_1_1_1_1_3 + 0.00116402116402116*G0_1_1_1_1_4 + 0.00264550264550263*G0_1_1_1_1_5 + 0.000608465608465606*G0_1_1_1_2_0 - 0.00058201058201058*G0_1_1_1_2_1 - 0.000582010582010579*G0_1_1_1_2_2 - 0.000740740740740737*G0_1_1_1_2_3 + 0.000846560846560844*G0_1_1_1_2_4 + 0.000846560846560842*G0_1_1_1_2_5 - 0.000423280423280422*G0_1_1_1_3_0 + 0.00264550264550263*G0_1_1_1_3_1 - 0.000740740740740737*G0_1_1_1_3_2 + 0.000846560846560845*G0_1_1_1_3_3 - 0.00148148148148147*G0_1_1_1_3_4 - 0.000846560846560842*G0_1_1_1_3_5 - 0.00211640211640211*G0_1_1_1_4_0 + 0.00116402116402116*G0_1_1_1_4_1 + 0.000846560846560844*G0_1_1_1_4_2 - 0.00148148148148147*G0_1_1_1_4_3 - 0.00550264550264548*G0_1_1_1_4_4 - 0.004021164021164*G0_1_1_1_4_5 - 0.00370370370370368*G0_1_1_1_5_0 + 0.00264550264550263*G0_1_1_1_5_1 + 0.000846560846560842*G0_1_1_1_5_2 - 0.000846560846560842*G0_1_1_1_5_3 - 0.004021164021164*G0_1_1_1_5_4 - 0.00761904761904757*G0_1_1_1_5_5 - 0.00396825396825395*G0_1_1_2_0_0 + 0.000608465608465606*G0_1_1_2_0_1 + 0.000476190476190475*G0_1_1_2_0_2 - 0.000423280423280422*G0_1_1_2_0_3 - 0.00370370370370369*G0_1_1_2_0_4 - 0.00211640211640211*G0_1_1_2_0_5 + 0.000608465608465606*G0_1_1_2_1_0 - 0.00058201058201058*G0_1_1_2_1_1 - 0.000582010582010579*G0_1_1_2_1_2 - 0.000740740740740737*G0_1_1_2_1_3 + 0.000846560846560844*G0_1_1_2_1_4 + 0.000846560846560842*G0_1_1_2_1_5 + 0.000476190476190475*G0_1_1_2_2_0 - 0.000582010582010579*G0_1_1_2_2_1 + 0.00396825396825395*G0_1_1_2_2_2 + 0.00264550264550263*G0_1_1_2_2_3 + 0.00264550264550263*G0_1_1_2_2_4 + 0.00116402116402116*G0_1_1_2_2_5 - 0.000423280423280421*G0_1_1_2_3_0 - 0.000740740740740737*G0_1_1_2_3_1 + 0.00264550264550263*G0_1_1_2_3_2 + 0.00084656084656084*G0_1_1_2_3_3 - 0.000846560846560844*G0_1_1_2_3_4 - 0.00148148148148147*G0_1_1_2_3_5 - 0.00370370370370369*G0_1_1_2_4_0 + 0.000846560846560844*G0_1_1_2_4_1 + 0.00264550264550263*G0_1_1_2_4_2 - 0.000846560846560844*G0_1_1_2_4_3 - 0.00761904761904759*G0_1_1_2_4_4 - 0.00402116402116401*G0_1_1_2_4_5 - 0.00211640211640211*G0_1_1_2_5_0 + 0.000846560846560842*G0_1_1_2_5_1 + 0.00116402116402116*G0_1_1_2_5_2 - 0.00148148148148147*G0_1_1_2_5_3 - 0.00402116402116401*G0_1_1_2_5_4 - 0.00550264550264548*G0_1_1_2_5_5 + 0.00158730158730158*G0_1_1_3_0_0 - 0.000423280423280422*G0_1_1_3_0_1 - 0.000423280423280421*G0_1_1_3_0_2 - 0.00126984126984126*G0_1_1_3_0_3 + 0.00105820105820106*G0_1_1_3_0_4 + 0.00105820105820105*G0_1_1_3_0_5 - 0.000423280423280422*G0_1_1_3_1_0 + 0.00264550264550263*G0_1_1_3_1_1 - 0.000740740740740737*G0_1_1_3_1_2 + 0.000846560846560845*G0_1_1_3_1_3 - 0.00148148148148147*G0_1_1_3_1_4 - 0.000846560846560842*G0_1_1_3_1_5 - 0.000423280423280421*G0_1_1_3_2_0 - 0.000740740740740737*G0_1_1_3_2_1 + 0.00264550264550263*G0_1_1_3_2_2 + 0.00084656084656084*G0_1_1_3_2_3 - 0.000846560846560844*G0_1_1_3_2_4 - 0.00148148148148147*G0_1_1_3_2_5 - 0.00126984126984126*G0_1_1_3_3_0 + 0.000846560846560845*G0_1_1_3_3_1 + 0.00084656084656084*G0_1_1_3_3_2 + 0.0266666666666665*G0_1_1_3_3_3 + 0.00550264550264548*G0_1_1_3_3_4 + 0.00550264550264548*G0_1_1_3_3_5 + 0.00105820105820106*G0_1_1_3_4_0 - 0.00148148148148147*G0_1_1_3_4_1 - 0.000846560846560844*G0_1_1_3_4_2 + 0.00550264550264548*G0_1_1_3_4_3 + 0.00888888888888886*G0_1_1_3_4_4 + 0.0059259259259259*G0_1_1_3_4_5 + 0.00105820105820105*G0_1_1_3_5_0 - 0.000846560846560842*G0_1_1_3_5_1 - 0.00148148148148147*G0_1_1_3_5_2 + 0.00550264550264548*G0_1_1_3_5_3 + 0.0059259259259259*G0_1_1_3_5_4 + 0.00888888888888884*G0_1_1_3_5_5 + 0.0174603174603174*G0_1_1_4_0_0 - 0.00211640211640211*G0_1_1_4_0_1 - 0.00370370370370369*G0_1_1_4_0_2 + 0.00105820105820106*G0_1_1_4_0_3 + 0.0169312169312169*G0_1_1_4_0_4 + 0.00846560846560843*G0_1_1_4_0_5 - 0.00211640211640211*G0_1_1_4_1_0 + 0.00116402116402116*G0_1_1_4_1_1 + 0.000846560846560844*G0_1_1_4_1_2 - 0.00148148148148147*G0_1_1_4_1_3 - 0.00550264550264548*G0_1_1_4_1_4 - 0.004021164021164*G0_1_1_4_1_5 - 0.00370370370370369*G0_1_1_4_2_0 + 0.000846560846560844*G0_1_1_4_2_1 + 0.00264550264550263*G0_1_1_4_2_2 - 0.000846560846560844*G0_1_1_4_2_3 - 0.00761904761904759*G0_1_1_4_2_4 - 0.00402116402116401*G0_1_1_4_2_5 + 0.00105820105820106*G0_1_1_4_3_0 - 0.00148148148148147*G0_1_1_4_3_1 - 0.000846560846560844*G0_1_1_4_3_2 + 0.00550264550264548*G0_1_1_4_3_3 + 0.00888888888888885*G0_1_1_4_3_4 + 0.0059259259259259*G0_1_1_4_3_5 + 0.0169312169312169*G0_1_1_4_4_0 - 0.00550264550264548*G0_1_1_4_4_1 - 0.00761904761904759*G0_1_1_4_4_2 + 0.00888888888888885*G0_1_1_4_4_3 + 0.0571428571428569*G0_1_1_4_4_4 + 0.019047619047619*G0_1_1_4_4_5 + 0.00846560846560843*G0_1_1_4_5_0 - 0.004021164021164*G0_1_1_4_5_1 - 0.00402116402116401*G0_1_1_4_5_2 + 0.0059259259259259*G0_1_1_4_5_3 + 0.019047619047619*G0_1_1_4_5_4 + 0.019047619047619*G0_1_1_4_5_5 + 0.0174603174603174*G0_1_1_5_0_0 - 0.00370370370370369*G0_1_1_5_0_1 - 0.00211640211640211*G0_1_1_5_0_2 + 0.00105820105820105*G0_1_1_5_0_3 + 0.00846560846560843*G0_1_1_5_0_4 + 0.0169312169312168*G0_1_1_5_0_5 - 0.00370370370370369*G0_1_1_5_1_0 + 0.00264550264550263*G0_1_1_5_1_1 + 0.000846560846560842*G0_1_1_5_1_2 - 0.000846560846560842*G0_1_1_5_1_3 - 0.004021164021164*G0_1_1_5_1_4 - 0.00761904761904757*G0_1_1_5_1_5 - 0.00211640211640211*G0_1_1_5_2_0 + 0.000846560846560842*G0_1_1_5_2_1 + 0.00116402116402116*G0_1_1_5_2_2 - 0.00148148148148147*G0_1_1_5_2_3 - 0.00402116402116401*G0_1_1_5_2_4 - 0.00550264550264548*G0_1_1_5_2_5 + 0.00105820105820105*G0_1_1_5_3_0 - 0.000846560846560842*G0_1_1_5_3_1 - 0.00148148148148147*G0_1_1_5_3_2 + 0.00550264550264548*G0_1_1_5_3_3 + 0.0059259259259259*G0_1_1_5_3_4 + 0.00888888888888884*G0_1_1_5_3_5 + 0.00846560846560843*G0_1_1_5_4_0 - 0.004021164021164*G0_1_1_5_4_1 - 0.00402116402116401*G0_1_1_5_4_2 + 0.0059259259259259*G0_1_1_5_4_3 + 0.019047619047619*G0_1_1_5_4_4 + 0.019047619047619*G0_1_1_5_4_5 + 0.0169312169312168*G0_1_1_5_5_0 - 0.00761904761904757*G0_1_1_5_5_1 - 0.00550264550264548*G0_1_1_5_5_2 + 0.00888888888888884*G0_1_1_5_5_3 + 0.019047619047619*G0_1_1_5_5_4 + 0.0571428571428568*G0_1_1_5_5_5; + A[14] = 0.00396825396825395*G0_1_1_0_0_0 - 0.000582010582010579*G0_1_1_0_0_1 + 0.000476190476190472*G0_1_1_0_0_2 + 0.00116402116402116*G0_1_1_0_0_3 + 0.00264550264550263*G0_1_1_0_0_4 + 0.00264550264550263*G0_1_1_0_0_5 - 0.000582010582010579*G0_1_1_0_1_0 - 0.000582010582010578*G0_1_1_0_1_1 + 0.000608465608465604*G0_1_1_0_1_2 + 0.000846560846560842*G0_1_1_0_1_3 + 0.000846560846560842*G0_1_1_0_1_4 - 0.000740740740740735*G0_1_1_0_1_5 + 0.000476190476190472*G0_1_1_0_2_0 + 0.000608465608465604*G0_1_1_0_2_1 - 0.00396825396825394*G0_1_1_0_2_2 - 0.0021164021164021*G0_1_1_0_2_3 - 0.00370370370370368*G0_1_1_0_2_4 - 0.000423280423280422*G0_1_1_0_2_5 + 0.00116402116402116*G0_1_1_0_3_0 + 0.000846560846560841*G0_1_1_0_3_1 - 0.0021164021164021*G0_1_1_0_3_2 - 0.00550264550264547*G0_1_1_0_3_3 - 0.004021164021164*G0_1_1_0_3_4 - 0.00148148148148147*G0_1_1_0_3_5 + 0.00264550264550263*G0_1_1_0_4_0 + 0.000846560846560842*G0_1_1_0_4_1 - 0.00370370370370368*G0_1_1_0_4_2 - 0.004021164021164*G0_1_1_0_4_3 - 0.00761904761904758*G0_1_1_0_4_4 - 0.000846560846560844*G0_1_1_0_4_5 + 0.00264550264550263*G0_1_1_0_5_0 - 0.000740740740740735*G0_1_1_0_5_1 - 0.000423280423280422*G0_1_1_0_5_2 - 0.00148148148148147*G0_1_1_0_5_3 - 0.000846560846560844*G0_1_1_0_5_4 + 0.000846560846560841*G0_1_1_0_5_5 - 0.000582010582010579*G0_1_1_1_0_0 - 0.000582010582010578*G0_1_1_1_0_1 + 0.000608465608465604*G0_1_1_1_0_2 + 0.000846560846560842*G0_1_1_1_0_3 + 0.000846560846560842*G0_1_1_1_0_4 - 0.000740740740740735*G0_1_1_1_0_5 - 0.000582010582010578*G0_1_1_1_1_0 + 0.00396825396825395*G0_1_1_1_1_1 + 0.000476190476190473*G0_1_1_1_1_2 + 0.00264550264550263*G0_1_1_1_1_3 + 0.00116402116402116*G0_1_1_1_1_4 + 0.00264550264550263*G0_1_1_1_1_5 + 0.000608465608465604*G0_1_1_1_2_0 + 0.000476190476190473*G0_1_1_1_2_1 - 0.00396825396825394*G0_1_1_1_2_2 - 0.00370370370370368*G0_1_1_1_2_3 - 0.0021164021164021*G0_1_1_1_2_4 - 0.000423280423280422*G0_1_1_1_2_5 + 0.000846560846560842*G0_1_1_1_3_0 + 0.00264550264550263*G0_1_1_1_3_1 - 0.00370370370370368*G0_1_1_1_3_2 - 0.00761904761904758*G0_1_1_1_3_3 - 0.004021164021164*G0_1_1_1_3_4 - 0.000846560846560845*G0_1_1_1_3_5 + 0.000846560846560842*G0_1_1_1_4_0 + 0.00116402116402116*G0_1_1_1_4_1 - 0.0021164021164021*G0_1_1_1_4_2 - 0.004021164021164*G0_1_1_1_4_3 - 0.00550264550264547*G0_1_1_1_4_4 - 0.00148148148148148*G0_1_1_1_4_5 - 0.000740740740740735*G0_1_1_1_5_0 + 0.00264550264550263*G0_1_1_1_5_1 - 0.000423280423280422*G0_1_1_1_5_2 - 0.000846560846560846*G0_1_1_1_5_3 - 0.00148148148148148*G0_1_1_1_5_4 + 0.000846560846560841*G0_1_1_1_5_5 + 0.000476190476190472*G0_1_1_2_0_0 + 0.000608465608465604*G0_1_1_2_0_1 - 0.00396825396825394*G0_1_1_2_0_2 - 0.0021164021164021*G0_1_1_2_0_3 - 0.00370370370370368*G0_1_1_2_0_4 - 0.000423280423280422*G0_1_1_2_0_5 + 0.000608465608465604*G0_1_1_2_1_0 + 0.000476190476190473*G0_1_1_2_1_1 - 0.00396825396825394*G0_1_1_2_1_2 - 0.00370370370370368*G0_1_1_2_1_3 - 0.0021164021164021*G0_1_1_2_1_4 - 0.000423280423280422*G0_1_1_2_1_5 - 0.00396825396825394*G0_1_1_2_2_0 - 0.00396825396825394*G0_1_1_2_2_1 + 0.045238095238095*G0_1_1_2_2_2 + 0.0174603174603174*G0_1_1_2_2_3 + 0.0174603174603174*G0_1_1_2_2_4 + 0.00158730158730159*G0_1_1_2_2_5 - 0.0021164021164021*G0_1_1_2_3_0 - 0.00370370370370368*G0_1_1_2_3_1 + 0.0174603174603174*G0_1_1_2_3_2 + 0.0169312169312168*G0_1_1_2_3_3 + 0.00846560846560842*G0_1_1_2_3_4 + 0.00105820105820106*G0_1_1_2_3_5 - 0.00370370370370368*G0_1_1_2_4_0 - 0.0021164021164021*G0_1_1_2_4_1 + 0.0174603174603174*G0_1_1_2_4_2 + 0.00846560846560842*G0_1_1_2_4_3 + 0.0169312169312168*G0_1_1_2_4_4 + 0.00105820105820106*G0_1_1_2_4_5 - 0.000423280423280422*G0_1_1_2_5_0 - 0.000423280423280422*G0_1_1_2_5_1 + 0.00158730158730159*G0_1_1_2_5_2 + 0.00105820105820106*G0_1_1_2_5_3 + 0.00105820105820106*G0_1_1_2_5_4 - 0.00126984126984126*G0_1_1_2_5_5 + 0.00116402116402116*G0_1_1_3_0_0 + 0.000846560846560842*G0_1_1_3_0_1 - 0.0021164021164021*G0_1_1_3_0_2 - 0.00550264550264547*G0_1_1_3_0_3 - 0.004021164021164*G0_1_1_3_0_4 - 0.00148148148148147*G0_1_1_3_0_5 + 0.000846560846560842*G0_1_1_3_1_0 + 0.00264550264550263*G0_1_1_3_1_1 - 0.00370370370370368*G0_1_1_3_1_2 - 0.00761904761904758*G0_1_1_3_1_3 - 0.004021164021164*G0_1_1_3_1_4 - 0.000846560846560846*G0_1_1_3_1_5 - 0.0021164021164021*G0_1_1_3_2_0 - 0.00370370370370368*G0_1_1_3_2_1 + 0.0174603174603174*G0_1_1_3_2_2 + 0.0169312169312168*G0_1_1_3_2_3 + 0.00846560846560842*G0_1_1_3_2_4 + 0.00105820105820106*G0_1_1_3_2_5 - 0.00550264550264547*G0_1_1_3_3_0 - 0.00761904761904758*G0_1_1_3_3_1 + 0.0169312169312168*G0_1_1_3_3_2 + 0.0571428571428568*G0_1_1_3_3_3 + 0.019047619047619*G0_1_1_3_3_4 + 0.00888888888888886*G0_1_1_3_3_5 - 0.004021164021164*G0_1_1_3_4_0 - 0.004021164021164*G0_1_1_3_4_1 + 0.00846560846560842*G0_1_1_3_4_2 + 0.019047619047619*G0_1_1_3_4_3 + 0.019047619047619*G0_1_1_3_4_4 + 0.0059259259259259*G0_1_1_3_4_5 - 0.00148148148148147*G0_1_1_3_5_0 - 0.000846560846560846*G0_1_1_3_5_1 + 0.00105820105820106*G0_1_1_3_5_2 + 0.00888888888888886*G0_1_1_3_5_3 + 0.0059259259259259*G0_1_1_3_5_4 + 0.00550264550264547*G0_1_1_3_5_5 + 0.00264550264550263*G0_1_1_4_0_0 + 0.000846560846560842*G0_1_1_4_0_1 - 0.00370370370370368*G0_1_1_4_0_2 - 0.004021164021164*G0_1_1_4_0_3 - 0.00761904761904758*G0_1_1_4_0_4 - 0.000846560846560844*G0_1_1_4_0_5 + 0.000846560846560842*G0_1_1_4_1_0 + 0.00116402116402116*G0_1_1_4_1_1 - 0.0021164021164021*G0_1_1_4_1_2 - 0.004021164021164*G0_1_1_4_1_3 - 0.00550264550264547*G0_1_1_4_1_4 - 0.00148148148148148*G0_1_1_4_1_5 - 0.00370370370370368*G0_1_1_4_2_0 - 0.0021164021164021*G0_1_1_4_2_1 + 0.0174603174603174*G0_1_1_4_2_2 + 0.00846560846560842*G0_1_1_4_2_3 + 0.0169312169312168*G0_1_1_4_2_4 + 0.00105820105820106*G0_1_1_4_2_5 - 0.004021164021164*G0_1_1_4_3_0 - 0.004021164021164*G0_1_1_4_3_1 + 0.00846560846560842*G0_1_1_4_3_2 + 0.019047619047619*G0_1_1_4_3_3 + 0.019047619047619*G0_1_1_4_3_4 + 0.0059259259259259*G0_1_1_4_3_5 - 0.00761904761904758*G0_1_1_4_4_0 - 0.00550264550264547*G0_1_1_4_4_1 + 0.0169312169312168*G0_1_1_4_4_2 + 0.019047619047619*G0_1_1_4_4_3 + 0.0571428571428569*G0_1_1_4_4_4 + 0.00888888888888886*G0_1_1_4_4_5 - 0.000846560846560844*G0_1_1_4_5_0 - 0.00148148148148148*G0_1_1_4_5_1 + 0.00105820105820106*G0_1_1_4_5_2 + 0.0059259259259259*G0_1_1_4_5_3 + 0.00888888888888886*G0_1_1_4_5_4 + 0.00550264550264548*G0_1_1_4_5_5 + 0.00264550264550263*G0_1_1_5_0_0 - 0.000740740740740735*G0_1_1_5_0_1 - 0.000423280423280422*G0_1_1_5_0_2 - 0.00148148148148147*G0_1_1_5_0_3 - 0.000846560846560844*G0_1_1_5_0_4 + 0.000846560846560841*G0_1_1_5_0_5 - 0.000740740740740735*G0_1_1_5_1_0 + 0.00264550264550263*G0_1_1_5_1_1 - 0.000423280423280422*G0_1_1_5_1_2 - 0.000846560846560846*G0_1_1_5_1_3 - 0.00148148148148148*G0_1_1_5_1_4 + 0.000846560846560842*G0_1_1_5_1_5 - 0.000423280423280422*G0_1_1_5_2_0 - 0.000423280423280422*G0_1_1_5_2_1 + 0.00158730158730159*G0_1_1_5_2_2 + 0.00105820105820106*G0_1_1_5_2_3 + 0.00105820105820106*G0_1_1_5_2_4 - 0.00126984126984126*G0_1_1_5_2_5 - 0.00148148148148147*G0_1_1_5_3_0 - 0.000846560846560845*G0_1_1_5_3_1 + 0.00105820105820106*G0_1_1_5_3_2 + 0.00888888888888886*G0_1_1_5_3_3 + 0.0059259259259259*G0_1_1_5_3_4 + 0.00550264550264547*G0_1_1_5_3_5 - 0.000846560846560844*G0_1_1_5_4_0 - 0.00148148148148148*G0_1_1_5_4_1 + 0.00105820105820106*G0_1_1_5_4_2 + 0.0059259259259259*G0_1_1_5_4_3 + 0.00888888888888886*G0_1_1_5_4_4 + 0.00550264550264548*G0_1_1_5_4_5 + 0.000846560846560841*G0_1_1_5_5_0 + 0.000846560846560841*G0_1_1_5_5_1 - 0.00126984126984126*G0_1_1_5_5_2 + 0.00550264550264547*G0_1_1_5_5_3 + 0.00550264550264548*G0_1_1_5_5_4 + 0.0266666666666665*G0_1_1_5_5_5; + A[10] = -A[9] - 0.0190476190476189*G0_0_1_0_0_0 + 0.00253968253968252*G0_0_1_0_0_1 + 0.00148148148148148*G0_0_1_0_0_2 + 0.00126984126984126*G0_0_1_0_0_3 - 0.00634920634920632*G0_0_1_0_0_4 - 0.00211640211640211*G0_0_1_0_0_5 + 0.00253968253968252*G0_0_1_0_1_0 - 0.0063492063492063*G0_0_1_0_1_1 + 0.000740740740740735*G0_0_1_0_1_2 - 0.00296296296296294*G0_0_1_0_1_3 + 0.000423280423280423*G0_0_1_0_1_4 - 0.00550264550264546*G0_0_1_0_1_5 + 0.00148148148148148*G0_0_1_0_2_0 + 0.000740740740740735*G0_0_1_0_2_1 - 0.0021164021164021*G0_0_1_0_2_2 + 0.00126984126984126*G0_0_1_0_2_3 + 0.000846560846560845*G0_0_1_0_2_4 + 0.00253968253968253*G0_0_1_0_2_5 + 0.00126984126984126*G0_0_1_0_3_0 - 0.00296296296296294*G0_0_1_0_3_1 + 0.00126984126984126*G0_0_1_0_3_2 - 0.00761904761904757*G0_0_1_0_3_3 - 0.00338624338624337*G0_0_1_0_3_4 - 0.00761904761904758*G0_0_1_0_3_5 - 0.00634920634920632*G0_0_1_0_4_0 + 0.000423280423280424*G0_0_1_0_4_1 + 0.000846560846560844*G0_0_1_0_4_2 - 0.00338624338624337*G0_0_1_0_4_3 - 0.011005291005291*G0_0_1_0_4_4 - 0.0059259259259259*G0_0_1_0_4_5 - 0.00211640211640211*G0_0_1_0_5_0 - 0.00550264550264546*G0_0_1_0_5_1 + 0.00253968253968253*G0_0_1_0_5_2 - 0.00761904761904758*G0_0_1_0_5_3 - 0.0059259259259259*G0_0_1_0_5_4 - 0.0194708994708993*G0_0_1_0_5_5 + 0.00253968253968252*G0_0_1_1_0_0 - 0.0063492063492063*G0_0_1_1_0_1 + 0.000740740740740735*G0_0_1_1_0_2 - 0.00296296296296294*G0_0_1_1_0_3 + 0.000423280423280424*G0_0_1_1_0_4 - 0.00550264550264546*G0_0_1_1_0_5 - 0.0063492063492063*G0_0_1_1_1_0 + 0.0634920634920631*G0_0_1_1_1_1 - 0.00529100529100526*G0_0_1_1_1_2 + 0.0232804232804231*G0_0_1_1_1_3 + 0.00211640211640211*G0_0_1_1_1_4 + 0.0275132275132273*G0_0_1_1_1_5 + 0.000740740740740735*G0_0_1_1_2_0 - 0.00529100529100526*G0_0_1_1_2_1 - 0.00507936507936505*G0_0_1_1_2_3 - 0.00126984126984126*G0_0_1_1_2_4 - 0.00338624338624337*G0_0_1_1_2_5 - 0.00296296296296294*G0_0_1_1_3_0 + 0.0232804232804231*G0_0_1_1_3_1 - 0.00507936507936505*G0_0_1_1_3_2 + 0.0211640211640211*G0_0_1_1_3_3 + 0.00169312169312169*G0_0_1_1_3_4 + 0.0126984126984126*G0_0_1_1_3_5 + 0.000423280423280424*G0_0_1_1_4_0 + 0.00211640211640211*G0_0_1_1_4_1 - 0.00126984126984126*G0_0_1_1_4_2 + 0.00169312169312169*G0_0_1_1_4_3 + 0.000846560846560845*G0_0_1_1_4_4 + 0.00253968253968253*G0_0_1_1_4_5 - 0.00550264550264546*G0_0_1_1_5_0 + 0.0275132275132273*G0_0_1_1_5_1 - 0.00338624338624337*G0_0_1_1_5_2 + 0.0126984126984126*G0_0_1_1_5_3 + 0.00253968253968253*G0_0_1_1_5_4 + 0.0296296296296295*G0_0_1_1_5_5 + 0.00148148148148148*G0_0_1_2_0_0 + 0.000740740740740735*G0_0_1_2_0_1 - 0.0021164021164021*G0_0_1_2_0_2 + 0.00126984126984126*G0_0_1_2_0_3 + 0.000846560846560845*G0_0_1_2_0_4 + 0.00253968253968253*G0_0_1_2_0_5 + 0.000740740740740735*G0_0_1_2_1_0 - 0.00529100529100526*G0_0_1_2_1_1 - 0.00507936507936505*G0_0_1_2_1_3 - 0.00126984126984126*G0_0_1_2_1_4 - 0.00338624338624337*G0_0_1_2_1_5 - 0.0021164021164021*G0_0_1_2_2_0 + 0.0158730158730158*G0_0_1_2_2_2 + 0.00634920634920632*G0_0_1_2_2_3 + 0.00634920634920631*G0_0_1_2_2_4 + 0.00211640211640211*G0_0_1_2_2_5 + 0.00126984126984126*G0_0_1_2_3_0 - 0.00507936507936505*G0_0_1_2_3_1 + 0.00634920634920632*G0_0_1_2_3_2 - 0.00846560846560843*G0_0_1_2_3_3 - 0.00677248677248674*G0_0_1_2_3_5 + 0.000846560846560845*G0_0_1_2_4_0 - 0.00126984126984126*G0_0_1_2_4_1 + 0.00634920634920631*G0_0_1_2_4_2 + 0.00846560846560843*G0_0_1_2_4_4 - 0.00169312169312168*G0_0_1_2_4_5 + 0.00253968253968253*G0_0_1_2_5_0 - 0.00338624338624337*G0_0_1_2_5_1 + 0.00211640211640211*G0_0_1_2_5_2 - 0.00677248677248674*G0_0_1_2_5_3 - 0.00169312169312168*G0_0_1_2_5_4 - 0.0118518518518518*G0_0_1_2_5_5 + 0.00126984126984126*G0_0_1_3_0_0 - 0.00296296296296294*G0_0_1_3_0_1 + 0.00126984126984126*G0_0_1_3_0_2 - 0.00761904761904757*G0_0_1_3_0_3 - 0.00338624338624337*G0_0_1_3_0_4 - 0.00761904761904758*G0_0_1_3_0_5 - 0.00296296296296294*G0_0_1_3_1_0 + 0.0232804232804231*G0_0_1_3_1_1 - 0.00507936507936505*G0_0_1_3_1_2 + 0.0211640211640211*G0_0_1_3_1_3 + 0.00169312169312168*G0_0_1_3_1_4 + 0.0126984126984126*G0_0_1_3_1_5 + 0.00126984126984126*G0_0_1_3_2_0 - 0.00507936507936505*G0_0_1_3_2_1 + 0.00634920634920632*G0_0_1_3_2_2 - 0.00846560846560843*G0_0_1_3_2_3 - 0.00677248677248674*G0_0_1_3_2_5 - 0.00761904761904757*G0_0_1_3_3_0 + 0.0211640211640211*G0_0_1_3_3_1 - 0.00846560846560843*G0_0_1_3_3_2 + 0.0558730158730156*G0_0_1_3_3_3 + 0.0118518518518518*G0_0_1_3_3_4 + 0.0287830687830687*G0_0_1_3_3_5 - 0.00338624338624337*G0_0_1_3_4_0 + 0.00169312169312169*G0_0_1_3_4_1 + 0.0118518518518518*G0_0_1_3_4_3 + 0.00507936507936506*G0_0_1_3_4_4 + 0.0101587301587301*G0_0_1_3_4_5 - 0.00761904761904758*G0_0_1_3_5_0 + 0.0126984126984126*G0_0_1_3_5_1 - 0.00677248677248674*G0_0_1_3_5_2 + 0.0287830687830687*G0_0_1_3_5_3 + 0.0101587301587301*G0_0_1_3_5_4 + 0.0389417989417987*G0_0_1_3_5_5 - 0.00634920634920632*G0_0_1_4_0_0 + 0.000423280423280424*G0_0_1_4_0_1 + 0.000846560846560845*G0_0_1_4_0_2 - 0.00338624338624337*G0_0_1_4_0_3 - 0.011005291005291*G0_0_1_4_0_4 - 0.0059259259259259*G0_0_1_4_0_5 + 0.000423280423280424*G0_0_1_4_1_0 + 0.00211640211640211*G0_0_1_4_1_1 - 0.00126984126984126*G0_0_1_4_1_2 + 0.00169312169312169*G0_0_1_4_1_3 + 0.000846560846560845*G0_0_1_4_1_4 + 0.00253968253968253*G0_0_1_4_1_5 + 0.000846560846560844*G0_0_1_4_2_0 - 0.00126984126984126*G0_0_1_4_2_1 + 0.00634920634920631*G0_0_1_4_2_2 + 0.00846560846560843*G0_0_1_4_2_4 - 0.00169312169312168*G0_0_1_4_2_5 - 0.00338624338624337*G0_0_1_4_3_0 + 0.00169312169312169*G0_0_1_4_3_1 + 0.0118518518518518*G0_0_1_4_3_3 + 0.00507936507936506*G0_0_1_4_3_4 + 0.0101587301587301*G0_0_1_4_3_5 - 0.011005291005291*G0_0_1_4_4_0 + 0.000846560846560845*G0_0_1_4_4_1 + 0.00846560846560843*G0_0_1_4_4_2 + 0.00507936507936506*G0_0_1_4_4_3 - 0.00507936507936506*G0_0_1_4_4_4 + 0.00169312169312168*G0_0_1_4_4_5 - 0.0059259259259259*G0_0_1_4_5_0 + 0.00253968253968253*G0_0_1_4_5_1 - 0.00169312169312168*G0_0_1_4_5_2 + 0.0101587301587301*G0_0_1_4_5_3 + 0.00169312169312168*G0_0_1_4_5_4 + 0.0186243386243385*G0_0_1_4_5_5 - 0.00211640211640211*G0_0_1_5_0_0 - 0.00550264550264546*G0_0_1_5_0_1 + 0.00253968253968253*G0_0_1_5_0_2 - 0.00761904761904758*G0_0_1_5_0_3 - 0.0059259259259259*G0_0_1_5_0_4 - 0.0194708994708993*G0_0_1_5_0_5 - 0.00550264550264546*G0_0_1_5_1_0 + 0.0275132275132273*G0_0_1_5_1_1 - 0.00338624338624337*G0_0_1_5_1_2 + 0.0126984126984126*G0_0_1_5_1_3 + 0.00253968253968253*G0_0_1_5_1_4 + 0.0296296296296295*G0_0_1_5_1_5 + 0.00253968253968253*G0_0_1_5_2_0 - 0.00338624338624337*G0_0_1_5_2_1 + 0.00211640211640211*G0_0_1_5_2_2 - 0.00677248677248674*G0_0_1_5_2_3 - 0.00169312169312168*G0_0_1_5_2_4 - 0.0118518518518518*G0_0_1_5_2_5 - 0.00761904761904758*G0_0_1_5_3_0 + 0.0126984126984126*G0_0_1_5_3_1 - 0.00677248677248674*G0_0_1_5_3_2 + 0.0287830687830687*G0_0_1_5_3_3 + 0.0101587301587301*G0_0_1_5_3_4 + 0.0389417989417987*G0_0_1_5_3_5 - 0.0059259259259259*G0_0_1_5_4_0 + 0.00253968253968253*G0_0_1_5_4_1 - 0.00169312169312168*G0_0_1_5_4_2 + 0.0101587301587301*G0_0_1_5_4_3 + 0.00169312169312168*G0_0_1_5_4_4 + 0.0186243386243385*G0_0_1_5_4_5 - 0.0194708994708993*G0_0_1_5_5_0 + 0.0296296296296295*G0_0_1_5_5_1 - 0.0118518518518518*G0_0_1_5_5_2 + 0.0389417989417987*G0_0_1_5_5_3 + 0.0186243386243385*G0_0_1_5_5_4 + 0.147301587301586*G0_0_1_5_5_5; + A[25] = A[10] + 0.0174603174603174*G0_0_1_0_0_0 - 0.00126984126984126*G0_0_1_0_0_1 - 0.00179894179894179*G0_0_1_0_0_2 + 0.000423280423280422*G0_0_1_0_0_3 + 0.00634920634920632*G0_0_1_0_0_4 + 0.00423280423280421*G0_0_1_0_0_5 - 0.00126984126984126*G0_0_1_0_1_0 + 0.000529100529100528*G0_0_1_0_1_1 - 0.00021164021164021*G0_0_1_0_1_3 - 0.000846560846560843*G0_0_1_0_1_4 + 0.000211640211640211*G0_0_1_0_1_5 - 0.00179894179894179*G0_0_1_0_2_0 + 0.00179894179894179*G0_0_1_0_2_2 + 0.00063492063492063*G0_0_1_0_2_3 - 0.000634920634920632*G0_0_1_0_2_5 + 0.000423280423280422*G0_0_1_0_3_0 - 0.00021164021164021*G0_0_1_0_3_1 + 0.00063492063492063*G0_0_1_0_3_2 - 0.0021164021164021*G0_0_1_0_3_3 + 0.000846560846560844*G0_0_1_0_3_4 + 0.000423280423280423*G0_0_1_0_3_5 + 0.00634920634920632*G0_0_1_0_4_0 - 0.000846560846560843*G0_0_1_0_4_1 + 0.000846560846560844*G0_0_1_0_4_3 + 0.00973544973544969*G0_0_1_0_4_4 + 0.00296296296296295*G0_0_1_0_4_5 + 0.00423280423280421*G0_0_1_0_5_0 + 0.000211640211640211*G0_0_1_0_5_1 - 0.000634920634920632*G0_0_1_0_5_2 + 0.000423280423280423*G0_0_1_0_5_3 + 0.00296296296296295*G0_0_1_0_5_4 + 0.00550264550264547*G0_0_1_0_5_5 - 0.00126984126984126*G0_0_1_1_0_0 + 0.000529100529100528*G0_0_1_1_0_1 - 0.00021164021164021*G0_0_1_1_0_3 - 0.000846560846560843*G0_0_1_1_0_4 + 0.000211640211640211*G0_0_1_1_0_5 + 0.000529100529100528*G0_0_1_1_1_0 - 0.000529100529100525*G0_0_1_1_1_2 + 0.0021164021164021*G0_0_1_1_1_3 - 0.00211640211640211*G0_0_1_1_1_5 - 0.000529100529100525*G0_0_1_1_2_1 + 0.00126984126984126*G0_0_1_1_2_2 - 0.00021164021164021*G0_0_1_1_2_3 + 0.000846560846560842*G0_0_1_1_2_4 + 0.000211640211640212*G0_0_1_1_2_5 - 0.00021164021164021*G0_0_1_1_3_0 + 0.0021164021164021*G0_0_1_1_3_1 - 0.00021164021164021*G0_0_1_1_3_2 + 0.00423280423280421*G0_0_1_1_3_3 + 0.000423280423280421*G0_0_1_1_3_4 - 0.000846560846560843*G0_0_1_1_4_0 + 0.000846560846560842*G0_0_1_1_4_2 + 0.000423280423280421*G0_0_1_1_4_3 - 0.000423280423280422*G0_0_1_1_4_5 + 0.000211640211640211*G0_0_1_1_5_0 - 0.00211640211640211*G0_0_1_1_5_1 + 0.000211640211640212*G0_0_1_1_5_2 - 0.000423280423280422*G0_0_1_1_5_4 - 0.00423280423280422*G0_0_1_1_5_5 - 0.00179894179894179*G0_0_1_2_0_0 + 0.00179894179894179*G0_0_1_2_0_2 + 0.00063492063492063*G0_0_1_2_0_3 - 0.000634920634920632*G0_0_1_2_0_5 - 0.000529100529100525*G0_0_1_2_1_1 + 0.00126984126984126*G0_0_1_2_1_2 - 0.00021164021164021*G0_0_1_2_1_3 + 0.000846560846560842*G0_0_1_2_1_4 + 0.000211640211640212*G0_0_1_2_1_5 + 0.00179894179894179*G0_0_1_2_2_0 + 0.00126984126984126*G0_0_1_2_2_1 - 0.0174603174603174*G0_0_1_2_2_2 - 0.00423280423280421*G0_0_1_2_2_3 - 0.00634920634920631*G0_0_1_2_2_4 - 0.000423280423280425*G0_0_1_2_2_5 + 0.00063492063492063*G0_0_1_2_3_0 - 0.00021164021164021*G0_0_1_2_3_1 - 0.00423280423280421*G0_0_1_2_3_2 - 0.00550264550264547*G0_0_1_2_3_3 - 0.00296296296296295*G0_0_1_2_3_4 - 0.000423280423280422*G0_0_1_2_3_5 + 0.000846560846560842*G0_0_1_2_4_1 - 0.00634920634920631*G0_0_1_2_4_2 - 0.00296296296296295*G0_0_1_2_4_3 - 0.00973544973544969*G0_0_1_2_4_4 - 0.000846560846560846*G0_0_1_2_4_5 - 0.000634920634920632*G0_0_1_2_5_0 + 0.000211640211640212*G0_0_1_2_5_1 - 0.000423280423280425*G0_0_1_2_5_2 - 0.000423280423280422*G0_0_1_2_5_3 - 0.000846560846560846*G0_0_1_2_5_4 + 0.00211640211640211*G0_0_1_2_5_5 + 0.000423280423280422*G0_0_1_3_0_0 - 0.00021164021164021*G0_0_1_3_0_1 + 0.00063492063492063*G0_0_1_3_0_2 - 0.0021164021164021*G0_0_1_3_0_3 + 0.000846560846560844*G0_0_1_3_0_4 + 0.000423280423280423*G0_0_1_3_0_5 - 0.00021164021164021*G0_0_1_3_1_0 + 0.0021164021164021*G0_0_1_3_1_1 - 0.00021164021164021*G0_0_1_3_1_2 + 0.00423280423280421*G0_0_1_3_1_3 + 0.000423280423280421*G0_0_1_3_1_4 + 0.00063492063492063*G0_0_1_3_2_0 - 0.00021164021164021*G0_0_1_3_2_1 - 0.00423280423280421*G0_0_1_3_2_2 - 0.00550264550264547*G0_0_1_3_2_3 - 0.00296296296296295*G0_0_1_3_2_4 - 0.000423280423280422*G0_0_1_3_2_5 - 0.0021164021164021*G0_0_1_3_3_0 + 0.00423280423280421*G0_0_1_3_3_1 - 0.00550264550264547*G0_0_1_3_3_2 + 0.0457142857142855*G0_0_1_3_3_3 + 0.00338624338624337*G0_0_1_3_3_4 + 0.00507936507936506*G0_0_1_3_3_5 + 0.000846560846560844*G0_0_1_3_4_0 + 0.000423280423280421*G0_0_1_3_4_1 - 0.00296296296296295*G0_0_1_3_4_2 + 0.00338624338624337*G0_0_1_3_4_3 - 0.00169312169312168*G0_0_1_3_4_4 + 0.000423280423280423*G0_0_1_3_5_0 - 0.000423280423280422*G0_0_1_3_5_2 + 0.00507936507936506*G0_0_1_3_5_3 - 0.00507936507936505*G0_0_1_3_5_5 + 0.00634920634920632*G0_0_1_4_0_0 - 0.000846560846560843*G0_0_1_4_0_1 + 0.000846560846560844*G0_0_1_4_0_3 + 0.00973544973544969*G0_0_1_4_0_4 + 0.00296296296296295*G0_0_1_4_0_5 - 0.000846560846560843*G0_0_1_4_1_0 + 0.000846560846560842*G0_0_1_4_1_2 + 0.000423280423280421*G0_0_1_4_1_3 - 0.000423280423280422*G0_0_1_4_1_5 + 0.000846560846560842*G0_0_1_4_2_1 - 0.00634920634920631*G0_0_1_4_2_2 - 0.00296296296296295*G0_0_1_4_2_3 - 0.00973544973544969*G0_0_1_4_2_4 - 0.000846560846560846*G0_0_1_4_2_5 + 0.000846560846560844*G0_0_1_4_3_0 + 0.000423280423280421*G0_0_1_4_3_1 - 0.00296296296296295*G0_0_1_4_3_2 + 0.00338624338624337*G0_0_1_4_3_3 - 0.00169312169312168*G0_0_1_4_3_4 + 0.00973544973544969*G0_0_1_4_4_0 - 0.00973544973544969*G0_0_1_4_4_2 - 0.00169312169312168*G0_0_1_4_4_3 + 0.00169312169312169*G0_0_1_4_4_5 + 0.00296296296296295*G0_0_1_4_5_0 - 0.000423280423280422*G0_0_1_4_5_1 - 0.000846560846560846*G0_0_1_4_5_2 + 0.00169312169312169*G0_0_1_4_5_4 - 0.00338624338624337*G0_0_1_4_5_5 + 0.00423280423280421*G0_0_1_5_0_0 + 0.000211640211640211*G0_0_1_5_0_1 - 0.000634920634920632*G0_0_1_5_0_2 + 0.000423280423280423*G0_0_1_5_0_3 + 0.00296296296296295*G0_0_1_5_0_4 + 0.00550264550264547*G0_0_1_5_0_5 + 0.000211640211640211*G0_0_1_5_1_0 - 0.00211640211640211*G0_0_1_5_1_1 + 0.000211640211640212*G0_0_1_5_1_2 - 0.000423280423280422*G0_0_1_5_1_4 - 0.00423280423280422*G0_0_1_5_1_5 - 0.000634920634920632*G0_0_1_5_2_0 + 0.000211640211640212*G0_0_1_5_2_1 - 0.000423280423280425*G0_0_1_5_2_2 - 0.000423280423280422*G0_0_1_5_2_3 - 0.000846560846560846*G0_0_1_5_2_4 + 0.00211640211640211*G0_0_1_5_2_5 + 0.000423280423280423*G0_0_1_5_3_0 - 0.000423280423280422*G0_0_1_5_3_2 + 0.00507936507936506*G0_0_1_5_3_3 - 0.00507936507936505*G0_0_1_5_3_5 + 0.00296296296296295*G0_0_1_5_4_0 - 0.000423280423280422*G0_0_1_5_4_1 - 0.000846560846560846*G0_0_1_5_4_2 + 0.00169312169312169*G0_0_1_5_4_4 - 0.00338624338624337*G0_0_1_5_4_5 + 0.00550264550264547*G0_0_1_5_5_0 - 0.00423280423280422*G0_0_1_5_5_1 + 0.00211640211640211*G0_0_1_5_5_2 - 0.00507936507936505*G0_0_1_5_5_3 - 0.00338624338624337*G0_0_1_5_5_4 - 0.0457142857142855*G0_0_1_5_5_5 - 0.0174603174603174*G0_1_0_0_0_0 + 0.00126984126984126*G0_1_0_0_0_1 + 0.00179894179894179*G0_1_0_0_0_2 - 0.000423280423280422*G0_1_0_0_0_3 - 0.00634920634920632*G0_1_0_0_0_4 - 0.00423280423280421*G0_1_0_0_0_5 + 0.00126984126984126*G0_1_0_0_1_0 - 0.000529100529100528*G0_1_0_0_1_1 + 0.00021164021164021*G0_1_0_0_1_3 + 0.000846560846560843*G0_1_0_0_1_4 - 0.000211640211640211*G0_1_0_0_1_5 + 0.00179894179894179*G0_1_0_0_2_0 - 0.00179894179894179*G0_1_0_0_2_2 - 0.00063492063492063*G0_1_0_0_2_3 + 0.000634920634920632*G0_1_0_0_2_5 - 0.000423280423280422*G0_1_0_0_3_0 + 0.00021164021164021*G0_1_0_0_3_1 - 0.00063492063492063*G0_1_0_0_3_2 + 0.0021164021164021*G0_1_0_0_3_3 - 0.000846560846560844*G0_1_0_0_3_4 - 0.000423280423280423*G0_1_0_0_3_5 - 0.00634920634920632*G0_1_0_0_4_0 + 0.000846560846560843*G0_1_0_0_4_1 - 0.000846560846560844*G0_1_0_0_4_3 - 0.00973544973544969*G0_1_0_0_4_4 - 0.00296296296296295*G0_1_0_0_4_5 - 0.00423280423280421*G0_1_0_0_5_0 - 0.000211640211640211*G0_1_0_0_5_1 + 0.000634920634920632*G0_1_0_0_5_2 - 0.000423280423280423*G0_1_0_0_5_3 - 0.00296296296296295*G0_1_0_0_5_4 - 0.00550264550264547*G0_1_0_0_5_5 + 0.00126984126984126*G0_1_0_1_0_0 - 0.000529100529100528*G0_1_0_1_0_1 + 0.00021164021164021*G0_1_0_1_0_3 + 0.000846560846560843*G0_1_0_1_0_4 - 0.000211640211640211*G0_1_0_1_0_5 - 0.000529100529100528*G0_1_0_1_1_0 + 0.000529100529100525*G0_1_0_1_1_2 - 0.0021164021164021*G0_1_0_1_1_3 + 0.00211640211640211*G0_1_0_1_1_5 + 0.000529100529100525*G0_1_0_1_2_1 - 0.00126984126984126*G0_1_0_1_2_2 + 0.00021164021164021*G0_1_0_1_2_3 - 0.000846560846560842*G0_1_0_1_2_4 - 0.000211640211640212*G0_1_0_1_2_5 + 0.00021164021164021*G0_1_0_1_3_0 - 0.0021164021164021*G0_1_0_1_3_1 + 0.00021164021164021*G0_1_0_1_3_2 - 0.00423280423280421*G0_1_0_1_3_3 - 0.000423280423280421*G0_1_0_1_3_4 + 0.000846560846560843*G0_1_0_1_4_0 - 0.000846560846560842*G0_1_0_1_4_2 - 0.000423280423280421*G0_1_0_1_4_3 + 0.000423280423280422*G0_1_0_1_4_5 - 0.000211640211640211*G0_1_0_1_5_0 + 0.00211640211640211*G0_1_0_1_5_1 - 0.000211640211640212*G0_1_0_1_5_2 + 0.000423280423280422*G0_1_0_1_5_4 + 0.00423280423280422*G0_1_0_1_5_5 + 0.00179894179894179*G0_1_0_2_0_0 - 0.00179894179894179*G0_1_0_2_0_2 - 0.00063492063492063*G0_1_0_2_0_3 + 0.000634920634920632*G0_1_0_2_0_5 + 0.000529100529100525*G0_1_0_2_1_1 - 0.00126984126984126*G0_1_0_2_1_2 + 0.00021164021164021*G0_1_0_2_1_3 - 0.000846560846560842*G0_1_0_2_1_4 - 0.000211640211640212*G0_1_0_2_1_5 - 0.00179894179894179*G0_1_0_2_2_0 - 0.00126984126984126*G0_1_0_2_2_1 + 0.0174603174603174*G0_1_0_2_2_2 + 0.00423280423280421*G0_1_0_2_2_3 + 0.00634920634920631*G0_1_0_2_2_4 + 0.000423280423280425*G0_1_0_2_2_5 - 0.00063492063492063*G0_1_0_2_3_0 + 0.00021164021164021*G0_1_0_2_3_1 + 0.00423280423280421*G0_1_0_2_3_2 + 0.00550264550264547*G0_1_0_2_3_3 + 0.00296296296296295*G0_1_0_2_3_4 + 0.000423280423280422*G0_1_0_2_3_5 - 0.000846560846560842*G0_1_0_2_4_1 + 0.00634920634920631*G0_1_0_2_4_2 + 0.00296296296296295*G0_1_0_2_4_3 + 0.00973544973544969*G0_1_0_2_4_4 + 0.000846560846560846*G0_1_0_2_4_5 + 0.000634920634920632*G0_1_0_2_5_0 - 0.000211640211640212*G0_1_0_2_5_1 + 0.000423280423280425*G0_1_0_2_5_2 + 0.000423280423280422*G0_1_0_2_5_3 + 0.000846560846560846*G0_1_0_2_5_4 - 0.00211640211640211*G0_1_0_2_5_5 - 0.000423280423280422*G0_1_0_3_0_0 + 0.00021164021164021*G0_1_0_3_0_1 - 0.00063492063492063*G0_1_0_3_0_2 + 0.0021164021164021*G0_1_0_3_0_3 - 0.000846560846560844*G0_1_0_3_0_4 - 0.000423280423280423*G0_1_0_3_0_5 + 0.00021164021164021*G0_1_0_3_1_0 - 0.0021164021164021*G0_1_0_3_1_1 + 0.00021164021164021*G0_1_0_3_1_2 - 0.00423280423280421*G0_1_0_3_1_3 - 0.000423280423280421*G0_1_0_3_1_4 - 0.00063492063492063*G0_1_0_3_2_0 + 0.00021164021164021*G0_1_0_3_2_1 + 0.00423280423280421*G0_1_0_3_2_2 + 0.00550264550264547*G0_1_0_3_2_3 + 0.00296296296296295*G0_1_0_3_2_4 + 0.000423280423280422*G0_1_0_3_2_5 + 0.0021164021164021*G0_1_0_3_3_0 - 0.00423280423280421*G0_1_0_3_3_1 + 0.00550264550264547*G0_1_0_3_3_2 - 0.0457142857142855*G0_1_0_3_3_3 - 0.00338624338624337*G0_1_0_3_3_4 - 0.00507936507936506*G0_1_0_3_3_5 - 0.000846560846560844*G0_1_0_3_4_0 - 0.000423280423280421*G0_1_0_3_4_1 + 0.00296296296296295*G0_1_0_3_4_2 - 0.00338624338624337*G0_1_0_3_4_3 + 0.00169312169312168*G0_1_0_3_4_4 - 0.000423280423280423*G0_1_0_3_5_0 + 0.000423280423280422*G0_1_0_3_5_2 - 0.00507936507936506*G0_1_0_3_5_3 + 0.00507936507936505*G0_1_0_3_5_5 - 0.00634920634920632*G0_1_0_4_0_0 + 0.000846560846560843*G0_1_0_4_0_1 - 0.000846560846560844*G0_1_0_4_0_3 - 0.00973544973544969*G0_1_0_4_0_4 - 0.00296296296296295*G0_1_0_4_0_5 + 0.000846560846560843*G0_1_0_4_1_0 - 0.000846560846560842*G0_1_0_4_1_2 - 0.000423280423280421*G0_1_0_4_1_3 + 0.000423280423280422*G0_1_0_4_1_5 - 0.000846560846560842*G0_1_0_4_2_1 + 0.00634920634920631*G0_1_0_4_2_2 + 0.00296296296296295*G0_1_0_4_2_3 + 0.00973544973544969*G0_1_0_4_2_4 + 0.000846560846560846*G0_1_0_4_2_5 - 0.000846560846560844*G0_1_0_4_3_0 - 0.000423280423280421*G0_1_0_4_3_1 + 0.00296296296296295*G0_1_0_4_3_2 - 0.00338624338624337*G0_1_0_4_3_3 + 0.00169312169312168*G0_1_0_4_3_4 - 0.00973544973544969*G0_1_0_4_4_0 + 0.00973544973544969*G0_1_0_4_4_2 + 0.00169312169312168*G0_1_0_4_4_3 - 0.00169312169312169*G0_1_0_4_4_5 - 0.00296296296296295*G0_1_0_4_5_0 + 0.000423280423280422*G0_1_0_4_5_1 + 0.000846560846560846*G0_1_0_4_5_2 - 0.00169312169312169*G0_1_0_4_5_4 + 0.00338624338624337*G0_1_0_4_5_5 - 0.00423280423280421*G0_1_0_5_0_0 - 0.000211640211640211*G0_1_0_5_0_1 + 0.000634920634920632*G0_1_0_5_0_2 - 0.000423280423280423*G0_1_0_5_0_3 - 0.00296296296296295*G0_1_0_5_0_4 - 0.00550264550264547*G0_1_0_5_0_5 - 0.000211640211640211*G0_1_0_5_1_0 + 0.00211640211640211*G0_1_0_5_1_1 - 0.000211640211640212*G0_1_0_5_1_2 + 0.000423280423280422*G0_1_0_5_1_4 + 0.00423280423280422*G0_1_0_5_1_5 + 0.000634920634920632*G0_1_0_5_2_0 - 0.000211640211640212*G0_1_0_5_2_1 + 0.000423280423280425*G0_1_0_5_2_2 + 0.000423280423280422*G0_1_0_5_2_3 + 0.000846560846560846*G0_1_0_5_2_4 - 0.00211640211640211*G0_1_0_5_2_5 - 0.000423280423280423*G0_1_0_5_3_0 + 0.000423280423280422*G0_1_0_5_3_2 - 0.00507936507936506*G0_1_0_5_3_3 + 0.00507936507936505*G0_1_0_5_3_5 - 0.00296296296296295*G0_1_0_5_4_0 + 0.000423280423280422*G0_1_0_5_4_1 + 0.000846560846560846*G0_1_0_5_4_2 - 0.00169312169312169*G0_1_0_5_4_4 + 0.00338624338624337*G0_1_0_5_4_5 - 0.00550264550264547*G0_1_0_5_5_0 + 0.00423280423280422*G0_1_0_5_5_1 - 0.00211640211640211*G0_1_0_5_5_2 + 0.00507936507936505*G0_1_0_5_5_3 + 0.00338624338624337*G0_1_0_5_5_4 + 0.0457142857142855*G0_1_0_5_5_5; + A[18] = A[25] - 0.0063492063492063*G0_0_0_0_0_0 + 0.00084656084656084*G0_0_0_0_0_1 + 0.000846560846560843*G0_0_0_0_0_2 + 0.000423280423280419*G0_0_0_0_0_3 - 0.00634920634920632*G0_0_0_0_0_4 - 0.0021164021164021*G0_0_0_0_0_5 + 0.00084656084656084*G0_0_0_0_1_0 - 0.000846560846560838*G0_0_0_0_1_1 - 0.000423280423280419*G0_0_0_0_1_3 + 0.000423280423280423*G0_0_0_0_1_4 + 0.000846560846560843*G0_0_0_0_2_0 + 0.000846560846560842*G0_0_0_0_2_3 + 0.00338624338624337*G0_0_0_0_2_4 + 0.00126984126984126*G0_0_0_0_2_5 + 0.000423280423280418*G0_0_0_0_3_0 - 0.000423280423280419*G0_0_0_0_3_1 + 0.000846560846560842*G0_0_0_0_3_2 - 0.00846560846560841*G0_0_0_0_3_3 - 0.00169312169312169*G0_0_0_0_3_4 - 0.00338624338624337*G0_0_0_0_3_5 - 0.00634920634920632*G0_0_0_0_4_0 + 0.000423280423280423*G0_0_0_0_4_1 + 0.00338624338624337*G0_0_0_0_4_2 - 0.00169312169312169*G0_0_0_0_4_3 - 0.00507936507936507*G0_0_0_0_4_4 - 0.00338624338624337*G0_0_0_0_4_5 - 0.0021164021164021*G0_0_0_0_5_0 + 0.00126984126984126*G0_0_0_0_5_2 - 0.00338624338624337*G0_0_0_0_5_3 - 0.00338624338624337*G0_0_0_0_5_4 - 0.00507936507936504*G0_0_0_0_5_5 + 0.00084656084656084*G0_0_0_1_0_0 - 0.000846560846560838*G0_0_0_1_0_1 - 0.000423280423280419*G0_0_0_1_0_3 + 0.000423280423280423*G0_0_0_1_0_4 - 0.000846560846560838*G0_0_0_1_1_0 + 0.00634920634920628*G0_0_0_1_1_1 - 0.000846560846560841*G0_0_0_1_1_2 + 0.00634920634920631*G0_0_0_1_1_3 - 0.000423280423280421*G0_0_0_1_1_4 + 0.00211640211640209*G0_0_0_1_1_5 - 0.000846560846560841*G0_0_0_1_2_1 - 0.00338624338624337*G0_0_0_1_2_3 - 0.000846560846560844*G0_0_0_1_2_4 - 0.00126984126984126*G0_0_0_1_2_5 - 0.000423280423280419*G0_0_0_1_3_0 + 0.00634920634920631*G0_0_0_1_3_1 - 0.00338624338624337*G0_0_0_1_3_2 + 0.00507936507936505*G0_0_0_1_3_3 + 0.00169312169312168*G0_0_0_1_3_4 + 0.00338624338624337*G0_0_0_1_3_5 + 0.000423280423280423*G0_0_0_1_4_0 - 0.000423280423280421*G0_0_0_1_4_1 - 0.000846560846560844*G0_0_0_1_4_2 + 0.00169312169312168*G0_0_0_1_4_3 + 0.00846560846560842*G0_0_0_1_4_4 + 0.00338624338624337*G0_0_0_1_4_5 + 0.00211640211640209*G0_0_0_1_5_1 - 0.00126984126984126*G0_0_0_1_5_2 + 0.00338624338624337*G0_0_0_1_5_3 + 0.00338624338624337*G0_0_0_1_5_4 + 0.00507936507936504*G0_0_0_1_5_5 + 0.000846560846560843*G0_0_0_2_0_0 + 0.000846560846560842*G0_0_0_2_0_3 + 0.00338624338624337*G0_0_0_2_0_4 + 0.00126984126984126*G0_0_0_2_0_5 - 0.000846560846560841*G0_0_0_2_1_1 - 0.00338624338624337*G0_0_0_2_1_3 - 0.000846560846560844*G0_0_0_2_1_4 - 0.00126984126984126*G0_0_0_2_1_5 + 0.00423280423280421*G0_0_0_2_2_3 - 0.00423280423280421*G0_0_0_2_2_4 + 0.000846560846560842*G0_0_0_2_3_0 - 0.00338624338624337*G0_0_0_2_3_1 + 0.00423280423280421*G0_0_0_2_3_2 - 0.00169312169312169*G0_0_0_2_3_5 + 0.00338624338624337*G0_0_0_2_4_0 - 0.000846560846560844*G0_0_0_2_4_1 - 0.00423280423280421*G0_0_0_2_4_2 + 0.00169312169312168*G0_0_0_2_4_5 + 0.00126984126984126*G0_0_0_2_5_0 - 0.00126984126984126*G0_0_0_2_5_1 - 0.00169312169312168*G0_0_0_2_5_3 + 0.00169312169312169*G0_0_0_2_5_4 + 0.000423280423280419*G0_0_0_3_0_0 - 0.000423280423280419*G0_0_0_3_0_1 + 0.000846560846560842*G0_0_0_3_0_2 - 0.00846560846560841*G0_0_0_3_0_3 - 0.00169312169312169*G0_0_0_3_0_4 - 0.00338624338624337*G0_0_0_3_0_5 - 0.000423280423280419*G0_0_0_3_1_0 + 0.00634920634920631*G0_0_0_3_1_1 - 0.00338624338624337*G0_0_0_3_1_2 + 0.00507936507936505*G0_0_0_3_1_3 + 0.00169312169312168*G0_0_0_3_1_4 + 0.00338624338624337*G0_0_0_3_1_5 + 0.000846560846560842*G0_0_0_3_2_0 - 0.00338624338624337*G0_0_0_3_2_1 + 0.00423280423280421*G0_0_0_3_2_2 - 0.00169312169312169*G0_0_0_3_2_5 - 0.00846560846560841*G0_0_0_3_3_0 + 0.00507936507936505*G0_0_0_3_3_1 + 0.121904761904761*G0_0_0_3_3_3 + 0.0135449735449735*G0_0_0_3_3_4 + 0.0203174603174602*G0_0_0_3_3_5 - 0.00169312169312169*G0_0_0_3_4_0 + 0.00169312169312168*G0_0_0_3_4_1 + 0.0135449735449735*G0_0_0_3_4_3 - 0.0135449735449735*G0_0_0_3_4_4 - 0.00338624338624337*G0_0_0_3_5_0 + 0.00338624338624337*G0_0_0_3_5_1 - 0.00169312169312168*G0_0_0_3_5_2 + 0.0203174603174602*G0_0_0_3_5_3 + 0.00677248677248675*G0_0_0_3_5_5 - 0.00634920634920632*G0_0_0_4_0_0 + 0.000423280423280423*G0_0_0_4_0_1 + 0.00338624338624337*G0_0_0_4_0_2 - 0.00169312169312169*G0_0_0_4_0_3 - 0.00507936507936507*G0_0_0_4_0_4 - 0.00338624338624337*G0_0_0_4_0_5 + 0.000423280423280423*G0_0_0_4_1_0 - 0.000423280423280421*G0_0_0_4_1_1 - 0.000846560846560844*G0_0_0_4_1_2 + 0.00169312169312168*G0_0_0_4_1_3 + 0.00846560846560842*G0_0_0_4_1_4 + 0.00338624338624337*G0_0_0_4_1_5 + 0.00338624338624337*G0_0_0_4_2_0 - 0.000846560846560844*G0_0_0_4_2_1 - 0.00423280423280421*G0_0_0_4_2_2 + 0.00169312169312168*G0_0_0_4_2_5 - 0.00169312169312169*G0_0_0_4_3_0 + 0.00169312169312168*G0_0_0_4_3_1 + 0.0135449735449735*G0_0_0_4_3_3 - 0.0135449735449735*G0_0_0_4_3_4 - 0.00507936507936507*G0_0_0_4_4_0 + 0.00846560846560842*G0_0_0_4_4_1 - 0.0135449735449735*G0_0_0_4_4_3 - 0.121904761904761*G0_0_0_4_4_4 - 0.0203174603174602*G0_0_0_4_4_5 - 0.00338624338624337*G0_0_0_4_5_0 + 0.00338624338624337*G0_0_0_4_5_1 + 0.00169312169312168*G0_0_0_4_5_2 - 0.0203174603174602*G0_0_0_4_5_4 - 0.00677248677248674*G0_0_0_4_5_5 - 0.0021164021164021*G0_0_0_5_0_0 + 0.00126984126984126*G0_0_0_5_0_2 - 0.00338624338624337*G0_0_0_5_0_3 - 0.00338624338624337*G0_0_0_5_0_4 - 0.00507936507936504*G0_0_0_5_0_5 + 0.00211640211640209*G0_0_0_5_1_1 - 0.00126984126984126*G0_0_0_5_1_2 + 0.00338624338624337*G0_0_0_5_1_3 + 0.00338624338624337*G0_0_0_5_1_4 + 0.00507936507936504*G0_0_0_5_1_5 + 0.00126984126984126*G0_0_0_5_2_0 - 0.00126984126984126*G0_0_0_5_2_1 - 0.00169312169312168*G0_0_0_5_2_3 + 0.00169312169312169*G0_0_0_5_2_4 - 0.00338624338624337*G0_0_0_5_3_0 + 0.00338624338624337*G0_0_0_5_3_1 - 0.00169312169312169*G0_0_0_5_3_2 + 0.0203174603174602*G0_0_0_5_3_3 + 0.00677248677248675*G0_0_0_5_3_5 - 0.00338624338624337*G0_0_0_5_4_0 + 0.00338624338624337*G0_0_0_5_4_1 + 0.00169312169312168*G0_0_0_5_4_2 - 0.0203174603174602*G0_0_0_5_4_4 - 0.00677248677248674*G0_0_0_5_4_5 - 0.00507936507936504*G0_0_0_5_5_0 + 0.00507936507936504*G0_0_0_5_5_1 + 0.00677248677248675*G0_0_0_5_5_3 - 0.00677248677248674*G0_0_0_5_5_4 - 0.00476190476190472*G0_0_1_0_0_0 + 0.000529100529100525*G0_0_1_0_0_1 + 0.00105820105820105*G0_0_1_0_0_2 - 0.00423280423280421*G0_0_1_0_0_4 - 0.0021164021164021*G0_0_1_0_0_5 + 0.000529100529100525*G0_0_1_0_1_0 - 0.000317460317460315*G0_0_1_0_1_1 + 0.000105820105820104*G0_0_1_0_1_2 + 0.00021164021164021*G0_0_1_0_1_3 + 0.000634920634920633*G0_0_1_0_1_4 + 0.00042328042328042*G0_0_1_0_1_5 + 0.00105820105820105*G0_0_1_0_2_0 + 0.000105820105820104*G0_0_1_0_2_1 - 0.00158730158730157*G0_0_1_0_2_2 - 0.000634920634920629*G0_0_1_0_2_3 + 0.000634920634920635*G0_0_1_0_2_4 + 0.000423280423280421*G0_0_1_0_2_5 + 0.00021164021164021*G0_0_1_0_3_1 - 0.000634920634920629*G0_0_1_0_3_2 - 0.00380952380952378*G0_0_1_0_3_3 - 0.00126984126984126*G0_0_1_0_3_4 - 0.000846560846560844*G0_0_1_0_3_5 - 0.00423280423280421*G0_0_1_0_4_0 + 0.000634920634920633*G0_0_1_0_4_1 + 0.000634920634920635*G0_0_1_0_4_2 - 0.00126984126984126*G0_0_1_0_4_3 - 0.00634920634920632*G0_0_1_0_4_4 - 0.00211640211640211*G0_0_1_0_4_5 - 0.0021164021164021*G0_0_1_0_5_0 + 0.00042328042328042*G0_0_1_0_5_1 + 0.000423280423280421*G0_0_1_0_5_2 - 0.000846560846560843*G0_0_1_0_5_3 - 0.00211640211640211*G0_0_1_0_5_4 - 0.0021164021164021*G0_0_1_0_5_5 + 0.000529100529100525*G0_0_1_1_0_0 - 0.000317460317460315*G0_0_1_1_0_1 + 0.000105820105820104*G0_0_1_1_0_2 + 0.00021164021164021*G0_0_1_1_0_3 + 0.000634920634920633*G0_0_1_1_0_4 + 0.00042328042328042*G0_0_1_1_0_5 - 0.000317460317460315*G0_0_1_1_1_0 + 0.00158730158730157*G0_0_1_1_1_1 + 0.00021164021164021*G0_0_1_1_1_2 + 0.0021164021164021*G0_0_1_1_1_3 - 0.000423280423280421*G0_0_1_1_1_4 + 0.000105820105820104*G0_0_1_1_2_0 + 0.00021164021164021*G0_0_1_1_2_1 - 0.00158730158730158*G0_0_1_1_2_2 - 0.00275132275132274*G0_0_1_1_2_3 - 0.00148148148148147*G0_0_1_1_2_4 - 0.000846560846560843*G0_0_1_1_2_5 + 0.00021164021164021*G0_0_1_1_3_0 + 0.0021164021164021*G0_0_1_1_3_1 - 0.00275132275132274*G0_0_1_1_3_2 - 0.00126984126984126*G0_0_1_1_3_3 + 0.000423280423280421*G0_0_1_1_3_4 + 0.00126984126984126*G0_0_1_1_3_5 + 0.000634920634920633*G0_0_1_1_4_0 - 0.000423280423280421*G0_0_1_1_4_1 - 0.00148148148148147*G0_0_1_1_4_2 + 0.000423280423280421*G0_0_1_1_4_3 + 0.00465608465608464*G0_0_1_1_4_4 + 0.00253968253968253*G0_0_1_1_4_5 + 0.00042328042328042*G0_0_1_1_5_0 - 0.000846560846560843*G0_0_1_1_5_2 + 0.00126984126984126*G0_0_1_1_5_3 + 0.00253968253968253*G0_0_1_1_5_4 + 0.00296296296296294*G0_0_1_1_5_5 + 0.00105820105820105*G0_0_1_2_0_0 + 0.000105820105820104*G0_0_1_2_0_1 - 0.00158730158730158*G0_0_1_2_0_2 - 0.000634920634920629*G0_0_1_2_0_3 + 0.000634920634920635*G0_0_1_2_0_4 + 0.000423280423280421*G0_0_1_2_0_5 + 0.000105820105820104*G0_0_1_2_1_0 + 0.00021164021164021*G0_0_1_2_1_1 - 0.00158730158730158*G0_0_1_2_1_2 - 0.00275132275132274*G0_0_1_2_1_3 - 0.00148148148148147*G0_0_1_2_1_4 - 0.000846560846560843*G0_0_1_2_1_5 - 0.00158730158730158*G0_0_1_2_2_0 - 0.00158730158730158*G0_0_1_2_2_1 + 0.0190476190476189*G0_0_1_2_2_2 + 0.00846560846560841*G0_0_1_2_2_3 + 0.0042328042328042*G0_0_1_2_2_4 - 0.000634920634920629*G0_0_1_2_3_0 - 0.00275132275132274*G0_0_1_2_3_1 + 0.00846560846560841*G0_0_1_2_3_2 + 0.00846560846560841*G0_0_1_2_3_3 + 0.00423280423280421*G0_0_1_2_3_4 + 0.00126984126984127*G0_0_1_2_3_5 + 0.000634920634920635*G0_0_1_2_4_0 - 0.00148148148148147*G0_0_1_2_4_1 + 0.0042328042328042*G0_0_1_2_4_2 + 0.00423280423280421*G0_0_1_2_4_3 + 0.00846560846560842*G0_0_1_2_4_4 + 0.00296296296296295*G0_0_1_2_4_5 + 0.000423280423280421*G0_0_1_2_5_0 - 0.000846560846560843*G0_0_1_2_5_1 + 0.00126984126984127*G0_0_1_2_5_3 + 0.00296296296296295*G0_0_1_2_5_4 + 0.00253968253968253*G0_0_1_2_5_5 + 0.00021164021164021*G0_0_1_3_0_1 - 0.000634920634920629*G0_0_1_3_0_2 - 0.00380952380952378*G0_0_1_3_0_3 - 0.00126984126984126*G0_0_1_3_0_4 - 0.000846560846560843*G0_0_1_3_0_5 + 0.00021164021164021*G0_0_1_3_1_0 + 0.0021164021164021*G0_0_1_3_1_1 - 0.00275132275132274*G0_0_1_3_1_2 - 0.00126984126984126*G0_0_1_3_1_3 + 0.000423280423280421*G0_0_1_3_1_4 + 0.00126984126984126*G0_0_1_3_1_5 - 0.000634920634920629*G0_0_1_3_2_0 - 0.00275132275132274*G0_0_1_3_2_1 + 0.00846560846560841*G0_0_1_3_2_2 + 0.00846560846560841*G0_0_1_3_2_3 + 0.00423280423280421*G0_0_1_3_2_4 + 0.00126984126984127*G0_0_1_3_2_5 - 0.00380952380952378*G0_0_1_3_3_0 - 0.00126984126984126*G0_0_1_3_3_1 + 0.00846560846560841*G0_0_1_3_3_2 + 0.0609523809523806*G0_0_1_3_3_3 + 0.00677248677248675*G0_0_1_3_3_4 + 0.00507936507936507*G0_0_1_3_3_5 - 0.00126984126984126*G0_0_1_3_4_0 + 0.000423280423280421*G0_0_1_3_4_1 + 0.00423280423280421*G0_0_1_3_4_2 + 0.00677248677248675*G0_0_1_3_4_3 - 0.00677248677248674*G0_0_1_3_4_4 - 0.00338624338624337*G0_0_1_3_4_5 - 0.000846560846560843*G0_0_1_3_5_0 + 0.00126984126984126*G0_0_1_3_5_1 + 0.00126984126984127*G0_0_1_3_5_2 + 0.00507936507936507*G0_0_1_3_5_3 - 0.00338624338624337*G0_0_1_3_5_4 - 0.00338624338624336*G0_0_1_3_5_5 - 0.00423280423280421*G0_0_1_4_0_0 + 0.000634920634920633*G0_0_1_4_0_1 + 0.000634920634920635*G0_0_1_4_0_2 - 0.00126984126984126*G0_0_1_4_0_3 - 0.00634920634920632*G0_0_1_4_0_4 - 0.00211640211640211*G0_0_1_4_0_5 + 0.000634920634920633*G0_0_1_4_1_0 - 0.000423280423280421*G0_0_1_4_1_1 - 0.00148148148148147*G0_0_1_4_1_2 + 0.000423280423280421*G0_0_1_4_1_3 + 0.00465608465608464*G0_0_1_4_1_4 + 0.00253968253968253*G0_0_1_4_1_5 + 0.000634920634920635*G0_0_1_4_2_0 - 0.00148148148148147*G0_0_1_4_2_1 + 0.0042328042328042*G0_0_1_4_2_2 + 0.00423280423280421*G0_0_1_4_2_3 + 0.00846560846560842*G0_0_1_4_2_4 + 0.00296296296296295*G0_0_1_4_2_5 - 0.00126984126984126*G0_0_1_4_3_0 + 0.000423280423280421*G0_0_1_4_3_1 + 0.00423280423280421*G0_0_1_4_3_2 + 0.00677248677248675*G0_0_1_4_3_3 - 0.00677248677248674*G0_0_1_4_3_4 - 0.00338624338624337*G0_0_1_4_3_5 - 0.00634920634920632*G0_0_1_4_4_0 + 0.00465608465608464*G0_0_1_4_4_1 + 0.00846560846560842*G0_0_1_4_4_2 - 0.00677248677248674*G0_0_1_4_4_3 - 0.0609523809523807*G0_0_1_4_4_4 - 0.0152380952380952*G0_0_1_4_4_5 - 0.00211640211640211*G0_0_1_4_5_0 + 0.00253968253968253*G0_0_1_4_5_1 + 0.00296296296296295*G0_0_1_4_5_2 - 0.00338624338624337*G0_0_1_4_5_3 - 0.0152380952380952*G0_0_1_4_5_4 - 0.0101587301587301*G0_0_1_4_5_5 - 0.0021164021164021*G0_0_1_5_0_0 + 0.00042328042328042*G0_0_1_5_0_1 + 0.000423280423280421*G0_0_1_5_0_2 - 0.000846560846560843*G0_0_1_5_0_3 - 0.00211640211640211*G0_0_1_5_0_4 - 0.0021164021164021*G0_0_1_5_0_5 + 0.00042328042328042*G0_0_1_5_1_0 - 0.000846560846560843*G0_0_1_5_1_2 + 0.00126984126984126*G0_0_1_5_1_3 + 0.00253968253968253*G0_0_1_5_1_4 + 0.00296296296296294*G0_0_1_5_1_5 + 0.000423280423280421*G0_0_1_5_2_0 - 0.000846560846560843*G0_0_1_5_2_1 + 0.00126984126984127*G0_0_1_5_2_3 + 0.00296296296296295*G0_0_1_5_2_4 + 0.00253968253968253*G0_0_1_5_2_5 - 0.000846560846560843*G0_0_1_5_3_0 + 0.00126984126984126*G0_0_1_5_3_1 + 0.00126984126984127*G0_0_1_5_3_2 + 0.00507936507936507*G0_0_1_5_3_3 - 0.00338624338624337*G0_0_1_5_3_4 - 0.00338624338624336*G0_0_1_5_3_5 - 0.00211640211640211*G0_0_1_5_4_0 + 0.00253968253968253*G0_0_1_5_4_1 + 0.00296296296296295*G0_0_1_5_4_2 - 0.00338624338624337*G0_0_1_5_4_3 - 0.0152380952380952*G0_0_1_5_4_4 - 0.0101587301587301*G0_0_1_5_4_5 - 0.0021164021164021*G0_0_1_5_5_0 + 0.00296296296296294*G0_0_1_5_5_1 + 0.00253968253968253*G0_0_1_5_5_2 - 0.00338624338624336*G0_0_1_5_5_3 - 0.0101587301587301*G0_0_1_5_5_4 - 0.0152380952380951*G0_0_1_5_5_5 + 0.0126984126984126*G0_1_0_0_0_0 - 0.000211640211640213*G0_1_0_0_0_1 - 0.00126984126984126*G0_1_0_0_0_2 + 0.000423280423280421*G0_1_0_0_0_3 + 0.00423280423280421*G0_1_0_0_0_4 - 0.000211640211640213*G0_1_0_0_1_0 - 0.00105820105820105*G0_1_0_0_1_1 + 0.000105820105820105*G0_1_0_0_1_2 - 0.000846560846560839*G0_1_0_0_1_3 - 0.000423280423280422*G0_1_0_0_1_4 + 0.000846560846560843*G0_1_0_0_1_5 - 0.00126984126984126*G0_1_0_0_2_0 + 0.000105820105820105*G0_1_0_0_2_1 + 0.00148148148148147*G0_1_0_0_2_2 + 0.00084656084656084*G0_1_0_0_2_3 + 0.000423280423280419*G0_1_0_0_2_4 + 0.000423280423280421*G0_1_0_0_3_0 - 0.000846560846560839*G0_1_0_0_3_1 + 0.00084656084656084*G0_1_0_0_3_2 - 0.00592592592592588*G0_1_0_0_3_3 - 0.00084656084656084*G0_1_0_0_3_5 + 0.00423280423280421*G0_1_0_0_4_0 - 0.000423280423280422*G0_1_0_0_4_1 + 0.000423280423280419*G0_1_0_0_4_2 + 0.00761904761904758*G0_1_0_0_4_4 + 0.000846560846560846*G0_1_0_0_4_5 + 0.000846560846560843*G0_1_0_0_5_1 - 0.00084656084656084*G0_1_0_0_5_3 + 0.000846560846560847*G0_1_0_0_5_4 - 0.000846560846560832*G0_1_0_0_5_5 - 0.000211640211640213*G0_1_0_1_0_0 - 0.00105820105820105*G0_1_0_1_0_1 + 0.000105820105820105*G0_1_0_1_0_2 - 0.000846560846560839*G0_1_0_1_0_3 - 0.000423280423280422*G0_1_0_1_0_4 + 0.000846560846560843*G0_1_0_1_0_5 - 0.00105820105820105*G0_1_0_1_1_0 + 0.0190476190476189*G0_1_0_1_1_1 - 0.0021164021164021*G0_1_0_1_1_2 + 0.0105820105820105*G0_1_0_1_1_3 + 0.00211640211640209*G0_1_0_1_1_5 + 0.000105820105820105*G0_1_0_1_2_0 - 0.0021164021164021*G0_1_0_1_2_1 + 0.00148148148148147*G0_1_0_1_2_2 - 0.00296296296296295*G0_1_0_1_2_3 - 0.00126984126984126*G0_1_0_1_2_5 - 0.000846560846560839*G0_1_0_1_3_0 + 0.0105820105820105*G0_1_0_1_3_1 - 0.00296296296296295*G0_1_0_1_3_2 + 0.0126984126984126*G0_1_0_1_3_3 + 0.00169312169312168*G0_1_0_1_3_4 + 0.00423280423280421*G0_1_0_1_3_5 - 0.000423280423280422*G0_1_0_1_4_0 + 0.00169312169312168*G0_1_0_1_4_3 + 0.00253968253968252*G0_1_0_1_4_4 + 0.00253968253968253*G0_1_0_1_4_5 + 0.000846560846560843*G0_1_0_1_5_0 + 0.00211640211640209*G0_1_0_1_5_1 - 0.00126984126984126*G0_1_0_1_5_2 + 0.00423280423280421*G0_1_0_1_5_3 + 0.00253968253968253*G0_1_0_1_5_4 + 0.00423280423280419*G0_1_0_1_5_5 - 0.00126984126984126*G0_1_0_2_0_0 + 0.000105820105820105*G0_1_0_2_0_1 + 0.00148148148148147*G0_1_0_2_0_2 + 0.00084656084656084*G0_1_0_2_0_3 + 0.000423280423280419*G0_1_0_2_0_4 + 0.000105820105820105*G0_1_0_2_1_0 - 0.0021164021164021*G0_1_0_2_1_1 + 0.00148148148148147*G0_1_0_2_1_2 - 0.00296296296296295*G0_1_0_2_1_3 - 0.00126984126984126*G0_1_0_2_1_5 + 0.00148148148148147*G0_1_0_2_2_0 + 0.00148148148148147*G0_1_0_2_2_1 - 0.0158730158730158*G0_1_0_2_2_2 - 0.00211640211640211*G0_1_0_2_2_3 - 0.00634920634920631*G0_1_0_2_2_4 - 0.000846560846560846*G0_1_0_2_2_5 + 0.00084656084656084*G0_1_0_2_3_0 - 0.00296296296296295*G0_1_0_2_3_1 - 0.00211640211640211*G0_1_0_2_3_2 - 0.00677248677248673*G0_1_0_2_3_3 - 0.00169312169312168*G0_1_0_2_3_4 + 0.000423280423280419*G0_1_0_2_4_0 - 0.00634920634920631*G0_1_0_2_4_2 - 0.00169312169312168*G0_1_0_2_4_3 - 0.00677248677248674*G0_1_0_2_4_4 + 0.00169312169312168*G0_1_0_2_4_5 - 0.00126984126984126*G0_1_0_2_5_1 - 0.000846560846560846*G0_1_0_2_5_2 + 0.00169312169312168*G0_1_0_2_5_4 + 0.00677248677248674*G0_1_0_2_5_5 + 0.000423280423280421*G0_1_0_3_0_0 - 0.000846560846560839*G0_1_0_3_0_1 + 0.00084656084656084*G0_1_0_3_0_2 - 0.00592592592592588*G0_1_0_3_0_3 - 0.00084656084656084*G0_1_0_3_0_5 - 0.000846560846560839*G0_1_0_3_1_0 + 0.0105820105820105*G0_1_0_3_1_1 - 0.00296296296296295*G0_1_0_3_1_2 + 0.0126984126984126*G0_1_0_3_1_3 + 0.00169312169312168*G0_1_0_3_1_4 + 0.00423280423280421*G0_1_0_3_1_5 + 0.00084656084656084*G0_1_0_3_2_0 - 0.00296296296296295*G0_1_0_3_2_1 - 0.0021164021164021*G0_1_0_3_2_2 - 0.00677248677248673*G0_1_0_3_2_3 - 0.00169312169312168*G0_1_0_3_2_4 - 0.00592592592592588*G0_1_0_3_3_0 + 0.0126984126984126*G0_1_0_3_3_1 - 0.00677248677248674*G0_1_0_3_3_2 + 0.106666666666666*G0_1_0_3_3_3 + 0.00846560846560843*G0_1_0_3_3_4 + 0.0118518518518518*G0_1_0_3_3_5 + 0.00169312169312168*G0_1_0_3_4_1 - 0.00169312169312168*G0_1_0_3_4_2 + 0.00846560846560843*G0_1_0_3_4_3 - 0.00507936507936505*G0_1_0_3_4_4 - 0.00338624338624337*G0_1_0_3_4_5 - 0.00084656084656084*G0_1_0_3_5_0 + 0.00423280423280421*G0_1_0_3_5_1 + 0.0118518518518518*G0_1_0_3_5_3 - 0.00338624338624337*G0_1_0_3_5_4 - 0.0118518518518518*G0_1_0_3_5_5 + 0.00423280423280421*G0_1_0_4_0_0 - 0.000423280423280422*G0_1_0_4_0_1 + 0.000423280423280419*G0_1_0_4_0_2 + 0.00761904761904758*G0_1_0_4_0_4 + 0.000846560846560847*G0_1_0_4_0_5 - 0.000423280423280422*G0_1_0_4_1_0 + 0.00169312169312168*G0_1_0_4_1_3 + 0.00253968253968252*G0_1_0_4_1_4 + 0.00253968253968253*G0_1_0_4_1_5 + 0.000423280423280419*G0_1_0_4_2_0 - 0.00634920634920631*G0_1_0_4_2_2 - 0.00169312169312168*G0_1_0_4_2_3 - 0.00677248677248674*G0_1_0_4_2_4 + 0.00169312169312168*G0_1_0_4_2_5 + 0.00169312169312168*G0_1_0_4_3_1 - 0.00169312169312168*G0_1_0_4_3_2 + 0.00846560846560843*G0_1_0_4_3_3 - 0.00507936507936505*G0_1_0_4_3_4 - 0.00338624338624337*G0_1_0_4_3_5 + 0.00761904761904758*G0_1_0_4_4_0 + 0.00253968253968252*G0_1_0_4_4_1 - 0.00677248677248674*G0_1_0_4_4_2 - 0.00507936507936505*G0_1_0_4_4_3 - 0.0152380952380951*G0_1_0_4_4_4 - 0.00846560846560842*G0_1_0_4_4_5 + 0.000846560846560847*G0_1_0_4_5_0 + 0.00253968253968253*G0_1_0_4_5_1 + 0.00169312169312168*G0_1_0_4_5_2 - 0.00338624338624337*G0_1_0_4_5_3 - 0.00846560846560842*G0_1_0_4_5_4 - 0.0186243386243385*G0_1_0_4_5_5 + 0.000846560846560843*G0_1_0_5_0_1 - 0.00084656084656084*G0_1_0_5_0_3 + 0.000846560846560847*G0_1_0_5_0_4 - 0.000846560846560832*G0_1_0_5_0_5 + 0.000846560846560843*G0_1_0_5_1_0 + 0.00211640211640209*G0_1_0_5_1_1 - 0.00126984126984126*G0_1_0_5_1_2 + 0.00423280423280421*G0_1_0_5_1_3 + 0.00253968253968252*G0_1_0_5_1_4 + 0.00423280423280419*G0_1_0_5_1_5 - 0.00126984126984126*G0_1_0_5_2_1 - 0.000846560846560846*G0_1_0_5_2_2 + 0.00169312169312168*G0_1_0_5_2_4 + 0.00677248677248674*G0_1_0_5_2_5 - 0.00084656084656084*G0_1_0_5_3_0 + 0.00423280423280421*G0_1_0_5_3_1 + 0.0118518518518518*G0_1_0_5_3_3 - 0.00338624338624337*G0_1_0_5_3_4 - 0.0118518518518518*G0_1_0_5_3_5 + 0.000846560846560847*G0_1_0_5_4_0 + 0.00253968253968252*G0_1_0_5_4_1 + 0.00169312169312168*G0_1_0_5_4_2 - 0.00338624338624337*G0_1_0_5_4_3 - 0.00846560846560842*G0_1_0_5_4_4 - 0.0186243386243385*G0_1_0_5_4_5 - 0.000846560846560832*G0_1_0_5_5_0 + 0.00423280423280419*G0_1_0_5_5_1 + 0.00677248677248674*G0_1_0_5_5_2 - 0.0118518518518518*G0_1_0_5_5_3 - 0.0186243386243385*G0_1_0_5_5_4 - 0.106666666666666*G0_1_0_5_5_5 - 0.00476190476190474*G0_1_1_0_0_0 + 0.00105820105820105*G0_1_1_0_0_1 + 0.000529100529100526*G0_1_1_0_0_2 - 0.00211640211640211*G0_1_1_0_0_4 - 0.00423280423280421*G0_1_1_0_0_5 + 0.00105820105820105*G0_1_1_0_1_0 - 0.00158730158730158*G0_1_1_0_1_1 + 0.000105820105820105*G0_1_1_0_1_2 - 0.00063492063492063*G0_1_1_0_1_3 + 0.000423280423280421*G0_1_1_0_1_4 + 0.000634920634920631*G0_1_1_0_1_5 + 0.000529100529100526*G0_1_1_0_2_0 + 0.000105820105820105*G0_1_1_0_2_1 - 0.000317460317460315*G0_1_1_0_2_2 + 0.000211640211640211*G0_1_1_0_2_3 + 0.000423280423280422*G0_1_1_0_2_4 + 0.000634920634920632*G0_1_1_0_2_5 - 0.00063492063492063*G0_1_1_0_3_1 + 0.000211640211640211*G0_1_1_0_3_2 - 0.00380952380952378*G0_1_1_0_3_3 - 0.000846560846560843*G0_1_1_0_3_4 - 0.00126984126984126*G0_1_1_0_3_5 - 0.00211640211640211*G0_1_1_0_4_0 + 0.000423280423280421*G0_1_1_0_4_1 + 0.000423280423280422*G0_1_1_0_4_2 - 0.000846560846560843*G0_1_1_0_4_3 - 0.00211640211640211*G0_1_1_0_4_4 - 0.00211640211640211*G0_1_1_0_4_5 - 0.00423280423280421*G0_1_1_0_5_0 + 0.000634920634920631*G0_1_1_0_5_1 + 0.000634920634920632*G0_1_1_0_5_2 - 0.00126984126984126*G0_1_1_0_5_3 - 0.00211640211640211*G0_1_1_0_5_4 - 0.00634920634920631*G0_1_1_0_5_5 + 0.00105820105820105*G0_1_1_1_0_0 - 0.00158730158730158*G0_1_1_1_0_1 + 0.000105820105820105*G0_1_1_1_0_2 - 0.00063492063492063*G0_1_1_1_0_3 + 0.000423280423280421*G0_1_1_1_0_4 + 0.000634920634920631*G0_1_1_1_0_5 - 0.00158730158730158*G0_1_1_1_1_0 + 0.0190476190476189*G0_1_1_1_1_1 - 0.00158730158730158*G0_1_1_1_1_2 + 0.00846560846560842*G0_1_1_1_1_3 + 0.00423280423280421*G0_1_1_1_1_5 + 0.000105820105820105*G0_1_1_1_2_0 - 0.00158730158730158*G0_1_1_1_2_1 + 0.000211640211640211*G0_1_1_1_2_2 - 0.00275132275132274*G0_1_1_1_2_3 - 0.000846560846560842*G0_1_1_1_2_4 - 0.00148148148148147*G0_1_1_1_2_5 - 0.00063492063492063*G0_1_1_1_3_0 + 0.00846560846560842*G0_1_1_1_3_1 - 0.00275132275132274*G0_1_1_1_3_2 + 0.00846560846560843*G0_1_1_1_3_3 + 0.00126984126984126*G0_1_1_1_3_4 + 0.00423280423280421*G0_1_1_1_3_5 + 0.000423280423280421*G0_1_1_1_4_0 - 0.000846560846560842*G0_1_1_1_4_2 + 0.00126984126984126*G0_1_1_1_4_3 + 0.00253968253968253*G0_1_1_1_4_4 + 0.00296296296296295*G0_1_1_1_4_5 + 0.000634920634920631*G0_1_1_1_5_0 + 0.00423280423280421*G0_1_1_1_5_1 - 0.00148148148148147*G0_1_1_1_5_2 + 0.00423280423280421*G0_1_1_1_5_3 + 0.00296296296296295*G0_1_1_1_5_4 + 0.00846560846560841*G0_1_1_1_5_5 + 0.000529100529100526*G0_1_1_2_0_0 + 0.000105820105820105*G0_1_1_2_0_1 - 0.000317460317460315*G0_1_1_2_0_2 + 0.000211640211640211*G0_1_1_2_0_3 + 0.000423280423280422*G0_1_1_2_0_4 + 0.000634920634920632*G0_1_1_2_0_5 + 0.000105820105820105*G0_1_1_2_1_0 - 0.00158730158730158*G0_1_1_2_1_1 + 0.000211640211640212*G0_1_1_2_1_2 - 0.00275132275132274*G0_1_1_2_1_3 - 0.000846560846560842*G0_1_1_2_1_4 - 0.00148148148148147*G0_1_1_2_1_5 - 0.000317460317460315*G0_1_1_2_2_0 + 0.000211640211640211*G0_1_1_2_2_1 + 0.00158730158730157*G0_1_1_2_2_2 + 0.0021164021164021*G0_1_1_2_2_3 - 0.00042328042328042*G0_1_1_2_2_5 + 0.000211640211640211*G0_1_1_2_3_0 - 0.00275132275132274*G0_1_1_2_3_1 + 0.0021164021164021*G0_1_1_2_3_2 - 0.00126984126984127*G0_1_1_2_3_3 + 0.00126984126984126*G0_1_1_2_3_4 + 0.00042328042328042*G0_1_1_2_3_5 + 0.000423280423280422*G0_1_1_2_4_0 - 0.000846560846560842*G0_1_1_2_4_1 + 0.00126984126984126*G0_1_1_2_4_3 + 0.00296296296296295*G0_1_1_2_4_4 + 0.00253968253968253*G0_1_1_2_4_5 + 0.000634920634920632*G0_1_1_2_5_0 - 0.00148148148148147*G0_1_1_2_5_1 - 0.00042328042328042*G0_1_1_2_5_2 + 0.00042328042328042*G0_1_1_2_5_3 + 0.00253968253968253*G0_1_1_2_5_4 + 0.00465608465608463*G0_1_1_2_5_5 - 0.00063492063492063*G0_1_1_3_0_1 + 0.000211640211640211*G0_1_1_3_0_2 - 0.00380952380952378*G0_1_1_3_0_3 - 0.000846560846560843*G0_1_1_3_0_4 - 0.00126984126984126*G0_1_1_3_0_5 - 0.00063492063492063*G0_1_1_3_1_0 + 0.00846560846560842*G0_1_1_3_1_1 - 0.00275132275132274*G0_1_1_3_1_2 + 0.00846560846560843*G0_1_1_3_1_3 + 0.00126984126984126*G0_1_1_3_1_4 + 0.00423280423280421*G0_1_1_3_1_5 + 0.000211640211640211*G0_1_1_3_2_0 - 0.00275132275132274*G0_1_1_3_2_1 + 0.0021164021164021*G0_1_1_3_2_2 - 0.00126984126984127*G0_1_1_3_2_3 + 0.00126984126984126*G0_1_1_3_2_4 + 0.00042328042328042*G0_1_1_3_2_5 - 0.00380952380952378*G0_1_1_3_3_0 + 0.00846560846560843*G0_1_1_3_3_1 - 0.00126984126984127*G0_1_1_3_3_2 + 0.0609523809523806*G0_1_1_3_3_3 + 0.00507936507936506*G0_1_1_3_3_4 + 0.00677248677248676*G0_1_1_3_3_5 - 0.000846560846560843*G0_1_1_3_4_0 + 0.00126984126984126*G0_1_1_3_4_1 + 0.00126984126984126*G0_1_1_3_4_2 + 0.00507936507936506*G0_1_1_3_4_3 - 0.00338624338624337*G0_1_1_3_4_4 - 0.00338624338624337*G0_1_1_3_4_5 - 0.00126984126984126*G0_1_1_3_5_0 + 0.00423280423280421*G0_1_1_3_5_1 + 0.00042328042328042*G0_1_1_3_5_2 + 0.00677248677248676*G0_1_1_3_5_3 - 0.00338624338624337*G0_1_1_3_5_4 - 0.00677248677248673*G0_1_1_3_5_5 - 0.00211640211640211*G0_1_1_4_0_0 + 0.000423280423280421*G0_1_1_4_0_1 + 0.000423280423280422*G0_1_1_4_0_2 - 0.000846560846560843*G0_1_1_4_0_3 - 0.00211640211640211*G0_1_1_4_0_4 - 0.00211640211640211*G0_1_1_4_0_5 + 0.000423280423280421*G0_1_1_4_1_0 - 0.000846560846560842*G0_1_1_4_1_2 + 0.00126984126984126*G0_1_1_4_1_3 + 0.00253968253968253*G0_1_1_4_1_4 + 0.00296296296296295*G0_1_1_4_1_5 + 0.000423280423280422*G0_1_1_4_2_0 - 0.000846560846560842*G0_1_1_4_2_1 + 0.00126984126984126*G0_1_1_4_2_3 + 0.00296296296296295*G0_1_1_4_2_4 + 0.00253968253968253*G0_1_1_4_2_5 - 0.000846560846560843*G0_1_1_4_3_0 + 0.00126984126984126*G0_1_1_4_3_1 + 0.00126984126984126*G0_1_1_4_3_2 + 0.00507936507936506*G0_1_1_4_3_3 - 0.00338624338624337*G0_1_1_4_3_4 - 0.00338624338624337*G0_1_1_4_3_5 - 0.00211640211640211*G0_1_1_4_4_0 + 0.00253968253968253*G0_1_1_4_4_1 + 0.00296296296296295*G0_1_1_4_4_2 - 0.00338624338624337*G0_1_1_4_4_3 - 0.0152380952380952*G0_1_1_4_4_4 - 0.0101587301587301*G0_1_1_4_4_5 - 0.00211640211640211*G0_1_1_4_5_0 + 0.00296296296296295*G0_1_1_4_5_1 + 0.00253968253968253*G0_1_1_4_5_2 - 0.00338624338624337*G0_1_1_4_5_3 - 0.0101587301587301*G0_1_1_4_5_4 - 0.0152380952380952*G0_1_1_4_5_5 - 0.00423280423280421*G0_1_1_5_0_0 + 0.000634920634920631*G0_1_1_5_0_1 + 0.000634920634920632*G0_1_1_5_0_2 - 0.00126984126984126*G0_1_1_5_0_3 - 0.00211640211640211*G0_1_1_5_0_4 - 0.00634920634920631*G0_1_1_5_0_5 + 0.000634920634920631*G0_1_1_5_1_0 + 0.00423280423280421*G0_1_1_5_1_1 - 0.00148148148148147*G0_1_1_5_1_2 + 0.00423280423280421*G0_1_1_5_1_3 + 0.00296296296296295*G0_1_1_5_1_4 + 0.00846560846560841*G0_1_1_5_1_5 + 0.000634920634920632*G0_1_1_5_2_0 - 0.00148148148148147*G0_1_1_5_2_1 - 0.00042328042328042*G0_1_1_5_2_2 + 0.000423280423280421*G0_1_1_5_2_3 + 0.00253968253968253*G0_1_1_5_2_4 + 0.00465608465608463*G0_1_1_5_2_5 - 0.00126984126984126*G0_1_1_5_3_0 + 0.00423280423280421*G0_1_1_5_3_1 + 0.00042328042328042*G0_1_1_5_3_2 + 0.00677248677248676*G0_1_1_5_3_3 - 0.00338624338624337*G0_1_1_5_3_4 - 0.00677248677248673*G0_1_1_5_3_5 - 0.00211640211640211*G0_1_1_5_4_0 + 0.00296296296296295*G0_1_1_5_4_1 + 0.00253968253968253*G0_1_1_5_4_2 - 0.00338624338624337*G0_1_1_5_4_3 - 0.0101587301587301*G0_1_1_5_4_4 - 0.0152380952380952*G0_1_1_5_4_5 - 0.00634920634920631*G0_1_1_5_5_0 + 0.00846560846560841*G0_1_1_5_5_1 + 0.00465608465608463*G0_1_1_5_5_2 - 0.00677248677248673*G0_1_1_5_5_3 - 0.0152380952380952*G0_1_1_5_5_4 - 0.0609523809523806*G0_1_1_5_5_5; + A[3] = A[18] + 0.000529100529100525*G0_0_1_0_0_1 - 0.000529100529100526*G0_0_1_0_0_2 + 0.0021164021164021*G0_0_1_0_0_4 - 0.0021164021164021*G0_0_1_0_0_5 + 0.000529100529100525*G0_0_1_0_1_0 - 0.00126984126984126*G0_0_1_0_1_1 - 0.00084656084656084*G0_0_1_0_1_3 - 0.000211640211640211*G0_0_1_0_1_4 + 0.000211640211640211*G0_0_1_0_1_5 - 0.000529100529100526*G0_0_1_0_2_0 + 0.00126984126984126*G0_0_1_0_2_2 + 0.000846560846560839*G0_0_1_0_2_3 - 0.000211640211640214*G0_0_1_0_2_4 + 0.00021164021164021*G0_0_1_0_2_5 - 0.00084656084656084*G0_0_1_0_3_1 + 0.00084656084656084*G0_0_1_0_3_2 + 0.000423280423280421*G0_0_1_0_3_4 - 0.000423280423280419*G0_0_1_0_3_5 + 0.0021164021164021*G0_0_1_0_4_0 - 0.000211640211640211*G0_0_1_0_4_1 - 0.000211640211640213*G0_0_1_0_4_2 + 0.000423280423280421*G0_0_1_0_4_3 + 0.00423280423280421*G0_0_1_0_4_4 - 0.00211640211640211*G0_0_1_0_5_0 + 0.000211640211640211*G0_0_1_0_5_1 + 0.00021164021164021*G0_0_1_0_5_2 - 0.000423280423280419*G0_0_1_0_5_3 - 0.0042328042328042*G0_0_1_0_5_5 + 0.000529100529100525*G0_0_1_1_0_0 - 0.00126984126984126*G0_0_1_1_0_1 - 0.00084656084656084*G0_0_1_1_0_3 - 0.000211640211640211*G0_0_1_1_0_4 + 0.000211640211640212*G0_0_1_1_0_5 - 0.00126984126984126*G0_0_1_1_1_0 + 0.0174603174603173*G0_0_1_1_1_1 - 0.00179894179894179*G0_0_1_1_1_2 + 0.00634920634920631*G0_0_1_1_1_3 + 0.000423280423280422*G0_0_1_1_1_4 + 0.00423280423280421*G0_0_1_1_1_5 - 0.00179894179894179*G0_0_1_1_2_1 + 0.00179894179894179*G0_0_1_1_2_2 + 0.000634920634920631*G0_0_1_1_2_4 - 0.00063492063492063*G0_0_1_1_2_5 - 0.00084656084656084*G0_0_1_1_3_0 + 0.00634920634920631*G0_0_1_1_3_1 + 0.00973544973544968*G0_0_1_1_3_3 + 0.000846560846560842*G0_0_1_1_3_4 + 0.00296296296296295*G0_0_1_1_3_5 - 0.000211640211640211*G0_0_1_1_4_0 + 0.000423280423280422*G0_0_1_1_4_1 + 0.000634920634920631*G0_0_1_1_4_2 + 0.000846560846560842*G0_0_1_1_4_3 - 0.00211640211640211*G0_0_1_1_4_4 + 0.00042328042328042*G0_0_1_1_4_5 + 0.000211640211640211*G0_0_1_1_5_0 + 0.00423280423280421*G0_0_1_1_5_1 - 0.00063492063492063*G0_0_1_1_5_2 + 0.00296296296296295*G0_0_1_1_5_3 + 0.00042328042328042*G0_0_1_1_5_4 + 0.00550264550264546*G0_0_1_1_5_5 - 0.000529100529100526*G0_0_1_2_0_0 + 0.00126984126984126*G0_0_1_2_0_2 + 0.000846560846560839*G0_0_1_2_0_3 - 0.000211640211640213*G0_0_1_2_0_4 + 0.00021164021164021*G0_0_1_2_0_5 - 0.00179894179894179*G0_0_1_2_1_1 + 0.00179894179894179*G0_0_1_2_1_2 + 0.000634920634920631*G0_0_1_2_1_4 - 0.00063492063492063*G0_0_1_2_1_5 + 0.00126984126984126*G0_0_1_2_2_0 + 0.00179894179894179*G0_0_1_2_2_1 - 0.0174603174603174*G0_0_1_2_2_2 - 0.00634920634920631*G0_0_1_2_2_3 - 0.0042328042328042*G0_0_1_2_2_4 - 0.000423280423280425*G0_0_1_2_2_5 + 0.000846560846560839*G0_0_1_2_3_0 - 0.00634920634920631*G0_0_1_2_3_2 - 0.00973544973544967*G0_0_1_2_3_3 - 0.00296296296296294*G0_0_1_2_3_4 - 0.000846560846560844*G0_0_1_2_3_5 - 0.000211640211640213*G0_0_1_2_4_0 + 0.000634920634920631*G0_0_1_2_4_1 - 0.0042328042328042*G0_0_1_2_4_2 - 0.00296296296296295*G0_0_1_2_4_3 - 0.00550264550264547*G0_0_1_2_4_4 - 0.000423280423280424*G0_0_1_2_4_5 + 0.00021164021164021*G0_0_1_2_5_0 - 0.00063492063492063*G0_0_1_2_5_1 - 0.000423280423280425*G0_0_1_2_5_2 - 0.000846560846560844*G0_0_1_2_5_3 - 0.000423280423280424*G0_0_1_2_5_4 + 0.0021164021164021*G0_0_1_2_5_5 - 0.00084656084656084*G0_0_1_3_0_1 + 0.000846560846560839*G0_0_1_3_0_2 + 0.000423280423280421*G0_0_1_3_0_4 - 0.000423280423280419*G0_0_1_3_0_5 - 0.00084656084656084*G0_0_1_3_1_0 + 0.00634920634920631*G0_0_1_3_1_1 + 0.00973544973544968*G0_0_1_3_1_3 + 0.000846560846560842*G0_0_1_3_1_4 + 0.00296296296296295*G0_0_1_3_1_5 + 0.00084656084656084*G0_0_1_3_2_0 - 0.00634920634920631*G0_0_1_3_2_2 - 0.00973544973544967*G0_0_1_3_2_3 - 0.00296296296296294*G0_0_1_3_2_4 - 0.000846560846560845*G0_0_1_3_2_5 + 0.00973544973544968*G0_0_1_3_3_1 - 0.00973544973544967*G0_0_1_3_3_2 - 0.00169312169312168*G0_0_1_3_3_4 + 0.00169312169312168*G0_0_1_3_3_5 + 0.000423280423280422*G0_0_1_3_4_0 + 0.000846560846560842*G0_0_1_3_4_1 - 0.00296296296296294*G0_0_1_3_4_2 - 0.00169312169312168*G0_0_1_3_4_3 + 0.00338624338624337*G0_0_1_3_4_4 - 0.000423280423280419*G0_0_1_3_5_0 + 0.00296296296296295*G0_0_1_3_5_1 - 0.000846560846560845*G0_0_1_3_5_2 + 0.00169312169312168*G0_0_1_3_5_3 - 0.00338624338624337*G0_0_1_3_5_5 + 0.0021164021164021*G0_0_1_4_0_0 - 0.000211640211640211*G0_0_1_4_0_1 - 0.000211640211640213*G0_0_1_4_0_2 + 0.000423280423280421*G0_0_1_4_0_3 + 0.00423280423280421*G0_0_1_4_0_4 - 0.000211640211640211*G0_0_1_4_1_0 + 0.000423280423280422*G0_0_1_4_1_1 + 0.000634920634920631*G0_0_1_4_1_2 + 0.000846560846560842*G0_0_1_4_1_3 - 0.00211640211640211*G0_0_1_4_1_4 + 0.00042328042328042*G0_0_1_4_1_5 - 0.000211640211640213*G0_0_1_4_2_0 + 0.000634920634920631*G0_0_1_4_2_1 - 0.0042328042328042*G0_0_1_4_2_2 - 0.00296296296296294*G0_0_1_4_2_3 - 0.00550264550264547*G0_0_1_4_2_4 - 0.000423280423280424*G0_0_1_4_2_5 + 0.000423280423280421*G0_0_1_4_3_0 + 0.000846560846560842*G0_0_1_4_3_1 - 0.00296296296296294*G0_0_1_4_3_2 - 0.00169312169312169*G0_0_1_4_3_3 + 0.00338624338624337*G0_0_1_4_3_4 + 0.00423280423280421*G0_0_1_4_4_0 - 0.00211640211640211*G0_0_1_4_4_1 - 0.00550264550264547*G0_0_1_4_4_2 + 0.00338624338624337*G0_0_1_4_4_3 + 0.0457142857142855*G0_0_1_4_4_4 + 0.00507936507936506*G0_0_1_4_4_5 + 0.00042328042328042*G0_0_1_4_5_1 - 0.000423280423280424*G0_0_1_4_5_2 + 0.00507936507936506*G0_0_1_4_5_4 - 0.00507936507936505*G0_0_1_4_5_5 - 0.00211640211640211*G0_0_1_5_0_0 + 0.000211640211640211*G0_0_1_5_0_1 + 0.00021164021164021*G0_0_1_5_0_2 - 0.000423280423280419*G0_0_1_5_0_3 - 0.0042328042328042*G0_0_1_5_0_5 + 0.000211640211640212*G0_0_1_5_1_0 + 0.00423280423280421*G0_0_1_5_1_1 - 0.00063492063492063*G0_0_1_5_1_2 + 0.00296296296296295*G0_0_1_5_1_3 + 0.00042328042328042*G0_0_1_5_1_4 + 0.00550264550264546*G0_0_1_5_1_5 + 0.00021164021164021*G0_0_1_5_2_0 - 0.00063492063492063*G0_0_1_5_2_1 - 0.000423280423280425*G0_0_1_5_2_2 - 0.000846560846560844*G0_0_1_5_2_3 - 0.000423280423280424*G0_0_1_5_2_4 + 0.00211640211640211*G0_0_1_5_2_5 - 0.000423280423280419*G0_0_1_5_3_0 + 0.00296296296296295*G0_0_1_5_3_1 - 0.000846560846560845*G0_0_1_5_3_2 + 0.00169312169312168*G0_0_1_5_3_3 - 0.00338624338624337*G0_0_1_5_3_5 + 0.00042328042328042*G0_0_1_5_4_1 - 0.000423280423280424*G0_0_1_5_4_2 + 0.00507936507936506*G0_0_1_5_4_4 - 0.00507936507936505*G0_0_1_5_4_5 - 0.0042328042328042*G0_0_1_5_5_0 + 0.00550264550264546*G0_0_1_5_5_1 + 0.0021164021164021*G0_0_1_5_5_2 - 0.00338624338624337*G0_0_1_5_5_3 - 0.00507936507936505*G0_0_1_5_5_4 - 0.0457142857142855*G0_0_1_5_5_5 - 0.000529100529100525*G0_1_0_0_0_1 + 0.000529100529100526*G0_1_0_0_0_2 - 0.0021164021164021*G0_1_0_0_0_4 + 0.00211640211640211*G0_1_0_0_0_5 - 0.000529100529100525*G0_1_0_0_1_0 + 0.00126984126984126*G0_1_0_0_1_1 + 0.00084656084656084*G0_1_0_0_1_3 + 0.000211640211640211*G0_1_0_0_1_4 - 0.000211640211640211*G0_1_0_0_1_5 + 0.000529100529100526*G0_1_0_0_2_0 - 0.00126984126984126*G0_1_0_0_2_2 - 0.000846560846560839*G0_1_0_0_2_3 + 0.000211640211640213*G0_1_0_0_2_4 - 0.00021164021164021*G0_1_0_0_2_5 + 0.00084656084656084*G0_1_0_0_3_1 - 0.000846560846560839*G0_1_0_0_3_2 - 0.000423280423280421*G0_1_0_0_3_4 + 0.000423280423280419*G0_1_0_0_3_5 - 0.0021164021164021*G0_1_0_0_4_0 + 0.000211640211640211*G0_1_0_0_4_1 + 0.000211640211640213*G0_1_0_0_4_2 - 0.000423280423280421*G0_1_0_0_4_3 - 0.00423280423280421*G0_1_0_0_4_4 + 0.00211640211640211*G0_1_0_0_5_0 - 0.000211640211640211*G0_1_0_0_5_1 - 0.00021164021164021*G0_1_0_0_5_2 + 0.000423280423280419*G0_1_0_0_5_3 + 0.0042328042328042*G0_1_0_0_5_5 - 0.000529100529100525*G0_1_0_1_0_0 + 0.00126984126984126*G0_1_0_1_0_1 + 0.00084656084656084*G0_1_0_1_0_3 + 0.000211640211640211*G0_1_0_1_0_4 - 0.000211640211640211*G0_1_0_1_0_5 + 0.00126984126984126*G0_1_0_1_1_0 - 0.0174603174603173*G0_1_0_1_1_1 + 0.00179894179894179*G0_1_0_1_1_2 - 0.00634920634920631*G0_1_0_1_1_3 - 0.000423280423280422*G0_1_0_1_1_4 - 0.00423280423280421*G0_1_0_1_1_5 + 0.00179894179894179*G0_1_0_1_2_1 - 0.00179894179894179*G0_1_0_1_2_2 - 0.000634920634920631*G0_1_0_1_2_4 + 0.00063492063492063*G0_1_0_1_2_5 + 0.00084656084656084*G0_1_0_1_3_0 - 0.00634920634920631*G0_1_0_1_3_1 - 0.00973544973544968*G0_1_0_1_3_3 - 0.000846560846560842*G0_1_0_1_3_4 - 0.00296296296296295*G0_1_0_1_3_5 + 0.000211640211640211*G0_1_0_1_4_0 - 0.000423280423280422*G0_1_0_1_4_1 - 0.000634920634920631*G0_1_0_1_4_2 - 0.000846560846560842*G0_1_0_1_4_3 + 0.00211640211640211*G0_1_0_1_4_4 - 0.00042328042328042*G0_1_0_1_4_5 - 0.000211640211640211*G0_1_0_1_5_0 - 0.00423280423280421*G0_1_0_1_5_1 + 0.00063492063492063*G0_1_0_1_5_2 - 0.00296296296296295*G0_1_0_1_5_3 - 0.00042328042328042*G0_1_0_1_5_4 - 0.00550264550264546*G0_1_0_1_5_5 + 0.000529100529100526*G0_1_0_2_0_0 - 0.00126984126984126*G0_1_0_2_0_2 - 0.000846560846560839*G0_1_0_2_0_3 + 0.000211640211640213*G0_1_0_2_0_4 - 0.00021164021164021*G0_1_0_2_0_5 + 0.00179894179894179*G0_1_0_2_1_1 - 0.00179894179894179*G0_1_0_2_1_2 - 0.000634920634920631*G0_1_0_2_1_4 + 0.00063492063492063*G0_1_0_2_1_5 - 0.00126984126984126*G0_1_0_2_2_0 - 0.00179894179894179*G0_1_0_2_2_1 + 0.0174603174603174*G0_1_0_2_2_2 + 0.00634920634920631*G0_1_0_2_2_3 + 0.0042328042328042*G0_1_0_2_2_4 + 0.000423280423280425*G0_1_0_2_2_5 - 0.000846560846560839*G0_1_0_2_3_0 + 0.00634920634920631*G0_1_0_2_3_2 + 0.00973544973544968*G0_1_0_2_3_3 + 0.00296296296296294*G0_1_0_2_3_4 + 0.000846560846560845*G0_1_0_2_3_5 + 0.000211640211640213*G0_1_0_2_4_0 - 0.000634920634920631*G0_1_0_2_4_1 + 0.0042328042328042*G0_1_0_2_4_2 + 0.00296296296296295*G0_1_0_2_4_3 + 0.00550264550264547*G0_1_0_2_4_4 + 0.000423280423280424*G0_1_0_2_4_5 - 0.00021164021164021*G0_1_0_2_5_0 + 0.00063492063492063*G0_1_0_2_5_1 + 0.000423280423280425*G0_1_0_2_5_2 + 0.000846560846560845*G0_1_0_2_5_3 + 0.000423280423280424*G0_1_0_2_5_4 - 0.0021164021164021*G0_1_0_2_5_5 + 0.00084656084656084*G0_1_0_3_0_1 - 0.000846560846560839*G0_1_0_3_0_2 - 0.000423280423280421*G0_1_0_3_0_4 + 0.000423280423280419*G0_1_0_3_0_5 + 0.00084656084656084*G0_1_0_3_1_0 - 0.00634920634920631*G0_1_0_3_1_1 - 0.00973544973544968*G0_1_0_3_1_3 - 0.000846560846560842*G0_1_0_3_1_4 - 0.00296296296296295*G0_1_0_3_1_5 - 0.00084656084656084*G0_1_0_3_2_0 + 0.00634920634920631*G0_1_0_3_2_2 + 0.00973544973544968*G0_1_0_3_2_3 + 0.00296296296296294*G0_1_0_3_2_4 + 0.000846560846560845*G0_1_0_3_2_5 - 0.00973544973544968*G0_1_0_3_3_1 + 0.00973544973544967*G0_1_0_3_3_2 + 0.00169312169312169*G0_1_0_3_3_4 - 0.00169312169312168*G0_1_0_3_3_5 - 0.000423280423280421*G0_1_0_3_4_0 - 0.000846560846560842*G0_1_0_3_4_1 + 0.00296296296296295*G0_1_0_3_4_2 + 0.00169312169312168*G0_1_0_3_4_3 - 0.00338624338624337*G0_1_0_3_4_4 + 0.00042328042328042*G0_1_0_3_5_0 - 0.00296296296296295*G0_1_0_3_5_1 + 0.000846560846560845*G0_1_0_3_5_2 - 0.00169312169312168*G0_1_0_3_5_3 + 0.00338624338624337*G0_1_0_3_5_5 - 0.0021164021164021*G0_1_0_4_0_0 + 0.000211640211640211*G0_1_0_4_0_1 + 0.000211640211640213*G0_1_0_4_0_2 - 0.000423280423280421*G0_1_0_4_0_3 - 0.00423280423280421*G0_1_0_4_0_4 + 0.000211640211640211*G0_1_0_4_1_0 - 0.000423280423280422*G0_1_0_4_1_1 - 0.000634920634920631*G0_1_0_4_1_2 - 0.000846560846560842*G0_1_0_4_1_3 + 0.00211640211640211*G0_1_0_4_1_4 - 0.00042328042328042*G0_1_0_4_1_5 + 0.000211640211640213*G0_1_0_4_2_0 - 0.000634920634920631*G0_1_0_4_2_1 + 0.0042328042328042*G0_1_0_4_2_2 + 0.00296296296296294*G0_1_0_4_2_3 + 0.00550264550264547*G0_1_0_4_2_4 + 0.000423280423280424*G0_1_0_4_2_5 - 0.000423280423280421*G0_1_0_4_3_0 - 0.000846560846560842*G0_1_0_4_3_1 + 0.00296296296296295*G0_1_0_4_3_2 + 0.00169312169312169*G0_1_0_4_3_3 - 0.00338624338624337*G0_1_0_4_3_4 - 0.00423280423280421*G0_1_0_4_4_0 + 0.00211640211640211*G0_1_0_4_4_1 + 0.00550264550264547*G0_1_0_4_4_2 - 0.00338624338624337*G0_1_0_4_4_3 - 0.0457142857142855*G0_1_0_4_4_4 - 0.00507936507936506*G0_1_0_4_4_5 - 0.00042328042328042*G0_1_0_4_5_1 + 0.000423280423280424*G0_1_0_4_5_2 - 0.00507936507936506*G0_1_0_4_5_4 + 0.00507936507936505*G0_1_0_4_5_5 + 0.00211640211640211*G0_1_0_5_0_0 - 0.000211640211640211*G0_1_0_5_0_1 - 0.00021164021164021*G0_1_0_5_0_2 + 0.000423280423280419*G0_1_0_5_0_3 + 0.0042328042328042*G0_1_0_5_0_5 - 0.000211640211640212*G0_1_0_5_1_0 - 0.00423280423280421*G0_1_0_5_1_1 + 0.000634920634920631*G0_1_0_5_1_2 - 0.00296296296296295*G0_1_0_5_1_3 - 0.00042328042328042*G0_1_0_5_1_4 - 0.00550264550264546*G0_1_0_5_1_5 - 0.00021164021164021*G0_1_0_5_2_0 + 0.000634920634920631*G0_1_0_5_2_1 + 0.000423280423280425*G0_1_0_5_2_2 + 0.000846560846560845*G0_1_0_5_2_3 + 0.000423280423280424*G0_1_0_5_2_4 - 0.00211640211640211*G0_1_0_5_2_5 + 0.000423280423280419*G0_1_0_5_3_0 - 0.00296296296296295*G0_1_0_5_3_1 + 0.000846560846560845*G0_1_0_5_3_2 - 0.00169312169312168*G0_1_0_5_3_3 + 0.00338624338624337*G0_1_0_5_3_5 - 0.00042328042328042*G0_1_0_5_4_1 + 0.000423280423280424*G0_1_0_5_4_2 - 0.00507936507936506*G0_1_0_5_4_4 + 0.00507936507936505*G0_1_0_5_4_5 + 0.0042328042328042*G0_1_0_5_5_0 - 0.00550264550264546*G0_1_0_5_5_1 - 0.0021164021164021*G0_1_0_5_5_2 + 0.00338624338624337*G0_1_0_5_5_3 + 0.00507936507936505*G0_1_0_5_5_4 + 0.0457142857142855*G0_1_0_5_5_5; + A[24] = -A[18] - 0.0634920634920632*G0_1_0_0_0_0 + 0.00634920634920632*G0_1_0_0_0_1 + 0.00529100529100527*G0_1_0_0_0_2 - 0.00211640211640211*G0_1_0_0_0_3 - 0.0232804232804232*G0_1_0_0_0_4 - 0.0275132275132274*G0_1_0_0_0_5 + 0.00634920634920632*G0_1_0_0_1_0 - 0.00253968253968252*G0_1_0_0_1_1 - 0.000740740740740737*G0_1_0_0_1_2 - 0.000423280423280419*G0_1_0_0_1_3 + 0.00296296296296295*G0_1_0_0_1_4 + 0.00550264550264547*G0_1_0_0_1_5 + 0.00529100529100527*G0_1_0_0_2_0 - 0.000740740740740737*G0_1_0_0_2_1 + 0.00126984126984126*G0_1_0_0_2_3 + 0.00507936507936506*G0_1_0_0_2_4 + 0.00338624338624337*G0_1_0_0_2_5 - 0.00211640211640211*G0_1_0_0_3_0 - 0.000423280423280419*G0_1_0_0_3_1 + 0.00126984126984126*G0_1_0_0_3_2 - 0.000846560846560841*G0_1_0_0_3_3 - 0.00169312169312169*G0_1_0_0_3_4 - 0.00253968253968253*G0_1_0_0_3_5 - 0.0232804232804232*G0_1_0_0_4_0 + 0.00296296296296295*G0_1_0_0_4_1 + 0.00507936507936506*G0_1_0_0_4_2 - 0.00169312169312169*G0_1_0_0_4_3 - 0.0211640211640211*G0_1_0_0_4_4 - 0.0126984126984126*G0_1_0_0_4_5 - 0.0275132275132274*G0_1_0_0_5_0 + 0.00550264550264547*G0_1_0_0_5_1 + 0.00338624338624337*G0_1_0_0_5_2 - 0.00253968253968253*G0_1_0_0_5_3 - 0.0126984126984126*G0_1_0_0_5_4 - 0.0296296296296295*G0_1_0_0_5_5 + 0.00634920634920632*G0_1_0_1_0_0 - 0.00253968253968252*G0_1_0_1_0_1 - 0.000740740740740737*G0_1_0_1_0_2 - 0.000423280423280419*G0_1_0_1_0_3 + 0.00296296296296295*G0_1_0_1_0_4 + 0.00550264550264547*G0_1_0_1_0_5 - 0.00253968253968252*G0_1_0_1_1_0 + 0.0190476190476189*G0_1_0_1_1_1 - 0.00148148148148147*G0_1_0_1_1_2 + 0.00634920634920631*G0_1_0_1_1_3 - 0.00126984126984126*G0_1_0_1_1_4 + 0.0021164021164021*G0_1_0_1_1_5 - 0.000740740740740737*G0_1_0_1_2_0 - 0.00148148148148147*G0_1_0_1_2_1 + 0.00211640211640211*G0_1_0_1_2_2 - 0.000846560846560843*G0_1_0_1_2_3 - 0.00126984126984126*G0_1_0_1_2_4 - 0.00253968253968253*G0_1_0_1_2_5 - 0.000423280423280419*G0_1_0_1_3_0 + 0.00634920634920631*G0_1_0_1_3_1 - 0.000846560846560843*G0_1_0_1_3_2 + 0.011005291005291*G0_1_0_1_3_3 + 0.00338624338624337*G0_1_0_1_3_4 + 0.0059259259259259*G0_1_0_1_3_5 + 0.00296296296296295*G0_1_0_1_4_0 - 0.00126984126984126*G0_1_0_1_4_1 - 0.00126984126984126*G0_1_0_1_4_2 + 0.00338624338624337*G0_1_0_1_4_3 + 0.00761904761904758*G0_1_0_1_4_4 + 0.00761904761904758*G0_1_0_1_4_5 + 0.00550264550264547*G0_1_0_1_5_0 + 0.0021164021164021*G0_1_0_1_5_1 - 0.00253968253968253*G0_1_0_1_5_2 + 0.0059259259259259*G0_1_0_1_5_3 + 0.00761904761904758*G0_1_0_1_5_4 + 0.0194708994708993*G0_1_0_1_5_5 + 0.00529100529100527*G0_1_0_2_0_0 - 0.000740740740740737*G0_1_0_2_0_1 + 0.00126984126984126*G0_1_0_2_0_3 + 0.00507936507936506*G0_1_0_2_0_4 + 0.00338624338624337*G0_1_0_2_0_5 - 0.000740740740740737*G0_1_0_2_1_0 - 0.00148148148148147*G0_1_0_2_1_1 + 0.00211640211640211*G0_1_0_2_1_2 - 0.000846560846560843*G0_1_0_2_1_3 - 0.00126984126984126*G0_1_0_2_1_4 - 0.00253968253968253*G0_1_0_2_1_5 + 0.00211640211640211*G0_1_0_2_2_1 - 0.0158730158730158*G0_1_0_2_2_2 - 0.00634920634920632*G0_1_0_2_2_3 - 0.00634920634920632*G0_1_0_2_2_4 - 0.00211640211640211*G0_1_0_2_2_5 + 0.00126984126984126*G0_1_0_2_3_0 - 0.000846560846560843*G0_1_0_2_3_1 - 0.00634920634920632*G0_1_0_2_3_2 - 0.00846560846560842*G0_1_0_2_3_3 + 0.00169312169312168*G0_1_0_2_3_5 + 0.00507936507936506*G0_1_0_2_4_0 - 0.00126984126984126*G0_1_0_2_4_1 - 0.00634920634920632*G0_1_0_2_4_2 + 0.00846560846560843*G0_1_0_2_4_4 + 0.00677248677248674*G0_1_0_2_4_5 + 0.00338624338624337*G0_1_0_2_5_0 - 0.00253968253968253*G0_1_0_2_5_1 - 0.00211640211640211*G0_1_0_2_5_2 + 0.00169312169312168*G0_1_0_2_5_3 + 0.00677248677248674*G0_1_0_2_5_4 + 0.0118518518518518*G0_1_0_2_5_5 - 0.00211640211640211*G0_1_0_3_0_0 - 0.000423280423280418*G0_1_0_3_0_1 + 0.00126984126984126*G0_1_0_3_0_2 - 0.000846560846560841*G0_1_0_3_0_3 - 0.00169312169312169*G0_1_0_3_0_4 - 0.00253968253968253*G0_1_0_3_0_5 - 0.000423280423280419*G0_1_0_3_1_0 + 0.00634920634920631*G0_1_0_3_1_1 - 0.000846560846560843*G0_1_0_3_1_2 + 0.011005291005291*G0_1_0_3_1_3 + 0.00338624338624337*G0_1_0_3_1_4 + 0.0059259259259259*G0_1_0_3_1_5 + 0.00126984126984126*G0_1_0_3_2_0 - 0.000846560846560843*G0_1_0_3_2_1 - 0.00634920634920632*G0_1_0_3_2_2 - 0.00846560846560842*G0_1_0_3_2_3 + 0.00169312169312168*G0_1_0_3_2_5 - 0.000846560846560842*G0_1_0_3_3_0 + 0.011005291005291*G0_1_0_3_3_1 - 0.00846560846560842*G0_1_0_3_3_2 + 0.00507936507936507*G0_1_0_3_3_3 - 0.00507936507936506*G0_1_0_3_3_4 - 0.00169312169312168*G0_1_0_3_3_5 - 0.00169312169312169*G0_1_0_3_4_0 + 0.00338624338624337*G0_1_0_3_4_1 - 0.00507936507936506*G0_1_0_3_4_3 - 0.0118518518518518*G0_1_0_3_4_4 - 0.0101587301587301*G0_1_0_3_4_5 - 0.00253968253968253*G0_1_0_3_5_0 + 0.0059259259259259*G0_1_0_3_5_1 + 0.00169312169312168*G0_1_0_3_5_2 - 0.00169312169312168*G0_1_0_3_5_3 - 0.0101587301587301*G0_1_0_3_5_4 - 0.0186243386243385*G0_1_0_3_5_5 - 0.0232804232804232*G0_1_0_4_0_0 + 0.00296296296296295*G0_1_0_4_0_1 + 0.00507936507936506*G0_1_0_4_0_2 - 0.00169312169312169*G0_1_0_4_0_3 - 0.0211640211640211*G0_1_0_4_0_4 - 0.0126984126984126*G0_1_0_4_0_5 + 0.00296296296296295*G0_1_0_4_1_0 - 0.00126984126984126*G0_1_0_4_1_1 - 0.00126984126984126*G0_1_0_4_1_2 + 0.00338624338624337*G0_1_0_4_1_3 + 0.00761904761904758*G0_1_0_4_1_4 + 0.00761904761904758*G0_1_0_4_1_5 + 0.00507936507936506*G0_1_0_4_2_0 - 0.00126984126984126*G0_1_0_4_2_1 - 0.00634920634920632*G0_1_0_4_2_2 + 0.00846560846560843*G0_1_0_4_2_4 + 0.00677248677248674*G0_1_0_4_2_5 - 0.00169312169312169*G0_1_0_4_3_0 + 0.00338624338624337*G0_1_0_4_3_1 - 0.00507936507936506*G0_1_0_4_3_3 - 0.0118518518518518*G0_1_0_4_3_4 - 0.0101587301587301*G0_1_0_4_3_5 - 0.0211640211640211*G0_1_0_4_4_0 + 0.00761904761904758*G0_1_0_4_4_1 + 0.00846560846560843*G0_1_0_4_4_2 - 0.0118518518518518*G0_1_0_4_4_3 - 0.0558730158730156*G0_1_0_4_4_4 - 0.0287830687830687*G0_1_0_4_4_5 - 0.0126984126984126*G0_1_0_4_5_0 + 0.00761904761904758*G0_1_0_4_5_1 + 0.00677248677248674*G0_1_0_4_5_2 - 0.0101587301587301*G0_1_0_4_5_3 - 0.0287830687830687*G0_1_0_4_5_4 - 0.0389417989417987*G0_1_0_4_5_5 - 0.0275132275132274*G0_1_0_5_0_0 + 0.00550264550264547*G0_1_0_5_0_1 + 0.00338624338624337*G0_1_0_5_0_2 - 0.00253968253968253*G0_1_0_5_0_3 - 0.0126984126984126*G0_1_0_5_0_4 - 0.0296296296296295*G0_1_0_5_0_5 + 0.00550264550264548*G0_1_0_5_1_0 + 0.0021164021164021*G0_1_0_5_1_1 - 0.00253968253968253*G0_1_0_5_1_2 + 0.0059259259259259*G0_1_0_5_1_3 + 0.00761904761904758*G0_1_0_5_1_4 + 0.0194708994708993*G0_1_0_5_1_5 + 0.00338624338624337*G0_1_0_5_2_0 - 0.00253968253968253*G0_1_0_5_2_1 - 0.00211640211640211*G0_1_0_5_2_2 + 0.00169312169312168*G0_1_0_5_2_3 + 0.00677248677248674*G0_1_0_5_2_4 + 0.0118518518518518*G0_1_0_5_2_5 - 0.00253968253968253*G0_1_0_5_3_0 + 0.0059259259259259*G0_1_0_5_3_1 + 0.00169312169312168*G0_1_0_5_3_2 - 0.00169312169312168*G0_1_0_5_3_3 - 0.0101587301587301*G0_1_0_5_3_4 - 0.0186243386243385*G0_1_0_5_3_5 - 0.0126984126984126*G0_1_0_5_4_0 + 0.00761904761904758*G0_1_0_5_4_1 + 0.00677248677248674*G0_1_0_5_4_2 - 0.0101587301587301*G0_1_0_5_4_3 - 0.0287830687830687*G0_1_0_5_4_4 - 0.0389417989417987*G0_1_0_5_4_5 - 0.0296296296296295*G0_1_0_5_5_0 + 0.0194708994708993*G0_1_0_5_5_1 + 0.0118518518518518*G0_1_0_5_5_2 - 0.0186243386243385*G0_1_0_5_5_3 - 0.0389417989417987*G0_1_0_5_5_4 - 0.147301587301586*G0_1_0_5_5_5 - 0.0634920634920632*G0_1_1_0_0_0 + 0.00634920634920631*G0_1_1_0_0_1 + 0.00529100529100526*G0_1_1_0_0_2 - 0.00211640211640211*G0_1_1_0_0_3 - 0.0232804232804232*G0_1_1_0_0_4 - 0.0275132275132274*G0_1_1_0_0_5 + 0.00634920634920632*G0_1_1_0_1_0 - 0.00253968253968252*G0_1_1_0_1_1 - 0.000740740740740737*G0_1_1_0_1_2 - 0.000423280423280419*G0_1_1_0_1_3 + 0.00296296296296295*G0_1_1_0_1_4 + 0.00550264550264547*G0_1_1_0_1_5 + 0.00529100529100527*G0_1_1_0_2_0 - 0.000740740740740737*G0_1_1_0_2_1 + 0.00126984126984126*G0_1_1_0_2_3 + 0.00507936507936506*G0_1_1_0_2_4 + 0.00338624338624337*G0_1_1_0_2_5 - 0.00211640211640211*G0_1_1_0_3_0 - 0.000423280423280419*G0_1_1_0_3_1 + 0.00126984126984126*G0_1_1_0_3_2 - 0.000846560846560842*G0_1_1_0_3_3 - 0.00169312169312169*G0_1_1_0_3_4 - 0.00253968253968253*G0_1_1_0_3_5 - 0.0232804232804232*G0_1_1_0_4_0 + 0.00296296296296295*G0_1_1_0_4_1 + 0.00507936507936506*G0_1_1_0_4_2 - 0.00169312169312169*G0_1_1_0_4_3 - 0.0211640211640211*G0_1_1_0_4_4 - 0.0126984126984126*G0_1_1_0_4_5 - 0.0275132275132274*G0_1_1_0_5_0 + 0.00550264550264547*G0_1_1_0_5_1 + 0.00338624338624337*G0_1_1_0_5_2 - 0.00253968253968253*G0_1_1_0_5_3 - 0.0126984126984126*G0_1_1_0_5_4 - 0.0296296296296295*G0_1_1_0_5_5 + 0.00634920634920631*G0_1_1_1_0_0 - 0.00253968253968252*G0_1_1_1_0_1 - 0.000740740740740737*G0_1_1_1_0_2 - 0.000423280423280419*G0_1_1_1_0_3 + 0.00296296296296295*G0_1_1_1_0_4 + 0.00550264550264547*G0_1_1_1_0_5 - 0.00253968253968252*G0_1_1_1_1_0 + 0.019047619047619*G0_1_1_1_1_1 - 0.00148148148148147*G0_1_1_1_1_2 + 0.00634920634920632*G0_1_1_1_1_3 - 0.00126984126984126*G0_1_1_1_1_4 + 0.00211640211640211*G0_1_1_1_1_5 - 0.000740740740740737*G0_1_1_1_2_0 - 0.00148148148148147*G0_1_1_1_2_1 + 0.0021164021164021*G0_1_1_1_2_2 - 0.000846560846560845*G0_1_1_1_2_3 - 0.00126984126984127*G0_1_1_1_2_4 - 0.00253968253968253*G0_1_1_1_2_5 - 0.000423280423280419*G0_1_1_1_3_0 + 0.00634920634920632*G0_1_1_1_3_1 - 0.000846560846560845*G0_1_1_1_3_2 + 0.011005291005291*G0_1_1_1_3_3 + 0.00338624338624337*G0_1_1_1_3_4 + 0.0059259259259259*G0_1_1_1_3_5 + 0.00296296296296295*G0_1_1_1_4_0 - 0.00126984126984126*G0_1_1_1_4_1 - 0.00126984126984127*G0_1_1_1_4_2 + 0.00338624338624337*G0_1_1_1_4_3 + 0.00761904761904759*G0_1_1_1_4_4 + 0.00761904761904758*G0_1_1_1_4_5 + 0.00550264550264547*G0_1_1_1_5_0 + 0.00211640211640211*G0_1_1_1_5_1 - 0.00253968253968253*G0_1_1_1_5_2 + 0.0059259259259259*G0_1_1_1_5_3 + 0.00761904761904758*G0_1_1_1_5_4 + 0.0194708994708994*G0_1_1_1_5_5 + 0.00529100529100527*G0_1_1_2_0_0 - 0.000740740740740737*G0_1_1_2_0_1 + 0.00126984126984126*G0_1_1_2_0_3 + 0.00507936507936506*G0_1_1_2_0_4 + 0.00338624338624337*G0_1_1_2_0_5 - 0.000740740740740737*G0_1_1_2_1_0 - 0.00148148148148147*G0_1_1_2_1_1 + 0.0021164021164021*G0_1_1_2_1_2 - 0.000846560846560846*G0_1_1_2_1_3 - 0.00126984126984127*G0_1_1_2_1_4 - 0.00253968253968253*G0_1_1_2_1_5 + 0.0021164021164021*G0_1_1_2_2_1 - 0.0158730158730158*G0_1_1_2_2_2 - 0.00634920634920631*G0_1_1_2_2_3 - 0.00634920634920631*G0_1_1_2_2_4 - 0.00211640211640211*G0_1_1_2_2_5 + 0.00126984126984126*G0_1_1_2_3_0 - 0.000846560846560845*G0_1_1_2_3_1 - 0.00634920634920631*G0_1_1_2_3_2 - 0.00846560846560842*G0_1_1_2_3_3 + 0.00169312169312168*G0_1_1_2_3_5 + 0.00507936507936506*G0_1_1_2_4_0 - 0.00126984126984127*G0_1_1_2_4_1 - 0.00634920634920631*G0_1_1_2_4_2 + 0.00846560846560843*G0_1_1_2_4_4 + 0.00677248677248674*G0_1_1_2_4_5 + 0.00338624338624337*G0_1_1_2_5_0 - 0.00253968253968253*G0_1_1_2_5_1 - 0.00211640211640211*G0_1_1_2_5_2 + 0.00169312169312168*G0_1_1_2_5_3 + 0.00677248677248674*G0_1_1_2_5_4 + 0.0118518518518518*G0_1_1_2_5_5 - 0.00211640211640211*G0_1_1_3_0_0 - 0.000423280423280419*G0_1_1_3_0_1 + 0.00126984126984126*G0_1_1_3_0_2 - 0.000846560846560843*G0_1_1_3_0_3 - 0.00169312169312169*G0_1_1_3_0_4 - 0.00253968253968253*G0_1_1_3_0_5 - 0.000423280423280419*G0_1_1_3_1_0 + 0.00634920634920632*G0_1_1_3_1_1 - 0.000846560846560845*G0_1_1_3_1_2 + 0.011005291005291*G0_1_1_3_1_3 + 0.00338624338624337*G0_1_1_3_1_4 + 0.0059259259259259*G0_1_1_3_1_5 + 0.00126984126984126*G0_1_1_3_2_0 - 0.000846560846560845*G0_1_1_3_2_1 - 0.00634920634920631*G0_1_1_3_2_2 - 0.00846560846560842*G0_1_1_3_2_3 + 0.00169312169312168*G0_1_1_3_2_5 - 0.000846560846560842*G0_1_1_3_3_0 + 0.011005291005291*G0_1_1_3_3_1 - 0.00846560846560842*G0_1_1_3_3_2 + 0.00507936507936508*G0_1_1_3_3_3 - 0.00507936507936505*G0_1_1_3_3_4 - 0.00169312169312168*G0_1_1_3_3_5 - 0.00169312169312169*G0_1_1_3_4_0 + 0.00338624338624337*G0_1_1_3_4_1 - 0.00507936507936505*G0_1_1_3_4_3 - 0.0118518518518518*G0_1_1_3_4_4 - 0.0101587301587301*G0_1_1_3_4_5 - 0.00253968253968253*G0_1_1_3_5_0 + 0.0059259259259259*G0_1_1_3_5_1 + 0.00169312169312168*G0_1_1_3_5_2 - 0.00169312169312168*G0_1_1_3_5_3 - 0.0101587301587301*G0_1_1_3_5_4 - 0.0186243386243385*G0_1_1_3_5_5 - 0.0232804232804232*G0_1_1_4_0_0 + 0.00296296296296295*G0_1_1_4_0_1 + 0.00507936507936506*G0_1_1_4_0_2 - 0.00169312169312169*G0_1_1_4_0_3 - 0.0211640211640211*G0_1_1_4_0_4 - 0.0126984126984126*G0_1_1_4_0_5 + 0.00296296296296295*G0_1_1_4_1_0 - 0.00126984126984126*G0_1_1_4_1_1 - 0.00126984126984127*G0_1_1_4_1_2 + 0.00338624338624337*G0_1_1_4_1_3 + 0.00761904761904759*G0_1_1_4_1_4 + 0.00761904761904758*G0_1_1_4_1_5 + 0.00507936507936506*G0_1_1_4_2_0 - 0.00126984126984127*G0_1_1_4_2_1 - 0.00634920634920631*G0_1_1_4_2_2 + 0.00846560846560844*G0_1_1_4_2_4 + 0.00677248677248674*G0_1_1_4_2_5 - 0.00169312169312169*G0_1_1_4_3_0 + 0.00338624338624337*G0_1_1_4_3_1 - 0.00507936507936505*G0_1_1_4_3_3 - 0.0118518518518518*G0_1_1_4_3_4 - 0.0101587301587301*G0_1_1_4_3_5 - 0.0211640211640211*G0_1_1_4_4_0 + 0.00761904761904759*G0_1_1_4_4_1 + 0.00846560846560844*G0_1_1_4_4_2 - 0.0118518518518518*G0_1_1_4_4_3 - 0.0558730158730156*G0_1_1_4_4_4 - 0.0287830687830687*G0_1_1_4_4_5 - 0.0126984126984126*G0_1_1_4_5_0 + 0.00761904761904758*G0_1_1_4_5_1 + 0.00677248677248674*G0_1_1_4_5_2 - 0.0101587301587301*G0_1_1_4_5_3 - 0.0287830687830687*G0_1_1_4_5_4 - 0.0389417989417987*G0_1_1_4_5_5 - 0.0275132275132274*G0_1_1_5_0_0 + 0.00550264550264547*G0_1_1_5_0_1 + 0.00338624338624337*G0_1_1_5_0_2 - 0.00253968253968253*G0_1_1_5_0_3 - 0.0126984126984126*G0_1_1_5_0_4 - 0.0296296296296295*G0_1_1_5_0_5 + 0.00550264550264547*G0_1_1_5_1_0 + 0.00211640211640211*G0_1_1_5_1_1 - 0.00253968253968253*G0_1_1_5_1_2 + 0.0059259259259259*G0_1_1_5_1_3 + 0.00761904761904758*G0_1_1_5_1_4 + 0.0194708994708994*G0_1_1_5_1_5 + 0.00338624338624337*G0_1_1_5_2_0 - 0.00253968253968253*G0_1_1_5_2_1 - 0.00211640211640211*G0_1_1_5_2_2 + 0.00169312169312168*G0_1_1_5_2_3 + 0.00677248677248674*G0_1_1_5_2_4 + 0.0118518518518518*G0_1_1_5_2_5 - 0.00253968253968253*G0_1_1_5_3_0 + 0.0059259259259259*G0_1_1_5_3_1 + 0.00169312169312168*G0_1_1_5_3_2 - 0.00169312169312168*G0_1_1_5_3_3 - 0.0101587301587301*G0_1_1_5_3_4 - 0.0186243386243385*G0_1_1_5_3_5 - 0.0126984126984126*G0_1_1_5_4_0 + 0.00761904761904758*G0_1_1_5_4_1 + 0.00677248677248674*G0_1_1_5_4_2 - 0.0101587301587301*G0_1_1_5_4_3 - 0.0287830687830687*G0_1_1_5_4_4 - 0.0389417989417987*G0_1_1_5_4_5 - 0.0296296296296295*G0_1_1_5_5_0 + 0.0194708994708994*G0_1_1_5_5_1 + 0.0118518518518518*G0_1_1_5_5_2 - 0.0186243386243385*G0_1_1_5_5_3 - 0.0389417989417987*G0_1_1_5_5_4 - 0.147301587301586*G0_1_1_5_5_5; + A[30] = -A[18] - 0.0634920634920632*G0_0_0_0_0_0 + 0.00529100529100527*G0_0_0_0_0_1 + 0.00634920634920632*G0_0_0_0_0_2 - 0.00211640211640211*G0_0_0_0_0_3 - 0.0275132275132274*G0_0_0_0_0_4 - 0.0232804232804232*G0_0_0_0_0_5 + 0.00529100529100527*G0_0_0_0_1_0 - 0.000740740740740738*G0_0_0_0_1_2 + 0.00126984126984126*G0_0_0_0_1_3 + 0.00338624338624337*G0_0_0_0_1_4 + 0.00507936507936505*G0_0_0_0_1_5 + 0.00634920634920632*G0_0_0_0_2_0 - 0.000740740740740738*G0_0_0_0_2_1 - 0.00253968253968253*G0_0_0_0_2_2 - 0.000423280423280418*G0_0_0_0_2_3 + 0.00550264550264548*G0_0_0_0_2_4 + 0.00296296296296295*G0_0_0_0_2_5 - 0.00211640211640211*G0_0_0_0_3_0 + 0.00126984126984126*G0_0_0_0_3_1 - 0.000423280423280418*G0_0_0_0_3_2 - 0.000846560846560845*G0_0_0_0_3_3 - 0.00253968253968253*G0_0_0_0_3_4 - 0.00169312169312169*G0_0_0_0_3_5 - 0.0275132275132274*G0_0_0_0_4_0 + 0.00338624338624337*G0_0_0_0_4_1 + 0.00550264550264548*G0_0_0_0_4_2 - 0.00253968253968253*G0_0_0_0_4_3 - 0.0296296296296295*G0_0_0_0_4_4 - 0.0126984126984126*G0_0_0_0_4_5 - 0.0232804232804232*G0_0_0_0_5_0 + 0.00507936507936505*G0_0_0_0_5_1 + 0.00296296296296295*G0_0_0_0_5_2 - 0.00169312169312169*G0_0_0_0_5_3 - 0.0126984126984126*G0_0_0_0_5_4 - 0.0211640211640211*G0_0_0_0_5_5 + 0.00529100529100527*G0_0_0_1_0_0 - 0.000740740740740738*G0_0_0_1_0_2 + 0.00126984126984126*G0_0_0_1_0_3 + 0.00338624338624337*G0_0_0_1_0_4 + 0.00507936507936505*G0_0_0_1_0_5 - 0.0158730158730158*G0_0_0_1_1_1 + 0.0021164021164021*G0_0_0_1_1_2 - 0.00634920634920631*G0_0_0_1_1_3 - 0.00211640211640211*G0_0_0_1_1_4 - 0.00634920634920631*G0_0_0_1_1_5 - 0.000740740740740738*G0_0_0_1_2_0 + 0.0021164021164021*G0_0_0_1_2_1 - 0.00148148148148147*G0_0_0_1_2_2 - 0.000846560846560841*G0_0_0_1_2_3 - 0.00253968253968253*G0_0_0_1_2_4 - 0.00126984126984126*G0_0_0_1_2_5 + 0.00126984126984126*G0_0_0_1_3_0 - 0.00634920634920631*G0_0_0_1_3_1 - 0.000846560846560842*G0_0_0_1_3_2 - 0.00846560846560842*G0_0_0_1_3_3 + 0.00169312169312168*G0_0_0_1_3_4 + 0.00338624338624337*G0_0_0_1_4_0 - 0.00211640211640211*G0_0_0_1_4_1 - 0.00253968253968253*G0_0_0_1_4_2 + 0.00169312169312168*G0_0_0_1_4_3 + 0.0118518518518518*G0_0_0_1_4_4 + 0.00677248677248674*G0_0_0_1_4_5 + 0.00507936507936505*G0_0_0_1_5_0 - 0.00634920634920631*G0_0_0_1_5_1 - 0.00126984126984126*G0_0_0_1_5_2 + 0.00677248677248674*G0_0_0_1_5_4 + 0.00846560846560842*G0_0_0_1_5_5 + 0.00634920634920632*G0_0_0_2_0_0 - 0.000740740740740738*G0_0_0_2_0_1 - 0.00253968253968253*G0_0_0_2_0_2 - 0.000423280423280418*G0_0_0_2_0_3 + 0.00550264550264548*G0_0_0_2_0_4 + 0.00296296296296295*G0_0_0_2_0_5 - 0.000740740740740738*G0_0_0_2_1_0 + 0.0021164021164021*G0_0_0_2_1_1 - 0.00148148148148147*G0_0_0_2_1_2 - 0.000846560846560842*G0_0_0_2_1_3 - 0.00253968253968253*G0_0_0_2_1_4 - 0.00126984126984127*G0_0_0_2_1_5 - 0.00253968253968253*G0_0_0_2_2_0 - 0.00148148148148147*G0_0_0_2_2_1 + 0.0190476190476189*G0_0_0_2_2_2 + 0.00634920634920631*G0_0_0_2_2_3 + 0.0021164021164021*G0_0_0_2_2_4 - 0.00126984126984126*G0_0_0_2_2_5 - 0.000423280423280418*G0_0_0_2_3_0 - 0.000846560846560842*G0_0_0_2_3_1 + 0.00634920634920631*G0_0_0_2_3_2 + 0.0110052910052909*G0_0_0_2_3_3 + 0.0059259259259259*G0_0_0_2_3_4 + 0.00338624338624337*G0_0_0_2_3_5 + 0.00550264550264548*G0_0_0_2_4_0 - 0.00253968253968253*G0_0_0_2_4_1 + 0.0021164021164021*G0_0_0_2_4_2 + 0.0059259259259259*G0_0_0_2_4_3 + 0.0194708994708994*G0_0_0_2_4_4 + 0.00761904761904759*G0_0_0_2_4_5 + 0.00296296296296295*G0_0_0_2_5_0 - 0.00126984126984127*G0_0_0_2_5_1 - 0.00126984126984126*G0_0_0_2_5_2 + 0.00338624338624337*G0_0_0_2_5_3 + 0.00761904761904759*G0_0_0_2_5_4 + 0.00761904761904758*G0_0_0_2_5_5 - 0.00211640211640211*G0_0_0_3_0_0 + 0.00126984126984126*G0_0_0_3_0_1 - 0.000423280423280418*G0_0_0_3_0_2 - 0.000846560846560845*G0_0_0_3_0_3 - 0.00253968253968253*G0_0_0_3_0_4 - 0.00169312169312169*G0_0_0_3_0_5 + 0.00126984126984126*G0_0_0_3_1_0 - 0.00634920634920631*G0_0_0_3_1_1 - 0.000846560846560842*G0_0_0_3_1_2 - 0.00846560846560842*G0_0_0_3_1_3 + 0.00169312169312168*G0_0_0_3_1_4 - 0.000423280423280418*G0_0_0_3_2_0 - 0.000846560846560842*G0_0_0_3_2_1 + 0.00634920634920631*G0_0_0_3_2_2 + 0.0110052910052909*G0_0_0_3_2_3 + 0.0059259259259259*G0_0_0_3_2_4 + 0.00338624338624337*G0_0_0_3_2_5 - 0.000846560846560844*G0_0_0_3_3_0 - 0.00846560846560842*G0_0_0_3_3_1 + 0.0110052910052909*G0_0_0_3_3_2 + 0.00507936507936505*G0_0_0_3_3_3 - 0.00169312169312167*G0_0_0_3_3_4 - 0.00507936507936505*G0_0_0_3_3_5 - 0.00253968253968254*G0_0_0_3_4_0 + 0.00169312169312168*G0_0_0_3_4_1 + 0.0059259259259259*G0_0_0_3_4_2 - 0.00169312169312168*G0_0_0_3_4_3 - 0.0186243386243385*G0_0_0_3_4_4 - 0.0101587301587301*G0_0_0_3_4_5 - 0.00169312169312169*G0_0_0_3_5_0 + 0.00338624338624337*G0_0_0_3_5_2 - 0.00507936507936505*G0_0_0_3_5_3 - 0.0101587301587301*G0_0_0_3_5_4 - 0.0118518518518518*G0_0_0_3_5_5 - 0.0275132275132274*G0_0_0_4_0_0 + 0.00338624338624337*G0_0_0_4_0_1 + 0.00550264550264548*G0_0_0_4_0_2 - 0.00253968253968253*G0_0_0_4_0_3 - 0.0296296296296295*G0_0_0_4_0_4 - 0.0126984126984126*G0_0_0_4_0_5 + 0.00338624338624337*G0_0_0_4_1_0 - 0.00211640211640211*G0_0_0_4_1_1 - 0.00253968253968253*G0_0_0_4_1_2 + 0.00169312169312168*G0_0_0_4_1_3 + 0.0118518518518518*G0_0_0_4_1_4 + 0.00677248677248674*G0_0_0_4_1_5 + 0.00550264550264548*G0_0_0_4_2_0 - 0.00253968253968253*G0_0_0_4_2_1 + 0.0021164021164021*G0_0_0_4_2_2 + 0.0059259259259259*G0_0_0_4_2_3 + 0.0194708994708994*G0_0_0_4_2_4 + 0.00761904761904759*G0_0_0_4_2_5 - 0.00253968253968253*G0_0_0_4_3_0 + 0.00169312169312168*G0_0_0_4_3_1 + 0.0059259259259259*G0_0_0_4_3_2 - 0.00169312169312168*G0_0_0_4_3_3 - 0.0186243386243385*G0_0_0_4_3_4 - 0.0101587301587301*G0_0_0_4_3_5 - 0.0296296296296295*G0_0_0_4_4_0 + 0.0118518518518518*G0_0_0_4_4_1 + 0.0194708994708994*G0_0_0_4_4_2 - 0.0186243386243385*G0_0_0_4_4_3 - 0.147301587301587*G0_0_0_4_4_4 - 0.0389417989417988*G0_0_0_4_4_5 - 0.0126984126984126*G0_0_0_4_5_0 + 0.00677248677248674*G0_0_0_4_5_1 + 0.00761904761904759*G0_0_0_4_5_2 - 0.0101587301587301*G0_0_0_4_5_3 - 0.0389417989417988*G0_0_0_4_5_4 - 0.0287830687830686*G0_0_0_4_5_5 - 0.0232804232804232*G0_0_0_5_0_0 + 0.00507936507936505*G0_0_0_5_0_1 + 0.00296296296296295*G0_0_0_5_0_2 - 0.00169312169312169*G0_0_0_5_0_3 - 0.0126984126984126*G0_0_0_5_0_4 - 0.0211640211640211*G0_0_0_5_0_5 + 0.00507936507936505*G0_0_0_5_1_0 - 0.00634920634920631*G0_0_0_5_1_1 - 0.00126984126984127*G0_0_0_5_1_2 + 0.00677248677248674*G0_0_0_5_1_4 + 0.00846560846560842*G0_0_0_5_1_5 + 0.00296296296296295*G0_0_0_5_2_0 - 0.00126984126984127*G0_0_0_5_2_1 - 0.00126984126984126*G0_0_0_5_2_2 + 0.00338624338624337*G0_0_0_5_2_3 + 0.00761904761904759*G0_0_0_5_2_4 + 0.00761904761904758*G0_0_0_5_2_5 - 0.00169312169312169*G0_0_0_5_3_0 + 0.00338624338624337*G0_0_0_5_3_2 - 0.00507936507936505*G0_0_0_5_3_3 - 0.0101587301587301*G0_0_0_5_3_4 - 0.0118518518518518*G0_0_0_5_3_5 - 0.0126984126984126*G0_0_0_5_4_0 + 0.00677248677248674*G0_0_0_5_4_1 + 0.00761904761904759*G0_0_0_5_4_2 - 0.0101587301587301*G0_0_0_5_4_3 - 0.0389417989417988*G0_0_0_5_4_4 - 0.0287830687830686*G0_0_0_5_4_5 - 0.021164021164021*G0_0_0_5_5_0 + 0.00846560846560842*G0_0_0_5_5_1 + 0.00761904761904758*G0_0_0_5_5_2 - 0.0118518518518518*G0_0_0_5_5_3 - 0.0287830687830686*G0_0_0_5_5_4 - 0.0558730158730155*G0_0_0_5_5_5 - 0.0634920634920632*G0_0_1_0_0_0 + 0.00529100529100527*G0_0_1_0_0_1 + 0.00634920634920632*G0_0_1_0_0_2 - 0.00211640211640211*G0_0_1_0_0_3 - 0.0275132275132274*G0_0_1_0_0_4 - 0.0232804232804232*G0_0_1_0_0_5 + 0.00529100529100527*G0_0_1_0_1_0 - 0.000740740740740738*G0_0_1_0_1_2 + 0.00126984126984126*G0_0_1_0_1_3 + 0.00338624338624337*G0_0_1_0_1_4 + 0.00507936507936505*G0_0_1_0_1_5 + 0.00634920634920632*G0_0_1_0_2_0 - 0.000740740740740739*G0_0_1_0_2_1 - 0.00253968253968252*G0_0_1_0_2_2 - 0.000423280423280417*G0_0_1_0_2_3 + 0.00550264550264548*G0_0_1_0_2_4 + 0.00296296296296295*G0_0_1_0_2_5 - 0.00211640211640211*G0_0_1_0_3_0 + 0.00126984126984126*G0_0_1_0_3_1 - 0.000423280423280417*G0_0_1_0_3_2 - 0.000846560846560843*G0_0_1_0_3_3 - 0.00253968253968253*G0_0_1_0_3_4 - 0.00169312169312169*G0_0_1_0_3_5 - 0.0275132275132274*G0_0_1_0_4_0 + 0.00338624338624337*G0_0_1_0_4_1 + 0.00550264550264548*G0_0_1_0_4_2 - 0.00253968253968253*G0_0_1_0_4_3 - 0.0296296296296295*G0_0_1_0_4_4 - 0.0126984126984126*G0_0_1_0_4_5 - 0.0232804232804232*G0_0_1_0_5_0 + 0.00507936507936505*G0_0_1_0_5_1 + 0.00296296296296295*G0_0_1_0_5_2 - 0.00169312169312169*G0_0_1_0_5_3 - 0.0126984126984126*G0_0_1_0_5_4 - 0.021164021164021*G0_0_1_0_5_5 + 0.00529100529100527*G0_0_1_1_0_0 - 0.000740740740740738*G0_0_1_1_0_2 + 0.00126984126984126*G0_0_1_1_0_3 + 0.00338624338624337*G0_0_1_1_0_4 + 0.00507936507936505*G0_0_1_1_0_5 - 0.0158730158730158*G0_0_1_1_1_1 + 0.00211640211640211*G0_0_1_1_1_2 - 0.00634920634920632*G0_0_1_1_1_3 - 0.00211640211640211*G0_0_1_1_1_4 - 0.00634920634920632*G0_0_1_1_1_5 - 0.000740740740740739*G0_0_1_1_2_0 + 0.00211640211640211*G0_0_1_1_2_1 - 0.00148148148148147*G0_0_1_1_2_2 - 0.000846560846560839*G0_0_1_1_2_3 - 0.00253968253968253*G0_0_1_1_2_4 - 0.00126984126984126*G0_0_1_1_2_5 + 0.00126984126984126*G0_0_1_1_3_0 - 0.00634920634920632*G0_0_1_1_3_1 - 0.000846560846560839*G0_0_1_1_3_2 - 0.00846560846560842*G0_0_1_1_3_3 + 0.00169312169312168*G0_0_1_1_3_4 + 0.00338624338624337*G0_0_1_1_4_0 - 0.00211640211640211*G0_0_1_1_4_1 - 0.00253968253968253*G0_0_1_1_4_2 + 0.00169312169312168*G0_0_1_1_4_3 + 0.0118518518518518*G0_0_1_1_4_4 + 0.00677248677248674*G0_0_1_1_4_5 + 0.00507936507936505*G0_0_1_1_5_0 - 0.00634920634920632*G0_0_1_1_5_1 - 0.00126984126984126*G0_0_1_1_5_2 + 0.00677248677248674*G0_0_1_1_5_4 + 0.00846560846560842*G0_0_1_1_5_5 + 0.00634920634920632*G0_0_1_2_0_0 - 0.000740740740740739*G0_0_1_2_0_1 - 0.00253968253968252*G0_0_1_2_0_2 - 0.000423280423280417*G0_0_1_2_0_3 + 0.00550264550264548*G0_0_1_2_0_4 + 0.00296296296296295*G0_0_1_2_0_5 - 0.000740740740740739*G0_0_1_2_1_0 + 0.00211640211640211*G0_0_1_2_1_1 - 0.00148148148148147*G0_0_1_2_1_2 - 0.000846560846560839*G0_0_1_2_1_3 - 0.00253968253968253*G0_0_1_2_1_4 - 0.00126984126984126*G0_0_1_2_1_5 - 0.00253968253968252*G0_0_1_2_2_0 - 0.00148148148148147*G0_0_1_2_2_1 + 0.0190476190476189*G0_0_1_2_2_2 + 0.00634920634920631*G0_0_1_2_2_3 + 0.00211640211640209*G0_0_1_2_2_4 - 0.00126984126984126*G0_0_1_2_2_5 - 0.000423280423280417*G0_0_1_2_3_0 - 0.000846560846560839*G0_0_1_2_3_1 + 0.00634920634920631*G0_0_1_2_3_2 + 0.0110052910052909*G0_0_1_2_3_3 + 0.0059259259259259*G0_0_1_2_3_4 + 0.00338624338624337*G0_0_1_2_3_5 + 0.00550264550264548*G0_0_1_2_4_0 - 0.00253968253968253*G0_0_1_2_4_1 + 0.00211640211640209*G0_0_1_2_4_2 + 0.0059259259259259*G0_0_1_2_4_3 + 0.0194708994708994*G0_0_1_2_4_4 + 0.00761904761904759*G0_0_1_2_4_5 + 0.00296296296296295*G0_0_1_2_5_0 - 0.00126984126984126*G0_0_1_2_5_1 - 0.00126984126984126*G0_0_1_2_5_2 + 0.00338624338624337*G0_0_1_2_5_3 + 0.00761904761904759*G0_0_1_2_5_4 + 0.00761904761904758*G0_0_1_2_5_5 - 0.00211640211640211*G0_0_1_3_0_0 + 0.00126984126984126*G0_0_1_3_0_1 - 0.000423280423280417*G0_0_1_3_0_2 - 0.000846560846560843*G0_0_1_3_0_3 - 0.00253968253968253*G0_0_1_3_0_4 - 0.00169312169312169*G0_0_1_3_0_5 + 0.00126984126984126*G0_0_1_3_1_0 - 0.00634920634920632*G0_0_1_3_1_1 - 0.000846560846560839*G0_0_1_3_1_2 - 0.00846560846560842*G0_0_1_3_1_3 + 0.00169312169312168*G0_0_1_3_1_4 - 0.000423280423280417*G0_0_1_3_2_0 - 0.000846560846560839*G0_0_1_3_2_1 + 0.0063492063492063*G0_0_1_3_2_2 + 0.0110052910052909*G0_0_1_3_2_3 + 0.0059259259259259*G0_0_1_3_2_4 + 0.00338624338624337*G0_0_1_3_2_5 - 0.000846560846560843*G0_0_1_3_3_0 - 0.00846560846560842*G0_0_1_3_3_1 + 0.0110052910052909*G0_0_1_3_3_2 + 0.00507936507936504*G0_0_1_3_3_3 - 0.00169312169312168*G0_0_1_3_3_4 - 0.00507936507936505*G0_0_1_3_3_5 - 0.00253968253968253*G0_0_1_3_4_0 + 0.00169312169312168*G0_0_1_3_4_1 + 0.0059259259259259*G0_0_1_3_4_2 - 0.00169312169312168*G0_0_1_3_4_3 - 0.0186243386243385*G0_0_1_3_4_4 - 0.0101587301587301*G0_0_1_3_4_5 - 0.00169312169312169*G0_0_1_3_5_0 + 0.00338624338624337*G0_0_1_3_5_2 - 0.00507936507936505*G0_0_1_3_5_3 - 0.0101587301587301*G0_0_1_3_5_4 - 0.0118518518518518*G0_0_1_3_5_5 - 0.0275132275132274*G0_0_1_4_0_0 + 0.00338624338624337*G0_0_1_4_0_1 + 0.00550264550264548*G0_0_1_4_0_2 - 0.00253968253968253*G0_0_1_4_0_3 - 0.0296296296296295*G0_0_1_4_0_4 - 0.0126984126984126*G0_0_1_4_0_5 + 0.00338624338624337*G0_0_1_4_1_0 - 0.00211640211640211*G0_0_1_4_1_1 - 0.00253968253968253*G0_0_1_4_1_2 + 0.00169312169312169*G0_0_1_4_1_3 + 0.0118518518518518*G0_0_1_4_1_4 + 0.00677248677248674*G0_0_1_4_1_5 + 0.00550264550264548*G0_0_1_4_2_0 - 0.00253968253968253*G0_0_1_4_2_1 + 0.00211640211640209*G0_0_1_4_2_2 + 0.0059259259259259*G0_0_1_4_2_3 + 0.0194708994708994*G0_0_1_4_2_4 + 0.00761904761904759*G0_0_1_4_2_5 - 0.00253968253968253*G0_0_1_4_3_0 + 0.00169312169312168*G0_0_1_4_3_1 + 0.0059259259259259*G0_0_1_4_3_2 - 0.00169312169312168*G0_0_1_4_3_3 - 0.0186243386243385*G0_0_1_4_3_4 - 0.0101587301587301*G0_0_1_4_3_5 - 0.0296296296296295*G0_0_1_4_4_0 + 0.0118518518518518*G0_0_1_4_4_1 + 0.0194708994708994*G0_0_1_4_4_2 - 0.0186243386243385*G0_0_1_4_4_3 - 0.147301587301587*G0_0_1_4_4_4 - 0.0389417989417988*G0_0_1_4_4_5 - 0.0126984126984126*G0_0_1_4_5_0 + 0.00677248677248674*G0_0_1_4_5_1 + 0.00761904761904759*G0_0_1_4_5_2 - 0.0101587301587301*G0_0_1_4_5_3 - 0.0389417989417988*G0_0_1_4_5_4 - 0.0287830687830687*G0_0_1_4_5_5 - 0.0232804232804232*G0_0_1_5_0_0 + 0.00507936507936505*G0_0_1_5_0_1 + 0.00296296296296295*G0_0_1_5_0_2 - 0.00169312169312169*G0_0_1_5_0_3 - 0.0126984126984126*G0_0_1_5_0_4 - 0.021164021164021*G0_0_1_5_0_5 + 0.00507936507936505*G0_0_1_5_1_0 - 0.00634920634920632*G0_0_1_5_1_1 - 0.00126984126984126*G0_0_1_5_1_2 + 0.00677248677248674*G0_0_1_5_1_4 + 0.00846560846560842*G0_0_1_5_1_5 + 0.00296296296296295*G0_0_1_5_2_0 - 0.00126984126984126*G0_0_1_5_2_1 - 0.00126984126984126*G0_0_1_5_2_2 + 0.00338624338624337*G0_0_1_5_2_3 + 0.00761904761904759*G0_0_1_5_2_4 + 0.00761904761904758*G0_0_1_5_2_5 - 0.00169312169312169*G0_0_1_5_3_0 + 0.00338624338624337*G0_0_1_5_3_2 - 0.00507936507936505*G0_0_1_5_3_3 - 0.0101587301587301*G0_0_1_5_3_4 - 0.0118518518518518*G0_0_1_5_3_5 - 0.0126984126984126*G0_0_1_5_4_0 + 0.00677248677248674*G0_0_1_5_4_1 + 0.00761904761904759*G0_0_1_5_4_2 - 0.0101587301587301*G0_0_1_5_4_3 - 0.0389417989417988*G0_0_1_5_4_4 - 0.0287830687830687*G0_0_1_5_4_5 - 0.021164021164021*G0_0_1_5_5_0 + 0.00846560846560842*G0_0_1_5_5_1 + 0.00761904761904758*G0_0_1_5_5_2 - 0.0118518518518518*G0_0_1_5_5_3 - 0.0287830687830687*G0_0_1_5_5_4 - 0.0558730158730155*G0_0_1_5_5_5; + A[4] = -A[3] - 0.0634920634920632*G0_0_1_0_0_0 + 0.00634920634920632*G0_0_1_0_0_1 + 0.00529100529100527*G0_0_1_0_0_2 - 0.00211640211640211*G0_0_1_0_0_3 - 0.0232804232804232*G0_0_1_0_0_4 - 0.0275132275132274*G0_0_1_0_0_5 + 0.00634920634920632*G0_0_1_0_1_0 - 0.00253968253968252*G0_0_1_0_1_1 - 0.000740740740740738*G0_0_1_0_1_2 - 0.000423280423280418*G0_0_1_0_1_3 + 0.00296296296296295*G0_0_1_0_1_4 + 0.00550264550264548*G0_0_1_0_1_5 + 0.00529100529100527*G0_0_1_0_2_0 - 0.000740740740740738*G0_0_1_0_2_1 + 0.00126984126984126*G0_0_1_0_2_3 + 0.00507936507936506*G0_0_1_0_2_4 + 0.00338624338624337*G0_0_1_0_2_5 - 0.00211640211640211*G0_0_1_0_3_0 - 0.000423280423280419*G0_0_1_0_3_1 + 0.00126984126984126*G0_0_1_0_3_2 - 0.000846560846560841*G0_0_1_0_3_3 - 0.00169312169312169*G0_0_1_0_3_4 - 0.00253968253968253*G0_0_1_0_3_5 - 0.0232804232804232*G0_0_1_0_4_0 + 0.00296296296296295*G0_0_1_0_4_1 + 0.00507936507936506*G0_0_1_0_4_2 - 0.00169312169312169*G0_0_1_0_4_3 - 0.0211640211640211*G0_0_1_0_4_4 - 0.0126984126984126*G0_0_1_0_4_5 - 0.0275132275132274*G0_0_1_0_5_0 + 0.00550264550264547*G0_0_1_0_5_1 + 0.00338624338624337*G0_0_1_0_5_2 - 0.00253968253968253*G0_0_1_0_5_3 - 0.0126984126984126*G0_0_1_0_5_4 - 0.0296296296296295*G0_0_1_0_5_5 + 0.00634920634920632*G0_0_1_1_0_0 - 0.00253968253968252*G0_0_1_1_0_1 - 0.000740740740740738*G0_0_1_1_0_2 - 0.000423280423280418*G0_0_1_1_0_3 + 0.00296296296296295*G0_0_1_1_0_4 + 0.00550264550264548*G0_0_1_1_0_5 - 0.00253968253968252*G0_0_1_1_1_0 + 0.0190476190476189*G0_0_1_1_1_1 - 0.00148148148148147*G0_0_1_1_1_2 + 0.00634920634920631*G0_0_1_1_1_3 - 0.00126984126984126*G0_0_1_1_1_4 + 0.0021164021164021*G0_0_1_1_1_5 - 0.000740740740740738*G0_0_1_1_2_0 - 0.00148148148148147*G0_0_1_1_2_1 + 0.00211640211640211*G0_0_1_1_2_2 - 0.000846560846560843*G0_0_1_1_2_3 - 0.00126984126984126*G0_0_1_1_2_4 - 0.00253968253968253*G0_0_1_1_2_5 - 0.000423280423280419*G0_0_1_1_3_0 + 0.00634920634920631*G0_0_1_1_3_1 - 0.000846560846560843*G0_0_1_1_3_2 + 0.0110052910052909*G0_0_1_1_3_3 + 0.00338624338624337*G0_0_1_1_3_4 + 0.0059259259259259*G0_0_1_1_3_5 + 0.00296296296296295*G0_0_1_1_4_0 - 0.00126984126984126*G0_0_1_1_4_1 - 0.00126984126984126*G0_0_1_1_4_2 + 0.00338624338624337*G0_0_1_1_4_3 + 0.00761904761904759*G0_0_1_1_4_4 + 0.00761904761904758*G0_0_1_1_4_5 + 0.00550264550264547*G0_0_1_1_5_0 + 0.0021164021164021*G0_0_1_1_5_1 - 0.00253968253968253*G0_0_1_1_5_2 + 0.0059259259259259*G0_0_1_1_5_3 + 0.00761904761904758*G0_0_1_1_5_4 + 0.0194708994708994*G0_0_1_1_5_5 + 0.00529100529100527*G0_0_1_2_0_0 - 0.000740740740740738*G0_0_1_2_0_1 + 0.00126984126984126*G0_0_1_2_0_3 + 0.00507936507936506*G0_0_1_2_0_4 + 0.00338624338624337*G0_0_1_2_0_5 - 0.000740740740740738*G0_0_1_2_1_0 - 0.00148148148148147*G0_0_1_2_1_1 + 0.00211640211640211*G0_0_1_2_1_2 - 0.000846560846560843*G0_0_1_2_1_3 - 0.00126984126984126*G0_0_1_2_1_4 - 0.00253968253968253*G0_0_1_2_1_5 + 0.00211640211640211*G0_0_1_2_2_1 - 0.0158730158730158*G0_0_1_2_2_2 - 0.00634920634920632*G0_0_1_2_2_3 - 0.00634920634920632*G0_0_1_2_2_4 - 0.00211640211640211*G0_0_1_2_2_5 + 0.00126984126984126*G0_0_1_2_3_0 - 0.000846560846560843*G0_0_1_2_3_1 - 0.00634920634920632*G0_0_1_2_3_2 - 0.00846560846560842*G0_0_1_2_3_3 + 0.00169312169312168*G0_0_1_2_3_5 + 0.00507936507936506*G0_0_1_2_4_0 - 0.00126984126984126*G0_0_1_2_4_1 - 0.00634920634920632*G0_0_1_2_4_2 + 0.00846560846560843*G0_0_1_2_4_4 + 0.00677248677248674*G0_0_1_2_4_5 + 0.00338624338624337*G0_0_1_2_5_0 - 0.00253968253968253*G0_0_1_2_5_1 - 0.00211640211640211*G0_0_1_2_5_2 + 0.00169312169312168*G0_0_1_2_5_3 + 0.00677248677248674*G0_0_1_2_5_4 + 0.0118518518518518*G0_0_1_2_5_5 - 0.00211640211640211*G0_0_1_3_0_0 - 0.000423280423280419*G0_0_1_3_0_1 + 0.00126984126984126*G0_0_1_3_0_2 - 0.000846560846560841*G0_0_1_3_0_3 - 0.00169312169312169*G0_0_1_3_0_4 - 0.00253968253968253*G0_0_1_3_0_5 - 0.000423280423280419*G0_0_1_3_1_0 + 0.00634920634920631*G0_0_1_3_1_1 - 0.000846560846560843*G0_0_1_3_1_2 + 0.0110052910052909*G0_0_1_3_1_3 + 0.00338624338624337*G0_0_1_3_1_4 + 0.0059259259259259*G0_0_1_3_1_5 + 0.00126984126984126*G0_0_1_3_2_0 - 0.000846560846560843*G0_0_1_3_2_1 - 0.00634920634920632*G0_0_1_3_2_2 - 0.00846560846560842*G0_0_1_3_2_3 + 0.00169312169312168*G0_0_1_3_2_5 - 0.000846560846560841*G0_0_1_3_3_0 + 0.0110052910052909*G0_0_1_3_3_1 - 0.00846560846560842*G0_0_1_3_3_2 + 0.00507936507936505*G0_0_1_3_3_3 - 0.00507936507936506*G0_0_1_3_3_4 - 0.00169312169312168*G0_0_1_3_3_5 - 0.00169312169312169*G0_0_1_3_4_0 + 0.00338624338624337*G0_0_1_3_4_1 - 0.00507936507936506*G0_0_1_3_4_3 - 0.0118518518518518*G0_0_1_3_4_4 - 0.0101587301587301*G0_0_1_3_4_5 - 0.00253968253968253*G0_0_1_3_5_0 + 0.0059259259259259*G0_0_1_3_5_1 + 0.00169312169312168*G0_0_1_3_5_2 - 0.00169312169312168*G0_0_1_3_5_3 - 0.0101587301587301*G0_0_1_3_5_4 - 0.0186243386243385*G0_0_1_3_5_5 - 0.0232804232804232*G0_0_1_4_0_0 + 0.00296296296296295*G0_0_1_4_0_1 + 0.00507936507936506*G0_0_1_4_0_2 - 0.00169312169312169*G0_0_1_4_0_3 - 0.0211640211640211*G0_0_1_4_0_4 - 0.0126984126984126*G0_0_1_4_0_5 + 0.00296296296296295*G0_0_1_4_1_0 - 0.00126984126984126*G0_0_1_4_1_1 - 0.00126984126984126*G0_0_1_4_1_2 + 0.00338624338624337*G0_0_1_4_1_3 + 0.00761904761904759*G0_0_1_4_1_4 + 0.00761904761904758*G0_0_1_4_1_5 + 0.00507936507936506*G0_0_1_4_2_0 - 0.00126984126984126*G0_0_1_4_2_1 - 0.00634920634920632*G0_0_1_4_2_2 + 0.00846560846560843*G0_0_1_4_2_4 + 0.00677248677248674*G0_0_1_4_2_5 - 0.00169312169312169*G0_0_1_4_3_0 + 0.00338624338624337*G0_0_1_4_3_1 - 0.00507936507936506*G0_0_1_4_3_3 - 0.0118518518518518*G0_0_1_4_3_4 - 0.0101587301587301*G0_0_1_4_3_5 - 0.0211640211640211*G0_0_1_4_4_0 + 0.00761904761904758*G0_0_1_4_4_1 + 0.00846560846560843*G0_0_1_4_4_2 - 0.0118518518518518*G0_0_1_4_4_3 - 0.0558730158730156*G0_0_1_4_4_4 - 0.0287830687830687*G0_0_1_4_4_5 - 0.0126984126984126*G0_0_1_4_5_0 + 0.00761904761904758*G0_0_1_4_5_1 + 0.00677248677248674*G0_0_1_4_5_2 - 0.0101587301587301*G0_0_1_4_5_3 - 0.0287830687830687*G0_0_1_4_5_4 - 0.0389417989417987*G0_0_1_4_5_5 - 0.0275132275132274*G0_0_1_5_0_0 + 0.00550264550264547*G0_0_1_5_0_1 + 0.00338624338624337*G0_0_1_5_0_2 - 0.00253968253968253*G0_0_1_5_0_3 - 0.0126984126984126*G0_0_1_5_0_4 - 0.0296296296296295*G0_0_1_5_0_5 + 0.00550264550264548*G0_0_1_5_1_0 + 0.0021164021164021*G0_0_1_5_1_1 - 0.00253968253968253*G0_0_1_5_1_2 + 0.0059259259259259*G0_0_1_5_1_3 + 0.00761904761904758*G0_0_1_5_1_4 + 0.0194708994708994*G0_0_1_5_1_5 + 0.00338624338624337*G0_0_1_5_2_0 - 0.00253968253968253*G0_0_1_5_2_1 - 0.00211640211640211*G0_0_1_5_2_2 + 0.00169312169312168*G0_0_1_5_2_3 + 0.00677248677248674*G0_0_1_5_2_4 + 0.0118518518518518*G0_0_1_5_2_5 - 0.00253968253968253*G0_0_1_5_3_0 + 0.0059259259259259*G0_0_1_5_3_1 + 0.00169312169312168*G0_0_1_5_3_2 - 0.00169312169312168*G0_0_1_5_3_3 - 0.0101587301587301*G0_0_1_5_3_4 - 0.0186243386243385*G0_0_1_5_3_5 - 0.0126984126984126*G0_0_1_5_4_0 + 0.00761904761904758*G0_0_1_5_4_1 + 0.00677248677248674*G0_0_1_5_4_2 - 0.0101587301587301*G0_0_1_5_4_3 - 0.0287830687830687*G0_0_1_5_4_4 - 0.0389417989417987*G0_0_1_5_4_5 - 0.0296296296296295*G0_0_1_5_5_0 + 0.0194708994708994*G0_0_1_5_5_1 + 0.0118518518518518*G0_0_1_5_5_2 - 0.0186243386243385*G0_0_1_5_5_3 - 0.0389417989417987*G0_0_1_5_5_4 - 0.147301587301586*G0_0_1_5_5_5 - 0.0634920634920632*G0_1_1_0_0_0 + 0.00634920634920632*G0_1_1_0_0_1 + 0.00529100529100527*G0_1_1_0_0_2 - 0.00211640211640211*G0_1_1_0_0_3 - 0.0232804232804232*G0_1_1_0_0_4 - 0.0275132275132274*G0_1_1_0_0_5 + 0.00634920634920632*G0_1_1_0_1_0 - 0.00253968253968252*G0_1_1_0_1_1 - 0.000740740740740737*G0_1_1_0_1_2 - 0.000423280423280419*G0_1_1_0_1_3 + 0.00296296296296295*G0_1_1_0_1_4 + 0.00550264550264547*G0_1_1_0_1_5 + 0.00529100529100527*G0_1_1_0_2_0 - 0.000740740740740737*G0_1_1_0_2_1 + 0.00126984126984126*G0_1_1_0_2_3 + 0.00507936507936506*G0_1_1_0_2_4 + 0.00338624338624337*G0_1_1_0_2_5 - 0.00211640211640211*G0_1_1_0_3_0 - 0.000423280423280419*G0_1_1_0_3_1 + 0.00126984126984126*G0_1_1_0_3_2 - 0.000846560846560843*G0_1_1_0_3_3 - 0.00169312169312169*G0_1_1_0_3_4 - 0.00253968253968253*G0_1_1_0_3_5 - 0.0232804232804232*G0_1_1_0_4_0 + 0.00296296296296295*G0_1_1_0_4_1 + 0.00507936507936506*G0_1_1_0_4_2 - 0.00169312169312169*G0_1_1_0_4_3 - 0.0211640211640211*G0_1_1_0_4_4 - 0.0126984126984126*G0_1_1_0_4_5 - 0.0275132275132274*G0_1_1_0_5_0 + 0.00550264550264547*G0_1_1_0_5_1 + 0.00338624338624337*G0_1_1_0_5_2 - 0.00253968253968253*G0_1_1_0_5_3 - 0.0126984126984126*G0_1_1_0_5_4 - 0.0296296296296295*G0_1_1_0_5_5 + 0.00634920634920632*G0_1_1_1_0_0 - 0.00253968253968252*G0_1_1_1_0_1 - 0.000740740740740737*G0_1_1_1_0_2 - 0.000423280423280419*G0_1_1_1_0_3 + 0.00296296296296295*G0_1_1_1_0_4 + 0.00550264550264547*G0_1_1_1_0_5 - 0.00253968253968252*G0_1_1_1_1_0 + 0.019047619047619*G0_1_1_1_1_1 - 0.00148148148148147*G0_1_1_1_1_2 + 0.00634920634920632*G0_1_1_1_1_3 - 0.00126984126984126*G0_1_1_1_1_4 + 0.00211640211640211*G0_1_1_1_1_5 - 0.000740740740740737*G0_1_1_1_2_0 - 0.00148148148148147*G0_1_1_1_2_1 + 0.0021164021164021*G0_1_1_1_2_2 - 0.000846560846560845*G0_1_1_1_2_3 - 0.00126984126984127*G0_1_1_1_2_4 - 0.00253968253968253*G0_1_1_1_2_5 - 0.000423280423280419*G0_1_1_1_3_0 + 0.00634920634920632*G0_1_1_1_3_1 - 0.000846560846560845*G0_1_1_1_3_2 + 0.011005291005291*G0_1_1_1_3_3 + 0.00338624338624337*G0_1_1_1_3_4 + 0.0059259259259259*G0_1_1_1_3_5 + 0.00296296296296295*G0_1_1_1_4_0 - 0.00126984126984126*G0_1_1_1_4_1 - 0.00126984126984127*G0_1_1_1_4_2 + 0.00338624338624337*G0_1_1_1_4_3 + 0.00761904761904759*G0_1_1_1_4_4 + 0.00761904761904758*G0_1_1_1_4_5 + 0.00550264550264547*G0_1_1_1_5_0 + 0.00211640211640211*G0_1_1_1_5_1 - 0.00253968253968253*G0_1_1_1_5_2 + 0.0059259259259259*G0_1_1_1_5_3 + 0.00761904761904758*G0_1_1_1_5_4 + 0.0194708994708994*G0_1_1_1_5_5 + 0.00529100529100527*G0_1_1_2_0_0 - 0.000740740740740737*G0_1_1_2_0_1 + 0.00126984126984126*G0_1_1_2_0_3 + 0.00507936507936506*G0_1_1_2_0_4 + 0.00338624338624337*G0_1_1_2_0_5 - 0.000740740740740737*G0_1_1_2_1_0 - 0.00148148148148147*G0_1_1_2_1_1 + 0.0021164021164021*G0_1_1_2_1_2 - 0.000846560846560846*G0_1_1_2_1_3 - 0.00126984126984127*G0_1_1_2_1_4 - 0.00253968253968253*G0_1_1_2_1_5 + 0.0021164021164021*G0_1_1_2_2_1 - 0.0158730158730158*G0_1_1_2_2_2 - 0.00634920634920631*G0_1_1_2_2_3 - 0.00634920634920631*G0_1_1_2_2_4 - 0.00211640211640211*G0_1_1_2_2_5 + 0.00126984126984126*G0_1_1_2_3_0 - 0.000846560846560845*G0_1_1_2_3_1 - 0.00634920634920631*G0_1_1_2_3_2 - 0.00846560846560842*G0_1_1_2_3_3 + 0.00169312169312168*G0_1_1_2_3_5 + 0.00507936507936506*G0_1_1_2_4_0 - 0.00126984126984127*G0_1_1_2_4_1 - 0.00634920634920631*G0_1_1_2_4_2 + 0.00846560846560843*G0_1_1_2_4_4 + 0.00677248677248674*G0_1_1_2_4_5 + 0.00338624338624337*G0_1_1_2_5_0 - 0.00253968253968253*G0_1_1_2_5_1 - 0.00211640211640211*G0_1_1_2_5_2 + 0.00169312169312168*G0_1_1_2_5_3 + 0.00677248677248674*G0_1_1_2_5_4 + 0.0118518518518518*G0_1_1_2_5_5 - 0.00211640211640211*G0_1_1_3_0_0 - 0.000423280423280419*G0_1_1_3_0_1 + 0.00126984126984126*G0_1_1_3_0_2 - 0.000846560846560843*G0_1_1_3_0_3 - 0.00169312169312169*G0_1_1_3_0_4 - 0.00253968253968253*G0_1_1_3_0_5 - 0.000423280423280419*G0_1_1_3_1_0 + 0.00634920634920632*G0_1_1_3_1_1 - 0.000846560846560845*G0_1_1_3_1_2 + 0.011005291005291*G0_1_1_3_1_3 + 0.00338624338624337*G0_1_1_3_1_4 + 0.0059259259259259*G0_1_1_3_1_5 + 0.00126984126984126*G0_1_1_3_2_0 - 0.000846560846560845*G0_1_1_3_2_1 - 0.00634920634920631*G0_1_1_3_2_2 - 0.00846560846560842*G0_1_1_3_2_3 + 0.00169312169312168*G0_1_1_3_2_5 - 0.000846560846560842*G0_1_1_3_3_0 + 0.011005291005291*G0_1_1_3_3_1 - 0.00846560846560842*G0_1_1_3_3_2 + 0.00507936507936508*G0_1_1_3_3_3 - 0.00507936507936505*G0_1_1_3_3_4 - 0.00169312169312168*G0_1_1_3_3_5 - 0.00169312169312169*G0_1_1_3_4_0 + 0.00338624338624337*G0_1_1_3_4_1 - 0.00507936507936505*G0_1_1_3_4_3 - 0.0118518518518518*G0_1_1_3_4_4 - 0.0101587301587301*G0_1_1_3_4_5 - 0.00253968253968253*G0_1_1_3_5_0 + 0.0059259259259259*G0_1_1_3_5_1 + 0.00169312169312168*G0_1_1_3_5_2 - 0.00169312169312168*G0_1_1_3_5_3 - 0.0101587301587301*G0_1_1_3_5_4 - 0.0186243386243385*G0_1_1_3_5_5 - 0.0232804232804232*G0_1_1_4_0_0 + 0.00296296296296295*G0_1_1_4_0_1 + 0.00507936507936506*G0_1_1_4_0_2 - 0.00169312169312169*G0_1_1_4_0_3 - 0.0211640211640211*G0_1_1_4_0_4 - 0.0126984126984126*G0_1_1_4_0_5 + 0.00296296296296295*G0_1_1_4_1_0 - 0.00126984126984126*G0_1_1_4_1_1 - 0.00126984126984127*G0_1_1_4_1_2 + 0.00338624338624337*G0_1_1_4_1_3 + 0.00761904761904759*G0_1_1_4_1_4 + 0.00761904761904758*G0_1_1_4_1_5 + 0.00507936507936506*G0_1_1_4_2_0 - 0.00126984126984127*G0_1_1_4_2_1 - 0.00634920634920632*G0_1_1_4_2_2 + 0.00846560846560844*G0_1_1_4_2_4 + 0.00677248677248674*G0_1_1_4_2_5 - 0.00169312169312169*G0_1_1_4_3_0 + 0.00338624338624337*G0_1_1_4_3_1 - 0.00507936507936506*G0_1_1_4_3_3 - 0.0118518518518518*G0_1_1_4_3_4 - 0.0101587301587301*G0_1_1_4_3_5 - 0.0211640211640211*G0_1_1_4_4_0 + 0.00761904761904759*G0_1_1_4_4_1 + 0.00846560846560843*G0_1_1_4_4_2 - 0.0118518518518518*G0_1_1_4_4_3 - 0.0558730158730156*G0_1_1_4_4_4 - 0.0287830687830687*G0_1_1_4_4_5 - 0.0126984126984126*G0_1_1_4_5_0 + 0.00761904761904758*G0_1_1_4_5_1 + 0.00677248677248674*G0_1_1_4_5_2 - 0.0101587301587301*G0_1_1_4_5_3 - 0.0287830687830687*G0_1_1_4_5_4 - 0.0389417989417987*G0_1_1_4_5_5 - 0.0275132275132274*G0_1_1_5_0_0 + 0.00550264550264547*G0_1_1_5_0_1 + 0.00338624338624337*G0_1_1_5_0_2 - 0.00253968253968253*G0_1_1_5_0_3 - 0.0126984126984126*G0_1_1_5_0_4 - 0.0296296296296295*G0_1_1_5_0_5 + 0.00550264550264547*G0_1_1_5_1_0 + 0.00211640211640211*G0_1_1_5_1_1 - 0.00253968253968253*G0_1_1_5_1_2 + 0.0059259259259259*G0_1_1_5_1_3 + 0.00761904761904758*G0_1_1_5_1_4 + 0.0194708994708994*G0_1_1_5_1_5 + 0.00338624338624337*G0_1_1_5_2_0 - 0.00253968253968253*G0_1_1_5_2_1 - 0.00211640211640211*G0_1_1_5_2_2 + 0.00169312169312168*G0_1_1_5_2_3 + 0.00677248677248674*G0_1_1_5_2_4 + 0.0118518518518518*G0_1_1_5_2_5 - 0.00253968253968253*G0_1_1_5_3_0 + 0.0059259259259259*G0_1_1_5_3_1 + 0.00169312169312168*G0_1_1_5_3_2 - 0.00169312169312168*G0_1_1_5_3_3 - 0.0101587301587301*G0_1_1_5_3_4 - 0.0186243386243385*G0_1_1_5_3_5 - 0.0126984126984126*G0_1_1_5_4_0 + 0.00761904761904758*G0_1_1_5_4_1 + 0.00677248677248674*G0_1_1_5_4_2 - 0.0101587301587301*G0_1_1_5_4_3 - 0.0287830687830687*G0_1_1_5_4_4 - 0.0389417989417987*G0_1_1_5_4_5 - 0.0296296296296295*G0_1_1_5_5_0 + 0.0194708994708994*G0_1_1_5_5_1 + 0.0118518518518518*G0_1_1_5_5_2 - 0.0186243386243385*G0_1_1_5_5_3 - 0.0389417989417987*G0_1_1_5_5_4 - 0.147301587301586*G0_1_1_5_5_5; + A[1] = -A[25] + 0.015079365079365*G0_0_0_0_0_0 - 0.00111111111111111*G0_0_0_0_0_1 - 0.00111111111111111*G0_0_0_0_0_2 + 0.000105820105820108*G0_0_0_0_0_3 + 0.0079365079365079*G0_0_0_0_0_4 + 0.00370370370370369*G0_0_0_0_0_5 - 0.00111111111111111*G0_0_0_0_1_0 - 0.000264550264550263*G0_0_0_0_1_1 + 0.000343915343915342*G0_0_0_0_1_2 - 0.000423280423280423*G0_0_0_0_1_4 - 0.000529100529100528*G0_0_0_0_1_5 - 0.00111111111111111*G0_0_0_0_2_0 + 0.000343915343915342*G0_0_0_0_2_1 - 0.0011111111111111*G0_0_0_0_2_2 - 0.00126984126984126*G0_0_0_0_2_3 - 0.0039153439153439*G0_0_0_0_2_4 - 0.00126984126984126*G0_0_0_0_2_5 + 0.000105820105820108*G0_0_0_0_3_0 - 0.00126984126984126*G0_0_0_0_3_2 + 0.00296296296296294*G0_0_0_0_3_3 + 0.000634920634920634*G0_0_0_0_3_4 + 0.00232804232804232*G0_0_0_0_3_5 + 0.0079365079365079*G0_0_0_0_4_0 - 0.000423280423280423*G0_0_0_0_4_1 - 0.0039153439153439*G0_0_0_0_4_2 + 0.000634920634920634*G0_0_0_0_4_3 + 0.00507936507936506*G0_0_0_0_4_4 + 0.00338624338624337*G0_0_0_0_4_5 + 0.00370370370370369*G0_0_0_0_5_0 - 0.000529100529100528*G0_0_0_0_5_1 - 0.00126984126984126*G0_0_0_0_5_2 + 0.00232804232804232*G0_0_0_0_5_3 + 0.00338624338624337*G0_0_0_0_5_4 + 0.00507936507936505*G0_0_0_0_5_5 - 0.00111111111111111*G0_0_0_1_0_0 - 0.000264550264550263*G0_0_0_1_0_1 + 0.000343915343915342*G0_0_0_1_0_2 - 0.000423280423280423*G0_0_0_1_0_4 - 0.000529100529100528*G0_0_0_1_0_5 - 0.000264550264550263*G0_0_0_1_1_0 + 0.0087301587301587*G0_0_0_1_1_1 - 0.000264550264550264*G0_0_0_1_1_2 + 0.00158730158730158*G0_0_0_1_1_3 + 0.000529100529100527*G0_0_0_1_1_4 + 0.00158730158730158*G0_0_0_1_1_5 + 0.000343915343915342*G0_0_0_1_2_0 - 0.000264550264550264*G0_0_0_1_2_1 - 0.0011111111111111*G0_0_0_1_2_2 - 0.000529100529100526*G0_0_0_1_2_3 - 0.00042328042328042*G0_0_0_1_2_4 + 0.00158730158730158*G0_0_0_1_3_1 - 0.000529100529100526*G0_0_0_1_3_2 - 0.00105820105820105*G0_0_0_1_3_4 - 0.000423280423280423*G0_0_0_1_4_0 + 0.000529100529100528*G0_0_0_1_4_1 - 0.00042328042328042*G0_0_0_1_4_2 - 0.00105820105820105*G0_0_0_1_4_3 - 0.00550264550264548*G0_0_0_1_4_4 - 0.00105820105820105*G0_0_0_1_4_5 - 0.000529100529100528*G0_0_0_1_5_0 + 0.00158730158730158*G0_0_0_1_5_1 - 0.00105820105820105*G0_0_0_1_5_4 - 0.00111111111111111*G0_0_0_2_0_0 + 0.000343915343915342*G0_0_0_2_0_1 - 0.0011111111111111*G0_0_0_2_0_2 - 0.00126984126984126*G0_0_0_2_0_3 - 0.0039153439153439*G0_0_0_2_0_4 - 0.00126984126984127*G0_0_0_2_0_5 + 0.000343915343915342*G0_0_0_2_1_0 - 0.000264550264550264*G0_0_0_2_1_1 - 0.0011111111111111*G0_0_0_2_1_2 - 0.000529100529100526*G0_0_0_2_1_3 - 0.00042328042328042*G0_0_0_2_1_4 - 0.0011111111111111*G0_0_0_2_2_0 - 0.0011111111111111*G0_0_0_2_2_1 + 0.015079365079365*G0_0_0_2_2_2 + 0.00370370370370368*G0_0_0_2_2_3 + 0.00793650793650789*G0_0_0_2_2_4 + 0.000105820105820109*G0_0_0_2_2_5 - 0.00126984126984126*G0_0_0_2_3_0 - 0.000529100529100526*G0_0_0_2_3_1 + 0.00370370370370368*G0_0_0_2_3_2 + 0.00507936507936506*G0_0_0_2_3_3 + 0.00338624338624337*G0_0_0_2_3_4 + 0.00232804232804232*G0_0_0_2_3_5 - 0.0039153439153439*G0_0_0_2_4_0 - 0.00042328042328042*G0_0_0_2_4_1 + 0.00793650793650789*G0_0_0_2_4_2 + 0.00338624338624337*G0_0_0_2_4_3 + 0.00507936507936505*G0_0_0_2_4_4 + 0.000634920634920633*G0_0_0_2_4_5 - 0.00126984126984126*G0_0_0_2_5_0 + 0.000105820105820109*G0_0_0_2_5_2 + 0.00232804232804232*G0_0_0_2_5_3 + 0.000634920634920633*G0_0_0_2_5_4 + 0.00296296296296295*G0_0_0_2_5_5 + 0.000105820105820108*G0_0_0_3_0_0 - 0.00126984126984126*G0_0_0_3_0_2 + 0.00296296296296294*G0_0_0_3_0_3 + 0.000634920634920633*G0_0_0_3_0_4 + 0.00232804232804232*G0_0_0_3_0_5 + 0.00158730158730158*G0_0_0_3_1_1 - 0.000529100529100526*G0_0_0_3_1_2 - 0.00105820105820105*G0_0_0_3_1_4 - 0.00126984126984126*G0_0_0_3_2_0 - 0.000529100529100525*G0_0_0_3_2_1 + 0.00370370370370368*G0_0_0_3_2_2 + 0.00507936507936506*G0_0_0_3_2_3 + 0.00338624338624337*G0_0_0_3_2_4 + 0.00232804232804232*G0_0_0_3_2_5 + 0.00296296296296294*G0_0_0_3_3_0 + 0.00507936507936506*G0_0_0_3_3_2 - 0.0317460317460316*G0_0_0_3_3_3 - 0.00380952380952379*G0_0_0_3_3_4 - 0.0105820105820105*G0_0_0_3_3_5 + 0.000634920634920633*G0_0_0_3_4_0 - 0.00105820105820105*G0_0_0_3_4_1 + 0.00338624338624337*G0_0_0_3_4_2 - 0.00380952380952379*G0_0_0_3_4_3 + 0.00973544973544969*G0_0_0_3_4_4 - 0.00253968253968253*G0_0_0_3_4_5 + 0.00232804232804232*G0_0_0_3_5_0 + 0.00232804232804232*G0_0_0_3_5_2 - 0.0105820105820105*G0_0_0_3_5_3 - 0.00253968253968253*G0_0_0_3_5_4 - 0.0105820105820105*G0_0_0_3_5_5 + 0.0079365079365079*G0_0_0_4_0_0 - 0.000423280423280423*G0_0_0_4_0_1 - 0.0039153439153439*G0_0_0_4_0_2 + 0.000634920634920633*G0_0_0_4_0_3 + 0.00507936507936506*G0_0_0_4_0_4 + 0.00338624338624337*G0_0_0_4_0_5 - 0.000423280423280423*G0_0_0_4_1_0 + 0.000529100529100527*G0_0_0_4_1_1 - 0.00042328042328042*G0_0_0_4_1_2 - 0.00105820105820105*G0_0_0_4_1_3 - 0.00550264550264548*G0_0_0_4_1_4 - 0.00105820105820105*G0_0_0_4_1_5 - 0.0039153439153439*G0_0_0_4_2_0 - 0.00042328042328042*G0_0_0_4_2_1 + 0.00793650793650789*G0_0_0_4_2_2 + 0.00338624338624337*G0_0_0_4_2_3 + 0.00507936507936505*G0_0_0_4_2_4 + 0.000634920634920633*G0_0_0_4_2_5 + 0.000634920634920633*G0_0_0_4_3_0 - 0.00105820105820105*G0_0_0_4_3_1 + 0.00338624338624337*G0_0_0_4_3_2 - 0.00380952380952379*G0_0_0_4_3_3 + 0.00973544973544969*G0_0_0_4_3_4 - 0.00253968253968253*G0_0_0_4_3_5 + 0.00507936507936506*G0_0_0_4_4_0 - 0.00550264550264548*G0_0_0_4_4_1 + 0.00507936507936505*G0_0_0_4_4_2 + 0.00973544973544969*G0_0_0_4_4_3 + 0.0901587301587298*G0_0_0_4_4_4 + 0.00973544973544971*G0_0_0_4_4_5 + 0.00338624338624337*G0_0_0_4_5_0 - 0.00105820105820105*G0_0_0_4_5_1 + 0.000634920634920633*G0_0_0_4_5_2 - 0.00253968253968253*G0_0_0_4_5_3 + 0.00973544973544971*G0_0_0_4_5_4 - 0.00380952380952379*G0_0_0_4_5_5 + 0.00370370370370369*G0_0_0_5_0_0 - 0.000529100529100528*G0_0_0_5_0_1 - 0.00126984126984126*G0_0_0_5_0_2 + 0.00232804232804232*G0_0_0_5_0_3 + 0.00338624338624337*G0_0_0_5_0_4 + 0.00507936507936505*G0_0_0_5_0_5 - 0.000529100529100528*G0_0_0_5_1_0 + 0.00158730158730158*G0_0_0_5_1_1 - 0.00105820105820105*G0_0_0_5_1_4 - 0.00126984126984126*G0_0_0_5_2_0 + 0.000105820105820109*G0_0_0_5_2_2 + 0.00232804232804232*G0_0_0_5_2_3 + 0.000634920634920633*G0_0_0_5_2_4 + 0.00296296296296295*G0_0_0_5_2_5 + 0.00232804232804232*G0_0_0_5_3_0 + 0.00232804232804232*G0_0_0_5_3_2 - 0.0105820105820105*G0_0_0_5_3_3 - 0.00253968253968253*G0_0_0_5_3_4 - 0.0105820105820105*G0_0_0_5_3_5 + 0.00338624338624337*G0_0_0_5_4_0 - 0.00105820105820105*G0_0_0_5_4_1 + 0.000634920634920633*G0_0_0_5_4_2 - 0.00253968253968253*G0_0_0_5_4_3 + 0.0097354497354497*G0_0_0_5_4_4 - 0.00380952380952379*G0_0_0_5_4_5 + 0.00507936507936505*G0_0_0_5_5_0 + 0.00296296296296295*G0_0_0_5_5_2 - 0.0105820105820105*G0_0_0_5_5_3 - 0.00380952380952379*G0_0_0_5_5_4 - 0.0317460317460315*G0_0_0_5_5_5 - 0.00396825396825394*G0_1_0_0_0_0 + 0.000476190476190474*G0_1_0_0_0_1 + 0.000476190476190473*G0_1_0_0_0_2 + 0.000105820105820105*G0_1_0_0_0_3 - 0.000529100529100526*G0_1_0_0_0_4 - 0.000529100529100525*G0_1_0_0_0_5 + 0.000476190476190474*G0_1_0_0_1_0 - 0.00132275132275132*G0_1_0_0_1_1 + 0.000238095238095237*G0_1_0_0_1_2 - 0.000423280423280421*G0_1_0_0_1_3 + 0.00021164021164021*G0_1_0_0_1_4 - 0.00116402116402116*G0_1_0_0_1_5 + 0.000476190476190473*G0_1_0_0_2_0 + 0.000238095238095237*G0_1_0_0_2_1 - 0.00132275132275131*G0_1_0_0_2_2 - 0.00042328042328042*G0_1_0_0_2_3 - 0.00116402116402116*G0_1_0_0_2_4 + 0.00021164021164021*G0_1_0_0_2_5 + 0.000105820105820105*G0_1_0_0_3_0 - 0.000423280423280421*G0_1_0_0_3_1 - 0.00042328042328042*G0_1_0_0_3_2 + 0.000423280423280418*G0_1_0_0_3_3 - 0.000634920634920632*G0_1_0_0_3_4 - 0.000634920634920633*G0_1_0_0_3_5 - 0.000529100529100525*G0_1_0_0_4_0 + 0.00021164021164021*G0_1_0_0_4_1 - 0.00116402116402116*G0_1_0_0_4_2 - 0.000634920634920632*G0_1_0_0_4_3 - 0.00338624338624337*G0_1_0_0_4_4 - 0.000846560846560844*G0_1_0_0_4_5 - 0.000529100529100524*G0_1_0_0_5_0 - 0.00116402116402116*G0_1_0_0_5_1 + 0.00021164021164021*G0_1_0_0_5_2 - 0.000634920634920633*G0_1_0_0_5_3 - 0.000846560846560844*G0_1_0_0_5_4 - 0.00338624338624337*G0_1_0_0_5_5 + 0.000476190476190473*G0_1_0_1_0_0 - 0.00132275132275132*G0_1_0_1_0_1 + 0.000238095238095237*G0_1_0_1_0_2 - 0.000423280423280421*G0_1_0_1_0_3 + 0.00021164021164021*G0_1_0_1_0_4 - 0.00116402116402116*G0_1_0_1_0_5 - 0.00132275132275132*G0_1_0_1_1_0 + 0.0134920634920634*G0_1_0_1_1_1 - 0.000793650793650792*G0_1_0_1_1_2 + 0.00370370370370369*G0_1_0_1_1_3 + 0.000529100529100527*G0_1_0_1_1_4 + 0.0058201058201058*G0_1_0_1_1_5 + 0.000238095238095237*G0_1_0_1_2_0 - 0.000793650793650792*G0_1_0_1_2_1 - 0.000793650793650788*G0_1_0_1_2_2 - 0.000952380952380948*G0_1_0_1_2_3 - 0.000634920634920631*G0_1_0_1_2_4 - 0.000634920634920633*G0_1_0_1_2_5 - 0.000423280423280421*G0_1_0_1_3_0 + 0.00370370370370369*G0_1_0_1_3_1 - 0.000952380952380949*G0_1_0_1_3_2 + 0.00211640211640211*G0_1_0_1_3_3 - 0.00021164021164021*G0_1_0_1_3_4 + 0.00211640211640211*G0_1_0_1_3_5 + 0.00021164021164021*G0_1_0_1_4_0 + 0.000529100529100527*G0_1_0_1_4_1 - 0.000634920634920631*G0_1_0_1_4_2 - 0.00021164021164021*G0_1_0_1_4_3 - 0.00169312169312168*G0_1_0_1_4_4 + 0.00021164021164021*G0_1_0_1_4_5 - 0.00116402116402116*G0_1_0_1_5_0 + 0.0058201058201058*G0_1_0_1_5_1 - 0.000634920634920633*G0_1_0_1_5_2 + 0.00211640211640211*G0_1_0_1_5_3 + 0.00021164021164021*G0_1_0_1_5_4 + 0.00634920634920632*G0_1_0_1_5_5 + 0.000476190476190474*G0_1_0_2_0_0 + 0.000238095238095237*G0_1_0_2_0_1 - 0.00132275132275131*G0_1_0_2_0_2 - 0.00042328042328042*G0_1_0_2_0_3 - 0.00116402116402116*G0_1_0_2_0_4 + 0.00021164021164021*G0_1_0_2_0_5 + 0.000238095238095237*G0_1_0_2_1_0 - 0.000793650793650792*G0_1_0_2_1_1 - 0.000793650793650788*G0_1_0_2_1_2 - 0.000952380952380949*G0_1_0_2_1_3 - 0.000634920634920631*G0_1_0_2_1_4 - 0.000634920634920633*G0_1_0_2_1_5 - 0.00132275132275131*G0_1_0_2_2_0 - 0.000793650793650788*G0_1_0_2_2_1 + 0.0134920634920634*G0_1_0_2_2_2 + 0.00370370370370368*G0_1_0_2_2_3 + 0.00582010582010579*G0_1_0_2_2_4 + 0.00052910052910053*G0_1_0_2_2_5 - 0.00042328042328042*G0_1_0_2_3_0 - 0.000952380952380949*G0_1_0_2_3_1 + 0.00370370370370368*G0_1_0_2_3_2 + 0.0021164021164021*G0_1_0_2_3_3 + 0.0021164021164021*G0_1_0_2_3_4 - 0.000211640211640211*G0_1_0_2_3_5 - 0.00116402116402116*G0_1_0_2_4_0 - 0.000634920634920631*G0_1_0_2_4_1 + 0.00582010582010579*G0_1_0_2_4_2 + 0.0021164021164021*G0_1_0_2_4_3 + 0.00634920634920632*G0_1_0_2_4_4 + 0.000211640211640212*G0_1_0_2_4_5 + 0.00021164021164021*G0_1_0_2_5_0 - 0.000634920634920633*G0_1_0_2_5_1 + 0.00052910052910053*G0_1_0_2_5_2 - 0.000211640211640211*G0_1_0_2_5_3 + 0.000211640211640212*G0_1_0_2_5_4 - 0.00169312169312169*G0_1_0_2_5_5 + 0.000105820105820105*G0_1_0_3_0_0 - 0.000423280423280421*G0_1_0_3_0_1 - 0.00042328042328042*G0_1_0_3_0_2 + 0.000423280423280418*G0_1_0_3_0_3 - 0.000634920634920632*G0_1_0_3_0_4 - 0.000634920634920633*G0_1_0_3_0_5 - 0.000423280423280421*G0_1_0_3_1_0 + 0.00370370370370369*G0_1_0_3_1_1 - 0.000952380952380949*G0_1_0_3_1_2 + 0.00211640211640211*G0_1_0_3_1_3 - 0.00021164021164021*G0_1_0_3_1_4 + 0.00211640211640211*G0_1_0_3_1_5 - 0.00042328042328042*G0_1_0_3_2_0 - 0.000952380952380949*G0_1_0_3_2_1 + 0.00370370370370368*G0_1_0_3_2_2 + 0.0021164021164021*G0_1_0_3_2_3 + 0.0021164021164021*G0_1_0_3_2_4 - 0.000211640211640211*G0_1_0_3_2_5 + 0.000423280423280418*G0_1_0_3_3_0 + 0.00211640211640211*G0_1_0_3_3_1 + 0.0021164021164021*G0_1_0_3_3_2 - 0.0165079365079364*G0_1_0_3_3_3 - 0.000423280423280419*G0_1_0_3_3_4 - 0.000423280423280416*G0_1_0_3_3_5 - 0.000634920634920632*G0_1_0_3_4_0 - 0.00021164021164021*G0_1_0_3_4_1 + 0.0021164021164021*G0_1_0_3_4_2 - 0.000423280423280419*G0_1_0_3_4_3 + 0.00465608465608463*G0_1_0_3_4_4 + 0.000846560846560845*G0_1_0_3_4_5 - 0.000634920634920633*G0_1_0_3_5_0 + 0.00211640211640211*G0_1_0_3_5_1 - 0.000211640211640211*G0_1_0_3_5_2 - 0.000423280423280417*G0_1_0_3_5_3 + 0.000846560846560845*G0_1_0_3_5_4 + 0.00465608465608464*G0_1_0_3_5_5 - 0.000529100529100526*G0_1_0_4_0_0 + 0.00021164021164021*G0_1_0_4_0_1 - 0.00116402116402116*G0_1_0_4_0_2 - 0.000634920634920632*G0_1_0_4_0_3 - 0.00338624338624337*G0_1_0_4_0_4 - 0.000846560846560844*G0_1_0_4_0_5 + 0.00021164021164021*G0_1_0_4_1_0 + 0.000529100529100527*G0_1_0_4_1_1 - 0.000634920634920631*G0_1_0_4_1_2 - 0.00021164021164021*G0_1_0_4_1_3 - 0.00169312169312168*G0_1_0_4_1_4 + 0.00021164021164021*G0_1_0_4_1_5 - 0.00116402116402116*G0_1_0_4_2_0 - 0.000634920634920631*G0_1_0_4_2_1 + 0.00582010582010579*G0_1_0_4_2_2 + 0.0021164021164021*G0_1_0_4_2_3 + 0.00634920634920632*G0_1_0_4_2_4 + 0.000211640211640212*G0_1_0_4_2_5 - 0.000634920634920632*G0_1_0_4_3_0 - 0.00021164021164021*G0_1_0_4_3_1 + 0.0021164021164021*G0_1_0_4_3_2 - 0.000423280423280419*G0_1_0_4_3_3 + 0.00465608465608464*G0_1_0_4_3_4 + 0.000846560846560845*G0_1_0_4_3_5 - 0.00338624338624337*G0_1_0_4_4_0 - 0.00169312169312169*G0_1_0_4_4_1 + 0.00634920634920632*G0_1_0_4_4_2 + 0.00465608465608463*G0_1_0_4_4_3 + 0.0292063492063491*G0_1_0_4_4_4 + 0.00296296296296295*G0_1_0_4_4_5 - 0.000846560846560844*G0_1_0_4_5_0 + 0.00021164021164021*G0_1_0_4_5_1 + 0.000211640211640212*G0_1_0_4_5_2 + 0.000846560846560845*G0_1_0_4_5_3 + 0.00296296296296295*G0_1_0_4_5_4 + 0.00296296296296295*G0_1_0_4_5_5 - 0.000529100529100525*G0_1_0_5_0_0 - 0.00116402116402116*G0_1_0_5_0_1 + 0.00021164021164021*G0_1_0_5_0_2 - 0.000634920634920633*G0_1_0_5_0_3 - 0.000846560846560844*G0_1_0_5_0_4 - 0.00338624338624337*G0_1_0_5_0_5 - 0.00116402116402116*G0_1_0_5_1_0 + 0.0058201058201058*G0_1_0_5_1_1 - 0.000634920634920633*G0_1_0_5_1_2 + 0.00211640211640211*G0_1_0_5_1_3 + 0.000211640211640211*G0_1_0_5_1_4 + 0.00634920634920632*G0_1_0_5_1_5 + 0.00021164021164021*G0_1_0_5_2_0 - 0.000634920634920633*G0_1_0_5_2_1 + 0.00052910052910053*G0_1_0_5_2_2 - 0.000211640211640211*G0_1_0_5_2_3 + 0.000211640211640212*G0_1_0_5_2_4 - 0.00169312169312169*G0_1_0_5_2_5 - 0.000634920634920633*G0_1_0_5_3_0 + 0.00211640211640211*G0_1_0_5_3_1 - 0.000211640211640211*G0_1_0_5_3_2 - 0.000423280423280416*G0_1_0_5_3_3 + 0.000846560846560845*G0_1_0_5_3_4 + 0.00465608465608464*G0_1_0_5_3_5 - 0.000846560846560844*G0_1_0_5_4_0 + 0.000211640211640211*G0_1_0_5_4_1 + 0.000211640211640212*G0_1_0_5_4_2 + 0.000846560846560844*G0_1_0_5_4_3 + 0.00296296296296295*G0_1_0_5_4_4 + 0.00296296296296295*G0_1_0_5_4_5 - 0.00338624338624337*G0_1_0_5_5_0 + 0.00634920634920632*G0_1_0_5_5_1 - 0.00169312169312169*G0_1_0_5_5_2 + 0.00465608465608464*G0_1_0_5_5_3 + 0.00296296296296295*G0_1_0_5_5_4 + 0.0292063492063491*G0_1_0_5_5_5; + A[5] = -A[3] - 0.0634920634920632*G0_0_0_0_0_0 + 0.00529100529100527*G0_0_0_0_0_1 + 0.00634920634920632*G0_0_0_0_0_2 - 0.00211640211640211*G0_0_0_0_0_3 - 0.0275132275132274*G0_0_0_0_0_4 - 0.0232804232804232*G0_0_0_0_0_5 + 0.00529100529100527*G0_0_0_0_1_0 - 0.000740740740740738*G0_0_0_0_1_2 + 0.00126984126984126*G0_0_0_0_1_3 + 0.00338624338624337*G0_0_0_0_1_4 + 0.00507936507936505*G0_0_0_0_1_5 + 0.00634920634920632*G0_0_0_0_2_0 - 0.000740740740740738*G0_0_0_0_2_1 - 0.00253968253968253*G0_0_0_0_2_2 - 0.000423280423280418*G0_0_0_0_2_3 + 0.00550264550264548*G0_0_0_0_2_4 + 0.00296296296296295*G0_0_0_0_2_5 - 0.00211640211640211*G0_0_0_0_3_0 + 0.00126984126984126*G0_0_0_0_3_1 - 0.000423280423280418*G0_0_0_0_3_2 - 0.000846560846560845*G0_0_0_0_3_3 - 0.00253968253968253*G0_0_0_0_3_4 - 0.00169312169312169*G0_0_0_0_3_5 - 0.0275132275132274*G0_0_0_0_4_0 + 0.00338624338624337*G0_0_0_0_4_1 + 0.00550264550264548*G0_0_0_0_4_2 - 0.00253968253968253*G0_0_0_0_4_3 - 0.0296296296296295*G0_0_0_0_4_4 - 0.0126984126984126*G0_0_0_0_4_5 - 0.0232804232804232*G0_0_0_0_5_0 + 0.00507936507936505*G0_0_0_0_5_1 + 0.00296296296296295*G0_0_0_0_5_2 - 0.00169312169312169*G0_0_0_0_5_3 - 0.0126984126984126*G0_0_0_0_5_4 - 0.0211640211640211*G0_0_0_0_5_5 + 0.00529100529100527*G0_0_0_1_0_0 - 0.000740740740740738*G0_0_0_1_0_2 + 0.00126984126984126*G0_0_0_1_0_3 + 0.00338624338624337*G0_0_0_1_0_4 + 0.00507936507936505*G0_0_0_1_0_5 - 0.0158730158730158*G0_0_0_1_1_1 + 0.0021164021164021*G0_0_0_1_1_2 - 0.00634920634920631*G0_0_0_1_1_3 - 0.00211640211640211*G0_0_0_1_1_4 - 0.00634920634920631*G0_0_0_1_1_5 - 0.000740740740740738*G0_0_0_1_2_0 + 0.0021164021164021*G0_0_0_1_2_1 - 0.00148148148148147*G0_0_0_1_2_2 - 0.000846560846560842*G0_0_0_1_2_3 - 0.00253968253968253*G0_0_0_1_2_4 - 0.00126984126984127*G0_0_0_1_2_5 + 0.00126984126984126*G0_0_0_1_3_0 - 0.00634920634920631*G0_0_0_1_3_1 - 0.000846560846560842*G0_0_0_1_3_2 - 0.00846560846560842*G0_0_0_1_3_3 + 0.00169312169312168*G0_0_0_1_3_4 + 0.00338624338624337*G0_0_0_1_4_0 - 0.00211640211640211*G0_0_0_1_4_1 - 0.00253968253968253*G0_0_0_1_4_2 + 0.00169312169312168*G0_0_0_1_4_3 + 0.0118518518518518*G0_0_0_1_4_4 + 0.00677248677248674*G0_0_0_1_4_5 + 0.00507936507936505*G0_0_0_1_5_0 - 0.00634920634920631*G0_0_0_1_5_1 - 0.00126984126984127*G0_0_0_1_5_2 + 0.00677248677248674*G0_0_0_1_5_4 + 0.00846560846560842*G0_0_0_1_5_5 + 0.00634920634920632*G0_0_0_2_0_0 - 0.000740740740740738*G0_0_0_2_0_1 - 0.00253968253968253*G0_0_0_2_0_2 - 0.000423280423280418*G0_0_0_2_0_3 + 0.00550264550264548*G0_0_0_2_0_4 + 0.00296296296296295*G0_0_0_2_0_5 - 0.000740740740740738*G0_0_0_2_1_0 + 0.0021164021164021*G0_0_0_2_1_1 - 0.00148148148148147*G0_0_0_2_1_2 - 0.000846560846560843*G0_0_0_2_1_3 - 0.00253968253968253*G0_0_0_2_1_4 - 0.00126984126984127*G0_0_0_2_1_5 - 0.00253968253968253*G0_0_0_2_2_0 - 0.00148148148148147*G0_0_0_2_2_1 + 0.0190476190476189*G0_0_0_2_2_2 + 0.00634920634920631*G0_0_0_2_2_3 + 0.0021164021164021*G0_0_0_2_2_4 - 0.00126984126984126*G0_0_0_2_2_5 - 0.000423280423280418*G0_0_0_2_3_0 - 0.000846560846560842*G0_0_0_2_3_1 + 0.00634920634920631*G0_0_0_2_3_2 + 0.0110052910052909*G0_0_0_2_3_3 + 0.0059259259259259*G0_0_0_2_3_4 + 0.00338624338624337*G0_0_0_2_3_5 + 0.00550264550264548*G0_0_0_2_4_0 - 0.00253968253968253*G0_0_0_2_4_1 + 0.0021164021164021*G0_0_0_2_4_2 + 0.0059259259259259*G0_0_0_2_4_3 + 0.0194708994708994*G0_0_0_2_4_4 + 0.00761904761904759*G0_0_0_2_4_5 + 0.00296296296296295*G0_0_0_2_5_0 - 0.00126984126984127*G0_0_0_2_5_1 - 0.00126984126984126*G0_0_0_2_5_2 + 0.00338624338624337*G0_0_0_2_5_3 + 0.00761904761904759*G0_0_0_2_5_4 + 0.00761904761904758*G0_0_0_2_5_5 - 0.00211640211640211*G0_0_0_3_0_0 + 0.00126984126984126*G0_0_0_3_0_1 - 0.000423280423280418*G0_0_0_3_0_2 - 0.000846560846560845*G0_0_0_3_0_3 - 0.00253968253968253*G0_0_0_3_0_4 - 0.00169312169312169*G0_0_0_3_0_5 + 0.00126984126984126*G0_0_0_3_1_0 - 0.00634920634920631*G0_0_0_3_1_1 - 0.000846560846560842*G0_0_0_3_1_2 - 0.00846560846560842*G0_0_0_3_1_3 + 0.00169312169312168*G0_0_0_3_1_4 - 0.000423280423280418*G0_0_0_3_2_0 - 0.000846560846560842*G0_0_0_3_2_1 + 0.00634920634920631*G0_0_0_3_2_2 + 0.0110052910052909*G0_0_0_3_2_3 + 0.0059259259259259*G0_0_0_3_2_4 + 0.00338624338624337*G0_0_0_3_2_5 - 0.000846560846560845*G0_0_0_3_3_0 - 0.00846560846560842*G0_0_0_3_3_1 + 0.0110052910052909*G0_0_0_3_3_2 + 0.00507936507936507*G0_0_0_3_3_3 - 0.00169312169312168*G0_0_0_3_3_4 - 0.00507936507936505*G0_0_0_3_3_5 - 0.00253968253968253*G0_0_0_3_4_0 + 0.00169312169312168*G0_0_0_3_4_1 + 0.0059259259259259*G0_0_0_3_4_2 - 0.00169312169312168*G0_0_0_3_4_3 - 0.0186243386243385*G0_0_0_3_4_4 - 0.0101587301587301*G0_0_0_3_4_5 - 0.00169312169312169*G0_0_0_3_5_0 + 0.00338624338624337*G0_0_0_3_5_2 - 0.00507936507936505*G0_0_0_3_5_3 - 0.0101587301587301*G0_0_0_3_5_4 - 0.0118518518518518*G0_0_0_3_5_5 - 0.0275132275132274*G0_0_0_4_0_0 + 0.00338624338624337*G0_0_0_4_0_1 + 0.00550264550264548*G0_0_0_4_0_2 - 0.00253968253968253*G0_0_0_4_0_3 - 0.0296296296296295*G0_0_0_4_0_4 - 0.0126984126984126*G0_0_0_4_0_5 + 0.00338624338624337*G0_0_0_4_1_0 - 0.00211640211640211*G0_0_0_4_1_1 - 0.00253968253968253*G0_0_0_4_1_2 + 0.00169312169312168*G0_0_0_4_1_3 + 0.0118518518518518*G0_0_0_4_1_4 + 0.00677248677248674*G0_0_0_4_1_5 + 0.00550264550264548*G0_0_0_4_2_0 - 0.00253968253968253*G0_0_0_4_2_1 + 0.0021164021164021*G0_0_0_4_2_2 + 0.0059259259259259*G0_0_0_4_2_3 + 0.0194708994708994*G0_0_0_4_2_4 + 0.00761904761904759*G0_0_0_4_2_5 - 0.00253968253968253*G0_0_0_4_3_0 + 0.00169312169312168*G0_0_0_4_3_1 + 0.0059259259259259*G0_0_0_4_3_2 - 0.00169312169312168*G0_0_0_4_3_3 - 0.0186243386243385*G0_0_0_4_3_4 - 0.0101587301587301*G0_0_0_4_3_5 - 0.0296296296296295*G0_0_0_4_4_0 + 0.0118518518518518*G0_0_0_4_4_1 + 0.0194708994708994*G0_0_0_4_4_2 - 0.0186243386243385*G0_0_0_4_4_3 - 0.147301587301587*G0_0_0_4_4_4 - 0.0389417989417988*G0_0_0_4_4_5 - 0.0126984126984126*G0_0_0_4_5_0 + 0.00677248677248674*G0_0_0_4_5_1 + 0.00761904761904759*G0_0_0_4_5_2 - 0.0101587301587301*G0_0_0_4_5_3 - 0.0389417989417988*G0_0_0_4_5_4 - 0.0287830687830686*G0_0_0_4_5_5 - 0.0232804232804232*G0_0_0_5_0_0 + 0.00507936507936505*G0_0_0_5_0_1 + 0.00296296296296295*G0_0_0_5_0_2 - 0.00169312169312169*G0_0_0_5_0_3 - 0.0126984126984126*G0_0_0_5_0_4 - 0.0211640211640211*G0_0_0_5_0_5 + 0.00507936507936505*G0_0_0_5_1_0 - 0.00634920634920631*G0_0_0_5_1_1 - 0.00126984126984127*G0_0_0_5_1_2 + 0.00677248677248674*G0_0_0_5_1_4 + 0.00846560846560842*G0_0_0_5_1_5 + 0.00296296296296295*G0_0_0_5_2_0 - 0.00126984126984127*G0_0_0_5_2_1 - 0.00126984126984126*G0_0_0_5_2_2 + 0.00338624338624337*G0_0_0_5_2_3 + 0.00761904761904759*G0_0_0_5_2_4 + 0.00761904761904758*G0_0_0_5_2_5 - 0.00169312169312169*G0_0_0_5_3_0 + 0.00338624338624337*G0_0_0_5_3_2 - 0.00507936507936505*G0_0_0_5_3_3 - 0.0101587301587301*G0_0_0_5_3_4 - 0.0118518518518518*G0_0_0_5_3_5 - 0.0126984126984126*G0_0_0_5_4_0 + 0.00677248677248674*G0_0_0_5_4_1 + 0.00761904761904759*G0_0_0_5_4_2 - 0.0101587301587301*G0_0_0_5_4_3 - 0.0389417989417988*G0_0_0_5_4_4 - 0.0287830687830686*G0_0_0_5_4_5 - 0.0211640211640211*G0_0_0_5_5_0 + 0.00846560846560842*G0_0_0_5_5_1 + 0.00761904761904758*G0_0_0_5_5_2 - 0.0118518518518518*G0_0_0_5_5_3 - 0.0287830687830686*G0_0_0_5_5_4 - 0.0558730158730155*G0_0_0_5_5_5 - 0.0634920634920632*G0_1_0_0_0_0 + 0.00529100529100527*G0_1_0_0_0_1 + 0.00634920634920632*G0_1_0_0_0_2 - 0.00211640211640211*G0_1_0_0_0_3 - 0.0275132275132274*G0_1_0_0_0_4 - 0.0232804232804232*G0_1_0_0_0_5 + 0.00529100529100527*G0_1_0_0_1_0 - 0.000740740740740738*G0_1_0_0_1_2 + 0.00126984126984126*G0_1_0_0_1_3 + 0.00338624338624337*G0_1_0_0_1_4 + 0.00507936507936505*G0_1_0_0_1_5 + 0.00634920634920632*G0_1_0_0_2_0 - 0.000740740740740739*G0_1_0_0_2_1 - 0.00253968253968252*G0_1_0_0_2_2 - 0.000423280423280417*G0_1_0_0_2_3 + 0.00550264550264548*G0_1_0_0_2_4 + 0.00296296296296295*G0_1_0_0_2_5 - 0.00211640211640211*G0_1_0_0_3_0 + 0.00126984126984126*G0_1_0_0_3_1 - 0.000423280423280417*G0_1_0_0_3_2 - 0.000846560846560843*G0_1_0_0_3_3 - 0.00253968253968253*G0_1_0_0_3_4 - 0.00169312169312169*G0_1_0_0_3_5 - 0.0275132275132274*G0_1_0_0_4_0 + 0.00338624338624337*G0_1_0_0_4_1 + 0.00550264550264548*G0_1_0_0_4_2 - 0.00253968253968253*G0_1_0_0_4_3 - 0.0296296296296295*G0_1_0_0_4_4 - 0.0126984126984126*G0_1_0_0_4_5 - 0.0232804232804232*G0_1_0_0_5_0 + 0.00507936507936505*G0_1_0_0_5_1 + 0.00296296296296295*G0_1_0_0_5_2 - 0.00169312169312169*G0_1_0_0_5_3 - 0.0126984126984126*G0_1_0_0_5_4 - 0.0211640211640211*G0_1_0_0_5_5 + 0.00529100529100527*G0_1_0_1_0_0 - 0.000740740740740738*G0_1_0_1_0_2 + 0.00126984126984126*G0_1_0_1_0_3 + 0.00338624338624337*G0_1_0_1_0_4 + 0.00507936507936505*G0_1_0_1_0_5 - 0.0158730158730158*G0_1_0_1_1_1 + 0.00211640211640211*G0_1_0_1_1_2 - 0.00634920634920632*G0_1_0_1_1_3 - 0.00211640211640211*G0_1_0_1_1_4 - 0.00634920634920632*G0_1_0_1_1_5 - 0.000740740740740738*G0_1_0_1_2_0 + 0.00211640211640211*G0_1_0_1_2_1 - 0.00148148148148147*G0_1_0_1_2_2 - 0.000846560846560839*G0_1_0_1_2_3 - 0.00253968253968253*G0_1_0_1_2_4 - 0.00126984126984126*G0_1_0_1_2_5 + 0.00126984126984126*G0_1_0_1_3_0 - 0.00634920634920632*G0_1_0_1_3_1 - 0.000846560846560839*G0_1_0_1_3_2 - 0.00846560846560842*G0_1_0_1_3_3 + 0.00169312169312168*G0_1_0_1_3_4 + 0.00338624338624337*G0_1_0_1_4_0 - 0.00211640211640211*G0_1_0_1_4_1 - 0.00253968253968253*G0_1_0_1_4_2 + 0.00169312169312169*G0_1_0_1_4_3 + 0.0118518518518518*G0_1_0_1_4_4 + 0.00677248677248674*G0_1_0_1_4_5 + 0.00507936507936505*G0_1_0_1_5_0 - 0.00634920634920632*G0_1_0_1_5_1 - 0.00126984126984126*G0_1_0_1_5_2 + 0.00677248677248674*G0_1_0_1_5_4 + 0.00846560846560842*G0_1_0_1_5_5 + 0.00634920634920632*G0_1_0_2_0_0 - 0.000740740740740738*G0_1_0_2_0_1 - 0.00253968253968252*G0_1_0_2_0_2 - 0.000423280423280417*G0_1_0_2_0_3 + 0.00550264550264548*G0_1_0_2_0_4 + 0.00296296296296295*G0_1_0_2_0_5 - 0.000740740740740738*G0_1_0_2_1_0 + 0.00211640211640211*G0_1_0_2_1_1 - 0.00148148148148147*G0_1_0_2_1_2 - 0.000846560846560839*G0_1_0_2_1_3 - 0.00253968253968253*G0_1_0_2_1_4 - 0.00126984126984126*G0_1_0_2_1_5 - 0.00253968253968252*G0_1_0_2_2_0 - 0.00148148148148147*G0_1_0_2_2_1 + 0.0190476190476189*G0_1_0_2_2_2 + 0.00634920634920631*G0_1_0_2_2_3 + 0.00211640211640209*G0_1_0_2_2_4 - 0.00126984126984126*G0_1_0_2_2_5 - 0.000423280423280417*G0_1_0_2_3_0 - 0.000846560846560839*G0_1_0_2_3_1 + 0.00634920634920631*G0_1_0_2_3_2 + 0.0110052910052909*G0_1_0_2_3_3 + 0.0059259259259259*G0_1_0_2_3_4 + 0.00338624338624337*G0_1_0_2_3_5 + 0.00550264550264548*G0_1_0_2_4_0 - 0.00253968253968253*G0_1_0_2_4_1 + 0.00211640211640209*G0_1_0_2_4_2 + 0.0059259259259259*G0_1_0_2_4_3 + 0.0194708994708994*G0_1_0_2_4_4 + 0.00761904761904759*G0_1_0_2_4_5 + 0.00296296296296295*G0_1_0_2_5_0 - 0.00126984126984126*G0_1_0_2_5_1 - 0.00126984126984126*G0_1_0_2_5_2 + 0.00338624338624337*G0_1_0_2_5_3 + 0.00761904761904759*G0_1_0_2_5_4 + 0.00761904761904758*G0_1_0_2_5_5 - 0.00211640211640211*G0_1_0_3_0_0 + 0.00126984126984126*G0_1_0_3_0_1 - 0.000423280423280417*G0_1_0_3_0_2 - 0.000846560846560843*G0_1_0_3_0_3 - 0.00253968253968253*G0_1_0_3_0_4 - 0.00169312169312169*G0_1_0_3_0_5 + 0.00126984126984126*G0_1_0_3_1_0 - 0.00634920634920632*G0_1_0_3_1_1 - 0.000846560846560839*G0_1_0_3_1_2 - 0.00846560846560842*G0_1_0_3_1_3 + 0.00169312169312168*G0_1_0_3_1_4 - 0.000423280423280417*G0_1_0_3_2_0 - 0.000846560846560839*G0_1_0_3_2_1 + 0.00634920634920631*G0_1_0_3_2_2 + 0.0110052910052909*G0_1_0_3_2_3 + 0.0059259259259259*G0_1_0_3_2_4 + 0.00338624338624337*G0_1_0_3_2_5 - 0.000846560846560843*G0_1_0_3_3_0 - 0.00846560846560842*G0_1_0_3_3_1 + 0.0110052910052909*G0_1_0_3_3_2 + 0.00507936507936504*G0_1_0_3_3_3 - 0.00169312169312168*G0_1_0_3_3_4 - 0.00507936507936505*G0_1_0_3_3_5 - 0.00253968253968253*G0_1_0_3_4_0 + 0.00169312169312168*G0_1_0_3_4_1 + 0.0059259259259259*G0_1_0_3_4_2 - 0.00169312169312168*G0_1_0_3_4_3 - 0.0186243386243385*G0_1_0_3_4_4 - 0.0101587301587301*G0_1_0_3_4_5 - 0.00169312169312169*G0_1_0_3_5_0 + 0.00338624338624337*G0_1_0_3_5_2 - 0.00507936507936505*G0_1_0_3_5_3 - 0.0101587301587301*G0_1_0_3_5_4 - 0.0118518518518518*G0_1_0_3_5_5 - 0.0275132275132274*G0_1_0_4_0_0 + 0.00338624338624337*G0_1_0_4_0_1 + 0.00550264550264548*G0_1_0_4_0_2 - 0.00253968253968253*G0_1_0_4_0_3 - 0.0296296296296295*G0_1_0_4_0_4 - 0.0126984126984126*G0_1_0_4_0_5 + 0.00338624338624337*G0_1_0_4_1_0 - 0.00211640211640211*G0_1_0_4_1_1 - 0.00253968253968253*G0_1_0_4_1_2 + 0.00169312169312169*G0_1_0_4_1_3 + 0.0118518518518518*G0_1_0_4_1_4 + 0.00677248677248674*G0_1_0_4_1_5 + 0.00550264550264548*G0_1_0_4_2_0 - 0.00253968253968253*G0_1_0_4_2_1 + 0.00211640211640209*G0_1_0_4_2_2 + 0.0059259259259259*G0_1_0_4_2_3 + 0.0194708994708994*G0_1_0_4_2_4 + 0.00761904761904759*G0_1_0_4_2_5 - 0.00253968253968253*G0_1_0_4_3_0 + 0.00169312169312169*G0_1_0_4_3_1 + 0.0059259259259259*G0_1_0_4_3_2 - 0.00169312169312168*G0_1_0_4_3_3 - 0.0186243386243385*G0_1_0_4_3_4 - 0.0101587301587301*G0_1_0_4_3_5 - 0.0296296296296295*G0_1_0_4_4_0 + 0.0118518518518518*G0_1_0_4_4_1 + 0.0194708994708994*G0_1_0_4_4_2 - 0.0186243386243385*G0_1_0_4_4_3 - 0.147301587301587*G0_1_0_4_4_4 - 0.0389417989417988*G0_1_0_4_4_5 - 0.0126984126984126*G0_1_0_4_5_0 + 0.00677248677248674*G0_1_0_4_5_1 + 0.00761904761904759*G0_1_0_4_5_2 - 0.0101587301587301*G0_1_0_4_5_3 - 0.0389417989417988*G0_1_0_4_5_4 - 0.0287830687830687*G0_1_0_4_5_5 - 0.0232804232804232*G0_1_0_5_0_0 + 0.00507936507936505*G0_1_0_5_0_1 + 0.00296296296296295*G0_1_0_5_0_2 - 0.00169312169312169*G0_1_0_5_0_3 - 0.0126984126984126*G0_1_0_5_0_4 - 0.021164021164021*G0_1_0_5_0_5 + 0.00507936507936505*G0_1_0_5_1_0 - 0.00634920634920632*G0_1_0_5_1_1 - 0.00126984126984126*G0_1_0_5_1_2 + 0.00677248677248674*G0_1_0_5_1_4 + 0.00846560846560842*G0_1_0_5_1_5 + 0.00296296296296295*G0_1_0_5_2_0 - 0.00126984126984126*G0_1_0_5_2_1 - 0.00126984126984126*G0_1_0_5_2_2 + 0.00338624338624337*G0_1_0_5_2_3 + 0.00761904761904759*G0_1_0_5_2_4 + 0.00761904761904758*G0_1_0_5_2_5 - 0.00169312169312169*G0_1_0_5_3_0 + 0.00338624338624337*G0_1_0_5_3_2 - 0.00507936507936505*G0_1_0_5_3_3 - 0.0101587301587301*G0_1_0_5_3_4 - 0.0118518518518518*G0_1_0_5_3_5 - 0.0126984126984126*G0_1_0_5_4_0 + 0.00677248677248674*G0_1_0_5_4_1 + 0.00761904761904759*G0_1_0_5_4_2 - 0.0101587301587301*G0_1_0_5_4_3 - 0.0389417989417988*G0_1_0_5_4_4 - 0.0287830687830687*G0_1_0_5_4_5 - 0.021164021164021*G0_1_0_5_5_0 + 0.00846560846560842*G0_1_0_5_5_1 + 0.00761904761904758*G0_1_0_5_5_2 - 0.0118518518518518*G0_1_0_5_5_3 - 0.0287830687830687*G0_1_0_5_5_4 - 0.0558730158730155*G0_1_0_5_5_5; + A[6] = A[9] + 0.015079365079365*G0_0_0_0_0_0 - 0.00111111111111111*G0_0_0_0_0_1 - 0.00111111111111111*G0_0_0_0_0_2 + 0.000105820105820108*G0_0_0_0_0_3 + 0.0079365079365079*G0_0_0_0_0_4 + 0.00370370370370369*G0_0_0_0_0_5 - 0.00111111111111111*G0_0_0_0_1_0 - 0.000264550264550263*G0_0_0_0_1_1 + 0.000343915343915342*G0_0_0_0_1_2 - 0.000423280423280423*G0_0_0_0_1_4 - 0.000529100529100528*G0_0_0_0_1_5 - 0.00111111111111111*G0_0_0_0_2_0 + 0.000343915343915342*G0_0_0_0_2_1 - 0.0011111111111111*G0_0_0_0_2_2 - 0.00126984126984126*G0_0_0_0_2_3 - 0.0039153439153439*G0_0_0_0_2_4 - 0.00126984126984126*G0_0_0_0_2_5 + 0.000105820105820108*G0_0_0_0_3_0 - 0.00126984126984126*G0_0_0_0_3_2 + 0.00296296296296294*G0_0_0_0_3_3 + 0.000634920634920634*G0_0_0_0_3_4 + 0.00232804232804232*G0_0_0_0_3_5 + 0.0079365079365079*G0_0_0_0_4_0 - 0.000423280423280423*G0_0_0_0_4_1 - 0.0039153439153439*G0_0_0_0_4_2 + 0.000634920634920634*G0_0_0_0_4_3 + 0.00507936507936507*G0_0_0_0_4_4 + 0.00338624338624337*G0_0_0_0_4_5 + 0.00370370370370369*G0_0_0_0_5_0 - 0.000529100529100528*G0_0_0_0_5_1 - 0.00126984126984126*G0_0_0_0_5_2 + 0.00232804232804232*G0_0_0_0_5_3 + 0.00338624338624337*G0_0_0_0_5_4 + 0.00507936507936505*G0_0_0_0_5_5 - 0.00111111111111111*G0_0_0_1_0_0 - 0.000264550264550263*G0_0_0_1_0_1 + 0.000343915343915342*G0_0_0_1_0_2 - 0.000423280423280423*G0_0_0_1_0_4 - 0.000529100529100528*G0_0_0_1_0_5 - 0.000264550264550263*G0_0_0_1_1_0 + 0.0087301587301587*G0_0_0_1_1_1 - 0.000264550264550264*G0_0_0_1_1_2 + 0.00158730158730158*G0_0_0_1_1_3 + 0.000529100529100528*G0_0_0_1_1_4 + 0.00158730158730158*G0_0_0_1_1_5 + 0.000343915343915342*G0_0_0_1_2_0 - 0.000264550264550264*G0_0_0_1_2_1 - 0.0011111111111111*G0_0_0_1_2_2 - 0.000529100529100526*G0_0_0_1_2_3 - 0.00042328042328042*G0_0_0_1_2_4 + 0.00158730158730158*G0_0_0_1_3_1 - 0.000529100529100526*G0_0_0_1_3_2 - 0.00105820105820105*G0_0_0_1_3_4 - 0.000423280423280423*G0_0_0_1_4_0 + 0.000529100529100528*G0_0_0_1_4_1 - 0.00042328042328042*G0_0_0_1_4_2 - 0.00105820105820105*G0_0_0_1_4_3 - 0.00550264550264548*G0_0_0_1_4_4 - 0.00105820105820105*G0_0_0_1_4_5 - 0.000529100529100528*G0_0_0_1_5_0 + 0.00158730158730158*G0_0_0_1_5_1 - 0.00105820105820105*G0_0_0_1_5_4 - 0.00111111111111111*G0_0_0_2_0_0 + 0.000343915343915342*G0_0_0_2_0_1 - 0.0011111111111111*G0_0_0_2_0_2 - 0.00126984126984126*G0_0_0_2_0_3 - 0.0039153439153439*G0_0_0_2_0_4 - 0.00126984126984126*G0_0_0_2_0_5 + 0.000343915343915342*G0_0_0_2_1_0 - 0.000264550264550264*G0_0_0_2_1_1 - 0.0011111111111111*G0_0_0_2_1_2 - 0.000529100529100526*G0_0_0_2_1_3 - 0.00042328042328042*G0_0_0_2_1_4 - 0.0011111111111111*G0_0_0_2_2_0 - 0.0011111111111111*G0_0_0_2_2_1 + 0.015079365079365*G0_0_0_2_2_2 + 0.00370370370370368*G0_0_0_2_2_3 + 0.00793650793650789*G0_0_0_2_2_4 + 0.000105820105820109*G0_0_0_2_2_5 - 0.00126984126984126*G0_0_0_2_3_0 - 0.000529100529100526*G0_0_0_2_3_1 + 0.00370370370370368*G0_0_0_2_3_2 + 0.00507936507936505*G0_0_0_2_3_3 + 0.00338624338624337*G0_0_0_2_3_4 + 0.00232804232804232*G0_0_0_2_3_5 - 0.0039153439153439*G0_0_0_2_4_0 - 0.00042328042328042*G0_0_0_2_4_1 + 0.00793650793650789*G0_0_0_2_4_2 + 0.00338624338624337*G0_0_0_2_4_3 + 0.00507936507936505*G0_0_0_2_4_4 + 0.000634920634920633*G0_0_0_2_4_5 - 0.00126984126984126*G0_0_0_2_5_0 + 0.000105820105820109*G0_0_0_2_5_2 + 0.00232804232804232*G0_0_0_2_5_3 + 0.000634920634920633*G0_0_0_2_5_4 + 0.00296296296296295*G0_0_0_2_5_5 + 0.000105820105820108*G0_0_0_3_0_0 - 0.00126984126984126*G0_0_0_3_0_2 + 0.00296296296296294*G0_0_0_3_0_3 + 0.000634920634920633*G0_0_0_3_0_4 + 0.00232804232804232*G0_0_0_3_0_5 + 0.00158730158730158*G0_0_0_3_1_1 - 0.000529100529100526*G0_0_0_3_1_2 - 0.00105820105820105*G0_0_0_3_1_4 - 0.00126984126984126*G0_0_0_3_2_0 - 0.000529100529100526*G0_0_0_3_2_1 + 0.00370370370370368*G0_0_0_3_2_2 + 0.00507936507936505*G0_0_0_3_2_3 + 0.00338624338624337*G0_0_0_3_2_4 + 0.00232804232804232*G0_0_0_3_2_5 + 0.00296296296296294*G0_0_0_3_3_0 + 0.00507936507936505*G0_0_0_3_3_2 - 0.0317460317460316*G0_0_0_3_3_3 - 0.0038095238095238*G0_0_0_3_3_4 - 0.0105820105820105*G0_0_0_3_3_5 + 0.000634920634920634*G0_0_0_3_4_0 - 0.00105820105820105*G0_0_0_3_4_1 + 0.00338624338624337*G0_0_0_3_4_2 - 0.0038095238095238*G0_0_0_3_4_3 + 0.00973544973544969*G0_0_0_3_4_4 - 0.00253968253968253*G0_0_0_3_4_5 + 0.00232804232804232*G0_0_0_3_5_0 + 0.00232804232804232*G0_0_0_3_5_2 - 0.0105820105820105*G0_0_0_3_5_3 - 0.00253968253968253*G0_0_0_3_5_4 - 0.0105820105820105*G0_0_0_3_5_5 + 0.0079365079365079*G0_0_0_4_0_0 - 0.000423280423280423*G0_0_0_4_0_1 - 0.0039153439153439*G0_0_0_4_0_2 + 0.000634920634920633*G0_0_0_4_0_3 + 0.00507936507936506*G0_0_0_4_0_4 + 0.00338624338624337*G0_0_0_4_0_5 - 0.000423280423280423*G0_0_0_4_1_0 + 0.000529100529100527*G0_0_0_4_1_1 - 0.00042328042328042*G0_0_0_4_1_2 - 0.00105820105820105*G0_0_0_4_1_3 - 0.00550264550264548*G0_0_0_4_1_4 - 0.00105820105820105*G0_0_0_4_1_5 - 0.0039153439153439*G0_0_0_4_2_0 - 0.00042328042328042*G0_0_0_4_2_1 + 0.00793650793650789*G0_0_0_4_2_2 + 0.00338624338624337*G0_0_0_4_2_3 + 0.00507936507936505*G0_0_0_4_2_4 + 0.000634920634920633*G0_0_0_4_2_5 + 0.000634920634920634*G0_0_0_4_3_0 - 0.00105820105820105*G0_0_0_4_3_1 + 0.00338624338624337*G0_0_0_4_3_2 - 0.0038095238095238*G0_0_0_4_3_3 + 0.00973544973544969*G0_0_0_4_3_4 - 0.00253968253968253*G0_0_0_4_3_5 + 0.00507936507936506*G0_0_0_4_4_0 - 0.00550264550264548*G0_0_0_4_4_1 + 0.00507936507936505*G0_0_0_4_4_2 + 0.00973544973544969*G0_0_0_4_4_3 + 0.0901587301587298*G0_0_0_4_4_4 + 0.00973544973544971*G0_0_0_4_4_5 + 0.00338624338624337*G0_0_0_4_5_0 - 0.00105820105820105*G0_0_0_4_5_1 + 0.000634920634920633*G0_0_0_4_5_2 - 0.00253968253968253*G0_0_0_4_5_3 + 0.00973544973544971*G0_0_0_4_5_4 - 0.00380952380952379*G0_0_0_4_5_5 + 0.00370370370370369*G0_0_0_5_0_0 - 0.000529100529100528*G0_0_0_5_0_1 - 0.00126984126984126*G0_0_0_5_0_2 + 0.00232804232804232*G0_0_0_5_0_3 + 0.00338624338624337*G0_0_0_5_0_4 + 0.00507936507936505*G0_0_0_5_0_5 - 0.000529100529100528*G0_0_0_5_1_0 + 0.00158730158730158*G0_0_0_5_1_1 - 0.00105820105820105*G0_0_0_5_1_4 - 0.00126984126984126*G0_0_0_5_2_0 + 0.000105820105820109*G0_0_0_5_2_2 + 0.00232804232804232*G0_0_0_5_2_3 + 0.000634920634920633*G0_0_0_5_2_4 + 0.00296296296296295*G0_0_0_5_2_5 + 0.00232804232804232*G0_0_0_5_3_0 + 0.00232804232804232*G0_0_0_5_3_2 - 0.0105820105820105*G0_0_0_5_3_3 - 0.00253968253968253*G0_0_0_5_3_4 - 0.0105820105820105*G0_0_0_5_3_5 + 0.00338624338624337*G0_0_0_5_4_0 - 0.00105820105820105*G0_0_0_5_4_1 + 0.000634920634920633*G0_0_0_5_4_2 - 0.00253968253968253*G0_0_0_5_4_3 + 0.0097354497354497*G0_0_0_5_4_4 - 0.00380952380952378*G0_0_0_5_4_5 + 0.00507936507936505*G0_0_0_5_5_0 + 0.00296296296296295*G0_0_0_5_5_2 - 0.0105820105820105*G0_0_0_5_5_3 - 0.00380952380952378*G0_0_0_5_5_4 - 0.0317460317460315*G0_0_0_5_5_5 + 0.015079365079365*G0_0_1_0_0_0 - 0.00206349206349205*G0_0_1_0_0_1 - 0.001005291005291*G0_0_1_0_0_2 - 0.00116402116402115*G0_0_1_0_0_3 + 0.00582010582010579*G0_0_1_0_0_4 + 0.00158730158730159*G0_0_1_0_0_5 - 0.00206349206349205*G0_0_1_0_1_0 + 0.00502645502645499*G0_0_1_0_1_1 - 0.000502645502645498*G0_0_1_0_1_2 + 0.00253968253968252*G0_0_1_0_1_3 - 0.000211640211640213*G0_0_1_0_1_4 + 0.0043386243386243*G0_0_1_0_1_5 - 0.001005291005291*G0_0_1_0_2_0 - 0.000502645502645498*G0_0_1_0_2_1 + 0.00079365079365079*G0_0_1_0_2_2 - 0.00169312169312168*G0_0_1_0_2_3 - 0.002010582010582*G0_0_1_0_2_4 - 0.00232804232804232*G0_0_1_0_2_5 - 0.00116402116402115*G0_0_1_0_3_0 + 0.00253968253968252*G0_0_1_0_3_1 - 0.00169312169312168*G0_0_1_0_3_2 + 0.00804232804232799*G0_0_1_0_3_3 + 0.00275132275132274*G0_0_1_0_3_4 + 0.00698412698412694*G0_0_1_0_3_5 + 0.00582010582010579*G0_0_1_0_4_0 - 0.000211640211640213*G0_0_1_0_4_1 - 0.002010582010582*G0_0_1_0_4_2 + 0.00275132275132274*G0_0_1_0_4_3 + 0.00761904761904759*G0_0_1_0_4_4 + 0.00507936507936506*G0_0_1_0_4_5 + 0.00158730158730159*G0_0_1_0_5_0 + 0.0043386243386243*G0_0_1_0_5_1 - 0.00232804232804232*G0_0_1_0_5_2 + 0.00698412698412694*G0_0_1_0_5_3 + 0.00507936507936506*G0_0_1_0_5_4 + 0.016084656084656*G0_0_1_0_5_5 - 0.00206349206349205*G0_0_1_1_0_0 + 0.00502645502645499*G0_0_1_1_0_1 - 0.000502645502645498*G0_0_1_1_0_2 + 0.00253968253968252*G0_0_1_1_0_3 - 0.000211640211640213*G0_0_1_1_0_4 + 0.0043386243386243*G0_0_1_1_0_5 + 0.00502645502645499*G0_0_1_1_1_0 - 0.0499999999999997*G0_0_1_1_1_1 + 0.00449735449735447*G0_0_1_1_1_2 - 0.0195767195767195*G0_0_1_1_1_3 - 0.00158730158730158*G0_0_1_1_1_4 - 0.0216931216931215*G0_0_1_1_1_5 - 0.000502645502645498*G0_0_1_1_2_0 + 0.00449735449735447*G0_0_1_1_2_1 - 0.000793650793650789*G0_0_1_1_2_2 + 0.00412698412698411*G0_0_1_1_2_3 + 0.000634920634920632*G0_0_1_1_2_4 + 0.00275132275132274*G0_0_1_1_2_5 + 0.00253968253968252*G0_0_1_1_3_0 - 0.0195767195767194*G0_0_1_1_3_1 + 0.00412698412698411*G0_0_1_1_3_2 - 0.0190476190476189*G0_0_1_1_3_3 - 0.0019047619047619*G0_0_1_1_3_4 - 0.0105820105820105*G0_0_1_1_3_5 - 0.000211640211640213*G0_0_1_1_4_0 - 0.00158730158730158*G0_0_1_1_4_1 + 0.000634920634920632*G0_0_1_1_4_2 - 0.0019047619047619*G0_0_1_1_4_3 - 0.00253968253968253*G0_0_1_1_4_4 - 0.00232804232804232*G0_0_1_1_4_5 + 0.0043386243386243*G0_0_1_1_5_0 - 0.0216931216931215*G0_0_1_1_5_1 + 0.00275132275132274*G0_0_1_1_5_2 - 0.0105820105820105*G0_0_1_1_5_3 - 0.00232804232804232*G0_0_1_1_5_4 - 0.0232804232804231*G0_0_1_1_5_5 - 0.001005291005291*G0_0_1_2_0_0 - 0.000502645502645498*G0_0_1_2_0_1 + 0.00079365079365079*G0_0_1_2_0_2 - 0.00169312169312168*G0_0_1_2_0_3 - 0.002010582010582*G0_0_1_2_0_4 - 0.00232804232804232*G0_0_1_2_0_5 - 0.000502645502645498*G0_0_1_2_1_0 + 0.00449735449735447*G0_0_1_2_1_1 - 0.000793650793650789*G0_0_1_2_1_2 + 0.0041269841269841*G0_0_1_2_1_3 + 0.000634920634920632*G0_0_1_2_1_4 + 0.00275132275132274*G0_0_1_2_1_5 + 0.00079365079365079*G0_0_1_2_2_0 - 0.000793650793650789*G0_0_1_2_2_1 - 0.00238095238095238*G0_0_1_2_2_2 - 0.00264550264550263*G0_0_1_2_2_3 - 0.000529100529100529*G0_0_1_2_2_4 - 0.00158730158730158*G0_0_1_2_2_5 - 0.00169312169312168*G0_0_1_2_3_0 + 0.0041269841269841*G0_0_1_2_3_1 - 0.00264550264550263*G0_0_1_2_3_2 + 0.0105820105820105*G0_0_1_2_3_3 + 0.00211640211640211*G0_0_1_2_3_4 + 0.00656084656084653*G0_0_1_2_3_5 - 0.002010582010582*G0_0_1_2_4_0 + 0.000634920634920632*G0_0_1_2_4_1 - 0.000529100529100529*G0_0_1_2_4_2 + 0.00211640211640211*G0_0_1_2_4_3 - 0.00211640211640211*G0_0_1_2_4_4 + 0.0019047619047619*G0_0_1_2_4_5 - 0.00232804232804232*G0_0_1_2_5_0 + 0.00275132275132274*G0_0_1_2_5_1 - 0.00158730158730158*G0_0_1_2_5_2 + 0.00656084656084653*G0_0_1_2_5_3 + 0.0019047619047619*G0_0_1_2_5_4 + 0.0101587301587301*G0_0_1_2_5_5 - 0.00116402116402115*G0_0_1_3_0_0 + 0.00253968253968252*G0_0_1_3_0_1 - 0.00169312169312168*G0_0_1_3_0_2 + 0.00804232804232799*G0_0_1_3_0_3 + 0.00275132275132274*G0_0_1_3_0_4 + 0.00698412698412694*G0_0_1_3_0_5 + 0.00253968253968252*G0_0_1_3_1_0 - 0.0195767195767194*G0_0_1_3_1_1 + 0.0041269841269841*G0_0_1_3_1_2 - 0.0190476190476189*G0_0_1_3_1_3 - 0.00190476190476189*G0_0_1_3_1_4 - 0.0105820105820105*G0_0_1_3_1_5 - 0.00169312169312168*G0_0_1_3_2_0 + 0.0041269841269841*G0_0_1_3_2_1 - 0.00264550264550263*G0_0_1_3_2_2 + 0.0105820105820105*G0_0_1_3_2_3 + 0.00211640211640211*G0_0_1_3_2_4 + 0.00656084656084653*G0_0_1_3_2_5 + 0.00804232804232799*G0_0_1_3_3_0 - 0.0190476190476189*G0_0_1_3_3_1 + 0.0105820105820105*G0_0_1_3_3_2 - 0.072380952380952*G0_0_1_3_3_3 - 0.0122751322751322*G0_0_1_3_3_4 - 0.0292063492063491*G0_0_1_3_3_5 + 0.00275132275132274*G0_0_1_3_4_0 - 0.0019047619047619*G0_0_1_3_4_1 + 0.00211640211640211*G0_0_1_3_4_2 - 0.0122751322751322*G0_0_1_3_4_3 - 0.000423280423280422*G0_0_1_3_4_4 - 0.00931216931216927*G0_0_1_3_4_5 + 0.00698412698412694*G0_0_1_3_5_0 - 0.0105820105820105*G0_0_1_3_5_1 + 0.00656084656084653*G0_0_1_3_5_2 - 0.0292063492063491*G0_0_1_3_5_3 - 0.00931216931216927*G0_0_1_3_5_4 - 0.0342857142857141*G0_0_1_3_5_5 + 0.00582010582010579*G0_0_1_4_0_0 - 0.000211640211640213*G0_0_1_4_0_1 - 0.002010582010582*G0_0_1_4_0_2 + 0.00275132275132274*G0_0_1_4_0_3 + 0.00761904761904759*G0_0_1_4_0_4 + 0.00507936507936506*G0_0_1_4_0_5 - 0.000211640211640213*G0_0_1_4_1_0 - 0.00158730158730158*G0_0_1_4_1_1 + 0.000634920634920632*G0_0_1_4_1_2 - 0.0019047619047619*G0_0_1_4_1_3 - 0.00253968253968253*G0_0_1_4_1_4 - 0.00232804232804231*G0_0_1_4_1_5 - 0.002010582010582*G0_0_1_4_2_0 + 0.000634920634920632*G0_0_1_4_2_1 - 0.000529100529100529*G0_0_1_4_2_2 + 0.00211640211640211*G0_0_1_4_2_3 - 0.00211640211640211*G0_0_1_4_2_4 + 0.0019047619047619*G0_0_1_4_2_5 + 0.00275132275132274*G0_0_1_4_3_0 - 0.0019047619047619*G0_0_1_4_3_1 + 0.00211640211640211*G0_0_1_4_3_2 - 0.0122751322751322*G0_0_1_4_3_3 - 0.000423280423280421*G0_0_1_4_3_4 - 0.00931216931216927*G0_0_1_4_3_5 + 0.00761904761904759*G0_0_1_4_4_0 - 0.00253968253968253*G0_0_1_4_4_1 - 0.00211640211640211*G0_0_1_4_4_2 - 0.000423280423280421*G0_0_1_4_4_3 + 0.0342857142857141*G0_0_1_4_4_4 + 0.00126984126984127*G0_0_1_4_4_5 + 0.00507936507936506*G0_0_1_4_5_0 - 0.00232804232804232*G0_0_1_4_5_1 + 0.00190476190476189*G0_0_1_4_5_2 - 0.00931216931216927*G0_0_1_4_5_3 + 0.00126984126984127*G0_0_1_4_5_4 - 0.0156613756613756*G0_0_1_4_5_5 + 0.00158730158730159*G0_0_1_5_0_0 + 0.0043386243386243*G0_0_1_5_0_1 - 0.00232804232804232*G0_0_1_5_0_2 + 0.00698412698412694*G0_0_1_5_0_3 + 0.00507936507936506*G0_0_1_5_0_4 + 0.016084656084656*G0_0_1_5_0_5 + 0.0043386243386243*G0_0_1_5_1_0 - 0.0216931216931215*G0_0_1_5_1_1 + 0.00275132275132274*G0_0_1_5_1_2 - 0.0105820105820105*G0_0_1_5_1_3 - 0.00232804232804232*G0_0_1_5_1_4 - 0.0232804232804231*G0_0_1_5_1_5 - 0.00232804232804232*G0_0_1_5_2_0 + 0.00275132275132274*G0_0_1_5_2_1 - 0.00158730158730158*G0_0_1_5_2_2 + 0.00656084656084653*G0_0_1_5_2_3 + 0.0019047619047619*G0_0_1_5_2_4 + 0.0101587301587301*G0_0_1_5_2_5 + 0.00698412698412694*G0_0_1_5_3_0 - 0.0105820105820105*G0_0_1_5_3_1 + 0.00656084656084653*G0_0_1_5_3_2 - 0.0292063492063491*G0_0_1_5_3_3 - 0.00931216931216927*G0_0_1_5_3_4 - 0.0342857142857141*G0_0_1_5_3_5 + 0.00507936507936506*G0_0_1_5_4_0 - 0.00232804232804231*G0_0_1_5_4_1 + 0.00190476190476189*G0_0_1_5_4_2 - 0.00931216931216927*G0_0_1_5_4_3 + 0.00126984126984127*G0_0_1_5_4_4 - 0.0156613756613756*G0_0_1_5_4_5 + 0.016084656084656*G0_0_1_5_5_0 - 0.0232804232804231*G0_0_1_5_5_1 + 0.0101587301587301*G0_0_1_5_5_2 - 0.0342857142857141*G0_0_1_5_5_3 - 0.0156613756613756*G0_0_1_5_5_4 - 0.118095238095237*G0_0_1_5_5_5; + A[35] = -A[33] + 0.0825396825396821*G0_0_0_0_0_0 - 0.0059259259259259*G0_0_0_0_0_1 - 0.008042328042328*G0_0_0_0_0_2 + 0.00338624338624338*G0_0_0_0_0_3 + 0.0380952380952379*G0_0_0_0_0_4 + 0.0296296296296295*G0_0_0_0_0_5 - 0.0059259259259259*G0_0_0_0_1_0 - 0.0042328042328042*G0_0_0_0_1_1 + 0.00169312169312168*G0_0_0_0_1_2 - 0.00338624338624336*G0_0_0_0_1_3 - 0.00423280423280422*G0_0_0_0_1_4 - 0.00931216931216926*G0_0_0_0_1_5 - 0.008042328042328*G0_0_0_0_2_0 + 0.00169312169312169*G0_0_0_0_2_1 + 0.000846560846560844*G0_0_0_0_2_2 - 0.0101587301587301*G0_0_0_0_2_4 - 0.00338624338624338*G0_0_0_0_2_5 + 0.00338624338624338*G0_0_0_0_3_0 - 0.00338624338624336*G0_0_0_0_3_1 - 0.00169312169312168*G0_0_0_0_3_3 + 0.00169312169312169*G0_0_0_0_3_4 + 0.0380952380952379*G0_0_0_0_4_0 - 0.00423280423280422*G0_0_0_0_4_1 - 0.0101587301587301*G0_0_0_0_4_2 + 0.00169312169312169*G0_0_0_0_4_3 + 0.0355555555555554*G0_0_0_0_4_4 + 0.0152380952380952*G0_0_0_0_4_5 + 0.0296296296296295*G0_0_0_0_5_0 - 0.00931216931216926*G0_0_0_0_5_1 - 0.00338624338624338*G0_0_0_0_5_2 + 0.0152380952380952*G0_0_0_0_5_4 + 0.0186243386243385*G0_0_0_0_5_5 - 0.0059259259259259*G0_0_0_1_0_0 - 0.0042328042328042*G0_0_0_1_0_1 + 0.00169312169312169*G0_0_0_1_0_2 - 0.00338624338624336*G0_0_0_1_0_3 - 0.00423280423280422*G0_0_0_1_0_4 - 0.00931216931216926*G0_0_0_1_0_5 - 0.0042328042328042*G0_0_0_1_1_0 + 0.0698412698412694*G0_0_0_1_1_1 - 0.00634920634920631*G0_0_0_1_1_2 + 0.0253968253968253*G0_0_0_1_1_3 + 0.00423280423280422*G0_0_0_1_1_4 + 0.0253968253968253*G0_0_0_1_1_5 + 0.00169312169312169*G0_0_0_1_2_0 - 0.00634920634920632*G0_0_0_1_2_1 + 0.000846560846560841*G0_0_0_1_2_2 - 0.00338624338624337*G0_0_0_1_2_3 + 0.00169312169312169*G0_0_0_1_2_4 - 0.000846560846560841*G0_0_0_1_2_5 - 0.00338624338624336*G0_0_0_1_3_0 + 0.0253968253968253*G0_0_0_1_3_1 - 0.00338624338624337*G0_0_0_1_3_2 + 0.0253968253968253*G0_0_0_1_3_3 - 0.00169312169312168*G0_0_0_1_3_4 + 0.00846560846560842*G0_0_0_1_3_5 - 0.00423280423280422*G0_0_0_1_4_0 + 0.00423280423280422*G0_0_0_1_4_1 + 0.00169312169312169*G0_0_0_1_4_2 - 0.00169312169312168*G0_0_0_1_4_3 - 0.0186243386243386*G0_0_0_1_4_4 - 0.00677248677248675*G0_0_0_1_4_5 - 0.00931216931216926*G0_0_0_1_5_0 + 0.0253968253968252*G0_0_0_1_5_1 - 0.000846560846560841*G0_0_0_1_5_2 + 0.00846560846560842*G0_0_0_1_5_3 - 0.00677248677248675*G0_0_0_1_5_4 + 0.00846560846560841*G0_0_0_1_5_5 - 0.00804232804232801*G0_0_0_2_0_0 + 0.00169312169312169*G0_0_0_2_0_1 + 0.000846560846560844*G0_0_0_2_0_2 - 0.0101587301587301*G0_0_0_2_0_4 - 0.00338624338624337*G0_0_0_2_0_5 + 0.00169312169312169*G0_0_0_2_1_0 - 0.00634920634920631*G0_0_0_2_1_1 + 0.000846560846560841*G0_0_0_2_1_2 - 0.00338624338624337*G0_0_0_2_1_3 + 0.00169312169312169*G0_0_0_2_1_4 - 0.000846560846560841*G0_0_0_2_1_5 + 0.000846560846560844*G0_0_0_2_2_0 + 0.000846560846560841*G0_0_0_2_2_1 + 0.00846560846560843*G0_0_0_2_2_4 + 0.00253968253968253*G0_0_0_2_2_5 - 0.00338624338624337*G0_0_0_2_3_1 - 0.0135449735449735*G0_0_0_2_3_3 - 0.00338624338624337*G0_0_0_2_3_4 - 0.00507936507936506*G0_0_0_2_3_5 - 0.0101587301587301*G0_0_0_2_4_0 + 0.00169312169312169*G0_0_0_2_4_1 + 0.00846560846560843*G0_0_0_2_4_2 - 0.00338624338624337*G0_0_0_2_4_3 - 0.0135449735449735*G0_0_0_2_4_4 - 0.00846560846560843*G0_0_0_2_4_5 - 0.00338624338624338*G0_0_0_2_5_0 - 0.00084656084656084*G0_0_0_2_5_1 + 0.00253968253968253*G0_0_0_2_5_2 - 0.00507936507936506*G0_0_0_2_5_3 - 0.00846560846560843*G0_0_0_2_5_4 - 0.0101587301587301*G0_0_0_2_5_5 + 0.00338624338624338*G0_0_0_3_0_0 - 0.00338624338624336*G0_0_0_3_0_1 - 0.00169312169312168*G0_0_0_3_0_3 + 0.00169312169312169*G0_0_0_3_0_4 - 0.00338624338624336*G0_0_0_3_1_0 + 0.0253968253968253*G0_0_0_3_1_1 - 0.00338624338624337*G0_0_0_3_1_2 + 0.0253968253968253*G0_0_0_3_1_3 - 0.00169312169312169*G0_0_0_3_1_4 + 0.00846560846560842*G0_0_0_3_1_5 - 0.00338624338624337*G0_0_0_3_2_1 - 0.0135449735449735*G0_0_0_3_2_3 - 0.00338624338624337*G0_0_0_3_2_4 - 0.00507936507936506*G0_0_0_3_2_5 - 0.00169312169312168*G0_0_0_3_3_0 + 0.0253968253968253*G0_0_0_3_3_1 - 0.0135449735449735*G0_0_0_3_3_2 + 0.0203174603174602*G0_0_0_3_3_3 + 0.00677248677248675*G0_0_0_3_3_4 + 0.0135449735449735*G0_0_0_3_3_5 + 0.00169312169312169*G0_0_0_3_4_0 - 0.00169312169312168*G0_0_0_3_4_1 - 0.00338624338624337*G0_0_0_3_4_2 + 0.00677248677248675*G0_0_0_3_4_3 + 0.0338624338624337*G0_0_0_3_4_4 + 0.0135449735449735*G0_0_0_3_4_5 + 0.00846560846560842*G0_0_0_3_5_1 - 0.00507936507936506*G0_0_0_3_5_2 + 0.0135449735449735*G0_0_0_3_5_3 + 0.0135449735449735*G0_0_0_3_5_4 + 0.0203174603174602*G0_0_0_3_5_5 + 0.0380952380952379*G0_0_0_4_0_0 - 0.00423280423280422*G0_0_0_4_0_1 - 0.0101587301587301*G0_0_0_4_0_2 + 0.00169312169312169*G0_0_0_4_0_3 + 0.0355555555555554*G0_0_0_4_0_4 + 0.0152380952380952*G0_0_0_4_0_5 - 0.00423280423280422*G0_0_0_4_1_0 + 0.00423280423280422*G0_0_0_4_1_1 + 0.00169312169312169*G0_0_0_4_1_2 - 0.00169312169312168*G0_0_0_4_1_3 - 0.0186243386243386*G0_0_0_4_1_4 - 0.00677248677248675*G0_0_0_4_1_5 - 0.0101587301587301*G0_0_0_4_2_0 + 0.00169312169312169*G0_0_0_4_2_1 + 0.00846560846560843*G0_0_0_4_2_2 - 0.00338624338624337*G0_0_0_4_2_3 - 0.0135449735449735*G0_0_0_4_2_4 - 0.00846560846560843*G0_0_0_4_2_5 + 0.00169312169312169*G0_0_0_4_3_0 - 0.00169312169312168*G0_0_0_4_3_1 - 0.00338624338624337*G0_0_0_4_3_2 + 0.00677248677248675*G0_0_0_4_3_3 + 0.0338624338624337*G0_0_0_4_3_4 + 0.0135449735449735*G0_0_0_4_3_5 + 0.0355555555555554*G0_0_0_4_4_0 - 0.0186243386243386*G0_0_0_4_4_1 - 0.0135449735449735*G0_0_0_4_4_2 + 0.0338624338624337*G0_0_0_4_4_3 + 0.264126984126983*G0_0_0_4_4_4 + 0.054179894179894*G0_0_0_4_4_5 + 0.0152380952380952*G0_0_0_4_5_0 - 0.00677248677248675*G0_0_0_4_5_1 - 0.00846560846560843*G0_0_0_4_5_2 + 0.0135449735449735*G0_0_0_4_5_3 + 0.054179894179894*G0_0_0_4_5_4 + 0.0338624338624337*G0_0_0_4_5_5 + 0.0296296296296295*G0_0_0_5_0_0 - 0.00931216931216926*G0_0_0_5_0_1 - 0.00338624338624338*G0_0_0_5_0_2 + 0.0152380952380952*G0_0_0_5_0_4 + 0.0186243386243385*G0_0_0_5_0_5 - 0.00931216931216926*G0_0_0_5_1_0 + 0.0253968253968252*G0_0_0_5_1_1 - 0.000846560846560841*G0_0_0_5_1_2 + 0.00846560846560842*G0_0_0_5_1_3 - 0.00677248677248675*G0_0_0_5_1_4 + 0.00846560846560841*G0_0_0_5_1_5 - 0.00338624338624338*G0_0_0_5_2_0 - 0.000846560846560841*G0_0_0_5_2_1 + 0.00253968253968253*G0_0_0_5_2_2 - 0.00507936507936506*G0_0_0_5_2_3 - 0.00846560846560843*G0_0_0_5_2_4 - 0.0101587301587301*G0_0_0_5_2_5 + 0.00846560846560842*G0_0_0_5_3_1 - 0.00507936507936506*G0_0_0_5_3_2 + 0.0135449735449735*G0_0_0_5_3_3 + 0.0135449735449735*G0_0_0_5_3_4 + 0.0203174603174602*G0_0_0_5_3_5 + 0.0152380952380952*G0_0_0_5_4_0 - 0.00677248677248675*G0_0_0_5_4_1 - 0.00846560846560843*G0_0_0_5_4_2 + 0.0135449735449735*G0_0_0_5_4_3 + 0.054179894179894*G0_0_0_5_4_4 + 0.0338624338624337*G0_0_0_5_4_5 + 0.0186243386243385*G0_0_0_5_5_0 + 0.00846560846560841*G0_0_0_5_5_1 - 0.0101587301587301*G0_0_0_5_5_2 + 0.0203174603174602*G0_0_0_5_5_3 + 0.0338624338624337*G0_0_0_5_5_4 + 0.0812698412698408*G0_0_0_5_5_5 - 0.00634920634920631*G0_1_0_0_0_0 + 0.00253968253968252*G0_1_0_0_0_1 + 0.000423280423280422*G0_1_0_0_0_2 - 0.000846560846560842*G0_1_0_0_0_3 - 0.00423280423280421*G0_1_0_0_0_4 - 0.00423280423280421*G0_1_0_0_0_5 + 0.00253968253968252*G0_1_0_0_1_0 - 0.0063492063492063*G0_1_0_0_1_1 + 0.00042328042328042*G0_1_0_0_1_2 - 0.0042328042328042*G0_1_0_0_1_3 - 0.00084656084656084*G0_1_0_0_1_4 - 0.00423280423280421*G0_1_0_0_1_5 + 0.000423280423280422*G0_1_0_0_2_0 + 0.00042328042328042*G0_1_0_0_2_1 + 0.000423280423280417*G0_1_0_0_2_2 + 0.00169312169312168*G0_1_0_0_2_3 + 0.00169312169312168*G0_1_0_0_2_4 + 0.00169312169312168*G0_1_0_0_2_5 - 0.000846560846560842*G0_1_0_0_3_0 - 0.0042328042328042*G0_1_0_0_3_1 + 0.00169312169312168*G0_1_0_0_3_2 + 0.00169312169312168*G0_1_0_0_3_3 + 0.00338624338624336*G0_1_0_0_3_4 - 0.00169312169312168*G0_1_0_0_3_5 - 0.00423280423280421*G0_1_0_0_4_0 - 0.00084656084656084*G0_1_0_0_4_1 + 0.00169312169312168*G0_1_0_0_4_2 + 0.00338624338624336*G0_1_0_0_4_3 + 0.00169312169312167*G0_1_0_0_4_4 - 0.00169312169312169*G0_1_0_0_4_5 - 0.00423280423280421*G0_1_0_0_5_0 - 0.00423280423280421*G0_1_0_0_5_1 + 0.00169312169312168*G0_1_0_0_5_2 - 0.00169312169312168*G0_1_0_0_5_3 - 0.00169312169312169*G0_1_0_0_5_4 - 0.0152380952380951*G0_1_0_0_5_5 + 0.00253968253968252*G0_1_0_1_0_0 - 0.0063492063492063*G0_1_0_1_0_1 + 0.00042328042328042*G0_1_0_1_0_2 - 0.0042328042328042*G0_1_0_1_0_3 - 0.00084656084656084*G0_1_0_1_0_4 - 0.00423280423280421*G0_1_0_1_0_5 - 0.0063492063492063*G0_1_0_1_1_0 + 0.0761904761904758*G0_1_0_1_1_1 - 0.00634920634920632*G0_1_0_1_1_2 + 0.0253968253968253*G0_1_0_1_1_3 + 0.0253968253968253*G0_1_0_1_1_5 + 0.00042328042328042*G0_1_0_1_2_0 - 0.00634920634920632*G0_1_0_1_2_1 + 0.00253968253968252*G0_1_0_1_2_2 - 0.00423280423280422*G0_1_0_1_2_3 - 0.000846560846560845*G0_1_0_1_2_4 - 0.00423280423280421*G0_1_0_1_2_5 - 0.0042328042328042*G0_1_0_1_3_0 + 0.0253968253968253*G0_1_0_1_3_1 - 0.00423280423280422*G0_1_0_1_3_2 + 0.0338624338624337*G0_1_0_1_3_3 + 0.00846560846560843*G0_1_0_1_3_4 + 0.0169312169312169*G0_1_0_1_3_5 - 0.00084656084656084*G0_1_0_1_4_0 - 0.000846560846560844*G0_1_0_1_4_2 + 0.00846560846560842*G0_1_0_1_4_3 + 0.0101587301587301*G0_1_0_1_4_4 + 0.00846560846560843*G0_1_0_1_4_5 - 0.00423280423280421*G0_1_0_1_5_0 + 0.0253968253968252*G0_1_0_1_5_1 - 0.00423280423280421*G0_1_0_1_5_2 + 0.0169312169312169*G0_1_0_1_5_3 + 0.00846560846560843*G0_1_0_1_5_4 + 0.0338624338624337*G0_1_0_1_5_5 + 0.000423280423280422*G0_1_0_2_0_0 + 0.00042328042328042*G0_1_0_2_0_1 + 0.000423280423280417*G0_1_0_2_0_2 + 0.00169312169312168*G0_1_0_2_0_3 + 0.00169312169312168*G0_1_0_2_0_4 + 0.00169312169312168*G0_1_0_2_0_5 + 0.00042328042328042*G0_1_0_2_1_0 - 0.00634920634920632*G0_1_0_2_1_1 + 0.00253968253968252*G0_1_0_2_1_2 - 0.00423280423280422*G0_1_0_2_1_3 - 0.000846560846560845*G0_1_0_2_1_4 - 0.00423280423280421*G0_1_0_2_1_5 + 0.000423280423280417*G0_1_0_2_2_0 + 0.00253968253968252*G0_1_0_2_2_1 - 0.00634920634920629*G0_1_0_2_2_2 - 0.0042328042328042*G0_1_0_2_2_3 - 0.0042328042328042*G0_1_0_2_2_4 - 0.000846560846560844*G0_1_0_2_2_5 + 0.00169312169312168*G0_1_0_2_3_0 - 0.00423280423280422*G0_1_0_2_3_1 - 0.0042328042328042*G0_1_0_2_3_2 - 0.0152380952380952*G0_1_0_2_3_3 - 0.00169312169312168*G0_1_0_2_3_4 - 0.00169312169312169*G0_1_0_2_3_5 + 0.00169312169312168*G0_1_0_2_4_0 - 0.000846560846560844*G0_1_0_2_4_1 - 0.0042328042328042*G0_1_0_2_4_2 - 0.00169312169312168*G0_1_0_2_4_3 + 0.0016931216931217*G0_1_0_2_4_4 + 0.00338624338624337*G0_1_0_2_4_5 + 0.00169312169312168*G0_1_0_2_5_0 - 0.00423280423280421*G0_1_0_2_5_1 - 0.000846560846560844*G0_1_0_2_5_2 - 0.00169312169312169*G0_1_0_2_5_3 + 0.00338624338624337*G0_1_0_2_5_4 + 0.00169312169312168*G0_1_0_2_5_5 - 0.000846560846560842*G0_1_0_3_0_0 - 0.0042328042328042*G0_1_0_3_0_1 + 0.00169312169312168*G0_1_0_3_0_2 + 0.00169312169312169*G0_1_0_3_0_3 + 0.00338624338624337*G0_1_0_3_0_4 - 0.00169312169312168*G0_1_0_3_0_5 - 0.0042328042328042*G0_1_0_3_1_0 + 0.0253968253968253*G0_1_0_3_1_1 - 0.00423280423280422*G0_1_0_3_1_2 + 0.0338624338624337*G0_1_0_3_1_3 + 0.00846560846560842*G0_1_0_3_1_4 + 0.0169312169312169*G0_1_0_3_1_5 + 0.00169312169312168*G0_1_0_3_2_0 - 0.00423280423280422*G0_1_0_3_2_1 - 0.0042328042328042*G0_1_0_3_2_2 - 0.0152380952380952*G0_1_0_3_2_3 - 0.00169312169312168*G0_1_0_3_2_4 - 0.00169312169312169*G0_1_0_3_2_5 + 0.00169312169312168*G0_1_0_3_3_0 + 0.0338624338624337*G0_1_0_3_3_1 - 0.0152380952380952*G0_1_0_3_3_2 - 0.0203174603174602*G0_1_0_3_3_4 + 0.00338624338624337*G0_1_0_3_4_0 + 0.00846560846560842*G0_1_0_3_4_1 - 0.00169312169312168*G0_1_0_3_4_2 - 0.0203174603174602*G0_1_0_3_4_3 - 0.027089947089947*G0_1_0_3_4_4 - 0.0135449735449735*G0_1_0_3_4_5 - 0.00169312169312168*G0_1_0_3_5_0 + 0.0169312169312169*G0_1_0_3_5_1 - 0.00169312169312169*G0_1_0_3_5_2 - 0.0135449735449735*G0_1_0_3_5_4 - 0.00423280423280421*G0_1_0_4_0_0 - 0.00084656084656084*G0_1_0_4_0_1 + 0.00169312169312168*G0_1_0_4_0_2 + 0.00338624338624337*G0_1_0_4_0_3 + 0.00169312169312167*G0_1_0_4_0_4 - 0.00169312169312169*G0_1_0_4_0_5 - 0.00084656084656084*G0_1_0_4_1_0 - 0.000846560846560844*G0_1_0_4_1_2 + 0.00846560846560842*G0_1_0_4_1_3 + 0.0101587301587301*G0_1_0_4_1_4 + 0.00846560846560843*G0_1_0_4_1_5 + 0.00169312169312168*G0_1_0_4_2_0 - 0.000846560846560844*G0_1_0_4_2_1 - 0.0042328042328042*G0_1_0_4_2_2 - 0.00169312169312168*G0_1_0_4_2_3 + 0.0016931216931217*G0_1_0_4_2_4 + 0.00338624338624337*G0_1_0_4_2_5 + 0.00338624338624337*G0_1_0_4_3_0 + 0.00846560846560842*G0_1_0_4_3_1 - 0.00169312169312168*G0_1_0_4_3_2 - 0.0203174603174602*G0_1_0_4_3_3 - 0.027089947089947*G0_1_0_4_3_4 - 0.0135449735449735*G0_1_0_4_3_5 + 0.00169312169312167*G0_1_0_4_4_0 + 0.0101587301587301*G0_1_0_4_4_1 + 0.0016931216931217*G0_1_0_4_4_2 - 0.027089947089947*G0_1_0_4_4_3 - 0.0609523809523806*G0_1_0_4_4_4 - 0.027089947089947*G0_1_0_4_4_5 - 0.00169312169312169*G0_1_0_4_5_0 + 0.00846560846560843*G0_1_0_4_5_1 + 0.00338624338624337*G0_1_0_4_5_2 - 0.0135449735449735*G0_1_0_4_5_3 - 0.027089947089947*G0_1_0_4_5_4 - 0.0203174603174602*G0_1_0_4_5_5 - 0.00423280423280421*G0_1_0_5_0_0 - 0.00423280423280421*G0_1_0_5_0_1 + 0.00169312169312168*G0_1_0_5_0_2 - 0.00169312169312168*G0_1_0_5_0_3 - 0.00169312169312169*G0_1_0_5_0_4 - 0.0152380952380951*G0_1_0_5_0_5 - 0.00423280423280421*G0_1_0_5_1_0 + 0.0253968253968252*G0_1_0_5_1_1 - 0.00423280423280421*G0_1_0_5_1_2 + 0.0169312169312169*G0_1_0_5_1_3 + 0.00846560846560843*G0_1_0_5_1_4 + 0.0338624338624337*G0_1_0_5_1_5 + 0.00169312169312168*G0_1_0_5_2_0 - 0.00423280423280421*G0_1_0_5_2_1 - 0.000846560846560844*G0_1_0_5_2_2 - 0.00169312169312169*G0_1_0_5_2_3 + 0.00338624338624337*G0_1_0_5_2_4 + 0.00169312169312168*G0_1_0_5_2_5 - 0.00169312169312168*G0_1_0_5_3_0 + 0.0169312169312169*G0_1_0_5_3_1 - 0.00169312169312169*G0_1_0_5_3_2 - 0.0135449735449735*G0_1_0_5_3_4 - 0.00169312169312169*G0_1_0_5_4_0 + 0.00846560846560843*G0_1_0_5_4_1 + 0.00338624338624337*G0_1_0_5_4_2 - 0.0135449735449735*G0_1_0_5_4_3 - 0.027089947089947*G0_1_0_5_4_4 - 0.0203174603174602*G0_1_0_5_4_5 - 0.0152380952380951*G0_1_0_5_5_0 + 0.0338624338624337*G0_1_0_5_5_1 + 0.00169312169312168*G0_1_0_5_5_2 - 0.0203174603174602*G0_1_0_5_5_4; + A[23] = -A[35] + 0.0825396825396821*G0_0_0_0_0_0 - 0.0059259259259259*G0_0_0_0_0_1 - 0.008042328042328*G0_0_0_0_0_2 + 0.00338624338624338*G0_0_0_0_0_3 + 0.0380952380952379*G0_0_0_0_0_4 + 0.0296296296296295*G0_0_0_0_0_5 - 0.0059259259259259*G0_0_0_0_1_0 - 0.0042328042328042*G0_0_0_0_1_1 + 0.00169312169312168*G0_0_0_0_1_2 - 0.00338624338624337*G0_0_0_0_1_3 - 0.00423280423280422*G0_0_0_0_1_4 - 0.00931216931216926*G0_0_0_0_1_5 - 0.008042328042328*G0_0_0_0_2_0 + 0.00169312169312169*G0_0_0_0_2_1 + 0.000846560846560844*G0_0_0_0_2_2 - 0.0101587301587301*G0_0_0_0_2_4 - 0.00338624338624338*G0_0_0_0_2_5 + 0.00338624338624338*G0_0_0_0_3_0 - 0.00338624338624336*G0_0_0_0_3_1 - 0.00169312169312168*G0_0_0_0_3_3 + 0.00169312169312169*G0_0_0_0_3_4 + 0.0380952380952379*G0_0_0_0_4_0 - 0.00423280423280422*G0_0_0_0_4_1 - 0.0101587301587301*G0_0_0_0_4_2 + 0.00169312169312169*G0_0_0_0_4_3 + 0.0355555555555554*G0_0_0_0_4_4 + 0.0152380952380952*G0_0_0_0_4_5 + 0.0296296296296295*G0_0_0_0_5_0 - 0.00931216931216926*G0_0_0_0_5_1 - 0.00338624338624338*G0_0_0_0_5_2 + 0.0152380952380952*G0_0_0_0_5_4 + 0.0186243386243385*G0_0_0_0_5_5 - 0.0059259259259259*G0_0_0_1_0_0 - 0.0042328042328042*G0_0_0_1_0_1 + 0.00169312169312169*G0_0_0_1_0_2 - 0.00338624338624337*G0_0_0_1_0_3 - 0.00423280423280422*G0_0_0_1_0_4 - 0.00931216931216926*G0_0_0_1_0_5 - 0.0042328042328042*G0_0_0_1_1_0 + 0.0698412698412694*G0_0_0_1_1_1 - 0.00634920634920631*G0_0_0_1_1_2 + 0.0253968253968253*G0_0_0_1_1_3 + 0.00423280423280422*G0_0_0_1_1_4 + 0.0253968253968253*G0_0_0_1_1_5 + 0.00169312169312169*G0_0_0_1_2_0 - 0.00634920634920632*G0_0_0_1_2_1 + 0.000846560846560841*G0_0_0_1_2_2 - 0.00338624338624337*G0_0_0_1_2_3 + 0.00169312169312169*G0_0_0_1_2_4 - 0.000846560846560841*G0_0_0_1_2_5 - 0.00338624338624336*G0_0_0_1_3_0 + 0.0253968253968253*G0_0_0_1_3_1 - 0.00338624338624337*G0_0_0_1_3_2 + 0.0253968253968253*G0_0_0_1_3_3 - 0.00169312169312168*G0_0_0_1_3_4 + 0.00846560846560842*G0_0_0_1_3_5 - 0.00423280423280422*G0_0_0_1_4_0 + 0.00423280423280422*G0_0_0_1_4_1 + 0.00169312169312169*G0_0_0_1_4_2 - 0.00169312169312168*G0_0_0_1_4_3 - 0.0186243386243386*G0_0_0_1_4_4 - 0.00677248677248675*G0_0_0_1_4_5 - 0.00931216931216926*G0_0_0_1_5_0 + 0.0253968253968252*G0_0_0_1_5_1 - 0.000846560846560841*G0_0_0_1_5_2 + 0.00846560846560842*G0_0_0_1_5_3 - 0.00677248677248675*G0_0_0_1_5_4 + 0.00846560846560841*G0_0_0_1_5_5 - 0.00804232804232801*G0_0_0_2_0_0 + 0.00169312169312169*G0_0_0_2_0_1 + 0.000846560846560844*G0_0_0_2_0_2 - 0.0101587301587301*G0_0_0_2_0_4 - 0.00338624338624337*G0_0_0_2_0_5 + 0.00169312169312169*G0_0_0_2_1_0 - 0.00634920634920631*G0_0_0_2_1_1 + 0.000846560846560841*G0_0_0_2_1_2 - 0.00338624338624337*G0_0_0_2_1_3 + 0.00169312169312169*G0_0_0_2_1_4 - 0.000846560846560841*G0_0_0_2_1_5 + 0.000846560846560844*G0_0_0_2_2_0 + 0.000846560846560841*G0_0_0_2_2_1 + 0.00846560846560843*G0_0_0_2_2_4 + 0.00253968253968253*G0_0_0_2_2_5 - 0.00338624338624337*G0_0_0_2_3_1 - 0.0135449735449735*G0_0_0_2_3_3 - 0.00338624338624337*G0_0_0_2_3_4 - 0.00507936507936506*G0_0_0_2_3_5 - 0.0101587301587301*G0_0_0_2_4_0 + 0.00169312169312169*G0_0_0_2_4_1 + 0.00846560846560843*G0_0_0_2_4_2 - 0.00338624338624337*G0_0_0_2_4_3 - 0.0135449735449735*G0_0_0_2_4_4 - 0.00846560846560843*G0_0_0_2_4_5 - 0.00338624338624338*G0_0_0_2_5_0 - 0.00084656084656084*G0_0_0_2_5_1 + 0.00253968253968253*G0_0_0_2_5_2 - 0.00507936507936506*G0_0_0_2_5_3 - 0.00846560846560843*G0_0_0_2_5_4 - 0.0101587301587301*G0_0_0_2_5_5 + 0.00338624338624338*G0_0_0_3_0_0 - 0.00338624338624336*G0_0_0_3_0_1 - 0.00169312169312168*G0_0_0_3_0_3 + 0.00169312169312169*G0_0_0_3_0_4 - 0.00338624338624336*G0_0_0_3_1_0 + 0.0253968253968253*G0_0_0_3_1_1 - 0.00338624338624337*G0_0_0_3_1_2 + 0.0253968253968253*G0_0_0_3_1_3 - 0.00169312169312169*G0_0_0_3_1_4 + 0.00846560846560842*G0_0_0_3_1_5 - 0.00338624338624337*G0_0_0_3_2_1 - 0.0135449735449735*G0_0_0_3_2_3 - 0.00338624338624337*G0_0_0_3_2_4 - 0.00507936507936506*G0_0_0_3_2_5 - 0.00169312169312168*G0_0_0_3_3_0 + 0.0253968253968253*G0_0_0_3_3_1 - 0.0135449735449735*G0_0_0_3_3_2 + 0.0203174603174602*G0_0_0_3_3_3 + 0.00677248677248674*G0_0_0_3_3_4 + 0.0135449735449735*G0_0_0_3_3_5 + 0.00169312169312169*G0_0_0_3_4_0 - 0.00169312169312169*G0_0_0_3_4_1 - 0.00338624338624337*G0_0_0_3_4_2 + 0.00677248677248674*G0_0_0_3_4_3 + 0.0338624338624337*G0_0_0_3_4_4 + 0.0135449735449735*G0_0_0_3_4_5 + 0.00846560846560842*G0_0_0_3_5_1 - 0.00507936507936506*G0_0_0_3_5_2 + 0.0135449735449735*G0_0_0_3_5_3 + 0.0135449735449735*G0_0_0_3_5_4 + 0.0203174603174602*G0_0_0_3_5_5 + 0.0380952380952379*G0_0_0_4_0_0 - 0.00423280423280422*G0_0_0_4_0_1 - 0.0101587301587301*G0_0_0_4_0_2 + 0.00169312169312169*G0_0_0_4_0_3 + 0.0355555555555554*G0_0_0_4_0_4 + 0.0152380952380952*G0_0_0_4_0_5 - 0.00423280423280422*G0_0_0_4_1_0 + 0.00423280423280422*G0_0_0_4_1_1 + 0.00169312169312169*G0_0_0_4_1_2 - 0.00169312169312168*G0_0_0_4_1_3 - 0.0186243386243386*G0_0_0_4_1_4 - 0.00677248677248675*G0_0_0_4_1_5 - 0.0101587301587301*G0_0_0_4_2_0 + 0.00169312169312169*G0_0_0_4_2_1 + 0.00846560846560843*G0_0_0_4_2_2 - 0.00338624338624337*G0_0_0_4_2_3 - 0.0135449735449735*G0_0_0_4_2_4 - 0.00846560846560843*G0_0_0_4_2_5 + 0.00169312169312169*G0_0_0_4_3_0 - 0.00169312169312168*G0_0_0_4_3_1 - 0.00338624338624337*G0_0_0_4_3_2 + 0.00677248677248674*G0_0_0_4_3_3 + 0.0338624338624337*G0_0_0_4_3_4 + 0.0135449735449735*G0_0_0_4_3_5 + 0.0355555555555554*G0_0_0_4_4_0 - 0.0186243386243386*G0_0_0_4_4_1 - 0.0135449735449735*G0_0_0_4_4_2 + 0.0338624338624337*G0_0_0_4_4_3 + 0.264126984126983*G0_0_0_4_4_4 + 0.054179894179894*G0_0_0_4_4_5 + 0.0152380952380952*G0_0_0_4_5_0 - 0.00677248677248675*G0_0_0_4_5_1 - 0.00846560846560843*G0_0_0_4_5_2 + 0.0135449735449735*G0_0_0_4_5_3 + 0.054179894179894*G0_0_0_4_5_4 + 0.0338624338624337*G0_0_0_4_5_5 + 0.0296296296296295*G0_0_0_5_0_0 - 0.00931216931216926*G0_0_0_5_0_1 - 0.00338624338624338*G0_0_0_5_0_2 + 0.0152380952380952*G0_0_0_5_0_4 + 0.0186243386243385*G0_0_0_5_0_5 - 0.00931216931216926*G0_0_0_5_1_0 + 0.0253968253968252*G0_0_0_5_1_1 - 0.000846560846560841*G0_0_0_5_1_2 + 0.00846560846560842*G0_0_0_5_1_3 - 0.00677248677248675*G0_0_0_5_1_4 + 0.00846560846560841*G0_0_0_5_1_5 - 0.00338624338624338*G0_0_0_5_2_0 - 0.000846560846560841*G0_0_0_5_2_1 + 0.00253968253968253*G0_0_0_5_2_2 - 0.00507936507936506*G0_0_0_5_2_3 - 0.00846560846560843*G0_0_0_5_2_4 - 0.0101587301587301*G0_0_0_5_2_5 + 0.00846560846560842*G0_0_0_5_3_1 - 0.00507936507936506*G0_0_0_5_3_2 + 0.0135449735449735*G0_0_0_5_3_3 + 0.0135449735449735*G0_0_0_5_3_4 + 0.0203174603174602*G0_0_0_5_3_5 + 0.0152380952380952*G0_0_0_5_4_0 - 0.00677248677248675*G0_0_0_5_4_1 - 0.00846560846560843*G0_0_0_5_4_2 + 0.0135449735449735*G0_0_0_5_4_3 + 0.054179894179894*G0_0_0_5_4_4 + 0.0338624338624337*G0_0_0_5_4_5 + 0.0186243386243385*G0_0_0_5_5_0 + 0.00846560846560841*G0_0_0_5_5_1 - 0.0101587301587301*G0_0_0_5_5_2 + 0.0203174603174602*G0_0_0_5_5_3 + 0.0338624338624337*G0_0_0_5_5_4 + 0.0812698412698408*G0_0_0_5_5_5 - 0.00634920634920631*G0_0_1_0_0_0 + 0.00253968253968252*G0_0_1_0_0_1 + 0.000423280423280422*G0_0_1_0_0_2 - 0.000846560846560842*G0_0_1_0_0_3 - 0.00423280423280421*G0_0_1_0_0_4 - 0.00423280423280421*G0_0_1_0_0_5 + 0.00253968253968252*G0_0_1_0_1_0 - 0.0063492063492063*G0_0_1_0_1_1 + 0.00042328042328042*G0_0_1_0_1_2 - 0.0042328042328042*G0_0_1_0_1_3 - 0.00084656084656084*G0_0_1_0_1_4 - 0.0042328042328042*G0_0_1_0_1_5 + 0.000423280423280422*G0_0_1_0_2_0 + 0.00042328042328042*G0_0_1_0_2_1 + 0.000423280423280417*G0_0_1_0_2_2 + 0.00169312169312168*G0_0_1_0_2_3 + 0.00169312169312168*G0_0_1_0_2_4 + 0.00169312169312168*G0_0_1_0_2_5 - 0.000846560846560842*G0_0_1_0_3_0 - 0.0042328042328042*G0_0_1_0_3_1 + 0.00169312169312168*G0_0_1_0_3_2 + 0.00169312169312168*G0_0_1_0_3_3 + 0.00338624338624336*G0_0_1_0_3_4 - 0.00169312169312168*G0_0_1_0_3_5 - 0.00423280423280421*G0_0_1_0_4_0 - 0.00084656084656084*G0_0_1_0_4_1 + 0.00169312169312168*G0_0_1_0_4_2 + 0.00338624338624336*G0_0_1_0_4_3 + 0.00169312169312167*G0_0_1_0_4_4 - 0.00169312169312169*G0_0_1_0_4_5 - 0.00423280423280421*G0_0_1_0_5_0 - 0.0042328042328042*G0_0_1_0_5_1 + 0.00169312169312168*G0_0_1_0_5_2 - 0.00169312169312168*G0_0_1_0_5_3 - 0.00169312169312169*G0_0_1_0_5_4 - 0.0152380952380951*G0_0_1_0_5_5 + 0.00253968253968252*G0_0_1_1_0_0 - 0.0063492063492063*G0_0_1_1_0_1 + 0.00042328042328042*G0_0_1_1_0_2 - 0.0042328042328042*G0_0_1_1_0_3 - 0.00084656084656084*G0_0_1_1_0_4 - 0.0042328042328042*G0_0_1_1_0_5 - 0.0063492063492063*G0_0_1_1_1_0 + 0.0761904761904758*G0_0_1_1_1_1 - 0.00634920634920632*G0_0_1_1_1_2 + 0.0253968253968253*G0_0_1_1_1_3 + 0.0253968253968253*G0_0_1_1_1_5 + 0.00042328042328042*G0_0_1_1_2_0 - 0.00634920634920632*G0_0_1_1_2_1 + 0.00253968253968252*G0_0_1_1_2_2 - 0.00423280423280422*G0_0_1_1_2_3 - 0.000846560846560845*G0_0_1_1_2_4 - 0.00423280423280421*G0_0_1_1_2_5 - 0.0042328042328042*G0_0_1_1_3_0 + 0.0253968253968253*G0_0_1_1_3_1 - 0.00423280423280422*G0_0_1_1_3_2 + 0.0338624338624337*G0_0_1_1_3_3 + 0.00846560846560842*G0_0_1_1_3_4 + 0.0169312169312168*G0_0_1_1_3_5 - 0.00084656084656084*G0_0_1_1_4_0 - 0.000846560846560844*G0_0_1_1_4_2 + 0.00846560846560842*G0_0_1_1_4_3 + 0.0101587301587301*G0_0_1_1_4_4 + 0.00846560846560843*G0_0_1_1_4_5 - 0.0042328042328042*G0_0_1_1_5_0 + 0.0253968253968253*G0_0_1_1_5_1 - 0.00423280423280421*G0_0_1_1_5_2 + 0.0169312169312169*G0_0_1_1_5_3 + 0.00846560846560843*G0_0_1_1_5_4 + 0.0338624338624337*G0_0_1_1_5_5 + 0.000423280423280422*G0_0_1_2_0_0 + 0.00042328042328042*G0_0_1_2_0_1 + 0.000423280423280417*G0_0_1_2_0_2 + 0.00169312169312168*G0_0_1_2_0_3 + 0.00169312169312168*G0_0_1_2_0_4 + 0.00169312169312168*G0_0_1_2_0_5 + 0.00042328042328042*G0_0_1_2_1_0 - 0.00634920634920632*G0_0_1_2_1_1 + 0.00253968253968252*G0_0_1_2_1_2 - 0.00423280423280422*G0_0_1_2_1_3 - 0.000846560846560845*G0_0_1_2_1_4 - 0.00423280423280421*G0_0_1_2_1_5 + 0.000423280423280417*G0_0_1_2_2_0 + 0.00253968253968252*G0_0_1_2_2_1 - 0.00634920634920629*G0_0_1_2_2_2 - 0.0042328042328042*G0_0_1_2_2_3 - 0.0042328042328042*G0_0_1_2_2_4 - 0.000846560846560844*G0_0_1_2_2_5 + 0.00169312169312168*G0_0_1_2_3_0 - 0.00423280423280422*G0_0_1_2_3_1 - 0.0042328042328042*G0_0_1_2_3_2 - 0.0152380952380952*G0_0_1_2_3_3 - 0.00169312169312168*G0_0_1_2_3_4 - 0.00169312169312169*G0_0_1_2_3_5 + 0.00169312169312168*G0_0_1_2_4_0 - 0.000846560846560844*G0_0_1_2_4_1 - 0.0042328042328042*G0_0_1_2_4_2 - 0.00169312169312168*G0_0_1_2_4_3 + 0.00169312169312169*G0_0_1_2_4_4 + 0.00338624338624337*G0_0_1_2_4_5 + 0.00169312169312168*G0_0_1_2_5_0 - 0.00423280423280421*G0_0_1_2_5_1 - 0.000846560846560844*G0_0_1_2_5_2 - 0.00169312169312169*G0_0_1_2_5_3 + 0.00338624338624337*G0_0_1_2_5_4 + 0.00169312169312168*G0_0_1_2_5_5 - 0.000846560846560842*G0_0_1_3_0_0 - 0.0042328042328042*G0_0_1_3_0_1 + 0.00169312169312168*G0_0_1_3_0_2 + 0.00169312169312169*G0_0_1_3_0_3 + 0.00338624338624337*G0_0_1_3_0_4 - 0.00169312169312168*G0_0_1_3_0_5 - 0.0042328042328042*G0_0_1_3_1_0 + 0.0253968253968253*G0_0_1_3_1_1 - 0.00423280423280422*G0_0_1_3_1_2 + 0.0338624338624337*G0_0_1_3_1_3 + 0.00846560846560842*G0_0_1_3_1_4 + 0.0169312169312168*G0_0_1_3_1_5 + 0.00169312169312168*G0_0_1_3_2_0 - 0.00423280423280422*G0_0_1_3_2_1 - 0.0042328042328042*G0_0_1_3_2_2 - 0.0152380952380952*G0_0_1_3_2_3 - 0.00169312169312168*G0_0_1_3_2_4 - 0.00169312169312169*G0_0_1_3_2_5 + 0.00169312169312168*G0_0_1_3_3_0 + 0.0338624338624337*G0_0_1_3_3_1 - 0.0152380952380952*G0_0_1_3_3_2 - 0.0203174603174602*G0_0_1_3_3_4 + 0.00338624338624337*G0_0_1_3_4_0 + 0.00846560846560842*G0_0_1_3_4_1 - 0.00169312169312168*G0_0_1_3_4_2 - 0.0203174603174602*G0_0_1_3_4_3 - 0.027089947089947*G0_0_1_3_4_4 - 0.0135449735449735*G0_0_1_3_4_5 - 0.00169312169312168*G0_0_1_3_5_0 + 0.0169312169312168*G0_0_1_3_5_1 - 0.00169312169312169*G0_0_1_3_5_2 - 0.0135449735449735*G0_0_1_3_5_4 - 0.00423280423280421*G0_0_1_4_0_0 - 0.00084656084656084*G0_0_1_4_0_1 + 0.00169312169312168*G0_0_1_4_0_2 + 0.00338624338624336*G0_0_1_4_0_3 + 0.00169312169312167*G0_0_1_4_0_4 - 0.00169312169312169*G0_0_1_4_0_5 - 0.00084656084656084*G0_0_1_4_1_0 - 0.000846560846560844*G0_0_1_4_1_2 + 0.00846560846560842*G0_0_1_4_1_3 + 0.0101587301587301*G0_0_1_4_1_4 + 0.00846560846560843*G0_0_1_4_1_5 + 0.00169312169312168*G0_0_1_4_2_0 - 0.000846560846560844*G0_0_1_4_2_1 - 0.0042328042328042*G0_0_1_4_2_2 - 0.00169312169312168*G0_0_1_4_2_3 + 0.00169312169312169*G0_0_1_4_2_4 + 0.00338624338624337*G0_0_1_4_2_5 + 0.00338624338624336*G0_0_1_4_3_0 + 0.00846560846560842*G0_0_1_4_3_1 - 0.00169312169312168*G0_0_1_4_3_2 - 0.0203174603174602*G0_0_1_4_3_3 - 0.027089947089947*G0_0_1_4_3_4 - 0.0135449735449735*G0_0_1_4_3_5 + 0.00169312169312167*G0_0_1_4_4_0 + 0.0101587301587301*G0_0_1_4_4_1 + 0.00169312169312169*G0_0_1_4_4_2 - 0.027089947089947*G0_0_1_4_4_3 - 0.0609523809523806*G0_0_1_4_4_4 - 0.027089947089947*G0_0_1_4_4_5 - 0.00169312169312169*G0_0_1_4_5_0 + 0.00846560846560842*G0_0_1_4_5_1 + 0.00338624338624337*G0_0_1_4_5_2 - 0.0135449735449735*G0_0_1_4_5_3 - 0.027089947089947*G0_0_1_4_5_4 - 0.0203174603174602*G0_0_1_4_5_5 - 0.00423280423280421*G0_0_1_5_0_0 - 0.0042328042328042*G0_0_1_5_0_1 + 0.00169312169312168*G0_0_1_5_0_2 - 0.00169312169312168*G0_0_1_5_0_3 - 0.00169312169312169*G0_0_1_5_0_4 - 0.0152380952380951*G0_0_1_5_0_5 - 0.0042328042328042*G0_0_1_5_1_0 + 0.0253968253968252*G0_0_1_5_1_1 - 0.00423280423280421*G0_0_1_5_1_2 + 0.0169312169312168*G0_0_1_5_1_3 + 0.00846560846560842*G0_0_1_5_1_4 + 0.0338624338624337*G0_0_1_5_1_5 + 0.00169312169312168*G0_0_1_5_2_0 - 0.00423280423280421*G0_0_1_5_2_1 - 0.000846560846560844*G0_0_1_5_2_2 - 0.00169312169312169*G0_0_1_5_2_3 + 0.00338624338624337*G0_0_1_5_2_4 + 0.00169312169312168*G0_0_1_5_2_5 - 0.00169312169312168*G0_0_1_5_3_0 + 0.0169312169312168*G0_0_1_5_3_1 - 0.00169312169312169*G0_0_1_5_3_2 - 0.0135449735449735*G0_0_1_5_3_4 - 0.00169312169312169*G0_0_1_5_4_0 + 0.00846560846560842*G0_0_1_5_4_1 + 0.00338624338624337*G0_0_1_5_4_2 - 0.0135449735449735*G0_0_1_5_4_3 - 0.027089947089947*G0_0_1_5_4_4 - 0.0203174603174602*G0_0_1_5_4_5 - 0.0152380952380951*G0_0_1_5_5_0 + 0.0338624338624337*G0_0_1_5_5_1 + 0.00169312169312168*G0_0_1_5_5_2 - 0.0203174603174602*G0_0_1_5_5_4; + A[29] = -A[23] + 0.0825396825396821*G0_1_0_0_0_0 - 0.00888888888888884*G0_1_0_0_0_1 - 0.00677248677248674*G0_1_0_0_0_2 + 0.000846560846560854*G0_1_0_0_0_3 + 0.0296296296296295*G0_1_0_0_0_4 + 0.0296296296296295*G0_1_0_0_0_5 - 0.00888888888888884*G0_1_0_0_1_0 + 0.00888888888888882*G0_1_0_0_1_1 + 0.00338624338624336*G0_1_0_0_1_3 - 0.00338624338624337*G0_1_0_0_1_4 - 0.00677248677248674*G0_1_0_0_2_0 + 0.00211640211640211*G0_1_0_0_2_2 - 0.00253968253968252*G0_1_0_0_2_3 - 0.0059259259259259*G0_1_0_0_2_4 - 0.0059259259259259*G0_1_0_0_2_5 + 0.000846560846560854*G0_1_0_0_3_0 + 0.00338624338624336*G0_1_0_0_3_1 - 0.00253968253968252*G0_1_0_0_3_2 + 0.00846560846560841*G0_1_0_0_3_3 + 0.00507936507936506*G0_1_0_0_3_4 + 0.0101587301587301*G0_1_0_0_3_5 + 0.0296296296296295*G0_1_0_0_4_0 - 0.00338624338624337*G0_1_0_0_4_1 - 0.0059259259259259*G0_1_0_0_4_2 + 0.00507936507936506*G0_1_0_0_4_3 + 0.032169312169312*G0_1_0_0_4_4 + 0.0186243386243385*G0_1_0_0_4_5 + 0.0296296296296295*G0_1_0_0_5_0 - 0.0059259259259259*G0_1_0_0_5_2 + 0.0101587301587301*G0_1_0_0_5_3 + 0.0186243386243385*G0_1_0_0_5_4 + 0.0491005291005288*G0_1_0_0_5_5 - 0.00888888888888884*G0_1_0_1_0_0 + 0.00888888888888882*G0_1_0_1_0_1 + 0.00338624338624336*G0_1_0_1_0_3 - 0.00338624338624337*G0_1_0_1_0_4 + 0.00888888888888882*G0_1_0_1_1_0 - 0.082539682539682*G0_1_0_1_1_1 + 0.00677248677248673*G0_1_0_1_1_2 - 0.0296296296296295*G0_1_0_1_1_3 - 0.000846560846560842*G0_1_0_1_1_4 - 0.0296296296296294*G0_1_0_1_1_5 + 0.00677248677248673*G0_1_0_1_2_1 - 0.00211640211640211*G0_1_0_1_2_2 + 0.0059259259259259*G0_1_0_1_2_3 + 0.00253968253968253*G0_1_0_1_2_4 + 0.0059259259259259*G0_1_0_1_2_5 + 0.00338624338624336*G0_1_0_1_3_0 - 0.0296296296296295*G0_1_0_1_3_1 + 0.0059259259259259*G0_1_0_1_3_2 - 0.032169312169312*G0_1_0_1_3_3 - 0.00507936507936506*G0_1_0_1_3_4 - 0.0186243386243385*G0_1_0_1_3_5 - 0.00338624338624337*G0_1_0_1_4_0 - 0.000846560846560842*G0_1_0_1_4_1 + 0.00253968253968253*G0_1_0_1_4_2 - 0.00507936507936506*G0_1_0_1_4_3 - 0.00846560846560843*G0_1_0_1_4_4 - 0.0101587301587301*G0_1_0_1_4_5 - 0.0296296296296294*G0_1_0_1_5_1 + 0.0059259259259259*G0_1_0_1_5_2 - 0.0186243386243385*G0_1_0_1_5_3 - 0.0101587301587301*G0_1_0_1_5_4 - 0.0491005291005288*G0_1_0_1_5_5 - 0.00677248677248674*G0_1_0_2_0_0 + 0.00211640211640211*G0_1_0_2_0_2 - 0.00253968253968252*G0_1_0_2_0_3 - 0.0059259259259259*G0_1_0_2_0_4 - 0.0059259259259259*G0_1_0_2_0_5 + 0.00677248677248673*G0_1_0_2_1_1 - 0.00211640211640211*G0_1_0_2_1_2 + 0.0059259259259259*G0_1_0_2_1_3 + 0.00253968253968253*G0_1_0_2_1_4 + 0.0059259259259259*G0_1_0_2_1_5 + 0.00211640211640211*G0_1_0_2_2_0 - 0.00211640211640211*G0_1_0_2_2_1 - 0.00253968253968252*G0_1_0_2_3_0 + 0.0059259259259259*G0_1_0_2_3_1 + 0.0169312169312168*G0_1_0_2_3_3 + 0.00507936507936506*G0_1_0_2_3_5 - 0.0059259259259259*G0_1_0_2_4_0 + 0.00253968253968253*G0_1_0_2_4_1 - 0.0169312169312169*G0_1_0_2_4_4 - 0.00507936507936506*G0_1_0_2_4_5 - 0.0059259259259259*G0_1_0_2_5_0 + 0.00592592592592589*G0_1_0_2_5_1 + 0.00507936507936506*G0_1_0_2_5_3 - 0.00507936507936506*G0_1_0_2_5_4 + 0.000846560846560854*G0_1_0_3_0_0 + 0.00338624338624336*G0_1_0_3_0_1 - 0.00253968253968252*G0_1_0_3_0_2 + 0.00846560846560841*G0_1_0_3_0_3 + 0.00507936507936506*G0_1_0_3_0_4 + 0.0101587301587301*G0_1_0_3_0_5 + 0.00338624338624336*G0_1_0_3_1_0 - 0.0296296296296295*G0_1_0_3_1_1 + 0.0059259259259259*G0_1_0_3_1_2 - 0.032169312169312*G0_1_0_3_1_3 - 0.00507936507936506*G0_1_0_3_1_4 - 0.0186243386243385*G0_1_0_3_1_5 - 0.00253968253968252*G0_1_0_3_2_0 + 0.0059259259259259*G0_1_0_3_2_1 + 0.0169312169312168*G0_1_0_3_2_3 + 0.00507936507936506*G0_1_0_3_2_5 + 0.00846560846560841*G0_1_0_3_3_0 - 0.032169312169312*G0_1_0_3_3_1 + 0.0169312169312168*G0_1_0_3_3_2 - 0.0609523809523806*G0_1_0_3_3_3 - 0.00677248677248674*G0_1_0_3_3_4 - 0.027089947089947*G0_1_0_3_3_5 + 0.00507936507936506*G0_1_0_3_4_0 - 0.00507936507936506*G0_1_0_3_4_1 - 0.00677248677248674*G0_1_0_3_4_3 + 0.00677248677248674*G0_1_0_3_4_4 + 0.0101587301587301*G0_1_0_3_5_0 - 0.0186243386243385*G0_1_0_3_5_1 + 0.00507936507936506*G0_1_0_3_5_2 - 0.027089947089947*G0_1_0_3_5_3 - 0.0203174603174602*G0_1_0_3_5_5 + 0.0296296296296295*G0_1_0_4_0_0 - 0.00338624338624337*G0_1_0_4_0_1 - 0.0059259259259259*G0_1_0_4_0_2 + 0.00507936507936506*G0_1_0_4_0_3 + 0.032169312169312*G0_1_0_4_0_4 + 0.0186243386243385*G0_1_0_4_0_5 - 0.00338624338624337*G0_1_0_4_1_0 - 0.000846560846560843*G0_1_0_4_1_1 + 0.00253968253968253*G0_1_0_4_1_2 - 0.00507936507936506*G0_1_0_4_1_3 - 0.00846560846560843*G0_1_0_4_1_4 - 0.0101587301587301*G0_1_0_4_1_5 - 0.0059259259259259*G0_1_0_4_2_0 + 0.00253968253968253*G0_1_0_4_2_1 - 0.0169312169312169*G0_1_0_4_2_4 - 0.00507936507936506*G0_1_0_4_2_5 + 0.00507936507936506*G0_1_0_4_3_0 - 0.00507936507936506*G0_1_0_4_3_1 - 0.00677248677248674*G0_1_0_4_3_3 + 0.00677248677248674*G0_1_0_4_3_4 + 0.032169312169312*G0_1_0_4_4_0 - 0.00846560846560843*G0_1_0_4_4_1 - 0.0169312169312169*G0_1_0_4_4_2 + 0.00677248677248674*G0_1_0_4_4_3 + 0.0609523809523807*G0_1_0_4_4_4 + 0.027089947089947*G0_1_0_4_4_5 + 0.0186243386243385*G0_1_0_4_5_0 - 0.0101587301587301*G0_1_0_4_5_1 - 0.00507936507936506*G0_1_0_4_5_2 + 0.027089947089947*G0_1_0_4_5_4 + 0.0203174603174602*G0_1_0_4_5_5 + 0.0296296296296295*G0_1_0_5_0_0 - 0.0059259259259259*G0_1_0_5_0_2 + 0.0101587301587301*G0_1_0_5_0_3 + 0.0186243386243385*G0_1_0_5_0_4 + 0.0491005291005288*G0_1_0_5_0_5 - 0.0296296296296294*G0_1_0_5_1_1 + 0.0059259259259259*G0_1_0_5_1_2 - 0.0186243386243385*G0_1_0_5_1_3 - 0.0101587301587301*G0_1_0_5_1_4 - 0.0491005291005288*G0_1_0_5_1_5 - 0.0059259259259259*G0_1_0_5_2_0 + 0.0059259259259259*G0_1_0_5_2_1 + 0.00507936507936506*G0_1_0_5_2_3 - 0.00507936507936506*G0_1_0_5_2_4 + 0.0101587301587301*G0_1_0_5_3_0 - 0.0186243386243385*G0_1_0_5_3_1 + 0.00507936507936506*G0_1_0_5_3_2 - 0.027089947089947*G0_1_0_5_3_3 - 0.0203174603174602*G0_1_0_5_3_5 + 0.0186243386243385*G0_1_0_5_4_0 - 0.0101587301587301*G0_1_0_5_4_1 - 0.00507936507936506*G0_1_0_5_4_2 + 0.027089947089947*G0_1_0_5_4_4 + 0.0203174603174602*G0_1_0_5_4_5 + 0.0491005291005288*G0_1_0_5_5_0 - 0.0491005291005288*G0_1_0_5_5_1 - 0.0203174603174602*G0_1_0_5_5_3 + 0.0203174603174602*G0_1_0_5_5_4 - 0.00634920634920632*G0_1_1_0_0_0 - 0.000423280423280416*G0_1_1_0_0_1 + 0.00169312169312168*G0_1_1_0_0_2 - 0.00338624338624336*G0_1_1_0_0_3 - 0.00423280423280421*G0_1_1_0_0_4 - 0.0126984126984126*G0_1_1_0_0_5 - 0.000423280423280416*G0_1_1_0_1_0 + 0.0084656084656084*G0_1_1_0_1_1 - 0.00126984126984126*G0_1_1_0_1_2 + 0.00507936507936504*G0_1_1_0_1_3 + 0.00169312169312168*G0_1_1_0_1_4 + 0.0118518518518518*G0_1_1_0_1_5 + 0.00169312169312168*G0_1_1_0_2_0 - 0.00126984126984126*G0_1_1_0_2_1 - 0.00338624338624336*G0_1_1_0_2_3 - 0.00084656084656084*G0_1_1_0_2_4 - 0.00253968253968253*G0_1_1_0_2_5 - 0.00338624338624336*G0_1_1_0_3_0 + 0.00507936507936504*G0_1_1_0_3_1 - 0.00338624338624336*G0_1_1_0_3_2 + 0.0118518518518518*G0_1_1_0_3_3 + 0.00338624338624337*G0_1_1_0_3_4 + 0.0118518518518518*G0_1_1_0_3_5 - 0.00423280423280421*G0_1_1_0_4_0 + 0.00169312169312168*G0_1_1_0_4_1 - 0.00084656084656084*G0_1_1_0_4_2 + 0.00338624338624337*G0_1_1_0_4_3 - 0.00169312169312169*G0_1_1_0_4_4 + 0.00169312169312168*G0_1_1_0_4_5 - 0.0126984126984126*G0_1_1_0_5_0 + 0.0118518518518518*G0_1_1_0_5_1 - 0.00253968253968253*G0_1_1_0_5_2 + 0.0118518518518518*G0_1_1_0_5_3 + 0.00169312169312168*G0_1_1_0_5_4 + 0.0152380952380951*G0_1_1_0_5_5 - 0.000423280423280416*G0_1_1_1_0_0 + 0.00846560846560841*G0_1_1_1_0_1 - 0.00126984126984126*G0_1_1_1_0_2 + 0.00507936507936504*G0_1_1_1_0_3 + 0.00169312169312168*G0_1_1_1_0_4 + 0.0118518518518518*G0_1_1_1_0_5 + 0.00846560846560841*G0_1_1_1_1_0 - 0.0888888888888884*G0_1_1_1_1_1 + 0.00846560846560842*G0_1_1_1_1_2 - 0.0338624338624337*G0_1_1_1_1_3 - 0.00423280423280421*G0_1_1_1_1_4 - 0.0423280423280421*G0_1_1_1_1_5 - 0.00126984126984126*G0_1_1_1_2_0 + 0.00846560846560842*G0_1_1_1_2_1 - 0.0021164021164021*G0_1_1_1_2_2 + 0.00507936507936506*G0_1_1_1_2_3 - 0.000846560846560842*G0_1_1_1_2_4 + 0.00338624338624337*G0_1_1_1_2_5 + 0.00507936507936504*G0_1_1_1_3_0 - 0.0338624338624337*G0_1_1_1_3_1 + 0.00507936507936506*G0_1_1_1_3_2 - 0.0338624338624337*G0_1_1_1_3_3 - 0.00169312169312169*G0_1_1_1_3_4 - 0.0169312169312168*G0_1_1_1_3_5 + 0.00169312169312168*G0_1_1_1_4_0 - 0.00423280423280421*G0_1_1_1_4_1 - 0.000846560846560842*G0_1_1_1_4_2 - 0.00169312169312169*G0_1_1_1_4_3 + 0.00338624338624337*G0_1_1_1_4_4 + 0.00169312169312169*G0_1_1_1_4_5 + 0.0118518518518518*G0_1_1_1_5_0 - 0.0423280423280421*G0_1_1_1_5_1 + 0.00338624338624337*G0_1_1_1_5_2 - 0.0169312169312168*G0_1_1_1_5_3 + 0.00169312169312169*G0_1_1_1_5_4 - 0.0338624338624337*G0_1_1_1_5_5 + 0.00169312169312168*G0_1_1_2_0_0 - 0.00126984126984126*G0_1_1_2_0_1 - 0.00338624338624337*G0_1_1_2_0_3 - 0.00084656084656084*G0_1_1_2_0_4 - 0.00253968253968253*G0_1_1_2_0_5 - 0.00126984126984126*G0_1_1_2_1_0 + 0.00846560846560842*G0_1_1_2_1_1 - 0.0021164021164021*G0_1_1_2_1_2 + 0.00507936507936506*G0_1_1_2_1_3 - 0.000846560846560842*G0_1_1_2_1_4 + 0.00338624338624337*G0_1_1_2_1_5 - 0.0021164021164021*G0_1_1_2_2_1 + 0.0063492063492063*G0_1_1_2_2_2 - 0.00423280423280421*G0_1_1_2_2_5 - 0.00338624338624336*G0_1_1_2_3_0 + 0.00507936507936506*G0_1_1_2_3_1 + 0.0253968253968253*G0_1_1_2_3_3 + 0.00846560846560842*G0_1_1_2_3_4 + 0.0152380952380952*G0_1_1_2_3_5 - 0.00084656084656084*G0_1_1_2_4_0 - 0.000846560846560842*G0_1_1_2_4_1 + 0.00846560846560842*G0_1_1_2_4_3 + 0.00846560846560842*G0_1_1_2_4_4 + 0.0101587301587301*G0_1_1_2_4_5 - 0.00253968253968253*G0_1_1_2_5_0 + 0.00338624338624337*G0_1_1_2_5_1 - 0.00423280423280421*G0_1_1_2_5_2 + 0.0152380952380952*G0_1_1_2_5_3 + 0.0101587301587301*G0_1_1_2_5_4 + 0.0287830687830686*G0_1_1_2_5_5 - 0.00338624338624336*G0_1_1_3_0_0 + 0.00507936507936504*G0_1_1_3_0_1 - 0.00338624338624336*G0_1_1_3_0_2 + 0.0118518518518518*G0_1_1_3_0_3 + 0.00338624338624337*G0_1_1_3_0_4 + 0.0118518518518518*G0_1_1_3_0_5 + 0.00507936507936504*G0_1_1_3_1_0 - 0.0338624338624337*G0_1_1_3_1_1 + 0.00507936507936506*G0_1_1_3_1_2 - 0.0338624338624337*G0_1_1_3_1_3 - 0.00169312169312168*G0_1_1_3_1_4 - 0.0169312169312168*G0_1_1_3_1_5 - 0.00338624338624336*G0_1_1_3_2_0 + 0.00507936507936506*G0_1_1_3_2_1 + 0.0253968253968253*G0_1_1_3_2_3 + 0.00846560846560842*G0_1_1_3_2_4 + 0.0152380952380952*G0_1_1_3_2_5 + 0.0118518518518518*G0_1_1_3_3_0 - 0.0338624338624337*G0_1_1_3_3_1 + 0.0253968253968253*G0_1_1_3_3_2 - 0.0812698412698409*G0_1_1_3_3_3 - 0.0203174603174602*G0_1_1_3_3_4 - 0.0541798941798939*G0_1_1_3_3_5 + 0.00338624338624337*G0_1_1_3_4_0 - 0.00169312169312169*G0_1_1_3_4_1 + 0.00846560846560843*G0_1_1_3_4_2 - 0.0203174603174602*G0_1_1_3_4_3 - 0.0135449735449735*G0_1_1_3_4_4 - 0.027089947089947*G0_1_1_3_4_5 + 0.0118518518518518*G0_1_1_3_5_0 - 0.0169312169312168*G0_1_1_3_5_1 + 0.0152380952380952*G0_1_1_3_5_2 - 0.0541798941798939*G0_1_1_3_5_3 - 0.027089947089947*G0_1_1_3_5_4 - 0.0812698412698409*G0_1_1_3_5_5 - 0.00423280423280421*G0_1_1_4_0_0 + 0.00169312169312168*G0_1_1_4_0_1 - 0.00084656084656084*G0_1_1_4_0_2 + 0.00338624338624337*G0_1_1_4_0_3 - 0.00169312169312169*G0_1_1_4_0_4 + 0.00169312169312168*G0_1_1_4_0_5 + 0.00169312169312168*G0_1_1_4_1_0 - 0.00423280423280421*G0_1_1_4_1_1 - 0.000846560846560842*G0_1_1_4_1_2 - 0.00169312169312169*G0_1_1_4_1_3 + 0.00338624338624337*G0_1_1_4_1_4 + 0.00169312169312169*G0_1_1_4_1_5 - 0.00084656084656084*G0_1_1_4_2_0 - 0.000846560846560842*G0_1_1_4_2_1 + 0.00846560846560842*G0_1_1_4_2_3 + 0.00846560846560842*G0_1_1_4_2_4 + 0.0101587301587301*G0_1_1_4_2_5 + 0.00338624338624337*G0_1_1_4_3_0 - 0.00169312169312169*G0_1_1_4_3_1 + 0.00846560846560843*G0_1_1_4_3_2 - 0.0203174603174602*G0_1_1_4_3_3 - 0.0135449735449735*G0_1_1_4_3_4 - 0.027089947089947*G0_1_1_4_3_5 - 0.00169312169312169*G0_1_1_4_4_0 + 0.00338624338624337*G0_1_1_4_4_1 + 0.00846560846560842*G0_1_1_4_4_2 - 0.0135449735449735*G0_1_1_4_4_3 - 0.0203174603174602*G0_1_1_4_4_4 - 0.027089947089947*G0_1_1_4_4_5 + 0.00169312169312168*G0_1_1_4_5_0 + 0.00169312169312169*G0_1_1_4_5_1 + 0.0101587301587301*G0_1_1_4_5_2 - 0.027089947089947*G0_1_1_4_5_3 - 0.027089947089947*G0_1_1_4_5_4 - 0.0609523809523806*G0_1_1_4_5_5 - 0.0126984126984126*G0_1_1_5_0_0 + 0.0118518518518518*G0_1_1_5_0_1 - 0.00253968253968252*G0_1_1_5_0_2 + 0.0118518518518518*G0_1_1_5_0_3 + 0.00169312169312168*G0_1_1_5_0_4 + 0.0152380952380951*G0_1_1_5_0_5 + 0.0118518518518518*G0_1_1_5_1_0 - 0.0423280423280421*G0_1_1_5_1_1 + 0.00338624338624337*G0_1_1_5_1_2 - 0.0169312169312168*G0_1_1_5_1_3 + 0.00169312169312169*G0_1_1_5_1_4 - 0.0338624338624337*G0_1_1_5_1_5 - 0.00253968253968252*G0_1_1_5_2_0 + 0.00338624338624337*G0_1_1_5_2_1 - 0.00423280423280421*G0_1_1_5_2_2 + 0.0152380952380952*G0_1_1_5_2_3 + 0.0101587301587301*G0_1_1_5_2_4 + 0.0287830687830686*G0_1_1_5_2_5 + 0.0118518518518518*G0_1_1_5_3_0 - 0.0169312169312168*G0_1_1_5_3_1 + 0.0152380952380952*G0_1_1_5_3_2 - 0.0541798941798939*G0_1_1_5_3_3 - 0.027089947089947*G0_1_1_5_3_4 - 0.0812698412698409*G0_1_1_5_3_5 + 0.00169312169312168*G0_1_1_5_4_0 + 0.00169312169312169*G0_1_1_5_4_1 + 0.0101587301587301*G0_1_1_5_4_2 - 0.027089947089947*G0_1_1_5_4_3 - 0.027089947089947*G0_1_1_5_4_4 - 0.0609523809523806*G0_1_1_5_4_5 + 0.0152380952380951*G0_1_1_5_5_0 - 0.0338624338624337*G0_1_1_5_5_1 + 0.0287830687830686*G0_1_1_5_5_2 - 0.0812698412698409*G0_1_1_5_5_3 - 0.0609523809523806*G0_1_1_5_5_4 - 0.325079365079363*G0_1_1_5_5_5; + A[22] = -A[34] - 0.0063492063492063*G0_0_0_0_0_0 + 0.00169312169312168*G0_0_0_0_0_1 - 0.000423280423280417*G0_0_0_0_0_2 - 0.00338624338624337*G0_0_0_0_0_3 - 0.0126984126984126*G0_0_0_0_0_4 - 0.00423280423280421*G0_0_0_0_0_5 + 0.00169312169312168*G0_0_0_0_1_0 - 0.00126984126984126*G0_0_0_0_1_2 - 0.00338624338624336*G0_0_0_0_1_3 - 0.00253968253968252*G0_0_0_0_1_4 - 0.000846560846560841*G0_0_0_0_1_5 - 0.000423280423280417*G0_0_0_0_2_0 - 0.00126984126984126*G0_0_0_0_2_1 + 0.00846560846560839*G0_0_0_0_2_2 + 0.00507936507936504*G0_0_0_0_2_3 + 0.0118518518518518*G0_0_0_0_2_4 + 0.00169312169312169*G0_0_0_0_2_5 - 0.00338624338624337*G0_0_0_0_3_0 - 0.00338624338624336*G0_0_0_0_3_1 + 0.00507936507936504*G0_0_0_0_3_2 + 0.0118518518518518*G0_0_0_0_3_3 + 0.0118518518518518*G0_0_0_0_3_4 + 0.00338624338624337*G0_0_0_0_3_5 - 0.0126984126984126*G0_0_0_0_4_0 - 0.00253968253968252*G0_0_0_0_4_1 + 0.0118518518518518*G0_0_0_0_4_2 + 0.0118518518518518*G0_0_0_0_4_3 + 0.0152380952380951*G0_0_0_0_4_4 + 0.00169312169312168*G0_0_0_0_4_5 - 0.00423280423280421*G0_0_0_0_5_0 - 0.00084656084656084*G0_0_0_0_5_1 + 0.00169312169312169*G0_0_0_0_5_2 + 0.00338624338624337*G0_0_0_0_5_3 + 0.00169312169312168*G0_0_0_0_5_4 - 0.00169312169312167*G0_0_0_0_5_5 + 0.00169312169312168*G0_0_0_1_0_0 - 0.00126984126984126*G0_0_0_1_0_2 - 0.00338624338624336*G0_0_0_1_0_3 - 0.00253968253968252*G0_0_0_1_0_4 - 0.000846560846560841*G0_0_0_1_0_5 + 0.00634920634920629*G0_0_0_1_1_1 - 0.0021164021164021*G0_0_0_1_1_2 - 0.00423280423280421*G0_0_0_1_1_4 - 0.00126984126984126*G0_0_0_1_2_0 - 0.0021164021164021*G0_0_0_1_2_1 + 0.0084656084656084*G0_0_0_1_2_2 + 0.00507936507936504*G0_0_0_1_2_3 + 0.00338624338624336*G0_0_0_1_2_4 - 0.00084656084656084*G0_0_0_1_2_5 - 0.00338624338624336*G0_0_0_1_3_0 + 0.00507936507936504*G0_0_0_1_3_2 + 0.0253968253968253*G0_0_0_1_3_3 + 0.0152380952380952*G0_0_0_1_3_4 + 0.00846560846560842*G0_0_0_1_3_5 - 0.00253968253968252*G0_0_0_1_4_0 - 0.00423280423280421*G0_0_0_1_4_1 + 0.00338624338624336*G0_0_0_1_4_2 + 0.0152380952380952*G0_0_0_1_4_3 + 0.0287830687830686*G0_0_0_1_4_4 + 0.0101587301587301*G0_0_0_1_4_5 - 0.00084656084656084*G0_0_0_1_5_0 - 0.00084656084656084*G0_0_0_1_5_2 + 0.00846560846560842*G0_0_0_1_5_3 + 0.0101587301587301*G0_0_0_1_5_4 + 0.00846560846560841*G0_0_0_1_5_5 - 0.000423280423280417*G0_0_0_2_0_0 - 0.00126984126984126*G0_0_0_2_0_1 + 0.00846560846560839*G0_0_0_2_0_2 + 0.00507936507936504*G0_0_0_2_0_3 + 0.0118518518518518*G0_0_0_2_0_4 + 0.00169312169312169*G0_0_0_2_0_5 - 0.00126984126984126*G0_0_0_2_1_0 - 0.0021164021164021*G0_0_0_2_1_1 + 0.0084656084656084*G0_0_0_2_1_2 + 0.00507936507936504*G0_0_0_2_1_3 + 0.00338624338624336*G0_0_0_2_1_4 - 0.00084656084656084*G0_0_0_2_1_5 + 0.00846560846560839*G0_0_0_2_2_0 + 0.0084656084656084*G0_0_0_2_2_1 - 0.0888888888888883*G0_0_0_2_2_2 - 0.0338624338624336*G0_0_0_2_2_3 - 0.042328042328042*G0_0_0_2_2_4 - 0.00423280423280423*G0_0_0_2_2_5 + 0.00507936507936504*G0_0_0_2_3_0 + 0.00507936507936504*G0_0_0_2_3_1 - 0.0338624338624336*G0_0_0_2_3_2 - 0.0338624338624336*G0_0_0_2_3_3 - 0.0169312169312168*G0_0_0_2_3_4 - 0.0016931216931217*G0_0_0_2_3_5 + 0.0118518518518518*G0_0_0_2_4_0 + 0.00338624338624336*G0_0_0_2_4_1 - 0.042328042328042*G0_0_0_2_4_2 - 0.0169312169312168*G0_0_0_2_4_3 - 0.0338624338624336*G0_0_0_2_4_4 + 0.00169312169312168*G0_0_0_2_4_5 + 0.00169312169312169*G0_0_0_2_5_0 - 0.00084656084656084*G0_0_0_2_5_1 - 0.00423280423280423*G0_0_0_2_5_2 - 0.0016931216931217*G0_0_0_2_5_3 + 0.00169312169312168*G0_0_0_2_5_4 + 0.00338624338624337*G0_0_0_2_5_5 - 0.00338624338624337*G0_0_0_3_0_0 - 0.00338624338624336*G0_0_0_3_0_1 + 0.00507936507936504*G0_0_0_3_0_2 + 0.0118518518518518*G0_0_0_3_0_3 + 0.0118518518518518*G0_0_0_3_0_4 + 0.00338624338624337*G0_0_0_3_0_5 - 0.00338624338624336*G0_0_0_3_1_0 + 0.00507936507936504*G0_0_0_3_1_2 + 0.0253968253968253*G0_0_0_3_1_3 + 0.0152380952380952*G0_0_0_3_1_4 + 0.00846560846560842*G0_0_0_3_1_5 + 0.00507936507936504*G0_0_0_3_2_0 + 0.00507936507936504*G0_0_0_3_2_1 - 0.0338624338624336*G0_0_0_3_2_2 - 0.0338624338624336*G0_0_0_3_2_3 - 0.0169312169312168*G0_0_0_3_2_4 - 0.0016931216931217*G0_0_0_3_2_5 + 0.0118518518518518*G0_0_0_3_3_0 + 0.0253968253968253*G0_0_0_3_3_1 - 0.0338624338624336*G0_0_0_3_3_2 - 0.0812698412698408*G0_0_0_3_3_3 - 0.0541798941798939*G0_0_0_3_3_4 - 0.0203174603174602*G0_0_0_3_3_5 + 0.0118518518518518*G0_0_0_3_4_0 + 0.0152380952380952*G0_0_0_3_4_1 - 0.0169312169312168*G0_0_0_3_4_2 - 0.0541798941798939*G0_0_0_3_4_3 - 0.0812698412698408*G0_0_0_3_4_4 - 0.027089947089947*G0_0_0_3_4_5 + 0.00338624338624337*G0_0_0_3_5_0 + 0.00846560846560843*G0_0_0_3_5_1 - 0.0016931216931217*G0_0_0_3_5_2 - 0.0203174603174602*G0_0_0_3_5_3 - 0.027089947089947*G0_0_0_3_5_4 - 0.0135449735449735*G0_0_0_3_5_5 - 0.0126984126984126*G0_0_0_4_0_0 - 0.00253968253968252*G0_0_0_4_0_1 + 0.0118518518518518*G0_0_0_4_0_2 + 0.0118518518518518*G0_0_0_4_0_3 + 0.0152380952380951*G0_0_0_4_0_4 + 0.00169312169312168*G0_0_0_4_0_5 - 0.00253968253968252*G0_0_0_4_1_0 - 0.00423280423280421*G0_0_0_4_1_1 + 0.00338624338624336*G0_0_0_4_1_2 + 0.0152380952380952*G0_0_0_4_1_3 + 0.0287830687830686*G0_0_0_4_1_4 + 0.0101587301587301*G0_0_0_4_1_5 + 0.0118518518518518*G0_0_0_4_2_0 + 0.00338624338624336*G0_0_0_4_2_1 - 0.042328042328042*G0_0_0_4_2_2 - 0.0169312169312168*G0_0_0_4_2_3 - 0.0338624338624337*G0_0_0_4_2_4 + 0.00169312169312168*G0_0_0_4_2_5 + 0.0118518518518518*G0_0_0_4_3_0 + 0.0152380952380952*G0_0_0_4_3_1 - 0.0169312169312168*G0_0_0_4_3_2 - 0.0541798941798939*G0_0_0_4_3_3 - 0.0812698412698408*G0_0_0_4_3_4 - 0.027089947089947*G0_0_0_4_3_5 + 0.0152380952380951*G0_0_0_4_4_0 + 0.0287830687830686*G0_0_0_4_4_1 - 0.0338624338624336*G0_0_0_4_4_2 - 0.0812698412698408*G0_0_0_4_4_3 - 0.325079365079363*G0_0_0_4_4_4 - 0.0609523809523807*G0_0_0_4_4_5 + 0.00169312169312168*G0_0_0_4_5_0 + 0.0101587301587301*G0_0_0_4_5_1 + 0.00169312169312168*G0_0_0_4_5_2 - 0.027089947089947*G0_0_0_4_5_3 - 0.0609523809523807*G0_0_0_4_5_4 - 0.027089947089947*G0_0_0_4_5_5 - 0.00423280423280421*G0_0_0_5_0_0 - 0.00084656084656084*G0_0_0_5_0_1 + 0.00169312169312169*G0_0_0_5_0_2 + 0.00338624338624337*G0_0_0_5_0_3 + 0.00169312169312168*G0_0_0_5_0_4 - 0.00169312169312167*G0_0_0_5_0_5 - 0.00084656084656084*G0_0_0_5_1_0 - 0.00084656084656084*G0_0_0_5_1_2 + 0.00846560846560843*G0_0_0_5_1_3 + 0.0101587301587301*G0_0_0_5_1_4 + 0.00846560846560841*G0_0_0_5_1_5 + 0.00169312169312169*G0_0_0_5_2_0 - 0.00084656084656084*G0_0_0_5_2_1 - 0.00423280423280423*G0_0_0_5_2_2 - 0.0016931216931217*G0_0_0_5_2_3 + 0.00169312169312168*G0_0_0_5_2_4 + 0.00338624338624337*G0_0_0_5_2_5 + 0.00338624338624337*G0_0_0_5_3_0 + 0.00846560846560842*G0_0_0_5_3_1 - 0.0016931216931217*G0_0_0_5_3_2 - 0.0203174603174602*G0_0_0_5_3_3 - 0.027089947089947*G0_0_0_5_3_4 - 0.0135449735449735*G0_0_0_5_3_5 + 0.00169312169312168*G0_0_0_5_4_0 + 0.0101587301587301*G0_0_0_5_4_1 + 0.00169312169312168*G0_0_0_5_4_2 - 0.027089947089947*G0_0_0_5_4_3 - 0.0609523809523807*G0_0_0_5_4_4 - 0.027089947089947*G0_0_0_5_4_5 - 0.00169312169312167*G0_0_0_5_5_0 + 0.00846560846560841*G0_0_0_5_5_1 + 0.00338624338624337*G0_0_0_5_5_2 - 0.0135449735449735*G0_0_0_5_5_3 - 0.027089947089947*G0_0_0_5_5_4 - 0.0203174603174602*G0_0_0_5_5_5 + 0.0825396825396821*G0_0_1_0_0_0 - 0.00677248677248674*G0_0_1_0_0_1 - 0.00888888888888884*G0_0_1_0_0_2 + 0.000846560846560853*G0_0_1_0_0_3 + 0.0296296296296295*G0_0_1_0_0_4 + 0.0296296296296295*G0_0_1_0_0_5 - 0.00677248677248674*G0_0_1_0_1_0 + 0.00211640211640211*G0_0_1_0_1_1 - 0.00253968253968252*G0_0_1_0_1_3 - 0.0059259259259259*G0_0_1_0_1_4 - 0.00592592592592589*G0_0_1_0_1_5 - 0.00888888888888884*G0_0_1_0_2_0 + 0.00888888888888882*G0_0_1_0_2_2 + 0.00338624338624336*G0_0_1_0_2_3 - 0.00338624338624337*G0_0_1_0_2_5 + 0.000846560846560852*G0_0_1_0_3_0 - 0.00253968253968252*G0_0_1_0_3_1 + 0.00338624338624336*G0_0_1_0_3_2 + 0.00846560846560842*G0_0_1_0_3_3 + 0.0101587301587301*G0_0_1_0_3_4 + 0.00507936507936506*G0_0_1_0_3_5 + 0.0296296296296295*G0_0_1_0_4_0 - 0.0059259259259259*G0_0_1_0_4_1 + 0.0101587301587301*G0_0_1_0_4_3 + 0.0491005291005289*G0_0_1_0_4_4 + 0.0186243386243385*G0_0_1_0_4_5 + 0.0296296296296295*G0_0_1_0_5_0 - 0.00592592592592589*G0_0_1_0_5_1 - 0.00338624338624337*G0_0_1_0_5_2 + 0.00507936507936506*G0_0_1_0_5_3 + 0.0186243386243385*G0_0_1_0_5_4 + 0.032169312169312*G0_0_1_0_5_5 - 0.00677248677248674*G0_0_1_1_0_0 + 0.00211640211640211*G0_0_1_1_0_1 - 0.00253968253968252*G0_0_1_1_0_3 - 0.0059259259259259*G0_0_1_1_0_4 - 0.00592592592592589*G0_0_1_1_0_5 + 0.00211640211640211*G0_0_1_1_1_0 - 0.0021164021164021*G0_0_1_1_1_2 - 0.0021164021164021*G0_0_1_1_2_1 + 0.00677248677248672*G0_0_1_1_2_2 + 0.00592592592592589*G0_0_1_1_2_3 + 0.00592592592592589*G0_0_1_1_2_4 + 0.00253968253968253*G0_0_1_1_2_5 - 0.00253968253968252*G0_0_1_1_3_0 + 0.00592592592592589*G0_0_1_1_3_2 + 0.0169312169312168*G0_0_1_1_3_3 + 0.00507936507936505*G0_0_1_1_3_4 - 0.0059259259259259*G0_0_1_1_4_0 + 0.00592592592592589*G0_0_1_1_4_2 + 0.00507936507936505*G0_0_1_1_4_3 - 0.00507936507936506*G0_0_1_1_4_5 - 0.00592592592592589*G0_0_1_1_5_0 + 0.00253968253968253*G0_0_1_1_5_2 - 0.00507936507936506*G0_0_1_1_5_4 - 0.0169312169312168*G0_0_1_1_5_5 - 0.00888888888888884*G0_0_1_2_0_0 + 0.00888888888888882*G0_0_1_2_0_2 + 0.00338624338624336*G0_0_1_2_0_3 - 0.00338624338624337*G0_0_1_2_0_5 - 0.0021164021164021*G0_0_1_2_1_1 + 0.00677248677248672*G0_0_1_2_1_2 + 0.00592592592592589*G0_0_1_2_1_3 + 0.00592592592592589*G0_0_1_2_1_4 + 0.00253968253968253*G0_0_1_2_1_5 + 0.00888888888888882*G0_0_1_2_2_0 + 0.00677248677248672*G0_0_1_2_2_1 - 0.082539682539682*G0_0_1_2_2_2 - 0.0296296296296294*G0_0_1_2_2_3 - 0.0296296296296294*G0_0_1_2_2_4 - 0.000846560846560857*G0_0_1_2_2_5 + 0.00338624338624336*G0_0_1_2_3_0 + 0.00592592592592589*G0_0_1_2_3_1 - 0.0296296296296294*G0_0_1_2_3_2 - 0.032169312169312*G0_0_1_2_3_3 - 0.0186243386243385*G0_0_1_2_3_4 - 0.00507936507936506*G0_0_1_2_3_5 + 0.00592592592592589*G0_0_1_2_4_1 - 0.0296296296296294*G0_0_1_2_4_2 - 0.0186243386243385*G0_0_1_2_4_3 - 0.0491005291005288*G0_0_1_2_4_4 - 0.0101587301587301*G0_0_1_2_4_5 - 0.00338624338624337*G0_0_1_2_5_0 + 0.00253968253968253*G0_0_1_2_5_1 - 0.000846560846560857*G0_0_1_2_5_2 - 0.00507936507936506*G0_0_1_2_5_3 - 0.0101587301587301*G0_0_1_2_5_4 - 0.00846560846560842*G0_0_1_2_5_5 + 0.000846560846560853*G0_0_1_3_0_0 - 0.00253968253968252*G0_0_1_3_0_1 + 0.00338624338624336*G0_0_1_3_0_2 + 0.00846560846560841*G0_0_1_3_0_3 + 0.0101587301587301*G0_0_1_3_0_4 + 0.00507936507936506*G0_0_1_3_0_5 - 0.00253968253968252*G0_0_1_3_1_0 + 0.00592592592592589*G0_0_1_3_1_2 + 0.0169312169312168*G0_0_1_3_1_3 + 0.00507936507936505*G0_0_1_3_1_4 + 0.00338624338624336*G0_0_1_3_2_0 + 0.00592592592592589*G0_0_1_3_2_1 - 0.0296296296296294*G0_0_1_3_2_2 - 0.032169312169312*G0_0_1_3_2_3 - 0.0186243386243385*G0_0_1_3_2_4 - 0.00507936507936506*G0_0_1_3_2_5 + 0.00846560846560841*G0_0_1_3_3_0 + 0.0169312169312168*G0_0_1_3_3_1 - 0.032169312169312*G0_0_1_3_3_2 - 0.0609523809523806*G0_0_1_3_3_3 - 0.027089947089947*G0_0_1_3_3_4 - 0.00677248677248675*G0_0_1_3_3_5 + 0.0101587301587301*G0_0_1_3_4_0 + 0.00507936507936505*G0_0_1_3_4_1 - 0.0186243386243385*G0_0_1_3_4_2 - 0.027089947089947*G0_0_1_3_4_3 - 0.0203174603174602*G0_0_1_3_4_4 + 0.00507936507936506*G0_0_1_3_5_0 - 0.00507936507936506*G0_0_1_3_5_2 - 0.00677248677248675*G0_0_1_3_5_3 + 0.00677248677248673*G0_0_1_3_5_5 + 0.0296296296296295*G0_0_1_4_0_0 - 0.0059259259259259*G0_0_1_4_0_1 + 0.0101587301587301*G0_0_1_4_0_3 + 0.0491005291005289*G0_0_1_4_0_4 + 0.0186243386243385*G0_0_1_4_0_5 - 0.0059259259259259*G0_0_1_4_1_0 + 0.00592592592592589*G0_0_1_4_1_2 + 0.00507936507936505*G0_0_1_4_1_3 - 0.00507936507936505*G0_0_1_4_1_5 + 0.00592592592592589*G0_0_1_4_2_1 - 0.0296296296296294*G0_0_1_4_2_2 - 0.0186243386243385*G0_0_1_4_2_3 - 0.0491005291005288*G0_0_1_4_2_4 - 0.0101587301587301*G0_0_1_4_2_5 + 0.0101587301587301*G0_0_1_4_3_0 + 0.00507936507936505*G0_0_1_4_3_1 - 0.0186243386243385*G0_0_1_4_3_2 - 0.027089947089947*G0_0_1_4_3_3 - 0.0203174603174602*G0_0_1_4_3_4 + 0.0491005291005289*G0_0_1_4_4_0 - 0.0491005291005288*G0_0_1_4_4_2 - 0.0203174603174602*G0_0_1_4_4_3 + 0.0203174603174602*G0_0_1_4_4_5 + 0.0186243386243385*G0_0_1_4_5_0 - 0.00507936507936505*G0_0_1_4_5_1 - 0.0101587301587301*G0_0_1_4_5_2 + 0.0203174603174602*G0_0_1_4_5_4 + 0.027089947089947*G0_0_1_4_5_5 + 0.0296296296296295*G0_0_1_5_0_0 - 0.00592592592592589*G0_0_1_5_0_1 - 0.00338624338624337*G0_0_1_5_0_2 + 0.00507936507936506*G0_0_1_5_0_3 + 0.0186243386243385*G0_0_1_5_0_4 + 0.032169312169312*G0_0_1_5_0_5 - 0.00592592592592589*G0_0_1_5_1_0 + 0.00253968253968253*G0_0_1_5_1_2 - 0.00507936507936506*G0_0_1_5_1_4 - 0.0169312169312168*G0_0_1_5_1_5 - 0.00338624338624337*G0_0_1_5_2_0 + 0.00253968253968253*G0_0_1_5_2_1 - 0.000846560846560858*G0_0_1_5_2_2 - 0.00507936507936506*G0_0_1_5_2_3 - 0.0101587301587301*G0_0_1_5_2_4 - 0.00846560846560842*G0_0_1_5_2_5 + 0.00507936507936506*G0_0_1_5_3_0 - 0.00507936507936506*G0_0_1_5_3_2 - 0.00677248677248675*G0_0_1_5_3_3 + 0.00677248677248673*G0_0_1_5_3_5 + 0.0186243386243385*G0_0_1_5_4_0 - 0.00507936507936505*G0_0_1_5_4_1 - 0.0101587301587301*G0_0_1_5_4_2 + 0.0203174603174602*G0_0_1_5_4_4 + 0.027089947089947*G0_0_1_5_4_5 + 0.032169312169312*G0_0_1_5_5_0 - 0.0169312169312168*G0_0_1_5_5_1 - 0.00846560846560842*G0_0_1_5_5_2 + 0.00677248677248673*G0_0_1_5_5_3 + 0.027089947089947*G0_0_1_5_5_4 + 0.0609523809523805*G0_0_1_5_5_5; + A[28] = -A[22] - 0.00634920634920629*G0_1_0_0_0_0 + 0.000423280423280421*G0_1_0_0_0_1 + 0.00253968253968252*G0_1_0_0_0_2 - 0.000846560846560841*G0_1_0_0_0_3 - 0.00423280423280421*G0_1_0_0_0_4 - 0.0042328042328042*G0_1_0_0_0_5 + 0.000423280423280421*G0_1_0_0_1_0 + 0.000423280423280417*G0_1_0_0_1_1 + 0.000423280423280419*G0_1_0_0_1_2 + 0.00169312169312168*G0_1_0_0_1_3 + 0.00169312169312168*G0_1_0_0_1_4 + 0.00169312169312168*G0_1_0_0_1_5 + 0.00253968253968252*G0_1_0_0_2_0 + 0.000423280423280419*G0_1_0_0_2_1 - 0.0063492063492063*G0_1_0_0_2_2 - 0.0042328042328042*G0_1_0_0_2_3 - 0.0042328042328042*G0_1_0_0_2_4 - 0.000846560846560843*G0_1_0_0_2_5 - 0.000846560846560841*G0_1_0_0_3_0 + 0.00169312169312168*G0_1_0_0_3_1 - 0.0042328042328042*G0_1_0_0_3_2 + 0.00169312169312168*G0_1_0_0_3_3 - 0.00169312169312168*G0_1_0_0_3_4 + 0.00338624338624337*G0_1_0_0_3_5 - 0.00423280423280421*G0_1_0_0_4_0 + 0.00169312169312168*G0_1_0_0_4_1 - 0.0042328042328042*G0_1_0_0_4_2 - 0.00169312169312168*G0_1_0_0_4_3 - 0.0152380952380952*G0_1_0_0_4_4 - 0.00169312169312169*G0_1_0_0_4_5 - 0.0042328042328042*G0_1_0_0_5_0 + 0.00169312169312168*G0_1_0_0_5_1 - 0.000846560846560843*G0_1_0_0_5_2 + 0.00338624338624337*G0_1_0_0_5_3 - 0.00169312169312169*G0_1_0_0_5_4 + 0.00169312169312169*G0_1_0_0_5_5 + 0.000423280423280421*G0_1_0_1_0_0 + 0.000423280423280417*G0_1_0_1_0_1 + 0.000423280423280419*G0_1_0_1_0_2 + 0.00169312169312168*G0_1_0_1_0_3 + 0.00169312169312168*G0_1_0_1_0_4 + 0.00169312169312168*G0_1_0_1_0_5 + 0.000423280423280417*G0_1_0_1_1_0 - 0.00634920634920628*G0_1_0_1_1_1 + 0.00253968253968252*G0_1_0_1_1_2 - 0.00423280423280421*G0_1_0_1_1_3 - 0.000846560846560842*G0_1_0_1_1_4 - 0.00423280423280419*G0_1_0_1_1_5 + 0.000423280423280419*G0_1_0_1_2_0 + 0.00253968253968252*G0_1_0_1_2_1 - 0.0063492063492063*G0_1_0_1_2_2 - 0.0042328042328042*G0_1_0_1_2_3 - 0.00423280423280421*G0_1_0_1_2_4 - 0.000846560846560845*G0_1_0_1_2_5 + 0.00169312169312168*G0_1_0_1_3_0 - 0.00423280423280421*G0_1_0_1_3_1 - 0.0042328042328042*G0_1_0_1_3_2 - 0.0152380952380952*G0_1_0_1_3_3 - 0.00169312169312168*G0_1_0_1_3_4 - 0.00169312169312168*G0_1_0_1_3_5 + 0.00169312169312168*G0_1_0_1_4_0 - 0.000846560846560842*G0_1_0_1_4_1 - 0.00423280423280421*G0_1_0_1_4_2 - 0.00169312169312168*G0_1_0_1_4_3 + 0.00169312169312169*G0_1_0_1_4_4 + 0.00338624338624337*G0_1_0_1_4_5 + 0.00169312169312168*G0_1_0_1_5_0 - 0.00423280423280419*G0_1_0_1_5_1 - 0.000846560846560845*G0_1_0_1_5_2 - 0.00169312169312168*G0_1_0_1_5_3 + 0.00338624338624337*G0_1_0_1_5_4 + 0.0016931216931217*G0_1_0_1_5_5 + 0.00253968253968252*G0_1_0_2_0_0 + 0.000423280423280419*G0_1_0_2_0_1 - 0.0063492063492063*G0_1_0_2_0_2 - 0.0042328042328042*G0_1_0_2_0_3 - 0.0042328042328042*G0_1_0_2_0_4 - 0.000846560846560843*G0_1_0_2_0_5 + 0.000423280423280419*G0_1_0_2_1_0 + 0.00253968253968252*G0_1_0_2_1_1 - 0.0063492063492063*G0_1_0_2_1_2 - 0.0042328042328042*G0_1_0_2_1_3 - 0.00423280423280421*G0_1_0_2_1_4 - 0.000846560846560845*G0_1_0_2_1_5 - 0.0063492063492063*G0_1_0_2_2_0 - 0.0063492063492063*G0_1_0_2_2_1 + 0.0761904761904757*G0_1_0_2_2_2 + 0.0253968253968252*G0_1_0_2_2_3 + 0.0253968253968252*G0_1_0_2_2_4 - 0.0042328042328042*G0_1_0_2_3_0 - 0.0042328042328042*G0_1_0_2_3_1 + 0.0253968253968252*G0_1_0_2_3_2 + 0.0338624338624337*G0_1_0_2_3_3 + 0.0169312169312168*G0_1_0_2_3_4 + 0.00846560846560843*G0_1_0_2_3_5 - 0.0042328042328042*G0_1_0_2_4_0 - 0.00423280423280421*G0_1_0_2_4_1 + 0.0253968253968252*G0_1_0_2_4_2 + 0.0169312169312168*G0_1_0_2_4_3 + 0.0338624338624337*G0_1_0_2_4_4 + 0.00846560846560843*G0_1_0_2_4_5 - 0.000846560846560843*G0_1_0_2_5_0 - 0.000846560846560845*G0_1_0_2_5_1 + 0.00846560846560843*G0_1_0_2_5_3 + 0.00846560846560843*G0_1_0_2_5_4 + 0.0101587301587301*G0_1_0_2_5_5 - 0.000846560846560841*G0_1_0_3_0_0 + 0.00169312169312168*G0_1_0_3_0_1 - 0.0042328042328042*G0_1_0_3_0_2 + 0.00169312169312169*G0_1_0_3_0_3 - 0.00169312169312168*G0_1_0_3_0_4 + 0.00338624338624337*G0_1_0_3_0_5 + 0.00169312169312168*G0_1_0_3_1_0 - 0.00423280423280421*G0_1_0_3_1_1 - 0.0042328042328042*G0_1_0_3_1_2 - 0.0152380952380952*G0_1_0_3_1_3 - 0.00169312169312168*G0_1_0_3_1_4 - 0.00169312169312168*G0_1_0_3_1_5 - 0.0042328042328042*G0_1_0_3_2_0 - 0.0042328042328042*G0_1_0_3_2_1 + 0.0253968253968252*G0_1_0_3_2_2 + 0.0338624338624337*G0_1_0_3_2_3 + 0.0169312169312168*G0_1_0_3_2_4 + 0.00846560846560843*G0_1_0_3_2_5 + 0.00169312169312169*G0_1_0_3_3_0 - 0.0152380952380952*G0_1_0_3_3_1 + 0.0338624338624337*G0_1_0_3_3_2 - 0.0203174603174602*G0_1_0_3_3_5 - 0.00169312169312168*G0_1_0_3_4_0 - 0.00169312169312168*G0_1_0_3_4_1 + 0.0169312169312168*G0_1_0_3_4_2 - 0.0135449735449735*G0_1_0_3_4_5 + 0.00338624338624337*G0_1_0_3_5_0 - 0.00169312169312168*G0_1_0_3_5_1 + 0.00846560846560843*G0_1_0_3_5_2 - 0.0203174603174602*G0_1_0_3_5_3 - 0.0135449735449735*G0_1_0_3_5_4 - 0.027089947089947*G0_1_0_3_5_5 - 0.00423280423280421*G0_1_0_4_0_0 + 0.00169312169312168*G0_1_0_4_0_1 - 0.0042328042328042*G0_1_0_4_0_2 - 0.00169312169312168*G0_1_0_4_0_3 - 0.0152380952380952*G0_1_0_4_0_4 - 0.00169312169312169*G0_1_0_4_0_5 + 0.00169312169312168*G0_1_0_4_1_0 - 0.000846560846560842*G0_1_0_4_1_1 - 0.00423280423280421*G0_1_0_4_1_2 - 0.00169312169312168*G0_1_0_4_1_3 + 0.00169312169312169*G0_1_0_4_1_4 + 0.00338624338624337*G0_1_0_4_1_5 - 0.0042328042328042*G0_1_0_4_2_0 - 0.00423280423280421*G0_1_0_4_2_1 + 0.0253968253968252*G0_1_0_4_2_2 + 0.0169312169312168*G0_1_0_4_2_3 + 0.0338624338624337*G0_1_0_4_2_4 + 0.00846560846560843*G0_1_0_4_2_5 - 0.00169312169312168*G0_1_0_4_3_0 - 0.00169312169312168*G0_1_0_4_3_1 + 0.0169312169312168*G0_1_0_4_3_2 - 0.0135449735449735*G0_1_0_4_3_5 - 0.0152380952380952*G0_1_0_4_4_0 + 0.00169312169312169*G0_1_0_4_4_1 + 0.0338624338624337*G0_1_0_4_4_2 - 0.0203174603174602*G0_1_0_4_4_5 - 0.00169312169312169*G0_1_0_4_5_0 + 0.00338624338624337*G0_1_0_4_5_1 + 0.00846560846560843*G0_1_0_4_5_2 - 0.0135449735449735*G0_1_0_4_5_3 - 0.0203174603174602*G0_1_0_4_5_4 - 0.0270899470899469*G0_1_0_4_5_5 - 0.0042328042328042*G0_1_0_5_0_0 + 0.00169312169312168*G0_1_0_5_0_1 - 0.000846560846560843*G0_1_0_5_0_2 + 0.00338624338624337*G0_1_0_5_0_3 - 0.00169312169312169*G0_1_0_5_0_4 + 0.00169312169312169*G0_1_0_5_0_5 + 0.00169312169312168*G0_1_0_5_1_0 - 0.00423280423280419*G0_1_0_5_1_1 - 0.000846560846560845*G0_1_0_5_1_2 - 0.00169312169312168*G0_1_0_5_1_3 + 0.00338624338624337*G0_1_0_5_1_4 + 0.0016931216931217*G0_1_0_5_1_5 - 0.000846560846560843*G0_1_0_5_2_0 - 0.000846560846560845*G0_1_0_5_2_1 + 0.00846560846560843*G0_1_0_5_2_3 + 0.00846560846560843*G0_1_0_5_2_4 + 0.0101587301587301*G0_1_0_5_2_5 + 0.00338624338624337*G0_1_0_5_3_0 - 0.00169312169312168*G0_1_0_5_3_1 + 0.00846560846560843*G0_1_0_5_3_2 - 0.0203174603174602*G0_1_0_5_3_3 - 0.0135449735449735*G0_1_0_5_3_4 - 0.027089947089947*G0_1_0_5_3_5 - 0.00169312169312169*G0_1_0_5_4_0 + 0.00338624338624337*G0_1_0_5_4_1 + 0.00846560846560843*G0_1_0_5_4_2 - 0.0135449735449735*G0_1_0_5_4_3 - 0.0203174603174602*G0_1_0_5_4_4 - 0.0270899470899469*G0_1_0_5_4_5 + 0.00169312169312169*G0_1_0_5_5_0 + 0.0016931216931217*G0_1_0_5_5_1 + 0.0101587301587301*G0_1_0_5_5_2 - 0.027089947089947*G0_1_0_5_5_3 - 0.0270899470899469*G0_1_0_5_5_4 - 0.0609523809523805*G0_1_0_5_5_5 + 0.0825396825396821*G0_1_1_0_0_0 - 0.008042328042328*G0_1_1_0_0_1 - 0.0059259259259259*G0_1_1_0_0_2 + 0.00338624338624337*G0_1_1_0_0_3 + 0.0296296296296295*G0_1_1_0_0_4 + 0.0380952380952379*G0_1_1_0_0_5 - 0.00804232804232799*G0_1_1_0_1_0 + 0.000846560846560839*G0_1_1_0_1_1 + 0.00169312169312168*G0_1_1_0_1_2 - 0.00338624338624337*G0_1_1_0_1_4 - 0.0101587301587301*G0_1_1_0_1_5 - 0.0059259259259259*G0_1_1_0_2_0 + 0.00169312169312168*G0_1_1_0_2_1 - 0.00423280423280419*G0_1_1_0_2_2 - 0.00338624338624336*G0_1_1_0_2_3 - 0.00931216931216926*G0_1_1_0_2_4 - 0.00423280423280421*G0_1_1_0_2_5 + 0.00338624338624337*G0_1_1_0_3_0 - 0.00338624338624336*G0_1_1_0_3_2 - 0.00169312169312168*G0_1_1_0_3_3 + 0.00169312169312168*G0_1_1_0_3_5 + 0.0296296296296295*G0_1_1_0_4_0 - 0.00338624338624337*G0_1_1_0_4_1 - 0.00931216931216926*G0_1_1_0_4_2 + 0.0186243386243385*G0_1_1_0_4_4 + 0.0152380952380952*G0_1_1_0_4_5 + 0.0380952380952379*G0_1_1_0_5_0 - 0.0101587301587301*G0_1_1_0_5_1 - 0.00423280423280421*G0_1_1_0_5_2 + 0.00169312169312168*G0_1_1_0_5_3 + 0.0152380952380952*G0_1_1_0_5_4 + 0.0355555555555553*G0_1_1_0_5_5 - 0.008042328042328*G0_1_1_1_0_0 + 0.00084656084656084*G0_1_1_1_0_1 + 0.00169312169312168*G0_1_1_1_0_2 - 0.00338624338624337*G0_1_1_1_0_4 - 0.0101587301587301*G0_1_1_1_0_5 + 0.00084656084656084*G0_1_1_1_1_0 + 0.000846560846560838*G0_1_1_1_1_2 + 0.00253968253968253*G0_1_1_1_1_4 + 0.00846560846560843*G0_1_1_1_1_5 + 0.00169312169312168*G0_1_1_1_2_0 + 0.000846560846560839*G0_1_1_1_2_1 - 0.00634920634920631*G0_1_1_1_2_2 - 0.00338624338624336*G0_1_1_1_2_3 - 0.000846560846560837*G0_1_1_1_2_4 + 0.00169312169312168*G0_1_1_1_2_5 - 0.00338624338624336*G0_1_1_1_3_2 - 0.0135449735449735*G0_1_1_1_3_3 - 0.00507936507936506*G0_1_1_1_3_4 - 0.00338624338624337*G0_1_1_1_3_5 - 0.00338624338624337*G0_1_1_1_4_0 + 0.00253968253968253*G0_1_1_1_4_1 - 0.000846560846560836*G0_1_1_1_4_2 - 0.00507936507936505*G0_1_1_1_4_3 - 0.0101587301587301*G0_1_1_1_4_4 - 0.00846560846560842*G0_1_1_1_4_5 - 0.0101587301587301*G0_1_1_1_5_0 + 0.00846560846560843*G0_1_1_1_5_1 + 0.00169312169312168*G0_1_1_1_5_2 - 0.00338624338624337*G0_1_1_1_5_3 - 0.00846560846560842*G0_1_1_1_5_4 - 0.0135449735449734*G0_1_1_1_5_5 - 0.0059259259259259*G0_1_1_2_0_0 + 0.00169312169312168*G0_1_1_2_0_1 - 0.00423280423280419*G0_1_1_2_0_2 - 0.00338624338624336*G0_1_1_2_0_3 - 0.00931216931216926*G0_1_1_2_0_4 - 0.00423280423280421*G0_1_1_2_0_5 + 0.00169312169312168*G0_1_1_2_1_0 + 0.000846560846560839*G0_1_1_2_1_1 - 0.00634920634920631*G0_1_1_2_1_2 - 0.00338624338624336*G0_1_1_2_1_3 - 0.000846560846560836*G0_1_1_2_1_4 + 0.00169312169312168*G0_1_1_2_1_5 - 0.00423280423280419*G0_1_1_2_2_0 - 0.00634920634920631*G0_1_1_2_2_1 + 0.0698412698412695*G0_1_1_2_2_2 + 0.0253968253968252*G0_1_1_2_2_3 + 0.0253968253968252*G0_1_1_2_2_4 + 0.00423280423280423*G0_1_1_2_2_5 - 0.00338624338624336*G0_1_1_2_3_0 - 0.00338624338624336*G0_1_1_2_3_1 + 0.0253968253968252*G0_1_1_2_3_2 + 0.0253968253968252*G0_1_1_2_3_3 + 0.00846560846560841*G0_1_1_2_3_4 - 0.00169312169312168*G0_1_1_2_3_5 - 0.00931216931216926*G0_1_1_2_4_0 - 0.000846560846560837*G0_1_1_2_4_1 + 0.0253968253968252*G0_1_1_2_4_2 + 0.00846560846560841*G0_1_1_2_4_3 + 0.0084656084656084*G0_1_1_2_4_4 - 0.00677248677248674*G0_1_1_2_4_5 - 0.00423280423280421*G0_1_1_2_5_0 + 0.00169312169312168*G0_1_1_2_5_1 + 0.00423280423280423*G0_1_1_2_5_2 - 0.00169312169312168*G0_1_1_2_5_3 - 0.00677248677248674*G0_1_1_2_5_4 - 0.0186243386243385*G0_1_1_2_5_5 + 0.00338624338624337*G0_1_1_3_0_0 - 0.00338624338624336*G0_1_1_3_0_2 - 0.00169312169312168*G0_1_1_3_0_3 + 0.00169312169312168*G0_1_1_3_0_5 - 0.00338624338624336*G0_1_1_3_1_2 - 0.0135449735449735*G0_1_1_3_1_3 - 0.00507936507936505*G0_1_1_3_1_4 - 0.00338624338624337*G0_1_1_3_1_5 - 0.00338624338624336*G0_1_1_3_2_0 - 0.00338624338624336*G0_1_1_3_2_1 + 0.0253968253968252*G0_1_1_3_2_2 + 0.0253968253968252*G0_1_1_3_2_3 + 0.00846560846560841*G0_1_1_3_2_4 - 0.00169312169312168*G0_1_1_3_2_5 - 0.00169312169312168*G0_1_1_3_3_0 - 0.0135449735449735*G0_1_1_3_3_1 + 0.0253968253968252*G0_1_1_3_3_2 + 0.0203174603174602*G0_1_1_3_3_3 + 0.0135449735449735*G0_1_1_3_3_4 + 0.00677248677248675*G0_1_1_3_3_5 - 0.00507936507936505*G0_1_1_3_4_1 + 0.00846560846560841*G0_1_1_3_4_2 + 0.0135449735449735*G0_1_1_3_4_3 + 0.0203174603174602*G0_1_1_3_4_4 + 0.0135449735449735*G0_1_1_3_4_5 + 0.00169312169312168*G0_1_1_3_5_0 - 0.00338624338624337*G0_1_1_3_5_1 - 0.00169312169312168*G0_1_1_3_5_2 + 0.00677248677248675*G0_1_1_3_5_3 + 0.0135449735449735*G0_1_1_3_5_4 + 0.0338624338624337*G0_1_1_3_5_5 + 0.0296296296296295*G0_1_1_4_0_0 - 0.00338624338624337*G0_1_1_4_0_1 - 0.00931216931216926*G0_1_1_4_0_2 + 0.0186243386243385*G0_1_1_4_0_4 + 0.0152380952380952*G0_1_1_4_0_5 - 0.00338624338624337*G0_1_1_4_1_0 + 0.00253968253968253*G0_1_1_4_1_1 - 0.000846560846560836*G0_1_1_4_1_2 - 0.00507936507936505*G0_1_1_4_1_3 - 0.0101587301587301*G0_1_1_4_1_4 - 0.00846560846560842*G0_1_1_4_1_5 - 0.00931216931216926*G0_1_1_4_2_0 - 0.000846560846560836*G0_1_1_4_2_1 + 0.0253968253968252*G0_1_1_4_2_2 + 0.00846560846560841*G0_1_1_4_2_3 + 0.0084656084656084*G0_1_1_4_2_4 - 0.00677248677248674*G0_1_1_4_2_5 - 0.00507936507936505*G0_1_1_4_3_1 + 0.00846560846560841*G0_1_1_4_3_2 + 0.0135449735449735*G0_1_1_4_3_3 + 0.0203174603174602*G0_1_1_4_3_4 + 0.0135449735449735*G0_1_1_4_3_5 + 0.0186243386243385*G0_1_1_4_4_0 - 0.0101587301587301*G0_1_1_4_4_1 + 0.00846560846560839*G0_1_1_4_4_2 + 0.0203174603174602*G0_1_1_4_4_3 + 0.0812698412698409*G0_1_1_4_4_4 + 0.0338624338624337*G0_1_1_4_4_5 + 0.0152380952380952*G0_1_1_4_5_0 - 0.00846560846560842*G0_1_1_4_5_1 - 0.00677248677248674*G0_1_1_4_5_2 + 0.0135449735449735*G0_1_1_4_5_3 + 0.0338624338624337*G0_1_1_4_5_4 + 0.0541798941798939*G0_1_1_4_5_5 + 0.0380952380952379*G0_1_1_5_0_0 - 0.0101587301587301*G0_1_1_5_0_1 - 0.00423280423280421*G0_1_1_5_0_2 + 0.00169312169312168*G0_1_1_5_0_3 + 0.0152380952380952*G0_1_1_5_0_4 + 0.0355555555555553*G0_1_1_5_0_5 - 0.0101587301587301*G0_1_1_5_1_0 + 0.00846560846560843*G0_1_1_5_1_1 + 0.00169312169312168*G0_1_1_5_1_2 - 0.00338624338624337*G0_1_1_5_1_3 - 0.00846560846560842*G0_1_1_5_1_4 - 0.0135449735449734*G0_1_1_5_1_5 - 0.00423280423280421*G0_1_1_5_2_0 + 0.00169312169312168*G0_1_1_5_2_1 + 0.00423280423280423*G0_1_1_5_2_2 - 0.00169312169312168*G0_1_1_5_2_3 - 0.00677248677248674*G0_1_1_5_2_4 - 0.0186243386243385*G0_1_1_5_2_5 + 0.00169312169312168*G0_1_1_5_3_0 - 0.00338624338624337*G0_1_1_5_3_1 - 0.00169312169312168*G0_1_1_5_3_2 + 0.00677248677248675*G0_1_1_5_3_3 + 0.0135449735449735*G0_1_1_5_3_4 + 0.0338624338624337*G0_1_1_5_3_5 + 0.0152380952380952*G0_1_1_5_4_0 - 0.00846560846560842*G0_1_1_5_4_1 - 0.00677248677248674*G0_1_1_5_4_2 + 0.0135449735449735*G0_1_1_5_4_3 + 0.0338624338624337*G0_1_1_5_4_4 + 0.0541798941798939*G0_1_1_5_4_5 + 0.0355555555555553*G0_1_1_5_5_0 - 0.0135449735449734*G0_1_1_5_5_1 - 0.0186243386243385*G0_1_1_5_5_2 + 0.0338624338624337*G0_1_1_5_5_3 + 0.0541798941798939*G0_1_1_5_5_4 + 0.264126984126983*G0_1_1_5_5_5; + A[19] = -A[25] - 0.0190476190476189*G0_1_0_0_0_0 + 0.00253968253968252*G0_1_0_0_0_1 + 0.00148148148148148*G0_1_0_0_0_2 + 0.00126984126984126*G0_1_0_0_0_3 - 0.00634920634920632*G0_1_0_0_0_4 - 0.00211640211640211*G0_1_0_0_0_5 + 0.00253968253968252*G0_1_0_0_1_0 - 0.0063492063492063*G0_1_0_0_1_1 + 0.000740740740740735*G0_1_0_0_1_2 - 0.00296296296296294*G0_1_0_0_1_3 + 0.000423280423280423*G0_1_0_0_1_4 - 0.00550264550264546*G0_1_0_0_1_5 + 0.00148148148148148*G0_1_0_0_2_0 + 0.000740740740740735*G0_1_0_0_2_1 - 0.0021164021164021*G0_1_0_0_2_2 + 0.00126984126984126*G0_1_0_0_2_3 + 0.000846560846560844*G0_1_0_0_2_4 + 0.00253968253968253*G0_1_0_0_2_5 + 0.00126984126984126*G0_1_0_0_3_0 - 0.00296296296296294*G0_1_0_0_3_1 + 0.00126984126984126*G0_1_0_0_3_2 - 0.00761904761904757*G0_1_0_0_3_3 - 0.00338624338624337*G0_1_0_0_3_4 - 0.00761904761904758*G0_1_0_0_3_5 - 0.00634920634920632*G0_1_0_0_4_0 + 0.000423280423280423*G0_1_0_0_4_1 + 0.000846560846560844*G0_1_0_0_4_2 - 0.00338624338624337*G0_1_0_0_4_3 - 0.011005291005291*G0_1_0_0_4_4 - 0.0059259259259259*G0_1_0_0_4_5 - 0.00211640211640211*G0_1_0_0_5_0 - 0.00550264550264546*G0_1_0_0_5_1 + 0.00253968253968253*G0_1_0_0_5_2 - 0.00761904761904758*G0_1_0_0_5_3 - 0.0059259259259259*G0_1_0_0_5_4 - 0.0194708994708993*G0_1_0_0_5_5 + 0.00253968253968252*G0_1_0_1_0_0 - 0.0063492063492063*G0_1_0_1_0_1 + 0.000740740740740735*G0_1_0_1_0_2 - 0.00296296296296294*G0_1_0_1_0_3 + 0.000423280423280423*G0_1_0_1_0_4 - 0.00550264550264546*G0_1_0_1_0_5 - 0.0063492063492063*G0_1_0_1_1_0 + 0.0634920634920631*G0_1_0_1_1_1 - 0.00529100529100526*G0_1_0_1_1_2 + 0.0232804232804231*G0_1_0_1_1_3 + 0.00211640211640211*G0_1_0_1_1_4 + 0.0275132275132273*G0_1_0_1_1_5 + 0.000740740740740735*G0_1_0_1_2_0 - 0.00529100529100526*G0_1_0_1_2_1 - 0.00507936507936505*G0_1_0_1_2_3 - 0.00126984126984126*G0_1_0_1_2_4 - 0.00338624338624337*G0_1_0_1_2_5 - 0.00296296296296294*G0_1_0_1_3_0 + 0.0232804232804231*G0_1_0_1_3_1 - 0.00507936507936505*G0_1_0_1_3_2 + 0.0211640211640211*G0_1_0_1_3_3 + 0.00169312169312168*G0_1_0_1_3_4 + 0.0126984126984126*G0_1_0_1_3_5 + 0.000423280423280424*G0_1_0_1_4_0 + 0.00211640211640211*G0_1_0_1_4_1 - 0.00126984126984126*G0_1_0_1_4_2 + 0.00169312169312169*G0_1_0_1_4_3 + 0.000846560846560845*G0_1_0_1_4_4 + 0.00253968253968253*G0_1_0_1_4_5 - 0.00550264550264546*G0_1_0_1_5_0 + 0.0275132275132273*G0_1_0_1_5_1 - 0.00338624338624337*G0_1_0_1_5_2 + 0.0126984126984126*G0_1_0_1_5_3 + 0.00253968253968253*G0_1_0_1_5_4 + 0.0296296296296295*G0_1_0_1_5_5 + 0.00148148148148148*G0_1_0_2_0_0 + 0.000740740740740735*G0_1_0_2_0_1 - 0.0021164021164021*G0_1_0_2_0_2 + 0.00126984126984126*G0_1_0_2_0_3 + 0.000846560846560845*G0_1_0_2_0_4 + 0.00253968253968253*G0_1_0_2_0_5 + 0.000740740740740735*G0_1_0_2_1_0 - 0.00529100529100526*G0_1_0_2_1_1 - 0.00507936507936505*G0_1_0_2_1_3 - 0.00126984126984126*G0_1_0_2_1_4 - 0.00338624338624337*G0_1_0_2_1_5 - 0.0021164021164021*G0_1_0_2_2_0 + 0.0158730158730158*G0_1_0_2_2_2 + 0.00634920634920632*G0_1_0_2_2_3 + 0.00634920634920631*G0_1_0_2_2_4 + 0.00211640211640211*G0_1_0_2_2_5 + 0.00126984126984126*G0_1_0_2_3_0 - 0.00507936507936505*G0_1_0_2_3_1 + 0.00634920634920632*G0_1_0_2_3_2 - 0.00846560846560843*G0_1_0_2_3_3 - 0.00677248677248674*G0_1_0_2_3_5 + 0.000846560846560845*G0_1_0_2_4_0 - 0.00126984126984126*G0_1_0_2_4_1 + 0.00634920634920631*G0_1_0_2_4_2 + 0.00846560846560843*G0_1_0_2_4_4 - 0.00169312169312168*G0_1_0_2_4_5 + 0.00253968253968253*G0_1_0_2_5_0 - 0.00338624338624337*G0_1_0_2_5_1 + 0.00211640211640211*G0_1_0_2_5_2 - 0.00677248677248674*G0_1_0_2_5_3 - 0.00169312169312168*G0_1_0_2_5_4 - 0.0118518518518518*G0_1_0_2_5_5 + 0.00126984126984126*G0_1_0_3_0_0 - 0.00296296296296294*G0_1_0_3_0_1 + 0.00126984126984126*G0_1_0_3_0_2 - 0.00761904761904757*G0_1_0_3_0_3 - 0.00338624338624337*G0_1_0_3_0_4 - 0.00761904761904758*G0_1_0_3_0_5 - 0.00296296296296294*G0_1_0_3_1_0 + 0.0232804232804231*G0_1_0_3_1_1 - 0.00507936507936505*G0_1_0_3_1_2 + 0.0211640211640211*G0_1_0_3_1_3 + 0.00169312169312168*G0_1_0_3_1_4 + 0.0126984126984126*G0_1_0_3_1_5 + 0.00126984126984126*G0_1_0_3_2_0 - 0.00507936507936505*G0_1_0_3_2_1 + 0.00634920634920632*G0_1_0_3_2_2 - 0.00846560846560843*G0_1_0_3_2_3 - 0.00677248677248674*G0_1_0_3_2_5 - 0.00761904761904757*G0_1_0_3_3_0 + 0.0211640211640211*G0_1_0_3_3_1 - 0.00846560846560843*G0_1_0_3_3_2 + 0.0558730158730156*G0_1_0_3_3_3 + 0.0118518518518518*G0_1_0_3_3_4 + 0.0287830687830687*G0_1_0_3_3_5 - 0.00338624338624337*G0_1_0_3_4_0 + 0.00169312169312169*G0_1_0_3_4_1 + 0.0118518518518518*G0_1_0_3_4_3 + 0.00507936507936506*G0_1_0_3_4_4 + 0.0101587301587301*G0_1_0_3_4_5 - 0.00761904761904758*G0_1_0_3_5_0 + 0.0126984126984126*G0_1_0_3_5_1 - 0.00677248677248674*G0_1_0_3_5_2 + 0.0287830687830687*G0_1_0_3_5_3 + 0.0101587301587301*G0_1_0_3_5_4 + 0.0389417989417987*G0_1_0_3_5_5 - 0.00634920634920632*G0_1_0_4_0_0 + 0.000423280423280423*G0_1_0_4_0_1 + 0.000846560846560845*G0_1_0_4_0_2 - 0.00338624338624337*G0_1_0_4_0_3 - 0.011005291005291*G0_1_0_4_0_4 - 0.0059259259259259*G0_1_0_4_0_5 + 0.000423280423280424*G0_1_0_4_1_0 + 0.00211640211640211*G0_1_0_4_1_1 - 0.00126984126984126*G0_1_0_4_1_2 + 0.00169312169312168*G0_1_0_4_1_3 + 0.000846560846560845*G0_1_0_4_1_4 + 0.00253968253968253*G0_1_0_4_1_5 + 0.000846560846560845*G0_1_0_4_2_0 - 0.00126984126984126*G0_1_0_4_2_1 + 0.00634920634920631*G0_1_0_4_2_2 + 0.00846560846560843*G0_1_0_4_2_4 - 0.00169312169312168*G0_1_0_4_2_5 - 0.00338624338624337*G0_1_0_4_3_0 + 0.00169312169312169*G0_1_0_4_3_1 + 0.0118518518518518*G0_1_0_4_3_3 + 0.00507936507936506*G0_1_0_4_3_4 + 0.0101587301587301*G0_1_0_4_3_5 - 0.011005291005291*G0_1_0_4_4_0 + 0.000846560846560845*G0_1_0_4_4_1 + 0.00846560846560843*G0_1_0_4_4_2 + 0.00507936507936506*G0_1_0_4_4_3 - 0.00507936507936506*G0_1_0_4_4_4 + 0.00169312169312168*G0_1_0_4_4_5 - 0.0059259259259259*G0_1_0_4_5_0 + 0.00253968253968253*G0_1_0_4_5_1 - 0.00169312169312168*G0_1_0_4_5_2 + 0.0101587301587301*G0_1_0_4_5_3 + 0.00169312169312168*G0_1_0_4_5_4 + 0.0186243386243385*G0_1_0_4_5_5 - 0.00211640211640211*G0_1_0_5_0_0 - 0.00550264550264546*G0_1_0_5_0_1 + 0.00253968253968253*G0_1_0_5_0_2 - 0.00761904761904758*G0_1_0_5_0_3 - 0.0059259259259259*G0_1_0_5_0_4 - 0.0194708994708993*G0_1_0_5_0_5 - 0.00550264550264546*G0_1_0_5_1_0 + 0.0275132275132273*G0_1_0_5_1_1 - 0.00338624338624337*G0_1_0_5_1_2 + 0.0126984126984126*G0_1_0_5_1_3 + 0.00253968253968253*G0_1_0_5_1_4 + 0.0296296296296295*G0_1_0_5_1_5 + 0.00253968253968253*G0_1_0_5_2_0 - 0.00338624338624337*G0_1_0_5_2_1 + 0.00211640211640211*G0_1_0_5_2_2 - 0.00677248677248674*G0_1_0_5_2_3 - 0.00169312169312168*G0_1_0_5_2_4 - 0.0118518518518518*G0_1_0_5_2_5 - 0.00761904761904758*G0_1_0_5_3_0 + 0.0126984126984126*G0_1_0_5_3_1 - 0.00677248677248674*G0_1_0_5_3_2 + 0.0287830687830687*G0_1_0_5_3_3 + 0.0101587301587301*G0_1_0_5_3_4 + 0.0389417989417987*G0_1_0_5_3_5 - 0.0059259259259259*G0_1_0_5_4_0 + 0.00253968253968253*G0_1_0_5_4_1 - 0.00169312169312168*G0_1_0_5_4_2 + 0.0101587301587301*G0_1_0_5_4_3 + 0.00169312169312168*G0_1_0_5_4_4 + 0.0186243386243385*G0_1_0_5_4_5 - 0.0194708994708993*G0_1_0_5_5_0 + 0.0296296296296295*G0_1_0_5_5_1 - 0.0118518518518518*G0_1_0_5_5_2 + 0.0389417989417987*G0_1_0_5_5_3 + 0.0186243386243385*G0_1_0_5_5_4 + 0.147301587301586*G0_1_0_5_5_5; + A[31] = -A[19] - 0.019047619047619*G0_0_0_0_0_0 + 0.000634920634920635*G0_0_0_0_0_1 + 0.00169312169312169*G0_0_0_0_0_2 - 0.00126984126984126*G0_0_0_0_0_3 - 0.0105820105820105*G0_0_0_0_0_4 - 0.00634920634920631*G0_0_0_0_0_5 + 0.000634920634920634*G0_0_0_0_1_0 + 0.0042328042328042*G0_0_0_0_1_1 - 0.000952380952380947*G0_0_0_0_1_2 + 0.0021164021164021*G0_0_0_0_1_3 + 0.000846560846560845*G0_0_0_0_1_4 + 0.00423280423280421*G0_0_0_0_1_5 + 0.00169312169312169*G0_0_0_0_2_0 - 0.000952380952380947*G0_0_0_0_2_1 + 0.00169312169312168*G0_0_0_0_2_2 + 0.000423280423280421*G0_0_0_0_2_3 + 0.00465608465608463*G0_0_0_0_2_4 + 0.000423280423280424*G0_0_0_0_2_5 - 0.00126984126984126*G0_0_0_0_3_0 + 0.0021164021164021*G0_0_0_0_3_1 + 0.000423280423280421*G0_0_0_0_3_2 + 0.00253968253968252*G0_0_0_0_3_3 + 0.00084656084656084*G0_0_0_0_3_4 + 0.00169312169312168*G0_0_0_0_3_5 - 0.0105820105820105*G0_0_0_0_4_0 + 0.000846560846560845*G0_0_0_0_4_1 + 0.00465608465608463*G0_0_0_0_4_2 + 0.00084656084656084*G0_0_0_0_4_3 - 0.00592592592592591*G0_0_0_0_4_4 - 0.00253968253968253*G0_0_0_0_4_5 - 0.00634920634920631*G0_0_0_0_5_0 + 0.00423280423280421*G0_0_0_0_5_1 + 0.000423280423280424*G0_0_0_0_5_2 + 0.00169312169312168*G0_0_0_0_5_3 - 0.00253968253968253*G0_0_0_0_5_4 + 0.00253968253968252*G0_0_0_0_5_5 + 0.000634920634920634*G0_0_0_1_0_0 + 0.0042328042328042*G0_0_0_1_0_1 - 0.000952380952380947*G0_0_0_1_0_2 + 0.0021164021164021*G0_0_0_1_0_3 + 0.000846560846560845*G0_0_0_1_0_4 + 0.00423280423280421*G0_0_0_1_0_5 + 0.0042328042328042*G0_0_0_1_1_0 - 0.0539682539682537*G0_0_0_1_1_1 + 0.00423280423280421*G0_0_0_1_1_2 - 0.0190476190476189*G0_0_0_1_1_3 - 0.00211640211640211*G0_0_0_1_1_4 - 0.0190476190476189*G0_0_0_1_1_5 - 0.000952380952380947*G0_0_0_1_2_0 + 0.00423280423280421*G0_0_0_1_2_1 + 0.000634920634920629*G0_0_0_1_2_2 + 0.00423280423280421*G0_0_0_1_2_3 + 0.000846560846560841*G0_0_0_1_2_4 + 0.00211640211640211*G0_0_0_1_2_5 + 0.0021164021164021*G0_0_0_1_3_0 - 0.0190476190476189*G0_0_0_1_3_1 + 0.00423280423280421*G0_0_0_1_3_2 - 0.0169312169312168*G0_0_0_1_3_3 - 0.00846560846560842*G0_0_0_1_3_5 + 0.000846560846560845*G0_0_0_1_4_0 - 0.00211640211640211*G0_0_0_1_4_1 + 0.000846560846560841*G0_0_0_1_4_2 + 0.00677248677248674*G0_0_0_1_4_4 + 0.00423280423280421*G0_0_0_1_5_0 - 0.0190476190476189*G0_0_0_1_5_1 + 0.00211640211640211*G0_0_0_1_5_2 - 0.00846560846560842*G0_0_0_1_5_3 - 0.0169312169312168*G0_0_0_1_5_5 + 0.00169312169312169*G0_0_0_2_0_0 - 0.000952380952380947*G0_0_0_2_0_1 + 0.00169312169312168*G0_0_0_2_0_2 + 0.000423280423280421*G0_0_0_2_0_3 + 0.00465608465608463*G0_0_0_2_0_4 + 0.000423280423280424*G0_0_0_2_0_5 - 0.000952380952380947*G0_0_0_2_1_0 + 0.00423280423280421*G0_0_0_2_1_1 + 0.000634920634920629*G0_0_0_2_1_2 + 0.00423280423280421*G0_0_0_2_1_3 + 0.000846560846560841*G0_0_0_2_1_4 + 0.00211640211640211*G0_0_0_2_1_5 + 0.00169312169312168*G0_0_0_2_2_0 + 0.00063492063492063*G0_0_0_2_2_1 - 0.0190476190476189*G0_0_0_2_2_2 - 0.00634920634920631*G0_0_0_2_2_3 - 0.0105820105820105*G0_0_0_2_2_4 - 0.00126984126984127*G0_0_0_2_2_5 + 0.000423280423280422*G0_0_0_2_3_0 + 0.00423280423280421*G0_0_0_2_3_1 - 0.00634920634920631*G0_0_0_2_3_2 + 0.00253968253968253*G0_0_0_2_3_3 - 0.00253968253968252*G0_0_0_2_3_4 + 0.00169312169312169*G0_0_0_2_3_5 + 0.00465608465608463*G0_0_0_2_4_0 + 0.000846560846560841*G0_0_0_2_4_1 - 0.0105820105820105*G0_0_0_2_4_2 - 0.00253968253968252*G0_0_0_2_4_3 - 0.0059259259259259*G0_0_0_2_4_4 + 0.000846560846560842*G0_0_0_2_4_5 + 0.000423280423280424*G0_0_0_2_5_0 + 0.00211640211640211*G0_0_0_2_5_1 - 0.00126984126984127*G0_0_0_2_5_2 + 0.00169312169312169*G0_0_0_2_5_3 + 0.000846560846560842*G0_0_0_2_5_4 + 0.00253968253968253*G0_0_0_2_5_5 - 0.00126984126984126*G0_0_0_3_0_0 + 0.0021164021164021*G0_0_0_3_0_1 + 0.000423280423280421*G0_0_0_3_0_2 + 0.00253968253968252*G0_0_0_3_0_3 + 0.00084656084656084*G0_0_0_3_0_4 + 0.00169312169312168*G0_0_0_3_0_5 + 0.0021164021164021*G0_0_0_3_1_0 - 0.0190476190476189*G0_0_0_3_1_1 + 0.00423280423280421*G0_0_0_3_1_2 - 0.0169312169312168*G0_0_0_3_1_3 - 0.00846560846560842*G0_0_0_3_1_5 + 0.000423280423280421*G0_0_0_3_2_0 + 0.00423280423280421*G0_0_0_3_2_1 - 0.00634920634920631*G0_0_0_3_2_2 + 0.00253968253968253*G0_0_0_3_2_3 - 0.00253968253968252*G0_0_0_3_2_4 + 0.00169312169312169*G0_0_0_3_2_5 + 0.00253968253968252*G0_0_0_3_3_0 - 0.0169312169312168*G0_0_0_3_3_1 + 0.00253968253968253*G0_0_0_3_3_2 - 0.0253968253968253*G0_0_0_3_3_3 - 0.00507936507936506*G0_0_0_3_3_4 - 0.00846560846560843*G0_0_0_3_3_5 + 0.00084656084656084*G0_0_0_3_4_0 - 0.00253968253968252*G0_0_0_3_4_2 - 0.00507936507936506*G0_0_0_3_4_3 - 0.0152380952380952*G0_0_0_3_4_4 - 0.00338624338624337*G0_0_0_3_4_5 + 0.00169312169312168*G0_0_0_3_5_0 - 0.00846560846560842*G0_0_0_3_5_1 + 0.00169312169312169*G0_0_0_3_5_2 - 0.00846560846560843*G0_0_0_3_5_3 - 0.00338624338624338*G0_0_0_3_5_4 - 0.00846560846560842*G0_0_0_3_5_5 - 0.0105820105820105*G0_0_0_4_0_0 + 0.000846560846560844*G0_0_0_4_0_1 + 0.00465608465608464*G0_0_0_4_0_2 + 0.00084656084656084*G0_0_0_4_0_3 - 0.00592592592592591*G0_0_0_4_0_4 - 0.00253968253968253*G0_0_0_4_0_5 + 0.000846560846560844*G0_0_0_4_1_0 - 0.00211640211640211*G0_0_0_4_1_1 + 0.000846560846560841*G0_0_0_4_1_2 + 0.00677248677248675*G0_0_0_4_1_4 + 0.00465608465608464*G0_0_0_4_2_0 + 0.000846560846560841*G0_0_0_4_2_1 - 0.0105820105820105*G0_0_0_4_2_2 - 0.00253968253968252*G0_0_0_4_2_3 - 0.0059259259259259*G0_0_0_4_2_4 + 0.000846560846560842*G0_0_0_4_2_5 + 0.00084656084656084*G0_0_0_4_3_0 - 0.00253968253968252*G0_0_0_4_3_2 - 0.00507936507936506*G0_0_0_4_3_3 - 0.0152380952380952*G0_0_0_4_3_4 - 0.00338624338624338*G0_0_0_4_3_5 - 0.00592592592592591*G0_0_0_4_4_0 + 0.00677248677248675*G0_0_0_4_4_1 - 0.0059259259259259*G0_0_0_4_4_2 - 0.0152380952380952*G0_0_0_4_4_3 - 0.116825396825396*G0_0_0_4_4_4 - 0.0152380952380952*G0_0_0_4_4_5 - 0.00253968253968253*G0_0_0_4_5_0 + 0.000846560846560842*G0_0_0_4_5_2 - 0.00338624338624338*G0_0_0_4_5_3 - 0.0152380952380952*G0_0_0_4_5_4 - 0.00507936507936507*G0_0_0_4_5_5 - 0.00634920634920631*G0_0_0_5_0_0 + 0.00423280423280421*G0_0_0_5_0_1 + 0.000423280423280424*G0_0_0_5_0_2 + 0.00169312169312168*G0_0_0_5_0_3 - 0.00253968253968253*G0_0_0_5_0_4 + 0.00253968253968252*G0_0_0_5_0_5 + 0.00423280423280421*G0_0_0_5_1_0 - 0.0190476190476189*G0_0_0_5_1_1 + 0.00211640211640211*G0_0_0_5_1_2 - 0.00846560846560842*G0_0_0_5_1_3 - 0.0169312169312168*G0_0_0_5_1_5 + 0.000423280423280424*G0_0_0_5_2_0 + 0.00211640211640211*G0_0_0_5_2_1 - 0.00126984126984127*G0_0_0_5_2_2 + 0.00169312169312169*G0_0_0_5_2_3 + 0.000846560846560842*G0_0_0_5_2_4 + 0.00253968253968253*G0_0_0_5_2_5 + 0.00169312169312168*G0_0_0_5_3_0 - 0.00846560846560842*G0_0_0_5_3_1 + 0.00169312169312169*G0_0_0_5_3_2 - 0.00846560846560843*G0_0_0_5_3_3 - 0.00338624338624338*G0_0_0_5_3_4 - 0.00846560846560842*G0_0_0_5_3_5 - 0.00253968253968253*G0_0_0_5_4_0 + 0.000846560846560842*G0_0_0_5_4_2 - 0.00338624338624338*G0_0_0_5_4_3 - 0.0152380952380952*G0_0_0_5_4_4 - 0.00507936507936507*G0_0_0_5_4_5 + 0.00253968253968252*G0_0_0_5_5_0 - 0.0169312169312168*G0_0_0_5_5_1 + 0.00253968253968253*G0_0_0_5_5_2 - 0.00846560846560842*G0_0_0_5_5_3 - 0.00507936507936507*G0_0_0_5_5_4 - 0.0253968253968253*G0_0_0_5_5_5; + A[12] = -A[13] + 0.0174603174603174*G0_1_0_0_0_0 - 0.00179894179894179*G0_1_0_0_0_1 - 0.00126984126984126*G0_1_0_0_0_2 + 0.000423280423280423*G0_1_0_0_0_3 + 0.00423280423280421*G0_1_0_0_0_4 + 0.00634920634920632*G0_1_0_0_0_5 - 0.00179894179894179*G0_1_0_0_1_0 + 0.00179894179894178*G0_1_0_0_1_1 + 0.00063492063492063*G0_1_0_0_1_3 - 0.000634920634920632*G0_1_0_0_1_4 - 0.00126984126984126*G0_1_0_0_2_0 + 0.000529100529100527*G0_1_0_0_2_2 - 0.00021164021164021*G0_1_0_0_2_3 + 0.00021164021164021*G0_1_0_0_2_4 - 0.000846560846560842*G0_1_0_0_2_5 + 0.000423280423280423*G0_1_0_0_3_0 + 0.00063492063492063*G0_1_0_0_3_1 - 0.00021164021164021*G0_1_0_0_3_2 - 0.0021164021164021*G0_1_0_0_3_3 + 0.00042328042328042*G0_1_0_0_3_4 + 0.00084656084656084*G0_1_0_0_3_5 + 0.00423280423280421*G0_1_0_0_4_0 - 0.000634920634920632*G0_1_0_0_4_1 + 0.00021164021164021*G0_1_0_0_4_2 + 0.000423280423280421*G0_1_0_0_4_3 + 0.00550264550264547*G0_1_0_0_4_4 + 0.00296296296296295*G0_1_0_0_4_5 + 0.00634920634920632*G0_1_0_0_5_0 - 0.000846560846560842*G0_1_0_0_5_2 + 0.00084656084656084*G0_1_0_0_5_3 + 0.00296296296296295*G0_1_0_0_5_4 + 0.00973544973544967*G0_1_0_0_5_5 - 0.00179894179894179*G0_1_0_1_0_0 + 0.00179894179894178*G0_1_0_1_0_1 + 0.00063492063492063*G0_1_0_1_0_3 - 0.000634920634920632*G0_1_0_1_0_4 + 0.00179894179894178*G0_1_0_1_1_0 - 0.0174603174603173*G0_1_0_1_1_1 + 0.00126984126984126*G0_1_0_1_1_2 - 0.0042328042328042*G0_1_0_1_1_3 - 0.000423280423280421*G0_1_0_1_1_4 - 0.00634920634920631*G0_1_0_1_1_5 + 0.00126984126984126*G0_1_0_1_2_1 - 0.000529100529100526*G0_1_0_1_2_2 - 0.000211640211640211*G0_1_0_1_2_3 + 0.00021164021164021*G0_1_0_1_2_4 + 0.000846560846560841*G0_1_0_1_2_5 + 0.00063492063492063*G0_1_0_1_3_0 - 0.0042328042328042*G0_1_0_1_3_1 - 0.000211640211640211*G0_1_0_1_3_2 - 0.00550264550264547*G0_1_0_1_3_3 - 0.000423280423280422*G0_1_0_1_3_4 - 0.00296296296296295*G0_1_0_1_3_5 - 0.000634920634920632*G0_1_0_1_4_0 - 0.000423280423280421*G0_1_0_1_4_1 + 0.00021164021164021*G0_1_0_1_4_2 - 0.000423280423280422*G0_1_0_1_4_3 + 0.00211640211640211*G0_1_0_1_4_4 - 0.000846560846560841*G0_1_0_1_4_5 - 0.00634920634920631*G0_1_0_1_5_1 + 0.000846560846560841*G0_1_0_1_5_2 - 0.00296296296296295*G0_1_0_1_5_3 - 0.000846560846560841*G0_1_0_1_5_4 - 0.00973544973544967*G0_1_0_1_5_5 - 0.00126984126984126*G0_1_0_2_0_0 + 0.000529100529100527*G0_1_0_2_0_2 - 0.00021164021164021*G0_1_0_2_0_3 + 0.00021164021164021*G0_1_0_2_0_4 - 0.000846560846560842*G0_1_0_2_0_5 + 0.00126984126984126*G0_1_0_2_1_1 - 0.000529100529100526*G0_1_0_2_1_2 - 0.000211640211640211*G0_1_0_2_1_3 + 0.00021164021164021*G0_1_0_2_1_4 + 0.000846560846560841*G0_1_0_2_1_5 + 0.000529100529100526*G0_1_0_2_2_0 - 0.000529100529100526*G0_1_0_2_2_1 + 0.00211640211640211*G0_1_0_2_2_3 - 0.0021164021164021*G0_1_0_2_2_4 - 0.00021164021164021*G0_1_0_2_3_0 - 0.000211640211640211*G0_1_0_2_3_1 + 0.00211640211640211*G0_1_0_2_3_2 + 0.00423280423280421*G0_1_0_2_3_3 + 0.000423280423280422*G0_1_0_2_3_5 + 0.00021164021164021*G0_1_0_2_4_0 + 0.00021164021164021*G0_1_0_2_4_1 - 0.0021164021164021*G0_1_0_2_4_2 - 0.00423280423280421*G0_1_0_2_4_4 - 0.000423280423280422*G0_1_0_2_4_5 - 0.000846560846560842*G0_1_0_2_5_0 + 0.000846560846560841*G0_1_0_2_5_1 + 0.000423280423280422*G0_1_0_2_5_3 - 0.000423280423280422*G0_1_0_2_5_4 + 0.000423280423280423*G0_1_0_3_0_0 + 0.00063492063492063*G0_1_0_3_0_1 - 0.00021164021164021*G0_1_0_3_0_2 - 0.0021164021164021*G0_1_0_3_0_3 + 0.00042328042328042*G0_1_0_3_0_4 + 0.00084656084656084*G0_1_0_3_0_5 + 0.00063492063492063*G0_1_0_3_1_0 - 0.0042328042328042*G0_1_0_3_1_1 - 0.000211640211640211*G0_1_0_3_1_2 - 0.00550264550264547*G0_1_0_3_1_3 - 0.000423280423280422*G0_1_0_3_1_4 - 0.00296296296296295*G0_1_0_3_1_5 - 0.00021164021164021*G0_1_0_3_2_0 - 0.000211640211640211*G0_1_0_3_2_1 + 0.00211640211640211*G0_1_0_3_2_2 + 0.00423280423280421*G0_1_0_3_2_3 + 0.000423280423280422*G0_1_0_3_2_5 - 0.0021164021164021*G0_1_0_3_3_0 - 0.00550264550264547*G0_1_0_3_3_1 + 0.00423280423280421*G0_1_0_3_3_2 + 0.0457142857142855*G0_1_0_3_3_3 + 0.00507936507936506*G0_1_0_3_3_4 + 0.00338624338624338*G0_1_0_3_3_5 + 0.00042328042328042*G0_1_0_3_4_0 - 0.000423280423280422*G0_1_0_3_4_1 + 0.00507936507936506*G0_1_0_3_4_3 - 0.00507936507936505*G0_1_0_3_4_4 + 0.00084656084656084*G0_1_0_3_5_0 - 0.00296296296296295*G0_1_0_3_5_1 + 0.000423280423280422*G0_1_0_3_5_2 + 0.00338624338624338*G0_1_0_3_5_3 - 0.00169312169312168*G0_1_0_3_5_5 + 0.00423280423280421*G0_1_0_4_0_0 - 0.000634920634920632*G0_1_0_4_0_1 + 0.00021164021164021*G0_1_0_4_0_2 + 0.00042328042328042*G0_1_0_4_0_3 + 0.00550264550264548*G0_1_0_4_0_4 + 0.00296296296296295*G0_1_0_4_0_5 - 0.000634920634920632*G0_1_0_4_1_0 - 0.000423280423280421*G0_1_0_4_1_1 + 0.00021164021164021*G0_1_0_4_1_2 - 0.000423280423280422*G0_1_0_4_1_3 + 0.00211640211640211*G0_1_0_4_1_4 - 0.000846560846560841*G0_1_0_4_1_5 + 0.00021164021164021*G0_1_0_4_2_0 + 0.00021164021164021*G0_1_0_4_2_1 - 0.0021164021164021*G0_1_0_4_2_2 - 0.00423280423280421*G0_1_0_4_2_4 - 0.000423280423280422*G0_1_0_4_2_5 + 0.000423280423280421*G0_1_0_4_3_0 - 0.000423280423280422*G0_1_0_4_3_1 + 0.00507936507936506*G0_1_0_4_3_3 - 0.00507936507936505*G0_1_0_4_3_4 + 0.00550264550264548*G0_1_0_4_4_0 + 0.00211640211640211*G0_1_0_4_4_1 - 0.00423280423280421*G0_1_0_4_4_2 - 0.00507936507936505*G0_1_0_4_4_3 - 0.0457142857142855*G0_1_0_4_4_4 - 0.00338624338624338*G0_1_0_4_4_5 + 0.00296296296296295*G0_1_0_4_5_0 - 0.000846560846560841*G0_1_0_4_5_1 - 0.000423280423280422*G0_1_0_4_5_2 - 0.00338624338624338*G0_1_0_4_5_4 + 0.00169312169312168*G0_1_0_4_5_5 + 0.00634920634920632*G0_1_0_5_0_0 - 0.000846560846560842*G0_1_0_5_0_2 + 0.00084656084656084*G0_1_0_5_0_3 + 0.00296296296296295*G0_1_0_5_0_4 + 0.00973544973544967*G0_1_0_5_0_5 - 0.00634920634920631*G0_1_0_5_1_1 + 0.000846560846560841*G0_1_0_5_1_2 - 0.00296296296296295*G0_1_0_5_1_3 - 0.000846560846560841*G0_1_0_5_1_4 - 0.00973544973544967*G0_1_0_5_1_5 - 0.000846560846560842*G0_1_0_5_2_0 + 0.000846560846560841*G0_1_0_5_2_1 + 0.000423280423280422*G0_1_0_5_2_3 - 0.000423280423280422*G0_1_0_5_2_4 + 0.00084656084656084*G0_1_0_5_3_0 - 0.00296296296296295*G0_1_0_5_3_1 + 0.000423280423280422*G0_1_0_5_3_2 + 0.00338624338624338*G0_1_0_5_3_3 - 0.00169312169312168*G0_1_0_5_3_5 + 0.00296296296296295*G0_1_0_5_4_0 - 0.000846560846560841*G0_1_0_5_4_1 - 0.000423280423280422*G0_1_0_5_4_2 - 0.00338624338624338*G0_1_0_5_4_4 + 0.00169312169312168*G0_1_0_5_4_5 + 0.00973544973544967*G0_1_0_5_5_0 - 0.00973544973544967*G0_1_0_5_5_1 - 0.00169312169312168*G0_1_0_5_5_3 + 0.00169312169312168*G0_1_0_5_5_4 + 0.0134920634920634*G0_1_1_0_0_0 - 0.00132275132275132*G0_1_1_0_0_1 - 0.00079365079365079*G0_1_1_0_0_2 + 0.000529100529100527*G0_1_1_0_0_3 + 0.00370370370370368*G0_1_1_0_0_4 + 0.00582010582010579*G0_1_1_0_0_5 - 0.00132275132275132*G0_1_1_0_1_0 + 0.000476190476190473*G0_1_1_0_1_1 + 0.000238095238095237*G0_1_1_0_1_2 + 0.00021164021164021*G0_1_1_0_1_3 - 0.000423280423280421*G0_1_1_0_1_4 - 0.00116402116402116*G0_1_1_0_1_5 - 0.00079365079365079*G0_1_1_0_2_0 + 0.000238095238095237*G0_1_1_0_2_1 - 0.000793650793650787*G0_1_1_0_2_2 - 0.00063492063492063*G0_1_1_0_2_3 - 0.000952380952380947*G0_1_1_0_2_4 - 0.000634920634920632*G0_1_1_0_2_5 + 0.000529100529100527*G0_1_1_0_3_0 + 0.00021164021164021*G0_1_1_0_3_1 - 0.00063492063492063*G0_1_1_0_3_2 - 0.00169312169312168*G0_1_1_0_3_3 - 0.00021164021164021*G0_1_1_0_3_4 + 0.00021164021164021*G0_1_1_0_3_5 + 0.00370370370370368*G0_1_1_0_4_0 - 0.000423280423280421*G0_1_1_0_4_1 - 0.000952380952380947*G0_1_1_0_4_2 - 0.00021164021164021*G0_1_1_0_4_3 + 0.00211640211640211*G0_1_1_0_4_4 + 0.0021164021164021*G0_1_1_0_4_5 + 0.00582010582010579*G0_1_1_0_5_0 - 0.00116402116402116*G0_1_1_0_5_1 - 0.000634920634920632*G0_1_1_0_5_2 + 0.00021164021164021*G0_1_1_0_5_3 + 0.0021164021164021*G0_1_1_0_5_4 + 0.00634920634920631*G0_1_1_0_5_5 - 0.00132275132275132*G0_1_1_1_0_0 + 0.000476190476190473*G0_1_1_1_0_1 + 0.000238095238095237*G0_1_1_1_0_2 + 0.00021164021164021*G0_1_1_1_0_3 - 0.000423280423280421*G0_1_1_1_0_4 - 0.00116402116402116*G0_1_1_1_0_5 + 0.000476190476190473*G0_1_1_1_1_0 - 0.00396825396825395*G0_1_1_1_1_1 + 0.000476190476190474*G0_1_1_1_1_2 - 0.000529100529100526*G0_1_1_1_1_3 + 0.000105820105820105*G0_1_1_1_1_4 - 0.000529100529100527*G0_1_1_1_1_5 + 0.000238095238095237*G0_1_1_1_2_0 + 0.000476190476190474*G0_1_1_1_2_1 - 0.00132275132275131*G0_1_1_1_2_2 - 0.00116402116402116*G0_1_1_1_2_3 - 0.000423280423280421*G0_1_1_1_2_4 + 0.00021164021164021*G0_1_1_1_2_5 + 0.00021164021164021*G0_1_1_1_3_0 - 0.000529100529100526*G0_1_1_1_3_1 - 0.00116402116402116*G0_1_1_1_3_2 - 0.00338624338624337*G0_1_1_1_3_3 - 0.000634920634920632*G0_1_1_1_3_4 - 0.000846560846560842*G0_1_1_1_3_5 - 0.000423280423280421*G0_1_1_1_4_0 + 0.000105820105820105*G0_1_1_1_4_1 - 0.000423280423280421*G0_1_1_1_4_2 - 0.000634920634920632*G0_1_1_1_4_3 + 0.000423280423280422*G0_1_1_1_4_4 - 0.000634920634920631*G0_1_1_1_4_5 - 0.00116402116402116*G0_1_1_1_5_0 - 0.000529100529100527*G0_1_1_1_5_1 + 0.00021164021164021*G0_1_1_1_5_2 - 0.000846560846560842*G0_1_1_1_5_3 - 0.000634920634920631*G0_1_1_1_5_4 - 0.00338624338624336*G0_1_1_1_5_5 - 0.00079365079365079*G0_1_1_2_0_0 + 0.000238095238095237*G0_1_1_2_0_1 - 0.000793650793650787*G0_1_1_2_0_2 - 0.00063492063492063*G0_1_1_2_0_3 - 0.000952380952380947*G0_1_1_2_0_4 - 0.000634920634920632*G0_1_1_2_0_5 + 0.000238095238095237*G0_1_1_2_1_0 + 0.000476190476190474*G0_1_1_2_1_1 - 0.00132275132275131*G0_1_1_2_1_2 - 0.00116402116402116*G0_1_1_2_1_3 - 0.000423280423280421*G0_1_1_2_1_4 + 0.00021164021164021*G0_1_1_2_1_5 - 0.000793650793650787*G0_1_1_2_2_0 - 0.00132275132275131*G0_1_1_2_2_1 + 0.0134920634920634*G0_1_1_2_2_2 + 0.00582010582010579*G0_1_1_2_2_3 + 0.00370370370370368*G0_1_1_2_2_4 + 0.00052910052910053*G0_1_1_2_2_5 - 0.00063492063492063*G0_1_1_2_3_0 - 0.00116402116402116*G0_1_1_2_3_1 + 0.00582010582010579*G0_1_1_2_3_2 + 0.00634920634920631*G0_1_1_2_3_3 + 0.00211640211640211*G0_1_1_2_3_4 + 0.000211640211640213*G0_1_1_2_3_5 - 0.000952380952380947*G0_1_1_2_4_0 - 0.000423280423280421*G0_1_1_2_4_1 + 0.00370370370370368*G0_1_1_2_4_2 + 0.00211640211640211*G0_1_1_2_4_3 + 0.0021164021164021*G0_1_1_2_4_4 - 0.000211640211640209*G0_1_1_2_4_5 - 0.000634920634920632*G0_1_1_2_5_0 + 0.00021164021164021*G0_1_1_2_5_1 + 0.00052910052910053*G0_1_1_2_5_2 + 0.000211640211640213*G0_1_1_2_5_3 - 0.000211640211640209*G0_1_1_2_5_4 - 0.00169312169312168*G0_1_1_2_5_5 + 0.000529100529100527*G0_1_1_3_0_0 + 0.00021164021164021*G0_1_1_3_0_1 - 0.00063492063492063*G0_1_1_3_0_2 - 0.00169312169312168*G0_1_1_3_0_3 - 0.00021164021164021*G0_1_1_3_0_4 + 0.00021164021164021*G0_1_1_3_0_5 + 0.00021164021164021*G0_1_1_3_1_0 - 0.000529100529100526*G0_1_1_3_1_1 - 0.00116402116402116*G0_1_1_3_1_2 - 0.00338624338624337*G0_1_1_3_1_3 - 0.000634920634920632*G0_1_1_3_1_4 - 0.000846560846560842*G0_1_1_3_1_5 - 0.00063492063492063*G0_1_1_3_2_0 - 0.00116402116402116*G0_1_1_3_2_1 + 0.00582010582010579*G0_1_1_3_2_2 + 0.00634920634920631*G0_1_1_3_2_3 + 0.00211640211640211*G0_1_1_3_2_4 + 0.000211640211640213*G0_1_1_3_2_5 - 0.00169312169312168*G0_1_1_3_3_0 - 0.00338624338624337*G0_1_1_3_3_1 + 0.00634920634920631*G0_1_1_3_3_2 + 0.0292063492063491*G0_1_1_3_3_3 + 0.00465608465608464*G0_1_1_3_3_4 + 0.00296296296296296*G0_1_1_3_3_5 - 0.00021164021164021*G0_1_1_3_4_0 - 0.000634920634920632*G0_1_1_3_4_1 + 0.00211640211640211*G0_1_1_3_4_2 + 0.00465608465608464*G0_1_1_3_4_3 - 0.000423280423280421*G0_1_1_3_4_4 + 0.000846560846560843*G0_1_1_3_4_5 + 0.00021164021164021*G0_1_1_3_5_0 - 0.000846560846560842*G0_1_1_3_5_1 + 0.000211640211640213*G0_1_1_3_5_2 + 0.00296296296296296*G0_1_1_3_5_3 + 0.000846560846560843*G0_1_1_3_5_4 + 0.00296296296296295*G0_1_1_3_5_5 + 0.00370370370370368*G0_1_1_4_0_0 - 0.000423280423280421*G0_1_1_4_0_1 - 0.000952380952380947*G0_1_1_4_0_2 - 0.00021164021164021*G0_1_1_4_0_3 + 0.00211640211640211*G0_1_1_4_0_4 + 0.0021164021164021*G0_1_1_4_0_5 - 0.000423280423280421*G0_1_1_4_1_0 + 0.000105820105820105*G0_1_1_4_1_1 - 0.000423280423280421*G0_1_1_4_1_2 - 0.000634920634920632*G0_1_1_4_1_3 + 0.000423280423280421*G0_1_1_4_1_4 - 0.000634920634920631*G0_1_1_4_1_5 - 0.000952380952380947*G0_1_1_4_2_0 - 0.000423280423280421*G0_1_1_4_2_1 + 0.00370370370370368*G0_1_1_4_2_2 + 0.00211640211640211*G0_1_1_4_2_3 + 0.0021164021164021*G0_1_1_4_2_4 - 0.000211640211640209*G0_1_1_4_2_5 - 0.00021164021164021*G0_1_1_4_3_0 - 0.000634920634920632*G0_1_1_4_3_1 + 0.00211640211640211*G0_1_1_4_3_2 + 0.00465608465608464*G0_1_1_4_3_3 - 0.000423280423280421*G0_1_1_4_3_4 + 0.000846560846560843*G0_1_1_4_3_5 + 0.00211640211640211*G0_1_1_4_4_0 + 0.000423280423280421*G0_1_1_4_4_1 + 0.0021164021164021*G0_1_1_4_4_2 - 0.000423280423280421*G0_1_1_4_4_3 - 0.0165079365079364*G0_1_1_4_4_4 - 0.000423280423280425*G0_1_1_4_4_5 + 0.0021164021164021*G0_1_1_4_5_0 - 0.000634920634920631*G0_1_1_4_5_1 - 0.000211640211640209*G0_1_1_4_5_2 + 0.000846560846560843*G0_1_1_4_5_3 - 0.000423280423280425*G0_1_1_4_5_4 + 0.00465608465608463*G0_1_1_4_5_5 + 0.00582010582010579*G0_1_1_5_0_0 - 0.00116402116402116*G0_1_1_5_0_1 - 0.000634920634920632*G0_1_1_5_0_2 + 0.00021164021164021*G0_1_1_5_0_3 + 0.0021164021164021*G0_1_1_5_0_4 + 0.00634920634920631*G0_1_1_5_0_5 - 0.00116402116402116*G0_1_1_5_1_0 - 0.000529100529100527*G0_1_1_5_1_1 + 0.00021164021164021*G0_1_1_5_1_2 - 0.000846560846560842*G0_1_1_5_1_3 - 0.000634920634920631*G0_1_1_5_1_4 - 0.00338624338624336*G0_1_1_5_1_5 - 0.000634920634920632*G0_1_1_5_2_0 + 0.00021164021164021*G0_1_1_5_2_1 + 0.00052910052910053*G0_1_1_5_2_2 + 0.000211640211640213*G0_1_1_5_2_3 - 0.000211640211640209*G0_1_1_5_2_4 - 0.00169312169312168*G0_1_1_5_2_5 + 0.00021164021164021*G0_1_1_5_3_0 - 0.000846560846560842*G0_1_1_5_3_1 + 0.000211640211640213*G0_1_1_5_3_2 + 0.00296296296296296*G0_1_1_5_3_3 + 0.000846560846560843*G0_1_1_5_3_4 + 0.00296296296296295*G0_1_1_5_3_5 + 0.0021164021164021*G0_1_1_5_4_0 - 0.000634920634920631*G0_1_1_5_4_1 - 0.000211640211640209*G0_1_1_5_4_2 + 0.000846560846560843*G0_1_1_5_4_3 - 0.000423280423280425*G0_1_1_5_4_4 + 0.00465608465608463*G0_1_1_5_4_5 + 0.00634920634920631*G0_1_1_5_5_0 - 0.00338624338624336*G0_1_1_5_5_1 - 0.00169312169312168*G0_1_1_5_5_2 + 0.00296296296296295*G0_1_1_5_5_3 + 0.00465608465608463*G0_1_1_5_5_4 + 0.029206349206349*G0_1_1_5_5_5; + A[27] = -A[29] - 0.0063492063492063*G0_0_0_0_0_0 + 0.00169312169312168*G0_0_0_0_0_1 - 0.000423280423280417*G0_0_0_0_0_2 - 0.00338624338624337*G0_0_0_0_0_3 - 0.0126984126984126*G0_0_0_0_0_4 - 0.00423280423280421*G0_0_0_0_0_5 + 0.00169312169312168*G0_0_0_0_1_0 - 0.00126984126984126*G0_0_0_0_1_2 - 0.00338624338624336*G0_0_0_0_1_3 - 0.00253968253968252*G0_0_0_0_1_4 - 0.00084656084656084*G0_0_0_0_1_5 - 0.000423280423280417*G0_0_0_0_2_0 - 0.00126984126984126*G0_0_0_0_2_1 + 0.00846560846560839*G0_0_0_0_2_2 + 0.00507936507936504*G0_0_0_0_2_3 + 0.0118518518518518*G0_0_0_0_2_4 + 0.00169312169312169*G0_0_0_0_2_5 - 0.00338624338624337*G0_0_0_0_3_0 - 0.00338624338624336*G0_0_0_0_3_1 + 0.00507936507936504*G0_0_0_0_3_2 + 0.0118518518518518*G0_0_0_0_3_3 + 0.0118518518518518*G0_0_0_0_3_4 + 0.00338624338624337*G0_0_0_0_3_5 - 0.0126984126984126*G0_0_0_0_4_0 - 0.00253968253968252*G0_0_0_0_4_1 + 0.0118518518518518*G0_0_0_0_4_2 + 0.0118518518518518*G0_0_0_0_4_3 + 0.0152380952380951*G0_0_0_0_4_4 + 0.00169312169312168*G0_0_0_0_4_5 - 0.00423280423280421*G0_0_0_0_5_0 - 0.00084656084656084*G0_0_0_0_5_1 + 0.00169312169312169*G0_0_0_0_5_2 + 0.00338624338624337*G0_0_0_0_5_3 + 0.00169312169312168*G0_0_0_0_5_4 - 0.00169312169312167*G0_0_0_0_5_5 + 0.00169312169312168*G0_0_0_1_0_0 - 0.00126984126984126*G0_0_0_1_0_2 - 0.00338624338624336*G0_0_0_1_0_3 - 0.00253968253968252*G0_0_0_1_0_4 - 0.00084656084656084*G0_0_0_1_0_5 + 0.00634920634920629*G0_0_0_1_1_1 - 0.0021164021164021*G0_0_0_1_1_2 - 0.00423280423280421*G0_0_0_1_1_4 - 0.00126984126984126*G0_0_0_1_2_0 - 0.0021164021164021*G0_0_0_1_2_1 + 0.0084656084656084*G0_0_0_1_2_2 + 0.00507936507936504*G0_0_0_1_2_3 + 0.00338624338624336*G0_0_0_1_2_4 - 0.00084656084656084*G0_0_0_1_2_5 - 0.00338624338624336*G0_0_0_1_3_0 + 0.00507936507936504*G0_0_0_1_3_2 + 0.0253968253968253*G0_0_0_1_3_3 + 0.0152380952380952*G0_0_0_1_3_4 + 0.00846560846560842*G0_0_0_1_3_5 - 0.00253968253968252*G0_0_0_1_4_0 - 0.00423280423280421*G0_0_0_1_4_1 + 0.00338624338624336*G0_0_0_1_4_2 + 0.0152380952380952*G0_0_0_1_4_3 + 0.0287830687830686*G0_0_0_1_4_4 + 0.0101587301587301*G0_0_0_1_4_5 - 0.00084656084656084*G0_0_0_1_5_0 - 0.00084656084656084*G0_0_0_1_5_2 + 0.00846560846560842*G0_0_0_1_5_3 + 0.0101587301587301*G0_0_0_1_5_4 + 0.00846560846560841*G0_0_0_1_5_5 - 0.000423280423280417*G0_0_0_2_0_0 - 0.00126984126984126*G0_0_0_2_0_1 + 0.00846560846560839*G0_0_0_2_0_2 + 0.00507936507936504*G0_0_0_2_0_3 + 0.0118518518518518*G0_0_0_2_0_4 + 0.00169312169312169*G0_0_0_2_0_5 - 0.00126984126984126*G0_0_0_2_1_0 - 0.0021164021164021*G0_0_0_2_1_1 + 0.0084656084656084*G0_0_0_2_1_2 + 0.00507936507936504*G0_0_0_2_1_3 + 0.00338624338624336*G0_0_0_2_1_4 - 0.00084656084656084*G0_0_0_2_1_5 + 0.00846560846560839*G0_0_0_2_2_0 + 0.0084656084656084*G0_0_0_2_2_1 - 0.0888888888888883*G0_0_0_2_2_2 - 0.0338624338624336*G0_0_0_2_2_3 - 0.042328042328042*G0_0_0_2_2_4 - 0.00423280423280423*G0_0_0_2_2_5 + 0.00507936507936504*G0_0_0_2_3_0 + 0.00507936507936504*G0_0_0_2_3_1 - 0.0338624338624336*G0_0_0_2_3_2 - 0.0338624338624336*G0_0_0_2_3_3 - 0.0169312169312168*G0_0_0_2_3_4 - 0.0016931216931217*G0_0_0_2_3_5 + 0.0118518518518518*G0_0_0_2_4_0 + 0.00338624338624336*G0_0_0_2_4_1 - 0.042328042328042*G0_0_0_2_4_2 - 0.0169312169312168*G0_0_0_2_4_3 - 0.0338624338624336*G0_0_0_2_4_4 + 0.00169312169312168*G0_0_0_2_4_5 + 0.00169312169312169*G0_0_0_2_5_0 - 0.00084656084656084*G0_0_0_2_5_1 - 0.00423280423280423*G0_0_0_2_5_2 - 0.0016931216931217*G0_0_0_2_5_3 + 0.00169312169312168*G0_0_0_2_5_4 + 0.00338624338624337*G0_0_0_2_5_5 - 0.00338624338624337*G0_0_0_3_0_0 - 0.00338624338624336*G0_0_0_3_0_1 + 0.00507936507936504*G0_0_0_3_0_2 + 0.0118518518518518*G0_0_0_3_0_3 + 0.0118518518518518*G0_0_0_3_0_4 + 0.00338624338624337*G0_0_0_3_0_5 - 0.00338624338624336*G0_0_0_3_1_0 + 0.00507936507936504*G0_0_0_3_1_2 + 0.0253968253968253*G0_0_0_3_1_3 + 0.0152380952380952*G0_0_0_3_1_4 + 0.00846560846560842*G0_0_0_3_1_5 + 0.00507936507936504*G0_0_0_3_2_0 + 0.00507936507936504*G0_0_0_3_2_1 - 0.0338624338624336*G0_0_0_3_2_2 - 0.0338624338624336*G0_0_0_3_2_3 - 0.0169312169312168*G0_0_0_3_2_4 - 0.0016931216931217*G0_0_0_3_2_5 + 0.0118518518518518*G0_0_0_3_3_0 + 0.0253968253968253*G0_0_0_3_3_1 - 0.0338624338624336*G0_0_0_3_3_2 - 0.0812698412698408*G0_0_0_3_3_3 - 0.0541798941798939*G0_0_0_3_3_4 - 0.0203174603174602*G0_0_0_3_3_5 + 0.0118518518518518*G0_0_0_3_4_0 + 0.0152380952380952*G0_0_0_3_4_1 - 0.0169312169312168*G0_0_0_3_4_2 - 0.0541798941798939*G0_0_0_3_4_3 - 0.0812698412698408*G0_0_0_3_4_4 - 0.027089947089947*G0_0_0_3_4_5 + 0.00338624338624337*G0_0_0_3_5_0 + 0.00846560846560843*G0_0_0_3_5_1 - 0.0016931216931217*G0_0_0_3_5_2 - 0.0203174603174602*G0_0_0_3_5_3 - 0.027089947089947*G0_0_0_3_5_4 - 0.0135449735449735*G0_0_0_3_5_5 - 0.0126984126984126*G0_0_0_4_0_0 - 0.00253968253968252*G0_0_0_4_0_1 + 0.0118518518518518*G0_0_0_4_0_2 + 0.0118518518518518*G0_0_0_4_0_3 + 0.0152380952380951*G0_0_0_4_0_4 + 0.00169312169312168*G0_0_0_4_0_5 - 0.00253968253968252*G0_0_0_4_1_0 - 0.00423280423280421*G0_0_0_4_1_1 + 0.00338624338624336*G0_0_0_4_1_2 + 0.0152380952380952*G0_0_0_4_1_3 + 0.0287830687830686*G0_0_0_4_1_4 + 0.0101587301587301*G0_0_0_4_1_5 + 0.0118518518518518*G0_0_0_4_2_0 + 0.00338624338624336*G0_0_0_4_2_1 - 0.042328042328042*G0_0_0_4_2_2 - 0.0169312169312168*G0_0_0_4_2_3 - 0.0338624338624337*G0_0_0_4_2_4 + 0.00169312169312168*G0_0_0_4_2_5 + 0.0118518518518518*G0_0_0_4_3_0 + 0.0152380952380952*G0_0_0_4_3_1 - 0.0169312169312168*G0_0_0_4_3_2 - 0.0541798941798939*G0_0_0_4_3_3 - 0.0812698412698408*G0_0_0_4_3_4 - 0.027089947089947*G0_0_0_4_3_5 + 0.0152380952380951*G0_0_0_4_4_0 + 0.0287830687830686*G0_0_0_4_4_1 - 0.0338624338624336*G0_0_0_4_4_2 - 0.0812698412698408*G0_0_0_4_4_3 - 0.325079365079363*G0_0_0_4_4_4 - 0.0609523809523807*G0_0_0_4_4_5 + 0.00169312169312168*G0_0_0_4_5_0 + 0.0101587301587301*G0_0_0_4_5_1 + 0.00169312169312168*G0_0_0_4_5_2 - 0.027089947089947*G0_0_0_4_5_3 - 0.0609523809523807*G0_0_0_4_5_4 - 0.027089947089947*G0_0_0_4_5_5 - 0.00423280423280421*G0_0_0_5_0_0 - 0.00084656084656084*G0_0_0_5_0_1 + 0.00169312169312169*G0_0_0_5_0_2 + 0.00338624338624337*G0_0_0_5_0_3 + 0.00169312169312168*G0_0_0_5_0_4 - 0.00169312169312167*G0_0_0_5_0_5 - 0.00084656084656084*G0_0_0_5_1_0 - 0.00084656084656084*G0_0_0_5_1_2 + 0.00846560846560843*G0_0_0_5_1_3 + 0.0101587301587301*G0_0_0_5_1_4 + 0.00846560846560841*G0_0_0_5_1_5 + 0.00169312169312169*G0_0_0_5_2_0 - 0.00084656084656084*G0_0_0_5_2_1 - 0.00423280423280423*G0_0_0_5_2_2 - 0.0016931216931217*G0_0_0_5_2_3 + 0.00169312169312168*G0_0_0_5_2_4 + 0.00338624338624337*G0_0_0_5_2_5 + 0.00338624338624337*G0_0_0_5_3_0 + 0.00846560846560842*G0_0_0_5_3_1 - 0.0016931216931217*G0_0_0_5_3_2 - 0.0203174603174602*G0_0_0_5_3_3 - 0.027089947089947*G0_0_0_5_3_4 - 0.0135449735449735*G0_0_0_5_3_5 + 0.00169312169312168*G0_0_0_5_4_0 + 0.0101587301587301*G0_0_0_5_4_1 + 0.00169312169312168*G0_0_0_5_4_2 - 0.027089947089947*G0_0_0_5_4_3 - 0.0609523809523807*G0_0_0_5_4_4 - 0.027089947089947*G0_0_0_5_4_5 - 0.00169312169312167*G0_0_0_5_5_0 + 0.00846560846560841*G0_0_0_5_5_1 + 0.00338624338624337*G0_0_0_5_5_2 - 0.0135449735449735*G0_0_0_5_5_3 - 0.027089947089947*G0_0_0_5_5_4 - 0.0203174603174602*G0_0_0_5_5_5 + 0.0825396825396821*G0_1_0_0_0_0 - 0.00677248677248674*G0_1_0_0_0_1 - 0.00888888888888884*G0_1_0_0_0_2 + 0.000846560846560853*G0_1_0_0_0_3 + 0.0296296296296295*G0_1_0_0_0_4 + 0.0296296296296295*G0_1_0_0_0_5 - 0.00677248677248674*G0_1_0_0_1_0 + 0.00211640211640211*G0_1_0_0_1_1 - 0.00253968253968252*G0_1_0_0_1_3 - 0.0059259259259259*G0_1_0_0_1_4 - 0.00592592592592589*G0_1_0_0_1_5 - 0.00888888888888884*G0_1_0_0_2_0 + 0.00888888888888882*G0_1_0_0_2_2 + 0.00338624338624336*G0_1_0_0_2_3 - 0.00338624338624337*G0_1_0_0_2_5 + 0.000846560846560852*G0_1_0_0_3_0 - 0.00253968253968252*G0_1_0_0_3_1 + 0.00338624338624336*G0_1_0_0_3_2 + 0.00846560846560842*G0_1_0_0_3_3 + 0.0101587301587301*G0_1_0_0_3_4 + 0.00507936507936506*G0_1_0_0_3_5 + 0.0296296296296295*G0_1_0_0_4_0 - 0.0059259259259259*G0_1_0_0_4_1 + 0.0101587301587301*G0_1_0_0_4_3 + 0.0491005291005289*G0_1_0_0_4_4 + 0.0186243386243385*G0_1_0_0_4_5 + 0.0296296296296295*G0_1_0_0_5_0 - 0.00592592592592589*G0_1_0_0_5_1 - 0.00338624338624337*G0_1_0_0_5_2 + 0.00507936507936506*G0_1_0_0_5_3 + 0.0186243386243385*G0_1_0_0_5_4 + 0.032169312169312*G0_1_0_0_5_5 - 0.00677248677248674*G0_1_0_1_0_0 + 0.00211640211640211*G0_1_0_1_0_1 - 0.00253968253968252*G0_1_0_1_0_3 - 0.0059259259259259*G0_1_0_1_0_4 - 0.00592592592592589*G0_1_0_1_0_5 + 0.00211640211640211*G0_1_0_1_1_0 - 0.0021164021164021*G0_1_0_1_1_2 - 0.0021164021164021*G0_1_0_1_2_1 + 0.00677248677248672*G0_1_0_1_2_2 + 0.00592592592592589*G0_1_0_1_2_3 + 0.00592592592592589*G0_1_0_1_2_4 + 0.00253968253968253*G0_1_0_1_2_5 - 0.00253968253968252*G0_1_0_1_3_0 + 0.00592592592592589*G0_1_0_1_3_2 + 0.0169312169312168*G0_1_0_1_3_3 + 0.00507936507936505*G0_1_0_1_3_4 - 0.0059259259259259*G0_1_0_1_4_0 + 0.00592592592592589*G0_1_0_1_4_2 + 0.00507936507936505*G0_1_0_1_4_3 - 0.00507936507936505*G0_1_0_1_4_5 - 0.00592592592592589*G0_1_0_1_5_0 + 0.00253968253968253*G0_1_0_1_5_2 - 0.00507936507936505*G0_1_0_1_5_4 - 0.0169312169312168*G0_1_0_1_5_5 - 0.00888888888888884*G0_1_0_2_0_0 + 0.00888888888888882*G0_1_0_2_0_2 + 0.00338624338624336*G0_1_0_2_0_3 - 0.00338624338624337*G0_1_0_2_0_5 - 0.0021164021164021*G0_1_0_2_1_1 + 0.00677248677248672*G0_1_0_2_1_2 + 0.00592592592592589*G0_1_0_2_1_3 + 0.00592592592592589*G0_1_0_2_1_4 + 0.00253968253968253*G0_1_0_2_1_5 + 0.00888888888888882*G0_1_0_2_2_0 + 0.00677248677248672*G0_1_0_2_2_1 - 0.082539682539682*G0_1_0_2_2_2 - 0.0296296296296294*G0_1_0_2_2_3 - 0.0296296296296294*G0_1_0_2_2_4 - 0.000846560846560857*G0_1_0_2_2_5 + 0.00338624338624336*G0_1_0_2_3_0 + 0.00592592592592589*G0_1_0_2_3_1 - 0.0296296296296294*G0_1_0_2_3_2 - 0.032169312169312*G0_1_0_2_3_3 - 0.0186243386243385*G0_1_0_2_3_4 - 0.00507936507936506*G0_1_0_2_3_5 + 0.00592592592592589*G0_1_0_2_4_1 - 0.0296296296296294*G0_1_0_2_4_2 - 0.0186243386243385*G0_1_0_2_4_3 - 0.0491005291005288*G0_1_0_2_4_4 - 0.0101587301587301*G0_1_0_2_4_5 - 0.00338624338624337*G0_1_0_2_5_0 + 0.00253968253968253*G0_1_0_2_5_1 - 0.000846560846560858*G0_1_0_2_5_2 - 0.00507936507936506*G0_1_0_2_5_3 - 0.0101587301587301*G0_1_0_2_5_4 - 0.00846560846560842*G0_1_0_2_5_5 + 0.000846560846560853*G0_1_0_3_0_0 - 0.00253968253968252*G0_1_0_3_0_1 + 0.00338624338624336*G0_1_0_3_0_2 + 0.00846560846560841*G0_1_0_3_0_3 + 0.0101587301587301*G0_1_0_3_0_4 + 0.00507936507936506*G0_1_0_3_0_5 - 0.00253968253968252*G0_1_0_3_1_0 + 0.00592592592592589*G0_1_0_3_1_2 + 0.0169312169312168*G0_1_0_3_1_3 + 0.00507936507936505*G0_1_0_3_1_4 + 0.00338624338624336*G0_1_0_3_2_0 + 0.00592592592592589*G0_1_0_3_2_1 - 0.0296296296296294*G0_1_0_3_2_2 - 0.032169312169312*G0_1_0_3_2_3 - 0.0186243386243385*G0_1_0_3_2_4 - 0.00507936507936506*G0_1_0_3_2_5 + 0.00846560846560841*G0_1_0_3_3_0 + 0.0169312169312168*G0_1_0_3_3_1 - 0.032169312169312*G0_1_0_3_3_2 - 0.0609523809523806*G0_1_0_3_3_3 - 0.027089947089947*G0_1_0_3_3_4 - 0.00677248677248675*G0_1_0_3_3_5 + 0.0101587301587301*G0_1_0_3_4_0 + 0.00507936507936505*G0_1_0_3_4_1 - 0.0186243386243385*G0_1_0_3_4_2 - 0.027089947089947*G0_1_0_3_4_3 - 0.0203174603174602*G0_1_0_3_4_4 + 0.00507936507936506*G0_1_0_3_5_0 - 0.00507936507936507*G0_1_0_3_5_2 - 0.00677248677248675*G0_1_0_3_5_3 + 0.00677248677248673*G0_1_0_3_5_5 + 0.0296296296296295*G0_1_0_4_0_0 - 0.0059259259259259*G0_1_0_4_0_1 + 0.0101587301587301*G0_1_0_4_0_3 + 0.0491005291005289*G0_1_0_4_0_4 + 0.0186243386243385*G0_1_0_4_0_5 - 0.0059259259259259*G0_1_0_4_1_0 + 0.00592592592592589*G0_1_0_4_1_2 + 0.00507936507936505*G0_1_0_4_1_3 - 0.00507936507936505*G0_1_0_4_1_5 + 0.00592592592592589*G0_1_0_4_2_1 - 0.0296296296296294*G0_1_0_4_2_2 - 0.0186243386243385*G0_1_0_4_2_3 - 0.0491005291005288*G0_1_0_4_2_4 - 0.0101587301587301*G0_1_0_4_2_5 + 0.0101587301587301*G0_1_0_4_3_0 + 0.00507936507936505*G0_1_0_4_3_1 - 0.0186243386243385*G0_1_0_4_3_2 - 0.027089947089947*G0_1_0_4_3_3 - 0.0203174603174602*G0_1_0_4_3_4 + 0.0491005291005289*G0_1_0_4_4_0 - 0.0491005291005288*G0_1_0_4_4_2 - 0.0203174603174602*G0_1_0_4_4_3 + 0.0203174603174602*G0_1_0_4_4_5 + 0.0186243386243385*G0_1_0_4_5_0 - 0.00507936507936505*G0_1_0_4_5_1 - 0.0101587301587301*G0_1_0_4_5_2 + 0.0203174603174602*G0_1_0_4_5_4 + 0.027089947089947*G0_1_0_4_5_5 + 0.0296296296296295*G0_1_0_5_0_0 - 0.00592592592592589*G0_1_0_5_0_1 - 0.00338624338624337*G0_1_0_5_0_2 + 0.00507936507936506*G0_1_0_5_0_3 + 0.0186243386243385*G0_1_0_5_0_4 + 0.032169312169312*G0_1_0_5_0_5 - 0.00592592592592589*G0_1_0_5_1_0 + 0.00253968253968253*G0_1_0_5_1_2 - 0.00507936507936505*G0_1_0_5_1_4 - 0.0169312169312168*G0_1_0_5_1_5 - 0.00338624338624337*G0_1_0_5_2_0 + 0.00253968253968253*G0_1_0_5_2_1 - 0.000846560846560858*G0_1_0_5_2_2 - 0.00507936507936506*G0_1_0_5_2_3 - 0.0101587301587301*G0_1_0_5_2_4 - 0.00846560846560842*G0_1_0_5_2_5 + 0.00507936507936506*G0_1_0_5_3_0 - 0.00507936507936506*G0_1_0_5_3_2 - 0.00677248677248675*G0_1_0_5_3_3 + 0.00677248677248672*G0_1_0_5_3_5 + 0.0186243386243385*G0_1_0_5_4_0 - 0.00507936507936505*G0_1_0_5_4_1 - 0.0101587301587301*G0_1_0_5_4_2 + 0.0203174603174602*G0_1_0_5_4_4 + 0.027089947089947*G0_1_0_5_4_5 + 0.032169312169312*G0_1_0_5_5_0 - 0.0169312169312168*G0_1_0_5_5_1 - 0.00846560846560842*G0_1_0_5_5_2 + 0.00677248677248673*G0_1_0_5_5_3 + 0.027089947089947*G0_1_0_5_5_4 + 0.0609523809523805*G0_1_0_5_5_5; + A[2] = -A[8] + 0.0174603174603174*G0_0_1_0_0_0 - 0.00179894179894179*G0_0_1_0_0_1 - 0.00126984126984126*G0_0_1_0_0_2 + 0.000423280423280423*G0_0_1_0_0_3 + 0.00423280423280421*G0_0_1_0_0_4 + 0.00634920634920632*G0_0_1_0_0_5 - 0.00179894179894179*G0_0_1_0_1_0 + 0.00179894179894178*G0_0_1_0_1_1 + 0.00063492063492063*G0_0_1_0_1_3 - 0.000634920634920632*G0_0_1_0_1_4 - 0.00126984126984126*G0_0_1_0_2_0 + 0.000529100529100526*G0_0_1_0_2_2 - 0.00021164021164021*G0_0_1_0_2_3 + 0.00021164021164021*G0_0_1_0_2_4 - 0.000846560846560842*G0_0_1_0_2_5 + 0.000423280423280423*G0_0_1_0_3_0 + 0.00063492063492063*G0_0_1_0_3_1 - 0.00021164021164021*G0_0_1_0_3_2 - 0.0021164021164021*G0_0_1_0_3_3 + 0.00042328042328042*G0_0_1_0_3_4 + 0.00084656084656084*G0_0_1_0_3_5 + 0.00423280423280421*G0_0_1_0_4_0 - 0.000634920634920632*G0_0_1_0_4_1 + 0.00021164021164021*G0_0_1_0_4_2 + 0.000423280423280421*G0_0_1_0_4_3 + 0.00550264550264547*G0_0_1_0_4_4 + 0.00296296296296295*G0_0_1_0_4_5 + 0.00634920634920632*G0_0_1_0_5_0 - 0.000846560846560842*G0_0_1_0_5_2 + 0.00084656084656084*G0_0_1_0_5_3 + 0.00296296296296295*G0_0_1_0_5_4 + 0.00973544973544967*G0_0_1_0_5_5 - 0.00179894179894179*G0_0_1_1_0_0 + 0.00179894179894178*G0_0_1_1_0_1 + 0.00063492063492063*G0_0_1_1_0_3 - 0.000634920634920632*G0_0_1_1_0_4 + 0.00179894179894178*G0_0_1_1_1_0 - 0.0174603174603174*G0_0_1_1_1_1 + 0.00126984126984126*G0_0_1_1_1_2 - 0.0042328042328042*G0_0_1_1_1_3 - 0.000423280423280421*G0_0_1_1_1_4 - 0.00634920634920631*G0_0_1_1_1_5 + 0.00126984126984126*G0_0_1_1_2_1 - 0.000529100529100526*G0_0_1_1_2_2 - 0.000211640211640211*G0_0_1_1_2_3 + 0.00021164021164021*G0_0_1_1_2_4 + 0.000846560846560841*G0_0_1_1_2_5 + 0.00063492063492063*G0_0_1_1_3_0 - 0.0042328042328042*G0_0_1_1_3_1 - 0.000211640211640211*G0_0_1_1_3_2 - 0.00550264550264547*G0_0_1_1_3_3 - 0.000423280423280422*G0_0_1_1_3_4 - 0.00296296296296295*G0_0_1_1_3_5 - 0.000634920634920632*G0_0_1_1_4_0 - 0.000423280423280421*G0_0_1_1_4_1 + 0.00021164021164021*G0_0_1_1_4_2 - 0.000423280423280422*G0_0_1_1_4_3 + 0.00211640211640211*G0_0_1_1_4_4 - 0.000846560846560841*G0_0_1_1_4_5 - 0.00634920634920631*G0_0_1_1_5_1 + 0.000846560846560841*G0_0_1_1_5_2 - 0.00296296296296295*G0_0_1_1_5_3 - 0.000846560846560841*G0_0_1_1_5_4 - 0.00973544973544967*G0_0_1_1_5_5 - 0.00126984126984126*G0_0_1_2_0_0 + 0.000529100529100526*G0_0_1_2_0_2 - 0.00021164021164021*G0_0_1_2_0_3 + 0.00021164021164021*G0_0_1_2_0_4 - 0.000846560846560842*G0_0_1_2_0_5 + 0.00126984126984126*G0_0_1_2_1_1 - 0.000529100529100526*G0_0_1_2_1_2 - 0.000211640211640211*G0_0_1_2_1_3 + 0.00021164021164021*G0_0_1_2_1_4 + 0.000846560846560841*G0_0_1_2_1_5 + 0.000529100529100526*G0_0_1_2_2_0 - 0.000529100529100526*G0_0_1_2_2_1 + 0.00211640211640211*G0_0_1_2_2_3 - 0.0021164021164021*G0_0_1_2_2_4 - 0.00021164021164021*G0_0_1_2_3_0 - 0.000211640211640211*G0_0_1_2_3_1 + 0.00211640211640211*G0_0_1_2_3_2 + 0.00423280423280421*G0_0_1_2_3_3 + 0.000423280423280422*G0_0_1_2_3_5 + 0.00021164021164021*G0_0_1_2_4_0 + 0.00021164021164021*G0_0_1_2_4_1 - 0.0021164021164021*G0_0_1_2_4_2 - 0.00423280423280421*G0_0_1_2_4_4 - 0.000423280423280422*G0_0_1_2_4_5 - 0.000846560846560842*G0_0_1_2_5_0 + 0.000846560846560841*G0_0_1_2_5_1 + 0.000423280423280422*G0_0_1_2_5_3 - 0.000423280423280422*G0_0_1_2_5_4 + 0.000423280423280423*G0_0_1_3_0_0 + 0.00063492063492063*G0_0_1_3_0_1 - 0.00021164021164021*G0_0_1_3_0_2 - 0.0021164021164021*G0_0_1_3_0_3 + 0.00042328042328042*G0_0_1_3_0_4 + 0.00084656084656084*G0_0_1_3_0_5 + 0.00063492063492063*G0_0_1_3_1_0 - 0.0042328042328042*G0_0_1_3_1_1 - 0.000211640211640211*G0_0_1_3_1_2 - 0.00550264550264547*G0_0_1_3_1_3 - 0.000423280423280422*G0_0_1_3_1_4 - 0.00296296296296295*G0_0_1_3_1_5 - 0.00021164021164021*G0_0_1_3_2_0 - 0.000211640211640211*G0_0_1_3_2_1 + 0.00211640211640211*G0_0_1_3_2_2 + 0.00423280423280421*G0_0_1_3_2_3 + 0.000423280423280422*G0_0_1_3_2_5 - 0.0021164021164021*G0_0_1_3_3_0 - 0.00550264550264547*G0_0_1_3_3_1 + 0.00423280423280421*G0_0_1_3_3_2 + 0.0457142857142855*G0_0_1_3_3_3 + 0.00507936507936507*G0_0_1_3_3_4 + 0.00338624338624338*G0_0_1_3_3_5 + 0.00042328042328042*G0_0_1_3_4_0 - 0.000423280423280422*G0_0_1_3_4_1 + 0.00507936507936507*G0_0_1_3_4_3 - 0.00507936507936505*G0_0_1_3_4_4 + 0.00084656084656084*G0_0_1_3_5_0 - 0.00296296296296295*G0_0_1_3_5_1 + 0.000423280423280422*G0_0_1_3_5_2 + 0.00338624338624338*G0_0_1_3_5_3 - 0.00169312169312168*G0_0_1_3_5_5 + 0.00423280423280421*G0_0_1_4_0_0 - 0.000634920634920632*G0_0_1_4_0_1 + 0.00021164021164021*G0_0_1_4_0_2 + 0.00042328042328042*G0_0_1_4_0_3 + 0.00550264550264548*G0_0_1_4_0_4 + 0.00296296296296295*G0_0_1_4_0_5 - 0.000634920634920632*G0_0_1_4_1_0 - 0.000423280423280421*G0_0_1_4_1_1 + 0.00021164021164021*G0_0_1_4_1_2 - 0.000423280423280422*G0_0_1_4_1_3 + 0.00211640211640211*G0_0_1_4_1_4 - 0.000846560846560841*G0_0_1_4_1_5 + 0.00021164021164021*G0_0_1_4_2_0 + 0.00021164021164021*G0_0_1_4_2_1 - 0.0021164021164021*G0_0_1_4_2_2 - 0.00423280423280421*G0_0_1_4_2_4 - 0.000423280423280422*G0_0_1_4_2_5 + 0.000423280423280421*G0_0_1_4_3_0 - 0.000423280423280422*G0_0_1_4_3_1 + 0.00507936507936506*G0_0_1_4_3_3 - 0.00507936507936505*G0_0_1_4_3_4 + 0.00550264550264548*G0_0_1_4_4_0 + 0.00211640211640211*G0_0_1_4_4_1 - 0.00423280423280421*G0_0_1_4_4_2 - 0.00507936507936505*G0_0_1_4_4_3 - 0.0457142857142855*G0_0_1_4_4_4 - 0.00338624338624338*G0_0_1_4_4_5 + 0.00296296296296295*G0_0_1_4_5_0 - 0.000846560846560841*G0_0_1_4_5_1 - 0.000423280423280422*G0_0_1_4_5_2 - 0.00338624338624338*G0_0_1_4_5_4 + 0.00169312169312168*G0_0_1_4_5_5 + 0.00634920634920632*G0_0_1_5_0_0 - 0.000846560846560842*G0_0_1_5_0_2 + 0.00084656084656084*G0_0_1_5_0_3 + 0.00296296296296295*G0_0_1_5_0_4 + 0.00973544973544967*G0_0_1_5_0_5 - 0.00634920634920631*G0_0_1_5_1_1 + 0.000846560846560841*G0_0_1_5_1_2 - 0.00296296296296295*G0_0_1_5_1_3 - 0.000846560846560841*G0_0_1_5_1_4 - 0.00973544973544967*G0_0_1_5_1_5 - 0.000846560846560842*G0_0_1_5_2_0 + 0.000846560846560841*G0_0_1_5_2_1 + 0.000423280423280422*G0_0_1_5_2_3 - 0.000423280423280422*G0_0_1_5_2_4 + 0.00084656084656084*G0_0_1_5_3_0 - 0.00296296296296295*G0_0_1_5_3_1 + 0.000423280423280422*G0_0_1_5_3_2 + 0.00338624338624338*G0_0_1_5_3_3 - 0.00169312169312168*G0_0_1_5_3_5 + 0.00296296296296295*G0_0_1_5_4_0 - 0.000846560846560841*G0_0_1_5_4_1 - 0.000423280423280422*G0_0_1_5_4_2 - 0.00338624338624338*G0_0_1_5_4_4 + 0.00169312169312168*G0_0_1_5_4_5 + 0.00973544973544967*G0_0_1_5_5_0 - 0.00973544973544967*G0_0_1_5_5_1 - 0.00169312169312168*G0_0_1_5_5_3 + 0.00169312169312168*G0_0_1_5_5_4 + 0.0134920634920634*G0_1_1_0_0_0 - 0.00132275132275132*G0_1_1_0_0_1 - 0.00079365079365079*G0_1_1_0_0_2 + 0.000529100529100527*G0_1_1_0_0_3 + 0.00370370370370368*G0_1_1_0_0_4 + 0.00582010582010579*G0_1_1_0_0_5 - 0.00132275132275132*G0_1_1_0_1_0 + 0.000476190476190473*G0_1_1_0_1_1 + 0.000238095238095236*G0_1_1_0_1_2 + 0.00021164021164021*G0_1_1_0_1_3 - 0.000423280423280421*G0_1_1_0_1_4 - 0.00116402116402116*G0_1_1_0_1_5 - 0.00079365079365079*G0_1_1_0_2_0 + 0.000238095238095237*G0_1_1_0_2_1 - 0.000793650793650787*G0_1_1_0_2_2 - 0.00063492063492063*G0_1_1_0_2_3 - 0.000952380952380947*G0_1_1_0_2_4 - 0.000634920634920632*G0_1_1_0_2_5 + 0.000529100529100527*G0_1_1_0_3_0 + 0.00021164021164021*G0_1_1_0_3_1 - 0.00063492063492063*G0_1_1_0_3_2 - 0.00169312169312168*G0_1_1_0_3_3 - 0.00021164021164021*G0_1_1_0_3_4 + 0.00021164021164021*G0_1_1_0_3_5 + 0.00370370370370368*G0_1_1_0_4_0 - 0.000423280423280421*G0_1_1_0_4_1 - 0.000952380952380947*G0_1_1_0_4_2 - 0.00021164021164021*G0_1_1_0_4_3 + 0.00211640211640211*G0_1_1_0_4_4 + 0.0021164021164021*G0_1_1_0_4_5 + 0.00582010582010579*G0_1_1_0_5_0 - 0.00116402116402116*G0_1_1_0_5_1 - 0.000634920634920632*G0_1_1_0_5_2 + 0.00021164021164021*G0_1_1_0_5_3 + 0.0021164021164021*G0_1_1_0_5_4 + 0.00634920634920631*G0_1_1_0_5_5 - 0.00132275132275132*G0_1_1_1_0_0 + 0.000476190476190473*G0_1_1_1_0_1 + 0.000238095238095236*G0_1_1_1_0_2 + 0.00021164021164021*G0_1_1_1_0_3 - 0.000423280423280421*G0_1_1_1_0_4 - 0.00116402116402116*G0_1_1_1_0_5 + 0.000476190476190473*G0_1_1_1_1_0 - 0.00396825396825395*G0_1_1_1_1_1 + 0.000476190476190474*G0_1_1_1_1_2 - 0.000529100529100526*G0_1_1_1_1_3 + 0.000105820105820105*G0_1_1_1_1_4 - 0.000529100529100527*G0_1_1_1_1_5 + 0.000238095238095237*G0_1_1_1_2_0 + 0.000476190476190474*G0_1_1_1_2_1 - 0.00132275132275131*G0_1_1_1_2_2 - 0.00116402116402116*G0_1_1_1_2_3 - 0.000423280423280421*G0_1_1_1_2_4 + 0.00021164021164021*G0_1_1_1_2_5 + 0.00021164021164021*G0_1_1_1_3_0 - 0.000529100529100526*G0_1_1_1_3_1 - 0.00116402116402116*G0_1_1_1_3_2 - 0.00338624338624337*G0_1_1_1_3_3 - 0.000634920634920632*G0_1_1_1_3_4 - 0.000846560846560842*G0_1_1_1_3_5 - 0.000423280423280421*G0_1_1_1_4_0 + 0.000105820105820105*G0_1_1_1_4_1 - 0.000423280423280421*G0_1_1_1_4_2 - 0.000634920634920632*G0_1_1_1_4_3 + 0.000423280423280422*G0_1_1_1_4_4 - 0.000634920634920631*G0_1_1_1_4_5 - 0.00116402116402116*G0_1_1_1_5_0 - 0.000529100529100527*G0_1_1_1_5_1 + 0.00021164021164021*G0_1_1_1_5_2 - 0.000846560846560842*G0_1_1_1_5_3 - 0.000634920634920631*G0_1_1_1_5_4 - 0.00338624338624336*G0_1_1_1_5_5 - 0.00079365079365079*G0_1_1_2_0_0 + 0.000238095238095237*G0_1_1_2_0_1 - 0.000793650793650787*G0_1_1_2_0_2 - 0.00063492063492063*G0_1_1_2_0_3 - 0.000952380952380947*G0_1_1_2_0_4 - 0.000634920634920632*G0_1_1_2_0_5 + 0.000238095238095237*G0_1_1_2_1_0 + 0.000476190476190474*G0_1_1_2_1_1 - 0.00132275132275131*G0_1_1_2_1_2 - 0.00116402116402116*G0_1_1_2_1_3 - 0.000423280423280421*G0_1_1_2_1_4 + 0.00021164021164021*G0_1_1_2_1_5 - 0.000793650793650787*G0_1_1_2_2_0 - 0.00132275132275131*G0_1_1_2_2_1 + 0.0134920634920634*G0_1_1_2_2_2 + 0.00582010582010579*G0_1_1_2_2_3 + 0.00370370370370368*G0_1_1_2_2_4 + 0.00052910052910053*G0_1_1_2_2_5 - 0.00063492063492063*G0_1_1_2_3_0 - 0.00116402116402116*G0_1_1_2_3_1 + 0.00582010582010579*G0_1_1_2_3_2 + 0.00634920634920631*G0_1_1_2_3_3 + 0.00211640211640211*G0_1_1_2_3_4 + 0.000211640211640213*G0_1_1_2_3_5 - 0.000952380952380947*G0_1_1_2_4_0 - 0.000423280423280421*G0_1_1_2_4_1 + 0.00370370370370368*G0_1_1_2_4_2 + 0.00211640211640211*G0_1_1_2_4_3 + 0.0021164021164021*G0_1_1_2_4_4 - 0.000211640211640209*G0_1_1_2_4_5 - 0.000634920634920632*G0_1_1_2_5_0 + 0.00021164021164021*G0_1_1_2_5_1 + 0.00052910052910053*G0_1_1_2_5_2 + 0.000211640211640213*G0_1_1_2_5_3 - 0.000211640211640209*G0_1_1_2_5_4 - 0.00169312169312168*G0_1_1_2_5_5 + 0.000529100529100527*G0_1_1_3_0_0 + 0.00021164021164021*G0_1_1_3_0_1 - 0.00063492063492063*G0_1_1_3_0_2 - 0.00169312169312168*G0_1_1_3_0_3 - 0.00021164021164021*G0_1_1_3_0_4 + 0.00021164021164021*G0_1_1_3_0_5 + 0.00021164021164021*G0_1_1_3_1_0 - 0.000529100529100526*G0_1_1_3_1_1 - 0.00116402116402116*G0_1_1_3_1_2 - 0.00338624338624337*G0_1_1_3_1_3 - 0.000634920634920632*G0_1_1_3_1_4 - 0.000846560846560842*G0_1_1_3_1_5 - 0.00063492063492063*G0_1_1_3_2_0 - 0.00116402116402116*G0_1_1_3_2_1 + 0.00582010582010579*G0_1_1_3_2_2 + 0.00634920634920631*G0_1_1_3_2_3 + 0.00211640211640211*G0_1_1_3_2_4 + 0.000211640211640213*G0_1_1_3_2_5 - 0.00169312169312168*G0_1_1_3_3_0 - 0.00338624338624337*G0_1_1_3_3_1 + 0.00634920634920631*G0_1_1_3_3_2 + 0.029206349206349*G0_1_1_3_3_3 + 0.00465608465608464*G0_1_1_3_3_4 + 0.00296296296296296*G0_1_1_3_3_5 - 0.00021164021164021*G0_1_1_3_4_0 - 0.000634920634920632*G0_1_1_3_4_1 + 0.00211640211640211*G0_1_1_3_4_2 + 0.00465608465608464*G0_1_1_3_4_3 - 0.000423280423280421*G0_1_1_3_4_4 + 0.000846560846560843*G0_1_1_3_4_5 + 0.00021164021164021*G0_1_1_3_5_0 - 0.000846560846560842*G0_1_1_3_5_1 + 0.000211640211640213*G0_1_1_3_5_2 + 0.00296296296296296*G0_1_1_3_5_3 + 0.000846560846560843*G0_1_1_3_5_4 + 0.00296296296296295*G0_1_1_3_5_5 + 0.00370370370370368*G0_1_1_4_0_0 - 0.000423280423280421*G0_1_1_4_0_1 - 0.000952380952380947*G0_1_1_4_0_2 - 0.00021164021164021*G0_1_1_4_0_3 + 0.00211640211640211*G0_1_1_4_0_4 + 0.0021164021164021*G0_1_1_4_0_5 - 0.000423280423280421*G0_1_1_4_1_0 + 0.000105820105820105*G0_1_1_4_1_1 - 0.000423280423280421*G0_1_1_4_1_2 - 0.000634920634920632*G0_1_1_4_1_3 + 0.000423280423280421*G0_1_1_4_1_4 - 0.000634920634920631*G0_1_1_4_1_5 - 0.000952380952380947*G0_1_1_4_2_0 - 0.000423280423280421*G0_1_1_4_2_1 + 0.00370370370370368*G0_1_1_4_2_2 + 0.00211640211640211*G0_1_1_4_2_3 + 0.0021164021164021*G0_1_1_4_2_4 - 0.000211640211640209*G0_1_1_4_2_5 - 0.00021164021164021*G0_1_1_4_3_0 - 0.000634920634920632*G0_1_1_4_3_1 + 0.00211640211640211*G0_1_1_4_3_2 + 0.00465608465608464*G0_1_1_4_3_3 - 0.000423280423280421*G0_1_1_4_3_4 + 0.000846560846560843*G0_1_1_4_3_5 + 0.00211640211640211*G0_1_1_4_4_0 + 0.000423280423280422*G0_1_1_4_4_1 + 0.0021164021164021*G0_1_1_4_4_2 - 0.000423280423280421*G0_1_1_4_4_3 - 0.0165079365079364*G0_1_1_4_4_4 - 0.000423280423280425*G0_1_1_4_4_5 + 0.0021164021164021*G0_1_1_4_5_0 - 0.000634920634920631*G0_1_1_4_5_1 - 0.000211640211640209*G0_1_1_4_5_2 + 0.000846560846560843*G0_1_1_4_5_3 - 0.000423280423280425*G0_1_1_4_5_4 + 0.00465608465608463*G0_1_1_4_5_5 + 0.00582010582010579*G0_1_1_5_0_0 - 0.00116402116402116*G0_1_1_5_0_1 - 0.000634920634920632*G0_1_1_5_0_2 + 0.00021164021164021*G0_1_1_5_0_3 + 0.0021164021164021*G0_1_1_5_0_4 + 0.00634920634920631*G0_1_1_5_0_5 - 0.00116402116402116*G0_1_1_5_1_0 - 0.000529100529100527*G0_1_1_5_1_1 + 0.00021164021164021*G0_1_1_5_1_2 - 0.000846560846560842*G0_1_1_5_1_3 - 0.000634920634920631*G0_1_1_5_1_4 - 0.00338624338624336*G0_1_1_5_1_5 - 0.000634920634920632*G0_1_1_5_2_0 + 0.00021164021164021*G0_1_1_5_2_1 + 0.00052910052910053*G0_1_1_5_2_2 + 0.000211640211640213*G0_1_1_5_2_3 - 0.000211640211640209*G0_1_1_5_2_4 - 0.00169312169312168*G0_1_1_5_2_5 + 0.00021164021164021*G0_1_1_5_3_0 - 0.000846560846560842*G0_1_1_5_3_1 + 0.000211640211640213*G0_1_1_5_3_2 + 0.00296296296296296*G0_1_1_5_3_3 + 0.000846560846560843*G0_1_1_5_3_4 + 0.00296296296296295*G0_1_1_5_3_5 + 0.0021164021164021*G0_1_1_5_4_0 - 0.000634920634920631*G0_1_1_5_4_1 - 0.000211640211640209*G0_1_1_5_4_2 + 0.000846560846560843*G0_1_1_5_4_3 - 0.000423280423280425*G0_1_1_5_4_4 + 0.00465608465608463*G0_1_1_5_4_5 + 0.00634920634920631*G0_1_1_5_5_0 - 0.00338624338624336*G0_1_1_5_5_1 - 0.00169312169312168*G0_1_1_5_5_2 + 0.00296296296296295*G0_1_1_5_5_3 + 0.00465608465608463*G0_1_1_5_5_4 + 0.029206349206349*G0_1_1_5_5_5; + A[20] = A[2] - 0.015079365079365*G0_0_1_0_0_0 + 0.001005291005291*G0_0_1_0_0_1 + 0.00206349206349205*G0_0_1_0_0_2 + 0.00116402116402115*G0_0_1_0_0_3 - 0.00158730158730158*G0_0_1_0_0_4 - 0.00582010582010579*G0_0_1_0_0_5 + 0.001005291005291*G0_0_1_0_1_0 - 0.000793650793650788*G0_0_1_0_1_1 + 0.000502645502645498*G0_0_1_0_1_2 + 0.00169312169312168*G0_0_1_0_1_3 + 0.00232804232804231*G0_0_1_0_1_4 + 0.002010582010582*G0_0_1_0_1_5 + 0.00206349206349205*G0_0_1_0_2_0 + 0.000502645502645498*G0_0_1_0_2_1 - 0.00502645502645498*G0_0_1_0_2_2 - 0.00253968253968252*G0_0_1_0_2_3 - 0.00433862433862431*G0_0_1_0_2_4 + 0.000211640211640209*G0_0_1_0_2_5 + 0.00116402116402115*G0_0_1_0_3_0 + 0.00169312169312168*G0_0_1_0_3_1 - 0.00253968253968252*G0_0_1_0_3_2 - 0.00804232804232799*G0_0_1_0_3_3 - 0.00698412698412694*G0_0_1_0_3_4 - 0.00275132275132274*G0_0_1_0_3_5 - 0.00158730158730158*G0_0_1_0_4_0 + 0.00232804232804231*G0_0_1_0_4_1 - 0.00433862433862431*G0_0_1_0_4_2 - 0.00698412698412694*G0_0_1_0_4_3 - 0.016084656084656*G0_0_1_0_4_4 - 0.00507936507936505*G0_0_1_0_4_5 - 0.00582010582010579*G0_0_1_0_5_0 + 0.002010582010582*G0_0_1_0_5_1 + 0.000211640211640209*G0_0_1_0_5_2 - 0.00275132275132274*G0_0_1_0_5_3 - 0.00507936507936505*G0_0_1_0_5_4 - 0.00761904761904757*G0_0_1_0_5_5 + 0.001005291005291*G0_0_1_1_0_0 - 0.000793650793650789*G0_0_1_1_0_1 + 0.000502645502645498*G0_0_1_1_0_2 + 0.00169312169312168*G0_0_1_1_0_3 + 0.00232804232804231*G0_0_1_1_0_4 + 0.002010582010582*G0_0_1_1_0_5 - 0.000793650793650788*G0_0_1_1_1_0 + 0.00238095238095237*G0_0_1_1_1_1 + 0.000793650793650788*G0_0_1_1_1_2 + 0.00264550264550263*G0_0_1_1_1_3 + 0.00158730158730158*G0_0_1_1_1_4 + 0.00052910052910053*G0_0_1_1_1_5 + 0.000502645502645498*G0_0_1_1_2_0 + 0.000793650793650788*G0_0_1_1_2_1 - 0.00449735449735446*G0_0_1_1_2_2 - 0.0041269841269841*G0_0_1_1_2_3 - 0.00275132275132273*G0_0_1_1_2_4 - 0.000634920634920633*G0_0_1_1_2_5 + 0.00169312169312168*G0_0_1_1_3_0 + 0.00264550264550263*G0_0_1_1_3_1 - 0.0041269841269841*G0_0_1_1_3_2 - 0.0105820105820105*G0_0_1_1_3_3 - 0.00656084656084653*G0_0_1_1_3_4 - 0.00211640211640211*G0_0_1_1_3_5 + 0.00232804232804231*G0_0_1_1_4_0 + 0.00158730158730158*G0_0_1_1_4_1 - 0.00275132275132273*G0_0_1_1_4_2 - 0.00656084656084652*G0_0_1_1_4_3 - 0.0101587301587301*G0_0_1_1_4_4 - 0.0019047619047619*G0_0_1_1_4_5 + 0.002010582010582*G0_0_1_1_5_0 + 0.00052910052910053*G0_0_1_1_5_1 - 0.000634920634920633*G0_0_1_1_5_2 - 0.00211640211640211*G0_0_1_1_5_3 - 0.0019047619047619*G0_0_1_1_5_4 + 0.0021164021164021*G0_0_1_1_5_5 + 0.00206349206349205*G0_0_1_2_0_0 + 0.000502645502645498*G0_0_1_2_0_1 - 0.00502645502645498*G0_0_1_2_0_2 - 0.00253968253968252*G0_0_1_2_0_3 - 0.00433862433862431*G0_0_1_2_0_4 + 0.000211640211640209*G0_0_1_2_0_5 + 0.000502645502645498*G0_0_1_2_1_0 + 0.000793650793650788*G0_0_1_2_1_1 - 0.00449735449735446*G0_0_1_2_1_2 - 0.0041269841269841*G0_0_1_2_1_3 - 0.00275132275132273*G0_0_1_2_1_4 - 0.000634920634920633*G0_0_1_2_1_5 - 0.00502645502645498*G0_0_1_2_2_0 - 0.00449735449735446*G0_0_1_2_2_1 + 0.0499999999999996*G0_0_1_2_2_2 + 0.0195767195767194*G0_0_1_2_2_3 + 0.0216931216931215*G0_0_1_2_2_4 + 0.00158730158730159*G0_0_1_2_2_5 - 0.00253968253968252*G0_0_1_2_3_0 - 0.0041269841269841*G0_0_1_2_3_1 + 0.0195767195767194*G0_0_1_2_3_2 + 0.0190476190476189*G0_0_1_2_3_3 + 0.0105820105820105*G0_0_1_2_3_4 + 0.0019047619047619*G0_0_1_2_3_5 - 0.00433862433862431*G0_0_1_2_4_0 - 0.00275132275132273*G0_0_1_2_4_1 + 0.0216931216931215*G0_0_1_2_4_2 + 0.0105820105820105*G0_0_1_2_4_3 + 0.0232804232804232*G0_0_1_2_4_4 + 0.00232804232804232*G0_0_1_2_4_5 + 0.000211640211640209*G0_0_1_2_5_0 - 0.000634920634920633*G0_0_1_2_5_1 + 0.00158730158730159*G0_0_1_2_5_2 + 0.0019047619047619*G0_0_1_2_5_3 + 0.00232804232804232*G0_0_1_2_5_4 + 0.00253968253968252*G0_0_1_2_5_5 + 0.00116402116402115*G0_0_1_3_0_0 + 0.00169312169312168*G0_0_1_3_0_1 - 0.00253968253968252*G0_0_1_3_0_2 - 0.00804232804232799*G0_0_1_3_0_3 - 0.00698412698412694*G0_0_1_3_0_4 - 0.00275132275132274*G0_0_1_3_0_5 + 0.00169312169312168*G0_0_1_3_1_0 + 0.00264550264550263*G0_0_1_3_1_1 - 0.0041269841269841*G0_0_1_3_1_2 - 0.0105820105820105*G0_0_1_3_1_3 - 0.00656084656084652*G0_0_1_3_1_4 - 0.00211640211640211*G0_0_1_3_1_5 - 0.00253968253968252*G0_0_1_3_2_0 - 0.0041269841269841*G0_0_1_3_2_1 + 0.0195767195767194*G0_0_1_3_2_2 + 0.0190476190476189*G0_0_1_3_2_3 + 0.0105820105820105*G0_0_1_3_2_4 + 0.0019047619047619*G0_0_1_3_2_5 - 0.00804232804232799*G0_0_1_3_3_0 - 0.0105820105820105*G0_0_1_3_3_1 + 0.0190476190476189*G0_0_1_3_3_2 + 0.072380952380952*G0_0_1_3_3_3 + 0.0292063492063491*G0_0_1_3_3_4 + 0.0122751322751322*G0_0_1_3_3_5 - 0.00698412698412694*G0_0_1_3_4_0 - 0.00656084656084652*G0_0_1_3_4_1 + 0.0105820105820105*G0_0_1_3_4_2 + 0.0292063492063491*G0_0_1_3_4_3 + 0.0342857142857141*G0_0_1_3_4_4 + 0.00931216931216928*G0_0_1_3_4_5 - 0.00275132275132274*G0_0_1_3_5_0 - 0.00211640211640211*G0_0_1_3_5_1 + 0.0019047619047619*G0_0_1_3_5_2 + 0.0122751322751322*G0_0_1_3_5_3 + 0.00931216931216928*G0_0_1_3_5_4 + 0.000423280423280437*G0_0_1_3_5_5 - 0.00158730158730158*G0_0_1_4_0_0 + 0.00232804232804231*G0_0_1_4_0_1 - 0.00433862433862431*G0_0_1_4_0_2 - 0.00698412698412694*G0_0_1_4_0_3 - 0.016084656084656*G0_0_1_4_0_4 - 0.00507936507936505*G0_0_1_4_0_5 + 0.00232804232804231*G0_0_1_4_1_0 + 0.00158730158730158*G0_0_1_4_1_1 - 0.00275132275132273*G0_0_1_4_1_2 - 0.00656084656084652*G0_0_1_4_1_3 - 0.0101587301587301*G0_0_1_4_1_4 - 0.0019047619047619*G0_0_1_4_1_5 - 0.00433862433862431*G0_0_1_4_2_0 - 0.00275132275132273*G0_0_1_4_2_1 + 0.0216931216931215*G0_0_1_4_2_2 + 0.0105820105820105*G0_0_1_4_2_3 + 0.0232804232804232*G0_0_1_4_2_4 + 0.00232804232804232*G0_0_1_4_2_5 - 0.00698412698412694*G0_0_1_4_3_0 - 0.00656084656084652*G0_0_1_4_3_1 + 0.0105820105820105*G0_0_1_4_3_2 + 0.0292063492063491*G0_0_1_4_3_3 + 0.0342857142857141*G0_0_1_4_3_4 + 0.00931216931216927*G0_0_1_4_3_5 - 0.016084656084656*G0_0_1_4_4_0 - 0.0101587301587301*G0_0_1_4_4_1 + 0.0232804232804231*G0_0_1_4_4_2 + 0.0342857142857141*G0_0_1_4_4_3 + 0.118095238095238*G0_0_1_4_4_4 + 0.0156613756613756*G0_0_1_4_4_5 - 0.00507936507936505*G0_0_1_4_5_0 - 0.0019047619047619*G0_0_1_4_5_1 + 0.00232804232804232*G0_0_1_4_5_2 + 0.00931216931216927*G0_0_1_4_5_3 + 0.0156613756613756*G0_0_1_4_5_4 - 0.00126984126984124*G0_0_1_4_5_5 - 0.00582010582010579*G0_0_1_5_0_0 + 0.002010582010582*G0_0_1_5_0_1 + 0.00021164021164021*G0_0_1_5_0_2 - 0.00275132275132274*G0_0_1_5_0_3 - 0.00507936507936505*G0_0_1_5_0_4 - 0.00761904761904758*G0_0_1_5_0_5 + 0.002010582010582*G0_0_1_5_1_0 + 0.00052910052910053*G0_0_1_5_1_1 - 0.000634920634920633*G0_0_1_5_1_2 - 0.00211640211640211*G0_0_1_5_1_3 - 0.0019047619047619*G0_0_1_5_1_4 + 0.0021164021164021*G0_0_1_5_1_5 + 0.000211640211640209*G0_0_1_5_2_0 - 0.000634920634920633*G0_0_1_5_2_1 + 0.00158730158730159*G0_0_1_5_2_2 + 0.0019047619047619*G0_0_1_5_2_3 + 0.00232804232804232*G0_0_1_5_2_4 + 0.00253968253968252*G0_0_1_5_2_5 - 0.00275132275132274*G0_0_1_5_3_0 - 0.00211640211640211*G0_0_1_5_3_1 + 0.0019047619047619*G0_0_1_5_3_2 + 0.0122751322751322*G0_0_1_5_3_3 + 0.00931216931216928*G0_0_1_5_3_4 + 0.000423280423280437*G0_0_1_5_3_5 - 0.00507936507936505*G0_0_1_5_4_0 - 0.0019047619047619*G0_0_1_5_4_1 + 0.00232804232804232*G0_0_1_5_4_2 + 0.00931216931216928*G0_0_1_5_4_3 + 0.0156613756613756*G0_0_1_5_4_4 - 0.00126984126984124*G0_0_1_5_4_5 - 0.00761904761904757*G0_0_1_5_5_0 + 0.0021164021164021*G0_0_1_5_5_1 + 0.00253968253968252*G0_0_1_5_5_2 + 0.000423280423280438*G0_0_1_5_5_3 - 0.00126984126984124*G0_0_1_5_5_4 - 0.034285714285714*G0_0_1_5_5_5 - 0.015079365079365*G0_1_1_0_0_0 + 0.00111111111111111*G0_1_1_0_0_1 + 0.0011111111111111*G0_1_1_0_0_2 - 0.000105820105820106*G0_1_1_0_0_3 - 0.00370370370370368*G0_1_1_0_0_4 - 0.00793650793650789*G0_1_1_0_0_5 + 0.00111111111111111*G0_1_1_0_1_0 + 0.0011111111111111*G0_1_1_0_1_1 - 0.000343915343915342*G0_1_1_0_1_2 + 0.00126984126984126*G0_1_1_0_1_3 + 0.00126984126984126*G0_1_1_0_1_4 + 0.00391534391534389*G0_1_1_0_1_5 + 0.0011111111111111*G0_1_1_0_2_0 - 0.000343915343915342*G0_1_1_0_2_1 + 0.000264550264550264*G0_1_1_0_2_2 + 0.000529100529100527*G0_1_1_0_2_4 + 0.000423280423280422*G0_1_1_0_2_5 - 0.000105820105820106*G0_1_1_0_3_0 + 0.00126984126984126*G0_1_1_0_3_1 - 0.00296296296296295*G0_1_1_0_3_3 - 0.00232804232804231*G0_1_1_0_3_4 - 0.000634920634920634*G0_1_1_0_3_5 - 0.00370370370370368*G0_1_1_0_4_0 + 0.00126984126984126*G0_1_1_0_4_1 + 0.000529100529100527*G0_1_1_0_4_2 - 0.00232804232804231*G0_1_1_0_4_3 - 0.00507936507936505*G0_1_1_0_4_4 - 0.00338624338624337*G0_1_1_0_4_5 - 0.00793650793650789*G0_1_1_0_5_0 + 0.00391534391534389*G0_1_1_0_5_1 + 0.000423280423280422*G0_1_1_0_5_2 - 0.000634920634920634*G0_1_1_0_5_3 - 0.00338624338624337*G0_1_1_0_5_4 - 0.00507936507936505*G0_1_1_0_5_5 + 0.00111111111111111*G0_1_1_1_0_0 + 0.0011111111111111*G0_1_1_1_0_1 - 0.000343915343915342*G0_1_1_1_0_2 + 0.00126984126984126*G0_1_1_1_0_3 + 0.00126984126984126*G0_1_1_1_0_4 + 0.00391534391534389*G0_1_1_1_0_5 + 0.0011111111111111*G0_1_1_1_1_0 - 0.015079365079365*G0_1_1_1_1_1 + 0.0011111111111111*G0_1_1_1_1_2 - 0.00370370370370368*G0_1_1_1_1_3 - 0.000105820105820105*G0_1_1_1_1_4 - 0.00793650793650788*G0_1_1_1_1_5 - 0.000343915343915342*G0_1_1_1_2_0 + 0.0011111111111111*G0_1_1_1_2_1 + 0.000264550264550264*G0_1_1_1_2_2 + 0.000529100529100526*G0_1_1_1_2_3 + 0.000423280423280421*G0_1_1_1_2_5 + 0.00126984126984126*G0_1_1_1_3_0 - 0.00370370370370368*G0_1_1_1_3_1 + 0.000529100529100526*G0_1_1_1_3_2 - 0.00507936507936505*G0_1_1_1_3_3 - 0.00232804232804232*G0_1_1_1_3_4 - 0.00338624338624337*G0_1_1_1_3_5 + 0.00126984126984126*G0_1_1_1_4_0 - 0.000105820105820105*G0_1_1_1_4_1 - 0.00232804232804232*G0_1_1_1_4_3 - 0.00296296296296295*G0_1_1_1_4_4 - 0.000634920634920633*G0_1_1_1_4_5 + 0.00391534391534389*G0_1_1_1_5_0 - 0.00793650793650788*G0_1_1_1_5_1 + 0.000423280423280421*G0_1_1_1_5_2 - 0.00338624338624337*G0_1_1_1_5_3 - 0.000634920634920633*G0_1_1_1_5_4 - 0.00507936507936505*G0_1_1_1_5_5 + 0.0011111111111111*G0_1_1_2_0_0 - 0.000343915343915342*G0_1_1_2_0_1 + 0.000264550264550264*G0_1_1_2_0_2 + 0.000529100529100527*G0_1_1_2_0_4 + 0.000423280423280422*G0_1_1_2_0_5 - 0.000343915343915342*G0_1_1_2_1_0 + 0.0011111111111111*G0_1_1_2_1_1 + 0.000264550264550264*G0_1_1_2_1_2 + 0.000529100529100526*G0_1_1_2_1_3 + 0.000423280423280421*G0_1_1_2_1_5 + 0.000264550264550264*G0_1_1_2_2_0 + 0.000264550264550265*G0_1_1_2_2_1 - 0.00873015873015871*G0_1_1_2_2_2 - 0.00158730158730159*G0_1_1_2_2_3 - 0.00158730158730158*G0_1_1_2_2_4 - 0.000529100529100528*G0_1_1_2_2_5 + 0.000529100529100526*G0_1_1_2_3_1 - 0.00158730158730159*G0_1_1_2_3_2 + 0.00105820105820105*G0_1_1_2_3_5 + 0.000529100529100527*G0_1_1_2_4_0 - 0.00158730158730158*G0_1_1_2_4_2 + 0.00105820105820105*G0_1_1_2_4_5 + 0.000423280423280422*G0_1_1_2_5_0 + 0.000423280423280421*G0_1_1_2_5_1 - 0.000529100529100528*G0_1_1_2_5_2 + 0.00105820105820105*G0_1_1_2_5_3 + 0.00105820105820105*G0_1_1_2_5_4 + 0.00550264550264547*G0_1_1_2_5_5 - 0.000105820105820106*G0_1_1_3_0_0 + 0.00126984126984126*G0_1_1_3_0_1 - 0.00296296296296295*G0_1_1_3_0_3 - 0.00232804232804231*G0_1_1_3_0_4 - 0.000634920634920634*G0_1_1_3_0_5 + 0.00126984126984126*G0_1_1_3_1_0 - 0.00370370370370368*G0_1_1_3_1_1 + 0.000529100529100526*G0_1_1_3_1_2 - 0.00507936507936505*G0_1_1_3_1_3 - 0.00232804232804232*G0_1_1_3_1_4 - 0.00338624338624337*G0_1_1_3_1_5 + 0.000529100529100526*G0_1_1_3_2_1 - 0.00158730158730159*G0_1_1_3_2_2 + 0.00105820105820105*G0_1_1_3_2_5 - 0.00296296296296295*G0_1_1_3_3_0 - 0.00507936507936505*G0_1_1_3_3_1 + 0.0317460317460316*G0_1_1_3_3_3 + 0.0105820105820105*G0_1_1_3_3_4 + 0.0038095238095238*G0_1_1_3_3_5 - 0.00232804232804231*G0_1_1_3_4_0 - 0.00232804232804232*G0_1_1_3_4_1 + 0.0105820105820105*G0_1_1_3_4_3 + 0.0105820105820105*G0_1_1_3_4_4 + 0.00253968253968253*G0_1_1_3_4_5 - 0.000634920634920634*G0_1_1_3_5_0 - 0.00338624338624337*G0_1_1_3_5_1 + 0.00105820105820105*G0_1_1_3_5_2 + 0.00380952380952381*G0_1_1_3_5_3 + 0.00253968253968254*G0_1_1_3_5_4 - 0.00973544973544966*G0_1_1_3_5_5 - 0.00370370370370368*G0_1_1_4_0_0 + 0.00126984126984126*G0_1_1_4_0_1 + 0.000529100529100527*G0_1_1_4_0_2 - 0.00232804232804232*G0_1_1_4_0_3 - 0.00507936507936505*G0_1_1_4_0_4 - 0.00338624338624337*G0_1_1_4_0_5 + 0.00126984126984126*G0_1_1_4_1_0 - 0.000105820105820105*G0_1_1_4_1_1 - 0.00232804232804232*G0_1_1_4_1_3 - 0.00296296296296295*G0_1_1_4_1_4 - 0.000634920634920633*G0_1_1_4_1_5 + 0.000529100529100527*G0_1_1_4_2_0 - 0.00158730158730158*G0_1_1_4_2_2 + 0.00105820105820105*G0_1_1_4_2_5 - 0.00232804232804231*G0_1_1_4_3_0 - 0.00232804232804232*G0_1_1_4_3_1 + 0.0105820105820105*G0_1_1_4_3_3 + 0.0105820105820105*G0_1_1_4_3_4 + 0.00253968253968253*G0_1_1_4_3_5 - 0.00507936507936505*G0_1_1_4_4_0 - 0.00296296296296295*G0_1_1_4_4_1 + 0.0105820105820105*G0_1_1_4_4_3 + 0.0317460317460316*G0_1_1_4_4_4 + 0.0038095238095238*G0_1_1_4_4_5 - 0.00338624338624337*G0_1_1_4_5_0 - 0.000634920634920633*G0_1_1_4_5_1 + 0.00105820105820105*G0_1_1_4_5_2 + 0.00253968253968254*G0_1_1_4_5_3 + 0.0038095238095238*G0_1_1_4_5_4 - 0.00973544973544966*G0_1_1_4_5_5 - 0.00793650793650789*G0_1_1_5_0_0 + 0.00391534391534389*G0_1_1_5_0_1 + 0.000423280423280422*G0_1_1_5_0_2 - 0.000634920634920634*G0_1_1_5_0_3 - 0.00338624338624337*G0_1_1_5_0_4 - 0.00507936507936505*G0_1_1_5_0_5 + 0.00391534391534389*G0_1_1_5_1_0 - 0.00793650793650788*G0_1_1_5_1_1 + 0.000423280423280421*G0_1_1_5_1_2 - 0.00338624338624337*G0_1_1_5_1_3 - 0.000634920634920633*G0_1_1_5_1_4 - 0.00507936507936505*G0_1_1_5_1_5 + 0.000423280423280422*G0_1_1_5_2_0 + 0.000423280423280421*G0_1_1_5_2_1 - 0.000529100529100528*G0_1_1_5_2_2 + 0.00105820105820105*G0_1_1_5_2_3 + 0.00105820105820105*G0_1_1_5_2_4 + 0.00550264550264547*G0_1_1_5_2_5 - 0.000634920634920634*G0_1_1_5_3_0 - 0.00338624338624337*G0_1_1_5_3_1 + 0.00105820105820105*G0_1_1_5_3_2 + 0.00380952380952381*G0_1_1_5_3_3 + 0.00253968253968254*G0_1_1_5_3_4 - 0.00973544973544966*G0_1_1_5_3_5 - 0.00338624338624337*G0_1_1_5_4_0 - 0.000634920634920633*G0_1_1_5_4_1 + 0.00105820105820105*G0_1_1_5_4_2 + 0.00253968253968253*G0_1_1_5_4_3 + 0.0038095238095238*G0_1_1_5_4_4 - 0.00973544973544966*G0_1_1_5_4_5 - 0.00507936507936505*G0_1_1_5_5_0 - 0.00507936507936505*G0_1_1_5_5_1 + 0.00550264550264547*G0_1_1_5_5_2 - 0.00973544973544966*G0_1_1_5_5_3 - 0.00973544973544966*G0_1_1_5_5_4 - 0.0901587301587295*G0_1_1_5_5_5; + A[26] = -A[20] - 0.0190476190476189*G0_1_1_0_0_0 + 0.00169312169312168*G0_1_1_0_0_1 + 0.000634920634920633*G0_1_1_0_0_2 - 0.00126984126984126*G0_1_1_0_0_3 - 0.00634920634920631*G0_1_1_0_0_4 - 0.0105820105820105*G0_1_1_0_0_5 + 0.00169312169312168*G0_1_1_0_1_0 + 0.00169312169312168*G0_1_1_0_1_1 - 0.000952380952380945*G0_1_1_0_1_2 + 0.000423280423280419*G0_1_1_0_1_3 + 0.000423280423280421*G0_1_1_0_1_4 + 0.00465608465608463*G0_1_1_0_1_5 + 0.000634920634920633*G0_1_1_0_2_0 - 0.000952380952380945*G0_1_1_0_2_1 + 0.0042328042328042*G0_1_1_0_2_2 + 0.0021164021164021*G0_1_1_0_2_3 + 0.00423280423280421*G0_1_1_0_2_4 + 0.000846560846560844*G0_1_1_0_2_5 - 0.00126984126984126*G0_1_1_0_3_0 + 0.00042328042328042*G0_1_1_0_3_1 + 0.0021164021164021*G0_1_1_0_3_2 + 0.00253968253968252*G0_1_1_0_3_3 + 0.00169312169312168*G0_1_1_0_3_4 + 0.00084656084656084*G0_1_1_0_3_5 - 0.00634920634920631*G0_1_1_0_4_0 + 0.000423280423280421*G0_1_1_0_4_1 + 0.00423280423280421*G0_1_1_0_4_2 + 0.00169312169312168*G0_1_1_0_4_3 + 0.00253968253968253*G0_1_1_0_4_4 - 0.00253968253968252*G0_1_1_0_4_5 - 0.0105820105820105*G0_1_1_0_5_0 + 0.00465608465608463*G0_1_1_0_5_1 + 0.000846560846560844*G0_1_1_0_5_2 + 0.00084656084656084*G0_1_1_0_5_3 - 0.00253968253968252*G0_1_1_0_5_4 - 0.00592592592592589*G0_1_1_0_5_5 + 0.00169312169312168*G0_1_1_1_0_0 + 0.00169312169312168*G0_1_1_1_0_1 - 0.000952380952380945*G0_1_1_1_0_2 + 0.00042328042328042*G0_1_1_1_0_3 + 0.000423280423280421*G0_1_1_1_0_4 + 0.00465608465608463*G0_1_1_1_0_5 + 0.00169312169312168*G0_1_1_1_1_0 - 0.0190476190476189*G0_1_1_1_1_1 + 0.000634920634920632*G0_1_1_1_1_2 - 0.00634920634920631*G0_1_1_1_1_3 - 0.00126984126984126*G0_1_1_1_1_4 - 0.0105820105820105*G0_1_1_1_1_5 - 0.000952380952380945*G0_1_1_1_2_0 + 0.000634920634920632*G0_1_1_1_2_1 + 0.0042328042328042*G0_1_1_1_2_2 + 0.00423280423280421*G0_1_1_1_2_3 + 0.0021164021164021*G0_1_1_1_2_4 + 0.000846560846560843*G0_1_1_1_2_5 + 0.00042328042328042*G0_1_1_1_3_0 - 0.00634920634920631*G0_1_1_1_3_1 + 0.00423280423280421*G0_1_1_1_3_2 + 0.00253968253968253*G0_1_1_1_3_3 + 0.00169312169312168*G0_1_1_1_3_4 - 0.00253968253968252*G0_1_1_1_3_5 + 0.000423280423280421*G0_1_1_1_4_0 - 0.00126984126984126*G0_1_1_1_4_1 + 0.0021164021164021*G0_1_1_1_4_2 + 0.00169312169312168*G0_1_1_1_4_3 + 0.00253968253968253*G0_1_1_1_4_4 + 0.000846560846560842*G0_1_1_1_4_5 + 0.00465608465608463*G0_1_1_1_5_0 - 0.0105820105820105*G0_1_1_1_5_1 + 0.000846560846560844*G0_1_1_1_5_2 - 0.00253968253968252*G0_1_1_1_5_3 + 0.000846560846560842*G0_1_1_1_5_4 - 0.0059259259259259*G0_1_1_1_5_5 + 0.000634920634920633*G0_1_1_2_0_0 - 0.000952380952380945*G0_1_1_2_0_1 + 0.0042328042328042*G0_1_1_2_0_2 + 0.0021164021164021*G0_1_1_2_0_3 + 0.00423280423280421*G0_1_1_2_0_4 + 0.000846560846560844*G0_1_1_2_0_5 - 0.000952380952380945*G0_1_1_2_1_0 + 0.000634920634920632*G0_1_1_2_1_1 + 0.0042328042328042*G0_1_1_2_1_2 + 0.00423280423280421*G0_1_1_2_1_3 + 0.0021164021164021*G0_1_1_2_1_4 + 0.000846560846560844*G0_1_1_2_1_5 + 0.0042328042328042*G0_1_1_2_2_0 + 0.0042328042328042*G0_1_1_2_2_1 - 0.0539682539682537*G0_1_1_2_2_2 - 0.0190476190476189*G0_1_1_2_2_3 - 0.0190476190476189*G0_1_1_2_2_4 - 0.00211640211640212*G0_1_1_2_2_5 + 0.0021164021164021*G0_1_1_2_3_0 + 0.00423280423280421*G0_1_1_2_3_1 - 0.0190476190476189*G0_1_1_2_3_2 - 0.0169312169312168*G0_1_1_2_3_3 - 0.00846560846560842*G0_1_1_2_3_4 + 0.00423280423280421*G0_1_1_2_4_0 + 0.0021164021164021*G0_1_1_2_4_1 - 0.0190476190476189*G0_1_1_2_4_2 - 0.00846560846560842*G0_1_1_2_4_3 - 0.0169312169312168*G0_1_1_2_4_4 + 0.000846560846560844*G0_1_1_2_5_0 + 0.000846560846560843*G0_1_1_2_5_1 - 0.00211640211640212*G0_1_1_2_5_2 + 0.00677248677248673*G0_1_1_2_5_5 - 0.00126984126984126*G0_1_1_3_0_0 + 0.00042328042328042*G0_1_1_3_0_1 + 0.0021164021164021*G0_1_1_3_0_2 + 0.00253968253968252*G0_1_1_3_0_3 + 0.00169312169312168*G0_1_1_3_0_4 + 0.00084656084656084*G0_1_1_3_0_5 + 0.00042328042328042*G0_1_1_3_1_0 - 0.00634920634920631*G0_1_1_3_1_1 + 0.00423280423280421*G0_1_1_3_1_2 + 0.00253968253968252*G0_1_1_3_1_3 + 0.00169312169312168*G0_1_1_3_1_4 - 0.00253968253968252*G0_1_1_3_1_5 + 0.0021164021164021*G0_1_1_3_2_0 + 0.00423280423280421*G0_1_1_3_2_1 - 0.0190476190476189*G0_1_1_3_2_2 - 0.0169312169312168*G0_1_1_3_2_3 - 0.00846560846560842*G0_1_1_3_2_4 + 0.00253968253968252*G0_1_1_3_3_0 + 0.00253968253968253*G0_1_1_3_3_1 - 0.0169312169312168*G0_1_1_3_3_2 - 0.0253968253968253*G0_1_1_3_3_3 - 0.00846560846560842*G0_1_1_3_3_4 - 0.00507936507936506*G0_1_1_3_3_5 + 0.00169312169312168*G0_1_1_3_4_0 + 0.00169312169312168*G0_1_1_3_4_1 - 0.00846560846560842*G0_1_1_3_4_2 - 0.00846560846560842*G0_1_1_3_4_3 - 0.00846560846560842*G0_1_1_3_4_4 - 0.00338624338624337*G0_1_1_3_4_5 + 0.00084656084656084*G0_1_1_3_5_0 - 0.00253968253968252*G0_1_1_3_5_1 - 0.00507936507936506*G0_1_1_3_5_3 - 0.00338624338624337*G0_1_1_3_5_4 - 0.0152380952380951*G0_1_1_3_5_5 - 0.00634920634920631*G0_1_1_4_0_0 + 0.000423280423280421*G0_1_1_4_0_1 + 0.00423280423280421*G0_1_1_4_0_2 + 0.00169312169312168*G0_1_1_4_0_3 + 0.00253968253968253*G0_1_1_4_0_4 - 0.00253968253968252*G0_1_1_4_0_5 + 0.000423280423280421*G0_1_1_4_1_0 - 0.00126984126984126*G0_1_1_4_1_1 + 0.0021164021164021*G0_1_1_4_1_2 + 0.00169312169312168*G0_1_1_4_1_3 + 0.00253968253968253*G0_1_1_4_1_4 + 0.000846560846560842*G0_1_1_4_1_5 + 0.00423280423280421*G0_1_1_4_2_0 + 0.0021164021164021*G0_1_1_4_2_1 - 0.0190476190476189*G0_1_1_4_2_2 - 0.00846560846560842*G0_1_1_4_2_3 - 0.0169312169312168*G0_1_1_4_2_4 + 0.00169312169312168*G0_1_1_4_3_0 + 0.00169312169312168*G0_1_1_4_3_1 - 0.00846560846560842*G0_1_1_4_3_2 - 0.00846560846560842*G0_1_1_4_3_3 - 0.00846560846560842*G0_1_1_4_3_4 - 0.00338624338624337*G0_1_1_4_3_5 + 0.00253968253968253*G0_1_1_4_4_0 + 0.00253968253968253*G0_1_1_4_4_1 - 0.0169312169312168*G0_1_1_4_4_2 - 0.00846560846560843*G0_1_1_4_4_3 - 0.0253968253968253*G0_1_1_4_4_4 - 0.00507936507936506*G0_1_1_4_4_5 - 0.00253968253968252*G0_1_1_4_5_0 + 0.000846560846560842*G0_1_1_4_5_1 - 0.00338624338624337*G0_1_1_4_5_3 - 0.00507936507936506*G0_1_1_4_5_4 - 0.0152380952380951*G0_1_1_4_5_5 - 0.0105820105820105*G0_1_1_5_0_0 + 0.00465608465608463*G0_1_1_5_0_1 + 0.000846560846560844*G0_1_1_5_0_2 + 0.00084656084656084*G0_1_1_5_0_3 - 0.00253968253968252*G0_1_1_5_0_4 - 0.00592592592592589*G0_1_1_5_0_5 + 0.00465608465608463*G0_1_1_5_1_0 - 0.0105820105820105*G0_1_1_5_1_1 + 0.000846560846560844*G0_1_1_5_1_2 - 0.00253968253968252*G0_1_1_5_1_3 + 0.000846560846560842*G0_1_1_5_1_4 - 0.0059259259259259*G0_1_1_5_1_5 + 0.000846560846560844*G0_1_1_5_2_0 + 0.000846560846560844*G0_1_1_5_2_1 - 0.00211640211640212*G0_1_1_5_2_2 + 0.00677248677248673*G0_1_1_5_2_5 + 0.00084656084656084*G0_1_1_5_3_0 - 0.00253968253968252*G0_1_1_5_3_1 - 0.00507936507936506*G0_1_1_5_3_3 - 0.00338624338624337*G0_1_1_5_3_4 - 0.0152380952380951*G0_1_1_5_3_5 - 0.00253968253968252*G0_1_1_5_4_0 + 0.000846560846560842*G0_1_1_5_4_1 - 0.00338624338624337*G0_1_1_5_4_3 - 0.00507936507936506*G0_1_1_5_4_4 - 0.0152380952380951*G0_1_1_5_4_5 - 0.00592592592592589*G0_1_1_5_5_0 - 0.0059259259259259*G0_1_1_5_5_1 + 0.00677248677248673*G0_1_1_5_5_2 - 0.0152380952380951*G0_1_1_5_5_3 - 0.0152380952380951*G0_1_1_5_5_4 - 0.116825396825396*G0_1_1_5_5_5; + A[32] = -A[20] - 0.019047619047619*G0_0_1_0_0_0 + 0.00148148148148147*G0_0_1_0_0_1 + 0.00253968253968252*G0_0_1_0_0_2 + 0.00126984126984126*G0_0_1_0_0_3 - 0.00211640211640211*G0_0_1_0_0_4 - 0.00634920634920631*G0_0_1_0_0_5 + 0.00148148148148147*G0_0_1_0_1_0 - 0.0021164021164021*G0_0_1_0_1_1 + 0.000740740740740735*G0_0_1_0_1_2 + 0.00126984126984126*G0_0_1_0_1_3 + 0.00253968253968252*G0_0_1_0_1_4 + 0.000846560846560843*G0_0_1_0_1_5 + 0.00253968253968252*G0_0_1_0_2_0 + 0.000740740740740735*G0_0_1_0_2_1 - 0.0063492063492063*G0_0_1_0_2_2 - 0.00296296296296294*G0_0_1_0_2_3 - 0.00550264550264547*G0_0_1_0_2_4 + 0.000423280423280419*G0_0_1_0_2_5 + 0.00126984126984126*G0_0_1_0_3_0 + 0.00126984126984126*G0_0_1_0_3_1 - 0.00296296296296294*G0_0_1_0_3_2 - 0.00761904761904757*G0_0_1_0_3_3 - 0.00761904761904758*G0_0_1_0_3_4 - 0.00338624338624337*G0_0_1_0_3_5 - 0.00211640211640211*G0_0_1_0_4_0 + 0.00253968253968252*G0_0_1_0_4_1 - 0.00550264550264547*G0_0_1_0_4_2 - 0.00761904761904758*G0_0_1_0_4_3 - 0.0194708994708994*G0_0_1_0_4_4 - 0.00592592592592589*G0_0_1_0_4_5 - 0.00634920634920631*G0_0_1_0_5_0 + 0.000846560846560843*G0_0_1_0_5_1 + 0.000423280423280419*G0_0_1_0_5_2 - 0.00338624338624337*G0_0_1_0_5_3 - 0.00592592592592589*G0_0_1_0_5_4 - 0.0110052910052909*G0_0_1_0_5_5 + 0.00148148148148147*G0_0_1_1_0_0 - 0.0021164021164021*G0_0_1_1_0_1 + 0.000740740740740735*G0_0_1_1_0_2 + 0.00126984126984126*G0_0_1_1_0_3 + 0.00253968253968252*G0_0_1_1_0_4 + 0.000846560846560843*G0_0_1_1_0_5 - 0.0021164021164021*G0_0_1_1_1_0 + 0.0158730158730158*G0_0_1_1_1_1 + 0.00634920634920631*G0_0_1_1_1_3 + 0.00211640211640211*G0_0_1_1_1_4 + 0.00634920634920631*G0_0_1_1_1_5 + 0.000740740740740735*G0_0_1_1_2_0 - 0.00529100529100525*G0_0_1_1_2_2 - 0.00507936507936505*G0_0_1_1_2_3 - 0.00338624338624336*G0_0_1_1_2_4 - 0.00126984126984126*G0_0_1_1_2_5 + 0.00126984126984126*G0_0_1_1_3_0 + 0.00634920634920631*G0_0_1_1_3_1 - 0.00507936507936505*G0_0_1_1_3_2 - 0.00846560846560842*G0_0_1_1_3_3 - 0.00677248677248674*G0_0_1_1_3_4 + 0.00253968253968252*G0_0_1_1_4_0 + 0.00211640211640211*G0_0_1_1_4_1 - 0.00338624338624336*G0_0_1_1_4_2 - 0.00677248677248674*G0_0_1_1_4_3 - 0.0118518518518518*G0_0_1_1_4_4 - 0.00169312169312169*G0_0_1_1_4_5 + 0.000846560846560843*G0_0_1_1_5_0 + 0.00634920634920631*G0_0_1_1_5_1 - 0.00126984126984126*G0_0_1_1_5_2 - 0.00169312169312169*G0_0_1_1_5_4 + 0.00846560846560841*G0_0_1_1_5_5 + 0.00253968253968252*G0_0_1_2_0_0 + 0.000740740740740735*G0_0_1_2_0_1 - 0.0063492063492063*G0_0_1_2_0_2 - 0.00296296296296294*G0_0_1_2_0_3 - 0.00550264550264547*G0_0_1_2_0_4 + 0.000423280423280419*G0_0_1_2_0_5 + 0.000740740740740735*G0_0_1_2_1_0 - 0.00529100529100525*G0_0_1_2_1_2 - 0.00507936507936505*G0_0_1_2_1_3 - 0.00338624338624336*G0_0_1_2_1_4 - 0.00126984126984126*G0_0_1_2_1_5 - 0.0063492063492063*G0_0_1_2_2_0 - 0.00529100529100525*G0_0_1_2_2_1 + 0.0634920634920631*G0_0_1_2_2_2 + 0.0232804232804231*G0_0_1_2_2_3 + 0.0275132275132273*G0_0_1_2_2_4 + 0.00211640211640212*G0_0_1_2_2_5 - 0.00296296296296294*G0_0_1_2_3_0 - 0.00507936507936505*G0_0_1_2_3_1 + 0.0232804232804231*G0_0_1_2_3_2 + 0.021164021164021*G0_0_1_2_3_3 + 0.0126984126984126*G0_0_1_2_3_4 + 0.00169312169312169*G0_0_1_2_3_5 - 0.00550264550264547*G0_0_1_2_4_0 - 0.00338624338624336*G0_0_1_2_4_1 + 0.0275132275132273*G0_0_1_2_4_2 + 0.0126984126984126*G0_0_1_2_4_3 + 0.0296296296296295*G0_0_1_2_4_4 + 0.00253968253968253*G0_0_1_2_4_5 + 0.000423280423280419*G0_0_1_2_5_0 - 0.00126984126984126*G0_0_1_2_5_1 + 0.00211640211640212*G0_0_1_2_5_2 + 0.00169312169312169*G0_0_1_2_5_3 + 0.00253968253968253*G0_0_1_2_5_4 + 0.000846560846560842*G0_0_1_2_5_5 + 0.00126984126984126*G0_0_1_3_0_0 + 0.00126984126984126*G0_0_1_3_0_1 - 0.00296296296296294*G0_0_1_3_0_2 - 0.00761904761904757*G0_0_1_3_0_3 - 0.00761904761904758*G0_0_1_3_0_4 - 0.00338624338624337*G0_0_1_3_0_5 + 0.00126984126984126*G0_0_1_3_1_0 + 0.00634920634920631*G0_0_1_3_1_1 - 0.00507936507936505*G0_0_1_3_1_2 - 0.00846560846560842*G0_0_1_3_1_3 - 0.00677248677248674*G0_0_1_3_1_4 - 0.00296296296296294*G0_0_1_3_2_0 - 0.00507936507936505*G0_0_1_3_2_1 + 0.0232804232804231*G0_0_1_3_2_2 + 0.021164021164021*G0_0_1_3_2_3 + 0.0126984126984126*G0_0_1_3_2_4 + 0.00169312169312169*G0_0_1_3_2_5 - 0.00761904761904757*G0_0_1_3_3_0 - 0.00846560846560842*G0_0_1_3_3_1 + 0.021164021164021*G0_0_1_3_3_2 + 0.0558730158730156*G0_0_1_3_3_3 + 0.0287830687830686*G0_0_1_3_3_4 + 0.0118518518518518*G0_0_1_3_3_5 - 0.00761904761904758*G0_0_1_3_4_0 - 0.00677248677248674*G0_0_1_3_4_1 + 0.0126984126984126*G0_0_1_3_4_2 + 0.0287830687830686*G0_0_1_3_4_3 + 0.0389417989417988*G0_0_1_3_4_4 + 0.0101587301587301*G0_0_1_3_4_5 - 0.00338624338624337*G0_0_1_3_5_0 + 0.00169312169312169*G0_0_1_3_5_2 + 0.0118518518518518*G0_0_1_3_5_3 + 0.0101587301587301*G0_0_1_3_5_4 + 0.00507936507936506*G0_0_1_3_5_5 - 0.00211640211640211*G0_0_1_4_0_0 + 0.00253968253968252*G0_0_1_4_0_1 - 0.00550264550264547*G0_0_1_4_0_2 - 0.00761904761904758*G0_0_1_4_0_3 - 0.0194708994708994*G0_0_1_4_0_4 - 0.00592592592592589*G0_0_1_4_0_5 + 0.00253968253968252*G0_0_1_4_1_0 + 0.00211640211640211*G0_0_1_4_1_1 - 0.00338624338624336*G0_0_1_4_1_2 - 0.00677248677248674*G0_0_1_4_1_3 - 0.0118518518518518*G0_0_1_4_1_4 - 0.00169312169312169*G0_0_1_4_1_5 - 0.00550264550264547*G0_0_1_4_2_0 - 0.00338624338624336*G0_0_1_4_2_1 + 0.0275132275132273*G0_0_1_4_2_2 + 0.0126984126984126*G0_0_1_4_2_3 + 0.0296296296296295*G0_0_1_4_2_4 + 0.00253968253968254*G0_0_1_4_2_5 - 0.00761904761904758*G0_0_1_4_3_0 - 0.00677248677248674*G0_0_1_4_3_1 + 0.0126984126984126*G0_0_1_4_3_2 + 0.0287830687830686*G0_0_1_4_3_3 + 0.0389417989417988*G0_0_1_4_3_4 + 0.0101587301587301*G0_0_1_4_3_5 - 0.0194708994708994*G0_0_1_4_4_0 - 0.0118518518518518*G0_0_1_4_4_1 + 0.0296296296296295*G0_0_1_4_4_2 + 0.0389417989417988*G0_0_1_4_4_3 + 0.147301587301587*G0_0_1_4_4_4 + 0.0186243386243386*G0_0_1_4_4_5 - 0.00592592592592589*G0_0_1_4_5_0 - 0.00169312169312169*G0_0_1_4_5_1 + 0.00253968253968254*G0_0_1_4_5_2 + 0.0101587301587301*G0_0_1_4_5_3 + 0.0186243386243386*G0_0_1_4_5_4 + 0.0016931216931217*G0_0_1_4_5_5 - 0.00634920634920631*G0_0_1_5_0_0 + 0.000846560846560842*G0_0_1_5_0_1 + 0.000423280423280419*G0_0_1_5_0_2 - 0.00338624338624337*G0_0_1_5_0_3 - 0.00592592592592589*G0_0_1_5_0_4 - 0.0110052910052909*G0_0_1_5_0_5 + 0.000846560846560843*G0_0_1_5_1_0 + 0.00634920634920631*G0_0_1_5_1_1 - 0.00126984126984126*G0_0_1_5_1_2 - 0.00169312169312169*G0_0_1_5_1_4 + 0.00846560846560841*G0_0_1_5_1_5 + 0.000423280423280419*G0_0_1_5_2_0 - 0.00126984126984126*G0_0_1_5_2_1 + 0.00211640211640212*G0_0_1_5_2_2 + 0.00169312169312169*G0_0_1_5_2_3 + 0.00253968253968254*G0_0_1_5_2_4 + 0.000846560846560841*G0_0_1_5_2_5 - 0.00338624338624337*G0_0_1_5_3_0 + 0.00169312169312169*G0_0_1_5_3_2 + 0.0118518518518518*G0_0_1_5_3_3 + 0.0101587301587301*G0_0_1_5_3_4 + 0.00507936507936506*G0_0_1_5_3_5 - 0.00592592592592589*G0_0_1_5_4_0 - 0.00169312169312169*G0_0_1_5_4_1 + 0.00253968253968253*G0_0_1_5_4_2 + 0.0101587301587301*G0_0_1_5_4_3 + 0.0186243386243386*G0_0_1_5_4_4 + 0.0016931216931217*G0_0_1_5_4_5 - 0.0110052910052909*G0_0_1_5_5_0 + 0.00846560846560841*G0_0_1_5_5_1 + 0.000846560846560841*G0_0_1_5_5_2 + 0.00507936507936506*G0_0_1_5_5_3 + 0.0016931216931217*G0_0_1_5_5_4 - 0.00507936507936499*G0_0_1_5_5_5; + A[17] = A[32] + 0.0174603174603174*G0_0_1_0_0_0 - 0.00179894179894179*G0_0_1_0_0_1 - 0.00126984126984126*G0_0_1_0_0_2 + 0.000423280423280422*G0_0_1_0_0_3 + 0.00423280423280421*G0_0_1_0_0_4 + 0.00634920634920632*G0_0_1_0_0_5 - 0.00179894179894179*G0_0_1_0_1_0 + 0.00179894179894179*G0_0_1_0_1_1 + 0.00063492063492063*G0_0_1_0_1_3 - 0.000634920634920632*G0_0_1_0_1_4 - 0.00126984126984126*G0_0_1_0_2_0 + 0.000529100529100527*G0_0_1_0_2_2 - 0.00021164021164021*G0_0_1_0_2_3 + 0.000211640211640211*G0_0_1_0_2_4 - 0.000846560846560841*G0_0_1_0_2_5 + 0.000423280423280422*G0_0_1_0_3_0 + 0.00063492063492063*G0_0_1_0_3_1 - 0.00021164021164021*G0_0_1_0_3_2 - 0.0021164021164021*G0_0_1_0_3_3 + 0.000423280423280422*G0_0_1_0_3_4 + 0.000846560846560841*G0_0_1_0_3_5 + 0.00423280423280421*G0_0_1_0_4_0 - 0.000634920634920632*G0_0_1_0_4_1 + 0.000211640211640211*G0_0_1_0_4_2 + 0.000423280423280422*G0_0_1_0_4_3 + 0.00550264550264548*G0_0_1_0_4_4 + 0.00296296296296295*G0_0_1_0_4_5 + 0.00634920634920632*G0_0_1_0_5_0 - 0.000846560846560841*G0_0_1_0_5_2 + 0.000846560846560841*G0_0_1_0_5_3 + 0.00296296296296295*G0_0_1_0_5_4 + 0.00973544973544967*G0_0_1_0_5_5 - 0.00179894179894179*G0_0_1_1_0_0 + 0.00179894179894179*G0_0_1_1_0_1 + 0.00063492063492063*G0_0_1_1_0_3 - 0.000634920634920632*G0_0_1_1_0_4 + 0.00179894179894179*G0_0_1_1_1_0 - 0.0174603174603174*G0_0_1_1_1_1 + 0.00126984126984126*G0_0_1_1_1_2 - 0.0042328042328042*G0_0_1_1_1_3 - 0.000423280423280421*G0_0_1_1_1_4 - 0.00634920634920631*G0_0_1_1_1_5 + 0.00126984126984126*G0_0_1_1_2_1 - 0.000529100529100526*G0_0_1_1_2_2 - 0.00021164021164021*G0_0_1_1_2_3 + 0.000211640211640211*G0_0_1_1_2_4 + 0.000846560846560841*G0_0_1_1_2_5 + 0.00063492063492063*G0_0_1_1_3_0 - 0.0042328042328042*G0_0_1_1_3_1 - 0.00021164021164021*G0_0_1_1_3_2 - 0.00550264550264547*G0_0_1_1_3_3 - 0.000423280423280421*G0_0_1_1_3_4 - 0.00296296296296294*G0_0_1_1_3_5 - 0.000634920634920632*G0_0_1_1_4_0 - 0.000423280423280421*G0_0_1_1_4_1 + 0.000211640211640211*G0_0_1_1_4_2 - 0.000423280423280421*G0_0_1_1_4_3 + 0.00211640211640211*G0_0_1_1_4_4 - 0.00084656084656084*G0_0_1_1_4_5 - 0.00634920634920631*G0_0_1_1_5_1 + 0.000846560846560841*G0_0_1_1_5_2 - 0.00296296296296294*G0_0_1_1_5_3 - 0.00084656084656084*G0_0_1_1_5_4 - 0.00973544973544967*G0_0_1_1_5_5 - 0.00126984126984126*G0_0_1_2_0_0 + 0.000529100529100527*G0_0_1_2_0_2 - 0.00021164021164021*G0_0_1_2_0_3 + 0.000211640211640211*G0_0_1_2_0_4 - 0.000846560846560841*G0_0_1_2_0_5 + 0.00126984126984126*G0_0_1_2_1_1 - 0.000529100529100526*G0_0_1_2_1_2 - 0.00021164021164021*G0_0_1_2_1_3 + 0.000211640211640211*G0_0_1_2_1_4 + 0.000846560846560841*G0_0_1_2_1_5 + 0.000529100529100527*G0_0_1_2_2_0 - 0.000529100529100526*G0_0_1_2_2_1 + 0.0021164021164021*G0_0_1_2_2_3 - 0.00211640211640211*G0_0_1_2_2_4 - 0.00021164021164021*G0_0_1_2_3_0 - 0.00021164021164021*G0_0_1_2_3_1 + 0.0021164021164021*G0_0_1_2_3_2 + 0.00423280423280421*G0_0_1_2_3_3 + 0.000423280423280422*G0_0_1_2_3_5 + 0.000211640211640211*G0_0_1_2_4_0 + 0.000211640211640211*G0_0_1_2_4_1 - 0.00211640211640211*G0_0_1_2_4_2 - 0.00423280423280422*G0_0_1_2_4_4 - 0.000423280423280422*G0_0_1_2_4_5 - 0.000846560846560841*G0_0_1_2_5_0 + 0.000846560846560841*G0_0_1_2_5_1 + 0.000423280423280422*G0_0_1_2_5_3 - 0.000423280423280422*G0_0_1_2_5_4 + 0.000423280423280422*G0_0_1_3_0_0 + 0.00063492063492063*G0_0_1_3_0_1 - 0.00021164021164021*G0_0_1_3_0_2 - 0.0021164021164021*G0_0_1_3_0_3 + 0.000423280423280422*G0_0_1_3_0_4 + 0.000846560846560841*G0_0_1_3_0_5 + 0.00063492063492063*G0_0_1_3_1_0 - 0.0042328042328042*G0_0_1_3_1_1 - 0.00021164021164021*G0_0_1_3_1_2 - 0.00550264550264547*G0_0_1_3_1_3 - 0.000423280423280421*G0_0_1_3_1_4 - 0.00296296296296295*G0_0_1_3_1_5 - 0.00021164021164021*G0_0_1_3_2_0 - 0.00021164021164021*G0_0_1_3_2_1 + 0.0021164021164021*G0_0_1_3_2_2 + 0.00423280423280421*G0_0_1_3_2_3 + 0.000423280423280422*G0_0_1_3_2_5 - 0.0021164021164021*G0_0_1_3_3_0 - 0.00550264550264547*G0_0_1_3_3_1 + 0.00423280423280421*G0_0_1_3_3_2 + 0.0457142857142855*G0_0_1_3_3_3 + 0.00507936507936506*G0_0_1_3_3_4 + 0.00338624338624338*G0_0_1_3_3_5 + 0.000423280423280422*G0_0_1_3_4_0 - 0.000423280423280421*G0_0_1_3_4_1 + 0.00507936507936506*G0_0_1_3_4_3 - 0.00507936507936506*G0_0_1_3_4_4 + 0.000846560846560841*G0_0_1_3_5_0 - 0.00296296296296295*G0_0_1_3_5_1 + 0.000423280423280422*G0_0_1_3_5_2 + 0.00338624338624338*G0_0_1_3_5_3 - 0.00169312169312168*G0_0_1_3_5_5 + 0.00423280423280421*G0_0_1_4_0_0 - 0.000634920634920632*G0_0_1_4_0_1 + 0.000211640211640211*G0_0_1_4_0_2 + 0.000423280423280422*G0_0_1_4_0_3 + 0.00550264550264548*G0_0_1_4_0_4 + 0.00296296296296295*G0_0_1_4_0_5 - 0.000634920634920632*G0_0_1_4_1_0 - 0.000423280423280421*G0_0_1_4_1_1 + 0.000211640211640211*G0_0_1_4_1_2 - 0.000423280423280421*G0_0_1_4_1_3 + 0.00211640211640211*G0_0_1_4_1_4 - 0.00084656084656084*G0_0_1_4_1_5 + 0.000211640211640211*G0_0_1_4_2_0 + 0.000211640211640211*G0_0_1_4_2_1 - 0.00211640211640211*G0_0_1_4_2_2 - 0.00423280423280422*G0_0_1_4_2_4 - 0.000423280423280422*G0_0_1_4_2_5 + 0.000423280423280422*G0_0_1_4_3_0 - 0.000423280423280421*G0_0_1_4_3_1 + 0.00507936507936506*G0_0_1_4_3_3 - 0.00507936507936506*G0_0_1_4_3_4 + 0.00550264550264548*G0_0_1_4_4_0 + 0.00211640211640211*G0_0_1_4_4_1 - 0.00423280423280422*G0_0_1_4_4_2 - 0.00507936507936506*G0_0_1_4_4_3 - 0.0457142857142855*G0_0_1_4_4_4 - 0.00338624338624338*G0_0_1_4_4_5 + 0.00296296296296295*G0_0_1_4_5_0 - 0.00084656084656084*G0_0_1_4_5_1 - 0.000423280423280422*G0_0_1_4_5_2 - 0.00338624338624338*G0_0_1_4_5_4 + 0.00169312169312168*G0_0_1_4_5_5 + 0.00634920634920632*G0_0_1_5_0_0 - 0.000846560846560841*G0_0_1_5_0_2 + 0.000846560846560841*G0_0_1_5_0_3 + 0.00296296296296295*G0_0_1_5_0_4 + 0.00973544973544967*G0_0_1_5_0_5 - 0.00634920634920631*G0_0_1_5_1_1 + 0.000846560846560841*G0_0_1_5_1_2 - 0.00296296296296294*G0_0_1_5_1_3 - 0.00084656084656084*G0_0_1_5_1_4 - 0.00973544973544967*G0_0_1_5_1_5 - 0.000846560846560841*G0_0_1_5_2_0 + 0.000846560846560841*G0_0_1_5_2_1 + 0.000423280423280422*G0_0_1_5_2_3 - 0.000423280423280422*G0_0_1_5_2_4 + 0.000846560846560841*G0_0_1_5_3_0 - 0.00296296296296295*G0_0_1_5_3_1 + 0.000423280423280422*G0_0_1_5_3_2 + 0.00338624338624338*G0_0_1_5_3_3 - 0.00169312169312168*G0_0_1_5_3_5 + 0.00296296296296295*G0_0_1_5_4_0 - 0.00084656084656084*G0_0_1_5_4_1 - 0.000423280423280422*G0_0_1_5_4_2 - 0.00338624338624338*G0_0_1_5_4_4 + 0.00169312169312168*G0_0_1_5_4_5 + 0.00973544973544967*G0_0_1_5_5_0 - 0.00973544973544967*G0_0_1_5_5_1 - 0.00169312169312168*G0_0_1_5_5_3 + 0.00169312169312168*G0_0_1_5_5_4 - 0.0174603174603174*G0_1_0_0_0_0 + 0.00179894179894179*G0_1_0_0_0_1 + 0.00126984126984126*G0_1_0_0_0_2 - 0.000423280423280422*G0_1_0_0_0_3 - 0.00423280423280421*G0_1_0_0_0_4 - 0.00634920634920632*G0_1_0_0_0_5 + 0.00179894179894179*G0_1_0_0_1_0 - 0.00179894179894179*G0_1_0_0_1_1 - 0.00063492063492063*G0_1_0_0_1_3 + 0.000634920634920632*G0_1_0_0_1_4 + 0.00126984126984126*G0_1_0_0_2_0 - 0.000529100529100527*G0_1_0_0_2_2 + 0.00021164021164021*G0_1_0_0_2_3 - 0.000211640211640211*G0_1_0_0_2_4 + 0.000846560846560841*G0_1_0_0_2_5 - 0.000423280423280422*G0_1_0_0_3_0 - 0.00063492063492063*G0_1_0_0_3_1 + 0.00021164021164021*G0_1_0_0_3_2 + 0.0021164021164021*G0_1_0_0_3_3 - 0.000423280423280422*G0_1_0_0_3_4 - 0.000846560846560841*G0_1_0_0_3_5 - 0.00423280423280421*G0_1_0_0_4_0 + 0.000634920634920632*G0_1_0_0_4_1 - 0.000211640211640211*G0_1_0_0_4_2 - 0.000423280423280422*G0_1_0_0_4_3 - 0.00550264550264548*G0_1_0_0_4_4 - 0.00296296296296295*G0_1_0_0_4_5 - 0.00634920634920632*G0_1_0_0_5_0 + 0.000846560846560841*G0_1_0_0_5_2 - 0.000846560846560841*G0_1_0_0_5_3 - 0.00296296296296295*G0_1_0_0_5_4 - 0.00973544973544967*G0_1_0_0_5_5 + 0.00179894179894179*G0_1_0_1_0_0 - 0.00179894179894179*G0_1_0_1_0_1 - 0.00063492063492063*G0_1_0_1_0_3 + 0.000634920634920632*G0_1_0_1_0_4 - 0.00179894179894179*G0_1_0_1_1_0 + 0.0174603174603174*G0_1_0_1_1_1 - 0.00126984126984126*G0_1_0_1_1_2 + 0.0042328042328042*G0_1_0_1_1_3 + 0.000423280423280421*G0_1_0_1_1_4 + 0.00634920634920631*G0_1_0_1_1_5 - 0.00126984126984126*G0_1_0_1_2_1 + 0.000529100529100526*G0_1_0_1_2_2 + 0.00021164021164021*G0_1_0_1_2_3 - 0.000211640211640211*G0_1_0_1_2_4 - 0.000846560846560841*G0_1_0_1_2_5 - 0.00063492063492063*G0_1_0_1_3_0 + 0.0042328042328042*G0_1_0_1_3_1 + 0.00021164021164021*G0_1_0_1_3_2 + 0.00550264550264547*G0_1_0_1_3_3 + 0.000423280423280421*G0_1_0_1_3_4 + 0.00296296296296294*G0_1_0_1_3_5 + 0.000634920634920632*G0_1_0_1_4_0 + 0.000423280423280421*G0_1_0_1_4_1 - 0.000211640211640211*G0_1_0_1_4_2 + 0.000423280423280421*G0_1_0_1_4_3 - 0.00211640211640211*G0_1_0_1_4_4 + 0.00084656084656084*G0_1_0_1_4_5 + 0.00634920634920631*G0_1_0_1_5_1 - 0.000846560846560841*G0_1_0_1_5_2 + 0.00296296296296294*G0_1_0_1_5_3 + 0.00084656084656084*G0_1_0_1_5_4 + 0.00973544973544967*G0_1_0_1_5_5 + 0.00126984126984126*G0_1_0_2_0_0 - 0.000529100529100527*G0_1_0_2_0_2 + 0.00021164021164021*G0_1_0_2_0_3 - 0.000211640211640211*G0_1_0_2_0_4 + 0.000846560846560841*G0_1_0_2_0_5 - 0.00126984126984126*G0_1_0_2_1_1 + 0.000529100529100526*G0_1_0_2_1_2 + 0.00021164021164021*G0_1_0_2_1_3 - 0.000211640211640211*G0_1_0_2_1_4 - 0.000846560846560841*G0_1_0_2_1_5 - 0.000529100529100527*G0_1_0_2_2_0 + 0.000529100529100526*G0_1_0_2_2_1 - 0.0021164021164021*G0_1_0_2_2_3 + 0.00211640211640211*G0_1_0_2_2_4 + 0.00021164021164021*G0_1_0_2_3_0 + 0.00021164021164021*G0_1_0_2_3_1 - 0.0021164021164021*G0_1_0_2_3_2 - 0.00423280423280421*G0_1_0_2_3_3 - 0.000423280423280422*G0_1_0_2_3_5 - 0.000211640211640211*G0_1_0_2_4_0 - 0.000211640211640211*G0_1_0_2_4_1 + 0.00211640211640211*G0_1_0_2_4_2 + 0.00423280423280422*G0_1_0_2_4_4 + 0.000423280423280422*G0_1_0_2_4_5 + 0.000846560846560841*G0_1_0_2_5_0 - 0.000846560846560841*G0_1_0_2_5_1 - 0.000423280423280422*G0_1_0_2_5_3 + 0.000423280423280422*G0_1_0_2_5_4 - 0.000423280423280422*G0_1_0_3_0_0 - 0.00063492063492063*G0_1_0_3_0_1 + 0.00021164021164021*G0_1_0_3_0_2 + 0.0021164021164021*G0_1_0_3_0_3 - 0.000423280423280422*G0_1_0_3_0_4 - 0.000846560846560841*G0_1_0_3_0_5 - 0.00063492063492063*G0_1_0_3_1_0 + 0.0042328042328042*G0_1_0_3_1_1 + 0.00021164021164021*G0_1_0_3_1_2 + 0.00550264550264547*G0_1_0_3_1_3 + 0.000423280423280421*G0_1_0_3_1_4 + 0.00296296296296295*G0_1_0_3_1_5 + 0.00021164021164021*G0_1_0_3_2_0 + 0.00021164021164021*G0_1_0_3_2_1 - 0.0021164021164021*G0_1_0_3_2_2 - 0.00423280423280421*G0_1_0_3_2_3 - 0.000423280423280422*G0_1_0_3_2_5 + 0.0021164021164021*G0_1_0_3_3_0 + 0.00550264550264547*G0_1_0_3_3_1 - 0.00423280423280421*G0_1_0_3_3_2 - 0.0457142857142855*G0_1_0_3_3_3 - 0.00507936507936506*G0_1_0_3_3_4 - 0.00338624338624338*G0_1_0_3_3_5 - 0.000423280423280422*G0_1_0_3_4_0 + 0.000423280423280421*G0_1_0_3_4_1 - 0.00507936507936506*G0_1_0_3_4_3 + 0.00507936507936506*G0_1_0_3_4_4 - 0.000846560846560841*G0_1_0_3_5_0 + 0.00296296296296295*G0_1_0_3_5_1 - 0.000423280423280422*G0_1_0_3_5_2 - 0.00338624338624338*G0_1_0_3_5_3 + 0.00169312169312168*G0_1_0_3_5_5 - 0.00423280423280421*G0_1_0_4_0_0 + 0.000634920634920632*G0_1_0_4_0_1 - 0.000211640211640211*G0_1_0_4_0_2 - 0.000423280423280422*G0_1_0_4_0_3 - 0.00550264550264548*G0_1_0_4_0_4 - 0.00296296296296295*G0_1_0_4_0_5 + 0.000634920634920632*G0_1_0_4_1_0 + 0.000423280423280421*G0_1_0_4_1_1 - 0.000211640211640211*G0_1_0_4_1_2 + 0.000423280423280421*G0_1_0_4_1_3 - 0.00211640211640211*G0_1_0_4_1_4 + 0.00084656084656084*G0_1_0_4_1_5 - 0.000211640211640211*G0_1_0_4_2_0 - 0.000211640211640211*G0_1_0_4_2_1 + 0.00211640211640211*G0_1_0_4_2_2 + 0.00423280423280422*G0_1_0_4_2_4 + 0.000423280423280422*G0_1_0_4_2_5 - 0.000423280423280422*G0_1_0_4_3_0 + 0.000423280423280421*G0_1_0_4_3_1 - 0.00507936507936506*G0_1_0_4_3_3 + 0.00507936507936506*G0_1_0_4_3_4 - 0.00550264550264548*G0_1_0_4_4_0 - 0.00211640211640211*G0_1_0_4_4_1 + 0.00423280423280422*G0_1_0_4_4_2 + 0.00507936507936506*G0_1_0_4_4_3 + 0.0457142857142855*G0_1_0_4_4_4 + 0.00338624338624338*G0_1_0_4_4_5 - 0.00296296296296295*G0_1_0_4_5_0 + 0.00084656084656084*G0_1_0_4_5_1 + 0.000423280423280422*G0_1_0_4_5_2 + 0.00338624338624338*G0_1_0_4_5_4 - 0.00169312169312168*G0_1_0_4_5_5 - 0.00634920634920632*G0_1_0_5_0_0 + 0.000846560846560841*G0_1_0_5_0_2 - 0.000846560846560841*G0_1_0_5_0_3 - 0.00296296296296295*G0_1_0_5_0_4 - 0.00973544973544967*G0_1_0_5_0_5 + 0.00634920634920631*G0_1_0_5_1_1 - 0.000846560846560841*G0_1_0_5_1_2 + 0.00296296296296294*G0_1_0_5_1_3 + 0.00084656084656084*G0_1_0_5_1_4 + 0.00973544973544967*G0_1_0_5_1_5 + 0.000846560846560841*G0_1_0_5_2_0 - 0.000846560846560841*G0_1_0_5_2_1 - 0.000423280423280422*G0_1_0_5_2_3 + 0.000423280423280422*G0_1_0_5_2_4 - 0.000846560846560841*G0_1_0_5_3_0 + 0.00296296296296295*G0_1_0_5_3_1 - 0.000423280423280422*G0_1_0_5_3_2 - 0.00338624338624338*G0_1_0_5_3_3 + 0.00169312169312168*G0_1_0_5_3_5 - 0.00296296296296295*G0_1_0_5_4_0 + 0.00084656084656084*G0_1_0_5_4_1 + 0.000423280423280422*G0_1_0_5_4_2 + 0.00338624338624338*G0_1_0_5_4_4 - 0.00169312169312168*G0_1_0_5_4_5 - 0.00973544973544967*G0_1_0_5_5_0 + 0.00973544973544967*G0_1_0_5_5_1 + 0.00169312169312168*G0_1_0_5_5_3 - 0.00169312169312168*G0_1_0_5_5_4; + A[15] = -A[17] - 0.019047619047619*G0_1_0_0_0_0 + 0.00148148148148147*G0_1_0_0_0_1 + 0.00253968253968252*G0_1_0_0_0_2 + 0.00126984126984126*G0_1_0_0_0_3 - 0.00211640211640211*G0_1_0_0_0_4 - 0.00634920634920631*G0_1_0_0_0_5 + 0.00148148148148147*G0_1_0_0_1_0 - 0.0021164021164021*G0_1_0_0_1_1 + 0.000740740740740735*G0_1_0_0_1_2 + 0.00126984126984126*G0_1_0_0_1_3 + 0.00253968253968252*G0_1_0_0_1_4 + 0.000846560846560843*G0_1_0_0_1_5 + 0.00253968253968252*G0_1_0_0_2_0 + 0.000740740740740735*G0_1_0_0_2_1 - 0.0063492063492063*G0_1_0_0_2_2 - 0.00296296296296294*G0_1_0_0_2_3 - 0.00550264550264547*G0_1_0_0_2_4 + 0.000423280423280419*G0_1_0_0_2_5 + 0.00126984126984126*G0_1_0_0_3_0 + 0.00126984126984126*G0_1_0_0_3_1 - 0.00296296296296294*G0_1_0_0_3_2 - 0.00761904761904757*G0_1_0_0_3_3 - 0.00761904761904758*G0_1_0_0_3_4 - 0.00338624338624337*G0_1_0_0_3_5 - 0.00211640211640211*G0_1_0_0_4_0 + 0.00253968253968252*G0_1_0_0_4_1 - 0.00550264550264547*G0_1_0_0_4_2 - 0.00761904761904758*G0_1_0_0_4_3 - 0.0194708994708994*G0_1_0_0_4_4 - 0.00592592592592589*G0_1_0_0_4_5 - 0.00634920634920631*G0_1_0_0_5_0 + 0.000846560846560843*G0_1_0_0_5_1 + 0.000423280423280419*G0_1_0_0_5_2 - 0.00338624338624337*G0_1_0_0_5_3 - 0.00592592592592589*G0_1_0_0_5_4 - 0.0110052910052909*G0_1_0_0_5_5 + 0.00148148148148147*G0_1_0_1_0_0 - 0.0021164021164021*G0_1_0_1_0_1 + 0.000740740740740735*G0_1_0_1_0_2 + 0.00126984126984126*G0_1_0_1_0_3 + 0.00253968253968252*G0_1_0_1_0_4 + 0.000846560846560843*G0_1_0_1_0_5 - 0.0021164021164021*G0_1_0_1_1_0 + 0.0158730158730158*G0_1_0_1_1_1 + 0.00634920634920631*G0_1_0_1_1_3 + 0.00211640211640211*G0_1_0_1_1_4 + 0.00634920634920631*G0_1_0_1_1_5 + 0.000740740740740735*G0_1_0_1_2_0 - 0.00529100529100525*G0_1_0_1_2_2 - 0.00507936507936505*G0_1_0_1_2_3 - 0.00338624338624336*G0_1_0_1_2_4 - 0.00126984126984126*G0_1_0_1_2_5 + 0.00126984126984126*G0_1_0_1_3_0 + 0.00634920634920631*G0_1_0_1_3_1 - 0.00507936507936505*G0_1_0_1_3_2 - 0.00846560846560842*G0_1_0_1_3_3 - 0.00677248677248674*G0_1_0_1_3_4 + 0.00253968253968252*G0_1_0_1_4_0 + 0.00211640211640211*G0_1_0_1_4_1 - 0.00338624338624336*G0_1_0_1_4_2 - 0.00677248677248674*G0_1_0_1_4_3 - 0.0118518518518518*G0_1_0_1_4_4 - 0.00169312169312169*G0_1_0_1_4_5 + 0.000846560846560843*G0_1_0_1_5_0 + 0.00634920634920631*G0_1_0_1_5_1 - 0.00126984126984126*G0_1_0_1_5_2 - 0.00169312169312169*G0_1_0_1_5_4 + 0.00846560846560841*G0_1_0_1_5_5 + 0.00253968253968252*G0_1_0_2_0_0 + 0.000740740740740735*G0_1_0_2_0_1 - 0.0063492063492063*G0_1_0_2_0_2 - 0.00296296296296294*G0_1_0_2_0_3 - 0.00550264550264547*G0_1_0_2_0_4 + 0.000423280423280419*G0_1_0_2_0_5 + 0.000740740740740735*G0_1_0_2_1_0 - 0.00529100529100525*G0_1_0_2_1_2 - 0.00507936507936505*G0_1_0_2_1_3 - 0.00338624338624336*G0_1_0_2_1_4 - 0.00126984126984126*G0_1_0_2_1_5 - 0.0063492063492063*G0_1_0_2_2_0 - 0.00529100529100525*G0_1_0_2_2_1 + 0.0634920634920631*G0_1_0_2_2_2 + 0.0232804232804231*G0_1_0_2_2_3 + 0.0275132275132273*G0_1_0_2_2_4 + 0.00211640211640212*G0_1_0_2_2_5 - 0.00296296296296294*G0_1_0_2_3_0 - 0.00507936507936505*G0_1_0_2_3_1 + 0.0232804232804231*G0_1_0_2_3_2 + 0.021164021164021*G0_1_0_2_3_3 + 0.0126984126984126*G0_1_0_2_3_4 + 0.00169312169312169*G0_1_0_2_3_5 - 0.00550264550264547*G0_1_0_2_4_0 - 0.00338624338624336*G0_1_0_2_4_1 + 0.0275132275132273*G0_1_0_2_4_2 + 0.0126984126984126*G0_1_0_2_4_3 + 0.0296296296296295*G0_1_0_2_4_4 + 0.00253968253968254*G0_1_0_2_4_5 + 0.000423280423280419*G0_1_0_2_5_0 - 0.00126984126984126*G0_1_0_2_5_1 + 0.00211640211640212*G0_1_0_2_5_2 + 0.00169312169312169*G0_1_0_2_5_3 + 0.00253968253968254*G0_1_0_2_5_4 + 0.000846560846560841*G0_1_0_2_5_5 + 0.00126984126984126*G0_1_0_3_0_0 + 0.00126984126984126*G0_1_0_3_0_1 - 0.00296296296296294*G0_1_0_3_0_2 - 0.00761904761904757*G0_1_0_3_0_3 - 0.00761904761904758*G0_1_0_3_0_4 - 0.00338624338624337*G0_1_0_3_0_5 + 0.00126984126984126*G0_1_0_3_1_0 + 0.00634920634920631*G0_1_0_3_1_1 - 0.00507936507936505*G0_1_0_3_1_2 - 0.00846560846560842*G0_1_0_3_1_3 - 0.00677248677248674*G0_1_0_3_1_4 - 0.00296296296296294*G0_1_0_3_2_0 - 0.00507936507936505*G0_1_0_3_2_1 + 0.0232804232804231*G0_1_0_3_2_2 + 0.021164021164021*G0_1_0_3_2_3 + 0.0126984126984126*G0_1_0_3_2_4 + 0.00169312169312169*G0_1_0_3_2_5 - 0.00761904761904757*G0_1_0_3_3_0 - 0.00846560846560842*G0_1_0_3_3_1 + 0.021164021164021*G0_1_0_3_3_2 + 0.0558730158730156*G0_1_0_3_3_3 + 0.0287830687830686*G0_1_0_3_3_4 + 0.0118518518518518*G0_1_0_3_3_5 - 0.00761904761904758*G0_1_0_3_4_0 - 0.00677248677248674*G0_1_0_3_4_1 + 0.0126984126984126*G0_1_0_3_4_2 + 0.0287830687830686*G0_1_0_3_4_3 + 0.0389417989417988*G0_1_0_3_4_4 + 0.0101587301587301*G0_1_0_3_4_5 - 0.00338624338624337*G0_1_0_3_5_0 + 0.00169312169312169*G0_1_0_3_5_2 + 0.0118518518518518*G0_1_0_3_5_3 + 0.0101587301587301*G0_1_0_3_5_4 + 0.00507936507936506*G0_1_0_3_5_5 - 0.00211640211640211*G0_1_0_4_0_0 + 0.00253968253968252*G0_1_0_4_0_1 - 0.00550264550264547*G0_1_0_4_0_2 - 0.00761904761904758*G0_1_0_4_0_3 - 0.0194708994708994*G0_1_0_4_0_4 - 0.00592592592592589*G0_1_0_4_0_5 + 0.00253968253968252*G0_1_0_4_1_0 + 0.00211640211640211*G0_1_0_4_1_1 - 0.00338624338624336*G0_1_0_4_1_2 - 0.00677248677248674*G0_1_0_4_1_3 - 0.0118518518518518*G0_1_0_4_1_4 - 0.00169312169312169*G0_1_0_4_1_5 - 0.00550264550264547*G0_1_0_4_2_0 - 0.00338624338624336*G0_1_0_4_2_1 + 0.0275132275132273*G0_1_0_4_2_2 + 0.0126984126984126*G0_1_0_4_2_3 + 0.0296296296296295*G0_1_0_4_2_4 + 0.00253968253968253*G0_1_0_4_2_5 - 0.00761904761904758*G0_1_0_4_3_0 - 0.00677248677248674*G0_1_0_4_3_1 + 0.0126984126984126*G0_1_0_4_3_2 + 0.0287830687830686*G0_1_0_4_3_3 + 0.0389417989417988*G0_1_0_4_3_4 + 0.0101587301587301*G0_1_0_4_3_5 - 0.0194708994708994*G0_1_0_4_4_0 - 0.0118518518518518*G0_1_0_4_4_1 + 0.0296296296296295*G0_1_0_4_4_2 + 0.0389417989417988*G0_1_0_4_4_3 + 0.147301587301587*G0_1_0_4_4_4 + 0.0186243386243386*G0_1_0_4_4_5 - 0.0059259259259259*G0_1_0_4_5_0 - 0.00169312169312169*G0_1_0_4_5_1 + 0.00253968253968254*G0_1_0_4_5_2 + 0.0101587301587301*G0_1_0_4_5_3 + 0.0186243386243386*G0_1_0_4_5_4 + 0.0016931216931217*G0_1_0_4_5_5 - 0.00634920634920631*G0_1_0_5_0_0 + 0.000846560846560842*G0_1_0_5_0_1 + 0.000423280423280419*G0_1_0_5_0_2 - 0.00338624338624337*G0_1_0_5_0_3 - 0.00592592592592589*G0_1_0_5_0_4 - 0.0110052910052909*G0_1_0_5_0_5 + 0.000846560846560843*G0_1_0_5_1_0 + 0.00634920634920631*G0_1_0_5_1_1 - 0.00126984126984126*G0_1_0_5_1_2 - 0.00169312169312169*G0_1_0_5_1_4 + 0.00846560846560841*G0_1_0_5_1_5 + 0.000423280423280419*G0_1_0_5_2_0 - 0.00126984126984126*G0_1_0_5_2_1 + 0.00211640211640212*G0_1_0_5_2_2 + 0.00169312169312169*G0_1_0_5_2_3 + 0.00253968253968254*G0_1_0_5_2_4 + 0.000846560846560841*G0_1_0_5_2_5 - 0.00338624338624337*G0_1_0_5_3_0 + 0.00169312169312169*G0_1_0_5_3_2 + 0.0118518518518518*G0_1_0_5_3_3 + 0.0101587301587301*G0_1_0_5_3_4 + 0.00507936507936506*G0_1_0_5_3_5 - 0.00592592592592589*G0_1_0_5_4_0 - 0.00169312169312169*G0_1_0_5_4_1 + 0.00253968253968253*G0_1_0_5_4_2 + 0.0101587301587301*G0_1_0_5_4_3 + 0.0186243386243386*G0_1_0_5_4_4 + 0.0016931216931217*G0_1_0_5_4_5 - 0.0110052910052909*G0_1_0_5_5_0 + 0.00846560846560841*G0_1_0_5_5_1 + 0.000846560846560841*G0_1_0_5_5_2 + 0.00507936507936506*G0_1_0_5_5_3 + 0.0016931216931217*G0_1_0_5_5_4 - 0.00507936507936499*G0_1_0_5_5_5; + A[16] = -A[15] - 0.0190476190476189*G0_1_1_0_0_0 + 0.00169312169312168*G0_1_1_0_0_1 + 0.000634920634920633*G0_1_1_0_0_2 - 0.00126984126984126*G0_1_1_0_0_3 - 0.00634920634920631*G0_1_1_0_0_4 - 0.0105820105820105*G0_1_1_0_0_5 + 0.00169312169312168*G0_1_1_0_1_0 + 0.00169312169312168*G0_1_1_0_1_1 - 0.000952380952380945*G0_1_1_0_1_2 + 0.00042328042328042*G0_1_1_0_1_3 + 0.000423280423280421*G0_1_1_0_1_4 + 0.00465608465608463*G0_1_1_0_1_5 + 0.000634920634920633*G0_1_1_0_2_0 - 0.000952380952380945*G0_1_1_0_2_1 + 0.0042328042328042*G0_1_1_0_2_2 + 0.0021164021164021*G0_1_1_0_2_3 + 0.00423280423280421*G0_1_1_0_2_4 + 0.000846560846560844*G0_1_1_0_2_5 - 0.00126984126984126*G0_1_1_0_3_0 + 0.00042328042328042*G0_1_1_0_3_1 + 0.0021164021164021*G0_1_1_0_3_2 + 0.00253968253968252*G0_1_1_0_3_3 + 0.00169312169312168*G0_1_1_0_3_4 + 0.00084656084656084*G0_1_1_0_3_5 - 0.00634920634920631*G0_1_1_0_4_0 + 0.000423280423280421*G0_1_1_0_4_1 + 0.00423280423280421*G0_1_1_0_4_2 + 0.00169312169312168*G0_1_1_0_4_3 + 0.00253968253968253*G0_1_1_0_4_4 - 0.00253968253968252*G0_1_1_0_4_5 - 0.0105820105820105*G0_1_1_0_5_0 + 0.00465608465608463*G0_1_1_0_5_1 + 0.000846560846560844*G0_1_1_0_5_2 + 0.00084656084656084*G0_1_1_0_5_3 - 0.00253968253968252*G0_1_1_0_5_4 - 0.00592592592592589*G0_1_1_0_5_5 + 0.00169312169312168*G0_1_1_1_0_0 + 0.00169312169312168*G0_1_1_1_0_1 - 0.000952380952380945*G0_1_1_1_0_2 + 0.00042328042328042*G0_1_1_1_0_3 + 0.000423280423280421*G0_1_1_1_0_4 + 0.00465608465608463*G0_1_1_1_0_5 + 0.00169312169312168*G0_1_1_1_1_0 - 0.0190476190476189*G0_1_1_1_1_1 + 0.000634920634920632*G0_1_1_1_1_2 - 0.00634920634920631*G0_1_1_1_1_3 - 0.00126984126984126*G0_1_1_1_1_4 - 0.0105820105820105*G0_1_1_1_1_5 - 0.000952380952380945*G0_1_1_1_2_0 + 0.000634920634920632*G0_1_1_1_2_1 + 0.0042328042328042*G0_1_1_1_2_2 + 0.00423280423280421*G0_1_1_1_2_3 + 0.0021164021164021*G0_1_1_1_2_4 + 0.000846560846560843*G0_1_1_1_2_5 + 0.00042328042328042*G0_1_1_1_3_0 - 0.00634920634920631*G0_1_1_1_3_1 + 0.00423280423280421*G0_1_1_1_3_2 + 0.00253968253968252*G0_1_1_1_3_3 + 0.00169312169312168*G0_1_1_1_3_4 - 0.00253968253968252*G0_1_1_1_3_5 + 0.000423280423280421*G0_1_1_1_4_0 - 0.00126984126984126*G0_1_1_1_4_1 + 0.0021164021164021*G0_1_1_1_4_2 + 0.00169312169312168*G0_1_1_1_4_3 + 0.00253968253968253*G0_1_1_1_4_4 + 0.000846560846560842*G0_1_1_1_4_5 + 0.00465608465608463*G0_1_1_1_5_0 - 0.0105820105820105*G0_1_1_1_5_1 + 0.000846560846560843*G0_1_1_1_5_2 - 0.00253968253968252*G0_1_1_1_5_3 + 0.000846560846560842*G0_1_1_1_5_4 - 0.0059259259259259*G0_1_1_1_5_5 + 0.000634920634920633*G0_1_1_2_0_0 - 0.000952380952380945*G0_1_1_2_0_1 + 0.0042328042328042*G0_1_1_2_0_2 + 0.0021164021164021*G0_1_1_2_0_3 + 0.00423280423280421*G0_1_1_2_0_4 + 0.000846560846560844*G0_1_1_2_0_5 - 0.000952380952380945*G0_1_1_2_1_0 + 0.000634920634920632*G0_1_1_2_1_1 + 0.0042328042328042*G0_1_1_2_1_2 + 0.00423280423280421*G0_1_1_2_1_3 + 0.0021164021164021*G0_1_1_2_1_4 + 0.000846560846560844*G0_1_1_2_1_5 + 0.0042328042328042*G0_1_1_2_2_0 + 0.0042328042328042*G0_1_1_2_2_1 - 0.0539682539682537*G0_1_1_2_2_2 - 0.0190476190476189*G0_1_1_2_2_3 - 0.0190476190476189*G0_1_1_2_2_4 - 0.00211640211640212*G0_1_1_2_2_5 + 0.0021164021164021*G0_1_1_2_3_0 + 0.00423280423280421*G0_1_1_2_3_1 - 0.0190476190476189*G0_1_1_2_3_2 - 0.0169312169312168*G0_1_1_2_3_3 - 0.00846560846560842*G0_1_1_2_3_4 + 0.00423280423280421*G0_1_1_2_4_0 + 0.0021164021164021*G0_1_1_2_4_1 - 0.0190476190476189*G0_1_1_2_4_2 - 0.00846560846560842*G0_1_1_2_4_3 - 0.0169312169312168*G0_1_1_2_4_4 + 0.000846560846560844*G0_1_1_2_5_0 + 0.000846560846560844*G0_1_1_2_5_1 - 0.00211640211640212*G0_1_1_2_5_2 + 0.00677248677248673*G0_1_1_2_5_5 - 0.00126984126984126*G0_1_1_3_0_0 + 0.00042328042328042*G0_1_1_3_0_1 + 0.0021164021164021*G0_1_1_3_0_2 + 0.00253968253968252*G0_1_1_3_0_3 + 0.00169312169312168*G0_1_1_3_0_4 + 0.000846560846560839*G0_1_1_3_0_5 + 0.00042328042328042*G0_1_1_3_1_0 - 0.00634920634920631*G0_1_1_3_1_1 + 0.00423280423280421*G0_1_1_3_1_2 + 0.00253968253968252*G0_1_1_3_1_3 + 0.00169312169312168*G0_1_1_3_1_4 - 0.00253968253968252*G0_1_1_3_1_5 + 0.0021164021164021*G0_1_1_3_2_0 + 0.00423280423280421*G0_1_1_3_2_1 - 0.0190476190476189*G0_1_1_3_2_2 - 0.0169312169312168*G0_1_1_3_2_3 - 0.00846560846560842*G0_1_1_3_2_4 + 0.00253968253968252*G0_1_1_3_3_0 + 0.00253968253968252*G0_1_1_3_3_1 - 0.0169312169312168*G0_1_1_3_3_2 - 0.0253968253968252*G0_1_1_3_3_3 - 0.00846560846560842*G0_1_1_3_3_4 - 0.00507936507936506*G0_1_1_3_3_5 + 0.00169312169312168*G0_1_1_3_4_0 + 0.00169312169312168*G0_1_1_3_4_1 - 0.00846560846560842*G0_1_1_3_4_2 - 0.00846560846560842*G0_1_1_3_4_3 - 0.00846560846560842*G0_1_1_3_4_4 - 0.00338624338624337*G0_1_1_3_4_5 + 0.000846560846560839*G0_1_1_3_5_0 - 0.00253968253968252*G0_1_1_3_5_1 - 0.00507936507936505*G0_1_1_3_5_3 - 0.00338624338624337*G0_1_1_3_5_4 - 0.0152380952380951*G0_1_1_3_5_5 - 0.00634920634920631*G0_1_1_4_0_0 + 0.000423280423280421*G0_1_1_4_0_1 + 0.00423280423280421*G0_1_1_4_0_2 + 0.00169312169312168*G0_1_1_4_0_3 + 0.00253968253968253*G0_1_1_4_0_4 - 0.00253968253968252*G0_1_1_4_0_5 + 0.000423280423280421*G0_1_1_4_1_0 - 0.00126984126984126*G0_1_1_4_1_1 + 0.0021164021164021*G0_1_1_4_1_2 + 0.00169312169312168*G0_1_1_4_1_3 + 0.00253968253968253*G0_1_1_4_1_4 + 0.000846560846560842*G0_1_1_4_1_5 + 0.00423280423280421*G0_1_1_4_2_0 + 0.0021164021164021*G0_1_1_4_2_1 - 0.0190476190476189*G0_1_1_4_2_2 - 0.00846560846560842*G0_1_1_4_2_3 - 0.0169312169312168*G0_1_1_4_2_4 + 0.00169312169312168*G0_1_1_4_3_0 + 0.00169312169312168*G0_1_1_4_3_1 - 0.00846560846560842*G0_1_1_4_3_2 - 0.00846560846560842*G0_1_1_4_3_3 - 0.00846560846560842*G0_1_1_4_3_4 - 0.00338624338624337*G0_1_1_4_3_5 + 0.00253968253968253*G0_1_1_4_4_0 + 0.00253968253968253*G0_1_1_4_4_1 - 0.0169312169312168*G0_1_1_4_4_2 - 0.00846560846560842*G0_1_1_4_4_3 - 0.0253968253968253*G0_1_1_4_4_4 - 0.00507936507936506*G0_1_1_4_4_5 - 0.00253968253968252*G0_1_1_4_5_0 + 0.000846560846560842*G0_1_1_4_5_1 - 0.00338624338624337*G0_1_1_4_5_3 - 0.00507936507936506*G0_1_1_4_5_4 - 0.0152380952380951*G0_1_1_4_5_5 - 0.0105820105820105*G0_1_1_5_0_0 + 0.00465608465608463*G0_1_1_5_0_1 + 0.000846560846560844*G0_1_1_5_0_2 + 0.00084656084656084*G0_1_1_5_0_3 - 0.00253968253968252*G0_1_1_5_0_4 - 0.00592592592592589*G0_1_1_5_0_5 + 0.00465608465608463*G0_1_1_5_1_0 - 0.0105820105820105*G0_1_1_5_1_1 + 0.000846560846560844*G0_1_1_5_1_2 - 0.00253968253968252*G0_1_1_5_1_3 + 0.000846560846560842*G0_1_1_5_1_4 - 0.0059259259259259*G0_1_1_5_1_5 + 0.000846560846560844*G0_1_1_5_2_0 + 0.000846560846560844*G0_1_1_5_2_1 - 0.00211640211640212*G0_1_1_5_2_2 + 0.00677248677248673*G0_1_1_5_2_5 + 0.00084656084656084*G0_1_1_5_3_0 - 0.00253968253968252*G0_1_1_5_3_1 - 0.00507936507936506*G0_1_1_5_3_3 - 0.00338624338624337*G0_1_1_5_3_4 - 0.0152380952380951*G0_1_1_5_3_5 - 0.00253968253968253*G0_1_1_5_4_0 + 0.000846560846560842*G0_1_1_5_4_1 - 0.00338624338624337*G0_1_1_5_4_3 - 0.00507936507936506*G0_1_1_5_4_4 - 0.0152380952380951*G0_1_1_5_4_5 - 0.00592592592592589*G0_1_1_5_5_0 - 0.0059259259259259*G0_1_1_5_5_1 + 0.00677248677248673*G0_1_1_5_5_2 - 0.0152380952380951*G0_1_1_5_5_3 - 0.0152380952380951*G0_1_1_5_5_4 - 0.116825396825396*G0_1_1_5_5_5; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p2_q2_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p2_q2_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q2_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q2_tensor_finite_element_0(); + break; + } + case 1: + { + return new laplacian_f3_p2_q2_tensor_finite_element_0(); + break; + } + case 2: + { + return new laplacian_f3_p2_q2_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q2_tensor_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q2_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q2_tensor_dofmap_0(); + break; + } + case 1: + { + return new laplacian_f3_p2_q2_tensor_dofmap_0(); + break; + } + case 2: + { + return new laplacian_f3_p2_q2_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q2_tensor_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q2_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q2_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p2_q3_quadrature.h b/laplacian_2d/laplacian_f3_p2_q3_quadrature.h new file mode 100644 index 0000000..bebe27e --- /dev/null +++ b/laplacian_2d/laplacian_f3_p2_q3_quadrature.h @@ -0,0 +1,5470 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'quadrature' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P2_Q3_QUADRATURE_H +#define __LAPLACIAN_F3_P2_Q3_QUADRATURE_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q3_quadrature_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q3_quadrature_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_quadrature_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q3_quadrature_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q3_quadrature_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q3_quadrature_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_quadrature_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q3_quadrature_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q3_quadrature_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q3_quadrature_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_quadrature_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q3_quadrature_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q3_quadrature_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q3_quadrature_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_quadrature_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q3_quadrature_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p2_q3_quadrature_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p2_q3_quadrature_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_quadrature_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Cell Volume. + + // Compute circumradius, assuming triangle is embedded in 2D. + + + // Facet Area. + + // Array of quadrature weights. + static const double W36[36] = {0.00619426535265906, 0.0116108747669979, 0.0120606064042655, 0.0084515357969434, 0.0037652982126918, 0.000748542561236343, 0.0130433943300833, 0.0244492622580587, 0.0253962715890485, 0.0177965759970269, 0.00792866733379675, 0.00157622175402364, 0.0169175056800133, 0.0317111115907051, 0.0329393989007878, 0.023082463651359, 0.0102836172287667, 0.00204438659154493, 0.0169175056800133, 0.0317111115907051, 0.0329393989007878, 0.023082463651359, 0.0102836172287667, 0.00204438659154493, 0.0130433943300833, 0.0244492622580587, 0.0253962715890485, 0.0177965759970269, 0.00792866733379675, 0.00157622175402364, 0.00619426535265908, 0.0116108747669979, 0.0120606064042655, 0.00845153579694342, 0.00376529821269181, 0.000748542561236345}; + // Quadrature points on the UFC reference element: (0.0327753666144599, 0.0293164271597849), (0.0287653330125591, 0.148078599668484), (0.0223868729780306, 0.336984690281154), (0.0149015633666711, 0.55867151877155), (0.00779187470128645, 0.769233862030055), (0.00246669715267023, 0.926945671319741), (0.164429241594827, 0.0293164271597849), (0.144311486950417, 0.148078599668484), (0.112311681780954, 0.336984690281154), (0.0747589734626491, 0.55867151877155), (0.0390907007328242, 0.769233862030055), (0.01237506041744, 0.926945671319741), (0.369529924372377, 0.0293164271597849), (0.324318304588776, 0.148078599668484), (0.252403568076518, 0.336984690281154), (0.168009519121192, 0.55867151877155), (0.0878504549759972, 0.769233862030055), (0.0278110821153606, 0.926945671319741), (0.601153648467838, 0.0293164271597849), (0.52760309574274, 0.148078599668484), (0.410611741642328, 0.336984690281154), (0.273318962107258, 0.55867151877155), (0.142915682993948, 0.769233862030055), (0.0452432465648983, 0.926945671319741), (0.806254331245388, 0.0293164271597849), (0.707609913381099, 0.148078599668484), (0.550703627937892, 0.336984690281154), (0.366569507765801, 0.55867151877155), (0.191675437237121, 0.769233862030055), (0.0606792682628189, 0.926945671319741), (0.937908206225755, 0.0293164271597849), (0.823156067318956, 0.148078599668484), (0.640628436740815, 0.336984690281154), (0.426426917861779, 0.55867151877155), (0.222974263268659, 0.769233862030055), (0.0705876315275886, 0.926945671319741) + + // Value of basis functions at quadrature points. + static const double FE0[36][6] = \ + {{0.821435400385472, -0.0306269173010353, -0.027597521356955, 0.00384342659195211, 0.109984470441527, 0.122961141239038}, + {0.532015755009065, -0.0271104442459123, -0.104224056308926, 0.0170381209259895, 0.487567191028831, 0.0947134335909534}, + {0.180181151181146, -0.0213845288145617, -0.109867327313383, 0.0301761338274607, 0.863527901361614, 0.0573666697577237}, + {-0.0627470853075863, -0.0144574501851293, 0.065556213001471, 0.0333003161525146, 0.952930295387644, 0.0254177109510863}, + {-0.123539219108256, -0.00767044807856531, 0.414207606957291, 0.0239750954756993, 0.686077414669827, 0.00694955008400427}, + {-0.0606224040782394, -0.00245452796298415, 0.79151088383707, 0.00914597699249758, 0.261723597972845, 0.000696473238811474}, + {0.493837762058507, -0.110355290611927, -0.027597521356955, 0.0192819115366137, 0.0945459854968658, 0.530287152876896}, + {0.293813665649314, -0.102659876418736, -0.104224056308926, 0.0854777716147777, 0.419127540340042, 0.408464955123528}, + {0.0558453437100204, -0.0870838540520213, -0.109867327313383, 0.151389269199641, 0.742314765989434, 0.247401802466309}, + {-0.0978230997184777, -0.0635811652362709, 0.065556213001471, 0.167062836984721, 0.819167774555438, 0.109617440413119}, + {-0.118196490757038, -0.0360345349652577, 0.414207606957291, 0.120279562776686, 0.58977294736884, 0.0299709086194782}, + {-0.0533153210689966, -0.0120687761767694, 0.79151088383707, 0.0458840347450652, 0.224985540220277, 0.00300363844335386}, + {0.121617769664549, -0.0964251943590678, -0.027597521356955, 0.0433331884448943, 0.0704947085885853, 0.888577049017995}, + {0.0291269575319056, -0.1139535792061, -0.104224056308926, 0.192098401561452, 0.312506910393368, 0.6844453660283}, + {-0.0734077368932362, -0.124988445721003, -0.109867327313383, 0.340224552856494, 0.55347948233258, 0.414559474738547}, + {-0.12391245201248, -0.111555122090524, 0.065556213001471, 0.375448532862056, 0.610782078678102, 0.183680749561375}, + {-0.102065898102695, -0.0724150500970177, 0.414207606957291, 0.270310179049135, 0.439742331096391, 0.0502208310968951}, + {-0.0411493438454339, -0.0262641695385059, 0.79151088383707, 0.103117448726206, 0.167752126239137, 0.0050330545815277}, + {-0.0964251943590677, 0.121617769664549, -0.027597521356955, 0.0704947085885853, 0.0433331884448943, 0.888577049017995}, + {-0.1139535792061, 0.0291269575319055, -0.104224056308926, 0.312506910393368, 0.192098401561452, 0.6844453660283}, + {-0.124988445721003, -0.0734077368932363, -0.109867327313383, 0.55347948233258, 0.340224552856494, 0.414559474738547}, + {-0.111555122090523, -0.12391245201248, 0.065556213001471, 0.610782078678102, 0.375448532862056, 0.183680749561375}, + {-0.0724150500970177, -0.102065898102695, 0.414207606957291, 0.439742331096391, 0.270310179049135, 0.0502208310968951}, + {-0.0262641695385059, -0.0411493438454339, 0.79151088383707, 0.167752126239137, 0.103117448726206, 0.0050330545815277}, + {-0.110355290611927, 0.493837762058507, -0.027597521356955, 0.094545985496866, 0.0192819115366136, 0.530287152876895}, + {-0.102659876418736, 0.293813665649314, -0.104224056308926, 0.419127540340043, 0.0854777716147776, 0.408464955123527}, + {-0.0870838540520211, 0.0558453437100205, -0.109867327313383, 0.742314765989434, 0.151389269199641, 0.247401802466309}, + {-0.0635811652362707, -0.0978230997184777, 0.065556213001471, 0.819167774555438, 0.16706283698472, 0.109617440413119}, + {-0.0360345349652576, -0.118196490757038, 0.414207606957291, 0.58977294736884, 0.120279562776686, 0.0299709086194783}, + {-0.0120687761767694, -0.0533153210689965, 0.79151088383707, 0.224985540220277, 0.0458840347450652, 0.00300363844335386}, + {-0.0306269173010353, 0.821435400385472, -0.027597521356955, 0.109984470441527, 0.00384342659195214, 0.122961141239039}, + {-0.0271104442459122, 0.532015755009064, -0.104224056308926, 0.487567191028831, 0.0170381209259895, 0.0947134335909537}, + {-0.0213845288145615, 0.180181151181146, -0.109867327313383, 0.863527901361614, 0.0301761338274607, 0.0573666697577238}, + {-0.0144574501851291, -0.0627470853075864, 0.065556213001471, 0.952930295387644, 0.0333003161525146, 0.0254177109510863}, + {-0.00767044807856519, -0.123539219108256, 0.414207606957291, 0.686077414669827, 0.0239750954756993, 0.0069495500840043}, + {-0.00245452796298426, -0.0606224040782393, 0.79151088383707, 0.261723597972845, 0.00914597699249797, 0.000696473238811501}}; + + static const double FE1_D01[36][9] = \ + {{-4.43439548859399, 0.747754769731037, -0.132987116899451, -0.121546020269397, 7.04451116334861, -3.35787044448566, -0.68249855359844, 0.132987116899451, 0.804044573867839}, + {-2.73900519484353, -0.036689229339339, -0.118273499381649, -0.0144366823060889, 2.81848265684241, -0.0427882326595375, -0.509871678182419, 0.11827349938165, 0.524308360488508}, + {-0.774808787805901, -0.499820012497934, -0.0939751052977228, 0.102947974934221, -1.65474547478613, 2.92937427508997, -0.286484092463497, 0.0939751052977238, 0.183536117529275}, + {0.383003391015211, 0.185493520523941, -0.0640592711746119, 0.157720098879452, -3.38233992003183, 2.81384300849267, -0.10451251376981, 0.0640592711746128, -0.0532075851096431}, + {0.335581821335214, 2.06512515739409, -0.0342438064524184, 0.126768458305182, -1.50166780651233, -0.899039172216978, -0.0118460269112365, 0.0342438064524186, -0.114922431393945}, + {-0.431976601534811, 4.25707070543081, -0.0110179951566316, 0.0506352075123457, 2.15424217803109, -5.97933628192709, 0.00639894282504327, 0.0110179951566312, -0.0570341503373868}, + {-2.5193326485928, 0.747754769731037, -0.374932418042144, -0.609778684304584, 4.64121565931223, -2.86963778045047, -2.83950669474232, 0.374932418042144, 3.44928537904691}, + {-1.3911199380254, -0.0366892293393392, -0.36825332018803, -0.0724267328771266, 1.41260734945324, 0.0152018179115008, -2.10773675580694, 0.368253320188031, 2.18016348868406}, + {-0.13787290718238, -0.499820012497935, -0.335114730843998, 0.516474999083284, -1.87815433126059, 2.51584725094091, -1.16455959863329, 0.335114730843999, 0.648084599550009}, + {0.485087315572777, 0.185493520523941, -0.260965175053868, 0.791258769064943, -2.8508851744039, 2.18030433830718, -0.403502342206633, 0.260965175053868, -0.38775642685831}, + {0.229096046393529, 2.06512515739409, -0.155279034366633, 0.635978895444921, -0.885971594430909, -1.40824960935672, -0.0263954798837663, 0.155279034366633, -0.609583415561153}, + {-0.503593229192932, 4.25707070543081, -0.0536203532539496, 0.254029462650712, 2.42925306082758, -6.18273053706546, 0.0354132123858459, 0.0536203532539495, -0.289442675036558}, + {-0.468324236183066, 0.747754769731037, 0.180572267914141, -1.37038563767266, 1.82960029353442, -2.10903082708239, -4.33501042119577, -0.18057226791414, 5.70539605886843}, + {-0.00949999791919755, -0.0366892293393394, -0.0394704743164267, -0.162768160109694, -0.0593540178855322, 0.105543245144069, -3.16057385004153, 0.0394704743164274, 3.32334201015123}, + {0.419378642724583, -0.499820012497935, -0.275763980444604, 1.16069967543701, -1.79118120481383, 1.87162257458719, -1.66246039814086, 0.275763980444605, 0.501760722703856}, + {0.451376715825574, 0.185493520523941, -0.374975656088352, 1.77823476077351, -1.83019858294813, 1.19332834659861, -0.483802223493915, 0.374975656088352, -1.2944325372796}, + {0.0105050989295735, 2.06512515739409, -0.291138064458875, 1.42926666118967, 0.125907118777798, -2.20153737510147, 0.0563364374879477, 0.291138064458875, -1.48560309867762}, + {-0.620444624272301, 4.25707070543081, -0.114708209625351, 0.570892909382767, 2.86296790263901, -6.49959398379751, 0.0911767510938143, 0.11470820962535, -0.662069660476581}, + {0.482312391761555, 0.747754769731037, 2.17351565428834, -2.22935213513232, 0.0199971681301339, -1.25006432962273, -3.29270366276619, -2.17351565428834, 5.52205579789852}, + {0.49890284496592, -0.0366892293393394, 1.38371392876153, -0.264792285687091, -0.669780986348047, 0.207567370721467, -2.2457922898487, -1.38371392876153, 2.51058457553579}, + {0.411580036788936, -0.499820012497935, 0.428374194665893, 1.88823366835444, -1.05584860596075, 1.14408858166975, -0.95052361709472, -0.428374194665893, -0.937710051259725}, + {0.131018492133715, 0.185493520523941, -0.221441386342913, 2.89284370159453, -0.395231418435255, 0.0787194057775988, -0.00990973005661754, 0.221441386342913, -2.88293397153791}, + {-0.313534888149137, 2.0651251573941, -0.367384525456806, 2.32514016142788, 1.34582060609471, -3.09741087533967, 0.304129963568726, 0.367384525456807, -2.6292701249966}, + {-0.760141920855525, 4.25707070543081, -0.175960766185656, 0.928732242572134, 3.3605045324116, -6.85743331698688, 0.169621491116733, 0.175960766185655, -1.09835373368887}, + {0.114864005218869, 0.747754769731037, 5.14747713919705, -2.9899590885004, -0.373161398695258, -0.489457376254649, 0.0487062086852013, -5.14747713919705, 2.9412528798152}, + {0.0176550114649053, -0.0366892293393393, 3.57536454824034, -0.355133712919657, -0.278874580079601, 0.297908797954035, 0.427106163131137, -3.57536454824034, -0.0719724502114772}, + {-0.159482701141711, -0.499820012497934, 1.6160392329029, 2.53245834470817, 0.159438808323621, 0.499863905316025, 0.80820415907293, -1.6160392329029, -3.3406625037811}, + {-0.402619444364211, 0.185493520523941, 0.164475469373326, 3.8798196933031, 1.12538250977124, -0.908256585930973, 0.909645062157548, -0.164475469373326, -4.78946475546065}, + {-0.668812812335656, 2.0651251573941, -0.366556578826485, 3.11842792717263, 2.49438629602598, -3.89069864108442, 0.660235834385566, 0.366556578826485, -3.7786637615582}, + {-0.890691874867567, 4.25707070543081, -0.223350063624382, 1.24559568930419, 3.80791793315569, -7.17429676371893, 0.252782147690049, 0.223350063624382, -1.49837783699424}, + {-0.719523733335476, 0.747754769731037, 7.65498241660988, -3.47819175253558, -0.0270063241761003, -0.00122471221946219, 3.39059922465238, -7.65498241660988, 0.0875925278832053}, + {-0.752282502061833, -0.0366892293393394, 5.44320749777884, -0.413123763490694, 0.4330728828761, 0.355898848525072, 3.06488662619637, -5.44320749777884, -2.65176286270567}, + {-0.805283966301139, -0.499820012497934, 2.65763675313957, 2.94598536885723, 1.21876709763211, 0.0863368811669633, 2.49560294446903, -2.65763675313957, -5.44158831332626}, + {-0.868883693675367, 0.185493520523941, 0.535917739362792, 4.51335836348859, 2.22518542926789, -1.54179525611646, 1.74735158145817, -0.535917739362792, -6.26070994494676}, + {-0.93069275739179, 2.0651251573941, -0.33219763662625, 3.62763836431237, 3.26547667822185, -4.39990907822416, 0.956474721641935, 0.33219763662625, -4.5841130859543}, + {-0.977881867656349, 4.25707070543081, -0.25037905659104, 1.44898994444256, 4.09850218108284, -7.3776910188573, 0.312943147512173, 0.25037905659104, -1.76193309195473}}; + + // Array of non-zero columns + static const unsigned int nzc0[9] = {0, 2, 3, 4, 5, 6, 7, 8, 9}; + + static const double FE1_D10[36][9] = \ + {{-4.43439548859399, 0.719523733335476, -0.105980792723358, -0.120321308049932, -0.610471253261279, 0.120321308049932, 6.97248386301144, -3.25761210775293, 0.716452045984637}, + {-2.73900519484353, 0.752282502061834, -0.551346382257752, -0.37033553083116, -2.62472484093643, 0.37033553083116, 4.93333581959642, -2.94661312681472, 3.17607122319418}, + {-0.774808787805901, 0.80528396630114, -1.31274220292983, 0.0166110937672599, -4.3123822279257, -0.0166110937672606, 2.37115266067607, -2.40162783917131, 5.62512443085554}, + {0.383003391015211, 0.868883693675367, -2.2892447004425, 1.69951535499592, -3.91825765939462, -1.69951535499592, 0.431405225592982, -1.68329231028356, 6.20750235983712}, + {0.335581821335214, 0.93069275739179, -3.29972048467427, 4.52667753652934, -1.16947016988608, -4.52667753652934, -0.344043663537488, -0.922230915189518, 4.46919065456036}, + {-0.431976601534811, 0.977881867656351, -4.10952017623948, 7.42832622636964, 2.40462123462214, -7.42832622636965, -0.243980113766001, -0.301925152355541, 1.70489894161734}, + {-2.5193326485928, -0.11486400521887, -0.00177101934688983, -0.120321308049932, -0.506261479884813, 0.120321308049932, 2.30797044445472, 0.326226209356949, 0.508032499231703}, + {-1.3911199380254, -0.0176550114649058, -0.0893787401084305, -0.37033553083116, -2.16275719878711, 0.37033553083116, 1.4676277924334, -0.0588528429431028, 2.25213593889554}, + {-0.137872907182381, 0.159482701141711, -0.494553539167619, 0.0166110937672598, -3.49419356416349, -0.01661109376726, 0.451479634269601, -0.473089428228931, 3.98874710333111}, + {0.485087315572777, 0.40261944436421, -1.38634768482511, 1.69951535499592, -3.01536064377723, -1.69951535499592, -0.239026872833308, -0.64867988710368, 4.40170832860234}, + {0.229096046393529, 0.668812812335656, -2.64966533039262, 4.52667753652934, -0.519415015604425, -4.52667753652934, -0.392952058710252, -0.504956800018934, 3.16908034599704}, + {-0.503593229192932, 0.890691874867569, -3.86153828640965, 7.42832622636964, 2.65260312445197, -7.42832622636965, -0.187936851238541, -0.199161794436098, 1.20893516195768}, + {-0.468324236183066, -0.482312391761556, 0.160575099784005, -0.120321308049932, -0.343915360753919, 0.120321308049932, -2.16149476690743, 3.11213139485205, 0.183340260969914}, + {-0.00949999791919725, -0.498902844965919, 0.630310512031619, -0.37033553083116, -1.44306794664706, 0.37033553083116, -1.77685992128001, 2.28526276416512, 0.812757434615439}, + {0.419378642724582, -0.411580036788936, 0.780084625516143, 0.0166110937672604, -2.21955539947972, -0.0166110937672599, -1.23408620347497, 1.22628759753933, 1.43947077396358}, + {0.451376715825574, -0.131018492133716, 0.0202557623469021, 1.69951535499592, -1.60875719660521, -1.69951535499592, -0.705243609836828, 0.38488538614497, 1.58850143425831}, + {0.0105050989295734, 0.313534888149137, -1.63695867055358, 4.52667753652934, 0.493291644234604, -4.52667753652934, -0.31104808796886, -0.0129918991098518, 1.14366702631898}, + {-0.620444624272301, 0.760141920855526, -3.47521274203695, 7.42832622636964, 3.03892866882466, -7.42832622636965, -0.0847840150918455, -0.0549132814913815, 0.436284073212286}, + {0.482312391761556, 0.468324236183066, 0.343915360753919, -0.120321308049931, -0.160575099784006, 0.120321308049932, -3.11213139485205, 2.16149476690743, -0.183340260969913}, + {0.49890284496592, 0.00949999791919749, 1.44306794664706, -0.370335530831159, -0.630310512031619, 0.37033553083116, -2.28526276416512, 1.77685992128001, -0.81275743461544}, + {0.411580036788936, -0.419378642724582, 2.21955539947972, 0.0166110937672611, -0.780084625516144, -0.0166110937672601, -1.22628759753933, 1.23408620347497, -1.43947077396358}, + {0.131018492133715, -0.451376715825574, 1.60875719660521, 1.69951535499592, -0.0202557623469027, -1.69951535499592, -0.38488538614497, 0.705243609836828, -1.58850143425831}, + {-0.313534888149137, -0.0105050989295735, -0.493291644234605, 4.52667753652934, 1.63695867055358, -4.52667753652934, 0.0129918991098499, 0.311048087968859, -1.14366702631898}, + {-0.760141920855525, 0.620444624272302, -3.03892866882466, 7.42832622636964, 3.47521274203695, -7.42832622636965, 0.0549132814913782, 0.0847840150918425, -0.436284073212287}, + {0.114864005218869, 2.5193326485928, 0.506261479884813, -0.120321308049932, 0.00177101934688745, 0.120321308049932, -0.326226209356945, -2.30797044445473, -0.5080324992317}, + {0.0176550114649051, 1.3911199380254, 2.16275719878711, -0.370335530831159, 0.0893787401084303, 0.37033553083116, 0.0588528429431052, -1.46762779243341, -2.25213593889554}, + {-0.159482701141711, 0.137872907182382, 3.49419356416349, 0.0166110937672622, 0.494553539167619, -0.0166110937672608, 0.473089428228932, -0.451479634269603, -3.98874710333111}, + {-0.402619444364211, -0.485087315572777, 3.01536064377723, 1.69951535499592, 1.38634768482511, -1.69951535499592, 0.648679887103681, 0.239026872833307, -4.40170832860234}, + {-0.668812812335656, -0.229096046393529, 0.519415015604426, 4.52667753652934, 2.64966533039261, -4.52667753652934, 0.504956800018932, 0.392952058710252, -3.16908034599704}, + {-0.890691874867568, 0.503593229192933, -2.65260312445197, 7.42832622636965, 3.86153828640965, -7.42832622636965, 0.199161794436094, 0.187936851238539, -1.20893516195768}, + {-0.719523733335476, 4.43439548859399, 0.610471253261277, -0.120321308049932, 0.10598079272335, 0.120321308049932, 3.25761210775293, -6.97248386301144, -0.716452045984627}, + {-0.752282502061834, 2.73900519484353, 2.62472484093643, -0.370335530831159, 0.55134638225775, 0.370335530831159, 2.94661312681472, -4.93333581959642, -3.17607122319418}, + {-0.805283966301139, 0.774808787805902, 4.3123822279257, 0.0166110937672631, 1.31274220292983, -0.0166110937672617, 2.40162783917131, -2.37115266067607, -5.62512443085554}, + {-0.868883693675366, -0.38300339101521, 3.91825765939462, 1.69951535499592, 2.2892447004425, -1.69951535499592, 1.68329231028356, -0.431405225592982, -6.20750235983712}, + {-0.930692757391789, -0.335581821335214, 1.16947016988608, 4.52667753652934, 3.29972048467427, -4.52667753652934, 0.922230915189515, 0.344043663537487, -4.46919065456035}, + {-0.977881867656349, 0.431976601534812, -2.40462123462214, 7.42832622636965, 4.10952017623948, -7.42832622636965, 0.301925152355537, 0.243980113765998, -1.70489894161734}}; + + // Array of non-zero columns + static const unsigned int nzc1[9] = {0, 1, 3, 4, 5, 6, 7, 8, 9}; + + // Reset values in the element tensor. + for (unsigned int r = 0; r < 100; r++) + { + A[r] = 0.0; + }// end loop over 'r' + // Number of operations to compute geometry constants: 12. + double G[3]; + G[0] = det*(K_10*K_10 + K_11*K_11); + G[1] = det*(K_00*K_10 + K_01*K_11); + G[2] = det*(K_00*K_00 + K_01*K_01); + + // Compute element tensor using UFL quadrature representation + // Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True) + + // Loop quadrature points for integral. + // Number of operations to compute element tensor for following IP loop = 36720 + for (unsigned int ip = 0; ip < 36; ip++) + { + + // Coefficient declarations. + double F0 = 0.0; + double F1 = 0.0; + double F2 = 0.0; + + // Total number of operations to compute function values = 36 + for (unsigned int r = 0; r < 6; r++) + { + F0 += FE0[ip][r]*w[2][r]; + F1 += FE0[ip][r]*w[0][r]; + F2 += FE0[ip][r]*w[1][r]; + }// end loop over 'r' + + // Number of operations to compute ip constants: 12 + double I[3]; + // Number of operations: 4 + I[0] = F0*F1*F2*G[0]*W36[ip]; + + // Number of operations: 4 + I[1] = F0*F1*F2*G[1]*W36[ip]; + + // Number of operations: 4 + I[2] = F0*F1*F2*G[2]*W36[ip]; + + + // Number of operations for primary indices: 972 + for (unsigned int j = 0; j < 9; j++) + { + for (unsigned int k = 0; k < 9; k++) + { + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc0[k]] += FE1_D01[ip][j]*FE1_D01[ip][k]*I[0]; + // Number of operations to compute entry: 3 + A[nzc0[j]*10 + nzc1[k]] += FE1_D01[ip][j]*FE1_D10[ip][k]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc0[k]] += FE1_D01[ip][k]*FE1_D10[ip][j]*I[1]; + // Number of operations to compute entry: 3 + A[nzc1[j]*10 + nzc1[k]] += FE1_D10[ip][j]*FE1_D10[ip][k]*I[2]; + }// end loop over 'k' + }// end loop over 'j' + }// end loop over 'ip' + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p2_q3_quadrature_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p2_q3_quadrature_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_quadrature_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q3_quadrature_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p2_q3_quadrature_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p2_q3_quadrature_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q3_quadrature_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q3_quadrature_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q3_quadrature_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p2_q3_quadrature_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p2_q3_quadrature_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q3_quadrature_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q3_quadrature_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q3_quadrature_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif diff --git a/laplacian_2d/laplacian_f3_p2_q3_tensor.h b/laplacian_2d/laplacian_f3_p2_q3_tensor.h new file mode 100644 index 0000000..00091a1 --- /dev/null +++ b/laplacian_2d/laplacian_f3_p2_q3_tensor.h @@ -0,0 +1,6250 @@ +// This code conforms with the UFC specification version 2.0.5 +// and was automatically generated by FFC version 1.0.0. +// +// This code was generated with the following parameters: +// +// cache_dir: '' +// convert_exceptions_to_warnings: False +// cpp_optimize: False +// cpp_optimize_flags: '-O2' +// epsilon: 1e-14 +// error_control: False +// form_postfix: True +// format: 'ufc' +// log_level: 20 +// log_prefix: '' +// optimize: True +// output_dir: '.' +// precision: 15 +// quadrature_degree: 'auto' +// quadrature_rule: 'auto' +// representation: 'tensor' +// split: False +// swig_binary: 'swig' +// swig_path: '' + +#ifndef __LAPLACIAN_F3_P2_Q3_TENSOR_H +#define __LAPLACIAN_F3_P2_Q3_TENSOR_H + +#include +#include +#include +#include + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q3_tensor_finite_element_0: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q3_tensor_finite_element_0() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_tensor_finite_element_0() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 6; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Compute value(s). + for (unsigned int r = 0; r < 6; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 6; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582064, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582063, 0.0544331053951818}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[3] *= std::sqrt(7.5); + + // Table(s) of coefficients. + static const double coefficients0[6] = \ + {0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556635, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0}, + {4, 0.0, 7.07106781186548, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[6][6] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175277, 0.0, 0.0, 0.0}, + {2, 6.12372435695794, 3.53553390593274, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[6][6] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; t++) + { + for (unsigned int u = 0; u < 6; u++) + { + for (unsigned int tu = 0; tu < 6; 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 < 6; s++) + { + for (unsigned int t = 0; t < 6; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 6; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.5*x[1][0] + 0.5*x[2][0]; + y[1] = 0.5*x[1][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[2][0]; + y[1] = 0.5*x[0][1] + 0.5*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.5*x[0][0] + 0.5*x[1][0]; + y[1] = 0.5*x[0][1] + 0.5*x[1][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q3_tensor_finite_element_0(); + } + +}; + +/// This class defines the interface for a finite element. + +class laplacian_f3_p2_q3_tensor_finite_element_1: public ufc::finite_element +{ +public: + + /// Constructor + laplacian_f3_p2_q3_tensor_finite_element_1() : ufc::finite_element() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_tensor_finite_element_1() + { + // Do nothing + } + + /// Return a string identifying the finite element + virtual const char* signature() const + { + return "FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return the cell shape + virtual ufc::shape cell_shape() const + { + return ufc::triangle; + } + + /// Return the topological dimension of the cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the finite element function space + virtual unsigned int space_dimension() const + { + return 10; + } + + /// Return the rank of the value space + virtual unsigned int value_rank() const + { + return 0; + } + + /// Return the dimension of the value space for axis i + virtual unsigned int value_dimension(unsigned int i) const + { + return 1; + } + + /// Evaluate basis function i at given point in cell + virtual void evaluate_basis(unsigned int i, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Reset values. + *values = 0.0; + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Compute value(s). + for (unsigned int r = 0; r < 10; r++) + { + *values += coefficients0[r]*basisvalues[r]; + }// end loop over 'r' + break; + } + } + + } + + /// Evaluate all basis functions at given point in cell + virtual void evaluate_basis_all(double* values, + const double* coordinates, + const ufc::cell& c) 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 < 10; r++) + { + evaluate_basis(r, &dof_values, coordinates, c); + values[r] = dof_values; + }// end loop over 'r' + } + + /// Evaluate order n derivatives of basis function i at given point in cell + virtual void evaluate_basis_derivatives(unsigned int i, + unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) const + { + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Compute constants + const double C0 = x[1][0] + x[2][0]; + const double C1 = x[1][1] + x[2][1]; + + // Get coordinates and map to the reference (FIAT) element + double X = (J_01*(C1 - 2.0*coordinates[1]) + J_11*(2.0*coordinates[0] - C0)) / detJ; + double Y = (J_00*(2.0*coordinates[1] - C1) + J_10*(C0 - 2.0*coordinates[0])) / detJ; + + // Compute number of derivatives. + unsigned int num_derivatives = 1; + for (unsigned int r = 0; r < n; r++) + { + num_derivatives *= 2; + }// end loop over 'r' + + // Declare pointer to two dimensional array that holds combinations of derivatives and initialise + unsigned int **combinations = new unsigned int *[num_derivatives]; + for (unsigned int row = 0; row < num_derivatives; row++) + { + combinations[row] = new unsigned int [n]; + for (unsigned int col = 0; col < n; 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_00, K_01}, {K_10, K_11}}; + + // Declare transformation matrix + // Declare pointer to two dimensional array and initialise + double **transform = new double *[num_derivatives]; + + for (unsigned int j = 0; j < num_derivatives; j++) + { + transform[j] = new double [num_derivatives]; + 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]]; + } + } + + // 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' + + switch (i) + { + case 0: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791033, -0.0288675134594813, -0.0166666666666666, 0.0782460796435952, 0.0606091526731326, 0.0349927106111883, -0.0601337794302955, -0.0508223195384204, -0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 1: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0288675134594813, -0.0166666666666666, 0.0782460796435952, -0.0606091526731327, 0.0349927106111883, 0.0601337794302955, -0.0508223195384204, 0.0393667994375868, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 2: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.0471404520791032, 0.0, 0.0333333333333334, 0.0, 0.0, 0.104978131833565, 0.0, 0.0, 0.0, 0.0909137290096989}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 3: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, 0.117369119465393, 0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, -0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 4: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, 0.151522881682832, 0.0262445329583912, 0.0, 0.0, 0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 5: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, 0.117369119465393, -0.0606091526731326, -0.0787335988751736, 0.0, 0.101644639076841, 0.131222664791956, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 6: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.0, 0.3, 0.0, -0.151522881682832, 0.0262445329583912, 0.0, 0.0, -0.131222664791956, -0.136370593514548}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 7: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, -0.259807621135332, -0.15, -0.0782460796435952, 0.090913729009699, 0.0962299541807677, 0.180401338290886, 0.0508223195384204, -0.0131222664791956, -0.0227284322524247}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 8: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.106066017177982, 0.259807621135332, -0.15, -0.0782460796435952, -0.090913729009699, 0.0962299541807678, -0.180401338290886, 0.0508223195384204, 0.0131222664791956, -0.0227284322524248}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + case 9: + { + + // Array of basisvalues. + double basisvalues[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + // Declare helper variables. + double tmp0 = (1.0 + Y + 2.0*X)/2.0; + double tmp1 = (1.0 - Y)/2.0; + double tmp2 = tmp1*tmp1; + + // Compute basisvalues. + basisvalues[0] = 1.0; + basisvalues[1] = tmp0; + basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2; + basisvalues[6] = basisvalues[3]*1.66666666666667*tmp0 - basisvalues[1]*0.666666666666667*tmp2; + basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y); + basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y); + basisvalues[7] = basisvalues[3]*(2.5 + 3.5*Y); + basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556; + basisvalues[9] = basisvalues[5]*(0.05 + Y*1.75) - basisvalues[2]*0.7; + basisvalues[8] = basisvalues[4]*(0.54 + Y*2.1) - basisvalues[1]*0.56; + basisvalues[0] *= std::sqrt(0.5); + basisvalues[2] *= std::sqrt(1.0); + basisvalues[5] *= std::sqrt(1.5); + basisvalues[9] *= std::sqrt(2.0); + basisvalues[1] *= std::sqrt(3.0); + basisvalues[4] *= std::sqrt(4.5); + basisvalues[8] *= std::sqrt(6.0); + basisvalues[3] *= std::sqrt(7.5); + basisvalues[7] *= std::sqrt(10.0); + basisvalues[6] *= std::sqrt(14.0); + + // Table(s) of coefficients. + static const double coefficients0[10] = \ + {0.636396103067893, 0.0, 0.0, -0.234738238930785, 0.0, -0.262445329583912, 0.0, -0.203289278153682, 0.0, 0.090913729009699}; + + // Tables of derivatives of the polynomial base (transpose). + static const double dmats0[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.89897948556636, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 9.48683298050514, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.0, 0.0, 7.07106781186548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {5.29150262212918, 0.0, -2.99332590941915, 13.6626010212795, 0.0, 0.611010092660779, 0.0, 0.0, 0.0, 0.0}, + {0.0, 4.38178046004133, 0.0, 0.0, 12.5219806739988, 0.0, 0.0, 0.0, 0.0, 0.0}, + {3.46410161513776, 0.0, 7.83836717690617, 0.0, 0.0, 8.4, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + static const double dmats1[10][10] = \ + {{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.44948974278318, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {4.24264068711928, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.58198889747161, 4.74341649025257, -0.912870929175276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2, 6.12372435695795, 3.53553390593274, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {-2.3094010767585, 0.0, 8.16496580927726, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {2.64575131106459, 5.18459255872629, -1.49666295470957, 6.83130051063973, -1.05830052442584, 0.305505046330389, 0.0, 0.0, 0.0, 0.0}, + {2.23606797749979, 2.19089023002067, 2.52982212813471, 8.08290376865476, 6.26099033699941, -1.80739222823013, 0.0, 0.0, 0.0, 0.0}, + {1.73205080756888, -5.09116882454314, 3.91918358845309, 0.0, 9.69948452238571, 4.2, 0.0, 0.0, 0.0, 0.0}, + {5, 0.0, -2.82842712474619, 0.0, 0.0, 12.1243556529821, 0.0, 0.0, 0.0, 0.0}}; + + // Compute reference derivatives. + // Declare pointer to array of derivatives on FIAT element. + double *derivatives = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + derivatives[r] = 0.0; + }// end loop over 'r' + + // Declare derivative matrix (of polynomial basis). + double dmats[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; + + // Declare (auxiliary) derivative matrix (of polynomial basis). + double dmats_old[10][10] = \ + {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; t++) + { + for (unsigned int u = 0; u < 10; u++) + { + for (unsigned int tu = 0; tu < 10; 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 < 10; s++) + { + for (unsigned int t = 0; t < 10; 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' + + // Delete pointer to array of derivatives on FIAT element + delete [] derivatives; + + // Delete pointer to array of combinations of derivatives and transform + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] combinations[r]; + }// end loop over 'r' + delete [] combinations; + for (unsigned int r = 0; r < num_derivatives; r++) + { + delete [] transform[r]; + }// end loop over 'r' + delete [] transform; + break; + } + } + + } + + /// Evaluate order n derivatives of all basis functions at given point in cell + virtual void evaluate_basis_derivatives_all(unsigned int n, + double* values, + const double* coordinates, + const ufc::cell& c) 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' + + // Helper variable to hold values of a single dof. + double *dof_values = new double[num_derivatives]; + for (unsigned int r = 0; r < num_derivatives; r++) + { + dof_values[r] = 0.0; + }// end loop over 'r' + + // Loop dofs and call evaluate_basis_derivatives. + for (unsigned int r = 0; r < 10; r++) + { + evaluate_basis_derivatives(r, n, dof_values, coordinates, c); + for (unsigned int s = 0; s < num_derivatives; s++) + { + values[r*num_derivatives + s] = dof_values[s]; + }// end loop over 's' + }// end loop over 'r' + + // Delete pointer. + delete [] dof_values; + } + + /// Evaluate linear functional for dof i on the function f + virtual double evaluate_dof(unsigned int i, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + switch (i) + { + case 0: + { + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 1: + { + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 2: + { + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 3: + { + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 4: + { + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 5: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 6: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 7: + { + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 8: + { + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + case 9: + { + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + return vals[0]; + break; + } + } + + return 0.0; + } + + /// Evaluate linear functionals for all dofs on the function f + virtual void evaluate_dofs(double* values, + const ufc::function& f, + const ufc::cell& c) const + { + // Declare variables for result of evaluation. + double vals[1]; + + // Declare variable for physical coordinates. + double y[2]; + const double * const * x = c.coordinates; + y[0] = x[0][0]; + y[1] = x[0][1]; + f.evaluate(vals, y, c); + values[0] = vals[0]; + y[0] = x[1][0]; + y[1] = x[1][1]; + f.evaluate(vals, y, c); + values[1] = vals[0]; + y[0] = x[2][0]; + y[1] = x[2][1]; + f.evaluate(vals, y, c); + values[2] = vals[0]; + y[0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[3] = vals[0]; + y[0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[4] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[5] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + f.evaluate(vals, y, c); + values[6] = vals[0]; + y[0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + y[1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + f.evaluate(vals, y, c); + values[7] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + y[1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + f.evaluate(vals, y, c); + values[8] = vals[0]; + y[0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + y[1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + f.evaluate(vals, y, c); + values[9] = vals[0]; + } + + /// Interpolate vertex values from dof values + virtual void interpolate_vertex_values(double* vertex_values, + const double* dof_values, + const ufc::cell& c) const + { + // Evaluate function and change variables + vertex_values[0] = dof_values[0]; + vertex_values[1] = dof_values[1]; + vertex_values[2] = dof_values[2]; + } + + /// Map coordinate xhat from reference cell to coordinate x in cell + virtual void map_from_reference_cell(double* x, + const double* xhat, + const ufc::cell& c) const + { + throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Map from coordinate x in cell to coordinate xhat in reference cell + virtual void map_to_reference_cell(double* xhat, + const double* x, + const ufc::cell& c) const + { + throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0)."); + } + + /// Return the number of sub elements (for a mixed element) + virtual unsigned int num_sub_elements() const + { + return 0; + } + + /// Create a new finite element for sub element i (for a mixed element) + virtual ufc::finite_element* create_sub_element(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::finite_element* create() const + { + return new laplacian_f3_p2_q3_tensor_finite_element_1(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q3_tensor_dofmap_0: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q3_tensor_dofmap_0() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_tensor_dofmap_0() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return false; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + m.num_entities[1]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 6; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 6; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 3; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 1; + break; + } + case 2: + { + return 0; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + c.entity_indices[1][0]; + dofs[4] = offset + c.entity_indices[1][1]; + dofs[5] = offset + c.entity_indices[1][2]; + offset += m.num_entities[1]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 4; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 5; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + break; + } + case 1: + { + dofs[0] = 4; + break; + } + case 2: + { + dofs[0] = 5; + break; + } + } + + break; + } + case 2: + { + + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.5*x[1][0] + 0.5*x[2][0]; + coordinates[3][1] = 0.5*x[1][1] + 0.5*x[2][1]; + coordinates[4][0] = 0.5*x[0][0] + 0.5*x[2][0]; + coordinates[4][1] = 0.5*x[0][1] + 0.5*x[2][1]; + coordinates[5][0] = 0.5*x[0][0] + 0.5*x[1][0]; + coordinates[5][1] = 0.5*x[0][1] + 0.5*x[1][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q3_tensor_dofmap_0(); + } + +}; + +/// This class defines the interface for a local-to-global mapping of +/// degrees of freedom (dofs). + +class laplacian_f3_p2_q3_tensor_dofmap_1: public ufc::dofmap +{ +private: + + unsigned int _global_dimension; +public: + + /// Constructor + laplacian_f3_p2_q3_tensor_dofmap_1() : ufc::dofmap() + { + _global_dimension = 0; + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_tensor_dofmap_1() + { + // Do nothing + } + + /// Return a string identifying the dofmap + virtual const char* signature() const + { + return "FFC dofmap for FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None)"; + } + + /// Return true iff mesh entities of topological dimension d are needed + virtual bool needs_mesh_entities(unsigned int d) const + { + switch (d) + { + case 0: + { + return true; + break; + } + case 1: + { + return true; + break; + } + case 2: + { + return true; + break; + } + } + + return false; + } + + /// Initialize dofmap for mesh (return true iff init_cell() is needed) + virtual bool init_mesh(const ufc::mesh& m) + { + _global_dimension = m.num_entities[0] + 2*m.num_entities[1] + m.num_entities[2]; + return false; + } + + /// Initialize dofmap for given cell + virtual void init_cell(const ufc::mesh& m, + const ufc::cell& c) + { + // Do nothing + } + + /// Finish initialization of dofmap for cells + virtual void init_cell_finalize() + { + // Do nothing + } + + /// Return the topological dimension of the associated cell shape + virtual unsigned int topological_dimension() const + { + return 2; + } + + /// Return the geometric dimension of the associated cell shape + virtual unsigned int geometric_dimension() const + { + return 2; + } + + /// Return the dimension of the global finite element function space + virtual unsigned int global_dimension() const + { + return _global_dimension; + } + + /// Return the dimension of the local finite element function space for a cell + virtual unsigned int local_dimension(const ufc::cell& c) const + { + return 10; + } + + /// Return the maximum dimension of the local finite element function space + virtual unsigned int max_local_dimension() const + { + return 10; + } + + /// Return the number of dofs on each cell facet + virtual unsigned int num_facet_dofs() const + { + return 4; + } + + /// Return the number of dofs associated with each cell entity of dimension d + virtual unsigned int num_entity_dofs(unsigned int d) const + { + switch (d) + { + case 0: + { + return 1; + break; + } + case 1: + { + return 2; + break; + } + case 2: + { + return 1; + break; + } + } + + return 0; + } + + /// Tabulate the local-to-global mapping of dofs on a cell + virtual void tabulate_dofs(unsigned int* dofs, + const ufc::mesh& m, + const ufc::cell& c) const + { + unsigned int offset = 0; + dofs[0] = offset + c.entity_indices[0][0]; + dofs[1] = offset + c.entity_indices[0][1]; + dofs[2] = offset + c.entity_indices[0][2]; + offset += m.num_entities[0]; + dofs[3] = offset + 2*c.entity_indices[1][0]; + dofs[4] = offset + 2*c.entity_indices[1][0] + 1; + dofs[5] = offset + 2*c.entity_indices[1][1]; + dofs[6] = offset + 2*c.entity_indices[1][1] + 1; + dofs[7] = offset + 2*c.entity_indices[1][2]; + dofs[8] = offset + 2*c.entity_indices[1][2] + 1; + offset += 2*m.num_entities[1]; + dofs[9] = offset + c.entity_indices[2][0]; + offset += m.num_entities[2]; + } + + /// Tabulate the local-to-local mapping from facet dofs to cell dofs + virtual void tabulate_facet_dofs(unsigned int* dofs, + unsigned int facet) const + { + switch (facet) + { + case 0: + { + dofs[0] = 1; + dofs[1] = 2; + dofs[2] = 3; + dofs[3] = 4; + break; + } + case 1: + { + dofs[0] = 0; + dofs[1] = 2; + dofs[2] = 5; + dofs[3] = 6; + break; + } + case 2: + { + dofs[0] = 0; + dofs[1] = 1; + dofs[2] = 7; + dofs[3] = 8; + break; + } + } + + } + + /// Tabulate the local-to-local mapping of dofs on entity (d, i) + virtual void tabulate_entity_dofs(unsigned int* dofs, + unsigned int d, unsigned int i) const + { + if (d > 2) + { + throw std::runtime_error("d is larger than dimension (2)"); + } + + switch (d) + { + case 0: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 0; + break; + } + case 1: + { + dofs[0] = 1; + break; + } + case 2: + { + dofs[0] = 2; + break; + } + } + + break; + } + case 1: + { + if (i > 2) + { + throw std::runtime_error("i is larger than number of entities (2)"); + } + + switch (i) + { + case 0: + { + dofs[0] = 3; + dofs[1] = 4; + break; + } + case 1: + { + dofs[0] = 5; + dofs[1] = 6; + break; + } + case 2: + { + dofs[0] = 7; + dofs[1] = 8; + break; + } + } + + break; + } + case 2: + { + if (i > 0) + { + throw std::runtime_error("i is larger than number of entities (0)"); + } + + dofs[0] = 9; + break; + } + } + + } + + /// Tabulate the coordinates of all dofs on a cell + virtual void tabulate_coordinates(double** coordinates, + const ufc::cell& c) const + { + const double * const * x = c.coordinates; + + coordinates[0][0] = x[0][0]; + coordinates[0][1] = x[0][1]; + coordinates[1][0] = x[1][0]; + coordinates[1][1] = x[1][1]; + coordinates[2][0] = x[2][0]; + coordinates[2][1] = x[2][1]; + coordinates[3][0] = 0.666666666666667*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[3][1] = 0.666666666666667*x[1][1] + 0.333333333333333*x[2][1]; + coordinates[4][0] = 0.333333333333333*x[1][0] + 0.666666666666667*x[2][0]; + coordinates[4][1] = 0.333333333333333*x[1][1] + 0.666666666666667*x[2][1]; + coordinates[5][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[2][0]; + coordinates[5][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[2][1]; + coordinates[6][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[2][0]; + coordinates[6][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[2][1]; + coordinates[7][0] = 0.666666666666667*x[0][0] + 0.333333333333333*x[1][0]; + coordinates[7][1] = 0.666666666666667*x[0][1] + 0.333333333333333*x[1][1]; + coordinates[8][0] = 0.333333333333333*x[0][0] + 0.666666666666667*x[1][0]; + coordinates[8][1] = 0.333333333333333*x[0][1] + 0.666666666666667*x[1][1]; + coordinates[9][0] = 0.333333333333333*x[0][0] + 0.333333333333333*x[1][0] + 0.333333333333333*x[2][0]; + coordinates[9][1] = 0.333333333333333*x[0][1] + 0.333333333333333*x[1][1] + 0.333333333333333*x[2][1]; + } + + /// Return the number of sub dofmaps (for a mixed element) + virtual unsigned int num_sub_dofmaps() const + { + return 0; + } + + /// Create a new dofmap for sub dofmap i (for a mixed element) + virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const + { + return 0; + } + + /// Create a new class instance + virtual ufc::dofmap* create() const + { + return new laplacian_f3_p2_q3_tensor_dofmap_1(); + } + +}; + +/// This class defines the interface for the tabulation of the cell +/// tensor corresponding to the local contribution to a form from +/// the integral over a cell. + +class laplacian_f3_p2_q3_tensor_cell_integral_0_0: public ufc::cell_integral +{ +public: + + /// Constructor + laplacian_f3_p2_q3_tensor_cell_integral_0_0() : ufc::cell_integral() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_tensor_cell_integral_0_0() + { + // Do nothing + } + + /// Tabulate the tensor for the contribution from a local cell + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c) const + { + // Number of operations (multiply-add pairs) for Jacobian data: 11 + // Number of operations (multiply-add pairs) for geometry tensor: 3024 + // Number of operations (multiply-add pairs) for tensor contraction: 45199 + // Total number of operations (multiply-add pairs): 48234 + + // Extract vertex coordinates + const double * const * x = c.coordinates; + + // Compute Jacobian of affine map from reference cell + const double J_00 = x[1][0] - x[0][0]; + const double J_01 = x[2][0] - x[0][0]; + const double J_10 = x[1][1] - x[0][1]; + const double J_11 = x[2][1] - x[0][1]; + + // Compute determinant of Jacobian + double detJ = J_00*J_11 - J_01*J_10; + + // Compute inverse of Jacobian + const double K_00 = J_11 / detJ; + const double K_01 = -J_01 / detJ; + const double K_10 = -J_10 / detJ; + const double K_11 = J_00 / detJ; + + // Set scale factor + const double det = std::abs(detJ); + + // Compute geometry tensor + const double G0_0_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_3 = det*(w[2][0]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_4 = det*(w[2][0]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_3 = det*(w[2][0]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_2_5 = det*(w[2][0]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_1 = det*(w[2][0]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_2 = det*(w[2][0]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_1 = det*(w[2][0]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_4 = det*(w[2][0]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_4_5 = det*(w[2][0]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_2 = det*(w[2][0]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_4 = det*(w[2][0]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_0_5_5 = det*(w[2][0]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_3 = det*(w[2][1]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_4 = det*(w[2][1]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_4 = det*(w[2][1]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_2_5 = det*(w[2][1]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_0 = det*(w[2][1]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_3 = det*(w[2][1]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_3_5 = det*(w[2][1]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_0 = det*(w[2][1]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_2 = det*(w[2][1]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_2 = det*(w[2][1]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_3 = det*(w[2][1]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_1_5_5 = det*(w[2][1]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_3 = det*(w[2][2]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_0_5 = det*(w[2][2]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_4 = det*(w[2][2]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_1_5 = det*(w[2][2]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_0 = det*(w[2][2]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_3 = det*(w[2][2]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_4 = det*(w[2][2]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_1 = det*(w[2][2]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_3 = det*(w[2][2]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_4 = det*(w[2][2]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_0 = det*(w[2][2]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_1 = det*(w[2][2]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_1 = det*(w[2][3]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_2 = det*(w[2][3]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_0 = det*(w[2][3]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_3 = det*(w[2][3]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_1_5 = det*(w[2][3]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_0 = det*(w[2][3]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_3 = det*(w[2][3]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_4 = det*(w[2][3]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_1 = det*(w[2][3]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_2 = det*(w[2][3]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_2 = det*(w[2][3]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_1 = det*(w[2][3]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_1 = det*(w[2][4]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_4 = det*(w[2][4]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_0_5 = det*(w[2][4]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_0 = det*(w[2][4]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_2 = det*(w[2][4]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_1 = det*(w[2][4]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_3 = det*(w[2][4]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_4 = det*(w[2][4]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_2 = det*(w[2][4]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_0 = det*(w[2][4]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_2 = det*(w[2][4]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_0 = det*(w[2][4]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_2 = det*(w[2][5]*w[0][0]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_4 = det*(w[2][5]*w[0][0]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_0_5 = det*(w[2][5]*w[0][0]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_2 = det*(w[2][5]*w[0][1]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_3 = det*(w[2][5]*w[0][1]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_1_5 = det*(w[2][5]*w[0][1]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_0 = det*(w[2][5]*w[0][2]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_1 = det*(w[2][5]*w[0][2]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_1 = det*(w[2][5]*w[0][3]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_0 = det*(w[2][5]*w[0][4]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_0 = det*(w[2][5]*w[0][5]*w[1][0]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_1 = det*(w[2][5]*w[0][5]*w[1][1]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_00*K_00 + K_01*K_01))); + const double G0_0_0_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_00*K_00 + K_01*K_01))); + const double G0_0_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_3 = det*(w[2][0]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_4 = det*(w[2][0]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_3 = det*(w[2][0]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_2_5 = det*(w[2][0]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_1 = det*(w[2][0]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_2 = det*(w[2][0]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_1 = det*(w[2][0]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_4 = det*(w[2][0]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_4_5 = det*(w[2][0]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_2 = det*(w[2][0]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_4 = det*(w[2][0]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_0_5_5 = det*(w[2][0]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_3 = det*(w[2][1]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_4 = det*(w[2][1]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_4 = det*(w[2][1]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_2_5 = det*(w[2][1]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_0 = det*(w[2][1]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_3 = det*(w[2][1]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_3_5 = det*(w[2][1]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_0 = det*(w[2][1]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_2 = det*(w[2][1]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_2 = det*(w[2][1]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_3 = det*(w[2][1]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_1_5_5 = det*(w[2][1]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_3 = det*(w[2][2]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_0_5 = det*(w[2][2]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_4 = det*(w[2][2]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_1_5 = det*(w[2][2]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_0 = det*(w[2][2]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_3 = det*(w[2][2]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_4 = det*(w[2][2]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_1 = det*(w[2][2]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_3 = det*(w[2][2]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_4 = det*(w[2][2]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_0 = det*(w[2][2]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_1 = det*(w[2][2]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_1 = det*(w[2][3]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_2 = det*(w[2][3]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_0 = det*(w[2][3]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_3 = det*(w[2][3]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_1_5 = det*(w[2][3]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_0 = det*(w[2][3]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_3 = det*(w[2][3]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_4 = det*(w[2][3]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_1 = det*(w[2][3]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_2 = det*(w[2][3]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_2 = det*(w[2][3]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_1 = det*(w[2][3]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_1 = det*(w[2][4]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_4 = det*(w[2][4]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_0_5 = det*(w[2][4]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_0 = det*(w[2][4]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_2 = det*(w[2][4]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_1 = det*(w[2][4]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_3 = det*(w[2][4]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_4 = det*(w[2][4]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_2 = det*(w[2][4]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_0 = det*(w[2][4]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_2 = det*(w[2][4]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_0 = det*(w[2][4]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_2 = det*(w[2][5]*w[0][0]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_4 = det*(w[2][5]*w[0][0]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_0_5 = det*(w[2][5]*w[0][0]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_2 = det*(w[2][5]*w[0][1]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_3 = det*(w[2][5]*w[0][1]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_1_5 = det*(w[2][5]*w[0][1]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_0 = det*(w[2][5]*w[0][2]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_1 = det*(w[2][5]*w[0][2]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_1 = det*(w[2][5]*w[0][3]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_0 = det*(w[2][5]*w[0][4]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_0 = det*(w[2][5]*w[0][5]*w[1][0]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_1 = det*(w[2][5]*w[0][5]*w[1][1]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_00*K_10 + K_01*K_11))); + const double G0_0_1_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_00*K_10 + K_01*K_11))); + const double G0_1_0_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_3 = det*(w[2][0]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_4 = det*(w[2][0]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_3 = det*(w[2][0]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_2_5 = det*(w[2][0]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_1 = det*(w[2][0]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_2 = det*(w[2][0]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_1 = det*(w[2][0]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_4 = det*(w[2][0]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_4_5 = det*(w[2][0]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_2 = det*(w[2][0]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_4 = det*(w[2][0]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_0_5_5 = det*(w[2][0]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_3 = det*(w[2][1]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_4 = det*(w[2][1]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_4 = det*(w[2][1]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_2_5 = det*(w[2][1]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_0 = det*(w[2][1]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_3 = det*(w[2][1]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_3_5 = det*(w[2][1]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_0 = det*(w[2][1]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_2 = det*(w[2][1]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_2 = det*(w[2][1]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_3 = det*(w[2][1]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_1_5_5 = det*(w[2][1]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_3 = det*(w[2][2]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_0_5 = det*(w[2][2]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_4 = det*(w[2][2]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_1_5 = det*(w[2][2]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_0 = det*(w[2][2]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_3 = det*(w[2][2]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_4 = det*(w[2][2]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_1 = det*(w[2][2]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_3 = det*(w[2][2]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_4 = det*(w[2][2]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_0 = det*(w[2][2]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_1 = det*(w[2][2]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_1 = det*(w[2][3]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_2 = det*(w[2][3]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_0 = det*(w[2][3]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_3 = det*(w[2][3]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_1_5 = det*(w[2][3]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_0 = det*(w[2][3]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_3 = det*(w[2][3]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_4 = det*(w[2][3]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_1 = det*(w[2][3]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_2 = det*(w[2][3]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_2 = det*(w[2][3]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_1 = det*(w[2][3]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_1 = det*(w[2][4]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_4 = det*(w[2][4]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_0_5 = det*(w[2][4]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_0 = det*(w[2][4]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_2 = det*(w[2][4]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_1 = det*(w[2][4]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_3 = det*(w[2][4]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_4 = det*(w[2][4]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_2 = det*(w[2][4]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_0 = det*(w[2][4]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_2 = det*(w[2][4]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_0 = det*(w[2][4]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_2 = det*(w[2][5]*w[0][0]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_4 = det*(w[2][5]*w[0][0]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_0_5 = det*(w[2][5]*w[0][0]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_2 = det*(w[2][5]*w[0][1]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_3 = det*(w[2][5]*w[0][1]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_1_5 = det*(w[2][5]*w[0][1]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_0 = det*(w[2][5]*w[0][2]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_1 = det*(w[2][5]*w[0][2]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_1 = det*(w[2][5]*w[0][3]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_0 = det*(w[2][5]*w[0][4]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_0 = det*(w[2][5]*w[0][5]*w[1][0]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_1 = det*(w[2][5]*w[0][5]*w[1][1]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_10*K_00 + K_11*K_01))); + const double G0_1_0_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_10*K_00 + K_11*K_01))); + const double G0_1_1_0_0_0 = det*(w[2][0]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_1 = det*(w[2][0]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_2 = det*(w[2][0]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_3 = det*(w[2][0]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_4 = det*(w[2][0]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_0_5 = det*(w[2][0]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_0 = det*(w[2][0]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_1 = det*(w[2][0]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_2 = det*(w[2][0]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_3 = det*(w[2][0]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_4 = det*(w[2][0]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_1_5 = det*(w[2][0]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_0 = det*(w[2][0]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_1 = det*(w[2][0]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_2 = det*(w[2][0]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_3 = det*(w[2][0]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_4 = det*(w[2][0]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_2_5 = det*(w[2][0]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_0 = det*(w[2][0]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_1 = det*(w[2][0]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_2 = det*(w[2][0]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_3 = det*(w[2][0]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_4 = det*(w[2][0]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_3_5 = det*(w[2][0]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_0 = det*(w[2][0]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_1 = det*(w[2][0]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_2 = det*(w[2][0]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_3 = det*(w[2][0]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_4 = det*(w[2][0]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_4_5 = det*(w[2][0]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_0 = det*(w[2][0]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_1 = det*(w[2][0]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_2 = det*(w[2][0]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_3 = det*(w[2][0]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_4 = det*(w[2][0]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_0_5_5 = det*(w[2][0]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_0 = det*(w[2][1]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_1 = det*(w[2][1]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_2 = det*(w[2][1]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_3 = det*(w[2][1]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_4 = det*(w[2][1]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_0_5 = det*(w[2][1]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_0 = det*(w[2][1]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_1 = det*(w[2][1]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_2 = det*(w[2][1]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_3 = det*(w[2][1]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_4 = det*(w[2][1]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_1_5 = det*(w[2][1]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_0 = det*(w[2][1]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_1 = det*(w[2][1]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_2 = det*(w[2][1]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_3 = det*(w[2][1]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_4 = det*(w[2][1]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_2_5 = det*(w[2][1]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_0 = det*(w[2][1]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_1 = det*(w[2][1]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_2 = det*(w[2][1]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_3 = det*(w[2][1]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_4 = det*(w[2][1]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_3_5 = det*(w[2][1]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_0 = det*(w[2][1]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_1 = det*(w[2][1]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_2 = det*(w[2][1]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_3 = det*(w[2][1]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_4 = det*(w[2][1]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_4_5 = det*(w[2][1]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_0 = det*(w[2][1]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_1 = det*(w[2][1]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_2 = det*(w[2][1]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_3 = det*(w[2][1]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_4 = det*(w[2][1]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_1_5_5 = det*(w[2][1]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_0 = det*(w[2][2]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_1 = det*(w[2][2]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_2 = det*(w[2][2]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_3 = det*(w[2][2]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_4 = det*(w[2][2]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_0_5 = det*(w[2][2]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_0 = det*(w[2][2]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_1 = det*(w[2][2]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_2 = det*(w[2][2]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_3 = det*(w[2][2]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_4 = det*(w[2][2]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_1_5 = det*(w[2][2]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_0 = det*(w[2][2]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_1 = det*(w[2][2]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_2 = det*(w[2][2]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_3 = det*(w[2][2]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_4 = det*(w[2][2]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_2_5 = det*(w[2][2]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_0 = det*(w[2][2]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_1 = det*(w[2][2]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_2 = det*(w[2][2]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_3 = det*(w[2][2]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_4 = det*(w[2][2]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_3_5 = det*(w[2][2]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_0 = det*(w[2][2]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_1 = det*(w[2][2]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_2 = det*(w[2][2]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_3 = det*(w[2][2]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_4 = det*(w[2][2]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_4_5 = det*(w[2][2]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_0 = det*(w[2][2]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_1 = det*(w[2][2]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_2 = det*(w[2][2]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_3 = det*(w[2][2]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_4 = det*(w[2][2]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_2_5_5 = det*(w[2][2]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_0 = det*(w[2][3]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_1 = det*(w[2][3]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_2 = det*(w[2][3]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_3 = det*(w[2][3]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_4 = det*(w[2][3]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_0_5 = det*(w[2][3]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_0 = det*(w[2][3]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_1 = det*(w[2][3]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_2 = det*(w[2][3]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_3 = det*(w[2][3]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_4 = det*(w[2][3]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_1_5 = det*(w[2][3]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_0 = det*(w[2][3]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_1 = det*(w[2][3]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_2 = det*(w[2][3]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_3 = det*(w[2][3]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_4 = det*(w[2][3]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_2_5 = det*(w[2][3]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_0 = det*(w[2][3]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_1 = det*(w[2][3]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_2 = det*(w[2][3]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_3 = det*(w[2][3]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_4 = det*(w[2][3]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_3_5 = det*(w[2][3]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_0 = det*(w[2][3]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_1 = det*(w[2][3]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_2 = det*(w[2][3]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_3 = det*(w[2][3]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_4 = det*(w[2][3]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_4_5 = det*(w[2][3]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_0 = det*(w[2][3]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_1 = det*(w[2][3]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_2 = det*(w[2][3]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_3 = det*(w[2][3]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_4 = det*(w[2][3]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_3_5_5 = det*(w[2][3]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_0 = det*(w[2][4]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_1 = det*(w[2][4]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_2 = det*(w[2][4]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_3 = det*(w[2][4]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_4 = det*(w[2][4]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_0_5 = det*(w[2][4]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_0 = det*(w[2][4]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_1 = det*(w[2][4]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_2 = det*(w[2][4]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_3 = det*(w[2][4]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_4 = det*(w[2][4]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_1_5 = det*(w[2][4]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_0 = det*(w[2][4]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_1 = det*(w[2][4]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_2 = det*(w[2][4]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_3 = det*(w[2][4]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_4 = det*(w[2][4]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_2_5 = det*(w[2][4]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_0 = det*(w[2][4]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_1 = det*(w[2][4]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_2 = det*(w[2][4]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_3 = det*(w[2][4]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_4 = det*(w[2][4]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_3_5 = det*(w[2][4]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_0 = det*(w[2][4]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_1 = det*(w[2][4]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_2 = det*(w[2][4]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_3 = det*(w[2][4]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_4 = det*(w[2][4]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_4_5 = det*(w[2][4]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_0 = det*(w[2][4]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_1 = det*(w[2][4]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_2 = det*(w[2][4]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_3 = det*(w[2][4]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_4 = det*(w[2][4]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_4_5_5 = det*(w[2][4]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_0 = det*(w[2][5]*w[0][0]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_1 = det*(w[2][5]*w[0][0]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_2 = det*(w[2][5]*w[0][0]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_3 = det*(w[2][5]*w[0][0]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_4 = det*(w[2][5]*w[0][0]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_0_5 = det*(w[2][5]*w[0][0]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_0 = det*(w[2][5]*w[0][1]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_1 = det*(w[2][5]*w[0][1]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_2 = det*(w[2][5]*w[0][1]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_3 = det*(w[2][5]*w[0][1]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_4 = det*(w[2][5]*w[0][1]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_1_5 = det*(w[2][5]*w[0][1]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_0 = det*(w[2][5]*w[0][2]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_1 = det*(w[2][5]*w[0][2]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_2 = det*(w[2][5]*w[0][2]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_3 = det*(w[2][5]*w[0][2]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_4 = det*(w[2][5]*w[0][2]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_2_5 = det*(w[2][5]*w[0][2]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_0 = det*(w[2][5]*w[0][3]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_1 = det*(w[2][5]*w[0][3]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_2 = det*(w[2][5]*w[0][3]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_3 = det*(w[2][5]*w[0][3]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_4 = det*(w[2][5]*w[0][3]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_3_5 = det*(w[2][5]*w[0][3]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_0 = det*(w[2][5]*w[0][4]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_1 = det*(w[2][5]*w[0][4]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_2 = det*(w[2][5]*w[0][4]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_3 = det*(w[2][5]*w[0][4]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_4 = det*(w[2][5]*w[0][4]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_4_5 = det*(w[2][5]*w[0][4]*w[1][5]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_0 = det*(w[2][5]*w[0][5]*w[1][0]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_1 = det*(w[2][5]*w[0][5]*w[1][1]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_2 = det*(w[2][5]*w[0][5]*w[1][2]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_3 = det*(w[2][5]*w[0][5]*w[1][3]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_4 = det*(w[2][5]*w[0][5]*w[1][4]*((K_10*K_10 + K_11*K_11))); + const double G0_1_1_5_5_5 = det*(w[2][5]*w[0][5]*w[1][5]*((K_10*K_10 + K_11*K_11))); + + // Compute element tensor + A[73] = -0.00730519480519515*G0_0_0_0_0_0 + 0.000535714285714308*G0_0_0_0_0_1 + 0.00155844155844161*G0_0_0_0_0_2 - 0.00112012987012991*G0_0_0_0_0_3 - 0.00657467532467557*G0_0_0_0_0_4 - 0.00316558441558454*G0_0_0_0_0_5 + 0.000535714285714308*G0_0_0_0_1_0 - 0.000937500000000032*G0_0_0_0_1_1 + 0.000255681818181826*G0_0_0_0_1_2 - 0.00150974025974031*G0_0_0_0_1_3 + 4.87012987013039e-05*G0_0_0_0_1_4 + 0.00155844155844161*G0_0_0_0_2_0 + 0.000255681818181826*G0_0_0_0_2_1 - 0.000547889610389629*G0_0_0_0_2_2 - 0.000633116883116902*G0_0_0_0_2_3 + 0.000389610389610409*G0_0_0_0_2_4 - 0.0010227272727273*G0_0_0_0_2_5 - 0.00112012987012991*G0_0_0_0_3_0 - 0.00150974025974031*G0_0_0_0_3_1 - 0.000633116883116902*G0_0_0_0_3_2 - 0.0015584415584416*G0_0_0_0_3_3 + 0.00214285714285721*G0_0_0_0_3_4 + 0.00428571428571442*G0_0_0_0_3_5 - 0.00657467532467557*G0_0_0_0_4_0 + 4.87012987013038e-05*G0_0_0_0_4_1 + 0.000389610389610409*G0_0_0_0_4_2 + 0.00214285714285721*G0_0_0_0_4_3 - 0.00759740259740288*G0_0_0_0_4_4 + 0.001948051948052*G0_0_0_0_4_5 - 0.00316558441558454*G0_0_0_0_5_0 - 0.0010227272727273*G0_0_0_0_5_2 + 0.00428571428571442*G0_0_0_0_5_3 + 0.001948051948052*G0_0_0_0_5_4 + 0.00759740259740283*G0_0_0_0_5_5 + 0.000535714285714308*G0_0_0_1_0_0 - 0.000937500000000032*G0_0_0_1_0_1 + 0.000255681818181826*G0_0_0_1_0_2 - 0.00150974025974031*G0_0_0_1_0_3 + 4.87012987013039e-05*G0_0_0_1_0_4 - 0.000937500000000032*G0_0_0_1_1_0 + 0.0210024350649358*G0_0_0_1_1_1 - 0.00309253246753258*G0_0_0_1_1_2 + 0.0168019480519486*G0_0_0_1_1_3 - 4.87012987012988e-05*G0_0_0_1_1_4 + 0.00243506493506504*G0_0_0_1_1_5 + 0.000255681818181826*G0_0_0_1_2_0 - 0.00309253246753258*G0_0_0_1_2_1 + 0.000767045454545482*G0_0_0_1_2_2 - 0.00594155844155865*G0_0_0_1_2_3 - 0.00112012987012991*G0_0_0_1_2_4 - 0.00131493506493511*G0_0_0_1_2_5 - 0.00150974025974031*G0_0_0_1_3_0 + 0.0168019480519486*G0_0_0_1_3_1 - 0.00594155844155865*G0_0_0_1_3_2 + 0.0268831168831178*G0_0_0_1_3_3 + 0.00311688311688322*G0_0_0_1_3_4 + 0.00564935064935086*G0_0_0_1_3_5 + 4.87012987013038e-05*G0_0_0_1_4_0 - 4.87012987012985e-05*G0_0_0_1_4_1 - 0.00112012987012991*G0_0_0_1_4_2 + 0.00311688311688322*G0_0_0_1_4_3 + 0.00331168831168842*G0_0_0_1_4_4 + 0.00272727272727282*G0_0_0_1_4_5 + 0.00243506493506504*G0_0_0_1_5_1 - 0.00131493506493511*G0_0_0_1_5_2 + 0.00564935064935086*G0_0_0_1_5_3 + 0.00272727272727282*G0_0_0_1_5_4 + 0.00175324675324681*G0_0_0_1_5_5 + 0.00155844155844161*G0_0_0_2_0_0 + 0.000255681818181826*G0_0_0_2_0_1 - 0.000547889610389629*G0_0_0_2_0_2 - 0.000633116883116902*G0_0_0_2_0_3 + 0.000389610389610409*G0_0_0_2_0_4 - 0.0010227272727273*G0_0_0_2_0_5 + 0.000255681818181826*G0_0_0_2_1_0 - 0.00309253246753258*G0_0_0_2_1_1 + 0.000767045454545482*G0_0_0_2_1_2 - 0.00594155844155865*G0_0_0_2_1_3 - 0.00112012987012991*G0_0_0_2_1_4 - 0.00131493506493511*G0_0_0_2_1_5 - 0.000547889610389629*G0_0_0_2_2_0 + 0.000767045454545482*G0_0_0_2_2_1 + 0.0021915584415585*G0_0_0_2_2_2 + 0.00224025974025982*G0_0_0_2_2_3 + 0.000681818181818203*G0_0_0_2_2_4 - 0.00131493506493511*G0_0_0_2_2_5 - 0.000633116883116902*G0_0_0_2_3_0 - 0.00594155844155865*G0_0_0_2_3_1 + 0.00224025974025982*G0_0_0_2_3_2 - 0.00467532467532485*G0_0_0_2_3_3 + 0.00350649350649362*G0_0_0_2_3_4 + 0.00389610389610402*G0_0_0_2_3_5 + 0.000389610389610409*G0_0_0_2_4_0 - 0.00112012987012991*G0_0_0_2_4_1 + 0.000681818181818202*G0_0_0_2_4_2 + 0.00350649350649362*G0_0_0_2_4_3 + 0.00935064935064966*G0_0_0_2_4_4 + 0.00487012987013003*G0_0_0_2_4_5 - 0.0010227272727273*G0_0_0_2_5_0 - 0.00131493506493511*G0_0_0_2_5_1 - 0.00131493506493511*G0_0_0_2_5_2 + 0.00389610389610402*G0_0_0_2_5_3 + 0.00487012987013003*G0_0_0_2_5_4 + 0.00935064935064966*G0_0_0_2_5_5 - 0.00112012987012991*G0_0_0_3_0_0 - 0.00150974025974031*G0_0_0_3_0_1 - 0.000633116883116902*G0_0_0_3_0_2 - 0.0015584415584416*G0_0_0_3_0_3 + 0.00214285714285721*G0_0_0_3_0_4 + 0.00428571428571442*G0_0_0_3_0_5 - 0.00150974025974031*G0_0_0_3_1_0 + 0.0168019480519486*G0_0_0_3_1_1 - 0.00594155844155865*G0_0_0_3_1_2 + 0.0268831168831178*G0_0_0_3_1_3 + 0.00311688311688322*G0_0_0_3_1_4 + 0.00564935064935085*G0_0_0_3_1_5 - 0.000633116883116902*G0_0_0_3_2_0 - 0.00594155844155865*G0_0_0_3_2_1 + 0.00224025974025982*G0_0_0_3_2_2 - 0.00467532467532485*G0_0_0_3_2_3 + 0.00350649350649362*G0_0_0_3_2_4 + 0.00389610389610402*G0_0_0_3_2_5 - 0.0015584415584416*G0_0_0_3_3_0 + 0.0268831168831178*G0_0_0_3_3_1 - 0.00467532467532485*G0_0_0_3_3_2 + 0.15428571428572*G0_0_0_3_3_3 - 0.00311688311688319*G0_0_0_3_3_4 - 0.00467532467532476*G0_0_0_3_3_5 + 0.00214285714285721*G0_0_0_3_4_0 + 0.00311688311688322*G0_0_0_3_4_1 + 0.00350649350649362*G0_0_0_3_4_2 - 0.00311688311688319*G0_0_0_3_4_3 - 0.0109090909090912*G0_0_0_3_4_4 - 0.0140259740259745*G0_0_0_3_4_5 + 0.00428571428571442*G0_0_0_3_5_0 + 0.00564935064935086*G0_0_0_3_5_1 + 0.00389610389610402*G0_0_0_3_5_2 - 0.00467532467532476*G0_0_0_3_5_3 - 0.0140259740259745*G0_0_0_3_5_4 - 0.0272727272727281*G0_0_0_3_5_5 - 0.00657467532467557*G0_0_0_4_0_0 + 4.8701298701304e-05*G0_0_0_4_0_1 + 0.000389610389610409*G0_0_0_4_0_2 + 0.00214285714285721*G0_0_0_4_0_3 - 0.00759740259740288*G0_0_0_4_0_4 + 0.001948051948052*G0_0_0_4_0_5 + 4.87012987013039e-05*G0_0_0_4_1_0 - 4.87012987012985e-05*G0_0_0_4_1_1 - 0.00112012987012991*G0_0_0_4_1_2 + 0.00311688311688322*G0_0_0_4_1_3 + 0.00331168831168842*G0_0_0_4_1_4 + 0.00272727272727282*G0_0_0_4_1_5 + 0.000389610389610409*G0_0_0_4_2_0 - 0.00112012987012991*G0_0_0_4_2_1 + 0.000681818181818203*G0_0_0_4_2_2 + 0.00350649350649362*G0_0_0_4_2_3 + 0.00935064935064966*G0_0_0_4_2_4 + 0.00487012987013003*G0_0_0_4_2_5 + 0.00214285714285721*G0_0_0_4_3_0 + 0.00311688311688322*G0_0_0_4_3_1 + 0.00350649350649362*G0_0_0_4_3_2 - 0.00311688311688319*G0_0_0_4_3_3 - 0.0109090909090912*G0_0_0_4_3_4 - 0.0140259740259745*G0_0_0_4_3_5 - 0.00759740259740288*G0_0_0_4_4_0 + 0.00331168831168842*G0_0_0_4_4_1 + 0.00935064935064966*G0_0_0_4_4_2 - 0.0109090909090912*G0_0_0_4_4_3 - 0.0420779220779235*G0_0_0_4_4_4 - 0.0163636363636369*G0_0_0_4_4_5 + 0.001948051948052*G0_0_0_4_5_0 + 0.00272727272727282*G0_0_0_4_5_1 + 0.00487012987013003*G0_0_0_4_5_2 - 0.0140259740259745*G0_0_0_4_5_3 - 0.0163636363636369*G0_0_0_4_5_4 - 0.024155844155845*G0_0_0_4_5_5 - 0.00316558441558454*G0_0_0_5_0_0 - 0.0010227272727273*G0_0_0_5_0_2 + 0.00428571428571442*G0_0_0_5_0_3 + 0.001948051948052*G0_0_0_5_0_4 + 0.00759740259740283*G0_0_0_5_0_5 + 0.00243506493506504*G0_0_0_5_1_1 - 0.00131493506493511*G0_0_0_5_1_2 + 0.00564935064935086*G0_0_0_5_1_3 + 0.00272727272727282*G0_0_0_5_1_4 + 0.00175324675324681*G0_0_0_5_1_5 - 0.0010227272727273*G0_0_0_5_2_0 - 0.00131493506493511*G0_0_0_5_2_1 - 0.00131493506493511*G0_0_0_5_2_2 + 0.00389610389610402*G0_0_0_5_2_3 + 0.00487012987013003*G0_0_0_5_2_4 + 0.00935064935064966*G0_0_0_5_2_5 + 0.00428571428571442*G0_0_0_5_3_0 + 0.00564935064935086*G0_0_0_5_3_1 + 0.00389610389610402*G0_0_0_5_3_2 - 0.00467532467532476*G0_0_0_5_3_3 - 0.0140259740259745*G0_0_0_5_3_4 - 0.0272727272727281*G0_0_0_5_3_5 + 0.001948051948052*G0_0_0_5_4_0 + 0.00272727272727282*G0_0_0_5_4_1 + 0.00487012987013003*G0_0_0_5_4_2 - 0.0140259740259745*G0_0_0_5_4_3 - 0.0163636363636369*G0_0_0_5_4_4 - 0.024155844155845*G0_0_0_5_4_5 + 0.00759740259740283*G0_0_0_5_5_0 + 0.00175324675324681*G0_0_0_5_5_1 + 0.00935064935064966*G0_0_0_5_5_2 - 0.0272727272727281*G0_0_0_5_5_3 - 0.024155844155845*G0_0_0_5_5_4 - 0.0701298701298725*G0_0_0_5_5_5 - 0.00566152597402608*G0_0_1_0_0_0 + 0.000523538961038974*G0_0_1_0_0_1 + 0.0006818181818182*G0_0_1_0_0_2 - 0.000535714285714301*G0_0_1_0_0_3 - 0.002435064935065*G0_0_1_0_0_4 - 0.00462662337662351*G0_0_1_0_0_5 + 0.000523538961038974*G0_0_1_0_1_0 - 0.00410308441558455*G0_0_1_0_1_1 + 0.000280032467532478*G0_0_1_0_1_2 - 0.00175324675324681*G0_0_1_0_1_3 + 0.000438311688311701*G0_0_1_0_1_4 + 0.0018019480519481*G0_0_1_0_1_5 + 0.0006818181818182*G0_0_1_0_2_0 + 0.000280032467532478*G0_0_1_0_2_1 - 7.30519480519499e-05*G0_0_1_0_2_2 + 9.74025974026008e-05*G0_0_1_0_2_3 + 0.0001461038961039*G0_0_1_0_2_4 - 0.000730519480519505*G0_0_1_0_2_5 - 0.000535714285714301*G0_0_1_0_3_0 - 0.00175324675324681*G0_0_1_0_3_1 + 9.74025974026008e-05*G0_0_1_0_3_2 - 0.00214285714285721*G0_0_1_0_3_3 + 0.000194805194805204*G0_0_1_0_3_4 + 0.00253246753246761*G0_0_1_0_3_5 - 0.002435064935065*G0_0_1_0_4_0 + 0.000438311688311701*G0_0_1_0_4_1 + 0.0001461038961039*G0_0_1_0_4_2 + 0.000194805194805204*G0_0_1_0_4_3 - 0.00214285714285721*G0_0_1_0_4_4 + 0.000584415584415608*G0_0_1_0_4_5 - 0.00462662337662351*G0_0_1_0_5_0 + 0.0018019480519481*G0_0_1_0_5_1 - 0.000730519480519505*G0_0_1_0_5_2 + 0.00253246753246761*G0_0_1_0_5_3 + 0.000584415584415608*G0_0_1_0_5_4 + 0.0116883116883121*G0_0_1_0_5_5 + 0.000523538961038974*G0_0_1_1_0_0 - 0.00410308441558455*G0_0_1_1_0_1 + 0.000280032467532478*G0_0_1_1_0_2 - 0.00175324675324681*G0_0_1_1_0_3 + 0.000438311688311701*G0_0_1_1_0_4 + 0.0018019480519481*G0_0_1_1_0_5 - 0.00410308441558455*G0_0_1_1_1_0 + 0.111404220779225*G0_0_1_1_1_1 - 0.00848620129870159*G0_0_1_1_1_2 + 0.0389610389610403*G0_0_1_1_1_3 + 0.0012662337662338*G0_0_1_1_1_4 + 0.0136363636363642*G0_0_1_1_1_5 + 0.000280032467532478*G0_0_1_1_2_0 - 0.00848620129870159*G0_0_1_1_2_1 + 0.00137581168831174*G0_0_1_1_2_2 - 0.00676948051948075*G0_0_1_1_2_3 - 0.000292207792207802*G0_0_1_1_2_4 - 0.000974025974026016*G0_0_1_1_2_5 - 0.00175324675324681*G0_0_1_1_3_0 + 0.0389610389610403*G0_0_1_1_3_1 - 0.00676948051948075*G0_0_1_1_3_2 + 0.0354545454545467*G0_0_1_1_3_3 + 0.00097402597402601*G0_0_1_1_3_4 + 0.00545454545454568*G0_0_1_1_3_5 + 0.000438311688311701*G0_0_1_1_4_0 + 0.0012662337662338*G0_0_1_1_4_1 - 0.000292207792207802*G0_0_1_1_4_2 + 0.00097402597402601*G0_0_1_1_4_3 - 0.000194805194805199*G0_0_1_1_4_4 - 0.000584415584415601*G0_0_1_1_4_5 + 0.0018019480519481*G0_0_1_1_5_0 + 0.0136363636363642*G0_0_1_1_5_1 - 0.000974025974026016*G0_0_1_1_5_2 + 0.00545454545454568*G0_0_1_1_5_3 - 0.000584415584415601*G0_0_1_1_5_4 - 0.0112987012987017*G0_0_1_1_5_5 + 0.0006818181818182*G0_0_1_2_0_0 + 0.000280032467532478*G0_0_1_2_0_1 - 7.30519480519499e-05*G0_0_1_2_0_2 + 9.74025974026007e-05*G0_0_1_2_0_3 + 0.0001461038961039*G0_0_1_2_0_4 - 0.000730519480519505*G0_0_1_2_0_5 + 0.000280032467532478*G0_0_1_2_1_0 - 0.00848620129870159*G0_0_1_2_1_1 + 0.00137581168831174*G0_0_1_2_1_2 - 0.00676948051948075*G0_0_1_2_1_3 - 0.000292207792207802*G0_0_1_2_1_4 - 0.000974025974026016*G0_0_1_2_1_5 - 7.30519480519499e-05*G0_0_1_2_2_0 + 0.00137581168831174*G0_0_1_2_2_1 - 0.00032873376623378*G0_0_1_2_2_2 + 0.00136363636363641*G0_0_1_2_2_3 - 0.000146103896103903*G0_0_1_2_2_4 - 0.000584415584415603*G0_0_1_2_2_5 + 9.74025974026008e-05*G0_0_1_2_3_0 - 0.00676948051948075*G0_0_1_2_3_1 + 0.00136363636363641*G0_0_1_2_3_2 - 0.0105194805194809*G0_0_1_2_3_3 + 0.000389610389610402*G0_0_1_2_3_4 + 0.000974025974026*G0_0_1_2_3_5 + 0.0001461038961039*G0_0_1_2_4_0 - 0.000292207792207802*G0_0_1_2_4_1 - 0.000146103896103903*G0_0_1_2_4_2 + 0.000389610389610402*G0_0_1_2_4_3 + 0.00136363636363641*G0_0_1_2_4_4 + 0.00175324675324681*G0_0_1_2_4_5 - 0.000730519480519505*G0_0_1_2_5_0 - 0.000974025974026016*G0_0_1_2_5_1 - 0.000584415584415603*G0_0_1_2_5_2 + 0.000974025974026*G0_0_1_2_5_3 + 0.00175324675324681*G0_0_1_2_5_4 + 0.00759740259740285*G0_0_1_2_5_5 - 0.000535714285714301*G0_0_1_3_0_0 - 0.00175324675324681*G0_0_1_3_0_1 + 9.74025974026008e-05*G0_0_1_3_0_2 - 0.00214285714285721*G0_0_1_3_0_3 + 0.000194805194805204*G0_0_1_3_0_4 + 0.00253246753246761*G0_0_1_3_0_5 - 0.00175324675324681*G0_0_1_3_1_0 + 0.0389610389610403*G0_0_1_3_1_1 - 0.00676948051948075*G0_0_1_3_1_2 + 0.0354545454545467*G0_0_1_3_1_3 + 0.00097402597402601*G0_0_1_3_1_4 + 0.00545454545454568*G0_0_1_3_1_5 + 9.74025974026009e-05*G0_0_1_3_2_0 - 0.00676948051948075*G0_0_1_3_2_1 + 0.00136363636363641*G0_0_1_3_2_2 - 0.0105194805194809*G0_0_1_3_2_3 + 0.000389610389610402*G0_0_1_3_2_4 + 0.000974025974026*G0_0_1_3_2_5 - 0.00214285714285721*G0_0_1_3_3_0 + 0.0354545454545467*G0_0_1_3_3_1 - 0.0105194805194809*G0_0_1_3_3_2 + 0.0818181818181846*G0_0_1_3_3_3 + 0.00233766233766241*G0_0_1_3_3_4 + 0.00233766233766246*G0_0_1_3_3_5 + 0.000194805194805204*G0_0_1_3_4_0 + 0.00097402597402601*G0_0_1_3_4_1 + 0.000389610389610402*G0_0_1_3_4_2 + 0.00233766233766241*G0_0_1_3_4_3 - 0.00389610389610403*G0_0_1_3_4_5 + 0.00253246753246761*G0_0_1_3_5_0 + 0.00545454545454568*G0_0_1_3_5_1 + 0.000974025974026*G0_0_1_3_5_2 + 0.00233766233766245*G0_0_1_3_5_3 - 0.00389610389610403*G0_0_1_3_5_4 - 0.0202597402597409*G0_0_1_3_5_5 - 0.002435064935065*G0_0_1_4_0_0 + 0.000438311688311701*G0_0_1_4_0_1 + 0.0001461038961039*G0_0_1_4_0_2 + 0.000194805194805204*G0_0_1_4_0_3 - 0.00214285714285721*G0_0_1_4_0_4 + 0.000584415584415608*G0_0_1_4_0_5 + 0.000438311688311701*G0_0_1_4_1_0 + 0.0012662337662338*G0_0_1_4_1_1 - 0.000292207792207802*G0_0_1_4_1_2 + 0.00097402597402601*G0_0_1_4_1_3 - 0.000194805194805199*G0_0_1_4_1_4 - 0.000584415584415601*G0_0_1_4_1_5 + 0.0001461038961039*G0_0_1_4_2_0 - 0.000292207792207802*G0_0_1_4_2_1 - 0.000146103896103903*G0_0_1_4_2_2 + 0.000389610389610402*G0_0_1_4_2_3 + 0.00136363636363641*G0_0_1_4_2_4 + 0.00175324675324681*G0_0_1_4_2_5 + 0.000194805194805204*G0_0_1_4_3_0 + 0.00097402597402601*G0_0_1_4_3_1 + 0.000389610389610402*G0_0_1_4_3_2 + 0.00233766233766241*G0_0_1_4_3_3 - 0.00389610389610403*G0_0_1_4_3_5 - 0.00214285714285721*G0_0_1_4_4_0 - 0.000194805194805199*G0_0_1_4_4_1 + 0.00136363636363641*G0_0_1_4_4_2 - 0.00233766233766243*G0_0_1_4_4_4 - 0.00311688311688323*G0_0_1_4_4_5 + 0.000584415584415608*G0_0_1_4_5_0 - 0.000584415584415601*G0_0_1_4_5_1 + 0.00175324675324681*G0_0_1_4_5_2 - 0.00389610389610403*G0_0_1_4_5_3 - 0.00311688311688323*G0_0_1_4_5_4 - 0.0140259740259745*G0_0_1_4_5_5 - 0.00462662337662351*G0_0_1_5_0_0 + 0.0018019480519481*G0_0_1_5_0_1 - 0.000730519480519505*G0_0_1_5_0_2 + 0.00253246753246761*G0_0_1_5_0_3 + 0.000584415584415608*G0_0_1_5_0_4 + 0.0116883116883121*G0_0_1_5_0_5 + 0.0018019480519481*G0_0_1_5_1_0 + 0.0136363636363642*G0_0_1_5_1_1 - 0.000974025974026016*G0_0_1_5_1_2 + 0.00545454545454568*G0_0_1_5_1_3 - 0.000584415584415601*G0_0_1_5_1_4 - 0.0112987012987017*G0_0_1_5_1_5 - 0.000730519480519505*G0_0_1_5_2_0 - 0.000974025974026016*G0_0_1_5_2_1 - 0.000584415584415603*G0_0_1_5_2_2 + 0.000974025974026*G0_0_1_5_2_3 + 0.00175324675324681*G0_0_1_5_2_4 + 0.00759740259740286*G0_0_1_5_2_5 + 0.00253246753246761*G0_0_1_5_3_0 + 0.00545454545454568*G0_0_1_5_3_1 + 0.000974025974025999*G0_0_1_5_3_2 + 0.00233766233766246*G0_0_1_5_3_3 - 0.00389610389610403*G0_0_1_5_3_4 - 0.0202597402597409*G0_0_1_5_3_5 + 0.000584415584415608*G0_0_1_5_4_0 - 0.000584415584415601*G0_0_1_5_4_1 + 0.00175324675324681*G0_0_1_5_4_2 - 0.00389610389610403*G0_0_1_5_4_3 - 0.00311688311688323*G0_0_1_5_4_4 - 0.0140259740259745*G0_0_1_5_4_5 + 0.0116883116883121*G0_0_1_5_5_0 - 0.0112987012987017*G0_0_1_5_5_1 + 0.00759740259740285*G0_0_1_5_5_2 - 0.0202597402597409*G0_0_1_5_5_3 - 0.0140259740259745*G0_0_1_5_5_4 - 0.121558441558446*G0_0_1_5_5_5 + 0.00109577922077927*G0_1_0_0_0_0 + 0.000121753246753249*G0_1_0_0_0_1 + 4.87012987012977e-05*G0_1_0_0_0_2 - 0.000292207792207801*G0_1_0_0_0_3 + 0.000243506493506507*G0_1_0_0_0_4 - 0.0012175324675325*G0_1_0_0_0_5 + 0.000121753246753249*G0_1_0_0_1_0 - 0.00121753246753251*G0_1_0_0_1_1 + 0.000413961038961052*G0_1_0_0_1_2 - 0.00170454545454551*G0_1_0_0_1_3 - 0.000487012987013003*G0_1_0_0_1_4 - 0.000340909090909103*G0_1_0_0_1_5 + 4.87012987012977e-05*G0_1_0_0_2_0 + 0.000413961038961052*G0_1_0_0_2_1 + 0.000170454545454555*G0_1_0_0_2_2 - 0.000243506493506498*G0_1_0_0_2_3 - 0.000925324675324701*G0_1_0_0_2_4 - 0.00107142857142861*G0_1_0_0_2_5 - 0.000292207792207801*G0_1_0_0_3_0 - 0.00170454545454551*G0_1_0_0_3_1 - 0.000243506493506498*G0_1_0_0_3_2 - 0.00525974025974042*G0_1_0_0_3_3 + 0.00155844155844161*G0_1_0_0_3_4 + 0.00272727272727281*G0_1_0_0_3_5 + 0.000243506493506507*G0_1_0_0_4_0 - 0.000487012987013003*G0_1_0_0_4_1 - 0.000925324675324701*G0_1_0_0_4_2 + 0.00155844155844161*G0_1_0_0_4_3 + 0.00292207792207803*G0_1_0_0_4_4 + 0.00311688311688322*G0_1_0_0_4_5 - 0.0012175324675325*G0_1_0_0_5_0 - 0.000340909090909103*G0_1_0_0_5_1 - 0.0010714285714286*G0_1_0_0_5_2 + 0.00272727272727281*G0_1_0_0_5_3 + 0.00311688311688322*G0_1_0_0_5_4 + 0.00642857142857163*G0_1_0_0_5_5 + 0.000121753246753249*G0_1_0_1_0_0 - 0.00121753246753251*G0_1_0_1_0_1 + 0.000413961038961052*G0_1_0_1_0_2 - 0.00170454545454551*G0_1_0_1_0_3 - 0.000487012987013003*G0_1_0_1_0_4 - 0.000340909090909103*G0_1_0_1_0_5 - 0.00121753246753251*G0_1_0_1_1_0 + 0.0226461038961047*G0_1_0_1_1_1 - 0.00340909090909103*G0_1_0_1_1_2 + 0.0185064935064942*G0_1_0_1_1_3 + 0.000243506493506504*G0_1_0_1_1_4 + 0.00340909090909105*G0_1_0_1_1_5 + 0.000413961038961052*G0_1_0_1_2_0 - 0.00340909090909103*G0_1_0_1_2_1 + 0.00104707792207796*G0_1_0_1_2_2 - 0.00657467532467555*G0_1_0_1_2_3 - 0.000925324675324704*G0_1_0_1_2_4 - 0.00180194805194812*G0_1_0_1_2_5 - 0.00170454545454551*G0_1_0_1_3_0 + 0.0185064935064942*G0_1_0_1_3_1 - 0.00657467532467555*G0_1_0_1_3_2 + 0.0280519480519491*G0_1_0_1_3_3 + 0.00292207792207802*G0_1_0_1_3_4 + 0.00701298701298727*G0_1_0_1_3_5 - 0.000487012987013003*G0_1_0_1_4_0 + 0.000243506493506504*G0_1_0_1_4_1 - 0.000925324675324704*G0_1_0_1_4_2 + 0.00292207792207802*G0_1_0_1_4_3 + 0.00155844155844161*G0_1_0_1_4_4 + 0.00311688311688322*G0_1_0_1_4_5 - 0.000340909090909103*G0_1_0_1_5_0 + 0.00340909090909105*G0_1_0_1_5_1 - 0.00180194805194812*G0_1_0_1_5_2 + 0.00701298701298727*G0_1_0_1_5_3 + 0.00311688311688322*G0_1_0_1_5_4 + 0.00467532467532483*G0_1_0_1_5_5 + 4.87012987012977e-05*G0_1_0_2_0_0 + 0.000413961038961052*G0_1_0_2_0_1 + 0.000170454545454555*G0_1_0_2_0_2 - 0.000243506493506498*G0_1_0_2_0_3 - 0.000925324675324701*G0_1_0_2_0_4 - 0.0010714285714286*G0_1_0_2_0_5 + 0.000413961038961052*G0_1_0_2_1_0 - 0.00340909090909103*G0_1_0_2_1_1 + 0.00104707792207796*G0_1_0_2_1_2 - 0.00657467532467555*G0_1_0_2_1_3 - 0.000925324675324704*G0_1_0_2_1_4 - 0.00180194805194812*G0_1_0_2_1_5 + 0.000170454545454555*G0_1_0_2_2_0 + 0.00104707792207796*G0_1_0_2_2_1 - 0.00146103896103906*G0_1_0_2_2_2 + 0.00214285714285721*G0_1_0_2_2_3 - 0.000681818181818222*G0_1_0_2_2_4 - 0.00121753246753251*G0_1_0_2_2_5 - 0.000243506493506498*G0_1_0_2_3_0 - 0.00657467532467555*G0_1_0_2_3_1 + 0.00214285714285721*G0_1_0_2_3_2 - 0.00701298701298729*G0_1_0_2_3_3 + 0.00233766233766241*G0_1_0_2_3_4 + 0.00292207792207801*G0_1_0_2_3_5 - 0.000925324675324701*G0_1_0_2_4_0 - 0.000925324675324704*G0_1_0_2_4_1 - 0.000681818181818222*G0_1_0_2_4_2 + 0.00233766233766241*G0_1_0_2_4_3 + 0.00233766233766239*G0_1_0_2_4_4 + 0.00428571428571442*G0_1_0_2_4_5 - 0.0010714285714286*G0_1_0_2_5_0 - 0.00180194805194812*G0_1_0_2_5_1 - 0.00121753246753251*G0_1_0_2_5_2 + 0.00292207792207801*G0_1_0_2_5_3 + 0.00428571428571442*G0_1_0_2_5_4 + 0.00974025974026006*G0_1_0_2_5_5 - 0.000292207792207801*G0_1_0_3_0_0 - 0.00170454545454551*G0_1_0_3_0_1 - 0.000243506493506498*G0_1_0_3_0_2 - 0.00525974025974042*G0_1_0_3_0_3 + 0.00155844155844161*G0_1_0_3_0_4 + 0.00272727272727281*G0_1_0_3_0_5 - 0.00170454545454551*G0_1_0_3_1_0 + 0.0185064935064942*G0_1_0_3_1_1 - 0.00657467532467555*G0_1_0_3_1_2 + 0.0280519480519491*G0_1_0_3_1_3 + 0.00292207792207802*G0_1_0_3_1_4 + 0.00701298701298727*G0_1_0_3_1_5 - 0.000243506493506498*G0_1_0_3_2_0 - 0.00657467532467555*G0_1_0_3_2_1 + 0.00214285714285721*G0_1_0_3_2_2 - 0.00701298701298729*G0_1_0_3_2_3 + 0.00233766233766241*G0_1_0_3_2_4 + 0.00292207792207801*G0_1_0_3_2_5 - 0.00525974025974042*G0_1_0_3_3_0 + 0.0280519480519491*G0_1_0_3_3_1 - 0.00701298701298729*G0_1_0_3_3_2 + 0.187012987012994*G0_1_0_3_3_3 + 0.00467532467532485*G0_1_0_3_3_4 + 0.00467532467532491*G0_1_0_3_3_5 + 0.00155844155844161*G0_1_0_3_4_0 + 0.00292207792207802*G0_1_0_3_4_1 + 0.00233766233766241*G0_1_0_3_4_2 + 0.00467532467532485*G0_1_0_3_4_3 - 0.00623376623376643*G0_1_0_3_4_4 - 0.0116883116883121*G0_1_0_3_4_5 + 0.00272727272727281*G0_1_0_3_5_0 + 0.00701298701298727*G0_1_0_3_5_1 + 0.00292207792207801*G0_1_0_3_5_2 + 0.00467532467532491*G0_1_0_3_5_3 - 0.0116883116883121*G0_1_0_3_5_4 - 0.0249350649350657*G0_1_0_3_5_5 + 0.000243506493506507*G0_1_0_4_0_0 - 0.000487012987013003*G0_1_0_4_0_1 - 0.000925324675324701*G0_1_0_4_0_2 + 0.00155844155844161*G0_1_0_4_0_3 + 0.00292207792207803*G0_1_0_4_0_4 + 0.00311688311688322*G0_1_0_4_0_5 - 0.000487012987013003*G0_1_0_4_1_0 + 0.000243506493506503*G0_1_0_4_1_1 - 0.000925324675324704*G0_1_0_4_1_2 + 0.00292207792207802*G0_1_0_4_1_3 + 0.00155844155844161*G0_1_0_4_1_4 + 0.00311688311688322*G0_1_0_4_1_5 - 0.000925324675324701*G0_1_0_4_2_0 - 0.000925324675324704*G0_1_0_4_2_1 - 0.000681818181818223*G0_1_0_4_2_2 + 0.00233766233766241*G0_1_0_4_2_3 + 0.00233766233766239*G0_1_0_4_2_4 + 0.00428571428571442*G0_1_0_4_2_5 + 0.00155844155844161*G0_1_0_4_3_0 + 0.00292207792207802*G0_1_0_4_3_1 + 0.00233766233766241*G0_1_0_4_3_2 + 0.00467532467532485*G0_1_0_4_3_3 - 0.00623376623376643*G0_1_0_4_3_4 - 0.0116883116883121*G0_1_0_4_3_5 + 0.00292207792207803*G0_1_0_4_4_0 + 0.00155844155844161*G0_1_0_4_4_1 + 0.00233766233766239*G0_1_0_4_4_2 - 0.00623376623376643*G0_1_0_4_4_3 + 0.00467532467532478*G0_1_0_4_4_4 - 0.0116883116883121*G0_1_0_4_4_5 + 0.00311688311688322*G0_1_0_4_5_0 + 0.00311688311688322*G0_1_0_4_5_1 + 0.00428571428571442*G0_1_0_4_5_2 - 0.0116883116883121*G0_1_0_4_5_3 - 0.0116883116883121*G0_1_0_4_5_4 - 0.0257142857142866*G0_1_0_4_5_5 - 0.0012175324675325*G0_1_0_5_0_0 - 0.000340909090909103*G0_1_0_5_0_1 - 0.00107142857142861*G0_1_0_5_0_2 + 0.00272727272727281*G0_1_0_5_0_3 + 0.00311688311688322*G0_1_0_5_0_4 + 0.00642857142857163*G0_1_0_5_0_5 - 0.000340909090909103*G0_1_0_5_1_0 + 0.00340909090909105*G0_1_0_5_1_1 - 0.00180194805194812*G0_1_0_5_1_2 + 0.00701298701298727*G0_1_0_5_1_3 + 0.00311688311688322*G0_1_0_5_1_4 + 0.00467532467532483*G0_1_0_5_1_5 - 0.00107142857142861*G0_1_0_5_2_0 - 0.00180194805194812*G0_1_0_5_2_1 - 0.00121753246753251*G0_1_0_5_2_2 + 0.00292207792207801*G0_1_0_5_2_3 + 0.00428571428571442*G0_1_0_5_2_4 + 0.00974025974026006*G0_1_0_5_2_5 + 0.00272727272727281*G0_1_0_5_3_0 + 0.00701298701298727*G0_1_0_5_3_1 + 0.00292207792207801*G0_1_0_5_3_2 + 0.00467532467532491*G0_1_0_5_3_3 - 0.0116883116883121*G0_1_0_5_3_4 - 0.0249350649350657*G0_1_0_5_3_5 + 0.00311688311688322*G0_1_0_5_4_0 + 0.00311688311688322*G0_1_0_5_4_1 + 0.00428571428571442*G0_1_0_5_4_2 - 0.0116883116883121*G0_1_0_5_4_3 - 0.0116883116883121*G0_1_0_5_4_4 - 0.0257142857142866*G0_1_0_5_4_5 + 0.00642857142857163*G0_1_0_5_5_0 + 0.00467532467532483*G0_1_0_5_5_1 + 0.00974025974026006*G0_1_0_5_5_2 - 0.0249350649350657*G0_1_0_5_5_3 - 0.0257142857142866*G0_1_0_5_5_4 - 0.0794805194805222*G0_1_0_5_5_5 + 0.00273944805194813*G0_1_1_0_0_0 - 0.000365259740259749*G0_1_1_0_0_1 - 0.000206980519480525*G0_1_1_0_0_2 + 0.0001461038961039*G0_1_1_0_0_3 + 0.000974025974026001*G0_1_1_0_0_4 + 0.000730519480519493*G0_1_1_0_0_5 - 0.000365259740259749*G0_1_1_0_1_0 - 0.00499188311688328*G0_1_1_0_1_1 + 0.000584415584415604*G0_1_1_0_1_2 - 0.00253246753246762*G0_1_1_0_1_3 - 0.000340909090909102*G0_1_1_0_1_4 - 0.000389610389610403*G0_1_1_0_1_5 - 0.000206980519480525*G0_1_1_0_2_0 + 0.000584415584415604*G0_1_1_0_2_1 + 8.52272727272753e-05*G0_1_1_0_2_2 + 0.000340909090909103*G0_1_1_0_2_3 - 0.000487012987013002*G0_1_1_0_2_4 - 0.0011201298701299*G0_1_1_0_2_5 + 0.0001461038961039*G0_1_1_0_3_0 - 0.00253246753246762*G0_1_1_0_3_1 + 0.000340909090909103*G0_1_1_0_3_2 - 0.00350649350649362*G0_1_1_0_3_3 + 0.000389610389610403*G0_1_1_0_3_4 + 0.00194805194805201*G0_1_1_0_3_5 + 0.000974025974026001*G0_1_1_0_4_0 - 0.000340909090909102*G0_1_1_0_4_1 - 0.000487012987013002*G0_1_1_0_4_2 + 0.000389610389610403*G0_1_1_0_4_3 + 0.00136363636363641*G0_1_1_0_4_4 + 0.00292207792207801*G0_1_1_0_4_5 + 0.000730519480519493*G0_1_1_0_5_0 - 0.000389610389610403*G0_1_1_0_5_1 - 0.0011201298701299*G0_1_1_0_5_2 + 0.00194805194805201*G0_1_1_0_5_3 + 0.00292207792207801*G0_1_1_0_5_4 + 0.0151948051948057*G0_1_1_0_5_5 - 0.000365259740259749*G0_1_1_1_0_0 - 0.00499188311688328*G0_1_1_1_0_1 + 0.000584415584415604*G0_1_1_1_0_2 - 0.00253246753246762*G0_1_1_1_0_3 - 0.000340909090909102*G0_1_1_1_0_4 - 0.000389610389610403*G0_1_1_1_0_5 - 0.00499188311688328*G0_1_1_1_1_0 + 0.119805194805199*G0_1_1_1_1_1 - 0.00937500000000032*G0_1_1_1_1_2 + 0.0423701298701313*G0_1_1_1_1_3 + 0.001948051948052*G0_1_1_1_1_4 + 0.0189935064935072*G0_1_1_1_1_5 + 0.000584415584415604*G0_1_1_1_2_0 - 0.00937500000000032*G0_1_1_1_2_1 + 0.00153409090909096*G0_1_1_1_2_2 - 0.00740259740259766*G0_1_1_1_2_3 - 4.87012987013017e-05*G0_1_1_1_2_4 - 0.00136363636363642*G0_1_1_1_2_5 - 0.00253246753246762*G0_1_1_1_3_0 + 0.0423701298701313*G0_1_1_1_3_1 - 0.00740259740259766*G0_1_1_1_3_2 + 0.0389610389610403*G0_1_1_1_3_3 + 0.00116883116883121*G0_1_1_1_3_4 + 0.0077922077922081*G0_1_1_1_3_5 - 0.000340909090909102*G0_1_1_1_4_0 + 0.001948051948052*G0_1_1_1_4_1 - 4.87012987013016e-05*G0_1_1_1_4_2 + 0.00116883116883121*G0_1_1_1_4_3 - 0.00155844155844161*G0_1_1_1_4_4 - 0.0011688311688312*G0_1_1_1_4_5 - 0.000389610389610403*G0_1_1_1_5_0 + 0.0189935064935072*G0_1_1_1_5_1 - 0.00136363636363642*G0_1_1_1_5_2 + 0.0077922077922081*G0_1_1_1_5_3 - 0.0011688311688312*G0_1_1_1_5_4 - 0.00779220779220803*G0_1_1_1_5_5 - 0.000206980519480525*G0_1_1_2_0_0 + 0.000584415584415604*G0_1_1_2_0_1 + 8.52272727272752e-05*G0_1_1_2_0_2 + 0.000340909090909103*G0_1_1_2_0_3 - 0.000487012987013002*G0_1_1_2_0_4 - 0.0011201298701299*G0_1_1_2_0_5 + 0.000584415584415604*G0_1_1_2_1_0 - 0.00937500000000032*G0_1_1_2_1_1 + 0.00153409090909096*G0_1_1_2_1_2 - 0.00740259740259766*G0_1_1_2_1_3 - 4.87012987013017e-05*G0_1_1_2_1_4 - 0.00136363636363642*G0_1_1_2_1_5 + 8.52272727272752e-05*G0_1_1_2_2_0 + 0.00153409090909096*G0_1_1_2_2_1 - 0.000767045454545481*G0_1_1_2_2_2 + 0.00160714285714291*G0_1_1_2_2_3 + 9.74025974025993e-05*G0_1_1_2_2_4 - 0.000146103896103901*G0_1_1_2_2_5 + 0.000340909090909103*G0_1_1_2_3_0 - 0.00740259740259766*G0_1_1_2_3_1 + 0.00160714285714291*G0_1_1_2_3_2 - 0.0128571428571433*G0_1_1_2_3_3 - 0.000584415584415603*G0_1_1_2_3_4 - 0.000389610389610411*G0_1_1_2_3_5 - 0.000487012987013002*G0_1_1_2_4_0 - 4.87012987013016e-05*G0_1_1_2_4_1 + 9.74025974025993e-05*G0_1_1_2_4_2 - 0.000584415584415604*G0_1_1_2_4_3 - 0.000974025974026004*G0_1_1_2_4_4 + 0.000389610389610407*G0_1_1_2_4_5 - 0.0011201298701299*G0_1_1_2_5_0 - 0.00136363636363642*G0_1_1_2_5_1 - 0.000146103896103901*G0_1_1_2_5_2 - 0.00038961038961041*G0_1_1_2_5_3 + 0.000389610389610407*G0_1_1_2_5_4 + 0.00584415584415605*G0_1_1_2_5_5 + 0.0001461038961039*G0_1_1_3_0_0 - 0.00253246753246762*G0_1_1_3_0_1 + 0.000340909090909103*G0_1_1_3_0_2 - 0.00350649350649362*G0_1_1_3_0_3 + 0.000389610389610403*G0_1_1_3_0_4 + 0.00194805194805201*G0_1_1_3_0_5 - 0.00253246753246762*G0_1_1_3_1_0 + 0.0423701298701313*G0_1_1_3_1_1 - 0.00740259740259766*G0_1_1_3_1_2 + 0.0389610389610403*G0_1_1_3_1_3 + 0.00116883116883121*G0_1_1_3_1_4 + 0.0077922077922081*G0_1_1_3_1_5 + 0.000340909090909103*G0_1_1_3_2_0 - 0.00740259740259766*G0_1_1_3_2_1 + 0.00160714285714291*G0_1_1_3_2_2 - 0.0128571428571433*G0_1_1_3_2_3 - 0.000584415584415604*G0_1_1_3_2_4 - 0.000389610389610411*G0_1_1_3_2_5 - 0.00350649350649362*G0_1_1_3_3_0 + 0.0389610389610403*G0_1_1_3_3_1 - 0.0128571428571433*G0_1_1_3_3_2 + 0.0935064935064968*G0_1_1_3_3_3 + 0.00467532467532483*G0_1_1_3_3_4 + 0.0077922077922081*G0_1_1_3_3_5 + 0.000389610389610403*G0_1_1_3_4_0 + 0.00116883116883121*G0_1_1_3_4_1 - 0.000584415584415604*G0_1_1_3_4_2 + 0.00467532467532483*G0_1_1_3_4_3 + 0.0023376623376624*G0_1_1_3_4_4 - 0.00155844155844162*G0_1_1_3_4_5 + 0.00194805194805201*G0_1_1_3_5_0 + 0.0077922077922081*G0_1_1_3_5_1 - 0.000389610389610411*G0_1_1_3_5_2 + 0.0077922077922081*G0_1_1_3_5_3 - 0.00155844155844162*G0_1_1_3_5_4 - 0.0155844155844161*G0_1_1_3_5_5 + 0.000974025974026001*G0_1_1_4_0_0 - 0.000340909090909102*G0_1_1_4_0_1 - 0.000487012987013002*G0_1_1_4_0_2 + 0.000389610389610403*G0_1_1_4_0_3 + 0.00136363636363641*G0_1_1_4_0_4 + 0.00292207792207801*G0_1_1_4_0_5 - 0.000340909090909102*G0_1_1_4_1_0 + 0.001948051948052*G0_1_1_4_1_1 - 4.87012987013017e-05*G0_1_1_4_1_2 + 0.00116883116883121*G0_1_1_4_1_3 - 0.00155844155844161*G0_1_1_4_1_4 - 0.0011688311688312*G0_1_1_4_1_5 - 0.000487012987013002*G0_1_1_4_2_0 - 4.87012987013016e-05*G0_1_1_4_2_1 + 9.74025974025992e-05*G0_1_1_4_2_2 - 0.000584415584415603*G0_1_1_4_2_3 - 0.000974025974026004*G0_1_1_4_2_4 + 0.000389610389610407*G0_1_1_4_2_5 + 0.000389610389610403*G0_1_1_4_3_0 + 0.00116883116883121*G0_1_1_4_3_1 - 0.000584415584415603*G0_1_1_4_3_2 + 0.00467532467532483*G0_1_1_4_3_3 + 0.0023376623376624*G0_1_1_4_3_4 - 0.00155844155844162*G0_1_1_4_3_5 + 0.00136363636363641*G0_1_1_4_4_0 - 0.00155844155844161*G0_1_1_4_4_1 - 0.000974025974026004*G0_1_1_4_4_2 + 0.0023376623376624*G0_1_1_4_4_3 + 0.00935064935064963*G0_1_1_4_4_4 + 0.0023376623376624*G0_1_1_4_4_5 + 0.00292207792207801*G0_1_1_4_5_0 - 0.0011688311688312*G0_1_1_4_5_1 + 0.000389610389610407*G0_1_1_4_5_2 - 0.00155844155844162*G0_1_1_4_5_3 + 0.0023376623376624*G0_1_1_4_5_4 - 0.0093506493506497*G0_1_1_4_5_5 + 0.000730519480519493*G0_1_1_5_0_0 - 0.000389610389610403*G0_1_1_5_0_1 - 0.0011201298701299*G0_1_1_5_0_2 + 0.00194805194805201*G0_1_1_5_0_3 + 0.00292207792207801*G0_1_1_5_0_4 + 0.0151948051948057*G0_1_1_5_0_5 - 0.000389610389610403*G0_1_1_5_1_0 + 0.0189935064935072*G0_1_1_5_1_1 - 0.00136363636363642*G0_1_1_5_1_2 + 0.0077922077922081*G0_1_1_5_1_3 - 0.0011688311688312*G0_1_1_5_1_4 - 0.00779220779220803*G0_1_1_5_1_5 - 0.0011201298701299*G0_1_1_5_2_0 - 0.00136363636363642*G0_1_1_5_2_1 - 0.000146103896103901*G0_1_1_5_2_2 - 0.000389610389610411*G0_1_1_5_2_3 + 0.000389610389610407*G0_1_1_5_2_4 + 0.00584415584415605*G0_1_1_5_2_5 + 0.00194805194805201*G0_1_1_5_3_0 + 0.0077922077922081*G0_1_1_5_3_1 - 0.000389610389610411*G0_1_1_5_3_2 + 0.0077922077922081*G0_1_1_5_3_3 - 0.00155844155844162*G0_1_1_5_3_4 - 0.0155844155844161*G0_1_1_5_3_5 + 0.00292207792207801*G0_1_1_5_4_0 - 0.0011688311688312*G0_1_1_5_4_1 + 0.000389610389610407*G0_1_1_5_4_2 - 0.00155844155844162*G0_1_1_5_4_3 + 0.0023376623376624*G0_1_1_5_4_4 - 0.0093506493506497*G0_1_1_5_4_5 + 0.0151948051948057*G0_1_1_5_5_0 - 0.00779220779220803*G0_1_1_5_5_1 + 0.00584415584415605*G0_1_1_5_5_2 - 0.0155844155844161*G0_1_1_5_5_3 - 0.0093506493506497*G0_1_1_5_5_4 - 0.116883116883121*G0_1_1_5_5_5; + A[69] = 0.00350649350649364*G0_0_0_0_0_0 - 0.000292207792207803*G0_0_0_0_0_1 - 0.00189935064935071*G0_0_0_0_0_2 + 0.000292207792207798*G0_0_0_0_0_3 - 0.000876623376623396*G0_0_0_0_0_4 + 0.000876623376623412*G0_0_0_0_0_5 - 0.000292207792207803*G0_0_0_0_1_0 + 0.000292207792207804*G0_0_0_0_1_1 + 0.001461038961039*G0_0_0_0_1_3 - 0.00146103896103901*G0_0_0_0_1_4 - 0.00189935064935071*G0_0_0_0_2_0 + 0.00438311688311703*G0_0_0_0_2_2 - 0.0011688311688312*G0_0_0_0_2_3 + 0.00701298701298724*G0_0_0_0_2_4 - 0.000292207792207802*G0_0_0_0_2_5 + 0.000292207792207798*G0_0_0_0_3_0 + 0.001461038961039*G0_0_0_0_3_1 - 0.0011688311688312*G0_0_0_0_3_2 - 0.00935064935064963*G0_0_0_0_3_3 + 0.00233766233766242*G0_0_0_0_3_4 - 0.000876623376623396*G0_0_0_0_4_0 - 0.00146103896103901*G0_0_0_0_4_1 + 0.00701298701298724*G0_0_0_0_4_2 + 0.00233766233766242*G0_0_0_0_4_3 + 0.0280519480519489*G0_0_0_0_4_4 + 0.00350649350649363*G0_0_0_0_4_5 + 0.000876623376623412*G0_0_0_0_5_0 - 0.000292207792207802*G0_0_0_0_5_2 + 0.00350649350649363*G0_0_0_0_5_4 + 0.00233766233766242*G0_0_0_0_5_5 - 0.000292207792207803*G0_0_0_1_0_0 + 0.000292207792207804*G0_0_0_1_0_1 + 0.001461038961039*G0_0_0_1_0_3 - 0.00146103896103901*G0_0_0_1_0_4 + 0.000292207792207804*G0_0_0_1_1_0 - 0.00350649350649363*G0_0_0_1_1_1 + 0.00189935064935071*G0_0_0_1_1_2 + 0.000876623376623404*G0_0_0_1_1_3 - 0.000292207792207802*G0_0_0_1_1_4 - 0.000876623376623412*G0_0_0_1_1_5 + 0.00189935064935071*G0_0_0_1_2_1 - 0.00438311688311703*G0_0_0_1_2_2 - 0.00701298701298725*G0_0_0_1_2_3 + 0.00116883116883121*G0_0_0_1_2_4 + 0.000292207792207802*G0_0_0_1_2_5 + 0.001461038961039*G0_0_0_1_3_0 + 0.000876623376623404*G0_0_0_1_3_1 - 0.00701298701298725*G0_0_0_1_3_2 - 0.028051948051949*G0_0_0_1_3_3 - 0.00233766233766241*G0_0_0_1_3_4 - 0.00350649350649363*G0_0_0_1_3_5 - 0.00146103896103901*G0_0_0_1_4_0 - 0.000292207792207802*G0_0_0_1_4_1 + 0.00116883116883121*G0_0_0_1_4_2 - 0.00233766233766241*G0_0_0_1_4_3 + 0.00935064935064965*G0_0_0_1_4_4 - 0.000876623376623412*G0_0_0_1_5_1 + 0.000292207792207802*G0_0_0_1_5_2 - 0.00350649350649363*G0_0_0_1_5_3 - 0.00233766233766242*G0_0_0_1_5_5 - 0.00189935064935071*G0_0_0_2_0_0 + 0.00438311688311703*G0_0_0_2_0_2 - 0.0011688311688312*G0_0_0_2_0_3 + 0.00701298701298724*G0_0_0_2_0_4 - 0.000292207792207802*G0_0_0_2_0_5 + 0.00189935064935071*G0_0_0_2_1_1 - 0.00438311688311703*G0_0_0_2_1_2 - 0.00701298701298725*G0_0_0_2_1_3 + 0.00116883116883121*G0_0_0_2_1_4 + 0.000292207792207802*G0_0_0_2_1_5 + 0.00438311688311703*G0_0_0_2_2_0 - 0.00438311688311703*G0_0_0_2_2_1 + 0.0233766233766242*G0_0_0_2_2_3 - 0.0233766233766242*G0_0_0_2_2_4 - 0.0011688311688312*G0_0_0_2_3_0 - 0.00701298701298725*G0_0_0_2_3_1 + 0.0233766233766242*G0_0_0_2_3_2 + 0.0467532467532483*G0_0_0_2_3_3 + 0.00233766233766242*G0_0_0_2_3_5 + 0.00701298701298724*G0_0_0_2_4_0 + 0.00116883116883121*G0_0_0_2_4_1 - 0.0233766233766242*G0_0_0_2_4_2 - 0.0467532467532483*G0_0_0_2_4_4 - 0.00233766233766242*G0_0_0_2_4_5 - 0.000292207792207802*G0_0_0_2_5_0 + 0.000292207792207802*G0_0_0_2_5_1 + 0.00233766233766242*G0_0_0_2_5_3 - 0.00233766233766242*G0_0_0_2_5_4 + 0.000292207792207798*G0_0_0_3_0_0 + 0.001461038961039*G0_0_0_3_0_1 - 0.0011688311688312*G0_0_0_3_0_2 - 0.00935064935064963*G0_0_0_3_0_3 + 0.00233766233766242*G0_0_0_3_0_4 + 0.001461038961039*G0_0_0_3_1_0 + 0.000876623376623404*G0_0_0_3_1_1 - 0.00701298701298725*G0_0_0_3_1_2 - 0.028051948051949*G0_0_0_3_1_3 - 0.00233766233766241*G0_0_0_3_1_4 - 0.00350649350649363*G0_0_0_3_1_5 - 0.0011688311688312*G0_0_0_3_2_0 - 0.00701298701298725*G0_0_0_3_2_1 + 0.0233766233766242*G0_0_0_3_2_2 + 0.0467532467532483*G0_0_0_3_2_3 + 0.00233766233766242*G0_0_0_3_2_5 - 0.00935064935064963*G0_0_0_3_3_0 - 0.028051948051949*G0_0_0_3_3_1 + 0.0467532467532483*G0_0_0_3_3_2 + 0.210389610389618*G0_0_0_3_3_3 + 0.0233766233766242*G0_0_0_3_3_4 + 0.0140259740259745*G0_0_0_3_3_5 + 0.00233766233766242*G0_0_0_3_4_0 - 0.00233766233766241*G0_0_0_3_4_1 + 0.0233766233766242*G0_0_0_3_4_3 - 0.0233766233766241*G0_0_0_3_4_4 - 0.00350649350649363*G0_0_0_3_5_1 + 0.00233766233766242*G0_0_0_3_5_2 + 0.0140259740259745*G0_0_0_3_5_3 - 0.000876623376623396*G0_0_0_4_0_0 - 0.00146103896103901*G0_0_0_4_0_1 + 0.00701298701298724*G0_0_0_4_0_2 + 0.00233766233766242*G0_0_0_4_0_3 + 0.028051948051949*G0_0_0_4_0_4 + 0.00350649350649363*G0_0_0_4_0_5 - 0.00146103896103901*G0_0_0_4_1_0 - 0.000292207792207802*G0_0_0_4_1_1 + 0.00116883116883121*G0_0_0_4_1_2 - 0.00233766233766241*G0_0_0_4_1_3 + 0.00935064935064965*G0_0_0_4_1_4 + 0.00701298701298724*G0_0_0_4_2_0 + 0.00116883116883121*G0_0_0_4_2_1 - 0.0233766233766241*G0_0_0_4_2_2 - 0.0467532467532483*G0_0_0_4_2_4 - 0.00233766233766242*G0_0_0_4_2_5 + 0.00233766233766242*G0_0_0_4_3_0 - 0.00233766233766241*G0_0_0_4_3_1 + 0.0233766233766242*G0_0_0_4_3_3 - 0.0233766233766241*G0_0_0_4_3_4 + 0.0280519480519489*G0_0_0_4_4_0 + 0.00935064935064965*G0_0_0_4_4_1 - 0.0467532467532483*G0_0_0_4_4_2 - 0.0233766233766241*G0_0_0_4_4_3 - 0.210389610389617*G0_0_0_4_4_4 - 0.0140259740259745*G0_0_0_4_4_5 + 0.00350649350649363*G0_0_0_4_5_0 - 0.00233766233766242*G0_0_0_4_5_2 - 0.0140259740259745*G0_0_0_4_5_4 + 0.000876623376623412*G0_0_0_5_0_0 - 0.000292207792207802*G0_0_0_5_0_2 + 0.00350649350649363*G0_0_0_5_0_4 + 0.00233766233766242*G0_0_0_5_0_5 - 0.000876623376623412*G0_0_0_5_1_1 + 0.000292207792207802*G0_0_0_5_1_2 - 0.00350649350649363*G0_0_0_5_1_3 - 0.00233766233766242*G0_0_0_5_1_5 - 0.000292207792207802*G0_0_0_5_2_0 + 0.000292207792207802*G0_0_0_5_2_1 + 0.00233766233766242*G0_0_0_5_2_3 - 0.00233766233766242*G0_0_0_5_2_4 - 0.00350649350649363*G0_0_0_5_3_1 + 0.00233766233766242*G0_0_0_5_3_2 + 0.0140259740259745*G0_0_0_5_3_3 + 0.00350649350649363*G0_0_0_5_4_0 - 0.00233766233766242*G0_0_0_5_4_2 - 0.0140259740259745*G0_0_0_5_4_4 + 0.00233766233766242*G0_0_0_5_5_0 - 0.00233766233766242*G0_0_0_5_5_1 + 0.00131493506493514*G0_0_1_0_0_0 - 0.000803571428571458*G0_0_1_0_0_1 + 0.000657467532467552*G0_0_1_0_0_2 + 0.00262987012987021*G0_0_1_0_0_3 + 0.00321428571428583*G0_0_1_0_0_4 + 0.00262987012987024*G0_0_1_0_0_5 - 0.000803571428571458*G0_0_1_0_1_0 - 0.000511363636363654*G0_0_1_0_1_1 + 0.00124188311688316*G0_0_1_0_1_2 + 0.00292207792207801*G0_0_1_0_1_3 + 0.00146103896103901*G0_0_1_0_1_4 - 0.000292207792207814*G0_0_1_0_1_5 + 0.000657467532467552*G0_0_1_0_2_0 + 0.00124188311688316*G0_0_1_0_2_1 - 0.00504058441558459*G0_0_1_0_2_2 - 0.00525974025974043*G0_0_1_0_2_3 - 0.00438311688311703*G0_0_1_0_2_4 - 0.000876623376623409*G0_0_1_0_2_5 + 0.00262987012987021*G0_0_1_0_3_0 + 0.00292207792207801*G0_0_1_0_3_1 - 0.00525974025974043*G0_0_1_0_3_2 - 0.0175324675324681*G0_0_1_0_3_3 - 0.00818181818181845*G0_0_1_0_3_4 - 0.00350649350649362*G0_0_1_0_3_5 + 0.00321428571428583*G0_0_1_0_4_0 + 0.00146103896103901*G0_0_1_0_4_1 - 0.00438311688311703*G0_0_1_0_4_2 - 0.00818181818181845*G0_0_1_0_4_3 - 0.00701298701298725*G0_0_1_0_4_4 - 0.0011688311688312*G0_0_1_0_4_5 + 0.00262987012987024*G0_0_1_0_5_0 - 0.000292207792207814*G0_0_1_0_5_1 - 0.000876623376623409*G0_0_1_0_5_2 - 0.00350649350649362*G0_0_1_0_5_3 - 0.0011688311688312*G0_0_1_0_5_4 - 0.000803571428571458*G0_0_1_1_0_0 - 0.000511363636363654*G0_0_1_1_0_1 + 0.00124188311688316*G0_0_1_1_0_2 + 0.00292207792207801*G0_0_1_1_0_3 + 0.00146103896103901*G0_0_1_1_0_4 - 0.000292207792207814*G0_0_1_1_0_5 - 0.000511363636363654*G0_0_1_1_1_0 - 0.0021915584415585*G0_0_1_1_1_1 + 0.00255681818181827*G0_0_1_1_1_2 + 0.00409090909090924*G0_0_1_1_1_3 + 0.00233766233766242*G0_0_1_1_1_4 + 0.00175324675324683*G0_0_1_1_1_5 + 0.00124188311688316*G0_0_1_1_2_0 + 0.00255681818181827*G0_0_1_1_2_1 - 0.00942370129870163*G0_0_1_1_2_2 - 0.0113961038961043*G0_0_1_1_2_3 - 0.00409090909090923*G0_0_1_1_2_4 - 0.000584415584415607*G0_0_1_1_2_5 + 0.00292207792207801*G0_0_1_1_3_0 + 0.00409090909090924*G0_0_1_1_3_1 - 0.0113961038961043*G0_0_1_1_3_2 - 0.0350649350649362*G0_0_1_1_3_3 - 0.0105194805194809*G0_0_1_1_3_4 - 0.00467532467532483*G0_0_1_1_3_5 + 0.00146103896103901*G0_0_1_1_4_0 + 0.00233766233766242*G0_0_1_1_4_1 - 0.00409090909090923*G0_0_1_1_4_2 - 0.0105194805194809*G0_0_1_1_4_3 - 0.00818181818181846*G0_0_1_1_4_4 - 0.00350649350649363*G0_0_1_1_4_5 - 0.000292207792207814*G0_0_1_1_5_0 + 0.00175324675324683*G0_0_1_1_5_1 - 0.000584415584415607*G0_0_1_1_5_2 - 0.00467532467532483*G0_0_1_1_5_3 - 0.00350649350649363*G0_0_1_1_5_4 - 0.00233766233766241*G0_0_1_1_5_5 + 0.000657467532467552*G0_0_1_2_0_0 + 0.00124188311688316*G0_0_1_2_0_1 - 0.00504058441558459*G0_0_1_2_0_2 - 0.00525974025974043*G0_0_1_2_0_3 - 0.00438311688311703*G0_0_1_2_0_4 - 0.000876623376623409*G0_0_1_2_0_5 + 0.00124188311688316*G0_0_1_2_1_0 + 0.00255681818181827*G0_0_1_2_1_1 - 0.00942370129870163*G0_0_1_2_1_2 - 0.0113961038961043*G0_0_1_2_1_3 - 0.00409090909090923*G0_0_1_2_1_4 - 0.000584415584415607*G0_0_1_2_1_5 - 0.00504058441558459*G0_0_1_2_2_0 - 0.00942370129870163*G0_0_1_2_2_1 + 0.0591720779220801*G0_0_1_2_2_2 + 0.0438311688311704*G0_0_1_2_2_3 + 0.0204545454545462*G0_0_1_2_2_4 + 0.00350649350649364*G0_0_1_2_2_5 - 0.00525974025974043*G0_0_1_2_3_0 - 0.0113961038961043*G0_0_1_2_3_1 + 0.0438311688311704*G0_0_1_2_3_2 + 0.0631168831168853*G0_0_1_2_3_3 + 0.0187012987012993*G0_0_1_2_3_4 + 0.00350649350649364*G0_0_1_2_3_5 - 0.00438311688311703*G0_0_1_2_4_0 - 0.00409090909090923*G0_0_1_2_4_1 + 0.0204545454545462*G0_0_1_2_4_2 + 0.0187012987012994*G0_0_1_2_4_3 + 0.016363636363637*G0_0_1_2_4_4 + 0.00116883116883121*G0_0_1_2_4_5 - 0.000876623376623409*G0_0_1_2_5_0 - 0.000584415584415607*G0_0_1_2_5_1 + 0.00350649350649364*G0_0_1_2_5_2 + 0.00350649350649364*G0_0_1_2_5_3 + 0.00116883116883121*G0_0_1_2_5_4 - 0.00350649350649364*G0_0_1_2_5_5 + 0.00262987012987021*G0_0_1_3_0_0 + 0.00292207792207801*G0_0_1_3_0_1 - 0.00525974025974043*G0_0_1_3_0_2 - 0.0175324675324681*G0_0_1_3_0_3 - 0.00818181818181845*G0_0_1_3_0_4 - 0.00350649350649362*G0_0_1_3_0_5 + 0.00292207792207801*G0_0_1_3_1_0 + 0.00409090909090924*G0_0_1_3_1_1 - 0.0113961038961043*G0_0_1_3_1_2 - 0.0350649350649362*G0_0_1_3_1_3 - 0.0105194805194809*G0_0_1_3_1_4 - 0.00467532467532483*G0_0_1_3_1_5 - 0.00525974025974043*G0_0_1_3_2_0 - 0.0113961038961043*G0_0_1_3_2_1 + 0.0438311688311704*G0_0_1_3_2_2 + 0.0631168831168853*G0_0_1_3_2_3 + 0.0187012987012993*G0_0_1_3_2_4 + 0.00350649350649364*G0_0_1_3_2_5 - 0.0175324675324681*G0_0_1_3_3_0 - 0.0350649350649362*G0_0_1_3_3_1 + 0.0631168831168853*G0_0_1_3_3_2 + 0.252467532467541*G0_0_1_3_3_3 + 0.056103896103898*G0_0_1_3_3_4 + 0.028051948051949*G0_0_1_3_3_5 - 0.00818181818181845*G0_0_1_3_4_0 - 0.0105194805194809*G0_0_1_3_4_1 + 0.0187012987012994*G0_0_1_3_4_2 + 0.056103896103898*G0_0_1_3_4_3 + 0.0327272727272738*G0_0_1_3_4_4 + 0.0140259740259745*G0_0_1_3_4_5 - 0.00350649350649362*G0_0_1_3_5_0 - 0.00467532467532483*G0_0_1_3_5_1 + 0.00350649350649364*G0_0_1_3_5_2 + 0.028051948051949*G0_0_1_3_5_3 + 0.0140259740259745*G0_0_1_3_5_4 + 0.0140259740259745*G0_0_1_3_5_5 + 0.00321428571428583*G0_0_1_4_0_0 + 0.00146103896103901*G0_0_1_4_0_1 - 0.00438311688311703*G0_0_1_4_0_2 - 0.00818181818181845*G0_0_1_4_0_3 - 0.00701298701298725*G0_0_1_4_0_4 - 0.0011688311688312*G0_0_1_4_0_5 + 0.00146103896103901*G0_0_1_4_1_0 + 0.00233766233766242*G0_0_1_4_1_1 - 0.00409090909090923*G0_0_1_4_1_2 - 0.0105194805194809*G0_0_1_4_1_3 - 0.00818181818181846*G0_0_1_4_1_4 - 0.00350649350649363*G0_0_1_4_1_5 - 0.00438311688311703*G0_0_1_4_2_0 - 0.00409090909090923*G0_0_1_4_2_1 + 0.0204545454545462*G0_0_1_4_2_2 + 0.0187012987012993*G0_0_1_4_2_3 + 0.016363636363637*G0_0_1_4_2_4 + 0.00116883116883121*G0_0_1_4_2_5 - 0.00818181818181844*G0_0_1_4_3_0 - 0.0105194805194809*G0_0_1_4_3_1 + 0.0187012987012993*G0_0_1_4_3_2 + 0.056103896103898*G0_0_1_4_3_3 + 0.0327272727272738*G0_0_1_4_3_4 + 0.0140259740259745*G0_0_1_4_3_5 - 0.00701298701298724*G0_0_1_4_4_0 - 0.00818181818181846*G0_0_1_4_4_1 + 0.016363636363637*G0_0_1_4_4_2 + 0.0327272727272738*G0_0_1_4_4_3 + 0.0420779220779236*G0_0_1_4_4_4 + 0.0140259740259745*G0_0_1_4_4_5 - 0.0011688311688312*G0_0_1_4_5_0 - 0.00350649350649363*G0_0_1_4_5_1 + 0.00116883116883121*G0_0_1_4_5_2 + 0.0140259740259745*G0_0_1_4_5_3 + 0.0140259740259745*G0_0_1_4_5_4 + 0.0140259740259745*G0_0_1_4_5_5 + 0.00262987012987024*G0_0_1_5_0_0 - 0.000292207792207814*G0_0_1_5_0_1 - 0.000876623376623409*G0_0_1_5_0_2 - 0.00350649350649362*G0_0_1_5_0_3 - 0.0011688311688312*G0_0_1_5_0_4 - 0.000292207792207814*G0_0_1_5_1_0 + 0.00175324675324683*G0_0_1_5_1_1 - 0.000584415584415607*G0_0_1_5_1_2 - 0.00467532467532483*G0_0_1_5_1_3 - 0.00350649350649363*G0_0_1_5_1_4 - 0.00233766233766241*G0_0_1_5_1_5 - 0.000876623376623409*G0_0_1_5_2_0 - 0.000584415584415607*G0_0_1_5_2_1 + 0.00350649350649364*G0_0_1_5_2_2 + 0.00350649350649364*G0_0_1_5_2_3 + 0.00116883116883121*G0_0_1_5_2_4 - 0.00350649350649364*G0_0_1_5_2_5 - 0.00350649350649362*G0_0_1_5_3_0 - 0.00467532467532483*G0_0_1_5_3_1 + 0.00350649350649364*G0_0_1_5_3_2 + 0.028051948051949*G0_0_1_5_3_3 + 0.0140259740259745*G0_0_1_5_3_4 + 0.0140259740259745*G0_0_1_5_3_5 - 0.0011688311688312*G0_0_1_5_4_0 - 0.00350649350649363*G0_0_1_5_4_1 + 0.00116883116883121*G0_0_1_5_4_2 + 0.0140259740259745*G0_0_1_5_4_3 + 0.0140259740259745*G0_0_1_5_4_4 + 0.0140259740259745*G0_0_1_5_4_5 - 0.00233766233766241*G0_0_1_5_5_1 - 0.00350649350649364*G0_0_1_5_5_2 + 0.0140259740259745*G0_0_1_5_5_3 + 0.0140259740259745*G0_0_1_5_5_4 + 0.0420779220779239*G0_0_1_5_5_5 - 0.00964285714285752*G0_1_0_0_0_0 + 0.000365259740259755*G0_1_0_0_0_1 - 0.000365259740259753*G0_1_0_0_0_2 + 0.0002922077922078*G0_1_0_0_0_3 + 0.00613636363636384*G0_1_0_0_0_4 - 0.00321428571428584*G0_1_0_0_0_5 + 0.000365259740259755*G0_1_0_0_1_0 - 0.000146103896103899*G0_1_0_0_1_1 + 0.000365259740259751*G0_1_0_0_1_2 + 0.00146103896103901*G0_1_0_0_1_3 + 0.000292207792207796*G0_1_0_0_1_4 + 0.000876623376623408*G0_1_0_0_1_5 - 0.000365259740259753*G0_1_0_0_2_0 + 0.000365259740259751*G0_1_0_0_2_1 + 0.00146103896103902*G0_1_0_0_2_2 - 0.00262987012987021*G0_1_0_0_2_3 - 0.00438311688311702*G0_1_0_0_2_4 - 0.000876623376623405*G0_1_0_0_2_5 + 0.0002922077922078*G0_1_0_0_3_0 + 0.00146103896103901*G0_1_0_0_3_1 - 0.00262987012987021*G0_1_0_0_3_2 - 0.00233766233766238*G0_1_0_0_3_3 - 0.0011688311688312*G0_1_0_0_3_4 + 0.00116883116883121*G0_1_0_0_3_5 + 0.00613636363636383*G0_1_0_0_4_0 + 0.000292207792207796*G0_1_0_0_4_1 - 0.00438311688311702*G0_1_0_0_4_2 - 0.0011688311688312*G0_1_0_0_4_3 + 0.0140259740259746*G0_1_0_0_4_4 + 0.00116883116883121*G0_1_0_0_4_5 - 0.00321428571428584*G0_1_0_0_5_0 + 0.000876623376623407*G0_1_0_0_5_1 - 0.000876623376623405*G0_1_0_0_5_2 + 0.00116883116883121*G0_1_0_0_5_3 + 0.00116883116883121*G0_1_0_0_5_4 - 0.00233766233766242*G0_1_0_0_5_5 + 0.000365259740259755*G0_1_0_1_0_0 - 0.000146103896103899*G0_1_0_1_0_1 + 0.000365259740259751*G0_1_0_1_0_2 + 0.00146103896103901*G0_1_0_1_0_3 + 0.000292207792207796*G0_1_0_1_0_4 + 0.000876623376623408*G0_1_0_1_0_5 - 0.000146103896103899*G0_1_0_1_1_0 - 0.00284902597402607*G0_1_0_1_1_1 + 0.00153409090909096*G0_1_0_1_1_2 + 0.000876623376623399*G0_1_0_1_1_3 + 0.00321428571428582*G0_1_0_1_1_4 + 0.0005844155844156*G0_1_0_1_1_5 + 0.000365259740259751*G0_1_0_1_2_0 + 0.00153409090909096*G0_1_0_1_2_1 - 0.00511363636363653*G0_1_0_1_2_2 - 0.00555194805194823*G0_1_0_1_2_3 + 0.00146103896103901*G0_1_0_1_2_4 + 0.000876623376623406*G0_1_0_1_2_5 + 0.001461038961039*G0_1_0_1_3_0 + 0.000876623376623399*G0_1_0_1_3_1 - 0.00555194805194823*G0_1_0_1_3_2 - 0.0245454545454554*G0_1_0_1_3_3 - 0.00935064935064966*G0_1_0_1_3_4 - 0.00467532467532484*G0_1_0_1_3_5 + 0.000292207792207796*G0_1_0_1_4_0 + 0.00321428571428582*G0_1_0_1_4_1 + 0.00146103896103901*G0_1_0_1_4_2 - 0.00935064935064966*G0_1_0_1_4_3 - 0.0292207792207802*G0_1_0_1_4_4 - 0.00818181818181847*G0_1_0_1_4_5 + 0.000876623376623407*G0_1_0_1_5_0 + 0.000584415584415599*G0_1_0_1_5_1 + 0.000876623376623407*G0_1_0_1_5_2 - 0.00467532467532484*G0_1_0_1_5_3 - 0.00818181818181847*G0_1_0_1_5_4 - 0.00233766233766242*G0_1_0_1_5_5 - 0.000365259740259753*G0_1_0_2_0_0 + 0.000365259740259751*G0_1_0_2_0_1 + 0.00146103896103902*G0_1_0_2_0_2 - 0.00262987012987021*G0_1_0_2_0_3 - 0.00438311688311702*G0_1_0_2_0_4 - 0.000876623376623405*G0_1_0_2_0_5 + 0.000365259740259751*G0_1_0_2_1_0 + 0.00153409090909096*G0_1_0_2_1_1 - 0.00511363636363653*G0_1_0_2_1_2 - 0.00555194805194823*G0_1_0_2_1_3 + 0.00146103896103901*G0_1_0_2_1_4 + 0.000876623376623406*G0_1_0_2_1_5 + 0.00146103896103902*G0_1_0_2_2_0 - 0.00511363636363653*G0_1_0_2_2_1 + 0.0109577922077926*G0_1_0_2_2_2 + 0.0233766233766242*G0_1_0_2_2_3 + 0.00146103896103901*G0_1_0_2_2_5 - 0.00262987012987021*G0_1_0_2_3_0 - 0.00555194805194823*G0_1_0_2_3_1 + 0.0233766233766242*G0_1_0_2_3_2 + 0.0444155844155859*G0_1_0_2_3_3 + 0.00233766233766241*G0_1_0_2_3_4 + 0.00233766233766242*G0_1_0_2_3_5 - 0.00438311688311702*G0_1_0_2_4_0 + 0.00146103896103901*G0_1_0_2_4_1 + 0.00233766233766241*G0_1_0_2_4_3 - 0.0257142857142866*G0_1_0_2_4_4 - 0.00584415584415605*G0_1_0_2_4_5 - 0.000876623376623405*G0_1_0_2_5_0 + 0.000876623376623407*G0_1_0_2_5_1 + 0.00146103896103901*G0_1_0_2_5_2 + 0.00233766233766242*G0_1_0_2_5_3 - 0.00584415584415605*G0_1_0_2_5_4 - 0.00116883116883121*G0_1_0_2_5_5 + 0.0002922077922078*G0_1_0_3_0_0 + 0.00146103896103901*G0_1_0_3_0_1 - 0.00262987012987021*G0_1_0_3_0_2 - 0.00233766233766238*G0_1_0_3_0_3 - 0.0011688311688312*G0_1_0_3_0_4 + 0.00116883116883121*G0_1_0_3_0_5 + 0.00146103896103901*G0_1_0_3_1_0 + 0.000876623376623399*G0_1_0_3_1_1 - 0.00555194805194823*G0_1_0_3_1_2 - 0.0245454545454554*G0_1_0_3_1_3 - 0.00935064935064966*G0_1_0_3_1_4 - 0.00467532467532484*G0_1_0_3_1_5 - 0.00262987012987021*G0_1_0_3_2_0 - 0.00555194805194823*G0_1_0_3_2_1 + 0.0233766233766242*G0_1_0_3_2_2 + 0.0444155844155859*G0_1_0_3_2_3 + 0.00233766233766241*G0_1_0_3_2_4 + 0.00233766233766242*G0_1_0_3_2_5 - 0.00233766233766238*G0_1_0_3_3_0 - 0.0245454545454554*G0_1_0_3_3_1 + 0.0444155844155859*G0_1_0_3_3_2 + 0.12623376623377*G0_1_0_3_3_3 + 0.0233766233766241*G0_1_0_3_3_4 - 0.0011688311688312*G0_1_0_3_4_0 - 0.00935064935064966*G0_1_0_3_4_1 + 0.00233766233766241*G0_1_0_3_4_2 + 0.0233766233766241*G0_1_0_3_4_3 + 0.0607792207792227*G0_1_0_3_4_4 + 0.0140259740259745*G0_1_0_3_4_5 + 0.00116883116883121*G0_1_0_3_5_0 - 0.00467532467532484*G0_1_0_3_5_1 + 0.00233766233766242*G0_1_0_3_5_2 + 0.0140259740259745*G0_1_0_3_5_4 + 0.00613636363636384*G0_1_0_4_0_0 + 0.000292207792207796*G0_1_0_4_0_1 - 0.00438311688311702*G0_1_0_4_0_2 - 0.0011688311688312*G0_1_0_4_0_3 + 0.0140259740259746*G0_1_0_4_0_4 + 0.00116883116883121*G0_1_0_4_0_5 + 0.000292207792207796*G0_1_0_4_1_0 + 0.00321428571428582*G0_1_0_4_1_1 + 0.00146103896103901*G0_1_0_4_1_2 - 0.00935064935064966*G0_1_0_4_1_3 - 0.0292207792207802*G0_1_0_4_1_4 - 0.00818181818181847*G0_1_0_4_1_5 - 0.00438311688311702*G0_1_0_4_2_0 + 0.00146103896103901*G0_1_0_4_2_1 + 0.00233766233766241*G0_1_0_4_2_3 - 0.0257142857142866*G0_1_0_4_2_4 - 0.00584415584415604*G0_1_0_4_2_5 - 0.0011688311688312*G0_1_0_4_3_0 - 0.00935064935064966*G0_1_0_4_3_1 + 0.00233766233766241*G0_1_0_4_3_2 + 0.0233766233766241*G0_1_0_4_3_3 + 0.0607792207792227*G0_1_0_4_3_4 + 0.0140259740259745*G0_1_0_4_3_5 + 0.0140259740259746*G0_1_0_4_4_0 - 0.0292207792207802*G0_1_0_4_4_1 - 0.0257142857142866*G0_1_0_4_4_2 + 0.0607792207792227*G0_1_0_4_4_3 + 0.462857142857158*G0_1_0_4_4_4 + 0.0701298701298725*G0_1_0_4_4_5 + 0.00116883116883121*G0_1_0_4_5_0 - 0.00818181818181847*G0_1_0_4_5_1 - 0.00584415584415605*G0_1_0_4_5_2 + 0.0140259740259745*G0_1_0_4_5_3 + 0.0701298701298725*G0_1_0_4_5_4 + 0.0187012987012993*G0_1_0_4_5_5 - 0.00321428571428584*G0_1_0_5_0_0 + 0.000876623376623407*G0_1_0_5_0_1 - 0.000876623376623405*G0_1_0_5_0_2 + 0.00116883116883121*G0_1_0_5_0_3 + 0.00116883116883121*G0_1_0_5_0_4 - 0.00233766233766242*G0_1_0_5_0_5 + 0.000876623376623407*G0_1_0_5_1_0 + 0.0005844155844156*G0_1_0_5_1_1 + 0.000876623376623407*G0_1_0_5_1_2 - 0.00467532467532484*G0_1_0_5_1_3 - 0.00818181818181847*G0_1_0_5_1_4 - 0.00233766233766243*G0_1_0_5_1_5 - 0.000876623376623405*G0_1_0_5_2_0 + 0.000876623376623407*G0_1_0_5_2_1 + 0.00146103896103901*G0_1_0_5_2_2 + 0.00233766233766242*G0_1_0_5_2_3 - 0.00584415584415604*G0_1_0_5_2_4 - 0.00116883116883121*G0_1_0_5_2_5 + 0.00116883116883121*G0_1_0_5_3_0 - 0.00467532467532484*G0_1_0_5_3_1 + 0.00233766233766242*G0_1_0_5_3_2 + 0.0140259740259745*G0_1_0_5_3_4 + 0.00116883116883121*G0_1_0_5_4_0 - 0.00818181818181847*G0_1_0_5_4_1 - 0.00584415584415604*G0_1_0_5_4_2 + 0.0140259740259745*G0_1_0_5_4_3 + 0.0701298701298725*G0_1_0_5_4_4 + 0.0187012987012993*G0_1_0_5_4_5 - 0.00233766233766242*G0_1_0_5_5_0 - 0.00233766233766243*G0_1_0_5_5_1 - 0.00116883116883121*G0_1_0_5_5_2 + 0.0187012987012993*G0_1_0_5_5_4 - 0.0249837662337672*G0_1_1_0_0_0 + 0.00379870129870144*G0_1_1_0_0_1 + 0.00175324675324682*G0_1_1_0_0_2 - 0.000876623376623407*G0_1_1_0_0_3 - 0.00438311688311705*G0_1_1_0_0_4 - 0.0219155844155852*G0_1_1_0_0_5 + 0.00379870129870144*G0_1_1_0_1_0 - 0.000365259740259755*G0_1_1_0_1_1 + 0.0002922077922078*G0_1_1_0_1_2 + 0.00146103896103901*G0_1_1_0_1_3 + 0.000876623376623407*G0_1_1_0_1_4 + 0.00759740259740287*G0_1_1_0_1_5 + 0.00175324675324682*G0_1_1_0_2_0 + 0.0002922077922078*G0_1_1_0_2_1 - 0.00328733766233778*G0_1_1_0_2_2 - 0.00350649350649362*G0_1_1_0_2_3 - 0.00175324675324681*G0_1_1_0_2_4 + 0.000876623376623412*G0_1_1_0_2_5 - 0.000876623376623407*G0_1_1_0_3_0 + 0.00146103896103901*G0_1_1_0_3_1 - 0.00350649350649362*G0_1_1_0_3_2 - 0.0035064935064936*G0_1_1_0_3_3 - 0.00438311688311705*G0_1_1_0_4_0 + 0.000876623376623407*G0_1_1_0_4_1 - 0.00175324675324681*G0_1_1_0_4_2 + 0.00233766233766241*G0_1_1_0_4_4 - 0.00350649350649364*G0_1_1_0_4_5 - 0.0219155844155852*G0_1_1_0_5_0 + 0.00759740259740287*G0_1_1_0_5_1 + 0.000876623376623412*G0_1_1_0_5_2 - 0.00350649350649364*G0_1_1_0_5_4 - 0.0280519480519492*G0_1_1_0_5_5 + 0.00379870129870144*G0_1_1_1_0_0 - 0.000365259740259755*G0_1_1_1_0_1 + 0.0002922077922078*G0_1_1_1_0_2 + 0.00146103896103901*G0_1_1_1_0_3 + 0.000876623376623407*G0_1_1_1_0_4 + 0.00759740259740287*G0_1_1_1_0_5 - 0.000365259740259755*G0_1_1_1_1_0 - 0.00438311688311703*G0_1_1_1_1_1 + 0.00226461038961047*G0_1_1_1_1_2 + 0.000584415584415603*G0_1_1_1_1_3 + 0.000292207792207803*G0_1_1_1_1_4 - 0.00642857142857165*G0_1_1_1_1_5 + 0.0002922077922078*G0_1_1_1_2_0 + 0.00226461038961047*G0_1_1_1_2_1 - 0.00759740259740287*G0_1_1_1_2_2 - 0.00818181818181847*G0_1_1_1_2_3 - 0.00175324675324681*G0_1_1_1_2_4 - 0.000292207792207804*G0_1_1_1_2_5 + 0.00146103896103901*G0_1_1_1_3_0 + 0.000584415584415603*G0_1_1_1_3_1 - 0.00818181818181847*G0_1_1_1_3_2 - 0.0233766233766242*G0_1_1_1_3_3 - 0.00350649350649363*G0_1_1_1_3_4 - 0.00233766233766243*G0_1_1_1_3_5 + 0.000876623376623407*G0_1_1_1_4_0 + 0.000292207792207803*G0_1_1_1_4_1 - 0.00175324675324681*G0_1_1_1_4_2 - 0.00350649350649363*G0_1_1_1_4_3 - 0.00233766233766242*G0_1_1_1_4_4 + 0.00759740259740287*G0_1_1_1_5_0 - 0.00642857142857165*G0_1_1_1_5_1 - 0.000292207792207804*G0_1_1_1_5_2 - 0.00233766233766242*G0_1_1_1_5_3 + 0.00467532467532484*G0_1_1_1_5_5 + 0.00175324675324682*G0_1_1_2_0_0 + 0.0002922077922078*G0_1_1_2_0_1 - 0.00328733766233777*G0_1_1_2_0_2 - 0.00350649350649362*G0_1_1_2_0_3 - 0.00175324675324681*G0_1_1_2_0_4 + 0.000876623376623412*G0_1_1_2_0_5 + 0.0002922077922078*G0_1_1_2_1_0 + 0.00226461038961047*G0_1_1_2_1_1 - 0.00759740259740287*G0_1_1_2_1_2 - 0.00818181818181847*G0_1_1_2_1_3 - 0.00175324675324681*G0_1_1_2_1_4 - 0.000292207792207804*G0_1_1_2_1_5 - 0.00328733766233778*G0_1_1_2_2_0 - 0.00759740259740286*G0_1_1_2_2_1 + 0.0493100649350668*G0_1_1_2_2_2 + 0.0350649350649363*G0_1_1_2_2_3 + 0.0131493506493511*G0_1_1_2_2_4 + 0.00175324675324683*G0_1_1_2_2_5 - 0.00350649350649362*G0_1_1_2_3_0 - 0.00818181818181847*G0_1_1_2_3_1 + 0.0350649350649363*G0_1_1_2_3_2 + 0.0525974025974044*G0_1_1_2_3_3 + 0.0105194805194809*G0_1_1_2_3_4 + 0.00350649350649364*G0_1_1_2_3_5 - 0.00175324675324681*G0_1_1_2_4_0 - 0.00175324675324681*G0_1_1_2_4_1 + 0.0131493506493511*G0_1_1_2_4_2 + 0.0105194805194809*G0_1_1_2_4_3 + 0.00233766233766244*G0_1_1_2_4_4 + 0.000876623376623412*G0_1_1_2_5_0 - 0.000292207792207804*G0_1_1_2_5_1 + 0.00175324675324683*G0_1_1_2_5_2 + 0.00350649350649364*G0_1_1_2_5_3 + 0.00701298701298726*G0_1_1_2_5_5 - 0.000876623376623407*G0_1_1_3_0_0 + 0.00146103896103901*G0_1_1_3_0_1 - 0.00350649350649362*G0_1_1_3_0_2 - 0.00350649350649359*G0_1_1_3_0_3 + 0.00146103896103901*G0_1_1_3_1_0 + 0.000584415584415603*G0_1_1_3_1_1 - 0.00818181818181847*G0_1_1_3_1_2 - 0.0233766233766242*G0_1_1_3_1_3 - 0.00350649350649363*G0_1_1_3_1_4 - 0.00233766233766243*G0_1_1_3_1_5 - 0.00350649350649362*G0_1_1_3_2_0 - 0.00818181818181847*G0_1_1_3_2_1 + 0.0350649350649363*G0_1_1_3_2_2 + 0.0525974025974044*G0_1_1_3_2_3 + 0.0105194805194809*G0_1_1_3_2_4 + 0.00350649350649364*G0_1_1_3_2_5 - 0.00350649350649359*G0_1_1_3_3_0 - 0.0233766233766242*G0_1_1_3_3_1 + 0.0525974025974044*G0_1_1_3_3_2 + 0.140259740259745*G0_1_1_3_3_3 + 0.0140259740259745*G0_1_1_3_3_4 - 0.00350649350649363*G0_1_1_3_4_1 + 0.0105194805194809*G0_1_1_3_4_2 + 0.0140259740259745*G0_1_1_3_4_3 + 0.00467532467532483*G0_1_1_3_4_4 - 0.00233766233766243*G0_1_1_3_5_1 + 0.00350649350649364*G0_1_1_3_5_2 - 0.0140259740259745*G0_1_1_3_5_5 - 0.00438311688311705*G0_1_1_4_0_0 + 0.000876623376623407*G0_1_1_4_0_1 - 0.00175324675324681*G0_1_1_4_0_2 + 0.00233766233766241*G0_1_1_4_0_4 - 0.00350649350649364*G0_1_1_4_0_5 + 0.000876623376623407*G0_1_1_4_1_0 + 0.000292207792207803*G0_1_1_4_1_1 - 0.00175324675324681*G0_1_1_4_1_2 - 0.00350649350649363*G0_1_1_4_1_3 - 0.00233766233766242*G0_1_1_4_1_4 - 0.00175324675324681*G0_1_1_4_2_0 - 0.00175324675324681*G0_1_1_4_2_1 + 0.0131493506493511*G0_1_1_4_2_2 + 0.0105194805194809*G0_1_1_4_2_3 + 0.00233766233766244*G0_1_1_4_2_4 - 0.00350649350649363*G0_1_1_4_3_1 + 0.0105194805194809*G0_1_1_4_3_2 + 0.0140259740259745*G0_1_1_4_3_3 + 0.00467532467532483*G0_1_1_4_3_4 + 0.00233766233766241*G0_1_1_4_4_0 - 0.00233766233766242*G0_1_1_4_4_1 + 0.00233766233766244*G0_1_1_4_4_2 + 0.00467532467532483*G0_1_1_4_4_3 + 0.0140259740259745*G0_1_1_4_4_4 + 0.00467532467532484*G0_1_1_4_4_5 - 0.00350649350649364*G0_1_1_4_5_0 + 0.00467532467532484*G0_1_1_4_5_4 - 0.0140259740259745*G0_1_1_4_5_5 - 0.0219155844155852*G0_1_1_5_0_0 + 0.00759740259740287*G0_1_1_5_0_1 + 0.000876623376623412*G0_1_1_5_0_2 - 0.00350649350649364*G0_1_1_5_0_4 - 0.0280519480519492*G0_1_1_5_0_5 + 0.00759740259740287*G0_1_1_5_1_0 - 0.00642857142857165*G0_1_1_5_1_1 - 0.000292207792207804*G0_1_1_5_1_2 - 0.00233766233766242*G0_1_1_5_1_3 + 0.00467532467532484*G0_1_1_5_1_5 + 0.000876623376623412*G0_1_1_5_2_0 - 0.000292207792207804*G0_1_1_5_2_1 + 0.00175324675324683*G0_1_1_5_2_2 + 0.00350649350649364*G0_1_1_5_2_3 + 0.00701298701298726*G0_1_1_5_2_5 - 0.00233766233766243*G0_1_1_5_3_1 + 0.00350649350649364*G0_1_1_5_3_2 - 0.0140259740259745*G0_1_1_5_3_5 - 0.00350649350649364*G0_1_1_5_4_0 + 0.00467532467532484*G0_1_1_5_4_4 - 0.0140259740259745*G0_1_1_5_4_5 - 0.0280519480519492*G0_1_1_5_5_0 + 0.00467532467532484*G0_1_1_5_5_1 + 0.00701298701298726*G0_1_1_5_5_2 - 0.0140259740259745*G0_1_1_5_5_3 - 0.0140259740259745*G0_1_1_5_5_4 - 0.238441558441567*G0_1_1_5_5_5; + A[11] = 0.00262987012987022*G0_0_0_0_0_0 + 0.000618686868686889*G0_0_0_0_0_1 - 0.000328282828282839*G0_0_0_0_0_2 + 0.000537518037518054*G0_0_0_0_0_3 + 0.00163419913419919*G0_0_0_0_0_4 + 0.00139610389610394*G0_0_0_0_0_5 + 0.000618686868686889*G0_0_0_0_1_0 - 0.00585317460317481*G0_0_0_0_1_1 + 0.000523989898989917*G0_0_0_0_1_2 - 0.00189393939393946*G0_0_0_0_1_3 - 0.000227272727272735*G0_0_0_0_1_4 - 0.00353535353535366*G0_0_0_0_1_5 - 0.000328282828282839*G0_0_0_0_2_0 + 0.000523989898989917*G0_0_0_0_2_1 - 0.00032828282828284*G0_0_0_0_2_2 + 0.000335497835497847*G0_0_0_0_2_3 - 0.000548340548340567*G0_0_0_0_2_4 + 0.000335497835497847*G0_0_0_0_2_5 + 0.000537518037518054*G0_0_0_0_3_0 - 0.00189393939393946*G0_0_0_0_3_1 + 0.000335497835497847*G0_0_0_0_3_2 - 0.00236652236652245*G0_0_0_0_3_3 - 0.00062049062049064*G0_0_0_0_3_4 - 0.00174603174603181*G0_0_0_0_3_5 + 0.00163419913419919*G0_0_0_0_4_0 - 0.000227272727272735*G0_0_0_0_4_1 - 0.000548340548340567*G0_0_0_0_4_2 - 0.00062049062049064*G0_0_0_0_4_3 + 0.000692640692640716*G0_0_0_0_4_4 - 0.000216450216450222*G0_0_0_0_4_5 + 0.00139610389610394*G0_0_0_0_5_0 - 0.00353535353535366*G0_0_0_0_5_1 + 0.000335497835497847*G0_0_0_0_5_2 - 0.00174603174603181*G0_0_0_0_5_3 - 0.000216450216450222*G0_0_0_0_5_4 - 0.00337662337662349*G0_0_0_0_5_5 + 0.00061868686868689*G0_0_0_1_0_0 - 0.00585317460317481*G0_0_0_1_0_1 + 0.000523989898989917*G0_0_0_1_0_2 - 0.00189393939393946*G0_0_0_1_0_3 - 0.000227272727272735*G0_0_0_1_0_4 - 0.00353535353535366*G0_0_0_1_0_5 - 0.00585317460317481*G0_0_0_1_1_0 + 0.0918019480519513*G0_0_0_1_1_1 - 0.00585317460317481*G0_0_0_1_1_2 + 0.0250541125541134*G0_0_0_1_1_3 + 0.00164141414141419*G0_0_0_1_1_4 + 0.0250541125541135*G0_0_0_1_1_5 + 0.000523989898989917*G0_0_0_1_2_0 - 0.00585317460317481*G0_0_0_1_2_1 + 0.000618686868686891*G0_0_0_1_2_2 - 0.00353535353535366*G0_0_0_1_2_3 - 0.000227272727272735*G0_0_0_1_2_4 - 0.00189393939393947*G0_0_0_1_2_5 - 0.00189393939393946*G0_0_0_1_3_0 + 0.0250541125541134*G0_0_0_1_3_1 - 0.00353535353535366*G0_0_0_1_3_2 + 0.0151515151515157*G0_0_0_1_3_3 + 0.000505050505050524*G0_0_0_1_3_4 + 0.00757575757575787*G0_0_0_1_3_5 - 0.000227272727272735*G0_0_0_1_4_0 + 0.00164141414141419*G0_0_0_1_4_1 - 0.000227272727272735*G0_0_0_1_4_2 + 0.000505050505050524*G0_0_0_1_4_3 - 0.000808080808080834*G0_0_0_1_4_4 + 0.000505050505050522*G0_0_0_1_4_5 - 0.00353535353535366*G0_0_0_1_5_0 + 0.0250541125541135*G0_0_0_1_5_1 - 0.00189393939393947*G0_0_0_1_5_2 + 0.00757575757575787*G0_0_0_1_5_3 + 0.000505050505050522*G0_0_0_1_5_4 + 0.0151515151515157*G0_0_0_1_5_5 - 0.000328282828282839*G0_0_0_2_0_0 + 0.000523989898989917*G0_0_0_2_0_1 - 0.00032828282828284*G0_0_0_2_0_2 + 0.000335497835497847*G0_0_0_2_0_3 - 0.000548340548340567*G0_0_0_2_0_4 + 0.000335497835497847*G0_0_0_2_0_5 + 0.000523989898989917*G0_0_0_2_1_0 - 0.00585317460317481*G0_0_0_2_1_1 + 0.000618686868686891*G0_0_0_2_1_2 - 0.00353535353535366*G0_0_0_2_1_3 - 0.000227272727272735*G0_0_0_2_1_4 - 0.00189393939393947*G0_0_0_2_1_5 - 0.00032828282828284*G0_0_0_2_2_0 + 0.000618686868686891*G0_0_0_2_2_1 + 0.00262987012987024*G0_0_0_2_2_2 + 0.00139610389610395*G0_0_0_2_2_3 + 0.00163419913419919*G0_0_0_2_2_4 + 0.000537518037518057*G0_0_0_2_2_5 + 0.000335497835497847*G0_0_0_2_3_0 - 0.00353535353535366*G0_0_0_2_3_1 + 0.00139610389610395*G0_0_0_2_3_2 - 0.0033766233766235*G0_0_0_2_3_3 - 0.000216450216450223*G0_0_0_2_3_4 - 0.00174603174603181*G0_0_0_2_3_5 - 0.000548340548340567*G0_0_0_2_4_0 - 0.000227272727272735*G0_0_0_2_4_1 + 0.00163419913419919*G0_0_0_2_4_2 - 0.000216450216450223*G0_0_0_2_4_3 + 0.000692640692640721*G0_0_0_2_4_4 - 0.00062049062049064*G0_0_0_2_4_5 + 0.000335497835497847*G0_0_0_2_5_0 - 0.00189393939393947*G0_0_0_2_5_1 + 0.000537518037518057*G0_0_0_2_5_2 - 0.00174603174603181*G0_0_0_2_5_3 - 0.00062049062049064*G0_0_0_2_5_4 - 0.00236652236652245*G0_0_0_2_5_5 + 0.000537518037518054*G0_0_0_3_0_0 - 0.00189393939393946*G0_0_0_3_0_1 + 0.000335497835497847*G0_0_0_3_0_2 - 0.00236652236652245*G0_0_0_3_0_3 - 0.00062049062049064*G0_0_0_3_0_4 - 0.00174603174603181*G0_0_0_3_0_5 - 0.00189393939393946*G0_0_0_3_1_0 + 0.0250541125541134*G0_0_0_3_1_1 - 0.00353535353535366*G0_0_0_3_1_2 + 0.0151515151515157*G0_0_0_3_1_3 + 0.000505050505050524*G0_0_0_3_1_4 + 0.00757575757575787*G0_0_0_3_1_5 + 0.000335497835497847*G0_0_0_3_2_0 - 0.00353535353535366*G0_0_0_3_2_1 + 0.00139610389610395*G0_0_0_3_2_2 - 0.0033766233766235*G0_0_0_3_2_3 - 0.000216450216450223*G0_0_0_3_2_4 - 0.00174603174603181*G0_0_0_3_2_5 - 0.00236652236652245*G0_0_0_3_3_0 + 0.0151515151515157*G0_0_0_3_3_1 - 0.0033766233766235*G0_0_0_3_3_2 + 0.0246753246753255*G0_0_0_3_3_3 + 0.00372294372294385*G0_0_0_3_3_4 + 0.00822510822510852*G0_0_0_3_3_5 - 0.00062049062049064*G0_0_0_3_4_0 + 0.000505050505050524*G0_0_0_3_4_1 - 0.000216450216450223*G0_0_0_3_4_2 + 0.00372294372294385*G0_0_0_3_4_3 + 0.00285714285714295*G0_0_0_3_4_4 + 0.00248196248196256*G0_0_0_3_4_5 - 0.00174603174603181*G0_0_0_3_5_0 + 0.00757575757575787*G0_0_0_3_5_1 - 0.00174603174603181*G0_0_0_3_5_2 + 0.00822510822510852*G0_0_0_3_5_3 + 0.00248196248196256*G0_0_0_3_5_4 + 0.00822510822510852*G0_0_0_3_5_5 + 0.00163419913419919*G0_0_0_4_0_0 - 0.000227272727272735*G0_0_0_4_0_1 - 0.000548340548340567*G0_0_0_4_0_2 - 0.00062049062049064*G0_0_0_4_0_3 + 0.000692640692640716*G0_0_0_4_0_4 - 0.000216450216450222*G0_0_0_4_0_5 - 0.000227272727272735*G0_0_0_4_1_0 + 0.00164141414141419*G0_0_0_4_1_1 - 0.000227272727272735*G0_0_0_4_1_2 + 0.000505050505050524*G0_0_0_4_1_3 - 0.000808080808080834*G0_0_0_4_1_4 + 0.000505050505050522*G0_0_0_4_1_5 - 0.000548340548340567*G0_0_0_4_2_0 - 0.000227272727272735*G0_0_0_4_2_1 + 0.00163419913419919*G0_0_0_4_2_2 - 0.000216450216450223*G0_0_0_4_2_3 + 0.000692640692640721*G0_0_0_4_2_4 - 0.00062049062049064*G0_0_0_4_2_5 - 0.00062049062049064*G0_0_0_4_3_0 + 0.000505050505050524*G0_0_0_4_3_1 - 0.000216450216450223*G0_0_0_4_3_2 + 0.00372294372294385*G0_0_0_4_3_3 + 0.00285714285714295*G0_0_0_4_3_4 + 0.00248196248196256*G0_0_0_4_3_5 + 0.000692640692640716*G0_0_0_4_4_0 - 0.000808080808080834*G0_0_0_4_4_1 + 0.000692640692640721*G0_0_0_4_4_2 + 0.00285714285714295*G0_0_0_4_4_3 + 0.0168831168831174*G0_0_0_4_4_4 + 0.00285714285714295*G0_0_0_4_4_5 - 0.000216450216450222*G0_0_0_4_5_0 + 0.000505050505050522*G0_0_0_4_5_1 - 0.00062049062049064*G0_0_0_4_5_2 + 0.00248196248196256*G0_0_0_4_5_3 + 0.00285714285714295*G0_0_0_4_5_4 + 0.00372294372294385*G0_0_0_4_5_5 + 0.00139610389610394*G0_0_0_5_0_0 - 0.00353535353535366*G0_0_0_5_0_1 + 0.000335497835497847*G0_0_0_5_0_2 - 0.0017460317460318*G0_0_0_5_0_3 - 0.000216450216450222*G0_0_0_5_0_4 - 0.00337662337662349*G0_0_0_5_0_5 - 0.00353535353535366*G0_0_0_5_1_0 + 0.0250541125541135*G0_0_0_5_1_1 - 0.00189393939393947*G0_0_0_5_1_2 + 0.00757575757575787*G0_0_0_5_1_3 + 0.000505050505050522*G0_0_0_5_1_4 + 0.0151515151515157*G0_0_0_5_1_5 + 0.000335497835497847*G0_0_0_5_2_0 - 0.00189393939393947*G0_0_0_5_2_1 + 0.000537518037518057*G0_0_0_5_2_2 - 0.00174603174603181*G0_0_0_5_2_3 - 0.00062049062049064*G0_0_0_5_2_4 - 0.00236652236652245*G0_0_0_5_2_5 - 0.00174603174603181*G0_0_0_5_3_0 + 0.00757575757575787*G0_0_0_5_3_1 - 0.00174603174603181*G0_0_0_5_3_2 + 0.00822510822510852*G0_0_0_5_3_3 + 0.00248196248196256*G0_0_0_5_3_4 + 0.00822510822510852*G0_0_0_5_3_5 - 0.000216450216450222*G0_0_0_5_4_0 + 0.000505050505050522*G0_0_0_5_4_1 - 0.00062049062049064*G0_0_0_5_4_2 + 0.00248196248196256*G0_0_0_5_4_3 + 0.00285714285714295*G0_0_0_5_4_4 + 0.00372294372294385*G0_0_0_5_4_5 - 0.00337662337662349*G0_0_0_5_5_0 + 0.0151515151515157*G0_0_0_5_5_1 - 0.00236652236652245*G0_0_0_5_5_2 + 0.00822510822510852*G0_0_0_5_5_3 + 0.00372294372294385*G0_0_0_5_5_4 + 0.0246753246753255*G0_0_0_5_5_5; + A[16] = A[11] - 0.0018303571428572*G0_0_0_0_0_0 - 0.000584866522366542*G0_0_0_0_0_1 - 0.000134379509379515*G0_0_0_0_0_2 - 0.00034812409812411*G0_0_0_0_0_3 - 0.0015963203463204*G0_0_0_0_0_4 - 0.00119047619047623*G0_0_0_0_0_5 - 0.000584866522366541*G0_0_0_0_1_0 + 0.00543650793650812*G0_0_0_0_1_1 - 0.000537518037518056*G0_0_0_0_1_2 + 0.00185064935064941*G0_0_0_0_1_3 + 0.000135281385281389*G0_0_0_0_1_4 + 0.00330808080808092*G0_0_0_0_1_5 - 0.000134379509379515*G0_0_0_0_2_0 - 0.000537518037518056*G0_0_0_0_2_1 + 0.00238861832611841*G0_0_0_0_2_2 + 0.00226911976911985*G0_0_0_0_2_4 - 0.000221861471861479*G0_0_0_0_2_5 - 0.00034812409812411*G0_0_0_0_3_0 + 0.00185064935064941*G0_0_0_0_3_1 + 0.000591630591630615*G0_0_0_0_3_3 + 0.000425685425685441*G0_0_0_0_3_4 + 0.00113997113997118*G0_0_0_0_3_5 - 0.0015963203463204*G0_0_0_0_4_0 + 0.000135281385281389*G0_0_0_0_4_1 + 0.00226911976911985*G0_0_0_0_4_2 + 0.00042568542568544*G0_0_0_0_4_3 + 0.00287878787878797*G0_0_0_0_4_4 + 0.000173160173160177*G0_0_0_0_4_5 - 0.00119047619047623*G0_0_0_0_5_0 + 0.00330808080808092*G0_0_0_0_5_1 - 0.000221861471861479*G0_0_0_0_5_2 + 0.00113997113997118*G0_0_0_0_5_3 + 0.000173160173160178*G0_0_0_0_5_4 + 0.00268398268398276*G0_0_0_0_5_5 - 0.000584866522366542*G0_0_0_1_0_0 + 0.00543650793650812*G0_0_0_1_0_1 - 0.000537518037518056*G0_0_0_1_0_2 + 0.00185064935064941*G0_0_0_1_0_3 + 0.000135281385281389*G0_0_0_1_0_4 + 0.00330808080808092*G0_0_0_1_0_5 + 0.00543650793650812*G0_0_0_1_1_0 - 0.0874594155844186*G0_0_0_1_1_1 + 0.00534181096681115*G0_0_0_1_1_2 - 0.0222402597402605*G0_0_0_1_1_3 - 0.00140331890331894*G0_0_0_1_1_4 - 0.0234848484848494*G0_0_0_1_1_5 - 0.000537518037518056*G0_0_0_1_2_0 + 0.00534181096681115*G0_0_0_1_2_1 + 0.000345869408369422*G0_0_0_1_2_2 + 0.00272366522366532*G0_0_0_1_2_3 + 0.000611471861471883*G0_0_0_1_2_4 + 0.00156926406926413*G0_0_0_1_2_5 + 0.00185064935064941*G0_0_0_1_3_0 - 0.0222402597402605*G0_0_0_1_3_1 + 0.00272366522366532*G0_0_0_1_3_2 - 0.0156709956709962*G0_0_0_1_3_3 - 0.000894660894660925*G0_0_0_1_3_4 - 0.0068398268398271*G0_0_0_1_3_5 + 0.000135281385281389*G0_0_0_1_4_0 - 0.00140331890331894*G0_0_0_1_4_1 + 0.000611471861471883*G0_0_0_1_4_2 - 0.000894660894660925*G0_0_0_1_4_3 + 0.00156565656565662*G0_0_0_1_4_4 - 0.000331890331890342*G0_0_0_1_4_5 + 0.00330808080808092*G0_0_0_1_5_0 - 0.0234848484848494*G0_0_0_1_5_1 + 0.00156926406926413*G0_0_0_1_5_2 - 0.0068398268398271*G0_0_0_1_5_3 - 0.000331890331890342*G0_0_0_1_5_4 - 0.013506493506494*G0_0_0_1_5_5 - 0.000134379509379515*G0_0_0_2_0_0 - 0.000537518037518056*G0_0_0_2_0_1 + 0.00238861832611841*G0_0_0_2_0_2 + 0.00226911976911985*G0_0_0_2_0_4 - 0.000221861471861478*G0_0_0_2_0_5 - 0.000537518037518056*G0_0_0_2_1_0 + 0.00534181096681115*G0_0_0_2_1_1 + 0.000345869408369422*G0_0_0_2_1_2 + 0.00272366522366532*G0_0_0_2_1_3 + 0.000611471861471883*G0_0_0_2_1_4 + 0.00156926406926413*G0_0_0_2_1_5 + 0.00238861832611841*G0_0_0_2_2_0 + 0.000345869408369422*G0_0_0_2_2_1 - 0.0278733766233777*G0_0_0_2_2_2 - 0.00415584415584432*G0_0_0_2_2_3 - 0.0112121212121216*G0_0_0_2_2_4 - 0.000802669552669587*G0_0_0_2_2_5 + 0.00272366522366532*G0_0_0_2_3_1 - 0.00415584415584432*G0_0_0_2_3_2 + 0.00536796536796555*G0_0_0_2_3_3 - 0.00112554112554117*G0_0_0_2_3_4 + 0.00170274170274176*G0_0_0_2_3_5 + 0.00226911976911985*G0_0_0_2_4_0 + 0.000611471861471883*G0_0_0_2_4_1 - 0.0112121212121216*G0_0_0_2_4_2 - 0.00112554112554117*G0_0_0_2_4_3 - 0.0103896103896108*G0_0_0_2_4_4 + 0.000382395382395392*G0_0_0_2_4_5 - 0.000221861471861478*G0_0_0_2_5_0 + 0.00156926406926413*G0_0_0_2_5_1 - 0.000802669552669586*G0_0_0_2_5_2 + 0.00170274170274176*G0_0_0_2_5_3 + 0.000382395382395392*G0_0_0_2_5_4 + 0.00240981240981249*G0_0_0_2_5_5 - 0.00034812409812411*G0_0_0_3_0_0 + 0.00185064935064941*G0_0_0_3_0_1 + 0.000591630591630615*G0_0_0_3_0_3 + 0.00042568542568544*G0_0_0_3_0_4 + 0.00113997113997118*G0_0_0_3_0_5 + 0.00185064935064941*G0_0_0_3_1_0 - 0.0222402597402605*G0_0_0_3_1_1 + 0.00272366522366532*G0_0_0_3_1_2 - 0.0156709956709962*G0_0_0_3_1_3 - 0.000894660894660925*G0_0_0_3_1_4 - 0.0068398268398271*G0_0_0_3_1_5 + 0.00272366522366532*G0_0_0_3_2_1 - 0.00415584415584432*G0_0_0_3_2_2 + 0.00536796536796555*G0_0_0_3_2_3 - 0.00112554112554117*G0_0_0_3_2_4 + 0.00170274170274176*G0_0_0_3_2_5 + 0.000591630591630615*G0_0_0_3_3_0 - 0.0156709956709962*G0_0_0_3_3_1 + 0.00536796536796555*G0_0_0_3_3_2 - 0.00233766233766245*G0_0_0_3_3_3 + 0.000606060606060625*G0_0_0_3_3_4 - 0.00458874458874476*G0_0_0_3_3_5 + 0.00042568542568544*G0_0_0_3_4_0 - 0.000894660894660925*G0_0_0_3_4_1 - 0.00112554112554117*G0_0_0_3_4_2 + 0.000606060606060626*G0_0_0_3_4_3 - 0.00398268398268411*G0_0_0_3_4_4 - 0.00161616161616167*G0_0_0_3_4_5 + 0.00113997113997118*G0_0_0_3_5_0 - 0.0068398268398271*G0_0_0_3_5_1 + 0.00170274170274176*G0_0_0_3_5_2 - 0.00458874458874476*G0_0_0_3_5_3 - 0.00161616161616167*G0_0_0_3_5_4 - 0.00709956709956735*G0_0_0_3_5_5 - 0.0015963203463204*G0_0_0_4_0_0 + 0.000135281385281389*G0_0_0_4_0_1 + 0.00226911976911985*G0_0_0_4_0_2 + 0.000425685425685441*G0_0_0_4_0_3 + 0.00287878787878797*G0_0_0_4_0_4 + 0.000173160173160177*G0_0_0_4_0_5 + 0.000135281385281389*G0_0_0_4_1_0 - 0.00140331890331894*G0_0_0_4_1_1 + 0.000611471861471883*G0_0_0_4_1_2 - 0.000894660894660925*G0_0_0_4_1_3 + 0.00156565656565662*G0_0_0_4_1_4 - 0.000331890331890342*G0_0_0_4_1_5 + 0.00226911976911985*G0_0_0_4_2_0 + 0.000611471861471883*G0_0_0_4_2_1 - 0.0112121212121216*G0_0_0_4_2_2 - 0.00112554112554117*G0_0_0_4_2_3 - 0.0103896103896108*G0_0_0_4_2_4 + 0.000382395382395392*G0_0_0_4_2_5 + 0.000425685425685441*G0_0_0_4_3_0 - 0.000894660894660925*G0_0_0_4_3_1 - 0.00112554112554117*G0_0_0_4_3_2 + 0.000606060606060625*G0_0_0_4_3_3 - 0.00398268398268411*G0_0_0_4_3_4 - 0.00161616161616167*G0_0_0_4_3_5 + 0.00287878787878797*G0_0_0_4_4_0 + 0.00156565656565662*G0_0_0_4_4_1 - 0.0103896103896108*G0_0_0_4_4_2 - 0.00398268398268411*G0_0_0_4_4_3 - 0.0436363636363651*G0_0_0_4_4_4 - 0.00389610389610403*G0_0_0_4_4_5 + 0.000173160173160177*G0_0_0_4_5_0 - 0.000331890331890342*G0_0_0_4_5_1 + 0.000382395382395392*G0_0_0_4_5_2 - 0.00161616161616167*G0_0_0_4_5_3 - 0.00389610389610403*G0_0_0_4_5_4 - 0.00415584415584429*G0_0_0_4_5_5 - 0.00119047619047623*G0_0_0_5_0_0 + 0.00330808080808092*G0_0_0_5_0_1 - 0.000221861471861478*G0_0_0_5_0_2 + 0.00113997113997118*G0_0_0_5_0_3 + 0.000173160173160177*G0_0_0_5_0_4 + 0.00268398268398276*G0_0_0_5_0_5 + 0.00330808080808092*G0_0_0_5_1_0 - 0.0234848484848494*G0_0_0_5_1_1 + 0.00156926406926413*G0_0_0_5_1_2 - 0.0068398268398271*G0_0_0_5_1_3 - 0.000331890331890342*G0_0_0_5_1_4 - 0.013506493506494*G0_0_0_5_1_5 - 0.000221861471861479*G0_0_0_5_2_0 + 0.00156926406926413*G0_0_0_5_2_1 - 0.000802669552669587*G0_0_0_5_2_2 + 0.00170274170274176*G0_0_0_5_2_3 + 0.000382395382395392*G0_0_0_5_2_4 + 0.00240981240981249*G0_0_0_5_2_5 + 0.00113997113997118*G0_0_0_5_3_0 - 0.0068398268398271*G0_0_0_5_3_1 + 0.00170274170274176*G0_0_0_5_3_2 - 0.00458874458874476*G0_0_0_5_3_3 - 0.00161616161616167*G0_0_0_5_3_4 - 0.00709956709956735*G0_0_0_5_3_5 + 0.000173160173160177*G0_0_0_5_4_0 - 0.000331890331890342*G0_0_0_5_4_1 + 0.000382395382395392*G0_0_0_5_4_2 - 0.00161616161616167*G0_0_0_5_4_3 - 0.00389610389610403*G0_0_0_5_4_4 - 0.00415584415584429*G0_0_0_5_4_5 + 0.00268398268398277*G0_0_0_5_5_0 - 0.013506493506494*G0_0_0_5_5_1 + 0.00240981240981249*G0_0_0_5_5_2 - 0.00709956709956735*G0_0_0_5_5_3 - 0.00415584415584429*G0_0_0_5_5_4 - 0.0249350649350658*G0_0_0_5_5_5 - 0.00756087662337687*G0_0_1_0_0_0 + 0.000116341991341994*G0_0_1_0_0_1 - 0.000129870129870133*G0_0_1_0_0_3 - 0.000351731601731612*G0_0_1_0_0_4 - 0.000703463203463223*G0_0_1_0_0_5 + 0.000116341991341994*G0_0_1_0_1_0 + 0.000346320346320358*G0_0_1_0_1_1 - 0.00027056277056278*G0_0_1_0_1_3 - 0.000281385281385291*G0_0_1_0_1_4 + 0.00127299783549788*G0_0_1_0_2_2 - 0.000162337662337664*G0_0_1_0_2_4 - 0.000238095238095246*G0_0_1_0_2_5 - 0.000129870129870133*G0_0_1_0_3_0 - 0.00027056277056278*G0_0_1_0_3_1 + 0.000129870129870134*G0_0_1_0_3_3 + 0.000822510822510849*G0_0_1_0_3_4 + 0.000735930735930759*G0_0_1_0_3_5 - 0.000351731601731612*G0_0_1_0_4_0 - 0.000281385281385291*G0_0_1_0_4_1 - 0.000162337662337664*G0_0_1_0_4_2 + 0.000822510822510849*G0_0_1_0_4_3 + 0.00339826839826852*G0_0_1_0_4_4 + 0.00103896103896107*G0_0_1_0_4_5 - 0.000703463203463223*G0_0_1_0_5_0 - 0.000238095238095246*G0_0_1_0_5_2 + 0.000735930735930759*G0_0_1_0_5_3 + 0.00103896103896107*G0_0_1_0_5_4 + 0.00380952380952394*G0_0_1_0_5_5 + 0.000116341991341994*G0_0_1_1_0_0 + 0.000346320346320358*G0_0_1_1_0_1 - 0.00027056277056278*G0_0_1_1_0_3 - 0.000281385281385291*G0_0_1_1_0_4 + 0.000346320346320358*G0_0_1_1_1_0 - 0.000248917748917757*G0_0_1_1_1_2 + 0.00156926406926412*G0_0_1_1_1_3 - 0.00156926406926412*G0_0_1_1_1_5 - 0.000248917748917757*G0_0_1_1_2_1 + 0.000735930735930763*G0_0_1_1_2_2 - 0.000844155844155872*G0_0_1_1_2_3 - 0.00018398268398269*G0_0_1_1_2_5 - 0.00027056277056278*G0_0_1_1_3_0 + 0.00156926406926412*G0_0_1_1_3_1 - 0.000844155844155872*G0_0_1_1_3_2 + 0.00147186147186152*G0_0_1_1_3_3 + 0.000735930735930761*G0_0_1_1_3_4 + 0.000909090909090941*G0_0_1_1_3_5 - 0.000281385281385291*G0_0_1_1_4_0 + 0.000735930735930761*G0_0_1_1_4_3 - 0.000389610389610399*G0_0_1_1_4_4 + 0.000562770562770582*G0_0_1_1_4_5 - 0.00156926406926412*G0_0_1_1_5_1 - 0.00018398268398269*G0_0_1_1_5_2 + 0.000909090909090941*G0_0_1_1_5_3 + 0.000562770562770582*G0_0_1_1_5_4 - 0.0032900432900434*G0_0_1_1_5_5 + 0.00127299783549788*G0_0_1_2_0_2 - 0.000162337662337664*G0_0_1_2_0_4 - 0.000238095238095246*G0_0_1_2_0_5 - 0.000248917748917757*G0_0_1_2_1_1 + 0.000735930735930763*G0_0_1_2_1_2 - 0.000844155844155871*G0_0_1_2_1_3 - 0.00018398268398269*G0_0_1_2_1_5 + 0.00127299783549788*G0_0_1_2_2_0 + 0.000735930735930763*G0_0_1_2_2_1 - 0.0201501623376631*G0_0_1_2_2_2 - 0.00213744588744597*G0_0_1_2_2_3 - 0.00492424242424262*G0_0_1_2_2_4 - 0.000243506493506505*G0_0_1_2_2_5 - 0.000844155844155871*G0_0_1_2_3_1 - 0.00213744588744597*G0_0_1_2_3_2 + 0.0020346320346321*G0_0_1_2_3_3 + 0.00056277056277058*G0_0_1_2_3_5 - 0.000162337662337664*G0_0_1_2_4_0 - 0.00492424242424262*G0_0_1_2_4_2 - 0.00313852813852826*G0_0_1_2_4_4 + 0.000476190476190491*G0_0_1_2_4_5 - 0.000238095238095246*G0_0_1_2_5_0 - 0.00018398268398269*G0_0_1_2_5_1 - 0.000243506493506506*G0_0_1_2_5_2 + 0.00056277056277058*G0_0_1_2_5_3 + 0.000476190476190491*G0_0_1_2_5_4 + 0.000519480519480536*G0_0_1_2_5_5 - 0.000129870129870133*G0_0_1_3_0_0 - 0.00027056277056278*G0_0_1_3_0_1 + 0.000129870129870134*G0_0_1_3_0_3 + 0.000822510822510849*G0_0_1_3_0_4 + 0.000735930735930759*G0_0_1_3_0_5 - 0.00027056277056278*G0_0_1_3_1_0 + 0.00156926406926412*G0_0_1_3_1_1 - 0.000844155844155871*G0_0_1_3_1_2 + 0.00147186147186152*G0_0_1_3_1_3 + 0.000735930735930761*G0_0_1_3_1_4 + 0.000909090909090941*G0_0_1_3_1_5 - 0.000844155844155871*G0_0_1_3_2_1 - 0.00213744588744598*G0_0_1_3_2_2 + 0.0020346320346321*G0_0_1_3_2_3 + 0.00056277056277058*G0_0_1_3_2_5 + 0.000129870129870134*G0_0_1_3_3_0 + 0.00147186147186152*G0_0_1_3_3_1 + 0.0020346320346321*G0_0_1_3_3_2 + 0.0109090909090913*G0_0_1_3_3_3 - 0.00173160173160179*G0_0_1_3_3_4 - 0.00138528138528142*G0_0_1_3_3_5 + 0.000822510822510849*G0_0_1_3_4_0 + 0.000735930735930761*G0_0_1_3_4_1 - 0.00173160173160179*G0_0_1_3_4_3 - 0.000865800865800902*G0_0_1_3_4_4 - 0.00259740259740268*G0_0_1_3_4_5 + 0.000735930735930759*G0_0_1_3_5_0 + 0.000909090909090941*G0_0_1_3_5_1 + 0.00056277056277058*G0_0_1_3_5_2 - 0.00138528138528142*G0_0_1_3_5_3 - 0.00259740259740268*G0_0_1_3_5_4 - 0.00251082251082259*G0_0_1_3_5_5 - 0.000351731601731612*G0_0_1_4_0_0 - 0.000281385281385291*G0_0_1_4_0_1 - 0.000162337662337664*G0_0_1_4_0_2 + 0.000822510822510849*G0_0_1_4_0_3 + 0.00339826839826852*G0_0_1_4_0_4 + 0.00103896103896107*G0_0_1_4_0_5 - 0.000281385281385291*G0_0_1_4_1_0 + 0.000735930735930761*G0_0_1_4_1_3 - 0.000389610389610399*G0_0_1_4_1_4 + 0.000562770562770582*G0_0_1_4_1_5 - 0.000162337662337664*G0_0_1_4_2_0 - 0.00492424242424262*G0_0_1_4_2_2 - 0.00313852813852826*G0_0_1_4_2_4 + 0.000476190476190491*G0_0_1_4_2_5 + 0.000822510822510849*G0_0_1_4_3_0 + 0.000735930735930761*G0_0_1_4_3_1 - 0.00173160173160179*G0_0_1_4_3_3 - 0.000865800865800903*G0_0_1_4_3_4 - 0.00259740259740268*G0_0_1_4_3_5 + 0.00339826839826852*G0_0_1_4_4_0 - 0.000389610389610399*G0_0_1_4_4_1 - 0.00313852813852825*G0_0_1_4_4_2 - 0.000865800865800903*G0_0_1_4_4_3 + 0.039740259740261*G0_0_1_4_4_4 - 0.000173160173160184*G0_0_1_4_4_5 + 0.00103896103896107*G0_0_1_4_5_0 + 0.000562770562770582*G0_0_1_4_5_1 + 0.000476190476190491*G0_0_1_4_5_2 - 0.00259740259740268*G0_0_1_4_5_3 - 0.000173160173160182*G0_0_1_4_5_4 - 0.00216450216450223*G0_0_1_4_5_5 - 0.000703463203463223*G0_0_1_5_0_0 - 0.000238095238095246*G0_0_1_5_0_2 + 0.000735930735930759*G0_0_1_5_0_3 + 0.00103896103896107*G0_0_1_5_0_4 + 0.00380952380952394*G0_0_1_5_0_5 - 0.00156926406926412*G0_0_1_5_1_1 - 0.00018398268398269*G0_0_1_5_1_2 + 0.000909090909090941*G0_0_1_5_1_3 + 0.000562770562770582*G0_0_1_5_1_4 - 0.0032900432900434*G0_0_1_5_1_5 - 0.000238095238095246*G0_0_1_5_2_0 - 0.00018398268398269*G0_0_1_5_2_1 - 0.000243506493506505*G0_0_1_5_2_2 + 0.00056277056277058*G0_0_1_5_2_3 + 0.000476190476190491*G0_0_1_5_2_4 + 0.000519480519480536*G0_0_1_5_2_5 + 0.000735930735930759*G0_0_1_5_3_0 + 0.000909090909090941*G0_0_1_5_3_1 + 0.00056277056277058*G0_0_1_5_3_2 - 0.00138528138528142*G0_0_1_5_3_3 - 0.00259740259740268*G0_0_1_5_3_4 - 0.00251082251082259*G0_0_1_5_3_5 + 0.00103896103896107*G0_0_1_5_4_0 + 0.000562770562770582*G0_0_1_5_4_1 + 0.000476190476190491*G0_0_1_5_4_2 - 0.00259740259740268*G0_0_1_5_4_3 - 0.000173160173160182*G0_0_1_5_4_4 - 0.00216450216450223*G0_0_1_5_4_5 + 0.00380952380952394*G0_0_1_5_5_0 - 0.0032900432900434*G0_0_1_5_5_1 + 0.000519480519480536*G0_0_1_5_5_2 - 0.00251082251082259*G0_0_1_5_5_3 - 0.00216450216450223*G0_0_1_5_5_4 + 0.000779220779220838*G0_0_1_5_5_5; + A[45] = A[73] + 0.0100446428571433*G0_0_0_0_0_0 - 0.000742694805194835*G0_0_0_0_0_1 - 0.00192370129870137*G0_0_0_0_0_2 + 0.00126623376623381*G0_0_0_0_0_3 + 0.00730519480519508*G0_0_0_0_0_4 + 0.00413961038961055*G0_0_0_0_0_5 - 0.000742694805194835*G0_0_0_0_1_0 + 0.00102272727272731*G0_0_0_0_1_1 + 0.000328733766233777*G0_0_0_0_1_2 + 0.00185064935064941*G0_0_0_0_1_3 - 0.00116883116883121*G0_0_0_0_1_4 - 0.000487012987013007*G0_0_0_0_1_5 - 0.00192370129870137*G0_0_0_0_2_0 + 0.000328733766233777*G0_0_0_0_2_1 - 0.00444399350649366*G0_0_0_0_2_2 - 0.00189935064935071*G0_0_0_0_2_3 - 0.000779220779220819*G0_0_0_0_2_4 + 0.000681818181818198*G0_0_0_0_2_5 + 0.00126623376623381*G0_0_0_0_3_0 + 0.00185064935064941*G0_0_0_0_3_1 - 0.00189935064935071*G0_0_0_0_3_2 - 0.00194805194805201*G0_0_0_0_3_3 - 0.000194805194805196*G0_0_0_0_3_4 - 0.00389610389610401*G0_0_0_0_3_5 + 0.00730519480519508*G0_0_0_0_4_0 - 0.00116883116883121*G0_0_0_0_4_1 - 0.000779220779220819*G0_0_0_0_4_2 - 0.000194805194805196*G0_0_0_0_4_3 + 0.0227922077922086*G0_0_0_0_4_4 + 0.000974025974026026*G0_0_0_0_4_5 + 0.00413961038961055*G0_0_0_0_5_0 - 0.000487012987013007*G0_0_0_0_5_1 + 0.000681818181818198*G0_0_0_0_5_2 - 0.00389610389610401*G0_0_0_0_5_3 + 0.000974025974026025*G0_0_0_0_5_4 - 0.00623376623376641*G0_0_0_0_5_5 - 0.000742694805194835*G0_0_0_1_0_0 + 0.00102272727272731*G0_0_0_1_0_1 + 0.000328733766233777*G0_0_0_1_0_2 + 0.00185064935064941*G0_0_0_1_0_3 - 0.00116883116883121*G0_0_0_1_0_4 - 0.000487012987013007*G0_0_0_1_0_5 + 0.00102272727272731*G0_0_0_1_1_0 - 0.0217694805194813*G0_0_0_1_1_1 + 0.00462662337662354*G0_0_0_1_1_2 - 0.0151948051948057*G0_0_0_1_1_3 - 0.00233766233766244*G0_0_0_1_1_5 + 0.000328733766233777*G0_0_0_1_2_0 + 0.00462662337662354*G0_0_0_1_2_1 - 0.0101420454545458*G0_0_0_1_2_2 - 0.00146103896103901*G0_0_0_1_2_3 - 0.000243506493506505*G0_0_0_1_2_4 + 0.00126623376623381*G0_0_0_1_2_5 + 0.00185064935064941*G0_0_0_1_3_0 - 0.0151948051948057*G0_0_0_1_3_1 - 0.00146103896103901*G0_0_0_1_3_2 - 0.0397402597402611*G0_0_0_1_3_3 - 0.00350649350649362*G0_0_0_1_3_4 - 0.00623376623376646*G0_0_0_1_3_5 - 0.00116883116883121*G0_0_0_1_4_0 - 0.000243506493506505*G0_0_0_1_4_2 - 0.00350649350649362*G0_0_0_1_4_3 + 0.00253246753246761*G0_0_0_1_4_4 - 0.00233766233766241*G0_0_0_1_4_5 - 0.000487012987013007*G0_0_0_1_5_0 - 0.00233766233766244*G0_0_0_1_5_1 + 0.00126623376623381*G0_0_0_1_5_2 - 0.00623376623376646*G0_0_0_1_5_3 - 0.00233766233766241*G0_0_0_1_5_4 - 0.00272727272727282*G0_0_0_1_5_5 - 0.00192370129870137*G0_0_0_2_0_0 + 0.000328733766233777*G0_0_0_2_0_1 - 0.00444399350649366*G0_0_0_2_0_2 - 0.00189935064935071*G0_0_0_2_0_3 - 0.000779220779220819*G0_0_0_2_0_4 + 0.000681818181818197*G0_0_0_2_0_5 + 0.000328733766233777*G0_0_0_2_1_0 + 0.00462662337662354*G0_0_0_2_1_1 - 0.0101420454545458*G0_0_0_2_1_2 - 0.00146103896103901*G0_0_0_2_1_3 - 0.000243506493506505*G0_0_0_2_1_4 + 0.00126623376623381*G0_0_0_2_1_5 - 0.00444399350649366*G0_0_0_2_2_0 - 0.0101420454545458*G0_0_0_2_2_1 + 0.11761363636364*G0_0_0_2_2_2 + 0.0401298701298715*G0_0_0_2_2_3 + 0.018311688311689*G0_0_0_2_2_4 + 0.00326298701298714*G0_0_0_2_2_5 - 0.00189935064935071*G0_0_0_2_3_0 - 0.00146103896103901*G0_0_0_2_3_1 + 0.0401298701298715*G0_0_0_2_3_2 + 0.0436363636363652*G0_0_0_2_3_3 + 0.00428571428571445*G0_0_0_2_3_4 - 0.0027272727272728*G0_0_0_2_3_5 - 0.000779220779220819*G0_0_0_2_4_0 - 0.000243506493506505*G0_0_0_2_4_1 + 0.018311688311689*G0_0_0_2_4_2 + 0.00428571428571445*G0_0_0_2_4_3 - 0.0171428571428577*G0_0_0_2_4_4 - 0.00603896103896123*G0_0_0_2_4_5 + 0.000681818181818198*G0_0_0_2_5_0 + 0.00126623376623381*G0_0_0_2_5_1 + 0.00326298701298714*G0_0_0_2_5_2 - 0.0027272727272728*G0_0_0_2_5_3 - 0.00603896103896123*G0_0_0_2_5_4 - 0.0109090909090913*G0_0_0_2_5_5 + 0.00126623376623381*G0_0_0_3_0_0 + 0.00185064935064941*G0_0_0_3_0_1 - 0.00189935064935071*G0_0_0_3_0_2 - 0.00194805194805201*G0_0_0_3_0_3 - 0.000194805194805197*G0_0_0_3_0_4 - 0.00389610389610401*G0_0_0_3_0_5 + 0.00185064935064941*G0_0_0_3_1_0 - 0.0151948051948057*G0_0_0_3_1_1 - 0.00146103896103901*G0_0_0_3_1_2 - 0.0397402597402611*G0_0_0_3_1_3 - 0.00350649350649362*G0_0_0_3_1_4 - 0.00623376623376646*G0_0_0_3_1_5 - 0.00189935064935071*G0_0_0_3_2_0 - 0.00146103896103901*G0_0_0_3_2_1 + 0.0401298701298715*G0_0_0_3_2_2 + 0.0436363636363652*G0_0_0_3_2_3 + 0.00428571428571445*G0_0_0_3_2_4 - 0.0027272727272728*G0_0_0_3_2_5 - 0.00194805194805201*G0_0_0_3_3_0 - 0.0397402597402611*G0_0_0_3_3_1 + 0.0436363636363652*G0_0_0_3_3_2 - 0.0607792207792228*G0_0_0_3_3_3 + 0.0109090909090913*G0_0_0_3_3_4 + 0.00935064935064961*G0_0_0_3_3_5 - 0.000194805194805197*G0_0_0_3_4_0 - 0.00350649350649362*G0_0_0_3_4_1 + 0.00428571428571445*G0_0_0_3_4_2 + 0.0109090909090913*G0_0_0_3_4_3 - 0.00467532467532483*G0_0_0_3_4_4 + 0.0124675324675329*G0_0_0_3_4_5 - 0.00389610389610401*G0_0_0_3_5_0 - 0.00623376623376646*G0_0_0_3_5_1 - 0.0027272727272728*G0_0_0_3_5_2 + 0.00935064935064961*G0_0_0_3_5_3 + 0.0124675324675329*G0_0_0_3_5_4 + 0.0296103896103906*G0_0_0_3_5_5 + 0.00730519480519508*G0_0_0_4_0_0 - 0.00116883116883121*G0_0_0_4_0_1 - 0.000779220779220819*G0_0_0_4_0_2 - 0.000194805194805196*G0_0_0_4_0_3 + 0.0227922077922086*G0_0_0_4_0_4 + 0.000974025974026026*G0_0_0_4_0_5 - 0.00116883116883121*G0_0_0_4_1_0 - 0.000243506493506505*G0_0_0_4_1_2 - 0.00350649350649362*G0_0_0_4_1_3 + 0.00253246753246761*G0_0_0_4_1_4 - 0.00233766233766241*G0_0_0_4_1_5 - 0.000779220779220819*G0_0_0_4_2_0 - 0.000243506493506505*G0_0_0_4_2_1 + 0.018311688311689*G0_0_0_4_2_2 + 0.00428571428571445*G0_0_0_4_2_3 - 0.0171428571428577*G0_0_0_4_2_4 - 0.00603896103896123*G0_0_0_4_2_5 - 0.000194805194805196*G0_0_0_4_3_0 - 0.00350649350649362*G0_0_0_4_3_1 + 0.00428571428571445*G0_0_0_4_3_2 + 0.0109090909090913*G0_0_0_4_3_3 - 0.00467532467532483*G0_0_0_4_3_4 + 0.0124675324675329*G0_0_0_4_3_5 + 0.0227922077922086*G0_0_0_4_4_0 + 0.00253246753246761*G0_0_0_4_4_1 - 0.0171428571428577*G0_0_0_4_4_2 - 0.00467532467532483*G0_0_0_4_4_3 - 0.0748051948051971*G0_0_0_4_4_4 + 0.00701298701298723*G0_0_0_4_4_5 + 0.000974025974026026*G0_0_0_4_5_0 - 0.00233766233766241*G0_0_0_4_5_1 - 0.00603896103896123*G0_0_0_4_5_2 + 0.0124675324675329*G0_0_0_4_5_3 + 0.00701298701298724*G0_0_0_4_5_4 + 0.0264935064935074*G0_0_0_4_5_5 + 0.00413961038961055*G0_0_0_5_0_0 - 0.000487012987013007*G0_0_0_5_0_1 + 0.000681818181818197*G0_0_0_5_0_2 - 0.00389610389610401*G0_0_0_5_0_3 + 0.000974025974026026*G0_0_0_5_0_4 - 0.00623376623376641*G0_0_0_5_0_5 - 0.000487012987013007*G0_0_0_5_1_0 - 0.00233766233766244*G0_0_0_5_1_1 + 0.00126623376623381*G0_0_0_5_1_2 - 0.00623376623376646*G0_0_0_5_1_3 - 0.00233766233766241*G0_0_0_5_1_4 - 0.00272727272727282*G0_0_0_5_1_5 + 0.000681818181818197*G0_0_0_5_2_0 + 0.00126623376623381*G0_0_0_5_2_1 + 0.00326298701298714*G0_0_0_5_2_2 - 0.0027272727272728*G0_0_0_5_2_3 - 0.00603896103896123*G0_0_0_5_2_4 - 0.0109090909090913*G0_0_0_5_2_5 - 0.00389610389610401*G0_0_0_5_3_0 - 0.00623376623376646*G0_0_0_5_3_1 - 0.0027272727272728*G0_0_0_5_3_2 + 0.00935064935064961*G0_0_0_5_3_3 + 0.0124675324675329*G0_0_0_5_3_4 + 0.0296103896103906*G0_0_0_5_3_5 + 0.000974025974026026*G0_0_0_5_4_0 - 0.00233766233766241*G0_0_0_5_4_1 - 0.00603896103896123*G0_0_0_5_4_2 + 0.0124675324675329*G0_0_0_5_4_3 + 0.00701298701298723*G0_0_0_5_4_4 + 0.0264935064935074*G0_0_0_5_4_5 - 0.00623376623376641*G0_0_0_5_5_0 - 0.00272727272727282*G0_0_0_5_5_1 - 0.0109090909090913*G0_0_0_5_5_2 + 0.0296103896103906*G0_0_0_5_5_3 + 0.0264935064935074*G0_0_0_5_5_4 + 0.0794805194805222*G0_0_0_5_5_5 + 0.000158279220779237*G0_0_1_0_0_1 - 0.000158279220779216*G0_0_1_0_0_2 - 0.00219155844155854*G0_0_1_0_0_4 + 0.00219155844155846*G0_0_1_0_0_5 + 0.000158279220779237*G0_0_1_0_1_0 + 0.0040300324675326*G0_0_1_0_1_1 + 0.00185064935064941*G0_0_1_0_1_3 - 0.0011688311688312*G0_0_1_0_1_4 - 0.0016558441558442*G0_0_1_0_1_5 - 0.000158279220779216*G0_0_1_0_2_0 - 0.00403003246753261*G0_0_1_0_2_2 - 0.00185064935064941*G0_0_1_0_2_3 + 0.0016558441558442*G0_0_1_0_2_4 + 0.00116883116883121*G0_0_1_0_2_5 + 0.00185064935064941*G0_0_1_0_3_1 - 0.00185064935064941*G0_0_1_0_3_2 + 0.00233766233766241*G0_0_1_0_3_4 - 0.00233766233766241*G0_0_1_0_3_5 - 0.00219155844155854*G0_0_1_0_4_0 - 0.0011688311688312*G0_0_1_0_4_1 + 0.0016558441558442*G0_0_1_0_4_2 + 0.00233766233766241*G0_0_1_0_4_3 + 0.0138311688311693*G0_0_1_0_4_4 + 0.00219155844155846*G0_0_1_0_5_0 - 0.0016558441558442*G0_0_1_0_5_1 + 0.00116883116883121*G0_0_1_0_5_2 - 0.00233766233766241*G0_0_1_0_5_3 - 0.0138311688311693*G0_0_1_0_5_5 + 0.000158279220779237*G0_0_1_1_0_0 + 0.0040300324675326*G0_0_1_1_0_1 + 0.00185064935064941*G0_0_1_1_0_3 - 0.0011688311688312*G0_0_1_1_0_4 - 0.0016558441558442*G0_0_1_1_0_5 + 0.0040300324675326*G0_0_1_1_1_0 - 0.111732954545458*G0_0_1_1_1_1 + 0.00986201298701333*G0_0_1_1_1_2 - 0.0375974025974039*G0_0_1_1_1_3 - 0.0018506493506494*G0_0_1_1_1_4 - 0.0137824675324681*G0_0_1_1_1_5 + 0.00986201298701333*G0_0_1_1_2_1 - 0.00986201298701333*G0_0_1_1_2_2 - 0.000681818181818209*G0_0_1_1_2_4 + 0.000681818181818211*G0_0_1_1_2_5 + 0.00185064935064941*G0_0_1_1_3_0 - 0.0375974025974039*G0_0_1_1_3_1 - 0.0459740259740276*G0_0_1_1_3_3 - 0.00506493506493528*G0_0_1_1_3_5 - 0.0011688311688312*G0_0_1_1_4_0 - 0.0018506493506494*G0_0_1_1_4_1 - 0.000681818181818209*G0_0_1_1_4_2 + 0.00779220779220804*G0_0_1_1_4_4 + 0.00233766233766241*G0_0_1_1_4_5 - 0.0016558441558442*G0_0_1_1_5_0 - 0.0137824675324681*G0_0_1_1_5_1 + 0.000681818181818211*G0_0_1_1_5_2 - 0.00506493506493528*G0_0_1_1_5_3 + 0.00233766233766241*G0_0_1_1_5_4 + 0.0126623376623381*G0_0_1_1_5_5 - 0.000158279220779216*G0_0_1_2_0_0 - 0.00403003246753261*G0_0_1_2_0_2 - 0.00185064935064941*G0_0_1_2_0_3 + 0.00165584415584421*G0_0_1_2_0_4 + 0.00116883116883121*G0_0_1_2_0_5 + 0.00986201298701333*G0_0_1_2_1_1 - 0.00986201298701333*G0_0_1_2_1_2 - 0.000681818181818209*G0_0_1_2_1_4 + 0.000681818181818211*G0_0_1_2_1_5 - 0.00403003246753261*G0_0_1_2_2_0 - 0.00986201298701333*G0_0_1_2_2_1 + 0.111732954545458*G0_0_1_2_2_2 + 0.0375974025974039*G0_0_1_2_2_3 + 0.0137824675324681*G0_0_1_2_2_4 + 0.00185064935064943*G0_0_1_2_2_5 - 0.00185064935064941*G0_0_1_2_3_0 + 0.0375974025974039*G0_0_1_2_3_2 + 0.0459740259740276*G0_0_1_2_3_3 + 0.00506493506493525*G0_0_1_2_3_4 + 0.0016558441558442*G0_0_1_2_4_0 - 0.000681818181818208*G0_0_1_2_4_1 + 0.0137824675324681*G0_0_1_2_4_2 + 0.00506493506493525*G0_0_1_2_4_3 - 0.012662337662338*G0_0_1_2_4_4 - 0.00233766233766241*G0_0_1_2_4_5 + 0.00116883116883121*G0_0_1_2_5_0 + 0.000681818181818211*G0_0_1_2_5_1 + 0.00185064935064943*G0_0_1_2_5_2 - 0.00233766233766241*G0_0_1_2_5_4 - 0.00779220779220805*G0_0_1_2_5_5 + 0.00185064935064941*G0_0_1_3_0_1 - 0.00185064935064941*G0_0_1_3_0_2 + 0.00233766233766241*G0_0_1_3_0_4 - 0.00233766233766241*G0_0_1_3_0_5 + 0.00185064935064941*G0_0_1_3_1_0 - 0.0375974025974039*G0_0_1_3_1_1 - 0.0459740259740276*G0_0_1_3_1_3 - 0.00506493506493528*G0_0_1_3_1_5 - 0.00185064935064941*G0_0_1_3_2_0 + 0.0375974025974039*G0_0_1_3_2_2 + 0.0459740259740276*G0_0_1_3_2_3 + 0.00506493506493525*G0_0_1_3_2_4 - 0.0459740259740276*G0_0_1_3_3_1 + 0.0459740259740276*G0_0_1_3_3_2 + 0.00233766233766241*G0_0_1_3_4_0 + 0.00506493506493525*G0_0_1_3_4_2 - 0.0202597402597409*G0_0_1_3_4_4 - 0.00233766233766241*G0_0_1_3_5_0 - 0.00506493506493528*G0_0_1_3_5_1 + 0.0202597402597409*G0_0_1_3_5_5 - 0.00219155844155854*G0_0_1_4_0_0 - 0.0011688311688312*G0_0_1_4_0_1 + 0.0016558441558442*G0_0_1_4_0_2 + 0.00233766233766241*G0_0_1_4_0_3 + 0.0138311688311693*G0_0_1_4_0_4 - 0.0011688311688312*G0_0_1_4_1_0 - 0.0018506493506494*G0_0_1_4_1_1 - 0.000681818181818209*G0_0_1_4_1_2 + 0.00779220779220804*G0_0_1_4_1_4 + 0.00233766233766241*G0_0_1_4_1_5 + 0.0016558441558442*G0_0_1_4_2_0 - 0.000681818181818208*G0_0_1_4_2_1 + 0.0137824675324681*G0_0_1_4_2_2 + 0.00506493506493525*G0_0_1_4_2_3 - 0.012662337662338*G0_0_1_4_2_4 - 0.00233766233766241*G0_0_1_4_2_5 + 0.00233766233766241*G0_0_1_4_3_0 + 0.00506493506493525*G0_0_1_4_3_2 - 0.0202597402597409*G0_0_1_4_3_4 + 0.0138311688311692*G0_0_1_4_4_0 + 0.00779220779220804*G0_0_1_4_4_1 - 0.012662337662338*G0_0_1_4_4_2 - 0.0202597402597409*G0_0_1_4_4_3 - 0.119220779220783*G0_0_1_4_4_4 - 0.0109090909090913*G0_0_1_4_4_5 + 0.00233766233766241*G0_0_1_4_5_1 - 0.00233766233766241*G0_0_1_4_5_2 - 0.0109090909090913*G0_0_1_4_5_4 + 0.0109090909090913*G0_0_1_4_5_5 + 0.00219155844155846*G0_0_1_5_0_0 - 0.0016558441558442*G0_0_1_5_0_1 + 0.00116883116883121*G0_0_1_5_0_2 - 0.00233766233766241*G0_0_1_5_0_3 - 0.0138311688311693*G0_0_1_5_0_5 - 0.0016558441558442*G0_0_1_5_1_0 - 0.0137824675324681*G0_0_1_5_1_1 + 0.000681818181818211*G0_0_1_5_1_2 - 0.00506493506493528*G0_0_1_5_1_3 + 0.00233766233766241*G0_0_1_5_1_4 + 0.0126623376623381*G0_0_1_5_1_5 + 0.00116883116883121*G0_0_1_5_2_0 + 0.000681818181818211*G0_0_1_5_2_1 + 0.00185064935064943*G0_0_1_5_2_2 - 0.00233766233766241*G0_0_1_5_2_4 - 0.00779220779220805*G0_0_1_5_2_5 - 0.00233766233766241*G0_0_1_5_3_0 - 0.00506493506493528*G0_0_1_5_3_1 + 0.0202597402597409*G0_0_1_5_3_5 + 0.00233766233766241*G0_0_1_5_4_1 - 0.00233766233766241*G0_0_1_5_4_2 - 0.0109090909090913*G0_0_1_5_4_4 + 0.0109090909090913*G0_0_1_5_4_5 - 0.0138311688311693*G0_0_1_5_5_0 + 0.0126623376623381*G0_0_1_5_5_1 - 0.00779220779220805*G0_0_1_5_5_2 + 0.0202597402597409*G0_0_1_5_5_3 + 0.0109090909090913*G0_0_1_5_5_4 + 0.119220779220783*G0_0_1_5_5_5 - 0.001461038961039*G0_1_0_0_0_4 + 0.00146103896103902*G0_1_0_0_0_5 + 0.00138798701298706*G0_1_0_0_1_1 + 0.00146103896103901*G0_1_0_0_1_3 - 0.000584415584415603*G0_1_0_0_1_4 - 0.000584415584415608*G0_1_0_0_1_5 - 0.00138798701298706*G0_1_0_0_2_2 - 0.00146103896103901*G0_1_0_0_2_3 + 0.000584415584415595*G0_1_0_0_2_4 + 0.000584415584415601*G0_1_0_0_2_5 + 0.00146103896103901*G0_1_0_0_3_1 - 0.00146103896103901*G0_1_0_0_3_2 + 0.00116883116883121*G0_1_0_0_3_4 - 0.0011688311688312*G0_1_0_0_3_5 - 0.001461038961039*G0_1_0_0_4_0 - 0.000584415584415603*G0_1_0_0_4_1 + 0.000584415584415595*G0_1_0_0_4_2 + 0.00116883116883121*G0_1_0_0_4_3 + 0.00350649350649361*G0_1_0_0_4_4 + 0.00146103896103902*G0_1_0_0_5_0 - 0.000584415584415608*G0_1_0_0_5_1 + 0.000584415584415601*G0_1_0_0_5_2 - 0.0011688311688312*G0_1_0_0_5_3 - 0.0035064935064936*G0_1_0_0_5_5 + 0.00138798701298706*G0_1_0_1_0_1 + 0.00146103896103901*G0_1_0_1_0_3 - 0.000584415584415603*G0_1_0_1_0_4 - 0.000584415584415608*G0_1_0_1_0_5 + 0.00138798701298706*G0_1_0_1_1_0 - 0.0241071428571436*G0_1_0_1_1_1 + 0.00445616883116898*G0_1_0_1_1_2 - 0.0163636363636369*G0_1_0_1_1_3 - 0.00146103896103901*G0_1_0_1_1_4 - 0.00409090909090923*G0_1_0_1_1_5 + 0.00445616883116898*G0_1_0_1_2_1 - 0.00445616883116899*G0_1_0_1_2_2 - 0.000876623376623408*G0_1_0_1_2_4 + 0.000876623376623409*G0_1_0_1_2_5 + 0.00146103896103901*G0_1_0_1_3_0 - 0.0163636363636369*G0_1_0_1_3_1 - 0.0350649350649363*G0_1_0_1_3_3 - 0.00467532467532485*G0_1_0_1_3_5 - 0.000584415584415603*G0_1_0_1_4_0 - 0.00146103896103901*G0_1_0_1_4_1 - 0.000876623376623408*G0_1_0_1_4_2 + 0.00818181818181844*G0_1_0_1_4_4 + 0.00116883116883121*G0_1_0_1_4_5 - 0.000584415584415608*G0_1_0_1_5_0 - 0.00409090909090923*G0_1_0_1_5_1 + 0.000876623376623409*G0_1_0_1_5_2 - 0.00467532467532485*G0_1_0_1_5_3 + 0.0011688311688312*G0_1_0_1_5_4 - 0.00233766233766241*G0_1_0_1_5_5 - 0.00138798701298706*G0_1_0_2_0_2 - 0.00146103896103901*G0_1_0_2_0_3 + 0.000584415584415596*G0_1_0_2_0_4 + 0.000584415584415601*G0_1_0_2_0_5 + 0.00445616883116898*G0_1_0_2_1_1 - 0.00445616883116899*G0_1_0_2_1_2 - 0.000876623376623408*G0_1_0_2_1_4 + 0.000876623376623409*G0_1_0_2_1_5 - 0.00138798701298706*G0_1_0_2_2_0 - 0.00445616883116899*G0_1_0_2_2_1 + 0.0241071428571438*G0_1_0_2_2_2 + 0.0163636363636369*G0_1_0_2_2_3 + 0.00409090909090926*G0_1_0_2_2_4 + 0.00146103896103902*G0_1_0_2_2_5 - 0.00146103896103901*G0_1_0_2_3_0 + 0.0163636363636369*G0_1_0_2_3_2 + 0.0350649350649363*G0_1_0_2_3_3 + 0.00467532467532484*G0_1_0_2_3_4 + 0.000584415584415596*G0_1_0_2_4_0 - 0.000876623376623407*G0_1_0_2_4_1 + 0.00409090909090926*G0_1_0_2_4_2 + 0.00467532467532484*G0_1_0_2_4_3 + 0.00233766233766244*G0_1_0_2_4_4 - 0.00116883116883121*G0_1_0_2_4_5 + 0.0005844155844156*G0_1_0_2_5_0 + 0.000876623376623409*G0_1_0_2_5_1 + 0.00146103896103902*G0_1_0_2_5_2 - 0.00116883116883121*G0_1_0_2_5_4 - 0.00818181818181846*G0_1_0_2_5_5 + 0.00146103896103901*G0_1_0_3_0_1 - 0.00146103896103901*G0_1_0_3_0_2 + 0.00116883116883121*G0_1_0_3_0_4 - 0.0011688311688312*G0_1_0_3_0_5 + 0.00146103896103901*G0_1_0_3_1_0 - 0.0163636363636369*G0_1_0_3_1_1 - 0.0350649350649363*G0_1_0_3_1_3 - 0.00467532467532485*G0_1_0_3_1_5 - 0.00146103896103901*G0_1_0_3_2_0 + 0.0163636363636369*G0_1_0_3_2_2 + 0.0350649350649363*G0_1_0_3_2_3 + 0.00467532467532484*G0_1_0_3_2_4 - 0.0350649350649363*G0_1_0_3_3_1 + 0.0350649350649363*G0_1_0_3_3_2 + 0.00116883116883121*G0_1_0_3_4_0 + 0.00467532467532484*G0_1_0_3_4_2 - 0.0187012987012993*G0_1_0_3_4_4 - 0.0011688311688312*G0_1_0_3_5_0 - 0.00467532467532485*G0_1_0_3_5_1 + 0.0187012987012993*G0_1_0_3_5_5 - 0.001461038961039*G0_1_0_4_0_0 - 0.000584415584415603*G0_1_0_4_0_1 + 0.000584415584415596*G0_1_0_4_0_2 + 0.00116883116883121*G0_1_0_4_0_3 + 0.00350649350649361*G0_1_0_4_0_4 - 0.000584415584415603*G0_1_0_4_1_0 - 0.00146103896103901*G0_1_0_4_1_1 - 0.000876623376623407*G0_1_0_4_1_2 + 0.00818181818181844*G0_1_0_4_1_4 + 0.00116883116883121*G0_1_0_4_1_5 + 0.000584415584415596*G0_1_0_4_2_0 - 0.000876623376623408*G0_1_0_4_2_1 + 0.00409090909090926*G0_1_0_4_2_2 + 0.00467532467532484*G0_1_0_4_2_3 + 0.00233766233766243*G0_1_0_4_2_4 - 0.00116883116883121*G0_1_0_4_2_5 + 0.00116883116883121*G0_1_0_4_3_0 + 0.00467532467532484*G0_1_0_4_3_2 - 0.0187012987012993*G0_1_0_4_3_4 + 0.00350649350649361*G0_1_0_4_4_0 + 0.00818181818181844*G0_1_0_4_4_1 + 0.00233766233766244*G0_1_0_4_4_2 - 0.0187012987012993*G0_1_0_4_4_3 - 0.0841558441558467*G0_1_0_4_4_4 - 0.0140259740259745*G0_1_0_4_4_5 + 0.00116883116883121*G0_1_0_4_5_1 - 0.00116883116883121*G0_1_0_4_5_2 - 0.0140259740259745*G0_1_0_4_5_4 + 0.0140259740259745*G0_1_0_4_5_5 + 0.00146103896103902*G0_1_0_5_0_0 - 0.000584415584415608*G0_1_0_5_0_1 + 0.000584415584415601*G0_1_0_5_0_2 - 0.0011688311688312*G0_1_0_5_0_3 - 0.0035064935064936*G0_1_0_5_0_5 - 0.000584415584415608*G0_1_0_5_1_0 - 0.00409090909090923*G0_1_0_5_1_1 + 0.000876623376623409*G0_1_0_5_1_2 - 0.00467532467532485*G0_1_0_5_1_3 + 0.0011688311688312*G0_1_0_5_1_4 - 0.00233766233766241*G0_1_0_5_1_5 + 0.000584415584415601*G0_1_0_5_2_0 + 0.000876623376623409*G0_1_0_5_2_1 + 0.00146103896103902*G0_1_0_5_2_2 - 0.00116883116883121*G0_1_0_5_2_4 - 0.00818181818181846*G0_1_0_5_2_5 - 0.0011688311688312*G0_1_0_5_3_0 - 0.00467532467532485*G0_1_0_5_3_1 + 0.0187012987012993*G0_1_0_5_3_5 + 0.00116883116883121*G0_1_0_5_4_1 - 0.00116883116883121*G0_1_0_5_4_2 - 0.0140259740259745*G0_1_0_5_4_4 + 0.0140259740259745*G0_1_0_5_4_5 - 0.0035064935064936*G0_1_0_5_5_0 - 0.00233766233766241*G0_1_0_5_5_1 - 0.00818181818181846*G0_1_0_5_5_2 + 0.0187012987012993*G0_1_0_5_5_3 + 0.0140259740259745*G0_1_0_5_5_4 + 0.0841558441558471*G0_1_0_5_5_5 - 0.0100446428571433*G0_1_1_0_0_0 + 0.00192370129870137*G0_1_1_0_0_1 + 0.000742694805194837*G0_1_1_0_0_2 - 0.00126623376623381*G0_1_1_0_0_3 - 0.00413961038961055*G0_1_1_0_0_4 - 0.0073051948051951*G0_1_1_0_0_5 + 0.00192370129870137*G0_1_1_0_1_0 + 0.00444399350649365*G0_1_1_0_1_1 - 0.000328733766233779*G0_1_1_0_1_2 + 0.00189935064935072*G0_1_1_0_1_3 - 0.000681818181818198*G0_1_1_0_1_4 + 0.000779220779220817*G0_1_1_0_1_5 + 0.000742694805194837*G0_1_1_0_2_0 - 0.000328733766233779*G0_1_1_0_2_1 - 0.00102272727272731*G0_1_1_0_2_2 - 0.00185064935064941*G0_1_1_0_2_3 + 0.000487012987013005*G0_1_1_0_2_4 + 0.00116883116883121*G0_1_1_0_2_5 - 0.00126623376623381*G0_1_1_0_3_0 + 0.00189935064935072*G0_1_1_0_3_1 - 0.00185064935064941*G0_1_1_0_3_2 + 0.00194805194805202*G0_1_1_0_3_3 + 0.00389610389610401*G0_1_1_0_3_4 + 0.000194805194805197*G0_1_1_0_3_5 - 0.00413961038961055*G0_1_1_0_4_0 - 0.000681818181818199*G0_1_1_0_4_1 + 0.000487012987013005*G0_1_1_0_4_2 + 0.00389610389610401*G0_1_1_0_4_3 + 0.0062337662337664*G0_1_1_0_4_4 - 0.000974025974026021*G0_1_1_0_4_5 - 0.0073051948051951*G0_1_1_0_5_0 + 0.000779220779220817*G0_1_1_0_5_1 + 0.00116883116883121*G0_1_1_0_5_2 + 0.000194805194805197*G0_1_1_0_5_3 - 0.00097402597402602*G0_1_1_0_5_4 - 0.0227922077922086*G0_1_1_0_5_5 + 0.00192370129870137*G0_1_1_1_0_0 + 0.00444399350649365*G0_1_1_1_0_1 - 0.000328733766233779*G0_1_1_1_0_2 + 0.00189935064935072*G0_1_1_1_0_3 - 0.000681818181818198*G0_1_1_1_0_4 + 0.000779220779220817*G0_1_1_1_0_5 + 0.00444399350649365*G0_1_1_1_1_0 - 0.11761363636364*G0_1_1_1_1_1 + 0.0101420454545458*G0_1_1_1_1_2 - 0.0401298701298715*G0_1_1_1_1_3 - 0.00326298701298711*G0_1_1_1_1_4 - 0.018311688311689*G0_1_1_1_1_5 - 0.000328733766233779*G0_1_1_1_2_0 + 0.0101420454545458*G0_1_1_1_2_1 - 0.00462662337662354*G0_1_1_1_2_2 + 0.00146103896103901*G0_1_1_1_2_3 - 0.00126623376623381*G0_1_1_1_2_4 + 0.000243506493506512*G0_1_1_1_2_5 + 0.00189935064935072*G0_1_1_1_3_0 - 0.0401298701298715*G0_1_1_1_3_1 + 0.00146103896103901*G0_1_1_1_3_2 - 0.0436363636363652*G0_1_1_1_3_3 + 0.0027272727272728*G0_1_1_1_3_4 - 0.00428571428571449*G0_1_1_1_3_5 - 0.000681818181818199*G0_1_1_1_4_0 - 0.00326298701298711*G0_1_1_1_4_1 - 0.00126623376623381*G0_1_1_1_4_2 + 0.0027272727272728*G0_1_1_1_4_3 + 0.0109090909090912*G0_1_1_1_4_4 + 0.00603896103896123*G0_1_1_1_4_5 + 0.000779220779220817*G0_1_1_1_5_0 - 0.018311688311689*G0_1_1_1_5_1 + 0.000243506493506512*G0_1_1_1_5_2 - 0.00428571428571449*G0_1_1_1_5_3 + 0.00603896103896123*G0_1_1_1_5_4 + 0.0171428571428577*G0_1_1_1_5_5 + 0.000742694805194837*G0_1_1_2_0_0 - 0.000328733766233779*G0_1_1_2_0_1 - 0.00102272727272731*G0_1_1_2_0_2 - 0.00185064935064941*G0_1_1_2_0_3 + 0.000487012987013005*G0_1_1_2_0_4 + 0.00116883116883121*G0_1_1_2_0_5 - 0.000328733766233779*G0_1_1_2_1_0 + 0.0101420454545458*G0_1_1_2_1_1 - 0.00462662337662354*G0_1_1_2_1_2 + 0.00146103896103901*G0_1_1_2_1_3 - 0.00126623376623381*G0_1_1_2_1_4 + 0.000243506493506512*G0_1_1_2_1_5 - 0.00102272727272731*G0_1_1_2_2_0 - 0.00462662337662354*G0_1_1_2_2_1 + 0.0217694805194813*G0_1_1_2_2_2 + 0.0151948051948057*G0_1_1_2_2_3 + 0.00233766233766243*G0_1_1_2_2_4 - 0.00185064935064941*G0_1_1_2_3_0 + 0.00146103896103901*G0_1_1_2_3_1 + 0.0151948051948057*G0_1_1_2_3_2 + 0.0397402597402611*G0_1_1_2_3_3 + 0.00623376623376644*G0_1_1_2_3_4 + 0.00350649350649363*G0_1_1_2_3_5 + 0.000487012987013005*G0_1_1_2_4_0 - 0.00126623376623381*G0_1_1_2_4_1 + 0.00233766233766243*G0_1_1_2_4_2 + 0.00623376623376645*G0_1_1_2_4_3 + 0.00272727272727282*G0_1_1_2_4_4 + 0.00233766233766241*G0_1_1_2_4_5 + 0.00116883116883121*G0_1_1_2_5_0 + 0.000243506493506511*G0_1_1_2_5_1 + 0.00350649350649363*G0_1_1_2_5_3 + 0.00233766233766241*G0_1_1_2_5_4 - 0.00253246753246763*G0_1_1_2_5_5 - 0.00126623376623381*G0_1_1_3_0_0 + 0.00189935064935072*G0_1_1_3_0_1 - 0.00185064935064941*G0_1_1_3_0_2 + 0.00194805194805201*G0_1_1_3_0_3 + 0.00389610389610401*G0_1_1_3_0_4 + 0.000194805194805197*G0_1_1_3_0_5 + 0.00189935064935072*G0_1_1_3_1_0 - 0.0401298701298715*G0_1_1_3_1_1 + 0.00146103896103901*G0_1_1_3_1_2 - 0.0436363636363652*G0_1_1_3_1_3 + 0.0027272727272728*G0_1_1_3_1_4 - 0.00428571428571448*G0_1_1_3_1_5 - 0.00185064935064941*G0_1_1_3_2_0 + 0.00146103896103901*G0_1_1_3_2_1 + 0.0151948051948057*G0_1_1_3_2_2 + 0.0397402597402611*G0_1_1_3_2_3 + 0.00623376623376645*G0_1_1_3_2_4 + 0.00350649350649363*G0_1_1_3_2_5 + 0.00194805194805201*G0_1_1_3_3_0 - 0.0436363636363652*G0_1_1_3_3_1 + 0.0397402597402611*G0_1_1_3_3_2 + 0.0607792207792231*G0_1_1_3_3_3 - 0.0093506493506496*G0_1_1_3_3_4 - 0.0109090909090913*G0_1_1_3_3_5 + 0.00389610389610401*G0_1_1_3_4_0 + 0.0027272727272728*G0_1_1_3_4_1 + 0.00623376623376645*G0_1_1_3_4_2 - 0.0093506493506496*G0_1_1_3_4_3 - 0.0296103896103905*G0_1_1_3_4_4 - 0.0124675324675328*G0_1_1_3_4_5 + 0.000194805194805197*G0_1_1_3_5_0 - 0.00428571428571449*G0_1_1_3_5_1 + 0.00350649350649363*G0_1_1_3_5_2 - 0.0109090909090913*G0_1_1_3_5_3 - 0.0124675324675328*G0_1_1_3_5_4 + 0.00467532467532485*G0_1_1_3_5_5 - 0.00413961038961055*G0_1_1_4_0_0 - 0.000681818181818199*G0_1_1_4_0_1 + 0.000487012987013005*G0_1_1_4_0_2 + 0.00389610389610401*G0_1_1_4_0_3 + 0.0062337662337664*G0_1_1_4_0_4 - 0.00097402597402602*G0_1_1_4_0_5 - 0.000681818181818199*G0_1_1_4_1_0 - 0.00326298701298711*G0_1_1_4_1_1 - 0.00126623376623381*G0_1_1_4_1_2 + 0.0027272727272728*G0_1_1_4_1_3 + 0.0109090909090912*G0_1_1_4_1_4 + 0.00603896103896123*G0_1_1_4_1_5 + 0.000487012987013005*G0_1_1_4_2_0 - 0.00126623376623381*G0_1_1_4_2_1 + 0.00233766233766243*G0_1_1_4_2_2 + 0.00623376623376644*G0_1_1_4_2_3 + 0.00272727272727282*G0_1_1_4_2_4 + 0.00233766233766241*G0_1_1_4_2_5 + 0.00389610389610401*G0_1_1_4_3_0 + 0.0027272727272728*G0_1_1_4_3_1 + 0.00623376623376645*G0_1_1_4_3_2 - 0.0093506493506496*G0_1_1_4_3_3 - 0.0296103896103905*G0_1_1_4_3_4 - 0.0124675324675328*G0_1_1_4_3_5 + 0.00623376623376641*G0_1_1_4_4_0 + 0.0109090909090912*G0_1_1_4_4_1 + 0.00272727272727282*G0_1_1_4_4_2 - 0.0296103896103905*G0_1_1_4_4_3 - 0.0794805194805219*G0_1_1_4_4_4 - 0.0264935064935073*G0_1_1_4_4_5 - 0.00097402597402602*G0_1_1_4_5_0 + 0.00603896103896123*G0_1_1_4_5_1 + 0.00233766233766241*G0_1_1_4_5_2 - 0.0124675324675328*G0_1_1_4_5_3 - 0.0264935064935073*G0_1_1_4_5_4 - 0.00701298701298722*G0_1_1_4_5_5 - 0.00730519480519509*G0_1_1_5_0_0 + 0.000779220779220817*G0_1_1_5_0_1 + 0.00116883116883121*G0_1_1_5_0_2 + 0.000194805194805197*G0_1_1_5_0_3 - 0.00097402597402602*G0_1_1_5_0_4 - 0.0227922077922086*G0_1_1_5_0_5 + 0.000779220779220817*G0_1_1_5_1_0 - 0.018311688311689*G0_1_1_5_1_1 + 0.000243506493506512*G0_1_1_5_1_2 - 0.00428571428571448*G0_1_1_5_1_3 + 0.00603896103896123*G0_1_1_5_1_4 + 0.0171428571428577*G0_1_1_5_1_5 + 0.00116883116883121*G0_1_1_5_2_0 + 0.000243506493506512*G0_1_1_5_2_1 + 0.00350649350649363*G0_1_1_5_2_3 + 0.00233766233766241*G0_1_1_5_2_4 - 0.00253246753246763*G0_1_1_5_2_5 + 0.000194805194805197*G0_1_1_5_3_0 - 0.00428571428571448*G0_1_1_5_3_1 + 0.00350649350649363*G0_1_1_5_3_2 - 0.0109090909090913*G0_1_1_5_3_3 - 0.0124675324675328*G0_1_1_5_3_4 + 0.00467532467532486*G0_1_1_5_3_5 - 0.00097402597402602*G0_1_1_5_4_0 + 0.00603896103896123*G0_1_1_5_4_1 + 0.00233766233766241*G0_1_1_5_4_2 - 0.0124675324675328*G0_1_1_5_4_3 - 0.0264935064935073*G0_1_1_5_4_4 - 0.00701298701298722*G0_1_1_5_4_5 - 0.0227922077922086*G0_1_1_5_5_0 + 0.0171428571428577*G0_1_1_5_5_1 - 0.00253246753246763*G0_1_1_5_5_2 + 0.00467532467532485*G0_1_1_5_5_3 - 0.00701298701298722*G0_1_1_5_5_4 + 0.0748051948051975*G0_1_1_5_5_5; + A[75] = -A[73] - 0.0493100649350667*G0_0_0_0_0_0 + 0.00328733766233778*G0_0_0_0_0_1 + 0.00759740259740286*G0_0_0_0_0_2 - 0.00175324675324681*G0_0_0_0_0_3 - 0.0350649350649363*G0_0_0_0_0_4 - 0.0131493506493511*G0_0_0_0_0_5 + 0.00328733766233778*G0_0_0_0_1_0 - 0.00175324675324681*G0_0_0_0_1_1 - 0.000292207792207803*G0_0_0_0_1_2 - 0.000876623376623407*G0_0_0_0_1_3 + 0.00350649350649363*G0_0_0_0_1_4 + 0.00175324675324681*G0_0_0_0_1_5 + 0.00759740259740286*G0_0_0_0_2_0 - 0.000292207792207803*G0_0_0_0_2_1 - 0.00226461038961046*G0_0_0_0_2_2 + 0.000292207792207803*G0_0_0_0_2_3 + 0.00818181818181846*G0_0_0_0_2_4 + 0.00175324675324682*G0_0_0_0_2_5 - 0.00175324675324681*G0_0_0_0_3_0 - 0.000876623376623407*G0_0_0_0_3_1 + 0.000292207792207803*G0_0_0_0_3_2 - 0.00701298701298722*G0_0_0_0_3_3 - 0.00350649350649362*G0_0_0_0_3_4 - 0.0350649350649363*G0_0_0_0_4_0 + 0.00350649350649363*G0_0_0_0_4_1 + 0.00818181818181846*G0_0_0_0_4_2 - 0.00350649350649362*G0_0_0_0_4_3 - 0.0525974025974044*G0_0_0_0_4_4 - 0.0105194805194809*G0_0_0_0_4_5 - 0.0131493506493511*G0_0_0_0_5_0 + 0.00175324675324681*G0_0_0_0_5_1 + 0.00175324675324682*G0_0_0_0_5_2 - 0.0105194805194809*G0_0_0_0_5_4 - 0.00233766233766243*G0_0_0_0_5_5 + 0.00328733766233778*G0_0_0_1_0_0 - 0.00175324675324681*G0_0_0_1_0_1 - 0.000292207792207803*G0_0_0_1_0_2 - 0.000876623376623407*G0_0_0_1_0_3 + 0.00350649350649363*G0_0_0_1_0_4 + 0.00175324675324681*G0_0_0_1_0_5 - 0.00175324675324681*G0_0_0_1_1_0 + 0.024983766233767*G0_0_0_1_1_1 - 0.00379870129870143*G0_0_0_1_1_2 + 0.0219155844155852*G0_0_0_1_1_3 + 0.000876623376623406*G0_0_0_1_1_4 + 0.00438311688311705*G0_0_0_1_1_5 - 0.000292207792207803*G0_0_0_1_2_0 - 0.00379870129870143*G0_0_0_1_2_1 + 0.000365259740259755*G0_0_0_1_2_2 - 0.00759740259740286*G0_0_0_1_2_3 - 0.00146103896103901*G0_0_0_1_2_4 - 0.000876623376623411*G0_0_0_1_2_5 - 0.000876623376623407*G0_0_0_1_3_0 + 0.0219155844155852*G0_0_0_1_3_1 - 0.00759740259740286*G0_0_0_1_3_2 + 0.028051948051949*G0_0_0_1_3_3 + 0.00350649350649365*G0_0_0_1_3_5 + 0.00350649350649363*G0_0_0_1_4_0 + 0.000876623376623406*G0_0_0_1_4_1 - 0.00146103896103901*G0_0_0_1_4_2 + 0.00350649350649363*G0_0_0_1_4_4 + 0.00175324675324681*G0_0_0_1_5_0 + 0.00438311688311705*G0_0_0_1_5_1 - 0.000876623376623411*G0_0_0_1_5_2 + 0.00350649350649365*G0_0_0_1_5_3 - 0.00233766233766241*G0_0_0_1_5_5 + 0.00759740259740286*G0_0_0_2_0_0 - 0.000292207792207803*G0_0_0_2_0_1 - 0.00226461038961046*G0_0_0_2_0_2 + 0.000292207792207803*G0_0_0_2_0_3 + 0.00818181818181846*G0_0_0_2_0_4 + 0.00175324675324682*G0_0_0_2_0_5 - 0.000292207792207803*G0_0_0_2_1_0 - 0.00379870129870143*G0_0_0_2_1_1 + 0.000365259740259755*G0_0_0_2_1_2 - 0.00759740259740286*G0_0_0_2_1_3 - 0.00146103896103901*G0_0_0_2_1_4 - 0.000876623376623411*G0_0_0_2_1_5 - 0.00226461038961046*G0_0_0_2_2_0 + 0.000365259740259755*G0_0_0_2_2_1 + 0.00438311688311703*G0_0_0_2_2_2 + 0.00642857142857165*G0_0_0_2_2_3 - 0.000584415584415606*G0_0_0_2_2_4 - 0.000292207792207799*G0_0_0_2_2_5 + 0.000292207792207803*G0_0_0_2_3_0 - 0.00759740259740286*G0_0_0_2_3_1 + 0.00642857142857165*G0_0_0_2_3_2 - 0.00467532467532485*G0_0_0_2_3_3 + 0.00233766233766241*G0_0_0_2_3_4 + 0.00818181818181846*G0_0_0_2_4_0 - 0.00146103896103901*G0_0_0_2_4_1 - 0.000584415584415606*G0_0_0_2_4_2 + 0.00233766233766241*G0_0_0_2_4_3 + 0.0233766233766242*G0_0_0_2_4_4 + 0.00350649350649362*G0_0_0_2_4_5 + 0.00175324675324682*G0_0_0_2_5_0 - 0.000876623376623411*G0_0_0_2_5_1 - 0.000292207792207799*G0_0_0_2_5_2 + 0.00350649350649362*G0_0_0_2_5_4 + 0.00233766233766241*G0_0_0_2_5_5 - 0.00175324675324681*G0_0_0_3_0_0 - 0.000876623376623407*G0_0_0_3_0_1 + 0.000292207792207803*G0_0_0_3_0_2 - 0.00701298701298722*G0_0_0_3_0_3 - 0.00350649350649362*G0_0_0_3_0_4 - 0.000876623376623407*G0_0_0_3_1_0 + 0.0219155844155852*G0_0_0_3_1_1 - 0.00759740259740286*G0_0_0_3_1_2 + 0.028051948051949*G0_0_0_3_1_3 + 0.00350649350649365*G0_0_0_3_1_5 + 0.000292207792207803*G0_0_0_3_2_0 - 0.00759740259740286*G0_0_0_3_2_1 + 0.00642857142857165*G0_0_0_3_2_2 - 0.00467532467532485*G0_0_0_3_2_3 + 0.00233766233766241*G0_0_0_3_2_4 - 0.00701298701298722*G0_0_0_3_3_0 + 0.028051948051949*G0_0_0_3_3_1 - 0.00467532467532485*G0_0_0_3_3_2 + 0.238441558441567*G0_0_0_3_3_3 + 0.0140259740259745*G0_0_0_3_3_4 + 0.0140259740259746*G0_0_0_3_3_5 - 0.00350649350649362*G0_0_0_3_4_0 + 0.00233766233766241*G0_0_0_3_4_2 + 0.0140259740259745*G0_0_0_3_4_3 + 0.00350649350649365*G0_0_0_3_5_1 + 0.0140259740259746*G0_0_0_3_5_3 - 0.0046753246753248*G0_0_0_3_5_5 - 0.0350649350649363*G0_0_0_4_0_0 + 0.00350649350649363*G0_0_0_4_0_1 + 0.00818181818181846*G0_0_0_4_0_2 - 0.00350649350649362*G0_0_0_4_0_3 - 0.0525974025974044*G0_0_0_4_0_4 - 0.0105194805194809*G0_0_0_4_0_5 + 0.00350649350649363*G0_0_0_4_1_0 + 0.000876623376623407*G0_0_0_4_1_1 - 0.00146103896103901*G0_0_0_4_1_2 + 0.00350649350649363*G0_0_0_4_1_4 + 0.00818181818181846*G0_0_0_4_2_0 - 0.00146103896103901*G0_0_0_4_2_1 - 0.000584415584415606*G0_0_0_4_2_2 + 0.00233766233766241*G0_0_0_4_2_3 + 0.0233766233766242*G0_0_0_4_2_4 + 0.00350649350649362*G0_0_0_4_2_5 - 0.00350649350649362*G0_0_0_4_3_0 + 0.00233766233766241*G0_0_0_4_3_2 + 0.0140259740259745*G0_0_0_4_3_3 - 0.0525974025974044*G0_0_0_4_4_0 + 0.00350649350649363*G0_0_0_4_4_1 + 0.0233766233766242*G0_0_0_4_4_2 - 0.140259740259745*G0_0_0_4_4_4 - 0.0140259740259745*G0_0_0_4_4_5 - 0.0105194805194809*G0_0_0_4_5_0 + 0.00350649350649362*G0_0_0_4_5_2 - 0.0140259740259745*G0_0_0_4_5_4 - 0.00467532467532482*G0_0_0_4_5_5 - 0.0131493506493511*G0_0_0_5_0_0 + 0.00175324675324681*G0_0_0_5_0_1 + 0.00175324675324682*G0_0_0_5_0_2 - 0.0105194805194809*G0_0_0_5_0_4 - 0.00233766233766243*G0_0_0_5_0_5 + 0.00175324675324681*G0_0_0_5_1_0 + 0.00438311688311705*G0_0_0_5_1_1 - 0.000876623376623411*G0_0_0_5_1_2 + 0.00350649350649365*G0_0_0_5_1_3 - 0.00233766233766241*G0_0_0_5_1_5 + 0.00175324675324682*G0_0_0_5_2_0 - 0.000876623376623411*G0_0_0_5_2_1 - 0.000292207792207799*G0_0_0_5_2_2 + 0.00350649350649362*G0_0_0_5_2_4 + 0.00233766233766241*G0_0_0_5_2_5 + 0.00350649350649365*G0_0_0_5_3_1 + 0.0140259740259746*G0_0_0_5_3_3 - 0.0046753246753248*G0_0_0_5_3_5 - 0.0105194805194809*G0_0_0_5_4_0 + 0.00350649350649362*G0_0_0_5_4_2 - 0.0140259740259745*G0_0_0_5_4_4 - 0.00467532467532482*G0_0_0_5_4_5 - 0.00233766233766243*G0_0_0_5_5_0 - 0.00233766233766241*G0_0_0_5_5_1 + 0.00233766233766241*G0_0_0_5_5_2 - 0.0046753246753248*G0_0_0_5_5_3 - 0.00467532467532482*G0_0_0_5_5_4 - 0.0140259740259744*G0_0_0_5_5_5 + 0.204728084415591*G0_0_1_0_0_0 - 0.0112134740259744*G0_0_1_0_0_1 - 0.0110551948051952*G0_0_1_0_0_2 + 0.00297077922077929*G0_0_1_0_0_3 + 0.0469967532467548*G0_0_1_0_0_4 + 0.0448051948051964*G0_0_1_0_0_5 - 0.0112134740259744*G0_0_1_0_1_0 - 0.00325081168831179*G0_0_1_0_1_1 + 0.00105925324675328*G0_0_1_0_1_2 - 0.00155844155844161*G0_0_1_0_1_3 - 0.00180194805194811*G0_0_1_0_1_4 - 0.00292207792207803*G0_0_1_0_1_5 - 0.0110551948051952*G0_0_1_0_2_0 + 0.00105925324675328*G0_0_1_0_2_1 + 0.000779220779220806*G0_0_1_0_2_2 + 0.000292207792207803*G0_0_1_0_2_3 - 0.00457792207792223*G0_0_1_0_2_4 - 0.00297077922077932*G0_0_1_0_2_5 + 0.00297077922077929*G0_0_1_0_3_0 - 0.00155844155844161*G0_0_1_0_3_1 + 0.000292207792207803*G0_0_1_0_3_2 - 0.00740259740259762*G0_0_1_0_3_3 - 0.00233766233766241*G0_0_1_0_3_4 + 0.0469967532467548*G0_0_1_0_4_0 - 0.00180194805194811*G0_0_1_0_4_1 - 0.00457792207792223*G0_0_1_0_4_2 - 0.00233766233766241*G0_0_1_0_4_3 + 0.0132467532467537*G0_0_1_0_4_4 + 0.00954545454545488*G0_0_1_0_4_5 + 0.0448051948051964*G0_0_1_0_5_0 - 0.00292207792207803*G0_0_1_0_5_1 - 0.00297077922077932*G0_0_1_0_5_2 + 0.00954545454545487*G0_0_1_0_5_4 + 0.027077922077923*G0_0_1_0_5_5 - 0.0112134740259744*G0_0_1_1_0_0 - 0.00325081168831179*G0_0_1_1_0_1 + 0.00105925324675328*G0_0_1_1_0_2 - 0.00155844155844161*G0_0_1_1_0_3 - 0.00180194805194811*G0_0_1_1_0_4 - 0.00292207792207803*G0_0_1_1_0_5 - 0.00325081168831179*G0_0_1_1_1_0 + 0.113267045454549*G0_0_1_1_1_1 - 0.00910714285714317*G0_0_1_1_1_2 + 0.0431493506493521*G0_0_1_1_1_3 + 0.00272727272727281*G0_0_1_1_1_4 + 0.0155357142857149*G0_0_1_1_1_5 + 0.00105925324675328*G0_0_1_1_2_0 - 0.00910714285714317*G0_0_1_1_2_1 + 0.000754870129870157*G0_0_1_1_2_2 - 0.00827922077922107*G0_0_1_1_2_3 + 0.000292207792207801*G0_0_1_1_2_4 - 0.000389610389610413*G0_0_1_1_2_5 - 0.00155844155844161*G0_0_1_1_3_0 + 0.0431493506493521*G0_0_1_1_3_1 - 0.00827922077922107*G0_0_1_1_3_2 + 0.0358441558441571*G0_0_1_1_3_3 - 0.00233766233766241*G0_0_1_1_3_4 + 0.00389610389610408*G0_0_1_1_3_5 - 0.00180194805194811*G0_0_1_1_4_0 + 0.00272727272727281*G0_0_1_1_4_1 + 0.000292207792207801*G0_0_1_1_4_2 - 0.00233766233766241*G0_0_1_1_4_3 - 0.00545454545454563*G0_0_1_1_4_4 - 0.00467532467532482*G0_0_1_1_4_5 - 0.00292207792207803*G0_0_1_1_5_0 + 0.0155357142857149*G0_0_1_1_5_1 - 0.000389610389610413*G0_0_1_1_5_2 + 0.00389610389610407*G0_0_1_1_5_3 - 0.00467532467532482*G0_0_1_1_5_4 - 0.0130519480519485*G0_0_1_1_5_5 - 0.0110551948051952*G0_0_1_2_0_0 + 0.00105925324675328*G0_0_1_2_0_1 + 0.000779220779220806*G0_0_1_2_0_2 + 0.000292207792207803*G0_0_1_2_0_3 - 0.00457792207792223*G0_0_1_2_0_4 - 0.00297077922077932*G0_0_1_2_0_5 + 0.00105925324675328*G0_0_1_2_1_0 - 0.00910714285714317*G0_0_1_2_1_1 + 0.000754870129870157*G0_0_1_2_1_2 - 0.00827922077922107*G0_0_1_2_1_3 + 0.000292207792207801*G0_0_1_2_1_4 - 0.000389610389610414*G0_0_1_2_1_5 + 0.000779220779220806*G0_0_1_2_2_0 + 0.000754870129870157*G0_0_1_2_2_1 + 0.00153409090909097*G0_0_1_2_2_2 + 0.00555194805194824*G0_0_1_2_2_3 + 0.00175324675324681*G0_0_1_2_2_4 + 0.000876623376623407*G0_0_1_2_2_5 + 0.000292207792207803*G0_0_1_2_3_0 - 0.00827922077922107*G0_0_1_2_3_1 + 0.00555194805194824*G0_0_1_2_3_2 - 0.0101298701298705*G0_0_1_2_3_3 - 0.00116883116883121*G0_0_1_2_3_4 - 0.00233766233766242*G0_0_1_2_3_5 - 0.00457792207792223*G0_0_1_2_4_0 + 0.000292207792207801*G0_0_1_2_4_1 + 0.00175324675324681*G0_0_1_2_4_2 - 0.0011688311688312*G0_0_1_2_4_3 - 0.000389610389610402*G0_0_1_2_4_4 - 0.00233766233766241*G0_0_1_2_4_5 - 0.00297077922077932*G0_0_1_2_5_0 - 0.000389610389610413*G0_0_1_2_5_1 + 0.000876623376623407*G0_0_1_2_5_2 - 0.00233766233766242*G0_0_1_2_5_3 - 0.00233766233766241*G0_0_1_2_5_4 + 0.00233766233766242*G0_0_1_2_5_5 + 0.00297077922077929*G0_0_1_3_0_0 - 0.00155844155844161*G0_0_1_3_0_1 + 0.000292207792207803*G0_0_1_3_0_2 - 0.00740259740259762*G0_0_1_3_0_3 - 0.00233766233766241*G0_0_1_3_0_4 - 0.00155844155844161*G0_0_1_3_1_0 + 0.0431493506493521*G0_0_1_3_1_1 - 0.00827922077922107*G0_0_1_3_1_2 + 0.0358441558441571*G0_0_1_3_1_3 - 0.00233766233766241*G0_0_1_3_1_4 + 0.00389610389610407*G0_0_1_3_1_5 + 0.000292207792207803*G0_0_1_3_2_0 - 0.00827922077922107*G0_0_1_3_2_1 + 0.00555194805194824*G0_0_1_3_2_2 - 0.0101298701298705*G0_0_1_3_2_3 - 0.00116883116883121*G0_0_1_3_2_4 - 0.00233766233766242*G0_0_1_3_2_5 - 0.00740259740259762*G0_0_1_3_3_0 + 0.0358441558441571*G0_0_1_3_3_1 - 0.0101298701298705*G0_0_1_3_3_2 + 0.161298701298707*G0_0_1_3_3_3 + 0.0194805194805201*G0_0_1_3_3_4 + 0.0194805194805202*G0_0_1_3_3_5 - 0.00233766233766241*G0_0_1_3_4_0 - 0.00233766233766241*G0_0_1_3_4_1 - 0.00116883116883121*G0_0_1_3_4_2 + 0.0194805194805201*G0_0_1_3_4_3 + 0.0155844155844161*G0_0_1_3_4_4 + 0.00935064935064965*G0_0_1_3_4_5 + 0.00389610389610407*G0_0_1_3_5_1 - 0.00233766233766242*G0_0_1_3_5_2 + 0.0194805194805202*G0_0_1_3_5_3 + 0.00935064935064965*G0_0_1_3_5_4 - 0.00467532467532485*G0_0_1_3_5_5 + 0.0469967532467548*G0_0_1_4_0_0 - 0.00180194805194811*G0_0_1_4_0_1 - 0.00457792207792223*G0_0_1_4_0_2 - 0.00233766233766241*G0_0_1_4_0_3 + 0.0132467532467537*G0_0_1_4_0_4 + 0.00954545454545488*G0_0_1_4_0_5 - 0.00180194805194811*G0_0_1_4_1_0 + 0.00272727272727281*G0_0_1_4_1_1 + 0.000292207792207801*G0_0_1_4_1_2 - 0.00233766233766241*G0_0_1_4_1_3 - 0.00545454545454563*G0_0_1_4_1_4 - 0.00467532467532482*G0_0_1_4_1_5 - 0.00457792207792223*G0_0_1_4_2_0 + 0.000292207792207801*G0_0_1_4_2_1 + 0.00175324675324681*G0_0_1_4_2_2 - 0.00116883116883121*G0_0_1_4_2_3 - 0.000389610389610403*G0_0_1_4_2_4 - 0.00233766233766241*G0_0_1_4_2_5 - 0.00233766233766241*G0_0_1_4_3_0 - 0.00233766233766241*G0_0_1_4_3_1 - 0.00116883116883121*G0_0_1_4_3_2 + 0.0194805194805201*G0_0_1_4_3_3 + 0.0155844155844161*G0_0_1_4_3_4 + 0.00935064935064965*G0_0_1_4_3_5 + 0.0132467532467537*G0_0_1_4_4_0 - 0.00545454545454563*G0_0_1_4_4_1 - 0.000389610389610403*G0_0_1_4_4_2 + 0.0155844155844161*G0_0_1_4_4_3 + 0.0155844155844161*G0_0_1_4_4_5 + 0.00954545454545488*G0_0_1_4_5_0 - 0.00467532467532482*G0_0_1_4_5_1 - 0.00233766233766241*G0_0_1_4_5_2 + 0.00935064935064965*G0_0_1_4_5_3 + 0.0155844155844161*G0_0_1_4_5_4 + 0.0046753246753248*G0_0_1_4_5_5 + 0.0448051948051964*G0_0_1_5_0_0 - 0.00292207792207803*G0_0_1_5_0_1 - 0.00297077922077932*G0_0_1_5_0_2 + 0.00954545454545487*G0_0_1_5_0_4 + 0.027077922077923*G0_0_1_5_0_5 - 0.00292207792207803*G0_0_1_5_1_0 + 0.0155357142857149*G0_0_1_5_1_1 - 0.000389610389610413*G0_0_1_5_1_2 + 0.00389610389610408*G0_0_1_5_1_3 - 0.00467532467532482*G0_0_1_5_1_4 - 0.0130519480519485*G0_0_1_5_1_5 - 0.00297077922077932*G0_0_1_5_2_0 - 0.000389610389610413*G0_0_1_5_2_1 + 0.000876623376623407*G0_0_1_5_2_2 - 0.00233766233766242*G0_0_1_5_2_3 - 0.00233766233766241*G0_0_1_5_2_4 + 0.00233766233766242*G0_0_1_5_2_5 + 0.00389610389610408*G0_0_1_5_3_1 - 0.00233766233766242*G0_0_1_5_3_2 + 0.0194805194805202*G0_0_1_5_3_3 + 0.00935064935064965*G0_0_1_5_3_4 - 0.00467532467532485*G0_0_1_5_3_5 + 0.00954545454545488*G0_0_1_5_4_0 - 0.00467532467532482*G0_0_1_5_4_1 - 0.00233766233766241*G0_0_1_5_4_2 + 0.00935064935064965*G0_0_1_5_4_3 + 0.0155844155844161*G0_0_1_5_4_4 + 0.0046753246753248*G0_0_1_5_4_5 + 0.027077922077923*G0_0_1_5_5_0 - 0.0130519480519485*G0_0_1_5_5_1 + 0.00233766233766242*G0_0_1_5_5_2 - 0.00467532467532485*G0_0_1_5_5_3 + 0.0046753246753248*G0_0_1_5_5_4 - 0.119220779220784*G0_0_1_5_5_5 + 0.00986201298701335*G0_1_0_0_0_0 - 0.00175324675324682*G0_1_0_0_0_1 - 0.00182629870129877*G0_1_0_0_0_2 + 0.00175324675324681*G0_1_0_0_0_3 + 0.00876623376623407*G0_1_0_0_0_4 + 0.00730519480519508*G0_1_0_0_0_5 - 0.00175324675324682*G0_1_0_0_1_0 - 0.00109577922077925*G0_1_0_0_1_1 + 0.000949675324675357*G0_1_0_0_1_2 - 0.00175324675324682*G0_1_0_0_1_3 - 0.00175324675324682*G0_1_0_0_1_4 - 0.00262987012987023*G0_1_0_0_1_5 - 0.00182629870129877*G0_1_0_0_2_0 + 0.000949675324675357*G0_1_0_0_2_1 + 0.000292207792207807*G0_1_0_0_2_2 - 0.000292207792207799*G0_1_0_0_2_3 - 0.00321428571428582*G0_1_0_0_2_4 - 0.00233766233766242*G0_1_0_0_2_5 + 0.00175324675324681*G0_1_0_0_3_0 - 0.00175324675324682*G0_1_0_0_3_1 - 0.000292207792207799*G0_1_0_0_3_2 - 0.0105194805194808*G0_1_0_0_3_3 + 0.00116883116883121*G0_1_0_0_3_5 + 0.00876623376623407*G0_1_0_0_4_0 - 0.00175324675324682*G0_1_0_0_4_1 - 0.00321428571428582*G0_1_0_0_4_2 + 0.0105194805194809*G0_1_0_0_4_4 + 0.00818181818181847*G0_1_0_0_4_5 + 0.00730519480519508*G0_1_0_0_5_0 - 0.00262987012987023*G0_1_0_0_5_1 - 0.00233766233766242*G0_1_0_0_5_2 + 0.00116883116883121*G0_1_0_0_5_3 + 0.00818181818181847*G0_1_0_0_5_4 + 0.0140259740259745*G0_1_0_0_5_5 - 0.00175324675324682*G0_1_0_1_0_0 - 0.00109577922077925*G0_1_0_1_0_1 + 0.000949675324675357*G0_1_0_1_0_2 - 0.00175324675324682*G0_1_0_1_0_3 - 0.00175324675324682*G0_1_0_1_0_4 - 0.00262987012987023*G0_1_0_1_0_5 - 0.00109577922077925*G0_1_0_1_1_0 + 0.0262987012987021*G0_1_0_1_1_1 - 0.00460227272727289*G0_1_0_1_1_2 + 0.0245454545454554*G0_1_0_1_1_3 + 0.00350649350649363*G0_1_0_1_1_4 + 0.00759740259740288*G0_1_0_1_1_5 + 0.000949675324675357*G0_1_0_1_2_0 - 0.00460227272727289*G0_1_0_1_2_1 - 0.000146103896103897*G0_1_0_1_2_2 - 0.00788961038961066*G0_1_0_1_2_3 + 0.00146103896103901*G0_1_0_1_2_4 + 0.0005844155844156*G0_1_0_1_2_5 - 0.00175324675324682*G0_1_0_1_3_0 + 0.0245454545454554*G0_1_0_1_3_1 - 0.00788961038961066*G0_1_0_1_3_2 + 0.0280519480519491*G0_1_0_1_3_3 - 0.00350649350649362*G0_1_0_1_3_4 + 0.00233766233766244*G0_1_0_1_3_5 - 0.00175324675324682*G0_1_0_1_4_0 + 0.00350649350649363*G0_1_0_1_4_1 + 0.00146103896103901*G0_1_0_1_4_2 - 0.00350649350649362*G0_1_0_1_4_3 - 0.0140259740259745*G0_1_0_1_4_4 - 0.00818181818181846*G0_1_0_1_4_5 - 0.00262987012987023*G0_1_0_1_5_0 + 0.00759740259740288*G0_1_0_1_5_1 + 0.0005844155844156*G0_1_0_1_5_2 + 0.00233766233766244*G0_1_0_1_5_3 - 0.00818181818181846*G0_1_0_1_5_4 - 0.00935064935064968*G0_1_0_1_5_5 - 0.00182629870129877*G0_1_0_2_0_0 + 0.000949675324675357*G0_1_0_2_0_1 + 0.000292207792207807*G0_1_0_2_0_2 - 0.000292207792207799*G0_1_0_2_0_3 - 0.00321428571428582*G0_1_0_2_0_4 - 0.00233766233766242*G0_1_0_2_0_5 + 0.000949675324675357*G0_1_0_2_1_0 - 0.00460227272727289*G0_1_0_2_1_1 - 0.000146103896103897*G0_1_0_2_1_2 - 0.00788961038961066*G0_1_0_2_1_3 + 0.00146103896103901*G0_1_0_2_1_4 + 0.0005844155844156*G0_1_0_2_1_5 + 0.000292207792207807*G0_1_0_2_2_0 - 0.000146103896103897*G0_1_0_2_2_1 + 0.0021915584415585*G0_1_0_2_2_2 + 0.00818181818181845*G0_1_0_2_2_3 + 0.00350649350649361*G0_1_0_2_2_4 + 0.00204545454545462*G0_1_0_2_2_5 - 0.000292207792207799*G0_1_0_2_3_0 - 0.00788961038961066*G0_1_0_2_3_1 + 0.00818181818181845*G0_1_0_2_3_2 - 0.0070129870129873*G0_1_0_2_3_3 - 0.00233766233766243*G0_1_0_2_3_4 - 0.00350649350649364*G0_1_0_2_3_5 - 0.00321428571428582*G0_1_0_2_4_0 + 0.00146103896103901*G0_1_0_2_4_1 + 0.00350649350649361*G0_1_0_2_4_2 - 0.00233766233766243*G0_1_0_2_4_3 - 0.0116883116883121*G0_1_0_2_4_4 - 0.00701298701298726*G0_1_0_2_4_5 - 0.00233766233766242*G0_1_0_2_5_0 + 0.0005844155844156*G0_1_0_2_5_1 + 0.00204545454545462*G0_1_0_2_5_2 - 0.00350649350649364*G0_1_0_2_5_3 - 0.00701298701298726*G0_1_0_2_5_4 - 0.00584415584415606*G0_1_0_2_5_5 + 0.00175324675324681*G0_1_0_3_0_0 - 0.00175324675324682*G0_1_0_3_0_1 - 0.000292207792207799*G0_1_0_3_0_2 - 0.0105194805194808*G0_1_0_3_0_3 + 0.00116883116883121*G0_1_0_3_0_5 - 0.00175324675324682*G0_1_0_3_1_0 + 0.0245454545454554*G0_1_0_3_1_1 - 0.00788961038961066*G0_1_0_3_1_2 + 0.0280519480519491*G0_1_0_3_1_3 - 0.00350649350649362*G0_1_0_3_1_4 + 0.00233766233766244*G0_1_0_3_1_5 - 0.000292207792207799*G0_1_0_3_2_0 - 0.00788961038961066*G0_1_0_3_2_1 + 0.00818181818181845*G0_1_0_3_2_2 - 0.0070129870129873*G0_1_0_3_2_3 - 0.00233766233766242*G0_1_0_3_2_4 - 0.00350649350649364*G0_1_0_3_2_5 - 0.0105194805194808*G0_1_0_3_3_0 + 0.0280519480519491*G0_1_0_3_3_1 - 0.0070129870129873*G0_1_0_3_3_2 + 0.28051948051949*G0_1_0_3_3_3 + 0.028051948051949*G0_1_0_3_3_4 + 0.0280519480519491*G0_1_0_3_3_5 - 0.00350649350649362*G0_1_0_3_4_1 - 0.00233766233766242*G0_1_0_3_4_2 + 0.028051948051949*G0_1_0_3_4_3 + 0.028051948051949*G0_1_0_3_4_4 + 0.0140259740259745*G0_1_0_3_4_5 + 0.00116883116883121*G0_1_0_3_5_0 + 0.00233766233766244*G0_1_0_3_5_1 - 0.00350649350649364*G0_1_0_3_5_2 + 0.0280519480519491*G0_1_0_3_5_3 + 0.0140259740259745*G0_1_0_3_5_4 + 0.00935064935064971*G0_1_0_3_5_5 + 0.00876623376623407*G0_1_0_4_0_0 - 0.00175324675324682*G0_1_0_4_0_1 - 0.00321428571428582*G0_1_0_4_0_2 + 0.0105194805194809*G0_1_0_4_0_4 + 0.00818181818181847*G0_1_0_4_0_5 - 0.00175324675324682*G0_1_0_4_1_0 + 0.00350649350649363*G0_1_0_4_1_1 + 0.00146103896103901*G0_1_0_4_1_2 - 0.00350649350649362*G0_1_0_4_1_3 - 0.0140259740259745*G0_1_0_4_1_4 - 0.00818181818181846*G0_1_0_4_1_5 - 0.00321428571428582*G0_1_0_4_2_0 + 0.00146103896103901*G0_1_0_4_2_1 + 0.00350649350649361*G0_1_0_4_2_2 - 0.00233766233766242*G0_1_0_4_2_3 - 0.0116883116883121*G0_1_0_4_2_4 - 0.00701298701298726*G0_1_0_4_2_5 - 0.00350649350649362*G0_1_0_4_3_1 - 0.00233766233766243*G0_1_0_4_3_2 + 0.028051948051949*G0_1_0_4_3_3 + 0.028051948051949*G0_1_0_4_3_4 + 0.0140259740259745*G0_1_0_4_3_5 + 0.0105194805194809*G0_1_0_4_4_0 - 0.0140259740259745*G0_1_0_4_4_1 - 0.0116883116883121*G0_1_0_4_4_2 + 0.028051948051949*G0_1_0_4_4_3 + 0.112207792207796*G0_1_0_4_4_4 + 0.0420779220779235*G0_1_0_4_4_5 + 0.00818181818181847*G0_1_0_4_5_0 - 0.00818181818181846*G0_1_0_4_5_1 - 0.00701298701298726*G0_1_0_4_5_2 + 0.0140259740259745*G0_1_0_4_5_3 + 0.0420779220779235*G0_1_0_4_5_4 + 0.028051948051949*G0_1_0_4_5_5 + 0.00730519480519508*G0_1_0_5_0_0 - 0.00262987012987023*G0_1_0_5_0_1 - 0.00233766233766242*G0_1_0_5_0_2 + 0.00116883116883121*G0_1_0_5_0_3 + 0.00818181818181847*G0_1_0_5_0_4 + 0.0140259740259745*G0_1_0_5_0_5 - 0.00262987012987023*G0_1_0_5_1_0 + 0.00759740259740288*G0_1_0_5_1_1 + 0.0005844155844156*G0_1_0_5_1_2 + 0.00233766233766244*G0_1_0_5_1_3 - 0.00818181818181846*G0_1_0_5_1_4 - 0.00935064935064968*G0_1_0_5_1_5 - 0.00233766233766242*G0_1_0_5_2_0 + 0.0005844155844156*G0_1_0_5_2_1 + 0.00204545454545462*G0_1_0_5_2_2 - 0.00350649350649364*G0_1_0_5_2_3 - 0.00701298701298726*G0_1_0_5_2_4 - 0.00584415584415606*G0_1_0_5_2_5 + 0.00116883116883121*G0_1_0_5_3_0 + 0.00233766233766244*G0_1_0_5_3_1 - 0.00350649350649364*G0_1_0_5_3_2 + 0.0280519480519491*G0_1_0_5_3_3 + 0.0140259740259745*G0_1_0_5_3_4 + 0.00935064935064972*G0_1_0_5_3_5 + 0.00818181818181847*G0_1_0_5_4_0 - 0.00818181818181846*G0_1_0_5_4_1 - 0.00701298701298727*G0_1_0_5_4_2 + 0.0140259740259745*G0_1_0_5_4_3 + 0.0420779220779235*G0_1_0_5_4_4 + 0.0280519480519491*G0_1_0_5_4_5 + 0.0140259740259745*G0_1_0_5_5_0 - 0.00935064935064968*G0_1_0_5_5_1 - 0.00584415584415606*G0_1_0_5_5_2 + 0.00935064935064972*G0_1_0_5_5_3 + 0.028051948051949*G0_1_0_5_5_4 + 0.0280519480519491*G0_1_0_5_5_5 - 0.0392654220779235*G0_1_1_0_0_0 + 0.0056737012987015*G0_1_1_0_0_1 + 0.00254464285714295*G0_1_1_0_0_2 - 0.000487012987013005*G0_1_1_0_0_3 - 0.00900974025974057*G0_1_1_0_0_4 - 0.0277597402597413*G0_1_1_0_0_5 + 0.0056737012987015*G0_1_1_0_1_0 - 0.00670860389610412*G0_1_1_0_1_1 - 0.00160714285714291*G0_1_1_0_1_3 + 0.00243506493506502*G0_1_1_0_1_4 + 0.00740259740259766*G0_1_1_0_1_5 + 0.00254464285714295*G0_1_1_0_2_0 - 0.000730519480519505*G0_1_1_0_2_2 + 0.000974025974026007*G0_1_1_0_2_3 + 0.00126623376623381*G0_1_1_0_2_4 + 0.00233766233766242*G0_1_1_0_2_5 - 0.000487012987013005*G0_1_1_0_3_0 - 0.00160714285714291*G0_1_1_0_3_1 + 0.000974025974026007*G0_1_1_0_3_2 - 0.00896103896103924*G0_1_1_0_3_3 - 0.00389610389610401*G0_1_1_0_3_4 - 0.00370129870129883*G0_1_1_0_3_5 - 0.00900974025974057*G0_1_1_0_4_0 + 0.00243506493506502*G0_1_1_0_4_1 + 0.00126623376623381*G0_1_1_0_4_2 - 0.00389610389610401*G0_1_1_0_4_3 - 0.00857142857142884*G0_1_1_0_4_4 - 0.00954545454545488*G0_1_1_0_4_5 - 0.0277597402597413*G0_1_1_0_5_0 + 0.00740259740259766*G0_1_1_0_5_1 + 0.00233766233766242*G0_1_1_0_5_2 - 0.00370129870129883*G0_1_1_0_5_3 - 0.00954545454545487*G0_1_1_0_5_4 - 0.029805194805196*G0_1_1_0_5_5 + 0.0056737012987015*G0_1_1_1_0_0 - 0.00670860389610412*G0_1_1_1_0_1 - 0.00160714285714291*G0_1_1_1_0_3 + 0.00243506493506502*G0_1_1_1_0_4 + 0.00740259740259766*G0_1_1_1_0_5 - 0.00670860389610412*G0_1_1_1_1_0 + 0.121996753246757*G0_1_1_1_1_1 - 0.00977678571428605*G0_1_1_1_1_2 + 0.0465584415584432*G0_1_1_1_1_3 + 0.00297077922077931*G0_1_1_1_1_4 + 0.0177272727272734*G0_1_1_1_1_5 - 0.00977678571428605*G0_1_1_1_2_1 + 0.000827922077922109*G0_1_1_1_2_2 - 0.00905844155844187*G0_1_1_1_2_3 + 0.000389610389610401*G0_1_1_1_2_4 - 0.00170454545454553*G0_1_1_1_2_5 - 0.00160714285714291*G0_1_1_1_3_0 + 0.0465584415584432*G0_1_1_1_3_1 - 0.00905844155844187*G0_1_1_1_3_2 + 0.0389610389610403*G0_1_1_1_3_3 - 0.00272727272727281*G0_1_1_1_3_4 + 0.0066233766233769*G0_1_1_1_3_5 + 0.00243506493506502*G0_1_1_1_4_0 + 0.00297077922077931*G0_1_1_1_4_1 + 0.000389610389610401*G0_1_1_1_4_2 - 0.00272727272727281*G0_1_1_1_4_3 - 0.00857142857142884*G0_1_1_1_4_4 - 0.0025324675324676*G0_1_1_1_4_5 + 0.00740259740259766*G0_1_1_1_5_0 + 0.0177272727272734*G0_1_1_1_5_1 - 0.00170454545454553*G0_1_1_1_5_2 + 0.0066233766233769*G0_1_1_1_5_3 - 0.0025324675324676*G0_1_1_1_5_4 + 0.0062337662337665*G0_1_1_1_5_5 + 0.00254464285714295*G0_1_1_2_0_0 - 0.000730519480519505*G0_1_1_2_0_2 + 0.000974025974026007*G0_1_1_2_0_3 + 0.00126623376623381*G0_1_1_2_0_4 + 0.00233766233766242*G0_1_1_2_0_5 - 0.00977678571428605*G0_1_1_2_1_1 + 0.000827922077922109*G0_1_1_2_1_2 - 0.00905844155844187*G0_1_1_2_1_3 + 0.000389610389610401*G0_1_1_2_1_4 - 0.00170454545454553*G0_1_1_2_1_5 - 0.000730519480519505*G0_1_1_2_2_0 + 0.000827922077922109*G0_1_1_2_2_1 + 0.00321428571428585*G0_1_1_2_2_2 + 0.00672077922077945*G0_1_1_2_2_3 + 0.00204545454545461*G0_1_1_2_2_4 + 0.000779220779220805*G0_1_1_2_2_5 + 0.000974025974026007*G0_1_1_2_3_0 - 0.00905844155844187*G0_1_1_2_3_1 + 0.00672077922077945*G0_1_1_2_3_2 - 0.0116883116883121*G0_1_1_2_3_3 - 0.00272727272727282*G0_1_1_2_3_4 - 0.00350649350649363*G0_1_1_2_3_5 + 0.00126623376623381*G0_1_1_2_4_0 + 0.000389610389610401*G0_1_1_2_4_1 + 0.00204545454545461*G0_1_1_2_4_2 - 0.00272727272727282*G0_1_1_2_4_3 - 0.00506493506493524*G0_1_1_2_4_4 - 0.00233766233766241*G0_1_1_2_4_5 + 0.00233766233766242*G0_1_1_2_5_0 - 0.00170454545454553*G0_1_1_2_5_1 + 0.000779220779220805*G0_1_1_2_5_2 - 0.00350649350649363*G0_1_1_2_5_3 - 0.00233766233766241*G0_1_1_2_5_4 + 0.00603896103896127*G0_1_1_2_5_5 - 0.000487012987013005*G0_1_1_3_0_0 - 0.00160714285714291*G0_1_1_3_0_1 + 0.000974025974026007*G0_1_1_3_0_2 - 0.00896103896103924*G0_1_1_3_0_3 - 0.00389610389610401*G0_1_1_3_0_4 - 0.00370129870129883*G0_1_1_3_0_5 - 0.00160714285714291*G0_1_1_3_1_0 + 0.0465584415584431*G0_1_1_3_1_1 - 0.00905844155844187*G0_1_1_3_1_2 + 0.0389610389610403*G0_1_1_3_1_3 - 0.00272727272727281*G0_1_1_3_1_4 + 0.0066233766233769*G0_1_1_3_1_5 + 0.000974025974026007*G0_1_1_3_2_0 - 0.00905844155844187*G0_1_1_3_2_1 + 0.00672077922077945*G0_1_1_3_2_2 - 0.0116883116883121*G0_1_1_3_2_3 - 0.00272727272727282*G0_1_1_3_2_4 - 0.00350649350649363*G0_1_1_3_2_5 - 0.00896103896103924*G0_1_1_3_3_0 + 0.0389610389610403*G0_1_1_3_3_1 - 0.0116883116883121*G0_1_1_3_3_2 + 0.177662337662344*G0_1_1_3_3_3 + 0.0233766233766241*G0_1_1_3_3_4 + 0.0249350649350658*G0_1_1_3_3_5 - 0.00389610389610401*G0_1_1_3_4_0 - 0.00272727272727281*G0_1_1_3_4_1 - 0.00272727272727282*G0_1_1_3_4_2 + 0.0233766233766241*G0_1_1_3_4_3 + 0.0249350649350657*G0_1_1_3_4_4 + 0.0124675324675329*G0_1_1_3_4_5 - 0.00370129870129883*G0_1_1_3_5_0 + 0.0066233766233769*G0_1_1_3_5_1 - 0.00350649350649363*G0_1_1_3_5_2 + 0.0249350649350658*G0_1_1_3_5_3 + 0.0124675324675329*G0_1_1_3_5_4 - 0.00467532467532484*G0_1_1_3_5_5 - 0.00900974025974057*G0_1_1_4_0_0 + 0.00243506493506502*G0_1_1_4_0_1 + 0.00126623376623381*G0_1_1_4_0_2 - 0.00389610389610401*G0_1_1_4_0_3 - 0.00857142857142884*G0_1_1_4_0_4 - 0.00954545454545487*G0_1_1_4_0_5 + 0.00243506493506502*G0_1_1_4_1_0 + 0.00297077922077931*G0_1_1_4_1_1 + 0.000389610389610401*G0_1_1_4_1_2 - 0.00272727272727281*G0_1_1_4_1_3 - 0.00857142857142884*G0_1_1_4_1_4 - 0.0025324675324676*G0_1_1_4_1_5 + 0.00126623376623381*G0_1_1_4_2_0 + 0.000389610389610401*G0_1_1_4_2_1 + 0.00204545454545461*G0_1_1_4_2_2 - 0.00272727272727282*G0_1_1_4_2_3 - 0.00506493506493524*G0_1_1_4_2_4 - 0.00233766233766241*G0_1_1_4_2_5 - 0.00389610389610401*G0_1_1_4_3_0 - 0.00272727272727281*G0_1_1_4_3_1 - 0.00272727272727282*G0_1_1_4_3_2 + 0.0233766233766241*G0_1_1_4_3_3 + 0.0249350649350657*G0_1_1_4_3_4 + 0.0124675324675329*G0_1_1_4_3_5 - 0.00857142857142884*G0_1_1_4_4_0 - 0.00857142857142884*G0_1_1_4_4_1 - 0.00506493506493524*G0_1_1_4_4_2 + 0.0249350649350657*G0_1_1_4_4_3 + 0.0654545454545475*G0_1_1_4_4_4 + 0.0218181818181825*G0_1_1_4_4_5 - 0.00954545454545487*G0_1_1_4_5_0 - 0.0025324675324676*G0_1_1_4_5_1 - 0.00233766233766241*G0_1_1_4_5_2 + 0.0124675324675329*G0_1_1_4_5_3 + 0.0218181818181825*G0_1_1_4_5_4 - 0.00701298701298731*G0_1_1_4_5_5 - 0.0277597402597413*G0_1_1_5_0_0 + 0.00740259740259766*G0_1_1_5_0_1 + 0.00233766233766242*G0_1_1_5_0_2 - 0.00370129870129883*G0_1_1_5_0_3 - 0.00954545454545487*G0_1_1_5_0_4 - 0.029805194805196*G0_1_1_5_0_5 + 0.00740259740259766*G0_1_1_5_1_0 + 0.0177272727272734*G0_1_1_5_1_1 - 0.00170454545454553*G0_1_1_5_1_2 + 0.0066233766233769*G0_1_1_5_1_3 - 0.0025324675324676*G0_1_1_5_1_4 + 0.0062337662337665*G0_1_1_5_1_5 + 0.00233766233766242*G0_1_1_5_2_0 - 0.00170454545454553*G0_1_1_5_2_1 + 0.000779220779220805*G0_1_1_5_2_2 - 0.00350649350649363*G0_1_1_5_2_3 - 0.00233766233766241*G0_1_1_5_2_4 + 0.00603896103896127*G0_1_1_5_2_5 - 0.00370129870129883*G0_1_1_5_3_0 + 0.0066233766233769*G0_1_1_5_3_1 - 0.00350649350649363*G0_1_1_5_3_2 + 0.0249350649350658*G0_1_1_5_3_3 + 0.0124675324675329*G0_1_1_5_3_4 - 0.00467532467532484*G0_1_1_5_3_5 - 0.00954545454545487*G0_1_1_5_4_0 - 0.0025324675324676*G0_1_1_5_4_1 - 0.00233766233766241*G0_1_1_5_4_2 + 0.0124675324675329*G0_1_1_5_4_3 + 0.0218181818181825*G0_1_1_5_4_4 - 0.00701298701298731*G0_1_1_5_4_5 - 0.029805194805196*G0_1_1_5_5_0 + 0.0062337662337665*G0_1_1_5_5_1 + 0.00603896103896127*G0_1_1_5_5_2 - 0.00467532467532484*G0_1_1_5_5_3 - 0.00701298701298731*G0_1_1_5_5_4 - 0.215064935064943*G0_1_1_5_5_5; + A[99] = 0.023668831168832*G0_0_0_0_0_0 - 0.00262987012987022*G0_0_0_0_0_1 - 0.00525974025974045*G0_0_0_0_0_2 + 0.00876623376623403*G0_0_0_0_0_3 + 0.0403246753246767*G0_0_0_0_0_4 + 0.0122727272727277*G0_0_0_0_0_5 - 0.00262987012987022*G0_0_0_0_1_0 - 0.00262987012987021*G0_0_0_0_1_1 + 0.00262987012987022*G0_0_0_0_1_2 - 0.00175324675324683*G0_0_0_0_1_3 - 0.00175324675324683*G0_0_0_0_1_4 - 0.00350649350649363*G0_0_0_0_1_5 - 0.00525974025974045*G0_0_0_0_2_0 + 0.00262987012987022*G0_0_0_0_2_1 - 0.00350649350649361*G0_0_0_0_2_2 - 0.0210389610389617*G0_0_0_0_2_4 - 0.00175324675324682*G0_0_0_0_2_5 + 0.00876623376623403*G0_0_0_0_3_0 - 0.00175324675324683*G0_0_0_0_3_1 - 0.0561038961038978*G0_0_0_0_3_3 - 0.0140259740259744*G0_0_0_0_3_4 - 0.0140259740259745*G0_0_0_0_3_5 + 0.0403246753246767*G0_0_0_0_4_0 - 0.00175324675324683*G0_0_0_0_4_1 - 0.0210389610389617*G0_0_0_0_4_2 - 0.0140259740259744*G0_0_0_0_4_3 + 0.0280519480519492*G0_0_0_0_4_4 + 0.00701298701298728*G0_0_0_0_4_5 + 0.0122727272727277*G0_0_0_0_5_0 - 0.00350649350649363*G0_0_0_0_5_1 - 0.00175324675324682*G0_0_0_0_5_2 - 0.0140259740259745*G0_0_0_0_5_3 + 0.00701298701298728*G0_0_0_0_5_4 - 0.00262987012987022*G0_0_0_1_0_0 - 0.00262987012987021*G0_0_0_1_0_1 + 0.00262987012987022*G0_0_0_1_0_2 - 0.00175324675324683*G0_0_0_1_0_3 - 0.00175324675324683*G0_0_0_1_0_4 - 0.00350649350649363*G0_0_0_1_0_5 - 0.00262987012987021*G0_0_0_1_1_0 + 0.023668831168832*G0_0_0_1_1_1 - 0.00525974025974045*G0_0_0_1_1_2 + 0.0403246753246767*G0_0_0_1_1_3 + 0.00876623376623406*G0_0_0_1_1_4 + 0.0122727272727277*G0_0_0_1_1_5 + 0.00262987012987022*G0_0_0_1_2_0 - 0.00525974025974045*G0_0_0_1_2_1 - 0.00350649350649361*G0_0_0_1_2_2 - 0.0210389610389618*G0_0_0_1_2_3 - 0.00175324675324682*G0_0_0_1_2_5 - 0.00175324675324683*G0_0_0_1_3_0 + 0.0403246753246767*G0_0_0_1_3_1 - 0.0210389610389618*G0_0_0_1_3_2 + 0.0280519480519492*G0_0_0_1_3_3 - 0.0140259740259745*G0_0_0_1_3_4 + 0.0070129870129873*G0_0_0_1_3_5 - 0.00175324675324683*G0_0_0_1_4_0 + 0.00876623376623406*G0_0_0_1_4_1 - 0.0140259740259745*G0_0_0_1_4_3 - 0.0561038961038979*G0_0_0_1_4_4 - 0.0140259740259745*G0_0_0_1_4_5 - 0.00350649350649363*G0_0_0_1_5_0 + 0.0122727272727277*G0_0_0_1_5_1 - 0.00175324675324682*G0_0_0_1_5_2 + 0.0070129870129873*G0_0_0_1_5_3 - 0.0140259740259745*G0_0_0_1_5_4 - 0.00525974025974045*G0_0_0_2_0_0 + 0.00262987012987022*G0_0_0_2_0_1 - 0.00350649350649361*G0_0_0_2_0_2 - 0.0210389610389617*G0_0_0_2_0_4 - 0.00175324675324682*G0_0_0_2_0_5 + 0.00262987012987022*G0_0_0_2_1_0 - 0.00525974025974045*G0_0_0_2_1_1 - 0.00350649350649361*G0_0_0_2_1_2 - 0.0210389610389618*G0_0_0_2_1_3 - 0.00175324675324682*G0_0_0_2_1_5 - 0.00350649350649361*G0_0_0_2_2_0 - 0.00350649350649361*G0_0_0_2_2_1 + 0.0262987012987021*G0_0_0_2_2_2 + 0.0350649350649362*G0_0_0_2_2_3 + 0.0350649350649362*G0_0_0_2_2_4 + 0.00701298701298726*G0_0_0_2_2_5 - 0.0210389610389618*G0_0_0_2_3_1 + 0.0350649350649362*G0_0_0_2_3_2 - 0.0140259740259745*G0_0_0_2_3_5 - 0.0210389610389617*G0_0_0_2_4_0 + 0.0350649350649362*G0_0_0_2_4_2 - 0.0140259740259745*G0_0_0_2_4_5 - 0.00175324675324682*G0_0_0_2_5_0 - 0.00175324675324682*G0_0_0_2_5_1 + 0.00701298701298726*G0_0_0_2_5_2 - 0.0140259740259745*G0_0_0_2_5_3 - 0.0140259740259745*G0_0_0_2_5_4 - 0.0140259740259745*G0_0_0_2_5_5 + 0.00876623376623403*G0_0_0_3_0_0 - 0.00175324675324683*G0_0_0_3_0_1 - 0.0561038961038978*G0_0_0_3_0_3 - 0.0140259740259744*G0_0_0_3_0_4 - 0.0140259740259745*G0_0_0_3_0_5 - 0.00175324675324683*G0_0_0_3_1_0 + 0.0403246753246767*G0_0_0_3_1_1 - 0.0210389610389618*G0_0_0_3_1_2 + 0.0280519480519492*G0_0_0_3_1_3 - 0.0140259740259745*G0_0_0_3_1_4 + 0.0070129870129873*G0_0_0_3_1_5 - 0.0210389610389618*G0_0_0_3_2_1 + 0.0350649350649362*G0_0_0_3_2_2 - 0.0140259740259745*G0_0_0_3_2_5 - 0.0561038961038978*G0_0_0_3_3_0 + 0.0280519480519492*G0_0_0_3_3_1 + 0.981818181818215*G0_0_0_3_3_3 + 0.140259740259745*G0_0_0_3_3_4 + 0.140259740259745*G0_0_0_3_3_5 - 0.0140259740259744*G0_0_0_3_4_0 - 0.0140259740259745*G0_0_0_3_4_1 + 0.140259740259745*G0_0_0_3_4_3 + 0.140259740259745*G0_0_0_3_4_4 + 0.056103896103898*G0_0_0_3_4_5 - 0.0140259740259745*G0_0_0_3_5_0 + 0.0070129870129873*G0_0_0_3_5_1 - 0.0140259740259745*G0_0_0_3_5_2 + 0.140259740259745*G0_0_0_3_5_3 + 0.056103896103898*G0_0_0_3_5_4 + 0.056103896103898*G0_0_0_3_5_5 + 0.0403246753246767*G0_0_0_4_0_0 - 0.00175324675324683*G0_0_0_4_0_1 - 0.0210389610389617*G0_0_0_4_0_2 - 0.0140259740259744*G0_0_0_4_0_3 + 0.0280519480519492*G0_0_0_4_0_4 + 0.00701298701298728*G0_0_0_4_0_5 - 0.00175324675324683*G0_0_0_4_1_0 + 0.00876623376623406*G0_0_0_4_1_1 - 0.0140259740259745*G0_0_0_4_1_3 - 0.0561038961038979*G0_0_0_4_1_4 - 0.0140259740259745*G0_0_0_4_1_5 - 0.0210389610389617*G0_0_0_4_2_0 + 0.0350649350649362*G0_0_0_4_2_2 - 0.0140259740259745*G0_0_0_4_2_5 - 0.0140259740259744*G0_0_0_4_3_0 - 0.0140259740259745*G0_0_0_4_3_1 + 0.140259740259745*G0_0_0_4_3_3 + 0.140259740259745*G0_0_0_4_3_4 + 0.056103896103898*G0_0_0_4_3_5 + 0.0280519480519492*G0_0_0_4_4_0 - 0.0561038961038979*G0_0_0_4_4_1 + 0.140259740259745*G0_0_0_4_4_3 + 0.981818181818214*G0_0_0_4_4_4 + 0.140259740259745*G0_0_0_4_4_5 + 0.00701298701298728*G0_0_0_4_5_0 - 0.0140259740259745*G0_0_0_4_5_1 - 0.0140259740259745*G0_0_0_4_5_2 + 0.056103896103898*G0_0_0_4_5_3 + 0.140259740259745*G0_0_0_4_5_4 + 0.056103896103898*G0_0_0_4_5_5 + 0.0122727272727277*G0_0_0_5_0_0 - 0.00350649350649363*G0_0_0_5_0_1 - 0.00175324675324682*G0_0_0_5_0_2 - 0.0140259740259745*G0_0_0_5_0_3 + 0.00701298701298728*G0_0_0_5_0_4 - 0.00350649350649363*G0_0_0_5_1_0 + 0.0122727272727277*G0_0_0_5_1_1 - 0.00175324675324682*G0_0_0_5_1_2 + 0.0070129870129873*G0_0_0_5_1_3 - 0.0140259740259745*G0_0_0_5_1_4 - 0.00175324675324682*G0_0_0_5_2_0 - 0.00175324675324682*G0_0_0_5_2_1 + 0.00701298701298726*G0_0_0_5_2_2 - 0.0140259740259745*G0_0_0_5_2_3 - 0.0140259740259745*G0_0_0_5_2_4 - 0.0140259740259745*G0_0_0_5_2_5 - 0.0140259740259745*G0_0_0_5_3_0 + 0.0070129870129873*G0_0_0_5_3_1 - 0.0140259740259745*G0_0_0_5_3_2 + 0.140259740259745*G0_0_0_5_3_3 + 0.056103896103898*G0_0_0_5_3_4 + 0.056103896103898*G0_0_0_5_3_5 + 0.00701298701298728*G0_0_0_5_4_0 - 0.0140259740259745*G0_0_0_5_4_1 - 0.0140259740259745*G0_0_0_5_4_2 + 0.056103896103898*G0_0_0_5_4_3 + 0.140259740259745*G0_0_0_5_4_4 + 0.0561038961038981*G0_0_0_5_4_5 - 0.0140259740259745*G0_0_0_5_5_2 + 0.056103896103898*G0_0_0_5_5_3 + 0.0561038961038981*G0_0_0_5_5_4 + 0.0561038961038981*G0_0_0_5_5_5 + 0.0105194805194809*G0_0_1_0_0_0 - 0.00219155844155852*G0_0_1_0_0_1 - 0.00219155844155852*G0_0_1_0_0_2 + 0.00525974025974042*G0_0_1_0_0_3 + 0.00876623376623409*G0_0_1_0_0_4 + 0.00876623376623409*G0_0_1_0_0_5 - 0.00219155844155852*G0_0_1_0_1_0 - 0.0004383116883117*G0_0_1_0_1_1 + 0.00131493506493511*G0_0_1_0_1_2 - 0.00175324675324682*G0_0_1_0_1_4 - 0.00175324675324683*G0_0_1_0_1_5 - 0.00219155844155852*G0_0_1_0_2_0 + 0.00131493506493511*G0_0_1_0_2_1 - 0.000438311688311693*G0_0_1_0_2_2 - 0.00175324675324681*G0_0_1_0_2_4 - 0.00175324675324682*G0_0_1_0_2_5 + 0.00525974025974042*G0_0_1_0_3_0 - 0.0490909090909106*G0_0_1_0_3_3 - 0.00701298701298721*G0_0_1_0_3_4 - 0.00701298701298723*G0_0_1_0_3_5 + 0.00876623376623409*G0_0_1_0_4_0 - 0.00175324675324682*G0_0_1_0_4_1 - 0.00175324675324681*G0_0_1_0_4_2 - 0.00701298701298721*G0_0_1_0_4_3 + 0.0140259740259745*G0_0_1_0_4_4 + 0.00701298701298728*G0_0_1_0_4_5 + 0.00876623376623409*G0_0_1_0_5_0 - 0.00175324675324683*G0_0_1_0_5_1 - 0.00175324675324682*G0_0_1_0_5_2 - 0.00701298701298723*G0_0_1_0_5_3 + 0.00701298701298728*G0_0_1_0_5_4 + 0.0140259740259745*G0_0_1_0_5_5 - 0.00219155844155852*G0_0_1_1_0_0 - 0.0004383116883117*G0_0_1_1_0_1 + 0.00131493506493511*G0_0_1_1_0_2 - 0.00175324675324682*G0_0_1_1_0_4 - 0.00175324675324683*G0_0_1_1_0_5 - 0.0004383116883117*G0_0_1_1_1_0 + 0.0131493506493511*G0_0_1_1_1_1 - 0.00306818181818193*G0_0_1_1_1_2 + 0.0315584415584427*G0_0_1_1_1_3 + 0.00350649350649363*G0_0_1_1_1_4 + 0.00350649350649365*G0_0_1_1_1_5 + 0.00131493506493511*G0_0_1_1_2_0 - 0.00306818181818193*G0_0_1_1_2_1 - 0.00306818181818192*G0_0_1_1_2_2 - 0.019285714285715*G0_0_1_1_2_3 + 0.0315584415584427*G0_0_1_1_3_1 - 0.019285714285715*G0_0_1_1_3_2 + 0.0140259740259747*G0_0_1_1_3_3 - 0.00701298701298723*G0_0_1_1_3_4 - 0.00175324675324682*G0_0_1_1_4_0 + 0.00350649350649363*G0_0_1_1_4_1 - 0.00701298701298723*G0_0_1_1_4_3 - 0.00701298701298724*G0_0_1_1_4_4 - 0.00701298701298725*G0_0_1_1_4_5 - 0.00175324675324683*G0_0_1_1_5_0 + 0.00350649350649365*G0_0_1_1_5_1 - 0.00701298701298725*G0_0_1_1_5_4 - 0.0140259740259745*G0_0_1_1_5_5 - 0.00219155844155853*G0_0_1_2_0_0 + 0.00131493506493511*G0_0_1_2_0_1 - 0.000438311688311693*G0_0_1_2_0_2 - 0.00175324675324681*G0_0_1_2_0_4 - 0.00175324675324682*G0_0_1_2_0_5 + 0.00131493506493511*G0_0_1_2_1_0 - 0.00306818181818193*G0_0_1_2_1_1 - 0.00306818181818192*G0_0_1_2_1_2 - 0.019285714285715*G0_0_1_2_1_3 - 0.000438311688311693*G0_0_1_2_2_0 - 0.00306818181818192*G0_0_1_2_2_1 + 0.0131493506493511*G0_0_1_2_2_2 + 0.0315584415584426*G0_0_1_2_2_3 + 0.00350649350649361*G0_0_1_2_2_4 + 0.00350649350649363*G0_0_1_2_2_5 - 0.019285714285715*G0_0_1_2_3_1 + 0.0315584415584426*G0_0_1_2_3_2 + 0.0140259740259745*G0_0_1_2_3_3 - 0.00701298701298726*G0_0_1_2_3_5 - 0.00175324675324681*G0_0_1_2_4_0 + 0.00350649350649361*G0_0_1_2_4_2 - 0.0140259740259745*G0_0_1_2_4_4 - 0.00701298701298726*G0_0_1_2_4_5 - 0.00175324675324682*G0_0_1_2_5_0 + 0.00350649350649363*G0_0_1_2_5_2 - 0.00701298701298726*G0_0_1_2_5_3 - 0.00701298701298726*G0_0_1_2_5_4 - 0.00701298701298726*G0_0_1_2_5_5 + 0.00525974025974042*G0_0_1_3_0_0 - 0.0490909090909106*G0_0_1_3_0_3 - 0.00701298701298721*G0_0_1_3_0_4 - 0.00701298701298723*G0_0_1_3_0_5 + 0.0315584415584427*G0_0_1_3_1_1 - 0.019285714285715*G0_0_1_3_1_2 + 0.0140259740259747*G0_0_1_3_1_3 - 0.00701298701298723*G0_0_1_3_1_4 - 0.019285714285715*G0_0_1_3_2_1 + 0.0315584415584426*G0_0_1_3_2_2 + 0.0140259740259745*G0_0_1_3_2_3 - 0.00701298701298726*G0_0_1_3_2_5 - 0.0490909090909106*G0_0_1_3_3_0 + 0.0140259740259747*G0_0_1_3_3_1 + 0.0140259740259745*G0_0_1_3_3_2 + 0.953766233766267*G0_0_1_3_3_3 + 0.112207792207796*G0_0_1_3_3_4 + 0.112207792207796*G0_0_1_3_3_5 - 0.00701298701298721*G0_0_1_3_4_0 - 0.00701298701298723*G0_0_1_3_4_1 + 0.112207792207796*G0_0_1_3_4_3 + 0.0280519480519489*G0_0_1_3_4_4 + 0.028051948051949*G0_0_1_3_4_5 - 0.00701298701298723*G0_0_1_3_5_0 - 0.00701298701298726*G0_0_1_3_5_2 + 0.112207792207796*G0_0_1_3_5_3 + 0.028051948051949*G0_0_1_3_5_4 + 0.028051948051949*G0_0_1_3_5_5 + 0.00876623376623409*G0_0_1_4_0_0 - 0.00175324675324682*G0_0_1_4_0_1 - 0.00175324675324681*G0_0_1_4_0_2 - 0.00701298701298721*G0_0_1_4_0_3 + 0.0140259740259745*G0_0_1_4_0_4 + 0.00701298701298728*G0_0_1_4_0_5 - 0.00175324675324682*G0_0_1_4_1_0 + 0.00350649350649363*G0_0_1_4_1_1 - 0.00701298701298723*G0_0_1_4_1_3 - 0.00701298701298724*G0_0_1_4_1_4 - 0.00701298701298725*G0_0_1_4_1_5 - 0.00175324675324681*G0_0_1_4_2_0 + 0.00350649350649361*G0_0_1_4_2_2 - 0.0140259740259745*G0_0_1_4_2_4 - 0.00701298701298726*G0_0_1_4_2_5 - 0.00701298701298721*G0_0_1_4_3_0 - 0.00701298701298723*G0_0_1_4_3_1 + 0.112207792207796*G0_0_1_4_3_3 + 0.0280519480519489*G0_0_1_4_3_4 + 0.028051948051949*G0_0_1_4_3_5 + 0.0140259740259745*G0_0_1_4_4_0 - 0.00701298701298724*G0_0_1_4_4_1 - 0.0140259740259745*G0_0_1_4_4_2 + 0.0280519480519489*G0_0_1_4_4_3 + 0.0280519480519488*G0_0_1_4_4_4 + 0.028051948051949*G0_0_1_4_4_5 + 0.00701298701298728*G0_0_1_4_5_0 - 0.00701298701298725*G0_0_1_4_5_1 - 0.00701298701298726*G0_0_1_4_5_2 + 0.028051948051949*G0_0_1_4_5_3 + 0.028051948051949*G0_0_1_4_5_4 + 0.028051948051949*G0_0_1_4_5_5 + 0.00876623376623409*G0_0_1_5_0_0 - 0.00175324675324683*G0_0_1_5_0_1 - 0.00175324675324682*G0_0_1_5_0_2 - 0.00701298701298723*G0_0_1_5_0_3 + 0.00701298701298728*G0_0_1_5_0_4 + 0.0140259740259745*G0_0_1_5_0_5 - 0.00175324675324683*G0_0_1_5_1_0 + 0.00350649350649365*G0_0_1_5_1_1 - 0.00701298701298725*G0_0_1_5_1_4 - 0.0140259740259745*G0_0_1_5_1_5 - 0.00175324675324682*G0_0_1_5_2_0 + 0.00350649350649363*G0_0_1_5_2_2 - 0.00701298701298726*G0_0_1_5_2_3 - 0.00701298701298726*G0_0_1_5_2_4 - 0.00701298701298726*G0_0_1_5_2_5 - 0.00701298701298723*G0_0_1_5_3_0 - 0.00701298701298726*G0_0_1_5_3_2 + 0.112207792207796*G0_0_1_5_3_3 + 0.028051948051949*G0_0_1_5_3_4 + 0.028051948051949*G0_0_1_5_3_5 + 0.00701298701298728*G0_0_1_5_4_0 - 0.00701298701298725*G0_0_1_5_4_1 - 0.00701298701298726*G0_0_1_5_4_2 + 0.028051948051949*G0_0_1_5_4_3 + 0.028051948051949*G0_0_1_5_4_4 + 0.028051948051949*G0_0_1_5_4_5 + 0.0140259740259745*G0_0_1_5_5_0 - 0.0140259740259745*G0_0_1_5_5_1 - 0.00701298701298726*G0_0_1_5_5_2 + 0.028051948051949*G0_0_1_5_5_3 + 0.028051948051949*G0_0_1_5_5_4 + 0.0280519480519491*G0_0_1_5_5_5 + 0.0105194805194809*G0_1_0_0_0_0 - 0.00219155844155852*G0_1_0_0_0_1 - 0.00219155844155852*G0_1_0_0_0_2 + 0.00525974025974042*G0_1_0_0_0_3 + 0.00876623376623409*G0_1_0_0_0_4 + 0.0087662337662341*G0_1_0_0_0_5 - 0.00219155844155852*G0_1_0_0_1_0 - 0.0004383116883117*G0_1_0_0_1_1 + 0.00131493506493511*G0_1_0_0_1_2 - 0.00175324675324682*G0_1_0_0_1_4 - 0.00175324675324683*G0_1_0_0_1_5 - 0.00219155844155852*G0_1_0_0_2_0 + 0.00131493506493511*G0_1_0_0_2_1 - 0.000438311688311693*G0_1_0_0_2_2 - 0.00175324675324681*G0_1_0_0_2_4 - 0.00175324675324682*G0_1_0_0_2_5 + 0.00525974025974042*G0_1_0_0_3_0 - 0.0490909090909106*G0_1_0_0_3_3 - 0.00701298701298721*G0_1_0_0_3_4 - 0.00701298701298723*G0_1_0_0_3_5 + 0.00876623376623409*G0_1_0_0_4_0 - 0.00175324675324682*G0_1_0_0_4_1 - 0.00175324675324681*G0_1_0_0_4_2 - 0.00701298701298721*G0_1_0_0_4_3 + 0.0140259740259745*G0_1_0_0_4_4 + 0.00701298701298728*G0_1_0_0_4_5 + 0.0087662337662341*G0_1_0_0_5_0 - 0.00175324675324683*G0_1_0_0_5_1 - 0.00175324675324682*G0_1_0_0_5_2 - 0.00701298701298723*G0_1_0_0_5_3 + 0.00701298701298728*G0_1_0_0_5_4 + 0.0140259740259745*G0_1_0_0_5_5 - 0.00219155844155852*G0_1_0_1_0_0 - 0.0004383116883117*G0_1_0_1_0_1 + 0.00131493506493511*G0_1_0_1_0_2 - 0.00175324675324682*G0_1_0_1_0_4 - 0.00175324675324683*G0_1_0_1_0_5 - 0.0004383116883117*G0_1_0_1_1_0 + 0.0131493506493511*G0_1_0_1_1_1 - 0.00306818181818193*G0_1_0_1_1_2 + 0.0315584415584427*G0_1_0_1_1_3 + 0.00350649350649363*G0_1_0_1_1_4 + 0.00350649350649365*G0_1_0_1_1_5 + 0.00131493506493511*G0_1_0_1_2_0 - 0.00306818181818193*G0_1_0_1_2_1 - 0.00306818181818192*G0_1_0_1_2_2 - 0.019285714285715*G0_1_0_1_2_3 + 0.0315584415584427*G0_1_0_1_3_1 - 0.019285714285715*G0_1_0_1_3_2 + 0.0140259740259747*G0_1_0_1_3_3 - 0.00701298701298723*G0_1_0_1_3_4 - 0.00175324675324682*G0_1_0_1_4_0 + 0.00350649350649363*G0_1_0_1_4_1 - 0.00701298701298723*G0_1_0_1_4_3 - 0.00701298701298724*G0_1_0_1_4_4 - 0.00701298701298725*G0_1_0_1_4_5 - 0.00175324675324683*G0_1_0_1_5_0 + 0.00350649350649365*G0_1_0_1_5_1 - 0.00701298701298725*G0_1_0_1_5_4 - 0.0140259740259745*G0_1_0_1_5_5 - 0.00219155844155853*G0_1_0_2_0_0 + 0.00131493506493511*G0_1_0_2_0_1 - 0.000438311688311693*G0_1_0_2_0_2 - 0.00175324675324681*G0_1_0_2_0_4 - 0.00175324675324682*G0_1_0_2_0_5 + 0.00131493506493511*G0_1_0_2_1_0 - 0.00306818181818193*G0_1_0_2_1_1 - 0.00306818181818192*G0_1_0_2_1_2 - 0.019285714285715*G0_1_0_2_1_3 - 0.000438311688311693*G0_1_0_2_2_0 - 0.00306818181818192*G0_1_0_2_2_1 + 0.0131493506493511*G0_1_0_2_2_2 + 0.0315584415584426*G0_1_0_2_2_3 + 0.00350649350649361*G0_1_0_2_2_4 + 0.00350649350649363*G0_1_0_2_2_5 - 0.019285714285715*G0_1_0_2_3_1 + 0.0315584415584426*G0_1_0_2_3_2 + 0.0140259740259745*G0_1_0_2_3_3 - 0.00701298701298726*G0_1_0_2_3_5 - 0.00175324675324681*G0_1_0_2_4_0 + 0.00350649350649361*G0_1_0_2_4_2 - 0.0140259740259745*G0_1_0_2_4_4 - 0.00701298701298726*G0_1_0_2_4_5 - 0.00175324675324682*G0_1_0_2_5_0 + 0.00350649350649363*G0_1_0_2_5_2 - 0.00701298701298726*G0_1_0_2_5_3 - 0.00701298701298726*G0_1_0_2_5_4 - 0.00701298701298727*G0_1_0_2_5_5 + 0.00525974025974042*G0_1_0_3_0_0 - 0.0490909090909106*G0_1_0_3_0_3 - 0.00701298701298721*G0_1_0_3_0_4 - 0.00701298701298723*G0_1_0_3_0_5 + 0.0315584415584427*G0_1_0_3_1_1 - 0.019285714285715*G0_1_0_3_1_2 + 0.0140259740259747*G0_1_0_3_1_3 - 0.00701298701298723*G0_1_0_3_1_4 - 0.019285714285715*G0_1_0_3_2_1 + 0.0315584415584426*G0_1_0_3_2_2 + 0.0140259740259745*G0_1_0_3_2_3 - 0.00701298701298726*G0_1_0_3_2_5 - 0.0490909090909106*G0_1_0_3_3_0 + 0.0140259740259747*G0_1_0_3_3_1 + 0.0140259740259745*G0_1_0_3_3_2 + 0.953766233766267*G0_1_0_3_3_3 + 0.112207792207796*G0_1_0_3_3_4 + 0.112207792207796*G0_1_0_3_3_5 - 0.00701298701298721*G0_1_0_3_4_0 - 0.00701298701298723*G0_1_0_3_4_1 + 0.112207792207796*G0_1_0_3_4_3 + 0.0280519480519489*G0_1_0_3_4_4 + 0.028051948051949*G0_1_0_3_4_5 - 0.00701298701298723*G0_1_0_3_5_0 - 0.00701298701298726*G0_1_0_3_5_2 + 0.112207792207796*G0_1_0_3_5_3 + 0.028051948051949*G0_1_0_3_5_4 + 0.028051948051949*G0_1_0_3_5_5 + 0.00876623376623409*G0_1_0_4_0_0 - 0.00175324675324682*G0_1_0_4_0_1 - 0.00175324675324681*G0_1_0_4_0_2 - 0.00701298701298721*G0_1_0_4_0_3 + 0.0140259740259745*G0_1_0_4_0_4 + 0.00701298701298728*G0_1_0_4_0_5 - 0.00175324675324682*G0_1_0_4_1_0 + 0.00350649350649363*G0_1_0_4_1_1 - 0.00701298701298723*G0_1_0_4_1_3 - 0.00701298701298724*G0_1_0_4_1_4 - 0.00701298701298725*G0_1_0_4_1_5 - 0.00175324675324681*G0_1_0_4_2_0 + 0.00350649350649361*G0_1_0_4_2_2 - 0.0140259740259745*G0_1_0_4_2_4 - 0.00701298701298726*G0_1_0_4_2_5 - 0.00701298701298721*G0_1_0_4_3_0 - 0.00701298701298723*G0_1_0_4_3_1 + 0.112207792207796*G0_1_0_4_3_3 + 0.0280519480519489*G0_1_0_4_3_4 + 0.028051948051949*G0_1_0_4_3_5 + 0.0140259740259745*G0_1_0_4_4_0 - 0.00701298701298724*G0_1_0_4_4_1 - 0.0140259740259745*G0_1_0_4_4_2 + 0.0280519480519489*G0_1_0_4_4_3 + 0.0280519480519488*G0_1_0_4_4_4 + 0.028051948051949*G0_1_0_4_4_5 + 0.00701298701298728*G0_1_0_4_5_0 - 0.00701298701298725*G0_1_0_4_5_1 - 0.00701298701298726*G0_1_0_4_5_2 + 0.028051948051949*G0_1_0_4_5_3 + 0.028051948051949*G0_1_0_4_5_4 + 0.028051948051949*G0_1_0_4_5_5 + 0.00876623376623409*G0_1_0_5_0_0 - 0.00175324675324683*G0_1_0_5_0_1 - 0.00175324675324682*G0_1_0_5_0_2 - 0.00701298701298723*G0_1_0_5_0_3 + 0.00701298701298728*G0_1_0_5_0_4 + 0.0140259740259745*G0_1_0_5_0_5 - 0.00175324675324683*G0_1_0_5_1_0 + 0.00350649350649365*G0_1_0_5_1_1 - 0.00701298701298725*G0_1_0_5_1_4 - 0.0140259740259745*G0_1_0_5_1_5 - 0.00175324675324682*G0_1_0_5_2_0 + 0.00350649350649363*G0_1_0_5_2_2 - 0.00701298701298726*G0_1_0_5_2_3 - 0.00701298701298726*G0_1_0_5_2_4 - 0.00701298701298726*G0_1_0_5_2_5 - 0.00701298701298723*G0_1_0_5_3_0 - 0.00701298701298726*G0_1_0_5_3_2 + 0.112207792207796*G0_1_0_5_3_3 + 0.028051948051949*G0_1_0_5_3_4 + 0.028051948051949*G0_1_0_5_3_5 + 0.00701298701298728*G0_1_0_5_4_0 - 0.00701298701298725*G0_1_0_5_4_1 - 0.00701298701298726*G0_1_0_5_4_2 + 0.028051948051949*G0_1_0_5_4_3 + 0.028051948051949*G0_1_0_5_4_4 + 0.028051948051949*G0_1_0_5_4_5 + 0.0140259740259745*G0_1_0_5_5_0 - 0.0140259740259745*G0_1_0_5_5_1 - 0.00701298701298726*G0_1_0_5_5_2 + 0.028051948051949*G0_1_0_5_5_3 + 0.028051948051949*G0_1_0_5_5_4 + 0.0280519480519491*G0_1_0_5_5_5 + 0.0236688311688321*G0_1_1_0_0_0 - 0.00525974025974047*G0_1_1_0_0_1 - 0.00262987012987023*G0_1_1_0_0_2 + 0.00876623376623404*G0_1_1_0_0_3 + 0.0122727272727277*G0_1_1_0_0_4 + 0.0403246753246769*G0_1_1_0_0_5 - 0.00525974025974047*G0_1_1_0_1_0 - 0.00350649350649362*G0_1_1_0_1_1 + 0.00262987012987022*G0_1_1_0_1_2 - 0.00175324675324683*G0_1_1_0_1_4 - 0.0210389610389618*G0_1_1_0_1_5 - 0.00262987012987023*G0_1_1_0_2_0 + 0.00262987012987022*G0_1_1_0_2_1 - 0.00262987012987021*G0_1_1_0_2_2 - 0.00175324675324681*G0_1_1_0_2_3 - 0.00350649350649363*G0_1_1_0_2_4 - 0.00175324675324684*G0_1_1_0_2_5 + 0.00876623376623404*G0_1_1_0_3_0 - 0.00175324675324681*G0_1_1_0_3_2 - 0.0561038961038978*G0_1_1_0_3_3 - 0.0140259740259745*G0_1_1_0_3_4 - 0.0140259740259745*G0_1_1_0_3_5 + 0.0122727272727277*G0_1_1_0_4_0 - 0.00175324675324683*G0_1_1_0_4_1 - 0.00350649350649363*G0_1_1_0_4_2 - 0.0140259740259745*G0_1_1_0_4_3 + 0.00701298701298733*G0_1_1_0_4_5 + 0.0403246753246769*G0_1_1_0_5_0 - 0.0210389610389618*G0_1_1_0_5_1 - 0.00175324675324684*G0_1_1_0_5_2 - 0.0140259740259745*G0_1_1_0_5_3 + 0.00701298701298733*G0_1_1_0_5_4 + 0.0280519480519494*G0_1_1_0_5_5 - 0.00525974025974047*G0_1_1_1_0_0 - 0.00350649350649362*G0_1_1_1_0_1 + 0.00262987012987022*G0_1_1_1_0_2 - 0.00175324675324683*G0_1_1_1_0_4 - 0.0210389610389618*G0_1_1_1_0_5 - 0.00350649350649362*G0_1_1_1_1_0 + 0.0262987012987023*G0_1_1_1_1_1 - 0.00350649350649363*G0_1_1_1_1_2 + 0.0350649350649363*G0_1_1_1_1_3 + 0.00701298701298725*G0_1_1_1_1_4 + 0.0350649350649364*G0_1_1_1_1_5 + 0.00262987012987022*G0_1_1_1_2_0 - 0.00350649350649363*G0_1_1_1_2_1 - 0.00525974025974044*G0_1_1_1_2_2 - 0.0210389610389618*G0_1_1_1_2_3 - 0.00175324675324681*G0_1_1_1_2_4 + 0.0350649350649363*G0_1_1_1_3_1 - 0.0210389610389618*G0_1_1_1_3_2 - 0.0140259740259745*G0_1_1_1_3_4 - 0.00175324675324683*G0_1_1_1_4_0 + 0.00701298701298725*G0_1_1_1_4_1 - 0.00175324675324681*G0_1_1_1_4_2 - 0.0140259740259745*G0_1_1_1_4_3 - 0.0140259740259745*G0_1_1_1_4_4 - 0.0140259740259745*G0_1_1_1_4_5 - 0.0210389610389618*G0_1_1_1_5_0 + 0.0350649350649364*G0_1_1_1_5_1 - 0.0140259740259745*G0_1_1_1_5_4 - 0.00262987012987023*G0_1_1_2_0_0 + 0.00262987012987022*G0_1_1_2_0_1 - 0.00262987012987021*G0_1_1_2_0_2 - 0.00175324675324681*G0_1_1_2_0_3 - 0.00350649350649363*G0_1_1_2_0_4 - 0.00175324675324684*G0_1_1_2_0_5 + 0.00262987012987022*G0_1_1_2_1_0 - 0.00350649350649363*G0_1_1_2_1_1 - 0.00525974025974044*G0_1_1_2_1_2 - 0.0210389610389618*G0_1_1_2_1_3 - 0.00175324675324681*G0_1_1_2_1_4 - 0.00262987012987021*G0_1_1_2_2_0 - 0.00525974025974044*G0_1_1_2_2_1 + 0.023668831168832*G0_1_1_2_2_2 + 0.0403246753246767*G0_1_1_2_2_3 + 0.0122727272727277*G0_1_1_2_2_4 + 0.00876623376623408*G0_1_1_2_2_5 - 0.00175324675324681*G0_1_1_2_3_0 - 0.0210389610389618*G0_1_1_2_3_1 + 0.0403246753246767*G0_1_1_2_3_2 + 0.028051948051949*G0_1_1_2_3_3 + 0.00701298701298725*G0_1_1_2_3_4 - 0.0140259740259745*G0_1_1_2_3_5 - 0.00350649350649363*G0_1_1_2_4_0 - 0.00175324675324681*G0_1_1_2_4_1 + 0.0122727272727277*G0_1_1_2_4_2 + 0.00701298701298725*G0_1_1_2_4_3 - 0.0140259740259745*G0_1_1_2_4_5 - 0.00175324675324684*G0_1_1_2_5_0 + 0.00876623376623408*G0_1_1_2_5_2 - 0.0140259740259745*G0_1_1_2_5_3 - 0.0140259740259745*G0_1_1_2_5_4 - 0.0561038961038981*G0_1_1_2_5_5 + 0.00876623376623404*G0_1_1_3_0_0 - 0.00175324675324681*G0_1_1_3_0_2 - 0.0561038961038978*G0_1_1_3_0_3 - 0.0140259740259745*G0_1_1_3_0_4 - 0.0140259740259745*G0_1_1_3_0_5 + 0.0350649350649363*G0_1_1_3_1_1 - 0.0210389610389618*G0_1_1_3_1_2 - 0.0140259740259745*G0_1_1_3_1_4 - 0.00175324675324681*G0_1_1_3_2_0 - 0.0210389610389618*G0_1_1_3_2_1 + 0.0403246753246767*G0_1_1_3_2_2 + 0.028051948051949*G0_1_1_3_2_3 + 0.00701298701298725*G0_1_1_3_2_4 - 0.0140259740259745*G0_1_1_3_2_5 - 0.0561038961038978*G0_1_1_3_3_0 + 0.028051948051949*G0_1_1_3_3_2 + 0.981818181818216*G0_1_1_3_3_3 + 0.140259740259745*G0_1_1_3_3_4 + 0.140259740259745*G0_1_1_3_3_5 - 0.0140259740259745*G0_1_1_3_4_0 - 0.0140259740259745*G0_1_1_3_4_1 + 0.00701298701298725*G0_1_1_3_4_2 + 0.140259740259745*G0_1_1_3_4_3 + 0.056103896103898*G0_1_1_3_4_4 + 0.056103896103898*G0_1_1_3_4_5 - 0.0140259740259745*G0_1_1_3_5_0 - 0.0140259740259745*G0_1_1_3_5_2 + 0.140259740259745*G0_1_1_3_5_3 + 0.056103896103898*G0_1_1_3_5_4 + 0.140259740259745*G0_1_1_3_5_5 + 0.0122727272727277*G0_1_1_4_0_0 - 0.00175324675324683*G0_1_1_4_0_1 - 0.00350649350649363*G0_1_1_4_0_2 - 0.0140259740259745*G0_1_1_4_0_3 + 0.00701298701298733*G0_1_1_4_0_5 - 0.00175324675324683*G0_1_1_4_1_0 + 0.00701298701298725*G0_1_1_4_1_1 - 0.00175324675324681*G0_1_1_4_1_2 - 0.0140259740259745*G0_1_1_4_1_3 - 0.0140259740259745*G0_1_1_4_1_4 - 0.0140259740259745*G0_1_1_4_1_5 - 0.00350649350649363*G0_1_1_4_2_0 - 0.00175324675324681*G0_1_1_4_2_1 + 0.0122727272727277*G0_1_1_4_2_2 + 0.00701298701298725*G0_1_1_4_2_3 - 0.0140259740259745*G0_1_1_4_2_5 - 0.0140259740259745*G0_1_1_4_3_0 - 0.0140259740259745*G0_1_1_4_3_1 + 0.00701298701298725*G0_1_1_4_3_2 + 0.140259740259745*G0_1_1_4_3_3 + 0.056103896103898*G0_1_1_4_3_4 + 0.056103896103898*G0_1_1_4_3_5 - 0.0140259740259745*G0_1_1_4_4_1 + 0.056103896103898*G0_1_1_4_4_3 + 0.056103896103898*G0_1_1_4_4_4 + 0.0561038961038981*G0_1_1_4_4_5 + 0.00701298701298733*G0_1_1_4_5_0 - 0.0140259740259745*G0_1_1_4_5_1 - 0.0140259740259745*G0_1_1_4_5_2 + 0.056103896103898*G0_1_1_4_5_3 + 0.0561038961038981*G0_1_1_4_5_4 + 0.140259740259745*G0_1_1_4_5_5 + 0.0403246753246769*G0_1_1_5_0_0 - 0.0210389610389618*G0_1_1_5_0_1 - 0.00175324675324684*G0_1_1_5_0_2 - 0.0140259740259745*G0_1_1_5_0_3 + 0.00701298701298733*G0_1_1_5_0_4 + 0.0280519480519494*G0_1_1_5_0_5 - 0.0210389610389618*G0_1_1_5_1_0 + 0.0350649350649364*G0_1_1_5_1_1 - 0.0140259740259745*G0_1_1_5_1_4 - 0.00175324675324684*G0_1_1_5_2_0 + 0.00876623376623408*G0_1_1_5_2_2 - 0.0140259740259745*G0_1_1_5_2_3 - 0.0140259740259745*G0_1_1_5_2_4 - 0.0561038961038981*G0_1_1_5_2_5 - 0.0140259740259745*G0_1_1_5_3_0 - 0.0140259740259745*G0_1_1_5_3_2 + 0.140259740259745*G0_1_1_5_3_3 + 0.056103896103898*G0_1_1_5_3_4 + 0.140259740259745*G0_1_1_5_3_5 + 0.00701298701298733*G0_1_1_5_4_0 - 0.0140259740259745*G0_1_1_5_4_1 - 0.0140259740259745*G0_1_1_5_4_2 + 0.056103896103898*G0_1_1_5_4_3 + 0.0561038961038981*G0_1_1_5_4_4 + 0.140259740259745*G0_1_1_5_4_5 + 0.0280519480519494*G0_1_1_5_5_0 - 0.0561038961038981*G0_1_1_5_5_2 + 0.140259740259745*G0_1_1_5_5_3 + 0.140259740259745*G0_1_1_5_5_4 + 0.981818181818217*G0_1_1_5_5_5; + A[78] = -A[73] - 0.109760551948056*G0_0_0_0_0_0 + 0.0045170454545456*G0_0_0_0_0_1 + 0.00976461038961071*G0_0_0_0_0_2 - 0.0037500000000001*G0_0_0_0_0_3 - 0.0431006493506508*G0_0_0_0_0_4 - 0.0224025974025982*G0_0_0_0_0_5 + 0.0045170454545456*G0_0_0_0_1_0 + 0.00304383116883126*G0_0_0_0_1_1 - 0.000560064935064955*G0_0_0_0_1_2 + 0.000243506493506504*G0_0_0_0_1_3 + 0.00180194805194812*G0_0_0_0_1_4 + 0.00340909090909104*G0_0_0_0_1_5 + 0.00976461038961071*G0_0_0_0_2_0 - 0.000560064935064955*G0_0_0_0_2_1 - 0.00152191558441564*G0_0_0_0_2_2 - 0.00175324675324681*G0_0_0_0_2_3 + 0.00584415584415604*G0_0_0_0_2_4 - 0.000925324675324697*G0_0_0_0_2_5 - 0.0037500000000001*G0_0_0_0_3_0 + 0.000243506493506504*G0_0_0_0_3_1 - 0.00175324675324681*G0_0_0_0_3_2 + 0.00487012987013002*G0_0_0_0_3_3 + 0.00389610389610401*G0_0_0_0_3_4 + 0.00935064935064964*G0_0_0_0_3_5 - 0.0431006493506508*G0_0_0_0_4_0 + 0.00180194805194812*G0_0_0_0_4_1 + 0.00584415584415604*G0_0_0_0_4_2 + 0.00389610389610402*G0_0_0_0_4_3 - 0.0374025974025987*G0_0_0_0_4_4 - 0.00175324675324684*G0_0_0_0_4_5 - 0.0224025974025982*G0_0_0_0_5_0 + 0.00340909090909104*G0_0_0_0_5_1 - 0.000925324675324697*G0_0_0_0_5_2 + 0.00935064935064964*G0_0_0_0_5_3 - 0.00175324675324684*G0_0_0_0_5_4 + 0.010714285714286*G0_0_0_0_5_5 + 0.0045170454545456*G0_0_0_1_0_0 + 0.00304383116883126*G0_0_0_1_0_1 - 0.000560064935064955*G0_0_0_1_0_2 + 0.000243506493506504*G0_0_0_1_0_3 + 0.00180194805194812*G0_0_0_1_0_4 + 0.00340909090909104*G0_0_0_1_0_5 + 0.00304383116883126*G0_0_0_1_1_0 - 0.0814529220779248*G0_0_0_1_1_1 + 0.00511363636363653*G0_0_0_1_1_2 - 0.0197240259740266*G0_0_0_1_1_3 - 0.00267857142857151*G0_0_0_1_1_4 - 0.0168019480519487*G0_0_0_1_1_5 - 0.000560064935064955*G0_0_0_1_2_0 + 0.00511363636363653*G0_0_0_1_2_1 - 0.000206980519480525*G0_0_0_1_2_2 - 0.000487012987013005*G0_0_0_1_2_3 - 0.00224025974025981*G0_0_0_1_2_4 - 0.0012175324675325*G0_0_0_1_2_5 + 0.000243506493506504*G0_0_0_1_3_0 - 0.0197240259740266*G0_0_0_1_3_1 - 0.000487012987013004*G0_0_0_1_3_2 - 0.002922077922078*G0_0_0_1_3_3 + 0.00487012987013002*G0_0_0_1_3_4 + 0.00194805194805199*G0_0_0_1_3_5 + 0.00180194805194812*G0_0_0_1_4_0 - 0.00267857142857151*G0_0_0_1_4_1 - 0.00224025974025981*G0_0_0_1_4_2 + 0.00487012987013002*G0_0_0_1_4_3 + 0.00974025974026006*G0_0_0_1_4_4 + 0.00779220779220805*G0_0_0_1_4_5 + 0.00340909090909104*G0_0_0_1_5_0 - 0.0168019480519487*G0_0_0_1_5_1 - 0.0012175324675325*G0_0_0_1_5_2 + 0.00194805194805199*G0_0_0_1_5_3 + 0.00779220779220805*G0_0_0_1_5_4 + 0.00487012987012997*G0_0_0_1_5_5 + 0.00976461038961071*G0_0_0_2_0_0 - 0.000560064935064955*G0_0_0_2_0_1 - 0.00152191558441564*G0_0_0_2_0_2 - 0.00175324675324681*G0_0_0_2_0_3 + 0.00584415584415604*G0_0_0_2_0_4 - 0.000925324675324697*G0_0_0_2_0_5 - 0.000560064935064955*G0_0_0_2_1_0 + 0.00511363636363653*G0_0_0_2_1_1 - 0.000206980519480525*G0_0_0_2_1_2 - 0.000487012987013004*G0_0_0_2_1_3 - 0.00224025974025981*G0_0_0_2_1_4 - 0.0012175324675325*G0_0_0_2_1_5 - 0.00152191558441564*G0_0_0_2_2_0 - 0.000206980519480525*G0_0_0_2_2_1 + 0.00372564935064946*G0_0_0_2_2_2 - 0.000438311688311701*G0_0_0_2_2_3 - 0.00199675324675331*G0_0_0_2_2_4 - 0.00438311688311703*G0_0_0_2_2_5 - 0.00175324675324681*G0_0_0_2_3_0 - 0.000487012987013004*G0_0_0_2_3_1 - 0.000438311688311701*G0_0_0_2_3_2 + 0.00974025974026005*G0_0_0_2_3_3 + 0.00798701298701325*G0_0_0_2_3_4 + 0.0122727272727277*G0_0_0_2_3_5 + 0.00584415584415604*G0_0_0_2_4_0 - 0.00224025974025981*G0_0_0_2_4_1 - 0.00199675324675331*G0_0_0_2_4_2 + 0.00798701298701325*G0_0_0_2_4_3 + 0.0237662337662346*G0_0_0_2_4_4 + 0.0132467532467537*G0_0_0_2_4_5 - 0.000925324675324697*G0_0_0_2_5_0 - 0.0012175324675325*G0_0_0_2_5_1 - 0.00438311688311703*G0_0_0_2_5_2 + 0.0122727272727277*G0_0_0_2_5_3 + 0.0132467532467537*G0_0_0_2_5_4 + 0.0292207792207802*G0_0_0_2_5_5 - 0.0037500000000001*G0_0_0_3_0_0 + 0.000243506493506504*G0_0_0_3_0_1 - 0.00175324675324681*G0_0_0_3_0_2 + 0.00487012987013003*G0_0_0_3_0_3 + 0.00389610389610401*G0_0_0_3_0_4 + 0.00935064935064964*G0_0_0_3_0_5 + 0.000243506493506504*G0_0_0_3_1_0 - 0.0197240259740266*G0_0_0_3_1_1 - 0.000487012987013005*G0_0_0_3_1_2 - 0.002922077922078*G0_0_0_3_1_3 + 0.00487012987013002*G0_0_0_3_1_4 + 0.00194805194805199*G0_0_0_3_1_5 - 0.00175324675324681*G0_0_0_3_2_0 - 0.000487012987013006*G0_0_0_3_2_1 - 0.0004383116883117*G0_0_0_3_2_2 + 0.00974025974026005*G0_0_0_3_2_3 + 0.00798701298701325*G0_0_0_3_2_4 + 0.0122727272727277*G0_0_0_3_2_5 + 0.00487012987013002*G0_0_0_3_3_0 - 0.002922077922078*G0_0_0_3_3_1 + 0.00974025974026005*G0_0_0_3_3_2 + 0.0677922077922102*G0_0_0_3_3_3 - 0.0194805194805201*G0_0_0_3_3_4 - 0.0342857142857154*G0_0_0_3_3_5 + 0.00389610389610401*G0_0_0_3_4_0 + 0.00487012987013002*G0_0_0_3_4_1 + 0.00798701298701325*G0_0_0_3_4_2 - 0.0194805194805201*G0_0_0_3_4_3 - 0.0272727272727281*G0_0_0_3_4_4 - 0.0342857142857154*G0_0_0_3_4_5 + 0.00935064935064964*G0_0_0_3_5_0 + 0.00194805194805199*G0_0_0_3_5_1 + 0.0122727272727277*G0_0_0_3_5_2 - 0.0342857142857154*G0_0_0_3_5_3 - 0.0342857142857154*G0_0_0_3_5_4 - 0.0771428571428597*G0_0_0_3_5_5 - 0.0431006493506508*G0_0_0_4_0_0 + 0.00180194805194812*G0_0_0_4_0_1 + 0.00584415584415604*G0_0_0_4_0_2 + 0.00389610389610401*G0_0_0_4_0_3 - 0.0374025974025987*G0_0_0_4_0_4 - 0.00175324675324684*G0_0_0_4_0_5 + 0.00180194805194812*G0_0_0_4_1_0 - 0.00267857142857151*G0_0_0_4_1_1 - 0.00224025974025981*G0_0_0_4_1_2 + 0.00487012987013002*G0_0_0_4_1_3 + 0.00974025974026006*G0_0_0_4_1_4 + 0.00779220779220805*G0_0_0_4_1_5 + 0.00584415584415604*G0_0_0_4_2_0 - 0.00224025974025981*G0_0_0_4_2_1 - 0.00199675324675331*G0_0_0_4_2_2 + 0.00798701298701325*G0_0_0_4_2_3 + 0.0237662337662346*G0_0_0_4_2_4 + 0.0132467532467537*G0_0_0_4_2_5 + 0.00389610389610401*G0_0_0_4_3_0 + 0.00487012987013002*G0_0_0_4_3_1 + 0.00798701298701325*G0_0_0_4_3_2 - 0.0194805194805201*G0_0_0_4_3_3 - 0.0272727272727281*G0_0_0_4_3_4 - 0.0342857142857154*G0_0_0_4_3_5 - 0.0374025974025987*G0_0_0_4_4_0 + 0.00974025974026006*G0_0_0_4_4_1 + 0.0237662337662346*G0_0_0_4_4_2 - 0.0272727272727281*G0_0_0_4_4_3 - 0.128571428571433*G0_0_0_4_4_4 - 0.0459740259740275*G0_0_0_4_4_5 - 0.00175324675324684*G0_0_0_4_5_0 + 0.00779220779220805*G0_0_0_4_5_1 + 0.0132467532467537*G0_0_0_4_5_2 - 0.0342857142857154*G0_0_0_4_5_3 - 0.0459740259740275*G0_0_0_4_5_4 - 0.0740259740259765*G0_0_0_4_5_5 - 0.0224025974025982*G0_0_0_5_0_0 + 0.00340909090909104*G0_0_0_5_0_1 - 0.000925324675324697*G0_0_0_5_0_2 + 0.00935064935064964*G0_0_0_5_0_3 - 0.00175324675324684*G0_0_0_5_0_4 + 0.010714285714286*G0_0_0_5_0_5 + 0.00340909090909104*G0_0_0_5_1_0 - 0.0168019480519487*G0_0_0_5_1_1 - 0.0012175324675325*G0_0_0_5_1_2 + 0.00194805194805199*G0_0_0_5_1_3 + 0.00779220779220805*G0_0_0_5_1_4 + 0.00487012987012998*G0_0_0_5_1_5 - 0.000925324675324697*G0_0_0_5_2_0 - 0.0012175324675325*G0_0_0_5_2_1 - 0.00438311688311703*G0_0_0_5_2_2 + 0.0122727272727277*G0_0_0_5_2_3 + 0.0132467532467537*G0_0_0_5_2_4 + 0.0292207792207802*G0_0_0_5_2_5 + 0.00935064935064964*G0_0_0_5_3_0 + 0.00194805194805199*G0_0_0_5_3_1 + 0.0122727272727277*G0_0_0_5_3_2 - 0.0342857142857154*G0_0_0_5_3_3 - 0.0342857142857154*G0_0_0_5_3_4 - 0.0771428571428597*G0_0_0_5_3_5 - 0.00175324675324684*G0_0_0_5_4_0 + 0.00779220779220805*G0_0_0_5_4_1 + 0.0132467532467537*G0_0_0_5_4_2 - 0.0342857142857154*G0_0_0_5_4_3 - 0.0459740259740275*G0_0_0_5_4_4 - 0.0740259740259765*G0_0_0_5_4_5 + 0.010714285714286*G0_0_0_5_5_0 + 0.00487012987012998*G0_0_0_5_5_1 + 0.0292207792207802*G0_0_0_5_5_2 - 0.0771428571428597*G0_0_0_5_5_3 - 0.0740259740259765*G0_0_0_5_5_4 - 0.317922077922089*G0_0_0_5_5_5 + 0.0100446428571432*G0_1_0_0_0_0 - 0.000231331168831178*G0_1_0_0_0_2 - 0.00165584415584421*G0_1_0_0_0_3 + 0.00267857142857152*G0_1_0_0_0_4 - 0.00681818181818207*G0_1_0_0_0_5 + 0.00328733766233776*G0_1_0_0_1_1 - 0.000121753246753253*G0_1_0_0_1_2 + 0.000487012987013005*G0_1_0_0_1_3 - 0.000487012987012999*G0_1_0_0_1_4 + 0.00487012987013006*G0_1_0_0_1_5 - 0.000231331168831178*G0_1_0_0_2_0 - 0.000121753246753253*G0_1_0_0_2_1 + 0.000572240259740282*G0_1_0_0_2_2 - 0.0016558441558442*G0_1_0_0_2_3 - 0.0022402597402598*G0_1_0_0_2_4 - 0.001948051948052*G0_1_0_0_2_5 - 0.00165584415584421*G0_1_0_0_3_0 + 0.000487012987013005*G0_1_0_0_3_1 - 0.0016558441558442*G0_1_0_0_3_2 + 0.000974025974026009*G0_1_0_0_3_3 + 0.00428571428571442*G0_1_0_0_3_4 + 0.00720779220779242*G0_1_0_0_3_5 + 0.00267857142857152*G0_1_0_0_4_0 - 0.000487012987012999*G0_1_0_0_4_1 - 0.00224025974025981*G0_1_0_0_4_2 + 0.00428571428571442*G0_1_0_0_4_3 + 0.00857142857142885*G0_1_0_0_4_4 + 0.00487012987013*G0_1_0_0_4_5 - 0.00681818181818207*G0_1_0_0_5_0 + 0.00487012987013006*G0_1_0_0_5_1 - 0.001948051948052*G0_1_0_0_5_2 + 0.00720779220779242*G0_1_0_0_5_3 + 0.00487012987013*G0_1_0_0_5_4 - 0.00175324675324698*G0_1_0_0_5_5 + 0.00328733766233776*G0_1_0_1_0_1 - 0.000121753246753253*G0_1_0_1_0_2 + 0.000487012987013005*G0_1_0_1_0_3 - 0.000487012987012999*G0_1_0_1_0_4 + 0.00487012987013006*G0_1_0_1_0_5 + 0.00328733766233776*G0_1_0_1_1_0 - 0.085470779220782*G0_1_0_1_1_1 + 0.00547889610389628*G0_1_0_1_1_2 - 0.0204545454545461*G0_1_0_1_1_3 - 0.00292207792207801*G0_1_0_1_1_4 - 0.0204545454545462*G0_1_0_1_1_5 - 0.000121753246753253*G0_1_0_1_2_0 + 0.00547889610389628*G0_1_0_1_2_1 - 0.000974025974026008*G0_1_0_1_2_3 - 0.00194805194805201*G0_1_0_1_2_4 - 0.00243506493506501*G0_1_0_1_2_5 + 0.000487012987013005*G0_1_0_1_3_0 - 0.0204545454545461*G0_1_0_1_3_1 - 0.000974025974026008*G0_1_0_1_3_2 - 0.00389610389610399*G0_1_0_1_3_3 + 0.00487012987013003*G0_1_0_1_3_4 + 0.00389610389610401*G0_1_0_1_3_5 - 0.000487012987012999*G0_1_0_1_4_0 - 0.00292207792207801*G0_1_0_1_4_1 - 0.00194805194805201*G0_1_0_1_4_2 + 0.00487012987013003*G0_1_0_1_4_3 + 0.00584415584415604*G0_1_0_1_4_4 + 0.0107142857142861*G0_1_0_1_4_5 + 0.00487012987013006*G0_1_0_1_5_0 - 0.0204545454545462*G0_1_0_1_5_1 - 0.00243506493506501*G0_1_0_1_5_2 + 0.00389610389610401*G0_1_0_1_5_3 + 0.0107142857142861*G0_1_0_1_5_4 + 0.0194805194805201*G0_1_0_1_5_5 - 0.000231331168831178*G0_1_0_2_0_0 - 0.000121753246753253*G0_1_0_2_0_1 + 0.000572240259740282*G0_1_0_2_0_2 - 0.0016558441558442*G0_1_0_2_0_3 - 0.0022402597402598*G0_1_0_2_0_4 - 0.001948051948052*G0_1_0_2_0_5 - 0.000121753246753253*G0_1_0_2_1_0 + 0.00547889610389628*G0_1_0_2_1_1 - 0.000974025974026008*G0_1_0_2_1_3 - 0.00194805194805201*G0_1_0_2_1_4 - 0.00243506493506501*G0_1_0_2_1_5 + 0.000572240259740282*G0_1_0_2_2_0 - 0.00025568181818188*G0_1_0_2_2_2 - 0.000681818181818211*G0_1_0_2_2_3 - 0.00199675324675334*G0_1_0_2_2_4 - 0.00487012987013003*G0_1_0_2_2_5 - 0.0016558441558442*G0_1_0_2_3_0 - 0.000974025974026007*G0_1_0_2_3_1 - 0.000681818181818211*G0_1_0_2_3_2 + 0.00876623376623403*G0_1_0_2_3_3 + 0.00720779220779244*G0_1_0_2_3_4 + 0.0130519480519485*G0_1_0_2_3_5 - 0.0022402597402598*G0_1_0_2_4_0 - 0.00194805194805201*G0_1_0_2_4_1 - 0.00199675324675334*G0_1_0_2_4_2 + 0.00720779220779244*G0_1_0_2_4_3 + 0.00623376623376641*G0_1_0_2_4_4 + 0.0136363636363641*G0_1_0_2_4_5 - 0.001948051948052*G0_1_0_2_5_0 - 0.00243506493506501*G0_1_0_2_5_1 - 0.00487012987013003*G0_1_0_2_5_2 + 0.0130519480519485*G0_1_0_2_5_3 + 0.0136363636363641*G0_1_0_2_5_4 + 0.0372077922077935*G0_1_0_2_5_5 - 0.00165584415584421*G0_1_0_3_0_0 + 0.000487012987013005*G0_1_0_3_0_1 - 0.0016558441558442*G0_1_0_3_0_2 + 0.00097402597402601*G0_1_0_3_0_3 + 0.00428571428571442*G0_1_0_3_0_4 + 0.00720779220779242*G0_1_0_3_0_5 + 0.000487012987013005*G0_1_0_3_1_0 - 0.0204545454545461*G0_1_0_3_1_1 - 0.000974025974026007*G0_1_0_3_1_2 - 0.00389610389610399*G0_1_0_3_1_3 + 0.00487012987013003*G0_1_0_3_1_4 + 0.00389610389610401*G0_1_0_3_1_5 - 0.0016558441558442*G0_1_0_3_2_0 - 0.000974025974026007*G0_1_0_3_2_1 - 0.000681818181818212*G0_1_0_3_2_2 + 0.00876623376623403*G0_1_0_3_2_3 + 0.00720779220779244*G0_1_0_3_2_4 + 0.0130519480519485*G0_1_0_3_2_5 + 0.000974025974026011*G0_1_0_3_3_0 - 0.00389610389610399*G0_1_0_3_3_1 + 0.00876623376623403*G0_1_0_3_3_2 + 0.0981818181818216*G0_1_0_3_3_3 - 0.0116883116883121*G0_1_0_3_3_4 - 0.0280519480519489*G0_1_0_3_3_5 + 0.00428571428571442*G0_1_0_3_4_0 + 0.00487012987013003*G0_1_0_3_4_1 + 0.00720779220779244*G0_1_0_3_4_2 - 0.0116883116883121*G0_1_0_3_4_3 - 0.0202597402597409*G0_1_0_3_4_4 - 0.035844155844157*G0_1_0_3_4_5 + 0.00720779220779242*G0_1_0_3_5_0 + 0.00389610389610401*G0_1_0_3_5_1 + 0.0130519480519485*G0_1_0_3_5_2 - 0.0280519480519489*G0_1_0_3_5_3 - 0.035844155844157*G0_1_0_3_5_4 - 0.0888311688311719*G0_1_0_3_5_5 + 0.00267857142857152*G0_1_0_4_0_0 - 0.000487012987012999*G0_1_0_4_0_1 - 0.0022402597402598*G0_1_0_4_0_2 + 0.00428571428571442*G0_1_0_4_0_3 + 0.00857142857142885*G0_1_0_4_0_4 + 0.00487012987013*G0_1_0_4_0_5 - 0.000487012987012999*G0_1_0_4_1_0 - 0.00292207792207801*G0_1_0_4_1_1 - 0.00194805194805201*G0_1_0_4_1_2 + 0.00487012987013003*G0_1_0_4_1_3 + 0.00584415584415604*G0_1_0_4_1_4 + 0.0107142857142861*G0_1_0_4_1_5 - 0.0022402597402598*G0_1_0_4_2_0 - 0.00194805194805201*G0_1_0_4_2_1 - 0.00199675324675334*G0_1_0_4_2_2 + 0.00720779220779244*G0_1_0_4_2_3 + 0.00623376623376641*G0_1_0_4_2_4 + 0.0136363636363641*G0_1_0_4_2_5 + 0.00428571428571442*G0_1_0_4_3_0 + 0.00487012987013003*G0_1_0_4_3_1 + 0.00720779220779244*G0_1_0_4_3_2 - 0.0116883116883121*G0_1_0_4_3_3 - 0.0202597402597409*G0_1_0_4_3_4 - 0.035844155844157*G0_1_0_4_3_5 + 0.00857142857142885*G0_1_0_4_4_0 + 0.00584415584415604*G0_1_0_4_4_1 + 0.00623376623376641*G0_1_0_4_4_2 - 0.0202597402597409*G0_1_0_4_4_3 - 0.0389610389610403*G0_1_0_4_4_5 + 0.00487012987013*G0_1_0_4_5_0 + 0.0107142857142861*G0_1_0_4_5_1 + 0.0136363636363641*G0_1_0_4_5_2 - 0.035844155844157*G0_1_0_4_5_3 - 0.0389610389610402*G0_1_0_4_5_4 - 0.0958441558441591*G0_1_0_4_5_5 - 0.00681818181818207*G0_1_0_5_0_0 + 0.00487012987013006*G0_1_0_5_0_1 - 0.001948051948052*G0_1_0_5_0_2 + 0.00720779220779242*G0_1_0_5_0_3 + 0.00487012987013*G0_1_0_5_0_4 - 0.00175324675324698*G0_1_0_5_0_5 + 0.00487012987013006*G0_1_0_5_1_0 - 0.0204545454545462*G0_1_0_5_1_1 - 0.00243506493506501*G0_1_0_5_1_2 + 0.00389610389610401*G0_1_0_5_1_3 + 0.0107142857142861*G0_1_0_5_1_4 + 0.0194805194805201*G0_1_0_5_1_5 - 0.001948051948052*G0_1_0_5_2_0 - 0.00243506493506501*G0_1_0_5_2_1 - 0.00487012987013003*G0_1_0_5_2_2 + 0.0130519480519485*G0_1_0_5_2_3 + 0.0136363636363641*G0_1_0_5_2_4 + 0.0372077922077935*G0_1_0_5_2_5 + 0.00720779220779242*G0_1_0_5_3_0 + 0.00389610389610401*G0_1_0_5_3_1 + 0.0130519480519485*G0_1_0_5_3_2 - 0.0280519480519489*G0_1_0_5_3_3 - 0.035844155844157*G0_1_0_5_3_4 - 0.0888311688311718*G0_1_0_5_3_5 + 0.00487012987013*G0_1_0_5_4_0 + 0.0107142857142861*G0_1_0_5_4_1 + 0.0136363636363641*G0_1_0_5_4_2 - 0.035844155844157*G0_1_0_5_4_3 - 0.0389610389610403*G0_1_0_5_4_4 - 0.0958441558441591*G0_1_0_5_4_5 - 0.00175324675324698*G0_1_0_5_5_0 + 0.0194805194805201*G0_1_0_5_5_1 + 0.0372077922077935*G0_1_0_5_5_2 - 0.0888311688311718*G0_1_0_5_5_3 - 0.0958441558441591*G0_1_0_5_5_4 - 0.448831168831185*G0_1_0_5_5_5; + A[21] = 0.00153409090909096*G0_1_0_0_0_0 + 0.000120851370851375*G0_1_0_0_0_1 + 0.000120851370851375*G0_1_0_0_0_2 + 9.92063492063519e-05*G0_1_0_0_0_3 + 0.000297619047619057*G0_1_0_0_0_4 + 0.000297619047619056*G0_1_0_0_0_5 + 0.000120851370851375*G0_1_0_0_1_0 - 0.00109397546897551*G0_1_0_0_1_1 + 7.35028860028885e-05*G0_1_0_0_1_2 - 9.74025974026005e-05*G0_1_0_0_1_3 + 0.000102813852813856*G0_1_0_0_1_4 - 0.000678210678210701*G0_1_0_0_1_5 + 0.000120851370851375*G0_1_0_0_2_0 + 7.35028860028885e-05*G0_1_0_0_2_1 - 0.00109397546897551*G0_1_0_0_2_2 - 9.74025974026016e-05*G0_1_0_0_2_3 - 0.000678210678210702*G0_1_0_0_2_4 + 0.000102813852813856*G0_1_0_0_2_5 + 9.92063492063519e-05*G0_1_0_0_3_0 - 9.74025974026004e-05*G0_1_0_0_3_1 - 9.74025974026016e-05*G0_1_0_0_3_2 - 2.88600288600292e-05*G0_1_0_0_3_3 - 0.000404040404040417*G0_1_0_0_3_4 - 0.000404040404040417*G0_1_0_0_3_5 + 0.000297619047619057*G0_1_0_0_4_0 + 0.000102813852813856*G0_1_0_0_4_1 - 0.000678210678210702*G0_1_0_0_4_2 - 0.000404040404040417*G0_1_0_0_4_3 - 0.00212121212121219*G0_1_0_0_4_4 - 0.000411255411255424*G0_1_0_0_4_5 + 0.000297619047619056*G0_1_0_0_5_0 - 0.0006782106782107*G0_1_0_0_5_1 + 0.000102813852813856*G0_1_0_0_5_2 - 0.000404040404040417*G0_1_0_0_5_3 - 0.000411255411255424*G0_1_0_0_5_4 - 0.00212121212121219*G0_1_0_0_5_5 + 0.000120851370851375*G0_1_0_1_0_0 - 0.00109397546897551*G0_1_0_1_0_1 + 7.35028860028885e-05*G0_1_0_1_0_2 - 9.74025974026005e-05*G0_1_0_1_0_3 + 0.000102813852813856*G0_1_0_1_0_4 - 0.000678210678210701*G0_1_0_1_0_5 - 0.00109397546897551*G0_1_0_1_1_0 + 0.0141233766233771*G0_1_0_1_1_1 - 0.00049873737373739*G0_1_0_1_1_2 + 0.00173160173160179*G0_1_0_1_1_3 + 0.000212842712842718*G0_1_0_1_1_4 + 0.00487012987013005*G0_1_0_1_1_5 + 7.35028860028885e-05*G0_1_0_1_2_0 - 0.00049873737373739*G0_1_0_1_2_1 - 0.000498737373737392*G0_1_0_1_2_2 + 0.000165945165945172*G0_1_0_1_2_3 - 0.00018398268398269*G0_1_0_1_2_4 - 0.00018398268398269*G0_1_0_1_2_5 - 9.74025974026004e-05*G0_1_0_1_3_0 + 0.00173160173160179*G0_1_0_1_3_1 + 0.000165945165945172*G0_1_0_1_3_2 - 0.000346320346320361*G0_1_0_1_3_3 - 0.000230880230880239*G0_1_0_1_3_4 + 0.000562770562770582*G0_1_0_1_3_5 + 0.000102813852813856*G0_1_0_1_4_0 + 0.000212842712842718*G0_1_0_1_4_1 - 0.00018398268398269*G0_1_0_1_4_2 - 0.000230880230880239*G0_1_0_1_4_3 - 0.000418470418470432*G0_1_0_1_4_4 - 5.77200577200606e-05*G0_1_0_1_4_5 - 0.0006782106782107*G0_1_0_1_5_0 + 0.00487012987013005*G0_1_0_1_5_1 - 0.00018398268398269*G0_1_0_1_5_2 + 0.000562770562770583*G0_1_0_1_5_3 - 5.77200577200606e-05*G0_1_0_1_5_4 + 0.00441558441558457*G0_1_0_1_5_5 + 0.000120851370851375*G0_1_0_2_0_0 + 7.35028860028885e-05*G0_1_0_2_0_1 - 0.00109397546897551*G0_1_0_2_0_2 - 9.74025974026016e-05*G0_1_0_2_0_3 - 0.000678210678210702*G0_1_0_2_0_4 + 0.000102813852813856*G0_1_0_2_0_5 + 7.35028860028885e-05*G0_1_0_2_1_0 - 0.00049873737373739*G0_1_0_2_1_1 - 0.000498737373737392*G0_1_0_2_1_2 + 0.000165945165945172*G0_1_0_2_1_3 - 0.00018398268398269*G0_1_0_2_1_4 - 0.00018398268398269*G0_1_0_2_1_5 - 0.00109397546897551*G0_1_0_2_2_0 - 0.000498737373737392*G0_1_0_2_2_1 + 0.0141233766233772*G0_1_0_2_2_2 + 0.0017316017316018*G0_1_0_2_2_3 + 0.00487012987013005*G0_1_0_2_2_4 + 0.000212842712842723*G0_1_0_2_2_5 - 9.74025974026017e-05*G0_1_0_2_3_0 + 0.000165945165945172*G0_1_0_2_3_1 + 0.0017316017316018*G0_1_0_2_3_2 - 0.000346320346320354*G0_1_0_2_3_3 + 0.000562770562770585*G0_1_0_2_3_4 - 0.000230880230880237*G0_1_0_2_3_5 - 0.000678210678210702*G0_1_0_2_4_0 - 0.00018398268398269*G0_1_0_2_4_1 + 0.00487012987013005*G0_1_0_2_4_2 + 0.000562770562770585*G0_1_0_2_4_3 + 0.00441558441558457*G0_1_0_2_4_4 - 5.77200577200582e-05*G0_1_0_2_4_5 + 0.000102813852813856*G0_1_0_2_5_0 - 0.00018398268398269*G0_1_0_2_5_1 + 0.000212842712842723*G0_1_0_2_5_2 - 0.000230880230880237*G0_1_0_2_5_3 - 5.77200577200583e-05*G0_1_0_2_5_4 - 0.000418470418470432*G0_1_0_2_5_5 + 9.92063492063519e-05*G0_1_0_3_0_0 - 9.74025974026004e-05*G0_1_0_3_0_1 - 9.74025974026016e-05*G0_1_0_3_0_2 - 2.88600288600292e-05*G0_1_0_3_0_3 - 0.000404040404040417*G0_1_0_3_0_4 - 0.000404040404040417*G0_1_0_3_0_5 - 9.74025974026004e-05*G0_1_0_3_1_0 + 0.00173160173160179*G0_1_0_3_1_1 + 0.000165945165945172*G0_1_0_3_1_2 - 0.000346320346320361*G0_1_0_3_1_3 - 0.000230880230880239*G0_1_0_3_1_4 + 0.000562770562770582*G0_1_0_3_1_5 - 9.74025974026017e-05*G0_1_0_3_2_0 + 0.000165945165945172*G0_1_0_3_2_1 + 0.0017316017316018*G0_1_0_3_2_2 - 0.000346320346320354*G0_1_0_3_2_3 + 0.000562770562770585*G0_1_0_3_2_4 - 0.000230880230880237*G0_1_0_3_2_5 - 2.88600288600292e-05*G0_1_0_3_3_0 - 0.000346320346320361*G0_1_0_3_3_1 - 0.000346320346320354*G0_1_0_3_3_2 - 0.00571428571428593*G0_1_0_3_3_3 + 0.000519480519480535*G0_1_0_3_3_4 + 0.000519480519480531*G0_1_0_3_3_5 - 0.000404040404040417*G0_1_0_3_4_0 - 0.000230880230880239*G0_1_0_3_4_1 + 0.000562770562770585*G0_1_0_3_4_2 + 0.000519480519480534*G0_1_0_3_4_3 + 0.0016450216450217*G0_1_0_3_4_4 + 0.000923520923520953*G0_1_0_3_4_5 - 0.000404040404040417*G0_1_0_3_5_0 + 0.000562770562770583*G0_1_0_3_5_1 - 0.000230880230880237*G0_1_0_3_5_2 + 0.000519480519480531*G0_1_0_3_5_3 + 0.000923520923520953*G0_1_0_3_5_4 + 0.0016450216450217*G0_1_0_3_5_5 + 0.000297619047619057*G0_1_0_4_0_0 + 0.000102813852813856*G0_1_0_4_0_1 - 0.000678210678210702*G0_1_0_4_0_2 - 0.000404040404040417*G0_1_0_4_0_3 - 0.00212121212121219*G0_1_0_4_0_4 - 0.000411255411255424*G0_1_0_4_0_5 + 0.000102813852813856*G0_1_0_4_1_0 + 0.000212842712842718*G0_1_0_4_1_1 - 0.00018398268398269*G0_1_0_4_1_2 - 0.000230880230880239*G0_1_0_4_1_3 - 0.000418470418470432*G0_1_0_4_1_4 - 5.77200577200606e-05*G0_1_0_4_1_5 - 0.000678210678210702*G0_1_0_4_2_0 - 0.00018398268398269*G0_1_0_4_2_1 + 0.00487012987013005*G0_1_0_4_2_2 + 0.000562770562770585*G0_1_0_4_2_3 + 0.00441558441558457*G0_1_0_4_2_4 - 5.77200577200582e-05*G0_1_0_4_2_5 - 0.000404040404040417*G0_1_0_4_3_0 - 0.000230880230880239*G0_1_0_4_3_1 + 0.000562770562770585*G0_1_0_4_3_2 + 0.000519480519480534*G0_1_0_4_3_3 + 0.0016450216450217*G0_1_0_4_3_4 + 0.000923520923520953*G0_1_0_4_3_5 - 0.00212121212121219*G0_1_0_4_4_0 - 0.000418470418470432*G0_1_0_4_4_1 + 0.00441558441558457*G0_1_0_4_4_2 + 0.0016450216450217*G0_1_0_4_4_3 + 0.00441558441558457*G0_1_0_4_4_4 + 0.000952380952380986*G0_1_0_4_4_5 - 0.000411255411255424*G0_1_0_4_5_0 - 5.77200577200606e-05*G0_1_0_4_5_1 - 5.77200577200582e-05*G0_1_0_4_5_2 + 0.000923520923520953*G0_1_0_4_5_3 + 0.000952380952380985*G0_1_0_4_5_4 + 0.000952380952380983*G0_1_0_4_5_5 + 0.000297619047619056*G0_1_0_5_0_0 - 0.000678210678210701*G0_1_0_5_0_1 + 0.000102813852813856*G0_1_0_5_0_2 - 0.000404040404040417*G0_1_0_5_0_3 - 0.000411255411255424*G0_1_0_5_0_4 - 0.00212121212121219*G0_1_0_5_0_5 - 0.0006782106782107*G0_1_0_5_1_0 + 0.00487012987013005*G0_1_0_5_1_1 - 0.00018398268398269*G0_1_0_5_1_2 + 0.000562770562770583*G0_1_0_5_1_3 - 5.77200577200606e-05*G0_1_0_5_1_4 + 0.00441558441558457*G0_1_0_5_1_5 + 0.000102813852813856*G0_1_0_5_2_0 - 0.00018398268398269*G0_1_0_5_2_1 + 0.000212842712842723*G0_1_0_5_2_2 - 0.000230880230880237*G0_1_0_5_2_3 - 5.77200577200583e-05*G0_1_0_5_2_4 - 0.000418470418470432*G0_1_0_5_2_5 - 0.000404040404040417*G0_1_0_5_3_0 + 0.000562770562770583*G0_1_0_5_3_1 - 0.000230880230880237*G0_1_0_5_3_2 + 0.000519480519480531*G0_1_0_5_3_3 + 0.000923520923520953*G0_1_0_5_3_4 + 0.0016450216450217*G0_1_0_5_3_5 - 0.000411255411255424*G0_1_0_5_4_0 - 5.77200577200606e-05*G0_1_0_5_4_1 - 5.77200577200582e-05*G0_1_0_5_4_2 + 0.000923520923520953*G0_1_0_5_4_3 + 0.000952380952380985*G0_1_0_5_4_4 + 0.000952380952380983*G0_1_0_5_4_5 - 0.00212121212121219*G0_1_0_5_5_0 + 0.00441558441558457*G0_1_0_5_5_1 - 0.000418470418470432*G0_1_0_5_5_2 + 0.0016450216450217*G0_1_0_5_5_3 + 0.000952380952380983*G0_1_0_5_5_4 + 0.00441558441558456*G0_1_0_5_5_5; + A[1] = -A[21] - 0.0141233766233771*G0_0_0_0_0_0 + 0.000498737373737389*G0_0_0_0_0_1 + 0.00109397546897551*G0_0_0_0_0_2 - 0.000212842712842718*G0_0_0_0_0_3 - 0.00487012987013003*G0_0_0_0_0_4 - 0.00173160173160179*G0_0_0_0_0_5 + 0.000498737373737389*G0_0_0_0_1_0 + 0.000498737373737392*G0_0_0_0_1_1 + 0.000183982683982691*G0_0_0_0_1_3 + 0.00018398268398269*G0_0_0_0_1_4 - 0.00016594516594517*G0_0_0_0_1_5 + 0.00109397546897551*G0_0_0_0_2_0 - 0.000120851370851374*G0_0_0_0_2_2 - 0.000102813852813856*G0_0_0_0_2_3 + 0.000678210678210701*G0_0_0_0_2_4 - 0.000212842712842718*G0_0_0_0_3_0 + 0.000183982683982691*G0_0_0_0_3_1 - 0.000102813852813856*G0_0_0_0_3_2 + 0.000418470418470433*G0_0_0_0_3_3 + 0.000230880230880239*G0_0_0_0_3_5 - 0.00487012987013003*G0_0_0_0_4_0 + 0.00018398268398269*G0_0_0_0_4_1 + 0.000678210678210701*G0_0_0_0_4_2 - 0.00441558441558456*G0_0_0_0_4_4 - 0.000562770562770582*G0_0_0_0_4_5 - 0.00173160173160179*G0_0_0_0_5_0 - 0.00016594516594517*G0_0_0_0_5_1 + 0.000230880230880239*G0_0_0_0_5_3 - 0.000562770562770582*G0_0_0_0_5_4 + 0.000346320346320361*G0_0_0_0_5_5 + 0.000498737373737389*G0_0_0_1_0_0 + 0.000498737373737391*G0_0_0_1_0_1 + 0.000183982683982691*G0_0_0_1_0_3 + 0.00018398268398269*G0_0_0_1_0_4 - 0.00016594516594517*G0_0_0_1_0_5 + 0.000498737373737391*G0_0_0_1_1_0 - 0.0141233766233771*G0_0_0_1_1_1 + 0.00109397546897551*G0_0_0_1_1_2 - 0.00487012987013004*G0_0_0_1_1_3 - 0.000212842712842719*G0_0_0_1_1_4 - 0.00173160173160181*G0_0_0_1_1_5 + 0.00109397546897551*G0_0_0_1_2_1 - 0.000120851370851375*G0_0_0_1_2_2 + 0.000678210678210703*G0_0_0_1_2_3 - 0.000102813852813856*G0_0_0_1_2_4 + 0.000183982683982691*G0_0_0_1_3_0 - 0.00487012987013004*G0_0_0_1_3_1 + 0.000678210678210703*G0_0_0_1_3_2 - 0.00441558441558457*G0_0_0_1_3_3 - 0.000562770562770589*G0_0_0_1_3_5 + 0.00018398268398269*G0_0_0_1_4_0 - 0.000212842712842719*G0_0_0_1_4_1 - 0.000102813852813856*G0_0_0_1_4_2 + 0.000418470418470432*G0_0_0_1_4_4 + 0.000230880230880237*G0_0_0_1_4_5 - 0.00016594516594517*G0_0_0_1_5_0 - 0.00173160173160181*G0_0_0_1_5_1 - 0.000562770562770589*G0_0_0_1_5_3 + 0.000230880230880237*G0_0_0_1_5_4 + 0.000346320346320349*G0_0_0_1_5_5 + 0.00109397546897551*G0_0_0_2_0_0 - 0.000120851370851374*G0_0_0_2_0_2 - 0.000102813852813856*G0_0_0_2_0_3 + 0.000678210678210701*G0_0_0_2_0_4 + 0.00109397546897551*G0_0_0_2_1_1 - 0.000120851370851375*G0_0_0_2_1_2 + 0.000678210678210703*G0_0_0_2_1_3 - 0.000102813852813856*G0_0_0_2_1_4 - 0.000120851370851374*G0_0_0_2_2_0 - 0.000120851370851375*G0_0_0_2_2_1 - 0.00153409090909097*G0_0_0_2_2_2 - 0.00029761904761906*G0_0_0_2_2_3 - 0.000297619047619059*G0_0_0_2_2_4 - 0.000102813852813856*G0_0_0_2_3_0 + 0.000678210678210703*G0_0_0_2_3_1 - 0.00029761904761906*G0_0_0_2_3_2 + 0.00212121212121219*G0_0_0_2_3_3 + 0.000411255411255424*G0_0_0_2_3_4 + 0.000404040404040418*G0_0_0_2_3_5 + 0.000678210678210701*G0_0_0_2_4_0 - 0.000102813852813856*G0_0_0_2_4_1 - 0.000297619047619059*G0_0_0_2_4_2 + 0.000411255411255424*G0_0_0_2_4_3 + 0.00212121212121219*G0_0_0_2_4_4 + 0.000404040404040417*G0_0_0_2_4_5 + 0.000404040404040418*G0_0_0_2_5_3 + 0.000404040404040417*G0_0_0_2_5_4 - 0.000212842712842718*G0_0_0_3_0_0 + 0.000183982683982691*G0_0_0_3_0_1 - 0.000102813852813856*G0_0_0_3_0_2 + 0.000418470418470433*G0_0_0_3_0_3 + 0.000230880230880239*G0_0_0_3_0_5 + 0.000183982683982691*G0_0_0_3_1_0 - 0.00487012987013004*G0_0_0_3_1_1 + 0.000678210678210703*G0_0_0_3_1_2 - 0.00441558441558457*G0_0_0_3_1_3 - 0.000562770562770589*G0_0_0_3_1_5 - 0.000102813852813856*G0_0_0_3_2_0 + 0.000678210678210703*G0_0_0_3_2_1 - 0.00029761904761906*G0_0_0_3_2_2 + 0.00212121212121219*G0_0_0_3_2_3 + 0.000411255411255424*G0_0_0_3_2_4 + 0.000404040404040418*G0_0_0_3_2_5 + 0.000418470418470433*G0_0_0_3_3_0 - 0.00441558441558457*G0_0_0_3_3_1 + 0.00212121212121219*G0_0_0_3_3_2 - 0.00441558441558457*G0_0_0_3_3_3 - 0.000952380952380982*G0_0_0_3_3_4 - 0.0016450216450217*G0_0_0_3_3_5 + 0.000411255411255424*G0_0_0_3_4_2 - 0.000952380952380982*G0_0_0_3_4_3 - 0.000952380952380981*G0_0_0_3_4_4 - 0.000923520923520952*G0_0_0_3_4_5 + 0.000230880230880239*G0_0_0_3_5_0 - 0.000562770562770589*G0_0_0_3_5_1 + 0.000404040404040418*G0_0_0_3_5_2 - 0.0016450216450217*G0_0_0_3_5_3 - 0.000923520923520952*G0_0_0_3_5_4 - 0.000519480519480538*G0_0_0_3_5_5 - 0.00487012987013003*G0_0_0_4_0_0 + 0.00018398268398269*G0_0_0_4_0_1 + 0.000678210678210701*G0_0_0_4_0_2 - 0.00441558441558456*G0_0_0_4_0_4 - 0.000562770562770582*G0_0_0_4_0_5 + 0.00018398268398269*G0_0_0_4_1_0 - 0.000212842712842719*G0_0_0_4_1_1 - 0.000102813852813856*G0_0_0_4_1_2 + 0.000418470418470432*G0_0_0_4_1_4 + 0.000230880230880237*G0_0_0_4_1_5 + 0.000678210678210701*G0_0_0_4_2_0 - 0.000102813852813856*G0_0_0_4_2_1 - 0.000297619047619059*G0_0_0_4_2_2 + 0.000411255411255424*G0_0_0_4_2_3 + 0.00212121212121219*G0_0_0_4_2_4 + 0.000404040404040417*G0_0_0_4_2_5 + 0.000411255411255424*G0_0_0_4_3_2 - 0.000952380952380982*G0_0_0_4_3_3 - 0.000952380952380981*G0_0_0_4_3_4 - 0.000923520923520952*G0_0_0_4_3_5 - 0.00441558441558456*G0_0_0_4_4_0 + 0.000418470418470432*G0_0_0_4_4_1 + 0.00212121212121219*G0_0_0_4_4_2 - 0.00095238095238098*G0_0_0_4_4_3 - 0.00441558441558455*G0_0_0_4_4_4 - 0.0016450216450217*G0_0_0_4_4_5 - 0.000562770562770583*G0_0_0_4_5_0 + 0.000230880230880237*G0_0_0_4_5_1 + 0.000404040404040417*G0_0_0_4_5_2 - 0.000923520923520952*G0_0_0_4_5_3 - 0.0016450216450217*G0_0_0_4_5_4 - 0.000519480519480535*G0_0_0_4_5_5 - 0.00173160173160179*G0_0_0_5_0_0 - 0.00016594516594517*G0_0_0_5_0_1 + 0.000230880230880239*G0_0_0_5_0_3 - 0.000562770562770583*G0_0_0_5_0_4 + 0.000346320346320361*G0_0_0_5_0_5 - 0.00016594516594517*G0_0_0_5_1_0 - 0.00173160173160181*G0_0_0_5_1_1 - 0.000562770562770589*G0_0_0_5_1_3 + 0.000230880230880237*G0_0_0_5_1_4 + 0.000346320346320349*G0_0_0_5_1_5 + 0.000404040404040418*G0_0_0_5_2_3 + 0.000404040404040417*G0_0_0_5_2_4 + 0.000230880230880239*G0_0_0_5_3_0 - 0.000562770562770589*G0_0_0_5_3_1 + 0.000404040404040418*G0_0_0_5_3_2 - 0.0016450216450217*G0_0_0_5_3_3 - 0.000923520923520952*G0_0_0_5_3_4 - 0.000519480519480538*G0_0_0_5_3_5 - 0.000562770562770583*G0_0_0_5_4_0 + 0.000230880230880237*G0_0_0_5_4_1 + 0.000404040404040417*G0_0_0_5_4_2 - 0.000923520923520952*G0_0_0_5_4_3 - 0.0016450216450217*G0_0_0_5_4_4 - 0.000519480519480535*G0_0_0_5_4_5 + 0.000346320346320361*G0_0_0_5_5_0 + 0.000346320346320349*G0_0_0_5_5_1 - 0.000519480519480538*G0_0_0_5_5_3 - 0.000519480519480535*G0_0_0_5_5_4 + 0.00571428571428592*G0_0_0_5_5_5 - 0.0125892857142861*G0_1_0_0_0_0 + 0.000619588744588763*G0_1_0_0_0_1 + 0.00121482683982688*G0_1_0_0_0_2 - 0.000113636363636366*G0_1_0_0_0_3 - 0.00457251082251097*G0_1_0_0_0_4 - 0.00143398268398273*G0_1_0_0_0_5 + 0.000619588744588763*G0_1_0_0_1_0 - 0.000595238095238114*G0_1_0_0_1_1 + 0.000286796536796547*G0_1_0_0_1_4 - 0.000844155844155871*G0_1_0_0_1_5 + 0.00121482683982688*G0_1_0_0_2_0 - 0.00121482683982688*G0_1_0_0_2_2 - 0.000200216450216458*G0_1_0_0_2_3 + 0.000200216450216456*G0_1_0_0_2_5 - 0.000113636363636366*G0_1_0_0_3_0 - 0.000200216450216458*G0_1_0_0_3_2 + 0.000389610389610403*G0_1_0_0_3_3 - 0.000346320346320357*G0_1_0_0_3_4 - 0.000173160173160178*G0_1_0_0_3_5 - 0.00457251082251097*G0_1_0_0_4_0 + 0.000286796536796547*G0_1_0_0_4_1 - 0.000346320346320357*G0_1_0_0_4_3 - 0.00653679653679675*G0_1_0_0_4_4 - 0.000974025974026007*G0_1_0_0_4_5 - 0.00143398268398273*G0_1_0_0_5_0 - 0.000844155844155871*G0_1_0_0_5_1 + 0.000200216450216456*G0_1_0_0_5_2 - 0.000173160173160178*G0_1_0_0_5_3 - 0.000974025974026006*G0_1_0_0_5_4 - 0.00177489177489183*G0_1_0_0_5_5 + 0.000619588744588763*G0_1_0_1_0_0 - 0.000595238095238114*G0_1_0_1_0_1 + 0.000286796536796547*G0_1_0_1_0_4 - 0.000844155844155871*G0_1_0_1_0_5 - 0.000595238095238114*G0_1_0_1_1_0 + 0.000595238095238116*G0_1_0_1_1_2 - 0.00313852813852825*G0_1_0_1_1_3 + 0.00313852813852824*G0_1_0_1_1_5 + 0.000595238095238116*G0_1_0_1_2_1 - 0.000619588744588767*G0_1_0_1_2_2 + 0.000844155844155874*G0_1_0_1_2_3 - 0.000286796536796546*G0_1_0_1_2_4 - 0.00313852813852825*G0_1_0_1_3_1 + 0.000844155844155874*G0_1_0_1_3_2 - 0.00476190476190493*G0_1_0_1_3_3 - 0.00017316017316018*G0_1_0_1_3_4 + 0.000286796536796547*G0_1_0_1_4_0 - 0.000286796536796546*G0_1_0_1_4_2 - 0.00017316017316018*G0_1_0_1_4_3 + 0.000173160173160177*G0_1_0_1_4_5 - 0.000844155844155871*G0_1_0_1_5_0 + 0.00313852813852824*G0_1_0_1_5_1 + 0.000173160173160177*G0_1_0_1_5_4 + 0.00476190476190492*G0_1_0_1_5_5 + 0.00121482683982688*G0_1_0_2_0_0 - 0.00121482683982688*G0_1_0_2_0_2 - 0.000200216450216458*G0_1_0_2_0_3 + 0.000200216450216456*G0_1_0_2_0_5 + 0.000595238095238116*G0_1_0_2_1_1 - 0.000619588744588767*G0_1_0_2_1_2 + 0.000844155844155874*G0_1_0_2_1_3 - 0.000286796536796546*G0_1_0_2_1_4 - 0.00121482683982688*G0_1_0_2_2_0 - 0.000619588744588767*G0_1_0_2_2_1 + 0.0125892857142862*G0_1_0_2_2_2 + 0.00143398268398274*G0_1_0_2_2_3 + 0.00457251082251099*G0_1_0_2_2_4 + 0.00011363636363637*G0_1_0_2_2_5 - 0.000200216450216458*G0_1_0_2_3_0 + 0.000844155844155874*G0_1_0_2_3_1 + 0.00143398268398274*G0_1_0_2_3_2 + 0.00177489177489184*G0_1_0_2_3_3 + 0.000974025974026009*G0_1_0_2_3_4 + 0.000173160173160181*G0_1_0_2_3_5 - 0.000286796536796546*G0_1_0_2_4_1 + 0.00457251082251099*G0_1_0_2_4_2 + 0.000974025974026009*G0_1_0_2_4_3 + 0.00653679653679676*G0_1_0_2_4_4 + 0.000346320346320359*G0_1_0_2_4_5 + 0.000200216450216456*G0_1_0_2_5_0 + 0.00011363636363637*G0_1_0_2_5_2 + 0.000173160173160181*G0_1_0_2_5_3 + 0.000346320346320359*G0_1_0_2_5_4 - 0.000389610389610403*G0_1_0_2_5_5 - 0.000113636363636366*G0_1_0_3_0_0 - 0.000200216450216458*G0_1_0_3_0_2 + 0.000389610389610403*G0_1_0_3_0_3 - 0.000346320346320357*G0_1_0_3_0_4 - 0.000173160173160178*G0_1_0_3_0_5 - 0.00313852813852825*G0_1_0_3_1_1 + 0.000844155844155874*G0_1_0_3_1_2 - 0.00476190476190493*G0_1_0_3_1_3 - 0.00017316017316018*G0_1_0_3_1_4 - 0.000200216450216458*G0_1_0_3_2_0 + 0.000844155844155874*G0_1_0_3_2_1 + 0.00143398268398274*G0_1_0_3_2_2 + 0.00177489177489184*G0_1_0_3_2_3 + 0.000974025974026009*G0_1_0_3_2_4 + 0.000173160173160181*G0_1_0_3_2_5 + 0.000389610389610403*G0_1_0_3_3_0 - 0.00476190476190493*G0_1_0_3_3_1 + 0.00177489177489184*G0_1_0_3_3_2 - 0.0101298701298705*G0_1_0_3_3_3 - 0.000432900432900447*G0_1_0_3_3_4 - 0.00112554112554117*G0_1_0_3_3_5 - 0.000346320346320357*G0_1_0_3_4_0 - 0.00017316017316018*G0_1_0_3_4_1 + 0.000974025974026009*G0_1_0_3_4_2 - 0.000432900432900447*G0_1_0_3_4_3 + 0.000692640692640719*G0_1_0_3_4_4 - 0.000173160173160178*G0_1_0_3_5_0 + 0.000173160173160181*G0_1_0_3_5_2 - 0.00112554112554117*G0_1_0_3_5_3 + 0.00112554112554116*G0_1_0_3_5_5 - 0.00457251082251097*G0_1_0_4_0_0 + 0.000286796536796547*G0_1_0_4_0_1 - 0.000346320346320357*G0_1_0_4_0_3 - 0.00653679653679675*G0_1_0_4_0_4 - 0.000974025974026007*G0_1_0_4_0_5 + 0.000286796536796547*G0_1_0_4_1_0 - 0.000286796536796546*G0_1_0_4_1_2 - 0.00017316017316018*G0_1_0_4_1_3 + 0.000173160173160177*G0_1_0_4_1_5 - 0.000286796536796546*G0_1_0_4_2_1 + 0.00457251082251099*G0_1_0_4_2_2 + 0.000974025974026009*G0_1_0_4_2_3 + 0.00653679653679676*G0_1_0_4_2_4 + 0.000346320346320359*G0_1_0_4_2_5 - 0.000346320346320357*G0_1_0_4_3_0 - 0.00017316017316018*G0_1_0_4_3_1 + 0.000974025974026009*G0_1_0_4_3_2 - 0.000432900432900447*G0_1_0_4_3_3 + 0.000692640692640719*G0_1_0_4_3_4 - 0.00653679653679675*G0_1_0_4_4_0 + 0.00653679653679676*G0_1_0_4_4_2 + 0.000692640692640719*G0_1_0_4_4_3 - 0.000692640692640712*G0_1_0_4_4_5 - 0.000974025974026007*G0_1_0_4_5_0 + 0.000173160173160177*G0_1_0_4_5_1 + 0.000346320346320359*G0_1_0_4_5_2 - 0.000692640692640712*G0_1_0_4_5_4 + 0.000432900432900448*G0_1_0_4_5_5 - 0.00143398268398273*G0_1_0_5_0_0 - 0.000844155844155871*G0_1_0_5_0_1 + 0.000200216450216456*G0_1_0_5_0_2 - 0.000173160173160178*G0_1_0_5_0_3 - 0.000974025974026007*G0_1_0_5_0_4 - 0.00177489177489183*G0_1_0_5_0_5 - 0.000844155844155871*G0_1_0_5_1_0 + 0.00313852813852824*G0_1_0_5_1_1 + 0.000173160173160177*G0_1_0_5_1_4 + 0.00476190476190492*G0_1_0_5_1_5 + 0.000200216450216456*G0_1_0_5_2_0 + 0.00011363636363637*G0_1_0_5_2_2 + 0.000173160173160181*G0_1_0_5_2_3 + 0.000346320346320359*G0_1_0_5_2_4 - 0.000389610389610403*G0_1_0_5_2_5 - 0.000173160173160178*G0_1_0_5_3_0 + 0.000173160173160181*G0_1_0_5_3_2 - 0.00112554112554117*G0_1_0_5_3_3 + 0.00112554112554116*G0_1_0_5_3_5 - 0.000974025974026007*G0_1_0_5_4_0 + 0.000173160173160177*G0_1_0_5_4_1 + 0.000346320346320359*G0_1_0_5_4_2 - 0.000692640692640712*G0_1_0_5_4_4 + 0.000432900432900448*G0_1_0_5_4_5 - 0.00177489177489183*G0_1_0_5_5_0 + 0.00476190476190492*G0_1_0_5_5_1 - 0.000389610389610403*G0_1_0_5_5_2 + 0.00112554112554116*G0_1_0_5_5_3 + 0.000432900432900448*G0_1_0_5_5_4 + 0.0101298701298705*G0_1_0_5_5_5; + A[15] = -A[16] - 0.00429383116883131*G0_0_0_0_0_0 + 0.000262445887445896*G0_0_0_0_0_1 + 0.000324675324675336*G0_0_0_0_0_2 + 0.000167748917748923*G0_0_0_0_0_3 - 0.00461580086580102*G0_0_0_0_0_4 - 0.000416666666666682*G0_0_0_0_0_5 + 0.000262445887445896*G0_0_0_0_1_0 - 0.000679112554112577*G0_0_0_0_1_1 - 0.000183982683982692*G0_0_0_0_1_3 + 0.000286796536796547*G0_0_0_0_1_4 - 0.000194805194805203*G0_0_0_0_1_5 + 0.000324675324675336*G0_0_0_0_2_0 + 0.00153950216450222*G0_0_0_0_2_2 + 0.00063852813852816*G0_0_0_0_2_3 + 0.00360389610389623*G0_0_0_0_2_4 + 0.000438311688311703*G0_0_0_0_2_5 + 0.000167748917748923*G0_0_0_0_3_0 - 0.000183982683982691*G0_0_0_0_3_1 + 0.00063852813852816*G0_0_0_0_3_2 - 0.00225108225108232*G0_0_0_0_3_3 - 0.000909090909090936*G0_0_0_0_3_4 - 0.00121212121212125*G0_0_0_0_3_5 - 0.00461580086580102*G0_0_0_0_4_0 + 0.000286796536796547*G0_0_0_0_4_1 + 0.00360389610389623*G0_0_0_0_4_2 - 0.000909090909090936*G0_0_0_0_4_3 - 0.0029870129870131*G0_0_0_0_4_4 - 0.0014502164502165*G0_0_0_0_4_5 - 0.000416666666666681*G0_0_0_0_5_0 - 0.000194805194805203*G0_0_0_0_5_1 + 0.000438311688311703*G0_0_0_0_5_2 - 0.00121212121212125*G0_0_0_0_5_3 - 0.0014502164502165*G0_0_0_0_5_4 - 0.00073593073593076*G0_0_0_0_5_5 + 0.000262445887445896*G0_0_0_1_0_0 - 0.000679112554112577*G0_0_0_1_0_1 - 0.000183982683982692*G0_0_0_1_0_3 + 0.000286796536796547*G0_0_0_1_0_4 - 0.000194805194805203*G0_0_0_1_0_5 - 0.000679112554112577*G0_0_0_1_1_0 + 0.00868506493506521*G0_0_0_1_1_1 - 0.00127435064935069*G0_0_0_1_1_2 + 0.00595238095238116*G0_0_0_1_1_3 + 0.000573593073593093*G0_0_0_1_1_4 + 0.00281385281385292*G0_0_0_1_1_5 - 0.00127435064935069*G0_0_0_1_2_1 + 0.000882034632034664*G0_0_0_1_2_2 - 0.00103896103896108*G0_0_0_1_2_3 + 0.000573593073593093*G0_0_0_1_2_4 - 0.000183982683982691*G0_0_0_1_3_0 + 0.00595238095238116*G0_0_0_1_3_1 - 0.00103896103896108*G0_0_0_1_3_2 + 0.00441558441558457*G0_0_0_1_3_3 - 0.000779220779220803*G0_0_0_1_3_4 + 0.000562770562770591*G0_0_0_1_3_5 + 0.000286796536796547*G0_0_0_1_4_0 + 0.000573593073593093*G0_0_0_1_4_1 + 0.000573593073593093*G0_0_0_1_4_2 - 0.000779220779220803*G0_0_0_1_4_3 + 0.00190476190476196*G0_0_0_1_4_4 - 0.000952380952380983*G0_0_0_1_4_5 - 0.000194805194805203*G0_0_0_1_5_0 + 0.00281385281385292*G0_0_0_1_5_1 + 0.000562770562770591*G0_0_0_1_5_3 - 0.000952380952380983*G0_0_0_1_5_4 - 0.000346320346320349*G0_0_0_1_5_5 + 0.000324675324675336*G0_0_0_2_0_0 + 0.00153950216450222*G0_0_0_2_0_2 + 0.00063852813852816*G0_0_0_2_0_3 + 0.00360389610389623*G0_0_0_2_0_4 + 0.000438311688311703*G0_0_0_2_0_5 - 0.00127435064935069*G0_0_0_2_1_1 + 0.000882034632034664*G0_0_0_2_1_2 - 0.00103896103896108*G0_0_0_2_1_3 + 0.000573593073593093*G0_0_0_2_1_4 + 0.00153950216450222*G0_0_0_2_2_0 + 0.000882034632034664*G0_0_0_2_2_1 - 0.0168831168831175*G0_0_0_2_2_2 - 0.00185064935064942*G0_0_0_2_2_3 - 0.00918831168831202*G0_0_0_2_2_4 + 0.00063852813852816*G0_0_0_2_3_0 - 0.00103896103896108*G0_0_0_2_3_1 - 0.00185064935064942*G0_0_0_2_3_2 - 0.0025108225108226*G0_0_0_2_3_3 - 0.00242424242424251*G0_0_0_2_3_4 - 0.00138528138528143*G0_0_0_2_3_5 + 0.00360389610389623*G0_0_0_2_4_0 + 0.000573593073593093*G0_0_0_2_4_1 - 0.00918831168831202*G0_0_0_2_4_2 - 0.00242424242424251*G0_0_0_2_4_3 - 0.00952380952380985*G0_0_0_2_4_4 - 0.0012554112554113*G0_0_0_2_4_5 + 0.000438311688311703*G0_0_0_2_5_0 - 0.00138528138528143*G0_0_0_2_5_3 - 0.0012554112554113*G0_0_0_2_5_4 - 0.00186147186147192*G0_0_0_2_5_5 + 0.000167748917748923*G0_0_0_3_0_0 - 0.000183982683982691*G0_0_0_3_0_1 + 0.00063852813852816*G0_0_0_3_0_2 - 0.00225108225108232*G0_0_0_3_0_3 - 0.000909090909090936*G0_0_0_3_0_4 - 0.00121212121212125*G0_0_0_3_0_5 - 0.000183982683982692*G0_0_0_3_1_0 + 0.00595238095238116*G0_0_0_3_1_1 - 0.00103896103896108*G0_0_0_3_1_2 + 0.00441558441558458*G0_0_0_3_1_3 - 0.000779220779220803*G0_0_0_3_1_4 + 0.000562770562770591*G0_0_0_3_1_5 + 0.00063852813852816*G0_0_0_3_2_0 - 0.00103896103896108*G0_0_0_3_2_1 - 0.00185064935064942*G0_0_0_3_2_2 - 0.0025108225108226*G0_0_0_3_2_3 - 0.00242424242424251*G0_0_0_3_2_4 - 0.00138528138528143*G0_0_0_3_2_5 - 0.00225108225108232*G0_0_0_3_3_0 + 0.00441558441558458*G0_0_0_3_3_1 - 0.0025108225108226*G0_0_0_3_3_2 + 0.021298701298702*G0_0_0_3_3_3 + 0.00606060606060626*G0_0_0_3_3_4 + 0.00727272727272752*G0_0_0_3_3_5 - 0.000909090909090936*G0_0_0_3_4_0 - 0.000779220779220803*G0_0_0_3_4_1 - 0.00242424242424251*G0_0_0_3_4_2 + 0.00606060606060626*G0_0_0_3_4_3 - 0.00199134199134205*G0_0_0_3_4_4 + 0.00432900432900447*G0_0_0_3_4_5 - 0.00121212121212125*G0_0_0_3_5_0 + 0.000562770562770591*G0_0_0_3_5_1 - 0.00138528138528143*G0_0_0_3_5_2 + 0.00727272727272752*G0_0_0_3_5_3 + 0.00432900432900447*G0_0_0_3_5_4 + 0.00614718614718636*G0_0_0_3_5_5 - 0.00461580086580102*G0_0_0_4_0_0 + 0.000286796536796547*G0_0_0_4_0_1 + 0.00360389610389623*G0_0_0_4_0_2 - 0.000909090909090936*G0_0_0_4_0_3 - 0.00298701298701309*G0_0_0_4_0_4 - 0.0014502164502165*G0_0_0_4_0_5 + 0.000286796536796547*G0_0_0_4_1_0 + 0.000573593073593093*G0_0_0_4_1_1 + 0.000573593073593093*G0_0_0_4_1_2 - 0.000779220779220803*G0_0_0_4_1_3 + 0.00190476190476196*G0_0_0_4_1_4 - 0.000952380952380983*G0_0_0_4_1_5 + 0.00360389610389623*G0_0_0_4_2_0 + 0.000573593073593093*G0_0_0_4_2_1 - 0.00918831168831202*G0_0_0_4_2_2 - 0.00242424242424251*G0_0_0_4_2_3 - 0.00952380952380986*G0_0_0_4_2_4 - 0.0012554112554113*G0_0_0_4_2_5 - 0.000909090909090936*G0_0_0_4_3_0 - 0.000779220779220803*G0_0_0_4_3_1 - 0.00242424242424251*G0_0_0_4_3_2 + 0.00606060606060626*G0_0_0_4_3_3 - 0.00199134199134205*G0_0_0_4_3_4 + 0.00432900432900447*G0_0_0_4_3_5 - 0.00298701298701309*G0_0_0_4_4_0 + 0.00190476190476196*G0_0_0_4_4_1 - 0.00952380952380986*G0_0_0_4_4_2 - 0.00199134199134205*G0_0_0_4_4_3 - 0.0932467532467563*G0_0_0_4_4_4 - 0.00129870129870134*G0_0_0_4_4_5 - 0.0014502164502165*G0_0_0_4_5_0 - 0.000952380952380983*G0_0_0_4_5_1 - 0.0012554112554113*G0_0_0_4_5_2 + 0.00432900432900447*G0_0_0_4_5_3 - 0.00129870129870134*G0_0_0_4_5_4 + 0.00562770562770581*G0_0_0_4_5_5 - 0.000416666666666681*G0_0_0_5_0_0 - 0.000194805194805203*G0_0_0_5_0_1 + 0.000438311688311703*G0_0_0_5_0_2 - 0.00121212121212125*G0_0_0_5_0_3 - 0.0014502164502165*G0_0_0_5_0_4 - 0.00073593073593076*G0_0_0_5_0_5 - 0.000194805194805203*G0_0_0_5_1_0 + 0.00281385281385292*G0_0_0_5_1_1 + 0.000562770562770591*G0_0_0_5_1_3 - 0.000952380952380983*G0_0_0_5_1_4 - 0.000346320346320349*G0_0_0_5_1_5 + 0.000438311688311703*G0_0_0_5_2_0 - 0.00138528138528143*G0_0_0_5_2_3 - 0.0012554112554113*G0_0_0_5_2_4 - 0.00186147186147192*G0_0_0_5_2_5 - 0.00121212121212125*G0_0_0_5_3_0 + 0.000562770562770591*G0_0_0_5_3_1 - 0.00138528138528143*G0_0_0_5_3_2 + 0.00727272727272752*G0_0_0_5_3_3 + 0.00432900432900447*G0_0_0_5_3_4 + 0.00614718614718636*G0_0_0_5_3_5 - 0.0014502164502165*G0_0_0_5_4_0 - 0.000952380952380983*G0_0_0_5_4_1 - 0.0012554112554113*G0_0_0_5_4_2 + 0.00432900432900447*G0_0_0_5_4_3 - 0.00129870129870134*G0_0_0_5_4_4 + 0.00562770562770581*G0_0_0_5_4_5 - 0.00073593073593076*G0_0_0_5_5_0 - 0.000346320346320349*G0_0_0_5_5_1 - 0.00186147186147192*G0_0_0_5_5_2 + 0.00614718614718636*G0_0_0_5_5_3 + 0.00562770562770581*G0_0_0_5_5_4 + 0.0111688311688316*G0_0_0_5_5_5 + 0.0125892857142861*G0_0_1_0_0_0 - 0.000619588744588764*G0_0_1_0_0_1 - 0.00121482683982688*G0_0_1_0_0_2 + 0.000113636363636366*G0_0_1_0_0_3 + 0.00457251082251097*G0_0_1_0_0_4 + 0.00143398268398273*G0_0_1_0_0_5 - 0.000619588744588764*G0_0_1_0_1_0 + 0.000595238095238116*G0_0_1_0_1_1 - 0.000286796536796547*G0_0_1_0_1_4 + 0.000844155844155871*G0_0_1_0_1_5 - 0.00121482683982688*G0_0_1_0_2_0 + 0.00121482683982688*G0_0_1_0_2_2 + 0.000200216450216458*G0_0_1_0_2_3 - 0.000200216450216457*G0_0_1_0_2_5 + 0.000113636363636366*G0_0_1_0_3_0 + 0.000200216450216458*G0_0_1_0_3_2 - 0.000389610389610402*G0_0_1_0_3_3 + 0.000346320346320358*G0_0_1_0_3_4 + 0.000173160173160179*G0_0_1_0_3_5 + 0.00457251082251097*G0_0_1_0_4_0 - 0.000286796536796547*G0_0_1_0_4_1 + 0.000346320346320358*G0_0_1_0_4_3 + 0.00653679653679675*G0_0_1_0_4_4 + 0.000974025974026007*G0_0_1_0_4_5 + 0.00143398268398273*G0_0_1_0_5_0 + 0.000844155844155871*G0_0_1_0_5_1 - 0.000200216450216457*G0_0_1_0_5_2 + 0.000173160173160179*G0_0_1_0_5_3 + 0.000974025974026008*G0_0_1_0_5_4 + 0.00177489177489183*G0_0_1_0_5_5 - 0.000619588744588764*G0_0_1_1_0_0 + 0.000595238095238116*G0_0_1_1_0_1 - 0.000286796536796547*G0_0_1_1_0_4 + 0.000844155844155871*G0_0_1_1_0_5 + 0.000595238095238116*G0_0_1_1_1_0 - 0.000595238095238115*G0_0_1_1_1_2 + 0.00313852813852824*G0_0_1_1_1_3 - 0.00313852813852825*G0_0_1_1_1_5 - 0.000595238095238115*G0_0_1_1_2_1 + 0.000619588744588767*G0_0_1_1_2_2 - 0.000844155844155874*G0_0_1_1_2_3 + 0.000286796536796546*G0_0_1_1_2_4 + 0.00313852813852824*G0_0_1_1_3_1 - 0.000844155844155874*G0_0_1_1_3_2 + 0.00476190476190493*G0_0_1_1_3_3 + 0.000173160173160181*G0_0_1_1_3_4 - 0.000286796536796547*G0_0_1_1_4_0 + 0.000286796536796546*G0_0_1_1_4_2 + 0.000173160173160181*G0_0_1_1_4_3 - 0.000173160173160177*G0_0_1_1_4_5 + 0.000844155844155871*G0_0_1_1_5_0 - 0.00313852813852825*G0_0_1_1_5_1 - 0.000173160173160177*G0_0_1_1_5_4 - 0.00476190476190492*G0_0_1_1_5_5 - 0.00121482683982688*G0_0_1_2_0_0 + 0.00121482683982688*G0_0_1_2_0_2 + 0.000200216450216458*G0_0_1_2_0_3 - 0.000200216450216457*G0_0_1_2_0_5 - 0.000595238095238115*G0_0_1_2_1_1 + 0.000619588744588767*G0_0_1_2_1_2 - 0.000844155844155873*G0_0_1_2_1_3 + 0.000286796536796547*G0_0_1_2_1_4 + 0.00121482683982688*G0_0_1_2_2_0 + 0.000619588744588767*G0_0_1_2_2_1 - 0.0125892857142862*G0_0_1_2_2_2 - 0.00143398268398274*G0_0_1_2_2_3 - 0.00457251082251099*G0_0_1_2_2_4 - 0.00011363636363637*G0_0_1_2_2_5 + 0.000200216450216458*G0_0_1_2_3_0 - 0.000844155844155873*G0_0_1_2_3_1 - 0.00143398268398274*G0_0_1_2_3_2 - 0.00177489177489184*G0_0_1_2_3_3 - 0.00097402597402601*G0_0_1_2_3_4 - 0.00017316017316018*G0_0_1_2_3_5 + 0.000286796536796547*G0_0_1_2_4_1 - 0.00457251082251099*G0_0_1_2_4_2 - 0.000974025974026009*G0_0_1_2_4_3 - 0.00653679653679676*G0_0_1_2_4_4 - 0.000346320346320359*G0_0_1_2_4_5 - 0.000200216450216457*G0_0_1_2_5_0 - 0.00011363636363637*G0_0_1_2_5_2 - 0.00017316017316018*G0_0_1_2_5_3 - 0.000346320346320359*G0_0_1_2_5_4 + 0.000389610389610404*G0_0_1_2_5_5 + 0.000113636363636365*G0_0_1_3_0_0 + 0.000200216450216458*G0_0_1_3_0_2 - 0.000389610389610402*G0_0_1_3_0_3 + 0.000346320346320358*G0_0_1_3_0_4 + 0.000173160173160179*G0_0_1_3_0_5 + 0.00313852813852824*G0_0_1_3_1_1 - 0.000844155844155873*G0_0_1_3_1_2 + 0.00476190476190493*G0_0_1_3_1_3 + 0.000173160173160181*G0_0_1_3_1_4 + 0.000200216450216458*G0_0_1_3_2_0 - 0.000844155844155873*G0_0_1_3_2_1 - 0.00143398268398274*G0_0_1_3_2_2 - 0.00177489177489184*G0_0_1_3_2_3 - 0.000974025974026009*G0_0_1_3_2_4 - 0.00017316017316018*G0_0_1_3_2_5 - 0.000389610389610402*G0_0_1_3_3_0 + 0.00476190476190493*G0_0_1_3_3_1 - 0.00177489177489184*G0_0_1_3_3_2 + 0.0101298701298705*G0_0_1_3_3_3 + 0.000432900432900445*G0_0_1_3_3_4 + 0.00112554112554117*G0_0_1_3_3_5 + 0.000346320346320358*G0_0_1_3_4_0 + 0.000173160173160181*G0_0_1_3_4_1 - 0.000974025974026009*G0_0_1_3_4_2 + 0.000432900432900443*G0_0_1_3_4_3 - 0.000692640692640723*G0_0_1_3_4_4 + 0.000173160173160179*G0_0_1_3_5_0 - 0.00017316017316018*G0_0_1_3_5_2 + 0.00112554112554117*G0_0_1_3_5_3 - 0.00112554112554116*G0_0_1_3_5_5 + 0.00457251082251097*G0_0_1_4_0_0 - 0.000286796536796547*G0_0_1_4_0_1 + 0.000346320346320358*G0_0_1_4_0_3 + 0.00653679653679675*G0_0_1_4_0_4 + 0.000974025974026008*G0_0_1_4_0_5 - 0.000286796536796547*G0_0_1_4_1_0 + 0.000286796536796547*G0_0_1_4_1_2 + 0.000173160173160181*G0_0_1_4_1_3 - 0.000173160173160177*G0_0_1_4_1_5 + 0.000286796536796547*G0_0_1_4_2_1 - 0.00457251082251099*G0_0_1_4_2_2 - 0.000974025974026009*G0_0_1_4_2_3 - 0.00653679653679676*G0_0_1_4_2_4 - 0.000346320346320359*G0_0_1_4_2_5 + 0.000346320346320358*G0_0_1_4_3_0 + 0.000173160173160181*G0_0_1_4_3_1 - 0.000974025974026009*G0_0_1_4_3_2 + 0.000432900432900443*G0_0_1_4_3_3 - 0.000692640692640723*G0_0_1_4_3_4 + 0.00653679653679675*G0_0_1_4_4_0 - 0.00653679653679676*G0_0_1_4_4_2 - 0.000692640692640723*G0_0_1_4_4_3 + 0.000692640692640709*G0_0_1_4_4_5 + 0.000974025974026008*G0_0_1_4_5_0 - 0.000173160173160177*G0_0_1_4_5_1 - 0.000346320346320359*G0_0_1_4_5_2 + 0.00069264069264071*G0_0_1_4_5_4 - 0.00043290043290045*G0_0_1_4_5_5 + 0.00143398268398273*G0_0_1_5_0_0 + 0.000844155844155871*G0_0_1_5_0_1 - 0.000200216450216457*G0_0_1_5_0_2 + 0.000173160173160179*G0_0_1_5_0_3 + 0.000974025974026008*G0_0_1_5_0_4 + 0.00177489177489183*G0_0_1_5_0_5 + 0.000844155844155871*G0_0_1_5_1_0 - 0.00313852813852825*G0_0_1_5_1_1 - 0.000173160173160177*G0_0_1_5_1_4 - 0.00476190476190492*G0_0_1_5_1_5 - 0.000200216450216457*G0_0_1_5_2_0 - 0.00011363636363637*G0_0_1_5_2_2 - 0.00017316017316018*G0_0_1_5_2_3 - 0.000346320346320359*G0_0_1_5_2_4 + 0.000389610389610404*G0_0_1_5_2_5 + 0.000173160173160179*G0_0_1_5_3_0 - 0.00017316017316018*G0_0_1_5_3_2 + 0.00112554112554117*G0_0_1_5_3_3 - 0.00112554112554116*G0_0_1_5_3_5 + 0.000974025974026008*G0_0_1_5_4_0 - 0.000173160173160177*G0_0_1_5_4_1 - 0.000346320346320359*G0_0_1_5_4_2 + 0.00069264069264071*G0_0_1_5_4_4 - 0.00043290043290045*G0_0_1_5_4_5 + 0.00177489177489183*G0_0_1_5_5_0 - 0.00476190476190492*G0_0_1_5_5_1 + 0.000389610389610404*G0_0_1_5_5_2 - 0.00112554112554116*G0_0_1_5_5_3 - 0.00043290043290045*G0_0_1_5_5_4 - 0.0101298701298705*G0_0_1_5_5_5; + A[51] = A[15] - 0.020150162337663*G0_0_1_0_0_0 + 0.000735930735930758*G0_0_1_0_0_1 + 0.00127299783549788*G0_0_1_0_0_2 - 0.000243506493506498*G0_0_1_0_0_3 - 0.00492424242424259*G0_0_1_0_0_4 - 0.00213744588744596*G0_0_1_0_0_5 + 0.000735930735930758*G0_0_1_0_1_0 - 0.000248917748917759*G0_0_1_0_1_1 - 0.00018398268398269*G0_0_1_0_1_3 - 0.000844155844155873*G0_0_1_0_1_5 + 0.00127299783549788*G0_0_1_0_2_0 - 0.000238095238095244*G0_0_1_0_2_3 - 0.000162337662337665*G0_0_1_0_2_4 - 0.000243506493506498*G0_0_1_0_3_0 - 0.00018398268398269*G0_0_1_0_3_1 - 0.000238095238095245*G0_0_1_0_3_2 + 0.000519480519480535*G0_0_1_0_3_3 + 0.000476190476190491*G0_0_1_0_3_4 + 0.00056277056277058*G0_0_1_0_3_5 - 0.00492424242424259*G0_0_1_0_4_0 - 0.000162337662337665*G0_0_1_0_4_2 + 0.000476190476190491*G0_0_1_0_4_3 - 0.00313852813852824*G0_0_1_0_4_4 - 0.00213744588744596*G0_0_1_0_5_0 - 0.000844155844155873*G0_0_1_0_5_1 + 0.00056277056277058*G0_0_1_0_5_3 + 0.00203463203463211*G0_0_1_0_5_5 + 0.000735930735930758*G0_0_1_1_0_0 - 0.000248917748917759*G0_0_1_1_0_1 - 0.00018398268398269*G0_0_1_1_0_3 - 0.000844155844155873*G0_0_1_1_0_5 - 0.000248917748917759*G0_0_1_1_1_0 + 0.000346320346320357*G0_0_1_1_1_2 - 0.00156926406926412*G0_0_1_1_1_3 + 0.00156926406926413*G0_0_1_1_1_5 + 0.000346320346320357*G0_0_1_1_2_1 + 0.000116341991341997*G0_0_1_1_2_2 - 0.00028138528138529*G0_0_1_1_2_4 - 0.000270562770562779*G0_0_1_1_2_5 - 0.00018398268398269*G0_0_1_1_3_0 - 0.00156926406926412*G0_0_1_1_3_1 - 0.0032900432900434*G0_0_1_1_3_3 + 0.000562770562770581*G0_0_1_1_3_4 + 0.000909090909090937*G0_0_1_1_3_5 - 0.00028138528138529*G0_0_1_1_4_2 + 0.000562770562770581*G0_0_1_1_4_3 - 0.000389610389610397*G0_0_1_1_4_4 + 0.00073593073593076*G0_0_1_1_4_5 - 0.000844155844155873*G0_0_1_1_5_0 + 0.00156926406926413*G0_0_1_1_5_1 - 0.000270562770562779*G0_0_1_1_5_2 + 0.000909090909090937*G0_0_1_1_5_3 + 0.00073593073593076*G0_0_1_1_5_4 + 0.00147186147186152*G0_0_1_1_5_5 + 0.00127299783549788*G0_0_1_2_0_0 - 0.000238095238095244*G0_0_1_2_0_3 - 0.000162337662337665*G0_0_1_2_0_4 + 0.000346320346320357*G0_0_1_2_1_1 + 0.000116341991341997*G0_0_1_2_1_2 - 0.00028138528138529*G0_0_1_2_1_4 - 0.000270562770562779*G0_0_1_2_1_5 + 0.000116341991341997*G0_0_1_2_2_1 - 0.00756087662337692*G0_0_1_2_2_2 - 0.000703463203463238*G0_0_1_2_2_3 - 0.000351731601731626*G0_0_1_2_2_4 - 0.000129870129870136*G0_0_1_2_2_5 - 0.000238095238095245*G0_0_1_2_3_0 - 0.000703463203463238*G0_0_1_2_3_2 + 0.00380952380952393*G0_0_1_2_3_3 + 0.00103896103896107*G0_0_1_2_3_4 + 0.00073593073593076*G0_0_1_2_3_5 - 0.000162337662337665*G0_0_1_2_4_0 - 0.00028138528138529*G0_0_1_2_4_1 - 0.000351731601731626*G0_0_1_2_4_2 + 0.00103896103896107*G0_0_1_2_4_3 + 0.00339826839826851*G0_0_1_2_4_4 + 0.000822510822510851*G0_0_1_2_4_5 - 0.000270562770562779*G0_0_1_2_5_1 - 0.000129870129870136*G0_0_1_2_5_2 + 0.00073593073593076*G0_0_1_2_5_3 + 0.000822510822510851*G0_0_1_2_5_4 + 0.000129870129870133*G0_0_1_2_5_5 - 0.000243506493506498*G0_0_1_3_0_0 - 0.00018398268398269*G0_0_1_3_0_1 - 0.000238095238095244*G0_0_1_3_0_2 + 0.000519480519480535*G0_0_1_3_0_3 + 0.000476190476190491*G0_0_1_3_0_4 + 0.00056277056277058*G0_0_1_3_0_5 - 0.00018398268398269*G0_0_1_3_1_0 - 0.00156926406926412*G0_0_1_3_1_1 - 0.0032900432900434*G0_0_1_3_1_3 + 0.000562770562770581*G0_0_1_3_1_4 + 0.000909090909090937*G0_0_1_3_1_5 - 0.000238095238095245*G0_0_1_3_2_0 - 0.000703463203463238*G0_0_1_3_2_2 + 0.00380952380952393*G0_0_1_3_2_3 + 0.00103896103896107*G0_0_1_3_2_4 + 0.00073593073593076*G0_0_1_3_2_5 + 0.000519480519480535*G0_0_1_3_3_0 - 0.0032900432900434*G0_0_1_3_3_1 + 0.00380952380952393*G0_0_1_3_3_2 + 0.000779220779220825*G0_0_1_3_3_3 - 0.00216450216450223*G0_0_1_3_3_4 - 0.00251082251082259*G0_0_1_3_3_5 + 0.000476190476190491*G0_0_1_3_4_0 + 0.000562770562770581*G0_0_1_3_4_1 + 0.00103896103896107*G0_0_1_3_4_2 - 0.00216450216450223*G0_0_1_3_4_3 - 0.000173160173160185*G0_0_1_3_4_4 - 0.00259740259740268*G0_0_1_3_4_5 + 0.00056277056277058*G0_0_1_3_5_0 + 0.000909090909090937*G0_0_1_3_5_1 + 0.00073593073593076*G0_0_1_3_5_2 - 0.00251082251082259*G0_0_1_3_5_3 - 0.00259740259740268*G0_0_1_3_5_4 - 0.00138528138528143*G0_0_1_3_5_5 - 0.00492424242424259*G0_0_1_4_0_0 - 0.000162337662337665*G0_0_1_4_0_2 + 0.000476190476190491*G0_0_1_4_0_3 - 0.00313852813852824*G0_0_1_4_0_4 - 0.00028138528138529*G0_0_1_4_1_2 + 0.000562770562770581*G0_0_1_4_1_3 - 0.000389610389610397*G0_0_1_4_1_4 + 0.00073593073593076*G0_0_1_4_1_5 - 0.000162337662337665*G0_0_1_4_2_0 - 0.00028138528138529*G0_0_1_4_2_1 - 0.000351731601731626*G0_0_1_4_2_2 + 0.00103896103896107*G0_0_1_4_2_3 + 0.00339826839826851*G0_0_1_4_2_4 + 0.000822510822510851*G0_0_1_4_2_5 + 0.000476190476190491*G0_0_1_4_3_0 + 0.000562770562770581*G0_0_1_4_3_1 + 0.00103896103896107*G0_0_1_4_3_2 - 0.00216450216450223*G0_0_1_4_3_3 - 0.000173160173160185*G0_0_1_4_3_4 - 0.00259740259740268*G0_0_1_4_3_5 - 0.00313852813852824*G0_0_1_4_4_0 - 0.000389610389610397*G0_0_1_4_4_1 + 0.00339826839826851*G0_0_1_4_4_2 - 0.000173160173160185*G0_0_1_4_4_3 + 0.0397402597402609*G0_0_1_4_4_4 - 0.000865800865800901*G0_0_1_4_4_5 + 0.00073593073593076*G0_0_1_4_5_1 + 0.000822510822510851*G0_0_1_4_5_2 - 0.00259740259740268*G0_0_1_4_5_3 - 0.000865800865800901*G0_0_1_4_5_4 - 0.00173160173160179*G0_0_1_4_5_5 - 0.00213744588744596*G0_0_1_5_0_0 - 0.000844155844155873*G0_0_1_5_0_1 + 0.00056277056277058*G0_0_1_5_0_3 + 0.00203463203463211*G0_0_1_5_0_5 - 0.000844155844155873*G0_0_1_5_1_0 + 0.00156926406926413*G0_0_1_5_1_1 - 0.000270562770562779*G0_0_1_5_1_2 + 0.000909090909090937*G0_0_1_5_1_3 + 0.00073593073593076*G0_0_1_5_1_4 + 0.00147186147186152*G0_0_1_5_1_5 - 0.000270562770562779*G0_0_1_5_2_1 - 0.000129870129870136*G0_0_1_5_2_2 + 0.00073593073593076*G0_0_1_5_2_3 + 0.000822510822510851*G0_0_1_5_2_4 + 0.000129870129870133*G0_0_1_5_2_5 + 0.00056277056277058*G0_0_1_5_3_0 + 0.000909090909090937*G0_0_1_5_3_1 + 0.00073593073593076*G0_0_1_5_3_2 - 0.00251082251082259*G0_0_1_5_3_3 - 0.00259740259740268*G0_0_1_5_3_4 - 0.00138528138528143*G0_0_1_5_3_5 + 0.00073593073593076*G0_0_1_5_4_1 + 0.000822510822510851*G0_0_1_5_4_2 - 0.00259740259740268*G0_0_1_5_4_3 - 0.000865800865800901*G0_0_1_5_4_4 - 0.00173160173160179*G0_0_1_5_4_5 + 0.00203463203463211*G0_0_1_5_5_0 + 0.00147186147186152*G0_0_1_5_5_1 + 0.000129870129870133*G0_0_1_5_5_2 - 0.00138528138528143*G0_0_1_5_5_3 - 0.00173160173160179*G0_0_1_5_5_4 + 0.0109090909090913*G0_0_1_5_5_5 + 0.020150162337663*G0_1_0_0_0_0 - 0.000735930735930758*G0_1_0_0_0_1 - 0.00127299783549788*G0_1_0_0_0_2 + 0.000243506493506498*G0_1_0_0_0_3 + 0.00492424242424259*G0_1_0_0_0_4 + 0.00213744588744596*G0_1_0_0_0_5 - 0.000735930735930758*G0_1_0_0_1_0 + 0.000248917748917759*G0_1_0_0_1_1 + 0.00018398268398269*G0_1_0_0_1_3 + 0.000844155844155873*G0_1_0_0_1_5 - 0.00127299783549788*G0_1_0_0_2_0 + 0.000238095238095244*G0_1_0_0_2_3 + 0.000162337662337665*G0_1_0_0_2_4 + 0.000243506493506498*G0_1_0_0_3_0 + 0.00018398268398269*G0_1_0_0_3_1 + 0.000238095238095244*G0_1_0_0_3_2 - 0.000519480519480535*G0_1_0_0_3_3 - 0.000476190476190491*G0_1_0_0_3_4 - 0.00056277056277058*G0_1_0_0_3_5 + 0.00492424242424259*G0_1_0_0_4_0 + 0.000162337662337665*G0_1_0_0_4_2 - 0.000476190476190491*G0_1_0_0_4_3 + 0.00313852813852824*G0_1_0_0_4_4 + 0.00213744588744596*G0_1_0_0_5_0 + 0.000844155844155873*G0_1_0_0_5_1 - 0.00056277056277058*G0_1_0_0_5_3 - 0.00203463203463211*G0_1_0_0_5_5 - 0.000735930735930758*G0_1_0_1_0_0 + 0.000248917748917759*G0_1_0_1_0_1 + 0.00018398268398269*G0_1_0_1_0_3 + 0.000844155844155873*G0_1_0_1_0_5 + 0.000248917748917759*G0_1_0_1_1_0 - 0.000346320346320357*G0_1_0_1_1_2 + 0.00156926406926412*G0_1_0_1_1_3 - 0.00156926406926413*G0_1_0_1_1_5 - 0.000346320346320357*G0_1_0_1_2_1 - 0.000116341991341997*G0_1_0_1_2_2 + 0.00028138528138529*G0_1_0_1_2_4 + 0.000270562770562779*G0_1_0_1_2_5 + 0.00018398268398269*G0_1_0_1_3_0 + 0.00156926406926412*G0_1_0_1_3_1 + 0.0032900432900434*G0_1_0_1_3_3 - 0.000562770562770581*G0_1_0_1_3_4 - 0.000909090909090938*G0_1_0_1_3_5 + 0.00028138528138529*G0_1_0_1_4_2 - 0.000562770562770581*G0_1_0_1_4_3 + 0.000389610389610397*G0_1_0_1_4_4 - 0.00073593073593076*G0_1_0_1_4_5 + 0.000844155844155873*G0_1_0_1_5_0 - 0.00156926406926413*G0_1_0_1_5_1 + 0.000270562770562779*G0_1_0_1_5_2 - 0.000909090909090938*G0_1_0_1_5_3 - 0.00073593073593076*G0_1_0_1_5_4 - 0.00147186147186152*G0_1_0_1_5_5 - 0.00127299783549788*G0_1_0_2_0_0 + 0.000238095238095244*G0_1_0_2_0_3 + 0.000162337662337665*G0_1_0_2_0_4 - 0.000346320346320357*G0_1_0_2_1_1 - 0.000116341991341997*G0_1_0_2_1_2 + 0.00028138528138529*G0_1_0_2_1_4 + 0.000270562770562779*G0_1_0_2_1_5 - 0.000116341991341997*G0_1_0_2_2_1 + 0.00756087662337692*G0_1_0_2_2_2 + 0.000703463203463238*G0_1_0_2_2_3 + 0.000351731601731626*G0_1_0_2_2_4 + 0.000129870129870136*G0_1_0_2_2_5 + 0.000238095238095244*G0_1_0_2_3_0 + 0.000703463203463238*G0_1_0_2_3_2 - 0.00380952380952393*G0_1_0_2_3_3 - 0.00103896103896107*G0_1_0_2_3_4 - 0.00073593073593076*G0_1_0_2_3_5 + 0.000162337662337665*G0_1_0_2_4_0 + 0.00028138528138529*G0_1_0_2_4_1 + 0.000351731601731626*G0_1_0_2_4_2 - 0.00103896103896107*G0_1_0_2_4_3 - 0.00339826839826851*G0_1_0_2_4_4 - 0.000822510822510851*G0_1_0_2_4_5 + 0.000270562770562779*G0_1_0_2_5_1 + 0.000129870129870136*G0_1_0_2_5_2 - 0.00073593073593076*G0_1_0_2_5_3 - 0.000822510822510851*G0_1_0_2_5_4 - 0.000129870129870133*G0_1_0_2_5_5 + 0.000243506493506498*G0_1_0_3_0_0 + 0.00018398268398269*G0_1_0_3_0_1 + 0.000238095238095244*G0_1_0_3_0_2 - 0.000519480519480535*G0_1_0_3_0_3 - 0.000476190476190491*G0_1_0_3_0_4 - 0.00056277056277058*G0_1_0_3_0_5 + 0.00018398268398269*G0_1_0_3_1_0 + 0.00156926406926412*G0_1_0_3_1_1 + 0.0032900432900434*G0_1_0_3_1_3 - 0.000562770562770581*G0_1_0_3_1_4 - 0.000909090909090937*G0_1_0_3_1_5 + 0.000238095238095244*G0_1_0_3_2_0 + 0.000703463203463238*G0_1_0_3_2_2 - 0.00380952380952393*G0_1_0_3_2_3 - 0.00103896103896107*G0_1_0_3_2_4 - 0.00073593073593076*G0_1_0_3_2_5 - 0.000519480519480535*G0_1_0_3_3_0 + 0.0032900432900434*G0_1_0_3_3_1 - 0.00380952380952393*G0_1_0_3_3_2 - 0.000779220779220826*G0_1_0_3_3_3 + 0.00216450216450223*G0_1_0_3_3_4 + 0.00251082251082259*G0_1_0_3_3_5 - 0.000476190476190491*G0_1_0_3_4_0 - 0.000562770562770581*G0_1_0_3_4_1 - 0.00103896103896107*G0_1_0_3_4_2 + 0.00216450216450223*G0_1_0_3_4_3 + 0.000173160173160186*G0_1_0_3_4_4 + 0.00259740259740268*G0_1_0_3_4_5 - 0.00056277056277058*G0_1_0_3_5_0 - 0.000909090909090938*G0_1_0_3_5_1 - 0.00073593073593076*G0_1_0_3_5_2 + 0.00251082251082259*G0_1_0_3_5_3 + 0.00259740259740268*G0_1_0_3_5_4 + 0.00138528138528143*G0_1_0_3_5_5 + 0.00492424242424259*G0_1_0_4_0_0 + 0.000162337662337665*G0_1_0_4_0_2 - 0.000476190476190491*G0_1_0_4_0_3 + 0.00313852813852824*G0_1_0_4_0_4 + 0.00028138528138529*G0_1_0_4_1_2 - 0.000562770562770581*G0_1_0_4_1_3 + 0.000389610389610397*G0_1_0_4_1_4 - 0.00073593073593076*G0_1_0_4_1_5 + 0.000162337662337665*G0_1_0_4_2_0 + 0.00028138528138529*G0_1_0_4_2_1 + 0.000351731601731626*G0_1_0_4_2_2 - 0.00103896103896107*G0_1_0_4_2_3 - 0.00339826839826851*G0_1_0_4_2_4 - 0.000822510822510851*G0_1_0_4_2_5 - 0.000476190476190491*G0_1_0_4_3_0 - 0.000562770562770581*G0_1_0_4_3_1 - 0.00103896103896107*G0_1_0_4_3_2 + 0.00216450216450223*G0_1_0_4_3_3 + 0.000173160173160186*G0_1_0_4_3_4 + 0.00259740259740268*G0_1_0_4_3_5 + 0.00313852813852824*G0_1_0_4_4_0 + 0.000389610389610397*G0_1_0_4_4_1 - 0.00339826839826851*G0_1_0_4_4_2 + 0.000173160173160186*G0_1_0_4_4_3 - 0.0397402597402609*G0_1_0_4_4_4 + 0.000865800865800902*G0_1_0_4_4_5 - 0.00073593073593076*G0_1_0_4_5_1 - 0.000822510822510851*G0_1_0_4_5_2 + 0.00259740259740268*G0_1_0_4_5_3 + 0.000865800865800902*G0_1_0_4_5_4 + 0.00173160173160179*G0_1_0_4_5_5 + 0.00213744588744596*G0_1_0_5_0_0 + 0.000844155844155873*G0_1_0_5_0_1 - 0.00056277056277058*G0_1_0_5_0_3 - 0.00203463203463211*G0_1_0_5_0_5 + 0.000844155844155873*G0_1_0_5_1_0 - 0.00156926406926413*G0_1_0_5_1_1 + 0.000270562770562779*G0_1_0_5_1_2 - 0.000909090909090938*G0_1_0_5_1_3 - 0.00073593073593076*G0_1_0_5_1_4 - 0.00147186147186152*G0_1_0_5_1_5 + 0.000270562770562779*G0_1_0_5_2_1 + 0.000129870129870136*G0_1_0_5_2_2 - 0.00073593073593076*G0_1_0_5_2_3 - 0.000822510822510851*G0_1_0_5_2_4 - 0.000129870129870133*G0_1_0_5_2_5 - 0.00056277056277058*G0_1_0_5_3_0 - 0.000909090909090938*G0_1_0_5_3_1 - 0.00073593073593076*G0_1_0_5_3_2 + 0.00251082251082259*G0_1_0_5_3_3 + 0.00259740259740268*G0_1_0_5_3_4 + 0.00138528138528143*G0_1_0_5_3_5 - 0.00073593073593076*G0_1_0_5_4_1 - 0.000822510822510851*G0_1_0_5_4_2 + 0.00259740259740268*G0_1_0_5_4_3 + 0.000865800865800902*G0_1_0_5_4_4 + 0.00173160173160179*G0_1_0_5_4_5 - 0.00203463203463211*G0_1_0_5_5_0 - 0.00147186147186152*G0_1_0_5_5_1 - 0.000129870129870133*G0_1_0_5_5_2 + 0.00138528138528143*G0_1_0_5_5_3 + 0.00173160173160179*G0_1_0_5_5_4 - 0.0109090909090913*G0_1_0_5_5_5; + A[31] = -A[51] - 0.00611201298701321*G0_0_0_0_0_0 + 0.000771103896103921*G0_0_0_0_0_1 + 0.000698051948051973*G0_0_0_0_0_2 - 0.000162337662337665*G0_0_0_0_0_3 - 0.00633116883116904*G0_0_0_0_0_4 - 0.000649350649350674*G0_0_0_0_0_5 + 0.000771103896103921*G0_0_0_0_1_0 - 0.00230519480519488*G0_0_0_0_1_1 + 0.000292207792207803*G0_0_0_0_1_2 - 0.00246753246753255*G0_0_0_0_1_3 - 0.000162337662337666*G0_0_0_0_1_4 - 0.00175324675324681*G0_0_0_0_1_5 + 0.000698051948051973*G0_0_0_0_2_0 + 0.000292207792207803*G0_0_0_0_2_1 + 0.000511363636363653*G0_0_0_0_2_2 + 0.00113636363636367*G0_0_0_0_2_3 + 0.00337662337662349*G0_0_0_0_2_4 + 0.000681818181818205*G0_0_0_0_2_5 - 0.000162337662337665*G0_0_0_0_3_0 - 0.00246753246753255*G0_0_0_0_3_1 + 0.00113636363636367*G0_0_0_0_3_2 - 0.000259740259740283*G0_0_0_0_3_3 + 0.000649350649350666*G0_0_0_0_3_4 - 0.00103896103896108*G0_0_0_0_3_5 - 0.00633116883116905*G0_0_0_0_4_0 - 0.000162337662337665*G0_0_0_0_4_1 + 0.00337662337662349*G0_0_0_0_4_2 + 0.000649350649350666*G0_0_0_0_4_3 - 0.00506493506493525*G0_0_0_0_4_4 - 0.00103896103896108*G0_0_0_0_4_5 - 0.000649350649350674*G0_0_0_0_5_0 - 0.00175324675324681*G0_0_0_0_5_1 + 0.000681818181818205*G0_0_0_0_5_2 - 0.00103896103896108*G0_0_0_0_5_3 - 0.00103896103896108*G0_0_0_0_5_4 - 0.00155844155844161*G0_0_0_0_5_5 + 0.000771103896103921*G0_0_0_1_0_0 - 0.00230519480519488*G0_0_0_1_0_1 + 0.000292207792207802*G0_0_0_1_0_2 - 0.00246753246753255*G0_0_0_1_0_3 - 0.000162337662337666*G0_0_0_1_0_4 - 0.00175324675324681*G0_0_0_1_0_5 - 0.00230519480519488*G0_0_0_1_1_0 + 0.0304383116883127*G0_0_0_1_1_1 - 0.0044967532467534*G0_0_0_1_1_2 + 0.0194805194805202*G0_0_0_1_1_3 + 0.00103896103896107*G0_0_0_1_1_4 + 0.00941558441558475*G0_0_0_1_1_5 + 0.000292207792207802*G0_0_0_1_2_0 - 0.0044967532467534*G0_0_0_1_2_1 + 0.00138798701298706*G0_0_0_1_2_2 - 0.0039610389610391*G0_0_0_1_2_3 - 0.00155844155844162*G0_0_0_1_2_5 - 0.00246753246753255*G0_0_0_1_3_0 + 0.0194805194805202*G0_0_0_1_3_1 - 0.0039610389610391*G0_0_0_1_3_2 + 0.0296103896103907*G0_0_0_1_3_3 + 0.00285714285714295*G0_0_0_1_3_4 + 0.00805194805194835*G0_0_0_1_3_5 - 0.000162337662337666*G0_0_0_1_4_0 + 0.00103896103896107*G0_0_0_1_4_1 + 0.00285714285714295*G0_0_0_1_4_3 + 0.00376623376623388*G0_0_0_1_4_4 + 0.00103896103896107*G0_0_0_1_4_5 - 0.00175324675324681*G0_0_0_1_5_0 + 0.00941558441558475*G0_0_0_1_5_1 - 0.00155844155844162*G0_0_0_1_5_2 + 0.00805194805194835*G0_0_0_1_5_3 + 0.00103896103896107*G0_0_0_1_5_4 + 0.00623376623376645*G0_0_0_1_5_5 + 0.000698051948051973*G0_0_0_2_0_0 + 0.000292207792207803*G0_0_0_2_0_1 + 0.000511363636363653*G0_0_0_2_0_2 + 0.00113636363636367*G0_0_0_2_0_3 + 0.00337662337662349*G0_0_0_2_0_4 + 0.000681818181818205*G0_0_0_2_0_5 + 0.000292207792207803*G0_0_0_2_1_0 - 0.0044967532467534*G0_0_0_2_1_1 + 0.00138798701298706*G0_0_0_2_1_2 - 0.0039610389610391*G0_0_0_2_1_3 - 0.00155844155844162*G0_0_0_2_1_5 + 0.000511363636363653*G0_0_0_2_2_0 + 0.00138798701298706*G0_0_0_2_2_1 - 0.00438311688311702*G0_0_0_2_2_2 - 0.000454545454545464*G0_0_0_2_2_3 - 0.00538961038961057*G0_0_0_2_2_4 + 0.000292207792207803*G0_0_0_2_2_5 + 0.00113636363636367*G0_0_0_2_3_0 - 0.0039610389610391*G0_0_0_2_3_1 - 0.000454545454545464*G0_0_0_2_3_2 - 0.0140259740259745*G0_0_0_2_3_3 - 0.00233766233766242*G0_0_0_2_3_4 - 0.00285714285714296*G0_0_0_2_3_5 + 0.00337662337662349*G0_0_0_2_4_0 - 0.00538961038961057*G0_0_0_2_4_2 - 0.00233766233766242*G0_0_0_2_4_3 - 0.00467532467532484*G0_0_0_2_4_4 - 0.000649350649350675*G0_0_0_2_4_5 + 0.000681818181818205*G0_0_0_2_5_0 - 0.00155844155844162*G0_0_0_2_5_1 + 0.000292207792207803*G0_0_0_2_5_2 - 0.00285714285714296*G0_0_0_2_5_3 - 0.000649350649350675*G0_0_0_2_5_4 - 0.00233766233766242*G0_0_0_2_5_5 - 0.000162337662337665*G0_0_0_3_0_0 - 0.00246753246753255*G0_0_0_3_0_1 + 0.00113636363636367*G0_0_0_3_0_2 - 0.000259740259740283*G0_0_0_3_0_3 + 0.000649350649350666*G0_0_0_3_0_4 - 0.00103896103896108*G0_0_0_3_0_5 - 0.00246753246753255*G0_0_0_3_1_0 + 0.0194805194805202*G0_0_0_3_1_1 - 0.00396103896103911*G0_0_0_3_1_2 + 0.0296103896103907*G0_0_0_3_1_3 + 0.00285714285714295*G0_0_0_3_1_4 + 0.00805194805194835*G0_0_0_3_1_5 + 0.00113636363636367*G0_0_0_3_2_0 - 0.0039610389610391*G0_0_0_3_2_1 - 0.000454545454545464*G0_0_0_3_2_2 - 0.0140259740259745*G0_0_0_3_2_3 - 0.00233766233766242*G0_0_0_3_2_4 - 0.00285714285714296*G0_0_0_3_2_5 - 0.000259740259740283*G0_0_0_3_3_0 + 0.0296103896103907*G0_0_0_3_3_1 - 0.0140259740259745*G0_0_0_3_3_2 + 0.0093506493506498*G0_0_0_3_3_3 - 0.00519480519480534*G0_0_0_3_3_4 + 0.0062337662337665*G0_0_0_3_3_5 + 0.000649350649350666*G0_0_0_3_4_0 + 0.00285714285714295*G0_0_0_3_4_1 - 0.00233766233766242*G0_0_0_3_4_2 - 0.00519480519480534*G0_0_0_3_4_3 - 0.0088311688311691*G0_0_0_3_4_4 - 0.00103896103896108*G0_0_0_3_5_0 + 0.00805194805194835*G0_0_0_3_5_1 - 0.00285714285714296*G0_0_0_3_5_2 + 0.00623376623376649*G0_0_0_3_5_3 + 0.00675324675324701*G0_0_0_3_5_5 - 0.00633116883116904*G0_0_0_4_0_0 - 0.000162337662337665*G0_0_0_4_0_1 + 0.00337662337662349*G0_0_0_4_0_2 + 0.000649350649350666*G0_0_0_4_0_3 - 0.00506493506493525*G0_0_0_4_0_4 - 0.00103896103896108*G0_0_0_4_0_5 - 0.000162337662337665*G0_0_0_4_1_0 + 0.00103896103896107*G0_0_0_4_1_1 + 0.00285714285714295*G0_0_0_4_1_3 + 0.00376623376623388*G0_0_0_4_1_4 + 0.00103896103896107*G0_0_0_4_1_5 + 0.00337662337662349*G0_0_0_4_2_0 - 0.00538961038961057*G0_0_0_4_2_2 - 0.00233766233766242*G0_0_0_4_2_3 - 0.00467532467532484*G0_0_0_4_2_4 - 0.000649350649350675*G0_0_0_4_2_5 + 0.000649350649350666*G0_0_0_4_3_0 + 0.00285714285714295*G0_0_0_4_3_1 - 0.00233766233766242*G0_0_0_4_3_2 - 0.00519480519480534*G0_0_0_4_3_3 - 0.0088311688311691*G0_0_0_4_3_4 - 0.00506493506493525*G0_0_0_4_4_0 + 0.00376623376623388*G0_0_0_4_4_1 - 0.00467532467532484*G0_0_0_4_4_2 - 0.0088311688311691*G0_0_0_4_4_3 - 0.107532467532471*G0_0_0_4_4_4 - 0.00623376623376643*G0_0_0_4_4_5 - 0.00103896103896107*G0_0_0_4_5_0 + 0.00103896103896107*G0_0_0_4_5_1 - 0.000649350649350675*G0_0_0_4_5_2 - 0.00623376623376643*G0_0_0_4_5_4 + 0.00259740259740269*G0_0_0_4_5_5 - 0.000649350649350674*G0_0_0_5_0_0 - 0.00175324675324681*G0_0_0_5_0_1 + 0.000681818181818205*G0_0_0_5_0_2 - 0.00103896103896108*G0_0_0_5_0_3 - 0.00103896103896108*G0_0_0_5_0_4 - 0.00155844155844161*G0_0_0_5_0_5 - 0.00175324675324681*G0_0_0_5_1_0 + 0.00941558441558475*G0_0_0_5_1_1 - 0.00155844155844162*G0_0_0_5_1_2 + 0.00805194805194835*G0_0_0_5_1_3 + 0.00103896103896107*G0_0_0_5_1_4 + 0.00623376623376645*G0_0_0_5_1_5 + 0.000681818181818205*G0_0_0_5_2_0 - 0.00155844155844162*G0_0_0_5_2_1 + 0.000292207792207803*G0_0_0_5_2_2 - 0.00285714285714296*G0_0_0_5_2_3 - 0.000649350649350675*G0_0_0_5_2_4 - 0.00233766233766242*G0_0_0_5_2_5 - 0.00103896103896108*G0_0_0_5_3_0 + 0.00805194805194835*G0_0_0_5_3_1 - 0.00285714285714296*G0_0_0_5_3_2 + 0.00623376623376649*G0_0_0_5_3_3 + 0.00675324675324701*G0_0_0_5_3_5 - 0.00103896103896108*G0_0_0_5_4_0 + 0.00103896103896107*G0_0_0_5_4_1 - 0.000649350649350675*G0_0_0_5_4_2 - 0.00623376623376643*G0_0_0_5_4_4 + 0.00259740259740269*G0_0_0_5_4_5 - 0.00155844155844161*G0_0_0_5_5_0 + 0.00623376623376645*G0_0_0_5_5_1 - 0.00233766233766242*G0_0_0_5_5_2 + 0.00675324675324701*G0_0_0_5_5_3 + 0.00259740259740269*G0_0_0_5_5_4 + 0.0140259740259745*G0_0_0_5_5_5 + 0.01935064935065*G0_1_0_0_0_0 + 0.000919913419913453*G0_1_0_0_0_1 - 0.00145292207792212*G0_1_0_0_0_2 + 0.00107683982683986*G0_1_0_0_0_3 + 0.00486471861471877*G0_1_0_0_0_4 + 0.00390151515151528*G0_1_0_0_0_5 + 0.000919913419913453*G0_1_0_0_1_0 - 0.0111011904761909*G0_1_0_0_1_1 + 0.00101596320346324*G0_1_0_0_1_2 - 0.00414502164502179*G0_1_0_0_1_3 - 0.000557359307359325*G0_1_0_0_1_4 - 0.00662337662337685*G0_1_0_0_1_5 - 0.00145292207792212*G0_1_0_0_2_0 + 0.00101596320346324*G0_1_0_0_2_1 - 0.000238095238095249*G0_1_0_0_2_2 + 0.0011580086580087*G0_1_0_0_2_3 + 0.0003896103896104*G0_1_0_0_2_4 + 0.00095779220779224*G0_1_0_0_2_5 + 0.00107683982683986*G0_1_0_0_3_0 - 0.00414502164502179*G0_1_0_0_3_1 + 0.0011580086580087*G0_1_0_0_3_2 - 0.00458874458874474*G0_1_0_0_3_3 - 0.00103896103896107*G0_1_0_0_3_4 - 0.00406926406926421*G0_1_0_0_3_5 + 0.00486471861471877*G0_1_0_0_4_0 - 0.000557359307359325*G0_1_0_0_4_1 + 0.0003896103896104*G0_1_0_0_4_2 - 0.00103896103896107*G0_1_0_0_4_3 + 0.00285714285714294*G0_1_0_0_4_4 - 0.000800865800865824*G0_1_0_0_4_5 + 0.00390151515151528*G0_1_0_0_5_0 - 0.00662337662337685*G0_1_0_0_5_1 + 0.00095779220779224*G0_1_0_0_5_2 - 0.00406926406926421*G0_1_0_0_5_3 - 0.000800865800865824*G0_1_0_0_5_4 - 0.0108658008658012*G0_1_0_0_5_5 + 0.000919913419913453*G0_1_0_1_0_0 - 0.0111011904761909*G0_1_0_1_0_1 + 0.00101596320346324*G0_1_0_1_0_2 - 0.00414502164502179*G0_1_0_1_0_3 - 0.000557359307359325*G0_1_0_1_0_4 - 0.00662337662337685*G0_1_0_1_0_5 - 0.0111011904761909*G0_1_0_1_1_0 + 0.166233766233772*G0_1_0_1_1_1 - 0.011696428571429*G0_1_0_1_1_2 + 0.0501082251082269*G0_1_0_1_1_3 + 0.00323593073593083*G0_1_0_1_1_4 + 0.0469696969696988*G0_1_0_1_1_5 + 0.00101596320346324*G0_1_0_1_2_0 - 0.011696428571429*G0_1_0_1_2_1 + 0.00153950216450222*G0_1_0_1_2_2 - 0.00746753246753273*G0_1_0_1_2_3 - 0.000270562770562781*G0_1_0_1_2_4 - 0.00405844155844171*G0_1_0_1_2_5 - 0.00414502164502179*G0_1_0_1_3_0 + 0.0501082251082269*G0_1_0_1_3_1 - 0.00746753246753273*G0_1_0_1_3_2 + 0.0379220779220793*G0_1_0_1_3_3 + 0.00181818181818188*G0_1_0_1_3_4 + 0.016406926406927*G0_1_0_1_3_5 - 0.000557359307359325*G0_1_0_1_4_0 + 0.00323593073593083*G0_1_0_1_4_1 - 0.000270562770562781*G0_1_0_1_4_2 + 0.00181818181818188*G0_1_0_1_4_3 + 0.000735930735930758*G0_1_0_1_4_4 + 0.0016450216450217*G0_1_0_1_4_5 - 0.00662337662337685*G0_1_0_1_5_0 + 0.0469696969696987*G0_1_0_1_5_1 - 0.00405844155844171*G0_1_0_1_5_2 + 0.016406926406927*G0_1_0_1_5_3 + 0.0016450216450217*G0_1_0_1_5_4 + 0.0331601731601744*G0_1_0_1_5_5 - 0.00145292207792212*G0_1_0_2_0_0 + 0.00101596320346324*G0_1_0_2_0_1 - 0.000238095238095249*G0_1_0_2_0_2 + 0.0011580086580087*G0_1_0_2_0_3 + 0.0003896103896104*G0_1_0_2_0_4 + 0.00095779220779224*G0_1_0_2_0_5 + 0.00101596320346324*G0_1_0_2_1_0 - 0.011696428571429*G0_1_0_2_1_1 + 0.00153950216450222*G0_1_0_2_1_2 - 0.00746753246753273*G0_1_0_2_1_3 - 0.000270562770562781*G0_1_0_2_1_4 - 0.00405844155844171*G0_1_0_2_1_5 - 0.000238095238095249*G0_1_0_2_2_0 + 0.00153950216450222*G0_1_0_2_2_1 + 0.00676136363636391*G0_1_0_2_2_2 + 0.00246753246753256*G0_1_0_2_2_3 + 0.000292207792207817*G0_1_0_2_2_4 + 0.000963203463203499*G0_1_0_2_2_5 + 0.0011580086580087*G0_1_0_2_3_0 - 0.00746753246753273*G0_1_0_2_3_1 + 0.00246753246753256*G0_1_0_2_3_2 - 0.0126406926406931*G0_1_0_2_3_3 - 0.00177489177489183*G0_1_0_2_3_4 - 0.0042424242424244*G0_1_0_2_3_5 + 0.0003896103896104*G0_1_0_2_4_0 - 0.000270562770562781*G0_1_0_2_4_1 + 0.000292207792207817*G0_1_0_2_4_2 - 0.00177489177489183*G0_1_0_2_4_3 - 0.00367965367965379*G0_1_0_2_4_4 - 0.00138528138528143*G0_1_0_2_4_5 + 0.00095779220779224*G0_1_0_2_5_0 - 0.00405844155844171*G0_1_0_2_5_1 + 0.000963203463203499*G0_1_0_2_5_2 - 0.0042424242424244*G0_1_0_2_5_3 - 0.00138528138528143*G0_1_0_2_5_4 - 0.00419913419913435*G0_1_0_2_5_5 + 0.00107683982683986*G0_1_0_3_0_0 - 0.00414502164502179*G0_1_0_3_0_1 + 0.0011580086580087*G0_1_0_3_0_2 - 0.00458874458874474*G0_1_0_3_0_3 - 0.00103896103896107*G0_1_0_3_0_4 - 0.00406926406926421*G0_1_0_3_0_5 - 0.00414502164502179*G0_1_0_3_1_0 + 0.0501082251082269*G0_1_0_3_1_1 - 0.00746753246753273*G0_1_0_3_1_2 + 0.0379220779220793*G0_1_0_3_1_3 + 0.00181818181818188*G0_1_0_3_1_4 + 0.016406926406927*G0_1_0_3_1_5 + 0.0011580086580087*G0_1_0_3_2_0 - 0.00746753246753273*G0_1_0_3_2_1 + 0.00246753246753256*G0_1_0_3_2_2 - 0.0126406926406931*G0_1_0_3_2_3 - 0.00177489177489183*G0_1_0_3_2_4 - 0.0042424242424244*G0_1_0_3_2_5 - 0.00458874458874474*G0_1_0_3_3_0 + 0.0379220779220793*G0_1_0_3_3_1 - 0.0126406926406931*G0_1_0_3_3_2 + 0.0446753246753263*G0_1_0_3_3_3 + 0.00554112554112573*G0_1_0_3_3_4 + 0.0176623376623383*G0_1_0_3_3_5 - 0.00103896103896107*G0_1_0_3_4_0 + 0.00181818181818188*G0_1_0_3_4_1 - 0.00177489177489183*G0_1_0_3_4_2 + 0.00554112554112573*G0_1_0_3_4_3 + 0.000606060606060627*G0_1_0_3_4_4 + 0.00484848484848501*G0_1_0_3_4_5 - 0.00406926406926421*G0_1_0_3_5_0 + 0.016406926406927*G0_1_0_3_5_1 - 0.0042424242424244*G0_1_0_3_5_2 + 0.0176623376623383*G0_1_0_3_5_3 + 0.00484848484848501*G0_1_0_3_5_4 + 0.0165367965367971*G0_1_0_3_5_5 + 0.00486471861471877*G0_1_0_4_0_0 - 0.000557359307359325*G0_1_0_4_0_1 + 0.0003896103896104*G0_1_0_4_0_2 - 0.00103896103896107*G0_1_0_4_0_3 + 0.00285714285714294*G0_1_0_4_0_4 - 0.000800865800865824*G0_1_0_4_0_5 - 0.000557359307359325*G0_1_0_4_1_0 + 0.00323593073593083*G0_1_0_4_1_1 - 0.000270562770562781*G0_1_0_4_1_2 + 0.00181818181818188*G0_1_0_4_1_3 + 0.000735930735930758*G0_1_0_4_1_4 + 0.0016450216450217*G0_1_0_4_1_5 + 0.0003896103896104*G0_1_0_4_2_0 - 0.000270562770562781*G0_1_0_4_2_1 + 0.000292207792207817*G0_1_0_4_2_2 - 0.00177489177489183*G0_1_0_4_2_3 - 0.00367965367965379*G0_1_0_4_2_4 - 0.00138528138528143*G0_1_0_4_2_5 - 0.00103896103896107*G0_1_0_4_3_0 + 0.00181818181818188*G0_1_0_4_3_1 - 0.00177489177489183*G0_1_0_4_3_2 + 0.00554112554112573*G0_1_0_4_3_3 + 0.000606060606060628*G0_1_0_4_3_4 + 0.00484848484848501*G0_1_0_4_3_5 + 0.00285714285714294*G0_1_0_4_4_0 + 0.000735930735930758*G0_1_0_4_4_1 - 0.00367965367965379*G0_1_0_4_4_2 + 0.000606060606060628*G0_1_0_4_4_3 - 0.0418181818181831*G0_1_0_4_4_4 + 0.00129870129870134*G0_1_0_4_4_5 - 0.000800865800865824*G0_1_0_4_5_0 + 0.0016450216450217*G0_1_0_4_5_1 - 0.00138528138528143*G0_1_0_4_5_2 + 0.00484848484848501*G0_1_0_4_5_3 + 0.00129870129870134*G0_1_0_4_5_4 + 0.00510822510822526*G0_1_0_4_5_5 + 0.00390151515151528*G0_1_0_5_0_0 - 0.00662337662337685*G0_1_0_5_0_1 + 0.00095779220779224*G0_1_0_5_0_2 - 0.00406926406926421*G0_1_0_5_0_3 - 0.000800865800865824*G0_1_0_5_0_4 - 0.0108658008658012*G0_1_0_5_0_5 - 0.00662337662337685*G0_1_0_5_1_0 + 0.0469696969696987*G0_1_0_5_1_1 - 0.00405844155844171*G0_1_0_5_1_2 + 0.016406926406927*G0_1_0_5_1_3 + 0.0016450216450217*G0_1_0_5_1_4 + 0.0331601731601744*G0_1_0_5_1_5 + 0.00095779220779224*G0_1_0_5_2_0 - 0.00405844155844171*G0_1_0_5_2_1 + 0.000963203463203499*G0_1_0_5_2_2 - 0.0042424242424244*G0_1_0_5_2_3 - 0.00138528138528143*G0_1_0_5_2_4 - 0.00419913419913435*G0_1_0_5_2_5 - 0.00406926406926421*G0_1_0_5_3_0 + 0.016406926406927*G0_1_0_5_3_1 - 0.0042424242424244*G0_1_0_5_3_2 + 0.0176623376623383*G0_1_0_5_3_3 + 0.00484848484848501*G0_1_0_5_3_4 + 0.0165367965367971*G0_1_0_5_3_5 - 0.000800865800865824*G0_1_0_5_4_0 + 0.0016450216450217*G0_1_0_5_4_1 - 0.00138528138528143*G0_1_0_5_4_2 + 0.00484848484848501*G0_1_0_5_4_3 + 0.00129870129870134*G0_1_0_5_4_4 + 0.00510822510822526*G0_1_0_5_4_5 - 0.0108658008658012*G0_1_0_5_5_0 + 0.0331601731601744*G0_1_0_5_5_1 - 0.00419913419913435*G0_1_0_5_5_2 + 0.0165367965367971*G0_1_0_5_5_3 + 0.00510822510822526*G0_1_0_5_5_4 + 0.0345454545454557*G0_1_0_5_5_5; + A[22] = 0.00262987012987022*G0_1_1_0_0_0 - 0.000328282828282839*G0_1_1_0_0_1 + 0.000618686868686889*G0_1_1_0_0_2 + 0.000537518037518054*G0_1_1_0_0_3 + 0.00139610389610394*G0_1_1_0_0_4 + 0.00163419913419919*G0_1_1_0_0_5 - 0.000328282828282839*G0_1_1_0_1_0 - 0.000328282828282839*G0_1_1_0_1_1 + 0.000523989898989916*G0_1_1_0_1_2 + 0.000335497835497846*G0_1_1_0_1_3 + 0.000335497835497846*G0_1_1_0_1_4 - 0.000548340548340566*G0_1_1_0_1_5 + 0.000618686868686889*G0_1_1_0_2_0 + 0.000523989898989916*G0_1_1_0_2_1 - 0.0058531746031748*G0_1_1_0_2_2 - 0.00189393939393946*G0_1_1_0_2_3 - 0.00353535353535365*G0_1_1_0_2_4 - 0.000227272727272736*G0_1_1_0_2_5 + 0.000537518037518054*G0_1_1_0_3_0 + 0.000335497835497846*G0_1_1_0_3_1 - 0.00189393939393946*G0_1_1_0_3_2 - 0.00236652236652244*G0_1_1_0_3_3 - 0.0017460317460318*G0_1_1_0_3_4 - 0.000620490620490641*G0_1_1_0_3_5 + 0.00139610389610394*G0_1_1_0_4_0 + 0.000335497835497846*G0_1_1_0_4_1 - 0.00353535353535366*G0_1_1_0_4_2 - 0.0017460317460318*G0_1_1_0_4_3 - 0.00337662337662349*G0_1_1_0_4_4 - 0.000216450216450224*G0_1_1_0_4_5 + 0.00163419913419919*G0_1_1_0_5_0 - 0.000548340548340566*G0_1_1_0_5_1 - 0.000227272727272736*G0_1_1_0_5_2 - 0.000620490620490641*G0_1_1_0_5_3 - 0.000216450216450224*G0_1_1_0_5_4 + 0.000692640692640719*G0_1_1_0_5_5 - 0.000328282828282839*G0_1_1_1_0_0 - 0.000328282828282839*G0_1_1_1_0_1 + 0.000523989898989916*G0_1_1_1_0_2 + 0.000335497835497846*G0_1_1_1_0_3 + 0.000335497835497846*G0_1_1_1_0_4 - 0.000548340548340566*G0_1_1_1_0_5 - 0.000328282828282839*G0_1_1_1_1_0 + 0.00262987012987022*G0_1_1_1_1_1 + 0.00061868686868689*G0_1_1_1_1_2 + 0.00139610389610394*G0_1_1_1_1_3 + 0.000537518037518055*G0_1_1_1_1_4 + 0.00163419913419919*G0_1_1_1_1_5 + 0.000523989898989916*G0_1_1_1_2_0 + 0.00061868686868689*G0_1_1_1_2_1 - 0.0058531746031748*G0_1_1_1_2_2 - 0.00353535353535366*G0_1_1_1_2_3 - 0.00189393939393946*G0_1_1_1_2_4 - 0.000227272727272736*G0_1_1_1_2_5 + 0.000335497835497846*G0_1_1_1_3_0 + 0.00139610389610394*G0_1_1_1_3_1 - 0.00353535353535366*G0_1_1_1_3_2 - 0.00337662337662349*G0_1_1_1_3_3 - 0.00174603174603181*G0_1_1_1_3_4 - 0.000216450216450224*G0_1_1_1_3_5 + 0.000335497835497846*G0_1_1_1_4_0 + 0.000537518037518055*G0_1_1_1_4_1 - 0.00189393939393946*G0_1_1_1_4_2 - 0.00174603174603181*G0_1_1_1_4_3 - 0.00236652236652245*G0_1_1_1_4_4 - 0.000620490620490642*G0_1_1_1_4_5 - 0.000548340548340566*G0_1_1_1_5_0 + 0.00163419913419919*G0_1_1_1_5_1 - 0.000227272727272736*G0_1_1_1_5_2 - 0.000216450216450224*G0_1_1_1_5_3 - 0.000620490620490642*G0_1_1_1_5_4 + 0.000692640692640716*G0_1_1_1_5_5 + 0.000618686868686889*G0_1_1_2_0_0 + 0.000523989898989916*G0_1_1_2_0_1 - 0.0058531746031748*G0_1_1_2_0_2 - 0.00189393939393946*G0_1_1_2_0_3 - 0.00353535353535365*G0_1_1_2_0_4 - 0.000227272727272736*G0_1_1_2_0_5 + 0.000523989898989916*G0_1_1_2_1_0 + 0.00061868686868689*G0_1_1_2_1_1 - 0.0058531746031748*G0_1_1_2_1_2 - 0.00353535353535366*G0_1_1_2_1_3 - 0.00189393939393946*G0_1_1_2_1_4 - 0.000227272727272736*G0_1_1_2_1_5 - 0.0058531746031748*G0_1_1_2_2_0 - 0.0058531746031748*G0_1_1_2_2_1 + 0.0918019480519512*G0_1_1_2_2_2 + 0.0250541125541134*G0_1_1_2_2_3 + 0.0250541125541134*G0_1_1_2_2_4 + 0.00164141414141421*G0_1_1_2_2_5 - 0.00189393939393946*G0_1_1_2_3_0 - 0.00353535353535366*G0_1_1_2_3_1 + 0.0250541125541134*G0_1_1_2_3_2 + 0.0151515151515157*G0_1_1_2_3_3 + 0.00757575757575784*G0_1_1_2_3_4 + 0.000505050505050528*G0_1_1_2_3_5 - 0.00353535353535366*G0_1_1_2_4_0 - 0.00189393939393946*G0_1_1_2_4_1 + 0.0250541125541134*G0_1_1_2_4_2 + 0.00757575757575784*G0_1_1_2_4_3 + 0.0151515151515157*G0_1_1_2_4_4 + 0.000505050505050527*G0_1_1_2_4_5 - 0.000227272727272736*G0_1_1_2_5_0 - 0.000227272727272736*G0_1_1_2_5_1 + 0.00164141414141421*G0_1_1_2_5_2 + 0.000505050505050528*G0_1_1_2_5_3 + 0.000505050505050527*G0_1_1_2_5_4 - 0.000808080808080834*G0_1_1_2_5_5 + 0.000537518037518054*G0_1_1_3_0_0 + 0.000335497835497846*G0_1_1_3_0_1 - 0.00189393939393946*G0_1_1_3_0_2 - 0.00236652236652244*G0_1_1_3_0_3 - 0.0017460317460318*G0_1_1_3_0_4 - 0.000620490620490641*G0_1_1_3_0_5 + 0.000335497835497846*G0_1_1_3_1_0 + 0.00139610389610394*G0_1_1_3_1_1 - 0.00353535353535366*G0_1_1_3_1_2 - 0.00337662337662349*G0_1_1_3_1_3 - 0.00174603174603181*G0_1_1_3_1_4 - 0.000216450216450224*G0_1_1_3_1_5 - 0.00189393939393946*G0_1_1_3_2_0 - 0.00353535353535366*G0_1_1_3_2_1 + 0.0250541125541134*G0_1_1_3_2_2 + 0.0151515151515157*G0_1_1_3_2_3 + 0.00757575757575784*G0_1_1_3_2_4 + 0.000505050505050528*G0_1_1_3_2_5 - 0.00236652236652244*G0_1_1_3_3_0 - 0.00337662337662349*G0_1_1_3_3_1 + 0.0151515151515157*G0_1_1_3_3_2 + 0.0246753246753255*G0_1_1_3_3_3 + 0.0082251082251085*G0_1_1_3_3_4 + 0.00372294372294385*G0_1_1_3_3_5 - 0.0017460317460318*G0_1_1_3_4_0 - 0.00174603174603181*G0_1_1_3_4_1 + 0.00757575757575784*G0_1_1_3_4_2 + 0.0082251082251085*G0_1_1_3_4_3 + 0.0082251082251085*G0_1_1_3_4_4 + 0.00248196248196257*G0_1_1_3_4_5 - 0.000620490620490641*G0_1_1_3_5_0 - 0.000216450216450224*G0_1_1_3_5_1 + 0.000505050505050528*G0_1_1_3_5_2 + 0.00372294372294385*G0_1_1_3_5_3 + 0.00248196248196257*G0_1_1_3_5_4 + 0.00285714285714295*G0_1_1_3_5_5 + 0.00139610389610394*G0_1_1_4_0_0 + 0.000335497835497846*G0_1_1_4_0_1 - 0.00353535353535366*G0_1_1_4_0_2 - 0.0017460317460318*G0_1_1_4_0_3 - 0.00337662337662349*G0_1_1_4_0_4 - 0.000216450216450224*G0_1_1_4_0_5 + 0.000335497835497846*G0_1_1_4_1_0 + 0.000537518037518055*G0_1_1_4_1_1 - 0.00189393939393946*G0_1_1_4_1_2 - 0.00174603174603181*G0_1_1_4_1_3 - 0.00236652236652245*G0_1_1_4_1_4 - 0.000620490620490642*G0_1_1_4_1_5 - 0.00353535353535366*G0_1_1_4_2_0 - 0.00189393939393946*G0_1_1_4_2_1 + 0.0250541125541134*G0_1_1_4_2_2 + 0.00757575757575784*G0_1_1_4_2_3 + 0.0151515151515157*G0_1_1_4_2_4 + 0.000505050505050527*G0_1_1_4_2_5 - 0.0017460317460318*G0_1_1_4_3_0 - 0.00174603174603181*G0_1_1_4_3_1 + 0.00757575757575784*G0_1_1_4_3_2 + 0.0082251082251085*G0_1_1_4_3_3 + 0.0082251082251085*G0_1_1_4_3_4 + 0.00248196248196257*G0_1_1_4_3_5 - 0.00337662337662349*G0_1_1_4_4_0 - 0.00236652236652245*G0_1_1_4_4_1 + 0.0151515151515157*G0_1_1_4_4_2 + 0.0082251082251085*G0_1_1_4_4_3 + 0.0246753246753255*G0_1_1_4_4_4 + 0.00372294372294385*G0_1_1_4_4_5 - 0.000216450216450224*G0_1_1_4_5_0 - 0.000620490620490642*G0_1_1_4_5_1 + 0.000505050505050527*G0_1_1_4_5_2 + 0.00248196248196257*G0_1_1_4_5_3 + 0.00372294372294385*G0_1_1_4_5_4 + 0.00285714285714295*G0_1_1_4_5_5 + 0.00163419913419919*G0_1_1_5_0_0 - 0.000548340548340566*G0_1_1_5_0_1 - 0.000227272727272736*G0_1_1_5_0_2 - 0.000620490620490641*G0_1_1_5_0_3 - 0.000216450216450224*G0_1_1_5_0_4 + 0.000692640692640719*G0_1_1_5_0_5 - 0.000548340548340566*G0_1_1_5_1_0 + 0.00163419913419919*G0_1_1_5_1_1 - 0.000227272727272736*G0_1_1_5_1_2 - 0.000216450216450224*G0_1_1_5_1_3 - 0.000620490620490642*G0_1_1_5_1_4 + 0.000692640692640716*G0_1_1_5_1_5 - 0.000227272727272736*G0_1_1_5_2_0 - 0.000227272727272736*G0_1_1_5_2_1 + 0.00164141414141421*G0_1_1_5_2_2 + 0.000505050505050528*G0_1_1_5_2_3 + 0.000505050505050527*G0_1_1_5_2_4 - 0.000808080808080834*G0_1_1_5_2_5 - 0.000620490620490641*G0_1_1_5_3_0 - 0.000216450216450224*G0_1_1_5_3_1 + 0.000505050505050528*G0_1_1_5_3_2 + 0.00372294372294385*G0_1_1_5_3_3 + 0.00248196248196257*G0_1_1_5_3_4 + 0.00285714285714295*G0_1_1_5_3_5 - 0.000216450216450224*G0_1_1_5_4_0 - 0.000620490620490642*G0_1_1_5_4_1 + 0.000505050505050527*G0_1_1_5_4_2 + 0.00248196248196257*G0_1_1_5_4_3 + 0.00372294372294385*G0_1_1_5_4_4 + 0.00285714285714295*G0_1_1_5_4_5 + 0.000692640692640719*G0_1_1_5_5_0 + 0.000692640692640716*G0_1_1_5_5_1 - 0.000808080808080834*G0_1_1_5_5_2 + 0.00285714285714295*G0_1_1_5_5_3 + 0.00285714285714295*G0_1_1_5_5_4 + 0.0168831168831174*G0_1_1_5_5_5; + A[82] = A[22] - 0.00756087662337686*G0_0_1_0_0_0 + 0.000116341991341994*G0_0_1_0_0_2 - 0.000129870129870133*G0_0_1_0_0_3 - 0.000703463203463223*G0_0_1_0_0_4 - 0.000351731601731606*G0_0_1_0_0_5 + 0.00127299783549788*G0_0_1_0_1_1 - 0.000238095238095247*G0_0_1_0_1_4 - 0.000162337662337669*G0_0_1_0_1_5 + 0.000116341991341994*G0_0_1_0_2_0 + 0.000346320346320364*G0_0_1_0_2_2 - 0.000270562770562777*G0_0_1_0_2_3 - 0.000281385281385291*G0_0_1_0_2_5 - 0.000129870129870133*G0_0_1_0_3_0 - 0.000270562770562777*G0_0_1_0_3_2 + 0.000129870129870135*G0_0_1_0_3_3 + 0.000735930735930761*G0_0_1_0_3_4 + 0.000822510822510849*G0_0_1_0_3_5 - 0.000703463203463223*G0_0_1_0_4_0 - 0.000238095238095247*G0_0_1_0_4_1 + 0.00073593073593076*G0_0_1_0_4_3 + 0.00380952380952394*G0_0_1_0_4_4 + 0.00103896103896107*G0_0_1_0_4_5 - 0.000351731601731606*G0_0_1_0_5_0 - 0.000162337662337669*G0_0_1_0_5_1 - 0.000281385281385291*G0_0_1_0_5_2 + 0.000822510822510849*G0_0_1_0_5_3 + 0.00103896103896107*G0_0_1_0_5_4 + 0.00339826839826852*G0_0_1_0_5_5 + 0.00127299783549788*G0_0_1_1_0_1 - 0.000238095238095247*G0_0_1_1_0_4 - 0.000162337662337669*G0_0_1_1_0_5 + 0.00127299783549788*G0_0_1_1_1_0 - 0.020150162337663*G0_0_1_1_1_1 + 0.000735930735930759*G0_0_1_1_1_2 - 0.00213744588744595*G0_0_1_1_1_3 - 0.000243506493506499*G0_0_1_1_1_4 - 0.0049242424242426*G0_0_1_1_1_5 + 0.000735930735930759*G0_0_1_1_2_1 - 0.000248917748917752*G0_0_1_1_2_2 - 0.000844155844155871*G0_0_1_1_2_3 - 0.000183982683982689*G0_0_1_1_2_4 - 0.00213744588744595*G0_0_1_1_3_1 - 0.000844155844155871*G0_0_1_1_3_2 + 0.00203463203463211*G0_0_1_1_3_3 + 0.000562770562770583*G0_0_1_1_3_4 - 0.000238095238095247*G0_0_1_1_4_0 - 0.000243506493506499*G0_0_1_1_4_1 - 0.000183982683982689*G0_0_1_1_4_2 + 0.000562770562770583*G0_0_1_1_4_3 + 0.000519480519480538*G0_0_1_1_4_4 + 0.000476190476190493*G0_0_1_1_4_5 - 0.000162337662337669*G0_0_1_1_5_0 - 0.0049242424242426*G0_0_1_1_5_1 + 0.000476190476190493*G0_0_1_1_5_4 - 0.00313852813852825*G0_0_1_1_5_5 + 0.000116341991341994*G0_0_1_2_0_0 + 0.000346320346320364*G0_0_1_2_0_2 - 0.000270562770562777*G0_0_1_2_0_3 - 0.000281385281385291*G0_0_1_2_0_5 + 0.000735930735930759*G0_0_1_2_1_1 - 0.000248917748917752*G0_0_1_2_1_2 - 0.000844155844155871*G0_0_1_2_1_3 - 0.000183982683982689*G0_0_1_2_1_4 + 0.000346320346320364*G0_0_1_2_2_0 - 0.000248917748917752*G0_0_1_2_2_1 + 0.0015692640692641*G0_0_1_2_2_3 - 0.00156926406926415*G0_0_1_2_2_4 - 0.000270562770562777*G0_0_1_2_3_0 - 0.000844155844155871*G0_0_1_2_3_1 + 0.0015692640692641*G0_0_1_2_3_2 + 0.00147186147186151*G0_0_1_2_3_3 + 0.000909090909090932*G0_0_1_2_3_4 + 0.00073593073593076*G0_0_1_2_3_5 - 0.000183982683982689*G0_0_1_2_4_1 - 0.00156926406926415*G0_0_1_2_4_2 + 0.000909090909090932*G0_0_1_2_4_3 - 0.00329004329004341*G0_0_1_2_4_4 + 0.000562770562770581*G0_0_1_2_4_5 - 0.000281385281385291*G0_0_1_2_5_0 + 0.00073593073593076*G0_0_1_2_5_3 + 0.000562770562770581*G0_0_1_2_5_4 - 0.000389610389610402*G0_0_1_2_5_5 - 0.000129870129870133*G0_0_1_3_0_0 - 0.000270562770562777*G0_0_1_3_0_2 + 0.000129870129870135*G0_0_1_3_0_3 + 0.000735930735930761*G0_0_1_3_0_4 + 0.000822510822510849*G0_0_1_3_0_5 - 0.00213744588744595*G0_0_1_3_1_1 - 0.000844155844155871*G0_0_1_3_1_2 + 0.00203463203463211*G0_0_1_3_1_3 + 0.000562770562770583*G0_0_1_3_1_4 - 0.000270562770562777*G0_0_1_3_2_0 - 0.000844155844155871*G0_0_1_3_2_1 + 0.0015692640692641*G0_0_1_3_2_2 + 0.00147186147186151*G0_0_1_3_2_3 + 0.000909090909090932*G0_0_1_3_2_4 + 0.00073593073593076*G0_0_1_3_2_5 + 0.000129870129870135*G0_0_1_3_3_0 + 0.00203463203463211*G0_0_1_3_3_1 + 0.00147186147186151*G0_0_1_3_3_2 + 0.0109090909090913*G0_0_1_3_3_3 - 0.00138528138528143*G0_0_1_3_3_4 - 0.00173160173160178*G0_0_1_3_3_5 + 0.000735930735930761*G0_0_1_3_4_0 + 0.000562770562770583*G0_0_1_3_4_1 + 0.000909090909090932*G0_0_1_3_4_2 - 0.00138528138528143*G0_0_1_3_4_3 - 0.0025108225108226*G0_0_1_3_4_4 - 0.00259740259740268*G0_0_1_3_4_5 + 0.000822510822510849*G0_0_1_3_5_0 + 0.00073593073593076*G0_0_1_3_5_2 - 0.00173160173160178*G0_0_1_3_5_3 - 0.00259740259740268*G0_0_1_3_5_4 - 0.000865800865800898*G0_0_1_3_5_5 - 0.000703463203463223*G0_0_1_4_0_0 - 0.000238095238095247*G0_0_1_4_0_1 + 0.000735930735930761*G0_0_1_4_0_3 + 0.00380952380952394*G0_0_1_4_0_4 + 0.00103896103896107*G0_0_1_4_0_5 - 0.000238095238095247*G0_0_1_4_1_0 - 0.000243506493506499*G0_0_1_4_1_1 - 0.000183982683982689*G0_0_1_4_1_2 + 0.000562770562770583*G0_0_1_4_1_3 + 0.000519480519480538*G0_0_1_4_1_4 + 0.000476190476190493*G0_0_1_4_1_5 - 0.000183982683982689*G0_0_1_4_2_1 - 0.00156926406926415*G0_0_1_4_2_2 + 0.000909090909090932*G0_0_1_4_2_3 - 0.00329004329004341*G0_0_1_4_2_4 + 0.000562770562770581*G0_0_1_4_2_5 + 0.000735930735930761*G0_0_1_4_3_0 + 0.000562770562770583*G0_0_1_4_3_1 + 0.000909090909090932*G0_0_1_4_3_2 - 0.00138528138528143*G0_0_1_4_3_3 - 0.0025108225108226*G0_0_1_4_3_4 - 0.00259740259740268*G0_0_1_4_3_5 + 0.00380952380952394*G0_0_1_4_4_0 + 0.000519480519480538*G0_0_1_4_4_1 - 0.00329004329004342*G0_0_1_4_4_2 - 0.0025108225108226*G0_0_1_4_4_3 + 0.000779220779220778*G0_0_1_4_4_4 - 0.00216450216450224*G0_0_1_4_4_5 + 0.00103896103896107*G0_0_1_4_5_0 + 0.000476190476190493*G0_0_1_4_5_1 + 0.000562770562770581*G0_0_1_4_5_2 - 0.00259740259740268*G0_0_1_4_5_3 - 0.00216450216450224*G0_0_1_4_5_4 - 0.000173160173160184*G0_0_1_4_5_5 - 0.000351731601731606*G0_0_1_5_0_0 - 0.000162337662337669*G0_0_1_5_0_1 - 0.000281385281385291*G0_0_1_5_0_2 + 0.000822510822510849*G0_0_1_5_0_3 + 0.00103896103896107*G0_0_1_5_0_4 + 0.00339826839826852*G0_0_1_5_0_5 - 0.000162337662337669*G0_0_1_5_1_0 - 0.0049242424242426*G0_0_1_5_1_1 + 0.000476190476190493*G0_0_1_5_1_4 - 0.00313852813852824*G0_0_1_5_1_5 - 0.000281385281385291*G0_0_1_5_2_0 + 0.00073593073593076*G0_0_1_5_2_3 + 0.000562770562770581*G0_0_1_5_2_4 - 0.000389610389610402*G0_0_1_5_2_5 + 0.000822510822510849*G0_0_1_5_3_0 + 0.00073593073593076*G0_0_1_5_3_2 - 0.00173160173160178*G0_0_1_5_3_3 - 0.00259740259740268*G0_0_1_5_3_4 - 0.000865800865800898*G0_0_1_5_3_5 + 0.00103896103896107*G0_0_1_5_4_0 + 0.000476190476190493*G0_0_1_5_4_1 + 0.000562770562770581*G0_0_1_5_4_2 - 0.00259740259740268*G0_0_1_5_4_3 - 0.00216450216450224*G0_0_1_5_4_4 - 0.000173160173160184*G0_0_1_5_4_5 + 0.00339826839826852*G0_0_1_5_5_0 - 0.00313852813852824*G0_0_1_5_5_1 - 0.000389610389610402*G0_0_1_5_5_2 - 0.000865800865800898*G0_0_1_5_5_3 - 0.000173160173160184*G0_0_1_5_5_4 + 0.0397402597402611*G0_0_1_5_5_5 - 0.00183035714285721*G0_1_1_0_0_0 - 0.000134379509379512*G0_1_1_0_0_1 - 0.000584866522366542*G0_1_1_0_0_2 - 0.000348124098124109*G0_1_1_0_0_3 - 0.00119047619047623*G0_1_1_0_0_4 - 0.0015963203463204*G0_1_1_0_0_5 - 0.000134379509379512*G0_1_1_0_1_0 + 0.0023886183261184*G0_1_1_0_1_1 - 0.000537518037518055*G0_1_1_0_1_2 - 0.000221861471861479*G0_1_1_0_1_4 + 0.00226911976911984*G0_1_1_0_1_5 - 0.000584866522366542*G0_1_1_0_2_0 - 0.000537518037518055*G0_1_1_0_2_1 + 0.00543650793650812*G0_1_1_0_2_2 + 0.00185064935064941*G0_1_1_0_2_3 + 0.00330808080808092*G0_1_1_0_2_4 + 0.000135281385281392*G0_1_1_0_2_5 - 0.000348124098124109*G0_1_1_0_3_0 + 0.00185064935064941*G0_1_1_0_3_2 + 0.000591630591630609*G0_1_1_0_3_3 + 0.00113997113997118*G0_1_1_0_3_4 + 0.000425685425685439*G0_1_1_0_3_5 - 0.00119047619047623*G0_1_1_0_4_0 - 0.000221861471861479*G0_1_1_0_4_1 + 0.00330808080808092*G0_1_1_0_4_2 + 0.00113997113997118*G0_1_1_0_4_3 + 0.00268398268398277*G0_1_1_0_4_4 + 0.000173160173160177*G0_1_1_0_4_5 - 0.0015963203463204*G0_1_1_0_5_0 + 0.00226911976911984*G0_1_1_0_5_1 + 0.000135281385281392*G0_1_1_0_5_2 + 0.000425685425685439*G0_1_1_0_5_3 + 0.000173160173160177*G0_1_1_0_5_4 + 0.00287878787878796*G0_1_1_0_5_5 - 0.000134379509379512*G0_1_1_1_0_0 + 0.0023886183261184*G0_1_1_1_0_1 - 0.000537518037518055*G0_1_1_1_0_2 - 0.000221861471861479*G0_1_1_1_0_4 + 0.00226911976911984*G0_1_1_1_0_5 + 0.0023886183261184*G0_1_1_1_1_0 - 0.0278733766233776*G0_1_1_1_1_1 + 0.00034586940836942*G0_1_1_1_1_2 - 0.00415584415584429*G0_1_1_1_1_3 - 0.000802669552669576*G0_1_1_1_1_4 - 0.0112121212121216*G0_1_1_1_1_5 - 0.000537518037518055*G0_1_1_1_2_0 + 0.00034586940836942*G0_1_1_1_2_1 + 0.00534181096681115*G0_1_1_1_2_2 + 0.00272366522366532*G0_1_1_1_2_3 + 0.00156926406926412*G0_1_1_1_2_4 + 0.000611471861471883*G0_1_1_1_2_5 - 0.00415584415584429*G0_1_1_1_3_1 + 0.00272366522366532*G0_1_1_1_3_2 + 0.00536796536796556*G0_1_1_1_3_3 + 0.00170274170274176*G0_1_1_1_3_4 - 0.00112554112554116*G0_1_1_1_3_5 - 0.000221861471861479*G0_1_1_1_4_0 - 0.000802669552669576*G0_1_1_1_4_1 + 0.00156926406926412*G0_1_1_1_4_2 + 0.00170274170274176*G0_1_1_1_4_3 + 0.00240981240981249*G0_1_1_1_4_4 + 0.000382395382395398*G0_1_1_1_4_5 + 0.00226911976911984*G0_1_1_1_5_0 - 0.0112121212121216*G0_1_1_1_5_1 + 0.000611471861471883*G0_1_1_1_5_2 - 0.00112554112554116*G0_1_1_1_5_3 + 0.000382395382395398*G0_1_1_1_5_4 - 0.0103896103896107*G0_1_1_1_5_5 - 0.000584866522366542*G0_1_1_2_0_0 - 0.000537518037518055*G0_1_1_2_0_1 + 0.00543650793650812*G0_1_1_2_0_2 + 0.00185064935064941*G0_1_1_2_0_3 + 0.00330808080808092*G0_1_1_2_0_4 + 0.000135281385281392*G0_1_1_2_0_5 - 0.000537518037518055*G0_1_1_2_1_0 + 0.00034586940836942*G0_1_1_2_1_1 + 0.00534181096681115*G0_1_1_2_1_2 + 0.00272366522366532*G0_1_1_2_1_3 + 0.00156926406926412*G0_1_1_2_1_4 + 0.000611471861471883*G0_1_1_2_1_5 + 0.00543650793650812*G0_1_1_2_2_0 + 0.00534181096681115*G0_1_1_2_2_1 - 0.0874594155844187*G0_1_1_2_2_2 - 0.0222402597402605*G0_1_1_2_2_3 - 0.0234848484848493*G0_1_1_2_2_4 - 0.00140331890331897*G0_1_1_2_2_5 + 0.00185064935064941*G0_1_1_2_3_0 + 0.00272366522366532*G0_1_1_2_3_1 - 0.0222402597402605*G0_1_1_2_3_2 - 0.0156709956709962*G0_1_1_2_3_3 - 0.00683982683982708*G0_1_1_2_3_4 - 0.000894660894660932*G0_1_1_2_3_5 + 0.00330808080808092*G0_1_1_2_4_0 + 0.00156926406926412*G0_1_1_2_4_1 - 0.0234848484848493*G0_1_1_2_4_2 - 0.00683982683982708*G0_1_1_2_4_3 - 0.013506493506494*G0_1_1_2_4_4 - 0.000331890331890349*G0_1_1_2_4_5 + 0.000135281385281392*G0_1_1_2_5_0 + 0.000611471861471883*G0_1_1_2_5_1 - 0.00140331890331897*G0_1_1_2_5_2 - 0.000894660894660932*G0_1_1_2_5_3 - 0.000331890331890349*G0_1_1_2_5_4 + 0.00156565656565662*G0_1_1_2_5_5 - 0.000348124098124109*G0_1_1_3_0_0 + 0.00185064935064941*G0_1_1_3_0_2 + 0.00059163059163061*G0_1_1_3_0_3 + 0.00113997113997118*G0_1_1_3_0_4 + 0.000425685425685439*G0_1_1_3_0_5 - 0.00415584415584429*G0_1_1_3_1_1 + 0.00272366522366532*G0_1_1_3_1_2 + 0.00536796536796556*G0_1_1_3_1_3 + 0.00170274170274176*G0_1_1_3_1_4 - 0.00112554112554116*G0_1_1_3_1_5 + 0.00185064935064941*G0_1_1_3_2_0 + 0.00272366522366532*G0_1_1_3_2_1 - 0.0222402597402605*G0_1_1_3_2_2 - 0.0156709956709962*G0_1_1_3_2_3 - 0.00683982683982708*G0_1_1_3_2_4 - 0.000894660894660932*G0_1_1_3_2_5 + 0.00059163059163061*G0_1_1_3_3_0 + 0.00536796536796556*G0_1_1_3_3_1 - 0.0156709956709962*G0_1_1_3_3_2 - 0.0023376623376624*G0_1_1_3_3_3 - 0.00458874458874474*G0_1_1_3_3_4 + 0.000606060606060629*G0_1_1_3_3_5 + 0.00113997113997118*G0_1_1_3_4_0 + 0.00170274170274176*G0_1_1_3_4_1 - 0.00683982683982708*G0_1_1_3_4_2 - 0.00458874458874474*G0_1_1_3_4_3 - 0.00709956709956735*G0_1_1_3_4_4 - 0.00161616161616167*G0_1_1_3_4_5 + 0.000425685425685438*G0_1_1_3_5_0 - 0.00112554112554116*G0_1_1_3_5_1 - 0.000894660894660932*G0_1_1_3_5_2 + 0.000606060606060629*G0_1_1_3_5_3 - 0.00161616161616167*G0_1_1_3_5_4 - 0.00398268398268411*G0_1_1_3_5_5 - 0.00119047619047623*G0_1_1_4_0_0 - 0.000221861471861479*G0_1_1_4_0_1 + 0.00330808080808092*G0_1_1_4_0_2 + 0.00113997113997118*G0_1_1_4_0_3 + 0.00268398268398277*G0_1_1_4_0_4 + 0.000173160173160177*G0_1_1_4_0_5 - 0.000221861471861479*G0_1_1_4_1_0 - 0.000802669552669576*G0_1_1_4_1_1 + 0.00156926406926412*G0_1_1_4_1_2 + 0.00170274170274176*G0_1_1_4_1_3 + 0.00240981240981249*G0_1_1_4_1_4 + 0.000382395382395398*G0_1_1_4_1_5 + 0.00330808080808092*G0_1_1_4_2_0 + 0.00156926406926412*G0_1_1_4_2_1 - 0.0234848484848493*G0_1_1_4_2_2 - 0.00683982683982708*G0_1_1_4_2_3 - 0.013506493506494*G0_1_1_4_2_4 - 0.000331890331890349*G0_1_1_4_2_5 + 0.00113997113997118*G0_1_1_4_3_0 + 0.00170274170274176*G0_1_1_4_3_1 - 0.00683982683982708*G0_1_1_4_3_2 - 0.00458874458874474*G0_1_1_4_3_3 - 0.00709956709956735*G0_1_1_4_3_4 - 0.00161616161616167*G0_1_1_4_3_5 + 0.00268398268398277*G0_1_1_4_4_0 + 0.00240981240981249*G0_1_1_4_4_1 - 0.013506493506494*G0_1_1_4_4_2 - 0.00709956709956735*G0_1_1_4_4_3 - 0.0249350649350658*G0_1_1_4_4_4 - 0.0041558441558443*G0_1_1_4_4_5 + 0.000173160173160177*G0_1_1_4_5_0 + 0.000382395382395398*G0_1_1_4_5_1 - 0.000331890331890349*G0_1_1_4_5_2 - 0.00161616161616167*G0_1_1_4_5_3 - 0.0041558441558443*G0_1_1_4_5_4 - 0.00389610389610402*G0_1_1_4_5_5 - 0.0015963203463204*G0_1_1_5_0_0 + 0.00226911976911984*G0_1_1_5_0_1 + 0.000135281385281392*G0_1_1_5_0_2 + 0.000425685425685439*G0_1_1_5_0_3 + 0.000173160173160177*G0_1_1_5_0_4 + 0.00287878787878796*G0_1_1_5_0_5 + 0.00226911976911984*G0_1_1_5_1_0 - 0.0112121212121216*G0_1_1_5_1_1 + 0.000611471861471883*G0_1_1_5_1_2 - 0.00112554112554116*G0_1_1_5_1_3 + 0.000382395382395398*G0_1_1_5_1_4 - 0.0103896103896107*G0_1_1_5_1_5 + 0.000135281385281392*G0_1_1_5_2_0 + 0.000611471861471883*G0_1_1_5_2_1 - 0.00140331890331897*G0_1_1_5_2_2 - 0.000894660894660932*G0_1_1_5_2_3 - 0.000331890331890349*G0_1_1_5_2_4 + 0.00156565656565662*G0_1_1_5_2_5 + 0.000425685425685439*G0_1_1_5_3_0 - 0.00112554112554116*G0_1_1_5_3_1 - 0.000894660894660932*G0_1_1_5_3_2 + 0.00060606060606063*G0_1_1_5_3_3 - 0.00161616161616167*G0_1_1_5_3_4 - 0.00398268398268411*G0_1_1_5_3_5 + 0.000173160173160177*G0_1_1_5_4_0 + 0.000382395382395398*G0_1_1_5_4_1 - 0.000331890331890349*G0_1_1_5_4_2 - 0.00161616161616167*G0_1_1_5_4_3 - 0.0041558441558443*G0_1_1_5_4_4 - 0.00389610389610402*G0_1_1_5_4_5 + 0.00287878787878796*G0_1_1_5_5_0 - 0.0103896103896107*G0_1_1_5_5_1 + 0.00156565656565662*G0_1_1_5_5_2 - 0.00398268398268411*G0_1_1_5_5_3 - 0.00389610389610402*G0_1_1_5_5_4 - 0.0436363636363651*G0_1_1_5_5_5; + A[32] = -A[82] - 0.00748376623376648*G0_0_1_0_0_0 + 0.000162337662337666*G0_0_1_0_0_1 - 0.000533008658008677*G0_0_1_0_0_2 - 0.00085497835497838*G0_0_1_0_0_3 - 0.00160173160173165*G0_0_1_0_0_4 - 0.000670995670995687*G0_0_1_0_0_5 + 0.000162337662337666*G0_0_1_0_1_0 + 0.00119047619047623*G0_0_1_0_1_1 - 0.000201569264069271*G0_0_1_0_1_2 - 0.000681818181818205*G0_0_1_0_1_4 - 0.000487012987013004*G0_0_1_0_1_5 - 0.000533008658008677*G0_0_1_0_2_0 - 0.000201569264069271*G0_0_1_0_2_1 + 0.00531114718614737*G0_0_1_0_2_2 + 0.00305194805194816*G0_0_1_0_2_4 - 0.000508658008658024*G0_0_1_0_2_5 - 0.00085497835497838*G0_0_1_0_3_0 + 0.00385281385281397*G0_0_1_0_3_3 + 0.00307359307359317*G0_0_1_0_3_4 + 0.00272727272727282*G0_0_1_0_3_5 - 0.00160173160173165*G0_0_1_0_4_0 - 0.000681818181818205*G0_0_1_0_4_1 + 0.00305194805194816*G0_0_1_0_4_2 + 0.00307359307359317*G0_0_1_0_4_3 + 0.0105627705627709*G0_0_1_0_4_4 + 0.00238095238095246*G0_0_1_0_4_5 - 0.000670995670995687*G0_0_1_0_5_0 - 0.000487012987013004*G0_0_1_0_5_1 - 0.000508658008658025*G0_0_1_0_5_2 + 0.00272727272727282*G0_0_1_0_5_3 + 0.00238095238095246*G0_0_1_0_5_4 + 0.00441558441558458*G0_0_1_0_5_5 + 0.000162337662337666*G0_0_1_1_0_0 + 0.00119047619047623*G0_0_1_1_0_1 - 0.000201569264069271*G0_0_1_1_0_2 - 0.000681818181818204*G0_0_1_1_0_4 - 0.000487012987013004*G0_0_1_1_0_5 + 0.00119047619047623*G0_0_1_1_1_0 - 0.0183441558441565*G0_0_1_1_1_1 + 0.000703463203463227*G0_0_1_1_1_2 - 0.00284090909090919*G0_0_1_1_1_3 - 0.000514069264069279*G0_0_1_1_1_4 - 0.00430194805194821*G0_0_1_1_1_5 - 0.000201569264069271*G0_0_1_1_2_0 + 0.000703463203463227*G0_0_1_1_2_1 + 0.00252435064935074*G0_0_1_1_2_2 + 0.000974025974026008*G0_0_1_1_2_4 - 0.00284090909090919*G0_0_1_1_3_1 - 0.00367965367965381*G0_0_1_1_3_3 + 0.00108225108225112*G0_0_1_1_3_4 + 0.000108225108225108*G0_0_1_1_3_5 - 0.000681818181818205*G0_0_1_1_4_0 - 0.000514069264069279*G0_0_1_1_4_1 + 0.000974025974026008*G0_0_1_1_4_2 + 0.00108225108225112*G0_0_1_1_4_3 + 0.00216450216450223*G0_0_1_1_4_4 + 0.00108225108225112*G0_0_1_1_4_5 - 0.000487012987013004*G0_0_1_1_5_0 - 0.00430194805194821*G0_0_1_1_5_1 + 0.000108225108225108*G0_0_1_1_5_3 + 0.00108225108225112*G0_0_1_1_5_4 - 0.00173160173160179*G0_0_1_1_5_5 - 0.000533008658008677*G0_0_1_2_0_0 - 0.000201569264069271*G0_0_1_2_0_1 + 0.00531114718614737*G0_0_1_2_0_2 + 0.00305194805194816*G0_0_1_2_0_4 - 0.000508658008658025*G0_0_1_2_0_5 - 0.000201569264069271*G0_0_1_2_1_0 + 0.000703463203463227*G0_0_1_2_1_1 + 0.00252435064935074*G0_0_1_2_1_2 + 0.000974025974026008*G0_0_1_2_1_4 + 0.00531114718614737*G0_0_1_2_2_0 + 0.00252435064935074*G0_0_1_2_2_1 - 0.0668019480519504*G0_0_1_2_2_2 - 0.010119047619048*G0_0_1_2_2_3 - 0.0233225108225116*G0_0_1_2_2_4 - 0.0013419913419914*G0_0_1_2_2_5 - 0.010119047619048*G0_0_1_2_3_2 + 0.00753246753246777*G0_0_1_2_3_3 - 0.00190476190476198*G0_0_1_2_3_4 + 0.00272727272727282*G0_0_1_2_3_5 + 0.00305194805194815*G0_0_1_2_4_0 + 0.000974025974026008*G0_0_1_2_4_1 - 0.0233225108225116*G0_0_1_2_4_2 - 0.00190476190476198*G0_0_1_2_4_3 - 0.0206060606060613*G0_0_1_2_4_4 + 0.000735930735930755*G0_0_1_2_4_5 - 0.000508658008658024*G0_0_1_2_5_0 - 0.0013419913419914*G0_0_1_2_5_2 + 0.00272727272727282*G0_0_1_2_5_3 + 0.000735930735930755*G0_0_1_2_5_4 + 0.000735930735930762*G0_0_1_2_5_5 - 0.00085497835497838*G0_0_1_3_0_0 + 0.00385281385281397*G0_0_1_3_0_3 + 0.00307359307359317*G0_0_1_3_0_4 + 0.00272727272727282*G0_0_1_3_0_5 - 0.00284090909090919*G0_0_1_3_1_1 - 0.00367965367965381*G0_0_1_3_1_3 + 0.00108225108225112*G0_0_1_3_1_4 + 0.000108225108225108*G0_0_1_3_1_5 - 0.010119047619048*G0_0_1_3_2_2 + 0.00753246753246777*G0_0_1_3_2_3 - 0.00190476190476198*G0_0_1_3_2_4 + 0.00272727272727282*G0_0_1_3_2_5 + 0.00385281385281397*G0_0_1_3_3_0 - 0.00367965367965381*G0_0_1_3_3_1 + 0.00753246753246777*G0_0_1_3_3_2 - 0.0161038961038966*G0_0_1_3_3_3 - 0.00987012987013019*G0_0_1_3_3_4 - 0.0131601731601736*G0_0_1_3_3_5 + 0.00307359307359317*G0_0_1_3_4_0 + 0.00108225108225112*G0_0_1_3_4_1 - 0.00190476190476198*G0_0_1_3_4_2 - 0.00987012987013019*G0_0_1_3_4_3 - 0.0104761904761908*G0_0_1_3_4_4 - 0.00761904761904787*G0_0_1_3_4_5 + 0.00272727272727282*G0_0_1_3_5_0 + 0.000108225108225108*G0_0_1_3_5_1 + 0.00272727272727282*G0_0_1_3_5_2 - 0.0131601731601736*G0_0_1_3_5_3 - 0.00761904761904787*G0_0_1_3_5_4 - 0.00692640692640716*G0_0_1_3_5_5 - 0.00160173160173165*G0_0_1_4_0_0 - 0.000681818181818205*G0_0_1_4_0_1 + 0.00305194805194816*G0_0_1_4_0_2 + 0.00307359307359317*G0_0_1_4_0_3 + 0.0105627705627709*G0_0_1_4_0_4 + 0.00238095238095246*G0_0_1_4_0_5 - 0.000681818181818204*G0_0_1_4_1_0 - 0.000514069264069279*G0_0_1_4_1_1 + 0.000974025974026008*G0_0_1_4_1_2 + 0.00108225108225112*G0_0_1_4_1_3 + 0.00216450216450223*G0_0_1_4_1_4 + 0.00108225108225112*G0_0_1_4_1_5 + 0.00305194805194816*G0_0_1_4_2_0 + 0.000974025974026008*G0_0_1_4_2_1 - 0.0233225108225116*G0_0_1_4_2_2 - 0.00190476190476198*G0_0_1_4_2_3 - 0.0206060606060613*G0_0_1_4_2_4 + 0.000735930735930755*G0_0_1_4_2_5 + 0.00307359307359317*G0_0_1_4_3_0 + 0.00108225108225112*G0_0_1_4_3_1 - 0.00190476190476198*G0_0_1_4_3_2 - 0.00987012987013019*G0_0_1_4_3_3 - 0.0104761904761908*G0_0_1_4_3_4 - 0.00761904761904787*G0_0_1_4_3_5 + 0.0105627705627709*G0_0_1_4_4_0 + 0.00216450216450223*G0_0_1_4_4_1 - 0.0206060606060613*G0_0_1_4_4_2 - 0.0104761904761908*G0_0_1_4_4_3 - 0.0215584415584423*G0_0_1_4_4_4 - 0.005800865800866*G0_0_1_4_4_5 + 0.00238095238095246*G0_0_1_4_5_0 + 0.00108225108225112*G0_0_1_4_5_1 + 0.000735930735930755*G0_0_1_4_5_2 - 0.00761904761904787*G0_0_1_4_5_3 - 0.005800865800866*G0_0_1_4_5_4 - 0.00363636363636376*G0_0_1_4_5_5 - 0.000670995670995687*G0_0_1_5_0_0 - 0.000487012987013004*G0_0_1_5_0_1 - 0.000508658008658025*G0_0_1_5_0_2 + 0.00272727272727282*G0_0_1_5_0_3 + 0.00238095238095246*G0_0_1_5_0_4 + 0.00441558441558458*G0_0_1_5_0_5 - 0.000487012987013004*G0_0_1_5_1_0 - 0.00430194805194821*G0_0_1_5_1_1 + 0.000108225108225109*G0_0_1_5_1_3 + 0.00108225108225112*G0_0_1_5_1_4 - 0.00173160173160179*G0_0_1_5_1_5 - 0.000508658008658024*G0_0_1_5_2_0 - 0.0013419913419914*G0_0_1_5_2_2 + 0.00272727272727282*G0_0_1_5_2_3 + 0.000735930735930755*G0_0_1_5_2_4 + 0.000735930735930762*G0_0_1_5_2_5 + 0.00272727272727282*G0_0_1_5_3_0 + 0.000108225108225108*G0_0_1_5_3_1 + 0.00272727272727282*G0_0_1_5_3_2 - 0.0131601731601736*G0_0_1_5_3_3 - 0.00761904761904787*G0_0_1_5_3_4 - 0.00692640692640716*G0_0_1_5_3_5 + 0.00238095238095246*G0_0_1_5_4_0 + 0.00108225108225112*G0_0_1_5_4_1 + 0.000735930735930755*G0_0_1_5_4_2 - 0.00761904761904787*G0_0_1_5_4_3 - 0.005800865800866*G0_0_1_5_4_4 - 0.00363636363636376*G0_0_1_5_4_5 + 0.00441558441558458*G0_0_1_5_5_0 - 0.00173160173160179*G0_0_1_5_5_1 + 0.000735930735930762*G0_0_1_5_5_2 - 0.00692640692640716*G0_0_1_5_5_3 - 0.00363636363636376*G0_0_1_5_5_4 + 0.0400000000000013*G0_0_1_5_5_5; + A[72] = -A[82] + 0.0125892857142861*G0_0_1_0_0_0 - 0.00121482683982688*G0_0_1_0_0_1 - 0.000619588744588766*G0_0_1_0_0_2 + 0.000113636363636366*G0_0_1_0_0_3 + 0.00143398268398273*G0_0_1_0_0_4 + 0.00457251082251098*G0_0_1_0_0_5 - 0.00121482683982688*G0_0_1_0_1_0 + 0.00121482683982688*G0_0_1_0_1_1 + 0.000200216450216456*G0_0_1_0_1_3 - 0.000200216450216457*G0_0_1_0_1_4 - 0.000619588744588766*G0_0_1_0_2_0 + 0.00059523809523812*G0_0_1_0_2_2 + 0.000844155844155875*G0_0_1_0_2_4 - 0.000286796536796546*G0_0_1_0_2_5 + 0.000113636363636366*G0_0_1_0_3_0 + 0.000200216450216456*G0_0_1_0_3_1 - 0.000389610389610401*G0_0_1_0_3_3 + 0.000173160173160179*G0_0_1_0_3_4 + 0.000346320346320356*G0_0_1_0_3_5 + 0.00143398268398273*G0_0_1_0_4_0 - 0.000200216450216457*G0_0_1_0_4_1 + 0.000844155844155875*G0_0_1_0_4_2 + 0.000173160173160179*G0_0_1_0_4_3 + 0.00177489177489184*G0_0_1_0_4_4 + 0.000974025974026006*G0_0_1_0_4_5 + 0.00457251082251098*G0_0_1_0_5_0 - 0.000286796536796546*G0_0_1_0_5_2 + 0.000346320346320356*G0_0_1_0_5_3 + 0.000974025974026006*G0_0_1_0_5_4 + 0.00653679653679676*G0_0_1_0_5_5 - 0.00121482683982688*G0_0_1_1_0_0 + 0.00121482683982688*G0_0_1_1_0_1 + 0.000200216450216456*G0_0_1_1_0_3 - 0.000200216450216457*G0_0_1_1_0_4 + 0.00121482683982688*G0_0_1_1_1_0 - 0.0125892857142861*G0_0_1_1_1_1 + 0.000619588744588765*G0_0_1_1_1_2 - 0.00143398268398273*G0_0_1_1_1_3 - 0.000113636363636366*G0_0_1_1_1_4 - 0.00457251082251099*G0_0_1_1_1_5 + 0.000619588744588765*G0_0_1_1_2_1 - 0.000595238095238112*G0_0_1_1_2_2 - 0.000844155844155871*G0_0_1_1_2_3 + 0.000286796536796547*G0_0_1_1_2_5 + 0.000200216450216456*G0_0_1_1_3_0 - 0.00143398268398273*G0_0_1_1_3_1 - 0.000844155844155872*G0_0_1_1_3_2 - 0.00177489177489183*G0_0_1_1_3_3 - 0.000173160173160178*G0_0_1_1_3_4 - 0.000974025974026007*G0_0_1_1_3_5 - 0.000200216450216457*G0_0_1_1_4_0 - 0.000113636363636366*G0_0_1_1_4_1 - 0.000173160173160177*G0_0_1_1_4_3 + 0.000389610389610403*G0_0_1_1_4_4 - 0.000346320346320356*G0_0_1_1_4_5 - 0.00457251082251099*G0_0_1_1_5_1 + 0.000286796536796547*G0_0_1_1_5_2 - 0.000974025974026007*G0_0_1_1_5_3 - 0.000346320346320357*G0_0_1_1_5_4 - 0.00653679653679676*G0_0_1_1_5_5 - 0.000619588744588766*G0_0_1_2_0_0 + 0.00059523809523812*G0_0_1_2_0_2 + 0.000844155844155875*G0_0_1_2_0_4 - 0.000286796536796546*G0_0_1_2_0_5 + 0.000619588744588765*G0_0_1_2_1_1 - 0.000595238095238112*G0_0_1_2_1_2 - 0.000844155844155872*G0_0_1_2_1_3 + 0.000286796536796547*G0_0_1_2_1_5 + 0.00059523809523812*G0_0_1_2_2_0 - 0.000595238095238112*G0_0_1_2_2_1 + 0.00313852813852823*G0_0_1_2_2_3 - 0.00313852813852826*G0_0_1_2_2_4 - 0.000844155844155871*G0_0_1_2_3_1 + 0.00313852813852823*G0_0_1_2_3_2 + 0.00476190476190491*G0_0_1_2_3_3 + 0.000173160173160179*G0_0_1_2_3_5 + 0.000844155844155875*G0_0_1_2_4_0 - 0.00313852813852826*G0_0_1_2_4_2 - 0.00476190476190493*G0_0_1_2_4_4 - 0.000173160173160181*G0_0_1_2_4_5 - 0.000286796536796546*G0_0_1_2_5_0 + 0.000286796536796547*G0_0_1_2_5_1 + 0.000173160173160178*G0_0_1_2_5_3 - 0.000173160173160181*G0_0_1_2_5_4 + 0.000113636363636366*G0_0_1_3_0_0 + 0.000200216450216456*G0_0_1_3_0_1 - 0.000389610389610401*G0_0_1_3_0_3 + 0.000173160173160179*G0_0_1_3_0_4 + 0.000346320346320357*G0_0_1_3_0_5 + 0.000200216450216456*G0_0_1_3_1_0 - 0.00143398268398273*G0_0_1_3_1_1 - 0.000844155844155872*G0_0_1_3_1_2 - 0.00177489177489183*G0_0_1_3_1_3 - 0.000173160173160177*G0_0_1_3_1_4 - 0.000974025974026007*G0_0_1_3_1_5 - 0.000844155844155871*G0_0_1_3_2_1 + 0.00313852813852823*G0_0_1_3_2_2 + 0.00476190476190491*G0_0_1_3_2_3 + 0.000173160173160179*G0_0_1_3_2_5 - 0.000389610389610401*G0_0_1_3_3_0 - 0.00177489177489183*G0_0_1_3_3_1 + 0.00476190476190491*G0_0_1_3_3_2 + 0.0101298701298705*G0_0_1_3_3_3 + 0.00112554112554116*G0_0_1_3_3_4 + 0.000432900432900452*G0_0_1_3_3_5 + 0.000173160173160179*G0_0_1_3_4_0 - 0.000173160173160178*G0_0_1_3_4_1 + 0.00112554112554116*G0_0_1_3_4_3 - 0.00112554112554117*G0_0_1_3_4_4 + 0.000346320346320356*G0_0_1_3_5_0 - 0.000974025974026008*G0_0_1_3_5_1 + 0.000173160173160179*G0_0_1_3_5_2 + 0.000432900432900452*G0_0_1_3_5_3 - 0.000692640692640715*G0_0_1_3_5_5 + 0.00143398268398273*G0_0_1_4_0_0 - 0.000200216450216457*G0_0_1_4_0_1 + 0.000844155844155875*G0_0_1_4_0_2 + 0.000173160173160179*G0_0_1_4_0_3 + 0.00177489177489184*G0_0_1_4_0_4 + 0.000974025974026006*G0_0_1_4_0_5 - 0.000200216450216457*G0_0_1_4_1_0 - 0.000113636363636366*G0_0_1_4_1_1 - 0.000173160173160178*G0_0_1_4_1_3 + 0.000389610389610403*G0_0_1_4_1_4 - 0.000346320346320357*G0_0_1_4_1_5 + 0.000844155844155875*G0_0_1_4_2_0 - 0.00313852813852826*G0_0_1_4_2_2 - 0.00476190476190493*G0_0_1_4_2_4 - 0.000173160173160181*G0_0_1_4_2_5 + 0.000173160173160179*G0_0_1_4_3_0 - 0.000173160173160178*G0_0_1_4_3_1 + 0.00112554112554116*G0_0_1_4_3_3 - 0.00112554112554117*G0_0_1_4_3_4 + 0.00177489177489184*G0_0_1_4_4_0 + 0.000389610389610403*G0_0_1_4_4_1 - 0.00476190476190493*G0_0_1_4_4_2 - 0.00112554112554117*G0_0_1_4_4_3 - 0.0101298701298705*G0_0_1_4_4_4 - 0.000432900432900452*G0_0_1_4_4_5 + 0.000974025974026006*G0_0_1_4_5_0 - 0.000346320346320357*G0_0_1_4_5_1 - 0.000173160173160181*G0_0_1_4_5_2 - 0.000432900432900451*G0_0_1_4_5_4 + 0.000692640692640716*G0_0_1_4_5_5 + 0.00457251082251098*G0_0_1_5_0_0 - 0.000286796536796546*G0_0_1_5_0_2 + 0.000346320346320356*G0_0_1_5_0_3 + 0.000974025974026006*G0_0_1_5_0_4 + 0.00653679653679676*G0_0_1_5_0_5 - 0.00457251082251099*G0_0_1_5_1_1 + 0.000286796536796547*G0_0_1_5_1_2 - 0.000974025974026007*G0_0_1_5_1_3 - 0.000346320346320356*G0_0_1_5_1_4 - 0.00653679653679676*G0_0_1_5_1_5 - 0.000286796536796546*G0_0_1_5_2_0 + 0.000286796536796547*G0_0_1_5_2_1 + 0.000173160173160179*G0_0_1_5_2_3 - 0.000173160173160181*G0_0_1_5_2_4 + 0.000346320346320356*G0_0_1_5_3_0 - 0.000974025974026007*G0_0_1_5_3_1 + 0.000173160173160179*G0_0_1_5_3_2 + 0.000432900432900452*G0_0_1_5_3_3 - 0.000692640692640716*G0_0_1_5_3_5 + 0.000974025974026006*G0_0_1_5_4_0 - 0.000346320346320356*G0_0_1_5_4_1 - 0.000173160173160181*G0_0_1_5_4_2 - 0.000432900432900453*G0_0_1_5_4_4 + 0.000692640692640716*G0_0_1_5_4_5 + 0.00653679653679676*G0_0_1_5_5_0 - 0.00653679653679676*G0_0_1_5_5_1 - 0.000692640692640715*G0_0_1_5_5_3 + 0.000692640692640716*G0_0_1_5_5_4 - 0.00429383116883133*G0_1_1_0_0_0 + 0.000324675324675338*G0_1_1_0_0_1 + 0.000262445887445897*G0_1_1_0_0_2 + 0.000167748917748923*G0_1_1_0_0_3 - 0.000416666666666683*G0_1_1_0_0_4 - 0.00461580086580103*G0_1_1_0_0_5 + 0.000324675324675338*G0_1_1_0_1_0 + 0.00153950216450222*G0_1_1_0_1_1 + 0.000638528138528159*G0_1_1_0_1_3 + 0.000438311688311702*G0_1_1_0_1_4 + 0.00360389610389623*G0_1_1_0_1_5 + 0.000262445887445897*G0_1_1_0_2_0 - 0.000679112554112575*G0_1_1_0_2_2 - 0.000183982683982689*G0_1_1_0_2_3 - 0.000194805194805201*G0_1_1_0_2_4 + 0.000286796536796548*G0_1_1_0_2_5 + 0.000167748917748923*G0_1_1_0_3_0 + 0.000638528138528159*G0_1_1_0_3_1 - 0.000183982683982689*G0_1_1_0_3_2 - 0.00225108225108232*G0_1_1_0_3_3 - 0.00121212121212125*G0_1_1_0_3_4 - 0.00090909090909094*G0_1_1_0_3_5 - 0.000416666666666683*G0_1_1_0_4_0 + 0.000438311688311702*G0_1_1_0_4_1 - 0.000194805194805201*G0_1_1_0_4_2 - 0.00121212121212125*G0_1_1_0_4_3 - 0.00073593073593076*G0_1_1_0_4_4 - 0.0014502164502165*G0_1_1_0_4_5 - 0.00461580086580103*G0_1_1_0_5_0 + 0.00360389610389623*G0_1_1_0_5_1 + 0.000286796536796548*G0_1_1_0_5_2 - 0.00090909090909094*G0_1_1_0_5_3 - 0.0014502164502165*G0_1_1_0_5_4 - 0.00298701298701312*G0_1_1_0_5_5 + 0.000324675324675339*G0_1_1_1_0_0 + 0.00153950216450222*G0_1_1_1_0_1 + 0.000638528138528159*G0_1_1_1_0_3 + 0.000438311688311702*G0_1_1_1_0_4 + 0.00360389610389623*G0_1_1_1_0_5 + 0.00153950216450222*G0_1_1_1_1_0 - 0.0168831168831175*G0_1_1_1_1_1 + 0.000882034632034662*G0_1_1_1_1_2 - 0.00185064935064941*G0_1_1_1_1_3 - 0.00918831168831202*G0_1_1_1_1_5 + 0.000882034632034662*G0_1_1_1_2_1 - 0.00127435064935069*G0_1_1_1_2_2 - 0.00103896103896107*G0_1_1_1_2_3 + 0.000573593073593093*G0_1_1_1_2_5 + 0.000638528138528159*G0_1_1_1_3_0 - 0.00185064935064941*G0_1_1_1_3_1 - 0.00103896103896107*G0_1_1_1_3_2 - 0.00251082251082259*G0_1_1_1_3_3 - 0.00138528138528143*G0_1_1_1_3_4 - 0.00242424242424251*G0_1_1_1_3_5 + 0.000438311688311702*G0_1_1_1_4_0 - 0.00138528138528143*G0_1_1_1_4_3 - 0.00186147186147192*G0_1_1_1_4_4 - 0.0012554112554113*G0_1_1_1_4_5 + 0.00360389610389623*G0_1_1_1_5_0 - 0.00918831168831202*G0_1_1_1_5_1 + 0.000573593073593093*G0_1_1_1_5_2 - 0.00242424242424251*G0_1_1_1_5_3 - 0.0012554112554113*G0_1_1_1_5_4 - 0.00952380952380986*G0_1_1_1_5_5 + 0.000262445887445897*G0_1_1_2_0_0 - 0.000679112554112575*G0_1_1_2_0_2 - 0.000183982683982689*G0_1_1_2_0_3 - 0.000194805194805201*G0_1_1_2_0_4 + 0.000286796536796548*G0_1_1_2_0_5 + 0.000882034632034662*G0_1_1_2_1_1 - 0.00127435064935069*G0_1_1_2_1_2 - 0.00103896103896107*G0_1_1_2_1_3 + 0.000573593073593093*G0_1_1_2_1_5 - 0.000679112554112575*G0_1_1_2_2_0 - 0.00127435064935069*G0_1_1_2_2_1 + 0.00868506493506522*G0_1_1_2_2_2 + 0.00595238095238115*G0_1_1_2_2_3 + 0.00281385281385291*G0_1_1_2_2_4 + 0.000573593073593095*G0_1_1_2_2_5 - 0.000183982683982689*G0_1_1_2_3_0 - 0.00103896103896107*G0_1_1_2_3_1 + 0.00595238095238115*G0_1_1_2_3_2 + 0.00441558441558457*G0_1_1_2_3_3 + 0.000562770562770582*G0_1_1_2_3_4 - 0.000779220779220806*G0_1_1_2_3_5 - 0.000194805194805201*G0_1_1_2_4_0 + 0.00281385281385291*G0_1_1_2_4_2 + 0.000562770562770581*G0_1_1_2_4_3 - 0.000346320346320358*G0_1_1_2_4_4 - 0.000952380952380986*G0_1_1_2_4_5 + 0.000286796536796548*G0_1_1_2_5_0 + 0.000573593073593093*G0_1_1_2_5_1 + 0.000573593073593095*G0_1_1_2_5_2 - 0.000779220779220806*G0_1_1_2_5_3 - 0.000952380952380986*G0_1_1_2_5_4 + 0.00190476190476197*G0_1_1_2_5_5 + 0.000167748917748923*G0_1_1_3_0_0 + 0.000638528138528159*G0_1_1_3_0_1 - 0.000183982683982689*G0_1_1_3_0_2 - 0.00225108225108232*G0_1_1_3_0_3 - 0.00121212121212125*G0_1_1_3_0_4 - 0.00090909090909094*G0_1_1_3_0_5 + 0.000638528138528159*G0_1_1_3_1_0 - 0.00185064935064941*G0_1_1_3_1_1 - 0.00103896103896107*G0_1_1_3_1_2 - 0.00251082251082259*G0_1_1_3_1_3 - 0.00138528138528143*G0_1_1_3_1_4 - 0.00242424242424251*G0_1_1_3_1_5 - 0.000183982683982689*G0_1_1_3_2_0 - 0.00103896103896107*G0_1_1_3_2_1 + 0.00595238095238116*G0_1_1_3_2_2 + 0.00441558441558457*G0_1_1_3_2_3 + 0.000562770562770582*G0_1_1_3_2_4 - 0.000779220779220806*G0_1_1_3_2_5 - 0.00225108225108232*G0_1_1_3_3_0 - 0.00251082251082259*G0_1_1_3_3_1 + 0.00441558441558457*G0_1_1_3_3_2 + 0.021298701298702*G0_1_1_3_3_3 + 0.00727272727272751*G0_1_1_3_3_4 + 0.00606060606060627*G0_1_1_3_3_5 - 0.00121212121212125*G0_1_1_3_4_0 - 0.00138528138528143*G0_1_1_3_4_1 + 0.000562770562770581*G0_1_1_3_4_2 + 0.00727272727272752*G0_1_1_3_4_3 + 0.00614718614718635*G0_1_1_3_4_4 + 0.00432900432900448*G0_1_1_3_4_5 - 0.00090909090909094*G0_1_1_3_5_0 - 0.00242424242424251*G0_1_1_3_5_1 - 0.000779220779220806*G0_1_1_3_5_2 + 0.00606060606060627*G0_1_1_3_5_3 + 0.00432900432900448*G0_1_1_3_5_4 - 0.00199134199134205*G0_1_1_3_5_5 - 0.000416666666666683*G0_1_1_4_0_0 + 0.000438311688311702*G0_1_1_4_0_1 - 0.000194805194805201*G0_1_1_4_0_2 - 0.00121212121212125*G0_1_1_4_0_3 - 0.000735930735930761*G0_1_1_4_0_4 - 0.0014502164502165*G0_1_1_4_0_5 + 0.000438311688311702*G0_1_1_4_1_0 - 0.00138528138528143*G0_1_1_4_1_3 - 0.00186147186147192*G0_1_1_4_1_4 - 0.0012554112554113*G0_1_1_4_1_5 - 0.000194805194805201*G0_1_1_4_2_0 + 0.00281385281385291*G0_1_1_4_2_2 + 0.000562770562770582*G0_1_1_4_2_3 - 0.000346320346320357*G0_1_1_4_2_4 - 0.000952380952380986*G0_1_1_4_2_5 - 0.00121212121212125*G0_1_1_4_3_0 - 0.00138528138528143*G0_1_1_4_3_1 + 0.000562770562770582*G0_1_1_4_3_2 + 0.00727272727272752*G0_1_1_4_3_3 + 0.00614718614718635*G0_1_1_4_3_4 + 0.00432900432900448*G0_1_1_4_3_5 - 0.00073593073593076*G0_1_1_4_4_0 - 0.00186147186147192*G0_1_1_4_4_1 - 0.000346320346320357*G0_1_1_4_4_2 + 0.00614718614718635*G0_1_1_4_4_3 + 0.0111688311688315*G0_1_1_4_4_4 + 0.00562770562770582*G0_1_1_4_4_5 - 0.0014502164502165*G0_1_1_4_5_0 - 0.0012554112554113*G0_1_1_4_5_1 - 0.000952380952380986*G0_1_1_4_5_2 + 0.00432900432900448*G0_1_1_4_5_3 + 0.00562770562770582*G0_1_1_4_5_4 - 0.00129870129870133*G0_1_1_4_5_5 - 0.00461580086580103*G0_1_1_5_0_0 + 0.00360389610389623*G0_1_1_5_0_1 + 0.000286796536796548*G0_1_1_5_0_2 - 0.00090909090909094*G0_1_1_5_0_3 - 0.0014502164502165*G0_1_1_5_0_4 - 0.00298701298701312*G0_1_1_5_0_5 + 0.00360389610389623*G0_1_1_5_1_0 - 0.00918831168831202*G0_1_1_5_1_1 + 0.000573593073593093*G0_1_1_5_1_2 - 0.00242424242424251*G0_1_1_5_1_3 - 0.0012554112554113*G0_1_1_5_1_4 - 0.00952380952380986*G0_1_1_5_1_5 + 0.000286796536796548*G0_1_1_5_2_0 + 0.000573593073593093*G0_1_1_5_2_1 + 0.000573593073593095*G0_1_1_5_2_2 - 0.000779220779220806*G0_1_1_5_2_3 - 0.000952380952380986*G0_1_1_5_2_4 + 0.00190476190476197*G0_1_1_5_2_5 - 0.00090909090909094*G0_1_1_5_3_0 - 0.00242424242424251*G0_1_1_5_3_1 - 0.000779220779220806*G0_1_1_5_3_2 + 0.00606060606060627*G0_1_1_5_3_3 + 0.00432900432900448*G0_1_1_5_3_4 - 0.00199134199134205*G0_1_1_5_3_5 - 0.0014502164502165*G0_1_1_5_4_0 - 0.0012554112554113*G0_1_1_5_4_1 - 0.000952380952380986*G0_1_1_5_4_2 + 0.00432900432900448*G0_1_1_5_4_3 + 0.00562770562770582*G0_1_1_5_4_4 - 0.00129870129870133*G0_1_1_5_4_5 - 0.00298701298701312*G0_1_1_5_5_0 - 0.00952380952380986*G0_1_1_5_5_1 + 0.00190476190476197*G0_1_1_5_5_2 - 0.00199134199134205*G0_1_1_5_5_3 - 0.00129870129870133*G0_1_1_5_5_4 - 0.0932467532467564*G0_1_1_5_5_5; + A[27] = A[72] - 0.020150162337663*G0_0_1_0_0_0 + 0.00127299783549787*G0_0_1_0_0_1 + 0.00073593073593076*G0_0_1_0_0_2 - 0.000243506493506498*G0_0_1_0_0_3 - 0.00213744588744595*G0_0_1_0_0_4 - 0.00492424242424259*G0_0_1_0_0_5 + 0.00127299783549787*G0_0_1_0_1_0 - 0.000238095238095245*G0_0_1_0_1_3 - 0.000162337662337668*G0_0_1_0_1_5 + 0.00073593073593076*G0_0_1_0_2_0 - 0.000248917748917757*G0_0_1_0_2_2 - 0.000183982683982691*G0_0_1_0_2_3 - 0.000844155844155872*G0_0_1_0_2_4 - 0.000243506493506498*G0_0_1_0_3_0 - 0.000238095238095245*G0_0_1_0_3_1 - 0.000183982683982691*G0_0_1_0_3_2 + 0.000519480519480536*G0_0_1_0_3_3 + 0.000562770562770581*G0_0_1_0_3_4 + 0.000476190476190492*G0_0_1_0_3_5 - 0.00213744588744595*G0_0_1_0_4_0 - 0.000844155844155872*G0_0_1_0_4_2 + 0.000562770562770581*G0_0_1_0_4_3 + 0.0020346320346321*G0_0_1_0_4_4 - 0.00492424242424259*G0_0_1_0_5_0 - 0.000162337662337668*G0_0_1_0_5_1 + 0.000476190476190492*G0_0_1_0_5_3 - 0.00313852813852823*G0_0_1_0_5_5 + 0.00127299783549787*G0_0_1_1_0_0 - 0.000238095238095245*G0_0_1_1_0_3 - 0.000162337662337668*G0_0_1_1_0_5 - 0.00756087662337687*G0_0_1_1_1_1 + 0.000116341991341995*G0_0_1_1_1_2 - 0.000703463203463225*G0_0_1_1_1_3 - 0.000129870129870133*G0_0_1_1_1_4 - 0.000351731601731617*G0_0_1_1_1_5 + 0.000116341991341995*G0_0_1_1_2_1 + 0.000346320346320359*G0_0_1_1_2_2 - 0.000270562770562779*G0_0_1_1_2_4 - 0.000281385281385291*G0_0_1_1_2_5 - 0.000238095238095245*G0_0_1_1_3_0 - 0.000703463203463225*G0_0_1_1_3_1 + 0.00380952380952394*G0_0_1_1_3_3 + 0.00073593073593076*G0_0_1_1_3_4 + 0.00103896103896107*G0_0_1_1_3_5 - 0.000129870129870133*G0_0_1_1_4_1 - 0.000270562770562779*G0_0_1_1_4_2 + 0.000735930735930759*G0_0_1_1_4_3 + 0.000129870129870133*G0_0_1_1_4_4 + 0.000822510822510848*G0_0_1_1_4_5 - 0.000162337662337669*G0_0_1_1_5_0 - 0.000351731601731617*G0_0_1_1_5_1 - 0.000281385281385291*G0_0_1_1_5_2 + 0.00103896103896107*G0_0_1_1_5_3 + 0.000822510822510849*G0_0_1_1_5_4 + 0.00339826839826851*G0_0_1_1_5_5 + 0.000735930735930759*G0_0_1_2_0_0 - 0.000248917748917757*G0_0_1_2_0_2 - 0.000183982683982691*G0_0_1_2_0_3 - 0.000844155844155872*G0_0_1_2_0_4 + 0.000116341991341995*G0_0_1_2_1_1 + 0.000346320346320359*G0_0_1_2_1_2 - 0.000270562770562779*G0_0_1_2_1_4 - 0.000281385281385291*G0_0_1_2_1_5 - 0.000248917748917757*G0_0_1_2_2_0 + 0.000346320346320359*G0_0_1_2_2_1 - 0.00156926406926412*G0_0_1_2_2_3 + 0.00156926406926412*G0_0_1_2_2_4 - 0.000183982683982691*G0_0_1_2_3_0 - 0.00156926406926412*G0_0_1_2_3_2 - 0.0032900432900434*G0_0_1_2_3_3 + 0.000909090909090938*G0_0_1_2_3_4 + 0.00056277056277058*G0_0_1_2_3_5 - 0.000844155844155872*G0_0_1_2_4_0 - 0.000270562770562779*G0_0_1_2_4_1 + 0.00156926406926412*G0_0_1_2_4_2 + 0.000909090909090938*G0_0_1_2_4_3 + 0.00147186147186152*G0_0_1_2_4_4 + 0.000735930735930761*G0_0_1_2_4_5 - 0.000281385281385291*G0_0_1_2_5_1 + 0.00056277056277058*G0_0_1_2_5_3 + 0.000735930735930761*G0_0_1_2_5_4 - 0.000389610389610403*G0_0_1_2_5_5 - 0.000243506493506498*G0_0_1_3_0_0 - 0.000238095238095245*G0_0_1_3_0_1 - 0.000183982683982691*G0_0_1_3_0_2 + 0.000519480519480536*G0_0_1_3_0_3 + 0.000562770562770581*G0_0_1_3_0_4 + 0.000476190476190492*G0_0_1_3_0_5 - 0.000238095238095245*G0_0_1_3_1_0 - 0.000703463203463225*G0_0_1_3_1_1 + 0.00380952380952394*G0_0_1_3_1_3 + 0.00073593073593076*G0_0_1_3_1_4 + 0.00103896103896107*G0_0_1_3_1_5 - 0.000183982683982691*G0_0_1_3_2_0 - 0.00156926406926412*G0_0_1_3_2_2 - 0.0032900432900434*G0_0_1_3_2_3 + 0.000909090909090938*G0_0_1_3_2_4 + 0.00056277056277058*G0_0_1_3_2_5 + 0.000519480519480536*G0_0_1_3_3_0 + 0.00380952380952394*G0_0_1_3_3_1 - 0.0032900432900434*G0_0_1_3_3_2 + 0.000779220779220799*G0_0_1_3_3_3 - 0.00251082251082259*G0_0_1_3_3_4 - 0.00216450216450223*G0_0_1_3_3_5 + 0.000562770562770581*G0_0_1_3_4_0 + 0.00073593073593076*G0_0_1_3_4_1 + 0.000909090909090938*G0_0_1_3_4_2 - 0.00251082251082259*G0_0_1_3_4_3 - 0.00138528138528143*G0_0_1_3_4_4 - 0.00259740259740268*G0_0_1_3_4_5 + 0.000476190476190492*G0_0_1_3_5_0 + 0.00103896103896107*G0_0_1_3_5_1 + 0.00056277056277058*G0_0_1_3_5_2 - 0.00216450216450223*G0_0_1_3_5_3 - 0.00259740259740268*G0_0_1_3_5_4 - 0.000173160173160179*G0_0_1_3_5_5 - 0.00213744588744595*G0_0_1_4_0_0 - 0.000844155844155872*G0_0_1_4_0_2 + 0.000562770562770581*G0_0_1_4_0_3 + 0.0020346320346321*G0_0_1_4_0_4 - 0.000129870129870133*G0_0_1_4_1_1 - 0.000270562770562779*G0_0_1_4_1_2 + 0.00073593073593076*G0_0_1_4_1_3 + 0.000129870129870133*G0_0_1_4_1_4 + 0.000822510822510849*G0_0_1_4_1_5 - 0.000844155844155872*G0_0_1_4_2_0 - 0.000270562770562779*G0_0_1_4_2_1 + 0.00156926406926412*G0_0_1_4_2_2 + 0.000909090909090939*G0_0_1_4_2_3 + 0.00147186147186152*G0_0_1_4_2_4 + 0.000735930735930761*G0_0_1_4_2_5 + 0.000562770562770581*G0_0_1_4_3_0 + 0.00073593073593076*G0_0_1_4_3_1 + 0.000909090909090939*G0_0_1_4_3_2 - 0.00251082251082259*G0_0_1_4_3_3 - 0.00138528138528143*G0_0_1_4_3_4 - 0.00259740259740268*G0_0_1_4_3_5 + 0.0020346320346321*G0_0_1_4_4_0 + 0.000129870129870133*G0_0_1_4_4_1 + 0.00147186147186152*G0_0_1_4_4_2 - 0.00138528138528143*G0_0_1_4_4_3 + 0.0109090909090913*G0_0_1_4_4_4 - 0.00173160173160179*G0_0_1_4_4_5 + 0.000822510822510849*G0_0_1_4_5_1 + 0.000735930735930761*G0_0_1_4_5_2 - 0.00259740259740268*G0_0_1_4_5_3 - 0.00173160173160179*G0_0_1_4_5_4 - 0.000865800865800894*G0_0_1_4_5_5 - 0.00492424242424259*G0_0_1_5_0_0 - 0.000162337662337668*G0_0_1_5_0_1 + 0.000476190476190492*G0_0_1_5_0_3 - 0.00313852813852823*G0_0_1_5_0_5 - 0.000162337662337668*G0_0_1_5_1_0 - 0.000351731601731617*G0_0_1_5_1_1 - 0.000281385281385291*G0_0_1_5_1_2 + 0.00103896103896107*G0_0_1_5_1_3 + 0.000822510822510848*G0_0_1_5_1_4 + 0.00339826839826851*G0_0_1_5_1_5 - 0.000281385281385291*G0_0_1_5_2_1 + 0.00056277056277058*G0_0_1_5_2_3 + 0.000735930735930761*G0_0_1_5_2_4 - 0.000389610389610403*G0_0_1_5_2_5 + 0.000476190476190492*G0_0_1_5_3_0 + 0.00103896103896107*G0_0_1_5_3_1 + 0.00056277056277058*G0_0_1_5_3_2 - 0.00216450216450223*G0_0_1_5_3_3 - 0.00259740259740268*G0_0_1_5_3_4 - 0.000173160173160178*G0_0_1_5_3_5 + 0.000822510822510849*G0_0_1_5_4_1 + 0.00073593073593076*G0_0_1_5_4_2 - 0.00259740259740268*G0_0_1_5_4_3 - 0.00173160173160179*G0_0_1_5_4_4 - 0.000865800865800894*G0_0_1_5_4_5 - 0.00313852813852823*G0_0_1_5_5_0 + 0.00339826839826851*G0_0_1_5_5_1 - 0.000389610389610403*G0_0_1_5_5_2 - 0.000173160173160178*G0_0_1_5_5_3 - 0.000865800865800894*G0_0_1_5_5_4 + 0.0397402597402611*G0_0_1_5_5_5 + 0.020150162337663*G0_1_0_0_0_0 - 0.00127299783549787*G0_1_0_0_0_1 - 0.00073593073593076*G0_1_0_0_0_2 + 0.000243506493506498*G0_1_0_0_0_3 + 0.00213744588744595*G0_1_0_0_0_4 + 0.00492424242424259*G0_1_0_0_0_5 - 0.00127299783549787*G0_1_0_0_1_0 + 0.000238095238095245*G0_1_0_0_1_3 + 0.000162337662337668*G0_1_0_0_1_5 - 0.00073593073593076*G0_1_0_0_2_0 + 0.000248917748917757*G0_1_0_0_2_2 + 0.000183982683982691*G0_1_0_0_2_3 + 0.000844155844155872*G0_1_0_0_2_4 + 0.000243506493506498*G0_1_0_0_3_0 + 0.000238095238095245*G0_1_0_0_3_1 + 0.000183982683982691*G0_1_0_0_3_2 - 0.000519480519480536*G0_1_0_0_3_3 - 0.000562770562770581*G0_1_0_0_3_4 - 0.000476190476190492*G0_1_0_0_3_5 + 0.00213744588744595*G0_1_0_0_4_0 + 0.000844155844155872*G0_1_0_0_4_2 - 0.000562770562770581*G0_1_0_0_4_3 - 0.0020346320346321*G0_1_0_0_4_4 + 0.00492424242424259*G0_1_0_0_5_0 + 0.000162337662337668*G0_1_0_0_5_1 - 0.000476190476190492*G0_1_0_0_5_3 + 0.00313852813852824*G0_1_0_0_5_5 - 0.00127299783549787*G0_1_0_1_0_0 + 0.000238095238095245*G0_1_0_1_0_3 + 0.000162337662337668*G0_1_0_1_0_5 + 0.00756087662337687*G0_1_0_1_1_1 - 0.000116341991341995*G0_1_0_1_1_2 + 0.000703463203463225*G0_1_0_1_1_3 + 0.000129870129870133*G0_1_0_1_1_4 + 0.000351731601731617*G0_1_0_1_1_5 - 0.000116341991341995*G0_1_0_1_2_1 - 0.000346320346320359*G0_1_0_1_2_2 + 0.000270562770562779*G0_1_0_1_2_4 + 0.000281385281385291*G0_1_0_1_2_5 + 0.000238095238095245*G0_1_0_1_3_0 + 0.000703463203463225*G0_1_0_1_3_1 - 0.00380952380952394*G0_1_0_1_3_3 - 0.00073593073593076*G0_1_0_1_3_4 - 0.00103896103896107*G0_1_0_1_3_5 + 0.000129870129870133*G0_1_0_1_4_1 + 0.000270562770562779*G0_1_0_1_4_2 - 0.00073593073593076*G0_1_0_1_4_3 - 0.000129870129870133*G0_1_0_1_4_4 - 0.000822510822510849*G0_1_0_1_4_5 + 0.000162337662337668*G0_1_0_1_5_0 + 0.000351731601731617*G0_1_0_1_5_1 + 0.000281385281385291*G0_1_0_1_5_2 - 0.00103896103896107*G0_1_0_1_5_3 - 0.000822510822510849*G0_1_0_1_5_4 - 0.00339826839826851*G0_1_0_1_5_5 - 0.00073593073593076*G0_1_0_2_0_0 + 0.000248917748917757*G0_1_0_2_0_2 + 0.000183982683982691*G0_1_0_2_0_3 + 0.000844155844155872*G0_1_0_2_0_4 - 0.000116341991341995*G0_1_0_2_1_1 - 0.000346320346320359*G0_1_0_2_1_2 + 0.000270562770562779*G0_1_0_2_1_4 + 0.000281385281385291*G0_1_0_2_1_5 + 0.000248917748917757*G0_1_0_2_2_0 - 0.000346320346320359*G0_1_0_2_2_1 + 0.00156926406926412*G0_1_0_2_2_3 - 0.00156926406926412*G0_1_0_2_2_4 + 0.000183982683982691*G0_1_0_2_3_0 + 0.00156926406926412*G0_1_0_2_3_2 + 0.0032900432900434*G0_1_0_2_3_3 - 0.000909090909090938*G0_1_0_2_3_4 - 0.000562770562770581*G0_1_0_2_3_5 + 0.000844155844155872*G0_1_0_2_4_0 + 0.000270562770562779*G0_1_0_2_4_1 - 0.00156926406926412*G0_1_0_2_4_2 - 0.000909090909090938*G0_1_0_2_4_3 - 0.00147186147186152*G0_1_0_2_4_4 - 0.000735930735930761*G0_1_0_2_4_5 + 0.000281385281385291*G0_1_0_2_5_1 - 0.000562770562770581*G0_1_0_2_5_3 - 0.000735930735930761*G0_1_0_2_5_4 + 0.000389610389610403*G0_1_0_2_5_5 + 0.000243506493506498*G0_1_0_3_0_0 + 0.000238095238095245*G0_1_0_3_0_1 + 0.000183982683982691*G0_1_0_3_0_2 - 0.000519480519480536*G0_1_0_3_0_3 - 0.000562770562770581*G0_1_0_3_0_4 - 0.000476190476190492*G0_1_0_3_0_5 + 0.000238095238095245*G0_1_0_3_1_0 + 0.000703463203463225*G0_1_0_3_1_1 - 0.00380952380952394*G0_1_0_3_1_3 - 0.00073593073593076*G0_1_0_3_1_4 - 0.00103896103896107*G0_1_0_3_1_5 + 0.000183982683982691*G0_1_0_3_2_0 + 0.00156926406926412*G0_1_0_3_2_2 + 0.0032900432900434*G0_1_0_3_2_3 - 0.000909090909090938*G0_1_0_3_2_4 - 0.000562770562770581*G0_1_0_3_2_5 - 0.000519480519480536*G0_1_0_3_3_0 - 0.00380952380952394*G0_1_0_3_3_1 + 0.0032900432900434*G0_1_0_3_3_2 - 0.000779220779220799*G0_1_0_3_3_3 + 0.00251082251082259*G0_1_0_3_3_4 + 0.00216450216450223*G0_1_0_3_3_5 - 0.000562770562770581*G0_1_0_3_4_0 - 0.00073593073593076*G0_1_0_3_4_1 - 0.000909090909090939*G0_1_0_3_4_2 + 0.00251082251082259*G0_1_0_3_4_3 + 0.00138528138528143*G0_1_0_3_4_4 + 0.00259740259740268*G0_1_0_3_4_5 - 0.000476190476190492*G0_1_0_3_5_0 - 0.00103896103896107*G0_1_0_3_5_1 - 0.00056277056277058*G0_1_0_3_5_2 + 0.00216450216450223*G0_1_0_3_5_3 + 0.00259740259740268*G0_1_0_3_5_4 + 0.000173160173160179*G0_1_0_3_5_5 + 0.00213744588744595*G0_1_0_4_0_0 + 0.000844155844155872*G0_1_0_4_0_2 - 0.000562770562770581*G0_1_0_4_0_3 - 0.0020346320346321*G0_1_0_4_0_4 + 0.000129870129870133*G0_1_0_4_1_1 + 0.000270562770562779*G0_1_0_4_1_2 - 0.00073593073593076*G0_1_0_4_1_3 - 0.000129870129870133*G0_1_0_4_1_4 - 0.000822510822510849*G0_1_0_4_1_5 + 0.000844155844155872*G0_1_0_4_2_0 + 0.000270562770562779*G0_1_0_4_2_1 - 0.00156926406926412*G0_1_0_4_2_2 - 0.000909090909090939*G0_1_0_4_2_3 - 0.00147186147186152*G0_1_0_4_2_4 - 0.000735930735930761*G0_1_0_4_2_5 - 0.000562770562770581*G0_1_0_4_3_0 - 0.00073593073593076*G0_1_0_4_3_1 - 0.000909090909090939*G0_1_0_4_3_2 + 0.00251082251082259*G0_1_0_4_3_3 + 0.00138528138528143*G0_1_0_4_3_4 + 0.00259740259740268*G0_1_0_4_3_5 - 0.0020346320346321*G0_1_0_4_4_0 - 0.000129870129870133*G0_1_0_4_4_1 - 0.00147186147186152*G0_1_0_4_4_2 + 0.00138528138528143*G0_1_0_4_4_3 - 0.0109090909090913*G0_1_0_4_4_4 + 0.00173160173160179*G0_1_0_4_4_5 - 0.000822510822510849*G0_1_0_4_5_1 - 0.000735930735930761*G0_1_0_4_5_2 + 0.00259740259740268*G0_1_0_4_5_3 + 0.00173160173160179*G0_1_0_4_5_4 + 0.000865800865800895*G0_1_0_4_5_5 + 0.00492424242424259*G0_1_0_5_0_0 + 0.000162337662337668*G0_1_0_5_0_1 - 0.000476190476190492*G0_1_0_5_0_3 + 0.00313852813852824*G0_1_0_5_0_5 + 0.000162337662337668*G0_1_0_5_1_0 + 0.000351731601731617*G0_1_0_5_1_1 + 0.000281385281385291*G0_1_0_5_1_2 - 0.00103896103896107*G0_1_0_5_1_3 - 0.000822510822510849*G0_1_0_5_1_4 - 0.00339826839826851*G0_1_0_5_1_5 + 0.000281385281385291*G0_1_0_5_2_1 - 0.00056277056277058*G0_1_0_5_2_3 - 0.000735930735930761*G0_1_0_5_2_4 + 0.000389610389610403*G0_1_0_5_2_5 - 0.000476190476190492*G0_1_0_5_3_0 - 0.00103896103896107*G0_1_0_5_3_1 - 0.000562770562770581*G0_1_0_5_3_2 + 0.00216450216450223*G0_1_0_5_3_3 + 0.00259740259740268*G0_1_0_5_3_4 + 0.000173160173160178*G0_1_0_5_3_5 - 0.000822510822510849*G0_1_0_5_4_1 - 0.000735930735930761*G0_1_0_5_4_2 + 0.00259740259740268*G0_1_0_5_4_3 + 0.00173160173160179*G0_1_0_5_4_4 + 0.000865800865800894*G0_1_0_5_4_5 + 0.00313852813852823*G0_1_0_5_5_0 - 0.00339826839826851*G0_1_0_5_5_1 + 0.000389610389610403*G0_1_0_5_5_2 + 0.000173160173160179*G0_1_0_5_5_3 + 0.000865800865800894*G0_1_0_5_5_4 - 0.0397402597402611*G0_1_0_5_5_5; + A[92] = 0.00172889610389617*G0_0_1_0_0_0 - 0.000186688311688318*G0_0_1_0_0_1 + 0.000616883116883137*G0_0_1_0_0_2 + 0.000454545454545469*G0_0_1_0_0_3 + 0.000194805194805198*G0_0_1_0_0_4 + 0.000941558441558476*G0_0_1_0_0_5 - 0.000186688311688318*G0_0_1_0_1_0 + 0.000186688311688316*G0_0_1_0_1_1 - 0.000454545454545468*G0_0_1_0_1_3 + 0.00045454545454547*G0_0_1_0_1_4 + 0.000616883116883137*G0_0_1_0_2_0 - 0.00219155844155851*G0_0_1_0_2_2 + 0.000909090909090935*G0_0_1_0_2_3 - 0.00220779220779228*G0_0_1_0_2_4 + 0.000194805194805201*G0_0_1_0_2_5 + 0.000454545454545468*G0_0_1_0_3_0 - 0.000454545454545468*G0_0_1_0_3_1 + 0.000909090909090935*G0_0_1_0_3_2 - 0.00207792207792215*G0_0_1_0_3_3 - 0.00181818181818188*G0_0_1_0_3_4 - 0.00129870129870134*G0_0_1_0_3_5 + 0.000194805194805198*G0_0_1_0_4_0 + 0.00045454545454547*G0_0_1_0_4_1 - 0.00220779220779228*G0_0_1_0_4_2 - 0.00181818181818188*G0_0_1_0_4_3 - 0.0124675324675329*G0_0_1_0_4_4 - 0.00129870129870134*G0_0_1_0_4_5 + 0.000941558441558476*G0_0_1_0_5_0 + 0.000194805194805201*G0_0_1_0_5_2 - 0.00129870129870134*G0_0_1_0_5_3 - 0.00129870129870134*G0_0_1_0_5_4 + 0.000389610389610402*G0_0_1_0_5_5 - 0.000186688311688318*G0_0_1_1_0_0 + 0.000186688311688316*G0_0_1_1_0_1 - 0.000454545454545468*G0_0_1_1_0_3 + 0.00045454545454547*G0_0_1_1_0_4 + 0.000186688311688316*G0_0_1_1_1_0 - 0.00172889610389614*G0_0_1_1_1_1 - 0.000616883116883139*G0_0_1_1_1_2 - 0.000194805194805193*G0_0_1_1_1_3 - 0.000454545454545469*G0_0_1_1_1_4 - 0.000941558441558469*G0_0_1_1_1_5 - 0.000616883116883139*G0_0_1_1_2_1 + 0.00219155844155852*G0_0_1_1_2_2 + 0.00220779220779228*G0_0_1_1_2_3 - 0.000909090909090939*G0_0_1_1_2_4 - 0.000194805194805202*G0_0_1_1_2_5 - 0.000454545454545468*G0_0_1_1_3_0 - 0.000194805194805193*G0_0_1_1_3_1 + 0.00220779220779228*G0_0_1_1_3_2 + 0.0124675324675329*G0_0_1_1_3_3 + 0.00181818181818188*G0_0_1_1_3_4 + 0.00129870129870135*G0_0_1_1_3_5 + 0.00045454545454547*G0_0_1_1_4_0 - 0.000454545454545469*G0_0_1_1_4_1 - 0.000909090909090939*G0_0_1_1_4_2 + 0.00181818181818188*G0_0_1_1_4_3 + 0.00207792207792215*G0_0_1_1_4_4 + 0.00129870129870134*G0_0_1_1_4_5 - 0.000941558441558469*G0_0_1_1_5_1 - 0.000194805194805202*G0_0_1_1_5_2 + 0.00129870129870135*G0_0_1_1_5_3 + 0.00129870129870134*G0_0_1_1_5_4 - 0.000389610389610397*G0_0_1_1_5_5 + 0.000616883116883137*G0_0_1_2_0_0 - 0.00219155844155851*G0_0_1_2_0_2 + 0.000909090909090935*G0_0_1_2_0_3 - 0.00220779220779228*G0_0_1_2_0_4 + 0.000194805194805201*G0_0_1_2_0_5 - 0.000616883116883139*G0_0_1_2_1_1 + 0.00219155844155852*G0_0_1_2_1_2 + 0.00220779220779228*G0_0_1_2_1_3 - 0.000909090909090939*G0_0_1_2_1_4 - 0.000194805194805202*G0_0_1_2_1_5 - 0.00219155844155851*G0_0_1_2_2_0 + 0.00219155844155852*G0_0_1_2_2_1 - 0.0100649350649354*G0_0_1_2_2_3 + 0.0100649350649354*G0_0_1_2_2_4 + 0.000909090909090935*G0_0_1_2_3_0 + 0.00220779220779228*G0_0_1_2_3_1 - 0.0100649350649354*G0_0_1_2_3_2 - 0.0233766233766242*G0_0_1_2_3_3 - 0.00181818181818188*G0_0_1_2_3_5 - 0.00220779220779228*G0_0_1_2_4_0 - 0.000909090909090939*G0_0_1_2_4_1 + 0.0100649350649354*G0_0_1_2_4_2 + 0.0233766233766241*G0_0_1_2_4_4 + 0.00181818181818188*G0_0_1_2_4_5 + 0.000194805194805201*G0_0_1_2_5_0 - 0.000194805194805202*G0_0_1_2_5_1 - 0.00181818181818188*G0_0_1_2_5_3 + 0.00181818181818188*G0_0_1_2_5_4 + 0.000454545454545469*G0_0_1_3_0_0 - 0.000454545454545468*G0_0_1_3_0_1 + 0.000909090909090935*G0_0_1_3_0_2 - 0.00207792207792215*G0_0_1_3_0_3 - 0.00181818181818188*G0_0_1_3_0_4 - 0.00129870129870134*G0_0_1_3_0_5 - 0.000454545454545468*G0_0_1_3_1_0 - 0.000194805194805193*G0_0_1_3_1_1 + 0.00220779220779228*G0_0_1_3_1_2 + 0.0124675324675329*G0_0_1_3_1_3 + 0.00181818181818188*G0_0_1_3_1_4 + 0.00129870129870135*G0_0_1_3_1_5 + 0.000909090909090935*G0_0_1_3_2_0 + 0.00220779220779228*G0_0_1_3_2_1 - 0.0100649350649354*G0_0_1_3_2_2 - 0.0233766233766242*G0_0_1_3_2_3 - 0.00181818181818188*G0_0_1_3_2_5 - 0.00207792207792215*G0_0_1_3_3_0 + 0.0124675324675329*G0_0_1_3_3_1 - 0.0233766233766242*G0_0_1_3_3_2 + 0.00467532467532479*G0_0_1_3_3_3 + 0.000519480519480532*G0_0_1_3_3_4 + 0.00779220779220805*G0_0_1_3_3_5 - 0.00181818181818188*G0_0_1_3_4_0 + 0.00181818181818188*G0_0_1_3_4_1 + 0.000519480519480531*G0_0_1_3_4_3 - 0.000519480519480539*G0_0_1_3_4_4 - 0.00129870129870134*G0_0_1_3_5_0 + 0.00129870129870135*G0_0_1_3_5_1 - 0.00181818181818188*G0_0_1_3_5_2 + 0.00779220779220805*G0_0_1_3_5_3 + 0.00259740259740269*G0_0_1_3_5_5 + 0.000194805194805198*G0_0_1_4_0_0 + 0.00045454545454547*G0_0_1_4_0_1 - 0.00220779220779228*G0_0_1_4_0_2 - 0.00181818181818188*G0_0_1_4_0_3 - 0.0124675324675329*G0_0_1_4_0_4 - 0.00129870129870134*G0_0_1_4_0_5 + 0.00045454545454547*G0_0_1_4_1_0 - 0.000454545454545469*G0_0_1_4_1_1 - 0.000909090909090939*G0_0_1_4_1_2 + 0.00181818181818188*G0_0_1_4_1_3 + 0.00207792207792215*G0_0_1_4_1_4 + 0.00129870129870134*G0_0_1_4_1_5 - 0.00220779220779228*G0_0_1_4_2_0 - 0.000909090909090939*G0_0_1_4_2_1 + 0.0100649350649354*G0_0_1_4_2_2 + 0.0233766233766241*G0_0_1_4_2_4 + 0.00181818181818188*G0_0_1_4_2_5 - 0.00181818181818188*G0_0_1_4_3_0 + 0.00181818181818188*G0_0_1_4_3_1 + 0.000519480519480532*G0_0_1_4_3_3 - 0.000519480519480537*G0_0_1_4_3_4 - 0.0124675324675329*G0_0_1_4_4_0 + 0.00207792207792215*G0_0_1_4_4_1 + 0.0233766233766241*G0_0_1_4_4_2 - 0.000519480519480537*G0_0_1_4_4_3 - 0.00467532467532485*G0_0_1_4_4_4 - 0.00779220779220806*G0_0_1_4_4_5 - 0.00129870129870134*G0_0_1_4_5_0 + 0.00129870129870134*G0_0_1_4_5_1 + 0.00181818181818188*G0_0_1_4_5_2 - 0.00779220779220806*G0_0_1_4_5_4 - 0.00259740259740269*G0_0_1_4_5_5 + 0.000941558441558476*G0_0_1_5_0_0 + 0.000194805194805201*G0_0_1_5_0_2 - 0.00129870129870134*G0_0_1_5_0_3 - 0.00129870129870134*G0_0_1_5_0_4 + 0.000389610389610402*G0_0_1_5_0_5 - 0.000941558441558469*G0_0_1_5_1_1 - 0.000194805194805202*G0_0_1_5_1_2 + 0.00129870129870135*G0_0_1_5_1_3 + 0.00129870129870134*G0_0_1_5_1_4 - 0.000389610389610397*G0_0_1_5_1_5 + 0.000194805194805201*G0_0_1_5_2_0 - 0.000194805194805202*G0_0_1_5_2_1 - 0.00181818181818188*G0_0_1_5_2_3 + 0.00181818181818188*G0_0_1_5_2_4 - 0.00129870129870134*G0_0_1_5_3_0 + 0.00129870129870135*G0_0_1_5_3_1 - 0.00181818181818188*G0_0_1_5_3_2 + 0.00779220779220805*G0_0_1_5_3_3 + 0.00259740259740269*G0_0_1_5_3_5 - 0.00129870129870134*G0_0_1_5_4_0 + 0.00129870129870134*G0_0_1_5_4_1 + 0.00181818181818188*G0_0_1_5_4_2 - 0.00779220779220806*G0_0_1_5_4_4 - 0.00259740259740269*G0_0_1_5_4_5 + 0.000389610389610402*G0_0_1_5_5_0 - 0.000389610389610397*G0_0_1_5_5_1 + 0.00259740259740269*G0_0_1_5_5_3 - 0.00259740259740269*G0_0_1_5_5_4 + 0.00611201298701322*G0_1_1_0_0_0 - 0.000698051948051976*G0_1_1_0_0_1 - 0.000771103896103923*G0_1_1_0_0_2 + 0.000162337662337667*G0_1_1_0_0_3 + 0.000649350649350674*G0_1_1_0_0_4 + 0.00633116883116906*G0_1_1_0_0_5 - 0.000698051948051976*G0_1_1_0_1_0 - 0.000511363636363655*G0_1_1_0_1_1 - 0.000292207792207801*G0_1_1_0_1_2 - 0.00113636363636367*G0_1_1_0_1_3 - 0.000681818181818204*G0_1_1_0_1_4 - 0.00337662337662349*G0_1_1_0_1_5 - 0.000771103896103923*G0_1_1_0_2_0 - 0.000292207792207801*G0_1_1_0_2_1 + 0.00230519480519488*G0_1_1_0_2_2 + 0.00246753246753255*G0_1_1_0_2_3 + 0.00175324675324681*G0_1_1_0_2_4 + 0.000162337662337667*G0_1_1_0_2_5 + 0.000162337662337667*G0_1_1_0_3_0 - 0.00113636363636367*G0_1_1_0_3_1 + 0.00246753246753255*G0_1_1_0_3_2 + 0.000259740259740269*G0_1_1_0_3_3 + 0.00103896103896107*G0_1_1_0_3_4 - 0.000649350649350669*G0_1_1_0_3_5 + 0.000649350649350674*G0_1_1_0_4_0 - 0.000681818181818204*G0_1_1_0_4_1 + 0.00175324675324681*G0_1_1_0_4_2 + 0.00103896103896107*G0_1_1_0_4_3 + 0.00155844155844161*G0_1_1_0_4_4 + 0.00103896103896108*G0_1_1_0_4_5 + 0.00633116883116906*G0_1_1_0_5_0 - 0.00337662337662349*G0_1_1_0_5_1 + 0.000162337662337667*G0_1_1_0_5_2 - 0.000649350649350669*G0_1_1_0_5_3 + 0.00103896103896108*G0_1_1_0_5_4 + 0.00506493506493528*G0_1_1_0_5_5 - 0.000698051948051976*G0_1_1_1_0_0 - 0.000511363636363655*G0_1_1_1_0_1 - 0.000292207792207801*G0_1_1_1_0_2 - 0.00113636363636367*G0_1_1_1_0_3 - 0.000681818181818204*G0_1_1_1_0_4 - 0.00337662337662349*G0_1_1_1_0_5 - 0.000511363636363655*G0_1_1_1_1_0 + 0.00438311688311706*G0_1_1_1_1_1 - 0.00138798701298706*G0_1_1_1_1_2 + 0.000454545454545477*G0_1_1_1_1_3 - 0.000292207792207803*G0_1_1_1_1_4 + 0.00538961038961058*G0_1_1_1_1_5 - 0.000292207792207801*G0_1_1_1_2_0 - 0.00138798701298706*G0_1_1_1_2_1 + 0.00449675324675341*G0_1_1_1_2_2 + 0.0039610389610391*G0_1_1_1_2_3 + 0.00155844155844161*G0_1_1_1_2_4 - 3.24675324675334e-05*G0_1_1_1_2_5 - 0.00113636363636367*G0_1_1_1_3_0 + 0.000454545454545477*G0_1_1_1_3_1 + 0.0039610389610391*G0_1_1_1_3_2 + 0.0140259740259745*G0_1_1_1_3_3 + 0.00285714285714296*G0_1_1_1_3_4 + 0.00233766233766242*G0_1_1_1_3_5 - 0.000681818181818204*G0_1_1_1_4_0 - 0.000292207792207803*G0_1_1_1_4_1 + 0.00155844155844161*G0_1_1_1_4_2 + 0.00285714285714296*G0_1_1_1_4_3 + 0.00233766233766242*G0_1_1_1_4_4 + 0.000649350649350672*G0_1_1_1_4_5 - 0.00337662337662349*G0_1_1_1_5_0 + 0.00538961038961058*G0_1_1_1_5_1 - 3.24675324675334e-05*G0_1_1_1_5_2 + 0.00233766233766242*G0_1_1_1_5_3 + 0.000649350649350672*G0_1_1_1_5_4 + 0.00467532467532485*G0_1_1_1_5_5 - 0.000771103896103923*G0_1_1_2_0_0 - 0.000292207792207801*G0_1_1_2_0_1 + 0.00230519480519488*G0_1_1_2_0_2 + 0.00246753246753255*G0_1_1_2_0_3 + 0.00175324675324681*G0_1_1_2_0_4 + 0.000162337662337667*G0_1_1_2_0_5 - 0.000292207792207801*G0_1_1_2_1_0 - 0.00138798701298706*G0_1_1_2_1_1 + 0.00449675324675341*G0_1_1_2_1_2 + 0.0039610389610391*G0_1_1_2_1_3 + 0.00155844155844161*G0_1_1_2_1_4 - 3.24675324675334e-05*G0_1_1_2_1_5 + 0.00230519480519488*G0_1_1_2_2_0 + 0.00449675324675341*G0_1_1_2_2_1 - 0.0304383116883128*G0_1_1_2_2_2 - 0.0194805194805202*G0_1_1_2_2_3 - 0.00941558441558476*G0_1_1_2_2_4 - 0.00103896103896108*G0_1_1_2_2_5 + 0.00246753246753255*G0_1_1_2_3_0 + 0.0039610389610391*G0_1_1_2_3_1 - 0.0194805194805202*G0_1_1_2_3_2 - 0.0296103896103906*G0_1_1_2_3_3 - 0.00805194805194833*G0_1_1_2_3_4 - 0.00285714285714296*G0_1_1_2_3_5 + 0.00175324675324681*G0_1_1_2_4_0 + 0.00155844155844161*G0_1_1_2_4_1 - 0.00941558441558476*G0_1_1_2_4_2 - 0.00805194805194833*G0_1_1_2_4_3 - 0.00623376623376646*G0_1_1_2_4_4 - 0.00103896103896108*G0_1_1_2_4_5 + 0.000162337662337667*G0_1_1_2_5_0 - 3.24675324675334e-05*G0_1_1_2_5_1 - 0.00103896103896108*G0_1_1_2_5_2 - 0.00285714285714296*G0_1_1_2_5_3 - 0.00103896103896108*G0_1_1_2_5_4 - 0.00376623376623389*G0_1_1_2_5_5 + 0.000162337662337667*G0_1_1_3_0_0 - 0.00113636363636367*G0_1_1_3_0_1 + 0.00246753246753255*G0_1_1_3_0_2 + 0.000259740259740269*G0_1_1_3_0_3 + 0.00103896103896107*G0_1_1_3_0_4 - 0.000649350649350669*G0_1_1_3_0_5 - 0.00113636363636367*G0_1_1_3_1_0 + 0.000454545454545477*G0_1_1_3_1_1 + 0.0039610389610391*G0_1_1_3_1_2 + 0.0140259740259745*G0_1_1_3_1_3 + 0.00285714285714296*G0_1_1_3_1_4 + 0.00233766233766242*G0_1_1_3_1_5 + 0.00246753246753255*G0_1_1_3_2_0 + 0.0039610389610391*G0_1_1_3_2_1 - 0.0194805194805202*G0_1_1_3_2_2 - 0.0296103896103906*G0_1_1_3_2_3 - 0.00805194805194833*G0_1_1_3_2_4 - 0.00285714285714296*G0_1_1_3_2_5 + 0.000259740259740269*G0_1_1_3_3_0 + 0.0140259740259745*G0_1_1_3_3_1 - 0.0296103896103906*G0_1_1_3_3_2 - 0.00935064935064974*G0_1_1_3_3_3 - 0.00623376623376645*G0_1_1_3_3_4 + 0.00519480519480536*G0_1_1_3_3_5 + 0.00103896103896107*G0_1_1_3_4_0 + 0.00285714285714296*G0_1_1_3_4_1 - 0.00805194805194833*G0_1_1_3_4_2 - 0.00623376623376645*G0_1_1_3_4_3 - 0.00675324675324699*G0_1_1_3_4_4 - 0.000649350649350669*G0_1_1_3_5_0 + 0.00233766233766242*G0_1_1_3_5_1 - 0.00285714285714296*G0_1_1_3_5_2 + 0.00519480519480536*G0_1_1_3_5_3 + 0.00883116883116912*G0_1_1_3_5_5 + 0.000649350649350674*G0_1_1_4_0_0 - 0.000681818181818204*G0_1_1_4_0_1 + 0.00175324675324681*G0_1_1_4_0_2 + 0.00103896103896107*G0_1_1_4_0_3 + 0.00155844155844161*G0_1_1_4_0_4 + 0.00103896103896108*G0_1_1_4_0_5 - 0.000681818181818204*G0_1_1_4_1_0 - 0.000292207792207803*G0_1_1_4_1_1 + 0.00155844155844161*G0_1_1_4_1_2 + 0.00285714285714296*G0_1_1_4_1_3 + 0.00233766233766242*G0_1_1_4_1_4 + 0.000649350649350672*G0_1_1_4_1_5 + 0.00175324675324681*G0_1_1_4_2_0 + 0.00155844155844161*G0_1_1_4_2_1 - 0.00941558441558476*G0_1_1_4_2_2 - 0.00805194805194833*G0_1_1_4_2_3 - 0.00623376623376646*G0_1_1_4_2_4 - 0.00103896103896108*G0_1_1_4_2_5 + 0.00103896103896107*G0_1_1_4_3_0 + 0.00285714285714296*G0_1_1_4_3_1 - 0.00805194805194833*G0_1_1_4_3_2 - 0.00623376623376645*G0_1_1_4_3_3 - 0.00675324675324699*G0_1_1_4_3_4 + 0.00155844155844161*G0_1_1_4_4_0 + 0.00233766233766242*G0_1_1_4_4_1 - 0.00623376623376646*G0_1_1_4_4_2 - 0.00675324675324699*G0_1_1_4_4_3 - 0.0140259740259745*G0_1_1_4_4_4 - 0.00259740259740269*G0_1_1_4_4_5 + 0.00103896103896108*G0_1_1_4_5_0 + 0.000649350649350672*G0_1_1_4_5_1 - 0.00103896103896108*G0_1_1_4_5_2 - 0.00259740259740269*G0_1_1_4_5_4 + 0.00623376623376643*G0_1_1_4_5_5 + 0.00633116883116906*G0_1_1_5_0_0 - 0.00337662337662349*G0_1_1_5_0_1 + 0.000162337662337667*G0_1_1_5_0_2 - 0.000649350649350669*G0_1_1_5_0_3 + 0.00103896103896108*G0_1_1_5_0_4 + 0.00506493506493527*G0_1_1_5_0_5 - 0.00337662337662349*G0_1_1_5_1_0 + 0.00538961038961058*G0_1_1_5_1_1 - 3.24675324675334e-05*G0_1_1_5_1_2 + 0.00233766233766242*G0_1_1_5_1_3 + 0.000649350649350672*G0_1_1_5_1_4 + 0.00467532467532485*G0_1_1_5_1_5 + 0.000162337662337667*G0_1_1_5_2_0 - 3.24675324675334e-05*G0_1_1_5_2_1 - 0.00103896103896108*G0_1_1_5_2_2 - 0.00285714285714296*G0_1_1_5_2_3 - 0.00103896103896108*G0_1_1_5_2_4 - 0.00376623376623389*G0_1_1_5_2_5 - 0.000649350649350669*G0_1_1_5_3_0 + 0.00233766233766242*G0_1_1_5_3_1 - 0.00285714285714296*G0_1_1_5_3_2 + 0.00519480519480536*G0_1_1_5_3_3 + 0.00883116883116912*G0_1_1_5_3_5 + 0.00103896103896108*G0_1_1_5_4_0 + 0.000649350649350672*G0_1_1_5_4_1 - 0.00103896103896108*G0_1_1_5_4_2 - 0.00259740259740269*G0_1_1_5_4_4 + 0.00623376623376643*G0_1_1_5_4_5 + 0.00506493506493528*G0_1_1_5_5_0 + 0.00467532467532485*G0_1_1_5_5_1 - 0.00376623376623389*G0_1_1_5_5_2 + 0.00883116883116912*G0_1_1_5_5_3 + 0.00623376623376643*G0_1_1_5_5_4 + 0.107532467532471*G0_1_1_5_5_5; + A[90] = A[92] - 0.0304383116883128*G0_0_0_0_0_0 + 0.00230519480519489*G0_0_0_0_0_1 + 0.00449675324675341*G0_0_0_0_0_2 - 0.00103896103896107*G0_0_0_0_0_3 - 0.0194805194805202*G0_0_0_0_0_4 - 0.00941558441558476*G0_0_0_0_0_5 + 0.00230519480519489*G0_0_0_0_1_0 - 0.000771103896103922*G0_0_0_0_1_1 - 0.000292207792207803*G0_0_0_0_1_2 + 0.000162337662337667*G0_0_0_0_1_3 + 0.00246753246753255*G0_0_0_0_1_4 + 0.00175324675324681*G0_0_0_0_1_5 + 0.00449675324675341*G0_0_0_0_2_0 - 0.000292207792207803*G0_0_0_0_2_1 - 0.00138798701298706*G0_0_0_0_2_2 + 0.0039610389610391*G0_0_0_0_2_4 + 0.00155844155844161*G0_0_0_0_2_5 - 0.00103896103896107*G0_0_0_0_3_0 + 0.000162337662337667*G0_0_0_0_3_1 - 0.00376623376623387*G0_0_0_0_3_3 - 0.00285714285714295*G0_0_0_0_3_4 - 0.00103896103896107*G0_0_0_0_3_5 - 0.0194805194805202*G0_0_0_0_4_0 + 0.00246753246753255*G0_0_0_0_4_1 + 0.0039610389610391*G0_0_0_0_4_2 - 0.00285714285714295*G0_0_0_0_4_3 - 0.0296103896103906*G0_0_0_0_4_4 - 0.00805194805194833*G0_0_0_0_4_5 - 0.00941558441558476*G0_0_0_0_5_0 + 0.00175324675324681*G0_0_0_0_5_1 + 0.00155844155844161*G0_0_0_0_5_2 - 0.00103896103896107*G0_0_0_0_5_3 - 0.00805194805194833*G0_0_0_0_5_4 - 0.00623376623376646*G0_0_0_0_5_5 + 0.00230519480519489*G0_0_0_1_0_0 - 0.000771103896103922*G0_0_0_1_0_1 - 0.000292207792207803*G0_0_0_1_0_2 + 0.000162337662337667*G0_0_0_1_0_3 + 0.00246753246753255*G0_0_0_1_0_4 + 0.00175324675324681*G0_0_0_1_0_5 - 0.000771103896103922*G0_0_0_1_1_0 + 0.00611201298701319*G0_0_0_1_1_1 - 0.000698051948051973*G0_0_0_1_1_2 + 0.00633116883116905*G0_0_0_1_1_3 + 0.000162337662337667*G0_0_0_1_1_4 + 0.000649350649350677*G0_0_0_1_1_5 - 0.000292207792207803*G0_0_0_1_2_0 - 0.000698051948051973*G0_0_0_1_2_1 - 0.000511363636363653*G0_0_0_1_2_2 - 0.00337662337662349*G0_0_0_1_2_3 - 0.00113636363636367*G0_0_0_1_2_4 - 0.000681818181818207*G0_0_0_1_2_5 + 0.000162337662337667*G0_0_0_1_3_0 + 0.00633116883116905*G0_0_0_1_3_1 - 0.00337662337662349*G0_0_0_1_3_2 + 0.00506493506493525*G0_0_0_1_3_3 - 0.00064935064935067*G0_0_0_1_3_4 + 0.00103896103896108*G0_0_0_1_3_5 + 0.00246753246753255*G0_0_0_1_4_0 + 0.000162337662337667*G0_0_0_1_4_1 - 0.00113636363636367*G0_0_0_1_4_2 - 0.00064935064935067*G0_0_0_1_4_3 + 0.000259740259740274*G0_0_0_1_4_4 + 0.00103896103896108*G0_0_0_1_4_5 + 0.00175324675324681*G0_0_0_1_5_0 + 0.000649350649350677*G0_0_0_1_5_1 - 0.000681818181818207*G0_0_0_1_5_2 + 0.00103896103896108*G0_0_0_1_5_3 + 0.00103896103896107*G0_0_0_1_5_4 + 0.00155844155844162*G0_0_0_1_5_5 + 0.00449675324675341*G0_0_0_2_0_0 - 0.000292207792207803*G0_0_0_2_0_1 - 0.00138798701298706*G0_0_0_2_0_2 + 0.0039610389610391*G0_0_0_2_0_4 + 0.00155844155844161*G0_0_0_2_0_5 - 0.000292207792207803*G0_0_0_2_1_0 - 0.000698051948051973*G0_0_0_2_1_1 - 0.000511363636363653*G0_0_0_2_1_2 - 0.00337662337662349*G0_0_0_2_1_3 - 0.00113636363636367*G0_0_0_2_1_4 - 0.000681818181818207*G0_0_0_2_1_5 - 0.00138798701298706*G0_0_0_2_2_0 - 0.000511363636363653*G0_0_0_2_2_1 + 0.00438311688311703*G0_0_0_2_2_2 + 0.00538961038961057*G0_0_0_2_2_3 + 0.000454545454545464*G0_0_0_2_2_4 - 0.000292207792207801*G0_0_0_2_2_5 - 0.00337662337662349*G0_0_0_2_3_1 + 0.00538961038961057*G0_0_0_2_3_2 + 0.00467532467532484*G0_0_0_2_3_3 + 0.00233766233766241*G0_0_0_2_3_4 + 0.000649350649350672*G0_0_0_2_3_5 + 0.0039610389610391*G0_0_0_2_4_0 - 0.00113636363636367*G0_0_0_2_4_1 + 0.000454545454545464*G0_0_0_2_4_2 + 0.00233766233766241*G0_0_0_2_4_3 + 0.0140259740259745*G0_0_0_2_4_4 + 0.00285714285714295*G0_0_0_2_4_5 + 0.00155844155844161*G0_0_0_2_5_0 - 0.000681818181818207*G0_0_0_2_5_1 - 0.000292207792207801*G0_0_0_2_5_2 + 0.000649350649350672*G0_0_0_2_5_3 + 0.00285714285714295*G0_0_0_2_5_4 + 0.00233766233766242*G0_0_0_2_5_5 - 0.00103896103896107*G0_0_0_3_0_0 + 0.000162337662337667*G0_0_0_3_0_1 - 0.00376623376623387*G0_0_0_3_0_3 - 0.00285714285714295*G0_0_0_3_0_4 - 0.00103896103896107*G0_0_0_3_0_5 + 0.000162337662337667*G0_0_0_3_1_0 + 0.00633116883116905*G0_0_0_3_1_1 - 0.00337662337662349*G0_0_0_3_1_2 + 0.00506493506493525*G0_0_0_3_1_3 - 0.00064935064935067*G0_0_0_3_1_4 + 0.00103896103896108*G0_0_0_3_1_5 - 0.00337662337662349*G0_0_0_3_2_1 + 0.00538961038961057*G0_0_0_3_2_2 + 0.00467532467532484*G0_0_0_3_2_3 + 0.00233766233766241*G0_0_0_3_2_4 + 0.000649350649350672*G0_0_0_3_2_5 - 0.00376623376623387*G0_0_0_3_3_0 + 0.00506493506493525*G0_0_0_3_3_1 + 0.00467532467532484*G0_0_0_3_3_2 + 0.107532467532471*G0_0_0_3_3_3 + 0.00883116883116912*G0_0_0_3_3_4 + 0.00623376623376645*G0_0_0_3_3_5 - 0.00285714285714295*G0_0_0_3_4_0 - 0.00064935064935067*G0_0_0_3_4_1 + 0.00233766233766241*G0_0_0_3_4_2 + 0.00883116883116912*G0_0_0_3_4_3 + 0.00519480519480536*G0_0_0_3_4_4 - 0.00103896103896107*G0_0_0_3_5_0 + 0.00103896103896108*G0_0_0_3_5_1 + 0.000649350649350672*G0_0_0_3_5_2 + 0.00623376623376645*G0_0_0_3_5_3 - 0.00259740259740268*G0_0_0_3_5_5 - 0.0194805194805202*G0_0_0_4_0_0 + 0.00246753246753255*G0_0_0_4_0_1 + 0.0039610389610391*G0_0_0_4_0_2 - 0.00285714285714295*G0_0_0_4_0_3 - 0.0296103896103906*G0_0_0_4_0_4 - 0.00805194805194833*G0_0_0_4_0_5 + 0.00246753246753255*G0_0_0_4_1_0 + 0.000162337662337667*G0_0_0_4_1_1 - 0.00113636363636367*G0_0_0_4_1_2 - 0.00064935064935067*G0_0_0_4_1_3 + 0.000259740259740274*G0_0_0_4_1_4 + 0.00103896103896108*G0_0_0_4_1_5 + 0.0039610389610391*G0_0_0_4_2_0 - 0.00113636363636367*G0_0_0_4_2_1 + 0.000454545454545464*G0_0_0_4_2_2 + 0.00233766233766241*G0_0_0_4_2_3 + 0.0140259740259745*G0_0_0_4_2_4 + 0.00285714285714295*G0_0_0_4_2_5 - 0.00285714285714295*G0_0_0_4_3_0 - 0.00064935064935067*G0_0_0_4_3_1 + 0.00233766233766241*G0_0_0_4_3_2 + 0.00883116883116912*G0_0_0_4_3_3 + 0.00519480519480536*G0_0_0_4_3_4 - 0.0296103896103906*G0_0_0_4_4_0 + 0.000259740259740274*G0_0_0_4_4_1 + 0.0140259740259745*G0_0_0_4_4_2 + 0.00519480519480537*G0_0_0_4_4_3 - 0.00935064935064967*G0_0_0_4_4_4 - 0.00623376623376644*G0_0_0_4_4_5 - 0.00805194805194833*G0_0_0_4_5_0 + 0.00103896103896108*G0_0_0_4_5_1 + 0.00285714285714295*G0_0_0_4_5_2 - 0.00623376623376644*G0_0_0_4_5_4 - 0.00675324675324699*G0_0_0_4_5_5 - 0.00941558441558476*G0_0_0_5_0_0 + 0.00175324675324681*G0_0_0_5_0_1 + 0.00155844155844161*G0_0_0_5_0_2 - 0.00103896103896107*G0_0_0_5_0_3 - 0.00805194805194833*G0_0_0_5_0_4 - 0.00623376623376646*G0_0_0_5_0_5 + 0.00175324675324681*G0_0_0_5_1_0 + 0.000649350649350677*G0_0_0_5_1_1 - 0.000681818181818207*G0_0_0_5_1_2 + 0.00103896103896108*G0_0_0_5_1_3 + 0.00103896103896107*G0_0_0_5_1_4 + 0.00155844155844162*G0_0_0_5_1_5 + 0.00155844155844161*G0_0_0_5_2_0 - 0.000681818181818207*G0_0_0_5_2_1 - 0.000292207792207801*G0_0_0_5_2_2 + 0.000649350649350672*G0_0_0_5_2_3 + 0.00285714285714295*G0_0_0_5_2_4 + 0.00233766233766242*G0_0_0_5_2_5 - 0.00103896103896107*G0_0_0_5_3_0 + 0.00103896103896108*G0_0_0_5_3_1 + 0.000649350649350672*G0_0_0_5_3_2 + 0.00623376623376645*G0_0_0_5_3_3 - 0.00259740259740268*G0_0_0_5_3_5 - 0.00805194805194833*G0_0_0_5_4_0 + 0.00103896103896107*G0_0_0_5_4_1 + 0.00285714285714295*G0_0_0_5_4_2 - 0.00623376623376644*G0_0_0_5_4_4 - 0.00675324675324699*G0_0_0_5_4_5 - 0.00623376623376646*G0_0_0_5_5_0 + 0.00155844155844162*G0_0_0_5_5_1 + 0.00233766233766242*G0_0_0_5_5_2 - 0.00259740259740268*G0_0_0_5_5_3 - 0.00675324675324699*G0_0_0_5_5_4 - 0.0140259740259745*G0_0_0_5_5_5 - 0.032167207792209*G0_0_1_0_0_0 + 0.00249188311688321*G0_0_1_0_0_1 + 0.00387987012987027*G0_0_1_0_0_2 - 0.00149350649350654*G0_0_1_0_0_3 - 0.0196753246753254*G0_0_1_0_0_4 - 0.0103571428571432*G0_0_1_0_0_5 + 0.00249188311688321*G0_0_1_0_1_0 - 0.000957792207792239*G0_0_1_0_1_1 - 0.000292207792207804*G0_0_1_0_1_2 + 0.000616883116883135*G0_0_1_0_1_3 + 0.00201298701298708*G0_0_1_0_1_4 + 0.00175324675324682*G0_0_1_0_1_5 + 0.00387987012987027*G0_0_1_0_2_0 - 0.000292207792207804*G0_0_1_0_2_1 + 0.000803571428571455*G0_0_1_0_2_2 - 0.000941558441558467*G0_0_1_0_2_3 + 0.00616883116883138*G0_0_1_0_2_4 + 0.00136363636363641*G0_0_1_0_2_5 - 0.00149350649350654*G0_0_1_0_3_0 + 0.000616883116883135*G0_0_1_0_3_1 - 0.000941558441558467*G0_0_1_0_3_2 - 0.00168831168831173*G0_0_1_0_3_3 - 0.00103896103896107*G0_0_1_0_3_4 + 0.000259740259740266*G0_0_1_0_3_5 - 0.0196753246753254*G0_0_1_0_4_0 + 0.00201298701298708*G0_0_1_0_4_1 + 0.00616883116883137*G0_0_1_0_4_2 - 0.00103896103896107*G0_0_1_0_4_3 - 0.0171428571428577*G0_0_1_0_4_4 - 0.00675324675324699*G0_0_1_0_4_5 - 0.0103571428571432*G0_0_1_0_5_0 + 0.00175324675324682*G0_0_1_0_5_1 + 0.00136363636363641*G0_0_1_0_5_2 + 0.000259740259740266*G0_0_1_0_5_3 - 0.00675324675324699*G0_0_1_0_5_4 - 0.00662337662337686*G0_0_1_0_5_5 + 0.00249188311688321*G0_0_1_1_0_0 - 0.000957792207792239*G0_0_1_1_0_1 - 0.000292207792207803*G0_0_1_1_0_2 + 0.000616883116883135*G0_0_1_1_0_3 + 0.00201298701298708*G0_0_1_1_0_4 + 0.00175324675324682*G0_0_1_1_0_5 - 0.000957792207792239*G0_0_1_1_1_0 + 0.00784090909090933*G0_0_1_1_1_1 + 0.00652597402597424*G0_0_1_1_1_3 + 0.000616883116883137*G0_0_1_1_1_4 + 0.00159090909090915*G0_0_1_1_1_5 - 0.000292207792207804*G0_0_1_1_2_0 - 0.00270292207792217*G0_0_1_1_2_2 - 0.00558441558441577*G0_0_1_1_2_3 - 0.000227272727272736*G0_0_1_1_2_4 - 0.000487012987013005*G0_0_1_1_2_5 + 0.000616883116883135*G0_0_1_1_3_0 + 0.00652597402597424*G0_0_1_1_3_1 - 0.00558441558441577*G0_0_1_1_3_2 - 0.00740259740259766*G0_0_1_1_3_3 - 0.00246753246753255*G0_0_1_1_3_4 - 0.000259740259740269*G0_0_1_1_3_5 + 0.00201298701298708*G0_0_1_1_4_0 + 0.000616883116883137*G0_0_1_1_4_1 - 0.000227272727272736*G0_0_1_1_4_2 - 0.00246753246753255*G0_0_1_1_4_3 - 0.00181818181818188*G0_0_1_1_4_4 - 0.000259740259740269*G0_0_1_1_4_5 + 0.00175324675324682*G0_0_1_1_5_0 + 0.00159090909090915*G0_0_1_1_5_1 - 0.000487012987013005*G0_0_1_1_5_2 - 0.000259740259740269*G0_0_1_1_5_3 - 0.000259740259740269*G0_0_1_1_5_4 + 0.00194805194805201*G0_0_1_1_5_5 + 0.00387987012987027*G0_0_1_2_0_0 - 0.000292207792207804*G0_0_1_2_0_1 + 0.000803571428571454*G0_0_1_2_0_2 - 0.000941558441558467*G0_0_1_2_0_3 + 0.00616883116883137*G0_0_1_2_0_4 + 0.00136363636363641*G0_0_1_2_0_5 - 0.000292207792207804*G0_0_1_2_1_0 - 0.00270292207792217*G0_0_1_2_1_2 - 0.00558441558441577*G0_0_1_2_1_3 - 0.000227272727272736*G0_0_1_2_1_4 - 0.000487012987013005*G0_0_1_2_1_5 + 0.000803571428571454*G0_0_1_2_2_0 - 0.00270292207792217*G0_0_1_2_2_1 + 0.00438311688311705*G0_0_1_2_2_2 + 0.015454545454546*G0_0_1_2_2_3 - 0.00961038961038993*G0_0_1_2_2_4 - 0.000292207792207801*G0_0_1_2_2_5 - 0.000941558441558467*G0_0_1_2_3_0 - 0.00558441558441577*G0_0_1_2_3_1 + 0.015454545454546*G0_0_1_2_3_2 + 0.028051948051949*G0_0_1_2_3_3 + 0.00233766233766242*G0_0_1_2_3_4 + 0.00246753246753255*G0_0_1_2_3_5 + 0.00616883116883137*G0_0_1_2_4_0 - 0.000227272727272736*G0_0_1_2_4_1 - 0.00961038961038993*G0_0_1_2_4_2 + 0.00233766233766241*G0_0_1_2_4_3 - 0.00935064935064965*G0_0_1_2_4_4 + 0.00103896103896107*G0_0_1_2_4_5 + 0.00136363636363641*G0_0_1_2_5_0 - 0.000487012987013005*G0_0_1_2_5_1 - 0.000292207792207801*G0_0_1_2_5_2 + 0.00246753246753255*G0_0_1_2_5_3 + 0.00103896103896107*G0_0_1_2_5_4 + 0.00233766233766242*G0_0_1_2_5_5 - 0.00149350649350654*G0_0_1_3_0_0 + 0.000616883116883135*G0_0_1_3_0_1 - 0.000941558441558467*G0_0_1_3_0_2 - 0.00168831168831173*G0_0_1_3_0_3 - 0.00103896103896107*G0_0_1_3_0_4 + 0.000259740259740266*G0_0_1_3_0_5 + 0.000616883116883135*G0_0_1_3_1_0 + 0.00652597402597424*G0_0_1_3_1_1 - 0.00558441558441577*G0_0_1_3_1_2 - 0.00740259740259766*G0_0_1_3_1_3 - 0.00246753246753255*G0_0_1_3_1_4 - 0.000259740259740269*G0_0_1_3_1_5 - 0.000941558441558467*G0_0_1_3_2_0 - 0.00558441558441577*G0_0_1_3_2_1 + 0.015454545454546*G0_0_1_3_2_2 + 0.028051948051949*G0_0_1_3_2_3 + 0.00233766233766242*G0_0_1_3_2_4 + 0.00246753246753255*G0_0_1_3_2_5 - 0.00168831168831173*G0_0_1_3_3_0 - 0.00740259740259765*G0_0_1_3_3_1 + 0.028051948051949*G0_0_1_3_3_2 + 0.102857142857146*G0_0_1_3_3_3 + 0.0083116883116886*G0_0_1_3_3_4 - 0.00155844155844158*G0_0_1_3_3_5 - 0.00103896103896107*G0_0_1_3_4_0 - 0.00246753246753255*G0_0_1_3_4_1 + 0.00233766233766242*G0_0_1_3_4_2 + 0.0083116883116886*G0_0_1_3_4_3 + 0.00571428571428591*G0_0_1_3_4_4 + 0.000259740259740267*G0_0_1_3_5_0 - 0.000259740259740269*G0_0_1_3_5_1 + 0.00246753246753255*G0_0_1_3_5_2 - 0.00155844155844158*G0_0_1_3_5_3 - 0.00519480519480537*G0_0_1_3_5_5 - 0.0196753246753254*G0_0_1_4_0_0 + 0.00201298701298708*G0_0_1_4_0_1 + 0.00616883116883137*G0_0_1_4_0_2 - 0.00103896103896107*G0_0_1_4_0_3 - 0.0171428571428577*G0_0_1_4_0_4 - 0.00675324675324699*G0_0_1_4_0_5 + 0.00201298701298708*G0_0_1_4_1_0 + 0.000616883116883137*G0_0_1_4_1_1 - 0.000227272727272736*G0_0_1_4_1_2 - 0.00246753246753255*G0_0_1_4_1_3 - 0.00181818181818188*G0_0_1_4_1_4 - 0.000259740259740269*G0_0_1_4_1_5 + 0.00616883116883138*G0_0_1_4_2_0 - 0.000227272727272736*G0_0_1_4_2_1 - 0.00961038961038993*G0_0_1_4_2_2 + 0.00233766233766242*G0_0_1_4_2_3 - 0.00935064935064965*G0_0_1_4_2_4 + 0.00103896103896107*G0_0_1_4_2_5 - 0.00103896103896107*G0_0_1_4_3_0 - 0.00246753246753255*G0_0_1_4_3_1 + 0.00233766233766242*G0_0_1_4_3_2 + 0.0083116883116886*G0_0_1_4_3_3 + 0.00571428571428591*G0_0_1_4_3_4 - 0.0171428571428577*G0_0_1_4_4_0 - 0.00181818181818188*G0_0_1_4_4_1 - 0.00935064935064965*G0_0_1_4_4_2 + 0.00571428571428591*G0_0_1_4_4_3 - 0.00467532467532481*G0_0_1_4_4_4 + 0.00155844155844161*G0_0_1_4_4_5 - 0.00675324675324699*G0_0_1_4_5_0 - 0.000259740259740269*G0_0_1_4_5_1 + 0.00103896103896107*G0_0_1_4_5_2 + 0.00155844155844161*G0_0_1_4_5_4 - 0.00415584415584431*G0_0_1_4_5_5 - 0.0103571428571432*G0_0_1_5_0_0 + 0.00175324675324682*G0_0_1_5_0_1 + 0.00136363636363641*G0_0_1_5_0_2 + 0.000259740259740266*G0_0_1_5_0_3 - 0.00675324675324699*G0_0_1_5_0_4 - 0.00662337662337686*G0_0_1_5_0_5 + 0.00175324675324682*G0_0_1_5_1_0 + 0.00159090909090915*G0_0_1_5_1_1 - 0.000487012987013005*G0_0_1_5_1_2 - 0.000259740259740269*G0_0_1_5_1_3 - 0.00025974025974027*G0_0_1_5_1_4 + 0.00194805194805201*G0_0_1_5_1_5 + 0.00136363636363641*G0_0_1_5_2_0 - 0.000487012987013005*G0_0_1_5_2_1 - 0.000292207792207801*G0_0_1_5_2_2 + 0.00246753246753255*G0_0_1_5_2_3 + 0.00103896103896107*G0_0_1_5_2_4 + 0.00233766233766242*G0_0_1_5_2_5 + 0.000259740259740266*G0_0_1_5_3_0 - 0.000259740259740269*G0_0_1_5_3_1 + 0.00246753246753255*G0_0_1_5_3_2 - 0.00155844155844158*G0_0_1_5_3_3 - 0.00519480519480537*G0_0_1_5_3_5 - 0.00675324675324699*G0_0_1_5_4_0 - 0.00025974025974027*G0_0_1_5_4_1 + 0.00103896103896107*G0_0_1_5_4_2 + 0.00155844155844161*G0_0_1_5_4_4 - 0.0041558441558443*G0_0_1_5_4_5 - 0.00662337662337686*G0_0_1_5_5_0 + 0.00194805194805201*G0_0_1_5_5_1 + 0.00233766233766242*G0_0_1_5_5_2 - 0.00519480519480537*G0_0_1_5_5_3 - 0.0041558441558443*G0_0_1_5_5_4 - 0.0140259740259745*G0_0_1_5_5_5 - 0.0304383116883129*G0_1_0_0_0_0 + 0.00449675324675342*G0_1_0_0_0_1 + 0.00230519480519489*G0_1_0_0_0_2 - 0.00103896103896108*G0_1_0_0_0_3 - 0.00941558441558477*G0_1_0_0_0_4 - 0.0194805194805202*G0_1_0_0_0_5 + 0.00449675324675342*G0_1_0_0_1_0 - 0.00138798701298706*G0_1_0_0_1_1 - 0.000292207792207804*G0_1_0_0_1_2 + 0.00155844155844161*G0_1_0_0_1_4 + 0.00396103896103911*G0_1_0_0_1_5 + 0.00230519480519489*G0_1_0_0_2_0 - 0.000292207792207804*G0_1_0_0_2_1 - 0.000771103896103924*G0_1_0_0_2_2 + 0.000162337662337668*G0_1_0_0_2_3 + 0.00175324675324682*G0_1_0_0_2_4 + 0.00246753246753256*G0_1_0_0_2_5 - 0.00103896103896108*G0_1_0_0_3_0 + 0.000162337662337668*G0_1_0_0_3_2 - 0.00376623376623387*G0_1_0_0_3_3 - 0.00103896103896107*G0_1_0_0_3_4 - 0.00285714285714295*G0_1_0_0_3_5 - 0.00941558441558477*G0_1_0_0_4_0 + 0.00155844155844161*G0_1_0_0_4_1 + 0.00175324675324682*G0_1_0_0_4_2 - 0.00103896103896107*G0_1_0_0_4_3 - 0.00623376623376646*G0_1_0_0_4_4 - 0.00805194805194834*G0_1_0_0_4_5 - 0.0194805194805202*G0_1_0_0_5_0 + 0.00396103896103911*G0_1_0_0_5_1 + 0.00246753246753256*G0_1_0_0_5_2 - 0.00285714285714295*G0_1_0_0_5_3 - 0.00805194805194834*G0_1_0_0_5_4 - 0.0296103896103907*G0_1_0_0_5_5 + 0.00449675324675342*G0_1_0_1_0_0 - 0.00138798701298706*G0_1_0_1_0_1 - 0.000292207792207804*G0_1_0_1_0_2 + 0.00155844155844161*G0_1_0_1_0_4 + 0.00396103896103911*G0_1_0_1_0_5 - 0.00138798701298706*G0_1_0_1_1_0 + 0.00438311688311701*G0_1_0_1_1_1 - 0.000511363636363653*G0_1_0_1_1_2 + 0.00538961038961057*G0_1_0_1_1_3 - 0.000292207792207803*G0_1_0_1_1_4 + 0.000454545454545468*G0_1_0_1_1_5 - 0.000292207792207804*G0_1_0_1_2_0 - 0.000511363636363653*G0_1_0_1_2_1 - 0.000698051948051974*G0_1_0_1_2_2 - 0.00337662337662349*G0_1_0_1_2_3 - 0.000681818181818206*G0_1_0_1_2_4 - 0.00113636363636368*G0_1_0_1_2_5 + 0.00538961038961057*G0_1_0_1_3_1 - 0.00337662337662349*G0_1_0_1_3_2 + 0.00467532467532484*G0_1_0_1_3_3 + 0.000649350649350671*G0_1_0_1_3_4 + 0.00233766233766242*G0_1_0_1_3_5 + 0.00155844155844161*G0_1_0_1_4_0 - 0.000292207792207803*G0_1_0_1_4_1 - 0.000681818181818206*G0_1_0_1_4_2 + 0.000649350649350671*G0_1_0_1_4_3 + 0.00233766233766242*G0_1_0_1_4_4 + 0.00285714285714296*G0_1_0_1_4_5 + 0.00396103896103911*G0_1_0_1_5_0 + 0.000454545454545468*G0_1_0_1_5_1 - 0.00113636363636368*G0_1_0_1_5_2 + 0.00233766233766242*G0_1_0_1_5_3 + 0.00285714285714296*G0_1_0_1_5_4 + 0.0140259740259745*G0_1_0_1_5_5 + 0.00230519480519489*G0_1_0_2_0_0 - 0.000292207792207804*G0_1_0_2_0_1 - 0.000771103896103924*G0_1_0_2_0_2 + 0.000162337662337668*G0_1_0_2_0_3 + 0.00175324675324682*G0_1_0_2_0_4 + 0.00246753246753256*G0_1_0_2_0_5 - 0.000292207792207804*G0_1_0_2_1_0 - 0.000511363636363653*G0_1_0_2_1_1 - 0.000698051948051974*G0_1_0_2_1_2 - 0.00337662337662349*G0_1_0_2_1_3 - 0.000681818181818206*G0_1_0_2_1_4 - 0.00113636363636368*G0_1_0_2_1_5 - 0.000771103896103924*G0_1_0_2_2_0 - 0.000698051948051974*G0_1_0_2_2_1 + 0.00611201298701322*G0_1_0_2_2_2 + 0.00633116883116906*G0_1_0_2_2_3 + 0.000649350649350676*G0_1_0_2_2_4 + 0.000162337662337669*G0_1_0_2_2_5 + 0.000162337662337668*G0_1_0_2_3_0 - 0.00337662337662349*G0_1_0_2_3_1 + 0.00633116883116906*G0_1_0_2_3_2 + 0.00506493506493525*G0_1_0_2_3_3 + 0.00103896103896108*G0_1_0_2_3_4 - 0.000649350649350669*G0_1_0_2_3_5 + 0.00175324675324682*G0_1_0_2_4_0 - 0.000681818181818206*G0_1_0_2_4_1 + 0.000649350649350676*G0_1_0_2_4_2 + 0.00103896103896108*G0_1_0_2_4_3 + 0.00155844155844162*G0_1_0_2_4_4 + 0.00103896103896108*G0_1_0_2_4_5 + 0.00246753246753256*G0_1_0_2_5_0 - 0.00113636363636368*G0_1_0_2_5_1 + 0.000162337662337669*G0_1_0_2_5_2 - 0.000649350649350669*G0_1_0_2_5_3 + 0.00103896103896108*G0_1_0_2_5_4 + 0.000259740259740273*G0_1_0_2_5_5 - 0.00103896103896108*G0_1_0_3_0_0 + 0.000162337662337668*G0_1_0_3_0_2 - 0.00376623376623387*G0_1_0_3_0_3 - 0.00103896103896107*G0_1_0_3_0_4 - 0.00285714285714295*G0_1_0_3_0_5 + 0.00538961038961057*G0_1_0_3_1_1 - 0.00337662337662349*G0_1_0_3_1_2 + 0.00467532467532484*G0_1_0_3_1_3 + 0.000649350649350671*G0_1_0_3_1_4 + 0.00233766233766242*G0_1_0_3_1_5 + 0.000162337662337668*G0_1_0_3_2_0 - 0.00337662337662349*G0_1_0_3_2_1 + 0.00633116883116906*G0_1_0_3_2_2 + 0.00506493506493525*G0_1_0_3_2_3 + 0.00103896103896108*G0_1_0_3_2_4 - 0.000649350649350669*G0_1_0_3_2_5 - 0.00376623376623387*G0_1_0_3_3_0 + 0.00467532467532483*G0_1_0_3_3_1 + 0.00506493506493526*G0_1_0_3_3_2 + 0.107532467532471*G0_1_0_3_3_3 + 0.00623376623376644*G0_1_0_3_3_4 + 0.00883116883116914*G0_1_0_3_3_5 - 0.00103896103896107*G0_1_0_3_4_0 + 0.000649350649350671*G0_1_0_3_4_1 + 0.00103896103896108*G0_1_0_3_4_2 + 0.00623376623376644*G0_1_0_3_4_3 - 0.00259740259740269*G0_1_0_3_4_4 - 0.00285714285714295*G0_1_0_3_5_0 + 0.00233766233766242*G0_1_0_3_5_1 - 0.000649350649350669*G0_1_0_3_5_2 + 0.00883116883116914*G0_1_0_3_5_3 + 0.00519480519480537*G0_1_0_3_5_5 - 0.00941558441558477*G0_1_0_4_0_0 + 0.00155844155844161*G0_1_0_4_0_1 + 0.00175324675324682*G0_1_0_4_0_2 - 0.00103896103896107*G0_1_0_4_0_3 - 0.00623376623376646*G0_1_0_4_0_4 - 0.00805194805194834*G0_1_0_4_0_5 + 0.00155844155844161*G0_1_0_4_1_0 - 0.000292207792207803*G0_1_0_4_1_1 - 0.000681818181818206*G0_1_0_4_1_2 + 0.000649350649350671*G0_1_0_4_1_3 + 0.00233766233766242*G0_1_0_4_1_4 + 0.00285714285714296*G0_1_0_4_1_5 + 0.00175324675324682*G0_1_0_4_2_0 - 0.000681818181818206*G0_1_0_4_2_1 + 0.000649350649350676*G0_1_0_4_2_2 + 0.00103896103896108*G0_1_0_4_2_3 + 0.00155844155844162*G0_1_0_4_2_4 + 0.00103896103896108*G0_1_0_4_2_5 - 0.00103896103896107*G0_1_0_4_3_0 + 0.000649350649350671*G0_1_0_4_3_1 + 0.00103896103896108*G0_1_0_4_3_2 + 0.00623376623376644*G0_1_0_4_3_3 - 0.00259740259740269*G0_1_0_4_3_4 - 0.00623376623376646*G0_1_0_4_4_0 + 0.00233766233766242*G0_1_0_4_4_1 + 0.00155844155844161*G0_1_0_4_4_2 - 0.00259740259740269*G0_1_0_4_4_3 - 0.0140259740259745*G0_1_0_4_4_4 - 0.00675324675324699*G0_1_0_4_4_5 - 0.00805194805194834*G0_1_0_4_5_0 + 0.00285714285714296*G0_1_0_4_5_1 + 0.00103896103896108*G0_1_0_4_5_2 - 0.00675324675324699*G0_1_0_4_5_4 - 0.00623376623376646*G0_1_0_4_5_5 - 0.0194805194805202*G0_1_0_5_0_0 + 0.00396103896103911*G0_1_0_5_0_1 + 0.00246753246753256*G0_1_0_5_0_2 - 0.00285714285714295*G0_1_0_5_0_3 - 0.00805194805194834*G0_1_0_5_0_4 - 0.0296103896103907*G0_1_0_5_0_5 + 0.00396103896103911*G0_1_0_5_1_0 + 0.000454545454545468*G0_1_0_5_1_1 - 0.00113636363636368*G0_1_0_5_1_2 + 0.00233766233766242*G0_1_0_5_1_3 + 0.00285714285714296*G0_1_0_5_1_4 + 0.0140259740259745*G0_1_0_5_1_5 + 0.00246753246753256*G0_1_0_5_2_0 - 0.00113636363636368*G0_1_0_5_2_1 + 0.000162337662337669*G0_1_0_5_2_2 - 0.000649350649350669*G0_1_0_5_2_3 + 0.00103896103896108*G0_1_0_5_2_4 + 0.000259740259740273*G0_1_0_5_2_5 - 0.00285714285714295*G0_1_0_5_3_0 + 0.00233766233766242*G0_1_0_5_3_1 - 0.000649350649350669*G0_1_0_5_3_2 + 0.00883116883116914*G0_1_0_5_3_3 + 0.00519480519480537*G0_1_0_5_3_5 - 0.00805194805194834*G0_1_0_5_4_0 + 0.00285714285714296*G0_1_0_5_4_1 + 0.00103896103896108*G0_1_0_5_4_2 - 0.00675324675324699*G0_1_0_5_4_4 - 0.00623376623376646*G0_1_0_5_4_5 - 0.0296103896103907*G0_1_0_5_5_0 + 0.0140259740259745*G0_1_0_5_5_1 + 0.000259740259740273*G0_1_0_5_5_2 + 0.00519480519480537*G0_1_0_5_5_3 - 0.00623376623376646*G0_1_0_5_5_4 - 0.00935064935064973*G0_1_0_5_5_5 - 0.0365503246753262*G0_1_1_0_0_0 + 0.00519480519480539*G0_1_1_0_0_1 + 0.00307629870129882*G0_1_1_0_0_2 - 0.00120129870129874*G0_1_1_0_0_3 - 0.0100649350649354*G0_1_1_0_0_4 - 0.0258116883116893*G0_1_1_0_0_5 + 0.00519480519480539*G0_1_1_0_1_0 - 0.000876623376623406*G0_1_1_0_1_1 + 0.00110389610389614*G0_1_1_0_1_3 + 0.00224025974025982*G0_1_1_0_1_4 + 0.0073376623376626*G0_1_1_0_1_5 + 0.00307629870129882*G0_1_1_0_2_0 - 0.00307629870129881*G0_1_1_0_2_2 - 0.00230519480519488*G0_1_1_0_2_3 + 0.00230519480519489*G0_1_1_0_2_5 - 0.00120129870129874*G0_1_1_0_3_0 + 0.00110389610389614*G0_1_1_0_3_1 - 0.00230519480519488*G0_1_1_0_3_2 - 0.00402597402597415*G0_1_1_0_3_3 - 0.00207792207792215*G0_1_1_0_3_4 - 0.00220779220779228*G0_1_1_0_3_5 - 0.0100649350649354*G0_1_1_0_4_0 + 0.00224025974025982*G0_1_1_0_4_1 - 0.00207792207792215*G0_1_1_0_4_3 - 0.00779220779220808*G0_1_1_0_4_4 - 0.00909090909090942*G0_1_1_0_4_5 - 0.0258116883116893*G0_1_1_0_5_0 + 0.0073376623376626*G0_1_1_0_5_1 + 0.00230519480519489*G0_1_1_0_5_2 - 0.00220779220779228*G0_1_1_0_5_3 - 0.00909090909090942*G0_1_1_0_5_4 - 0.034675324675326*G0_1_1_0_5_5 + 0.00519480519480539*G0_1_1_1_0_0 - 0.000876623376623406*G0_1_1_1_0_1 + 0.00110389610389614*G0_1_1_1_0_3 + 0.00224025974025982*G0_1_1_1_0_4 + 0.0073376623376626*G0_1_1_1_0_5 - 0.000876623376623406*G0_1_1_1_1_0 + 0.000876623376623411*G0_1_1_1_1_2 + 0.00493506493506509*G0_1_1_1_1_3 - 0.00493506493506512*G0_1_1_1_1_5 + 0.000876623376623411*G0_1_1_1_2_1 - 0.00519480519480538*G0_1_1_1_2_2 - 0.00733766233766259*G0_1_1_1_2_3 - 0.00224025974025982*G0_1_1_1_2_4 - 0.00110389610389614*G0_1_1_1_2_5 + 0.00110389610389614*G0_1_1_1_3_0 + 0.00493506493506509*G0_1_1_1_3_1 - 0.00733766233766259*G0_1_1_1_3_2 - 0.00935064935064968*G0_1_1_1_3_3 - 0.00220779220779228*G0_1_1_1_3_4 + 0.00224025974025982*G0_1_1_1_4_0 - 0.00224025974025982*G0_1_1_1_4_2 - 0.00220779220779228*G0_1_1_1_4_3 + 0.00220779220779229*G0_1_1_1_4_5 + 0.0073376623376626*G0_1_1_1_5_0 - 0.00493506493506512*G0_1_1_1_5_1 - 0.00110389610389614*G0_1_1_1_5_2 + 0.00220779220779229*G0_1_1_1_5_4 + 0.00935064935064969*G0_1_1_1_5_5 + 0.00307629870129882*G0_1_1_2_0_0 - 0.00307629870129881*G0_1_1_2_0_2 - 0.00230519480519488*G0_1_1_2_0_3 + 0.00230519480519489*G0_1_1_2_0_5 + 0.000876623376623411*G0_1_1_2_1_1 - 0.00519480519480538*G0_1_1_2_1_2 - 0.00733766233766259*G0_1_1_2_1_3 - 0.00224025974025982*G0_1_1_2_1_4 - 0.00110389610389614*G0_1_1_2_1_5 - 0.00307629870129881*G0_1_1_2_2_0 - 0.00519480519480538*G0_1_1_2_2_1 + 0.036550324675326*G0_1_1_2_2_2 + 0.0258116883116892*G0_1_1_2_2_3 + 0.0100649350649354*G0_1_1_2_2_4 + 0.00120129870129875*G0_1_1_2_2_5 - 0.00230519480519488*G0_1_1_2_3_0 - 0.00733766233766259*G0_1_1_2_3_1 + 0.0258116883116892*G0_1_1_2_3_2 + 0.0346753246753259*G0_1_1_2_3_3 + 0.00909090909090941*G0_1_1_2_3_4 + 0.00220779220779229*G0_1_1_2_3_5 - 0.00224025974025982*G0_1_1_2_4_1 + 0.0100649350649354*G0_1_1_2_4_2 + 0.00909090909090941*G0_1_1_2_4_3 + 0.00779220779220808*G0_1_1_2_4_4 + 0.00207792207792216*G0_1_1_2_4_5 + 0.00230519480519489*G0_1_1_2_5_0 - 0.00110389610389614*G0_1_1_2_5_1 + 0.00120129870129875*G0_1_1_2_5_2 + 0.00220779220779229*G0_1_1_2_5_3 + 0.00207792207792216*G0_1_1_2_5_4 + 0.00402597402597417*G0_1_1_2_5_5 - 0.00120129870129874*G0_1_1_3_0_0 + 0.00110389610389614*G0_1_1_3_0_1 - 0.00230519480519488*G0_1_1_3_0_2 - 0.00402597402597415*G0_1_1_3_0_3 - 0.00207792207792215*G0_1_1_3_0_4 - 0.00220779220779228*G0_1_1_3_0_5 + 0.00110389610389614*G0_1_1_3_1_0 + 0.00493506493506509*G0_1_1_3_1_1 - 0.00733766233766259*G0_1_1_3_1_2 - 0.00935064935064969*G0_1_1_3_1_3 - 0.00220779220779228*G0_1_1_3_1_4 - 0.00230519480519488*G0_1_1_3_2_0 - 0.00733766233766259*G0_1_1_3_2_1 + 0.0258116883116892*G0_1_1_3_2_2 + 0.0346753246753259*G0_1_1_3_2_3 + 0.00909090909090941*G0_1_1_3_2_4 + 0.00220779220779229*G0_1_1_3_2_5 - 0.00402597402597414*G0_1_1_3_3_0 - 0.00935064935064968*G0_1_1_3_3_1 + 0.0346753246753259*G0_1_1_3_3_2 + 0.116883116883121*G0_1_1_3_3_3 + 0.0124675324675329*G0_1_1_3_3_4 + 0.00363636363636378*G0_1_1_3_3_5 - 0.00207792207792215*G0_1_1_3_4_0 - 0.00220779220779228*G0_1_1_3_4_1 + 0.00909090909090941*G0_1_1_3_4_2 + 0.0124675324675329*G0_1_1_3_4_3 + 0.0041558441558443*G0_1_1_3_4_4 - 0.00220779220779228*G0_1_1_3_5_0 + 0.00220779220779229*G0_1_1_3_5_2 + 0.00363636363636378*G0_1_1_3_5_3 - 0.00363636363636376*G0_1_1_3_5_5 - 0.0100649350649354*G0_1_1_4_0_0 + 0.00224025974025982*G0_1_1_4_0_1 - 0.00207792207792215*G0_1_1_4_0_3 - 0.00779220779220808*G0_1_1_4_0_4 - 0.00909090909090942*G0_1_1_4_0_5 + 0.00224025974025982*G0_1_1_4_1_0 - 0.00224025974025982*G0_1_1_4_1_2 - 0.00220779220779228*G0_1_1_4_1_3 + 0.00220779220779229*G0_1_1_4_1_5 - 0.00224025974025982*G0_1_1_4_2_1 + 0.0100649350649354*G0_1_1_4_2_2 + 0.00909090909090941*G0_1_1_4_2_3 + 0.00779220779220807*G0_1_1_4_2_4 + 0.00207792207792216*G0_1_1_4_2_5 - 0.00207792207792215*G0_1_1_4_3_0 - 0.00220779220779228*G0_1_1_4_3_1 + 0.00909090909090941*G0_1_1_4_3_2 + 0.0124675324675329*G0_1_1_4_3_3 + 0.0041558441558443*G0_1_1_4_3_4 - 0.00779220779220808*G0_1_1_4_4_0 + 0.00779220779220807*G0_1_1_4_4_2 + 0.0041558441558443*G0_1_1_4_4_3 - 0.00415584415584431*G0_1_1_4_4_5 - 0.00909090909090942*G0_1_1_4_5_0 + 0.00220779220779229*G0_1_1_4_5_1 + 0.00207792207792216*G0_1_1_4_5_2 - 0.00415584415584431*G0_1_1_4_5_4 - 0.0124675324675329*G0_1_1_4_5_5 - 0.0258116883116893*G0_1_1_5_0_0 + 0.0073376623376626*G0_1_1_5_0_1 + 0.00230519480519489*G0_1_1_5_0_2 - 0.00220779220779228*G0_1_1_5_0_3 - 0.00909090909090942*G0_1_1_5_0_4 - 0.034675324675326*G0_1_1_5_0_5 + 0.0073376623376626*G0_1_1_5_1_0 - 0.00493506493506512*G0_1_1_5_1_1 - 0.00110389610389614*G0_1_1_5_1_2 + 0.00220779220779229*G0_1_1_5_1_4 + 0.00935064935064969*G0_1_1_5_1_5 + 0.00230519480519489*G0_1_1_5_2_0 - 0.00110389610389614*G0_1_1_5_2_1 + 0.00120129870129875*G0_1_1_5_2_2 + 0.00220779220779229*G0_1_1_5_2_3 + 0.00207792207792215*G0_1_1_5_2_4 + 0.00402597402597417*G0_1_1_5_2_5 - 0.00220779220779228*G0_1_1_5_3_0 + 0.00220779220779229*G0_1_1_5_3_2 + 0.00363636363636378*G0_1_1_5_3_3 - 0.00363636363636376*G0_1_1_5_3_5 - 0.00909090909090942*G0_1_1_5_4_0 + 0.00220779220779229*G0_1_1_5_4_1 + 0.00207792207792216*G0_1_1_5_4_2 - 0.0041558441558443*G0_1_1_5_4_4 - 0.0124675324675329*G0_1_1_5_4_5 - 0.034675324675326*G0_1_1_5_5_0 + 0.00935064935064968*G0_1_1_5_5_1 + 0.00402597402597417*G0_1_1_5_5_2 - 0.00363636363636376*G0_1_1_5_5_3 - 0.0124675324675329*G0_1_1_5_5_4 - 0.116883116883121*G0_1_1_5_5_5; + A[61] = -A[51] - 0.00429383116883131*G0_0_0_0_0_0 + 0.000262445887445896*G0_0_0_0_0_1 + 0.000324675324675336*G0_0_0_0_0_2 + 0.000167748917748923*G0_0_0_0_0_3 - 0.00461580086580102*G0_0_0_0_0_4 - 0.000416666666666682*G0_0_0_0_0_5 + 0.000262445887445897*G0_0_0_0_1_0 - 0.000679112554112577*G0_0_0_0_1_1 - 0.000183982683982691*G0_0_0_0_1_3 + 0.000286796536796547*G0_0_0_0_1_4 - 0.000194805194805203*G0_0_0_0_1_5 + 0.000324675324675336*G0_0_0_0_2_0 + 0.00153950216450222*G0_0_0_0_2_2 + 0.00063852813852816*G0_0_0_0_2_3 + 0.00360389610389623*G0_0_0_0_2_4 + 0.000438311688311703*G0_0_0_0_2_5 + 0.000167748917748923*G0_0_0_0_3_0 - 0.000183982683982691*G0_0_0_0_3_1 + 0.00063852813852816*G0_0_0_0_3_2 - 0.00225108225108232*G0_0_0_0_3_3 - 0.000909090909090936*G0_0_0_0_3_4 - 0.00121212121212125*G0_0_0_0_3_5 - 0.00461580086580102*G0_0_0_0_4_0 + 0.000286796536796547*G0_0_0_0_4_1 + 0.00360389610389623*G0_0_0_0_4_2 - 0.000909090909090936*G0_0_0_0_4_3 - 0.00298701298701309*G0_0_0_0_4_4 - 0.0014502164502165*G0_0_0_0_4_5 - 0.000416666666666682*G0_0_0_0_5_0 - 0.000194805194805203*G0_0_0_0_5_1 + 0.000438311688311703*G0_0_0_0_5_2 - 0.00121212121212125*G0_0_0_0_5_3 - 0.0014502164502165*G0_0_0_0_5_4 - 0.000735930735930759*G0_0_0_0_5_5 + 0.000262445887445897*G0_0_0_1_0_0 - 0.000679112554112577*G0_0_0_1_0_1 - 0.000183982683982691*G0_0_0_1_0_3 + 0.000286796536796547*G0_0_0_1_0_4 - 0.000194805194805203*G0_0_0_1_0_5 - 0.000679112554112577*G0_0_0_1_1_0 + 0.00868506493506521*G0_0_0_1_1_1 - 0.00127435064935069*G0_0_0_1_1_2 + 0.00595238095238116*G0_0_0_1_1_3 + 0.000573593073593093*G0_0_0_1_1_4 + 0.00281385281385292*G0_0_0_1_1_5 - 0.00127435064935069*G0_0_0_1_2_1 + 0.000882034632034664*G0_0_0_1_2_2 - 0.00103896103896108*G0_0_0_1_2_3 + 0.000573593073593093*G0_0_0_1_2_4 - 0.000183982683982691*G0_0_0_1_3_0 + 0.00595238095238116*G0_0_0_1_3_1 - 0.00103896103896108*G0_0_0_1_3_2 + 0.00441558441558457*G0_0_0_1_3_3 - 0.000779220779220803*G0_0_0_1_3_4 + 0.000562770562770591*G0_0_0_1_3_5 + 0.000286796536796547*G0_0_0_1_4_0 + 0.000573593073593093*G0_0_0_1_4_1 + 0.000573593073593093*G0_0_0_1_4_2 - 0.000779220779220803*G0_0_0_1_4_3 + 0.00190476190476196*G0_0_0_1_4_4 - 0.000952380952380983*G0_0_0_1_4_5 - 0.000194805194805203*G0_0_0_1_5_0 + 0.00281385281385292*G0_0_0_1_5_1 + 0.000562770562770591*G0_0_0_1_5_3 - 0.000952380952380983*G0_0_0_1_5_4 - 0.000346320346320349*G0_0_0_1_5_5 + 0.000324675324675336*G0_0_0_2_0_0 + 0.00153950216450222*G0_0_0_2_0_2 + 0.00063852813852816*G0_0_0_2_0_3 + 0.00360389610389623*G0_0_0_2_0_4 + 0.000438311688311703*G0_0_0_2_0_5 - 0.00127435064935069*G0_0_0_2_1_1 + 0.000882034632034664*G0_0_0_2_1_2 - 0.00103896103896108*G0_0_0_2_1_3 + 0.000573593073593093*G0_0_0_2_1_4 + 0.00153950216450222*G0_0_0_2_2_0 + 0.000882034632034663*G0_0_0_2_2_1 - 0.0168831168831175*G0_0_0_2_2_2 - 0.00185064935064942*G0_0_0_2_2_3 - 0.00918831168831202*G0_0_0_2_2_4 + 0.00063852813852816*G0_0_0_2_3_0 - 0.00103896103896108*G0_0_0_2_3_1 - 0.00185064935064942*G0_0_0_2_3_2 - 0.0025108225108226*G0_0_0_2_3_3 - 0.00242424242424251*G0_0_0_2_3_4 - 0.00138528138528143*G0_0_0_2_3_5 + 0.00360389610389623*G0_0_0_2_4_0 + 0.000573593073593093*G0_0_0_2_4_1 - 0.00918831168831202*G0_0_0_2_4_2 - 0.00242424242424251*G0_0_0_2_4_3 - 0.00952380952380985*G0_0_0_2_4_4 - 0.0012554112554113*G0_0_0_2_4_5 + 0.000438311688311703*G0_0_0_2_5_0 - 0.00138528138528143*G0_0_0_2_5_3 - 0.0012554112554113*G0_0_0_2_5_4 - 0.00186147186147192*G0_0_0_2_5_5 + 0.000167748917748923*G0_0_0_3_0_0 - 0.000183982683982691*G0_0_0_3_0_1 + 0.00063852813852816*G0_0_0_3_0_2 - 0.00225108225108232*G0_0_0_3_0_3 - 0.000909090909090936*G0_0_0_3_0_4 - 0.00121212121212125*G0_0_0_3_0_5 - 0.000183982683982691*G0_0_0_3_1_0 + 0.00595238095238116*G0_0_0_3_1_1 - 0.00103896103896108*G0_0_0_3_1_2 + 0.00441558441558457*G0_0_0_3_1_3 - 0.000779220779220803*G0_0_0_3_1_4 + 0.000562770562770591*G0_0_0_3_1_5 + 0.00063852813852816*G0_0_0_3_2_0 - 0.00103896103896108*G0_0_0_3_2_1 - 0.00185064935064942*G0_0_0_3_2_2 - 0.0025108225108226*G0_0_0_3_2_3 - 0.00242424242424251*G0_0_0_3_2_4 - 0.00138528138528143*G0_0_0_3_2_5 - 0.00225108225108232*G0_0_0_3_3_0 + 0.00441558441558457*G0_0_0_3_3_1 - 0.0025108225108226*G0_0_0_3_3_2 + 0.021298701298702*G0_0_0_3_3_3 + 0.00606060606060626*G0_0_0_3_3_4 + 0.00727272727272752*G0_0_0_3_3_5 - 0.000909090909090936*G0_0_0_3_4_0 - 0.000779220779220803*G0_0_0_3_4_1 - 0.00242424242424251*G0_0_0_3_4_2 + 0.00606060606060626*G0_0_0_3_4_3 - 0.00199134199134205*G0_0_0_3_4_4 + 0.00432900432900447*G0_0_0_3_4_5 - 0.00121212121212125*G0_0_0_3_5_0 + 0.000562770562770591*G0_0_0_3_5_1 - 0.00138528138528143*G0_0_0_3_5_2 + 0.00727272727272752*G0_0_0_3_5_3 + 0.00432900432900447*G0_0_0_3_5_4 + 0.00614718614718636*G0_0_0_3_5_5 - 0.00461580086580102*G0_0_0_4_0_0 + 0.000286796536796547*G0_0_0_4_0_1 + 0.00360389610389623*G0_0_0_4_0_2 - 0.000909090909090936*G0_0_0_4_0_3 - 0.00298701298701309*G0_0_0_4_0_4 - 0.0014502164502165*G0_0_0_4_0_5 + 0.000286796536796547*G0_0_0_4_1_0 + 0.000573593073593093*G0_0_0_4_1_1 + 0.000573593073593093*G0_0_0_4_1_2 - 0.000779220779220803*G0_0_0_4_1_3 + 0.00190476190476196*G0_0_0_4_1_4 - 0.000952380952380983*G0_0_0_4_1_5 + 0.00360389610389623*G0_0_0_4_2_0 + 0.000573593073593093*G0_0_0_4_2_1 - 0.00918831168831202*G0_0_0_4_2_2 - 0.00242424242424251*G0_0_0_4_2_3 - 0.00952380952380986*G0_0_0_4_2_4 - 0.0012554112554113*G0_0_0_4_2_5 - 0.000909090909090936*G0_0_0_4_3_0 - 0.000779220779220803*G0_0_0_4_3_1 - 0.00242424242424251*G0_0_0_4_3_2 + 0.00606060606060626*G0_0_0_4_3_3 - 0.00199134199134205*G0_0_0_4_3_4 + 0.00432900432900447*G0_0_0_4_3_5 - 0.00298701298701309*G0_0_0_4_4_0 + 0.00190476190476196*G0_0_0_4_4_1 - 0.00952380952380986*G0_0_0_4_4_2 - 0.00199134199134205*G0_0_0_4_4_3 - 0.0932467532467563*G0_0_0_4_4_4 - 0.00129870129870134*G0_0_0_4_4_5 - 0.0014502164502165*G0_0_0_4_5_0 - 0.000952380952380983*G0_0_0_4_5_1 - 0.0012554112554113*G0_0_0_4_5_2 + 0.00432900432900447*G0_0_0_4_5_3 - 0.00129870129870134*G0_0_0_4_5_4 + 0.00562770562770581*G0_0_0_4_5_5 - 0.000416666666666681*G0_0_0_5_0_0 - 0.000194805194805203*G0_0_0_5_0_1 + 0.000438311688311703*G0_0_0_5_0_2 - 0.00121212121212125*G0_0_0_5_0_3 - 0.0014502164502165*G0_0_0_5_0_4 - 0.00073593073593076*G0_0_0_5_0_5 - 0.000194805194805203*G0_0_0_5_1_0 + 0.00281385281385292*G0_0_0_5_1_1 + 0.000562770562770591*G0_0_0_5_1_3 - 0.000952380952380983*G0_0_0_5_1_4 - 0.000346320346320349*G0_0_0_5_1_5 + 0.000438311688311703*G0_0_0_5_2_0 - 0.00138528138528143*G0_0_0_5_2_3 - 0.0012554112554113*G0_0_0_5_2_4 - 0.00186147186147192*G0_0_0_5_2_5 - 0.00121212121212125*G0_0_0_5_3_0 + 0.000562770562770591*G0_0_0_5_3_1 - 0.00138528138528143*G0_0_0_5_3_2 + 0.00727272727272752*G0_0_0_5_3_3 + 0.00432900432900447*G0_0_0_5_3_4 + 0.00614718614718636*G0_0_0_5_3_5 - 0.0014502164502165*G0_0_0_5_4_0 - 0.000952380952380983*G0_0_0_5_4_1 - 0.0012554112554113*G0_0_0_5_4_2 + 0.00432900432900447*G0_0_0_5_4_3 - 0.00129870129870134*G0_0_0_5_4_4 + 0.00562770562770581*G0_0_0_5_4_5 - 0.00073593073593076*G0_0_0_5_5_0 - 0.000346320346320349*G0_0_0_5_5_1 - 0.00186147186147192*G0_0_0_5_5_2 + 0.00614718614718636*G0_0_0_5_5_3 + 0.00562770562770581*G0_0_0_5_5_4 + 0.0111688311688316*G0_0_0_5_5_5 + 0.0125892857142861*G0_1_0_0_0_0 - 0.000619588744588764*G0_1_0_0_0_1 - 0.00121482683982688*G0_1_0_0_0_2 + 0.000113636363636366*G0_1_0_0_0_3 + 0.00457251082251097*G0_1_0_0_0_4 + 0.00143398268398273*G0_1_0_0_0_5 - 0.000619588744588764*G0_1_0_0_1_0 + 0.000595238095238116*G0_1_0_0_1_1 - 0.000286796536796547*G0_1_0_0_1_4 + 0.000844155844155872*G0_1_0_0_1_5 - 0.00121482683982688*G0_1_0_0_2_0 + 0.00121482683982688*G0_1_0_0_2_2 + 0.000200216450216458*G0_1_0_0_2_3 - 0.000200216450216457*G0_1_0_0_2_5 + 0.000113636363636366*G0_1_0_0_3_0 + 0.000200216450216458*G0_1_0_0_3_2 - 0.000389610389610402*G0_1_0_0_3_3 + 0.000346320346320358*G0_1_0_0_3_4 + 0.000173160173160179*G0_1_0_0_3_5 + 0.00457251082251097*G0_1_0_0_4_0 - 0.000286796536796547*G0_1_0_0_4_1 + 0.000346320346320358*G0_1_0_0_4_3 + 0.00653679653679675*G0_1_0_0_4_4 + 0.000974025974026008*G0_1_0_0_4_5 + 0.00143398268398273*G0_1_0_0_5_0 + 0.000844155844155872*G0_1_0_0_5_1 - 0.000200216450216457*G0_1_0_0_5_2 + 0.000173160173160179*G0_1_0_0_5_3 + 0.000974025974026008*G0_1_0_0_5_4 + 0.00177489177489183*G0_1_0_0_5_5 - 0.000619588744588764*G0_1_0_1_0_0 + 0.000595238095238116*G0_1_0_1_0_1 - 0.000286796536796547*G0_1_0_1_0_4 + 0.000844155844155872*G0_1_0_1_0_5 + 0.000595238095238116*G0_1_0_1_1_0 - 0.000595238095238115*G0_1_0_1_1_2 + 0.00313852813852824*G0_1_0_1_1_3 - 0.00313852813852825*G0_1_0_1_1_5 - 0.000595238095238115*G0_1_0_1_2_1 + 0.000619588744588767*G0_1_0_1_2_2 - 0.000844155844155873*G0_1_0_1_2_3 + 0.000286796536796547*G0_1_0_1_2_4 + 0.00313852813852824*G0_1_0_1_3_1 - 0.000844155844155873*G0_1_0_1_3_2 + 0.00476190476190493*G0_1_0_1_3_3 + 0.000173160173160181*G0_1_0_1_3_4 - 0.000286796536796547*G0_1_0_1_4_0 + 0.000286796536796547*G0_1_0_1_4_2 + 0.000173160173160181*G0_1_0_1_4_3 - 0.000173160173160177*G0_1_0_1_4_5 + 0.000844155844155871*G0_1_0_1_5_0 - 0.00313852813852825*G0_1_0_1_5_1 - 0.000173160173160177*G0_1_0_1_5_4 - 0.00476190476190492*G0_1_0_1_5_5 - 0.00121482683982688*G0_1_0_2_0_0 + 0.00121482683982688*G0_1_0_2_0_2 + 0.000200216450216458*G0_1_0_2_0_3 - 0.000200216450216457*G0_1_0_2_0_5 - 0.000595238095238115*G0_1_0_2_1_1 + 0.000619588744588767*G0_1_0_2_1_2 - 0.000844155844155873*G0_1_0_2_1_3 + 0.000286796536796547*G0_1_0_2_1_4 + 0.00121482683982688*G0_1_0_2_2_0 + 0.000619588744588767*G0_1_0_2_2_1 - 0.0125892857142862*G0_1_0_2_2_2 - 0.00143398268398274*G0_1_0_2_2_3 - 0.00457251082251099*G0_1_0_2_2_4 - 0.00011363636363637*G0_1_0_2_2_5 + 0.000200216450216458*G0_1_0_2_3_0 - 0.000844155844155873*G0_1_0_2_3_1 - 0.00143398268398274*G0_1_0_2_3_2 - 0.00177489177489184*G0_1_0_2_3_3 - 0.00097402597402601*G0_1_0_2_3_4 - 0.00017316017316018*G0_1_0_2_3_5 + 0.000286796536796547*G0_1_0_2_4_1 - 0.00457251082251099*G0_1_0_2_4_2 - 0.00097402597402601*G0_1_0_2_4_3 - 0.00653679653679676*G0_1_0_2_4_4 - 0.000346320346320359*G0_1_0_2_4_5 - 0.000200216450216457*G0_1_0_2_5_0 - 0.00011363636363637*G0_1_0_2_5_2 - 0.00017316017316018*G0_1_0_2_5_3 - 0.000346320346320359*G0_1_0_2_5_4 + 0.000389610389610404*G0_1_0_2_5_5 + 0.000113636363636365*G0_1_0_3_0_0 + 0.000200216450216458*G0_1_0_3_0_2 - 0.000389610389610402*G0_1_0_3_0_3 + 0.000346320346320358*G0_1_0_3_0_4 + 0.000173160173160179*G0_1_0_3_0_5 + 0.00313852813852824*G0_1_0_3_1_1 - 0.000844155844155873*G0_1_0_3_1_2 + 0.00476190476190493*G0_1_0_3_1_3 + 0.000173160173160181*G0_1_0_3_1_4 + 0.000200216450216458*G0_1_0_3_2_0 - 0.000844155844155873*G0_1_0_3_2_1 - 0.00143398268398274*G0_1_0_3_2_2 - 0.00177489177489184*G0_1_0_3_2_3 - 0.000974025974026009*G0_1_0_3_2_4 - 0.00017316017316018*G0_1_0_3_2_5 - 0.000389610389610401*G0_1_0_3_3_0 + 0.00476190476190493*G0_1_0_3_3_1 - 0.00177489177489184*G0_1_0_3_3_2 + 0.0101298701298705*G0_1_0_3_3_3 + 0.000432900432900444*G0_1_0_3_3_4 + 0.00112554112554117*G0_1_0_3_3_5 + 0.000346320346320358*G0_1_0_3_4_0 + 0.000173160173160181*G0_1_0_3_4_1 - 0.000974025974026009*G0_1_0_3_4_2 + 0.000432900432900444*G0_1_0_3_4_3 - 0.000692640692640722*G0_1_0_3_4_4 + 0.000173160173160179*G0_1_0_3_5_0 - 0.00017316017316018*G0_1_0_3_5_2 + 0.00112554112554117*G0_1_0_3_5_3 - 0.00112554112554116*G0_1_0_3_5_5 + 0.00457251082251097*G0_1_0_4_0_0 - 0.000286796536796547*G0_1_0_4_0_1 + 0.000346320346320358*G0_1_0_4_0_3 + 0.00653679653679675*G0_1_0_4_0_4 + 0.000974025974026008*G0_1_0_4_0_5 - 0.000286796536796547*G0_1_0_4_1_0 + 0.000286796536796547*G0_1_0_4_1_2 + 0.000173160173160181*G0_1_0_4_1_3 - 0.000173160173160177*G0_1_0_4_1_5 + 0.000286796536796547*G0_1_0_4_2_1 - 0.00457251082251099*G0_1_0_4_2_2 - 0.000974025974026009*G0_1_0_4_2_3 - 0.00653679653679676*G0_1_0_4_2_4 - 0.000346320346320359*G0_1_0_4_2_5 + 0.000346320346320358*G0_1_0_4_3_0 + 0.000173160173160181*G0_1_0_4_3_1 - 0.000974025974026009*G0_1_0_4_3_2 + 0.000432900432900444*G0_1_0_4_3_3 - 0.000692640692640722*G0_1_0_4_3_4 + 0.00653679653679675*G0_1_0_4_4_0 - 0.00653679653679676*G0_1_0_4_4_2 - 0.000692640692640722*G0_1_0_4_4_3 + 0.00069264069264071*G0_1_0_4_4_5 + 0.000974025974026008*G0_1_0_4_5_0 - 0.000173160173160177*G0_1_0_4_5_1 - 0.000346320346320359*G0_1_0_4_5_2 + 0.00069264069264071*G0_1_0_4_5_4 - 0.00043290043290045*G0_1_0_4_5_5 + 0.00143398268398273*G0_1_0_5_0_0 + 0.000844155844155871*G0_1_0_5_0_1 - 0.000200216450216457*G0_1_0_5_0_2 + 0.000173160173160179*G0_1_0_5_0_3 + 0.000974025974026008*G0_1_0_5_0_4 + 0.00177489177489183*G0_1_0_5_0_5 + 0.000844155844155871*G0_1_0_5_1_0 - 0.00313852813852825*G0_1_0_5_1_1 - 0.000173160173160177*G0_1_0_5_1_4 - 0.00476190476190492*G0_1_0_5_1_5 - 0.000200216450216457*G0_1_0_5_2_0 - 0.00011363636363637*G0_1_0_5_2_2 - 0.00017316017316018*G0_1_0_5_2_3 - 0.000346320346320359*G0_1_0_5_2_4 + 0.000389610389610404*G0_1_0_5_2_5 + 0.000173160173160179*G0_1_0_5_3_0 - 0.00017316017316018*G0_1_0_5_3_2 + 0.00112554112554117*G0_1_0_5_3_3 - 0.00112554112554116*G0_1_0_5_3_5 + 0.000974025974026008*G0_1_0_5_4_0 - 0.000173160173160177*G0_1_0_5_4_1 - 0.000346320346320359*G0_1_0_5_4_2 + 0.00069264069264071*G0_1_0_5_4_4 - 0.00043290043290045*G0_1_0_5_4_5 + 0.00177489177489183*G0_1_0_5_5_0 - 0.00476190476190492*G0_1_0_5_5_1 + 0.000389610389610404*G0_1_0_5_5_2 - 0.00112554112554116*G0_1_0_5_5_3 - 0.00043290043290045*G0_1_0_5_5_4 - 0.0101298701298705*G0_1_0_5_5_5; + A[41] = -A[61] - 0.00748376623376649*G0_1_0_0_0_0 - 0.000533008658008677*G0_1_0_0_0_1 + 0.000162337662337667*G0_1_0_0_0_2 - 0.000854978354978379*G0_1_0_0_0_3 - 0.000670995670995693*G0_1_0_0_0_4 - 0.00160173160173165*G0_1_0_0_0_5 - 0.000533008658008677*G0_1_0_0_1_0 + 0.00531114718614737*G0_1_0_0_1_1 - 0.000201569264069271*G0_1_0_0_1_2 - 0.000508658008658026*G0_1_0_0_1_4 + 0.00305194805194815*G0_1_0_0_1_5 + 0.000162337662337667*G0_1_0_0_2_0 - 0.000201569264069271*G0_1_0_0_2_1 + 0.00119047619047623*G0_1_0_0_2_2 - 0.000487012987012999*G0_1_0_0_2_4 - 0.000681818181818204*G0_1_0_0_2_5 - 0.000854978354978379*G0_1_0_0_3_0 + 0.00385281385281397*G0_1_0_0_3_3 + 0.00272727272727281*G0_1_0_0_3_4 + 0.00307359307359317*G0_1_0_0_3_5 - 0.000670995670995693*G0_1_0_0_4_0 - 0.000508658008658026*G0_1_0_0_4_1 - 0.000487012987012999*G0_1_0_0_4_2 + 0.00272727272727281*G0_1_0_0_4_3 + 0.00441558441558456*G0_1_0_0_4_4 + 0.00238095238095246*G0_1_0_0_4_5 - 0.00160173160173165*G0_1_0_0_5_0 + 0.00305194805194815*G0_1_0_0_5_1 - 0.000681818181818204*G0_1_0_0_5_2 + 0.00307359307359317*G0_1_0_0_5_3 + 0.00238095238095246*G0_1_0_0_5_4 + 0.0105627705627709*G0_1_0_0_5_5 - 0.000533008658008677*G0_1_0_1_0_0 + 0.00531114718614737*G0_1_0_1_0_1 - 0.000201569264069271*G0_1_0_1_0_2 - 0.000508658008658026*G0_1_0_1_0_4 + 0.00305194805194815*G0_1_0_1_0_5 + 0.00531114718614737*G0_1_0_1_1_0 - 0.0668019480519504*G0_1_0_1_1_1 + 0.00252435064935074*G0_1_0_1_1_2 - 0.010119047619048*G0_1_0_1_1_3 - 0.00134199134199138*G0_1_0_1_1_4 - 0.0233225108225117*G0_1_0_1_1_5 - 0.000201569264069271*G0_1_0_1_2_0 + 0.00252435064935074*G0_1_0_1_2_1 + 0.000703463203463229*G0_1_0_1_2_2 + 0.00097402597402601*G0_1_0_1_2_5 - 0.010119047619048*G0_1_0_1_3_1 + 0.00753246753246781*G0_1_0_1_3_3 + 0.00272727272727282*G0_1_0_1_3_4 - 0.00190476190476198*G0_1_0_1_3_5 - 0.000508658008658026*G0_1_0_1_4_0 - 0.00134199134199138*G0_1_0_1_4_1 + 0.00272727272727282*G0_1_0_1_4_3 + 0.000735930735930763*G0_1_0_1_4_4 + 0.000735930735930762*G0_1_0_1_4_5 + 0.00305194805194815*G0_1_0_1_5_0 - 0.0233225108225117*G0_1_0_1_5_1 + 0.00097402597402601*G0_1_0_1_5_2 - 0.00190476190476198*G0_1_0_1_5_3 + 0.000735930735930762*G0_1_0_1_5_4 - 0.0206060606060613*G0_1_0_1_5_5 + 0.000162337662337667*G0_1_0_2_0_0 - 0.000201569264069271*G0_1_0_2_0_1 + 0.00119047619047623*G0_1_0_2_0_2 - 0.000487012987012999*G0_1_0_2_0_4 - 0.000681818181818204*G0_1_0_2_0_5 - 0.000201569264069271*G0_1_0_2_1_0 + 0.00252435064935073*G0_1_0_2_1_1 + 0.000703463203463229*G0_1_0_2_1_2 + 0.00097402597402601*G0_1_0_2_1_5 + 0.00119047619047623*G0_1_0_2_2_0 + 0.000703463203463229*G0_1_0_2_2_1 - 0.0183441558441565*G0_1_0_2_2_2 - 0.0028409090909092*G0_1_0_2_2_3 - 0.00430194805194822*G0_1_0_2_2_4 - 0.000514069264069284*G0_1_0_2_2_5 - 0.0028409090909092*G0_1_0_2_3_2 - 0.00367965367965383*G0_1_0_2_3_3 + 0.000108225108225104*G0_1_0_2_3_4 + 0.00108225108225111*G0_1_0_2_3_5 - 0.000487012987012999*G0_1_0_2_4_0 - 0.00430194805194822*G0_1_0_2_4_2 + 0.000108225108225104*G0_1_0_2_4_3 - 0.0017316017316018*G0_1_0_2_4_4 + 0.00108225108225111*G0_1_0_2_4_5 - 0.000681818181818204*G0_1_0_2_5_0 + 0.00097402597402601*G0_1_0_2_5_1 - 0.000514069264069284*G0_1_0_2_5_2 + 0.00108225108225111*G0_1_0_2_5_3 + 0.00108225108225111*G0_1_0_2_5_4 + 0.00216450216450223*G0_1_0_2_5_5 - 0.000854978354978378*G0_1_0_3_0_0 + 0.00385281385281397*G0_1_0_3_0_3 + 0.00272727272727281*G0_1_0_3_0_4 + 0.00307359307359317*G0_1_0_3_0_5 - 0.010119047619048*G0_1_0_3_1_1 + 0.00753246753246781*G0_1_0_3_1_3 + 0.00272727272727282*G0_1_0_3_1_4 - 0.00190476190476198*G0_1_0_3_1_5 - 0.0028409090909092*G0_1_0_3_2_2 - 0.00367965367965383*G0_1_0_3_2_3 + 0.000108225108225104*G0_1_0_3_2_4 + 0.00108225108225111*G0_1_0_3_2_5 + 0.00385281385281397*G0_1_0_3_3_0 + 0.00753246753246781*G0_1_0_3_3_1 - 0.00367965367965383*G0_1_0_3_3_2 - 0.0161038961038965*G0_1_0_3_3_3 - 0.0131601731601736*G0_1_0_3_3_4 - 0.00987012987013017*G0_1_0_3_3_5 + 0.00272727272727281*G0_1_0_3_4_0 + 0.00272727272727282*G0_1_0_3_4_1 + 0.000108225108225104*G0_1_0_3_4_2 - 0.0131601731601736*G0_1_0_3_4_3 - 0.00692640692640715*G0_1_0_3_4_4 - 0.00761904761904786*G0_1_0_3_4_5 + 0.00307359307359317*G0_1_0_3_5_0 - 0.00190476190476198*G0_1_0_3_5_1 + 0.00108225108225111*G0_1_0_3_5_2 - 0.00987012987013017*G0_1_0_3_5_3 - 0.00761904761904786*G0_1_0_3_5_4 - 0.0104761904761908*G0_1_0_3_5_5 - 0.000670995670995693*G0_1_0_4_0_0 - 0.000508658008658026*G0_1_0_4_0_1 - 0.000487012987012999*G0_1_0_4_0_2 + 0.00272727272727281*G0_1_0_4_0_3 + 0.00441558441558456*G0_1_0_4_0_4 + 0.00238095238095246*G0_1_0_4_0_5 - 0.000508658008658026*G0_1_0_4_1_0 - 0.00134199134199138*G0_1_0_4_1_1 + 0.00272727272727282*G0_1_0_4_1_3 + 0.000735930735930763*G0_1_0_4_1_4 + 0.000735930735930762*G0_1_0_4_1_5 - 0.000487012987012999*G0_1_0_4_2_0 - 0.00430194805194822*G0_1_0_4_2_2 + 0.000108225108225104*G0_1_0_4_2_3 - 0.0017316017316018*G0_1_0_4_2_4 + 0.00108225108225111*G0_1_0_4_2_5 + 0.00272727272727281*G0_1_0_4_3_0 + 0.00272727272727282*G0_1_0_4_3_1 + 0.000108225108225104*G0_1_0_4_3_2 - 0.0131601731601736*G0_1_0_4_3_3 - 0.00692640692640715*G0_1_0_4_3_4 - 0.00761904761904786*G0_1_0_4_3_5 + 0.00441558441558456*G0_1_0_4_4_0 + 0.000735930735930763*G0_1_0_4_4_1 - 0.0017316017316018*G0_1_0_4_4_2 - 0.00692640692640715*G0_1_0_4_4_3 + 0.0400000000000012*G0_1_0_4_4_4 - 0.00363636363636375*G0_1_0_4_4_5 + 0.00238095238095246*G0_1_0_4_5_0 + 0.000735930735930762*G0_1_0_4_5_1 + 0.00108225108225111*G0_1_0_4_5_2 - 0.00761904761904786*G0_1_0_4_5_3 - 0.00363636363636375*G0_1_0_4_5_4 - 0.00580086580086598*G0_1_0_4_5_5 - 0.00160173160173165*G0_1_0_5_0_0 + 0.00305194805194815*G0_1_0_5_0_1 - 0.000681818181818204*G0_1_0_5_0_2 + 0.00307359307359317*G0_1_0_5_0_3 + 0.00238095238095246*G0_1_0_5_0_4 + 0.0105627705627709*G0_1_0_5_0_5 + 0.00305194805194815*G0_1_0_5_1_0 - 0.0233225108225117*G0_1_0_5_1_1 + 0.00097402597402601*G0_1_0_5_1_2 - 0.00190476190476198*G0_1_0_5_1_3 + 0.000735930735930762*G0_1_0_5_1_4 - 0.0206060606060613*G0_1_0_5_1_5 - 0.000681818181818204*G0_1_0_5_2_0 + 0.00097402597402601*G0_1_0_5_2_1 - 0.000514069264069284*G0_1_0_5_2_2 + 0.00108225108225111*G0_1_0_5_2_3 + 0.00108225108225111*G0_1_0_5_2_4 + 0.00216450216450223*G0_1_0_5_2_5 + 0.00307359307359317*G0_1_0_5_3_0 - 0.00190476190476198*G0_1_0_5_3_1 + 0.00108225108225111*G0_1_0_5_3_2 - 0.00987012987013017*G0_1_0_5_3_3 - 0.00761904761904786*G0_1_0_5_3_4 - 0.0104761904761908*G0_1_0_5_3_5 + 0.00238095238095246*G0_1_0_5_4_0 + 0.000735930735930762*G0_1_0_5_4_1 + 0.00108225108225111*G0_1_0_5_4_2 - 0.00761904761904786*G0_1_0_5_4_3 - 0.00363636363636375*G0_1_0_5_4_4 - 0.00580086580086598*G0_1_0_5_4_5 + 0.0105627705627709*G0_1_0_5_5_0 - 0.0206060606060613*G0_1_0_5_5_1 + 0.00216450216450223*G0_1_0_5_5_2 - 0.0104761904761908*G0_1_0_5_5_3 - 0.00580086580086598*G0_1_0_5_5_4 - 0.0215584415584422*G0_1_0_5_5_5; + A[40] = -A[41] + 0.00354301948051965*G0_0_0_0_0_0 - 0.000450487012987032*G0_0_0_0_0_1 + 0.00277597402597413*G0_0_0_0_0_4 + 0.00136363636363643*G0_0_0_0_0_5 - 0.000450487012987032*G0_0_0_0_1_0 + 0.000450487012987032*G0_0_0_0_1_1 - 0.00109577922077926*G0_0_0_0_2_2 - 0.00253246753246762*G0_0_0_0_2_4 - 0.000438311688311705*G0_0_0_0_2_5 + 0.00253246753246761*G0_0_0_0_3_3 - 0.000194805194805202*G0_0_0_0_3_4 + 0.000779220779220806*G0_0_0_0_3_5 + 0.00277597402597413*G0_0_0_0_4_0 - 0.00253246753246762*G0_0_0_0_4_2 - 0.000194805194805202*G0_0_0_0_4_3 - 0.00409090909090922*G0_0_0_0_4_4 + 0.000779220779220809*G0_0_0_0_4_5 + 0.00136363636363643*G0_0_0_0_5_0 - 0.000438311688311705*G0_0_0_0_5_2 + 0.000779220779220806*G0_0_0_0_5_3 + 0.000779220779220809*G0_0_0_0_5_4 + 0.00233766233766244*G0_0_0_0_5_5 - 0.000450487012987032*G0_0_0_1_0_0 + 0.000450487012987032*G0_0_0_1_0_1 + 0.000450487012987032*G0_0_0_1_1_0 - 0.00354301948051964*G0_0_0_1_1_1 - 0.00277597402597413*G0_0_0_1_1_3 - 0.00136363636363643*G0_0_0_1_1_5 + 0.00109577922077926*G0_0_0_1_2_2 + 0.00253246753246762*G0_0_0_1_2_3 + 0.000438311688311705*G0_0_0_1_2_5 - 0.00277597402597413*G0_0_0_1_3_1 + 0.00253246753246762*G0_0_0_1_3_2 + 0.00409090909090924*G0_0_0_1_3_3 + 0.000194805194805202*G0_0_0_1_3_4 - 0.000779220779220808*G0_0_0_1_3_5 + 0.000194805194805202*G0_0_0_1_4_3 - 0.00253246753246761*G0_0_0_1_4_4 - 0.000779220779220806*G0_0_0_1_4_5 - 0.00136363636363643*G0_0_0_1_5_1 + 0.000438311688311705*G0_0_0_1_5_2 - 0.000779220779220809*G0_0_0_1_5_3 - 0.000779220779220806*G0_0_0_1_5_4 - 0.00233766233766244*G0_0_0_1_5_5 - 0.00109577922077926*G0_0_0_2_0_2 - 0.00253246753246762*G0_0_0_2_0_4 - 0.000438311688311705*G0_0_0_2_0_5 + 0.00109577922077926*G0_0_0_2_1_2 + 0.00253246753246762*G0_0_0_2_1_3 + 0.000438311688311705*G0_0_0_2_1_5 - 0.00109577922077926*G0_0_0_2_2_0 + 0.00109577922077926*G0_0_0_2_2_1 - 0.00681818181818205*G0_0_0_2_2_3 + 0.00681818181818206*G0_0_0_2_2_4 + 0.00253246753246762*G0_0_0_2_3_1 - 0.00681818181818206*G0_0_0_2_3_2 - 0.0116883116883121*G0_0_0_2_3_3 - 0.000194805194805204*G0_0_0_2_3_5 - 0.00253246753246762*G0_0_0_2_4_0 + 0.00681818181818206*G0_0_0_2_4_2 + 0.0116883116883121*G0_0_0_2_4_4 + 0.000194805194805202*G0_0_0_2_4_5 - 0.000438311688311705*G0_0_0_2_5_0 + 0.000438311688311705*G0_0_0_2_5_1 - 0.000194805194805204*G0_0_0_2_5_3 + 0.000194805194805202*G0_0_0_2_5_4 + 0.00253246753246761*G0_0_0_3_0_3 - 0.000194805194805202*G0_0_0_3_0_4 + 0.000779220779220806*G0_0_0_3_0_5 - 0.00277597402597413*G0_0_0_3_1_1 + 0.00253246753246762*G0_0_0_3_1_2 + 0.00409090909090924*G0_0_0_3_1_3 + 0.000194805194805202*G0_0_0_3_1_4 - 0.000779220779220808*G0_0_0_3_1_5 + 0.00253246753246762*G0_0_0_3_2_1 - 0.00681818181818206*G0_0_0_3_2_2 - 0.0116883116883121*G0_0_0_3_2_3 - 0.000194805194805204*G0_0_0_3_2_5 + 0.00253246753246761*G0_0_0_3_3_0 + 0.00409090909090924*G0_0_0_3_3_1 - 0.0116883116883121*G0_0_0_3_3_2 - 0.0490909090909108*G0_0_0_3_3_3 - 0.00545454545454564*G0_0_0_3_3_4 - 0.00467532467532484*G0_0_0_3_3_5 - 0.000194805194805202*G0_0_0_3_4_0 + 0.000194805194805202*G0_0_0_3_4_1 - 0.00545454545454564*G0_0_0_3_4_3 + 0.00545454545454563*G0_0_0_3_4_4 + 0.000779220779220806*G0_0_0_3_5_0 - 0.000779220779220808*G0_0_0_3_5_1 - 0.000194805194805204*G0_0_0_3_5_2 - 0.00467532467532484*G0_0_0_3_5_3 - 0.00155844155844161*G0_0_0_3_5_5 + 0.00277597402597413*G0_0_0_4_0_0 - 0.00253246753246762*G0_0_0_4_0_2 - 0.000194805194805202*G0_0_0_4_0_3 - 0.00409090909090922*G0_0_0_4_0_4 + 0.000779220779220809*G0_0_0_4_0_5 + 0.000194805194805202*G0_0_0_4_1_3 - 0.00253246753246761*G0_0_0_4_1_4 - 0.000779220779220806*G0_0_0_4_1_5 - 0.00253246753246762*G0_0_0_4_2_0 + 0.00681818181818206*G0_0_0_4_2_2 + 0.0116883116883121*G0_0_0_4_2_4 + 0.000194805194805202*G0_0_0_4_2_5 - 0.000194805194805202*G0_0_0_4_3_0 + 0.000194805194805202*G0_0_0_4_3_1 - 0.00545454545454564*G0_0_0_4_3_3 + 0.00545454545454563*G0_0_0_4_3_4 - 0.00409090909090922*G0_0_0_4_4_0 - 0.00253246753246761*G0_0_0_4_4_1 + 0.0116883116883121*G0_0_0_4_4_2 + 0.00545454545454563*G0_0_0_4_4_3 + 0.0490909090909107*G0_0_0_4_4_4 + 0.00467532467532484*G0_0_0_4_4_5 + 0.000779220779220809*G0_0_0_4_5_0 - 0.000779220779220806*G0_0_0_4_5_1 + 0.000194805194805202*G0_0_0_4_5_2 + 0.00467532467532484*G0_0_0_4_5_4 + 0.00155844155844162*G0_0_0_4_5_5 + 0.00136363636363643*G0_0_0_5_0_0 - 0.000438311688311705*G0_0_0_5_0_2 + 0.000779220779220806*G0_0_0_5_0_3 + 0.000779220779220809*G0_0_0_5_0_4 + 0.00233766233766244*G0_0_0_5_0_5 - 0.00136363636363643*G0_0_0_5_1_1 + 0.000438311688311705*G0_0_0_5_1_2 - 0.000779220779220809*G0_0_0_5_1_3 - 0.000779220779220806*G0_0_0_5_1_4 - 0.00233766233766244*G0_0_0_5_1_5 - 0.000438311688311705*G0_0_0_5_2_0 + 0.000438311688311705*G0_0_0_5_2_1 - 0.000194805194805204*G0_0_0_5_2_3 + 0.000194805194805202*G0_0_0_5_2_4 + 0.000779220779220806*G0_0_0_5_3_0 - 0.000779220779220809*G0_0_0_5_3_1 - 0.000194805194805204*G0_0_0_5_3_2 - 0.00467532467532484*G0_0_0_5_3_3 - 0.00155844155844161*G0_0_0_5_3_5 + 0.000779220779220809*G0_0_0_5_4_0 - 0.000779220779220806*G0_0_0_5_4_1 + 0.000194805194805202*G0_0_0_5_4_2 + 0.00467532467532484*G0_0_0_5_4_4 + 0.00155844155844162*G0_0_0_5_4_5 + 0.00233766233766244*G0_0_0_5_5_0 - 0.00233766233766244*G0_0_0_5_5_1 - 0.00155844155844161*G0_0_0_5_5_3 + 0.00155844155844162*G0_0_0_5_5_4 + 0.00434253246753267*G0_0_1_0_0_0 - 0.000416666666666684*G0_0_1_0_0_1 - 0.000511363636363657*G0_0_1_0_0_2 + 0.000238095238095246*G0_0_1_0_0_3 + 0.00281385281385292*G0_0_1_0_0_4 + 0.00156926406926414*G0_0_1_0_0_5 - 0.000416666666666684*G0_0_1_0_1_0 - 0.000227272727272737*G0_0_1_0_1_5 - 0.000511363636363657*G0_0_1_0_2_0 + 0.000964556277056313*G0_0_1_0_2_2 + 0.000384199134199148*G0_0_1_0_2_3 - 0.000811688311688337*G0_0_1_0_2_4 - 0.000324675324675336*G0_0_1_0_2_5 + 0.000238095238095246*G0_0_1_0_3_0 + 0.000384199134199148*G0_0_1_0_3_2 + 0.000757575757575782*G0_0_1_0_3_3 - 0.000389610389610402*G0_0_1_0_3_4 + 0.000173160173160179*G0_0_1_0_3_5 + 0.00281385281385292*G0_0_1_0_4_0 - 0.000811688311688337*G0_0_1_0_4_2 - 0.000389610389610401*G0_0_1_0_4_3 - 0.000519480519480529*G0_0_1_0_4_4 + 0.000735930735930764*G0_0_1_0_4_5 + 0.00156926406926414*G0_0_1_0_5_0 - 0.000227272727272737*G0_0_1_0_5_1 - 0.000324675324675336*G0_0_1_0_5_2 + 0.000173160173160179*G0_0_1_0_5_3 + 0.000735930735930764*G0_0_1_0_5_4 + 0.00164502164502171*G0_0_1_0_5_5 - 0.000416666666666684*G0_0_1_1_0_0 - 0.000227272727272737*G0_0_1_1_0_5 + 0.000799512987013018*G0_0_1_1_1_1 - 0.000462662337662354*G0_0_1_1_1_2 + 0.000189393939393945*G0_0_1_1_1_4 + 0.000205627705627714*G0_0_1_1_1_5 - 0.000462662337662354*G0_0_1_1_2_1 + 0.00206033549783557*G0_0_1_1_2_2 + 0.00172077922077929*G0_0_1_1_2_3 + 0.000286796536796549*G0_0_1_1_2_4 + 0.000113636363636369*G0_0_1_1_2_5 + 0.00172077922077929*G0_0_1_1_3_2 + 0.0035714285714287*G0_0_1_1_3_3 - 0.0001948051948052*G0_0_1_1_3_4 + 0.000189393939393945*G0_0_1_1_4_1 + 0.000286796536796549*G0_0_1_1_4_2 - 0.0001948051948052*G0_0_1_1_4_3 - 0.00177489177489183*G0_0_1_1_4_4 - 0.000606060606060628*G0_0_1_1_4_5 - 0.000227272727272737*G0_0_1_1_5_0 + 0.000205627705627714*G0_0_1_1_5_1 + 0.000113636363636369*G0_0_1_1_5_2 - 0.000606060606060628*G0_0_1_1_5_4 - 0.000692640692640721*G0_0_1_1_5_5 - 0.000511363636363657*G0_0_1_2_0_0 + 0.000964556277056313*G0_0_1_2_0_2 + 0.000384199134199148*G0_0_1_2_0_3 - 0.000811688311688337*G0_0_1_2_0_4 - 0.000324675324675336*G0_0_1_2_0_5 - 0.000462662337662354*G0_0_1_2_1_1 + 0.00206033549783557*G0_0_1_2_1_2 + 0.00172077922077929*G0_0_1_2_1_3 + 0.000286796536796549*G0_0_1_2_1_4 + 0.000113636363636369*G0_0_1_2_1_5 + 0.000964556277056313*G0_0_1_2_2_0 + 0.00206033549783557*G0_0_1_2_2_1 - 0.0252435064935074*G0_0_1_2_2_2 - 0.00957792207792243*G0_0_1_2_2_3 - 0.00275974025974038*G0_0_1_2_2_4 - 0.00026515151515153*G0_0_1_2_2_5 + 0.000384199134199148*G0_0_1_2_3_0 + 0.00172077922077929*G0_0_1_2_3_1 - 0.00957792207792243*G0_0_1_2_3_2 - 0.00969696969697005*G0_0_1_2_3_3 - 0.0013419913419914*G0_0_1_2_3_4 - 0.00023809523809525*G0_0_1_2_3_5 - 0.000811688311688337*G0_0_1_2_4_0 + 0.000286796536796549*G0_0_1_2_4_1 - 0.00275974025974038*G0_0_1_2_4_2 - 0.0013419913419914*G0_0_1_2_4_3 + 0.00199134199134204*G0_0_1_2_4_4 - 0.000324675324675336*G0_0_1_2_5_0 + 0.000113636363636369*G0_0_1_2_5_1 - 0.00026515151515153*G0_0_1_2_5_2 - 0.00023809523809525*G0_0_1_2_5_3 + 0.000238095238095246*G0_0_1_3_0_0 + 0.000384199134199148*G0_0_1_3_0_2 + 0.000757575757575782*G0_0_1_3_0_3 - 0.000389610389610402*G0_0_1_3_0_4 + 0.000173160173160179*G0_0_1_3_0_5 + 0.00172077922077929*G0_0_1_3_1_2 + 0.0035714285714287*G0_0_1_3_1_3 - 0.0001948051948052*G0_0_1_3_1_4 + 0.000384199134199148*G0_0_1_3_2_0 + 0.00172077922077929*G0_0_1_3_2_1 - 0.00957792207792243*G0_0_1_3_2_2 - 0.00969696969697005*G0_0_1_3_2_3 - 0.0013419913419914*G0_0_1_3_2_4 - 0.00023809523809525*G0_0_1_3_2_5 + 0.000757575757575782*G0_0_1_3_3_0 + 0.0035714285714287*G0_0_1_3_3_1 - 0.00969696969697005*G0_0_1_3_3_2 - 0.0267532467532478*G0_0_1_3_3_3 - 0.00112554112554118*G0_0_1_3_3_4 - 0.00103896103896108*G0_0_1_3_3_5 - 0.000389610389610402*G0_0_1_3_4_0 - 0.0001948051948052*G0_0_1_3_4_1 - 0.0013419913419914*G0_0_1_3_4_2 - 0.00112554112554118*G0_0_1_3_4_3 + 0.00432900432900447*G0_0_1_3_4_4 + 0.000865800865800896*G0_0_1_3_4_5 + 0.000173160173160179*G0_0_1_3_5_0 - 0.00023809523809525*G0_0_1_3_5_2 - 0.00103896103896108*G0_0_1_3_5_3 + 0.000865800865800895*G0_0_1_3_5_4 - 0.000432900432900444*G0_0_1_3_5_5 + 0.00281385281385292*G0_0_1_4_0_0 - 0.000811688311688337*G0_0_1_4_0_2 - 0.000389610389610402*G0_0_1_4_0_3 - 0.000519480519480529*G0_0_1_4_0_4 + 0.000735930735930764*G0_0_1_4_0_5 + 0.000189393939393945*G0_0_1_4_1_1 + 0.000286796536796549*G0_0_1_4_1_2 - 0.0001948051948052*G0_0_1_4_1_3 - 0.00177489177489183*G0_0_1_4_1_4 - 0.000606060606060628*G0_0_1_4_1_5 - 0.000811688311688337*G0_0_1_4_2_0 + 0.000286796536796549*G0_0_1_4_2_1 - 0.00275974025974038*G0_0_1_4_2_2 - 0.0013419913419914*G0_0_1_4_2_3 + 0.00199134199134205*G0_0_1_4_2_4 - 0.000389610389610402*G0_0_1_4_3_0 - 0.0001948051948052*G0_0_1_4_3_1 - 0.0013419913419914*G0_0_1_4_3_2 - 0.00112554112554117*G0_0_1_4_3_3 + 0.00432900432900447*G0_0_1_4_3_4 + 0.000865800865800896*G0_0_1_4_3_5 - 0.000519480519480529*G0_0_1_4_4_0 - 0.00177489177489183*G0_0_1_4_4_1 + 0.00199134199134205*G0_0_1_4_4_2 + 0.00432900432900447*G0_0_1_4_4_3 + 0.0223376623376631*G0_0_1_4_4_4 + 0.00363636363636376*G0_0_1_4_4_5 + 0.000735930735930764*G0_0_1_4_5_0 - 0.000606060606060628*G0_0_1_4_5_1 + 0.000865800865800896*G0_0_1_4_5_3 + 0.00363636363636376*G0_0_1_4_5_4 + 0.00112554112554117*G0_0_1_4_5_5 + 0.00156926406926414*G0_0_1_5_0_0 - 0.000227272727272737*G0_0_1_5_0_1 - 0.000324675324675336*G0_0_1_5_0_2 + 0.000173160173160179*G0_0_1_5_0_3 + 0.000735930735930764*G0_0_1_5_0_4 + 0.00164502164502171*G0_0_1_5_0_5 - 0.000227272727272737*G0_0_1_5_1_0 + 0.000205627705627714*G0_0_1_5_1_1 + 0.000113636363636369*G0_0_1_5_1_2 - 0.000606060606060628*G0_0_1_5_1_4 - 0.000692640692640721*G0_0_1_5_1_5 - 0.000324675324675336*G0_0_1_5_2_0 + 0.000113636363636369*G0_0_1_5_2_1 - 0.00026515151515153*G0_0_1_5_2_2 - 0.00023809523809525*G0_0_1_5_2_3 + 0.000173160173160179*G0_0_1_5_3_0 - 0.00023809523809525*G0_0_1_5_3_2 - 0.00103896103896108*G0_0_1_5_3_3 + 0.000865800865800896*G0_0_1_5_3_4 - 0.000432900432900444*G0_0_1_5_3_5 + 0.000735930735930764*G0_0_1_5_4_0 - 0.000606060606060628*G0_0_1_5_4_1 + 0.000865800865800896*G0_0_1_5_4_3 + 0.00363636363636376*G0_0_1_5_4_4 + 0.00112554112554117*G0_0_1_5_4_5 + 0.00164502164502171*G0_0_1_5_5_0 - 0.000692640692640721*G0_0_1_5_5_1 - 0.000432900432900444*G0_0_1_5_5_3 + 0.00112554112554117*G0_0_1_5_5_4 - 0.000259740259740247*G0_0_1_5_5_5 + 0.0044196428571431*G0_1_0_0_0_0 - 0.00141233766233772*G0_1_0_0_0_1 - 0.000158279220779232*G0_1_0_0_0_2 - 0.000389610389610398*G0_1_0_0_0_3 + 0.000925324675324727*G0_1_0_0_0_4 + 0.00224025974025985*G0_1_0_0_0_5 - 0.00141233766233772*G0_1_0_0_1_0 + 0.00488230519480536*G0_1_0_0_1_1 - 0.000304383116883126*G0_1_0_0_1_2 + 0.000438311688311704*G0_1_0_0_1_3 + 0.00282467532467541*G0_1_0_0_1_5 - 0.000158279220779232*G0_1_0_0_2_0 - 0.000304383116883126*G0_1_0_0_2_1 + 0.0001461038961039*G0_1_0_0_2_2 + 0.000389610389610402*G0_1_0_0_2_3 - 0.000292207792207804*G0_1_0_0_2_4 - 0.000584415584415606*G0_1_0_0_2_5 - 0.000389610389610398*G0_1_0_0_3_0 + 0.000438311688311704*G0_1_0_0_3_1 + 0.000389610389610401*G0_1_0_0_3_2 + 0.00487012987013001*G0_1_0_0_3_3 + 0.000779220779220802*G0_1_0_0_3_4 + 0.00194805194805201*G0_1_0_0_3_5 + 0.000925324675324727*G0_1_0_0_4_0 - 0.000292207792207804*G0_1_0_0_4_2 + 0.000779220779220802*G0_1_0_0_4_3 - 0.000974025974025994*G0_1_0_0_4_4 + 0.00116883116883122*G0_1_0_0_4_5 + 0.00224025974025985*G0_1_0_0_5_0 + 0.00282467532467541*G0_1_0_0_5_1 - 0.000584415584415606*G0_1_0_0_5_2 + 0.00194805194805201*G0_1_0_0_5_3 + 0.00116883116883122*G0_1_0_0_5_4 + 0.0116883116883121*G0_1_0_0_5_5 - 0.00141233766233772*G0_1_0_1_0_0 + 0.00488230519480536*G0_1_0_1_0_1 - 0.000304383116883126*G0_1_0_1_0_2 + 0.000438311688311704*G0_1_0_1_0_3 + 0.00282467532467541*G0_1_0_1_0_5 + 0.00488230519480536*G0_1_0_1_1_0 - 0.0584415584415605*G0_1_0_1_1_1 + 0.00225243506493514*G0_1_0_1_1_2 - 0.0112987012987017*G0_1_0_1_1_3 - 0.000925324675324699*G0_1_0_1_1_4 - 0.0208441558441566*G0_1_0_1_1_5 - 0.000304383116883126*G0_1_0_1_2_0 + 0.00225243506493514*G0_1_0_1_2_1 + 0.000754870129870157*G0_1_0_1_2_2 + 0.00272727272727282*G0_1_0_1_2_3 + 0.000292207792207802*G0_1_0_1_2_4 + 0.00150974025974031*G0_1_0_1_2_5 + 0.000438311688311704*G0_1_0_1_3_0 - 0.0112987012987017*G0_1_0_1_3_1 + 0.00272727272727282*G0_1_0_1_3_2 + 0.00623376623376646*G0_1_0_1_3_3 + 0.000974025974026007*G0_1_0_1_3_4 - 0.00389610389610404*G0_1_0_1_3_5 - 0.000925324675324698*G0_1_0_1_4_1 + 0.000292207792207802*G0_1_0_1_4_2 + 0.000974025974026007*G0_1_0_1_4_3 - 0.000779220779220805*G0_1_0_1_4_4 - 0.00116883116883121*G0_1_0_1_4_5 + 0.00282467532467541*G0_1_0_1_5_0 - 0.0208441558441566*G0_1_0_1_5_1 + 0.00150974025974031*G0_1_0_1_5_2 - 0.00389610389610404*G0_1_0_1_5_3 - 0.00116883116883121*G0_1_0_1_5_4 - 0.0218181818181826*G0_1_0_1_5_5 - 0.000158279220779232*G0_1_0_2_0_0 - 0.000304383116883126*G0_1_0_2_0_1 + 0.0001461038961039*G0_1_0_2_0_2 + 0.000389610389610401*G0_1_0_2_0_3 - 0.000292207792207804*G0_1_0_2_0_4 - 0.000584415584415606*G0_1_0_2_0_5 - 0.000304383116883126*G0_1_0_2_1_0 + 0.00225243506493514*G0_1_0_2_1_1 + 0.000754870129870157*G0_1_0_2_1_2 + 0.00272727272727282*G0_1_0_2_1_3 + 0.000292207792207802*G0_1_0_2_1_4 + 0.00150974025974031*G0_1_0_2_1_5 + 0.0001461038961039*G0_1_0_2_2_0 + 0.000754870129870157*G0_1_0_2_2_1 - 0.00328733766233778*G0_1_0_2_2_2 - 0.00535714285714304*G0_1_0_2_2_3 - 0.000292207792207802*G0_1_0_2_2_5 + 0.000389610389610401*G0_1_0_2_3_0 + 0.00272727272727282*G0_1_0_2_3_1 - 0.00535714285714304*G0_1_0_2_3_2 - 0.0122727272727277*G0_1_0_2_3_3 - 0.00136363636363641*G0_1_0_2_3_4 - 0.000194805194805207*G0_1_0_2_3_5 - 0.000292207792207804*G0_1_0_2_4_0 + 0.000292207792207802*G0_1_0_2_4_1 - 0.00136363636363641*G0_1_0_2_4_3 + 0.00136363636363641*G0_1_0_2_4_4 - 0.000584415584415606*G0_1_0_2_5_0 + 0.00150974025974031*G0_1_0_2_5_1 - 0.000292207792207802*G0_1_0_2_5_2 - 0.000194805194805207*G0_1_0_2_5_3 + 0.0011688311688312*G0_1_0_2_5_5 - 0.000389610389610398*G0_1_0_3_0_0 + 0.000438311688311704*G0_1_0_3_0_1 + 0.000389610389610401*G0_1_0_3_0_2 + 0.00487012987013001*G0_1_0_3_0_3 + 0.000779220779220802*G0_1_0_3_0_4 + 0.00194805194805201*G0_1_0_3_0_5 + 0.000438311688311704*G0_1_0_3_1_0 - 0.0112987012987017*G0_1_0_3_1_1 + 0.00272727272727282*G0_1_0_3_1_2 + 0.00623376623376646*G0_1_0_3_1_3 + 0.000974025974026007*G0_1_0_3_1_4 - 0.00389610389610404*G0_1_0_3_1_5 + 0.000389610389610401*G0_1_0_3_2_0 + 0.00272727272727282*G0_1_0_3_2_1 - 0.00535714285714304*G0_1_0_3_2_2 - 0.0122727272727277*G0_1_0_3_2_3 - 0.00136363636363641*G0_1_0_3_2_4 - 0.000194805194805207*G0_1_0_3_2_5 + 0.00487012987013001*G0_1_0_3_3_0 + 0.00623376623376646*G0_1_0_3_3_1 - 0.0122727272727277*G0_1_0_3_3_2 - 0.0935064935064967*G0_1_0_3_3_3 - 0.0116883116883121*G0_1_0_3_3_4 - 0.00935064935064966*G0_1_0_3_3_5 + 0.000779220779220802*G0_1_0_3_4_0 + 0.000974025974026007*G0_1_0_3_4_1 - 0.00136363636363641*G0_1_0_3_4_2 - 0.0116883116883121*G0_1_0_3_4_3 - 0.0015584415584416*G0_1_0_3_4_5 + 0.00194805194805201*G0_1_0_3_5_0 - 0.00389610389610404*G0_1_0_3_5_1 - 0.000194805194805207*G0_1_0_3_5_2 - 0.00935064935064966*G0_1_0_3_5_3 - 0.0015584415584416*G0_1_0_3_5_4 - 0.00623376623376644*G0_1_0_3_5_5 + 0.000925324675324727*G0_1_0_4_0_0 - 0.000292207792207804*G0_1_0_4_0_2 + 0.000779220779220802*G0_1_0_4_0_3 - 0.000974025974025994*G0_1_0_4_0_4 + 0.00116883116883122*G0_1_0_4_0_5 - 0.000925324675324699*G0_1_0_4_1_1 + 0.000292207792207802*G0_1_0_4_1_2 + 0.000974025974026007*G0_1_0_4_1_3 - 0.000779220779220805*G0_1_0_4_1_4 - 0.00116883116883121*G0_1_0_4_1_5 - 0.000292207792207804*G0_1_0_4_2_0 + 0.000292207792207802*G0_1_0_4_2_1 - 0.00136363636363641*G0_1_0_4_2_3 + 0.00136363636363641*G0_1_0_4_2_4 + 0.000779220779220802*G0_1_0_4_3_0 + 0.000974025974026007*G0_1_0_4_3_1 - 0.00136363636363641*G0_1_0_4_3_2 - 0.0116883116883121*G0_1_0_4_3_3 - 0.0015584415584416*G0_1_0_4_3_5 - 0.000974025974025994*G0_1_0_4_4_0 - 0.000779220779220805*G0_1_0_4_4_1 + 0.00136363636363641*G0_1_0_4_4_2 + 0.0116883116883121*G0_1_0_4_4_4 + 0.00155844155844162*G0_1_0_4_4_5 + 0.00116883116883122*G0_1_0_4_5_0 - 0.00116883116883121*G0_1_0_4_5_1 - 0.0015584415584416*G0_1_0_4_5_3 + 0.00155844155844162*G0_1_0_4_5_4 + 0.00224025974025985*G0_1_0_5_0_0 + 0.00282467532467541*G0_1_0_5_0_1 - 0.000584415584415606*G0_1_0_5_0_2 + 0.00194805194805201*G0_1_0_5_0_3 + 0.00116883116883122*G0_1_0_5_0_4 + 0.0116883116883121*G0_1_0_5_0_5 + 0.00282467532467541*G0_1_0_5_1_0 - 0.0208441558441566*G0_1_0_5_1_1 + 0.00150974025974031*G0_1_0_5_1_2 - 0.00389610389610404*G0_1_0_5_1_3 - 0.00116883116883121*G0_1_0_5_1_4 - 0.0218181818181826*G0_1_0_5_1_5 - 0.000584415584415606*G0_1_0_5_2_0 + 0.00150974025974031*G0_1_0_5_2_1 - 0.000292207792207802*G0_1_0_5_2_2 - 0.000194805194805207*G0_1_0_5_2_3 + 0.0011688311688312*G0_1_0_5_2_5 + 0.00194805194805201*G0_1_0_5_3_0 - 0.00389610389610404*G0_1_0_5_3_1 - 0.000194805194805207*G0_1_0_5_3_2 - 0.00935064935064966*G0_1_0_5_3_3 - 0.0015584415584416*G0_1_0_5_3_4 - 0.00623376623376644*G0_1_0_5_3_5 + 0.00116883116883122*G0_1_0_5_4_0 - 0.00116883116883121*G0_1_0_5_4_1 - 0.0015584415584416*G0_1_0_5_4_3 + 0.00155844155844162*G0_1_0_5_4_4 + 0.0116883116883121*G0_1_0_5_5_0 - 0.0218181818181826*G0_1_0_5_5_1 + 0.0011688311688312*G0_1_0_5_5_2 - 0.00623376623376644*G0_1_0_5_5_3 - 0.0233766233766241*G0_1_0_5_5_5 + 0.00434253246753272*G0_1_1_0_0_0 - 0.000762987012987046*G0_1_1_0_0_1 - 0.000262445887445902*G0_1_1_0_0_2 + 0.000335497835497848*G0_1_1_0_0_3 + 0.00124458874458881*G0_1_1_0_0_4 + 0.00313852813852828*G0_1_1_0_0_5 - 0.000762987012987046*G0_1_1_0_1_0 + 0.000189393939393945*G0_1_1_0_1_3 + 0.000227272727272732*G0_1_1_0_1_4 - 0.000227272727272743*G0_1_1_0_1_5 - 0.000262445887445903*G0_1_1_0_2_0 + 0.00022862554112555*G0_1_1_0_2_2 + 0.000378787878787891*G0_1_1_0_2_3 - 0.000140692640692648*G0_1_1_0_2_5 + 0.000335497835497848*G0_1_1_0_3_0 + 0.000189393939393945*G0_1_1_0_3_1 + 0.000378787878787891*G0_1_1_0_3_2 + 0.00114718614718618*G0_1_1_0_3_3 - 0.00112554112554116*G0_1_1_0_3_4 - 0.0003896103896104*G0_1_1_0_3_5 + 0.00124458874458881*G0_1_1_0_4_0 + 0.000227272727272732*G0_1_1_0_4_1 - 0.00112554112554116*G0_1_1_0_4_3 - 0.00199134199134204*G0_1_1_0_4_4 - 0.000173160173160168*G0_1_1_0_4_5 + 0.00313852813852828*G0_1_1_0_5_0 - 0.000227272727272743*G0_1_1_0_5_1 - 0.000140692640692648*G0_1_1_0_5_2 - 0.0003896103896104*G0_1_1_0_5_3 - 0.000173160173160168*G0_1_1_0_5_4 + 0.00493506493506513*G0_1_1_0_5_5 - 0.000762987012987046*G0_1_1_1_0_0 + 0.000189393939393945*G0_1_1_1_0_3 + 0.000227272727272732*G0_1_1_1_0_4 - 0.000227272727272743*G0_1_1_1_0_5 + 0.00836038961038989*G0_1_1_1_1_1 - 0.000520833333333351*G0_1_1_1_1_2 + 0.000389610389610397*G0_1_1_1_1_3 + 0.000319264069264079*G0_1_1_1_1_4 + 0.000909090909090949*G0_1_1_1_1_5 - 0.000520833333333351*G0_1_1_1_2_1 + 0.000787337662337692*G0_1_1_1_2_2 + 0.00188311688311695*G0_1_1_1_2_3 + 0.000324675324675337*G0_1_1_1_2_4 + 0.000351731601731614*G0_1_1_1_2_5 + 0.000189393939393945*G0_1_1_1_3_0 + 0.000389610389610397*G0_1_1_1_3_1 + 0.00188311688311695*G0_1_1_1_3_2 + 0.000173160173160185*G0_1_1_1_3_3 - 0.00101731601731605*G0_1_1_1_3_4 - 0.00108225108225112*G0_1_1_1_3_5 + 0.000227272727272732*G0_1_1_1_4_0 + 0.000319264069264079*G0_1_1_1_4_1 + 0.000324675324675337*G0_1_1_1_4_2 - 0.00101731601731605*G0_1_1_1_4_3 - 0.00190476190476197*G0_1_1_1_4_4 - 0.00134199134199139*G0_1_1_1_4_5 - 0.000227272727272743*G0_1_1_1_5_0 + 0.000909090909090949*G0_1_1_1_5_1 + 0.000351731601731614*G0_1_1_1_5_2 - 0.00108225108225112*G0_1_1_1_5_3 - 0.00134199134199139*G0_1_1_1_5_4 - 0.00450216450216466*G0_1_1_1_5_5 - 0.000262445887445903*G0_1_1_2_0_0 + 0.00022862554112555*G0_1_1_2_0_2 + 0.000378787878787891*G0_1_1_2_0_3 - 0.000140692640692648*G0_1_1_2_0_5 - 0.000520833333333351*G0_1_1_2_1_1 + 0.000787337662337692*G0_1_1_2_1_2 + 0.00188311688311695*G0_1_1_2_1_3 + 0.000324675324675337*G0_1_1_2_1_4 + 0.000351731601731614*G0_1_1_2_1_5 + 0.00022862554112555*G0_1_1_2_2_0 + 0.000787337662337692*G0_1_1_2_2_1 - 0.00509334415584435*G0_1_1_2_2_2 - 0.00465367965367983*G0_1_1_2_2_3 - 0.000622294372294398*G0_1_1_2_2_4 + 0.000378787878787891*G0_1_1_2_3_0 + 0.00188311688311695*G0_1_1_2_3_1 - 0.00465367965367983*G0_1_1_2_3_2 - 0.0065584415584418*G0_1_1_2_3_3 - 0.00140692640692646*G0_1_1_2_3_4 - 0.000714285714285741*G0_1_1_2_3_5 + 0.000324675324675337*G0_1_1_2_4_1 - 0.000622294372294398*G0_1_1_2_4_2 - 0.00140692640692646*G0_1_1_2_4_3 - 0.000606060606060629*G0_1_1_2_4_5 - 0.000140692640692648*G0_1_1_2_5_0 + 0.000351731601731614*G0_1_1_2_5_1 - 0.000714285714285741*G0_1_1_2_5_3 - 0.000606060606060629*G0_1_1_2_5_4 - 0.000476190476190496*G0_1_1_2_5_5 + 0.000335497835497848*G0_1_1_3_0_0 + 0.000189393939393945*G0_1_1_3_0_1 + 0.000378787878787891*G0_1_1_3_0_2 + 0.00114718614718618*G0_1_1_3_0_3 - 0.00112554112554116*G0_1_1_3_0_4 - 0.0003896103896104*G0_1_1_3_0_5 + 0.000189393939393945*G0_1_1_3_1_0 + 0.000389610389610398*G0_1_1_3_1_1 + 0.00188311688311695*G0_1_1_3_1_2 + 0.000173160173160186*G0_1_1_3_1_3 - 0.00101731601731605*G0_1_1_3_1_4 - 0.00108225108225112*G0_1_1_3_1_5 + 0.000378787878787891*G0_1_1_3_2_0 + 0.00188311688311695*G0_1_1_3_2_1 - 0.00465367965367983*G0_1_1_3_2_2 - 0.0065584415584418*G0_1_1_3_2_3 - 0.00140692640692646*G0_1_1_3_2_4 - 0.000714285714285741*G0_1_1_3_2_5 + 0.00114718614718618*G0_1_1_3_3_0 + 0.000173160173160185*G0_1_1_3_3_1 - 0.0065584415584418*G0_1_1_3_3_2 - 0.0664935064935089*G0_1_1_3_3_3 - 0.000259740259740287*G0_1_1_3_3_4 - 0.000865800865800911*G0_1_1_3_3_5 - 0.00112554112554116*G0_1_1_3_4_0 - 0.00101731601731605*G0_1_1_3_4_1 - 0.00140692640692646*G0_1_1_3_4_2 - 0.000259740259740285*G0_1_1_3_4_3 + 0.00606060606060625*G0_1_1_3_4_4 + 0.00346320346320358*G0_1_1_3_4_5 - 0.000389610389610401*G0_1_1_3_5_0 - 0.00108225108225112*G0_1_1_3_5_1 - 0.000714285714285741*G0_1_1_3_5_2 - 0.00086580086580091*G0_1_1_3_5_3 + 0.00346320346320358*G0_1_1_3_5_4 + 0.00173160173160179*G0_1_1_3_5_5 + 0.00124458874458881*G0_1_1_4_0_0 + 0.000227272727272732*G0_1_1_4_0_1 - 0.00112554112554116*G0_1_1_4_0_3 - 0.00199134199134204*G0_1_1_4_0_4 - 0.000173160173160168*G0_1_1_4_0_5 + 0.000227272727272732*G0_1_1_4_1_0 + 0.000319264069264079*G0_1_1_4_1_1 + 0.000324675324675337*G0_1_1_4_1_2 - 0.00101731601731605*G0_1_1_4_1_3 - 0.00190476190476197*G0_1_1_4_1_4 - 0.00134199134199139*G0_1_1_4_1_5 + 0.000324675324675337*G0_1_1_4_2_1 - 0.000622294372294398*G0_1_1_4_2_2 - 0.00140692640692646*G0_1_1_4_2_3 - 0.000606060606060629*G0_1_1_4_2_5 - 0.00112554112554116*G0_1_1_4_3_0 - 0.00101731601731605*G0_1_1_4_3_1 - 0.00140692640692646*G0_1_1_4_3_2 - 0.000259740259740284*G0_1_1_4_3_3 + 0.00606060606060625*G0_1_1_4_3_4 + 0.00346320346320358*G0_1_1_4_3_5 - 0.00199134199134204*G0_1_1_4_4_0 - 0.00190476190476197*G0_1_1_4_4_1 + 0.00606060606060625*G0_1_1_4_4_3 + 0.0114285714285718*G0_1_1_4_4_4 + 0.00502164502164519*G0_1_1_4_4_5 - 0.000173160173160168*G0_1_1_4_5_0 - 0.00134199134199139*G0_1_1_4_5_1 - 0.000606060606060629*G0_1_1_4_5_2 + 0.00346320346320358*G0_1_1_4_5_3 + 0.00502164502164519*G0_1_1_4_5_4 + 0.00363636363636377*G0_1_1_4_5_5 + 0.00313852813852828*G0_1_1_5_0_0 - 0.000227272727272743*G0_1_1_5_0_1 - 0.000140692640692648*G0_1_1_5_0_2 - 0.0003896103896104*G0_1_1_5_0_3 - 0.000173160173160168*G0_1_1_5_0_4 + 0.00493506493506513*G0_1_1_5_0_5 - 0.000227272727272743*G0_1_1_5_1_0 + 0.000909090909090949*G0_1_1_5_1_1 + 0.000351731601731614*G0_1_1_5_1_2 - 0.00108225108225112*G0_1_1_5_1_3 - 0.00134199134199139*G0_1_1_5_1_4 - 0.00450216450216466*G0_1_1_5_1_5 - 0.000140692640692648*G0_1_1_5_2_0 + 0.000351731601731614*G0_1_1_5_2_1 - 0.000714285714285741*G0_1_1_5_2_3 - 0.000606060606060629*G0_1_1_5_2_4 - 0.000476190476190496*G0_1_1_5_2_5 - 0.000389610389610401*G0_1_1_5_3_0 - 0.00108225108225112*G0_1_1_5_3_1 - 0.000714285714285741*G0_1_1_5_3_2 - 0.00086580086580091*G0_1_1_5_3_3 + 0.00346320346320358*G0_1_1_5_3_4 + 0.00173160173160179*G0_1_1_5_3_5 - 0.000173160173160168*G0_1_1_5_4_0 - 0.00134199134199139*G0_1_1_5_4_1 - 0.000606060606060629*G0_1_1_5_4_2 + 0.00346320346320358*G0_1_1_5_4_3 + 0.00502164502164519*G0_1_1_5_4_4 + 0.00363636363636377*G0_1_1_5_4_5 + 0.00493506493506513*G0_1_1_5_5_0 - 0.00450216450216466*G0_1_1_5_5_1 - 0.000476190476190496*G0_1_1_5_5_2 + 0.00173160173160179*G0_1_1_5_5_3 + 0.00363636363636377*G0_1_1_5_5_4 - 0.00103896103896102*G0_1_1_5_5_5; + A[4] = A[40] - 0.000346320346320361*G0_0_1_0_0_1 + 0.000248917748917754*G0_0_1_0_0_2 - 0.00156926406926411*G0_0_1_0_0_4 + 0.00156926406926414*G0_0_1_0_0_5 - 0.000346320346320361*G0_0_1_0_1_0 - 0.000116341991341995*G0_0_1_0_1_1 + 0.00028138528138529*G0_0_1_0_1_3 + 0.000270562770562778*G0_0_1_0_1_4 + 0.000248917748917754*G0_0_1_0_2_0 - 0.000735930735930762*G0_0_1_0_2_2 + 0.000844155844155869*G0_0_1_0_2_4 + 0.000183982683982688*G0_0_1_0_2_5 + 0.00028138528138529*G0_0_1_0_3_1 + 0.000389610389610395*G0_0_1_0_3_3 - 0.000735930735930758*G0_0_1_0_3_4 - 0.000562770562770579*G0_0_1_0_3_5 - 0.00156926406926411*G0_0_1_0_4_0 + 0.000270562770562778*G0_0_1_0_4_1 + 0.000844155844155868*G0_0_1_0_4_2 - 0.000735930735930758*G0_0_1_0_4_3 - 0.00147186147186151*G0_0_1_0_4_4 - 0.000909090909090932*G0_0_1_0_4_5 + 0.00156926406926414*G0_0_1_0_5_0 + 0.000183982683982688*G0_0_1_0_5_2 - 0.000562770562770579*G0_0_1_0_5_3 - 0.000909090909090932*G0_0_1_0_5_4 + 0.00329004329004342*G0_0_1_0_5_5 - 0.000346320346320361*G0_0_1_1_0_0 - 0.000116341991341995*G0_0_1_1_0_1 + 0.00028138528138529*G0_0_1_1_0_3 + 0.000270562770562778*G0_0_1_1_0_4 - 0.000116341991341995*G0_0_1_1_1_0 + 0.00756087662337688*G0_0_1_1_1_1 + 0.000351731601731613*G0_0_1_1_1_3 + 0.000129870129870133*G0_0_1_1_1_4 + 0.000703463203463235*G0_0_1_1_1_5 - 0.00127299783549788*G0_0_1_1_2_2 + 0.000162337662337666*G0_0_1_1_2_3 + 0.000238095238095246*G0_0_1_1_2_5 + 0.00028138528138529*G0_0_1_1_3_0 + 0.000351731601731613*G0_0_1_1_3_1 + 0.000162337662337666*G0_0_1_1_3_2 - 0.00339826839826852*G0_0_1_1_3_3 - 0.000822510822510849*G0_0_1_1_3_4 - 0.00103896103896107*G0_0_1_1_3_5 + 0.000270562770562778*G0_0_1_1_4_0 + 0.000129870129870133*G0_0_1_1_4_1 - 0.000822510822510849*G0_0_1_1_4_3 - 0.000129870129870133*G0_0_1_1_4_4 - 0.00073593073593076*G0_0_1_1_4_5 + 0.000703463203463235*G0_0_1_1_5_1 + 0.000238095238095246*G0_0_1_1_5_2 - 0.00103896103896107*G0_0_1_1_5_3 - 0.00073593073593076*G0_0_1_1_5_4 - 0.00380952380952394*G0_0_1_1_5_5 + 0.000248917748917754*G0_0_1_2_0_0 - 0.000735930735930762*G0_0_1_2_0_2 + 0.000844155844155869*G0_0_1_2_0_4 + 0.000183982683982688*G0_0_1_2_0_5 - 0.00127299783549788*G0_0_1_2_1_2 + 0.000162337662337666*G0_0_1_2_1_3 + 0.000238095238095246*G0_0_1_2_1_5 - 0.000735930735930762*G0_0_1_2_2_0 - 0.00127299783549788*G0_0_1_2_2_1 + 0.0201501623376631*G0_0_1_2_2_2 + 0.00492424242424261*G0_0_1_2_2_3 + 0.00213744588744598*G0_0_1_2_2_4 + 0.000243506493506506*G0_0_1_2_2_5 + 0.000162337662337666*G0_0_1_2_3_1 + 0.00492424242424261*G0_0_1_2_3_2 + 0.00313852813852826*G0_0_1_2_3_3 - 0.000476190476190489*G0_0_1_2_3_5 + 0.000844155844155868*G0_0_1_2_4_0 + 0.00213744588744598*G0_0_1_2_4_2 - 0.0020346320346321*G0_0_1_2_4_4 - 0.000562770562770581*G0_0_1_2_4_5 + 0.000183982683982688*G0_0_1_2_5_0 + 0.000238095238095246*G0_0_1_2_5_1 + 0.000243506493506506*G0_0_1_2_5_2 - 0.000476190476190489*G0_0_1_2_5_3 - 0.000562770562770581*G0_0_1_2_5_4 - 0.000519480519480537*G0_0_1_2_5_5 + 0.00028138528138529*G0_0_1_3_0_1 + 0.000389610389610395*G0_0_1_3_0_3 - 0.000735930735930758*G0_0_1_3_0_4 - 0.000562770562770579*G0_0_1_3_0_5 + 0.00028138528138529*G0_0_1_3_1_0 + 0.000351731601731613*G0_0_1_3_1_1 + 0.000162337662337666*G0_0_1_3_1_2 - 0.00339826839826852*G0_0_1_3_1_3 - 0.00082251082251085*G0_0_1_3_1_4 - 0.00103896103896107*G0_0_1_3_1_5 + 0.000162337662337666*G0_0_1_3_2_1 + 0.00492424242424261*G0_0_1_3_2_2 + 0.00313852813852826*G0_0_1_3_2_3 - 0.000476190476190489*G0_0_1_3_2_5 + 0.000389610389610395*G0_0_1_3_3_0 - 0.00339826839826852*G0_0_1_3_3_1 + 0.00313852813852826*G0_0_1_3_3_2 - 0.0397402597402611*G0_0_1_3_3_3 + 0.000865800865800894*G0_0_1_3_3_4 + 0.000173160173160172*G0_0_1_3_3_5 - 0.000735930735930758*G0_0_1_3_4_0 - 0.00082251082251085*G0_0_1_3_4_1 + 0.000865800865800894*G0_0_1_3_4_3 + 0.00173160173160178*G0_0_1_3_4_4 + 0.00259740259740268*G0_0_1_3_4_5 - 0.000562770562770579*G0_0_1_3_5_0 - 0.00103896103896107*G0_0_1_3_5_1 - 0.000476190476190489*G0_0_1_3_5_2 + 0.000173160173160172*G0_0_1_3_5_3 + 0.00259740259740268*G0_0_1_3_5_4 + 0.00216450216450223*G0_0_1_3_5_5 - 0.00156926406926411*G0_0_1_4_0_0 + 0.000270562770562778*G0_0_1_4_0_1 + 0.000844155844155869*G0_0_1_4_0_2 - 0.000735930735930758*G0_0_1_4_0_3 - 0.00147186147186151*G0_0_1_4_0_4 - 0.000909090909090932*G0_0_1_4_0_5 + 0.000270562770562778*G0_0_1_4_1_0 + 0.000129870129870133*G0_0_1_4_1_1 - 0.000822510822510849*G0_0_1_4_1_3 - 0.000129870129870133*G0_0_1_4_1_4 - 0.00073593073593076*G0_0_1_4_1_5 + 0.000844155844155868*G0_0_1_4_2_0 + 0.00213744588744598*G0_0_1_4_2_2 - 0.0020346320346321*G0_0_1_4_2_4 - 0.000562770562770581*G0_0_1_4_2_5 - 0.000735930735930758*G0_0_1_4_3_0 - 0.000822510822510849*G0_0_1_4_3_1 + 0.000865800865800892*G0_0_1_4_3_3 + 0.00173160173160178*G0_0_1_4_3_4 + 0.00259740259740268*G0_0_1_4_3_5 - 0.00147186147186151*G0_0_1_4_4_0 - 0.000129870129870133*G0_0_1_4_4_1 - 0.0020346320346321*G0_0_1_4_4_2 + 0.00173160173160178*G0_0_1_4_4_3 - 0.0109090909090913*G0_0_1_4_4_4 + 0.00138528138528143*G0_0_1_4_4_5 - 0.000909090909090932*G0_0_1_4_5_0 - 0.00073593073593076*G0_0_1_4_5_1 - 0.000562770562770581*G0_0_1_4_5_2 + 0.00259740259740268*G0_0_1_4_5_3 + 0.00138528138528143*G0_0_1_4_5_4 + 0.00251082251082259*G0_0_1_4_5_5 + 0.00156926406926414*G0_0_1_5_0_0 + 0.000183982683982688*G0_0_1_5_0_2 - 0.000562770562770579*G0_0_1_5_0_3 - 0.000909090909090932*G0_0_1_5_0_4 + 0.00329004329004342*G0_0_1_5_0_5 + 0.000703463203463235*G0_0_1_5_1_1 + 0.000238095238095246*G0_0_1_5_1_2 - 0.00103896103896107*G0_0_1_5_1_3 - 0.00073593073593076*G0_0_1_5_1_4 - 0.00380952380952394*G0_0_1_5_1_5 + 0.000183982683982688*G0_0_1_5_2_0 + 0.000238095238095246*G0_0_1_5_2_1 + 0.000243506493506506*G0_0_1_5_2_2 - 0.000476190476190489*G0_0_1_5_2_3 - 0.000562770562770581*G0_0_1_5_2_4 - 0.000519480519480537*G0_0_1_5_2_5 - 0.000562770562770579*G0_0_1_5_3_0 - 0.00103896103896107*G0_0_1_5_3_1 - 0.000476190476190489*G0_0_1_5_3_2 + 0.000173160173160171*G0_0_1_5_3_3 + 0.00259740259740268*G0_0_1_5_3_4 + 0.00216450216450223*G0_0_1_5_3_5 - 0.000909090909090932*G0_0_1_5_4_0 - 0.00073593073593076*G0_0_1_5_4_1 - 0.000562770562770581*G0_0_1_5_4_2 + 0.00259740259740268*G0_0_1_5_4_3 + 0.00138528138528143*G0_0_1_5_4_4 + 0.00251082251082259*G0_0_1_5_4_5 + 0.00329004329004342*G0_0_1_5_5_0 - 0.00380952380952394*G0_0_1_5_5_1 - 0.000519480519480537*G0_0_1_5_5_2 + 0.00216450216450223*G0_0_1_5_5_3 + 0.00251082251082259*G0_0_1_5_5_4 - 0.000779220779220806*G0_0_1_5_5_5 + 0.000346320346320361*G0_1_0_0_0_1 - 0.000248917748917754*G0_1_0_0_0_2 + 0.00156926406926411*G0_1_0_0_0_4 - 0.00156926406926414*G0_1_0_0_0_5 + 0.000346320346320361*G0_1_0_0_1_0 + 0.000116341991341995*G0_1_0_0_1_1 - 0.00028138528138529*G0_1_0_0_1_3 - 0.000270562770562778*G0_1_0_0_1_4 - 0.000248917748917754*G0_1_0_0_2_0 + 0.000735930735930763*G0_1_0_0_2_2 - 0.000844155844155869*G0_1_0_0_2_4 - 0.000183982683982688*G0_1_0_0_2_5 - 0.00028138528138529*G0_1_0_0_3_1 - 0.000389610389610395*G0_1_0_0_3_3 + 0.000735930735930757*G0_1_0_0_3_4 + 0.000562770562770579*G0_1_0_0_3_5 + 0.00156926406926411*G0_1_0_0_4_0 - 0.000270562770562778*G0_1_0_0_4_1 - 0.000844155844155869*G0_1_0_0_4_2 + 0.000735930735930757*G0_1_0_0_4_3 + 0.00147186147186151*G0_1_0_0_4_4 + 0.000909090909090932*G0_1_0_0_4_5 - 0.00156926406926414*G0_1_0_0_5_0 - 0.000183982683982688*G0_1_0_0_5_2 + 0.000562770562770579*G0_1_0_0_5_3 + 0.000909090909090932*G0_1_0_0_5_4 - 0.00329004329004342*G0_1_0_0_5_5 + 0.000346320346320361*G0_1_0_1_0_0 + 0.000116341991341995*G0_1_0_1_0_1 - 0.00028138528138529*G0_1_0_1_0_3 - 0.000270562770562778*G0_1_0_1_0_4 + 0.000116341991341995*G0_1_0_1_1_0 - 0.00756087662337688*G0_1_0_1_1_1 - 0.000351731601731613*G0_1_0_1_1_3 - 0.000129870129870133*G0_1_0_1_1_4 - 0.000703463203463235*G0_1_0_1_1_5 + 0.00127299783549788*G0_1_0_1_2_2 - 0.000162337662337666*G0_1_0_1_2_3 - 0.000238095238095246*G0_1_0_1_2_5 - 0.00028138528138529*G0_1_0_1_3_0 - 0.000351731601731613*G0_1_0_1_3_1 - 0.000162337662337666*G0_1_0_1_3_2 + 0.00339826839826852*G0_1_0_1_3_3 + 0.000822510822510849*G0_1_0_1_3_4 + 0.00103896103896107*G0_1_0_1_3_5 - 0.000270562770562778*G0_1_0_1_4_0 - 0.000129870129870133*G0_1_0_1_4_1 + 0.000822510822510849*G0_1_0_1_4_3 + 0.000129870129870133*G0_1_0_1_4_4 + 0.00073593073593076*G0_1_0_1_4_5 - 0.000703463203463235*G0_1_0_1_5_1 - 0.000238095238095246*G0_1_0_1_5_2 + 0.00103896103896107*G0_1_0_1_5_3 + 0.00073593073593076*G0_1_0_1_5_4 + 0.00380952380952394*G0_1_0_1_5_5 - 0.000248917748917754*G0_1_0_2_0_0 + 0.000735930735930762*G0_1_0_2_0_2 - 0.000844155844155868*G0_1_0_2_0_4 - 0.000183982683982688*G0_1_0_2_0_5 + 0.00127299783549788*G0_1_0_2_1_2 - 0.000162337662337666*G0_1_0_2_1_3 - 0.000238095238095246*G0_1_0_2_1_5 + 0.000735930735930763*G0_1_0_2_2_0 + 0.00127299783549788*G0_1_0_2_2_1 - 0.0201501623376631*G0_1_0_2_2_2 - 0.00492424242424261*G0_1_0_2_2_3 - 0.00213744588744598*G0_1_0_2_2_4 - 0.000243506493506506*G0_1_0_2_2_5 - 0.000162337662337666*G0_1_0_2_3_1 - 0.00492424242424261*G0_1_0_2_3_2 - 0.00313852813852826*G0_1_0_2_3_3 + 0.000476190476190489*G0_1_0_2_3_5 - 0.000844155844155868*G0_1_0_2_4_0 - 0.00213744588744598*G0_1_0_2_4_2 + 0.0020346320346321*G0_1_0_2_4_4 + 0.000562770562770581*G0_1_0_2_4_5 - 0.000183982683982688*G0_1_0_2_5_0 - 0.000238095238095246*G0_1_0_2_5_1 - 0.000243506493506506*G0_1_0_2_5_2 + 0.000476190476190489*G0_1_0_2_5_3 + 0.000562770562770581*G0_1_0_2_5_4 + 0.000519480519480537*G0_1_0_2_5_5 - 0.00028138528138529*G0_1_0_3_0_1 - 0.000389610389610395*G0_1_0_3_0_3 + 0.000735930735930758*G0_1_0_3_0_4 + 0.000562770562770579*G0_1_0_3_0_5 - 0.00028138528138529*G0_1_0_3_1_0 - 0.000351731601731613*G0_1_0_3_1_1 - 0.000162337662337666*G0_1_0_3_1_2 + 0.00339826839826852*G0_1_0_3_1_3 + 0.00082251082251085*G0_1_0_3_1_4 + 0.00103896103896107*G0_1_0_3_1_5 - 0.000162337662337666*G0_1_0_3_2_1 - 0.00492424242424261*G0_1_0_3_2_2 - 0.00313852813852826*G0_1_0_3_2_3 + 0.000476190476190489*G0_1_0_3_2_5 - 0.000389610389610396*G0_1_0_3_3_0 + 0.00339826839826852*G0_1_0_3_3_1 - 0.00313852813852826*G0_1_0_3_3_2 + 0.0397402597402611*G0_1_0_3_3_3 - 0.000865800865800894*G0_1_0_3_3_4 - 0.000173160173160172*G0_1_0_3_3_5 + 0.000735930735930758*G0_1_0_3_4_0 + 0.000822510822510849*G0_1_0_3_4_1 - 0.000865800865800896*G0_1_0_3_4_3 - 0.00173160173160178*G0_1_0_3_4_4 - 0.00259740259740268*G0_1_0_3_4_5 + 0.000562770562770579*G0_1_0_3_5_0 + 0.00103896103896107*G0_1_0_3_5_1 + 0.000476190476190489*G0_1_0_3_5_2 - 0.000173160173160173*G0_1_0_3_5_3 - 0.00259740259740268*G0_1_0_3_5_4 - 0.00216450216450223*G0_1_0_3_5_5 + 0.00156926406926411*G0_1_0_4_0_0 - 0.000270562770562778*G0_1_0_4_0_1 - 0.000844155844155869*G0_1_0_4_0_2 + 0.000735930735930758*G0_1_0_4_0_3 + 0.00147186147186151*G0_1_0_4_0_4 + 0.000909090909090932*G0_1_0_4_0_5 - 0.000270562770562778*G0_1_0_4_1_0 - 0.000129870129870133*G0_1_0_4_1_1 + 0.000822510822510849*G0_1_0_4_1_3 + 0.000129870129870133*G0_1_0_4_1_4 + 0.00073593073593076*G0_1_0_4_1_5 - 0.000844155844155868*G0_1_0_4_2_0 - 0.00213744588744598*G0_1_0_4_2_2 + 0.0020346320346321*G0_1_0_4_2_4 + 0.000562770562770581*G0_1_0_4_2_5 + 0.000735930735930758*G0_1_0_4_3_0 + 0.000822510822510849*G0_1_0_4_3_1 - 0.000865800865800891*G0_1_0_4_3_3 - 0.00173160173160178*G0_1_0_4_3_4 - 0.00259740259740268*G0_1_0_4_3_5 + 0.00147186147186151*G0_1_0_4_4_0 + 0.000129870129870133*G0_1_0_4_4_1 + 0.0020346320346321*G0_1_0_4_4_2 - 0.00173160173160178*G0_1_0_4_4_3 + 0.0109090909090913*G0_1_0_4_4_4 - 0.00138528138528143*G0_1_0_4_4_5 + 0.000909090909090932*G0_1_0_4_5_0 + 0.00073593073593076*G0_1_0_4_5_1 + 0.000562770562770581*G0_1_0_4_5_2 - 0.00259740259740268*G0_1_0_4_5_3 - 0.00138528138528143*G0_1_0_4_5_4 - 0.00251082251082259*G0_1_0_4_5_5 - 0.00156926406926414*G0_1_0_5_0_0 - 0.000183982683982688*G0_1_0_5_0_2 + 0.000562770562770579*G0_1_0_5_0_3 + 0.000909090909090932*G0_1_0_5_0_4 - 0.00329004329004342*G0_1_0_5_0_5 - 0.000703463203463235*G0_1_0_5_1_1 - 0.000238095238095246*G0_1_0_5_1_2 + 0.00103896103896107*G0_1_0_5_1_3 + 0.00073593073593076*G0_1_0_5_1_4 + 0.00380952380952394*G0_1_0_5_1_5 - 0.000183982683982688*G0_1_0_5_2_0 - 0.000238095238095246*G0_1_0_5_2_1 - 0.000243506493506506*G0_1_0_5_2_2 + 0.000476190476190489*G0_1_0_5_2_3 + 0.000562770562770581*G0_1_0_5_2_4 + 0.000519480519480537*G0_1_0_5_2_5 + 0.000562770562770579*G0_1_0_5_3_0 + 0.00103896103896107*G0_1_0_5_3_1 + 0.000476190476190489*G0_1_0_5_3_2 - 0.000173160173160171*G0_1_0_5_3_3 - 0.00259740259740268*G0_1_0_5_3_4 - 0.00216450216450223*G0_1_0_5_3_5 + 0.000909090909090932*G0_1_0_5_4_0 + 0.00073593073593076*G0_1_0_5_4_1 + 0.000562770562770581*G0_1_0_5_4_2 - 0.00259740259740268*G0_1_0_5_4_3 - 0.00138528138528143*G0_1_0_5_4_4 - 0.00251082251082259*G0_1_0_5_4_5 - 0.00329004329004342*G0_1_0_5_5_0 + 0.00380952380952394*G0_1_0_5_5_1 + 0.000519480519480537*G0_1_0_5_5_2 - 0.00216450216450223*G0_1_0_5_5_3 - 0.00251082251082259*G0_1_0_5_5_4 + 0.000779220779220809*G0_1_0_5_5_5; + A[60] = -A[40] + 0.0668019480519504*G0_1_0_0_0_0 - 0.00531114718614737*G0_1_0_0_0_1 - 0.00252435064935074*G0_1_0_0_0_2 + 0.00134199134199138*G0_1_0_0_0_3 + 0.010119047619048*G0_1_0_0_0_4 + 0.0233225108225117*G0_1_0_0_0_5 - 0.00531114718614737*G0_1_0_0_1_0 + 0.000533008658008677*G0_1_0_0_1_1 + 0.000201569264069272*G0_1_0_0_1_2 + 0.000508658008658024*G0_1_0_0_1_3 - 0.00305194805194816*G0_1_0_0_1_5 - 0.00252435064935074*G0_1_0_0_2_0 + 0.000201569264069272*G0_1_0_0_2_1 - 0.000703463203463227*G0_1_0_0_2_2 - 0.000974025974026011*G0_1_0_0_2_5 + 0.00134199134199138*G0_1_0_0_3_0 + 0.000508658008658024*G0_1_0_0_3_1 - 0.000735930735930764*G0_1_0_0_3_3 - 0.00272727272727281*G0_1_0_0_3_4 - 0.000735930735930759*G0_1_0_0_3_5 + 0.010119047619048*G0_1_0_0_4_0 - 0.00272727272727281*G0_1_0_0_4_3 - 0.00753246753246776*G0_1_0_0_4_4 + 0.00190476190476198*G0_1_0_0_4_5 + 0.0233225108225117*G0_1_0_0_5_0 - 0.00305194805194816*G0_1_0_0_5_1 - 0.000974025974026011*G0_1_0_0_5_2 - 0.000735930735930759*G0_1_0_0_5_3 + 0.00190476190476198*G0_1_0_0_5_4 + 0.0206060606060614*G0_1_0_0_5_5 - 0.00531114718614737*G0_1_0_1_0_0 + 0.000533008658008677*G0_1_0_1_0_1 + 0.000201569264069272*G0_1_0_1_0_2 + 0.000508658008658024*G0_1_0_1_0_3 - 0.00305194805194816*G0_1_0_1_0_5 + 0.000533008658008677*G0_1_0_1_1_0 + 0.0074837662337665*G0_1_0_1_1_1 - 0.000162337662337668*G0_1_0_1_1_2 + 0.00067099567099569*G0_1_0_1_1_3 + 0.000854978354978382*G0_1_0_1_1_4 + 0.00160173160173167*G0_1_0_1_1_5 + 0.000201569264069272*G0_1_0_1_2_0 - 0.000162337662337668*G0_1_0_1_2_1 - 0.00119047619047623*G0_1_0_1_2_2 + 0.000487012987013005*G0_1_0_1_2_3 + 0.000681818181818205*G0_1_0_1_2_5 + 0.000508658008658024*G0_1_0_1_3_0 + 0.00067099567099569*G0_1_0_1_3_1 + 0.000487012987013005*G0_1_0_1_3_2 - 0.00441558441558457*G0_1_0_1_3_3 - 0.00272727272727282*G0_1_0_1_3_4 - 0.00238095238095246*G0_1_0_1_3_5 + 0.000854978354978382*G0_1_0_1_4_1 - 0.00272727272727282*G0_1_0_1_4_3 - 0.00385281385281398*G0_1_0_1_4_4 - 0.00307359307359318*G0_1_0_1_4_5 - 0.00305194805194816*G0_1_0_1_5_0 + 0.00160173160173166*G0_1_0_1_5_1 + 0.000681818181818205*G0_1_0_1_5_2 - 0.00238095238095246*G0_1_0_1_5_3 - 0.00307359307359318*G0_1_0_1_5_4 - 0.0105627705627709*G0_1_0_1_5_5 - 0.00252435064935074*G0_1_0_2_0_0 + 0.000201569264069272*G0_1_0_2_0_1 - 0.000703463203463227*G0_1_0_2_0_2 - 0.000974025974026011*G0_1_0_2_0_5 + 0.000201569264069272*G0_1_0_2_1_0 - 0.000162337662337668*G0_1_0_2_1_1 - 0.00119047619047623*G0_1_0_2_1_2 + 0.000487012987013005*G0_1_0_2_1_3 + 0.000681818181818205*G0_1_0_2_1_5 - 0.000703463203463227*G0_1_0_2_2_0 - 0.00119047619047623*G0_1_0_2_2_1 + 0.0183441558441565*G0_1_0_2_2_2 + 0.0043019480519482*G0_1_0_2_2_3 + 0.0028409090909092*G0_1_0_2_2_4 + 0.000514069264069285*G0_1_0_2_2_5 + 0.000487012987013005*G0_1_0_2_3_1 + 0.0043019480519482*G0_1_0_2_3_2 + 0.00173160173160179*G0_1_0_2_3_3 - 0.000108225108225109*G0_1_0_2_3_4 - 0.00108225108225112*G0_1_0_2_3_5 + 0.0028409090909092*G0_1_0_2_4_2 - 0.000108225108225109*G0_1_0_2_4_3 + 0.0036796536796538*G0_1_0_2_4_4 - 0.00108225108225112*G0_1_0_2_4_5 - 0.000974025974026011*G0_1_0_2_5_0 + 0.000681818181818205*G0_1_0_2_5_1 + 0.000514069264069285*G0_1_0_2_5_2 - 0.00108225108225112*G0_1_0_2_5_3 - 0.00108225108225112*G0_1_0_2_5_4 - 0.00216450216450224*G0_1_0_2_5_5 + 0.00134199134199138*G0_1_0_3_0_0 + 0.000508658008658024*G0_1_0_3_0_1 - 0.000735930735930764*G0_1_0_3_0_3 - 0.00272727272727281*G0_1_0_3_0_4 - 0.000735930735930759*G0_1_0_3_0_5 + 0.000508658008658024*G0_1_0_3_1_0 + 0.00067099567099569*G0_1_0_3_1_1 + 0.000487012987013005*G0_1_0_3_1_2 - 0.00441558441558457*G0_1_0_3_1_3 - 0.00272727272727282*G0_1_0_3_1_4 - 0.00238095238095246*G0_1_0_3_1_5 + 0.000487012987013005*G0_1_0_3_2_1 + 0.0043019480519482*G0_1_0_3_2_2 + 0.00173160173160179*G0_1_0_3_2_3 - 0.000108225108225109*G0_1_0_3_2_4 - 0.00108225108225112*G0_1_0_3_2_5 - 0.000735930735930763*G0_1_0_3_3_0 - 0.00441558441558457*G0_1_0_3_3_1 + 0.00173160173160179*G0_1_0_3_3_2 - 0.0400000000000014*G0_1_0_3_3_3 + 0.00692640692640714*G0_1_0_3_3_4 + 0.00363636363636374*G0_1_0_3_3_5 - 0.00272727272727281*G0_1_0_3_4_0 - 0.00272727272727282*G0_1_0_3_4_1 - 0.000108225108225109*G0_1_0_3_4_2 + 0.00692640692640715*G0_1_0_3_4_3 + 0.0131601731601736*G0_1_0_3_4_4 + 0.00761904761904787*G0_1_0_3_4_5 - 0.000735930735930759*G0_1_0_3_5_0 - 0.00238095238095246*G0_1_0_3_5_1 - 0.00108225108225112*G0_1_0_3_5_2 + 0.00363636363636374*G0_1_0_3_5_3 + 0.00761904761904787*G0_1_0_3_5_4 + 0.00580086580086599*G0_1_0_3_5_5 + 0.010119047619048*G0_1_0_4_0_0 - 0.00272727272727281*G0_1_0_4_0_3 - 0.00753246753246776*G0_1_0_4_0_4 + 0.00190476190476198*G0_1_0_4_0_5 + 0.000854978354978382*G0_1_0_4_1_1 - 0.00272727272727282*G0_1_0_4_1_3 - 0.00385281385281398*G0_1_0_4_1_4 - 0.00307359307359318*G0_1_0_4_1_5 + 0.0028409090909092*G0_1_0_4_2_2 - 0.000108225108225109*G0_1_0_4_2_3 + 0.0036796536796538*G0_1_0_4_2_4 - 0.00108225108225112*G0_1_0_4_2_5 - 0.00272727272727281*G0_1_0_4_3_0 - 0.00272727272727282*G0_1_0_4_3_1 - 0.000108225108225109*G0_1_0_4_3_2 + 0.00692640692640714*G0_1_0_4_3_3 + 0.0131601731601736*G0_1_0_4_3_4 + 0.00761904761904787*G0_1_0_4_3_5 - 0.00753246753246776*G0_1_0_4_4_0 - 0.00385281385281398*G0_1_0_4_4_1 + 0.0036796536796538*G0_1_0_4_4_2 + 0.0131601731601736*G0_1_0_4_4_3 + 0.0161038961038966*G0_1_0_4_4_4 + 0.0098701298701302*G0_1_0_4_4_5 + 0.00190476190476198*G0_1_0_4_5_0 - 0.00307359307359318*G0_1_0_4_5_1 - 0.00108225108225112*G0_1_0_4_5_2 + 0.00761904761904787*G0_1_0_4_5_3 + 0.0098701298701302*G0_1_0_4_5_4 + 0.0104761904761908*G0_1_0_4_5_5 + 0.0233225108225117*G0_1_0_5_0_0 - 0.00305194805194816*G0_1_0_5_0_1 - 0.000974025974026011*G0_1_0_5_0_2 - 0.000735930735930759*G0_1_0_5_0_3 + 0.00190476190476198*G0_1_0_5_0_4 + 0.0206060606060614*G0_1_0_5_0_5 - 0.00305194805194816*G0_1_0_5_1_0 + 0.00160173160173166*G0_1_0_5_1_1 + 0.000681818181818205*G0_1_0_5_1_2 - 0.00238095238095246*G0_1_0_5_1_3 - 0.00307359307359318*G0_1_0_5_1_4 - 0.0105627705627709*G0_1_0_5_1_5 - 0.000974025974026011*G0_1_0_5_2_0 + 0.000681818181818205*G0_1_0_5_2_1 + 0.000514069264069285*G0_1_0_5_2_2 - 0.00108225108225112*G0_1_0_5_2_3 - 0.00108225108225112*G0_1_0_5_2_4 - 0.00216450216450224*G0_1_0_5_2_5 - 0.000735930735930759*G0_1_0_5_3_0 - 0.00238095238095246*G0_1_0_5_3_1 - 0.00108225108225112*G0_1_0_5_3_2 + 0.00363636363636374*G0_1_0_5_3_3 + 0.00761904761904787*G0_1_0_5_3_4 + 0.00580086580086599*G0_1_0_5_3_5 + 0.00190476190476198*G0_1_0_5_4_0 - 0.00307359307359318*G0_1_0_5_4_1 - 0.00108225108225112*G0_1_0_5_4_2 + 0.00761904761904787*G0_1_0_5_4_3 + 0.0098701298701302*G0_1_0_5_4_4 + 0.0104761904761908*G0_1_0_5_4_5 + 0.0206060606060614*G0_1_0_5_5_0 - 0.0105627705627709*G0_1_0_5_5_1 - 0.00216450216450224*G0_1_0_5_5_2 + 0.00580086580086599*G0_1_0_5_5_3 + 0.0104761904761908*G0_1_0_5_5_4 + 0.0215584415584423*G0_1_0_5_5_5 + 0.0668019480519504*G0_1_1_0_0_0 - 0.00531114718614737*G0_1_1_0_0_1 - 0.00252435064935074*G0_1_1_0_0_2 + 0.00134199134199138*G0_1_1_0_0_3 + 0.010119047619048*G0_1_1_0_0_4 + 0.0233225108225117*G0_1_1_0_0_5 - 0.00531114718614737*G0_1_1_0_1_0 + 0.000533008658008677*G0_1_1_0_1_1 + 0.000201569264069272*G0_1_1_0_1_2 + 0.000508658008658024*G0_1_1_0_1_3 - 0.00305194805194817*G0_1_1_0_1_5 - 0.00252435064935074*G0_1_1_0_2_0 + 0.000201569264069272*G0_1_1_0_2_1 - 0.000703463203463227*G0_1_1_0_2_2 - 0.000974025974026011*G0_1_1_0_2_5 + 0.00134199134199138*G0_1_1_0_3_0 + 0.000508658008658024*G0_1_1_0_3_1 - 0.000735930735930762*G0_1_1_0_3_3 - 0.00272727272727281*G0_1_1_0_3_4 - 0.000735930735930759*G0_1_1_0_3_5 + 0.010119047619048*G0_1_1_0_4_0 - 0.00272727272727281*G0_1_1_0_4_3 - 0.00753246753246776*G0_1_1_0_4_4 + 0.00190476190476198*G0_1_1_0_4_5 + 0.0233225108225117*G0_1_1_0_5_0 - 0.00305194805194817*G0_1_1_0_5_1 - 0.000974025974026011*G0_1_1_0_5_2 - 0.000735930735930759*G0_1_1_0_5_3 + 0.00190476190476198*G0_1_1_0_5_4 + 0.0206060606060614*G0_1_1_0_5_5 - 0.00531114718614737*G0_1_1_1_0_0 + 0.000533008658008677*G0_1_1_1_0_1 + 0.000201569264069272*G0_1_1_1_0_2 + 0.000508658008658024*G0_1_1_1_0_3 - 0.00305194805194817*G0_1_1_1_0_5 + 0.000533008658008677*G0_1_1_1_1_0 + 0.00748376623376649*G0_1_1_1_1_1 - 0.000162337662337667*G0_1_1_1_1_2 + 0.000670995670995688*G0_1_1_1_1_3 + 0.000854978354978383*G0_1_1_1_1_4 + 0.00160173160173167*G0_1_1_1_1_5 + 0.000201569264069272*G0_1_1_1_2_0 - 0.000162337662337667*G0_1_1_1_2_1 - 0.00119047619047623*G0_1_1_1_2_2 + 0.000487012987013005*G0_1_1_1_2_3 + 0.000681818181818205*G0_1_1_1_2_5 + 0.000508658008658024*G0_1_1_1_3_0 + 0.000670995670995689*G0_1_1_1_3_1 + 0.000487012987013005*G0_1_1_1_3_2 - 0.00441558441558457*G0_1_1_1_3_3 - 0.00272727272727282*G0_1_1_1_3_4 - 0.00238095238095246*G0_1_1_1_3_5 + 0.000854978354978383*G0_1_1_1_4_1 - 0.00272727272727282*G0_1_1_1_4_3 - 0.00385281385281398*G0_1_1_1_4_4 - 0.00307359307359318*G0_1_1_1_4_5 - 0.00305194805194817*G0_1_1_1_5_0 + 0.00160173160173167*G0_1_1_1_5_1 + 0.000681818181818205*G0_1_1_1_5_2 - 0.00238095238095246*G0_1_1_1_5_3 - 0.00307359307359318*G0_1_1_1_5_4 - 0.0105627705627709*G0_1_1_1_5_5 - 0.00252435064935074*G0_1_1_2_0_0 + 0.000201569264069272*G0_1_1_2_0_1 - 0.000703463203463227*G0_1_1_2_0_2 - 0.000974025974026011*G0_1_1_2_0_5 + 0.000201569264069272*G0_1_1_2_1_0 - 0.000162337662337667*G0_1_1_2_1_1 - 0.00119047619047623*G0_1_1_2_1_2 + 0.000487012987013005*G0_1_1_2_1_3 + 0.000681818181818205*G0_1_1_2_1_5 - 0.000703463203463227*G0_1_1_2_2_0 - 0.00119047619047623*G0_1_1_2_2_1 + 0.0183441558441565*G0_1_1_2_2_2 + 0.0043019480519482*G0_1_1_2_2_3 + 0.0028409090909092*G0_1_1_2_2_4 + 0.000514069264069285*G0_1_1_2_2_5 + 0.000487012987013005*G0_1_1_2_3_1 + 0.0043019480519482*G0_1_1_2_3_2 + 0.00173160173160179*G0_1_1_2_3_3 - 0.000108225108225109*G0_1_1_2_3_4 - 0.00108225108225112*G0_1_1_2_3_5 + 0.0028409090909092*G0_1_1_2_4_2 - 0.000108225108225109*G0_1_1_2_4_3 + 0.0036796536796538*G0_1_1_2_4_4 - 0.00108225108225112*G0_1_1_2_4_5 - 0.000974025974026011*G0_1_1_2_5_0 + 0.000681818181818205*G0_1_1_2_5_1 + 0.000514069264069285*G0_1_1_2_5_2 - 0.00108225108225112*G0_1_1_2_5_3 - 0.00108225108225112*G0_1_1_2_5_4 - 0.00216450216450224*G0_1_1_2_5_5 + 0.00134199134199138*G0_1_1_3_0_0 + 0.000508658008658024*G0_1_1_3_0_1 - 0.000735930735930762*G0_1_1_3_0_3 - 0.00272727272727281*G0_1_1_3_0_4 - 0.000735930735930759*G0_1_1_3_0_5 + 0.000508658008658024*G0_1_1_3_1_0 + 0.000670995670995689*G0_1_1_3_1_1 + 0.000487012987013005*G0_1_1_3_1_2 - 0.00441558441558457*G0_1_1_3_1_3 - 0.00272727272727282*G0_1_1_3_1_4 - 0.00238095238095246*G0_1_1_3_1_5 + 0.000487012987013005*G0_1_1_3_2_1 + 0.0043019480519482*G0_1_1_3_2_2 + 0.00173160173160179*G0_1_1_3_2_3 - 0.000108225108225109*G0_1_1_3_2_4 - 0.00108225108225112*G0_1_1_3_2_5 - 0.000735930735930762*G0_1_1_3_3_0 - 0.00441558441558457*G0_1_1_3_3_1 + 0.00173160173160179*G0_1_1_3_3_2 - 0.0400000000000015*G0_1_1_3_3_3 + 0.00692640692640714*G0_1_1_3_3_4 + 0.00363636363636374*G0_1_1_3_3_5 - 0.00272727272727281*G0_1_1_3_4_0 - 0.00272727272727282*G0_1_1_3_4_1 - 0.000108225108225109*G0_1_1_3_4_2 + 0.00692640692640714*G0_1_1_3_4_3 + 0.0131601731601736*G0_1_1_3_4_4 + 0.00761904761904787*G0_1_1_3_4_5 - 0.000735930735930759*G0_1_1_3_5_0 - 0.00238095238095246*G0_1_1_3_5_1 - 0.00108225108225112*G0_1_1_3_5_2 + 0.00363636363636374*G0_1_1_3_5_3 + 0.00761904761904787*G0_1_1_3_5_4 + 0.00580086580086599*G0_1_1_3_5_5 + 0.010119047619048*G0_1_1_4_0_0 - 0.00272727272727281*G0_1_1_4_0_3 - 0.00753246753246776*G0_1_1_4_0_4 + 0.00190476190476198*G0_1_1_4_0_5 + 0.000854978354978383*G0_1_1_4_1_1 - 0.00272727272727282*G0_1_1_4_1_3 - 0.00385281385281398*G0_1_1_4_1_4 - 0.00307359307359318*G0_1_1_4_1_5 + 0.0028409090909092*G0_1_1_4_2_2 - 0.000108225108225109*G0_1_1_4_2_3 + 0.0036796536796538*G0_1_1_4_2_4 - 0.00108225108225112*G0_1_1_4_2_5 - 0.00272727272727281*G0_1_1_4_3_0 - 0.00272727272727282*G0_1_1_4_3_1 - 0.000108225108225109*G0_1_1_4_3_2 + 0.00692640692640714*G0_1_1_4_3_3 + 0.0131601731601736*G0_1_1_4_3_4 + 0.00761904761904787*G0_1_1_4_3_5 - 0.00753246753246776*G0_1_1_4_4_0 - 0.00385281385281398*G0_1_1_4_4_1 + 0.0036796536796538*G0_1_1_4_4_2 + 0.0131601731601736*G0_1_1_4_4_3 + 0.0161038961038966*G0_1_1_4_4_4 + 0.00987012987013021*G0_1_1_4_4_5 + 0.00190476190476198*G0_1_1_4_5_0 - 0.00307359307359318*G0_1_1_4_5_1 - 0.00108225108225112*G0_1_1_4_5_2 + 0.00761904761904787*G0_1_1_4_5_3 + 0.00987012987013021*G0_1_1_4_5_4 + 0.0104761904761908*G0_1_1_4_5_5 + 0.0233225108225117*G0_1_1_5_0_0 - 0.00305194805194817*G0_1_1_5_0_1 - 0.000974025974026011*G0_1_1_5_0_2 - 0.000735930735930759*G0_1_1_5_0_3 + 0.00190476190476198*G0_1_1_5_0_4 + 0.0206060606060614*G0_1_1_5_0_5 - 0.00305194805194817*G0_1_1_5_1_0 + 0.00160173160173167*G0_1_1_5_1_1 + 0.000681818181818205*G0_1_1_5_1_2 - 0.00238095238095246*G0_1_1_5_1_3 - 0.00307359307359318*G0_1_1_5_1_4 - 0.0105627705627709*G0_1_1_5_1_5 - 0.000974025974026011*G0_1_1_5_2_0 + 0.000681818181818205*G0_1_1_5_2_1 + 0.000514069264069285*G0_1_1_5_2_2 - 0.00108225108225112*G0_1_1_5_2_3 - 0.00108225108225112*G0_1_1_5_2_4 - 0.00216450216450224*G0_1_1_5_2_5 - 0.000735930735930759*G0_1_1_5_3_0 - 0.00238095238095246*G0_1_1_5_3_1 - 0.00108225108225112*G0_1_1_5_3_2 + 0.00363636363636374*G0_1_1_5_3_3 + 0.00761904761904787*G0_1_1_5_3_4 + 0.00580086580086599*G0_1_1_5_3_5 + 0.00190476190476198*G0_1_1_5_4_0 - 0.00307359307359318*G0_1_1_5_4_1 - 0.00108225108225112*G0_1_1_5_4_2 + 0.00761904761904787*G0_1_1_5_4_3 + 0.00987012987013021*G0_1_1_5_4_4 + 0.0104761904761908*G0_1_1_5_4_5 + 0.0206060606060614*G0_1_1_5_5_0 - 0.0105627705627709*G0_1_1_5_5_1 - 0.00216450216450224*G0_1_1_5_5_2 + 0.00580086580086599*G0_1_1_5_5_3 + 0.0104761904761908*G0_1_1_5_5_4 + 0.0215584415584424*G0_1_1_5_5_5; + A[71] = -A[41] + 0.0226379870129877*G0_0_0_0_0_0 - 0.00096590909090912*G0_0_0_0_0_1 - 0.00151515151515156*G0_0_0_0_0_2 + 0.000346320346320355*G0_0_0_0_0_3 + 0.00891774891774921*G0_0_0_0_0_4 + 0.00325757575757587*G0_0_0_0_0_5 - 0.00096590909090912*G0_0_0_0_1_0 - 0.00184523809523815*G0_0_0_0_1_1 + 0.000273268398268408*G0_0_0_0_1_2 - 0.000790043290043317*G0_0_0_0_1_3 - 0.000259740259740269*G0_0_0_0_1_4 + 0.000194805194805199*G0_0_0_0_1_5 - 0.00151515151515156*G0_0_0_0_2_0 + 0.000273268398268408*G0_0_0_0_2_1 - 0.00170183982683989*G0_0_0_0_2_2 - 0.00311688311688322*G0_0_0_0_2_4 - 0.000411255411255426*G0_0_0_0_2_5 + 0.000346320346320355*G0_0_0_0_3_0 - 0.000790043290043317*G0_0_0_0_3_1 - 0.000173160173160179*G0_0_0_0_3_4 + 0.000129870129870136*G0_0_0_0_3_5 + 0.00891774891774921*G0_0_0_0_4_0 - 0.000259740259740269*G0_0_0_0_4_1 - 0.00311688311688322*G0_0_0_0_4_2 - 0.000173160173160179*G0_0_0_0_4_3 + 0.00471861471861487*G0_0_0_0_4_4 + 0.00134199134199139*G0_0_0_0_4_5 + 0.00325757575757586*G0_0_0_0_5_0 + 0.000194805194805198*G0_0_0_0_5_1 - 0.000411255411255426*G0_0_0_0_5_2 + 0.000129870129870136*G0_0_0_0_5_3 + 0.00134199134199139*G0_0_0_0_5_4 + 0.00441558441558458*G0_0_0_0_5_5 - 0.00096590909090912*G0_0_0_1_0_0 - 0.00184523809523815*G0_0_0_1_0_1 + 0.000273268398268408*G0_0_0_1_0_2 - 0.000790043290043316*G0_0_0_1_0_3 - 0.000259740259740269*G0_0_0_1_0_4 + 0.000194805194805199*G0_0_0_1_0_5 - 0.00184523809523815*G0_0_0_1_1_0 + 0.058116883116885*G0_0_0_1_1_1 - 0.00403679653679667*G0_0_0_1_1_2 + 0.0173701298701305*G0_0_0_1_1_3 + 0.000768398268398289*G0_0_0_1_1_4 + 0.00730519480519508*G0_0_0_1_1_5 + 0.000273268398268408*G0_0_0_1_2_0 - 0.00403679653679667*G0_0_0_1_2_1 - 0.000349025974025987*G0_0_0_1_2_2 - 0.00201298701298708*G0_0_0_1_2_3 + 0.000119047619047619*G0_0_0_1_2_5 - 0.000790043290043317*G0_0_0_1_3_0 + 0.0173701298701305*G0_0_0_1_3_1 - 0.00201298701298708*G0_0_0_1_3_2 + 0.0161904761904768*G0_0_0_1_3_3 + 0.00134199134199141*G0_0_0_1_3_5 - 0.000259740259740269*G0_0_0_1_4_0 + 0.000768398268398289*G0_0_0_1_4_1 - 0.00264069264069273*G0_0_0_1_4_4 - 0.00177489177489183*G0_0_0_1_4_5 + 0.000194805194805199*G0_0_0_1_5_0 + 0.00730519480519508*G0_0_0_1_5_1 + 0.000119047619047619*G0_0_0_1_5_2 + 0.00134199134199141*G0_0_0_1_5_3 - 0.00177489177489183*G0_0_0_1_5_4 - 0.00718614718614743*G0_0_0_1_5_5 - 0.00151515151515156*G0_0_0_2_0_0 + 0.000273268398268408*G0_0_0_2_0_1 - 0.00170183982683989*G0_0_0_2_0_2 - 0.00311688311688322*G0_0_0_2_0_4 - 0.000411255411255427*G0_0_0_2_0_5 + 0.000273268398268408*G0_0_0_2_1_0 - 0.00403679653679667*G0_0_0_2_1_1 - 0.000349025974025987*G0_0_0_2_1_2 - 0.00201298701298709*G0_0_0_2_1_3 + 0.000119047619047619*G0_0_0_2_1_5 - 0.00170183982683989*G0_0_0_2_2_0 - 0.000349025974025987*G0_0_0_2_2_1 + 0.024366883116884*G0_0_0_2_2_2 + 0.00345238095238109*G0_0_0_2_2_3 + 0.00985930735930772*G0_0_0_2_2_4 + 0.000800865800865833*G0_0_0_2_2_5 - 0.00201298701298709*G0_0_0_2_3_1 + 0.00345238095238109*G0_0_0_2_3_2 - 0.00805194805194833*G0_0_0_2_3_3 - 0.00168831168831175*G0_0_0_2_3_5 - 0.00311688311688322*G0_0_0_2_4_0 + 0.00985930735930772*G0_0_0_2_4_2 + 0.0051082251082253*G0_0_0_2_4_4 - 0.00147186147186152*G0_0_0_2_4_5 - 0.000411255411255427*G0_0_0_2_5_0 + 0.000119047619047619*G0_0_0_2_5_1 + 0.000800865800865833*G0_0_0_2_5_2 - 0.00168831168831175*G0_0_0_2_5_3 - 0.00147186147186152*G0_0_0_2_5_4 - 0.00199134199134206*G0_0_0_2_5_5 + 0.000346320346320355*G0_0_0_3_0_0 - 0.000790043290043317*G0_0_0_3_0_1 - 0.000173160173160179*G0_0_0_3_0_4 + 0.000129870129870136*G0_0_0_3_0_5 - 0.000790043290043316*G0_0_0_3_1_0 + 0.0173701298701305*G0_0_0_3_1_1 - 0.00201298701298708*G0_0_0_3_1_2 + 0.0161904761904768*G0_0_0_3_1_3 + 0.00134199134199141*G0_0_0_3_1_5 - 0.00201298701298709*G0_0_0_3_2_1 + 0.00345238095238109*G0_0_0_3_2_2 - 0.00805194805194833*G0_0_0_3_2_3 - 0.00168831168831175*G0_0_0_3_2_5 + 0.0161904761904768*G0_0_0_3_3_1 - 0.00805194805194833*G0_0_0_3_3_2 + 0.000259740259740272*G0_0_0_3_3_3 - 0.000259740259740274*G0_0_0_3_3_4 + 0.00320346320346332*G0_0_0_3_3_5 - 0.000173160173160179*G0_0_0_3_4_0 - 0.000259740259740276*G0_0_0_3_4_3 + 0.00562770562770581*G0_0_0_3_4_4 + 0.00329004329004339*G0_0_0_3_4_5 + 0.000129870129870136*G0_0_0_3_5_0 + 0.00134199134199141*G0_0_0_3_5_1 - 0.00168831168831175*G0_0_0_3_5_2 + 0.00320346320346332*G0_0_0_3_5_3 + 0.00329004329004339*G0_0_0_3_5_4 + 0.00372294372294384*G0_0_0_3_5_5 + 0.00891774891774921*G0_0_0_4_0_0 - 0.000259740259740269*G0_0_0_4_0_1 - 0.00311688311688322*G0_0_0_4_0_2 - 0.000173160173160179*G0_0_0_4_0_3 + 0.00471861471861487*G0_0_0_4_0_4 + 0.00134199134199139*G0_0_0_4_0_5 - 0.000259740259740269*G0_0_0_4_1_0 + 0.000768398268398288*G0_0_0_4_1_1 - 0.00264069264069273*G0_0_0_4_1_4 - 0.00177489177489183*G0_0_0_4_1_5 - 0.00311688311688322*G0_0_0_4_2_0 + 0.00985930735930772*G0_0_0_4_2_2 + 0.0051082251082253*G0_0_0_4_2_4 - 0.00147186147186152*G0_0_0_4_2_5 - 0.000173160173160179*G0_0_0_4_3_0 - 0.000259740259740275*G0_0_0_4_3_3 + 0.00562770562770581*G0_0_0_4_3_4 + 0.00329004329004339*G0_0_0_4_3_5 + 0.00471861471861487*G0_0_0_4_4_0 - 0.00264069264069273*G0_0_0_4_4_1 + 0.0051082251082253*G0_0_0_4_4_2 + 0.00562770562770581*G0_0_0_4_4_3 + 0.053246753246755*G0_0_0_4_4_4 + 0.00822510822510849*G0_0_0_4_4_5 + 0.00134199134199139*G0_0_0_4_5_0 - 0.00177489177489183*G0_0_0_4_5_1 - 0.00147186147186152*G0_0_0_4_5_2 + 0.00329004329004339*G0_0_0_4_5_3 + 0.00822510822510849*G0_0_0_4_5_4 + 0.00753246753246778*G0_0_0_4_5_5 + 0.00325757575757586*G0_0_0_5_0_0 + 0.000194805194805198*G0_0_0_5_0_1 - 0.000411255411255427*G0_0_0_5_0_2 + 0.000129870129870136*G0_0_0_5_0_3 + 0.00134199134199139*G0_0_0_5_0_4 + 0.00441558441558458*G0_0_0_5_0_5 + 0.000194805194805198*G0_0_0_5_1_0 + 0.00730519480519508*G0_0_0_5_1_1 + 0.000119047619047619*G0_0_0_5_1_2 + 0.00134199134199141*G0_0_0_5_1_3 - 0.00177489177489183*G0_0_0_5_1_4 - 0.00718614718614743*G0_0_0_5_1_5 - 0.000411255411255427*G0_0_0_5_2_0 + 0.000119047619047619*G0_0_0_5_2_1 + 0.000800865800865833*G0_0_0_5_2_2 - 0.00168831168831175*G0_0_0_5_2_3 - 0.00147186147186152*G0_0_0_5_2_4 - 0.00199134199134206*G0_0_0_5_2_5 + 0.000129870129870136*G0_0_0_5_3_0 + 0.00134199134199141*G0_0_0_5_3_1 - 0.00168831168831175*G0_0_0_5_3_2 + 0.00320346320346332*G0_0_0_5_3_3 + 0.00329004329004339*G0_0_0_5_3_4 + 0.00372294372294384*G0_0_0_5_3_5 + 0.00134199134199139*G0_0_0_5_4_0 - 0.00177489177489183*G0_0_0_5_4_1 - 0.00147186147186152*G0_0_0_5_4_2 + 0.00329004329004339*G0_0_0_5_4_3 + 0.00822510822510849*G0_0_0_5_4_4 + 0.00753246753246778*G0_0_0_5_4_5 + 0.00441558441558458*G0_0_0_5_5_0 - 0.00718614718614743*G0_0_0_5_5_1 - 0.00199134199134206*G0_0_0_5_5_2 + 0.00372294372294384*G0_0_0_5_5_3 + 0.00753246753246778*G0_0_0_5_5_4 + 0.0049350649350651*G0_0_0_5_5_5 - 0.00172889610389617*G0_1_0_0_0_0 - 0.000616883116883138*G0_1_0_0_0_1 + 0.000186688311688319*G0_1_0_0_0_2 - 0.000454545454545466*G0_1_0_0_0_3 - 0.000941558441558474*G0_1_0_0_0_4 - 0.000194805194805194*G0_1_0_0_0_5 - 0.000616883116883138*G0_1_0_0_1_0 + 0.00219155844155852*G0_1_0_0_1_1 - 0.000909090909090939*G0_1_0_0_1_3 - 0.000194805194805202*G0_1_0_0_1_4 + 0.00220779220779228*G0_1_0_0_1_5 + 0.000186688311688319*G0_1_0_0_2_0 - 0.00018668831168832*G0_1_0_0_2_2 + 0.000454545454545469*G0_1_0_0_2_3 - 0.000454545454545471*G0_1_0_0_2_5 - 0.000454545454545466*G0_1_0_0_3_0 - 0.000909090909090939*G0_1_0_0_3_1 + 0.000454545454545469*G0_1_0_0_3_2 + 0.00207792207792213*G0_1_0_0_3_3 + 0.00129870129870134*G0_1_0_0_3_4 + 0.00181818181818188*G0_1_0_0_3_5 - 0.000941558441558474*G0_1_0_0_4_0 - 0.000194805194805202*G0_1_0_0_4_1 + 0.00129870129870134*G0_1_0_0_4_3 - 0.000389610389610407*G0_1_0_0_4_4 + 0.00129870129870134*G0_1_0_0_4_5 - 0.000194805194805194*G0_1_0_0_5_0 + 0.00220779220779228*G0_1_0_0_5_1 - 0.000454545454545471*G0_1_0_0_5_2 + 0.00181818181818188*G0_1_0_0_5_3 + 0.00129870129870134*G0_1_0_0_5_4 + 0.0124675324675329*G0_1_0_0_5_5 - 0.000616883116883138*G0_1_0_1_0_0 + 0.00219155844155852*G0_1_0_1_0_1 - 0.000909090909090939*G0_1_0_1_0_3 - 0.000194805194805202*G0_1_0_1_0_4 + 0.00220779220779228*G0_1_0_1_0_5 + 0.00219155844155852*G0_1_0_1_1_0 - 0.00219155844155852*G0_1_0_1_1_2 + 0.0100649350649354*G0_1_0_1_1_3 - 0.0100649350649354*G0_1_0_1_1_5 - 0.00219155844155852*G0_1_0_1_2_1 + 0.000616883116883138*G0_1_0_1_2_2 - 0.00220779220779229*G0_1_0_1_2_3 + 0.0001948051948052*G0_1_0_1_2_4 + 0.000909090909090938*G0_1_0_1_2_5 - 0.000909090909090939*G0_1_0_1_3_0 + 0.0100649350649354*G0_1_0_1_3_1 - 0.00220779220779229*G0_1_0_1_3_2 + 0.0233766233766242*G0_1_0_1_3_3 + 0.00181818181818188*G0_1_0_1_3_4 - 0.000194805194805202*G0_1_0_1_4_0 + 0.0001948051948052*G0_1_0_1_4_2 + 0.00181818181818188*G0_1_0_1_4_3 - 0.00181818181818188*G0_1_0_1_4_5 + 0.00220779220779228*G0_1_0_1_5_0 - 0.0100649350649354*G0_1_0_1_5_1 + 0.000909090909090938*G0_1_0_1_5_2 - 0.00181818181818188*G0_1_0_1_5_4 - 0.0233766233766242*G0_1_0_1_5_5 + 0.000186688311688319*G0_1_0_2_0_0 - 0.00018668831168832*G0_1_0_2_0_2 + 0.000454545454545469*G0_1_0_2_0_3 - 0.000454545454545471*G0_1_0_2_0_5 - 0.00219155844155852*G0_1_0_2_1_1 + 0.000616883116883138*G0_1_0_2_1_2 - 0.00220779220779229*G0_1_0_2_1_3 + 0.0001948051948052*G0_1_0_2_1_4 + 0.000909090909090938*G0_1_0_2_1_5 - 0.00018668831168832*G0_1_0_2_2_0 + 0.000616883116883138*G0_1_0_2_2_1 + 0.00172889610389619*G0_1_0_2_2_2 + 0.00019480519480521*G0_1_0_2_2_3 + 0.000941558441558483*G0_1_0_2_2_4 + 0.000454545454545472*G0_1_0_2_2_5 + 0.000454545454545469*G0_1_0_2_3_0 - 0.00220779220779229*G0_1_0_2_3_1 + 0.00019480519480521*G0_1_0_2_3_2 - 0.0124675324675329*G0_1_0_2_3_3 - 0.00129870129870134*G0_1_0_2_3_4 - 0.00181818181818189*G0_1_0_2_3_5 + 0.0001948051948052*G0_1_0_2_4_1 + 0.000941558441558483*G0_1_0_2_4_2 - 0.00129870129870134*G0_1_0_2_4_3 + 0.00038961038961041*G0_1_0_2_4_4 - 0.00129870129870134*G0_1_0_2_4_5 - 0.000454545454545471*G0_1_0_2_5_0 + 0.000909090909090938*G0_1_0_2_5_1 + 0.000454545454545472*G0_1_0_2_5_2 - 0.00181818181818189*G0_1_0_2_5_3 - 0.00129870129870134*G0_1_0_2_5_4 - 0.00207792207792215*G0_1_0_2_5_5 - 0.000454545454545466*G0_1_0_3_0_0 - 0.000909090909090939*G0_1_0_3_0_1 + 0.000454545454545469*G0_1_0_3_0_2 + 0.00207792207792213*G0_1_0_3_0_3 + 0.00129870129870134*G0_1_0_3_0_4 + 0.00181818181818188*G0_1_0_3_0_5 - 0.000909090909090939*G0_1_0_3_1_0 + 0.0100649350649354*G0_1_0_3_1_1 - 0.00220779220779229*G0_1_0_3_1_2 + 0.0233766233766242*G0_1_0_3_1_3 + 0.00181818181818188*G0_1_0_3_1_4 + 0.000454545454545469*G0_1_0_3_2_0 - 0.00220779220779229*G0_1_0_3_2_1 + 0.00019480519480521*G0_1_0_3_2_2 - 0.0124675324675329*G0_1_0_3_2_3 - 0.00129870129870134*G0_1_0_3_2_4 - 0.00181818181818189*G0_1_0_3_2_5 + 0.00207792207792213*G0_1_0_3_3_0 + 0.0233766233766242*G0_1_0_3_3_1 - 0.0124675324675329*G0_1_0_3_3_2 - 0.00467532467532471*G0_1_0_3_3_3 - 0.00779220779220803*G0_1_0_3_3_4 - 0.000519480519480501*G0_1_0_3_3_5 + 0.00129870129870134*G0_1_0_3_4_0 + 0.00181818181818188*G0_1_0_3_4_1 - 0.00129870129870134*G0_1_0_3_4_2 - 0.00779220779220803*G0_1_0_3_4_3 - 0.00259740259740268*G0_1_0_3_4_4 + 0.00181818181818188*G0_1_0_3_5_0 - 0.00181818181818189*G0_1_0_3_5_2 - 0.000519480519480501*G0_1_0_3_5_3 + 0.000519480519480552*G0_1_0_3_5_5 - 0.000941558441558475*G0_1_0_4_0_0 - 0.000194805194805202*G0_1_0_4_0_1 + 0.00129870129870134*G0_1_0_4_0_3 - 0.000389610389610407*G0_1_0_4_0_4 + 0.00129870129870134*G0_1_0_4_0_5 - 0.000194805194805202*G0_1_0_4_1_0 + 0.0001948051948052*G0_1_0_4_1_2 + 0.00181818181818188*G0_1_0_4_1_3 - 0.00181818181818188*G0_1_0_4_1_5 + 0.0001948051948052*G0_1_0_4_2_1 + 0.000941558441558483*G0_1_0_4_2_2 - 0.00129870129870134*G0_1_0_4_2_3 + 0.00038961038961041*G0_1_0_4_2_4 - 0.00129870129870134*G0_1_0_4_2_5 + 0.00129870129870134*G0_1_0_4_3_0 + 0.00181818181818188*G0_1_0_4_3_1 - 0.00129870129870134*G0_1_0_4_3_2 - 0.00779220779220803*G0_1_0_4_3_3 - 0.00259740259740267*G0_1_0_4_3_4 - 0.000389610389610407*G0_1_0_4_4_0 + 0.00038961038961041*G0_1_0_4_4_2 - 0.00259740259740268*G0_1_0_4_4_3 + 0.00259740259740269*G0_1_0_4_4_5 + 0.00129870129870134*G0_1_0_4_5_0 - 0.00181818181818188*G0_1_0_4_5_1 - 0.00129870129870134*G0_1_0_4_5_2 + 0.00259740259740269*G0_1_0_4_5_4 + 0.00779220779220808*G0_1_0_4_5_5 - 0.000194805194805194*G0_1_0_5_0_0 + 0.00220779220779228*G0_1_0_5_0_1 - 0.000454545454545471*G0_1_0_5_0_2 + 0.00181818181818188*G0_1_0_5_0_3 + 0.00129870129870134*G0_1_0_5_0_4 + 0.0124675324675329*G0_1_0_5_0_5 + 0.00220779220779228*G0_1_0_5_1_0 - 0.0100649350649354*G0_1_0_5_1_1 + 0.000909090909090938*G0_1_0_5_1_2 - 0.00181818181818188*G0_1_0_5_1_4 - 0.0233766233766242*G0_1_0_5_1_5 - 0.000454545454545471*G0_1_0_5_2_0 + 0.000909090909090938*G0_1_0_5_2_1 + 0.000454545454545472*G0_1_0_5_2_2 - 0.00181818181818189*G0_1_0_5_2_3 - 0.00129870129870134*G0_1_0_5_2_4 - 0.00207792207792215*G0_1_0_5_2_5 + 0.00181818181818188*G0_1_0_5_3_0 - 0.00181818181818189*G0_1_0_5_3_2 - 0.0005194805194805*G0_1_0_5_3_3 + 0.000519480519480552*G0_1_0_5_3_5 + 0.00129870129870134*G0_1_0_5_4_0 - 0.00181818181818188*G0_1_0_5_4_1 - 0.00129870129870134*G0_1_0_5_4_2 + 0.00259740259740269*G0_1_0_5_4_4 + 0.00779220779220808*G0_1_0_5_4_5 + 0.0124675324675329*G0_1_0_5_5_0 - 0.0233766233766242*G0_1_0_5_5_1 - 0.00207792207792215*G0_1_0_5_5_2 + 0.000519480519480552*G0_1_0_5_5_3 + 0.00779220779220808*G0_1_0_5_5_4 + 0.00467532467532491*G0_1_0_5_5_5; + A[57] = A[75] - 0.201623376623383*G0_0_1_0_0_0 + 0.0098620129870133*G0_0_1_0_0_1 + 0.00986201298701332*G0_0_1_0_0_2 - 0.00146103896103898*G0_0_1_0_0_3 - 0.0409090909090922*G0_0_1_0_0_4 - 0.0409090909090923*G0_0_1_0_0_5 + 0.0098620129870133*G0_0_1_0_1_0 - 0.000730519480519502*G0_0_1_0_1_1 - 0.000243506493506501*G0_0_1_0_1_2 - 0.000243506493506505*G0_0_1_0_1_3 + 0.000974025974025999*G0_0_1_0_1_4 + 0.00243506493506501*G0_0_1_0_1_5 + 0.00986201298701332*G0_0_1_0_2_0 - 0.000243506493506501*G0_0_1_0_2_1 - 0.000730519480519504*G0_0_1_0_2_2 - 0.000243506493506503*G0_0_1_0_2_3 + 0.00243506493506501*G0_0_1_0_2_4 + 0.000974025974026002*G0_0_1_0_2_5 - 0.00146103896103898*G0_0_1_0_3_0 - 0.000243506493506505*G0_0_1_0_3_1 - 0.000243506493506503*G0_0_1_0_3_2 + 0.000974025974026015*G0_0_1_0_3_4 + 0.000974025974026019*G0_0_1_0_3_5 - 0.0409090909090922*G0_0_1_0_4_0 + 0.000974025974025999*G0_0_1_0_4_1 + 0.00243506493506501*G0_0_1_0_4_2 + 0.000974025974026015*G0_0_1_0_4_3 - 0.00779220779220801*G0_0_1_0_4_4 - 0.00389610389610401*G0_0_1_0_4_5 - 0.0409090909090923*G0_0_1_0_5_0 + 0.00243506493506501*G0_0_1_0_5_1 + 0.000974025974026002*G0_0_1_0_5_2 + 0.000974025974026019*G0_0_1_0_5_3 - 0.00389610389610401*G0_0_1_0_5_4 - 0.007792207792208*G0_0_1_0_5_5 + 0.0098620129870133*G0_0_1_1_0_0 - 0.000730519480519502*G0_0_1_1_0_1 - 0.000243506493506501*G0_0_1_1_0_2 - 0.000243506493506505*G0_0_1_1_0_3 + 0.000974025974025999*G0_0_1_1_0_4 + 0.00243506493506501*G0_0_1_1_0_5 - 0.000730519480519502*G0_0_1_1_1_0 + 0.00178977272727275*G0_0_1_1_1_1 - 0.000572240259740279*G0_0_1_1_1_2 + 0.00185064935064941*G0_0_1_1_1_3 + 0.00180194805194811*G0_0_1_1_1_4 + 0.00228896103896112*G0_0_1_1_1_5 - 0.000243506493506501*G0_0_1_1_2_0 - 0.000572240259740279*G0_0_1_1_2_1 - 0.000572240259740279*G0_0_1_1_2_2 + 0.000194805194805202*G0_0_1_1_2_3 + 0.00180194805194812*G0_0_1_1_2_4 + 0.00180194805194811*G0_0_1_1_2_5 - 0.000243506493506505*G0_0_1_1_3_0 + 0.00185064935064941*G0_0_1_1_3_1 + 0.000194805194805202*G0_0_1_1_3_2 - 0.000389610389610381*G0_0_1_1_3_3 - 0.00311688311688322*G0_0_1_1_3_4 - 0.00311688311688322*G0_0_1_1_3_5 + 0.000974025974026*G0_0_1_1_4_0 + 0.00180194805194811*G0_0_1_1_4_1 + 0.00180194805194812*G0_0_1_1_4_2 - 0.00311688311688322*G0_0_1_1_4_3 - 0.0103246753246757*G0_0_1_1_4_4 - 0.00720779220779246*G0_0_1_1_4_5 + 0.00243506493506501*G0_0_1_1_5_0 + 0.00228896103896112*G0_0_1_1_5_1 + 0.00180194805194811*G0_0_1_1_5_2 - 0.00311688311688322*G0_0_1_1_5_3 - 0.00720779220779246*G0_0_1_1_5_4 - 0.0122727272727277*G0_0_1_1_5_5 + 0.00986201298701332*G0_0_1_2_0_0 - 0.000243506493506501*G0_0_1_2_0_1 - 0.000730519480519504*G0_0_1_2_0_2 - 0.000243506493506503*G0_0_1_2_0_3 + 0.00243506493506501*G0_0_1_2_0_4 + 0.000974025974026002*G0_0_1_2_0_5 - 0.000243506493506501*G0_0_1_2_1_0 - 0.000572240259740279*G0_0_1_2_1_1 - 0.000572240259740279*G0_0_1_2_1_2 + 0.000194805194805202*G0_0_1_2_1_3 + 0.00180194805194812*G0_0_1_2_1_4 + 0.00180194805194811*G0_0_1_2_1_5 - 0.000730519480519504*G0_0_1_2_2_0 - 0.000572240259740279*G0_0_1_2_2_1 + 0.00178977272727281*G0_0_1_2_2_2 + 0.00185064935064941*G0_0_1_2_2_3 + 0.00228896103896112*G0_0_1_2_2_4 + 0.00180194805194811*G0_0_1_2_2_5 - 0.000243506493506503*G0_0_1_2_3_0 + 0.000194805194805202*G0_0_1_2_3_1 + 0.00185064935064941*G0_0_1_2_3_2 - 0.000389610389610427*G0_0_1_2_3_3 - 0.00311688311688322*G0_0_1_2_3_4 - 0.00311688311688323*G0_0_1_2_3_5 + 0.00243506493506501*G0_0_1_2_4_0 + 0.00180194805194812*G0_0_1_2_4_1 + 0.00228896103896112*G0_0_1_2_4_2 - 0.00311688311688322*G0_0_1_2_4_3 - 0.0122727272727277*G0_0_1_2_4_4 - 0.00720779220779246*G0_0_1_2_4_5 + 0.000974025974026002*G0_0_1_2_5_0 + 0.00180194805194811*G0_0_1_2_5_1 + 0.00180194805194812*G0_0_1_2_5_2 - 0.00311688311688323*G0_0_1_2_5_3 - 0.00720779220779246*G0_0_1_2_5_4 - 0.0103246753246757*G0_0_1_2_5_5 - 0.00146103896103898*G0_0_1_3_0_0 - 0.000243506493506505*G0_0_1_3_0_1 - 0.000243506493506503*G0_0_1_3_0_2 + 0.000974025974026015*G0_0_1_3_0_4 + 0.000974025974026019*G0_0_1_3_0_5 - 0.000243506493506505*G0_0_1_3_1_0 + 0.00185064935064941*G0_0_1_3_1_1 + 0.000194805194805203*G0_0_1_3_1_2 - 0.000389610389610383*G0_0_1_3_1_3 - 0.00311688311688322*G0_0_1_3_1_4 - 0.00311688311688322*G0_0_1_3_1_5 - 0.000243506493506503*G0_0_1_3_2_0 + 0.000194805194805202*G0_0_1_3_2_1 + 0.00185064935064941*G0_0_1_3_2_2 - 0.000389610389610423*G0_0_1_3_2_3 - 0.00311688311688322*G0_0_1_3_2_4 - 0.00311688311688323*G0_0_1_3_2_5 - 0.000389610389610384*G0_0_1_3_3_1 - 0.000389610389610426*G0_0_1_3_3_2 + 0.0140259740259746*G0_0_1_3_3_3 + 0.00623376623376645*G0_0_1_3_3_4 + 0.00623376623376646*G0_0_1_3_3_5 + 0.000974025974026015*G0_0_1_3_4_0 - 0.00311688311688322*G0_0_1_3_4_1 - 0.00311688311688322*G0_0_1_3_4_2 + 0.00623376623376645*G0_0_1_3_4_3 + 0.0187012987012993*G0_0_1_3_4_4 + 0.0124675324675329*G0_0_1_3_4_5 + 0.000974025974026019*G0_0_1_3_5_0 - 0.00311688311688322*G0_0_1_3_5_1 - 0.00311688311688323*G0_0_1_3_5_2 + 0.00623376623376646*G0_0_1_3_5_3 + 0.0124675324675329*G0_0_1_3_5_4 + 0.0187012987012994*G0_0_1_3_5_5 - 0.0409090909090922*G0_0_1_4_0_0 + 0.000974025974025999*G0_0_1_4_0_1 + 0.00243506493506501*G0_0_1_4_0_2 + 0.000974025974026015*G0_0_1_4_0_3 - 0.00779220779220801*G0_0_1_4_0_4 - 0.00389610389610401*G0_0_1_4_0_5 + 0.000974025974025999*G0_0_1_4_1_0 + 0.00180194805194811*G0_0_1_4_1_1 + 0.00180194805194811*G0_0_1_4_1_2 - 0.00311688311688322*G0_0_1_4_1_3 - 0.0103246753246757*G0_0_1_4_1_4 - 0.00720779220779246*G0_0_1_4_1_5 + 0.00243506493506501*G0_0_1_4_2_0 + 0.00180194805194812*G0_0_1_4_2_1 + 0.00228896103896112*G0_0_1_4_2_2 - 0.00311688311688322*G0_0_1_4_2_3 - 0.0122727272727277*G0_0_1_4_2_4 - 0.00720779220779246*G0_0_1_4_2_5 + 0.000974025974026015*G0_0_1_4_3_0 - 0.00311688311688322*G0_0_1_4_3_1 - 0.00311688311688322*G0_0_1_4_3_2 + 0.00623376623376645*G0_0_1_4_3_3 + 0.0187012987012993*G0_0_1_4_3_4 + 0.0124675324675329*G0_0_1_4_3_5 - 0.00779220779220801*G0_0_1_4_4_0 - 0.0103246753246757*G0_0_1_4_4_1 - 0.0122727272727277*G0_0_1_4_4_2 + 0.0187012987012993*G0_0_1_4_4_3 + 0.105194805194809*G0_0_1_4_4_4 + 0.0350649350649363*G0_0_1_4_4_5 - 0.00389610389610401*G0_0_1_4_5_0 - 0.00720779220779246*G0_0_1_4_5_1 - 0.00720779220779246*G0_0_1_4_5_2 + 0.0124675324675329*G0_0_1_4_5_3 + 0.0350649350649363*G0_0_1_4_5_4 + 0.0350649350649363*G0_0_1_4_5_5 - 0.0409090909090923*G0_0_1_5_0_0 + 0.00243506493506501*G0_0_1_5_0_1 + 0.000974025974026002*G0_0_1_5_0_2 + 0.000974025974026018*G0_0_1_5_0_3 - 0.00389610389610401*G0_0_1_5_0_4 - 0.007792207792208*G0_0_1_5_0_5 + 0.00243506493506501*G0_0_1_5_1_0 + 0.00228896103896112*G0_0_1_5_1_1 + 0.00180194805194811*G0_0_1_5_1_2 - 0.00311688311688322*G0_0_1_5_1_3 - 0.00720779220779246*G0_0_1_5_1_4 - 0.0122727272727277*G0_0_1_5_1_5 + 0.000974025974026002*G0_0_1_5_2_0 + 0.00180194805194811*G0_0_1_5_2_1 + 0.00180194805194812*G0_0_1_5_2_2 - 0.00311688311688323*G0_0_1_5_2_3 - 0.00720779220779246*G0_0_1_5_2_4 - 0.0103246753246757*G0_0_1_5_2_5 + 0.000974025974026019*G0_0_1_5_3_0 - 0.00311688311688322*G0_0_1_5_3_1 - 0.00311688311688323*G0_0_1_5_3_2 + 0.00623376623376646*G0_0_1_5_3_3 + 0.0124675324675329*G0_0_1_5_3_4 + 0.0187012987012994*G0_0_1_5_3_5 - 0.00389610389610401*G0_0_1_5_4_0 - 0.00720779220779246*G0_0_1_5_4_1 - 0.00720779220779246*G0_0_1_5_4_2 + 0.0124675324675329*G0_0_1_5_4_3 + 0.0350649350649363*G0_0_1_5_4_4 + 0.0350649350649363*G0_0_1_5_4_5 - 0.007792207792208*G0_0_1_5_5_0 - 0.0122727272727277*G0_0_1_5_5_1 - 0.0103246753246757*G0_0_1_5_5_2 + 0.0187012987012994*G0_0_1_5_5_3 + 0.0350649350649363*G0_0_1_5_5_4 + 0.105194805194809*G0_0_1_5_5_5 + 0.201623376623383*G0_1_0_0_0_0 - 0.0098620129870133*G0_1_0_0_0_1 - 0.00986201298701332*G0_1_0_0_0_2 + 0.00146103896103898*G0_1_0_0_0_3 + 0.0409090909090922*G0_1_0_0_0_4 + 0.0409090909090923*G0_1_0_0_0_5 - 0.0098620129870133*G0_1_0_0_1_0 + 0.000730519480519502*G0_1_0_0_1_1 + 0.000243506493506501*G0_1_0_0_1_2 + 0.000243506493506505*G0_1_0_0_1_3 - 0.000974025974026*G0_1_0_0_1_4 - 0.00243506493506501*G0_1_0_0_1_5 - 0.00986201298701332*G0_1_0_0_2_0 + 0.000243506493506501*G0_1_0_0_2_1 + 0.000730519480519504*G0_1_0_0_2_2 + 0.000243506493506503*G0_1_0_0_2_3 - 0.00243506493506501*G0_1_0_0_2_4 - 0.000974025974026003*G0_1_0_0_2_5 + 0.00146103896103898*G0_1_0_0_3_0 + 0.000243506493506505*G0_1_0_0_3_1 + 0.000243506493506503*G0_1_0_0_3_2 - 0.000974025974026015*G0_1_0_0_3_4 - 0.000974025974026019*G0_1_0_0_3_5 + 0.0409090909090922*G0_1_0_0_4_0 - 0.000974025974026*G0_1_0_0_4_1 - 0.00243506493506501*G0_1_0_0_4_2 - 0.000974025974026015*G0_1_0_0_4_3 + 0.00779220779220801*G0_1_0_0_4_4 + 0.00389610389610401*G0_1_0_0_4_5 + 0.0409090909090923*G0_1_0_0_5_0 - 0.00243506493506501*G0_1_0_0_5_1 - 0.000974025974026002*G0_1_0_0_5_2 - 0.000974025974026019*G0_1_0_0_5_3 + 0.00389610389610401*G0_1_0_0_5_4 + 0.007792207792208*G0_1_0_0_5_5 - 0.0098620129870133*G0_1_0_1_0_0 + 0.000730519480519502*G0_1_0_1_0_1 + 0.000243506493506501*G0_1_0_1_0_2 + 0.000243506493506505*G0_1_0_1_0_3 - 0.000974025974026*G0_1_0_1_0_4 - 0.00243506493506501*G0_1_0_1_0_5 + 0.000730519480519502*G0_1_0_1_1_0 - 0.00178977272727275*G0_1_0_1_1_1 + 0.000572240259740279*G0_1_0_1_1_2 - 0.00185064935064941*G0_1_0_1_1_3 - 0.00180194805194811*G0_1_0_1_1_4 - 0.00228896103896112*G0_1_0_1_1_5 + 0.000243506493506501*G0_1_0_1_2_0 + 0.000572240259740279*G0_1_0_1_2_1 + 0.000572240259740279*G0_1_0_1_2_2 - 0.000194805194805202*G0_1_0_1_2_3 - 0.00180194805194812*G0_1_0_1_2_4 - 0.00180194805194811*G0_1_0_1_2_5 + 0.000243506493506505*G0_1_0_1_3_0 - 0.00185064935064941*G0_1_0_1_3_1 - 0.000194805194805203*G0_1_0_1_3_2 + 0.000389610389610383*G0_1_0_1_3_3 + 0.00311688311688322*G0_1_0_1_3_4 + 0.00311688311688322*G0_1_0_1_3_5 - 0.000974025974026*G0_1_0_1_4_0 - 0.00180194805194811*G0_1_0_1_4_1 - 0.00180194805194811*G0_1_0_1_4_2 + 0.00311688311688322*G0_1_0_1_4_3 + 0.0103246753246757*G0_1_0_1_4_4 + 0.00720779220779246*G0_1_0_1_4_5 - 0.00243506493506501*G0_1_0_1_5_0 - 0.00228896103896112*G0_1_0_1_5_1 - 0.00180194805194811*G0_1_0_1_5_2 + 0.00311688311688322*G0_1_0_1_5_3 + 0.00720779220779246*G0_1_0_1_5_4 + 0.0122727272727277*G0_1_0_1_5_5 - 0.00986201298701332*G0_1_0_2_0_0 + 0.000243506493506501*G0_1_0_2_0_1 + 0.000730519480519504*G0_1_0_2_0_2 + 0.000243506493506503*G0_1_0_2_0_3 - 0.00243506493506501*G0_1_0_2_0_4 - 0.000974025974026003*G0_1_0_2_0_5 + 0.000243506493506501*G0_1_0_2_1_0 + 0.000572240259740279*G0_1_0_2_1_1 + 0.000572240259740278*G0_1_0_2_1_2 - 0.000194805194805202*G0_1_0_2_1_3 - 0.00180194805194811*G0_1_0_2_1_4 - 0.00180194805194811*G0_1_0_2_1_5 + 0.000730519480519504*G0_1_0_2_2_0 + 0.000572240259740278*G0_1_0_2_2_1 - 0.00178977272727281*G0_1_0_2_2_2 - 0.00185064935064941*G0_1_0_2_2_3 - 0.00228896103896112*G0_1_0_2_2_4 - 0.00180194805194811*G0_1_0_2_2_5 + 0.000243506493506503*G0_1_0_2_3_0 - 0.000194805194805203*G0_1_0_2_3_1 - 0.00185064935064941*G0_1_0_2_3_2 + 0.000389610389610427*G0_1_0_2_3_3 + 0.00311688311688322*G0_1_0_2_3_4 + 0.00311688311688323*G0_1_0_2_3_5 - 0.00243506493506501*G0_1_0_2_4_0 - 0.00180194805194811*G0_1_0_2_4_1 - 0.00228896103896112*G0_1_0_2_4_2 + 0.00311688311688322*G0_1_0_2_4_3 + 0.0122727272727277*G0_1_0_2_4_4 + 0.00720779220779246*G0_1_0_2_4_5 - 0.000974025974026003*G0_1_0_2_5_0 - 0.00180194805194811*G0_1_0_2_5_1 - 0.00180194805194811*G0_1_0_2_5_2 + 0.00311688311688323*G0_1_0_2_5_3 + 0.00720779220779246*G0_1_0_2_5_4 + 0.0103246753246757*G0_1_0_2_5_5 + 0.00146103896103898*G0_1_0_3_0_0 + 0.000243506493506505*G0_1_0_3_0_1 + 0.000243506493506503*G0_1_0_3_0_2 - 0.000974025974026015*G0_1_0_3_0_4 - 0.000974025974026019*G0_1_0_3_0_5 + 0.000243506493506505*G0_1_0_3_1_0 - 0.00185064935064941*G0_1_0_3_1_1 - 0.000194805194805202*G0_1_0_3_1_2 + 0.000389610389610383*G0_1_0_3_1_3 + 0.00311688311688322*G0_1_0_3_1_4 + 0.00311688311688322*G0_1_0_3_1_5 + 0.000243506493506503*G0_1_0_3_2_0 - 0.000194805194805202*G0_1_0_3_2_1 - 0.00185064935064941*G0_1_0_3_2_2 + 0.000389610389610425*G0_1_0_3_2_3 + 0.00311688311688322*G0_1_0_3_2_4 + 0.00311688311688323*G0_1_0_3_2_5 + 0.000389610389610384*G0_1_0_3_3_1 + 0.000389610389610426*G0_1_0_3_3_2 - 0.0140259740259745*G0_1_0_3_3_3 - 0.00623376623376645*G0_1_0_3_3_4 - 0.00623376623376646*G0_1_0_3_3_5 - 0.000974025974026015*G0_1_0_3_4_0 + 0.00311688311688322*G0_1_0_3_4_1 + 0.00311688311688322*G0_1_0_3_4_2 - 0.00623376623376645*G0_1_0_3_4_3 - 0.0187012987012993*G0_1_0_3_4_4 - 0.0124675324675329*G0_1_0_3_4_5 - 0.000974025974026019*G0_1_0_3_5_0 + 0.00311688311688322*G0_1_0_3_5_1 + 0.00311688311688323*G0_1_0_3_5_2 - 0.00623376623376646*G0_1_0_3_5_3 - 0.0124675324675329*G0_1_0_3_5_4 - 0.0187012987012994*G0_1_0_3_5_5 + 0.0409090909090922*G0_1_0_4_0_0 - 0.000974025974026*G0_1_0_4_0_1 - 0.00243506493506501*G0_1_0_4_0_2 - 0.000974025974026015*G0_1_0_4_0_3 + 0.00779220779220802*G0_1_0_4_0_4 + 0.00389610389610401*G0_1_0_4_0_5 - 0.000974025974026*G0_1_0_4_1_0 - 0.00180194805194811*G0_1_0_4_1_1 - 0.00180194805194812*G0_1_0_4_1_2 + 0.00311688311688322*G0_1_0_4_1_3 + 0.0103246753246757*G0_1_0_4_1_4 + 0.00720779220779246*G0_1_0_4_1_5 - 0.00243506493506501*G0_1_0_4_2_0 - 0.00180194805194811*G0_1_0_4_2_1 - 0.00228896103896112*G0_1_0_4_2_2 + 0.00311688311688322*G0_1_0_4_2_3 + 0.0122727272727277*G0_1_0_4_2_4 + 0.00720779220779246*G0_1_0_4_2_5 - 0.000974025974026016*G0_1_0_4_3_0 + 0.00311688311688322*G0_1_0_4_3_1 + 0.00311688311688322*G0_1_0_4_3_2 - 0.00623376623376645*G0_1_0_4_3_3 - 0.0187012987012993*G0_1_0_4_3_4 - 0.0124675324675329*G0_1_0_4_3_5 + 0.00779220779220801*G0_1_0_4_4_0 + 0.0103246753246757*G0_1_0_4_4_1 + 0.0122727272727277*G0_1_0_4_4_2 - 0.0187012987012993*G0_1_0_4_4_3 - 0.105194805194809*G0_1_0_4_4_4 - 0.0350649350649363*G0_1_0_4_4_5 + 0.00389610389610401*G0_1_0_4_5_0 + 0.00720779220779246*G0_1_0_4_5_1 + 0.00720779220779246*G0_1_0_4_5_2 - 0.0124675324675329*G0_1_0_4_5_3 - 0.0350649350649363*G0_1_0_4_5_4 - 0.0350649350649363*G0_1_0_4_5_5 + 0.0409090909090923*G0_1_0_5_0_0 - 0.00243506493506501*G0_1_0_5_0_1 - 0.000974025974026002*G0_1_0_5_0_2 - 0.000974025974026019*G0_1_0_5_0_3 + 0.00389610389610401*G0_1_0_5_0_4 + 0.007792207792208*G0_1_0_5_0_5 - 0.00243506493506501*G0_1_0_5_1_0 - 0.00228896103896112*G0_1_0_5_1_1 - 0.00180194805194811*G0_1_0_5_1_2 + 0.00311688311688322*G0_1_0_5_1_3 + 0.00720779220779246*G0_1_0_5_1_4 + 0.0122727272727277*G0_1_0_5_1_5 - 0.000974025974026003*G0_1_0_5_2_0 - 0.00180194805194811*G0_1_0_5_2_1 - 0.00180194805194811*G0_1_0_5_2_2 + 0.00311688311688323*G0_1_0_5_2_3 + 0.00720779220779246*G0_1_0_5_2_4 + 0.0103246753246757*G0_1_0_5_2_5 - 0.000974025974026018*G0_1_0_5_3_0 + 0.00311688311688322*G0_1_0_5_3_1 + 0.00311688311688323*G0_1_0_5_3_2 - 0.00623376623376646*G0_1_0_5_3_3 - 0.0124675324675329*G0_1_0_5_3_4 - 0.0187012987012994*G0_1_0_5_3_5 + 0.00389610389610401*G0_1_0_5_4_0 + 0.00720779220779246*G0_1_0_5_4_1 + 0.00720779220779246*G0_1_0_5_4_2 - 0.0124675324675329*G0_1_0_5_4_3 - 0.0350649350649363*G0_1_0_5_4_4 - 0.0350649350649363*G0_1_0_5_4_5 + 0.007792207792208*G0_1_0_5_5_0 + 0.0122727272727277*G0_1_0_5_5_1 + 0.0103246753246757*G0_1_0_5_5_2 - 0.0187012987012994*G0_1_0_5_5_3 - 0.0350649350649363*G0_1_0_5_5_4 - 0.105194805194809*G0_1_0_5_5_5; + A[13] = -A[15] - 0.0061120129870132*G0_0_0_0_0_0 + 0.000771103896103921*G0_0_0_0_0_1 + 0.000698051948051973*G0_0_0_0_0_2 - 0.000162337662337665*G0_0_0_0_0_3 - 0.00633116883116904*G0_0_0_0_0_4 - 0.000649350649350674*G0_0_0_0_0_5 + 0.000771103896103921*G0_0_0_0_1_0 - 0.00230519480519488*G0_0_0_0_1_1 + 0.000292207792207803*G0_0_0_0_1_2 - 0.00246753246753255*G0_0_0_0_1_3 - 0.000162337662337665*G0_0_0_0_1_4 - 0.00175324675324681*G0_0_0_0_1_5 + 0.000698051948051973*G0_0_0_0_2_0 + 0.000292207792207803*G0_0_0_0_2_1 + 0.000511363636363653*G0_0_0_0_2_2 + 0.00113636363636367*G0_0_0_0_2_3 + 0.00337662337662349*G0_0_0_0_2_4 + 0.000681818181818205*G0_0_0_0_2_5 - 0.000162337662337665*G0_0_0_0_3_0 - 0.00246753246753255*G0_0_0_0_3_1 + 0.00113636363636367*G0_0_0_0_3_2 - 0.000259740259740283*G0_0_0_0_3_3 + 0.000649350649350666*G0_0_0_0_3_4 - 0.00103896103896108*G0_0_0_0_3_5 - 0.00633116883116904*G0_0_0_0_4_0 - 0.000162337662337665*G0_0_0_0_4_1 + 0.00337662337662349*G0_0_0_0_4_2 + 0.000649350649350666*G0_0_0_0_4_3 - 0.00506493506493525*G0_0_0_0_4_4 - 0.00103896103896108*G0_0_0_0_4_5 - 0.000649350649350674*G0_0_0_0_5_0 - 0.00175324675324681*G0_0_0_0_5_1 + 0.000681818181818205*G0_0_0_0_5_2 - 0.00103896103896108*G0_0_0_0_5_3 - 0.00103896103896108*G0_0_0_0_5_4 - 0.00155844155844161*G0_0_0_0_5_5 + 0.000771103896103921*G0_0_0_1_0_0 - 0.00230519480519488*G0_0_0_1_0_1 + 0.000292207792207803*G0_0_0_1_0_2 - 0.00246753246753255*G0_0_0_1_0_3 - 0.000162337662337666*G0_0_0_1_0_4 - 0.00175324675324681*G0_0_0_1_0_5 - 0.00230519480519488*G0_0_0_1_1_0 + 0.0304383116883127*G0_0_0_1_1_1 - 0.0044967532467534*G0_0_0_1_1_2 + 0.0194805194805202*G0_0_0_1_1_3 + 0.00103896103896107*G0_0_0_1_1_4 + 0.00941558441558475*G0_0_0_1_1_5 + 0.000292207792207803*G0_0_0_1_2_0 - 0.0044967532467534*G0_0_0_1_2_1 + 0.00138798701298706*G0_0_0_1_2_2 - 0.0039610389610391*G0_0_0_1_2_3 - 0.00155844155844162*G0_0_0_1_2_5 - 0.00246753246753255*G0_0_0_1_3_0 + 0.0194805194805202*G0_0_0_1_3_1 - 0.0039610389610391*G0_0_0_1_3_2 + 0.0296103896103907*G0_0_0_1_3_3 + 0.00285714285714295*G0_0_0_1_3_4 + 0.00805194805194835*G0_0_0_1_3_5 - 0.000162337662337665*G0_0_0_1_4_0 + 0.00103896103896107*G0_0_0_1_4_1 + 0.00285714285714295*G0_0_0_1_4_3 + 0.00376623376623388*G0_0_0_1_4_4 + 0.00103896103896107*G0_0_0_1_4_5 - 0.00175324675324681*G0_0_0_1_5_0 + 0.00941558441558475*G0_0_0_1_5_1 - 0.00155844155844162*G0_0_0_1_5_2 + 0.00805194805194835*G0_0_0_1_5_3 + 0.00103896103896107*G0_0_0_1_5_4 + 0.00623376623376645*G0_0_0_1_5_5 + 0.000698051948051973*G0_0_0_2_0_0 + 0.000292207792207803*G0_0_0_2_0_1 + 0.000511363636363653*G0_0_0_2_0_2 + 0.00113636363636367*G0_0_0_2_0_3 + 0.00337662337662349*G0_0_0_2_0_4 + 0.000681818181818205*G0_0_0_2_0_5 + 0.000292207792207803*G0_0_0_2_1_0 - 0.0044967532467534*G0_0_0_2_1_1 + 0.00138798701298706*G0_0_0_2_1_2 - 0.00396103896103911*G0_0_0_2_1_3 - 0.00155844155844162*G0_0_0_2_1_5 + 0.000511363636363653*G0_0_0_2_2_0 + 0.00138798701298706*G0_0_0_2_2_1 - 0.00438311688311702*G0_0_0_2_2_2 - 0.000454545454545464*G0_0_0_2_2_3 - 0.00538961038961057*G0_0_0_2_2_4 + 0.000292207792207803*G0_0_0_2_2_5 + 0.00113636363636367*G0_0_0_2_3_0 - 0.00396103896103911*G0_0_0_2_3_1 - 0.000454545454545464*G0_0_0_2_3_2 - 0.0140259740259745*G0_0_0_2_3_3 - 0.00233766233766242*G0_0_0_2_3_4 - 0.00285714285714296*G0_0_0_2_3_5 + 0.00337662337662349*G0_0_0_2_4_0 - 0.00538961038961057*G0_0_0_2_4_2 - 0.00233766233766242*G0_0_0_2_4_3 - 0.00467532467532484*G0_0_0_2_4_4 - 0.000649350649350675*G0_0_0_2_4_5 + 0.000681818181818205*G0_0_0_2_5_0 - 0.00155844155844162*G0_0_0_2_5_1 + 0.000292207792207803*G0_0_0_2_5_2 - 0.00285714285714296*G0_0_0_2_5_3 - 0.000649350649350675*G0_0_0_2_5_4 - 0.00233766233766242*G0_0_0_2_5_5 - 0.000162337662337665*G0_0_0_3_0_0 - 0.00246753246753255*G0_0_0_3_0_1 + 0.00113636363636367*G0_0_0_3_0_2 - 0.000259740259740283*G0_0_0_3_0_3 + 0.000649350649350666*G0_0_0_3_0_4 - 0.00103896103896108*G0_0_0_3_0_5 - 0.00246753246753255*G0_0_0_3_1_0 + 0.0194805194805202*G0_0_0_3_1_1 - 0.00396103896103911*G0_0_0_3_1_2 + 0.0296103896103907*G0_0_0_3_1_3 + 0.00285714285714295*G0_0_0_3_1_4 + 0.00805194805194835*G0_0_0_3_1_5 + 0.00113636363636367*G0_0_0_3_2_0 - 0.00396103896103911*G0_0_0_3_2_1 - 0.000454545454545464*G0_0_0_3_2_2 - 0.0140259740259745*G0_0_0_3_2_3 - 0.00233766233766242*G0_0_0_3_2_4 - 0.00285714285714296*G0_0_0_3_2_5 - 0.000259740259740283*G0_0_0_3_3_0 + 0.0296103896103907*G0_0_0_3_3_1 - 0.0140259740259745*G0_0_0_3_3_2 + 0.00935064935064981*G0_0_0_3_3_3 - 0.00519480519480534*G0_0_0_3_3_4 + 0.00623376623376649*G0_0_0_3_3_5 + 0.000649350649350667*G0_0_0_3_4_0 + 0.00285714285714295*G0_0_0_3_4_1 - 0.00233766233766242*G0_0_0_3_4_2 - 0.00519480519480534*G0_0_0_3_4_3 - 0.0088311688311691*G0_0_0_3_4_4 - 0.00103896103896108*G0_0_0_3_5_0 + 0.00805194805194835*G0_0_0_3_5_1 - 0.00285714285714296*G0_0_0_3_5_2 + 0.00623376623376649*G0_0_0_3_5_3 + 0.006753246753247*G0_0_0_3_5_5 - 0.00633116883116904*G0_0_0_4_0_0 - 0.000162337662337666*G0_0_0_4_0_1 + 0.00337662337662349*G0_0_0_4_0_2 + 0.000649350649350667*G0_0_0_4_0_3 - 0.00506493506493525*G0_0_0_4_0_4 - 0.00103896103896108*G0_0_0_4_0_5 - 0.000162337662337665*G0_0_0_4_1_0 + 0.00103896103896107*G0_0_0_4_1_1 + 0.00285714285714295*G0_0_0_4_1_3 + 0.00376623376623388*G0_0_0_4_1_4 + 0.00103896103896107*G0_0_0_4_1_5 + 0.00337662337662349*G0_0_0_4_2_0 - 0.00538961038961057*G0_0_0_4_2_2 - 0.00233766233766242*G0_0_0_4_2_3 - 0.00467532467532484*G0_0_0_4_2_4 - 0.000649350649350674*G0_0_0_4_2_5 + 0.000649350649350667*G0_0_0_4_3_0 + 0.00285714285714295*G0_0_0_4_3_1 - 0.00233766233766242*G0_0_0_4_3_2 - 0.00519480519480534*G0_0_0_4_3_3 - 0.0088311688311691*G0_0_0_4_3_4 - 0.00506493506493525*G0_0_0_4_4_0 + 0.00376623376623388*G0_0_0_4_4_1 - 0.00467532467532484*G0_0_0_4_4_2 - 0.0088311688311691*G0_0_0_4_4_3 - 0.107532467532471*G0_0_0_4_4_4 - 0.00623376623376643*G0_0_0_4_4_5 - 0.00103896103896107*G0_0_0_4_5_0 + 0.00103896103896107*G0_0_0_4_5_1 - 0.000649350649350675*G0_0_0_4_5_2 - 0.00623376623376643*G0_0_0_4_5_4 + 0.00259740259740269*G0_0_0_4_5_5 - 0.000649350649350674*G0_0_0_5_0_0 - 0.00175324675324681*G0_0_0_5_0_1 + 0.000681818181818205*G0_0_0_5_0_2 - 0.00103896103896108*G0_0_0_5_0_3 - 0.00103896103896107*G0_0_0_5_0_4 - 0.00155844155844161*G0_0_0_5_0_5 - 0.00175324675324681*G0_0_0_5_1_0 + 0.00941558441558475*G0_0_0_5_1_1 - 0.00155844155844162*G0_0_0_5_1_2 + 0.00805194805194835*G0_0_0_5_1_3 + 0.00103896103896107*G0_0_0_5_1_4 + 0.00623376623376645*G0_0_0_5_1_5 + 0.000681818181818205*G0_0_0_5_2_0 - 0.00155844155844162*G0_0_0_5_2_1 + 0.000292207792207803*G0_0_0_5_2_2 - 0.00285714285714296*G0_0_0_5_2_3 - 0.000649350649350675*G0_0_0_5_2_4 - 0.00233766233766242*G0_0_0_5_2_5 - 0.00103896103896108*G0_0_0_5_3_0 + 0.00805194805194835*G0_0_0_5_3_1 - 0.00285714285714296*G0_0_0_5_3_2 + 0.00623376623376649*G0_0_0_5_3_3 + 0.00675324675324701*G0_0_0_5_3_5 - 0.00103896103896108*G0_0_0_5_4_0 + 0.00103896103896107*G0_0_0_5_4_1 - 0.000649350649350675*G0_0_0_5_4_2 - 0.00623376623376643*G0_0_0_5_4_4 + 0.00259740259740269*G0_0_0_5_4_5 - 0.00155844155844161*G0_0_0_5_5_0 + 0.00623376623376645*G0_0_0_5_5_1 - 0.00233766233766242*G0_0_0_5_5_2 + 0.00675324675324701*G0_0_0_5_5_3 + 0.00259740259740269*G0_0_0_5_5_4 + 0.0140259740259745*G0_0_0_5_5_5 + 0.01935064935065*G0_0_1_0_0_0 + 0.000919913419913453*G0_0_1_0_0_1 - 0.00145292207792212*G0_0_1_0_0_2 + 0.00107683982683986*G0_0_1_0_0_3 + 0.00486471861471877*G0_0_1_0_0_4 + 0.00390151515151528*G0_0_1_0_0_5 + 0.000919913419913453*G0_0_1_0_1_0 - 0.0111011904761909*G0_0_1_0_1_1 + 0.00101596320346324*G0_0_1_0_1_2 - 0.00414502164502179*G0_0_1_0_1_3 - 0.000557359307359325*G0_0_1_0_1_4 - 0.00662337662337685*G0_0_1_0_1_5 - 0.00145292207792212*G0_0_1_0_2_0 + 0.00101596320346324*G0_0_1_0_2_1 - 0.000238095238095249*G0_0_1_0_2_2 + 0.0011580086580087*G0_0_1_0_2_3 + 0.0003896103896104*G0_0_1_0_2_4 + 0.00095779220779224*G0_0_1_0_2_5 + 0.00107683982683986*G0_0_1_0_3_0 - 0.00414502164502179*G0_0_1_0_3_1 + 0.0011580086580087*G0_0_1_0_3_2 - 0.00458874458874474*G0_0_1_0_3_3 - 0.00103896103896107*G0_0_1_0_3_4 - 0.00406926406926421*G0_0_1_0_3_5 + 0.00486471861471877*G0_0_1_0_4_0 - 0.000557359307359325*G0_0_1_0_4_1 + 0.0003896103896104*G0_0_1_0_4_2 - 0.00103896103896107*G0_0_1_0_4_3 + 0.00285714285714294*G0_0_1_0_4_4 - 0.000800865800865825*G0_0_1_0_4_5 + 0.00390151515151528*G0_0_1_0_5_0 - 0.00662337662337685*G0_0_1_0_5_1 + 0.00095779220779224*G0_0_1_0_5_2 - 0.00406926406926421*G0_0_1_0_5_3 - 0.000800865800865824*G0_0_1_0_5_4 - 0.0108658008658012*G0_0_1_0_5_5 + 0.000919913419913452*G0_0_1_1_0_0 - 0.0111011904761909*G0_0_1_1_0_1 + 0.00101596320346324*G0_0_1_1_0_2 - 0.00414502164502179*G0_0_1_1_0_3 - 0.000557359307359325*G0_0_1_1_0_4 - 0.00662337662337685*G0_0_1_1_0_5 - 0.0111011904761909*G0_0_1_1_1_0 + 0.166233766233772*G0_0_1_1_1_1 - 0.011696428571429*G0_0_1_1_1_2 + 0.0501082251082269*G0_0_1_1_1_3 + 0.00323593073593083*G0_0_1_1_1_4 + 0.0469696969696987*G0_0_1_1_1_5 + 0.00101596320346324*G0_0_1_1_2_0 - 0.011696428571429*G0_0_1_1_2_1 + 0.00153950216450222*G0_0_1_1_2_2 - 0.00746753246753273*G0_0_1_1_2_3 - 0.000270562770562781*G0_0_1_1_2_4 - 0.00405844155844171*G0_0_1_1_2_5 - 0.00414502164502179*G0_0_1_1_3_0 + 0.0501082251082269*G0_0_1_1_3_1 - 0.00746753246753273*G0_0_1_1_3_2 + 0.0379220779220793*G0_0_1_1_3_3 + 0.00181818181818188*G0_0_1_1_3_4 + 0.016406926406927*G0_0_1_1_3_5 - 0.000557359307359325*G0_0_1_1_4_0 + 0.00323593073593083*G0_0_1_1_4_1 - 0.000270562770562781*G0_0_1_1_4_2 + 0.00181818181818188*G0_0_1_1_4_3 + 0.000735930735930758*G0_0_1_1_4_4 + 0.0016450216450217*G0_0_1_1_4_5 - 0.00662337662337685*G0_0_1_1_5_0 + 0.0469696969696987*G0_0_1_1_5_1 - 0.00405844155844171*G0_0_1_1_5_2 + 0.016406926406927*G0_0_1_1_5_3 + 0.0016450216450217*G0_0_1_1_5_4 + 0.0331601731601744*G0_0_1_1_5_5 - 0.00145292207792212*G0_0_1_2_0_0 + 0.00101596320346324*G0_0_1_2_0_1 - 0.000238095238095249*G0_0_1_2_0_2 + 0.0011580086580087*G0_0_1_2_0_3 + 0.0003896103896104*G0_0_1_2_0_4 + 0.00095779220779224*G0_0_1_2_0_5 + 0.00101596320346324*G0_0_1_2_1_0 - 0.011696428571429*G0_0_1_2_1_1 + 0.00153950216450222*G0_0_1_2_1_2 - 0.00746753246753273*G0_0_1_2_1_3 - 0.000270562770562781*G0_0_1_2_1_4 - 0.00405844155844171*G0_0_1_2_1_5 - 0.000238095238095249*G0_0_1_2_2_0 + 0.00153950216450222*G0_0_1_2_2_1 + 0.00676136363636391*G0_0_1_2_2_2 + 0.00246753246753256*G0_0_1_2_2_3 + 0.000292207792207817*G0_0_1_2_2_4 + 0.000963203463203499*G0_0_1_2_2_5 + 0.0011580086580087*G0_0_1_2_3_0 - 0.00746753246753273*G0_0_1_2_3_1 + 0.00246753246753256*G0_0_1_2_3_2 - 0.0126406926406931*G0_0_1_2_3_3 - 0.00177489177489183*G0_0_1_2_3_4 - 0.0042424242424244*G0_0_1_2_3_5 + 0.0003896103896104*G0_0_1_2_4_0 - 0.000270562770562781*G0_0_1_2_4_1 + 0.000292207792207817*G0_0_1_2_4_2 - 0.00177489177489183*G0_0_1_2_4_3 - 0.00367965367965379*G0_0_1_2_4_4 - 0.00138528138528143*G0_0_1_2_4_5 + 0.00095779220779224*G0_0_1_2_5_0 - 0.00405844155844171*G0_0_1_2_5_1 + 0.000963203463203499*G0_0_1_2_5_2 - 0.0042424242424244*G0_0_1_2_5_3 - 0.00138528138528143*G0_0_1_2_5_4 - 0.00419913419913435*G0_0_1_2_5_5 + 0.00107683982683986*G0_0_1_3_0_0 - 0.00414502164502179*G0_0_1_3_0_1 + 0.0011580086580087*G0_0_1_3_0_2 - 0.00458874458874474*G0_0_1_3_0_3 - 0.00103896103896107*G0_0_1_3_0_4 - 0.00406926406926421*G0_0_1_3_0_5 - 0.00414502164502179*G0_0_1_3_1_0 + 0.0501082251082269*G0_0_1_3_1_1 - 0.00746753246753273*G0_0_1_3_1_2 + 0.0379220779220793*G0_0_1_3_1_3 + 0.00181818181818188*G0_0_1_3_1_4 + 0.016406926406927*G0_0_1_3_1_5 + 0.0011580086580087*G0_0_1_3_2_0 - 0.00746753246753273*G0_0_1_3_2_1 + 0.00246753246753256*G0_0_1_3_2_2 - 0.0126406926406931*G0_0_1_3_2_3 - 0.00177489177489183*G0_0_1_3_2_4 - 0.0042424242424244*G0_0_1_3_2_5 - 0.00458874458874474*G0_0_1_3_3_0 + 0.0379220779220793*G0_0_1_3_3_1 - 0.0126406926406931*G0_0_1_3_3_2 + 0.0446753246753263*G0_0_1_3_3_3 + 0.00554112554112573*G0_0_1_3_3_4 + 0.0176623376623383*G0_0_1_3_3_5 - 0.00103896103896107*G0_0_1_3_4_0 + 0.00181818181818188*G0_0_1_3_4_1 - 0.00177489177489183*G0_0_1_3_4_2 + 0.00554112554112573*G0_0_1_3_4_3 + 0.000606060606060627*G0_0_1_3_4_4 + 0.00484848484848501*G0_0_1_3_4_5 - 0.00406926406926421*G0_0_1_3_5_0 + 0.016406926406927*G0_0_1_3_5_1 - 0.0042424242424244*G0_0_1_3_5_2 + 0.0176623376623383*G0_0_1_3_5_3 + 0.00484848484848501*G0_0_1_3_5_4 + 0.0165367965367971*G0_0_1_3_5_5 + 0.00486471861471877*G0_0_1_4_0_0 - 0.000557359307359325*G0_0_1_4_0_1 + 0.0003896103896104*G0_0_1_4_0_2 - 0.00103896103896107*G0_0_1_4_0_3 + 0.00285714285714294*G0_0_1_4_0_4 - 0.000800865800865824*G0_0_1_4_0_5 - 0.000557359307359325*G0_0_1_4_1_0 + 0.00323593073593083*G0_0_1_4_1_1 - 0.000270562770562781*G0_0_1_4_1_2 + 0.00181818181818188*G0_0_1_4_1_3 + 0.000735930735930758*G0_0_1_4_1_4 + 0.0016450216450217*G0_0_1_4_1_5 + 0.0003896103896104*G0_0_1_4_2_0 - 0.000270562770562781*G0_0_1_4_2_1 + 0.000292207792207817*G0_0_1_4_2_2 - 0.00177489177489183*G0_0_1_4_2_3 - 0.00367965367965379*G0_0_1_4_2_4 - 0.00138528138528143*G0_0_1_4_2_5 - 0.00103896103896107*G0_0_1_4_3_0 + 0.00181818181818188*G0_0_1_4_3_1 - 0.00177489177489183*G0_0_1_4_3_2 + 0.00554112554112573*G0_0_1_4_3_3 + 0.000606060606060627*G0_0_1_4_3_4 + 0.00484848484848501*G0_0_1_4_3_5 + 0.00285714285714294*G0_0_1_4_4_0 + 0.000735930735930758*G0_0_1_4_4_1 - 0.00367965367965379*G0_0_1_4_4_2 + 0.000606060606060627*G0_0_1_4_4_3 - 0.0418181818181831*G0_0_1_4_4_4 + 0.00129870129870134*G0_0_1_4_4_5 - 0.000800865800865825*G0_0_1_4_5_0 + 0.0016450216450217*G0_0_1_4_5_1 - 0.00138528138528143*G0_0_1_4_5_2 + 0.00484848484848501*G0_0_1_4_5_3 + 0.00129870129870134*G0_0_1_4_5_4 + 0.00510822510822526*G0_0_1_4_5_5 + 0.00390151515151528*G0_0_1_5_0_0 - 0.00662337662337685*G0_0_1_5_0_1 + 0.00095779220779224*G0_0_1_5_0_2 - 0.00406926406926421*G0_0_1_5_0_3 - 0.000800865800865824*G0_0_1_5_0_4 - 0.0108658008658012*G0_0_1_5_0_5 - 0.00662337662337685*G0_0_1_5_1_0 + 0.0469696969696987*G0_0_1_5_1_1 - 0.00405844155844171*G0_0_1_5_1_2 + 0.016406926406927*G0_0_1_5_1_3 + 0.0016450216450217*G0_0_1_5_1_4 + 0.0331601731601744*G0_0_1_5_1_5 + 0.00095779220779224*G0_0_1_5_2_0 - 0.00405844155844171*G0_0_1_5_2_1 + 0.000963203463203499*G0_0_1_5_2_2 - 0.0042424242424244*G0_0_1_5_2_3 - 0.00138528138528143*G0_0_1_5_2_4 - 0.00419913419913434*G0_0_1_5_2_5 - 0.00406926406926421*G0_0_1_5_3_0 + 0.016406926406927*G0_0_1_5_3_1 - 0.0042424242424244*G0_0_1_5_3_2 + 0.0176623376623383*G0_0_1_5_3_3 + 0.00484848484848501*G0_0_1_5_3_4 + 0.0165367965367971*G0_0_1_5_3_5 - 0.000800865800865825*G0_0_1_5_4_0 + 0.0016450216450217*G0_0_1_5_4_1 - 0.00138528138528143*G0_0_1_5_4_2 + 0.00484848484848501*G0_0_1_5_4_3 + 0.00129870129870134*G0_0_1_5_4_4 + 0.00510822510822526*G0_0_1_5_4_5 - 0.0108658008658012*G0_0_1_5_5_0 + 0.0331601731601744*G0_0_1_5_5_1 - 0.00419913419913434*G0_0_1_5_5_2 + 0.0165367965367971*G0_0_1_5_5_3 + 0.00510822510822526*G0_0_1_5_5_4 + 0.0345454545454557*G0_0_1_5_5_5; + A[30] = A[4] + 0.000154220779220785*G0_0_0_0_0_1 - 0.000251623376623386*G0_0_0_0_0_2 + 0.000324675324675341*G0_0_0_0_0_4 - 0.000324675324675343*G0_0_0_0_0_5 + 0.000154220779220785*G0_0_0_0_1_0 + 0.000194805194805202*G0_0_0_0_1_1 + 0.000470779220779236*G0_0_0_0_1_3 + 0.00025974025974027*G0_0_0_0_1_5 - 0.000251623376623385*G0_0_0_0_2_0 - 0.00104707792207796*G0_0_0_0_2_2 - 0.000194805194805202*G0_0_0_0_2_3 + 0.000584415584415599*G0_0_0_0_2_4 + 0.000551948051948069*G0_0_0_0_2_5 + 0.000470779220779236*G0_0_0_0_3_1 - 0.000194805194805202*G0_0_0_0_3_2 + 0.000389610389610395*G0_0_0_0_3_3 - 0.00129870129870134*G0_0_0_0_3_5 + 0.000324675324675341*G0_0_0_0_4_0 + 0.000584415584415599*G0_0_0_0_4_2 + 0.00545454545454564*G0_0_0_0_4_4 - 0.000909090909090937*G0_0_0_0_4_5 - 0.000324675324675343*G0_0_0_0_5_0 + 0.00025974025974027*G0_0_0_0_5_1 + 0.000551948051948069*G0_0_0_0_5_2 - 0.00129870129870134*G0_0_0_0_5_3 - 0.000909090909090936*G0_0_0_0_5_4 - 0.00363636363636376*G0_0_0_0_5_5 + 0.000154220779220785*G0_0_0_1_0_0 + 0.000194805194805202*G0_0_0_1_0_1 + 0.000470779220779236*G0_0_0_1_0_3 + 0.00025974025974027*G0_0_0_1_0_5 + 0.000194805194805202*G0_0_0_1_1_0 - 0.00589285714285735*G0_0_0_1_1_1 + 0.00125000000000004*G0_0_0_1_1_2 - 0.00469155844155861*G0_0_0_1_1_3 - 0.000211038961038968*G0_0_0_1_1_4 - 0.000827922077922114*G0_0_0_1_1_5 + 0.00125000000000004*G0_0_0_1_2_1 - 0.00258116883116892*G0_0_0_1_2_2 + 0.000162337662337665*G0_0_0_1_2_3 + 0.000211038961038968*G0_0_0_1_2_5 + 0.000470779220779236*G0_0_0_1_3_0 - 0.00469155844155861*G0_0_0_1_3_1 + 0.000162337662337665*G0_0_0_1_3_2 - 0.0101298701298705*G0_0_0_1_3_3 - 0.000519480519480537*G0_0_0_1_3_4 - 0.00136363636363641*G0_0_0_1_3_5 - 0.000211038961038968*G0_0_0_1_4_1 - 0.000519480519480537*G0_0_0_1_4_3 + 0.00129870129870134*G0_0_0_1_4_4 + 0.00025974025974027*G0_0_0_1_5_0 - 0.000827922077922114*G0_0_0_1_5_1 + 0.000211038961038968*G0_0_0_1_5_2 - 0.00136363636363642*G0_0_0_1_5_3 + 0.000649350649350674*G0_0_0_1_5_5 - 0.000251623376623385*G0_0_0_2_0_0 - 0.00104707792207796*G0_0_0_2_0_2 - 0.000194805194805202*G0_0_0_2_0_3 + 0.000584415584415599*G0_0_0_2_0_4 + 0.000551948051948069*G0_0_0_2_0_5 + 0.00125000000000004*G0_0_0_2_1_1 - 0.00258116883116892*G0_0_0_2_1_2 + 0.000162337662337665*G0_0_0_2_1_3 + 0.000211038961038968*G0_0_0_2_1_5 - 0.00104707792207796*G0_0_0_2_2_0 - 0.00258116883116892*G0_0_0_2_2_1 + 0.0336038961038973*G0_0_0_2_2_2 + 0.00996753246753283*G0_0_0_2_2_3 + 0.00366883116883132*G0_0_0_2_2_4 + 0.00058441558441561*G0_0_0_2_2_5 - 0.000194805194805202*G0_0_0_2_3_0 + 0.000162337662337665*G0_0_0_2_3_1 + 0.00996753246753283*G0_0_0_2_3_2 + 0.00987012987013023*G0_0_0_2_3_3 + 0.000259740259740279*G0_0_0_2_3_4 - 0.0007792207792208*G0_0_0_2_3_5 + 0.000584415584415599*G0_0_0_2_4_0 + 0.00366883116883132*G0_0_0_2_4_2 + 0.000259740259740279*G0_0_0_2_4_3 - 0.0064935064935067*G0_0_0_2_4_4 - 0.00129870129870134*G0_0_0_2_4_5 + 0.000551948051948069*G0_0_0_2_5_0 + 0.000211038961038968*G0_0_0_2_5_1 + 0.00058441558441561*G0_0_0_2_5_2 - 0.000779220779220799*G0_0_0_2_5_3 - 0.00129870129870134*G0_0_0_2_5_4 - 0.00194805194805201*G0_0_0_2_5_5 + 0.000470779220779236*G0_0_0_3_0_1 - 0.000194805194805202*G0_0_0_3_0_2 + 0.000389610389610395*G0_0_0_3_0_3 - 0.00129870129870134*G0_0_0_3_0_5 + 0.000470779220779236*G0_0_0_3_1_0 - 0.00469155844155861*G0_0_0_3_1_1 + 0.000162337662337665*G0_0_0_3_1_2 - 0.0101298701298705*G0_0_0_3_1_3 - 0.000519480519480537*G0_0_0_3_1_4 - 0.00136363636363641*G0_0_0_3_1_5 - 0.000194805194805202*G0_0_0_3_2_0 + 0.000162337662337665*G0_0_0_3_2_1 + 0.00996753246753283*G0_0_0_3_2_2 + 0.00987012987013023*G0_0_0_3_2_3 + 0.000259740259740279*G0_0_0_3_2_4 - 0.000779220779220799*G0_0_0_3_2_5 + 0.000389610389610395*G0_0_0_3_3_0 - 0.0101298701298705*G0_0_0_3_3_1 + 0.00987012987013023*G0_0_0_3_3_2 - 0.039740259740261*G0_0_0_3_3_3 + 0.000259740259740273*G0_0_0_3_3_4 + 0.000779220779220794*G0_0_0_3_3_5 - 0.000519480519480537*G0_0_0_3_4_1 + 0.000259740259740279*G0_0_0_3_4_2 + 0.000259740259740272*G0_0_0_3_4_3 - 0.00259740259740268*G0_0_0_3_4_4 + 0.00259740259740268*G0_0_0_3_4_5 - 0.00129870129870134*G0_0_0_3_5_0 - 0.00136363636363641*G0_0_0_3_5_1 - 0.000779220779220799*G0_0_0_3_5_2 + 0.000779220779220793*G0_0_0_3_5_3 + 0.00259740259740268*G0_0_0_3_5_4 + 0.0064935064935067*G0_0_0_3_5_5 + 0.000324675324675341*G0_0_0_4_0_0 + 0.000584415584415599*G0_0_0_4_0_2 + 0.00545454545454564*G0_0_0_4_0_4 - 0.000909090909090936*G0_0_0_4_0_5 - 0.000211038961038968*G0_0_0_4_1_1 - 0.000519480519480537*G0_0_0_4_1_3 + 0.00129870129870134*G0_0_0_4_1_4 + 0.000584415584415599*G0_0_0_4_2_0 + 0.00366883116883132*G0_0_0_4_2_2 + 0.000259740259740279*G0_0_0_4_2_3 - 0.0064935064935067*G0_0_0_4_2_4 - 0.00129870129870134*G0_0_0_4_2_5 - 0.000519480519480537*G0_0_0_4_3_1 + 0.000259740259740279*G0_0_0_4_3_2 + 0.000259740259740272*G0_0_0_4_3_3 - 0.00259740259740269*G0_0_0_4_3_4 + 0.00259740259740268*G0_0_0_4_3_5 + 0.00545454545454564*G0_0_0_4_4_0 + 0.00129870129870134*G0_0_0_4_4_1 - 0.0064935064935067*G0_0_0_4_4_2 - 0.00259740259740268*G0_0_0_4_4_3 - 0.0233766233766241*G0_0_0_4_4_4 - 0.000909090909090937*G0_0_0_4_5_0 - 0.00129870129870134*G0_0_0_4_5_2 + 0.00259740259740268*G0_0_0_4_5_3 + 0.00389610389610402*G0_0_0_4_5_5 - 0.000324675324675343*G0_0_0_5_0_0 + 0.00025974025974027*G0_0_0_5_0_1 + 0.000551948051948069*G0_0_0_5_0_2 - 0.00129870129870134*G0_0_0_5_0_3 - 0.000909090909090937*G0_0_0_5_0_4 - 0.00363636363636376*G0_0_0_5_0_5 + 0.00025974025974027*G0_0_0_5_1_0 - 0.000827922077922114*G0_0_0_5_1_1 + 0.000211038961038969*G0_0_0_5_1_2 - 0.00136363636363641*G0_0_0_5_1_3 + 0.000649350649350674*G0_0_0_5_1_5 + 0.000551948051948069*G0_0_0_5_2_0 + 0.000211038961038968*G0_0_0_5_2_1 + 0.00058441558441561*G0_0_0_5_2_2 - 0.000779220779220799*G0_0_0_5_2_3 - 0.00129870129870134*G0_0_0_5_2_4 - 0.00194805194805201*G0_0_0_5_2_5 - 0.00129870129870134*G0_0_0_5_3_0 - 0.00136363636363641*G0_0_0_5_3_1 - 0.000779220779220799*G0_0_0_5_3_2 + 0.000779220779220793*G0_0_0_5_3_3 + 0.00259740259740268*G0_0_0_5_3_4 + 0.0064935064935067*G0_0_0_5_3_5 - 0.000909090909090936*G0_0_0_5_4_0 - 0.00129870129870134*G0_0_0_5_4_2 + 0.00259740259740268*G0_0_0_5_4_3 + 0.00389610389610402*G0_0_0_5_4_5 - 0.00363636363636376*G0_0_0_5_5_0 + 0.000649350649350674*G0_0_0_5_5_1 - 0.00194805194805201*G0_0_0_5_5_2 + 0.0064935064935067*G0_0_0_5_5_3 + 0.00389610389610402*G0_0_0_5_5_4 + 0.0116883116883121*G0_0_0_5_5_5 + 0.000500541125541146*G0_0_1_0_0_1 - 0.00050054112554114*G0_0_1_0_0_2 + 0.00189393939393945*G0_0_1_0_0_4 - 0.00189393939393948*G0_0_1_0_0_5 + 0.000500541125541146*G0_0_1_0_1_0 + 0.000311147186147197*G0_0_1_0_1_1 + 0.000189393939393946*G0_0_1_0_1_3 - 0.000367965367965379*G0_0_1_0_1_4 + 0.000259740259740275*G0_0_1_0_1_5 - 0.00050054112554114*G0_0_1_0_2_0 - 0.000311147186147198*G0_0_1_0_2_2 - 0.000189393939393946*G0_0_1_0_2_3 - 0.000259740259740269*G0_0_1_0_2_4 + 0.000367965367965381*G0_0_1_0_2_5 + 0.000189393939393946*G0_0_1_0_3_1 - 0.000189393939393946*G0_0_1_0_3_2 + 0.000735930735930759*G0_0_1_0_3_4 - 0.000735930735930759*G0_0_1_0_3_5 + 0.00189393939393945*G0_0_1_0_4_0 - 0.000367965367965379*G0_0_1_0_4_1 - 0.000259740259740269*G0_0_1_0_4_2 + 0.000735930735930759*G0_0_1_0_4_3 + 0.00692640692640715*G0_0_1_0_4_4 - 0.00189393939393948*G0_0_1_0_5_0 + 0.000259740259740275*G0_0_1_0_5_1 + 0.000367965367965381*G0_0_1_0_5_2 - 0.00073593073593076*G0_0_1_0_5_3 - 0.00692640692640718*G0_0_1_0_5_5 + 0.000500541125541146*G0_0_1_1_0_0 + 0.000311147186147197*G0_0_1_1_0_1 + 0.000189393939393946*G0_0_1_1_0_3 - 0.000367965367965379*G0_0_1_1_0_4 + 0.000259740259740275*G0_0_1_1_0_5 + 0.000311147186147197*G0_0_1_1_1_0 - 0.0134537337662342*G0_0_1_1_1_1 + 0.00130817099567104*G0_0_1_1_1_2 - 0.00504329004329022*G0_0_1_1_1_3 - 0.000340909090909102*G0_0_1_1_1_4 - 0.00153138528138535*G0_0_1_1_1_5 + 0.00130817099567104*G0_0_1_1_2_1 - 0.00130817099567104*G0_0_1_1_2_2 + 0.000189393939393946*G0_0_1_1_3_0 - 0.00504329004329022*G0_0_1_1_3_1 - 0.00673160173160197*G0_0_1_1_3_3 + 0.000303030303030312*G0_0_1_1_3_4 - 0.000324675324675342*G0_0_1_1_3_5 - 0.000367965367965379*G0_0_1_1_4_0 - 0.000340909090909102*G0_0_1_1_4_1 + 0.000303030303030312*G0_0_1_1_4_3 + 0.00142857142857147*G0_0_1_1_4_4 + 0.000735930735930761*G0_0_1_1_4_5 + 0.000259740259740275*G0_0_1_1_5_0 - 0.00153138528138535*G0_0_1_1_5_1 - 0.000324675324675342*G0_0_1_1_5_3 + 0.000735930735930761*G0_0_1_1_5_4 + 0.00445887445887461*G0_0_1_1_5_5 - 0.00050054112554114*G0_0_1_2_0_0 - 0.000311147186147198*G0_0_1_2_0_2 - 0.000189393939393946*G0_0_1_2_0_3 - 0.000259740259740269*G0_0_1_2_0_4 + 0.000367965367965381*G0_0_1_2_0_5 + 0.00130817099567104*G0_0_1_2_1_1 - 0.00130817099567104*G0_0_1_2_1_2 - 0.000311147186147198*G0_0_1_2_2_0 - 0.00130817099567104*G0_0_1_2_2_1 + 0.0134537337662343*G0_0_1_2_2_2 + 0.00504329004329023*G0_0_1_2_2_3 + 0.00153138528138534*G0_0_1_2_2_4 + 0.000340909090909105*G0_0_1_2_2_5 - 0.000189393939393946*G0_0_1_2_3_0 + 0.00504329004329023*G0_0_1_2_3_2 + 0.00673160173160197*G0_0_1_2_3_3 + 0.00032467532467534*G0_0_1_2_3_4 - 0.00030303030303031*G0_0_1_2_3_5 - 0.000259740259740269*G0_0_1_2_4_0 + 0.00153138528138534*G0_0_1_2_4_2 + 0.00032467532467534*G0_0_1_2_4_3 - 0.0044588744588746*G0_0_1_2_4_4 - 0.000735930735930759*G0_0_1_2_4_5 + 0.000367965367965381*G0_0_1_2_5_0 + 0.000340909090909104*G0_0_1_2_5_2 - 0.00030303030303031*G0_0_1_2_5_3 - 0.000735930735930759*G0_0_1_2_5_4 - 0.00142857142857147*G0_0_1_2_5_5 + 0.000189393939393946*G0_0_1_3_0_1 - 0.000189393939393946*G0_0_1_3_0_2 + 0.000735930735930759*G0_0_1_3_0_4 - 0.00073593073593076*G0_0_1_3_0_5 + 0.000189393939393946*G0_0_1_3_1_0 - 0.00504329004329022*G0_0_1_3_1_1 - 0.00673160173160197*G0_0_1_3_1_3 + 0.000303030303030313*G0_0_1_3_1_4 - 0.000324675324675342*G0_0_1_3_1_5 - 0.000189393939393946*G0_0_1_3_2_0 + 0.00504329004329023*G0_0_1_3_2_2 + 0.00673160173160197*G0_0_1_3_2_3 + 0.00032467532467534*G0_0_1_3_2_4 - 0.00030303030303031*G0_0_1_3_2_5 - 0.00673160173160197*G0_0_1_3_3_1 + 0.00673160173160197*G0_0_1_3_3_2 - 0.000606060606060623*G0_0_1_3_3_4 + 0.00060606060606062*G0_0_1_3_3_5 + 0.000735930735930759*G0_0_1_3_4_0 + 0.000303030303030312*G0_0_1_3_4_1 + 0.00032467532467534*G0_0_1_3_4_2 - 0.000606060606060624*G0_0_1_3_4_3 - 0.00432900432900447*G0_0_1_3_4_4 - 0.00073593073593076*G0_0_1_3_5_0 - 0.000324675324675342*G0_0_1_3_5_1 - 0.00030303030303031*G0_0_1_3_5_2 + 0.000606060606060618*G0_0_1_3_5_3 + 0.00432900432900447*G0_0_1_3_5_5 + 0.00189393939393945*G0_0_1_4_0_0 - 0.000367965367965379*G0_0_1_4_0_1 - 0.000259740259740269*G0_0_1_4_0_2 + 0.000735930735930759*G0_0_1_4_0_3 + 0.00692640692640715*G0_0_1_4_0_4 - 0.000367965367965379*G0_0_1_4_1_0 - 0.000340909090909102*G0_0_1_4_1_1 + 0.000303030303030312*G0_0_1_4_1_3 + 0.00142857142857147*G0_0_1_4_1_4 + 0.000735930735930761*G0_0_1_4_1_5 - 0.000259740259740269*G0_0_1_4_2_0 + 0.00153138528138534*G0_0_1_4_2_2 + 0.000324675324675341*G0_0_1_4_2_3 - 0.0044588744588746*G0_0_1_4_2_4 - 0.000735930735930759*G0_0_1_4_2_5 + 0.000735930735930759*G0_0_1_4_3_0 + 0.000303030303030312*G0_0_1_4_3_1 + 0.000324675324675341*G0_0_1_4_3_2 - 0.000606060606060623*G0_0_1_4_3_3 - 0.00432900432900447*G0_0_1_4_3_4 + 0.00692640692640715*G0_0_1_4_4_0 + 0.00142857142857147*G0_0_1_4_4_1 - 0.0044588744588746*G0_0_1_4_4_2 - 0.00432900432900447*G0_0_1_4_4_3 - 0.0124675324675329*G0_0_1_4_4_4 - 0.00138528138528144*G0_0_1_4_4_5 + 0.000735930735930762*G0_0_1_4_5_1 - 0.000735930735930759*G0_0_1_4_5_2 - 0.00138528138528144*G0_0_1_4_5_4 + 0.00138528138528142*G0_0_1_4_5_5 - 0.00189393939393948*G0_0_1_5_0_0 + 0.000259740259740275*G0_0_1_5_0_1 + 0.000367965367965381*G0_0_1_5_0_2 - 0.00073593073593076*G0_0_1_5_0_3 - 0.00692640692640718*G0_0_1_5_0_5 + 0.000259740259740275*G0_0_1_5_1_0 - 0.00153138528138535*G0_0_1_5_1_1 - 0.000324675324675343*G0_0_1_5_1_3 + 0.000735930735930761*G0_0_1_5_1_4 + 0.00445887445887461*G0_0_1_5_1_5 + 0.000367965367965381*G0_0_1_5_2_0 + 0.000340909090909105*G0_0_1_5_2_2 - 0.00030303030303031*G0_0_1_5_2_3 - 0.000735930735930759*G0_0_1_5_2_4 - 0.00142857142857147*G0_0_1_5_2_5 - 0.00073593073593076*G0_0_1_5_3_0 - 0.000324675324675342*G0_0_1_5_3_1 - 0.00030303030303031*G0_0_1_5_3_2 + 0.00060606060606062*G0_0_1_5_3_3 + 0.00432900432900447*G0_0_1_5_3_5 + 0.000735930735930761*G0_0_1_5_4_1 - 0.000735930735930759*G0_0_1_5_4_2 - 0.00138528138528144*G0_0_1_5_4_4 + 0.00138528138528142*G0_0_1_5_4_5 - 0.00692640692640718*G0_0_1_5_5_0 + 0.00445887445887461*G0_0_1_5_5_1 - 0.00142857142857147*G0_0_1_5_5_2 + 0.00432900432900447*G0_0_1_5_5_3 + 0.00138528138528142*G0_0_1_5_5_4 + 0.0124675324675329*G0_0_1_5_5_5 - 0.00124458874458881*G0_1_0_0_0_4 + 0.00124458874458875*G0_1_0_0_0_5 + 0.000930735930735962*G0_1_0_0_1_1 + 0.000476190476190493*G0_1_0_0_1_3 - 0.000281385281385288*G0_1_0_0_1_4 - 0.000584415584415595*G0_1_0_0_1_5 - 0.000930735930735965*G0_1_0_0_2_2 - 0.000476190476190492*G0_1_0_0_2_3 + 0.000584415584415604*G0_1_0_0_2_4 + 0.000281385281385292*G0_1_0_0_2_5 + 0.000476190476190493*G0_1_0_0_3_1 - 0.000476190476190492*G0_1_0_0_3_2 + 0.000562770562770579*G0_1_0_0_3_4 - 0.000562770562770582*G0_1_0_0_3_5 - 0.00124458874458881*G0_1_0_0_4_0 - 0.000281385281385288*G0_1_0_0_4_1 + 0.000584415584415604*G0_1_0_0_4_2 + 0.000562770562770579*G0_1_0_0_4_3 + 0.00216450216450222*G0_1_0_0_4_4 + 0.00124458874458875*G0_1_0_0_5_0 - 0.000584415584415595*G0_1_0_0_5_1 + 0.000281385281385292*G0_1_0_0_5_2 - 0.000562770562770582*G0_1_0_0_5_3 - 0.00216450216450226*G0_1_0_0_5_5 + 0.000930735930735962*G0_1_0_1_0_1 + 0.000476190476190493*G0_1_0_1_0_3 - 0.000281385281385288*G0_1_0_1_0_4 - 0.000584415584415595*G0_1_0_1_0_5 + 0.000930735930735963*G0_1_0_1_1_0 - 0.0260430194805204*G0_1_0_1_1_1 + 0.00252299783549793*G0_1_0_1_1_2 - 0.0096158008658012*G0_1_0_1_1_3 - 0.000454545454545469*G0_1_0_1_1_4 - 0.0029653679653681*G0_1_0_1_1_5 + 0.00252299783549793*G0_1_0_1_2_1 - 0.00252299783549793*G0_1_0_1_2_2 - 0.000173160173160181*G0_1_0_1_2_4 + 0.000173160173160181*G0_1_0_1_2_5 + 0.000476190476190493*G0_1_0_1_3_0 - 0.0096158008658012*G0_1_0_1_3_1 - 0.0132683982683987*G0_1_0_1_3_3 - 0.00129870129870136*G0_1_0_1_3_5 - 0.000281385281385288*G0_1_0_1_4_0 - 0.000454545454545469*G0_1_0_1_4_1 - 0.000173160173160181*G0_1_0_1_4_2 + 0.00181818181818188*G0_1_0_1_4_4 + 0.000562770562770583*G0_1_0_1_4_5 - 0.000584415584415595*G0_1_0_1_5_0 - 0.0029653679653681*G0_1_0_1_5_1 + 0.000173160173160181*G0_1_0_1_5_2 - 0.00129870129870136*G0_1_0_1_5_3 + 0.000562770562770583*G0_1_0_1_5_4 + 0.00268398268398277*G0_1_0_1_5_5 - 0.000930735930735965*G0_1_0_2_0_2 - 0.000476190476190492*G0_1_0_2_0_3 + 0.000584415584415604*G0_1_0_2_0_4 + 0.000281385281385292*G0_1_0_2_0_5 + 0.00252299783549793*G0_1_0_2_1_1 - 0.00252299783549793*G0_1_0_2_1_2 - 0.000173160173160181*G0_1_0_2_1_4 + 0.000173160173160181*G0_1_0_2_1_5 - 0.000930735930735965*G0_1_0_2_2_0 - 0.00252299783549793*G0_1_0_2_2_1 + 0.0260430194805204*G0_1_0_2_2_2 + 0.00961580086580122*G0_1_0_2_2_3 + 0.00296536796536808*G0_1_0_2_2_4 + 0.000454545454545474*G0_1_0_2_2_5 - 0.000476190476190492*G0_1_0_2_3_0 + 0.00961580086580122*G0_1_0_2_3_2 + 0.0132683982683987*G0_1_0_2_3_3 + 0.00129870129870135*G0_1_0_2_3_4 + 0.000584415584415604*G0_1_0_2_4_0 - 0.000173160173160181*G0_1_0_2_4_1 + 0.00296536796536808*G0_1_0_2_4_2 + 0.00129870129870135*G0_1_0_2_4_3 - 0.00268398268398276*G0_1_0_2_4_4 - 0.000562770562770579*G0_1_0_2_4_5 + 0.000281385281385292*G0_1_0_2_5_0 + 0.000173160173160181*G0_1_0_2_5_1 + 0.000454545454545475*G0_1_0_2_5_2 - 0.000562770562770579*G0_1_0_2_5_4 - 0.00181818181818187*G0_1_0_2_5_5 + 0.000476190476190493*G0_1_0_3_0_1 - 0.000476190476190492*G0_1_0_3_0_2 + 0.000562770562770579*G0_1_0_3_0_4 - 0.000562770562770582*G0_1_0_3_0_5 + 0.000476190476190493*G0_1_0_3_1_0 - 0.0096158008658012*G0_1_0_3_1_1 - 0.0132683982683987*G0_1_0_3_1_3 - 0.00129870129870136*G0_1_0_3_1_5 - 0.000476190476190492*G0_1_0_3_2_0 + 0.00961580086580122*G0_1_0_3_2_2 + 0.0132683982683987*G0_1_0_3_2_3 + 0.00129870129870135*G0_1_0_3_2_4 - 0.0132683982683987*G0_1_0_3_3_1 + 0.0132683982683987*G0_1_0_3_3_2 + 0.000562770562770579*G0_1_0_3_4_0 + 0.00129870129870135*G0_1_0_3_4_2 - 0.00476190476190491*G0_1_0_3_4_4 - 0.000562770562770582*G0_1_0_3_5_0 - 0.00129870129870136*G0_1_0_3_5_1 + 0.00476190476190491*G0_1_0_3_5_5 - 0.00124458874458881*G0_1_0_4_0_0 - 0.000281385281385288*G0_1_0_4_0_1 + 0.000584415584415604*G0_1_0_4_0_2 + 0.000562770562770579*G0_1_0_4_0_3 + 0.00216450216450222*G0_1_0_4_0_4 - 0.000281385281385288*G0_1_0_4_1_0 - 0.000454545454545469*G0_1_0_4_1_1 - 0.000173160173160181*G0_1_0_4_1_2 + 0.00181818181818188*G0_1_0_4_1_4 + 0.000562770562770583*G0_1_0_4_1_5 + 0.000584415584415604*G0_1_0_4_2_0 - 0.000173160173160181*G0_1_0_4_2_1 + 0.00296536796536808*G0_1_0_4_2_2 + 0.00129870129870135*G0_1_0_4_2_3 - 0.00268398268398276*G0_1_0_4_2_4 - 0.000562770562770579*G0_1_0_4_2_5 + 0.000562770562770579*G0_1_0_4_3_0 + 0.00129870129870135*G0_1_0_4_3_2 - 0.00476190476190491*G0_1_0_4_3_4 + 0.00216450216450222*G0_1_0_4_4_0 + 0.00181818181818188*G0_1_0_4_4_1 - 0.00268398268398276*G0_1_0_4_4_2 - 0.00476190476190491*G0_1_0_4_4_3 - 0.0225974025974033*G0_1_0_4_4_4 - 0.0025108225108226*G0_1_0_4_4_5 + 0.000562770562770583*G0_1_0_4_5_1 - 0.000562770562770579*G0_1_0_4_5_2 - 0.0025108225108226*G0_1_0_4_5_4 + 0.00251082251082258*G0_1_0_4_5_5 + 0.00124458874458875*G0_1_0_5_0_0 - 0.000584415584415595*G0_1_0_5_0_1 + 0.000281385281385292*G0_1_0_5_0_2 - 0.000562770562770582*G0_1_0_5_0_3 - 0.00216450216450226*G0_1_0_5_0_5 - 0.000584415584415595*G0_1_0_5_1_0 - 0.0029653679653681*G0_1_0_5_1_1 + 0.000173160173160181*G0_1_0_5_1_2 - 0.00129870129870136*G0_1_0_5_1_3 + 0.000562770562770583*G0_1_0_5_1_4 + 0.00268398268398277*G0_1_0_5_1_5 + 0.000281385281385292*G0_1_0_5_2_0 + 0.000173160173160181*G0_1_0_5_2_1 + 0.000454545454545475*G0_1_0_5_2_2 - 0.000562770562770579*G0_1_0_5_2_4 - 0.00181818181818187*G0_1_0_5_2_5 - 0.000562770562770582*G0_1_0_5_3_0 - 0.00129870129870136*G0_1_0_5_3_1 + 0.00476190476190491*G0_1_0_5_3_5 + 0.000562770562770583*G0_1_0_5_4_1 - 0.000562770562770579*G0_1_0_5_4_2 - 0.0025108225108226*G0_1_0_5_4_4 + 0.00251082251082258*G0_1_0_5_4_5 - 0.00216450216450226*G0_1_0_5_5_0 + 0.00268398268398277*G0_1_0_5_5_1 - 0.00181818181818187*G0_1_0_5_5_2 + 0.00476190476190491*G0_1_0_5_5_3 + 0.00251082251082258*G0_1_0_5_5_4 + 0.0225974025974033*G0_1_0_5_5_5 + 0.000251623376623396*G0_1_1_0_0_1 - 0.000154220779220775*G0_1_1_0_0_2 + 0.000324675324675303*G0_1_1_0_0_4 - 0.000324675324675391*G0_1_1_0_0_5 + 0.000251623376623396*G0_1_1_0_1_0 + 0.00104707792207796*G0_1_1_0_1_1 + 0.000194805194805203*G0_1_1_0_1_3 - 0.000551948051948066*G0_1_1_0_1_4 - 0.00058441558441559*G0_1_1_0_1_5 - 0.000154220779220775*G0_1_1_0_2_0 - 0.000194805194805202*G0_1_1_0_2_2 - 0.000470779220779235*G0_1_1_0_2_3 - 0.000259740259740265*G0_1_1_0_2_4 + 0.000194805194805203*G0_1_1_0_3_1 - 0.000470779220779235*G0_1_1_0_3_2 - 0.0003896103896104*G0_1_1_0_3_3 + 0.00129870129870134*G0_1_1_0_3_4 + 0.000324675324675302*G0_1_1_0_4_0 - 0.000551948051948065*G0_1_1_0_4_1 - 0.000259740259740265*G0_1_1_0_4_2 + 0.00129870129870134*G0_1_1_0_4_3 + 0.00363636363636373*G0_1_1_0_4_4 + 0.000909090909090924*G0_1_1_0_4_5 - 0.000324675324675391*G0_1_1_0_5_0 - 0.00058441558441559*G0_1_1_0_5_1 + 0.000909090909090924*G0_1_1_0_5_4 - 0.00545454545454568*G0_1_1_0_5_5 + 0.000251623376623396*G0_1_1_1_0_0 + 0.00104707792207796*G0_1_1_1_0_1 + 0.000194805194805203*G0_1_1_1_0_3 - 0.000551948051948066*G0_1_1_1_0_4 - 0.00058441558441559*G0_1_1_1_0_5 + 0.00104707792207796*G0_1_1_1_1_0 - 0.0336038961038973*G0_1_1_1_1_1 + 0.00258116883116892*G0_1_1_1_1_2 - 0.00996753246753281*G0_1_1_1_1_3 - 0.000584415584415602*G0_1_1_1_1_4 - 0.00366883116883133*G0_1_1_1_1_5 + 0.00258116883116892*G0_1_1_1_2_1 - 0.00125000000000004*G0_1_1_1_2_2 - 0.000162337662337671*G0_1_1_1_2_3 - 0.000211038961038969*G0_1_1_1_2_4 + 0.000194805194805203*G0_1_1_1_3_0 - 0.00996753246753281*G0_1_1_1_3_1 - 0.00016233766233767*G0_1_1_1_3_2 - 0.00987012987013021*G0_1_1_1_3_3 + 0.000779220779220802*G0_1_1_1_3_4 - 0.000259740259740283*G0_1_1_1_3_5 - 0.000551948051948065*G0_1_1_1_4_0 - 0.000584415584415602*G0_1_1_1_4_1 - 0.000211038961038969*G0_1_1_1_4_2 + 0.000779220779220802*G0_1_1_1_4_3 + 0.00194805194805201*G0_1_1_1_4_4 + 0.00129870129870134*G0_1_1_1_4_5 - 0.00058441558441559*G0_1_1_1_5_0 - 0.00366883116883133*G0_1_1_1_5_1 - 0.000259740259740283*G0_1_1_1_5_3 + 0.00129870129870134*G0_1_1_1_5_4 + 0.00649350649350671*G0_1_1_1_5_5 - 0.000154220779220775*G0_1_1_2_0_0 - 0.000194805194805202*G0_1_1_2_0_2 - 0.000470779220779236*G0_1_1_2_0_3 - 0.000259740259740265*G0_1_1_2_0_4 + 0.00258116883116892*G0_1_1_2_1_1 - 0.00125000000000004*G0_1_1_2_1_2 - 0.000162337662337671*G0_1_1_2_1_3 - 0.000211038961038969*G0_1_1_2_1_4 - 0.000194805194805202*G0_1_1_2_2_0 - 0.00125000000000004*G0_1_1_2_2_1 + 0.00589285714285736*G0_1_1_2_2_2 + 0.00469155844155861*G0_1_1_2_2_3 + 0.00082792207792211*G0_1_1_2_2_4 + 0.000211038961038969*G0_1_1_2_2_5 - 0.000470779220779235*G0_1_1_2_3_0 - 0.000162337662337671*G0_1_1_2_3_1 + 0.00469155844155861*G0_1_1_2_3_2 + 0.0101298701298705*G0_1_1_2_3_3 + 0.00136363636363641*G0_1_1_2_3_4 + 0.000519480519480541*G0_1_1_2_3_5 - 0.000259740259740265*G0_1_1_2_4_0 - 0.000211038961038969*G0_1_1_2_4_1 + 0.00082792207792211*G0_1_1_2_4_2 + 0.00136363636363641*G0_1_1_2_4_3 - 0.000649350649350664*G0_1_1_2_4_4 + 0.000211038961038969*G0_1_1_2_5_2 + 0.000519480519480541*G0_1_1_2_5_3 - 0.00129870129870134*G0_1_1_2_5_5 + 0.000194805194805203*G0_1_1_3_0_1 - 0.000470779220779235*G0_1_1_3_0_2 - 0.0003896103896104*G0_1_1_3_0_3 + 0.00129870129870134*G0_1_1_3_0_4 + 0.000194805194805203*G0_1_1_3_1_0 - 0.00996753246753281*G0_1_1_3_1_1 - 0.000162337662337671*G0_1_1_3_1_2 - 0.00987012987013021*G0_1_1_3_1_3 + 0.000779220779220802*G0_1_1_3_1_4 - 0.000259740259740283*G0_1_1_3_1_5 - 0.000470779220779235*G0_1_1_3_2_0 - 0.000162337662337671*G0_1_1_3_2_1 + 0.00469155844155861*G0_1_1_3_2_2 + 0.0101298701298705*G0_1_1_3_2_3 + 0.00136363636363641*G0_1_1_3_2_4 + 0.000519480519480541*G0_1_1_3_2_5 - 0.0003896103896104*G0_1_1_3_3_0 - 0.00987012987013021*G0_1_1_3_3_1 + 0.0101298701298705*G0_1_1_3_3_2 + 0.0397402597402612*G0_1_1_3_3_3 - 0.000779220779220784*G0_1_1_3_3_4 - 0.000259740259740258*G0_1_1_3_3_5 + 0.00129870129870134*G0_1_1_3_4_0 + 0.000779220779220802*G0_1_1_3_4_1 + 0.00136363636363641*G0_1_1_3_4_2 - 0.000779220779220783*G0_1_1_3_4_3 - 0.0064935064935067*G0_1_1_3_4_4 - 0.00259740259740268*G0_1_1_3_4_5 - 0.000259740259740283*G0_1_1_3_5_1 + 0.000519480519480541*G0_1_1_3_5_2 - 0.000259740259740258*G0_1_1_3_5_3 - 0.00259740259740268*G0_1_1_3_5_4 + 0.00259740259740268*G0_1_1_3_5_5 + 0.000324675324675302*G0_1_1_4_0_0 - 0.000551948051948066*G0_1_1_4_0_1 - 0.000259740259740265*G0_1_1_4_0_2 + 0.00129870129870134*G0_1_1_4_0_3 + 0.00363636363636373*G0_1_1_4_0_4 + 0.000909090909090924*G0_1_1_4_0_5 - 0.000551948051948066*G0_1_1_4_1_0 - 0.000584415584415602*G0_1_1_4_1_1 - 0.000211038961038969*G0_1_1_4_1_2 + 0.000779220779220802*G0_1_1_4_1_3 + 0.00194805194805201*G0_1_1_4_1_4 + 0.00129870129870134*G0_1_1_4_1_5 - 0.000259740259740265*G0_1_1_4_2_0 - 0.000211038961038969*G0_1_1_4_2_1 + 0.00082792207792211*G0_1_1_4_2_2 + 0.00136363636363641*G0_1_1_4_2_3 - 0.000649350649350664*G0_1_1_4_2_4 + 0.00129870129870134*G0_1_1_4_3_0 + 0.000779220779220802*G0_1_1_4_3_1 + 0.00136363636363641*G0_1_1_4_3_2 - 0.000779220779220786*G0_1_1_4_3_3 - 0.0064935064935067*G0_1_1_4_3_4 - 0.00259740259740268*G0_1_1_4_3_5 + 0.00363636363636373*G0_1_1_4_4_0 + 0.00194805194805201*G0_1_1_4_4_1 - 0.000649350649350664*G0_1_1_4_4_2 - 0.0064935064935067*G0_1_1_4_4_3 - 0.0116883116883121*G0_1_1_4_4_4 - 0.00389610389610403*G0_1_1_4_4_5 + 0.000909090909090924*G0_1_1_4_5_0 + 0.00129870129870134*G0_1_1_4_5_1 - 0.00259740259740268*G0_1_1_4_5_3 - 0.00389610389610403*G0_1_1_4_5_4 - 0.000324675324675392*G0_1_1_5_0_0 - 0.00058441558441559*G0_1_1_5_0_1 + 0.000909090909090924*G0_1_1_5_0_4 - 0.00545454545454568*G0_1_1_5_0_5 - 0.00058441558441559*G0_1_1_5_1_0 - 0.00366883116883133*G0_1_1_5_1_1 - 0.000259740259740283*G0_1_1_5_1_3 + 0.00129870129870134*G0_1_1_5_1_4 + 0.00649350649350671*G0_1_1_5_1_5 + 0.000211038961038969*G0_1_1_5_2_2 + 0.000519480519480541*G0_1_1_5_2_3 - 0.00129870129870134*G0_1_1_5_2_5 - 0.000259740259740283*G0_1_1_5_3_1 + 0.000519480519480541*G0_1_1_5_3_2 - 0.000259740259740259*G0_1_1_5_3_3 - 0.00259740259740268*G0_1_1_5_3_4 + 0.00259740259740268*G0_1_1_5_3_5 + 0.000909090909090923*G0_1_1_5_4_0 + 0.00129870129870134*G0_1_1_5_4_1 - 0.00259740259740268*G0_1_1_5_4_3 - 0.00389610389610403*G0_1_1_5_4_4 - 0.00545454545454568*G0_1_1_5_5_0 + 0.00649350649350671*G0_1_1_5_5_1 - 0.00129870129870134*G0_1_1_5_5_2 + 0.00259740259740268*G0_1_1_5_5_3 + 0.0233766233766241*G0_1_1_5_5_5; + A[28] = -A[27] + 0.0125892857142861*G0_1_0_0_0_0 - 0.00121482683982688*G0_1_0_0_0_1 - 0.000619588744588766*G0_1_0_0_0_2 + 0.000113636363636366*G0_1_0_0_0_3 + 0.00143398268398273*G0_1_0_0_0_4 + 0.00457251082251098*G0_1_0_0_0_5 - 0.00121482683982688*G0_1_0_0_1_0 + 0.00121482683982688*G0_1_0_0_1_1 + 0.000200216450216456*G0_1_0_0_1_3 - 0.000200216450216457*G0_1_0_0_1_4 - 0.000619588744588766*G0_1_0_0_2_0 + 0.00059523809523812*G0_1_0_0_2_2 + 0.000844155844155875*G0_1_0_0_2_4 - 0.000286796536796546*G0_1_0_0_2_5 + 0.000113636363636366*G0_1_0_0_3_0 + 0.000200216450216456*G0_1_0_0_3_1 - 0.000389610389610401*G0_1_0_0_3_3 + 0.000173160173160179*G0_1_0_0_3_4 + 0.000346320346320356*G0_1_0_0_3_5 + 0.00143398268398273*G0_1_0_0_4_0 - 0.000200216450216457*G0_1_0_0_4_1 + 0.000844155844155875*G0_1_0_0_4_2 + 0.000173160173160179*G0_1_0_0_4_3 + 0.00177489177489184*G0_1_0_0_4_4 + 0.000974025974026006*G0_1_0_0_4_5 + 0.00457251082251098*G0_1_0_0_5_0 - 0.000286796536796546*G0_1_0_0_5_2 + 0.000346320346320356*G0_1_0_0_5_3 + 0.000974025974026006*G0_1_0_0_5_4 + 0.00653679653679676*G0_1_0_0_5_5 - 0.00121482683982688*G0_1_0_1_0_0 + 0.00121482683982688*G0_1_0_1_0_1 + 0.000200216450216456*G0_1_0_1_0_3 - 0.000200216450216457*G0_1_0_1_0_4 + 0.00121482683982688*G0_1_0_1_1_0 - 0.0125892857142861*G0_1_0_1_1_1 + 0.000619588744588765*G0_1_0_1_1_2 - 0.00143398268398273*G0_1_0_1_1_3 - 0.000113636363636366*G0_1_0_1_1_4 - 0.00457251082251099*G0_1_0_1_1_5 + 0.000619588744588765*G0_1_0_1_2_1 - 0.000595238095238112*G0_1_0_1_2_2 - 0.000844155844155872*G0_1_0_1_2_3 + 0.000286796536796547*G0_1_0_1_2_5 + 0.000200216450216456*G0_1_0_1_3_0 - 0.00143398268398273*G0_1_0_1_3_1 - 0.000844155844155872*G0_1_0_1_3_2 - 0.00177489177489183*G0_1_0_1_3_3 - 0.000173160173160177*G0_1_0_1_3_4 - 0.000974025974026007*G0_1_0_1_3_5 - 0.000200216450216457*G0_1_0_1_4_0 - 0.000113636363636366*G0_1_0_1_4_1 - 0.000173160173160177*G0_1_0_1_4_3 + 0.000389610389610404*G0_1_0_1_4_4 - 0.000346320346320357*G0_1_0_1_4_5 - 0.00457251082251099*G0_1_0_1_5_1 + 0.000286796536796547*G0_1_0_1_5_2 - 0.000974025974026007*G0_1_0_1_5_3 - 0.000346320346320356*G0_1_0_1_5_4 - 0.00653679653679676*G0_1_0_1_5_5 - 0.000619588744588766*G0_1_0_2_0_0 + 0.00059523809523812*G0_1_0_2_0_2 + 0.000844155844155875*G0_1_0_2_0_4 - 0.000286796536796546*G0_1_0_2_0_5 + 0.000619588744588765*G0_1_0_2_1_1 - 0.000595238095238112*G0_1_0_2_1_2 - 0.000844155844155872*G0_1_0_2_1_3 + 0.000286796536796547*G0_1_0_2_1_5 + 0.00059523809523812*G0_1_0_2_2_0 - 0.000595238095238112*G0_1_0_2_2_1 + 0.00313852813852823*G0_1_0_2_2_3 - 0.00313852813852826*G0_1_0_2_2_4 - 0.000844155844155871*G0_1_0_2_3_1 + 0.00313852813852823*G0_1_0_2_3_2 + 0.00476190476190492*G0_1_0_2_3_3 + 0.000173160173160179*G0_1_0_2_3_5 + 0.000844155844155875*G0_1_0_2_4_0 - 0.00313852813852826*G0_1_0_2_4_2 - 0.00476190476190493*G0_1_0_2_4_4 - 0.000173160173160181*G0_1_0_2_4_5 - 0.000286796536796546*G0_1_0_2_5_0 + 0.000286796536796547*G0_1_0_2_5_1 + 0.000173160173160178*G0_1_0_2_5_3 - 0.000173160173160181*G0_1_0_2_5_4 + 0.000113636363636366*G0_1_0_3_0_0 + 0.000200216450216456*G0_1_0_3_0_1 - 0.000389610389610401*G0_1_0_3_0_3 + 0.000173160173160179*G0_1_0_3_0_4 + 0.000346320346320357*G0_1_0_3_0_5 + 0.000200216450216456*G0_1_0_3_1_0 - 0.00143398268398273*G0_1_0_3_1_1 - 0.000844155844155872*G0_1_0_3_1_2 - 0.00177489177489183*G0_1_0_3_1_3 - 0.000173160173160177*G0_1_0_3_1_4 - 0.000974025974026007*G0_1_0_3_1_5 - 0.000844155844155872*G0_1_0_3_2_1 + 0.00313852813852823*G0_1_0_3_2_2 + 0.00476190476190492*G0_1_0_3_2_3 + 0.000173160173160179*G0_1_0_3_2_5 - 0.000389610389610401*G0_1_0_3_3_0 - 0.00177489177489183*G0_1_0_3_3_1 + 0.00476190476190492*G0_1_0_3_3_2 + 0.0101298701298705*G0_1_0_3_3_3 + 0.00112554112554116*G0_1_0_3_3_4 + 0.000432900432900453*G0_1_0_3_3_5 + 0.000173160173160179*G0_1_0_3_4_0 - 0.000173160173160177*G0_1_0_3_4_1 + 0.00112554112554116*G0_1_0_3_4_3 - 0.00112554112554117*G0_1_0_3_4_4 + 0.000346320346320357*G0_1_0_3_5_0 - 0.000974025974026007*G0_1_0_3_5_1 + 0.000173160173160179*G0_1_0_3_5_2 + 0.000432900432900452*G0_1_0_3_5_3 - 0.000692640692640715*G0_1_0_3_5_5 + 0.00143398268398273*G0_1_0_4_0_0 - 0.000200216450216457*G0_1_0_4_0_1 + 0.000844155844155875*G0_1_0_4_0_2 + 0.000173160173160179*G0_1_0_4_0_3 + 0.00177489177489183*G0_1_0_4_0_4 + 0.000974025974026006*G0_1_0_4_0_5 - 0.000200216450216457*G0_1_0_4_1_0 - 0.000113636363636366*G0_1_0_4_1_1 - 0.000173160173160177*G0_1_0_4_1_3 + 0.000389610389610404*G0_1_0_4_1_4 - 0.000346320346320357*G0_1_0_4_1_5 + 0.000844155844155875*G0_1_0_4_2_0 - 0.00313852813852826*G0_1_0_4_2_2 - 0.00476190476190493*G0_1_0_4_2_4 - 0.000173160173160181*G0_1_0_4_2_5 + 0.000173160173160179*G0_1_0_4_3_0 - 0.000173160173160177*G0_1_0_4_3_1 + 0.00112554112554116*G0_1_0_4_3_3 - 0.00112554112554117*G0_1_0_4_3_4 + 0.00177489177489183*G0_1_0_4_4_0 + 0.000389610389610404*G0_1_0_4_4_1 - 0.00476190476190493*G0_1_0_4_4_2 - 0.00112554112554117*G0_1_0_4_4_3 - 0.0101298701298705*G0_1_0_4_4_4 - 0.000432900432900452*G0_1_0_4_4_5 + 0.000974025974026006*G0_1_0_4_5_0 - 0.000346320346320357*G0_1_0_4_5_1 - 0.000173160173160181*G0_1_0_4_5_2 - 0.000432900432900451*G0_1_0_4_5_4 + 0.000692640692640717*G0_1_0_4_5_5 + 0.00457251082251098*G0_1_0_5_0_0 - 0.000286796536796546*G0_1_0_5_0_2 + 0.000346320346320356*G0_1_0_5_0_3 + 0.000974025974026006*G0_1_0_5_0_4 + 0.00653679653679676*G0_1_0_5_0_5 - 0.00457251082251099*G0_1_0_5_1_1 + 0.000286796536796547*G0_1_0_5_1_2 - 0.000974025974026007*G0_1_0_5_1_3 - 0.000346320346320356*G0_1_0_5_1_4 - 0.00653679653679676*G0_1_0_5_1_5 - 0.000286796536796546*G0_1_0_5_2_0 + 0.000286796536796547*G0_1_0_5_2_1 + 0.000173160173160179*G0_1_0_5_2_3 - 0.000173160173160181*G0_1_0_5_2_4 + 0.000346320346320356*G0_1_0_5_3_0 - 0.000974025974026007*G0_1_0_5_3_1 + 0.000173160173160179*G0_1_0_5_3_2 + 0.000432900432900452*G0_1_0_5_3_3 - 0.000692640692640715*G0_1_0_5_3_5 + 0.000974025974026006*G0_1_0_5_4_0 - 0.000346320346320357*G0_1_0_5_4_1 - 0.000173160173160181*G0_1_0_5_4_2 - 0.000432900432900453*G0_1_0_5_4_4 + 0.000692640692640716*G0_1_0_5_4_5 + 0.00653679653679676*G0_1_0_5_5_0 - 0.00653679653679676*G0_1_0_5_5_1 - 0.000692640692640715*G0_1_0_5_5_3 + 0.000692640692640717*G0_1_0_5_5_4 - 0.00429383116883133*G0_1_1_0_0_0 + 0.000324675324675338*G0_1_1_0_0_1 + 0.000262445887445897*G0_1_1_0_0_2 + 0.000167748917748923*G0_1_1_0_0_3 - 0.000416666666666683*G0_1_1_0_0_4 - 0.00461580086580103*G0_1_1_0_0_5 + 0.000324675324675338*G0_1_1_0_1_0 + 0.00153950216450222*G0_1_1_0_1_1 + 0.000638528138528159*G0_1_1_0_1_3 + 0.000438311688311702*G0_1_1_0_1_4 + 0.00360389610389623*G0_1_1_0_1_5 + 0.000262445887445897*G0_1_1_0_2_0 - 0.000679112554112575*G0_1_1_0_2_2 - 0.000183982683982689*G0_1_1_0_2_3 - 0.000194805194805201*G0_1_1_0_2_4 + 0.000286796536796548*G0_1_1_0_2_5 + 0.000167748917748923*G0_1_1_0_3_0 + 0.000638528138528159*G0_1_1_0_3_1 - 0.000183982683982689*G0_1_1_0_3_2 - 0.00225108225108232*G0_1_1_0_3_3 - 0.00121212121212125*G0_1_1_0_3_4 - 0.00090909090909094*G0_1_1_0_3_5 - 0.000416666666666683*G0_1_1_0_4_0 + 0.000438311688311702*G0_1_1_0_4_1 - 0.000194805194805201*G0_1_1_0_4_2 - 0.00121212121212125*G0_1_1_0_4_3 - 0.00073593073593076*G0_1_1_0_4_4 - 0.0014502164502165*G0_1_1_0_4_5 - 0.00461580086580103*G0_1_1_0_5_0 + 0.00360389610389623*G0_1_1_0_5_1 + 0.000286796536796548*G0_1_1_0_5_2 - 0.00090909090909094*G0_1_1_0_5_3 - 0.0014502164502165*G0_1_1_0_5_4 - 0.00298701298701312*G0_1_1_0_5_5 + 0.000324675324675338*G0_1_1_1_0_0 + 0.00153950216450222*G0_1_1_1_0_1 + 0.000638528138528159*G0_1_1_1_0_3 + 0.000438311688311702*G0_1_1_1_0_4 + 0.00360389610389623*G0_1_1_1_0_5 + 0.00153950216450222*G0_1_1_1_1_0 - 0.0168831168831175*G0_1_1_1_1_1 + 0.000882034632034662*G0_1_1_1_1_2 - 0.00185064935064941*G0_1_1_1_1_3 - 0.00918831168831202*G0_1_1_1_1_5 + 0.000882034632034662*G0_1_1_1_2_1 - 0.00127435064935069*G0_1_1_1_2_2 - 0.00103896103896107*G0_1_1_1_2_3 + 0.000573593073593093*G0_1_1_1_2_5 + 0.000638528138528159*G0_1_1_1_3_0 - 0.00185064935064941*G0_1_1_1_3_1 - 0.00103896103896107*G0_1_1_1_3_2 - 0.00251082251082259*G0_1_1_1_3_3 - 0.00138528138528143*G0_1_1_1_3_4 - 0.00242424242424251*G0_1_1_1_3_5 + 0.000438311688311702*G0_1_1_1_4_0 - 0.00138528138528143*G0_1_1_1_4_3 - 0.00186147186147192*G0_1_1_1_4_4 - 0.0012554112554113*G0_1_1_1_4_5 + 0.00360389610389623*G0_1_1_1_5_0 - 0.00918831168831202*G0_1_1_1_5_1 + 0.000573593073593093*G0_1_1_1_5_2 - 0.00242424242424251*G0_1_1_1_5_3 - 0.0012554112554113*G0_1_1_1_5_4 - 0.00952380952380986*G0_1_1_1_5_5 + 0.000262445887445897*G0_1_1_2_0_0 - 0.000679112554112575*G0_1_1_2_0_2 - 0.000183982683982689*G0_1_1_2_0_3 - 0.000194805194805201*G0_1_1_2_0_4 + 0.000286796536796548*G0_1_1_2_0_5 + 0.000882034632034662*G0_1_1_2_1_1 - 0.00127435064935069*G0_1_1_2_1_2 - 0.00103896103896107*G0_1_1_2_1_3 + 0.000573593073593093*G0_1_1_2_1_5 - 0.000679112554112575*G0_1_1_2_2_0 - 0.00127435064935069*G0_1_1_2_2_1 + 0.00868506493506522*G0_1_1_2_2_2 + 0.00595238095238115*G0_1_1_2_2_3 + 0.00281385281385291*G0_1_1_2_2_4 + 0.000573593073593095*G0_1_1_2_2_5 - 0.000183982683982689*G0_1_1_2_3_0 - 0.00103896103896107*G0_1_1_2_3_1 + 0.00595238095238115*G0_1_1_2_3_2 + 0.00441558441558457*G0_1_1_2_3_3 + 0.000562770562770582*G0_1_1_2_3_4 - 0.000779220779220806*G0_1_1_2_3_5 - 0.000194805194805201*G0_1_1_2_4_0 + 0.00281385281385291*G0_1_1_2_4_2 + 0.000562770562770582*G0_1_1_2_4_3 - 0.000346320346320358*G0_1_1_2_4_4 - 0.000952380952380986*G0_1_1_2_4_5 + 0.000286796536796548*G0_1_1_2_5_0 + 0.000573593073593093*G0_1_1_2_5_1 + 0.000573593073593095*G0_1_1_2_5_2 - 0.000779220779220806*G0_1_1_2_5_3 - 0.000952380952380986*G0_1_1_2_5_4 + 0.00190476190476197*G0_1_1_2_5_5 + 0.000167748917748923*G0_1_1_3_0_0 + 0.000638528138528159*G0_1_1_3_0_1 - 0.000183982683982689*G0_1_1_3_0_2 - 0.00225108225108232*G0_1_1_3_0_3 - 0.00121212121212125*G0_1_1_3_0_4 - 0.00090909090909094*G0_1_1_3_0_5 + 0.000638528138528159*G0_1_1_3_1_0 - 0.00185064935064941*G0_1_1_3_1_1 - 0.00103896103896107*G0_1_1_3_1_2 - 0.00251082251082259*G0_1_1_3_1_3 - 0.00138528138528143*G0_1_1_3_1_4 - 0.00242424242424251*G0_1_1_3_1_5 - 0.000183982683982689*G0_1_1_3_2_0 - 0.00103896103896107*G0_1_1_3_2_1 + 0.00595238095238116*G0_1_1_3_2_2 + 0.00441558441558457*G0_1_1_3_2_3 + 0.000562770562770582*G0_1_1_3_2_4 - 0.000779220779220806*G0_1_1_3_2_5 - 0.00225108225108232*G0_1_1_3_3_0 - 0.00251082251082259*G0_1_1_3_3_1 + 0.00441558441558457*G0_1_1_3_3_2 + 0.021298701298702*G0_1_1_3_3_3 + 0.00727272727272751*G0_1_1_3_3_4 + 0.00606060606060627*G0_1_1_3_3_5 - 0.00121212121212125*G0_1_1_3_4_0 - 0.00138528138528143*G0_1_1_3_4_1 + 0.000562770562770582*G0_1_1_3_4_2 + 0.00727272727272751*G0_1_1_3_4_3 + 0.00614718614718635*G0_1_1_3_4_4 + 0.00432900432900448*G0_1_1_3_4_5 - 0.00090909090909094*G0_1_1_3_5_0 - 0.00242424242424251*G0_1_1_3_5_1 - 0.000779220779220806*G0_1_1_3_5_2 + 0.00606060606060627*G0_1_1_3_5_3 + 0.00432900432900448*G0_1_1_3_5_4 - 0.00199134199134205*G0_1_1_3_5_5 - 0.000416666666666683*G0_1_1_4_0_0 + 0.000438311688311702*G0_1_1_4_0_1 - 0.000194805194805201*G0_1_1_4_0_2 - 0.00121212121212125*G0_1_1_4_0_3 - 0.000735930735930761*G0_1_1_4_0_4 - 0.0014502164502165*G0_1_1_4_0_5 + 0.000438311688311702*G0_1_1_4_1_0 - 0.00138528138528143*G0_1_1_4_1_3 - 0.00186147186147192*G0_1_1_4_1_4 - 0.0012554112554113*G0_1_1_4_1_5 - 0.000194805194805201*G0_1_1_4_2_0 + 0.00281385281385291*G0_1_1_4_2_2 + 0.000562770562770582*G0_1_1_4_2_3 - 0.000346320346320357*G0_1_1_4_2_4 - 0.000952380952380986*G0_1_1_4_2_5 - 0.00121212121212125*G0_1_1_4_3_0 - 0.00138528138528143*G0_1_1_4_3_1 + 0.000562770562770582*G0_1_1_4_3_2 + 0.00727272727272752*G0_1_1_4_3_3 + 0.00614718614718635*G0_1_1_4_3_4 + 0.00432900432900448*G0_1_1_4_3_5 - 0.00073593073593076*G0_1_1_4_4_0 - 0.00186147186147192*G0_1_1_4_4_1 - 0.000346320346320357*G0_1_1_4_4_2 + 0.00614718614718635*G0_1_1_4_4_3 + 0.0111688311688315*G0_1_1_4_4_4 + 0.00562770562770582*G0_1_1_4_4_5 - 0.0014502164502165*G0_1_1_4_5_0 - 0.0012554112554113*G0_1_1_4_5_1 - 0.000952380952380986*G0_1_1_4_5_2 + 0.00432900432900448*G0_1_1_4_5_3 + 0.00562770562770582*G0_1_1_4_5_4 - 0.00129870129870133*G0_1_1_4_5_5 - 0.00461580086580103*G0_1_1_5_0_0 + 0.00360389610389623*G0_1_1_5_0_1 + 0.000286796536796548*G0_1_1_5_0_2 - 0.00090909090909094*G0_1_1_5_0_3 - 0.0014502164502165*G0_1_1_5_0_4 - 0.00298701298701312*G0_1_1_5_0_5 + 0.00360389610389623*G0_1_1_5_1_0 - 0.00918831168831202*G0_1_1_5_1_1 + 0.000573593073593093*G0_1_1_5_1_2 - 0.00242424242424251*G0_1_1_5_1_3 - 0.0012554112554113*G0_1_1_5_1_4 - 0.00952380952380986*G0_1_1_5_1_5 + 0.000286796536796548*G0_1_1_5_2_0 + 0.000573593073593093*G0_1_1_5_2_1 + 0.000573593073593095*G0_1_1_5_2_2 - 0.000779220779220806*G0_1_1_5_2_3 - 0.000952380952380986*G0_1_1_5_2_4 + 0.00190476190476197*G0_1_1_5_2_5 - 0.00090909090909094*G0_1_1_5_3_0 - 0.00242424242424251*G0_1_1_5_3_1 - 0.000779220779220806*G0_1_1_5_3_2 + 0.00606060606060627*G0_1_1_5_3_3 + 0.00432900432900448*G0_1_1_5_3_4 - 0.00199134199134205*G0_1_1_5_3_5 - 0.0014502164502165*G0_1_1_5_4_0 - 0.0012554112554113*G0_1_1_5_4_1 - 0.000952380952380986*G0_1_1_5_4_2 + 0.00432900432900448*G0_1_1_5_4_3 + 0.00562770562770582*G0_1_1_5_4_4 - 0.00129870129870133*G0_1_1_5_4_5 - 0.00298701298701312*G0_1_1_5_5_0 - 0.00952380952380986*G0_1_1_5_5_1 + 0.00190476190476197*G0_1_1_5_5_2 - 0.00199134199134205*G0_1_1_5_5_3 - 0.00129870129870133*G0_1_1_5_5_4 - 0.0932467532467564*G0_1_1_5_5_5; + A[80] = -A[30] + 0.0668019480519503*G0_0_0_0_0_0 - 0.00252435064935073*G0_0_0_0_0_1 - 0.00531114718614736*G0_0_0_0_0_2 + 0.00134199134199138*G0_0_0_0_0_3 + 0.0233225108225116*G0_0_0_0_0_4 + 0.010119047619048*G0_0_0_0_0_5 - 0.00252435064935073*G0_0_0_0_1_0 - 0.000703463203463227*G0_0_0_0_1_1 + 0.000201569264069271*G0_0_0_0_1_2 - 0.000974025974026008*G0_0_0_0_1_4 - 0.00531114718614736*G0_0_0_0_2_0 + 0.000201569264069271*G0_0_0_0_2_1 + 0.000533008658008674*G0_0_0_0_2_2 + 0.000508658008658024*G0_0_0_0_2_3 - 0.00305194805194815*G0_0_0_0_2_4 + 0.00134199134199138*G0_0_0_0_3_0 + 0.000508658008658024*G0_0_0_0_3_2 - 0.000735930735930766*G0_0_0_0_3_3 - 0.00073593073593076*G0_0_0_0_3_4 - 0.00272727272727282*G0_0_0_0_3_5 + 0.0233225108225116*G0_0_0_0_4_0 - 0.000974025974026007*G0_0_0_0_4_1 - 0.00305194805194815*G0_0_0_0_4_2 - 0.00073593073593076*G0_0_0_0_4_3 + 0.0206060606060613*G0_0_0_0_4_4 + 0.00190476190476198*G0_0_0_0_4_5 + 0.010119047619048*G0_0_0_0_5_0 - 0.00272727272727282*G0_0_0_0_5_3 + 0.00190476190476198*G0_0_0_0_5_4 - 0.0075324675324678*G0_0_0_0_5_5 - 0.00252435064935073*G0_0_0_1_0_0 - 0.000703463203463227*G0_0_0_1_0_1 + 0.000201569264069271*G0_0_0_1_0_2 - 0.000974025974026008*G0_0_0_1_0_4 - 0.000703463203463227*G0_0_0_1_1_0 + 0.0183441558441565*G0_0_0_1_1_1 - 0.00119047619047623*G0_0_0_1_1_2 + 0.0043019480519482*G0_0_0_1_1_3 + 0.000514069264069279*G0_0_0_1_1_4 + 0.0028409090909092*G0_0_0_1_1_5 + 0.000201569264069271*G0_0_0_1_2_0 - 0.00119047619047623*G0_0_0_1_2_1 - 0.000162337662337669*G0_0_0_1_2_2 + 0.000487012987013003*G0_0_0_1_2_3 + 0.000681818181818204*G0_0_0_1_2_4 + 0.0043019480519482*G0_0_0_1_3_1 + 0.000487012987013003*G0_0_0_1_3_2 + 0.00173160173160179*G0_0_0_1_3_3 - 0.00108225108225112*G0_0_0_1_3_4 - 0.000108225108225105*G0_0_0_1_3_5 - 0.000974025974026008*G0_0_0_1_4_0 + 0.000514069264069279*G0_0_0_1_4_1 + 0.000681818181818204*G0_0_0_1_4_2 - 0.00108225108225112*G0_0_0_1_4_3 - 0.00216450216450224*G0_0_0_1_4_4 - 0.00108225108225112*G0_0_0_1_4_5 + 0.0028409090909092*G0_0_0_1_5_1 - 0.000108225108225105*G0_0_0_1_5_3 - 0.00108225108225112*G0_0_0_1_5_4 + 0.00367965367965382*G0_0_0_1_5_5 - 0.00531114718614736*G0_0_0_2_0_0 + 0.000201569264069271*G0_0_0_2_0_1 + 0.000533008658008674*G0_0_0_2_0_2 + 0.000508658008658024*G0_0_0_2_0_3 - 0.00305194805194815*G0_0_0_2_0_4 + 0.000201569264069271*G0_0_0_2_1_0 - 0.00119047619047623*G0_0_0_2_1_1 - 0.000162337662337669*G0_0_0_2_1_2 + 0.000487012987013002*G0_0_0_2_1_3 + 0.000681818181818204*G0_0_0_2_1_4 + 0.000533008658008674*G0_0_0_2_2_0 - 0.000162337662337669*G0_0_0_2_2_1 + 0.00748376623376652*G0_0_0_2_2_2 + 0.000670995670995701*G0_0_0_2_2_3 + 0.00160173160173167*G0_0_0_2_2_4 + 0.000854978354978385*G0_0_0_2_2_5 + 0.000508658008658024*G0_0_0_2_3_0 + 0.000487012987013002*G0_0_0_2_3_1 + 0.000670995670995701*G0_0_0_2_3_2 - 0.00441558441558456*G0_0_0_2_3_3 - 0.00238095238095245*G0_0_0_2_3_4 - 0.00272727272727282*G0_0_0_2_3_5 - 0.00305194805194815*G0_0_0_2_4_0 + 0.000681818181818204*G0_0_0_2_4_1 + 0.00160173160173167*G0_0_0_2_4_2 - 0.00238095238095245*G0_0_0_2_4_3 - 0.0105627705627709*G0_0_0_2_4_4 - 0.00307359307359318*G0_0_0_2_4_5 + 0.000854978354978385*G0_0_0_2_5_2 - 0.00272727272727282*G0_0_0_2_5_3 - 0.00307359307359318*G0_0_0_2_5_4 - 0.00385281385281398*G0_0_0_2_5_5 + 0.00134199134199138*G0_0_0_3_0_0 + 0.000508658008658024*G0_0_0_3_0_2 - 0.000735930735930766*G0_0_0_3_0_3 - 0.00073593073593076*G0_0_0_3_0_4 - 0.00272727272727282*G0_0_0_3_0_5 + 0.0043019480519482*G0_0_0_3_1_1 + 0.000487012987013003*G0_0_0_3_1_2 + 0.00173160173160178*G0_0_0_3_1_3 - 0.00108225108225112*G0_0_0_3_1_4 - 0.000108225108225104*G0_0_0_3_1_5 + 0.000508658008658024*G0_0_0_3_2_0 + 0.000487012987013002*G0_0_0_3_2_1 + 0.000670995670995701*G0_0_0_3_2_2 - 0.00441558441558456*G0_0_0_3_2_3 - 0.00238095238095245*G0_0_0_3_2_4 - 0.00272727272727282*G0_0_0_3_2_5 - 0.000735930735930766*G0_0_0_3_3_0 + 0.00173160173160178*G0_0_0_3_3_1 - 0.00441558441558456*G0_0_0_3_3_2 - 0.0400000000000013*G0_0_0_3_3_3 + 0.00363636363636375*G0_0_0_3_3_4 + 0.00692640692640714*G0_0_0_3_3_5 - 0.00073593073593076*G0_0_0_3_4_0 - 0.00108225108225112*G0_0_0_3_4_1 - 0.00238095238095245*G0_0_0_3_4_2 + 0.00363636363636375*G0_0_0_3_4_3 + 0.00580086580086598*G0_0_0_3_4_4 + 0.00761904761904786*G0_0_0_3_4_5 - 0.00272727272727282*G0_0_0_3_5_0 - 0.000108225108225105*G0_0_0_3_5_1 - 0.00272727272727282*G0_0_0_3_5_2 + 0.00692640692640714*G0_0_0_3_5_3 + 0.00761904761904786*G0_0_0_3_5_4 + 0.0131601731601736*G0_0_0_3_5_5 + 0.0233225108225116*G0_0_0_4_0_0 - 0.000974025974026008*G0_0_0_4_0_1 - 0.00305194805194815*G0_0_0_4_0_2 - 0.00073593073593076*G0_0_0_4_0_3 + 0.0206060606060613*G0_0_0_4_0_4 + 0.00190476190476198*G0_0_0_4_0_5 - 0.000974025974026008*G0_0_0_4_1_0 + 0.000514069264069279*G0_0_0_4_1_1 + 0.000681818181818204*G0_0_0_4_1_2 - 0.00108225108225112*G0_0_0_4_1_3 - 0.00216450216450224*G0_0_0_4_1_4 - 0.00108225108225112*G0_0_0_4_1_5 - 0.00305194805194815*G0_0_0_4_2_0 + 0.000681818181818204*G0_0_0_4_2_1 + 0.00160173160173166*G0_0_0_4_2_2 - 0.00238095238095245*G0_0_0_4_2_3 - 0.0105627705627709*G0_0_0_4_2_4 - 0.00307359307359318*G0_0_0_4_2_5 - 0.00073593073593076*G0_0_0_4_3_0 - 0.00108225108225112*G0_0_0_4_3_1 - 0.00238095238095245*G0_0_0_4_3_2 + 0.00363636363636375*G0_0_0_4_3_3 + 0.00580086580086598*G0_0_0_4_3_4 + 0.00761904761904786*G0_0_0_4_3_5 + 0.0206060606060613*G0_0_0_4_4_0 - 0.00216450216450224*G0_0_0_4_4_1 - 0.0105627705627709*G0_0_0_4_4_2 + 0.00580086580086598*G0_0_0_4_4_3 + 0.0215584415584423*G0_0_0_4_4_4 + 0.0104761904761908*G0_0_0_4_4_5 + 0.00190476190476198*G0_0_0_4_5_0 - 0.00108225108225112*G0_0_0_4_5_1 - 0.00307359307359318*G0_0_0_4_5_2 + 0.00761904761904786*G0_0_0_4_5_3 + 0.0104761904761908*G0_0_0_4_5_4 + 0.00987012987013018*G0_0_0_4_5_5 + 0.010119047619048*G0_0_0_5_0_0 - 0.00272727272727282*G0_0_0_5_0_3 + 0.00190476190476198*G0_0_0_5_0_4 - 0.0075324675324678*G0_0_0_5_0_5 + 0.0028409090909092*G0_0_0_5_1_1 - 0.000108225108225105*G0_0_0_5_1_3 - 0.00108225108225112*G0_0_0_5_1_4 + 0.00367965367965382*G0_0_0_5_1_5 + 0.000854978354978385*G0_0_0_5_2_2 - 0.00272727272727282*G0_0_0_5_2_3 - 0.00307359307359318*G0_0_0_5_2_4 - 0.00385281385281398*G0_0_0_5_2_5 - 0.00272727272727282*G0_0_0_5_3_0 - 0.000108225108225105*G0_0_0_5_3_1 - 0.00272727272727282*G0_0_0_5_3_2 + 0.00692640692640714*G0_0_0_5_3_3 + 0.00761904761904786*G0_0_0_5_3_4 + 0.0131601731601736*G0_0_0_5_3_5 + 0.00190476190476198*G0_0_0_5_4_0 - 0.00108225108225112*G0_0_0_5_4_1 - 0.00307359307359318*G0_0_0_5_4_2 + 0.00761904761904786*G0_0_0_5_4_3 + 0.0104761904761908*G0_0_0_5_4_4 + 0.00987012987013018*G0_0_0_5_4_5 - 0.0075324675324678*G0_0_0_5_5_0 + 0.00367965367965383*G0_0_0_5_5_1 - 0.00385281385281398*G0_0_0_5_5_2 + 0.0131601731601736*G0_0_0_5_5_3 + 0.00987012987013019*G0_0_0_5_5_4 + 0.0161038961038966*G0_0_0_5_5_5 + 0.0668019480519503*G0_0_1_0_0_0 - 0.00252435064935073*G0_0_1_0_0_1 - 0.00531114718614736*G0_0_1_0_0_2 + 0.00134199134199138*G0_0_1_0_0_3 + 0.0233225108225116*G0_0_1_0_0_4 + 0.010119047619048*G0_0_1_0_0_5 - 0.00252435064935073*G0_0_1_0_1_0 - 0.000703463203463227*G0_0_1_0_1_1 + 0.000201569264069271*G0_0_1_0_1_2 - 0.000974025974026008*G0_0_1_0_1_4 - 0.00531114718614736*G0_0_1_0_2_0 + 0.000201569264069271*G0_0_1_0_2_1 + 0.000533008658008674*G0_0_1_0_2_2 + 0.000508658008658024*G0_0_1_0_2_3 - 0.00305194805194815*G0_0_1_0_2_4 + 0.00134199134199138*G0_0_1_0_3_0 + 0.000508658008658024*G0_0_1_0_3_2 - 0.000735930735930763*G0_0_1_0_3_3 - 0.000735930735930759*G0_0_1_0_3_4 - 0.00272727272727282*G0_0_1_0_3_5 + 0.0233225108225116*G0_0_1_0_4_0 - 0.000974025974026007*G0_0_1_0_4_1 - 0.00305194805194815*G0_0_1_0_4_2 - 0.000735930735930759*G0_0_1_0_4_3 + 0.0206060606060613*G0_0_1_0_4_4 + 0.00190476190476198*G0_0_1_0_4_5 + 0.010119047619048*G0_0_1_0_5_0 - 0.00272727272727282*G0_0_1_0_5_3 + 0.00190476190476198*G0_0_1_0_5_4 - 0.0075324675324678*G0_0_1_0_5_5 - 0.00252435064935073*G0_0_1_1_0_0 - 0.000703463203463227*G0_0_1_1_0_1 + 0.000201569264069271*G0_0_1_1_0_2 - 0.000974025974026008*G0_0_1_1_0_4 - 0.000703463203463227*G0_0_1_1_1_0 + 0.0183441558441565*G0_0_1_1_1_1 - 0.00119047619047623*G0_0_1_1_1_2 + 0.00430194805194819*G0_0_1_1_1_3 + 0.000514069264069279*G0_0_1_1_1_4 + 0.0028409090909092*G0_0_1_1_1_5 + 0.000201569264069271*G0_0_1_1_2_0 - 0.00119047619047623*G0_0_1_1_2_1 - 0.000162337662337669*G0_0_1_1_2_2 + 0.000487012987013003*G0_0_1_1_2_3 + 0.000681818181818204*G0_0_1_1_2_4 + 0.00430194805194819*G0_0_1_1_3_1 + 0.000487012987013004*G0_0_1_1_3_2 + 0.00173160173160178*G0_0_1_1_3_3 - 0.00108225108225112*G0_0_1_1_3_4 - 0.000108225108225105*G0_0_1_1_3_5 - 0.000974025974026008*G0_0_1_1_4_0 + 0.000514069264069279*G0_0_1_1_4_1 + 0.000681818181818204*G0_0_1_1_4_2 - 0.00108225108225112*G0_0_1_1_4_3 - 0.00216450216450224*G0_0_1_1_4_4 - 0.00108225108225112*G0_0_1_1_4_5 + 0.0028409090909092*G0_0_1_1_5_1 - 0.000108225108225105*G0_0_1_1_5_3 - 0.00108225108225112*G0_0_1_1_5_4 + 0.00367965367965383*G0_0_1_1_5_5 - 0.00531114718614736*G0_0_1_2_0_0 + 0.000201569264069271*G0_0_1_2_0_1 + 0.000533008658008674*G0_0_1_2_0_2 + 0.000508658008658024*G0_0_1_2_0_3 - 0.00305194805194815*G0_0_1_2_0_4 + 0.000201569264069271*G0_0_1_2_1_0 - 0.00119047619047623*G0_0_1_2_1_1 - 0.000162337662337669*G0_0_1_2_1_2 + 0.000487012987013004*G0_0_1_2_1_3 + 0.000681818181818204*G0_0_1_2_1_4 + 0.000533008658008674*G0_0_1_2_2_0 - 0.000162337662337669*G0_0_1_2_2_1 + 0.00748376623376652*G0_0_1_2_2_2 + 0.000670995670995699*G0_0_1_2_2_3 + 0.00160173160173166*G0_0_1_2_2_4 + 0.000854978354978384*G0_0_1_2_2_5 + 0.000508658008658024*G0_0_1_2_3_0 + 0.000487012987013004*G0_0_1_2_3_1 + 0.000670995670995699*G0_0_1_2_3_2 - 0.00441558441558456*G0_0_1_2_3_3 - 0.00238095238095246*G0_0_1_2_3_4 - 0.00272727272727282*G0_0_1_2_3_5 - 0.00305194805194815*G0_0_1_2_4_0 + 0.000681818181818204*G0_0_1_2_4_1 + 0.00160173160173166*G0_0_1_2_4_2 - 0.00238095238095246*G0_0_1_2_4_3 - 0.0105627705627709*G0_0_1_2_4_4 - 0.00307359307359318*G0_0_1_2_4_5 + 0.000854978354978384*G0_0_1_2_5_2 - 0.00272727272727282*G0_0_1_2_5_3 - 0.00307359307359318*G0_0_1_2_5_4 - 0.00385281385281398*G0_0_1_2_5_5 + 0.00134199134199138*G0_0_1_3_0_0 + 0.000508658008658024*G0_0_1_3_0_2 - 0.000735930735930763*G0_0_1_3_0_3 - 0.000735930735930759*G0_0_1_3_0_4 - 0.00272727272727282*G0_0_1_3_0_5 + 0.00430194805194819*G0_0_1_3_1_1 + 0.000487012987013003*G0_0_1_3_1_2 + 0.00173160173160178*G0_0_1_3_1_3 - 0.00108225108225112*G0_0_1_3_1_4 - 0.000108225108225105*G0_0_1_3_1_5 + 0.000508658008658024*G0_0_1_3_2_0 + 0.000487012987013003*G0_0_1_3_2_1 + 0.000670995670995699*G0_0_1_3_2_2 - 0.00441558441558456*G0_0_1_3_2_3 - 0.00238095238095246*G0_0_1_3_2_4 - 0.00272727272727282*G0_0_1_3_2_5 - 0.000735930735930763*G0_0_1_3_3_0 + 0.00173160173160178*G0_0_1_3_3_1 - 0.00441558441558456*G0_0_1_3_3_2 - 0.0400000000000014*G0_0_1_3_3_3 + 0.00363636363636374*G0_0_1_3_3_4 + 0.00692640692640714*G0_0_1_3_3_5 - 0.000735930735930759*G0_0_1_3_4_0 - 0.00108225108225112*G0_0_1_3_4_1 - 0.00238095238095246*G0_0_1_3_4_2 + 0.00363636363636374*G0_0_1_3_4_3 + 0.00580086580086597*G0_0_1_3_4_4 + 0.00761904761904786*G0_0_1_3_4_5 - 0.00272727272727282*G0_0_1_3_5_0 - 0.000108225108225105*G0_0_1_3_5_1 - 0.00272727272727282*G0_0_1_3_5_2 + 0.00692640692640714*G0_0_1_3_5_3 + 0.00761904761904786*G0_0_1_3_5_4 + 0.0131601731601736*G0_0_1_3_5_5 + 0.0233225108225116*G0_0_1_4_0_0 - 0.000974025974026008*G0_0_1_4_0_1 - 0.00305194805194815*G0_0_1_4_0_2 - 0.000735930735930759*G0_0_1_4_0_3 + 0.0206060606060613*G0_0_1_4_0_4 + 0.00190476190476198*G0_0_1_4_0_5 - 0.000974025974026008*G0_0_1_4_1_0 + 0.000514069264069279*G0_0_1_4_1_1 + 0.000681818181818204*G0_0_1_4_1_2 - 0.00108225108225112*G0_0_1_4_1_3 - 0.00216450216450224*G0_0_1_4_1_4 - 0.00108225108225111*G0_0_1_4_1_5 - 0.00305194805194815*G0_0_1_4_2_0 + 0.000681818181818204*G0_0_1_4_2_1 + 0.00160173160173166*G0_0_1_4_2_2 - 0.00238095238095245*G0_0_1_4_2_3 - 0.0105627705627709*G0_0_1_4_2_4 - 0.00307359307359318*G0_0_1_4_2_5 - 0.000735930735930759*G0_0_1_4_3_0 - 0.00108225108225112*G0_0_1_4_3_1 - 0.00238095238095246*G0_0_1_4_3_2 + 0.00363636363636374*G0_0_1_4_3_3 + 0.00580086580086597*G0_0_1_4_3_4 + 0.00761904761904786*G0_0_1_4_3_5 + 0.0206060606060613*G0_0_1_4_4_0 - 0.00216450216450224*G0_0_1_4_4_1 - 0.0105627705627709*G0_0_1_4_4_2 + 0.00580086580086597*G0_0_1_4_4_3 + 0.0215584415584423*G0_0_1_4_4_4 + 0.0104761904761908*G0_0_1_4_4_5 + 0.00190476190476198*G0_0_1_4_5_0 - 0.00108225108225111*G0_0_1_4_5_1 - 0.00307359307359318*G0_0_1_4_5_2 + 0.00761904761904786*G0_0_1_4_5_3 + 0.0104761904761908*G0_0_1_4_5_4 + 0.00987012987013018*G0_0_1_4_5_5 + 0.010119047619048*G0_0_1_5_0_0 - 0.00272727272727282*G0_0_1_5_0_3 + 0.00190476190476198*G0_0_1_5_0_4 - 0.0075324675324678*G0_0_1_5_0_5 + 0.0028409090909092*G0_0_1_5_1_1 - 0.000108225108225105*G0_0_1_5_1_3 - 0.00108225108225112*G0_0_1_5_1_4 + 0.00367965367965383*G0_0_1_5_1_5 + 0.000854978354978384*G0_0_1_5_2_2 - 0.00272727272727282*G0_0_1_5_2_3 - 0.00307359307359318*G0_0_1_5_2_4 - 0.00385281385281398*G0_0_1_5_2_5 - 0.00272727272727282*G0_0_1_5_3_0 - 0.000108225108225105*G0_0_1_5_3_1 - 0.00272727272727282*G0_0_1_5_3_2 + 0.00692640692640714*G0_0_1_5_3_3 + 0.00761904761904786*G0_0_1_5_3_4 + 0.0131601731601736*G0_0_1_5_3_5 + 0.00190476190476198*G0_0_1_5_4_0 - 0.00108225108225112*G0_0_1_5_4_1 - 0.00307359307359318*G0_0_1_5_4_2 + 0.00761904761904786*G0_0_1_5_4_3 + 0.0104761904761908*G0_0_1_5_4_4 + 0.00987012987013018*G0_0_1_5_4_5 - 0.0075324675324678*G0_0_1_5_5_0 + 0.00367965367965383*G0_0_1_5_5_1 - 0.00385281385281398*G0_0_1_5_5_2 + 0.0131601731601736*G0_0_1_5_5_3 + 0.00987012987013018*G0_0_1_5_5_4 + 0.0161038961038966*G0_0_1_5_5_5; + A[14] = -A[16] - 0.00748376623376649*G0_0_1_0_0_0 - 0.000533008658008677*G0_0_1_0_0_1 + 0.000162337662337667*G0_0_1_0_0_2 - 0.000854978354978379*G0_0_1_0_0_3 - 0.000670995670995693*G0_0_1_0_0_4 - 0.00160173160173165*G0_0_1_0_0_5 - 0.000533008658008677*G0_0_1_0_1_0 + 0.00531114718614737*G0_0_1_0_1_1 - 0.000201569264069271*G0_0_1_0_1_2 - 0.000508658008658026*G0_0_1_0_1_4 + 0.00305194805194815*G0_0_1_0_1_5 + 0.000162337662337667*G0_0_1_0_2_0 - 0.000201569264069271*G0_0_1_0_2_1 + 0.00119047619047623*G0_0_1_0_2_2 - 0.000487012987012999*G0_0_1_0_2_4 - 0.000681818181818204*G0_0_1_0_2_5 - 0.000854978354978379*G0_0_1_0_3_0 + 0.00385281385281396*G0_0_1_0_3_3 + 0.00272727272727281*G0_0_1_0_3_4 + 0.00307359307359317*G0_0_1_0_3_5 - 0.000670995670995693*G0_0_1_0_4_0 - 0.000508658008658026*G0_0_1_0_4_1 - 0.000487012987012999*G0_0_1_0_4_2 + 0.00272727272727281*G0_0_1_0_4_3 + 0.00441558441558456*G0_0_1_0_4_4 + 0.00238095238095246*G0_0_1_0_4_5 - 0.00160173160173165*G0_0_1_0_5_0 + 0.00305194805194815*G0_0_1_0_5_1 - 0.000681818181818204*G0_0_1_0_5_2 + 0.00307359307359317*G0_0_1_0_5_3 + 0.00238095238095246*G0_0_1_0_5_4 + 0.0105627705627709*G0_0_1_0_5_5 - 0.000533008658008677*G0_0_1_1_0_0 + 0.00531114718614737*G0_0_1_1_0_1 - 0.000201569264069271*G0_0_1_1_0_2 - 0.000508658008658026*G0_0_1_1_0_4 + 0.00305194805194815*G0_0_1_1_0_5 + 0.00531114718614737*G0_0_1_1_1_0 - 0.0668019480519504*G0_0_1_1_1_1 + 0.00252435064935074*G0_0_1_1_1_2 - 0.010119047619048*G0_0_1_1_1_3 - 0.00134199134199138*G0_0_1_1_1_4 - 0.0233225108225117*G0_0_1_1_1_5 - 0.000201569264069271*G0_0_1_1_2_0 + 0.00252435064935074*G0_0_1_1_2_1 + 0.000703463203463229*G0_0_1_1_2_2 + 0.00097402597402601*G0_0_1_1_2_5 - 0.010119047619048*G0_0_1_1_3_1 + 0.00753246753246781*G0_0_1_1_3_3 + 0.00272727272727282*G0_0_1_1_3_4 - 0.00190476190476198*G0_0_1_1_3_5 - 0.000508658008658026*G0_0_1_1_4_0 - 0.00134199134199138*G0_0_1_1_4_1 + 0.00272727272727282*G0_0_1_1_4_3 + 0.000735930735930763*G0_0_1_1_4_4 + 0.000735930735930762*G0_0_1_1_4_5 + 0.00305194805194815*G0_0_1_1_5_0 - 0.0233225108225117*G0_0_1_1_5_1 + 0.00097402597402601*G0_0_1_1_5_2 - 0.00190476190476198*G0_0_1_1_5_3 + 0.000735930735930762*G0_0_1_1_5_4 - 0.0206060606060613*G0_0_1_1_5_5 + 0.000162337662337667*G0_0_1_2_0_0 - 0.000201569264069271*G0_0_1_2_0_1 + 0.00119047619047623*G0_0_1_2_0_2 - 0.000487012987012999*G0_0_1_2_0_4 - 0.000681818181818204*G0_0_1_2_0_5 - 0.000201569264069271*G0_0_1_2_1_0 + 0.00252435064935073*G0_0_1_2_1_1 + 0.000703463203463229*G0_0_1_2_1_2 + 0.00097402597402601*G0_0_1_2_1_5 + 0.00119047619047623*G0_0_1_2_2_0 + 0.000703463203463229*G0_0_1_2_2_1 - 0.0183441558441565*G0_0_1_2_2_2 - 0.0028409090909092*G0_0_1_2_2_3 - 0.00430194805194822*G0_0_1_2_2_4 - 0.000514069264069284*G0_0_1_2_2_5 - 0.0028409090909092*G0_0_1_2_3_2 - 0.00367965367965383*G0_0_1_2_3_3 + 0.000108225108225104*G0_0_1_2_3_4 + 0.00108225108225111*G0_0_1_2_3_5 - 0.000487012987012999*G0_0_1_2_4_0 - 0.00430194805194822*G0_0_1_2_4_2 + 0.000108225108225104*G0_0_1_2_4_3 - 0.0017316017316018*G0_0_1_2_4_4 + 0.00108225108225111*G0_0_1_2_4_5 - 0.000681818181818204*G0_0_1_2_5_0 + 0.00097402597402601*G0_0_1_2_5_1 - 0.000514069264069284*G0_0_1_2_5_2 + 0.00108225108225111*G0_0_1_2_5_3 + 0.00108225108225111*G0_0_1_2_5_4 + 0.00216450216450223*G0_0_1_2_5_5 - 0.000854978354978379*G0_0_1_3_0_0 + 0.00385281385281396*G0_0_1_3_0_3 + 0.00272727272727281*G0_0_1_3_0_4 + 0.00307359307359317*G0_0_1_3_0_5 - 0.010119047619048*G0_0_1_3_1_1 + 0.00753246753246781*G0_0_1_3_1_3 + 0.00272727272727282*G0_0_1_3_1_4 - 0.00190476190476198*G0_0_1_3_1_5 - 0.0028409090909092*G0_0_1_3_2_2 - 0.00367965367965383*G0_0_1_3_2_3 + 0.000108225108225104*G0_0_1_3_2_4 + 0.00108225108225111*G0_0_1_3_2_5 + 0.00385281385281396*G0_0_1_3_3_0 + 0.00753246753246781*G0_0_1_3_3_1 - 0.00367965367965383*G0_0_1_3_3_2 - 0.0161038961038965*G0_0_1_3_3_3 - 0.0131601731601736*G0_0_1_3_3_4 - 0.00987012987013017*G0_0_1_3_3_5 + 0.00272727272727281*G0_0_1_3_4_0 + 0.00272727272727282*G0_0_1_3_4_1 + 0.000108225108225104*G0_0_1_3_4_2 - 0.0131601731601736*G0_0_1_3_4_3 - 0.00692640692640715*G0_0_1_3_4_4 - 0.00761904761904786*G0_0_1_3_4_5 + 0.00307359307359317*G0_0_1_3_5_0 - 0.00190476190476198*G0_0_1_3_5_1 + 0.00108225108225111*G0_0_1_3_5_2 - 0.00987012987013017*G0_0_1_3_5_3 - 0.00761904761904786*G0_0_1_3_5_4 - 0.0104761904761908*G0_0_1_3_5_5 - 0.000670995670995693*G0_0_1_4_0_0 - 0.000508658008658026*G0_0_1_4_0_1 - 0.000487012987012999*G0_0_1_4_0_2 + 0.00272727272727281*G0_0_1_4_0_3 + 0.00441558441558456*G0_0_1_4_0_4 + 0.00238095238095246*G0_0_1_4_0_5 - 0.000508658008658026*G0_0_1_4_1_0 - 0.00134199134199138*G0_0_1_4_1_1 + 0.00272727272727282*G0_0_1_4_1_3 + 0.000735930735930763*G0_0_1_4_1_4 + 0.000735930735930762*G0_0_1_4_1_5 - 0.000487012987012999*G0_0_1_4_2_0 - 0.00430194805194822*G0_0_1_4_2_2 + 0.000108225108225104*G0_0_1_4_2_3 - 0.0017316017316018*G0_0_1_4_2_4 + 0.00108225108225111*G0_0_1_4_2_5 + 0.00272727272727281*G0_0_1_4_3_0 + 0.00272727272727282*G0_0_1_4_3_1 + 0.000108225108225104*G0_0_1_4_3_2 - 0.0131601731601736*G0_0_1_4_3_3 - 0.00692640692640715*G0_0_1_4_3_4 - 0.00761904761904786*G0_0_1_4_3_5 + 0.00441558441558456*G0_0_1_4_4_0 + 0.000735930735930763*G0_0_1_4_4_1 - 0.0017316017316018*G0_0_1_4_4_2 - 0.00692640692640715*G0_0_1_4_4_3 + 0.0400000000000012*G0_0_1_4_4_4 - 0.00363636363636375*G0_0_1_4_4_5 + 0.00238095238095246*G0_0_1_4_5_0 + 0.000735930735930762*G0_0_1_4_5_1 + 0.00108225108225111*G0_0_1_4_5_2 - 0.00761904761904786*G0_0_1_4_5_3 - 0.00363636363636375*G0_0_1_4_5_4 - 0.00580086580086598*G0_0_1_4_5_5 - 0.00160173160173165*G0_0_1_5_0_0 + 0.00305194805194815*G0_0_1_5_0_1 - 0.000681818181818204*G0_0_1_5_0_2 + 0.00307359307359317*G0_0_1_5_0_3 + 0.00238095238095246*G0_0_1_5_0_4 + 0.0105627705627709*G0_0_1_5_0_5 + 0.00305194805194815*G0_0_1_5_1_0 - 0.0233225108225117*G0_0_1_5_1_1 + 0.00097402597402601*G0_0_1_5_1_2 - 0.00190476190476198*G0_0_1_5_1_3 + 0.000735930735930762*G0_0_1_5_1_4 - 0.0206060606060613*G0_0_1_5_1_5 - 0.000681818181818204*G0_0_1_5_2_0 + 0.00097402597402601*G0_0_1_5_2_1 - 0.000514069264069284*G0_0_1_5_2_2 + 0.00108225108225111*G0_0_1_5_2_3 + 0.00108225108225111*G0_0_1_5_2_4 + 0.00216450216450223*G0_0_1_5_2_5 + 0.00307359307359317*G0_0_1_5_3_0 - 0.00190476190476198*G0_0_1_5_3_1 + 0.00108225108225111*G0_0_1_5_3_2 - 0.00987012987013017*G0_0_1_5_3_3 - 0.00761904761904786*G0_0_1_5_3_4 - 0.0104761904761908*G0_0_1_5_3_5 + 0.00238095238095246*G0_0_1_5_4_0 + 0.000735930735930762*G0_0_1_5_4_1 + 0.00108225108225111*G0_0_1_5_4_2 - 0.00761904761904786*G0_0_1_5_4_3 - 0.00363636363636375*G0_0_1_5_4_4 - 0.00580086580086598*G0_0_1_5_4_5 + 0.0105627705627709*G0_0_1_5_5_0 - 0.0206060606060613*G0_0_1_5_5_1 + 0.00216450216450223*G0_0_1_5_5_2 - 0.0104761904761908*G0_0_1_5_5_3 - 0.00580086580086598*G0_0_1_5_5_4 - 0.0215584415584422*G0_0_1_5_5_5; + A[23] = -A[28] - 0.00748376623376648*G0_1_0_0_0_0 + 0.000162337662337666*G0_1_0_0_0_1 - 0.000533008658008677*G0_1_0_0_0_2 - 0.00085497835497838*G0_1_0_0_0_3 - 0.00160173160173165*G0_1_0_0_0_4 - 0.000670995670995687*G0_1_0_0_0_5 + 0.000162337662337666*G0_1_0_0_1_0 + 0.00119047619047623*G0_1_0_0_1_1 - 0.000201569264069271*G0_1_0_0_1_2 - 0.000681818181818205*G0_1_0_0_1_4 - 0.000487012987013004*G0_1_0_0_1_5 - 0.000533008658008677*G0_1_0_0_2_0 - 0.000201569264069271*G0_1_0_0_2_1 + 0.00531114718614737*G0_1_0_0_2_2 + 0.00305194805194816*G0_1_0_0_2_4 - 0.000508658008658025*G0_1_0_0_2_5 - 0.00085497835497838*G0_1_0_0_3_0 + 0.00385281385281397*G0_1_0_0_3_3 + 0.00307359307359317*G0_1_0_0_3_4 + 0.00272727272727282*G0_1_0_0_3_5 - 0.00160173160173165*G0_1_0_0_4_0 - 0.000681818181818205*G0_1_0_0_4_1 + 0.00305194805194816*G0_1_0_0_4_2 + 0.00307359307359317*G0_1_0_0_4_3 + 0.0105627705627709*G0_1_0_0_4_4 + 0.00238095238095246*G0_1_0_0_4_5 - 0.000670995670995687*G0_1_0_0_5_0 - 0.000487012987013004*G0_1_0_0_5_1 - 0.000508658008658025*G0_1_0_0_5_2 + 0.00272727272727282*G0_1_0_0_5_3 + 0.00238095238095246*G0_1_0_0_5_4 + 0.00441558441558458*G0_1_0_0_5_5 + 0.000162337662337666*G0_1_0_1_0_0 + 0.00119047619047623*G0_1_0_1_0_1 - 0.000201569264069271*G0_1_0_1_0_2 - 0.000681818181818205*G0_1_0_1_0_4 - 0.000487012987013004*G0_1_0_1_0_5 + 0.00119047619047623*G0_1_0_1_1_0 - 0.0183441558441565*G0_1_0_1_1_1 + 0.000703463203463227*G0_1_0_1_1_2 - 0.00284090909090919*G0_1_0_1_1_3 - 0.000514069264069279*G0_1_0_1_1_4 - 0.00430194805194821*G0_1_0_1_1_5 - 0.000201569264069271*G0_1_0_1_2_0 + 0.000703463203463227*G0_1_0_1_2_1 + 0.00252435064935074*G0_1_0_1_2_2 + 0.000974025974026008*G0_1_0_1_2_4 - 0.00284090909090919*G0_1_0_1_3_1 - 0.00367965367965381*G0_1_0_1_3_3 + 0.00108225108225112*G0_1_0_1_3_4 + 0.000108225108225108*G0_1_0_1_3_5 - 0.000681818181818205*G0_1_0_1_4_0 - 0.000514069264069279*G0_1_0_1_4_1 + 0.000974025974026008*G0_1_0_1_4_2 + 0.00108225108225112*G0_1_0_1_4_3 + 0.00216450216450224*G0_1_0_1_4_4 + 0.00108225108225112*G0_1_0_1_4_5 - 0.000487012987013004*G0_1_0_1_5_0 - 0.00430194805194821*G0_1_0_1_5_1 + 0.000108225108225109*G0_1_0_1_5_3 + 0.00108225108225112*G0_1_0_1_5_4 - 0.00173160173160179*G0_1_0_1_5_5 - 0.000533008658008677*G0_1_0_2_0_0 - 0.000201569264069271*G0_1_0_2_0_1 + 0.00531114718614737*G0_1_0_2_0_2 + 0.00305194805194816*G0_1_0_2_0_4 - 0.000508658008658025*G0_1_0_2_0_5 - 0.000201569264069271*G0_1_0_2_1_0 + 0.000703463203463227*G0_1_0_2_1_1 + 0.00252435064935074*G0_1_0_2_1_2 + 0.000974025974026008*G0_1_0_2_1_4 + 0.00531114718614737*G0_1_0_2_2_0 + 0.00252435064935074*G0_1_0_2_2_1 - 0.0668019480519504*G0_1_0_2_2_2 - 0.010119047619048*G0_1_0_2_2_3 - 0.0233225108225116*G0_1_0_2_2_4 - 0.0013419913419914*G0_1_0_2_2_5 - 0.010119047619048*G0_1_0_2_3_2 + 0.00753246753246777*G0_1_0_2_3_3 - 0.00190476190476198*G0_1_0_2_3_4 + 0.00272727272727282*G0_1_0_2_3_5 + 0.00305194805194816*G0_1_0_2_4_0 + 0.000974025974026008*G0_1_0_2_4_1 - 0.0233225108225116*G0_1_0_2_4_2 - 0.00190476190476198*G0_1_0_2_4_3 - 0.0206060606060613*G0_1_0_2_4_4 + 0.000735930735930755*G0_1_0_2_4_5 - 0.000508658008658024*G0_1_0_2_5_0 - 0.0013419913419914*G0_1_0_2_5_2 + 0.00272727272727282*G0_1_0_2_5_3 + 0.000735930735930755*G0_1_0_2_5_4 + 0.000735930735930762*G0_1_0_2_5_5 - 0.00085497835497838*G0_1_0_3_0_0 + 0.00385281385281397*G0_1_0_3_0_3 + 0.00307359307359317*G0_1_0_3_0_4 + 0.00272727272727282*G0_1_0_3_0_5 - 0.00284090909090919*G0_1_0_3_1_1 - 0.00367965367965381*G0_1_0_3_1_3 + 0.00108225108225112*G0_1_0_3_1_4 + 0.000108225108225108*G0_1_0_3_1_5 - 0.010119047619048*G0_1_0_3_2_2 + 0.00753246753246777*G0_1_0_3_2_3 - 0.00190476190476198*G0_1_0_3_2_4 + 0.00272727272727282*G0_1_0_3_2_5 + 0.00385281385281397*G0_1_0_3_3_0 - 0.00367965367965381*G0_1_0_3_3_1 + 0.00753246753246777*G0_1_0_3_3_2 - 0.0161038961038966*G0_1_0_3_3_3 - 0.00987012987013019*G0_1_0_3_3_4 - 0.0131601731601736*G0_1_0_3_3_5 + 0.00307359307359317*G0_1_0_3_4_0 + 0.00108225108225112*G0_1_0_3_4_1 - 0.00190476190476198*G0_1_0_3_4_2 - 0.00987012987013019*G0_1_0_3_4_3 - 0.0104761904761908*G0_1_0_3_4_4 - 0.00761904761904787*G0_1_0_3_4_5 + 0.00272727272727282*G0_1_0_3_5_0 + 0.000108225108225108*G0_1_0_3_5_1 + 0.00272727272727282*G0_1_0_3_5_2 - 0.0131601731601736*G0_1_0_3_5_3 - 0.00761904761904787*G0_1_0_3_5_4 - 0.00692640692640716*G0_1_0_3_5_5 - 0.00160173160173165*G0_1_0_4_0_0 - 0.000681818181818205*G0_1_0_4_0_1 + 0.00305194805194816*G0_1_0_4_0_2 + 0.00307359307359317*G0_1_0_4_0_3 + 0.0105627705627709*G0_1_0_4_0_4 + 0.00238095238095246*G0_1_0_4_0_5 - 0.000681818181818205*G0_1_0_4_1_0 - 0.000514069264069279*G0_1_0_4_1_1 + 0.000974025974026008*G0_1_0_4_1_2 + 0.00108225108225112*G0_1_0_4_1_3 + 0.00216450216450224*G0_1_0_4_1_4 + 0.00108225108225112*G0_1_0_4_1_5 + 0.00305194805194816*G0_1_0_4_2_0 + 0.000974025974026008*G0_1_0_4_2_1 - 0.0233225108225116*G0_1_0_4_2_2 - 0.00190476190476198*G0_1_0_4_2_3 - 0.0206060606060613*G0_1_0_4_2_4 + 0.000735930735930755*G0_1_0_4_2_5 + 0.00307359307359317*G0_1_0_4_3_0 + 0.00108225108225112*G0_1_0_4_3_1 - 0.00190476190476198*G0_1_0_4_3_2 - 0.00987012987013019*G0_1_0_4_3_3 - 0.0104761904761908*G0_1_0_4_3_4 - 0.00761904761904787*G0_1_0_4_3_5 + 0.0105627705627709*G0_1_0_4_4_0 + 0.00216450216450224*G0_1_0_4_4_1 - 0.0206060606060613*G0_1_0_4_4_2 - 0.0104761904761908*G0_1_0_4_4_3 - 0.0215584415584423*G0_1_0_4_4_4 - 0.005800865800866*G0_1_0_4_4_5 + 0.00238095238095246*G0_1_0_4_5_0 + 0.00108225108225112*G0_1_0_4_5_1 + 0.000735930735930755*G0_1_0_4_5_2 - 0.00761904761904787*G0_1_0_4_5_3 - 0.005800865800866*G0_1_0_4_5_4 - 0.00363636363636376*G0_1_0_4_5_5 - 0.000670995670995687*G0_1_0_5_0_0 - 0.000487012987013004*G0_1_0_5_0_1 - 0.000508658008658025*G0_1_0_5_0_2 + 0.00272727272727282*G0_1_0_5_0_3 + 0.00238095238095246*G0_1_0_5_0_4 + 0.00441558441558458*G0_1_0_5_0_5 - 0.000487012987013004*G0_1_0_5_1_0 - 0.00430194805194821*G0_1_0_5_1_1 + 0.000108225108225109*G0_1_0_5_1_3 + 0.00108225108225112*G0_1_0_5_1_4 - 0.00173160173160179*G0_1_0_5_1_5 - 0.000508658008658024*G0_1_0_5_2_0 - 0.0013419913419914*G0_1_0_5_2_2 + 0.00272727272727282*G0_1_0_5_2_3 + 0.000735930735930755*G0_1_0_5_2_4 + 0.000735930735930762*G0_1_0_5_2_5 + 0.00272727272727282*G0_1_0_5_3_0 + 0.000108225108225108*G0_1_0_5_3_1 + 0.00272727272727282*G0_1_0_5_3_2 - 0.0131601731601736*G0_1_0_5_3_3 - 0.00761904761904787*G0_1_0_5_3_4 - 0.00692640692640716*G0_1_0_5_3_5 + 0.00238095238095246*G0_1_0_5_4_0 + 0.00108225108225112*G0_1_0_5_4_1 + 0.000735930735930755*G0_1_0_5_4_2 - 0.00761904761904787*G0_1_0_5_4_3 - 0.005800865800866*G0_1_0_5_4_4 - 0.00363636363636376*G0_1_0_5_4_5 + 0.00441558441558458*G0_1_0_5_5_0 - 0.00173160173160179*G0_1_0_5_5_1 + 0.000735930735930762*G0_1_0_5_5_2 - 0.00692640692640716*G0_1_0_5_5_3 - 0.00363636363636376*G0_1_0_5_5_4 + 0.0400000000000013*G0_1_0_5_5_5; + A[25] = -A[23] - 0.00172889610389617*G0_1_0_0_0_0 + 0.000186688311688318*G0_1_0_0_0_1 - 0.000616883116883137*G0_1_0_0_0_2 - 0.000454545454545469*G0_1_0_0_0_3 - 0.000194805194805198*G0_1_0_0_0_4 - 0.000941558441558476*G0_1_0_0_0_5 + 0.000186688311688318*G0_1_0_0_1_0 - 0.000186688311688316*G0_1_0_0_1_1 + 0.000454545454545468*G0_1_0_0_1_3 - 0.00045454545454547*G0_1_0_0_1_4 - 0.000616883116883137*G0_1_0_0_2_0 + 0.00219155844155851*G0_1_0_0_2_2 - 0.000909090909090935*G0_1_0_0_2_3 + 0.00220779220779228*G0_1_0_0_2_4 - 0.000194805194805201*G0_1_0_0_2_5 - 0.000454545454545468*G0_1_0_0_3_0 + 0.000454545454545468*G0_1_0_0_3_1 - 0.000909090909090935*G0_1_0_0_3_2 + 0.00207792207792215*G0_1_0_0_3_3 + 0.00181818181818188*G0_1_0_0_3_4 + 0.00129870129870134*G0_1_0_0_3_5 - 0.000194805194805198*G0_1_0_0_4_0 - 0.00045454545454547*G0_1_0_0_4_1 + 0.00220779220779228*G0_1_0_0_4_2 + 0.00181818181818188*G0_1_0_0_4_3 + 0.0124675324675329*G0_1_0_0_4_4 + 0.00129870129870134*G0_1_0_0_4_5 - 0.000941558441558476*G0_1_0_0_5_0 - 0.000194805194805201*G0_1_0_0_5_2 + 0.00129870129870134*G0_1_0_0_5_3 + 0.00129870129870134*G0_1_0_0_5_4 - 0.000389610389610403*G0_1_0_0_5_5 + 0.000186688311688318*G0_1_0_1_0_0 - 0.000186688311688316*G0_1_0_1_0_1 + 0.000454545454545468*G0_1_0_1_0_3 - 0.00045454545454547*G0_1_0_1_0_4 - 0.000186688311688316*G0_1_0_1_1_0 + 0.00172889610389614*G0_1_0_1_1_1 + 0.000616883116883139*G0_1_0_1_1_2 + 0.000194805194805194*G0_1_0_1_1_3 + 0.000454545454545469*G0_1_0_1_1_4 + 0.000941558441558469*G0_1_0_1_1_5 + 0.000616883116883139*G0_1_0_1_2_1 - 0.00219155844155852*G0_1_0_1_2_2 - 0.00220779220779228*G0_1_0_1_2_3 + 0.000909090909090939*G0_1_0_1_2_4 + 0.000194805194805202*G0_1_0_1_2_5 + 0.000454545454545468*G0_1_0_1_3_0 + 0.000194805194805194*G0_1_0_1_3_1 - 0.00220779220779228*G0_1_0_1_3_2 - 0.0124675324675329*G0_1_0_1_3_3 - 0.00181818181818188*G0_1_0_1_3_4 - 0.00129870129870135*G0_1_0_1_3_5 - 0.00045454545454547*G0_1_0_1_4_0 + 0.000454545454545469*G0_1_0_1_4_1 + 0.000909090909090939*G0_1_0_1_4_2 - 0.00181818181818188*G0_1_0_1_4_3 - 0.00207792207792215*G0_1_0_1_4_4 - 0.00129870129870135*G0_1_0_1_4_5 + 0.000941558441558469*G0_1_0_1_5_1 + 0.000194805194805202*G0_1_0_1_5_2 - 0.00129870129870135*G0_1_0_1_5_3 - 0.00129870129870134*G0_1_0_1_5_4 + 0.000389610389610396*G0_1_0_1_5_5 - 0.000616883116883137*G0_1_0_2_0_0 + 0.00219155844155852*G0_1_0_2_0_2 - 0.000909090909090935*G0_1_0_2_0_3 + 0.00220779220779228*G0_1_0_2_0_4 - 0.000194805194805201*G0_1_0_2_0_5 + 0.000616883116883139*G0_1_0_2_1_1 - 0.00219155844155852*G0_1_0_2_1_2 - 0.00220779220779228*G0_1_0_2_1_3 + 0.000909090909090939*G0_1_0_2_1_4 + 0.000194805194805202*G0_1_0_2_1_5 + 0.00219155844155852*G0_1_0_2_2_0 - 0.00219155844155852*G0_1_0_2_2_1 + 0.0100649350649354*G0_1_0_2_2_3 - 0.0100649350649354*G0_1_0_2_2_4 - 0.000909090909090935*G0_1_0_2_3_0 - 0.00220779220779228*G0_1_0_2_3_1 + 0.0100649350649354*G0_1_0_2_3_2 + 0.0233766233766242*G0_1_0_2_3_3 + 0.00181818181818188*G0_1_0_2_3_5 + 0.00220779220779228*G0_1_0_2_4_0 + 0.000909090909090939*G0_1_0_2_4_1 - 0.0100649350649354*G0_1_0_2_4_2 - 0.0233766233766241*G0_1_0_2_4_4 - 0.00181818181818188*G0_1_0_2_4_5 - 0.000194805194805201*G0_1_0_2_5_0 + 0.000194805194805202*G0_1_0_2_5_1 + 0.00181818181818188*G0_1_0_2_5_3 - 0.00181818181818188*G0_1_0_2_5_4 - 0.000454545454545468*G0_1_0_3_0_0 + 0.000454545454545468*G0_1_0_3_0_1 - 0.000909090909090935*G0_1_0_3_0_2 + 0.00207792207792214*G0_1_0_3_0_3 + 0.00181818181818188*G0_1_0_3_0_4 + 0.00129870129870134*G0_1_0_3_0_5 + 0.000454545454545468*G0_1_0_3_1_0 + 0.000194805194805194*G0_1_0_3_1_1 - 0.00220779220779228*G0_1_0_3_1_2 - 0.0124675324675329*G0_1_0_3_1_3 - 0.00181818181818188*G0_1_0_3_1_4 - 0.00129870129870135*G0_1_0_3_1_5 - 0.000909090909090935*G0_1_0_3_2_0 - 0.00220779220779228*G0_1_0_3_2_1 + 0.0100649350649354*G0_1_0_3_2_2 + 0.0233766233766242*G0_1_0_3_2_3 + 0.00181818181818188*G0_1_0_3_2_5 + 0.00207792207792214*G0_1_0_3_3_0 - 0.0124675324675329*G0_1_0_3_3_1 + 0.0233766233766242*G0_1_0_3_3_2 - 0.00467532467532478*G0_1_0_3_3_3 - 0.000519480519480531*G0_1_0_3_3_4 - 0.00779220779220804*G0_1_0_3_3_5 + 0.00181818181818188*G0_1_0_3_4_0 - 0.00181818181818188*G0_1_0_3_4_1 - 0.000519480519480531*G0_1_0_3_4_3 + 0.000519480519480538*G0_1_0_3_4_4 + 0.00129870129870134*G0_1_0_3_5_0 - 0.00129870129870135*G0_1_0_3_5_1 + 0.00181818181818188*G0_1_0_3_5_2 - 0.00779220779220804*G0_1_0_3_5_3 - 0.00259740259740269*G0_1_0_3_5_5 - 0.000194805194805198*G0_1_0_4_0_0 - 0.00045454545454547*G0_1_0_4_0_1 + 0.00220779220779228*G0_1_0_4_0_2 + 0.00181818181818188*G0_1_0_4_0_3 + 0.0124675324675329*G0_1_0_4_0_4 + 0.00129870129870134*G0_1_0_4_0_5 - 0.00045454545454547*G0_1_0_4_1_0 + 0.000454545454545469*G0_1_0_4_1_1 + 0.000909090909090939*G0_1_0_4_1_2 - 0.00181818181818188*G0_1_0_4_1_3 - 0.00207792207792215*G0_1_0_4_1_4 - 0.00129870129870135*G0_1_0_4_1_5 + 0.00220779220779228*G0_1_0_4_2_0 + 0.000909090909090939*G0_1_0_4_2_1 - 0.0100649350649354*G0_1_0_4_2_2 - 0.0233766233766241*G0_1_0_4_2_4 - 0.00181818181818188*G0_1_0_4_2_5 + 0.00181818181818188*G0_1_0_4_3_0 - 0.00181818181818188*G0_1_0_4_3_1 - 0.000519480519480531*G0_1_0_4_3_3 + 0.000519480519480538*G0_1_0_4_3_4 + 0.0124675324675329*G0_1_0_4_4_0 - 0.00207792207792215*G0_1_0_4_4_1 - 0.0233766233766241*G0_1_0_4_4_2 + 0.000519480519480538*G0_1_0_4_4_3 + 0.00467532467532487*G0_1_0_4_4_4 + 0.00779220779220806*G0_1_0_4_4_5 + 0.00129870129870134*G0_1_0_4_5_0 - 0.00129870129870135*G0_1_0_4_5_1 - 0.00181818181818188*G0_1_0_4_5_2 + 0.00779220779220806*G0_1_0_4_5_4 + 0.00259740259740269*G0_1_0_4_5_5 - 0.000941558441558476*G0_1_0_5_0_0 - 0.000194805194805201*G0_1_0_5_0_2 + 0.00129870129870134*G0_1_0_5_0_3 + 0.00129870129870134*G0_1_0_5_0_4 - 0.000389610389610403*G0_1_0_5_0_5 + 0.000941558441558469*G0_1_0_5_1_1 + 0.000194805194805202*G0_1_0_5_1_2 - 0.00129870129870135*G0_1_0_5_1_3 - 0.00129870129870134*G0_1_0_5_1_4 + 0.000389610389610396*G0_1_0_5_1_5 - 0.000194805194805201*G0_1_0_5_2_0 + 0.000194805194805202*G0_1_0_5_2_1 + 0.00181818181818188*G0_1_0_5_2_3 - 0.00181818181818188*G0_1_0_5_2_4 + 0.00129870129870134*G0_1_0_5_3_0 - 0.00129870129870135*G0_1_0_5_3_1 + 0.00181818181818188*G0_1_0_5_3_2 - 0.00779220779220804*G0_1_0_5_3_3 - 0.00259740259740269*G0_1_0_5_3_5 + 0.00129870129870134*G0_1_0_5_4_0 - 0.00129870129870135*G0_1_0_5_4_1 - 0.00181818181818188*G0_1_0_5_4_2 + 0.00779220779220805*G0_1_0_5_4_4 + 0.00259740259740269*G0_1_0_5_4_5 - 0.000389610389610403*G0_1_0_5_5_0 + 0.000389610389610396*G0_1_0_5_5_1 - 0.00259740259740269*G0_1_0_5_5_3 + 0.00259740259740269*G0_1_0_5_5_4 + 0.0226379870129878*G0_1_1_0_0_0 - 0.00151515151515157*G0_1_1_0_0_1 - 0.000965909090909123*G0_1_1_0_0_2 + 0.000346320346320355*G0_1_1_0_0_3 + 0.00325757575757587*G0_1_1_0_0_4 + 0.00891774891774922*G0_1_1_0_0_5 - 0.00151515151515157*G0_1_1_0_1_0 - 0.00170183982683988*G0_1_1_0_1_1 + 0.000273268398268407*G0_1_1_0_1_2 - 0.000411255411255424*G0_1_1_0_1_4 - 0.00311688311688322*G0_1_1_0_1_5 - 0.000965909090909122*G0_1_1_0_2_0 + 0.000273268398268407*G0_1_1_0_2_1 - 0.00184523809523816*G0_1_1_0_2_2 - 0.000790043290043316*G0_1_1_0_2_3 + 0.000194805194805194*G0_1_1_0_2_4 - 0.00025974025974027*G0_1_1_0_2_5 + 0.000346320346320355*G0_1_1_0_3_0 - 0.000790043290043316*G0_1_1_0_3_2 + 0.000129870129870134*G0_1_1_0_3_4 - 0.000173160173160177*G0_1_1_0_3_5 + 0.00325757575757587*G0_1_1_0_4_0 - 0.000411255411255424*G0_1_1_0_4_1 + 0.000194805194805194*G0_1_1_0_4_2 + 0.000129870129870134*G0_1_1_0_4_3 + 0.00441558441558455*G0_1_1_0_4_4 + 0.00134199134199139*G0_1_1_0_4_5 + 0.00891774891774922*G0_1_1_0_5_0 - 0.00311688311688322*G0_1_1_0_5_1 - 0.00025974025974027*G0_1_1_0_5_2 - 0.000173160173160177*G0_1_1_0_5_3 + 0.00134199134199139*G0_1_1_0_5_4 + 0.0047186147186149*G0_1_1_0_5_5 - 0.00151515151515157*G0_1_1_1_0_0 - 0.00170183982683988*G0_1_1_1_0_1 + 0.000273268398268407*G0_1_1_1_0_2 - 0.000411255411255424*G0_1_1_1_0_4 - 0.00311688311688322*G0_1_1_1_0_5 - 0.00170183982683988*G0_1_1_1_1_0 + 0.0243668831168839*G0_1_1_1_1_1 - 0.000349025974025985*G0_1_1_1_1_2 + 0.00345238095238106*G0_1_1_1_1_3 + 0.000800865800865824*G0_1_1_1_1_4 + 0.00985930735930771*G0_1_1_1_1_5 + 0.000273268398268407*G0_1_1_1_2_0 - 0.000349025974025985*G0_1_1_1_2_1 - 0.00403679653679668*G0_1_1_1_2_2 - 0.00201298701298708*G0_1_1_1_2_3 + 0.000119047619047621*G0_1_1_1_2_4 + 0.00345238095238106*G0_1_1_1_3_1 - 0.00201298701298708*G0_1_1_1_3_2 - 0.00805194805194834*G0_1_1_1_3_3 - 0.00168831168831175*G0_1_1_1_3_4 - 0.000411255411255424*G0_1_1_1_4_0 + 0.000800865800865824*G0_1_1_1_4_1 + 0.000119047619047621*G0_1_1_1_4_2 - 0.00168831168831175*G0_1_1_1_4_3 - 0.00199134199134206*G0_1_1_1_4_4 - 0.00147186147186152*G0_1_1_1_4_5 - 0.00311688311688322*G0_1_1_1_5_0 + 0.00985930735930771*G0_1_1_1_5_1 - 0.00147186147186152*G0_1_1_1_5_4 + 0.00510822510822529*G0_1_1_1_5_5 - 0.000965909090909122*G0_1_1_2_0_0 + 0.000273268398268407*G0_1_1_2_0_1 - 0.00184523809523816*G0_1_1_2_0_2 - 0.000790043290043316*G0_1_1_2_0_3 + 0.000194805194805194*G0_1_1_2_0_4 - 0.00025974025974027*G0_1_1_2_0_5 + 0.000273268398268407*G0_1_1_2_1_0 - 0.000349025974025985*G0_1_1_2_1_1 - 0.00403679653679668*G0_1_1_2_1_2 - 0.00201298701298708*G0_1_1_2_1_3 + 0.000119047619047621*G0_1_1_2_1_4 - 0.00184523809523816*G0_1_1_2_2_0 - 0.00403679653679668*G0_1_1_2_2_1 + 0.0581168831168852*G0_1_1_2_2_2 + 0.0173701298701305*G0_1_1_2_2_3 + 0.0073051948051951*G0_1_1_2_2_4 + 0.000768398268398305*G0_1_1_2_2_5 - 0.000790043290043316*G0_1_1_2_3_0 - 0.00201298701298708*G0_1_1_2_3_1 + 0.0173701298701305*G0_1_1_2_3_2 + 0.0161904761904768*G0_1_1_2_3_3 + 0.0013419913419914*G0_1_1_2_3_4 + 0.000194805194805194*G0_1_1_2_4_0 + 0.000119047619047621*G0_1_1_2_4_1 + 0.0073051948051951*G0_1_1_2_4_2 + 0.0013419913419914*G0_1_1_2_4_3 - 0.00718614718614739*G0_1_1_2_4_4 - 0.00177489177489183*G0_1_1_2_4_5 - 0.00025974025974027*G0_1_1_2_5_0 + 0.000768398268398305*G0_1_1_2_5_2 - 0.00177489177489183*G0_1_1_2_5_4 - 0.00264069264069273*G0_1_1_2_5_5 + 0.000346320346320355*G0_1_1_3_0_0 - 0.000790043290043316*G0_1_1_3_0_2 + 0.000129870129870134*G0_1_1_3_0_4 - 0.000173160173160177*G0_1_1_3_0_5 + 0.00345238095238106*G0_1_1_3_1_1 - 0.00201298701298708*G0_1_1_3_1_2 - 0.00805194805194834*G0_1_1_3_1_3 - 0.00168831168831175*G0_1_1_3_1_4 - 0.000790043290043316*G0_1_1_3_2_0 - 0.00201298701298708*G0_1_1_3_2_1 + 0.0173701298701305*G0_1_1_3_2_2 + 0.0161904761904768*G0_1_1_3_2_3 + 0.0013419913419914*G0_1_1_3_2_4 - 0.00805194805194834*G0_1_1_3_3_1 + 0.0161904761904768*G0_1_1_3_3_2 + 0.000259740259740279*G0_1_1_3_3_3 + 0.00320346320346331*G0_1_1_3_3_4 - 0.000259740259740276*G0_1_1_3_3_5 + 0.000129870129870134*G0_1_1_3_4_0 - 0.00168831168831175*G0_1_1_3_4_1 + 0.0013419913419914*G0_1_1_3_4_2 + 0.00320346320346331*G0_1_1_3_4_3 + 0.00372294372294385*G0_1_1_3_4_4 + 0.00329004329004339*G0_1_1_3_4_5 - 0.000173160173160177*G0_1_1_3_5_0 - 0.000259740259740276*G0_1_1_3_5_3 + 0.00329004329004339*G0_1_1_3_5_4 + 0.00562770562770581*G0_1_1_3_5_5 + 0.00325757575757587*G0_1_1_4_0_0 - 0.000411255411255424*G0_1_1_4_0_1 + 0.000194805194805194*G0_1_1_4_0_2 + 0.000129870129870134*G0_1_1_4_0_3 + 0.00441558441558455*G0_1_1_4_0_4 + 0.00134199134199139*G0_1_1_4_0_5 - 0.000411255411255424*G0_1_1_4_1_0 + 0.000800865800865824*G0_1_1_4_1_1 + 0.000119047619047621*G0_1_1_4_1_2 - 0.00168831168831175*G0_1_1_4_1_3 - 0.00199134199134206*G0_1_1_4_1_4 - 0.00147186147186152*G0_1_1_4_1_5 + 0.000194805194805194*G0_1_1_4_2_0 + 0.000119047619047621*G0_1_1_4_2_1 + 0.0073051948051951*G0_1_1_4_2_2 + 0.0013419913419914*G0_1_1_4_2_3 - 0.00718614718614739*G0_1_1_4_2_4 - 0.00177489177489183*G0_1_1_4_2_5 + 0.000129870129870134*G0_1_1_4_3_0 - 0.00168831168831175*G0_1_1_4_3_1 + 0.0013419913419914*G0_1_1_4_3_2 + 0.00320346320346331*G0_1_1_4_3_3 + 0.00372294372294385*G0_1_1_4_3_4 + 0.00329004329004339*G0_1_1_4_3_5 + 0.00441558441558455*G0_1_1_4_4_0 - 0.00199134199134206*G0_1_1_4_4_1 - 0.00718614718614739*G0_1_1_4_4_2 + 0.00372294372294385*G0_1_1_4_4_3 + 0.00493506493506513*G0_1_1_4_4_4 + 0.00753246753246778*G0_1_1_4_4_5 + 0.00134199134199139*G0_1_1_4_5_0 - 0.00147186147186152*G0_1_1_4_5_1 - 0.00177489177489183*G0_1_1_4_5_2 + 0.00329004329004339*G0_1_1_4_5_3 + 0.00753246753246778*G0_1_1_4_5_4 + 0.00822510822510849*G0_1_1_4_5_5 + 0.00891774891774922*G0_1_1_5_0_0 - 0.00311688311688322*G0_1_1_5_0_1 - 0.00025974025974027*G0_1_1_5_0_2 - 0.000173160173160177*G0_1_1_5_0_3 + 0.00134199134199139*G0_1_1_5_0_4 + 0.0047186147186149*G0_1_1_5_0_5 - 0.00311688311688322*G0_1_1_5_1_0 + 0.00985930735930771*G0_1_1_5_1_1 - 0.00147186147186152*G0_1_1_5_1_4 + 0.00510822510822529*G0_1_1_5_1_5 - 0.00025974025974027*G0_1_1_5_2_0 + 0.000768398268398305*G0_1_1_5_2_2 - 0.00177489177489183*G0_1_1_5_2_4 - 0.00264069264069273*G0_1_1_5_2_5 - 0.000173160173160177*G0_1_1_5_3_0 - 0.000259740259740276*G0_1_1_5_3_3 + 0.00329004329004339*G0_1_1_5_3_4 + 0.00562770562770581*G0_1_1_5_3_5 + 0.00134199134199139*G0_1_1_5_4_0 - 0.00147186147186152*G0_1_1_5_4_1 - 0.00177489177489183*G0_1_1_5_4_2 + 0.00329004329004339*G0_1_1_5_4_3 + 0.00753246753246778*G0_1_1_5_4_4 + 0.00822510822510849*G0_1_1_5_4_5 + 0.0047186147186149*G0_1_1_5_5_0 + 0.00510822510822529*G0_1_1_5_5_1 - 0.00264069264069273*G0_1_1_5_5_2 + 0.00562770562770581*G0_1_1_5_5_3 + 0.00822510822510849*G0_1_1_5_5_4 + 0.053246753246755*G0_1_1_5_5_5; + A[87] = A[78] + 0.00328733766233783*G0_0_1_0_0_0 + 0.00040178571428573*G0_0_1_0_0_1 + 0.000401785714285726*G0_0_1_0_0_2 - 0.00189935064935071*G0_0_1_0_0_3 - 0.0102272727272731*G0_0_1_0_0_5 + 0.000401785714285729*G0_0_1_0_1_0 + 0.000401785714285722*G0_0_1_0_1_1 - 0.000255681818181828*G0_0_1_0_1_2 + 0.000438311688311704*G0_0_1_0_1_3 + 0.000438311688311706*G0_0_1_0_1_4 + 0.00701298701298727*G0_0_1_0_1_5 + 0.000401785714285726*G0_0_1_0_2_0 - 0.000255681818181828*G0_0_1_0_2_1 + 0.000328733766233777*G0_0_1_0_2_2 - 0.0013149350649351*G0_0_1_0_2_3 - 0.0011688311688312*G0_0_1_0_2_4 - 0.0016071428571429*G0_0_1_0_2_5 - 0.00189935064935071*G0_0_1_0_3_0 + 0.000438311688311704*G0_0_1_0_3_1 - 0.00131493506493511*G0_0_1_0_3_2 + 0.00409090909090922*G0_0_1_0_3_3 + 0.00292207792207801*G0_0_1_0_3_4 + 0.00701298701298723*G0_0_1_0_3_5 + 0.000438311688311706*G0_0_1_0_4_1 - 0.0011688311688312*G0_0_1_0_4_2 + 0.00292207792207801*G0_0_1_0_4_3 + 0.00350649350649361*G0_0_1_0_4_4 + 0.00233766233766239*G0_0_1_0_4_5 - 0.0102272727272731*G0_0_1_0_5_0 + 0.00701298701298727*G0_0_1_0_5_1 - 0.0016071428571429*G0_0_1_0_5_2 + 0.00701298701298723*G0_0_1_0_5_3 + 0.00233766233766239*G0_0_1_0_5_4 + 0.00350649350649347*G0_0_1_0_5_5 + 0.000401785714285729*G0_0_1_1_0_0 + 0.000401785714285723*G0_0_1_1_0_1 - 0.000255681818181828*G0_0_1_1_0_2 + 0.000438311688311704*G0_0_1_1_0_3 + 0.000438311688311706*G0_0_1_1_0_4 + 0.00701298701298727*G0_0_1_1_0_5 + 0.000401785714285722*G0_0_1_1_1_0 + 0.00328733766233787*G0_0_1_1_1_1 + 0.000401785714285723*G0_0_1_1_1_2 - 0.00189935064935071*G0_0_1_1_1_4 - 0.0102272727272731*G0_0_1_1_1_5 - 0.000255681818181828*G0_0_1_1_2_0 + 0.000401785714285721*G0_0_1_1_2_1 + 0.000328733766233779*G0_0_1_1_2_2 - 0.00116883116883121*G0_0_1_1_2_3 - 0.00131493506493511*G0_0_1_1_2_4 - 0.00160714285714291*G0_0_1_1_2_5 + 0.000438311688311704*G0_0_1_1_3_0 - 0.00116883116883121*G0_0_1_1_3_2 + 0.00350649350649364*G0_0_1_1_3_3 + 0.00292207792207802*G0_0_1_1_3_4 + 0.00233766233766242*G0_0_1_1_3_5 + 0.000438311688311706*G0_0_1_1_4_0 - 0.00189935064935071*G0_0_1_1_4_1 - 0.00131493506493511*G0_0_1_1_4_2 + 0.00292207792207802*G0_0_1_1_4_3 + 0.00409090909090923*G0_0_1_1_4_4 + 0.00701298701298725*G0_0_1_1_4_5 + 0.00701298701298727*G0_0_1_1_5_0 - 0.0102272727272731*G0_0_1_1_5_1 - 0.00160714285714291*G0_0_1_1_5_2 + 0.00233766233766242*G0_0_1_1_5_3 + 0.00701298701298725*G0_0_1_1_5_4 + 0.00350649350649361*G0_0_1_1_5_5 + 0.000401785714285725*G0_0_1_2_0_0 - 0.000255681818181828*G0_0_1_2_0_1 + 0.000328733766233777*G0_0_1_2_0_2 - 0.0013149350649351*G0_0_1_2_0_3 - 0.0011688311688312*G0_0_1_2_0_4 - 0.0016071428571429*G0_0_1_2_0_5 - 0.000255681818181828*G0_0_1_2_1_0 + 0.000401785714285719*G0_0_1_2_1_1 + 0.000328733766233779*G0_0_1_2_1_2 - 0.00116883116883121*G0_0_1_2_1_3 - 0.00131493506493511*G0_0_1_2_1_4 - 0.00160714285714291*G0_0_1_2_1_5 + 0.000328733766233777*G0_0_1_2_2_0 + 0.000328733766233779*G0_0_1_2_2_1 + 0.000876623376623398*G0_0_1_2_2_2 - 0.00146103896103901*G0_0_1_2_2_3 - 0.00146103896103902*G0_0_1_2_2_4 - 0.00423701298701313*G0_0_1_2_2_5 - 0.0013149350649351*G0_0_1_2_3_0 - 0.00116883116883121*G0_0_1_2_3_1 - 0.00146103896103901*G0_0_1_2_3_2 + 0.00525974025974043*G0_0_1_2_3_3 + 0.00525974025974043*G0_0_1_2_3_4 + 0.0111038961038965*G0_0_1_2_3_5 - 0.0011688311688312*G0_0_1_2_4_0 - 0.00131493506493511*G0_0_1_2_4_1 - 0.00146103896103902*G0_0_1_2_4_2 + 0.00525974025974043*G0_0_1_2_4_3 + 0.00525974025974043*G0_0_1_2_4_4 + 0.0111038961038965*G0_0_1_2_4_5 - 0.0016071428571429*G0_0_1_2_5_0 - 0.00160714285714291*G0_0_1_2_5_1 - 0.00423701298701313*G0_0_1_2_5_2 + 0.0111038961038965*G0_0_1_2_5_3 + 0.0111038961038965*G0_0_1_2_5_4 + 0.0350649350649363*G0_0_1_2_5_5 - 0.00189935064935071*G0_0_1_3_0_0 + 0.000438311688311704*G0_0_1_3_0_1 - 0.0013149350649351*G0_0_1_3_0_2 + 0.00409090909090922*G0_0_1_3_0_3 + 0.00292207792207801*G0_0_1_3_0_4 + 0.00701298701298723*G0_0_1_3_0_5 + 0.000438311688311704*G0_0_1_3_1_0 - 0.00116883116883121*G0_0_1_3_1_2 + 0.00350649350649364*G0_0_1_3_1_3 + 0.00292207792207802*G0_0_1_3_1_4 + 0.00233766233766242*G0_0_1_3_1_5 - 0.0013149350649351*G0_0_1_3_2_0 - 0.00116883116883121*G0_0_1_3_2_1 - 0.00146103896103901*G0_0_1_3_2_2 + 0.00525974025974043*G0_0_1_3_2_3 + 0.00525974025974043*G0_0_1_3_2_4 + 0.0111038961038965*G0_0_1_3_2_5 + 0.00409090909090922*G0_0_1_3_3_0 + 0.00350649350649365*G0_0_1_3_3_1 + 0.00525974025974043*G0_0_1_3_3_2 - 0.00701298701298726*G0_0_1_3_3_3 - 0.0140259740259745*G0_0_1_3_3_4 - 0.0303896103896114*G0_0_1_3_3_5 + 0.00292207792207801*G0_0_1_3_4_0 + 0.00292207792207802*G0_0_1_3_4_1 + 0.00525974025974043*G0_0_1_3_4_2 - 0.0140259740259745*G0_0_1_3_4_3 - 0.0140259740259745*G0_0_1_3_4_4 - 0.028051948051949*G0_0_1_3_4_5 + 0.00701298701298723*G0_0_1_3_5_0 + 0.00233766233766242*G0_0_1_3_5_1 + 0.0111038961038965*G0_0_1_3_5_2 - 0.0303896103896114*G0_0_1_3_5_3 - 0.028051948051949*G0_0_1_3_5_4 - 0.0841558441558471*G0_0_1_3_5_5 + 0.000438311688311706*G0_0_1_4_0_1 - 0.0011688311688312*G0_0_1_4_0_2 + 0.00292207792207801*G0_0_1_4_0_3 + 0.00350649350649361*G0_0_1_4_0_4 + 0.00233766233766239*G0_0_1_4_0_5 + 0.000438311688311706*G0_0_1_4_1_0 - 0.00189935064935071*G0_0_1_4_1_1 - 0.00131493506493511*G0_0_1_4_1_2 + 0.00292207792207802*G0_0_1_4_1_3 + 0.00409090909090923*G0_0_1_4_1_4 + 0.00701298701298725*G0_0_1_4_1_5 - 0.0011688311688312*G0_0_1_4_2_0 - 0.00131493506493511*G0_0_1_4_2_1 - 0.00146103896103902*G0_0_1_4_2_2 + 0.00525974025974043*G0_0_1_4_2_3 + 0.00525974025974043*G0_0_1_4_2_4 + 0.0111038961038965*G0_0_1_4_2_5 + 0.00292207792207801*G0_0_1_4_3_0 + 0.00292207792207802*G0_0_1_4_3_1 + 0.00525974025974043*G0_0_1_4_3_2 - 0.0140259740259745*G0_0_1_4_3_3 - 0.0140259740259745*G0_0_1_4_3_4 - 0.028051948051949*G0_0_1_4_3_5 + 0.00350649350649361*G0_0_1_4_4_0 + 0.00409090909090923*G0_0_1_4_4_1 + 0.00525974025974043*G0_0_1_4_4_2 - 0.0140259740259745*G0_0_1_4_4_3 - 0.00701298701298734*G0_0_1_4_4_4 - 0.0303896103896114*G0_0_1_4_4_5 + 0.00233766233766239*G0_0_1_4_5_0 + 0.00701298701298725*G0_0_1_4_5_1 + 0.0111038961038965*G0_0_1_4_5_2 - 0.028051948051949*G0_0_1_4_5_3 - 0.0303896103896114*G0_0_1_4_5_4 - 0.084155844155847*G0_0_1_4_5_5 - 0.0102272727272731*G0_0_1_5_0_0 + 0.00701298701298727*G0_0_1_5_0_1 - 0.0016071428571429*G0_0_1_5_0_2 + 0.00701298701298723*G0_0_1_5_0_3 + 0.00233766233766239*G0_0_1_5_0_4 + 0.00350649350649347*G0_0_1_5_0_5 + 0.00701298701298727*G0_0_1_5_1_0 - 0.0102272727272731*G0_0_1_5_1_1 - 0.00160714285714291*G0_0_1_5_1_2 + 0.00233766233766242*G0_0_1_5_1_3 + 0.00701298701298725*G0_0_1_5_1_4 + 0.00350649350649361*G0_0_1_5_1_5 - 0.0016071428571429*G0_0_1_5_2_0 - 0.00160714285714291*G0_0_1_5_2_1 - 0.00423701298701313*G0_0_1_5_2_2 + 0.0111038961038965*G0_0_1_5_2_3 + 0.0111038961038965*G0_0_1_5_2_4 + 0.0350649350649363*G0_0_1_5_2_5 + 0.00701298701298723*G0_0_1_5_3_0 + 0.00233766233766242*G0_0_1_5_3_1 + 0.0111038961038965*G0_0_1_5_3_2 - 0.0303896103896114*G0_0_1_5_3_3 - 0.028051948051949*G0_0_1_5_3_4 - 0.084155844155847*G0_0_1_5_3_5 + 0.00233766233766239*G0_0_1_5_4_0 + 0.00701298701298725*G0_0_1_5_4_1 + 0.0111038961038965*G0_0_1_5_4_2 - 0.028051948051949*G0_0_1_5_4_3 - 0.0303896103896114*G0_0_1_5_4_4 - 0.084155844155847*G0_0_1_5_4_5 + 0.00350649350649347*G0_0_1_5_5_0 + 0.00350649350649361*G0_0_1_5_5_1 + 0.0350649350649363*G0_0_1_5_5_2 - 0.0841558441558471*G0_0_1_5_5_3 - 0.084155844155847*G0_0_1_5_5_4 - 0.490909090909108*G0_0_1_5_5_5 - 0.00328733766233783*G0_1_0_0_0_0 - 0.000401785714285729*G0_1_0_0_0_1 - 0.000401785714285726*G0_1_0_0_0_2 + 0.00189935064935071*G0_1_0_0_0_3 + 0.0102272727272731*G0_1_0_0_0_5 - 0.00040178571428573*G0_1_0_0_1_0 - 0.000401785714285722*G0_1_0_0_1_1 + 0.000255681818181828*G0_1_0_0_1_2 - 0.000438311688311704*G0_1_0_0_1_3 - 0.000438311688311706*G0_1_0_0_1_4 - 0.00701298701298727*G0_1_0_0_1_5 - 0.000401785714285726*G0_1_0_0_2_0 + 0.000255681818181828*G0_1_0_0_2_1 - 0.000328733766233777*G0_1_0_0_2_2 + 0.0013149350649351*G0_1_0_0_2_3 + 0.0011688311688312*G0_1_0_0_2_4 + 0.0016071428571429*G0_1_0_0_2_5 + 0.00189935064935071*G0_1_0_0_3_0 - 0.000438311688311704*G0_1_0_0_3_1 + 0.00131493506493511*G0_1_0_0_3_2 - 0.00409090909090922*G0_1_0_0_3_3 - 0.00292207792207801*G0_1_0_0_3_4 - 0.00701298701298723*G0_1_0_0_3_5 - 0.000438311688311706*G0_1_0_0_4_1 + 0.0011688311688312*G0_1_0_0_4_2 - 0.00292207792207801*G0_1_0_0_4_3 - 0.00350649350649361*G0_1_0_0_4_4 - 0.00233766233766239*G0_1_0_0_4_5 + 0.0102272727272731*G0_1_0_0_5_0 - 0.00701298701298727*G0_1_0_0_5_1 + 0.0016071428571429*G0_1_0_0_5_2 - 0.00701298701298723*G0_1_0_0_5_3 - 0.00233766233766239*G0_1_0_0_5_4 - 0.00350649350649348*G0_1_0_0_5_5 - 0.00040178571428573*G0_1_0_1_0_0 - 0.000401785714285723*G0_1_0_1_0_1 + 0.000255681818181828*G0_1_0_1_0_2 - 0.000438311688311704*G0_1_0_1_0_3 - 0.000438311688311706*G0_1_0_1_0_4 - 0.00701298701298727*G0_1_0_1_0_5 - 0.000401785714285722*G0_1_0_1_1_0 - 0.00328733766233787*G0_1_0_1_1_1 - 0.000401785714285723*G0_1_0_1_1_2 + 0.00189935064935071*G0_1_0_1_1_4 + 0.0102272727272731*G0_1_0_1_1_5 + 0.000255681818181828*G0_1_0_1_2_0 - 0.000401785714285721*G0_1_0_1_2_1 - 0.000328733766233779*G0_1_0_1_2_2 + 0.00116883116883121*G0_1_0_1_2_3 + 0.00131493506493511*G0_1_0_1_2_4 + 0.00160714285714291*G0_1_0_1_2_5 - 0.000438311688311704*G0_1_0_1_3_0 + 0.00116883116883121*G0_1_0_1_3_2 - 0.00350649350649364*G0_1_0_1_3_3 - 0.00292207792207802*G0_1_0_1_3_4 - 0.00233766233766242*G0_1_0_1_3_5 - 0.000438311688311706*G0_1_0_1_4_0 + 0.00189935064935071*G0_1_0_1_4_1 + 0.00131493506493511*G0_1_0_1_4_2 - 0.00292207792207802*G0_1_0_1_4_3 - 0.00409090909090923*G0_1_0_1_4_4 - 0.00701298701298725*G0_1_0_1_4_5 - 0.00701298701298727*G0_1_0_1_5_0 + 0.0102272727272731*G0_1_0_1_5_1 + 0.00160714285714291*G0_1_0_1_5_2 - 0.00233766233766242*G0_1_0_1_5_3 - 0.00701298701298725*G0_1_0_1_5_4 - 0.00350649350649361*G0_1_0_1_5_5 - 0.000401785714285726*G0_1_0_2_0_0 + 0.000255681818181828*G0_1_0_2_0_1 - 0.000328733766233777*G0_1_0_2_0_2 + 0.0013149350649351*G0_1_0_2_0_3 + 0.0011688311688312*G0_1_0_2_0_4 + 0.0016071428571429*G0_1_0_2_0_5 + 0.000255681818181828*G0_1_0_2_1_0 - 0.000401785714285719*G0_1_0_2_1_1 - 0.000328733766233779*G0_1_0_2_1_2 + 0.00116883116883121*G0_1_0_2_1_3 + 0.00131493506493511*G0_1_0_2_1_4 + 0.00160714285714291*G0_1_0_2_1_5 - 0.000328733766233777*G0_1_0_2_2_0 - 0.000328733766233779*G0_1_0_2_2_1 - 0.000876623376623398*G0_1_0_2_2_2 + 0.00146103896103901*G0_1_0_2_2_3 + 0.00146103896103902*G0_1_0_2_2_4 + 0.00423701298701313*G0_1_0_2_2_5 + 0.0013149350649351*G0_1_0_2_3_0 + 0.00116883116883121*G0_1_0_2_3_1 + 0.00146103896103901*G0_1_0_2_3_2 - 0.00525974025974043*G0_1_0_2_3_3 - 0.00525974025974043*G0_1_0_2_3_4 - 0.0111038961038965*G0_1_0_2_3_5 + 0.0011688311688312*G0_1_0_2_4_0 + 0.00131493506493511*G0_1_0_2_4_1 + 0.00146103896103902*G0_1_0_2_4_2 - 0.00525974025974043*G0_1_0_2_4_3 - 0.00525974025974043*G0_1_0_2_4_4 - 0.0111038961038965*G0_1_0_2_4_5 + 0.0016071428571429*G0_1_0_2_5_0 + 0.00160714285714291*G0_1_0_2_5_1 + 0.00423701298701313*G0_1_0_2_5_2 - 0.0111038961038965*G0_1_0_2_5_3 - 0.0111038961038965*G0_1_0_2_5_4 - 0.0350649350649363*G0_1_0_2_5_5 + 0.00189935064935071*G0_1_0_3_0_0 - 0.000438311688311704*G0_1_0_3_0_1 + 0.00131493506493511*G0_1_0_3_0_2 - 0.00409090909090922*G0_1_0_3_0_3 - 0.00292207792207801*G0_1_0_3_0_4 - 0.00701298701298723*G0_1_0_3_0_5 - 0.000438311688311704*G0_1_0_3_1_0 + 0.00116883116883121*G0_1_0_3_1_2 - 0.00350649350649365*G0_1_0_3_1_3 - 0.00292207792207802*G0_1_0_3_1_4 - 0.00233766233766242*G0_1_0_3_1_5 + 0.0013149350649351*G0_1_0_3_2_0 + 0.00116883116883121*G0_1_0_3_2_1 + 0.00146103896103901*G0_1_0_3_2_2 - 0.00525974025974043*G0_1_0_3_2_3 - 0.00525974025974043*G0_1_0_3_2_4 - 0.0111038961038965*G0_1_0_3_2_5 - 0.00409090909090922*G0_1_0_3_3_0 - 0.00350649350649365*G0_1_0_3_3_1 - 0.00525974025974042*G0_1_0_3_3_2 + 0.00701298701298725*G0_1_0_3_3_3 + 0.0140259740259745*G0_1_0_3_3_4 + 0.0303896103896114*G0_1_0_3_3_5 - 0.00292207792207801*G0_1_0_3_4_0 - 0.00292207792207802*G0_1_0_3_4_1 - 0.00525974025974043*G0_1_0_3_4_2 + 0.0140259740259745*G0_1_0_3_4_3 + 0.0140259740259745*G0_1_0_3_4_4 + 0.028051948051949*G0_1_0_3_4_5 - 0.00701298701298723*G0_1_0_3_5_0 - 0.00233766233766242*G0_1_0_3_5_1 - 0.0111038961038965*G0_1_0_3_5_2 + 0.0303896103896114*G0_1_0_3_5_3 + 0.028051948051949*G0_1_0_3_5_4 + 0.0841558441558471*G0_1_0_3_5_5 - 0.000438311688311706*G0_1_0_4_0_1 + 0.0011688311688312*G0_1_0_4_0_2 - 0.00292207792207801*G0_1_0_4_0_3 - 0.00350649350649361*G0_1_0_4_0_4 - 0.00233766233766239*G0_1_0_4_0_5 - 0.000438311688311706*G0_1_0_4_1_0 + 0.00189935064935071*G0_1_0_4_1_1 + 0.00131493506493511*G0_1_0_4_1_2 - 0.00292207792207802*G0_1_0_4_1_3 - 0.00409090909090923*G0_1_0_4_1_4 - 0.00701298701298725*G0_1_0_4_1_5 + 0.0011688311688312*G0_1_0_4_2_0 + 0.00131493506493511*G0_1_0_4_2_1 + 0.00146103896103902*G0_1_0_4_2_2 - 0.00525974025974043*G0_1_0_4_2_3 - 0.00525974025974043*G0_1_0_4_2_4 - 0.0111038961038965*G0_1_0_4_2_5 - 0.00292207792207801*G0_1_0_4_3_0 - 0.00292207792207802*G0_1_0_4_3_1 - 0.00525974025974043*G0_1_0_4_3_2 + 0.0140259740259745*G0_1_0_4_3_3 + 0.0140259740259745*G0_1_0_4_3_4 + 0.028051948051949*G0_1_0_4_3_5 - 0.00350649350649361*G0_1_0_4_4_0 - 0.00409090909090923*G0_1_0_4_4_1 - 0.00525974025974043*G0_1_0_4_4_2 + 0.0140259740259745*G0_1_0_4_4_3 + 0.00701298701298734*G0_1_0_4_4_4 + 0.0303896103896114*G0_1_0_4_4_5 - 0.00233766233766239*G0_1_0_4_5_0 - 0.00701298701298725*G0_1_0_4_5_1 - 0.0111038961038965*G0_1_0_4_5_2 + 0.028051948051949*G0_1_0_4_5_3 + 0.0303896103896114*G0_1_0_4_5_4 + 0.084155844155847*G0_1_0_4_5_5 + 0.0102272727272731*G0_1_0_5_0_0 - 0.00701298701298727*G0_1_0_5_0_1 + 0.0016071428571429*G0_1_0_5_0_2 - 0.00701298701298723*G0_1_0_5_0_3 - 0.00233766233766239*G0_1_0_5_0_4 - 0.00350649350649348*G0_1_0_5_0_5 - 0.00701298701298727*G0_1_0_5_1_0 + 0.0102272727272731*G0_1_0_5_1_1 + 0.00160714285714291*G0_1_0_5_1_2 - 0.00233766233766242*G0_1_0_5_1_3 - 0.00701298701298725*G0_1_0_5_1_4 - 0.00350649350649361*G0_1_0_5_1_5 + 0.0016071428571429*G0_1_0_5_2_0 + 0.00160714285714291*G0_1_0_5_2_1 + 0.00423701298701313*G0_1_0_5_2_2 - 0.0111038961038965*G0_1_0_5_2_3 - 0.0111038961038965*G0_1_0_5_2_4 - 0.0350649350649363*G0_1_0_5_2_5 - 0.00701298701298723*G0_1_0_5_3_0 - 0.00233766233766242*G0_1_0_5_3_1 - 0.0111038961038965*G0_1_0_5_3_2 + 0.0303896103896114*G0_1_0_5_3_3 + 0.028051948051949*G0_1_0_5_3_4 + 0.084155844155847*G0_1_0_5_3_5 - 0.00233766233766239*G0_1_0_5_4_0 - 0.00701298701298725*G0_1_0_5_4_1 - 0.0111038961038965*G0_1_0_5_4_2 + 0.028051948051949*G0_1_0_5_4_3 + 0.0303896103896114*G0_1_0_5_4_4 + 0.084155844155847*G0_1_0_5_4_5 - 0.00350649350649348*G0_1_0_5_5_0 - 0.00350649350649361*G0_1_0_5_5_1 - 0.0350649350649363*G0_1_0_5_5_2 + 0.0841558441558471*G0_1_0_5_5_3 + 0.084155844155847*G0_1_0_5_5_4 + 0.490909090909108*G0_1_0_5_5_5; + A[37] = -A[87] - 0.109760551948056*G0_0_0_0_0_0 + 0.0045170454545456*G0_0_0_0_0_1 + 0.00976461038961071*G0_0_0_0_0_2 - 0.0037500000000001*G0_0_0_0_0_3 - 0.0431006493506508*G0_0_0_0_0_4 - 0.0224025974025982*G0_0_0_0_0_5 + 0.0045170454545456*G0_0_0_0_1_0 + 0.00304383116883126*G0_0_0_0_1_1 - 0.000560064935064955*G0_0_0_0_1_2 + 0.000243506493506504*G0_0_0_0_1_3 + 0.00180194805194812*G0_0_0_0_1_4 + 0.00340909090909104*G0_0_0_0_1_5 + 0.00976461038961071*G0_0_0_0_2_0 - 0.000560064935064955*G0_0_0_0_2_1 - 0.00152191558441564*G0_0_0_0_2_2 - 0.00175324675324681*G0_0_0_0_2_3 + 0.00584415584415604*G0_0_0_0_2_4 - 0.000925324675324697*G0_0_0_0_2_5 - 0.0037500000000001*G0_0_0_0_3_0 + 0.000243506493506504*G0_0_0_0_3_1 - 0.00175324675324681*G0_0_0_0_3_2 + 0.00487012987013002*G0_0_0_0_3_3 + 0.00389610389610401*G0_0_0_0_3_4 + 0.00935064935064964*G0_0_0_0_3_5 - 0.0431006493506508*G0_0_0_0_4_0 + 0.00180194805194812*G0_0_0_0_4_1 + 0.00584415584415604*G0_0_0_0_4_2 + 0.00389610389610402*G0_0_0_0_4_3 - 0.0374025974025987*G0_0_0_0_4_4 - 0.00175324675324684*G0_0_0_0_4_5 - 0.0224025974025982*G0_0_0_0_5_0 + 0.00340909090909104*G0_0_0_0_5_1 - 0.000925324675324697*G0_0_0_0_5_2 + 0.00935064935064964*G0_0_0_0_5_3 - 0.00175324675324684*G0_0_0_0_5_4 + 0.010714285714286*G0_0_0_0_5_5 + 0.0045170454545456*G0_0_0_1_0_0 + 0.00304383116883126*G0_0_0_1_0_1 - 0.000560064935064955*G0_0_0_1_0_2 + 0.000243506493506504*G0_0_0_1_0_3 + 0.00180194805194812*G0_0_0_1_0_4 + 0.00340909090909104*G0_0_0_1_0_5 + 0.00304383116883126*G0_0_0_1_1_0 - 0.0814529220779248*G0_0_0_1_1_1 + 0.00511363636363653*G0_0_0_1_1_2 - 0.0197240259740266*G0_0_0_1_1_3 - 0.00267857142857151*G0_0_0_1_1_4 - 0.0168019480519487*G0_0_0_1_1_5 - 0.000560064935064955*G0_0_0_1_2_0 + 0.00511363636363653*G0_0_0_1_2_1 - 0.000206980519480525*G0_0_0_1_2_2 - 0.000487012987013005*G0_0_0_1_2_3 - 0.00224025974025981*G0_0_0_1_2_4 - 0.0012175324675325*G0_0_0_1_2_5 + 0.000243506493506504*G0_0_0_1_3_0 - 0.0197240259740266*G0_0_0_1_3_1 - 0.000487012987013005*G0_0_0_1_3_2 - 0.002922077922078*G0_0_0_1_3_3 + 0.00487012987013002*G0_0_0_1_3_4 + 0.00194805194805199*G0_0_0_1_3_5 + 0.00180194805194812*G0_0_0_1_4_0 - 0.00267857142857151*G0_0_0_1_4_1 - 0.00224025974025981*G0_0_0_1_4_2 + 0.00487012987013002*G0_0_0_1_4_3 + 0.00974025974026006*G0_0_0_1_4_4 + 0.00779220779220805*G0_0_0_1_4_5 + 0.00340909090909104*G0_0_0_1_5_0 - 0.0168019480519487*G0_0_0_1_5_1 - 0.0012175324675325*G0_0_0_1_5_2 + 0.00194805194805199*G0_0_0_1_5_3 + 0.00779220779220805*G0_0_0_1_5_4 + 0.00487012987012998*G0_0_0_1_5_5 + 0.00976461038961071*G0_0_0_2_0_0 - 0.000560064935064955*G0_0_0_2_0_1 - 0.00152191558441564*G0_0_0_2_0_2 - 0.00175324675324681*G0_0_0_2_0_3 + 0.00584415584415604*G0_0_0_2_0_4 - 0.000925324675324697*G0_0_0_2_0_5 - 0.000560064935064955*G0_0_0_2_1_0 + 0.00511363636363653*G0_0_0_2_1_1 - 0.000206980519480525*G0_0_0_2_1_2 - 0.000487012987013005*G0_0_0_2_1_3 - 0.00224025974025981*G0_0_0_2_1_4 - 0.0012175324675325*G0_0_0_2_1_5 - 0.00152191558441564*G0_0_0_2_2_0 - 0.000206980519480525*G0_0_0_2_2_1 + 0.00372564935064946*G0_0_0_2_2_2 - 0.000438311688311701*G0_0_0_2_2_3 - 0.00199675324675331*G0_0_0_2_2_4 - 0.00438311688311703*G0_0_0_2_2_5 - 0.00175324675324681*G0_0_0_2_3_0 - 0.000487012987013005*G0_0_0_2_3_1 - 0.000438311688311701*G0_0_0_2_3_2 + 0.00974025974026005*G0_0_0_2_3_3 + 0.00798701298701325*G0_0_0_2_3_4 + 0.0122727272727277*G0_0_0_2_3_5 + 0.00584415584415604*G0_0_0_2_4_0 - 0.00224025974025981*G0_0_0_2_4_1 - 0.00199675324675331*G0_0_0_2_4_2 + 0.00798701298701325*G0_0_0_2_4_3 + 0.0237662337662346*G0_0_0_2_4_4 + 0.0132467532467537*G0_0_0_2_4_5 - 0.000925324675324697*G0_0_0_2_5_0 - 0.0012175324675325*G0_0_0_2_5_1 - 0.00438311688311703*G0_0_0_2_5_2 + 0.0122727272727277*G0_0_0_2_5_3 + 0.0132467532467537*G0_0_0_2_5_4 + 0.0292207792207802*G0_0_0_2_5_5 - 0.0037500000000001*G0_0_0_3_0_0 + 0.000243506493506504*G0_0_0_3_0_1 - 0.00175324675324681*G0_0_0_3_0_2 + 0.00487012987013003*G0_0_0_3_0_3 + 0.00389610389610401*G0_0_0_3_0_4 + 0.00935064935064964*G0_0_0_3_0_5 + 0.000243506493506504*G0_0_0_3_1_0 - 0.0197240259740266*G0_0_0_3_1_1 - 0.000487012987013005*G0_0_0_3_1_2 - 0.002922077922078*G0_0_0_3_1_3 + 0.00487012987013002*G0_0_0_3_1_4 + 0.00194805194805199*G0_0_0_3_1_5 - 0.00175324675324681*G0_0_0_3_2_0 - 0.000487012987013005*G0_0_0_3_2_1 - 0.000438311688311701*G0_0_0_3_2_2 + 0.00974025974026005*G0_0_0_3_2_3 + 0.00798701298701325*G0_0_0_3_2_4 + 0.0122727272727277*G0_0_0_3_2_5 + 0.00487012987013002*G0_0_0_3_3_0 - 0.002922077922078*G0_0_0_3_3_1 + 0.00974025974026005*G0_0_0_3_3_2 + 0.0677922077922102*G0_0_0_3_3_3 - 0.0194805194805201*G0_0_0_3_3_4 - 0.0342857142857154*G0_0_0_3_3_5 + 0.00389610389610401*G0_0_0_3_4_0 + 0.00487012987013002*G0_0_0_3_4_1 + 0.00798701298701325*G0_0_0_3_4_2 - 0.0194805194805201*G0_0_0_3_4_3 - 0.0272727272727281*G0_0_0_3_4_4 - 0.0342857142857154*G0_0_0_3_4_5 + 0.00935064935064964*G0_0_0_3_5_0 + 0.00194805194805199*G0_0_0_3_5_1 + 0.0122727272727277*G0_0_0_3_5_2 - 0.0342857142857154*G0_0_0_3_5_3 - 0.0342857142857154*G0_0_0_3_5_4 - 0.0771428571428597*G0_0_0_3_5_5 - 0.0431006493506508*G0_0_0_4_0_0 + 0.00180194805194812*G0_0_0_4_0_1 + 0.00584415584415604*G0_0_0_4_0_2 + 0.00389610389610401*G0_0_0_4_0_3 - 0.0374025974025987*G0_0_0_4_0_4 - 0.00175324675324684*G0_0_0_4_0_5 + 0.00180194805194812*G0_0_0_4_1_0 - 0.00267857142857151*G0_0_0_4_1_1 - 0.00224025974025981*G0_0_0_4_1_2 + 0.00487012987013002*G0_0_0_4_1_3 + 0.00974025974026006*G0_0_0_4_1_4 + 0.00779220779220805*G0_0_0_4_1_5 + 0.00584415584415604*G0_0_0_4_2_0 - 0.00224025974025981*G0_0_0_4_2_1 - 0.00199675324675331*G0_0_0_4_2_2 + 0.00798701298701325*G0_0_0_4_2_3 + 0.0237662337662346*G0_0_0_4_2_4 + 0.0132467532467537*G0_0_0_4_2_5 + 0.00389610389610401*G0_0_0_4_3_0 + 0.00487012987013002*G0_0_0_4_3_1 + 0.00798701298701325*G0_0_0_4_3_2 - 0.0194805194805201*G0_0_0_4_3_3 - 0.0272727272727281*G0_0_0_4_3_4 - 0.0342857142857154*G0_0_0_4_3_5 - 0.0374025974025987*G0_0_0_4_4_0 + 0.00974025974026006*G0_0_0_4_4_1 + 0.0237662337662346*G0_0_0_4_4_2 - 0.0272727272727281*G0_0_0_4_4_3 - 0.128571428571433*G0_0_0_4_4_4 - 0.0459740259740275*G0_0_0_4_4_5 - 0.00175324675324684*G0_0_0_4_5_0 + 0.00779220779220805*G0_0_0_4_5_1 + 0.0132467532467537*G0_0_0_4_5_2 - 0.0342857142857154*G0_0_0_4_5_3 - 0.0459740259740275*G0_0_0_4_5_4 - 0.0740259740259765*G0_0_0_4_5_5 - 0.0224025974025982*G0_0_0_5_0_0 + 0.00340909090909104*G0_0_0_5_0_1 - 0.000925324675324697*G0_0_0_5_0_2 + 0.00935064935064964*G0_0_0_5_0_3 - 0.00175324675324684*G0_0_0_5_0_4 + 0.010714285714286*G0_0_0_5_0_5 + 0.00340909090909104*G0_0_0_5_1_0 - 0.0168019480519487*G0_0_0_5_1_1 - 0.0012175324675325*G0_0_0_5_1_2 + 0.00194805194805199*G0_0_0_5_1_3 + 0.00779220779220805*G0_0_0_5_1_4 + 0.00487012987012998*G0_0_0_5_1_5 - 0.000925324675324697*G0_0_0_5_2_0 - 0.0012175324675325*G0_0_0_5_2_1 - 0.00438311688311703*G0_0_0_5_2_2 + 0.0122727272727277*G0_0_0_5_2_3 + 0.0132467532467537*G0_0_0_5_2_4 + 0.0292207792207802*G0_0_0_5_2_5 + 0.00935064935064964*G0_0_0_5_3_0 + 0.00194805194805199*G0_0_0_5_3_1 + 0.0122727272727277*G0_0_0_5_3_2 - 0.0342857142857154*G0_0_0_5_3_3 - 0.0342857142857154*G0_0_0_5_3_4 - 0.0771428571428597*G0_0_0_5_3_5 - 0.00175324675324684*G0_0_0_5_4_0 + 0.00779220779220805*G0_0_0_5_4_1 + 0.0132467532467537*G0_0_0_5_4_2 - 0.0342857142857154*G0_0_0_5_4_3 - 0.0459740259740275*G0_0_0_5_4_4 - 0.0740259740259765*G0_0_0_5_4_5 + 0.010714285714286*G0_0_0_5_5_0 + 0.00487012987012998*G0_0_0_5_5_1 + 0.0292207792207802*G0_0_0_5_5_2 - 0.0771428571428597*G0_0_0_5_5_3 - 0.0740259740259765*G0_0_0_5_5_4 - 0.317922077922089*G0_0_0_5_5_5 + 0.0100446428571432*G0_0_1_0_0_0 - 0.000231331168831178*G0_0_1_0_0_2 - 0.00165584415584421*G0_0_1_0_0_3 + 0.00267857142857152*G0_0_1_0_0_4 - 0.00681818181818207*G0_0_1_0_0_5 + 0.00328733766233776*G0_0_1_0_1_1 - 0.000121753246753253*G0_0_1_0_1_2 + 0.000487012987013005*G0_0_1_0_1_3 - 0.000487012987012999*G0_0_1_0_1_4 + 0.00487012987013006*G0_0_1_0_1_5 - 0.000231331168831178*G0_0_1_0_2_0 - 0.000121753246753253*G0_0_1_0_2_1 + 0.000572240259740282*G0_0_1_0_2_2 - 0.0016558441558442*G0_0_1_0_2_3 - 0.0022402597402598*G0_0_1_0_2_4 - 0.001948051948052*G0_0_1_0_2_5 - 0.00165584415584421*G0_0_1_0_3_0 + 0.000487012987013005*G0_0_1_0_3_1 - 0.0016558441558442*G0_0_1_0_3_2 + 0.000974025974026009*G0_0_1_0_3_3 + 0.00428571428571442*G0_0_1_0_3_4 + 0.00720779220779242*G0_0_1_0_3_5 + 0.00267857142857152*G0_0_1_0_4_0 - 0.000487012987012999*G0_0_1_0_4_1 - 0.0022402597402598*G0_0_1_0_4_2 + 0.00428571428571442*G0_0_1_0_4_3 + 0.00857142857142885*G0_0_1_0_4_4 + 0.00487012987013*G0_0_1_0_4_5 - 0.00681818181818207*G0_0_1_0_5_0 + 0.00487012987013006*G0_0_1_0_5_1 - 0.001948051948052*G0_0_1_0_5_2 + 0.00720779220779242*G0_0_1_0_5_3 + 0.00487012987013*G0_0_1_0_5_4 - 0.00175324675324698*G0_0_1_0_5_5 + 0.00328733766233776*G0_0_1_1_0_1 - 0.000121753246753253*G0_0_1_1_0_2 + 0.000487012987013005*G0_0_1_1_0_3 - 0.000487012987012999*G0_0_1_1_0_4 + 0.00487012987013006*G0_0_1_1_0_5 + 0.00328733766233776*G0_0_1_1_1_0 - 0.085470779220782*G0_0_1_1_1_1 + 0.00547889610389628*G0_0_1_1_1_2 - 0.0204545454545461*G0_0_1_1_1_3 - 0.00292207792207801*G0_0_1_1_1_4 - 0.0204545454545462*G0_0_1_1_1_5 - 0.000121753246753253*G0_0_1_1_2_0 + 0.00547889610389628*G0_0_1_1_2_1 - 0.000974025974026008*G0_0_1_1_2_3 - 0.00194805194805201*G0_0_1_1_2_4 - 0.00243506493506501*G0_0_1_1_2_5 + 0.000487012987013005*G0_0_1_1_3_0 - 0.0204545454545461*G0_0_1_1_3_1 - 0.000974025974026006*G0_0_1_1_3_2 - 0.00389610389610399*G0_0_1_1_3_3 + 0.00487012987013003*G0_0_1_1_3_4 + 0.00389610389610401*G0_0_1_1_3_5 - 0.000487012987012999*G0_0_1_1_4_0 - 0.00292207792207801*G0_0_1_1_4_1 - 0.00194805194805201*G0_0_1_1_4_2 + 0.00487012987013003*G0_0_1_1_4_3 + 0.00584415584415604*G0_0_1_1_4_4 + 0.0107142857142861*G0_0_1_1_4_5 + 0.00487012987013006*G0_0_1_1_5_0 - 0.0204545454545462*G0_0_1_1_5_1 - 0.00243506493506501*G0_0_1_1_5_2 + 0.00389610389610401*G0_0_1_1_5_3 + 0.0107142857142861*G0_0_1_1_5_4 + 0.0194805194805201*G0_0_1_1_5_5 - 0.000231331168831178*G0_0_1_2_0_0 - 0.000121753246753253*G0_0_1_2_0_1 + 0.000572240259740282*G0_0_1_2_0_2 - 0.0016558441558442*G0_0_1_2_0_3 - 0.0022402597402598*G0_0_1_2_0_4 - 0.001948051948052*G0_0_1_2_0_5 - 0.000121753246753253*G0_0_1_2_1_0 + 0.00547889610389628*G0_0_1_2_1_1 - 0.000974025974026008*G0_0_1_2_1_3 - 0.00194805194805201*G0_0_1_2_1_4 - 0.00243506493506501*G0_0_1_2_1_5 + 0.000572240259740282*G0_0_1_2_2_0 - 0.000255681818181881*G0_0_1_2_2_2 - 0.000681818181818211*G0_0_1_2_2_3 - 0.00199675324675334*G0_0_1_2_2_4 - 0.00487012987013003*G0_0_1_2_2_5 - 0.0016558441558442*G0_0_1_2_3_0 - 0.000974025974026007*G0_0_1_2_3_1 - 0.000681818181818211*G0_0_1_2_3_2 + 0.00876623376623403*G0_0_1_2_3_3 + 0.00720779220779244*G0_0_1_2_3_4 + 0.0130519480519485*G0_0_1_2_3_5 - 0.0022402597402598*G0_0_1_2_4_0 - 0.00194805194805201*G0_0_1_2_4_1 - 0.00199675324675334*G0_0_1_2_4_2 + 0.00720779220779244*G0_0_1_2_4_3 + 0.00623376623376641*G0_0_1_2_4_4 + 0.0136363636363641*G0_0_1_2_4_5 - 0.001948051948052*G0_0_1_2_5_0 - 0.00243506493506501*G0_0_1_2_5_1 - 0.00487012987013003*G0_0_1_2_5_2 + 0.0130519480519485*G0_0_1_2_5_3 + 0.0136363636363641*G0_0_1_2_5_4 + 0.0372077922077935*G0_0_1_2_5_5 - 0.00165584415584421*G0_0_1_3_0_0 + 0.000487012987013005*G0_0_1_3_0_1 - 0.0016558441558442*G0_0_1_3_0_2 + 0.00097402597402601*G0_0_1_3_0_3 + 0.00428571428571442*G0_0_1_3_0_4 + 0.00720779220779242*G0_0_1_3_0_5 + 0.000487012987013005*G0_0_1_3_1_0 - 0.0204545454545461*G0_0_1_3_1_1 - 0.000974025974026007*G0_0_1_3_1_2 - 0.00389610389610399*G0_0_1_3_1_3 + 0.00487012987013003*G0_0_1_3_1_4 + 0.00389610389610401*G0_0_1_3_1_5 - 0.0016558441558442*G0_0_1_3_2_0 - 0.000974025974026007*G0_0_1_3_2_1 - 0.000681818181818211*G0_0_1_3_2_2 + 0.00876623376623403*G0_0_1_3_2_3 + 0.00720779220779244*G0_0_1_3_2_4 + 0.0130519480519485*G0_0_1_3_2_5 + 0.000974025974026012*G0_0_1_3_3_0 - 0.00389610389610399*G0_0_1_3_3_1 + 0.00876623376623403*G0_0_1_3_3_2 + 0.0981818181818216*G0_0_1_3_3_3 - 0.0116883116883121*G0_0_1_3_3_4 - 0.0280519480519489*G0_0_1_3_3_5 + 0.00428571428571442*G0_0_1_3_4_0 + 0.00487012987013003*G0_0_1_3_4_1 + 0.00720779220779244*G0_0_1_3_4_2 - 0.0116883116883121*G0_0_1_3_4_3 - 0.0202597402597409*G0_0_1_3_4_4 - 0.035844155844157*G0_0_1_3_4_5 + 0.00720779220779242*G0_0_1_3_5_0 + 0.00389610389610401*G0_0_1_3_5_1 + 0.0130519480519485*G0_0_1_3_5_2 - 0.0280519480519489*G0_0_1_3_5_3 - 0.035844155844157*G0_0_1_3_5_4 - 0.0888311688311718*G0_0_1_3_5_5 + 0.00267857142857152*G0_0_1_4_0_0 - 0.000487012987012999*G0_0_1_4_0_1 - 0.0022402597402598*G0_0_1_4_0_2 + 0.00428571428571442*G0_0_1_4_0_3 + 0.00857142857142885*G0_0_1_4_0_4 + 0.00487012987013*G0_0_1_4_0_5 - 0.000487012987012999*G0_0_1_4_1_0 - 0.00292207792207801*G0_0_1_4_1_1 - 0.00194805194805201*G0_0_1_4_1_2 + 0.00487012987013003*G0_0_1_4_1_3 + 0.00584415584415604*G0_0_1_4_1_4 + 0.0107142857142861*G0_0_1_4_1_5 - 0.0022402597402598*G0_0_1_4_2_0 - 0.00194805194805201*G0_0_1_4_2_1 - 0.00199675324675334*G0_0_1_4_2_2 + 0.00720779220779244*G0_0_1_4_2_3 + 0.00623376623376641*G0_0_1_4_2_4 + 0.0136363636363641*G0_0_1_4_2_5 + 0.00428571428571442*G0_0_1_4_3_0 + 0.00487012987013003*G0_0_1_4_3_1 + 0.00720779220779244*G0_0_1_4_3_2 - 0.0116883116883121*G0_0_1_4_3_3 - 0.0202597402597409*G0_0_1_4_3_4 - 0.035844155844157*G0_0_1_4_3_5 + 0.00857142857142885*G0_0_1_4_4_0 + 0.00584415584415604*G0_0_1_4_4_1 + 0.00623376623376641*G0_0_1_4_4_2 - 0.0202597402597409*G0_0_1_4_4_3 - 0.0389610389610403*G0_0_1_4_4_5 + 0.00487012987013*G0_0_1_4_5_0 + 0.0107142857142861*G0_0_1_4_5_1 + 0.0136363636363641*G0_0_1_4_5_2 - 0.035844155844157*G0_0_1_4_5_3 - 0.0389610389610402*G0_0_1_4_5_4 - 0.0958441558441591*G0_0_1_4_5_5 - 0.00681818181818207*G0_0_1_5_0_0 + 0.00487012987013006*G0_0_1_5_0_1 - 0.001948051948052*G0_0_1_5_0_2 + 0.00720779220779242*G0_0_1_5_0_3 + 0.00487012987013*G0_0_1_5_0_4 - 0.00175324675324698*G0_0_1_5_0_5 + 0.00487012987013006*G0_0_1_5_1_0 - 0.0204545454545462*G0_0_1_5_1_1 - 0.00243506493506501*G0_0_1_5_1_2 + 0.00389610389610401*G0_0_1_5_1_3 + 0.0107142857142861*G0_0_1_5_1_4 + 0.0194805194805201*G0_0_1_5_1_5 - 0.001948051948052*G0_0_1_5_2_0 - 0.00243506493506501*G0_0_1_5_2_1 - 0.00487012987013003*G0_0_1_5_2_2 + 0.0130519480519485*G0_0_1_5_2_3 + 0.0136363636363641*G0_0_1_5_2_4 + 0.0372077922077935*G0_0_1_5_2_5 + 0.00720779220779242*G0_0_1_5_3_0 + 0.00389610389610401*G0_0_1_5_3_1 + 0.0130519480519485*G0_0_1_5_3_2 - 0.0280519480519489*G0_0_1_5_3_3 - 0.035844155844157*G0_0_1_5_3_4 - 0.0888311688311718*G0_0_1_5_3_5 + 0.00487012987013*G0_0_1_5_4_0 + 0.0107142857142861*G0_0_1_5_4_1 + 0.0136363636363641*G0_0_1_5_4_2 - 0.035844155844157*G0_0_1_5_4_3 - 0.0389610389610403*G0_0_1_5_4_4 - 0.0958441558441591*G0_0_1_5_4_5 - 0.00175324675324698*G0_0_1_5_5_0 + 0.0194805194805201*G0_0_1_5_5_1 + 0.0372077922077935*G0_0_1_5_5_2 - 0.0888311688311718*G0_0_1_5_5_3 - 0.0958441558441591*G0_0_1_5_5_4 - 0.448831168831185*G0_0_1_5_5_5; + A[42] = -A[72] + 0.01935064935065*G0_0_1_0_0_0 - 0.00145292207792212*G0_0_1_0_0_1 + 0.000919913419913451*G0_0_1_0_0_2 + 0.00107683982683986*G0_0_1_0_0_3 + 0.00390151515151527*G0_0_1_0_0_4 + 0.00486471861471877*G0_0_1_0_0_5 - 0.00145292207792212*G0_0_1_0_1_0 - 0.000238095238095245*G0_0_1_0_1_1 + 0.00101596320346324*G0_0_1_0_1_2 + 0.0011580086580087*G0_0_1_0_1_3 + 0.00095779220779224*G0_0_1_0_1_4 + 0.000389610389610405*G0_0_1_0_1_5 + 0.000919913419913451*G0_0_1_0_2_0 + 0.00101596320346324*G0_0_1_0_2_1 - 0.0111011904761909*G0_0_1_0_2_2 - 0.00414502164502178*G0_0_1_0_2_3 - 0.00662337662337685*G0_0_1_0_2_4 - 0.000557359307359328*G0_0_1_0_2_5 + 0.00107683982683986*G0_0_1_0_3_0 + 0.0011580086580087*G0_0_1_0_3_1 - 0.00414502164502178*G0_0_1_0_3_2 - 0.00458874458874473*G0_0_1_0_3_3 - 0.0040692640692642*G0_0_1_0_3_4 - 0.00103896103896107*G0_0_1_0_3_5 + 0.00390151515151527*G0_0_1_0_4_0 + 0.00095779220779224*G0_0_1_0_4_1 - 0.00662337662337685*G0_0_1_0_4_2 - 0.0040692640692642*G0_0_1_0_4_3 - 0.0108658008658012*G0_0_1_0_4_4 - 0.000800865800865831*G0_0_1_0_4_5 + 0.00486471861471877*G0_0_1_0_5_0 + 0.000389610389610405*G0_0_1_0_5_1 - 0.000557359307359328*G0_0_1_0_5_2 - 0.00103896103896107*G0_0_1_0_5_3 - 0.000800865800865831*G0_0_1_0_5_4 + 0.00285714285714294*G0_0_1_0_5_5 - 0.00145292207792212*G0_0_1_1_0_0 - 0.000238095238095245*G0_0_1_1_0_1 + 0.00101596320346324*G0_0_1_1_0_2 + 0.0011580086580087*G0_0_1_1_0_3 + 0.00095779220779224*G0_0_1_1_0_4 + 0.000389610389610405*G0_0_1_1_0_5 - 0.000238095238095245*G0_0_1_1_1_0 + 0.00676136363636384*G0_0_1_1_1_1 + 0.00153950216450222*G0_0_1_1_1_2 + 0.00246753246753255*G0_0_1_1_1_3 + 0.000963203463203494*G0_0_1_1_1_4 + 0.000292207792207802*G0_0_1_1_1_5 + 0.00101596320346324*G0_0_1_1_2_0 + 0.00153950216450222*G0_0_1_1_2_1 - 0.011696428571429*G0_0_1_1_2_2 - 0.00746753246753273*G0_0_1_1_2_3 - 0.0040584415584417*G0_0_1_1_2_4 - 0.000270562770562782*G0_0_1_1_2_5 + 0.0011580086580087*G0_0_1_1_3_0 + 0.00246753246753255*G0_0_1_1_3_1 - 0.00746753246753273*G0_0_1_1_3_2 - 0.0126406926406931*G0_0_1_1_3_3 - 0.00424242424242439*G0_0_1_1_3_4 - 0.00177489177489184*G0_0_1_1_3_5 + 0.000957792207792239*G0_0_1_1_4_0 + 0.000963203463203494*G0_0_1_1_4_1 - 0.0040584415584417*G0_0_1_1_4_2 - 0.00424242424242439*G0_0_1_1_4_3 - 0.00419913419913434*G0_0_1_1_4_4 - 0.00138528138528143*G0_0_1_1_4_5 + 0.000389610389610405*G0_0_1_1_5_0 + 0.000292207792207802*G0_0_1_1_5_1 - 0.000270562770562782*G0_0_1_1_5_2 - 0.00177489177489184*G0_0_1_1_5_3 - 0.00138528138528143*G0_0_1_1_5_4 - 0.00367965367965381*G0_0_1_1_5_5 + 0.000919913419913451*G0_0_1_2_0_0 + 0.00101596320346324*G0_0_1_2_0_1 - 0.0111011904761909*G0_0_1_2_0_2 - 0.00414502164502178*G0_0_1_2_0_3 - 0.00662337662337685*G0_0_1_2_0_4 - 0.000557359307359328*G0_0_1_2_0_5 + 0.00101596320346324*G0_0_1_2_1_0 + 0.00153950216450222*G0_0_1_2_1_1 - 0.011696428571429*G0_0_1_2_1_2 - 0.00746753246753273*G0_0_1_2_1_3 - 0.0040584415584417*G0_0_1_2_1_4 - 0.000270562770562782*G0_0_1_2_1_5 - 0.0111011904761909*G0_0_1_2_2_0 - 0.011696428571429*G0_0_1_2_2_1 + 0.166233766233772*G0_0_1_2_2_2 + 0.0501082251082269*G0_0_1_2_2_3 + 0.0469696969696986*G0_0_1_2_2_4 + 0.00323593073593088*G0_0_1_2_2_5 - 0.00414502164502178*G0_0_1_2_3_0 - 0.00746753246753273*G0_0_1_2_3_1 + 0.0501082251082269*G0_0_1_2_3_2 + 0.0379220779220793*G0_0_1_2_3_3 + 0.016406926406927*G0_0_1_2_3_4 + 0.00181818181818189*G0_0_1_2_3_5 - 0.00662337662337685*G0_0_1_2_4_0 - 0.0040584415584417*G0_0_1_2_4_1 + 0.0469696969696986*G0_0_1_2_4_2 + 0.016406926406927*G0_0_1_2_4_3 + 0.0331601731601743*G0_0_1_2_4_4 + 0.00164502164502171*G0_0_1_2_4_5 - 0.000557359307359328*G0_0_1_2_5_0 - 0.000270562770562782*G0_0_1_2_5_1 + 0.00323593073593088*G0_0_1_2_5_2 + 0.00181818181818189*G0_0_1_2_5_3 + 0.00164502164502171*G0_0_1_2_5_4 + 0.000735930735930763*G0_0_1_2_5_5 + 0.00107683982683986*G0_0_1_3_0_0 + 0.0011580086580087*G0_0_1_3_0_1 - 0.00414502164502178*G0_0_1_3_0_2 - 0.00458874458874473*G0_0_1_3_0_3 - 0.0040692640692642*G0_0_1_3_0_4 - 0.00103896103896107*G0_0_1_3_0_5 + 0.0011580086580087*G0_0_1_3_1_0 + 0.00246753246753255*G0_0_1_3_1_1 - 0.00746753246753273*G0_0_1_3_1_2 - 0.0126406926406931*G0_0_1_3_1_3 - 0.00424242424242439*G0_0_1_3_1_4 - 0.00177489177489184*G0_0_1_3_1_5 - 0.00414502164502178*G0_0_1_3_2_0 - 0.00746753246753273*G0_0_1_3_2_1 + 0.0501082251082269*G0_0_1_3_2_2 + 0.0379220779220793*G0_0_1_3_2_3 + 0.016406926406927*G0_0_1_3_2_4 + 0.00181818181818189*G0_0_1_3_2_5 - 0.00458874458874473*G0_0_1_3_3_0 - 0.0126406926406931*G0_0_1_3_3_1 + 0.0379220779220793*G0_0_1_3_3_2 + 0.0446753246753262*G0_0_1_3_3_3 + 0.0176623376623383*G0_0_1_3_3_4 + 0.00554112554112573*G0_0_1_3_3_5 - 0.0040692640692642*G0_0_1_3_4_0 - 0.00424242424242439*G0_0_1_3_4_1 + 0.016406926406927*G0_0_1_3_4_2 + 0.0176623376623383*G0_0_1_3_4_3 + 0.0165367965367971*G0_0_1_3_4_4 + 0.00484848484848502*G0_0_1_3_4_5 - 0.00103896103896107*G0_0_1_3_5_0 - 0.00177489177489184*G0_0_1_3_5_1 + 0.00181818181818189*G0_0_1_3_5_2 + 0.00554112554112573*G0_0_1_3_5_3 + 0.00484848484848502*G0_0_1_3_5_4 + 0.000606060606060628*G0_0_1_3_5_5 + 0.00390151515151527*G0_0_1_4_0_0 + 0.00095779220779224*G0_0_1_4_0_1 - 0.00662337662337685*G0_0_1_4_0_2 - 0.0040692640692642*G0_0_1_4_0_3 - 0.0108658008658012*G0_0_1_4_0_4 - 0.000800865800865831*G0_0_1_4_0_5 + 0.00095779220779224*G0_0_1_4_1_0 + 0.000963203463203495*G0_0_1_4_1_1 - 0.0040584415584417*G0_0_1_4_1_2 - 0.00424242424242439*G0_0_1_4_1_3 - 0.00419913419913434*G0_0_1_4_1_4 - 0.00138528138528143*G0_0_1_4_1_5 - 0.00662337662337685*G0_0_1_4_2_0 - 0.0040584415584417*G0_0_1_4_2_1 + 0.0469696969696986*G0_0_1_4_2_2 + 0.016406926406927*G0_0_1_4_2_3 + 0.0331601731601743*G0_0_1_4_2_4 + 0.00164502164502171*G0_0_1_4_2_5 - 0.0040692640692642*G0_0_1_4_3_0 - 0.00424242424242439*G0_0_1_4_3_1 + 0.016406926406927*G0_0_1_4_3_2 + 0.0176623376623383*G0_0_1_4_3_3 + 0.0165367965367971*G0_0_1_4_3_4 + 0.00484848484848502*G0_0_1_4_3_5 - 0.0108658008658012*G0_0_1_4_4_0 - 0.00419913419913434*G0_0_1_4_4_1 + 0.0331601731601743*G0_0_1_4_4_2 + 0.0165367965367971*G0_0_1_4_4_3 + 0.0345454545454557*G0_0_1_4_4_4 + 0.00510822510822529*G0_0_1_4_4_5 - 0.00080086580086583*G0_0_1_4_5_0 - 0.00138528138528143*G0_0_1_4_5_1 + 0.00164502164502171*G0_0_1_4_5_2 + 0.00484848484848502*G0_0_1_4_5_3 + 0.00510822510822529*G0_0_1_4_5_4 + 0.00129870129870135*G0_0_1_4_5_5 + 0.00486471861471877*G0_0_1_5_0_0 + 0.000389610389610405*G0_0_1_5_0_1 - 0.000557359307359328*G0_0_1_5_0_2 - 0.00103896103896107*G0_0_1_5_0_3 - 0.00080086580086583*G0_0_1_5_0_4 + 0.00285714285714294*G0_0_1_5_0_5 + 0.000389610389610405*G0_0_1_5_1_0 + 0.000292207792207802*G0_0_1_5_1_1 - 0.000270562770562782*G0_0_1_5_1_2 - 0.00177489177489184*G0_0_1_5_1_3 - 0.00138528138528143*G0_0_1_5_1_4 - 0.00367965367965381*G0_0_1_5_1_5 - 0.000557359307359328*G0_0_1_5_2_0 - 0.000270562770562782*G0_0_1_5_2_1 + 0.00323593073593088*G0_0_1_5_2_2 + 0.00181818181818189*G0_0_1_5_2_3 + 0.00164502164502171*G0_0_1_5_2_4 + 0.000735930735930763*G0_0_1_5_2_5 - 0.00103896103896107*G0_0_1_5_3_0 - 0.00177489177489184*G0_0_1_5_3_1 + 0.00181818181818189*G0_0_1_5_3_2 + 0.00554112554112573*G0_0_1_5_3_3 + 0.00484848484848502*G0_0_1_5_3_4 + 0.000606060606060627*G0_0_1_5_3_5 - 0.00080086580086583*G0_0_1_5_4_0 - 0.00138528138528143*G0_0_1_5_4_1 + 0.00164502164502171*G0_0_1_5_4_2 + 0.00484848484848502*G0_0_1_5_4_3 + 0.00510822510822529*G0_0_1_5_4_4 + 0.00129870129870135*G0_0_1_5_4_5 + 0.00285714285714294*G0_0_1_5_5_0 - 0.00367965367965381*G0_0_1_5_5_1 + 0.000735930735930763*G0_0_1_5_5_2 + 0.000606060606060627*G0_0_1_5_5_3 + 0.00129870129870135*G0_0_1_5_5_4 - 0.0418181818181833*G0_0_1_5_5_5 - 0.00611201298701322*G0_1_1_0_0_0 + 0.000698051948051975*G0_1_1_0_0_1 + 0.000771103896103923*G0_1_1_0_0_2 - 0.000162337662337667*G0_1_1_0_0_3 - 0.000649350649350673*G0_1_1_0_0_4 - 0.00633116883116906*G0_1_1_0_0_5 + 0.000698051948051975*G0_1_1_0_1_0 + 0.000511363636363654*G0_1_1_0_1_1 + 0.000292207792207801*G0_1_1_0_1_2 + 0.00113636363636367*G0_1_1_0_1_3 + 0.000681818181818204*G0_1_1_0_1_4 + 0.00337662337662349*G0_1_1_0_1_5 + 0.000771103896103923*G0_1_1_0_2_0 + 0.000292207792207801*G0_1_1_0_2_1 - 0.00230519480519489*G0_1_1_0_2_2 - 0.00246753246753255*G0_1_1_0_2_3 - 0.00175324675324681*G0_1_1_0_2_4 - 0.000162337662337667*G0_1_1_0_2_5 - 0.000162337662337667*G0_1_1_0_3_0 + 0.00113636363636367*G0_1_1_0_3_1 - 0.00246753246753255*G0_1_1_0_3_2 - 0.00025974025974027*G0_1_1_0_3_3 - 0.00103896103896107*G0_1_1_0_3_4 + 0.000649350649350668*G0_1_1_0_3_5 - 0.000649350649350672*G0_1_1_0_4_0 + 0.000681818181818204*G0_1_1_0_4_1 - 0.00175324675324681*G0_1_1_0_4_2 - 0.00103896103896107*G0_1_1_0_4_3 - 0.00155844155844161*G0_1_1_0_4_4 - 0.00103896103896108*G0_1_1_0_4_5 - 0.00633116883116906*G0_1_1_0_5_0 + 0.00337662337662349*G0_1_1_0_5_1 - 0.000162337662337667*G0_1_1_0_5_2 + 0.000649350649350668*G0_1_1_0_5_3 - 0.00103896103896108*G0_1_1_0_5_4 - 0.00506493506493527*G0_1_1_0_5_5 + 0.000698051948051975*G0_1_1_1_0_0 + 0.000511363636363654*G0_1_1_1_0_1 + 0.000292207792207801*G0_1_1_1_0_2 + 0.00113636363636367*G0_1_1_1_0_3 + 0.000681818181818204*G0_1_1_1_0_4 + 0.00337662337662349*G0_1_1_1_0_5 + 0.000511363636363654*G0_1_1_1_1_0 - 0.00438311688311705*G0_1_1_1_1_1 + 0.00138798701298706*G0_1_1_1_1_2 - 0.000454545454545476*G0_1_1_1_1_3 + 0.000292207792207803*G0_1_1_1_1_4 - 0.00538961038961058*G0_1_1_1_1_5 + 0.000292207792207801*G0_1_1_1_2_0 + 0.00138798701298706*G0_1_1_1_2_1 - 0.00449675324675341*G0_1_1_1_2_2 - 0.0039610389610391*G0_1_1_1_2_3 - 0.00155844155844161*G0_1_1_1_2_4 + 0.00113636363636367*G0_1_1_1_3_0 - 0.000454545454545476*G0_1_1_1_3_1 - 0.0039610389610391*G0_1_1_1_3_2 - 0.0140259740259745*G0_1_1_1_3_3 - 0.00285714285714296*G0_1_1_1_3_4 - 0.00233766233766242*G0_1_1_1_3_5 + 0.000681818181818204*G0_1_1_1_4_0 + 0.000292207792207803*G0_1_1_1_4_1 - 0.00155844155844161*G0_1_1_1_4_2 - 0.00285714285714296*G0_1_1_1_4_3 - 0.00233766233766242*G0_1_1_1_4_4 - 0.000649350649350673*G0_1_1_1_4_5 + 0.00337662337662349*G0_1_1_1_5_0 - 0.00538961038961058*G0_1_1_1_5_1 - 0.00233766233766242*G0_1_1_1_5_3 - 0.000649350649350673*G0_1_1_1_5_4 - 0.00467532467532484*G0_1_1_1_5_5 + 0.000771103896103923*G0_1_1_2_0_0 + 0.000292207792207801*G0_1_1_2_0_1 - 0.00230519480519489*G0_1_1_2_0_2 - 0.00246753246753255*G0_1_1_2_0_3 - 0.00175324675324681*G0_1_1_2_0_4 - 0.000162337662337667*G0_1_1_2_0_5 + 0.000292207792207801*G0_1_1_2_1_0 + 0.00138798701298706*G0_1_1_2_1_1 - 0.00449675324675341*G0_1_1_2_1_2 - 0.0039610389610391*G0_1_1_2_1_3 - 0.00155844155844161*G0_1_1_2_1_4 - 0.00230519480519489*G0_1_1_2_2_0 - 0.00449675324675341*G0_1_1_2_2_1 + 0.0304383116883128*G0_1_1_2_2_2 + 0.0194805194805202*G0_1_1_2_2_3 + 0.00941558441558477*G0_1_1_2_2_4 + 0.00103896103896108*G0_1_1_2_2_5 - 0.00246753246753255*G0_1_1_2_3_0 - 0.0039610389610391*G0_1_1_2_3_1 + 0.0194805194805202*G0_1_1_2_3_2 + 0.0296103896103906*G0_1_1_2_3_3 + 0.00805194805194833*G0_1_1_2_3_4 + 0.00285714285714296*G0_1_1_2_3_5 - 0.00175324675324681*G0_1_1_2_4_0 - 0.00155844155844161*G0_1_1_2_4_1 + 0.00941558441558477*G0_1_1_2_4_2 + 0.00805194805194833*G0_1_1_2_4_3 + 0.00623376623376647*G0_1_1_2_4_4 + 0.00103896103896107*G0_1_1_2_4_5 - 0.000162337662337667*G0_1_1_2_5_0 + 0.00103896103896108*G0_1_1_2_5_2 + 0.00285714285714296*G0_1_1_2_5_3 + 0.00103896103896107*G0_1_1_2_5_4 + 0.00376623376623389*G0_1_1_2_5_5 - 0.000162337662337667*G0_1_1_3_0_0 + 0.00113636363636367*G0_1_1_3_0_1 - 0.00246753246753255*G0_1_1_3_0_2 - 0.00025974025974027*G0_1_1_3_0_3 - 0.00103896103896107*G0_1_1_3_0_4 + 0.000649350649350668*G0_1_1_3_0_5 + 0.00113636363636367*G0_1_1_3_1_0 - 0.000454545454545475*G0_1_1_3_1_1 - 0.0039610389610391*G0_1_1_3_1_2 - 0.0140259740259745*G0_1_1_3_1_3 - 0.00285714285714296*G0_1_1_3_1_4 - 0.00233766233766242*G0_1_1_3_1_5 - 0.00246753246753255*G0_1_1_3_2_0 - 0.0039610389610391*G0_1_1_3_2_1 + 0.0194805194805202*G0_1_1_3_2_2 + 0.0296103896103906*G0_1_1_3_2_3 + 0.00805194805194833*G0_1_1_3_2_4 + 0.00285714285714296*G0_1_1_3_2_5 - 0.00025974025974027*G0_1_1_3_3_0 - 0.0140259740259745*G0_1_1_3_3_1 + 0.0296103896103906*G0_1_1_3_3_2 + 0.00935064935064974*G0_1_1_3_3_3 + 0.00623376623376646*G0_1_1_3_3_4 - 0.00519480519480536*G0_1_1_3_3_5 - 0.00103896103896107*G0_1_1_3_4_0 - 0.00285714285714296*G0_1_1_3_4_1 + 0.00805194805194833*G0_1_1_3_4_2 + 0.00623376623376646*G0_1_1_3_4_3 + 0.00675324675324699*G0_1_1_3_4_4 + 0.000649350649350668*G0_1_1_3_5_0 - 0.00233766233766242*G0_1_1_3_5_1 + 0.00285714285714296*G0_1_1_3_5_2 - 0.00519480519480536*G0_1_1_3_5_3 - 0.00883116883116911*G0_1_1_3_5_5 - 0.000649350649350672*G0_1_1_4_0_0 + 0.000681818181818204*G0_1_1_4_0_1 - 0.00175324675324681*G0_1_1_4_0_2 - 0.00103896103896107*G0_1_1_4_0_3 - 0.00155844155844161*G0_1_1_4_0_4 - 0.00103896103896108*G0_1_1_4_0_5 + 0.000681818181818204*G0_1_1_4_1_0 + 0.000292207792207803*G0_1_1_4_1_1 - 0.00155844155844161*G0_1_1_4_1_2 - 0.00285714285714296*G0_1_1_4_1_3 - 0.00233766233766242*G0_1_1_4_1_4 - 0.000649350649350673*G0_1_1_4_1_5 - 0.00175324675324681*G0_1_1_4_2_0 - 0.00155844155844161*G0_1_1_4_2_1 + 0.00941558441558477*G0_1_1_4_2_2 + 0.00805194805194833*G0_1_1_4_2_3 + 0.00623376623376647*G0_1_1_4_2_4 + 0.00103896103896107*G0_1_1_4_2_5 - 0.00103896103896107*G0_1_1_4_3_0 - 0.00285714285714296*G0_1_1_4_3_1 + 0.00805194805194833*G0_1_1_4_3_2 + 0.00623376623376646*G0_1_1_4_3_3 + 0.00675324675324699*G0_1_1_4_3_4 - 0.00155844155844161*G0_1_1_4_4_0 - 0.00233766233766242*G0_1_1_4_4_1 + 0.00623376623376647*G0_1_1_4_4_2 + 0.00675324675324699*G0_1_1_4_4_3 + 0.0140259740259745*G0_1_1_4_4_4 + 0.0025974025974027*G0_1_1_4_4_5 - 0.00103896103896108*G0_1_1_4_5_0 - 0.000649350649350673*G0_1_1_4_5_1 + 0.00103896103896107*G0_1_1_4_5_2 + 0.0025974025974027*G0_1_1_4_5_4 - 0.00623376623376642*G0_1_1_4_5_5 - 0.00633116883116906*G0_1_1_5_0_0 + 0.00337662337662349*G0_1_1_5_0_1 - 0.000162337662337667*G0_1_1_5_0_2 + 0.000649350649350668*G0_1_1_5_0_3 - 0.00103896103896108*G0_1_1_5_0_4 - 0.00506493506493527*G0_1_1_5_0_5 + 0.00337662337662349*G0_1_1_5_1_0 - 0.00538961038961058*G0_1_1_5_1_1 - 0.00233766233766242*G0_1_1_5_1_3 - 0.000649350649350673*G0_1_1_5_1_4 - 0.00467532467532484*G0_1_1_5_1_5 - 0.000162337662337667*G0_1_1_5_2_0 + 0.00103896103896108*G0_1_1_5_2_2 + 0.00285714285714296*G0_1_1_5_2_3 + 0.00103896103896107*G0_1_1_5_2_4 + 0.00376623376623389*G0_1_1_5_2_5 + 0.000649350649350668*G0_1_1_5_3_0 - 0.00233766233766242*G0_1_1_5_3_1 + 0.00285714285714296*G0_1_1_5_3_2 - 0.00519480519480536*G0_1_1_5_3_3 - 0.00883116883116911*G0_1_1_5_3_5 - 0.00103896103896108*G0_1_1_5_4_0 - 0.000649350649350673*G0_1_1_5_4_1 + 0.00103896103896107*G0_1_1_5_4_2 + 0.0025974025974027*G0_1_1_5_4_4 - 0.00623376623376642*G0_1_1_5_4_5 - 0.00506493506493527*G0_1_1_5_5_0 - 0.00467532467532484*G0_1_1_5_5_1 + 0.00376623376623389*G0_1_1_5_5_2 - 0.00883116883116911*G0_1_1_5_5_3 - 0.00623376623376642*G0_1_1_5_5_4 - 0.107532467532471*G0_1_1_5_5_5; + A[62] = -A[42] - 0.0129626623376628*G0_1_1_0_0_0 + 0.00112283549783554*G0_1_1_0_0_1 + 0.000357142857142869*G0_1_1_0_0_2 - 0.00100108225108228*G0_1_1_0_0_3 - 0.00315476190476201*G0_1_1_0_0_4 - 0.0073971861471864*G0_1_1_0_0_5 + 0.00112283549783554*G0_1_1_0_1_0 + 0.00112283549783553*G0_1_1_0_1_1 - 0.000359848484848497*G0_1_1_0_1_2 + 0.000221861471861479*G0_1_1_0_1_3 + 0.000221861471861479*G0_1_1_0_1_4 + 0.00275974025974035*G0_1_1_0_1_5 + 0.000357142857142869*G0_1_1_0_2_0 - 0.000359848484848497*G0_1_1_0_2_1 + 0.00557359307359326*G0_1_1_0_2_2 + 0.000216450216450225*G0_1_1_0_2_3 + 0.00194805194805202*G0_1_1_0_2_4 - 0.000146103896103898*G0_1_1_0_2_5 - 0.00100108225108228*G0_1_1_0_3_0 + 0.000221861471861479*G0_1_1_0_3_1 + 0.000216450216450225*G0_1_1_0_3_2 + 0.00385281385281397*G0_1_1_0_3_3 + 0.00155844155844161*G0_1_1_0_3_4 + 0.00229437229437237*G0_1_1_0_3_5 - 0.00315476190476201*G0_1_1_0_4_0 + 0.000221861471861479*G0_1_1_0_4_1 + 0.00194805194805202*G0_1_1_0_4_2 + 0.00155844155844161*G0_1_1_0_4_3 - 0.00220779220779228*G0_1_1_0_4_4 - 0.000151515151515161*G0_1_1_0_4_5 - 0.0073971861471864*G0_1_1_0_5_0 + 0.00275974025974035*G0_1_1_0_5_1 - 0.000146103896103898*G0_1_1_0_5_2 + 0.00229437229437237*G0_1_1_0_5_3 - 0.000151515151515161*G0_1_1_0_5_4 - 0.00307359307359321*G0_1_1_0_5_5 + 0.00112283549783554*G0_1_1_1_0_0 + 0.00112283549783553*G0_1_1_1_0_1 - 0.000359848484848497*G0_1_1_1_0_2 + 0.00022186147186148*G0_1_1_1_0_3 + 0.000221861471861479*G0_1_1_1_0_4 + 0.00275974025974035*G0_1_1_1_0_5 + 0.00112283549783553*G0_1_1_1_1_0 - 0.0129626623376628*G0_1_1_1_1_1 + 0.00035714285714287*G0_1_1_1_1_2 - 0.00315476190476201*G0_1_1_1_1_3 - 0.00100108225108228*G0_1_1_1_1_4 - 0.00739718614718641*G0_1_1_1_1_5 - 0.000359848484848497*G0_1_1_1_2_0 + 0.000357142857142871*G0_1_1_1_2_1 + 0.00557359307359325*G0_1_1_1_2_2 + 0.00194805194805201*G0_1_1_1_2_3 + 0.000216450216450225*G0_1_1_1_2_4 - 0.0001461038961039*G0_1_1_1_2_5 + 0.000221861471861479*G0_1_1_1_3_0 - 0.00315476190476201*G0_1_1_1_3_1 + 0.00194805194805201*G0_1_1_1_3_2 - 0.0022077922077923*G0_1_1_1_3_3 + 0.00155844155844161*G0_1_1_1_3_4 - 0.000151515151515161*G0_1_1_1_3_5 + 0.000221861471861479*G0_1_1_1_4_0 - 0.00100108225108228*G0_1_1_1_4_1 + 0.000216450216450225*G0_1_1_1_4_2 + 0.00155844155844161*G0_1_1_1_4_3 + 0.00385281385281398*G0_1_1_1_4_4 + 0.00229437229437237*G0_1_1_1_4_5 + 0.00275974025974035*G0_1_1_1_5_0 - 0.00739718614718641*G0_1_1_1_5_1 - 0.0001461038961039*G0_1_1_1_5_2 - 0.000151515151515161*G0_1_1_1_5_3 + 0.00229437229437237*G0_1_1_1_5_4 - 0.00307359307359318*G0_1_1_1_5_5 + 0.000357142857142869*G0_1_1_2_0_0 - 0.000359848484848497*G0_1_1_2_0_1 + 0.00557359307359326*G0_1_1_2_0_2 + 0.000216450216450225*G0_1_1_2_0_3 + 0.00194805194805202*G0_1_1_2_0_4 - 0.000146103896103898*G0_1_1_2_0_5 - 0.000359848484848497*G0_1_1_2_1_0 + 0.000357142857142871*G0_1_1_2_1_1 + 0.00557359307359326*G0_1_1_2_1_2 + 0.00194805194805201*G0_1_1_2_1_3 + 0.000216450216450225*G0_1_1_2_1_4 - 0.000146103896103899*G0_1_1_2_1_5 + 0.00557359307359326*G0_1_1_2_2_0 + 0.00557359307359326*G0_1_1_2_2_1 - 0.114042207792212*G0_1_1_2_2_2 - 0.0240259740259749*G0_1_1_2_2_3 - 0.0240259740259749*G0_1_1_2_2_4 - 0.00173160173160181*G0_1_1_2_2_5 + 0.000216450216450225*G0_1_1_2_3_0 + 0.00194805194805201*G0_1_1_2_3_1 - 0.0240259740259749*G0_1_1_2_3_2 - 0.00173160173160179*G0_1_1_2_3_3 - 0.000865800865800901*G0_1_1_2_3_4 + 0.00303030303030313*G0_1_1_2_3_5 + 0.00194805194805202*G0_1_1_2_4_0 + 0.000216450216450225*G0_1_1_2_4_1 - 0.0240259740259749*G0_1_1_2_4_2 - 0.000865800865800901*G0_1_1_2_4_3 - 0.00173160173160182*G0_1_1_2_4_4 + 0.00303030303030313*G0_1_1_2_4_5 - 0.000146103896103898*G0_1_1_2_5_0 - 0.0001461038961039*G0_1_1_2_5_1 - 0.00173160173160181*G0_1_1_2_5_2 + 0.00303030303030313*G0_1_1_2_5_3 + 0.00303030303030313*G0_1_1_2_5_4 + 0.00489177489177506*G0_1_1_2_5_5 - 0.00100108225108228*G0_1_1_3_0_0 + 0.000221861471861479*G0_1_1_3_0_1 + 0.000216450216450225*G0_1_1_3_0_2 + 0.00385281385281397*G0_1_1_3_0_3 + 0.00155844155844161*G0_1_1_3_0_4 + 0.00229437229437237*G0_1_1_3_0_5 + 0.000221861471861479*G0_1_1_3_1_0 - 0.00315476190476201*G0_1_1_3_1_1 + 0.00194805194805201*G0_1_1_3_1_2 - 0.0022077922077923*G0_1_1_3_1_3 + 0.00155844155844161*G0_1_1_3_1_4 - 0.000151515151515161*G0_1_1_3_1_5 + 0.000216450216450225*G0_1_1_3_2_0 + 0.00194805194805201*G0_1_1_3_2_1 - 0.0240259740259749*G0_1_1_3_2_2 - 0.00173160173160179*G0_1_1_3_2_3 - 0.000865800865800901*G0_1_1_3_2_4 + 0.00303030303030313*G0_1_1_3_2_5 + 0.00385281385281397*G0_1_1_3_3_0 - 0.0022077922077923*G0_1_1_3_3_1 - 0.00173160173160179*G0_1_1_3_3_2 - 0.0324675324675335*G0_1_1_3_3_3 - 0.0108225108225112*G0_1_1_3_3_4 - 0.0137662337662342*G0_1_1_3_3_5 + 0.00155844155844161*G0_1_1_3_4_0 + 0.00155844155844161*G0_1_1_3_4_1 - 0.000865800865800901*G0_1_1_3_4_2 - 0.0108225108225112*G0_1_1_3_4_3 - 0.0108225108225112*G0_1_1_3_4_4 - 0.00917748917748948*G0_1_1_3_4_5 + 0.00229437229437237*G0_1_1_3_5_0 - 0.000151515151515161*G0_1_1_3_5_1 + 0.00303030303030313*G0_1_1_3_5_2 - 0.0137662337662342*G0_1_1_3_5_3 - 0.00917748917748948*G0_1_1_3_5_4 - 0.0143722943722948*G0_1_1_3_5_5 - 0.00315476190476201*G0_1_1_4_0_0 + 0.000221861471861479*G0_1_1_4_0_1 + 0.00194805194805202*G0_1_1_4_0_2 + 0.00155844155844161*G0_1_1_4_0_3 - 0.00220779220779228*G0_1_1_4_0_4 - 0.000151515151515161*G0_1_1_4_0_5 + 0.000221861471861479*G0_1_1_4_1_0 - 0.00100108225108228*G0_1_1_4_1_1 + 0.000216450216450225*G0_1_1_4_1_2 + 0.00155844155844161*G0_1_1_4_1_3 + 0.00385281385281398*G0_1_1_4_1_4 + 0.00229437229437237*G0_1_1_4_1_5 + 0.00194805194805202*G0_1_1_4_2_0 + 0.000216450216450225*G0_1_1_4_2_1 - 0.0240259740259749*G0_1_1_4_2_2 - 0.000865800865800901*G0_1_1_4_2_3 - 0.00173160173160182*G0_1_1_4_2_4 + 0.00303030303030313*G0_1_1_4_2_5 + 0.00155844155844161*G0_1_1_4_3_0 + 0.00155844155844161*G0_1_1_4_3_1 - 0.000865800865800901*G0_1_1_4_3_2 - 0.0108225108225112*G0_1_1_4_3_3 - 0.0108225108225112*G0_1_1_4_3_4 - 0.00917748917748948*G0_1_1_4_3_5 - 0.00220779220779228*G0_1_1_4_4_0 + 0.00385281385281398*G0_1_1_4_4_1 - 0.00173160173160182*G0_1_1_4_4_2 - 0.0108225108225112*G0_1_1_4_4_3 - 0.0324675324675336*G0_1_1_4_4_4 - 0.0137662337662342*G0_1_1_4_4_5 - 0.000151515151515161*G0_1_1_4_5_0 + 0.00229437229437237*G0_1_1_4_5_1 + 0.00303030303030313*G0_1_1_4_5_2 - 0.00917748917748948*G0_1_1_4_5_3 - 0.0137662337662342*G0_1_1_4_5_4 - 0.0143722943722948*G0_1_1_4_5_5 - 0.00739718614718641*G0_1_1_5_0_0 + 0.00275974025974035*G0_1_1_5_0_1 - 0.000146103896103898*G0_1_1_5_0_2 + 0.00229437229437237*G0_1_1_5_0_3 - 0.000151515151515161*G0_1_1_5_0_4 - 0.00307359307359321*G0_1_1_5_0_5 + 0.00275974025974035*G0_1_1_5_1_0 - 0.00739718614718641*G0_1_1_5_1_1 - 0.0001461038961039*G0_1_1_5_1_2 - 0.000151515151515161*G0_1_1_5_1_3 + 0.00229437229437237*G0_1_1_5_1_4 - 0.00307359307359318*G0_1_1_5_1_5 - 0.000146103896103898*G0_1_1_5_2_0 - 0.000146103896103899*G0_1_1_5_2_1 - 0.00173160173160181*G0_1_1_5_2_2 + 0.00303030303030313*G0_1_1_5_2_3 + 0.00303030303030313*G0_1_1_5_2_4 + 0.00489177489177506*G0_1_1_5_2_5 + 0.00229437229437237*G0_1_1_5_3_0 - 0.000151515151515161*G0_1_1_5_3_1 + 0.00303030303030313*G0_1_1_5_3_2 - 0.0137662337662342*G0_1_1_5_3_3 - 0.00917748917748948*G0_1_1_5_3_4 - 0.0143722943722948*G0_1_1_5_3_5 - 0.000151515151515161*G0_1_1_5_4_0 + 0.00229437229437237*G0_1_1_5_4_1 + 0.00303030303030313*G0_1_1_5_4_2 - 0.00917748917748948*G0_1_1_5_4_3 - 0.0137662337662342*G0_1_1_5_4_4 - 0.0143722943722948*G0_1_1_5_4_5 - 0.00307359307359321*G0_1_1_5_5_0 - 0.00307359307359318*G0_1_1_5_5_1 + 0.00489177489177506*G0_1_1_5_5_2 - 0.0143722943722948*G0_1_1_5_5_3 - 0.0143722943722948*G0_1_1_5_5_4 - 0.0800000000000027*G0_1_1_5_5_5; + A[65] = -A[45] + 0.0100446428571432*G0_1_0_0_0_0 - 0.000231331168831181*G0_1_0_0_0_1 - 0.00165584415584421*G0_1_0_0_0_3 - 0.00681818181818203*G0_1_0_0_0_4 + 0.00267857142857155*G0_1_0_0_0_5 - 0.000231331168831181*G0_1_0_0_1_0 + 0.000572240259740274*G0_1_0_0_1_1 - 0.00012175324675325*G0_1_0_0_1_2 - 0.00165584415584421*G0_1_0_0_1_3 - 0.00194805194805201*G0_1_0_0_1_4 - 0.00224025974025982*G0_1_0_0_1_5 - 0.00012175324675325*G0_1_0_0_2_1 + 0.00328733766233777*G0_1_0_0_2_2 + 0.000487012987013004*G0_1_0_0_2_3 + 0.00487012987013003*G0_1_0_0_2_4 - 0.000487012987013003*G0_1_0_0_2_5 - 0.00165584415584421*G0_1_0_0_3_0 - 0.00165584415584421*G0_1_0_0_3_1 + 0.000487012987013004*G0_1_0_0_3_2 + 0.000974025974026006*G0_1_0_0_3_3 + 0.00720779220779243*G0_1_0_0_3_4 + 0.00428571428571442*G0_1_0_0_3_5 - 0.00681818181818203*G0_1_0_0_4_0 - 0.00194805194805201*G0_1_0_0_4_1 + 0.00487012987013003*G0_1_0_0_4_2 + 0.00720779220779243*G0_1_0_0_4_3 - 0.00175324675324687*G0_1_0_0_4_4 + 0.00487012987013003*G0_1_0_0_4_5 + 0.00267857142857155*G0_1_0_0_5_0 - 0.00224025974025982*G0_1_0_0_5_1 - 0.000487012987013003*G0_1_0_0_5_2 + 0.00428571428571442*G0_1_0_0_5_3 + 0.00487012987013003*G0_1_0_0_5_4 + 0.00857142857142888*G0_1_0_0_5_5 - 0.000231331168831181*G0_1_0_1_0_0 + 0.000572240259740274*G0_1_0_1_0_1 - 0.00012175324675325*G0_1_0_1_0_2 - 0.00165584415584421*G0_1_0_1_0_3 - 0.00194805194805201*G0_1_0_1_0_4 - 0.00224025974025982*G0_1_0_1_0_5 + 0.000572240259740274*G0_1_0_1_1_0 - 0.000255681818181765*G0_1_0_1_1_1 - 0.000681818181818186*G0_1_0_1_1_3 - 0.00487012987013003*G0_1_0_1_1_4 - 0.00199675324675329*G0_1_0_1_1_5 - 0.00012175324675325*G0_1_0_1_2_0 + 0.00547889610389629*G0_1_0_1_2_2 - 0.000974025974026013*G0_1_0_1_2_3 - 0.00243506493506502*G0_1_0_1_2_4 - 0.00194805194805201*G0_1_0_1_2_5 - 0.00165584415584421*G0_1_0_1_3_0 - 0.000681818181818186*G0_1_0_1_3_1 - 0.000974025974026013*G0_1_0_1_3_2 + 0.00876623376623407*G0_1_0_1_3_3 + 0.0130519480519485*G0_1_0_1_3_4 + 0.00720779220779245*G0_1_0_1_3_5 - 0.00194805194805201*G0_1_0_1_4_0 - 0.00487012987013003*G0_1_0_1_4_1 - 0.00243506493506502*G0_1_0_1_4_2 + 0.0130519480519485*G0_1_0_1_4_3 + 0.0372077922077934*G0_1_0_1_4_4 + 0.0136363636363641*G0_1_0_1_4_5 - 0.00224025974025982*G0_1_0_1_5_0 - 0.00199675324675329*G0_1_0_1_5_1 - 0.00194805194805201*G0_1_0_1_5_2 + 0.00720779220779245*G0_1_0_1_5_3 + 0.0136363636363641*G0_1_0_1_5_4 + 0.00623376623376645*G0_1_0_1_5_5 - 0.00012175324675325*G0_1_0_2_0_1 + 0.00328733766233777*G0_1_0_2_0_2 + 0.000487012987013004*G0_1_0_2_0_3 + 0.00487012987013003*G0_1_0_2_0_4 - 0.000487012987013003*G0_1_0_2_0_5 - 0.00012175324675325*G0_1_0_2_1_0 + 0.00547889610389629*G0_1_0_2_1_2 - 0.000974025974026012*G0_1_0_2_1_3 - 0.00243506493506502*G0_1_0_2_1_4 - 0.00194805194805201*G0_1_0_2_1_5 + 0.00328733766233777*G0_1_0_2_2_0 + 0.00547889610389629*G0_1_0_2_2_1 - 0.0854707792207822*G0_1_0_2_2_2 - 0.0204545454545462*G0_1_0_2_2_3 - 0.0204545454545462*G0_1_0_2_2_4 - 0.00292207792207803*G0_1_0_2_2_5 + 0.000487012987013004*G0_1_0_2_3_0 - 0.000974025974026012*G0_1_0_2_3_1 - 0.0204545454545462*G0_1_0_2_3_2 - 0.00389610389610403*G0_1_0_2_3_3 + 0.00389610389610401*G0_1_0_2_3_4 + 0.00487012987013003*G0_1_0_2_3_5 + 0.00487012987013003*G0_1_0_2_4_0 - 0.00243506493506502*G0_1_0_2_4_1 - 0.0204545454545462*G0_1_0_2_4_2 + 0.00389610389610402*G0_1_0_2_4_3 + 0.0194805194805201*G0_1_0_2_4_4 + 0.0107142857142861*G0_1_0_2_4_5 - 0.000487012987013003*G0_1_0_2_5_0 - 0.00194805194805201*G0_1_0_2_5_1 - 0.00292207792207803*G0_1_0_2_5_2 + 0.00487012987013003*G0_1_0_2_5_3 + 0.0107142857142861*G0_1_0_2_5_4 + 0.00584415584415603*G0_1_0_2_5_5 - 0.00165584415584421*G0_1_0_3_0_0 - 0.00165584415584421*G0_1_0_3_0_1 + 0.000487012987013004*G0_1_0_3_0_2 + 0.000974025974026006*G0_1_0_3_0_3 + 0.00720779220779243*G0_1_0_3_0_4 + 0.00428571428571442*G0_1_0_3_0_5 - 0.00165584415584421*G0_1_0_3_1_0 - 0.000681818181818186*G0_1_0_3_1_1 - 0.000974025974026013*G0_1_0_3_1_2 + 0.00876623376623407*G0_1_0_3_1_3 + 0.0130519480519485*G0_1_0_3_1_4 + 0.00720779220779245*G0_1_0_3_1_5 + 0.000487012987013004*G0_1_0_3_2_0 - 0.000974025974026013*G0_1_0_3_2_1 - 0.0204545454545462*G0_1_0_3_2_2 - 0.00389610389610403*G0_1_0_3_2_3 + 0.00389610389610402*G0_1_0_3_2_4 + 0.00487012987013003*G0_1_0_3_2_5 + 0.000974025974026006*G0_1_0_3_3_0 + 0.00876623376623407*G0_1_0_3_3_1 - 0.00389610389610403*G0_1_0_3_3_2 + 0.0981818181818218*G0_1_0_3_3_3 - 0.0280519480519489*G0_1_0_3_3_4 - 0.011688311688312*G0_1_0_3_3_5 + 0.00720779220779243*G0_1_0_3_4_0 + 0.0130519480519485*G0_1_0_3_4_1 + 0.00389610389610402*G0_1_0_3_4_2 - 0.0280519480519489*G0_1_0_3_4_3 - 0.0888311688311717*G0_1_0_3_4_4 - 0.035844155844157*G0_1_0_3_4_5 + 0.00428571428571442*G0_1_0_3_5_0 + 0.00720779220779246*G0_1_0_3_5_1 + 0.00487012987013002*G0_1_0_3_5_2 - 0.011688311688312*G0_1_0_3_5_3 - 0.035844155844157*G0_1_0_3_5_4 - 0.0202597402597409*G0_1_0_3_5_5 - 0.00681818181818203*G0_1_0_4_0_0 - 0.00194805194805201*G0_1_0_4_0_1 + 0.00487012987013003*G0_1_0_4_0_2 + 0.00720779220779243*G0_1_0_4_0_3 - 0.00175324675324687*G0_1_0_4_0_4 + 0.00487012987013003*G0_1_0_4_0_5 - 0.00194805194805201*G0_1_0_4_1_0 - 0.00487012987013003*G0_1_0_4_1_1 - 0.00243506493506502*G0_1_0_4_1_2 + 0.0130519480519485*G0_1_0_4_1_3 + 0.0372077922077934*G0_1_0_4_1_4 + 0.0136363636363641*G0_1_0_4_1_5 + 0.00487012987013003*G0_1_0_4_2_0 - 0.00243506493506502*G0_1_0_4_2_1 - 0.0204545454545462*G0_1_0_4_2_2 + 0.00389610389610402*G0_1_0_4_2_3 + 0.0194805194805201*G0_1_0_4_2_4 + 0.0107142857142861*G0_1_0_4_2_5 + 0.00720779220779243*G0_1_0_4_3_0 + 0.0130519480519485*G0_1_0_4_3_1 + 0.00389610389610402*G0_1_0_4_3_2 - 0.0280519480519489*G0_1_0_4_3_3 - 0.0888311688311717*G0_1_0_4_3_4 - 0.035844155844157*G0_1_0_4_3_5 - 0.00175324675324687*G0_1_0_4_4_0 + 0.0372077922077934*G0_1_0_4_4_1 + 0.0194805194805201*G0_1_0_4_4_2 - 0.0888311688311717*G0_1_0_4_4_3 - 0.448831168831183*G0_1_0_4_4_4 - 0.095844155844159*G0_1_0_4_4_5 + 0.00487012987013003*G0_1_0_4_5_0 + 0.0136363636363641*G0_1_0_4_5_1 + 0.0107142857142861*G0_1_0_4_5_2 - 0.035844155844157*G0_1_0_4_5_3 - 0.095844155844159*G0_1_0_4_5_4 - 0.0389610389610403*G0_1_0_4_5_5 + 0.00267857142857155*G0_1_0_5_0_0 - 0.00224025974025982*G0_1_0_5_0_1 - 0.000487012987013003*G0_1_0_5_0_2 + 0.00428571428571442*G0_1_0_5_0_3 + 0.00487012987013003*G0_1_0_5_0_4 + 0.00857142857142888*G0_1_0_5_0_5 - 0.00224025974025982*G0_1_0_5_1_0 - 0.00199675324675329*G0_1_0_5_1_1 - 0.00194805194805201*G0_1_0_5_1_2 + 0.00720779220779245*G0_1_0_5_1_3 + 0.0136363636363641*G0_1_0_5_1_4 + 0.00623376623376645*G0_1_0_5_1_5 - 0.000487012987013003*G0_1_0_5_2_0 - 0.00194805194805201*G0_1_0_5_2_1 - 0.00292207792207803*G0_1_0_5_2_2 + 0.00487012987013003*G0_1_0_5_2_3 + 0.0107142857142861*G0_1_0_5_2_4 + 0.00584415584415603*G0_1_0_5_2_5 + 0.00428571428571442*G0_1_0_5_3_0 + 0.00720779220779246*G0_1_0_5_3_1 + 0.00487012987013003*G0_1_0_5_3_2 - 0.011688311688312*G0_1_0_5_3_3 - 0.035844155844157*G0_1_0_5_3_4 - 0.0202597402597409*G0_1_0_5_3_5 + 0.00487012987013003*G0_1_0_5_4_0 + 0.0136363636363641*G0_1_0_5_4_1 + 0.0107142857142861*G0_1_0_5_4_2 - 0.035844155844157*G0_1_0_5_4_3 - 0.095844155844159*G0_1_0_5_4_4 - 0.0389610389610403*G0_1_0_5_4_5 + 0.00857142857142888*G0_1_0_5_5_0 + 0.00623376623376645*G0_1_0_5_5_1 + 0.00584415584415603*G0_1_0_5_5_2 - 0.0202597402597409*G0_1_0_5_5_3 - 0.0389610389610403*G0_1_0_5_5_4 - 0.109760551948056*G0_1_1_0_0_0 + 0.00976461038961073*G0_1_1_0_0_1 + 0.00451704545454562*G0_1_1_0_0_2 - 0.00375000000000011*G0_1_1_0_0_3 - 0.0224025974025982*G0_1_1_0_0_4 - 0.0431006493506509*G0_1_1_0_0_5 + 0.00976461038961073*G0_1_1_0_1_0 - 0.00152191558441564*G0_1_1_0_1_1 - 0.000560064935064955*G0_1_1_0_1_2 - 0.00175324675324681*G0_1_1_0_1_3 - 0.000925324675324697*G0_1_1_0_1_4 + 0.00584415584415606*G0_1_1_0_1_5 + 0.00451704545454562*G0_1_1_0_2_0 - 0.000560064935064955*G0_1_1_0_2_1 + 0.00304383116883127*G0_1_1_0_2_2 + 0.000243506493506502*G0_1_1_0_2_3 + 0.00340909090909103*G0_1_1_0_2_4 + 0.00180194805194812*G0_1_1_0_2_5 - 0.00375000000000011*G0_1_1_0_3_0 - 0.00175324675324681*G0_1_1_0_3_1 + 0.000243506493506502*G0_1_1_0_3_2 + 0.00487012987013002*G0_1_1_0_3_3 + 0.00935064935064964*G0_1_1_0_3_4 + 0.00389610389610401*G0_1_1_0_3_5 - 0.0224025974025982*G0_1_1_0_4_0 - 0.000925324675324697*G0_1_1_0_4_1 + 0.00340909090909103*G0_1_1_0_4_2 + 0.00935064935064964*G0_1_1_0_4_3 + 0.010714285714286*G0_1_1_0_4_4 - 0.00175324675324684*G0_1_1_0_4_5 - 0.0431006493506509*G0_1_1_0_5_0 + 0.00584415584415606*G0_1_1_0_5_1 + 0.00180194805194812*G0_1_1_0_5_2 + 0.00389610389610401*G0_1_1_0_5_3 - 0.00175324675324684*G0_1_1_0_5_4 - 0.0374025974025988*G0_1_1_0_5_5 + 0.00976461038961073*G0_1_1_1_0_0 - 0.00152191558441564*G0_1_1_1_0_1 - 0.000560064935064955*G0_1_1_1_0_2 - 0.00175324675324681*G0_1_1_1_0_3 - 0.000925324675324696*G0_1_1_1_0_4 + 0.00584415584415606*G0_1_1_1_0_5 - 0.00152191558441564*G0_1_1_1_1_0 + 0.00372564935064949*G0_1_1_1_1_1 - 0.000206980519480527*G0_1_1_1_1_2 - 0.000438311688311691*G0_1_1_1_1_3 - 0.00438311688311703*G0_1_1_1_1_4 - 0.00199675324675331*G0_1_1_1_1_5 - 0.000560064935064955*G0_1_1_1_2_0 - 0.000206980519480528*G0_1_1_1_2_1 + 0.00511363636363653*G0_1_1_1_2_2 - 0.000487012987013006*G0_1_1_1_2_3 - 0.00121753246753251*G0_1_1_1_2_4 - 0.00224025974025982*G0_1_1_1_2_5 - 0.00175324675324681*G0_1_1_1_3_0 - 0.000438311688311691*G0_1_1_1_3_1 - 0.000487012987013006*G0_1_1_1_3_2 + 0.00974025974026006*G0_1_1_1_3_3 + 0.0122727272727277*G0_1_1_1_3_4 + 0.00798701298701325*G0_1_1_1_3_5 - 0.000925324675324697*G0_1_1_1_4_0 - 0.00438311688311703*G0_1_1_1_4_1 - 0.00121753246753251*G0_1_1_1_4_2 + 0.0122727272727277*G0_1_1_1_4_3 + 0.0292207792207802*G0_1_1_1_4_4 + 0.0132467532467537*G0_1_1_1_4_5 + 0.00584415584415606*G0_1_1_1_5_0 - 0.00199675324675331*G0_1_1_1_5_1 - 0.00224025974025982*G0_1_1_1_5_2 + 0.00798701298701325*G0_1_1_1_5_3 + 0.0132467532467537*G0_1_1_1_5_4 + 0.0237662337662346*G0_1_1_1_5_5 + 0.00451704545454562*G0_1_1_2_0_0 - 0.000560064935064955*G0_1_1_2_0_1 + 0.00304383116883127*G0_1_1_2_0_2 + 0.000243506493506502*G0_1_1_2_0_3 + 0.00340909090909103*G0_1_1_2_0_4 + 0.00180194805194812*G0_1_1_2_0_5 - 0.000560064935064955*G0_1_1_2_1_0 - 0.000206980519480528*G0_1_1_2_1_1 + 0.00511363636363653*G0_1_1_2_1_2 - 0.000487012987013006*G0_1_1_2_1_3 - 0.00121753246753251*G0_1_1_2_1_4 - 0.00224025974025982*G0_1_1_2_1_5 + 0.00304383116883127*G0_1_1_2_2_0 + 0.00511363636363653*G0_1_1_2_2_1 - 0.0814529220779249*G0_1_1_2_2_2 - 0.0197240259740266*G0_1_1_2_2_3 - 0.0168019480519486*G0_1_1_2_2_4 - 0.00267857142857153*G0_1_1_2_2_5 + 0.000243506493506502*G0_1_1_2_3_0 - 0.000487012987013006*G0_1_1_2_3_1 - 0.0197240259740266*G0_1_1_2_3_2 - 0.00292207792207803*G0_1_1_2_3_3 + 0.001948051948052*G0_1_1_2_3_4 + 0.00487012987013003*G0_1_1_2_3_5 + 0.00340909090909103*G0_1_1_2_4_0 - 0.00121753246753251*G0_1_1_2_4_1 - 0.0168019480519486*G0_1_1_2_4_2 + 0.001948051948052*G0_1_1_2_4_3 + 0.00487012987013001*G0_1_1_2_4_4 + 0.00779220779220805*G0_1_1_2_4_5 + 0.00180194805194812*G0_1_1_2_5_0 - 0.00224025974025982*G0_1_1_2_5_1 - 0.00267857142857153*G0_1_1_2_5_2 + 0.00487012987013002*G0_1_1_2_5_3 + 0.00779220779220805*G0_1_1_2_5_4 + 0.00974025974026008*G0_1_1_2_5_5 - 0.00375000000000011*G0_1_1_3_0_0 - 0.00175324675324681*G0_1_1_3_0_1 + 0.000243506493506502*G0_1_1_3_0_2 + 0.00487012987013002*G0_1_1_3_0_3 + 0.00935064935064964*G0_1_1_3_0_4 + 0.00389610389610401*G0_1_1_3_0_5 - 0.00175324675324681*G0_1_1_3_1_0 - 0.00043831168831169*G0_1_1_3_1_1 - 0.000487012987013006*G0_1_1_3_1_2 + 0.00974025974026006*G0_1_1_3_1_3 + 0.0122727272727277*G0_1_1_3_1_4 + 0.00798701298701325*G0_1_1_3_1_5 + 0.000243506493506502*G0_1_1_3_2_0 - 0.000487012987013006*G0_1_1_3_2_1 - 0.0197240259740266*G0_1_1_3_2_2 - 0.00292207792207802*G0_1_1_3_2_3 + 0.001948051948052*G0_1_1_3_2_4 + 0.00487012987013003*G0_1_1_3_2_5 + 0.00487012987013002*G0_1_1_3_3_0 + 0.00974025974026006*G0_1_1_3_3_1 - 0.00292207792207802*G0_1_1_3_3_2 + 0.0677922077922104*G0_1_1_3_3_3 - 0.0342857142857153*G0_1_1_3_3_4 - 0.0194805194805201*G0_1_1_3_3_5 + 0.00935064935064964*G0_1_1_3_4_0 + 0.0122727272727277*G0_1_1_3_4_1 + 0.001948051948052*G0_1_1_3_4_2 - 0.0342857142857153*G0_1_1_3_4_3 - 0.0771428571428596*G0_1_1_3_4_4 - 0.0342857142857154*G0_1_1_3_4_5 + 0.00389610389610401*G0_1_1_3_5_0 + 0.00798701298701325*G0_1_1_3_5_1 + 0.00487012987013002*G0_1_1_3_5_2 - 0.0194805194805201*G0_1_1_3_5_3 - 0.0342857142857154*G0_1_1_3_5_4 - 0.0272727272727282*G0_1_1_3_5_5 - 0.0224025974025982*G0_1_1_4_0_0 - 0.000925324675324697*G0_1_1_4_0_1 + 0.00340909090909103*G0_1_1_4_0_2 + 0.00935064935064964*G0_1_1_4_0_3 + 0.010714285714286*G0_1_1_4_0_4 - 0.00175324675324684*G0_1_1_4_0_5 - 0.000925324675324697*G0_1_1_4_1_0 - 0.00438311688311703*G0_1_1_4_1_1 - 0.00121753246753251*G0_1_1_4_1_2 + 0.0122727272727277*G0_1_1_4_1_3 + 0.0292207792207802*G0_1_1_4_1_4 + 0.0132467532467537*G0_1_1_4_1_5 + 0.00340909090909103*G0_1_1_4_2_0 - 0.00121753246753251*G0_1_1_4_2_1 - 0.0168019480519486*G0_1_1_4_2_2 + 0.001948051948052*G0_1_1_4_2_3 + 0.00487012987013001*G0_1_1_4_2_4 + 0.00779220779220805*G0_1_1_4_2_5 + 0.00935064935064964*G0_1_1_4_3_0 + 0.0122727272727277*G0_1_1_4_3_1 + 0.001948051948052*G0_1_1_4_3_2 - 0.0342857142857153*G0_1_1_4_3_3 - 0.0771428571428596*G0_1_1_4_3_4 - 0.0342857142857154*G0_1_1_4_3_5 + 0.010714285714286*G0_1_1_4_4_0 + 0.0292207792207802*G0_1_1_4_4_1 + 0.00487012987013002*G0_1_1_4_4_2 - 0.0771428571428596*G0_1_1_4_4_3 - 0.317922077922088*G0_1_1_4_4_4 - 0.0740259740259765*G0_1_1_4_4_5 - 0.00175324675324684*G0_1_1_4_5_0 + 0.0132467532467537*G0_1_1_4_5_1 + 0.00779220779220805*G0_1_1_4_5_2 - 0.0342857142857154*G0_1_1_4_5_3 - 0.0740259740259765*G0_1_1_4_5_4 - 0.0459740259740275*G0_1_1_4_5_5 - 0.0431006493506509*G0_1_1_5_0_0 + 0.00584415584415606*G0_1_1_5_0_1 + 0.00180194805194812*G0_1_1_5_0_2 + 0.00389610389610401*G0_1_1_5_0_3 - 0.00175324675324684*G0_1_1_5_0_4 - 0.0374025974025988*G0_1_1_5_0_5 + 0.00584415584415606*G0_1_1_5_1_0 - 0.00199675324675331*G0_1_1_5_1_1 - 0.00224025974025982*G0_1_1_5_1_2 + 0.00798701298701325*G0_1_1_5_1_3 + 0.0132467532467537*G0_1_1_5_1_4 + 0.0237662337662346*G0_1_1_5_1_5 + 0.00180194805194812*G0_1_1_5_2_0 - 0.00224025974025982*G0_1_1_5_2_1 - 0.00267857142857153*G0_1_1_5_2_2 + 0.00487012987013002*G0_1_1_5_2_3 + 0.00779220779220805*G0_1_1_5_2_4 + 0.00974025974026008*G0_1_1_5_2_5 + 0.00389610389610401*G0_1_1_5_3_0 + 0.00798701298701325*G0_1_1_5_3_1 + 0.00487012987013003*G0_1_1_5_3_2 - 0.0194805194805201*G0_1_1_5_3_3 - 0.0342857142857154*G0_1_1_5_3_4 - 0.0272727272727282*G0_1_1_5_3_5 - 0.00175324675324684*G0_1_1_5_4_0 + 0.0132467532467537*G0_1_1_5_4_1 + 0.00779220779220805*G0_1_1_5_4_2 - 0.0342857142857154*G0_1_1_5_4_3 - 0.0740259740259765*G0_1_1_5_4_4 - 0.0459740259740275*G0_1_1_5_4_5 - 0.0374025974025988*G0_1_1_5_5_0 + 0.0237662337662346*G0_1_1_5_5_1 + 0.00974025974026008*G0_1_1_5_5_2 - 0.0272727272727282*G0_1_1_5_5_3 - 0.0459740259740275*G0_1_1_5_5_4 - 0.128571428571433*G0_1_1_5_5_5; + A[6] = -A[4] + 0.0668019480519504*G0_0_1_0_0_0 - 0.00531114718614737*G0_0_1_0_0_1 - 0.00252435064935074*G0_0_1_0_0_2 + 0.00134199134199138*G0_0_1_0_0_3 + 0.010119047619048*G0_0_1_0_0_4 + 0.0233225108225117*G0_0_1_0_0_5 - 0.00531114718614737*G0_0_1_0_1_0 + 0.000533008658008677*G0_0_1_0_1_1 + 0.000201569264069272*G0_0_1_0_1_2 + 0.000508658008658024*G0_0_1_0_1_3 - 0.00305194805194816*G0_0_1_0_1_5 - 0.00252435064935074*G0_0_1_0_2_0 + 0.000201569264069272*G0_0_1_0_2_1 - 0.000703463203463227*G0_0_1_0_2_2 - 0.000974025974026011*G0_0_1_0_2_5 + 0.00134199134199138*G0_0_1_0_3_0 + 0.000508658008658024*G0_0_1_0_3_1 - 0.000735930735930764*G0_0_1_0_3_3 - 0.00272727272727281*G0_0_1_0_3_4 - 0.000735930735930759*G0_0_1_0_3_5 + 0.010119047619048*G0_0_1_0_4_0 - 0.00272727272727281*G0_0_1_0_4_3 - 0.00753246753246776*G0_0_1_0_4_4 + 0.00190476190476198*G0_0_1_0_4_5 + 0.0233225108225117*G0_0_1_0_5_0 - 0.00305194805194816*G0_0_1_0_5_1 - 0.000974025974026011*G0_0_1_0_5_2 - 0.000735930735930759*G0_0_1_0_5_3 + 0.00190476190476198*G0_0_1_0_5_4 + 0.0206060606060614*G0_0_1_0_5_5 - 0.00531114718614737*G0_0_1_1_0_0 + 0.000533008658008677*G0_0_1_1_0_1 + 0.000201569264069272*G0_0_1_1_0_2 + 0.000508658008658024*G0_0_1_1_0_3 - 0.00305194805194816*G0_0_1_1_0_5 + 0.000533008658008677*G0_0_1_1_1_0 + 0.0074837662337665*G0_0_1_1_1_1 - 0.000162337662337668*G0_0_1_1_1_2 + 0.00067099567099569*G0_0_1_1_1_3 + 0.000854978354978382*G0_0_1_1_1_4 + 0.00160173160173167*G0_0_1_1_1_5 + 0.000201569264069272*G0_0_1_1_2_0 - 0.000162337662337668*G0_0_1_1_2_1 - 0.00119047619047623*G0_0_1_1_2_2 + 0.000487012987013005*G0_0_1_1_2_3 + 0.000681818181818205*G0_0_1_1_2_5 + 0.000508658008658024*G0_0_1_1_3_0 + 0.00067099567099569*G0_0_1_1_3_1 + 0.000487012987013005*G0_0_1_1_3_2 - 0.00441558441558457*G0_0_1_1_3_3 - 0.00272727272727282*G0_0_1_1_3_4 - 0.00238095238095246*G0_0_1_1_3_5 + 0.000854978354978382*G0_0_1_1_4_1 - 0.00272727272727282*G0_0_1_1_4_3 - 0.00385281385281398*G0_0_1_1_4_4 - 0.00307359307359318*G0_0_1_1_4_5 - 0.00305194805194816*G0_0_1_1_5_0 + 0.00160173160173167*G0_0_1_1_5_1 + 0.000681818181818205*G0_0_1_1_5_2 - 0.00238095238095246*G0_0_1_1_5_3 - 0.00307359307359318*G0_0_1_1_5_4 - 0.0105627705627709*G0_0_1_1_5_5 - 0.00252435064935074*G0_0_1_2_0_0 + 0.000201569264069272*G0_0_1_2_0_1 - 0.000703463203463227*G0_0_1_2_0_2 - 0.000974025974026011*G0_0_1_2_0_5 + 0.000201569264069272*G0_0_1_2_1_0 - 0.000162337662337668*G0_0_1_2_1_1 - 0.00119047619047623*G0_0_1_2_1_2 + 0.000487012987013005*G0_0_1_2_1_3 + 0.000681818181818205*G0_0_1_2_1_5 - 0.000703463203463227*G0_0_1_2_2_0 - 0.00119047619047623*G0_0_1_2_2_1 + 0.0183441558441565*G0_0_1_2_2_2 + 0.0043019480519482*G0_0_1_2_2_3 + 0.0028409090909092*G0_0_1_2_2_4 + 0.000514069264069285*G0_0_1_2_2_5 + 0.000487012987013005*G0_0_1_2_3_1 + 0.0043019480519482*G0_0_1_2_3_2 + 0.00173160173160179*G0_0_1_2_3_3 - 0.000108225108225109*G0_0_1_2_3_4 - 0.00108225108225112*G0_0_1_2_3_5 + 0.0028409090909092*G0_0_1_2_4_2 - 0.000108225108225109*G0_0_1_2_4_3 + 0.0036796536796538*G0_0_1_2_4_4 - 0.00108225108225112*G0_0_1_2_4_5 - 0.000974025974026011*G0_0_1_2_5_0 + 0.000681818181818205*G0_0_1_2_5_1 + 0.000514069264069285*G0_0_1_2_5_2 - 0.00108225108225112*G0_0_1_2_5_3 - 0.00108225108225112*G0_0_1_2_5_4 - 0.00216450216450224*G0_0_1_2_5_5 + 0.00134199134199138*G0_0_1_3_0_0 + 0.000508658008658024*G0_0_1_3_0_1 - 0.000735930735930764*G0_0_1_3_0_3 - 0.00272727272727281*G0_0_1_3_0_4 - 0.000735930735930759*G0_0_1_3_0_5 + 0.000508658008658024*G0_0_1_3_1_0 + 0.00067099567099569*G0_0_1_3_1_1 + 0.000487012987013005*G0_0_1_3_1_2 - 0.00441558441558457*G0_0_1_3_1_3 - 0.00272727272727282*G0_0_1_3_1_4 - 0.00238095238095246*G0_0_1_3_1_5 + 0.000487012987013005*G0_0_1_3_2_1 + 0.0043019480519482*G0_0_1_3_2_2 + 0.00173160173160179*G0_0_1_3_2_3 - 0.000108225108225109*G0_0_1_3_2_4 - 0.00108225108225112*G0_0_1_3_2_5 - 0.000735930735930764*G0_0_1_3_3_0 - 0.00441558441558457*G0_0_1_3_3_1 + 0.00173160173160179*G0_0_1_3_3_2 - 0.0400000000000014*G0_0_1_3_3_3 + 0.00692640692640714*G0_0_1_3_3_4 + 0.00363636363636374*G0_0_1_3_3_5 - 0.00272727272727281*G0_0_1_3_4_0 - 0.00272727272727282*G0_0_1_3_4_1 - 0.000108225108225109*G0_0_1_3_4_2 + 0.00692640692640714*G0_0_1_3_4_3 + 0.0131601731601736*G0_0_1_3_4_4 + 0.00761904761904787*G0_0_1_3_4_5 - 0.000735930735930759*G0_0_1_3_5_0 - 0.00238095238095246*G0_0_1_3_5_1 - 0.00108225108225112*G0_0_1_3_5_2 + 0.00363636363636374*G0_0_1_3_5_3 + 0.00761904761904787*G0_0_1_3_5_4 + 0.00580086580086599*G0_0_1_3_5_5 + 0.010119047619048*G0_0_1_4_0_0 - 0.00272727272727281*G0_0_1_4_0_3 - 0.00753246753246776*G0_0_1_4_0_4 + 0.00190476190476198*G0_0_1_4_0_5 + 0.000854978354978382*G0_0_1_4_1_1 - 0.00272727272727282*G0_0_1_4_1_3 - 0.00385281385281398*G0_0_1_4_1_4 - 0.00307359307359318*G0_0_1_4_1_5 + 0.0028409090909092*G0_0_1_4_2_2 - 0.000108225108225109*G0_0_1_4_2_3 + 0.0036796536796538*G0_0_1_4_2_4 - 0.00108225108225112*G0_0_1_4_2_5 - 0.00272727272727281*G0_0_1_4_3_0 - 0.00272727272727282*G0_0_1_4_3_1 - 0.000108225108225109*G0_0_1_4_3_2 + 0.00692640692640714*G0_0_1_4_3_3 + 0.0131601731601736*G0_0_1_4_3_4 + 0.00761904761904787*G0_0_1_4_3_5 - 0.00753246753246776*G0_0_1_4_4_0 - 0.00385281385281398*G0_0_1_4_4_1 + 0.0036796536796538*G0_0_1_4_4_2 + 0.0131601731601736*G0_0_1_4_4_3 + 0.0161038961038966*G0_0_1_4_4_4 + 0.0098701298701302*G0_0_1_4_4_5 + 0.00190476190476198*G0_0_1_4_5_0 - 0.00307359307359318*G0_0_1_4_5_1 - 0.00108225108225112*G0_0_1_4_5_2 + 0.00761904761904787*G0_0_1_4_5_3 + 0.0098701298701302*G0_0_1_4_5_4 + 0.0104761904761908*G0_0_1_4_5_5 + 0.0233225108225117*G0_0_1_5_0_0 - 0.00305194805194816*G0_0_1_5_0_1 - 0.000974025974026011*G0_0_1_5_0_2 - 0.000735930735930759*G0_0_1_5_0_3 + 0.00190476190476198*G0_0_1_5_0_4 + 0.0206060606060614*G0_0_1_5_0_5 - 0.00305194805194816*G0_0_1_5_1_0 + 0.00160173160173167*G0_0_1_5_1_1 + 0.000681818181818205*G0_0_1_5_1_2 - 0.00238095238095246*G0_0_1_5_1_3 - 0.00307359307359318*G0_0_1_5_1_4 - 0.0105627705627709*G0_0_1_5_1_5 - 0.000974025974026011*G0_0_1_5_2_0 + 0.000681818181818205*G0_0_1_5_2_1 + 0.000514069264069285*G0_0_1_5_2_2 - 0.00108225108225112*G0_0_1_5_2_3 - 0.00108225108225112*G0_0_1_5_2_4 - 0.00216450216450224*G0_0_1_5_2_5 - 0.000735930735930759*G0_0_1_5_3_0 - 0.00238095238095246*G0_0_1_5_3_1 - 0.00108225108225112*G0_0_1_5_3_2 + 0.00363636363636374*G0_0_1_5_3_3 + 0.00761904761904787*G0_0_1_5_3_4 + 0.00580086580086599*G0_0_1_5_3_5 + 0.00190476190476198*G0_0_1_5_4_0 - 0.00307359307359318*G0_0_1_5_4_1 - 0.00108225108225112*G0_0_1_5_4_2 + 0.00761904761904787*G0_0_1_5_4_3 + 0.0098701298701302*G0_0_1_5_4_4 + 0.0104761904761908*G0_0_1_5_4_5 + 0.0206060606060614*G0_0_1_5_5_0 - 0.0105627705627709*G0_0_1_5_5_1 - 0.00216450216450224*G0_0_1_5_5_2 + 0.00580086580086599*G0_0_1_5_5_3 + 0.0104761904761908*G0_0_1_5_5_4 + 0.0215584415584423*G0_0_1_5_5_5 + 0.0668019480519504*G0_1_1_0_0_0 - 0.00531114718614737*G0_1_1_0_0_1 - 0.00252435064935074*G0_1_1_0_0_2 + 0.00134199134199138*G0_1_1_0_0_3 + 0.010119047619048*G0_1_1_0_0_4 + 0.0233225108225117*G0_1_1_0_0_5 - 0.00531114718614737*G0_1_1_0_1_0 + 0.000533008658008677*G0_1_1_0_1_1 + 0.000201569264069272*G0_1_1_0_1_2 + 0.000508658008658024*G0_1_1_0_1_3 - 0.00305194805194817*G0_1_1_0_1_5 - 0.00252435064935074*G0_1_1_0_2_0 + 0.000201569264069272*G0_1_1_0_2_1 - 0.000703463203463227*G0_1_1_0_2_2 - 0.000974025974026011*G0_1_1_0_2_5 + 0.00134199134199138*G0_1_1_0_3_0 + 0.000508658008658024*G0_1_1_0_3_1 - 0.000735930735930762*G0_1_1_0_3_3 - 0.00272727272727281*G0_1_1_0_3_4 - 0.000735930735930759*G0_1_1_0_3_5 + 0.010119047619048*G0_1_1_0_4_0 - 0.00272727272727281*G0_1_1_0_4_3 - 0.00753246753246776*G0_1_1_0_4_4 + 0.00190476190476198*G0_1_1_0_4_5 + 0.0233225108225117*G0_1_1_0_5_0 - 0.00305194805194817*G0_1_1_0_5_1 - 0.000974025974026011*G0_1_1_0_5_2 - 0.000735930735930759*G0_1_1_0_5_3 + 0.00190476190476198*G0_1_1_0_5_4 + 0.0206060606060614*G0_1_1_0_5_5 - 0.00531114718614737*G0_1_1_1_0_0 + 0.000533008658008677*G0_1_1_1_0_1 + 0.000201569264069272*G0_1_1_1_0_2 + 0.000508658008658024*G0_1_1_1_0_3 - 0.00305194805194817*G0_1_1_1_0_5 + 0.000533008658008677*G0_1_1_1_1_0 + 0.00748376623376649*G0_1_1_1_1_1 - 0.000162337662337667*G0_1_1_1_1_2 + 0.000670995670995688*G0_1_1_1_1_3 + 0.000854978354978383*G0_1_1_1_1_4 + 0.00160173160173167*G0_1_1_1_1_5 + 0.000201569264069272*G0_1_1_1_2_0 - 0.000162337662337667*G0_1_1_1_2_1 - 0.00119047619047623*G0_1_1_1_2_2 + 0.000487012987013005*G0_1_1_1_2_3 + 0.000681818181818205*G0_1_1_1_2_5 + 0.000508658008658024*G0_1_1_1_3_0 + 0.000670995670995689*G0_1_1_1_3_1 + 0.000487012987013005*G0_1_1_1_3_2 - 0.00441558441558457*G0_1_1_1_3_3 - 0.00272727272727282*G0_1_1_1_3_4 - 0.00238095238095246*G0_1_1_1_3_5 + 0.000854978354978383*G0_1_1_1_4_1 - 0.00272727272727282*G0_1_1_1_4_3 - 0.00385281385281398*G0_1_1_1_4_4 - 0.00307359307359318*G0_1_1_1_4_5 - 0.00305194805194817*G0_1_1_1_5_0 + 0.00160173160173167*G0_1_1_1_5_1 + 0.000681818181818205*G0_1_1_1_5_2 - 0.00238095238095246*G0_1_1_1_5_3 - 0.00307359307359318*G0_1_1_1_5_4 - 0.0105627705627709*G0_1_1_1_5_5 - 0.00252435064935074*G0_1_1_2_0_0 + 0.000201569264069272*G0_1_1_2_0_1 - 0.000703463203463227*G0_1_1_2_0_2 - 0.000974025974026011*G0_1_1_2_0_5 + 0.000201569264069272*G0_1_1_2_1_0 - 0.000162337662337667*G0_1_1_2_1_1 - 0.00119047619047623*G0_1_1_2_1_2 + 0.000487012987013005*G0_1_1_2_1_3 + 0.000681818181818205*G0_1_1_2_1_5 - 0.000703463203463227*G0_1_1_2_2_0 - 0.00119047619047623*G0_1_1_2_2_1 + 0.0183441558441565*G0_1_1_2_2_2 + 0.0043019480519482*G0_1_1_2_2_3 + 0.0028409090909092*G0_1_1_2_2_4 + 0.000514069264069285*G0_1_1_2_2_5 + 0.000487012987013005*G0_1_1_2_3_1 + 0.0043019480519482*G0_1_1_2_3_2 + 0.00173160173160179*G0_1_1_2_3_3 - 0.00010822510822511*G0_1_1_2_3_4 - 0.00108225108225112*G0_1_1_2_3_5 + 0.0028409090909092*G0_1_1_2_4_2 - 0.000108225108225109*G0_1_1_2_4_3 + 0.0036796536796538*G0_1_1_2_4_4 - 0.00108225108225112*G0_1_1_2_4_5 - 0.000974025974026011*G0_1_1_2_5_0 + 0.000681818181818205*G0_1_1_2_5_1 + 0.000514069264069285*G0_1_1_2_5_2 - 0.00108225108225112*G0_1_1_2_5_3 - 0.00108225108225112*G0_1_1_2_5_4 - 0.00216450216450224*G0_1_1_2_5_5 + 0.00134199134199138*G0_1_1_3_0_0 + 0.000508658008658024*G0_1_1_3_0_1 - 0.000735930735930762*G0_1_1_3_0_3 - 0.00272727272727281*G0_1_1_3_0_4 - 0.000735930735930759*G0_1_1_3_0_5 + 0.000508658008658024*G0_1_1_3_1_0 + 0.000670995670995689*G0_1_1_3_1_1 + 0.000487012987013005*G0_1_1_3_1_2 - 0.00441558441558457*G0_1_1_3_1_3 - 0.00272727272727282*G0_1_1_3_1_4 - 0.00238095238095246*G0_1_1_3_1_5 + 0.000487012987013005*G0_1_1_3_2_1 + 0.0043019480519482*G0_1_1_3_2_2 + 0.00173160173160179*G0_1_1_3_2_3 - 0.000108225108225109*G0_1_1_3_2_4 - 0.00108225108225112*G0_1_1_3_2_5 - 0.000735930735930762*G0_1_1_3_3_0 - 0.00441558441558457*G0_1_1_3_3_1 + 0.00173160173160179*G0_1_1_3_3_2 - 0.0400000000000015*G0_1_1_3_3_3 + 0.00692640692640714*G0_1_1_3_3_4 + 0.00363636363636374*G0_1_1_3_3_5 - 0.00272727272727281*G0_1_1_3_4_0 - 0.00272727272727282*G0_1_1_3_4_1 - 0.00010822510822511*G0_1_1_3_4_2 + 0.00692640692640714*G0_1_1_3_4_3 + 0.0131601731601736*G0_1_1_3_4_4 + 0.00761904761904787*G0_1_1_3_4_5 - 0.000735930735930759*G0_1_1_3_5_0 - 0.00238095238095246*G0_1_1_3_5_1 - 0.00108225108225112*G0_1_1_3_5_2 + 0.00363636363636374*G0_1_1_3_5_3 + 0.00761904761904787*G0_1_1_3_5_4 + 0.00580086580086599*G0_1_1_3_5_5 + 0.010119047619048*G0_1_1_4_0_0 - 0.00272727272727281*G0_1_1_4_0_3 - 0.00753246753246776*G0_1_1_4_0_4 + 0.00190476190476198*G0_1_1_4_0_5 + 0.000854978354978383*G0_1_1_4_1_1 - 0.00272727272727282*G0_1_1_4_1_3 - 0.00385281385281398*G0_1_1_4_1_4 - 0.00307359307359318*G0_1_1_4_1_5 + 0.0028409090909092*G0_1_1_4_2_2 - 0.000108225108225109*G0_1_1_4_2_3 + 0.0036796536796538*G0_1_1_4_2_4 - 0.00108225108225112*G0_1_1_4_2_5 - 0.00272727272727281*G0_1_1_4_3_0 - 0.00272727272727282*G0_1_1_4_3_1 - 0.00010822510822511*G0_1_1_4_3_2 + 0.00692640692640714*G0_1_1_4_3_3 + 0.0131601731601736*G0_1_1_4_3_4 + 0.00761904761904787*G0_1_1_4_3_5 - 0.00753246753246776*G0_1_1_4_4_0 - 0.00385281385281398*G0_1_1_4_4_1 + 0.0036796536796538*G0_1_1_4_4_2 + 0.0131601731601736*G0_1_1_4_4_3 + 0.0161038961038966*G0_1_1_4_4_4 + 0.00987012987013021*G0_1_1_4_4_5 + 0.00190476190476198*G0_1_1_4_5_0 - 0.00307359307359318*G0_1_1_4_5_1 - 0.00108225108225112*G0_1_1_4_5_2 + 0.00761904761904787*G0_1_1_4_5_3 + 0.00987012987013021*G0_1_1_4_5_4 + 0.0104761904761908*G0_1_1_4_5_5 + 0.0233225108225117*G0_1_1_5_0_0 - 0.00305194805194817*G0_1_1_5_0_1 - 0.000974025974026011*G0_1_1_5_0_2 - 0.000735930735930759*G0_1_1_5_0_3 + 0.00190476190476198*G0_1_1_5_0_4 + 0.0206060606060614*G0_1_1_5_0_5 - 0.00305194805194817*G0_1_1_5_1_0 + 0.00160173160173167*G0_1_1_5_1_1 + 0.000681818181818205*G0_1_1_5_1_2 - 0.00238095238095246*G0_1_1_5_1_3 - 0.00307359307359318*G0_1_1_5_1_4 - 0.0105627705627709*G0_1_1_5_1_5 - 0.000974025974026011*G0_1_1_5_2_0 + 0.000681818181818205*G0_1_1_5_2_1 + 0.000514069264069285*G0_1_1_5_2_2 - 0.00108225108225112*G0_1_1_5_2_3 - 0.00108225108225112*G0_1_1_5_2_4 - 0.00216450216450224*G0_1_1_5_2_5 - 0.000735930735930759*G0_1_1_5_3_0 - 0.00238095238095246*G0_1_1_5_3_1 - 0.00108225108225112*G0_1_1_5_3_2 + 0.00363636363636374*G0_1_1_5_3_3 + 0.00761904761904787*G0_1_1_5_3_4 + 0.00580086580086599*G0_1_1_5_3_5 + 0.00190476190476198*G0_1_1_5_4_0 - 0.00307359307359318*G0_1_1_5_4_1 - 0.00108225108225112*G0_1_1_5_4_2 + 0.00761904761904787*G0_1_1_5_4_3 + 0.00987012987013021*G0_1_1_5_4_4 + 0.0104761904761908*G0_1_1_5_4_5 + 0.0206060606060614*G0_1_1_5_5_0 - 0.0105627705627709*G0_1_1_5_5_1 - 0.00216450216450224*G0_1_1_5_5_2 + 0.00580086580086599*G0_1_1_5_5_3 + 0.0104761904761908*G0_1_1_5_5_4 + 0.0215584415584424*G0_1_1_5_5_5; + A[17] = -A[14] + 0.0226379870129877*G0_0_0_0_0_0 - 0.00096590909090912*G0_0_0_0_0_1 - 0.00151515151515156*G0_0_0_0_0_2 + 0.000346320346320355*G0_0_0_0_0_3 + 0.00891774891774921*G0_0_0_0_0_4 + 0.00325757575757587*G0_0_0_0_0_5 - 0.00096590909090912*G0_0_0_0_1_0 - 0.00184523809523815*G0_0_0_0_1_1 + 0.000273268398268408*G0_0_0_0_1_2 - 0.000790043290043317*G0_0_0_0_1_3 - 0.000259740259740269*G0_0_0_0_1_4 + 0.000194805194805198*G0_0_0_0_1_5 - 0.00151515151515156*G0_0_0_0_2_0 + 0.000273268398268408*G0_0_0_0_2_1 - 0.00170183982683989*G0_0_0_0_2_2 - 0.00311688311688322*G0_0_0_0_2_4 - 0.000411255411255426*G0_0_0_0_2_5 + 0.000346320346320355*G0_0_0_0_3_0 - 0.000790043290043317*G0_0_0_0_3_1 - 0.000173160173160179*G0_0_0_0_3_4 + 0.000129870129870136*G0_0_0_0_3_5 + 0.00891774891774921*G0_0_0_0_4_0 - 0.000259740259740269*G0_0_0_0_4_1 - 0.00311688311688322*G0_0_0_0_4_2 - 0.000173160173160179*G0_0_0_0_4_3 + 0.00471861471861487*G0_0_0_0_4_4 + 0.00134199134199139*G0_0_0_0_4_5 + 0.00325757575757587*G0_0_0_0_5_0 + 0.000194805194805198*G0_0_0_0_5_1 - 0.000411255411255427*G0_0_0_0_5_2 + 0.000129870129870136*G0_0_0_0_5_3 + 0.00134199134199139*G0_0_0_0_5_4 + 0.00441558441558458*G0_0_0_0_5_5 - 0.00096590909090912*G0_0_0_1_0_0 - 0.00184523809523815*G0_0_0_1_0_1 + 0.000273268398268408*G0_0_0_1_0_2 - 0.000790043290043317*G0_0_0_1_0_3 - 0.000259740259740269*G0_0_0_1_0_4 + 0.000194805194805198*G0_0_0_1_0_5 - 0.00184523809523815*G0_0_0_1_1_0 + 0.058116883116885*G0_0_0_1_1_1 - 0.00403679653679667*G0_0_0_1_1_2 + 0.0173701298701305*G0_0_0_1_1_3 + 0.000768398268398288*G0_0_0_1_1_4 + 0.00730519480519508*G0_0_0_1_1_5 + 0.000273268398268408*G0_0_0_1_2_0 - 0.00403679653679667*G0_0_0_1_2_1 - 0.000349025974025987*G0_0_0_1_2_2 - 0.00201298701298708*G0_0_0_1_2_3 + 0.000119047619047619*G0_0_0_1_2_5 - 0.000790043290043317*G0_0_0_1_3_0 + 0.0173701298701305*G0_0_0_1_3_1 - 0.00201298701298708*G0_0_0_1_3_2 + 0.0161904761904768*G0_0_0_1_3_3 + 0.00134199134199141*G0_0_0_1_3_5 - 0.000259740259740269*G0_0_0_1_4_0 + 0.000768398268398288*G0_0_0_1_4_1 - 0.00264069264069273*G0_0_0_1_4_4 - 0.00177489177489183*G0_0_0_1_4_5 + 0.000194805194805198*G0_0_0_1_5_0 + 0.00730519480519508*G0_0_0_1_5_1 + 0.000119047619047619*G0_0_0_1_5_2 + 0.00134199134199141*G0_0_0_1_5_3 - 0.00177489177489183*G0_0_0_1_5_4 - 0.00718614718614743*G0_0_0_1_5_5 - 0.00151515151515156*G0_0_0_2_0_0 + 0.000273268398268408*G0_0_0_2_0_1 - 0.00170183982683989*G0_0_0_2_0_2 - 0.00311688311688322*G0_0_0_2_0_4 - 0.000411255411255427*G0_0_0_2_0_5 + 0.000273268398268408*G0_0_0_2_1_0 - 0.00403679653679667*G0_0_0_2_1_1 - 0.000349025974025987*G0_0_0_2_1_2 - 0.00201298701298709*G0_0_0_2_1_3 + 0.000119047619047619*G0_0_0_2_1_5 - 0.00170183982683989*G0_0_0_2_2_0 - 0.000349025974025987*G0_0_0_2_2_1 + 0.024366883116884*G0_0_0_2_2_2 + 0.00345238095238109*G0_0_0_2_2_3 + 0.00985930735930772*G0_0_0_2_2_4 + 0.000800865800865833*G0_0_0_2_2_5 - 0.00201298701298709*G0_0_0_2_3_1 + 0.00345238095238109*G0_0_0_2_3_2 - 0.00805194805194833*G0_0_0_2_3_3 - 0.00168831168831175*G0_0_0_2_3_5 - 0.00311688311688322*G0_0_0_2_4_0 + 0.00985930735930772*G0_0_0_2_4_2 + 0.0051082251082253*G0_0_0_2_4_4 - 0.00147186147186152*G0_0_0_2_4_5 - 0.000411255411255427*G0_0_0_2_5_0 + 0.000119047619047619*G0_0_0_2_5_1 + 0.000800865800865833*G0_0_0_2_5_2 - 0.00168831168831175*G0_0_0_2_5_3 - 0.00147186147186152*G0_0_0_2_5_4 - 0.00199134199134206*G0_0_0_2_5_5 + 0.000346320346320355*G0_0_0_3_0_0 - 0.000790043290043317*G0_0_0_3_0_1 - 0.000173160173160179*G0_0_0_3_0_4 + 0.000129870129870136*G0_0_0_3_0_5 - 0.000790043290043317*G0_0_0_3_1_0 + 0.0173701298701305*G0_0_0_3_1_1 - 0.00201298701298708*G0_0_0_3_1_2 + 0.0161904761904768*G0_0_0_3_1_3 + 0.00134199134199141*G0_0_0_3_1_5 - 0.00201298701298709*G0_0_0_3_2_1 + 0.00345238095238109*G0_0_0_3_2_2 - 0.00805194805194833*G0_0_0_3_2_3 - 0.00168831168831175*G0_0_0_3_2_5 + 0.0161904761904768*G0_0_0_3_3_1 - 0.00805194805194833*G0_0_0_3_3_2 + 0.000259740259740276*G0_0_0_3_3_3 - 0.000259740259740275*G0_0_0_3_3_4 + 0.00320346320346332*G0_0_0_3_3_5 - 0.000173160173160179*G0_0_0_3_4_0 - 0.000259740259740276*G0_0_0_3_4_3 + 0.00562770562770581*G0_0_0_3_4_4 + 0.00329004329004339*G0_0_0_3_4_5 + 0.000129870129870136*G0_0_0_3_5_0 + 0.00134199134199141*G0_0_0_3_5_1 - 0.00168831168831175*G0_0_0_3_5_2 + 0.00320346320346331*G0_0_0_3_5_3 + 0.00329004329004339*G0_0_0_3_5_4 + 0.00372294372294384*G0_0_0_3_5_5 + 0.00891774891774921*G0_0_0_4_0_0 - 0.000259740259740269*G0_0_0_4_0_1 - 0.00311688311688322*G0_0_0_4_0_2 - 0.000173160173160179*G0_0_0_4_0_3 + 0.00471861471861487*G0_0_0_4_0_4 + 0.00134199134199139*G0_0_0_4_0_5 - 0.000259740259740269*G0_0_0_4_1_0 + 0.000768398268398288*G0_0_0_4_1_1 - 0.00264069264069273*G0_0_0_4_1_4 - 0.00177489177489183*G0_0_0_4_1_5 - 0.00311688311688322*G0_0_0_4_2_0 + 0.00985930735930772*G0_0_0_4_2_2 + 0.0051082251082253*G0_0_0_4_2_4 - 0.00147186147186152*G0_0_0_4_2_5 - 0.000173160173160179*G0_0_0_4_3_0 - 0.000259740259740274*G0_0_0_4_3_3 + 0.00562770562770581*G0_0_0_4_3_4 + 0.00329004329004339*G0_0_0_4_3_5 + 0.00471861471861487*G0_0_0_4_4_0 - 0.00264069264069273*G0_0_0_4_4_1 + 0.0051082251082253*G0_0_0_4_4_2 + 0.00562770562770581*G0_0_0_4_4_3 + 0.053246753246755*G0_0_0_4_4_4 + 0.00822510822510849*G0_0_0_4_4_5 + 0.00134199134199139*G0_0_0_4_5_0 - 0.00177489177489183*G0_0_0_4_5_1 - 0.00147186147186152*G0_0_0_4_5_2 + 0.00329004329004339*G0_0_0_4_5_3 + 0.00822510822510849*G0_0_0_4_5_4 + 0.00753246753246778*G0_0_0_4_5_5 + 0.00325757575757587*G0_0_0_5_0_0 + 0.000194805194805198*G0_0_0_5_0_1 - 0.000411255411255427*G0_0_0_5_0_2 + 0.000129870129870136*G0_0_0_5_0_3 + 0.00134199134199139*G0_0_0_5_0_4 + 0.00441558441558458*G0_0_0_5_0_5 + 0.000194805194805198*G0_0_0_5_1_0 + 0.00730519480519508*G0_0_0_5_1_1 + 0.000119047619047619*G0_0_0_5_1_2 + 0.00134199134199141*G0_0_0_5_1_3 - 0.00177489177489183*G0_0_0_5_1_4 - 0.00718614718614743*G0_0_0_5_1_5 - 0.000411255411255427*G0_0_0_5_2_0 + 0.000119047619047619*G0_0_0_5_2_1 + 0.000800865800865833*G0_0_0_5_2_2 - 0.00168831168831175*G0_0_0_5_2_3 - 0.00147186147186152*G0_0_0_5_2_4 - 0.00199134199134206*G0_0_0_5_2_5 + 0.000129870129870136*G0_0_0_5_3_0 + 0.00134199134199141*G0_0_0_5_3_1 - 0.00168831168831175*G0_0_0_5_3_2 + 0.00320346320346332*G0_0_0_5_3_3 + 0.00329004329004339*G0_0_0_5_3_4 + 0.00372294372294384*G0_0_0_5_3_5 + 0.00134199134199139*G0_0_0_5_4_0 - 0.00177489177489183*G0_0_0_5_4_1 - 0.00147186147186152*G0_0_0_5_4_2 + 0.00329004329004339*G0_0_0_5_4_3 + 0.00822510822510849*G0_0_0_5_4_4 + 0.00753246753246778*G0_0_0_5_4_5 + 0.00441558441558458*G0_0_0_5_5_0 - 0.00718614718614743*G0_0_0_5_5_1 - 0.00199134199134206*G0_0_0_5_5_2 + 0.00372294372294385*G0_0_0_5_5_3 + 0.00753246753246778*G0_0_0_5_5_4 + 0.0049350649350651*G0_0_0_5_5_5 - 0.00172889610389617*G0_0_1_0_0_0 - 0.000616883116883138*G0_0_1_0_0_1 + 0.000186688311688319*G0_0_1_0_0_2 - 0.000454545454545466*G0_0_1_0_0_3 - 0.000941558441558474*G0_0_1_0_0_4 - 0.000194805194805194*G0_0_1_0_0_5 - 0.000616883116883138*G0_0_1_0_1_0 + 0.00219155844155852*G0_0_1_0_1_1 - 0.000909090909090939*G0_0_1_0_1_3 - 0.000194805194805202*G0_0_1_0_1_4 + 0.00220779220779228*G0_0_1_0_1_5 + 0.000186688311688319*G0_0_1_0_2_0 - 0.00018668831168832*G0_0_1_0_2_2 + 0.000454545454545469*G0_0_1_0_2_3 - 0.000454545454545471*G0_0_1_0_2_5 - 0.000454545454545466*G0_0_1_0_3_0 - 0.000909090909090939*G0_0_1_0_3_1 + 0.000454545454545469*G0_0_1_0_3_2 + 0.00207792207792213*G0_0_1_0_3_3 + 0.00129870129870134*G0_0_1_0_3_4 + 0.00181818181818188*G0_0_1_0_3_5 - 0.000941558441558474*G0_0_1_0_4_0 - 0.000194805194805202*G0_0_1_0_4_1 + 0.00129870129870134*G0_0_1_0_4_3 - 0.000389610389610407*G0_0_1_0_4_4 + 0.00129870129870134*G0_0_1_0_4_5 - 0.000194805194805193*G0_0_1_0_5_0 + 0.00220779220779228*G0_0_1_0_5_1 - 0.000454545454545471*G0_0_1_0_5_2 + 0.00181818181818188*G0_0_1_0_5_3 + 0.00129870129870134*G0_0_1_0_5_4 + 0.0124675324675329*G0_0_1_0_5_5 - 0.000616883116883138*G0_0_1_1_0_0 + 0.00219155844155852*G0_0_1_1_0_1 - 0.000909090909090939*G0_0_1_1_0_3 - 0.000194805194805202*G0_0_1_1_0_4 + 0.00220779220779228*G0_0_1_1_0_5 + 0.00219155844155852*G0_0_1_1_1_0 - 0.00219155844155852*G0_0_1_1_1_2 + 0.0100649350649354*G0_0_1_1_1_3 - 0.0100649350649354*G0_0_1_1_1_5 - 0.00219155844155852*G0_0_1_1_2_1 + 0.000616883116883138*G0_0_1_1_2_2 - 0.00220779220779229*G0_0_1_1_2_3 + 0.0001948051948052*G0_0_1_1_2_4 + 0.000909090909090938*G0_0_1_1_2_5 - 0.000909090909090939*G0_0_1_1_3_0 + 0.0100649350649354*G0_0_1_1_3_1 - 0.00220779220779229*G0_0_1_1_3_2 + 0.0233766233766242*G0_0_1_1_3_3 + 0.00181818181818188*G0_0_1_1_3_4 - 0.000194805194805202*G0_0_1_1_4_0 + 0.0001948051948052*G0_0_1_1_4_2 + 0.00181818181818188*G0_0_1_1_4_3 - 0.00181818181818188*G0_0_1_1_4_5 + 0.00220779220779228*G0_0_1_1_5_0 - 0.0100649350649354*G0_0_1_1_5_1 + 0.000909090909090938*G0_0_1_1_5_2 - 0.00181818181818188*G0_0_1_1_5_4 - 0.0233766233766242*G0_0_1_1_5_5 + 0.000186688311688319*G0_0_1_2_0_0 - 0.00018668831168832*G0_0_1_2_0_2 + 0.000454545454545469*G0_0_1_2_0_3 - 0.000454545454545471*G0_0_1_2_0_5 - 0.00219155844155852*G0_0_1_2_1_1 + 0.000616883116883138*G0_0_1_2_1_2 - 0.00220779220779229*G0_0_1_2_1_3 + 0.0001948051948052*G0_0_1_2_1_4 + 0.000909090909090938*G0_0_1_2_1_5 - 0.00018668831168832*G0_0_1_2_2_0 + 0.000616883116883138*G0_0_1_2_2_1 + 0.00172889610389619*G0_0_1_2_2_2 + 0.000194805194805211*G0_0_1_2_2_3 + 0.000941558441558483*G0_0_1_2_2_4 + 0.000454545454545472*G0_0_1_2_2_5 + 0.000454545454545469*G0_0_1_2_3_0 - 0.00220779220779229*G0_0_1_2_3_1 + 0.000194805194805211*G0_0_1_2_3_2 - 0.0124675324675329*G0_0_1_2_3_3 - 0.00129870129870134*G0_0_1_2_3_4 - 0.00181818181818189*G0_0_1_2_3_5 + 0.0001948051948052*G0_0_1_2_4_1 + 0.000941558441558483*G0_0_1_2_4_2 - 0.00129870129870134*G0_0_1_2_4_3 + 0.00038961038961041*G0_0_1_2_4_4 - 0.00129870129870134*G0_0_1_2_4_5 - 0.000454545454545471*G0_0_1_2_5_0 + 0.000909090909090937*G0_0_1_2_5_1 + 0.000454545454545472*G0_0_1_2_5_2 - 0.00181818181818189*G0_0_1_2_5_3 - 0.00129870129870134*G0_0_1_2_5_4 - 0.00207792207792216*G0_0_1_2_5_5 - 0.000454545454545466*G0_0_1_3_0_0 - 0.000909090909090939*G0_0_1_3_0_1 + 0.000454545454545469*G0_0_1_3_0_2 + 0.00207792207792213*G0_0_1_3_0_3 + 0.00129870129870134*G0_0_1_3_0_4 + 0.00181818181818188*G0_0_1_3_0_5 - 0.000909090909090939*G0_0_1_3_1_0 + 0.0100649350649354*G0_0_1_3_1_1 - 0.00220779220779229*G0_0_1_3_1_2 + 0.0233766233766242*G0_0_1_3_1_3 + 0.00181818181818188*G0_0_1_3_1_4 + 0.000454545454545469*G0_0_1_3_2_0 - 0.00220779220779229*G0_0_1_3_2_1 + 0.000194805194805211*G0_0_1_3_2_2 - 0.0124675324675329*G0_0_1_3_2_3 - 0.00129870129870134*G0_0_1_3_2_4 - 0.00181818181818189*G0_0_1_3_2_5 + 0.00207792207792213*G0_0_1_3_3_0 + 0.0233766233766242*G0_0_1_3_3_1 - 0.0124675324675329*G0_0_1_3_3_2 - 0.0046753246753247*G0_0_1_3_3_3 - 0.00779220779220803*G0_0_1_3_3_4 - 0.000519480519480498*G0_0_1_3_3_5 + 0.00129870129870134*G0_0_1_3_4_0 + 0.00181818181818188*G0_0_1_3_4_1 - 0.00129870129870134*G0_0_1_3_4_2 - 0.00779220779220803*G0_0_1_3_4_3 - 0.00259740259740267*G0_0_1_3_4_4 + 0.00181818181818188*G0_0_1_3_5_0 - 0.00181818181818189*G0_0_1_3_5_2 - 0.0005194805194805*G0_0_1_3_5_3 + 0.000519480519480552*G0_0_1_3_5_5 - 0.000941558441558474*G0_0_1_4_0_0 - 0.000194805194805202*G0_0_1_4_0_1 + 0.00129870129870134*G0_0_1_4_0_3 - 0.000389610389610407*G0_0_1_4_0_4 + 0.00129870129870134*G0_0_1_4_0_5 - 0.000194805194805202*G0_0_1_4_1_0 + 0.0001948051948052*G0_0_1_4_1_2 + 0.00181818181818188*G0_0_1_4_1_3 - 0.00181818181818188*G0_0_1_4_1_5 + 0.0001948051948052*G0_0_1_4_2_1 + 0.000941558441558483*G0_0_1_4_2_2 - 0.00129870129870134*G0_0_1_4_2_3 + 0.00038961038961041*G0_0_1_4_2_4 - 0.00129870129870134*G0_0_1_4_2_5 + 0.00129870129870134*G0_0_1_4_3_0 + 0.00181818181818188*G0_0_1_4_3_1 - 0.00129870129870134*G0_0_1_4_3_2 - 0.00779220779220803*G0_0_1_4_3_3 - 0.00259740259740267*G0_0_1_4_3_4 - 0.000389610389610407*G0_0_1_4_4_0 + 0.00038961038961041*G0_0_1_4_4_2 - 0.00259740259740267*G0_0_1_4_4_3 + 0.00259740259740269*G0_0_1_4_4_5 + 0.00129870129870134*G0_0_1_4_5_0 - 0.00181818181818188*G0_0_1_4_5_1 - 0.00129870129870134*G0_0_1_4_5_2 + 0.00259740259740269*G0_0_1_4_5_4 + 0.00779220779220808*G0_0_1_4_5_5 - 0.000194805194805193*G0_0_1_5_0_0 + 0.00220779220779228*G0_0_1_5_0_1 - 0.000454545454545471*G0_0_1_5_0_2 + 0.00181818181818188*G0_0_1_5_0_3 + 0.00129870129870134*G0_0_1_5_0_4 + 0.0124675324675329*G0_0_1_5_0_5 + 0.00220779220779228*G0_0_1_5_1_0 - 0.0100649350649354*G0_0_1_5_1_1 + 0.000909090909090938*G0_0_1_5_1_2 - 0.00181818181818188*G0_0_1_5_1_4 - 0.0233766233766242*G0_0_1_5_1_5 - 0.000454545454545471*G0_0_1_5_2_0 + 0.000909090909090938*G0_0_1_5_2_1 + 0.000454545454545472*G0_0_1_5_2_2 - 0.00181818181818189*G0_0_1_5_2_3 - 0.00129870129870134*G0_0_1_5_2_4 - 0.00207792207792215*G0_0_1_5_2_5 + 0.00181818181818188*G0_0_1_5_3_0 - 0.00181818181818189*G0_0_1_5_3_2 - 0.0005194805194805*G0_0_1_5_3_3 + 0.000519480519480552*G0_0_1_5_3_5 + 0.00129870129870134*G0_0_1_5_4_0 - 0.00181818181818188*G0_0_1_5_4_1 - 0.00129870129870134*G0_0_1_5_4_2 + 0.00259740259740269*G0_0_1_5_4_4 + 0.00779220779220808*G0_0_1_5_4_5 + 0.0124675324675329*G0_0_1_5_5_0 - 0.0233766233766242*G0_0_1_5_5_1 - 0.00207792207792216*G0_0_1_5_5_2 + 0.000519480519480552*G0_0_1_5_5_3 + 0.00779220779220808*G0_0_1_5_5_4 + 0.00467532467532492*G0_0_1_5_5_5; + A[9] = A[90] + 0.00219155844155853*G0_0_1_0_0_1 - 0.00219155844155851*G0_0_1_0_0_2 + 0.0100649350649354*G0_0_1_0_0_4 - 0.0100649350649355*G0_0_1_0_0_5 + 0.00219155844155853*G0_0_1_0_1_0 - 0.000616883116883138*G0_0_1_0_1_1 - 0.000194805194805201*G0_0_1_0_1_3 - 0.00090909090909094*G0_0_1_0_1_4 + 0.00220779220779229*G0_0_1_0_1_5 - 0.00219155844155851*G0_0_1_0_2_0 + 0.000616883116883136*G0_0_1_0_2_2 + 0.000194805194805201*G0_0_1_0_2_3 - 0.00220779220779228*G0_0_1_0_2_4 + 0.000909090909090942*G0_0_1_0_2_5 - 0.000194805194805201*G0_0_1_0_3_1 + 0.000194805194805201*G0_0_1_0_3_2 + 0.00181818181818188*G0_0_1_0_3_4 - 0.00181818181818188*G0_0_1_0_3_5 + 0.0100649350649354*G0_0_1_0_4_0 - 0.00090909090909094*G0_0_1_0_4_1 - 0.00220779220779228*G0_0_1_0_4_2 + 0.00181818181818188*G0_0_1_0_4_3 + 0.0233766233766241*G0_0_1_0_4_4 - 0.0100649350649355*G0_0_1_0_5_0 + 0.00220779220779229*G0_0_1_0_5_1 + 0.000909090909090942*G0_0_1_0_5_2 - 0.00181818181818188*G0_0_1_0_5_3 - 0.0233766233766242*G0_0_1_0_5_5 + 0.00219155844155853*G0_0_1_1_0_0 - 0.000616883116883138*G0_0_1_1_0_1 - 0.000194805194805201*G0_0_1_1_0_3 - 0.000909090909090939*G0_0_1_1_0_4 + 0.00220779220779229*G0_0_1_1_0_5 - 0.000616883116883138*G0_0_1_1_1_0 - 0.00172889610389617*G0_0_1_1_1_1 + 0.000186688311688319*G0_0_1_1_1_2 - 0.000941558441558476*G0_0_1_1_1_3 - 0.00045454545454547*G0_0_1_1_1_4 - 0.000194805194805209*G0_0_1_1_1_5 + 0.000186688311688319*G0_0_1_1_2_1 - 0.00018668831168832*G0_0_1_1_2_2 + 0.00045454545454547*G0_0_1_1_2_4 - 0.000454545454545471*G0_0_1_1_2_5 - 0.000194805194805201*G0_0_1_1_3_0 - 0.000941558441558477*G0_0_1_1_3_1 - 0.000389610389610406*G0_0_1_1_3_3 + 0.00129870129870134*G0_0_1_1_3_4 + 0.00129870129870134*G0_0_1_1_3_5 - 0.000909090909090939*G0_0_1_1_4_0 - 0.00045454545454547*G0_0_1_1_4_1 + 0.00045454545454547*G0_0_1_1_4_2 + 0.00129870129870134*G0_0_1_1_4_3 + 0.00207792207792215*G0_0_1_1_4_4 + 0.00181818181818188*G0_0_1_1_4_5 + 0.00220779220779229*G0_0_1_1_5_0 - 0.000194805194805209*G0_0_1_1_5_1 - 0.000454545454545471*G0_0_1_1_5_2 + 0.00129870129870134*G0_0_1_1_5_3 + 0.00181818181818188*G0_0_1_1_5_4 + 0.0124675324675329*G0_0_1_1_5_5 - 0.00219155844155851*G0_0_1_2_0_0 + 0.000616883116883136*G0_0_1_2_0_2 + 0.000194805194805201*G0_0_1_2_0_3 - 0.00220779220779228*G0_0_1_2_0_4 + 0.000909090909090942*G0_0_1_2_0_5 + 0.000186688311688319*G0_0_1_2_1_1 - 0.00018668831168832*G0_0_1_2_1_2 + 0.00045454545454547*G0_0_1_2_1_4 - 0.000454545454545471*G0_0_1_2_1_5 + 0.000616883116883136*G0_0_1_2_2_0 - 0.00018668831168832*G0_0_1_2_2_1 + 0.00172889610389619*G0_0_1_2_2_2 + 0.000941558441558482*G0_0_1_2_2_3 + 0.000194805194805207*G0_0_1_2_2_4 + 0.00045454545454547*G0_0_1_2_2_5 + 0.000194805194805201*G0_0_1_2_3_0 + 0.000941558441558482*G0_0_1_2_3_2 + 0.000389610389610411*G0_0_1_2_3_3 - 0.00129870129870134*G0_0_1_2_3_4 - 0.00129870129870134*G0_0_1_2_3_5 - 0.00220779220779228*G0_0_1_2_4_0 + 0.00045454545454547*G0_0_1_2_4_1 + 0.000194805194805207*G0_0_1_2_4_2 - 0.00129870129870134*G0_0_1_2_4_3 - 0.0124675324675329*G0_0_1_2_4_4 - 0.00181818181818188*G0_0_1_2_4_5 + 0.000909090909090942*G0_0_1_2_5_0 - 0.000454545454545471*G0_0_1_2_5_1 + 0.00045454545454547*G0_0_1_2_5_2 - 0.00129870129870134*G0_0_1_2_5_3 - 0.00181818181818188*G0_0_1_2_5_4 - 0.00207792207792214*G0_0_1_2_5_5 - 0.000194805194805201*G0_0_1_3_0_1 + 0.000194805194805201*G0_0_1_3_0_2 + 0.00181818181818188*G0_0_1_3_0_4 - 0.00181818181818188*G0_0_1_3_0_5 - 0.000194805194805201*G0_0_1_3_1_0 - 0.000941558441558477*G0_0_1_3_1_1 - 0.000389610389610405*G0_0_1_3_1_3 + 0.00129870129870134*G0_0_1_3_1_4 + 0.00129870129870134*G0_0_1_3_1_5 + 0.000194805194805201*G0_0_1_3_2_0 + 0.000941558441558482*G0_0_1_3_2_2 + 0.000389610389610411*G0_0_1_3_2_3 - 0.00129870129870134*G0_0_1_3_2_4 - 0.00129870129870134*G0_0_1_3_2_5 - 0.000389610389610408*G0_0_1_3_3_1 + 0.000389610389610414*G0_0_1_3_3_2 - 0.00259740259740269*G0_0_1_3_3_4 + 0.00259740259740267*G0_0_1_3_3_5 + 0.00181818181818188*G0_0_1_3_4_0 + 0.00129870129870134*G0_0_1_3_4_1 - 0.00129870129870134*G0_0_1_3_4_2 - 0.00259740259740269*G0_0_1_3_4_3 - 0.00779220779220806*G0_0_1_3_4_4 - 0.00181818181818188*G0_0_1_3_5_0 + 0.00129870129870134*G0_0_1_3_5_1 - 0.00129870129870134*G0_0_1_3_5_2 + 0.00259740259740268*G0_0_1_3_5_3 + 0.00779220779220805*G0_0_1_3_5_5 + 0.0100649350649354*G0_0_1_4_0_0 - 0.00090909090909094*G0_0_1_4_0_1 - 0.00220779220779228*G0_0_1_4_0_2 + 0.00181818181818188*G0_0_1_4_0_3 + 0.0233766233766241*G0_0_1_4_0_4 - 0.00090909090909094*G0_0_1_4_1_0 - 0.00045454545454547*G0_0_1_4_1_1 + 0.00045454545454547*G0_0_1_4_1_2 + 0.00129870129870134*G0_0_1_4_1_3 + 0.00207792207792215*G0_0_1_4_1_4 + 0.00181818181818188*G0_0_1_4_1_5 - 0.00220779220779228*G0_0_1_4_2_0 + 0.00045454545454547*G0_0_1_4_2_1 + 0.000194805194805207*G0_0_1_4_2_2 - 0.00129870129870134*G0_0_1_4_2_3 - 0.0124675324675329*G0_0_1_4_2_4 - 0.00181818181818188*G0_0_1_4_2_5 + 0.00181818181818188*G0_0_1_4_3_0 + 0.00129870129870134*G0_0_1_4_3_1 - 0.00129870129870134*G0_0_1_4_3_2 - 0.00259740259740269*G0_0_1_4_3_3 - 0.00779220779220806*G0_0_1_4_3_4 + 0.0233766233766241*G0_0_1_4_4_0 + 0.00207792207792215*G0_0_1_4_4_1 - 0.0124675324675329*G0_0_1_4_4_2 - 0.00779220779220806*G0_0_1_4_4_3 - 0.00467532467532485*G0_0_1_4_4_4 - 0.000519480519480548*G0_0_1_4_4_5 + 0.00181818181818188*G0_0_1_4_5_1 - 0.00181818181818188*G0_0_1_4_5_2 - 0.000519480519480549*G0_0_1_4_5_4 + 0.000519480519480527*G0_0_1_4_5_5 - 0.0100649350649355*G0_0_1_5_0_0 + 0.00220779220779229*G0_0_1_5_0_1 + 0.000909090909090942*G0_0_1_5_0_2 - 0.00181818181818188*G0_0_1_5_0_3 - 0.0233766233766242*G0_0_1_5_0_5 + 0.00220779220779229*G0_0_1_5_1_0 - 0.000194805194805209*G0_0_1_5_1_1 - 0.000454545454545471*G0_0_1_5_1_2 + 0.00129870129870134*G0_0_1_5_1_3 + 0.00181818181818188*G0_0_1_5_1_4 + 0.0124675324675329*G0_0_1_5_1_5 + 0.000909090909090942*G0_0_1_5_2_0 - 0.000454545454545471*G0_0_1_5_2_1 + 0.00045454545454547*G0_0_1_5_2_2 - 0.00129870129870134*G0_0_1_5_2_3 - 0.00181818181818188*G0_0_1_5_2_4 - 0.00207792207792214*G0_0_1_5_2_5 - 0.00181818181818188*G0_0_1_5_3_0 + 0.00129870129870134*G0_0_1_5_3_1 - 0.00129870129870134*G0_0_1_5_3_2 + 0.00259740259740268*G0_0_1_5_3_3 + 0.00779220779220805*G0_0_1_5_3_5 + 0.00181818181818188*G0_0_1_5_4_1 - 0.00181818181818188*G0_0_1_5_4_2 - 0.000519480519480551*G0_0_1_5_4_4 + 0.000519480519480525*G0_0_1_5_4_5 - 0.0233766233766242*G0_0_1_5_5_0 + 0.0124675324675329*G0_0_1_5_5_1 - 0.00207792207792214*G0_0_1_5_5_2 + 0.00779220779220805*G0_0_1_5_5_3 + 0.000519480519480526*G0_0_1_5_5_4 + 0.00467532467532477*G0_0_1_5_5_5 - 0.00219155844155853*G0_1_0_0_0_1 + 0.00219155844155851*G0_1_0_0_0_2 - 0.0100649350649354*G0_1_0_0_0_4 + 0.0100649350649355*G0_1_0_0_0_5 - 0.00219155844155853*G0_1_0_0_1_0 + 0.000616883116883138*G0_1_0_0_1_1 + 0.0001948051948052*G0_1_0_0_1_3 + 0.00090909090909094*G0_1_0_0_1_4 - 0.00220779220779229*G0_1_0_0_1_5 + 0.00219155844155851*G0_1_0_0_2_0 - 0.000616883116883136*G0_1_0_0_2_2 - 0.000194805194805201*G0_1_0_0_2_3 + 0.00220779220779228*G0_1_0_0_2_4 - 0.000909090909090942*G0_1_0_0_2_5 + 0.0001948051948052*G0_1_0_0_3_1 - 0.000194805194805201*G0_1_0_0_3_2 - 0.00181818181818188*G0_1_0_0_3_4 + 0.00181818181818188*G0_1_0_0_3_5 - 0.0100649350649354*G0_1_0_0_4_0 + 0.00090909090909094*G0_1_0_0_4_1 + 0.00220779220779228*G0_1_0_0_4_2 - 0.00181818181818188*G0_1_0_0_4_3 - 0.0233766233766241*G0_1_0_0_4_4 + 0.0100649350649355*G0_1_0_0_5_0 - 0.00220779220779229*G0_1_0_0_5_1 - 0.000909090909090942*G0_1_0_0_5_2 + 0.00181818181818188*G0_1_0_0_5_3 + 0.0233766233766242*G0_1_0_0_5_5 - 0.00219155844155853*G0_1_0_1_0_0 + 0.000616883116883138*G0_1_0_1_0_1 + 0.000194805194805201*G0_1_0_1_0_3 + 0.000909090909090939*G0_1_0_1_0_4 - 0.00220779220779229*G0_1_0_1_0_5 + 0.000616883116883138*G0_1_0_1_1_0 + 0.00172889610389617*G0_1_0_1_1_1 - 0.000186688311688319*G0_1_0_1_1_2 + 0.000941558441558477*G0_1_0_1_1_3 + 0.00045454545454547*G0_1_0_1_1_4 + 0.000194805194805209*G0_1_0_1_1_5 - 0.000186688311688319*G0_1_0_1_2_1 + 0.00018668831168832*G0_1_0_1_2_2 - 0.00045454545454547*G0_1_0_1_2_4 + 0.000454545454545471*G0_1_0_1_2_5 + 0.000194805194805201*G0_1_0_1_3_0 + 0.000941558441558478*G0_1_0_1_3_1 + 0.000389610389610406*G0_1_0_1_3_3 - 0.00129870129870134*G0_1_0_1_3_4 - 0.00129870129870134*G0_1_0_1_3_5 + 0.000909090909090939*G0_1_0_1_4_0 + 0.00045454545454547*G0_1_0_1_4_1 - 0.00045454545454547*G0_1_0_1_4_2 - 0.00129870129870134*G0_1_0_1_4_3 - 0.00207792207792215*G0_1_0_1_4_4 - 0.00181818181818188*G0_1_0_1_4_5 - 0.00220779220779229*G0_1_0_1_5_0 + 0.000194805194805209*G0_1_0_1_5_1 + 0.000454545454545471*G0_1_0_1_5_2 - 0.00129870129870134*G0_1_0_1_5_3 - 0.00181818181818188*G0_1_0_1_5_4 - 0.0124675324675329*G0_1_0_1_5_5 + 0.00219155844155851*G0_1_0_2_0_0 - 0.000616883116883136*G0_1_0_2_0_2 - 0.000194805194805201*G0_1_0_2_0_3 + 0.00220779220779228*G0_1_0_2_0_4 - 0.000909090909090942*G0_1_0_2_0_5 - 0.000186688311688319*G0_1_0_2_1_1 + 0.00018668831168832*G0_1_0_2_1_2 - 0.00045454545454547*G0_1_0_2_1_4 + 0.000454545454545471*G0_1_0_2_1_5 - 0.000616883116883136*G0_1_0_2_2_0 + 0.00018668831168832*G0_1_0_2_2_1 - 0.00172889610389619*G0_1_0_2_2_2 - 0.000941558441558482*G0_1_0_2_2_3 - 0.000194805194805207*G0_1_0_2_2_4 - 0.00045454545454547*G0_1_0_2_2_5 - 0.000194805194805201*G0_1_0_2_3_0 - 0.000941558441558482*G0_1_0_2_3_2 - 0.000389610389610412*G0_1_0_2_3_3 + 0.00129870129870134*G0_1_0_2_3_4 + 0.00129870129870134*G0_1_0_2_3_5 + 0.00220779220779228*G0_1_0_2_4_0 - 0.00045454545454547*G0_1_0_2_4_1 - 0.000194805194805208*G0_1_0_2_4_2 + 0.00129870129870134*G0_1_0_2_4_3 + 0.0124675324675329*G0_1_0_2_4_4 + 0.00181818181818188*G0_1_0_2_4_5 - 0.000909090909090942*G0_1_0_2_5_0 + 0.000454545454545471*G0_1_0_2_5_1 - 0.00045454545454547*G0_1_0_2_5_2 + 0.00129870129870134*G0_1_0_2_5_3 + 0.00181818181818188*G0_1_0_2_5_4 + 0.00207792207792214*G0_1_0_2_5_5 + 0.000194805194805201*G0_1_0_3_0_1 - 0.000194805194805201*G0_1_0_3_0_2 - 0.00181818181818188*G0_1_0_3_0_4 + 0.00181818181818188*G0_1_0_3_0_5 + 0.000194805194805201*G0_1_0_3_1_0 + 0.000941558441558478*G0_1_0_3_1_1 + 0.000389610389610406*G0_1_0_3_1_3 - 0.00129870129870134*G0_1_0_3_1_4 - 0.00129870129870134*G0_1_0_3_1_5 - 0.000194805194805201*G0_1_0_3_2_0 - 0.000941558441558482*G0_1_0_3_2_2 - 0.000389610389610412*G0_1_0_3_2_3 + 0.00129870129870134*G0_1_0_3_2_4 + 0.00129870129870134*G0_1_0_3_2_5 + 0.000389610389610409*G0_1_0_3_3_1 - 0.000389610389610415*G0_1_0_3_3_2 + 0.00259740259740269*G0_1_0_3_3_4 - 0.00259740259740267*G0_1_0_3_3_5 - 0.00181818181818188*G0_1_0_3_4_0 - 0.00129870129870134*G0_1_0_3_4_1 + 0.00129870129870134*G0_1_0_3_4_2 + 0.00259740259740269*G0_1_0_3_4_3 + 0.00779220779220806*G0_1_0_3_4_4 + 0.00181818181818188*G0_1_0_3_5_0 - 0.00129870129870134*G0_1_0_3_5_1 + 0.00129870129870134*G0_1_0_3_5_2 - 0.00259740259740268*G0_1_0_3_5_3 - 0.00779220779220805*G0_1_0_3_5_5 - 0.0100649350649354*G0_1_0_4_0_0 + 0.00090909090909094*G0_1_0_4_0_1 + 0.00220779220779228*G0_1_0_4_0_2 - 0.00181818181818188*G0_1_0_4_0_3 - 0.0233766233766241*G0_1_0_4_0_4 + 0.00090909090909094*G0_1_0_4_1_0 + 0.00045454545454547*G0_1_0_4_1_1 - 0.000454545454545469*G0_1_0_4_1_2 - 0.00129870129870134*G0_1_0_4_1_3 - 0.00207792207792215*G0_1_0_4_1_4 - 0.00181818181818188*G0_1_0_4_1_5 + 0.00220779220779228*G0_1_0_4_2_0 - 0.000454545454545469*G0_1_0_4_2_1 - 0.000194805194805208*G0_1_0_4_2_2 + 0.00129870129870134*G0_1_0_4_2_3 + 0.0124675324675329*G0_1_0_4_2_4 + 0.00181818181818188*G0_1_0_4_2_5 - 0.00181818181818188*G0_1_0_4_3_0 - 0.00129870129870134*G0_1_0_4_3_1 + 0.00129870129870134*G0_1_0_4_3_2 + 0.00259740259740269*G0_1_0_4_3_3 + 0.00779220779220806*G0_1_0_4_3_4 - 0.0233766233766241*G0_1_0_4_4_0 - 0.00207792207792215*G0_1_0_4_4_1 + 0.0124675324675329*G0_1_0_4_4_2 + 0.00779220779220806*G0_1_0_4_4_3 + 0.00467532467532486*G0_1_0_4_4_4 + 0.000519480519480553*G0_1_0_4_4_5 - 0.00181818181818188*G0_1_0_4_5_1 + 0.00181818181818188*G0_1_0_4_5_2 + 0.000519480519480553*G0_1_0_4_5_4 - 0.000519480519480525*G0_1_0_4_5_5 + 0.0100649350649355*G0_1_0_5_0_0 - 0.00220779220779229*G0_1_0_5_0_1 - 0.000909090909090942*G0_1_0_5_0_2 + 0.00181818181818188*G0_1_0_5_0_3 + 0.0233766233766242*G0_1_0_5_0_5 - 0.00220779220779229*G0_1_0_5_1_0 + 0.000194805194805209*G0_1_0_5_1_1 + 0.000454545454545471*G0_1_0_5_1_2 - 0.00129870129870134*G0_1_0_5_1_3 - 0.00181818181818188*G0_1_0_5_1_4 - 0.0124675324675329*G0_1_0_5_1_5 - 0.000909090909090942*G0_1_0_5_2_0 + 0.000454545454545471*G0_1_0_5_2_1 - 0.00045454545454547*G0_1_0_5_2_2 + 0.00129870129870134*G0_1_0_5_2_3 + 0.00181818181818188*G0_1_0_5_2_4 + 0.00207792207792214*G0_1_0_5_2_5 + 0.00181818181818188*G0_1_0_5_3_0 - 0.00129870129870134*G0_1_0_5_3_1 + 0.00129870129870134*G0_1_0_5_3_2 - 0.00259740259740268*G0_1_0_5_3_3 - 0.00779220779220805*G0_1_0_5_3_5 - 0.00181818181818188*G0_1_0_5_4_1 + 0.00181818181818188*G0_1_0_5_4_2 + 0.000519480519480554*G0_1_0_5_4_4 - 0.000519480519480523*G0_1_0_5_4_5 + 0.0233766233766242*G0_1_0_5_5_0 - 0.0124675324675329*G0_1_0_5_5_1 + 0.00207792207792214*G0_1_0_5_5_2 - 0.00779220779220805*G0_1_0_5_5_3 - 0.000519480519480526*G0_1_0_5_5_4 - 0.00467532467532478*G0_1_0_5_5_5; + A[34] = -A[37] - 0.00653814935064966*G0_0_0_0_0_0 + 0.000450487012987032*G0_0_0_0_0_1 - 0.000974025974026005*G0_0_0_0_0_3 - 0.00818181818181847*G0_0_0_0_0_4 - 0.00326298701298714*G0_0_0_0_0_5 + 0.000450487012987032*G0_0_0_0_1_0 - 0.000730519480519505*G0_0_0_0_1_1 - 0.000328733766233778*G0_0_0_0_1_2 - 0.000389610389610405*G0_0_0_0_1_3 - 0.000292207792207799*G0_0_0_0_1_4 + 0.000487012987013004*G0_0_0_0_1_5 - 0.000328733766233778*G0_0_0_0_2_1 + 0.00882711038961068*G0_0_0_0_2_2 + 0.000730519480519513*G0_0_0_0_2_3 + 0.00779220779220806*G0_0_0_0_2_4 - 0.000974025974025998*G0_0_0_0_2_5 - 0.000974025974026005*G0_0_0_0_3_0 - 0.000389610389610405*G0_0_0_0_3_1 + 0.000730519480519513*G0_0_0_0_3_2 - 0.00740259740259763*G0_0_0_0_3_3 + 0.00253246753246761*G0_0_0_0_3_4 + 0.00389610389610401*G0_0_0_0_3_5 - 0.00818181818181847*G0_0_0_0_4_0 - 0.000292207792207799*G0_0_0_0_4_1 + 0.00779220779220806*G0_0_0_0_4_2 + 0.00253246753246761*G0_0_0_0_4_3 + 0.0052597402597404*G0_0_0_0_4_4 + 0.0025324675324676*G0_0_0_0_4_5 - 0.00326298701298714*G0_0_0_0_5_0 + 0.000487012987013005*G0_0_0_0_5_1 - 0.000974025974025998*G0_0_0_0_5_2 + 0.00389610389610401*G0_0_0_0_5_3 + 0.0025324675324676*G0_0_0_0_5_4 + 0.00857142857142883*G0_0_0_0_5_5 + 0.000450487012987032*G0_0_0_1_0_0 - 0.000730519480519505*G0_0_0_1_0_1 - 0.000328733766233778*G0_0_0_1_0_2 - 0.000389610389610405*G0_0_0_1_0_3 - 0.000292207792207799*G0_0_0_1_0_4 + 0.000487012987013005*G0_0_0_1_0_5 - 0.000730519480519505*G0_0_0_1_1_0 + 0.0182629870129876*G0_0_0_1_1_1 - 0.00272727272727282*G0_0_0_1_1_2 + 0.0160714285714291*G0_0_0_1_1_3 - 0.0001948051948052*G0_0_0_1_1_4 + 0.00146103896103903*G0_0_0_1_1_5 - 0.000328733766233778*G0_0_0_1_2_0 - 0.00272727272727282*G0_0_0_1_2_1 + 0.00575892857142876*G0_0_0_1_2_2 - 0.00555194805194825*G0_0_0_1_2_3 + 0.00141233766233771*G0_0_0_1_2_4 - 0.000974025974026009*G0_0_0_1_2_5 - 0.000389610389610406*G0_0_0_1_3_0 + 0.0160714285714291*G0_0_0_1_3_1 - 0.00555194805194825*G0_0_0_1_3_2 + 0.0116883116883121*G0_0_0_1_3_3 + 0.00116883116883121*G0_0_0_1_3_4 + 0.00272727272727284*G0_0_0_1_3_5 - 0.000292207792207799*G0_0_0_1_4_0 - 0.0001948051948052*G0_0_0_1_4_1 + 0.00141233766233771*G0_0_0_1_4_2 + 0.00116883116883121*G0_0_0_1_4_3 + 0.00681818181818204*G0_0_0_1_4_4 + 0.00233766233766241*G0_0_0_1_4_5 + 0.000487012987013004*G0_0_0_1_5_0 + 0.00146103896103903*G0_0_0_1_5_1 - 0.000974025974026009*G0_0_0_1_5_2 + 0.00272727272727284*G0_0_0_1_5_3 + 0.00233766233766241*G0_0_0_1_5_4 + 0.0003896103896104*G0_0_0_1_5_5 - 0.000328733766233778*G0_0_0_2_0_1 + 0.00882711038961068*G0_0_0_2_0_2 + 0.000730519480519513*G0_0_0_2_0_3 + 0.00779220779220806*G0_0_0_2_0_4 - 0.000974025974025998*G0_0_0_2_0_5 - 0.000328733766233778*G0_0_0_2_1_0 - 0.00272727272727282*G0_0_0_2_1_1 + 0.00575892857142876*G0_0_0_2_1_2 - 0.00555194805194825*G0_0_0_2_1_3 + 0.00141233766233771*G0_0_0_2_1_4 - 0.000974025974026009*G0_0_0_2_1_5 + 0.00882711038961068*G0_0_0_2_2_0 + 0.00575892857142876*G0_0_0_2_2_1 - 0.11761363636364*G0_0_0_2_2_2 - 0.0167532467532473*G0_0_0_2_2_3 - 0.0416883116883131*G0_0_0_2_2_4 - 0.00326298701298714*G0_0_0_2_2_5 + 0.000730519480519513*G0_0_0_2_3_0 - 0.00555194805194825*G0_0_0_2_3_1 - 0.0167532467532473*G0_0_0_2_3_2 + 0.00311688311688318*G0_0_0_2_3_3 - 0.00428571428571445*G0_0_0_2_3_4 + 0.00506493506493521*G0_0_0_2_3_5 + 0.00779220779220806*G0_0_0_2_4_0 + 0.00141233766233771*G0_0_0_2_4_1 - 0.0416883116883131*G0_0_0_2_4_2 - 0.00428571428571445*G0_0_0_2_4_3 - 0.0296103896103906*G0_0_0_2_4_4 + 0.00370129870129881*G0_0_0_2_4_5 - 0.000974025974025998*G0_0_0_2_5_0 - 0.000974025974026009*G0_0_0_2_5_1 - 0.00326298701298714*G0_0_0_2_5_2 + 0.00506493506493521*G0_0_0_2_5_3 + 0.00370129870129881*G0_0_0_2_5_4 + 0.0109090909090913*G0_0_0_2_5_5 - 0.000974025974026005*G0_0_0_3_0_0 - 0.000389610389610405*G0_0_0_3_0_1 + 0.000730519480519514*G0_0_0_3_0_2 - 0.00740259740259763*G0_0_0_3_0_3 + 0.00253246753246761*G0_0_0_3_0_4 + 0.00389610389610401*G0_0_0_3_0_5 - 0.000389610389610405*G0_0_0_3_1_0 + 0.0160714285714291*G0_0_0_3_1_1 - 0.00555194805194825*G0_0_0_3_1_2 + 0.0116883116883121*G0_0_0_3_1_3 + 0.00116883116883121*G0_0_0_3_1_4 + 0.00272727272727284*G0_0_0_3_1_5 + 0.000730519480519513*G0_0_0_3_2_0 - 0.00555194805194825*G0_0_0_3_2_1 - 0.0167532467532473*G0_0_0_3_2_2 + 0.00311688311688318*G0_0_0_3_2_3 - 0.00428571428571445*G0_0_0_3_2_4 + 0.00506493506493521*G0_0_0_3_2_5 - 0.00740259740259763*G0_0_0_3_3_0 + 0.0116883116883121*G0_0_0_3_3_1 + 0.00311688311688318*G0_0_0_3_3_2 + 0.271168831168841*G0_0_0_3_3_3 + 0.0124675324675329*G0_0_0_3_3_4 + 0.00467532467532496*G0_0_0_3_3_5 + 0.00253246753246761*G0_0_0_3_4_0 + 0.00116883116883121*G0_0_0_3_4_1 - 0.00428571428571445*G0_0_0_3_4_2 + 0.0124675324675329*G0_0_0_3_4_3 - 0.0187012987012993*G0_0_0_3_4_4 - 0.0124675324675329*G0_0_0_3_4_5 + 0.00389610389610401*G0_0_0_3_5_0 + 0.00272727272727284*G0_0_0_3_5_1 + 0.00506493506493521*G0_0_0_3_5_2 + 0.00467532467532496*G0_0_0_3_5_3 - 0.0124675324675329*G0_0_0_3_5_4 - 0.0296103896103905*G0_0_0_3_5_5 - 0.00818181818181847*G0_0_0_4_0_0 - 0.000292207792207799*G0_0_0_4_0_1 + 0.00779220779220806*G0_0_0_4_0_2 + 0.00253246753246761*G0_0_0_4_0_3 + 0.0052597402597404*G0_0_0_4_0_4 + 0.0025324675324676*G0_0_0_4_0_5 - 0.000292207792207799*G0_0_0_4_1_0 - 0.0001948051948052*G0_0_0_4_1_1 + 0.00141233766233771*G0_0_0_4_1_2 + 0.00116883116883121*G0_0_0_4_1_3 + 0.00681818181818204*G0_0_0_4_1_4 + 0.00233766233766241*G0_0_0_4_1_5 + 0.00779220779220806*G0_0_0_4_2_0 + 0.00141233766233771*G0_0_0_4_2_1 - 0.0416883116883131*G0_0_0_4_2_2 - 0.00428571428571445*G0_0_0_4_2_3 - 0.0296103896103906*G0_0_0_4_2_4 + 0.00370129870129881*G0_0_0_4_2_5 + 0.00253246753246761*G0_0_0_4_3_0 + 0.00116883116883121*G0_0_0_4_3_1 - 0.00428571428571445*G0_0_0_4_3_2 + 0.0124675324675329*G0_0_0_4_3_3 - 0.0187012987012993*G0_0_0_4_3_4 - 0.0124675324675329*G0_0_0_4_3_5 + 0.0052597402597404*G0_0_0_4_4_0 + 0.00681818181818204*G0_0_0_4_4_1 - 0.0296103896103906*G0_0_0_4_4_2 - 0.0187012987012993*G0_0_0_4_4_3 - 0.13558441558442*G0_0_0_4_4_4 - 0.0210389610389617*G0_0_0_4_4_5 + 0.0025324675324676*G0_0_0_4_5_0 + 0.00233766233766241*G0_0_0_4_5_1 + 0.00370129870129881*G0_0_0_4_5_2 - 0.0124675324675329*G0_0_0_4_5_3 - 0.0210389610389617*G0_0_0_4_5_4 - 0.0264935064935074*G0_0_0_4_5_5 - 0.00326298701298714*G0_0_0_5_0_0 + 0.000487012987013004*G0_0_0_5_0_1 - 0.000974025974025998*G0_0_0_5_0_2 + 0.00389610389610401*G0_0_0_5_0_3 + 0.0025324675324676*G0_0_0_5_0_4 + 0.00857142857142883*G0_0_0_5_0_5 + 0.000487012987013004*G0_0_0_5_1_0 + 0.00146103896103903*G0_0_0_5_1_1 - 0.000974025974026009*G0_0_0_5_1_2 + 0.00272727272727284*G0_0_0_5_1_3 + 0.00233766233766241*G0_0_0_5_1_4 + 0.0003896103896104*G0_0_0_5_1_5 - 0.000974025974025998*G0_0_0_5_2_0 - 0.000974025974026009*G0_0_0_5_2_1 - 0.00326298701298714*G0_0_0_5_2_2 + 0.00506493506493521*G0_0_0_5_2_3 + 0.00370129870129881*G0_0_0_5_2_4 + 0.0109090909090913*G0_0_0_5_2_5 + 0.00389610389610401*G0_0_0_5_3_0 + 0.00272727272727284*G0_0_0_5_3_1 + 0.00506493506493521*G0_0_0_5_3_2 + 0.00467532467532496*G0_0_0_5_3_3 - 0.0124675324675329*G0_0_0_5_3_4 - 0.0296103896103905*G0_0_0_5_3_5 + 0.0025324675324676*G0_0_0_5_4_0 + 0.00233766233766241*G0_0_0_5_4_1 + 0.00370129870129881*G0_0_0_5_4_2 - 0.0124675324675329*G0_0_0_5_4_3 - 0.0210389610389617*G0_0_0_5_4_4 - 0.0264935064935074*G0_0_0_5_4_5 + 0.00857142857142883*G0_0_0_5_5_0 + 0.000389610389610401*G0_0_0_5_5_1 + 0.0109090909090913*G0_0_0_5_5_2 - 0.0296103896103905*G0_0_0_5_5_3 - 0.0264935064935074*G0_0_0_5_5_4 - 0.0794805194805222*G0_0_0_5_5_5 + 0.000657467532467575*G0_0_1_0_0_0 - 0.000365259740259752*G0_0_1_0_0_1 - 0.000438311688311706*G0_0_1_0_0_2 + 0.00350649350649361*G0_0_1_0_0_3 + 0.00146103896103901*G0_0_1_0_0_4 - 0.000365259740259752*G0_0_1_0_1_0 - 0.000730519480519504*G0_0_1_0_1_1 + 0.000365259740259752*G0_0_1_0_1_2 + 0.000292207792207791*G0_0_1_0_1_3 + 0.000584415584415599*G0_0_1_0_1_4 + 0.00146103896103901*G0_0_1_0_1_5 - 0.000438311688311706*G0_0_1_0_2_0 + 0.000365259740259752*G0_0_1_0_2_1 + 0.000657467532467562*G0_0_1_0_2_2 + 0.00175324675324682*G0_0_1_0_2_3 + 0.000876623376623411*G0_0_1_0_2_4 + 0.00350649350649361*G0_0_1_0_3_0 + 0.000292207792207791*G0_0_1_0_3_1 + 0.00175324675324682*G0_0_1_0_3_2 - 0.0385714285714297*G0_0_1_0_3_3 - 0.00818181818181843*G0_0_1_0_3_4 - 0.00701298701298724*G0_0_1_0_3_5 + 0.00146103896103901*G0_0_1_0_4_0 + 0.000584415584415599*G0_0_1_0_4_1 + 0.000876623376623411*G0_0_1_0_4_2 - 0.00818181818181843*G0_0_1_0_4_3 - 0.0011688311688312*G0_0_1_0_4_5 + 0.00146103896103901*G0_0_1_0_5_1 - 0.00701298701298724*G0_0_1_0_5_3 - 0.0011688311688312*G0_0_1_0_5_4 + 0.00350649350649361*G0_0_1_0_5_5 - 0.000365259740259752*G0_0_1_1_0_0 - 0.000730519480519504*G0_0_1_1_0_1 + 0.000365259740259752*G0_0_1_1_0_2 + 0.000292207792207791*G0_0_1_1_0_3 + 0.000584415584415599*G0_0_1_1_0_4 + 0.00146103896103901*G0_0_1_1_0_5 - 0.000730519480519505*G0_0_1_1_1_0 + 0.0109577922077926*G0_0_1_1_1_1 - 0.00292207792207803*G0_0_1_1_1_2 + 0.0233766233766242*G0_0_1_1_1_3 + 0.00146103896103901*G0_0_1_1_1_4 + 0.000365259740259752*G0_0_1_1_2_0 - 0.00292207792207803*G0_0_1_1_2_1 + 0.00153409090909097*G0_0_1_1_2_2 - 0.0113961038961043*G0_0_1_1_2_3 - 0.000584415584415602*G0_0_1_1_2_4 - 0.00146103896103902*G0_0_1_1_2_5 + 0.000292207792207791*G0_0_1_1_3_0 + 0.0233766233766242*G0_0_1_1_3_1 - 0.0113961038961043*G0_0_1_1_3_2 + 0.0210389610389619*G0_0_1_1_3_3 - 0.0035064935064936*G0_0_1_1_3_4 + 0.00233766233766246*G0_0_1_1_3_5 + 0.000584415584415599*G0_0_1_1_4_0 + 0.00146103896103901*G0_0_1_1_4_1 - 0.000584415584415602*G0_0_1_1_4_2 - 0.0035064935064936*G0_0_1_1_4_3 - 0.0011688311688312*G0_0_1_1_4_4 + 0.00146103896103901*G0_0_1_1_5_0 - 0.00146103896103902*G0_0_1_1_5_2 + 0.00233766233766246*G0_0_1_1_5_3 - 0.00233766233766241*G0_0_1_1_5_5 - 0.000438311688311706*G0_0_1_2_0_0 + 0.000365259740259752*G0_0_1_2_0_1 + 0.000657467532467562*G0_0_1_2_0_2 + 0.00175324675324682*G0_0_1_2_0_3 + 0.000876623376623411*G0_0_1_2_0_4 + 0.000365259740259752*G0_0_1_2_1_0 - 0.00292207792207803*G0_0_1_2_1_1 + 0.00153409090909097*G0_0_1_2_1_2 - 0.0113961038961043*G0_0_1_2_1_3 - 0.000584415584415602*G0_0_1_2_1_4 - 0.00146103896103902*G0_0_1_2_1_5 + 0.000657467532467562*G0_0_1_2_2_0 + 0.00153409090909097*G0_0_1_2_2_1 - 0.0131493506493512*G0_0_1_2_2_2 + 0.00701298701298724*G0_0_1_2_2_3 - 0.00409090909090926*G0_0_1_2_2_4 + 0.00175324675324682*G0_0_1_2_3_0 - 0.0113961038961043*G0_0_1_2_3_1 + 0.00701298701298724*G0_0_1_2_3_2 - 0.0140259740259745*G0_0_1_2_3_3 - 0.00233766233766243*G0_0_1_2_3_4 - 0.00350649350649364*G0_0_1_2_3_5 + 0.000876623376623411*G0_0_1_2_4_0 - 0.000584415584415602*G0_0_1_2_4_1 - 0.00409090909090926*G0_0_1_2_4_2 - 0.00233766233766243*G0_0_1_2_4_3 - 0.00467532467532486*G0_0_1_2_4_4 + 0.0011688311688312*G0_0_1_2_4_5 - 0.00146103896103902*G0_0_1_2_5_1 - 0.00350649350649364*G0_0_1_2_5_3 + 0.0011688311688312*G0_0_1_2_5_4 + 0.00701298701298724*G0_0_1_2_5_5 + 0.00350649350649361*G0_0_1_3_0_0 + 0.000292207792207791*G0_0_1_3_0_1 + 0.00175324675324682*G0_0_1_3_0_2 - 0.0385714285714297*G0_0_1_3_0_3 - 0.00818181818181843*G0_0_1_3_0_4 - 0.00701298701298724*G0_0_1_3_0_5 + 0.000292207792207792*G0_0_1_3_1_0 + 0.0233766233766242*G0_0_1_3_1_1 - 0.0113961038961043*G0_0_1_3_1_2 + 0.0210389610389619*G0_0_1_3_1_3 - 0.0035064935064936*G0_0_1_3_1_4 + 0.00233766233766246*G0_0_1_3_1_5 + 0.00175324675324682*G0_0_1_3_2_0 - 0.0113961038961043*G0_0_1_3_2_1 + 0.00701298701298724*G0_0_1_3_2_2 - 0.0140259740259745*G0_0_1_3_2_3 - 0.00233766233766243*G0_0_1_3_2_4 - 0.00350649350649364*G0_0_1_3_2_5 - 0.0385714285714297*G0_0_1_3_3_0 + 0.0210389610389619*G0_0_1_3_3_1 - 0.0140259740259745*G0_0_1_3_3_2 + 0.673246753246777*G0_0_1_3_3_3 + 0.0841558441558469*G0_0_1_3_3_4 + 0.0841558441558471*G0_0_1_3_3_5 - 0.00818181818181843*G0_0_1_3_4_0 - 0.0035064935064936*G0_0_1_3_4_1 - 0.00233766233766243*G0_0_1_3_4_2 + 0.0841558441558469*G0_0_1_3_4_3 + 0.0187012987012993*G0_0_1_3_4_4 + 0.0140259740259745*G0_0_1_3_4_5 - 0.00701298701298724*G0_0_1_3_5_0 + 0.00233766233766246*G0_0_1_3_5_1 - 0.00350649350649364*G0_0_1_3_5_2 + 0.0841558441558471*G0_0_1_3_5_3 + 0.0140259740259745*G0_0_1_3_5_4 + 0.00146103896103901*G0_0_1_4_0_0 + 0.000584415584415599*G0_0_1_4_0_1 + 0.00087662337662341*G0_0_1_4_0_2 - 0.00818181818181843*G0_0_1_4_0_3 - 0.0011688311688312*G0_0_1_4_0_5 + 0.000584415584415599*G0_0_1_4_1_0 + 0.00146103896103901*G0_0_1_4_1_1 - 0.000584415584415603*G0_0_1_4_1_2 - 0.0035064935064936*G0_0_1_4_1_3 - 0.0011688311688312*G0_0_1_4_1_4 + 0.000876623376623411*G0_0_1_4_2_0 - 0.000584415584415603*G0_0_1_4_2_1 - 0.00409090909090926*G0_0_1_4_2_2 - 0.00233766233766243*G0_0_1_4_2_3 - 0.00467532467532486*G0_0_1_4_2_4 + 0.0011688311688312*G0_0_1_4_2_5 - 0.00818181818181843*G0_0_1_4_3_0 - 0.0035064935064936*G0_0_1_4_3_1 - 0.00233766233766243*G0_0_1_4_3_2 + 0.0841558441558469*G0_0_1_4_3_3 + 0.0187012987012993*G0_0_1_4_3_4 + 0.0140259740259745*G0_0_1_4_3_5 - 0.0011688311688312*G0_0_1_4_4_1 - 0.00467532467532486*G0_0_1_4_4_2 + 0.0187012987012993*G0_0_1_4_4_3 - 0.0011688311688312*G0_0_1_4_5_0 + 0.0011688311688312*G0_0_1_4_5_2 + 0.0140259740259745*G0_0_1_4_5_3 - 0.0140259740259745*G0_0_1_4_5_5 + 0.00146103896103901*G0_0_1_5_0_1 - 0.00701298701298724*G0_0_1_5_0_3 - 0.0011688311688312*G0_0_1_5_0_4 + 0.00350649350649361*G0_0_1_5_0_5 + 0.00146103896103901*G0_0_1_5_1_0 - 0.00146103896103902*G0_0_1_5_1_2 + 0.00233766233766246*G0_0_1_5_1_3 - 0.00233766233766241*G0_0_1_5_1_5 - 0.00146103896103902*G0_0_1_5_2_1 - 0.00350649350649364*G0_0_1_5_2_3 + 0.0011688311688312*G0_0_1_5_2_4 + 0.00701298701298724*G0_0_1_5_2_5 - 0.00701298701298724*G0_0_1_5_3_0 + 0.00233766233766246*G0_0_1_5_3_1 - 0.00350649350649364*G0_0_1_5_3_2 + 0.0841558441558471*G0_0_1_5_3_3 + 0.0140259740259745*G0_0_1_5_3_4 - 0.0011688311688312*G0_0_1_5_4_0 + 0.0011688311688312*G0_0_1_5_4_2 + 0.0140259740259745*G0_0_1_5_4_3 - 0.0140259740259745*G0_0_1_5_4_5 + 0.00350649350649361*G0_0_1_5_5_0 - 0.00233766233766241*G0_0_1_5_5_1 + 0.00701298701298724*G0_0_1_5_5_2 - 0.0140259740259745*G0_0_1_5_5_4 - 0.084155844155847*G0_0_1_5_5_5 - 0.00522321428571438*G0_1_0_0_0_0 + 0.000365259740259747*G0_1_0_0_0_1 + 0.000523538961038976*G0_1_0_0_0_2 - 0.000974025974026002*G0_1_0_0_0_3 - 0.0026785714285715*G0_1_0_0_0_4 - 0.00487012987013001*G0_1_0_0_0_5 + 0.000365259740259747*G0_1_0_0_1_0 - 0.00321428571428581*G0_1_0_0_1_1 - 0.00136363636363641*G0_1_0_0_1_3 + 0.0001948051948052*G0_1_0_0_1_4 + 0.00243506493506501*G0_1_0_0_1_5 + 0.000523538961038976*G0_1_0_0_2_0 + 0.000815746753246772*G0_1_0_0_2_2 + 0.000487012987013002*G0_1_0_0_2_3 + 0.000779220779220798*G0_1_0_0_2_4 - 0.000974025974026006*G0_1_0_0_2_5 - 0.000974025974026002*G0_1_0_0_3_0 - 0.00136363636363641*G0_1_0_0_3_1 + 0.000487012987013002*G0_1_0_0_3_2 - 0.000389610389610404*G0_1_0_0_3_3 + 0.00155844155844161*G0_1_0_0_3_4 + 0.00389610389610402*G0_1_0_0_3_5 - 0.0026785714285715*G0_1_0_0_4_0 + 0.0001948051948052*G0_1_0_0_4_1 + 0.000779220779220798*G0_1_0_0_4_2 + 0.00155844155844161*G0_1_0_0_4_3 + 0.000194805194805196*G0_1_0_0_4_4 + 0.00155844155844161*G0_1_0_0_4_5 - 0.00487012987013001*G0_1_0_0_5_0 + 0.00243506493506501*G0_1_0_0_5_1 - 0.000974025974026006*G0_1_0_0_5_2 + 0.00389610389610402*G0_1_0_0_5_3 + 0.00155844155844161*G0_1_0_0_5_4 + 0.0140259740259745*G0_1_0_0_5_5 + 0.000365259740259747*G0_1_0_1_0_0 - 0.00321428571428581*G0_1_0_1_0_1 - 0.00136363636363641*G0_1_0_1_0_3 + 0.0001948051948052*G0_1_0_1_0_4 + 0.00243506493506501*G0_1_0_1_0_5 - 0.00321428571428581*G0_1_0_1_1_0 + 0.10300324675325*G0_1_0_1_1_1 - 0.00759740259740286*G0_1_0_1_1_2 + 0.0336038961038972*G0_1_0_1_1_3 + 0.000584415584415596*G0_1_0_1_1_4 + 0.0102272727272731*G0_1_0_1_1_5 - 0.00759740259740286*G0_1_0_1_2_1 + 0.00226461038961046*G0_1_0_1_2_2 - 0.00457792207792224*G0_1_0_1_2_3 + 0.000487012987013*G0_1_0_1_2_4 - 0.000194805194805208*G0_1_0_1_2_5 - 0.00136363636363641*G0_1_0_1_3_0 + 0.0336038961038972*G0_1_0_1_3_1 - 0.00457792207792224*G0_1_0_1_3_2 + 0.0319480519480531*G0_1_0_1_3_3 + 0.00155844155844161*G0_1_0_1_3_4 + 0.00311688311688326*G0_1_0_1_3_5 + 0.0001948051948052*G0_1_0_1_4_0 + 0.000584415584415596*G0_1_0_1_4_1 + 0.000487012987013*G0_1_0_1_4_2 + 0.00155844155844161*G0_1_0_1_4_3 + 0.00116883116883121*G0_1_0_1_4_4 - 0.000779220779220803*G0_1_0_1_4_5 + 0.00243506493506501*G0_1_0_1_5_0 + 0.0102272727272731*G0_1_0_1_5_1 - 0.000194805194805208*G0_1_0_1_5_2 + 0.00311688311688326*G0_1_0_1_5_3 - 0.000779220779220803*G0_1_0_1_5_4 - 0.0148051948051953*G0_1_0_1_5_5 + 0.000523538961038975*G0_1_0_2_0_0 + 0.000815746753246772*G0_1_0_2_0_2 + 0.000487012987013002*G0_1_0_2_0_3 + 0.000779220779220798*G0_1_0_2_0_4 - 0.000974025974026006*G0_1_0_2_0_5 - 0.00759740259740286*G0_1_0_2_1_1 + 0.00226461038961046*G0_1_0_2_1_2 - 0.00457792207792224*G0_1_0_2_1_3 + 0.000487012987013*G0_1_0_2_1_4 - 0.000194805194805209*G0_1_0_2_1_5 + 0.000815746753246772*G0_1_0_2_2_0 + 0.00226461038961046*G0_1_0_2_2_1 - 0.00872970779220799*G0_1_0_2_2_2 - 0.00399350649350661*G0_1_0_2_2_3 - 0.00355519480519489*G0_1_0_2_2_4 - 0.00126623376623381*G0_1_0_2_2_5 + 0.000487012987013002*G0_1_0_2_3_0 - 0.00457792207792224*G0_1_0_2_3_1 - 0.00399350649350661*G0_1_0_2_3_2 - 0.0140259740259745*G0_1_0_2_3_3 - 0.00194805194805201*G0_1_0_2_3_4 + 0.0015584415584416*G0_1_0_2_3_5 + 0.000779220779220798*G0_1_0_2_4_0 + 0.000487012987013*G0_1_0_2_4_1 - 0.00355519480519489*G0_1_0_2_4_2 - 0.00194805194805201*G0_1_0_2_4_3 - 0.00214285714285718*G0_1_0_2_4_4 + 0.00155844155844161*G0_1_0_2_4_5 - 0.000974025974026006*G0_1_0_2_5_0 - 0.000194805194805208*G0_1_0_2_5_1 - 0.00126623376623381*G0_1_0_2_5_2 + 0.0015584415584416*G0_1_0_2_5_3 + 0.00155844155844161*G0_1_0_2_5_4 + 0.00896103896103926*G0_1_0_2_5_5 - 0.000974025974026002*G0_1_0_3_0_0 - 0.00136363636363641*G0_1_0_3_0_1 + 0.000487012987013002*G0_1_0_3_0_2 - 0.000389610389610404*G0_1_0_3_0_3 + 0.00155844155844161*G0_1_0_3_0_4 + 0.00389610389610402*G0_1_0_3_0_5 - 0.00136363636363641*G0_1_0_3_1_0 + 0.0336038961038972*G0_1_0_3_1_1 - 0.00457792207792224*G0_1_0_3_1_2 + 0.0319480519480531*G0_1_0_3_1_3 + 0.00155844155844161*G0_1_0_3_1_4 + 0.00311688311688326*G0_1_0_3_1_5 + 0.000487012987013002*G0_1_0_3_2_0 - 0.00457792207792224*G0_1_0_3_2_1 - 0.00399350649350662*G0_1_0_3_2_2 - 0.0140259740259745*G0_1_0_3_2_3 - 0.00194805194805201*G0_1_0_3_2_4 + 0.0015584415584416*G0_1_0_3_2_5 - 0.000389610389610404*G0_1_0_3_3_0 + 0.0319480519480531*G0_1_0_3_3_1 - 0.0140259740259745*G0_1_0_3_3_2 + 0.0771428571428599*G0_1_0_3_3_3 - 0.0023376623376624*G0_1_0_3_3_4 - 0.00233766233766236*G0_1_0_3_3_5 + 0.00155844155844161*G0_1_0_3_4_0 + 0.00155844155844161*G0_1_0_3_4_1 - 0.00194805194805201*G0_1_0_3_4_2 - 0.0023376623376624*G0_1_0_3_4_3 - 0.00545454545454563*G0_1_0_3_4_4 - 0.00623376623376644*G0_1_0_3_4_5 + 0.00389610389610402*G0_1_0_3_5_0 + 0.00311688311688326*G0_1_0_3_5_1 + 0.0015584415584416*G0_1_0_3_5_2 - 0.00233766233766236*G0_1_0_3_5_3 - 0.00623376623376644*G0_1_0_3_5_4 - 0.0257142857142866*G0_1_0_3_5_5 - 0.0026785714285715*G0_1_0_4_0_0 + 0.0001948051948052*G0_1_0_4_0_1 + 0.000779220779220798*G0_1_0_4_0_2 + 0.00155844155844161*G0_1_0_4_0_3 + 0.000194805194805196*G0_1_0_4_0_4 + 0.00155844155844161*G0_1_0_4_0_5 + 0.0001948051948052*G0_1_0_4_1_0 + 0.000584415584415596*G0_1_0_4_1_1 + 0.000487012987013*G0_1_0_4_1_2 + 0.00155844155844161*G0_1_0_4_1_3 + 0.00116883116883121*G0_1_0_4_1_4 - 0.000779220779220803*G0_1_0_4_1_5 + 0.000779220779220798*G0_1_0_4_2_0 + 0.000487012987013001*G0_1_0_4_2_1 - 0.00355519480519489*G0_1_0_4_2_2 - 0.00194805194805201*G0_1_0_4_2_3 - 0.00214285714285718*G0_1_0_4_2_4 + 0.00155844155844161*G0_1_0_4_2_5 + 0.00155844155844161*G0_1_0_4_3_0 + 0.00155844155844161*G0_1_0_4_3_1 - 0.00194805194805201*G0_1_0_4_3_2 - 0.0023376623376624*G0_1_0_4_3_3 - 0.00545454545454563*G0_1_0_4_3_4 - 0.00623376623376644*G0_1_0_4_3_5 + 0.000194805194805195*G0_1_0_4_4_0 + 0.00116883116883121*G0_1_0_4_4_1 - 0.00214285714285718*G0_1_0_4_4_2 - 0.00545454545454563*G0_1_0_4_4_3 - 0.0140259740259744*G0_1_0_4_4_4 - 0.00545454545454564*G0_1_0_4_4_5 + 0.00155844155844161*G0_1_0_4_5_0 - 0.000779220779220803*G0_1_0_4_5_1 + 0.00155844155844161*G0_1_0_4_5_2 - 0.00623376623376644*G0_1_0_4_5_3 - 0.00545454545454564*G0_1_0_4_5_4 - 0.0163636363636369*G0_1_0_4_5_5 - 0.00487012987013001*G0_1_0_5_0_0 + 0.00243506493506501*G0_1_0_5_0_1 - 0.000974025974026006*G0_1_0_5_0_2 + 0.00389610389610402*G0_1_0_5_0_3 + 0.00155844155844161*G0_1_0_5_0_4 + 0.0140259740259745*G0_1_0_5_0_5 + 0.00243506493506501*G0_1_0_5_1_0 + 0.0102272727272731*G0_1_0_5_1_1 - 0.000194805194805208*G0_1_0_5_1_2 + 0.00311688311688326*G0_1_0_5_1_3 - 0.000779220779220803*G0_1_0_5_1_4 - 0.0148051948051953*G0_1_0_5_1_5 - 0.000974025974026006*G0_1_0_5_2_0 - 0.000194805194805208*G0_1_0_5_2_1 - 0.00126623376623381*G0_1_0_5_2_2 + 0.0015584415584416*G0_1_0_5_2_3 + 0.00155844155844161*G0_1_0_5_2_4 + 0.00896103896103926*G0_1_0_5_2_5 + 0.00389610389610402*G0_1_0_5_3_0 + 0.00311688311688326*G0_1_0_5_3_1 + 0.0015584415584416*G0_1_0_5_3_2 - 0.00233766233766236*G0_1_0_5_3_3 - 0.00623376623376644*G0_1_0_5_3_4 - 0.0257142857142866*G0_1_0_5_3_5 + 0.00155844155844161*G0_1_0_5_4_0 - 0.000779220779220803*G0_1_0_5_4_1 + 0.00155844155844161*G0_1_0_5_4_2 - 0.00623376623376644*G0_1_0_5_4_3 - 0.00545454545454564*G0_1_0_5_4_4 - 0.0163636363636369*G0_1_0_5_4_5 + 0.0140259740259745*G0_1_0_5_5_0 - 0.0148051948051953*G0_1_0_5_5_1 + 0.00896103896103926*G0_1_0_5_5_2 - 0.0257142857142866*G0_1_0_5_5_3 - 0.0163636363636369*G0_1_0_5_5_4 - 0.133246753246758*G0_1_0_5_5_5 + 0.00350649350649361*G0_1_1_0_0_0 - 0.00189935064935071*G0_1_1_0_0_1 - 0.000292207792207801*G0_1_1_0_0_2 + 0.000292207792207801*G0_1_1_0_0_3 + 0.000876623376623403*G0_1_1_0_0_4 - 0.000876623376623414*G0_1_1_0_0_5 - 0.00189935064935071*G0_1_1_0_1_0 + 0.00438311688311704*G0_1_1_0_1_1 - 0.00116883116883121*G0_1_1_0_1_3 - 0.000292207792207802*G0_1_1_0_1_4 + 0.00701298701298725*G0_1_1_0_1_5 - 0.000292207792207801*G0_1_1_0_2_0 + 0.0002922077922078*G0_1_1_0_2_2 + 0.00146103896103901*G0_1_1_0_2_3 - 0.00146103896103901*G0_1_1_0_2_5 + 0.000292207792207801*G0_1_1_0_3_0 - 0.00116883116883121*G0_1_1_0_3_1 + 0.00146103896103901*G0_1_1_0_3_2 - 0.00935064935064965*G0_1_1_0_3_3 + 0.00233766233766241*G0_1_1_0_3_5 + 0.000876623376623403*G0_1_1_0_4_0 - 0.000292207792207802*G0_1_1_0_4_1 + 0.00233766233766241*G0_1_1_0_4_4 + 0.00350649350649361*G0_1_1_0_4_5 - 0.000876623376623414*G0_1_1_0_5_0 + 0.00701298701298725*G0_1_1_0_5_1 - 0.00146103896103901*G0_1_1_0_5_2 + 0.00233766233766241*G0_1_1_0_5_3 + 0.00350649350649361*G0_1_1_0_5_4 + 0.028051948051949*G0_1_1_0_5_5 - 0.00189935064935071*G0_1_1_1_0_0 + 0.00438311688311704*G0_1_1_1_0_1 - 0.00116883116883121*G0_1_1_1_0_3 - 0.000292207792207802*G0_1_1_1_0_4 + 0.00701298701298725*G0_1_1_1_0_5 + 0.00438311688311704*G0_1_1_1_1_0 - 0.00438311688311703*G0_1_1_1_1_2 + 0.0233766233766242*G0_1_1_1_1_3 - 0.0233766233766242*G0_1_1_1_1_5 - 0.00438311688311703*G0_1_1_1_2_1 + 0.00189935064935072*G0_1_1_1_2_2 - 0.00701298701298727*G0_1_1_1_2_3 + 0.0002922077922078*G0_1_1_1_2_4 + 0.0011688311688312*G0_1_1_1_2_5 - 0.00116883116883121*G0_1_1_1_3_0 + 0.0233766233766242*G0_1_1_1_3_1 - 0.00701298701298727*G0_1_1_1_3_2 + 0.0467532467532484*G0_1_1_1_3_3 + 0.00233766233766242*G0_1_1_1_3_4 - 0.000292207792207802*G0_1_1_1_4_0 + 0.0002922077922078*G0_1_1_1_4_2 + 0.00233766233766242*G0_1_1_1_4_3 - 0.0023376623376624*G0_1_1_1_4_5 + 0.00701298701298725*G0_1_1_1_5_0 - 0.0233766233766242*G0_1_1_1_5_1 + 0.0011688311688312*G0_1_1_1_5_2 - 0.0023376623376624*G0_1_1_1_5_4 - 0.0467532467532484*G0_1_1_1_5_5 - 0.000292207792207801*G0_1_1_2_0_0 + 0.0002922077922078*G0_1_1_2_0_2 + 0.00146103896103901*G0_1_1_2_0_3 - 0.00146103896103901*G0_1_1_2_0_5 - 0.00438311688311703*G0_1_1_2_1_1 + 0.00189935064935072*G0_1_1_2_1_2 - 0.00701298701298727*G0_1_1_2_1_3 + 0.0002922077922078*G0_1_1_2_1_4 + 0.0011688311688312*G0_1_1_2_1_5 + 0.0002922077922078*G0_1_1_2_2_0 + 0.00189935064935072*G0_1_1_2_2_1 - 0.00350649350649362*G0_1_1_2_2_2 + 0.00087662337662341*G0_1_1_2_2_3 - 0.000876623376623403*G0_1_1_2_2_4 - 0.000292207792207801*G0_1_1_2_2_5 + 0.00146103896103901*G0_1_1_2_3_0 - 0.00701298701298727*G0_1_1_2_3_1 + 0.00087662337662341*G0_1_1_2_3_2 - 0.0280519480519491*G0_1_1_2_3_3 - 0.00350649350649363*G0_1_1_2_3_4 - 0.00233766233766243*G0_1_1_2_3_5 + 0.0002922077922078*G0_1_1_2_4_1 - 0.000876623376623403*G0_1_1_2_4_2 - 0.00350649350649363*G0_1_1_2_4_3 - 0.00233766233766241*G0_1_1_2_4_4 - 0.00146103896103901*G0_1_1_2_5_0 + 0.0011688311688312*G0_1_1_2_5_1 - 0.000292207792207801*G0_1_1_2_5_2 - 0.00233766233766243*G0_1_1_2_5_3 + 0.00935064935064968*G0_1_1_2_5_5 + 0.000292207792207801*G0_1_1_3_0_0 - 0.00116883116883121*G0_1_1_3_0_1 + 0.00146103896103901*G0_1_1_3_0_2 - 0.00935064935064965*G0_1_1_3_0_3 + 0.00233766233766241*G0_1_1_3_0_5 - 0.00116883116883121*G0_1_1_3_1_0 + 0.0233766233766242*G0_1_1_3_1_1 - 0.00701298701298727*G0_1_1_3_1_2 + 0.0467532467532484*G0_1_1_3_1_3 + 0.00233766233766242*G0_1_1_3_1_4 + 0.00146103896103901*G0_1_1_3_2_0 - 0.00701298701298727*G0_1_1_3_2_1 + 0.00087662337662341*G0_1_1_3_2_2 - 0.0280519480519491*G0_1_1_3_2_3 - 0.00350649350649363*G0_1_1_3_2_4 - 0.00233766233766243*G0_1_1_3_2_5 - 0.00935064935064965*G0_1_1_3_3_0 + 0.0467532467532484*G0_1_1_3_3_1 - 0.0280519480519491*G0_1_1_3_3_2 + 0.210389610389618*G0_1_1_3_3_3 + 0.0140259740259745*G0_1_1_3_3_4 + 0.0233766233766243*G0_1_1_3_3_5 + 0.00233766233766242*G0_1_1_3_4_1 - 0.00350649350649363*G0_1_1_3_4_2 + 0.0140259740259745*G0_1_1_3_4_3 + 0.00233766233766241*G0_1_1_3_5_0 - 0.00233766233766243*G0_1_1_3_5_2 + 0.0233766233766243*G0_1_1_3_5_3 - 0.0233766233766242*G0_1_1_3_5_5 + 0.000876623376623403*G0_1_1_4_0_0 - 0.000292207792207802*G0_1_1_4_0_1 + 0.00233766233766241*G0_1_1_4_0_4 + 0.00350649350649361*G0_1_1_4_0_5 - 0.000292207792207802*G0_1_1_4_1_0 + 0.000292207792207799*G0_1_1_4_1_2 + 0.00233766233766242*G0_1_1_4_1_3 - 0.0023376623376624*G0_1_1_4_1_5 + 0.0002922077922078*G0_1_1_4_2_1 - 0.000876623376623403*G0_1_1_4_2_2 - 0.00350649350649363*G0_1_1_4_2_3 - 0.00233766233766241*G0_1_1_4_2_4 + 0.00233766233766242*G0_1_1_4_3_1 - 0.00350649350649363*G0_1_1_4_3_2 + 0.0140259740259745*G0_1_1_4_3_3 + 0.00233766233766241*G0_1_1_4_4_0 - 0.00233766233766241*G0_1_1_4_4_2 + 0.00350649350649361*G0_1_1_4_5_0 - 0.0023376623376624*G0_1_1_4_5_1 - 0.0140259740259745*G0_1_1_4_5_5 - 0.000876623376623414*G0_1_1_5_0_0 + 0.00701298701298725*G0_1_1_5_0_1 - 0.00146103896103901*G0_1_1_5_0_2 + 0.00233766233766241*G0_1_1_5_0_3 + 0.00350649350649361*G0_1_1_5_0_4 + 0.028051948051949*G0_1_1_5_0_5 + 0.00701298701298725*G0_1_1_5_1_0 - 0.0233766233766242*G0_1_1_5_1_1 + 0.0011688311688312*G0_1_1_5_1_2 - 0.0023376623376624*G0_1_1_5_1_4 - 0.0467532467532484*G0_1_1_5_1_5 - 0.00146103896103901*G0_1_1_5_2_0 + 0.0011688311688312*G0_1_1_5_2_1 - 0.000292207792207801*G0_1_1_5_2_2 - 0.00233766233766243*G0_1_1_5_2_3 + 0.00935064935064968*G0_1_1_5_2_5 + 0.00233766233766241*G0_1_1_5_3_0 - 0.00233766233766243*G0_1_1_5_3_2 + 0.0233766233766243*G0_1_1_5_3_3 - 0.0233766233766242*G0_1_1_5_3_5 + 0.00350649350649361*G0_1_1_5_4_0 - 0.0023376623376624*G0_1_1_5_4_1 - 0.0140259740259745*G0_1_1_5_4_5 + 0.028051948051949*G0_1_1_5_5_0 - 0.0467532467532484*G0_1_1_5_5_1 + 0.00935064935064968*G0_1_1_5_5_2 - 0.0233766233766242*G0_1_1_5_5_3 - 0.0140259740259745*G0_1_1_5_5_4 - 0.210389610389618*G0_1_1_5_5_5; + A[36] = -A[34] + 0.000255681818181874*G0_0_1_0_0_0 - 0.000572240259740278*G0_0_1_0_0_1 + 0.00487012987013001*G0_0_1_0_0_3 + 0.000681818181818204*G0_0_1_0_0_4 + 0.00199675324675332*G0_0_1_0_0_5 - 0.000572240259740278*G0_0_1_0_1_0 + 0.000231331168831177*G0_0_1_0_1_1 + 0.000121753246753251*G0_0_1_0_1_2 + 0.001948051948052*G0_0_1_0_1_3 + 0.00165584415584421*G0_0_1_0_1_4 + 0.00224025974025981*G0_0_1_0_1_5 + 0.000121753246753251*G0_0_1_0_2_1 - 0.00547889610389629*G0_0_1_0_2_2 + 0.00243506493506501*G0_0_1_0_2_3 + 0.000974025974026*G0_0_1_0_2_4 + 0.00194805194805201*G0_0_1_0_2_5 + 0.00487012987013001*G0_0_1_0_3_0 + 0.001948051948052*G0_0_1_0_3_1 + 0.00243506493506501*G0_0_1_0_3_2 - 0.0372077922077934*G0_0_1_0_3_3 - 0.0130519480519485*G0_0_1_0_3_4 - 0.0136363636363641*G0_0_1_0_3_5 + 0.000681818181818204*G0_0_1_0_4_0 + 0.00165584415584421*G0_0_1_0_4_1 + 0.000974025974026*G0_0_1_0_4_2 - 0.0130519480519485*G0_0_1_0_4_3 - 0.00876623376623406*G0_0_1_0_4_4 - 0.00720779220779243*G0_0_1_0_4_5 + 0.00199675324675332*G0_0_1_0_5_0 + 0.00224025974025981*G0_0_1_0_5_1 + 0.00194805194805201*G0_0_1_0_5_2 - 0.0136363636363641*G0_0_1_0_5_3 - 0.00720779220779243*G0_0_1_0_5_4 - 0.00623376623376644*G0_0_1_0_5_5 - 0.000572240259740278*G0_0_1_1_0_0 + 0.000231331168831177*G0_0_1_1_0_1 + 0.000121753246753251*G0_0_1_1_0_2 + 0.001948051948052*G0_0_1_1_0_3 + 0.00165584415584421*G0_0_1_1_0_4 + 0.00224025974025981*G0_0_1_1_0_5 + 0.000231331168831177*G0_0_1_1_1_0 - 0.0100446428571432*G0_0_1_1_1_1 + 0.00681818181818207*G0_0_1_1_1_3 + 0.00165584415584421*G0_0_1_1_1_4 - 0.00267857142857152*G0_0_1_1_1_5 + 0.000121753246753251*G0_0_1_1_2_0 - 0.00328733766233777*G0_0_1_1_2_2 - 0.00487012987013005*G0_0_1_1_2_3 - 0.000487012987013007*G0_0_1_1_2_4 + 0.000487012987012999*G0_0_1_1_2_5 + 0.001948051948052*G0_0_1_1_3_0 + 0.00681818181818207*G0_0_1_1_3_1 - 0.00487012987013005*G0_0_1_1_3_2 + 0.00175324675324692*G0_0_1_1_3_3 - 0.00720779220779242*G0_0_1_1_3_4 - 0.00487012987013001*G0_0_1_1_3_5 + 0.00165584415584421*G0_0_1_1_4_0 + 0.00165584415584421*G0_0_1_1_4_1 - 0.000487012987013006*G0_0_1_1_4_2 - 0.00720779220779242*G0_0_1_1_4_3 - 0.000974025974025998*G0_0_1_1_4_4 - 0.00428571428571442*G0_0_1_1_4_5 + 0.00224025974025981*G0_0_1_1_5_0 - 0.00267857142857152*G0_0_1_1_5_1 + 0.000487012987012999*G0_0_1_1_5_2 - 0.00487012987013001*G0_0_1_1_5_3 - 0.00428571428571442*G0_0_1_1_5_4 - 0.00857142857142885*G0_0_1_1_5_5 + 0.000121753246753251*G0_0_1_2_0_1 - 0.00547889610389629*G0_0_1_2_0_2 + 0.00243506493506501*G0_0_1_2_0_3 + 0.000974025974026*G0_0_1_2_0_4 + 0.00194805194805201*G0_0_1_2_0_5 + 0.000121753246753251*G0_0_1_2_1_0 - 0.00328733766233777*G0_0_1_2_1_2 - 0.00487012987013005*G0_0_1_2_1_3 - 0.000487012987013007*G0_0_1_2_1_4 + 0.000487012987012999*G0_0_1_2_1_5 - 0.00547889610389629*G0_0_1_2_2_0 - 0.00328733766233777*G0_0_1_2_2_1 + 0.0854707792207821*G0_0_1_2_2_2 + 0.0204545454545462*G0_0_1_2_2_3 + 0.0204545454545462*G0_0_1_2_2_4 + 0.00292207792207803*G0_0_1_2_2_5 + 0.00243506493506501*G0_0_1_2_3_0 - 0.00487012987013005*G0_0_1_2_3_1 + 0.0204545454545462*G0_0_1_2_3_2 - 0.0194805194805201*G0_0_1_2_3_3 - 0.00389610389610401*G0_0_1_2_3_4 - 0.0107142857142861*G0_0_1_2_3_5 + 0.000974025974026*G0_0_1_2_4_0 - 0.000487012987013007*G0_0_1_2_4_1 + 0.0204545454545462*G0_0_1_2_4_2 - 0.00389610389610401*G0_0_1_2_4_3 + 0.00389610389610406*G0_0_1_2_4_4 - 0.00487012987013003*G0_0_1_2_4_5 + 0.00194805194805201*G0_0_1_2_5_0 + 0.000487012987012999*G0_0_1_2_5_1 + 0.00292207792207804*G0_0_1_2_5_2 - 0.0107142857142861*G0_0_1_2_5_3 - 0.00487012987013003*G0_0_1_2_5_4 - 0.00584415584415604*G0_0_1_2_5_5 + 0.00487012987013001*G0_0_1_3_0_0 + 0.001948051948052*G0_0_1_3_0_1 + 0.00243506493506501*G0_0_1_3_0_2 - 0.0372077922077934*G0_0_1_3_0_3 - 0.0130519480519485*G0_0_1_3_0_4 - 0.0136363636363641*G0_0_1_3_0_5 + 0.001948051948052*G0_0_1_3_1_0 + 0.00681818181818207*G0_0_1_3_1_1 - 0.00487012987013005*G0_0_1_3_1_2 + 0.00175324675324692*G0_0_1_3_1_3 - 0.00720779220779242*G0_0_1_3_1_4 - 0.00487012987013001*G0_0_1_3_1_5 + 0.00243506493506501*G0_0_1_3_2_0 - 0.00487012987013005*G0_0_1_3_2_1 + 0.0204545454545462*G0_0_1_3_2_2 - 0.0194805194805201*G0_0_1_3_2_3 - 0.00389610389610401*G0_0_1_3_2_4 - 0.0107142857142861*G0_0_1_3_2_5 - 0.0372077922077934*G0_0_1_3_3_0 + 0.00175324675324692*G0_0_1_3_3_1 - 0.0194805194805201*G0_0_1_3_3_2 + 0.448831168831184*G0_0_1_3_3_3 + 0.0888311688311717*G0_0_1_3_3_4 + 0.0958441558441591*G0_0_1_3_3_5 - 0.0130519480519485*G0_0_1_3_4_0 - 0.00720779220779242*G0_0_1_3_4_1 - 0.00389610389610401*G0_0_1_3_4_2 + 0.0888311688311717*G0_0_1_3_4_3 + 0.0280519480519489*G0_0_1_3_4_4 + 0.035844155844157*G0_0_1_3_4_5 - 0.0136363636363641*G0_0_1_3_5_0 - 0.00487012987013001*G0_0_1_3_5_1 - 0.0107142857142861*G0_0_1_3_5_2 + 0.0958441558441591*G0_0_1_3_5_3 + 0.035844155844157*G0_0_1_3_5_4 + 0.0389610389610403*G0_0_1_3_5_5 + 0.000681818181818204*G0_0_1_4_0_0 + 0.00165584415584421*G0_0_1_4_0_1 + 0.000974025974026*G0_0_1_4_0_2 - 0.0130519480519485*G0_0_1_4_0_3 - 0.00876623376623406*G0_0_1_4_0_4 - 0.00720779220779243*G0_0_1_4_0_5 + 0.00165584415584421*G0_0_1_4_1_0 + 0.00165584415584421*G0_0_1_4_1_1 - 0.000487012987013007*G0_0_1_4_1_2 - 0.00720779220779242*G0_0_1_4_1_3 - 0.000974025974025998*G0_0_1_4_1_4 - 0.00428571428571442*G0_0_1_4_1_5 + 0.000974025974026*G0_0_1_4_2_0 - 0.000487012987013007*G0_0_1_4_2_1 + 0.0204545454545462*G0_0_1_4_2_2 - 0.00389610389610401*G0_0_1_4_2_3 + 0.00389610389610406*G0_0_1_4_2_4 - 0.00487012987013003*G0_0_1_4_2_5 - 0.0130519480519485*G0_0_1_4_3_0 - 0.00720779220779242*G0_0_1_4_3_1 - 0.00389610389610401*G0_0_1_4_3_2 + 0.0888311688311717*G0_0_1_4_3_3 + 0.0280519480519489*G0_0_1_4_3_4 + 0.035844155844157*G0_0_1_4_3_5 - 0.00876623376623406*G0_0_1_4_4_0 - 0.000974025974025998*G0_0_1_4_4_1 + 0.00389610389610406*G0_0_1_4_4_2 + 0.0280519480519489*G0_0_1_4_4_3 - 0.0981818181818213*G0_0_1_4_4_4 + 0.011688311688312*G0_0_1_4_4_5 - 0.00720779220779243*G0_0_1_4_5_0 - 0.00428571428571442*G0_0_1_4_5_1 - 0.00487012987013002*G0_0_1_4_5_2 + 0.035844155844157*G0_0_1_4_5_3 + 0.011688311688312*G0_0_1_4_5_4 + 0.0202597402597409*G0_0_1_4_5_5 + 0.00199675324675332*G0_0_1_5_0_0 + 0.00224025974025981*G0_0_1_5_0_1 + 0.00194805194805201*G0_0_1_5_0_2 - 0.0136363636363641*G0_0_1_5_0_3 - 0.00720779220779243*G0_0_1_5_0_4 - 0.00623376623376644*G0_0_1_5_0_5 + 0.00224025974025981*G0_0_1_5_1_0 - 0.00267857142857152*G0_0_1_5_1_1 + 0.000487012987012999*G0_0_1_5_1_2 - 0.00487012987013001*G0_0_1_5_1_3 - 0.00428571428571442*G0_0_1_5_1_4 - 0.00857142857142885*G0_0_1_5_1_5 + 0.00194805194805201*G0_0_1_5_2_0 + 0.000487012987012999*G0_0_1_5_2_1 + 0.00292207792207804*G0_0_1_5_2_2 - 0.0107142857142861*G0_0_1_5_2_3 - 0.00487012987013003*G0_0_1_5_2_4 - 0.00584415584415604*G0_0_1_5_2_5 - 0.0136363636363641*G0_0_1_5_3_0 - 0.00487012987013001*G0_0_1_5_3_1 - 0.0107142857142861*G0_0_1_5_3_2 + 0.0958441558441591*G0_0_1_5_3_3 + 0.035844155844157*G0_0_1_5_3_4 + 0.0389610389610403*G0_0_1_5_3_5 - 0.00720779220779243*G0_0_1_5_4_0 - 0.00428571428571442*G0_0_1_5_4_1 - 0.00487012987013003*G0_0_1_5_4_2 + 0.035844155844157*G0_0_1_5_4_3 + 0.011688311688312*G0_0_1_5_4_4 + 0.0202597402597409*G0_0_1_5_4_5 - 0.00623376623376644*G0_0_1_5_5_0 - 0.00857142857142885*G0_0_1_5_5_1 - 0.00584415584415604*G0_0_1_5_5_2 + 0.0389610389610403*G0_0_1_5_5_3 + 0.0202597402597409*G0_0_1_5_5_4 + 0.00398133116883126*G0_1_1_0_0_0 - 0.00209415584415591*G0_1_1_0_0_1 - 0.000206980519480525*G0_1_1_0_0_2 + 0.000487012987013003*G0_1_1_0_0_3 + 0.000243506493506497*G0_1_1_0_0_4 - 0.00209415584415591*G0_1_1_0_1_0 + 0.00999594155844189*G0_1_1_0_1_1 - 0.000438311688311703*G0_1_1_0_1_2 + 0.00102272727272731*G0_1_1_0_1_3 + 0.00808441558441586*G0_1_1_0_1_5 - 0.000206980519480525*G0_1_1_0_2_0 - 0.000438311688311703*G0_1_1_0_2_1 - 0.000365259740259749*G0_1_1_0_2_2 + 0.00121753246753251*G0_1_1_0_2_3 + 0.000487012987013006*G0_1_1_0_2_4 - 0.000292207792207799*G0_1_1_0_2_5 + 0.000487012987013003*G0_1_1_0_3_0 + 0.00102272727272731*G0_1_1_0_3_1 + 0.00121753246753251*G0_1_1_0_3_2 - 0.00798701298701325*G0_1_1_0_3_3 - 0.000779220779220811*G0_1_1_0_3_4 - 0.00038961038961041*G0_1_1_0_3_5 + 0.000243506493506497*G0_1_1_0_4_0 + 0.000487012987013006*G0_1_1_0_4_2 - 0.000779220779220811*G0_1_1_0_4_3 + 0.000974025974025991*G0_1_1_0_4_4 + 0.000779220779220793*G0_1_1_0_4_5 + 0.00808441558441586*G0_1_1_0_5_1 - 0.0002922077922078*G0_1_1_0_5_2 - 0.000389610389610409*G0_1_1_0_5_3 + 0.000779220779220793*G0_1_1_0_5_4 + 0.0175324675324681*G0_1_1_0_5_5 - 0.00209415584415591*G0_1_1_1_0_0 + 0.0099959415584419*G0_1_1_1_0_1 - 0.000438311688311703*G0_1_1_1_0_2 + 0.00102272727272731*G0_1_1_1_0_3 + 0.00808441558441586*G0_1_1_1_0_5 + 0.0099959415584419*G0_1_1_1_1_0 - 0.119805194805199*G0_1_1_1_1_1 + 0.00451704545454561*G0_1_1_1_1_2 - 0.0155844155844161*G0_1_1_1_1_3 - 0.0020941558441559*G0_1_1_1_1_4 - 0.0457792207792225*G0_1_1_1_1_5 - 0.000438311688311703*G0_1_1_1_2_0 + 0.00451704545454561*G0_1_1_1_2_1 - 0.000243506493506497*G0_1_1_1_2_2 - 0.00146103896103902*G0_1_1_1_2_3 - 0.000243506493506502*G0_1_1_1_2_4 + 0.00228896103896112*G0_1_1_1_2_5 + 0.00102272727272731*G0_1_1_1_3_0 - 0.0155844155844161*G0_1_1_1_3_1 - 0.00146103896103902*G0_1_1_1_3_2 + 0.012467532467533*G0_1_1_1_3_3 + 0.00214285714285722*G0_1_1_1_3_4 - 0.00662337662337686*G0_1_1_1_3_5 - 0.0020941558441559*G0_1_1_1_4_1 - 0.000243506493506502*G0_1_1_1_4_2 + 0.00214285714285722*G0_1_1_1_4_3 + 0.00389610389610402*G0_1_1_1_4_4 - 0.000389610389610398*G0_1_1_1_4_5 + 0.00808441558441586*G0_1_1_1_5_0 - 0.0457792207792225*G0_1_1_1_5_1 + 0.00228896103896112*G0_1_1_1_5_2 - 0.00662337662337686*G0_1_1_1_5_3 - 0.000389610389610397*G0_1_1_1_5_4 - 0.0459740259740276*G0_1_1_1_5_5 - 0.000206980519480525*G0_1_1_2_0_0 - 0.000438311688311703*G0_1_1_2_0_1 - 0.000365259740259749*G0_1_1_2_0_2 + 0.00121753246753251*G0_1_1_2_0_3 + 0.000487012987013006*G0_1_1_2_0_4 - 0.0002922077922078*G0_1_1_2_0_5 - 0.000438311688311703*G0_1_1_2_1_0 + 0.00451704545454561*G0_1_1_2_1_1 - 0.000243506493506497*G0_1_1_2_1_2 - 0.00146103896103902*G0_1_1_2_1_3 - 0.000243506493506502*G0_1_1_2_1_4 + 0.00228896103896112*G0_1_1_2_1_5 - 0.000365259740259749*G0_1_1_2_2_0 - 0.000243506493506497*G0_1_1_2_2_1 + 0.0040178571428572*G0_1_1_2_2_2 + 0.00365259740259752*G0_1_1_2_2_3 + 0.000730519480519491*G0_1_1_2_2_4 + 0.000243506493506504*G0_1_1_2_2_5 + 0.00121753246753251*G0_1_1_2_3_0 - 0.00146103896103902*G0_1_1_2_3_1 + 0.00365259740259752*G0_1_1_2_3_2 - 0.0146103896103901*G0_1_1_2_3_3 - 0.00194805194805202*G0_1_1_2_3_4 - 0.00292207792207803*G0_1_1_2_3_5 + 0.000487012987013006*G0_1_1_2_4_0 - 0.000243506493506502*G0_1_1_2_4_1 + 0.000730519480519491*G0_1_1_2_4_2 - 0.00194805194805202*G0_1_1_2_4_3 + 0.000974025974025999*G0_1_1_2_4_4 - 0.000292207792207799*G0_1_1_2_5_0 + 0.00228896103896112*G0_1_1_2_5_1 + 0.000243506493506504*G0_1_1_2_5_2 - 0.00292207792207803*G0_1_1_2_5_3 + 0.00389610389610403*G0_1_1_2_5_5 + 0.000487012987013003*G0_1_1_3_0_0 + 0.00102272727272731*G0_1_1_3_0_1 + 0.00121753246753251*G0_1_1_3_0_2 - 0.00798701298701325*G0_1_1_3_0_3 - 0.000779220779220811*G0_1_1_3_0_4 - 0.000389610389610409*G0_1_1_3_0_5 + 0.00102272727272731*G0_1_1_3_1_0 - 0.0155844155844161*G0_1_1_3_1_1 - 0.00146103896103902*G0_1_1_3_1_2 + 0.0124675324675329*G0_1_1_3_1_3 + 0.00214285714285722*G0_1_1_3_1_4 - 0.00662337662337686*G0_1_1_3_1_5 + 0.00121753246753251*G0_1_1_3_2_0 - 0.00146103896103902*G0_1_1_3_2_1 + 0.00365259740259752*G0_1_1_3_2_2 - 0.0146103896103901*G0_1_1_3_2_3 - 0.00194805194805202*G0_1_1_3_2_4 - 0.00292207792207803*G0_1_1_3_2_5 - 0.00798701298701325*G0_1_1_3_3_0 + 0.0124675324675329*G0_1_1_3_3_1 - 0.0146103896103901*G0_1_1_3_3_2 + 0.130909090909095*G0_1_1_3_3_3 + 0.0116883116883121*G0_1_1_3_3_4 + 0.0218181818181826*G0_1_1_3_3_5 - 0.000779220779220811*G0_1_1_3_4_0 + 0.00214285714285722*G0_1_1_3_4_1 - 0.00194805194805202*G0_1_1_3_4_2 + 0.0116883116883121*G0_1_1_3_4_3 - 0.00623376623376641*G0_1_1_3_4_4 + 0.00155844155844163*G0_1_1_3_4_5 - 0.00038961038961041*G0_1_1_3_5_0 - 0.00662337662337686*G0_1_1_3_5_1 - 0.00292207792207803*G0_1_1_3_5_2 + 0.0218181818181826*G0_1_1_3_5_3 + 0.00155844155844164*G0_1_1_3_5_4 - 0.00701298701298723*G0_1_1_3_5_5 + 0.000243506493506497*G0_1_1_4_0_0 + 0.000487012987013006*G0_1_1_4_0_2 - 0.000779220779220811*G0_1_1_4_0_3 + 0.000974025974025991*G0_1_1_4_0_4 + 0.000779220779220793*G0_1_1_4_0_5 - 0.0020941558441559*G0_1_1_4_1_1 - 0.000243506493506502*G0_1_1_4_1_2 + 0.00214285714285722*G0_1_1_4_1_3 + 0.00389610389610402*G0_1_1_4_1_4 - 0.000389610389610398*G0_1_1_4_1_5 + 0.000487012987013006*G0_1_1_4_2_0 - 0.000243506493506502*G0_1_1_4_2_1 + 0.000730519480519491*G0_1_1_4_2_2 - 0.00194805194805202*G0_1_1_4_2_3 + 0.000974025974025999*G0_1_1_4_2_4 - 0.000779220779220811*G0_1_1_4_3_0 + 0.00214285714285722*G0_1_1_4_3_1 - 0.00194805194805202*G0_1_1_4_3_2 + 0.0116883116883121*G0_1_1_4_3_3 - 0.00623376623376641*G0_1_1_4_3_4 + 0.00155844155844163*G0_1_1_4_3_5 + 0.000974025974025991*G0_1_1_4_4_0 + 0.00389610389610402*G0_1_1_4_4_1 + 0.000974025974025999*G0_1_1_4_4_2 - 0.00623376623376641*G0_1_1_4_4_3 - 0.0303896103896113*G0_1_1_4_4_4 - 0.00779220779220803*G0_1_1_4_4_5 + 0.000779220779220793*G0_1_1_4_5_0 - 0.000389610389610397*G0_1_1_4_5_1 + 0.00155844155844164*G0_1_1_4_5_3 - 0.00779220779220803*G0_1_1_4_5_4 - 0.00701298701298722*G0_1_1_4_5_5 + 0.00808441558441586*G0_1_1_5_0_1 - 0.000292207792207799*G0_1_1_5_0_2 - 0.000389610389610409*G0_1_1_5_0_3 + 0.000779220779220793*G0_1_1_5_0_4 + 0.0175324675324681*G0_1_1_5_0_5 + 0.00808441558441586*G0_1_1_5_1_0 - 0.0457792207792225*G0_1_1_5_1_1 + 0.00228896103896112*G0_1_1_5_1_2 - 0.00662337662337686*G0_1_1_5_1_3 - 0.000389610389610398*G0_1_1_5_1_4 - 0.0459740259740276*G0_1_1_5_1_5 - 0.000292207792207799*G0_1_1_5_2_0 + 0.00228896103896112*G0_1_1_5_2_1 + 0.000243506493506504*G0_1_1_5_2_2 - 0.00292207792207803*G0_1_1_5_2_3 + 0.00389610389610403*G0_1_1_5_2_5 - 0.00038961038961041*G0_1_1_5_3_0 - 0.00662337662337686*G0_1_1_5_3_1 - 0.00292207792207803*G0_1_1_5_3_2 + 0.0218181818181826*G0_1_1_5_3_3 + 0.00155844155844164*G0_1_1_5_3_4 - 0.00701298701298723*G0_1_1_5_3_5 + 0.000779220779220793*G0_1_1_5_4_0 - 0.000389610389610398*G0_1_1_5_4_1 + 0.00155844155844163*G0_1_1_5_4_3 - 0.00779220779220803*G0_1_1_5_4_4 - 0.00701298701298722*G0_1_1_5_4_5 + 0.0175324675324681*G0_1_1_5_5_0 - 0.0459740259740276*G0_1_1_5_5_1 + 0.00389610389610403*G0_1_1_5_5_2 - 0.00701298701298723*G0_1_1_5_5_3 - 0.00701298701298722*G0_1_1_5_5_4 - 0.128571428571433*G0_1_1_5_5_5; + A[86] = -A[36] - 0.00398133116883133*G0_0_0_0_0_0 + 0.000206980519480526*G0_0_0_0_0_1 + 0.00209415584415592*G0_0_0_0_0_2 - 0.000487012987012998*G0_0_0_0_0_3 - 0.000243506493506502*G0_0_0_0_0_5 + 0.000206980519480526*G0_0_0_0_1_0 + 0.000365259740259755*G0_0_0_0_1_1 + 0.000438311688311704*G0_0_0_0_1_2 - 0.0012175324675325*G0_0_0_0_1_3 + 0.000292207792207804*G0_0_0_0_1_4 - 0.000487012987013003*G0_0_0_0_1_5 + 0.00209415584415592*G0_0_0_0_2_0 + 0.000438311688311704*G0_0_0_0_2_1 - 0.0099959415584419*G0_0_0_0_2_2 - 0.00102272727272732*G0_0_0_0_2_3 - 0.00808441558441586*G0_0_0_0_2_4 - 0.000487012987012998*G0_0_0_0_3_0 - 0.0012175324675325*G0_0_0_0_3_1 - 0.00102272727272732*G0_0_0_0_3_2 + 0.00798701298701322*G0_0_0_0_3_3 + 0.00038961038961039*G0_0_0_0_3_4 + 0.000779220779220803*G0_0_0_0_3_5 + 0.000292207792207804*G0_0_0_0_4_1 - 0.00808441558441586*G0_0_0_0_4_2 + 0.000389610389610391*G0_0_0_0_4_3 - 0.0175324675324681*G0_0_0_0_4_4 - 0.000779220779220809*G0_0_0_0_4_5 - 0.000243506493506502*G0_0_0_0_5_0 - 0.000487012987013003*G0_0_0_0_5_1 + 0.000779220779220803*G0_0_0_0_5_3 - 0.000779220779220809*G0_0_0_0_5_4 - 0.000974025974025994*G0_0_0_0_5_5 + 0.000206980519480526*G0_0_0_1_0_0 + 0.000365259740259755*G0_0_0_1_0_1 + 0.000438311688311704*G0_0_0_1_0_2 - 0.0012175324675325*G0_0_0_1_0_3 + 0.000292207792207804*G0_0_0_1_0_4 - 0.000487012987013003*G0_0_0_1_0_5 + 0.000365259740259755*G0_0_0_1_1_0 - 0.00401785714285734*G0_0_0_1_1_1 + 0.000243506493506505*G0_0_0_1_1_2 - 0.00365259740259753*G0_0_0_1_1_3 - 0.000243506493506499*G0_0_0_1_1_4 - 0.00073051948051952*G0_0_0_1_1_5 + 0.000438311688311704*G0_0_0_1_2_0 + 0.000243506493506505*G0_0_0_1_2_1 - 0.00451704545454561*G0_0_0_1_2_2 + 0.00146103896103901*G0_0_0_1_2_3 - 0.00228896103896112*G0_0_0_1_2_4 + 0.000243506493506502*G0_0_0_1_2_5 - 0.0012175324675325*G0_0_0_1_3_0 - 0.00365259740259753*G0_0_0_1_3_1 + 0.00146103896103901*G0_0_0_1_3_2 + 0.0146103896103901*G0_0_0_1_3_3 + 0.00292207792207801*G0_0_0_1_3_4 + 0.00194805194805201*G0_0_0_1_3_5 + 0.000292207792207804*G0_0_0_1_4_0 - 0.000243506493506499*G0_0_0_1_4_1 - 0.00228896103896112*G0_0_0_1_4_2 + 0.00292207792207801*G0_0_0_1_4_3 - 0.00389610389610403*G0_0_0_1_4_4 - 0.000487012987013003*G0_0_0_1_5_0 - 0.00073051948051952*G0_0_0_1_5_1 + 0.000243506493506502*G0_0_0_1_5_2 + 0.00194805194805201*G0_0_0_1_5_3 - 0.000974025974026021*G0_0_0_1_5_5 + 0.00209415584415592*G0_0_0_2_0_0 + 0.000438311688311704*G0_0_0_2_0_1 - 0.0099959415584419*G0_0_0_2_0_2 - 0.00102272727272732*G0_0_0_2_0_3 - 0.00808441558441586*G0_0_0_2_0_4 + 0.000438311688311704*G0_0_0_2_1_0 + 0.000243506493506505*G0_0_0_2_1_1 - 0.00451704545454561*G0_0_0_2_1_2 + 0.00146103896103901*G0_0_0_2_1_3 - 0.00228896103896112*G0_0_0_2_1_4 + 0.000243506493506502*G0_0_0_2_1_5 - 0.0099959415584419*G0_0_0_2_2_0 - 0.00451704545454561*G0_0_0_2_2_1 + 0.119805194805199*G0_0_0_2_2_2 + 0.0155844155844162*G0_0_0_2_2_3 + 0.0457792207792224*G0_0_0_2_2_4 + 0.00209415584415594*G0_0_0_2_2_5 - 0.00102272727272732*G0_0_0_2_3_0 + 0.00146103896103901*G0_0_0_2_3_1 + 0.0155844155844162*G0_0_0_2_3_2 - 0.0124675324675329*G0_0_0_2_3_3 + 0.00662337662337687*G0_0_0_2_3_4 - 0.00214285714285721*G0_0_0_2_3_5 - 0.00808441558441586*G0_0_0_2_4_0 - 0.00228896103896112*G0_0_0_2_4_1 + 0.0457792207792224*G0_0_0_2_4_2 + 0.00662337662337687*G0_0_0_2_4_3 + 0.0459740259740276*G0_0_0_2_4_4 + 0.000389610389610415*G0_0_0_2_4_5 + 0.000243506493506502*G0_0_0_2_5_1 + 0.00209415584415594*G0_0_0_2_5_2 - 0.00214285714285721*G0_0_0_2_5_3 + 0.000389610389610415*G0_0_0_2_5_4 - 0.00389610389610403*G0_0_0_2_5_5 - 0.000487012987012998*G0_0_0_3_0_0 - 0.0012175324675325*G0_0_0_3_0_1 - 0.00102272727272732*G0_0_0_3_0_2 + 0.00798701298701322*G0_0_0_3_0_3 + 0.00038961038961039*G0_0_0_3_0_4 + 0.000779220779220803*G0_0_0_3_0_5 - 0.0012175324675325*G0_0_0_3_1_0 - 0.00365259740259753*G0_0_0_3_1_1 + 0.00146103896103901*G0_0_0_3_1_2 + 0.0146103896103901*G0_0_0_3_1_3 + 0.00292207792207801*G0_0_0_3_1_4 + 0.00194805194805201*G0_0_0_3_1_5 - 0.00102272727272732*G0_0_0_3_2_0 + 0.00146103896103901*G0_0_0_3_2_1 + 0.0155844155844162*G0_0_0_3_2_2 - 0.0124675324675329*G0_0_0_3_2_3 + 0.00662337662337687*G0_0_0_3_2_4 - 0.00214285714285721*G0_0_0_3_2_5 + 0.00798701298701322*G0_0_0_3_3_0 + 0.0146103896103901*G0_0_0_3_3_1 - 0.0124675324675329*G0_0_0_3_3_2 - 0.130909090909095*G0_0_0_3_3_3 - 0.0218181818181825*G0_0_0_3_3_4 - 0.0116883116883121*G0_0_0_3_3_5 + 0.00038961038961039*G0_0_0_3_4_0 + 0.00292207792207801*G0_0_0_3_4_1 + 0.00662337662337687*G0_0_0_3_4_2 - 0.0218181818181825*G0_0_0_3_4_3 + 0.00701298701298729*G0_0_0_3_4_4 - 0.0015584415584416*G0_0_0_3_4_5 + 0.000779220779220803*G0_0_0_3_5_0 + 0.00194805194805201*G0_0_0_3_5_1 - 0.00214285714285721*G0_0_0_3_5_2 - 0.0116883116883121*G0_0_0_3_5_3 - 0.0015584415584416*G0_0_0_3_5_4 + 0.00623376623376646*G0_0_0_3_5_5 + 0.000292207792207804*G0_0_0_4_0_1 - 0.00808441558441586*G0_0_0_4_0_2 + 0.000389610389610391*G0_0_0_4_0_3 - 0.0175324675324681*G0_0_0_4_0_4 - 0.000779220779220809*G0_0_0_4_0_5 + 0.000292207792207804*G0_0_0_4_1_0 - 0.000243506493506499*G0_0_0_4_1_1 - 0.00228896103896112*G0_0_0_4_1_2 + 0.00292207792207801*G0_0_0_4_1_3 - 0.00389610389610403*G0_0_0_4_1_4 - 0.00808441558441586*G0_0_0_4_2_0 - 0.00228896103896112*G0_0_0_4_2_1 + 0.0457792207792224*G0_0_0_4_2_2 + 0.00662337662337687*G0_0_0_4_2_3 + 0.0459740259740276*G0_0_0_4_2_4 + 0.000389610389610414*G0_0_0_4_2_5 + 0.00038961038961039*G0_0_0_4_3_0 + 0.00292207792207801*G0_0_0_4_3_1 + 0.00662337662337687*G0_0_0_4_3_2 - 0.0218181818181825*G0_0_0_4_3_3 + 0.00701298701298729*G0_0_0_4_3_4 - 0.0015584415584416*G0_0_0_4_3_5 - 0.0175324675324681*G0_0_0_4_4_0 - 0.00389610389610403*G0_0_0_4_4_1 + 0.0459740259740276*G0_0_0_4_4_2 + 0.00701298701298729*G0_0_0_4_4_3 + 0.128571428571433*G0_0_0_4_4_4 + 0.00701298701298728*G0_0_0_4_4_5 - 0.000779220779220809*G0_0_0_4_5_0 + 0.000389610389610414*G0_0_0_4_5_2 - 0.0015584415584416*G0_0_0_4_5_3 + 0.00701298701298728*G0_0_0_4_5_4 + 0.00779220779220808*G0_0_0_4_5_5 - 0.000243506493506502*G0_0_0_5_0_0 - 0.000487012987013003*G0_0_0_5_0_1 + 0.000779220779220803*G0_0_0_5_0_3 - 0.000779220779220809*G0_0_0_5_0_4 - 0.000974025974025994*G0_0_0_5_0_5 - 0.000487012987013003*G0_0_0_5_1_0 - 0.00073051948051952*G0_0_0_5_1_1 + 0.000243506493506502*G0_0_0_5_1_2 + 0.00194805194805201*G0_0_0_5_1_3 - 0.00097402597402602*G0_0_0_5_1_5 + 0.000243506493506502*G0_0_0_5_2_1 + 0.00209415584415594*G0_0_0_5_2_2 - 0.00214285714285721*G0_0_0_5_2_3 + 0.000389610389610415*G0_0_0_5_2_4 - 0.00389610389610403*G0_0_0_5_2_5 + 0.000779220779220803*G0_0_0_5_3_0 + 0.00194805194805201*G0_0_0_5_3_1 - 0.00214285714285721*G0_0_0_5_3_2 - 0.0116883116883121*G0_0_0_5_3_3 - 0.0015584415584416*G0_0_0_5_3_4 + 0.00623376623376646*G0_0_0_5_3_5 - 0.000779220779220809*G0_0_0_5_4_0 + 0.000389610389610414*G0_0_0_5_4_2 - 0.0015584415584416*G0_0_0_5_4_3 + 0.00701298701298728*G0_0_0_5_4_4 + 0.00779220779220808*G0_0_0_5_4_5 - 0.000974025974025994*G0_0_0_5_5_0 - 0.000974025974026021*G0_0_0_5_5_1 - 0.00389610389610403*G0_0_0_5_5_2 + 0.00623376623376646*G0_0_0_5_5_3 + 0.00779220779220808*G0_0_0_5_5_4 + 0.0303896103896116*G0_0_0_5_5_5 + 0.0361972402597415*G0_0_1_0_0_0 - 0.00104707792207795*G0_0_1_0_0_1 - 0.000474837662337675*G0_0_1_0_0_2 + 0.0015097402597403*G0_0_1_0_0_3 + 0.0021428571428572*G0_0_1_0_0_4 + 0.0034577922077923*G0_0_1_0_0_5 - 0.00104707792207795*G0_0_1_0_1_0 - 0.000608766233766255*G0_0_1_0_1_1 - 0.000109577922077925*G0_0_1_0_1_2 + 0.000730519480519505*G0_0_1_0_1_3 + 0.00141233766233771*G0_0_1_0_1_4 + 0.00243506493506502*G0_0_1_0_1_5 - 0.000474837662337675*G0_0_1_0_2_0 - 0.000109577922077925*G0_0_1_0_2_1 - 0.00631899350649373*G0_0_1_0_2_2 + 0.0012175324675325*G0_0_1_0_2_3 + 0.0011688311688312*G0_0_1_0_2_4 + 0.00170454545454551*G0_0_1_0_2_5 + 0.0015097402597403*G0_0_1_0_3_0 + 0.000730519480519505*G0_0_1_0_3_1 + 0.0012175324675325*G0_0_1_0_3_2 - 0.00564935064935084*G0_0_1_0_3_3 - 0.00584415584415603*G0_0_1_0_3_4 - 0.00642857142857164*G0_0_1_0_3_5 + 0.0021428571428572*G0_0_1_0_4_0 + 0.00141233766233771*G0_0_1_0_4_1 + 0.0011688311688312*G0_0_1_0_4_2 - 0.00584415584415603*G0_0_1_0_4_3 - 0.0167532467532473*G0_0_1_0_4_4 - 0.00623376623376644*G0_0_1_0_4_5 + 0.0034577922077923*G0_0_1_0_5_0 + 0.00243506493506502*G0_0_1_0_5_1 + 0.00170454545454551*G0_0_1_0_5_2 - 0.00642857142857164*G0_0_1_0_5_3 - 0.00623376623376644*G0_0_1_0_5_4 - 0.0142207792207797*G0_0_1_0_5_5 - 0.00104707792207795*G0_0_1_1_0_0 - 0.000608766233766255*G0_0_1_1_0_1 - 0.000109577922077925*G0_0_1_1_0_2 + 0.000730519480519505*G0_0_1_1_0_3 + 0.00141233766233771*G0_0_1_1_0_4 + 0.00243506493506502*G0_0_1_1_0_5 - 0.000608766233766255*G0_0_1_1_1_0 - 0.00012175324675325*G0_0_1_1_1_2 - 0.000730519480519503*G0_0_1_1_1_3 + 0.000730519480519504*G0_0_1_1_1_4 + 0.000730519480519501*G0_0_1_1_1_5 - 0.000109577922077925*G0_0_1_1_2_0 - 0.00012175324675325*G0_0_1_1_2_1 - 0.00340909090909103*G0_0_1_1_2_2 + 0.00194805194805201*G0_0_1_1_2_3 - 0.000243506493506506*G0_0_1_1_2_4 + 0.000730519480519504*G0_0_1_1_2_5 + 0.000730519480519505*G0_0_1_1_3_0 - 0.000730519480519503*G0_0_1_1_3_1 + 0.00194805194805201*G0_0_1_1_3_2 + 0.00389610389610403*G0_0_1_1_3_3 - 0.00292207792207802*G0_0_1_1_3_4 - 0.00292207792207802*G0_0_1_1_3_5 + 0.00141233766233771*G0_0_1_1_4_0 + 0.000730519480519504*G0_0_1_1_4_1 - 0.000243506493506506*G0_0_1_1_4_2 - 0.00292207792207802*G0_0_1_1_4_3 + 0.00233766233766241*G0_0_1_1_4_4 - 0.00292207792207802*G0_0_1_1_4_5 + 0.00243506493506502*G0_0_1_1_5_0 + 0.000730519480519501*G0_0_1_1_5_1 + 0.000730519480519504*G0_0_1_1_5_2 - 0.00292207792207802*G0_0_1_1_5_3 - 0.00292207792207802*G0_0_1_1_5_4 + 0.00194805194805202*G0_0_1_1_5_5 - 0.000474837662337675*G0_0_1_2_0_0 - 0.000109577922077925*G0_0_1_2_0_1 - 0.00631899350649373*G0_0_1_2_0_2 + 0.0012175324675325*G0_0_1_2_0_3 + 0.0011688311688312*G0_0_1_2_0_4 + 0.00170454545454551*G0_0_1_2_0_5 - 0.000109577922077925*G0_0_1_2_1_0 - 0.00012175324675325*G0_0_1_2_1_1 - 0.00340909090909103*G0_0_1_2_1_2 + 0.00194805194805201*G0_0_1_2_1_3 - 0.000243506493506506*G0_0_1_2_1_4 + 0.000730519480519504*G0_0_1_2_1_5 - 0.00631899350649373*G0_0_1_2_2_0 - 0.00340909090909103*G0_0_1_2_2_1 + 0.0955154220779255*G0_0_1_2_2_2 + 0.0129058441558446*G0_0_1_2_2_3 + 0.0238636363636372*G0_0_1_2_2_4 + 0.00199675324675333*G0_0_1_2_2_5 + 0.0012175324675325*G0_0_1_2_3_0 + 0.00194805194805201*G0_0_1_2_3_1 + 0.0129058441558446*G0_0_1_2_3_2 - 0.0173376623376629*G0_0_1_2_3_3 - 0.00194805194805199*G0_0_1_2_3_4 - 0.00642857142857164*G0_0_1_2_3_5 + 0.0011688311688312*G0_0_1_2_4_0 - 0.000243506493506506*G0_0_1_2_4_1 + 0.0238636363636372*G0_0_1_2_4_2 - 0.00194805194805199*G0_0_1_2_4_3 + 0.0144155844155849*G0_0_1_2_4_4 - 0.00350649350649362*G0_0_1_2_4_5 + 0.00170454545454551*G0_0_1_2_5_0 + 0.000730519480519504*G0_0_1_2_5_1 + 0.00199675324675333*G0_0_1_2_5_2 - 0.00642857142857164*G0_0_1_2_5_3 - 0.00350649350649362*G0_0_1_2_5_4 - 0.00253246753246761*G0_0_1_2_5_5 + 0.0015097402597403*G0_0_1_3_0_0 + 0.000730519480519505*G0_0_1_3_0_1 + 0.0012175324675325*G0_0_1_3_0_2 - 0.00564935064935084*G0_0_1_3_0_3 - 0.00584415584415603*G0_0_1_3_0_4 - 0.00642857142857164*G0_0_1_3_0_5 + 0.000730519480519505*G0_0_1_3_1_0 - 0.000730519480519502*G0_0_1_3_1_1 + 0.00194805194805201*G0_0_1_3_1_2 + 0.00389610389610403*G0_0_1_3_1_3 - 0.00292207792207802*G0_0_1_3_1_4 - 0.00292207792207802*G0_0_1_3_1_5 + 0.0012175324675325*G0_0_1_3_2_0 + 0.00194805194805201*G0_0_1_3_2_1 + 0.0129058441558446*G0_0_1_3_2_2 - 0.0173376623376629*G0_0_1_3_2_3 - 0.00194805194805199*G0_0_1_3_2_4 - 0.00642857142857164*G0_0_1_3_2_5 - 0.00564935064935084*G0_0_1_3_3_0 + 0.00389610389610403*G0_0_1_3_3_1 - 0.0173376623376629*G0_0_1_3_3_2 - 0.0350649350649363*G0_0_1_3_3_3 + 0.0171428571428577*G0_0_1_3_3_4 + 0.0241558441558449*G0_0_1_3_3_5 - 0.00584415584415603*G0_0_1_3_4_0 - 0.00292207792207802*G0_0_1_3_4_1 - 0.00194805194805199*G0_0_1_3_4_2 + 0.0171428571428577*G0_0_1_3_4_3 + 0.00701298701298726*G0_0_1_3_4_4 + 0.0187012987012993*G0_0_1_3_4_5 - 0.00642857142857164*G0_0_1_3_5_0 - 0.00292207792207802*G0_0_1_3_5_1 - 0.00642857142857164*G0_0_1_3_5_2 + 0.0241558441558449*G0_0_1_3_5_3 + 0.0187012987012993*G0_0_1_3_5_4 + 0.0179220779220785*G0_0_1_3_5_5 + 0.0021428571428572*G0_0_1_4_0_0 + 0.00141233766233771*G0_0_1_4_0_1 + 0.0011688311688312*G0_0_1_4_0_2 - 0.00584415584415603*G0_0_1_4_0_3 - 0.0167532467532473*G0_0_1_4_0_4 - 0.00623376623376644*G0_0_1_4_0_5 + 0.00141233766233771*G0_0_1_4_1_0 + 0.000730519480519504*G0_0_1_4_1_1 - 0.000243506493506506*G0_0_1_4_1_2 - 0.00292207792207802*G0_0_1_4_1_3 + 0.00233766233766241*G0_0_1_4_1_4 - 0.00292207792207802*G0_0_1_4_1_5 + 0.0011688311688312*G0_0_1_4_2_0 - 0.000243506493506506*G0_0_1_4_2_1 + 0.0238636363636372*G0_0_1_4_2_2 - 0.00194805194805199*G0_0_1_4_2_3 + 0.0144155844155849*G0_0_1_4_2_4 - 0.00350649350649362*G0_0_1_4_2_5 - 0.00584415584415603*G0_0_1_4_3_0 - 0.00292207792207802*G0_0_1_4_3_1 - 0.00194805194805199*G0_0_1_4_3_2 + 0.0171428571428577*G0_0_1_4_3_3 + 0.00701298701298726*G0_0_1_4_3_4 + 0.0187012987012993*G0_0_1_4_3_5 - 0.0167532467532473*G0_0_1_4_4_0 + 0.00233766233766241*G0_0_1_4_4_1 + 0.0144155844155849*G0_0_1_4_4_2 + 0.00701298701298726*G0_0_1_4_4_3 - 0.189350649350655*G0_0_1_4_4_4 + 0.0023376623376624*G0_0_1_4_4_5 - 0.00623376623376644*G0_0_1_4_5_0 - 0.00292207792207802*G0_0_1_4_5_1 - 0.00350649350649362*G0_0_1_4_5_2 + 0.0187012987012993*G0_0_1_4_5_3 + 0.0023376623376624*G0_0_1_4_5_4 + 0.0109090909090913*G0_0_1_4_5_5 + 0.0034577922077923*G0_0_1_5_0_0 + 0.00243506493506502*G0_0_1_5_0_1 + 0.00170454545454551*G0_0_1_5_0_2 - 0.00642857142857164*G0_0_1_5_0_3 - 0.00623376623376644*G0_0_1_5_0_4 - 0.0142207792207797*G0_0_1_5_0_5 + 0.00243506493506502*G0_0_1_5_1_0 + 0.000730519480519501*G0_0_1_5_1_1 + 0.000730519480519504*G0_0_1_5_1_2 - 0.00292207792207802*G0_0_1_5_1_3 - 0.00292207792207802*G0_0_1_5_1_4 + 0.00194805194805202*G0_0_1_5_1_5 + 0.00170454545454551*G0_0_1_5_2_0 + 0.000730519480519504*G0_0_1_5_2_1 + 0.00199675324675333*G0_0_1_5_2_2 - 0.00642857142857164*G0_0_1_5_2_3 - 0.00350649350649362*G0_0_1_5_2_4 - 0.00253246753246762*G0_0_1_5_2_5 - 0.00642857142857164*G0_0_1_5_3_0 - 0.00292207792207802*G0_0_1_5_3_1 - 0.00642857142857164*G0_0_1_5_3_2 + 0.0241558441558449*G0_0_1_5_3_3 + 0.0187012987012993*G0_0_1_5_3_4 + 0.0179220779220785*G0_0_1_5_3_5 - 0.00623376623376644*G0_0_1_5_4_0 - 0.00292207792207802*G0_0_1_5_4_1 - 0.00350649350649362*G0_0_1_5_4_2 + 0.0187012987012993*G0_0_1_5_4_3 + 0.0023376623376624*G0_0_1_5_4_4 + 0.0109090909090913*G0_0_1_5_4_5 - 0.0142207792207797*G0_0_1_5_5_0 + 0.00194805194805202*G0_0_1_5_5_1 - 0.00253246753246761*G0_0_1_5_5_2 + 0.0179220779220785*G0_0_1_5_5_3 + 0.0109090909090913*G0_0_1_5_5_4 - 0.0911688311688344*G0_0_1_5_5_5; + A[35] = A[36] + 0.00405438311688328*G0_0_0_0_0_0 - 0.000255681818181828*G0_0_0_0_0_1 - 0.00211850649350657*G0_0_0_0_0_2 + 0.000292207792207799*G0_0_0_0_0_3 + 0.00350649350649364*G0_0_0_0_0_4 + 0.000146103896103909*G0_0_0_0_0_5 - 0.000255681818181828*G0_0_0_0_1_0 - 0.000292207792207802*G0_0_0_0_1_2 + 0.000584415584415599*G0_0_0_0_1_3 - 0.000876623376623408*G0_0_0_0_1_4 - 0.00211850649350657*G0_0_0_0_2_0 - 0.000292207792207802*G0_0_0_0_2_1 + 0.0111769480519484*G0_0_0_0_2_2 + 0.000876623376623415*G0_0_0_0_2_3 + 0.00409090909090923*G0_0_0_0_2_4 - 0.000876623376623402*G0_0_0_0_2_5 + 0.000292207792207799*G0_0_0_0_3_0 + 0.000584415584415599*G0_0_0_0_3_1 + 0.000876623376623416*G0_0_0_0_3_2 - 0.0105194805194808*G0_0_0_0_3_3 + 0.00116883116883121*G0_0_0_0_3_4 + 0.0011688311688312*G0_0_0_0_3_5 + 0.00350649350649364*G0_0_0_0_4_0 - 0.000876623376623408*G0_0_0_0_4_1 + 0.00409090909090923*G0_0_0_0_4_2 + 0.00116883116883121*G0_0_0_0_4_3 + 0.0175324675324681*G0_0_0_0_4_4 + 0.00350649350649363*G0_0_0_0_4_5 + 0.000146103896103909*G0_0_0_0_5_0 - 0.000876623376623402*G0_0_0_0_5_2 + 0.0011688311688312*G0_0_0_0_5_3 + 0.00350649350649363*G0_0_0_0_5_4 + 0.00409090909090922*G0_0_0_0_5_5 - 0.000255681818181828*G0_0_0_1_0_0 - 0.000292207792207802*G0_0_0_1_0_2 + 0.000584415584415599*G0_0_0_1_0_3 - 0.000876623376623408*G0_0_0_1_0_4 + 0.000547889610389616*G0_0_0_1_1_1 - 0.000219155844155853*G0_0_0_1_1_2 + 0.00438311688311704*G0_0_0_1_1_3 - 0.000730519480519509*G0_0_0_1_1_5 - 0.000292207792207802*G0_0_0_1_2_0 - 0.000219155844155853*G0_0_0_1_2_1 + 0.0067938311688314*G0_0_0_1_2_2 - 0.00292207792207802*G0_0_0_1_2_3 + 0.00204545454545462*G0_0_0_1_2_4 - 0.000584415584415602*G0_0_0_1_2_5 + 0.000584415584415599*G0_0_0_1_3_0 + 0.00438311688311704*G0_0_0_1_3_1 - 0.00292207792207802*G0_0_0_1_3_2 - 0.0105194805194808*G0_0_0_1_3_3 - 0.0011688311688312*G0_0_0_1_3_4 - 0.000876623376623408*G0_0_0_1_4_0 + 0.00204545454545462*G0_0_0_1_4_2 - 0.0011688311688312*G0_0_0_1_4_3 - 0.00116883116883121*G0_0_0_1_4_4 + 0.0011688311688312*G0_0_0_1_4_5 - 0.000730519480519509*G0_0_0_1_5_1 - 0.000584415584415602*G0_0_0_1_5_2 + 0.0011688311688312*G0_0_0_1_5_4 + 0.0017532467532468*G0_0_0_1_5_5 - 0.00211850649350657*G0_0_0_2_0_0 - 0.000292207792207802*G0_0_0_2_0_1 + 0.0111769480519484*G0_0_0_2_0_2 + 0.000876623376623415*G0_0_0_2_0_3 + 0.00409090909090923*G0_0_0_2_0_4 - 0.000876623376623402*G0_0_0_2_0_5 - 0.000292207792207802*G0_0_0_2_1_0 - 0.000219155844155853*G0_0_0_2_1_1 + 0.0067938311688314*G0_0_0_2_1_2 - 0.00292207792207802*G0_0_0_2_1_3 + 0.00204545454545462*G0_0_0_2_1_4 - 0.000584415584415602*G0_0_0_2_1_5 + 0.0111769480519484*G0_0_0_2_2_0 + 0.0067938311688314*G0_0_0_2_2_1 - 0.16217532467533*G0_0_0_2_2_2 - 0.0233766233766242*G0_0_0_2_2_3 - 0.0467532467532484*G0_0_0_2_2_4 - 0.00262987012987025*G0_0_0_2_2_5 + 0.000876623376623415*G0_0_0_2_3_0 - 0.00292207792207802*G0_0_0_2_3_1 - 0.0233766233766242*G0_0_0_2_3_2 + 0.011688311688312*G0_0_0_2_3_3 - 0.00584415584415606*G0_0_0_2_3_4 + 0.00350649350649361*G0_0_0_2_3_5 + 0.00409090909090923*G0_0_0_2_4_0 + 0.00204545454545462*G0_0_0_2_4_1 - 0.0467532467532484*G0_0_0_2_4_2 - 0.00584415584415606*G0_0_0_2_4_3 - 0.0350649350649363*G0_0_0_2_4_4 + 0.00116883116883119*G0_0_0_2_4_5 - 0.000876623376623402*G0_0_0_2_5_0 - 0.000584415584415602*G0_0_0_2_5_1 - 0.00262987012987025*G0_0_0_2_5_2 + 0.00350649350649361*G0_0_0_2_5_3 + 0.00116883116883119*G0_0_0_2_5_4 + 0.00584415584415603*G0_0_0_2_5_5 + 0.000292207792207799*G0_0_0_3_0_0 + 0.000584415584415599*G0_0_0_3_0_1 + 0.000876623376623415*G0_0_0_3_0_2 - 0.0105194805194808*G0_0_0_3_0_3 + 0.00116883116883121*G0_0_0_3_0_4 + 0.0011688311688312*G0_0_0_3_0_5 + 0.000584415584415599*G0_0_0_3_1_0 + 0.00438311688311704*G0_0_0_3_1_1 - 0.00292207792207802*G0_0_0_3_1_2 - 0.0105194805194808*G0_0_0_3_1_3 - 0.0011688311688312*G0_0_0_3_1_4 + 0.000876623376623416*G0_0_0_3_2_0 - 0.00292207792207802*G0_0_0_3_2_1 - 0.0233766233766242*G0_0_0_3_2_2 + 0.011688311688312*G0_0_0_3_2_3 - 0.00584415584415606*G0_0_0_3_2_4 + 0.00350649350649361*G0_0_0_3_2_5 - 0.0105194805194808*G0_0_0_3_3_0 - 0.0105194805194808*G0_0_0_3_3_1 + 0.011688311688312*G0_0_0_3_3_2 + 0.28051948051949*G0_0_0_3_3_3 + 0.0233766233766242*G0_0_0_3_3_4 + 0.0140259740259746*G0_0_0_3_3_5 + 0.00116883116883121*G0_0_0_3_4_0 - 0.0011688311688312*G0_0_0_3_4_1 - 0.00584415584415606*G0_0_0_3_4_2 + 0.0233766233766242*G0_0_0_3_4_3 - 0.00467532467532481*G0_0_0_3_4_5 + 0.0011688311688312*G0_0_0_3_5_0 + 0.00350649350649361*G0_0_0_3_5_2 + 0.0140259740259746*G0_0_0_3_5_3 - 0.00467532467532482*G0_0_0_3_5_4 - 0.0140259740259745*G0_0_0_3_5_5 + 0.00350649350649364*G0_0_0_4_0_0 - 0.000876623376623408*G0_0_0_4_0_1 + 0.00409090909090923*G0_0_0_4_0_2 + 0.00116883116883121*G0_0_0_4_0_3 + 0.0175324675324681*G0_0_0_4_0_4 + 0.00350649350649363*G0_0_0_4_0_5 - 0.000876623376623408*G0_0_0_4_1_0 + 0.00204545454545462*G0_0_0_4_1_2 - 0.0011688311688312*G0_0_0_4_1_3 - 0.00116883116883121*G0_0_0_4_1_4 + 0.0011688311688312*G0_0_0_4_1_5 + 0.00409090909090923*G0_0_0_4_2_0 + 0.00204545454545462*G0_0_0_4_2_1 - 0.0467532467532484*G0_0_0_4_2_2 - 0.00584415584415606*G0_0_0_4_2_3 - 0.0350649350649363*G0_0_0_4_2_4 + 0.00116883116883119*G0_0_0_4_2_5 + 0.00116883116883121*G0_0_0_4_3_0 - 0.0011688311688312*G0_0_0_4_3_1 - 0.00584415584415606*G0_0_0_4_3_2 + 0.0233766233766242*G0_0_0_4_3_3 - 0.00467532467532481*G0_0_0_4_3_5 + 0.0175324675324681*G0_0_0_4_4_0 - 0.00116883116883121*G0_0_0_4_4_1 - 0.0350649350649363*G0_0_0_4_4_2 + 0.0701298701298723*G0_0_0_4_4_4 + 0.00350649350649363*G0_0_0_4_5_0 + 0.0011688311688312*G0_0_0_4_5_1 + 0.00116883116883119*G0_0_0_4_5_2 - 0.00467532467532482*G0_0_0_4_5_3 - 0.0140259740259745*G0_0_0_4_5_5 + 0.000146103896103909*G0_0_0_5_0_0 - 0.000876623376623402*G0_0_0_5_0_2 + 0.0011688311688312*G0_0_0_5_0_3 + 0.00350649350649363*G0_0_0_5_0_4 + 0.00409090909090922*G0_0_0_5_0_5 - 0.000730519480519509*G0_0_0_5_1_1 - 0.000584415584415602*G0_0_0_5_1_2 + 0.0011688311688312*G0_0_0_5_1_4 + 0.0017532467532468*G0_0_0_5_1_5 - 0.000876623376623402*G0_0_0_5_2_0 - 0.000584415584415602*G0_0_0_5_2_1 - 0.00262987012987025*G0_0_0_5_2_2 + 0.00350649350649361*G0_0_0_5_2_3 + 0.00116883116883119*G0_0_0_5_2_4 + 0.00584415584415603*G0_0_0_5_2_5 + 0.0011688311688312*G0_0_0_5_3_0 + 0.00350649350649361*G0_0_0_5_3_2 + 0.0140259740259746*G0_0_0_5_3_3 - 0.00467532467532482*G0_0_0_5_3_4 - 0.0140259740259745*G0_0_0_5_3_5 + 0.00350649350649363*G0_0_0_5_4_0 + 0.0011688311688312*G0_0_0_5_4_1 + 0.00116883116883119*G0_0_0_5_4_2 - 0.00467532467532481*G0_0_0_5_4_3 - 0.0140259740259745*G0_0_0_5_4_5 + 0.00409090909090922*G0_0_0_5_5_0 + 0.0017532467532468*G0_0_0_5_5_1 + 0.00584415584415603*G0_0_0_5_5_2 - 0.0140259740259745*G0_0_0_5_5_3 - 0.0140259740259745*G0_0_0_5_5_4 - 0.0350649350649362*G0_0_0_5_5_5 - 0.00580762987013019*G0_0_1_0_0_0 + 0.000328733766233783*G0_0_1_0_0_1 + 0.000438311688311705*G0_0_1_0_0_2 - 0.00175324675324681*G0_0_1_0_0_3 - 0.00116883116883123*G0_0_1_0_0_4 - 0.00248376623376634*G0_0_1_0_0_5 + 0.000328733766233783*G0_0_1_0_1_0 + 0.000365259740259752*G0_0_1_0_1_1 - 0.000292207792207802*G0_0_1_0_1_3 - 0.000584415584415602*G0_0_1_0_1_4 - 0.0005844155844156*G0_0_1_0_1_5 + 0.000438311688311705*G0_0_1_0_2_0 + 0.00704951298701323*G0_0_1_0_2_2 - 0.0013149350649351*G0_0_1_0_2_3 - 0.00116883116883119*G0_0_1_0_2_4 - 0.00175324675324681*G0_0_1_0_2_5 - 0.00175324675324681*G0_0_1_0_3_0 - 0.000292207792207802*G0_0_1_0_3_1 - 0.0013149350649351*G0_0_1_0_3_2 + 0.00292207792207804*G0_0_1_0_3_3 + 0.00467532467532482*G0_0_1_0_3_4 + 0.00701298701298723*G0_0_1_0_3_5 - 0.00116883116883123*G0_0_1_0_4_0 - 0.000584415584415602*G0_0_1_0_4_1 - 0.00116883116883119*G0_0_1_0_4_2 + 0.00467532467532482*G0_0_1_0_4_3 + 0.00467532467532482*G0_0_1_0_4_5 - 0.00248376623376634*G0_0_1_0_5_0 - 0.0005844155844156*G0_0_1_0_5_1 - 0.00175324675324681*G0_0_1_0_5_2 + 0.00701298701298723*G0_0_1_0_5_3 + 0.00467532467532482*G0_0_1_0_5_4 + 0.00759740259740284*G0_0_1_0_5_5 + 0.000328733766233783*G0_0_1_1_0_0 + 0.000365259740259752*G0_0_1_1_0_1 - 0.000292207792207802*G0_0_1_1_0_3 - 0.000584415584415602*G0_0_1_1_0_4 - 0.0005844155844156*G0_0_1_1_0_5 + 0.000365259740259752*G0_0_1_1_1_0 + 0.000219155844155851*G0_0_1_1_1_2 + 0.00146103896103901*G0_0_1_1_1_3 - 0.000584415584415602*G0_0_1_1_1_4 - 0.00146103896103901*G0_0_1_1_1_5 + 0.00021915584415585*G0_0_1_1_2_1 + 0.00529626623376641*G0_0_1_1_2_2 - 0.00262987012987021*G0_0_1_1_2_3 + 0.000146103896103906*G0_0_1_1_2_4 - 0.000584415584415602*G0_0_1_1_2_5 - 0.000292207792207802*G0_0_1_1_3_0 + 0.00146103896103901*G0_0_1_1_3_1 - 0.00262987012987021*G0_0_1_1_3_2 - 0.00525974025974044*G0_0_1_1_3_3 + 0.00175324675324681*G0_0_1_1_3_4 + 0.0017532467532468*G0_0_1_1_3_5 - 0.000584415584415602*G0_0_1_1_4_0 - 0.000584415584415602*G0_0_1_1_4_1 + 0.000146103896103906*G0_0_1_1_4_2 + 0.00175324675324681*G0_0_1_1_4_3 - 0.00467532467532483*G0_0_1_1_4_4 + 0.00233766233766241*G0_0_1_1_4_5 - 0.0005844155844156*G0_0_1_1_5_0 - 0.00146103896103901*G0_0_1_1_5_1 - 0.000584415584415602*G0_0_1_1_5_2 + 0.0017532467532468*G0_0_1_1_5_3 + 0.00233766233766241*G0_0_1_1_5_4 + 0.00175324675324681*G0_0_1_1_5_5 + 0.000438311688311705*G0_0_1_2_0_0 + 0.00704951298701323*G0_0_1_2_0_2 - 0.0013149350649351*G0_0_1_2_0_3 - 0.00116883116883119*G0_0_1_2_0_4 - 0.00175324675324681*G0_0_1_2_0_5 + 0.000219155844155851*G0_0_1_2_1_1 + 0.00529626623376641*G0_0_1_2_1_2 - 0.00262987012987021*G0_0_1_2_1_3 + 0.000146103896103906*G0_0_1_2_1_4 - 0.000584415584415602*G0_0_1_2_1_5 + 0.00704951298701323*G0_0_1_2_2_0 + 0.00529626623376641*G0_0_1_2_2_1 - 0.135876623376628*G0_0_1_2_2_2 - 0.0198701298701306*G0_0_1_2_2_3 - 0.0268831168831179*G0_0_1_2_2_4 - 0.00248376623376634*G0_0_1_2_2_5 - 0.0013149350649351*G0_0_1_2_3_0 - 0.00262987012987021*G0_0_1_2_3_1 - 0.0198701298701306*G0_0_1_2_3_2 + 0.0187012987012993*G0_0_1_2_3_3 + 0.00233766233766239*G0_0_1_2_3_4 + 0.00759740259740284*G0_0_1_2_3_5 - 0.00116883116883119*G0_0_1_2_4_0 + 0.000146103896103906*G0_0_1_2_4_1 - 0.0268831168831179*G0_0_1_2_4_2 + 0.00233766233766239*G0_0_1_2_4_3 + 0.00467532467532482*G0_0_1_2_4_5 - 0.00175324675324681*G0_0_1_2_5_0 - 0.000584415584415602*G0_0_1_2_5_1 - 0.00248376623376634*G0_0_1_2_5_2 + 0.00759740259740284*G0_0_1_2_5_3 + 0.00467532467532482*G0_0_1_2_5_4 + 0.00701298701298725*G0_0_1_2_5_5 - 0.00175324675324681*G0_0_1_3_0_0 - 0.000292207792207802*G0_0_1_3_0_1 - 0.0013149350649351*G0_0_1_3_0_2 + 0.00292207792207804*G0_0_1_3_0_3 + 0.00467532467532482*G0_0_1_3_0_4 + 0.00701298701298723*G0_0_1_3_0_5 - 0.000292207792207802*G0_0_1_3_1_0 + 0.00146103896103901*G0_0_1_3_1_1 - 0.00262987012987021*G0_0_1_3_1_2 - 0.00525974025974044*G0_0_1_3_1_3 + 0.0017532467532468*G0_0_1_3_1_4 + 0.0017532467532468*G0_0_1_3_1_5 - 0.0013149350649351*G0_0_1_3_2_0 - 0.00262987012987021*G0_0_1_3_2_1 - 0.0198701298701306*G0_0_1_3_2_2 + 0.0187012987012993*G0_0_1_3_2_3 + 0.00233766233766239*G0_0_1_3_2_4 + 0.00759740259740284*G0_0_1_3_2_5 + 0.00292207792207804*G0_0_1_3_3_0 - 0.00525974025974044*G0_0_1_3_3_1 + 0.0187012987012993*G0_0_1_3_3_2 + 0.168311688311694*G0_0_1_3_3_3 - 0.00935064935064963*G0_0_1_3_3_4 - 0.0210389610389617*G0_0_1_3_3_5 + 0.00467532467532482*G0_0_1_3_4_0 + 0.0017532467532468*G0_0_1_3_4_1 + 0.00233766233766239*G0_0_1_3_4_2 - 0.00935064935064963*G0_0_1_3_4_3 - 0.0187012987012993*G0_0_1_3_4_5 + 0.00701298701298723*G0_0_1_3_5_0 + 0.0017532467532468*G0_0_1_3_5_1 + 0.00759740259740284*G0_0_1_3_5_2 - 0.0210389610389617*G0_0_1_3_5_3 - 0.0187012987012993*G0_0_1_3_5_4 - 0.028051948051949*G0_0_1_3_5_5 - 0.00116883116883123*G0_0_1_4_0_0 - 0.000584415584415602*G0_0_1_4_0_1 - 0.00116883116883119*G0_0_1_4_0_2 + 0.00467532467532482*G0_0_1_4_0_3 + 0.00467532467532482*G0_0_1_4_0_5 - 0.000584415584415602*G0_0_1_4_1_0 - 0.000584415584415602*G0_0_1_4_1_1 + 0.000146103896103906*G0_0_1_4_1_2 + 0.00175324675324681*G0_0_1_4_1_3 - 0.00467532467532483*G0_0_1_4_1_4 + 0.00233766233766241*G0_0_1_4_1_5 - 0.00116883116883119*G0_0_1_4_2_0 + 0.000146103896103906*G0_0_1_4_2_1 - 0.0268831168831179*G0_0_1_4_2_2 + 0.00233766233766239*G0_0_1_4_2_3 + 0.00467532467532482*G0_0_1_4_2_5 + 0.00467532467532482*G0_0_1_4_3_0 + 0.0017532467532468*G0_0_1_4_3_1 + 0.00233766233766239*G0_0_1_4_3_2 - 0.00935064935064963*G0_0_1_4_3_3 - 0.0187012987012993*G0_0_1_4_3_5 - 0.00467532467532483*G0_0_1_4_4_1 + 0.210389610389617*G0_0_1_4_4_4 + 0.00467532467532481*G0_0_1_4_5_0 + 0.00233766233766241*G0_0_1_4_5_1 + 0.00467532467532482*G0_0_1_4_5_2 - 0.0187012987012993*G0_0_1_4_5_3 - 0.0187012987012993*G0_0_1_4_5_5 - 0.00248376623376634*G0_0_1_5_0_0 - 0.0005844155844156*G0_0_1_5_0_1 - 0.00175324675324681*G0_0_1_5_0_2 + 0.00701298701298723*G0_0_1_5_0_3 + 0.00467532467532482*G0_0_1_5_0_4 + 0.00759740259740284*G0_0_1_5_0_5 - 0.0005844155844156*G0_0_1_5_1_0 - 0.00146103896103901*G0_0_1_5_1_1 - 0.000584415584415602*G0_0_1_5_1_2 + 0.0017532467532468*G0_0_1_5_1_3 + 0.00233766233766241*G0_0_1_5_1_4 + 0.00175324675324681*G0_0_1_5_1_5 - 0.00175324675324681*G0_0_1_5_2_0 - 0.000584415584415602*G0_0_1_5_2_1 - 0.00248376623376634*G0_0_1_5_2_2 + 0.00759740259740284*G0_0_1_5_2_3 + 0.00467532467532482*G0_0_1_5_2_4 + 0.00701298701298725*G0_0_1_5_2_5 + 0.00701298701298723*G0_0_1_5_3_0 + 0.0017532467532468*G0_0_1_5_3_1 + 0.00759740259740284*G0_0_1_5_3_2 - 0.0210389610389617*G0_0_1_5_3_3 - 0.0187012987012993*G0_0_1_5_3_4 - 0.028051948051949*G0_0_1_5_3_5 + 0.00467532467532482*G0_0_1_5_4_0 + 0.00233766233766241*G0_0_1_5_4_1 + 0.00467532467532482*G0_0_1_5_4_2 - 0.0187012987012993*G0_0_1_5_4_3 - 0.0187012987012993*G0_0_1_5_4_5 + 0.00759740259740284*G0_0_1_5_5_0 + 0.00175324675324681*G0_0_1_5_5_1 + 0.00701298701298725*G0_0_1_5_5_2 - 0.028051948051949*G0_0_1_5_5_3 - 0.0187012987012993*G0_0_1_5_5_4 - 0.0210389610389617*G0_0_1_5_5_5 + 0.00208198051948058*G0_1_0_0_0_0 - 0.000438311688311704*G0_1_0_0_0_1 - 0.000474837662337676*G0_1_0_0_0_2 - 0.000146103896103901*G0_1_0_0_0_3 + 0.00146103896103901*G0_1_0_0_0_4 + 0.0007305194805195*G0_1_0_0_0_5 - 0.000438311688311704*G0_1_0_0_1_0 + 0.000474837662337692*G0_1_0_0_1_1 - 0.000146103896103901*G0_1_0_0_1_2 - 0.000146103896103899*G0_1_0_0_1_3 - 0.000438311688311702*G0_1_0_0_1_4 + 0.000292207792207812*G0_1_0_0_1_5 - 0.000474837662337676*G0_1_0_0_2_0 - 0.000146103896103901*G0_1_0_0_2_1 + 0.0011688311688312*G0_1_0_0_2_2 + 0.000584415584415602*G0_1_0_0_2_3 - 0.000730519480519505*G0_1_0_0_2_5 - 0.000146103896103901*G0_1_0_0_3_0 - 0.000146103896103899*G0_1_0_0_3_1 + 0.000584415584415602*G0_1_0_0_3_2 + 0.00116883116883121*G0_1_0_0_3_4 + 0.00175324675324681*G0_1_0_0_3_5 + 0.00146103896103901*G0_1_0_0_4_0 - 0.000438311688311702*G0_1_0_0_4_1 + 0.00116883116883121*G0_1_0_0_4_3 + 0.00350649350649362*G0_1_0_0_4_4 + 0.00233766233766241*G0_1_0_0_4_5 + 0.0007305194805195*G0_1_0_0_5_0 + 0.000292207792207812*G0_1_0_0_5_1 - 0.000730519480519505*G0_1_0_0_5_2 + 0.00175324675324681*G0_1_0_0_5_3 + 0.00233766233766241*G0_1_0_0_5_4 + 0.00525974025974044*G0_1_0_0_5_5 - 0.000438311688311704*G0_1_0_1_0_0 + 0.000474837662337692*G0_1_0_1_0_1 - 0.000146103896103901*G0_1_0_1_0_2 - 0.000146103896103899*G0_1_0_1_0_3 - 0.000438311688311702*G0_1_0_1_0_4 + 0.000292207792207812*G0_1_0_1_0_5 + 0.000474837662337692*G0_1_0_1_1_0 - 0.000620941558441572*G0_1_0_1_1_2 + 0.00146103896103898*G0_1_0_1_1_3 + 0.000146103896103898*G0_1_0_1_1_4 - 0.00146103896103907*G0_1_0_1_1_5 - 0.000146103896103901*G0_1_0_1_2_0 - 0.000620941558441572*G0_1_0_1_2_1 + 0.00160714285714291*G0_1_0_1_2_2 + 0.000876623376623405*G0_1_0_1_2_3 + 0.0011688311688312*G0_1_0_1_2_4 + 0.000730519480519507*G0_1_0_1_2_5 - 0.000146103896103899*G0_1_0_1_3_0 + 0.00146103896103899*G0_1_0_1_3_1 + 0.000876623376623405*G0_1_0_1_3_2 + 0.00701298701298728*G0_1_0_1_3_3 - 0.00116883116883121*G0_1_0_1_3_5 - 0.000438311688311702*G0_1_0_1_4_0 + 0.000146103896103898*G0_1_0_1_4_1 + 0.0011688311688312*G0_1_0_1_4_2 - 0.00233766233766241*G0_1_0_1_4_4 - 0.00175324675324681*G0_1_0_1_4_5 + 0.000292207792207812*G0_1_0_1_5_0 - 0.00146103896103908*G0_1_0_1_5_1 + 0.000730519480519507*G0_1_0_1_5_2 - 0.00116883116883121*G0_1_0_1_5_3 - 0.00175324675324681*G0_1_0_1_5_4 - 0.00467532467532488*G0_1_0_1_5_5 - 0.000474837662337676*G0_1_0_2_0_0 - 0.000146103896103901*G0_1_0_2_0_1 + 0.0011688311688312*G0_1_0_2_0_2 + 0.000584415584415602*G0_1_0_2_0_3 - 0.000730519480519505*G0_1_0_2_0_5 - 0.000146103896103901*G0_1_0_2_1_0 - 0.000620941558441572*G0_1_0_2_1_1 + 0.00160714285714291*G0_1_0_2_1_2 + 0.000876623376623405*G0_1_0_2_1_3 + 0.00116883116883121*G0_1_0_2_1_4 + 0.000730519480519507*G0_1_0_2_1_5 + 0.0011688311688312*G0_1_0_2_2_0 + 0.00160714285714291*G0_1_0_2_2_1 - 0.0120535714285717*G0_1_0_2_2_2 - 0.00672077922077943*G0_1_0_2_2_3 - 0.00350649350649359*G0_1_0_2_2_4 - 0.000584415584415606*G0_1_0_2_2_5 + 0.000584415584415602*G0_1_0_2_3_0 + 0.000876623376623405*G0_1_0_2_3_1 - 0.00672077922077943*G0_1_0_2_3_2 - 0.0105194805194809*G0_1_0_2_3_3 - 0.00350649350649362*G0_1_0_2_3_4 + 0.00116883116883121*G0_1_0_2_4_1 - 0.00350649350649359*G0_1_0_2_4_2 - 0.00350649350649362*G0_1_0_2_4_3 - 0.00584415584415601*G0_1_0_2_4_4 - 0.0011688311688312*G0_1_0_2_4_5 - 0.000730519480519505*G0_1_0_2_5_0 + 0.000730519480519507*G0_1_0_2_5_1 - 0.000584415584415606*G0_1_0_2_5_2 - 0.0011688311688312*G0_1_0_2_5_4 + 0.00175324675324682*G0_1_0_2_5_5 - 0.000146103896103901*G0_1_0_3_0_0 - 0.000146103896103899*G0_1_0_3_0_1 + 0.000584415584415602*G0_1_0_3_0_2 + 0.00116883116883121*G0_1_0_3_0_4 + 0.00175324675324681*G0_1_0_3_0_5 - 0.000146103896103899*G0_1_0_3_1_0 + 0.00146103896103898*G0_1_0_3_1_1 + 0.000876623376623405*G0_1_0_3_1_2 + 0.00701298701298728*G0_1_0_3_1_3 - 0.00116883116883121*G0_1_0_3_1_5 + 0.000584415584415602*G0_1_0_3_2_0 + 0.000876623376623405*G0_1_0_3_2_1 - 0.00672077922077943*G0_1_0_3_2_2 - 0.0105194805194809*G0_1_0_3_2_3 - 0.00350649350649362*G0_1_0_3_2_4 + 0.00701298701298728*G0_1_0_3_3_1 - 0.0105194805194809*G0_1_0_3_3_2 + 0.0420779220779236*G0_1_0_3_3_3 + 0.00116883116883121*G0_1_0_3_4_0 - 0.00350649350649362*G0_1_0_3_4_2 + 0.00233766233766241*G0_1_0_3_4_4 + 0.00175324675324681*G0_1_0_3_5_0 - 0.00116883116883121*G0_1_0_3_5_1 - 0.00701298701298727*G0_1_0_3_5_5 + 0.00146103896103901*G0_1_0_4_0_0 - 0.000438311688311702*G0_1_0_4_0_1 + 0.00116883116883121*G0_1_0_4_0_3 + 0.00350649350649362*G0_1_0_4_0_4 + 0.00233766233766241*G0_1_0_4_0_5 - 0.000438311688311702*G0_1_0_4_1_0 + 0.000146103896103898*G0_1_0_4_1_1 + 0.0011688311688312*G0_1_0_4_1_2 - 0.00233766233766241*G0_1_0_4_1_4 - 0.00175324675324681*G0_1_0_4_1_5 + 0.0011688311688312*G0_1_0_4_2_1 - 0.00350649350649359*G0_1_0_4_2_2 - 0.00350649350649362*G0_1_0_4_2_3 - 0.00584415584415601*G0_1_0_4_2_4 - 0.0011688311688312*G0_1_0_4_2_5 + 0.00116883116883121*G0_1_0_4_3_0 - 0.00350649350649362*G0_1_0_4_3_2 + 0.00233766233766241*G0_1_0_4_3_4 + 0.00350649350649362*G0_1_0_4_4_0 - 0.00233766233766241*G0_1_0_4_4_1 - 0.00584415584415601*G0_1_0_4_4_2 + 0.00233766233766241*G0_1_0_4_4_3 + 0.0210389610389617*G0_1_0_4_4_4 + 0.00701298701298723*G0_1_0_4_4_5 + 0.00233766233766241*G0_1_0_4_5_0 - 0.00175324675324681*G0_1_0_4_5_1 - 0.0011688311688312*G0_1_0_4_5_2 + 0.00701298701298723*G0_1_0_4_5_4 + 0.0007305194805195*G0_1_0_5_0_0 + 0.000292207792207812*G0_1_0_5_0_1 - 0.000730519480519505*G0_1_0_5_0_2 + 0.00175324675324681*G0_1_0_5_0_3 + 0.00233766233766241*G0_1_0_5_0_4 + 0.00525974025974044*G0_1_0_5_0_5 + 0.000292207792207812*G0_1_0_5_1_0 - 0.00146103896103907*G0_1_0_5_1_1 + 0.000730519480519507*G0_1_0_5_1_2 - 0.00116883116883121*G0_1_0_5_1_3 - 0.00175324675324681*G0_1_0_5_1_4 - 0.00467532467532488*G0_1_0_5_1_5 - 0.000730519480519505*G0_1_0_5_2_0 + 0.000730519480519507*G0_1_0_5_2_1 - 0.000584415584415606*G0_1_0_5_2_2 - 0.0011688311688312*G0_1_0_5_2_4 + 0.00175324675324682*G0_1_0_5_2_5 + 0.00175324675324681*G0_1_0_5_3_0 - 0.00116883116883121*G0_1_0_5_3_1 - 0.00701298701298727*G0_1_0_5_3_5 + 0.00233766233766241*G0_1_0_5_4_0 - 0.00175324675324681*G0_1_0_5_4_1 - 0.0011688311688312*G0_1_0_5_4_2 + 0.00701298701298723*G0_1_0_5_4_4 + 0.00525974025974044*G0_1_0_5_5_0 - 0.00467532467532488*G0_1_0_5_5_1 + 0.00175324675324682*G0_1_0_5_5_2 - 0.00701298701298727*G0_1_0_5_5_3 - 0.0210389610389619*G0_1_0_5_5_5 - 0.00997159090909111*G0_1_1_0_0_0 + 0.0011688311688312*G0_1_1_0_0_1 + 0.000693993506493524*G0_1_1_0_0_2 - 0.000730519480519502*G0_1_1_0_0_3 - 0.00204545454545459*G0_1_1_0_0_4 - 0.00599025974025989*G0_1_1_0_0_5 + 0.0011688311688312*G0_1_1_0_1_0 - 0.000146103896103895*G0_1_1_0_1_1 - 0.000292207792207801*G0_1_1_0_1_2 + 0.000584415584415603*G0_1_1_0_1_3 + 0.0007305194805195*G0_1_1_0_1_4 + 0.0011688311688312*G0_1_1_0_1_5 + 0.000693993506493524*G0_1_1_0_2_0 - 0.000292207792207801*G0_1_1_0_2_1 + 0.000693993506493524*G0_1_1_0_2_2 - 0.000146103896103903*G0_1_1_0_2_3 - 0.000146103896103904*G0_1_1_0_2_5 - 0.000730519480519502*G0_1_1_0_3_0 + 0.000584415584415603*G0_1_1_0_3_1 - 0.000146103896103903*G0_1_1_0_3_2 + 0.00175324675324682*G0_1_1_0_3_3 + 0.00175324675324682*G0_1_1_0_3_5 - 0.00204545454545459*G0_1_1_0_4_0 + 0.0007305194805195*G0_1_1_0_4_1 - 0.00233766233766239*G0_1_1_0_4_4 - 0.00116883116883119*G0_1_1_0_4_5 - 0.00599025974025989*G0_1_1_0_5_0 + 0.0011688311688312*G0_1_1_0_5_1 - 0.000146103896103904*G0_1_1_0_5_2 + 0.00175324675324682*G0_1_1_0_5_3 - 0.00116883116883119*G0_1_1_0_5_4 - 0.00525974025974038*G0_1_1_0_5_5 + 0.0011688311688312*G0_1_1_1_0_0 - 0.000146103896103895*G0_1_1_1_0_1 - 0.000292207792207801*G0_1_1_1_0_2 + 0.000584415584415603*G0_1_1_1_0_3 + 0.0007305194805195*G0_1_1_1_0_4 + 0.0011688311688312*G0_1_1_1_0_5 - 0.000146103896103895*G0_1_1_1_1_0 - 0.0001461038961039*G0_1_1_1_1_2 + 0.0002922077922078*G0_1_1_1_1_4 - 0.000292207792207801*G0_1_1_1_2_0 - 0.0001461038961039*G0_1_1_1_2_1 + 0.00116883116883121*G0_1_1_1_2_2 + 0.00116883116883121*G0_1_1_1_2_3 + 0.000730519480519504*G0_1_1_1_2_4 + 0.000584415584415605*G0_1_1_1_2_5 + 0.000584415584415603*G0_1_1_1_3_0 + 0.00116883116883121*G0_1_1_1_3_2 + 0.00233766233766243*G0_1_1_1_3_3 - 0.00175324675324681*G0_1_1_1_3_4 - 0.00233766233766242*G0_1_1_1_3_5 + 0.0007305194805195*G0_1_1_1_4_0 + 0.0002922077922078*G0_1_1_1_4_1 + 0.000730519480519504*G0_1_1_1_4_2 - 0.00175324675324681*G0_1_1_1_4_3 - 0.00467532467532482*G0_1_1_1_4_4 - 0.00175324675324681*G0_1_1_1_4_5 + 0.0011688311688312*G0_1_1_1_5_0 + 0.000584415584415605*G0_1_1_1_5_2 - 0.00233766233766242*G0_1_1_1_5_3 - 0.00175324675324681*G0_1_1_1_5_4 + 0.00233766233766239*G0_1_1_1_5_5 + 0.000693993506493524*G0_1_1_2_0_0 - 0.000292207792207801*G0_1_1_2_0_1 + 0.000693993506493524*G0_1_1_2_0_2 - 0.000146103896103903*G0_1_1_2_0_3 - 0.000146103896103904*G0_1_1_2_0_5 - 0.000292207792207801*G0_1_1_2_1_0 - 0.0001461038961039*G0_1_1_2_1_1 + 0.00116883116883121*G0_1_1_2_1_2 + 0.00116883116883121*G0_1_1_2_1_3 + 0.000730519480519504*G0_1_1_2_1_4 + 0.000584415584415605*G0_1_1_2_1_5 + 0.000693993506493524*G0_1_1_2_2_0 + 0.00116883116883121*G0_1_1_2_2_1 - 0.00997159090909113*G0_1_1_2_2_2 - 0.00599025974025994*G0_1_1_2_2_3 - 0.0020454545454546*G0_1_1_2_2_4 - 0.000730519480519507*G0_1_1_2_2_5 - 0.000146103896103903*G0_1_1_2_3_0 + 0.00116883116883121*G0_1_1_2_3_1 - 0.00599025974025994*G0_1_1_2_3_2 - 0.00525974025974045*G0_1_1_2_3_3 - 0.0011688311688312*G0_1_1_2_3_4 + 0.00175324675324681*G0_1_1_2_3_5 + 0.000730519480519504*G0_1_1_2_4_1 - 0.00204545454545459*G0_1_1_2_4_2 - 0.0011688311688312*G0_1_1_2_4_3 - 0.00233766233766241*G0_1_1_2_4_4 - 0.000146103896103904*G0_1_1_2_5_0 + 0.000584415584415605*G0_1_1_2_5_1 - 0.000730519480519507*G0_1_1_2_5_2 + 0.00175324675324681*G0_1_1_2_5_3 + 0.00175324675324681*G0_1_1_2_5_5 - 0.000730519480519502*G0_1_1_3_0_0 + 0.000584415584415603*G0_1_1_3_0_1 - 0.000146103896103903*G0_1_1_3_0_2 + 0.00175324675324682*G0_1_1_3_0_3 + 0.00175324675324682*G0_1_1_3_0_5 + 0.000584415584415603*G0_1_1_3_1_0 + 0.00116883116883121*G0_1_1_3_1_2 + 0.00233766233766243*G0_1_1_3_1_3 - 0.00175324675324681*G0_1_1_3_1_4 - 0.00233766233766242*G0_1_1_3_1_5 - 0.000146103896103903*G0_1_1_3_2_0 + 0.00116883116883121*G0_1_1_3_2_1 - 0.00599025974025994*G0_1_1_3_2_2 - 0.00525974025974045*G0_1_1_3_2_3 - 0.0011688311688312*G0_1_1_3_2_4 + 0.00175324675324681*G0_1_1_3_2_5 + 0.00175324675324682*G0_1_1_3_3_0 + 0.00233766233766243*G0_1_1_3_3_1 - 0.00525974025974045*G0_1_1_3_3_2 + 0.0210389610389617*G0_1_1_3_3_3 - 0.00701298701298726*G0_1_1_3_3_5 - 0.00175324675324681*G0_1_1_3_4_1 - 0.0011688311688312*G0_1_1_3_4_2 + 0.00935064935064963*G0_1_1_3_4_4 + 0.00175324675324682*G0_1_1_3_5_0 - 0.00233766233766242*G0_1_1_3_5_1 + 0.00175324675324681*G0_1_1_3_5_2 - 0.00701298701298726*G0_1_1_3_5_3 - 0.00701298701298726*G0_1_1_3_5_5 - 0.00204545454545459*G0_1_1_4_0_0 + 0.0007305194805195*G0_1_1_4_0_1 - 0.00233766233766239*G0_1_1_4_0_4 - 0.00116883116883119*G0_1_1_4_0_5 + 0.0007305194805195*G0_1_1_4_1_0 + 0.0002922077922078*G0_1_1_4_1_1 + 0.000730519480519504*G0_1_1_4_1_2 - 0.00175324675324681*G0_1_1_4_1_3 - 0.00467532467532482*G0_1_1_4_1_4 - 0.00175324675324681*G0_1_1_4_1_5 + 0.000730519480519504*G0_1_1_4_2_1 - 0.0020454545454546*G0_1_1_4_2_2 - 0.0011688311688312*G0_1_1_4_2_3 - 0.00233766233766241*G0_1_1_4_2_4 - 0.00175324675324681*G0_1_1_4_3_1 - 0.0011688311688312*G0_1_1_4_3_2 + 0.00935064935064963*G0_1_1_4_3_4 - 0.00233766233766239*G0_1_1_4_4_0 - 0.00467532467532482*G0_1_1_4_4_1 - 0.00233766233766241*G0_1_1_4_4_2 + 0.00935064935064963*G0_1_1_4_4_3 + 0.0420779220779234*G0_1_1_4_4_4 + 0.00935064935064964*G0_1_1_4_4_5 - 0.00116883116883119*G0_1_1_4_5_0 - 0.00175324675324681*G0_1_1_4_5_1 + 0.00935064935064964*G0_1_1_4_5_4 - 0.00599025974025989*G0_1_1_5_0_0 + 0.0011688311688312*G0_1_1_5_0_1 - 0.000146103896103904*G0_1_1_5_0_2 + 0.00175324675324682*G0_1_1_5_0_3 - 0.00116883116883119*G0_1_1_5_0_4 - 0.00525974025974038*G0_1_1_5_0_5 + 0.0011688311688312*G0_1_1_5_1_0 + 0.000584415584415605*G0_1_1_5_1_2 - 0.00233766233766242*G0_1_1_5_1_3 - 0.00175324675324681*G0_1_1_5_1_4 + 0.00233766233766239*G0_1_1_5_1_5 - 0.000146103896103904*G0_1_1_5_2_0 + 0.000584415584415605*G0_1_1_5_2_1 - 0.000730519480519507*G0_1_1_5_2_2 + 0.00175324675324681*G0_1_1_5_2_3 + 0.00175324675324681*G0_1_1_5_2_5 + 0.00175324675324682*G0_1_1_5_3_0 - 0.00233766233766242*G0_1_1_5_3_1 + 0.00175324675324681*G0_1_1_5_3_2 - 0.00701298701298726*G0_1_1_5_3_3 - 0.00701298701298726*G0_1_1_5_3_5 - 0.00116883116883119*G0_1_1_5_4_0 - 0.00175324675324681*G0_1_1_5_4_1 + 0.00935064935064964*G0_1_1_5_4_4 - 0.00525974025974038*G0_1_1_5_5_0 + 0.00233766233766239*G0_1_1_5_5_1 + 0.00175324675324681*G0_1_1_5_5_2 - 0.00701298701298726*G0_1_1_5_5_3 + 0.0210389610389618*G0_1_1_5_5_5; + A[85] = -A[35] + 0.0242897727272736*G0_0_0_0_0_0 - 0.00110795454545458*G0_0_0_0_0_1 - 0.00367694805194818*G0_0_0_0_0_2 + 0.0219155844155852*G0_0_0_0_0_4 + 0.00267857142857153*G0_0_0_0_0_5 - 0.00110795454545458*G0_0_0_0_1_0 + 0.000365259740259747*G0_0_0_0_1_1 + 0.000547889610389628*G0_0_0_0_1_2 - 0.000487012987013004*G0_0_0_0_1_3 - 0.00204545454545462*G0_0_0_0_1_4 - 0.000487012987013*G0_0_0_0_1_5 - 0.00367694805194818*G0_0_0_0_2_0 + 0.000547889610389628*G0_0_0_0_2_1 + 0.0025689935064936*G0_0_0_0_2_2 - 0.0016071428571429*G0_0_0_0_2_3 - 0.00925324675324705*G0_0_0_0_2_4 - 0.00224025974025981*G0_0_0_0_2_5 - 0.000487012987013004*G0_0_0_0_3_1 - 0.0016071428571429*G0_0_0_0_3_2 - 0.0013636363636364*G0_0_0_0_3_3 + 0.00389610389610401*G0_0_0_0_3_4 + 0.00428571428571441*G0_0_0_0_3_5 + 0.0219155844155852*G0_0_0_0_4_0 - 0.00204545454545462*G0_0_0_0_4_1 - 0.00925324675324705*G0_0_0_0_4_2 + 0.00389610389610401*G0_0_0_0_4_3 + 0.0315584415584427*G0_0_0_0_4_4 + 0.00857142857142885*G0_0_0_0_4_5 + 0.00267857142857153*G0_0_0_0_5_0 - 0.000487012987013*G0_0_0_0_5_1 - 0.00224025974025981*G0_0_0_0_5_2 + 0.00428571428571441*G0_0_0_0_5_3 + 0.00857142857142885*G0_0_0_0_5_4 + 0.00487012987013*G0_0_0_0_5_5 - 0.00110795454545458*G0_0_0_1_0_0 + 0.000365259740259747*G0_0_0_1_0_1 + 0.000547889610389628*G0_0_0_1_0_2 - 0.000487012987013004*G0_0_0_1_0_3 - 0.00204545454545461*G0_0_0_1_0_4 - 0.000487012987013*G0_0_0_1_0_5 + 0.000365259740259747*G0_0_0_1_1_0 - 0.00401785714285718*G0_0_0_1_1_1 + 0.000974025974026001*G0_0_0_1_1_2 - 0.00146103896103899*G0_0_0_1_1_3 - 0.000974025974026004*G0_0_0_1_1_4 - 0.002922077922078*G0_0_0_1_1_5 + 0.000547889610389628*G0_0_0_1_2_0 + 0.000974025974026001*G0_0_0_1_2_1 + 0.00125405844155849*G0_0_0_1_2_2 - 0.00292207792207802*G0_0_0_1_2_3 - 0.0011201298701299*G0_0_0_1_2_4 - 0.00194805194805201*G0_0_0_1_2_5 - 0.000487012987013004*G0_0_0_1_3_0 - 0.00146103896103899*G0_0_0_1_3_1 - 0.00292207792207802*G0_0_0_1_3_2 - 0.002922077922078*G0_0_0_1_3_3 + 0.00292207792207802*G0_0_0_1_3_4 + 0.00487012987013003*G0_0_0_1_3_5 - 0.00204545454545461*G0_0_0_1_4_0 - 0.000974025974026004*G0_0_0_1_4_1 - 0.0011201298701299*G0_0_0_1_4_2 + 0.00292207792207802*G0_0_0_1_4_3 - 0.00623376623376644*G0_0_0_1_4_4 + 0.00584415584415603*G0_0_0_1_4_5 - 0.000487012987013*G0_0_0_1_5_0 - 0.002922077922078*G0_0_0_1_5_1 - 0.00194805194805201*G0_0_0_1_5_2 + 0.00487012987013003*G0_0_0_1_5_3 + 0.00584415584415603*G0_0_0_1_5_4 + 0.0107142857142861*G0_0_0_1_5_5 - 0.00367694805194818*G0_0_0_2_0_0 + 0.000547889610389628*G0_0_0_2_0_1 + 0.0025689935064936*G0_0_0_2_0_2 - 0.0016071428571429*G0_0_0_2_0_3 - 0.00925324675324705*G0_0_0_2_0_4 - 0.00224025974025981*G0_0_0_2_0_5 + 0.000547889610389628*G0_0_0_2_1_0 + 0.000974025974026001*G0_0_0_2_1_1 + 0.00125405844155849*G0_0_0_2_1_2 - 0.00292207792207802*G0_0_0_2_1_3 - 0.0011201298701299*G0_0_0_2_1_4 - 0.00194805194805201*G0_0_0_2_1_5 + 0.0025689935064936*G0_0_0_2_2_0 + 0.00125405844155849*G0_0_0_2_2_1 - 0.0401785714285729*G0_0_0_2_2_2 - 0.00370129870129885*G0_0_0_2_2_3 - 0.00214285714285726*G0_0_0_2_2_4 - 0.00199675324675332*G0_0_0_2_2_5 - 0.0016071428571429*G0_0_0_2_3_0 - 0.00292207792207802*G0_0_0_2_3_1 - 0.00370129870129885*G0_0_0_2_3_2 + 0.0132467532467537*G0_0_0_2_3_3 + 0.00545454545454562*G0_0_0_2_3_4 + 0.00720779220779244*G0_0_0_2_3_5 - 0.00925324675324705*G0_0_0_2_4_0 - 0.0011201298701299*G0_0_0_2_4_1 - 0.00214285714285726*G0_0_0_2_4_2 + 0.00545454545454562*G0_0_0_2_4_3 - 0.000779220779220836*G0_0_0_2_4_4 + 0.00623376623376643*G0_0_0_2_4_5 - 0.00224025974025981*G0_0_0_2_5_0 - 0.00194805194805201*G0_0_0_2_5_1 - 0.00199675324675332*G0_0_0_2_5_2 + 0.00720779220779244*G0_0_0_2_5_3 + 0.00623376623376643*G0_0_0_2_5_4 + 0.0136363636363641*G0_0_0_2_5_5 - 0.000487012987013004*G0_0_0_3_0_1 - 0.0016071428571429*G0_0_0_3_0_2 - 0.0013636363636364*G0_0_0_3_0_3 + 0.00389610389610401*G0_0_0_3_0_4 + 0.00428571428571441*G0_0_0_3_0_5 - 0.000487012987013004*G0_0_0_3_1_0 - 0.00146103896103899*G0_0_0_3_1_1 - 0.00292207792207802*G0_0_0_3_1_2 - 0.002922077922078*G0_0_0_3_1_3 + 0.00292207792207802*G0_0_0_3_1_4 + 0.00487012987013003*G0_0_0_3_1_5 - 0.0016071428571429*G0_0_0_3_2_0 - 0.00292207792207802*G0_0_0_3_2_1 - 0.00370129870129885*G0_0_0_3_2_2 + 0.0132467532467537*G0_0_0_3_2_3 + 0.00545454545454562*G0_0_0_3_2_4 + 0.00720779220779244*G0_0_0_3_2_5 - 0.0013636363636364*G0_0_0_3_3_0 - 0.002922077922078*G0_0_0_3_3_1 + 0.0132467532467537*G0_0_0_3_3_2 + 0.121558441558446*G0_0_0_3_3_3 - 0.0031168831168832*G0_0_0_3_3_4 - 0.011688311688312*G0_0_0_3_3_5 + 0.00389610389610402*G0_0_0_3_4_0 + 0.00292207792207802*G0_0_0_3_4_1 + 0.00545454545454562*G0_0_0_3_4_2 - 0.0031168831168832*G0_0_0_3_4_3 + 0.00467532467532483*G0_0_0_3_4_4 - 0.0202597402597409*G0_0_0_3_4_5 + 0.00428571428571441*G0_0_0_3_5_0 + 0.00487012987013003*G0_0_0_3_5_1 + 0.00720779220779244*G0_0_0_3_5_2 - 0.011688311688312*G0_0_0_3_5_3 - 0.0202597402597409*G0_0_0_3_5_4 - 0.035844155844157*G0_0_0_3_5_5 + 0.0219155844155852*G0_0_0_4_0_0 - 0.00204545454545461*G0_0_0_4_0_1 - 0.00925324675324705*G0_0_0_4_0_2 + 0.00389610389610401*G0_0_0_4_0_3 + 0.0315584415584427*G0_0_0_4_0_4 + 0.00857142857142885*G0_0_0_4_0_5 - 0.00204545454545462*G0_0_0_4_1_0 - 0.000974025974026004*G0_0_0_4_1_1 - 0.0011201298701299*G0_0_0_4_1_2 + 0.00292207792207802*G0_0_0_4_1_3 - 0.00623376623376644*G0_0_0_4_1_4 + 0.00584415584415603*G0_0_0_4_1_5 - 0.00925324675324706*G0_0_0_4_2_0 - 0.0011201298701299*G0_0_0_4_2_1 - 0.00214285714285726*G0_0_0_4_2_2 + 0.00545454545454562*G0_0_0_4_2_3 - 0.000779220779220838*G0_0_0_4_2_4 + 0.00623376623376644*G0_0_0_4_2_5 + 0.00389610389610401*G0_0_0_4_3_0 + 0.00292207792207802*G0_0_0_4_3_1 + 0.00545454545454562*G0_0_0_4_3_2 - 0.0031168831168832*G0_0_0_4_3_3 + 0.00467532467532483*G0_0_0_4_3_4 - 0.0202597402597409*G0_0_0_4_3_5 + 0.0315584415584427*G0_0_0_4_4_0 - 0.00623376623376644*G0_0_0_4_4_1 - 0.000779220779220834*G0_0_0_4_4_2 + 0.00467532467532483*G0_0_0_4_4_3 + 0.317922077922088*G0_0_0_4_4_4 + 0.00857142857142885*G0_0_0_4_5_0 + 0.00584415584415603*G0_0_0_4_5_1 + 0.00623376623376643*G0_0_0_4_5_2 - 0.0202597402597409*G0_0_0_4_5_3 - 0.0389610389610403*G0_0_0_4_5_5 + 0.00267857142857153*G0_0_0_5_0_0 - 0.000487012987013*G0_0_0_5_0_1 - 0.00224025974025981*G0_0_0_5_0_2 + 0.00428571428571441*G0_0_0_5_0_3 + 0.00857142857142885*G0_0_0_5_0_4 + 0.00487012987013*G0_0_0_5_0_5 - 0.000487012987013*G0_0_0_5_1_0 - 0.002922077922078*G0_0_0_5_1_1 - 0.00194805194805201*G0_0_0_5_1_2 + 0.00487012987013003*G0_0_0_5_1_3 + 0.00584415584415603*G0_0_0_5_1_4 + 0.0107142857142861*G0_0_0_5_1_5 - 0.00224025974025981*G0_0_0_5_2_0 - 0.00194805194805201*G0_0_0_5_2_1 - 0.00199675324675332*G0_0_0_5_2_2 + 0.00720779220779244*G0_0_0_5_2_3 + 0.00623376623376644*G0_0_0_5_2_4 + 0.0136363636363641*G0_0_0_5_2_5 + 0.00428571428571441*G0_0_0_5_3_0 + 0.00487012987013003*G0_0_0_5_3_1 + 0.00720779220779244*G0_0_0_5_3_2 - 0.011688311688312*G0_0_0_5_3_3 - 0.0202597402597409*G0_0_0_5_3_4 - 0.035844155844157*G0_0_0_5_3_5 + 0.00857142857142885*G0_0_0_5_4_0 + 0.00584415584415603*G0_0_0_5_4_1 + 0.00623376623376643*G0_0_0_5_4_2 - 0.0202597402597409*G0_0_0_5_4_3 - 0.0389610389610402*G0_0_0_5_4_5 + 0.00487012987013*G0_0_0_5_5_0 + 0.0107142857142861*G0_0_0_5_5_1 + 0.0136363636363641*G0_0_0_5_5_2 - 0.035844155844157*G0_0_0_5_5_3 - 0.0389610389610402*G0_0_0_5_5_4 - 0.0958441558441591*G0_0_0_5_5_5 - 0.0955154220779253*G0_0_1_0_0_0 + 0.00340909090909101*G0_0_1_0_0_1 + 0.00631899350649372*G0_0_1_0_0_2 - 0.00199675324675329*G0_0_1_0_0_3 - 0.0238636363636371*G0_0_1_0_0_4 - 0.0129058441558446*G0_0_1_0_0_5 + 0.00340909090909101*G0_0_1_0_1_0 + 0.00012175324675325*G0_0_1_0_1_1 + 0.000109577922077925*G0_0_1_0_1_2 - 0.000730519480519504*G0_0_1_0_1_3 + 0.000243506493506503*G0_0_1_0_1_4 - 0.00194805194805202*G0_0_1_0_1_5 + 0.00631899350649372*G0_0_1_0_2_0 + 0.000109577922077925*G0_0_1_0_2_1 + 0.000474837662337684*G0_0_1_0_2_2 - 0.0017045454545455*G0_0_1_0_2_3 - 0.0011688311688312*G0_0_1_0_2_4 - 0.00121753246753251*G0_0_1_0_2_5 - 0.00199675324675329*G0_0_1_0_3_0 - 0.000730519480519504*G0_0_1_0_3_1 - 0.0017045454545455*G0_0_1_0_3_2 + 0.00253246753246762*G0_0_1_0_3_3 + 0.00350649350649361*G0_0_1_0_3_4 + 0.00642857142857163*G0_0_1_0_3_5 - 0.0238636363636371*G0_0_1_0_4_0 + 0.000243506493506503*G0_0_1_0_4_1 - 0.0011688311688312*G0_0_1_0_4_2 + 0.00350649350649361*G0_0_1_0_4_3 - 0.0144155844155849*G0_0_1_0_4_4 + 0.001948051948052*G0_0_1_0_4_5 - 0.0129058441558446*G0_0_1_0_5_0 - 0.00194805194805202*G0_0_1_0_5_1 - 0.00121753246753251*G0_0_1_0_5_2 + 0.00642857142857163*G0_0_1_0_5_3 + 0.001948051948052*G0_0_1_0_5_4 + 0.017337662337663*G0_0_1_0_5_5 + 0.00340909090909101*G0_0_1_1_0_0 + 0.00012175324675325*G0_0_1_1_0_1 + 0.000109577922077925*G0_0_1_1_0_2 - 0.000730519480519504*G0_0_1_1_0_3 + 0.000243506493506503*G0_0_1_1_0_4 - 0.00194805194805202*G0_0_1_1_0_5 + 0.00012175324675325*G0_0_1_1_1_0 + 0.000608766233766252*G0_0_1_1_1_2 - 0.000730519480519495*G0_0_1_1_1_3 - 0.000730519480519502*G0_0_1_1_1_4 + 0.000730519480519517*G0_0_1_1_1_5 + 0.000109577922077925*G0_0_1_1_2_0 + 0.000608766233766251*G0_0_1_1_2_1 + 0.00104707792207796*G0_0_1_1_2_2 - 0.00243506493506501*G0_0_1_1_2_3 - 0.00141233766233771*G0_0_1_1_2_4 - 0.000730519480519503*G0_0_1_1_2_5 - 0.000730519480519504*G0_0_1_1_3_0 - 0.000730519480519495*G0_0_1_1_3_1 - 0.00243506493506501*G0_0_1_1_3_2 - 0.00194805194805202*G0_0_1_1_3_3 + 0.00292207792207801*G0_0_1_1_3_4 + 0.00292207792207801*G0_0_1_1_3_5 + 0.000243506493506503*G0_0_1_1_4_0 - 0.000730519480519502*G0_0_1_1_4_1 - 0.00141233766233771*G0_0_1_1_4_2 + 0.00292207792207801*G0_0_1_1_4_3 - 0.00233766233766242*G0_0_1_1_4_4 + 0.00292207792207801*G0_0_1_1_4_5 - 0.00194805194805202*G0_0_1_1_5_0 + 0.000730519480519517*G0_0_1_1_5_1 - 0.000730519480519503*G0_0_1_1_5_2 + 0.00292207792207801*G0_0_1_1_5_3 + 0.00292207792207801*G0_0_1_1_5_4 - 0.00389610389610405*G0_0_1_1_5_5 + 0.00631899350649372*G0_0_1_2_0_0 + 0.000109577922077925*G0_0_1_2_0_1 + 0.000474837662337684*G0_0_1_2_0_2 - 0.0017045454545455*G0_0_1_2_0_3 - 0.0011688311688312*G0_0_1_2_0_4 - 0.00121753246753251*G0_0_1_2_0_5 + 0.000109577922077925*G0_0_1_2_1_0 + 0.000608766233766252*G0_0_1_2_1_1 + 0.00104707792207796*G0_0_1_2_1_2 - 0.00243506493506501*G0_0_1_2_1_3 - 0.00141233766233771*G0_0_1_2_1_4 - 0.000730519480519503*G0_0_1_2_1_5 + 0.000474837662337684*G0_0_1_2_2_0 + 0.00104707792207796*G0_0_1_2_2_1 - 0.0361972402597416*G0_0_1_2_2_2 - 0.00345779220779234*G0_0_1_2_2_3 - 0.00214285714285725*G0_0_1_2_2_4 - 0.00150974025974031*G0_0_1_2_2_5 - 0.0017045454545455*G0_0_1_2_3_0 - 0.00243506493506501*G0_0_1_2_3_1 - 0.00345779220779234*G0_0_1_2_3_2 + 0.0142207792207797*G0_0_1_2_3_3 + 0.00623376623376643*G0_0_1_2_3_4 + 0.00642857142857164*G0_0_1_2_3_5 - 0.0011688311688312*G0_0_1_2_4_0 - 0.00141233766233771*G0_0_1_2_4_1 - 0.00214285714285725*G0_0_1_2_4_2 + 0.00623376623376643*G0_0_1_2_4_3 + 0.0167532467532473*G0_0_1_2_4_4 + 0.00584415584415603*G0_0_1_2_4_5 - 0.00121753246753251*G0_0_1_2_5_0 - 0.000730519480519503*G0_0_1_2_5_1 - 0.00150974025974031*G0_0_1_2_5_2 + 0.00642857142857164*G0_0_1_2_5_3 + 0.00584415584415603*G0_0_1_2_5_4 + 0.00564935064935083*G0_0_1_2_5_5 - 0.00199675324675329*G0_0_1_3_0_0 - 0.000730519480519504*G0_0_1_3_0_1 - 0.0017045454545455*G0_0_1_3_0_2 + 0.00253246753246762*G0_0_1_3_0_3 + 0.00350649350649361*G0_0_1_3_0_4 + 0.00642857142857163*G0_0_1_3_0_5 - 0.000730519480519504*G0_0_1_3_1_0 - 0.000730519480519495*G0_0_1_3_1_1 - 0.00243506493506501*G0_0_1_3_1_2 - 0.00194805194805202*G0_0_1_3_1_3 + 0.00292207792207801*G0_0_1_3_1_4 + 0.00292207792207801*G0_0_1_3_1_5 - 0.0017045454545455*G0_0_1_3_2_0 - 0.00243506493506501*G0_0_1_3_2_1 - 0.00345779220779234*G0_0_1_3_2_2 + 0.0142207792207797*G0_0_1_3_2_3 + 0.00623376623376643*G0_0_1_3_2_4 + 0.00642857142857164*G0_0_1_3_2_5 + 0.00253246753246762*G0_0_1_3_3_0 - 0.00194805194805202*G0_0_1_3_3_1 + 0.0142207792207797*G0_0_1_3_3_2 + 0.0911688311688344*G0_0_1_3_3_3 - 0.0109090909090912*G0_0_1_3_3_4 - 0.0179220779220785*G0_0_1_3_3_5 + 0.00350649350649361*G0_0_1_3_4_0 + 0.00292207792207801*G0_0_1_3_4_1 + 0.00623376623376643*G0_0_1_3_4_2 - 0.0109090909090912*G0_0_1_3_4_3 - 0.00233766233766239*G0_0_1_3_4_4 - 0.0187012987012993*G0_0_1_3_4_5 + 0.00642857142857163*G0_0_1_3_5_0 + 0.00292207792207801*G0_0_1_3_5_1 + 0.00642857142857164*G0_0_1_3_5_2 - 0.0179220779220785*G0_0_1_3_5_3 - 0.0187012987012993*G0_0_1_3_5_4 - 0.0241558441558449*G0_0_1_3_5_5 - 0.0238636363636371*G0_0_1_4_0_0 + 0.000243506493506503*G0_0_1_4_0_1 - 0.0011688311688312*G0_0_1_4_0_2 + 0.00350649350649361*G0_0_1_4_0_3 - 0.0144155844155849*G0_0_1_4_0_4 + 0.001948051948052*G0_0_1_4_0_5 + 0.000243506493506503*G0_0_1_4_1_0 - 0.000730519480519502*G0_0_1_4_1_1 - 0.00141233766233771*G0_0_1_4_1_2 + 0.00292207792207801*G0_0_1_4_1_3 - 0.00233766233766242*G0_0_1_4_1_4 + 0.00292207792207801*G0_0_1_4_1_5 - 0.0011688311688312*G0_0_1_4_2_0 - 0.00141233766233771*G0_0_1_4_2_1 - 0.00214285714285725*G0_0_1_4_2_2 + 0.00623376623376643*G0_0_1_4_2_3 + 0.0167532467532473*G0_0_1_4_2_4 + 0.00584415584415604*G0_0_1_4_2_5 + 0.00350649350649361*G0_0_1_4_3_0 + 0.00292207792207801*G0_0_1_4_3_1 + 0.00623376623376643*G0_0_1_4_3_2 - 0.0109090909090912*G0_0_1_4_3_3 - 0.00233766233766239*G0_0_1_4_3_4 - 0.0187012987012993*G0_0_1_4_3_5 - 0.0144155844155849*G0_0_1_4_4_0 - 0.00233766233766242*G0_0_1_4_4_1 + 0.0167532467532473*G0_0_1_4_4_2 - 0.00233766233766239*G0_0_1_4_4_3 + 0.189350649350655*G0_0_1_4_4_4 - 0.00701298701298721*G0_0_1_4_4_5 + 0.001948051948052*G0_0_1_4_5_0 + 0.00292207792207801*G0_0_1_4_5_1 + 0.00584415584415603*G0_0_1_4_5_2 - 0.0187012987012993*G0_0_1_4_5_3 - 0.00701298701298721*G0_0_1_4_5_4 - 0.0171428571428577*G0_0_1_4_5_5 - 0.0129058441558446*G0_0_1_5_0_0 - 0.00194805194805202*G0_0_1_5_0_1 - 0.00121753246753251*G0_0_1_5_0_2 + 0.00642857142857163*G0_0_1_5_0_3 + 0.001948051948052*G0_0_1_5_0_4 + 0.017337662337663*G0_0_1_5_0_5 - 0.00194805194805202*G0_0_1_5_1_0 + 0.000730519480519517*G0_0_1_5_1_1 - 0.000730519480519503*G0_0_1_5_1_2 + 0.00292207792207801*G0_0_1_5_1_3 + 0.00292207792207801*G0_0_1_5_1_4 - 0.00389610389610405*G0_0_1_5_1_5 - 0.00121753246753251*G0_0_1_5_2_0 - 0.000730519480519503*G0_0_1_5_2_1 - 0.00150974025974031*G0_0_1_5_2_2 + 0.00642857142857164*G0_0_1_5_2_3 + 0.00584415584415603*G0_0_1_5_2_4 + 0.00564935064935083*G0_0_1_5_2_5 + 0.00642857142857163*G0_0_1_5_3_0 + 0.00292207792207801*G0_0_1_5_3_1 + 0.00642857142857164*G0_0_1_5_3_2 - 0.0179220779220785*G0_0_1_5_3_3 - 0.0187012987012993*G0_0_1_5_3_4 - 0.0241558441558449*G0_0_1_5_3_5 + 0.001948051948052*G0_0_1_5_4_0 + 0.00292207792207801*G0_0_1_5_4_1 + 0.00584415584415603*G0_0_1_5_4_2 - 0.0187012987012993*G0_0_1_5_4_3 - 0.00701298701298721*G0_0_1_5_4_4 - 0.0171428571428577*G0_0_1_5_4_5 + 0.017337662337663*G0_0_1_5_5_0 - 0.00389610389610405*G0_0_1_5_5_1 + 0.00564935064935083*G0_0_1_5_5_2 - 0.0241558441558449*G0_0_1_5_5_3 - 0.0171428571428577*G0_0_1_5_5_4 + 0.0350649350649364*G0_0_1_5_5_5; + A[58] = A[85] + 0.0887581168831198*G0_0_1_0_0_0 - 0.00288555194805203*G0_0_1_0_0_1 - 0.00507711038961056*G0_0_1_0_0_2 + 0.00102272727272729*G0_0_1_0_0_3 + 0.0204545454545461*G0_0_1_0_0_4 + 0.010227272727273*G0_0_1_0_0_5 - 0.00288555194805203*G0_0_1_0_1_0 + 0.000401785714285721*G0_0_1_0_1_1 - 0.000133928571428576*G0_0_1_0_1_2 + 0.000925324675324706*G0_0_1_0_1_3 + 0.00214285714285722*G0_0_1_0_1_5 - 0.00507711038961055*G0_0_1_0_2_0 - 0.000133928571428576*G0_0_1_0_2_1 + 0.000328733766233776*G0_0_1_0_2_2 + 0.000633116883116903*G0_0_1_0_2_3 - 0.000194805194805198*G0_0_1_0_2_4 + 0.000827922077922107*G0_0_1_0_2_5 + 0.00102272727272729*G0_0_1_0_3_0 + 0.000925324675324706*G0_0_1_0_3_1 + 0.000633116883116903*G0_0_1_0_3_2 - 0.0017532467532468*G0_0_1_0_3_3 - 0.00194805194805201*G0_0_1_0_3_4 - 0.00370129870129882*G0_0_1_0_3_5 + 0.0204545454545461*G0_0_1_0_4_0 - 0.000194805194805198*G0_0_1_0_4_2 - 0.00194805194805201*G0_0_1_0_4_3 + 0.00740259740259761*G0_0_1_0_4_4 - 0.00155844155844161*G0_0_1_0_4_5 + 0.010227272727273*G0_0_1_0_5_0 + 0.00214285714285722*G0_0_1_0_5_1 + 0.000827922077922107*G0_0_1_0_5_2 - 0.00370129870129882*G0_0_1_0_5_3 - 0.00155844155844161*G0_0_1_0_5_4 - 0.0159740259740266*G0_0_1_0_5_5 - 0.00288555194805203*G0_0_1_1_0_0 + 0.000401785714285721*G0_0_1_1_0_1 - 0.000133928571428576*G0_0_1_1_0_2 + 0.000925324675324706*G0_0_1_1_0_3 + 0.00214285714285722*G0_0_1_1_0_5 + 0.000401785714285721*G0_0_1_1_1_0 - 0.00675730519480533*G0_0_1_1_1_1 + 0.000633116883116904*G0_0_1_1_1_2 - 0.00267857142857152*G0_0_1_1_1_3 - 0.000243506493506502*G0_0_1_1_1_4 - 0.00340909090909101*G0_0_1_1_1_5 - 0.000133928571428576*G0_0_1_1_2_0 + 0.000633116883116904*G0_0_1_1_2_1 - 0.000243506493506504*G0_0_1_1_2_2 + 0.00107142857142861*G0_0_1_1_2_3 + 0.000340909090909101*G0_0_1_1_2_4 + 0.000340909090909101*G0_0_1_1_2_5 + 0.000925324675324706*G0_0_1_1_3_0 - 0.00267857142857152*G0_0_1_1_3_1 + 0.00107142857142861*G0_0_1_1_3_2 - 0.00506493506493526*G0_0_1_1_3_3 - 0.00136363636363641*G0_0_1_1_3_4 - 0.00253246753246762*G0_0_1_1_3_5 - 0.000243506493506502*G0_0_1_1_4_1 + 0.000340909090909101*G0_0_1_1_4_2 - 0.00136363636363641*G0_0_1_1_4_3 + 0.00311688311688323*G0_0_1_1_4_4 - 0.000194805194805194*G0_0_1_1_4_5 + 0.00214285714285722*G0_0_1_1_5_0 - 0.00340909090909101*G0_0_1_1_5_1 + 0.000340909090909101*G0_0_1_1_5_2 - 0.00253246753246762*G0_0_1_1_5_3 - 0.000194805194805194*G0_0_1_1_5_4 + 0.00525974025974048*G0_0_1_1_5_5 - 0.00507711038961056*G0_0_1_2_0_0 - 0.000133928571428576*G0_0_1_2_0_1 + 0.000328733766233776*G0_0_1_2_0_2 + 0.000633116883116902*G0_0_1_2_0_3 - 0.000194805194805198*G0_0_1_2_0_4 + 0.000827922077922107*G0_0_1_2_0_5 - 0.000133928571428576*G0_0_1_2_1_0 + 0.000633116883116904*G0_0_1_2_1_1 - 0.000243506493506504*G0_0_1_2_1_2 + 0.00107142857142861*G0_0_1_2_1_3 + 0.000340909090909101*G0_0_1_2_1_4 + 0.000340909090909101*G0_0_1_2_1_5 + 0.000328733766233776*G0_0_1_2_2_0 - 0.000243506493506504*G0_0_1_2_2_1 + 0.00113230519480525*G0_0_1_2_2_2 + 0.000535714285714311*G0_0_1_2_2_3 - 0.000779220779220803*G0_0_1_2_2_4 + 0.000633116883116903*G0_0_1_2_2_5 + 0.000633116883116902*G0_0_1_2_3_0 + 0.00107142857142861*G0_0_1_2_3_1 + 0.000535714285714311*G0_0_1_2_3_2 - 0.000974025974025976*G0_0_1_2_3_3 - 0.00194805194805201*G0_0_1_2_3_4 - 0.00253246753246761*G0_0_1_2_3_5 - 0.000194805194805198*G0_0_1_2_4_0 + 0.000340909090909101*G0_0_1_2_4_1 - 0.000779220779220803*G0_0_1_2_4_2 - 0.00194805194805201*G0_0_1_2_4_3 - 0.00350649350649361*G0_0_1_2_4_4 - 0.00194805194805201*G0_0_1_2_4_5 + 0.000827922077922107*G0_0_1_2_5_0 + 0.000340909090909101*G0_0_1_2_5_1 + 0.000633116883116903*G0_0_1_2_5_2 - 0.00253246753246761*G0_0_1_2_5_3 - 0.00194805194805201*G0_0_1_2_5_4 - 0.00214285714285721*G0_0_1_2_5_5 + 0.00102272727272729*G0_0_1_3_0_0 + 0.000925324675324706*G0_0_1_3_0_1 + 0.000633116883116902*G0_0_1_3_0_2 - 0.0017532467532468*G0_0_1_3_0_3 - 0.00194805194805201*G0_0_1_3_0_4 - 0.00370129870129882*G0_0_1_3_0_5 + 0.000925324675324706*G0_0_1_3_1_0 - 0.00267857142857152*G0_0_1_3_1_1 + 0.00107142857142861*G0_0_1_3_1_2 - 0.00506493506493526*G0_0_1_3_1_3 - 0.00136363636363641*G0_0_1_3_1_4 - 0.00253246753246762*G0_0_1_3_1_5 + 0.000633116883116902*G0_0_1_3_2_0 + 0.00107142857142861*G0_0_1_3_2_1 + 0.000535714285714311*G0_0_1_3_2_2 - 0.000974025974025976*G0_0_1_3_2_3 - 0.00194805194805201*G0_0_1_3_2_4 - 0.00253246753246761*G0_0_1_3_2_5 - 0.0017532467532468*G0_0_1_3_3_0 - 0.00506493506493526*G0_0_1_3_3_1 - 0.000974025974025978*G0_0_1_3_3_2 - 0.00701298701298728*G0_0_1_3_3_3 + 0.00623376623376642*G0_0_1_3_3_4 + 0.00857142857142883*G0_0_1_3_3_5 - 0.00194805194805201*G0_0_1_3_4_0 - 0.00136363636363641*G0_0_1_3_4_1 - 0.00194805194805201*G0_0_1_3_4_2 + 0.00623376623376642*G0_0_1_3_4_3 - 0.00233766233766243*G0_0_1_3_4_4 + 0.00779220779220803*G0_0_1_3_4_5 - 0.00370129870129882*G0_0_1_3_5_0 - 0.00253246753246762*G0_0_1_3_5_1 - 0.00253246753246761*G0_0_1_3_5_2 + 0.00857142857142883*G0_0_1_3_5_3 + 0.00779220779220803*G0_0_1_3_5_4 + 0.0116883116883121*G0_0_1_3_5_5 + 0.0204545454545461*G0_0_1_4_0_0 - 0.000194805194805198*G0_0_1_4_0_2 - 0.00194805194805201*G0_0_1_4_0_3 + 0.00740259740259761*G0_0_1_4_0_4 - 0.00155844155844161*G0_0_1_4_0_5 - 0.000243506493506502*G0_0_1_4_1_1 + 0.000340909090909101*G0_0_1_4_1_2 - 0.00136363636363641*G0_0_1_4_1_3 + 0.00311688311688323*G0_0_1_4_1_4 - 0.000194805194805194*G0_0_1_4_1_5 - 0.000194805194805198*G0_0_1_4_2_0 + 0.0003409090909091*G0_0_1_4_2_1 - 0.000779220779220803*G0_0_1_4_2_2 - 0.00194805194805201*G0_0_1_4_2_3 - 0.00350649350649361*G0_0_1_4_2_4 - 0.00194805194805201*G0_0_1_4_2_5 - 0.00194805194805201*G0_0_1_4_3_0 - 0.00136363636363641*G0_0_1_4_3_1 - 0.00194805194805201*G0_0_1_4_3_2 + 0.00623376623376642*G0_0_1_4_3_3 - 0.00233766233766243*G0_0_1_4_3_4 + 0.00779220779220803*G0_0_1_4_3_5 + 0.00740259740259762*G0_0_1_4_4_0 + 0.00311688311688323*G0_0_1_4_4_1 - 0.00350649350649361*G0_0_1_4_4_2 - 0.00233766233766243*G0_0_1_4_4_3 - 0.105194805194809*G0_0_1_4_4_4 - 0.00233766233766245*G0_0_1_4_4_5 - 0.00155844155844161*G0_0_1_4_5_0 - 0.000194805194805194*G0_0_1_4_5_1 - 0.00194805194805201*G0_0_1_4_5_2 + 0.00779220779220803*G0_0_1_4_5_3 - 0.00233766233766245*G0_0_1_4_5_4 + 0.0046753246753248*G0_0_1_4_5_5 + 0.010227272727273*G0_0_1_5_0_0 + 0.00214285714285722*G0_0_1_5_0_1 + 0.000827922077922107*G0_0_1_5_0_2 - 0.00370129870129882*G0_0_1_5_0_3 - 0.00155844155844161*G0_0_1_5_0_4 - 0.0159740259740266*G0_0_1_5_0_5 + 0.00214285714285722*G0_0_1_5_1_0 - 0.00340909090909101*G0_0_1_5_1_1 + 0.000340909090909101*G0_0_1_5_1_2 - 0.00253246753246762*G0_0_1_5_1_3 - 0.000194805194805194*G0_0_1_5_1_4 + 0.00525974025974048*G0_0_1_5_1_5 + 0.000827922077922107*G0_0_1_5_2_0 + 0.000340909090909101*G0_0_1_5_2_1 + 0.000633116883116903*G0_0_1_5_2_2 - 0.00253246753246761*G0_0_1_5_2_3 - 0.00194805194805201*G0_0_1_5_2_4 - 0.00214285714285721*G0_0_1_5_2_5 - 0.00370129870129882*G0_0_1_5_3_0 - 0.00253246753246762*G0_0_1_5_3_1 - 0.00253246753246761*G0_0_1_5_3_2 + 0.00857142857142883*G0_0_1_5_3_3 + 0.00779220779220803*G0_0_1_5_3_4 + 0.0116883116883121*G0_0_1_5_3_5 - 0.00155844155844161*G0_0_1_5_4_0 - 0.000194805194805194*G0_0_1_5_4_1 - 0.00194805194805201*G0_0_1_5_4_2 + 0.00779220779220803*G0_0_1_5_4_3 - 0.00233766233766244*G0_0_1_5_4_4 + 0.0046753246753248*G0_0_1_5_4_5 - 0.0159740259740266*G0_0_1_5_5_0 + 0.00525974025974048*G0_0_1_5_5_1 - 0.00214285714285721*G0_0_1_5_5_2 + 0.0116883116883121*G0_0_1_5_5_3 + 0.0046753246753248*G0_0_1_5_5_4 - 0.0420779220779236*G0_0_1_5_5_5 - 0.0887581168831198*G0_1_0_0_0_0 + 0.00288555194805203*G0_1_0_0_0_1 + 0.00507711038961056*G0_1_0_0_0_2 - 0.00102272727272729*G0_1_0_0_0_3 - 0.0204545454545461*G0_1_0_0_0_4 - 0.010227272727273*G0_1_0_0_0_5 + 0.00288555194805203*G0_1_0_0_1_0 - 0.000401785714285721*G0_1_0_0_1_1 + 0.000133928571428576*G0_1_0_0_1_2 - 0.000925324675324706*G0_1_0_0_1_3 - 0.00214285714285722*G0_1_0_0_1_5 + 0.00507711038961055*G0_1_0_0_2_0 + 0.000133928571428576*G0_1_0_0_2_1 - 0.000328733766233776*G0_1_0_0_2_2 - 0.000633116883116903*G0_1_0_0_2_3 + 0.000194805194805198*G0_1_0_0_2_4 - 0.000827922077922106*G0_1_0_0_2_5 - 0.00102272727272729*G0_1_0_0_3_0 - 0.000925324675324706*G0_1_0_0_3_1 - 0.000633116883116903*G0_1_0_0_3_2 + 0.0017532467532468*G0_1_0_0_3_3 + 0.00194805194805201*G0_1_0_0_3_4 + 0.00370129870129882*G0_1_0_0_3_5 - 0.0204545454545461*G0_1_0_0_4_0 + 0.000194805194805198*G0_1_0_0_4_2 + 0.00194805194805201*G0_1_0_0_4_3 - 0.00740259740259761*G0_1_0_0_4_4 + 0.00155844155844161*G0_1_0_0_4_5 - 0.010227272727273*G0_1_0_0_5_0 - 0.00214285714285722*G0_1_0_0_5_1 - 0.000827922077922107*G0_1_0_0_5_2 + 0.00370129870129882*G0_1_0_0_5_3 + 0.00155844155844161*G0_1_0_0_5_4 + 0.0159740259740266*G0_1_0_0_5_5 + 0.00288555194805203*G0_1_0_1_0_0 - 0.000401785714285721*G0_1_0_1_0_1 + 0.000133928571428576*G0_1_0_1_0_2 - 0.000925324675324706*G0_1_0_1_0_3 - 0.00214285714285722*G0_1_0_1_0_5 - 0.000401785714285721*G0_1_0_1_1_0 + 0.00675730519480533*G0_1_0_1_1_1 - 0.000633116883116904*G0_1_0_1_1_2 + 0.00267857142857152*G0_1_0_1_1_3 + 0.000243506493506502*G0_1_0_1_1_4 + 0.00340909090909101*G0_1_0_1_1_5 + 0.000133928571428576*G0_1_0_1_2_0 - 0.000633116883116905*G0_1_0_1_2_1 + 0.000243506493506504*G0_1_0_1_2_2 - 0.00107142857142861*G0_1_0_1_2_3 - 0.0003409090909091*G0_1_0_1_2_4 - 0.000340909090909101*G0_1_0_1_2_5 - 0.000925324675324706*G0_1_0_1_3_0 + 0.00267857142857152*G0_1_0_1_3_1 - 0.00107142857142861*G0_1_0_1_3_2 + 0.00506493506493526*G0_1_0_1_3_3 + 0.00136363636363641*G0_1_0_1_3_4 + 0.00253246753246762*G0_1_0_1_3_5 + 0.000243506493506502*G0_1_0_1_4_1 - 0.000340909090909101*G0_1_0_1_4_2 + 0.00136363636363641*G0_1_0_1_4_3 - 0.00311688311688323*G0_1_0_1_4_4 + 0.000194805194805194*G0_1_0_1_4_5 - 0.00214285714285722*G0_1_0_1_5_0 + 0.00340909090909101*G0_1_0_1_5_1 - 0.000340909090909101*G0_1_0_1_5_2 + 0.00253246753246762*G0_1_0_1_5_3 + 0.000194805194805194*G0_1_0_1_5_4 - 0.00525974025974048*G0_1_0_1_5_5 + 0.00507711038961056*G0_1_0_2_0_0 + 0.000133928571428576*G0_1_0_2_0_1 - 0.000328733766233776*G0_1_0_2_0_2 - 0.000633116883116902*G0_1_0_2_0_3 + 0.000194805194805198*G0_1_0_2_0_4 - 0.000827922077922107*G0_1_0_2_0_5 + 0.000133928571428576*G0_1_0_2_1_0 - 0.000633116883116905*G0_1_0_2_1_1 + 0.000243506493506504*G0_1_0_2_1_2 - 0.00107142857142861*G0_1_0_2_1_3 - 0.0003409090909091*G0_1_0_2_1_4 - 0.000340909090909101*G0_1_0_2_1_5 - 0.000328733766233776*G0_1_0_2_2_0 + 0.000243506493506504*G0_1_0_2_2_1 - 0.00113230519480525*G0_1_0_2_2_2 - 0.000535714285714311*G0_1_0_2_2_3 + 0.000779220779220803*G0_1_0_2_2_4 - 0.000633116883116903*G0_1_0_2_2_5 - 0.000633116883116902*G0_1_0_2_3_0 - 0.00107142857142861*G0_1_0_2_3_1 - 0.000535714285714311*G0_1_0_2_3_2 + 0.000974025974025974*G0_1_0_2_3_3 + 0.00194805194805201*G0_1_0_2_3_4 + 0.00253246753246761*G0_1_0_2_3_5 + 0.000194805194805198*G0_1_0_2_4_0 - 0.0003409090909091*G0_1_0_2_4_1 + 0.000779220779220803*G0_1_0_2_4_2 + 0.00194805194805201*G0_1_0_2_4_3 + 0.00350649350649361*G0_1_0_2_4_4 + 0.00194805194805201*G0_1_0_2_4_5 - 0.000827922077922107*G0_1_0_2_5_0 - 0.000340909090909101*G0_1_0_2_5_1 - 0.000633116883116903*G0_1_0_2_5_2 + 0.00253246753246761*G0_1_0_2_5_3 + 0.00194805194805201*G0_1_0_2_5_4 + 0.00214285714285721*G0_1_0_2_5_5 - 0.00102272727272729*G0_1_0_3_0_0 - 0.000925324675324706*G0_1_0_3_0_1 - 0.000633116883116902*G0_1_0_3_0_2 + 0.0017532467532468*G0_1_0_3_0_3 + 0.00194805194805201*G0_1_0_3_0_4 + 0.00370129870129882*G0_1_0_3_0_5 - 0.000925324675324706*G0_1_0_3_1_0 + 0.00267857142857152*G0_1_0_3_1_1 - 0.00107142857142861*G0_1_0_3_1_2 + 0.00506493506493526*G0_1_0_3_1_3 + 0.00136363636363641*G0_1_0_3_1_4 + 0.00253246753246762*G0_1_0_3_1_5 - 0.000633116883116902*G0_1_0_3_2_0 - 0.00107142857142861*G0_1_0_3_2_1 - 0.000535714285714311*G0_1_0_3_2_2 + 0.000974025974025974*G0_1_0_3_2_3 + 0.00194805194805201*G0_1_0_3_2_4 + 0.00253246753246761*G0_1_0_3_2_5 + 0.0017532467532468*G0_1_0_3_3_0 + 0.00506493506493526*G0_1_0_3_3_1 + 0.000974025974025976*G0_1_0_3_3_2 + 0.00701298701298729*G0_1_0_3_3_3 - 0.00623376623376642*G0_1_0_3_3_4 - 0.00857142857142883*G0_1_0_3_3_5 + 0.00194805194805201*G0_1_0_3_4_0 + 0.00136363636363641*G0_1_0_3_4_1 + 0.00194805194805201*G0_1_0_3_4_2 - 0.00623376623376642*G0_1_0_3_4_3 + 0.00233766233766243*G0_1_0_3_4_4 - 0.00779220779220803*G0_1_0_3_4_5 + 0.00370129870129882*G0_1_0_3_5_0 + 0.00253246753246762*G0_1_0_3_5_1 + 0.00253246753246761*G0_1_0_3_5_2 - 0.00857142857142883*G0_1_0_3_5_3 - 0.00779220779220803*G0_1_0_3_5_4 - 0.0116883116883121*G0_1_0_3_5_5 - 0.0204545454545461*G0_1_0_4_0_0 + 0.000194805194805198*G0_1_0_4_0_2 + 0.00194805194805201*G0_1_0_4_0_3 - 0.00740259740259761*G0_1_0_4_0_4 + 0.00155844155844161*G0_1_0_4_0_5 + 0.000243506493506502*G0_1_0_4_1_1 - 0.000340909090909101*G0_1_0_4_1_2 + 0.00136363636363641*G0_1_0_4_1_3 - 0.00311688311688323*G0_1_0_4_1_4 + 0.000194805194805194*G0_1_0_4_1_5 + 0.000194805194805198*G0_1_0_4_2_0 - 0.0003409090909091*G0_1_0_4_2_1 + 0.000779220779220803*G0_1_0_4_2_2 + 0.00194805194805201*G0_1_0_4_2_3 + 0.00350649350649361*G0_1_0_4_2_4 + 0.00194805194805201*G0_1_0_4_2_5 + 0.00194805194805201*G0_1_0_4_3_0 + 0.00136363636363641*G0_1_0_4_3_1 + 0.00194805194805201*G0_1_0_4_3_2 - 0.00623376623376642*G0_1_0_4_3_3 + 0.00233766233766243*G0_1_0_4_3_4 - 0.00779220779220803*G0_1_0_4_3_5 - 0.00740259740259762*G0_1_0_4_4_0 - 0.00311688311688323*G0_1_0_4_4_1 + 0.00350649350649361*G0_1_0_4_4_2 + 0.00233766233766243*G0_1_0_4_4_3 + 0.105194805194809*G0_1_0_4_4_4 + 0.00233766233766245*G0_1_0_4_4_5 + 0.00155844155844161*G0_1_0_4_5_0 + 0.000194805194805194*G0_1_0_4_5_1 + 0.00194805194805201*G0_1_0_4_5_2 - 0.00779220779220803*G0_1_0_4_5_3 + 0.00233766233766245*G0_1_0_4_5_4 - 0.0046753246753248*G0_1_0_4_5_5 - 0.010227272727273*G0_1_0_5_0_0 - 0.00214285714285722*G0_1_0_5_0_1 - 0.000827922077922107*G0_1_0_5_0_2 + 0.00370129870129882*G0_1_0_5_0_3 + 0.00155844155844161*G0_1_0_5_0_4 + 0.0159740259740266*G0_1_0_5_0_5 - 0.00214285714285722*G0_1_0_5_1_0 + 0.00340909090909101*G0_1_0_5_1_1 - 0.000340909090909101*G0_1_0_5_1_2 + 0.00253246753246762*G0_1_0_5_1_3 + 0.000194805194805194*G0_1_0_5_1_4 - 0.00525974025974048*G0_1_0_5_1_5 - 0.000827922077922107*G0_1_0_5_2_0 - 0.000340909090909101*G0_1_0_5_2_1 - 0.000633116883116903*G0_1_0_5_2_2 + 0.00253246753246761*G0_1_0_5_2_3 + 0.00194805194805201*G0_1_0_5_2_4 + 0.0021428571428572*G0_1_0_5_2_5 + 0.00370129870129882*G0_1_0_5_3_0 + 0.00253246753246762*G0_1_0_5_3_1 + 0.00253246753246761*G0_1_0_5_3_2 - 0.00857142857142883*G0_1_0_5_3_3 - 0.00779220779220803*G0_1_0_5_3_4 - 0.0116883116883121*G0_1_0_5_3_5 + 0.00155844155844161*G0_1_0_5_4_0 + 0.000194805194805194*G0_1_0_5_4_1 + 0.00194805194805201*G0_1_0_5_4_2 - 0.00779220779220803*G0_1_0_5_4_3 + 0.00233766233766245*G0_1_0_5_4_4 - 0.0046753246753248*G0_1_0_5_4_5 + 0.0159740259740266*G0_1_0_5_5_0 - 0.00525974025974048*G0_1_0_5_5_1 + 0.0021428571428572*G0_1_0_5_5_2 - 0.0116883116883121*G0_1_0_5_5_3 - 0.0046753246753248*G0_1_0_5_5_4 + 0.0420779220779236*G0_1_0_5_5_5; + A[67] = A[58] - 0.0142451298701303*G0_0_0_0_0_0 + 0.000365259740259749*G0_0_0_0_0_1 + 0.00248376623376631*G0_0_0_0_0_2 + 0.000438311688311703*G0_0_0_0_0_3 - 0.0124188311688316*G0_0_0_0_0_4 - 0.000730519480519492*G0_0_0_0_0_5 + 0.000365259740259749*G0_0_0_0_1_0 - 0.000657467532467549*G0_0_0_0_1_1 - 0.000109577922077925*G0_0_0_0_1_2 + 0.00160714285714291*G0_0_0_0_1_4 + 0.00248376623376631*G0_0_0_0_2_0 - 0.000109577922077925*G0_0_0_0_2_1 - 0.00124188311688316*G0_0_0_0_2_2 + 0.000876623376623401*G0_0_0_0_2_3 + 0.00409090909090922*G0_0_0_0_2_4 + 0.000730519480519501*G0_0_0_0_2_5 + 0.000438311688311703*G0_0_0_0_3_0 + 0.000876623376623401*G0_0_0_0_3_2 - 0.00292207792207801*G0_0_0_0_3_3 - 0.00409090909090922*G0_0_0_0_3_4 - 0.00233766233766241*G0_0_0_0_3_5 - 0.0124188311688316*G0_0_0_0_4_0 + 0.00160714285714291*G0_0_0_0_4_1 + 0.00409090909090922*G0_0_0_0_4_2 - 0.00409090909090922*G0_0_0_0_4_3 - 0.0262987012987022*G0_0_0_0_4_4 - 0.00467532467532482*G0_0_0_0_4_5 - 0.000730519480519491*G0_0_0_0_5_0 + 0.000730519480519501*G0_0_0_0_5_2 - 0.00233766233766241*G0_0_0_0_5_3 - 0.00467532467532482*G0_0_0_0_5_4 + 0.000584415584415642*G0_0_0_0_5_5 + 0.000365259740259749*G0_0_0_1_0_0 - 0.000657467532467549*G0_0_0_1_0_1 - 0.000109577922077925*G0_0_0_1_0_2 + 0.00160714285714291*G0_0_0_1_0_4 - 0.000657467532467549*G0_0_0_1_1_0 + 0.0105194805194808*G0_0_0_1_1_1 - 0.00211850649350656*G0_0_0_1_1_2 + 0.00818181818181845*G0_0_0_1_1_3 + 0.00146103896103901*G0_0_0_1_1_4 + 0.00350649350649361*G0_0_0_1_1_5 - 0.000109577922077925*G0_0_0_1_2_0 - 0.00211850649350656*G0_0_0_1_2_1 + 0.00116883116883121*G0_0_0_1_2_2 + 0.000292207792207799*G0_0_0_1_2_3 + 0.000292207792207801*G0_0_0_1_2_4 + 0.000876623376623405*G0_0_0_1_2_5 + 0.00818181818181845*G0_0_0_1_3_1 + 0.0002922077922078*G0_0_0_1_3_2 + 0.0122727272727277*G0_0_0_1_3_3 - 0.00292207792207801*G0_0_0_1_3_4 - 0.0017532467532468*G0_0_0_1_3_5 + 0.00160714285714291*G0_0_0_1_4_0 + 0.00146103896103901*G0_0_0_1_4_1 + 0.000292207792207801*G0_0_0_1_4_2 - 0.00292207792207801*G0_0_0_1_4_3 - 0.000584415584415602*G0_0_0_1_4_4 - 0.00467532467532483*G0_0_0_1_4_5 + 0.00350649350649361*G0_0_0_1_5_1 + 0.000876623376623405*G0_0_0_1_5_2 - 0.0017532467532468*G0_0_0_1_5_3 - 0.00467532467532483*G0_0_0_1_5_4 - 0.00759740259740286*G0_0_0_1_5_5 + 0.00248376623376631*G0_0_0_2_0_0 - 0.000109577922077925*G0_0_0_2_0_1 - 0.00124188311688316*G0_0_0_2_0_2 + 0.000876623376623401*G0_0_0_2_0_3 + 0.00409090909090922*G0_0_0_2_0_4 + 0.000730519480519501*G0_0_0_2_0_5 - 0.000109577922077925*G0_0_0_2_1_0 - 0.00211850649350656*G0_0_0_2_1_1 + 0.00116883116883121*G0_0_0_2_1_2 + 0.000292207792207799*G0_0_0_2_1_3 + 0.000292207792207801*G0_0_0_2_1_4 + 0.000876623376623405*G0_0_0_2_1_5 - 0.00124188311688316*G0_0_0_2_2_0 + 0.00116883116883121*G0_0_0_2_2_1 - 0.00219155844155848*G0_0_0_2_2_2 - 0.00409090909090922*G0_0_0_2_2_3 + 0.00116883116883122*G0_0_0_2_2_4 + 0.00116883116883121*G0_0_0_2_2_5 + 0.000876623376623401*G0_0_0_2_3_0 + 0.000292207792207799*G0_0_0_2_3_1 - 0.00409090909090922*G0_0_0_2_3_2 - 0.0163636363636369*G0_0_0_2_3_3 - 0.00233766233766241*G0_0_0_2_3_4 - 0.00409090909090923*G0_0_0_2_3_5 + 0.00409090909090922*G0_0_0_2_4_0 + 0.000292207792207801*G0_0_0_2_4_1 + 0.00116883116883122*G0_0_0_2_4_2 - 0.00233766233766241*G0_0_0_2_4_3 + 0.00935064935064966*G0_0_0_2_4_4 - 0.00292207792207802*G0_0_0_2_4_5 + 0.000730519480519501*G0_0_0_2_5_0 + 0.000876623376623405*G0_0_0_2_5_1 + 0.00116883116883121*G0_0_0_2_5_2 - 0.00409090909090923*G0_0_0_2_5_3 - 0.00292207792207802*G0_0_0_2_5_4 - 0.00701298701298725*G0_0_0_2_5_5 + 0.000438311688311703*G0_0_0_3_0_0 + 0.000876623376623401*G0_0_0_3_0_2 - 0.00292207792207801*G0_0_0_3_0_3 - 0.00409090909090922*G0_0_0_3_0_4 - 0.00233766233766241*G0_0_0_3_0_5 + 0.00818181818181845*G0_0_0_3_1_1 + 0.000292207792207799*G0_0_0_3_1_2 + 0.0122727272727277*G0_0_0_3_1_3 - 0.00292207792207801*G0_0_0_3_1_4 - 0.0017532467532468*G0_0_0_3_1_5 + 0.000876623376623401*G0_0_0_3_2_0 + 0.000292207792207799*G0_0_0_3_2_1 - 0.00409090909090922*G0_0_0_3_2_2 - 0.0163636363636369*G0_0_0_3_2_3 - 0.00233766233766241*G0_0_0_3_2_4 - 0.00409090909090923*G0_0_0_3_2_5 - 0.00292207792207801*G0_0_0_3_3_0 + 0.0122727272727277*G0_0_0_3_3_1 - 0.0163636363636369*G0_0_0_3_3_2 + 0.00701298701298719*G0_0_0_3_3_3 + 0.0116883116883121*G0_0_0_3_3_4 + 0.0140259740259745*G0_0_0_3_3_5 - 0.00409090909090922*G0_0_0_3_4_0 - 0.00292207792207801*G0_0_0_3_4_1 - 0.00233766233766241*G0_0_0_3_4_2 + 0.0116883116883121*G0_0_0_3_4_3 + 0.00935064935064965*G0_0_0_3_4_4 + 0.0140259740259745*G0_0_0_3_4_5 - 0.00233766233766241*G0_0_0_3_5_0 - 0.0017532467532468*G0_0_0_3_5_1 - 0.00409090909090923*G0_0_0_3_5_2 + 0.0140259740259745*G0_0_0_3_5_3 + 0.0140259740259745*G0_0_0_3_5_4 + 0.0187012987012993*G0_0_0_3_5_5 - 0.0124188311688316*G0_0_0_4_0_0 + 0.00160714285714291*G0_0_0_4_0_1 + 0.00409090909090922*G0_0_0_4_0_2 - 0.00409090909090922*G0_0_0_4_0_3 - 0.0262987012987022*G0_0_0_4_0_4 - 0.00467532467532482*G0_0_0_4_0_5 + 0.00160714285714291*G0_0_0_4_1_0 + 0.00146103896103901*G0_0_0_4_1_1 + 0.000292207792207801*G0_0_0_4_1_2 - 0.00292207792207801*G0_0_0_4_1_3 - 0.000584415584415602*G0_0_0_4_1_4 - 0.00467532467532483*G0_0_0_4_1_5 + 0.00409090909090922*G0_0_0_4_2_0 + 0.000292207792207801*G0_0_0_4_2_1 + 0.00116883116883122*G0_0_0_4_2_2 - 0.00233766233766241*G0_0_0_4_2_3 + 0.00935064935064966*G0_0_0_4_2_4 - 0.00292207792207802*G0_0_0_4_2_5 - 0.00409090909090922*G0_0_0_4_3_0 - 0.00292207792207801*G0_0_0_4_3_1 - 0.00233766233766241*G0_0_0_4_3_2 + 0.0116883116883121*G0_0_0_4_3_3 + 0.00935064935064965*G0_0_0_4_3_4 + 0.0140259740259745*G0_0_0_4_3_5 - 0.0262987012987022*G0_0_0_4_4_0 - 0.000584415584415601*G0_0_0_4_4_1 + 0.00935064935064966*G0_0_0_4_4_2 + 0.00935064935064965*G0_0_0_4_4_3 - 0.140259740259745*G0_0_0_4_4_4 + 0.00701298701298724*G0_0_0_4_4_5 - 0.00467532467532482*G0_0_0_4_5_0 - 0.00467532467532483*G0_0_0_4_5_1 - 0.00292207792207802*G0_0_0_4_5_2 + 0.0140259740259745*G0_0_0_4_5_3 + 0.00701298701298724*G0_0_0_4_5_4 + 0.0233766233766242*G0_0_0_4_5_5 - 0.000730519480519491*G0_0_0_5_0_0 + 0.000730519480519501*G0_0_0_5_0_2 - 0.00233766233766241*G0_0_0_5_0_3 - 0.00467532467532482*G0_0_0_5_0_4 + 0.000584415584415642*G0_0_0_5_0_5 + 0.00350649350649361*G0_0_0_5_1_1 + 0.000876623376623405*G0_0_0_5_1_2 - 0.0017532467532468*G0_0_0_5_1_3 - 0.00467532467532483*G0_0_0_5_1_4 - 0.00759740259740286*G0_0_0_5_1_5 + 0.000730519480519501*G0_0_0_5_2_0 + 0.000876623376623405*G0_0_0_5_2_1 + 0.00116883116883121*G0_0_0_5_2_2 - 0.00409090909090923*G0_0_0_5_2_3 - 0.00292207792207802*G0_0_0_5_2_4 - 0.00701298701298725*G0_0_0_5_2_5 - 0.00233766233766241*G0_0_0_5_3_0 - 0.0017532467532468*G0_0_0_5_3_1 - 0.00409090909090923*G0_0_0_5_3_2 + 0.0140259740259745*G0_0_0_5_3_3 + 0.0140259740259745*G0_0_0_5_3_4 + 0.0187012987012993*G0_0_0_5_3_5 - 0.00467532467532482*G0_0_0_5_4_0 - 0.00467532467532483*G0_0_0_5_4_1 - 0.00292207792207802*G0_0_0_5_4_2 + 0.0140259740259745*G0_0_0_5_4_3 + 0.00701298701298724*G0_0_0_5_4_4 + 0.0233766233766242*G0_0_0_5_4_5 + 0.000584415584415642*G0_0_0_5_5_0 - 0.00759740259740287*G0_0_0_5_5_1 - 0.00701298701298725*G0_0_0_5_5_2 + 0.0187012987012993*G0_0_0_5_5_3 + 0.0233766233766242*G0_0_0_5_5_4 + 0.0490909090909107*G0_0_0_5_5_5 + 0.000730519480519498*G0_0_1_0_0_4 - 0.000730519480519525*G0_0_1_0_0_5 - 0.000693993506493525*G0_0_1_0_1_1 - 0.000730519480519504*G0_0_1_0_1_3 + 0.000292207792207801*G0_0_1_0_1_4 + 0.000292207792207812*G0_0_1_0_1_5 + 0.000693993506493534*G0_0_1_0_2_2 + 0.000730519480519504*G0_0_1_0_2_3 - 0.000292207792207796*G0_0_1_0_2_4 - 0.000292207792207799*G0_0_1_0_2_5 - 0.000730519480519504*G0_0_1_0_3_1 + 0.000730519480519504*G0_0_1_0_3_2 - 0.0005844155844156*G0_0_1_0_3_4 + 0.000584415584415601*G0_0_1_0_3_5 + 0.000730519480519499*G0_0_1_0_4_0 + 0.000292207792207801*G0_0_1_0_4_1 - 0.000292207792207797*G0_0_1_0_4_2 - 0.0005844155844156*G0_0_1_0_4_3 - 0.00175324675324678*G0_0_1_0_4_4 - 0.000730519480519525*G0_0_1_0_5_0 + 0.000292207792207812*G0_0_1_0_5_1 - 0.000292207792207799*G0_0_1_0_5_2 + 0.000584415584415601*G0_0_1_0_5_3 + 0.00175324675324679*G0_0_1_0_5_5 - 0.000693993506493525*G0_0_1_1_0_1 - 0.000730519480519504*G0_0_1_1_0_3 + 0.000292207792207801*G0_0_1_1_0_4 + 0.000292207792207812*G0_0_1_1_0_5 - 0.000693993506493525*G0_0_1_1_1_0 + 0.0120535714285717*G0_0_1_1_1_1 - 0.00222808441558449*G0_0_1_1_1_2 + 0.00818181818181845*G0_0_1_1_1_3 + 0.000730519480519503*G0_0_1_1_1_4 + 0.00204545454545459*G0_0_1_1_1_5 - 0.00222808441558449*G0_0_1_1_2_1 + 0.00222808441558449*G0_0_1_1_2_2 + 0.000438311688311705*G0_0_1_1_2_4 - 0.000438311688311705*G0_0_1_1_2_5 - 0.000730519480519504*G0_0_1_1_3_0 + 0.00818181818181845*G0_0_1_1_3_1 + 0.0175324675324681*G0_0_1_1_3_3 + 0.00233766233766243*G0_0_1_1_3_5 + 0.000292207792207801*G0_0_1_1_4_0 + 0.000730519480519503*G0_0_1_1_4_1 + 0.000438311688311705*G0_0_1_1_4_2 - 0.00409090909090922*G0_0_1_1_4_4 - 0.000584415584415601*G0_0_1_1_4_5 + 0.000292207792207812*G0_0_1_1_5_0 + 0.00204545454545459*G0_0_1_1_5_1 - 0.000438311688311705*G0_0_1_1_5_2 + 0.00233766233766243*G0_0_1_1_5_3 - 0.000584415584415601*G0_0_1_1_5_4 + 0.0011688311688312*G0_0_1_1_5_5 + 0.000693993506493534*G0_0_1_2_0_2 + 0.000730519480519504*G0_0_1_2_0_3 - 0.000292207792207796*G0_0_1_2_0_4 - 0.000292207792207799*G0_0_1_2_0_5 - 0.00222808441558449*G0_0_1_2_1_1 + 0.00222808441558449*G0_0_1_2_1_2 + 0.000438311688311705*G0_0_1_2_1_4 - 0.000438311688311705*G0_0_1_2_1_5 + 0.000693993506493534*G0_0_1_2_2_0 + 0.00222808441558449*G0_0_1_2_2_1 - 0.0120535714285719*G0_0_1_2_2_2 - 0.00818181818181847*G0_0_1_2_2_3 - 0.00204545454545464*G0_0_1_2_2_4 - 0.000730519480519509*G0_0_1_2_2_5 + 0.000730519480519504*G0_0_1_2_3_0 - 0.00818181818181847*G0_0_1_2_3_2 - 0.0175324675324681*G0_0_1_2_3_3 - 0.00233766233766242*G0_0_1_2_3_4 - 0.000292207792207796*G0_0_1_2_4_0 + 0.000438311688311705*G0_0_1_2_4_1 - 0.00204545454545464*G0_0_1_2_4_2 - 0.00233766233766242*G0_0_1_2_4_3 - 0.00116883116883125*G0_0_1_2_4_4 + 0.000584415584415603*G0_0_1_2_4_5 - 0.000292207792207799*G0_0_1_2_5_0 - 0.000438311688311705*G0_0_1_2_5_1 - 0.000730519480519509*G0_0_1_2_5_2 + 0.000584415584415603*G0_0_1_2_5_4 + 0.00409090909090924*G0_0_1_2_5_5 - 0.000730519480519504*G0_0_1_3_0_1 + 0.000730519480519504*G0_0_1_3_0_2 - 0.0005844155844156*G0_0_1_3_0_4 + 0.000584415584415601*G0_0_1_3_0_5 - 0.000730519480519504*G0_0_1_3_1_0 + 0.00818181818181845*G0_0_1_3_1_1 + 0.0175324675324681*G0_0_1_3_1_3 + 0.00233766233766243*G0_0_1_3_1_5 + 0.000730519480519504*G0_0_1_3_2_0 - 0.00818181818181847*G0_0_1_3_2_2 - 0.0175324675324681*G0_0_1_3_2_3 - 0.00233766233766242*G0_0_1_3_2_4 + 0.0175324675324681*G0_0_1_3_3_1 - 0.0175324675324681*G0_0_1_3_3_2 - 0.0005844155844156*G0_0_1_3_4_0 - 0.00233766233766242*G0_0_1_3_4_2 + 0.00935064935064965*G0_0_1_3_4_4 + 0.000584415584415601*G0_0_1_3_5_0 + 0.00233766233766243*G0_0_1_3_5_1 - 0.00935064935064969*G0_0_1_3_5_5 + 0.000730519480519499*G0_0_1_4_0_0 + 0.000292207792207801*G0_0_1_4_0_1 - 0.000292207792207797*G0_0_1_4_0_2 - 0.0005844155844156*G0_0_1_4_0_3 - 0.00175324675324678*G0_0_1_4_0_4 + 0.000292207792207801*G0_0_1_4_1_0 + 0.000730519480519503*G0_0_1_4_1_1 + 0.000438311688311705*G0_0_1_4_1_2 - 0.00409090909090922*G0_0_1_4_1_4 - 0.000584415584415601*G0_0_1_4_1_5 - 0.000292207792207797*G0_0_1_4_2_0 + 0.000438311688311705*G0_0_1_4_2_1 - 0.00204545454545464*G0_0_1_4_2_2 - 0.00233766233766242*G0_0_1_4_2_3 - 0.00116883116883125*G0_0_1_4_2_4 + 0.000584415584415603*G0_0_1_4_2_5 - 0.0005844155844156*G0_0_1_4_3_0 - 0.00233766233766242*G0_0_1_4_3_2 + 0.00935064935064964*G0_0_1_4_3_4 - 0.00175324675324678*G0_0_1_4_4_0 - 0.00409090909090922*G0_0_1_4_4_1 - 0.00116883116883125*G0_0_1_4_4_2 + 0.00935064935064964*G0_0_1_4_4_3 + 0.0420779220779234*G0_0_1_4_4_4 + 0.00701298701298725*G0_0_1_4_4_5 - 0.000584415584415601*G0_0_1_4_5_1 + 0.000584415584415603*G0_0_1_4_5_2 + 0.00701298701298725*G0_0_1_4_5_4 - 0.00701298701298728*G0_0_1_4_5_5 - 0.000730519480519525*G0_0_1_5_0_0 + 0.000292207792207812*G0_0_1_5_0_1 - 0.000292207792207799*G0_0_1_5_0_2 + 0.000584415584415601*G0_0_1_5_0_3 + 0.00175324675324679*G0_0_1_5_0_5 + 0.000292207792207812*G0_0_1_5_1_0 + 0.00204545454545459*G0_0_1_5_1_1 - 0.000438311688311705*G0_0_1_5_1_2 + 0.00233766233766243*G0_0_1_5_1_3 - 0.000584415584415601*G0_0_1_5_1_4 + 0.0011688311688312*G0_0_1_5_1_5 - 0.000292207792207799*G0_0_1_5_2_0 - 0.000438311688311705*G0_0_1_5_2_1 - 0.000730519480519509*G0_0_1_5_2_2 + 0.000584415584415603*G0_0_1_5_2_4 + 0.00409090909090924*G0_0_1_5_2_5 + 0.000584415584415601*G0_0_1_5_3_0 + 0.00233766233766243*G0_0_1_5_3_1 - 0.00935064935064969*G0_0_1_5_3_5 - 0.000584415584415601*G0_0_1_5_4_1 + 0.000584415584415603*G0_0_1_5_4_2 + 0.00701298701298724*G0_0_1_5_4_4 - 0.00701298701298728*G0_0_1_5_4_5 + 0.00175324675324679*G0_0_1_5_5_0 + 0.0011688311688312*G0_0_1_5_5_1 + 0.00409090909090924*G0_0_1_5_5_2 - 0.00935064935064969*G0_0_1_5_5_3 - 0.00701298701298728*G0_0_1_5_5_4 - 0.0420779220779238*G0_0_1_5_5_5 + 0.0022280844155845*G0_1_0_0_0_1 - 0.00222808441558449*G0_1_0_0_0_2 + 0.0109577922077926*G0_1_0_0_0_4 - 0.0109577922077926*G0_1_0_0_0_5 + 0.0022280844155845*G0_1_0_0_1_0 - 0.000620941558441578*G0_1_0_0_1_1 - 0.000438311688311702*G0_1_0_0_1_3 - 0.000584415584415604*G0_1_0_0_1_4 + 0.00262987012987022*G0_1_0_0_1_5 - 0.00222808441558449*G0_1_0_0_2_0 + 0.000620941558441576*G0_1_0_0_2_2 + 0.0004383116883117*G0_1_0_0_2_3 - 0.00262987012987022*G0_1_0_0_2_4 + 0.000584415584415605*G0_1_0_0_2_5 - 0.000438311688311702*G0_1_0_0_3_1 + 0.0004383116883117*G0_1_0_0_3_2 + 0.00116883116883121*G0_1_0_0_3_4 - 0.00116883116883121*G0_1_0_0_3_5 + 0.0109577922077925*G0_1_0_0_4_0 - 0.000584415584415604*G0_1_0_0_4_1 - 0.00262987012987022*G0_1_0_0_4_2 + 0.00116883116883121*G0_1_0_0_4_3 + 0.0216233766233773*G0_1_0_0_4_4 - 0.0109577922077926*G0_1_0_0_5_0 + 0.00262987012987022*G0_1_0_0_5_1 + 0.000584415584415605*G0_1_0_0_5_2 - 0.00116883116883121*G0_1_0_0_5_3 - 0.0216233766233774*G0_1_0_0_5_5 + 0.0022280844155845*G0_1_0_1_0_0 - 0.000620941558441578*G0_1_0_1_0_1 - 0.000438311688311702*G0_1_0_1_0_3 - 0.000584415584415604*G0_1_0_1_0_4 + 0.00262987012987022*G0_1_0_1_0_5 - 0.000620941558441578*G0_1_0_1_1_0 + 0.00416396103896115*G0_1_0_1_1_1 - 0.00135146103896108*G0_1_0_1_1_2 + 0.00496753246753263*G0_1_0_1_1_3 - 0.000146103896103901*G0_1_0_1_1_4 - 0.00058441558441561*G0_1_0_1_1_5 - 0.00135146103896108*G0_1_0_1_2_1 + 0.00135146103896108*G0_1_0_1_2_2 + 0.000438311688311702*G0_1_0_1_2_4 - 0.000438311688311706*G0_1_0_1_2_5 - 0.000438311688311702*G0_1_0_1_3_0 + 0.00496753246753263*G0_1_0_1_3_1 + 0.0134415584415589*G0_1_0_1_3_3 + 0.00116883116883121*G0_1_0_1_3_4 + 0.00175324675324682*G0_1_0_1_3_5 - 0.000584415584415604*G0_1_0_1_4_0 - 0.000146103896103902*G0_1_0_1_4_1 + 0.000438311688311702*G0_1_0_1_4_2 + 0.00116883116883121*G0_1_0_1_4_3 + 0.00116883116883121*G0_1_0_1_4_4 + 0.00116883116883121*G0_1_0_1_4_5 + 0.00262987012987022*G0_1_0_1_5_0 - 0.00058441558441561*G0_1_0_1_5_1 - 0.000438311688311706*G0_1_0_1_5_2 + 0.00175324675324682*G0_1_0_1_5_3 + 0.00116883116883121*G0_1_0_1_5_4 + 0.0099350649350653*G0_1_0_1_5_5 - 0.00222808441558449*G0_1_0_2_0_0 + 0.000620941558441576*G0_1_0_2_0_2 + 0.0004383116883117*G0_1_0_2_0_3 - 0.00262987012987022*G0_1_0_2_0_4 + 0.000584415584415605*G0_1_0_2_0_5 - 0.00135146103896108*G0_1_0_2_1_1 + 0.00135146103896108*G0_1_0_2_1_2 + 0.000438311688311702*G0_1_0_2_1_4 - 0.000438311688311706*G0_1_0_2_1_5 + 0.000620941558441576*G0_1_0_2_2_0 + 0.00135146103896108*G0_1_0_2_2_1 - 0.00416396103896114*G0_1_0_2_2_2 - 0.00496753246753263*G0_1_0_2_2_3 + 0.000584415584415611*G0_1_0_2_2_4 + 0.000146103896103899*G0_1_0_2_2_5 + 0.0004383116883117*G0_1_0_2_3_0 - 0.00496753246753263*G0_1_0_2_3_2 - 0.0134415584415589*G0_1_0_2_3_3 - 0.00175324675324681*G0_1_0_2_3_4 - 0.00116883116883121*G0_1_0_2_3_5 - 0.00262987012987022*G0_1_0_2_4_0 + 0.000438311688311702*G0_1_0_2_4_1 + 0.000584415584415611*G0_1_0_2_4_2 - 0.00175324675324681*G0_1_0_2_4_3 - 0.00993506493506526*G0_1_0_2_4_4 - 0.0011688311688312*G0_1_0_2_4_5 + 0.000584415584415605*G0_1_0_2_5_0 - 0.000438311688311706*G0_1_0_2_5_1 + 0.000146103896103899*G0_1_0_2_5_2 - 0.00116883116883121*G0_1_0_2_5_3 - 0.0011688311688312*G0_1_0_2_5_4 - 0.0011688311688312*G0_1_0_2_5_5 - 0.000438311688311702*G0_1_0_3_0_1 + 0.0004383116883117*G0_1_0_3_0_2 + 0.00116883116883121*G0_1_0_3_0_4 - 0.00116883116883121*G0_1_0_3_0_5 - 0.000438311688311702*G0_1_0_3_1_0 + 0.00496753246753263*G0_1_0_3_1_1 + 0.0134415584415589*G0_1_0_3_1_3 + 0.00116883116883121*G0_1_0_3_1_4 + 0.00175324675324682*G0_1_0_3_1_5 + 0.0004383116883117*G0_1_0_3_2_0 - 0.00496753246753263*G0_1_0_3_2_2 - 0.0134415584415589*G0_1_0_3_2_3 - 0.00175324675324681*G0_1_0_3_2_4 - 0.00116883116883121*G0_1_0_3_2_5 + 0.0134415584415589*G0_1_0_3_3_1 - 0.0134415584415589*G0_1_0_3_3_2 - 0.00233766233766243*G0_1_0_3_3_4 + 0.00233766233766241*G0_1_0_3_3_5 + 0.00116883116883121*G0_1_0_3_4_0 + 0.00116883116883121*G0_1_0_3_4_1 - 0.00175324675324681*G0_1_0_3_4_2 - 0.00233766233766243*G0_1_0_3_4_3 - 0.00467532467532484*G0_1_0_3_4_4 - 0.0011688311688312*G0_1_0_3_5_0 + 0.00175324675324682*G0_1_0_3_5_1 - 0.00116883116883121*G0_1_0_3_5_2 + 0.00233766233766241*G0_1_0_3_5_3 + 0.00467532467532481*G0_1_0_3_5_5 + 0.0109577922077925*G0_1_0_4_0_0 - 0.000584415584415604*G0_1_0_4_0_1 - 0.00262987012987022*G0_1_0_4_0_2 + 0.00116883116883121*G0_1_0_4_0_3 + 0.0216233766233773*G0_1_0_4_0_4 - 0.000584415584415604*G0_1_0_4_1_0 - 0.000146103896103901*G0_1_0_4_1_1 + 0.000438311688311702*G0_1_0_4_1_2 + 0.00116883116883121*G0_1_0_4_1_3 + 0.00116883116883121*G0_1_0_4_1_4 + 0.00116883116883121*G0_1_0_4_1_5 - 0.00262987012987022*G0_1_0_4_2_0 + 0.000438311688311702*G0_1_0_4_2_1 + 0.000584415584415611*G0_1_0_4_2_2 - 0.00175324675324681*G0_1_0_4_2_3 - 0.00993506493506526*G0_1_0_4_2_4 - 0.0011688311688312*G0_1_0_4_2_5 + 0.00116883116883121*G0_1_0_4_3_0 + 0.00116883116883121*G0_1_0_4_3_1 - 0.00175324675324681*G0_1_0_4_3_2 - 0.00233766233766243*G0_1_0_4_3_3 - 0.00467532467532485*G0_1_0_4_3_4 + 0.0216233766233773*G0_1_0_4_4_0 + 0.00116883116883121*G0_1_0_4_4_1 - 0.00993506493506525*G0_1_0_4_4_2 - 0.00467532467532485*G0_1_0_4_4_3 - 0.0210389610389617*G0_1_0_4_4_4 + 0.00116883116883121*G0_1_0_4_5_1 - 0.0011688311688312*G0_1_0_4_5_2 - 0.0109577922077926*G0_1_0_5_0_0 + 0.00262987012987022*G0_1_0_5_0_1 + 0.000584415584415605*G0_1_0_5_0_2 - 0.0011688311688312*G0_1_0_5_0_3 - 0.0216233766233774*G0_1_0_5_0_5 + 0.00262987012987022*G0_1_0_5_1_0 - 0.000584415584415609*G0_1_0_5_1_1 - 0.000438311688311706*G0_1_0_5_1_2 + 0.00175324675324682*G0_1_0_5_1_3 + 0.00116883116883121*G0_1_0_5_1_4 + 0.0099350649350653*G0_1_0_5_1_5 + 0.000584415584415605*G0_1_0_5_2_0 - 0.000438311688311706*G0_1_0_5_2_1 + 0.000146103896103899*G0_1_0_5_2_2 - 0.00116883116883121*G0_1_0_5_2_3 - 0.0011688311688312*G0_1_0_5_2_4 - 0.0011688311688312*G0_1_0_5_2_5 - 0.0011688311688312*G0_1_0_5_3_0 + 0.00175324675324682*G0_1_0_5_3_1 - 0.00116883116883121*G0_1_0_5_3_2 + 0.00233766233766241*G0_1_0_5_3_3 + 0.00467532467532481*G0_1_0_5_3_5 + 0.00116883116883121*G0_1_0_5_4_1 - 0.0011688311688312*G0_1_0_5_4_2 - 0.0216233766233774*G0_1_0_5_5_0 + 0.0099350649350653*G0_1_0_5_5_1 - 0.0011688311688312*G0_1_0_5_5_2 + 0.00467532467532481*G0_1_0_5_5_3 + 0.0210389610389616*G0_1_0_5_5_5 + 0.0142451298701305*G0_1_1_0_0_0 - 0.00248376623376633*G0_1_1_0_0_1 - 0.000365259740259759*G0_1_1_0_0_2 - 0.0004383116883117*G0_1_1_0_0_3 + 0.000730519480519523*G0_1_1_0_0_4 + 0.0124188311688317*G0_1_1_0_0_5 - 0.00248376623376633*G0_1_1_0_1_0 + 0.00124188311688316*G0_1_1_0_1_1 + 0.000109577922077927*G0_1_1_0_1_2 - 0.000876623376623404*G0_1_1_0_1_3 - 0.000730519480519505*G0_1_1_0_1_4 - 0.00409090909090924*G0_1_1_0_1_5 - 0.000365259740259759*G0_1_1_0_2_0 + 0.000109577922077927*G0_1_1_0_2_1 + 0.000657467532467557*G0_1_1_0_2_2 - 0.00160714285714291*G0_1_1_0_2_5 - 0.0004383116883117*G0_1_1_0_3_0 - 0.000876623376623405*G0_1_1_0_3_1 + 0.00292207792207801*G0_1_1_0_3_3 + 0.00233766233766241*G0_1_1_0_3_4 + 0.00409090909090922*G0_1_1_0_3_5 + 0.000730519480519523*G0_1_1_0_4_0 - 0.000730519480519505*G0_1_1_0_4_1 + 0.00233766233766241*G0_1_1_0_4_3 - 0.0005844155844156*G0_1_1_0_4_4 + 0.00467532467532484*G0_1_1_0_4_5 + 0.0124188311688317*G0_1_1_0_5_0 - 0.00409090909090924*G0_1_1_0_5_1 - 0.00160714285714291*G0_1_1_0_5_2 + 0.00409090909090923*G0_1_1_0_5_3 + 0.00467532467532484*G0_1_1_0_5_4 + 0.0262987012987023*G0_1_1_0_5_5 - 0.00248376623376633*G0_1_1_1_0_0 + 0.00124188311688316*G0_1_1_1_0_1 + 0.000109577922077927*G0_1_1_1_0_2 - 0.000876623376623405*G0_1_1_1_0_3 - 0.000730519480519505*G0_1_1_1_0_4 - 0.00409090909090924*G0_1_1_1_0_5 + 0.00124188311688316*G0_1_1_1_1_0 + 0.00219155844155848*G0_1_1_1_1_1 - 0.00116883116883121*G0_1_1_1_1_2 + 0.00409090909090923*G0_1_1_1_1_3 - 0.00116883116883121*G0_1_1_1_1_4 - 0.00116883116883121*G0_1_1_1_1_5 + 0.000109577922077927*G0_1_1_1_2_0 - 0.00116883116883121*G0_1_1_1_2_1 + 0.00211850649350657*G0_1_1_1_2_2 - 0.000292207792207805*G0_1_1_1_2_3 - 0.000876623376623405*G0_1_1_1_2_4 - 0.000292207792207802*G0_1_1_1_2_5 - 0.000876623376623404*G0_1_1_1_3_0 + 0.00409090909090923*G0_1_1_1_3_1 - 0.000292207792207804*G0_1_1_1_3_2 + 0.0163636363636369*G0_1_1_1_3_3 + 0.00409090909090923*G0_1_1_1_3_4 + 0.00233766233766242*G0_1_1_1_3_5 - 0.000730519480519505*G0_1_1_1_4_0 - 0.00116883116883121*G0_1_1_1_4_1 - 0.000876623376623405*G0_1_1_1_4_2 + 0.00409090909090923*G0_1_1_1_4_3 + 0.00701298701298725*G0_1_1_1_4_4 + 0.00292207792207802*G0_1_1_1_4_5 - 0.00409090909090924*G0_1_1_1_5_0 - 0.00116883116883121*G0_1_1_1_5_1 - 0.000292207792207803*G0_1_1_1_5_2 + 0.00233766233766242*G0_1_1_1_5_3 + 0.00292207792207802*G0_1_1_1_5_4 - 0.00935064935064968*G0_1_1_1_5_5 - 0.000365259740259759*G0_1_1_2_0_0 + 0.000109577922077927*G0_1_1_2_0_1 + 0.000657467532467557*G0_1_1_2_0_2 - 0.00160714285714291*G0_1_1_2_0_5 + 0.000109577922077927*G0_1_1_2_1_0 - 0.00116883116883121*G0_1_1_2_1_1 + 0.00211850649350657*G0_1_1_2_1_2 - 0.000292207792207805*G0_1_1_2_1_3 - 0.000876623376623405*G0_1_1_2_1_4 - 0.000292207792207803*G0_1_1_2_1_5 + 0.000657467532467557*G0_1_1_2_2_0 + 0.00211850649350657*G0_1_1_2_2_1 - 0.0105194805194809*G0_1_1_2_2_2 - 0.00818181818181846*G0_1_1_2_2_3 - 0.00350649350649364*G0_1_1_2_2_4 - 0.00146103896103901*G0_1_1_2_2_5 - 0.000292207792207805*G0_1_1_2_3_1 - 0.00818181818181846*G0_1_1_2_3_2 - 0.0122727272727277*G0_1_1_2_3_3 + 0.00175324675324681*G0_1_1_2_3_4 + 0.00292207792207802*G0_1_1_2_3_5 - 0.000876623376623405*G0_1_1_2_4_1 - 0.00350649350649364*G0_1_1_2_4_2 + 0.00175324675324681*G0_1_1_2_4_3 + 0.00759740259740284*G0_1_1_2_4_4 + 0.00467532467532483*G0_1_1_2_4_5 - 0.00160714285714291*G0_1_1_2_5_0 - 0.000292207792207803*G0_1_1_2_5_1 - 0.00146103896103901*G0_1_1_2_5_2 + 0.00292207792207802*G0_1_1_2_5_3 + 0.00467532467532483*G0_1_1_2_5_4 + 0.000584415584415601*G0_1_1_2_5_5 - 0.0004383116883117*G0_1_1_3_0_0 - 0.000876623376623404*G0_1_1_3_0_1 + 0.00292207792207801*G0_1_1_3_0_3 + 0.00233766233766241*G0_1_1_3_0_4 + 0.00409090909090922*G0_1_1_3_0_5 - 0.000876623376623404*G0_1_1_3_1_0 + 0.00409090909090923*G0_1_1_3_1_1 - 0.000292207792207805*G0_1_1_3_1_2 + 0.0163636363636369*G0_1_1_3_1_3 + 0.00409090909090923*G0_1_1_3_1_4 + 0.00233766233766242*G0_1_1_3_1_5 - 0.000292207792207804*G0_1_1_3_2_1 - 0.00818181818181846*G0_1_1_3_2_2 - 0.0122727272727277*G0_1_1_3_2_3 + 0.00175324675324681*G0_1_1_3_2_4 + 0.00292207792207802*G0_1_1_3_2_5 + 0.00292207792207801*G0_1_1_3_3_0 + 0.0163636363636369*G0_1_1_3_3_1 - 0.0122727272727277*G0_1_1_3_3_2 - 0.00701298701298721*G0_1_1_3_3_3 - 0.0140259740259745*G0_1_1_3_3_4 - 0.0116883116883121*G0_1_1_3_3_5 + 0.00233766233766241*G0_1_1_3_4_0 + 0.00409090909090923*G0_1_1_3_4_1 + 0.00175324675324681*G0_1_1_3_4_2 - 0.0140259740259745*G0_1_1_3_4_3 - 0.0187012987012993*G0_1_1_3_4_4 - 0.0140259740259745*G0_1_1_3_4_5 + 0.00409090909090922*G0_1_1_3_5_0 + 0.00233766233766242*G0_1_1_3_5_1 + 0.00292207792207802*G0_1_1_3_5_2 - 0.0116883116883121*G0_1_1_3_5_3 - 0.0140259740259745*G0_1_1_3_5_4 - 0.00935064935064967*G0_1_1_3_5_5 + 0.000730519480519523*G0_1_1_4_0_0 - 0.000730519480519505*G0_1_1_4_0_1 + 0.00233766233766241*G0_1_1_4_0_3 - 0.000584415584415599*G0_1_1_4_0_4 + 0.00467532467532484*G0_1_1_4_0_5 - 0.000730519480519505*G0_1_1_4_1_0 - 0.00116883116883121*G0_1_1_4_1_1 - 0.000876623376623405*G0_1_1_4_1_2 + 0.00409090909090923*G0_1_1_4_1_3 + 0.00701298701298725*G0_1_1_4_1_4 + 0.00292207792207802*G0_1_1_4_1_5 - 0.000876623376623405*G0_1_1_4_2_1 - 0.00350649350649364*G0_1_1_4_2_2 + 0.00175324675324681*G0_1_1_4_2_3 + 0.00759740259740284*G0_1_1_4_2_4 + 0.00467532467532483*G0_1_1_4_2_5 + 0.00233766233766241*G0_1_1_4_3_0 + 0.00409090909090923*G0_1_1_4_3_1 + 0.00175324675324681*G0_1_1_4_3_2 - 0.0140259740259745*G0_1_1_4_3_3 - 0.0187012987012993*G0_1_1_4_3_4 - 0.0140259740259745*G0_1_1_4_3_5 - 0.000584415584415599*G0_1_1_4_4_0 + 0.00701298701298725*G0_1_1_4_4_1 + 0.00759740259740284*G0_1_1_4_4_2 - 0.0187012987012993*G0_1_1_4_4_3 - 0.0490909090909106*G0_1_1_4_4_4 - 0.0233766233766242*G0_1_1_4_4_5 + 0.00467532467532484*G0_1_1_4_5_0 + 0.00292207792207802*G0_1_1_4_5_1 + 0.00467532467532483*G0_1_1_4_5_2 - 0.0140259740259745*G0_1_1_4_5_3 - 0.0233766233766242*G0_1_1_4_5_4 - 0.00701298701298725*G0_1_1_4_5_5 + 0.0124188311688317*G0_1_1_5_0_0 - 0.00409090909090924*G0_1_1_5_0_1 - 0.00160714285714291*G0_1_1_5_0_2 + 0.00409090909090922*G0_1_1_5_0_3 + 0.00467532467532484*G0_1_1_5_0_4 + 0.0262987012987023*G0_1_1_5_0_5 - 0.00409090909090924*G0_1_1_5_1_0 - 0.00116883116883121*G0_1_1_5_1_1 - 0.000292207792207803*G0_1_1_5_1_2 + 0.00233766233766242*G0_1_1_5_1_3 + 0.00292207792207802*G0_1_1_5_1_4 - 0.00935064935064968*G0_1_1_5_1_5 - 0.00160714285714291*G0_1_1_5_2_0 - 0.000292207792207803*G0_1_1_5_2_1 - 0.00146103896103901*G0_1_1_5_2_2 + 0.00292207792207802*G0_1_1_5_2_3 + 0.00467532467532483*G0_1_1_5_2_4 + 0.0005844155844156*G0_1_1_5_2_5 + 0.00409090909090923*G0_1_1_5_3_0 + 0.00233766233766242*G0_1_1_5_3_1 + 0.00292207792207802*G0_1_1_5_3_2 - 0.0116883116883121*G0_1_1_5_3_3 - 0.0140259740259745*G0_1_1_5_3_4 - 0.00935064935064967*G0_1_1_5_3_5 + 0.00467532467532484*G0_1_1_5_4_0 + 0.00292207792207802*G0_1_1_5_4_1 + 0.00467532467532483*G0_1_1_5_4_2 - 0.0140259740259745*G0_1_1_5_4_3 - 0.0233766233766242*G0_1_1_5_4_4 - 0.00701298701298725*G0_1_1_5_4_5 + 0.0262987012987023*G0_1_1_5_5_0 - 0.00935064935064968*G0_1_1_5_5_1 + 0.000584415584415601*G0_1_1_5_5_2 - 0.00935064935064967*G0_1_1_5_5_3 - 0.00701298701298726*G0_1_1_5_5_4 + 0.140259740259745*G0_1_1_5_5_5; + A[76] = A[67] - 0.0887581168831199*G0_0_1_0_0_0 + 0.00507711038961055*G0_0_1_0_0_1 + 0.00288555194805204*G0_0_1_0_0_2 - 0.00102272727272729*G0_0_1_0_0_3 - 0.0102272727272731*G0_0_1_0_0_4 - 0.0204545454545461*G0_0_1_0_0_5 + 0.00507711038961055*G0_0_1_0_1_0 - 0.000328733766233775*G0_0_1_0_1_1 + 0.000133928571428577*G0_0_1_0_1_2 - 0.000633116883116905*G0_0_1_0_1_3 - 0.000827922077922107*G0_0_1_0_1_4 + 0.000194805194805193*G0_0_1_0_1_5 + 0.00288555194805204*G0_0_1_0_2_0 + 0.000133928571428577*G0_0_1_0_2_1 - 0.000401785714285734*G0_0_1_0_2_2 - 0.000925324675324707*G0_0_1_0_2_3 - 0.00214285714285722*G0_0_1_0_2_4 - 0.00102272727272729*G0_0_1_0_3_0 - 0.000633116883116905*G0_0_1_0_3_1 - 0.000925324675324707*G0_0_1_0_3_2 + 0.00175324675324681*G0_0_1_0_3_3 + 0.00370129870129882*G0_0_1_0_3_4 + 0.00194805194805202*G0_0_1_0_3_5 - 0.010227272727273*G0_0_1_0_4_0 - 0.000827922077922107*G0_0_1_0_4_1 - 0.00214285714285722*G0_0_1_0_4_2 + 0.00370129870129882*G0_0_1_0_4_3 + 0.0159740259740265*G0_0_1_0_4_4 + 0.00155844155844162*G0_0_1_0_4_5 - 0.0204545454545461*G0_0_1_0_5_0 + 0.000194805194805193*G0_0_1_0_5_1 + 0.00194805194805202*G0_0_1_0_5_3 + 0.00155844155844162*G0_0_1_0_5_4 - 0.00740259740259761*G0_0_1_0_5_5 + 0.00507711038961055*G0_0_1_1_0_0 - 0.000328733766233775*G0_0_1_1_0_1 + 0.000133928571428577*G0_0_1_1_0_2 - 0.000633116883116905*G0_0_1_1_0_3 - 0.000827922077922107*G0_0_1_1_0_4 + 0.000194805194805193*G0_0_1_1_0_5 - 0.000328733766233775*G0_0_1_1_1_0 - 0.00113230519480526*G0_0_1_1_1_1 + 0.000243506493506502*G0_0_1_1_1_2 - 0.000535714285714304*G0_0_1_1_1_3 - 0.000633116883116902*G0_0_1_1_1_4 + 0.000779220779220806*G0_0_1_1_1_5 + 0.000133928571428577*G0_0_1_1_2_0 + 0.000243506493506502*G0_0_1_1_2_1 - 0.000633116883116906*G0_0_1_1_2_2 - 0.00107142857142861*G0_0_1_1_2_3 - 0.000340909090909104*G0_0_1_1_2_4 - 0.000340909090909102*G0_0_1_1_2_5 - 0.000633116883116905*G0_0_1_1_3_0 - 0.000535714285714305*G0_0_1_1_3_1 - 0.00107142857142861*G0_0_1_1_3_2 + 0.000974025974026014*G0_0_1_1_3_3 + 0.00253246753246761*G0_0_1_1_3_4 + 0.00194805194805201*G0_0_1_1_3_5 - 0.000827922077922107*G0_0_1_1_4_0 - 0.000633116883116902*G0_0_1_1_4_1 - 0.000340909090909104*G0_0_1_1_4_2 + 0.00253246753246761*G0_0_1_1_4_3 + 0.0021428571428572*G0_0_1_1_4_4 + 0.00194805194805201*G0_0_1_1_4_5 + 0.000194805194805193*G0_0_1_1_5_0 + 0.000779220779220806*G0_0_1_1_5_1 - 0.000340909090909102*G0_0_1_1_5_2 + 0.00194805194805201*G0_0_1_1_5_3 + 0.00194805194805201*G0_0_1_1_5_4 + 0.00350649350649362*G0_0_1_1_5_5 + 0.00288555194805204*G0_0_1_2_0_0 + 0.000133928571428577*G0_0_1_2_0_1 - 0.000401785714285734*G0_0_1_2_0_2 - 0.000925324675324707*G0_0_1_2_0_3 - 0.00214285714285722*G0_0_1_2_0_4 + 0.000133928571428577*G0_0_1_2_1_0 + 0.000243506493506502*G0_0_1_2_1_1 - 0.000633116883116906*G0_0_1_2_1_2 - 0.00107142857142861*G0_0_1_2_1_3 - 0.000340909090909104*G0_0_1_2_1_4 - 0.000340909090909102*G0_0_1_2_1_5 - 0.000401785714285734*G0_0_1_2_2_0 - 0.000633116883116906*G0_0_1_2_2_1 + 0.0067573051948055*G0_0_1_2_2_2 + 0.00267857142857153*G0_0_1_2_2_3 + 0.00340909090909106*G0_0_1_2_2_4 + 0.000243506493506505*G0_0_1_2_2_5 - 0.000925324675324707*G0_0_1_2_3_0 - 0.00107142857142861*G0_0_1_2_3_1 + 0.00267857142857153*G0_0_1_2_3_2 + 0.00506493506493522*G0_0_1_2_3_3 + 0.00253246753246762*G0_0_1_2_3_4 + 0.00136363636363641*G0_0_1_2_3_5 - 0.00214285714285722*G0_0_1_2_4_0 - 0.000340909090909104*G0_0_1_2_4_1 + 0.00340909090909106*G0_0_1_2_4_2 + 0.00253246753246762*G0_0_1_2_4_3 - 0.00525974025974039*G0_0_1_2_4_4 + 0.000194805194805201*G0_0_1_2_4_5 - 0.000340909090909102*G0_0_1_2_5_1 + 0.000243506493506505*G0_0_1_2_5_2 + 0.00136363636363641*G0_0_1_2_5_3 + 0.000194805194805201*G0_0_1_2_5_4 - 0.00311688311688324*G0_0_1_2_5_5 - 0.00102272727272729*G0_0_1_3_0_0 - 0.000633116883116905*G0_0_1_3_0_1 - 0.000925324675324707*G0_0_1_3_0_2 + 0.00175324675324681*G0_0_1_3_0_3 + 0.00370129870129882*G0_0_1_3_0_4 + 0.00194805194805202*G0_0_1_3_0_5 - 0.000633116883116904*G0_0_1_3_1_0 - 0.000535714285714304*G0_0_1_3_1_1 - 0.00107142857142861*G0_0_1_3_1_2 + 0.000974025974026014*G0_0_1_3_1_3 + 0.00253246753246761*G0_0_1_3_1_4 + 0.00194805194805201*G0_0_1_3_1_5 - 0.000925324675324707*G0_0_1_3_2_0 - 0.00107142857142861*G0_0_1_3_2_1 + 0.00267857142857153*G0_0_1_3_2_2 + 0.00506493506493522*G0_0_1_3_2_3 + 0.00253246753246762*G0_0_1_3_2_4 + 0.00136363636363641*G0_0_1_3_2_5 + 0.00175324675324681*G0_0_1_3_3_0 + 0.000974025974026014*G0_0_1_3_3_1 + 0.00506493506493522*G0_0_1_3_3_2 + 0.00701298701298735*G0_0_1_3_3_3 - 0.00857142857142884*G0_0_1_3_3_4 - 0.00623376623376643*G0_0_1_3_3_5 + 0.00370129870129882*G0_0_1_3_4_0 + 0.00253246753246761*G0_0_1_3_4_1 + 0.00253246753246762*G0_0_1_3_4_2 - 0.00857142857142884*G0_0_1_3_4_3 - 0.0116883116883121*G0_0_1_3_4_4 - 0.00779220779220804*G0_0_1_3_4_5 + 0.00194805194805202*G0_0_1_3_5_0 + 0.00194805194805201*G0_0_1_3_5_1 + 0.00136363636363641*G0_0_1_3_5_2 - 0.00623376623376643*G0_0_1_3_5_3 - 0.00779220779220804*G0_0_1_3_5_4 + 0.00233766233766244*G0_0_1_3_5_5 - 0.010227272727273*G0_0_1_4_0_0 - 0.000827922077922107*G0_0_1_4_0_1 - 0.00214285714285722*G0_0_1_4_0_2 + 0.00370129870129882*G0_0_1_4_0_3 + 0.0159740259740265*G0_0_1_4_0_4 + 0.00155844155844162*G0_0_1_4_0_5 - 0.000827922077922107*G0_0_1_4_1_0 - 0.000633116883116902*G0_0_1_4_1_1 - 0.000340909090909104*G0_0_1_4_1_2 + 0.00253246753246761*G0_0_1_4_1_3 + 0.0021428571428572*G0_0_1_4_1_4 + 0.00194805194805201*G0_0_1_4_1_5 - 0.00214285714285722*G0_0_1_4_2_0 - 0.000340909090909104*G0_0_1_4_2_1 + 0.00340909090909106*G0_0_1_4_2_2 + 0.00253246753246762*G0_0_1_4_2_3 - 0.0052597402597404*G0_0_1_4_2_4 + 0.000194805194805201*G0_0_1_4_2_5 + 0.00370129870129882*G0_0_1_4_3_0 + 0.00253246753246761*G0_0_1_4_3_1 + 0.00253246753246762*G0_0_1_4_3_2 - 0.00857142857142884*G0_0_1_4_3_3 - 0.0116883116883121*G0_0_1_4_3_4 - 0.00779220779220805*G0_0_1_4_3_5 + 0.0159740259740265*G0_0_1_4_4_0 + 0.0021428571428572*G0_0_1_4_4_1 - 0.00525974025974039*G0_0_1_4_4_2 - 0.0116883116883121*G0_0_1_4_4_3 + 0.0420779220779235*G0_0_1_4_4_4 - 0.00467532467532482*G0_0_1_4_4_5 + 0.00155844155844162*G0_0_1_4_5_0 + 0.00194805194805201*G0_0_1_4_5_1 + 0.000194805194805202*G0_0_1_4_5_2 - 0.00779220779220804*G0_0_1_4_5_3 - 0.00467532467532482*G0_0_1_4_5_4 + 0.00233766233766245*G0_0_1_4_5_5 - 0.0204545454545461*G0_0_1_5_0_0 + 0.000194805194805193*G0_0_1_5_0_1 + 0.00194805194805202*G0_0_1_5_0_3 + 0.00155844155844162*G0_0_1_5_0_4 - 0.0074025974025976*G0_0_1_5_0_5 + 0.000194805194805193*G0_0_1_5_1_0 + 0.000779220779220806*G0_0_1_5_1_1 - 0.000340909090909102*G0_0_1_5_1_2 + 0.00194805194805201*G0_0_1_5_1_3 + 0.00194805194805201*G0_0_1_5_1_4 + 0.00350649350649362*G0_0_1_5_1_5 - 0.000340909090909102*G0_0_1_5_2_1 + 0.000243506493506505*G0_0_1_5_2_2 + 0.00136363636363641*G0_0_1_5_2_3 + 0.000194805194805202*G0_0_1_5_2_4 - 0.00311688311688324*G0_0_1_5_2_5 + 0.00194805194805202*G0_0_1_5_3_0 + 0.00194805194805201*G0_0_1_5_3_1 + 0.00136363636363641*G0_0_1_5_3_2 - 0.00623376623376643*G0_0_1_5_3_3 - 0.00779220779220804*G0_0_1_5_3_4 + 0.00233766233766244*G0_0_1_5_3_5 + 0.00155844155844162*G0_0_1_5_4_0 + 0.00194805194805201*G0_0_1_5_4_1 + 0.000194805194805202*G0_0_1_5_4_2 - 0.00779220779220804*G0_0_1_5_4_3 - 0.00467532467532482*G0_0_1_5_4_4 + 0.00233766233766245*G0_0_1_5_4_5 - 0.0074025974025976*G0_0_1_5_5_0 + 0.00350649350649362*G0_0_1_5_5_1 - 0.00311688311688324*G0_0_1_5_5_2 + 0.00233766233766244*G0_0_1_5_5_3 + 0.00233766233766245*G0_0_1_5_5_4 + 0.105194805194809*G0_0_1_5_5_5 + 0.0887581168831199*G0_1_0_0_0_0 - 0.00507711038961055*G0_1_0_0_0_1 - 0.00288555194805204*G0_1_0_0_0_2 + 0.00102272727272729*G0_1_0_0_0_3 + 0.0102272727272731*G0_1_0_0_0_4 + 0.0204545454545461*G0_1_0_0_0_5 - 0.00507711038961055*G0_1_0_0_1_0 + 0.000328733766233775*G0_1_0_0_1_1 - 0.000133928571428577*G0_1_0_0_1_2 + 0.000633116883116905*G0_1_0_0_1_3 + 0.000827922077922107*G0_1_0_0_1_4 - 0.000194805194805193*G0_1_0_0_1_5 - 0.00288555194805204*G0_1_0_0_2_0 - 0.000133928571428577*G0_1_0_0_2_1 + 0.000401785714285734*G0_1_0_0_2_2 + 0.000925324675324707*G0_1_0_0_2_3 + 0.00214285714285722*G0_1_0_0_2_4 + 0.00102272727272729*G0_1_0_0_3_0 + 0.000633116883116905*G0_1_0_0_3_1 + 0.000925324675324707*G0_1_0_0_3_2 - 0.00175324675324681*G0_1_0_0_3_3 - 0.00370129870129882*G0_1_0_0_3_4 - 0.00194805194805202*G0_1_0_0_3_5 + 0.010227272727273*G0_1_0_0_4_0 + 0.000827922077922107*G0_1_0_0_4_1 + 0.00214285714285722*G0_1_0_0_4_2 - 0.00370129870129882*G0_1_0_0_4_3 - 0.0159740259740265*G0_1_0_0_4_4 - 0.00155844155844162*G0_1_0_0_4_5 + 0.0204545454545461*G0_1_0_0_5_0 - 0.000194805194805193*G0_1_0_0_5_1 - 0.00194805194805202*G0_1_0_0_5_3 - 0.00155844155844162*G0_1_0_0_5_4 + 0.00740259740259761*G0_1_0_0_5_5 - 0.00507711038961055*G0_1_0_1_0_0 + 0.000328733766233775*G0_1_0_1_0_1 - 0.000133928571428577*G0_1_0_1_0_2 + 0.000633116883116905*G0_1_0_1_0_3 + 0.000827922077922107*G0_1_0_1_0_4 - 0.000194805194805193*G0_1_0_1_0_5 + 0.000328733766233775*G0_1_0_1_1_0 + 0.00113230519480526*G0_1_0_1_1_1 - 0.000243506493506502*G0_1_0_1_1_2 + 0.000535714285714305*G0_1_0_1_1_3 + 0.000633116883116902*G0_1_0_1_1_4 - 0.000779220779220806*G0_1_0_1_1_5 - 0.000133928571428577*G0_1_0_1_2_0 - 0.000243506493506502*G0_1_0_1_2_1 + 0.000633116883116906*G0_1_0_1_2_2 + 0.00107142857142861*G0_1_0_1_2_3 + 0.000340909090909104*G0_1_0_1_2_4 + 0.000340909090909102*G0_1_0_1_2_5 + 0.000633116883116905*G0_1_0_1_3_0 + 0.000535714285714305*G0_1_0_1_3_1 + 0.00107142857142861*G0_1_0_1_3_2 - 0.000974025974026014*G0_1_0_1_3_3 - 0.00253246753246761*G0_1_0_1_3_4 - 0.00194805194805201*G0_1_0_1_3_5 + 0.000827922077922107*G0_1_0_1_4_0 + 0.000633116883116903*G0_1_0_1_4_1 + 0.000340909090909104*G0_1_0_1_4_2 - 0.00253246753246761*G0_1_0_1_4_3 - 0.0021428571428572*G0_1_0_1_4_4 - 0.00194805194805201*G0_1_0_1_4_5 - 0.000194805194805193*G0_1_0_1_5_0 - 0.000779220779220806*G0_1_0_1_5_1 + 0.000340909090909102*G0_1_0_1_5_2 - 0.00194805194805201*G0_1_0_1_5_3 - 0.00194805194805201*G0_1_0_1_5_4 - 0.00350649350649362*G0_1_0_1_5_5 - 0.00288555194805204*G0_1_0_2_0_0 - 0.000133928571428577*G0_1_0_2_0_1 + 0.000401785714285734*G0_1_0_2_0_2 + 0.000925324675324707*G0_1_0_2_0_3 + 0.00214285714285722*G0_1_0_2_0_4 - 0.000133928571428577*G0_1_0_2_1_0 - 0.000243506493506502*G0_1_0_2_1_1 + 0.000633116883116906*G0_1_0_2_1_2 + 0.00107142857142861*G0_1_0_2_1_3 + 0.000340909090909104*G0_1_0_2_1_4 + 0.000340909090909102*G0_1_0_2_1_5 + 0.000401785714285734*G0_1_0_2_2_0 + 0.000633116883116906*G0_1_0_2_2_1 - 0.0067573051948055*G0_1_0_2_2_2 - 0.00267857142857153*G0_1_0_2_2_3 - 0.00340909090909106*G0_1_0_2_2_4 - 0.000243506493506505*G0_1_0_2_2_5 + 0.000925324675324706*G0_1_0_2_3_0 + 0.00107142857142861*G0_1_0_2_3_1 - 0.00267857142857153*G0_1_0_2_3_2 - 0.00506493506493522*G0_1_0_2_3_3 - 0.00253246753246762*G0_1_0_2_3_4 - 0.00136363636363641*G0_1_0_2_3_5 + 0.00214285714285722*G0_1_0_2_4_0 + 0.000340909090909104*G0_1_0_2_4_1 - 0.00340909090909106*G0_1_0_2_4_2 - 0.00253246753246762*G0_1_0_2_4_3 + 0.00525974025974039*G0_1_0_2_4_4 - 0.000194805194805202*G0_1_0_2_4_5 + 0.000340909090909102*G0_1_0_2_5_1 - 0.000243506493506505*G0_1_0_2_5_2 - 0.00136363636363641*G0_1_0_2_5_3 - 0.000194805194805202*G0_1_0_2_5_4 + 0.00311688311688323*G0_1_0_2_5_5 + 0.00102272727272729*G0_1_0_3_0_0 + 0.000633116883116905*G0_1_0_3_0_1 + 0.000925324675324707*G0_1_0_3_0_2 - 0.00175324675324681*G0_1_0_3_0_3 - 0.00370129870129882*G0_1_0_3_0_4 - 0.00194805194805202*G0_1_0_3_0_5 + 0.000633116883116904*G0_1_0_3_1_0 + 0.000535714285714305*G0_1_0_3_1_1 + 0.00107142857142861*G0_1_0_3_1_2 - 0.000974025974026014*G0_1_0_3_1_3 - 0.00253246753246761*G0_1_0_3_1_4 - 0.00194805194805201*G0_1_0_3_1_5 + 0.000925324675324706*G0_1_0_3_2_0 + 0.00107142857142861*G0_1_0_3_2_1 - 0.00267857142857153*G0_1_0_3_2_2 - 0.00506493506493522*G0_1_0_3_2_3 - 0.00253246753246762*G0_1_0_3_2_4 - 0.00136363636363641*G0_1_0_3_2_5 - 0.00175324675324681*G0_1_0_3_3_0 - 0.000974025974026014*G0_1_0_3_3_1 - 0.00506493506493522*G0_1_0_3_3_2 - 0.00701298701298735*G0_1_0_3_3_3 + 0.00857142857142884*G0_1_0_3_3_4 + 0.00623376623376642*G0_1_0_3_3_5 - 0.00370129870129882*G0_1_0_3_4_0 - 0.00253246753246761*G0_1_0_3_4_1 - 0.00253246753246762*G0_1_0_3_4_2 + 0.00857142857142884*G0_1_0_3_4_3 + 0.0116883116883121*G0_1_0_3_4_4 + 0.00779220779220804*G0_1_0_3_4_5 - 0.00194805194805202*G0_1_0_3_5_0 - 0.00194805194805201*G0_1_0_3_5_1 - 0.00136363636363641*G0_1_0_3_5_2 + 0.00623376623376642*G0_1_0_3_5_3 + 0.00779220779220804*G0_1_0_3_5_4 - 0.00233766233766244*G0_1_0_3_5_5 + 0.010227272727273*G0_1_0_4_0_0 + 0.000827922077922107*G0_1_0_4_0_1 + 0.00214285714285722*G0_1_0_4_0_2 - 0.00370129870129882*G0_1_0_4_0_3 - 0.0159740259740265*G0_1_0_4_0_4 - 0.00155844155844162*G0_1_0_4_0_5 + 0.000827922077922107*G0_1_0_4_1_0 + 0.000633116883116902*G0_1_0_4_1_1 + 0.000340909090909104*G0_1_0_4_1_2 - 0.00253246753246761*G0_1_0_4_1_3 - 0.0021428571428572*G0_1_0_4_1_4 - 0.00194805194805201*G0_1_0_4_1_5 + 0.00214285714285722*G0_1_0_4_2_0 + 0.000340909090909104*G0_1_0_4_2_1 - 0.00340909090909106*G0_1_0_4_2_2 - 0.00253246753246762*G0_1_0_4_2_3 + 0.0052597402597404*G0_1_0_4_2_4 - 0.000194805194805202*G0_1_0_4_2_5 - 0.00370129870129882*G0_1_0_4_3_0 - 0.00253246753246761*G0_1_0_4_3_1 - 0.00253246753246762*G0_1_0_4_3_2 + 0.00857142857142884*G0_1_0_4_3_3 + 0.0116883116883121*G0_1_0_4_3_4 + 0.00779220779220804*G0_1_0_4_3_5 - 0.0159740259740265*G0_1_0_4_4_0 - 0.0021428571428572*G0_1_0_4_4_1 + 0.00525974025974039*G0_1_0_4_4_2 + 0.0116883116883121*G0_1_0_4_4_3 - 0.0420779220779236*G0_1_0_4_4_4 + 0.00467532467532482*G0_1_0_4_4_5 - 0.00155844155844162*G0_1_0_4_5_0 - 0.00194805194805201*G0_1_0_4_5_1 - 0.000194805194805202*G0_1_0_4_5_2 + 0.00779220779220804*G0_1_0_4_5_3 + 0.00467532467532482*G0_1_0_4_5_4 - 0.00233766233766245*G0_1_0_4_5_5 + 0.0204545454545461*G0_1_0_5_0_0 - 0.000194805194805193*G0_1_0_5_0_1 - 0.00194805194805202*G0_1_0_5_0_3 - 0.00155844155844162*G0_1_0_5_0_4 + 0.00740259740259761*G0_1_0_5_0_5 - 0.000194805194805193*G0_1_0_5_1_0 - 0.000779220779220806*G0_1_0_5_1_1 + 0.000340909090909102*G0_1_0_5_1_2 - 0.00194805194805201*G0_1_0_5_1_3 - 0.00194805194805201*G0_1_0_5_1_4 - 0.00350649350649362*G0_1_0_5_1_5 + 0.000340909090909102*G0_1_0_5_2_1 - 0.000243506493506505*G0_1_0_5_2_2 - 0.00136363636363641*G0_1_0_5_2_3 - 0.000194805194805202*G0_1_0_5_2_4 + 0.00311688311688323*G0_1_0_5_2_5 - 0.00194805194805202*G0_1_0_5_3_0 - 0.00194805194805201*G0_1_0_5_3_1 - 0.00136363636363641*G0_1_0_5_3_2 + 0.00623376623376642*G0_1_0_5_3_3 + 0.00779220779220804*G0_1_0_5_3_4 - 0.00233766233766244*G0_1_0_5_3_5 - 0.00155844155844162*G0_1_0_5_4_0 - 0.00194805194805201*G0_1_0_5_4_1 - 0.000194805194805202*G0_1_0_5_4_2 + 0.00779220779220804*G0_1_0_5_4_3 + 0.00467532467532482*G0_1_0_5_4_4 - 0.00233766233766245*G0_1_0_5_4_5 + 0.00740259740259761*G0_1_0_5_5_0 - 0.00350649350649362*G0_1_0_5_5_1 + 0.00311688311688323*G0_1_0_5_5_2 - 0.00233766233766244*G0_1_0_5_5_3 - 0.00233766233766245*G0_1_0_5_5_4 - 0.105194805194809*G0_1_0_5_5_5; + A[64] = -A[67] + 0.00741477272727304*G0_0_0_0_0_0 + 0.000133928571428571*G0_0_0_0_0_1 - 0.00411525974025988*G0_0_0_0_0_2 - 0.00238636363636371*G0_0_0_0_0_3 - 0.00102272727272729*G0_0_0_0_0_4 + 0.000779220779220821*G0_0_0_0_0_5 + 0.000133928571428571*G0_0_0_0_1_0 + 0.000584415584415603*G0_0_0_0_1_1 - 0.00226461038961046*G0_0_0_0_1_2 - 0.00282467532467542*G0_0_0_0_1_3 - 0.00277597402597412*G0_0_0_0_1_4 - 0.000487012987013003*G0_0_0_0_1_5 - 0.00411525974025988*G0_0_0_0_2_0 - 0.00226461038961046*G0_0_0_0_2_1 + 0.0219277597402605*G0_0_0_0_2_2 + 0.00949675324675356*G0_0_0_0_2_3 + 0.0147077922077927*G0_0_0_0_2_4 + 0.00082792207792211*G0_0_0_0_2_5 - 0.00238636363636371*G0_0_0_0_3_0 - 0.00282467532467541*G0_0_0_0_3_1 + 0.00949675324675356*G0_0_0_0_3_2 + 0.0144155844155849*G0_0_0_0_3_3 + 0.0103246753246757*G0_0_0_0_3_4 + 0.00311688311688322*G0_0_0_0_3_5 - 0.00102272727272729*G0_0_0_0_4_0 - 0.00277597402597412*G0_0_0_0_4_1 + 0.0147077922077927*G0_0_0_0_4_2 + 0.0103246753246757*G0_0_0_0_4_3 + 0.0262987012987022*G0_0_0_0_4_4 + 0.00389610389610403*G0_0_0_0_4_5 + 0.000779220779220821*G0_0_0_0_5_0 - 0.000487012987013003*G0_0_0_0_5_1 + 0.00082792207792211*G0_0_0_0_5_2 + 0.00311688311688322*G0_0_0_0_5_3 + 0.00389610389610403*G0_0_0_0_5_4 + 0.00311688311688323*G0_0_0_0_5_5 + 0.000133928571428571*G0_0_0_1_0_0 + 0.000584415584415603*G0_0_0_1_0_1 - 0.00226461038961046*G0_0_0_1_0_2 - 0.00282467532467541*G0_0_0_1_0_3 - 0.00277597402597412*G0_0_0_1_0_4 - 0.000487012987013003*G0_0_0_1_0_5 + 0.000584415584415603*G0_0_0_1_1_0 + 0.0038717532467534*G0_0_0_1_1_1 - 0.00406655844155858*G0_0_0_1_1_2 - 0.00379870129870143*G0_0_0_1_1_3 - 0.00243506493506502*G0_0_0_1_1_4 - 0.000584415584415603*G0_0_0_1_1_5 - 0.00226461038961046*G0_0_0_1_2_0 - 0.00406655844155858*G0_0_0_1_2_1 + 0.0230235389610398*G0_0_0_1_2_2 + 0.0172402597402603*G0_0_0_1_2_3 + 0.00939935064935097*G0_0_0_1_2_4 + 0.00126623376623382*G0_0_0_1_2_5 - 0.00282467532467541*G0_0_0_1_3_0 - 0.00379870129870143*G0_0_0_1_3_1 + 0.0172402597402603*G0_0_0_1_3_2 + 0.0303896103896114*G0_0_0_1_3_3 + 0.0105194805194809*G0_0_0_1_3_4 + 0.00311688311688323*G0_0_0_1_3_5 - 0.00277597402597412*G0_0_0_1_4_0 - 0.00243506493506502*G0_0_0_1_4_1 + 0.00939935064935097*G0_0_0_1_4_2 + 0.0105194805194809*G0_0_0_1_4_3 + 0.0118831168831173*G0_0_0_1_4_4 + 0.00233766233766242*G0_0_0_1_4_5 - 0.000487012987013003*G0_0_0_1_5_0 - 0.000584415584415604*G0_0_0_1_5_1 + 0.00126623376623382*G0_0_0_1_5_2 + 0.00311688311688323*G0_0_0_1_5_3 + 0.00233766233766242*G0_0_0_1_5_4 + 0.000779220779220801*G0_0_0_1_5_5 - 0.00411525974025988*G0_0_0_2_0_0 - 0.00226461038961046*G0_0_0_2_0_1 + 0.0219277597402605*G0_0_0_2_0_2 + 0.00949675324675356*G0_0_0_2_0_3 + 0.0147077922077927*G0_0_0_2_0_4 + 0.00082792207792211*G0_0_0_2_0_5 - 0.00226461038961046*G0_0_0_2_1_0 - 0.00406655844155858*G0_0_0_2_1_1 + 0.0230235389610398*G0_0_0_2_1_2 + 0.0172402597402603*G0_0_0_2_1_3 + 0.00939935064935097*G0_0_0_2_1_4 + 0.00126623376623382*G0_0_0_2_1_5 + 0.0219277597402605*G0_0_0_2_2_0 + 0.0230235389610398*G0_0_0_2_2_1 - 0.303165584415595*G0_0_0_2_2_2 - 0.0998376623376659*G0_0_0_2_2_3 - 0.0930194805194838*G0_0_0_2_2_4 - 0.00696428571428601*G0_0_0_2_2_5 + 0.00949675324675356*G0_0_0_2_3_0 + 0.0172402597402603*G0_0_0_2_3_1 - 0.0998376623376659*G0_0_0_2_3_2 - 0.0849350649350679*G0_0_0_2_3_3 - 0.0377922077922091*G0_0_0_2_3_4 - 0.00506493506493527*G0_0_0_2_3_5 + 0.0147077922077927*G0_0_0_2_4_0 + 0.00939935064935097*G0_0_0_2_4_1 - 0.0930194805194838*G0_0_0_2_4_2 - 0.0377922077922091*G0_0_0_2_4_3 - 0.0732467532467558*G0_0_0_2_4_4 - 0.00487012987013006*G0_0_0_2_4_5 + 0.00082792207792211*G0_0_0_2_5_0 + 0.00126623376623382*G0_0_0_2_5_1 - 0.00696428571428601*G0_0_0_2_5_2 - 0.00506493506493527*G0_0_0_2_5_3 - 0.00487012987013006*G0_0_0_2_5_4 + 0.00194805194805202*G0_0_0_2_5_5 - 0.00238636363636371*G0_0_0_3_0_0 - 0.00282467532467541*G0_0_0_3_0_1 + 0.00949675324675356*G0_0_0_3_0_2 + 0.0144155844155849*G0_0_0_3_0_3 + 0.0103246753246757*G0_0_0_3_0_4 + 0.00311688311688322*G0_0_0_3_0_5 - 0.00282467532467541*G0_0_0_3_1_0 - 0.00379870129870143*G0_0_0_3_1_1 + 0.0172402597402603*G0_0_0_3_1_2 + 0.0303896103896114*G0_0_0_3_1_3 + 0.0105194805194809*G0_0_0_3_1_4 + 0.00311688311688323*G0_0_0_3_1_5 + 0.00949675324675356*G0_0_0_3_2_0 + 0.0172402597402603*G0_0_0_3_2_1 - 0.0998376623376659*G0_0_0_3_2_2 - 0.0849350649350679*G0_0_0_3_2_3 - 0.0377922077922091*G0_0_0_3_2_4 - 0.00506493506493527*G0_0_0_3_2_5 + 0.0144155844155849*G0_0_0_3_3_0 + 0.0303896103896114*G0_0_0_3_3_1 - 0.0849350649350679*G0_0_0_3_3_2 - 0.187012987012994*G0_0_0_3_3_3 - 0.0498701298701316*G0_0_0_3_3_4 - 0.0187012987012994*G0_0_0_3_3_5 + 0.0103246753246757*G0_0_0_3_4_0 + 0.0105194805194809*G0_0_0_3_4_1 - 0.0377922077922091*G0_0_0_3_4_2 - 0.0498701298701316*G0_0_0_3_4_3 - 0.0444155844155859*G0_0_0_3_4_4 - 0.0109090909090913*G0_0_0_3_4_5 + 0.00311688311688322*G0_0_0_3_5_0 + 0.00311688311688323*G0_0_0_3_5_1 - 0.00506493506493527*G0_0_0_3_5_2 - 0.0187012987012994*G0_0_0_3_5_3 - 0.0109090909090913*G0_0_0_3_5_4 - 0.0101298701298705*G0_0_0_3_5_5 - 0.00102272727272729*G0_0_0_4_0_0 - 0.00277597402597412*G0_0_0_4_0_1 + 0.0147077922077927*G0_0_0_4_0_2 + 0.0103246753246757*G0_0_0_4_0_3 + 0.0262987012987022*G0_0_0_4_0_4 + 0.00389610389610403*G0_0_0_4_0_5 - 0.00277597402597412*G0_0_0_4_1_0 - 0.00243506493506502*G0_0_0_4_1_1 + 0.00939935064935097*G0_0_0_4_1_2 + 0.0105194805194809*G0_0_0_4_1_3 + 0.0118831168831173*G0_0_0_4_1_4 + 0.00233766233766242*G0_0_0_4_1_5 + 0.0147077922077927*G0_0_0_4_2_0 + 0.00939935064935097*G0_0_0_4_2_1 - 0.0930194805194838*G0_0_0_4_2_2 - 0.0377922077922091*G0_0_0_4_2_3 - 0.0732467532467558*G0_0_0_4_2_4 - 0.00487012987013006*G0_0_0_4_2_5 + 0.0103246753246757*G0_0_0_4_3_0 + 0.0105194805194809*G0_0_0_4_3_1 - 0.0377922077922091*G0_0_0_4_3_2 - 0.0498701298701316*G0_0_0_4_3_3 - 0.0444155844155859*G0_0_0_4_3_4 - 0.0109090909090913*G0_0_0_4_3_5 + 0.0262987012987022*G0_0_0_4_4_0 + 0.0118831168831173*G0_0_0_4_4_1 - 0.0732467532467558*G0_0_0_4_4_2 - 0.0444155844155859*G0_0_0_4_4_3 - 0.137922077922082*G0_0_0_4_4_4 - 0.0140259740259745*G0_0_0_4_4_5 + 0.00389610389610403*G0_0_0_4_5_0 + 0.00233766233766242*G0_0_0_4_5_1 - 0.00487012987013006*G0_0_0_4_5_2 - 0.0109090909090913*G0_0_0_4_5_3 - 0.0140259740259745*G0_0_0_4_5_4 - 0.00857142857142888*G0_0_0_4_5_5 + 0.000779220779220821*G0_0_0_5_0_0 - 0.000487012987013003*G0_0_0_5_0_1 + 0.00082792207792211*G0_0_0_5_0_2 + 0.00311688311688322*G0_0_0_5_0_3 + 0.00389610389610403*G0_0_0_5_0_4 + 0.00311688311688323*G0_0_0_5_0_5 - 0.000487012987013003*G0_0_0_5_1_0 - 0.000584415584415604*G0_0_0_5_1_1 + 0.00126623376623382*G0_0_0_5_1_2 + 0.00311688311688323*G0_0_0_5_1_3 + 0.00233766233766242*G0_0_0_5_1_4 + 0.000779220779220801*G0_0_0_5_1_5 + 0.00082792207792211*G0_0_0_5_2_0 + 0.00126623376623381*G0_0_0_5_2_1 - 0.00696428571428601*G0_0_0_5_2_2 - 0.00506493506493527*G0_0_0_5_2_3 - 0.00487012987013006*G0_0_0_5_2_4 + 0.00194805194805202*G0_0_0_5_2_5 + 0.00311688311688322*G0_0_0_5_3_0 + 0.00311688311688323*G0_0_0_5_3_1 - 0.00506493506493527*G0_0_0_5_3_2 - 0.0187012987012994*G0_0_0_5_3_3 - 0.0109090909090913*G0_0_0_5_3_4 - 0.0101298701298705*G0_0_0_5_3_5 + 0.00389610389610403*G0_0_0_5_4_0 + 0.00233766233766242*G0_0_0_5_4_1 - 0.00487012987013006*G0_0_0_5_4_2 - 0.0109090909090913*G0_0_0_5_4_3 - 0.0140259740259745*G0_0_0_5_4_4 - 0.00857142857142888*G0_0_0_5_4_5 + 0.00311688311688323*G0_0_0_5_5_0 + 0.000779220779220801*G0_0_0_5_5_1 + 0.00194805194805202*G0_0_0_5_5_2 - 0.0101298701298705*G0_0_0_5_5_3 - 0.00857142857142888*G0_0_0_5_5_4 - 0.0257142857142868*G0_0_0_5_5_5 - 0.00131493506493514*G0_0_1_0_0_0 + 0.000803571428571458*G0_0_1_0_0_1 - 0.000657467532467552*G0_0_1_0_0_2 - 0.00262987012987021*G0_0_1_0_0_3 - 0.00321428571428583*G0_0_1_0_0_4 - 0.00262987012987024*G0_0_1_0_0_5 + 0.000803571428571458*G0_0_1_0_1_0 + 0.000511363636363654*G0_0_1_0_1_1 - 0.00124188311688316*G0_0_1_0_1_2 - 0.00292207792207801*G0_0_1_0_1_3 - 0.00146103896103901*G0_0_1_0_1_4 + 0.000292207792207814*G0_0_1_0_1_5 - 0.000657467532467552*G0_0_1_0_2_0 - 0.00124188311688316*G0_0_1_0_2_1 + 0.00504058441558459*G0_0_1_0_2_2 + 0.00525974025974043*G0_0_1_0_2_3 + 0.00438311688311704*G0_0_1_0_2_4 + 0.00087662337662341*G0_0_1_0_2_5 - 0.00262987012987021*G0_0_1_0_3_0 - 0.00292207792207801*G0_0_1_0_3_1 + 0.00525974025974043*G0_0_1_0_3_2 + 0.0175324675324681*G0_0_1_0_3_3 + 0.00818181818181844*G0_0_1_0_3_4 + 0.00350649350649362*G0_0_1_0_3_5 - 0.00321428571428583*G0_0_1_0_4_0 - 0.00146103896103901*G0_0_1_0_4_1 + 0.00438311688311704*G0_0_1_0_4_2 + 0.00818181818181844*G0_0_1_0_4_3 + 0.00701298701298724*G0_0_1_0_4_4 + 0.0011688311688312*G0_0_1_0_4_5 - 0.00262987012987024*G0_0_1_0_5_0 + 0.000292207792207814*G0_0_1_0_5_1 + 0.00087662337662341*G0_0_1_0_5_2 + 0.00350649350649362*G0_0_1_0_5_3 + 0.0011688311688312*G0_0_1_0_5_4 + 0.000803571428571458*G0_0_1_1_0_0 + 0.000511363636363654*G0_0_1_1_0_1 - 0.00124188311688316*G0_0_1_1_0_2 - 0.00292207792207801*G0_0_1_1_0_3 - 0.00146103896103901*G0_0_1_1_0_4 + 0.000292207792207814*G0_0_1_1_0_5 + 0.000511363636363654*G0_0_1_1_1_0 + 0.0021915584415585*G0_0_1_1_1_1 - 0.00255681818181827*G0_0_1_1_1_2 - 0.00409090909090924*G0_0_1_1_1_3 - 0.00233766233766242*G0_0_1_1_1_4 - 0.00175324675324683*G0_0_1_1_1_5 - 0.00124188311688316*G0_0_1_1_2_0 - 0.00255681818181827*G0_0_1_1_2_1 + 0.00942370129870163*G0_0_1_1_2_2 + 0.0113961038961043*G0_0_1_1_2_3 + 0.00409090909090923*G0_0_1_1_2_4 + 0.000584415584415607*G0_0_1_1_2_5 - 0.00292207792207801*G0_0_1_1_3_0 - 0.00409090909090924*G0_0_1_1_3_1 + 0.0113961038961043*G0_0_1_1_3_2 + 0.0350649350649363*G0_0_1_1_3_3 + 0.0105194805194809*G0_0_1_1_3_4 + 0.00467532467532484*G0_0_1_1_3_5 - 0.00146103896103901*G0_0_1_1_4_0 - 0.00233766233766242*G0_0_1_1_4_1 + 0.00409090909090923*G0_0_1_1_4_2 + 0.0105194805194809*G0_0_1_1_4_3 + 0.00818181818181846*G0_0_1_1_4_4 + 0.00350649350649363*G0_0_1_1_4_5 + 0.000292207792207814*G0_0_1_1_5_0 - 0.00175324675324683*G0_0_1_1_5_1 + 0.000584415584415607*G0_0_1_1_5_2 + 0.00467532467532484*G0_0_1_1_5_3 + 0.00350649350649363*G0_0_1_1_5_4 + 0.00233766233766241*G0_0_1_1_5_5 - 0.000657467532467552*G0_0_1_2_0_0 - 0.00124188311688316*G0_0_1_2_0_1 + 0.00504058441558459*G0_0_1_2_0_2 + 0.00525974025974043*G0_0_1_2_0_3 + 0.00438311688311704*G0_0_1_2_0_4 + 0.00087662337662341*G0_0_1_2_0_5 - 0.00124188311688316*G0_0_1_2_1_0 - 0.00255681818181827*G0_0_1_2_1_1 + 0.00942370129870163*G0_0_1_2_1_2 + 0.0113961038961043*G0_0_1_2_1_3 + 0.00409090909090923*G0_0_1_2_1_4 + 0.000584415584415607*G0_0_1_2_1_5 + 0.00504058441558459*G0_0_1_2_2_0 + 0.00942370129870163*G0_0_1_2_2_1 - 0.0591720779220802*G0_0_1_2_2_2 - 0.0438311688311704*G0_0_1_2_2_3 - 0.0204545454545462*G0_0_1_2_2_4 - 0.00350649350649364*G0_0_1_2_2_5 + 0.00525974025974043*G0_0_1_2_3_0 + 0.0113961038961043*G0_0_1_2_3_1 - 0.0438311688311704*G0_0_1_2_3_2 - 0.0631168831168853*G0_0_1_2_3_3 - 0.0187012987012994*G0_0_1_2_3_4 - 0.00350649350649364*G0_0_1_2_3_5 + 0.00438311688311704*G0_0_1_2_4_0 + 0.00409090909090923*G0_0_1_2_4_1 - 0.0204545454545462*G0_0_1_2_4_2 - 0.0187012987012994*G0_0_1_2_4_3 - 0.016363636363637*G0_0_1_2_4_4 - 0.00116883116883121*G0_0_1_2_4_5 + 0.00087662337662341*G0_0_1_2_5_0 + 0.000584415584415607*G0_0_1_2_5_1 - 0.00350649350649364*G0_0_1_2_5_2 - 0.00350649350649364*G0_0_1_2_5_3 - 0.00116883116883121*G0_0_1_2_5_4 + 0.00350649350649364*G0_0_1_2_5_5 - 0.00262987012987021*G0_0_1_3_0_0 - 0.00292207792207801*G0_0_1_3_0_1 + 0.00525974025974043*G0_0_1_3_0_2 + 0.0175324675324681*G0_0_1_3_0_3 + 0.00818181818181844*G0_0_1_3_0_4 + 0.00350649350649362*G0_0_1_3_0_5 - 0.00292207792207801*G0_0_1_3_1_0 - 0.00409090909090924*G0_0_1_3_1_1 + 0.0113961038961043*G0_0_1_3_1_2 + 0.0350649350649363*G0_0_1_3_1_3 + 0.0105194805194809*G0_0_1_3_1_4 + 0.00467532467532484*G0_0_1_3_1_5 + 0.00525974025974043*G0_0_1_3_2_0 + 0.0113961038961043*G0_0_1_3_2_1 - 0.0438311688311704*G0_0_1_3_2_2 - 0.0631168831168853*G0_0_1_3_2_3 - 0.0187012987012994*G0_0_1_3_2_4 - 0.00350649350649364*G0_0_1_3_2_5 + 0.0175324675324681*G0_0_1_3_3_0 + 0.0350649350649363*G0_0_1_3_3_1 - 0.0631168831168853*G0_0_1_3_3_2 - 0.252467532467541*G0_0_1_3_3_3 - 0.056103896103898*G0_0_1_3_3_4 - 0.028051948051949*G0_0_1_3_3_5 + 0.00818181818181844*G0_0_1_3_4_0 + 0.0105194805194809*G0_0_1_3_4_1 - 0.0187012987012994*G0_0_1_3_4_2 - 0.056103896103898*G0_0_1_3_4_3 - 0.0327272727272738*G0_0_1_3_4_4 - 0.0140259740259745*G0_0_1_3_4_5 + 0.00350649350649362*G0_0_1_3_5_0 + 0.00467532467532484*G0_0_1_3_5_1 - 0.00350649350649364*G0_0_1_3_5_2 - 0.028051948051949*G0_0_1_3_5_3 - 0.0140259740259745*G0_0_1_3_5_4 - 0.0140259740259745*G0_0_1_3_5_5 - 0.00321428571428583*G0_0_1_4_0_0 - 0.00146103896103901*G0_0_1_4_0_1 + 0.00438311688311704*G0_0_1_4_0_2 + 0.00818181818181844*G0_0_1_4_0_3 + 0.00701298701298724*G0_0_1_4_0_4 + 0.0011688311688312*G0_0_1_4_0_5 - 0.00146103896103901*G0_0_1_4_1_0 - 0.00233766233766242*G0_0_1_4_1_1 + 0.00409090909090923*G0_0_1_4_1_2 + 0.0105194805194809*G0_0_1_4_1_3 + 0.00818181818181846*G0_0_1_4_1_4 + 0.00350649350649363*G0_0_1_4_1_5 + 0.00438311688311704*G0_0_1_4_2_0 + 0.00409090909090923*G0_0_1_4_2_1 - 0.0204545454545462*G0_0_1_4_2_2 - 0.0187012987012994*G0_0_1_4_2_3 - 0.016363636363637*G0_0_1_4_2_4 - 0.00116883116883121*G0_0_1_4_2_5 + 0.00818181818181844*G0_0_1_4_3_0 + 0.0105194805194809*G0_0_1_4_3_1 - 0.0187012987012994*G0_0_1_4_3_2 - 0.056103896103898*G0_0_1_4_3_3 - 0.0327272727272738*G0_0_1_4_3_4 - 0.0140259740259745*G0_0_1_4_3_5 + 0.00701298701298724*G0_0_1_4_4_0 + 0.00818181818181846*G0_0_1_4_4_1 - 0.016363636363637*G0_0_1_4_4_2 - 0.0327272727272738*G0_0_1_4_4_3 - 0.0420779220779235*G0_0_1_4_4_4 - 0.0140259740259745*G0_0_1_4_4_5 + 0.0011688311688312*G0_0_1_4_5_0 + 0.00350649350649363*G0_0_1_4_5_1 - 0.00116883116883121*G0_0_1_4_5_2 - 0.0140259740259745*G0_0_1_4_5_3 - 0.0140259740259745*G0_0_1_4_5_4 - 0.0140259740259745*G0_0_1_4_5_5 - 0.00262987012987024*G0_0_1_5_0_0 + 0.000292207792207814*G0_0_1_5_0_1 + 0.00087662337662341*G0_0_1_5_0_2 + 0.00350649350649362*G0_0_1_5_0_3 + 0.0011688311688312*G0_0_1_5_0_4 + 0.000292207792207814*G0_0_1_5_1_0 - 0.00175324675324683*G0_0_1_5_1_1 + 0.000584415584415607*G0_0_1_5_1_2 + 0.00467532467532484*G0_0_1_5_1_3 + 0.00350649350649363*G0_0_1_5_1_4 + 0.00233766233766241*G0_0_1_5_1_5 + 0.00087662337662341*G0_0_1_5_2_0 + 0.000584415584415607*G0_0_1_5_2_1 - 0.00350649350649364*G0_0_1_5_2_2 - 0.00350649350649364*G0_0_1_5_2_3 - 0.00116883116883121*G0_0_1_5_2_4 + 0.00350649350649364*G0_0_1_5_2_5 + 0.00350649350649362*G0_0_1_5_3_0 + 0.00467532467532484*G0_0_1_5_3_1 - 0.00350649350649364*G0_0_1_5_3_2 - 0.028051948051949*G0_0_1_5_3_3 - 0.0140259740259745*G0_0_1_5_3_4 - 0.0140259740259745*G0_0_1_5_3_5 + 0.0011688311688312*G0_0_1_5_4_0 + 0.00350649350649363*G0_0_1_5_4_1 - 0.00116883116883121*G0_0_1_5_4_2 - 0.0140259740259745*G0_0_1_5_4_3 - 0.0140259740259745*G0_0_1_5_4_4 - 0.0140259740259745*G0_0_1_5_4_5 + 0.00233766233766241*G0_0_1_5_5_1 + 0.00350649350649364*G0_0_1_5_5_2 - 0.0140259740259745*G0_0_1_5_5_3 - 0.0140259740259745*G0_0_1_5_5_4 - 0.0420779220779239*G0_0_1_5_5_5 - 0.0882832792207822*G0_1_0_0_0_0 + 0.00530844155844172*G0_1_0_0_0_1 + 0.00149756493506498*G0_1_0_0_0_2 - 0.0018506493506494*G0_1_0_0_0_3 - 0.0111525974025978*G0_1_0_0_0_4 - 0.0212337662337669*G0_1_0_0_0_5 + 0.00530844155844172*G0_1_0_0_1_0 - 0.000389610389610402*G0_1_0_0_1_1 - 0.00135146103896108*G0_1_0_0_1_2 - 0.00175324675324681*G0_1_0_0_1_3 - 0.000487012987013006*G0_1_0_0_1_4 + 0.000681818181818199*G0_1_0_0_1_5 + 0.00149756493506498*G0_1_0_0_2_0 - 0.00135146103896108*G0_1_0_0_2_1 + 0.0145008116883122*G0_1_0_0_2_2 + 0.00530844155844173*G0_1_0_0_2_3 + 0.00467532467532484*G0_1_0_0_2_4 + 0.000681818181818207*G0_1_0_0_2_5 - 0.0018506493506494*G0_1_0_0_3_0 - 0.00175324675324681*G0_1_0_0_3_1 + 0.00530844155844173*G0_1_0_0_3_2 + 0.00896103896103923*G0_1_0_0_3_3 + 0.00467532467532483*G0_1_0_0_3_4 + 0.00233766233766242*G0_1_0_0_3_5 - 0.0111525974025978*G0_1_0_0_4_0 - 0.000487012987013006*G0_1_0_0_4_1 + 0.00467532467532484*G0_1_0_0_4_2 + 0.00467532467532483*G0_1_0_0_4_3 + 0.0107142857142861*G0_1_0_0_4_4 - 0.000389610389610397*G0_1_0_0_4_5 - 0.0212337662337669*G0_1_0_0_5_0 + 0.000681818181818199*G0_1_0_0_5_1 + 0.000681818181818208*G0_1_0_0_5_2 + 0.00233766233766242*G0_1_0_0_5_3 - 0.000389610389610398*G0_1_0_0_5_4 - 0.00779220779220802*G0_1_0_0_5_5 + 0.00530844155844172*G0_1_0_1_0_0 - 0.000389610389610402*G0_1_0_1_0_1 - 0.00135146103896108*G0_1_0_1_0_2 - 0.00175324675324681*G0_1_0_1_0_3 - 0.000487012987013006*G0_1_0_1_0_4 + 0.000681818181818199*G0_1_0_1_0_5 - 0.000389610389610402*G0_1_0_1_1_0 + 0.00284902597402607*G0_1_0_1_1_1 - 0.00304383116883127*G0_1_0_1_1_2 - 0.00233766233766242*G0_1_0_1_1_3 - 0.00116883116883121*G0_1_0_1_1_4 + 0.000876623376623412*G0_1_0_1_1_5 - 0.00135146103896108*G0_1_0_1_2_0 - 0.00304383116883127*G0_1_0_1_2_1 + 0.018652597402598*G0_1_0_1_2_2 + 0.0127597402597407*G0_1_0_1_2_3 + 0.00472402597402614*G0_1_0_1_2_4 - 0.00175324675324681*G0_1_0_1_3_0 - 0.00233766233766242*G0_1_0_1_3_1 + 0.0127597402597407*G0_1_0_1_3_2 + 0.0237662337662346*G0_1_0_1_3_3 + 0.00584415584415604*G0_1_0_1_3_4 + 0.00350649350649363*G0_1_0_1_3_5 - 0.000487012987013006*G0_1_0_1_4_0 - 0.00116883116883121*G0_1_0_1_4_1 + 0.00472402597402614*G0_1_0_1_4_2 + 0.00584415584415604*G0_1_0_1_4_3 + 0.00233766233766241*G0_1_0_1_4_5 + 0.000681818181818199*G0_1_0_1_5_0 + 0.000876623376623412*G0_1_0_1_5_1 + 0.00350649350649363*G0_1_0_1_5_3 + 0.00233766233766241*G0_1_0_1_5_4 + 0.00545454545454564*G0_1_0_1_5_5 + 0.00149756493506498*G0_1_0_2_0_0 - 0.00135146103896108*G0_1_0_2_0_1 + 0.0145008116883122*G0_1_0_2_0_2 + 0.00530844155844173*G0_1_0_2_0_3 + 0.00467532467532484*G0_1_0_2_0_4 + 0.000681818181818207*G0_1_0_2_0_5 - 0.00135146103896108*G0_1_0_2_1_0 - 0.00304383116883127*G0_1_0_2_1_1 + 0.018652597402598*G0_1_0_2_1_2 + 0.0127597402597407*G0_1_0_2_1_3 + 0.00472402597402614*G0_1_0_2_1_4 + 0.0145008116883122*G0_1_0_2_2_0 + 0.018652597402598*G0_1_0_2_2_1 - 0.254038149350658*G0_1_0_2_2_2 - 0.0820616883116912*G0_1_0_2_2_3 - 0.0579545454545475*G0_1_0_2_2_4 - 0.00472402597402618*G0_1_0_2_2_5 + 0.00530844155844173*G0_1_0_2_3_0 + 0.0127597402597407*G0_1_0_2_3_1 - 0.0820616883116912*G0_1_0_2_3_2 - 0.0658441558441582*G0_1_0_2_3_3 - 0.0200649350649358*G0_1_0_2_3_4 - 0.00116883116883123*G0_1_0_2_3_5 + 0.00467532467532484*G0_1_0_2_4_0 + 0.00472402597402614*G0_1_0_2_4_1 - 0.0579545454545475*G0_1_0_2_4_2 - 0.0200649350649358*G0_1_0_2_4_3 - 0.0294155844155855*G0_1_0_2_4_4 + 0.000681818181818207*G0_1_0_2_5_0 - 0.00472402597402618*G0_1_0_2_5_2 - 0.00116883116883123*G0_1_0_2_5_3 + 0.000389610389610396*G0_1_0_2_5_5 - 0.0018506493506494*G0_1_0_3_0_0 - 0.00175324675324681*G0_1_0_3_0_1 + 0.00530844155844173*G0_1_0_3_0_2 + 0.00896103896103923*G0_1_0_3_0_3 + 0.00467532467532483*G0_1_0_3_0_4 + 0.00233766233766242*G0_1_0_3_0_5 - 0.00175324675324681*G0_1_0_3_1_0 - 0.00233766233766242*G0_1_0_3_1_1 + 0.0127597402597407*G0_1_0_3_1_2 + 0.0237662337662346*G0_1_0_3_1_3 + 0.00584415584415604*G0_1_0_3_1_4 + 0.00350649350649363*G0_1_0_3_1_5 + 0.00530844155844173*G0_1_0_3_2_0 + 0.0127597402597407*G0_1_0_3_2_1 - 0.0820616883116912*G0_1_0_3_2_2 - 0.0658441558441582*G0_1_0_3_2_3 - 0.0200649350649358*G0_1_0_3_2_4 - 0.00116883116883123*G0_1_0_3_2_5 + 0.00896103896103923*G0_1_0_3_3_0 + 0.0237662337662346*G0_1_0_3_3_1 - 0.0658441558441582*G0_1_0_3_3_2 - 0.140259740259745*G0_1_0_3_3_3 - 0.0296103896103906*G0_1_0_3_3_4 - 0.0155844155844161*G0_1_0_3_3_5 + 0.00467532467532483*G0_1_0_3_4_0 + 0.00584415584415604*G0_1_0_3_4_1 - 0.0200649350649358*G0_1_0_3_4_2 - 0.0296103896103906*G0_1_0_3_4_3 - 0.0093506493506497*G0_1_0_3_4_4 - 0.00935064935064966*G0_1_0_3_4_5 + 0.00233766233766242*G0_1_0_3_5_0 + 0.00350649350649363*G0_1_0_3_5_1 - 0.00116883116883123*G0_1_0_3_5_2 - 0.0155844155844161*G0_1_0_3_5_3 - 0.00935064935064966*G0_1_0_3_5_4 - 0.00545454545454563*G0_1_0_3_5_5 - 0.0111525974025978*G0_1_0_4_0_0 - 0.000487012987013006*G0_1_0_4_0_1 + 0.00467532467532484*G0_1_0_4_0_2 + 0.00467532467532483*G0_1_0_4_0_3 + 0.0107142857142861*G0_1_0_4_0_4 - 0.000389610389610397*G0_1_0_4_0_5 - 0.000487012987013006*G0_1_0_4_1_0 - 0.00116883116883121*G0_1_0_4_1_1 + 0.00472402597402614*G0_1_0_4_1_2 + 0.00584415584415604*G0_1_0_4_1_3 + 0.00233766233766241*G0_1_0_4_1_5 + 0.00467532467532484*G0_1_0_4_2_0 + 0.00472402597402614*G0_1_0_4_2_1 - 0.0579545454545475*G0_1_0_4_2_2 - 0.0200649350649358*G0_1_0_4_2_3 - 0.0294155844155855*G0_1_0_4_2_4 + 0.00467532467532483*G0_1_0_4_3_0 + 0.00584415584415604*G0_1_0_4_3_1 - 0.0200649350649358*G0_1_0_4_3_2 - 0.0296103896103906*G0_1_0_4_3_3 - 0.0093506493506497*G0_1_0_4_3_4 - 0.00935064935064966*G0_1_0_4_3_5 + 0.0107142857142861*G0_1_0_4_4_0 - 0.0294155844155855*G0_1_0_4_4_2 - 0.0093506493506497*G0_1_0_4_4_3 + 0.105194805194808*G0_1_0_4_4_4 - 0.000389610389610397*G0_1_0_4_5_0 + 0.00233766233766241*G0_1_0_4_5_1 - 0.00935064935064966*G0_1_0_4_5_3 - 0.00545454545454563*G0_1_0_4_5_5 - 0.0212337662337669*G0_1_0_5_0_0 + 0.000681818181818199*G0_1_0_5_0_1 + 0.000681818181818207*G0_1_0_5_0_2 + 0.00233766233766242*G0_1_0_5_0_3 - 0.000389610389610397*G0_1_0_5_0_4 - 0.00779220779220802*G0_1_0_5_0_5 + 0.000681818181818199*G0_1_0_5_1_0 + 0.000876623376623412*G0_1_0_5_1_1 + 0.00350649350649363*G0_1_0_5_1_3 + 0.00233766233766241*G0_1_0_5_1_4 + 0.00545454545454564*G0_1_0_5_1_5 + 0.000681818181818207*G0_1_0_5_2_0 - 0.00472402597402618*G0_1_0_5_2_2 - 0.00116883116883123*G0_1_0_5_2_3 + 0.000389610389610396*G0_1_0_5_2_5 + 0.00233766233766242*G0_1_0_5_3_0 + 0.00350649350649363*G0_1_0_5_3_1 - 0.00116883116883123*G0_1_0_5_3_2 - 0.0155844155844161*G0_1_0_5_3_3 - 0.00935064935064966*G0_1_0_5_3_4 - 0.00545454545454563*G0_1_0_5_3_5 - 0.000389610389610397*G0_1_0_5_4_0 + 0.00233766233766241*G0_1_0_5_4_1 - 0.00935064935064966*G0_1_0_5_4_3 - 0.00545454545454563*G0_1_0_5_4_5 - 0.00779220779220802*G0_1_0_5_5_0 + 0.00545454545454564*G0_1_0_5_5_1 + 0.000389610389610396*G0_1_0_5_5_2 - 0.00545454545454563*G0_1_0_5_5_3 - 0.00545454545454563*G0_1_0_5_5_4 + 0.0771428571428599*G0_1_0_5_5_5 + 0.0249837662337672*G0_1_1_0_0_0 - 0.00379870129870144*G0_1_1_0_0_1 - 0.00175324675324682*G0_1_1_0_0_2 + 0.000876623376623406*G0_1_1_0_0_3 + 0.00438311688311704*G0_1_1_0_0_4 + 0.0219155844155852*G0_1_1_0_0_5 - 0.00379870129870144*G0_1_1_0_1_0 + 0.000365259740259755*G0_1_1_0_1_1 - 0.0002922077922078*G0_1_1_0_1_2 - 0.00146103896103901*G0_1_1_0_1_3 - 0.000876623376623406*G0_1_1_0_1_4 - 0.00759740259740287*G0_1_1_0_1_5 - 0.00175324675324682*G0_1_1_0_2_0 - 0.0002922077922078*G0_1_1_0_2_1 + 0.00328733766233778*G0_1_1_0_2_2 + 0.00350649350649362*G0_1_1_0_2_3 + 0.00175324675324682*G0_1_1_0_2_4 - 0.000876623376623411*G0_1_1_0_2_5 + 0.000876623376623406*G0_1_1_0_3_0 - 0.00146103896103901*G0_1_1_0_3_1 + 0.00350649350649362*G0_1_1_0_3_2 + 0.0035064935064936*G0_1_1_0_3_3 + 0.00438311688311704*G0_1_1_0_4_0 - 0.000876623376623407*G0_1_1_0_4_1 + 0.00175324675324681*G0_1_1_0_4_2 - 0.00233766233766241*G0_1_1_0_4_4 + 0.00350649350649364*G0_1_1_0_4_5 + 0.0219155844155852*G0_1_1_0_5_0 - 0.00759740259740287*G0_1_1_0_5_1 - 0.000876623376623411*G0_1_1_0_5_2 + 0.00350649350649364*G0_1_1_0_5_4 + 0.0280519480519491*G0_1_1_0_5_5 - 0.00379870129870144*G0_1_1_1_0_0 + 0.000365259740259755*G0_1_1_1_0_1 - 0.0002922077922078*G0_1_1_1_0_2 - 0.00146103896103901*G0_1_1_1_0_3 - 0.000876623376623406*G0_1_1_1_0_4 - 0.00759740259740287*G0_1_1_1_0_5 + 0.000365259740259755*G0_1_1_1_1_0 + 0.00438311688311703*G0_1_1_1_1_1 - 0.00226461038961047*G0_1_1_1_1_2 - 0.000584415584415602*G0_1_1_1_1_3 - 0.000292207792207804*G0_1_1_1_1_4 + 0.00642857142857165*G0_1_1_1_1_5 - 0.0002922077922078*G0_1_1_1_2_0 - 0.00226461038961047*G0_1_1_1_2_1 + 0.00759740259740286*G0_1_1_1_2_2 + 0.00818181818181846*G0_1_1_1_2_3 + 0.00175324675324681*G0_1_1_1_2_4 + 0.000292207792207803*G0_1_1_1_2_5 - 0.00146103896103901*G0_1_1_1_3_0 - 0.000584415584415601*G0_1_1_1_3_1 + 0.00818181818181846*G0_1_1_1_3_2 + 0.0233766233766242*G0_1_1_1_3_3 + 0.00350649350649363*G0_1_1_1_3_4 + 0.00233766233766243*G0_1_1_1_3_5 - 0.000876623376623406*G0_1_1_1_4_0 - 0.000292207792207804*G0_1_1_1_4_1 + 0.00175324675324681*G0_1_1_1_4_2 + 0.00350649350649363*G0_1_1_1_4_3 + 0.00233766233766243*G0_1_1_1_4_4 - 0.00759740259740287*G0_1_1_1_5_0 + 0.00642857142857165*G0_1_1_1_5_1 + 0.000292207792207803*G0_1_1_1_5_2 + 0.00233766233766243*G0_1_1_1_5_3 - 0.00467532467532484*G0_1_1_1_5_5 - 0.00175324675324682*G0_1_1_2_0_0 - 0.0002922077922078*G0_1_1_2_0_1 + 0.00328733766233778*G0_1_1_2_0_2 + 0.00350649350649362*G0_1_1_2_0_3 + 0.00175324675324682*G0_1_1_2_0_4 - 0.000876623376623412*G0_1_1_2_0_5 - 0.0002922077922078*G0_1_1_2_1_0 - 0.00226461038961047*G0_1_1_2_1_1 + 0.00759740259740287*G0_1_1_2_1_2 + 0.00818181818181846*G0_1_1_2_1_3 + 0.00175324675324681*G0_1_1_2_1_4 + 0.000292207792207803*G0_1_1_2_1_5 + 0.00328733766233778*G0_1_1_2_2_0 + 0.00759740259740287*G0_1_1_2_2_1 - 0.0493100649350668*G0_1_1_2_2_2 - 0.0350649350649363*G0_1_1_2_2_3 - 0.0131493506493511*G0_1_1_2_2_4 - 0.00175324675324683*G0_1_1_2_2_5 + 0.00350649350649362*G0_1_1_2_3_0 + 0.00818181818181846*G0_1_1_2_3_1 - 0.0350649350649363*G0_1_1_2_3_2 - 0.0525974025974044*G0_1_1_2_3_3 - 0.0105194805194809*G0_1_1_2_3_4 - 0.00350649350649364*G0_1_1_2_3_5 + 0.00175324675324682*G0_1_1_2_4_0 + 0.00175324675324681*G0_1_1_2_4_1 - 0.0131493506493511*G0_1_1_2_4_2 - 0.0105194805194809*G0_1_1_2_4_3 - 0.00233766233766243*G0_1_1_2_4_4 - 0.000876623376623411*G0_1_1_2_5_0 + 0.000292207792207803*G0_1_1_2_5_1 - 0.00175324675324683*G0_1_1_2_5_2 - 0.00350649350649364*G0_1_1_2_5_3 - 0.00701298701298725*G0_1_1_2_5_5 + 0.000876623376623406*G0_1_1_3_0_0 - 0.00146103896103901*G0_1_1_3_0_1 + 0.00350649350649362*G0_1_1_3_0_2 + 0.0035064935064936*G0_1_1_3_0_3 - 0.00146103896103901*G0_1_1_3_1_0 - 0.000584415584415602*G0_1_1_3_1_1 + 0.00818181818181846*G0_1_1_3_1_2 + 0.0233766233766242*G0_1_1_3_1_3 + 0.00350649350649363*G0_1_1_3_1_4 + 0.00233766233766243*G0_1_1_3_1_5 + 0.00350649350649362*G0_1_1_3_2_0 + 0.00818181818181846*G0_1_1_3_2_1 - 0.0350649350649363*G0_1_1_3_2_2 - 0.0525974025974044*G0_1_1_3_2_3 - 0.0105194805194809*G0_1_1_3_2_4 - 0.00350649350649364*G0_1_1_3_2_5 + 0.0035064935064936*G0_1_1_3_3_0 + 0.0233766233766242*G0_1_1_3_3_1 - 0.0525974025974044*G0_1_1_3_3_2 - 0.140259740259745*G0_1_1_3_3_3 - 0.0140259740259745*G0_1_1_3_3_4 + 0.00350649350649363*G0_1_1_3_4_1 - 0.0105194805194809*G0_1_1_3_4_2 - 0.0140259740259745*G0_1_1_3_4_3 - 0.00467532467532486*G0_1_1_3_4_4 + 0.00233766233766243*G0_1_1_3_5_1 - 0.00350649350649364*G0_1_1_3_5_2 + 0.0140259740259745*G0_1_1_3_5_5 + 0.00438311688311704*G0_1_1_4_0_0 - 0.000876623376623406*G0_1_1_4_0_1 + 0.00175324675324682*G0_1_1_4_0_2 - 0.00233766233766241*G0_1_1_4_0_4 + 0.00350649350649364*G0_1_1_4_0_5 - 0.000876623376623406*G0_1_1_4_1_0 - 0.000292207792207804*G0_1_1_4_1_1 + 0.00175324675324681*G0_1_1_4_1_2 + 0.00350649350649363*G0_1_1_4_1_3 + 0.00233766233766243*G0_1_1_4_1_4 + 0.00175324675324682*G0_1_1_4_2_0 + 0.00175324675324681*G0_1_1_4_2_1 - 0.0131493506493511*G0_1_1_4_2_2 - 0.0105194805194809*G0_1_1_4_2_3 - 0.00233766233766243*G0_1_1_4_2_4 + 0.00350649350649363*G0_1_1_4_3_1 - 0.0105194805194809*G0_1_1_4_3_2 - 0.0140259740259745*G0_1_1_4_3_3 - 0.00467532467532486*G0_1_1_4_3_4 - 0.00233766233766241*G0_1_1_4_4_0 + 0.00233766233766243*G0_1_1_4_4_1 - 0.00233766233766243*G0_1_1_4_4_2 - 0.00467532467532486*G0_1_1_4_4_3 - 0.0140259740259746*G0_1_1_4_4_4 - 0.00467532467532487*G0_1_1_4_4_5 + 0.00350649350649364*G0_1_1_4_5_0 - 0.00467532467532487*G0_1_1_4_5_4 + 0.0140259740259745*G0_1_1_4_5_5 + 0.0219155844155852*G0_1_1_5_0_0 - 0.00759740259740287*G0_1_1_5_0_1 - 0.000876623376623411*G0_1_1_5_0_2 + 0.00350649350649364*G0_1_1_5_0_4 + 0.0280519480519491*G0_1_1_5_0_5 - 0.00759740259740287*G0_1_1_5_1_0 + 0.00642857142857165*G0_1_1_5_1_1 + 0.000292207792207803*G0_1_1_5_1_2 + 0.00233766233766243*G0_1_1_5_1_3 - 0.00467532467532484*G0_1_1_5_1_5 - 0.000876623376623411*G0_1_1_5_2_0 + 0.000292207792207803*G0_1_1_5_2_1 - 0.00175324675324683*G0_1_1_5_2_2 - 0.00350649350649364*G0_1_1_5_2_3 - 0.00701298701298725*G0_1_1_5_2_5 + 0.00233766233766243*G0_1_1_5_3_1 - 0.00350649350649364*G0_1_1_5_3_2 + 0.0140259740259745*G0_1_1_5_3_5 + 0.00350649350649364*G0_1_1_5_4_0 - 0.00467532467532487*G0_1_1_5_4_4 + 0.0140259740259745*G0_1_1_5_4_5 + 0.0280519480519491*G0_1_1_5_5_0 - 0.00467532467532484*G0_1_1_5_5_1 - 0.00701298701298726*G0_1_1_5_5_2 + 0.0140259740259745*G0_1_1_5_5_3 + 0.0140259740259745*G0_1_1_5_5_4 + 0.238441558441567*G0_1_1_5_5_5; + A[74] = -A[76] - 0.0955154220779255*G0_0_1_0_0_0 + 0.00631899350649372*G0_0_1_0_0_1 + 0.00340909090909103*G0_0_1_0_0_2 - 0.0019967532467533*G0_0_1_0_0_3 - 0.0129058441558446*G0_0_1_0_0_4 - 0.0238636363636372*G0_0_1_0_0_5 + 0.00631899350649372*G0_0_1_0_1_0 + 0.000474837662337676*G0_0_1_0_1_1 + 0.000109577922077925*G0_0_1_0_1_2 - 0.00170454545454551*G0_0_1_0_1_3 - 0.0012175324675325*G0_0_1_0_1_4 - 0.00116883116883121*G0_0_1_0_1_5 + 0.00340909090909103*G0_0_1_0_2_0 + 0.000109577922077925*G0_0_1_0_2_1 + 0.00012175324675325*G0_0_1_0_2_2 - 0.000730519480519504*G0_0_1_0_2_3 - 0.00194805194805201*G0_0_1_0_2_4 + 0.000243506493506504*G0_0_1_0_2_5 - 0.0019967532467533*G0_0_1_0_3_0 - 0.00170454545454551*G0_0_1_0_3_1 - 0.000730519480519504*G0_0_1_0_3_2 + 0.00253246753246761*G0_0_1_0_3_3 + 0.00642857142857163*G0_0_1_0_3_4 + 0.00350649350649362*G0_0_1_0_3_5 - 0.0129058441558446*G0_0_1_0_4_0 - 0.0012175324675325*G0_0_1_0_4_1 - 0.00194805194805201*G0_0_1_0_4_2 + 0.00642857142857163*G0_0_1_0_4_3 + 0.0173376623376629*G0_0_1_0_4_4 + 0.001948051948052*G0_0_1_0_4_5 - 0.0238636363636372*G0_0_1_0_5_0 - 0.00116883116883121*G0_0_1_0_5_1 + 0.000243506493506505*G0_0_1_0_5_2 + 0.00350649350649362*G0_0_1_0_5_3 + 0.001948051948052*G0_0_1_0_5_4 - 0.0144155844155849*G0_0_1_0_5_5 + 0.00631899350649372*G0_0_1_1_0_0 + 0.000474837662337676*G0_0_1_1_0_1 + 0.000109577922077925*G0_0_1_1_0_2 - 0.00170454545454551*G0_0_1_1_0_3 - 0.0012175324675325*G0_0_1_1_0_4 - 0.00116883116883121*G0_0_1_1_0_5 + 0.000474837662337676*G0_0_1_1_1_0 - 0.0361972402597415*G0_0_1_1_1_1 + 0.00104707792207795*G0_0_1_1_1_2 - 0.0034577922077923*G0_0_1_1_1_3 - 0.0015097402597403*G0_0_1_1_1_4 - 0.00214285714285723*G0_0_1_1_1_5 + 0.000109577922077925*G0_0_1_1_2_0 + 0.00104707792207795*G0_0_1_1_2_1 + 0.000608766233766255*G0_0_1_1_2_2 - 0.00243506493506502*G0_0_1_1_2_3 - 0.000730519480519505*G0_0_1_1_2_4 - 0.00141233766233771*G0_0_1_1_2_5 - 0.00170454545454551*G0_0_1_1_3_0 - 0.0034577922077923*G0_0_1_1_3_1 - 0.00243506493506502*G0_0_1_1_3_2 + 0.0142207792207797*G0_0_1_1_3_3 + 0.00642857142857164*G0_0_1_1_3_4 + 0.00623376623376644*G0_0_1_1_3_5 - 0.0012175324675325*G0_0_1_1_4_0 - 0.0015097402597403*G0_0_1_1_4_1 - 0.000730519480519505*G0_0_1_1_4_2 + 0.00642857142857164*G0_0_1_1_4_3 + 0.00564935064935083*G0_0_1_1_4_4 + 0.00584415584415603*G0_0_1_1_4_5 - 0.00116883116883121*G0_0_1_1_5_0 - 0.00214285714285723*G0_0_1_1_5_1 - 0.00141233766233771*G0_0_1_1_5_2 + 0.00623376623376644*G0_0_1_1_5_3 + 0.00584415584415603*G0_0_1_1_5_4 + 0.0167532467532473*G0_0_1_1_5_5 + 0.00340909090909103*G0_0_1_2_0_0 + 0.000109577922077925*G0_0_1_2_0_1 + 0.00012175324675325*G0_0_1_2_0_2 - 0.000730519480519504*G0_0_1_2_0_3 - 0.00194805194805201*G0_0_1_2_0_4 + 0.000243506493506505*G0_0_1_2_0_5 + 0.000109577922077925*G0_0_1_2_1_0 + 0.00104707792207795*G0_0_1_2_1_1 + 0.000608766233766255*G0_0_1_2_1_2 - 0.00243506493506502*G0_0_1_2_1_3 - 0.000730519480519505*G0_0_1_2_1_4 - 0.00141233766233771*G0_0_1_2_1_5 + 0.00012175324675325*G0_0_1_2_2_0 + 0.000608766233766255*G0_0_1_2_2_1 - 0.000730519480519501*G0_0_1_2_2_3 + 0.000730519480519504*G0_0_1_2_2_4 - 0.000730519480519504*G0_0_1_2_2_5 - 0.000730519480519504*G0_0_1_2_3_0 - 0.00243506493506502*G0_0_1_2_3_1 - 0.0007305194805195*G0_0_1_2_3_2 - 0.00194805194805203*G0_0_1_2_3_3 + 0.00292207792207802*G0_0_1_2_3_4 + 0.00292207792207801*G0_0_1_2_3_5 - 0.00194805194805201*G0_0_1_2_4_0 - 0.000730519480519505*G0_0_1_2_4_1 + 0.000730519480519504*G0_0_1_2_4_2 + 0.00292207792207802*G0_0_1_2_4_3 - 0.00389610389610401*G0_0_1_2_4_4 + 0.00292207792207802*G0_0_1_2_4_5 + 0.000243506493506505*G0_0_1_2_5_0 - 0.00141233766233771*G0_0_1_2_5_1 - 0.000730519480519504*G0_0_1_2_5_2 + 0.00292207792207801*G0_0_1_2_5_3 + 0.00292207792207802*G0_0_1_2_5_4 - 0.00233766233766243*G0_0_1_2_5_5 - 0.0019967532467533*G0_0_1_3_0_0 - 0.00170454545454551*G0_0_1_3_0_1 - 0.000730519480519504*G0_0_1_3_0_2 + 0.00253246753246761*G0_0_1_3_0_3 + 0.00642857142857163*G0_0_1_3_0_4 + 0.00350649350649362*G0_0_1_3_0_5 - 0.00170454545454551*G0_0_1_3_1_0 - 0.0034577922077923*G0_0_1_3_1_1 - 0.00243506493506502*G0_0_1_3_1_2 + 0.0142207792207797*G0_0_1_3_1_3 + 0.00642857142857164*G0_0_1_3_1_4 + 0.00623376623376644*G0_0_1_3_1_5 - 0.000730519480519504*G0_0_1_3_2_0 - 0.00243506493506502*G0_0_1_3_2_1 - 0.0007305194805195*G0_0_1_3_2_2 - 0.00194805194805203*G0_0_1_3_2_3 + 0.00292207792207802*G0_0_1_3_2_4 + 0.00292207792207801*G0_0_1_3_2_5 + 0.00253246753246761*G0_0_1_3_3_0 + 0.0142207792207797*G0_0_1_3_3_1 - 0.00194805194805203*G0_0_1_3_3_2 + 0.0911688311688345*G0_0_1_3_3_3 - 0.0179220779220785*G0_0_1_3_3_4 - 0.0109090909090912*G0_0_1_3_3_5 + 0.00642857142857163*G0_0_1_3_4_0 + 0.00642857142857164*G0_0_1_3_4_1 + 0.00292207792207802*G0_0_1_3_4_2 - 0.0179220779220785*G0_0_1_3_4_3 - 0.0241558441558449*G0_0_1_3_4_4 - 0.0187012987012993*G0_0_1_3_4_5 + 0.00350649350649362*G0_0_1_3_5_0 + 0.00623376623376644*G0_0_1_3_5_1 + 0.00292207792207801*G0_0_1_3_5_2 - 0.0109090909090912*G0_0_1_3_5_3 - 0.0187012987012993*G0_0_1_3_5_4 - 0.00233766233766238*G0_0_1_3_5_5 - 0.0129058441558446*G0_0_1_4_0_0 - 0.0012175324675325*G0_0_1_4_0_1 - 0.00194805194805201*G0_0_1_4_0_2 + 0.00642857142857163*G0_0_1_4_0_3 + 0.0173376623376629*G0_0_1_4_0_4 + 0.001948051948052*G0_0_1_4_0_5 - 0.0012175324675325*G0_0_1_4_1_0 - 0.0015097402597403*G0_0_1_4_1_1 - 0.000730519480519505*G0_0_1_4_1_2 + 0.00642857142857164*G0_0_1_4_1_3 + 0.00564935064935083*G0_0_1_4_1_4 + 0.00584415584415603*G0_0_1_4_1_5 - 0.00194805194805201*G0_0_1_4_2_0 - 0.000730519480519505*G0_0_1_4_2_1 + 0.000730519480519504*G0_0_1_4_2_2 + 0.00292207792207802*G0_0_1_4_2_3 - 0.00389610389610402*G0_0_1_4_2_4 + 0.00292207792207802*G0_0_1_4_2_5 + 0.00642857142857163*G0_0_1_4_3_0 + 0.00642857142857164*G0_0_1_4_3_1 + 0.00292207792207802*G0_0_1_4_3_2 - 0.0179220779220785*G0_0_1_4_3_3 - 0.0241558441558449*G0_0_1_4_3_4 - 0.0187012987012993*G0_0_1_4_3_5 + 0.0173376623376629*G0_0_1_4_4_0 + 0.00564935064935083*G0_0_1_4_4_1 - 0.00389610389610401*G0_0_1_4_4_2 - 0.0241558441558449*G0_0_1_4_4_3 + 0.0350649350649362*G0_0_1_4_4_4 - 0.0171428571428577*G0_0_1_4_4_5 + 0.001948051948052*G0_0_1_4_5_0 + 0.00584415584415603*G0_0_1_4_5_1 + 0.00292207792207802*G0_0_1_4_5_2 - 0.0187012987012993*G0_0_1_4_5_3 - 0.0171428571428577*G0_0_1_4_5_4 - 0.00701298701298723*G0_0_1_4_5_5 - 0.0238636363636372*G0_0_1_5_0_0 - 0.00116883116883121*G0_0_1_5_0_1 + 0.000243506493506504*G0_0_1_5_0_2 + 0.00350649350649362*G0_0_1_5_0_3 + 0.001948051948052*G0_0_1_5_0_4 - 0.0144155844155849*G0_0_1_5_0_5 - 0.00116883116883121*G0_0_1_5_1_0 - 0.00214285714285723*G0_0_1_5_1_1 - 0.00141233766233771*G0_0_1_5_1_2 + 0.00623376623376644*G0_0_1_5_1_3 + 0.00584415584415603*G0_0_1_5_1_4 + 0.0167532467532473*G0_0_1_5_1_5 + 0.000243506493506505*G0_0_1_5_2_0 - 0.00141233766233771*G0_0_1_5_2_1 - 0.000730519480519504*G0_0_1_5_2_2 + 0.00292207792207801*G0_0_1_5_2_3 + 0.00292207792207802*G0_0_1_5_2_4 - 0.00233766233766243*G0_0_1_5_2_5 + 0.00350649350649362*G0_0_1_5_3_0 + 0.00623376623376644*G0_0_1_5_3_1 + 0.00292207792207801*G0_0_1_5_3_2 - 0.0109090909090912*G0_0_1_5_3_3 - 0.0187012987012993*G0_0_1_5_3_4 - 0.00233766233766238*G0_0_1_5_3_5 + 0.001948051948052*G0_0_1_5_4_0 + 0.00584415584415603*G0_0_1_5_4_1 + 0.00292207792207802*G0_0_1_5_4_2 - 0.0187012987012993*G0_0_1_5_4_3 - 0.0171428571428577*G0_0_1_5_4_4 - 0.00701298701298723*G0_0_1_5_4_5 - 0.0144155844155849*G0_0_1_5_5_0 + 0.0167532467532473*G0_0_1_5_5_1 - 0.00233766233766243*G0_0_1_5_5_2 - 0.00233766233766238*G0_0_1_5_5_3 - 0.00701298701298723*G0_0_1_5_5_4 + 0.189350649350656*G0_0_1_5_5_5 + 0.0242897727272736*G0_1_1_0_0_0 - 0.00367694805194819*G0_1_1_0_0_1 - 0.00110795454545459*G0_1_1_0_0_2 + 0.00267857142857154*G0_1_1_0_0_4 + 0.0219155844155852*G0_1_1_0_0_5 - 0.00367694805194819*G0_1_1_0_1_0 + 0.00256899350649359*G0_1_1_0_1_1 + 0.000547889610389629*G0_1_1_0_1_2 - 0.00160714285714291*G0_1_1_0_1_3 - 0.00224025974025981*G0_1_1_0_1_4 - 0.00925324675324709*G0_1_1_0_1_5 - 0.00110795454545459*G0_1_1_0_2_0 + 0.000547889610389629*G0_1_1_0_2_1 + 0.000365259740259756*G0_1_1_0_2_2 - 0.000487012987013002*G0_1_1_0_2_3 - 0.000487012987013003*G0_1_1_0_2_4 - 0.00204545454545462*G0_1_1_0_2_5 - 0.00160714285714291*G0_1_1_0_3_1 - 0.000487012987013002*G0_1_1_0_3_2 - 0.0013636363636364*G0_1_1_0_3_3 + 0.00428571428571442*G0_1_1_0_3_4 + 0.00389610389610402*G0_1_1_0_3_5 + 0.00267857142857154*G0_1_1_0_4_0 - 0.00224025974025981*G0_1_1_0_4_1 - 0.000487012987013003*G0_1_1_0_4_2 + 0.00428571428571442*G0_1_1_0_4_3 + 0.00487012987013002*G0_1_1_0_4_4 + 0.00857142857142887*G0_1_1_0_4_5 + 0.0219155844155852*G0_1_1_0_5_0 - 0.00925324675324709*G0_1_1_0_5_1 - 0.00204545454545462*G0_1_1_0_5_2 + 0.00389610389610402*G0_1_1_0_5_3 + 0.00857142857142887*G0_1_1_0_5_4 + 0.0315584415584428*G0_1_1_0_5_5 - 0.00367694805194819*G0_1_1_1_0_0 + 0.00256899350649359*G0_1_1_1_0_1 + 0.000547889610389629*G0_1_1_1_0_2 - 0.00160714285714291*G0_1_1_1_0_3 - 0.00224025974025981*G0_1_1_1_0_4 - 0.00925324675324709*G0_1_1_1_0_5 + 0.00256899350649359*G0_1_1_1_1_0 - 0.0401785714285727*G0_1_1_1_1_1 + 0.00125405844155848*G0_1_1_1_1_2 - 0.0037012987012988*G0_1_1_1_1_3 - 0.00199675324675331*G0_1_1_1_1_4 - 0.00214285714285722*G0_1_1_1_1_5 + 0.000547889610389629*G0_1_1_1_2_0 + 0.00125405844155848*G0_1_1_1_2_1 + 0.000974025974026009*G0_1_1_1_2_2 - 0.00292207792207803*G0_1_1_1_2_3 - 0.00194805194805201*G0_1_1_1_2_4 - 0.00112012987012991*G0_1_1_1_2_5 - 0.00160714285714291*G0_1_1_1_3_0 - 0.0037012987012988*G0_1_1_1_3_1 - 0.00292207792207803*G0_1_1_1_3_2 + 0.0132467532467537*G0_1_1_1_3_3 + 0.00720779220779244*G0_1_1_1_3_4 + 0.00545454545454564*G0_1_1_1_3_5 - 0.00224025974025981*G0_1_1_1_4_0 - 0.00199675324675331*G0_1_1_1_4_1 - 0.00194805194805201*G0_1_1_1_4_2 + 0.00720779220779244*G0_1_1_1_4_3 + 0.0136363636363641*G0_1_1_1_4_4 + 0.00623376623376644*G0_1_1_1_4_5 - 0.00925324675324709*G0_1_1_1_5_0 - 0.00214285714285722*G0_1_1_1_5_1 - 0.00112012987012991*G0_1_1_1_5_2 + 0.00545454545454564*G0_1_1_1_5_3 + 0.00623376623376644*G0_1_1_1_5_4 - 0.000779220779220826*G0_1_1_1_5_5 - 0.00110795454545459*G0_1_1_2_0_0 + 0.000547889610389629*G0_1_1_2_0_1 + 0.000365259740259756*G0_1_1_2_0_2 - 0.000487012987013002*G0_1_1_2_0_3 - 0.000487012987013003*G0_1_1_2_0_4 - 0.00204545454545462*G0_1_1_2_0_5 + 0.000547889610389629*G0_1_1_2_1_0 + 0.00125405844155848*G0_1_1_2_1_1 + 0.000974025974026009*G0_1_1_2_1_2 - 0.00292207792207803*G0_1_1_2_1_3 - 0.00194805194805201*G0_1_1_2_1_4 - 0.00112012987012991*G0_1_1_2_1_5 + 0.000365259740259756*G0_1_1_2_2_0 + 0.00097402597402601*G0_1_1_2_2_1 - 0.00401785714285735*G0_1_1_2_2_2 - 0.00146103896103901*G0_1_1_2_2_3 - 0.00292207792207803*G0_1_1_2_2_4 - 0.000974025974026005*G0_1_1_2_2_5 - 0.000487012987013002*G0_1_1_2_3_0 - 0.00292207792207803*G0_1_1_2_3_1 - 0.00146103896103901*G0_1_1_2_3_2 - 0.00292207792207804*G0_1_1_2_3_3 + 0.00487012987013003*G0_1_1_2_3_4 + 0.00292207792207801*G0_1_1_2_3_5 - 0.000487012987013003*G0_1_1_2_4_0 - 0.00194805194805201*G0_1_1_2_4_1 - 0.00292207792207803*G0_1_1_2_4_2 + 0.00487012987013003*G0_1_1_2_4_3 + 0.0107142857142861*G0_1_1_2_4_4 + 0.00584415584415604*G0_1_1_2_4_5 - 0.00204545454545462*G0_1_1_2_5_0 - 0.00112012987012991*G0_1_1_2_5_1 - 0.000974025974026005*G0_1_1_2_5_2 + 0.00292207792207801*G0_1_1_2_5_3 + 0.00584415584415604*G0_1_1_2_5_4 - 0.00623376623376647*G0_1_1_2_5_5 - 0.00160714285714291*G0_1_1_3_0_1 - 0.000487012987013002*G0_1_1_3_0_2 - 0.0013636363636364*G0_1_1_3_0_3 + 0.00428571428571442*G0_1_1_3_0_4 + 0.00389610389610402*G0_1_1_3_0_5 - 0.00160714285714291*G0_1_1_3_1_0 - 0.0037012987012988*G0_1_1_3_1_1 - 0.00292207792207803*G0_1_1_3_1_2 + 0.0132467532467537*G0_1_1_3_1_3 + 0.00720779220779244*G0_1_1_3_1_4 + 0.00545454545454564*G0_1_1_3_1_5 - 0.000487012987013002*G0_1_1_3_2_0 - 0.00292207792207803*G0_1_1_3_2_1 - 0.00146103896103901*G0_1_1_3_2_2 - 0.00292207792207804*G0_1_1_3_2_3 + 0.00487012987013003*G0_1_1_3_2_4 + 0.00292207792207801*G0_1_1_3_2_5 - 0.0013636363636364*G0_1_1_3_3_0 + 0.0132467532467537*G0_1_1_3_3_1 - 0.00292207792207804*G0_1_1_3_3_2 + 0.121558441558446*G0_1_1_3_3_3 - 0.011688311688312*G0_1_1_3_3_4 - 0.00311688311688316*G0_1_1_3_3_5 + 0.00428571428571442*G0_1_1_3_4_0 + 0.00720779220779245*G0_1_1_3_4_1 + 0.00487012987013003*G0_1_1_3_4_2 - 0.011688311688312*G0_1_1_3_4_3 - 0.035844155844157*G0_1_1_3_4_4 - 0.0202597402597409*G0_1_1_3_4_5 + 0.00389610389610402*G0_1_1_3_5_0 + 0.00545454545454564*G0_1_1_3_5_1 + 0.00292207792207801*G0_1_1_3_5_2 - 0.00311688311688316*G0_1_1_3_5_3 - 0.0202597402597409*G0_1_1_3_5_4 + 0.00467532467532487*G0_1_1_3_5_5 + 0.00267857142857154*G0_1_1_4_0_0 - 0.00224025974025981*G0_1_1_4_0_1 - 0.000487012987013003*G0_1_1_4_0_2 + 0.00428571428571442*G0_1_1_4_0_3 + 0.00487012987013002*G0_1_1_4_0_4 + 0.00857142857142887*G0_1_1_4_0_5 - 0.00224025974025981*G0_1_1_4_1_0 - 0.00199675324675331*G0_1_1_4_1_1 - 0.00194805194805201*G0_1_1_4_1_2 + 0.00720779220779244*G0_1_1_4_1_3 + 0.0136363636363641*G0_1_1_4_1_4 + 0.00623376623376644*G0_1_1_4_1_5 - 0.000487012987013003*G0_1_1_4_2_0 - 0.00194805194805201*G0_1_1_4_2_1 - 0.00292207792207803*G0_1_1_4_2_2 + 0.00487012987013003*G0_1_1_4_2_3 + 0.0107142857142861*G0_1_1_4_2_4 + 0.00584415584415604*G0_1_1_4_2_5 + 0.00428571428571442*G0_1_1_4_3_0 + 0.00720779220779244*G0_1_1_4_3_1 + 0.00487012987013003*G0_1_1_4_3_2 - 0.011688311688312*G0_1_1_4_3_3 - 0.035844155844157*G0_1_1_4_3_4 - 0.0202597402597409*G0_1_1_4_3_5 + 0.00487012987013002*G0_1_1_4_4_0 + 0.0136363636363641*G0_1_1_4_4_1 + 0.0107142857142861*G0_1_1_4_4_2 - 0.035844155844157*G0_1_1_4_4_3 - 0.0958441558441589*G0_1_1_4_4_4 - 0.0389610389610403*G0_1_1_4_4_5 + 0.00857142857142887*G0_1_1_4_5_0 + 0.00623376623376644*G0_1_1_4_5_1 + 0.00584415584415604*G0_1_1_4_5_2 - 0.0202597402597409*G0_1_1_4_5_3 - 0.0389610389610403*G0_1_1_4_5_4 + 0.0219155844155852*G0_1_1_5_0_0 - 0.00925324675324709*G0_1_1_5_0_1 - 0.00204545454545462*G0_1_1_5_0_2 + 0.00389610389610402*G0_1_1_5_0_3 + 0.00857142857142887*G0_1_1_5_0_4 + 0.0315584415584428*G0_1_1_5_0_5 - 0.00925324675324709*G0_1_1_5_1_0 - 0.00214285714285722*G0_1_1_5_1_1 - 0.00112012987012991*G0_1_1_5_1_2 + 0.00545454545454564*G0_1_1_5_1_3 + 0.00623376623376644*G0_1_1_5_1_4 - 0.000779220779220823*G0_1_1_5_1_5 - 0.00204545454545462*G0_1_1_5_2_0 - 0.00112012987012991*G0_1_1_5_2_1 - 0.000974025974026005*G0_1_1_5_2_2 + 0.00292207792207801*G0_1_1_5_2_3 + 0.00584415584415604*G0_1_1_5_2_4 - 0.00623376623376647*G0_1_1_5_2_5 + 0.00389610389610402*G0_1_1_5_3_0 + 0.00545454545454564*G0_1_1_5_3_1 + 0.00292207792207801*G0_1_1_5_3_2 - 0.00311688311688316*G0_1_1_5_3_3 - 0.0202597402597409*G0_1_1_5_3_4 + 0.00467532467532487*G0_1_1_5_3_5 + 0.00857142857142887*G0_1_1_5_4_0 + 0.00623376623376644*G0_1_1_5_4_1 + 0.00584415584415604*G0_1_1_5_4_2 - 0.0202597402597409*G0_1_1_5_4_3 - 0.0389610389610403*G0_1_1_5_4_4 + 0.0315584415584428*G0_1_1_5_5_0 - 0.000779220779220823*G0_1_1_5_5_1 - 0.00623376623376647*G0_1_1_5_5_2 + 0.00467532467532487*G0_1_1_5_5_3 + 0.317922077922089*G0_1_1_5_5_5; + A[53] = -A[58] + 0.0242897727272736*G0_0_0_0_0_0 - 0.00110795454545458*G0_0_0_0_0_1 - 0.00367694805194818*G0_0_0_0_0_2 + 0.0219155844155852*G0_0_0_0_0_4 + 0.00267857142857153*G0_0_0_0_0_5 - 0.00110795454545458*G0_0_0_0_1_0 + 0.000365259740259747*G0_0_0_0_1_1 + 0.000547889610389628*G0_0_0_0_1_2 - 0.000487012987013004*G0_0_0_0_1_3 - 0.00204545454545462*G0_0_0_0_1_4 - 0.000487012987013*G0_0_0_0_1_5 - 0.00367694805194818*G0_0_0_0_2_0 + 0.000547889610389628*G0_0_0_0_2_1 + 0.0025689935064936*G0_0_0_0_2_2 - 0.0016071428571429*G0_0_0_0_2_3 - 0.00925324675324705*G0_0_0_0_2_4 - 0.00224025974025981*G0_0_0_0_2_5 - 0.000487012987013004*G0_0_0_0_3_1 - 0.0016071428571429*G0_0_0_0_3_2 - 0.0013636363636364*G0_0_0_0_3_3 + 0.00389610389610401*G0_0_0_0_3_4 + 0.00428571428571441*G0_0_0_0_3_5 + 0.0219155844155852*G0_0_0_0_4_0 - 0.00204545454545462*G0_0_0_0_4_1 - 0.00925324675324705*G0_0_0_0_4_2 + 0.00389610389610401*G0_0_0_0_4_3 + 0.0315584415584427*G0_0_0_0_4_4 + 0.00857142857142885*G0_0_0_0_4_5 + 0.00267857142857153*G0_0_0_0_5_0 - 0.000487012987013*G0_0_0_0_5_1 - 0.00224025974025981*G0_0_0_0_5_2 + 0.00428571428571441*G0_0_0_0_5_3 + 0.00857142857142885*G0_0_0_0_5_4 + 0.00487012987013*G0_0_0_0_5_5 - 0.00110795454545458*G0_0_0_1_0_0 + 0.000365259740259747*G0_0_0_1_0_1 + 0.000547889610389628*G0_0_0_1_0_2 - 0.000487012987013004*G0_0_0_1_0_3 - 0.00204545454545461*G0_0_0_1_0_4 - 0.000487012987013*G0_0_0_1_0_5 + 0.000365259740259747*G0_0_0_1_1_0 - 0.00401785714285718*G0_0_0_1_1_1 + 0.000974025974026001*G0_0_0_1_1_2 - 0.00146103896103899*G0_0_0_1_1_3 - 0.000974025974026004*G0_0_0_1_1_4 - 0.002922077922078*G0_0_0_1_1_5 + 0.000547889610389628*G0_0_0_1_2_0 + 0.000974025974026001*G0_0_0_1_2_1 + 0.00125405844155849*G0_0_0_1_2_2 - 0.00292207792207802*G0_0_0_1_2_3 - 0.0011201298701299*G0_0_0_1_2_4 - 0.00194805194805201*G0_0_0_1_2_5 - 0.000487012987013004*G0_0_0_1_3_0 - 0.00146103896103899*G0_0_0_1_3_1 - 0.00292207792207802*G0_0_0_1_3_2 - 0.002922077922078*G0_0_0_1_3_3 + 0.00292207792207802*G0_0_0_1_3_4 + 0.00487012987013003*G0_0_0_1_3_5 - 0.00204545454545461*G0_0_0_1_4_0 - 0.000974025974026004*G0_0_0_1_4_1 - 0.0011201298701299*G0_0_0_1_4_2 + 0.00292207792207802*G0_0_0_1_4_3 - 0.00623376623376644*G0_0_0_1_4_4 + 0.00584415584415603*G0_0_0_1_4_5 - 0.000487012987013*G0_0_0_1_5_0 - 0.002922077922078*G0_0_0_1_5_1 - 0.00194805194805201*G0_0_0_1_5_2 + 0.00487012987013003*G0_0_0_1_5_3 + 0.00584415584415603*G0_0_0_1_5_4 + 0.0107142857142861*G0_0_0_1_5_5 - 0.00367694805194818*G0_0_0_2_0_0 + 0.000547889610389628*G0_0_0_2_0_1 + 0.0025689935064936*G0_0_0_2_0_2 - 0.0016071428571429*G0_0_0_2_0_3 - 0.00925324675324705*G0_0_0_2_0_4 - 0.00224025974025981*G0_0_0_2_0_5 + 0.000547889610389628*G0_0_0_2_1_0 + 0.000974025974026001*G0_0_0_2_1_1 + 0.00125405844155849*G0_0_0_2_1_2 - 0.00292207792207802*G0_0_0_2_1_3 - 0.0011201298701299*G0_0_0_2_1_4 - 0.00194805194805201*G0_0_0_2_1_5 + 0.0025689935064936*G0_0_0_2_2_0 + 0.00125405844155849*G0_0_0_2_2_1 - 0.0401785714285729*G0_0_0_2_2_2 - 0.00370129870129885*G0_0_0_2_2_3 - 0.00214285714285726*G0_0_0_2_2_4 - 0.00199675324675332*G0_0_0_2_2_5 - 0.0016071428571429*G0_0_0_2_3_0 - 0.00292207792207802*G0_0_0_2_3_1 - 0.00370129870129885*G0_0_0_2_3_2 + 0.0132467532467537*G0_0_0_2_3_3 + 0.00545454545454562*G0_0_0_2_3_4 + 0.00720779220779244*G0_0_0_2_3_5 - 0.00925324675324705*G0_0_0_2_4_0 - 0.0011201298701299*G0_0_0_2_4_1 - 0.00214285714285726*G0_0_0_2_4_2 + 0.00545454545454562*G0_0_0_2_4_3 - 0.000779220779220833*G0_0_0_2_4_4 + 0.00623376623376643*G0_0_0_2_4_5 - 0.00224025974025981*G0_0_0_2_5_0 - 0.00194805194805201*G0_0_0_2_5_1 - 0.00199675324675332*G0_0_0_2_5_2 + 0.00720779220779244*G0_0_0_2_5_3 + 0.00623376623376643*G0_0_0_2_5_4 + 0.0136363636363641*G0_0_0_2_5_5 - 0.000487012987013004*G0_0_0_3_0_1 - 0.0016071428571429*G0_0_0_3_0_2 - 0.0013636363636364*G0_0_0_3_0_3 + 0.00389610389610401*G0_0_0_3_0_4 + 0.00428571428571441*G0_0_0_3_0_5 - 0.000487012987013004*G0_0_0_3_1_0 - 0.00146103896103899*G0_0_0_3_1_1 - 0.00292207792207802*G0_0_0_3_1_2 - 0.002922077922078*G0_0_0_3_1_3 + 0.00292207792207802*G0_0_0_3_1_4 + 0.00487012987013003*G0_0_0_3_1_5 - 0.0016071428571429*G0_0_0_3_2_0 - 0.00292207792207802*G0_0_0_3_2_1 - 0.00370129870129885*G0_0_0_3_2_2 + 0.0132467532467537*G0_0_0_3_2_3 + 0.00545454545454562*G0_0_0_3_2_4 + 0.00720779220779244*G0_0_0_3_2_5 - 0.0013636363636364*G0_0_0_3_3_0 - 0.002922077922078*G0_0_0_3_3_1 + 0.0132467532467537*G0_0_0_3_3_2 + 0.121558441558446*G0_0_0_3_3_3 - 0.0031168831168832*G0_0_0_3_3_4 - 0.011688311688312*G0_0_0_3_3_5 + 0.00389610389610401*G0_0_0_3_4_0 + 0.00292207792207802*G0_0_0_3_4_1 + 0.00545454545454562*G0_0_0_3_4_2 - 0.0031168831168832*G0_0_0_3_4_3 + 0.00467532467532483*G0_0_0_3_4_4 - 0.0202597402597409*G0_0_0_3_4_5 + 0.00428571428571441*G0_0_0_3_5_0 + 0.00487012987013003*G0_0_0_3_5_1 + 0.00720779220779244*G0_0_0_3_5_2 - 0.011688311688312*G0_0_0_3_5_3 - 0.0202597402597409*G0_0_0_3_5_4 - 0.035844155844157*G0_0_0_3_5_5 + 0.0219155844155852*G0_0_0_4_0_0 - 0.00204545454545461*G0_0_0_4_0_1 - 0.00925324675324705*G0_0_0_4_0_2 + 0.00389610389610401*G0_0_0_4_0_3 + 0.0315584415584426*G0_0_0_4_0_4 + 0.00857142857142885*G0_0_0_4_0_5 - 0.00204545454545462*G0_0_0_4_1_0 - 0.000974025974026004*G0_0_0_4_1_1 - 0.0011201298701299*G0_0_0_4_1_2 + 0.00292207792207802*G0_0_0_4_1_3 - 0.00623376623376644*G0_0_0_4_1_4 + 0.00584415584415603*G0_0_0_4_1_5 - 0.00925324675324706*G0_0_0_4_2_0 - 0.0011201298701299*G0_0_0_4_2_1 - 0.00214285714285726*G0_0_0_4_2_2 + 0.00545454545454562*G0_0_0_4_2_3 - 0.000779220779220833*G0_0_0_4_2_4 + 0.00623376623376644*G0_0_0_4_2_5 + 0.00389610389610401*G0_0_0_4_3_0 + 0.00292207792207802*G0_0_0_4_3_1 + 0.00545454545454562*G0_0_0_4_3_2 - 0.0031168831168832*G0_0_0_4_3_3 + 0.00467532467532483*G0_0_0_4_3_4 - 0.0202597402597409*G0_0_0_4_3_5 + 0.0315584415584426*G0_0_0_4_4_0 - 0.00623376623376644*G0_0_0_4_4_1 - 0.000779220779220832*G0_0_0_4_4_2 + 0.00467532467532483*G0_0_0_4_4_3 + 0.317922077922088*G0_0_0_4_4_4 + 0.00857142857142885*G0_0_0_4_5_0 + 0.00584415584415603*G0_0_0_4_5_1 + 0.00623376623376643*G0_0_0_4_5_2 - 0.0202597402597409*G0_0_0_4_5_3 - 0.0389610389610403*G0_0_0_4_5_5 + 0.00267857142857153*G0_0_0_5_0_0 - 0.000487012987013*G0_0_0_5_0_1 - 0.00224025974025981*G0_0_0_5_0_2 + 0.00428571428571441*G0_0_0_5_0_3 + 0.00857142857142885*G0_0_0_5_0_4 + 0.00487012987013*G0_0_0_5_0_5 - 0.000487012987013*G0_0_0_5_1_0 - 0.002922077922078*G0_0_0_5_1_1 - 0.00194805194805201*G0_0_0_5_1_2 + 0.00487012987013003*G0_0_0_5_1_3 + 0.00584415584415603*G0_0_0_5_1_4 + 0.0107142857142861*G0_0_0_5_1_5 - 0.00224025974025981*G0_0_0_5_2_0 - 0.00194805194805201*G0_0_0_5_2_1 - 0.00199675324675332*G0_0_0_5_2_2 + 0.00720779220779244*G0_0_0_5_2_3 + 0.00623376623376643*G0_0_0_5_2_4 + 0.0136363636363641*G0_0_0_5_2_5 + 0.00428571428571441*G0_0_0_5_3_0 + 0.00487012987013003*G0_0_0_5_3_1 + 0.00720779220779244*G0_0_0_5_3_2 - 0.011688311688312*G0_0_0_5_3_3 - 0.0202597402597409*G0_0_0_5_3_4 - 0.035844155844157*G0_0_0_5_3_5 + 0.00857142857142885*G0_0_0_5_4_0 + 0.00584415584415603*G0_0_0_5_4_1 + 0.00623376623376644*G0_0_0_5_4_2 - 0.0202597402597409*G0_0_0_5_4_3 - 0.0389610389610403*G0_0_0_5_4_5 + 0.00487012987013*G0_0_0_5_5_0 + 0.0107142857142861*G0_0_0_5_5_1 + 0.0136363636363641*G0_0_0_5_5_2 - 0.035844155844157*G0_0_0_5_5_3 - 0.0389610389610402*G0_0_0_5_5_4 - 0.0958441558441591*G0_0_0_5_5_5 - 0.0955154220779253*G0_1_0_0_0_0 + 0.00340909090909101*G0_1_0_0_0_1 + 0.00631899350649372*G0_1_0_0_0_2 - 0.00199675324675329*G0_1_0_0_0_3 - 0.0238636363636371*G0_1_0_0_0_4 - 0.0129058441558446*G0_1_0_0_0_5 + 0.00340909090909101*G0_1_0_0_1_0 + 0.00012175324675325*G0_1_0_0_1_1 + 0.000109577922077925*G0_1_0_0_1_2 - 0.000730519480519504*G0_1_0_0_1_3 + 0.000243506493506502*G0_1_0_0_1_4 - 0.00194805194805202*G0_1_0_0_1_5 + 0.00631899350649372*G0_1_0_0_2_0 + 0.000109577922077925*G0_1_0_0_2_1 + 0.000474837662337684*G0_1_0_0_2_2 - 0.0017045454545455*G0_1_0_0_2_3 - 0.0011688311688312*G0_1_0_0_2_4 - 0.00121753246753251*G0_1_0_0_2_5 - 0.00199675324675329*G0_1_0_0_3_0 - 0.000730519480519504*G0_1_0_0_3_1 - 0.0017045454545455*G0_1_0_0_3_2 + 0.00253246753246761*G0_1_0_0_3_3 + 0.00350649350649361*G0_1_0_0_3_4 + 0.00642857142857163*G0_1_0_0_3_5 - 0.0238636363636371*G0_1_0_0_4_0 + 0.000243506493506502*G0_1_0_0_4_1 - 0.0011688311688312*G0_1_0_0_4_2 + 0.00350649350649361*G0_1_0_0_4_3 - 0.0144155844155849*G0_1_0_0_4_4 + 0.001948051948052*G0_1_0_0_4_5 - 0.0129058441558446*G0_1_0_0_5_0 - 0.00194805194805202*G0_1_0_0_5_1 - 0.00121753246753251*G0_1_0_0_5_2 + 0.00642857142857163*G0_1_0_0_5_3 + 0.001948051948052*G0_1_0_0_5_4 + 0.017337662337663*G0_1_0_0_5_5 + 0.00340909090909101*G0_1_0_1_0_0 + 0.00012175324675325*G0_1_0_1_0_1 + 0.000109577922077925*G0_1_0_1_0_2 - 0.000730519480519504*G0_1_0_1_0_3 + 0.000243506493506503*G0_1_0_1_0_4 - 0.00194805194805202*G0_1_0_1_0_5 + 0.00012175324675325*G0_1_0_1_1_0 + 0.000608766233766252*G0_1_0_1_1_2 - 0.000730519480519493*G0_1_0_1_1_3 - 0.000730519480519502*G0_1_0_1_1_4 + 0.000730519480519517*G0_1_0_1_1_5 + 0.000109577922077925*G0_1_0_1_2_0 + 0.000608766233766251*G0_1_0_1_2_1 + 0.00104707792207796*G0_1_0_1_2_2 - 0.00243506493506501*G0_1_0_1_2_3 - 0.00141233766233771*G0_1_0_1_2_4 - 0.000730519480519503*G0_1_0_1_2_5 - 0.000730519480519504*G0_1_0_1_3_0 - 0.000730519480519493*G0_1_0_1_3_1 - 0.00243506493506501*G0_1_0_1_3_2 - 0.00194805194805201*G0_1_0_1_3_3 + 0.00292207792207801*G0_1_0_1_3_4 + 0.00292207792207801*G0_1_0_1_3_5 + 0.000243506493506503*G0_1_0_1_4_0 - 0.000730519480519502*G0_1_0_1_4_1 - 0.00141233766233771*G0_1_0_1_4_2 + 0.00292207792207801*G0_1_0_1_4_3 - 0.00233766233766242*G0_1_0_1_4_4 + 0.00292207792207801*G0_1_0_1_4_5 - 0.00194805194805202*G0_1_0_1_5_0 + 0.000730519480519517*G0_1_0_1_5_1 - 0.000730519480519503*G0_1_0_1_5_2 + 0.00292207792207801*G0_1_0_1_5_3 + 0.00292207792207801*G0_1_0_1_5_4 - 0.00389610389610405*G0_1_0_1_5_5 + 0.00631899350649372*G0_1_0_2_0_0 + 0.000109577922077925*G0_1_0_2_0_1 + 0.000474837662337684*G0_1_0_2_0_2 - 0.0017045454545455*G0_1_0_2_0_3 - 0.0011688311688312*G0_1_0_2_0_4 - 0.00121753246753251*G0_1_0_2_0_5 + 0.000109577922077925*G0_1_0_2_1_0 + 0.000608766233766251*G0_1_0_2_1_1 + 0.00104707792207796*G0_1_0_2_1_2 - 0.00243506493506501*G0_1_0_2_1_3 - 0.00141233766233771*G0_1_0_2_1_4 - 0.000730519480519503*G0_1_0_2_1_5 + 0.000474837662337684*G0_1_0_2_2_0 + 0.00104707792207796*G0_1_0_2_2_1 - 0.0361972402597416*G0_1_0_2_2_2 - 0.00345779220779234*G0_1_0_2_2_3 - 0.00214285714285725*G0_1_0_2_2_4 - 0.00150974025974031*G0_1_0_2_2_5 - 0.0017045454545455*G0_1_0_2_3_0 - 0.00243506493506501*G0_1_0_2_3_1 - 0.00345779220779234*G0_1_0_2_3_2 + 0.0142207792207797*G0_1_0_2_3_3 + 0.00623376623376643*G0_1_0_2_3_4 + 0.00642857142857164*G0_1_0_2_3_5 - 0.0011688311688312*G0_1_0_2_4_0 - 0.00141233766233771*G0_1_0_2_4_1 - 0.00214285714285725*G0_1_0_2_4_2 + 0.00623376623376643*G0_1_0_2_4_3 + 0.0167532467532473*G0_1_0_2_4_4 + 0.00584415584415603*G0_1_0_2_4_5 - 0.00121753246753251*G0_1_0_2_5_0 - 0.000730519480519503*G0_1_0_2_5_1 - 0.00150974025974031*G0_1_0_2_5_2 + 0.00642857142857164*G0_1_0_2_5_3 + 0.00584415584415603*G0_1_0_2_5_4 + 0.00564935064935083*G0_1_0_2_5_5 - 0.00199675324675329*G0_1_0_3_0_0 - 0.000730519480519504*G0_1_0_3_0_1 - 0.0017045454545455*G0_1_0_3_0_2 + 0.00253246753246761*G0_1_0_3_0_3 + 0.00350649350649361*G0_1_0_3_0_4 + 0.00642857142857163*G0_1_0_3_0_5 - 0.000730519480519504*G0_1_0_3_1_0 - 0.000730519480519493*G0_1_0_3_1_1 - 0.00243506493506501*G0_1_0_3_1_2 - 0.00194805194805201*G0_1_0_3_1_3 + 0.00292207792207801*G0_1_0_3_1_4 + 0.00292207792207801*G0_1_0_3_1_5 - 0.0017045454545455*G0_1_0_3_2_0 - 0.00243506493506501*G0_1_0_3_2_1 - 0.00345779220779235*G0_1_0_3_2_2 + 0.0142207792207797*G0_1_0_3_2_3 + 0.00623376623376643*G0_1_0_3_2_4 + 0.00642857142857164*G0_1_0_3_2_5 + 0.00253246753246761*G0_1_0_3_3_0 - 0.00194805194805201*G0_1_0_3_3_1 + 0.0142207792207797*G0_1_0_3_3_2 + 0.0911688311688344*G0_1_0_3_3_3 - 0.0109090909090912*G0_1_0_3_3_4 - 0.0179220779220785*G0_1_0_3_3_5 + 0.00350649350649361*G0_1_0_3_4_0 + 0.00292207792207801*G0_1_0_3_4_1 + 0.00623376623376643*G0_1_0_3_4_2 - 0.0109090909090912*G0_1_0_3_4_3 - 0.00233766233766239*G0_1_0_3_4_4 - 0.0187012987012993*G0_1_0_3_4_5 + 0.00642857142857163*G0_1_0_3_5_0 + 0.00292207792207801*G0_1_0_3_5_1 + 0.00642857142857164*G0_1_0_3_5_2 - 0.0179220779220785*G0_1_0_3_5_3 - 0.0187012987012993*G0_1_0_3_5_4 - 0.0241558441558449*G0_1_0_3_5_5 - 0.0238636363636371*G0_1_0_4_0_0 + 0.000243506493506503*G0_1_0_4_0_1 - 0.0011688311688312*G0_1_0_4_0_2 + 0.00350649350649361*G0_1_0_4_0_3 - 0.0144155844155849*G0_1_0_4_0_4 + 0.001948051948052*G0_1_0_4_0_5 + 0.000243506493506503*G0_1_0_4_1_0 - 0.000730519480519502*G0_1_0_4_1_1 - 0.00141233766233771*G0_1_0_4_1_2 + 0.00292207792207801*G0_1_0_4_1_3 - 0.00233766233766242*G0_1_0_4_1_4 + 0.00292207792207801*G0_1_0_4_1_5 - 0.0011688311688312*G0_1_0_4_2_0 - 0.00141233766233771*G0_1_0_4_2_1 - 0.00214285714285725*G0_1_0_4_2_2 + 0.00623376623376643*G0_1_0_4_2_3 + 0.0167532467532473*G0_1_0_4_2_4 + 0.00584415584415603*G0_1_0_4_2_5 + 0.00350649350649361*G0_1_0_4_3_0 + 0.00292207792207801*G0_1_0_4_3_1 + 0.00623376623376643*G0_1_0_4_3_2 - 0.0109090909090912*G0_1_0_4_3_3 - 0.00233766233766239*G0_1_0_4_3_4 - 0.0187012987012993*G0_1_0_4_3_5 - 0.0144155844155849*G0_1_0_4_4_0 - 0.00233766233766242*G0_1_0_4_4_1 + 0.0167532467532473*G0_1_0_4_4_2 - 0.00233766233766239*G0_1_0_4_4_3 + 0.189350649350655*G0_1_0_4_4_4 - 0.00701298701298721*G0_1_0_4_4_5 + 0.001948051948052*G0_1_0_4_5_0 + 0.00292207792207801*G0_1_0_4_5_1 + 0.00584415584415603*G0_1_0_4_5_2 - 0.0187012987012993*G0_1_0_4_5_3 - 0.00701298701298721*G0_1_0_4_5_4 - 0.0171428571428577*G0_1_0_4_5_5 - 0.0129058441558446*G0_1_0_5_0_0 - 0.00194805194805202*G0_1_0_5_0_1 - 0.00121753246753251*G0_1_0_5_0_2 + 0.00642857142857163*G0_1_0_5_0_3 + 0.001948051948052*G0_1_0_5_0_4 + 0.017337662337663*G0_1_0_5_0_5 - 0.00194805194805202*G0_1_0_5_1_0 + 0.000730519480519517*G0_1_0_5_1_1 - 0.000730519480519503*G0_1_0_5_1_2 + 0.00292207792207801*G0_1_0_5_1_3 + 0.00292207792207801*G0_1_0_5_1_4 - 0.00389610389610405*G0_1_0_5_1_5 - 0.00121753246753251*G0_1_0_5_2_0 - 0.000730519480519503*G0_1_0_5_2_1 - 0.00150974025974031*G0_1_0_5_2_2 + 0.00642857142857163*G0_1_0_5_2_3 + 0.00584415584415603*G0_1_0_5_2_4 + 0.00564935064935083*G0_1_0_5_2_5 + 0.00642857142857163*G0_1_0_5_3_0 + 0.00292207792207801*G0_1_0_5_3_1 + 0.00642857142857164*G0_1_0_5_3_2 - 0.0179220779220785*G0_1_0_5_3_3 - 0.0187012987012993*G0_1_0_5_3_4 - 0.0241558441558449*G0_1_0_5_3_5 + 0.001948051948052*G0_1_0_5_4_0 + 0.00292207792207801*G0_1_0_5_4_1 + 0.00584415584415603*G0_1_0_5_4_2 - 0.0187012987012993*G0_1_0_5_4_3 - 0.00701298701298721*G0_1_0_5_4_4 - 0.0171428571428577*G0_1_0_5_4_5 + 0.017337662337663*G0_1_0_5_5_0 - 0.00389610389610405*G0_1_0_5_5_1 + 0.00564935064935083*G0_1_0_5_5_2 - 0.0241558441558449*G0_1_0_5_5_3 - 0.0171428571428577*G0_1_0_5_5_4 + 0.0350649350649365*G0_1_0_5_5_5; + A[24] = -A[27] + 0.01935064935065*G0_1_0_0_0_0 - 0.00145292207792212*G0_1_0_0_0_1 + 0.000919913419913451*G0_1_0_0_0_2 + 0.00107683982683986*G0_1_0_0_0_3 + 0.00390151515151527*G0_1_0_0_0_4 + 0.00486471861471877*G0_1_0_0_0_5 - 0.00145292207792212*G0_1_0_0_1_0 - 0.000238095238095245*G0_1_0_0_1_1 + 0.00101596320346324*G0_1_0_0_1_2 + 0.0011580086580087*G0_1_0_0_1_3 + 0.00095779220779224*G0_1_0_0_1_4 + 0.000389610389610405*G0_1_0_0_1_5 + 0.000919913419913451*G0_1_0_0_2_0 + 0.00101596320346324*G0_1_0_0_2_1 - 0.0111011904761909*G0_1_0_0_2_2 - 0.00414502164502178*G0_1_0_0_2_3 - 0.00662337662337685*G0_1_0_0_2_4 - 0.000557359307359328*G0_1_0_0_2_5 + 0.00107683982683986*G0_1_0_0_3_0 + 0.0011580086580087*G0_1_0_0_3_1 - 0.00414502164502178*G0_1_0_0_3_2 - 0.00458874458874473*G0_1_0_0_3_3 - 0.0040692640692642*G0_1_0_0_3_4 - 0.00103896103896107*G0_1_0_0_3_5 + 0.00390151515151527*G0_1_0_0_4_0 + 0.00095779220779224*G0_1_0_0_4_1 - 0.00662337662337685*G0_1_0_0_4_2 - 0.0040692640692642*G0_1_0_0_4_3 - 0.0108658008658012*G0_1_0_0_4_4 - 0.000800865800865831*G0_1_0_0_4_5 + 0.00486471861471877*G0_1_0_0_5_0 + 0.000389610389610405*G0_1_0_0_5_1 - 0.000557359307359328*G0_1_0_0_5_2 - 0.00103896103896107*G0_1_0_0_5_3 - 0.000800865800865831*G0_1_0_0_5_4 + 0.00285714285714294*G0_1_0_0_5_5 - 0.00145292207792212*G0_1_0_1_0_0 - 0.000238095238095245*G0_1_0_1_0_1 + 0.00101596320346324*G0_1_0_1_0_2 + 0.0011580086580087*G0_1_0_1_0_3 + 0.00095779220779224*G0_1_0_1_0_4 + 0.000389610389610405*G0_1_0_1_0_5 - 0.000238095238095245*G0_1_0_1_1_0 + 0.00676136363636384*G0_1_0_1_1_1 + 0.00153950216450222*G0_1_0_1_1_2 + 0.00246753246753255*G0_1_0_1_1_3 + 0.000963203463203494*G0_1_0_1_1_4 + 0.000292207792207802*G0_1_0_1_1_5 + 0.00101596320346324*G0_1_0_1_2_0 + 0.00153950216450222*G0_1_0_1_2_1 - 0.011696428571429*G0_1_0_1_2_2 - 0.00746753246753273*G0_1_0_1_2_3 - 0.0040584415584417*G0_1_0_1_2_4 - 0.000270562770562782*G0_1_0_1_2_5 + 0.0011580086580087*G0_1_0_1_3_0 + 0.00246753246753255*G0_1_0_1_3_1 - 0.00746753246753273*G0_1_0_1_3_2 - 0.0126406926406931*G0_1_0_1_3_3 - 0.00424242424242439*G0_1_0_1_3_4 - 0.00177489177489184*G0_1_0_1_3_5 + 0.00095779220779224*G0_1_0_1_4_0 + 0.000963203463203494*G0_1_0_1_4_1 - 0.0040584415584417*G0_1_0_1_4_2 - 0.00424242424242439*G0_1_0_1_4_3 - 0.00419913419913434*G0_1_0_1_4_4 - 0.00138528138528143*G0_1_0_1_4_5 + 0.000389610389610405*G0_1_0_1_5_0 + 0.000292207792207802*G0_1_0_1_5_1 - 0.000270562770562782*G0_1_0_1_5_2 - 0.00177489177489184*G0_1_0_1_5_3 - 0.00138528138528143*G0_1_0_1_5_4 - 0.00367965367965381*G0_1_0_1_5_5 + 0.000919913419913451*G0_1_0_2_0_0 + 0.00101596320346324*G0_1_0_2_0_1 - 0.0111011904761909*G0_1_0_2_0_2 - 0.00414502164502178*G0_1_0_2_0_3 - 0.00662337662337685*G0_1_0_2_0_4 - 0.000557359307359328*G0_1_0_2_0_5 + 0.00101596320346324*G0_1_0_2_1_0 + 0.00153950216450222*G0_1_0_2_1_1 - 0.011696428571429*G0_1_0_2_1_2 - 0.00746753246753273*G0_1_0_2_1_3 - 0.0040584415584417*G0_1_0_2_1_4 - 0.000270562770562782*G0_1_0_2_1_5 - 0.0111011904761909*G0_1_0_2_2_0 - 0.011696428571429*G0_1_0_2_2_1 + 0.166233766233772*G0_1_0_2_2_2 + 0.0501082251082269*G0_1_0_2_2_3 + 0.0469696969696986*G0_1_0_2_2_4 + 0.00323593073593088*G0_1_0_2_2_5 - 0.00414502164502178*G0_1_0_2_3_0 - 0.00746753246753272*G0_1_0_2_3_1 + 0.0501082251082269*G0_1_0_2_3_2 + 0.0379220779220793*G0_1_0_2_3_3 + 0.016406926406927*G0_1_0_2_3_4 + 0.00181818181818189*G0_1_0_2_3_5 - 0.00662337662337685*G0_1_0_2_4_0 - 0.0040584415584417*G0_1_0_2_4_1 + 0.0469696969696986*G0_1_0_2_4_2 + 0.016406926406927*G0_1_0_2_4_3 + 0.0331601731601743*G0_1_0_2_4_4 + 0.00164502164502171*G0_1_0_2_4_5 - 0.000557359307359328*G0_1_0_2_5_0 - 0.000270562770562782*G0_1_0_2_5_1 + 0.00323593073593088*G0_1_0_2_5_2 + 0.00181818181818189*G0_1_0_2_5_3 + 0.00164502164502171*G0_1_0_2_5_4 + 0.000735930735930763*G0_1_0_2_5_5 + 0.00107683982683986*G0_1_0_3_0_0 + 0.0011580086580087*G0_1_0_3_0_1 - 0.00414502164502178*G0_1_0_3_0_2 - 0.00458874458874473*G0_1_0_3_0_3 - 0.0040692640692642*G0_1_0_3_0_4 - 0.00103896103896107*G0_1_0_3_0_5 + 0.0011580086580087*G0_1_0_3_1_0 + 0.00246753246753255*G0_1_0_3_1_1 - 0.00746753246753273*G0_1_0_3_1_2 - 0.0126406926406931*G0_1_0_3_1_3 - 0.00424242424242439*G0_1_0_3_1_4 - 0.00177489177489184*G0_1_0_3_1_5 - 0.00414502164502178*G0_1_0_3_2_0 - 0.00746753246753273*G0_1_0_3_2_1 + 0.0501082251082269*G0_1_0_3_2_2 + 0.0379220779220793*G0_1_0_3_2_3 + 0.016406926406927*G0_1_0_3_2_4 + 0.00181818181818189*G0_1_0_3_2_5 - 0.00458874458874473*G0_1_0_3_3_0 - 0.0126406926406931*G0_1_0_3_3_1 + 0.0379220779220793*G0_1_0_3_3_2 + 0.0446753246753262*G0_1_0_3_3_3 + 0.0176623376623383*G0_1_0_3_3_4 + 0.00554112554112573*G0_1_0_3_3_5 - 0.0040692640692642*G0_1_0_3_4_0 - 0.00424242424242439*G0_1_0_3_4_1 + 0.016406926406927*G0_1_0_3_4_2 + 0.0176623376623383*G0_1_0_3_4_3 + 0.0165367965367971*G0_1_0_3_4_4 + 0.00484848484848502*G0_1_0_3_4_5 - 0.00103896103896107*G0_1_0_3_5_0 - 0.00177489177489184*G0_1_0_3_5_1 + 0.00181818181818189*G0_1_0_3_5_2 + 0.00554112554112573*G0_1_0_3_5_3 + 0.00484848484848502*G0_1_0_3_5_4 + 0.000606060606060628*G0_1_0_3_5_5 + 0.00390151515151527*G0_1_0_4_0_0 + 0.00095779220779224*G0_1_0_4_0_1 - 0.00662337662337685*G0_1_0_4_0_2 - 0.0040692640692642*G0_1_0_4_0_3 - 0.0108658008658012*G0_1_0_4_0_4 - 0.000800865800865831*G0_1_0_4_0_5 + 0.00095779220779224*G0_1_0_4_1_0 + 0.000963203463203495*G0_1_0_4_1_1 - 0.0040584415584417*G0_1_0_4_1_2 - 0.00424242424242439*G0_1_0_4_1_3 - 0.00419913419913434*G0_1_0_4_1_4 - 0.00138528138528143*G0_1_0_4_1_5 - 0.00662337662337685*G0_1_0_4_2_0 - 0.0040584415584417*G0_1_0_4_2_1 + 0.0469696969696986*G0_1_0_4_2_2 + 0.016406926406927*G0_1_0_4_2_3 + 0.0331601731601743*G0_1_0_4_2_4 + 0.00164502164502171*G0_1_0_4_2_5 - 0.0040692640692642*G0_1_0_4_3_0 - 0.00424242424242439*G0_1_0_4_3_1 + 0.016406926406927*G0_1_0_4_3_2 + 0.0176623376623383*G0_1_0_4_3_3 + 0.0165367965367971*G0_1_0_4_3_4 + 0.00484848484848502*G0_1_0_4_3_5 - 0.0108658008658012*G0_1_0_4_4_0 - 0.00419913419913434*G0_1_0_4_4_1 + 0.0331601731601743*G0_1_0_4_4_2 + 0.0165367965367971*G0_1_0_4_4_3 + 0.0345454545454557*G0_1_0_4_4_4 + 0.00510822510822529*G0_1_0_4_4_5 - 0.00080086580086583*G0_1_0_4_5_0 - 0.00138528138528143*G0_1_0_4_5_1 + 0.00164502164502171*G0_1_0_4_5_2 + 0.00484848484848502*G0_1_0_4_5_3 + 0.00510822510822529*G0_1_0_4_5_4 + 0.00129870129870135*G0_1_0_4_5_5 + 0.00486471861471877*G0_1_0_5_0_0 + 0.000389610389610405*G0_1_0_5_0_1 - 0.000557359307359328*G0_1_0_5_0_2 - 0.00103896103896107*G0_1_0_5_0_3 - 0.000800865800865831*G0_1_0_5_0_4 + 0.00285714285714294*G0_1_0_5_0_5 + 0.000389610389610405*G0_1_0_5_1_0 + 0.000292207792207802*G0_1_0_5_1_1 - 0.000270562770562782*G0_1_0_5_1_2 - 0.00177489177489184*G0_1_0_5_1_3 - 0.00138528138528143*G0_1_0_5_1_4 - 0.00367965367965381*G0_1_0_5_1_5 - 0.000557359307359328*G0_1_0_5_2_0 - 0.000270562770562782*G0_1_0_5_2_1 + 0.00323593073593088*G0_1_0_5_2_2 + 0.00181818181818189*G0_1_0_5_2_3 + 0.00164502164502171*G0_1_0_5_2_4 + 0.000735930735930763*G0_1_0_5_2_5 - 0.00103896103896107*G0_1_0_5_3_0 - 0.00177489177489184*G0_1_0_5_3_1 + 0.00181818181818189*G0_1_0_5_3_2 + 0.00554112554112573*G0_1_0_5_3_3 + 0.00484848484848502*G0_1_0_5_3_4 + 0.000606060606060627*G0_1_0_5_3_5 - 0.000800865800865831*G0_1_0_5_4_0 - 0.00138528138528143*G0_1_0_5_4_1 + 0.00164502164502171*G0_1_0_5_4_2 + 0.00484848484848502*G0_1_0_5_4_3 + 0.00510822510822529*G0_1_0_5_4_4 + 0.00129870129870135*G0_1_0_5_4_5 + 0.00285714285714294*G0_1_0_5_5_0 - 0.00367965367965381*G0_1_0_5_5_1 + 0.000735930735930763*G0_1_0_5_5_2 + 0.000606060606060628*G0_1_0_5_5_3 + 0.00129870129870135*G0_1_0_5_5_4 - 0.0418181818181833*G0_1_0_5_5_5 - 0.00611201298701322*G0_1_1_0_0_0 + 0.000698051948051975*G0_1_1_0_0_1 + 0.000771103896103923*G0_1_1_0_0_2 - 0.000162337662337667*G0_1_1_0_0_3 - 0.000649350649350672*G0_1_1_0_0_4 - 0.00633116883116906*G0_1_1_0_0_5 + 0.000698051948051975*G0_1_1_0_1_0 + 0.000511363636363654*G0_1_1_0_1_1 + 0.000292207792207801*G0_1_1_0_1_2 + 0.00113636363636367*G0_1_1_0_1_3 + 0.000681818181818204*G0_1_1_0_1_4 + 0.00337662337662349*G0_1_1_0_1_5 + 0.000771103896103923*G0_1_1_0_2_0 + 0.000292207792207801*G0_1_1_0_2_1 - 0.00230519480519489*G0_1_1_0_2_2 - 0.00246753246753255*G0_1_1_0_2_3 - 0.00175324675324681*G0_1_1_0_2_4 - 0.000162337662337667*G0_1_1_0_2_5 - 0.000162337662337667*G0_1_1_0_3_0 + 0.00113636363636367*G0_1_1_0_3_1 - 0.00246753246753255*G0_1_1_0_3_2 - 0.00025974025974027*G0_1_1_0_3_3 - 0.00103896103896107*G0_1_1_0_3_4 + 0.000649350649350668*G0_1_1_0_3_5 - 0.000649350649350672*G0_1_1_0_4_0 + 0.000681818181818204*G0_1_1_0_4_1 - 0.00175324675324681*G0_1_1_0_4_2 - 0.00103896103896107*G0_1_1_0_4_3 - 0.00155844155844161*G0_1_1_0_4_4 - 0.00103896103896108*G0_1_1_0_4_5 - 0.00633116883116906*G0_1_1_0_5_0 + 0.00337662337662349*G0_1_1_0_5_1 - 0.000162337662337667*G0_1_1_0_5_2 + 0.000649350649350668*G0_1_1_0_5_3 - 0.00103896103896108*G0_1_1_0_5_4 - 0.00506493506493527*G0_1_1_0_5_5 + 0.000698051948051975*G0_1_1_1_0_0 + 0.000511363636363654*G0_1_1_1_0_1 + 0.000292207792207801*G0_1_1_1_0_2 + 0.00113636363636367*G0_1_1_1_0_3 + 0.000681818181818204*G0_1_1_1_0_4 + 0.00337662337662349*G0_1_1_1_0_5 + 0.000511363636363654*G0_1_1_1_1_0 - 0.00438311688311705*G0_1_1_1_1_1 + 0.00138798701298706*G0_1_1_1_1_2 - 0.000454545454545476*G0_1_1_1_1_3 + 0.000292207792207803*G0_1_1_1_1_4 - 0.00538961038961058*G0_1_1_1_1_5 + 0.000292207792207801*G0_1_1_1_2_0 + 0.00138798701298706*G0_1_1_1_2_1 - 0.00449675324675341*G0_1_1_1_2_2 - 0.0039610389610391*G0_1_1_1_2_3 - 0.00155844155844161*G0_1_1_1_2_4 + 0.00113636363636367*G0_1_1_1_3_0 - 0.000454545454545476*G0_1_1_1_3_1 - 0.0039610389610391*G0_1_1_1_3_2 - 0.0140259740259745*G0_1_1_1_3_3 - 0.00285714285714296*G0_1_1_1_3_4 - 0.00233766233766242*G0_1_1_1_3_5 + 0.000681818181818204*G0_1_1_1_4_0 + 0.000292207792207803*G0_1_1_1_4_1 - 0.00155844155844161*G0_1_1_1_4_2 - 0.00285714285714296*G0_1_1_1_4_3 - 0.00233766233766242*G0_1_1_1_4_4 - 0.000649350649350673*G0_1_1_1_4_5 + 0.00337662337662349*G0_1_1_1_5_0 - 0.00538961038961058*G0_1_1_1_5_1 - 0.00233766233766242*G0_1_1_1_5_3 - 0.000649350649350673*G0_1_1_1_5_4 - 0.00467532467532484*G0_1_1_1_5_5 + 0.000771103896103923*G0_1_1_2_0_0 + 0.000292207792207801*G0_1_1_2_0_1 - 0.00230519480519489*G0_1_1_2_0_2 - 0.00246753246753255*G0_1_1_2_0_3 - 0.00175324675324681*G0_1_1_2_0_4 - 0.000162337662337667*G0_1_1_2_0_5 + 0.000292207792207801*G0_1_1_2_1_0 + 0.00138798701298706*G0_1_1_2_1_1 - 0.00449675324675341*G0_1_1_2_1_2 - 0.0039610389610391*G0_1_1_2_1_3 - 0.00155844155844161*G0_1_1_2_1_4 - 0.00230519480519489*G0_1_1_2_2_0 - 0.00449675324675341*G0_1_1_2_2_1 + 0.0304383116883128*G0_1_1_2_2_2 + 0.0194805194805202*G0_1_1_2_2_3 + 0.00941558441558477*G0_1_1_2_2_4 + 0.00103896103896108*G0_1_1_2_2_5 - 0.00246753246753255*G0_1_1_2_3_0 - 0.0039610389610391*G0_1_1_2_3_1 + 0.0194805194805202*G0_1_1_2_3_2 + 0.0296103896103906*G0_1_1_2_3_3 + 0.00805194805194833*G0_1_1_2_3_4 + 0.00285714285714296*G0_1_1_2_3_5 - 0.00175324675324681*G0_1_1_2_4_0 - 0.00155844155844161*G0_1_1_2_4_1 + 0.00941558441558477*G0_1_1_2_4_2 + 0.00805194805194833*G0_1_1_2_4_3 + 0.00623376623376647*G0_1_1_2_4_4 + 0.00103896103896107*G0_1_1_2_4_5 - 0.000162337662337667*G0_1_1_2_5_0 + 0.00103896103896108*G0_1_1_2_5_2 + 0.00285714285714296*G0_1_1_2_5_3 + 0.00103896103896107*G0_1_1_2_5_4 + 0.00376623376623389*G0_1_1_2_5_5 - 0.000162337662337667*G0_1_1_3_0_0 + 0.00113636363636367*G0_1_1_3_0_1 - 0.00246753246753255*G0_1_1_3_0_2 - 0.00025974025974027*G0_1_1_3_0_3 - 0.00103896103896107*G0_1_1_3_0_4 + 0.000649350649350668*G0_1_1_3_0_5 + 0.00113636363636367*G0_1_1_3_1_0 - 0.000454545454545476*G0_1_1_3_1_1 - 0.0039610389610391*G0_1_1_3_1_2 - 0.0140259740259745*G0_1_1_3_1_3 - 0.00285714285714296*G0_1_1_3_1_4 - 0.00233766233766242*G0_1_1_3_1_5 - 0.00246753246753255*G0_1_1_3_2_0 - 0.0039610389610391*G0_1_1_3_2_1 + 0.0194805194805202*G0_1_1_3_2_2 + 0.0296103896103906*G0_1_1_3_2_3 + 0.00805194805194833*G0_1_1_3_2_4 + 0.00285714285714296*G0_1_1_3_2_5 - 0.00025974025974027*G0_1_1_3_3_0 - 0.0140259740259745*G0_1_1_3_3_1 + 0.0296103896103906*G0_1_1_3_3_2 + 0.00935064935064974*G0_1_1_3_3_3 + 0.00623376623376646*G0_1_1_3_3_4 - 0.00519480519480536*G0_1_1_3_3_5 - 0.00103896103896107*G0_1_1_3_4_0 - 0.00285714285714296*G0_1_1_3_4_1 + 0.00805194805194833*G0_1_1_3_4_2 + 0.00623376623376646*G0_1_1_3_4_3 + 0.00675324675324699*G0_1_1_3_4_4 + 0.000649350649350668*G0_1_1_3_5_0 - 0.00233766233766242*G0_1_1_3_5_1 + 0.00285714285714296*G0_1_1_3_5_2 - 0.00519480519480535*G0_1_1_3_5_3 - 0.00883116883116911*G0_1_1_3_5_5 - 0.000649350649350672*G0_1_1_4_0_0 + 0.000681818181818204*G0_1_1_4_0_1 - 0.00175324675324681*G0_1_1_4_0_2 - 0.00103896103896107*G0_1_1_4_0_3 - 0.00155844155844161*G0_1_1_4_0_4 - 0.00103896103896108*G0_1_1_4_0_5 + 0.000681818181818204*G0_1_1_4_1_0 + 0.000292207792207803*G0_1_1_4_1_1 - 0.00155844155844161*G0_1_1_4_1_2 - 0.00285714285714296*G0_1_1_4_1_3 - 0.00233766233766242*G0_1_1_4_1_4 - 0.000649350649350673*G0_1_1_4_1_5 - 0.00175324675324681*G0_1_1_4_2_0 - 0.00155844155844161*G0_1_1_4_2_1 + 0.00941558441558477*G0_1_1_4_2_2 + 0.00805194805194833*G0_1_1_4_2_3 + 0.00623376623376647*G0_1_1_4_2_4 + 0.00103896103896107*G0_1_1_4_2_5 - 0.00103896103896107*G0_1_1_4_3_0 - 0.00285714285714296*G0_1_1_4_3_1 + 0.00805194805194833*G0_1_1_4_3_2 + 0.00623376623376646*G0_1_1_4_3_3 + 0.006753246753247*G0_1_1_4_3_4 - 0.00155844155844161*G0_1_1_4_4_0 - 0.00233766233766242*G0_1_1_4_4_1 + 0.00623376623376647*G0_1_1_4_4_2 + 0.00675324675324699*G0_1_1_4_4_3 + 0.0140259740259745*G0_1_1_4_4_4 + 0.0025974025974027*G0_1_1_4_4_5 - 0.00103896103896108*G0_1_1_4_5_0 - 0.000649350649350673*G0_1_1_4_5_1 + 0.00103896103896107*G0_1_1_4_5_2 + 0.0025974025974027*G0_1_1_4_5_4 - 0.00623376623376642*G0_1_1_4_5_5 - 0.00633116883116906*G0_1_1_5_0_0 + 0.00337662337662349*G0_1_1_5_0_1 - 0.000162337662337667*G0_1_1_5_0_2 + 0.000649350649350668*G0_1_1_5_0_3 - 0.00103896103896108*G0_1_1_5_0_4 - 0.00506493506493527*G0_1_1_5_0_5 + 0.00337662337662349*G0_1_1_5_1_0 - 0.00538961038961058*G0_1_1_5_1_1 - 0.00233766233766242*G0_1_1_5_1_3 - 0.000649350649350672*G0_1_1_5_1_4 - 0.00467532467532484*G0_1_1_5_1_5 - 0.000162337662337667*G0_1_1_5_2_0 + 0.00103896103896108*G0_1_1_5_2_2 + 0.00285714285714296*G0_1_1_5_2_3 + 0.00103896103896107*G0_1_1_5_2_4 + 0.00376623376623389*G0_1_1_5_2_5 + 0.000649350649350668*G0_1_1_5_3_0 - 0.00233766233766242*G0_1_1_5_3_1 + 0.00285714285714296*G0_1_1_5_3_2 - 0.00519480519480535*G0_1_1_5_3_3 - 0.00883116883116911*G0_1_1_5_3_5 - 0.00103896103896108*G0_1_1_5_4_0 - 0.000649350649350673*G0_1_1_5_4_1 + 0.00103896103896107*G0_1_1_5_4_2 + 0.0025974025974027*G0_1_1_5_4_4 - 0.00623376623376642*G0_1_1_5_4_5 - 0.00506493506493527*G0_1_1_5_5_0 - 0.00467532467532484*G0_1_1_5_5_1 + 0.00376623376623389*G0_1_1_5_5_2 - 0.00883116883116911*G0_1_1_5_5_3 - 0.00623376623376642*G0_1_1_5_5_4 - 0.107532467532471*G0_1_1_5_5_5; + A[26] = -A[24] - 0.0129626623376628*G0_1_1_0_0_0 + 0.00112283549783554*G0_1_1_0_0_1 + 0.000357142857142869*G0_1_1_0_0_2 - 0.00100108225108228*G0_1_1_0_0_3 - 0.00315476190476201*G0_1_1_0_0_4 - 0.00739718614718641*G0_1_1_0_0_5 + 0.00112283549783554*G0_1_1_0_1_0 + 0.00112283549783553*G0_1_1_0_1_1 - 0.000359848484848497*G0_1_1_0_1_2 + 0.000221861471861479*G0_1_1_0_1_3 + 0.000221861471861479*G0_1_1_0_1_4 + 0.00275974025974035*G0_1_1_0_1_5 + 0.000357142857142869*G0_1_1_0_2_0 - 0.000359848484848497*G0_1_1_0_2_1 + 0.00557359307359326*G0_1_1_0_2_2 + 0.000216450216450225*G0_1_1_0_2_3 + 0.00194805194805202*G0_1_1_0_2_4 - 0.000146103896103898*G0_1_1_0_2_5 - 0.00100108225108228*G0_1_1_0_3_0 + 0.000221861471861479*G0_1_1_0_3_1 + 0.000216450216450226*G0_1_1_0_3_2 + 0.00385281385281397*G0_1_1_0_3_3 + 0.00155844155844161*G0_1_1_0_3_4 + 0.00229437229437237*G0_1_1_0_3_5 - 0.00315476190476201*G0_1_1_0_4_0 + 0.000221861471861479*G0_1_1_0_4_1 + 0.00194805194805202*G0_1_1_0_4_2 + 0.00155844155844161*G0_1_1_0_4_3 - 0.00220779220779228*G0_1_1_0_4_4 - 0.00015151515151516*G0_1_1_0_4_5 - 0.00739718614718641*G0_1_1_0_5_0 + 0.00275974025974035*G0_1_1_0_5_1 - 0.000146103896103898*G0_1_1_0_5_2 + 0.00229437229437237*G0_1_1_0_5_3 - 0.00015151515151516*G0_1_1_0_5_4 - 0.0030735930735932*G0_1_1_0_5_5 + 0.00112283549783554*G0_1_1_1_0_0 + 0.00112283549783553*G0_1_1_1_0_1 - 0.000359848484848497*G0_1_1_1_0_2 + 0.000221861471861479*G0_1_1_1_0_3 + 0.000221861471861479*G0_1_1_1_0_4 + 0.00275974025974035*G0_1_1_1_0_5 + 0.00112283549783553*G0_1_1_1_1_0 - 0.0129626623376628*G0_1_1_1_1_1 + 0.00035714285714287*G0_1_1_1_1_2 - 0.00315476190476201*G0_1_1_1_1_3 - 0.00100108225108228*G0_1_1_1_1_4 - 0.00739718614718641*G0_1_1_1_1_5 - 0.000359848484848497*G0_1_1_1_2_0 + 0.000357142857142871*G0_1_1_1_2_1 + 0.00557359307359326*G0_1_1_1_2_2 + 0.00194805194805201*G0_1_1_1_2_3 + 0.000216450216450225*G0_1_1_1_2_4 - 0.0001461038961039*G0_1_1_1_2_5 + 0.000221861471861479*G0_1_1_1_3_0 - 0.00315476190476201*G0_1_1_1_3_1 + 0.00194805194805201*G0_1_1_1_3_2 - 0.0022077922077923*G0_1_1_1_3_3 + 0.00155844155844161*G0_1_1_1_3_4 - 0.00015151515151516*G0_1_1_1_3_5 + 0.000221861471861479*G0_1_1_1_4_0 - 0.00100108225108228*G0_1_1_1_4_1 + 0.000216450216450225*G0_1_1_1_4_2 + 0.00155844155844161*G0_1_1_1_4_3 + 0.00385281385281398*G0_1_1_1_4_4 + 0.00229437229437237*G0_1_1_1_4_5 + 0.00275974025974035*G0_1_1_1_5_0 - 0.00739718614718641*G0_1_1_1_5_1 - 0.0001461038961039*G0_1_1_1_5_2 - 0.00015151515151516*G0_1_1_1_5_3 + 0.00229437229437237*G0_1_1_1_5_4 - 0.00307359307359318*G0_1_1_1_5_5 + 0.000357142857142869*G0_1_1_2_0_0 - 0.000359848484848497*G0_1_1_2_0_1 + 0.00557359307359326*G0_1_1_2_0_2 + 0.000216450216450225*G0_1_1_2_0_3 + 0.00194805194805202*G0_1_1_2_0_4 - 0.000146103896103898*G0_1_1_2_0_5 - 0.000359848484848497*G0_1_1_2_1_0 + 0.00035714285714287*G0_1_1_2_1_1 + 0.00557359307359326*G0_1_1_2_1_2 + 0.00194805194805201*G0_1_1_2_1_3 + 0.000216450216450225*G0_1_1_2_1_4 - 0.0001461038961039*G0_1_1_2_1_5 + 0.00557359307359326*G0_1_1_2_2_0 + 0.00557359307359326*G0_1_1_2_2_1 - 0.114042207792212*G0_1_1_2_2_2 - 0.0240259740259749*G0_1_1_2_2_3 - 0.0240259740259749*G0_1_1_2_2_4 - 0.00173160173160181*G0_1_1_2_2_5 + 0.000216450216450225*G0_1_1_2_3_0 + 0.00194805194805201*G0_1_1_2_3_1 - 0.0240259740259749*G0_1_1_2_3_2 - 0.00173160173160179*G0_1_1_2_3_3 - 0.000865800865800901*G0_1_1_2_3_4 + 0.00303030303030313*G0_1_1_2_3_5 + 0.00194805194805202*G0_1_1_2_4_0 + 0.000216450216450225*G0_1_1_2_4_1 - 0.0240259740259749*G0_1_1_2_4_2 - 0.000865800865800901*G0_1_1_2_4_3 - 0.00173160173160182*G0_1_1_2_4_4 + 0.00303030303030313*G0_1_1_2_4_5 - 0.000146103896103898*G0_1_1_2_5_0 - 0.0001461038961039*G0_1_1_2_5_1 - 0.00173160173160181*G0_1_1_2_5_2 + 0.00303030303030313*G0_1_1_2_5_3 + 0.00303030303030313*G0_1_1_2_5_4 + 0.00489177489177506*G0_1_1_2_5_5 - 0.00100108225108228*G0_1_1_3_0_0 + 0.000221861471861479*G0_1_1_3_0_1 + 0.000216450216450226*G0_1_1_3_0_2 + 0.00385281385281397*G0_1_1_3_0_3 + 0.00155844155844161*G0_1_1_3_0_4 + 0.00229437229437237*G0_1_1_3_0_5 + 0.000221861471861479*G0_1_1_3_1_0 - 0.00315476190476201*G0_1_1_3_1_1 + 0.00194805194805201*G0_1_1_3_1_2 - 0.00220779220779229*G0_1_1_3_1_3 + 0.00155844155844161*G0_1_1_3_1_4 - 0.000151515151515161*G0_1_1_3_1_5 + 0.000216450216450225*G0_1_1_3_2_0 + 0.00194805194805201*G0_1_1_3_2_1 - 0.0240259740259749*G0_1_1_3_2_2 - 0.0017316017316018*G0_1_1_3_2_3 - 0.000865800865800905*G0_1_1_3_2_4 + 0.00303030303030313*G0_1_1_3_2_5 + 0.00385281385281397*G0_1_1_3_3_0 - 0.0022077922077923*G0_1_1_3_3_1 - 0.00173160173160179*G0_1_1_3_3_2 - 0.0324675324675335*G0_1_1_3_3_3 - 0.0108225108225112*G0_1_1_3_3_4 - 0.0137662337662342*G0_1_1_3_3_5 + 0.00155844155844161*G0_1_1_3_4_0 + 0.00155844155844161*G0_1_1_3_4_1 - 0.000865800865800903*G0_1_1_3_4_2 - 0.0108225108225112*G0_1_1_3_4_3 - 0.0108225108225112*G0_1_1_3_4_4 - 0.00917748917748948*G0_1_1_3_4_5 + 0.00229437229437237*G0_1_1_3_5_0 - 0.00015151515151516*G0_1_1_3_5_1 + 0.00303030303030313*G0_1_1_3_5_2 - 0.0137662337662342*G0_1_1_3_5_3 - 0.00917748917748948*G0_1_1_3_5_4 - 0.0143722943722948*G0_1_1_3_5_5 - 0.00315476190476201*G0_1_1_4_0_0 + 0.000221861471861479*G0_1_1_4_0_1 + 0.00194805194805202*G0_1_1_4_0_2 + 0.00155844155844161*G0_1_1_4_0_3 - 0.00220779220779228*G0_1_1_4_0_4 - 0.000151515151515161*G0_1_1_4_0_5 + 0.000221861471861479*G0_1_1_4_1_0 - 0.00100108225108228*G0_1_1_4_1_1 + 0.000216450216450225*G0_1_1_4_1_2 + 0.00155844155844161*G0_1_1_4_1_3 + 0.00385281385281398*G0_1_1_4_1_4 + 0.00229437229437237*G0_1_1_4_1_5 + 0.00194805194805202*G0_1_1_4_2_0 + 0.000216450216450225*G0_1_1_4_2_1 - 0.0240259740259749*G0_1_1_4_2_2 - 0.000865800865800903*G0_1_1_4_2_3 - 0.00173160173160182*G0_1_1_4_2_4 + 0.00303030303030313*G0_1_1_4_2_5 + 0.00155844155844161*G0_1_1_4_3_0 + 0.00155844155844161*G0_1_1_4_3_1 - 0.000865800865800903*G0_1_1_4_3_2 - 0.0108225108225112*G0_1_1_4_3_3 - 0.0108225108225112*G0_1_1_4_3_4 - 0.00917748917748948*G0_1_1_4_3_5 - 0.00220779220779228*G0_1_1_4_4_0 + 0.00385281385281398*G0_1_1_4_4_1 - 0.00173160173160182*G0_1_1_4_4_2 - 0.0108225108225112*G0_1_1_4_4_3 - 0.0324675324675336*G0_1_1_4_4_4 - 0.0137662337662342*G0_1_1_4_4_5 - 0.00015151515151516*G0_1_1_4_5_0 + 0.00229437229437237*G0_1_1_4_5_1 + 0.00303030303030313*G0_1_1_4_5_2 - 0.00917748917748948*G0_1_1_4_5_3 - 0.0137662337662342*G0_1_1_4_5_4 - 0.0143722943722948*G0_1_1_4_5_5 - 0.00739718614718641*G0_1_1_5_0_0 + 0.00275974025974035*G0_1_1_5_0_1 - 0.000146103896103898*G0_1_1_5_0_2 + 0.00229437229437237*G0_1_1_5_0_3 - 0.000151515151515161*G0_1_1_5_0_4 - 0.0030735930735932*G0_1_1_5_0_5 + 0.00275974025974035*G0_1_1_5_1_0 - 0.00739718614718641*G0_1_1_5_1_1 - 0.0001461038961039*G0_1_1_5_1_2 - 0.00015151515151516*G0_1_1_5_1_3 + 0.00229437229437237*G0_1_1_5_1_4 - 0.00307359307359318*G0_1_1_5_1_5 - 0.000146103896103898*G0_1_1_5_2_0 - 0.0001461038961039*G0_1_1_5_2_1 - 0.00173160173160181*G0_1_1_5_2_2 + 0.00303030303030313*G0_1_1_5_2_3 + 0.00303030303030313*G0_1_1_5_2_4 + 0.00489177489177506*G0_1_1_5_2_5 + 0.00229437229437237*G0_1_1_5_3_0 - 0.00015151515151516*G0_1_1_5_3_1 + 0.00303030303030313*G0_1_1_5_3_2 - 0.0137662337662342*G0_1_1_5_3_3 - 0.00917748917748948*G0_1_1_5_3_4 - 0.0143722943722948*G0_1_1_5_3_5 - 0.000151515151515161*G0_1_1_5_4_0 + 0.00229437229437237*G0_1_1_5_4_1 + 0.00303030303030313*G0_1_1_5_4_2 - 0.00917748917748948*G0_1_1_5_4_3 - 0.0137662337662342*G0_1_1_5_4_4 - 0.0143722943722948*G0_1_1_5_4_5 - 0.0030735930735932*G0_1_1_5_5_0 - 0.00307359307359318*G0_1_1_5_5_1 + 0.00489177489177506*G0_1_1_5_5_2 - 0.0143722943722948*G0_1_1_5_5_3 - 0.0143722943722948*G0_1_1_5_5_4 - 0.0800000000000027*G0_1_1_5_5_5; + A[84] = -A[34] + 0.00398133116883133*G0_0_0_0_0_0 - 0.000206980519480526*G0_0_0_0_0_1 - 0.00209415584415592*G0_0_0_0_0_2 + 0.000487012987013001*G0_0_0_0_0_3 + 0.000243506493506505*G0_0_0_0_0_5 - 0.000206980519480526*G0_0_0_0_1_0 - 0.000365259740259755*G0_0_0_0_1_1 - 0.000438311688311703*G0_0_0_0_1_2 + 0.0012175324675325*G0_0_0_0_1_3 - 0.000292207792207803*G0_0_0_0_1_4 + 0.000487012987013003*G0_0_0_0_1_5 - 0.00209415584415592*G0_0_0_0_2_0 - 0.000438311688311703*G0_0_0_0_2_1 + 0.0099959415584419*G0_0_0_0_2_2 + 0.00102272727272732*G0_0_0_0_2_3 + 0.00808441558441586*G0_0_0_0_2_4 + 0.000487012987013001*G0_0_0_0_3_0 + 0.0012175324675325*G0_0_0_0_3_1 + 0.00102272727272732*G0_0_0_0_3_2 - 0.00798701298701324*G0_0_0_0_3_3 - 0.000389610389610397*G0_0_0_0_3_4 - 0.000779220779220811*G0_0_0_0_3_5 - 0.000292207792207803*G0_0_0_0_4_1 + 0.00808441558441586*G0_0_0_0_4_2 - 0.000389610389610397*G0_0_0_0_4_3 + 0.0175324675324681*G0_0_0_0_4_4 + 0.000779220779220805*G0_0_0_0_4_5 + 0.000243506493506505*G0_0_0_0_5_0 + 0.000487012987013003*G0_0_0_0_5_1 - 0.000779220779220811*G0_0_0_0_5_3 + 0.000779220779220805*G0_0_0_0_5_4 + 0.000974025974025987*G0_0_0_0_5_5 - 0.000206980519480526*G0_0_0_1_0_0 - 0.000365259740259755*G0_0_0_1_0_1 - 0.000438311688311703*G0_0_0_1_0_2 + 0.0012175324675325*G0_0_0_1_0_3 - 0.000292207792207803*G0_0_0_1_0_4 + 0.000487012987013003*G0_0_0_1_0_5 - 0.000365259740259755*G0_0_0_1_1_0 + 0.00401785714285734*G0_0_0_1_1_1 - 0.000243506493506504*G0_0_0_1_1_2 + 0.00365259740259753*G0_0_0_1_1_3 + 0.000243506493506501*G0_0_0_1_1_4 + 0.000730519480519521*G0_0_0_1_1_5 - 0.000438311688311703*G0_0_0_1_2_0 - 0.000243506493506504*G0_0_0_1_2_1 + 0.00451704545454561*G0_0_0_1_2_2 - 0.00146103896103901*G0_0_0_1_2_3 + 0.00228896103896112*G0_0_0_1_2_4 - 0.000243506493506501*G0_0_0_1_2_5 + 0.0012175324675325*G0_0_0_1_3_0 + 0.00365259740259753*G0_0_0_1_3_1 - 0.00146103896103901*G0_0_0_1_3_2 - 0.0146103896103901*G0_0_0_1_3_3 - 0.00292207792207801*G0_0_0_1_3_4 - 0.00194805194805201*G0_0_0_1_3_5 - 0.000292207792207803*G0_0_0_1_4_0 + 0.000243506493506501*G0_0_0_1_4_1 + 0.00228896103896112*G0_0_0_1_4_2 - 0.00292207792207801*G0_0_0_1_4_3 + 0.00389610389610403*G0_0_0_1_4_4 + 0.000487012987013003*G0_0_0_1_5_0 + 0.000730519480519521*G0_0_0_1_5_1 - 0.000243506493506501*G0_0_0_1_5_2 - 0.00194805194805201*G0_0_0_1_5_3 + 0.000974025974026018*G0_0_0_1_5_5 - 0.00209415584415592*G0_0_0_2_0_0 - 0.000438311688311703*G0_0_0_2_0_1 + 0.0099959415584419*G0_0_0_2_0_2 + 0.00102272727272732*G0_0_0_2_0_3 + 0.00808441558441586*G0_0_0_2_0_4 - 0.000438311688311703*G0_0_0_2_1_0 - 0.000243506493506505*G0_0_0_2_1_1 + 0.00451704545454561*G0_0_0_2_1_2 - 0.00146103896103901*G0_0_0_2_1_3 + 0.00228896103896112*G0_0_0_2_1_4 - 0.000243506493506501*G0_0_0_2_1_5 + 0.0099959415584419*G0_0_0_2_2_0 + 0.00451704545454561*G0_0_0_2_2_1 - 0.119805194805199*G0_0_0_2_2_2 - 0.0155844155844162*G0_0_0_2_2_3 - 0.0457792207792224*G0_0_0_2_2_4 - 0.00209415584415594*G0_0_0_2_2_5 + 0.00102272727272732*G0_0_0_2_3_0 - 0.00146103896103901*G0_0_0_2_3_1 - 0.0155844155844162*G0_0_0_2_3_2 + 0.0124675324675329*G0_0_0_2_3_3 - 0.00662337662337687*G0_0_0_2_3_4 + 0.0021428571428572*G0_0_0_2_3_5 + 0.00808441558441586*G0_0_0_2_4_0 + 0.00228896103896112*G0_0_0_2_4_1 - 0.0457792207792224*G0_0_0_2_4_2 - 0.00662337662337687*G0_0_0_2_4_3 - 0.0459740259740276*G0_0_0_2_4_4 - 0.000389610389610418*G0_0_0_2_4_5 - 0.000243506493506501*G0_0_0_2_5_1 - 0.00209415584415594*G0_0_0_2_5_2 + 0.0021428571428572*G0_0_0_2_5_3 - 0.000389610389610419*G0_0_0_2_5_4 + 0.00389610389610402*G0_0_0_2_5_5 + 0.000487012987013001*G0_0_0_3_0_0 + 0.0012175324675325*G0_0_0_3_0_1 + 0.00102272727272732*G0_0_0_3_0_2 - 0.00798701298701324*G0_0_0_3_0_3 - 0.000389610389610397*G0_0_0_3_0_4 - 0.00077922077922081*G0_0_0_3_0_5 + 0.0012175324675325*G0_0_0_3_1_0 + 0.00365259740259753*G0_0_0_3_1_1 - 0.00146103896103901*G0_0_0_3_1_2 - 0.0146103896103901*G0_0_0_3_1_3 - 0.00292207792207801*G0_0_0_3_1_4 - 0.00194805194805201*G0_0_0_3_1_5 + 0.00102272727272732*G0_0_0_3_2_0 - 0.00146103896103901*G0_0_0_3_2_1 - 0.0155844155844162*G0_0_0_3_2_2 + 0.0124675324675329*G0_0_0_3_2_3 - 0.00662337662337687*G0_0_0_3_2_4 + 0.0021428571428572*G0_0_0_3_2_5 - 0.00798701298701324*G0_0_0_3_3_0 - 0.0146103896103901*G0_0_0_3_3_1 + 0.0124675324675329*G0_0_0_3_3_2 + 0.130909090909096*G0_0_0_3_3_3 + 0.0218181818181825*G0_0_0_3_3_4 + 0.0116883116883121*G0_0_0_3_3_5 - 0.000389610389610397*G0_0_0_3_4_0 - 0.00292207792207801*G0_0_0_3_4_1 - 0.00662337662337687*G0_0_0_3_4_2 + 0.0218181818181825*G0_0_0_3_4_3 - 0.00701298701298726*G0_0_0_3_4_4 + 0.00155844155844162*G0_0_0_3_4_5 - 0.00077922077922081*G0_0_0_3_5_0 - 0.00194805194805201*G0_0_0_3_5_1 + 0.0021428571428572*G0_0_0_3_5_2 + 0.0116883116883121*G0_0_0_3_5_3 + 0.00155844155844162*G0_0_0_3_5_4 - 0.00623376623376642*G0_0_0_3_5_5 - 0.000292207792207803*G0_0_0_4_0_1 + 0.00808441558441586*G0_0_0_4_0_2 - 0.000389610389610397*G0_0_0_4_0_3 + 0.0175324675324681*G0_0_0_4_0_4 + 0.000779220779220805*G0_0_0_4_0_5 - 0.000292207792207803*G0_0_0_4_1_0 + 0.000243506493506501*G0_0_0_4_1_1 + 0.00228896103896112*G0_0_0_4_1_2 - 0.00292207792207801*G0_0_0_4_1_3 + 0.00389610389610402*G0_0_0_4_1_4 + 0.00808441558441586*G0_0_0_4_2_0 + 0.00228896103896112*G0_0_0_4_2_1 - 0.0457792207792224*G0_0_0_4_2_2 - 0.00662337662337687*G0_0_0_4_2_3 - 0.0459740259740276*G0_0_0_4_2_4 - 0.000389610389610419*G0_0_0_4_2_5 - 0.000389610389610397*G0_0_0_4_3_0 - 0.00292207792207801*G0_0_0_4_3_1 - 0.00662337662337687*G0_0_0_4_3_2 + 0.0218181818181825*G0_0_0_4_3_3 - 0.00701298701298726*G0_0_0_4_3_4 + 0.00155844155844162*G0_0_0_4_3_5 + 0.0175324675324681*G0_0_0_4_4_0 + 0.00389610389610403*G0_0_0_4_4_1 - 0.0459740259740276*G0_0_0_4_4_2 - 0.00701298701298726*G0_0_0_4_4_3 - 0.128571428571433*G0_0_0_4_4_4 - 0.00701298701298726*G0_0_0_4_4_5 + 0.000779220779220805*G0_0_0_4_5_0 - 0.000389610389610419*G0_0_0_4_5_2 + 0.00155844155844162*G0_0_0_4_5_3 - 0.00701298701298726*G0_0_0_4_5_4 - 0.00779220779220805*G0_0_0_4_5_5 + 0.000243506493506505*G0_0_0_5_0_0 + 0.000487012987013003*G0_0_0_5_0_1 - 0.000779220779220811*G0_0_0_5_0_3 + 0.000779220779220805*G0_0_0_5_0_4 + 0.000974025974025987*G0_0_0_5_0_5 + 0.000487012987013003*G0_0_0_5_1_0 + 0.000730519480519521*G0_0_0_5_1_1 - 0.000243506493506501*G0_0_0_5_1_2 - 0.00194805194805201*G0_0_0_5_1_3 + 0.000974025974026018*G0_0_0_5_1_5 - 0.000243506493506501*G0_0_0_5_2_1 - 0.00209415584415594*G0_0_0_5_2_2 + 0.0021428571428572*G0_0_0_5_2_3 - 0.000389610389610419*G0_0_0_5_2_4 + 0.00389610389610402*G0_0_0_5_2_5 - 0.000779220779220811*G0_0_0_5_3_0 - 0.00194805194805201*G0_0_0_5_3_1 + 0.0021428571428572*G0_0_0_5_3_2 + 0.0116883116883121*G0_0_0_5_3_3 + 0.00155844155844162*G0_0_0_5_3_4 - 0.00623376623376642*G0_0_0_5_3_5 + 0.000779220779220805*G0_0_0_5_4_0 - 0.000389610389610419*G0_0_0_5_4_2 + 0.00155844155844162*G0_0_0_5_4_3 - 0.00701298701298726*G0_0_0_5_4_4 - 0.00779220779220805*G0_0_0_5_4_5 + 0.000974025974025987*G0_0_0_5_5_0 + 0.000974025974026018*G0_0_0_5_5_1 + 0.00389610389610402*G0_0_0_5_5_2 - 0.00623376623376642*G0_0_0_5_5_3 - 0.00779220779220805*G0_0_0_5_5_4 - 0.0303896103896115*G0_0_0_5_5_5 + 0.000255681818181895*G0_0_1_0_0_0 - 0.000572240259740282*G0_0_1_0_0_2 + 0.00487012987013001*G0_0_1_0_0_3 + 0.00199675324675332*G0_0_1_0_0_4 + 0.000681818181818196*G0_0_1_0_0_5 - 0.00547889610389628*G0_0_1_0_1_1 + 0.00012175324675325*G0_0_1_0_1_2 + 0.002435064935065*G0_0_1_0_1_3 + 0.00194805194805201*G0_0_1_0_1_4 + 0.000974025974026005*G0_0_1_0_1_5 - 0.000572240259740282*G0_0_1_0_2_0 + 0.00012175324675325*G0_0_1_0_2_1 + 0.000231331168831183*G0_0_1_0_2_2 + 0.00194805194805201*G0_0_1_0_2_3 + 0.00224025974025981*G0_0_1_0_2_4 + 0.00165584415584421*G0_0_1_0_2_5 + 0.00487012987013001*G0_0_1_0_3_0 + 0.002435064935065*G0_0_1_0_3_1 + 0.00194805194805201*G0_0_1_0_3_2 - 0.0372077922077933*G0_0_1_0_3_3 - 0.013636363636364*G0_0_1_0_3_4 - 0.0130519480519485*G0_0_1_0_3_5 + 0.00199675324675332*G0_0_1_0_4_0 + 0.00194805194805201*G0_0_1_0_4_1 + 0.00224025974025981*G0_0_1_0_4_2 - 0.013636363636364*G0_0_1_0_4_3 - 0.0062337662337664*G0_0_1_0_4_4 - 0.00720779220779243*G0_0_1_0_4_5 + 0.000681818181818196*G0_0_1_0_5_0 + 0.000974025974026005*G0_0_1_0_5_1 + 0.00165584415584421*G0_0_1_0_5_2 - 0.0130519480519485*G0_0_1_0_5_3 - 0.00720779220779243*G0_0_1_0_5_4 - 0.00876623376623409*G0_0_1_0_5_5 - 0.00547889610389628*G0_0_1_1_0_1 + 0.00012175324675325*G0_0_1_1_0_2 + 0.002435064935065*G0_0_1_1_0_3 + 0.00194805194805201*G0_0_1_1_0_4 + 0.000974025974026004*G0_0_1_1_0_5 - 0.00547889610389629*G0_0_1_1_1_0 + 0.0854707792207822*G0_0_1_1_1_1 - 0.00328733766233778*G0_0_1_1_1_2 + 0.0204545454545461*G0_0_1_1_1_3 + 0.002922077922078*G0_0_1_1_1_4 + 0.0204545454545462*G0_0_1_1_1_5 + 0.00012175324675325*G0_0_1_1_2_0 - 0.00328733766233778*G0_0_1_1_2_1 - 0.00487012987013004*G0_0_1_1_2_3 + 0.000487012987013004*G0_0_1_1_2_4 - 0.00048701298701301*G0_0_1_1_2_5 + 0.002435064935065*G0_0_1_1_3_0 + 0.0204545454545461*G0_0_1_1_3_1 - 0.00487012987013004*G0_0_1_1_3_2 - 0.0194805194805201*G0_0_1_1_3_3 - 0.010714285714286*G0_0_1_1_3_4 - 0.00389610389610399*G0_0_1_1_3_5 + 0.00194805194805201*G0_0_1_1_4_0 + 0.00292207792207801*G0_0_1_1_4_1 + 0.000487012987013004*G0_0_1_1_4_2 - 0.010714285714286*G0_0_1_1_4_3 - 0.00584415584415602*G0_0_1_1_4_4 - 0.00487012987013002*G0_0_1_1_4_5 + 0.000974025974026004*G0_0_1_1_5_0 + 0.0204545454545462*G0_0_1_1_5_1 - 0.00048701298701301*G0_0_1_1_5_2 - 0.00389610389610399*G0_0_1_1_5_3 - 0.00487012987013002*G0_0_1_1_5_4 + 0.00389610389610407*G0_0_1_1_5_5 - 0.000572240259740282*G0_0_1_2_0_0 + 0.00012175324675325*G0_0_1_2_0_1 + 0.000231331168831183*G0_0_1_2_0_2 + 0.00194805194805201*G0_0_1_2_0_3 + 0.00224025974025981*G0_0_1_2_0_4 + 0.00165584415584421*G0_0_1_2_0_5 + 0.00012175324675325*G0_0_1_2_1_0 - 0.00328733766233778*G0_0_1_2_1_1 - 0.00487012987013004*G0_0_1_2_1_3 + 0.000487012987013004*G0_0_1_2_1_4 - 0.00048701298701301*G0_0_1_2_1_5 + 0.000231331168831183*G0_0_1_2_2_0 - 0.0100446428571433*G0_0_1_2_2_2 + 0.00681818181818203*G0_0_1_2_2_3 - 0.00267857142857154*G0_0_1_2_2_4 + 0.00165584415584421*G0_0_1_2_2_5 + 0.00194805194805201*G0_0_1_2_3_0 - 0.00487012987013004*G0_0_1_2_3_1 + 0.00681818181818203*G0_0_1_2_3_2 + 0.00175324675324682*G0_0_1_2_3_3 - 0.00487012987013003*G0_0_1_2_3_4 - 0.00720779220779244*G0_0_1_2_3_5 + 0.00224025974025981*G0_0_1_2_4_0 + 0.000487012987013004*G0_0_1_2_4_1 - 0.00267857142857154*G0_0_1_2_4_2 - 0.00487012987013003*G0_0_1_2_4_3 - 0.00857142857142887*G0_0_1_2_4_4 - 0.00428571428571442*G0_0_1_2_4_5 + 0.00165584415584421*G0_0_1_2_5_0 - 0.00048701298701301*G0_0_1_2_5_1 + 0.00165584415584421*G0_0_1_2_5_2 - 0.00720779220779244*G0_0_1_2_5_3 - 0.00428571428571442*G0_0_1_2_5_4 - 0.00097402597402599*G0_0_1_2_5_5 + 0.00487012987013001*G0_0_1_3_0_0 + 0.002435064935065*G0_0_1_3_0_1 + 0.00194805194805201*G0_0_1_3_0_2 - 0.0372077922077933*G0_0_1_3_0_3 - 0.013636363636364*G0_0_1_3_0_4 - 0.0130519480519485*G0_0_1_3_0_5 + 0.002435064935065*G0_0_1_3_1_0 + 0.0204545454545461*G0_0_1_3_1_1 - 0.00487012987013004*G0_0_1_3_1_2 - 0.0194805194805201*G0_0_1_3_1_3 - 0.010714285714286*G0_0_1_3_1_4 - 0.00389610389610399*G0_0_1_3_1_5 + 0.00194805194805201*G0_0_1_3_2_0 - 0.00487012987013004*G0_0_1_3_2_1 + 0.00681818181818203*G0_0_1_3_2_2 + 0.00175324675324683*G0_0_1_3_2_3 - 0.00487012987013003*G0_0_1_3_2_4 - 0.00720779220779244*G0_0_1_3_2_5 - 0.0372077922077933*G0_0_1_3_3_0 - 0.0194805194805201*G0_0_1_3_3_1 + 0.00175324675324683*G0_0_1_3_3_2 + 0.448831168831184*G0_0_1_3_3_3 + 0.0958441558441589*G0_0_1_3_3_4 + 0.0888311688311718*G0_0_1_3_3_5 - 0.013636363636364*G0_0_1_3_4_0 - 0.010714285714286*G0_0_1_3_4_1 - 0.00487012987013003*G0_0_1_3_4_2 + 0.0958441558441589*G0_0_1_3_4_3 + 0.0389610389610402*G0_0_1_3_4_4 + 0.035844155844157*G0_0_1_3_4_5 - 0.0130519480519485*G0_0_1_3_5_0 - 0.00389610389610399*G0_0_1_3_5_1 - 0.00720779220779244*G0_0_1_3_5_2 + 0.0888311688311718*G0_0_1_3_5_3 + 0.035844155844157*G0_0_1_3_5_4 + 0.0280519480519489*G0_0_1_3_5_5 + 0.00199675324675332*G0_0_1_4_0_0 + 0.00194805194805201*G0_0_1_4_0_1 + 0.00224025974025981*G0_0_1_4_0_2 - 0.013636363636364*G0_0_1_4_0_3 - 0.0062337662337664*G0_0_1_4_0_4 - 0.00720779220779243*G0_0_1_4_0_5 + 0.00194805194805201*G0_0_1_4_1_0 + 0.002922077922078*G0_0_1_4_1_1 + 0.000487012987013004*G0_0_1_4_1_2 - 0.010714285714286*G0_0_1_4_1_3 - 0.00584415584415602*G0_0_1_4_1_4 - 0.00487012987013002*G0_0_1_4_1_5 + 0.00224025974025981*G0_0_1_4_2_0 + 0.000487012987013004*G0_0_1_4_2_1 - 0.00267857142857154*G0_0_1_4_2_2 - 0.00487012987013003*G0_0_1_4_2_3 - 0.00857142857142887*G0_0_1_4_2_4 - 0.00428571428571442*G0_0_1_4_2_5 - 0.013636363636364*G0_0_1_4_3_0 - 0.010714285714286*G0_0_1_4_3_1 - 0.00487012987013003*G0_0_1_4_3_2 + 0.0958441558441589*G0_0_1_4_3_3 + 0.0389610389610402*G0_0_1_4_3_4 + 0.035844155844157*G0_0_1_4_3_5 - 0.0062337662337664*G0_0_1_4_4_0 - 0.00584415584415602*G0_0_1_4_4_1 - 0.00857142857142887*G0_0_1_4_4_2 + 0.0389610389610402*G0_0_1_4_4_3 + 0.0202597402597409*G0_0_1_4_4_5 - 0.00720779220779243*G0_0_1_4_5_0 - 0.00487012987013002*G0_0_1_4_5_1 - 0.00428571428571442*G0_0_1_4_5_2 + 0.035844155844157*G0_0_1_4_5_3 + 0.0202597402597409*G0_0_1_4_5_4 + 0.011688311688312*G0_0_1_4_5_5 + 0.000681818181818196*G0_0_1_5_0_0 + 0.000974025974026004*G0_0_1_5_0_1 + 0.00165584415584421*G0_0_1_5_0_2 - 0.0130519480519485*G0_0_1_5_0_3 - 0.00720779220779243*G0_0_1_5_0_4 - 0.00876623376623409*G0_0_1_5_0_5 + 0.000974025974026004*G0_0_1_5_1_0 + 0.0204545454545462*G0_0_1_5_1_1 - 0.00048701298701301*G0_0_1_5_1_2 - 0.00389610389610399*G0_0_1_5_1_3 - 0.00487012987013002*G0_0_1_5_1_4 + 0.00389610389610407*G0_0_1_5_1_5 + 0.00165584415584421*G0_0_1_5_2_0 - 0.00048701298701301*G0_0_1_5_2_1 + 0.00165584415584421*G0_0_1_5_2_2 - 0.00720779220779244*G0_0_1_5_2_3 - 0.00428571428571442*G0_0_1_5_2_4 - 0.000974025974025989*G0_0_1_5_2_5 - 0.0130519480519485*G0_0_1_5_3_0 - 0.00389610389610399*G0_0_1_5_3_1 - 0.00720779220779244*G0_0_1_5_3_2 + 0.0888311688311718*G0_0_1_5_3_3 + 0.035844155844157*G0_0_1_5_3_4 + 0.0280519480519489*G0_0_1_5_3_5 - 0.00720779220779243*G0_0_1_5_4_0 - 0.00487012987013002*G0_0_1_5_4_1 - 0.00428571428571442*G0_0_1_5_4_2 + 0.035844155844157*G0_0_1_5_4_3 + 0.0202597402597409*G0_0_1_5_4_4 + 0.011688311688312*G0_0_1_5_4_5 - 0.00876623376623409*G0_0_1_5_5_0 + 0.00389610389610407*G0_0_1_5_5_1 - 0.000974025974025989*G0_0_1_5_5_2 + 0.0280519480519489*G0_0_1_5_5_3 + 0.011688311688312*G0_0_1_5_5_4 - 0.0981818181818218*G0_0_1_5_5_5; + A[59] = A[69] - 0.0243262987012996*G0_0_0_0_0_0 + 0.00284902597402607*G0_0_0_0_0_1 + 0.00657467532467556*G0_0_0_0_0_2 - 0.00350649350649361*G0_0_0_0_0_3 - 0.0298051948051958*G0_0_0_0_0_4 - 0.00964285714285749*G0_0_0_0_0_5 + 0.00284902597402607*G0_0_0_0_1_0 - 0.000219155844155856*G0_0_0_0_1_1 - 0.00131493506493511*G0_0_0_0_1_2 - 0.0017532467532468*G0_0_0_0_1_3 + 0.00350649350649364*G0_0_0_0_1_4 + 0.00175324675324682*G0_0_0_0_1_5 + 0.00657467532467556*G0_0_0_0_2_0 - 0.00131493506493511*G0_0_0_0_2_1 - 0.00482142857142875*G0_0_0_0_2_2 + 0.0035064935064936*G0_0_0_0_2_3 + 0.00701298701298726*G0_0_0_0_2_4 + 0.00350649350649363*G0_0_0_0_2_5 - 0.00350649350649361*G0_0_0_0_3_0 - 0.0017532467532468*G0_0_0_0_3_1 + 0.0035064935064936*G0_0_0_0_3_2 + 0.0210389610389617*G0_0_0_0_3_3 - 0.0298051948051958*G0_0_0_0_4_0 + 0.00350649350649364*G0_0_0_0_4_1 + 0.00701298701298726*G0_0_0_0_4_2 - 0.0631168831168853*G0_0_0_0_4_4 - 0.0140259740259745*G0_0_0_0_4_5 - 0.00964285714285749*G0_0_0_0_5_0 + 0.00175324675324682*G0_0_0_0_5_1 + 0.00350649350649363*G0_0_0_0_5_2 - 0.0140259740259745*G0_0_0_0_5_4 - 0.0105194805194809*G0_0_0_0_5_5 + 0.00284902597402607*G0_0_0_1_0_0 - 0.000219155844155856*G0_0_0_1_0_1 - 0.00131493506493511*G0_0_0_1_0_2 - 0.0017532467532468*G0_0_0_1_0_3 + 0.00350649350649364*G0_0_0_1_0_4 + 0.00175324675324682*G0_0_0_1_0_5 - 0.000219155844155856*G0_0_0_1_1_0 + 0.000657467532467569*G0_0_0_1_1_1 - 0.00131493506493511*G0_0_0_1_1_2 - 0.0105194805194809*G0_0_0_1_1_3 - 0.00525974025974044*G0_0_0_1_1_4 - 0.00262987012987022*G0_0_0_1_1_5 - 0.00131493506493511*G0_0_0_1_2_0 - 0.00131493506493511*G0_0_0_1_2_1 + 0.00832792207792235*G0_0_0_1_2_2 + 0.0140259740259745*G0_0_0_1_2_3 - 0.00350649350649363*G0_0_0_1_2_4 - 0.00175324675324681*G0_0_0_1_2_5 - 0.0017532467532468*G0_0_0_1_3_0 - 0.0105194805194809*G0_0_0_1_3_1 + 0.0140259740259745*G0_0_0_1_3_2 + 0.0350649350649362*G0_0_0_1_3_3 + 0.0140259740259745*G0_0_0_1_3_4 + 0.00701298701298725*G0_0_0_1_3_5 + 0.00350649350649364*G0_0_0_1_4_0 - 0.00525974025974044*G0_0_0_1_4_1 - 0.00350649350649363*G0_0_0_1_4_2 + 0.0140259740259745*G0_0_0_1_4_3 + 0.0350649350649362*G0_0_0_1_4_4 + 0.0140259740259745*G0_0_0_1_4_5 + 0.00175324675324682*G0_0_0_1_5_0 - 0.00262987012987022*G0_0_0_1_5_1 - 0.00175324675324681*G0_0_0_1_5_2 + 0.00701298701298725*G0_0_0_1_5_3 + 0.0140259740259745*G0_0_0_1_5_4 + 0.0105194805194809*G0_0_0_1_5_5 + 0.00657467532467556*G0_0_0_2_0_0 - 0.00131493506493511*G0_0_0_2_0_1 - 0.00482142857142875*G0_0_0_2_0_2 + 0.0035064935064936*G0_0_0_2_0_3 + 0.00701298701298726*G0_0_0_2_0_4 + 0.00350649350649363*G0_0_0_2_0_5 - 0.00131493506493511*G0_0_0_2_1_0 - 0.00131493506493511*G0_0_0_2_1_1 + 0.00832792207792235*G0_0_0_2_1_2 + 0.0140259740259745*G0_0_0_2_1_3 - 0.00350649350649363*G0_0_0_2_1_4 - 0.00175324675324681*G0_0_0_2_1_5 - 0.00482142857142874*G0_0_0_2_2_0 + 0.00832792207792235*G0_0_0_2_2_1 - 0.0131493506493511*G0_0_0_2_2_2 - 0.0438311688311703*G0_0_0_2_2_3 + 0.00876623376623407*G0_0_0_2_2_4 - 0.00350649350649363*G0_0_0_2_2_5 + 0.0035064935064936*G0_0_0_2_3_0 + 0.0140259740259745*G0_0_0_2_3_1 - 0.0438311688311703*G0_0_0_2_3_2 - 0.0701298701298725*G0_0_0_2_3_3 + 0.00701298701298726*G0_0_0_2_4_0 - 0.00350649350649363*G0_0_0_2_4_1 + 0.00876623376623407*G0_0_0_2_4_2 + 0.0701298701298725*G0_0_0_2_4_4 + 0.0140259740259745*G0_0_0_2_4_5 + 0.00350649350649363*G0_0_0_2_5_0 - 0.00175324675324681*G0_0_0_2_5_1 - 0.00350649350649363*G0_0_0_2_5_2 + 0.0140259740259745*G0_0_0_2_5_4 + 0.00701298701298726*G0_0_0_2_5_5 - 0.00350649350649361*G0_0_0_3_0_0 - 0.0017532467532468*G0_0_0_3_0_1 + 0.0035064935064936*G0_0_0_3_0_2 + 0.0210389610389617*G0_0_0_3_0_3 - 0.0017532467532468*G0_0_0_3_1_0 - 0.0105194805194809*G0_0_0_3_1_1 + 0.0140259740259745*G0_0_0_3_1_2 + 0.0350649350649362*G0_0_0_3_1_3 + 0.0140259740259745*G0_0_0_3_1_4 + 0.00701298701298725*G0_0_0_3_1_5 + 0.0035064935064936*G0_0_0_3_2_0 + 0.0140259740259745*G0_0_0_3_2_1 - 0.0438311688311703*G0_0_0_3_2_2 - 0.0701298701298725*G0_0_0_3_2_3 + 0.0210389610389617*G0_0_0_3_3_0 + 0.0350649350649362*G0_0_0_3_3_1 - 0.0701298701298725*G0_0_0_3_3_2 - 0.490909090909108*G0_0_0_3_3_3 - 0.0701298701298724*G0_0_0_3_3_4 - 0.0420779220779236*G0_0_0_3_3_5 + 0.0140259740259745*G0_0_0_3_4_1 - 0.0701298701298724*G0_0_0_3_4_3 - 0.0701298701298724*G0_0_0_3_4_4 - 0.028051948051949*G0_0_0_3_4_5 + 0.00701298701298725*G0_0_0_3_5_1 - 0.0420779220779236*G0_0_0_3_5_3 - 0.028051948051949*G0_0_0_3_5_4 - 0.0140259740259745*G0_0_0_3_5_5 - 0.0298051948051958*G0_0_0_4_0_0 + 0.00350649350649364*G0_0_0_4_0_1 + 0.00701298701298725*G0_0_0_4_0_2 - 0.0631168831168853*G0_0_0_4_0_4 - 0.0140259740259745*G0_0_0_4_0_5 + 0.00350649350649364*G0_0_0_4_1_0 - 0.00525974025974044*G0_0_0_4_1_1 - 0.00350649350649363*G0_0_0_4_1_2 + 0.0140259740259745*G0_0_0_4_1_3 + 0.0350649350649362*G0_0_0_4_1_4 + 0.0140259740259745*G0_0_0_4_1_5 + 0.00701298701298726*G0_0_0_4_2_0 - 0.00350649350649363*G0_0_0_4_2_1 + 0.00876623376623407*G0_0_0_4_2_2 + 0.0701298701298725*G0_0_0_4_2_4 + 0.0140259740259745*G0_0_0_4_2_5 + 0.0140259740259745*G0_0_0_4_3_1 - 0.0701298701298724*G0_0_0_4_3_3 - 0.0701298701298724*G0_0_0_4_3_4 - 0.028051948051949*G0_0_0_4_3_5 - 0.0631168831168853*G0_0_0_4_4_0 + 0.0350649350649362*G0_0_0_4_4_1 + 0.0701298701298725*G0_0_0_4_4_2 - 0.0701298701298724*G0_0_0_4_4_3 - 0.490909090909107*G0_0_0_4_4_4 - 0.0981818181818215*G0_0_0_4_4_5 - 0.0140259740259745*G0_0_0_4_5_0 + 0.0140259740259745*G0_0_0_4_5_1 + 0.0140259740259745*G0_0_0_4_5_2 - 0.028051948051949*G0_0_0_4_5_3 - 0.0981818181818215*G0_0_0_4_5_4 - 0.0420779220779235*G0_0_0_4_5_5 - 0.00964285714285749*G0_0_0_5_0_0 + 0.00175324675324682*G0_0_0_5_0_1 + 0.00350649350649363*G0_0_0_5_0_2 - 0.0140259740259745*G0_0_0_5_0_4 - 0.0105194805194809*G0_0_0_5_0_5 + 0.00175324675324682*G0_0_0_5_1_0 - 0.00262987012987022*G0_0_0_5_1_1 - 0.00175324675324681*G0_0_0_5_1_2 + 0.00701298701298725*G0_0_0_5_1_3 + 0.0140259740259745*G0_0_0_5_1_4 + 0.0105194805194809*G0_0_0_5_1_5 + 0.00350649350649363*G0_0_0_5_2_0 - 0.00175324675324681*G0_0_0_5_2_1 - 0.00350649350649363*G0_0_0_5_2_2 + 0.0140259740259745*G0_0_0_5_2_4 + 0.00701298701298726*G0_0_0_5_2_5 + 0.00701298701298725*G0_0_0_5_3_1 - 0.0420779220779236*G0_0_0_5_3_3 - 0.028051948051949*G0_0_0_5_3_4 - 0.0140259740259745*G0_0_0_5_3_5 - 0.0140259740259745*G0_0_0_5_4_0 + 0.0140259740259745*G0_0_0_5_4_1 + 0.0140259740259745*G0_0_0_5_4_2 - 0.028051948051949*G0_0_0_5_4_3 - 0.0981818181818215*G0_0_0_5_4_4 - 0.0420779220779235*G0_0_0_5_4_5 - 0.0105194805194809*G0_0_0_5_5_0 + 0.0105194805194809*G0_0_0_5_5_1 + 0.00701298701298726*G0_0_0_5_5_2 - 0.0140259740259745*G0_0_0_5_5_3 - 0.0420779220779235*G0_0_0_5_5_4 - 0.028051948051949*G0_0_0_5_5_5 - 0.0111769480519485*G0_0_1_0_0_0 + 0.00262987012987023*G0_0_1_0_0_1 + 0.00109577922077927*G0_0_1_0_0_2 - 0.00438311688311702*G0_0_1_0_0_3 - 0.0105194805194809*G0_0_1_0_0_4 - 0.0113961038961043*G0_0_1_0_0_5 + 0.00262987012987023*G0_0_1_0_1_0 + 0.000219155844155851*G0_0_1_0_1_1 - 0.00219155844155852*G0_0_1_0_1_2 - 0.0026298701298702*G0_0_1_0_1_3 + 0.000876623376623416*G0_0_1_0_1_4 + 0.00350649350649365*G0_0_1_0_1_5 + 0.00109577922077927*G0_0_1_0_2_0 - 0.00219155844155852*G0_0_1_0_2_1 + 0.00613636363636384*G0_0_1_0_2_2 + 0.00701298701298723*G0_0_1_0_2_3 + 0.00701298701298726*G0_0_1_0_2_4 + 0.00262987012987023*G0_0_1_0_2_5 - 0.00438311688311702*G0_0_1_0_3_0 - 0.0026298701298702*G0_0_1_0_3_1 + 0.00701298701298724*G0_0_1_0_3_2 + 0.0280519480519489*G0_0_1_0_3_3 + 0.00701298701298723*G0_0_1_0_3_4 + 0.00350649350649361*G0_0_1_0_3_5 - 0.0105194805194809*G0_0_1_0_4_0 + 0.000876623376623416*G0_0_1_0_4_1 + 0.00701298701298726*G0_0_1_0_4_2 + 0.00701298701298723*G0_0_1_0_4_3 - 0.00701298701298728*G0_0_1_0_4_4 - 0.00701298701298728*G0_0_1_0_4_5 - 0.0113961038961043*G0_0_1_0_5_0 + 0.00350649350649365*G0_0_1_0_5_1 + 0.00262987012987023*G0_0_1_0_5_2 + 0.00350649350649361*G0_0_1_0_5_3 - 0.00701298701298728*G0_0_1_0_5_4 - 0.010519480519481*G0_0_1_0_5_5 + 0.00262987012987023*G0_0_1_1_0_0 + 0.000219155844155851*G0_0_1_1_0_1 - 0.00219155844155852*G0_0_1_1_0_2 - 0.0026298701298702*G0_0_1_1_0_3 + 0.000876623376623417*G0_0_1_1_0_4 + 0.00350649350649365*G0_0_1_1_0_5 + 0.000219155844155851*G0_0_1_1_1_0 - 0.00241071428571437*G0_0_1_1_1_2 - 0.0122727272727277*G0_0_1_1_1_3 - 0.00438311688311703*G0_0_1_1_1_4 - 0.00525974025974047*G0_0_1_1_1_5 - 0.00219155844155852*G0_0_1_1_2_0 - 0.00241071428571437*G0_0_1_1_2_1 + 0.0140259740259745*G0_0_1_1_2_2 + 0.019285714285715*G0_0_1_1_2_3 + 0.00350649350649363*G0_0_1_1_2_4 - 0.000876623376623402*G0_0_1_1_2_5 - 0.0026298701298702*G0_0_1_1_3_0 - 0.0122727272727277*G0_0_1_1_3_1 + 0.019285714285715*G0_0_1_1_3_2 + 0.0420779220779235*G0_0_1_1_3_3 + 0.0140259740259745*G0_0_1_1_3_4 + 0.00701298701298724*G0_0_1_1_3_5 + 0.000876623376623416*G0_0_1_1_4_0 - 0.00438311688311703*G0_0_1_1_4_1 + 0.00350649350649363*G0_0_1_1_4_2 + 0.0140259740259745*G0_0_1_1_4_3 + 0.0140259740259745*G0_0_1_1_4_4 + 0.0105194805194809*G0_0_1_1_4_5 + 0.00350649350649365*G0_0_1_1_5_0 - 0.00525974025974047*G0_0_1_1_5_1 - 0.000876623376623402*G0_0_1_1_5_2 + 0.00701298701298724*G0_0_1_1_5_3 + 0.0105194805194809*G0_0_1_1_5_4 + 0.0140259740259745*G0_0_1_1_5_5 + 0.00109577922077927*G0_0_1_2_0_0 - 0.00219155844155852*G0_0_1_2_0_1 + 0.00613636363636384*G0_0_1_2_0_2 + 0.00701298701298723*G0_0_1_2_0_3 + 0.00701298701298726*G0_0_1_2_0_4 + 0.00262987012987023*G0_0_1_2_0_5 - 0.00219155844155852*G0_0_1_2_1_0 - 0.00241071428571437*G0_0_1_2_1_1 + 0.0140259740259745*G0_0_1_2_1_2 + 0.019285714285715*G0_0_1_2_1_3 + 0.00350649350649363*G0_0_1_2_1_4 - 0.000876623376623402*G0_0_1_2_1_5 + 0.00613636363636384*G0_0_1_2_2_0 + 0.0140259740259745*G0_0_1_2_2_1 - 0.0854707792207824*G0_0_1_2_2_2 - 0.0683766233766258*G0_0_1_2_2_3 - 0.0280519480519491*G0_0_1_2_2_4 - 0.00701298701298728*G0_0_1_2_2_5 + 0.00701298701298723*G0_0_1_2_3_0 + 0.019285714285715*G0_0_1_2_3_1 - 0.0683766233766258*G0_0_1_2_3_2 - 0.0911688311688343*G0_0_1_2_3_3 - 0.0210389610389618*G0_0_1_2_3_4 + 0.00701298701298726*G0_0_1_2_4_0 + 0.00350649350649363*G0_0_1_2_4_1 - 0.0280519480519491*G0_0_1_2_4_2 - 0.0210389610389618*G0_0_1_2_4_3 - 0.00701298701298729*G0_0_1_2_4_4 + 0.00701298701298725*G0_0_1_2_4_5 + 0.00262987012987023*G0_0_1_2_5_0 - 0.000876623376623402*G0_0_1_2_5_1 - 0.00701298701298728*G0_0_1_2_5_2 + 0.00701298701298725*G0_0_1_2_5_4 + 0.0175324675324682*G0_0_1_2_5_5 - 0.00438311688311702*G0_0_1_3_0_0 - 0.0026298701298702*G0_0_1_3_0_1 + 0.00701298701298723*G0_0_1_3_0_2 + 0.0280519480519489*G0_0_1_3_0_3 + 0.00701298701298723*G0_0_1_3_0_4 + 0.00350649350649361*G0_0_1_3_0_5 - 0.0026298701298702*G0_0_1_3_1_0 - 0.0122727272727277*G0_0_1_3_1_1 + 0.019285714285715*G0_0_1_3_1_2 + 0.0420779220779235*G0_0_1_3_1_3 + 0.0140259740259745*G0_0_1_3_1_4 + 0.00701298701298724*G0_0_1_3_1_5 + 0.00701298701298723*G0_0_1_3_2_0 + 0.019285714285715*G0_0_1_3_2_1 - 0.0683766233766258*G0_0_1_3_2_2 - 0.0911688311688343*G0_0_1_3_2_3 - 0.0210389610389618*G0_0_1_3_2_4 + 0.0280519480519489*G0_0_1_3_3_0 + 0.0420779220779235*G0_0_1_3_3_1 - 0.0911688311688344*G0_0_1_3_3_2 - 0.532987012987032*G0_0_1_3_3_3 - 0.084155844155847*G0_0_1_3_3_4 - 0.0561038961038981*G0_0_1_3_3_5 + 0.00701298701298723*G0_0_1_3_4_0 + 0.0140259740259745*G0_0_1_3_4_1 - 0.0210389610389618*G0_0_1_3_4_2 - 0.084155844155847*G0_0_1_3_4_3 - 0.0420779220779235*G0_0_1_3_4_4 - 0.028051948051949*G0_0_1_3_4_5 + 0.00350649350649361*G0_0_1_3_5_0 + 0.00701298701298724*G0_0_1_3_5_1 - 0.0561038961038981*G0_0_1_3_5_3 - 0.028051948051949*G0_0_1_3_5_4 - 0.0420779220779236*G0_0_1_3_5_5 - 0.0105194805194809*G0_0_1_4_0_0 + 0.000876623376623416*G0_0_1_4_0_1 + 0.00701298701298726*G0_0_1_4_0_2 + 0.00701298701298723*G0_0_1_4_0_3 - 0.00701298701298728*G0_0_1_4_0_4 - 0.00701298701298728*G0_0_1_4_0_5 + 0.000876623376623416*G0_0_1_4_1_0 - 0.00438311688311703*G0_0_1_4_1_1 + 0.00350649350649363*G0_0_1_4_1_2 + 0.0140259740259745*G0_0_1_4_1_3 + 0.0140259740259745*G0_0_1_4_1_4 + 0.0105194805194809*G0_0_1_4_1_5 + 0.00701298701298726*G0_0_1_4_2_0 + 0.00350649350649363*G0_0_1_4_2_1 - 0.0280519480519491*G0_0_1_4_2_2 - 0.0210389610389618*G0_0_1_4_2_3 - 0.00701298701298729*G0_0_1_4_2_4 + 0.00701298701298725*G0_0_1_4_2_5 + 0.00701298701298723*G0_0_1_4_3_0 + 0.0140259740259745*G0_0_1_4_3_1 - 0.0210389610389618*G0_0_1_4_3_2 - 0.084155844155847*G0_0_1_4_3_3 - 0.0420779220779235*G0_0_1_4_3_4 - 0.028051948051949*G0_0_1_4_3_5 - 0.00701298701298728*G0_0_1_4_4_0 + 0.0140259740259745*G0_0_1_4_4_1 - 0.00701298701298728*G0_0_1_4_4_2 - 0.0420779220779235*G0_0_1_4_4_3 - 0.0701298701298725*G0_0_1_4_4_4 - 0.0420779220779235*G0_0_1_4_4_5 - 0.00701298701298729*G0_0_1_4_5_0 + 0.0105194805194809*G0_0_1_4_5_1 + 0.00701298701298725*G0_0_1_4_5_2 - 0.028051948051949*G0_0_1_4_5_3 - 0.0420779220779235*G0_0_1_4_5_4 - 0.0561038961038981*G0_0_1_4_5_5 - 0.0113961038961043*G0_0_1_5_0_0 + 0.00350649350649365*G0_0_1_5_0_1 + 0.00262987012987023*G0_0_1_5_0_2 + 0.00350649350649361*G0_0_1_5_0_3 - 0.00701298701298728*G0_0_1_5_0_4 - 0.010519480519481*G0_0_1_5_0_5 + 0.00350649350649365*G0_0_1_5_1_0 - 0.00525974025974047*G0_0_1_5_1_1 - 0.000876623376623402*G0_0_1_5_1_2 + 0.00701298701298724*G0_0_1_5_1_3 + 0.0105194805194809*G0_0_1_5_1_4 + 0.0140259740259745*G0_0_1_5_1_5 + 0.00262987012987023*G0_0_1_5_2_0 - 0.000876623376623402*G0_0_1_5_2_1 - 0.00701298701298728*G0_0_1_5_2_2 + 0.00701298701298725*G0_0_1_5_2_4 + 0.0175324675324682*G0_0_1_5_2_5 + 0.00350649350649361*G0_0_1_5_3_0 + 0.00701298701298724*G0_0_1_5_3_1 - 0.0561038961038981*G0_0_1_5_3_3 - 0.028051948051949*G0_0_1_5_3_4 - 0.0420779220779236*G0_0_1_5_3_5 - 0.00701298701298728*G0_0_1_5_4_0 + 0.0105194805194809*G0_0_1_5_4_1 + 0.00701298701298725*G0_0_1_5_4_2 - 0.028051948051949*G0_0_1_5_4_3 - 0.0420779220779235*G0_0_1_5_4_4 - 0.0561038961038981*G0_0_1_5_4_5 - 0.010519480519481*G0_0_1_5_5_0 + 0.0140259740259745*G0_0_1_5_5_1 + 0.0175324675324682*G0_0_1_5_5_2 - 0.0420779220779236*G0_0_1_5_5_3 - 0.0561038961038981*G0_0_1_5_5_4 - 0.15428571428572*G0_0_1_5_5_5 + 0.0479951298701317*G0_1_0_0_0_0 - 0.00284902597402608*G0_1_0_0_0_1 - 0.00438311688311704*G0_1_0_0_0_2 + 0.00701298701298729*G0_1_0_0_0_4 + 0.014902597402598*G0_1_0_0_0_5 - 0.00284902597402608*G0_1_0_0_1_0 + 0.000876623376623404*G0_1_0_0_1_1 - 0.000438311688311699*G0_1_0_0_1_2 - 0.00262987012987021*G0_1_0_0_1_3 - 0.00350649350649362*G0_1_0_0_1_4 - 0.00350649350649363*G0_1_0_0_1_5 - 0.00438311688311704*G0_1_0_0_2_0 - 0.000438311688311699*G0_1_0_0_2_1 + 0.000657467532467539*G0_1_0_0_2_2 + 0.00438311688311701*G0_1_0_0_2_3 + 0.00701298701298723*G0_1_0_0_2_4 - 0.00262987012987021*G0_1_0_0_3_1 + 0.00438311688311701*G0_1_0_0_3_2 + 0.0105194805194808*G0_1_0_0_3_3 + 0.00701298701298723*G0_1_0_0_3_4 + 0.00701298701298729*G0_1_0_0_4_0 - 0.00350649350649362*G0_1_0_0_4_1 + 0.00701298701298723*G0_1_0_0_4_2 + 0.00701298701298723*G0_1_0_0_4_3 + 0.0140259740259743*G0_1_0_0_4_4 + 0.00701298701298725*G0_1_0_0_4_5 + 0.014902597402598*G0_1_0_0_5_0 - 0.00350649350649363*G0_1_0_0_5_1 + 0.00701298701298725*G0_1_0_0_5_4 + 0.0105194805194809*G0_1_0_0_5_5 - 0.00284902597402608*G0_1_0_1_0_0 + 0.000876623376623404*G0_1_0_1_0_1 - 0.000438311688311699*G0_1_0_1_0_2 - 0.00262987012987021*G0_1_0_1_0_3 - 0.00350649350649361*G0_1_0_1_0_4 - 0.00350649350649363*G0_1_0_1_0_5 + 0.000876623376623404*G0_1_0_1_1_0 + 0.00131493506493511*G0_1_0_1_1_1 - 0.00175324675324681*G0_1_0_1_1_2 - 0.00788961038961065*G0_1_0_1_1_3 - 0.00613636363636384*G0_1_0_1_1_4 - 0.000876623376623405*G0_1_0_1_1_5 - 0.000438311688311699*G0_1_0_1_2_0 - 0.00175324675324681*G0_1_0_1_2_1 + 0.00854707792207821*G0_1_0_1_2_2 + 0.0122727272727277*G0_1_0_1_2_3 - 0.000876623376623411*G0_1_0_1_2_4 - 0.000876623376623404*G0_1_0_1_2_5 - 0.00262987012987021*G0_1_0_1_3_0 - 0.00788961038961065*G0_1_0_1_3_1 + 0.0122727272727277*G0_1_0_1_3_2 + 0.0315584415584426*G0_1_0_1_3_3 + 0.0175324675324681*G0_1_0_1_3_4 + 0.00701298701298726*G0_1_0_1_3_5 - 0.00350649350649362*G0_1_0_1_4_0 - 0.00613636363636384*G0_1_0_1_4_1 - 0.00087662337662341*G0_1_0_1_4_2 + 0.0175324675324681*G0_1_0_1_4_3 + 0.0561038961038979*G0_1_0_1_4_4 + 0.0140259740259745*G0_1_0_1_4_5 - 0.00350649350649363*G0_1_0_1_5_0 - 0.000876623376623405*G0_1_0_1_5_1 - 0.000876623376623404*G0_1_0_1_5_2 + 0.00701298701298726*G0_1_0_1_5_3 + 0.0140259740259745*G0_1_0_1_5_4 + 0.00350649350649363*G0_1_0_1_5_5 - 0.00438311688311704*G0_1_0_2_0_0 - 0.000438311688311699*G0_1_0_2_0_1 + 0.000657467532467539*G0_1_0_2_0_2 + 0.00438311688311701*G0_1_0_2_0_3 + 0.00701298701298723*G0_1_0_2_0_4 - 0.000438311688311699*G0_1_0_2_1_0 - 0.00175324675324681*G0_1_0_2_1_1 + 0.00854707792207821*G0_1_0_2_1_2 + 0.0122727272727277*G0_1_0_2_1_3 - 0.000876623376623411*G0_1_0_2_1_4 - 0.000876623376623404*G0_1_0_2_1_5 + 0.000657467532467539*G0_1_0_2_2_0 + 0.00854707792207821*G0_1_0_2_2_1 - 0.0262987012987022*G0_1_0_2_2_2 - 0.0420779220779235*G0_1_0_2_2_3 - 0.0105194805194808*G0_1_0_2_2_4 - 0.00262987012987022*G0_1_0_2_2_5 + 0.00438311688311701*G0_1_0_2_3_0 + 0.0122727272727277*G0_1_0_2_3_1 - 0.0420779220779235*G0_1_0_2_3_2 - 0.0701298701298725*G0_1_0_2_3_3 - 0.00701298701298724*G0_1_0_2_3_4 - 0.00350649350649363*G0_1_0_2_3_5 + 0.00701298701298723*G0_1_0_2_4_0 - 0.000876623376623411*G0_1_0_2_4_1 - 0.0105194805194808*G0_1_0_2_4_2 - 0.00701298701298724*G0_1_0_2_4_3 + 0.0140259740259745*G0_1_0_2_4_4 + 0.00701298701298725*G0_1_0_2_4_5 - 0.000876623376623405*G0_1_0_2_5_1 - 0.00262987012987022*G0_1_0_2_5_2 - 0.00350649350649363*G0_1_0_2_5_3 + 0.00701298701298725*G0_1_0_2_5_4 - 0.00262987012987021*G0_1_0_3_0_1 + 0.00438311688311701*G0_1_0_3_0_2 + 0.0105194805194808*G0_1_0_3_0_3 + 0.00701298701298723*G0_1_0_3_0_4 - 0.00262987012987021*G0_1_0_3_1_0 - 0.00788961038961065*G0_1_0_3_1_1 + 0.0122727272727277*G0_1_0_3_1_2 + 0.0315584415584426*G0_1_0_3_1_3 + 0.0175324675324681*G0_1_0_3_1_4 + 0.00701298701298726*G0_1_0_3_1_5 + 0.00438311688311701*G0_1_0_3_2_0 + 0.0122727272727277*G0_1_0_3_2_1 - 0.0420779220779235*G0_1_0_3_2_2 - 0.0701298701298725*G0_1_0_3_2_3 - 0.00701298701298724*G0_1_0_3_2_4 - 0.00350649350649363*G0_1_0_3_2_5 + 0.0105194805194808*G0_1_0_3_3_0 + 0.0315584415584426*G0_1_0_3_3_1 - 0.0701298701298725*G0_1_0_3_3_2 - 0.364675324675337*G0_1_0_3_3_3 - 0.056103896103898*G0_1_0_3_3_4 - 0.0140259740259746*G0_1_0_3_3_5 + 0.00701298701298723*G0_1_0_3_4_0 + 0.0175324675324681*G0_1_0_3_4_1 - 0.00701298701298724*G0_1_0_3_4_2 - 0.056103896103898*G0_1_0_3_4_3 - 0.12623376623377*G0_1_0_3_4_4 - 0.028051948051949*G0_1_0_3_4_5 + 0.00701298701298726*G0_1_0_3_5_1 - 0.00350649350649363*G0_1_0_3_5_2 - 0.0140259740259746*G0_1_0_3_5_3 - 0.028051948051949*G0_1_0_3_5_4 + 0.00701298701298729*G0_1_0_4_0_0 - 0.00350649350649361*G0_1_0_4_0_1 + 0.00701298701298723*G0_1_0_4_0_2 + 0.00701298701298722*G0_1_0_4_0_3 + 0.0140259740259743*G0_1_0_4_0_4 + 0.00701298701298725*G0_1_0_4_0_5 - 0.00350649350649362*G0_1_0_4_1_0 - 0.00613636363636384*G0_1_0_4_1_1 - 0.00087662337662341*G0_1_0_4_1_2 + 0.0175324675324681*G0_1_0_4_1_3 + 0.0561038961038979*G0_1_0_4_1_4 + 0.0140259740259745*G0_1_0_4_1_5 + 0.00701298701298723*G0_1_0_4_2_0 - 0.00087662337662341*G0_1_0_4_2_1 - 0.0105194805194808*G0_1_0_4_2_2 - 0.00701298701298724*G0_1_0_4_2_3 + 0.0140259740259745*G0_1_0_4_2_4 + 0.00701298701298725*G0_1_0_4_2_5 + 0.00701298701298722*G0_1_0_4_3_0 + 0.0175324675324681*G0_1_0_4_3_1 - 0.00701298701298724*G0_1_0_4_3_2 - 0.056103896103898*G0_1_0_4_3_3 - 0.12623376623377*G0_1_0_4_3_4 - 0.028051948051949*G0_1_0_4_3_5 + 0.0140259740259743*G0_1_0_4_4_0 + 0.0561038961038979*G0_1_0_4_4_1 + 0.0140259740259745*G0_1_0_4_4_2 - 0.12623376623377*G0_1_0_4_4_3 - 0.911688311688341*G0_1_0_4_4_4 - 0.12623376623377*G0_1_0_4_4_5 + 0.00701298701298725*G0_1_0_4_5_0 + 0.0140259740259745*G0_1_0_4_5_1 + 0.00701298701298725*G0_1_0_4_5_2 - 0.028051948051949*G0_1_0_4_5_3 - 0.12623376623377*G0_1_0_4_5_4 - 0.028051948051949*G0_1_0_4_5_5 + 0.014902597402598*G0_1_0_5_0_0 - 0.00350649350649363*G0_1_0_5_0_1 + 0.00701298701298725*G0_1_0_5_0_4 + 0.0105194805194809*G0_1_0_5_0_5 - 0.00350649350649363*G0_1_0_5_1_0 - 0.000876623376623405*G0_1_0_5_1_1 - 0.000876623376623405*G0_1_0_5_1_2 + 0.00701298701298726*G0_1_0_5_1_3 + 0.0140259740259745*G0_1_0_5_1_4 + 0.00350649350649363*G0_1_0_5_1_5 - 0.000876623376623404*G0_1_0_5_2_1 - 0.00262987012987022*G0_1_0_5_2_2 - 0.00350649350649363*G0_1_0_5_2_3 + 0.00701298701298725*G0_1_0_5_2_4 + 0.00701298701298726*G0_1_0_5_3_1 - 0.00350649350649363*G0_1_0_5_3_2 - 0.0140259740259746*G0_1_0_5_3_3 - 0.028051948051949*G0_1_0_5_3_4 + 0.00701298701298725*G0_1_0_5_4_0 + 0.0140259740259745*G0_1_0_5_4_1 + 0.00701298701298725*G0_1_0_5_4_2 - 0.028051948051949*G0_1_0_5_4_3 - 0.12623376623377*G0_1_0_5_4_4 - 0.028051948051949*G0_1_0_5_4_5 + 0.0105194805194809*G0_1_0_5_5_0 + 0.00350649350649363*G0_1_0_5_5_1 - 0.028051948051949*G0_1_0_5_5_4 + 0.0140259740259746*G0_1_0_5_5_5 + 0.0742938311688341*G0_1_1_0_0_0 - 0.0113961038961043*G0_1_1_0_0_1 - 0.00504058441558461*G0_1_1_0_0_2 + 0.00262987012987022*G0_1_1_0_0_3 + 0.0175324675324682*G0_1_1_0_0_4 + 0.0569805194805216*G0_1_1_0_0_5 - 0.0113961038961043*G0_1_1_0_1_0 + 0.00262987012987023*G0_1_1_0_1_1 - 0.00175324675324681*G0_1_1_0_1_3 - 0.00262987012987022*G0_1_1_0_1_4 - 0.0157792207792214*G0_1_1_0_1_5 - 0.00504058441558461*G0_1_1_0_2_0 + 0.00504058441558459*G0_1_1_0_2_2 + 0.00438311688311702*G0_1_1_0_2_3 - 0.00438311688311705*G0_1_1_0_2_5 + 0.00262987012987022*G0_1_1_0_3_0 - 0.00175324675324681*G0_1_1_0_3_1 + 0.00438311688311702*G0_1_1_0_3_2 + 0.0105194805194808*G0_1_1_0_3_3 + 0.00350649350649363*G0_1_1_0_3_5 + 0.0175324675324682*G0_1_1_0_4_0 - 0.00262987012987022*G0_1_1_0_4_1 + 0.0140259740259745*G0_1_1_0_4_5 + 0.0569805194805216*G0_1_1_0_5_0 - 0.0157792207792214*G0_1_1_0_5_1 - 0.00438311688311705*G0_1_1_0_5_2 + 0.00350649350649363*G0_1_1_0_5_3 + 0.0140259740259745*G0_1_1_0_5_4 + 0.0806493506493537*G0_1_1_0_5_5 - 0.0113961038961043*G0_1_1_1_0_0 + 0.00262987012987023*G0_1_1_1_0_1 - 0.00175324675324681*G0_1_1_1_0_3 - 0.00262987012987022*G0_1_1_1_0_4 - 0.0157792207792214*G0_1_1_1_0_5 + 0.00262987012987023*G0_1_1_1_1_0 - 0.00262987012987022*G0_1_1_1_1_2 - 0.00701298701298725*G0_1_1_1_1_3 + 0.00701298701298725*G0_1_1_1_1_5 - 0.00262987012987022*G0_1_1_1_2_1 + 0.0113961038961043*G0_1_1_1_2_2 + 0.0157792207792213*G0_1_1_1_2_3 + 0.00262987012987022*G0_1_1_1_2_4 + 0.00175324675324682*G0_1_1_1_2_5 - 0.00175324675324681*G0_1_1_1_3_0 - 0.00701298701298726*G0_1_1_1_3_1 + 0.0157792207792213*G0_1_1_1_3_2 + 0.028051948051949*G0_1_1_1_3_3 + 0.00350649350649363*G0_1_1_1_3_4 - 0.00262987012987022*G0_1_1_1_4_0 + 0.00262987012987022*G0_1_1_1_4_2 + 0.00350649350649363*G0_1_1_1_4_3 - 0.00350649350649363*G0_1_1_1_4_5 - 0.0157792207792214*G0_1_1_1_5_0 + 0.00701298701298725*G0_1_1_1_5_1 + 0.00175324675324682*G0_1_1_1_5_2 - 0.00350649350649363*G0_1_1_1_5_4 - 0.0280519480519491*G0_1_1_1_5_5 - 0.00504058441558461*G0_1_1_2_0_0 + 0.00504058441558459*G0_1_1_2_0_2 + 0.00438311688311702*G0_1_1_2_0_3 - 0.00438311688311705*G0_1_1_2_0_5 - 0.00262987012987022*G0_1_1_2_1_1 + 0.0113961038961043*G0_1_1_2_1_2 + 0.0157792207792213*G0_1_1_2_1_3 + 0.00262987012987022*G0_1_1_2_1_4 + 0.00175324675324682*G0_1_1_2_1_5 + 0.00504058441558459*G0_1_1_2_2_0 + 0.0113961038961043*G0_1_1_2_2_1 - 0.074293831168834*G0_1_1_2_2_2 - 0.0569805194805215*G0_1_1_2_2_3 - 0.0175324675324682*G0_1_1_2_2_4 - 0.00262987012987024*G0_1_1_2_2_5 + 0.00438311688311702*G0_1_1_2_3_0 + 0.0157792207792213*G0_1_1_2_3_1 - 0.0569805194805215*G0_1_1_2_3_2 - 0.0806493506493535*G0_1_1_2_3_3 - 0.0140259740259745*G0_1_1_2_3_4 - 0.00350649350649364*G0_1_1_2_3_5 + 0.00262987012987022*G0_1_1_2_4_1 - 0.0175324675324682*G0_1_1_2_4_2 - 0.0140259740259745*G0_1_1_2_4_3 - 0.00438311688311705*G0_1_1_2_5_0 + 0.00175324675324682*G0_1_1_2_5_1 - 0.00262987012987024*G0_1_1_2_5_2 - 0.00350649350649364*G0_1_1_2_5_3 - 0.0105194805194809*G0_1_1_2_5_5 + 0.00262987012987022*G0_1_1_3_0_0 - 0.00175324675324681*G0_1_1_3_0_1 + 0.00438311688311702*G0_1_1_3_0_2 + 0.0105194805194808*G0_1_1_3_0_3 + 0.00350649350649363*G0_1_1_3_0_5 - 0.00175324675324681*G0_1_1_3_1_0 - 0.00701298701298725*G0_1_1_3_1_1 + 0.0157792207792213*G0_1_1_3_1_2 + 0.028051948051949*G0_1_1_3_1_3 + 0.00350649350649363*G0_1_1_3_1_4 + 0.00438311688311702*G0_1_1_3_2_0 + 0.0157792207792213*G0_1_1_3_2_1 - 0.0569805194805215*G0_1_1_3_2_2 - 0.0806493506493535*G0_1_1_3_2_3 - 0.0140259740259745*G0_1_1_3_2_4 - 0.00350649350649364*G0_1_1_3_2_5 + 0.0105194805194808*G0_1_1_3_3_0 + 0.028051948051949*G0_1_1_3_3_1 - 0.0806493506493535*G0_1_1_3_3_2 - 0.378701298701312*G0_1_1_3_3_3 - 0.028051948051949*G0_1_1_3_3_4 - 0.0140259740259746*G0_1_1_3_3_5 + 0.00350649350649363*G0_1_1_3_4_1 - 0.0140259740259745*G0_1_1_3_4_2 - 0.028051948051949*G0_1_1_3_4_3 + 0.00350649350649363*G0_1_1_3_5_0 - 0.00350649350649364*G0_1_1_3_5_2 - 0.0140259740259746*G0_1_1_3_5_3 + 0.0140259740259745*G0_1_1_3_5_5 + 0.0175324675324682*G0_1_1_4_0_0 - 0.00262987012987023*G0_1_1_4_0_1 + 0.0140259740259745*G0_1_1_4_0_5 - 0.00262987012987022*G0_1_1_4_1_0 + 0.00262987012987022*G0_1_1_4_1_2 + 0.00350649350649363*G0_1_1_4_1_3 - 0.00350649350649363*G0_1_1_4_1_5 + 0.00262987012987022*G0_1_1_4_2_1 - 0.0175324675324682*G0_1_1_4_2_2 - 0.0140259740259745*G0_1_1_4_2_3 + 0.00350649350649363*G0_1_1_4_3_1 - 0.0140259740259745*G0_1_1_4_3_2 - 0.028051948051949*G0_1_1_4_3_3 + 0.0140259740259745*G0_1_1_4_5_0 - 0.00350649350649363*G0_1_1_4_5_1 + 0.028051948051949*G0_1_1_4_5_5 + 0.0569805194805216*G0_1_1_5_0_0 - 0.0157792207792214*G0_1_1_5_0_1 - 0.00438311688311705*G0_1_1_5_0_2 + 0.00350649350649363*G0_1_1_5_0_3 + 0.0140259740259745*G0_1_1_5_0_4 + 0.0806493506493537*G0_1_1_5_0_5 - 0.0157792207792214*G0_1_1_5_1_0 + 0.00701298701298725*G0_1_1_5_1_1 + 0.00175324675324682*G0_1_1_5_1_2 - 0.00350649350649363*G0_1_1_5_1_4 - 0.0280519480519491*G0_1_1_5_1_5 - 0.00438311688311705*G0_1_1_5_2_0 + 0.00175324675324682*G0_1_1_5_2_1 - 0.00262987012987024*G0_1_1_5_2_2 - 0.00350649350649364*G0_1_1_5_2_3 - 0.0105194805194809*G0_1_1_5_2_5 + 0.00350649350649363*G0_1_1_5_3_0 - 0.00350649350649364*G0_1_1_5_3_2 - 0.0140259740259746*G0_1_1_5_3_3 + 0.0140259740259745*G0_1_1_5_3_5 + 0.0140259740259745*G0_1_1_5_4_0 - 0.00350649350649363*G0_1_1_5_4_1 + 0.028051948051949*G0_1_1_5_4_5 + 0.0806493506493537*G0_1_1_5_5_0 - 0.0280519480519491*G0_1_1_5_5_1 - 0.0105194805194809*G0_1_1_5_5_2 + 0.0140259740259745*G0_1_1_5_5_3 + 0.028051948051949*G0_1_1_5_5_4 + 0.378701298701312*G0_1_1_5_5_5; + A[47] = -A[67] - 0.0955154220779255*G0_1_0_0_0_0 + 0.00631899350649372*G0_1_0_0_0_1 + 0.00340909090909103*G0_1_0_0_0_2 - 0.0019967532467533*G0_1_0_0_0_3 - 0.0129058441558446*G0_1_0_0_0_4 - 0.0238636363636372*G0_1_0_0_0_5 + 0.00631899350649372*G0_1_0_0_1_0 + 0.000474837662337676*G0_1_0_0_1_1 + 0.000109577922077925*G0_1_0_0_1_2 - 0.00170454545454551*G0_1_0_0_1_3 - 0.0012175324675325*G0_1_0_0_1_4 - 0.00116883116883121*G0_1_0_0_1_5 + 0.00340909090909103*G0_1_0_0_2_0 + 0.000109577922077925*G0_1_0_0_2_1 + 0.00012175324675325*G0_1_0_0_2_2 - 0.000730519480519504*G0_1_0_0_2_3 - 0.00194805194805201*G0_1_0_0_2_4 + 0.000243506493506504*G0_1_0_0_2_5 - 0.0019967532467533*G0_1_0_0_3_0 - 0.00170454545454551*G0_1_0_0_3_1 - 0.000730519480519504*G0_1_0_0_3_2 + 0.00253246753246761*G0_1_0_0_3_3 + 0.00642857142857163*G0_1_0_0_3_4 + 0.00350649350649362*G0_1_0_0_3_5 - 0.0129058441558446*G0_1_0_0_4_0 - 0.0012175324675325*G0_1_0_0_4_1 - 0.00194805194805201*G0_1_0_0_4_2 + 0.00642857142857163*G0_1_0_0_4_3 + 0.0173376623376629*G0_1_0_0_4_4 + 0.001948051948052*G0_1_0_0_4_5 - 0.0238636363636372*G0_1_0_0_5_0 - 0.00116883116883121*G0_1_0_0_5_1 + 0.000243506493506505*G0_1_0_0_5_2 + 0.00350649350649362*G0_1_0_0_5_3 + 0.001948051948052*G0_1_0_0_5_4 - 0.0144155844155849*G0_1_0_0_5_5 + 0.00631899350649372*G0_1_0_1_0_0 + 0.000474837662337676*G0_1_0_1_0_1 + 0.000109577922077925*G0_1_0_1_0_2 - 0.00170454545454551*G0_1_0_1_0_3 - 0.0012175324675325*G0_1_0_1_0_4 - 0.00116883116883121*G0_1_0_1_0_5 + 0.000474837662337676*G0_1_0_1_1_0 - 0.0361972402597415*G0_1_0_1_1_1 + 0.00104707792207795*G0_1_0_1_1_2 - 0.0034577922077923*G0_1_0_1_1_3 - 0.0015097402597403*G0_1_0_1_1_4 - 0.00214285714285723*G0_1_0_1_1_5 + 0.000109577922077925*G0_1_0_1_2_0 + 0.00104707792207795*G0_1_0_1_2_1 + 0.000608766233766255*G0_1_0_1_2_2 - 0.00243506493506502*G0_1_0_1_2_3 - 0.000730519480519505*G0_1_0_1_2_4 - 0.00141233766233771*G0_1_0_1_2_5 - 0.00170454545454551*G0_1_0_1_3_0 - 0.0034577922077923*G0_1_0_1_3_1 - 0.00243506493506502*G0_1_0_1_3_2 + 0.0142207792207797*G0_1_0_1_3_3 + 0.00642857142857164*G0_1_0_1_3_4 + 0.00623376623376644*G0_1_0_1_3_5 - 0.0012175324675325*G0_1_0_1_4_0 - 0.0015097402597403*G0_1_0_1_4_1 - 0.000730519480519505*G0_1_0_1_4_2 + 0.00642857142857164*G0_1_0_1_4_3 + 0.00564935064935083*G0_1_0_1_4_4 + 0.00584415584415603*G0_1_0_1_4_5 - 0.00116883116883121*G0_1_0_1_5_0 - 0.00214285714285723*G0_1_0_1_5_1 - 0.00141233766233771*G0_1_0_1_5_2 + 0.00623376623376644*G0_1_0_1_5_3 + 0.00584415584415603*G0_1_0_1_5_4 + 0.0167532467532473*G0_1_0_1_5_5 + 0.00340909090909103*G0_1_0_2_0_0 + 0.000109577922077925*G0_1_0_2_0_1 + 0.00012175324675325*G0_1_0_2_0_2 - 0.000730519480519504*G0_1_0_2_0_3 - 0.00194805194805201*G0_1_0_2_0_4 + 0.000243506493506505*G0_1_0_2_0_5 + 0.000109577922077925*G0_1_0_2_1_0 + 0.00104707792207795*G0_1_0_2_1_1 + 0.000608766233766255*G0_1_0_2_1_2 - 0.00243506493506502*G0_1_0_2_1_3 - 0.000730519480519505*G0_1_0_2_1_4 - 0.00141233766233771*G0_1_0_2_1_5 + 0.00012175324675325*G0_1_0_2_2_0 + 0.000608766233766255*G0_1_0_2_2_1 - 0.000730519480519501*G0_1_0_2_2_3 + 0.000730519480519504*G0_1_0_2_2_4 - 0.000730519480519504*G0_1_0_2_2_5 - 0.000730519480519504*G0_1_0_2_3_0 - 0.00243506493506502*G0_1_0_2_3_1 - 0.000730519480519501*G0_1_0_2_3_2 - 0.00194805194805203*G0_1_0_2_3_3 + 0.00292207792207802*G0_1_0_2_3_4 + 0.00292207792207801*G0_1_0_2_3_5 - 0.00194805194805201*G0_1_0_2_4_0 - 0.000730519480519505*G0_1_0_2_4_1 + 0.000730519480519504*G0_1_0_2_4_2 + 0.00292207792207802*G0_1_0_2_4_3 - 0.00389610389610401*G0_1_0_2_4_4 + 0.00292207792207802*G0_1_0_2_4_5 + 0.000243506493506505*G0_1_0_2_5_0 - 0.00141233766233771*G0_1_0_2_5_1 - 0.000730519480519504*G0_1_0_2_5_2 + 0.00292207792207801*G0_1_0_2_5_3 + 0.00292207792207802*G0_1_0_2_5_4 - 0.00233766233766243*G0_1_0_2_5_5 - 0.0019967532467533*G0_1_0_3_0_0 - 0.00170454545454551*G0_1_0_3_0_1 - 0.000730519480519504*G0_1_0_3_0_2 + 0.00253246753246761*G0_1_0_3_0_3 + 0.00642857142857163*G0_1_0_3_0_4 + 0.00350649350649362*G0_1_0_3_0_5 - 0.00170454545454551*G0_1_0_3_1_0 - 0.0034577922077923*G0_1_0_3_1_1 - 0.00243506493506502*G0_1_0_3_1_2 + 0.0142207792207797*G0_1_0_3_1_3 + 0.00642857142857164*G0_1_0_3_1_4 + 0.00623376623376644*G0_1_0_3_1_5 - 0.000730519480519504*G0_1_0_3_2_0 - 0.00243506493506502*G0_1_0_3_2_1 - 0.000730519480519501*G0_1_0_3_2_2 - 0.00194805194805203*G0_1_0_3_2_3 + 0.00292207792207802*G0_1_0_3_2_4 + 0.00292207792207801*G0_1_0_3_2_5 + 0.00253246753246761*G0_1_0_3_3_0 + 0.0142207792207797*G0_1_0_3_3_1 - 0.00194805194805203*G0_1_0_3_3_2 + 0.0911688311688345*G0_1_0_3_3_3 - 0.0179220779220785*G0_1_0_3_3_4 - 0.0109090909090912*G0_1_0_3_3_5 + 0.00642857142857163*G0_1_0_3_4_0 + 0.00642857142857164*G0_1_0_3_4_1 + 0.00292207792207802*G0_1_0_3_4_2 - 0.0179220779220785*G0_1_0_3_4_3 - 0.0241558441558449*G0_1_0_3_4_4 - 0.0187012987012993*G0_1_0_3_4_5 + 0.00350649350649362*G0_1_0_3_5_0 + 0.00623376623376644*G0_1_0_3_5_1 + 0.00292207792207801*G0_1_0_3_5_2 - 0.0109090909090912*G0_1_0_3_5_3 - 0.0187012987012993*G0_1_0_3_5_4 - 0.00233766233766238*G0_1_0_3_5_5 - 0.0129058441558446*G0_1_0_4_0_0 - 0.0012175324675325*G0_1_0_4_0_1 - 0.00194805194805201*G0_1_0_4_0_2 + 0.00642857142857163*G0_1_0_4_0_3 + 0.0173376623376629*G0_1_0_4_0_4 + 0.001948051948052*G0_1_0_4_0_5 - 0.0012175324675325*G0_1_0_4_1_0 - 0.0015097402597403*G0_1_0_4_1_1 - 0.000730519480519505*G0_1_0_4_1_2 + 0.00642857142857164*G0_1_0_4_1_3 + 0.00564935064935083*G0_1_0_4_1_4 + 0.00584415584415603*G0_1_0_4_1_5 - 0.00194805194805201*G0_1_0_4_2_0 - 0.000730519480519505*G0_1_0_4_2_1 + 0.000730519480519504*G0_1_0_4_2_2 + 0.00292207792207802*G0_1_0_4_2_3 - 0.00389610389610402*G0_1_0_4_2_4 + 0.00292207792207802*G0_1_0_4_2_5 + 0.00642857142857163*G0_1_0_4_3_0 + 0.00642857142857164*G0_1_0_4_3_1 + 0.00292207792207802*G0_1_0_4_3_2 - 0.0179220779220785*G0_1_0_4_3_3 - 0.0241558441558449*G0_1_0_4_3_4 - 0.0187012987012993*G0_1_0_4_3_5 + 0.0173376623376629*G0_1_0_4_4_0 + 0.00564935064935083*G0_1_0_4_4_1 - 0.00389610389610401*G0_1_0_4_4_2 - 0.0241558441558449*G0_1_0_4_4_3 + 0.0350649350649362*G0_1_0_4_4_4 - 0.0171428571428577*G0_1_0_4_4_5 + 0.001948051948052*G0_1_0_4_5_0 + 0.00584415584415603*G0_1_0_4_5_1 + 0.00292207792207802*G0_1_0_4_5_2 - 0.0187012987012993*G0_1_0_4_5_3 - 0.0171428571428577*G0_1_0_4_5_4 - 0.00701298701298723*G0_1_0_4_5_5 - 0.0238636363636372*G0_1_0_5_0_0 - 0.00116883116883121*G0_1_0_5_0_1 + 0.000243506493506504*G0_1_0_5_0_2 + 0.00350649350649362*G0_1_0_5_0_3 + 0.001948051948052*G0_1_0_5_0_4 - 0.0144155844155849*G0_1_0_5_0_5 - 0.00116883116883121*G0_1_0_5_1_0 - 0.00214285714285723*G0_1_0_5_1_1 - 0.00141233766233771*G0_1_0_5_1_2 + 0.00623376623376644*G0_1_0_5_1_3 + 0.00584415584415603*G0_1_0_5_1_4 + 0.0167532467532473*G0_1_0_5_1_5 + 0.000243506493506505*G0_1_0_5_2_0 - 0.00141233766233771*G0_1_0_5_2_1 - 0.000730519480519504*G0_1_0_5_2_2 + 0.00292207792207801*G0_1_0_5_2_3 + 0.00292207792207802*G0_1_0_5_2_4 - 0.00233766233766243*G0_1_0_5_2_5 + 0.00350649350649362*G0_1_0_5_3_0 + 0.00623376623376644*G0_1_0_5_3_1 + 0.00292207792207801*G0_1_0_5_3_2 - 0.0109090909090912*G0_1_0_5_3_3 - 0.0187012987012993*G0_1_0_5_3_4 - 0.00233766233766238*G0_1_0_5_3_5 + 0.001948051948052*G0_1_0_5_4_0 + 0.00584415584415603*G0_1_0_5_4_1 + 0.00292207792207802*G0_1_0_5_4_2 - 0.0187012987012993*G0_1_0_5_4_3 - 0.0171428571428577*G0_1_0_5_4_4 - 0.00701298701298723*G0_1_0_5_4_5 - 0.0144155844155849*G0_1_0_5_5_0 + 0.0167532467532473*G0_1_0_5_5_1 - 0.00233766233766243*G0_1_0_5_5_2 - 0.00233766233766238*G0_1_0_5_5_3 - 0.00701298701298723*G0_1_0_5_5_4 + 0.189350649350656*G0_1_0_5_5_5 + 0.0242897727272736*G0_1_1_0_0_0 - 0.00367694805194819*G0_1_1_0_0_1 - 0.00110795454545459*G0_1_1_0_0_2 + 0.00267857142857154*G0_1_1_0_0_4 + 0.0219155844155852*G0_1_1_0_0_5 - 0.00367694805194819*G0_1_1_0_1_0 + 0.00256899350649359*G0_1_1_0_1_1 + 0.000547889610389629*G0_1_1_0_1_2 - 0.00160714285714291*G0_1_1_0_1_3 - 0.00224025974025981*G0_1_1_0_1_4 - 0.00925324675324709*G0_1_1_0_1_5 - 0.00110795454545459*G0_1_1_0_2_0 + 0.000547889610389629*G0_1_1_0_2_1 + 0.000365259740259756*G0_1_1_0_2_2 - 0.000487012987013001*G0_1_1_0_2_3 - 0.000487012987013003*G0_1_1_0_2_4 - 0.00204545454545462*G0_1_1_0_2_5 - 0.00160714285714291*G0_1_1_0_3_1 - 0.000487012987013002*G0_1_1_0_3_2 - 0.00136363636363641*G0_1_1_0_3_3 + 0.00428571428571442*G0_1_1_0_3_4 + 0.00389610389610402*G0_1_1_0_3_5 + 0.00267857142857154*G0_1_1_0_4_0 - 0.00224025974025981*G0_1_1_0_4_1 - 0.000487012987013003*G0_1_1_0_4_2 + 0.00428571428571442*G0_1_1_0_4_3 + 0.00487012987013002*G0_1_1_0_4_4 + 0.00857142857142887*G0_1_1_0_4_5 + 0.0219155844155852*G0_1_1_0_5_0 - 0.00925324675324709*G0_1_1_0_5_1 - 0.00204545454545462*G0_1_1_0_5_2 + 0.00389610389610402*G0_1_1_0_5_3 + 0.00857142857142887*G0_1_1_0_5_4 + 0.0315584415584428*G0_1_1_0_5_5 - 0.00367694805194819*G0_1_1_1_0_0 + 0.00256899350649359*G0_1_1_1_0_1 + 0.000547889610389629*G0_1_1_1_0_2 - 0.00160714285714291*G0_1_1_1_0_3 - 0.00224025974025981*G0_1_1_1_0_4 - 0.00925324675324709*G0_1_1_1_0_5 + 0.00256899350649359*G0_1_1_1_1_0 - 0.0401785714285727*G0_1_1_1_1_1 + 0.00125405844155848*G0_1_1_1_1_2 - 0.0037012987012988*G0_1_1_1_1_3 - 0.00199675324675331*G0_1_1_1_1_4 - 0.00214285714285722*G0_1_1_1_1_5 + 0.000547889610389629*G0_1_1_1_2_0 + 0.00125405844155848*G0_1_1_1_2_1 + 0.000974025974026009*G0_1_1_1_2_2 - 0.00292207792207803*G0_1_1_1_2_3 - 0.00194805194805201*G0_1_1_1_2_4 - 0.00112012987012991*G0_1_1_1_2_5 - 0.00160714285714291*G0_1_1_1_3_0 - 0.0037012987012988*G0_1_1_1_3_1 - 0.00292207792207803*G0_1_1_1_3_2 + 0.0132467532467537*G0_1_1_1_3_3 + 0.00720779220779244*G0_1_1_1_3_4 + 0.00545454545454564*G0_1_1_1_3_5 - 0.00224025974025981*G0_1_1_1_4_0 - 0.00199675324675331*G0_1_1_1_4_1 - 0.00194805194805201*G0_1_1_1_4_2 + 0.00720779220779244*G0_1_1_1_4_3 + 0.0136363636363641*G0_1_1_1_4_4 + 0.00623376623376644*G0_1_1_1_4_5 - 0.00925324675324709*G0_1_1_1_5_0 - 0.00214285714285722*G0_1_1_1_5_1 - 0.00112012987012991*G0_1_1_1_5_2 + 0.00545454545454564*G0_1_1_1_5_3 + 0.00623376623376644*G0_1_1_1_5_4 - 0.000779220779220824*G0_1_1_1_5_5 - 0.00110795454545459*G0_1_1_2_0_0 + 0.000547889610389629*G0_1_1_2_0_1 + 0.000365259740259756*G0_1_1_2_0_2 - 0.000487012987013001*G0_1_1_2_0_3 - 0.000487012987013003*G0_1_1_2_0_4 - 0.00204545454545462*G0_1_1_2_0_5 + 0.000547889610389629*G0_1_1_2_1_0 + 0.00125405844155848*G0_1_1_2_1_1 + 0.00097402597402601*G0_1_1_2_1_2 - 0.00292207792207803*G0_1_1_2_1_3 - 0.00194805194805201*G0_1_1_2_1_4 - 0.00112012987012991*G0_1_1_2_1_5 + 0.000365259740259756*G0_1_1_2_2_0 + 0.00097402597402601*G0_1_1_2_2_1 - 0.00401785714285735*G0_1_1_2_2_2 - 0.00146103896103901*G0_1_1_2_2_3 - 0.00292207792207803*G0_1_1_2_2_4 - 0.000974025974026005*G0_1_1_2_2_5 - 0.000487012987013001*G0_1_1_2_3_0 - 0.00292207792207803*G0_1_1_2_3_1 - 0.00146103896103901*G0_1_1_2_3_2 - 0.00292207792207804*G0_1_1_2_3_3 + 0.00487012987013003*G0_1_1_2_3_4 + 0.00292207792207801*G0_1_1_2_3_5 - 0.000487012987013003*G0_1_1_2_4_0 - 0.00194805194805201*G0_1_1_2_4_1 - 0.00292207792207803*G0_1_1_2_4_2 + 0.00487012987013003*G0_1_1_2_4_3 + 0.0107142857142861*G0_1_1_2_4_4 + 0.00584415584415604*G0_1_1_2_4_5 - 0.00204545454545462*G0_1_1_2_5_0 - 0.00112012987012991*G0_1_1_2_5_1 - 0.000974025974026005*G0_1_1_2_5_2 + 0.00292207792207801*G0_1_1_2_5_3 + 0.00584415584415604*G0_1_1_2_5_4 - 0.00623376623376647*G0_1_1_2_5_5 - 0.00160714285714291*G0_1_1_3_0_1 - 0.000487012987013001*G0_1_1_3_0_2 - 0.00136363636363641*G0_1_1_3_0_3 + 0.00428571428571442*G0_1_1_3_0_4 + 0.00389610389610402*G0_1_1_3_0_5 - 0.00160714285714291*G0_1_1_3_1_0 - 0.0037012987012988*G0_1_1_3_1_1 - 0.00292207792207803*G0_1_1_3_1_2 + 0.0132467532467537*G0_1_1_3_1_3 + 0.00720779220779244*G0_1_1_3_1_4 + 0.00545454545454564*G0_1_1_3_1_5 - 0.000487012987013001*G0_1_1_3_2_0 - 0.00292207792207803*G0_1_1_3_2_1 - 0.00146103896103901*G0_1_1_3_2_2 - 0.00292207792207805*G0_1_1_3_2_3 + 0.00487012987013003*G0_1_1_3_2_4 + 0.00292207792207801*G0_1_1_3_2_5 - 0.00136363636363641*G0_1_1_3_3_0 + 0.0132467532467537*G0_1_1_3_3_1 - 0.00292207792207804*G0_1_1_3_3_2 + 0.121558441558446*G0_1_1_3_3_3 - 0.011688311688312*G0_1_1_3_3_4 - 0.00311688311688315*G0_1_1_3_3_5 + 0.00428571428571442*G0_1_1_3_4_0 + 0.00720779220779244*G0_1_1_3_4_1 + 0.00487012987013003*G0_1_1_3_4_2 - 0.011688311688312*G0_1_1_3_4_3 - 0.035844155844157*G0_1_1_3_4_4 - 0.0202597402597409*G0_1_1_3_4_5 + 0.00389610389610402*G0_1_1_3_5_0 + 0.00545454545454564*G0_1_1_3_5_1 + 0.00292207792207801*G0_1_1_3_5_2 - 0.00311688311688315*G0_1_1_3_5_3 - 0.0202597402597409*G0_1_1_3_5_4 + 0.00467532467532487*G0_1_1_3_5_5 + 0.00267857142857154*G0_1_1_4_0_0 - 0.00224025974025981*G0_1_1_4_0_1 - 0.000487012987013003*G0_1_1_4_0_2 + 0.00428571428571442*G0_1_1_4_0_3 + 0.00487012987013002*G0_1_1_4_0_4 + 0.00857142857142887*G0_1_1_4_0_5 - 0.00224025974025981*G0_1_1_4_1_0 - 0.00199675324675331*G0_1_1_4_1_1 - 0.00194805194805201*G0_1_1_4_1_2 + 0.00720779220779244*G0_1_1_4_1_3 + 0.0136363636363641*G0_1_1_4_1_4 + 0.00623376623376644*G0_1_1_4_1_5 - 0.000487012987013003*G0_1_1_4_2_0 - 0.00194805194805201*G0_1_1_4_2_1 - 0.00292207792207803*G0_1_1_4_2_2 + 0.00487012987013003*G0_1_1_4_2_3 + 0.0107142857142861*G0_1_1_4_2_4 + 0.00584415584415604*G0_1_1_4_2_5 + 0.00428571428571442*G0_1_1_4_3_0 + 0.00720779220779244*G0_1_1_4_3_1 + 0.00487012987013003*G0_1_1_4_3_2 - 0.011688311688312*G0_1_1_4_3_3 - 0.035844155844157*G0_1_1_4_3_4 - 0.0202597402597409*G0_1_1_4_3_5 + 0.00487012987013002*G0_1_1_4_4_0 + 0.0136363636363641*G0_1_1_4_4_1 + 0.0107142857142861*G0_1_1_4_4_2 - 0.035844155844157*G0_1_1_4_4_3 - 0.0958441558441589*G0_1_1_4_4_4 - 0.0389610389610402*G0_1_1_4_4_5 + 0.00857142857142887*G0_1_1_4_5_0 + 0.00623376623376644*G0_1_1_4_5_1 + 0.00584415584415604*G0_1_1_4_5_2 - 0.0202597402597409*G0_1_1_4_5_3 - 0.0389610389610402*G0_1_1_4_5_4 + 0.0219155844155852*G0_1_1_5_0_0 - 0.00925324675324709*G0_1_1_5_0_1 - 0.00204545454545462*G0_1_1_5_0_2 + 0.00389610389610402*G0_1_1_5_0_3 + 0.00857142857142887*G0_1_1_5_0_4 + 0.0315584415584428*G0_1_1_5_0_5 - 0.00925324675324709*G0_1_1_5_1_0 - 0.00214285714285722*G0_1_1_5_1_1 - 0.00112012987012991*G0_1_1_5_1_2 + 0.00545454545454564*G0_1_1_5_1_3 + 0.00623376623376644*G0_1_1_5_1_4 - 0.000779220779220822*G0_1_1_5_1_5 - 0.00204545454545462*G0_1_1_5_2_0 - 0.00112012987012991*G0_1_1_5_2_1 - 0.000974025974026005*G0_1_1_5_2_2 + 0.00292207792207801*G0_1_1_5_2_3 + 0.00584415584415604*G0_1_1_5_2_4 - 0.00623376623376647*G0_1_1_5_2_5 + 0.00389610389610402*G0_1_1_5_3_0 + 0.00545454545454564*G0_1_1_5_3_1 + 0.00292207792207801*G0_1_1_5_3_2 - 0.00311688311688315*G0_1_1_5_3_3 - 0.0202597402597409*G0_1_1_5_3_4 + 0.00467532467532488*G0_1_1_5_3_5 + 0.00857142857142887*G0_1_1_5_4_0 + 0.00623376623376644*G0_1_1_5_4_1 + 0.00584415584415604*G0_1_1_5_4_2 - 0.0202597402597409*G0_1_1_5_4_3 - 0.0389610389610402*G0_1_1_5_4_4 + 0.0315584415584428*G0_1_1_5_5_0 - 0.000779220779220822*G0_1_1_5_5_1 - 0.00623376623376647*G0_1_1_5_5_2 + 0.00467532467532487*G0_1_1_5_5_3 + 0.317922077922089*G0_1_1_5_5_5; + A[91] = 0.0061120129870132*G0_0_0_0_0_0 - 0.000771103896103921*G0_0_0_0_0_1 - 0.000698051948051973*G0_0_0_0_0_2 + 0.000162337662337666*G0_0_0_0_0_3 + 0.00633116883116904*G0_0_0_0_0_4 + 0.000649350649350674*G0_0_0_0_0_5 - 0.000771103896103921*G0_0_0_0_1_0 + 0.00230519480519488*G0_0_0_0_1_1 - 0.000292207792207802*G0_0_0_0_1_2 + 0.00246753246753255*G0_0_0_0_1_3 + 0.000162337662337666*G0_0_0_0_1_4 + 0.00175324675324681*G0_0_0_0_1_5 - 0.000698051948051973*G0_0_0_0_2_0 - 0.000292207792207802*G0_0_0_0_2_1 - 0.000511363636363653*G0_0_0_0_2_2 - 0.00113636363636367*G0_0_0_0_2_3 - 0.00337662337662349*G0_0_0_0_2_4 - 0.000681818181818205*G0_0_0_0_2_5 + 0.000162337662337665*G0_0_0_0_3_0 + 0.00246753246753255*G0_0_0_0_3_1 - 0.00113636363636367*G0_0_0_0_3_2 + 0.000259740259740283*G0_0_0_0_3_3 - 0.000649350649350667*G0_0_0_0_3_4 + 0.00103896103896108*G0_0_0_0_3_5 + 0.00633116883116904*G0_0_0_0_4_0 + 0.000162337662337666*G0_0_0_0_4_1 - 0.00337662337662349*G0_0_0_0_4_2 - 0.000649350649350667*G0_0_0_0_4_3 + 0.00506493506493524*G0_0_0_0_4_4 + 0.00103896103896107*G0_0_0_0_4_5 + 0.000649350649350674*G0_0_0_0_5_0 + 0.00175324675324681*G0_0_0_0_5_1 - 0.000681818181818205*G0_0_0_0_5_2 + 0.00103896103896108*G0_0_0_0_5_3 + 0.00103896103896107*G0_0_0_0_5_4 + 0.00155844155844161*G0_0_0_0_5_5 - 0.000771103896103921*G0_0_0_1_0_0 + 0.00230519480519488*G0_0_0_1_0_1 - 0.000292207792207802*G0_0_0_1_0_2 + 0.00246753246753255*G0_0_0_1_0_3 + 0.000162337662337666*G0_0_0_1_0_4 + 0.00175324675324681*G0_0_0_1_0_5 + 0.00230519480519488*G0_0_0_1_1_0 - 0.0304383116883127*G0_0_0_1_1_1 + 0.0044967532467534*G0_0_0_1_1_2 - 0.0194805194805202*G0_0_0_1_1_3 - 0.00103896103896107*G0_0_0_1_1_4 - 0.00941558441558475*G0_0_0_1_1_5 - 0.000292207792207802*G0_0_0_1_2_0 + 0.0044967532467534*G0_0_0_1_2_1 - 0.00138798701298706*G0_0_0_1_2_2 + 0.0039610389610391*G0_0_0_1_2_3 - 3.24675324675324e-05*G0_0_0_1_2_4 + 0.00155844155844162*G0_0_0_1_2_5 + 0.00246753246753255*G0_0_0_1_3_0 - 0.0194805194805202*G0_0_0_1_3_1 + 0.0039610389610391*G0_0_0_1_3_2 - 0.0296103896103907*G0_0_0_1_3_3 - 0.00285714285714295*G0_0_0_1_3_4 - 0.00805194805194835*G0_0_0_1_3_5 + 0.000162337662337666*G0_0_0_1_4_0 - 0.00103896103896107*G0_0_0_1_4_1 - 3.24675324675324e-05*G0_0_0_1_4_2 - 0.00285714285714295*G0_0_0_1_4_3 - 0.00376623376623388*G0_0_0_1_4_4 - 0.00103896103896107*G0_0_0_1_4_5 + 0.00175324675324681*G0_0_0_1_5_0 - 0.00941558441558475*G0_0_0_1_5_1 + 0.00155844155844162*G0_0_0_1_5_2 - 0.00805194805194835*G0_0_0_1_5_3 - 0.00103896103896107*G0_0_0_1_5_4 - 0.00623376623376645*G0_0_0_1_5_5 - 0.000698051948051973*G0_0_0_2_0_0 - 0.000292207792207802*G0_0_0_2_0_1 - 0.000511363636363653*G0_0_0_2_0_2 - 0.00113636363636367*G0_0_0_2_0_3 - 0.00337662337662349*G0_0_0_2_0_4 - 0.000681818181818205*G0_0_0_2_0_5 - 0.000292207792207802*G0_0_0_2_1_0 + 0.0044967532467534*G0_0_0_2_1_1 - 0.00138798701298706*G0_0_0_2_1_2 + 0.0039610389610391*G0_0_0_2_1_3 - 3.24675324675324e-05*G0_0_0_2_1_4 + 0.00155844155844162*G0_0_0_2_1_5 - 0.000511363636363653*G0_0_0_2_2_0 - 0.00138798701298706*G0_0_0_2_2_1 + 0.00438311688311703*G0_0_0_2_2_2 + 0.000454545454545463*G0_0_0_2_2_3 + 0.00538961038961057*G0_0_0_2_2_4 - 0.000292207792207803*G0_0_0_2_2_5 - 0.00113636363636367*G0_0_0_2_3_0 + 0.0039610389610391*G0_0_0_2_3_1 + 0.000454545454545463*G0_0_0_2_3_2 + 0.0140259740259745*G0_0_0_2_3_3 + 0.00233766233766242*G0_0_0_2_3_4 + 0.00285714285714296*G0_0_0_2_3_5 - 0.00337662337662349*G0_0_0_2_4_0 - 3.24675324675324e-05*G0_0_0_2_4_1 + 0.00538961038961057*G0_0_0_2_4_2 + 0.00233766233766242*G0_0_0_2_4_3 + 0.00467532467532484*G0_0_0_2_4_4 + 0.000649350649350674*G0_0_0_2_4_5 - 0.000681818181818205*G0_0_0_2_5_0 + 0.00155844155844162*G0_0_0_2_5_1 - 0.000292207792207803*G0_0_0_2_5_2 + 0.00285714285714296*G0_0_0_2_5_3 + 0.000649350649350674*G0_0_0_2_5_4 + 0.00233766233766242*G0_0_0_2_5_5 + 0.000162337662337665*G0_0_0_3_0_0 + 0.00246753246753255*G0_0_0_3_0_1 - 0.00113636363636367*G0_0_0_3_0_2 + 0.000259740259740283*G0_0_0_3_0_3 - 0.000649350649350667*G0_0_0_3_0_4 + 0.00103896103896108*G0_0_0_3_0_5 + 0.00246753246753255*G0_0_0_3_1_0 - 0.0194805194805202*G0_0_0_3_1_1 + 0.0039610389610391*G0_0_0_3_1_2 - 0.0296103896103907*G0_0_0_3_1_3 - 0.00285714285714295*G0_0_0_3_1_4 - 0.00805194805194835*G0_0_0_3_1_5 - 0.00113636363636367*G0_0_0_3_2_0 + 0.0039610389610391*G0_0_0_3_2_1 + 0.000454545454545464*G0_0_0_3_2_2 + 0.0140259740259745*G0_0_0_3_2_3 + 0.00233766233766242*G0_0_0_3_2_4 + 0.00285714285714296*G0_0_0_3_2_5 + 0.000259740259740283*G0_0_0_3_3_0 - 0.0296103896103907*G0_0_0_3_3_1 + 0.0140259740259745*G0_0_0_3_3_2 - 0.00935064935064981*G0_0_0_3_3_3 + 0.00519480519480534*G0_0_0_3_3_4 - 0.0062337662337665*G0_0_0_3_3_5 - 0.000649350649350667*G0_0_0_3_4_0 - 0.00285714285714295*G0_0_0_3_4_1 + 0.00233766233766242*G0_0_0_3_4_2 + 0.00519480519480534*G0_0_0_3_4_3 + 0.0088311688311691*G0_0_0_3_4_4 + 0.00103896103896108*G0_0_0_3_5_0 - 0.00805194805194835*G0_0_0_3_5_1 + 0.00285714285714296*G0_0_0_3_5_2 - 0.0062337662337665*G0_0_0_3_5_3 - 0.006753246753247*G0_0_0_3_5_5 + 0.00633116883116904*G0_0_0_4_0_0 + 0.000162337662337666*G0_0_0_4_0_1 - 0.00337662337662349*G0_0_0_4_0_2 - 0.000649350649350667*G0_0_0_4_0_3 + 0.00506493506493524*G0_0_0_4_0_4 + 0.00103896103896107*G0_0_0_4_0_5 + 0.000162337662337666*G0_0_0_4_1_0 - 0.00103896103896107*G0_0_0_4_1_1 - 3.24675324675324e-05*G0_0_0_4_1_2 - 0.00285714285714295*G0_0_0_4_1_3 - 0.00376623376623388*G0_0_0_4_1_4 - 0.00103896103896107*G0_0_0_4_1_5 - 0.00337662337662349*G0_0_0_4_2_0 - 3.24675324675324e-05*G0_0_0_4_2_1 + 0.00538961038961057*G0_0_0_4_2_2 + 0.00233766233766242*G0_0_0_4_2_3 + 0.00467532467532483*G0_0_0_4_2_4 + 0.000649350649350674*G0_0_0_4_2_5 - 0.000649350649350667*G0_0_0_4_3_0 - 0.00285714285714295*G0_0_0_4_3_1 + 0.00233766233766242*G0_0_0_4_3_2 + 0.00519480519480534*G0_0_0_4_3_3 + 0.0088311688311691*G0_0_0_4_3_4 + 0.00506493506493524*G0_0_0_4_4_0 - 0.00376623376623388*G0_0_0_4_4_1 + 0.00467532467532483*G0_0_0_4_4_2 + 0.0088311688311691*G0_0_0_4_4_3 + 0.107532467532471*G0_0_0_4_4_4 + 0.00623376623376643*G0_0_0_4_4_5 + 0.00103896103896107*G0_0_0_4_5_0 - 0.00103896103896107*G0_0_0_4_5_1 + 0.000649350649350674*G0_0_0_4_5_2 + 0.00623376623376643*G0_0_0_4_5_4 - 0.00259740259740269*G0_0_0_4_5_5 + 0.000649350649350674*G0_0_0_5_0_0 + 0.00175324675324681*G0_0_0_5_0_1 - 0.000681818181818205*G0_0_0_5_0_2 + 0.00103896103896108*G0_0_0_5_0_3 + 0.00103896103896107*G0_0_0_5_0_4 + 0.00155844155844161*G0_0_0_5_0_5 + 0.00175324675324681*G0_0_0_5_1_0 - 0.00941558441558475*G0_0_0_5_1_1 + 0.00155844155844162*G0_0_0_5_1_2 - 0.00805194805194835*G0_0_0_5_1_3 - 0.00103896103896107*G0_0_0_5_1_4 - 0.00623376623376645*G0_0_0_5_1_5 - 0.000681818181818205*G0_0_0_5_2_0 + 0.00155844155844162*G0_0_0_5_2_1 - 0.000292207792207803*G0_0_0_5_2_2 + 0.00285714285714296*G0_0_0_5_2_3 + 0.000649350649350674*G0_0_0_5_2_4 + 0.00233766233766242*G0_0_0_5_2_5 + 0.00103896103896108*G0_0_0_5_3_0 - 0.00805194805194835*G0_0_0_5_3_1 + 0.00285714285714296*G0_0_0_5_3_2 - 0.0062337662337665*G0_0_0_5_3_3 - 0.006753246753247*G0_0_0_5_3_5 + 0.00103896103896107*G0_0_0_5_4_0 - 0.00103896103896107*G0_0_0_5_4_1 + 0.000649350649350674*G0_0_0_5_4_2 + 0.00623376623376643*G0_0_0_5_4_4 - 0.00259740259740269*G0_0_0_5_4_5 + 0.00155844155844161*G0_0_0_5_5_0 - 0.00623376623376645*G0_0_0_5_5_1 + 0.00233766233766242*G0_0_0_5_5_2 - 0.006753246753247*G0_0_0_5_5_3 - 0.00259740259740269*G0_0_0_5_5_4 - 0.0140259740259745*G0_0_0_5_5_5 + 0.00172889610389618*G0_1_0_0_0_0 + 0.000616883116883138*G0_1_0_0_0_1 - 0.000186688311688319*G0_1_0_0_0_2 + 0.000454545454545467*G0_1_0_0_0_3 + 0.000941558441558476*G0_1_0_0_0_4 + 0.000194805194805196*G0_1_0_0_0_5 + 0.000616883116883138*G0_1_0_0_1_0 - 0.00219155844155853*G0_1_0_0_1_1 + 0.000909090909090937*G0_1_0_0_1_3 + 0.000194805194805201*G0_1_0_0_1_4 - 0.00220779220779228*G0_1_0_0_1_5 - 0.000186688311688319*G0_1_0_0_2_0 + 0.00018668831168832*G0_1_0_0_2_2 - 0.000454545454545468*G0_1_0_0_2_3 + 0.000454545454545471*G0_1_0_0_2_5 + 0.000454545454545467*G0_1_0_0_3_0 + 0.000909090909090937*G0_1_0_0_3_1 - 0.000454545454545468*G0_1_0_0_3_2 - 0.00207792207792214*G0_1_0_0_3_3 - 0.00129870129870134*G0_1_0_0_3_4 - 0.00181818181818188*G0_1_0_0_3_5 + 0.000941558441558477*G0_1_0_0_4_0 + 0.000194805194805201*G0_1_0_0_4_1 - 0.00129870129870134*G0_1_0_0_4_3 + 0.000389610389610408*G0_1_0_0_4_4 - 0.00129870129870134*G0_1_0_0_4_5 + 0.000194805194805196*G0_1_0_0_5_0 - 0.00220779220779228*G0_1_0_0_5_1 + 0.000454545454545471*G0_1_0_0_5_2 - 0.00181818181818188*G0_1_0_0_5_3 - 0.00129870129870134*G0_1_0_0_5_4 - 0.0124675324675329*G0_1_0_0_5_5 + 0.000616883116883138*G0_1_0_1_0_0 - 0.00219155844155853*G0_1_0_1_0_1 + 0.000909090909090937*G0_1_0_1_0_3 + 0.000194805194805201*G0_1_0_1_0_4 - 0.00220779220779228*G0_1_0_1_0_5 - 0.00219155844155853*G0_1_0_1_1_0 + 0.00219155844155851*G0_1_0_1_1_2 - 0.0100649350649354*G0_1_0_1_1_3 + 0.0100649350649355*G0_1_0_1_1_5 + 0.00219155844155851*G0_1_0_1_2_1 - 0.000616883116883137*G0_1_0_1_2_2 + 0.00220779220779229*G0_1_0_1_2_3 - 0.0001948051948052*G0_1_0_1_2_4 - 0.00090909090909094*G0_1_0_1_2_5 + 0.000909090909090937*G0_1_0_1_3_0 - 0.0100649350649354*G0_1_0_1_3_1 + 0.00220779220779229*G0_1_0_1_3_2 - 0.0233766233766242*G0_1_0_1_3_3 - 0.00181818181818188*G0_1_0_1_3_4 + 0.000194805194805201*G0_1_0_1_4_0 - 0.0001948051948052*G0_1_0_1_4_2 - 0.00181818181818188*G0_1_0_1_4_3 + 0.00181818181818188*G0_1_0_1_4_5 - 0.00220779220779228*G0_1_0_1_5_0 + 0.0100649350649355*G0_1_0_1_5_1 - 0.00090909090909094*G0_1_0_1_5_2 + 0.00181818181818188*G0_1_0_1_5_4 + 0.0233766233766242*G0_1_0_1_5_5 - 0.000186688311688319*G0_1_0_2_0_0 + 0.00018668831168832*G0_1_0_2_0_2 - 0.000454545454545468*G0_1_0_2_0_3 + 0.000454545454545471*G0_1_0_2_0_5 + 0.00219155844155851*G0_1_0_2_1_1 - 0.000616883116883137*G0_1_0_2_1_2 + 0.00220779220779229*G0_1_0_2_1_3 - 0.0001948051948052*G0_1_0_2_1_4 - 0.00090909090909094*G0_1_0_2_1_5 + 0.00018668831168832*G0_1_0_2_2_0 - 0.000616883116883137*G0_1_0_2_2_1 - 0.00172889610389619*G0_1_0_2_2_2 - 0.000194805194805209*G0_1_0_2_2_3 - 0.000941558441558481*G0_1_0_2_2_4 - 0.000454545454545471*G0_1_0_2_2_5 - 0.000454545454545468*G0_1_0_2_3_0 + 0.00220779220779229*G0_1_0_2_3_1 - 0.000194805194805209*G0_1_0_2_3_2 + 0.0124675324675329*G0_1_0_2_3_3 + 0.00129870129870134*G0_1_0_2_3_4 + 0.00181818181818189*G0_1_0_2_3_5 - 0.0001948051948052*G0_1_0_2_4_1 - 0.000941558441558481*G0_1_0_2_4_2 + 0.00129870129870134*G0_1_0_2_4_3 - 0.000389610389610409*G0_1_0_2_4_4 + 0.00129870129870134*G0_1_0_2_4_5 + 0.000454545454545471*G0_1_0_2_5_0 - 0.00090909090909094*G0_1_0_2_5_1 - 0.000454545454545471*G0_1_0_2_5_2 + 0.00181818181818189*G0_1_0_2_5_3 + 0.00129870129870134*G0_1_0_2_5_4 + 0.00207792207792215*G0_1_0_2_5_5 + 0.000454545454545467*G0_1_0_3_0_0 + 0.000909090909090937*G0_1_0_3_0_1 - 0.000454545454545468*G0_1_0_3_0_2 - 0.00207792207792214*G0_1_0_3_0_3 - 0.00129870129870134*G0_1_0_3_0_4 - 0.00181818181818188*G0_1_0_3_0_5 + 0.000909090909090937*G0_1_0_3_1_0 - 0.0100649350649354*G0_1_0_3_1_1 + 0.00220779220779229*G0_1_0_3_1_2 - 0.0233766233766242*G0_1_0_3_1_3 - 0.00181818181818188*G0_1_0_3_1_4 - 0.000454545454545468*G0_1_0_3_2_0 + 0.00220779220779229*G0_1_0_3_2_1 - 0.000194805194805209*G0_1_0_3_2_2 + 0.0124675324675329*G0_1_0_3_2_3 + 0.00129870129870134*G0_1_0_3_2_4 + 0.00181818181818189*G0_1_0_3_2_5 - 0.00207792207792214*G0_1_0_3_3_0 - 0.0233766233766242*G0_1_0_3_3_1 + 0.0124675324675329*G0_1_0_3_3_2 + 0.00467532467532475*G0_1_0_3_3_3 + 0.00779220779220804*G0_1_0_3_3_4 + 0.000519480519480509*G0_1_0_3_3_5 - 0.00129870129870134*G0_1_0_3_4_0 - 0.00181818181818188*G0_1_0_3_4_1 + 0.00129870129870134*G0_1_0_3_4_2 + 0.00779220779220804*G0_1_0_3_4_3 + 0.00259740259740268*G0_1_0_3_4_4 - 0.00181818181818188*G0_1_0_3_5_0 + 0.00181818181818189*G0_1_0_3_5_2 + 0.000519480519480509*G0_1_0_3_5_3 - 0.00051948051948054*G0_1_0_3_5_5 + 0.000941558441558477*G0_1_0_4_0_0 + 0.000194805194805201*G0_1_0_4_0_1 - 0.00129870129870134*G0_1_0_4_0_3 + 0.000389610389610408*G0_1_0_4_0_4 - 0.00129870129870134*G0_1_0_4_0_5 + 0.000194805194805201*G0_1_0_4_1_0 - 0.0001948051948052*G0_1_0_4_1_2 - 0.00181818181818188*G0_1_0_4_1_3 + 0.00181818181818188*G0_1_0_4_1_5 - 0.0001948051948052*G0_1_0_4_2_1 - 0.000941558441558481*G0_1_0_4_2_2 + 0.00129870129870134*G0_1_0_4_2_3 - 0.000389610389610409*G0_1_0_4_2_4 + 0.00129870129870134*G0_1_0_4_2_5 - 0.00129870129870134*G0_1_0_4_3_0 - 0.00181818181818188*G0_1_0_4_3_1 + 0.00129870129870134*G0_1_0_4_3_2 + 0.00779220779220804*G0_1_0_4_3_3 + 0.00259740259740268*G0_1_0_4_3_4 + 0.000389610389610408*G0_1_0_4_4_0 - 0.000389610389610409*G0_1_0_4_4_2 + 0.00259740259740268*G0_1_0_4_4_3 - 0.00259740259740269*G0_1_0_4_4_5 - 0.00129870129870134*G0_1_0_4_5_0 + 0.00181818181818188*G0_1_0_4_5_1 + 0.00129870129870134*G0_1_0_4_5_2 - 0.00259740259740269*G0_1_0_4_5_4 - 0.00779220779220807*G0_1_0_4_5_5 + 0.000194805194805196*G0_1_0_5_0_0 - 0.00220779220779228*G0_1_0_5_0_1 + 0.000454545454545471*G0_1_0_5_0_2 - 0.00181818181818188*G0_1_0_5_0_3 - 0.00129870129870134*G0_1_0_5_0_4 - 0.0124675324675329*G0_1_0_5_0_5 - 0.00220779220779228*G0_1_0_5_1_0 + 0.0100649350649355*G0_1_0_5_1_1 - 0.00090909090909094*G0_1_0_5_1_2 + 0.00181818181818188*G0_1_0_5_1_4 + 0.0233766233766242*G0_1_0_5_1_5 + 0.000454545454545471*G0_1_0_5_2_0 - 0.00090909090909094*G0_1_0_5_2_1 - 0.000454545454545471*G0_1_0_5_2_2 + 0.00181818181818188*G0_1_0_5_2_3 + 0.00129870129870134*G0_1_0_5_2_4 + 0.00207792207792215*G0_1_0_5_2_5 - 0.00181818181818188*G0_1_0_5_3_0 + 0.00181818181818188*G0_1_0_5_3_2 + 0.000519480519480509*G0_1_0_5_3_3 - 0.000519480519480539*G0_1_0_5_3_5 - 0.00129870129870134*G0_1_0_5_4_0 + 0.00181818181818188*G0_1_0_5_4_1 + 0.00129870129870134*G0_1_0_5_4_2 - 0.00259740259740269*G0_1_0_5_4_4 - 0.00779220779220807*G0_1_0_5_4_5 - 0.0124675324675329*G0_1_0_5_5_0 + 0.0233766233766242*G0_1_0_5_5_1 + 0.00207792207792215*G0_1_0_5_5_2 - 0.00051948051948054*G0_1_0_5_5_3 - 0.00779220779220807*G0_1_0_5_5_4 - 0.00467532467532485*G0_1_0_5_5_5; + A[19] = A[91] + 0.00172889610389618*G0_0_1_0_0_0 + 0.000616883116883139*G0_0_1_0_0_1 - 0.000186688311688319*G0_0_1_0_0_2 + 0.000454545454545467*G0_0_1_0_0_3 + 0.000941558441558473*G0_0_1_0_0_4 + 0.000194805194805195*G0_0_1_0_0_5 + 0.000616883116883139*G0_0_1_0_1_0 - 0.00219155844155853*G0_0_1_0_1_1 + 0.000909090909090936*G0_0_1_0_1_3 + 0.000194805194805202*G0_0_1_0_1_4 - 0.00220779220779228*G0_0_1_0_1_5 - 0.000186688311688319*G0_0_1_0_2_0 + 0.00018668831168832*G0_0_1_0_2_2 - 0.000454545454545468*G0_0_1_0_2_3 + 0.000454545454545472*G0_0_1_0_2_5 + 0.000454545454545467*G0_0_1_0_3_0 + 0.000909090909090936*G0_0_1_0_3_1 - 0.000454545454545468*G0_0_1_0_3_2 - 0.00207792207792214*G0_0_1_0_3_3 - 0.00129870129870134*G0_0_1_0_3_4 - 0.00181818181818188*G0_0_1_0_3_5 + 0.000941558441558473*G0_0_1_0_4_0 + 0.000194805194805202*G0_0_1_0_4_1 - 0.00129870129870134*G0_0_1_0_4_3 + 0.000389610389610401*G0_0_1_0_4_4 - 0.00129870129870134*G0_0_1_0_4_5 + 0.000194805194805195*G0_0_1_0_5_0 - 0.00220779220779228*G0_0_1_0_5_1 + 0.000454545454545471*G0_0_1_0_5_2 - 0.00181818181818188*G0_0_1_0_5_3 - 0.00129870129870134*G0_0_1_0_5_4 - 0.0124675324675329*G0_0_1_0_5_5 + 0.000616883116883139*G0_0_1_1_0_0 - 0.00219155844155853*G0_0_1_1_0_1 + 0.000909090909090936*G0_0_1_1_0_3 + 0.000194805194805202*G0_0_1_1_0_4 - 0.00220779220779228*G0_0_1_1_0_5 - 0.00219155844155853*G0_0_1_1_1_0 + 0.00219155844155851*G0_0_1_1_1_2 - 0.0100649350649354*G0_0_1_1_1_3 + 0.0100649350649354*G0_0_1_1_1_5 + 0.00219155844155851*G0_0_1_1_2_1 - 0.000616883116883137*G0_0_1_1_2_2 + 0.00220779220779229*G0_0_1_1_2_3 - 0.000194805194805201*G0_0_1_1_2_4 - 0.00090909090909094*G0_0_1_1_2_5 + 0.000909090909090936*G0_0_1_1_3_0 - 0.0100649350649354*G0_0_1_1_3_1 + 0.00220779220779229*G0_0_1_1_3_2 - 0.0233766233766242*G0_0_1_1_3_3 - 0.00181818181818188*G0_0_1_1_3_4 + 0.000194805194805202*G0_0_1_1_4_0 - 0.000194805194805201*G0_0_1_1_4_2 - 0.00181818181818188*G0_0_1_1_4_3 + 0.00181818181818188*G0_0_1_1_4_5 - 0.00220779220779228*G0_0_1_1_5_0 + 0.0100649350649354*G0_0_1_1_5_1 - 0.00090909090909094*G0_0_1_1_5_2 + 0.00181818181818188*G0_0_1_1_5_4 + 0.0233766233766242*G0_0_1_1_5_5 - 0.000186688311688319*G0_0_1_2_0_0 + 0.00018668831168832*G0_0_1_2_0_2 - 0.000454545454545468*G0_0_1_2_0_3 + 0.000454545454545472*G0_0_1_2_0_5 + 0.00219155844155851*G0_0_1_2_1_1 - 0.000616883116883137*G0_0_1_2_1_2 + 0.00220779220779229*G0_0_1_2_1_3 - 0.000194805194805201*G0_0_1_2_1_4 - 0.00090909090909094*G0_0_1_2_1_5 + 0.00018668831168832*G0_0_1_2_2_0 - 0.000616883116883137*G0_0_1_2_2_1 - 0.00172889610389619*G0_0_1_2_2_2 - 0.00019480519480521*G0_0_1_2_2_3 - 0.000941558441558481*G0_0_1_2_2_4 - 0.000454545454545472*G0_0_1_2_2_5 - 0.000454545454545468*G0_0_1_2_3_0 + 0.00220779220779229*G0_0_1_2_3_1 - 0.00019480519480521*G0_0_1_2_3_2 + 0.0124675324675329*G0_0_1_2_3_3 + 0.00129870129870134*G0_0_1_2_3_4 + 0.00181818181818188*G0_0_1_2_3_5 - 0.000194805194805201*G0_0_1_2_4_1 - 0.000941558441558481*G0_0_1_2_4_2 + 0.00129870129870134*G0_0_1_2_4_3 - 0.000389610389610403*G0_0_1_2_4_4 + 0.00129870129870134*G0_0_1_2_4_5 + 0.000454545454545472*G0_0_1_2_5_0 - 0.00090909090909094*G0_0_1_2_5_1 - 0.000454545454545472*G0_0_1_2_5_2 + 0.00181818181818188*G0_0_1_2_5_3 + 0.00129870129870134*G0_0_1_2_5_4 + 0.00207792207792215*G0_0_1_2_5_5 + 0.000454545454545467*G0_0_1_3_0_0 + 0.000909090909090936*G0_0_1_3_0_1 - 0.000454545454545468*G0_0_1_3_0_2 - 0.00207792207792214*G0_0_1_3_0_3 - 0.00129870129870134*G0_0_1_3_0_4 - 0.00181818181818188*G0_0_1_3_0_5 + 0.000909090909090936*G0_0_1_3_1_0 - 0.0100649350649354*G0_0_1_3_1_1 + 0.00220779220779229*G0_0_1_3_1_2 - 0.0233766233766242*G0_0_1_3_1_3 - 0.00181818181818188*G0_0_1_3_1_4 - 0.000454545454545468*G0_0_1_3_2_0 + 0.00220779220779229*G0_0_1_3_2_1 - 0.00019480519480521*G0_0_1_3_2_2 + 0.0124675324675329*G0_0_1_3_2_3 + 0.00129870129870134*G0_0_1_3_2_4 + 0.00181818181818188*G0_0_1_3_2_5 - 0.00207792207792214*G0_0_1_3_3_0 - 0.0233766233766242*G0_0_1_3_3_1 + 0.0124675324675329*G0_0_1_3_3_2 + 0.00467532467532478*G0_0_1_3_3_3 + 0.00779220779220804*G0_0_1_3_3_4 + 0.000519480519480514*G0_0_1_3_3_5 - 0.00129870129870134*G0_0_1_3_4_0 - 0.00181818181818188*G0_0_1_3_4_1 + 0.00129870129870134*G0_0_1_3_4_2 + 0.00779220779220804*G0_0_1_3_4_3 + 0.00259740259740267*G0_0_1_3_4_4 - 0.00181818181818188*G0_0_1_3_5_0 + 0.00181818181818188*G0_0_1_3_5_2 + 0.000519480519480514*G0_0_1_3_5_3 - 0.000519480519480538*G0_0_1_3_5_5 + 0.000941558441558473*G0_0_1_4_0_0 + 0.000194805194805202*G0_0_1_4_0_1 - 0.00129870129870134*G0_0_1_4_0_3 + 0.000389610389610401*G0_0_1_4_0_4 - 0.00129870129870134*G0_0_1_4_0_5 + 0.000194805194805202*G0_0_1_4_1_0 - 0.000194805194805201*G0_0_1_4_1_2 - 0.00181818181818188*G0_0_1_4_1_3 + 0.00181818181818188*G0_0_1_4_1_5 - 0.000194805194805201*G0_0_1_4_2_1 - 0.000941558441558481*G0_0_1_4_2_2 + 0.00129870129870134*G0_0_1_4_2_3 - 0.000389610389610403*G0_0_1_4_2_4 + 0.00129870129870134*G0_0_1_4_2_5 - 0.00129870129870134*G0_0_1_4_3_0 - 0.00181818181818188*G0_0_1_4_3_1 + 0.00129870129870134*G0_0_1_4_3_2 + 0.00779220779220804*G0_0_1_4_3_3 + 0.00259740259740267*G0_0_1_4_3_4 + 0.000389610389610401*G0_0_1_4_4_0 - 0.000389610389610403*G0_0_1_4_4_2 + 0.00259740259740267*G0_0_1_4_4_3 - 0.0025974025974027*G0_0_1_4_4_5 - 0.00129870129870134*G0_0_1_4_5_0 + 0.00181818181818188*G0_0_1_4_5_1 + 0.00129870129870134*G0_0_1_4_5_2 - 0.0025974025974027*G0_0_1_4_5_4 - 0.00779220779220807*G0_0_1_4_5_5 + 0.000194805194805195*G0_0_1_5_0_0 - 0.00220779220779228*G0_0_1_5_0_1 + 0.000454545454545472*G0_0_1_5_0_2 - 0.00181818181818188*G0_0_1_5_0_3 - 0.00129870129870134*G0_0_1_5_0_4 - 0.0124675324675329*G0_0_1_5_0_5 - 0.00220779220779228*G0_0_1_5_1_0 + 0.0100649350649354*G0_0_1_5_1_1 - 0.00090909090909094*G0_0_1_5_1_2 + 0.00181818181818188*G0_0_1_5_1_4 + 0.0233766233766242*G0_0_1_5_1_5 + 0.000454545454545472*G0_0_1_5_2_0 - 0.00090909090909094*G0_0_1_5_2_1 - 0.000454545454545471*G0_0_1_5_2_2 + 0.00181818181818188*G0_0_1_5_2_3 + 0.00129870129870134*G0_0_1_5_2_4 + 0.00207792207792215*G0_0_1_5_2_5 - 0.00181818181818188*G0_0_1_5_3_0 + 0.00181818181818188*G0_0_1_5_3_2 + 0.000519480519480515*G0_0_1_5_3_3 - 0.000519480519480538*G0_0_1_5_3_5 - 0.00129870129870134*G0_0_1_5_4_0 + 0.00181818181818188*G0_0_1_5_4_1 + 0.00129870129870134*G0_0_1_5_4_2 - 0.0025974025974027*G0_0_1_5_4_4 - 0.00779220779220807*G0_0_1_5_4_5 - 0.0124675324675329*G0_0_1_5_5_0 + 0.0233766233766242*G0_0_1_5_5_1 + 0.00207792207792215*G0_0_1_5_5_2 - 0.000519480519480537*G0_0_1_5_5_3 - 0.00779220779220807*G0_0_1_5_5_4 - 0.00467532467532485*G0_0_1_5_5_5 - 0.00172889610389618*G0_1_0_0_0_0 - 0.000616883116883139*G0_1_0_0_0_1 + 0.000186688311688319*G0_1_0_0_0_2 - 0.000454545454545467*G0_1_0_0_0_3 - 0.000941558441558473*G0_1_0_0_0_4 - 0.000194805194805195*G0_1_0_0_0_5 - 0.000616883116883139*G0_1_0_0_1_0 + 0.00219155844155853*G0_1_0_0_1_1 - 0.000909090909090936*G0_1_0_0_1_3 - 0.000194805194805202*G0_1_0_0_1_4 + 0.00220779220779228*G0_1_0_0_1_5 + 0.000186688311688319*G0_1_0_0_2_0 - 0.00018668831168832*G0_1_0_0_2_2 + 0.000454545454545468*G0_1_0_0_2_3 - 0.000454545454545472*G0_1_0_0_2_5 - 0.000454545454545467*G0_1_0_0_3_0 - 0.000909090909090936*G0_1_0_0_3_1 + 0.000454545454545468*G0_1_0_0_3_2 + 0.00207792207792214*G0_1_0_0_3_3 + 0.00129870129870134*G0_1_0_0_3_4 + 0.00181818181818188*G0_1_0_0_3_5 - 0.000941558441558473*G0_1_0_0_4_0 - 0.000194805194805202*G0_1_0_0_4_1 + 0.00129870129870134*G0_1_0_0_4_3 - 0.000389610389610401*G0_1_0_0_4_4 + 0.00129870129870134*G0_1_0_0_4_5 - 0.000194805194805195*G0_1_0_0_5_0 + 0.00220779220779228*G0_1_0_0_5_1 - 0.000454545454545472*G0_1_0_0_5_2 + 0.00181818181818188*G0_1_0_0_5_3 + 0.00129870129870134*G0_1_0_0_5_4 + 0.0124675324675329*G0_1_0_0_5_5 - 0.000616883116883139*G0_1_0_1_0_0 + 0.00219155844155853*G0_1_0_1_0_1 - 0.000909090909090936*G0_1_0_1_0_3 - 0.000194805194805202*G0_1_0_1_0_4 + 0.00220779220779228*G0_1_0_1_0_5 + 0.00219155844155853*G0_1_0_1_1_0 - 0.00219155844155851*G0_1_0_1_1_2 + 0.0100649350649354*G0_1_0_1_1_3 - 0.0100649350649355*G0_1_0_1_1_5 - 0.00219155844155851*G0_1_0_1_2_1 + 0.000616883116883136*G0_1_0_1_2_2 - 0.00220779220779229*G0_1_0_1_2_3 + 0.000194805194805201*G0_1_0_1_2_4 + 0.00090909090909094*G0_1_0_1_2_5 - 0.000909090909090936*G0_1_0_1_3_0 + 0.0100649350649354*G0_1_0_1_3_1 - 0.00220779220779229*G0_1_0_1_3_2 + 0.0233766233766242*G0_1_0_1_3_3 + 0.00181818181818188*G0_1_0_1_3_4 - 0.000194805194805202*G0_1_0_1_4_0 + 0.000194805194805201*G0_1_0_1_4_2 + 0.00181818181818188*G0_1_0_1_4_3 - 0.00181818181818188*G0_1_0_1_4_5 + 0.00220779220779228*G0_1_0_1_5_0 - 0.0100649350649355*G0_1_0_1_5_1 + 0.000909090909090941*G0_1_0_1_5_2 - 0.00181818181818188*G0_1_0_1_5_4 - 0.0233766233766242*G0_1_0_1_5_5 + 0.000186688311688319*G0_1_0_2_0_0 - 0.00018668831168832*G0_1_0_2_0_2 + 0.000454545454545468*G0_1_0_2_0_3 - 0.000454545454545472*G0_1_0_2_0_5 - 0.00219155844155851*G0_1_0_2_1_1 + 0.000616883116883136*G0_1_0_2_1_2 - 0.00220779220779229*G0_1_0_2_1_3 + 0.000194805194805201*G0_1_0_2_1_4 + 0.00090909090909094*G0_1_0_2_1_5 - 0.00018668831168832*G0_1_0_2_2_0 + 0.000616883116883137*G0_1_0_2_2_1 + 0.00172889610389619*G0_1_0_2_2_2 + 0.00019480519480521*G0_1_0_2_2_3 + 0.000941558441558481*G0_1_0_2_2_4 + 0.000454545454545471*G0_1_0_2_2_5 + 0.000454545454545468*G0_1_0_2_3_0 - 0.00220779220779229*G0_1_0_2_3_1 + 0.00019480519480521*G0_1_0_2_3_2 - 0.0124675324675329*G0_1_0_2_3_3 - 0.00129870129870134*G0_1_0_2_3_4 - 0.00181818181818188*G0_1_0_2_3_5 + 0.000194805194805201*G0_1_0_2_4_1 + 0.000941558441558481*G0_1_0_2_4_2 - 0.00129870129870134*G0_1_0_2_4_3 + 0.000389610389610403*G0_1_0_2_4_4 - 0.00129870129870134*G0_1_0_2_4_5 - 0.000454545454545472*G0_1_0_2_5_0 + 0.00090909090909094*G0_1_0_2_5_1 + 0.000454545454545471*G0_1_0_2_5_2 - 0.00181818181818188*G0_1_0_2_5_3 - 0.00129870129870134*G0_1_0_2_5_4 - 0.00207792207792215*G0_1_0_2_5_5 - 0.000454545454545467*G0_1_0_3_0_0 - 0.000909090909090936*G0_1_0_3_0_1 + 0.000454545454545468*G0_1_0_3_0_2 + 0.00207792207792214*G0_1_0_3_0_3 + 0.00129870129870134*G0_1_0_3_0_4 + 0.00181818181818188*G0_1_0_3_0_5 - 0.000909090909090936*G0_1_0_3_1_0 + 0.0100649350649354*G0_1_0_3_1_1 - 0.00220779220779229*G0_1_0_3_1_2 + 0.0233766233766242*G0_1_0_3_1_3 + 0.00181818181818188*G0_1_0_3_1_4 + 0.000454545454545468*G0_1_0_3_2_0 - 0.00220779220779229*G0_1_0_3_2_1 + 0.00019480519480521*G0_1_0_3_2_2 - 0.0124675324675329*G0_1_0_3_2_3 - 0.00129870129870134*G0_1_0_3_2_4 - 0.00181818181818188*G0_1_0_3_2_5 + 0.00207792207792214*G0_1_0_3_3_0 + 0.0233766233766242*G0_1_0_3_3_1 - 0.0124675324675329*G0_1_0_3_3_2 - 0.00467532467532479*G0_1_0_3_3_3 - 0.00779220779220804*G0_1_0_3_3_4 - 0.000519480519480515*G0_1_0_3_3_5 + 0.00129870129870134*G0_1_0_3_4_0 + 0.00181818181818188*G0_1_0_3_4_1 - 0.00129870129870134*G0_1_0_3_4_2 - 0.00779220779220804*G0_1_0_3_4_3 - 0.00259740259740267*G0_1_0_3_4_4 + 0.00181818181818188*G0_1_0_3_5_0 - 0.00181818181818188*G0_1_0_3_5_2 - 0.000519480519480515*G0_1_0_3_5_3 + 0.000519480519480538*G0_1_0_3_5_5 - 0.000941558441558473*G0_1_0_4_0_0 - 0.000194805194805202*G0_1_0_4_0_1 + 0.00129870129870134*G0_1_0_4_0_3 - 0.000389610389610401*G0_1_0_4_0_4 + 0.00129870129870134*G0_1_0_4_0_5 - 0.000194805194805202*G0_1_0_4_1_0 + 0.000194805194805201*G0_1_0_4_1_2 + 0.00181818181818188*G0_1_0_4_1_3 - 0.00181818181818188*G0_1_0_4_1_5 + 0.000194805194805201*G0_1_0_4_2_1 + 0.000941558441558481*G0_1_0_4_2_2 - 0.00129870129870134*G0_1_0_4_2_3 + 0.000389610389610403*G0_1_0_4_2_4 - 0.00129870129870134*G0_1_0_4_2_5 + 0.00129870129870134*G0_1_0_4_3_0 + 0.00181818181818188*G0_1_0_4_3_1 - 0.00129870129870134*G0_1_0_4_3_2 - 0.00779220779220804*G0_1_0_4_3_3 - 0.00259740259740267*G0_1_0_4_3_4 - 0.000389610389610401*G0_1_0_4_4_0 + 0.000389610389610403*G0_1_0_4_4_2 - 0.00259740259740267*G0_1_0_4_4_3 + 0.0025974025974027*G0_1_0_4_4_5 + 0.00129870129870134*G0_1_0_4_5_0 - 0.00181818181818188*G0_1_0_4_5_1 - 0.00129870129870134*G0_1_0_4_5_2 + 0.0025974025974027*G0_1_0_4_5_4 + 0.00779220779220807*G0_1_0_4_5_5 - 0.000194805194805195*G0_1_0_5_0_0 + 0.00220779220779228*G0_1_0_5_0_1 - 0.000454545454545472*G0_1_0_5_0_2 + 0.00181818181818188*G0_1_0_5_0_3 + 0.00129870129870134*G0_1_0_5_0_4 + 0.0124675324675329*G0_1_0_5_0_5 + 0.00220779220779228*G0_1_0_5_1_0 - 0.0100649350649355*G0_1_0_5_1_1 + 0.000909090909090941*G0_1_0_5_1_2 - 0.00181818181818188*G0_1_0_5_1_4 - 0.0233766233766242*G0_1_0_5_1_5 - 0.000454545454545472*G0_1_0_5_2_0 + 0.000909090909090941*G0_1_0_5_2_1 + 0.000454545454545471*G0_1_0_5_2_2 - 0.00181818181818188*G0_1_0_5_2_3 - 0.00129870129870134*G0_1_0_5_2_4 - 0.00207792207792215*G0_1_0_5_2_5 + 0.00181818181818188*G0_1_0_5_3_0 - 0.00181818181818188*G0_1_0_5_3_2 - 0.000519480519480515*G0_1_0_5_3_3 + 0.000519480519480538*G0_1_0_5_3_5 + 0.00129870129870134*G0_1_0_5_4_0 - 0.00181818181818188*G0_1_0_5_4_1 - 0.00129870129870134*G0_1_0_5_4_2 + 0.0025974025974027*G0_1_0_5_4_4 + 0.00779220779220807*G0_1_0_5_4_5 + 0.0124675324675329*G0_1_0_5_5_0 - 0.0233766233766242*G0_1_0_5_5_1 - 0.00207792207792215*G0_1_0_5_5_2 + 0.000519480519480538*G0_1_0_5_5_3 + 0.00779220779220807*G0_1_0_5_5_4 + 0.00467532467532485*G0_1_0_5_5_5; + A[66] = -A[64] - 0.00178977272727284*G0_0_1_0_0_0 + 0.000572240259740281*G0_0_1_0_0_1 + 0.000730519480519509*G0_0_1_0_0_2 - 0.00180194805194811*G0_0_1_0_0_3 - 0.00228896103896112*G0_0_1_0_0_4 - 0.00185064935064943*G0_0_1_0_0_5 + 0.000572240259740281*G0_0_1_0_1_0 + 0.000572240259740281*G0_0_1_0_1_1 + 0.000243506493506501*G0_0_1_0_1_2 - 0.00180194805194811*G0_0_1_0_1_3 - 0.00180194805194811*G0_0_1_0_1_4 - 0.000194805194805191*G0_0_1_0_1_5 + 0.00073051948051951*G0_0_1_0_2_0 + 0.000243506493506501*G0_0_1_0_2_1 - 0.00986201298701333*G0_0_1_0_2_2 - 0.00097402597402601*G0_0_1_0_2_3 - 0.00243506493506503*G0_0_1_0_2_4 + 0.000243506493506501*G0_0_1_0_2_5 - 0.00180194805194811*G0_0_1_0_3_0 - 0.00180194805194811*G0_0_1_0_3_1 - 0.000974025974026011*G0_0_1_0_3_2 + 0.0103246753246757*G0_0_1_0_3_3 + 0.00720779220779243*G0_0_1_0_3_4 + 0.00311688311688322*G0_0_1_0_3_5 - 0.00228896103896112*G0_0_1_0_4_0 - 0.00180194805194811*G0_0_1_0_4_1 - 0.00243506493506503*G0_0_1_0_4_2 + 0.00720779220779243*G0_0_1_0_4_3 + 0.0122727272727276*G0_0_1_0_4_4 + 0.00311688311688321*G0_0_1_0_4_5 - 0.00185064935064943*G0_0_1_0_5_0 - 0.000194805194805191*G0_0_1_0_5_1 + 0.000243506493506501*G0_0_1_0_5_2 + 0.00311688311688322*G0_0_1_0_5_3 + 0.00311688311688321*G0_0_1_0_5_4 + 0.000389610389610382*G0_0_1_0_5_5 + 0.000572240259740281*G0_0_1_1_0_0 + 0.000572240259740281*G0_0_1_1_0_1 + 0.000243506493506501*G0_0_1_1_0_2 - 0.00180194805194811*G0_0_1_1_0_3 - 0.00180194805194811*G0_0_1_1_0_4 - 0.000194805194805191*G0_0_1_1_0_5 + 0.000572240259740281*G0_0_1_1_1_0 - 0.00178977272727283*G0_0_1_1_1_1 + 0.000730519480519507*G0_0_1_1_1_2 - 0.00228896103896112*G0_0_1_1_1_3 - 0.00180194805194811*G0_0_1_1_1_4 - 0.00185064935064943*G0_0_1_1_1_5 + 0.000243506493506501*G0_0_1_1_2_0 + 0.000730519480519507*G0_0_1_1_2_1 - 0.00986201298701331*G0_0_1_1_2_2 - 0.00243506493506502*G0_0_1_1_2_3 - 0.00097402597402601*G0_0_1_1_2_4 + 0.000243506493506501*G0_0_1_1_2_5 - 0.00180194805194811*G0_0_1_1_3_0 - 0.00228896103896112*G0_0_1_1_3_1 - 0.00243506493506502*G0_0_1_1_3_2 + 0.0122727272727277*G0_0_1_1_3_3 + 0.00720779220779244*G0_0_1_1_3_4 + 0.00311688311688322*G0_0_1_1_3_5 - 0.00180194805194811*G0_0_1_1_4_0 - 0.00180194805194811*G0_0_1_1_4_1 - 0.00097402597402601*G0_0_1_1_4_2 + 0.00720779220779244*G0_0_1_1_4_3 + 0.0103246753246757*G0_0_1_1_4_4 + 0.00311688311688322*G0_0_1_1_4_5 - 0.000194805194805191*G0_0_1_1_5_0 - 0.00185064935064943*G0_0_1_1_5_1 + 0.000243506493506501*G0_0_1_1_5_2 + 0.00311688311688322*G0_0_1_1_5_3 + 0.00311688311688322*G0_0_1_1_5_4 + 0.00038961038961039*G0_0_1_1_5_5 + 0.00073051948051951*G0_0_1_2_0_0 + 0.000243506493506501*G0_0_1_2_0_1 - 0.00986201298701333*G0_0_1_2_0_2 - 0.00097402597402601*G0_0_1_2_0_3 - 0.00243506493506503*G0_0_1_2_0_4 + 0.000243506493506501*G0_0_1_2_0_5 + 0.0002435064935065*G0_0_1_2_1_0 + 0.000730519480519507*G0_0_1_2_1_1 - 0.00986201298701331*G0_0_1_2_1_2 - 0.00243506493506502*G0_0_1_2_1_3 - 0.00097402597402601*G0_0_1_2_1_4 + 0.000243506493506501*G0_0_1_2_1_5 - 0.00986201298701333*G0_0_1_2_2_0 - 0.00986201298701331*G0_0_1_2_2_1 + 0.201623376623384*G0_0_1_2_2_2 + 0.0409090909090924*G0_0_1_2_2_3 + 0.0409090909090924*G0_0_1_2_2_4 + 0.00146103896103904*G0_0_1_2_2_5 - 0.00097402597402601*G0_0_1_2_3_0 - 0.00243506493506502*G0_0_1_2_3_1 + 0.0409090909090924*G0_0_1_2_3_2 + 0.00779220779220807*G0_0_1_2_3_3 + 0.00389610389610405*G0_0_1_2_3_4 - 0.000974025974025999*G0_0_1_2_3_5 - 0.00243506493506503*G0_0_1_2_4_0 - 0.00097402597402601*G0_0_1_2_4_1 + 0.0409090909090924*G0_0_1_2_4_2 + 0.00389610389610405*G0_0_1_2_4_3 + 0.00779220779220813*G0_0_1_2_4_4 - 0.000974025974025997*G0_0_1_2_4_5 + 0.000243506493506501*G0_0_1_2_5_0 + 0.000243506493506501*G0_0_1_2_5_1 + 0.00146103896103904*G0_0_1_2_5_2 - 0.000974025974025997*G0_0_1_2_5_3 - 0.000974025974025997*G0_0_1_2_5_4 - 0.00180194805194811*G0_0_1_3_0_0 - 0.00180194805194811*G0_0_1_3_0_1 - 0.000974025974026011*G0_0_1_3_0_2 + 0.0103246753246757*G0_0_1_3_0_3 + 0.00720779220779243*G0_0_1_3_0_4 + 0.00311688311688322*G0_0_1_3_0_5 - 0.00180194805194811*G0_0_1_3_1_0 - 0.00228896103896112*G0_0_1_3_1_1 - 0.00243506493506502*G0_0_1_3_1_2 + 0.0122727272727277*G0_0_1_3_1_3 + 0.00720779220779244*G0_0_1_3_1_4 + 0.00311688311688322*G0_0_1_3_1_5 - 0.00097402597402601*G0_0_1_3_2_0 - 0.00243506493506502*G0_0_1_3_2_1 + 0.0409090909090924*G0_0_1_3_2_2 + 0.00779220779220807*G0_0_1_3_2_3 + 0.00389610389610405*G0_0_1_3_2_4 - 0.000974025974025999*G0_0_1_3_2_5 + 0.0103246753246756*G0_0_1_3_3_0 + 0.0122727272727277*G0_0_1_3_3_1 + 0.00779220779220807*G0_0_1_3_3_2 - 0.105194805194809*G0_0_1_3_3_3 - 0.0350649350649362*G0_0_1_3_3_4 - 0.0187012987012993*G0_0_1_3_3_5 + 0.00720779220779243*G0_0_1_3_4_0 + 0.00720779220779244*G0_0_1_3_4_1 + 0.00389610389610405*G0_0_1_3_4_2 - 0.0350649350649362*G0_0_1_3_4_3 - 0.0350649350649362*G0_0_1_3_4_4 - 0.0124675324675329*G0_0_1_3_4_5 + 0.00311688311688322*G0_0_1_3_5_0 + 0.00311688311688322*G0_0_1_3_5_1 - 0.000974025974025999*G0_0_1_3_5_2 - 0.0187012987012994*G0_0_1_3_5_3 - 0.0124675324675329*G0_0_1_3_5_4 - 0.00623376623376646*G0_0_1_3_5_5 - 0.00228896103896112*G0_0_1_4_0_0 - 0.00180194805194811*G0_0_1_4_0_1 - 0.00243506493506503*G0_0_1_4_0_2 + 0.00720779220779243*G0_0_1_4_0_3 + 0.0122727272727276*G0_0_1_4_0_4 + 0.00311688311688321*G0_0_1_4_0_5 - 0.00180194805194811*G0_0_1_4_1_0 - 0.00180194805194811*G0_0_1_4_1_1 - 0.00097402597402601*G0_0_1_4_1_2 + 0.00720779220779244*G0_0_1_4_1_3 + 0.0103246753246757*G0_0_1_4_1_4 + 0.00311688311688322*G0_0_1_4_1_5 - 0.00243506493506503*G0_0_1_4_2_0 - 0.00097402597402601*G0_0_1_4_2_1 + 0.0409090909090924*G0_0_1_4_2_2 + 0.00389610389610405*G0_0_1_4_2_3 + 0.00779220779220812*G0_0_1_4_2_4 - 0.000974025974025997*G0_0_1_4_2_5 + 0.00720779220779243*G0_0_1_4_3_0 + 0.00720779220779244*G0_0_1_4_3_1 + 0.00389610389610405*G0_0_1_4_3_2 - 0.0350649350649362*G0_0_1_4_3_3 - 0.0350649350649362*G0_0_1_4_3_4 - 0.0124675324675329*G0_0_1_4_3_5 + 0.0122727272727276*G0_0_1_4_4_0 + 0.0103246753246757*G0_0_1_4_4_1 + 0.00779220779220813*G0_0_1_4_4_2 - 0.0350649350649362*G0_0_1_4_4_3 - 0.105194805194808*G0_0_1_4_4_4 - 0.0187012987012993*G0_0_1_4_4_5 + 0.00311688311688321*G0_0_1_4_5_0 + 0.00311688311688322*G0_0_1_4_5_1 - 0.000974025974025997*G0_0_1_4_5_2 - 0.0124675324675329*G0_0_1_4_5_3 - 0.0187012987012993*G0_0_1_4_5_4 - 0.00623376623376646*G0_0_1_4_5_5 - 0.00185064935064943*G0_0_1_5_0_0 - 0.000194805194805191*G0_0_1_5_0_1 + 0.000243506493506501*G0_0_1_5_0_2 + 0.00311688311688322*G0_0_1_5_0_3 + 0.00311688311688321*G0_0_1_5_0_4 + 0.000389610389610382*G0_0_1_5_0_5 - 0.000194805194805191*G0_0_1_5_1_0 - 0.00185064935064943*G0_0_1_5_1_1 + 0.000243506493506501*G0_0_1_5_1_2 + 0.00311688311688322*G0_0_1_5_1_3 + 0.00311688311688322*G0_0_1_5_1_4 + 0.00038961038961039*G0_0_1_5_1_5 + 0.000243506493506501*G0_0_1_5_2_0 + 0.000243506493506501*G0_0_1_5_2_1 + 0.00146103896103904*G0_0_1_5_2_2 - 0.000974025974025997*G0_0_1_5_2_3 - 0.000974025974025997*G0_0_1_5_2_4 + 0.00311688311688322*G0_0_1_5_3_0 + 0.00311688311688322*G0_0_1_5_3_1 - 0.000974025974025997*G0_0_1_5_3_2 - 0.0187012987012994*G0_0_1_5_3_3 - 0.0124675324675329*G0_0_1_5_3_4 - 0.00623376623376646*G0_0_1_5_3_5 + 0.00311688311688321*G0_0_1_5_4_0 + 0.00311688311688322*G0_0_1_5_4_1 - 0.000974025974025997*G0_0_1_5_4_2 - 0.0124675324675329*G0_0_1_5_4_3 - 0.0187012987012993*G0_0_1_5_4_4 - 0.00623376623376646*G0_0_1_5_4_5 + 0.000389610389610382*G0_0_1_5_5_0 + 0.00038961038961039*G0_0_1_5_5_1 - 0.00623376623376646*G0_0_1_5_5_3 - 0.00623376623376646*G0_0_1_5_5_4 - 0.0140259740259747*G0_0_1_5_5_5 + 0.0559212662337682*G0_1_1_0_0_0 - 0.0055762987012989*G0_1_1_0_0_1 - 0.00234983766233774*G0_1_1_0_0_2 + 0.00340909090909101*G0_1_1_0_0_3 + 0.0154383116883122*G0_1_1_0_0_4 + 0.0271753246753257*G0_1_1_0_0_5 - 0.0055762987012989*G0_1_1_0_1_0 - 0.000133928571428572*G0_1_1_0_1_1 + 0.00071834415584418*G0_1_1_0_1_2 + 0.0010227272727273*G0_1_1_0_1_3 + 0.000681818181818198*G0_1_1_0_1_4 - 0.00555194805194825*G0_1_1_0_1_5 - 0.00234983766233774*G0_1_1_0_2_0 + 0.00071834415584418*G0_1_1_0_2_1 - 0.00791396103896131*G0_1_1_0_2_2 - 0.000487012987013004*G0_1_1_0_2_3 - 0.00535714285714304*G0_1_1_0_2_4 - 0.000681818181818212*G0_1_1_0_2_5 + 0.00340909090909101*G0_1_1_0_3_0 + 0.0010227272727273*G0_1_1_0_3_1 - 0.000487012987013003*G0_1_1_0_3_2 - 0.00798701298701325*G0_1_1_0_3_3 - 0.00818181818181844*G0_1_1_0_3_4 - 0.00545454545454563*G0_1_1_0_3_5 + 0.0154383116883122*G0_1_1_0_4_0 + 0.000681818181818198*G0_1_1_0_4_1 - 0.00535714285714304*G0_1_1_0_4_2 - 0.00818181818181844*G0_1_1_0_4_3 - 0.000974025974025961*G0_1_1_0_4_4 + 0.0271753246753257*G0_1_1_0_5_0 - 0.00555194805194825*G0_1_1_0_5_1 - 0.000681818181818213*G0_1_1_0_5_2 - 0.00545454545454563*G0_1_1_0_5_3 + 0.0198701298701306*G0_1_1_0_5_5 - 0.0055762987012989*G0_1_1_1_0_0 - 0.000133928571428572*G0_1_1_1_0_1 + 0.00071834415584418*G0_1_1_1_0_2 + 0.0010227272727273*G0_1_1_1_0_3 + 0.000681818181818199*G0_1_1_1_0_4 - 0.00555194805194825*G0_1_1_1_0_5 - 0.000133928571428572*G0_1_1_1_1_0 + 0.00175324675324682*G0_1_1_1_1_1 + 0.00292207792207802*G0_1_1_1_1_3 + 0.00452922077922093*G0_1_1_1_1_4 + 0.00779220779220806*G0_1_1_1_1_5 + 0.000718344155844181*G0_1_1_1_2_0 - 0.00949675324675357*G0_1_1_1_2_2 - 0.00194805194805202*G0_1_1_1_2_3 + 0.000974025974026005*G0_1_1_1_2_4 + 0.00170454545454551*G0_1_1_1_2_5 + 0.0010227272727273*G0_1_1_1_3_0 + 0.00292207792207802*G0_1_1_1_3_1 - 0.00194805194805202*G0_1_1_1_3_2 - 0.0031168831168832*G0_1_1_1_3_3 - 0.0111038961038965*G0_1_1_1_3_4 - 0.00545454545454564*G0_1_1_1_3_5 + 0.000681818181818199*G0_1_1_1_4_0 + 0.00452922077922093*G0_1_1_1_4_1 + 0.000974025974026006*G0_1_1_1_4_2 - 0.0111038961038965*G0_1_1_1_4_3 - 0.0292207792207802*G0_1_1_1_4_4 - 0.0124675324675329*G0_1_1_1_4_5 - 0.00555194805194825*G0_1_1_1_5_0 + 0.00779220779220806*G0_1_1_1_5_1 + 0.00170454545454551*G0_1_1_1_5_2 - 0.00545454545454564*G0_1_1_1_5_3 - 0.0124675324675329*G0_1_1_1_5_4 - 0.0101298701298705*G0_1_1_1_5_5 - 0.00234983766233774*G0_1_1_2_0_0 + 0.00071834415584418*G0_1_1_2_0_1 - 0.00791396103896131*G0_1_1_2_0_2 - 0.000487012987013004*G0_1_1_2_0_3 - 0.00535714285714304*G0_1_1_2_0_4 - 0.000681818181818212*G0_1_1_2_0_5 + 0.00071834415584418*G0_1_1_2_1_0 - 0.00949675324675356*G0_1_1_2_1_2 - 0.00194805194805202*G0_1_1_2_1_3 + 0.000974025974026007*G0_1_1_2_1_4 + 0.00170454545454551*G0_1_1_2_1_5 - 0.00791396103896131*G0_1_1_2_2_0 - 0.00949675324675356*G0_1_1_2_2_1 + 0.17715097402598*G0_1_1_2_2_2 + 0.0394480519480533*G0_1_1_2_2_3 + 0.0379870129870144*G0_1_1_2_2_4 + 0.00389610389610406*G0_1_1_2_2_5 - 0.000487012987013004*G0_1_1_2_3_0 - 0.00194805194805202*G0_1_1_2_3_1 + 0.0394480519480533*G0_1_1_2_3_2 + 0.00292207792207801*G0_1_1_2_3_3 - 0.00097402597402599*G0_1_1_2_3_4 - 0.00681818181818204*G0_1_1_2_3_5 - 0.00535714285714304*G0_1_1_2_4_0 + 0.000974025974026006*G0_1_1_2_4_1 + 0.0379870129870143*G0_1_1_2_4_2 - 0.000974025974025988*G0_1_1_2_4_3 - 0.00681818181818201*G0_1_1_2_4_4 - 0.00974025974026006*G0_1_1_2_4_5 - 0.000681818181818212*G0_1_1_2_5_0 + 0.00170454545454551*G0_1_1_2_5_1 + 0.00389610389610406*G0_1_1_2_5_2 - 0.00681818181818204*G0_1_1_2_5_3 - 0.00974025974026006*G0_1_1_2_5_4 - 0.0124675324675329*G0_1_1_2_5_5 + 0.00340909090909101*G0_1_1_3_0_0 + 0.0010227272727273*G0_1_1_3_0_1 - 0.000487012987013003*G0_1_1_3_0_2 - 0.00798701298701325*G0_1_1_3_0_3 - 0.00818181818181844*G0_1_1_3_0_4 - 0.00545454545454563*G0_1_1_3_0_5 + 0.0010227272727273*G0_1_1_3_1_0 + 0.00292207792207802*G0_1_1_3_1_1 - 0.00194805194805202*G0_1_1_3_1_2 - 0.0031168831168832*G0_1_1_3_1_3 - 0.0111038961038965*G0_1_1_3_1_4 - 0.00545454545454564*G0_1_1_3_1_5 - 0.000487012987013004*G0_1_1_3_2_0 - 0.00194805194805202*G0_1_1_3_2_1 + 0.0394480519480533*G0_1_1_3_2_2 + 0.00292207792207801*G0_1_1_3_2_3 - 0.000974025974025988*G0_1_1_3_2_4 - 0.00681818181818204*G0_1_1_3_2_5 - 0.00798701298701325*G0_1_1_3_3_0 - 0.0031168831168832*G0_1_1_3_3_1 + 0.00292207792207802*G0_1_1_3_3_2 + 0.00467532467532474*G0_1_1_3_3_3 + 0.0381818181818194*G0_1_1_3_3_4 + 0.0296103896103906*G0_1_1_3_3_5 - 0.00818181818181844*G0_1_1_3_4_0 - 0.0111038961038965*G0_1_1_3_4_1 - 0.00097402597402599*G0_1_1_3_4_2 + 0.0381818181818194*G0_1_1_3_4_3 + 0.0748051948051972*G0_1_1_3_4_4 + 0.035844155844157*G0_1_1_3_4_5 - 0.00545454545454563*G0_1_1_3_5_0 - 0.00545454545454564*G0_1_1_3_5_1 - 0.00681818181818204*G0_1_1_3_5_2 + 0.0296103896103906*G0_1_1_3_5_3 + 0.035844155844157*G0_1_1_3_5_4 + 0.0358441558441571*G0_1_1_3_5_5 + 0.0154383116883122*G0_1_1_4_0_0 + 0.000681818181818198*G0_1_1_4_0_1 - 0.00535714285714304*G0_1_1_4_0_2 - 0.00818181818181844*G0_1_1_4_0_3 - 0.000974025974025961*G0_1_1_4_0_4 + 0.000681818181818198*G0_1_1_4_1_0 + 0.00452922077922093*G0_1_1_4_1_1 + 0.000974025974026006*G0_1_1_4_1_2 - 0.0111038961038965*G0_1_1_4_1_3 - 0.0292207792207802*G0_1_1_4_1_4 - 0.0124675324675329*G0_1_1_4_1_5 - 0.00535714285714304*G0_1_1_4_2_0 + 0.000974025974026006*G0_1_1_4_2_1 + 0.0379870129870144*G0_1_1_4_2_2 - 0.000974025974025988*G0_1_1_4_2_3 - 0.00681818181818201*G0_1_1_4_2_4 - 0.00974025974026006*G0_1_1_4_2_5 - 0.00818181818181844*G0_1_1_4_3_0 - 0.0111038961038965*G0_1_1_4_3_1 - 0.000974025974025988*G0_1_1_4_3_2 + 0.0381818181818194*G0_1_1_4_3_3 + 0.0748051948051972*G0_1_1_4_3_4 + 0.035844155844157*G0_1_1_4_3_5 - 0.000974025974025961*G0_1_1_4_4_0 - 0.0292207792207802*G0_1_1_4_4_1 - 0.00681818181818201*G0_1_1_4_4_2 + 0.0748051948051972*G0_1_1_4_4_3 + 0.334285714285725*G0_1_1_4_4_4 + 0.0779220779220805*G0_1_1_4_4_5 - 0.0124675324675329*G0_1_1_4_5_1 - 0.00974025974026006*G0_1_1_4_5_2 + 0.035844155844157*G0_1_1_4_5_3 + 0.0779220779220805*G0_1_1_4_5_4 + 0.0498701298701316*G0_1_1_4_5_5 + 0.0271753246753257*G0_1_1_5_0_0 - 0.00555194805194825*G0_1_1_5_0_1 - 0.000681818181818213*G0_1_1_5_0_2 - 0.00545454545454563*G0_1_1_5_0_3 + 0.0198701298701306*G0_1_1_5_0_5 - 0.00555194805194825*G0_1_1_5_1_0 + 0.00779220779220806*G0_1_1_5_1_1 + 0.00170454545454551*G0_1_1_5_1_2 - 0.00545454545454564*G0_1_1_5_1_3 - 0.0124675324675329*G0_1_1_5_1_4 - 0.0101298701298705*G0_1_1_5_1_5 - 0.000681818181818212*G0_1_1_5_2_0 + 0.00170454545454551*G0_1_1_5_2_1 + 0.00389610389610406*G0_1_1_5_2_2 - 0.00681818181818204*G0_1_1_5_2_3 - 0.00974025974026006*G0_1_1_5_2_4 - 0.0124675324675329*G0_1_1_5_2_5 - 0.00545454545454563*G0_1_1_5_3_0 - 0.00545454545454564*G0_1_1_5_3_1 - 0.00681818181818204*G0_1_1_5_3_2 + 0.0296103896103906*G0_1_1_5_3_3 + 0.035844155844157*G0_1_1_5_3_4 + 0.0358441558441571*G0_1_1_5_3_5 - 0.0124675324675329*G0_1_1_5_4_1 - 0.00974025974026006*G0_1_1_5_4_2 + 0.035844155844157*G0_1_1_5_4_3 + 0.0779220779220805*G0_1_1_5_4_4 + 0.0498701298701316*G0_1_1_5_4_5 + 0.0198701298701306*G0_1_1_5_5_0 - 0.0101298701298705*G0_1_1_5_5_1 - 0.0124675324675329*G0_1_1_5_5_2 + 0.0358441558441571*G0_1_1_5_5_3 + 0.0498701298701316*G0_1_1_5_5_4 + 0.187012987012993*G0_1_1_5_5_5; + A[55] = A[66] + 0.0181899350649357*G0_0_0_0_0_0 - 0.00168019480519486*G0_0_0_0_0_1 - 0.00759740259740286*G0_0_0_0_0_2 + 0.000292207792207801*G0_0_0_0_0_3 + 0.0201623376623384*G0_0_0_0_0_4 + 0.00759740259740286*G0_0_0_0_0_5 - 0.00168019480519487*G0_0_0_0_1_0 + 0.000803571428571457*G0_0_0_0_1_1 - 0.00138798701298706*G0_0_0_0_1_2 - 0.00204545454545462*G0_0_0_0_1_3 - 0.00438311688311704*G0_0_0_0_1_4 - 0.00175324675324682*G0_0_0_0_1_5 - 0.00759740259740286*G0_0_0_0_2_0 - 0.00138798701298706*G0_0_0_0_2_1 + 0.0210389610389618*G0_0_0_0_2_2 + 0.00788961038961066*G0_0_0_0_2_3 + 0.00584415584415604*G0_0_0_0_2_4 - 0.000876623376623406*G0_0_0_0_2_5 + 0.000292207792207801*G0_0_0_0_3_0 - 0.00204545454545461*G0_0_0_0_3_1 + 0.00788961038961066*G0_0_0_0_3_2 + 0.00701298701298726*G0_0_0_0_3_3 + 0.00818181818181846*G0_0_0_0_3_4 + 0.00116883116883122*G0_0_0_0_3_5 + 0.0201623376623384*G0_0_0_0_4_0 - 0.00438311688311704*G0_0_0_0_4_1 + 0.00584415584415604*G0_0_0_0_4_2 + 0.00818181818181846*G0_0_0_0_4_3 + 0.0561038961038981*G0_0_0_0_4_4 + 0.0105194805194809*G0_0_0_0_4_5 + 0.00759740259740286*G0_0_0_0_5_0 - 0.00175324675324682*G0_0_0_0_5_1 - 0.000876623376623406*G0_0_0_0_5_2 + 0.00116883116883122*G0_0_0_0_5_3 + 0.0105194805194809*G0_0_0_0_5_4 + 0.00584415584415606*G0_0_0_0_5_5 - 0.00168019480519487*G0_0_0_1_0_0 + 0.000803571428571457*G0_0_0_1_0_1 - 0.00138798701298706*G0_0_0_1_0_2 - 0.00204545454545461*G0_0_0_1_0_3 - 0.00438311688311704*G0_0_0_1_0_4 - 0.00175324675324682*G0_0_0_1_0_5 + 0.000803571428571457*G0_0_0_1_1_0 + 0.000219155844155847*G0_0_0_1_1_1 - 0.00350649350649363*G0_0_0_1_1_2 - 0.000876623376623412*G0_0_0_1_1_3 + 0.00262987012987021*G0_0_0_1_1_4 + 0.00233766233766241*G0_0_0_1_1_5 - 0.00138798701298706*G0_0_0_1_2_0 - 0.00350649350649363*G0_0_0_1_2_1 + 0.0166558441558447*G0_0_0_1_2_2 + 0.0128571428571433*G0_0_0_1_2_3 + 0.0125649350649355*G0_0_0_1_2_4 + 0.00379870129870143*G0_0_0_1_2_5 - 0.00204545454545461*G0_0_0_1_3_0 - 0.000876623376623412*G0_0_0_1_3_1 + 0.0128571428571433*G0_0_0_1_3_2 + 0.0140259740259746*G0_0_0_1_3_3 - 0.0011688311688312*G0_0_0_1_3_4 - 0.00350649350649362*G0_0_0_1_3_5 - 0.00438311688311704*G0_0_0_1_4_0 + 0.00262987012987021*G0_0_0_1_4_1 + 0.0125649350649355*G0_0_0_1_4_2 - 0.0011688311688312*G0_0_0_1_4_3 - 0.0257142857142866*G0_0_0_1_4_4 - 0.0128571428571433*G0_0_0_1_4_5 - 0.00175324675324682*G0_0_0_1_5_0 + 0.00233766233766241*G0_0_0_1_5_1 + 0.00379870129870143*G0_0_0_1_5_2 - 0.00350649350649362*G0_0_0_1_5_3 - 0.0128571428571433*G0_0_0_1_5_4 - 0.0105194805194809*G0_0_0_1_5_5 - 0.00759740259740286*G0_0_0_2_0_0 - 0.00138798701298706*G0_0_0_2_0_1 + 0.0210389610389618*G0_0_0_2_0_2 + 0.00788961038961066*G0_0_0_2_0_3 + 0.00584415584415604*G0_0_0_2_0_4 - 0.000876623376623406*G0_0_0_2_0_5 - 0.00138798701298706*G0_0_0_2_1_0 - 0.00350649350649363*G0_0_0_2_1_1 + 0.0166558441558447*G0_0_0_2_1_2 + 0.0128571428571433*G0_0_0_2_1_3 + 0.0125649350649355*G0_0_0_2_1_4 + 0.00379870129870143*G0_0_0_2_1_5 + 0.0210389610389618*G0_0_0_2_2_0 + 0.0166558441558447*G0_0_0_2_2_1 - 0.247646103896113*G0_0_0_2_2_2 - 0.0715909090909117*G0_0_0_2_2_3 - 0.0774350649350677*G0_0_0_2_2_4 - 0.00262987012987027*G0_0_0_2_2_5 + 0.00788961038961066*G0_0_0_2_3_0 + 0.0128571428571433*G0_0_0_2_3_1 - 0.0715909090909117*G0_0_0_2_3_2 - 0.0584415584415605*G0_0_0_2_3_3 - 0.0409090909090923*G0_0_0_2_3_4 - 0.0105194805194809*G0_0_0_2_3_5 + 0.00584415584415604*G0_0_0_2_4_0 + 0.0125649350649355*G0_0_0_2_4_1 - 0.0774350649350677*G0_0_0_2_4_2 - 0.0409090909090923*G0_0_0_2_4_3 - 0.105194805194809*G0_0_0_2_4_4 - 0.0198701298701306*G0_0_0_2_4_5 - 0.000876623376623406*G0_0_0_2_5_0 + 0.00379870129870143*G0_0_0_2_5_1 - 0.00262987012987027*G0_0_0_2_5_2 - 0.0105194805194809*G0_0_0_2_5_3 - 0.0198701298701306*G0_0_0_2_5_4 - 0.0116883116883121*G0_0_0_2_5_5 + 0.000292207792207801*G0_0_0_3_0_0 - 0.00204545454545461*G0_0_0_3_0_1 + 0.00788961038961066*G0_0_0_3_0_2 + 0.00701298701298726*G0_0_0_3_0_3 + 0.00818181818181846*G0_0_0_3_0_4 + 0.00116883116883122*G0_0_0_3_0_5 - 0.00204545454545461*G0_0_0_3_1_0 - 0.000876623376623412*G0_0_0_3_1_1 + 0.0128571428571433*G0_0_0_3_1_2 + 0.0140259740259745*G0_0_0_3_1_3 - 0.0011688311688312*G0_0_0_3_1_4 - 0.00350649350649362*G0_0_0_3_1_5 + 0.00788961038961066*G0_0_0_3_2_0 + 0.0128571428571433*G0_0_0_3_2_1 - 0.0715909090909117*G0_0_0_3_2_2 - 0.0584415584415605*G0_0_0_3_2_3 - 0.0409090909090923*G0_0_0_3_2_4 - 0.0105194805194809*G0_0_0_3_2_5 + 0.00701298701298726*G0_0_0_3_3_0 + 0.0140259740259745*G0_0_0_3_3_1 - 0.0584415584415606*G0_0_0_3_3_2 - 0.0350649350649365*G0_0_0_3_3_3 - 0.0116883116883122*G0_0_0_3_3_4 + 0.00701298701298722*G0_0_0_3_3_5 + 0.00818181818181846*G0_0_0_3_4_0 - 0.0011688311688312*G0_0_0_3_4_1 - 0.0409090909090923*G0_0_0_3_4_2 - 0.0116883116883122*G0_0_0_3_4_3 + 0.0350649350649361*G0_0_0_3_4_4 + 0.0233766233766241*G0_0_0_3_4_5 + 0.00116883116883122*G0_0_0_3_5_0 - 0.00350649350649362*G0_0_0_3_5_1 - 0.0105194805194809*G0_0_0_3_5_2 + 0.00701298701298722*G0_0_0_3_5_3 + 0.0233766233766241*G0_0_0_3_5_4 + 0.0210389610389617*G0_0_0_3_5_5 + 0.0201623376623384*G0_0_0_4_0_0 - 0.00438311688311704*G0_0_0_4_0_1 + 0.00584415584415604*G0_0_0_4_0_2 + 0.00818181818181847*G0_0_0_4_0_3 + 0.0561038961038981*G0_0_0_4_0_4 + 0.0105194805194809*G0_0_0_4_0_5 - 0.00438311688311704*G0_0_0_4_1_0 + 0.00262987012987021*G0_0_0_4_1_1 + 0.0125649350649355*G0_0_0_4_1_2 - 0.0011688311688312*G0_0_0_4_1_3 - 0.0257142857142866*G0_0_0_4_1_4 - 0.0128571428571433*G0_0_0_4_1_5 + 0.00584415584415604*G0_0_0_4_2_0 + 0.0125649350649355*G0_0_0_4_2_1 - 0.0774350649350677*G0_0_0_4_2_2 - 0.0409090909090923*G0_0_0_4_2_3 - 0.105194805194809*G0_0_0_4_2_4 - 0.0198701298701306*G0_0_0_4_2_5 + 0.00818181818181846*G0_0_0_4_3_0 - 0.0011688311688312*G0_0_0_4_3_1 - 0.0409090909090923*G0_0_0_4_3_2 - 0.0116883116883122*G0_0_0_4_3_3 + 0.0350649350649361*G0_0_0_4_3_4 + 0.0233766233766241*G0_0_0_4_3_5 + 0.0561038961038981*G0_0_0_4_4_0 - 0.0257142857142866*G0_0_0_4_4_1 - 0.105194805194809*G0_0_0_4_4_2 + 0.0350649350649361*G0_0_0_4_4_3 + 0.385714285714298*G0_0_0_4_4_4 + 0.0911688311688342*G0_0_0_4_4_5 + 0.0105194805194809*G0_0_0_4_5_0 - 0.0128571428571433*G0_0_0_4_5_1 - 0.0198701298701306*G0_0_0_4_5_2 + 0.0233766233766241*G0_0_0_4_5_3 + 0.0911688311688341*G0_0_0_4_5_4 + 0.0490909090909108*G0_0_0_4_5_5 + 0.00759740259740286*G0_0_0_5_0_0 - 0.00175324675324682*G0_0_0_5_0_1 - 0.000876623376623406*G0_0_0_5_0_2 + 0.00116883116883122*G0_0_0_5_0_3 + 0.0105194805194809*G0_0_0_5_0_4 + 0.00584415584415607*G0_0_0_5_0_5 - 0.00175324675324682*G0_0_0_5_1_0 + 0.00233766233766241*G0_0_0_5_1_1 + 0.00379870129870143*G0_0_0_5_1_2 - 0.00350649350649362*G0_0_0_5_1_3 - 0.0128571428571433*G0_0_0_5_1_4 - 0.0105194805194809*G0_0_0_5_1_5 - 0.000876623376623406*G0_0_0_5_2_0 + 0.00379870129870143*G0_0_0_5_2_1 - 0.00262987012987027*G0_0_0_5_2_2 - 0.0105194805194809*G0_0_0_5_2_3 - 0.0198701298701306*G0_0_0_5_2_4 - 0.0116883116883121*G0_0_0_5_2_5 + 0.00116883116883122*G0_0_0_5_3_0 - 0.00350649350649362*G0_0_0_5_3_1 - 0.0105194805194809*G0_0_0_5_3_2 + 0.00701298701298722*G0_0_0_5_3_3 + 0.0233766233766241*G0_0_0_5_3_4 + 0.0210389610389617*G0_0_0_5_3_5 + 0.0105194805194809*G0_0_0_5_4_0 - 0.0128571428571433*G0_0_0_5_4_1 - 0.0198701298701306*G0_0_0_5_4_2 + 0.0233766233766241*G0_0_0_5_4_3 + 0.0911688311688342*G0_0_0_5_4_4 + 0.0490909090909108*G0_0_0_5_4_5 + 0.00584415584415606*G0_0_0_5_5_0 - 0.0105194805194809*G0_0_0_5_5_1 - 0.0116883116883121*G0_0_0_5_5_2 + 0.0210389610389617*G0_0_0_5_5_3 + 0.0490909090909108*G0_0_0_5_5_4 + 0.0490909090909108*G0_0_0_5_5_5 - 0.0311201298701309*G0_0_1_0_0_0 + 0.00215503246753254*G0_0_1_0_0_1 + 0.00215503246753254*G0_0_1_0_0_2 - 0.000146103896103902*G0_0_1_0_0_3 - 0.0113961038961043*G0_0_1_0_0_4 - 0.00905844155844187*G0_0_1_0_0_5 + 0.00215503246753254*G0_0_1_0_1_0 - 0.000620941558441579*G0_0_1_0_1_1 - 0.00138798701298706*G0_0_1_0_1_2 + 0.000584415584415602*G0_0_1_0_1_3 + 0.00306818181818192*G0_0_1_0_1_4 + 0.00262987012987021*G0_0_1_0_1_5 + 0.00215503246753254*G0_0_1_0_2_0 - 0.00138798701298706*G0_0_1_0_2_1 + 0.0112865259740264*G0_0_1_0_2_2 + 0.00482142857142873*G0_0_1_0_2_3 + 0.00584415584415605*G0_0_1_0_2_4 + 0.00219155844155852*G0_0_1_0_2_5 - 0.000146103896103902*G0_0_1_0_3_0 + 0.000584415584415601*G0_0_1_0_3_1 + 0.00482142857142873*G0_0_1_0_3_2 - 0.0017532467532468*G0_0_1_0_3_3 - 0.00584415584415602*G0_0_1_0_3_4 - 0.00409090909090922*G0_0_1_0_3_5 - 0.0113961038961043*G0_0_1_0_4_0 + 0.00306818181818192*G0_0_1_0_4_1 + 0.00584415584415605*G0_0_1_0_4_2 - 0.00584415584415602*G0_0_1_0_4_3 - 0.0245454545454553*G0_0_1_0_4_4 - 0.0105194805194809*G0_0_1_0_4_5 - 0.00905844155844187*G0_0_1_0_5_0 + 0.00262987012987022*G0_0_1_0_5_1 + 0.00219155844155852*G0_0_1_0_5_2 - 0.00409090909090922*G0_0_1_0_5_3 - 0.0105194805194809*G0_0_1_0_5_4 - 0.0116883116883121*G0_0_1_0_5_5 + 0.00215503246753254*G0_0_1_1_0_0 - 0.000620941558441579*G0_0_1_1_0_1 - 0.00138798701298706*G0_0_1_1_0_2 + 0.000584415584415601*G0_0_1_1_0_3 + 0.00306818181818192*G0_0_1_1_0_4 + 0.00262987012987021*G0_0_1_1_0_5 - 0.000620941558441579*G0_0_1_1_1_0 + 0.000219155844155855*G0_0_1_1_1_1 - 0.00208198051948059*G0_0_1_1_1_2 + 0.000438311688311699*G0_0_1_1_1_3 + 0.00262987012987021*G0_0_1_1_1_4 + 0.00102272727272731*G0_0_1_1_1_5 - 0.00138798701298706*G0_0_1_1_2_0 - 0.00208198051948059*G0_0_1_1_2_1 + 0.0128206168831173*G0_0_1_1_2_2 + 0.00847402597402628*G0_0_1_1_2_3 + 0.00511363636363654*G0_0_1_1_2_4 + 0.00116883116883121*G0_0_1_1_2_5 + 0.000584415584415601*G0_0_1_1_3_0 + 0.000438311688311699*G0_0_1_1_3_1 + 0.00847402597402628*G0_0_1_1_3_2 + 0.00525974025974047*G0_0_1_1_3_3 - 0.00642857142857163*G0_0_1_1_3_4 - 0.00350649350649362*G0_0_1_1_3_5 + 0.00306818181818192*G0_0_1_1_4_0 + 0.00262987012987021*G0_0_1_1_4_1 + 0.00511363636363654*G0_0_1_1_4_2 - 0.00642857142857163*G0_0_1_1_4_3 - 0.0257142857142865*G0_0_1_1_4_4 - 0.00759740259740285*G0_0_1_1_4_5 + 0.00262987012987021*G0_0_1_1_5_0 + 0.00102272727272731*G0_0_1_1_5_1 + 0.00116883116883121*G0_0_1_1_5_2 - 0.00350649350649362*G0_0_1_1_5_3 - 0.00759740259740285*G0_0_1_1_5_4 - 0.00175324675324681*G0_0_1_1_5_5 + 0.00215503246753254*G0_0_1_2_0_0 - 0.00138798701298706*G0_0_1_2_0_1 + 0.0112865259740264*G0_0_1_2_0_2 + 0.00482142857142873*G0_0_1_2_0_3 + 0.00584415584415605*G0_0_1_2_0_4 + 0.00219155844155852*G0_0_1_2_0_5 - 0.00138798701298706*G0_0_1_2_1_0 - 0.00208198051948059*G0_0_1_2_1_1 + 0.0128206168831173*G0_0_1_2_1_2 + 0.00847402597402628*G0_0_1_2_1_3 + 0.00511363636363654*G0_0_1_2_1_4 + 0.00116883116883121*G0_0_1_2_1_5 + 0.0112865259740264*G0_0_1_2_2_0 + 0.0128206168831173*G0_0_1_2_2_1 - 0.198336038961046*G0_0_1_2_2_2 - 0.0549350649350669*G0_0_1_2_2_3 - 0.0458766233766251*G0_0_1_2_2_4 - 0.00219155844155856*G0_0_1_2_2_5 + 0.00482142857142873*G0_0_1_2_3_0 + 0.00847402597402628*G0_0_1_2_3_1 - 0.0549350649350669*G0_0_1_2_3_2 - 0.0409090909090924*G0_0_1_2_3_3 - 0.0198701298701306*G0_0_1_2_3_4 - 0.00525974025974045*G0_0_1_2_3_5 + 0.00584415584415605*G0_0_1_2_4_0 + 0.00511363636363654*G0_0_1_2_4_1 - 0.0458766233766251*G0_0_1_2_4_2 - 0.0198701298701306*G0_0_1_2_4_3 - 0.0245454545454554*G0_0_1_2_4_4 - 0.00584415584415605*G0_0_1_2_4_5 + 0.00219155844155852*G0_0_1_2_5_0 + 0.00116883116883121*G0_0_1_2_5_1 - 0.00219155844155856*G0_0_1_2_5_2 - 0.00525974025974045*G0_0_1_2_5_3 - 0.00584415584415605*G0_0_1_2_5_4 - 0.00292207792207802*G0_0_1_2_5_5 - 0.000146103896103902*G0_0_1_3_0_0 + 0.000584415584415601*G0_0_1_3_0_1 + 0.00482142857142873*G0_0_1_3_0_2 - 0.0017532467532468*G0_0_1_3_0_3 - 0.00584415584415602*G0_0_1_3_0_4 - 0.00409090909090922*G0_0_1_3_0_5 + 0.000584415584415601*G0_0_1_3_1_0 + 0.000438311688311699*G0_0_1_3_1_1 + 0.00847402597402628*G0_0_1_3_1_2 + 0.00525974025974047*G0_0_1_3_1_3 - 0.00642857142857163*G0_0_1_3_1_4 - 0.00350649350649362*G0_0_1_3_1_5 + 0.00482142857142873*G0_0_1_3_2_0 + 0.00847402597402628*G0_0_1_3_2_1 - 0.0549350649350669*G0_0_1_3_2_2 - 0.0409090909090924*G0_0_1_3_2_3 - 0.0198701298701306*G0_0_1_3_2_4 - 0.00525974025974045*G0_0_1_3_2_5 - 0.0017532467532468*G0_0_1_3_3_0 + 0.00525974025974047*G0_0_1_3_3_1 - 0.0409090909090924*G0_0_1_3_3_2 + 0.00701298701298712*G0_0_1_3_3_3 + 0.0163636363636369*G0_0_1_3_3_4 + 0.0140259740259745*G0_0_1_3_3_5 - 0.00584415584415602*G0_0_1_3_4_0 - 0.00642857142857163*G0_0_1_3_4_1 - 0.0198701298701306*G0_0_1_3_4_2 + 0.0163636363636369*G0_0_1_3_4_3 + 0.0631168831168851*G0_0_1_3_4_4 + 0.0233766233766241*G0_0_1_3_4_5 - 0.00409090909090922*G0_0_1_3_5_0 - 0.00350649350649362*G0_0_1_3_5_1 - 0.00525974025974045*G0_0_1_3_5_2 + 0.0140259740259745*G0_0_1_3_5_3 + 0.0233766233766241*G0_0_1_3_5_4 + 0.0140259740259745*G0_0_1_3_5_5 - 0.0113961038961043*G0_0_1_4_0_0 + 0.00306818181818192*G0_0_1_4_0_1 + 0.00584415584415606*G0_0_1_4_0_2 - 0.00584415584415602*G0_0_1_4_0_3 - 0.0245454545454553*G0_0_1_4_0_4 - 0.0105194805194809*G0_0_1_4_0_5 + 0.00306818181818192*G0_0_1_4_1_0 + 0.00262987012987021*G0_0_1_4_1_1 + 0.00511363636363654*G0_0_1_4_1_2 - 0.00642857142857163*G0_0_1_4_1_3 - 0.0257142857142865*G0_0_1_4_1_4 - 0.00759740259740285*G0_0_1_4_1_5 + 0.00584415584415606*G0_0_1_4_2_0 + 0.00511363636363654*G0_0_1_4_2_1 - 0.0458766233766251*G0_0_1_4_2_2 - 0.0198701298701306*G0_0_1_4_2_3 - 0.0245454545454554*G0_0_1_4_2_4 - 0.00584415584415605*G0_0_1_4_2_5 - 0.00584415584415602*G0_0_1_4_3_0 - 0.00642857142857163*G0_0_1_4_3_1 - 0.0198701298701306*G0_0_1_4_3_2 + 0.0163636363636369*G0_0_1_4_3_3 + 0.0631168831168851*G0_0_1_4_3_4 + 0.0233766233766241*G0_0_1_4_3_5 - 0.0245454545454553*G0_0_1_4_4_0 - 0.0257142857142865*G0_0_1_4_4_1 - 0.0245454545454554*G0_0_1_4_4_2 + 0.0631168831168851*G0_0_1_4_4_3 + 0.385714285714298*G0_0_1_4_4_4 + 0.0631168831168852*G0_0_1_4_4_5 - 0.0105194805194809*G0_0_1_4_5_0 - 0.00759740259740285*G0_0_1_4_5_1 - 0.00584415584415605*G0_0_1_4_5_2 + 0.0233766233766241*G0_0_1_4_5_3 + 0.0631168831168852*G0_0_1_4_5_4 + 0.0210389610389617*G0_0_1_4_5_5 - 0.00905844155844187*G0_0_1_5_0_0 + 0.00262987012987021*G0_0_1_5_0_1 + 0.00219155844155852*G0_0_1_5_0_2 - 0.00409090909090922*G0_0_1_5_0_3 - 0.0105194805194809*G0_0_1_5_0_4 - 0.0116883116883121*G0_0_1_5_0_5 + 0.00262987012987021*G0_0_1_5_1_0 + 0.00102272727272731*G0_0_1_5_1_1 + 0.00116883116883121*G0_0_1_5_1_2 - 0.00350649350649362*G0_0_1_5_1_3 - 0.00759740259740285*G0_0_1_5_1_4 - 0.00175324675324681*G0_0_1_5_1_5 + 0.00219155844155852*G0_0_1_5_2_0 + 0.00116883116883121*G0_0_1_5_2_1 - 0.00219155844155856*G0_0_1_5_2_2 - 0.00525974025974045*G0_0_1_5_2_3 - 0.00584415584415605*G0_0_1_5_2_4 - 0.00292207792207802*G0_0_1_5_2_5 - 0.00409090909090922*G0_0_1_5_3_0 - 0.00350649350649362*G0_0_1_5_3_1 - 0.00525974025974045*G0_0_1_5_3_2 + 0.0140259740259745*G0_0_1_5_3_3 + 0.0233766233766241*G0_0_1_5_3_4 + 0.0140259740259745*G0_0_1_5_3_5 - 0.0105194805194809*G0_0_1_5_4_0 - 0.00759740259740285*G0_0_1_5_4_1 - 0.00584415584415605*G0_0_1_5_4_2 + 0.0233766233766241*G0_0_1_5_4_3 + 0.0631168831168852*G0_0_1_5_4_4 + 0.0210389610389617*G0_0_1_5_4_5 - 0.0116883116883121*G0_0_1_5_5_0 - 0.00175324675324681*G0_0_1_5_5_1 - 0.00292207792207802*G0_0_1_5_5_2 + 0.0140259740259745*G0_0_1_5_5_3 + 0.0210389610389617*G0_0_1_5_5_4 + 0.0070129870129873*G0_0_1_5_5_5 - 0.0311201298701309*G0_1_0_0_0_0 + 0.00215503246753254*G0_1_0_0_0_1 + 0.00215503246753254*G0_1_0_0_0_2 - 0.000146103896103902*G0_1_0_0_0_3 - 0.0113961038961043*G0_1_0_0_0_4 - 0.00905844155844187*G0_1_0_0_0_5 + 0.00215503246753254*G0_1_0_0_1_0 - 0.000620941558441579*G0_1_0_0_1_1 - 0.00138798701298706*G0_1_0_0_1_2 + 0.000584415584415602*G0_1_0_0_1_3 + 0.00306818181818192*G0_1_0_0_1_4 + 0.00262987012987022*G0_1_0_0_1_5 + 0.00215503246753254*G0_1_0_0_2_0 - 0.00138798701298706*G0_1_0_0_2_1 + 0.0112865259740264*G0_1_0_0_2_2 + 0.00482142857142873*G0_1_0_0_2_3 + 0.00584415584415605*G0_1_0_0_2_4 + 0.00219155844155852*G0_1_0_0_2_5 - 0.000146103896103902*G0_1_0_0_3_0 + 0.000584415584415601*G0_1_0_0_3_1 + 0.00482142857142873*G0_1_0_0_3_2 - 0.0017532467532468*G0_1_0_0_3_3 - 0.00584415584415602*G0_1_0_0_3_4 - 0.00409090909090922*G0_1_0_0_3_5 - 0.0113961038961043*G0_1_0_0_4_0 + 0.00306818181818192*G0_1_0_0_4_1 + 0.00584415584415606*G0_1_0_0_4_2 - 0.00584415584415602*G0_1_0_0_4_3 - 0.0245454545454553*G0_1_0_0_4_4 - 0.0105194805194809*G0_1_0_0_4_5 - 0.00905844155844187*G0_1_0_0_5_0 + 0.00262987012987022*G0_1_0_0_5_1 + 0.00219155844155852*G0_1_0_0_5_2 - 0.00409090909090922*G0_1_0_0_5_3 - 0.0105194805194809*G0_1_0_0_5_4 - 0.0116883116883121*G0_1_0_0_5_5 + 0.00215503246753254*G0_1_0_1_0_0 - 0.000620941558441579*G0_1_0_1_0_1 - 0.00138798701298706*G0_1_0_1_0_2 + 0.000584415584415601*G0_1_0_1_0_3 + 0.00306818181818192*G0_1_0_1_0_4 + 0.00262987012987021*G0_1_0_1_0_5 - 0.000620941558441579*G0_1_0_1_1_0 + 0.000219155844155855*G0_1_0_1_1_1 - 0.00208198051948059*G0_1_0_1_1_2 + 0.000438311688311699*G0_1_0_1_1_3 + 0.00262987012987021*G0_1_0_1_1_4 + 0.00102272727272731*G0_1_0_1_1_5 - 0.00138798701298706*G0_1_0_1_2_0 - 0.00208198051948059*G0_1_0_1_2_1 + 0.0128206168831173*G0_1_0_1_2_2 + 0.00847402597402628*G0_1_0_1_2_3 + 0.00511363636363654*G0_1_0_1_2_4 + 0.00116883116883121*G0_1_0_1_2_5 + 0.000584415584415601*G0_1_0_1_3_0 + 0.000438311688311699*G0_1_0_1_3_1 + 0.00847402597402628*G0_1_0_1_3_2 + 0.00525974025974047*G0_1_0_1_3_3 - 0.00642857142857163*G0_1_0_1_3_4 - 0.00350649350649362*G0_1_0_1_3_5 + 0.00306818181818192*G0_1_0_1_4_0 + 0.00262987012987021*G0_1_0_1_4_1 + 0.00511363636363654*G0_1_0_1_4_2 - 0.00642857142857163*G0_1_0_1_4_3 - 0.0257142857142865*G0_1_0_1_4_4 - 0.00759740259740285*G0_1_0_1_4_5 + 0.00262987012987022*G0_1_0_1_5_0 + 0.00102272727272731*G0_1_0_1_5_1 + 0.00116883116883121*G0_1_0_1_5_2 - 0.00350649350649362*G0_1_0_1_5_3 - 0.00759740259740285*G0_1_0_1_5_4 - 0.00175324675324681*G0_1_0_1_5_5 + 0.00215503246753254*G0_1_0_2_0_0 - 0.00138798701298706*G0_1_0_2_0_1 + 0.0112865259740264*G0_1_0_2_0_2 + 0.00482142857142873*G0_1_0_2_0_3 + 0.00584415584415606*G0_1_0_2_0_4 + 0.00219155844155852*G0_1_0_2_0_5 - 0.00138798701298706*G0_1_0_2_1_0 - 0.00208198051948059*G0_1_0_2_1_1 + 0.0128206168831173*G0_1_0_2_1_2 + 0.00847402597402628*G0_1_0_2_1_3 + 0.00511363636363654*G0_1_0_2_1_4 + 0.00116883116883121*G0_1_0_2_1_5 + 0.0112865259740264*G0_1_0_2_2_0 + 0.0128206168831173*G0_1_0_2_2_1 - 0.198336038961046*G0_1_0_2_2_2 - 0.0549350649350669*G0_1_0_2_2_3 - 0.0458766233766251*G0_1_0_2_2_4 - 0.00219155844155856*G0_1_0_2_2_5 + 0.00482142857142873*G0_1_0_2_3_0 + 0.00847402597402628*G0_1_0_2_3_1 - 0.0549350649350669*G0_1_0_2_3_2 - 0.0409090909090924*G0_1_0_2_3_3 - 0.0198701298701306*G0_1_0_2_3_4 - 0.00525974025974045*G0_1_0_2_3_5 + 0.00584415584415605*G0_1_0_2_4_0 + 0.00511363636363654*G0_1_0_2_4_1 - 0.0458766233766251*G0_1_0_2_4_2 - 0.0198701298701306*G0_1_0_2_4_3 - 0.0245454545454554*G0_1_0_2_4_4 - 0.00584415584415605*G0_1_0_2_4_5 + 0.00219155844155852*G0_1_0_2_5_0 + 0.00116883116883121*G0_1_0_2_5_1 - 0.00219155844155856*G0_1_0_2_5_2 - 0.00525974025974045*G0_1_0_2_5_3 - 0.00584415584415605*G0_1_0_2_5_4 - 0.00292207792207802*G0_1_0_2_5_5 - 0.000146103896103902*G0_1_0_3_0_0 + 0.000584415584415601*G0_1_0_3_0_1 + 0.00482142857142873*G0_1_0_3_0_2 - 0.0017532467532468*G0_1_0_3_0_3 - 0.00584415584415602*G0_1_0_3_0_4 - 0.00409090909090922*G0_1_0_3_0_5 + 0.000584415584415601*G0_1_0_3_1_0 + 0.000438311688311699*G0_1_0_3_1_1 + 0.00847402597402628*G0_1_0_3_1_2 + 0.00525974025974047*G0_1_0_3_1_3 - 0.00642857142857163*G0_1_0_3_1_4 - 0.00350649350649362*G0_1_0_3_1_5 + 0.00482142857142873*G0_1_0_3_2_0 + 0.00847402597402628*G0_1_0_3_2_1 - 0.0549350649350669*G0_1_0_3_2_2 - 0.0409090909090924*G0_1_0_3_2_3 - 0.0198701298701306*G0_1_0_3_2_4 - 0.00525974025974045*G0_1_0_3_2_5 - 0.0017532467532468*G0_1_0_3_3_0 + 0.00525974025974047*G0_1_0_3_3_1 - 0.0409090909090924*G0_1_0_3_3_2 + 0.00701298701298712*G0_1_0_3_3_3 + 0.0163636363636369*G0_1_0_3_3_4 + 0.0140259740259745*G0_1_0_3_3_5 - 0.00584415584415602*G0_1_0_3_4_0 - 0.00642857142857163*G0_1_0_3_4_1 - 0.0198701298701306*G0_1_0_3_4_2 + 0.0163636363636369*G0_1_0_3_4_3 + 0.0631168831168851*G0_1_0_3_4_4 + 0.0233766233766241*G0_1_0_3_4_5 - 0.00409090909090922*G0_1_0_3_5_0 - 0.00350649350649362*G0_1_0_3_5_1 - 0.00525974025974045*G0_1_0_3_5_2 + 0.0140259740259745*G0_1_0_3_5_3 + 0.0233766233766241*G0_1_0_3_5_4 + 0.0140259740259745*G0_1_0_3_5_5 - 0.0113961038961043*G0_1_0_4_0_0 + 0.00306818181818192*G0_1_0_4_0_1 + 0.00584415584415606*G0_1_0_4_0_2 - 0.00584415584415602*G0_1_0_4_0_3 - 0.0245454545454553*G0_1_0_4_0_4 - 0.0105194805194809*G0_1_0_4_0_5 + 0.00306818181818192*G0_1_0_4_1_0 + 0.00262987012987021*G0_1_0_4_1_1 + 0.00511363636363654*G0_1_0_4_1_2 - 0.00642857142857163*G0_1_0_4_1_3 - 0.0257142857142865*G0_1_0_4_1_4 - 0.00759740259740285*G0_1_0_4_1_5 + 0.00584415584415606*G0_1_0_4_2_0 + 0.00511363636363654*G0_1_0_4_2_1 - 0.0458766233766251*G0_1_0_4_2_2 - 0.0198701298701306*G0_1_0_4_2_3 - 0.0245454545454554*G0_1_0_4_2_4 - 0.00584415584415605*G0_1_0_4_2_5 - 0.00584415584415602*G0_1_0_4_3_0 - 0.00642857142857163*G0_1_0_4_3_1 - 0.0198701298701306*G0_1_0_4_3_2 + 0.0163636363636369*G0_1_0_4_3_3 + 0.0631168831168851*G0_1_0_4_3_4 + 0.0233766233766241*G0_1_0_4_3_5 - 0.0245454545454553*G0_1_0_4_4_0 - 0.0257142857142865*G0_1_0_4_4_1 - 0.0245454545454554*G0_1_0_4_4_2 + 0.0631168831168851*G0_1_0_4_4_3 + 0.385714285714298*G0_1_0_4_4_4 + 0.0631168831168852*G0_1_0_4_4_5 - 0.0105194805194809*G0_1_0_4_5_0 - 0.00759740259740285*G0_1_0_4_5_1 - 0.00584415584415605*G0_1_0_4_5_2 + 0.0233766233766241*G0_1_0_4_5_3 + 0.0631168831168852*G0_1_0_4_5_4 + 0.0210389610389617*G0_1_0_4_5_5 - 0.00905844155844187*G0_1_0_5_0_0 + 0.00262987012987021*G0_1_0_5_0_1 + 0.00219155844155852*G0_1_0_5_0_2 - 0.00409090909090922*G0_1_0_5_0_3 - 0.0105194805194809*G0_1_0_5_0_4 - 0.0116883116883121*G0_1_0_5_0_5 + 0.00262987012987021*G0_1_0_5_1_0 + 0.00102272727272731*G0_1_0_5_1_1 + 0.00116883116883121*G0_1_0_5_1_2 - 0.00350649350649362*G0_1_0_5_1_3 - 0.00759740259740285*G0_1_0_5_1_4 - 0.00175324675324681*G0_1_0_5_1_5 + 0.00219155844155852*G0_1_0_5_2_0 + 0.00116883116883121*G0_1_0_5_2_1 - 0.00219155844155856*G0_1_0_5_2_2 - 0.00525974025974045*G0_1_0_5_2_3 - 0.00584415584415605*G0_1_0_5_2_4 - 0.00292207792207802*G0_1_0_5_2_5 - 0.00409090909090922*G0_1_0_5_3_0 - 0.00350649350649362*G0_1_0_5_3_1 - 0.00525974025974045*G0_1_0_5_3_2 + 0.0140259740259745*G0_1_0_5_3_3 + 0.0233766233766241*G0_1_0_5_3_4 + 0.0140259740259745*G0_1_0_5_3_5 - 0.0105194805194809*G0_1_0_5_4_0 - 0.00759740259740285*G0_1_0_5_4_1 - 0.00584415584415605*G0_1_0_5_4_2 + 0.0233766233766241*G0_1_0_5_4_3 + 0.0631168831168852*G0_1_0_5_4_4 + 0.0210389610389617*G0_1_0_5_4_5 - 0.0116883116883121*G0_1_0_5_5_0 - 0.00175324675324681*G0_1_0_5_5_1 - 0.00292207792207802*G0_1_0_5_5_2 + 0.0140259740259745*G0_1_0_5_5_3 + 0.0210389610389617*G0_1_0_5_5_4 + 0.0070129870129873*G0_1_0_5_5_5 + 0.167215909090915*G0_1_1_0_0_0 - 0.0106655844155848*G0_1_1_0_0_1 - 0.00913149350649382*G0_1_1_0_0_2 + 0.00204545454545459*G0_1_1_0_0_3 + 0.0344805194805206*G0_1_1_0_0_4 + 0.045876623376625*G0_1_1_0_0_5 - 0.0106655844155848*G0_1_1_0_1_0 + 0.00146103896103901*G0_1_1_0_1_1 - 0.000584415584415603*G0_1_1_0_1_3 - 0.00204545454545461*G0_1_1_0_1_4 - 0.00584415584415604*G0_1_1_0_1_5 - 0.00913149350649382*G0_1_1_0_2_0 + 0.00913149350649383*G0_1_1_0_2_2 + 0.00262987012987022*G0_1_1_0_2_3 - 0.00262987012987022*G0_1_1_0_2_5 + 0.00204545454545459*G0_1_1_0_3_0 - 0.000584415584415603*G0_1_1_0_3_1 + 0.00262987012987022*G0_1_1_0_3_2 + 0.00116883116883121*G0_1_1_0_3_3 + 0.00116883116883121*G0_1_1_0_3_5 + 0.0344805194805206*G0_1_1_0_4_0 - 0.00204545454545461*G0_1_1_0_4_1 + 0.00935064935064967*G0_1_1_0_4_5 + 0.045876623376625*G0_1_1_0_5_0 - 0.00584415584415604*G0_1_1_0_5_1 - 0.00262987012987022*G0_1_1_0_5_2 + 0.00116883116883121*G0_1_1_0_5_3 + 0.00935064935064967*G0_1_1_0_5_4 + 0.0292207792207802*G0_1_1_0_5_5 - 0.0106655844155848*G0_1_1_1_0_0 + 0.00146103896103901*G0_1_1_1_0_1 - 0.000584415584415603*G0_1_1_1_0_3 - 0.00204545454545462*G0_1_1_1_0_4 - 0.00584415584415604*G0_1_1_1_0_5 + 0.00146103896103901*G0_1_1_1_1_0 - 0.00146103896103901*G0_1_1_1_1_2 - 0.000584415584415607*G0_1_1_1_1_3 + 0.000584415584415606*G0_1_1_1_1_5 - 0.00146103896103901*G0_1_1_1_2_1 + 0.0106655844155848*G0_1_1_1_2_2 + 0.00584415584415605*G0_1_1_1_2_3 + 0.00204545454545462*G0_1_1_1_2_4 + 0.000584415584415606*G0_1_1_1_2_5 - 0.000584415584415603*G0_1_1_1_3_0 - 0.000584415584415606*G0_1_1_1_3_1 + 0.00584415584415605*G0_1_1_1_3_2 + 0.00701298701298726*G0_1_1_1_3_3 + 0.00116883116883122*G0_1_1_1_3_4 - 0.00204545454545461*G0_1_1_1_4_0 + 0.00204545454545462*G0_1_1_1_4_2 + 0.00116883116883122*G0_1_1_1_4_3 - 0.0011688311688312*G0_1_1_1_4_5 - 0.00584415584415604*G0_1_1_1_5_0 + 0.000584415584415606*G0_1_1_1_5_1 + 0.000584415584415606*G0_1_1_1_5_2 - 0.0011688311688312*G0_1_1_1_5_4 - 0.00701298701298724*G0_1_1_1_5_5 - 0.00913149350649382*G0_1_1_2_0_0 + 0.00913149350649383*G0_1_1_2_0_2 + 0.00262987012987022*G0_1_1_2_0_3 - 0.00262987012987022*G0_1_1_2_0_5 - 0.00146103896103901*G0_1_1_2_1_1 + 0.0106655844155848*G0_1_1_2_1_2 + 0.00584415584415605*G0_1_1_2_1_3 + 0.00204545454545462*G0_1_1_2_1_4 + 0.000584415584415606*G0_1_1_2_1_5 + 0.00913149350649383*G0_1_1_2_2_0 + 0.0106655844155848*G0_1_1_2_2_1 - 0.167215909090915*G0_1_1_2_2_2 - 0.045876623376625*G0_1_1_2_2_3 - 0.0344805194805208*G0_1_1_2_2_4 - 0.00204545454545465*G0_1_1_2_2_5 + 0.00262987012987022*G0_1_1_2_3_0 + 0.00584415584415605*G0_1_1_2_3_1 - 0.045876623376625*G0_1_1_2_3_2 - 0.0292207792207802*G0_1_1_2_3_3 - 0.00935064935064969*G0_1_1_2_3_4 - 0.00116883116883122*G0_1_1_2_3_5 + 0.00204545454545462*G0_1_1_2_4_1 - 0.0344805194805207*G0_1_1_2_4_2 - 0.00935064935064969*G0_1_1_2_4_3 - 0.00262987012987022*G0_1_1_2_5_0 + 0.000584415584415606*G0_1_1_2_5_1 - 0.00204545454545465*G0_1_1_2_5_2 - 0.00116883116883121*G0_1_1_2_5_3 - 0.0011688311688312*G0_1_1_2_5_5 + 0.00204545454545459*G0_1_1_3_0_0 - 0.000584415584415603*G0_1_1_3_0_1 + 0.00262987012987022*G0_1_1_3_0_2 + 0.00116883116883121*G0_1_1_3_0_3 + 0.00116883116883121*G0_1_1_3_0_5 - 0.000584415584415603*G0_1_1_3_1_0 - 0.000584415584415607*G0_1_1_3_1_1 + 0.00584415584415605*G0_1_1_3_1_2 + 0.00701298701298726*G0_1_1_3_1_3 + 0.00116883116883122*G0_1_1_3_1_4 + 0.00262987012987022*G0_1_1_3_2_0 + 0.00584415584415605*G0_1_1_3_2_1 - 0.045876623376625*G0_1_1_3_2_2 - 0.0292207792207802*G0_1_1_3_2_3 - 0.00935064935064969*G0_1_1_3_2_4 - 0.00116883116883121*G0_1_1_3_2_5 + 0.00116883116883121*G0_1_1_3_3_0 + 0.00701298701298726*G0_1_1_3_3_1 - 0.0292207792207803*G0_1_1_3_3_2 - 0.00467532467532487*G0_1_1_3_3_4 + 0.00116883116883122*G0_1_1_3_4_1 - 0.00935064935064969*G0_1_1_3_4_2 - 0.00467532467532488*G0_1_1_3_4_3 + 0.00116883116883121*G0_1_1_3_5_0 - 0.00116883116883121*G0_1_1_3_5_2 + 0.0344805194805206*G0_1_1_4_0_0 - 0.00204545454545461*G0_1_1_4_0_1 + 0.00935064935064967*G0_1_1_4_0_5 - 0.00204545454545461*G0_1_1_4_1_0 + 0.00204545454545462*G0_1_1_4_1_2 + 0.00116883116883122*G0_1_1_4_1_3 - 0.0011688311688312*G0_1_1_4_1_5 + 0.00204545454545462*G0_1_1_4_2_1 - 0.0344805194805208*G0_1_1_4_2_2 - 0.00935064935064969*G0_1_1_4_2_3 + 0.00116883116883122*G0_1_1_4_3_1 - 0.00935064935064969*G0_1_1_4_3_2 - 0.00467532467532488*G0_1_1_4_3_3 + 0.00935064935064967*G0_1_1_4_5_0 - 0.0011688311688312*G0_1_1_4_5_1 + 0.00467532467532481*G0_1_1_4_5_5 + 0.045876623376625*G0_1_1_5_0_0 - 0.00584415584415604*G0_1_1_5_0_1 - 0.00262987012987022*G0_1_1_5_0_2 + 0.00116883116883121*G0_1_1_5_0_3 + 0.00935064935064967*G0_1_1_5_0_4 + 0.0292207792207802*G0_1_1_5_0_5 - 0.00584415584415605*G0_1_1_5_1_0 + 0.000584415584415606*G0_1_1_5_1_1 + 0.000584415584415606*G0_1_1_5_1_2 - 0.0011688311688312*G0_1_1_5_1_4 - 0.00701298701298724*G0_1_1_5_1_5 - 0.00262987012987022*G0_1_1_5_2_0 + 0.000584415584415605*G0_1_1_5_2_1 - 0.00204545454545465*G0_1_1_5_2_2 - 0.00116883116883121*G0_1_1_5_2_3 - 0.0011688311688312*G0_1_1_5_2_5 + 0.00116883116883121*G0_1_1_5_3_0 - 0.00116883116883121*G0_1_1_5_3_2 + 0.00935064935064967*G0_1_1_5_4_0 - 0.0011688311688312*G0_1_1_5_4_1 + 0.00467532467532481*G0_1_1_5_4_5 + 0.0292207792207802*G0_1_1_5_5_0 - 0.00701298701298724*G0_1_1_5_5_1 - 0.0011688311688312*G0_1_1_5_5_2 + 0.00467532467532481*G0_1_1_5_5_4; + A[46] = -A[66] - 0.00178977272727284*G0_1_0_0_0_0 + 0.000572240259740281*G0_1_0_0_0_1 + 0.000730519480519509*G0_1_0_0_0_2 - 0.00180194805194811*G0_1_0_0_0_3 - 0.00228896103896112*G0_1_0_0_0_4 - 0.00185064935064943*G0_1_0_0_0_5 + 0.000572240259740281*G0_1_0_0_1_0 + 0.000572240259740281*G0_1_0_0_1_1 + 0.0002435064935065*G0_1_0_0_1_2 - 0.00180194805194811*G0_1_0_0_1_3 - 0.00180194805194811*G0_1_0_0_1_4 - 0.000194805194805191*G0_1_0_0_1_5 + 0.00073051948051951*G0_1_0_0_2_0 + 0.0002435064935065*G0_1_0_0_2_1 - 0.00986201298701333*G0_1_0_0_2_2 - 0.000974025974026011*G0_1_0_0_2_3 - 0.00243506493506503*G0_1_0_0_2_4 + 0.000243506493506501*G0_1_0_0_2_5 - 0.00180194805194811*G0_1_0_0_3_0 - 0.00180194805194811*G0_1_0_0_3_1 - 0.000974025974026011*G0_1_0_0_3_2 + 0.0103246753246757*G0_1_0_0_3_3 + 0.00720779220779243*G0_1_0_0_3_4 + 0.00311688311688322*G0_1_0_0_3_5 - 0.00228896103896112*G0_1_0_0_4_0 - 0.00180194805194811*G0_1_0_0_4_1 - 0.00243506493506503*G0_1_0_0_4_2 + 0.00720779220779243*G0_1_0_0_4_3 + 0.0122727272727276*G0_1_0_0_4_4 + 0.00311688311688321*G0_1_0_0_4_5 - 0.00185064935064943*G0_1_0_0_5_0 - 0.000194805194805191*G0_1_0_0_5_1 + 0.000243506493506501*G0_1_0_0_5_2 + 0.00311688311688322*G0_1_0_0_5_3 + 0.00311688311688321*G0_1_0_0_5_4 + 0.000389610389610382*G0_1_0_0_5_5 + 0.000572240259740281*G0_1_0_1_0_0 + 0.000572240259740281*G0_1_0_1_0_1 + 0.000243506493506501*G0_1_0_1_0_2 - 0.00180194805194811*G0_1_0_1_0_3 - 0.00180194805194811*G0_1_0_1_0_4 - 0.000194805194805191*G0_1_0_1_0_5 + 0.000572240259740281*G0_1_0_1_1_0 - 0.00178977272727283*G0_1_0_1_1_1 + 0.000730519480519507*G0_1_0_1_1_2 - 0.00228896103896112*G0_1_0_1_1_3 - 0.00180194805194811*G0_1_0_1_1_4 - 0.00185064935064943*G0_1_0_1_1_5 + 0.0002435064935065*G0_1_0_1_2_0 + 0.000730519480519506*G0_1_0_1_2_1 - 0.00986201298701331*G0_1_0_1_2_2 - 0.00243506493506502*G0_1_0_1_2_3 - 0.00097402597402601*G0_1_0_1_2_4 + 0.000243506493506501*G0_1_0_1_2_5 - 0.00180194805194811*G0_1_0_1_3_0 - 0.00228896103896112*G0_1_0_1_3_1 - 0.00243506493506502*G0_1_0_1_3_2 + 0.0122727272727277*G0_1_0_1_3_3 + 0.00720779220779244*G0_1_0_1_3_4 + 0.00311688311688322*G0_1_0_1_3_5 - 0.00180194805194811*G0_1_0_1_4_0 - 0.00180194805194811*G0_1_0_1_4_1 - 0.00097402597402601*G0_1_0_1_4_2 + 0.00720779220779244*G0_1_0_1_4_3 + 0.0103246753246757*G0_1_0_1_4_4 + 0.00311688311688322*G0_1_0_1_4_5 - 0.000194805194805191*G0_1_0_1_5_0 - 0.00185064935064943*G0_1_0_1_5_1 + 0.000243506493506501*G0_1_0_1_5_2 + 0.00311688311688322*G0_1_0_1_5_3 + 0.00311688311688322*G0_1_0_1_5_4 + 0.00038961038961039*G0_1_0_1_5_5 + 0.00073051948051951*G0_1_0_2_0_0 + 0.0002435064935065*G0_1_0_2_0_1 - 0.00986201298701333*G0_1_0_2_0_2 - 0.000974025974026011*G0_1_0_2_0_3 - 0.00243506493506503*G0_1_0_2_0_4 + 0.000243506493506501*G0_1_0_2_0_5 + 0.0002435064935065*G0_1_0_2_1_0 + 0.000730519480519506*G0_1_0_2_1_1 - 0.00986201298701331*G0_1_0_2_1_2 - 0.00243506493506502*G0_1_0_2_1_3 - 0.00097402597402601*G0_1_0_2_1_4 + 0.000243506493506501*G0_1_0_2_1_5 - 0.00986201298701333*G0_1_0_2_2_0 - 0.00986201298701331*G0_1_0_2_2_1 + 0.201623376623384*G0_1_0_2_2_2 + 0.0409090909090924*G0_1_0_2_2_3 + 0.0409090909090924*G0_1_0_2_2_4 + 0.00146103896103904*G0_1_0_2_2_5 - 0.000974025974026011*G0_1_0_2_3_0 - 0.00243506493506502*G0_1_0_2_3_1 + 0.0409090909090924*G0_1_0_2_3_2 + 0.00779220779220805*G0_1_0_2_3_3 + 0.00389610389610405*G0_1_0_2_3_4 - 0.000974025974025999*G0_1_0_2_3_5 - 0.00243506493506503*G0_1_0_2_4_0 - 0.00097402597402601*G0_1_0_2_4_1 + 0.0409090909090924*G0_1_0_2_4_2 + 0.00389610389610405*G0_1_0_2_4_3 + 0.00779220779220813*G0_1_0_2_4_4 - 0.000974025974025997*G0_1_0_2_4_5 + 0.000243506493506501*G0_1_0_2_5_0 + 0.000243506493506501*G0_1_0_2_5_1 + 0.00146103896103904*G0_1_0_2_5_2 - 0.000974025974025998*G0_1_0_2_5_3 - 0.000974025974025997*G0_1_0_2_5_4 - 0.00180194805194811*G0_1_0_3_0_0 - 0.00180194805194811*G0_1_0_3_0_1 - 0.00097402597402601*G0_1_0_3_0_2 + 0.0103246753246757*G0_1_0_3_0_3 + 0.00720779220779243*G0_1_0_3_0_4 + 0.00311688311688322*G0_1_0_3_0_5 - 0.00180194805194811*G0_1_0_3_1_0 - 0.00228896103896112*G0_1_0_3_1_1 - 0.00243506493506502*G0_1_0_3_1_2 + 0.0122727272727277*G0_1_0_3_1_3 + 0.00720779220779244*G0_1_0_3_1_4 + 0.00311688311688322*G0_1_0_3_1_5 - 0.00097402597402601*G0_1_0_3_2_0 - 0.00243506493506502*G0_1_0_3_2_1 + 0.0409090909090924*G0_1_0_3_2_2 + 0.00779220779220805*G0_1_0_3_2_3 + 0.00389610389610405*G0_1_0_3_2_4 - 0.000974025974025999*G0_1_0_3_2_5 + 0.0103246753246757*G0_1_0_3_3_0 + 0.0122727272727277*G0_1_0_3_3_1 + 0.00779220779220806*G0_1_0_3_3_2 - 0.105194805194809*G0_1_0_3_3_3 - 0.0350649350649362*G0_1_0_3_3_4 - 0.0187012987012993*G0_1_0_3_3_5 + 0.00720779220779243*G0_1_0_3_4_0 + 0.00720779220779244*G0_1_0_3_4_1 + 0.00389610389610405*G0_1_0_3_4_2 - 0.0350649350649362*G0_1_0_3_4_3 - 0.0350649350649362*G0_1_0_3_4_4 - 0.0124675324675329*G0_1_0_3_4_5 + 0.00311688311688322*G0_1_0_3_5_0 + 0.00311688311688322*G0_1_0_3_5_1 - 0.000974025974025999*G0_1_0_3_5_2 - 0.0187012987012994*G0_1_0_3_5_3 - 0.0124675324675329*G0_1_0_3_5_4 - 0.00623376623376646*G0_1_0_3_5_5 - 0.00228896103896112*G0_1_0_4_0_0 - 0.00180194805194811*G0_1_0_4_0_1 - 0.00243506493506503*G0_1_0_4_0_2 + 0.00720779220779243*G0_1_0_4_0_3 + 0.0122727272727276*G0_1_0_4_0_4 + 0.00311688311688321*G0_1_0_4_0_5 - 0.00180194805194811*G0_1_0_4_1_0 - 0.00180194805194811*G0_1_0_4_1_1 - 0.00097402597402601*G0_1_0_4_1_2 + 0.00720779220779244*G0_1_0_4_1_3 + 0.0103246753246757*G0_1_0_4_1_4 + 0.00311688311688322*G0_1_0_4_1_5 - 0.00243506493506503*G0_1_0_4_2_0 - 0.00097402597402601*G0_1_0_4_2_1 + 0.0409090909090924*G0_1_0_4_2_2 + 0.00389610389610405*G0_1_0_4_2_3 + 0.00779220779220813*G0_1_0_4_2_4 - 0.000974025974025997*G0_1_0_4_2_5 + 0.00720779220779243*G0_1_0_4_3_0 + 0.00720779220779244*G0_1_0_4_3_1 + 0.00389610389610405*G0_1_0_4_3_2 - 0.0350649350649362*G0_1_0_4_3_3 - 0.0350649350649362*G0_1_0_4_3_4 - 0.0124675324675329*G0_1_0_4_3_5 + 0.0122727272727276*G0_1_0_4_4_0 + 0.0103246753246757*G0_1_0_4_4_1 + 0.00779220779220813*G0_1_0_4_4_2 - 0.0350649350649362*G0_1_0_4_4_3 - 0.105194805194808*G0_1_0_4_4_4 - 0.0187012987012993*G0_1_0_4_4_5 + 0.00311688311688321*G0_1_0_4_5_0 + 0.00311688311688322*G0_1_0_4_5_1 - 0.000974025974025997*G0_1_0_4_5_2 - 0.0124675324675329*G0_1_0_4_5_3 - 0.0187012987012993*G0_1_0_4_5_4 - 0.00623376623376646*G0_1_0_4_5_5 - 0.00185064935064943*G0_1_0_5_0_0 - 0.000194805194805191*G0_1_0_5_0_1 + 0.000243506493506501*G0_1_0_5_0_2 + 0.00311688311688322*G0_1_0_5_0_3 + 0.00311688311688321*G0_1_0_5_0_4 + 0.000389610389610382*G0_1_0_5_0_5 - 0.000194805194805191*G0_1_0_5_1_0 - 0.00185064935064943*G0_1_0_5_1_1 + 0.000243506493506501*G0_1_0_5_1_2 + 0.00311688311688322*G0_1_0_5_1_3 + 0.00311688311688322*G0_1_0_5_1_4 + 0.00038961038961039*G0_1_0_5_1_5 + 0.000243506493506501*G0_1_0_5_2_0 + 0.000243506493506501*G0_1_0_5_2_1 + 0.00146103896103904*G0_1_0_5_2_2 - 0.000974025974025998*G0_1_0_5_2_3 - 0.000974025974025997*G0_1_0_5_2_4 + 0.00311688311688322*G0_1_0_5_3_0 + 0.00311688311688322*G0_1_0_5_3_1 - 0.000974025974025998*G0_1_0_5_3_2 - 0.0187012987012994*G0_1_0_5_3_3 - 0.0124675324675329*G0_1_0_5_3_4 - 0.00623376623376646*G0_1_0_5_3_5 + 0.00311688311688321*G0_1_0_5_4_0 + 0.00311688311688322*G0_1_0_5_4_1 - 0.000974025974025997*G0_1_0_5_4_2 - 0.0124675324675329*G0_1_0_5_4_3 - 0.0187012987012993*G0_1_0_5_4_4 - 0.00623376623376646*G0_1_0_5_4_5 + 0.000389610389610382*G0_1_0_5_5_0 + 0.00038961038961039*G0_1_0_5_5_1 - 0.00623376623376646*G0_1_0_5_5_3 - 0.00623376623376646*G0_1_0_5_5_4 - 0.0140259740259747*G0_1_0_5_5_5 + 0.0559212662337682*G0_1_1_0_0_0 - 0.0055762987012989*G0_1_1_0_0_1 - 0.00234983766233774*G0_1_1_0_0_2 + 0.00340909090909101*G0_1_1_0_0_3 + 0.0154383116883122*G0_1_1_0_0_4 + 0.0271753246753257*G0_1_1_0_0_5 - 0.0055762987012989*G0_1_1_0_1_0 - 0.000133928571428572*G0_1_1_0_1_1 + 0.00071834415584418*G0_1_1_0_1_2 + 0.0010227272727273*G0_1_1_0_1_3 + 0.000681818181818198*G0_1_1_0_1_4 - 0.00555194805194825*G0_1_1_0_1_5 - 0.00234983766233774*G0_1_1_0_2_0 + 0.00071834415584418*G0_1_1_0_2_1 - 0.00791396103896131*G0_1_1_0_2_2 - 0.000487012987013004*G0_1_1_0_2_3 - 0.00535714285714304*G0_1_1_0_2_4 - 0.000681818181818212*G0_1_1_0_2_5 + 0.00340909090909101*G0_1_1_0_3_0 + 0.0010227272727273*G0_1_1_0_3_1 - 0.000487012987013004*G0_1_1_0_3_2 - 0.00798701298701325*G0_1_1_0_3_3 - 0.00818181818181844*G0_1_1_0_3_4 - 0.00545454545454563*G0_1_1_0_3_5 + 0.0154383116883122*G0_1_1_0_4_0 + 0.000681818181818198*G0_1_1_0_4_1 - 0.00535714285714304*G0_1_1_0_4_2 - 0.00818181818181844*G0_1_1_0_4_3 - 0.000974025974025961*G0_1_1_0_4_4 + 0.0271753246753257*G0_1_1_0_5_0 - 0.00555194805194825*G0_1_1_0_5_1 - 0.000681818181818213*G0_1_1_0_5_2 - 0.00545454545454563*G0_1_1_0_5_3 + 0.0198701298701306*G0_1_1_0_5_5 - 0.0055762987012989*G0_1_1_1_0_0 - 0.000133928571428572*G0_1_1_1_0_1 + 0.00071834415584418*G0_1_1_1_0_2 + 0.0010227272727273*G0_1_1_1_0_3 + 0.000681818181818199*G0_1_1_1_0_4 - 0.00555194805194825*G0_1_1_1_0_5 - 0.000133928571428572*G0_1_1_1_1_0 + 0.00175324675324682*G0_1_1_1_1_1 + 0.00292207792207802*G0_1_1_1_1_3 + 0.00452922077922093*G0_1_1_1_1_4 + 0.00779220779220806*G0_1_1_1_1_5 + 0.000718344155844181*G0_1_1_1_2_0 - 0.00949675324675356*G0_1_1_1_2_2 - 0.00194805194805202*G0_1_1_1_2_3 + 0.000974025974026005*G0_1_1_1_2_4 + 0.00170454545454551*G0_1_1_1_2_5 + 0.0010227272727273*G0_1_1_1_3_0 + 0.00292207792207802*G0_1_1_1_3_1 - 0.00194805194805202*G0_1_1_1_3_2 - 0.0031168831168832*G0_1_1_1_3_3 - 0.0111038961038965*G0_1_1_1_3_4 - 0.00545454545454564*G0_1_1_1_3_5 + 0.000681818181818198*G0_1_1_1_4_0 + 0.00452922077922093*G0_1_1_1_4_1 + 0.000974025974026006*G0_1_1_1_4_2 - 0.0111038961038965*G0_1_1_1_4_3 - 0.0292207792207802*G0_1_1_1_4_4 - 0.0124675324675329*G0_1_1_1_4_5 - 0.00555194805194825*G0_1_1_1_5_0 + 0.00779220779220806*G0_1_1_1_5_1 + 0.00170454545454551*G0_1_1_1_5_2 - 0.00545454545454564*G0_1_1_1_5_3 - 0.0124675324675329*G0_1_1_1_5_4 - 0.0101298701298705*G0_1_1_1_5_5 - 0.00234983766233774*G0_1_1_2_0_0 + 0.00071834415584418*G0_1_1_2_0_1 - 0.00791396103896131*G0_1_1_2_0_2 - 0.000487012987013004*G0_1_1_2_0_3 - 0.00535714285714304*G0_1_1_2_0_4 - 0.000681818181818212*G0_1_1_2_0_5 + 0.00071834415584418*G0_1_1_2_1_0 - 0.00949675324675356*G0_1_1_2_1_2 - 0.00194805194805202*G0_1_1_2_1_3 + 0.000974025974026007*G0_1_1_2_1_4 + 0.00170454545454551*G0_1_1_2_1_5 - 0.00791396103896131*G0_1_1_2_2_0 - 0.00949675324675356*G0_1_1_2_2_1 + 0.17715097402598*G0_1_1_2_2_2 + 0.0394480519480533*G0_1_1_2_2_3 + 0.0379870129870144*G0_1_1_2_2_4 + 0.00389610389610406*G0_1_1_2_2_5 - 0.000487012987013004*G0_1_1_2_3_0 - 0.00194805194805202*G0_1_1_2_3_1 + 0.0394480519480533*G0_1_1_2_3_2 + 0.00292207792207801*G0_1_1_2_3_3 - 0.00097402597402599*G0_1_1_2_3_4 - 0.00681818181818204*G0_1_1_2_3_5 - 0.00535714285714304*G0_1_1_2_4_0 + 0.000974025974026006*G0_1_1_2_4_1 + 0.0379870129870143*G0_1_1_2_4_2 - 0.000974025974025988*G0_1_1_2_4_3 - 0.00681818181818201*G0_1_1_2_4_4 - 0.00974025974026006*G0_1_1_2_4_5 - 0.000681818181818212*G0_1_1_2_5_0 + 0.00170454545454551*G0_1_1_2_5_1 + 0.00389610389610406*G0_1_1_2_5_2 - 0.00681818181818204*G0_1_1_2_5_3 - 0.00974025974026006*G0_1_1_2_5_4 - 0.0124675324675329*G0_1_1_2_5_5 + 0.00340909090909101*G0_1_1_3_0_0 + 0.0010227272727273*G0_1_1_3_0_1 - 0.000487012987013003*G0_1_1_3_0_2 - 0.00798701298701325*G0_1_1_3_0_3 - 0.00818181818181844*G0_1_1_3_0_4 - 0.00545454545454563*G0_1_1_3_0_5 + 0.0010227272727273*G0_1_1_3_1_0 + 0.00292207792207802*G0_1_1_3_1_1 - 0.00194805194805202*G0_1_1_3_1_2 - 0.0031168831168832*G0_1_1_3_1_3 - 0.0111038961038965*G0_1_1_3_1_4 - 0.00545454545454564*G0_1_1_3_1_5 - 0.000487012987013004*G0_1_1_3_2_0 - 0.00194805194805202*G0_1_1_3_2_1 + 0.0394480519480533*G0_1_1_3_2_2 + 0.00292207792207801*G0_1_1_3_2_3 - 0.000974025974025988*G0_1_1_3_2_4 - 0.00681818181818204*G0_1_1_3_2_5 - 0.00798701298701325*G0_1_1_3_3_0 - 0.0031168831168832*G0_1_1_3_3_1 + 0.00292207792207802*G0_1_1_3_3_2 + 0.00467532467532474*G0_1_1_3_3_3 + 0.0381818181818194*G0_1_1_3_3_4 + 0.0296103896103906*G0_1_1_3_3_5 - 0.00818181818181844*G0_1_1_3_4_0 - 0.0111038961038965*G0_1_1_3_4_1 - 0.00097402597402599*G0_1_1_3_4_2 + 0.0381818181818194*G0_1_1_3_4_3 + 0.0748051948051972*G0_1_1_3_4_4 + 0.035844155844157*G0_1_1_3_4_5 - 0.00545454545454563*G0_1_1_3_5_0 - 0.00545454545454564*G0_1_1_3_5_1 - 0.00681818181818204*G0_1_1_3_5_2 + 0.0296103896103906*G0_1_1_3_5_3 + 0.035844155844157*G0_1_1_3_5_4 + 0.0358441558441571*G0_1_1_3_5_5 + 0.0154383116883122*G0_1_1_4_0_0 + 0.000681818181818198*G0_1_1_4_0_1 - 0.00535714285714304*G0_1_1_4_0_2 - 0.00818181818181844*G0_1_1_4_0_3 - 0.000974025974025961*G0_1_1_4_0_4 + 0.000681818181818198*G0_1_1_4_1_0 + 0.00452922077922093*G0_1_1_4_1_1 + 0.000974025974026006*G0_1_1_4_1_2 - 0.0111038961038965*G0_1_1_4_1_3 - 0.0292207792207802*G0_1_1_4_1_4 - 0.0124675324675329*G0_1_1_4_1_5 - 0.00535714285714304*G0_1_1_4_2_0 + 0.000974025974026006*G0_1_1_4_2_1 + 0.0379870129870144*G0_1_1_4_2_2 - 0.000974025974025988*G0_1_1_4_2_3 - 0.00681818181818201*G0_1_1_4_2_4 - 0.00974025974026006*G0_1_1_4_2_5 - 0.00818181818181844*G0_1_1_4_3_0 - 0.0111038961038965*G0_1_1_4_3_1 - 0.00097402597402599*G0_1_1_4_3_2 + 0.0381818181818194*G0_1_1_4_3_3 + 0.0748051948051972*G0_1_1_4_3_4 + 0.035844155844157*G0_1_1_4_3_5 - 0.000974025974025961*G0_1_1_4_4_0 - 0.0292207792207802*G0_1_1_4_4_1 - 0.00681818181818201*G0_1_1_4_4_2 + 0.0748051948051972*G0_1_1_4_4_3 + 0.334285714285725*G0_1_1_4_4_4 + 0.0779220779220805*G0_1_1_4_4_5 - 0.0124675324675329*G0_1_1_4_5_1 - 0.00974025974026006*G0_1_1_4_5_2 + 0.035844155844157*G0_1_1_4_5_3 + 0.0779220779220805*G0_1_1_4_5_4 + 0.0498701298701316*G0_1_1_4_5_5 + 0.0271753246753257*G0_1_1_5_0_0 - 0.00555194805194825*G0_1_1_5_0_1 - 0.000681818181818213*G0_1_1_5_0_2 - 0.00545454545454563*G0_1_1_5_0_3 + 0.0198701298701306*G0_1_1_5_0_5 - 0.00555194805194825*G0_1_1_5_1_0 + 0.00779220779220806*G0_1_1_5_1_1 + 0.00170454545454551*G0_1_1_5_1_2 - 0.00545454545454564*G0_1_1_5_1_3 - 0.0124675324675329*G0_1_1_5_1_4 - 0.0101298701298705*G0_1_1_5_1_5 - 0.000681818181818212*G0_1_1_5_2_0 + 0.00170454545454551*G0_1_1_5_2_1 + 0.00389610389610406*G0_1_1_5_2_2 - 0.00681818181818204*G0_1_1_5_2_3 - 0.00974025974026006*G0_1_1_5_2_4 - 0.0124675324675329*G0_1_1_5_2_5 - 0.00545454545454563*G0_1_1_5_3_0 - 0.00545454545454564*G0_1_1_5_3_1 - 0.00681818181818204*G0_1_1_5_3_2 + 0.0296103896103906*G0_1_1_5_3_3 + 0.035844155844157*G0_1_1_5_3_4 + 0.0358441558441571*G0_1_1_5_3_5 - 0.0124675324675329*G0_1_1_5_4_1 - 0.00974025974026006*G0_1_1_5_4_2 + 0.035844155844157*G0_1_1_5_4_3 + 0.0779220779220805*G0_1_1_5_4_4 + 0.0498701298701316*G0_1_1_5_4_5 + 0.0198701298701306*G0_1_1_5_5_0 - 0.0101298701298705*G0_1_1_5_5_1 - 0.0124675324675329*G0_1_1_5_5_2 + 0.0358441558441571*G0_1_1_5_5_3 + 0.0498701298701316*G0_1_1_5_5_4 + 0.187012987012993*G0_1_1_5_5_5; + A[83] = A[46] + 0.0033238636363638*G0_0_0_0_0_0 - 0.00152191558441564*G0_0_0_0_0_1 + 0.00280032467532477*G0_0_0_0_0_2 + 0.00370129870129882*G0_0_0_0_0_3 + 0.0105194805194809*G0_0_0_0_0_4 + 0.00287337662337673*G0_0_0_0_0_5 - 0.00152191558441564*G0_0_0_0_1_0 + 0.00204545454545462*G0_0_0_0_1_1 + 0.00186282467532474*G0_0_0_0_1_2 + 0.00633116883116904*G0_0_0_0_1_3 + 0.00350649350649362*G0_0_0_0_1_4 + 0.00224025974025981*G0_0_0_0_1_5 + 0.00280032467532477*G0_0_0_0_2_0 + 0.00186282467532474*G0_0_0_0_2_1 - 0.0228043831168839*G0_0_0_0_2_2 - 0.0100811688311692*G0_0_0_0_2_3 - 0.0182142857142863*G0_0_0_0_2_4 - 0.000974025974026016*G0_0_0_0_2_5 + 0.00370129870129882*G0_0_0_0_3_0 + 0.00633116883116903*G0_0_0_0_3_1 - 0.0100811688311692*G0_0_0_0_3_2 - 0.0138311688311693*G0_0_0_0_3_3 - 0.0144155844155849*G0_0_0_0_3_4 - 0.00545454545454562*G0_0_0_0_3_5 + 0.0105194805194809*G0_0_0_0_4_0 + 0.00350649350649362*G0_0_0_0_4_1 - 0.0182142857142863*G0_0_0_0_4_2 - 0.0144155844155849*G0_0_0_0_4_3 - 0.0245454545454553*G0_0_0_0_4_4 - 0.00506493506493522*G0_0_0_0_4_5 + 0.00287337662337673*G0_0_0_0_5_0 + 0.00224025974025981*G0_0_0_0_5_1 - 0.000974025974026016*G0_0_0_0_5_2 - 0.00545454545454562*G0_0_0_0_5_3 - 0.00506493506493522*G0_0_0_0_5_4 - 0.00487012987013001*G0_0_0_0_5_5 - 0.00152191558441564*G0_0_0_1_0_0 + 0.00204545454545462*G0_0_0_1_0_1 + 0.00186282467532474*G0_0_0_1_0_2 + 0.00633116883116903*G0_0_0_1_0_3 + 0.00350649350649362*G0_0_0_1_0_4 + 0.00224025974025981*G0_0_0_1_0_5 + 0.00204545454545462*G0_0_0_1_1_0 - 0.0426623376623391*G0_0_0_1_1_1 + 0.00954545454545488*G0_0_0_1_1_2 - 0.0230844155844164*G0_0_0_1_1_3 + 0.00214285714285721*G0_0_0_1_1_4 - 0.00905844155844191*G0_0_0_1_1_5 + 0.00186282467532474*G0_0_0_1_2_0 + 0.00954545454545488*G0_0_0_1_2_1 - 0.024119318181819*G0_0_0_1_2_2 - 0.00876623376623407*G0_0_0_1_2_3 - 0.00881493506493536*G0_0_0_1_2_4 + 0.00136363636363641*G0_0_0_1_2_5 + 0.00633116883116903*G0_0_0_1_3_0 - 0.0230844155844164*G0_0_0_1_3_1 - 0.00876623376623407*G0_0_0_1_3_2 - 0.0707142857142882*G0_0_0_1_3_3 - 0.0169480519480525*G0_0_0_1_3_4 - 0.0153896103896109*G0_0_0_1_3_5 + 0.00350649350649362*G0_0_0_1_4_0 + 0.00214285714285721*G0_0_0_1_4_1 - 0.00881493506493537*G0_0_0_1_4_2 - 0.0169480519480525*G0_0_0_1_4_3 - 0.0194805194805201*G0_0_0_1_4_4 - 0.00701298701298725*G0_0_0_1_4_5 + 0.00224025974025981*G0_0_0_1_5_0 - 0.00905844155844191*G0_0_0_1_5_1 + 0.00136363636363641*G0_0_0_1_5_2 - 0.0153896103896109*G0_0_0_1_5_3 - 0.00701298701298725*G0_0_0_1_5_4 - 0.0107142857142861*G0_0_0_1_5_5 + 0.00280032467532477*G0_0_0_2_0_0 + 0.00186282467532474*G0_0_0_2_0_1 - 0.0228043831168839*G0_0_0_2_0_2 - 0.0100811688311692*G0_0_0_2_0_3 - 0.0182142857142863*G0_0_0_2_0_4 - 0.000974025974026016*G0_0_0_2_0_5 + 0.00186282467532474*G0_0_0_2_1_0 + 0.00954545454545488*G0_0_0_2_1_1 - 0.024119318181819*G0_0_0_2_1_2 - 0.00876623376623407*G0_0_0_2_1_3 - 0.00881493506493536*G0_0_0_2_1_4 + 0.00136363636363641*G0_0_0_2_1_5 - 0.0228043831168839*G0_0_0_2_2_0 - 0.024119318181819*G0_0_0_2_2_1 + 0.305357142857154*G0_0_0_2_2_2 + 0.095162337662341*G0_0_0_2_2_3 + 0.100616883116887*G0_0_0_2_2_4 + 0.00784090909090942*G0_0_0_2_2_5 - 0.0100811688311692*G0_0_0_2_3_0 - 0.00876623376623407*G0_0_0_2_3_1 + 0.095162337662341*G0_0_0_2_3_2 + 0.0919480519480552*G0_0_0_2_3_3 + 0.0377922077922091*G0_0_0_2_3_4 + 0.00448051948051968*G0_0_0_2_3_5 - 0.0182142857142863*G0_0_0_2_4_0 - 0.00881493506493537*G0_0_0_2_4_1 + 0.100616883116887*G0_0_0_2_4_2 + 0.0377922077922091*G0_0_0_2_4_3 + 0.0779220779220806*G0_0_0_2_4_4 + 0.00194805194805205*G0_0_0_2_4_5 - 0.000974025974026017*G0_0_0_2_5_0 + 0.00136363636363641*G0_0_0_2_5_1 + 0.00784090909090942*G0_0_0_2_5_2 + 0.00448051948051968*G0_0_0_2_5_3 + 0.00194805194805205*G0_0_0_2_5_4 - 0.00662337662337683*G0_0_0_2_5_5 + 0.00370129870129882*G0_0_0_3_0_0 + 0.00633116883116904*G0_0_0_3_0_1 - 0.0100811688311692*G0_0_0_3_0_2 - 0.0138311688311693*G0_0_0_3_0_3 - 0.0144155844155849*G0_0_0_3_0_4 - 0.00545454545454562*G0_0_0_3_0_5 + 0.00633116883116903*G0_0_0_3_1_0 - 0.0230844155844164*G0_0_0_3_1_1 - 0.00876623376623407*G0_0_0_3_1_2 - 0.0707142857142882*G0_0_0_3_1_3 - 0.0169480519480525*G0_0_0_3_1_4 - 0.0153896103896109*G0_0_0_3_1_5 - 0.0100811688311692*G0_0_0_3_2_0 - 0.00876623376623407*G0_0_0_3_2_1 + 0.095162337662341*G0_0_0_3_2_2 + 0.0919480519480552*G0_0_0_3_2_3 + 0.0377922077922091*G0_0_0_3_2_4 + 0.00448051948051968*G0_0_0_3_2_5 - 0.0138311688311693*G0_0_0_3_3_0 - 0.0707142857142882*G0_0_0_3_3_1 + 0.0919480519480552*G0_0_0_3_3_2 + 0.0537662337662356*G0_0_0_3_3_3 + 0.0615584415584436*G0_0_0_3_3_4 + 0.0187012987012993*G0_0_0_3_3_5 - 0.0144155844155849*G0_0_0_3_4_0 - 0.0169480519480525*G0_0_0_3_4_1 + 0.0377922077922091*G0_0_0_3_4_2 + 0.0615584415584436*G0_0_0_3_4_3 + 0.0677922077922101*G0_0_0_3_4_4 + 0.0249350649350658*G0_0_0_3_4_5 - 0.00545454545454562*G0_0_0_3_5_0 - 0.0153896103896109*G0_0_0_3_5_1 + 0.00448051948051968*G0_0_0_3_5_2 + 0.0187012987012993*G0_0_0_3_5_3 + 0.0249350649350658*G0_0_0_3_5_4 + 0.0241558441558449*G0_0_0_3_5_5 + 0.0105194805194809*G0_0_0_4_0_0 + 0.00350649350649362*G0_0_0_4_0_1 - 0.0182142857142863*G0_0_0_4_0_2 - 0.0144155844155849*G0_0_0_4_0_3 - 0.0245454545454553*G0_0_0_4_0_4 - 0.00506493506493522*G0_0_0_4_0_5 + 0.00350649350649362*G0_0_0_4_1_0 + 0.00214285714285721*G0_0_0_4_1_1 - 0.00881493506493537*G0_0_0_4_1_2 - 0.0169480519480525*G0_0_0_4_1_3 - 0.0194805194805201*G0_0_0_4_1_4 - 0.00701298701298725*G0_0_0_4_1_5 - 0.0182142857142863*G0_0_0_4_2_0 - 0.00881493506493537*G0_0_0_4_2_1 + 0.100616883116887*G0_0_0_4_2_2 + 0.0377922077922091*G0_0_0_4_2_3 + 0.0779220779220806*G0_0_0_4_2_4 + 0.00194805194805205*G0_0_0_4_2_5 - 0.0144155844155849*G0_0_0_4_3_0 - 0.0169480519480525*G0_0_0_4_3_1 + 0.0377922077922091*G0_0_0_4_3_2 + 0.0615584415584436*G0_0_0_4_3_3 + 0.0677922077922101*G0_0_0_4_3_4 + 0.0249350649350658*G0_0_0_4_3_5 - 0.0245454545454553*G0_0_0_4_4_0 - 0.0194805194805201*G0_0_0_4_4_1 + 0.0779220779220806*G0_0_0_4_4_2 + 0.0677922077922101*G0_0_0_4_4_3 + 0.236103896103904*G0_0_0_4_4_4 + 0.0350649350649362*G0_0_0_4_4_5 - 0.00506493506493522*G0_0_0_4_5_0 - 0.00701298701298725*G0_0_0_4_5_1 + 0.00194805194805204*G0_0_0_4_5_2 + 0.0249350649350658*G0_0_0_4_5_3 + 0.0350649350649362*G0_0_0_4_5_4 + 0.0272727272727282*G0_0_0_4_5_5 + 0.00287337662337673*G0_0_0_5_0_0 + 0.00224025974025981*G0_0_0_5_0_1 - 0.000974025974026016*G0_0_0_5_0_2 - 0.00545454545454562*G0_0_0_5_0_3 - 0.00506493506493522*G0_0_0_5_0_4 - 0.00487012987013001*G0_0_0_5_0_5 + 0.00224025974025981*G0_0_0_5_1_0 - 0.00905844155844191*G0_0_0_5_1_1 + 0.00136363636363641*G0_0_0_5_1_2 - 0.0153896103896109*G0_0_0_5_1_3 - 0.00701298701298725*G0_0_0_5_1_4 - 0.0107142857142861*G0_0_0_5_1_5 - 0.000974025974026016*G0_0_0_5_2_0 + 0.00136363636363641*G0_0_0_5_2_1 + 0.00784090909090942*G0_0_0_5_2_2 + 0.00448051948051968*G0_0_0_5_2_3 + 0.00194805194805204*G0_0_0_5_2_4 - 0.00662337662337683*G0_0_0_5_2_5 - 0.00545454545454562*G0_0_0_5_3_0 - 0.0153896103896109*G0_0_0_5_3_1 + 0.00448051948051968*G0_0_0_5_3_2 + 0.0187012987012993*G0_0_0_5_3_3 + 0.0249350649350657*G0_0_0_5_3_4 + 0.0241558441558449*G0_0_0_5_3_5 - 0.00506493506493522*G0_0_0_5_4_0 - 0.00701298701298725*G0_0_0_5_4_1 + 0.00194805194805204*G0_0_0_5_4_2 + 0.0249350649350658*G0_0_0_5_4_3 + 0.0350649350649362*G0_0_0_5_4_4 + 0.0272727272727282*G0_0_0_5_4_5 - 0.00487012987013001*G0_0_0_5_5_0 - 0.0107142857142861*G0_0_0_5_5_1 - 0.00662337662337683*G0_0_0_5_5_2 + 0.0241558441558449*G0_0_0_5_5_3 + 0.0272727272727282*G0_0_0_5_5_4 + 0.0607792207792228*G0_0_0_5_5_5 - 0.00158279220779226*G0_0_1_0_0_1 + 0.00158279220779226*G0_0_1_0_0_2 + 0.000876623376623397*G0_0_1_0_0_4 - 0.000876623376623426*G0_0_1_0_0_5 - 0.00158279220779226*G0_0_1_0_1_0 + 0.014269480519481*G0_0_1_0_1_1 + 0.00662337662337685*G0_0_1_0_1_3 + 0.000584415584415605*G0_0_1_0_1_4 + 0.00662337662337686*G0_0_1_0_1_5 + 0.00158279220779226*G0_0_1_0_2_0 - 0.014269480519481*G0_0_1_0_2_2 - 0.00662337662337684*G0_0_1_0_2_3 - 0.00662337662337686*G0_0_1_0_2_4 - 0.000584415584415608*G0_0_1_0_2_5 + 0.00662337662337685*G0_0_1_0_3_1 - 0.00662337662337684*G0_0_1_0_3_2 - 0.00116883116883121*G0_0_1_0_3_4 + 0.00116883116883121*G0_0_1_0_3_5 + 0.000876623376623397*G0_0_1_0_4_0 + 0.000584415584415605*G0_0_1_0_4_1 - 0.00662337662337686*G0_0_1_0_4_2 - 0.00116883116883121*G0_0_1_0_4_3 + 0.00311688311688319*G0_0_1_0_4_4 - 0.000876623376623426*G0_0_1_0_5_0 + 0.00662337662337686*G0_0_1_0_5_1 - 0.000584415584415608*G0_0_1_0_5_2 + 0.00116883116883121*G0_0_1_0_5_3 - 0.00311688311688323*G0_0_1_0_5_5 - 0.00158279220779226*G0_0_1_1_0_0 + 0.014269480519481*G0_0_1_1_0_1 + 0.00662337662337685*G0_0_1_1_0_3 + 0.000584415584415605*G0_0_1_1_0_4 + 0.00662337662337686*G0_0_1_1_0_5 + 0.014269480519481*G0_0_1_1_1_0 - 0.252723214285723*G0_0_1_1_1_1 + 0.0203449675324682*G0_0_1_1_1_2 - 0.0747564935064961*G0_0_1_1_1_3 - 0.00370129870129881*G0_0_1_1_1_4 - 0.0594155844155867*G0_0_1_1_1_5 + 0.0203449675324682*G0_0_1_1_2_1 - 0.0203449675324682*G0_0_1_1_2_2 - 0.00428571428571444*G0_0_1_1_2_4 + 0.00428571428571445*G0_0_1_1_2_5 + 0.00662337662337685*G0_0_1_1_3_0 - 0.0747564935064961*G0_0_1_1_3_1 - 0.0761688311688338*G0_0_1_1_3_3 - 0.00584415584415605*G0_0_1_1_3_4 - 0.0218181818181826*G0_0_1_1_3_5 + 0.000584415584415605*G0_0_1_1_4_0 - 0.0037012987012988*G0_0_1_1_4_1 - 0.00428571428571444*G0_0_1_1_4_2 - 0.00584415584415605*G0_0_1_1_4_3 + 0.0015584415584416*G0_0_1_1_4_4 - 0.00116883116883121*G0_0_1_1_4_5 + 0.00662337662337686*G0_0_1_1_5_0 - 0.0594155844155867*G0_0_1_1_5_1 + 0.00428571428571445*G0_0_1_1_5_2 - 0.0218181818181826*G0_0_1_1_5_3 - 0.00116883116883121*G0_0_1_1_5_4 - 0.0249350649350659*G0_0_1_1_5_5 + 0.00158279220779226*G0_0_1_2_0_0 - 0.014269480519481*G0_0_1_2_0_2 - 0.00662337662337684*G0_0_1_2_0_3 - 0.00662337662337686*G0_0_1_2_0_4 - 0.000584415584415608*G0_0_1_2_0_5 + 0.0203449675324682*G0_0_1_2_1_1 - 0.0203449675324682*G0_0_1_2_1_2 - 0.00428571428571444*G0_0_1_2_1_4 + 0.00428571428571445*G0_0_1_2_1_5 - 0.014269480519481*G0_0_1_2_2_0 - 0.0203449675324682*G0_0_1_2_2_1 + 0.252723214285723*G0_0_1_2_2_2 + 0.0747564935064961*G0_0_1_2_2_3 + 0.0594155844155865*G0_0_1_2_2_4 + 0.00370129870129887*G0_0_1_2_2_5 - 0.00662337662337684*G0_0_1_2_3_0 + 0.0747564935064961*G0_0_1_2_3_2 + 0.0761688311688339*G0_0_1_2_3_3 + 0.0218181818181826*G0_0_1_2_3_4 + 0.00584415584415608*G0_0_1_2_3_5 - 0.00662337662337686*G0_0_1_2_4_0 - 0.00428571428571444*G0_0_1_2_4_1 + 0.0594155844155865*G0_0_1_2_4_2 + 0.0218181818181826*G0_0_1_2_4_3 + 0.0249350649350658*G0_0_1_2_4_4 + 0.00116883116883122*G0_0_1_2_4_5 - 0.000584415584415608*G0_0_1_2_5_0 + 0.00428571428571445*G0_0_1_2_5_1 + 0.00370129870129887*G0_0_1_2_5_2 + 0.00584415584415608*G0_0_1_2_5_3 + 0.00116883116883122*G0_0_1_2_5_4 - 0.00155844155844161*G0_0_1_2_5_5 + 0.00662337662337685*G0_0_1_3_0_1 - 0.00662337662337684*G0_0_1_3_0_2 - 0.00116883116883121*G0_0_1_3_0_4 + 0.00116883116883121*G0_0_1_3_0_5 + 0.00662337662337685*G0_0_1_3_1_0 - 0.0747564935064961*G0_0_1_3_1_1 - 0.0761688311688338*G0_0_1_3_1_3 - 0.00584415584415605*G0_0_1_3_1_4 - 0.0218181818181826*G0_0_1_3_1_5 - 0.00662337662337684*G0_0_1_3_2_0 + 0.0747564935064961*G0_0_1_3_2_2 + 0.0761688311688339*G0_0_1_3_2_3 + 0.0218181818181826*G0_0_1_3_2_4 + 0.00584415584415608*G0_0_1_3_2_5 - 0.0761688311688338*G0_0_1_3_3_1 + 0.0761688311688339*G0_0_1_3_3_2 + 0.0116883116883121*G0_0_1_3_3_4 - 0.0116883116883121*G0_0_1_3_3_5 - 0.00116883116883121*G0_0_1_3_4_0 - 0.00584415584415605*G0_0_1_3_4_1 + 0.0218181818181826*G0_0_1_3_4_2 + 0.0116883116883121*G0_0_1_3_4_3 - 0.000779220779220762*G0_0_1_3_4_4 + 0.00116883116883121*G0_0_1_3_5_0 - 0.0218181818181826*G0_0_1_3_5_1 + 0.00584415584415608*G0_0_1_3_5_2 - 0.0116883116883121*G0_0_1_3_5_3 + 0.000779220779220777*G0_0_1_3_5_5 + 0.000876623376623397*G0_0_1_4_0_0 + 0.000584415584415605*G0_0_1_4_0_1 - 0.00662337662337686*G0_0_1_4_0_2 - 0.00116883116883121*G0_0_1_4_0_3 + 0.00311688311688319*G0_0_1_4_0_4 + 0.000584415584415604*G0_0_1_4_1_0 - 0.0037012987012988*G0_0_1_4_1_1 - 0.00428571428571444*G0_0_1_4_1_2 - 0.00584415584415605*G0_0_1_4_1_3 + 0.0015584415584416*G0_0_1_4_1_4 - 0.00116883116883121*G0_0_1_4_1_5 - 0.00662337662337686*G0_0_1_4_2_0 - 0.00428571428571444*G0_0_1_4_2_1 + 0.0594155844155865*G0_0_1_4_2_2 + 0.0218181818181826*G0_0_1_4_2_3 + 0.0249350649350658*G0_0_1_4_2_4 + 0.00116883116883122*G0_0_1_4_2_5 - 0.00116883116883121*G0_0_1_4_3_0 - 0.00584415584415605*G0_0_1_4_3_1 + 0.0218181818181826*G0_0_1_4_3_2 + 0.0116883116883121*G0_0_1_4_3_3 - 0.000779220779220761*G0_0_1_4_3_4 + 0.00311688311688319*G0_0_1_4_4_0 + 0.0015584415584416*G0_0_1_4_4_1 + 0.0249350649350658*G0_0_1_4_4_2 - 0.000779220779220761*G0_0_1_4_4_3 - 0.0490909090909105*G0_0_1_4_4_4 - 0.00545454545454562*G0_0_1_4_4_5 - 0.00116883116883121*G0_0_1_4_5_1 + 0.00116883116883122*G0_0_1_4_5_2 - 0.00545454545454561*G0_0_1_4_5_4 + 0.00545454545454565*G0_0_1_4_5_5 - 0.000876623376623426*G0_0_1_5_0_0 + 0.00662337662337686*G0_0_1_5_0_1 - 0.000584415584415608*G0_0_1_5_0_2 + 0.00116883116883121*G0_0_1_5_0_3 - 0.00311688311688323*G0_0_1_5_0_5 + 0.00662337662337686*G0_0_1_5_1_0 - 0.0594155844155867*G0_0_1_5_1_1 + 0.00428571428571445*G0_0_1_5_1_2 - 0.0218181818181826*G0_0_1_5_1_3 - 0.00116883116883121*G0_0_1_5_1_4 - 0.0249350649350659*G0_0_1_5_1_5 - 0.000584415584415608*G0_0_1_5_2_0 + 0.00428571428571445*G0_0_1_5_2_1 + 0.00370129870129887*G0_0_1_5_2_2 + 0.00584415584415608*G0_0_1_5_2_3 + 0.00116883116883122*G0_0_1_5_2_4 - 0.00155844155844161*G0_0_1_5_2_5 + 0.00116883116883121*G0_0_1_5_3_0 - 0.0218181818181826*G0_0_1_5_3_1 + 0.00584415584415608*G0_0_1_5_3_2 - 0.0116883116883121*G0_0_1_5_3_3 + 0.000779220779220774*G0_0_1_5_3_5 - 0.00116883116883121*G0_0_1_5_4_1 + 0.00116883116883122*G0_0_1_5_4_2 - 0.00545454545454562*G0_0_1_5_4_4 + 0.00545454545454565*G0_0_1_5_4_5 - 0.00311688311688323*G0_0_1_5_5_0 - 0.0249350649350659*G0_0_1_5_5_1 - 0.00155844155844161*G0_0_1_5_5_2 + 0.000779220779220774*G0_0_1_5_5_3 + 0.00545454545454565*G0_0_1_5_5_4 + 0.0490909090909108*G0_0_1_5_5_5 - 0.00142451298701303*G0_1_0_0_0_1 + 0.00142451298701303*G0_1_0_0_0_2 + 0.00131493506493511*G0_1_0_0_0_4 - 0.0013149350649351*G0_1_0_0_0_5 - 0.00142451298701303*G0_1_0_0_1_0 + 0.0038352272727274*G0_1_0_0_1_1 + 0.00745129870129895*G0_1_0_0_1_3 + 0.00262987012987021*G0_1_0_0_1_4 + 0.00438311688311703*G0_1_0_0_1_5 + 0.00142451298701303*G0_1_0_0_2_0 - 0.00383522727272741*G0_1_0_0_2_2 - 0.00745129870129894*G0_1_0_0_2_3 - 0.00438311688311703*G0_1_0_0_2_4 - 0.00262987012987022*G0_1_0_0_2_5 + 0.00745129870129895*G0_1_0_0_3_1 - 0.00745129870129894*G0_1_0_0_3_2 - 0.00525974025974043*G0_1_0_0_3_4 + 0.00525974025974043*G0_1_0_0_3_5 + 0.00131493506493511*G0_1_0_0_4_0 + 0.00262987012987021*G0_1_0_0_4_1 - 0.00438311688311703*G0_1_0_0_4_2 - 0.00525974025974043*G0_1_0_0_4_3 - 0.00876623376623405*G0_1_0_0_4_4 - 0.0013149350649351*G0_1_0_0_5_0 + 0.00438311688311703*G0_1_0_0_5_1 - 0.00262987012987022*G0_1_0_0_5_2 + 0.00525974025974043*G0_1_0_0_5_3 + 0.00876623376623406*G0_1_0_0_5_5 - 0.00142451298701303*G0_1_0_1_0_0 + 0.0038352272727274*G0_1_0_1_0_1 + 0.00745129870129894*G0_1_0_1_0_3 + 0.00262987012987021*G0_1_0_1_0_4 + 0.00438311688311703*G0_1_0_1_0_5 + 0.0038352272727274*G0_1_0_1_1_0 - 0.0493100649350666*G0_1_0_1_1_1 + 0.00975243506493541*G0_1_0_1_1_2 - 0.0315584415584427*G0_1_0_1_1_3 - 0.000438311688311706*G0_1_0_1_1_4 - 0.0166558441558448*G0_1_0_1_1_5 + 0.00975243506493541*G0_1_0_1_2_1 - 0.00975243506493541*G0_1_0_1_2_2 - 0.00306818181818192*G0_1_0_1_2_4 + 0.00306818181818193*G0_1_0_1_2_5 + 0.00745129870129895*G0_1_0_1_3_0 - 0.0315584415584427*G0_1_0_1_3_1 - 0.0806493506493535*G0_1_0_1_3_3 - 0.0140259740259745*G0_1_0_1_3_4 - 0.0210389610389618*G0_1_0_1_3_5 + 0.00262987012987021*G0_1_0_1_4_0 - 0.000438311688311706*G0_1_0_1_4_1 - 0.00306818181818192*G0_1_0_1_4_2 - 0.0140259740259745*G0_1_0_1_4_3 - 0.00876623376623405*G0_1_0_1_4_4 - 0.00525974025974044*G0_1_0_1_4_5 + 0.00438311688311703*G0_1_0_1_5_0 - 0.0166558441558448*G0_1_0_1_5_1 + 0.00306818181818193*G0_1_0_1_5_2 - 0.0210389610389618*G0_1_0_1_5_3 - 0.00525974025974044*G0_1_0_1_5_4 - 0.0175324675324681*G0_1_0_1_5_5 + 0.00142451298701303*G0_1_0_2_0_0 - 0.00383522727272741*G0_1_0_2_0_2 - 0.00745129870129894*G0_1_0_2_0_3 - 0.00438311688311703*G0_1_0_2_0_4 - 0.00262987012987022*G0_1_0_2_0_5 + 0.00975243506493541*G0_1_0_2_1_1 - 0.00975243506493541*G0_1_0_2_1_2 - 0.00306818181818192*G0_1_0_2_1_4 + 0.00306818181818193*G0_1_0_2_1_5 - 0.00383522727272741*G0_1_0_2_2_0 - 0.00975243506493541*G0_1_0_2_2_1 + 0.0493100649350668*G0_1_0_2_2_2 + 0.0315584415584427*G0_1_0_2_2_3 + 0.0166558441558448*G0_1_0_2_2_4 + 0.000438311688311716*G0_1_0_2_2_5 - 0.00745129870129894*G0_1_0_2_3_0 + 0.0315584415584427*G0_1_0_2_3_2 + 0.0806493506493535*G0_1_0_2_3_3 + 0.0210389610389618*G0_1_0_2_3_4 + 0.0140259740259745*G0_1_0_2_3_5 - 0.00438311688311703*G0_1_0_2_4_0 - 0.00306818181818192*G0_1_0_2_4_1 + 0.0166558441558448*G0_1_0_2_4_2 + 0.0210389610389618*G0_1_0_2_4_3 + 0.0175324675324682*G0_1_0_2_4_4 + 0.00525974025974045*G0_1_0_2_4_5 - 0.00262987012987022*G0_1_0_2_5_0 + 0.00306818181818193*G0_1_0_2_5_1 + 0.000438311688311716*G0_1_0_2_5_2 + 0.0140259740259745*G0_1_0_2_5_3 + 0.00525974025974045*G0_1_0_2_5_4 + 0.00876623376623407*G0_1_0_2_5_5 + 0.00745129870129895*G0_1_0_3_0_1 - 0.00745129870129894*G0_1_0_3_0_2 - 0.00525974025974043*G0_1_0_3_0_4 + 0.00525974025974043*G0_1_0_3_0_5 + 0.00745129870129895*G0_1_0_3_1_0 - 0.0315584415584427*G0_1_0_3_1_1 - 0.0806493506493535*G0_1_0_3_1_3 - 0.0140259740259745*G0_1_0_3_1_4 - 0.0210389610389618*G0_1_0_3_1_5 - 0.00745129870129894*G0_1_0_3_2_0 + 0.0315584415584427*G0_1_0_3_2_2 + 0.0806493506493535*G0_1_0_3_2_3 + 0.0210389610389618*G0_1_0_3_2_4 + 0.0140259740259745*G0_1_0_3_2_5 - 0.0806493506493535*G0_1_0_3_3_1 + 0.0806493506493535*G0_1_0_3_3_2 + 0.028051948051949*G0_1_0_3_3_4 - 0.028051948051949*G0_1_0_3_3_5 - 0.00525974025974043*G0_1_0_3_4_0 - 0.0140259740259745*G0_1_0_3_4_1 + 0.0210389610389618*G0_1_0_3_4_2 + 0.028051948051949*G0_1_0_3_4_3 + 0.028051948051949*G0_1_0_3_4_4 + 0.00525974025974043*G0_1_0_3_5_0 - 0.0210389610389618*G0_1_0_3_5_1 + 0.0140259740259745*G0_1_0_3_5_2 - 0.028051948051949*G0_1_0_3_5_3 - 0.028051948051949*G0_1_0_3_5_5 + 0.00131493506493511*G0_1_0_4_0_0 + 0.00262987012987021*G0_1_0_4_0_1 - 0.00438311688311703*G0_1_0_4_0_2 - 0.00525974025974043*G0_1_0_4_0_3 - 0.00876623376623405*G0_1_0_4_0_4 + 0.00262987012987021*G0_1_0_4_1_0 - 0.000438311688311706*G0_1_0_4_1_1 - 0.00306818181818192*G0_1_0_4_1_2 - 0.0140259740259745*G0_1_0_4_1_3 - 0.00876623376623406*G0_1_0_4_1_4 - 0.00525974025974044*G0_1_0_4_1_5 - 0.00438311688311703*G0_1_0_4_2_0 - 0.00306818181818192*G0_1_0_4_2_1 + 0.0166558441558448*G0_1_0_4_2_2 + 0.0210389610389618*G0_1_0_4_2_3 + 0.0175324675324682*G0_1_0_4_2_4 + 0.00525974025974045*G0_1_0_4_2_5 - 0.00525974025974043*G0_1_0_4_3_0 - 0.0140259740259745*G0_1_0_4_3_1 + 0.0210389610389618*G0_1_0_4_3_2 + 0.028051948051949*G0_1_0_4_3_3 + 0.028051948051949*G0_1_0_4_3_4 - 0.00876623376623405*G0_1_0_4_4_0 - 0.00876623376623406*G0_1_0_4_4_1 + 0.0175324675324682*G0_1_0_4_4_2 + 0.028051948051949*G0_1_0_4_4_3 + 0.0420779220779234*G0_1_0_4_4_4 + 0.00701298701298724*G0_1_0_4_4_5 - 0.00525974025974044*G0_1_0_4_5_1 + 0.00525974025974045*G0_1_0_4_5_2 + 0.00701298701298725*G0_1_0_4_5_4 - 0.00701298701298724*G0_1_0_4_5_5 - 0.0013149350649351*G0_1_0_5_0_0 + 0.00438311688311703*G0_1_0_5_0_1 - 0.00262987012987022*G0_1_0_5_0_2 + 0.00525974025974043*G0_1_0_5_0_3 + 0.00876623376623406*G0_1_0_5_0_5 + 0.00438311688311703*G0_1_0_5_1_0 - 0.0166558441558448*G0_1_0_5_1_1 + 0.00306818181818193*G0_1_0_5_1_2 - 0.0210389610389618*G0_1_0_5_1_3 - 0.00525974025974044*G0_1_0_5_1_4 - 0.0175324675324681*G0_1_0_5_1_5 - 0.00262987012987022*G0_1_0_5_2_0 + 0.00306818181818193*G0_1_0_5_2_1 + 0.000438311688311716*G0_1_0_5_2_2 + 0.0140259740259745*G0_1_0_5_2_3 + 0.00525974025974045*G0_1_0_5_2_4 + 0.00876623376623407*G0_1_0_5_2_5 + 0.00525974025974043*G0_1_0_5_3_0 - 0.0210389610389618*G0_1_0_5_3_1 + 0.0140259740259745*G0_1_0_5_3_2 - 0.028051948051949*G0_1_0_5_3_3 - 0.028051948051949*G0_1_0_5_3_5 - 0.00525974025974044*G0_1_0_5_4_1 + 0.00525974025974045*G0_1_0_5_4_2 + 0.00701298701298725*G0_1_0_5_4_4 - 0.00701298701298724*G0_1_0_5_4_5 + 0.00876623376623406*G0_1_0_5_5_0 - 0.0175324675324681*G0_1_0_5_5_1 + 0.00876623376623407*G0_1_0_5_5_2 - 0.028051948051949*G0_1_0_5_5_3 - 0.00701298701298724*G0_1_0_5_5_4 - 0.0420779220779234*G0_1_0_5_5_5 - 0.00332386363636382*G0_1_1_0_0_0 - 0.00280032467532476*G0_1_1_0_0_1 + 0.00152191558441564*G0_1_1_0_0_2 - 0.00370129870129882*G0_1_1_0_0_3 - 0.00287337662337672*G0_1_1_0_0_4 - 0.0105194805194809*G0_1_1_0_0_5 - 0.00280032467532476*G0_1_1_0_1_0 + 0.0228043831168839*G0_1_1_0_1_1 - 0.00186282467532474*G0_1_1_0_1_2 + 0.0100811688311692*G0_1_1_0_1_3 + 0.000974025974026007*G0_1_1_0_1_4 + 0.0182142857142863*G0_1_1_0_1_5 + 0.00152191558441564*G0_1_1_0_2_0 - 0.00186282467532474*G0_1_1_0_2_1 - 0.00204545454545462*G0_1_1_0_2_2 - 0.00633116883116904*G0_1_1_0_2_3 - 0.00224025974025982*G0_1_1_0_2_4 - 0.00350649350649362*G0_1_1_0_2_5 - 0.00370129870129882*G0_1_1_0_3_0 + 0.0100811688311692*G0_1_1_0_3_1 - 0.00633116883116904*G0_1_1_0_3_2 + 0.0138311688311693*G0_1_1_0_3_3 + 0.00545454545454563*G0_1_1_0_3_4 + 0.0144155844155849*G0_1_1_0_3_5 - 0.00287337662337672*G0_1_1_0_4_0 + 0.000974025974026007*G0_1_1_0_4_1 - 0.00224025974025982*G0_1_1_0_4_2 + 0.00545454545454563*G0_1_1_0_4_3 + 0.00487012987013002*G0_1_1_0_4_4 + 0.00506493506493522*G0_1_1_0_4_5 - 0.0105194805194809*G0_1_1_0_5_0 + 0.0182142857142863*G0_1_1_0_5_1 - 0.00350649350649362*G0_1_1_0_5_2 + 0.0144155844155849*G0_1_1_0_5_3 + 0.00506493506493522*G0_1_1_0_5_4 + 0.0245454545454553*G0_1_1_0_5_5 - 0.00280032467532476*G0_1_1_1_0_0 + 0.0228043831168839*G0_1_1_1_0_1 - 0.00186282467532474*G0_1_1_1_0_2 + 0.0100811688311692*G0_1_1_1_0_3 + 0.000974025974026006*G0_1_1_1_0_4 + 0.0182142857142863*G0_1_1_1_0_5 + 0.0228043831168839*G0_1_1_1_1_0 - 0.305357142857154*G0_1_1_1_1_1 + 0.024119318181819*G0_1_1_1_1_2 - 0.0951623376623411*G0_1_1_1_1_3 - 0.00784090909090933*G0_1_1_1_1_4 - 0.100616883116887*G0_1_1_1_1_5 - 0.00186282467532474*G0_1_1_1_2_0 + 0.024119318181819*G0_1_1_1_2_1 - 0.00954545454545489*G0_1_1_1_2_2 + 0.00876623376623408*G0_1_1_1_2_3 - 0.00136363636363641*G0_1_1_1_2_4 + 0.00881493506493539*G0_1_1_1_2_5 + 0.0100811688311692*G0_1_1_1_3_0 - 0.095162337662341*G0_1_1_1_3_1 + 0.00876623376623408*G0_1_1_1_3_2 - 0.0919480519480552*G0_1_1_1_3_3 - 0.00448051948051964*G0_1_1_1_3_4 - 0.0377922077922092*G0_1_1_1_3_5 + 0.000974025974026007*G0_1_1_1_4_0 - 0.00784090909090933*G0_1_1_1_4_1 - 0.00136363636363641*G0_1_1_1_4_2 - 0.00448051948051964*G0_1_1_1_4_3 + 0.00662337662337683*G0_1_1_1_4_4 - 0.00194805194805201*G0_1_1_1_4_5 + 0.0182142857142863*G0_1_1_1_5_0 - 0.100616883116887*G0_1_1_1_5_1 + 0.00881493506493539*G0_1_1_1_5_2 - 0.0377922077922092*G0_1_1_1_5_3 - 0.00194805194805201*G0_1_1_1_5_4 - 0.0779220779220807*G0_1_1_1_5_5 + 0.00152191558441564*G0_1_1_2_0_0 - 0.00186282467532474*G0_1_1_2_0_1 - 0.00204545454545462*G0_1_1_2_0_2 - 0.00633116883116904*G0_1_1_2_0_3 - 0.00224025974025982*G0_1_1_2_0_4 - 0.00350649350649362*G0_1_1_2_0_5 - 0.00186282467532474*G0_1_1_2_1_0 + 0.024119318181819*G0_1_1_2_1_1 - 0.00954545454545489*G0_1_1_2_1_2 + 0.00876623376623408*G0_1_1_2_1_3 - 0.00136363636363641*G0_1_1_2_1_4 + 0.00881493506493539*G0_1_1_2_1_5 - 0.00204545454545462*G0_1_1_2_2_0 - 0.00954545454545489*G0_1_1_2_2_1 + 0.0426623376623392*G0_1_1_2_2_2 + 0.0230844155844164*G0_1_1_2_2_3 + 0.0090584415584419*G0_1_1_2_2_4 - 0.00214285714285721*G0_1_1_2_2_5 - 0.00633116883116904*G0_1_1_2_3_0 + 0.00876623376623408*G0_1_1_2_3_1 + 0.0230844155844164*G0_1_1_2_3_2 + 0.0707142857142882*G0_1_1_2_3_3 + 0.0153896103896109*G0_1_1_2_3_4 + 0.0169480519480526*G0_1_1_2_3_5 - 0.00224025974025982*G0_1_1_2_4_0 - 0.00136363636363641*G0_1_1_2_4_1 + 0.0090584415584419*G0_1_1_2_4_2 + 0.0153896103896109*G0_1_1_2_4_3 + 0.0107142857142861*G0_1_1_2_4_4 + 0.00701298701298725*G0_1_1_2_4_5 - 0.00350649350649362*G0_1_1_2_5_0 + 0.00881493506493539*G0_1_1_2_5_1 - 0.00214285714285721*G0_1_1_2_5_2 + 0.0169480519480526*G0_1_1_2_5_3 + 0.00701298701298725*G0_1_1_2_5_4 + 0.0194805194805202*G0_1_1_2_5_5 - 0.00370129870129882*G0_1_1_3_0_0 + 0.0100811688311692*G0_1_1_3_0_1 - 0.00633116883116904*G0_1_1_3_0_2 + 0.0138311688311693*G0_1_1_3_0_3 + 0.00545454545454563*G0_1_1_3_0_4 + 0.0144155844155849*G0_1_1_3_0_5 + 0.0100811688311692*G0_1_1_3_1_0 - 0.095162337662341*G0_1_1_3_1_1 + 0.00876623376623408*G0_1_1_3_1_2 - 0.0919480519480552*G0_1_1_3_1_3 - 0.00448051948051964*G0_1_1_3_1_4 - 0.0377922077922092*G0_1_1_3_1_5 - 0.00633116883116904*G0_1_1_3_2_0 + 0.00876623376623408*G0_1_1_3_2_1 + 0.0230844155844164*G0_1_1_3_2_2 + 0.0707142857142882*G0_1_1_3_2_3 + 0.0153896103896109*G0_1_1_3_2_4 + 0.0169480519480526*G0_1_1_3_2_5 + 0.0138311688311693*G0_1_1_3_3_0 - 0.0919480519480552*G0_1_1_3_3_1 + 0.0707142857142882*G0_1_1_3_3_2 - 0.0537662337662356*G0_1_1_3_3_3 - 0.0187012987012993*G0_1_1_3_3_4 - 0.0615584415584437*G0_1_1_3_3_5 + 0.00545454545454563*G0_1_1_3_4_0 - 0.00448051948051964*G0_1_1_3_4_1 + 0.0153896103896109*G0_1_1_3_4_2 - 0.0187012987012993*G0_1_1_3_4_3 - 0.0241558441558449*G0_1_1_3_4_4 - 0.0249350649350658*G0_1_1_3_4_5 + 0.0144155844155849*G0_1_1_3_5_0 - 0.0377922077922092*G0_1_1_3_5_1 + 0.0169480519480526*G0_1_1_3_5_2 - 0.0615584415584437*G0_1_1_3_5_3 - 0.0249350649350658*G0_1_1_3_5_4 - 0.0677922077922102*G0_1_1_3_5_5 - 0.00287337662337672*G0_1_1_4_0_0 + 0.000974025974026007*G0_1_1_4_0_1 - 0.00224025974025982*G0_1_1_4_0_2 + 0.00545454545454563*G0_1_1_4_0_3 + 0.00487012987013002*G0_1_1_4_0_4 + 0.00506493506493522*G0_1_1_4_0_5 + 0.000974025974026007*G0_1_1_4_1_0 - 0.00784090909090933*G0_1_1_4_1_1 - 0.00136363636363641*G0_1_1_4_1_2 - 0.00448051948051964*G0_1_1_4_1_3 + 0.00662337662337683*G0_1_1_4_1_4 - 0.00194805194805201*G0_1_1_4_1_5 - 0.00224025974025982*G0_1_1_4_2_0 - 0.00136363636363641*G0_1_1_4_2_1 + 0.0090584415584419*G0_1_1_4_2_2 + 0.0153896103896109*G0_1_1_4_2_3 + 0.0107142857142861*G0_1_1_4_2_4 + 0.00701298701298725*G0_1_1_4_2_5 + 0.00545454545454563*G0_1_1_4_3_0 - 0.00448051948051964*G0_1_1_4_3_1 + 0.0153896103896109*G0_1_1_4_3_2 - 0.0187012987012993*G0_1_1_4_3_3 - 0.0241558441558449*G0_1_1_4_3_4 - 0.0249350649350658*G0_1_1_4_3_5 + 0.00487012987013002*G0_1_1_4_4_0 + 0.00662337662337683*G0_1_1_4_4_1 + 0.0107142857142861*G0_1_1_4_4_2 - 0.0241558441558449*G0_1_1_4_4_3 - 0.0607792207792226*G0_1_1_4_4_4 - 0.0272727272727282*G0_1_1_4_4_5 + 0.00506493506493522*G0_1_1_4_5_0 - 0.00194805194805201*G0_1_1_4_5_1 + 0.00701298701298725*G0_1_1_4_5_2 - 0.0249350649350658*G0_1_1_4_5_3 - 0.0272727272727282*G0_1_1_4_5_4 - 0.0350649350649362*G0_1_1_4_5_5 - 0.0105194805194809*G0_1_1_5_0_0 + 0.0182142857142863*G0_1_1_5_0_1 - 0.00350649350649362*G0_1_1_5_0_2 + 0.0144155844155849*G0_1_1_5_0_3 + 0.00506493506493522*G0_1_1_5_0_4 + 0.0245454545454553*G0_1_1_5_0_5 + 0.0182142857142863*G0_1_1_5_1_0 - 0.100616883116887*G0_1_1_5_1_1 + 0.00881493506493539*G0_1_1_5_1_2 - 0.0377922077922092*G0_1_1_5_1_3 - 0.00194805194805201*G0_1_1_5_1_4 - 0.0779220779220807*G0_1_1_5_1_5 - 0.00350649350649362*G0_1_1_5_2_0 + 0.00881493506493539*G0_1_1_5_2_1 - 0.00214285714285721*G0_1_1_5_2_2 + 0.0169480519480526*G0_1_1_5_2_3 + 0.00701298701298725*G0_1_1_5_2_4 + 0.0194805194805202*G0_1_1_5_2_5 + 0.0144155844155849*G0_1_1_5_3_0 - 0.0377922077922092*G0_1_1_5_3_1 + 0.0169480519480526*G0_1_1_5_3_2 - 0.0615584415584437*G0_1_1_5_3_3 - 0.0249350649350658*G0_1_1_5_3_4 - 0.0677922077922102*G0_1_1_5_3_5 + 0.00506493506493522*G0_1_1_5_4_0 - 0.00194805194805201*G0_1_1_5_4_1 + 0.00701298701298725*G0_1_1_5_4_2 - 0.0249350649350658*G0_1_1_5_4_3 - 0.0272727272727282*G0_1_1_5_4_4 - 0.0350649350649362*G0_1_1_5_4_5 + 0.0245454545454553*G0_1_1_5_5_0 - 0.0779220779220807*G0_1_1_5_5_1 + 0.0194805194805202*G0_1_1_5_5_2 - 0.0677922077922102*G0_1_1_5_5_3 - 0.0350649350649362*G0_1_1_5_5_4 - 0.236103896103904*G0_1_1_5_5_5; + A[56] = A[65] + 0.00328733766233772*G0_0_1_0_0_0 + 0.000401785714285732*G0_0_1_0_0_1 + 0.000401785714285733*G0_0_1_0_0_2 - 0.00189935064935071*G0_0_1_0_0_3 - 0.0102272727272731*G0_0_1_0_0_4 + 0.000401785714285732*G0_0_1_0_1_0 + 0.000328733766233775*G0_0_1_0_1_1 - 0.000255681818181827*G0_0_1_0_1_2 - 0.00131493506493511*G0_0_1_0_1_3 - 0.0016071428571429*G0_0_1_0_1_4 - 0.0011688311688312*G0_0_1_0_1_5 + 0.000401785714285733*G0_0_1_0_2_0 - 0.000255681818181827*G0_0_1_0_2_1 + 0.000401785714285723*G0_0_1_0_2_2 + 0.000438311688311701*G0_0_1_0_2_3 + 0.00701298701298725*G0_0_1_0_2_4 + 0.000438311688311705*G0_0_1_0_2_5 - 0.00189935064935071*G0_0_1_0_3_0 - 0.00131493506493511*G0_0_1_0_3_1 + 0.000438311688311701*G0_0_1_0_3_2 + 0.00409090909090921*G0_0_1_0_3_3 + 0.00701298701298723*G0_0_1_0_3_4 + 0.00292207792207801*G0_0_1_0_3_5 - 0.0102272727272731*G0_0_1_0_4_0 - 0.0016071428571429*G0_0_1_0_4_1 + 0.00701298701298725*G0_0_1_0_4_2 + 0.00701298701298723*G0_0_1_0_4_3 + 0.00350649350649354*G0_0_1_0_4_4 + 0.0023376623376624*G0_0_1_0_4_5 - 0.0011688311688312*G0_0_1_0_5_1 + 0.000438311688311706*G0_0_1_0_5_2 + 0.00292207792207801*G0_0_1_0_5_3 + 0.0023376623376624*G0_0_1_0_5_4 + 0.0035064935064936*G0_0_1_0_5_5 + 0.000401785714285732*G0_0_1_1_0_0 + 0.000328733766233775*G0_0_1_1_0_1 - 0.000255681818181827*G0_0_1_1_0_2 - 0.00131493506493511*G0_0_1_1_0_3 - 0.0016071428571429*G0_0_1_1_0_4 - 0.0011688311688312*G0_0_1_1_0_5 + 0.000328733766233775*G0_0_1_1_1_0 + 0.00087662337662341*G0_0_1_1_1_1 + 0.000328733766233779*G0_0_1_1_1_2 - 0.00146103896103901*G0_0_1_1_1_3 - 0.00423701298701313*G0_0_1_1_1_4 - 0.00146103896103901*G0_0_1_1_1_5 - 0.000255681818181827*G0_0_1_1_2_0 + 0.000328733766233779*G0_0_1_1_2_1 + 0.000401785714285723*G0_0_1_1_2_2 - 0.00116883116883122*G0_0_1_1_2_3 - 0.00160714285714292*G0_0_1_1_2_4 - 0.00131493506493511*G0_0_1_1_2_5 - 0.00131493506493511*G0_0_1_1_3_0 - 0.00146103896103901*G0_0_1_1_3_1 - 0.00116883116883122*G0_0_1_1_3_2 + 0.00525974025974042*G0_0_1_1_3_3 + 0.0111038961038965*G0_0_1_1_3_4 + 0.00525974025974044*G0_0_1_1_3_5 - 0.0016071428571429*G0_0_1_1_4_0 - 0.00423701298701313*G0_0_1_1_4_1 - 0.00160714285714292*G0_0_1_1_4_2 + 0.0111038961038965*G0_0_1_1_4_3 + 0.0350649350649362*G0_0_1_1_4_4 + 0.0111038961038965*G0_0_1_1_4_5 - 0.0011688311688312*G0_0_1_1_5_0 - 0.00146103896103901*G0_0_1_1_5_1 - 0.00131493506493511*G0_0_1_1_5_2 + 0.00525974025974044*G0_0_1_1_5_3 + 0.0111038961038965*G0_0_1_1_5_4 + 0.00525974025974045*G0_0_1_1_5_5 + 0.000401785714285733*G0_0_1_2_0_0 - 0.000255681818181827*G0_0_1_2_0_1 + 0.000401785714285723*G0_0_1_2_0_2 + 0.000438311688311701*G0_0_1_2_0_3 + 0.00701298701298725*G0_0_1_2_0_4 + 0.000438311688311706*G0_0_1_2_0_5 - 0.000255681818181827*G0_0_1_2_1_0 + 0.000328733766233779*G0_0_1_2_1_1 + 0.000401785714285723*G0_0_1_2_1_2 - 0.00116883116883122*G0_0_1_2_1_3 - 0.00160714285714292*G0_0_1_2_1_4 - 0.00131493506493511*G0_0_1_2_1_5 + 0.000401785714285723*G0_0_1_2_2_0 + 0.000401785714285723*G0_0_1_2_2_1 + 0.00328733766233781*G0_0_1_2_2_2 - 0.010227272727273*G0_0_1_2_2_4 - 0.00189935064935071*G0_0_1_2_2_5 + 0.000438311688311701*G0_0_1_2_3_0 - 0.00116883116883122*G0_0_1_2_3_1 + 0.00350649350649367*G0_0_1_2_3_3 + 0.00233766233766242*G0_0_1_2_3_4 + 0.00292207792207802*G0_0_1_2_3_5 + 0.00701298701298725*G0_0_1_2_4_0 - 0.00160714285714292*G0_0_1_2_4_1 - 0.010227272727273*G0_0_1_2_4_2 + 0.00233766233766242*G0_0_1_2_4_3 + 0.00350649350649365*G0_0_1_2_4_4 + 0.00701298701298725*G0_0_1_2_4_5 + 0.000438311688311706*G0_0_1_2_5_0 - 0.00131493506493511*G0_0_1_2_5_1 - 0.00189935064935071*G0_0_1_2_5_2 + 0.00292207792207802*G0_0_1_2_5_3 + 0.00701298701298725*G0_0_1_2_5_4 + 0.00409090909090923*G0_0_1_2_5_5 - 0.00189935064935071*G0_0_1_3_0_0 - 0.00131493506493511*G0_0_1_3_0_1 + 0.000438311688311701*G0_0_1_3_0_2 + 0.00409090909090921*G0_0_1_3_0_3 + 0.00701298701298723*G0_0_1_3_0_4 + 0.00292207792207801*G0_0_1_3_0_5 - 0.00131493506493511*G0_0_1_3_1_0 - 0.00146103896103901*G0_0_1_3_1_1 - 0.00116883116883122*G0_0_1_3_1_2 + 0.00525974025974042*G0_0_1_3_1_3 + 0.0111038961038965*G0_0_1_3_1_4 + 0.00525974025974044*G0_0_1_3_1_5 + 0.000438311688311701*G0_0_1_3_2_0 - 0.00116883116883122*G0_0_1_3_2_1 + 0.00350649350649367*G0_0_1_3_2_3 + 0.00233766233766242*G0_0_1_3_2_4 + 0.00292207792207802*G0_0_1_3_2_5 + 0.00409090909090921*G0_0_1_3_3_0 + 0.00525974025974042*G0_0_1_3_3_1 + 0.00350649350649367*G0_0_1_3_3_2 - 0.00701298701298705*G0_0_1_3_3_3 - 0.0303896103896114*G0_0_1_3_3_4 - 0.0140259740259745*G0_0_1_3_3_5 + 0.00701298701298723*G0_0_1_3_4_0 + 0.0111038961038965*G0_0_1_3_4_1 + 0.00233766233766242*G0_0_1_3_4_2 - 0.0303896103896114*G0_0_1_3_4_3 - 0.0841558441558469*G0_0_1_3_4_4 - 0.028051948051949*G0_0_1_3_4_5 + 0.00292207792207801*G0_0_1_3_5_0 + 0.00525974025974044*G0_0_1_3_5_1 + 0.00292207792207802*G0_0_1_3_5_2 - 0.0140259740259745*G0_0_1_3_5_3 - 0.028051948051949*G0_0_1_3_5_4 - 0.0140259740259745*G0_0_1_3_5_5 - 0.0102272727272731*G0_0_1_4_0_0 - 0.0016071428571429*G0_0_1_4_0_1 + 0.00701298701298725*G0_0_1_4_0_2 + 0.00701298701298723*G0_0_1_4_0_3 + 0.00350649350649354*G0_0_1_4_0_4 + 0.0023376623376624*G0_0_1_4_0_5 - 0.0016071428571429*G0_0_1_4_1_0 - 0.00423701298701313*G0_0_1_4_1_1 - 0.00160714285714292*G0_0_1_4_1_2 + 0.0111038961038965*G0_0_1_4_1_3 + 0.0350649350649362*G0_0_1_4_1_4 + 0.0111038961038965*G0_0_1_4_1_5 + 0.00701298701298724*G0_0_1_4_2_0 - 0.00160714285714292*G0_0_1_4_2_1 - 0.010227272727273*G0_0_1_4_2_2 + 0.00233766233766242*G0_0_1_4_2_3 + 0.00350649350649365*G0_0_1_4_2_4 + 0.00701298701298725*G0_0_1_4_2_5 + 0.00701298701298723*G0_0_1_4_3_0 + 0.0111038961038965*G0_0_1_4_3_1 + 0.00233766233766242*G0_0_1_4_3_2 - 0.0303896103896114*G0_0_1_4_3_3 - 0.0841558441558469*G0_0_1_4_3_4 - 0.028051948051949*G0_0_1_4_3_5 + 0.00350649350649354*G0_0_1_4_4_0 + 0.0350649350649362*G0_0_1_4_4_1 + 0.00350649350649365*G0_0_1_4_4_2 - 0.0841558441558469*G0_0_1_4_4_3 - 0.490909090909107*G0_0_1_4_4_4 - 0.084155844155847*G0_0_1_4_4_5 + 0.0023376623376624*G0_0_1_4_5_0 + 0.0111038961038965*G0_0_1_4_5_1 + 0.00701298701298725*G0_0_1_4_5_2 - 0.028051948051949*G0_0_1_4_5_3 - 0.084155844155847*G0_0_1_4_5_4 - 0.0303896103896114*G0_0_1_4_5_5 - 0.0011688311688312*G0_0_1_5_0_1 + 0.000438311688311706*G0_0_1_5_0_2 + 0.00292207792207801*G0_0_1_5_0_3 + 0.0023376623376624*G0_0_1_5_0_4 + 0.0035064935064936*G0_0_1_5_0_5 - 0.0011688311688312*G0_0_1_5_1_0 - 0.00146103896103901*G0_0_1_5_1_1 - 0.00131493506493511*G0_0_1_5_1_2 + 0.00525974025974044*G0_0_1_5_1_3 + 0.0111038961038965*G0_0_1_5_1_4 + 0.00525974025974045*G0_0_1_5_1_5 + 0.000438311688311706*G0_0_1_5_2_0 - 0.00131493506493511*G0_0_1_5_2_1 - 0.00189935064935071*G0_0_1_5_2_2 + 0.00292207792207802*G0_0_1_5_2_3 + 0.00701298701298725*G0_0_1_5_2_4 + 0.00409090909090923*G0_0_1_5_2_5 + 0.00292207792207801*G0_0_1_5_3_0 + 0.00525974025974044*G0_0_1_5_3_1 + 0.00292207792207802*G0_0_1_5_3_2 - 0.0140259740259745*G0_0_1_5_3_3 - 0.028051948051949*G0_0_1_5_3_4 - 0.0140259740259745*G0_0_1_5_3_5 + 0.0023376623376624*G0_0_1_5_4_0 + 0.0111038961038965*G0_0_1_5_4_1 + 0.00701298701298725*G0_0_1_5_4_2 - 0.028051948051949*G0_0_1_5_4_3 - 0.084155844155847*G0_0_1_5_4_4 - 0.0303896103896114*G0_0_1_5_4_5 + 0.0035064935064936*G0_0_1_5_5_0 + 0.00525974025974045*G0_0_1_5_5_1 + 0.00409090909090923*G0_0_1_5_5_2 - 0.0140259740259745*G0_0_1_5_5_3 - 0.0303896103896114*G0_0_1_5_5_4 - 0.00701298701298729*G0_0_1_5_5_5 - 0.00328733766233772*G0_1_0_0_0_0 - 0.000401785714285732*G0_1_0_0_0_1 - 0.000401785714285733*G0_1_0_0_0_2 + 0.00189935064935071*G0_1_0_0_0_3 + 0.0102272727272731*G0_1_0_0_0_4 - 0.000401785714285732*G0_1_0_0_1_0 - 0.000328733766233775*G0_1_0_0_1_1 + 0.000255681818181827*G0_1_0_0_1_2 + 0.00131493506493511*G0_1_0_0_1_3 + 0.0016071428571429*G0_1_0_0_1_4 + 0.0011688311688312*G0_1_0_0_1_5 - 0.000401785714285733*G0_1_0_0_2_0 + 0.000255681818181827*G0_1_0_0_2_1 - 0.000401785714285723*G0_1_0_0_2_2 - 0.000438311688311701*G0_1_0_0_2_3 - 0.00701298701298725*G0_1_0_0_2_4 - 0.000438311688311706*G0_1_0_0_2_5 + 0.00189935064935071*G0_1_0_0_3_0 + 0.00131493506493511*G0_1_0_0_3_1 - 0.000438311688311701*G0_1_0_0_3_2 - 0.00409090909090921*G0_1_0_0_3_3 - 0.00701298701298723*G0_1_0_0_3_4 - 0.00292207792207801*G0_1_0_0_3_5 + 0.0102272727272731*G0_1_0_0_4_0 + 0.0016071428571429*G0_1_0_0_4_1 - 0.00701298701298725*G0_1_0_0_4_2 - 0.00701298701298723*G0_1_0_0_4_3 - 0.00350649350649354*G0_1_0_0_4_4 - 0.0023376623376624*G0_1_0_0_4_5 + 0.0011688311688312*G0_1_0_0_5_1 - 0.000438311688311706*G0_1_0_0_5_2 - 0.00292207792207801*G0_1_0_0_5_3 - 0.0023376623376624*G0_1_0_0_5_4 - 0.0035064935064936*G0_1_0_0_5_5 - 0.000401785714285732*G0_1_0_1_0_0 - 0.000328733766233775*G0_1_0_1_0_1 + 0.000255681818181827*G0_1_0_1_0_2 + 0.00131493506493511*G0_1_0_1_0_3 + 0.0016071428571429*G0_1_0_1_0_4 + 0.0011688311688312*G0_1_0_1_0_5 - 0.000328733766233774*G0_1_0_1_1_0 - 0.00087662337662341*G0_1_0_1_1_1 - 0.000328733766233779*G0_1_0_1_1_2 + 0.00146103896103901*G0_1_0_1_1_3 + 0.00423701298701313*G0_1_0_1_1_4 + 0.00146103896103901*G0_1_0_1_1_5 + 0.000255681818181827*G0_1_0_1_2_0 - 0.000328733766233778*G0_1_0_1_2_1 - 0.000401785714285721*G0_1_0_1_2_2 + 0.00116883116883122*G0_1_0_1_2_3 + 0.00160714285714292*G0_1_0_1_2_4 + 0.00131493506493511*G0_1_0_1_2_5 + 0.00131493506493511*G0_1_0_1_3_0 + 0.00146103896103901*G0_1_0_1_3_1 + 0.00116883116883122*G0_1_0_1_3_2 - 0.00525974025974042*G0_1_0_1_3_3 - 0.0111038961038965*G0_1_0_1_3_4 - 0.00525974025974044*G0_1_0_1_3_5 + 0.0016071428571429*G0_1_0_1_4_0 + 0.00423701298701313*G0_1_0_1_4_1 + 0.00160714285714292*G0_1_0_1_4_2 - 0.0111038961038965*G0_1_0_1_4_3 - 0.0350649350649362*G0_1_0_1_4_4 - 0.0111038961038965*G0_1_0_1_4_5 + 0.0011688311688312*G0_1_0_1_5_0 + 0.00146103896103901*G0_1_0_1_5_1 + 0.00131493506493511*G0_1_0_1_5_2 - 0.00525974025974044*G0_1_0_1_5_3 - 0.0111038961038965*G0_1_0_1_5_4 - 0.00525974025974045*G0_1_0_1_5_5 - 0.000401785714285733*G0_1_0_2_0_0 + 0.000255681818181827*G0_1_0_2_0_1 - 0.000401785714285723*G0_1_0_2_0_2 - 0.000438311688311701*G0_1_0_2_0_3 - 0.00701298701298725*G0_1_0_2_0_4 - 0.000438311688311706*G0_1_0_2_0_5 + 0.000255681818181827*G0_1_0_2_1_0 - 0.000328733766233778*G0_1_0_2_1_1 - 0.000401785714285721*G0_1_0_2_1_2 + 0.00116883116883122*G0_1_0_2_1_3 + 0.00160714285714292*G0_1_0_2_1_4 + 0.00131493506493511*G0_1_0_2_1_5 - 0.000401785714285723*G0_1_0_2_2_0 - 0.000401785714285721*G0_1_0_2_2_1 - 0.00328733766233781*G0_1_0_2_2_2 + 0.010227272727273*G0_1_0_2_2_4 + 0.00189935064935071*G0_1_0_2_2_5 - 0.000438311688311701*G0_1_0_2_3_0 + 0.00116883116883122*G0_1_0_2_3_1 - 0.00350649350649367*G0_1_0_2_3_3 - 0.00233766233766242*G0_1_0_2_3_4 - 0.00292207792207802*G0_1_0_2_3_5 - 0.00701298701298725*G0_1_0_2_4_0 + 0.00160714285714292*G0_1_0_2_4_1 + 0.010227272727273*G0_1_0_2_4_2 - 0.00233766233766242*G0_1_0_2_4_3 - 0.00350649350649365*G0_1_0_2_4_4 - 0.00701298701298725*G0_1_0_2_4_5 - 0.000438311688311706*G0_1_0_2_5_0 + 0.00131493506493511*G0_1_0_2_5_1 + 0.00189935064935071*G0_1_0_2_5_2 - 0.00292207792207802*G0_1_0_2_5_3 - 0.00701298701298725*G0_1_0_2_5_4 - 0.00409090909090923*G0_1_0_2_5_5 + 0.00189935064935071*G0_1_0_3_0_0 + 0.00131493506493511*G0_1_0_3_0_1 - 0.000438311688311701*G0_1_0_3_0_2 - 0.00409090909090921*G0_1_0_3_0_3 - 0.00701298701298723*G0_1_0_3_0_4 - 0.00292207792207801*G0_1_0_3_0_5 + 0.00131493506493511*G0_1_0_3_1_0 + 0.00146103896103901*G0_1_0_3_1_1 + 0.00116883116883122*G0_1_0_3_1_2 - 0.00525974025974042*G0_1_0_3_1_3 - 0.0111038961038965*G0_1_0_3_1_4 - 0.00525974025974044*G0_1_0_3_1_5 - 0.000438311688311701*G0_1_0_3_2_0 + 0.00116883116883122*G0_1_0_3_2_1 - 0.00350649350649367*G0_1_0_3_2_3 - 0.00233766233766242*G0_1_0_3_2_4 - 0.00292207792207802*G0_1_0_3_2_5 - 0.00409090909090921*G0_1_0_3_3_0 - 0.00525974025974042*G0_1_0_3_3_1 - 0.00350649350649367*G0_1_0_3_3_2 + 0.00701298701298705*G0_1_0_3_3_3 + 0.0303896103896114*G0_1_0_3_3_4 + 0.0140259740259745*G0_1_0_3_3_5 - 0.00701298701298723*G0_1_0_3_4_0 - 0.0111038961038965*G0_1_0_3_4_1 - 0.00233766233766242*G0_1_0_3_4_2 + 0.0303896103896114*G0_1_0_3_4_3 + 0.0841558441558469*G0_1_0_3_4_4 + 0.028051948051949*G0_1_0_3_4_5 - 0.00292207792207801*G0_1_0_3_5_0 - 0.00525974025974044*G0_1_0_3_5_1 - 0.00292207792207802*G0_1_0_3_5_2 + 0.0140259740259745*G0_1_0_3_5_3 + 0.028051948051949*G0_1_0_3_5_4 + 0.0140259740259745*G0_1_0_3_5_5 + 0.0102272727272731*G0_1_0_4_0_0 + 0.0016071428571429*G0_1_0_4_0_1 - 0.00701298701298725*G0_1_0_4_0_2 - 0.00701298701298723*G0_1_0_4_0_3 - 0.00350649350649354*G0_1_0_4_0_4 - 0.0023376623376624*G0_1_0_4_0_5 + 0.0016071428571429*G0_1_0_4_1_0 + 0.00423701298701313*G0_1_0_4_1_1 + 0.00160714285714292*G0_1_0_4_1_2 - 0.0111038961038965*G0_1_0_4_1_3 - 0.0350649350649362*G0_1_0_4_1_4 - 0.0111038961038965*G0_1_0_4_1_5 - 0.00701298701298724*G0_1_0_4_2_0 + 0.00160714285714292*G0_1_0_4_2_1 + 0.010227272727273*G0_1_0_4_2_2 - 0.00233766233766242*G0_1_0_4_2_3 - 0.00350649350649365*G0_1_0_4_2_4 - 0.00701298701298725*G0_1_0_4_2_5 - 0.00701298701298723*G0_1_0_4_3_0 - 0.0111038961038965*G0_1_0_4_3_1 - 0.00233766233766242*G0_1_0_4_3_2 + 0.0303896103896114*G0_1_0_4_3_3 + 0.0841558441558469*G0_1_0_4_3_4 + 0.028051948051949*G0_1_0_4_3_5 - 0.00350649350649354*G0_1_0_4_4_0 - 0.0350649350649362*G0_1_0_4_4_1 - 0.00350649350649365*G0_1_0_4_4_2 + 0.0841558441558469*G0_1_0_4_4_3 + 0.490909090909107*G0_1_0_4_4_4 + 0.084155844155847*G0_1_0_4_4_5 - 0.0023376623376624*G0_1_0_4_5_0 - 0.0111038961038965*G0_1_0_4_5_1 - 0.00701298701298725*G0_1_0_4_5_2 + 0.028051948051949*G0_1_0_4_5_3 + 0.084155844155847*G0_1_0_4_5_4 + 0.0303896103896114*G0_1_0_4_5_5 + 0.0011688311688312*G0_1_0_5_0_1 - 0.000438311688311706*G0_1_0_5_0_2 - 0.00292207792207801*G0_1_0_5_0_3 - 0.0023376623376624*G0_1_0_5_0_4 - 0.0035064935064936*G0_1_0_5_0_5 + 0.0011688311688312*G0_1_0_5_1_0 + 0.00146103896103901*G0_1_0_5_1_1 + 0.00131493506493511*G0_1_0_5_1_2 - 0.00525974025974044*G0_1_0_5_1_3 - 0.0111038961038965*G0_1_0_5_1_4 - 0.00525974025974045*G0_1_0_5_1_5 - 0.000438311688311706*G0_1_0_5_2_0 + 0.00131493506493511*G0_1_0_5_2_1 + 0.00189935064935071*G0_1_0_5_2_2 - 0.00292207792207802*G0_1_0_5_2_3 - 0.00701298701298725*G0_1_0_5_2_4 - 0.00409090909090923*G0_1_0_5_2_5 - 0.00292207792207801*G0_1_0_5_3_0 - 0.00525974025974044*G0_1_0_5_3_1 - 0.00292207792207802*G0_1_0_5_3_2 + 0.0140259740259745*G0_1_0_5_3_3 + 0.028051948051949*G0_1_0_5_3_4 + 0.0140259740259745*G0_1_0_5_3_5 - 0.0023376623376624*G0_1_0_5_4_0 - 0.0111038961038965*G0_1_0_5_4_1 - 0.00701298701298725*G0_1_0_5_4_2 + 0.028051948051949*G0_1_0_5_4_3 + 0.084155844155847*G0_1_0_5_4_4 + 0.0303896103896114*G0_1_0_5_4_5 - 0.0035064935064936*G0_1_0_5_5_0 - 0.00525974025974045*G0_1_0_5_5_1 - 0.00409090909090924*G0_1_0_5_5_2 + 0.0140259740259745*G0_1_0_5_5_3 + 0.0303896103896114*G0_1_0_5_5_4 + 0.00701298701298729*G0_1_0_5_5_5; + A[54] = -A[56] + 0.0100446428571432*G0_0_1_0_0_0 - 0.000231331168831181*G0_0_1_0_0_1 - 0.00165584415584421*G0_0_1_0_0_3 - 0.00681818181818203*G0_0_1_0_0_4 + 0.00267857142857154*G0_0_1_0_0_5 - 0.000231331168831181*G0_0_1_0_1_0 + 0.000572240259740274*G0_0_1_0_1_1 - 0.00012175324675325*G0_0_1_0_1_2 - 0.00165584415584421*G0_0_1_0_1_3 - 0.00194805194805201*G0_0_1_0_1_4 - 0.00224025974025982*G0_0_1_0_1_5 - 0.00012175324675325*G0_0_1_0_2_1 + 0.00328733766233777*G0_0_1_0_2_2 + 0.000487012987013004*G0_0_1_0_2_3 + 0.00487012987013003*G0_0_1_0_2_4 - 0.000487012987013003*G0_0_1_0_2_5 - 0.00165584415584421*G0_0_1_0_3_0 - 0.00165584415584421*G0_0_1_0_3_1 + 0.000487012987013004*G0_0_1_0_3_2 + 0.000974025974026006*G0_0_1_0_3_3 + 0.00720779220779243*G0_0_1_0_3_4 + 0.00428571428571442*G0_0_1_0_3_5 - 0.00681818181818203*G0_0_1_0_4_0 - 0.00194805194805201*G0_0_1_0_4_1 + 0.00487012987013003*G0_0_1_0_4_2 + 0.00720779220779243*G0_0_1_0_4_3 - 0.00175324675324687*G0_0_1_0_4_4 + 0.00487012987013003*G0_0_1_0_4_5 + 0.00267857142857154*G0_0_1_0_5_0 - 0.00224025974025982*G0_0_1_0_5_1 - 0.000487012987013003*G0_0_1_0_5_2 + 0.00428571428571442*G0_0_1_0_5_3 + 0.00487012987013003*G0_0_1_0_5_4 + 0.00857142857142888*G0_0_1_0_5_5 - 0.000231331168831181*G0_0_1_1_0_0 + 0.000572240259740274*G0_0_1_1_0_1 - 0.00012175324675325*G0_0_1_1_0_2 - 0.00165584415584421*G0_0_1_1_0_3 - 0.00194805194805201*G0_0_1_1_0_4 - 0.00224025974025982*G0_0_1_1_0_5 + 0.000572240259740274*G0_0_1_1_1_0 - 0.000255681818181765*G0_0_1_1_1_1 - 0.000681818181818186*G0_0_1_1_1_3 - 0.00487012987013003*G0_0_1_1_1_4 - 0.00199675324675329*G0_0_1_1_1_5 - 0.00012175324675325*G0_0_1_1_2_0 + 0.00547889610389629*G0_0_1_1_2_2 - 0.000974025974026013*G0_0_1_1_2_3 - 0.00243506493506502*G0_0_1_1_2_4 - 0.00194805194805201*G0_0_1_1_2_5 - 0.00165584415584421*G0_0_1_1_3_0 - 0.000681818181818186*G0_0_1_1_3_1 - 0.000974025974026013*G0_0_1_1_3_2 + 0.00876623376623407*G0_0_1_1_3_3 + 0.0130519480519485*G0_0_1_1_3_4 + 0.00720779220779246*G0_0_1_1_3_5 - 0.00194805194805201*G0_0_1_1_4_0 - 0.00487012987013003*G0_0_1_1_4_1 - 0.00243506493506502*G0_0_1_1_4_2 + 0.0130519480519485*G0_0_1_1_4_3 + 0.0372077922077934*G0_0_1_1_4_4 + 0.0136363636363641*G0_0_1_1_4_5 - 0.00224025974025982*G0_0_1_1_5_0 - 0.00199675324675329*G0_0_1_1_5_1 - 0.00194805194805201*G0_0_1_1_5_2 + 0.00720779220779245*G0_0_1_1_5_3 + 0.0136363636363641*G0_0_1_1_5_4 + 0.00623376623376645*G0_0_1_1_5_5 - 0.00012175324675325*G0_0_1_2_0_1 + 0.00328733766233777*G0_0_1_2_0_2 + 0.000487012987013004*G0_0_1_2_0_3 + 0.00487012987013003*G0_0_1_2_0_4 - 0.000487012987013003*G0_0_1_2_0_5 - 0.00012175324675325*G0_0_1_2_1_0 + 0.00547889610389629*G0_0_1_2_1_2 - 0.000974025974026013*G0_0_1_2_1_3 - 0.00243506493506502*G0_0_1_2_1_4 - 0.00194805194805201*G0_0_1_2_1_5 + 0.00328733766233777*G0_0_1_2_2_0 + 0.00547889610389629*G0_0_1_2_2_1 - 0.0854707792207822*G0_0_1_2_2_2 - 0.0204545454545462*G0_0_1_2_2_3 - 0.0204545454545462*G0_0_1_2_2_4 - 0.00292207792207803*G0_0_1_2_2_5 + 0.000487012987013005*G0_0_1_2_3_0 - 0.000974025974026013*G0_0_1_2_3_1 - 0.0204545454545462*G0_0_1_2_3_2 - 0.00389610389610403*G0_0_1_2_3_3 + 0.00389610389610402*G0_0_1_2_3_4 + 0.00487012987013003*G0_0_1_2_3_5 + 0.00487012987013003*G0_0_1_2_4_0 - 0.00243506493506502*G0_0_1_2_4_1 - 0.0204545454545462*G0_0_1_2_4_2 + 0.00389610389610402*G0_0_1_2_4_3 + 0.0194805194805201*G0_0_1_2_4_4 + 0.0107142857142861*G0_0_1_2_4_5 - 0.000487012987013003*G0_0_1_2_5_0 - 0.00194805194805201*G0_0_1_2_5_1 - 0.00292207792207803*G0_0_1_2_5_2 + 0.00487012987013002*G0_0_1_2_5_3 + 0.0107142857142861*G0_0_1_2_5_4 + 0.00584415584415603*G0_0_1_2_5_5 - 0.00165584415584421*G0_0_1_3_0_0 - 0.00165584415584421*G0_0_1_3_0_1 + 0.000487012987013004*G0_0_1_3_0_2 + 0.000974025974026006*G0_0_1_3_0_3 + 0.00720779220779243*G0_0_1_3_0_4 + 0.00428571428571442*G0_0_1_3_0_5 - 0.00165584415584421*G0_0_1_3_1_0 - 0.000681818181818186*G0_0_1_3_1_1 - 0.000974025974026013*G0_0_1_3_1_2 + 0.00876623376623407*G0_0_1_3_1_3 + 0.0130519480519485*G0_0_1_3_1_4 + 0.00720779220779246*G0_0_1_3_1_5 + 0.000487012987013005*G0_0_1_3_2_0 - 0.000974025974026012*G0_0_1_3_2_1 - 0.0204545454545462*G0_0_1_3_2_2 - 0.00389610389610403*G0_0_1_3_2_3 + 0.00389610389610401*G0_0_1_3_2_4 + 0.00487012987013002*G0_0_1_3_2_5 + 0.000974025974026006*G0_0_1_3_3_0 + 0.00876623376623407*G0_0_1_3_3_1 - 0.00389610389610403*G0_0_1_3_3_2 + 0.0981818181818218*G0_0_1_3_3_3 - 0.0280519480519489*G0_0_1_3_3_4 - 0.011688311688312*G0_0_1_3_3_5 + 0.00720779220779243*G0_0_1_3_4_0 + 0.0130519480519485*G0_0_1_3_4_1 + 0.00389610389610402*G0_0_1_3_4_2 - 0.0280519480519489*G0_0_1_3_4_3 - 0.0888311688311717*G0_0_1_3_4_4 - 0.035844155844157*G0_0_1_3_4_5 + 0.00428571428571442*G0_0_1_3_5_0 + 0.00720779220779246*G0_0_1_3_5_1 + 0.00487012987013003*G0_0_1_3_5_2 - 0.011688311688312*G0_0_1_3_5_3 - 0.035844155844157*G0_0_1_3_5_4 - 0.0202597402597409*G0_0_1_3_5_5 - 0.00681818181818203*G0_0_1_4_0_0 - 0.00194805194805201*G0_0_1_4_0_1 + 0.00487012987013003*G0_0_1_4_0_2 + 0.00720779220779243*G0_0_1_4_0_3 - 0.00175324675324687*G0_0_1_4_0_4 + 0.00487012987013003*G0_0_1_4_0_5 - 0.00194805194805201*G0_0_1_4_1_0 - 0.00487012987013003*G0_0_1_4_1_1 - 0.00243506493506502*G0_0_1_4_1_2 + 0.0130519480519485*G0_0_1_4_1_3 + 0.0372077922077934*G0_0_1_4_1_4 + 0.0136363636363641*G0_0_1_4_1_5 + 0.00487012987013003*G0_0_1_4_2_0 - 0.00243506493506502*G0_0_1_4_2_1 - 0.0204545454545462*G0_0_1_4_2_2 + 0.00389610389610402*G0_0_1_4_2_3 + 0.0194805194805201*G0_0_1_4_2_4 + 0.0107142857142861*G0_0_1_4_2_5 + 0.00720779220779243*G0_0_1_4_3_0 + 0.0130519480519485*G0_0_1_4_3_1 + 0.00389610389610401*G0_0_1_4_3_2 - 0.0280519480519489*G0_0_1_4_3_3 - 0.0888311688311717*G0_0_1_4_3_4 - 0.035844155844157*G0_0_1_4_3_5 - 0.00175324675324687*G0_0_1_4_4_0 + 0.0372077922077934*G0_0_1_4_4_1 + 0.0194805194805201*G0_0_1_4_4_2 - 0.0888311688311717*G0_0_1_4_4_3 - 0.448831168831183*G0_0_1_4_4_4 - 0.095844155844159*G0_0_1_4_4_5 + 0.00487012987013003*G0_0_1_4_5_0 + 0.0136363636363641*G0_0_1_4_5_1 + 0.0107142857142861*G0_0_1_4_5_2 - 0.035844155844157*G0_0_1_4_5_3 - 0.095844155844159*G0_0_1_4_5_4 - 0.0389610389610403*G0_0_1_4_5_5 + 0.00267857142857154*G0_0_1_5_0_0 - 0.00224025974025982*G0_0_1_5_0_1 - 0.000487012987013003*G0_0_1_5_0_2 + 0.00428571428571442*G0_0_1_5_0_3 + 0.00487012987013003*G0_0_1_5_0_4 + 0.00857142857142887*G0_0_1_5_0_5 - 0.00224025974025982*G0_0_1_5_1_0 - 0.00199675324675329*G0_0_1_5_1_1 - 0.00194805194805201*G0_0_1_5_1_2 + 0.00720779220779246*G0_0_1_5_1_3 + 0.0136363636363641*G0_0_1_5_1_4 + 0.00623376623376646*G0_0_1_5_1_5 - 0.000487012987013003*G0_0_1_5_2_0 - 0.00194805194805201*G0_0_1_5_2_1 - 0.00292207792207803*G0_0_1_5_2_2 + 0.00487012987013003*G0_0_1_5_2_3 + 0.0107142857142861*G0_0_1_5_2_4 + 0.00584415584415603*G0_0_1_5_2_5 + 0.00428571428571442*G0_0_1_5_3_0 + 0.00720779220779246*G0_0_1_5_3_1 + 0.00487012987013003*G0_0_1_5_3_2 - 0.011688311688312*G0_0_1_5_3_3 - 0.035844155844157*G0_0_1_5_3_4 - 0.0202597402597409*G0_0_1_5_3_5 + 0.00487012987013003*G0_0_1_5_4_0 + 0.0136363636363641*G0_0_1_5_4_1 + 0.0107142857142861*G0_0_1_5_4_2 - 0.035844155844157*G0_0_1_5_4_3 - 0.095844155844159*G0_0_1_5_4_4 - 0.0389610389610403*G0_0_1_5_4_5 + 0.00857142857142888*G0_0_1_5_5_0 + 0.00623376623376645*G0_0_1_5_5_1 + 0.00584415584415603*G0_0_1_5_5_2 - 0.0202597402597409*G0_0_1_5_5_3 - 0.0389610389610403*G0_0_1_5_5_4 - 0.109760551948056*G0_1_1_0_0_0 + 0.00976461038961073*G0_1_1_0_0_1 + 0.00451704545454562*G0_1_1_0_0_2 - 0.00375000000000011*G0_1_1_0_0_3 - 0.0224025974025982*G0_1_1_0_0_4 - 0.0431006493506509*G0_1_1_0_0_5 + 0.00976461038961073*G0_1_1_0_1_0 - 0.00152191558441564*G0_1_1_0_1_1 - 0.000560064935064955*G0_1_1_0_1_2 - 0.00175324675324681*G0_1_1_0_1_3 - 0.000925324675324697*G0_1_1_0_1_4 + 0.00584415584415606*G0_1_1_0_1_5 + 0.00451704545454562*G0_1_1_0_2_0 - 0.000560064935064955*G0_1_1_0_2_1 + 0.00304383116883127*G0_1_1_0_2_2 + 0.000243506493506502*G0_1_1_0_2_3 + 0.00340909090909103*G0_1_1_0_2_4 + 0.00180194805194812*G0_1_1_0_2_5 - 0.00375000000000011*G0_1_1_0_3_0 - 0.00175324675324681*G0_1_1_0_3_1 + 0.000243506493506503*G0_1_1_0_3_2 + 0.00487012987013002*G0_1_1_0_3_3 + 0.00935064935064964*G0_1_1_0_3_4 + 0.00389610389610402*G0_1_1_0_3_5 - 0.0224025974025982*G0_1_1_0_4_0 - 0.000925324675324697*G0_1_1_0_4_1 + 0.00340909090909103*G0_1_1_0_4_2 + 0.00935064935064964*G0_1_1_0_4_3 + 0.010714285714286*G0_1_1_0_4_4 - 0.00175324675324684*G0_1_1_0_4_5 - 0.0431006493506509*G0_1_1_0_5_0 + 0.00584415584415606*G0_1_1_0_5_1 + 0.00180194805194812*G0_1_1_0_5_2 + 0.00389610389610402*G0_1_1_0_5_3 - 0.00175324675324684*G0_1_1_0_5_4 - 0.0374025974025988*G0_1_1_0_5_5 + 0.00976461038961073*G0_1_1_1_0_0 - 0.00152191558441564*G0_1_1_1_0_1 - 0.000560064935064955*G0_1_1_1_0_2 - 0.00175324675324681*G0_1_1_1_0_3 - 0.000925324675324697*G0_1_1_1_0_4 + 0.00584415584415606*G0_1_1_1_0_5 - 0.00152191558441564*G0_1_1_1_1_0 + 0.00372564935064949*G0_1_1_1_1_1 - 0.000206980519480527*G0_1_1_1_1_2 - 0.000438311688311692*G0_1_1_1_1_3 - 0.00438311688311703*G0_1_1_1_1_4 - 0.00199675324675331*G0_1_1_1_1_5 - 0.000560064935064955*G0_1_1_1_2_0 - 0.000206980519480528*G0_1_1_1_2_1 + 0.00511363636363653*G0_1_1_1_2_2 - 0.000487012987013006*G0_1_1_1_2_3 - 0.00121753246753251*G0_1_1_1_2_4 - 0.00224025974025982*G0_1_1_1_2_5 - 0.00175324675324681*G0_1_1_1_3_0 - 0.000438311688311691*G0_1_1_1_3_1 - 0.000487012987013006*G0_1_1_1_3_2 + 0.00974025974026006*G0_1_1_1_3_3 + 0.0122727272727277*G0_1_1_1_3_4 + 0.00798701298701325*G0_1_1_1_3_5 - 0.000925324675324697*G0_1_1_1_4_0 - 0.00438311688311703*G0_1_1_1_4_1 - 0.00121753246753251*G0_1_1_1_4_2 + 0.0122727272727277*G0_1_1_1_4_3 + 0.0292207792207802*G0_1_1_1_4_4 + 0.0132467532467537*G0_1_1_1_4_5 + 0.00584415584415606*G0_1_1_1_5_0 - 0.00199675324675331*G0_1_1_1_5_1 - 0.00224025974025982*G0_1_1_1_5_2 + 0.00798701298701325*G0_1_1_1_5_3 + 0.0132467532467537*G0_1_1_1_5_4 + 0.0237662337662346*G0_1_1_1_5_5 + 0.00451704545454562*G0_1_1_2_0_0 - 0.000560064935064955*G0_1_1_2_0_1 + 0.00304383116883127*G0_1_1_2_0_2 + 0.000243506493506502*G0_1_1_2_0_3 + 0.00340909090909103*G0_1_1_2_0_4 + 0.00180194805194812*G0_1_1_2_0_5 - 0.000560064935064955*G0_1_1_2_1_0 - 0.000206980519480528*G0_1_1_2_1_1 + 0.00511363636363653*G0_1_1_2_1_2 - 0.000487012987013005*G0_1_1_2_1_3 - 0.00121753246753251*G0_1_1_2_1_4 - 0.00224025974025982*G0_1_1_2_1_5 + 0.00304383116883127*G0_1_1_2_2_0 + 0.00511363636363653*G0_1_1_2_2_1 - 0.0814529220779249*G0_1_1_2_2_2 - 0.0197240259740266*G0_1_1_2_2_3 - 0.0168019480519486*G0_1_1_2_2_4 - 0.00267857142857153*G0_1_1_2_2_5 + 0.000243506493506502*G0_1_1_2_3_0 - 0.000487012987013006*G0_1_1_2_3_1 - 0.0197240259740266*G0_1_1_2_3_2 - 0.00292207792207802*G0_1_1_2_3_3 + 0.001948051948052*G0_1_1_2_3_4 + 0.00487012987013003*G0_1_1_2_3_5 + 0.00340909090909103*G0_1_1_2_4_0 - 0.00121753246753251*G0_1_1_2_4_1 - 0.0168019480519486*G0_1_1_2_4_2 + 0.001948051948052*G0_1_1_2_4_3 + 0.00487012987013001*G0_1_1_2_4_4 + 0.00779220779220805*G0_1_1_2_4_5 + 0.00180194805194812*G0_1_1_2_5_0 - 0.00224025974025982*G0_1_1_2_5_1 - 0.00267857142857153*G0_1_1_2_5_2 + 0.00487012987013003*G0_1_1_2_5_3 + 0.00779220779220805*G0_1_1_2_5_4 + 0.00974025974026008*G0_1_1_2_5_5 - 0.00375000000000011*G0_1_1_3_0_0 - 0.00175324675324681*G0_1_1_3_0_1 + 0.000243506493506503*G0_1_1_3_0_2 + 0.00487012987013002*G0_1_1_3_0_3 + 0.00935064935064964*G0_1_1_3_0_4 + 0.00389610389610402*G0_1_1_3_0_5 - 0.00175324675324681*G0_1_1_3_1_0 - 0.000438311688311691*G0_1_1_3_1_1 - 0.000487012987013006*G0_1_1_3_1_2 + 0.00974025974026006*G0_1_1_3_1_3 + 0.0122727272727277*G0_1_1_3_1_4 + 0.00798701298701325*G0_1_1_3_1_5 + 0.000243506493506503*G0_1_1_3_2_0 - 0.000487012987013006*G0_1_1_3_2_1 - 0.0197240259740266*G0_1_1_3_2_2 - 0.00292207792207802*G0_1_1_3_2_3 + 0.001948051948052*G0_1_1_3_2_4 + 0.00487012987013003*G0_1_1_3_2_5 + 0.00487012987013002*G0_1_1_3_3_0 + 0.00974025974026006*G0_1_1_3_3_1 - 0.00292207792207802*G0_1_1_3_3_2 + 0.0677922077922104*G0_1_1_3_3_3 - 0.0342857142857153*G0_1_1_3_3_4 - 0.0194805194805201*G0_1_1_3_3_5 + 0.00935064935064964*G0_1_1_3_4_0 + 0.0122727272727277*G0_1_1_3_4_1 + 0.001948051948052*G0_1_1_3_4_2 - 0.0342857142857153*G0_1_1_3_4_3 - 0.0771428571428596*G0_1_1_3_4_4 - 0.0342857142857154*G0_1_1_3_4_5 + 0.00389610389610402*G0_1_1_3_5_0 + 0.00798701298701325*G0_1_1_3_5_1 + 0.00487012987013003*G0_1_1_3_5_2 - 0.0194805194805201*G0_1_1_3_5_3 - 0.0342857142857154*G0_1_1_3_5_4 - 0.0272727272727282*G0_1_1_3_5_5 - 0.0224025974025982*G0_1_1_4_0_0 - 0.000925324675324697*G0_1_1_4_0_1 + 0.00340909090909103*G0_1_1_4_0_2 + 0.00935064935064964*G0_1_1_4_0_3 + 0.010714285714286*G0_1_1_4_0_4 - 0.00175324675324684*G0_1_1_4_0_5 - 0.000925324675324697*G0_1_1_4_1_0 - 0.00438311688311703*G0_1_1_4_1_1 - 0.00121753246753251*G0_1_1_4_1_2 + 0.0122727272727277*G0_1_1_4_1_3 + 0.0292207792207802*G0_1_1_4_1_4 + 0.0132467532467537*G0_1_1_4_1_5 + 0.00340909090909103*G0_1_1_4_2_0 - 0.00121753246753251*G0_1_1_4_2_1 - 0.0168019480519486*G0_1_1_4_2_2 + 0.001948051948052*G0_1_1_4_2_3 + 0.00487012987013001*G0_1_1_4_2_4 + 0.00779220779220805*G0_1_1_4_2_5 + 0.00935064935064964*G0_1_1_4_3_0 + 0.0122727272727277*G0_1_1_4_3_1 + 0.001948051948052*G0_1_1_4_3_2 - 0.0342857142857153*G0_1_1_4_3_3 - 0.0771428571428596*G0_1_1_4_3_4 - 0.0342857142857154*G0_1_1_4_3_5 + 0.010714285714286*G0_1_1_4_4_0 + 0.0292207792207802*G0_1_1_4_4_1 + 0.00487012987013001*G0_1_1_4_4_2 - 0.0771428571428596*G0_1_1_4_4_3 - 0.317922077922088*G0_1_1_4_4_4 - 0.0740259740259765*G0_1_1_4_4_5 - 0.00175324675324684*G0_1_1_4_5_0 + 0.0132467532467537*G0_1_1_4_5_1 + 0.00779220779220805*G0_1_1_4_5_2 - 0.0342857142857154*G0_1_1_4_5_3 - 0.0740259740259765*G0_1_1_4_5_4 - 0.0459740259740275*G0_1_1_4_5_5 - 0.0431006493506509*G0_1_1_5_0_0 + 0.00584415584415606*G0_1_1_5_0_1 + 0.00180194805194812*G0_1_1_5_0_2 + 0.00389610389610401*G0_1_1_5_0_3 - 0.00175324675324684*G0_1_1_5_0_4 - 0.0374025974025988*G0_1_1_5_0_5 + 0.00584415584415606*G0_1_1_5_1_0 - 0.00199675324675331*G0_1_1_5_1_1 - 0.00224025974025982*G0_1_1_5_1_2 + 0.00798701298701325*G0_1_1_5_1_3 + 0.0132467532467537*G0_1_1_5_1_4 + 0.0237662337662346*G0_1_1_5_1_5 + 0.00180194805194812*G0_1_1_5_2_0 - 0.00224025974025982*G0_1_1_5_2_1 - 0.00267857142857153*G0_1_1_5_2_2 + 0.00487012987013003*G0_1_1_5_2_3 + 0.00779220779220805*G0_1_1_5_2_4 + 0.00974025974026008*G0_1_1_5_2_5 + 0.00389610389610402*G0_1_1_5_3_0 + 0.00798701298701325*G0_1_1_5_3_1 + 0.00487012987013003*G0_1_1_5_3_2 - 0.0194805194805201*G0_1_1_5_3_3 - 0.0342857142857154*G0_1_1_5_3_4 - 0.0272727272727282*G0_1_1_5_3_5 - 0.00175324675324684*G0_1_1_5_4_0 + 0.0132467532467537*G0_1_1_5_4_1 + 0.00779220779220805*G0_1_1_5_4_2 - 0.0342857142857154*G0_1_1_5_4_3 - 0.0740259740259765*G0_1_1_5_4_4 - 0.0459740259740275*G0_1_1_5_4_5 - 0.0374025974025988*G0_1_1_5_5_0 + 0.0237662337662346*G0_1_1_5_5_1 + 0.00974025974026008*G0_1_1_5_5_2 - 0.0272727272727282*G0_1_1_5_5_3 - 0.0459740259740275*G0_1_1_5_5_4 - 0.128571428571433*G0_1_1_5_5_5; + A[77] = A[55] + 0.201623376623383*G0_0_0_0_0_0 - 0.00827922077922104*G0_0_0_0_0_1 - 0.0114448051948056*G0_0_0_0_0_2 + 0.00146103896103898*G0_0_0_0_0_3 + 0.0423701298701312*G0_0_0_0_0_4 + 0.0394480519480533*G0_0_0_0_0_5 - 0.00827922077922103*G0_0_0_0_1_0 - 0.00163149350649356*G0_0_0_0_1_1 + 0.000243506493506502*G0_0_0_0_1_2 - 0.00214285714285721*G0_0_0_0_1_3 - 0.00243506493506501*G0_0_0_0_1_4 - 0.00584415584415605*G0_0_0_0_1_5 - 0.0114448051948056*G0_0_0_0_2_0 + 0.000243506493506502*G0_0_0_0_2_1 + 0.00309253246753257*G0_0_0_0_2_2 + 0.00262987012987021*G0_0_0_0_2_3 + 0.000974025974026013*G0_0_0_0_2_4 + 0.000487012987013003*G0_0_0_0_2_5 + 0.00146103896103898*G0_0_0_0_3_0 - 0.00214285714285721*G0_0_0_0_3_1 + 0.00262987012987021*G0_0_0_0_3_2 + 0.001948051948052*G0_0_0_0_3_4 - 0.00389610389610403*G0_0_0_0_3_5 + 0.0423701298701312*G0_0_0_0_4_0 - 0.00243506493506501*G0_0_0_0_4_1 + 0.000974025974026014*G0_0_0_0_4_2 + 0.001948051948052*G0_0_0_0_4_3 + 0.017532467532468*G0_0_0_0_4_4 + 0.00389610389610402*G0_0_0_0_4_5 + 0.0394480519480533*G0_0_0_0_5_0 - 0.00584415584415605*G0_0_0_0_5_1 + 0.000487012987013003*G0_0_0_0_5_2 - 0.00389610389610403*G0_0_0_0_5_3 + 0.00389610389610402*G0_0_0_0_5_4 - 0.00194805194805198*G0_0_0_0_5_5 - 0.00827922077922103*G0_0_0_1_0_0 - 0.00163149350649356*G0_0_0_1_0_1 + 0.000243506493506502*G0_0_0_1_0_2 - 0.00214285714285721*G0_0_0_1_0_3 - 0.00243506493506501*G0_0_0_1_0_4 - 0.00584415584415605*G0_0_0_1_0_5 - 0.00163149350649356*G0_0_0_1_1_0 + 0.0523782467532485*G0_0_0_1_1_1 - 0.00487012987013003*G0_0_0_1_1_2 + 0.0175324675324681*G0_0_0_1_1_3 - 0.00292207792207802*G0_0_0_1_1_4 + 0.0102272727272731*G0_0_0_1_1_5 + 0.000243506493506502*G0_0_0_1_2_0 - 0.00487012987013003*G0_0_0_1_2_1 + 0.00601461038961059*G0_0_0_1_2_2 - 0.000194805194805203*G0_0_0_1_2_3 - 0.00146103896103901*G0_0_0_1_2_4 - 0.00214285714285722*G0_0_0_1_2_5 - 0.00214285714285721*G0_0_0_1_3_0 + 0.0175324675324681*G0_0_0_1_3_1 - 0.000194805194805203*G0_0_0_1_3_2 + 0.0303896103896114*G0_0_0_1_3_3 + 0.0101298701298705*G0_0_0_1_3_4 + 0.00857142857142888*G0_0_0_1_3_5 - 0.00243506493506501*G0_0_0_1_4_0 - 0.00292207792207802*G0_0_0_1_4_1 - 0.00146103896103901*G0_0_0_1_4_2 + 0.0101298701298705*G0_0_0_1_4_3 + 0.0315584415584426*G0_0_0_1_4_4 + 0.0101298701298705*G0_0_0_1_4_5 - 0.00584415584415605*G0_0_0_1_5_0 + 0.0102272727272731*G0_0_0_1_5_1 - 0.00214285714285722*G0_0_0_1_5_2 + 0.00857142857142888*G0_0_0_1_5_3 + 0.0101298701298705*G0_0_0_1_5_4 + 0.014415584415585*G0_0_0_1_5_5 - 0.0114448051948056*G0_0_0_2_0_0 + 0.000243506493506502*G0_0_0_2_0_1 + 0.00309253246753257*G0_0_0_2_0_2 + 0.00262987012987021*G0_0_0_2_0_3 + 0.000974025974026013*G0_0_0_2_0_4 + 0.000487012987013004*G0_0_0_2_0_5 + 0.000243506493506502*G0_0_0_2_1_0 - 0.00487012987013003*G0_0_0_2_1_1 + 0.00601461038961059*G0_0_0_2_1_2 - 0.000194805194805204*G0_0_0_2_1_3 - 0.00146103896103901*G0_0_0_2_1_4 - 0.00214285714285722*G0_0_0_2_1_5 + 0.00309253246753257*G0_0_0_2_2_0 + 0.00601461038961059*G0_0_0_2_2_1 - 0.0559577922077941*G0_0_0_2_2_2 - 0.021233766233767*G0_0_0_2_2_3 - 0.0148051948051953*G0_0_0_2_2_4 - 0.000681818181818215*G0_0_0_2_2_5 + 0.00262987012987021*G0_0_0_2_3_0 - 0.000194805194805204*G0_0_0_2_3_1 - 0.021233766233767*G0_0_0_2_3_2 - 0.0296103896103906*G0_0_0_2_3_3 - 0.00233766233766241*G0_0_0_2_3_4 - 0.00389610389610403*G0_0_0_2_3_5 + 0.000974025974026016*G0_0_0_2_4_0 - 0.00146103896103901*G0_0_0_2_4_1 - 0.0148051948051953*G0_0_0_2_4_2 - 0.00233766233766241*G0_0_0_2_4_3 + 0.0101298701298705*G0_0_0_2_4_4 + 0.00428571428571443*G0_0_0_2_4_5 + 0.000487012987013004*G0_0_0_2_5_0 - 0.00214285714285722*G0_0_0_2_5_1 - 0.000681818181818215*G0_0_0_2_5_2 - 0.00389610389610403*G0_0_0_2_5_3 + 0.00428571428571443*G0_0_0_2_5_4 - 0.0109090909090913*G0_0_0_2_5_5 + 0.00146103896103898*G0_0_0_3_0_0 - 0.00214285714285721*G0_0_0_3_0_1 + 0.00262987012987021*G0_0_0_3_0_2 + 0.001948051948052*G0_0_0_3_0_4 - 0.00389610389610403*G0_0_0_3_0_5 - 0.00214285714285721*G0_0_0_3_1_0 + 0.0175324675324681*G0_0_0_3_1_1 - 0.000194805194805203*G0_0_0_3_1_2 + 0.0303896103896114*G0_0_0_3_1_3 + 0.0101298701298705*G0_0_0_3_1_4 + 0.00857142857142888*G0_0_0_3_1_5 + 0.00262987012987021*G0_0_0_3_2_0 - 0.000194805194805203*G0_0_0_3_2_1 - 0.021233766233767*G0_0_0_3_2_2 - 0.0296103896103906*G0_0_0_3_2_3 - 0.00233766233766241*G0_0_0_3_2_4 - 0.00389610389610403*G0_0_0_3_2_5 + 0.0303896103896114*G0_0_0_3_3_1 - 0.0296103896103906*G0_0_0_3_3_2 - 0.0140259740259745*G0_0_0_3_3_3 - 0.0202597402597409*G0_0_0_3_3_4 + 0.00779220779220805*G0_0_0_3_3_5 + 0.001948051948052*G0_0_0_3_4_0 + 0.0101298701298705*G0_0_0_3_4_1 - 0.00233766233766241*G0_0_0_3_4_2 - 0.0202597402597409*G0_0_0_3_4_3 - 0.0670129870129892*G0_0_0_3_4_4 - 0.0124675324675329*G0_0_0_3_4_5 - 0.00389610389610403*G0_0_0_3_5_0 + 0.00857142857142888*G0_0_0_3_5_1 - 0.00389610389610403*G0_0_0_3_5_2 + 0.00779220779220804*G0_0_0_3_5_3 - 0.0124675324675329*G0_0_0_3_5_4 + 0.0296103896103906*G0_0_0_3_5_5 + 0.0423701298701312*G0_0_0_4_0_0 - 0.00243506493506501*G0_0_0_4_0_1 + 0.000974025974026014*G0_0_0_4_0_2 + 0.001948051948052*G0_0_0_4_0_3 + 0.017532467532468*G0_0_0_4_0_4 + 0.00389610389610402*G0_0_0_4_0_5 - 0.00243506493506501*G0_0_0_4_1_0 - 0.00292207792207802*G0_0_0_4_1_1 - 0.00146103896103901*G0_0_0_4_1_2 + 0.0101298701298705*G0_0_0_4_1_3 + 0.0315584415584426*G0_0_0_4_1_4 + 0.0101298701298705*G0_0_0_4_1_5 + 0.000974025974026014*G0_0_0_4_2_0 - 0.00146103896103901*G0_0_0_4_2_1 - 0.0148051948051953*G0_0_0_4_2_2 - 0.00233766233766241*G0_0_0_4_2_3 + 0.0101298701298705*G0_0_0_4_2_4 + 0.00428571428571443*G0_0_0_4_2_5 + 0.001948051948052*G0_0_0_4_3_0 + 0.0101298701298705*G0_0_0_4_3_1 - 0.00233766233766241*G0_0_0_4_3_2 - 0.0202597402597409*G0_0_0_4_3_3 - 0.0670129870129892*G0_0_0_4_3_4 - 0.0124675324675329*G0_0_0_4_3_5 + 0.017532467532468*G0_0_0_4_4_0 + 0.0315584415584426*G0_0_0_4_4_1 + 0.0101298701298705*G0_0_0_4_4_2 - 0.0670129870129892*G0_0_0_4_4_3 - 0.434805194805209*G0_0_0_4_4_4 - 0.0716883116883141*G0_0_0_4_4_5 + 0.00389610389610402*G0_0_0_4_5_0 + 0.0101298701298705*G0_0_0_4_5_1 + 0.00428571428571443*G0_0_0_4_5_2 - 0.0124675324675329*G0_0_0_4_5_3 - 0.071688311688314*G0_0_0_4_5_4 + 0.00155844155844154*G0_0_0_4_5_5 + 0.0394480519480533*G0_0_0_5_0_0 - 0.00584415584415605*G0_0_0_5_0_1 + 0.000487012987013004*G0_0_0_5_0_2 - 0.00389610389610403*G0_0_0_5_0_3 + 0.00389610389610402*G0_0_0_5_0_4 - 0.00194805194805197*G0_0_0_5_0_5 - 0.00584415584415605*G0_0_0_5_1_0 + 0.0102272727272731*G0_0_0_5_1_1 - 0.00214285714285722*G0_0_0_5_1_2 + 0.00857142857142889*G0_0_0_5_1_3 + 0.0101298701298705*G0_0_0_5_1_4 + 0.014415584415585*G0_0_0_5_1_5 + 0.000487012987013003*G0_0_0_5_2_0 - 0.00214285714285722*G0_0_0_5_2_1 - 0.000681818181818215*G0_0_0_5_2_2 - 0.00389610389610403*G0_0_0_5_2_3 + 0.00428571428571443*G0_0_0_5_2_4 - 0.0109090909090913*G0_0_0_5_2_5 - 0.00389610389610403*G0_0_0_5_3_0 + 0.00857142857142888*G0_0_0_5_3_1 - 0.00389610389610403*G0_0_0_5_3_2 + 0.00779220779220805*G0_0_0_5_3_3 - 0.0124675324675329*G0_0_0_5_3_4 + 0.0296103896103906*G0_0_0_5_3_5 + 0.00389610389610402*G0_0_0_5_4_0 + 0.0101298701298705*G0_0_0_5_4_1 + 0.00428571428571443*G0_0_0_5_4_2 - 0.0124675324675329*G0_0_0_5_4_3 - 0.0716883116883141*G0_0_0_5_4_4 + 0.00155844155844154*G0_0_0_5_4_5 - 0.00194805194805198*G0_0_0_5_5_0 + 0.014415584415585*G0_0_0_5_5_1 - 0.0109090909090913*G0_0_0_5_5_2 + 0.0296103896103906*G0_0_0_5_5_3 + 0.00155844155844155*G0_0_0_5_5_4 + 0.224415584415592*G0_0_0_5_5_5 + 0.00158279220779226*G0_0_1_0_0_1 - 0.00158279220779226*G0_0_1_0_0_2 + 0.00146103896103902*G0_0_1_0_0_4 - 0.00146103896103901*G0_0_1_0_0_5 + 0.00158279220779226*G0_0_1_0_1_0 - 0.00236201298701306*G0_0_1_0_1_1 - 0.00238636363636371*G0_0_1_0_1_3 - 0.00146103896103901*G0_0_1_0_1_4 - 0.00340909090909104*G0_0_1_0_1_5 - 0.00158279220779226*G0_0_1_0_2_0 + 0.00236201298701307*G0_0_1_0_2_2 + 0.00238636363636371*G0_0_1_0_2_3 + 0.00340909090909102*G0_0_1_0_2_4 + 0.001461038961039*G0_0_1_0_2_5 - 0.00238636363636371*G0_0_1_0_3_1 + 0.00238636363636371*G0_0_1_0_3_2 + 0.00292207792207802*G0_0_1_0_3_4 - 0.00292207792207801*G0_0_1_0_3_5 + 0.00146103896103902*G0_0_1_0_4_0 - 0.00146103896103901*G0_0_1_0_4_1 + 0.00340909090909102*G0_0_1_0_4_2 + 0.00292207792207802*G0_0_1_0_4_3 + 0.00974025974026003*G0_0_1_0_4_4 - 0.001461038961039*G0_0_1_0_5_0 - 0.00340909090909104*G0_0_1_0_5_1 + 0.001461038961039*G0_0_1_0_5_2 - 0.00292207792207801*G0_0_1_0_5_3 - 0.00974025974025997*G0_0_1_0_5_5 + 0.00158279220779226*G0_0_1_1_0_0 - 0.00236201298701306*G0_0_1_1_0_1 - 0.00238636363636371*G0_0_1_1_0_3 - 0.00146103896103901*G0_0_1_1_0_4 - 0.00340909090909104*G0_0_1_1_0_5 - 0.00236201298701306*G0_0_1_1_1_0 + 0.0541680194805213*G0_0_1_1_1_1 - 0.00544237012987031*G0_0_1_1_1_2 + 0.0193831168831175*G0_0_1_1_1_3 - 0.00112012987012991*G0_0_1_1_1_4 + 0.0125162337662342*G0_0_1_1_1_5 - 0.00544237012987031*G0_0_1_1_2_1 + 0.00544237012987031*G0_0_1_1_2_2 + 0.000340909090909102*G0_0_1_1_2_4 - 0.000340909090909106*G0_0_1_1_2_5 - 0.00238636363636371*G0_0_1_1_3_0 + 0.0193831168831175*G0_0_1_1_3_1 + 0.030000000000001*G0_0_1_1_3_3 + 0.00701298701298724*G0_0_1_1_3_4 + 0.00545454545454566*G0_0_1_1_3_5 - 0.00146103896103901*G0_0_1_1_4_0 - 0.00112012987012991*G0_0_1_1_4_1 + 0.000340909090909102*G0_0_1_1_4_2 + 0.00701298701298724*G0_0_1_1_4_3 + 0.0212337662337669*G0_0_1_1_4_4 + 0.00292207792207802*G0_0_1_1_4_5 - 0.00340909090909104*G0_0_1_1_5_0 + 0.0125162337662342*G0_0_1_1_5_1 - 0.000340909090909106*G0_0_1_1_5_2 + 0.00545454545454566*G0_0_1_1_5_3 + 0.00292207792207802*G0_0_1_1_5_4 + 0.00214285714285725*G0_0_1_1_5_5 - 0.00158279220779226*G0_0_1_2_0_0 + 0.00236201298701307*G0_0_1_2_0_2 + 0.00238636363636371*G0_0_1_2_0_3 + 0.00340909090909102*G0_0_1_2_0_4 + 0.001461038961039*G0_0_1_2_0_5 - 0.00544237012987031*G0_0_1_2_1_1 + 0.00544237012987031*G0_0_1_2_1_2 + 0.000340909090909103*G0_0_1_2_1_4 - 0.000340909090909105*G0_0_1_2_1_5 + 0.00236201298701307*G0_0_1_2_2_0 + 0.00544237012987031*G0_0_1_2_2_1 - 0.0541680194805214*G0_0_1_2_2_2 - 0.0193831168831176*G0_0_1_2_2_3 - 0.0125162337662342*G0_0_1_2_2_4 + 0.0011201298701299*G0_0_1_2_2_5 + 0.00238636363636371*G0_0_1_2_3_0 - 0.0193831168831175*G0_0_1_2_3_2 - 0.030000000000001*G0_0_1_2_3_3 - 0.00545454545454564*G0_0_1_2_3_4 - 0.00701298701298726*G0_0_1_2_3_5 + 0.00340909090909102*G0_0_1_2_4_0 + 0.000340909090909103*G0_0_1_2_4_1 - 0.0125162337662342*G0_0_1_2_4_2 - 0.00545454545454564*G0_0_1_2_4_3 - 0.00214285714285723*G0_0_1_2_4_4 - 0.00292207792207803*G0_0_1_2_4_5 + 0.001461038961039*G0_0_1_2_5_0 - 0.000340909090909106*G0_0_1_2_5_1 + 0.0011201298701299*G0_0_1_2_5_2 - 0.00701298701298726*G0_0_1_2_5_3 - 0.00292207792207803*G0_0_1_2_5_4 - 0.021233766233767*G0_0_1_2_5_5 - 0.00238636363636371*G0_0_1_3_0_1 + 0.00238636363636371*G0_0_1_3_0_2 + 0.00292207792207802*G0_0_1_3_0_4 - 0.00292207792207801*G0_0_1_3_0_5 - 0.00238636363636371*G0_0_1_3_1_0 + 0.0193831168831175*G0_0_1_3_1_1 + 0.030000000000001*G0_0_1_3_1_3 + 0.00701298701298724*G0_0_1_3_1_4 + 0.00545454545454566*G0_0_1_3_1_5 + 0.00238636363636371*G0_0_1_3_2_0 - 0.0193831168831175*G0_0_1_3_2_2 - 0.030000000000001*G0_0_1_3_2_3 - 0.00545454545454564*G0_0_1_3_2_4 - 0.00701298701298726*G0_0_1_3_2_5 + 0.030000000000001*G0_0_1_3_3_1 - 0.030000000000001*G0_0_1_3_3_2 - 0.0140259740259745*G0_0_1_3_3_4 + 0.0140259740259745*G0_0_1_3_3_5 + 0.00292207792207802*G0_0_1_3_4_0 + 0.00701298701298724*G0_0_1_3_4_1 - 0.00545454545454564*G0_0_1_3_4_2 - 0.0140259740259745*G0_0_1_3_4_3 - 0.0483116883116898*G0_0_1_3_4_4 - 0.00292207792207801*G0_0_1_3_5_0 + 0.00545454545454566*G0_0_1_3_5_1 - 0.00701298701298726*G0_0_1_3_5_2 + 0.0140259740259745*G0_0_1_3_5_3 + 0.04831168831169*G0_0_1_3_5_5 + 0.00146103896103902*G0_0_1_4_0_0 - 0.00146103896103901*G0_0_1_4_0_1 + 0.00340909090909102*G0_0_1_4_0_2 + 0.00292207792207802*G0_0_1_4_0_3 + 0.00974025974026003*G0_0_1_4_0_4 - 0.00146103896103901*G0_0_1_4_1_0 - 0.00112012987012991*G0_0_1_4_1_1 + 0.000340909090909103*G0_0_1_4_1_2 + 0.00701298701298724*G0_0_1_4_1_3 + 0.0212337662337669*G0_0_1_4_1_4 + 0.00292207792207802*G0_0_1_4_1_5 + 0.00340909090909102*G0_0_1_4_2_0 + 0.000340909090909102*G0_0_1_4_2_1 - 0.0125162337662342*G0_0_1_4_2_2 - 0.00545454545454564*G0_0_1_4_2_3 - 0.00214285714285722*G0_0_1_4_2_4 - 0.00292207792207803*G0_0_1_4_2_5 + 0.00292207792207802*G0_0_1_4_3_0 + 0.00701298701298724*G0_0_1_4_3_1 - 0.00545454545454564*G0_0_1_4_3_2 - 0.0140259740259745*G0_0_1_4_3_3 - 0.0483116883116898*G0_0_1_4_3_4 + 0.00974025974026003*G0_0_1_4_4_0 + 0.0212337662337669*G0_0_1_4_4_1 - 0.00214285714285723*G0_0_1_4_4_2 - 0.0483116883116898*G0_0_1_4_4_3 - 0.3296103896104*G0_0_1_4_4_4 - 0.0366233766233778*G0_0_1_4_4_5 + 0.00292207792207802*G0_0_1_4_5_1 - 0.00292207792207803*G0_0_1_4_5_2 - 0.0366233766233778*G0_0_1_4_5_4 + 0.0366233766233779*G0_0_1_4_5_5 - 0.00146103896103901*G0_0_1_5_0_0 - 0.00340909090909104*G0_0_1_5_0_1 + 0.001461038961039*G0_0_1_5_0_2 - 0.00292207792207801*G0_0_1_5_0_3 - 0.00974025974025998*G0_0_1_5_0_5 - 0.00340909090909104*G0_0_1_5_1_0 + 0.0125162337662342*G0_0_1_5_1_1 - 0.000340909090909105*G0_0_1_5_1_2 + 0.00545454545454566*G0_0_1_5_1_3 + 0.00292207792207802*G0_0_1_5_1_4 + 0.00214285714285724*G0_0_1_5_1_5 + 0.001461038961039*G0_0_1_5_2_0 - 0.000340909090909106*G0_0_1_5_2_1 + 0.0011201298701299*G0_0_1_5_2_2 - 0.00701298701298726*G0_0_1_5_2_3 - 0.00292207792207803*G0_0_1_5_2_4 - 0.021233766233767*G0_0_1_5_2_5 - 0.00292207792207801*G0_0_1_5_3_0 + 0.00545454545454566*G0_0_1_5_3_1 - 0.00701298701298726*G0_0_1_5_3_2 + 0.0140259740259745*G0_0_1_5_3_3 + 0.04831168831169*G0_0_1_5_3_5 + 0.00292207792207802*G0_0_1_5_4_1 - 0.00292207792207803*G0_0_1_5_4_2 - 0.0366233766233778*G0_0_1_5_4_4 + 0.0366233766233779*G0_0_1_5_4_5 - 0.00974025974025998*G0_0_1_5_5_0 + 0.00214285714285724*G0_0_1_5_5_1 - 0.021233766233767*G0_0_1_5_5_2 + 0.04831168831169*G0_0_1_5_5_3 + 0.0366233766233779*G0_0_1_5_5_4 + 0.329610389610401*G0_0_1_5_5_5 + 0.00158279220779226*G0_1_0_0_0_1 - 0.00158279220779226*G0_1_0_0_0_2 + 0.00146103896103902*G0_1_0_0_0_4 - 0.00146103896103901*G0_1_0_0_0_5 + 0.00158279220779226*G0_1_0_0_1_0 - 0.00236201298701306*G0_1_0_0_1_1 - 0.00238636363636371*G0_1_0_0_1_3 - 0.00146103896103901*G0_1_0_0_1_4 - 0.00340909090909104*G0_1_0_0_1_5 - 0.00158279220779226*G0_1_0_0_2_0 + 0.00236201298701307*G0_1_0_0_2_2 + 0.00238636363636371*G0_1_0_0_2_3 + 0.00340909090909102*G0_1_0_0_2_4 + 0.001461038961039*G0_1_0_0_2_5 - 0.00238636363636371*G0_1_0_0_3_1 + 0.00238636363636371*G0_1_0_0_3_2 + 0.00292207792207802*G0_1_0_0_3_4 - 0.00292207792207801*G0_1_0_0_3_5 + 0.00146103896103902*G0_1_0_0_4_0 - 0.00146103896103901*G0_1_0_0_4_1 + 0.00340909090909102*G0_1_0_0_4_2 + 0.00292207792207802*G0_1_0_0_4_3 + 0.00974025974026003*G0_1_0_0_4_4 - 0.001461038961039*G0_1_0_0_5_0 - 0.00340909090909104*G0_1_0_0_5_1 + 0.001461038961039*G0_1_0_0_5_2 - 0.00292207792207801*G0_1_0_0_5_3 - 0.00974025974025998*G0_1_0_0_5_5 + 0.00158279220779226*G0_1_0_1_0_0 - 0.00236201298701306*G0_1_0_1_0_1 - 0.00238636363636371*G0_1_0_1_0_3 - 0.00146103896103901*G0_1_0_1_0_4 - 0.00340909090909104*G0_1_0_1_0_5 - 0.00236201298701306*G0_1_0_1_1_0 + 0.0541680194805213*G0_1_0_1_1_1 - 0.00544237012987031*G0_1_0_1_1_2 + 0.0193831168831175*G0_1_0_1_1_3 - 0.00112012987012991*G0_1_0_1_1_4 + 0.0125162337662342*G0_1_0_1_1_5 - 0.00544237012987031*G0_1_0_1_2_1 + 0.00544237012987031*G0_1_0_1_2_2 + 0.000340909090909102*G0_1_0_1_2_4 - 0.000340909090909105*G0_1_0_1_2_5 - 0.00238636363636371*G0_1_0_1_3_0 + 0.0193831168831175*G0_1_0_1_3_1 + 0.030000000000001*G0_1_0_1_3_3 + 0.00701298701298724*G0_1_0_1_3_4 + 0.00545454545454566*G0_1_0_1_3_5 - 0.00146103896103901*G0_1_0_1_4_0 - 0.00112012987012991*G0_1_0_1_4_1 + 0.000340909090909102*G0_1_0_1_4_2 + 0.00701298701298724*G0_1_0_1_4_3 + 0.0212337662337669*G0_1_0_1_4_4 + 0.00292207792207802*G0_1_0_1_4_5 - 0.00340909090909104*G0_1_0_1_5_0 + 0.0125162337662342*G0_1_0_1_5_1 - 0.000340909090909106*G0_1_0_1_5_2 + 0.00545454545454566*G0_1_0_1_5_3 + 0.00292207792207802*G0_1_0_1_5_4 + 0.00214285714285725*G0_1_0_1_5_5 - 0.00158279220779226*G0_1_0_2_0_0 + 0.00236201298701307*G0_1_0_2_0_2 + 0.00238636363636371*G0_1_0_2_0_3 + 0.00340909090909102*G0_1_0_2_0_4 + 0.001461038961039*G0_1_0_2_0_5 - 0.00544237012987031*G0_1_0_2_1_1 + 0.00544237012987031*G0_1_0_2_1_2 + 0.000340909090909103*G0_1_0_2_1_4 - 0.000340909090909105*G0_1_0_2_1_5 + 0.00236201298701307*G0_1_0_2_2_0 + 0.00544237012987031*G0_1_0_2_2_1 - 0.0541680194805214*G0_1_0_2_2_2 - 0.0193831168831176*G0_1_0_2_2_3 - 0.0125162337662342*G0_1_0_2_2_4 + 0.0011201298701299*G0_1_0_2_2_5 + 0.00238636363636371*G0_1_0_2_3_0 - 0.0193831168831175*G0_1_0_2_3_2 - 0.030000000000001*G0_1_0_2_3_3 - 0.00545454545454564*G0_1_0_2_3_4 - 0.00701298701298726*G0_1_0_2_3_5 + 0.00340909090909102*G0_1_0_2_4_0 + 0.000340909090909103*G0_1_0_2_4_1 - 0.0125162337662342*G0_1_0_2_4_2 - 0.00545454545454564*G0_1_0_2_4_3 - 0.00214285714285723*G0_1_0_2_4_4 - 0.00292207792207803*G0_1_0_2_4_5 + 0.001461038961039*G0_1_0_2_5_0 - 0.000340909090909106*G0_1_0_2_5_1 + 0.0011201298701299*G0_1_0_2_5_2 - 0.00701298701298726*G0_1_0_2_5_3 - 0.00292207792207803*G0_1_0_2_5_4 - 0.021233766233767*G0_1_0_2_5_5 - 0.00238636363636371*G0_1_0_3_0_1 + 0.00238636363636371*G0_1_0_3_0_2 + 0.00292207792207802*G0_1_0_3_0_4 - 0.00292207792207801*G0_1_0_3_0_5 - 0.00238636363636371*G0_1_0_3_1_0 + 0.0193831168831175*G0_1_0_3_1_1 + 0.030000000000001*G0_1_0_3_1_3 + 0.00701298701298724*G0_1_0_3_1_4 + 0.00545454545454566*G0_1_0_3_1_5 + 0.00238636363636371*G0_1_0_3_2_0 - 0.0193831168831175*G0_1_0_3_2_2 - 0.030000000000001*G0_1_0_3_2_3 - 0.00545454545454564*G0_1_0_3_2_4 - 0.00701298701298726*G0_1_0_3_2_5 + 0.030000000000001*G0_1_0_3_3_1 - 0.030000000000001*G0_1_0_3_3_2 - 0.0140259740259745*G0_1_0_3_3_4 + 0.0140259740259745*G0_1_0_3_3_5 + 0.00292207792207802*G0_1_0_3_4_0 + 0.00701298701298724*G0_1_0_3_4_1 - 0.00545454545454564*G0_1_0_3_4_2 - 0.0140259740259745*G0_1_0_3_4_3 - 0.0483116883116898*G0_1_0_3_4_4 - 0.00292207792207801*G0_1_0_3_5_0 + 0.00545454545454566*G0_1_0_3_5_1 - 0.00701298701298726*G0_1_0_3_5_2 + 0.0140259740259745*G0_1_0_3_5_3 + 0.04831168831169*G0_1_0_3_5_5 + 0.00146103896103902*G0_1_0_4_0_0 - 0.00146103896103901*G0_1_0_4_0_1 + 0.00340909090909102*G0_1_0_4_0_2 + 0.00292207792207802*G0_1_0_4_0_3 + 0.00974025974026003*G0_1_0_4_0_4 - 0.00146103896103901*G0_1_0_4_1_0 - 0.00112012987012991*G0_1_0_4_1_1 + 0.000340909090909102*G0_1_0_4_1_2 + 0.00701298701298724*G0_1_0_4_1_3 + 0.0212337662337669*G0_1_0_4_1_4 + 0.00292207792207802*G0_1_0_4_1_5 + 0.00340909090909102*G0_1_0_4_2_0 + 0.000340909090909102*G0_1_0_4_2_1 - 0.0125162337662342*G0_1_0_4_2_2 - 0.00545454545454564*G0_1_0_4_2_3 - 0.00214285714285722*G0_1_0_4_2_4 - 0.00292207792207803*G0_1_0_4_2_5 + 0.00292207792207802*G0_1_0_4_3_0 + 0.00701298701298724*G0_1_0_4_3_1 - 0.00545454545454564*G0_1_0_4_3_2 - 0.0140259740259745*G0_1_0_4_3_3 - 0.0483116883116898*G0_1_0_4_3_4 + 0.00974025974026003*G0_1_0_4_4_0 + 0.0212337662337669*G0_1_0_4_4_1 - 0.00214285714285723*G0_1_0_4_4_2 - 0.0483116883116898*G0_1_0_4_4_3 - 0.3296103896104*G0_1_0_4_4_4 - 0.0366233766233778*G0_1_0_4_4_5 + 0.00292207792207802*G0_1_0_4_5_1 - 0.00292207792207803*G0_1_0_4_5_2 - 0.0366233766233778*G0_1_0_4_5_4 + 0.0366233766233779*G0_1_0_4_5_5 - 0.00146103896103901*G0_1_0_5_0_0 - 0.00340909090909104*G0_1_0_5_0_1 + 0.001461038961039*G0_1_0_5_0_2 - 0.00292207792207801*G0_1_0_5_0_3 - 0.00974025974025998*G0_1_0_5_0_5 - 0.00340909090909104*G0_1_0_5_1_0 + 0.0125162337662342*G0_1_0_5_1_1 - 0.000340909090909106*G0_1_0_5_1_2 + 0.00545454545454566*G0_1_0_5_1_3 + 0.00292207792207802*G0_1_0_5_1_4 + 0.00214285714285724*G0_1_0_5_1_5 + 0.001461038961039*G0_1_0_5_2_0 - 0.000340909090909106*G0_1_0_5_2_1 + 0.0011201298701299*G0_1_0_5_2_2 - 0.00701298701298726*G0_1_0_5_2_3 - 0.00292207792207803*G0_1_0_5_2_4 - 0.021233766233767*G0_1_0_5_2_5 - 0.00292207792207801*G0_1_0_5_3_0 + 0.00545454545454566*G0_1_0_5_3_1 - 0.00701298701298726*G0_1_0_5_3_2 + 0.0140259740259745*G0_1_0_5_3_3 + 0.04831168831169*G0_1_0_5_3_5 + 0.00292207792207802*G0_1_0_5_4_1 - 0.00292207792207803*G0_1_0_5_4_2 - 0.0366233766233778*G0_1_0_5_4_4 + 0.0366233766233779*G0_1_0_5_4_5 - 0.00974025974025998*G0_1_0_5_5_0 + 0.00214285714285725*G0_1_0_5_5_1 - 0.021233766233767*G0_1_0_5_5_2 + 0.04831168831169*G0_1_0_5_5_3 + 0.0366233766233779*G0_1_0_5_5_4 + 0.329610389610401*G0_1_0_5_5_5 - 0.201623376623383*G0_1_1_0_0_0 + 0.0114448051948056*G0_1_1_0_0_1 + 0.00827922077922106*G0_1_1_0_0_2 - 0.00146103896103898*G0_1_1_0_0_3 - 0.0394480519480532*G0_1_1_0_0_4 - 0.0423701298701313*G0_1_1_0_0_5 + 0.0114448051948056*G0_1_1_0_1_0 - 0.00309253246753256*G0_1_1_0_1_1 - 0.000243506493506499*G0_1_1_0_1_2 - 0.00262987012987022*G0_1_1_0_1_3 - 0.000487012987013007*G0_1_1_0_1_4 - 0.000974025974026035*G0_1_1_0_1_5 + 0.00827922077922106*G0_1_1_0_2_0 - 0.000243506493506499*G0_1_1_0_2_1 + 0.00163149350649356*G0_1_1_0_2_2 + 0.00214285714285721*G0_1_1_0_2_3 + 0.00584415584415603*G0_1_1_0_2_4 + 0.00243506493506501*G0_1_1_0_2_5 - 0.00146103896103898*G0_1_1_0_3_0 - 0.00262987012987022*G0_1_1_0_3_1 + 0.00214285714285721*G0_1_1_0_3_2 + 0.00389610389610403*G0_1_1_0_3_4 - 0.00194805194805199*G0_1_1_0_3_5 - 0.0394480519480532*G0_1_1_0_4_0 - 0.000487012987013007*G0_1_1_0_4_1 + 0.00584415584415603*G0_1_1_0_4_2 + 0.00389610389610403*G0_1_1_0_4_3 + 0.00194805194805201*G0_1_1_0_4_4 - 0.00389610389610399*G0_1_1_0_4_5 - 0.0423701298701313*G0_1_1_0_5_0 - 0.000974025974026035*G0_1_1_0_5_1 + 0.00243506493506501*G0_1_1_0_5_2 - 0.00194805194805199*G0_1_1_0_5_3 - 0.00389610389610399*G0_1_1_0_5_4 - 0.017532467532468*G0_1_1_0_5_5 + 0.0114448051948056*G0_1_1_1_0_0 - 0.00309253246753256*G0_1_1_1_0_1 - 0.000243506493506499*G0_1_1_1_0_2 - 0.00262987012987022*G0_1_1_1_0_3 - 0.000487012987013007*G0_1_1_1_0_4 - 0.000974025974026033*G0_1_1_1_0_5 - 0.00309253246753256*G0_1_1_1_1_0 + 0.055957792207794*G0_1_1_1_1_1 - 0.00601461038961059*G0_1_1_1_1_2 + 0.0212337662337669*G0_1_1_1_1_3 + 0.000681818181818203*G0_1_1_1_1_4 + 0.0148051948051954*G0_1_1_1_1_5 - 0.000243506493506499*G0_1_1_1_2_0 - 0.00601461038961059*G0_1_1_1_2_1 + 0.00487012987013003*G0_1_1_1_2_2 + 0.000194805194805201*G0_1_1_1_2_3 + 0.00214285714285722*G0_1_1_1_2_4 + 0.00146103896103901*G0_1_1_1_2_5 - 0.00262987012987022*G0_1_1_1_3_0 + 0.0212337662337669*G0_1_1_1_3_1 + 0.000194805194805202*G0_1_1_1_3_2 + 0.0296103896103906*G0_1_1_1_3_3 + 0.00389610389610402*G0_1_1_1_3_4 + 0.00233766233766243*G0_1_1_1_3_5 - 0.000487012987013007*G0_1_1_1_4_0 + 0.000681818181818203*G0_1_1_1_4_1 + 0.00214285714285722*G0_1_1_1_4_2 + 0.00389610389610402*G0_1_1_1_4_3 + 0.0109090909090912*G0_1_1_1_4_4 - 0.00428571428571445*G0_1_1_1_4_5 - 0.000974025974026033*G0_1_1_1_5_0 + 0.0148051948051954*G0_1_1_1_5_1 + 0.00146103896103901*G0_1_1_1_5_2 + 0.00233766233766243*G0_1_1_1_5_3 - 0.00428571428571445*G0_1_1_1_5_4 - 0.0101298701298705*G0_1_1_1_5_5 + 0.00827922077922106*G0_1_1_2_0_0 - 0.000243506493506499*G0_1_1_2_0_1 + 0.00163149350649356*G0_1_1_2_0_2 + 0.00214285714285721*G0_1_1_2_0_3 + 0.00584415584415603*G0_1_1_2_0_4 + 0.00243506493506501*G0_1_1_2_0_5 - 0.000243506493506499*G0_1_1_2_1_0 - 0.00601461038961059*G0_1_1_2_1_1 + 0.00487012987013003*G0_1_1_2_1_2 + 0.000194805194805201*G0_1_1_2_1_3 + 0.00214285714285722*G0_1_1_2_1_4 + 0.00146103896103901*G0_1_1_2_1_5 + 0.00163149350649356*G0_1_1_2_2_0 + 0.00487012987013003*G0_1_1_2_2_1 - 0.0523782467532486*G0_1_1_2_2_2 - 0.0175324675324681*G0_1_1_2_2_3 - 0.0102272727272731*G0_1_1_2_2_4 + 0.00292207792207802*G0_1_1_2_2_5 + 0.00214285714285721*G0_1_1_2_3_0 + 0.000194805194805201*G0_1_1_2_3_1 - 0.0175324675324681*G0_1_1_2_3_2 - 0.0303896103896115*G0_1_1_2_3_3 - 0.00857142857142887*G0_1_1_2_3_4 - 0.0101298701298705*G0_1_1_2_3_5 + 0.00584415584415603*G0_1_1_2_4_0 + 0.00214285714285722*G0_1_1_2_4_1 - 0.0102272727272731*G0_1_1_2_4_2 - 0.00857142857142887*G0_1_1_2_4_3 - 0.0144155844155849*G0_1_1_2_4_4 - 0.0101298701298705*G0_1_1_2_4_5 + 0.00243506493506501*G0_1_1_2_5_0 + 0.00146103896103901*G0_1_1_2_5_1 + 0.00292207792207802*G0_1_1_2_5_2 - 0.0101298701298705*G0_1_1_2_5_3 - 0.0101298701298705*G0_1_1_2_5_4 - 0.0315584415584427*G0_1_1_2_5_5 - 0.00146103896103898*G0_1_1_3_0_0 - 0.00262987012987022*G0_1_1_3_0_1 + 0.00214285714285721*G0_1_1_3_0_2 + 0.00389610389610403*G0_1_1_3_0_4 - 0.00194805194805199*G0_1_1_3_0_5 - 0.00262987012987022*G0_1_1_3_1_0 + 0.0212337662337669*G0_1_1_3_1_1 + 0.000194805194805202*G0_1_1_3_1_2 + 0.0296103896103906*G0_1_1_3_1_3 + 0.00389610389610402*G0_1_1_3_1_4 + 0.00233766233766243*G0_1_1_3_1_5 + 0.00214285714285721*G0_1_1_3_2_0 + 0.000194805194805202*G0_1_1_3_2_1 - 0.0175324675324681*G0_1_1_3_2_2 - 0.0303896103896115*G0_1_1_3_2_3 - 0.00857142857142887*G0_1_1_3_2_4 - 0.0101298701298705*G0_1_1_3_2_5 + 0.0296103896103906*G0_1_1_3_3_1 - 0.0303896103896115*G0_1_1_3_3_2 + 0.0140259740259745*G0_1_1_3_3_3 - 0.00779220779220803*G0_1_1_3_3_4 + 0.020259740259741*G0_1_1_3_3_5 + 0.00389610389610403*G0_1_1_3_4_0 + 0.00389610389610402*G0_1_1_3_4_1 - 0.00857142857142887*G0_1_1_3_4_2 - 0.00779220779220804*G0_1_1_3_4_3 - 0.0296103896103905*G0_1_1_3_4_4 + 0.0124675324675329*G0_1_1_3_4_5 - 0.00194805194805199*G0_1_1_3_5_0 + 0.00233766233766243*G0_1_1_3_5_1 - 0.0101298701298705*G0_1_1_3_5_2 + 0.020259740259741*G0_1_1_3_5_3 + 0.0124675324675329*G0_1_1_3_5_4 + 0.0670129870129893*G0_1_1_3_5_5 - 0.0394480519480532*G0_1_1_4_0_0 - 0.000487012987013007*G0_1_1_4_0_1 + 0.00584415584415603*G0_1_1_4_0_2 + 0.00389610389610403*G0_1_1_4_0_3 + 0.001948051948052*G0_1_1_4_0_4 - 0.00389610389610399*G0_1_1_4_0_5 - 0.000487012987013007*G0_1_1_4_1_0 + 0.000681818181818203*G0_1_1_4_1_1 + 0.00214285714285722*G0_1_1_4_1_2 + 0.00389610389610402*G0_1_1_4_1_3 + 0.0109090909090912*G0_1_1_4_1_4 - 0.00428571428571444*G0_1_1_4_1_5 + 0.00584415584415603*G0_1_1_4_2_0 + 0.00214285714285722*G0_1_1_4_2_1 - 0.0102272727272731*G0_1_1_4_2_2 - 0.00857142857142887*G0_1_1_4_2_3 - 0.0144155844155849*G0_1_1_4_2_4 - 0.0101298701298705*G0_1_1_4_2_5 + 0.00389610389610403*G0_1_1_4_3_0 + 0.00389610389610402*G0_1_1_4_3_1 - 0.00857142857142887*G0_1_1_4_3_2 - 0.00779220779220804*G0_1_1_4_3_3 - 0.0296103896103905*G0_1_1_4_3_4 + 0.0124675324675329*G0_1_1_4_3_5 + 0.001948051948052*G0_1_1_4_4_0 + 0.0109090909090912*G0_1_1_4_4_1 - 0.0144155844155849*G0_1_1_4_4_2 - 0.0296103896103905*G0_1_1_4_4_3 - 0.224415584415592*G0_1_1_4_4_4 - 0.00155844155844154*G0_1_1_4_4_5 - 0.00389610389610399*G0_1_1_4_5_0 - 0.00428571428571445*G0_1_1_4_5_1 - 0.0101298701298705*G0_1_1_4_5_2 + 0.0124675324675329*G0_1_1_4_5_3 - 0.00155844155844155*G0_1_1_4_5_4 + 0.0716883116883142*G0_1_1_4_5_5 - 0.0423701298701313*G0_1_1_5_0_0 - 0.000974025974026033*G0_1_1_5_0_1 + 0.00243506493506501*G0_1_1_5_0_2 - 0.00194805194805199*G0_1_1_5_0_3 - 0.00389610389610399*G0_1_1_5_0_4 - 0.017532467532468*G0_1_1_5_0_5 - 0.000974025974026033*G0_1_1_5_1_0 + 0.0148051948051954*G0_1_1_5_1_1 + 0.00146103896103901*G0_1_1_5_1_2 + 0.00233766233766244*G0_1_1_5_1_3 - 0.00428571428571445*G0_1_1_5_1_4 - 0.0101298701298705*G0_1_1_5_1_5 + 0.00243506493506501*G0_1_1_5_2_0 + 0.00146103896103901*G0_1_1_5_2_1 + 0.00292207792207802*G0_1_1_5_2_2 - 0.0101298701298705*G0_1_1_5_2_3 - 0.0101298701298705*G0_1_1_5_2_4 - 0.0315584415584427*G0_1_1_5_2_5 - 0.00194805194805199*G0_1_1_5_3_0 + 0.00233766233766243*G0_1_1_5_3_1 - 0.0101298701298705*G0_1_1_5_3_2 + 0.020259740259741*G0_1_1_5_3_3 + 0.0124675324675329*G0_1_1_5_3_4 + 0.0670129870129893*G0_1_1_5_3_5 - 0.00389610389610399*G0_1_1_5_4_0 - 0.00428571428571445*G0_1_1_5_4_1 - 0.0101298701298705*G0_1_1_5_4_2 + 0.0124675324675329*G0_1_1_5_4_3 - 0.00155844155844154*G0_1_1_5_4_4 + 0.0716883116883142*G0_1_1_5_4_5 - 0.017532467532468*G0_1_1_5_5_0 - 0.0101298701298705*G0_1_1_5_5_1 - 0.0315584415584427*G0_1_1_5_5_2 + 0.0670129870129893*G0_1_1_5_5_3 + 0.0716883116883142*G0_1_1_5_5_4 + 0.434805194805211*G0_1_1_5_5_5; + A[3] = A[30] - 0.000248917748917751*G0_0_1_0_0_1 + 0.000346320346320364*G0_0_1_0_0_2 - 0.00156926406926415*G0_0_1_0_0_4 + 0.00156926406926409*G0_0_1_0_0_5 - 0.000248917748917751*G0_0_1_0_1_0 + 0.000735930735930761*G0_0_1_0_1_1 - 0.000183982683982687*G0_0_1_0_1_4 - 0.000844155844155865*G0_0_1_0_1_5 + 0.000346320346320364*G0_0_1_0_2_0 + 0.000116341991341996*G0_0_1_0_2_2 - 0.000281385281385289*G0_0_1_0_2_3 - 0.000270562770562777*G0_0_1_0_2_5 - 0.000281385281385289*G0_0_1_0_3_2 - 0.000389610389610398*G0_0_1_0_3_3 + 0.000562770562770578*G0_0_1_0_3_4 + 0.000735930735930757*G0_0_1_0_3_5 - 0.00156926406926415*G0_0_1_0_4_0 - 0.000183982683982687*G0_0_1_0_4_1 + 0.000562770562770578*G0_0_1_0_4_3 - 0.00329004329004342*G0_0_1_0_4_4 + 0.000909090909090927*G0_0_1_0_4_5 + 0.00156926406926409*G0_0_1_0_5_0 - 0.000844155844155865*G0_0_1_0_5_1 - 0.000270562770562777*G0_0_1_0_5_2 + 0.000735930735930757*G0_0_1_0_5_3 + 0.000909090909090927*G0_0_1_0_5_4 + 0.0014718614718615*G0_0_1_0_5_5 - 0.000248917748917751*G0_0_1_1_0_0 + 0.000735930735930761*G0_0_1_1_0_1 - 0.000183982683982687*G0_0_1_1_0_4 - 0.000844155844155865*G0_0_1_1_0_5 + 0.000735930735930761*G0_0_1_1_1_0 - 0.0201501623376631*G0_0_1_1_1_1 + 0.00127299783549788*G0_0_1_1_1_2 - 0.0049242424242426*G0_0_1_1_1_3 - 0.0002435064935065*G0_0_1_1_1_4 - 0.00213744588744598*G0_0_1_1_1_5 + 0.00127299783549788*G0_0_1_1_2_1 - 0.000162337662337667*G0_0_1_1_2_3 - 0.000238095238095246*G0_0_1_1_2_4 - 0.0049242424242426*G0_0_1_1_3_1 - 0.000162337662337667*G0_0_1_1_3_2 - 0.00313852813852825*G0_0_1_1_3_3 + 0.00047619047619049*G0_0_1_1_3_4 - 0.000183982683982687*G0_0_1_1_4_0 - 0.0002435064935065*G0_0_1_1_4_1 - 0.000238095238095246*G0_0_1_1_4_2 + 0.00047619047619049*G0_0_1_1_4_3 + 0.000519480519480536*G0_0_1_1_4_4 + 0.000562770562770581*G0_0_1_1_4_5 - 0.000844155844155865*G0_0_1_1_5_0 - 0.00213744588744598*G0_0_1_1_5_1 + 0.000562770562770581*G0_0_1_1_5_4 + 0.0020346320346321*G0_0_1_1_5_5 + 0.000346320346320364*G0_0_1_2_0_0 + 0.000116341991341996*G0_0_1_2_0_2 - 0.00028138528138529*G0_0_1_2_0_3 - 0.000270562770562777*G0_0_1_2_0_5 + 0.00127299783549788*G0_0_1_2_1_1 - 0.000162337662337667*G0_0_1_2_1_3 - 0.000238095238095246*G0_0_1_2_1_4 + 0.000116341991341996*G0_0_1_2_2_0 - 0.00756087662337691*G0_0_1_2_2_2 - 0.000351731601731617*G0_0_1_2_2_3 - 0.000703463203463236*G0_0_1_2_2_4 - 0.000129870129870136*G0_0_1_2_2_5 - 0.000281385281385289*G0_0_1_2_3_0 - 0.000162337662337667*G0_0_1_2_3_1 - 0.000351731601731617*G0_0_1_2_3_2 + 0.00339826839826851*G0_0_1_2_3_3 + 0.00103896103896107*G0_0_1_2_3_4 + 0.000822510822510851*G0_0_1_2_3_5 - 0.000238095238095246*G0_0_1_2_4_1 - 0.000703463203463236*G0_0_1_2_4_2 + 0.00103896103896107*G0_0_1_2_4_3 + 0.00380952380952394*G0_0_1_2_4_4 + 0.000735930735930761*G0_0_1_2_4_5 - 0.000270562770562777*G0_0_1_2_5_0 - 0.000129870129870135*G0_0_1_2_5_2 + 0.00082251082251085*G0_0_1_2_5_3 + 0.000735930735930761*G0_0_1_2_5_4 + 0.000129870129870135*G0_0_1_2_5_5 - 0.000281385281385289*G0_0_1_3_0_2 - 0.000389610389610398*G0_0_1_3_0_3 + 0.000562770562770578*G0_0_1_3_0_4 + 0.000735930735930757*G0_0_1_3_0_5 - 0.0049242424242426*G0_0_1_3_1_1 - 0.000162337662337667*G0_0_1_3_1_2 - 0.00313852813852825*G0_0_1_3_1_3 + 0.00047619047619049*G0_0_1_3_1_4 - 0.000281385281385289*G0_0_1_3_2_0 - 0.000162337662337667*G0_0_1_3_2_1 - 0.000351731601731617*G0_0_1_3_2_2 + 0.00339826839826851*G0_0_1_3_2_3 + 0.00103896103896107*G0_0_1_3_2_4 + 0.000822510822510851*G0_0_1_3_2_5 - 0.000389610389610398*G0_0_1_3_3_0 - 0.00313852813852825*G0_0_1_3_3_1 + 0.00339826839826851*G0_0_1_3_3_2 + 0.0397402597402611*G0_0_1_3_3_3 - 0.000173160173160167*G0_0_1_3_3_4 - 0.000865800865800884*G0_0_1_3_3_5 + 0.000562770562770578*G0_0_1_3_4_0 + 0.00047619047619049*G0_0_1_3_4_1 + 0.00103896103896107*G0_0_1_3_4_2 - 0.000173160173160166*G0_0_1_3_4_3 - 0.00216450216450223*G0_0_1_3_4_4 - 0.00259740259740268*G0_0_1_3_4_5 + 0.000735930735930757*G0_0_1_3_5_0 + 0.000822510822510851*G0_0_1_3_5_2 - 0.000865800865800882*G0_0_1_3_5_3 - 0.00259740259740268*G0_0_1_3_5_4 - 0.00173160173160178*G0_0_1_3_5_5 - 0.00156926406926415*G0_0_1_4_0_0 - 0.000183982683982687*G0_0_1_4_0_1 + 0.000562770562770578*G0_0_1_4_0_3 - 0.00329004329004342*G0_0_1_4_0_4 + 0.000909090909090927*G0_0_1_4_0_5 - 0.000183982683982687*G0_0_1_4_1_0 - 0.0002435064935065*G0_0_1_4_1_1 - 0.000238095238095246*G0_0_1_4_1_2 + 0.000476190476190489*G0_0_1_4_1_3 + 0.000519480519480536*G0_0_1_4_1_4 + 0.000562770562770581*G0_0_1_4_1_5 - 0.000238095238095246*G0_0_1_4_2_1 - 0.000703463203463235*G0_0_1_4_2_2 + 0.00103896103896107*G0_0_1_4_2_3 + 0.00380952380952394*G0_0_1_4_2_4 + 0.000735930735930761*G0_0_1_4_2_5 + 0.000562770562770578*G0_0_1_4_3_0 + 0.000476190476190489*G0_0_1_4_3_1 + 0.00103896103896107*G0_0_1_4_3_2 - 0.000173160173160166*G0_0_1_4_3_3 - 0.00216450216450223*G0_0_1_4_3_4 - 0.00259740259740268*G0_0_1_4_3_5 - 0.00329004329004342*G0_0_1_4_4_0 + 0.000519480519480536*G0_0_1_4_4_1 + 0.00380952380952394*G0_0_1_4_4_2 - 0.00216450216450223*G0_0_1_4_4_3 + 0.000779220779220813*G0_0_1_4_4_4 - 0.00251082251082259*G0_0_1_4_4_5 + 0.000909090909090927*G0_0_1_4_5_0 + 0.000562770562770581*G0_0_1_4_5_1 + 0.000735930735930761*G0_0_1_4_5_2 - 0.00259740259740268*G0_0_1_4_5_3 - 0.00251082251082259*G0_0_1_4_5_4 - 0.00138528138528143*G0_0_1_4_5_5 + 0.00156926406926409*G0_0_1_5_0_0 - 0.000844155844155865*G0_0_1_5_0_1 - 0.000270562770562777*G0_0_1_5_0_2 + 0.000735930735930757*G0_0_1_5_0_3 + 0.000909090909090927*G0_0_1_5_0_4 + 0.0014718614718615*G0_0_1_5_0_5 - 0.000844155844155865*G0_0_1_5_1_0 - 0.00213744588744598*G0_0_1_5_1_1 + 0.000562770562770581*G0_0_1_5_1_4 + 0.0020346320346321*G0_0_1_5_1_5 - 0.000270562770562777*G0_0_1_5_2_0 - 0.000129870129870136*G0_0_1_5_2_2 + 0.00082251082251085*G0_0_1_5_2_3 + 0.000735930735930761*G0_0_1_5_2_4 + 0.000129870129870135*G0_0_1_5_2_5 + 0.000735930735930757*G0_0_1_5_3_0 + 0.00082251082251085*G0_0_1_5_3_2 - 0.000865800865800884*G0_0_1_5_3_3 - 0.00259740259740268*G0_0_1_5_3_4 - 0.00173160173160178*G0_0_1_5_3_5 + 0.000909090909090927*G0_0_1_5_4_0 + 0.000562770562770581*G0_0_1_5_4_1 + 0.000735930735930761*G0_0_1_5_4_2 - 0.00259740259740268*G0_0_1_5_4_3 - 0.00251082251082259*G0_0_1_5_4_4 - 0.00138528138528143*G0_0_1_5_4_5 + 0.0014718614718615*G0_0_1_5_5_0 + 0.0020346320346321*G0_0_1_5_5_1 + 0.000129870129870134*G0_0_1_5_5_2 - 0.00173160173160178*G0_0_1_5_5_3 - 0.00138528138528143*G0_0_1_5_5_4 + 0.0109090909090913*G0_0_1_5_5_5 + 0.000248917748917751*G0_1_0_0_0_1 - 0.000346320346320364*G0_1_0_0_0_2 + 0.00156926406926415*G0_1_0_0_0_4 - 0.00156926406926409*G0_1_0_0_0_5 + 0.000248917748917751*G0_1_0_0_1_0 - 0.000735930735930761*G0_1_0_0_1_1 + 0.000183982683982687*G0_1_0_0_1_4 + 0.000844155844155865*G0_1_0_0_1_5 - 0.000346320346320364*G0_1_0_0_2_0 - 0.000116341991341996*G0_1_0_0_2_2 + 0.00028138528138529*G0_1_0_0_2_3 + 0.000270562770562777*G0_1_0_0_2_5 + 0.00028138528138529*G0_1_0_0_3_2 + 0.000389610389610398*G0_1_0_0_3_3 - 0.000562770562770578*G0_1_0_0_3_4 - 0.000735930735930757*G0_1_0_0_3_5 + 0.00156926406926415*G0_1_0_0_4_0 + 0.000183982683982687*G0_1_0_0_4_1 - 0.000562770562770578*G0_1_0_0_4_3 + 0.00329004329004342*G0_1_0_0_4_4 - 0.000909090909090927*G0_1_0_0_4_5 - 0.00156926406926409*G0_1_0_0_5_0 + 0.000844155844155865*G0_1_0_0_5_1 + 0.000270562770562777*G0_1_0_0_5_2 - 0.000735930735930757*G0_1_0_0_5_3 - 0.000909090909090927*G0_1_0_0_5_4 - 0.0014718614718615*G0_1_0_0_5_5 + 0.000248917748917751*G0_1_0_1_0_0 - 0.000735930735930761*G0_1_0_1_0_1 + 0.000183982683982687*G0_1_0_1_0_4 + 0.000844155844155865*G0_1_0_1_0_5 - 0.000735930735930761*G0_1_0_1_1_0 + 0.0201501623376631*G0_1_0_1_1_1 - 0.00127299783549788*G0_1_0_1_1_2 + 0.0049242424242426*G0_1_0_1_1_3 + 0.0002435064935065*G0_1_0_1_1_4 + 0.00213744588744598*G0_1_0_1_1_5 - 0.00127299783549788*G0_1_0_1_2_1 + 0.000162337662337667*G0_1_0_1_2_3 + 0.000238095238095246*G0_1_0_1_2_4 + 0.0049242424242426*G0_1_0_1_3_1 + 0.000162337662337667*G0_1_0_1_3_2 + 0.00313852813852825*G0_1_0_1_3_3 - 0.00047619047619049*G0_1_0_1_3_4 + 0.000183982683982687*G0_1_0_1_4_0 + 0.0002435064935065*G0_1_0_1_4_1 + 0.000238095238095246*G0_1_0_1_4_2 - 0.00047619047619049*G0_1_0_1_4_3 - 0.000519480519480536*G0_1_0_1_4_4 - 0.000562770562770581*G0_1_0_1_4_5 + 0.000844155844155865*G0_1_0_1_5_0 + 0.00213744588744598*G0_1_0_1_5_1 - 0.000562770562770581*G0_1_0_1_5_4 - 0.0020346320346321*G0_1_0_1_5_5 - 0.000346320346320364*G0_1_0_2_0_0 - 0.000116341991341996*G0_1_0_2_0_2 + 0.00028138528138529*G0_1_0_2_0_3 + 0.000270562770562777*G0_1_0_2_0_5 - 0.00127299783549788*G0_1_0_2_1_1 + 0.000162337662337667*G0_1_0_2_1_3 + 0.000238095238095246*G0_1_0_2_1_4 - 0.000116341991341996*G0_1_0_2_2_0 + 0.00756087662337691*G0_1_0_2_2_2 + 0.000351731601731618*G0_1_0_2_2_3 + 0.000703463203463236*G0_1_0_2_2_4 + 0.000129870129870136*G0_1_0_2_2_5 + 0.00028138528138529*G0_1_0_2_3_0 + 0.000162337662337667*G0_1_0_2_3_1 + 0.000351731601731617*G0_1_0_2_3_2 - 0.00339826839826852*G0_1_0_2_3_3 - 0.00103896103896107*G0_1_0_2_3_4 - 0.000822510822510851*G0_1_0_2_3_5 + 0.000238095238095246*G0_1_0_2_4_1 + 0.000703463203463236*G0_1_0_2_4_2 - 0.00103896103896107*G0_1_0_2_4_3 - 0.00380952380952394*G0_1_0_2_4_4 - 0.000735930735930762*G0_1_0_2_4_5 + 0.000270562770562777*G0_1_0_2_5_0 + 0.000129870129870136*G0_1_0_2_5_2 - 0.000822510822510851*G0_1_0_2_5_3 - 0.000735930735930762*G0_1_0_2_5_4 - 0.000129870129870135*G0_1_0_2_5_5 + 0.00028138528138529*G0_1_0_3_0_2 + 0.000389610389610398*G0_1_0_3_0_3 - 0.000562770562770578*G0_1_0_3_0_4 - 0.000735930735930758*G0_1_0_3_0_5 + 0.0049242424242426*G0_1_0_3_1_1 + 0.000162337662337667*G0_1_0_3_1_2 + 0.00313852813852825*G0_1_0_3_1_3 - 0.00047619047619049*G0_1_0_3_1_4 + 0.00028138528138529*G0_1_0_3_2_0 + 0.000162337662337667*G0_1_0_3_2_1 + 0.000351731601731618*G0_1_0_3_2_2 - 0.00339826839826851*G0_1_0_3_2_3 - 0.00103896103896107*G0_1_0_3_2_4 - 0.000822510822510851*G0_1_0_3_2_5 + 0.000389610389610398*G0_1_0_3_3_0 + 0.00313852813852825*G0_1_0_3_3_1 - 0.00339826839826852*G0_1_0_3_3_2 - 0.0397402597402611*G0_1_0_3_3_3 + 0.000173160173160167*G0_1_0_3_3_4 + 0.000865800865800884*G0_1_0_3_3_5 - 0.000562770562770578*G0_1_0_3_4_0 - 0.000476190476190489*G0_1_0_3_4_1 - 0.00103896103896107*G0_1_0_3_4_2 + 0.000173160173160167*G0_1_0_3_4_3 + 0.00216450216450223*G0_1_0_3_4_4 + 0.00259740259740268*G0_1_0_3_4_5 - 0.000735930735930757*G0_1_0_3_5_0 - 0.000822510822510851*G0_1_0_3_5_2 + 0.000865800865800884*G0_1_0_3_5_3 + 0.00259740259740268*G0_1_0_3_5_4 + 0.00173160173160179*G0_1_0_3_5_5 + 0.00156926406926415*G0_1_0_4_0_0 + 0.000183982683982687*G0_1_0_4_0_1 - 0.000562770562770578*G0_1_0_4_0_3 + 0.00329004329004342*G0_1_0_4_0_4 - 0.000909090909090927*G0_1_0_4_0_5 + 0.000183982683982687*G0_1_0_4_1_0 + 0.0002435064935065*G0_1_0_4_1_1 + 0.000238095238095246*G0_1_0_4_1_2 - 0.000476190476190489*G0_1_0_4_1_3 - 0.000519480519480536*G0_1_0_4_1_4 - 0.000562770562770581*G0_1_0_4_1_5 + 0.000238095238095246*G0_1_0_4_2_1 + 0.000703463203463235*G0_1_0_4_2_2 - 0.00103896103896107*G0_1_0_4_2_3 - 0.00380952380952394*G0_1_0_4_2_4 - 0.000735930735930761*G0_1_0_4_2_5 - 0.000562770562770578*G0_1_0_4_3_0 - 0.000476190476190489*G0_1_0_4_3_1 - 0.00103896103896107*G0_1_0_4_3_2 + 0.000173160173160167*G0_1_0_4_3_3 + 0.00216450216450222*G0_1_0_4_3_4 + 0.00259740259740268*G0_1_0_4_3_5 + 0.00329004329004342*G0_1_0_4_4_0 - 0.000519480519480536*G0_1_0_4_4_1 - 0.00380952380952394*G0_1_0_4_4_2 + 0.00216450216450223*G0_1_0_4_4_3 - 0.000779220779220812*G0_1_0_4_4_4 + 0.00251082251082259*G0_1_0_4_4_5 - 0.000909090909090927*G0_1_0_4_5_0 - 0.000562770562770581*G0_1_0_4_5_1 - 0.000735930735930762*G0_1_0_4_5_2 + 0.00259740259740268*G0_1_0_4_5_3 + 0.00251082251082259*G0_1_0_4_5_4 + 0.00138528138528143*G0_1_0_4_5_5 - 0.00156926406926409*G0_1_0_5_0_0 + 0.000844155844155865*G0_1_0_5_0_1 + 0.000270562770562777*G0_1_0_5_0_2 - 0.000735930735930757*G0_1_0_5_0_3 - 0.000909090909090927*G0_1_0_5_0_4 - 0.0014718614718615*G0_1_0_5_0_5 + 0.000844155844155865*G0_1_0_5_1_0 + 0.00213744588744598*G0_1_0_5_1_1 - 0.000562770562770581*G0_1_0_5_1_4 - 0.0020346320346321*G0_1_0_5_1_5 + 0.000270562770562777*G0_1_0_5_2_0 + 0.000129870129870136*G0_1_0_5_2_2 - 0.000822510822510851*G0_1_0_5_2_3 - 0.000735930735930762*G0_1_0_5_2_4 - 0.000129870129870135*G0_1_0_5_2_5 - 0.000735930735930757*G0_1_0_5_3_0 - 0.00082251082251085*G0_1_0_5_3_2 + 0.000865800865800884*G0_1_0_5_3_3 + 0.00259740259740268*G0_1_0_5_3_4 + 0.00173160173160178*G0_1_0_5_3_5 - 0.000909090909090927*G0_1_0_5_4_0 - 0.000562770562770581*G0_1_0_5_4_1 - 0.000735930735930762*G0_1_0_5_4_2 + 0.00259740259740268*G0_1_0_5_4_3 + 0.00251082251082259*G0_1_0_5_4_4 + 0.00138528138528143*G0_1_0_5_4_5 - 0.0014718614718615*G0_1_0_5_5_0 - 0.0020346320346321*G0_1_0_5_5_1 - 0.000129870129870135*G0_1_0_5_5_2 + 0.00173160173160179*G0_1_0_5_5_3 + 0.00138528138528143*G0_1_0_5_5_4 - 0.0109090909090913*G0_1_0_5_5_5; + A[8] = -A[3] + 0.0668019480519503*G0_0_0_0_0_0 - 0.00252435064935073*G0_0_0_0_0_1 - 0.00531114718614736*G0_0_0_0_0_2 + 0.00134199134199138*G0_0_0_0_0_3 + 0.0233225108225116*G0_0_0_0_0_4 + 0.010119047619048*G0_0_0_0_0_5 - 0.00252435064935073*G0_0_0_0_1_0 - 0.000703463203463227*G0_0_0_0_1_1 + 0.000201569264069271*G0_0_0_0_1_2 - 0.000974025974026008*G0_0_0_0_1_4 - 0.00531114718614736*G0_0_0_0_2_0 + 0.000201569264069271*G0_0_0_0_2_1 + 0.000533008658008674*G0_0_0_0_2_2 + 0.000508658008658024*G0_0_0_0_2_3 - 0.00305194805194815*G0_0_0_0_2_4 + 0.00134199134199138*G0_0_0_0_3_0 + 0.000508658008658024*G0_0_0_0_3_2 - 0.000735930735930766*G0_0_0_0_3_3 - 0.00073593073593076*G0_0_0_0_3_4 - 0.00272727272727282*G0_0_0_0_3_5 + 0.0233225108225116*G0_0_0_0_4_0 - 0.000974025974026008*G0_0_0_0_4_1 - 0.00305194805194815*G0_0_0_0_4_2 - 0.00073593073593076*G0_0_0_0_4_3 + 0.0206060606060613*G0_0_0_0_4_4 + 0.00190476190476198*G0_0_0_0_4_5 + 0.010119047619048*G0_0_0_0_5_0 - 0.00272727272727282*G0_0_0_0_5_3 + 0.00190476190476198*G0_0_0_0_5_4 - 0.0075324675324678*G0_0_0_0_5_5 - 0.00252435064935073*G0_0_0_1_0_0 - 0.000703463203463227*G0_0_0_1_0_1 + 0.000201569264069271*G0_0_0_1_0_2 - 0.000974025974026008*G0_0_0_1_0_4 - 0.000703463203463227*G0_0_0_1_1_0 + 0.0183441558441565*G0_0_0_1_1_1 - 0.00119047619047623*G0_0_0_1_1_2 + 0.0043019480519482*G0_0_0_1_1_3 + 0.000514069264069279*G0_0_0_1_1_4 + 0.0028409090909092*G0_0_0_1_1_5 + 0.000201569264069271*G0_0_0_1_2_0 - 0.00119047619047623*G0_0_0_1_2_1 - 0.000162337662337669*G0_0_0_1_2_2 + 0.000487012987013003*G0_0_0_1_2_3 + 0.000681818181818204*G0_0_0_1_2_4 + 0.0043019480519482*G0_0_0_1_3_1 + 0.000487012987013003*G0_0_0_1_3_2 + 0.00173160173160179*G0_0_0_1_3_3 - 0.00108225108225112*G0_0_0_1_3_4 - 0.000108225108225105*G0_0_0_1_3_5 - 0.000974025974026008*G0_0_0_1_4_0 + 0.000514069264069279*G0_0_0_1_4_1 + 0.000681818181818204*G0_0_0_1_4_2 - 0.00108225108225112*G0_0_0_1_4_3 - 0.00216450216450224*G0_0_0_1_4_4 - 0.00108225108225112*G0_0_0_1_4_5 + 0.0028409090909092*G0_0_0_1_5_1 - 0.000108225108225105*G0_0_0_1_5_3 - 0.00108225108225112*G0_0_0_1_5_4 + 0.00367965367965383*G0_0_0_1_5_5 - 0.00531114718614736*G0_0_0_2_0_0 + 0.000201569264069271*G0_0_0_2_0_1 + 0.000533008658008674*G0_0_0_2_0_2 + 0.000508658008658024*G0_0_0_2_0_3 - 0.00305194805194815*G0_0_0_2_0_4 + 0.000201569264069271*G0_0_0_2_1_0 - 0.00119047619047623*G0_0_0_2_1_1 - 0.000162337662337669*G0_0_0_2_1_2 + 0.000487012987013003*G0_0_0_2_1_3 + 0.000681818181818204*G0_0_0_2_1_4 + 0.000533008658008674*G0_0_0_2_2_0 - 0.000162337662337669*G0_0_0_2_2_1 + 0.00748376623376652*G0_0_0_2_2_2 + 0.0006709956709957*G0_0_0_2_2_3 + 0.00160173160173167*G0_0_0_2_2_4 + 0.000854978354978385*G0_0_0_2_2_5 + 0.000508658008658024*G0_0_0_2_3_0 + 0.000487012987013003*G0_0_0_2_3_1 + 0.0006709956709957*G0_0_0_2_3_2 - 0.00441558441558456*G0_0_0_2_3_3 - 0.00238095238095245*G0_0_0_2_3_4 - 0.00272727272727282*G0_0_0_2_3_5 - 0.00305194805194815*G0_0_0_2_4_0 + 0.000681818181818204*G0_0_0_2_4_1 + 0.00160173160173167*G0_0_0_2_4_2 - 0.00238095238095245*G0_0_0_2_4_3 - 0.0105627705627709*G0_0_0_2_4_4 - 0.00307359307359318*G0_0_0_2_4_5 + 0.000854978354978385*G0_0_0_2_5_2 - 0.00272727272727282*G0_0_0_2_5_3 - 0.00307359307359318*G0_0_0_2_5_4 - 0.00385281385281398*G0_0_0_2_5_5 + 0.00134199134199138*G0_0_0_3_0_0 + 0.000508658008658024*G0_0_0_3_0_2 - 0.000735930735930766*G0_0_0_3_0_3 - 0.00073593073593076*G0_0_0_3_0_4 - 0.00272727272727282*G0_0_0_3_0_5 + 0.0043019480519482*G0_0_0_3_1_1 + 0.000487012987013003*G0_0_0_3_1_2 + 0.00173160173160178*G0_0_0_3_1_3 - 0.00108225108225112*G0_0_0_3_1_4 - 0.000108225108225105*G0_0_0_3_1_5 + 0.000508658008658024*G0_0_0_3_2_0 + 0.000487012987013003*G0_0_0_3_2_1 + 0.0006709956709957*G0_0_0_3_2_2 - 0.00441558441558456*G0_0_0_3_2_3 - 0.00238095238095245*G0_0_0_3_2_4 - 0.00272727272727282*G0_0_0_3_2_5 - 0.000735930735930766*G0_0_0_3_3_0 + 0.00173160173160178*G0_0_0_3_3_1 - 0.00441558441558456*G0_0_0_3_3_2 - 0.0400000000000014*G0_0_0_3_3_3 + 0.00363636363636375*G0_0_0_3_3_4 + 0.00692640692640715*G0_0_0_3_3_5 - 0.00073593073593076*G0_0_0_3_4_0 - 0.00108225108225112*G0_0_0_3_4_1 - 0.00238095238095245*G0_0_0_3_4_2 + 0.00363636363636375*G0_0_0_3_4_3 + 0.00580086580086598*G0_0_0_3_4_4 + 0.00761904761904786*G0_0_0_3_4_5 - 0.00272727272727282*G0_0_0_3_5_0 - 0.000108225108225105*G0_0_0_3_5_1 - 0.00272727272727282*G0_0_0_3_5_2 + 0.00692640692640714*G0_0_0_3_5_3 + 0.00761904761904786*G0_0_0_3_5_4 + 0.0131601731601736*G0_0_0_3_5_5 + 0.0233225108225116*G0_0_0_4_0_0 - 0.000974025974026008*G0_0_0_4_0_1 - 0.00305194805194815*G0_0_0_4_0_2 - 0.00073593073593076*G0_0_0_4_0_3 + 0.0206060606060613*G0_0_0_4_0_4 + 0.00190476190476198*G0_0_0_4_0_5 - 0.000974025974026008*G0_0_0_4_1_0 + 0.000514069264069279*G0_0_0_4_1_1 + 0.000681818181818204*G0_0_0_4_1_2 - 0.00108225108225112*G0_0_0_4_1_3 - 0.00216450216450224*G0_0_0_4_1_4 - 0.00108225108225112*G0_0_0_4_1_5 - 0.00305194805194815*G0_0_0_4_2_0 + 0.000681818181818204*G0_0_0_4_2_1 + 0.00160173160173166*G0_0_0_4_2_2 - 0.00238095238095245*G0_0_0_4_2_3 - 0.0105627705627709*G0_0_0_4_2_4 - 0.00307359307359318*G0_0_0_4_2_5 - 0.00073593073593076*G0_0_0_4_3_0 - 0.00108225108225112*G0_0_0_4_3_1 - 0.00238095238095245*G0_0_0_4_3_2 + 0.00363636363636375*G0_0_0_4_3_3 + 0.00580086580086598*G0_0_0_4_3_4 + 0.00761904761904786*G0_0_0_4_3_5 + 0.0206060606060613*G0_0_0_4_4_0 - 0.00216450216450224*G0_0_0_4_4_1 - 0.0105627705627709*G0_0_0_4_4_2 + 0.00580086580086598*G0_0_0_4_4_3 + 0.0215584415584423*G0_0_0_4_4_4 + 0.0104761904761908*G0_0_0_4_4_5 + 0.00190476190476198*G0_0_0_4_5_0 - 0.00108225108225112*G0_0_0_4_5_1 - 0.00307359307359318*G0_0_0_4_5_2 + 0.00761904761904786*G0_0_0_4_5_3 + 0.0104761904761908*G0_0_0_4_5_4 + 0.00987012987013018*G0_0_0_4_5_5 + 0.010119047619048*G0_0_0_5_0_0 - 0.00272727272727282*G0_0_0_5_0_3 + 0.00190476190476198*G0_0_0_5_0_4 - 0.0075324675324678*G0_0_0_5_0_5 + 0.0028409090909092*G0_0_0_5_1_1 - 0.000108225108225105*G0_0_0_5_1_3 - 0.00108225108225112*G0_0_0_5_1_4 + 0.00367965367965383*G0_0_0_5_1_5 + 0.000854978354978385*G0_0_0_5_2_2 - 0.00272727272727282*G0_0_0_5_2_3 - 0.00307359307359318*G0_0_0_5_2_4 - 0.00385281385281398*G0_0_0_5_2_5 - 0.00272727272727282*G0_0_0_5_3_0 - 0.000108225108225105*G0_0_0_5_3_1 - 0.00272727272727282*G0_0_0_5_3_2 + 0.00692640692640714*G0_0_0_5_3_3 + 0.00761904761904786*G0_0_0_5_3_4 + 0.0131601731601736*G0_0_0_5_3_5 + 0.00190476190476198*G0_0_0_5_4_0 - 0.00108225108225112*G0_0_0_5_4_1 - 0.00307359307359318*G0_0_0_5_4_2 + 0.00761904761904786*G0_0_0_5_4_3 + 0.0104761904761908*G0_0_0_5_4_4 + 0.00987012987013018*G0_0_0_5_4_5 - 0.0075324675324678*G0_0_0_5_5_0 + 0.00367965367965383*G0_0_0_5_5_1 - 0.00385281385281398*G0_0_0_5_5_2 + 0.0131601731601736*G0_0_0_5_5_3 + 0.00987012987013018*G0_0_0_5_5_4 + 0.0161038961038966*G0_0_0_5_5_5 + 0.0668019480519503*G0_1_0_0_0_0 - 0.00252435064935073*G0_1_0_0_0_1 - 0.00531114718614736*G0_1_0_0_0_2 + 0.00134199134199138*G0_1_0_0_0_3 + 0.0233225108225116*G0_1_0_0_0_4 + 0.010119047619048*G0_1_0_0_0_5 - 0.00252435064935073*G0_1_0_0_1_0 - 0.000703463203463227*G0_1_0_0_1_1 + 0.000201569264069271*G0_1_0_0_1_2 - 0.000974025974026008*G0_1_0_0_1_4 - 0.00531114718614736*G0_1_0_0_2_0 + 0.000201569264069271*G0_1_0_0_2_1 + 0.000533008658008674*G0_1_0_0_2_2 + 0.000508658008658024*G0_1_0_0_2_3 - 0.00305194805194815*G0_1_0_0_2_4 + 0.00134199134199138*G0_1_0_0_3_0 + 0.000508658008658024*G0_1_0_0_3_2 - 0.000735930735930764*G0_1_0_0_3_3 - 0.000735930735930759*G0_1_0_0_3_4 - 0.00272727272727282*G0_1_0_0_3_5 + 0.0233225108225116*G0_1_0_0_4_0 - 0.000974025974026007*G0_1_0_0_4_1 - 0.00305194805194815*G0_1_0_0_4_2 - 0.000735930735930759*G0_1_0_0_4_3 + 0.0206060606060613*G0_1_0_0_4_4 + 0.00190476190476198*G0_1_0_0_4_5 + 0.010119047619048*G0_1_0_0_5_0 - 0.00272727272727282*G0_1_0_0_5_3 + 0.00190476190476198*G0_1_0_0_5_4 - 0.0075324675324678*G0_1_0_0_5_5 - 0.00252435064935073*G0_1_0_1_0_0 - 0.000703463203463227*G0_1_0_1_0_1 + 0.000201569264069271*G0_1_0_1_0_2 - 0.000974025974026007*G0_1_0_1_0_4 - 0.000703463203463227*G0_1_0_1_1_0 + 0.0183441558441565*G0_1_0_1_1_1 - 0.00119047619047623*G0_1_0_1_1_2 + 0.00430194805194819*G0_1_0_1_1_3 + 0.000514069264069279*G0_1_0_1_1_4 + 0.0028409090909092*G0_1_0_1_1_5 + 0.000201569264069271*G0_1_0_1_2_0 - 0.00119047619047623*G0_1_0_1_2_1 - 0.000162337662337669*G0_1_0_1_2_2 + 0.000487012987013003*G0_1_0_1_2_3 + 0.000681818181818204*G0_1_0_1_2_4 + 0.00430194805194819*G0_1_0_1_3_1 + 0.000487012987013004*G0_1_0_1_3_2 + 0.00173160173160179*G0_1_0_1_3_3 - 0.00108225108225112*G0_1_0_1_3_4 - 0.000108225108225105*G0_1_0_1_3_5 - 0.000974025974026008*G0_1_0_1_4_0 + 0.000514069264069279*G0_1_0_1_4_1 + 0.000681818181818204*G0_1_0_1_4_2 - 0.00108225108225112*G0_1_0_1_4_3 - 0.00216450216450224*G0_1_0_1_4_4 - 0.00108225108225112*G0_1_0_1_4_5 + 0.0028409090909092*G0_1_0_1_5_1 - 0.000108225108225105*G0_1_0_1_5_3 - 0.00108225108225112*G0_1_0_1_5_4 + 0.00367965367965383*G0_1_0_1_5_5 - 0.00531114718614736*G0_1_0_2_0_0 + 0.000201569264069271*G0_1_0_2_0_1 + 0.000533008658008674*G0_1_0_2_0_2 + 0.000508658008658024*G0_1_0_2_0_3 - 0.00305194805194815*G0_1_0_2_0_4 + 0.000201569264069271*G0_1_0_2_1_0 - 0.00119047619047623*G0_1_0_2_1_1 - 0.000162337662337669*G0_1_0_2_1_2 + 0.000487012987013004*G0_1_0_2_1_3 + 0.000681818181818204*G0_1_0_2_1_4 + 0.000533008658008674*G0_1_0_2_2_0 - 0.000162337662337669*G0_1_0_2_2_1 + 0.00748376623376652*G0_1_0_2_2_2 + 0.000670995670995699*G0_1_0_2_2_3 + 0.00160173160173166*G0_1_0_2_2_4 + 0.000854978354978384*G0_1_0_2_2_5 + 0.000508658008658024*G0_1_0_2_3_0 + 0.000487012987013004*G0_1_0_2_3_1 + 0.000670995670995699*G0_1_0_2_3_2 - 0.00441558441558456*G0_1_0_2_3_3 - 0.00238095238095246*G0_1_0_2_3_4 - 0.00272727272727282*G0_1_0_2_3_5 - 0.00305194805194815*G0_1_0_2_4_0 + 0.000681818181818204*G0_1_0_2_4_1 + 0.00160173160173166*G0_1_0_2_4_2 - 0.00238095238095246*G0_1_0_2_4_3 - 0.0105627705627709*G0_1_0_2_4_4 - 0.00307359307359318*G0_1_0_2_4_5 + 0.000854978354978384*G0_1_0_2_5_2 - 0.00272727272727282*G0_1_0_2_5_3 - 0.00307359307359318*G0_1_0_2_5_4 - 0.00385281385281398*G0_1_0_2_5_5 + 0.00134199134199138*G0_1_0_3_0_0 + 0.000508658008658024*G0_1_0_3_0_2 - 0.000735930735930763*G0_1_0_3_0_3 - 0.000735930735930759*G0_1_0_3_0_4 - 0.00272727272727282*G0_1_0_3_0_5 + 0.00430194805194819*G0_1_0_3_1_1 + 0.000487012987013004*G0_1_0_3_1_2 + 0.00173160173160179*G0_1_0_3_1_3 - 0.00108225108225112*G0_1_0_3_1_4 - 0.000108225108225105*G0_1_0_3_1_5 + 0.000508658008658024*G0_1_0_3_2_0 + 0.000487012987013004*G0_1_0_3_2_1 + 0.000670995670995699*G0_1_0_3_2_2 - 0.00441558441558456*G0_1_0_3_2_3 - 0.00238095238095246*G0_1_0_3_2_4 - 0.00272727272727282*G0_1_0_3_2_5 - 0.000735930735930763*G0_1_0_3_3_0 + 0.00173160173160179*G0_1_0_3_3_1 - 0.00441558441558456*G0_1_0_3_3_2 - 0.0400000000000014*G0_1_0_3_3_3 + 0.00363636363636374*G0_1_0_3_3_4 + 0.00692640692640714*G0_1_0_3_3_5 - 0.000735930735930759*G0_1_0_3_4_0 - 0.00108225108225112*G0_1_0_3_4_1 - 0.00238095238095246*G0_1_0_3_4_2 + 0.00363636363636374*G0_1_0_3_4_3 + 0.00580086580086597*G0_1_0_3_4_4 + 0.00761904761904786*G0_1_0_3_4_5 - 0.00272727272727282*G0_1_0_3_5_0 - 0.000108225108225105*G0_1_0_3_5_1 - 0.00272727272727282*G0_1_0_3_5_2 + 0.00692640692640714*G0_1_0_3_5_3 + 0.00761904761904786*G0_1_0_3_5_4 + 0.0131601731601736*G0_1_0_3_5_5 + 0.0233225108225116*G0_1_0_4_0_0 - 0.000974025974026008*G0_1_0_4_0_1 - 0.00305194805194815*G0_1_0_4_0_2 - 0.000735930735930759*G0_1_0_4_0_3 + 0.0206060606060613*G0_1_0_4_0_4 + 0.00190476190476198*G0_1_0_4_0_5 - 0.000974025974026008*G0_1_0_4_1_0 + 0.000514069264069279*G0_1_0_4_1_1 + 0.000681818181818204*G0_1_0_4_1_2 - 0.00108225108225112*G0_1_0_4_1_3 - 0.00216450216450224*G0_1_0_4_1_4 - 0.00108225108225111*G0_1_0_4_1_5 - 0.00305194805194815*G0_1_0_4_2_0 + 0.000681818181818204*G0_1_0_4_2_1 + 0.00160173160173166*G0_1_0_4_2_2 - 0.00238095238095246*G0_1_0_4_2_3 - 0.0105627705627709*G0_1_0_4_2_4 - 0.00307359307359317*G0_1_0_4_2_5 - 0.000735930735930759*G0_1_0_4_3_0 - 0.00108225108225112*G0_1_0_4_3_1 - 0.00238095238095246*G0_1_0_4_3_2 + 0.00363636363636374*G0_1_0_4_3_3 + 0.00580086580086597*G0_1_0_4_3_4 + 0.00761904761904786*G0_1_0_4_3_5 + 0.0206060606060613*G0_1_0_4_4_0 - 0.00216450216450224*G0_1_0_4_4_1 - 0.0105627705627709*G0_1_0_4_4_2 + 0.00580086580086597*G0_1_0_4_4_3 + 0.0215584415584423*G0_1_0_4_4_4 + 0.0104761904761908*G0_1_0_4_4_5 + 0.00190476190476198*G0_1_0_4_5_0 - 0.00108225108225111*G0_1_0_4_5_1 - 0.00307359307359318*G0_1_0_4_5_2 + 0.00761904761904786*G0_1_0_4_5_3 + 0.0104761904761908*G0_1_0_4_5_4 + 0.00987012987013018*G0_1_0_4_5_5 + 0.010119047619048*G0_1_0_5_0_0 - 0.00272727272727282*G0_1_0_5_0_3 + 0.00190476190476198*G0_1_0_5_0_4 - 0.0075324675324678*G0_1_0_5_0_5 + 0.0028409090909092*G0_1_0_5_1_1 - 0.000108225108225105*G0_1_0_5_1_3 - 0.00108225108225112*G0_1_0_5_1_4 + 0.00367965367965383*G0_1_0_5_1_5 + 0.000854978354978384*G0_1_0_5_2_2 - 0.00272727272727282*G0_1_0_5_2_3 - 0.00307359307359318*G0_1_0_5_2_4 - 0.00385281385281398*G0_1_0_5_2_5 - 0.00272727272727282*G0_1_0_5_3_0 - 0.000108225108225105*G0_1_0_5_3_1 - 0.00272727272727282*G0_1_0_5_3_2 + 0.00692640692640714*G0_1_0_5_3_3 + 0.00761904761904786*G0_1_0_5_3_4 + 0.0131601731601736*G0_1_0_5_3_5 + 0.00190476190476198*G0_1_0_5_4_0 - 0.00108225108225112*G0_1_0_5_4_1 - 0.00307359307359318*G0_1_0_5_4_2 + 0.00761904761904786*G0_1_0_5_4_3 + 0.0104761904761908*G0_1_0_5_4_4 + 0.00987012987013018*G0_1_0_5_4_5 - 0.0075324675324678*G0_1_0_5_5_0 + 0.00367965367965383*G0_1_0_5_5_1 - 0.00385281385281398*G0_1_0_5_5_2 + 0.0131601731601736*G0_1_0_5_5_3 + 0.00987012987013018*G0_1_0_5_5_4 + 0.0161038961038966*G0_1_0_5_5_5; + A[12] = 0.00153409090909096*G0_0_1_0_0_0 + 0.000120851370851375*G0_0_1_0_0_1 + 0.000120851370851375*G0_0_1_0_0_2 + 9.92063492063519e-05*G0_0_1_0_0_3 + 0.000297619047619057*G0_0_1_0_0_4 + 0.000297619047619056*G0_0_1_0_0_5 + 0.000120851370851375*G0_0_1_0_1_0 - 0.00109397546897551*G0_0_1_0_1_1 + 7.35028860028885e-05*G0_0_1_0_1_2 - 9.74025974026005e-05*G0_0_1_0_1_3 + 0.000102813852813856*G0_0_1_0_1_4 - 0.000678210678210701*G0_0_1_0_1_5 + 0.000120851370851375*G0_0_1_0_2_0 + 7.35028860028885e-05*G0_0_1_0_2_1 - 0.00109397546897551*G0_0_1_0_2_2 - 9.74025974026016e-05*G0_0_1_0_2_3 - 0.000678210678210702*G0_0_1_0_2_4 + 0.000102813852813856*G0_0_1_0_2_5 + 9.92063492063519e-05*G0_0_1_0_3_0 - 9.74025974026004e-05*G0_0_1_0_3_1 - 9.74025974026016e-05*G0_0_1_0_3_2 - 2.88600288600292e-05*G0_0_1_0_3_3 - 0.000404040404040417*G0_0_1_0_3_4 - 0.000404040404040417*G0_0_1_0_3_5 + 0.000297619047619057*G0_0_1_0_4_0 + 0.000102813852813856*G0_0_1_0_4_1 - 0.000678210678210702*G0_0_1_0_4_2 - 0.000404040404040417*G0_0_1_0_4_3 - 0.00212121212121219*G0_0_1_0_4_4 - 0.000411255411255424*G0_0_1_0_4_5 + 0.000297619047619056*G0_0_1_0_5_0 - 0.0006782106782107*G0_0_1_0_5_1 + 0.000102813852813856*G0_0_1_0_5_2 - 0.000404040404040417*G0_0_1_0_5_3 - 0.000411255411255424*G0_0_1_0_5_4 - 0.00212121212121219*G0_0_1_0_5_5 + 0.000120851370851375*G0_0_1_1_0_0 - 0.00109397546897551*G0_0_1_1_0_1 + 7.35028860028885e-05*G0_0_1_1_0_2 - 9.74025974026005e-05*G0_0_1_1_0_3 + 0.000102813852813856*G0_0_1_1_0_4 - 0.000678210678210701*G0_0_1_1_0_5 - 0.00109397546897551*G0_0_1_1_1_0 + 0.0141233766233771*G0_0_1_1_1_1 - 0.00049873737373739*G0_0_1_1_1_2 + 0.00173160173160179*G0_0_1_1_1_3 + 0.000212842712842718*G0_0_1_1_1_4 + 0.00487012987013005*G0_0_1_1_1_5 + 7.35028860028885e-05*G0_0_1_1_2_0 - 0.00049873737373739*G0_0_1_1_2_1 - 0.000498737373737392*G0_0_1_1_2_2 + 0.000165945165945172*G0_0_1_1_2_3 - 0.00018398268398269*G0_0_1_1_2_4 - 0.00018398268398269*G0_0_1_1_2_5 - 9.74025974026004e-05*G0_0_1_1_3_0 + 0.00173160173160179*G0_0_1_1_3_1 + 0.000165945165945172*G0_0_1_1_3_2 - 0.000346320346320361*G0_0_1_1_3_3 - 0.000230880230880239*G0_0_1_1_3_4 + 0.000562770562770582*G0_0_1_1_3_5 + 0.000102813852813856*G0_0_1_1_4_0 + 0.000212842712842718*G0_0_1_1_4_1 - 0.00018398268398269*G0_0_1_1_4_2 - 0.000230880230880239*G0_0_1_1_4_3 - 0.000418470418470432*G0_0_1_1_4_4 - 5.77200577200606e-05*G0_0_1_1_4_5 - 0.0006782106782107*G0_0_1_1_5_0 + 0.00487012987013005*G0_0_1_1_5_1 - 0.00018398268398269*G0_0_1_1_5_2 + 0.000562770562770583*G0_0_1_1_5_3 - 5.77200577200606e-05*G0_0_1_1_5_4 + 0.00441558441558457*G0_0_1_1_5_5 + 0.000120851370851375*G0_0_1_2_0_0 + 7.35028860028885e-05*G0_0_1_2_0_1 - 0.00109397546897551*G0_0_1_2_0_2 - 9.74025974026016e-05*G0_0_1_2_0_3 - 0.000678210678210702*G0_0_1_2_0_4 + 0.000102813852813856*G0_0_1_2_0_5 + 7.35028860028885e-05*G0_0_1_2_1_0 - 0.00049873737373739*G0_0_1_2_1_1 - 0.000498737373737392*G0_0_1_2_1_2 + 0.000165945165945172*G0_0_1_2_1_3 - 0.00018398268398269*G0_0_1_2_1_4 - 0.00018398268398269*G0_0_1_2_1_5 - 0.00109397546897551*G0_0_1_2_2_0 - 0.000498737373737392*G0_0_1_2_2_1 + 0.0141233766233772*G0_0_1_2_2_2 + 0.0017316017316018*G0_0_1_2_2_3 + 0.00487012987013005*G0_0_1_2_2_4 + 0.000212842712842723*G0_0_1_2_2_5 - 9.74025974026017e-05*G0_0_1_2_3_0 + 0.000165945165945172*G0_0_1_2_3_1 + 0.0017316017316018*G0_0_1_2_3_2 - 0.000346320346320353*G0_0_1_2_3_3 + 0.000562770562770585*G0_0_1_2_3_4 - 0.000230880230880237*G0_0_1_2_3_5 - 0.000678210678210702*G0_0_1_2_4_0 - 0.00018398268398269*G0_0_1_2_4_1 + 0.00487012987013005*G0_0_1_2_4_2 + 0.000562770562770585*G0_0_1_2_4_3 + 0.00441558441558457*G0_0_1_2_4_4 - 5.77200577200582e-05*G0_0_1_2_4_5 + 0.000102813852813856*G0_0_1_2_5_0 - 0.00018398268398269*G0_0_1_2_5_1 + 0.000212842712842723*G0_0_1_2_5_2 - 0.000230880230880237*G0_0_1_2_5_3 - 5.77200577200583e-05*G0_0_1_2_5_4 - 0.000418470418470432*G0_0_1_2_5_5 + 9.92063492063519e-05*G0_0_1_3_0_0 - 9.74025974026004e-05*G0_0_1_3_0_1 - 9.74025974026016e-05*G0_0_1_3_0_2 - 2.88600288600292e-05*G0_0_1_3_0_3 - 0.000404040404040417*G0_0_1_3_0_4 - 0.000404040404040417*G0_0_1_3_0_5 - 9.74025974026004e-05*G0_0_1_3_1_0 + 0.00173160173160179*G0_0_1_3_1_1 + 0.000165945165945172*G0_0_1_3_1_2 - 0.000346320346320361*G0_0_1_3_1_3 - 0.000230880230880239*G0_0_1_3_1_4 + 0.000562770562770582*G0_0_1_3_1_5 - 9.74025974026017e-05*G0_0_1_3_2_0 + 0.000165945165945172*G0_0_1_3_2_1 + 0.0017316017316018*G0_0_1_3_2_2 - 0.000346320346320353*G0_0_1_3_2_3 + 0.000562770562770585*G0_0_1_3_2_4 - 0.000230880230880237*G0_0_1_3_2_5 - 2.88600288600292e-05*G0_0_1_3_3_0 - 0.000346320346320361*G0_0_1_3_3_1 - 0.000346320346320353*G0_0_1_3_3_2 - 0.00571428571428593*G0_0_1_3_3_3 + 0.000519480519480535*G0_0_1_3_3_4 + 0.000519480519480532*G0_0_1_3_3_5 - 0.000404040404040417*G0_0_1_3_4_0 - 0.000230880230880239*G0_0_1_3_4_1 + 0.000562770562770585*G0_0_1_3_4_2 + 0.000519480519480534*G0_0_1_3_4_3 + 0.0016450216450217*G0_0_1_3_4_4 + 0.000923520923520953*G0_0_1_3_4_5 - 0.000404040404040417*G0_0_1_3_5_0 + 0.000562770562770583*G0_0_1_3_5_1 - 0.000230880230880237*G0_0_1_3_5_2 + 0.000519480519480531*G0_0_1_3_5_3 + 0.000923520923520953*G0_0_1_3_5_4 + 0.0016450216450217*G0_0_1_3_5_5 + 0.000297619047619057*G0_0_1_4_0_0 + 0.000102813852813856*G0_0_1_4_0_1 - 0.000678210678210702*G0_0_1_4_0_2 - 0.000404040404040417*G0_0_1_4_0_3 - 0.00212121212121219*G0_0_1_4_0_4 - 0.000411255411255424*G0_0_1_4_0_5 + 0.000102813852813856*G0_0_1_4_1_0 + 0.000212842712842718*G0_0_1_4_1_1 - 0.00018398268398269*G0_0_1_4_1_2 - 0.000230880230880239*G0_0_1_4_1_3 - 0.000418470418470432*G0_0_1_4_1_4 - 5.77200577200606e-05*G0_0_1_4_1_5 - 0.000678210678210702*G0_0_1_4_2_0 - 0.00018398268398269*G0_0_1_4_2_1 + 0.00487012987013005*G0_0_1_4_2_2 + 0.000562770562770585*G0_0_1_4_2_3 + 0.00441558441558457*G0_0_1_4_2_4 - 5.77200577200583e-05*G0_0_1_4_2_5 - 0.000404040404040417*G0_0_1_4_3_0 - 0.000230880230880239*G0_0_1_4_3_1 + 0.000562770562770585*G0_0_1_4_3_2 + 0.000519480519480534*G0_0_1_4_3_3 + 0.0016450216450217*G0_0_1_4_3_4 + 0.000923520923520953*G0_0_1_4_3_5 - 0.00212121212121219*G0_0_1_4_4_0 - 0.000418470418470432*G0_0_1_4_4_1 + 0.00441558441558457*G0_0_1_4_4_2 + 0.0016450216450217*G0_0_1_4_4_3 + 0.00441558441558457*G0_0_1_4_4_4 + 0.000952380952380986*G0_0_1_4_4_5 - 0.000411255411255424*G0_0_1_4_5_0 - 5.77200577200606e-05*G0_0_1_4_5_1 - 5.77200577200583e-05*G0_0_1_4_5_2 + 0.000923520923520953*G0_0_1_4_5_3 + 0.000952380952380986*G0_0_1_4_5_4 + 0.000952380952380983*G0_0_1_4_5_5 + 0.000297619047619056*G0_0_1_5_0_0 - 0.000678210678210701*G0_0_1_5_0_1 + 0.000102813852813856*G0_0_1_5_0_2 - 0.000404040404040417*G0_0_1_5_0_3 - 0.000411255411255424*G0_0_1_5_0_4 - 0.00212121212121219*G0_0_1_5_0_5 - 0.0006782106782107*G0_0_1_5_1_0 + 0.00487012987013005*G0_0_1_5_1_1 - 0.00018398268398269*G0_0_1_5_1_2 + 0.000562770562770583*G0_0_1_5_1_3 - 5.77200577200606e-05*G0_0_1_5_1_4 + 0.00441558441558457*G0_0_1_5_1_5 + 0.000102813852813856*G0_0_1_5_2_0 - 0.00018398268398269*G0_0_1_5_2_1 + 0.000212842712842723*G0_0_1_5_2_2 - 0.000230880230880237*G0_0_1_5_2_3 - 5.77200577200583e-05*G0_0_1_5_2_4 - 0.000418470418470432*G0_0_1_5_2_5 - 0.000404040404040417*G0_0_1_5_3_0 + 0.000562770562770583*G0_0_1_5_3_1 - 0.000230880230880237*G0_0_1_5_3_2 + 0.000519480519480531*G0_0_1_5_3_3 + 0.000923520923520953*G0_0_1_5_3_4 + 0.0016450216450217*G0_0_1_5_3_5 - 0.000411255411255424*G0_0_1_5_4_0 - 5.77200577200606e-05*G0_0_1_5_4_1 - 5.77200577200583e-05*G0_0_1_5_4_2 + 0.000923520923520953*G0_0_1_5_4_3 + 0.000952380952380985*G0_0_1_5_4_4 + 0.000952380952380983*G0_0_1_5_4_5 - 0.00212121212121219*G0_0_1_5_5_0 + 0.00441558441558457*G0_0_1_5_5_1 - 0.000418470418470432*G0_0_1_5_5_2 + 0.0016450216450217*G0_0_1_5_5_3 + 0.000952380952380983*G0_0_1_5_5_4 + 0.00441558441558456*G0_0_1_5_5_5; + A[10] = -A[12] - 0.0141233766233771*G0_0_0_0_0_0 + 0.000498737373737389*G0_0_0_0_0_1 + 0.00109397546897551*G0_0_0_0_0_2 - 0.000212842712842718*G0_0_0_0_0_3 - 0.00487012987013003*G0_0_0_0_0_4 - 0.00173160173160179*G0_0_0_0_0_5 + 0.000498737373737389*G0_0_0_0_1_0 + 0.000498737373737392*G0_0_0_0_1_1 + 0.000183982683982691*G0_0_0_0_1_3 + 0.00018398268398269*G0_0_0_0_1_4 - 0.00016594516594517*G0_0_0_0_1_5 + 0.00109397546897551*G0_0_0_0_2_0 - 0.000120851370851374*G0_0_0_0_2_2 - 0.000102813852813856*G0_0_0_0_2_3 + 0.000678210678210701*G0_0_0_0_2_4 - 0.000212842712842718*G0_0_0_0_3_0 + 0.000183982683982691*G0_0_0_0_3_1 - 0.000102813852813856*G0_0_0_0_3_2 + 0.000418470418470432*G0_0_0_0_3_3 + 0.000230880230880239*G0_0_0_0_3_5 - 0.00487012987013003*G0_0_0_0_4_0 + 0.00018398268398269*G0_0_0_0_4_1 + 0.000678210678210701*G0_0_0_0_4_2 - 0.00441558441558456*G0_0_0_0_4_4 - 0.000562770562770582*G0_0_0_0_4_5 - 0.00173160173160179*G0_0_0_0_5_0 - 0.00016594516594517*G0_0_0_0_5_1 + 0.000230880230880239*G0_0_0_0_5_3 - 0.000562770562770582*G0_0_0_0_5_4 + 0.000346320346320361*G0_0_0_0_5_5 + 0.000498737373737389*G0_0_0_1_0_0 + 0.000498737373737391*G0_0_0_1_0_1 + 0.000183982683982691*G0_0_0_1_0_3 + 0.00018398268398269*G0_0_0_1_0_4 - 0.00016594516594517*G0_0_0_1_0_5 + 0.000498737373737391*G0_0_0_1_1_0 - 0.0141233766233771*G0_0_0_1_1_1 + 0.00109397546897551*G0_0_0_1_1_2 - 0.00487012987013004*G0_0_0_1_1_3 - 0.000212842712842719*G0_0_0_1_1_4 - 0.00173160173160181*G0_0_0_1_1_5 + 0.00109397546897551*G0_0_0_1_2_1 - 0.000120851370851375*G0_0_0_1_2_2 + 0.000678210678210703*G0_0_0_1_2_3 - 0.000102813852813856*G0_0_0_1_2_4 + 0.000183982683982691*G0_0_0_1_3_0 - 0.00487012987013004*G0_0_0_1_3_1 + 0.000678210678210703*G0_0_0_1_3_2 - 0.00441558441558457*G0_0_0_1_3_3 - 0.000562770562770589*G0_0_0_1_3_5 + 0.00018398268398269*G0_0_0_1_4_0 - 0.000212842712842719*G0_0_0_1_4_1 - 0.000102813852813856*G0_0_0_1_4_2 + 0.000418470418470432*G0_0_0_1_4_4 + 0.000230880230880237*G0_0_0_1_4_5 - 0.00016594516594517*G0_0_0_1_5_0 - 0.00173160173160181*G0_0_0_1_5_1 - 0.000562770562770589*G0_0_0_1_5_3 + 0.000230880230880237*G0_0_0_1_5_4 + 0.000346320346320349*G0_0_0_1_5_5 + 0.00109397546897551*G0_0_0_2_0_0 - 0.000120851370851374*G0_0_0_2_0_2 - 0.000102813852813856*G0_0_0_2_0_3 + 0.000678210678210701*G0_0_0_2_0_4 + 0.00109397546897551*G0_0_0_2_1_1 - 0.000120851370851375*G0_0_0_2_1_2 + 0.000678210678210703*G0_0_0_2_1_3 - 0.000102813852813856*G0_0_0_2_1_4 - 0.000120851370851374*G0_0_0_2_2_0 - 0.000120851370851375*G0_0_0_2_2_1 - 0.00153409090909097*G0_0_0_2_2_2 - 0.00029761904761906*G0_0_0_2_2_3 - 0.000297619047619059*G0_0_0_2_2_4 - 0.000102813852813856*G0_0_0_2_3_0 + 0.000678210678210703*G0_0_0_2_3_1 - 0.00029761904761906*G0_0_0_2_3_2 + 0.00212121212121219*G0_0_0_2_3_3 + 0.000411255411255424*G0_0_0_2_3_4 + 0.000404040404040418*G0_0_0_2_3_5 + 0.000678210678210701*G0_0_0_2_4_0 - 0.000102813852813856*G0_0_0_2_4_1 - 0.000297619047619059*G0_0_0_2_4_2 + 0.000411255411255424*G0_0_0_2_4_3 + 0.00212121212121219*G0_0_0_2_4_4 + 0.000404040404040417*G0_0_0_2_4_5 + 0.000404040404040418*G0_0_0_2_5_3 + 0.000404040404040417*G0_0_0_2_5_4 - 0.000212842712842718*G0_0_0_3_0_0 + 0.000183982683982691*G0_0_0_3_0_1 - 0.000102813852813856*G0_0_0_3_0_2 + 0.000418470418470433*G0_0_0_3_0_3 + 0.000230880230880239*G0_0_0_3_0_5 + 0.000183982683982691*G0_0_0_3_1_0 - 0.00487012987013004*G0_0_0_3_1_1 + 0.000678210678210703*G0_0_0_3_1_2 - 0.00441558441558457*G0_0_0_3_1_3 - 0.000562770562770589*G0_0_0_3_1_5 - 0.000102813852813856*G0_0_0_3_2_0 + 0.000678210678210703*G0_0_0_3_2_1 - 0.00029761904761906*G0_0_0_3_2_2 + 0.00212121212121219*G0_0_0_3_2_3 + 0.000411255411255424*G0_0_0_3_2_4 + 0.000404040404040418*G0_0_0_3_2_5 + 0.000418470418470433*G0_0_0_3_3_0 - 0.00441558441558457*G0_0_0_3_3_1 + 0.00212121212121219*G0_0_0_3_3_2 - 0.00441558441558457*G0_0_0_3_3_3 - 0.000952380952380982*G0_0_0_3_3_4 - 0.0016450216450217*G0_0_0_3_3_5 + 0.000411255411255424*G0_0_0_3_4_2 - 0.000952380952380982*G0_0_0_3_4_3 - 0.000952380952380981*G0_0_0_3_4_4 - 0.000923520923520952*G0_0_0_3_4_5 + 0.000230880230880239*G0_0_0_3_5_0 - 0.000562770562770589*G0_0_0_3_5_1 + 0.000404040404040418*G0_0_0_3_5_2 - 0.0016450216450217*G0_0_0_3_5_3 - 0.000923520923520952*G0_0_0_3_5_4 - 0.000519480519480538*G0_0_0_3_5_5 - 0.00487012987013003*G0_0_0_4_0_0 + 0.00018398268398269*G0_0_0_4_0_1 + 0.000678210678210701*G0_0_0_4_0_2 - 0.00441558441558456*G0_0_0_4_0_4 - 0.000562770562770582*G0_0_0_4_0_5 + 0.00018398268398269*G0_0_0_4_1_0 - 0.000212842712842719*G0_0_0_4_1_1 - 0.000102813852813856*G0_0_0_4_1_2 + 0.000418470418470432*G0_0_0_4_1_4 + 0.000230880230880237*G0_0_0_4_1_5 + 0.000678210678210701*G0_0_0_4_2_0 - 0.000102813852813856*G0_0_0_4_2_1 - 0.000297619047619059*G0_0_0_4_2_2 + 0.000411255411255424*G0_0_0_4_2_3 + 0.00212121212121219*G0_0_0_4_2_4 + 0.000404040404040417*G0_0_0_4_2_5 + 0.000411255411255424*G0_0_0_4_3_2 - 0.000952380952380982*G0_0_0_4_3_3 - 0.000952380952380981*G0_0_0_4_3_4 - 0.000923520923520952*G0_0_0_4_3_5 - 0.00441558441558456*G0_0_0_4_4_0 + 0.000418470418470432*G0_0_0_4_4_1 + 0.00212121212121219*G0_0_0_4_4_2 - 0.000952380952380981*G0_0_0_4_4_3 - 0.00441558441558456*G0_0_0_4_4_4 - 0.0016450216450217*G0_0_0_4_4_5 - 0.000562770562770582*G0_0_0_4_5_0 + 0.000230880230880237*G0_0_0_4_5_1 + 0.000404040404040417*G0_0_0_4_5_2 - 0.000923520923520952*G0_0_0_4_5_3 - 0.0016450216450217*G0_0_0_4_5_4 - 0.000519480519480535*G0_0_0_4_5_5 - 0.00173160173160179*G0_0_0_5_0_0 - 0.00016594516594517*G0_0_0_5_0_1 + 0.000230880230880239*G0_0_0_5_0_3 - 0.000562770562770582*G0_0_0_5_0_4 + 0.000346320346320361*G0_0_0_5_0_5 - 0.00016594516594517*G0_0_0_5_1_0 - 0.00173160173160181*G0_0_0_5_1_1 - 0.000562770562770589*G0_0_0_5_1_3 + 0.000230880230880237*G0_0_0_5_1_4 + 0.000346320346320349*G0_0_0_5_1_5 + 0.000404040404040418*G0_0_0_5_2_3 + 0.000404040404040417*G0_0_0_5_2_4 + 0.000230880230880239*G0_0_0_5_3_0 - 0.000562770562770589*G0_0_0_5_3_1 + 0.000404040404040418*G0_0_0_5_3_2 - 0.0016450216450217*G0_0_0_5_3_3 - 0.000923520923520952*G0_0_0_5_3_4 - 0.000519480519480538*G0_0_0_5_3_5 - 0.000562770562770582*G0_0_0_5_4_0 + 0.000230880230880237*G0_0_0_5_4_1 + 0.000404040404040417*G0_0_0_5_4_2 - 0.000923520923520952*G0_0_0_5_4_3 - 0.0016450216450217*G0_0_0_5_4_4 - 0.000519480519480535*G0_0_0_5_4_5 + 0.000346320346320361*G0_0_0_5_5_0 + 0.000346320346320349*G0_0_0_5_5_1 - 0.000519480519480538*G0_0_0_5_5_3 - 0.000519480519480535*G0_0_0_5_5_4 + 0.00571428571428592*G0_0_0_5_5_5 - 0.0125892857142861*G0_0_1_0_0_0 + 0.000619588744588763*G0_0_1_0_0_1 + 0.00121482683982688*G0_0_1_0_0_2 - 0.000113636363636366*G0_0_1_0_0_3 - 0.00457251082251097*G0_0_1_0_0_4 - 0.00143398268398273*G0_0_1_0_0_5 + 0.000619588744588763*G0_0_1_0_1_0 - 0.000595238095238114*G0_0_1_0_1_1 + 0.000286796536796547*G0_0_1_0_1_4 - 0.000844155844155871*G0_0_1_0_1_5 + 0.00121482683982688*G0_0_1_0_2_0 - 0.00121482683982688*G0_0_1_0_2_2 - 0.000200216450216458*G0_0_1_0_2_3 + 0.000200216450216456*G0_0_1_0_2_5 - 0.000113636363636366*G0_0_1_0_3_0 - 0.000200216450216458*G0_0_1_0_3_2 + 0.000389610389610403*G0_0_1_0_3_3 - 0.000346320346320357*G0_0_1_0_3_4 - 0.000173160173160178*G0_0_1_0_3_5 - 0.00457251082251097*G0_0_1_0_4_0 + 0.000286796536796547*G0_0_1_0_4_1 - 0.000346320346320357*G0_0_1_0_4_3 - 0.00653679653679675*G0_0_1_0_4_4 - 0.000974025974026007*G0_0_1_0_4_5 - 0.00143398268398273*G0_0_1_0_5_0 - 0.000844155844155871*G0_0_1_0_5_1 + 0.000200216450216456*G0_0_1_0_5_2 - 0.000173160173160178*G0_0_1_0_5_3 - 0.000974025974026006*G0_0_1_0_5_4 - 0.00177489177489183*G0_0_1_0_5_5 + 0.000619588744588763*G0_0_1_1_0_0 - 0.000595238095238114*G0_0_1_1_0_1 + 0.000286796536796547*G0_0_1_1_0_4 - 0.000844155844155871*G0_0_1_1_0_5 - 0.000595238095238114*G0_0_1_1_1_0 + 0.000595238095238116*G0_0_1_1_1_2 - 0.00313852813852825*G0_0_1_1_1_3 + 0.00313852813852824*G0_0_1_1_1_5 + 0.000595238095238117*G0_0_1_1_2_1 - 0.000619588744588767*G0_0_1_1_2_2 + 0.000844155844155874*G0_0_1_1_2_3 - 0.000286796536796546*G0_0_1_1_2_4 - 0.00313852813852825*G0_0_1_1_3_1 + 0.000844155844155874*G0_0_1_1_3_2 - 0.00476190476190493*G0_0_1_1_3_3 - 0.00017316017316018*G0_0_1_1_3_4 + 0.000286796536796547*G0_0_1_1_4_0 - 0.000286796536796546*G0_0_1_1_4_2 - 0.00017316017316018*G0_0_1_1_4_3 + 0.000173160173160177*G0_0_1_1_4_5 - 0.000844155844155871*G0_0_1_1_5_0 + 0.00313852813852824*G0_0_1_1_5_1 + 0.000173160173160177*G0_0_1_1_5_4 + 0.00476190476190492*G0_0_1_1_5_5 + 0.00121482683982688*G0_0_1_2_0_0 - 0.00121482683982688*G0_0_1_2_0_2 - 0.000200216450216458*G0_0_1_2_0_3 + 0.000200216450216456*G0_0_1_2_0_5 + 0.000595238095238117*G0_0_1_2_1_1 - 0.000619588744588767*G0_0_1_2_1_2 + 0.000844155844155874*G0_0_1_2_1_3 - 0.000286796536796546*G0_0_1_2_1_4 - 0.00121482683982688*G0_0_1_2_2_0 - 0.000619588744588767*G0_0_1_2_2_1 + 0.0125892857142862*G0_0_1_2_2_2 + 0.00143398268398274*G0_0_1_2_2_3 + 0.00457251082251099*G0_0_1_2_2_4 + 0.00011363636363637*G0_0_1_2_2_5 - 0.000200216450216458*G0_0_1_2_3_0 + 0.000844155844155874*G0_0_1_2_3_1 + 0.00143398268398274*G0_0_1_2_3_2 + 0.00177489177489184*G0_0_1_2_3_3 + 0.000974025974026009*G0_0_1_2_3_4 + 0.000173160173160181*G0_0_1_2_3_5 - 0.000286796536796546*G0_0_1_2_4_1 + 0.00457251082251099*G0_0_1_2_4_2 + 0.000974025974026009*G0_0_1_2_4_3 + 0.00653679653679676*G0_0_1_2_4_4 + 0.000346320346320359*G0_0_1_2_4_5 + 0.000200216450216456*G0_0_1_2_5_0 + 0.00011363636363637*G0_0_1_2_5_2 + 0.000173160173160181*G0_0_1_2_5_3 + 0.000346320346320359*G0_0_1_2_5_4 - 0.000389610389610403*G0_0_1_2_5_5 - 0.000113636363636366*G0_0_1_3_0_0 - 0.000200216450216458*G0_0_1_3_0_2 + 0.000389610389610403*G0_0_1_3_0_3 - 0.000346320346320357*G0_0_1_3_0_4 - 0.000173160173160178*G0_0_1_3_0_5 - 0.00313852813852825*G0_0_1_3_1_1 + 0.000844155844155874*G0_0_1_3_1_2 - 0.00476190476190493*G0_0_1_3_1_3 - 0.00017316017316018*G0_0_1_3_1_4 - 0.000200216450216458*G0_0_1_3_2_0 + 0.000844155844155874*G0_0_1_3_2_1 + 0.00143398268398274*G0_0_1_3_2_2 + 0.00177489177489184*G0_0_1_3_2_3 + 0.000974025974026009*G0_0_1_3_2_4 + 0.000173160173160181*G0_0_1_3_2_5 + 0.000389610389610403*G0_0_1_3_3_0 - 0.00476190476190493*G0_0_1_3_3_1 + 0.00177489177489184*G0_0_1_3_3_2 - 0.0101298701298705*G0_0_1_3_3_3 - 0.000432900432900447*G0_0_1_3_3_4 - 0.00112554112554117*G0_0_1_3_3_5 - 0.000346320346320357*G0_0_1_3_4_0 - 0.00017316017316018*G0_0_1_3_4_1 + 0.000974025974026009*G0_0_1_3_4_2 - 0.000432900432900447*G0_0_1_3_4_3 + 0.000692640692640719*G0_0_1_3_4_4 - 0.000173160173160178*G0_0_1_3_5_0 + 0.000173160173160181*G0_0_1_3_5_2 - 0.00112554112554117*G0_0_1_3_5_3 + 0.00112554112554116*G0_0_1_3_5_5 - 0.00457251082251097*G0_0_1_4_0_0 + 0.000286796536796547*G0_0_1_4_0_1 - 0.000346320346320357*G0_0_1_4_0_3 - 0.00653679653679675*G0_0_1_4_0_4 - 0.000974025974026007*G0_0_1_4_0_5 + 0.000286796536796547*G0_0_1_4_1_0 - 0.000286796536796546*G0_0_1_4_1_2 - 0.00017316017316018*G0_0_1_4_1_3 + 0.000173160173160177*G0_0_1_4_1_5 - 0.000286796536796546*G0_0_1_4_2_1 + 0.00457251082251099*G0_0_1_4_2_2 + 0.000974025974026009*G0_0_1_4_2_3 + 0.00653679653679676*G0_0_1_4_2_4 + 0.000346320346320359*G0_0_1_4_2_5 - 0.000346320346320357*G0_0_1_4_3_0 - 0.00017316017316018*G0_0_1_4_3_1 + 0.000974025974026009*G0_0_1_4_3_2 - 0.000432900432900447*G0_0_1_4_3_3 + 0.000692640692640719*G0_0_1_4_3_4 - 0.00653679653679675*G0_0_1_4_4_0 + 0.00653679653679676*G0_0_1_4_4_2 + 0.000692640692640719*G0_0_1_4_4_3 - 0.000692640692640712*G0_0_1_4_4_5 - 0.000974025974026006*G0_0_1_4_5_0 + 0.000173160173160177*G0_0_1_4_5_1 + 0.000346320346320359*G0_0_1_4_5_2 - 0.000692640692640712*G0_0_1_4_5_4 + 0.000432900432900448*G0_0_1_4_5_5 - 0.00143398268398273*G0_0_1_5_0_0 - 0.000844155844155871*G0_0_1_5_0_1 + 0.000200216450216456*G0_0_1_5_0_2 - 0.000173160173160178*G0_0_1_5_0_3 - 0.000974025974026006*G0_0_1_5_0_4 - 0.00177489177489183*G0_0_1_5_0_5 - 0.000844155844155871*G0_0_1_5_1_0 + 0.00313852813852824*G0_0_1_5_1_1 + 0.000173160173160177*G0_0_1_5_1_4 + 0.00476190476190492*G0_0_1_5_1_5 + 0.000200216450216456*G0_0_1_5_2_0 + 0.00011363636363637*G0_0_1_5_2_2 + 0.000173160173160181*G0_0_1_5_2_3 + 0.000346320346320359*G0_0_1_5_2_4 - 0.000389610389610403*G0_0_1_5_2_5 - 0.000173160173160178*G0_0_1_5_3_0 + 0.000173160173160181*G0_0_1_5_3_2 - 0.00112554112554117*G0_0_1_5_3_3 + 0.00112554112554116*G0_0_1_5_3_5 - 0.000974025974026006*G0_0_1_5_4_0 + 0.000173160173160177*G0_0_1_5_4_1 + 0.000346320346320359*G0_0_1_5_4_2 - 0.000692640692640712*G0_0_1_5_4_4 + 0.000432900432900448*G0_0_1_5_4_5 - 0.00177489177489183*G0_0_1_5_5_0 + 0.00476190476190492*G0_0_1_5_5_1 - 0.000389610389610403*G0_0_1_5_5_2 + 0.00112554112554116*G0_0_1_5_5_3 + 0.000432900432900448*G0_0_1_5_5_4 + 0.0101298701298705*G0_0_1_5_5_5; + A[2] = -A[12] - 0.0125892857142861*G0_0_1_0_0_0 + 0.00121482683982688*G0_0_1_0_0_1 + 0.000619588744588766*G0_0_1_0_0_2 - 0.000113636363636366*G0_0_1_0_0_3 - 0.00143398268398273*G0_0_1_0_0_4 - 0.00457251082251098*G0_0_1_0_0_5 + 0.00121482683982688*G0_0_1_0_1_0 - 0.00121482683982688*G0_0_1_0_1_1 - 0.000200216450216457*G0_0_1_0_1_3 + 0.000200216450216457*G0_0_1_0_1_4 + 0.000619588744588766*G0_0_1_0_2_0 - 0.000595238095238116*G0_0_1_0_2_2 - 0.000844155844155873*G0_0_1_0_2_4 + 0.000286796536796546*G0_0_1_0_2_5 - 0.000113636363636366*G0_0_1_0_3_0 - 0.000200216450216456*G0_0_1_0_3_1 + 0.000389610389610403*G0_0_1_0_3_3 - 0.000173160173160178*G0_0_1_0_3_4 - 0.000346320346320356*G0_0_1_0_3_5 - 0.00143398268398273*G0_0_1_0_4_0 + 0.000200216450216457*G0_0_1_0_4_1 - 0.000844155844155873*G0_0_1_0_4_2 - 0.000173160173160178*G0_0_1_0_4_3 - 0.00177489177489183*G0_0_1_0_4_4 - 0.000974025974026005*G0_0_1_0_4_5 - 0.00457251082251098*G0_0_1_0_5_0 + 0.000286796536796546*G0_0_1_0_5_2 - 0.000346320346320356*G0_0_1_0_5_3 - 0.000974025974026005*G0_0_1_0_5_4 - 0.00653679653679676*G0_0_1_0_5_5 + 0.00121482683982688*G0_0_1_1_0_0 - 0.00121482683982688*G0_0_1_1_0_1 - 0.000200216450216457*G0_0_1_1_0_3 + 0.000200216450216457*G0_0_1_1_0_4 - 0.00121482683982688*G0_0_1_1_1_0 + 0.0125892857142861*G0_0_1_1_1_1 - 0.000619588744588766*G0_0_1_1_1_2 + 0.00143398268398273*G0_0_1_1_1_3 + 0.000113636363636366*G0_0_1_1_1_4 + 0.00457251082251099*G0_0_1_1_1_5 - 0.000619588744588765*G0_0_1_1_2_1 + 0.000595238095238115*G0_0_1_1_2_2 + 0.000844155844155874*G0_0_1_1_2_3 - 0.000286796536796546*G0_0_1_1_2_5 - 0.000200216450216456*G0_0_1_1_3_0 + 0.00143398268398273*G0_0_1_1_3_1 + 0.000844155844155874*G0_0_1_1_3_2 + 0.00177489177489183*G0_0_1_1_3_3 + 0.000173160173160179*G0_0_1_1_3_4 + 0.000974025974026007*G0_0_1_1_3_5 + 0.000200216450216457*G0_0_1_1_4_0 + 0.000113636363636366*G0_0_1_1_4_1 + 0.000173160173160179*G0_0_1_1_4_3 - 0.000389610389610403*G0_0_1_1_4_4 + 0.000346320346320356*G0_0_1_1_4_5 + 0.00457251082251099*G0_0_1_1_5_1 - 0.000286796536796546*G0_0_1_1_5_2 + 0.000974025974026007*G0_0_1_1_5_3 + 0.000346320346320356*G0_0_1_1_5_4 + 0.00653679653679676*G0_0_1_1_5_5 + 0.000619588744588766*G0_0_1_2_0_0 - 0.000595238095238116*G0_0_1_2_0_2 - 0.000844155844155873*G0_0_1_2_0_4 + 0.000286796536796546*G0_0_1_2_0_5 - 0.000619588744588765*G0_0_1_2_1_1 + 0.000595238095238115*G0_0_1_2_1_2 + 0.000844155844155874*G0_0_1_2_1_3 - 0.000286796536796546*G0_0_1_2_1_5 - 0.000595238095238116*G0_0_1_2_2_0 + 0.000595238095238115*G0_0_1_2_2_1 - 0.00313852813852825*G0_0_1_2_2_3 + 0.00313852813852825*G0_0_1_2_2_4 + 0.000844155844155874*G0_0_1_2_3_1 - 0.00313852813852825*G0_0_1_2_3_2 - 0.00476190476190493*G0_0_1_2_3_3 - 0.000173160173160179*G0_0_1_2_3_5 - 0.000844155844155873*G0_0_1_2_4_0 + 0.00313852813852825*G0_0_1_2_4_2 + 0.00476190476190492*G0_0_1_2_4_4 + 0.00017316017316018*G0_0_1_2_4_5 + 0.000286796536796546*G0_0_1_2_5_0 - 0.000286796536796546*G0_0_1_2_5_1 - 0.000173160173160179*G0_0_1_2_5_3 + 0.00017316017316018*G0_0_1_2_5_4 - 0.000113636363636366*G0_0_1_3_0_0 - 0.000200216450216456*G0_0_1_3_0_1 + 0.000389610389610403*G0_0_1_3_0_3 - 0.000173160173160178*G0_0_1_3_0_4 - 0.000346320346320356*G0_0_1_3_0_5 - 0.000200216450216456*G0_0_1_3_1_0 + 0.00143398268398273*G0_0_1_3_1_1 + 0.000844155844155874*G0_0_1_3_1_2 + 0.00177489177489183*G0_0_1_3_1_3 + 0.000173160173160179*G0_0_1_3_1_4 + 0.000974025974026007*G0_0_1_3_1_5 + 0.000844155844155874*G0_0_1_3_2_1 - 0.00313852813852825*G0_0_1_3_2_2 - 0.00476190476190493*G0_0_1_3_2_3 - 0.000173160173160179*G0_0_1_3_2_5 + 0.000389610389610403*G0_0_1_3_3_0 + 0.00177489177489183*G0_0_1_3_3_1 - 0.00476190476190493*G0_0_1_3_3_2 - 0.0101298701298705*G0_0_1_3_3_3 - 0.00112554112554117*G0_0_1_3_3_4 - 0.000432900432900454*G0_0_1_3_3_5 - 0.000173160173160178*G0_0_1_3_4_0 + 0.000173160173160179*G0_0_1_3_4_1 - 0.00112554112554117*G0_0_1_3_4_3 + 0.00112554112554116*G0_0_1_3_4_4 - 0.000346320346320356*G0_0_1_3_5_0 + 0.000974025974026008*G0_0_1_3_5_1 - 0.000173160173160179*G0_0_1_3_5_2 - 0.000432900432900454*G0_0_1_3_5_3 + 0.000692640692640715*G0_0_1_3_5_5 - 0.00143398268398273*G0_0_1_4_0_0 + 0.000200216450216457*G0_0_1_4_0_1 - 0.000844155844155873*G0_0_1_4_0_2 - 0.000173160173160178*G0_0_1_4_0_3 - 0.00177489177489183*G0_0_1_4_0_4 - 0.000974025974026005*G0_0_1_4_0_5 + 0.000200216450216457*G0_0_1_4_1_0 + 0.000113636363636366*G0_0_1_4_1_1 + 0.000173160173160179*G0_0_1_4_1_3 - 0.000389610389610403*G0_0_1_4_1_4 + 0.000346320346320356*G0_0_1_4_1_5 - 0.000844155844155873*G0_0_1_4_2_0 + 0.00313852813852825*G0_0_1_4_2_2 + 0.00476190476190492*G0_0_1_4_2_4 + 0.00017316017316018*G0_0_1_4_2_5 - 0.000173160173160178*G0_0_1_4_3_0 + 0.000173160173160179*G0_0_1_4_3_1 - 0.00112554112554117*G0_0_1_4_3_3 + 0.00112554112554116*G0_0_1_4_3_4 - 0.00177489177489183*G0_0_1_4_4_0 - 0.000389610389610403*G0_0_1_4_4_1 + 0.00476190476190492*G0_0_1_4_4_2 + 0.00112554112554116*G0_0_1_4_4_3 + 0.0101298701298705*G0_0_1_4_4_4 + 0.00043290043290045*G0_0_1_4_4_5 - 0.000974025974026005*G0_0_1_4_5_0 + 0.000346320346320357*G0_0_1_4_5_1 + 0.00017316017316018*G0_0_1_4_5_2 + 0.00043290043290045*G0_0_1_4_5_4 - 0.000692640692640717*G0_0_1_4_5_5 - 0.00457251082251098*G0_0_1_5_0_0 + 0.000286796536796546*G0_0_1_5_0_2 - 0.000346320346320356*G0_0_1_5_0_3 - 0.000974025974026005*G0_0_1_5_0_4 - 0.00653679653679676*G0_0_1_5_0_5 + 0.00457251082251099*G0_0_1_5_1_1 - 0.000286796536796546*G0_0_1_5_1_2 + 0.000974025974026007*G0_0_1_5_1_3 + 0.000346320346320356*G0_0_1_5_1_4 + 0.00653679653679676*G0_0_1_5_1_5 + 0.000286796536796546*G0_0_1_5_2_0 - 0.000286796536796546*G0_0_1_5_2_1 - 0.000173160173160179*G0_0_1_5_2_3 + 0.00017316017316018*G0_0_1_5_2_4 - 0.000346320346320356*G0_0_1_5_3_0 + 0.000974025974026007*G0_0_1_5_3_1 - 0.000173160173160179*G0_0_1_5_3_2 - 0.000432900432900454*G0_0_1_5_3_3 + 0.000692640692640715*G0_0_1_5_3_5 - 0.000974025974026005*G0_0_1_5_4_0 + 0.000346320346320357*G0_0_1_5_4_1 + 0.00017316017316018*G0_0_1_5_4_2 + 0.00043290043290045*G0_0_1_5_4_4 - 0.000692640692640717*G0_0_1_5_4_5 - 0.00653679653679676*G0_0_1_5_5_0 + 0.00653679653679676*G0_0_1_5_5_1 + 0.000692640692640714*G0_0_1_5_5_3 - 0.000692640692640717*G0_0_1_5_5_4 - 0.0141233766233771*G0_1_1_0_0_0 + 0.0010939754689755*G0_1_1_0_0_1 + 0.00049873737373739*G0_1_1_0_0_2 - 0.000212842712842718*G0_1_1_0_0_3 - 0.00173160173160179*G0_1_1_0_0_4 - 0.00487012987013004*G0_1_1_0_0_5 + 0.0010939754689755*G0_1_1_0_1_0 - 0.000120851370851375*G0_1_1_0_1_1 - 0.000102813852813856*G0_1_1_0_1_3 + 0.000678210678210702*G0_1_1_0_1_5 + 0.00049873737373739*G0_1_1_0_2_0 + 0.000498737373737392*G0_1_1_0_2_2 + 0.00018398268398269*G0_1_1_0_2_3 - 0.00016594516594517*G0_1_1_0_2_4 + 0.00018398268398269*G0_1_1_0_2_5 - 0.000212842712842718*G0_1_1_0_3_0 - 0.000102813852813856*G0_1_1_0_3_1 + 0.00018398268398269*G0_1_1_0_3_2 + 0.000418470418470433*G0_1_1_0_3_3 + 0.000230880230880239*G0_1_1_0_3_4 - 0.00173160173160179*G0_1_1_0_4_0 - 0.00016594516594517*G0_1_1_0_4_2 + 0.000230880230880239*G0_1_1_0_4_3 + 0.00034632034632036*G0_1_1_0_4_4 - 0.000562770562770581*G0_1_1_0_4_5 - 0.00487012987013004*G0_1_1_0_5_0 + 0.000678210678210702*G0_1_1_0_5_1 + 0.00018398268398269*G0_1_1_0_5_2 - 0.000562770562770581*G0_1_1_0_5_4 - 0.00441558441558457*G0_1_1_0_5_5 + 0.00109397546897551*G0_1_1_1_0_0 - 0.000120851370851375*G0_1_1_1_0_1 - 0.000102813852813856*G0_1_1_1_0_3 + 0.000678210678210702*G0_1_1_1_0_5 - 0.000120851370851375*G0_1_1_1_1_0 - 0.00153409090909096*G0_1_1_1_1_1 - 0.000120851370851375*G0_1_1_1_1_2 - 0.000297619047619058*G0_1_1_1_1_3 - 0.00029761904761906*G0_1_1_1_1_5 - 0.000120851370851375*G0_1_1_1_2_1 + 0.00109397546897551*G0_1_1_1_2_2 + 0.000678210678210703*G0_1_1_1_2_3 - 0.000102813852813856*G0_1_1_1_2_5 - 0.000102813852813856*G0_1_1_1_3_0 - 0.000297619047619058*G0_1_1_1_3_1 + 0.000678210678210703*G0_1_1_1_3_2 + 0.0021212121212122*G0_1_1_1_3_3 + 0.000404040404040418*G0_1_1_1_3_4 + 0.000411255411255425*G0_1_1_1_3_5 + 0.000404040404040418*G0_1_1_1_4_3 + 0.000404040404040417*G0_1_1_1_4_5 + 0.000678210678210702*G0_1_1_1_5_0 - 0.00029761904761906*G0_1_1_1_5_1 - 0.000102813852813856*G0_1_1_1_5_2 + 0.000411255411255425*G0_1_1_1_5_3 + 0.000404040404040417*G0_1_1_1_5_4 + 0.00212121212121219*G0_1_1_1_5_5 + 0.00049873737373739*G0_1_1_2_0_0 + 0.000498737373737392*G0_1_1_2_0_2 + 0.00018398268398269*G0_1_1_2_0_3 - 0.00016594516594517*G0_1_1_2_0_4 + 0.00018398268398269*G0_1_1_2_0_5 - 0.000120851370851375*G0_1_1_2_1_1 + 0.00109397546897551*G0_1_1_2_1_2 + 0.000678210678210703*G0_1_1_2_1_3 - 0.000102813852813856*G0_1_1_2_1_5 + 0.000498737373737392*G0_1_1_2_2_0 + 0.00109397546897551*G0_1_1_2_2_1 - 0.0141233766233771*G0_1_1_2_2_2 - 0.00487012987013005*G0_1_1_2_2_3 - 0.0017316017316018*G0_1_1_2_2_4 - 0.000212842712842723*G0_1_1_2_2_5 + 0.00018398268398269*G0_1_1_2_3_0 + 0.000678210678210703*G0_1_1_2_3_1 - 0.00487012987013005*G0_1_1_2_3_2 - 0.00441558441558458*G0_1_1_2_3_3 - 0.000562770562770586*G0_1_1_2_3_4 - 0.00016594516594517*G0_1_1_2_4_0 - 0.0017316017316018*G0_1_1_2_4_2 - 0.000562770562770586*G0_1_1_2_4_3 + 0.000346320346320352*G0_1_1_2_4_4 + 0.000230880230880238*G0_1_1_2_4_5 + 0.00018398268398269*G0_1_1_2_5_0 - 0.000102813852813856*G0_1_1_2_5_1 - 0.000212842712842723*G0_1_1_2_5_2 + 0.000230880230880238*G0_1_1_2_5_4 + 0.000418470418470433*G0_1_1_2_5_5 - 0.000212842712842718*G0_1_1_3_0_0 - 0.000102813852813856*G0_1_1_3_0_1 + 0.00018398268398269*G0_1_1_3_0_2 + 0.000418470418470433*G0_1_1_3_0_3 + 0.000230880230880239*G0_1_1_3_0_4 - 0.000102813852813856*G0_1_1_3_1_0 - 0.000297619047619058*G0_1_1_3_1_1 + 0.000678210678210703*G0_1_1_3_1_2 + 0.0021212121212122*G0_1_1_3_1_3 + 0.000404040404040418*G0_1_1_3_1_4 + 0.000411255411255425*G0_1_1_3_1_5 + 0.00018398268398269*G0_1_1_3_2_0 + 0.000678210678210703*G0_1_1_3_2_1 - 0.00487012987013005*G0_1_1_3_2_2 - 0.00441558441558458*G0_1_1_3_2_3 - 0.000562770562770586*G0_1_1_3_2_4 + 0.000418470418470433*G0_1_1_3_3_0 + 0.0021212121212122*G0_1_1_3_3_1 - 0.00441558441558458*G0_1_1_3_3_2 - 0.00441558441558459*G0_1_1_3_3_3 - 0.0016450216450217*G0_1_1_3_3_4 - 0.000952380952380987*G0_1_1_3_3_5 + 0.000230880230880239*G0_1_1_3_4_0 + 0.000404040404040418*G0_1_1_3_4_1 - 0.000562770562770586*G0_1_1_3_4_2 - 0.0016450216450217*G0_1_1_3_4_3 - 0.00051948051948054*G0_1_1_3_4_4 - 0.000923520923520955*G0_1_1_3_4_5 + 0.000411255411255425*G0_1_1_3_5_1 - 0.000952380952380987*G0_1_1_3_5_3 - 0.000923520923520955*G0_1_1_3_5_4 - 0.000952380952380985*G0_1_1_3_5_5 - 0.00173160173160179*G0_1_1_4_0_0 - 0.00016594516594517*G0_1_1_4_0_2 + 0.000230880230880239*G0_1_1_4_0_3 + 0.00034632034632036*G0_1_1_4_0_4 - 0.000562770562770581*G0_1_1_4_0_5 + 0.000404040404040418*G0_1_1_4_1_3 + 0.000404040404040417*G0_1_1_4_1_5 - 0.00016594516594517*G0_1_1_4_2_0 - 0.0017316017316018*G0_1_1_4_2_2 - 0.000562770562770586*G0_1_1_4_2_3 + 0.000346320346320352*G0_1_1_4_2_4 + 0.000230880230880238*G0_1_1_4_2_5 + 0.000230880230880239*G0_1_1_4_3_0 + 0.000404040404040418*G0_1_1_4_3_1 - 0.000562770562770586*G0_1_1_4_3_2 - 0.0016450216450217*G0_1_1_4_3_3 - 0.00051948051948054*G0_1_1_4_3_4 - 0.000923520923520955*G0_1_1_4_3_5 + 0.000346320346320359*G0_1_1_4_4_0 + 0.000346320346320352*G0_1_1_4_4_2 - 0.00051948051948054*G0_1_1_4_4_3 + 0.00571428571428589*G0_1_1_4_4_4 - 0.000519480519480538*G0_1_1_4_4_5 - 0.000562770562770581*G0_1_1_4_5_0 + 0.000404040404040417*G0_1_1_4_5_1 + 0.000230880230880238*G0_1_1_4_5_2 - 0.000923520923520955*G0_1_1_4_5_3 - 0.000519480519480538*G0_1_1_4_5_4 - 0.0016450216450217*G0_1_1_4_5_5 - 0.00487012987013004*G0_1_1_5_0_0 + 0.000678210678210702*G0_1_1_5_0_1 + 0.00018398268398269*G0_1_1_5_0_2 - 0.000562770562770581*G0_1_1_5_0_4 - 0.00441558441558457*G0_1_1_5_0_5 + 0.000678210678210702*G0_1_1_5_1_0 - 0.000297619047619059*G0_1_1_5_1_1 - 0.000102813852813856*G0_1_1_5_1_2 + 0.000411255411255425*G0_1_1_5_1_3 + 0.000404040404040417*G0_1_1_5_1_4 + 0.00212121212121219*G0_1_1_5_1_5 + 0.00018398268398269*G0_1_1_5_2_0 - 0.000102813852813856*G0_1_1_5_2_1 - 0.000212842712842723*G0_1_1_5_2_2 + 0.000230880230880238*G0_1_1_5_2_4 + 0.000418470418470433*G0_1_1_5_2_5 + 0.000411255411255425*G0_1_1_5_3_1 - 0.000952380952380987*G0_1_1_5_3_3 - 0.000923520923520955*G0_1_1_5_3_4 - 0.000952380952380985*G0_1_1_5_3_5 - 0.000562770562770581*G0_1_1_5_4_0 + 0.000404040404040417*G0_1_1_5_4_1 + 0.000230880230880238*G0_1_1_5_4_2 - 0.000923520923520955*G0_1_1_5_4_3 - 0.000519480519480538*G0_1_1_5_4_4 - 0.0016450216450217*G0_1_1_5_4_5 - 0.00441558441558457*G0_1_1_5_5_0 + 0.00212121212121219*G0_1_1_5_5_1 + 0.000418470418470433*G0_1_1_5_5_2 - 0.000952380952380985*G0_1_1_5_5_3 - 0.0016450216450217*G0_1_1_5_5_4 - 0.00441558441558458*G0_1_1_5_5_5; + A[49] = -A[69] - 0.0103003246753251*G0_1_0_0_0_0 + 0.000803571428571459*G0_1_0_0_0_1 - 0.00321428571428581*G0_1_0_0_0_3 + 0.00613636363636382*G0_1_0_0_0_4 - 0.00467532467532486*G0_1_0_0_0_5 + 0.000803571428571459*G0_1_0_0_1_0 - 0.000803571428571451*G0_1_0_0_1_1 - 0.000292207792207794*G0_1_0_0_1_3 + 0.000292207792207801*G0_1_0_0_1_4 + 0.00219155844155852*G0_1_0_0_2_2 - 0.00292207792207802*G0_1_0_0_2_3 - 0.00584415584415603*G0_1_0_0_2_4 - 0.00146103896103901*G0_1_0_0_2_5 - 0.00321428571428581*G0_1_0_0_3_0 - 0.000292207792207795*G0_1_0_0_3_1 - 0.00292207792207802*G0_1_0_0_3_2 + 0.0362337662337673*G0_1_0_0_3_3 + 0.00584415584415602*G0_1_0_0_3_4 + 0.00935064935064965*G0_1_0_0_3_5 + 0.00613636363636382*G0_1_0_0_4_0 + 0.000292207792207801*G0_1_0_0_4_1 - 0.00584415584415603*G0_1_0_0_4_2 + 0.00584415584415602*G0_1_0_0_4_3 + 0.0105194805194809*G0_1_0_0_4_4 + 0.00233766233766241*G0_1_0_0_4_5 - 0.00467532467532486*G0_1_0_0_5_0 - 0.00146103896103901*G0_1_0_0_5_2 + 0.00935064935064965*G0_1_0_0_5_3 + 0.00233766233766241*G0_1_0_0_5_4 - 0.00233766233766244*G0_1_0_0_5_5 + 0.000803571428571459*G0_1_0_1_0_0 - 0.000803571428571451*G0_1_0_1_0_1 - 0.000292207792207794*G0_1_0_1_0_3 + 0.000292207792207801*G0_1_0_1_0_4 - 0.000803571428571451*G0_1_0_1_1_0 + 0.0103003246753249*G0_1_0_1_1_1 - 0.00613636363636389*G0_1_0_1_1_3 + 0.00321428571428582*G0_1_0_1_1_4 + 0.00467532467532481*G0_1_0_1_1_5 - 0.00219155844155852*G0_1_0_1_2_2 + 0.00584415584415606*G0_1_0_1_2_3 + 0.00292207792207802*G0_1_0_1_2_4 + 0.00146103896103901*G0_1_0_1_2_5 - 0.000292207792207795*G0_1_0_1_3_0 - 0.00613636363636389*G0_1_0_1_3_1 + 0.00584415584415606*G0_1_0_1_3_2 - 0.010519480519481*G0_1_0_1_3_3 - 0.00584415584415605*G0_1_0_1_3_4 - 0.00233766233766244*G0_1_0_1_3_5 + 0.000292207792207801*G0_1_0_1_4_0 + 0.00321428571428582*G0_1_0_1_4_1 + 0.00292207792207802*G0_1_0_1_4_2 - 0.00584415584415606*G0_1_0_1_4_3 - 0.0362337662337674*G0_1_0_1_4_4 - 0.00935064935064968*G0_1_0_1_4_5 + 0.00467532467532481*G0_1_0_1_5_1 + 0.00146103896103901*G0_1_0_1_5_2 - 0.00233766233766244*G0_1_0_1_5_3 - 0.00935064935064968*G0_1_0_1_5_4 + 0.0023376623376624*G0_1_0_1_5_5 + 0.00219155844155852*G0_1_0_2_0_2 - 0.00292207792207802*G0_1_0_2_0_3 - 0.00584415584415603*G0_1_0_2_0_4 - 0.00146103896103901*G0_1_0_2_0_5 - 0.00219155844155852*G0_1_0_2_1_2 + 0.00584415584415606*G0_1_0_2_1_3 + 0.00292207792207802*G0_1_0_2_1_4 + 0.00146103896103901*G0_1_0_2_1_5 + 0.00219155844155852*G0_1_0_2_2_0 - 0.00219155844155852*G0_1_0_2_2_1 - 0.00292207792207802*G0_1_0_2_3_0 + 0.00584415584415606*G0_1_0_2_3_1 + 0.0233766233766242*G0_1_0_2_3_3 + 0.00584415584415605*G0_1_0_2_3_5 - 0.00584415584415603*G0_1_0_2_4_0 + 0.00292207792207802*G0_1_0_2_4_1 - 0.0233766233766242*G0_1_0_2_4_4 - 0.00584415584415604*G0_1_0_2_4_5 - 0.00146103896103901*G0_1_0_2_5_0 + 0.00146103896103901*G0_1_0_2_5_1 + 0.00584415584415605*G0_1_0_2_5_3 - 0.00584415584415604*G0_1_0_2_5_4 - 0.00321428571428581*G0_1_0_3_0_0 - 0.000292207792207795*G0_1_0_3_0_1 - 0.00292207792207801*G0_1_0_3_0_2 + 0.0362337662337673*G0_1_0_3_0_3 + 0.00584415584415602*G0_1_0_3_0_4 + 0.00935064935064965*G0_1_0_3_0_5 - 0.000292207792207795*G0_1_0_3_1_0 - 0.00613636363636389*G0_1_0_3_1_1 + 0.00584415584415606*G0_1_0_3_1_2 - 0.010519480519481*G0_1_0_3_1_3 - 0.00584415584415605*G0_1_0_3_1_4 - 0.00233766233766244*G0_1_0_3_1_5 - 0.00292207792207802*G0_1_0_3_2_0 + 0.00584415584415606*G0_1_0_3_2_1 + 0.0233766233766242*G0_1_0_3_2_3 + 0.00584415584415605*G0_1_0_3_2_5 + 0.0362337662337674*G0_1_0_3_3_0 - 0.010519480519481*G0_1_0_3_3_1 + 0.0233766233766242*G0_1_0_3_3_2 - 0.547012987013006*G0_1_0_3_3_3 - 0.0607792207792228*G0_1_0_3_3_4 - 0.084155844155847*G0_1_0_3_3_5 + 0.00584415584415602*G0_1_0_3_4_0 - 0.00584415584415605*G0_1_0_3_4_1 - 0.0607792207792228*G0_1_0_3_4_3 + 0.0607792207792227*G0_1_0_3_4_4 + 0.00935064935064965*G0_1_0_3_5_0 - 0.00233766233766244*G0_1_0_3_5_1 + 0.00584415584415605*G0_1_0_3_5_2 - 0.084155844155847*G0_1_0_3_5_3 - 0.0187012987012994*G0_1_0_3_5_5 + 0.00613636363636382*G0_1_0_4_0_0 + 0.0002922077922078*G0_1_0_4_0_1 - 0.00584415584415603*G0_1_0_4_0_2 + 0.00584415584415602*G0_1_0_4_0_3 + 0.0105194805194809*G0_1_0_4_0_4 + 0.00233766233766241*G0_1_0_4_0_5 + 0.0002922077922078*G0_1_0_4_1_0 + 0.00321428571428582*G0_1_0_4_1_1 + 0.00292207792207802*G0_1_0_4_1_2 - 0.00584415584415605*G0_1_0_4_1_3 - 0.0362337662337674*G0_1_0_4_1_4 - 0.00935064935064968*G0_1_0_4_1_5 - 0.00584415584415603*G0_1_0_4_2_0 + 0.00292207792207802*G0_1_0_4_2_1 - 0.0233766233766242*G0_1_0_4_2_4 - 0.00584415584415604*G0_1_0_4_2_5 + 0.00584415584415603*G0_1_0_4_3_0 - 0.00584415584415605*G0_1_0_4_3_1 - 0.0607792207792228*G0_1_0_4_3_3 + 0.0607792207792228*G0_1_0_4_3_4 + 0.0105194805194809*G0_1_0_4_4_0 - 0.0362337662337674*G0_1_0_4_4_1 - 0.0233766233766242*G0_1_0_4_4_2 + 0.0607792207792227*G0_1_0_4_4_3 + 0.547012987013004*G0_1_0_4_4_4 + 0.0841558441558469*G0_1_0_4_4_5 + 0.00233766233766241*G0_1_0_4_5_0 - 0.00935064935064968*G0_1_0_4_5_1 - 0.00584415584415604*G0_1_0_4_5_2 + 0.0841558441558469*G0_1_0_4_5_4 + 0.0187012987012993*G0_1_0_4_5_5 - 0.00467532467532486*G0_1_0_5_0_0 - 0.00146103896103901*G0_1_0_5_0_2 + 0.00935064935064965*G0_1_0_5_0_3 + 0.00233766233766241*G0_1_0_5_0_4 - 0.00233766233766244*G0_1_0_5_0_5 + 0.00467532467532481*G0_1_0_5_1_1 + 0.00146103896103901*G0_1_0_5_1_2 - 0.00233766233766244*G0_1_0_5_1_3 - 0.00935064935064968*G0_1_0_5_1_4 + 0.0023376623376624*G0_1_0_5_1_5 - 0.00146103896103901*G0_1_0_5_2_0 + 0.00146103896103901*G0_1_0_5_2_1 + 0.00584415584415605*G0_1_0_5_2_3 - 0.00584415584415604*G0_1_0_5_2_4 + 0.00935064935064965*G0_1_0_5_3_0 - 0.00233766233766244*G0_1_0_5_3_1 + 0.00584415584415605*G0_1_0_5_3_2 - 0.084155844155847*G0_1_0_5_3_3 - 0.0187012987012994*G0_1_0_5_3_5 + 0.00233766233766241*G0_1_0_5_4_0 - 0.00935064935064968*G0_1_0_5_4_1 - 0.00584415584415604*G0_1_0_5_4_2 + 0.0841558441558469*G0_1_0_5_4_4 + 0.0187012987012993*G0_1_0_5_4_5 - 0.00233766233766244*G0_1_0_5_5_0 + 0.0023376623376624*G0_1_0_5_5_1 - 0.0187012987012994*G0_1_0_5_5_3 + 0.0187012987012993*G0_1_0_5_5_4 - 0.0278327922077934*G0_1_1_0_0_0 + 0.00438311688311705*G0_1_1_0_0_1 + 0.00182629870129877*G0_1_1_0_0_2 - 0.00642857142857163*G0_1_1_0_0_3 - 0.00788961038961068*G0_1_1_0_0_4 - 0.0315584415584427*G0_1_1_0_0_5 + 0.00438311688311705*G0_1_1_0_1_0 + 0.00357954545454558*G0_1_1_0_1_1 - 0.00102272727272731*G0_1_1_0_1_2 - 0.000876623376623396*G0_1_1_0_1_3 - 0.000584415584415596*G0_1_1_0_1_4 + 0.0146103896103901*G0_1_1_0_1_5 + 0.00182629870129877*G0_1_1_0_2_0 - 0.00102272727272731*G0_1_1_0_2_1 - 0.000730519480519512*G0_1_1_0_2_2 - 0.00146103896103901*G0_1_1_0_2_3 + 0.000584415584415616*G0_1_1_0_2_5 - 0.00642857142857163*G0_1_1_0_3_0 - 0.000876623376623396*G0_1_1_0_3_1 - 0.00146103896103901*G0_1_1_0_3_2 + 0.0409090909090922*G0_1_1_0_3_3 + 0.0140259740259745*G0_1_1_0_3_4 + 0.0116883116883121*G0_1_1_0_3_5 - 0.00788961038961068*G0_1_1_0_4_0 - 0.000584415584415596*G0_1_1_0_4_1 + 0.0140259740259745*G0_1_1_0_4_3 + 0.0105194805194808*G0_1_1_0_4_4 - 0.0315584415584427*G0_1_1_0_5_0 + 0.0146103896103901*G0_1_1_0_5_1 + 0.000584415584415616*G0_1_1_0_5_2 + 0.0116883116883121*G0_1_1_0_5_3 - 0.021038961038962*G0_1_1_0_5_5 + 0.00438311688311705*G0_1_1_1_0_0 + 0.00357954545454558*G0_1_1_1_0_1 - 0.00102272727272731*G0_1_1_1_0_2 - 0.000876623376623396*G0_1_1_1_0_3 - 0.000584415584415596*G0_1_1_1_0_4 + 0.0146103896103901*G0_1_1_1_0_5 + 0.00357954545454558*G0_1_1_1_1_0 - 0.0175324675324683*G0_1_1_1_1_1 + 0.00182629870129877*G0_1_1_1_1_2 - 0.0140259740259746*G0_1_1_1_1_3 - 0.00321428571428582*G0_1_1_1_1_4 - 0.0268831168831179*G0_1_1_1_1_5 - 0.00102272727272731*G0_1_1_1_2_0 + 0.00182629870129877*G0_1_1_1_2_1 - 0.00292207792207803*G0_1_1_1_2_2 + 0.00584415584415606*G0_1_1_1_2_3 + 0.00146103896103901*G0_1_1_1_2_4 + 0.00204545454545462*G0_1_1_1_2_5 - 0.000876623376623396*G0_1_1_1_3_0 - 0.0140259740259746*G0_1_1_1_3_1 + 0.00584415584415606*G0_1_1_1_3_2 + 0.00818181818181844*G0_1_1_1_3_4 - 0.00233766233766245*G0_1_1_1_3_5 - 0.000584415584415596*G0_1_1_1_4_0 - 0.00321428571428582*G0_1_1_1_4_1 + 0.00146103896103901*G0_1_1_1_4_2 + 0.00818181818181844*G0_1_1_1_4_3 + 0.00467532467532483*G0_1_1_1_4_4 + 0.00233766233766242*G0_1_1_1_4_5 + 0.0146103896103901*G0_1_1_1_5_0 - 0.0268831168831179*G0_1_1_1_5_1 + 0.00204545454545462*G0_1_1_1_5_2 - 0.00233766233766245*G0_1_1_1_5_3 + 0.00233766233766242*G0_1_1_1_5_4 - 0.0187012987012994*G0_1_1_1_5_5 + 0.00182629870129877*G0_1_1_2_0_0 - 0.00102272727272731*G0_1_1_2_0_1 - 0.000730519480519512*G0_1_1_2_0_2 - 0.00146103896103901*G0_1_1_2_0_3 + 0.000584415584415616*G0_1_1_2_0_5 - 0.00102272727272731*G0_1_1_2_1_0 + 0.00182629870129877*G0_1_1_2_1_1 - 0.00292207792207803*G0_1_1_2_1_2 + 0.00584415584415606*G0_1_1_2_1_3 + 0.00146103896103901*G0_1_1_2_1_4 + 0.00204545454545462*G0_1_1_2_1_5 - 0.000730519480519512*G0_1_1_2_2_0 - 0.00292207792207802*G0_1_1_2_2_1 + 0.0284902597402608*G0_1_1_2_2_2 + 0.00438311688311703*G0_1_1_2_2_3 + 0.00438311688311706*G0_1_1_2_2_4 - 0.00146103896103901*G0_1_1_2_2_5 - 0.00146103896103901*G0_1_1_2_3_0 + 0.00584415584415606*G0_1_1_2_3_1 + 0.00438311688311704*G0_1_1_2_3_2 + 0.0175324675324681*G0_1_1_2_3_3 + 0.00584415584415605*G0_1_1_2_3_5 + 0.00146103896103901*G0_1_1_2_4_1 + 0.00438311688311706*G0_1_1_2_4_2 - 0.00584415584415602*G0_1_1_2_4_4 + 0.000584415584415616*G0_1_1_2_5_0 + 0.00204545454545462*G0_1_1_2_5_1 - 0.00146103896103901*G0_1_1_2_5_2 + 0.00584415584415605*G0_1_1_2_5_3 + 0.0187012987012994*G0_1_1_2_5_5 - 0.00642857142857163*G0_1_1_3_0_0 - 0.000876623376623396*G0_1_1_3_0_1 - 0.00146103896103901*G0_1_1_3_0_2 + 0.0409090909090922*G0_1_1_3_0_3 + 0.0140259740259745*G0_1_1_3_0_4 + 0.0116883116883121*G0_1_1_3_0_5 - 0.000876623376623396*G0_1_1_3_1_0 - 0.0140259740259746*G0_1_1_3_1_1 + 0.00584415584415606*G0_1_1_3_1_2 + 0.00818181818181844*G0_1_1_3_1_4 - 0.00233766233766245*G0_1_1_3_1_5 - 0.00146103896103901*G0_1_1_3_2_0 + 0.00584415584415606*G0_1_1_3_2_1 + 0.00438311688311703*G0_1_1_3_2_2 + 0.0175324675324681*G0_1_1_3_2_3 + 0.00584415584415605*G0_1_1_3_2_5 + 0.0409090909090922*G0_1_1_3_3_0 + 0.0175324675324681*G0_1_1_3_3_2 - 0.561038961038981*G0_1_1_3_3_3 - 0.0981818181818215*G0_1_1_3_3_4 - 0.0935064935064968*G0_1_1_3_3_5 + 0.0140259740259745*G0_1_1_3_4_0 + 0.00818181818181844*G0_1_1_3_4_1 - 0.0981818181818215*G0_1_1_3_4_3 - 0.0374025974025986*G0_1_1_3_4_4 - 0.028051948051949*G0_1_1_3_4_5 + 0.0116883116883121*G0_1_1_3_5_0 - 0.00233766233766245*G0_1_1_3_5_1 + 0.00584415584415605*G0_1_1_3_5_2 - 0.0935064935064968*G0_1_1_3_5_3 - 0.028051948051949*G0_1_1_3_5_4 - 0.0607792207792229*G0_1_1_3_5_5 - 0.00788961038961068*G0_1_1_4_0_0 - 0.000584415584415596*G0_1_1_4_0_1 + 0.0140259740259745*G0_1_1_4_0_3 + 0.0105194805194808*G0_1_1_4_0_4 - 0.000584415584415596*G0_1_1_4_1_0 - 0.00321428571428582*G0_1_1_4_1_1 + 0.00146103896103901*G0_1_1_4_1_2 + 0.00818181818181844*G0_1_1_4_1_3 + 0.00467532467532483*G0_1_1_4_1_4 + 0.00233766233766242*G0_1_1_4_1_5 + 0.00146103896103901*G0_1_1_4_2_1 + 0.00438311688311706*G0_1_1_4_2_2 - 0.00584415584415602*G0_1_1_4_2_4 + 0.0140259740259745*G0_1_1_4_3_0 + 0.00818181818181844*G0_1_1_4_3_1 - 0.0981818181818215*G0_1_1_4_3_3 - 0.0374025974025986*G0_1_1_4_3_4 - 0.028051948051949*G0_1_1_4_3_5 + 0.0105194805194808*G0_1_1_4_4_0 + 0.00467532467532483*G0_1_1_4_4_1 - 0.00584415584415602*G0_1_1_4_4_2 - 0.0374025974025986*G0_1_1_4_4_3 - 0.0140259740259746*G0_1_1_4_4_4 - 0.00935064935064968*G0_1_1_4_4_5 + 0.00233766233766242*G0_1_1_4_5_1 - 0.028051948051949*G0_1_1_4_5_3 - 0.00935064935064968*G0_1_1_4_5_4 - 0.0420779220779236*G0_1_1_4_5_5 - 0.0315584415584427*G0_1_1_5_0_0 + 0.0146103896103901*G0_1_1_5_0_1 + 0.000584415584415616*G0_1_1_5_0_2 + 0.0116883116883121*G0_1_1_5_0_3 - 0.021038961038962*G0_1_1_5_0_5 + 0.0146103896103901*G0_1_1_5_1_0 - 0.0268831168831179*G0_1_1_5_1_1 + 0.00204545454545462*G0_1_1_5_1_2 - 0.00233766233766245*G0_1_1_5_1_3 + 0.00233766233766242*G0_1_1_5_1_4 - 0.0187012987012994*G0_1_1_5_1_5 + 0.000584415584415616*G0_1_1_5_2_0 + 0.00204545454545462*G0_1_1_5_2_1 - 0.00146103896103901*G0_1_1_5_2_2 + 0.00584415584415605*G0_1_1_5_2_3 + 0.0187012987012994*G0_1_1_5_2_5 + 0.0116883116883121*G0_1_1_5_3_0 - 0.00233766233766245*G0_1_1_5_3_1 + 0.00584415584415605*G0_1_1_5_3_2 - 0.0935064935064968*G0_1_1_5_3_3 - 0.028051948051949*G0_1_1_5_3_4 - 0.0607792207792229*G0_1_1_5_3_5 + 0.00233766233766242*G0_1_1_5_4_1 - 0.028051948051949*G0_1_1_5_4_3 - 0.00935064935064968*G0_1_1_5_4_4 - 0.0420779220779236*G0_1_1_5_4_5 - 0.021038961038962*G0_1_1_5_5_0 - 0.0187012987012994*G0_1_1_5_5_1 + 0.0187012987012994*G0_1_1_5_5_2 - 0.0607792207792229*G0_1_1_5_5_3 - 0.0420779220779236*G0_1_1_5_5_4 - 0.518961038961058*G0_1_1_5_5_5; + A[93] = A[49] + 0.000657467532467538*G0_0_0_0_0_0 - 0.000219155844155851*G0_0_0_0_0_1 - 0.0013149350649351*G0_0_0_0_0_2 - 0.00525974025974042*G0_0_0_0_0_3 - 0.0105194805194809*G0_0_0_0_0_4 - 0.00262987012987021*G0_0_0_0_0_5 - 0.000219155844155851*G0_0_0_0_1_0 + 0.00284902597402607*G0_0_0_0_1_1 - 0.00131493506493511*G0_0_0_0_1_2 + 0.00350649350649362*G0_0_0_0_1_3 - 0.0017532467532468*G0_0_0_0_1_4 + 0.00175324675324681*G0_0_0_0_1_5 - 0.0013149350649351*G0_0_0_0_2_0 - 0.00131493506493511*G0_0_0_0_2_1 + 0.00832792207792235*G0_0_0_0_2_2 - 0.00350649350649361*G0_0_0_0_2_3 + 0.0140259740259745*G0_0_0_0_2_4 - 0.00175324675324681*G0_0_0_0_2_5 - 0.00525974025974042*G0_0_0_0_3_0 + 0.00350649350649362*G0_0_0_0_3_1 - 0.00350649350649361*G0_0_0_0_3_2 + 0.0350649350649361*G0_0_0_0_3_3 + 0.0140259740259745*G0_0_0_0_3_4 + 0.0140259740259745*G0_0_0_0_3_5 - 0.0105194805194809*G0_0_0_0_4_0 - 0.0017532467532468*G0_0_0_0_4_1 + 0.0140259740259745*G0_0_0_0_4_2 + 0.0140259740259745*G0_0_0_0_4_3 + 0.0350649350649361*G0_0_0_0_4_4 + 0.00701298701298724*G0_0_0_0_4_5 - 0.00262987012987021*G0_0_0_0_5_0 + 0.00175324675324681*G0_0_0_0_5_1 - 0.00175324675324681*G0_0_0_0_5_2 + 0.0140259740259745*G0_0_0_0_5_3 + 0.00701298701298724*G0_0_0_0_5_4 + 0.0105194805194809*G0_0_0_0_5_5 - 0.000219155844155851*G0_0_0_1_0_0 + 0.00284902597402607*G0_0_0_1_0_1 - 0.00131493506493511*G0_0_0_1_0_2 + 0.00350649350649362*G0_0_0_1_0_3 - 0.0017532467532468*G0_0_0_1_0_4 + 0.00175324675324681*G0_0_0_1_0_5 + 0.00284902597402607*G0_0_0_1_1_0 - 0.0243262987012995*G0_0_0_1_1_1 + 0.00657467532467556*G0_0_0_1_1_2 - 0.0298051948051959*G0_0_0_1_1_3 - 0.00350649350649362*G0_0_0_1_1_4 - 0.0096428571428575*G0_0_0_1_1_5 - 0.00131493506493511*G0_0_0_1_2_0 + 0.00657467532467556*G0_0_0_1_2_1 - 0.00482142857142874*G0_0_0_1_2_2 + 0.00701298701298726*G0_0_0_1_2_3 + 0.00350649350649362*G0_0_0_1_2_4 + 0.00350649350649363*G0_0_0_1_2_5 + 0.00350649350649362*G0_0_0_1_3_0 - 0.0298051948051959*G0_0_0_1_3_1 + 0.00701298701298726*G0_0_0_1_3_2 - 0.0631168831168854*G0_0_0_1_3_3 - 0.0140259740259745*G0_0_0_1_3_5 - 0.0017532467532468*G0_0_0_1_4_0 - 0.00350649350649362*G0_0_0_1_4_1 + 0.00350649350649362*G0_0_0_1_4_2 + 0.0210389610389617*G0_0_0_1_4_4 + 0.00175324675324681*G0_0_0_1_5_0 - 0.0096428571428575*G0_0_0_1_5_1 + 0.00350649350649363*G0_0_0_1_5_2 - 0.0140259740259745*G0_0_0_1_5_3 - 0.0105194805194809*G0_0_0_1_5_5 - 0.0013149350649351*G0_0_0_2_0_0 - 0.00131493506493511*G0_0_0_2_0_1 + 0.00832792207792235*G0_0_0_2_0_2 - 0.00350649350649361*G0_0_0_2_0_3 + 0.0140259740259745*G0_0_0_2_0_4 - 0.00175324675324681*G0_0_0_2_0_5 - 0.00131493506493511*G0_0_0_2_1_0 + 0.00657467532467556*G0_0_0_2_1_1 - 0.00482142857142874*G0_0_0_2_1_2 + 0.00701298701298726*G0_0_0_2_1_3 + 0.00350649350649362*G0_0_0_2_1_4 + 0.00350649350649363*G0_0_0_2_1_5 + 0.00832792207792235*G0_0_0_2_2_0 - 0.00482142857142874*G0_0_0_2_2_1 - 0.013149350649351*G0_0_0_2_2_2 + 0.00876623376623408*G0_0_0_2_2_3 - 0.0438311688311703*G0_0_0_2_2_4 - 0.00350649350649363*G0_0_0_2_2_5 - 0.00350649350649361*G0_0_0_2_3_0 + 0.00701298701298726*G0_0_0_2_3_1 + 0.00876623376623408*G0_0_0_2_3_2 + 0.0701298701298725*G0_0_0_2_3_3 + 0.0140259740259745*G0_0_0_2_3_5 + 0.0140259740259745*G0_0_0_2_4_0 + 0.00350649350649362*G0_0_0_2_4_1 - 0.0438311688311702*G0_0_0_2_4_2 - 0.0701298701298724*G0_0_0_2_4_4 - 0.00175324675324681*G0_0_0_2_5_0 + 0.00350649350649363*G0_0_0_2_5_1 - 0.00350649350649363*G0_0_0_2_5_2 + 0.0140259740259745*G0_0_0_2_5_3 + 0.00701298701298725*G0_0_0_2_5_5 - 0.00525974025974042*G0_0_0_3_0_0 + 0.00350649350649362*G0_0_0_3_0_1 - 0.00350649350649361*G0_0_0_3_0_2 + 0.0350649350649361*G0_0_0_3_0_3 + 0.0140259740259745*G0_0_0_3_0_4 + 0.0140259740259745*G0_0_0_3_0_5 + 0.00350649350649362*G0_0_0_3_1_0 - 0.0298051948051959*G0_0_0_3_1_1 + 0.00701298701298726*G0_0_0_3_1_2 - 0.0631168831168854*G0_0_0_3_1_3 - 0.0140259740259745*G0_0_0_3_1_5 - 0.00350649350649361*G0_0_0_3_2_0 + 0.00701298701298726*G0_0_0_3_2_1 + 0.00876623376623408*G0_0_0_3_2_2 + 0.0701298701298725*G0_0_0_3_2_3 + 0.0140259740259745*G0_0_0_3_2_5 + 0.0350649350649361*G0_0_0_3_3_0 - 0.0631168831168854*G0_0_0_3_3_1 + 0.0701298701298725*G0_0_0_3_3_2 - 0.490909090909107*G0_0_0_3_3_3 - 0.0701298701298724*G0_0_0_3_3_4 - 0.0981818181818215*G0_0_0_3_3_5 + 0.0140259740259745*G0_0_0_3_4_0 - 0.0701298701298724*G0_0_0_3_4_3 - 0.0701298701298724*G0_0_0_3_4_4 - 0.028051948051949*G0_0_0_3_4_5 + 0.0140259740259745*G0_0_0_3_5_0 - 0.0140259740259745*G0_0_0_3_5_1 + 0.0140259740259745*G0_0_0_3_5_2 - 0.0981818181818215*G0_0_0_3_5_3 - 0.028051948051949*G0_0_0_3_5_4 - 0.0420779220779235*G0_0_0_3_5_5 - 0.0105194805194809*G0_0_0_4_0_0 - 0.0017532467532468*G0_0_0_4_0_1 + 0.0140259740259745*G0_0_0_4_0_2 + 0.0140259740259745*G0_0_0_4_0_3 + 0.0350649350649361*G0_0_0_4_0_4 + 0.00701298701298724*G0_0_0_4_0_5 - 0.0017532467532468*G0_0_0_4_1_0 - 0.00350649350649362*G0_0_0_4_1_1 + 0.00350649350649362*G0_0_0_4_1_2 + 0.0210389610389617*G0_0_0_4_1_4 + 0.0140259740259745*G0_0_0_4_2_0 + 0.00350649350649362*G0_0_0_4_2_1 - 0.0438311688311702*G0_0_0_4_2_2 - 0.0701298701298724*G0_0_0_4_2_4 + 0.0140259740259745*G0_0_0_4_3_0 - 0.0701298701298724*G0_0_0_4_3_3 - 0.0701298701298724*G0_0_0_4_3_4 - 0.028051948051949*G0_0_0_4_3_5 + 0.0350649350649361*G0_0_0_4_4_0 + 0.0210389610389617*G0_0_0_4_4_1 - 0.0701298701298724*G0_0_0_4_4_2 - 0.0701298701298724*G0_0_0_4_4_3 - 0.490909090909107*G0_0_0_4_4_4 - 0.0420779220779235*G0_0_0_4_4_5 + 0.00701298701298724*G0_0_0_4_5_0 - 0.028051948051949*G0_0_0_4_5_3 - 0.0420779220779235*G0_0_0_4_5_4 - 0.0140259740259745*G0_0_0_4_5_5 - 0.00262987012987021*G0_0_0_5_0_0 + 0.00175324675324681*G0_0_0_5_0_1 - 0.00175324675324681*G0_0_0_5_0_2 + 0.0140259740259745*G0_0_0_5_0_3 + 0.00701298701298724*G0_0_0_5_0_4 + 0.0105194805194809*G0_0_0_5_0_5 + 0.00175324675324681*G0_0_0_5_1_0 - 0.0096428571428575*G0_0_0_5_1_1 + 0.00350649350649363*G0_0_0_5_1_2 - 0.0140259740259745*G0_0_0_5_1_3 - 0.0105194805194809*G0_0_0_5_1_5 - 0.00175324675324681*G0_0_0_5_2_0 + 0.00350649350649363*G0_0_0_5_2_1 - 0.00350649350649363*G0_0_0_5_2_2 + 0.0140259740259745*G0_0_0_5_2_3 + 0.00701298701298725*G0_0_0_5_2_5 + 0.0140259740259745*G0_0_0_5_3_0 - 0.0140259740259745*G0_0_0_5_3_1 + 0.0140259740259745*G0_0_0_5_3_2 - 0.0981818181818215*G0_0_0_5_3_3 - 0.028051948051949*G0_0_0_5_3_4 - 0.0420779220779235*G0_0_0_5_3_5 + 0.00701298701298724*G0_0_0_5_4_0 - 0.028051948051949*G0_0_0_5_4_3 - 0.0420779220779235*G0_0_0_5_4_4 - 0.0140259740259745*G0_0_0_5_4_5 + 0.0105194805194809*G0_0_0_5_5_0 - 0.0105194805194809*G0_0_0_5_5_1 + 0.00701298701298725*G0_0_0_5_5_2 - 0.0420779220779235*G0_0_0_5_5_3 - 0.0140259740259745*G0_0_0_5_5_4 - 0.028051948051949*G0_0_0_5_5_5 - 0.00146103896103901*G0_0_1_0_0_1 + 0.00146103896103901*G0_0_1_0_0_2 + 0.000584415584415618*G0_0_1_0_0_4 - 0.000584415584415573*G0_0_1_0_0_5 - 0.00146103896103901*G0_0_1_0_1_0 + 0.00452922077922093*G0_0_1_0_1_1 + 0.00818181818181845*G0_0_1_0_1_3 + 0.00233766233766241*G0_0_1_0_1_4 + 0.00409090909090922*G0_0_1_0_1_5 + 0.00146103896103901*G0_0_1_0_2_0 - 0.00452922077922094*G0_0_1_0_2_2 - 0.00818181818181845*G0_0_1_0_2_3 - 0.00409090909090924*G0_0_1_0_2_4 - 0.00233766233766242*G0_0_1_0_2_5 + 0.00818181818181845*G0_0_1_0_3_1 - 0.00818181818181845*G0_0_1_0_3_2 - 0.00467532467532483*G0_0_1_0_3_4 + 0.00467532467532483*G0_0_1_0_3_5 + 0.000584415584415618*G0_0_1_0_4_0 + 0.00233766233766241*G0_0_1_0_4_1 - 0.00409090909090924*G0_0_1_0_4_2 - 0.00467532467532483*G0_0_1_0_4_3 - 0.00701298701298726*G0_0_1_0_4_4 - 0.000584415584415574*G0_0_1_0_5_0 + 0.00409090909090921*G0_0_1_0_5_1 - 0.00233766233766242*G0_0_1_0_5_2 + 0.00467532467532483*G0_0_1_0_5_3 + 0.00701298701298728*G0_0_1_0_5_5 - 0.00146103896103901*G0_0_1_1_0_0 + 0.00452922077922093*G0_0_1_1_0_1 + 0.00818181818181845*G0_0_1_1_0_3 + 0.00233766233766241*G0_0_1_1_0_4 + 0.00409090909090921*G0_0_1_1_0_5 + 0.00452922077922093*G0_0_1_1_1_0 - 0.0613636363636383*G0_0_1_1_1_1 + 0.0119805194805199*G0_0_1_1_1_2 - 0.0397402597402611*G0_0_1_1_1_3 - 0.00116883116883121*G0_0_1_1_1_4 - 0.0187012987012994*G0_0_1_1_1_5 + 0.0119805194805199*G0_0_1_1_2_1 - 0.0119805194805199*G0_0_1_1_2_2 - 0.00350649350649363*G0_0_1_1_2_4 + 0.00350649350649363*G0_0_1_1_2_5 + 0.00818181818181845*G0_0_1_1_3_0 - 0.0397402597402611*G0_0_1_1_3_1 - 0.0981818181818216*G0_0_1_1_3_3 - 0.0140259740259745*G0_0_1_1_3_4 - 0.0233766233766242*G0_0_1_1_3_5 + 0.00233766233766241*G0_0_1_1_4_0 - 0.00116883116883121*G0_0_1_1_4_1 - 0.00350649350649363*G0_0_1_1_4_2 - 0.0140259740259745*G0_0_1_1_4_3 - 0.00467532467532484*G0_0_1_1_4_4 - 0.00467532467532484*G0_0_1_1_4_5 + 0.00409090909090921*G0_0_1_1_5_0 - 0.0187012987012994*G0_0_1_1_5_1 + 0.00350649350649363*G0_0_1_1_5_2 - 0.0233766233766242*G0_0_1_1_5_3 - 0.00467532467532484*G0_0_1_1_5_4 - 0.0187012987012993*G0_0_1_1_5_5 + 0.00146103896103901*G0_0_1_2_0_0 - 0.00452922077922094*G0_0_1_2_0_2 - 0.00818181818181845*G0_0_1_2_0_3 - 0.00409090909090924*G0_0_1_2_0_4 - 0.00233766233766242*G0_0_1_2_0_5 + 0.0119805194805199*G0_0_1_2_1_1 - 0.0119805194805199*G0_0_1_2_1_2 - 0.00350649350649363*G0_0_1_2_1_4 + 0.00350649350649363*G0_0_1_2_1_5 - 0.00452922077922094*G0_0_1_2_2_0 - 0.0119805194805199*G0_0_1_2_2_1 + 0.0613636363636387*G0_0_1_2_2_2 + 0.0397402597402612*G0_0_1_2_2_3 + 0.0187012987012994*G0_0_1_2_2_4 + 0.00116883116883122*G0_0_1_2_2_5 - 0.00818181818181845*G0_0_1_2_3_0 + 0.0397402597402612*G0_0_1_2_3_2 + 0.0981818181818216*G0_0_1_2_3_3 + 0.0233766233766242*G0_0_1_2_3_4 + 0.0140259740259745*G0_0_1_2_3_5 - 0.00409090909090924*G0_0_1_2_4_0 - 0.00350649350649363*G0_0_1_2_4_1 + 0.0187012987012994*G0_0_1_2_4_2 + 0.0233766233766242*G0_0_1_2_4_3 + 0.0187012987012994*G0_0_1_2_4_4 + 0.00467532467532484*G0_0_1_2_4_5 - 0.00233766233766242*G0_0_1_2_5_0 + 0.00350649350649363*G0_0_1_2_5_1 + 0.00116883116883122*G0_0_1_2_5_2 + 0.0140259740259745*G0_0_1_2_5_3 + 0.00467532467532484*G0_0_1_2_5_4 + 0.00467532467532483*G0_0_1_2_5_5 + 0.00818181818181845*G0_0_1_3_0_1 - 0.00818181818181845*G0_0_1_3_0_2 - 0.00467532467532483*G0_0_1_3_0_4 + 0.00467532467532483*G0_0_1_3_0_5 + 0.00818181818181845*G0_0_1_3_1_0 - 0.0397402597402611*G0_0_1_3_1_1 - 0.0981818181818216*G0_0_1_3_1_3 - 0.0140259740259745*G0_0_1_3_1_4 - 0.0233766233766242*G0_0_1_3_1_5 - 0.00818181818181845*G0_0_1_3_2_0 + 0.0397402597402612*G0_0_1_3_2_2 + 0.0981818181818216*G0_0_1_3_2_3 + 0.0233766233766242*G0_0_1_3_2_4 + 0.0140259740259745*G0_0_1_3_2_5 - 0.0981818181818216*G0_0_1_3_3_1 + 0.0981818181818216*G0_0_1_3_3_2 + 0.0280519480519491*G0_0_1_3_3_4 - 0.028051948051949*G0_0_1_3_3_5 - 0.00467532467532483*G0_0_1_3_4_0 - 0.0140259740259745*G0_0_1_3_4_1 + 0.0233766233766242*G0_0_1_3_4_2 + 0.0280519480519491*G0_0_1_3_4_3 + 0.0187012987012994*G0_0_1_3_4_4 + 0.00467532467532483*G0_0_1_3_5_0 - 0.0233766233766242*G0_0_1_3_5_1 + 0.0140259740259745*G0_0_1_3_5_2 - 0.028051948051949*G0_0_1_3_5_3 - 0.0187012987012993*G0_0_1_3_5_5 + 0.000584415584415618*G0_0_1_4_0_0 + 0.00233766233766241*G0_0_1_4_0_1 - 0.00409090909090924*G0_0_1_4_0_2 - 0.00467532467532483*G0_0_1_4_0_3 - 0.00701298701298726*G0_0_1_4_0_4 + 0.00233766233766241*G0_0_1_4_1_0 - 0.00116883116883121*G0_0_1_4_1_1 - 0.00350649350649363*G0_0_1_4_1_2 - 0.0140259740259745*G0_0_1_4_1_3 - 0.00467532467532484*G0_0_1_4_1_4 - 0.00467532467532484*G0_0_1_4_1_5 - 0.00409090909090924*G0_0_1_4_2_0 - 0.00350649350649363*G0_0_1_4_2_1 + 0.0187012987012994*G0_0_1_4_2_2 + 0.0233766233766242*G0_0_1_4_2_3 + 0.0187012987012994*G0_0_1_4_2_4 + 0.00467532467532484*G0_0_1_4_2_5 - 0.00467532467532483*G0_0_1_4_3_0 - 0.0140259740259745*G0_0_1_4_3_1 + 0.0233766233766242*G0_0_1_4_3_2 + 0.0280519480519491*G0_0_1_4_3_3 + 0.0187012987012994*G0_0_1_4_3_4 - 0.00701298701298726*G0_0_1_4_4_0 - 0.00467532467532484*G0_0_1_4_4_1 + 0.0187012987012994*G0_0_1_4_4_2 + 0.0187012987012994*G0_0_1_4_4_3 - 0.00467532467532484*G0_0_1_4_5_1 + 0.00467532467532484*G0_0_1_4_5_2 - 0.000584415584415573*G0_0_1_5_0_0 + 0.00409090909090921*G0_0_1_5_0_1 - 0.00233766233766242*G0_0_1_5_0_2 + 0.00467532467532483*G0_0_1_5_0_3 + 0.00701298701298728*G0_0_1_5_0_5 + 0.00409090909090921*G0_0_1_5_1_0 - 0.0187012987012994*G0_0_1_5_1_1 + 0.00350649350649363*G0_0_1_5_1_2 - 0.0233766233766242*G0_0_1_5_1_3 - 0.00467532467532484*G0_0_1_5_1_4 - 0.0187012987012993*G0_0_1_5_1_5 - 0.00233766233766242*G0_0_1_5_2_0 + 0.00350649350649363*G0_0_1_5_2_1 + 0.00116883116883122*G0_0_1_5_2_2 + 0.0140259740259745*G0_0_1_5_2_3 + 0.00467532467532484*G0_0_1_5_2_4 + 0.00467532467532483*G0_0_1_5_2_5 + 0.00467532467532483*G0_0_1_5_3_0 - 0.0233766233766242*G0_0_1_5_3_1 + 0.0140259740259745*G0_0_1_5_3_2 - 0.028051948051949*G0_0_1_5_3_3 - 0.0187012987012993*G0_0_1_5_3_5 - 0.00467532467532484*G0_0_1_5_4_1 + 0.00467532467532484*G0_0_1_5_4_2 + 0.00701298701298728*G0_0_1_5_5_0 - 0.0187012987012993*G0_0_1_5_5_1 + 0.00467532467532483*G0_0_1_5_5_2 - 0.0187012987012993*G0_0_1_5_5_3 - 0.001461038961039*G0_1_0_0_0_4 + 0.00146103896103902*G0_1_0_0_0_5 + 0.00138798701298705*G0_1_0_0_1_1 + 0.00146103896103901*G0_1_0_0_1_3 - 0.000584415584415604*G0_1_0_0_1_4 - 0.00058441558441561*G0_1_0_0_1_5 - 0.00138798701298706*G0_1_0_0_2_2 - 0.00146103896103901*G0_1_0_0_2_3 + 0.000584415584415596*G0_1_0_0_2_4 + 0.0005844155844156*G0_1_0_0_2_5 + 0.00146103896103901*G0_1_0_0_3_1 - 0.00146103896103901*G0_1_0_0_3_2 + 0.0011688311688312*G0_1_0_0_3_4 - 0.0011688311688312*G0_1_0_0_3_5 - 0.001461038961039*G0_1_0_0_4_0 - 0.000584415584415604*G0_1_0_0_4_1 + 0.000584415584415596*G0_1_0_0_4_2 + 0.0011688311688312*G0_1_0_0_4_3 + 0.00350649350649362*G0_1_0_0_4_4 + 0.00146103896103902*G0_1_0_0_5_0 - 0.00058441558441561*G0_1_0_0_5_1 + 0.0005844155844156*G0_1_0_0_5_2 - 0.0011688311688312*G0_1_0_0_5_3 - 0.0035064935064936*G0_1_0_0_5_5 + 0.00138798701298705*G0_1_0_1_0_1 + 0.00146103896103901*G0_1_0_1_0_3 - 0.000584415584415604*G0_1_0_1_0_4 - 0.00058441558441561*G0_1_0_1_0_5 + 0.00138798701298705*G0_1_0_1_1_0 - 0.0241071428571436*G0_1_0_1_1_1 + 0.00445616883116898*G0_1_0_1_1_2 - 0.0163636363636369*G0_1_0_1_1_3 - 0.00146103896103901*G0_1_0_1_1_4 - 0.00409090909090922*G0_1_0_1_1_5 + 0.00445616883116898*G0_1_0_1_2_1 - 0.00445616883116899*G0_1_0_1_2_2 - 0.000876623376623407*G0_1_0_1_2_4 + 0.000876623376623407*G0_1_0_1_2_5 + 0.00146103896103901*G0_1_0_1_3_0 - 0.0163636363636369*G0_1_0_1_3_1 - 0.0350649350649363*G0_1_0_1_3_3 - 0.00467532467532485*G0_1_0_1_3_5 - 0.000584415584415604*G0_1_0_1_4_0 - 0.00146103896103901*G0_1_0_1_4_1 - 0.000876623376623407*G0_1_0_1_4_2 + 0.00818181818181843*G0_1_0_1_4_4 + 0.00116883116883121*G0_1_0_1_4_5 - 0.00058441558441561*G0_1_0_1_5_0 - 0.00409090909090922*G0_1_0_1_5_1 + 0.000876623376623407*G0_1_0_1_5_2 - 0.00467532467532484*G0_1_0_1_5_3 + 0.00116883116883121*G0_1_0_1_5_4 - 0.0023376623376624*G0_1_0_1_5_5 - 0.00138798701298706*G0_1_0_2_0_2 - 0.00146103896103901*G0_1_0_2_0_3 + 0.000584415584415596*G0_1_0_2_0_4 + 0.0005844155844156*G0_1_0_2_0_5 + 0.00445616883116898*G0_1_0_2_1_1 - 0.00445616883116899*G0_1_0_2_1_2 - 0.000876623376623407*G0_1_0_2_1_4 + 0.000876623376623407*G0_1_0_2_1_5 - 0.00138798701298706*G0_1_0_2_2_0 - 0.00445616883116899*G0_1_0_2_2_1 + 0.0241071428571438*G0_1_0_2_2_2 + 0.0163636363636369*G0_1_0_2_2_3 + 0.00409090909090925*G0_1_0_2_2_4 + 0.00146103896103902*G0_1_0_2_2_5 - 0.00146103896103901*G0_1_0_2_3_0 + 0.0163636363636369*G0_1_0_2_3_2 + 0.0350649350649363*G0_1_0_2_3_3 + 0.00467532467532484*G0_1_0_2_3_4 + 0.000584415584415597*G0_1_0_2_4_0 - 0.000876623376623407*G0_1_0_2_4_1 + 0.00409090909090926*G0_1_0_2_4_2 + 0.00467532467532484*G0_1_0_2_4_3 + 0.00233766233766243*G0_1_0_2_4_4 - 0.00116883116883121*G0_1_0_2_4_5 + 0.000584415584415601*G0_1_0_2_5_0 + 0.000876623376623407*G0_1_0_2_5_1 + 0.00146103896103902*G0_1_0_2_5_2 - 0.00116883116883121*G0_1_0_2_5_4 - 0.00818181818181846*G0_1_0_2_5_5 + 0.00146103896103901*G0_1_0_3_0_1 - 0.00146103896103901*G0_1_0_3_0_2 + 0.0011688311688312*G0_1_0_3_0_4 - 0.0011688311688312*G0_1_0_3_0_5 + 0.00146103896103901*G0_1_0_3_1_0 - 0.0163636363636369*G0_1_0_3_1_1 - 0.0350649350649363*G0_1_0_3_1_3 - 0.00467532467532484*G0_1_0_3_1_5 - 0.00146103896103901*G0_1_0_3_2_0 + 0.0163636363636369*G0_1_0_3_2_2 + 0.0350649350649363*G0_1_0_3_2_3 + 0.00467532467532484*G0_1_0_3_2_4 - 0.0350649350649363*G0_1_0_3_3_1 + 0.0350649350649363*G0_1_0_3_3_2 + 0.0011688311688312*G0_1_0_3_4_0 + 0.00467532467532484*G0_1_0_3_4_2 - 0.0187012987012993*G0_1_0_3_4_4 - 0.0011688311688312*G0_1_0_3_5_0 - 0.00467532467532484*G0_1_0_3_5_1 + 0.0187012987012993*G0_1_0_3_5_5 - 0.001461038961039*G0_1_0_4_0_0 - 0.000584415584415604*G0_1_0_4_0_1 + 0.000584415584415597*G0_1_0_4_0_2 + 0.0011688311688312*G0_1_0_4_0_3 + 0.00350649350649362*G0_1_0_4_0_4 - 0.000584415584415604*G0_1_0_4_1_0 - 0.00146103896103901*G0_1_0_4_1_1 - 0.000876623376623407*G0_1_0_4_1_2 + 0.00818181818181843*G0_1_0_4_1_4 + 0.00116883116883121*G0_1_0_4_1_5 + 0.000584415584415597*G0_1_0_4_2_0 - 0.000876623376623407*G0_1_0_4_2_1 + 0.00409090909090925*G0_1_0_4_2_2 + 0.00467532467532484*G0_1_0_4_2_3 + 0.00233766233766243*G0_1_0_4_2_4 - 0.00116883116883121*G0_1_0_4_2_5 + 0.0011688311688312*G0_1_0_4_3_0 + 0.00467532467532484*G0_1_0_4_3_2 - 0.0187012987012993*G0_1_0_4_3_4 + 0.00350649350649362*G0_1_0_4_4_0 + 0.00818181818181844*G0_1_0_4_4_1 + 0.00233766233766243*G0_1_0_4_4_2 - 0.0187012987012993*G0_1_0_4_4_3 - 0.0841558441558467*G0_1_0_4_4_4 - 0.0140259740259745*G0_1_0_4_4_5 + 0.00116883116883121*G0_1_0_4_5_1 - 0.00116883116883121*G0_1_0_4_5_2 - 0.0140259740259745*G0_1_0_4_5_4 + 0.0140259740259745*G0_1_0_4_5_5 + 0.00146103896103902*G0_1_0_5_0_0 - 0.00058441558441561*G0_1_0_5_0_1 + 0.0005844155844156*G0_1_0_5_0_2 - 0.0011688311688312*G0_1_0_5_0_3 - 0.0035064935064936*G0_1_0_5_0_5 - 0.00058441558441561*G0_1_0_5_1_0 - 0.00409090909090922*G0_1_0_5_1_1 + 0.000876623376623407*G0_1_0_5_1_2 - 0.00467532467532484*G0_1_0_5_1_3 + 0.00116883116883121*G0_1_0_5_1_4 - 0.0023376623376624*G0_1_0_5_1_5 + 0.000584415584415601*G0_1_0_5_2_0 + 0.000876623376623407*G0_1_0_5_2_1 + 0.00146103896103901*G0_1_0_5_2_2 - 0.00116883116883121*G0_1_0_5_2_4 - 0.00818181818181846*G0_1_0_5_2_5 - 0.0011688311688312*G0_1_0_5_3_0 - 0.00467532467532484*G0_1_0_5_3_1 + 0.0187012987012993*G0_1_0_5_3_5 + 0.00116883116883121*G0_1_0_5_4_1 - 0.00116883116883121*G0_1_0_5_4_2 - 0.0140259740259745*G0_1_0_5_4_4 + 0.0140259740259745*G0_1_0_5_4_5 - 0.0035064935064936*G0_1_0_5_5_0 - 0.0023376623376624*G0_1_0_5_5_1 - 0.00818181818181846*G0_1_0_5_5_2 + 0.0187012987012993*G0_1_0_5_5_3 + 0.0140259740259745*G0_1_0_5_5_4 + 0.0841558441558471*G0_1_0_5_5_5 - 0.00065746753246748*G0_1_1_0_0_0 + 0.0013149350649351*G0_1_1_0_0_1 + 0.000219155844155846*G0_1_1_0_0_2 + 0.00525974025974042*G0_1_1_0_0_3 + 0.00262987012987023*G0_1_1_0_0_4 + 0.0105194805194809*G0_1_1_0_0_5 + 0.0013149350649351*G0_1_1_0_1_0 - 0.00832792207792238*G0_1_1_0_1_1 + 0.00131493506493511*G0_1_1_0_1_2 + 0.00350649350649361*G0_1_1_0_1_3 + 0.0017532467532468*G0_1_1_0_1_4 - 0.0140259740259745*G0_1_1_0_1_5 + 0.000219155844155846*G0_1_1_0_2_0 + 0.00131493506493511*G0_1_1_0_2_1 - 0.00284902597402606*G0_1_1_0_2_2 - 0.00350649350649362*G0_1_1_0_2_3 - 0.00175324675324681*G0_1_1_0_2_4 + 0.0017532467532468*G0_1_1_0_2_5 + 0.00525974025974042*G0_1_1_0_3_0 + 0.00350649350649361*G0_1_1_0_3_1 - 0.00350649350649362*G0_1_1_0_3_2 - 0.0350649350649361*G0_1_1_0_3_3 - 0.0140259740259745*G0_1_1_0_3_4 - 0.0140259740259745*G0_1_1_0_3_5 + 0.00262987012987023*G0_1_1_0_4_0 + 0.0017532467532468*G0_1_1_0_4_1 - 0.00175324675324681*G0_1_1_0_4_2 - 0.0140259740259745*G0_1_1_0_4_3 - 0.0105194805194808*G0_1_1_0_4_4 - 0.00701298701298721*G0_1_1_0_4_5 + 0.0105194805194809*G0_1_1_0_5_0 - 0.0140259740259745*G0_1_1_0_5_1 + 0.0017532467532468*G0_1_1_0_5_2 - 0.0140259740259745*G0_1_1_0_5_3 - 0.00701298701298721*G0_1_1_0_5_4 - 0.0350649350649361*G0_1_1_0_5_5 + 0.0013149350649351*G0_1_1_1_0_0 - 0.00832792207792238*G0_1_1_1_0_1 + 0.00131493506493511*G0_1_1_1_0_2 + 0.00350649350649361*G0_1_1_1_0_3 + 0.0017532467532468*G0_1_1_1_0_4 - 0.0140259740259745*G0_1_1_1_0_5 - 0.00832792207792238*G0_1_1_1_1_0 + 0.0131493506493515*G0_1_1_1_1_1 + 0.00482142857142872*G0_1_1_1_1_2 - 0.00876623376623399*G0_1_1_1_1_3 + 0.00350649350649362*G0_1_1_1_1_4 + 0.0438311688311705*G0_1_1_1_1_5 + 0.00131493506493511*G0_1_1_1_2_0 + 0.00482142857142872*G0_1_1_1_2_1 - 0.00657467532467556*G0_1_1_1_2_2 - 0.00701298701298727*G0_1_1_1_2_3 - 0.00350649350649362*G0_1_1_1_2_4 - 0.00350649350649363*G0_1_1_1_2_5 + 0.00350649350649361*G0_1_1_1_3_0 - 0.00876623376623399*G0_1_1_1_3_1 - 0.00701298701298727*G0_1_1_1_3_2 - 0.0701298701298725*G0_1_1_1_3_3 - 0.0140259740259745*G0_1_1_1_3_4 + 0.0017532467532468*G0_1_1_1_4_0 + 0.00350649350649362*G0_1_1_1_4_1 - 0.00350649350649362*G0_1_1_1_4_2 - 0.0140259740259745*G0_1_1_1_4_3 - 0.00701298701298725*G0_1_1_1_4_4 - 0.0140259740259745*G0_1_1_1_5_0 + 0.0438311688311705*G0_1_1_1_5_1 - 0.00350649350649363*G0_1_1_1_5_2 + 0.0701298701298726*G0_1_1_1_5_5 + 0.000219155844155846*G0_1_1_2_0_0 + 0.00131493506493511*G0_1_1_2_0_1 - 0.00284902597402606*G0_1_1_2_0_2 - 0.00350649350649362*G0_1_1_2_0_3 - 0.00175324675324681*G0_1_1_2_0_4 + 0.0017532467532468*G0_1_1_2_0_5 + 0.00131493506493511*G0_1_1_2_1_0 + 0.00482142857142872*G0_1_1_2_1_1 - 0.00657467532467556*G0_1_1_2_1_2 - 0.00701298701298727*G0_1_1_2_1_3 - 0.00350649350649362*G0_1_1_2_1_4 - 0.00350649350649363*G0_1_1_2_1_5 - 0.00284902597402606*G0_1_1_2_2_0 - 0.00657467532467556*G0_1_1_2_2_1 + 0.0243262987012996*G0_1_1_2_2_2 + 0.0298051948051959*G0_1_1_2_2_3 + 0.00964285714285748*G0_1_1_2_2_4 + 0.00350649350649364*G0_1_1_2_2_5 - 0.00350649350649362*G0_1_1_2_3_0 - 0.00701298701298727*G0_1_1_2_3_1 + 0.0298051948051959*G0_1_1_2_3_2 + 0.0631168831168854*G0_1_1_2_3_3 + 0.0140259740259745*G0_1_1_2_3_4 - 0.00175324675324681*G0_1_1_2_4_0 - 0.00350649350649362*G0_1_1_2_4_1 + 0.00964285714285748*G0_1_1_2_4_2 + 0.0140259740259745*G0_1_1_2_4_3 + 0.0105194805194809*G0_1_1_2_4_4 + 0.0017532467532468*G0_1_1_2_5_0 - 0.00350649350649363*G0_1_1_2_5_1 + 0.00350649350649364*G0_1_1_2_5_2 - 0.0210389610389618*G0_1_1_2_5_5 + 0.00525974025974042*G0_1_1_3_0_0 + 0.00350649350649361*G0_1_1_3_0_1 - 0.00350649350649362*G0_1_1_3_0_2 - 0.0350649350649361*G0_1_1_3_0_3 - 0.0140259740259745*G0_1_1_3_0_4 - 0.0140259740259745*G0_1_1_3_0_5 + 0.00350649350649361*G0_1_1_3_1_0 - 0.00876623376623399*G0_1_1_3_1_1 - 0.00701298701298727*G0_1_1_3_1_2 - 0.0701298701298725*G0_1_1_3_1_3 - 0.0140259740259745*G0_1_1_3_1_4 - 0.00350649350649362*G0_1_1_3_2_0 - 0.00701298701298727*G0_1_1_3_2_1 + 0.0298051948051959*G0_1_1_3_2_2 + 0.0631168831168854*G0_1_1_3_2_3 + 0.0140259740259745*G0_1_1_3_2_4 - 0.0350649350649361*G0_1_1_3_3_0 - 0.0701298701298725*G0_1_1_3_3_1 + 0.0631168831168854*G0_1_1_3_3_2 + 0.490909090909108*G0_1_1_3_3_3 + 0.0981818181818215*G0_1_1_3_3_4 + 0.0701298701298725*G0_1_1_3_3_5 - 0.0140259740259745*G0_1_1_3_4_0 - 0.0140259740259745*G0_1_1_3_4_1 + 0.0140259740259745*G0_1_1_3_4_2 + 0.0981818181818215*G0_1_1_3_4_3 + 0.0420779220779235*G0_1_1_3_4_4 + 0.028051948051949*G0_1_1_3_4_5 - 0.0140259740259745*G0_1_1_3_5_0 + 0.0701298701298725*G0_1_1_3_5_3 + 0.028051948051949*G0_1_1_3_5_4 + 0.0701298701298726*G0_1_1_3_5_5 + 0.00262987012987023*G0_1_1_4_0_0 + 0.0017532467532468*G0_1_1_4_0_1 - 0.00175324675324681*G0_1_1_4_0_2 - 0.0140259740259745*G0_1_1_4_0_3 - 0.0105194805194808*G0_1_1_4_0_4 - 0.00701298701298721*G0_1_1_4_0_5 + 0.0017532467532468*G0_1_1_4_1_0 + 0.00350649350649362*G0_1_1_4_1_1 - 0.00350649350649362*G0_1_1_4_1_2 - 0.0140259740259745*G0_1_1_4_1_3 - 0.00701298701298725*G0_1_1_4_1_4 - 0.00175324675324681*G0_1_1_4_2_0 - 0.00350649350649362*G0_1_1_4_2_1 + 0.00964285714285748*G0_1_1_4_2_2 + 0.0140259740259745*G0_1_1_4_2_3 + 0.0105194805194809*G0_1_1_4_2_4 - 0.0140259740259745*G0_1_1_4_3_0 - 0.0140259740259745*G0_1_1_4_3_1 + 0.0140259740259745*G0_1_1_4_3_2 + 0.0981818181818214*G0_1_1_4_3_3 + 0.0420779220779235*G0_1_1_4_3_4 + 0.028051948051949*G0_1_1_4_3_5 - 0.0105194805194808*G0_1_1_4_4_0 - 0.00701298701298725*G0_1_1_4_4_1 + 0.0105194805194809*G0_1_1_4_4_2 + 0.0420779220779235*G0_1_1_4_4_3 + 0.028051948051949*G0_1_1_4_4_4 + 0.0140259740259745*G0_1_1_4_4_5 - 0.00701298701298721*G0_1_1_4_5_0 + 0.028051948051949*G0_1_1_4_5_3 + 0.0140259740259745*G0_1_1_4_5_4 + 0.0420779220779236*G0_1_1_4_5_5 + 0.0105194805194809*G0_1_1_5_0_0 - 0.0140259740259745*G0_1_1_5_0_1 + 0.0017532467532468*G0_1_1_5_0_2 - 0.0140259740259745*G0_1_1_5_0_3 - 0.00701298701298721*G0_1_1_5_0_4 - 0.0350649350649361*G0_1_1_5_0_5 - 0.0140259740259745*G0_1_1_5_1_0 + 0.0438311688311705*G0_1_1_5_1_1 - 0.00350649350649363*G0_1_1_5_1_2 + 0.0701298701298726*G0_1_1_5_1_5 + 0.0017532467532468*G0_1_1_5_2_0 - 0.00350649350649363*G0_1_1_5_2_1 + 0.00350649350649364*G0_1_1_5_2_2 - 0.0210389610389618*G0_1_1_5_2_5 - 0.0140259740259745*G0_1_1_5_3_0 + 0.0701298701298725*G0_1_1_5_3_3 + 0.028051948051949*G0_1_1_5_3_4 + 0.0701298701298726*G0_1_1_5_3_5 - 0.00701298701298721*G0_1_1_5_4_0 + 0.028051948051949*G0_1_1_5_4_3 + 0.0140259740259745*G0_1_1_5_4_4 + 0.0420779220779236*G0_1_1_5_4_5 - 0.0350649350649361*G0_1_1_5_5_0 + 0.0701298701298726*G0_1_1_5_5_1 - 0.0210389610389618*G0_1_1_5_5_2 + 0.0701298701298726*G0_1_1_5_5_3 + 0.0420779220779236*G0_1_1_5_5_4 + 0.490909090909109*G0_1_1_5_5_5; + A[94] = A[49] + 0.00065746753246755*G0_0_1_0_0_0 - 0.000365259740259755*G0_0_1_0_0_1 + 0.00102272727272731*G0_0_1_0_0_2 - 0.000876623376623394*G0_0_1_0_0_3 + 0.00321428571428581*G0_0_1_0_0_4 + 0.00116883116883122*G0_0_1_0_0_5 - 0.000365259740259754*G0_0_1_0_1_0 - 0.00116883116883121*G0_0_1_0_1_1 + 0.000876623376623407*G0_0_1_0_1_2 + 0.00116883116883121*G0_0_1_0_1_3 + 0.00146103896103901*G0_0_1_0_1_4 - 0.00116883116883121*G0_0_1_0_1_5 + 0.00102272727272731*G0_0_1_0_2_0 + 0.000876623376623407*G0_0_1_0_2_1 - 0.00431006493506509*G0_0_1_0_2_2 - 0.00555194805194824*G0_0_1_0_2_3 - 0.00584415584415604*G0_0_1_0_2_4 - 0.00146103896103901*G0_0_1_0_2_5 - 0.000876623376623393*G0_0_1_0_3_0 + 0.00116883116883121*G0_0_1_0_3_1 - 0.00555194805194824*G0_0_1_0_3_2 + 0.0210389610389616*G0_0_1_0_3_3 - 0.00116883116883123*G0_0_1_0_3_4 + 0.00467532467532481*G0_0_1_0_3_5 + 0.00321428571428581*G0_0_1_0_4_0 + 0.00146103896103901*G0_0_1_0_4_1 - 0.00584415584415604*G0_0_1_0_4_2 - 0.00116883116883123*G0_0_1_0_4_3 - 0.0105194805194809*G0_0_1_0_4_4 + 0.00116883116883122*G0_0_1_0_5_0 - 0.00116883116883121*G0_0_1_0_5_1 - 0.00146103896103901*G0_0_1_0_5_2 + 0.00467532467532481*G0_0_1_0_5_3 - 0.000365259740259754*G0_0_1_1_0_0 - 0.00116883116883121*G0_0_1_1_0_1 + 0.000876623376623406*G0_0_1_1_0_2 + 0.00116883116883121*G0_0_1_1_0_3 + 0.00146103896103901*G0_0_1_1_0_4 - 0.00116883116883121*G0_0_1_1_0_5 - 0.00116883116883121*G0_0_1_1_1_0 + 0.0109577922077925*G0_0_1_1_1_1 + 0.00102272727272732*G0_0_1_1_1_2 - 0.00292207792207804*G0_0_1_1_1_3 + 0.00233766233766241*G0_0_1_1_1_4 + 0.00584415584415604*G0_0_1_1_1_5 + 0.000876623376623406*G0_0_1_1_2_0 + 0.00102272727272732*G0_0_1_1_2_1 - 0.00650162337662361*G0_0_1_1_2_2 - 0.00262987012987022*G0_0_1_1_2_4 + 0.00116883116883121*G0_0_1_1_3_0 - 0.00292207792207804*G0_0_1_1_3_1 - 0.0210389610389618*G0_0_1_1_3_3 - 0.00701298701298726*G0_0_1_1_3_4 - 0.00233766233766243*G0_0_1_1_3_5 + 0.00146103896103901*G0_0_1_1_4_0 + 0.00233766233766241*G0_0_1_1_4_1 - 0.00262987012987022*G0_0_1_1_4_2 - 0.00701298701298726*G0_0_1_1_4_3 - 0.0151948051948057*G0_0_1_1_4_4 - 0.00467532467532484*G0_0_1_1_4_5 - 0.00116883116883121*G0_0_1_1_5_0 + 0.00584415584415605*G0_0_1_1_5_1 - 0.00233766233766243*G0_0_1_1_5_3 - 0.00467532467532484*G0_0_1_1_5_4 + 0.00233766233766241*G0_0_1_1_5_5 + 0.00102272727272731*G0_0_1_2_0_0 + 0.000876623376623406*G0_0_1_2_0_1 - 0.00431006493506509*G0_0_1_2_0_2 - 0.00555194805194823*G0_0_1_2_0_3 - 0.00584415584415604*G0_0_1_2_0_4 - 0.00146103896103901*G0_0_1_2_0_5 + 0.000876623376623407*G0_0_1_2_1_0 + 0.00102272727272732*G0_0_1_2_1_1 - 0.00650162337662361*G0_0_1_2_1_2 - 0.00262987012987022*G0_0_1_2_1_4 - 0.00431006493506509*G0_0_1_2_2_0 - 0.00650162337662361*G0_0_1_2_2_1 + 0.0482142857142876*G0_0_1_2_2_2 + 0.0204545454545462*G0_0_1_2_2_3 + 0.0204545454545462*G0_0_1_2_2_4 + 0.00204545454545463*G0_0_1_2_2_5 - 0.00555194805194824*G0_0_1_2_3_0 + 0.0204545454545462*G0_0_1_2_3_2 + 0.0420779220779236*G0_0_1_2_3_3 + 0.0163636363636369*G0_0_1_2_3_4 + 0.00701298701298726*G0_0_1_2_3_5 - 0.00584415584415604*G0_0_1_2_4_0 - 0.00262987012987022*G0_0_1_2_4_1 + 0.0204545454545462*G0_0_1_2_4_2 + 0.0163636363636369*G0_0_1_2_4_3 + 0.0187012987012994*G0_0_1_2_4_4 + 0.00116883116883122*G0_0_1_2_4_5 - 0.00146103896103901*G0_0_1_2_5_0 + 0.00204545454545463*G0_0_1_2_5_2 + 0.00701298701298726*G0_0_1_2_5_3 + 0.00116883116883122*G0_0_1_2_5_4 - 0.00233766233766242*G0_0_1_2_5_5 - 0.000876623376623393*G0_0_1_3_0_0 + 0.00116883116883121*G0_0_1_3_0_1 - 0.00555194805194824*G0_0_1_3_0_2 + 0.0210389610389616*G0_0_1_3_0_3 - 0.00116883116883123*G0_0_1_3_0_4 + 0.00467532467532481*G0_0_1_3_0_5 + 0.00116883116883121*G0_0_1_3_1_0 - 0.00292207792207804*G0_0_1_3_1_1 - 0.0210389610389619*G0_0_1_3_1_3 - 0.00701298701298726*G0_0_1_3_1_4 - 0.00233766233766243*G0_0_1_3_1_5 - 0.00555194805194824*G0_0_1_3_2_0 + 0.0204545454545462*G0_0_1_3_2_2 + 0.0420779220779236*G0_0_1_3_2_3 + 0.0163636363636369*G0_0_1_3_2_4 + 0.00701298701298726*G0_0_1_3_2_5 + 0.0210389610389616*G0_0_1_3_3_0 - 0.0210389610389619*G0_0_1_3_3_1 + 0.0420779220779236*G0_0_1_3_3_2 - 0.420779220779235*G0_0_1_3_3_3 - 0.0280519480519489*G0_0_1_3_3_4 - 0.056103896103898*G0_0_1_3_3_5 - 0.00116883116883123*G0_0_1_3_4_0 - 0.00701298701298726*G0_0_1_3_4_1 + 0.0163636363636369*G0_0_1_3_4_2 - 0.0280519480519489*G0_0_1_3_4_3 + 0.0327272727272738*G0_0_1_3_4_4 + 0.00467532467532482*G0_0_1_3_5_0 - 0.00233766233766244*G0_0_1_3_5_1 + 0.00701298701298726*G0_0_1_3_5_2 - 0.056103896103898*G0_0_1_3_5_3 - 0.00467532467532482*G0_0_1_3_5_5 + 0.00321428571428581*G0_0_1_4_0_0 + 0.00146103896103901*G0_0_1_4_0_1 - 0.00584415584415604*G0_0_1_4_0_2 - 0.00116883116883123*G0_0_1_4_0_3 - 0.0105194805194809*G0_0_1_4_0_4 + 0.00146103896103901*G0_0_1_4_1_0 + 0.00233766233766241*G0_0_1_4_1_1 - 0.00262987012987022*G0_0_1_4_1_2 - 0.00701298701298726*G0_0_1_4_1_3 - 0.0151948051948057*G0_0_1_4_1_4 - 0.00467532467532484*G0_0_1_4_1_5 - 0.00584415584415604*G0_0_1_4_2_0 - 0.00262987012987022*G0_0_1_4_2_1 + 0.0204545454545462*G0_0_1_4_2_2 + 0.0163636363636369*G0_0_1_4_2_3 + 0.0187012987012994*G0_0_1_4_2_4 + 0.00116883116883122*G0_0_1_4_2_5 - 0.00116883116883123*G0_0_1_4_3_0 - 0.00701298701298726*G0_0_1_4_3_1 + 0.0163636363636369*G0_0_1_4_3_2 - 0.0280519480519489*G0_0_1_4_3_3 + 0.0327272727272738*G0_0_1_4_3_4 - 0.0105194805194809*G0_0_1_4_4_0 - 0.0151948051948057*G0_0_1_4_4_1 + 0.0187012987012994*G0_0_1_4_4_2 + 0.0327272727272738*G0_0_1_4_4_3 + 0.12623376623377*G0_0_1_4_4_4 + 0.028051948051949*G0_0_1_4_4_5 - 0.00467532467532484*G0_0_1_4_5_1 + 0.00116883116883122*G0_0_1_4_5_2 + 0.028051948051949*G0_0_1_4_5_4 + 0.0140259740259745*G0_0_1_4_5_5 + 0.00116883116883122*G0_0_1_5_0_0 - 0.00116883116883121*G0_0_1_5_0_1 - 0.00146103896103901*G0_0_1_5_0_2 + 0.00467532467532482*G0_0_1_5_0_3 - 0.00116883116883121*G0_0_1_5_1_0 + 0.00584415584415604*G0_0_1_5_1_1 - 0.00233766233766243*G0_0_1_5_1_3 - 0.00467532467532484*G0_0_1_5_1_4 + 0.00233766233766241*G0_0_1_5_1_5 - 0.00146103896103901*G0_0_1_5_2_0 + 0.00204545454545463*G0_0_1_5_2_2 + 0.00701298701298726*G0_0_1_5_2_3 + 0.00116883116883122*G0_0_1_5_2_4 - 0.00233766233766242*G0_0_1_5_2_5 + 0.00467532467532482*G0_0_1_5_3_0 - 0.00233766233766244*G0_0_1_5_3_1 + 0.00701298701298726*G0_0_1_5_3_2 - 0.056103896103898*G0_0_1_5_3_3 - 0.00467532467532483*G0_0_1_5_3_5 - 0.00467532467532484*G0_0_1_5_4_1 + 0.00116883116883122*G0_0_1_5_4_2 + 0.028051948051949*G0_0_1_5_4_4 + 0.0140259740259745*G0_0_1_5_4_5 + 0.00233766233766241*G0_0_1_5_5_1 - 0.00233766233766242*G0_0_1_5_5_2 - 0.00467532467532482*G0_0_1_5_5_3 + 0.0140259740259745*G0_0_1_5_5_4 + 0.0420779220779237*G0_0_1_5_5_5 - 0.00065746753246755*G0_1_0_0_0_0 + 0.000365259740259755*G0_1_0_0_0_1 - 0.00102272727272731*G0_1_0_0_0_2 + 0.000876623376623393*G0_1_0_0_0_3 - 0.00321428571428581*G0_1_0_0_0_4 - 0.00116883116883122*G0_1_0_0_0_5 + 0.000365259740259754*G0_1_0_0_1_0 + 0.00116883116883121*G0_1_0_0_1_1 - 0.000876623376623407*G0_1_0_0_1_2 - 0.00116883116883121*G0_1_0_0_1_3 - 0.00146103896103901*G0_1_0_0_1_4 + 0.00116883116883121*G0_1_0_0_1_5 - 0.00102272727272731*G0_1_0_0_2_0 - 0.000876623376623406*G0_1_0_0_2_1 + 0.00431006493506509*G0_1_0_0_2_2 + 0.00555194805194824*G0_1_0_0_2_3 + 0.00584415584415604*G0_1_0_0_2_4 + 0.00146103896103901*G0_1_0_0_2_5 + 0.000876623376623393*G0_1_0_0_3_0 - 0.00116883116883121*G0_1_0_0_3_1 + 0.00555194805194824*G0_1_0_0_3_2 - 0.0210389610389616*G0_1_0_0_3_3 + 0.00116883116883123*G0_1_0_0_3_4 - 0.00467532467532481*G0_1_0_0_3_5 - 0.00321428571428581*G0_1_0_0_4_0 - 0.00146103896103901*G0_1_0_0_4_1 + 0.00584415584415604*G0_1_0_0_4_2 + 0.00116883116883123*G0_1_0_0_4_3 + 0.0105194805194809*G0_1_0_0_4_4 - 0.00116883116883122*G0_1_0_0_5_0 + 0.00116883116883121*G0_1_0_0_5_1 + 0.00146103896103901*G0_1_0_0_5_2 - 0.00467532467532481*G0_1_0_0_5_3 + 0.000365259740259755*G0_1_0_1_0_0 + 0.00116883116883121*G0_1_0_1_0_1 - 0.000876623376623406*G0_1_0_1_0_2 - 0.00116883116883121*G0_1_0_1_0_3 - 0.00146103896103901*G0_1_0_1_0_4 + 0.00116883116883121*G0_1_0_1_0_5 + 0.00116883116883121*G0_1_0_1_1_0 - 0.0109577922077925*G0_1_0_1_1_1 - 0.00102272727272732*G0_1_0_1_1_2 + 0.00292207792207804*G0_1_0_1_1_3 - 0.00233766233766241*G0_1_0_1_1_4 - 0.00584415584415604*G0_1_0_1_1_5 - 0.000876623376623406*G0_1_0_1_2_0 - 0.00102272727272732*G0_1_0_1_2_1 + 0.00650162337662361*G0_1_0_1_2_2 + 0.00262987012987022*G0_1_0_1_2_4 - 0.00116883116883121*G0_1_0_1_3_0 + 0.00292207792207804*G0_1_0_1_3_1 + 0.0210389610389618*G0_1_0_1_3_3 + 0.00701298701298726*G0_1_0_1_3_4 + 0.00233766233766243*G0_1_0_1_3_5 - 0.00146103896103901*G0_1_0_1_4_0 - 0.00233766233766241*G0_1_0_1_4_1 + 0.00262987012987022*G0_1_0_1_4_2 + 0.00701298701298726*G0_1_0_1_4_3 + 0.0151948051948057*G0_1_0_1_4_4 + 0.00467532467532484*G0_1_0_1_4_5 + 0.00116883116883121*G0_1_0_1_5_0 - 0.00584415584415604*G0_1_0_1_5_1 + 0.00233766233766243*G0_1_0_1_5_3 + 0.00467532467532484*G0_1_0_1_5_4 - 0.00233766233766241*G0_1_0_1_5_5 - 0.00102272727272731*G0_1_0_2_0_0 - 0.000876623376623406*G0_1_0_2_0_1 + 0.00431006493506509*G0_1_0_2_0_2 + 0.00555194805194823*G0_1_0_2_0_3 + 0.00584415584415604*G0_1_0_2_0_4 + 0.00146103896103901*G0_1_0_2_0_5 - 0.000876623376623407*G0_1_0_2_1_0 - 0.00102272727272732*G0_1_0_2_1_1 + 0.00650162337662361*G0_1_0_2_1_2 + 0.00262987012987022*G0_1_0_2_1_4 + 0.00431006493506509*G0_1_0_2_2_0 + 0.00650162337662361*G0_1_0_2_2_1 - 0.0482142857142876*G0_1_0_2_2_2 - 0.0204545454545462*G0_1_0_2_2_3 - 0.0204545454545462*G0_1_0_2_2_4 - 0.00204545454545463*G0_1_0_2_2_5 + 0.00555194805194824*G0_1_0_2_3_0 - 0.0204545454545462*G0_1_0_2_3_2 - 0.0420779220779236*G0_1_0_2_3_3 - 0.0163636363636369*G0_1_0_2_3_4 - 0.00701298701298726*G0_1_0_2_3_5 + 0.00584415584415604*G0_1_0_2_4_0 + 0.00262987012987022*G0_1_0_2_4_1 - 0.0204545454545462*G0_1_0_2_4_2 - 0.0163636363636369*G0_1_0_2_4_3 - 0.0187012987012994*G0_1_0_2_4_4 - 0.00116883116883122*G0_1_0_2_4_5 + 0.00146103896103901*G0_1_0_2_5_0 - 0.00204545454545463*G0_1_0_2_5_2 - 0.00701298701298726*G0_1_0_2_5_3 - 0.00116883116883122*G0_1_0_2_5_4 + 0.00233766233766242*G0_1_0_2_5_5 + 0.000876623376623393*G0_1_0_3_0_0 - 0.00116883116883121*G0_1_0_3_0_1 + 0.00555194805194824*G0_1_0_3_0_2 - 0.0210389610389616*G0_1_0_3_0_3 + 0.00116883116883123*G0_1_0_3_0_4 - 0.00467532467532481*G0_1_0_3_0_5 - 0.00116883116883121*G0_1_0_3_1_0 + 0.00292207792207804*G0_1_0_3_1_1 + 0.0210389610389619*G0_1_0_3_1_3 + 0.00701298701298726*G0_1_0_3_1_4 + 0.00233766233766243*G0_1_0_3_1_5 + 0.00555194805194824*G0_1_0_3_2_0 - 0.0204545454545462*G0_1_0_3_2_2 - 0.0420779220779236*G0_1_0_3_2_3 - 0.0163636363636369*G0_1_0_3_2_4 - 0.00701298701298726*G0_1_0_3_2_5 - 0.0210389610389616*G0_1_0_3_3_0 + 0.0210389610389619*G0_1_0_3_3_1 - 0.0420779220779236*G0_1_0_3_3_2 + 0.420779220779235*G0_1_0_3_3_3 + 0.0280519480519489*G0_1_0_3_3_4 + 0.056103896103898*G0_1_0_3_3_5 + 0.00116883116883123*G0_1_0_3_4_0 + 0.00701298701298726*G0_1_0_3_4_1 - 0.0163636363636369*G0_1_0_3_4_2 + 0.0280519480519489*G0_1_0_3_4_3 - 0.0327272727272738*G0_1_0_3_4_4 - 0.00467532467532482*G0_1_0_3_5_0 + 0.00233766233766244*G0_1_0_3_5_1 - 0.00701298701298726*G0_1_0_3_5_2 + 0.056103896103898*G0_1_0_3_5_3 + 0.00467532467532482*G0_1_0_3_5_5 - 0.00321428571428581*G0_1_0_4_0_0 - 0.00146103896103901*G0_1_0_4_0_1 + 0.00584415584415604*G0_1_0_4_0_2 + 0.00116883116883123*G0_1_0_4_0_3 + 0.0105194805194809*G0_1_0_4_0_4 - 0.00146103896103901*G0_1_0_4_1_0 - 0.00233766233766241*G0_1_0_4_1_1 + 0.00262987012987022*G0_1_0_4_1_2 + 0.00701298701298726*G0_1_0_4_1_3 + 0.0151948051948057*G0_1_0_4_1_4 + 0.00467532467532484*G0_1_0_4_1_5 + 0.00584415584415604*G0_1_0_4_2_0 + 0.00262987012987022*G0_1_0_4_2_1 - 0.0204545454545462*G0_1_0_4_2_2 - 0.0163636363636369*G0_1_0_4_2_3 - 0.0187012987012994*G0_1_0_4_2_4 - 0.00116883116883122*G0_1_0_4_2_5 + 0.00116883116883123*G0_1_0_4_3_0 + 0.00701298701298726*G0_1_0_4_3_1 - 0.0163636363636369*G0_1_0_4_3_2 + 0.0280519480519489*G0_1_0_4_3_3 - 0.0327272727272738*G0_1_0_4_3_4 + 0.0105194805194809*G0_1_0_4_4_0 + 0.0151948051948057*G0_1_0_4_4_1 - 0.0187012987012994*G0_1_0_4_4_2 - 0.0327272727272738*G0_1_0_4_4_3 - 0.12623376623377*G0_1_0_4_4_4 - 0.028051948051949*G0_1_0_4_4_5 + 0.00467532467532484*G0_1_0_4_5_1 - 0.00116883116883122*G0_1_0_4_5_2 - 0.028051948051949*G0_1_0_4_5_4 - 0.0140259740259745*G0_1_0_4_5_5 - 0.00116883116883122*G0_1_0_5_0_0 + 0.00116883116883121*G0_1_0_5_0_1 + 0.00146103896103901*G0_1_0_5_0_2 - 0.00467532467532481*G0_1_0_5_0_3 + 0.00116883116883121*G0_1_0_5_1_0 - 0.00584415584415604*G0_1_0_5_1_1 + 0.00233766233766244*G0_1_0_5_1_3 + 0.00467532467532484*G0_1_0_5_1_4 - 0.00233766233766241*G0_1_0_5_1_5 + 0.00146103896103901*G0_1_0_5_2_0 - 0.00204545454545463*G0_1_0_5_2_2 - 0.00701298701298726*G0_1_0_5_2_3 - 0.00116883116883122*G0_1_0_5_2_4 + 0.00233766233766242*G0_1_0_5_2_5 - 0.00467532467532481*G0_1_0_5_3_0 + 0.00233766233766244*G0_1_0_5_3_1 - 0.00701298701298726*G0_1_0_5_3_2 + 0.056103896103898*G0_1_0_5_3_3 + 0.00467532467532482*G0_1_0_5_3_5 + 0.00467532467532484*G0_1_0_5_4_1 - 0.00116883116883122*G0_1_0_5_4_2 - 0.028051948051949*G0_1_0_5_4_4 - 0.0140259740259745*G0_1_0_5_4_5 - 0.00233766233766241*G0_1_0_5_5_1 + 0.00233766233766242*G0_1_0_5_5_2 + 0.00467532467532482*G0_1_0_5_5_3 - 0.0140259740259745*G0_1_0_5_5_4 - 0.0420779220779237*G0_1_0_5_5_5; + A[98] = -A[93] - 0.0278327922077932*G0_0_0_0_0_0 + 0.00182629870129876*G0_0_0_0_0_1 + 0.00438311688311704*G0_0_0_0_0_2 - 0.00642857142857162*G0_0_0_0_0_3 - 0.0315584415584426*G0_0_0_0_0_4 - 0.00788961038961066*G0_0_0_0_0_5 + 0.00182629870129876*G0_0_0_0_1_0 - 0.000730519480519502*G0_0_0_0_1_1 - 0.00102272727272731*G0_0_0_0_1_2 - 0.001461038961039*G0_0_0_0_1_3 + 0.000584415584415613*G0_0_0_0_1_4 + 0.00438311688311704*G0_0_0_0_2_0 - 0.00102272727272731*G0_0_0_0_2_1 + 0.00357954545454557*G0_0_0_0_2_2 - 0.000876623376623409*G0_0_0_0_2_3 + 0.0146103896103901*G0_0_0_0_2_4 - 0.000584415584415601*G0_0_0_0_2_5 - 0.00642857142857162*G0_0_0_0_3_0 - 0.001461038961039*G0_0_0_0_3_1 - 0.000876623376623407*G0_0_0_0_3_2 + 0.0409090909090921*G0_0_0_0_3_3 + 0.011688311688312*G0_0_0_0_3_4 + 0.0140259740259745*G0_0_0_0_3_5 - 0.0315584415584426*G0_0_0_0_4_0 + 0.000584415584415613*G0_0_0_0_4_1 + 0.0146103896103901*G0_0_0_0_4_2 + 0.011688311688312*G0_0_0_0_4_3 - 0.0210389610389618*G0_0_0_0_4_4 - 0.00788961038961066*G0_0_0_0_5_0 - 0.0005844155844156*G0_0_0_0_5_2 + 0.0140259740259745*G0_0_0_0_5_3 + 0.0105194805194809*G0_0_0_0_5_5 + 0.00182629870129876*G0_0_0_1_0_0 - 0.000730519480519502*G0_0_0_1_0_1 - 0.00102272727272731*G0_0_0_1_0_2 - 0.001461038961039*G0_0_0_1_0_3 + 0.000584415584415613*G0_0_0_1_0_4 - 0.000730519480519502*G0_0_0_1_1_0 + 0.0284902597402606*G0_0_0_1_1_1 - 0.00292207792207801*G0_0_0_1_1_2 + 0.00438311688311701*G0_0_0_1_1_3 - 0.00146103896103901*G0_0_0_1_1_4 + 0.00438311688311703*G0_0_0_1_1_5 - 0.00102272727272731*G0_0_0_1_2_0 - 0.00292207792207801*G0_0_0_1_2_1 + 0.00182629870129876*G0_0_0_1_2_2 + 0.00584415584415604*G0_0_0_1_2_3 + 0.00204545454545461*G0_0_0_1_2_4 + 0.00146103896103901*G0_0_0_1_2_5 - 0.001461038961039*G0_0_0_1_3_0 + 0.00438311688311701*G0_0_0_1_3_1 + 0.00584415584415604*G0_0_0_1_3_2 + 0.017532467532468*G0_0_0_1_3_3 + 0.00584415584415602*G0_0_0_1_3_4 + 0.000584415584415613*G0_0_0_1_4_0 - 0.00146103896103901*G0_0_0_1_4_1 + 0.00204545454545461*G0_0_0_1_4_2 + 0.00584415584415602*G0_0_0_1_4_3 + 0.0187012987012993*G0_0_0_1_4_4 + 0.00438311688311703*G0_0_0_1_5_1 + 0.00146103896103901*G0_0_0_1_5_2 - 0.00584415584415605*G0_0_0_1_5_5 + 0.00438311688311704*G0_0_0_2_0_0 - 0.00102272727272731*G0_0_0_2_0_1 + 0.00357954545454557*G0_0_0_2_0_2 - 0.000876623376623408*G0_0_0_2_0_3 + 0.0146103896103901*G0_0_0_2_0_4 - 0.000584415584415601*G0_0_0_2_0_5 - 0.00102272727272731*G0_0_0_2_1_0 - 0.00292207792207801*G0_0_0_2_1_1 + 0.00182629870129876*G0_0_0_2_1_2 + 0.00584415584415604*G0_0_0_2_1_3 + 0.00204545454545461*G0_0_0_2_1_4 + 0.00146103896103901*G0_0_0_2_1_5 + 0.00357954545454557*G0_0_0_2_2_0 + 0.00182629870129876*G0_0_0_2_2_1 - 0.0175324675324681*G0_0_0_2_2_2 - 0.0140259740259745*G0_0_0_2_2_3 - 0.0268831168831178*G0_0_0_2_2_4 - 0.00321428571428583*G0_0_0_2_2_5 - 0.000876623376623407*G0_0_0_2_3_0 + 0.00584415584415604*G0_0_0_2_3_1 - 0.0140259740259745*G0_0_0_2_3_2 - 0.00233766233766241*G0_0_0_2_3_4 + 0.00818181818181845*G0_0_0_2_3_5 + 0.0146103896103901*G0_0_0_2_4_0 + 0.00204545454545461*G0_0_0_2_4_1 - 0.0268831168831178*G0_0_0_2_4_2 - 0.00233766233766241*G0_0_0_2_4_3 - 0.0187012987012993*G0_0_0_2_4_4 + 0.00233766233766241*G0_0_0_2_4_5 - 0.000584415584415601*G0_0_0_2_5_0 + 0.00146103896103901*G0_0_0_2_5_1 - 0.00321428571428583*G0_0_0_2_5_2 + 0.00818181818181845*G0_0_0_2_5_3 + 0.00233766233766241*G0_0_0_2_5_4 + 0.00467532467532483*G0_0_0_2_5_5 - 0.00642857142857162*G0_0_0_3_0_0 - 0.001461038961039*G0_0_0_3_0_1 - 0.000876623376623407*G0_0_0_3_0_2 + 0.0409090909090921*G0_0_0_3_0_3 + 0.011688311688312*G0_0_0_3_0_4 + 0.0140259740259745*G0_0_0_3_0_5 - 0.001461038961039*G0_0_0_3_1_0 + 0.00438311688311701*G0_0_0_3_1_1 + 0.00584415584415604*G0_0_0_3_1_2 + 0.017532467532468*G0_0_0_3_1_3 + 0.00584415584415602*G0_0_0_3_1_4 - 0.000876623376623408*G0_0_0_3_2_0 + 0.00584415584415604*G0_0_0_3_2_1 - 0.0140259740259745*G0_0_0_3_2_2 - 0.00233766233766241*G0_0_0_3_2_4 + 0.00818181818181845*G0_0_0_3_2_5 + 0.0409090909090921*G0_0_0_3_3_0 + 0.017532467532468*G0_0_0_3_3_1 - 0.56103896103898*G0_0_0_3_3_3 - 0.0935064935064965*G0_0_0_3_3_4 - 0.0981818181818214*G0_0_0_3_3_5 + 0.011688311688312*G0_0_0_3_4_0 + 0.00584415584415602*G0_0_0_3_4_1 - 0.00233766233766241*G0_0_0_3_4_2 - 0.0935064935064965*G0_0_0_3_4_3 - 0.0607792207792227*G0_0_0_3_4_4 - 0.028051948051949*G0_0_0_3_4_5 + 0.0140259740259745*G0_0_0_3_5_0 + 0.00818181818181845*G0_0_0_3_5_2 - 0.0981818181818214*G0_0_0_3_5_3 - 0.028051948051949*G0_0_0_3_5_4 - 0.0374025974025986*G0_0_0_3_5_5 - 0.0315584415584426*G0_0_0_4_0_0 + 0.000584415584415613*G0_0_0_4_0_1 + 0.0146103896103901*G0_0_0_4_0_2 + 0.011688311688312*G0_0_0_4_0_3 - 0.0210389610389618*G0_0_0_4_0_4 + 0.000584415584415613*G0_0_0_4_1_0 - 0.00146103896103901*G0_0_0_4_1_1 + 0.00204545454545461*G0_0_0_4_1_2 + 0.00584415584415602*G0_0_0_4_1_3 + 0.0187012987012993*G0_0_0_4_1_4 + 0.0146103896103901*G0_0_0_4_2_0 + 0.00204545454545461*G0_0_0_4_2_1 - 0.0268831168831178*G0_0_0_4_2_2 - 0.00233766233766241*G0_0_0_4_2_3 - 0.0187012987012993*G0_0_0_4_2_4 + 0.00233766233766241*G0_0_0_4_2_5 + 0.011688311688312*G0_0_0_4_3_0 + 0.00584415584415602*G0_0_0_4_3_1 - 0.00233766233766241*G0_0_0_4_3_2 - 0.0935064935064965*G0_0_0_4_3_3 - 0.0607792207792227*G0_0_0_4_3_4 - 0.028051948051949*G0_0_0_4_3_5 - 0.0210389610389618*G0_0_0_4_4_0 + 0.0187012987012993*G0_0_0_4_4_1 - 0.0187012987012993*G0_0_0_4_4_2 - 0.0607792207792227*G0_0_0_4_4_3 - 0.518961038961056*G0_0_0_4_4_4 - 0.0420779220779235*G0_0_0_4_4_5 + 0.00233766233766241*G0_0_0_4_5_2 - 0.028051948051949*G0_0_0_4_5_3 - 0.0420779220779235*G0_0_0_4_5_4 - 0.00935064935064966*G0_0_0_4_5_5 - 0.00788961038961066*G0_0_0_5_0_0 - 0.0005844155844156*G0_0_0_5_0_2 + 0.0140259740259745*G0_0_0_5_0_3 + 0.0105194805194809*G0_0_0_5_0_5 + 0.00438311688311703*G0_0_0_5_1_1 + 0.00146103896103901*G0_0_0_5_1_2 - 0.00584415584415605*G0_0_0_5_1_5 - 0.000584415584415601*G0_0_0_5_2_0 + 0.00146103896103901*G0_0_0_5_2_1 - 0.00321428571428583*G0_0_0_5_2_2 + 0.00818181818181845*G0_0_0_5_2_3 + 0.00233766233766241*G0_0_0_5_2_4 + 0.00467532467532483*G0_0_0_5_2_5 + 0.0140259740259745*G0_0_0_5_3_0 + 0.00818181818181845*G0_0_0_5_3_2 - 0.0981818181818214*G0_0_0_5_3_3 - 0.028051948051949*G0_0_0_5_3_4 - 0.0374025974025986*G0_0_0_5_3_5 + 0.00233766233766241*G0_0_0_5_4_2 - 0.028051948051949*G0_0_0_5_4_3 - 0.0420779220779235*G0_0_0_5_4_4 - 0.00935064935064966*G0_0_0_5_4_5 + 0.0105194805194809*G0_0_0_5_5_0 - 0.00584415584415605*G0_0_0_5_5_1 + 0.00467532467532483*G0_0_0_5_5_2 - 0.0374025974025986*G0_0_0_5_5_3 - 0.00935064935064967*G0_0_0_5_5_4 - 0.0140259740259745*G0_0_0_5_5_5 - 0.0103003246753251*G0_1_0_0_0_0 + 0.000803571428571462*G0_1_0_0_0_2 - 0.0032142857142858*G0_1_0_0_0_3 - 0.00467532467532485*G0_1_0_0_0_4 + 0.00613636363636387*G0_1_0_0_0_5 + 0.00219155844155853*G0_1_0_0_1_1 - 0.00292207792207801*G0_1_0_0_1_3 - 0.00146103896103901*G0_1_0_0_1_4 - 0.00584415584415606*G0_1_0_0_1_5 + 0.000803571428571462*G0_1_0_0_2_0 - 0.000803571428571464*G0_1_0_0_2_2 - 0.00029220779220781*G0_1_0_0_2_3 + 0.000292207792207792*G0_1_0_0_2_5 - 0.0032142857142858*G0_1_0_0_3_0 - 0.00292207792207801*G0_1_0_0_3_1 - 0.000292207792207809*G0_1_0_0_3_2 + 0.0362337662337673*G0_1_0_0_3_3 + 0.00935064935064963*G0_1_0_0_3_4 + 0.00584415584415604*G0_1_0_0_3_5 - 0.00467532467532485*G0_1_0_0_4_0 - 0.00146103896103901*G0_1_0_0_4_1 + 0.00935064935064963*G0_1_0_0_4_3 - 0.00233766233766245*G0_1_0_0_4_4 + 0.00233766233766243*G0_1_0_0_4_5 + 0.00613636363636387*G0_1_0_0_5_0 - 0.00584415584415606*G0_1_0_0_5_1 + 0.000292207792207791*G0_1_0_0_5_2 + 0.00584415584415604*G0_1_0_0_5_3 + 0.00233766233766243*G0_1_0_0_5_4 + 0.0105194805194811*G0_1_0_0_5_5 + 0.00219155844155853*G0_1_0_1_0_1 - 0.00292207792207801*G0_1_0_1_0_3 - 0.00146103896103901*G0_1_0_1_0_4 - 0.00584415584415606*G0_1_0_1_0_5 + 0.00219155844155853*G0_1_0_1_1_0 - 0.00219155844155851*G0_1_0_1_1_2 - 0.0021915584415585*G0_1_0_1_2_1 + 0.00584415584415605*G0_1_0_1_2_3 + 0.00146103896103901*G0_1_0_1_2_4 + 0.00292207792207802*G0_1_0_1_2_5 - 0.00292207792207801*G0_1_0_1_3_0 + 0.00584415584415605*G0_1_0_1_3_2 + 0.0233766233766241*G0_1_0_1_3_3 + 0.00584415584415602*G0_1_0_1_3_4 - 0.00146103896103901*G0_1_0_1_4_0 + 0.00146103896103901*G0_1_0_1_4_2 + 0.00584415584415602*G0_1_0_1_4_3 - 0.00584415584415605*G0_1_0_1_4_5 - 0.00584415584415606*G0_1_0_1_5_0 + 0.00292207792207802*G0_1_0_1_5_2 - 0.00584415584415605*G0_1_0_1_5_4 - 0.0233766233766242*G0_1_0_1_5_5 + 0.000803571428571462*G0_1_0_2_0_0 - 0.000803571428571464*G0_1_0_2_0_2 - 0.000292207792207809*G0_1_0_2_0_3 + 0.000292207792207791*G0_1_0_2_0_5 - 0.00219155844155851*G0_1_0_2_1_1 + 0.00584415584415605*G0_1_0_2_1_3 + 0.00146103896103901*G0_1_0_2_1_4 + 0.00292207792207802*G0_1_0_2_1_5 - 0.000803571428571464*G0_1_0_2_2_0 + 0.0103003246753251*G0_1_0_2_2_2 - 0.00613636363636382*G0_1_0_2_2_3 + 0.00467532467532487*G0_1_0_2_2_4 + 0.00321428571428583*G0_1_0_2_2_5 - 0.000292207792207809*G0_1_0_2_3_0 + 0.00584415584415605*G0_1_0_2_3_1 - 0.00613636363636382*G0_1_0_2_3_2 - 0.0105194805194809*G0_1_0_2_3_3 - 0.0023376623376624*G0_1_0_2_3_4 - 0.00584415584415604*G0_1_0_2_3_5 + 0.00146103896103901*G0_1_0_2_4_1 + 0.00467532467532487*G0_1_0_2_4_2 - 0.0023376623376624*G0_1_0_2_4_3 + 0.00233766233766245*G0_1_0_2_4_4 - 0.00935064935064967*G0_1_0_2_4_5 + 0.000292207792207792*G0_1_0_2_5_0 + 0.00292207792207802*G0_1_0_2_5_1 + 0.00321428571428583*G0_1_0_2_5_2 - 0.00584415584415604*G0_1_0_2_5_3 - 0.00935064935064967*G0_1_0_2_5_4 - 0.0362337662337675*G0_1_0_2_5_5 - 0.0032142857142858*G0_1_0_3_0_0 - 0.00292207792207801*G0_1_0_3_0_1 - 0.00029220779220781*G0_1_0_3_0_2 + 0.0362337662337673*G0_1_0_3_0_3 + 0.00935064935064963*G0_1_0_3_0_4 + 0.00584415584415604*G0_1_0_3_0_5 - 0.00292207792207801*G0_1_0_3_1_0 + 0.00584415584415605*G0_1_0_3_1_2 + 0.0233766233766241*G0_1_0_3_1_3 + 0.00584415584415602*G0_1_0_3_1_4 - 0.000292207792207809*G0_1_0_3_2_0 + 0.00584415584415605*G0_1_0_3_2_1 - 0.00613636363636382*G0_1_0_3_2_2 - 0.0105194805194809*G0_1_0_3_2_3 - 0.0023376623376624*G0_1_0_3_2_4 - 0.00584415584415604*G0_1_0_3_2_5 + 0.0362337662337673*G0_1_0_3_3_0 + 0.0233766233766241*G0_1_0_3_3_1 - 0.0105194805194809*G0_1_0_3_3_2 - 0.547012987013005*G0_1_0_3_3_3 - 0.0841558441558469*G0_1_0_3_3_4 - 0.0607792207792228*G0_1_0_3_3_5 + 0.00935064935064963*G0_1_0_3_4_0 + 0.00584415584415602*G0_1_0_3_4_1 - 0.0023376623376624*G0_1_0_3_4_2 - 0.0841558441558469*G0_1_0_3_4_3 - 0.0187012987012993*G0_1_0_3_4_4 + 0.00584415584415604*G0_1_0_3_5_0 - 0.00584415584415604*G0_1_0_3_5_2 - 0.0607792207792228*G0_1_0_3_5_3 + 0.0607792207792229*G0_1_0_3_5_5 - 0.00467532467532485*G0_1_0_4_0_0 - 0.00146103896103901*G0_1_0_4_0_1 + 0.00935064935064963*G0_1_0_4_0_3 - 0.00233766233766245*G0_1_0_4_0_4 + 0.00233766233766243*G0_1_0_4_0_5 - 0.00146103896103901*G0_1_0_4_1_0 + 0.00146103896103901*G0_1_0_4_1_2 + 0.00584415584415602*G0_1_0_4_1_3 - 0.00584415584415605*G0_1_0_4_1_5 + 0.00146103896103901*G0_1_0_4_2_1 + 0.00467532467532487*G0_1_0_4_2_2 - 0.0023376623376624*G0_1_0_4_2_3 + 0.00233766233766245*G0_1_0_4_2_4 - 0.00935064935064967*G0_1_0_4_2_5 + 0.00935064935064963*G0_1_0_4_3_0 + 0.00584415584415602*G0_1_0_4_3_1 - 0.0023376623376624*G0_1_0_4_3_2 - 0.0841558441558469*G0_1_0_4_3_3 - 0.0187012987012993*G0_1_0_4_3_4 - 0.00233766233766245*G0_1_0_4_4_0 + 0.00233766233766245*G0_1_0_4_4_2 - 0.0187012987012993*G0_1_0_4_4_3 + 0.0187012987012994*G0_1_0_4_4_5 + 0.00233766233766243*G0_1_0_4_5_0 - 0.00584415584415605*G0_1_0_4_5_1 - 0.00935064935064967*G0_1_0_4_5_2 + 0.0187012987012994*G0_1_0_4_5_4 + 0.0841558441558471*G0_1_0_4_5_5 + 0.00613636363636387*G0_1_0_5_0_0 - 0.00584415584415606*G0_1_0_5_0_1 + 0.000292207792207791*G0_1_0_5_0_2 + 0.00584415584415604*G0_1_0_5_0_3 + 0.00233766233766243*G0_1_0_5_0_4 + 0.0105194805194811*G0_1_0_5_0_5 - 0.00584415584415606*G0_1_0_5_1_0 + 0.00292207792207802*G0_1_0_5_1_2 - 0.00584415584415605*G0_1_0_5_1_4 - 0.0233766233766242*G0_1_0_5_1_5 + 0.000292207792207791*G0_1_0_5_2_0 + 0.00292207792207802*G0_1_0_5_2_1 + 0.00321428571428583*G0_1_0_5_2_2 - 0.00584415584415604*G0_1_0_5_2_3 - 0.00935064935064967*G0_1_0_5_2_4 - 0.0362337662337675*G0_1_0_5_2_5 + 0.00584415584415604*G0_1_0_5_3_0 - 0.00584415584415604*G0_1_0_5_3_2 - 0.0607792207792228*G0_1_0_5_3_3 + 0.0607792207792229*G0_1_0_5_3_5 + 0.00233766233766243*G0_1_0_5_4_0 - 0.00584415584415605*G0_1_0_5_4_1 - 0.00935064935064967*G0_1_0_5_4_2 + 0.0187012987012994*G0_1_0_5_4_4 + 0.0841558441558471*G0_1_0_5_4_5 + 0.0105194805194811*G0_1_0_5_5_0 - 0.0233766233766242*G0_1_0_5_5_1 - 0.0362337662337675*G0_1_0_5_5_2 + 0.0607792207792229*G0_1_0_5_5_3 + 0.0841558441558471*G0_1_0_5_5_4 + 0.547012987013006*G0_1_0_5_5_5; + A[89] = A[98] - 0.0109577922077926*G0_0_1_0_0_0 - 0.00102272727272731*G0_0_1_0_0_1 + 0.00116883116883121*G0_0_1_0_0_2 - 0.0023376623376624*G0_0_1_0_0_3 - 0.00584415584415605*G0_0_1_0_0_4 + 0.00292207792207805*G0_0_1_0_0_5 - 0.00102272727272731*G0_0_1_0_1_0 + 0.0065016233766236*G0_0_1_0_1_1 - 0.000876623376623405*G0_0_1_0_1_2 + 0.00262987012987022*G0_0_1_0_1_3 + 0.00116883116883121*G0_0_1_0_2_0 - 0.000876623376623405*G0_0_1_0_2_1 + 0.000365259740259747*G0_0_1_0_2_2 - 0.00146103896103901*G0_0_1_0_2_3 + 0.0011688311688312*G0_0_1_0_2_4 - 0.00116883116883122*G0_0_1_0_2_5 - 0.0023376623376624*G0_0_1_0_3_0 + 0.00262987012987022*G0_0_1_0_3_1 - 0.00146103896103901*G0_0_1_0_3_2 + 0.0151948051948057*G0_0_1_0_3_3 + 0.00467532467532482*G0_0_1_0_3_4 + 0.00701298701298725*G0_0_1_0_3_5 - 0.00584415584415605*G0_0_1_0_4_0 + 0.0011688311688312*G0_0_1_0_4_2 + 0.00467532467532482*G0_0_1_0_4_3 - 0.00233766233766246*G0_0_1_0_4_4 + 0.00233766233766243*G0_0_1_0_4_5 + 0.00292207792207806*G0_0_1_0_5_0 - 0.00116883116883122*G0_0_1_0_5_2 + 0.00701298701298725*G0_0_1_0_5_3 + 0.00233766233766243*G0_0_1_0_5_4 + 0.0210389610389619*G0_0_1_0_5_5 - 0.00102272727272731*G0_0_1_1_0_0 + 0.00650162337662361*G0_0_1_1_0_1 - 0.000876623376623405*G0_0_1_1_0_2 + 0.00262987012987022*G0_0_1_1_0_3 + 0.0065016233766236*G0_0_1_1_1_0 - 0.0482142857142875*G0_0_1_1_1_1 + 0.0043100649350651*G0_0_1_1_1_2 - 0.0204545454545462*G0_0_1_1_1_3 - 0.00204545454545461*G0_0_1_1_1_4 - 0.0204545454545462*G0_0_1_1_1_5 - 0.000876623376623405*G0_0_1_1_2_0 + 0.0043100649350651*G0_0_1_1_2_1 - 0.00102272727272731*G0_0_1_1_2_2 + 0.00584415584415606*G0_0_1_1_2_3 + 0.00146103896103901*G0_0_1_1_2_4 + 0.00555194805194825*G0_0_1_1_2_5 + 0.00262987012987022*G0_0_1_1_3_0 - 0.0204545454545462*G0_0_1_1_3_1 + 0.00584415584415606*G0_0_1_1_3_2 - 0.0187012987012994*G0_0_1_1_3_3 - 0.00116883116883122*G0_0_1_1_3_4 - 0.016363636363637*G0_0_1_1_3_5 - 0.00204545454545461*G0_0_1_1_4_1 + 0.00146103896103901*G0_0_1_1_4_2 - 0.00116883116883122*G0_0_1_1_4_3 + 0.00233766233766241*G0_0_1_1_4_4 - 0.00701298701298725*G0_0_1_1_4_5 - 0.0204545454545462*G0_0_1_1_5_1 + 0.00555194805194825*G0_0_1_1_5_2 - 0.016363636363637*G0_0_1_1_5_3 - 0.00701298701298726*G0_0_1_1_5_4 - 0.0420779220779235*G0_0_1_1_5_5 + 0.00116883116883121*G0_0_1_2_0_0 - 0.000876623376623405*G0_0_1_2_0_1 + 0.000365259740259747*G0_0_1_2_0_2 - 0.00146103896103901*G0_0_1_2_0_3 + 0.0011688311688312*G0_0_1_2_0_4 - 0.00116883116883122*G0_0_1_2_0_5 - 0.000876623376623405*G0_0_1_2_1_0 + 0.0043100649350651*G0_0_1_2_1_1 - 0.00102272727272731*G0_0_1_2_1_2 + 0.00584415584415605*G0_0_1_2_1_3 + 0.00146103896103901*G0_0_1_2_1_4 + 0.00555194805194825*G0_0_1_2_1_5 + 0.000365259740259747*G0_0_1_2_2_0 - 0.00102272727272731*G0_0_1_2_2_1 - 0.000657467532467517*G0_0_1_2_2_2 - 0.00321428571428581*G0_0_1_2_2_3 - 0.00116883116883118*G0_0_1_2_2_4 + 0.000876623376623406*G0_0_1_2_2_5 - 0.00146103896103901*G0_0_1_2_3_0 + 0.00584415584415605*G0_0_1_2_3_1 - 0.00321428571428581*G0_0_1_2_3_2 + 0.0105194805194809*G0_0_1_2_3_3 + 0.00116883116883122*G0_0_1_2_3_5 + 0.0011688311688312*G0_0_1_2_4_0 + 0.00146103896103901*G0_0_1_2_4_1 - 0.00116883116883118*G0_0_1_2_4_2 - 0.00467532467532484*G0_0_1_2_4_5 - 0.00116883116883122*G0_0_1_2_5_0 + 0.00555194805194825*G0_0_1_2_5_1 + 0.000876623376623406*G0_0_1_2_5_2 + 0.00116883116883122*G0_0_1_2_5_3 - 0.00467532467532484*G0_0_1_2_5_4 - 0.0210389610389618*G0_0_1_2_5_5 - 0.0023376623376624*G0_0_1_3_0_0 + 0.00262987012987022*G0_0_1_3_0_1 - 0.00146103896103901*G0_0_1_3_0_2 + 0.0151948051948057*G0_0_1_3_0_3 + 0.00467532467532482*G0_0_1_3_0_4 + 0.00701298701298725*G0_0_1_3_0_5 + 0.00262987012987022*G0_0_1_3_1_0 - 0.0204545454545462*G0_0_1_3_1_1 + 0.00584415584415606*G0_0_1_3_1_2 - 0.0187012987012994*G0_0_1_3_1_3 - 0.00116883116883122*G0_0_1_3_1_4 - 0.016363636363637*G0_0_1_3_1_5 - 0.00146103896103901*G0_0_1_3_2_0 + 0.00584415584415605*G0_0_1_3_2_1 - 0.00321428571428581*G0_0_1_3_2_2 + 0.0105194805194809*G0_0_1_3_2_3 + 0.00116883116883122*G0_0_1_3_2_5 + 0.0151948051948057*G0_0_1_3_3_0 - 0.0187012987012994*G0_0_1_3_3_1 + 0.0105194805194809*G0_0_1_3_3_2 - 0.12623376623377*G0_0_1_3_3_3 - 0.0280519480519489*G0_0_1_3_3_4 - 0.0327272727272738*G0_0_1_3_3_5 + 0.00467532467532482*G0_0_1_3_4_0 - 0.00116883116883122*G0_0_1_3_4_1 - 0.0280519480519489*G0_0_1_3_4_3 - 0.0140259740259745*G0_0_1_3_4_4 + 0.00701298701298725*G0_0_1_3_5_0 - 0.016363636363637*G0_0_1_3_5_1 + 0.00116883116883122*G0_0_1_3_5_2 - 0.0327272727272738*G0_0_1_3_5_3 + 0.028051948051949*G0_0_1_3_5_5 - 0.00584415584415605*G0_0_1_4_0_0 + 0.0011688311688312*G0_0_1_4_0_2 + 0.00467532467532482*G0_0_1_4_0_3 - 0.00233766233766246*G0_0_1_4_0_4 + 0.00233766233766243*G0_0_1_4_0_5 - 0.00204545454545461*G0_0_1_4_1_1 + 0.00146103896103901*G0_0_1_4_1_2 - 0.00116883116883122*G0_0_1_4_1_3 + 0.00233766233766241*G0_0_1_4_1_4 - 0.00701298701298725*G0_0_1_4_1_5 + 0.0011688311688312*G0_0_1_4_2_0 + 0.00146103896103901*G0_0_1_4_2_1 - 0.00116883116883119*G0_0_1_4_2_2 - 0.00467532467532484*G0_0_1_4_2_5 + 0.00467532467532482*G0_0_1_4_3_0 - 0.00116883116883122*G0_0_1_4_3_1 - 0.0280519480519489*G0_0_1_4_3_3 - 0.0140259740259745*G0_0_1_4_3_4 - 0.00233766233766246*G0_0_1_4_4_0 + 0.00233766233766241*G0_0_1_4_4_1 - 0.0140259740259745*G0_0_1_4_4_3 - 0.0420779220779234*G0_0_1_4_4_4 + 0.00467532467532484*G0_0_1_4_4_5 + 0.00233766233766243*G0_0_1_4_5_0 - 0.00701298701298726*G0_0_1_4_5_1 - 0.00467532467532484*G0_0_1_4_5_2 + 0.00467532467532484*G0_0_1_4_5_4 + 0.0561038961038981*G0_0_1_4_5_5 + 0.00292207792207806*G0_0_1_5_0_0 - 0.00116883116883122*G0_0_1_5_0_2 + 0.00701298701298725*G0_0_1_5_0_3 + 0.00233766233766243*G0_0_1_5_0_4 + 0.0210389610389619*G0_0_1_5_0_5 - 0.0204545454545462*G0_0_1_5_1_1 + 0.00555194805194825*G0_0_1_5_1_2 - 0.016363636363637*G0_0_1_5_1_3 - 0.00701298701298726*G0_0_1_5_1_4 - 0.0420779220779235*G0_0_1_5_1_5 - 0.00116883116883122*G0_0_1_5_2_0 + 0.00555194805194825*G0_0_1_5_2_1 + 0.000876623376623406*G0_0_1_5_2_2 + 0.00116883116883122*G0_0_1_5_2_3 - 0.00467532467532484*G0_0_1_5_2_4 - 0.0210389610389618*G0_0_1_5_2_5 + 0.00701298701298725*G0_0_1_5_3_0 - 0.016363636363637*G0_0_1_5_3_1 + 0.00116883116883122*G0_0_1_5_3_2 - 0.0327272727272738*G0_0_1_5_3_3 + 0.028051948051949*G0_0_1_5_3_5 + 0.00233766233766243*G0_0_1_5_4_0 - 0.00701298701298726*G0_0_1_5_4_1 - 0.00467532467532484*G0_0_1_5_4_2 + 0.00467532467532484*G0_0_1_5_4_4 + 0.0561038961038981*G0_0_1_5_4_5 + 0.0210389610389619*G0_0_1_5_5_0 - 0.0420779220779235*G0_0_1_5_5_1 - 0.0210389610389618*G0_0_1_5_5_2 + 0.028051948051949*G0_0_1_5_5_3 + 0.0561038961038981*G0_0_1_5_5_4 + 0.420779220779236*G0_0_1_5_5_5 + 0.0109577922077926*G0_1_0_0_0_0 + 0.00102272727272731*G0_1_0_0_0_1 - 0.00116883116883121*G0_1_0_0_0_2 + 0.0023376623376624*G0_1_0_0_0_3 + 0.00584415584415605*G0_1_0_0_0_4 - 0.00292207792207806*G0_1_0_0_0_5 + 0.00102272727272731*G0_1_0_0_1_0 - 0.00650162337662361*G0_1_0_0_1_1 + 0.000876623376623405*G0_1_0_0_1_2 - 0.00262987012987022*G0_1_0_0_1_3 - 0.00116883116883121*G0_1_0_0_2_0 + 0.000876623376623405*G0_1_0_0_2_1 - 0.000365259740259747*G0_1_0_0_2_2 + 0.00146103896103901*G0_1_0_0_2_3 - 0.0011688311688312*G0_1_0_0_2_4 + 0.00116883116883122*G0_1_0_0_2_5 + 0.0023376623376624*G0_1_0_0_3_0 - 0.00262987012987022*G0_1_0_0_3_1 + 0.00146103896103901*G0_1_0_0_3_2 - 0.0151948051948057*G0_1_0_0_3_3 - 0.00467532467532482*G0_1_0_0_3_4 - 0.00701298701298725*G0_1_0_0_3_5 + 0.00584415584415605*G0_1_0_0_4_0 - 0.0011688311688312*G0_1_0_0_4_2 - 0.00467532467532482*G0_1_0_0_4_3 + 0.00233766233766246*G0_1_0_0_4_4 - 0.00233766233766243*G0_1_0_0_4_5 - 0.00292207792207806*G0_1_0_0_5_0 + 0.00116883116883122*G0_1_0_0_5_2 - 0.00701298701298725*G0_1_0_0_5_3 - 0.00233766233766243*G0_1_0_0_5_4 - 0.0210389610389619*G0_1_0_0_5_5 + 0.00102272727272731*G0_1_0_1_0_0 - 0.00650162337662361*G0_1_0_1_0_1 + 0.000876623376623405*G0_1_0_1_0_2 - 0.00262987012987022*G0_1_0_1_0_3 - 0.00650162337662361*G0_1_0_1_1_0 + 0.0482142857142875*G0_1_0_1_1_1 - 0.0043100649350651*G0_1_0_1_1_2 + 0.0204545454545462*G0_1_0_1_1_3 + 0.00204545454545461*G0_1_0_1_1_4 + 0.0204545454545462*G0_1_0_1_1_5 + 0.000876623376623405*G0_1_0_1_2_0 - 0.0043100649350651*G0_1_0_1_2_1 + 0.00102272727272731*G0_1_0_1_2_2 - 0.00584415584415606*G0_1_0_1_2_3 - 0.00146103896103901*G0_1_0_1_2_4 - 0.00555194805194825*G0_1_0_1_2_5 - 0.00262987012987022*G0_1_0_1_3_0 + 0.0204545454545462*G0_1_0_1_3_1 - 0.00584415584415606*G0_1_0_1_3_2 + 0.0187012987012994*G0_1_0_1_3_3 + 0.00116883116883122*G0_1_0_1_3_4 + 0.016363636363637*G0_1_0_1_3_5 + 0.00204545454545461*G0_1_0_1_4_1 - 0.00146103896103901*G0_1_0_1_4_2 + 0.00116883116883122*G0_1_0_1_4_3 - 0.00233766233766241*G0_1_0_1_4_4 + 0.00701298701298726*G0_1_0_1_4_5 + 0.0204545454545462*G0_1_0_1_5_1 - 0.00555194805194825*G0_1_0_1_5_2 + 0.016363636363637*G0_1_0_1_5_3 + 0.00701298701298726*G0_1_0_1_5_4 + 0.0420779220779235*G0_1_0_1_5_5 - 0.00116883116883121*G0_1_0_2_0_0 + 0.000876623376623405*G0_1_0_2_0_1 - 0.000365259740259747*G0_1_0_2_0_2 + 0.00146103896103901*G0_1_0_2_0_3 - 0.0011688311688312*G0_1_0_2_0_4 + 0.00116883116883122*G0_1_0_2_0_5 + 0.000876623376623405*G0_1_0_2_1_0 - 0.0043100649350651*G0_1_0_2_1_1 + 0.00102272727272731*G0_1_0_2_1_2 - 0.00584415584415605*G0_1_0_2_1_3 - 0.00146103896103901*G0_1_0_2_1_4 - 0.00555194805194825*G0_1_0_2_1_5 - 0.000365259740259747*G0_1_0_2_2_0 + 0.00102272727272731*G0_1_0_2_2_1 + 0.000657467532467516*G0_1_0_2_2_2 + 0.00321428571428581*G0_1_0_2_2_3 + 0.00116883116883118*G0_1_0_2_2_4 - 0.000876623376623406*G0_1_0_2_2_5 + 0.00146103896103901*G0_1_0_2_3_0 - 0.00584415584415606*G0_1_0_2_3_1 + 0.00321428571428581*G0_1_0_2_3_2 - 0.0105194805194809*G0_1_0_2_3_3 - 0.00116883116883122*G0_1_0_2_3_5 - 0.0011688311688312*G0_1_0_2_4_0 - 0.00146103896103901*G0_1_0_2_4_1 + 0.00116883116883118*G0_1_0_2_4_2 + 0.00467532467532484*G0_1_0_2_4_5 + 0.00116883116883122*G0_1_0_2_5_0 - 0.00555194805194825*G0_1_0_2_5_1 - 0.000876623376623406*G0_1_0_2_5_2 - 0.00116883116883122*G0_1_0_2_5_3 + 0.00467532467532484*G0_1_0_2_5_4 + 0.0210389610389618*G0_1_0_2_5_5 + 0.0023376623376624*G0_1_0_3_0_0 - 0.00262987012987022*G0_1_0_3_0_1 + 0.00146103896103901*G0_1_0_3_0_2 - 0.0151948051948057*G0_1_0_3_0_3 - 0.00467532467532482*G0_1_0_3_0_4 - 0.00701298701298725*G0_1_0_3_0_5 - 0.00262987012987022*G0_1_0_3_1_0 + 0.0204545454545462*G0_1_0_3_1_1 - 0.00584415584415606*G0_1_0_3_1_2 + 0.0187012987012994*G0_1_0_3_1_3 + 0.00116883116883122*G0_1_0_3_1_4 + 0.016363636363637*G0_1_0_3_1_5 + 0.00146103896103901*G0_1_0_3_2_0 - 0.00584415584415606*G0_1_0_3_2_1 + 0.00321428571428581*G0_1_0_3_2_2 - 0.0105194805194809*G0_1_0_3_2_3 - 0.00116883116883122*G0_1_0_3_2_5 - 0.0151948051948057*G0_1_0_3_3_0 + 0.0187012987012994*G0_1_0_3_3_1 - 0.0105194805194809*G0_1_0_3_3_2 + 0.12623376623377*G0_1_0_3_3_3 + 0.0280519480519489*G0_1_0_3_3_4 + 0.0327272727272738*G0_1_0_3_3_5 - 0.00467532467532482*G0_1_0_3_4_0 + 0.00116883116883122*G0_1_0_3_4_1 + 0.0280519480519489*G0_1_0_3_4_3 + 0.0140259740259745*G0_1_0_3_4_4 - 0.00701298701298725*G0_1_0_3_5_0 + 0.016363636363637*G0_1_0_3_5_1 - 0.00116883116883122*G0_1_0_3_5_2 + 0.0327272727272738*G0_1_0_3_5_3 - 0.028051948051949*G0_1_0_3_5_5 + 0.00584415584415605*G0_1_0_4_0_0 - 0.0011688311688312*G0_1_0_4_0_2 - 0.00467532467532482*G0_1_0_4_0_3 + 0.00233766233766246*G0_1_0_4_0_4 - 0.00233766233766243*G0_1_0_4_0_5 + 0.00204545454545461*G0_1_0_4_1_1 - 0.00146103896103901*G0_1_0_4_1_2 + 0.00116883116883122*G0_1_0_4_1_3 - 0.00233766233766241*G0_1_0_4_1_4 + 0.00701298701298726*G0_1_0_4_1_5 - 0.0011688311688312*G0_1_0_4_2_0 - 0.00146103896103901*G0_1_0_4_2_1 + 0.00116883116883119*G0_1_0_4_2_2 + 0.00467532467532484*G0_1_0_4_2_5 - 0.00467532467532482*G0_1_0_4_3_0 + 0.00116883116883122*G0_1_0_4_3_1 + 0.0280519480519489*G0_1_0_4_3_3 + 0.0140259740259745*G0_1_0_4_3_4 + 0.00233766233766246*G0_1_0_4_4_0 - 0.00233766233766241*G0_1_0_4_4_1 + 0.0140259740259745*G0_1_0_4_4_3 + 0.0420779220779234*G0_1_0_4_4_4 - 0.00467532467532484*G0_1_0_4_4_5 - 0.00233766233766243*G0_1_0_4_5_0 + 0.00701298701298726*G0_1_0_4_5_1 + 0.00467532467532484*G0_1_0_4_5_2 - 0.00467532467532484*G0_1_0_4_5_4 - 0.0561038961038981*G0_1_0_4_5_5 - 0.00292207792207806*G0_1_0_5_0_0 + 0.00116883116883122*G0_1_0_5_0_2 - 0.00701298701298725*G0_1_0_5_0_3 - 0.00233766233766243*G0_1_0_5_0_4 - 0.0210389610389619*G0_1_0_5_0_5 + 0.0204545454545462*G0_1_0_5_1_1 - 0.00555194805194825*G0_1_0_5_1_2 + 0.016363636363637*G0_1_0_5_1_3 + 0.00701298701298726*G0_1_0_5_1_4 + 0.0420779220779235*G0_1_0_5_1_5 + 0.00116883116883122*G0_1_0_5_2_0 - 0.00555194805194825*G0_1_0_5_2_1 - 0.000876623376623406*G0_1_0_5_2_2 - 0.00116883116883122*G0_1_0_5_2_3 + 0.00467532467532484*G0_1_0_5_2_4 + 0.0210389610389618*G0_1_0_5_2_5 - 0.00701298701298725*G0_1_0_5_3_0 + 0.016363636363637*G0_1_0_5_3_1 - 0.00116883116883122*G0_1_0_5_3_2 + 0.0327272727272738*G0_1_0_5_3_3 - 0.028051948051949*G0_1_0_5_3_5 - 0.00233766233766243*G0_1_0_5_4_0 + 0.00701298701298726*G0_1_0_5_4_1 + 0.00467532467532484*G0_1_0_5_4_2 - 0.00467532467532484*G0_1_0_5_4_4 - 0.0561038961038981*G0_1_0_5_4_5 - 0.0210389610389619*G0_1_0_5_5_0 + 0.0420779220779235*G0_1_0_5_5_1 + 0.0210389610389618*G0_1_0_5_5_2 - 0.028051948051949*G0_1_0_5_5_3 - 0.0561038961038981*G0_1_0_5_5_4 - 0.420779220779236*G0_1_0_5_5_5; + A[97] = A[98] + 0.0742938311688338*G0_0_0_0_0_0 - 0.00504058441558459*G0_0_0_0_0_1 - 0.0113961038961043*G0_0_0_0_0_2 + 0.00262987012987021*G0_0_0_0_0_3 + 0.0569805194805214*G0_0_0_0_0_4 + 0.0175324675324682*G0_0_0_0_0_5 - 0.00504058441558459*G0_0_0_0_1_0 + 0.00504058441558458*G0_0_0_0_1_1 + 0.00438311688311703*G0_0_0_0_1_3 - 0.00438311688311703*G0_0_0_0_1_4 - 0.0113961038961043*G0_0_0_0_2_0 + 0.00262987012987022*G0_0_0_0_2_2 - 0.00175324675324681*G0_0_0_0_2_3 - 0.0157792207792213*G0_0_0_0_2_4 - 0.00262987012987022*G0_0_0_0_2_5 + 0.00262987012987021*G0_0_0_0_3_0 + 0.00438311688311703*G0_0_0_0_3_1 - 0.00175324675324681*G0_0_0_0_3_2 + 0.0105194805194808*G0_0_0_0_3_3 + 0.00350649350649362*G0_0_0_0_3_4 + 0.0569805194805214*G0_0_0_0_4_0 - 0.00438311688311703*G0_0_0_0_4_1 - 0.0157792207792213*G0_0_0_0_4_2 + 0.00350649350649362*G0_0_0_0_4_3 + 0.0806493506493534*G0_0_0_0_4_4 + 0.0140259740259745*G0_0_0_0_4_5 + 0.0175324675324682*G0_0_0_0_5_0 - 0.00262987012987022*G0_0_0_0_5_2 + 0.0140259740259745*G0_0_0_0_5_4 - 0.00504058441558459*G0_0_0_1_0_0 + 0.00504058441558458*G0_0_0_1_0_1 + 0.00438311688311703*G0_0_0_1_0_3 - 0.00438311688311703*G0_0_0_1_0_4 + 0.00504058441558458*G0_0_0_1_1_0 - 0.0742938311688335*G0_0_0_1_1_1 + 0.0113961038961043*G0_0_0_1_1_2 - 0.0569805194805214*G0_0_0_1_1_3 - 0.00262987012987022*G0_0_0_1_1_4 - 0.0175324675324682*G0_0_0_1_1_5 + 0.0113961038961043*G0_0_0_1_2_1 - 0.00262987012987022*G0_0_0_1_2_2 + 0.0157792207792213*G0_0_0_1_2_3 + 0.00175324675324681*G0_0_0_1_2_4 + 0.00262987012987023*G0_0_0_1_2_5 + 0.00438311688311703*G0_0_0_1_3_0 - 0.0569805194805214*G0_0_0_1_3_1 + 0.0157792207792213*G0_0_0_1_3_2 - 0.0806493506493535*G0_0_0_1_3_3 - 0.00350649350649362*G0_0_0_1_3_4 - 0.0140259740259746*G0_0_0_1_3_5 - 0.00438311688311703*G0_0_0_1_4_0 - 0.00262987012987022*G0_0_0_1_4_1 + 0.00175324675324681*G0_0_0_1_4_2 - 0.00350649350649362*G0_0_0_1_4_3 - 0.0105194805194809*G0_0_0_1_4_4 - 0.0175324675324682*G0_0_0_1_5_1 + 0.00262987012987023*G0_0_0_1_5_2 - 0.0140259740259746*G0_0_0_1_5_3 - 0.0113961038961043*G0_0_0_2_0_0 + 0.00262987012987022*G0_0_0_2_0_2 - 0.00175324675324681*G0_0_0_2_0_3 - 0.0157792207792213*G0_0_0_2_0_4 - 0.00262987012987022*G0_0_0_2_0_5 + 0.0113961038961043*G0_0_0_2_1_1 - 0.00262987012987022*G0_0_0_2_1_2 + 0.0157792207792213*G0_0_0_2_1_3 + 0.00175324675324681*G0_0_0_2_1_4 + 0.00262987012987023*G0_0_0_2_1_5 + 0.00262987012987022*G0_0_0_2_2_0 - 0.00262987012987022*G0_0_0_2_2_1 - 0.00701298701298726*G0_0_0_2_2_3 + 0.00701298701298725*G0_0_0_2_2_4 - 0.00175324675324681*G0_0_0_2_3_0 + 0.0157792207792213*G0_0_0_2_3_1 - 0.00701298701298726*G0_0_0_2_3_2 + 0.028051948051949*G0_0_0_2_3_3 + 0.00350649350649365*G0_0_0_2_3_5 - 0.0157792207792213*G0_0_0_2_4_0 + 0.00175324675324681*G0_0_0_2_4_1 + 0.00701298701298725*G0_0_0_2_4_2 - 0.0280519480519489*G0_0_0_2_4_4 - 0.00350649350649362*G0_0_0_2_4_5 - 0.00262987012987022*G0_0_0_2_5_0 + 0.00262987012987023*G0_0_0_2_5_1 + 0.00350649350649365*G0_0_0_2_5_3 - 0.00350649350649362*G0_0_0_2_5_4 + 0.00262987012987021*G0_0_0_3_0_0 + 0.00438311688311703*G0_0_0_3_0_1 - 0.00175324675324681*G0_0_0_3_0_2 + 0.0105194805194808*G0_0_0_3_0_3 + 0.00350649350649362*G0_0_0_3_0_4 + 0.00438311688311703*G0_0_0_3_1_0 - 0.0569805194805214*G0_0_0_3_1_1 + 0.0157792207792213*G0_0_0_3_1_2 - 0.0806493506493535*G0_0_0_3_1_3 - 0.00350649350649363*G0_0_0_3_1_4 - 0.0140259740259746*G0_0_0_3_1_5 - 0.00175324675324681*G0_0_0_3_2_0 + 0.0157792207792213*G0_0_0_3_2_1 - 0.00701298701298726*G0_0_0_3_2_2 + 0.028051948051949*G0_0_0_3_2_3 + 0.00350649350649365*G0_0_0_3_2_5 + 0.0105194805194808*G0_0_0_3_3_0 - 0.0806493506493535*G0_0_0_3_3_1 + 0.028051948051949*G0_0_0_3_3_2 - 0.378701298701312*G0_0_0_3_3_3 - 0.0140259740259746*G0_0_0_3_3_4 - 0.0280519480519492*G0_0_0_3_3_5 + 0.00350649350649362*G0_0_0_3_4_0 - 0.00350649350649363*G0_0_0_3_4_1 - 0.0140259740259746*G0_0_0_3_4_3 + 0.0140259740259744*G0_0_0_3_4_4 - 0.0140259740259746*G0_0_0_3_5_1 + 0.00350649350649365*G0_0_0_3_5_2 - 0.0280519480519492*G0_0_0_3_5_3 + 0.0569805194805214*G0_0_0_4_0_0 - 0.00438311688311703*G0_0_0_4_0_1 - 0.0157792207792213*G0_0_0_4_0_2 + 0.00350649350649362*G0_0_0_4_0_3 + 0.0806493506493534*G0_0_0_4_0_4 + 0.0140259740259745*G0_0_0_4_0_5 - 0.00438311688311703*G0_0_0_4_1_0 - 0.00262987012987022*G0_0_0_4_1_1 + 0.00175324675324681*G0_0_0_4_1_2 - 0.00350649350649362*G0_0_0_4_1_3 - 0.0105194805194809*G0_0_0_4_1_4 - 0.0157792207792213*G0_0_0_4_2_0 + 0.00175324675324681*G0_0_0_4_2_1 + 0.00701298701298725*G0_0_0_4_2_2 - 0.0280519480519489*G0_0_0_4_2_4 - 0.00350649350649362*G0_0_0_4_2_5 + 0.00350649350649362*G0_0_0_4_3_0 - 0.00350649350649363*G0_0_0_4_3_1 - 0.0140259740259746*G0_0_0_4_3_3 + 0.0140259740259744*G0_0_0_4_3_4 + 0.0806493506493534*G0_0_0_4_4_0 - 0.0105194805194809*G0_0_0_4_4_1 - 0.0280519480519489*G0_0_0_4_4_2 + 0.0140259740259744*G0_0_0_4_4_3 + 0.378701298701311*G0_0_0_4_4_4 + 0.028051948051949*G0_0_0_4_4_5 + 0.0140259740259745*G0_0_0_4_5_0 - 0.00350649350649362*G0_0_0_4_5_2 + 0.028051948051949*G0_0_0_4_5_4 + 0.0175324675324682*G0_0_0_5_0_0 - 0.00262987012987022*G0_0_0_5_0_2 + 0.0140259740259745*G0_0_0_5_0_4 - 0.0175324675324682*G0_0_0_5_1_1 + 0.00262987012987023*G0_0_0_5_1_2 - 0.0140259740259746*G0_0_0_5_1_3 - 0.00262987012987022*G0_0_0_5_2_0 + 0.00262987012987023*G0_0_0_5_2_1 + 0.00350649350649365*G0_0_0_5_2_3 - 0.00350649350649362*G0_0_0_5_2_4 - 0.0140259740259746*G0_0_0_5_3_1 + 0.00350649350649365*G0_0_0_5_3_2 - 0.0280519480519492*G0_0_0_5_3_3 + 0.0140259740259745*G0_0_0_5_4_0 - 0.00350649350649362*G0_0_0_5_4_2 + 0.028051948051949*G0_0_0_5_4_4 - 0.0111769480519485*G0_0_1_0_0_0 + 0.00109577922077926*G0_0_1_0_0_1 + 0.00262987012987022*G0_0_1_0_0_2 - 0.00438311688311702*G0_0_1_0_0_3 - 0.0113961038961043*G0_0_1_0_0_4 - 0.0105194805194809*G0_0_1_0_0_5 + 0.00109577922077926*G0_0_1_0_1_0 + 0.00613636363636383*G0_0_1_0_1_1 - 0.00219155844155852*G0_0_1_0_1_2 + 0.00701298701298725*G0_0_1_0_1_3 + 0.00262987012987022*G0_0_1_0_1_4 + 0.00701298701298725*G0_0_1_0_1_5 + 0.00262987012987022*G0_0_1_0_2_0 - 0.00219155844155852*G0_0_1_0_2_1 + 0.000219155844155843*G0_0_1_0_2_2 - 0.00262987012987022*G0_0_1_0_2_3 + 0.00350649350649362*G0_0_1_0_2_4 + 0.000876623376623411*G0_0_1_0_2_5 - 0.00438311688311702*G0_0_1_0_3_0 + 0.00701298701298725*G0_0_1_0_3_1 - 0.00262987012987022*G0_0_1_0_3_2 + 0.0280519480519489*G0_0_1_0_3_3 + 0.00350649350649361*G0_0_1_0_3_4 + 0.00701298701298724*G0_0_1_0_3_5 - 0.0113961038961043*G0_0_1_0_4_0 + 0.00262987012987022*G0_0_1_0_4_1 + 0.00350649350649362*G0_0_1_0_4_2 + 0.00350649350649361*G0_0_1_0_4_3 - 0.0105194805194809*G0_0_1_0_4_4 - 0.00701298701298727*G0_0_1_0_4_5 - 0.0105194805194809*G0_0_1_0_5_0 + 0.00701298701298726*G0_0_1_0_5_1 + 0.00087662337662341*G0_0_1_0_5_2 + 0.00701298701298724*G0_0_1_0_5_3 - 0.00701298701298727*G0_0_1_0_5_4 - 0.00701298701298729*G0_0_1_0_5_5 + 0.00109577922077926*G0_0_1_1_0_0 + 0.00613636363636383*G0_0_1_1_0_1 - 0.00219155844155852*G0_0_1_1_0_2 + 0.00701298701298725*G0_0_1_1_0_3 + 0.00262987012987023*G0_0_1_1_0_4 + 0.00701298701298726*G0_0_1_1_0_5 + 0.00613636363636383*G0_0_1_1_1_0 - 0.085470779220782*G0_0_1_1_1_1 + 0.0140259740259745*G0_0_1_1_1_2 - 0.0683766233766257*G0_0_1_1_1_3 - 0.00701298701298725*G0_0_1_1_1_4 - 0.0280519480519491*G0_0_1_1_1_5 - 0.00219155844155852*G0_0_1_1_2_0 + 0.0140259740259745*G0_0_1_1_2_1 - 0.00241071428571438*G0_0_1_1_2_2 + 0.019285714285715*G0_0_1_1_2_3 - 0.00087662337662341*G0_0_1_1_2_4 + 0.00350649350649364*G0_0_1_1_2_5 + 0.00701298701298725*G0_0_1_1_3_0 - 0.0683766233766257*G0_0_1_1_3_1 + 0.019285714285715*G0_0_1_1_3_2 - 0.0911688311688345*G0_0_1_1_3_3 - 0.0210389610389618*G0_0_1_1_3_5 + 0.00262987012987022*G0_0_1_1_4_0 - 0.00701298701298725*G0_0_1_1_4_1 - 0.00087662337662341*G0_0_1_1_4_2 + 0.0175324675324681*G0_0_1_1_4_4 + 0.00701298701298725*G0_0_1_1_4_5 + 0.00701298701298726*G0_0_1_1_5_0 - 0.0280519480519491*G0_0_1_1_5_1 + 0.00350649350649364*G0_0_1_1_5_2 - 0.0210389610389618*G0_0_1_1_5_3 + 0.00701298701298725*G0_0_1_1_5_4 - 0.00701298701298726*G0_0_1_1_5_5 + 0.00262987012987022*G0_0_1_2_0_0 - 0.00219155844155852*G0_0_1_2_0_1 + 0.000219155844155842*G0_0_1_2_0_2 - 0.00262987012987022*G0_0_1_2_0_3 + 0.00350649350649362*G0_0_1_2_0_4 + 0.000876623376623411*G0_0_1_2_0_5 - 0.00219155844155852*G0_0_1_2_1_0 + 0.0140259740259745*G0_0_1_2_1_1 - 0.00241071428571438*G0_0_1_2_1_2 + 0.019285714285715*G0_0_1_2_1_3 - 0.00087662337662341*G0_0_1_2_1_4 + 0.00350649350649364*G0_0_1_2_1_5 + 0.000219155844155843*G0_0_1_2_2_0 - 0.00241071428571438*G0_0_1_2_2_1 - 0.0122727272727277*G0_0_1_2_2_3 - 0.00525974025974041*G0_0_1_2_2_4 - 0.00438311688311704*G0_0_1_2_2_5 - 0.00262987012987022*G0_0_1_2_3_0 + 0.019285714285715*G0_0_1_2_3_1 - 0.0122727272727277*G0_0_1_2_3_2 + 0.0420779220779236*G0_0_1_2_3_3 + 0.00701298701298727*G0_0_1_2_3_4 + 0.0140259740259745*G0_0_1_2_3_5 + 0.00350649350649362*G0_0_1_2_4_0 - 0.000876623376623411*G0_0_1_2_4_1 - 0.0052597402597404*G0_0_1_2_4_2 + 0.00701298701298727*G0_0_1_2_4_3 + 0.0140259740259746*G0_0_1_2_4_4 + 0.0105194805194809*G0_0_1_2_4_5 + 0.000876623376623411*G0_0_1_2_5_0 + 0.00350649350649364*G0_0_1_2_5_1 - 0.00438311688311704*G0_0_1_2_5_2 + 0.0140259740259745*G0_0_1_2_5_3 + 0.0105194805194809*G0_0_1_2_5_4 + 0.0140259740259745*G0_0_1_2_5_5 - 0.00438311688311702*G0_0_1_3_0_0 + 0.00701298701298725*G0_0_1_3_0_1 - 0.00262987012987022*G0_0_1_3_0_2 + 0.0280519480519489*G0_0_1_3_0_3 + 0.00350649350649361*G0_0_1_3_0_4 + 0.00701298701298724*G0_0_1_3_0_5 + 0.00701298701298725*G0_0_1_3_1_0 - 0.0683766233766257*G0_0_1_3_1_1 + 0.019285714285715*G0_0_1_3_1_2 - 0.0911688311688345*G0_0_1_3_1_3 - 0.0210389610389618*G0_0_1_3_1_5 - 0.00262987012987022*G0_0_1_3_2_0 + 0.019285714285715*G0_0_1_3_2_1 - 0.0122727272727277*G0_0_1_3_2_2 + 0.0420779220779236*G0_0_1_3_2_3 + 0.00701298701298726*G0_0_1_3_2_4 + 0.0140259740259745*G0_0_1_3_2_5 + 0.0280519480519489*G0_0_1_3_3_0 - 0.0911688311688345*G0_0_1_3_3_1 + 0.0420779220779236*G0_0_1_3_3_2 - 0.532987012987031*G0_0_1_3_3_3 - 0.056103896103898*G0_0_1_3_3_4 - 0.0841558441558471*G0_0_1_3_3_5 + 0.00350649350649361*G0_0_1_3_4_0 + 0.00701298701298727*G0_0_1_3_4_2 - 0.056103896103898*G0_0_1_3_4_3 - 0.0420779220779234*G0_0_1_3_4_4 - 0.028051948051949*G0_0_1_3_4_5 + 0.00701298701298724*G0_0_1_3_5_0 - 0.0210389610389618*G0_0_1_3_5_1 + 0.0140259740259745*G0_0_1_3_5_2 - 0.0841558441558471*G0_0_1_3_5_3 - 0.028051948051949*G0_0_1_3_5_4 - 0.0420779220779236*G0_0_1_3_5_5 - 0.0113961038961043*G0_0_1_4_0_0 + 0.00262987012987022*G0_0_1_4_0_1 + 0.00350649350649362*G0_0_1_4_0_2 + 0.00350649350649361*G0_0_1_4_0_3 - 0.0105194805194809*G0_0_1_4_0_4 - 0.00701298701298727*G0_0_1_4_0_5 + 0.00262987012987022*G0_0_1_4_1_0 - 0.00701298701298725*G0_0_1_4_1_1 - 0.00087662337662341*G0_0_1_4_1_2 + 0.0175324675324681*G0_0_1_4_1_4 + 0.00701298701298725*G0_0_1_4_1_5 + 0.00350649350649362*G0_0_1_4_2_0 - 0.00087662337662341*G0_0_1_4_2_1 - 0.00525974025974041*G0_0_1_4_2_2 + 0.00701298701298727*G0_0_1_4_2_3 + 0.0140259740259746*G0_0_1_4_2_4 + 0.0105194805194809*G0_0_1_4_2_5 + 0.00350649350649361*G0_0_1_4_3_0 + 0.00701298701298727*G0_0_1_4_3_2 - 0.056103896103898*G0_0_1_4_3_3 - 0.0420779220779234*G0_0_1_4_3_4 - 0.028051948051949*G0_0_1_4_3_5 - 0.0105194805194809*G0_0_1_4_4_0 + 0.0175324675324681*G0_0_1_4_4_1 + 0.0140259740259746*G0_0_1_4_4_2 - 0.0420779220779234*G0_0_1_4_4_3 - 0.154285714285719*G0_0_1_4_4_4 - 0.056103896103898*G0_0_1_4_4_5 - 0.00701298701298727*G0_0_1_4_5_0 + 0.00701298701298725*G0_0_1_4_5_1 + 0.0105194805194809*G0_0_1_4_5_2 - 0.028051948051949*G0_0_1_4_5_3 - 0.056103896103898*G0_0_1_4_5_4 - 0.0420779220779235*G0_0_1_4_5_5 - 0.0105194805194809*G0_0_1_5_0_0 + 0.00701298701298725*G0_0_1_5_0_1 + 0.00087662337662341*G0_0_1_5_0_2 + 0.00701298701298724*G0_0_1_5_0_3 - 0.00701298701298727*G0_0_1_5_0_4 - 0.00701298701298729*G0_0_1_5_0_5 + 0.00701298701298725*G0_0_1_5_1_0 - 0.0280519480519491*G0_0_1_5_1_1 + 0.00350649350649364*G0_0_1_5_1_2 - 0.0210389610389618*G0_0_1_5_1_3 + 0.00701298701298725*G0_0_1_5_1_4 - 0.00701298701298726*G0_0_1_5_1_5 + 0.00087662337662341*G0_0_1_5_2_0 + 0.00350649350649364*G0_0_1_5_2_1 - 0.00438311688311704*G0_0_1_5_2_2 + 0.0140259740259745*G0_0_1_5_2_3 + 0.0105194805194809*G0_0_1_5_2_4 + 0.0140259740259745*G0_0_1_5_2_5 + 0.00701298701298724*G0_0_1_5_3_0 - 0.0210389610389618*G0_0_1_5_3_1 + 0.0140259740259745*G0_0_1_5_3_2 - 0.0841558441558471*G0_0_1_5_3_3 - 0.028051948051949*G0_0_1_5_3_4 - 0.0420779220779236*G0_0_1_5_3_5 - 0.00701298701298727*G0_0_1_5_4_0 + 0.00701298701298725*G0_0_1_5_4_1 + 0.0105194805194809*G0_0_1_5_4_2 - 0.028051948051949*G0_0_1_5_4_3 - 0.056103896103898*G0_0_1_5_4_4 - 0.0420779220779235*G0_0_1_5_4_5 - 0.00701298701298729*G0_0_1_5_5_0 - 0.00701298701298727*G0_0_1_5_5_1 + 0.0140259740259745*G0_0_1_5_5_2 - 0.0420779220779236*G0_0_1_5_5_3 - 0.0420779220779235*G0_0_1_5_5_4 - 0.0701298701298726*G0_0_1_5_5_5 + 0.0479951298701318*G0_1_0_0_0_0 - 0.00438311688311704*G0_1_0_0_0_1 - 0.00284902597402609*G0_1_0_0_0_2 + 0.014902597402598*G0_1_0_0_0_4 + 0.00701298701298728*G0_1_0_0_0_5 - 0.00438311688311704*G0_1_0_0_1_0 + 0.000657467532467537*G0_1_0_0_1_1 - 0.000438311688311703*G0_1_0_0_1_2 + 0.00438311688311703*G0_1_0_0_1_3 + 0.00701298701298728*G0_1_0_0_1_5 - 0.00284902597402609*G0_1_0_0_2_0 - 0.000438311688311703*G0_1_0_0_2_1 + 0.000876623376623407*G0_1_0_0_2_2 - 0.00262987012987021*G0_1_0_0_2_3 - 0.00350649350649363*G0_1_0_0_2_4 - 0.00350649350649361*G0_1_0_0_2_5 + 0.00438311688311703*G0_1_0_0_3_1 - 0.00262987012987021*G0_1_0_0_3_2 + 0.0105194805194808*G0_1_0_0_3_3 + 0.00701298701298723*G0_1_0_0_3_5 + 0.014902597402598*G0_1_0_0_4_0 - 0.00350649350649363*G0_1_0_0_4_2 + 0.0105194805194809*G0_1_0_0_4_4 + 0.00701298701298722*G0_1_0_0_4_5 + 0.00701298701298729*G0_1_0_0_5_0 + 0.00701298701298728*G0_1_0_0_5_1 - 0.00350649350649361*G0_1_0_0_5_2 + 0.00701298701298723*G0_1_0_0_5_3 + 0.00701298701298722*G0_1_0_0_5_4 + 0.0140259740259743*G0_1_0_0_5_5 - 0.00438311688311704*G0_1_0_1_0_0 + 0.000657467532467537*G0_1_0_1_0_1 - 0.000438311688311703*G0_1_0_1_0_2 + 0.00438311688311703*G0_1_0_1_0_3 + 0.00701298701298728*G0_1_0_1_0_5 + 0.000657467532467537*G0_1_0_1_1_0 - 0.0262987012987019*G0_1_0_1_1_1 + 0.0085470779220782*G0_1_0_1_1_2 - 0.0420779220779235*G0_1_0_1_1_3 - 0.00262987012987022*G0_1_0_1_1_4 - 0.0105194805194809*G0_1_0_1_1_5 - 0.000438311688311703*G0_1_0_1_2_0 + 0.0085470779220782*G0_1_0_1_2_1 - 0.00175324675324681*G0_1_0_1_2_2 + 0.0122727272727277*G0_1_0_1_2_3 - 0.000876623376623403*G0_1_0_1_2_4 - 0.000876623376623399*G0_1_0_1_2_5 + 0.00438311688311703*G0_1_0_1_3_0 - 0.0420779220779235*G0_1_0_1_3_1 + 0.0122727272727277*G0_1_0_1_3_2 - 0.0701298701298726*G0_1_0_1_3_3 - 0.00350649350649362*G0_1_0_1_3_4 - 0.00701298701298729*G0_1_0_1_3_5 - 0.00262987012987022*G0_1_0_1_4_1 - 0.000876623376623403*G0_1_0_1_4_2 - 0.00350649350649362*G0_1_0_1_4_3 + 0.00701298701298726*G0_1_0_1_4_5 + 0.00701298701298728*G0_1_0_1_5_0 - 0.0105194805194809*G0_1_0_1_5_1 - 0.000876623376623399*G0_1_0_1_5_2 - 0.00701298701298729*G0_1_0_1_5_3 + 0.00701298701298725*G0_1_0_1_5_4 + 0.0140259740259744*G0_1_0_1_5_5 - 0.00284902597402609*G0_1_0_2_0_0 - 0.000438311688311703*G0_1_0_2_0_1 + 0.000876623376623407*G0_1_0_2_0_2 - 0.00262987012987021*G0_1_0_2_0_3 - 0.00350649350649363*G0_1_0_2_0_4 - 0.00350649350649361*G0_1_0_2_0_5 - 0.000438311688311703*G0_1_0_2_1_0 + 0.0085470779220782*G0_1_0_2_1_1 - 0.00175324675324681*G0_1_0_2_1_2 + 0.0122727272727277*G0_1_0_2_1_3 - 0.000876623376623404*G0_1_0_2_1_4 - 0.000876623376623399*G0_1_0_2_1_5 + 0.000876623376623408*G0_1_0_2_2_0 - 0.00175324675324681*G0_1_0_2_2_1 + 0.00131493506493509*G0_1_0_2_2_2 - 0.00788961038961067*G0_1_0_2_2_3 - 0.000876623376623413*G0_1_0_2_2_4 - 0.00613636363636385*G0_1_0_2_2_5 - 0.00262987012987021*G0_1_0_2_3_0 + 0.0122727272727277*G0_1_0_2_3_1 - 0.00788961038961068*G0_1_0_2_3_2 + 0.0315584415584426*G0_1_0_2_3_3 + 0.00701298701298725*G0_1_0_2_3_4 + 0.0175324675324681*G0_1_0_2_3_5 - 0.00350649350649363*G0_1_0_2_4_0 - 0.000876623376623403*G0_1_0_2_4_1 - 0.000876623376623413*G0_1_0_2_4_2 + 0.00701298701298725*G0_1_0_2_4_3 + 0.00350649350649361*G0_1_0_2_4_4 + 0.0140259740259745*G0_1_0_2_4_5 - 0.00350649350649361*G0_1_0_2_5_0 - 0.000876623376623399*G0_1_0_2_5_1 - 0.00613636363636385*G0_1_0_2_5_2 + 0.0175324675324681*G0_1_0_2_5_3 + 0.0140259740259745*G0_1_0_2_5_4 + 0.0561038961038981*G0_1_0_2_5_5 + 0.00438311688311703*G0_1_0_3_0_1 - 0.00262987012987021*G0_1_0_3_0_2 + 0.0105194805194808*G0_1_0_3_0_3 + 0.00701298701298723*G0_1_0_3_0_5 + 0.00438311688311703*G0_1_0_3_1_0 - 0.0420779220779235*G0_1_0_3_1_1 + 0.0122727272727277*G0_1_0_3_1_2 - 0.0701298701298725*G0_1_0_3_1_3 - 0.00350649350649362*G0_1_0_3_1_4 - 0.00701298701298729*G0_1_0_3_1_5 - 0.00262987012987021*G0_1_0_3_2_0 + 0.0122727272727277*G0_1_0_3_2_1 - 0.00788961038961067*G0_1_0_3_2_2 + 0.0315584415584426*G0_1_0_3_2_3 + 0.00701298701298725*G0_1_0_3_2_4 + 0.0175324675324681*G0_1_0_3_2_5 + 0.0105194805194808*G0_1_0_3_3_0 - 0.0701298701298725*G0_1_0_3_3_1 + 0.0315584415584426*G0_1_0_3_3_2 - 0.364675324675338*G0_1_0_3_3_3 - 0.0140259740259746*G0_1_0_3_3_4 - 0.0561038961038981*G0_1_0_3_3_5 - 0.00350649350649362*G0_1_0_3_4_1 + 0.00701298701298725*G0_1_0_3_4_2 - 0.0140259740259746*G0_1_0_3_4_3 - 0.028051948051949*G0_1_0_3_4_5 + 0.00701298701298723*G0_1_0_3_5_0 - 0.00701298701298729*G0_1_0_3_5_1 + 0.0175324675324681*G0_1_0_3_5_2 - 0.0561038961038981*G0_1_0_3_5_3 - 0.028051948051949*G0_1_0_3_5_4 - 0.126233766233771*G0_1_0_3_5_5 + 0.014902597402598*G0_1_0_4_0_0 - 0.00350649350649363*G0_1_0_4_0_2 + 0.0105194805194809*G0_1_0_4_0_4 + 0.00701298701298722*G0_1_0_4_0_5 - 0.00262987012987022*G0_1_0_4_1_1 - 0.000876623376623403*G0_1_0_4_1_2 - 0.00350649350649362*G0_1_0_4_1_3 + 0.00701298701298725*G0_1_0_4_1_5 - 0.00350649350649363*G0_1_0_4_2_0 - 0.000876623376623403*G0_1_0_4_2_1 - 0.000876623376623413*G0_1_0_4_2_2 + 0.00701298701298725*G0_1_0_4_2_3 + 0.00350649350649361*G0_1_0_4_2_4 + 0.0140259740259745*G0_1_0_4_2_5 - 0.00350649350649362*G0_1_0_4_3_1 + 0.00701298701298725*G0_1_0_4_3_2 - 0.0140259740259746*G0_1_0_4_3_3 - 0.028051948051949*G0_1_0_4_3_5 + 0.0105194805194809*G0_1_0_4_4_0 + 0.00350649350649362*G0_1_0_4_4_2 + 0.0140259740259744*G0_1_0_4_4_4 - 0.028051948051949*G0_1_0_4_4_5 + 0.00701298701298722*G0_1_0_4_5_0 + 0.00701298701298726*G0_1_0_4_5_1 + 0.0140259740259745*G0_1_0_4_5_2 - 0.028051948051949*G0_1_0_4_5_3 - 0.028051948051949*G0_1_0_4_5_4 - 0.126233766233771*G0_1_0_4_5_5 + 0.00701298701298728*G0_1_0_5_0_0 + 0.00701298701298728*G0_1_0_5_0_1 - 0.00350649350649361*G0_1_0_5_0_2 + 0.00701298701298723*G0_1_0_5_0_3 + 0.00701298701298722*G0_1_0_5_0_4 + 0.0140259740259743*G0_1_0_5_0_5 + 0.00701298701298728*G0_1_0_5_1_0 - 0.0105194805194809*G0_1_0_5_1_1 - 0.000876623376623399*G0_1_0_5_1_2 - 0.00701298701298729*G0_1_0_5_1_3 + 0.00701298701298725*G0_1_0_5_1_4 + 0.0140259740259744*G0_1_0_5_1_5 - 0.00350649350649361*G0_1_0_5_2_0 - 0.000876623376623399*G0_1_0_5_2_1 - 0.00613636363636385*G0_1_0_5_2_2 + 0.0175324675324681*G0_1_0_5_2_3 + 0.0140259740259745*G0_1_0_5_2_4 + 0.0561038961038981*G0_1_0_5_2_5 + 0.00701298701298723*G0_1_0_5_3_0 - 0.00701298701298729*G0_1_0_5_3_1 + 0.0175324675324681*G0_1_0_5_3_2 - 0.0561038961038981*G0_1_0_5_3_3 - 0.028051948051949*G0_1_0_5_3_4 - 0.126233766233771*G0_1_0_5_3_5 + 0.00701298701298722*G0_1_0_5_4_0 + 0.00701298701298725*G0_1_0_5_4_1 + 0.0140259740259745*G0_1_0_5_4_2 - 0.028051948051949*G0_1_0_5_4_3 - 0.028051948051949*G0_1_0_5_4_4 - 0.126233766233771*G0_1_0_5_4_5 + 0.0140259740259743*G0_1_0_5_5_0 + 0.0140259740259744*G0_1_0_5_5_1 + 0.0561038961038981*G0_1_0_5_5_2 - 0.126233766233771*G0_1_0_5_5_3 - 0.126233766233771*G0_1_0_5_5_4 - 0.911688311688344*G0_1_0_5_5_5 - 0.0243262987012996*G0_1_1_0_0_0 + 0.00657467532467556*G0_1_1_0_0_1 + 0.00284902597402608*G0_1_1_0_0_2 - 0.00350649350649362*G0_1_1_0_0_3 - 0.00964285714285749*G0_1_1_0_0_4 - 0.0298051948051959*G0_1_1_0_0_5 + 0.00657467532467556*G0_1_1_0_1_0 - 0.00482142857142876*G0_1_1_0_1_1 - 0.00131493506493511*G0_1_1_0_1_2 + 0.00350649350649362*G0_1_1_0_1_3 + 0.00350649350649363*G0_1_1_0_1_4 + 0.00701298701298729*G0_1_1_0_1_5 + 0.00284902597402608*G0_1_1_0_2_0 - 0.00131493506493511*G0_1_1_0_2_1 - 0.000219155844155853*G0_1_1_0_2_2 - 0.00175324675324681*G0_1_1_0_2_3 + 0.00175324675324682*G0_1_1_0_2_4 + 0.00350649350649364*G0_1_1_0_2_5 - 0.00350649350649362*G0_1_1_0_3_0 + 0.00350649350649362*G0_1_1_0_3_1 - 0.00175324675324681*G0_1_1_0_3_2 + 0.0210389610389617*G0_1_1_0_3_3 - 0.00964285714285749*G0_1_1_0_4_0 + 0.00350649350649363*G0_1_1_0_4_1 + 0.00175324675324682*G0_1_1_0_4_2 - 0.0105194805194809*G0_1_1_0_4_4 - 0.0140259740259745*G0_1_1_0_4_5 - 0.0298051948051959*G0_1_1_0_5_0 + 0.00701298701298729*G0_1_1_0_5_1 + 0.00350649350649364*G0_1_1_0_5_2 - 0.0140259740259745*G0_1_1_0_5_4 - 0.0631168831168855*G0_1_1_0_5_5 + 0.00657467532467557*G0_1_1_1_0_0 - 0.00482142857142876*G0_1_1_1_0_1 - 0.00131493506493511*G0_1_1_1_0_2 + 0.00350649350649362*G0_1_1_1_0_3 + 0.00350649350649363*G0_1_1_1_0_4 + 0.00701298701298729*G0_1_1_1_0_5 - 0.00482142857142876*G0_1_1_1_1_0 - 0.0131493506493507*G0_1_1_1_1_1 + 0.00832792207792235*G0_1_1_1_1_2 - 0.0438311688311703*G0_1_1_1_1_3 - 0.00350649350649363*G0_1_1_1_1_4 + 0.00876623376623413*G0_1_1_1_1_5 - 0.00131493506493511*G0_1_1_1_2_0 + 0.00832792207792235*G0_1_1_1_2_1 - 0.00131493506493511*G0_1_1_1_2_2 + 0.0140259740259745*G0_1_1_1_2_3 - 0.00175324675324681*G0_1_1_1_2_4 - 0.00350649350649362*G0_1_1_1_2_5 + 0.00350649350649362*G0_1_1_1_3_0 - 0.0438311688311703*G0_1_1_1_3_1 + 0.0140259740259745*G0_1_1_1_3_2 - 0.0701298701298726*G0_1_1_1_3_3 + 0.00350649350649364*G0_1_1_1_4_0 - 0.00350649350649363*G0_1_1_1_4_1 - 0.00175324675324681*G0_1_1_1_4_2 + 0.00701298701298726*G0_1_1_1_4_4 + 0.0140259740259745*G0_1_1_1_4_5 + 0.00701298701298729*G0_1_1_1_5_0 + 0.00876623376623413*G0_1_1_1_5_1 - 0.00350649350649362*G0_1_1_1_5_2 + 0.0140259740259745*G0_1_1_1_5_4 + 0.0701298701298726*G0_1_1_1_5_5 + 0.00284902597402608*G0_1_1_2_0_0 - 0.00131493506493511*G0_1_1_2_0_1 - 0.000219155844155853*G0_1_1_2_0_2 - 0.00175324675324681*G0_1_1_2_0_3 + 0.00175324675324682*G0_1_1_2_0_4 + 0.00350649350649364*G0_1_1_2_0_5 - 0.00131493506493511*G0_1_1_2_1_0 + 0.00832792207792235*G0_1_1_2_1_1 - 0.00131493506493511*G0_1_1_2_1_2 + 0.0140259740259745*G0_1_1_2_1_3 - 0.00175324675324681*G0_1_1_2_1_4 - 0.00350649350649362*G0_1_1_2_1_5 - 0.000219155844155853*G0_1_1_2_2_0 - 0.00131493506493511*G0_1_1_2_2_1 + 0.000657467532467546*G0_1_1_2_2_2 - 0.0105194805194809*G0_1_1_2_2_3 - 0.00262987012987023*G0_1_1_2_2_4 - 0.00525974025974045*G0_1_1_2_2_5 - 0.00175324675324681*G0_1_1_2_3_0 + 0.0140259740259745*G0_1_1_2_3_1 - 0.0105194805194809*G0_1_1_2_3_2 + 0.0350649350649363*G0_1_1_2_3_3 + 0.00701298701298726*G0_1_1_2_3_4 + 0.0140259740259745*G0_1_1_2_3_5 + 0.00175324675324682*G0_1_1_2_4_0 - 0.00175324675324681*G0_1_1_2_4_1 - 0.00262987012987023*G0_1_1_2_4_2 + 0.00701298701298726*G0_1_1_2_4_3 + 0.0105194805194809*G0_1_1_2_4_4 + 0.0140259740259745*G0_1_1_2_4_5 + 0.00350649350649364*G0_1_1_2_5_0 - 0.00350649350649362*G0_1_1_2_5_1 - 0.00525974025974045*G0_1_1_2_5_2 + 0.0140259740259745*G0_1_1_2_5_3 + 0.0140259740259745*G0_1_1_2_5_4 + 0.0350649350649363*G0_1_1_2_5_5 - 0.00350649350649362*G0_1_1_3_0_0 + 0.00350649350649362*G0_1_1_3_0_1 - 0.00175324675324681*G0_1_1_3_0_2 + 0.0210389610389617*G0_1_1_3_0_3 + 0.00350649350649362*G0_1_1_3_1_0 - 0.0438311688311703*G0_1_1_3_1_1 + 0.0140259740259745*G0_1_1_3_1_2 - 0.0701298701298727*G0_1_1_3_1_3 - 0.00175324675324681*G0_1_1_3_2_0 + 0.0140259740259745*G0_1_1_3_2_1 - 0.0105194805194809*G0_1_1_3_2_2 + 0.0350649350649363*G0_1_1_3_2_3 + 0.00701298701298726*G0_1_1_3_2_4 + 0.0140259740259745*G0_1_1_3_2_5 + 0.0210389610389617*G0_1_1_3_3_0 - 0.0701298701298727*G0_1_1_3_3_1 + 0.0350649350649363*G0_1_1_3_3_2 - 0.490909090909108*G0_1_1_3_3_3 - 0.0420779220779235*G0_1_1_3_3_4 - 0.0701298701298726*G0_1_1_3_3_5 + 0.00701298701298726*G0_1_1_3_4_2 - 0.0420779220779235*G0_1_1_3_4_3 - 0.0140259740259745*G0_1_1_3_4_4 - 0.028051948051949*G0_1_1_3_4_5 + 0.0140259740259745*G0_1_1_3_5_2 - 0.0701298701298726*G0_1_1_3_5_3 - 0.028051948051949*G0_1_1_3_5_4 - 0.0701298701298726*G0_1_1_3_5_5 - 0.00964285714285749*G0_1_1_4_0_0 + 0.00350649350649363*G0_1_1_4_0_1 + 0.00175324675324682*G0_1_1_4_0_2 - 0.0105194805194809*G0_1_1_4_0_4 - 0.0140259740259745*G0_1_1_4_0_5 + 0.00350649350649363*G0_1_1_4_1_0 - 0.00350649350649363*G0_1_1_4_1_1 - 0.00175324675324681*G0_1_1_4_1_2 + 0.00701298701298726*G0_1_1_4_1_4 + 0.0140259740259745*G0_1_1_4_1_5 + 0.00175324675324682*G0_1_1_4_2_0 - 0.00175324675324681*G0_1_1_4_2_1 - 0.00262987012987023*G0_1_1_4_2_2 + 0.00701298701298726*G0_1_1_4_2_3 + 0.0105194805194809*G0_1_1_4_2_4 + 0.0140259740259745*G0_1_1_4_2_5 + 0.00701298701298726*G0_1_1_4_3_2 - 0.0420779220779235*G0_1_1_4_3_3 - 0.0140259740259745*G0_1_1_4_3_4 - 0.028051948051949*G0_1_1_4_3_5 - 0.0105194805194809*G0_1_1_4_4_0 + 0.00701298701298726*G0_1_1_4_4_1 + 0.0105194805194809*G0_1_1_4_4_2 - 0.0140259740259745*G0_1_1_4_4_3 - 0.028051948051949*G0_1_1_4_4_4 - 0.0420779220779235*G0_1_1_4_4_5 - 0.0140259740259745*G0_1_1_4_5_0 + 0.0140259740259745*G0_1_1_4_5_1 + 0.0140259740259745*G0_1_1_4_5_2 - 0.028051948051949*G0_1_1_4_5_3 - 0.0420779220779236*G0_1_1_4_5_4 - 0.0981818181818216*G0_1_1_4_5_5 - 0.0298051948051959*G0_1_1_5_0_0 + 0.00701298701298729*G0_1_1_5_0_1 + 0.00350649350649364*G0_1_1_5_0_2 - 0.0140259740259745*G0_1_1_5_0_4 - 0.0631168831168856*G0_1_1_5_0_5 + 0.00701298701298729*G0_1_1_5_1_0 + 0.00876623376623413*G0_1_1_5_1_1 - 0.00350649350649362*G0_1_1_5_1_2 + 0.0140259740259745*G0_1_1_5_1_4 + 0.0701298701298726*G0_1_1_5_1_5 + 0.00350649350649364*G0_1_1_5_2_0 - 0.00350649350649362*G0_1_1_5_2_1 - 0.00525974025974045*G0_1_1_5_2_2 + 0.0140259740259745*G0_1_1_5_2_3 + 0.0140259740259745*G0_1_1_5_2_4 + 0.0350649350649363*G0_1_1_5_2_5 + 0.0140259740259745*G0_1_1_5_3_2 - 0.0701298701298726*G0_1_1_5_3_3 - 0.028051948051949*G0_1_1_5_3_4 - 0.0701298701298726*G0_1_1_5_3_5 - 0.0140259740259745*G0_1_1_5_4_0 + 0.0140259740259745*G0_1_1_5_4_1 + 0.0140259740259745*G0_1_1_5_4_2 - 0.028051948051949*G0_1_1_5_4_3 - 0.0420779220779236*G0_1_1_5_4_4 - 0.0981818181818216*G0_1_1_5_4_5 - 0.0631168831168856*G0_1_1_5_5_0 + 0.0701298701298726*G0_1_1_5_5_1 + 0.0350649350649363*G0_1_1_5_5_2 - 0.0701298701298726*G0_1_1_5_5_3 - 0.0981818181818216*G0_1_1_5_5_4 - 0.490909090909109*G0_1_1_5_5_5; + A[39] = -A[89] - 0.0278327922077932*G0_0_0_0_0_0 + 0.00182629870129876*G0_0_0_0_0_1 + 0.00438311688311704*G0_0_0_0_0_2 - 0.00642857142857162*G0_0_0_0_0_3 - 0.0315584415584426*G0_0_0_0_0_4 - 0.00788961038961066*G0_0_0_0_0_5 + 0.00182629870129876*G0_0_0_0_1_0 - 0.000730519480519502*G0_0_0_0_1_1 - 0.00102272727272731*G0_0_0_0_1_2 - 0.001461038961039*G0_0_0_0_1_3 + 0.000584415584415613*G0_0_0_0_1_4 + 0.00438311688311704*G0_0_0_0_2_0 - 0.00102272727272731*G0_0_0_0_2_1 + 0.00357954545454557*G0_0_0_0_2_2 - 0.000876623376623408*G0_0_0_0_2_3 + 0.0146103896103901*G0_0_0_0_2_4 - 0.0005844155844156*G0_0_0_0_2_5 - 0.00642857142857162*G0_0_0_0_3_0 - 0.001461038961039*G0_0_0_0_3_1 - 0.000876623376623407*G0_0_0_0_3_2 + 0.0409090909090921*G0_0_0_0_3_3 + 0.011688311688312*G0_0_0_0_3_4 + 0.0140259740259745*G0_0_0_0_3_5 - 0.0315584415584426*G0_0_0_0_4_0 + 0.000584415584415613*G0_0_0_0_4_1 + 0.0146103896103901*G0_0_0_0_4_2 + 0.011688311688312*G0_0_0_0_4_3 - 0.0210389610389618*G0_0_0_0_4_4 - 0.00788961038961066*G0_0_0_0_5_0 - 0.0005844155844156*G0_0_0_0_5_2 + 0.0140259740259745*G0_0_0_0_5_3 + 0.0105194805194809*G0_0_0_0_5_5 + 0.00182629870129876*G0_0_0_1_0_0 - 0.000730519480519502*G0_0_0_1_0_1 - 0.00102272727272731*G0_0_0_1_0_2 - 0.001461038961039*G0_0_0_1_0_3 + 0.000584415584415614*G0_0_0_1_0_4 - 0.000730519480519502*G0_0_0_1_1_0 + 0.0284902597402606*G0_0_0_1_1_1 - 0.00292207792207801*G0_0_0_1_1_2 + 0.00438311688311701*G0_0_0_1_1_3 - 0.00146103896103901*G0_0_0_1_1_4 + 0.00438311688311703*G0_0_0_1_1_5 - 0.00102272727272731*G0_0_0_1_2_0 - 0.00292207792207801*G0_0_0_1_2_1 + 0.00182629870129876*G0_0_0_1_2_2 + 0.00584415584415604*G0_0_0_1_2_3 + 0.00204545454545461*G0_0_0_1_2_4 + 0.00146103896103901*G0_0_0_1_2_5 - 0.001461038961039*G0_0_0_1_3_0 + 0.00438311688311701*G0_0_0_1_3_1 + 0.00584415584415605*G0_0_0_1_3_2 + 0.017532467532468*G0_0_0_1_3_3 + 0.00584415584415602*G0_0_0_1_3_4 + 0.000584415584415614*G0_0_0_1_4_0 - 0.00146103896103901*G0_0_0_1_4_1 + 0.00204545454545461*G0_0_0_1_4_2 + 0.00584415584415602*G0_0_0_1_4_3 + 0.0187012987012993*G0_0_0_1_4_4 + 0.00438311688311703*G0_0_0_1_5_1 + 0.00146103896103901*G0_0_0_1_5_2 - 0.00584415584415605*G0_0_0_1_5_5 + 0.00438311688311704*G0_0_0_2_0_0 - 0.00102272727272731*G0_0_0_2_0_1 + 0.00357954545454557*G0_0_0_2_0_2 - 0.000876623376623407*G0_0_0_2_0_3 + 0.0146103896103901*G0_0_0_2_0_4 - 0.0005844155844156*G0_0_0_2_0_5 - 0.00102272727272731*G0_0_0_2_1_0 - 0.00292207792207801*G0_0_0_2_1_1 + 0.00182629870129876*G0_0_0_2_1_2 + 0.00584415584415605*G0_0_0_2_1_3 + 0.00204545454545461*G0_0_0_2_1_4 + 0.00146103896103901*G0_0_0_2_1_5 + 0.00357954545454557*G0_0_0_2_2_0 + 0.00182629870129876*G0_0_0_2_2_1 - 0.0175324675324681*G0_0_0_2_2_2 - 0.0140259740259745*G0_0_0_2_2_3 - 0.0268831168831178*G0_0_0_2_2_4 - 0.00321428571428583*G0_0_0_2_2_5 - 0.000876623376623407*G0_0_0_2_3_0 + 0.00584415584415604*G0_0_0_2_3_1 - 0.0140259740259745*G0_0_0_2_3_2 - 0.00233766233766241*G0_0_0_2_3_4 + 0.00818181818181845*G0_0_0_2_3_5 + 0.0146103896103901*G0_0_0_2_4_0 + 0.00204545454545461*G0_0_0_2_4_1 - 0.0268831168831178*G0_0_0_2_4_2 - 0.00233766233766241*G0_0_0_2_4_3 - 0.0187012987012993*G0_0_0_2_4_4 + 0.00233766233766241*G0_0_0_2_4_5 - 0.0005844155844156*G0_0_0_2_5_0 + 0.00146103896103901*G0_0_0_2_5_1 - 0.00321428571428583*G0_0_0_2_5_2 + 0.00818181818181845*G0_0_0_2_5_3 + 0.00233766233766241*G0_0_0_2_5_4 + 0.00467532467532483*G0_0_0_2_5_5 - 0.00642857142857162*G0_0_0_3_0_0 - 0.001461038961039*G0_0_0_3_0_1 - 0.000876623376623407*G0_0_0_3_0_2 + 0.0409090909090921*G0_0_0_3_0_3 + 0.011688311688312*G0_0_0_3_0_4 + 0.0140259740259745*G0_0_0_3_0_5 - 0.001461038961039*G0_0_0_3_1_0 + 0.00438311688311701*G0_0_0_3_1_1 + 0.00584415584415604*G0_0_0_3_1_2 + 0.017532467532468*G0_0_0_3_1_3 + 0.00584415584415602*G0_0_0_3_1_4 - 0.000876623376623407*G0_0_0_3_2_0 + 0.00584415584415604*G0_0_0_3_2_1 - 0.0140259740259745*G0_0_0_3_2_2 - 0.00233766233766241*G0_0_0_3_2_4 + 0.00818181818181845*G0_0_0_3_2_5 + 0.0409090909090921*G0_0_0_3_3_0 + 0.017532467532468*G0_0_0_3_3_1 - 0.56103896103898*G0_0_0_3_3_3 - 0.0935064935064965*G0_0_0_3_3_4 - 0.0981818181818214*G0_0_0_3_3_5 + 0.011688311688312*G0_0_0_3_4_0 + 0.00584415584415602*G0_0_0_3_4_1 - 0.00233766233766241*G0_0_0_3_4_2 - 0.0935064935064965*G0_0_0_3_4_3 - 0.0607792207792227*G0_0_0_3_4_4 - 0.028051948051949*G0_0_0_3_4_5 + 0.0140259740259745*G0_0_0_3_5_0 + 0.00818181818181845*G0_0_0_3_5_2 - 0.0981818181818214*G0_0_0_3_5_3 - 0.028051948051949*G0_0_0_3_5_4 - 0.0374025974025987*G0_0_0_3_5_5 - 0.0315584415584426*G0_0_0_4_0_0 + 0.000584415584415613*G0_0_0_4_0_1 + 0.0146103896103901*G0_0_0_4_0_2 + 0.011688311688312*G0_0_0_4_0_3 - 0.0210389610389618*G0_0_0_4_0_4 + 0.000584415584415614*G0_0_0_4_1_0 - 0.00146103896103901*G0_0_0_4_1_1 + 0.00204545454545461*G0_0_0_4_1_2 + 0.00584415584415602*G0_0_0_4_1_3 + 0.0187012987012993*G0_0_0_4_1_4 + 0.0146103896103901*G0_0_0_4_2_0 + 0.00204545454545461*G0_0_0_4_2_1 - 0.0268831168831178*G0_0_0_4_2_2 - 0.00233766233766241*G0_0_0_4_2_3 - 0.0187012987012993*G0_0_0_4_2_4 + 0.00233766233766241*G0_0_0_4_2_5 + 0.011688311688312*G0_0_0_4_3_0 + 0.00584415584415602*G0_0_0_4_3_1 - 0.00233766233766241*G0_0_0_4_3_2 - 0.0935064935064965*G0_0_0_4_3_3 - 0.0607792207792227*G0_0_0_4_3_4 - 0.028051948051949*G0_0_0_4_3_5 - 0.0210389610389618*G0_0_0_4_4_0 + 0.0187012987012993*G0_0_0_4_4_1 - 0.0187012987012993*G0_0_0_4_4_2 - 0.0607792207792227*G0_0_0_4_4_3 - 0.518961038961056*G0_0_0_4_4_4 - 0.0420779220779235*G0_0_0_4_4_5 + 0.00233766233766241*G0_0_0_4_5_2 - 0.028051948051949*G0_0_0_4_5_3 - 0.0420779220779235*G0_0_0_4_5_4 - 0.00935064935064966*G0_0_0_4_5_5 - 0.00788961038961066*G0_0_0_5_0_0 - 0.0005844155844156*G0_0_0_5_0_2 + 0.0140259740259745*G0_0_0_5_0_3 + 0.0105194805194809*G0_0_0_5_0_5 + 0.00438311688311703*G0_0_0_5_1_1 + 0.00146103896103901*G0_0_0_5_1_2 - 0.00584415584415605*G0_0_0_5_1_5 - 0.0005844155844156*G0_0_0_5_2_0 + 0.00146103896103901*G0_0_0_5_2_1 - 0.00321428571428583*G0_0_0_5_2_2 + 0.00818181818181845*G0_0_0_5_2_3 + 0.00233766233766241*G0_0_0_5_2_4 + 0.00467532467532483*G0_0_0_5_2_5 + 0.0140259740259745*G0_0_0_5_3_0 + 0.00818181818181845*G0_0_0_5_3_2 - 0.0981818181818214*G0_0_0_5_3_3 - 0.028051948051949*G0_0_0_5_3_4 - 0.0374025974025986*G0_0_0_5_3_5 + 0.00233766233766241*G0_0_0_5_4_2 - 0.028051948051949*G0_0_0_5_4_3 - 0.0420779220779235*G0_0_0_5_4_4 - 0.00935064935064966*G0_0_0_5_4_5 + 0.0105194805194809*G0_0_0_5_5_0 - 0.00584415584415605*G0_0_0_5_5_1 + 0.00467532467532483*G0_0_0_5_5_2 - 0.0374025974025986*G0_0_0_5_5_3 - 0.00935064935064967*G0_0_0_5_5_4 - 0.0140259740259745*G0_0_0_5_5_5 - 0.0103003246753251*G0_0_1_0_0_0 + 0.000803571428571463*G0_0_1_0_0_2 - 0.0032142857142858*G0_0_1_0_0_3 - 0.00467532467532485*G0_0_1_0_0_4 + 0.00613636363636387*G0_0_1_0_0_5 + 0.00219155844155853*G0_0_1_0_1_1 - 0.00292207792207801*G0_0_1_0_1_3 - 0.00146103896103901*G0_0_1_0_1_4 - 0.00584415584415606*G0_0_1_0_1_5 + 0.000803571428571462*G0_0_1_0_2_0 - 0.000803571428571464*G0_0_1_0_2_2 - 0.00029220779220781*G0_0_1_0_2_3 + 0.000292207792207792*G0_0_1_0_2_5 - 0.0032142857142858*G0_0_1_0_3_0 - 0.00292207792207801*G0_0_1_0_3_1 - 0.00029220779220781*G0_0_1_0_3_2 + 0.0362337662337673*G0_0_1_0_3_3 + 0.00935064935064963*G0_0_1_0_3_4 + 0.00584415584415604*G0_0_1_0_3_5 - 0.00467532467532485*G0_0_1_0_4_0 - 0.00146103896103901*G0_0_1_0_4_1 + 0.00935064935064963*G0_0_1_0_4_3 - 0.00233766233766245*G0_0_1_0_4_4 + 0.00233766233766243*G0_0_1_0_4_5 + 0.00613636363636387*G0_0_1_0_5_0 - 0.00584415584415606*G0_0_1_0_5_1 + 0.000292207792207791*G0_0_1_0_5_2 + 0.00584415584415604*G0_0_1_0_5_3 + 0.00233766233766243*G0_0_1_0_5_4 + 0.0105194805194811*G0_0_1_0_5_5 + 0.00219155844155853*G0_0_1_1_0_1 - 0.00292207792207801*G0_0_1_1_0_3 - 0.00146103896103901*G0_0_1_1_0_4 - 0.00584415584415606*G0_0_1_1_0_5 + 0.00219155844155853*G0_0_1_1_1_0 - 0.00219155844155851*G0_0_1_1_1_2 - 0.00219155844155851*G0_0_1_1_2_1 + 0.00584415584415605*G0_0_1_1_2_3 + 0.00146103896103901*G0_0_1_1_2_4 + 0.00292207792207802*G0_0_1_1_2_5 - 0.00292207792207801*G0_0_1_1_3_0 + 0.00584415584415605*G0_0_1_1_3_2 + 0.0233766233766241*G0_0_1_1_3_3 + 0.00584415584415602*G0_0_1_1_3_4 - 0.00146103896103901*G0_0_1_1_4_0 + 0.00146103896103901*G0_0_1_1_4_2 + 0.00584415584415602*G0_0_1_1_4_3 - 0.00584415584415605*G0_0_1_1_4_5 - 0.00584415584415606*G0_0_1_1_5_0 + 0.00292207792207802*G0_0_1_1_5_2 - 0.00584415584415605*G0_0_1_1_5_4 - 0.0233766233766242*G0_0_1_1_5_5 + 0.000803571428571462*G0_0_1_2_0_0 - 0.000803571428571464*G0_0_1_2_0_2 - 0.00029220779220781*G0_0_1_2_0_3 + 0.000292207792207791*G0_0_1_2_0_5 - 0.00219155844155851*G0_0_1_2_1_1 + 0.00584415584415605*G0_0_1_2_1_3 + 0.00146103896103901*G0_0_1_2_1_4 + 0.00292207792207802*G0_0_1_2_1_5 - 0.000803571428571464*G0_0_1_2_2_0 + 0.0103003246753251*G0_0_1_2_2_2 - 0.00613636363636382*G0_0_1_2_2_3 + 0.00467532467532487*G0_0_1_2_2_4 + 0.00321428571428583*G0_0_1_2_2_5 - 0.00029220779220781*G0_0_1_2_3_0 + 0.00584415584415605*G0_0_1_2_3_1 - 0.00613636363636382*G0_0_1_2_3_2 - 0.0105194805194809*G0_0_1_2_3_3 - 0.0023376623376624*G0_0_1_2_3_4 - 0.00584415584415604*G0_0_1_2_3_5 + 0.00146103896103901*G0_0_1_2_4_1 + 0.00467532467532487*G0_0_1_2_4_2 - 0.0023376623376624*G0_0_1_2_4_3 + 0.00233766233766245*G0_0_1_2_4_4 - 0.00935064935064967*G0_0_1_2_4_5 + 0.000292207792207792*G0_0_1_2_5_0 + 0.00292207792207802*G0_0_1_2_5_1 + 0.00321428571428583*G0_0_1_2_5_2 - 0.00584415584415604*G0_0_1_2_5_3 - 0.00935064935064967*G0_0_1_2_5_4 - 0.0362337662337675*G0_0_1_2_5_5 - 0.0032142857142858*G0_0_1_3_0_0 - 0.00292207792207801*G0_0_1_3_0_1 - 0.00029220779220781*G0_0_1_3_0_2 + 0.0362337662337673*G0_0_1_3_0_3 + 0.00935064935064963*G0_0_1_3_0_4 + 0.00584415584415604*G0_0_1_3_0_5 - 0.00292207792207801*G0_0_1_3_1_0 + 0.00584415584415605*G0_0_1_3_1_2 + 0.0233766233766241*G0_0_1_3_1_3 + 0.00584415584415602*G0_0_1_3_1_4 - 0.00029220779220781*G0_0_1_3_2_0 + 0.00584415584415605*G0_0_1_3_2_1 - 0.00613636363636382*G0_0_1_3_2_2 - 0.0105194805194809*G0_0_1_3_2_3 - 0.0023376623376624*G0_0_1_3_2_4 - 0.00584415584415604*G0_0_1_3_2_5 + 0.0362337662337673*G0_0_1_3_3_0 + 0.0233766233766241*G0_0_1_3_3_1 - 0.0105194805194809*G0_0_1_3_3_2 - 0.547012987013005*G0_0_1_3_3_3 - 0.0841558441558469*G0_0_1_3_3_4 - 0.0607792207792228*G0_0_1_3_3_5 + 0.00935064935064963*G0_0_1_3_4_0 + 0.00584415584415602*G0_0_1_3_4_1 - 0.0023376623376624*G0_0_1_3_4_2 - 0.0841558441558469*G0_0_1_3_4_3 - 0.0187012987012993*G0_0_1_3_4_4 + 0.00584415584415604*G0_0_1_3_5_0 - 0.00584415584415604*G0_0_1_3_5_2 - 0.0607792207792228*G0_0_1_3_5_3 + 0.0607792207792229*G0_0_1_3_5_5 - 0.00467532467532485*G0_0_1_4_0_0 - 0.00146103896103901*G0_0_1_4_0_1 + 0.00935064935064963*G0_0_1_4_0_3 - 0.00233766233766245*G0_0_1_4_0_4 + 0.00233766233766243*G0_0_1_4_0_5 - 0.00146103896103901*G0_0_1_4_1_0 + 0.00146103896103901*G0_0_1_4_1_2 + 0.00584415584415602*G0_0_1_4_1_3 - 0.00584415584415605*G0_0_1_4_1_5 + 0.00146103896103901*G0_0_1_4_2_1 + 0.00467532467532487*G0_0_1_4_2_2 - 0.0023376623376624*G0_0_1_4_2_3 + 0.00233766233766245*G0_0_1_4_2_4 - 0.00935064935064967*G0_0_1_4_2_5 + 0.00935064935064963*G0_0_1_4_3_0 + 0.00584415584415602*G0_0_1_4_3_1 - 0.0023376623376624*G0_0_1_4_3_2 - 0.0841558441558469*G0_0_1_4_3_3 - 0.0187012987012993*G0_0_1_4_3_4 - 0.00233766233766245*G0_0_1_4_4_0 + 0.00233766233766245*G0_0_1_4_4_2 - 0.0187012987012993*G0_0_1_4_4_3 + 0.0187012987012994*G0_0_1_4_4_5 + 0.00233766233766243*G0_0_1_4_5_0 - 0.00584415584415605*G0_0_1_4_5_1 - 0.00935064935064967*G0_0_1_4_5_2 + 0.0187012987012994*G0_0_1_4_5_4 + 0.0841558441558471*G0_0_1_4_5_5 + 0.00613636363636387*G0_0_1_5_0_0 - 0.00584415584415606*G0_0_1_5_0_1 + 0.000292207792207791*G0_0_1_5_0_2 + 0.00584415584415604*G0_0_1_5_0_3 + 0.00233766233766243*G0_0_1_5_0_4 + 0.0105194805194811*G0_0_1_5_0_5 - 0.00584415584415606*G0_0_1_5_1_0 + 0.00292207792207802*G0_0_1_5_1_2 - 0.00584415584415605*G0_0_1_5_1_4 - 0.0233766233766242*G0_0_1_5_1_5 + 0.000292207792207791*G0_0_1_5_2_0 + 0.00292207792207802*G0_0_1_5_2_1 + 0.00321428571428583*G0_0_1_5_2_2 - 0.00584415584415604*G0_0_1_5_2_3 - 0.00935064935064967*G0_0_1_5_2_4 - 0.0362337662337675*G0_0_1_5_2_5 + 0.00584415584415604*G0_0_1_5_3_0 - 0.00584415584415604*G0_0_1_5_3_2 - 0.0607792207792228*G0_0_1_5_3_3 + 0.0607792207792229*G0_0_1_5_3_5 + 0.00233766233766243*G0_0_1_5_4_0 - 0.00584415584415605*G0_0_1_5_4_1 - 0.00935064935064967*G0_0_1_5_4_2 + 0.0187012987012994*G0_0_1_5_4_4 + 0.0841558441558471*G0_0_1_5_4_5 + 0.0105194805194811*G0_0_1_5_5_0 - 0.0233766233766242*G0_0_1_5_5_1 - 0.0362337662337675*G0_0_1_5_5_2 + 0.0607792207792229*G0_0_1_5_5_3 + 0.0841558441558471*G0_0_1_5_5_4 + 0.547012987013006*G0_0_1_5_5_5; + A[96] = -A[94] - 0.0103003246753251*G0_0_1_0_0_0 + 0.000803571428571459*G0_0_1_0_0_1 - 0.00321428571428581*G0_0_1_0_0_3 + 0.00613636363636382*G0_0_1_0_0_4 - 0.00467532467532486*G0_0_1_0_0_5 + 0.000803571428571459*G0_0_1_0_1_0 - 0.000803571428571451*G0_0_1_0_1_1 - 0.000292207792207795*G0_0_1_0_1_3 + 0.000292207792207801*G0_0_1_0_1_4 + 0.00219155844155852*G0_0_1_0_2_2 - 0.00292207792207802*G0_0_1_0_2_3 - 0.00584415584415603*G0_0_1_0_2_4 - 0.00146103896103901*G0_0_1_0_2_5 - 0.00321428571428581*G0_0_1_0_3_0 - 0.000292207792207795*G0_0_1_0_3_1 - 0.00292207792207802*G0_0_1_0_3_2 + 0.0362337662337674*G0_0_1_0_3_3 + 0.00584415584415602*G0_0_1_0_3_4 + 0.00935064935064965*G0_0_1_0_3_5 + 0.00613636363636382*G0_0_1_0_4_0 + 0.000292207792207801*G0_0_1_0_4_1 - 0.00584415584415603*G0_0_1_0_4_2 + 0.00584415584415602*G0_0_1_0_4_3 + 0.0105194805194809*G0_0_1_0_4_4 + 0.00233766233766241*G0_0_1_0_4_5 - 0.00467532467532486*G0_0_1_0_5_0 - 0.00146103896103901*G0_0_1_0_5_2 + 0.00935064935064965*G0_0_1_0_5_3 + 0.00233766233766241*G0_0_1_0_5_4 - 0.00233766233766244*G0_0_1_0_5_5 + 0.000803571428571459*G0_0_1_1_0_0 - 0.000803571428571451*G0_0_1_1_0_1 - 0.000292207792207795*G0_0_1_1_0_3 + 0.000292207792207801*G0_0_1_1_0_4 - 0.000803571428571451*G0_0_1_1_1_0 + 0.0103003246753249*G0_0_1_1_1_1 - 0.00613636363636389*G0_0_1_1_1_3 + 0.00321428571428582*G0_0_1_1_1_4 + 0.00467532467532481*G0_0_1_1_1_5 - 0.00219155844155852*G0_0_1_1_2_2 + 0.00584415584415606*G0_0_1_1_2_3 + 0.00292207792207802*G0_0_1_1_2_4 + 0.00146103896103901*G0_0_1_1_2_5 - 0.000292207792207795*G0_0_1_1_3_0 - 0.00613636363636389*G0_0_1_1_3_1 + 0.00584415584415606*G0_0_1_1_3_2 - 0.010519480519481*G0_0_1_1_3_3 - 0.00584415584415605*G0_0_1_1_3_4 - 0.00233766233766244*G0_0_1_1_3_5 + 0.0002922077922078*G0_0_1_1_4_0 + 0.00321428571428582*G0_0_1_1_4_1 + 0.00292207792207802*G0_0_1_1_4_2 - 0.00584415584415605*G0_0_1_1_4_3 - 0.0362337662337674*G0_0_1_1_4_4 - 0.00935064935064968*G0_0_1_1_4_5 + 0.00467532467532482*G0_0_1_1_5_1 + 0.00146103896103901*G0_0_1_1_5_2 - 0.00233766233766244*G0_0_1_1_5_3 - 0.00935064935064968*G0_0_1_1_5_4 + 0.0023376623376624*G0_0_1_1_5_5 + 0.00219155844155852*G0_0_1_2_0_2 - 0.00292207792207802*G0_0_1_2_0_3 - 0.00584415584415603*G0_0_1_2_0_4 - 0.00146103896103901*G0_0_1_2_0_5 - 0.00219155844155852*G0_0_1_2_1_2 + 0.00584415584415606*G0_0_1_2_1_3 + 0.00292207792207802*G0_0_1_2_1_4 + 0.00146103896103901*G0_0_1_2_1_5 + 0.00219155844155852*G0_0_1_2_2_0 - 0.00219155844155852*G0_0_1_2_2_1 - 0.00292207792207802*G0_0_1_2_3_0 + 0.00584415584415606*G0_0_1_2_3_1 + 0.0233766233766242*G0_0_1_2_3_3 + 0.00584415584415605*G0_0_1_2_3_5 - 0.00584415584415603*G0_0_1_2_4_0 + 0.00292207792207802*G0_0_1_2_4_1 - 0.0233766233766242*G0_0_1_2_4_4 - 0.00584415584415604*G0_0_1_2_4_5 - 0.00146103896103901*G0_0_1_2_5_0 + 0.00146103896103901*G0_0_1_2_5_1 + 0.00584415584415605*G0_0_1_2_5_3 - 0.00584415584415604*G0_0_1_2_5_4 - 0.00321428571428581*G0_0_1_3_0_0 - 0.000292207792207795*G0_0_1_3_0_1 - 0.00292207792207801*G0_0_1_3_0_2 + 0.0362337662337674*G0_0_1_3_0_3 + 0.00584415584415602*G0_0_1_3_0_4 + 0.00935064935064965*G0_0_1_3_0_5 - 0.000292207792207795*G0_0_1_3_1_0 - 0.00613636363636389*G0_0_1_3_1_1 + 0.00584415584415606*G0_0_1_3_1_2 - 0.010519480519481*G0_0_1_3_1_3 - 0.00584415584415605*G0_0_1_3_1_4 - 0.00233766233766244*G0_0_1_3_1_5 - 0.00292207792207802*G0_0_1_3_2_0 + 0.00584415584415606*G0_0_1_3_2_1 + 0.0233766233766242*G0_0_1_3_2_3 + 0.00584415584415605*G0_0_1_3_2_5 + 0.0362337662337674*G0_0_1_3_3_0 - 0.010519480519481*G0_0_1_3_3_1 + 0.0233766233766242*G0_0_1_3_3_2 - 0.547012987013006*G0_0_1_3_3_3 - 0.0607792207792228*G0_0_1_3_3_4 - 0.084155844155847*G0_0_1_3_3_5 + 0.00584415584415602*G0_0_1_3_4_0 - 0.00584415584415605*G0_0_1_3_4_1 - 0.0607792207792228*G0_0_1_3_4_3 + 0.0607792207792227*G0_0_1_3_4_4 + 0.00935064935064965*G0_0_1_3_5_0 - 0.00233766233766244*G0_0_1_3_5_1 + 0.00584415584415605*G0_0_1_3_5_2 - 0.0841558441558471*G0_0_1_3_5_3 - 0.0187012987012994*G0_0_1_3_5_5 + 0.00613636363636382*G0_0_1_4_0_0 + 0.0002922077922078*G0_0_1_4_0_1 - 0.00584415584415603*G0_0_1_4_0_2 + 0.00584415584415602*G0_0_1_4_0_3 + 0.0105194805194809*G0_0_1_4_0_4 + 0.00233766233766241*G0_0_1_4_0_5 + 0.0002922077922078*G0_0_1_4_1_0 + 0.00321428571428582*G0_0_1_4_1_1 + 0.00292207792207802*G0_0_1_4_1_2 - 0.00584415584415605*G0_0_1_4_1_3 - 0.0362337662337674*G0_0_1_4_1_4 - 0.00935064935064968*G0_0_1_4_1_5 - 0.00584415584415603*G0_0_1_4_2_0 + 0.00292207792207802*G0_0_1_4_2_1 - 0.0233766233766242*G0_0_1_4_2_4 - 0.00584415584415604*G0_0_1_4_2_5 + 0.00584415584415603*G0_0_1_4_3_0 - 0.00584415584415605*G0_0_1_4_3_1 - 0.0607792207792228*G0_0_1_4_3_3 + 0.0607792207792227*G0_0_1_4_3_4 + 0.0105194805194809*G0_0_1_4_4_0 - 0.0362337662337674*G0_0_1_4_4_1 - 0.0233766233766242*G0_0_1_4_4_2 + 0.0607792207792227*G0_0_1_4_4_3 + 0.547012987013004*G0_0_1_4_4_4 + 0.0841558441558469*G0_0_1_4_4_5 + 0.00233766233766241*G0_0_1_4_5_0 - 0.00935064935064968*G0_0_1_4_5_1 - 0.00584415584415604*G0_0_1_4_5_2 + 0.0841558441558469*G0_0_1_4_5_4 + 0.0187012987012993*G0_0_1_4_5_5 - 0.00467532467532486*G0_0_1_5_0_0 - 0.00146103896103901*G0_0_1_5_0_2 + 0.00935064935064965*G0_0_1_5_0_3 + 0.00233766233766241*G0_0_1_5_0_4 - 0.00233766233766243*G0_0_1_5_0_5 + 0.00467532467532481*G0_0_1_5_1_1 + 0.00146103896103901*G0_0_1_5_1_2 - 0.00233766233766244*G0_0_1_5_1_3 - 0.00935064935064968*G0_0_1_5_1_4 + 0.0023376623376624*G0_0_1_5_1_5 - 0.00146103896103901*G0_0_1_5_2_0 + 0.00146103896103901*G0_0_1_5_2_1 + 0.00584415584415605*G0_0_1_5_2_3 - 0.00584415584415604*G0_0_1_5_2_4 + 0.00935064935064965*G0_0_1_5_3_0 - 0.00233766233766244*G0_0_1_5_3_1 + 0.00584415584415605*G0_0_1_5_3_2 - 0.0841558441558471*G0_0_1_5_3_3 - 0.0187012987012994*G0_0_1_5_3_5 + 0.00233766233766241*G0_0_1_5_4_0 - 0.00935064935064968*G0_0_1_5_4_1 - 0.00584415584415604*G0_0_1_5_4_2 + 0.0841558441558469*G0_0_1_5_4_4 + 0.0187012987012993*G0_0_1_5_4_5 - 0.00233766233766244*G0_0_1_5_5_0 + 0.0023376623376624*G0_0_1_5_5_1 - 0.0187012987012994*G0_0_1_5_5_3 + 0.0187012987012993*G0_0_1_5_5_4 - 0.0278327922077934*G0_1_1_0_0_0 + 0.00438311688311705*G0_1_1_0_0_1 + 0.00182629870129877*G0_1_1_0_0_2 - 0.00642857142857163*G0_1_1_0_0_3 - 0.00788961038961068*G0_1_1_0_0_4 - 0.0315584415584427*G0_1_1_0_0_5 + 0.00438311688311705*G0_1_1_0_1_0 + 0.00357954545454558*G0_1_1_0_1_1 - 0.00102272727272731*G0_1_1_0_1_2 - 0.000876623376623396*G0_1_1_0_1_3 - 0.000584415584415596*G0_1_1_0_1_4 + 0.0146103896103901*G0_1_1_0_1_5 + 0.00182629870129877*G0_1_1_0_2_0 - 0.00102272727272731*G0_1_1_0_2_1 - 0.000730519480519512*G0_1_1_0_2_2 - 0.00146103896103901*G0_1_1_0_2_3 + 0.000584415584415616*G0_1_1_0_2_5 - 0.00642857142857163*G0_1_1_0_3_0 - 0.000876623376623396*G0_1_1_0_3_1 - 0.00146103896103901*G0_1_1_0_3_2 + 0.0409090909090922*G0_1_1_0_3_3 + 0.0140259740259745*G0_1_1_0_3_4 + 0.0116883116883121*G0_1_1_0_3_5 - 0.00788961038961068*G0_1_1_0_4_0 - 0.000584415584415596*G0_1_1_0_4_1 + 0.0140259740259745*G0_1_1_0_4_3 + 0.0105194805194808*G0_1_1_0_4_4 - 0.0315584415584427*G0_1_1_0_5_0 + 0.0146103896103901*G0_1_1_0_5_1 + 0.000584415584415616*G0_1_1_0_5_2 + 0.0116883116883121*G0_1_1_0_5_3 - 0.021038961038962*G0_1_1_0_5_5 + 0.00438311688311705*G0_1_1_1_0_0 + 0.00357954545454558*G0_1_1_1_0_1 - 0.00102272727272731*G0_1_1_1_0_2 - 0.000876623376623396*G0_1_1_1_0_3 - 0.000584415584415596*G0_1_1_1_0_4 + 0.0146103896103901*G0_1_1_1_0_5 + 0.00357954545454558*G0_1_1_1_1_0 - 0.0175324675324683*G0_1_1_1_1_1 + 0.00182629870129877*G0_1_1_1_1_2 - 0.0140259740259746*G0_1_1_1_1_3 - 0.00321428571428582*G0_1_1_1_1_4 - 0.0268831168831179*G0_1_1_1_1_5 - 0.00102272727272731*G0_1_1_1_2_0 + 0.00182629870129877*G0_1_1_1_2_1 - 0.00292207792207802*G0_1_1_1_2_2 + 0.00584415584415606*G0_1_1_1_2_3 + 0.00146103896103901*G0_1_1_1_2_4 + 0.00204545454545462*G0_1_1_1_2_5 - 0.000876623376623396*G0_1_1_1_3_0 - 0.0140259740259746*G0_1_1_1_3_1 + 0.00584415584415606*G0_1_1_1_3_2 + 0.00818181818181844*G0_1_1_1_3_4 - 0.00233766233766245*G0_1_1_1_3_5 - 0.000584415584415596*G0_1_1_1_4_0 - 0.00321428571428582*G0_1_1_1_4_1 + 0.00146103896103901*G0_1_1_1_4_2 + 0.00818181818181844*G0_1_1_1_4_3 + 0.00467532467532483*G0_1_1_1_4_4 + 0.00233766233766242*G0_1_1_1_4_5 + 0.0146103896103901*G0_1_1_1_5_0 - 0.0268831168831179*G0_1_1_1_5_1 + 0.00204545454545462*G0_1_1_1_5_2 - 0.00233766233766245*G0_1_1_1_5_3 + 0.00233766233766242*G0_1_1_1_5_4 - 0.0187012987012994*G0_1_1_1_5_5 + 0.00182629870129877*G0_1_1_2_0_0 - 0.00102272727272731*G0_1_1_2_0_1 - 0.000730519480519512*G0_1_1_2_0_2 - 0.00146103896103901*G0_1_1_2_0_3 + 0.000584415584415616*G0_1_1_2_0_5 - 0.00102272727272731*G0_1_1_2_1_0 + 0.00182629870129877*G0_1_1_2_1_1 - 0.00292207792207803*G0_1_1_2_1_2 + 0.00584415584415606*G0_1_1_2_1_3 + 0.00146103896103901*G0_1_1_2_1_4 + 0.00204545454545462*G0_1_1_2_1_5 - 0.000730519480519512*G0_1_1_2_2_0 - 0.00292207792207802*G0_1_1_2_2_1 + 0.0284902597402608*G0_1_1_2_2_2 + 0.00438311688311703*G0_1_1_2_2_3 + 0.00438311688311706*G0_1_1_2_2_4 - 0.00146103896103901*G0_1_1_2_2_5 - 0.00146103896103901*G0_1_1_2_3_0 + 0.00584415584415606*G0_1_1_2_3_1 + 0.00438311688311704*G0_1_1_2_3_2 + 0.0175324675324681*G0_1_1_2_3_3 + 0.00584415584415605*G0_1_1_2_3_5 + 0.00146103896103901*G0_1_1_2_4_1 + 0.00438311688311706*G0_1_1_2_4_2 - 0.00584415584415602*G0_1_1_2_4_4 + 0.000584415584415616*G0_1_1_2_5_0 + 0.00204545454545462*G0_1_1_2_5_1 - 0.00146103896103901*G0_1_1_2_5_2 + 0.00584415584415605*G0_1_1_2_5_3 + 0.0187012987012994*G0_1_1_2_5_5 - 0.00642857142857163*G0_1_1_3_0_0 - 0.000876623376623396*G0_1_1_3_0_1 - 0.00146103896103901*G0_1_1_3_0_2 + 0.0409090909090922*G0_1_1_3_0_3 + 0.0140259740259745*G0_1_1_3_0_4 + 0.0116883116883121*G0_1_1_3_0_5 - 0.000876623376623395*G0_1_1_3_1_0 - 0.0140259740259746*G0_1_1_3_1_1 + 0.00584415584415606*G0_1_1_3_1_2 + 0.00818181818181844*G0_1_1_3_1_4 - 0.00233766233766245*G0_1_1_3_1_5 - 0.00146103896103901*G0_1_1_3_2_0 + 0.00584415584415606*G0_1_1_3_2_1 + 0.00438311688311704*G0_1_1_3_2_2 + 0.0175324675324681*G0_1_1_3_2_3 + 0.00584415584415605*G0_1_1_3_2_5 + 0.0409090909090922*G0_1_1_3_3_0 + 0.0175324675324681*G0_1_1_3_3_2 - 0.561038961038981*G0_1_1_3_3_3 - 0.0981818181818215*G0_1_1_3_3_4 - 0.0935064935064968*G0_1_1_3_3_5 + 0.0140259740259745*G0_1_1_3_4_0 + 0.00818181818181844*G0_1_1_3_4_1 - 0.0981818181818215*G0_1_1_3_4_3 - 0.0374025974025986*G0_1_1_3_4_4 - 0.028051948051949*G0_1_1_3_4_5 + 0.0116883116883121*G0_1_1_3_5_0 - 0.00233766233766245*G0_1_1_3_5_1 + 0.00584415584415605*G0_1_1_3_5_2 - 0.0935064935064968*G0_1_1_3_5_3 - 0.028051948051949*G0_1_1_3_5_4 - 0.0607792207792229*G0_1_1_3_5_5 - 0.00788961038961068*G0_1_1_4_0_0 - 0.000584415584415596*G0_1_1_4_0_1 + 0.0140259740259745*G0_1_1_4_0_3 + 0.0105194805194808*G0_1_1_4_0_4 - 0.000584415584415596*G0_1_1_4_1_0 - 0.00321428571428582*G0_1_1_4_1_1 + 0.00146103896103901*G0_1_1_4_1_2 + 0.00818181818181844*G0_1_1_4_1_3 + 0.00467532467532483*G0_1_1_4_1_4 + 0.00233766233766242*G0_1_1_4_1_5 + 0.00146103896103901*G0_1_1_4_2_1 + 0.00438311688311706*G0_1_1_4_2_2 - 0.00584415584415602*G0_1_1_4_2_4 + 0.0140259740259745*G0_1_1_4_3_0 + 0.00818181818181844*G0_1_1_4_3_1 - 0.0981818181818215*G0_1_1_4_3_3 - 0.0374025974025986*G0_1_1_4_3_4 - 0.028051948051949*G0_1_1_4_3_5 + 0.0105194805194808*G0_1_1_4_4_0 + 0.00467532467532483*G0_1_1_4_4_1 - 0.00584415584415602*G0_1_1_4_4_2 - 0.0374025974025986*G0_1_1_4_4_3 - 0.0140259740259746*G0_1_1_4_4_4 - 0.00935064935064968*G0_1_1_4_4_5 + 0.00233766233766242*G0_1_1_4_5_1 - 0.028051948051949*G0_1_1_4_5_3 - 0.00935064935064968*G0_1_1_4_5_4 - 0.0420779220779236*G0_1_1_4_5_5 - 0.0315584415584427*G0_1_1_5_0_0 + 0.0146103896103901*G0_1_1_5_0_1 + 0.000584415584415616*G0_1_1_5_0_2 + 0.0116883116883121*G0_1_1_5_0_3 - 0.021038961038962*G0_1_1_5_0_5 + 0.0146103896103901*G0_1_1_5_1_0 - 0.0268831168831179*G0_1_1_5_1_1 + 0.00204545454545462*G0_1_1_5_1_2 - 0.00233766233766245*G0_1_1_5_1_3 + 0.00233766233766242*G0_1_1_5_1_4 - 0.0187012987012994*G0_1_1_5_1_5 + 0.000584415584415616*G0_1_1_5_2_0 + 0.00204545454545462*G0_1_1_5_2_1 - 0.00146103896103901*G0_1_1_5_2_2 + 0.00584415584415605*G0_1_1_5_2_3 + 0.0187012987012994*G0_1_1_5_2_5 + 0.0116883116883121*G0_1_1_5_3_0 - 0.00233766233766245*G0_1_1_5_3_1 + 0.00584415584415605*G0_1_1_5_3_2 - 0.0935064935064967*G0_1_1_5_3_3 - 0.028051948051949*G0_1_1_5_3_4 - 0.0607792207792229*G0_1_1_5_3_5 + 0.00233766233766242*G0_1_1_5_4_1 - 0.028051948051949*G0_1_1_5_4_3 - 0.00935064935064968*G0_1_1_5_4_4 - 0.0420779220779236*G0_1_1_5_4_5 - 0.021038961038962*G0_1_1_5_5_0 - 0.0187012987012994*G0_1_1_5_5_1 + 0.0187012987012994*G0_1_1_5_5_2 - 0.0607792207792229*G0_1_1_5_5_3 - 0.0420779220779236*G0_1_1_5_5_4 - 0.518961038961058*G0_1_1_5_5_5; + A[33] = -A[83] + 0.00354301948051965*G0_0_0_0_0_0 - 0.00071834415584418*G0_0_0_0_0_1 - 0.000706168831168857*G0_0_0_0_0_2 + 0.00633116883116902*G0_0_0_0_0_3 + 0.00964285714285747*G0_0_0_0_0_4 + 0.00521103896103913*G0_0_0_0_0_5 - 0.00071834415584418*G0_0_0_0_1_0 + 0.000365259740259754*G0_0_0_0_1_1 + 0.000474837662337678*G0_0_0_0_1_2 + 0.001948051948052*G0_0_0_0_1_3 + 0.001461038961039*G0_0_0_0_1_4 + 0.000487012987012999*G0_0_0_0_1_5 - 0.000706168831168857*G0_0_0_0_2_0 + 0.000474837662337678*G0_0_0_0_2_1 - 0.00614853896103917*G0_0_0_0_2_2 + 0.00248376623376631*G0_0_0_0_2_3 - 0.00535714285714304*G0_0_0_0_2_4 + 0.00282467532467541*G0_0_0_0_2_5 + 0.00633116883116902*G0_0_0_0_3_0 + 0.001948051948052*G0_0_0_0_3_1 + 0.00248376623376631*G0_0_0_0_3_2 - 0.0395454545454557*G0_0_0_0_3_3 - 0.0155844155844161*G0_0_0_0_3_4 - 0.0183116883116889*G0_0_0_0_3_5 + 0.00964285714285747*G0_0_0_0_4_0 + 0.001461038961039*G0_0_0_0_4_1 - 0.00535714285714304*G0_0_0_0_4_2 - 0.0155844155844161*G0_0_0_0_4_3 - 0.0105194805194808*G0_0_0_0_4_4 - 0.00857142857142883*G0_0_0_0_4_5 + 0.00521103896103913*G0_0_0_0_5_0 + 0.000487012987012999*G0_0_0_0_5_1 + 0.00282467532467541*G0_0_0_0_5_2 - 0.0183116883116889*G0_0_0_0_5_3 - 0.00857142857142883*G0_0_0_0_5_4 - 0.0153896103896109*G0_0_0_0_5_5 - 0.00071834415584418*G0_0_0_1_0_0 + 0.000365259740259755*G0_0_0_1_0_1 + 0.000474837662337678*G0_0_0_1_0_2 + 0.001948051948052*G0_0_0_1_0_3 + 0.001461038961039*G0_0_0_1_0_4 + 0.000487012987013*G0_0_0_1_0_5 + 0.000365259740259755*G0_0_0_1_1_0 - 0.0244724025974034*G0_0_0_1_1_1 + 0.00194805194805201*G0_0_0_1_1_2 - 0.00292207792207801*G0_0_0_1_1_3 + 0.00243506493506501*G0_0_0_1_1_4 - 0.00146103896103903*G0_0_0_1_1_5 + 0.000474837662337678*G0_0_0_1_2_0 + 0.00194805194805201*G0_0_0_1_2_1 - 0.00308035714285724*G0_0_0_1_2_2 - 0.00292207792207803*G0_0_0_1_2_3 - 0.000925324675324706*G0_0_0_1_2_4 + 0.000487012987013002*G0_0_0_1_2_5 + 0.001948051948052*G0_0_0_1_3_0 - 0.00292207792207801*G0_0_0_1_3_1 - 0.00292207792207803*G0_0_0_1_3_2 - 0.01461038961039*G0_0_0_1_3_3 - 0.00876623376623403*G0_0_0_1_3_4 - 0.00487012987013002*G0_0_0_1_3_5 + 0.001461038961039*G0_0_0_1_4_0 + 0.00243506493506501*G0_0_0_1_4_1 - 0.000925324675324706*G0_0_0_1_4_2 - 0.00876623376623403*G0_0_0_1_4_3 - 0.0124675324675329*G0_0_0_1_4_4 - 0.00584415584415603*G0_0_0_1_4_5 + 0.000487012987013*G0_0_0_1_5_0 - 0.00146103896103903*G0_0_0_1_5_1 + 0.000487012987013002*G0_0_0_1_5_2 - 0.00487012987013002*G0_0_0_1_5_3 - 0.00584415584415603*G0_0_0_1_5_4 - 0.00487012987013002*G0_0_0_1_5_5 - 0.000706168831168857*G0_0_0_2_0_0 + 0.000474837662337678*G0_0_0_2_0_1 - 0.00614853896103917*G0_0_0_2_0_2 + 0.00248376623376631*G0_0_0_2_0_3 - 0.00535714285714304*G0_0_0_2_0_4 + 0.00282467532467541*G0_0_0_2_0_5 + 0.000474837662337678*G0_0_0_2_1_0 + 0.00194805194805201*G0_0_0_2_1_1 - 0.00308035714285724*G0_0_0_2_1_2 - 0.00292207792207803*G0_0_0_2_1_3 - 0.000925324675324706*G0_0_0_2_1_4 + 0.000487012987013002*G0_0_0_2_1_5 - 0.00614853896103917*G0_0_0_2_2_0 - 0.00308035714285724*G0_0_0_2_2_1 + 0.057711038961041*G0_0_0_2_2_2 + 0.0177272727272733*G0_0_0_2_2_3 + 0.029025974025975*G0_0_0_2_2_4 + 0.00521103896103915*G0_0_0_2_2_5 + 0.00248376623376631*G0_0_0_2_3_0 - 0.00292207792207803*G0_0_0_2_3_1 + 0.0177272727272733*G0_0_0_2_3_2 - 0.0132467532467537*G0_0_0_2_3_3 - 0.0031168831168832*G0_0_0_2_3_4 - 0.0153896103896109*G0_0_0_2_3_5 - 0.00535714285714304*G0_0_0_2_4_0 - 0.000925324675324706*G0_0_0_2_4_1 + 0.029025974025975*G0_0_0_2_4_2 - 0.0031168831168832*G0_0_0_2_4_3 + 0.0194805194805201*G0_0_0_2_4_4 - 0.00857142857142884*G0_0_0_2_4_5 + 0.00282467532467541*G0_0_0_2_5_0 + 0.000487012987013002*G0_0_0_2_5_1 + 0.00521103896103914*G0_0_0_2_5_2 - 0.0153896103896109*G0_0_0_2_5_3 - 0.00857142857142884*G0_0_0_2_5_4 - 0.0183116883116889*G0_0_0_2_5_5 + 0.00633116883116902*G0_0_0_3_0_0 + 0.001948051948052*G0_0_0_3_0_1 + 0.00248376623376631*G0_0_0_3_0_2 - 0.0395454545454557*G0_0_0_3_0_3 - 0.0155844155844161*G0_0_0_3_0_4 - 0.0183116883116889*G0_0_0_3_0_5 + 0.001948051948052*G0_0_0_3_1_0 - 0.00292207792207802*G0_0_0_3_1_1 - 0.00292207792207803*G0_0_0_3_1_2 - 0.01461038961039*G0_0_0_3_1_3 - 0.00876623376623403*G0_0_0_3_1_4 - 0.00487012987013002*G0_0_0_3_1_5 + 0.00248376623376631*G0_0_0_3_2_0 - 0.00292207792207803*G0_0_0_3_2_1 + 0.0177272727272733*G0_0_0_3_2_2 - 0.0132467532467537*G0_0_0_3_2_3 - 0.0031168831168832*G0_0_0_3_2_4 - 0.0153896103896109*G0_0_0_3_2_5 - 0.0395454545454557*G0_0_0_3_3_0 - 0.01461038961039*G0_0_0_3_3_1 - 0.0132467532467537*G0_0_0_3_3_2 + 0.439480519480534*G0_0_0_3_3_3 + 0.0966233766233797*G0_0_0_3_3_4 + 0.109870129870133*G0_0_0_3_3_5 - 0.0155844155844161*G0_0_0_3_4_0 - 0.00876623376623403*G0_0_0_3_4_1 - 0.00311688311688321*G0_0_0_3_4_2 + 0.0966233766233797*G0_0_0_3_4_3 + 0.0561038961038979*G0_0_0_3_4_4 + 0.0483116883116899*G0_0_0_3_4_5 - 0.0183116883116889*G0_0_0_3_5_0 - 0.00487012987013002*G0_0_0_3_5_1 - 0.0153896103896109*G0_0_0_3_5_2 + 0.109870129870133*G0_0_0_3_5_3 + 0.0483116883116899*G0_0_0_3_5_4 + 0.0732467532467556*G0_0_0_3_5_5 + 0.00964285714285747*G0_0_0_4_0_0 + 0.001461038961039*G0_0_0_4_0_1 - 0.00535714285714304*G0_0_0_4_0_2 - 0.0155844155844161*G0_0_0_4_0_3 - 0.0105194805194808*G0_0_0_4_0_4 - 0.00857142857142883*G0_0_0_4_0_5 + 0.001461038961039*G0_0_0_4_1_0 + 0.00243506493506501*G0_0_0_4_1_1 - 0.000925324675324706*G0_0_0_4_1_2 - 0.00876623376623403*G0_0_0_4_1_3 - 0.0124675324675329*G0_0_0_4_1_4 - 0.00584415584415603*G0_0_0_4_1_5 - 0.00535714285714304*G0_0_0_4_2_0 - 0.000925324675324706*G0_0_0_4_2_1 + 0.029025974025975*G0_0_0_4_2_2 - 0.0031168831168832*G0_0_0_4_2_3 + 0.0194805194805201*G0_0_0_4_2_4 - 0.00857142857142885*G0_0_0_4_2_5 - 0.0155844155844161*G0_0_0_4_3_0 - 0.00876623376623403*G0_0_0_4_3_1 - 0.00311688311688321*G0_0_0_4_3_2 + 0.0966233766233797*G0_0_0_4_3_3 + 0.0561038961038979*G0_0_0_4_3_4 + 0.0483116883116899*G0_0_0_4_3_5 - 0.0105194805194808*G0_0_0_4_4_0 - 0.0124675324675329*G0_0_0_4_4_1 + 0.0194805194805201*G0_0_0_4_4_2 + 0.0561038961038979*G0_0_0_4_4_3 + 0.201038961038968*G0_0_0_4_4_4 + 0.0420779220779234*G0_0_0_4_4_5 - 0.00857142857142883*G0_0_0_4_5_0 - 0.00584415584415603*G0_0_0_4_5_1 - 0.00857142857142884*G0_0_0_4_5_2 + 0.0483116883116899*G0_0_0_4_5_3 + 0.0420779220779234*G0_0_0_4_5_4 + 0.0483116883116899*G0_0_0_4_5_5 + 0.00521103896103913*G0_0_0_5_0_0 + 0.000487012987012999*G0_0_0_5_0_1 + 0.00282467532467541*G0_0_0_5_0_2 - 0.0183116883116889*G0_0_0_5_0_3 - 0.00857142857142883*G0_0_0_5_0_4 - 0.0153896103896109*G0_0_0_5_0_5 + 0.000487012987012999*G0_0_0_5_1_0 - 0.00146103896103903*G0_0_0_5_1_1 + 0.000487012987013002*G0_0_0_5_1_2 - 0.00487012987013002*G0_0_0_5_1_3 - 0.00584415584415603*G0_0_0_5_1_4 - 0.00487012987013003*G0_0_0_5_1_5 + 0.00282467532467541*G0_0_0_5_2_0 + 0.000487012987013002*G0_0_0_5_2_1 + 0.00521103896103914*G0_0_0_5_2_2 - 0.0153896103896109*G0_0_0_5_2_3 - 0.00857142857142884*G0_0_0_5_2_4 - 0.0183116883116889*G0_0_0_5_2_5 - 0.0183116883116889*G0_0_0_5_3_0 - 0.00487012987013002*G0_0_0_5_3_1 - 0.0153896103896109*G0_0_0_5_3_2 + 0.109870129870133*G0_0_0_5_3_3 + 0.0483116883116899*G0_0_0_5_3_4 + 0.0732467532467556*G0_0_0_5_3_5 - 0.00857142857142883*G0_0_0_5_4_0 - 0.00584415584415603*G0_0_0_5_4_1 - 0.00857142857142884*G0_0_0_5_4_2 + 0.0483116883116899*G0_0_0_5_4_3 + 0.0420779220779234*G0_0_0_5_4_4 + 0.0483116883116899*G0_0_0_5_4_5 - 0.0153896103896109*G0_0_0_5_5_0 - 0.00487012987013003*G0_0_0_5_5_1 - 0.0183116883116889*G0_0_0_5_5_2 + 0.0732467532467556*G0_0_0_5_5_3 + 0.0483116883116899*G0_0_0_5_5_4 + 0.109870129870134*G0_0_0_5_5_5 + 0.00178977272727275*G0_0_1_0_0_0 - 0.000730519480519505*G0_0_1_0_0_1 - 0.000572240259740277*G0_0_1_0_0_2 + 0.00180194805194811*G0_0_1_0_0_3 + 0.0018506493506494*G0_0_1_0_0_4 + 0.00228896103896111*G0_0_1_0_0_5 - 0.000730519480519505*G0_0_1_0_1_0 + 0.00986201298701332*G0_0_1_0_1_1 - 0.000243506493506503*G0_0_1_0_1_2 + 0.000974025974026008*G0_0_1_0_1_3 - 0.000243506493506502*G0_0_1_0_1_4 + 0.00243506493506503*G0_0_1_0_1_5 - 0.000572240259740277*G0_0_1_0_2_0 - 0.000243506493506503*G0_0_1_0_2_1 - 0.000572240259740274*G0_0_1_0_2_2 + 0.00180194805194811*G0_0_1_0_2_3 + 0.000194805194805206*G0_0_1_0_2_4 + 0.00180194805194811*G0_0_1_0_2_5 + 0.00180194805194811*G0_0_1_0_3_0 + 0.000974025974026011*G0_0_1_0_3_1 + 0.00180194805194811*G0_0_1_0_3_2 - 0.0103246753246756*G0_0_1_0_3_3 - 0.00311688311688322*G0_0_1_0_3_4 - 0.00720779220779244*G0_0_1_0_3_5 + 0.0018506493506494*G0_0_1_0_4_0 - 0.000243506493506502*G0_0_1_0_4_1 + 0.000194805194805206*G0_0_1_0_4_2 - 0.00311688311688322*G0_0_1_0_4_3 - 0.000389610389610395*G0_0_1_0_4_4 - 0.00311688311688322*G0_0_1_0_4_5 + 0.00228896103896111*G0_0_1_0_5_0 + 0.00243506493506503*G0_0_1_0_5_1 + 0.00180194805194811*G0_0_1_0_5_2 - 0.00720779220779244*G0_0_1_0_5_3 - 0.00311688311688322*G0_0_1_0_5_4 - 0.0122727272727277*G0_0_1_0_5_5 - 0.000730519480519505*G0_0_1_1_0_0 + 0.00986201298701332*G0_0_1_1_0_1 - 0.000243506493506503*G0_0_1_1_0_2 + 0.000974025974026008*G0_0_1_1_0_3 - 0.000243506493506502*G0_0_1_1_0_4 + 0.00243506493506502*G0_0_1_1_0_5 + 0.00986201298701332*G0_0_1_1_1_0 - 0.201623376623384*G0_0_1_1_1_1 + 0.00986201298701332*G0_0_1_1_1_2 - 0.0409090909090923*G0_0_1_1_1_3 - 0.00146103896103899*G0_0_1_1_1_4 - 0.0409090909090925*G0_0_1_1_1_5 - 0.000243506493506503*G0_0_1_1_2_0 + 0.00986201298701332*G0_0_1_1_2_1 - 0.000730519480519503*G0_0_1_1_2_2 + 0.00243506493506502*G0_0_1_1_2_3 - 0.0002435064935065*G0_0_1_1_2_4 + 0.000974025974026019*G0_0_1_1_2_5 + 0.000974025974026009*G0_0_1_1_3_0 - 0.0409090909090923*G0_0_1_1_3_1 + 0.00243506493506502*G0_0_1_1_3_2 - 0.00779220779220802*G0_0_1_1_3_3 + 0.000974025974026007*G0_0_1_1_3_4 - 0.00389610389610407*G0_0_1_1_3_5 - 0.000243506493506502*G0_0_1_1_4_0 - 0.00146103896103899*G0_0_1_1_4_1 - 0.0002435064935065*G0_0_1_1_4_2 + 0.000974025974026006*G0_0_1_1_4_3 + 0.000974025974026004*G0_0_1_1_4_5 + 0.00243506493506503*G0_0_1_1_5_0 - 0.0409090909090925*G0_0_1_1_5_1 + 0.000974025974026019*G0_0_1_1_5_2 - 0.00389610389610407*G0_0_1_1_5_3 + 0.000974025974026004*G0_0_1_1_5_4 - 0.00779220779220812*G0_0_1_1_5_5 - 0.000572240259740277*G0_0_1_2_0_0 - 0.000243506493506503*G0_0_1_2_0_1 - 0.000572240259740274*G0_0_1_2_0_2 + 0.00180194805194811*G0_0_1_2_0_3 + 0.000194805194805206*G0_0_1_2_0_4 + 0.00180194805194811*G0_0_1_2_0_5 - 0.000243506493506503*G0_0_1_2_1_0 + 0.00986201298701332*G0_0_1_2_1_1 - 0.000730519480519503*G0_0_1_2_1_2 + 0.00243506493506502*G0_0_1_2_1_3 - 0.0002435064935065*G0_0_1_2_1_4 + 0.000974025974026018*G0_0_1_2_1_5 - 0.000572240259740274*G0_0_1_2_2_0 - 0.000730519480519503*G0_0_1_2_2_1 + 0.00178977272727274*G0_0_1_2_2_2 + 0.00228896103896111*G0_0_1_2_2_3 + 0.00185064935064939*G0_0_1_2_2_4 + 0.00180194805194811*G0_0_1_2_2_5 + 0.00180194805194811*G0_0_1_2_3_0 + 0.00243506493506502*G0_0_1_2_3_1 + 0.00228896103896111*G0_0_1_2_3_2 - 0.0122727272727277*G0_0_1_2_3_3 - 0.00311688311688323*G0_0_1_2_3_4 - 0.00720779220779245*G0_0_1_2_3_5 + 0.000194805194805206*G0_0_1_2_4_0 - 0.0002435064935065*G0_0_1_2_4_1 + 0.00185064935064939*G0_0_1_2_4_2 - 0.00311688311688323*G0_0_1_2_4_3 - 0.000389610389610433*G0_0_1_2_4_4 - 0.00311688311688323*G0_0_1_2_4_5 + 0.00180194805194811*G0_0_1_2_5_0 + 0.000974025974026018*G0_0_1_2_5_1 + 0.00180194805194811*G0_0_1_2_5_2 - 0.00720779220779245*G0_0_1_2_5_3 - 0.00311688311688323*G0_0_1_2_5_4 - 0.0103246753246757*G0_0_1_2_5_5 + 0.00180194805194811*G0_0_1_3_0_0 + 0.000974025974026011*G0_0_1_3_0_1 + 0.00180194805194811*G0_0_1_3_0_2 - 0.0103246753246756*G0_0_1_3_0_3 - 0.00311688311688322*G0_0_1_3_0_4 - 0.00720779220779244*G0_0_1_3_0_5 + 0.000974025974026011*G0_0_1_3_1_0 - 0.0409090909090923*G0_0_1_3_1_1 + 0.00243506493506502*G0_0_1_3_1_2 - 0.00779220779220803*G0_0_1_3_1_3 + 0.000974025974026006*G0_0_1_3_1_4 - 0.00389610389610407*G0_0_1_3_1_5 + 0.00180194805194811*G0_0_1_3_2_0 + 0.00243506493506502*G0_0_1_3_2_1 + 0.00228896103896111*G0_0_1_3_2_2 - 0.0122727272727277*G0_0_1_3_2_3 - 0.00311688311688323*G0_0_1_3_2_4 - 0.00720779220779245*G0_0_1_3_2_5 - 0.0103246753246756*G0_0_1_3_3_0 - 0.00779220779220802*G0_0_1_3_3_1 - 0.0122727272727277*G0_0_1_3_3_2 + 0.105194805194809*G0_0_1_3_3_3 + 0.0187012987012993*G0_0_1_3_3_4 + 0.0350649350649362*G0_0_1_3_3_5 - 0.00311688311688322*G0_0_1_3_4_0 + 0.000974025974026006*G0_0_1_3_4_1 - 0.00311688311688323*G0_0_1_3_4_2 + 0.0187012987012993*G0_0_1_3_4_3 + 0.00623376623376645*G0_0_1_3_4_4 + 0.0124675324675329*G0_0_1_3_4_5 - 0.00720779220779244*G0_0_1_3_5_0 - 0.00389610389610407*G0_0_1_3_5_1 - 0.00720779220779245*G0_0_1_3_5_2 + 0.0350649350649363*G0_0_1_3_5_3 + 0.0124675324675329*G0_0_1_3_5_4 + 0.0350649350649363*G0_0_1_3_5_5 + 0.0018506493506494*G0_0_1_4_0_0 - 0.000243506493506502*G0_0_1_4_0_1 + 0.000194805194805206*G0_0_1_4_0_2 - 0.00311688311688322*G0_0_1_4_0_3 - 0.000389610389610395*G0_0_1_4_0_4 - 0.00311688311688322*G0_0_1_4_0_5 - 0.000243506493506502*G0_0_1_4_1_0 - 0.00146103896103899*G0_0_1_4_1_1 - 0.0002435064935065*G0_0_1_4_1_2 + 0.000974025974026006*G0_0_1_4_1_3 + 0.000974025974026004*G0_0_1_4_1_5 + 0.000194805194805206*G0_0_1_4_2_0 - 0.0002435064935065*G0_0_1_4_2_1 + 0.00185064935064939*G0_0_1_4_2_2 - 0.00311688311688323*G0_0_1_4_2_3 - 0.000389610389610432*G0_0_1_4_2_4 - 0.00311688311688323*G0_0_1_4_2_5 - 0.00311688311688322*G0_0_1_4_3_0 + 0.000974025974026006*G0_0_1_4_3_1 - 0.00311688311688323*G0_0_1_4_3_2 + 0.0187012987012993*G0_0_1_4_3_3 + 0.00623376623376645*G0_0_1_4_3_4 + 0.0124675324675329*G0_0_1_4_3_5 - 0.000389610389610395*G0_0_1_4_4_0 - 0.000389610389610432*G0_0_1_4_4_2 + 0.00623376623376645*G0_0_1_4_4_3 + 0.0140259740259745*G0_0_1_4_4_4 + 0.00623376623376646*G0_0_1_4_4_5 - 0.00311688311688322*G0_0_1_4_5_0 + 0.000974025974026004*G0_0_1_4_5_1 - 0.00311688311688323*G0_0_1_4_5_2 + 0.0124675324675329*G0_0_1_4_5_3 + 0.00623376623376646*G0_0_1_4_5_4 + 0.0187012987012994*G0_0_1_4_5_5 + 0.00228896103896111*G0_0_1_5_0_0 + 0.00243506493506503*G0_0_1_5_0_1 + 0.00180194805194811*G0_0_1_5_0_2 - 0.00720779220779244*G0_0_1_5_0_3 - 0.00311688311688322*G0_0_1_5_0_4 - 0.0122727272727277*G0_0_1_5_0_5 + 0.00243506493506503*G0_0_1_5_1_0 - 0.0409090909090925*G0_0_1_5_1_1 + 0.000974025974026019*G0_0_1_5_1_2 - 0.00389610389610407*G0_0_1_5_1_3 + 0.000974025974026004*G0_0_1_5_1_4 - 0.00779220779220812*G0_0_1_5_1_5 + 0.00180194805194811*G0_0_1_5_2_0 + 0.000974025974026018*G0_0_1_5_2_1 + 0.00180194805194811*G0_0_1_5_2_2 - 0.00720779220779245*G0_0_1_5_2_3 - 0.00311688311688323*G0_0_1_5_2_4 - 0.0103246753246757*G0_0_1_5_2_5 - 0.00720779220779244*G0_0_1_5_3_0 - 0.00389610389610407*G0_0_1_5_3_1 - 0.00720779220779245*G0_0_1_5_3_2 + 0.0350649350649362*G0_0_1_5_3_3 + 0.0124675324675329*G0_0_1_5_3_4 + 0.0350649350649363*G0_0_1_5_3_5 - 0.00311688311688322*G0_0_1_5_4_0 + 0.000974025974026004*G0_0_1_5_4_1 - 0.00311688311688323*G0_0_1_5_4_2 + 0.0124675324675329*G0_0_1_5_4_3 + 0.00623376623376646*G0_0_1_5_4_4 + 0.0187012987012994*G0_0_1_5_4_5 - 0.0122727272727277*G0_0_1_5_5_0 - 0.00779220779220812*G0_0_1_5_5_1 - 0.0103246753246757*G0_0_1_5_5_2 + 0.0350649350649363*G0_0_1_5_5_3 + 0.0187012987012994*G0_0_1_5_5_4 + 0.105194805194809*G0_0_1_5_5_5; + A[29] = A[92] - 0.00172889610389617*G0_0_1_0_0_0 + 0.000186688311688318*G0_0_1_0_0_1 - 0.000616883116883137*G0_0_1_0_0_2 - 0.000454545454545469*G0_0_1_0_0_3 - 0.000194805194805199*G0_0_1_0_0_4 - 0.000941558441558477*G0_0_1_0_0_5 + 0.000186688311688318*G0_0_1_0_1_0 - 0.000186688311688316*G0_0_1_0_1_1 + 0.000454545454545468*G0_0_1_0_1_3 - 0.00045454545454547*G0_0_1_0_1_4 - 0.000616883116883137*G0_0_1_0_2_0 + 0.00219155844155851*G0_0_1_0_2_2 - 0.000909090909090934*G0_0_1_0_2_3 + 0.00220779220779228*G0_0_1_0_2_4 - 0.000194805194805201*G0_0_1_0_2_5 - 0.000454545454545468*G0_0_1_0_3_0 + 0.000454545454545468*G0_0_1_0_3_1 - 0.000909090909090934*G0_0_1_0_3_2 + 0.00207792207792215*G0_0_1_0_3_3 + 0.00181818181818188*G0_0_1_0_3_4 + 0.00129870129870134*G0_0_1_0_3_5 - 0.000194805194805199*G0_0_1_0_4_0 - 0.00045454545454547*G0_0_1_0_4_1 + 0.00220779220779228*G0_0_1_0_4_2 + 0.00181818181818188*G0_0_1_0_4_3 + 0.0124675324675329*G0_0_1_0_4_4 + 0.00129870129870134*G0_0_1_0_4_5 - 0.000941558441558477*G0_0_1_0_5_0 - 0.000194805194805201*G0_0_1_0_5_2 + 0.00129870129870134*G0_0_1_0_5_3 + 0.00129870129870134*G0_0_1_0_5_4 - 0.000389610389610403*G0_0_1_0_5_5 + 0.000186688311688318*G0_0_1_1_0_0 - 0.000186688311688316*G0_0_1_1_0_1 + 0.000454545454545468*G0_0_1_1_0_3 - 0.00045454545454547*G0_0_1_1_0_4 - 0.000186688311688316*G0_0_1_1_1_0 + 0.00172889610389614*G0_0_1_1_1_1 + 0.000616883116883139*G0_0_1_1_1_2 + 0.000194805194805194*G0_0_1_1_1_3 + 0.000454545454545469*G0_0_1_1_1_4 + 0.000941558441558469*G0_0_1_1_1_5 + 0.000616883116883139*G0_0_1_1_2_1 - 0.00219155844155852*G0_0_1_1_2_2 - 0.00220779220779228*G0_0_1_1_2_3 + 0.000909090909090939*G0_0_1_1_2_4 + 0.000194805194805202*G0_0_1_1_2_5 + 0.000454545454545468*G0_0_1_1_3_0 + 0.000194805194805194*G0_0_1_1_3_1 - 0.00220779220779228*G0_0_1_1_3_2 - 0.0124675324675329*G0_0_1_1_3_3 - 0.00181818181818188*G0_0_1_1_3_4 - 0.00129870129870135*G0_0_1_1_3_5 - 0.00045454545454547*G0_0_1_1_4_0 + 0.000454545454545469*G0_0_1_1_4_1 + 0.000909090909090939*G0_0_1_1_4_2 - 0.00181818181818188*G0_0_1_1_4_3 - 0.00207792207792215*G0_0_1_1_4_4 - 0.00129870129870134*G0_0_1_1_4_5 + 0.000941558441558469*G0_0_1_1_5_1 + 0.000194805194805202*G0_0_1_1_5_2 - 0.00129870129870135*G0_0_1_1_5_3 - 0.00129870129870134*G0_0_1_1_5_4 + 0.000389610389610397*G0_0_1_1_5_5 - 0.000616883116883137*G0_0_1_2_0_0 + 0.00219155844155851*G0_0_1_2_0_2 - 0.000909090909090934*G0_0_1_2_0_3 + 0.00220779220779228*G0_0_1_2_0_4 - 0.000194805194805201*G0_0_1_2_0_5 + 0.000616883116883139*G0_0_1_2_1_1 - 0.00219155844155852*G0_0_1_2_1_2 - 0.00220779220779228*G0_0_1_2_1_3 + 0.000909090909090939*G0_0_1_2_1_4 + 0.000194805194805202*G0_0_1_2_1_5 + 0.00219155844155851*G0_0_1_2_2_0 - 0.00219155844155852*G0_0_1_2_2_1 + 0.0100649350649354*G0_0_1_2_2_3 - 0.0100649350649354*G0_0_1_2_2_4 - 0.000909090909090934*G0_0_1_2_3_0 - 0.00220779220779228*G0_0_1_2_3_1 + 0.0100649350649354*G0_0_1_2_3_2 + 0.0233766233766242*G0_0_1_2_3_3 + 0.00181818181818188*G0_0_1_2_3_5 + 0.00220779220779228*G0_0_1_2_4_0 + 0.000909090909090939*G0_0_1_2_4_1 - 0.0100649350649354*G0_0_1_2_4_2 - 0.0233766233766241*G0_0_1_2_4_4 - 0.00181818181818188*G0_0_1_2_4_5 - 0.000194805194805201*G0_0_1_2_5_0 + 0.000194805194805202*G0_0_1_2_5_1 + 0.00181818181818188*G0_0_1_2_5_3 - 0.00181818181818188*G0_0_1_2_5_4 - 0.000454545454545469*G0_0_1_3_0_0 + 0.000454545454545468*G0_0_1_3_0_1 - 0.000909090909090934*G0_0_1_3_0_2 + 0.00207792207792215*G0_0_1_3_0_3 + 0.00181818181818188*G0_0_1_3_0_4 + 0.00129870129870134*G0_0_1_3_0_5 + 0.000454545454545468*G0_0_1_3_1_0 + 0.000194805194805194*G0_0_1_3_1_1 - 0.00220779220779228*G0_0_1_3_1_2 - 0.0124675324675329*G0_0_1_3_1_3 - 0.00181818181818188*G0_0_1_3_1_4 - 0.00129870129870135*G0_0_1_3_1_5 - 0.000909090909090934*G0_0_1_3_2_0 - 0.00220779220779228*G0_0_1_3_2_1 + 0.0100649350649354*G0_0_1_3_2_2 + 0.0233766233766242*G0_0_1_3_2_3 + 0.00181818181818188*G0_0_1_3_2_5 + 0.00207792207792215*G0_0_1_3_3_0 - 0.0124675324675329*G0_0_1_3_3_1 + 0.0233766233766242*G0_0_1_3_3_2 - 0.00467532467532478*G0_0_1_3_3_3 - 0.000519480519480531*G0_0_1_3_3_4 - 0.00779220779220804*G0_0_1_3_3_5 + 0.00181818181818188*G0_0_1_3_4_0 - 0.00181818181818188*G0_0_1_3_4_1 - 0.00051948051948053*G0_0_1_3_4_3 + 0.000519480519480537*G0_0_1_3_4_4 + 0.00129870129870134*G0_0_1_3_5_0 - 0.00129870129870135*G0_0_1_3_5_1 + 0.00181818181818188*G0_0_1_3_5_2 - 0.00779220779220805*G0_0_1_3_5_3 - 0.00259740259740269*G0_0_1_3_5_5 - 0.000194805194805199*G0_0_1_4_0_0 - 0.00045454545454547*G0_0_1_4_0_1 + 0.00220779220779228*G0_0_1_4_0_2 + 0.00181818181818188*G0_0_1_4_0_3 + 0.0124675324675329*G0_0_1_4_0_4 + 0.00129870129870134*G0_0_1_4_0_5 - 0.00045454545454547*G0_0_1_4_1_0 + 0.000454545454545469*G0_0_1_4_1_1 + 0.000909090909090939*G0_0_1_4_1_2 - 0.00181818181818188*G0_0_1_4_1_3 - 0.00207792207792215*G0_0_1_4_1_4 - 0.00129870129870134*G0_0_1_4_1_5 + 0.00220779220779228*G0_0_1_4_2_0 + 0.000909090909090939*G0_0_1_4_2_1 - 0.0100649350649354*G0_0_1_4_2_2 - 0.0233766233766241*G0_0_1_4_2_4 - 0.00181818181818188*G0_0_1_4_2_5 + 0.00181818181818188*G0_0_1_4_3_0 - 0.00181818181818188*G0_0_1_4_3_1 - 0.000519480519480531*G0_0_1_4_3_3 + 0.000519480519480536*G0_0_1_4_3_4 + 0.0124675324675329*G0_0_1_4_4_0 - 0.00207792207792215*G0_0_1_4_4_1 - 0.0233766233766241*G0_0_1_4_4_2 + 0.000519480519480536*G0_0_1_4_4_3 + 0.00467532467532484*G0_0_1_4_4_4 + 0.00779220779220805*G0_0_1_4_4_5 + 0.00129870129870134*G0_0_1_4_5_0 - 0.00129870129870134*G0_0_1_4_5_1 - 0.00181818181818188*G0_0_1_4_5_2 + 0.00779220779220805*G0_0_1_4_5_4 + 0.00259740259740268*G0_0_1_4_5_5 - 0.000941558441558477*G0_0_1_5_0_0 - 0.000194805194805201*G0_0_1_5_0_2 + 0.00129870129870134*G0_0_1_5_0_3 + 0.00129870129870134*G0_0_1_5_0_4 - 0.000389610389610403*G0_0_1_5_0_5 + 0.000941558441558469*G0_0_1_5_1_1 + 0.000194805194805202*G0_0_1_5_1_2 - 0.00129870129870135*G0_0_1_5_1_3 - 0.00129870129870134*G0_0_1_5_1_4 + 0.000389610389610397*G0_0_1_5_1_5 - 0.000194805194805201*G0_0_1_5_2_0 + 0.000194805194805202*G0_0_1_5_2_1 + 0.00181818181818188*G0_0_1_5_2_3 - 0.00181818181818188*G0_0_1_5_2_4 + 0.00129870129870134*G0_0_1_5_3_0 - 0.00129870129870135*G0_0_1_5_3_1 + 0.00181818181818188*G0_0_1_5_3_2 - 0.00779220779220805*G0_0_1_5_3_3 - 0.00259740259740269*G0_0_1_5_3_5 + 0.00129870129870134*G0_0_1_5_4_0 - 0.00129870129870134*G0_0_1_5_4_1 - 0.00181818181818188*G0_0_1_5_4_2 + 0.00779220779220805*G0_0_1_5_4_4 + 0.00259740259740268*G0_0_1_5_4_5 - 0.000389610389610402*G0_0_1_5_5_0 + 0.000389610389610397*G0_0_1_5_5_1 - 0.00259740259740269*G0_0_1_5_5_3 + 0.00259740259740268*G0_0_1_5_5_4 + 0.00172889610389617*G0_1_0_0_0_0 - 0.000186688311688318*G0_1_0_0_0_1 + 0.000616883116883137*G0_1_0_0_0_2 + 0.000454545454545468*G0_1_0_0_0_3 + 0.000194805194805199*G0_1_0_0_0_4 + 0.000941558441558477*G0_1_0_0_0_5 - 0.000186688311688318*G0_1_0_0_1_0 + 0.000186688311688316*G0_1_0_0_1_1 - 0.000454545454545468*G0_1_0_0_1_3 + 0.00045454545454547*G0_1_0_0_1_4 + 0.000616883116883137*G0_1_0_0_2_0 - 0.00219155844155851*G0_1_0_0_2_2 + 0.000909090909090934*G0_1_0_0_2_3 - 0.00220779220779228*G0_1_0_0_2_4 + 0.000194805194805201*G0_1_0_0_2_5 + 0.000454545454545468*G0_1_0_0_3_0 - 0.000454545454545468*G0_1_0_0_3_1 + 0.000909090909090934*G0_1_0_0_3_2 - 0.00207792207792215*G0_1_0_0_3_3 - 0.00181818181818188*G0_1_0_0_3_4 - 0.00129870129870134*G0_1_0_0_3_5 + 0.000194805194805199*G0_1_0_0_4_0 + 0.00045454545454547*G0_1_0_0_4_1 - 0.00220779220779228*G0_1_0_0_4_2 - 0.00181818181818188*G0_1_0_0_4_3 - 0.0124675324675329*G0_1_0_0_4_4 - 0.00129870129870134*G0_1_0_0_4_5 + 0.000941558441558477*G0_1_0_0_5_0 + 0.000194805194805201*G0_1_0_0_5_2 - 0.00129870129870134*G0_1_0_0_5_3 - 0.00129870129870134*G0_1_0_0_5_4 + 0.000389610389610403*G0_1_0_0_5_5 - 0.000186688311688318*G0_1_0_1_0_0 + 0.000186688311688316*G0_1_0_1_0_1 - 0.000454545454545468*G0_1_0_1_0_3 + 0.00045454545454547*G0_1_0_1_0_4 + 0.000186688311688316*G0_1_0_1_1_0 - 0.00172889610389614*G0_1_0_1_1_1 - 0.000616883116883139*G0_1_0_1_1_2 - 0.000194805194805194*G0_1_0_1_1_3 - 0.000454545454545469*G0_1_0_1_1_4 - 0.000941558441558469*G0_1_0_1_1_5 - 0.000616883116883139*G0_1_0_1_2_1 + 0.00219155844155852*G0_1_0_1_2_2 + 0.00220779220779228*G0_1_0_1_2_3 - 0.000909090909090939*G0_1_0_1_2_4 - 0.000194805194805202*G0_1_0_1_2_5 - 0.000454545454545468*G0_1_0_1_3_0 - 0.000194805194805194*G0_1_0_1_3_1 + 0.00220779220779228*G0_1_0_1_3_2 + 0.0124675324675329*G0_1_0_1_3_3 + 0.00181818181818188*G0_1_0_1_3_4 + 0.00129870129870135*G0_1_0_1_3_5 + 0.00045454545454547*G0_1_0_1_4_0 - 0.000454545454545469*G0_1_0_1_4_1 - 0.000909090909090939*G0_1_0_1_4_2 + 0.00181818181818188*G0_1_0_1_4_3 + 0.00207792207792215*G0_1_0_1_4_4 + 0.00129870129870134*G0_1_0_1_4_5 - 0.000941558441558469*G0_1_0_1_5_1 - 0.000194805194805202*G0_1_0_1_5_2 + 0.00129870129870135*G0_1_0_1_5_3 + 0.00129870129870134*G0_1_0_1_5_4 - 0.000389610389610397*G0_1_0_1_5_5 + 0.000616883116883137*G0_1_0_2_0_0 - 0.00219155844155851*G0_1_0_2_0_2 + 0.000909090909090934*G0_1_0_2_0_3 - 0.00220779220779228*G0_1_0_2_0_4 + 0.000194805194805201*G0_1_0_2_0_5 - 0.000616883116883139*G0_1_0_2_1_1 + 0.00219155844155852*G0_1_0_2_1_2 + 0.00220779220779228*G0_1_0_2_1_3 - 0.000909090909090939*G0_1_0_2_1_4 - 0.000194805194805202*G0_1_0_2_1_5 - 0.00219155844155851*G0_1_0_2_2_0 + 0.00219155844155852*G0_1_0_2_2_1 - 0.0100649350649354*G0_1_0_2_2_3 + 0.0100649350649354*G0_1_0_2_2_4 + 0.000909090909090934*G0_1_0_2_3_0 + 0.00220779220779228*G0_1_0_2_3_1 - 0.0100649350649354*G0_1_0_2_3_2 - 0.0233766233766242*G0_1_0_2_3_3 - 0.00181818181818188*G0_1_0_2_3_5 - 0.00220779220779228*G0_1_0_2_4_0 - 0.000909090909090939*G0_1_0_2_4_1 + 0.0100649350649354*G0_1_0_2_4_2 + 0.0233766233766241*G0_1_0_2_4_4 + 0.00181818181818188*G0_1_0_2_4_5 + 0.000194805194805201*G0_1_0_2_5_0 - 0.000194805194805202*G0_1_0_2_5_1 - 0.00181818181818188*G0_1_0_2_5_3 + 0.00181818181818188*G0_1_0_2_5_4 + 0.000454545454545468*G0_1_0_3_0_0 - 0.000454545454545468*G0_1_0_3_0_1 + 0.000909090909090934*G0_1_0_3_0_2 - 0.00207792207792215*G0_1_0_3_0_3 - 0.00181818181818188*G0_1_0_3_0_4 - 0.00129870129870134*G0_1_0_3_0_5 - 0.000454545454545468*G0_1_0_3_1_0 - 0.000194805194805194*G0_1_0_3_1_1 + 0.00220779220779228*G0_1_0_3_1_2 + 0.0124675324675329*G0_1_0_3_1_3 + 0.00181818181818188*G0_1_0_3_1_4 + 0.00129870129870135*G0_1_0_3_1_5 + 0.000909090909090934*G0_1_0_3_2_0 + 0.00220779220779228*G0_1_0_3_2_1 - 0.0100649350649354*G0_1_0_3_2_2 - 0.0233766233766242*G0_1_0_3_2_3 - 0.00181818181818188*G0_1_0_3_2_5 - 0.00207792207792215*G0_1_0_3_3_0 + 0.0124675324675329*G0_1_0_3_3_1 - 0.0233766233766242*G0_1_0_3_3_2 + 0.00467532467532478*G0_1_0_3_3_3 + 0.000519480519480531*G0_1_0_3_3_4 + 0.00779220779220804*G0_1_0_3_3_5 - 0.00181818181818188*G0_1_0_3_4_0 + 0.00181818181818188*G0_1_0_3_4_1 + 0.00051948051948053*G0_1_0_3_4_3 - 0.000519480519480537*G0_1_0_3_4_4 - 0.00129870129870134*G0_1_0_3_5_0 + 0.00129870129870135*G0_1_0_3_5_1 - 0.00181818181818188*G0_1_0_3_5_2 + 0.00779220779220805*G0_1_0_3_5_3 + 0.00259740259740269*G0_1_0_3_5_5 + 0.000194805194805199*G0_1_0_4_0_0 + 0.00045454545454547*G0_1_0_4_0_1 - 0.00220779220779228*G0_1_0_4_0_2 - 0.00181818181818188*G0_1_0_4_0_3 - 0.0124675324675329*G0_1_0_4_0_4 - 0.00129870129870134*G0_1_0_4_0_5 + 0.00045454545454547*G0_1_0_4_1_0 - 0.000454545454545469*G0_1_0_4_1_1 - 0.000909090909090939*G0_1_0_4_1_2 + 0.00181818181818188*G0_1_0_4_1_3 + 0.00207792207792215*G0_1_0_4_1_4 + 0.00129870129870134*G0_1_0_4_1_5 - 0.00220779220779228*G0_1_0_4_2_0 - 0.000909090909090939*G0_1_0_4_2_1 + 0.0100649350649354*G0_1_0_4_2_2 + 0.0233766233766241*G0_1_0_4_2_4 + 0.00181818181818188*G0_1_0_4_2_5 - 0.00181818181818188*G0_1_0_4_3_0 + 0.00181818181818188*G0_1_0_4_3_1 + 0.000519480519480531*G0_1_0_4_3_3 - 0.000519480519480536*G0_1_0_4_3_4 - 0.0124675324675329*G0_1_0_4_4_0 + 0.00207792207792215*G0_1_0_4_4_1 + 0.0233766233766241*G0_1_0_4_4_2 - 0.000519480519480536*G0_1_0_4_4_3 - 0.00467532467532484*G0_1_0_4_4_4 - 0.00779220779220805*G0_1_0_4_4_5 - 0.00129870129870134*G0_1_0_4_5_0 + 0.00129870129870134*G0_1_0_4_5_1 + 0.00181818181818188*G0_1_0_4_5_2 - 0.00779220779220805*G0_1_0_4_5_4 - 0.00259740259740268*G0_1_0_4_5_5 + 0.000941558441558477*G0_1_0_5_0_0 + 0.000194805194805201*G0_1_0_5_0_2 - 0.00129870129870134*G0_1_0_5_0_3 - 0.00129870129870134*G0_1_0_5_0_4 + 0.000389610389610403*G0_1_0_5_0_5 - 0.000941558441558469*G0_1_0_5_1_1 - 0.000194805194805202*G0_1_0_5_1_2 + 0.00129870129870135*G0_1_0_5_1_3 + 0.00129870129870134*G0_1_0_5_1_4 - 0.000389610389610397*G0_1_0_5_1_5 + 0.000194805194805201*G0_1_0_5_2_0 - 0.000194805194805202*G0_1_0_5_2_1 - 0.00181818181818188*G0_1_0_5_2_3 + 0.00181818181818188*G0_1_0_5_2_4 - 0.00129870129870134*G0_1_0_5_3_0 + 0.00129870129870135*G0_1_0_5_3_1 - 0.00181818181818188*G0_1_0_5_3_2 + 0.00779220779220804*G0_1_0_5_3_3 + 0.00259740259740269*G0_1_0_5_3_5 - 0.00129870129870134*G0_1_0_5_4_0 + 0.00129870129870134*G0_1_0_5_4_1 + 0.00181818181818188*G0_1_0_5_4_2 - 0.00779220779220805*G0_1_0_5_4_4 - 0.00259740259740268*G0_1_0_5_4_5 + 0.000389610389610403*G0_1_0_5_5_0 - 0.000389610389610398*G0_1_0_5_5_1 + 0.00259740259740269*G0_1_0_5_5_3 - 0.00259740259740268*G0_1_0_5_5_4; + A[81] = -A[31] - 0.0129626623376628*G0_0_0_0_0_0 + 0.000357142857142868*G0_0_0_0_0_1 + 0.00112283549783553*G0_0_0_0_0_2 - 0.00100108225108228*G0_0_0_0_0_3 - 0.00739718614718639*G0_0_0_0_0_4 - 0.00315476190476201*G0_0_0_0_0_5 + 0.000357142857142867*G0_0_0_0_1_0 + 0.00557359307359326*G0_0_0_0_1_1 - 0.000359848484848497*G0_0_0_0_1_2 + 0.000216450216450228*G0_0_0_0_1_3 - 0.000146103896103899*G0_0_0_0_1_4 + 0.00194805194805202*G0_0_0_0_1_5 + 0.00112283549783553*G0_0_0_0_2_0 - 0.000359848484848497*G0_0_0_0_2_1 + 0.00112283549783554*G0_0_0_0_2_2 + 0.00022186147186148*G0_0_0_0_2_3 + 0.00275974025974035*G0_0_0_0_2_4 + 0.000221861471861482*G0_0_0_0_2_5 - 0.00100108225108228*G0_0_0_0_3_0 + 0.000216450216450228*G0_0_0_0_3_1 + 0.000221861471861481*G0_0_0_0_3_2 + 0.00385281385281396*G0_0_0_0_3_3 + 0.00229437229437236*G0_0_0_0_3_4 + 0.0015584415584416*G0_0_0_0_3_5 - 0.00739718614718639*G0_0_0_0_4_0 - 0.000146103896103899*G0_0_0_0_4_1 + 0.00275974025974035*G0_0_0_0_4_2 + 0.00229437229437236*G0_0_0_0_4_3 - 0.00307359307359318*G0_0_0_0_4_4 - 0.000151515151515165*G0_0_0_0_4_5 - 0.00315476190476201*G0_0_0_0_5_0 + 0.00194805194805202*G0_0_0_0_5_1 + 0.000221861471861482*G0_0_0_0_5_2 + 0.0015584415584416*G0_0_0_0_5_3 - 0.000151515151515165*G0_0_0_0_5_4 - 0.0022077922077923*G0_0_0_0_5_5 + 0.000357142857142867*G0_0_0_1_0_0 + 0.00557359307359326*G0_0_0_1_0_1 - 0.000359848484848497*G0_0_0_1_0_2 + 0.000216450216450228*G0_0_0_1_0_3 - 0.000146103896103899*G0_0_0_1_0_4 + 0.00194805194805202*G0_0_0_1_0_5 + 0.00557359307359326*G0_0_0_1_1_0 - 0.114042207792212*G0_0_0_1_1_1 + 0.00557359307359327*G0_0_0_1_1_2 - 0.0240259740259748*G0_0_0_1_1_3 - 0.00173160173160178*G0_0_0_1_1_4 - 0.0240259740259749*G0_0_0_1_1_5 - 0.000359848484848497*G0_0_0_1_2_0 + 0.00557359307359327*G0_0_0_1_2_1 + 0.00035714285714287*G0_0_0_1_2_2 + 0.00194805194805201*G0_0_0_1_2_3 - 0.000146103896103901*G0_0_0_1_2_4 + 0.000216450216450231*G0_0_0_1_2_5 + 0.000216450216450228*G0_0_0_1_3_0 - 0.0240259740259748*G0_0_0_1_3_1 + 0.00194805194805201*G0_0_0_1_3_2 - 0.00173160173160179*G0_0_0_1_3_3 + 0.00303030303030313*G0_0_0_1_3_4 - 0.000865800865800922*G0_0_0_1_3_5 - 0.000146103896103899*G0_0_0_1_4_0 - 0.00173160173160178*G0_0_0_1_4_1 - 0.000146103896103901*G0_0_0_1_4_2 + 0.00303030303030313*G0_0_0_1_4_3 + 0.00489177489177505*G0_0_0_1_4_4 + 0.00303030303030313*G0_0_0_1_4_5 + 0.00194805194805202*G0_0_0_1_5_0 - 0.0240259740259749*G0_0_0_1_5_1 + 0.000216450216450231*G0_0_0_1_5_2 - 0.00086580086580092*G0_0_0_1_5_3 + 0.00303030303030313*G0_0_0_1_5_4 - 0.00173160173160183*G0_0_0_1_5_5 + 0.00112283549783553*G0_0_0_2_0_0 - 0.000359848484848497*G0_0_0_2_0_1 + 0.00112283549783554*G0_0_0_2_0_2 + 0.000221861471861481*G0_0_0_2_0_3 + 0.00275974025974035*G0_0_0_2_0_4 + 0.000221861471861482*G0_0_0_2_0_5 - 0.000359848484848497*G0_0_0_2_1_0 + 0.00557359307359327*G0_0_0_2_1_1 + 0.00035714285714287*G0_0_0_2_1_2 + 0.00194805194805201*G0_0_0_2_1_3 - 0.000146103896103901*G0_0_0_2_1_4 + 0.000216450216450231*G0_0_0_2_1_5 + 0.00112283549783554*G0_0_0_2_2_0 + 0.00035714285714287*G0_0_0_2_2_1 - 0.0129626623376628*G0_0_0_2_2_2 - 0.00315476190476202*G0_0_0_2_2_3 - 0.00739718614718641*G0_0_0_2_2_4 - 0.00100108225108229*G0_0_0_2_2_5 + 0.000221861471861481*G0_0_0_2_3_0 + 0.00194805194805201*G0_0_0_2_3_1 - 0.00315476190476202*G0_0_0_2_3_2 - 0.0022077922077923*G0_0_0_2_3_3 - 0.000151515151515164*G0_0_0_2_3_4 + 0.00155844155844161*G0_0_0_2_3_5 + 0.00275974025974035*G0_0_0_2_4_0 - 0.000146103896103901*G0_0_0_2_4_1 - 0.00739718614718641*G0_0_0_2_4_2 - 0.000151515151515164*G0_0_0_2_4_3 - 0.00307359307359319*G0_0_0_2_4_4 + 0.00229437229437237*G0_0_0_2_4_5 + 0.000221861471861482*G0_0_0_2_5_0 + 0.000216450216450231*G0_0_0_2_5_1 - 0.00100108225108229*G0_0_0_2_5_2 + 0.00155844155844161*G0_0_0_2_5_3 + 0.00229437229437237*G0_0_0_2_5_4 + 0.00385281385281398*G0_0_0_2_5_5 - 0.00100108225108228*G0_0_0_3_0_0 + 0.000216450216450227*G0_0_0_3_0_1 + 0.00022186147186148*G0_0_0_3_0_2 + 0.00385281385281396*G0_0_0_3_0_3 + 0.00229437229437236*G0_0_0_3_0_4 + 0.0015584415584416*G0_0_0_3_0_5 + 0.000216450216450228*G0_0_0_3_1_0 - 0.0240259740259748*G0_0_0_3_1_1 + 0.00194805194805201*G0_0_0_3_1_2 - 0.00173160173160179*G0_0_0_3_1_3 + 0.00303030303030313*G0_0_0_3_1_4 - 0.00086580086580092*G0_0_0_3_1_5 + 0.000221861471861481*G0_0_0_3_2_0 + 0.00194805194805201*G0_0_0_3_2_1 - 0.00315476190476202*G0_0_0_3_2_2 - 0.0022077922077923*G0_0_0_3_2_3 - 0.000151515151515164*G0_0_0_3_2_4 + 0.00155844155844161*G0_0_0_3_2_5 + 0.00385281385281396*G0_0_0_3_3_0 - 0.00173160173160179*G0_0_0_3_3_1 - 0.0022077922077923*G0_0_0_3_3_2 - 0.0324675324675335*G0_0_0_3_3_3 - 0.0137662337662342*G0_0_0_3_3_4 - 0.0108225108225112*G0_0_0_3_3_5 + 0.00229437229437236*G0_0_0_3_4_0 + 0.00303030303030313*G0_0_0_3_4_1 - 0.000151515151515164*G0_0_0_3_4_2 - 0.0137662337662342*G0_0_0_3_4_3 - 0.0143722943722948*G0_0_0_3_4_4 - 0.00917748917748947*G0_0_0_3_4_5 + 0.0015584415584416*G0_0_0_3_5_0 - 0.00086580086580092*G0_0_0_3_5_1 + 0.00155844155844161*G0_0_0_3_5_2 - 0.0108225108225112*G0_0_0_3_5_3 - 0.00917748917748947*G0_0_0_3_5_4 - 0.0108225108225112*G0_0_0_3_5_5 - 0.00739718614718639*G0_0_0_4_0_0 - 0.000146103896103899*G0_0_0_4_0_1 + 0.00275974025974035*G0_0_0_4_0_2 + 0.00229437229437236*G0_0_0_4_0_3 - 0.00307359307359319*G0_0_0_4_0_4 - 0.000151515151515165*G0_0_0_4_0_5 - 0.000146103896103899*G0_0_0_4_1_0 - 0.00173160173160178*G0_0_0_4_1_1 - 0.000146103896103901*G0_0_0_4_1_2 + 0.00303030303030313*G0_0_0_4_1_3 + 0.00489177489177505*G0_0_0_4_1_4 + 0.00303030303030313*G0_0_0_4_1_5 + 0.00275974025974035*G0_0_0_4_2_0 - 0.000146103896103901*G0_0_0_4_2_1 - 0.00739718614718641*G0_0_0_4_2_2 - 0.000151515151515164*G0_0_0_4_2_3 - 0.00307359307359319*G0_0_0_4_2_4 + 0.00229437229437237*G0_0_0_4_2_5 + 0.00229437229437236*G0_0_0_4_3_0 + 0.00303030303030313*G0_0_0_4_3_1 - 0.000151515151515164*G0_0_0_4_3_2 - 0.0137662337662342*G0_0_0_4_3_3 - 0.0143722943722948*G0_0_0_4_3_4 - 0.00917748917748947*G0_0_0_4_3_5 - 0.00307359307359319*G0_0_0_4_4_0 + 0.00489177489177505*G0_0_0_4_4_1 - 0.0030735930735932*G0_0_0_4_4_2 - 0.0143722943722948*G0_0_0_4_4_3 - 0.0800000000000026*G0_0_0_4_4_4 - 0.0143722943722948*G0_0_0_4_4_5 - 0.000151515151515165*G0_0_0_4_5_0 + 0.00303030303030313*G0_0_0_4_5_1 + 0.00229437229437237*G0_0_0_4_5_2 - 0.00917748917748947*G0_0_0_4_5_3 - 0.0143722943722948*G0_0_0_4_5_4 - 0.0137662337662342*G0_0_0_4_5_5 - 0.00315476190476201*G0_0_0_5_0_0 + 0.00194805194805202*G0_0_0_5_0_1 + 0.000221861471861482*G0_0_0_5_0_2 + 0.0015584415584416*G0_0_0_5_0_3 - 0.000151515151515165*G0_0_0_5_0_4 - 0.0022077922077923*G0_0_0_5_0_5 + 0.00194805194805202*G0_0_0_5_1_0 - 0.0240259740259749*G0_0_0_5_1_1 + 0.000216450216450231*G0_0_0_5_1_2 - 0.00086580086580092*G0_0_0_5_1_3 + 0.00303030303030313*G0_0_0_5_1_4 - 0.00173160173160183*G0_0_0_5_1_5 + 0.000221861471861482*G0_0_0_5_2_0 + 0.000216450216450231*G0_0_0_5_2_1 - 0.00100108225108229*G0_0_0_5_2_2 + 0.00155844155844161*G0_0_0_5_2_3 + 0.00229437229437237*G0_0_0_5_2_4 + 0.00385281385281398*G0_0_0_5_2_5 + 0.0015584415584416*G0_0_0_5_3_0 - 0.00086580086580092*G0_0_0_5_3_1 + 0.00155844155844161*G0_0_0_5_3_2 - 0.0108225108225112*G0_0_0_5_3_3 - 0.00917748917748947*G0_0_0_5_3_4 - 0.0108225108225112*G0_0_0_5_3_5 - 0.000151515151515165*G0_0_0_5_4_0 + 0.00303030303030313*G0_0_0_5_4_1 + 0.00229437229437237*G0_0_0_5_4_2 - 0.00917748917748947*G0_0_0_5_4_3 - 0.0143722943722948*G0_0_0_5_4_4 - 0.0137662337662342*G0_0_0_5_4_5 - 0.0022077922077923*G0_0_0_5_5_0 - 0.00173160173160183*G0_0_0_5_5_1 + 0.00385281385281398*G0_0_0_5_5_2 - 0.0108225108225112*G0_0_0_5_5_3 - 0.0137662337662342*G0_0_0_5_5_4 - 0.0324675324675336*G0_0_0_5_5_5; + A[7] = A[81] - 0.128193993506498*G0_0_0_0_0_0 + 0.00780167748917775*G0_0_0_0_0_1 + 0.00809523809523837*G0_0_0_0_0_2 - 0.00157467532467536*G0_0_0_0_0_3 - 0.0346482683982696*G0_0_0_0_0_4 - 0.0290692640692651*G0_0_0_0_0_5 + 0.00780167748917775*G0_0_0_0_1_0 - 0.00780167748917775*G0_0_0_0_1_1 - 0.00214826839826847*G0_0_0_0_1_3 + 0.00214826839826847*G0_0_0_0_1_4 + 0.00809523809523837*G0_0_0_0_2_0 - 0.00120400432900437*G0_0_0_0_2_2 + 0.000573593073593092*G0_0_0_0_2_3 + 0.00441558441558456*G0_0_0_0_2_4 + 0.00213744588744596*G0_0_0_0_2_5 - 0.00157467532467536*G0_0_0_0_3_0 - 0.00214826839826847*G0_0_0_0_3_1 + 0.000573593073593092*G0_0_0_0_3_2 - 0.00136363636363641*G0_0_0_0_3_3 - 0.00114718614718618*G0_0_0_0_3_4 - 0.00112554112554116*G0_0_0_0_3_5 - 0.0346482683982696*G0_0_0_0_4_0 + 0.00214826839826847*G0_0_0_0_4_1 + 0.00441558441558456*G0_0_0_0_4_2 - 0.00114718614718618*G0_0_0_0_4_3 - 0.0218398268398276*G0_0_0_0_4_4 - 0.00857142857142886*G0_0_0_0_4_5 - 0.0290692640692651*G0_0_0_0_5_0 + 0.00213744588744596*G0_0_0_0_5_2 - 0.00112554112554116*G0_0_0_0_5_3 - 0.00857142857142886*G0_0_0_0_5_4 - 0.00926406926406957*G0_0_0_0_5_5 + 0.00780167748917775*G0_0_0_1_0_0 - 0.00780167748917775*G0_0_0_1_0_1 - 0.00214826839826847*G0_0_0_1_0_3 + 0.00214826839826847*G0_0_0_1_0_4 - 0.00780167748917775*G0_0_0_1_1_0 + 0.128193993506498*G0_0_0_1_1_1 - 0.00809523809523838*G0_0_0_1_1_2 + 0.0346482683982696*G0_0_0_1_1_3 + 0.00157467532467537*G0_0_0_1_1_4 + 0.0290692640692652*G0_0_0_1_1_5 - 0.00809523809523838*G0_0_0_1_2_1 + 0.00120400432900437*G0_0_0_1_2_2 - 0.00441558441558457*G0_0_0_1_2_3 - 0.000573593073593093*G0_0_0_1_2_4 - 0.00213744588744597*G0_0_0_1_2_5 - 0.00214826839826847*G0_0_0_1_3_0 + 0.0346482683982696*G0_0_0_1_3_1 - 0.00441558441558457*G0_0_0_1_3_2 + 0.0218398268398276*G0_0_0_1_3_3 + 0.00114718614718619*G0_0_0_1_3_4 + 0.0085714285714289*G0_0_0_1_3_5 + 0.00214826839826847*G0_0_0_1_4_0 + 0.00157467532467537*G0_0_0_1_4_1 - 0.000573593073593093*G0_0_0_1_4_2 + 0.00114718614718619*G0_0_0_1_4_3 + 0.00136363636363641*G0_0_0_1_4_4 + 0.00112554112554116*G0_0_0_1_4_5 + 0.0290692640692652*G0_0_0_1_5_1 - 0.00213744588744597*G0_0_0_1_5_2 + 0.0085714285714289*G0_0_0_1_5_3 + 0.00112554112554116*G0_0_0_1_5_4 + 0.00926406926406961*G0_0_0_1_5_5 + 0.00809523809523837*G0_0_0_2_0_0 - 0.00120400432900437*G0_0_0_2_0_2 + 0.000573593073593092*G0_0_0_2_0_3 + 0.00441558441558456*G0_0_0_2_0_4 + 0.00213744588744596*G0_0_0_2_0_5 - 0.00809523809523838*G0_0_0_2_1_1 + 0.00120400432900437*G0_0_0_2_1_2 - 0.00441558441558457*G0_0_0_2_1_3 - 0.000573593073593093*G0_0_0_2_1_4 - 0.00213744588744597*G0_0_0_2_1_5 - 0.00120400432900437*G0_0_0_2_2_0 + 0.00120400432900437*G0_0_0_2_2_1 + 0.000173160173160182*G0_0_0_2_2_3 - 0.000173160173160173*G0_0_0_2_2_4 + 0.000573593073593092*G0_0_0_2_3_0 - 0.00441558441558457*G0_0_0_2_3_1 + 0.000173160173160182*G0_0_0_2_3_2 - 0.00554112554112574*G0_0_0_2_3_3 - 0.00114718614718619*G0_0_0_2_3_5 + 0.00441558441558456*G0_0_0_2_4_0 - 0.000573593073593093*G0_0_0_2_4_1 - 0.000173160173160173*G0_0_0_2_4_2 + 0.00554112554112573*G0_0_0_2_4_4 + 0.00114718614718619*G0_0_0_2_4_5 + 0.00213744588744596*G0_0_0_2_5_0 - 0.00213744588744597*G0_0_0_2_5_1 - 0.00114718614718619*G0_0_0_2_5_3 + 0.00114718614718619*G0_0_0_2_5_4 - 0.00157467532467536*G0_0_0_3_0_0 - 0.00214826839826847*G0_0_0_3_0_1 + 0.000573593073593092*G0_0_0_3_0_2 - 0.00136363636363641*G0_0_0_3_0_3 - 0.00114718614718618*G0_0_0_3_0_4 - 0.00112554112554116*G0_0_0_3_0_5 - 0.00214826839826847*G0_0_0_3_1_0 + 0.0346482683982696*G0_0_0_3_1_1 - 0.00441558441558457*G0_0_0_3_1_2 + 0.0218398268398276*G0_0_0_3_1_3 + 0.00114718614718619*G0_0_0_3_1_4 + 0.0085714285714289*G0_0_0_3_1_5 + 0.000573593073593092*G0_0_0_3_2_0 - 0.00441558441558457*G0_0_0_3_2_1 + 0.000173160173160182*G0_0_0_3_2_2 - 0.00554112554112574*G0_0_0_3_2_3 - 0.00114718614718619*G0_0_0_3_2_5 - 0.00136363636363641*G0_0_0_3_3_0 + 0.0218398268398276*G0_0_0_3_3_1 - 0.00554112554112574*G0_0_0_3_3_2 + 0.00389610389610406*G0_0_0_3_3_3 + 0.000432900432900445*G0_0_0_3_3_4 + 0.00502164502164522*G0_0_0_3_3_5 - 0.00114718614718618*G0_0_0_3_4_0 + 0.00114718614718619*G0_0_0_3_4_1 + 0.000432900432900445*G0_0_0_3_4_3 - 0.000432900432900447*G0_0_0_3_4_4 - 0.00112554112554116*G0_0_0_3_5_0 + 0.0085714285714289*G0_0_0_3_5_1 - 0.00114718614718619*G0_0_0_3_5_2 + 0.00502164502164522*G0_0_0_3_5_3 + 0.00225108225108234*G0_0_0_3_5_5 - 0.0346482683982696*G0_0_0_4_0_0 + 0.00214826839826847*G0_0_0_4_0_1 + 0.00441558441558456*G0_0_0_4_0_2 - 0.00114718614718618*G0_0_0_4_0_3 - 0.0218398268398276*G0_0_0_4_0_4 - 0.00857142857142886*G0_0_0_4_0_5 + 0.00214826839826847*G0_0_0_4_1_0 + 0.00157467532467537*G0_0_0_4_1_1 - 0.000573593073593093*G0_0_0_4_1_2 + 0.00114718614718619*G0_0_0_4_1_3 + 0.00136363636363641*G0_0_0_4_1_4 + 0.00112554112554116*G0_0_0_4_1_5 + 0.00441558441558456*G0_0_0_4_2_0 - 0.000573593073593093*G0_0_0_4_2_1 - 0.000173160173160173*G0_0_0_4_2_2 + 0.00554112554112573*G0_0_0_4_2_4 + 0.00114718614718619*G0_0_0_4_2_5 - 0.00114718614718618*G0_0_0_4_3_0 + 0.00114718614718619*G0_0_0_4_3_1 + 0.000432900432900445*G0_0_0_4_3_3 - 0.000432900432900444*G0_0_0_4_3_4 - 0.0218398268398276*G0_0_0_4_4_0 + 0.00136363636363641*G0_0_0_4_4_1 + 0.00554112554112573*G0_0_0_4_4_2 - 0.000432900432900446*G0_0_0_4_4_3 - 0.00389610389610403*G0_0_0_4_4_4 - 0.00502164502164519*G0_0_0_4_4_5 - 0.00857142857142886*G0_0_0_4_5_0 + 0.00112554112554116*G0_0_0_4_5_1 + 0.00114718614718619*G0_0_0_4_5_2 - 0.00502164502164519*G0_0_0_4_5_4 - 0.00225108225108232*G0_0_0_4_5_5 - 0.0290692640692651*G0_0_0_5_0_0 + 0.00213744588744596*G0_0_0_5_0_2 - 0.00112554112554116*G0_0_0_5_0_3 - 0.00857142857142886*G0_0_0_5_0_4 - 0.00926406926406957*G0_0_0_5_0_5 + 0.0290692640692652*G0_0_0_5_1_1 - 0.00213744588744597*G0_0_0_5_1_2 + 0.0085714285714289*G0_0_0_5_1_3 + 0.00112554112554116*G0_0_0_5_1_4 + 0.00926406926406961*G0_0_0_5_1_5 + 0.00213744588744596*G0_0_0_5_2_0 - 0.00213744588744597*G0_0_0_5_2_1 - 0.00114718614718619*G0_0_0_5_2_3 + 0.00114718614718619*G0_0_0_5_2_4 - 0.00112554112554116*G0_0_0_5_3_0 + 0.0085714285714289*G0_0_0_5_3_1 - 0.00114718614718619*G0_0_0_5_3_2 + 0.00502164502164522*G0_0_0_5_3_3 + 0.00225108225108234*G0_0_0_5_3_5 - 0.00857142857142886*G0_0_0_5_4_0 + 0.00112554112554116*G0_0_0_5_4_1 + 0.00114718614718619*G0_0_0_5_4_2 - 0.00502164502164519*G0_0_0_5_4_4 - 0.00225108225108232*G0_0_0_5_4_5 - 0.00926406926406957*G0_0_0_5_5_0 + 0.00926406926406961*G0_0_0_5_5_1 + 0.00225108225108234*G0_0_0_5_5_3 - 0.00225108225108232*G0_0_0_5_5_4 + 0.0260957792207802*G0_0_1_0_0_0 - 0.00373376623376637*G0_0_1_0_0_1 - 0.00204274891774899*G0_0_1_0_0_2 + 0.000703463203463227*G0_0_1_0_0_3 + 0.00817099567099596*G0_0_1_0_0_4 + 0.0163419913419919*G0_0_1_0_0_5 - 0.00373376623376637*G0_0_1_0_1_0 + 0.00147050865800871*G0_0_1_0_1_1 + 0.0003503787878788*G0_0_1_0_1_2 - 0.000156926406926412*G0_0_1_0_1_3 - 0.00178571428571435*G0_0_1_0_1_4 - 0.00373376623376637*G0_0_1_0_1_5 - 0.00204274891774899*G0_0_1_0_2_0 + 0.0003503787878788*G0_0_1_0_2_1 + 0.000542478354978373*G0_0_1_0_2_2 - 0.000541125541125559*G0_0_1_0_2_3 - 0.00178571428571435*G0_0_1_0_2_4 - 0.00232683982683991*G0_0_1_0_2_5 + 0.000703463203463227*G0_0_1_0_3_0 - 0.000156926406926412*G0_0_1_0_3_1 - 0.000541125541125559*G0_0_1_0_3_2 + 0.0026190476190477*G0_0_1_0_3_3 + 0.00216450216450223*G0_0_1_0_3_4 + 0.00324675324675335*G0_0_1_0_3_5 + 0.00817099567099596*G0_0_1_0_4_0 - 0.00178571428571435*G0_0_1_0_4_1 - 0.00178571428571435*G0_0_1_0_4_2 + 0.00216450216450223*G0_0_1_0_4_3 + 0.0082251082251085*G0_0_1_0_4_4 + 0.00822510822510851*G0_0_1_0_4_5 + 0.0163419913419919*G0_0_1_0_5_0 - 0.00373376623376636*G0_0_1_0_5_1 - 0.00232683982683991*G0_0_1_0_5_2 + 0.00324675324675335*G0_0_1_0_5_3 + 0.00822510822510851*G0_0_1_0_5_4 + 0.0246753246753256*G0_0_1_0_5_5 - 0.00373376623376637*G0_0_1_1_0_0 + 0.00147050865800871*G0_0_1_1_0_1 + 0.0003503787878788*G0_0_1_1_0_2 - 0.000156926406926412*G0_0_1_1_0_3 - 0.00178571428571435*G0_0_1_1_0_4 - 0.00373376623376637*G0_0_1_1_0_5 + 0.00147050865800871*G0_0_1_1_1_0 - 0.0127435064935069*G0_0_1_1_1_1 + 0.001032196969697*G0_0_1_1_1_2 - 0.00577922077922097*G0_0_1_1_1_3 - 0.00136363636363642*G0_0_1_1_1_5 + 0.0003503787878788*G0_0_1_1_2_0 + 0.001032196969697*G0_0_1_1_2_1 + 0.00149350649350654*G0_0_1_1_2_3 + 0.000357142857142869*G0_0_1_1_2_4 + 0.000784632034632063*G0_0_1_1_2_5 - 0.000156926406926412*G0_0_1_1_3_0 - 0.00577922077922097*G0_0_1_1_3_1 + 0.00149350649350654*G0_0_1_1_3_2 - 0.00484848484848501*G0_0_1_1_3_3 + 0.000367965367965379*G0_0_1_1_3_4 - 0.0012554112554113*G0_0_1_1_3_5 - 0.00178571428571435*G0_0_1_1_4_0 + 0.000357142857142869*G0_0_1_1_4_2 + 0.000367965367965379*G0_0_1_1_4_3 - 0.000432900432900451*G0_0_1_1_4_4 - 0.00151515151515157*G0_0_1_1_4_5 - 0.00373376623376637*G0_0_1_1_5_0 - 0.00136363636363642*G0_0_1_1_5_1 + 0.000784632034632063*G0_0_1_1_5_2 - 0.0012554112554113*G0_0_1_1_5_3 - 0.00151515151515157*G0_0_1_1_5_4 - 0.00952380952380987*G0_0_1_1_5_5 - 0.00204274891774899*G0_0_1_2_0_0 + 0.0003503787878788*G0_0_1_2_0_1 + 0.000542478354978373*G0_0_1_2_0_2 - 0.000541125541125559*G0_0_1_2_0_3 - 0.00178571428571435*G0_0_1_2_0_4 - 0.00232683982683991*G0_0_1_2_0_5 + 0.0003503787878788*G0_0_1_2_1_0 + 0.001032196969697*G0_0_1_2_1_1 + 0.00149350649350654*G0_0_1_2_1_3 + 0.000357142857142869*G0_0_1_2_1_4 + 0.000784632034632063*G0_0_1_2_1_5 + 0.000542478354978373*G0_0_1_2_2_0 - 0.00101866883116887*G0_0_1_2_2_2 - 0.00167748917748923*G0_0_1_2_2_3 - 0.000140692640692645*G0_0_1_2_2_5 - 0.000541125541125559*G0_0_1_2_3_0 + 0.00149350649350654*G0_0_1_2_3_1 - 0.00167748917748923*G0_0_1_2_3_2 + 0.00149350649350654*G0_0_1_2_3_3 + 0.00036796536796538*G0_0_1_2_3_4 + 0.00136363636363641*G0_0_1_2_3_5 - 0.00178571428571435*G0_0_1_2_4_0 + 0.000357142857142869*G0_0_1_2_4_1 + 0.00036796536796538*G0_0_1_2_4_3 - 0.00151515151515157*G0_0_1_2_4_4 - 0.000432900432900449*G0_0_1_2_4_5 - 0.00232683982683991*G0_0_1_2_5_0 + 0.000784632034632063*G0_0_1_2_5_1 - 0.000140692640692645*G0_0_1_2_5_2 + 0.00136363636363641*G0_0_1_2_5_3 - 0.000432900432900449*G0_0_1_2_5_4 + 0.00021645021645022*G0_0_1_2_5_5 + 0.000703463203463227*G0_0_1_3_0_0 - 0.000156926406926412*G0_0_1_3_0_1 - 0.000541125541125559*G0_0_1_3_0_2 + 0.0026190476190477*G0_0_1_3_0_3 + 0.00216450216450223*G0_0_1_3_0_4 + 0.00324675324675335*G0_0_1_3_0_5 - 0.000156926406926412*G0_0_1_3_1_0 - 0.00577922077922097*G0_0_1_3_1_1 + 0.00149350649350654*G0_0_1_3_1_2 - 0.00484848484848501*G0_0_1_3_1_3 + 0.000367965367965379*G0_0_1_3_1_4 - 0.0012554112554113*G0_0_1_3_1_5 - 0.000541125541125559*G0_0_1_3_2_0 + 0.00149350649350654*G0_0_1_3_2_1 - 0.00167748917748923*G0_0_1_3_2_2 + 0.00149350649350654*G0_0_1_3_2_3 + 0.00036796536796538*G0_0_1_3_2_4 + 0.00136363636363641*G0_0_1_3_2_5 + 0.0026190476190477*G0_0_1_3_3_0 - 0.00484848484848501*G0_0_1_3_3_1 + 0.00149350649350654*G0_0_1_3_3_2 - 0.0410389610389624*G0_0_1_3_3_3 - 0.00597402597402617*G0_0_1_3_3_4 - 0.00796536796536823*G0_0_1_3_3_5 + 0.00216450216450223*G0_0_1_3_4_0 + 0.000367965367965379*G0_0_1_3_4_1 + 0.00036796536796538*G0_0_1_3_4_2 - 0.00597402597402617*G0_0_1_3_4_3 - 0.00346320346320357*G0_0_1_3_4_4 - 0.00346320346320358*G0_0_1_3_4_5 + 0.00324675324675335*G0_0_1_3_5_0 - 0.0012554112554113*G0_0_1_3_5_1 + 0.00136363636363641*G0_0_1_3_5_2 - 0.00796536796536823*G0_0_1_3_5_3 - 0.00346320346320358*G0_0_1_3_5_4 - 0.00692640692640716*G0_0_1_3_5_5 + 0.00817099567099596*G0_0_1_4_0_0 - 0.00178571428571435*G0_0_1_4_0_1 - 0.00178571428571435*G0_0_1_4_0_2 + 0.00216450216450223*G0_0_1_4_0_3 + 0.0082251082251085*G0_0_1_4_0_4 + 0.00822510822510851*G0_0_1_4_0_5 - 0.00178571428571435*G0_0_1_4_1_0 + 0.000357142857142869*G0_0_1_4_1_2 + 0.000367965367965379*G0_0_1_4_1_3 - 0.000432900432900451*G0_0_1_4_1_4 - 0.00151515151515157*G0_0_1_4_1_5 - 0.00178571428571435*G0_0_1_4_2_0 + 0.000357142857142869*G0_0_1_4_2_1 + 0.00036796536796538*G0_0_1_4_2_3 - 0.00151515151515157*G0_0_1_4_2_4 - 0.000432900432900449*G0_0_1_4_2_5 + 0.00216450216450223*G0_0_1_4_3_0 + 0.000367965367965379*G0_0_1_4_3_1 + 0.00036796536796538*G0_0_1_4_3_2 - 0.00597402597402617*G0_0_1_4_3_3 - 0.00346320346320357*G0_0_1_4_3_4 - 0.00346320346320358*G0_0_1_4_3_5 + 0.0082251082251085*G0_0_1_4_4_0 - 0.000432900432900451*G0_0_1_4_4_1 - 0.00151515151515157*G0_0_1_4_4_2 - 0.00346320346320357*G0_0_1_4_4_3 + 0.00259740259740271*G0_0_1_4_4_4 + 0.0017316017316018*G0_0_1_4_4_5 + 0.00822510822510851*G0_0_1_4_5_0 - 0.00151515151515157*G0_0_1_4_5_1 - 0.000432900432900449*G0_0_1_4_5_2 - 0.00346320346320358*G0_0_1_4_5_3 + 0.0017316017316018*G0_0_1_4_5_4 + 0.0025974025974027*G0_0_1_4_5_5 + 0.0163419913419919*G0_0_1_5_0_0 - 0.00373376623376636*G0_0_1_5_0_1 - 0.00232683982683991*G0_0_1_5_0_2 + 0.00324675324675335*G0_0_1_5_0_3 + 0.00822510822510851*G0_0_1_5_0_4 + 0.0246753246753256*G0_0_1_5_0_5 - 0.00373376623376637*G0_0_1_5_1_0 - 0.00136363636363642*G0_0_1_5_1_1 + 0.000784632034632063*G0_0_1_5_1_2 - 0.0012554112554113*G0_0_1_5_1_3 - 0.00151515151515157*G0_0_1_5_1_4 - 0.00952380952380987*G0_0_1_5_1_5 - 0.00232683982683991*G0_0_1_5_2_0 + 0.000784632034632063*G0_0_1_5_2_1 - 0.000140692640692645*G0_0_1_5_2_2 + 0.00136363636363641*G0_0_1_5_2_3 - 0.000432900432900449*G0_0_1_5_2_4 + 0.00021645021645022*G0_0_1_5_2_5 + 0.00324675324675335*G0_0_1_5_3_0 - 0.0012554112554113*G0_0_1_5_3_1 + 0.00136363636363641*G0_0_1_5_3_2 - 0.00796536796536823*G0_0_1_5_3_3 - 0.00346320346320358*G0_0_1_5_3_4 - 0.00692640692640716*G0_0_1_5_3_5 + 0.00822510822510851*G0_0_1_5_4_0 - 0.00151515151515157*G0_0_1_5_4_1 - 0.000432900432900449*G0_0_1_5_4_2 - 0.00346320346320358*G0_0_1_5_4_3 + 0.0017316017316018*G0_0_1_5_4_4 + 0.0025974025974027*G0_0_1_5_4_5 + 0.0246753246753256*G0_0_1_5_5_0 - 0.00952380952380987*G0_0_1_5_5_1 + 0.00021645021645022*G0_0_1_5_5_2 - 0.00692640692640716*G0_0_1_5_5_3 + 0.0025974025974027*G0_0_1_5_5_4 + 0.0103896103896108*G0_0_1_5_5_5 - 0.140937500000005*G0_1_0_0_0_0 + 0.00927218614718645*G0_1_0_0_0_1 + 0.00912743506493537*G0_1_0_0_0_2 - 0.00160173160173163*G0_1_0_0_0_3 - 0.0404274891774905*G0_1_0_0_0_4 - 0.0304329004329015*G0_1_0_0_0_5 + 0.00927218614718645*G0_1_0_0_1_0 - 0.0115354437229441*G0_1_0_0_1_1 + 0.000350378787878801*G0_1_0_0_1_2 - 0.00393398268398282*G0_1_0_0_1_3 + 0.00199134199134206*G0_1_0_0_1_4 - 0.00373376623376637*G0_1_0_0_1_5 + 0.00912743506493537*G0_1_0_0_2_0 + 0.000350378787878801*G0_1_0_0_2_1 - 0.00129329004329009*G0_1_0_0_2_2 + 0.000930735930735962*G0_1_0_0_2_3 + 0.0059090909090911*G0_1_0_0_2_4 + 0.00292207792207802*G0_1_0_0_2_5 - 0.00160173160173163*G0_1_0_0_3_0 - 0.00393398268398282*G0_1_0_0_3_1 + 0.000930735930735962*G0_1_0_0_3_2 - 0.00179653679653687*G0_1_0_0_3_3 - 0.000779220779220803*G0_1_0_0_3_4 - 0.00264069264069273*G0_1_0_0_3_5 - 0.0404274891774905*G0_1_0_0_4_0 + 0.00199134199134206*G0_1_0_0_4_1 + 0.00590909090909111*G0_1_0_0_4_2 - 0.000779220779220804*G0_1_0_0_4_3 - 0.0266883116883126*G0_1_0_0_4_4 - 0.00982683982684016*G0_1_0_0_4_5 - 0.0304329004329015*G0_1_0_0_5_0 - 0.00373376623376637*G0_1_0_0_5_1 + 0.00292207792207802*G0_1_0_0_5_2 - 0.00264069264069273*G0_1_0_0_5_3 - 0.00982683982684016*G0_1_0_0_5_4 - 0.0187878787878794*G0_1_0_0_5_5 + 0.00927218614718645*G0_1_0_1_0_0 - 0.0115354437229441*G0_1_0_1_0_1 + 0.000350378787878801*G0_1_0_1_0_2 - 0.00393398268398282*G0_1_0_1_0_3 + 0.00199134199134206*G0_1_0_1_0_4 - 0.00373376623376637*G0_1_0_1_0_5 - 0.0115354437229441*G0_1_0_1_1_0 + 0.154289772727278*G0_1_0_1_1_1 - 0.0101379870129874*G0_1_0_1_1_2 + 0.0428192640692656*G0_1_0_1_1_3 + 0.00227813852813859*G0_1_0_1_1_4 + 0.0454112554112571*G0_1_0_1_1_5 + 0.000350378787878801*G0_1_0_1_2_0 - 0.0101379870129874*G0_1_0_1_2_1 + 0.00174648268398275*G0_1_0_1_2_2 - 0.00620129870129893*G0_1_0_1_2_3 - 0.00111471861471865*G0_1_0_1_2_4 - 0.00446428571428588*G0_1_0_1_2_5 - 0.00393398268398282*G0_1_0_1_3_0 + 0.0428192640692656*G0_1_0_1_3_1 - 0.00620129870129893*G0_1_0_1_3_2 + 0.0300649350649361*G0_1_0_1_3_3 + 0.00331168831168842*G0_1_0_1_3_4 + 0.0167965367965374*G0_1_0_1_3_5 + 0.00199134199134206*G0_1_0_1_4_0 + 0.00227813852813859*G0_1_0_1_4_1 - 0.00111471861471865*G0_1_0_1_4_2 + 0.00331168831168842*G0_1_0_1_4_3 + 0.00398268398268411*G0_1_0_1_4_4 + 0.00437229437229452*G0_1_0_1_4_5 - 0.00373376623376637*G0_1_0_1_5_0 + 0.0454112554112571*G0_1_0_1_5_1 - 0.00446428571428588*G0_1_0_1_5_2 + 0.0167965367965374*G0_1_0_1_5_3 + 0.00437229437229452*G0_1_0_1_5_4 + 0.0339393939393952*G0_1_0_1_5_5 + 0.00912743506493537*G0_1_0_2_0_0 + 0.000350378787878801*G0_1_0_2_0_1 - 0.00129329004329009*G0_1_0_2_0_2 + 0.000930735930735962*G0_1_0_2_0_3 + 0.00590909090909111*G0_1_0_2_0_4 + 0.00292207792207802*G0_1_0_2_0_5 + 0.000350378787878801*G0_1_0_2_1_0 - 0.0101379870129874*G0_1_0_2_1_1 + 0.00174648268398275*G0_1_0_2_1_2 - 0.00620129870129893*G0_1_0_2_1_3 - 0.00111471861471865*G0_1_0_2_1_4 - 0.00446428571428588*G0_1_0_2_1_5 - 0.00129329004329009*G0_1_0_2_2_0 + 0.00174648268398275*G0_1_0_2_2_1 - 0.00101866883116886*G0_1_0_2_2_2 + 0.000146103896103906*G0_1_0_2_2_3 - 0.00185064935064941*G0_1_0_2_2_4 - 0.000140692640692642*G0_1_0_2_2_5 + 0.000930735930735962*G0_1_0_2_3_0 - 0.00620129870129893*G0_1_0_2_3_1 + 0.000146103896103907*G0_1_0_2_3_2 - 0.00705627705627732*G0_1_0_2_3_3 + 0.000367965367965378*G0_1_0_2_3_4 - 0.00158008658008665*G0_1_0_2_3_5 + 0.00590909090909111*G0_1_0_2_4_0 - 0.00111471861471865*G0_1_0_2_4_1 - 0.00185064935064941*G0_1_0_2_4_2 + 0.000367965367965378*G0_1_0_2_4_3 + 0.00703463203463227*G0_1_0_2_4_4 + 0.00251082251082259*G0_1_0_2_4_5 + 0.00292207792207802*G0_1_0_2_5_0 - 0.00446428571428588*G0_1_0_2_5_1 - 0.000140692640692642*G0_1_0_2_5_2 - 0.00158008658008665*G0_1_0_2_5_3 + 0.00251082251082259*G0_1_0_2_5_4 + 0.000216450216450212*G0_1_0_2_5_5 - 0.00160173160173163*G0_1_0_3_0_0 - 0.00393398268398282*G0_1_0_3_0_1 + 0.000930735930735962*G0_1_0_3_0_2 - 0.00179653679653687*G0_1_0_3_0_3 - 0.000779220779220804*G0_1_0_3_0_4 - 0.00264069264069273*G0_1_0_3_0_5 - 0.00393398268398282*G0_1_0_3_1_0 + 0.0428192640692656*G0_1_0_3_1_1 - 0.00620129870129893*G0_1_0_3_1_2 + 0.0300649350649361*G0_1_0_3_1_3 + 0.00331168831168842*G0_1_0_3_1_4 + 0.0167965367965374*G0_1_0_3_1_5 + 0.000930735930735962*G0_1_0_3_2_0 - 0.00620129870129893*G0_1_0_3_2_1 + 0.000146103896103907*G0_1_0_3_2_2 - 0.00705627705627732*G0_1_0_3_2_3 + 0.000367965367965377*G0_1_0_3_2_4 - 0.00158008658008665*G0_1_0_3_2_5 - 0.00179653679653687*G0_1_0_3_3_0 + 0.0300649350649361*G0_1_0_3_3_1 - 0.00705627705627732*G0_1_0_3_3_2 + 0.00649350649350683*G0_1_0_3_3_3 - 0.00303030303030311*G0_1_0_3_3_4 + 0.00675324675324704*G0_1_0_3_3_5 - 0.000779220779220803*G0_1_0_3_4_0 + 0.00331168831168842*G0_1_0_3_4_1 + 0.000367965367965378*G0_1_0_3_4_2 - 0.00303030303030311*G0_1_0_3_4_3 - 0.00640692640692661*G0_1_0_3_4_4 - 0.00346320346320357*G0_1_0_3_4_5 - 0.00264069264069273*G0_1_0_3_5_0 + 0.0167965367965374*G0_1_0_3_5_1 - 0.00158008658008665*G0_1_0_3_5_2 + 0.00675324675324704*G0_1_0_3_5_3 - 0.00346320346320357*G0_1_0_3_5_4 + 0.00484848484848506*G0_1_0_3_5_5 - 0.0404274891774905*G0_1_0_4_0_0 + 0.00199134199134206*G0_1_0_4_0_1 + 0.00590909090909111*G0_1_0_4_0_2 - 0.000779220779220804*G0_1_0_4_0_3 - 0.0266883116883126*G0_1_0_4_0_4 - 0.00982683982684016*G0_1_0_4_0_5 + 0.00199134199134206*G0_1_0_4_1_0 + 0.0022781385281386*G0_1_0_4_1_1 - 0.00111471861471865*G0_1_0_4_1_2 + 0.00331168831168842*G0_1_0_4_1_3 + 0.00398268398268411*G0_1_0_4_1_4 + 0.00437229437229452*G0_1_0_4_1_5 + 0.0059090909090911*G0_1_0_4_2_0 - 0.00111471861471865*G0_1_0_4_2_1 - 0.00185064935064941*G0_1_0_4_2_2 + 0.000367965367965378*G0_1_0_4_2_3 + 0.00703463203463227*G0_1_0_4_2_4 + 0.00251082251082259*G0_1_0_4_2_5 - 0.000779220779220803*G0_1_0_4_3_0 + 0.00331168831168842*G0_1_0_4_3_1 + 0.000367965367965378*G0_1_0_4_3_2 - 0.00303030303030311*G0_1_0_4_3_3 - 0.00640692640692661*G0_1_0_4_3_4 - 0.00346320346320357*G0_1_0_4_3_5 - 0.0266883116883126*G0_1_0_4_4_0 + 0.00398268398268411*G0_1_0_4_4_1 + 0.00703463203463227*G0_1_0_4_4_2 - 0.00640692640692661*G0_1_0_4_4_3 - 0.0449350649350664*G0_1_0_4_4_4 - 0.0129870129870134*G0_1_0_4_4_5 - 0.00982683982684016*G0_1_0_4_5_0 + 0.00437229437229452*G0_1_0_4_5_1 + 0.00251082251082259*G0_1_0_4_5_2 - 0.00346320346320357*G0_1_0_4_5_3 - 0.0129870129870134*G0_1_0_4_5_4 - 0.00917748917748948*G0_1_0_4_5_5 - 0.0304329004329015*G0_1_0_5_0_0 - 0.00373376623376637*G0_1_0_5_0_1 + 0.00292207792207802*G0_1_0_5_0_2 - 0.00264069264069273*G0_1_0_5_0_3 - 0.00982683982684016*G0_1_0_5_0_4 - 0.0187878787878794*G0_1_0_5_0_5 - 0.00373376623376637*G0_1_0_5_1_0 + 0.0454112554112571*G0_1_0_5_1_1 - 0.00446428571428588*G0_1_0_5_1_2 + 0.0167965367965374*G0_1_0_5_1_3 + 0.00437229437229452*G0_1_0_5_1_4 + 0.0339393939393952*G0_1_0_5_1_5 + 0.00292207792207802*G0_1_0_5_2_0 - 0.00446428571428588*G0_1_0_5_2_1 - 0.000140692640692642*G0_1_0_5_2_2 - 0.00158008658008665*G0_1_0_5_2_3 + 0.00251082251082259*G0_1_0_5_2_4 + 0.000216450216450212*G0_1_0_5_2_5 - 0.00264069264069273*G0_1_0_5_3_0 + 0.0167965367965374*G0_1_0_5_3_1 - 0.00158008658008665*G0_1_0_5_3_2 + 0.00675324675324704*G0_1_0_5_3_3 - 0.00346320346320357*G0_1_0_5_3_4 + 0.00484848484848506*G0_1_0_5_3_5 - 0.00982683982684016*G0_1_0_5_4_0 + 0.00437229437229452*G0_1_0_5_4_1 + 0.00251082251082259*G0_1_0_5_4_2 - 0.00346320346320357*G0_1_0_5_4_3 - 0.0129870129870134*G0_1_0_5_4_4 - 0.00917748917748948*G0_1_0_5_4_5 - 0.0187878787878794*G0_1_0_5_5_0 + 0.0339393939393952*G0_1_0_5_5_1 + 0.000216450216450213*G0_1_0_5_5_2 + 0.00484848484848506*G0_1_0_5_5_3 - 0.00917748917748948*G0_1_0_5_5_4 + 0.0103896103896108*G0_1_0_5_5_5 + 0.0260957792207802*G0_1_1_0_0_0 - 0.00373376623376637*G0_1_1_0_0_1 - 0.00204274891774899*G0_1_1_0_0_2 + 0.000703463203463227*G0_1_1_0_0_3 + 0.00817099567099596*G0_1_1_0_0_4 + 0.0163419913419919*G0_1_1_0_0_5 - 0.00373376623376637*G0_1_1_0_1_0 + 0.00147050865800871*G0_1_1_0_1_1 + 0.0003503787878788*G0_1_1_0_1_2 - 0.000156926406926413*G0_1_1_0_1_3 - 0.00178571428571435*G0_1_1_0_1_4 - 0.00373376623376637*G0_1_1_0_1_5 - 0.00204274891774899*G0_1_1_0_2_0 + 0.0003503787878788*G0_1_1_0_2_1 + 0.000542478354978373*G0_1_1_0_2_2 - 0.000541125541125558*G0_1_1_0_2_3 - 0.00178571428571435*G0_1_1_0_2_4 - 0.00232683982683991*G0_1_1_0_2_5 + 0.000703463203463227*G0_1_1_0_3_0 - 0.000156926406926413*G0_1_1_0_3_1 - 0.000541125541125558*G0_1_1_0_3_2 + 0.0026190476190477*G0_1_1_0_3_3 + 0.00216450216450223*G0_1_1_0_3_4 + 0.00324675324675335*G0_1_1_0_3_5 + 0.00817099567099596*G0_1_1_0_4_0 - 0.00178571428571435*G0_1_1_0_4_1 - 0.00178571428571435*G0_1_1_0_4_2 + 0.00216450216450223*G0_1_1_0_4_3 + 0.0082251082251085*G0_1_1_0_4_4 + 0.0082251082251085*G0_1_1_0_4_5 + 0.0163419913419919*G0_1_1_0_5_0 - 0.00373376623376637*G0_1_1_0_5_1 - 0.00232683982683991*G0_1_1_0_5_2 + 0.00324675324675335*G0_1_1_0_5_3 + 0.0082251082251085*G0_1_1_0_5_4 + 0.0246753246753256*G0_1_1_0_5_5 - 0.00373376623376637*G0_1_1_1_0_0 + 0.00147050865800871*G0_1_1_1_0_1 + 0.0003503787878788*G0_1_1_1_0_2 - 0.000156926406926413*G0_1_1_1_0_3 - 0.00178571428571435*G0_1_1_1_0_4 - 0.00373376623376637*G0_1_1_1_0_5 + 0.00147050865800871*G0_1_1_1_1_0 - 0.0127435064935069*G0_1_1_1_1_1 + 0.001032196969697*G0_1_1_1_1_2 - 0.00577922077922097*G0_1_1_1_1_3 - 0.00136363636363641*G0_1_1_1_1_5 + 0.0003503787878788*G0_1_1_1_2_0 + 0.001032196969697*G0_1_1_1_2_1 + 0.00149350649350654*G0_1_1_1_2_3 + 0.000357142857142869*G0_1_1_1_2_4 + 0.000784632034632063*G0_1_1_1_2_5 - 0.000156926406926413*G0_1_1_1_3_0 - 0.00577922077922097*G0_1_1_1_3_1 + 0.00149350649350654*G0_1_1_1_3_2 - 0.00484848484848501*G0_1_1_1_3_3 + 0.00036796536796538*G0_1_1_1_3_4 - 0.0012554112554113*G0_1_1_1_3_5 - 0.00178571428571435*G0_1_1_1_4_0 + 0.000357142857142869*G0_1_1_1_4_2 + 0.00036796536796538*G0_1_1_1_4_3 - 0.00043290043290045*G0_1_1_1_4_4 - 0.00151515151515157*G0_1_1_1_4_5 - 0.00373376623376637*G0_1_1_1_5_0 - 0.00136363636363641*G0_1_1_1_5_1 + 0.000784632034632063*G0_1_1_1_5_2 - 0.0012554112554113*G0_1_1_1_5_3 - 0.00151515151515157*G0_1_1_1_5_4 - 0.00952380952380987*G0_1_1_1_5_5 - 0.00204274891774899*G0_1_1_2_0_0 + 0.0003503787878788*G0_1_1_2_0_1 + 0.000542478354978373*G0_1_1_2_0_2 - 0.000541125541125558*G0_1_1_2_0_3 - 0.00178571428571435*G0_1_1_2_0_4 - 0.00232683982683991*G0_1_1_2_0_5 + 0.0003503787878788*G0_1_1_2_1_0 + 0.001032196969697*G0_1_1_2_1_1 + 0.00149350649350654*G0_1_1_2_1_3 + 0.000357142857142869*G0_1_1_2_1_4 + 0.000784632034632063*G0_1_1_2_1_5 + 0.000542478354978373*G0_1_1_2_2_0 - 0.00101866883116887*G0_1_1_2_2_2 - 0.00167748917748923*G0_1_1_2_2_3 - 0.000140692640692645*G0_1_1_2_2_5 - 0.000541125541125558*G0_1_1_2_3_0 + 0.00149350649350654*G0_1_1_2_3_1 - 0.00167748917748923*G0_1_1_2_3_2 + 0.00149350649350654*G0_1_1_2_3_3 + 0.000367965367965379*G0_1_1_2_3_4 + 0.00136363636363641*G0_1_1_2_3_5 - 0.00178571428571435*G0_1_1_2_4_0 + 0.000357142857142869*G0_1_1_2_4_1 + 0.000367965367965379*G0_1_1_2_4_3 - 0.00151515151515156*G0_1_1_2_4_4 - 0.00043290043290045*G0_1_1_2_4_5 - 0.00232683982683991*G0_1_1_2_5_0 + 0.000784632034632063*G0_1_1_2_5_1 - 0.000140692640692645*G0_1_1_2_5_2 + 0.00136363636363641*G0_1_1_2_5_3 - 0.00043290043290045*G0_1_1_2_5_4 + 0.000216450216450217*G0_1_1_2_5_5 + 0.000703463203463227*G0_1_1_3_0_0 - 0.000156926406926413*G0_1_1_3_0_1 - 0.000541125541125558*G0_1_1_3_0_2 + 0.0026190476190477*G0_1_1_3_0_3 + 0.00216450216450223*G0_1_1_3_0_4 + 0.00324675324675335*G0_1_1_3_0_5 - 0.000156926406926413*G0_1_1_3_1_0 - 0.00577922077922097*G0_1_1_3_1_1 + 0.00149350649350654*G0_1_1_3_1_2 - 0.00484848484848501*G0_1_1_3_1_3 + 0.00036796536796538*G0_1_1_3_1_4 - 0.0012554112554113*G0_1_1_3_1_5 - 0.000541125541125558*G0_1_1_3_2_0 + 0.00149350649350654*G0_1_1_3_2_1 - 0.00167748917748923*G0_1_1_3_2_2 + 0.00149350649350654*G0_1_1_3_2_3 + 0.000367965367965379*G0_1_1_3_2_4 + 0.00136363636363641*G0_1_1_3_2_5 + 0.0026190476190477*G0_1_1_3_3_0 - 0.00484848484848501*G0_1_1_3_3_1 + 0.00149350649350654*G0_1_1_3_3_2 - 0.0410389610389624*G0_1_1_3_3_3 - 0.00597402597402617*G0_1_1_3_3_4 - 0.00796536796536823*G0_1_1_3_3_5 + 0.00216450216450223*G0_1_1_3_4_0 + 0.000367965367965379*G0_1_1_3_4_1 + 0.000367965367965379*G0_1_1_3_4_2 - 0.00597402597402617*G0_1_1_3_4_3 - 0.00346320346320357*G0_1_1_3_4_4 - 0.00346320346320357*G0_1_1_3_4_5 + 0.00324675324675335*G0_1_1_3_5_0 - 0.0012554112554113*G0_1_1_3_5_1 + 0.00136363636363641*G0_1_1_3_5_2 - 0.00796536796536823*G0_1_1_3_5_3 - 0.00346320346320357*G0_1_1_3_5_4 - 0.00692640692640715*G0_1_1_3_5_5 + 0.00817099567099596*G0_1_1_4_0_0 - 0.00178571428571435*G0_1_1_4_0_1 - 0.00178571428571435*G0_1_1_4_0_2 + 0.00216450216450223*G0_1_1_4_0_3 + 0.0082251082251085*G0_1_1_4_0_4 + 0.0082251082251085*G0_1_1_4_0_5 - 0.00178571428571435*G0_1_1_4_1_0 + 0.000357142857142869*G0_1_1_4_1_2 + 0.00036796536796538*G0_1_1_4_1_3 - 0.00043290043290045*G0_1_1_4_1_4 - 0.00151515151515157*G0_1_1_4_1_5 - 0.00178571428571435*G0_1_1_4_2_0 + 0.000357142857142869*G0_1_1_4_2_1 + 0.000367965367965379*G0_1_1_4_2_3 - 0.00151515151515156*G0_1_1_4_2_4 - 0.00043290043290045*G0_1_1_4_2_5 + 0.00216450216450223*G0_1_1_4_3_0 + 0.000367965367965379*G0_1_1_4_3_1 + 0.000367965367965379*G0_1_1_4_3_2 - 0.00597402597402617*G0_1_1_4_3_3 - 0.00346320346320357*G0_1_1_4_3_4 - 0.00346320346320357*G0_1_1_4_3_5 + 0.0082251082251085*G0_1_1_4_4_0 - 0.00043290043290045*G0_1_1_4_4_1 - 0.00151515151515156*G0_1_1_4_4_2 - 0.00346320346320357*G0_1_1_4_4_3 + 0.00259740259740269*G0_1_1_4_4_4 + 0.0017316017316018*G0_1_1_4_4_5 + 0.0082251082251085*G0_1_1_4_5_0 - 0.00151515151515157*G0_1_1_4_5_1 - 0.00043290043290045*G0_1_1_4_5_2 - 0.00346320346320357*G0_1_1_4_5_3 + 0.0017316017316018*G0_1_1_4_5_4 + 0.00259740259740271*G0_1_1_4_5_5 + 0.0163419913419919*G0_1_1_5_0_0 - 0.00373376623376637*G0_1_1_5_0_1 - 0.00232683982683991*G0_1_1_5_0_2 + 0.00324675324675335*G0_1_1_5_0_3 + 0.0082251082251085*G0_1_1_5_0_4 + 0.0246753246753256*G0_1_1_5_0_5 - 0.00373376623376637*G0_1_1_5_1_0 - 0.00136363636363641*G0_1_1_5_1_1 + 0.000784632034632063*G0_1_1_5_1_2 - 0.0012554112554113*G0_1_1_5_1_3 - 0.00151515151515157*G0_1_1_5_1_4 - 0.00952380952380987*G0_1_1_5_1_5 - 0.00232683982683991*G0_1_1_5_2_0 + 0.000784632034632063*G0_1_1_5_2_1 - 0.000140692640692645*G0_1_1_5_2_2 + 0.00136363636363641*G0_1_1_5_2_3 - 0.00043290043290045*G0_1_1_5_2_4 + 0.000216450216450217*G0_1_1_5_2_5 + 0.00324675324675335*G0_1_1_5_3_0 - 0.0012554112554113*G0_1_1_5_3_1 + 0.00136363636363641*G0_1_1_5_3_2 - 0.00796536796536823*G0_1_1_5_3_3 - 0.00346320346320357*G0_1_1_5_3_4 - 0.00692640692640715*G0_1_1_5_3_5 + 0.0082251082251085*G0_1_1_5_4_0 - 0.00151515151515157*G0_1_1_5_4_1 - 0.00043290043290045*G0_1_1_5_4_2 - 0.00346320346320357*G0_1_1_5_4_3 + 0.0017316017316018*G0_1_1_5_4_4 + 0.00259740259740271*G0_1_1_5_4_5 + 0.0246753246753256*G0_1_1_5_5_0 - 0.00952380952380987*G0_1_1_5_5_1 + 0.000216450216450217*G0_1_1_5_5_2 - 0.00692640692640715*G0_1_1_5_5_3 + 0.00259740259740271*G0_1_1_5_5_4 + 0.0103896103896108*G0_1_1_5_5_5; + A[70] = A[7] - 0.166233766233772*G0_0_1_0_0_0 + 0.0113501082251086*G0_0_1_0_0_1 + 0.0113501082251086*G0_0_1_0_0_2 - 0.00313852813852822*G0_0_1_0_0_3 - 0.0485389610389627*G0_0_1_0_0_4 - 0.0485389610389627*G0_0_1_0_0_5 + 0.0113501082251086*G0_0_1_0_1_0 - 0.00165584415584421*G0_0_1_0_1_1 - 0.0010606060606061*G0_0_1_0_1_2 + 0.000551948051948069*G0_0_1_0_1_3 + 0.00432900432900447*G0_0_1_0_1_4 + 0.00746753246753273*G0_0_1_0_1_5 + 0.0113501082251086*G0_0_1_0_2_0 - 0.0010606060606061*G0_0_1_0_2_1 - 0.00165584415584421*G0_0_1_0_2_2 + 0.000551948051948069*G0_0_1_0_2_3 + 0.00746753246753272*G0_0_1_0_2_4 + 0.00432900432900448*G0_0_1_0_2_5 - 0.00313852813852822*G0_0_1_0_3_0 + 0.000551948051948069*G0_0_1_0_3_1 + 0.000551948051948069*G0_0_1_0_3_2 - 0.000346320346320356*G0_0_1_0_3_3 - 0.00238095238095245*G0_0_1_0_3_4 - 0.00238095238095246*G0_0_1_0_3_5 - 0.0485389610389627*G0_0_1_0_4_0 + 0.00432900432900447*G0_0_1_0_4_1 + 0.00746753246753272*G0_0_1_0_4_2 - 0.00238095238095245*G0_0_1_0_4_3 - 0.0346320346320358*G0_0_1_0_4_4 - 0.0173160173160179*G0_0_1_0_4_5 - 0.0485389610389627*G0_0_1_0_5_0 + 0.00746753246753272*G0_0_1_0_5_1 + 0.00432900432900448*G0_0_1_0_5_2 - 0.00238095238095246*G0_0_1_0_5_3 - 0.0173160173160179*G0_0_1_0_5_4 - 0.0346320346320359*G0_0_1_0_5_5 + 0.0113501082251086*G0_0_1_1_0_0 - 0.00165584415584421*G0_0_1_1_0_1 - 0.0010606060606061*G0_0_1_1_0_2 + 0.000551948051948069*G0_0_1_1_0_3 + 0.00432900432900447*G0_0_1_1_0_4 + 0.00746753246753273*G0_0_1_1_0_5 - 0.00165584415584421*G0_0_1_1_1_0 + 0.00079951298701302*G0_0_1_1_1_1 + 0.000179924242424247*G0_0_1_1_1_2 - 0.000833333333333361*G0_0_1_1_1_4 - 0.00176406926406932*G0_0_1_1_1_5 - 0.0010606060606061*G0_0_1_1_2_0 + 0.000179924242424247*G0_0_1_1_2_1 + 0.000179924242424249*G0_0_1_1_2_2 - 0.000227272727272735*G0_0_1_1_2_3 - 0.000919913419913451*G0_0_1_1_2_4 - 0.000919913419913452*G0_0_1_1_2_5 + 0.000551948051948069*G0_0_1_1_3_0 - 0.000227272727272735*G0_0_1_1_3_2 + 0.000281385281385299*G0_0_1_1_3_3 + 0.000562770562770582*G0_0_1_1_3_4 + 0.000735930735930761*G0_0_1_1_3_5 + 0.00432900432900447*G0_0_1_1_4_0 - 0.000833333333333361*G0_0_1_1_4_1 - 0.000919913419913451*G0_0_1_1_4_2 + 0.000562770562770582*G0_0_1_1_4_3 + 0.00406926406926421*G0_0_1_1_4_4 + 0.00350649350649362*G0_0_1_1_4_5 + 0.00746753246753273*G0_0_1_1_5_0 - 0.00176406926406932*G0_0_1_1_5_1 - 0.000919913419913451*G0_0_1_1_5_2 + 0.000735930735930761*G0_0_1_1_5_3 + 0.00350649350649362*G0_0_1_1_5_4 + 0.00883116883116914*G0_0_1_1_5_5 + 0.0113501082251086*G0_0_1_2_0_0 - 0.0010606060606061*G0_0_1_2_0_1 - 0.00165584415584421*G0_0_1_2_0_2 + 0.000551948051948069*G0_0_1_2_0_3 + 0.00746753246753272*G0_0_1_2_0_4 + 0.00432900432900448*G0_0_1_2_0_5 - 0.0010606060606061*G0_0_1_2_1_0 + 0.000179924242424247*G0_0_1_2_1_1 + 0.000179924242424249*G0_0_1_2_1_2 - 0.000227272727272735*G0_0_1_2_1_3 - 0.000919913419913451*G0_0_1_2_1_4 - 0.000919913419913452*G0_0_1_2_1_5 - 0.00165584415584421*G0_0_1_2_2_0 + 0.000179924242424249*G0_0_1_2_2_1 + 0.000799512987013018*G0_0_1_2_2_2 - 0.00176406926406932*G0_0_1_2_2_4 - 0.000833333333333361*G0_0_1_2_2_5 + 0.000551948051948069*G0_0_1_2_3_0 - 0.000227272727272735*G0_0_1_2_3_1 + 0.000281385281385285*G0_0_1_2_3_3 + 0.000735930735930759*G0_0_1_2_3_4 + 0.00056277056277058*G0_0_1_2_3_5 + 0.00746753246753272*G0_0_1_2_4_0 - 0.000919913419913451*G0_0_1_2_4_1 - 0.00176406926406932*G0_0_1_2_4_2 + 0.000735930735930759*G0_0_1_2_4_3 + 0.00883116883116912*G0_0_1_2_4_4 + 0.00350649350649362*G0_0_1_2_4_5 + 0.00432900432900448*G0_0_1_2_5_0 - 0.000919913419913452*G0_0_1_2_5_1 - 0.000833333333333361*G0_0_1_2_5_2 + 0.000562770562770581*G0_0_1_2_5_3 + 0.00350649350649362*G0_0_1_2_5_4 + 0.00406926406926421*G0_0_1_2_5_5 - 0.00313852813852822*G0_0_1_3_0_0 + 0.000551948051948069*G0_0_1_3_0_1 + 0.000551948051948069*G0_0_1_3_0_2 - 0.000346320346320356*G0_0_1_3_0_3 - 0.00238095238095245*G0_0_1_3_0_4 - 0.00238095238095246*G0_0_1_3_0_5 + 0.000551948051948069*G0_0_1_3_1_0 - 0.000227272727272735*G0_0_1_3_1_2 + 0.000281385281385297*G0_0_1_3_1_3 + 0.000562770562770582*G0_0_1_3_1_4 + 0.000735930735930762*G0_0_1_3_1_5 + 0.000551948051948069*G0_0_1_3_2_0 - 0.000227272727272735*G0_0_1_3_2_1 + 0.000281385281385285*G0_0_1_3_2_3 + 0.000735930735930759*G0_0_1_3_2_4 + 0.000562770562770581*G0_0_1_3_2_5 - 0.000346320346320356*G0_0_1_3_3_0 + 0.000281385281385298*G0_0_1_3_3_1 + 0.000281385281385285*G0_0_1_3_3_2 + 0.00207792207792214*G0_0_1_3_3_3 - 0.000432900432900447*G0_0_1_3_3_4 - 0.000432900432900443*G0_0_1_3_3_5 - 0.00238095238095245*G0_0_1_3_4_0 + 0.000562770562770582*G0_0_1_3_4_1 + 0.000735930735930759*G0_0_1_3_4_2 - 0.000432900432900447*G0_0_1_3_4_3 - 0.00337662337662349*G0_0_1_3_4_4 - 0.00225108225108232*G0_0_1_3_4_5 - 0.00238095238095246*G0_0_1_3_5_0 + 0.000735930735930762*G0_0_1_3_5_1 + 0.000562770562770581*G0_0_1_3_5_2 - 0.000432900432900443*G0_0_1_3_5_3 - 0.00225108225108232*G0_0_1_3_5_4 - 0.00337662337662348*G0_0_1_3_5_5 - 0.0485389610389627*G0_0_1_4_0_0 + 0.00432900432900447*G0_0_1_4_0_1 + 0.00746753246753272*G0_0_1_4_0_2 - 0.00238095238095245*G0_0_1_4_0_3 - 0.0346320346320358*G0_0_1_4_0_4 - 0.0173160173160179*G0_0_1_4_0_5 + 0.00432900432900447*G0_0_1_4_1_0 - 0.000833333333333361*G0_0_1_4_1_1 - 0.000919913419913451*G0_0_1_4_1_2 + 0.000562770562770582*G0_0_1_4_1_3 + 0.00406926406926421*G0_0_1_4_1_4 + 0.00350649350649363*G0_0_1_4_1_5 + 0.00746753246753272*G0_0_1_4_2_0 - 0.000919913419913451*G0_0_1_4_2_1 - 0.00176406926406932*G0_0_1_4_2_2 + 0.000735930735930759*G0_0_1_4_2_3 + 0.00883116883116912*G0_0_1_4_2_4 + 0.00350649350649362*G0_0_1_4_2_5 - 0.00238095238095245*G0_0_1_4_3_0 + 0.000562770562770582*G0_0_1_4_3_1 + 0.000735930735930759*G0_0_1_4_3_2 - 0.000432900432900447*G0_0_1_4_3_3 - 0.00337662337662349*G0_0_1_4_3_4 - 0.00225108225108232*G0_0_1_4_3_5 - 0.0346320346320358*G0_0_1_4_4_0 + 0.00406926406926421*G0_0_1_4_4_1 + 0.00883116883116912*G0_0_1_4_4_2 - 0.00337662337662349*G0_0_1_4_4_3 - 0.045454545454547*G0_0_1_4_4_4 - 0.0151515151515157*G0_0_1_4_4_5 - 0.0173160173160179*G0_0_1_4_5_0 + 0.00350649350649363*G0_0_1_4_5_1 + 0.00350649350649362*G0_0_1_4_5_2 - 0.00225108225108232*G0_0_1_4_5_3 - 0.0151515151515157*G0_0_1_4_5_4 - 0.0151515151515157*G0_0_1_4_5_5 - 0.0485389610389627*G0_0_1_5_0_0 + 0.00746753246753272*G0_0_1_5_0_1 + 0.00432900432900448*G0_0_1_5_0_2 - 0.00238095238095246*G0_0_1_5_0_3 - 0.0173160173160179*G0_0_1_5_0_4 - 0.0346320346320359*G0_0_1_5_0_5 + 0.00746753246753273*G0_0_1_5_1_0 - 0.00176406926406932*G0_0_1_5_1_1 - 0.000919913419913451*G0_0_1_5_1_2 + 0.000735930735930761*G0_0_1_5_1_3 + 0.00350649350649362*G0_0_1_5_1_4 + 0.00883116883116914*G0_0_1_5_1_5 + 0.00432900432900448*G0_0_1_5_2_0 - 0.000919913419913451*G0_0_1_5_2_1 - 0.000833333333333361*G0_0_1_5_2_2 + 0.00056277056277058*G0_0_1_5_2_3 + 0.00350649350649362*G0_0_1_5_2_4 + 0.00406926406926421*G0_0_1_5_2_5 - 0.00238095238095246*G0_0_1_5_3_0 + 0.000735930735930762*G0_0_1_5_3_1 + 0.00056277056277058*G0_0_1_5_3_2 - 0.000432900432900443*G0_0_1_5_3_3 - 0.00225108225108232*G0_0_1_5_3_4 - 0.00337662337662348*G0_0_1_5_3_5 - 0.0173160173160179*G0_0_1_5_4_0 + 0.00350649350649363*G0_0_1_5_4_1 + 0.00350649350649362*G0_0_1_5_4_2 - 0.00225108225108232*G0_0_1_5_4_3 - 0.0151515151515157*G0_0_1_5_4_4 - 0.0151515151515157*G0_0_1_5_4_5 - 0.0346320346320359*G0_0_1_5_5_0 + 0.00883116883116914*G0_0_1_5_5_1 + 0.00406926406926421*G0_0_1_5_5_2 - 0.00337662337662348*G0_0_1_5_5_3 - 0.0151515151515157*G0_0_1_5_5_4 - 0.045454545454547*G0_0_1_5_5_5 + 0.166233766233772*G0_1_0_0_0_0 - 0.0113501082251086*G0_1_0_0_0_1 - 0.0113501082251086*G0_1_0_0_0_2 + 0.00313852813852822*G0_1_0_0_0_3 + 0.0485389610389627*G0_1_0_0_0_4 + 0.0485389610389627*G0_1_0_0_0_5 - 0.0113501082251086*G0_1_0_0_1_0 + 0.00165584415584421*G0_1_0_0_1_1 + 0.0010606060606061*G0_1_0_0_1_2 - 0.000551948051948069*G0_1_0_0_1_3 - 0.00432900432900447*G0_1_0_0_1_4 - 0.00746753246753273*G0_1_0_0_1_5 - 0.0113501082251086*G0_1_0_0_2_0 + 0.0010606060606061*G0_1_0_0_2_1 + 0.00165584415584421*G0_1_0_0_2_2 - 0.000551948051948069*G0_1_0_0_2_3 - 0.00746753246753272*G0_1_0_0_2_4 - 0.00432900432900448*G0_1_0_0_2_5 + 0.00313852813852822*G0_1_0_0_3_0 - 0.000551948051948069*G0_1_0_0_3_1 - 0.000551948051948069*G0_1_0_0_3_2 + 0.000346320346320356*G0_1_0_0_3_3 + 0.00238095238095245*G0_1_0_0_3_4 + 0.00238095238095246*G0_1_0_0_3_5 + 0.0485389610389627*G0_1_0_0_4_0 - 0.00432900432900447*G0_1_0_0_4_1 - 0.00746753246753272*G0_1_0_0_4_2 + 0.00238095238095245*G0_1_0_0_4_3 + 0.0346320346320358*G0_1_0_0_4_4 + 0.0173160173160179*G0_1_0_0_4_5 + 0.0485389610389627*G0_1_0_0_5_0 - 0.00746753246753272*G0_1_0_0_5_1 - 0.00432900432900448*G0_1_0_0_5_2 + 0.00238095238095246*G0_1_0_0_5_3 + 0.0173160173160179*G0_1_0_0_5_4 + 0.0346320346320359*G0_1_0_0_5_5 - 0.0113501082251086*G0_1_0_1_0_0 + 0.00165584415584421*G0_1_0_1_0_1 + 0.0010606060606061*G0_1_0_1_0_2 - 0.000551948051948069*G0_1_0_1_0_3 - 0.00432900432900447*G0_1_0_1_0_4 - 0.00746753246753273*G0_1_0_1_0_5 + 0.00165584415584421*G0_1_0_1_1_0 - 0.00079951298701302*G0_1_0_1_1_1 - 0.000179924242424247*G0_1_0_1_1_2 + 0.000833333333333361*G0_1_0_1_1_4 + 0.00176406926406932*G0_1_0_1_1_5 + 0.0010606060606061*G0_1_0_1_2_0 - 0.000179924242424247*G0_1_0_1_2_1 - 0.000179924242424249*G0_1_0_1_2_2 + 0.000227272727272735*G0_1_0_1_2_3 + 0.000919913419913451*G0_1_0_1_2_4 + 0.000919913419913452*G0_1_0_1_2_5 - 0.000551948051948069*G0_1_0_1_3_0 + 0.000227272727272735*G0_1_0_1_3_2 - 0.000281385281385298*G0_1_0_1_3_3 - 0.000562770562770582*G0_1_0_1_3_4 - 0.000735930735930762*G0_1_0_1_3_5 - 0.00432900432900447*G0_1_0_1_4_0 + 0.000833333333333361*G0_1_0_1_4_1 + 0.000919913419913451*G0_1_0_1_4_2 - 0.000562770562770582*G0_1_0_1_4_3 - 0.00406926406926421*G0_1_0_1_4_4 - 0.00350649350649362*G0_1_0_1_4_5 - 0.00746753246753273*G0_1_0_1_5_0 + 0.00176406926406932*G0_1_0_1_5_1 + 0.000919913419913452*G0_1_0_1_5_2 - 0.000735930735930761*G0_1_0_1_5_3 - 0.00350649350649362*G0_1_0_1_5_4 - 0.00883116883116914*G0_1_0_1_5_5 - 0.0113501082251086*G0_1_0_2_0_0 + 0.0010606060606061*G0_1_0_2_0_1 + 0.00165584415584421*G0_1_0_2_0_2 - 0.000551948051948069*G0_1_0_2_0_3 - 0.00746753246753272*G0_1_0_2_0_4 - 0.00432900432900448*G0_1_0_2_0_5 + 0.0010606060606061*G0_1_0_2_1_0 - 0.000179924242424247*G0_1_0_2_1_1 - 0.000179924242424249*G0_1_0_2_1_2 + 0.000227272727272735*G0_1_0_2_1_3 + 0.000919913419913451*G0_1_0_2_1_4 + 0.000919913419913452*G0_1_0_2_1_5 + 0.00165584415584421*G0_1_0_2_2_0 - 0.000179924242424249*G0_1_0_2_2_1 - 0.000799512987013018*G0_1_0_2_2_2 + 0.00176406926406932*G0_1_0_2_2_4 + 0.000833333333333361*G0_1_0_2_2_5 - 0.000551948051948069*G0_1_0_2_3_0 + 0.000227272727272735*G0_1_0_2_3_1 - 0.000281385281385285*G0_1_0_2_3_3 - 0.000735930735930759*G0_1_0_2_3_4 - 0.000562770562770581*G0_1_0_2_3_5 - 0.00746753246753272*G0_1_0_2_4_0 + 0.000919913419913451*G0_1_0_2_4_1 + 0.00176406926406932*G0_1_0_2_4_2 - 0.000735930735930759*G0_1_0_2_4_3 - 0.00883116883116912*G0_1_0_2_4_4 - 0.00350649350649362*G0_1_0_2_4_5 - 0.00432900432900448*G0_1_0_2_5_0 + 0.000919913419913452*G0_1_0_2_5_1 + 0.000833333333333361*G0_1_0_2_5_2 - 0.000562770562770581*G0_1_0_2_5_3 - 0.00350649350649362*G0_1_0_2_5_4 - 0.00406926406926421*G0_1_0_2_5_5 + 0.00313852813852822*G0_1_0_3_0_0 - 0.000551948051948069*G0_1_0_3_0_1 - 0.000551948051948069*G0_1_0_3_0_2 + 0.000346320346320356*G0_1_0_3_0_3 + 0.00238095238095245*G0_1_0_3_0_4 + 0.00238095238095246*G0_1_0_3_0_5 - 0.000551948051948069*G0_1_0_3_1_0 + 0.000227272727272735*G0_1_0_3_1_2 - 0.000281385281385298*G0_1_0_3_1_3 - 0.000562770562770582*G0_1_0_3_1_4 - 0.000735930735930762*G0_1_0_3_1_5 - 0.000551948051948069*G0_1_0_3_2_0 + 0.000227272727272735*G0_1_0_3_2_1 - 0.000281385281385285*G0_1_0_3_2_3 - 0.000735930735930759*G0_1_0_3_2_4 - 0.000562770562770581*G0_1_0_3_2_5 + 0.000346320346320356*G0_1_0_3_3_0 - 0.000281385281385298*G0_1_0_3_3_1 - 0.000281385281385285*G0_1_0_3_3_2 - 0.00207792207792214*G0_1_0_3_3_3 + 0.000432900432900448*G0_1_0_3_3_4 + 0.000432900432900443*G0_1_0_3_3_5 + 0.00238095238095245*G0_1_0_3_4_0 - 0.000562770562770582*G0_1_0_3_4_1 - 0.000735930735930759*G0_1_0_3_4_2 + 0.000432900432900447*G0_1_0_3_4_3 + 0.00337662337662349*G0_1_0_3_4_4 + 0.00225108225108232*G0_1_0_3_4_5 + 0.00238095238095246*G0_1_0_3_5_0 - 0.000735930735930761*G0_1_0_3_5_1 - 0.000562770562770581*G0_1_0_3_5_2 + 0.000432900432900443*G0_1_0_3_5_3 + 0.00225108225108232*G0_1_0_3_5_4 + 0.00337662337662348*G0_1_0_3_5_5 + 0.0485389610389627*G0_1_0_4_0_0 - 0.00432900432900447*G0_1_0_4_0_1 - 0.00746753246753272*G0_1_0_4_0_2 + 0.00238095238095245*G0_1_0_4_0_3 + 0.0346320346320358*G0_1_0_4_0_4 + 0.0173160173160179*G0_1_0_4_0_5 - 0.00432900432900447*G0_1_0_4_1_0 + 0.000833333333333361*G0_1_0_4_1_1 + 0.000919913419913451*G0_1_0_4_1_2 - 0.000562770562770582*G0_1_0_4_1_3 - 0.00406926406926421*G0_1_0_4_1_4 - 0.00350649350649363*G0_1_0_4_1_5 - 0.00746753246753272*G0_1_0_4_2_0 + 0.000919913419913451*G0_1_0_4_2_1 + 0.00176406926406932*G0_1_0_4_2_2 - 0.000735930735930759*G0_1_0_4_2_3 - 0.00883116883116912*G0_1_0_4_2_4 - 0.00350649350649362*G0_1_0_4_2_5 + 0.00238095238095245*G0_1_0_4_3_0 - 0.000562770562770582*G0_1_0_4_3_1 - 0.000735930735930759*G0_1_0_4_3_2 + 0.000432900432900447*G0_1_0_4_3_3 + 0.00337662337662349*G0_1_0_4_3_4 + 0.00225108225108232*G0_1_0_4_3_5 + 0.0346320346320358*G0_1_0_4_4_0 - 0.00406926406926421*G0_1_0_4_4_1 - 0.00883116883116912*G0_1_0_4_4_2 + 0.00337662337662349*G0_1_0_4_4_3 + 0.045454545454547*G0_1_0_4_4_4 + 0.0151515151515157*G0_1_0_4_4_5 + 0.0173160173160179*G0_1_0_4_5_0 - 0.00350649350649363*G0_1_0_4_5_1 - 0.00350649350649362*G0_1_0_4_5_2 + 0.00225108225108232*G0_1_0_4_5_3 + 0.0151515151515157*G0_1_0_4_5_4 + 0.0151515151515157*G0_1_0_4_5_5 + 0.0485389610389627*G0_1_0_5_0_0 - 0.00746753246753272*G0_1_0_5_0_1 - 0.00432900432900448*G0_1_0_5_0_2 + 0.00238095238095246*G0_1_0_5_0_3 + 0.0173160173160179*G0_1_0_5_0_4 + 0.0346320346320359*G0_1_0_5_0_5 - 0.00746753246753273*G0_1_0_5_1_0 + 0.00176406926406932*G0_1_0_5_1_1 + 0.000919913419913452*G0_1_0_5_1_2 - 0.000735930735930761*G0_1_0_5_1_3 - 0.00350649350649363*G0_1_0_5_1_4 - 0.00883116883116914*G0_1_0_5_1_5 - 0.00432900432900448*G0_1_0_5_2_0 + 0.000919913419913452*G0_1_0_5_2_1 + 0.000833333333333361*G0_1_0_5_2_2 - 0.000562770562770581*G0_1_0_5_2_3 - 0.00350649350649362*G0_1_0_5_2_4 - 0.00406926406926421*G0_1_0_5_2_5 + 0.00238095238095246*G0_1_0_5_3_0 - 0.000735930735930762*G0_1_0_5_3_1 - 0.00056277056277058*G0_1_0_5_3_2 + 0.000432900432900443*G0_1_0_5_3_3 + 0.00225108225108232*G0_1_0_5_3_4 + 0.00337662337662348*G0_1_0_5_3_5 + 0.0173160173160179*G0_1_0_5_4_0 - 0.00350649350649363*G0_1_0_5_4_1 - 0.00350649350649362*G0_1_0_5_4_2 + 0.00225108225108232*G0_1_0_5_4_3 + 0.0151515151515157*G0_1_0_5_4_4 + 0.0151515151515157*G0_1_0_5_4_5 + 0.0346320346320359*G0_1_0_5_5_0 - 0.00883116883116914*G0_1_0_5_5_1 - 0.00406926406926421*G0_1_0_5_5_2 + 0.00337662337662348*G0_1_0_5_5_3 + 0.0151515151515157*G0_1_0_5_5_4 + 0.045454545454547*G0_1_0_5_5_5; + A[5] = A[70] + 0.166233766233772*G0_0_0_0_0_0 - 0.00965909090909123*G0_0_0_0_0_1 - 0.013041125541126*G0_0_0_0_0_2 + 0.00313852813852822*G0_0_0_0_0_3 + 0.0567099567099586*G0_0_0_0_0_4 + 0.0403679653679668*G0_0_0_0_0_5 - 0.00965909090909123*G0_0_0_0_1_0 + 0.000727813852813877*G0_0_0_0_1_1 + 0.0010606060606061*G0_0_0_0_1_2 - 0.000936147186147216*G0_0_0_0_1_3 - 0.00487012987013003*G0_0_0_0_1_4 - 0.00551948051948071*G0_0_0_0_1_5 - 0.013041125541126*G0_0_0_0_2_0 + 0.0010606060606061*G0_0_0_0_2_1 + 0.00258387445887455*G0_0_0_0_2_2 - 0.000167748917748923*G0_0_0_0_2_3 - 0.00941558441558473*G0_0_0_0_2_4 - 0.00378787878787892*G0_0_0_0_2_5 + 0.00313852813852822*G0_0_0_0_3_0 - 0.000936147186147216*G0_0_0_0_3_1 - 0.000167748917748923*G0_0_0_0_3_2 + 0.000346320346320355*G0_0_0_0_3_3 + 0.00346320346320357*G0_0_0_0_3_4 + 0.00129870129870134*G0_0_0_0_3_5 + 0.0567099567099586*G0_0_0_0_4_0 - 0.00487012987013003*G0_0_0_0_4_1 - 0.00941558441558473*G0_0_0_0_4_2 + 0.00346320346320357*G0_0_0_0_4_3 + 0.0510822510822528*G0_0_0_0_4_4 + 0.0173160173160179*G0_0_0_0_4_5 + 0.0403679653679668*G0_0_0_0_5_0 - 0.00551948051948071*G0_0_0_0_5_1 - 0.00378787878787892*G0_0_0_0_5_2 + 0.00129870129870134*G0_0_0_0_5_3 + 0.0173160173160179*G0_0_0_0_5_4 + 0.0181818181818188*G0_0_0_0_5_5 - 0.00965909090909123*G0_0_0_1_0_0 + 0.000727813852813877*G0_0_0_1_0_1 + 0.0010606060606061*G0_0_0_1_0_2 - 0.000936147186147215*G0_0_0_1_0_3 - 0.00487012987013003*G0_0_0_1_0_4 - 0.00551948051948071*G0_0_0_1_0_5 + 0.000727813852813877*G0_0_0_1_1_0 + 0.0109253246753251*G0_0_0_1_1_1 - 0.00130140692640697*G0_0_0_1_1_2 + 0.00404220779220793*G0_0_0_1_1_3 + 0.000719696969696993*G0_0_0_1_1_4 + 0.00310064935064947*G0_0_0_1_1_5 + 0.0010606060606061*G0_0_0_1_2_0 - 0.00130140692640697*G0_0_0_1_2_1 + 0.000941558441558474*G0_0_0_1_2_2 + 0.000227272727272735*G0_0_0_1_2_3 + 0.00134740259740264*G0_0_0_1_2_4 + 0.000492424242424258*G0_0_0_1_2_5 - 0.000936147186147215*G0_0_0_1_3_0 + 0.00404220779220793*G0_0_0_1_3_1 + 0.000227272727272735*G0_0_0_1_3_2 + 0.00606060606060626*G0_0_0_1_3_3 + 0.000432900432900447*G0_0_0_1_3_4 + 0.000887445887445922*G0_0_0_1_3_5 - 0.00487012987013003*G0_0_0_1_4_0 + 0.000719696969696993*G0_0_0_1_4_1 + 0.00134740259740264*G0_0_0_1_4_2 + 0.000432900432900447*G0_0_0_1_4_3 - 0.00341991341991354*G0_0_0_1_4_4 - 0.00242424242424251*G0_0_0_1_4_5 - 0.00551948051948071*G0_0_0_1_5_0 + 0.00310064935064947*G0_0_0_1_5_1 + 0.000492424242424258*G0_0_0_1_5_2 + 0.000887445887445923*G0_0_0_1_5_3 - 0.00242424242424251*G0_0_0_1_5_4 - 0.000822510822510839*G0_0_0_1_5_5 - 0.013041125541126*G0_0_0_2_0_0 + 0.0010606060606061*G0_0_0_2_0_1 + 0.00258387445887455*G0_0_0_2_0_2 - 0.000167748917748923*G0_0_0_2_0_3 - 0.00941558441558473*G0_0_0_2_0_4 - 0.00378787878787892*G0_0_0_2_0_5 + 0.0010606060606061*G0_0_0_2_1_0 - 0.00130140692640697*G0_0_0_2_1_1 + 0.000941558441558474*G0_0_0_2_1_2 + 0.000227272727272735*G0_0_0_2_1_3 + 0.00134740259740264*G0_0_0_2_1_4 + 0.000492424242424258*G0_0_0_2_1_5 + 0.00258387445887455*G0_0_0_2_2_0 + 0.000941558441558474*G0_0_0_2_2_1 - 0.0125243506493511*G0_0_0_2_2_2 - 0.00416125541125556*G0_0_0_2_2_3 + 0.000427489177489185*G0_0_0_2_2_4 + 0.000946969696969727*G0_0_0_2_2_5 - 0.000167748917748923*G0_0_0_2_3_0 + 0.000227272727272735*G0_0_0_2_3_1 - 0.00416125541125556*G0_0_0_2_3_2 - 0.00662337662337685*G0_0_0_2_3_3 - 0.00235930735930744*G0_0_0_2_3_4 - 0.00155844155844161*G0_0_0_2_3_5 - 0.00941558441558473*G0_0_0_2_4_0 + 0.00134740259740264*G0_0_0_2_4_1 + 0.000427489177489185*G0_0_0_2_4_2 - 0.00235930735930744*G0_0_0_2_4_3 - 0.0168398268398274*G0_0_0_2_4_4 - 0.00458874458874474*G0_0_0_2_4_5 - 0.00378787878787892*G0_0_0_2_5_0 + 0.000492424242424258*G0_0_0_2_5_1 + 0.000946969696969727*G0_0_0_2_5_2 - 0.00155844155844161*G0_0_0_2_5_3 - 0.00458874458874474*G0_0_0_2_5_4 - 0.00471861471861488*G0_0_0_2_5_5 + 0.00313852813852822*G0_0_0_3_0_0 - 0.000936147186147216*G0_0_0_3_0_1 - 0.000167748917748923*G0_0_0_3_0_2 + 0.000346320346320355*G0_0_0_3_0_3 + 0.00346320346320357*G0_0_0_3_0_4 + 0.00129870129870134*G0_0_0_3_0_5 - 0.000936147186147215*G0_0_0_3_1_0 + 0.00404220779220793*G0_0_0_3_1_1 + 0.000227272727272735*G0_0_0_3_1_2 + 0.00606060606060626*G0_0_0_3_1_3 + 0.000432900432900447*G0_0_0_3_1_4 + 0.000887445887445923*G0_0_0_3_1_5 - 0.000167748917748923*G0_0_0_3_2_0 + 0.000227272727272735*G0_0_0_3_2_1 - 0.00416125541125556*G0_0_0_3_2_2 - 0.00662337662337685*G0_0_0_3_2_3 - 0.00235930735930744*G0_0_0_3_2_4 - 0.00155844155844161*G0_0_0_3_2_5 + 0.000346320346320356*G0_0_0_3_3_0 + 0.00606060606060626*G0_0_0_3_3_1 - 0.00662337662337685*G0_0_0_3_3_2 - 0.00207792207792216*G0_0_0_3_3_3 - 0.00155844155844161*G0_0_0_3_3_4 + 0.00242424242424251*G0_0_0_3_3_5 + 0.00346320346320357*G0_0_0_3_4_0 + 0.000432900432900447*G0_0_0_3_4_1 - 0.00235930735930744*G0_0_0_3_4_2 - 0.00155844155844161*G0_0_0_3_4_3 + 0.00225108225108232*G0_0_0_3_4_5 + 0.00129870129870134*G0_0_0_3_5_0 + 0.000887445887445922*G0_0_0_3_5_1 - 0.00155844155844161*G0_0_0_3_5_2 + 0.00242424242424251*G0_0_0_3_5_3 + 0.00225108225108232*G0_0_0_3_5_4 + 0.00683982683982707*G0_0_0_3_5_5 + 0.0567099567099586*G0_0_0_4_0_0 - 0.00487012987013003*G0_0_0_4_0_1 - 0.00941558441558473*G0_0_0_4_0_2 + 0.00346320346320357*G0_0_0_4_0_3 + 0.0510822510822528*G0_0_0_4_0_4 + 0.0173160173160179*G0_0_0_4_0_5 - 0.00487012987013003*G0_0_0_4_1_0 + 0.000719696969696993*G0_0_0_4_1_1 + 0.00134740259740264*G0_0_0_4_1_2 + 0.000432900432900447*G0_0_0_4_1_3 - 0.00341991341991354*G0_0_0_4_1_4 - 0.0024242424242425*G0_0_0_4_1_5 - 0.00941558441558473*G0_0_0_4_2_0 + 0.00134740259740264*G0_0_0_4_2_1 + 0.000427489177489184*G0_0_0_4_2_2 - 0.00235930735930744*G0_0_0_4_2_3 - 0.0168398268398274*G0_0_0_4_2_4 - 0.00458874458874474*G0_0_0_4_2_5 + 0.00346320346320357*G0_0_0_4_3_0 + 0.000432900432900447*G0_0_0_4_3_1 - 0.00235930735930744*G0_0_0_4_3_2 - 0.00155844155844161*G0_0_0_4_3_3 + 0.00225108225108232*G0_0_0_4_3_5 + 0.0510822510822528*G0_0_0_4_4_0 - 0.00341991341991354*G0_0_0_4_4_1 - 0.0168398268398274*G0_0_0_4_4_2 + 0.053246753246755*G0_0_0_4_4_4 + 0.0160173160173166*G0_0_0_4_4_5 + 0.0173160173160179*G0_0_0_4_5_0 - 0.00242424242424251*G0_0_0_4_5_1 - 0.00458874458874474*G0_0_0_4_5_2 + 0.00225108225108232*G0_0_0_4_5_3 + 0.0160173160173166*G0_0_0_4_5_4 + 0.0142857142857148*G0_0_0_4_5_5 + 0.0403679653679668*G0_0_0_5_0_0 - 0.00551948051948071*G0_0_0_5_0_1 - 0.00378787878787892*G0_0_0_5_0_2 + 0.00129870129870134*G0_0_0_5_0_3 + 0.0173160173160179*G0_0_0_5_0_4 + 0.0181818181818188*G0_0_0_5_0_5 - 0.00551948051948071*G0_0_0_5_1_0 + 0.00310064935064947*G0_0_0_5_1_1 + 0.000492424242424258*G0_0_0_5_1_2 + 0.000887445887445923*G0_0_0_5_1_3 - 0.00242424242424251*G0_0_0_5_1_4 - 0.000822510822510838*G0_0_0_5_1_5 - 0.00378787878787892*G0_0_0_5_2_0 + 0.000492424242424258*G0_0_0_5_2_1 + 0.000946969696969727*G0_0_0_5_2_2 - 0.00155844155844161*G0_0_0_5_2_3 - 0.00458874458874474*G0_0_0_5_2_4 - 0.00471861471861488*G0_0_0_5_2_5 + 0.00129870129870134*G0_0_0_5_3_0 + 0.000887445887445922*G0_0_0_5_3_1 - 0.00155844155844161*G0_0_0_5_3_2 + 0.00242424242424251*G0_0_0_5_3_3 + 0.00225108225108232*G0_0_0_5_3_4 + 0.00683982683982707*G0_0_0_5_3_5 + 0.0173160173160179*G0_0_0_5_4_0 - 0.00242424242424251*G0_0_0_5_4_1 - 0.00458874458874474*G0_0_0_5_4_2 + 0.00225108225108232*G0_0_0_5_4_3 + 0.0160173160173166*G0_0_0_5_4_4 + 0.0142857142857148*G0_0_0_5_4_5 + 0.0181818181818188*G0_0_0_5_5_0 - 0.000822510822510838*G0_0_0_5_5_1 - 0.00471861471861488*G0_0_0_5_5_2 + 0.00683982683982707*G0_0_0_5_5_3 + 0.0142857142857148*G0_0_0_5_5_4 + 0.037662337662339*G0_0_0_5_5_5 + 0.00169101731601737*G0_0_1_0_0_1 - 0.00169101731601737*G0_0_1_0_0_2 + 0.00817099567099593*G0_0_1_0_0_4 - 0.008170995670996*G0_0_1_0_0_5 + 0.00169101731601737*G0_0_1_0_1_0 - 0.000928030303030334*G0_0_1_0_1_1 - 0.000384199134199146*G0_0_1_0_1_3 - 0.000541125541125558*G0_0_1_0_1_4 + 0.00194805194805202*G0_0_1_0_1_5 - 0.00169101731601737*G0_0_1_0_2_0 + 0.000928030303030334*G0_0_1_0_2_2 + 0.000384199134199147*G0_0_1_0_2_3 - 0.00194805194805201*G0_0_1_0_2_4 + 0.00054112554112556*G0_0_1_0_2_5 - 0.000384199134199146*G0_0_1_0_3_1 + 0.000384199134199147*G0_0_1_0_3_2 + 0.00108225108225112*G0_0_1_0_3_4 - 0.00108225108225112*G0_0_1_0_3_5 + 0.00817099567099593*G0_0_1_0_4_0 - 0.000541125541125558*G0_0_1_0_4_1 - 0.00194805194805201*G0_0_1_0_4_2 + 0.00108225108225112*G0_0_1_0_4_3 + 0.016450216450217*G0_0_1_0_4_4 - 0.00817099567099599*G0_0_1_0_5_0 + 0.00194805194805202*G0_0_1_0_5_1 + 0.00054112554112556*G0_0_1_0_5_2 - 0.00108225108225112*G0_0_1_0_5_3 - 0.016450216450217*G0_0_1_0_5_5 + 0.00169101731601737*G0_0_1_1_0_0 - 0.000928030303030334*G0_0_1_1_0_1 - 0.000384199134199146*G0_0_1_1_0_3 - 0.000541125541125558*G0_0_1_1_0_4 + 0.00194805194805202*G0_0_1_1_0_5 - 0.000928030303030334*G0_0_1_1_1_0 + 0.0117248376623381*G0_0_1_1_1_1 - 0.00112148268398272*G0_0_1_1_1_2 + 0.00410173160173174*G0_0_1_1_1_3 - 0.000113636363636368*G0_0_1_1_1_4 + 0.00133658008658014*G0_0_1_1_1_5 - 0.00112148268398272*G0_0_1_1_2_1 + 0.00112148268398272*G0_0_1_1_2_2 + 0.000427489177489192*G0_0_1_1_2_4 - 0.000427489177489194*G0_0_1_1_2_5 - 0.000384199134199146*G0_0_1_1_3_0 + 0.00410173160173174*G0_0_1_1_3_1 + 0.00634199134199156*G0_0_1_1_3_3 + 0.000995670995671028*G0_0_1_1_3_4 + 0.00162337662337668*G0_0_1_1_3_5 - 0.000541125541125558*G0_0_1_1_4_0 - 0.000113636363636368*G0_0_1_1_4_1 + 0.000427489177489192*G0_0_1_1_4_2 + 0.000995670995671028*G0_0_1_1_4_3 + 0.00064935064935067*G0_0_1_1_4_4 + 0.00108225108225112*G0_0_1_1_4_5 + 0.00194805194805202*G0_0_1_1_5_0 + 0.00133658008658014*G0_0_1_1_5_1 - 0.000427489177489194*G0_0_1_1_5_2 + 0.00162337662337668*G0_0_1_1_5_3 + 0.00108225108225112*G0_0_1_1_5_4 + 0.0080086580086583*G0_0_1_1_5_5 - 0.00169101731601737*G0_0_1_2_0_0 + 0.000928030303030334*G0_0_1_2_0_2 + 0.000384199134199147*G0_0_1_2_0_3 - 0.00194805194805201*G0_0_1_2_0_4 + 0.00054112554112556*G0_0_1_2_0_5 - 0.00112148268398272*G0_0_1_2_1_1 + 0.00112148268398272*G0_0_1_2_1_2 + 0.000427489177489192*G0_0_1_2_1_4 - 0.000427489177489193*G0_0_1_2_1_5 + 0.000928030303030334*G0_0_1_2_2_0 + 0.00112148268398272*G0_0_1_2_2_1 - 0.0117248376623381*G0_0_1_2_2_2 - 0.00410173160173175*G0_0_1_2_2_3 - 0.00133658008658014*G0_0_1_2_2_4 + 0.000113636363636365*G0_0_1_2_2_5 + 0.000384199134199147*G0_0_1_2_3_0 - 0.00410173160173175*G0_0_1_2_3_2 - 0.00634199134199156*G0_0_1_2_3_3 - 0.00162337662337668*G0_0_1_2_3_4 - 0.000995670995671031*G0_0_1_2_3_5 - 0.00194805194805201*G0_0_1_2_4_0 + 0.000427489177489192*G0_0_1_2_4_1 - 0.00133658008658014*G0_0_1_2_4_2 - 0.00162337662337668*G0_0_1_2_4_3 - 0.00800865800865827*G0_0_1_2_4_4 - 0.00108225108225112*G0_0_1_2_4_5 + 0.00054112554112556*G0_0_1_2_5_0 - 0.000427489177489193*G0_0_1_2_5_1 + 0.000113636363636365*G0_0_1_2_5_2 - 0.000995670995671031*G0_0_1_2_5_3 - 0.00108225108225112*G0_0_1_2_5_4 - 0.000649350649350664*G0_0_1_2_5_5 - 0.000384199134199146*G0_0_1_3_0_1 + 0.000384199134199147*G0_0_1_3_0_2 + 0.00108225108225112*G0_0_1_3_0_4 - 0.00108225108225112*G0_0_1_3_0_5 - 0.000384199134199146*G0_0_1_3_1_0 + 0.00410173160173174*G0_0_1_3_1_1 + 0.00634199134199155*G0_0_1_3_1_3 + 0.000995670995671028*G0_0_1_3_1_4 + 0.00162337662337668*G0_0_1_3_1_5 + 0.000384199134199147*G0_0_1_3_2_0 - 0.00410173160173175*G0_0_1_3_2_2 - 0.00634199134199156*G0_0_1_3_2_3 - 0.00162337662337668*G0_0_1_3_2_4 - 0.000995670995671031*G0_0_1_3_2_5 + 0.00634199134199156*G0_0_1_3_3_1 - 0.00634199134199156*G0_0_1_3_3_2 - 0.00199134199134206*G0_0_1_3_3_4 + 0.00199134199134206*G0_0_1_3_3_5 + 0.00108225108225112*G0_0_1_3_4_0 + 0.000995670995671027*G0_0_1_3_4_1 - 0.00162337662337668*G0_0_1_3_4_2 - 0.00199134199134206*G0_0_1_3_4_3 - 0.00346320346320358*G0_0_1_3_4_4 - 0.00108225108225112*G0_0_1_3_5_0 + 0.00162337662337668*G0_0_1_3_5_1 - 0.000995670995671031*G0_0_1_3_5_2 + 0.00199134199134206*G0_0_1_3_5_3 + 0.00346320346320358*G0_0_1_3_5_5 + 0.00817099567099592*G0_0_1_4_0_0 - 0.000541125541125558*G0_0_1_4_0_1 - 0.00194805194805201*G0_0_1_4_0_2 + 0.00108225108225112*G0_0_1_4_0_3 + 0.016450216450217*G0_0_1_4_0_4 - 0.000541125541125558*G0_0_1_4_1_0 - 0.000113636363636368*G0_0_1_4_1_1 + 0.000427489177489192*G0_0_1_4_1_2 + 0.000995670995671028*G0_0_1_4_1_3 + 0.000649350649350669*G0_0_1_4_1_4 + 0.00108225108225112*G0_0_1_4_1_5 - 0.00194805194805201*G0_0_1_4_2_0 + 0.000427489177489192*G0_0_1_4_2_1 - 0.00133658008658014*G0_0_1_4_2_2 - 0.00162337662337668*G0_0_1_4_2_3 - 0.00800865800865827*G0_0_1_4_2_4 - 0.00108225108225112*G0_0_1_4_2_5 + 0.00108225108225112*G0_0_1_4_3_0 + 0.000995670995671027*G0_0_1_4_3_1 - 0.00162337662337668*G0_0_1_4_3_2 - 0.00199134199134206*G0_0_1_4_3_3 - 0.00346320346320358*G0_0_1_4_3_4 + 0.016450216450217*G0_0_1_4_4_0 + 0.000649350649350668*G0_0_1_4_4_1 - 0.00800865800865827*G0_0_1_4_4_2 - 0.00346320346320358*G0_0_1_4_4_3 + 0.00779220779220807*G0_0_1_4_4_4 + 0.000865800865800894*G0_0_1_4_4_5 + 0.00108225108225112*G0_0_1_4_5_1 - 0.00108225108225112*G0_0_1_4_5_2 + 0.000865800865800894*G0_0_1_4_5_4 - 0.000865800865800905*G0_0_1_4_5_5 - 0.008170995670996*G0_0_1_5_0_0 + 0.00194805194805202*G0_0_1_5_0_1 + 0.00054112554112556*G0_0_1_5_0_2 - 0.00108225108225112*G0_0_1_5_0_3 - 0.016450216450217*G0_0_1_5_0_5 + 0.00194805194805202*G0_0_1_5_1_0 + 0.00133658008658014*G0_0_1_5_1_1 - 0.000427489177489194*G0_0_1_5_1_2 + 0.00162337662337668*G0_0_1_5_1_3 + 0.00108225108225112*G0_0_1_5_1_4 + 0.0080086580086583*G0_0_1_5_1_5 + 0.00054112554112556*G0_0_1_5_2_0 - 0.000427489177489194*G0_0_1_5_2_1 + 0.000113636363636365*G0_0_1_5_2_2 - 0.00099567099567103*G0_0_1_5_2_3 - 0.00108225108225112*G0_0_1_5_2_4 - 0.000649350649350664*G0_0_1_5_2_5 - 0.00108225108225112*G0_0_1_5_3_0 + 0.00162337662337668*G0_0_1_5_3_1 - 0.000995670995671031*G0_0_1_5_3_2 + 0.00199134199134206*G0_0_1_5_3_3 + 0.00346320346320357*G0_0_1_5_3_5 + 0.00108225108225112*G0_0_1_5_4_1 - 0.00108225108225112*G0_0_1_5_4_2 + 0.000865800865800893*G0_0_1_5_4_4 - 0.000865800865800907*G0_0_1_5_4_5 - 0.016450216450217*G0_0_1_5_5_0 + 0.0080086580086583*G0_0_1_5_5_1 - 0.000649350649350663*G0_0_1_5_5_2 + 0.00346320346320358*G0_0_1_5_5_3 - 0.000865800865800907*G0_0_1_5_5_4 - 0.00779220779220814*G0_0_1_5_5_5 + 0.00169101731601738*G0_1_0_0_0_1 - 0.00169101731601737*G0_1_0_0_0_2 + 0.00817099567099594*G0_1_0_0_0_4 - 0.00817099567099597*G0_1_0_0_0_5 + 0.00169101731601738*G0_1_0_0_1_0 - 0.000928030303030335*G0_1_0_0_1_1 - 0.000384199134199147*G0_1_0_0_1_3 - 0.000541125541125557*G0_1_0_0_1_4 + 0.00194805194805202*G0_1_0_0_1_5 - 0.00169101731601737*G0_1_0_0_2_0 + 0.000928030303030334*G0_1_0_0_2_2 + 0.000384199134199147*G0_1_0_0_2_3 - 0.00194805194805201*G0_1_0_0_2_4 + 0.00054112554112556*G0_1_0_0_2_5 - 0.000384199134199147*G0_1_0_0_3_1 + 0.000384199134199146*G0_1_0_0_3_2 + 0.00108225108225112*G0_1_0_0_3_4 - 0.00108225108225112*G0_1_0_0_3_5 + 0.00817099567099594*G0_1_0_0_4_0 - 0.000541125541125558*G0_1_0_0_4_1 - 0.00194805194805201*G0_1_0_0_4_2 + 0.00108225108225112*G0_1_0_0_4_3 + 0.016450216450217*G0_1_0_0_4_4 - 0.00817099567099596*G0_1_0_0_5_0 + 0.00194805194805202*G0_1_0_0_5_1 + 0.00054112554112556*G0_1_0_0_5_2 - 0.00108225108225112*G0_1_0_0_5_3 - 0.016450216450217*G0_1_0_0_5_5 + 0.00169101731601738*G0_1_0_1_0_0 - 0.000928030303030335*G0_1_0_1_0_1 - 0.000384199134199147*G0_1_0_1_0_3 - 0.000541125541125558*G0_1_0_1_0_4 + 0.00194805194805202*G0_1_0_1_0_5 - 0.000928030303030335*G0_1_0_1_1_0 + 0.0117248376623381*G0_1_0_1_1_1 - 0.00112148268398272*G0_1_0_1_1_2 + 0.00410173160173174*G0_1_0_1_1_3 - 0.000113636363636368*G0_1_0_1_1_4 + 0.00133658008658014*G0_1_0_1_1_5 - 0.00112148268398272*G0_1_0_1_2_1 + 0.00112148268398272*G0_1_0_1_2_2 + 0.000427489177489192*G0_1_0_1_2_4 - 0.000427489177489193*G0_1_0_1_2_5 - 0.000384199134199147*G0_1_0_1_3_0 + 0.00410173160173174*G0_1_0_1_3_1 + 0.00634199134199156*G0_1_0_1_3_3 + 0.00099567099567103*G0_1_0_1_3_4 + 0.00162337662337668*G0_1_0_1_3_5 - 0.000541125541125558*G0_1_0_1_4_0 - 0.000113636363636368*G0_1_0_1_4_1 + 0.000427489177489192*G0_1_0_1_4_2 + 0.00099567099567103*G0_1_0_1_4_3 + 0.000649350649350671*G0_1_0_1_4_4 + 0.00108225108225112*G0_1_0_1_4_5 + 0.00194805194805202*G0_1_0_1_5_0 + 0.00133658008658014*G0_1_0_1_5_1 - 0.000427489177489193*G0_1_0_1_5_2 + 0.00162337662337668*G0_1_0_1_5_3 + 0.00108225108225112*G0_1_0_1_5_4 + 0.0080086580086583*G0_1_0_1_5_5 - 0.00169101731601737*G0_1_0_2_0_0 + 0.000928030303030334*G0_1_0_2_0_2 + 0.000384199134199147*G0_1_0_2_0_3 - 0.00194805194805201*G0_1_0_2_0_4 + 0.00054112554112556*G0_1_0_2_0_5 - 0.00112148268398272*G0_1_0_2_1_1 + 0.00112148268398272*G0_1_0_2_1_2 + 0.000427489177489192*G0_1_0_2_1_4 - 0.000427489177489193*G0_1_0_2_1_5 + 0.000928030303030334*G0_1_0_2_2_0 + 0.00112148268398272*G0_1_0_2_2_1 - 0.0117248376623381*G0_1_0_2_2_2 - 0.00410173160173175*G0_1_0_2_2_3 - 0.00133658008658014*G0_1_0_2_2_4 + 0.000113636363636365*G0_1_0_2_2_5 + 0.000384199134199146*G0_1_0_2_3_0 - 0.00410173160173175*G0_1_0_2_3_2 - 0.00634199134199157*G0_1_0_2_3_3 - 0.00162337662337668*G0_1_0_2_3_4 - 0.000995670995671031*G0_1_0_2_3_5 - 0.00194805194805201*G0_1_0_2_4_0 + 0.000427489177489192*G0_1_0_2_4_1 - 0.00133658008658014*G0_1_0_2_4_2 - 0.00162337662337668*G0_1_0_2_4_3 - 0.00800865800865828*G0_1_0_2_4_4 - 0.00108225108225112*G0_1_0_2_4_5 + 0.00054112554112556*G0_1_0_2_5_0 - 0.000427489177489193*G0_1_0_2_5_1 + 0.000113636363636365*G0_1_0_2_5_2 - 0.000995670995671031*G0_1_0_2_5_3 - 0.00108225108225112*G0_1_0_2_5_4 - 0.000649350649350672*G0_1_0_2_5_5 - 0.000384199134199147*G0_1_0_3_0_1 + 0.000384199134199146*G0_1_0_3_0_2 + 0.00108225108225112*G0_1_0_3_0_4 - 0.00108225108225112*G0_1_0_3_0_5 - 0.000384199134199147*G0_1_0_3_1_0 + 0.00410173160173174*G0_1_0_3_1_1 + 0.00634199134199156*G0_1_0_3_1_3 + 0.00099567099567103*G0_1_0_3_1_4 + 0.00162337662337668*G0_1_0_3_1_5 + 0.000384199134199146*G0_1_0_3_2_0 - 0.00410173160173175*G0_1_0_3_2_2 - 0.00634199134199157*G0_1_0_3_2_3 - 0.00162337662337668*G0_1_0_3_2_4 - 0.000995670995671031*G0_1_0_3_2_5 + 0.00634199134199156*G0_1_0_3_3_1 - 0.00634199134199157*G0_1_0_3_3_2 - 0.00199134199134206*G0_1_0_3_3_4 + 0.00199134199134206*G0_1_0_3_3_5 + 0.00108225108225112*G0_1_0_3_4_0 + 0.00099567099567103*G0_1_0_3_4_1 - 0.00162337662337668*G0_1_0_3_4_2 - 0.00199134199134206*G0_1_0_3_4_3 - 0.00346320346320359*G0_1_0_3_4_4 - 0.00108225108225112*G0_1_0_3_5_0 + 0.00162337662337668*G0_1_0_3_5_1 - 0.000995670995671031*G0_1_0_3_5_2 + 0.00199134199134206*G0_1_0_3_5_3 + 0.00346320346320358*G0_1_0_3_5_5 + 0.00817099567099594*G0_1_0_4_0_0 - 0.000541125541125558*G0_1_0_4_0_1 - 0.00194805194805201*G0_1_0_4_0_2 + 0.00108225108225112*G0_1_0_4_0_3 + 0.016450216450217*G0_1_0_4_0_4 - 0.000541125541125557*G0_1_0_4_1_0 - 0.000113636363636368*G0_1_0_4_1_1 + 0.000427489177489192*G0_1_0_4_1_2 + 0.00099567099567103*G0_1_0_4_1_3 + 0.000649350649350671*G0_1_0_4_1_4 + 0.00108225108225112*G0_1_0_4_1_5 - 0.00194805194805201*G0_1_0_4_2_0 + 0.000427489177489192*G0_1_0_4_2_1 - 0.00133658008658014*G0_1_0_4_2_2 - 0.00162337662337668*G0_1_0_4_2_3 - 0.00800865800865828*G0_1_0_4_2_4 - 0.00108225108225112*G0_1_0_4_2_5 + 0.00108225108225112*G0_1_0_4_3_0 + 0.00099567099567103*G0_1_0_4_3_1 - 0.00162337662337668*G0_1_0_4_3_2 - 0.00199134199134206*G0_1_0_4_3_3 - 0.00346320346320359*G0_1_0_4_3_4 + 0.016450216450217*G0_1_0_4_4_0 + 0.000649350649350671*G0_1_0_4_4_1 - 0.00800865800865828*G0_1_0_4_4_2 - 0.00346320346320359*G0_1_0_4_4_3 + 0.00779220779220804*G0_1_0_4_4_4 + 0.000865800865800889*G0_1_0_4_4_5 + 0.00108225108225112*G0_1_0_4_5_1 - 0.00108225108225112*G0_1_0_4_5_2 + 0.000865800865800887*G0_1_0_4_5_4 - 0.000865800865800899*G0_1_0_4_5_5 - 0.00817099567099596*G0_1_0_5_0_0 + 0.00194805194805202*G0_1_0_5_0_1 + 0.000541125541125559*G0_1_0_5_0_2 - 0.00108225108225112*G0_1_0_5_0_3 - 0.016450216450217*G0_1_0_5_0_5 + 0.00194805194805202*G0_1_0_5_1_0 + 0.00133658008658014*G0_1_0_5_1_1 - 0.000427489177489193*G0_1_0_5_1_2 + 0.00162337662337668*G0_1_0_5_1_3 + 0.00108225108225112*G0_1_0_5_1_4 + 0.0080086580086583*G0_1_0_5_1_5 + 0.00054112554112556*G0_1_0_5_2_0 - 0.000427489177489193*G0_1_0_5_2_1 + 0.000113636363636365*G0_1_0_5_2_2 - 0.000995670995671031*G0_1_0_5_2_3 - 0.00108225108225112*G0_1_0_5_2_4 - 0.000649350649350672*G0_1_0_5_2_5 - 0.00108225108225112*G0_1_0_5_3_0 + 0.00162337662337668*G0_1_0_5_3_1 - 0.000995670995671032*G0_1_0_5_3_2 + 0.00199134199134206*G0_1_0_5_3_3 + 0.00346320346320358*G0_1_0_5_3_5 + 0.00108225108225112*G0_1_0_5_4_1 - 0.00108225108225112*G0_1_0_5_4_2 + 0.000865800865800888*G0_1_0_5_4_4 - 0.0008658008658009*G0_1_0_5_4_5 - 0.016450216450217*G0_1_0_5_5_0 + 0.0080086580086583*G0_1_0_5_5_1 - 0.000649350649350671*G0_1_0_5_5_2 + 0.00346320346320358*G0_1_0_5_5_3 - 0.0008658008658009*G0_1_0_5_5_4 - 0.00779220779220808*G0_1_0_5_5_5 - 0.166233766233772*G0_1_1_0_0_0 + 0.013041125541126*G0_1_1_0_0_1 + 0.00965909090909124*G0_1_1_0_0_2 - 0.00313852813852822*G0_1_1_0_0_3 - 0.0403679653679667*G0_1_1_0_0_4 - 0.0567099567099587*G0_1_1_0_0_5 + 0.013041125541126*G0_1_1_0_1_0 - 0.00258387445887455*G0_1_1_0_1_1 - 0.0010606060606061*G0_1_1_0_1_2 + 0.000167748917748923*G0_1_1_0_1_3 + 0.00378787878787892*G0_1_1_0_1_4 + 0.00941558441558474*G0_1_1_0_1_5 + 0.00965909090909124*G0_1_1_0_2_0 - 0.0010606060606061*G0_1_1_0_2_1 - 0.000727813852813878*G0_1_1_0_2_2 + 0.000936147186147216*G0_1_1_0_2_3 + 0.0055194805194807*G0_1_1_0_2_4 + 0.00487012987013004*G0_1_1_0_2_5 - 0.00313852813852822*G0_1_1_0_3_0 + 0.000167748917748923*G0_1_1_0_3_1 + 0.000936147186147216*G0_1_1_0_3_2 - 0.000346320346320358*G0_1_1_0_3_3 - 0.00129870129870134*G0_1_1_0_3_4 - 0.00346320346320358*G0_1_1_0_3_5 - 0.0403679653679667*G0_1_1_0_4_0 + 0.00378787878787892*G0_1_1_0_4_1 + 0.0055194805194807*G0_1_1_0_4_2 - 0.00129870129870134*G0_1_1_0_4_3 - 0.0181818181818188*G0_1_1_0_4_4 - 0.0173160173160179*G0_1_1_0_4_5 - 0.0567099567099587*G0_1_1_0_5_0 + 0.00941558441558474*G0_1_1_0_5_1 + 0.00487012987013004*G0_1_1_0_5_2 - 0.00346320346320358*G0_1_1_0_5_3 - 0.0173160173160179*G0_1_1_0_5_4 - 0.0510822510822529*G0_1_1_0_5_5 + 0.013041125541126*G0_1_1_1_0_0 - 0.00258387445887455*G0_1_1_1_0_1 - 0.0010606060606061*G0_1_1_1_0_2 + 0.000167748917748923*G0_1_1_1_0_3 + 0.00378787878787892*G0_1_1_1_0_4 + 0.00941558441558475*G0_1_1_1_0_5 - 0.00258387445887455*G0_1_1_1_1_0 + 0.0125243506493511*G0_1_1_1_1_1 - 0.000941558441558474*G0_1_1_1_1_2 + 0.00416125541125555*G0_1_1_1_1_3 - 0.00094696969696973*G0_1_1_1_1_4 - 0.000427489177489186*G0_1_1_1_1_5 - 0.0010606060606061*G0_1_1_1_2_0 - 0.000941558441558474*G0_1_1_1_2_1 + 0.00130140692640697*G0_1_1_1_2_2 - 0.000227272727272734*G0_1_1_1_2_3 - 0.000492424242424259*G0_1_1_1_2_4 - 0.00134740259740264*G0_1_1_1_2_5 + 0.000167748917748923*G0_1_1_1_3_0 + 0.00416125541125555*G0_1_1_1_3_1 - 0.000227272727272734*G0_1_1_1_3_2 + 0.00662337662337685*G0_1_1_1_3_3 + 0.00155844155844161*G0_1_1_1_3_4 + 0.00235930735930744*G0_1_1_1_3_5 + 0.00378787878787892*G0_1_1_1_4_0 - 0.00094696969696973*G0_1_1_1_4_1 - 0.000492424242424259*G0_1_1_1_4_2 + 0.00155844155844161*G0_1_1_1_4_3 + 0.00471861471861488*G0_1_1_1_4_4 + 0.00458874458874475*G0_1_1_1_4_5 + 0.00941558441558474*G0_1_1_1_5_0 - 0.000427489177489187*G0_1_1_1_5_1 - 0.00134740259740264*G0_1_1_1_5_2 + 0.00235930735930744*G0_1_1_1_5_3 + 0.00458874458874475*G0_1_1_1_5_4 + 0.0168398268398274*G0_1_1_1_5_5 + 0.00965909090909124*G0_1_1_2_0_0 - 0.0010606060606061*G0_1_1_2_0_1 - 0.000727813852813878*G0_1_1_2_0_2 + 0.000936147186147216*G0_1_1_2_0_3 + 0.0055194805194807*G0_1_1_2_0_4 + 0.00487012987013004*G0_1_1_2_0_5 - 0.0010606060606061*G0_1_1_2_1_0 - 0.000941558441558474*G0_1_1_2_1_1 + 0.00130140692640697*G0_1_1_2_1_2 - 0.000227272727272734*G0_1_1_2_1_3 - 0.000492424242424259*G0_1_1_2_1_4 - 0.00134740259740264*G0_1_1_2_1_5 - 0.000727813852813878*G0_1_1_2_2_0 + 0.00130140692640697*G0_1_1_2_2_1 - 0.0109253246753251*G0_1_1_2_2_2 - 0.00404220779220794*G0_1_1_2_2_3 - 0.00310064935064946*G0_1_1_2_2_4 - 0.000719696969696997*G0_1_1_2_2_5 + 0.000936147186147216*G0_1_1_2_3_0 - 0.000227272727272734*G0_1_1_2_3_1 - 0.00404220779220794*G0_1_1_2_3_2 - 0.00606060606060628*G0_1_1_2_3_3 - 0.00088744588744592*G0_1_1_2_3_4 - 0.000432900432900449*G0_1_1_2_3_5 + 0.0055194805194807*G0_1_1_2_4_0 - 0.000492424242424259*G0_1_1_2_4_1 - 0.00310064935064946*G0_1_1_2_4_2 - 0.00088744588744592*G0_1_1_2_4_3 + 0.000822510822510847*G0_1_1_2_4_4 + 0.00242424242424251*G0_1_1_2_4_5 + 0.00487012987013004*G0_1_1_2_5_0 - 0.00134740259740264*G0_1_1_2_5_1 - 0.000719696969696997*G0_1_1_2_5_2 - 0.000432900432900449*G0_1_1_2_5_3 + 0.00242424242424251*G0_1_1_2_5_4 + 0.00341991341991355*G0_1_1_2_5_5 - 0.00313852813852822*G0_1_1_3_0_0 + 0.000167748917748923*G0_1_1_3_0_1 + 0.000936147186147216*G0_1_1_3_0_2 - 0.000346320346320357*G0_1_1_3_0_3 - 0.00129870129870134*G0_1_1_3_0_4 - 0.00346320346320358*G0_1_1_3_0_5 + 0.000167748917748923*G0_1_1_3_1_0 + 0.00416125541125555*G0_1_1_3_1_1 - 0.000227272727272734*G0_1_1_3_1_2 + 0.00662337662337685*G0_1_1_3_1_3 + 0.00155844155844161*G0_1_1_3_1_4 + 0.00235930735930744*G0_1_1_3_1_5 + 0.000936147186147216*G0_1_1_3_2_0 - 0.000227272727272734*G0_1_1_3_2_1 - 0.00404220779220794*G0_1_1_3_2_2 - 0.00606060606060628*G0_1_1_3_2_3 - 0.00088744588744592*G0_1_1_3_2_4 - 0.000432900432900449*G0_1_1_3_2_5 - 0.000346320346320357*G0_1_1_3_3_0 + 0.00662337662337685*G0_1_1_3_3_1 - 0.00606060606060628*G0_1_1_3_3_2 + 0.00207792207792214*G0_1_1_3_3_3 - 0.00242424242424251*G0_1_1_3_3_4 + 0.00155844155844161*G0_1_1_3_3_5 - 0.00129870129870134*G0_1_1_3_4_0 + 0.00155844155844161*G0_1_1_3_4_1 - 0.00088744588744592*G0_1_1_3_4_2 - 0.00242424242424251*G0_1_1_3_4_3 - 0.00683982683982707*G0_1_1_3_4_4 - 0.00225108225108233*G0_1_1_3_4_5 - 0.00346320346320358*G0_1_1_3_5_0 + 0.00235930735930744*G0_1_1_3_5_1 - 0.000432900432900449*G0_1_1_3_5_2 + 0.00155844155844161*G0_1_1_3_5_3 - 0.00225108225108233*G0_1_1_3_5_4 - 0.0403679653679667*G0_1_1_4_0_0 + 0.00378787878787892*G0_1_1_4_0_1 + 0.0055194805194807*G0_1_1_4_0_2 - 0.00129870129870134*G0_1_1_4_0_3 - 0.0181818181818188*G0_1_1_4_0_4 - 0.0173160173160179*G0_1_1_4_0_5 + 0.00378787878787892*G0_1_1_4_1_0 - 0.00094696969696973*G0_1_1_4_1_1 - 0.000492424242424259*G0_1_1_4_1_2 + 0.00155844155844161*G0_1_1_4_1_3 + 0.00471861471861488*G0_1_1_4_1_4 + 0.00458874458874475*G0_1_1_4_1_5 + 0.0055194805194807*G0_1_1_4_2_0 - 0.000492424242424259*G0_1_1_4_2_1 - 0.00310064935064946*G0_1_1_4_2_2 - 0.00088744588744592*G0_1_1_4_2_3 + 0.000822510822510847*G0_1_1_4_2_4 + 0.00242424242424251*G0_1_1_4_2_5 - 0.00129870129870134*G0_1_1_4_3_0 + 0.00155844155844161*G0_1_1_4_3_1 - 0.00088744588744592*G0_1_1_4_3_2 - 0.00242424242424251*G0_1_1_4_3_3 - 0.00683982683982707*G0_1_1_4_3_4 - 0.00225108225108233*G0_1_1_4_3_5 - 0.0181818181818188*G0_1_1_4_4_0 + 0.00471861471861488*G0_1_1_4_4_1 + 0.000822510822510847*G0_1_1_4_4_2 - 0.00683982683982707*G0_1_1_4_4_3 - 0.0376623376623389*G0_1_1_4_4_4 - 0.0142857142857148*G0_1_1_4_4_5 - 0.0173160173160179*G0_1_1_4_5_0 + 0.00458874458874475*G0_1_1_4_5_1 + 0.00242424242424251*G0_1_1_4_5_2 - 0.00225108225108233*G0_1_1_4_5_3 - 0.0142857142857148*G0_1_1_4_5_4 - 0.0160173160173166*G0_1_1_4_5_5 - 0.0567099567099587*G0_1_1_5_0_0 + 0.00941558441558474*G0_1_1_5_0_1 + 0.00487012987013004*G0_1_1_5_0_2 - 0.00346320346320358*G0_1_1_5_0_3 - 0.0173160173160179*G0_1_1_5_0_4 - 0.0510822510822529*G0_1_1_5_0_5 + 0.00941558441558474*G0_1_1_5_1_0 - 0.000427489177489186*G0_1_1_5_1_1 - 0.00134740259740265*G0_1_1_5_1_2 + 0.00235930735930744*G0_1_1_5_1_3 + 0.00458874458874475*G0_1_1_5_1_4 + 0.0168398268398274*G0_1_1_5_1_5 + 0.00487012987013004*G0_1_1_5_2_0 - 0.00134740259740265*G0_1_1_5_2_1 - 0.000719696969696997*G0_1_1_5_2_2 - 0.000432900432900449*G0_1_1_5_2_3 + 0.00242424242424251*G0_1_1_5_2_4 + 0.00341991341991355*G0_1_1_5_2_5 - 0.00346320346320358*G0_1_1_5_3_0 + 0.00235930735930744*G0_1_1_5_3_1 - 0.000432900432900449*G0_1_1_5_3_2 + 0.00155844155844161*G0_1_1_5_3_3 - 0.00225108225108233*G0_1_1_5_3_4 - 0.0173160173160179*G0_1_1_5_4_0 + 0.00458874458874475*G0_1_1_5_4_1 + 0.00242424242424251*G0_1_1_5_4_2 - 0.00225108225108233*G0_1_1_5_4_3 - 0.0142857142857148*G0_1_1_5_4_4 - 0.0160173160173166*G0_1_1_5_4_5 - 0.0510822510822529*G0_1_1_5_5_0 + 0.0168398268398274*G0_1_1_5_5_1 + 0.00341991341991355*G0_1_1_5_5_2 - 0.0160173160173166*G0_1_1_5_5_4 - 0.0532467532467552*G0_1_1_5_5_5; + A[50] = A[5] + 0.166233766233772*G0_0_1_0_0_0 - 0.0113501082251086*G0_0_1_0_0_1 - 0.0113501082251086*G0_0_1_0_0_2 + 0.00313852813852822*G0_0_1_0_0_3 + 0.0485389610389627*G0_0_1_0_0_4 + 0.0485389610389628*G0_0_1_0_0_5 - 0.0113501082251086*G0_0_1_0_1_0 + 0.00165584415584421*G0_0_1_0_1_1 + 0.0010606060606061*G0_0_1_0_1_2 - 0.000551948051948069*G0_0_1_0_1_3 - 0.00432900432900447*G0_0_1_0_1_4 - 0.00746753246753273*G0_0_1_0_1_5 - 0.0113501082251086*G0_0_1_0_2_0 + 0.0010606060606061*G0_0_1_0_2_1 + 0.00165584415584421*G0_0_1_0_2_2 - 0.000551948051948069*G0_0_1_0_2_3 - 0.00746753246753272*G0_0_1_0_2_4 - 0.00432900432900448*G0_0_1_0_2_5 + 0.00313852813852822*G0_0_1_0_3_0 - 0.000551948051948069*G0_0_1_0_3_1 - 0.000551948051948069*G0_0_1_0_3_2 + 0.000346320346320358*G0_0_1_0_3_3 + 0.00238095238095246*G0_0_1_0_3_4 + 0.00238095238095246*G0_0_1_0_3_5 + 0.0485389610389627*G0_0_1_0_4_0 - 0.00432900432900447*G0_0_1_0_4_1 - 0.00746753246753272*G0_0_1_0_4_2 + 0.00238095238095246*G0_0_1_0_4_3 + 0.0346320346320358*G0_0_1_0_4_4 + 0.0173160173160179*G0_0_1_0_4_5 + 0.0485389610389628*G0_0_1_0_5_0 - 0.00746753246753273*G0_0_1_0_5_1 - 0.00432900432900448*G0_0_1_0_5_2 + 0.00238095238095246*G0_0_1_0_5_3 + 0.0173160173160179*G0_0_1_0_5_4 + 0.0346320346320359*G0_0_1_0_5_5 - 0.0113501082251086*G0_0_1_1_0_0 + 0.00165584415584421*G0_0_1_1_0_1 + 0.0010606060606061*G0_0_1_1_0_2 - 0.000551948051948069*G0_0_1_1_0_3 - 0.00432900432900447*G0_0_1_1_0_4 - 0.00746753246753273*G0_0_1_1_0_5 + 0.00165584415584421*G0_0_1_1_1_0 - 0.000799512987013006*G0_0_1_1_1_1 - 0.000179924242424249*G0_0_1_1_1_2 + 0.000833333333333361*G0_0_1_1_1_4 + 0.00176406926406932*G0_0_1_1_1_5 + 0.0010606060606061*G0_0_1_1_2_0 - 0.000179924242424249*G0_0_1_1_2_1 - 0.000179924242424249*G0_0_1_1_2_2 + 0.000227272727272735*G0_0_1_1_2_3 + 0.000919913419913451*G0_0_1_1_2_4 + 0.000919913419913452*G0_0_1_1_2_5 - 0.000551948051948069*G0_0_1_1_3_0 + 0.000227272727272735*G0_0_1_1_3_2 - 0.000281385281385293*G0_0_1_1_3_3 - 0.000562770562770579*G0_0_1_1_3_4 - 0.00073593073593076*G0_0_1_1_3_5 - 0.00432900432900447*G0_0_1_1_4_0 + 0.000833333333333361*G0_0_1_1_4_1 + 0.000919913419913451*G0_0_1_1_4_2 - 0.000562770562770579*G0_0_1_1_4_3 - 0.0040692640692642*G0_0_1_1_4_4 - 0.00350649350649363*G0_0_1_1_4_5 - 0.00746753246753273*G0_0_1_1_5_0 + 0.00176406926406932*G0_0_1_1_5_1 + 0.000919913419913452*G0_0_1_1_5_2 - 0.00073593073593076*G0_0_1_1_5_3 - 0.00350649350649363*G0_0_1_1_5_4 - 0.00883116883116914*G0_0_1_1_5_5 - 0.0113501082251086*G0_0_1_2_0_0 + 0.0010606060606061*G0_0_1_2_0_1 + 0.00165584415584421*G0_0_1_2_0_2 - 0.000551948051948069*G0_0_1_2_0_3 - 0.00746753246753272*G0_0_1_2_0_4 - 0.00432900432900448*G0_0_1_2_0_5 + 0.0010606060606061*G0_0_1_2_1_0 - 0.000179924242424249*G0_0_1_2_1_1 - 0.000179924242424249*G0_0_1_2_1_2 + 0.000227272727272735*G0_0_1_2_1_3 + 0.000919913419913451*G0_0_1_2_1_4 + 0.000919913419913452*G0_0_1_2_1_5 + 0.00165584415584421*G0_0_1_2_2_0 - 0.000179924242424249*G0_0_1_2_2_1 - 0.000799512987013013*G0_0_1_2_2_2 + 0.00176406926406932*G0_0_1_2_2_4 + 0.000833333333333362*G0_0_1_2_2_5 - 0.000551948051948069*G0_0_1_2_3_0 + 0.000227272727272735*G0_0_1_2_3_1 - 0.000281385281385289*G0_0_1_2_3_3 - 0.000735930735930759*G0_0_1_2_3_4 - 0.000562770562770581*G0_0_1_2_3_5 - 0.00746753246753272*G0_0_1_2_4_0 + 0.000919913419913451*G0_0_1_2_4_1 + 0.00176406926406932*G0_0_1_2_4_2 - 0.000735930735930759*G0_0_1_2_4_3 - 0.00883116883116912*G0_0_1_2_4_4 - 0.00350649350649363*G0_0_1_2_4_5 - 0.00432900432900448*G0_0_1_2_5_0 + 0.000919913419913452*G0_0_1_2_5_1 + 0.000833333333333362*G0_0_1_2_5_2 - 0.000562770562770581*G0_0_1_2_5_3 - 0.00350649350649363*G0_0_1_2_5_4 - 0.00406926406926421*G0_0_1_2_5_5 + 0.00313852813852822*G0_0_1_3_0_0 - 0.000551948051948069*G0_0_1_3_0_1 - 0.00055194805194807*G0_0_1_3_0_2 + 0.000346320346320358*G0_0_1_3_0_3 + 0.00238095238095246*G0_0_1_3_0_4 + 0.00238095238095246*G0_0_1_3_0_5 - 0.00055194805194807*G0_0_1_3_1_0 + 0.000227272727272735*G0_0_1_3_1_2 - 0.000281385281385293*G0_0_1_3_1_3 - 0.000562770562770579*G0_0_1_3_1_4 - 0.00073593073593076*G0_0_1_3_1_5 - 0.000551948051948069*G0_0_1_3_2_0 + 0.000227272727272735*G0_0_1_3_2_1 - 0.00028138528138529*G0_0_1_3_2_3 - 0.000735930735930759*G0_0_1_3_2_4 - 0.000562770562770581*G0_0_1_3_2_5 + 0.000346320346320358*G0_0_1_3_3_0 - 0.000281385281385293*G0_0_1_3_3_1 - 0.000281385281385289*G0_0_1_3_3_2 - 0.00207792207792218*G0_0_1_3_3_3 + 0.000432900432900439*G0_0_1_3_3_4 + 0.000432900432900444*G0_0_1_3_3_5 + 0.00238095238095246*G0_0_1_3_4_0 - 0.000562770562770579*G0_0_1_3_4_1 - 0.000735930735930759*G0_0_1_3_4_2 + 0.000432900432900441*G0_0_1_3_4_3 + 0.00337662337662348*G0_0_1_3_4_4 + 0.00225108225108232*G0_0_1_3_4_5 + 0.00238095238095246*G0_0_1_3_5_0 - 0.00073593073593076*G0_0_1_3_5_1 - 0.000562770562770581*G0_0_1_3_5_2 + 0.000432900432900444*G0_0_1_3_5_3 + 0.00225108225108232*G0_0_1_3_5_4 + 0.00337662337662349*G0_0_1_3_5_5 + 0.0485389610389627*G0_0_1_4_0_0 - 0.00432900432900447*G0_0_1_4_0_1 - 0.00746753246753272*G0_0_1_4_0_2 + 0.00238095238095246*G0_0_1_4_0_3 + 0.0346320346320358*G0_0_1_4_0_4 + 0.0173160173160179*G0_0_1_4_0_5 - 0.00432900432900447*G0_0_1_4_1_0 + 0.000833333333333361*G0_0_1_4_1_1 + 0.000919913419913451*G0_0_1_4_1_2 - 0.00056277056277058*G0_0_1_4_1_3 - 0.0040692640692642*G0_0_1_4_1_4 - 0.00350649350649362*G0_0_1_4_1_5 - 0.00746753246753272*G0_0_1_4_2_0 + 0.000919913419913451*G0_0_1_4_2_1 + 0.00176406926406932*G0_0_1_4_2_2 - 0.000735930735930759*G0_0_1_4_2_3 - 0.00883116883116912*G0_0_1_4_2_4 - 0.00350649350649363*G0_0_1_4_2_5 + 0.00238095238095246*G0_0_1_4_3_0 - 0.000562770562770579*G0_0_1_4_3_1 - 0.00073593073593076*G0_0_1_4_3_2 + 0.000432900432900441*G0_0_1_4_3_3 + 0.00337662337662348*G0_0_1_4_3_4 + 0.00225108225108232*G0_0_1_4_3_5 + 0.0346320346320358*G0_0_1_4_4_0 - 0.0040692640692642*G0_0_1_4_4_1 - 0.00883116883116912*G0_0_1_4_4_2 + 0.00337662337662348*G0_0_1_4_4_3 + 0.0454545454545469*G0_0_1_4_4_4 + 0.0151515151515157*G0_0_1_4_4_5 + 0.0173160173160179*G0_0_1_4_5_0 - 0.00350649350649363*G0_0_1_4_5_1 - 0.00350649350649363*G0_0_1_4_5_2 + 0.00225108225108232*G0_0_1_4_5_3 + 0.0151515151515157*G0_0_1_4_5_4 + 0.0151515151515157*G0_0_1_4_5_5 + 0.0485389610389628*G0_0_1_5_0_0 - 0.00746753246753273*G0_0_1_5_0_1 - 0.00432900432900448*G0_0_1_5_0_2 + 0.00238095238095246*G0_0_1_5_0_3 + 0.0173160173160179*G0_0_1_5_0_4 + 0.0346320346320359*G0_0_1_5_0_5 - 0.00746753246753273*G0_0_1_5_1_0 + 0.00176406926406932*G0_0_1_5_1_1 + 0.000919913419913452*G0_0_1_5_1_2 - 0.00073593073593076*G0_0_1_5_1_3 - 0.00350649350649363*G0_0_1_5_1_4 - 0.00883116883116914*G0_0_1_5_1_5 - 0.00432900432900448*G0_0_1_5_2_0 + 0.000919913419913452*G0_0_1_5_2_1 + 0.000833333333333362*G0_0_1_5_2_2 - 0.000562770562770581*G0_0_1_5_2_3 - 0.00350649350649363*G0_0_1_5_2_4 - 0.00406926406926421*G0_0_1_5_2_5 + 0.00238095238095246*G0_0_1_5_3_0 - 0.00073593073593076*G0_0_1_5_3_1 - 0.000562770562770581*G0_0_1_5_3_2 + 0.000432900432900443*G0_0_1_5_3_3 + 0.00225108225108232*G0_0_1_5_3_4 + 0.00337662337662349*G0_0_1_5_3_5 + 0.0173160173160179*G0_0_1_5_4_0 - 0.00350649350649362*G0_0_1_5_4_1 - 0.00350649350649363*G0_0_1_5_4_2 + 0.00225108225108232*G0_0_1_5_4_3 + 0.0151515151515157*G0_0_1_5_4_4 + 0.0151515151515157*G0_0_1_5_4_5 + 0.0346320346320359*G0_0_1_5_5_0 - 0.00883116883116914*G0_0_1_5_5_1 - 0.00406926406926421*G0_0_1_5_5_2 + 0.00337662337662349*G0_0_1_5_5_3 + 0.0151515151515157*G0_0_1_5_5_4 + 0.0454545454545471*G0_0_1_5_5_5 - 0.166233766233772*G0_1_0_0_0_0 + 0.0113501082251086*G0_1_0_0_0_1 + 0.0113501082251086*G0_1_0_0_0_2 - 0.00313852813852822*G0_1_0_0_0_3 - 0.0485389610389627*G0_1_0_0_0_4 - 0.0485389610389628*G0_1_0_0_0_5 + 0.0113501082251086*G0_1_0_0_1_0 - 0.00165584415584421*G0_1_0_0_1_1 - 0.0010606060606061*G0_1_0_0_1_2 + 0.000551948051948069*G0_1_0_0_1_3 + 0.00432900432900447*G0_1_0_0_1_4 + 0.00746753246753273*G0_1_0_0_1_5 + 0.0113501082251086*G0_1_0_0_2_0 - 0.0010606060606061*G0_1_0_0_2_1 - 0.00165584415584421*G0_1_0_0_2_2 + 0.000551948051948069*G0_1_0_0_2_3 + 0.00746753246753272*G0_1_0_0_2_4 + 0.00432900432900448*G0_1_0_0_2_5 - 0.00313852813852822*G0_1_0_0_3_0 + 0.000551948051948069*G0_1_0_0_3_1 + 0.000551948051948069*G0_1_0_0_3_2 - 0.000346320346320358*G0_1_0_0_3_3 - 0.00238095238095246*G0_1_0_0_3_4 - 0.00238095238095246*G0_1_0_0_3_5 - 0.0485389610389627*G0_1_0_0_4_0 + 0.00432900432900447*G0_1_0_0_4_1 + 0.00746753246753272*G0_1_0_0_4_2 - 0.00238095238095246*G0_1_0_0_4_3 - 0.0346320346320358*G0_1_0_0_4_4 - 0.0173160173160179*G0_1_0_0_4_5 - 0.0485389610389628*G0_1_0_0_5_0 + 0.00746753246753273*G0_1_0_0_5_1 + 0.00432900432900448*G0_1_0_0_5_2 - 0.00238095238095246*G0_1_0_0_5_3 - 0.0173160173160179*G0_1_0_0_5_4 - 0.0346320346320359*G0_1_0_0_5_5 + 0.0113501082251086*G0_1_0_1_0_0 - 0.00165584415584421*G0_1_0_1_0_1 - 0.0010606060606061*G0_1_0_1_0_2 + 0.00055194805194807*G0_1_0_1_0_3 + 0.00432900432900447*G0_1_0_1_0_4 + 0.00746753246753273*G0_1_0_1_0_5 - 0.00165584415584421*G0_1_0_1_1_0 + 0.000799512987013006*G0_1_0_1_1_1 + 0.000179924242424249*G0_1_0_1_1_2 - 0.000833333333333361*G0_1_0_1_1_4 - 0.00176406926406932*G0_1_0_1_1_5 - 0.0010606060606061*G0_1_0_1_2_0 + 0.000179924242424249*G0_1_0_1_2_1 + 0.000179924242424249*G0_1_0_1_2_2 - 0.000227272727272735*G0_1_0_1_2_3 - 0.000919913419913451*G0_1_0_1_2_4 - 0.000919913419913452*G0_1_0_1_2_5 + 0.00055194805194807*G0_1_0_1_3_0 - 0.000227272727272735*G0_1_0_1_3_2 + 0.000281385281385293*G0_1_0_1_3_3 + 0.000562770562770579*G0_1_0_1_3_4 + 0.00073593073593076*G0_1_0_1_3_5 + 0.00432900432900447*G0_1_0_1_4_0 - 0.000833333333333361*G0_1_0_1_4_1 - 0.000919913419913451*G0_1_0_1_4_2 + 0.000562770562770579*G0_1_0_1_4_3 + 0.0040692640692642*G0_1_0_1_4_4 + 0.00350649350649363*G0_1_0_1_4_5 + 0.00746753246753273*G0_1_0_1_5_0 - 0.00176406926406932*G0_1_0_1_5_1 - 0.000919913419913452*G0_1_0_1_5_2 + 0.00073593073593076*G0_1_0_1_5_3 + 0.00350649350649363*G0_1_0_1_5_4 + 0.00883116883116914*G0_1_0_1_5_5 + 0.0113501082251086*G0_1_0_2_0_0 - 0.0010606060606061*G0_1_0_2_0_1 - 0.00165584415584421*G0_1_0_2_0_2 + 0.000551948051948069*G0_1_0_2_0_3 + 0.00746753246753272*G0_1_0_2_0_4 + 0.00432900432900448*G0_1_0_2_0_5 - 0.0010606060606061*G0_1_0_2_1_0 + 0.000179924242424249*G0_1_0_2_1_1 + 0.000179924242424249*G0_1_0_2_1_2 - 0.000227272727272735*G0_1_0_2_1_3 - 0.000919913419913451*G0_1_0_2_1_4 - 0.000919913419913452*G0_1_0_2_1_5 - 0.00165584415584421*G0_1_0_2_2_0 + 0.000179924242424249*G0_1_0_2_2_1 + 0.000799512987013013*G0_1_0_2_2_2 - 0.00176406926406932*G0_1_0_2_2_4 - 0.000833333333333362*G0_1_0_2_2_5 + 0.000551948051948069*G0_1_0_2_3_0 - 0.000227272727272735*G0_1_0_2_3_1 + 0.00028138528138529*G0_1_0_2_3_3 + 0.000735930735930759*G0_1_0_2_3_4 + 0.000562770562770581*G0_1_0_2_3_5 + 0.00746753246753272*G0_1_0_2_4_0 - 0.000919913419913451*G0_1_0_2_4_1 - 0.00176406926406932*G0_1_0_2_4_2 + 0.00073593073593076*G0_1_0_2_4_3 + 0.00883116883116912*G0_1_0_2_4_4 + 0.00350649350649363*G0_1_0_2_4_5 + 0.00432900432900448*G0_1_0_2_5_0 - 0.000919913419913452*G0_1_0_2_5_1 - 0.000833333333333362*G0_1_0_2_5_2 + 0.000562770562770581*G0_1_0_2_5_3 + 0.00350649350649363*G0_1_0_2_5_4 + 0.00406926406926421*G0_1_0_2_5_5 - 0.00313852813852822*G0_1_0_3_0_0 + 0.000551948051948069*G0_1_0_3_0_1 + 0.00055194805194807*G0_1_0_3_0_2 - 0.000346320346320358*G0_1_0_3_0_3 - 0.00238095238095246*G0_1_0_3_0_4 - 0.00238095238095246*G0_1_0_3_0_5 + 0.00055194805194807*G0_1_0_3_1_0 - 0.000227272727272735*G0_1_0_3_1_2 + 0.000281385281385293*G0_1_0_3_1_3 + 0.000562770562770579*G0_1_0_3_1_4 + 0.00073593073593076*G0_1_0_3_1_5 + 0.000551948051948069*G0_1_0_3_2_0 - 0.000227272727272735*G0_1_0_3_2_1 + 0.000281385281385291*G0_1_0_3_2_3 + 0.000735930735930759*G0_1_0_3_2_4 + 0.000562770562770581*G0_1_0_3_2_5 - 0.000346320346320358*G0_1_0_3_3_0 + 0.000281385281385293*G0_1_0_3_3_1 + 0.00028138528138529*G0_1_0_3_3_2 + 0.00207792207792217*G0_1_0_3_3_3 - 0.000432900432900441*G0_1_0_3_3_4 - 0.000432900432900445*G0_1_0_3_3_5 - 0.00238095238095246*G0_1_0_3_4_0 + 0.000562770562770579*G0_1_0_3_4_1 + 0.000735930735930759*G0_1_0_3_4_2 - 0.000432900432900441*G0_1_0_3_4_3 - 0.00337662337662348*G0_1_0_3_4_4 - 0.00225108225108232*G0_1_0_3_4_5 - 0.00238095238095246*G0_1_0_3_5_0 + 0.00073593073593076*G0_1_0_3_5_1 + 0.000562770562770581*G0_1_0_3_5_2 - 0.000432900432900445*G0_1_0_3_5_3 - 0.00225108225108232*G0_1_0_3_5_4 - 0.00337662337662349*G0_1_0_3_5_5 - 0.0485389610389627*G0_1_0_4_0_0 + 0.00432900432900447*G0_1_0_4_0_1 + 0.00746753246753272*G0_1_0_4_0_2 - 0.00238095238095246*G0_1_0_4_0_3 - 0.0346320346320358*G0_1_0_4_0_4 - 0.0173160173160179*G0_1_0_4_0_5 + 0.00432900432900447*G0_1_0_4_1_0 - 0.000833333333333361*G0_1_0_4_1_1 - 0.000919913419913451*G0_1_0_4_1_2 + 0.00056277056277058*G0_1_0_4_1_3 + 0.0040692640692642*G0_1_0_4_1_4 + 0.00350649350649362*G0_1_0_4_1_5 + 0.00746753246753272*G0_1_0_4_2_0 - 0.000919913419913451*G0_1_0_4_2_1 - 0.00176406926406932*G0_1_0_4_2_2 + 0.000735930735930759*G0_1_0_4_2_3 + 0.00883116883116912*G0_1_0_4_2_4 + 0.00350649350649363*G0_1_0_4_2_5 - 0.00238095238095246*G0_1_0_4_3_0 + 0.000562770562770579*G0_1_0_4_3_1 + 0.00073593073593076*G0_1_0_4_3_2 - 0.000432900432900441*G0_1_0_4_3_3 - 0.00337662337662348*G0_1_0_4_3_4 - 0.00225108225108232*G0_1_0_4_3_5 - 0.0346320346320358*G0_1_0_4_4_0 + 0.0040692640692642*G0_1_0_4_4_1 + 0.00883116883116912*G0_1_0_4_4_2 - 0.00337662337662348*G0_1_0_4_4_3 - 0.0454545454545469*G0_1_0_4_4_4 - 0.0151515151515157*G0_1_0_4_4_5 - 0.0173160173160179*G0_1_0_4_5_0 + 0.00350649350649363*G0_1_0_4_5_1 + 0.00350649350649363*G0_1_0_4_5_2 - 0.00225108225108232*G0_1_0_4_5_3 - 0.0151515151515157*G0_1_0_4_5_4 - 0.0151515151515157*G0_1_0_4_5_5 - 0.0485389610389628*G0_1_0_5_0_0 + 0.00746753246753273*G0_1_0_5_0_1 + 0.00432900432900448*G0_1_0_5_0_2 - 0.00238095238095246*G0_1_0_5_0_3 - 0.0173160173160179*G0_1_0_5_0_4 - 0.0346320346320359*G0_1_0_5_0_5 + 0.00746753246753273*G0_1_0_5_1_0 - 0.00176406926406932*G0_1_0_5_1_1 - 0.000919913419913452*G0_1_0_5_1_2 + 0.00073593073593076*G0_1_0_5_1_3 + 0.00350649350649363*G0_1_0_5_1_4 + 0.00883116883116914*G0_1_0_5_1_5 + 0.00432900432900448*G0_1_0_5_2_0 - 0.000919913419913452*G0_1_0_5_2_1 - 0.000833333333333362*G0_1_0_5_2_2 + 0.000562770562770581*G0_1_0_5_2_3 + 0.00350649350649363*G0_1_0_5_2_4 + 0.00406926406926421*G0_1_0_5_2_5 - 0.00238095238095246*G0_1_0_5_3_0 + 0.00073593073593076*G0_1_0_5_3_1 + 0.000562770562770581*G0_1_0_5_3_2 - 0.000432900432900444*G0_1_0_5_3_3 - 0.00225108225108232*G0_1_0_5_3_4 - 0.00337662337662349*G0_1_0_5_3_5 - 0.0173160173160179*G0_1_0_5_4_0 + 0.00350649350649362*G0_1_0_5_4_1 + 0.00350649350649363*G0_1_0_5_4_2 - 0.00225108225108232*G0_1_0_5_4_3 - 0.0151515151515157*G0_1_0_5_4_4 - 0.0151515151515157*G0_1_0_5_4_5 - 0.0346320346320359*G0_1_0_5_5_0 + 0.00883116883116914*G0_1_0_5_5_1 + 0.00406926406926421*G0_1_0_5_5_2 - 0.00337662337662349*G0_1_0_5_5_3 - 0.0151515151515157*G0_1_0_5_5_4 - 0.0454545454545471*G0_1_0_5_5_5; + A[44] = -A[64] + 0.00178977272727284*G0_1_0_0_0_0 - 0.000572240259740282*G0_1_0_0_0_1 - 0.000730519480519509*G0_1_0_0_0_2 + 0.00180194805194811*G0_1_0_0_0_3 + 0.00228896103896112*G0_1_0_0_0_4 + 0.00185064935064943*G0_1_0_0_0_5 - 0.000572240259740282*G0_1_0_0_1_0 - 0.000572240259740281*G0_1_0_0_1_1 - 0.000243506493506501*G0_1_0_0_1_2 + 0.00180194805194811*G0_1_0_0_1_3 + 0.00180194805194811*G0_1_0_0_1_4 + 0.000194805194805192*G0_1_0_0_1_5 - 0.000730519480519509*G0_1_0_0_2_0 - 0.000243506493506501*G0_1_0_0_2_1 + 0.00986201298701333*G0_1_0_0_2_2 + 0.000974025974026011*G0_1_0_0_2_3 + 0.00243506493506503*G0_1_0_0_2_4 - 0.0002435064935065*G0_1_0_0_2_5 + 0.00180194805194811*G0_1_0_0_3_0 + 0.00180194805194811*G0_1_0_0_3_1 + 0.000974025974026011*G0_1_0_0_3_2 - 0.0103246753246757*G0_1_0_0_3_3 - 0.00720779220779244*G0_1_0_0_3_4 - 0.00311688311688322*G0_1_0_0_3_5 + 0.00228896103896112*G0_1_0_0_4_0 + 0.00180194805194811*G0_1_0_0_4_1 + 0.00243506493506503*G0_1_0_0_4_2 - 0.00720779220779244*G0_1_0_0_4_3 - 0.0122727272727276*G0_1_0_0_4_4 - 0.00311688311688321*G0_1_0_0_4_5 + 0.00185064935064943*G0_1_0_0_5_0 + 0.000194805194805192*G0_1_0_0_5_1 - 0.0002435064935065*G0_1_0_0_5_2 - 0.00311688311688322*G0_1_0_0_5_3 - 0.00311688311688321*G0_1_0_0_5_4 - 0.000389610389610384*G0_1_0_0_5_5 - 0.000572240259740282*G0_1_0_1_0_0 - 0.000572240259740281*G0_1_0_1_0_1 - 0.000243506493506501*G0_1_0_1_0_2 + 0.00180194805194811*G0_1_0_1_0_3 + 0.00180194805194811*G0_1_0_1_0_4 + 0.000194805194805192*G0_1_0_1_0_5 - 0.000572240259740281*G0_1_0_1_1_0 + 0.00178977272727283*G0_1_0_1_1_1 - 0.000730519480519507*G0_1_0_1_1_2 + 0.00228896103896113*G0_1_0_1_1_3 + 0.00180194805194811*G0_1_0_1_1_4 + 0.00185064935064943*G0_1_0_1_1_5 - 0.000243506493506501*G0_1_0_1_2_0 - 0.000730519480519506*G0_1_0_1_2_1 + 0.00986201298701331*G0_1_0_1_2_2 + 0.00243506493506502*G0_1_0_1_2_3 + 0.00097402597402601*G0_1_0_1_2_4 - 0.0002435064935065*G0_1_0_1_2_5 + 0.00180194805194811*G0_1_0_1_3_0 + 0.00228896103896113*G0_1_0_1_3_1 + 0.00243506493506502*G0_1_0_1_3_2 - 0.0122727272727277*G0_1_0_1_3_3 - 0.00720779220779244*G0_1_0_1_3_4 - 0.00311688311688322*G0_1_0_1_3_5 + 0.00180194805194811*G0_1_0_1_4_0 + 0.00180194805194811*G0_1_0_1_4_1 + 0.00097402597402601*G0_1_0_1_4_2 - 0.00720779220779244*G0_1_0_1_4_3 - 0.0103246753246757*G0_1_0_1_4_4 - 0.00311688311688322*G0_1_0_1_4_5 + 0.000194805194805192*G0_1_0_1_5_0 + 0.00185064935064943*G0_1_0_1_5_1 - 0.0002435064935065*G0_1_0_1_5_2 - 0.00311688311688322*G0_1_0_1_5_3 - 0.00311688311688322*G0_1_0_1_5_4 - 0.000389610389610395*G0_1_0_1_5_5 - 0.00073051948051951*G0_1_0_2_0_0 - 0.000243506493506501*G0_1_0_2_0_1 + 0.00986201298701333*G0_1_0_2_0_2 + 0.000974025974026011*G0_1_0_2_0_3 + 0.00243506493506503*G0_1_0_2_0_4 - 0.0002435064935065*G0_1_0_2_0_5 - 0.000243506493506501*G0_1_0_2_1_0 - 0.000730519480519506*G0_1_0_2_1_1 + 0.00986201298701331*G0_1_0_2_1_2 + 0.00243506493506502*G0_1_0_2_1_3 + 0.00097402597402601*G0_1_0_2_1_4 - 0.0002435064935065*G0_1_0_2_1_5 + 0.00986201298701333*G0_1_0_2_2_0 + 0.00986201298701331*G0_1_0_2_2_1 - 0.201623376623384*G0_1_0_2_2_2 - 0.0409090909090923*G0_1_0_2_2_3 - 0.0409090909090924*G0_1_0_2_2_4 - 0.00146103896103904*G0_1_0_2_2_5 + 0.000974025974026012*G0_1_0_2_3_0 + 0.00243506493506502*G0_1_0_2_3_1 - 0.0409090909090923*G0_1_0_2_3_2 - 0.00779220779220807*G0_1_0_2_3_3 - 0.00389610389610405*G0_1_0_2_3_4 + 0.000974025974025994*G0_1_0_2_3_5 + 0.00243506493506503*G0_1_0_2_4_0 + 0.00097402597402601*G0_1_0_2_4_1 - 0.0409090909090924*G0_1_0_2_4_2 - 0.00389610389610405*G0_1_0_2_4_3 - 0.00779220779220813*G0_1_0_2_4_4 + 0.000974025974025994*G0_1_0_2_4_5 - 0.0002435064935065*G0_1_0_2_5_0 - 0.0002435064935065*G0_1_0_2_5_1 - 0.00146103896103904*G0_1_0_2_5_2 + 0.000974025974025994*G0_1_0_2_5_3 + 0.000974025974025994*G0_1_0_2_5_4 + 0.00180194805194811*G0_1_0_3_0_0 + 0.00180194805194811*G0_1_0_3_0_1 + 0.000974025974026011*G0_1_0_3_0_2 - 0.0103246753246757*G0_1_0_3_0_3 - 0.00720779220779244*G0_1_0_3_0_4 - 0.00311688311688322*G0_1_0_3_0_5 + 0.00180194805194811*G0_1_0_3_1_0 + 0.00228896103896113*G0_1_0_3_1_1 + 0.00243506493506502*G0_1_0_3_1_2 - 0.0122727272727277*G0_1_0_3_1_3 - 0.00720779220779245*G0_1_0_3_1_4 - 0.00311688311688322*G0_1_0_3_1_5 + 0.000974025974026011*G0_1_0_3_2_0 + 0.00243506493506502*G0_1_0_3_2_1 - 0.0409090909090923*G0_1_0_3_2_2 - 0.00779220779220807*G0_1_0_3_2_3 - 0.00389610389610405*G0_1_0_3_2_4 + 0.000974025974025994*G0_1_0_3_2_5 - 0.0103246753246757*G0_1_0_3_3_0 - 0.0122727272727277*G0_1_0_3_3_1 - 0.00779220779220807*G0_1_0_3_3_2 + 0.105194805194809*G0_1_0_3_3_3 + 0.0350649350649363*G0_1_0_3_3_4 + 0.0187012987012994*G0_1_0_3_3_5 - 0.00720779220779243*G0_1_0_3_4_0 - 0.00720779220779244*G0_1_0_3_4_1 - 0.00389610389610405*G0_1_0_3_4_2 + 0.0350649350649363*G0_1_0_3_4_3 + 0.0350649350649362*G0_1_0_3_4_4 + 0.0124675324675329*G0_1_0_3_4_5 - 0.00311688311688322*G0_1_0_3_5_0 - 0.00311688311688322*G0_1_0_3_5_1 + 0.000974025974025994*G0_1_0_3_5_2 + 0.0187012987012994*G0_1_0_3_5_3 + 0.0124675324675329*G0_1_0_3_5_4 + 0.00623376623376648*G0_1_0_3_5_5 + 0.00228896103896112*G0_1_0_4_0_0 + 0.00180194805194811*G0_1_0_4_0_1 + 0.00243506493506503*G0_1_0_4_0_2 - 0.00720779220779243*G0_1_0_4_0_3 - 0.0122727272727276*G0_1_0_4_0_4 - 0.00311688311688321*G0_1_0_4_0_5 + 0.00180194805194811*G0_1_0_4_1_0 + 0.00180194805194811*G0_1_0_4_1_1 + 0.00097402597402601*G0_1_0_4_1_2 - 0.00720779220779245*G0_1_0_4_1_3 - 0.0103246753246757*G0_1_0_4_1_4 - 0.00311688311688322*G0_1_0_4_1_5 + 0.00243506493506503*G0_1_0_4_2_0 + 0.00097402597402601*G0_1_0_4_2_1 - 0.0409090909090924*G0_1_0_4_2_2 - 0.00389610389610405*G0_1_0_4_2_3 - 0.00779220779220813*G0_1_0_4_2_4 + 0.000974025974025994*G0_1_0_4_2_5 - 0.00720779220779243*G0_1_0_4_3_0 - 0.00720779220779244*G0_1_0_4_3_1 - 0.00389610389610405*G0_1_0_4_3_2 + 0.0350649350649363*G0_1_0_4_3_3 + 0.0350649350649362*G0_1_0_4_3_4 + 0.0124675324675329*G0_1_0_4_3_5 - 0.0122727272727276*G0_1_0_4_4_0 - 0.0103246753246757*G0_1_0_4_4_1 - 0.00779220779220813*G0_1_0_4_4_2 + 0.0350649350649362*G0_1_0_4_4_3 + 0.105194805194808*G0_1_0_4_4_4 + 0.0187012987012993*G0_1_0_4_4_5 - 0.00311688311688321*G0_1_0_4_5_0 - 0.00311688311688322*G0_1_0_4_5_1 + 0.000974025974025994*G0_1_0_4_5_2 + 0.0124675324675329*G0_1_0_4_5_3 + 0.0187012987012993*G0_1_0_4_5_4 + 0.00623376623376647*G0_1_0_4_5_5 + 0.00185064935064943*G0_1_0_5_0_0 + 0.000194805194805192*G0_1_0_5_0_1 - 0.0002435064935065*G0_1_0_5_0_2 - 0.00311688311688322*G0_1_0_5_0_3 - 0.00311688311688321*G0_1_0_5_0_4 - 0.000389610389610384*G0_1_0_5_0_5 + 0.000194805194805192*G0_1_0_5_1_0 + 0.00185064935064943*G0_1_0_5_1_1 - 0.0002435064935065*G0_1_0_5_1_2 - 0.00311688311688322*G0_1_0_5_1_3 - 0.00311688311688322*G0_1_0_5_1_4 - 0.000389610389610395*G0_1_0_5_1_5 - 0.0002435064935065*G0_1_0_5_2_0 - 0.0002435064935065*G0_1_0_5_2_1 - 0.00146103896103904*G0_1_0_5_2_2 + 0.000974025974025994*G0_1_0_5_2_3 + 0.000974025974025994*G0_1_0_5_2_4 - 0.00311688311688322*G0_1_0_5_3_0 - 0.00311688311688322*G0_1_0_5_3_1 + 0.000974025974025993*G0_1_0_5_3_2 + 0.0187012987012994*G0_1_0_5_3_3 + 0.0124675324675329*G0_1_0_5_3_4 + 0.00623376623376648*G0_1_0_5_3_5 - 0.00311688311688321*G0_1_0_5_4_0 - 0.00311688311688322*G0_1_0_5_4_1 + 0.000974025974025994*G0_1_0_5_4_2 + 0.0124675324675329*G0_1_0_5_4_3 + 0.0187012987012993*G0_1_0_5_4_4 + 0.00623376623376647*G0_1_0_5_4_5 - 0.000389610389610384*G0_1_0_5_5_0 - 0.000389610389610395*G0_1_0_5_5_1 + 0.00623376623376648*G0_1_0_5_5_3 + 0.00623376623376647*G0_1_0_5_5_4 + 0.0140259740259747*G0_1_0_5_5_5 + 0.00354301948051969*G0_1_1_0_0_0 - 0.000706168831168862*G0_1_1_0_0_1 - 0.000718344155844183*G0_1_1_0_0_2 + 0.00633116883116902*G0_1_1_0_0_3 + 0.00521103896103913*G0_1_1_0_0_4 + 0.0096428571428575*G0_1_1_0_0_5 - 0.000706168831168862*G0_1_1_0_1_0 - 0.00614853896103917*G0_1_1_0_1_1 + 0.000474837662337678*G0_1_1_0_1_2 + 0.0024837662337663*G0_1_1_0_1_3 + 0.00282467532467541*G0_1_1_0_1_4 - 0.00535714285714305*G0_1_1_0_1_5 - 0.000718344155844183*G0_1_1_0_2_0 + 0.000474837662337679*G0_1_1_0_2_1 + 0.000365259740259756*G0_1_1_0_2_2 + 0.00194805194805201*G0_1_1_0_2_3 + 0.000487012987013004*G0_1_1_0_2_4 + 0.001461038961039*G0_1_1_0_2_5 + 0.00633116883116902*G0_1_1_0_3_0 + 0.00248376623376631*G0_1_1_0_3_1 + 0.00194805194805201*G0_1_1_0_3_2 - 0.0395454545454558*G0_1_1_0_3_3 - 0.0183116883116889*G0_1_1_0_3_4 - 0.0155844155844161*G0_1_1_0_3_5 + 0.00521103896103913*G0_1_1_0_4_0 + 0.00282467532467541*G0_1_1_0_4_1 + 0.000487012987013004*G0_1_1_0_4_2 - 0.0183116883116889*G0_1_1_0_4_3 - 0.0153896103896109*G0_1_1_0_4_4 - 0.00857142857142883*G0_1_1_0_4_5 + 0.0096428571428575*G0_1_1_0_5_0 - 0.00535714285714305*G0_1_1_0_5_1 + 0.001461038961039*G0_1_1_0_5_2 - 0.0155844155844161*G0_1_1_0_5_3 - 0.00857142857142883*G0_1_1_0_5_4 - 0.0105194805194808*G0_1_1_0_5_5 - 0.000706168831168862*G0_1_1_1_0_0 - 0.00614853896103917*G0_1_1_1_0_1 + 0.000474837662337679*G0_1_1_1_0_2 + 0.0024837662337663*G0_1_1_1_0_3 + 0.00282467532467541*G0_1_1_1_0_4 - 0.00535714285714305*G0_1_1_1_0_5 - 0.00614853896103917*G0_1_1_1_1_0 + 0.057711038961041*G0_1_1_1_1_1 - 0.00308035714285725*G0_1_1_1_1_2 + 0.0177272727272733*G0_1_1_1_1_3 + 0.00521103896103912*G0_1_1_1_1_4 + 0.0290259740259751*G0_1_1_1_1_5 + 0.000474837662337679*G0_1_1_1_2_0 - 0.00308035714285725*G0_1_1_1_2_1 + 0.00194805194805202*G0_1_1_1_2_2 - 0.00292207792207804*G0_1_1_1_2_3 + 0.000487012987013001*G0_1_1_1_2_4 - 0.000925324675324711*G0_1_1_1_2_5 + 0.00248376623376631*G0_1_1_1_3_0 + 0.0177272727272733*G0_1_1_1_3_1 - 0.00292207792207804*G0_1_1_1_3_2 - 0.0132467532467536*G0_1_1_1_3_3 - 0.0153896103896109*G0_1_1_1_3_4 - 0.00311688311688319*G0_1_1_1_3_5 + 0.00282467532467541*G0_1_1_1_4_0 + 0.00521103896103912*G0_1_1_1_4_1 + 0.000487012987013002*G0_1_1_1_4_2 - 0.0153896103896109*G0_1_1_1_4_3 - 0.0183116883116889*G0_1_1_1_4_4 - 0.00857142857142885*G0_1_1_1_4_5 - 0.00535714285714305*G0_1_1_1_5_0 + 0.0290259740259751*G0_1_1_1_5_1 - 0.000925324675324711*G0_1_1_1_5_2 - 0.00311688311688319*G0_1_1_1_5_3 - 0.00857142857142885*G0_1_1_1_5_4 + 0.0194805194805202*G0_1_1_1_5_5 - 0.000718344155844183*G0_1_1_2_0_0 + 0.000474837662337679*G0_1_1_2_0_1 + 0.000365259740259756*G0_1_1_2_0_2 + 0.00194805194805201*G0_1_1_2_0_3 + 0.000487012987013004*G0_1_1_2_0_4 + 0.001461038961039*G0_1_1_2_0_5 + 0.000474837662337679*G0_1_1_2_1_0 - 0.00308035714285725*G0_1_1_2_1_1 + 0.00194805194805202*G0_1_1_2_1_2 - 0.00292207792207804*G0_1_1_2_1_3 + 0.000487012987013002*G0_1_1_2_1_4 - 0.000925324675324711*G0_1_1_2_1_5 + 0.000365259740259756*G0_1_1_2_2_0 + 0.00194805194805202*G0_1_1_2_2_1 - 0.0244724025974035*G0_1_1_2_2_2 - 0.00292207792207803*G0_1_1_2_2_3 - 0.00146103896103904*G0_1_1_2_2_4 + 0.00243506493506501*G0_1_1_2_2_5 + 0.00194805194805201*G0_1_1_2_3_0 - 0.00292207792207803*G0_1_1_2_3_1 - 0.00292207792207803*G0_1_1_2_3_2 - 0.0146103896103901*G0_1_1_2_3_3 - 0.00487012987013003*G0_1_1_2_3_4 - 0.00876623376623406*G0_1_1_2_3_5 + 0.000487012987013004*G0_1_1_2_4_0 + 0.000487012987013002*G0_1_1_2_4_1 - 0.00146103896103903*G0_1_1_2_4_2 - 0.00487012987013003*G0_1_1_2_4_3 - 0.00487012987013004*G0_1_1_2_4_4 - 0.00584415584415604*G0_1_1_2_4_5 + 0.001461038961039*G0_1_1_2_5_0 - 0.000925324675324711*G0_1_1_2_5_1 + 0.00243506493506501*G0_1_1_2_5_2 - 0.00876623376623406*G0_1_1_2_5_3 - 0.00584415584415604*G0_1_1_2_5_4 - 0.0124675324675329*G0_1_1_2_5_5 + 0.00633116883116902*G0_1_1_3_0_0 + 0.00248376623376631*G0_1_1_3_0_1 + 0.00194805194805201*G0_1_1_3_0_2 - 0.0395454545454558*G0_1_1_3_0_3 - 0.0183116883116889*G0_1_1_3_0_4 - 0.0155844155844161*G0_1_1_3_0_5 + 0.00248376623376631*G0_1_1_3_1_0 + 0.0177272727272733*G0_1_1_3_1_1 - 0.00292207792207803*G0_1_1_3_1_2 - 0.0132467532467536*G0_1_1_3_1_3 - 0.0153896103896109*G0_1_1_3_1_4 - 0.00311688311688319*G0_1_1_3_1_5 + 0.00194805194805201*G0_1_1_3_2_0 - 0.00292207792207804*G0_1_1_3_2_1 - 0.00292207792207803*G0_1_1_3_2_2 - 0.0146103896103901*G0_1_1_3_2_3 - 0.00487012987013003*G0_1_1_3_2_4 - 0.00876623376623406*G0_1_1_3_2_5 - 0.0395454545454558*G0_1_1_3_3_0 - 0.0132467532467536*G0_1_1_3_3_1 - 0.0146103896103901*G0_1_1_3_3_2 + 0.439480519480535*G0_1_1_3_3_3 + 0.109870129870133*G0_1_1_3_3_4 + 0.0966233766233799*G0_1_1_3_3_5 - 0.0183116883116889*G0_1_1_3_4_0 - 0.0153896103896109*G0_1_1_3_4_1 - 0.00487012987013003*G0_1_1_3_4_2 + 0.109870129870133*G0_1_1_3_4_3 + 0.0732467532467556*G0_1_1_3_4_4 + 0.0483116883116899*G0_1_1_3_4_5 - 0.0155844155844161*G0_1_1_3_5_0 - 0.00311688311688319*G0_1_1_3_5_1 - 0.00876623376623406*G0_1_1_3_5_2 + 0.0966233766233799*G0_1_1_3_5_3 + 0.0483116883116899*G0_1_1_3_5_4 + 0.056103896103898*G0_1_1_3_5_5 + 0.00521103896103913*G0_1_1_4_0_0 + 0.00282467532467541*G0_1_1_4_0_1 + 0.000487012987013004*G0_1_1_4_0_2 - 0.0183116883116889*G0_1_1_4_0_3 - 0.0153896103896109*G0_1_1_4_0_4 - 0.00857142857142883*G0_1_1_4_0_5 + 0.00282467532467541*G0_1_1_4_1_0 + 0.00521103896103912*G0_1_1_4_1_1 + 0.000487012987013002*G0_1_1_4_1_2 - 0.0153896103896109*G0_1_1_4_1_3 - 0.0183116883116889*G0_1_1_4_1_4 - 0.00857142857142885*G0_1_1_4_1_5 + 0.000487012987013004*G0_1_1_4_2_0 + 0.000487012987013002*G0_1_1_4_2_1 - 0.00146103896103903*G0_1_1_4_2_2 - 0.00487012987013003*G0_1_1_4_2_3 - 0.00487012987013004*G0_1_1_4_2_4 - 0.00584415584415604*G0_1_1_4_2_5 - 0.0183116883116889*G0_1_1_4_3_0 - 0.0153896103896109*G0_1_1_4_3_1 - 0.00487012987013003*G0_1_1_4_3_2 + 0.109870129870133*G0_1_1_4_3_3 + 0.0732467532467556*G0_1_1_4_3_4 + 0.0483116883116899*G0_1_1_4_3_5 - 0.0153896103896109*G0_1_1_4_4_0 - 0.0183116883116889*G0_1_1_4_4_1 - 0.00487012987013004*G0_1_1_4_4_2 + 0.0732467532467556*G0_1_1_4_4_3 + 0.109870129870133*G0_1_1_4_4_4 + 0.0483116883116899*G0_1_1_4_4_5 - 0.00857142857142883*G0_1_1_4_5_0 - 0.00857142857142885*G0_1_1_4_5_1 - 0.00584415584415604*G0_1_1_4_5_2 + 0.0483116883116899*G0_1_1_4_5_3 + 0.0483116883116899*G0_1_1_4_5_4 + 0.0420779220779235*G0_1_1_4_5_5 + 0.0096428571428575*G0_1_1_5_0_0 - 0.00535714285714305*G0_1_1_5_0_1 + 0.001461038961039*G0_1_1_5_0_2 - 0.0155844155844161*G0_1_1_5_0_3 - 0.00857142857142883*G0_1_1_5_0_4 - 0.0105194805194808*G0_1_1_5_0_5 - 0.00535714285714305*G0_1_1_5_1_0 + 0.0290259740259751*G0_1_1_5_1_1 - 0.000925324675324711*G0_1_1_5_1_2 - 0.00311688311688319*G0_1_1_5_1_3 - 0.00857142857142885*G0_1_1_5_1_4 + 0.0194805194805202*G0_1_1_5_1_5 + 0.001461038961039*G0_1_1_5_2_0 - 0.000925324675324711*G0_1_1_5_2_1 + 0.00243506493506501*G0_1_1_5_2_2 - 0.00876623376623406*G0_1_1_5_2_3 - 0.00584415584415604*G0_1_1_5_2_4 - 0.0124675324675329*G0_1_1_5_2_5 - 0.0155844155844161*G0_1_1_5_3_0 - 0.00311688311688319*G0_1_1_5_3_1 - 0.00876623376623406*G0_1_1_5_3_2 + 0.0966233766233799*G0_1_1_5_3_3 + 0.0483116883116899*G0_1_1_5_3_4 + 0.056103896103898*G0_1_1_5_3_5 - 0.00857142857142883*G0_1_1_5_4_0 - 0.00857142857142885*G0_1_1_5_4_1 - 0.00584415584415604*G0_1_1_5_4_2 + 0.0483116883116899*G0_1_1_5_4_3 + 0.0483116883116899*G0_1_1_5_4_4 + 0.0420779220779235*G0_1_1_5_4_5 - 0.0105194805194808*G0_1_1_5_5_0 + 0.0194805194805202*G0_1_1_5_5_1 - 0.0124675324675329*G0_1_1_5_5_2 + 0.056103896103898*G0_1_1_5_5_3 + 0.0420779220779235*G0_1_1_5_5_4 + 0.201038961038968*G0_1_1_5_5_5; + A[0] = A[22] + 0.0918019480519512*G0_0_0_0_0_0 - 0.0058531746031748*G0_0_0_0_0_1 - 0.0058531746031748*G0_0_0_0_0_2 + 0.00164141414141418*G0_0_0_0_0_3 + 0.0250541125541134*G0_0_0_0_0_4 + 0.0250541125541134*G0_0_0_0_0_5 - 0.0058531746031748*G0_0_0_0_1_0 + 0.00061868686868689*G0_0_0_0_1_1 + 0.000523989898989917*G0_0_0_0_1_2 - 0.000227272727272735*G0_0_0_0_1_3 - 0.00189393939393946*G0_0_0_0_1_4 - 0.00353535353535366*G0_0_0_0_1_5 - 0.0058531746031748*G0_0_0_0_2_0 + 0.000523989898989917*G0_0_0_0_2_1 + 0.00061868686868689*G0_0_0_0_2_2 - 0.000227272727272734*G0_0_0_0_2_3 - 0.00353535353535365*G0_0_0_0_2_4 - 0.00189393939393946*G0_0_0_0_2_5 + 0.00164141414141418*G0_0_0_0_3_0 - 0.000227272727272734*G0_0_0_0_3_1 - 0.000227272727272734*G0_0_0_0_3_2 - 0.000808080808080831*G0_0_0_0_3_3 + 0.00050505050505052*G0_0_0_0_3_4 + 0.00050505050505052*G0_0_0_0_3_5 + 0.0250541125541134*G0_0_0_0_4_0 - 0.00189393939393946*G0_0_0_0_4_1 - 0.00353535353535365*G0_0_0_0_4_2 + 0.00050505050505052*G0_0_0_0_4_3 + 0.0151515151515157*G0_0_0_0_4_4 + 0.00757575757575784*G0_0_0_0_4_5 + 0.0250541125541134*G0_0_0_0_5_0 - 0.00353535353535366*G0_0_0_0_5_1 - 0.00189393939393946*G0_0_0_0_5_2 + 0.00050505050505052*G0_0_0_0_5_3 + 0.00757575757575784*G0_0_0_0_5_4 + 0.0151515151515157*G0_0_0_0_5_5 - 0.0058531746031748*G0_0_0_1_0_0 + 0.00061868686868689*G0_0_0_1_0_1 + 0.000523989898989917*G0_0_0_1_0_2 - 0.000227272727272734*G0_0_0_1_0_3 - 0.00189393939393946*G0_0_0_1_0_4 - 0.00353535353535366*G0_0_0_1_0_5 + 0.00061868686868689*G0_0_0_1_1_0 + 0.00262987012987022*G0_0_0_1_1_1 - 0.00032828282828284*G0_0_0_1_1_2 + 0.00163419913419919*G0_0_0_1_1_3 + 0.000537518037518055*G0_0_0_1_1_4 + 0.00139610389610395*G0_0_0_1_1_5 + 0.000523989898989917*G0_0_0_1_2_0 - 0.00032828282828284*G0_0_0_1_2_1 - 0.00032828282828284*G0_0_0_1_2_2 - 0.000548340548340568*G0_0_0_1_2_3 + 0.000335497835497847*G0_0_0_1_2_4 + 0.000335497835497847*G0_0_0_1_2_5 - 0.000227272727272734*G0_0_0_1_3_0 + 0.00163419913419919*G0_0_0_1_3_1 - 0.000548340548340568*G0_0_0_1_3_2 + 0.000692640692640717*G0_0_0_1_3_3 - 0.00062049062049064*G0_0_0_1_3_4 - 0.000216450216450222*G0_0_0_1_3_5 - 0.00189393939393946*G0_0_0_1_4_0 + 0.000537518037518055*G0_0_0_1_4_1 + 0.000335497835497847*G0_0_0_1_4_2 - 0.00062049062049064*G0_0_0_1_4_3 - 0.00236652236652244*G0_0_0_1_4_4 - 0.0017460317460318*G0_0_0_1_4_5 - 0.00353535353535366*G0_0_0_1_5_0 + 0.00139610389610395*G0_0_0_1_5_1 + 0.000335497835497847*G0_0_0_1_5_2 - 0.000216450216450222*G0_0_0_1_5_3 - 0.0017460317460318*G0_0_0_1_5_4 - 0.00337662337662349*G0_0_0_1_5_5 - 0.0058531746031748*G0_0_0_2_0_0 + 0.000523989898989917*G0_0_0_2_0_1 + 0.00061868686868689*G0_0_0_2_0_2 - 0.000227272727272734*G0_0_0_2_0_3 - 0.00353535353535365*G0_0_0_2_0_4 - 0.00189393939393946*G0_0_0_2_0_5 + 0.000523989898989917*G0_0_0_2_1_0 - 0.00032828282828284*G0_0_0_2_1_1 - 0.00032828282828284*G0_0_0_2_1_2 - 0.000548340548340568*G0_0_0_2_1_3 + 0.000335497835497847*G0_0_0_2_1_4 + 0.000335497835497847*G0_0_0_2_1_5 + 0.00061868686868689*G0_0_0_2_2_0 - 0.00032828282828284*G0_0_0_2_2_1 + 0.00262987012987023*G0_0_0_2_2_2 + 0.00163419913419919*G0_0_0_2_2_3 + 0.00139610389610394*G0_0_0_2_2_4 + 0.000537518037518057*G0_0_0_2_2_5 - 0.000227272727272734*G0_0_0_2_3_0 - 0.000548340548340568*G0_0_0_2_3_1 + 0.00163419913419919*G0_0_0_2_3_2 + 0.00069264069264072*G0_0_0_2_3_3 - 0.000216450216450222*G0_0_0_2_3_4 - 0.000620490620490641*G0_0_0_2_3_5 - 0.00353535353535365*G0_0_0_2_4_0 + 0.000335497835497847*G0_0_0_2_4_1 + 0.00139610389610394*G0_0_0_2_4_2 - 0.000216450216450222*G0_0_0_2_4_3 - 0.00337662337662349*G0_0_0_2_4_4 - 0.0017460317460318*G0_0_0_2_4_5 - 0.00189393939393946*G0_0_0_2_5_0 + 0.000335497835497847*G0_0_0_2_5_1 + 0.000537518037518057*G0_0_0_2_5_2 - 0.000620490620490641*G0_0_0_2_5_3 - 0.00174603174603181*G0_0_0_2_5_4 - 0.00236652236652245*G0_0_0_2_5_5 + 0.00164141414141418*G0_0_0_3_0_0 - 0.000227272727272735*G0_0_0_3_0_1 - 0.000227272727272734*G0_0_0_3_0_2 - 0.000808080808080831*G0_0_0_3_0_3 + 0.00050505050505052*G0_0_0_3_0_4 + 0.000505050505050521*G0_0_0_3_0_5 - 0.000227272727272735*G0_0_0_3_1_0 + 0.00163419913419919*G0_0_0_3_1_1 - 0.000548340548340568*G0_0_0_3_1_2 + 0.000692640692640717*G0_0_0_3_1_3 - 0.00062049062049064*G0_0_0_3_1_4 - 0.000216450216450222*G0_0_0_3_1_5 - 0.000227272727272734*G0_0_0_3_2_0 - 0.000548340548340568*G0_0_0_3_2_1 + 0.00163419913419919*G0_0_0_3_2_2 + 0.00069264069264072*G0_0_0_3_2_3 - 0.000216450216450222*G0_0_0_3_2_4 - 0.000620490620490641*G0_0_0_3_2_5 - 0.000808080808080831*G0_0_0_3_3_0 + 0.000692640692640717*G0_0_0_3_3_1 + 0.000692640692640719*G0_0_0_3_3_2 + 0.0168831168831174*G0_0_0_3_3_3 + 0.00285714285714295*G0_0_0_3_3_4 + 0.00285714285714295*G0_0_0_3_3_5 + 0.00050505050505052*G0_0_0_3_4_0 - 0.00062049062049064*G0_0_0_3_4_1 - 0.000216450216450222*G0_0_0_3_4_2 + 0.00285714285714295*G0_0_0_3_4_3 + 0.00372294372294384*G0_0_0_3_4_4 + 0.00248196248196256*G0_0_0_3_4_5 + 0.000505050505050521*G0_0_0_3_5_0 - 0.000216450216450222*G0_0_0_3_5_1 - 0.000620490620490641*G0_0_0_3_5_2 + 0.00285714285714295*G0_0_0_3_5_3 + 0.00248196248196256*G0_0_0_3_5_4 + 0.00372294372294385*G0_0_0_3_5_5 + 0.0250541125541134*G0_0_0_4_0_0 - 0.00189393939393946*G0_0_0_4_0_1 - 0.00353535353535365*G0_0_0_4_0_2 + 0.00050505050505052*G0_0_0_4_0_3 + 0.0151515151515157*G0_0_0_4_0_4 + 0.00757575757575784*G0_0_0_4_0_5 - 0.00189393939393946*G0_0_0_4_1_0 + 0.000537518037518055*G0_0_0_4_1_1 + 0.000335497835497847*G0_0_0_4_1_2 - 0.00062049062049064*G0_0_0_4_1_3 - 0.00236652236652244*G0_0_0_4_1_4 - 0.0017460317460318*G0_0_0_4_1_5 - 0.00353535353535365*G0_0_0_4_2_0 + 0.000335497835497847*G0_0_0_4_2_1 + 0.00139610389610394*G0_0_0_4_2_2 - 0.000216450216450222*G0_0_0_4_2_3 - 0.00337662337662349*G0_0_0_4_2_4 - 0.0017460317460318*G0_0_0_4_2_5 + 0.00050505050505052*G0_0_0_4_3_0 - 0.00062049062049064*G0_0_0_4_3_1 - 0.000216450216450222*G0_0_0_4_3_2 + 0.00285714285714295*G0_0_0_4_3_3 + 0.00372294372294384*G0_0_0_4_3_4 + 0.00248196248196256*G0_0_0_4_3_5 + 0.0151515151515157*G0_0_0_4_4_0 - 0.00236652236652244*G0_0_0_4_4_1 - 0.00337662337662349*G0_0_0_4_4_2 + 0.00372294372294384*G0_0_0_4_4_3 + 0.0246753246753255*G0_0_0_4_4_4 + 0.0082251082251085*G0_0_0_4_4_5 + 0.00757575757575784*G0_0_0_4_5_0 - 0.0017460317460318*G0_0_0_4_5_1 - 0.0017460317460318*G0_0_0_4_5_2 + 0.00248196248196256*G0_0_0_4_5_3 + 0.0082251082251085*G0_0_0_4_5_4 + 0.0082251082251085*G0_0_0_4_5_5 + 0.0250541125541134*G0_0_0_5_0_0 - 0.00353535353535366*G0_0_0_5_0_1 - 0.00189393939393946*G0_0_0_5_0_2 + 0.000505050505050521*G0_0_0_5_0_3 + 0.00757575757575784*G0_0_0_5_0_4 + 0.0151515151515157*G0_0_0_5_0_5 - 0.00353535353535366*G0_0_0_5_1_0 + 0.00139610389610395*G0_0_0_5_1_1 + 0.000335497835497847*G0_0_0_5_1_2 - 0.000216450216450222*G0_0_0_5_1_3 - 0.0017460317460318*G0_0_0_5_1_4 - 0.00337662337662349*G0_0_0_5_1_5 - 0.00189393939393946*G0_0_0_5_2_0 + 0.000335497835497847*G0_0_0_5_2_1 + 0.000537518037518057*G0_0_0_5_2_2 - 0.000620490620490641*G0_0_0_5_2_3 - 0.0017460317460318*G0_0_0_5_2_4 - 0.00236652236652245*G0_0_0_5_2_5 + 0.000505050505050521*G0_0_0_5_3_0 - 0.000216450216450222*G0_0_0_5_3_1 - 0.000620490620490641*G0_0_0_5_3_2 + 0.00285714285714295*G0_0_0_5_3_3 + 0.00248196248196256*G0_0_0_5_3_4 + 0.00372294372294385*G0_0_0_5_3_5 + 0.00757575757575784*G0_0_0_5_4_0 - 0.0017460317460318*G0_0_0_5_4_1 - 0.00174603174603181*G0_0_0_5_4_2 + 0.00248196248196256*G0_0_0_5_4_3 + 0.0082251082251085*G0_0_0_5_4_4 + 0.0082251082251085*G0_0_0_5_4_5 + 0.0151515151515157*G0_0_0_5_5_0 - 0.00337662337662349*G0_0_0_5_5_1 - 0.00236652236652245*G0_0_0_5_5_2 + 0.00372294372294385*G0_0_0_5_5_3 + 0.0082251082251085*G0_0_0_5_5_4 + 0.0246753246753255*G0_0_0_5_5_5 + 0.0918019480519512*G0_0_1_0_0_0 - 0.0058531746031748*G0_0_1_0_0_1 - 0.0058531746031748*G0_0_1_0_0_2 + 0.00164141414141418*G0_0_1_0_0_3 + 0.0250541125541134*G0_0_1_0_0_4 + 0.0250541125541134*G0_0_1_0_0_5 - 0.0058531746031748*G0_0_1_0_1_0 + 0.00061868686868689*G0_0_1_0_1_1 + 0.000523989898989917*G0_0_1_0_1_2 - 0.000227272727272735*G0_0_1_0_1_3 - 0.00189393939393946*G0_0_1_0_1_4 - 0.00353535353535366*G0_0_1_0_1_5 - 0.0058531746031748*G0_0_1_0_2_0 + 0.000523989898989917*G0_0_1_0_2_1 + 0.000618686868686891*G0_0_1_0_2_2 - 0.000227272727272734*G0_0_1_0_2_3 - 0.00353535353535365*G0_0_1_0_2_4 - 0.00189393939393946*G0_0_1_0_2_5 + 0.00164141414141418*G0_0_1_0_3_0 - 0.000227272727272735*G0_0_1_0_3_1 - 0.000227272727272734*G0_0_1_0_3_2 - 0.000808080808080831*G0_0_1_0_3_3 + 0.000505050505050521*G0_0_1_0_3_4 + 0.000505050505050521*G0_0_1_0_3_5 + 0.0250541125541134*G0_0_1_0_4_0 - 0.00189393939393946*G0_0_1_0_4_1 - 0.00353535353535365*G0_0_1_0_4_2 + 0.000505050505050521*G0_0_1_0_4_3 + 0.0151515151515157*G0_0_1_0_4_4 + 0.00757575757575784*G0_0_1_0_4_5 + 0.0250541125541134*G0_0_1_0_5_0 - 0.00353535353535366*G0_0_1_0_5_1 - 0.00189393939393946*G0_0_1_0_5_2 + 0.000505050505050521*G0_0_1_0_5_3 + 0.00757575757575784*G0_0_1_0_5_4 + 0.0151515151515157*G0_0_1_0_5_5 - 0.0058531746031748*G0_0_1_1_0_0 + 0.00061868686868689*G0_0_1_1_0_1 + 0.000523989898989917*G0_0_1_1_0_2 - 0.000227272727272735*G0_0_1_1_0_3 - 0.00189393939393946*G0_0_1_1_0_4 - 0.00353535353535366*G0_0_1_1_0_5 + 0.00061868686868689*G0_0_1_1_1_0 + 0.00262987012987022*G0_0_1_1_1_1 - 0.00032828282828284*G0_0_1_1_1_2 + 0.00163419913419919*G0_0_1_1_1_3 + 0.000537518037518055*G0_0_1_1_1_4 + 0.00139610389610395*G0_0_1_1_1_5 + 0.000523989898989917*G0_0_1_1_2_0 - 0.00032828282828284*G0_0_1_1_2_1 - 0.000328282828282839*G0_0_1_1_2_2 - 0.000548340548340567*G0_0_1_1_2_3 + 0.000335497835497847*G0_0_1_1_2_4 + 0.000335497835497847*G0_0_1_1_2_5 - 0.000227272727272735*G0_0_1_1_3_0 + 0.00163419913419919*G0_0_1_1_3_1 - 0.000548340548340567*G0_0_1_1_3_2 + 0.000692640692640717*G0_0_1_1_3_3 - 0.00062049062049064*G0_0_1_1_3_4 - 0.000216450216450222*G0_0_1_1_3_5 - 0.00189393939393946*G0_0_1_1_4_0 + 0.000537518037518055*G0_0_1_1_4_1 + 0.000335497835497847*G0_0_1_1_4_2 - 0.00062049062049064*G0_0_1_1_4_3 - 0.00236652236652244*G0_0_1_1_4_4 - 0.0017460317460318*G0_0_1_1_4_5 - 0.00353535353535366*G0_0_1_1_5_0 + 0.00139610389610395*G0_0_1_1_5_1 + 0.000335497835497847*G0_0_1_1_5_2 - 0.000216450216450222*G0_0_1_1_5_3 - 0.0017460317460318*G0_0_1_1_5_4 - 0.00337662337662349*G0_0_1_1_5_5 - 0.0058531746031748*G0_0_1_2_0_0 + 0.000523989898989917*G0_0_1_2_0_1 + 0.000618686868686891*G0_0_1_2_0_2 - 0.000227272727272734*G0_0_1_2_0_3 - 0.00353535353535365*G0_0_1_2_0_4 - 0.00189393939393946*G0_0_1_2_0_5 + 0.000523989898989917*G0_0_1_2_1_0 - 0.00032828282828284*G0_0_1_2_1_1 - 0.000328282828282839*G0_0_1_2_1_2 - 0.000548340548340567*G0_0_1_2_1_3 + 0.000335497835497847*G0_0_1_2_1_4 + 0.000335497835497847*G0_0_1_2_1_5 + 0.000618686868686891*G0_0_1_2_2_0 - 0.000328282828282839*G0_0_1_2_2_1 + 0.00262987012987021*G0_0_1_2_2_2 + 0.00163419913419919*G0_0_1_2_2_3 + 0.00139610389610394*G0_0_1_2_2_4 + 0.000537518037518056*G0_0_1_2_2_5 - 0.000227272727272734*G0_0_1_2_3_0 - 0.000548340548340567*G0_0_1_2_3_1 + 0.00163419913419919*G0_0_1_2_3_2 + 0.000692640692640718*G0_0_1_2_3_3 - 0.000216450216450223*G0_0_1_2_3_4 - 0.00062049062049064*G0_0_1_2_3_5 - 0.00353535353535365*G0_0_1_2_4_0 + 0.000335497835497847*G0_0_1_2_4_1 + 0.00139610389610394*G0_0_1_2_4_2 - 0.000216450216450223*G0_0_1_2_4_3 - 0.00337662337662349*G0_0_1_2_4_4 - 0.0017460317460318*G0_0_1_2_4_5 - 0.00189393939393946*G0_0_1_2_5_0 + 0.000335497835497847*G0_0_1_2_5_1 + 0.000537518037518056*G0_0_1_2_5_2 - 0.00062049062049064*G0_0_1_2_5_3 - 0.00174603174603181*G0_0_1_2_5_4 - 0.00236652236652245*G0_0_1_2_5_5 + 0.00164141414141418*G0_0_1_3_0_0 - 0.000227272727272735*G0_0_1_3_0_1 - 0.000227272727272734*G0_0_1_3_0_2 - 0.000808080808080831*G0_0_1_3_0_3 + 0.000505050505050521*G0_0_1_3_0_4 + 0.000505050505050521*G0_0_1_3_0_5 - 0.000227272727272735*G0_0_1_3_1_0 + 0.00163419913419919*G0_0_1_3_1_1 - 0.000548340548340567*G0_0_1_3_1_2 + 0.000692640692640717*G0_0_1_3_1_3 - 0.00062049062049064*G0_0_1_3_1_4 - 0.000216450216450222*G0_0_1_3_1_5 - 0.000227272727272734*G0_0_1_3_2_0 - 0.000548340548340567*G0_0_1_3_2_1 + 0.00163419913419919*G0_0_1_3_2_2 + 0.000692640692640718*G0_0_1_3_2_3 - 0.000216450216450223*G0_0_1_3_2_4 - 0.00062049062049064*G0_0_1_3_2_5 - 0.000808080808080831*G0_0_1_3_3_0 + 0.000692640692640717*G0_0_1_3_3_1 + 0.000692640692640718*G0_0_1_3_3_2 + 0.0168831168831174*G0_0_1_3_3_3 + 0.00285714285714295*G0_0_1_3_3_4 + 0.00285714285714295*G0_0_1_3_3_5 + 0.000505050505050521*G0_0_1_3_4_0 - 0.00062049062049064*G0_0_1_3_4_1 - 0.000216450216450223*G0_0_1_3_4_2 + 0.00285714285714295*G0_0_1_3_4_3 + 0.00372294372294384*G0_0_1_3_4_4 + 0.00248196248196256*G0_0_1_3_4_5 + 0.000505050505050521*G0_0_1_3_5_0 - 0.000216450216450222*G0_0_1_3_5_1 - 0.00062049062049064*G0_0_1_3_5_2 + 0.00285714285714295*G0_0_1_3_5_3 + 0.00248196248196256*G0_0_1_3_5_4 + 0.00372294372294385*G0_0_1_3_5_5 + 0.0250541125541134*G0_0_1_4_0_0 - 0.00189393939393946*G0_0_1_4_0_1 - 0.00353535353535365*G0_0_1_4_0_2 + 0.000505050505050521*G0_0_1_4_0_3 + 0.0151515151515157*G0_0_1_4_0_4 + 0.00757575757575784*G0_0_1_4_0_5 - 0.00189393939393946*G0_0_1_4_1_0 + 0.000537518037518055*G0_0_1_4_1_1 + 0.000335497835497847*G0_0_1_4_1_2 - 0.00062049062049064*G0_0_1_4_1_3 - 0.00236652236652244*G0_0_1_4_1_4 - 0.0017460317460318*G0_0_1_4_1_5 - 0.00353535353535365*G0_0_1_4_2_0 + 0.000335497835497847*G0_0_1_4_2_1 + 0.00139610389610394*G0_0_1_4_2_2 - 0.000216450216450223*G0_0_1_4_2_3 - 0.00337662337662349*G0_0_1_4_2_4 - 0.0017460317460318*G0_0_1_4_2_5 + 0.000505050505050521*G0_0_1_4_3_0 - 0.00062049062049064*G0_0_1_4_3_1 - 0.000216450216450223*G0_0_1_4_3_2 + 0.00285714285714295*G0_0_1_4_3_3 + 0.00372294372294384*G0_0_1_4_3_4 + 0.00248196248196256*G0_0_1_4_3_5 + 0.0151515151515157*G0_0_1_4_4_0 - 0.00236652236652244*G0_0_1_4_4_1 - 0.00337662337662349*G0_0_1_4_4_2 + 0.00372294372294384*G0_0_1_4_4_3 + 0.0246753246753255*G0_0_1_4_4_4 + 0.0082251082251085*G0_0_1_4_4_5 + 0.00757575757575784*G0_0_1_4_5_0 - 0.0017460317460318*G0_0_1_4_5_1 - 0.0017460317460318*G0_0_1_4_5_2 + 0.00248196248196256*G0_0_1_4_5_3 + 0.0082251082251085*G0_0_1_4_5_4 + 0.0082251082251085*G0_0_1_4_5_5 + 0.0250541125541134*G0_0_1_5_0_0 - 0.00353535353535366*G0_0_1_5_0_1 - 0.00189393939393946*G0_0_1_5_0_2 + 0.000505050505050521*G0_0_1_5_0_3 + 0.00757575757575784*G0_0_1_5_0_4 + 0.0151515151515157*G0_0_1_5_0_5 - 0.00353535353535366*G0_0_1_5_1_0 + 0.00139610389610395*G0_0_1_5_1_1 + 0.000335497835497847*G0_0_1_5_1_2 - 0.000216450216450222*G0_0_1_5_1_3 - 0.0017460317460318*G0_0_1_5_1_4 - 0.00337662337662349*G0_0_1_5_1_5 - 0.00189393939393946*G0_0_1_5_2_0 + 0.000335497835497847*G0_0_1_5_2_1 + 0.000537518037518056*G0_0_1_5_2_2 - 0.00062049062049064*G0_0_1_5_2_3 - 0.00174603174603181*G0_0_1_5_2_4 - 0.00236652236652245*G0_0_1_5_2_5 + 0.000505050505050521*G0_0_1_5_3_0 - 0.000216450216450222*G0_0_1_5_3_1 - 0.00062049062049064*G0_0_1_5_3_2 + 0.00285714285714295*G0_0_1_5_3_3 + 0.00248196248196256*G0_0_1_5_3_4 + 0.00372294372294385*G0_0_1_5_3_5 + 0.00757575757575784*G0_0_1_5_4_0 - 0.0017460317460318*G0_0_1_5_4_1 - 0.00174603174603181*G0_0_1_5_4_2 + 0.00248196248196256*G0_0_1_5_4_3 + 0.0082251082251085*G0_0_1_5_4_4 + 0.0082251082251085*G0_0_1_5_4_5 + 0.0151515151515157*G0_0_1_5_5_0 - 0.00337662337662349*G0_0_1_5_5_1 - 0.00236652236652245*G0_0_1_5_5_2 + 0.00372294372294385*G0_0_1_5_5_3 + 0.0082251082251085*G0_0_1_5_5_4 + 0.0246753246753255*G0_0_1_5_5_5 + 0.0918019480519512*G0_1_0_0_0_0 - 0.0058531746031748*G0_1_0_0_0_1 - 0.0058531746031748*G0_1_0_0_0_2 + 0.00164141414141418*G0_1_0_0_0_3 + 0.0250541125541134*G0_1_0_0_0_4 + 0.0250541125541134*G0_1_0_0_0_5 - 0.0058531746031748*G0_1_0_0_1_0 + 0.00061868686868689*G0_1_0_0_1_1 + 0.000523989898989917*G0_1_0_0_1_2 - 0.000227272727272735*G0_1_0_0_1_3 - 0.00189393939393946*G0_1_0_0_1_4 - 0.00353535353535366*G0_1_0_0_1_5 - 0.0058531746031748*G0_1_0_0_2_0 + 0.000523989898989917*G0_1_0_0_2_1 + 0.000618686868686891*G0_1_0_0_2_2 - 0.000227272727272734*G0_1_0_0_2_3 - 0.00353535353535365*G0_1_0_0_2_4 - 0.00189393939393946*G0_1_0_0_2_5 + 0.00164141414141418*G0_1_0_0_3_0 - 0.000227272727272734*G0_1_0_0_3_1 - 0.000227272727272734*G0_1_0_0_3_2 - 0.000808080808080831*G0_1_0_0_3_3 + 0.000505050505050521*G0_1_0_0_3_4 + 0.000505050505050521*G0_1_0_0_3_5 + 0.0250541125541134*G0_1_0_0_4_0 - 0.00189393939393946*G0_1_0_0_4_1 - 0.00353535353535365*G0_1_0_0_4_2 + 0.00050505050505052*G0_1_0_0_4_3 + 0.0151515151515157*G0_1_0_0_4_4 + 0.00757575757575784*G0_1_0_0_4_5 + 0.0250541125541134*G0_1_0_0_5_0 - 0.00353535353535366*G0_1_0_0_5_1 - 0.00189393939393946*G0_1_0_0_5_2 + 0.000505050505050521*G0_1_0_0_5_3 + 0.00757575757575784*G0_1_0_0_5_4 + 0.0151515151515157*G0_1_0_0_5_5 - 0.0058531746031748*G0_1_0_1_0_0 + 0.00061868686868689*G0_1_0_1_0_1 + 0.000523989898989917*G0_1_0_1_0_2 - 0.000227272727272735*G0_1_0_1_0_3 - 0.00189393939393946*G0_1_0_1_0_4 - 0.00353535353535366*G0_1_0_1_0_5 + 0.00061868686868689*G0_1_0_1_1_0 + 0.00262987012987022*G0_1_0_1_1_1 - 0.00032828282828284*G0_1_0_1_1_2 + 0.00163419913419919*G0_1_0_1_1_3 + 0.000537518037518055*G0_1_0_1_1_4 + 0.00139610389610395*G0_1_0_1_1_5 + 0.000523989898989917*G0_1_0_1_2_0 - 0.00032828282828284*G0_1_0_1_2_1 - 0.000328282828282839*G0_1_0_1_2_2 - 0.000548340548340567*G0_1_0_1_2_3 + 0.000335497835497847*G0_1_0_1_2_4 + 0.000335497835497847*G0_1_0_1_2_5 - 0.000227272727272735*G0_1_0_1_3_0 + 0.00163419913419919*G0_1_0_1_3_1 - 0.000548340548340567*G0_1_0_1_3_2 + 0.000692640692640717*G0_1_0_1_3_3 - 0.00062049062049064*G0_1_0_1_3_4 - 0.000216450216450222*G0_1_0_1_3_5 - 0.00189393939393946*G0_1_0_1_4_0 + 0.000537518037518055*G0_1_0_1_4_1 + 0.000335497835497847*G0_1_0_1_4_2 - 0.00062049062049064*G0_1_0_1_4_3 - 0.00236652236652244*G0_1_0_1_4_4 - 0.0017460317460318*G0_1_0_1_4_5 - 0.00353535353535366*G0_1_0_1_5_0 + 0.00139610389610395*G0_1_0_1_5_1 + 0.000335497835497847*G0_1_0_1_5_2 - 0.000216450216450222*G0_1_0_1_5_3 - 0.0017460317460318*G0_1_0_1_5_4 - 0.00337662337662349*G0_1_0_1_5_5 - 0.0058531746031748*G0_1_0_2_0_0 + 0.000523989898989917*G0_1_0_2_0_1 + 0.000618686868686891*G0_1_0_2_0_2 - 0.000227272727272734*G0_1_0_2_0_3 - 0.00353535353535365*G0_1_0_2_0_4 - 0.00189393939393946*G0_1_0_2_0_5 + 0.000523989898989917*G0_1_0_2_1_0 - 0.00032828282828284*G0_1_0_2_1_1 - 0.000328282828282839*G0_1_0_2_1_2 - 0.000548340548340567*G0_1_0_2_1_3 + 0.000335497835497847*G0_1_0_2_1_4 + 0.000335497835497847*G0_1_0_2_1_5 + 0.000618686868686891*G0_1_0_2_2_0 - 0.000328282828282839*G0_1_0_2_2_1 + 0.00262987012987021*G0_1_0_2_2_2 + 0.00163419913419919*G0_1_0_2_2_3 + 0.00139610389610394*G0_1_0_2_2_4 + 0.000537518037518056*G0_1_0_2_2_5 - 0.000227272727272734*G0_1_0_2_3_0 - 0.000548340548340567*G0_1_0_2_3_1 + 0.00163419913419919*G0_1_0_2_3_2 + 0.000692640692640718*G0_1_0_2_3_3 - 0.000216450216450223*G0_1_0_2_3_4 - 0.00062049062049064*G0_1_0_2_3_5 - 0.00353535353535365*G0_1_0_2_4_0 + 0.000335497835497847*G0_1_0_2_4_1 + 0.00139610389610394*G0_1_0_2_4_2 - 0.000216450216450223*G0_1_0_2_4_3 - 0.00337662337662349*G0_1_0_2_4_4 - 0.0017460317460318*G0_1_0_2_4_5 - 0.00189393939393946*G0_1_0_2_5_0 + 0.000335497835497847*G0_1_0_2_5_1 + 0.000537518037518056*G0_1_0_2_5_2 - 0.00062049062049064*G0_1_0_2_5_3 - 0.00174603174603181*G0_1_0_2_5_4 - 0.00236652236652245*G0_1_0_2_5_5 + 0.00164141414141418*G0_1_0_3_0_0 - 0.000227272727272735*G0_1_0_3_0_1 - 0.000227272727272734*G0_1_0_3_0_2 - 0.000808080808080831*G0_1_0_3_0_3 + 0.000505050505050521*G0_1_0_3_0_4 + 0.000505050505050521*G0_1_0_3_0_5 - 0.000227272727272735*G0_1_0_3_1_0 + 0.00163419913419919*G0_1_0_3_1_1 - 0.000548340548340567*G0_1_0_3_1_2 + 0.000692640692640717*G0_1_0_3_1_3 - 0.00062049062049064*G0_1_0_3_1_4 - 0.000216450216450222*G0_1_0_3_1_5 - 0.000227272727272734*G0_1_0_3_2_0 - 0.000548340548340567*G0_1_0_3_2_1 + 0.00163419913419919*G0_1_0_3_2_2 + 0.000692640692640718*G0_1_0_3_2_3 - 0.000216450216450223*G0_1_0_3_2_4 - 0.00062049062049064*G0_1_0_3_2_5 - 0.000808080808080831*G0_1_0_3_3_0 + 0.000692640692640717*G0_1_0_3_3_1 + 0.000692640692640718*G0_1_0_3_3_2 + 0.0168831168831174*G0_1_0_3_3_3 + 0.00285714285714295*G0_1_0_3_3_4 + 0.00285714285714295*G0_1_0_3_3_5 + 0.000505050505050521*G0_1_0_3_4_0 - 0.00062049062049064*G0_1_0_3_4_1 - 0.000216450216450223*G0_1_0_3_4_2 + 0.00285714285714295*G0_1_0_3_4_3 + 0.00372294372294384*G0_1_0_3_4_4 + 0.00248196248196256*G0_1_0_3_4_5 + 0.000505050505050521*G0_1_0_3_5_0 - 0.000216450216450222*G0_1_0_3_5_1 - 0.00062049062049064*G0_1_0_3_5_2 + 0.00285714285714295*G0_1_0_3_5_3 + 0.00248196248196256*G0_1_0_3_5_4 + 0.00372294372294385*G0_1_0_3_5_5 + 0.0250541125541134*G0_1_0_4_0_0 - 0.00189393939393946*G0_1_0_4_0_1 - 0.00353535353535365*G0_1_0_4_0_2 + 0.000505050505050521*G0_1_0_4_0_3 + 0.0151515151515157*G0_1_0_4_0_4 + 0.00757575757575784*G0_1_0_4_0_5 - 0.00189393939393946*G0_1_0_4_1_0 + 0.000537518037518055*G0_1_0_4_1_1 + 0.000335497835497847*G0_1_0_4_1_2 - 0.00062049062049064*G0_1_0_4_1_3 - 0.00236652236652244*G0_1_0_4_1_4 - 0.0017460317460318*G0_1_0_4_1_5 - 0.00353535353535365*G0_1_0_4_2_0 + 0.000335497835497847*G0_1_0_4_2_1 + 0.00139610389610394*G0_1_0_4_2_2 - 0.000216450216450223*G0_1_0_4_2_3 - 0.00337662337662349*G0_1_0_4_2_4 - 0.0017460317460318*G0_1_0_4_2_5 + 0.000505050505050521*G0_1_0_4_3_0 - 0.00062049062049064*G0_1_0_4_3_1 - 0.000216450216450223*G0_1_0_4_3_2 + 0.00285714285714295*G0_1_0_4_3_3 + 0.00372294372294384*G0_1_0_4_3_4 + 0.00248196248196256*G0_1_0_4_3_5 + 0.0151515151515157*G0_1_0_4_4_0 - 0.00236652236652244*G0_1_0_4_4_1 - 0.00337662337662349*G0_1_0_4_4_2 + 0.00372294372294384*G0_1_0_4_4_3 + 0.0246753246753255*G0_1_0_4_4_4 + 0.0082251082251085*G0_1_0_4_4_5 + 0.00757575757575784*G0_1_0_4_5_0 - 0.0017460317460318*G0_1_0_4_5_1 - 0.00174603174603181*G0_1_0_4_5_2 + 0.00248196248196256*G0_1_0_4_5_3 + 0.0082251082251085*G0_1_0_4_5_4 + 0.0082251082251085*G0_1_0_4_5_5 + 0.0250541125541134*G0_1_0_5_0_0 - 0.00353535353535366*G0_1_0_5_0_1 - 0.00189393939393946*G0_1_0_5_0_2 + 0.000505050505050521*G0_1_0_5_0_3 + 0.00757575757575784*G0_1_0_5_0_4 + 0.0151515151515157*G0_1_0_5_0_5 - 0.00353535353535366*G0_1_0_5_1_0 + 0.00139610389610395*G0_1_0_5_1_1 + 0.000335497835497847*G0_1_0_5_1_2 - 0.000216450216450222*G0_1_0_5_1_3 - 0.0017460317460318*G0_1_0_5_1_4 - 0.00337662337662349*G0_1_0_5_1_5 - 0.00189393939393946*G0_1_0_5_2_0 + 0.000335497835497847*G0_1_0_5_2_1 + 0.000537518037518056*G0_1_0_5_2_2 - 0.00062049062049064*G0_1_0_5_2_3 - 0.0017460317460318*G0_1_0_5_2_4 - 0.00236652236652245*G0_1_0_5_2_5 + 0.000505050505050521*G0_1_0_5_3_0 - 0.000216450216450222*G0_1_0_5_3_1 - 0.00062049062049064*G0_1_0_5_3_2 + 0.00285714285714295*G0_1_0_5_3_3 + 0.00248196248196256*G0_1_0_5_3_4 + 0.00372294372294385*G0_1_0_5_3_5 + 0.00757575757575784*G0_1_0_5_4_0 - 0.0017460317460318*G0_1_0_5_4_1 - 0.00174603174603181*G0_1_0_5_4_2 + 0.00248196248196256*G0_1_0_5_4_3 + 0.0082251082251085*G0_1_0_5_4_4 + 0.0082251082251085*G0_1_0_5_4_5 + 0.0151515151515157*G0_1_0_5_5_0 - 0.00337662337662349*G0_1_0_5_5_1 - 0.00236652236652245*G0_1_0_5_5_2 + 0.00372294372294385*G0_1_0_5_5_3 + 0.0082251082251085*G0_1_0_5_5_4 + 0.0246753246753255*G0_1_0_5_5_5 + 0.089172077922081*G0_1_1_0_0_0 - 0.00552489177489196*G0_1_1_0_0_1 - 0.00647186147186169*G0_1_1_0_0_2 + 0.00110389610389613*G0_1_1_0_0_3 + 0.0236580086580095*G0_1_1_0_0_4 + 0.0234199134199142*G0_1_1_0_0_5 - 0.00552489177489196*G0_1_1_0_1_0 + 0.000946969696969729*G0_1_1_0_1_1 - 0.000562770562770581*G0_1_1_0_1_3 - 0.00222943722943731*G0_1_1_0_1_4 - 0.00298701298701309*G0_1_1_0_1_5 - 0.00647186147186169*G0_1_1_0_2_0 + 0.00647186147186169*G0_1_1_0_2_2 + 0.00166666666666672*G0_1_1_0_2_3 - 0.00166666666666672*G0_1_1_0_2_5 + 0.00110389610389613*G0_1_1_0_3_0 - 0.000562770562770581*G0_1_1_0_3_1 + 0.00166666666666672*G0_1_1_0_3_2 + 0.00155844155844161*G0_1_1_0_3_3 + 0.00225108225108232*G0_1_1_0_3_4 + 0.00112554112554116*G0_1_1_0_3_5 + 0.0236580086580095*G0_1_1_0_4_0 - 0.00222943722943731*G0_1_1_0_4_1 + 0.00225108225108232*G0_1_1_0_4_3 + 0.0185281385281392*G0_1_1_0_4_4 + 0.00779220779220806*G0_1_1_0_4_5 + 0.0234199134199142*G0_1_1_0_5_0 - 0.00298701298701309*G0_1_1_0_5_1 - 0.00166666666666672*G0_1_1_0_5_2 + 0.00112554112554116*G0_1_1_0_5_3 + 0.00779220779220806*G0_1_1_0_5_4 + 0.014458874458875*G0_1_1_0_5_5 - 0.00552489177489196*G0_1_1_1_0_0 + 0.000946969696969729*G0_1_1_1_0_1 - 0.000562770562770581*G0_1_1_1_0_3 - 0.00222943722943731*G0_1_1_1_0_4 - 0.00298701298701309*G0_1_1_1_0_5 + 0.000946969696969729*G0_1_1_1_1_0 - 0.000946969696969729*G0_1_1_1_1_2 + 0.000238095238095245*G0_1_1_1_1_3 - 0.000238095238095244*G0_1_1_1_1_5 - 0.000946969696969729*G0_1_1_1_2_1 + 0.00552489177489196*G0_1_1_1_2_2 + 0.00298701298701309*G0_1_1_1_2_3 + 0.0022294372294373*G0_1_1_1_2_4 + 0.000562770562770583*G0_1_1_1_2_5 - 0.000562770562770581*G0_1_1_1_3_0 + 0.000238095238095245*G0_1_1_1_3_1 + 0.00298701298701309*G0_1_1_1_3_2 + 0.00406926406926421*G0_1_1_1_3_3 + 0.00112554112554116*G0_1_1_1_3_4 - 0.00222943722943731*G0_1_1_1_4_0 + 0.0022294372294373*G0_1_1_1_4_2 + 0.00112554112554116*G0_1_1_1_4_3 - 0.00112554112554116*G0_1_1_1_4_5 - 0.00298701298701309*G0_1_1_1_5_0 - 0.000238095238095244*G0_1_1_1_5_1 + 0.000562770562770583*G0_1_1_1_5_2 - 0.00112554112554116*G0_1_1_1_5_4 - 0.00406926406926421*G0_1_1_1_5_5 - 0.00647186147186169*G0_1_1_2_0_0 + 0.00647186147186169*G0_1_1_2_0_2 + 0.00166666666666672*G0_1_1_2_0_3 - 0.00166666666666672*G0_1_1_2_0_5 - 0.000946969696969729*G0_1_1_2_1_1 + 0.00552489177489196*G0_1_1_2_1_2 + 0.00298701298701309*G0_1_1_2_1_3 + 0.0022294372294373*G0_1_1_2_1_4 + 0.000562770562770583*G0_1_1_2_1_5 + 0.00647186147186169*G0_1_1_2_2_0 + 0.00552489177489196*G0_1_1_2_2_1 - 0.089172077922081*G0_1_1_2_2_2 - 0.0234199134199142*G0_1_1_2_2_3 - 0.0236580086580095*G0_1_1_2_2_4 - 0.00110389610389616*G0_1_1_2_2_5 + 0.00166666666666672*G0_1_1_2_3_0 + 0.00298701298701309*G0_1_1_2_3_1 - 0.0234199134199142*G0_1_1_2_3_2 - 0.014458874458875*G0_1_1_2_3_3 - 0.00779220779220806*G0_1_1_2_3_4 - 0.00112554112554117*G0_1_1_2_3_5 + 0.0022294372294373*G0_1_1_2_4_1 - 0.0236580086580095*G0_1_1_2_4_2 - 0.00779220779220806*G0_1_1_2_4_3 - 0.0185281385281392*G0_1_1_2_4_4 - 0.00225108225108233*G0_1_1_2_4_5 - 0.00166666666666672*G0_1_1_2_5_0 + 0.000562770562770583*G0_1_1_2_5_1 - 0.00110389610389616*G0_1_1_2_5_2 - 0.00112554112554117*G0_1_1_2_5_3 - 0.00225108225108233*G0_1_1_2_5_4 - 0.00155844155844161*G0_1_1_2_5_5 + 0.00110389610389613*G0_1_1_3_0_0 - 0.000562770562770581*G0_1_1_3_0_1 + 0.00166666666666672*G0_1_1_3_0_2 + 0.00155844155844161*G0_1_1_3_0_3 + 0.00225108225108232*G0_1_1_3_0_4 + 0.00112554112554116*G0_1_1_3_0_5 - 0.000562770562770581*G0_1_1_3_1_0 + 0.000238095238095245*G0_1_1_3_1_1 + 0.00298701298701309*G0_1_1_3_1_2 + 0.00406926406926421*G0_1_1_3_1_3 + 0.00112554112554116*G0_1_1_3_1_4 + 0.00166666666666672*G0_1_1_3_2_0 + 0.00298701298701309*G0_1_1_3_2_1 - 0.0234199134199142*G0_1_1_3_2_2 - 0.014458874458875*G0_1_1_3_2_3 - 0.00779220779220806*G0_1_1_3_2_4 - 0.00112554112554117*G0_1_1_3_2_5 + 0.00155844155844161*G0_1_1_3_3_0 + 0.00406926406926421*G0_1_1_3_3_1 - 0.014458874458875*G0_1_1_3_3_2 - 0.00779220779220806*G0_1_1_3_3_3 - 0.00536796536796555*G0_1_1_3_3_4 - 0.000865800865800899*G0_1_1_3_3_5 + 0.00225108225108232*G0_1_1_3_4_0 + 0.00112554112554116*G0_1_1_3_4_1 - 0.00779220779220806*G0_1_1_3_4_2 - 0.00536796536796555*G0_1_1_3_4_3 - 0.00450216450216466*G0_1_1_3_4_4 + 0.00112554112554116*G0_1_1_3_5_0 - 0.00112554112554117*G0_1_1_3_5_2 - 0.000865800865800899*G0_1_1_3_5_3 + 0.000865800865800893*G0_1_1_3_5_5 + 0.0236580086580095*G0_1_1_4_0_0 - 0.00222943722943731*G0_1_1_4_0_1 + 0.00225108225108232*G0_1_1_4_0_3 + 0.0185281385281391*G0_1_1_4_0_4 + 0.00779220779220806*G0_1_1_4_0_5 - 0.00222943722943731*G0_1_1_4_1_0 + 0.0022294372294373*G0_1_1_4_1_2 + 0.00112554112554116*G0_1_1_4_1_3 - 0.00112554112554116*G0_1_1_4_1_5 + 0.0022294372294373*G0_1_1_4_2_1 - 0.0236580086580095*G0_1_1_4_2_2 - 0.00779220779220806*G0_1_1_4_2_3 - 0.0185281385281392*G0_1_1_4_2_4 - 0.00225108225108233*G0_1_1_4_2_5 + 0.00225108225108232*G0_1_1_4_3_0 + 0.00112554112554117*G0_1_1_4_3_1 - 0.00779220779220806*G0_1_1_4_3_2 - 0.00536796536796555*G0_1_1_4_3_3 - 0.00450216450216466*G0_1_1_4_3_4 + 0.0185281385281391*G0_1_1_4_4_0 - 0.0185281385281392*G0_1_1_4_4_2 - 0.00450216450216466*G0_1_1_4_4_3 + 0.00450216450216465*G0_1_1_4_4_5 + 0.00779220779220806*G0_1_1_4_5_0 - 0.00112554112554116*G0_1_1_4_5_1 - 0.00225108225108233*G0_1_1_4_5_2 + 0.00450216450216465*G0_1_1_4_5_4 + 0.00536796536796555*G0_1_1_4_5_5 + 0.0234199134199142*G0_1_1_5_0_0 - 0.00298701298701309*G0_1_1_5_0_1 - 0.00166666666666672*G0_1_1_5_0_2 + 0.00112554112554116*G0_1_1_5_0_3 + 0.00779220779220806*G0_1_1_5_0_4 + 0.014458874458875*G0_1_1_5_0_5 - 0.00298701298701309*G0_1_1_5_1_0 - 0.000238095238095244*G0_1_1_5_1_1 + 0.000562770562770583*G0_1_1_5_1_2 - 0.00112554112554116*G0_1_1_5_1_4 - 0.00406926406926421*G0_1_1_5_1_5 - 0.00166666666666672*G0_1_1_5_2_0 + 0.000562770562770583*G0_1_1_5_2_1 - 0.00110389610389616*G0_1_1_5_2_2 - 0.00112554112554117*G0_1_1_5_2_3 - 0.00225108225108233*G0_1_1_5_2_4 - 0.00155844155844161*G0_1_1_5_2_5 + 0.00112554112554116*G0_1_1_5_3_0 - 0.00112554112554117*G0_1_1_5_3_2 - 0.000865800865800899*G0_1_1_5_3_3 + 0.000865800865800893*G0_1_1_5_3_5 + 0.00779220779220806*G0_1_1_5_4_0 - 0.00112554112554116*G0_1_1_5_4_1 - 0.00225108225108233*G0_1_1_5_4_2 + 0.00450216450216465*G0_1_1_5_4_4 + 0.00536796536796555*G0_1_1_5_4_5 + 0.014458874458875*G0_1_1_5_5_0 - 0.00406926406926421*G0_1_1_5_5_1 - 0.00155844155844161*G0_1_1_5_5_2 + 0.000865800865800893*G0_1_1_5_5_3 + 0.00536796536796555*G0_1_1_5_5_4 + 0.00779220779220811*G0_1_1_5_5_5; + A[79] = A[97] + 0.0482142857142876*G0_0_1_0_0_0 - 0.00650162337662361*G0_0_1_0_0_1 - 0.0043100649350651*G0_0_1_0_0_2 + 0.00204545454545461*G0_0_1_0_0_3 + 0.0204545454545462*G0_0_1_0_0_4 + 0.0204545454545462*G0_0_1_0_0_5 - 0.00650162337662361*G0_0_1_0_1_0 + 0.00102272727272731*G0_0_1_0_1_1 + 0.000876623376623407*G0_0_1_0_1_2 - 0.00262987012987023*G0_0_1_0_1_4 - 0.0043100649350651*G0_0_1_0_2_0 + 0.000876623376623407*G0_0_1_0_2_1 + 0.00102272727272731*G0_0_1_0_2_2 - 0.00146103896103901*G0_0_1_0_2_3 - 0.00584415584415604*G0_0_1_0_2_4 - 0.00555194805194824*G0_0_1_0_2_5 + 0.00204545454545461*G0_0_1_0_3_0 - 0.00146103896103901*G0_0_1_0_3_2 - 0.00233766233766241*G0_0_1_0_3_3 + 0.00116883116883121*G0_0_1_0_3_4 + 0.00701298701298724*G0_0_1_0_3_5 + 0.0204545454545462*G0_0_1_0_4_0 - 0.00262987012987023*G0_0_1_0_4_1 - 0.00584415584415604*G0_0_1_0_4_2 + 0.00116883116883121*G0_0_1_0_4_3 + 0.0187012987012994*G0_0_1_0_4_4 + 0.0163636363636369*G0_0_1_0_4_5 + 0.0204545454545462*G0_0_1_0_5_0 - 0.00555194805194824*G0_0_1_0_5_2 + 0.00701298701298724*G0_0_1_0_5_3 + 0.0163636363636369*G0_0_1_0_5_4 + 0.0420779220779235*G0_0_1_0_5_5 - 0.00650162337662361*G0_0_1_1_0_0 + 0.00102272727272731*G0_0_1_1_0_1 + 0.000876623376623407*G0_0_1_1_0_2 - 0.00262987012987023*G0_0_1_1_0_4 + 0.00102272727272731*G0_0_1_1_1_0 + 0.0109577922077926*G0_0_1_1_1_1 - 0.00116883116883121*G0_0_1_1_1_2 + 0.00584415584415605*G0_0_1_1_1_3 + 0.00233766233766242*G0_0_1_1_1_4 - 0.00292207792207801*G0_0_1_1_1_5 + 0.000876623376623407*G0_0_1_1_2_0 - 0.00116883116883121*G0_0_1_1_2_1 - 0.000365259740259748*G0_0_1_1_2_2 - 0.00116883116883121*G0_0_1_1_2_3 + 0.00146103896103901*G0_0_1_1_2_4 + 0.00116883116883121*G0_0_1_1_2_5 + 0.00584415584415606*G0_0_1_1_3_1 - 0.00116883116883121*G0_0_1_1_3_2 + 0.00233766233766248*G0_0_1_1_3_3 - 0.00467532467532483*G0_0_1_1_3_4 - 0.00233766233766241*G0_0_1_1_3_5 - 0.00262987012987023*G0_0_1_1_4_0 + 0.00233766233766242*G0_0_1_1_4_1 + 0.00146103896103901*G0_0_1_1_4_2 - 0.00467532467532482*G0_0_1_1_4_3 - 0.0151948051948057*G0_0_1_1_4_4 - 0.00701298701298725*G0_0_1_1_4_5 - 0.00292207792207801*G0_0_1_1_5_1 + 0.00116883116883121*G0_0_1_1_5_2 - 0.00233766233766241*G0_0_1_1_5_3 - 0.00701298701298725*G0_0_1_1_5_4 - 0.0210389610389618*G0_0_1_1_5_5 - 0.0043100649350651*G0_0_1_2_0_0 + 0.000876623376623407*G0_0_1_2_0_1 + 0.00102272727272731*G0_0_1_2_0_2 - 0.001461038961039*G0_0_1_2_0_3 - 0.00584415584415604*G0_0_1_2_0_4 - 0.00555194805194824*G0_0_1_2_0_5 + 0.000876623376623407*G0_0_1_2_1_0 - 0.00116883116883121*G0_0_1_2_1_1 - 0.000365259740259748*G0_0_1_2_1_2 - 0.00116883116883121*G0_0_1_2_1_3 + 0.00146103896103901*G0_0_1_2_1_4 + 0.00116883116883121*G0_0_1_2_1_5 + 0.00102272727272731*G0_0_1_2_2_0 - 0.000365259740259748*G0_0_1_2_2_1 + 0.000657467532467532*G0_0_1_2_2_2 + 0.0011688311688312*G0_0_1_2_2_3 + 0.00321428571428581*G0_0_1_2_2_4 - 0.000876623376623405*G0_0_1_2_2_5 - 0.001461038961039*G0_0_1_2_3_0 - 0.00116883116883121*G0_0_1_2_3_1 + 0.0011688311688312*G0_0_1_2_3_2 + 0.00467532467532483*G0_0_1_2_3_5 - 0.00584415584415604*G0_0_1_2_4_0 + 0.00146103896103901*G0_0_1_2_4_1 + 0.00321428571428581*G0_0_1_2_4_2 - 0.0105194805194809*G0_0_1_2_4_4 - 0.00116883116883121*G0_0_1_2_4_5 - 0.00555194805194824*G0_0_1_2_5_0 + 0.00116883116883121*G0_0_1_2_5_1 - 0.000876623376623404*G0_0_1_2_5_2 + 0.00467532467532483*G0_0_1_2_5_3 - 0.00116883116883121*G0_0_1_2_5_4 + 0.0210389610389618*G0_0_1_2_5_5 + 0.00204545454545461*G0_0_1_3_0_0 - 0.00146103896103901*G0_0_1_3_0_2 - 0.00233766233766241*G0_0_1_3_0_3 + 0.00116883116883121*G0_0_1_3_0_4 + 0.00701298701298724*G0_0_1_3_0_5 + 0.00584415584415605*G0_0_1_3_1_1 - 0.00116883116883121*G0_0_1_3_1_2 + 0.00233766233766248*G0_0_1_3_1_3 - 0.00467532467532483*G0_0_1_3_1_4 - 0.00233766233766241*G0_0_1_3_1_5 - 0.00146103896103901*G0_0_1_3_2_0 - 0.00116883116883121*G0_0_1_3_2_1 + 0.0011688311688312*G0_0_1_3_2_2 + 0.00467532467532483*G0_0_1_3_2_5 - 0.00233766233766241*G0_0_1_3_3_0 + 0.00233766233766248*G0_0_1_3_3_1 + 0.0420779220779235*G0_0_1_3_3_3 + 0.0140259740259745*G0_0_1_3_3_4 - 0.00467532467532482*G0_0_1_3_3_5 + 0.00116883116883121*G0_0_1_3_4_0 - 0.00467532467532483*G0_0_1_3_4_1 + 0.0140259740259745*G0_0_1_3_4_3 + 0.0280519480519489*G0_0_1_3_4_4 + 0.00701298701298724*G0_0_1_3_5_0 - 0.00233766233766241*G0_0_1_3_5_1 + 0.00467532467532483*G0_0_1_3_5_2 - 0.00467532467532482*G0_0_1_3_5_3 - 0.056103896103898*G0_0_1_3_5_5 + 0.0204545454545462*G0_0_1_4_0_0 - 0.00262987012987023*G0_0_1_4_0_1 - 0.00584415584415604*G0_0_1_4_0_2 + 0.00116883116883121*G0_0_1_4_0_3 + 0.0187012987012994*G0_0_1_4_0_4 + 0.0163636363636369*G0_0_1_4_0_5 - 0.00262987012987023*G0_0_1_4_1_0 + 0.00233766233766242*G0_0_1_4_1_1 + 0.00146103896103901*G0_0_1_4_1_2 - 0.00467532467532483*G0_0_1_4_1_3 - 0.0151948051948057*G0_0_1_4_1_4 - 0.00701298701298725*G0_0_1_4_1_5 - 0.00584415584415604*G0_0_1_4_2_0 + 0.00146103896103901*G0_0_1_4_2_1 + 0.00321428571428581*G0_0_1_4_2_2 - 0.0105194805194809*G0_0_1_4_2_4 - 0.00116883116883121*G0_0_1_4_2_5 + 0.00116883116883121*G0_0_1_4_3_0 - 0.00467532467532483*G0_0_1_4_3_1 + 0.0140259740259745*G0_0_1_4_3_3 + 0.0280519480519489*G0_0_1_4_3_4 + 0.0187012987012994*G0_0_1_4_4_0 - 0.0151948051948057*G0_0_1_4_4_1 - 0.0105194805194809*G0_0_1_4_4_2 + 0.0280519480519489*G0_0_1_4_4_3 + 0.12623376623377*G0_0_1_4_4_4 + 0.0327272727272738*G0_0_1_4_4_5 + 0.0163636363636369*G0_0_1_4_5_0 - 0.00701298701298725*G0_0_1_4_5_1 - 0.00116883116883121*G0_0_1_4_5_2 + 0.0327272727272738*G0_0_1_4_5_4 - 0.028051948051949*G0_0_1_4_5_5 + 0.0204545454545462*G0_0_1_5_0_0 - 0.00555194805194824*G0_0_1_5_0_2 + 0.00701298701298724*G0_0_1_5_0_3 + 0.0163636363636369*G0_0_1_5_0_4 + 0.0420779220779235*G0_0_1_5_0_5 - 0.00292207792207801*G0_0_1_5_1_1 + 0.00116883116883121*G0_0_1_5_1_2 - 0.00233766233766241*G0_0_1_5_1_3 - 0.00701298701298725*G0_0_1_5_1_4 - 0.0210389610389618*G0_0_1_5_1_5 - 0.00555194805194824*G0_0_1_5_2_0 + 0.00116883116883121*G0_0_1_5_2_1 - 0.000876623376623404*G0_0_1_5_2_2 + 0.00467532467532483*G0_0_1_5_2_3 - 0.00116883116883121*G0_0_1_5_2_4 + 0.0210389610389618*G0_0_1_5_2_5 + 0.00701298701298724*G0_0_1_5_3_0 - 0.00233766233766241*G0_0_1_5_3_1 + 0.00467532467532483*G0_0_1_5_3_2 - 0.00467532467532482*G0_0_1_5_3_3 - 0.0561038961038981*G0_0_1_5_3_5 + 0.0163636363636369*G0_0_1_5_4_0 - 0.00701298701298725*G0_0_1_5_4_1 - 0.00116883116883121*G0_0_1_5_4_2 + 0.0327272727272738*G0_0_1_5_4_4 - 0.028051948051949*G0_0_1_5_4_5 + 0.0420779220779235*G0_0_1_5_5_0 - 0.0210389610389618*G0_0_1_5_5_1 + 0.0210389610389618*G0_0_1_5_5_2 - 0.056103896103898*G0_0_1_5_5_3 - 0.028051948051949*G0_0_1_5_5_4 - 0.420779220779236*G0_0_1_5_5_5 - 0.0482142857142876*G0_1_0_0_0_0 + 0.00650162337662361*G0_1_0_0_0_1 + 0.0043100649350651*G0_1_0_0_0_2 - 0.00204545454545461*G0_1_0_0_0_3 - 0.0204545454545462*G0_1_0_0_0_4 - 0.0204545454545462*G0_1_0_0_0_5 + 0.00650162337662361*G0_1_0_0_1_0 - 0.00102272727272731*G0_1_0_0_1_1 - 0.000876623376623407*G0_1_0_0_1_2 + 0.00262987012987023*G0_1_0_0_1_4 + 0.0043100649350651*G0_1_0_0_2_0 - 0.000876623376623407*G0_1_0_0_2_1 - 0.00102272727272731*G0_1_0_0_2_2 + 0.00146103896103901*G0_1_0_0_2_3 + 0.00584415584415604*G0_1_0_0_2_4 + 0.00555194805194824*G0_1_0_0_2_5 - 0.00204545454545461*G0_1_0_0_3_0 + 0.00146103896103901*G0_1_0_0_3_2 + 0.00233766233766241*G0_1_0_0_3_3 - 0.00116883116883121*G0_1_0_0_3_4 - 0.00701298701298724*G0_1_0_0_3_5 - 0.0204545454545462*G0_1_0_0_4_0 + 0.00262987012987023*G0_1_0_0_4_1 + 0.00584415584415604*G0_1_0_0_4_2 - 0.00116883116883121*G0_1_0_0_4_3 - 0.0187012987012994*G0_1_0_0_4_4 - 0.0163636363636369*G0_1_0_0_4_5 - 0.0204545454545462*G0_1_0_0_5_0 + 0.00555194805194824*G0_1_0_0_5_2 - 0.00701298701298724*G0_1_0_0_5_3 - 0.0163636363636369*G0_1_0_0_5_4 - 0.0420779220779235*G0_1_0_0_5_5 + 0.00650162337662361*G0_1_0_1_0_0 - 0.00102272727272731*G0_1_0_1_0_1 - 0.000876623376623407*G0_1_0_1_0_2 + 0.00262987012987023*G0_1_0_1_0_4 - 0.00102272727272731*G0_1_0_1_1_0 - 0.0109577922077926*G0_1_0_1_1_1 + 0.00116883116883121*G0_1_0_1_1_2 - 0.00584415584415606*G0_1_0_1_1_3 - 0.00233766233766242*G0_1_0_1_1_4 + 0.00292207792207801*G0_1_0_1_1_5 - 0.000876623376623407*G0_1_0_1_2_0 + 0.00116883116883121*G0_1_0_1_2_1 + 0.000365259740259748*G0_1_0_1_2_2 + 0.00116883116883121*G0_1_0_1_2_3 - 0.00146103896103901*G0_1_0_1_2_4 - 0.00116883116883121*G0_1_0_1_2_5 - 0.00584415584415606*G0_1_0_1_3_1 + 0.00116883116883121*G0_1_0_1_3_2 - 0.00233766233766248*G0_1_0_1_3_3 + 0.00467532467532483*G0_1_0_1_3_4 + 0.00233766233766241*G0_1_0_1_3_5 + 0.00262987012987023*G0_1_0_1_4_0 - 0.00233766233766242*G0_1_0_1_4_1 - 0.00146103896103901*G0_1_0_1_4_2 + 0.00467532467532483*G0_1_0_1_4_3 + 0.0151948051948057*G0_1_0_1_4_4 + 0.00701298701298725*G0_1_0_1_4_5 + 0.00292207792207801*G0_1_0_1_5_1 - 0.00116883116883121*G0_1_0_1_5_2 + 0.00233766233766241*G0_1_0_1_5_3 + 0.00701298701298725*G0_1_0_1_5_4 + 0.0210389610389618*G0_1_0_1_5_5 + 0.0043100649350651*G0_1_0_2_0_0 - 0.000876623376623407*G0_1_0_2_0_1 - 0.00102272727272731*G0_1_0_2_0_2 + 0.00146103896103901*G0_1_0_2_0_3 + 0.00584415584415604*G0_1_0_2_0_4 + 0.00555194805194824*G0_1_0_2_0_5 - 0.000876623376623407*G0_1_0_2_1_0 + 0.00116883116883121*G0_1_0_2_1_1 + 0.000365259740259748*G0_1_0_2_1_2 + 0.00116883116883121*G0_1_0_2_1_3 - 0.00146103896103901*G0_1_0_2_1_4 - 0.00116883116883121*G0_1_0_2_1_5 - 0.00102272727272731*G0_1_0_2_2_0 + 0.000365259740259748*G0_1_0_2_2_1 - 0.000657467532467532*G0_1_0_2_2_2 - 0.0011688311688312*G0_1_0_2_2_3 - 0.00321428571428581*G0_1_0_2_2_4 + 0.000876623376623404*G0_1_0_2_2_5 + 0.00146103896103901*G0_1_0_2_3_0 + 0.00116883116883121*G0_1_0_2_3_1 - 0.0011688311688312*G0_1_0_2_3_2 - 0.00467532467532483*G0_1_0_2_3_5 + 0.00584415584415604*G0_1_0_2_4_0 - 0.00146103896103901*G0_1_0_2_4_1 - 0.00321428571428581*G0_1_0_2_4_2 + 0.0105194805194809*G0_1_0_2_4_4 + 0.00116883116883121*G0_1_0_2_4_5 + 0.00555194805194824*G0_1_0_2_5_0 - 0.00116883116883121*G0_1_0_2_5_1 + 0.000876623376623404*G0_1_0_2_5_2 - 0.00467532467532483*G0_1_0_2_5_3 + 0.00116883116883121*G0_1_0_2_5_4 - 0.0210389610389618*G0_1_0_2_5_5 - 0.00204545454545461*G0_1_0_3_0_0 + 0.00146103896103901*G0_1_0_3_0_2 + 0.00233766233766241*G0_1_0_3_0_3 - 0.00116883116883121*G0_1_0_3_0_4 - 0.00701298701298724*G0_1_0_3_0_5 - 0.00584415584415606*G0_1_0_3_1_1 + 0.00116883116883121*G0_1_0_3_1_2 - 0.00233766233766248*G0_1_0_3_1_3 + 0.00467532467532483*G0_1_0_3_1_4 + 0.00233766233766241*G0_1_0_3_1_5 + 0.00146103896103901*G0_1_0_3_2_0 + 0.00116883116883121*G0_1_0_3_2_1 - 0.0011688311688312*G0_1_0_3_2_2 - 0.00467532467532483*G0_1_0_3_2_5 + 0.00233766233766241*G0_1_0_3_3_0 - 0.00233766233766248*G0_1_0_3_3_1 - 0.0420779220779235*G0_1_0_3_3_3 - 0.0140259740259745*G0_1_0_3_3_4 + 0.0046753246753248*G0_1_0_3_3_5 - 0.00116883116883121*G0_1_0_3_4_0 + 0.00467532467532483*G0_1_0_3_4_1 - 0.0140259740259745*G0_1_0_3_4_3 - 0.028051948051949*G0_1_0_3_4_4 - 0.00701298701298724*G0_1_0_3_5_0 + 0.00233766233766241*G0_1_0_3_5_1 - 0.00467532467532483*G0_1_0_3_5_2 + 0.00467532467532481*G0_1_0_3_5_3 + 0.056103896103898*G0_1_0_3_5_5 - 0.0204545454545462*G0_1_0_4_0_0 + 0.00262987012987023*G0_1_0_4_0_1 + 0.00584415584415604*G0_1_0_4_0_2 - 0.00116883116883121*G0_1_0_4_0_3 - 0.0187012987012994*G0_1_0_4_0_4 - 0.0163636363636369*G0_1_0_4_0_5 + 0.00262987012987023*G0_1_0_4_1_0 - 0.00233766233766242*G0_1_0_4_1_1 - 0.00146103896103901*G0_1_0_4_1_2 + 0.00467532467532483*G0_1_0_4_1_3 + 0.0151948051948057*G0_1_0_4_1_4 + 0.00701298701298725*G0_1_0_4_1_5 + 0.00584415584415604*G0_1_0_4_2_0 - 0.00146103896103901*G0_1_0_4_2_1 - 0.00321428571428581*G0_1_0_4_2_2 + 0.0105194805194809*G0_1_0_4_2_4 + 0.00116883116883121*G0_1_0_4_2_5 - 0.00116883116883121*G0_1_0_4_3_0 + 0.00467532467532483*G0_1_0_4_3_1 - 0.0140259740259745*G0_1_0_4_3_3 - 0.028051948051949*G0_1_0_4_3_4 - 0.0187012987012994*G0_1_0_4_4_0 + 0.0151948051948057*G0_1_0_4_4_1 + 0.0105194805194809*G0_1_0_4_4_2 - 0.028051948051949*G0_1_0_4_4_3 - 0.12623376623377*G0_1_0_4_4_4 - 0.0327272727272739*G0_1_0_4_4_5 - 0.0163636363636369*G0_1_0_4_5_0 + 0.00701298701298725*G0_1_0_4_5_1 + 0.00116883116883121*G0_1_0_4_5_2 - 0.0327272727272739*G0_1_0_4_5_4 + 0.028051948051949*G0_1_0_4_5_5 - 0.0204545454545462*G0_1_0_5_0_0 + 0.00555194805194824*G0_1_0_5_0_2 - 0.00701298701298724*G0_1_0_5_0_3 - 0.0163636363636369*G0_1_0_5_0_4 - 0.0420779220779235*G0_1_0_5_0_5 + 0.00292207792207801*G0_1_0_5_1_1 - 0.00116883116883121*G0_1_0_5_1_2 + 0.00233766233766241*G0_1_0_5_1_3 + 0.00701298701298725*G0_1_0_5_1_4 + 0.0210389610389618*G0_1_0_5_1_5 + 0.00555194805194824*G0_1_0_5_2_0 - 0.00116883116883121*G0_1_0_5_2_1 + 0.000876623376623404*G0_1_0_5_2_2 - 0.00467532467532483*G0_1_0_5_2_3 + 0.00116883116883121*G0_1_0_5_2_4 - 0.0210389610389618*G0_1_0_5_2_5 - 0.00701298701298724*G0_1_0_5_3_0 + 0.00233766233766241*G0_1_0_5_3_1 - 0.00467532467532483*G0_1_0_5_3_2 + 0.00467532467532481*G0_1_0_5_3_3 + 0.056103896103898*G0_1_0_5_3_5 - 0.0163636363636369*G0_1_0_5_4_0 + 0.00701298701298725*G0_1_0_5_4_1 + 0.00116883116883121*G0_1_0_5_4_2 - 0.0327272727272739*G0_1_0_5_4_4 + 0.028051948051949*G0_1_0_5_4_5 - 0.0420779220779235*G0_1_0_5_5_0 + 0.0210389610389618*G0_1_0_5_5_1 - 0.0210389610389618*G0_1_0_5_5_2 + 0.056103896103898*G0_1_0_5_5_3 + 0.028051948051949*G0_1_0_5_5_4 + 0.420779220779236*G0_1_0_5_5_5; + A[20] = -A[21] - 0.0125892857142861*G0_1_0_0_0_0 + 0.00121482683982688*G0_1_0_0_0_1 + 0.000619588744588766*G0_1_0_0_0_2 - 0.000113636363636366*G0_1_0_0_0_3 - 0.00143398268398273*G0_1_0_0_0_4 - 0.00457251082251098*G0_1_0_0_0_5 + 0.00121482683982688*G0_1_0_0_1_0 - 0.00121482683982688*G0_1_0_0_1_1 - 0.000200216450216456*G0_1_0_0_1_3 + 0.000200216450216457*G0_1_0_0_1_4 + 0.000619588744588766*G0_1_0_0_2_0 - 0.000595238095238116*G0_1_0_0_2_2 - 0.000844155844155873*G0_1_0_0_2_4 + 0.000286796536796546*G0_1_0_0_2_5 - 0.000113636363636366*G0_1_0_0_3_0 - 0.000200216450216456*G0_1_0_0_3_1 + 0.000389610389610403*G0_1_0_0_3_3 - 0.000173160173160178*G0_1_0_0_3_4 - 0.000346320346320356*G0_1_0_0_3_5 - 0.00143398268398273*G0_1_0_0_4_0 + 0.000200216450216457*G0_1_0_0_4_1 - 0.000844155844155873*G0_1_0_0_4_2 - 0.000173160173160178*G0_1_0_0_4_3 - 0.00177489177489183*G0_1_0_0_4_4 - 0.000974025974026005*G0_1_0_0_4_5 - 0.00457251082251098*G0_1_0_0_5_0 + 0.000286796536796546*G0_1_0_0_5_2 - 0.000346320346320356*G0_1_0_0_5_3 - 0.000974025974026005*G0_1_0_0_5_4 - 0.00653679653679676*G0_1_0_0_5_5 + 0.00121482683982688*G0_1_0_1_0_0 - 0.00121482683982688*G0_1_0_1_0_1 - 0.000200216450216457*G0_1_0_1_0_3 + 0.000200216450216457*G0_1_0_1_0_4 - 0.00121482683982688*G0_1_0_1_1_0 + 0.0125892857142861*G0_1_0_1_1_1 - 0.000619588744588766*G0_1_0_1_1_2 + 0.00143398268398273*G0_1_0_1_1_3 + 0.000113636363636366*G0_1_0_1_1_4 + 0.00457251082251099*G0_1_0_1_1_5 - 0.000619588744588765*G0_1_0_1_2_1 + 0.000595238095238116*G0_1_0_1_2_2 + 0.000844155844155874*G0_1_0_1_2_3 - 0.000286796536796546*G0_1_0_1_2_5 - 0.000200216450216456*G0_1_0_1_3_0 + 0.00143398268398273*G0_1_0_1_3_1 + 0.000844155844155874*G0_1_0_1_3_2 + 0.00177489177489183*G0_1_0_1_3_3 + 0.000173160173160179*G0_1_0_1_3_4 + 0.000974025974026007*G0_1_0_1_3_5 + 0.000200216450216457*G0_1_0_1_4_0 + 0.000113636363636366*G0_1_0_1_4_1 + 0.000173160173160179*G0_1_0_1_4_3 - 0.000389610389610403*G0_1_0_1_4_4 + 0.000346320346320356*G0_1_0_1_4_5 + 0.00457251082251099*G0_1_0_1_5_1 - 0.000286796536796546*G0_1_0_1_5_2 + 0.000974025974026007*G0_1_0_1_5_3 + 0.000346320346320356*G0_1_0_1_5_4 + 0.00653679653679676*G0_1_0_1_5_5 + 0.000619588744588766*G0_1_0_2_0_0 - 0.000595238095238117*G0_1_0_2_0_2 - 0.000844155844155873*G0_1_0_2_0_4 + 0.000286796536796546*G0_1_0_2_0_5 - 0.000619588744588765*G0_1_0_2_1_1 + 0.000595238095238116*G0_1_0_2_1_2 + 0.000844155844155874*G0_1_0_2_1_3 - 0.000286796536796546*G0_1_0_2_1_5 - 0.000595238095238116*G0_1_0_2_2_0 + 0.000595238095238116*G0_1_0_2_2_1 - 0.00313852813852825*G0_1_0_2_2_3 + 0.00313852813852825*G0_1_0_2_2_4 + 0.000844155844155874*G0_1_0_2_3_1 - 0.00313852813852825*G0_1_0_2_3_2 - 0.00476190476190493*G0_1_0_2_3_3 - 0.000173160173160179*G0_1_0_2_3_5 - 0.000844155844155873*G0_1_0_2_4_0 + 0.00313852813852825*G0_1_0_2_4_2 + 0.00476190476190492*G0_1_0_2_4_4 + 0.00017316017316018*G0_1_0_2_4_5 + 0.000286796536796546*G0_1_0_2_5_0 - 0.000286796536796546*G0_1_0_2_5_1 - 0.000173160173160179*G0_1_0_2_5_3 + 0.00017316017316018*G0_1_0_2_5_4 - 0.000113636363636366*G0_1_0_3_0_0 - 0.000200216450216456*G0_1_0_3_0_1 + 0.000389610389610403*G0_1_0_3_0_3 - 0.000173160173160178*G0_1_0_3_0_4 - 0.000346320346320356*G0_1_0_3_0_5 - 0.000200216450216456*G0_1_0_3_1_0 + 0.00143398268398273*G0_1_0_3_1_1 + 0.000844155844155874*G0_1_0_3_1_2 + 0.00177489177489183*G0_1_0_3_1_3 + 0.000173160173160179*G0_1_0_3_1_4 + 0.000974025974026007*G0_1_0_3_1_5 + 0.000844155844155874*G0_1_0_3_2_1 - 0.00313852813852825*G0_1_0_3_2_2 - 0.00476190476190493*G0_1_0_3_2_3 - 0.000173160173160179*G0_1_0_3_2_5 + 0.000389610389610403*G0_1_0_3_3_0 + 0.00177489177489183*G0_1_0_3_3_1 - 0.00476190476190493*G0_1_0_3_3_2 - 0.0101298701298705*G0_1_0_3_3_3 - 0.00112554112554117*G0_1_0_3_3_4 - 0.000432900432900454*G0_1_0_3_3_5 - 0.000173160173160178*G0_1_0_3_4_0 + 0.000173160173160179*G0_1_0_3_4_1 - 0.00112554112554117*G0_1_0_3_4_3 + 0.00112554112554116*G0_1_0_3_4_4 - 0.000346320346320356*G0_1_0_3_5_0 + 0.000974025974026007*G0_1_0_3_5_1 - 0.000173160173160179*G0_1_0_3_5_2 - 0.000432900432900454*G0_1_0_3_5_3 + 0.000692640692640715*G0_1_0_3_5_5 - 0.00143398268398273*G0_1_0_4_0_0 + 0.000200216450216457*G0_1_0_4_0_1 - 0.000844155844155873*G0_1_0_4_0_2 - 0.000173160173160178*G0_1_0_4_0_3 - 0.00177489177489183*G0_1_0_4_0_4 - 0.000974025974026005*G0_1_0_4_0_5 + 0.000200216450216457*G0_1_0_4_1_0 + 0.000113636363636366*G0_1_0_4_1_1 + 0.000173160173160179*G0_1_0_4_1_3 - 0.000389610389610403*G0_1_0_4_1_4 + 0.000346320346320356*G0_1_0_4_1_5 - 0.000844155844155873*G0_1_0_4_2_0 + 0.00313852813852825*G0_1_0_4_2_2 + 0.00476190476190492*G0_1_0_4_2_4 + 0.00017316017316018*G0_1_0_4_2_5 - 0.000173160173160178*G0_1_0_4_3_0 + 0.000173160173160179*G0_1_0_4_3_1 - 0.00112554112554117*G0_1_0_4_3_3 + 0.00112554112554116*G0_1_0_4_3_4 - 0.00177489177489183*G0_1_0_4_4_0 - 0.000389610389610403*G0_1_0_4_4_1 + 0.00476190476190492*G0_1_0_4_4_2 + 0.00112554112554116*G0_1_0_4_4_3 + 0.0101298701298705*G0_1_0_4_4_4 + 0.00043290043290045*G0_1_0_4_4_5 - 0.000974025974026005*G0_1_0_4_5_0 + 0.000346320346320356*G0_1_0_4_5_1 + 0.00017316017316018*G0_1_0_4_5_2 + 0.00043290043290045*G0_1_0_4_5_4 - 0.000692640692640717*G0_1_0_4_5_5 - 0.00457251082251098*G0_1_0_5_0_0 + 0.000286796536796546*G0_1_0_5_0_2 - 0.000346320346320356*G0_1_0_5_0_3 - 0.000974025974026005*G0_1_0_5_0_4 - 0.00653679653679676*G0_1_0_5_0_5 + 0.00457251082251099*G0_1_0_5_1_1 - 0.000286796536796546*G0_1_0_5_1_2 + 0.000974025974026007*G0_1_0_5_1_3 + 0.000346320346320357*G0_1_0_5_1_4 + 0.00653679653679676*G0_1_0_5_1_5 + 0.000286796536796546*G0_1_0_5_2_0 - 0.000286796536796546*G0_1_0_5_2_1 - 0.000173160173160179*G0_1_0_5_2_3 + 0.00017316017316018*G0_1_0_5_2_4 - 0.000346320346320356*G0_1_0_5_3_0 + 0.000974025974026007*G0_1_0_5_3_1 - 0.000173160173160179*G0_1_0_5_3_2 - 0.000432900432900455*G0_1_0_5_3_3 + 0.000692640692640715*G0_1_0_5_3_5 - 0.000974025974026005*G0_1_0_5_4_0 + 0.000346320346320357*G0_1_0_5_4_1 + 0.00017316017316018*G0_1_0_5_4_2 + 0.000432900432900449*G0_1_0_5_4_4 - 0.000692640692640717*G0_1_0_5_4_5 - 0.00653679653679676*G0_1_0_5_5_0 + 0.00653679653679676*G0_1_0_5_5_1 + 0.000692640692640714*G0_1_0_5_5_3 - 0.000692640692640717*G0_1_0_5_5_4 - 0.0141233766233771*G0_1_1_0_0_0 + 0.0010939754689755*G0_1_1_0_0_1 + 0.00049873737373739*G0_1_1_0_0_2 - 0.000212842712842718*G0_1_1_0_0_3 - 0.00173160173160179*G0_1_1_0_0_4 - 0.00487012987013004*G0_1_1_0_0_5 + 0.0010939754689755*G0_1_1_0_1_0 - 0.000120851370851375*G0_1_1_0_1_1 - 0.000102813852813856*G0_1_1_0_1_3 + 0.000678210678210702*G0_1_1_0_1_5 + 0.00049873737373739*G0_1_1_0_2_0 + 0.000498737373737392*G0_1_1_0_2_2 + 0.00018398268398269*G0_1_1_0_2_3 - 0.00016594516594517*G0_1_1_0_2_4 + 0.00018398268398269*G0_1_1_0_2_5 - 0.000212842712842718*G0_1_1_0_3_0 - 0.000102813852813856*G0_1_1_0_3_1 + 0.00018398268398269*G0_1_1_0_3_2 + 0.000418470418470433*G0_1_1_0_3_3 + 0.000230880230880239*G0_1_1_0_3_4 - 0.00173160173160179*G0_1_1_0_4_0 - 0.00016594516594517*G0_1_1_0_4_2 + 0.000230880230880239*G0_1_1_0_4_3 + 0.00034632034632036*G0_1_1_0_4_4 - 0.000562770562770581*G0_1_1_0_4_5 - 0.00487012987013004*G0_1_1_0_5_0 + 0.000678210678210702*G0_1_1_0_5_1 + 0.00018398268398269*G0_1_1_0_5_2 - 0.000562770562770581*G0_1_1_0_5_4 - 0.00441558441558457*G0_1_1_0_5_5 + 0.00109397546897551*G0_1_1_1_0_0 - 0.000120851370851375*G0_1_1_1_0_1 - 0.000102813852813856*G0_1_1_1_0_3 + 0.000678210678210702*G0_1_1_1_0_5 - 0.000120851370851375*G0_1_1_1_1_0 - 0.00153409090909096*G0_1_1_1_1_1 - 0.000120851370851375*G0_1_1_1_1_2 - 0.000297619047619058*G0_1_1_1_1_3 - 0.00029761904761906*G0_1_1_1_1_5 - 0.000120851370851375*G0_1_1_1_2_1 + 0.00109397546897551*G0_1_1_1_2_2 + 0.000678210678210703*G0_1_1_1_2_3 - 0.000102813852813856*G0_1_1_1_2_5 - 0.000102813852813856*G0_1_1_1_3_0 - 0.000297619047619058*G0_1_1_1_3_1 + 0.000678210678210703*G0_1_1_1_3_2 + 0.0021212121212122*G0_1_1_1_3_3 + 0.000404040404040418*G0_1_1_1_3_4 + 0.000411255411255425*G0_1_1_1_3_5 + 0.000404040404040418*G0_1_1_1_4_3 + 0.000404040404040417*G0_1_1_1_4_5 + 0.000678210678210702*G0_1_1_1_5_0 - 0.00029761904761906*G0_1_1_1_5_1 - 0.000102813852813856*G0_1_1_1_5_2 + 0.000411255411255425*G0_1_1_1_5_3 + 0.000404040404040417*G0_1_1_1_5_4 + 0.00212121212121219*G0_1_1_1_5_5 + 0.00049873737373739*G0_1_1_2_0_0 + 0.000498737373737392*G0_1_1_2_0_2 + 0.00018398268398269*G0_1_1_2_0_3 - 0.00016594516594517*G0_1_1_2_0_4 + 0.00018398268398269*G0_1_1_2_0_5 - 0.000120851370851375*G0_1_1_2_1_1 + 0.00109397546897551*G0_1_1_2_1_2 + 0.000678210678210703*G0_1_1_2_1_3 - 0.000102813852813856*G0_1_1_2_1_5 + 0.000498737373737392*G0_1_1_2_2_0 + 0.00109397546897551*G0_1_1_2_2_1 - 0.0141233766233771*G0_1_1_2_2_2 - 0.00487012987013005*G0_1_1_2_2_3 - 0.0017316017316018*G0_1_1_2_2_4 - 0.000212842712842723*G0_1_1_2_2_5 + 0.00018398268398269*G0_1_1_2_3_0 + 0.000678210678210703*G0_1_1_2_3_1 - 0.00487012987013005*G0_1_1_2_3_2 - 0.00441558441558458*G0_1_1_2_3_3 - 0.000562770562770586*G0_1_1_2_3_4 - 0.00016594516594517*G0_1_1_2_4_0 - 0.0017316017316018*G0_1_1_2_4_2 - 0.000562770562770586*G0_1_1_2_4_3 + 0.000346320346320352*G0_1_1_2_4_4 + 0.000230880230880238*G0_1_1_2_4_5 + 0.00018398268398269*G0_1_1_2_5_0 - 0.000102813852813856*G0_1_1_2_5_1 - 0.000212842712842723*G0_1_1_2_5_2 + 0.000230880230880238*G0_1_1_2_5_4 + 0.000418470418470433*G0_1_1_2_5_5 - 0.000212842712842718*G0_1_1_3_0_0 - 0.000102813852813856*G0_1_1_3_0_1 + 0.00018398268398269*G0_1_1_3_0_2 + 0.000418470418470433*G0_1_1_3_0_3 + 0.000230880230880239*G0_1_1_3_0_4 - 0.000102813852813856*G0_1_1_3_1_0 - 0.000297619047619058*G0_1_1_3_1_1 + 0.000678210678210703*G0_1_1_3_1_2 + 0.0021212121212122*G0_1_1_3_1_3 + 0.000404040404040418*G0_1_1_3_1_4 + 0.000411255411255425*G0_1_1_3_1_5 + 0.00018398268398269*G0_1_1_3_2_0 + 0.000678210678210703*G0_1_1_3_2_1 - 0.00487012987013005*G0_1_1_3_2_2 - 0.00441558441558458*G0_1_1_3_2_3 - 0.000562770562770586*G0_1_1_3_2_4 + 0.000418470418470433*G0_1_1_3_3_0 + 0.0021212121212122*G0_1_1_3_3_1 - 0.00441558441558458*G0_1_1_3_3_2 - 0.00441558441558459*G0_1_1_3_3_3 - 0.0016450216450217*G0_1_1_3_3_4 - 0.000952380952380987*G0_1_1_3_3_5 + 0.000230880230880239*G0_1_1_3_4_0 + 0.000404040404040418*G0_1_1_3_4_1 - 0.000562770562770586*G0_1_1_3_4_2 - 0.0016450216450217*G0_1_1_3_4_3 - 0.00051948051948054*G0_1_1_3_4_4 - 0.000923520923520955*G0_1_1_3_4_5 + 0.000411255411255425*G0_1_1_3_5_1 - 0.000952380952380987*G0_1_1_3_5_3 - 0.000923520923520955*G0_1_1_3_5_4 - 0.000952380952380985*G0_1_1_3_5_5 - 0.00173160173160179*G0_1_1_4_0_0 - 0.00016594516594517*G0_1_1_4_0_2 + 0.000230880230880239*G0_1_1_4_0_3 + 0.00034632034632036*G0_1_1_4_0_4 - 0.000562770562770581*G0_1_1_4_0_5 + 0.000404040404040418*G0_1_1_4_1_3 + 0.000404040404040417*G0_1_1_4_1_5 - 0.00016594516594517*G0_1_1_4_2_0 - 0.0017316017316018*G0_1_1_4_2_2 - 0.000562770562770586*G0_1_1_4_2_3 + 0.000346320346320352*G0_1_1_4_2_4 + 0.000230880230880238*G0_1_1_4_2_5 + 0.000230880230880239*G0_1_1_4_3_0 + 0.000404040404040418*G0_1_1_4_3_1 - 0.000562770562770586*G0_1_1_4_3_2 - 0.0016450216450217*G0_1_1_4_3_3 - 0.00051948051948054*G0_1_1_4_3_4 - 0.000923520923520955*G0_1_1_4_3_5 + 0.000346320346320359*G0_1_1_4_4_0 + 0.000346320346320352*G0_1_1_4_4_2 - 0.00051948051948054*G0_1_1_4_4_3 + 0.00571428571428589*G0_1_1_4_4_4 - 0.000519480519480538*G0_1_1_4_4_5 - 0.000562770562770581*G0_1_1_4_5_0 + 0.000404040404040417*G0_1_1_4_5_1 + 0.000230880230880238*G0_1_1_4_5_2 - 0.000923520923520955*G0_1_1_4_5_3 - 0.000519480519480538*G0_1_1_4_5_4 - 0.0016450216450217*G0_1_1_4_5_5 - 0.00487012987013004*G0_1_1_5_0_0 + 0.000678210678210702*G0_1_1_5_0_1 + 0.00018398268398269*G0_1_1_5_0_2 - 0.000562770562770581*G0_1_1_5_0_4 - 0.00441558441558457*G0_1_1_5_0_5 + 0.000678210678210702*G0_1_1_5_1_0 - 0.000297619047619059*G0_1_1_5_1_1 - 0.000102813852813856*G0_1_1_5_1_2 + 0.000411255411255425*G0_1_1_5_1_3 + 0.000404040404040417*G0_1_1_5_1_4 + 0.00212121212121219*G0_1_1_5_1_5 + 0.00018398268398269*G0_1_1_5_2_0 - 0.000102813852813856*G0_1_1_5_2_1 - 0.000212842712842723*G0_1_1_5_2_2 + 0.000230880230880238*G0_1_1_5_2_4 + 0.000418470418470433*G0_1_1_5_2_5 + 0.000411255411255425*G0_1_1_5_3_1 - 0.000952380952380987*G0_1_1_5_3_3 - 0.000923520923520955*G0_1_1_5_3_4 - 0.000952380952380985*G0_1_1_5_3_5 - 0.000562770562770581*G0_1_1_5_4_0 + 0.000404040404040417*G0_1_1_5_4_1 + 0.000230880230880238*G0_1_1_5_4_2 - 0.000923520923520955*G0_1_1_5_4_3 - 0.000519480519480538*G0_1_1_5_4_4 - 0.0016450216450217*G0_1_1_5_4_5 - 0.00441558441558457*G0_1_1_5_5_0 + 0.00212121212121219*G0_1_1_5_5_1 + 0.000418470418470433*G0_1_1_5_5_2 - 0.000952380952380985*G0_1_1_5_5_3 - 0.0016450216450217*G0_1_1_5_5_4 - 0.00441558441558458*G0_1_1_5_5_5; + A[18] = -A[13] - 0.0129626623376628*G0_0_0_0_0_0 + 0.000357142857142867*G0_0_0_0_0_1 + 0.00112283549783553*G0_0_0_0_0_2 - 0.00100108225108228*G0_0_0_0_0_3 - 0.00739718614718639*G0_0_0_0_0_4 - 0.00315476190476201*G0_0_0_0_0_5 + 0.000357142857142867*G0_0_0_0_1_0 + 0.00557359307359326*G0_0_0_0_1_1 - 0.000359848484848497*G0_0_0_0_1_2 + 0.000216450216450228*G0_0_0_0_1_3 - 0.000146103896103899*G0_0_0_0_1_4 + 0.00194805194805202*G0_0_0_0_1_5 + 0.00112283549783553*G0_0_0_0_2_0 - 0.000359848484848497*G0_0_0_0_2_1 + 0.00112283549783554*G0_0_0_0_2_2 + 0.00022186147186148*G0_0_0_0_2_3 + 0.00275974025974035*G0_0_0_0_2_4 + 0.000221861471861482*G0_0_0_0_2_5 - 0.00100108225108228*G0_0_0_0_3_0 + 0.000216450216450228*G0_0_0_0_3_1 + 0.000221861471861481*G0_0_0_0_3_2 + 0.00385281385281396*G0_0_0_0_3_3 + 0.00229437229437236*G0_0_0_0_3_4 + 0.0015584415584416*G0_0_0_0_3_5 - 0.00739718614718639*G0_0_0_0_4_0 - 0.000146103896103899*G0_0_0_0_4_1 + 0.00275974025974035*G0_0_0_0_4_2 + 0.00229437229437236*G0_0_0_0_4_3 - 0.00307359307359318*G0_0_0_0_4_4 - 0.000151515151515165*G0_0_0_0_4_5 - 0.00315476190476201*G0_0_0_0_5_0 + 0.00194805194805202*G0_0_0_0_5_1 + 0.000221861471861481*G0_0_0_0_5_2 + 0.0015584415584416*G0_0_0_0_5_3 - 0.000151515151515165*G0_0_0_0_5_4 - 0.0022077922077923*G0_0_0_0_5_5 + 0.000357142857142867*G0_0_0_1_0_0 + 0.00557359307359326*G0_0_0_1_0_1 - 0.000359848484848497*G0_0_0_1_0_2 + 0.000216450216450228*G0_0_0_1_0_3 - 0.000146103896103899*G0_0_0_1_0_4 + 0.00194805194805202*G0_0_0_1_0_5 + 0.00557359307359326*G0_0_0_1_1_0 - 0.114042207792212*G0_0_0_1_1_1 + 0.00557359307359327*G0_0_0_1_1_2 - 0.0240259740259748*G0_0_0_1_1_3 - 0.00173160173160178*G0_0_0_1_1_4 - 0.0240259740259749*G0_0_0_1_1_5 - 0.000359848484848497*G0_0_0_1_2_0 + 0.00557359307359327*G0_0_0_1_2_1 + 0.00035714285714287*G0_0_0_1_2_2 + 0.00194805194805201*G0_0_0_1_2_3 - 0.000146103896103901*G0_0_0_1_2_4 + 0.000216450216450231*G0_0_0_1_2_5 + 0.000216450216450228*G0_0_0_1_3_0 - 0.0240259740259748*G0_0_0_1_3_1 + 0.00194805194805201*G0_0_0_1_3_2 - 0.00173160173160179*G0_0_0_1_3_3 + 0.00303030303030313*G0_0_0_1_3_4 - 0.00086580086580092*G0_0_0_1_3_5 - 0.000146103896103899*G0_0_0_1_4_0 - 0.00173160173160178*G0_0_0_1_4_1 - 0.000146103896103901*G0_0_0_1_4_2 + 0.00303030303030313*G0_0_0_1_4_3 + 0.00489177489177505*G0_0_0_1_4_4 + 0.00303030303030313*G0_0_0_1_4_5 + 0.00194805194805202*G0_0_0_1_5_0 - 0.0240259740259749*G0_0_0_1_5_1 + 0.000216450216450231*G0_0_0_1_5_2 - 0.00086580086580092*G0_0_0_1_5_3 + 0.00303030303030313*G0_0_0_1_5_4 - 0.00173160173160183*G0_0_0_1_5_5 + 0.00112283549783553*G0_0_0_2_0_0 - 0.000359848484848497*G0_0_0_2_0_1 + 0.00112283549783554*G0_0_0_2_0_2 + 0.000221861471861481*G0_0_0_2_0_3 + 0.00275974025974035*G0_0_0_2_0_4 + 0.000221861471861482*G0_0_0_2_0_5 - 0.000359848484848497*G0_0_0_2_1_0 + 0.00557359307359327*G0_0_0_2_1_1 + 0.00035714285714287*G0_0_0_2_1_2 + 0.00194805194805201*G0_0_0_2_1_3 - 0.0001461038961039*G0_0_0_2_1_4 + 0.000216450216450231*G0_0_0_2_1_5 + 0.00112283549783554*G0_0_0_2_2_0 + 0.00035714285714287*G0_0_0_2_2_1 - 0.0129626623376628*G0_0_0_2_2_2 - 0.00315476190476202*G0_0_0_2_2_3 - 0.00739718614718641*G0_0_0_2_2_4 - 0.00100108225108229*G0_0_0_2_2_5 + 0.000221861471861481*G0_0_0_2_3_0 + 0.00194805194805201*G0_0_0_2_3_1 - 0.00315476190476202*G0_0_0_2_3_2 - 0.0022077922077923*G0_0_0_2_3_3 - 0.000151515151515164*G0_0_0_2_3_4 + 0.00155844155844161*G0_0_0_2_3_5 + 0.00275974025974035*G0_0_0_2_4_0 - 0.000146103896103901*G0_0_0_2_4_1 - 0.00739718614718641*G0_0_0_2_4_2 - 0.000151515151515164*G0_0_0_2_4_3 - 0.00307359307359319*G0_0_0_2_4_4 + 0.00229437229437237*G0_0_0_2_4_5 + 0.000221861471861482*G0_0_0_2_5_0 + 0.000216450216450231*G0_0_0_2_5_1 - 0.00100108225108229*G0_0_0_2_5_2 + 0.00155844155844161*G0_0_0_2_5_3 + 0.00229437229437237*G0_0_0_2_5_4 + 0.00385281385281398*G0_0_0_2_5_5 - 0.00100108225108228*G0_0_0_3_0_0 + 0.000216450216450227*G0_0_0_3_0_1 + 0.000221861471861481*G0_0_0_3_0_2 + 0.00385281385281396*G0_0_0_3_0_3 + 0.00229437229437236*G0_0_0_3_0_4 + 0.0015584415584416*G0_0_0_3_0_5 + 0.000216450216450228*G0_0_0_3_1_0 - 0.0240259740259748*G0_0_0_3_1_1 + 0.00194805194805201*G0_0_0_3_1_2 - 0.00173160173160179*G0_0_0_3_1_3 + 0.00303030303030313*G0_0_0_3_1_4 - 0.00086580086580092*G0_0_0_3_1_5 + 0.00022186147186148*G0_0_0_3_2_0 + 0.00194805194805201*G0_0_0_3_2_1 - 0.00315476190476202*G0_0_0_3_2_2 - 0.0022077922077923*G0_0_0_3_2_3 - 0.000151515151515164*G0_0_0_3_2_4 + 0.00155844155844161*G0_0_0_3_2_5 + 0.00385281385281396*G0_0_0_3_3_0 - 0.00173160173160179*G0_0_0_3_3_1 - 0.0022077922077923*G0_0_0_3_3_2 - 0.0324675324675335*G0_0_0_3_3_3 - 0.0137662337662342*G0_0_0_3_3_4 - 0.0108225108225112*G0_0_0_3_3_5 + 0.00229437229437236*G0_0_0_3_4_0 + 0.00303030303030313*G0_0_0_3_4_1 - 0.000151515151515164*G0_0_0_3_4_2 - 0.0137662337662342*G0_0_0_3_4_3 - 0.0143722943722948*G0_0_0_3_4_4 - 0.00917748917748947*G0_0_0_3_4_5 + 0.0015584415584416*G0_0_0_3_5_0 - 0.00086580086580092*G0_0_0_3_5_1 + 0.00155844155844161*G0_0_0_3_5_2 - 0.0108225108225112*G0_0_0_3_5_3 - 0.00917748917748947*G0_0_0_3_5_4 - 0.0108225108225112*G0_0_0_3_5_5 - 0.00739718614718639*G0_0_0_4_0_0 - 0.000146103896103899*G0_0_0_4_0_1 + 0.00275974025974035*G0_0_0_4_0_2 + 0.00229437229437236*G0_0_0_4_0_3 - 0.00307359307359318*G0_0_0_4_0_4 - 0.000151515151515165*G0_0_0_4_0_5 - 0.000146103896103899*G0_0_0_4_1_0 - 0.00173160173160178*G0_0_0_4_1_1 - 0.0001461038961039*G0_0_0_4_1_2 + 0.00303030303030313*G0_0_0_4_1_3 + 0.00489177489177505*G0_0_0_4_1_4 + 0.00303030303030313*G0_0_0_4_1_5 + 0.00275974025974035*G0_0_0_4_2_0 - 0.000146103896103901*G0_0_0_4_2_1 - 0.00739718614718641*G0_0_0_4_2_2 - 0.000151515151515164*G0_0_0_4_2_3 - 0.0030735930735932*G0_0_0_4_2_4 + 0.00229437229437237*G0_0_0_4_2_5 + 0.00229437229437236*G0_0_0_4_3_0 + 0.00303030303030313*G0_0_0_4_3_1 - 0.000151515151515164*G0_0_0_4_3_2 - 0.0137662337662342*G0_0_0_4_3_3 - 0.0143722943722948*G0_0_0_4_3_4 - 0.00917748917748947*G0_0_0_4_3_5 - 0.00307359307359318*G0_0_0_4_4_0 + 0.00489177489177505*G0_0_0_4_4_1 - 0.0030735930735932*G0_0_0_4_4_2 - 0.0143722943722948*G0_0_0_4_4_3 - 0.0800000000000026*G0_0_0_4_4_4 - 0.0143722943722948*G0_0_0_4_4_5 - 0.000151515151515165*G0_0_0_4_5_0 + 0.00303030303030313*G0_0_0_4_5_1 + 0.00229437229437237*G0_0_0_4_5_2 - 0.00917748917748947*G0_0_0_4_5_3 - 0.0143722943722948*G0_0_0_4_5_4 - 0.0137662337662342*G0_0_0_4_5_5 - 0.00315476190476201*G0_0_0_5_0_0 + 0.00194805194805202*G0_0_0_5_0_1 + 0.000221861471861481*G0_0_0_5_0_2 + 0.0015584415584416*G0_0_0_5_0_3 - 0.000151515151515165*G0_0_0_5_0_4 - 0.0022077922077923*G0_0_0_5_0_5 + 0.00194805194805202*G0_0_0_5_1_0 - 0.0240259740259749*G0_0_0_5_1_1 + 0.000216450216450231*G0_0_0_5_1_2 - 0.00086580086580092*G0_0_0_5_1_3 + 0.00303030303030313*G0_0_0_5_1_4 - 0.00173160173160183*G0_0_0_5_1_5 + 0.000221861471861482*G0_0_0_5_2_0 + 0.000216450216450231*G0_0_0_5_2_1 - 0.00100108225108229*G0_0_0_5_2_2 + 0.00155844155844161*G0_0_0_5_2_3 + 0.00229437229437237*G0_0_0_5_2_4 + 0.00385281385281398*G0_0_0_5_2_5 + 0.0015584415584416*G0_0_0_5_3_0 - 0.00086580086580092*G0_0_0_5_3_1 + 0.00155844155844161*G0_0_0_5_3_2 - 0.0108225108225112*G0_0_0_5_3_3 - 0.00917748917748947*G0_0_0_5_3_4 - 0.0108225108225112*G0_0_0_5_3_5 - 0.000151515151515165*G0_0_0_5_4_0 + 0.00303030303030313*G0_0_0_5_4_1 + 0.00229437229437237*G0_0_0_5_4_2 - 0.00917748917748947*G0_0_0_5_4_3 - 0.0143722943722948*G0_0_0_5_4_4 - 0.0137662337662342*G0_0_0_5_4_5 - 0.0022077922077923*G0_0_0_5_5_0 - 0.00173160173160183*G0_0_0_5_5_1 + 0.00385281385281398*G0_0_0_5_5_2 - 0.0108225108225112*G0_0_0_5_5_3 - 0.0137662337662342*G0_0_0_5_5_4 - 0.0324675324675336*G0_0_0_5_5_5; + A[88] = -A[83] + 0.0559212662337681*G0_0_0_0_0_0 - 0.00234983766233774*G0_0_0_0_0_1 - 0.00557629870129889*G0_0_0_0_0_2 + 0.00340909090909101*G0_0_0_0_0_3 + 0.0271753246753256*G0_0_0_0_0_4 + 0.0154383116883122*G0_0_0_0_0_5 - 0.00234983766233774*G0_0_0_0_1_0 - 0.0079139610389613*G0_0_0_0_1_1 + 0.000718344155844181*G0_0_0_0_1_2 - 0.000487012987013011*G0_0_0_0_1_3 - 0.000681818181818209*G0_0_0_0_1_4 - 0.00535714285714306*G0_0_0_0_1_5 - 0.00557629870129888*G0_0_0_0_2_0 + 0.000718344155844181*G0_0_0_0_2_1 - 0.000133928571428579*G0_0_0_0_2_2 + 0.0010227272727273*G0_0_0_0_2_3 - 0.00555194805194824*G0_0_0_0_2_4 + 0.000681818181818196*G0_0_0_0_2_5 + 0.00340909090909101*G0_0_0_0_3_0 - 0.000487012987013011*G0_0_0_0_3_1 + 0.0010227272727273*G0_0_0_0_3_2 - 0.00798701298701322*G0_0_0_0_3_3 - 0.00545454545454562*G0_0_0_0_3_4 - 0.00818181818181843*G0_0_0_0_3_5 + 0.0271753246753256*G0_0_0_0_4_0 - 0.000681818181818209*G0_0_0_0_4_1 - 0.00555194805194825*G0_0_0_0_4_2 - 0.00545454545454562*G0_0_0_0_4_3 + 0.0198701298701305*G0_0_0_0_4_4 + 0.0154383116883122*G0_0_0_0_5_0 - 0.00535714285714306*G0_0_0_0_5_1 + 0.000681818181818195*G0_0_0_0_5_2 - 0.00818181818181843*G0_0_0_0_5_3 - 0.000974025974025889*G0_0_0_0_5_5 - 0.00234983766233774*G0_0_0_1_0_0 - 0.0079139610389613*G0_0_0_1_0_1 + 0.000718344155844181*G0_0_0_1_0_2 - 0.000487012987013011*G0_0_0_1_0_3 - 0.000681818181818209*G0_0_0_1_0_4 - 0.00535714285714306*G0_0_0_1_0_5 - 0.0079139610389613*G0_0_0_1_1_0 + 0.17715097402598*G0_0_0_1_1_1 - 0.00949675324675357*G0_0_0_1_1_2 + 0.0394480519480533*G0_0_0_1_1_3 + 0.003896103896104*G0_0_0_1_1_4 + 0.0379870129870144*G0_0_0_1_1_5 + 0.000718344155844181*G0_0_0_1_2_0 - 0.00949675324675357*G0_0_0_1_2_1 - 0.00194805194805201*G0_0_0_1_2_3 + 0.00170454545454551*G0_0_0_1_2_4 + 0.000974025974025997*G0_0_0_1_2_5 - 0.000487012987013011*G0_0_0_1_3_0 + 0.0394480519480533*G0_0_0_1_3_1 - 0.00194805194805201*G0_0_0_1_3_2 + 0.00292207792207801*G0_0_0_1_3_3 - 0.00681818181818204*G0_0_0_1_3_4 - 0.000974025974025962*G0_0_0_1_3_5 - 0.000681818181818209*G0_0_0_1_4_0 + 0.003896103896104*G0_0_0_1_4_1 + 0.00170454545454551*G0_0_0_1_4_2 - 0.00681818181818204*G0_0_0_1_4_3 - 0.0124675324675329*G0_0_0_1_4_4 - 0.00974025974026006*G0_0_0_1_4_5 - 0.00535714285714306*G0_0_0_1_5_0 + 0.0379870129870144*G0_0_0_1_5_1 + 0.000974025974025998*G0_0_0_1_5_2 - 0.00097402597402596*G0_0_0_1_5_3 - 0.00974025974026006*G0_0_0_1_5_4 - 0.00681818181818198*G0_0_0_1_5_5 - 0.00557629870129888*G0_0_0_2_0_0 + 0.000718344155844181*G0_0_0_2_0_1 - 0.000133928571428579*G0_0_0_2_0_2 + 0.0010227272727273*G0_0_0_2_0_3 - 0.00555194805194825*G0_0_0_2_0_4 + 0.000681818181818195*G0_0_0_2_0_5 + 0.000718344155844181*G0_0_0_2_1_0 - 0.00949675324675357*G0_0_0_2_1_1 - 0.00194805194805201*G0_0_0_2_1_3 + 0.00170454545454551*G0_0_0_2_1_4 + 0.000974025974025998*G0_0_0_2_1_5 - 0.000133928571428579*G0_0_0_2_2_0 + 0.00175324675324688*G0_0_0_2_2_2 + 0.00292207792207802*G0_0_0_2_2_3 + 0.00779220779220807*G0_0_0_2_2_4 + 0.00452922077922093*G0_0_0_2_2_5 + 0.0010227272727273*G0_0_0_2_3_0 - 0.00194805194805201*G0_0_0_2_3_1 + 0.00292207792207802*G0_0_0_2_3_2 - 0.0031168831168832*G0_0_0_2_3_3 - 0.00545454545454562*G0_0_0_2_3_4 - 0.0111038961038965*G0_0_0_2_3_5 - 0.00555194805194824*G0_0_0_2_4_0 + 0.00170454545454551*G0_0_0_2_4_1 + 0.00779220779220807*G0_0_0_2_4_2 - 0.00545454545454562*G0_0_0_2_4_3 - 0.0101298701298704*G0_0_0_2_4_4 - 0.0124675324675329*G0_0_0_2_4_5 + 0.000681818181818195*G0_0_0_2_5_0 + 0.000974025974025998*G0_0_0_2_5_1 + 0.00452922077922093*G0_0_0_2_5_2 - 0.0111038961038965*G0_0_0_2_5_3 - 0.0124675324675329*G0_0_0_2_5_4 - 0.0292207792207802*G0_0_0_2_5_5 + 0.00340909090909101*G0_0_0_3_0_0 - 0.00048701298701301*G0_0_0_3_0_1 + 0.0010227272727273*G0_0_0_3_0_2 - 0.00798701298701322*G0_0_0_3_0_3 - 0.00545454545454562*G0_0_0_3_0_4 - 0.00818181818181843*G0_0_0_3_0_5 - 0.000487012987013011*G0_0_0_3_1_0 + 0.0394480519480533*G0_0_0_3_1_1 - 0.00194805194805201*G0_0_0_3_1_2 + 0.00292207792207801*G0_0_0_3_1_3 - 0.00681818181818203*G0_0_0_3_1_4 - 0.000974025974025962*G0_0_0_3_1_5 + 0.0010227272727273*G0_0_0_3_2_0 - 0.00194805194805201*G0_0_0_3_2_1 + 0.00292207792207802*G0_0_0_3_2_2 - 0.0031168831168832*G0_0_0_3_2_3 - 0.00545454545454562*G0_0_0_3_2_4 - 0.0111038961038965*G0_0_0_3_2_5 - 0.00798701298701322*G0_0_0_3_3_0 + 0.00292207792207801*G0_0_0_3_3_1 - 0.0031168831168832*G0_0_0_3_3_2 + 0.00467532467532455*G0_0_0_3_3_3 + 0.0296103896103905*G0_0_0_3_3_4 + 0.0381818181818194*G0_0_0_3_3_5 - 0.00545454545454562*G0_0_0_3_4_0 - 0.00681818181818203*G0_0_0_3_4_1 - 0.00545454545454562*G0_0_0_3_4_2 + 0.0296103896103905*G0_0_0_3_4_3 + 0.035844155844157*G0_0_0_3_4_4 + 0.035844155844157*G0_0_0_3_4_5 - 0.00818181818181843*G0_0_0_3_5_0 - 0.000974025974025962*G0_0_0_3_5_1 - 0.0111038961038965*G0_0_0_3_5_2 + 0.0381818181818194*G0_0_0_3_5_3 + 0.035844155844157*G0_0_0_3_5_4 + 0.0748051948051973*G0_0_0_3_5_5 + 0.0271753246753256*G0_0_0_4_0_0 - 0.000681818181818209*G0_0_0_4_0_1 - 0.00555194805194824*G0_0_0_4_0_2 - 0.00545454545454562*G0_0_0_4_0_3 + 0.0198701298701305*G0_0_0_4_0_4 - 0.000681818181818209*G0_0_0_4_1_0 + 0.003896103896104*G0_0_0_4_1_1 + 0.00170454545454551*G0_0_0_4_1_2 - 0.00681818181818204*G0_0_0_4_1_3 - 0.0124675324675329*G0_0_0_4_1_4 - 0.00974025974026006*G0_0_0_4_1_5 - 0.00555194805194824*G0_0_0_4_2_0 + 0.00170454545454551*G0_0_0_4_2_1 + 0.00779220779220807*G0_0_0_4_2_2 - 0.00545454545454562*G0_0_0_4_2_3 - 0.0101298701298704*G0_0_0_4_2_4 - 0.0124675324675329*G0_0_0_4_2_5 - 0.00545454545454562*G0_0_0_4_3_0 - 0.00681818181818204*G0_0_0_4_3_1 - 0.00545454545454562*G0_0_0_4_3_2 + 0.0296103896103905*G0_0_0_4_3_3 + 0.035844155844157*G0_0_0_4_3_4 + 0.035844155844157*G0_0_0_4_3_5 + 0.0198701298701305*G0_0_0_4_4_0 - 0.0124675324675329*G0_0_0_4_4_1 - 0.0101298701298704*G0_0_0_4_4_2 + 0.035844155844157*G0_0_0_4_4_3 + 0.187012987012993*G0_0_0_4_4_4 + 0.0498701298701315*G0_0_0_4_4_5 - 0.00974025974026006*G0_0_0_4_5_1 - 0.0124675324675329*G0_0_0_4_5_2 + 0.035844155844157*G0_0_0_4_5_3 + 0.0498701298701315*G0_0_0_4_5_4 + 0.0779220779220806*G0_0_0_4_5_5 + 0.0154383116883122*G0_0_0_5_0_0 - 0.00535714285714306*G0_0_0_5_0_1 + 0.000681818181818195*G0_0_0_5_0_2 - 0.00818181818181843*G0_0_0_5_0_3 - 0.000974025974025887*G0_0_0_5_0_5 - 0.00535714285714306*G0_0_0_5_1_0 + 0.0379870129870144*G0_0_0_5_1_1 + 0.000974025974025998*G0_0_0_5_1_2 - 0.000974025974025962*G0_0_0_5_1_3 - 0.00974025974026006*G0_0_0_5_1_4 - 0.00681818181818198*G0_0_0_5_1_5 + 0.000681818181818195*G0_0_0_5_2_0 + 0.000974025974025998*G0_0_0_5_2_1 + 0.00452922077922093*G0_0_0_5_2_2 - 0.0111038961038965*G0_0_0_5_2_3 - 0.0124675324675329*G0_0_0_5_2_4 - 0.0292207792207802*G0_0_0_5_2_5 - 0.00818181818181843*G0_0_0_5_3_0 - 0.000974025974025962*G0_0_0_5_3_1 - 0.0111038961038965*G0_0_0_5_3_2 + 0.0381818181818194*G0_0_0_5_3_3 + 0.035844155844157*G0_0_0_5_3_4 + 0.0748051948051973*G0_0_0_5_3_5 - 0.00974025974026006*G0_0_0_5_4_1 - 0.0124675324675329*G0_0_0_5_4_2 + 0.035844155844157*G0_0_0_5_4_3 + 0.0498701298701315*G0_0_0_5_4_4 + 0.0779220779220805*G0_0_0_5_4_5 - 0.000974025974025889*G0_0_0_5_5_0 - 0.00681818181818198*G0_0_0_5_5_1 - 0.0292207792207802*G0_0_0_5_5_2 + 0.0748051948051973*G0_0_0_5_5_3 + 0.0779220779220805*G0_0_0_5_5_4 + 0.334285714285726*G0_0_0_5_5_5 - 0.00178977272727276*G0_1_0_0_0_0 + 0.000730519480519505*G0_1_0_0_0_1 + 0.000572240259740278*G0_1_0_0_0_2 - 0.00180194805194811*G0_1_0_0_0_3 - 0.00185064935064941*G0_1_0_0_0_4 - 0.00228896103896111*G0_1_0_0_0_5 + 0.000730519480519505*G0_1_0_0_1_0 - 0.00986201298701332*G0_1_0_0_1_1 + 0.000243506493506503*G0_1_0_0_1_2 - 0.00097402597402601*G0_1_0_0_1_3 + 0.000243506493506503*G0_1_0_0_1_4 - 0.00243506493506503*G0_1_0_0_1_5 + 0.000572240259740278*G0_1_0_0_2_0 + 0.000243506493506503*G0_1_0_0_2_1 + 0.000572240259740273*G0_1_0_0_2_2 - 0.00180194805194811*G0_1_0_0_2_3 - 0.000194805194805204*G0_1_0_0_2_4 - 0.00180194805194811*G0_1_0_0_2_5 - 0.00180194805194811*G0_1_0_0_3_0 - 0.00097402597402601*G0_1_0_0_3_1 - 0.00180194805194811*G0_1_0_0_3_2 + 0.0103246753246756*G0_1_0_0_3_3 + 0.00311688311688322*G0_1_0_0_3_4 + 0.00720779220779244*G0_1_0_0_3_5 - 0.00185064935064941*G0_1_0_0_4_0 + 0.000243506493506503*G0_1_0_0_4_1 - 0.000194805194805204*G0_1_0_0_4_2 + 0.00311688311688322*G0_1_0_0_4_3 + 0.000389610389610386*G0_1_0_0_4_4 + 0.00311688311688322*G0_1_0_0_4_5 - 0.00228896103896111*G0_1_0_0_5_0 - 0.00243506493506503*G0_1_0_0_5_1 - 0.00180194805194811*G0_1_0_0_5_2 + 0.00720779220779244*G0_1_0_0_5_3 + 0.00311688311688322*G0_1_0_0_5_4 + 0.0122727272727277*G0_1_0_0_5_5 + 0.000730519480519505*G0_1_0_1_0_0 - 0.00986201298701332*G0_1_0_1_0_1 + 0.000243506493506503*G0_1_0_1_0_2 - 0.00097402597402601*G0_1_0_1_0_3 + 0.000243506493506503*G0_1_0_1_0_4 - 0.00243506493506503*G0_1_0_1_0_5 - 0.00986201298701332*G0_1_0_1_1_0 + 0.201623376623384*G0_1_0_1_1_1 - 0.00986201298701332*G0_1_0_1_1_2 + 0.0409090909090923*G0_1_0_1_1_3 + 0.00146103896103899*G0_1_0_1_1_4 + 0.0409090909090925*G0_1_0_1_1_5 + 0.000243506493506503*G0_1_0_1_2_0 - 0.00986201298701332*G0_1_0_1_2_1 + 0.000730519480519503*G0_1_0_1_2_2 - 0.00243506493506502*G0_1_0_1_2_3 + 0.000243506493506501*G0_1_0_1_2_4 - 0.000974025974026017*G0_1_0_1_2_5 - 0.00097402597402601*G0_1_0_1_3_0 + 0.0409090909090923*G0_1_0_1_3_1 - 0.00243506493506502*G0_1_0_1_3_2 + 0.00779220779220802*G0_1_0_1_3_3 - 0.000974025974026009*G0_1_0_1_3_4 + 0.00389610389610407*G0_1_0_1_3_5 + 0.000243506493506503*G0_1_0_1_4_0 + 0.00146103896103899*G0_1_0_1_4_1 + 0.000243506493506501*G0_1_0_1_4_2 - 0.000974025974026009*G0_1_0_1_4_3 - 0.000974025974026007*G0_1_0_1_4_5 - 0.00243506493506503*G0_1_0_1_5_0 + 0.0409090909090925*G0_1_0_1_5_1 - 0.000974025974026017*G0_1_0_1_5_2 + 0.00389610389610407*G0_1_0_1_5_3 - 0.000974025974026007*G0_1_0_1_5_4 + 0.00779220779220811*G0_1_0_1_5_5 + 0.000572240259740278*G0_1_0_2_0_0 + 0.000243506493506503*G0_1_0_2_0_1 + 0.000572240259740273*G0_1_0_2_0_2 - 0.00180194805194811*G0_1_0_2_0_3 - 0.000194805194805204*G0_1_0_2_0_4 - 0.00180194805194811*G0_1_0_2_0_5 + 0.000243506493506503*G0_1_0_2_1_0 - 0.00986201298701332*G0_1_0_2_1_1 + 0.000730519480519503*G0_1_0_2_1_2 - 0.00243506493506502*G0_1_0_2_1_3 + 0.000243506493506501*G0_1_0_2_1_4 - 0.000974025974026017*G0_1_0_2_1_5 + 0.000572240259740273*G0_1_0_2_2_0 + 0.000730519480519503*G0_1_0_2_2_1 - 0.00178977272727273*G0_1_0_2_2_2 - 0.00228896103896111*G0_1_0_2_2_3 - 0.00185064935064939*G0_1_0_2_2_4 - 0.00180194805194811*G0_1_0_2_2_5 - 0.00180194805194811*G0_1_0_2_3_0 - 0.00243506493506502*G0_1_0_2_3_1 - 0.00228896103896111*G0_1_0_2_3_2 + 0.0122727272727277*G0_1_0_2_3_3 + 0.00311688311688323*G0_1_0_2_3_4 + 0.00720779220779245*G0_1_0_2_3_5 - 0.000194805194805204*G0_1_0_2_4_0 + 0.000243506493506501*G0_1_0_2_4_1 - 0.00185064935064939*G0_1_0_2_4_2 + 0.00311688311688323*G0_1_0_2_4_3 + 0.000389610389610433*G0_1_0_2_4_4 + 0.00311688311688322*G0_1_0_2_4_5 - 0.00180194805194811*G0_1_0_2_5_0 - 0.000974025974026017*G0_1_0_2_5_1 - 0.00180194805194811*G0_1_0_2_5_2 + 0.00720779220779245*G0_1_0_2_5_3 + 0.00311688311688322*G0_1_0_2_5_4 + 0.0103246753246757*G0_1_0_2_5_5 - 0.00180194805194811*G0_1_0_3_0_0 - 0.00097402597402601*G0_1_0_3_0_1 - 0.00180194805194811*G0_1_0_3_0_2 + 0.0103246753246756*G0_1_0_3_0_3 + 0.00311688311688322*G0_1_0_3_0_4 + 0.00720779220779244*G0_1_0_3_0_5 - 0.00097402597402601*G0_1_0_3_1_0 + 0.0409090909090923*G0_1_0_3_1_1 - 0.00243506493506502*G0_1_0_3_1_2 + 0.00779220779220802*G0_1_0_3_1_3 - 0.000974025974026009*G0_1_0_3_1_4 + 0.00389610389610407*G0_1_0_3_1_5 - 0.00180194805194811*G0_1_0_3_2_0 - 0.00243506493506502*G0_1_0_3_2_1 - 0.00228896103896111*G0_1_0_3_2_2 + 0.0122727272727277*G0_1_0_3_2_3 + 0.00311688311688323*G0_1_0_3_2_4 + 0.00720779220779245*G0_1_0_3_2_5 + 0.0103246753246756*G0_1_0_3_3_0 + 0.00779220779220801*G0_1_0_3_3_1 + 0.0122727272727277*G0_1_0_3_3_2 - 0.105194805194809*G0_1_0_3_3_3 - 0.0187012987012993*G0_1_0_3_3_4 - 0.0350649350649362*G0_1_0_3_3_5 + 0.00311688311688322*G0_1_0_3_4_0 - 0.000974025974026009*G0_1_0_3_4_1 + 0.00311688311688323*G0_1_0_3_4_2 - 0.0187012987012993*G0_1_0_3_4_3 - 0.00623376623376644*G0_1_0_3_4_4 - 0.0124675324675329*G0_1_0_3_4_5 + 0.00720779220779244*G0_1_0_3_5_0 + 0.00389610389610407*G0_1_0_3_5_1 + 0.00720779220779245*G0_1_0_3_5_2 - 0.0350649350649362*G0_1_0_3_5_3 - 0.0124675324675329*G0_1_0_3_5_4 - 0.0350649350649363*G0_1_0_3_5_5 - 0.00185064935064941*G0_1_0_4_0_0 + 0.000243506493506503*G0_1_0_4_0_1 - 0.000194805194805204*G0_1_0_4_0_2 + 0.00311688311688322*G0_1_0_4_0_3 + 0.000389610389610386*G0_1_0_4_0_4 + 0.00311688311688322*G0_1_0_4_0_5 + 0.000243506493506503*G0_1_0_4_1_0 + 0.00146103896103899*G0_1_0_4_1_1 + 0.000243506493506501*G0_1_0_4_1_2 - 0.000974025974026009*G0_1_0_4_1_3 - 0.000974025974026008*G0_1_0_4_1_5 - 0.000194805194805204*G0_1_0_4_2_0 + 0.000243506493506501*G0_1_0_4_2_1 - 0.00185064935064939*G0_1_0_4_2_2 + 0.00311688311688323*G0_1_0_4_2_3 + 0.000389610389610433*G0_1_0_4_2_4 + 0.00311688311688322*G0_1_0_4_2_5 + 0.00311688311688322*G0_1_0_4_3_0 - 0.000974025974026009*G0_1_0_4_3_1 + 0.00311688311688323*G0_1_0_4_3_2 - 0.0187012987012993*G0_1_0_4_3_3 - 0.00623376623376644*G0_1_0_4_3_4 - 0.0124675324675329*G0_1_0_4_3_5 + 0.000389610389610386*G0_1_0_4_4_0 + 0.000389610389610433*G0_1_0_4_4_2 - 0.00623376623376644*G0_1_0_4_4_3 - 0.0140259740259745*G0_1_0_4_4_4 - 0.00623376623376646*G0_1_0_4_4_5 + 0.00311688311688322*G0_1_0_4_5_0 - 0.000974025974026007*G0_1_0_4_5_1 + 0.00311688311688322*G0_1_0_4_5_2 - 0.0124675324675329*G0_1_0_4_5_3 - 0.00623376623376646*G0_1_0_4_5_4 - 0.0187012987012993*G0_1_0_4_5_5 - 0.00228896103896111*G0_1_0_5_0_0 - 0.00243506493506503*G0_1_0_5_0_1 - 0.00180194805194811*G0_1_0_5_0_2 + 0.00720779220779244*G0_1_0_5_0_3 + 0.00311688311688322*G0_1_0_5_0_4 + 0.0122727272727277*G0_1_0_5_0_5 - 0.00243506493506503*G0_1_0_5_1_0 + 0.0409090909090925*G0_1_0_5_1_1 - 0.000974025974026017*G0_1_0_5_1_2 + 0.00389610389610407*G0_1_0_5_1_3 - 0.000974025974026007*G0_1_0_5_1_4 + 0.00779220779220811*G0_1_0_5_1_5 - 0.00180194805194811*G0_1_0_5_2_0 - 0.000974025974026017*G0_1_0_5_2_1 - 0.00180194805194811*G0_1_0_5_2_2 + 0.00720779220779245*G0_1_0_5_2_3 + 0.00311688311688322*G0_1_0_5_2_4 + 0.0103246753246757*G0_1_0_5_2_5 + 0.00720779220779244*G0_1_0_5_3_0 + 0.00389610389610407*G0_1_0_5_3_1 + 0.00720779220779245*G0_1_0_5_3_2 - 0.0350649350649362*G0_1_0_5_3_3 - 0.0124675324675329*G0_1_0_5_3_4 - 0.0350649350649362*G0_1_0_5_3_5 + 0.00311688311688322*G0_1_0_5_4_0 - 0.000974025974026007*G0_1_0_5_4_1 + 0.00311688311688322*G0_1_0_5_4_2 - 0.0124675324675329*G0_1_0_5_4_3 - 0.00623376623376646*G0_1_0_5_4_4 - 0.0187012987012993*G0_1_0_5_4_5 + 0.0122727272727277*G0_1_0_5_5_0 + 0.00779220779220811*G0_1_0_5_5_1 + 0.0103246753246757*G0_1_0_5_5_2 - 0.0350649350649363*G0_1_0_5_5_3 - 0.0187012987012993*G0_1_0_5_5_4 - 0.105194805194809*G0_1_0_5_5_5; + A[38] = -A[88] + 0.0559212662337681*G0_0_0_0_0_0 - 0.00234983766233774*G0_0_0_0_0_1 - 0.00557629870129888*G0_0_0_0_0_2 + 0.00340909090909101*G0_0_0_0_0_3 + 0.0271753246753256*G0_0_0_0_0_4 + 0.0154383116883122*G0_0_0_0_0_5 - 0.00234983766233774*G0_0_0_0_1_0 - 0.0079139610389613*G0_0_0_0_1_1 + 0.000718344155844181*G0_0_0_0_1_2 - 0.000487012987013011*G0_0_0_0_1_3 - 0.000681818181818209*G0_0_0_0_1_4 - 0.00535714285714306*G0_0_0_0_1_5 - 0.00557629870129888*G0_0_0_0_2_0 + 0.000718344155844181*G0_0_0_0_2_1 - 0.000133928571428579*G0_0_0_0_2_2 + 0.0010227272727273*G0_0_0_0_2_3 - 0.00555194805194824*G0_0_0_0_2_4 + 0.000681818181818195*G0_0_0_0_2_5 + 0.00340909090909101*G0_0_0_0_3_0 - 0.000487012987013011*G0_0_0_0_3_1 + 0.0010227272727273*G0_0_0_0_3_2 - 0.00798701298701322*G0_0_0_0_3_3 - 0.00545454545454562*G0_0_0_0_3_4 - 0.00818181818181843*G0_0_0_0_3_5 + 0.0271753246753256*G0_0_0_0_4_0 - 0.000681818181818209*G0_0_0_0_4_1 - 0.00555194805194824*G0_0_0_0_4_2 - 0.00545454545454562*G0_0_0_0_4_3 + 0.0198701298701305*G0_0_0_0_4_4 + 0.0154383116883122*G0_0_0_0_5_0 - 0.00535714285714306*G0_0_0_0_5_1 + 0.000681818181818195*G0_0_0_0_5_2 - 0.00818181818181843*G0_0_0_0_5_3 - 0.000974025974025889*G0_0_0_0_5_5 - 0.00234983766233774*G0_0_0_1_0_0 - 0.0079139610389613*G0_0_0_1_0_1 + 0.000718344155844181*G0_0_0_1_0_2 - 0.000487012987013011*G0_0_0_1_0_3 - 0.000681818181818209*G0_0_0_1_0_4 - 0.00535714285714306*G0_0_0_1_0_5 - 0.0079139610389613*G0_0_0_1_1_0 + 0.17715097402598*G0_0_0_1_1_1 - 0.00949675324675357*G0_0_0_1_1_2 + 0.0394480519480533*G0_0_0_1_1_3 + 0.003896103896104*G0_0_0_1_1_4 + 0.0379870129870144*G0_0_0_1_1_5 + 0.000718344155844181*G0_0_0_1_2_0 - 0.00949675324675357*G0_0_0_1_2_1 - 0.00194805194805201*G0_0_0_1_2_3 + 0.00170454545454551*G0_0_0_1_2_4 + 0.000974025974025997*G0_0_0_1_2_5 - 0.000487012987013011*G0_0_0_1_3_0 + 0.0394480519480533*G0_0_0_1_3_1 - 0.00194805194805201*G0_0_0_1_3_2 + 0.00292207792207801*G0_0_0_1_3_3 - 0.00681818181818203*G0_0_0_1_3_4 - 0.00097402597402596*G0_0_0_1_3_5 - 0.000681818181818209*G0_0_0_1_4_0 + 0.003896103896104*G0_0_0_1_4_1 + 0.00170454545454551*G0_0_0_1_4_2 - 0.00681818181818203*G0_0_0_1_4_3 - 0.0124675324675329*G0_0_0_1_4_4 - 0.00974025974026006*G0_0_0_1_4_5 - 0.00535714285714306*G0_0_0_1_5_0 + 0.0379870129870144*G0_0_0_1_5_1 + 0.000974025974025998*G0_0_0_1_5_2 - 0.00097402597402596*G0_0_0_1_5_3 - 0.00974025974026006*G0_0_0_1_5_4 - 0.00681818181818198*G0_0_0_1_5_5 - 0.00557629870129888*G0_0_0_2_0_0 + 0.000718344155844181*G0_0_0_2_0_1 - 0.000133928571428579*G0_0_0_2_0_2 + 0.0010227272727273*G0_0_0_2_0_3 - 0.00555194805194824*G0_0_0_2_0_4 + 0.000681818181818195*G0_0_0_2_0_5 + 0.000718344155844181*G0_0_0_2_1_0 - 0.00949675324675357*G0_0_0_2_1_1 - 0.00194805194805201*G0_0_0_2_1_3 + 0.00170454545454551*G0_0_0_2_1_4 + 0.000974025974025998*G0_0_0_2_1_5 - 0.000133928571428579*G0_0_0_2_2_0 + 0.00175324675324688*G0_0_0_2_2_2 + 0.00292207792207802*G0_0_0_2_2_3 + 0.00779220779220807*G0_0_0_2_2_4 + 0.00452922077922093*G0_0_0_2_2_5 + 0.0010227272727273*G0_0_0_2_3_0 - 0.00194805194805201*G0_0_0_2_3_1 + 0.00292207792207802*G0_0_0_2_3_2 - 0.0031168831168832*G0_0_0_2_3_3 - 0.00545454545454562*G0_0_0_2_3_4 - 0.0111038961038965*G0_0_0_2_3_5 - 0.00555194805194824*G0_0_0_2_4_0 + 0.00170454545454551*G0_0_0_2_4_1 + 0.00779220779220807*G0_0_0_2_4_2 - 0.00545454545454562*G0_0_0_2_4_3 - 0.0101298701298704*G0_0_0_2_4_4 - 0.0124675324675329*G0_0_0_2_4_5 + 0.000681818181818195*G0_0_0_2_5_0 + 0.000974025974025998*G0_0_0_2_5_1 + 0.00452922077922093*G0_0_0_2_5_2 - 0.0111038961038965*G0_0_0_2_5_3 - 0.0124675324675329*G0_0_0_2_5_4 - 0.0292207792207802*G0_0_0_2_5_5 + 0.00340909090909101*G0_0_0_3_0_0 - 0.000487012987013011*G0_0_0_3_0_1 + 0.0010227272727273*G0_0_0_3_0_2 - 0.00798701298701322*G0_0_0_3_0_3 - 0.00545454545454562*G0_0_0_3_0_4 - 0.00818181818181843*G0_0_0_3_0_5 - 0.000487012987013011*G0_0_0_3_1_0 + 0.0394480519480533*G0_0_0_3_1_1 - 0.00194805194805201*G0_0_0_3_1_2 + 0.00292207792207801*G0_0_0_3_1_3 - 0.00681818181818203*G0_0_0_3_1_4 - 0.000974025974025962*G0_0_0_3_1_5 + 0.0010227272727273*G0_0_0_3_2_0 - 0.00194805194805201*G0_0_0_3_2_1 + 0.00292207792207802*G0_0_0_3_2_2 - 0.0031168831168832*G0_0_0_3_2_3 - 0.00545454545454562*G0_0_0_3_2_4 - 0.0111038961038965*G0_0_0_3_2_5 - 0.00798701298701322*G0_0_0_3_3_0 + 0.00292207792207801*G0_0_0_3_3_1 - 0.0031168831168832*G0_0_0_3_3_2 + 0.00467532467532455*G0_0_0_3_3_3 + 0.0296103896103905*G0_0_0_3_3_4 + 0.0381818181818194*G0_0_0_3_3_5 - 0.00545454545454562*G0_0_0_3_4_0 - 0.00681818181818203*G0_0_0_3_4_1 - 0.00545454545454562*G0_0_0_3_4_2 + 0.0296103896103905*G0_0_0_3_4_3 + 0.035844155844157*G0_0_0_3_4_4 + 0.035844155844157*G0_0_0_3_4_5 - 0.00818181818181843*G0_0_0_3_5_0 - 0.000974025974025962*G0_0_0_3_5_1 - 0.0111038961038965*G0_0_0_3_5_2 + 0.0381818181818194*G0_0_0_3_5_3 + 0.035844155844157*G0_0_0_3_5_4 + 0.0748051948051973*G0_0_0_3_5_5 + 0.0271753246753256*G0_0_0_4_0_0 - 0.00068181818181821*G0_0_0_4_0_1 - 0.00555194805194824*G0_0_0_4_0_2 - 0.00545454545454562*G0_0_0_4_0_3 + 0.0198701298701305*G0_0_0_4_0_4 - 0.000681818181818209*G0_0_0_4_1_0 + 0.003896103896104*G0_0_0_4_1_1 + 0.00170454545454551*G0_0_0_4_1_2 - 0.00681818181818203*G0_0_0_4_1_3 - 0.0124675324675329*G0_0_0_4_1_4 - 0.00974025974026006*G0_0_0_4_1_5 - 0.00555194805194824*G0_0_0_4_2_0 + 0.00170454545454551*G0_0_0_4_2_1 + 0.00779220779220807*G0_0_0_4_2_2 - 0.00545454545454562*G0_0_0_4_2_3 - 0.0101298701298704*G0_0_0_4_2_4 - 0.0124675324675329*G0_0_0_4_2_5 - 0.00545454545454562*G0_0_0_4_3_0 - 0.00681818181818203*G0_0_0_4_3_1 - 0.00545454545454562*G0_0_0_4_3_2 + 0.0296103896103905*G0_0_0_4_3_3 + 0.035844155844157*G0_0_0_4_3_4 + 0.035844155844157*G0_0_0_4_3_5 + 0.0198701298701305*G0_0_0_4_4_0 - 0.0124675324675329*G0_0_0_4_4_1 - 0.0101298701298704*G0_0_0_4_4_2 + 0.035844155844157*G0_0_0_4_4_3 + 0.187012987012993*G0_0_0_4_4_4 + 0.0498701298701315*G0_0_0_4_4_5 - 0.00974025974026006*G0_0_0_4_5_1 - 0.0124675324675329*G0_0_0_4_5_2 + 0.035844155844157*G0_0_0_4_5_3 + 0.0498701298701315*G0_0_0_4_5_4 + 0.0779220779220806*G0_0_0_4_5_5 + 0.0154383116883122*G0_0_0_5_0_0 - 0.00535714285714306*G0_0_0_5_0_1 + 0.000681818181818195*G0_0_0_5_0_2 - 0.00818181818181843*G0_0_0_5_0_3 - 0.000974025974025887*G0_0_0_5_0_5 - 0.00535714285714306*G0_0_0_5_1_0 + 0.0379870129870144*G0_0_0_5_1_1 + 0.000974025974025998*G0_0_0_5_1_2 - 0.000974025974025962*G0_0_0_5_1_3 - 0.00974025974026006*G0_0_0_5_1_4 - 0.00681818181818198*G0_0_0_5_1_5 + 0.000681818181818195*G0_0_0_5_2_0 + 0.000974025974025998*G0_0_0_5_2_1 + 0.00452922077922093*G0_0_0_5_2_2 - 0.0111038961038965*G0_0_0_5_2_3 - 0.0124675324675329*G0_0_0_5_2_4 - 0.0292207792207802*G0_0_0_5_2_5 - 0.00818181818181843*G0_0_0_5_3_0 - 0.000974025974025962*G0_0_0_5_3_1 - 0.0111038961038965*G0_0_0_5_3_2 + 0.0381818181818194*G0_0_0_5_3_3 + 0.035844155844157*G0_0_0_5_3_4 + 0.0748051948051973*G0_0_0_5_3_5 - 0.00974025974026006*G0_0_0_5_4_1 - 0.0124675324675329*G0_0_0_5_4_2 + 0.035844155844157*G0_0_0_5_4_3 + 0.0498701298701315*G0_0_0_5_4_4 + 0.0779220779220805*G0_0_0_5_4_5 - 0.000974025974025889*G0_0_0_5_5_0 - 0.00681818181818198*G0_0_0_5_5_1 - 0.0292207792207802*G0_0_0_5_5_2 + 0.0748051948051973*G0_0_0_5_5_3 + 0.0779220779220805*G0_0_0_5_5_4 + 0.334285714285726*G0_0_0_5_5_5 - 0.00178977272727276*G0_0_1_0_0_0 + 0.000730519480519505*G0_0_1_0_0_1 + 0.000572240259740278*G0_0_1_0_0_2 - 0.00180194805194811*G0_0_1_0_0_3 - 0.00185064935064941*G0_0_1_0_0_4 - 0.00228896103896111*G0_0_1_0_0_5 + 0.000730519480519505*G0_0_1_0_1_0 - 0.00986201298701332*G0_0_1_0_1_1 + 0.000243506493506503*G0_0_1_0_1_2 - 0.00097402597402601*G0_0_1_0_1_3 + 0.000243506493506503*G0_0_1_0_1_4 - 0.00243506493506502*G0_0_1_0_1_5 + 0.000572240259740278*G0_0_1_0_2_0 + 0.000243506493506503*G0_0_1_0_2_1 + 0.000572240259740273*G0_0_1_0_2_2 - 0.00180194805194811*G0_0_1_0_2_3 - 0.000194805194805204*G0_0_1_0_2_4 - 0.00180194805194811*G0_0_1_0_2_5 - 0.00180194805194811*G0_0_1_0_3_0 - 0.00097402597402601*G0_0_1_0_3_1 - 0.00180194805194811*G0_0_1_0_3_2 + 0.0103246753246756*G0_0_1_0_3_3 + 0.00311688311688322*G0_0_1_0_3_4 + 0.00720779220779244*G0_0_1_0_3_5 - 0.00185064935064941*G0_0_1_0_4_0 + 0.000243506493506503*G0_0_1_0_4_1 - 0.000194805194805204*G0_0_1_0_4_2 + 0.00311688311688322*G0_0_1_0_4_3 + 0.000389610389610385*G0_0_1_0_4_4 + 0.00311688311688322*G0_0_1_0_4_5 - 0.00228896103896111*G0_0_1_0_5_0 - 0.00243506493506503*G0_0_1_0_5_1 - 0.00180194805194811*G0_0_1_0_5_2 + 0.00720779220779244*G0_0_1_0_5_3 + 0.00311688311688322*G0_0_1_0_5_4 + 0.0122727272727277*G0_0_1_0_5_5 + 0.000730519480519505*G0_0_1_1_0_0 - 0.00986201298701332*G0_0_1_1_0_1 + 0.000243506493506503*G0_0_1_1_0_2 - 0.00097402597402601*G0_0_1_1_0_3 + 0.000243506493506503*G0_0_1_1_0_4 - 0.00243506493506502*G0_0_1_1_0_5 - 0.00986201298701332*G0_0_1_1_1_0 + 0.201623376623384*G0_0_1_1_1_1 - 0.00986201298701332*G0_0_1_1_1_2 + 0.0409090909090923*G0_0_1_1_1_3 + 0.00146103896103899*G0_0_1_1_1_4 + 0.0409090909090925*G0_0_1_1_1_5 + 0.000243506493506503*G0_0_1_1_2_0 - 0.00986201298701332*G0_0_1_1_2_1 + 0.000730519480519503*G0_0_1_1_2_2 - 0.00243506493506501*G0_0_1_1_2_3 + 0.000243506493506501*G0_0_1_1_2_4 - 0.000974025974026017*G0_0_1_1_2_5 - 0.000974025974026009*G0_0_1_1_3_0 + 0.0409090909090923*G0_0_1_1_3_1 - 0.00243506493506501*G0_0_1_1_3_2 + 0.00779220779220801*G0_0_1_1_3_3 - 0.00097402597402601*G0_0_1_1_3_4 + 0.00389610389610407*G0_0_1_1_3_5 + 0.000243506493506503*G0_0_1_1_4_0 + 0.00146103896103899*G0_0_1_1_4_1 + 0.000243506493506501*G0_0_1_1_4_2 - 0.00097402597402601*G0_0_1_1_4_3 - 0.000974025974026008*G0_0_1_1_4_5 - 0.00243506493506503*G0_0_1_1_5_0 + 0.0409090909090925*G0_0_1_1_5_1 - 0.000974025974026017*G0_0_1_1_5_2 + 0.00389610389610407*G0_0_1_1_5_3 - 0.000974025974026008*G0_0_1_1_5_4 + 0.00779220779220811*G0_0_1_1_5_5 + 0.000572240259740278*G0_0_1_2_0_0 + 0.000243506493506503*G0_0_1_2_0_1 + 0.000572240259740273*G0_0_1_2_0_2 - 0.00180194805194811*G0_0_1_2_0_3 - 0.000194805194805204*G0_0_1_2_0_4 - 0.00180194805194811*G0_0_1_2_0_5 + 0.000243506493506503*G0_0_1_2_1_0 - 0.00986201298701332*G0_0_1_2_1_1 + 0.000730519480519503*G0_0_1_2_1_2 - 0.00243506493506501*G0_0_1_2_1_3 + 0.000243506493506501*G0_0_1_2_1_4 - 0.000974025974026017*G0_0_1_2_1_5 + 0.000572240259740273*G0_0_1_2_2_0 + 0.000730519480519503*G0_0_1_2_2_1 - 0.00178977272727273*G0_0_1_2_2_2 - 0.00228896103896111*G0_0_1_2_2_3 - 0.00185064935064939*G0_0_1_2_2_4 - 0.00180194805194811*G0_0_1_2_2_5 - 0.00180194805194811*G0_0_1_2_3_0 - 0.00243506493506501*G0_0_1_2_3_1 - 0.00228896103896111*G0_0_1_2_3_2 + 0.0122727272727277*G0_0_1_2_3_3 + 0.00311688311688323*G0_0_1_2_3_4 + 0.00720779220779245*G0_0_1_2_3_5 - 0.000194805194805204*G0_0_1_2_4_0 + 0.000243506493506501*G0_0_1_2_4_1 - 0.00185064935064939*G0_0_1_2_4_2 + 0.00311688311688323*G0_0_1_2_4_3 + 0.000389610389610433*G0_0_1_2_4_4 + 0.00311688311688322*G0_0_1_2_4_5 - 0.00180194805194811*G0_0_1_2_5_0 - 0.000974025974026017*G0_0_1_2_5_1 - 0.00180194805194811*G0_0_1_2_5_2 + 0.00720779220779245*G0_0_1_2_5_3 + 0.00311688311688322*G0_0_1_2_5_4 + 0.0103246753246757*G0_0_1_2_5_5 - 0.00180194805194811*G0_0_1_3_0_0 - 0.00097402597402601*G0_0_1_3_0_1 - 0.00180194805194811*G0_0_1_3_0_2 + 0.0103246753246756*G0_0_1_3_0_3 + 0.00311688311688322*G0_0_1_3_0_4 + 0.00720779220779244*G0_0_1_3_0_5 - 0.000974025974026009*G0_0_1_3_1_0 + 0.0409090909090923*G0_0_1_3_1_1 - 0.00243506493506502*G0_0_1_3_1_2 + 0.00779220779220802*G0_0_1_3_1_3 - 0.00097402597402601*G0_0_1_3_1_4 + 0.00389610389610407*G0_0_1_3_1_5 - 0.00180194805194811*G0_0_1_3_2_0 - 0.00243506493506501*G0_0_1_3_2_1 - 0.00228896103896111*G0_0_1_3_2_2 + 0.0122727272727277*G0_0_1_3_2_3 + 0.00311688311688323*G0_0_1_3_2_4 + 0.00720779220779245*G0_0_1_3_2_5 + 0.0103246753246756*G0_0_1_3_3_0 + 0.00779220779220801*G0_0_1_3_3_1 + 0.0122727272727277*G0_0_1_3_3_2 - 0.105194805194809*G0_0_1_3_3_3 - 0.0187012987012993*G0_0_1_3_3_4 - 0.0350649350649362*G0_0_1_3_3_5 + 0.00311688311688322*G0_0_1_3_4_0 - 0.00097402597402601*G0_0_1_3_4_1 + 0.00311688311688323*G0_0_1_3_4_2 - 0.0187012987012993*G0_0_1_3_4_3 - 0.00623376623376644*G0_0_1_3_4_4 - 0.0124675324675329*G0_0_1_3_4_5 + 0.00720779220779244*G0_0_1_3_5_0 + 0.00389610389610407*G0_0_1_3_5_1 + 0.00720779220779245*G0_0_1_3_5_2 - 0.0350649350649362*G0_0_1_3_5_3 - 0.0124675324675329*G0_0_1_3_5_4 - 0.0350649350649363*G0_0_1_3_5_5 - 0.00185064935064941*G0_0_1_4_0_0 + 0.000243506493506503*G0_0_1_4_0_1 - 0.000194805194805204*G0_0_1_4_0_2 + 0.00311688311688322*G0_0_1_4_0_3 + 0.000389610389610386*G0_0_1_4_0_4 + 0.00311688311688322*G0_0_1_4_0_5 + 0.000243506493506503*G0_0_1_4_1_0 + 0.00146103896103899*G0_0_1_4_1_1 + 0.000243506493506501*G0_0_1_4_1_2 - 0.00097402597402601*G0_0_1_4_1_3 - 0.000974025974026008*G0_0_1_4_1_5 - 0.000194805194805204*G0_0_1_4_2_0 + 0.000243506493506501*G0_0_1_4_2_1 - 0.00185064935064939*G0_0_1_4_2_2 + 0.00311688311688323*G0_0_1_4_2_3 + 0.000389610389610433*G0_0_1_4_2_4 + 0.00311688311688322*G0_0_1_4_2_5 + 0.00311688311688322*G0_0_1_4_3_0 - 0.00097402597402601*G0_0_1_4_3_1 + 0.00311688311688323*G0_0_1_4_3_2 - 0.0187012987012993*G0_0_1_4_3_3 - 0.00623376623376644*G0_0_1_4_3_4 - 0.0124675324675329*G0_0_1_4_3_5 + 0.000389610389610386*G0_0_1_4_4_0 + 0.000389610389610433*G0_0_1_4_4_2 - 0.00623376623376644*G0_0_1_4_4_3 - 0.0140259740259745*G0_0_1_4_4_4 - 0.00623376623376646*G0_0_1_4_4_5 + 0.00311688311688322*G0_0_1_4_5_0 - 0.000974025974026008*G0_0_1_4_5_1 + 0.00311688311688322*G0_0_1_4_5_2 - 0.0124675324675329*G0_0_1_4_5_3 - 0.00623376623376646*G0_0_1_4_5_4 - 0.0187012987012993*G0_0_1_4_5_5 - 0.00228896103896111*G0_0_1_5_0_0 - 0.00243506493506503*G0_0_1_5_0_1 - 0.00180194805194811*G0_0_1_5_0_2 + 0.00720779220779244*G0_0_1_5_0_3 + 0.00311688311688322*G0_0_1_5_0_4 + 0.0122727272727277*G0_0_1_5_0_5 - 0.00243506493506503*G0_0_1_5_1_0 + 0.0409090909090925*G0_0_1_5_1_1 - 0.000974025974026017*G0_0_1_5_1_2 + 0.00389610389610407*G0_0_1_5_1_3 - 0.000974025974026008*G0_0_1_5_1_4 + 0.00779220779220811*G0_0_1_5_1_5 - 0.00180194805194811*G0_0_1_5_2_0 - 0.000974025974026016*G0_0_1_5_2_1 - 0.00180194805194811*G0_0_1_5_2_2 + 0.00720779220779245*G0_0_1_5_2_3 + 0.00311688311688322*G0_0_1_5_2_4 + 0.0103246753246757*G0_0_1_5_2_5 + 0.00720779220779244*G0_0_1_5_3_0 + 0.00389610389610407*G0_0_1_5_3_1 + 0.00720779220779245*G0_0_1_5_3_2 - 0.0350649350649362*G0_0_1_5_3_3 - 0.0124675324675329*G0_0_1_5_3_4 - 0.0350649350649363*G0_0_1_5_3_5 + 0.00311688311688322*G0_0_1_5_4_0 - 0.000974025974026008*G0_0_1_5_4_1 + 0.00311688311688322*G0_0_1_5_4_2 - 0.0124675324675329*G0_0_1_5_4_3 - 0.00623376623376646*G0_0_1_5_4_4 - 0.0187012987012993*G0_0_1_5_4_5 + 0.0122727272727277*G0_0_1_5_5_0 + 0.00779220779220811*G0_0_1_5_5_1 + 0.0103246753246757*G0_0_1_5_5_2 - 0.0350649350649363*G0_0_1_5_5_3 - 0.0187012987012994*G0_0_1_5_5_4 - 0.105194805194809*G0_0_1_5_5_5; + A[43] = A[34] + 0.000876623376623397*G0_0_1_0_0_0 + 0.000328733766233774*G0_0_1_0_0_1 + 0.000328733766233779*G0_0_1_0_0_2 - 0.00423701298701311*G0_0_1_0_0_3 - 0.001461038961039*G0_0_1_0_0_4 - 0.00146103896103901*G0_0_1_0_0_5 + 0.000328733766233774*G0_0_1_0_1_0 + 0.000401785714285733*G0_0_1_0_1_1 - 0.000255681818181826*G0_0_1_0_1_2 - 0.0016071428571429*G0_0_1_0_1_3 - 0.0013149350649351*G0_0_1_0_1_4 - 0.0011688311688312*G0_0_1_0_1_5 + 0.000328733766233779*G0_0_1_0_2_0 - 0.000255681818181826*G0_0_1_0_2_1 + 0.000401785714285715*G0_0_1_0_2_2 - 0.00160714285714291*G0_0_1_0_2_3 - 0.00116883116883121*G0_0_1_0_2_4 - 0.00131493506493511*G0_0_1_0_2_5 - 0.00423701298701311*G0_0_1_0_3_0 - 0.0016071428571429*G0_0_1_0_3_1 - 0.00160714285714291*G0_0_1_0_3_2 + 0.0350649350649361*G0_0_1_0_3_3 + 0.0111038961038964*G0_0_1_0_3_4 + 0.0111038961038965*G0_0_1_0_3_5 - 0.001461038961039*G0_0_1_0_4_0 - 0.0013149350649351*G0_0_1_0_4_1 - 0.00116883116883121*G0_0_1_0_4_2 + 0.0111038961038964*G0_0_1_0_4_3 + 0.00525974025974041*G0_0_1_0_4_4 + 0.00525974025974042*G0_0_1_0_4_5 - 0.00146103896103901*G0_0_1_0_5_0 - 0.0011688311688312*G0_0_1_0_5_1 - 0.00131493506493511*G0_0_1_0_5_2 + 0.0111038961038965*G0_0_1_0_5_3 + 0.00525974025974042*G0_0_1_0_5_4 + 0.00525974025974044*G0_0_1_0_5_5 + 0.000328733766233774*G0_0_1_1_0_0 + 0.000401785714285733*G0_0_1_1_0_1 - 0.000255681818181826*G0_0_1_1_0_2 - 0.0016071428571429*G0_0_1_1_0_3 - 0.0013149350649351*G0_0_1_1_0_4 - 0.0011688311688312*G0_0_1_1_0_5 + 0.000401785714285733*G0_0_1_1_1_0 + 0.00328733766233768*G0_0_1_1_1_1 + 0.000401785714285734*G0_0_1_1_1_2 - 0.0102272727272731*G0_0_1_1_1_3 - 0.00189935064935071*G0_0_1_1_1_4 - 0.000255681818181826*G0_0_1_1_2_0 + 0.000401785714285734*G0_0_1_1_2_1 + 0.00040178571428572*G0_0_1_1_2_2 + 0.00701298701298726*G0_0_1_1_2_3 + 0.000438311688311701*G0_0_1_1_2_4 + 0.000438311688311708*G0_0_1_1_2_5 - 0.0016071428571429*G0_0_1_1_3_0 - 0.0102272727272731*G0_0_1_1_3_1 + 0.00701298701298726*G0_0_1_1_3_2 + 0.00350649350649355*G0_0_1_1_3_3 + 0.00701298701298723*G0_0_1_1_3_4 + 0.00233766233766239*G0_0_1_1_3_5 - 0.0013149350649351*G0_0_1_1_4_0 - 0.00189935064935071*G0_0_1_1_4_1 + 0.000438311688311701*G0_0_1_1_4_2 + 0.00701298701298722*G0_0_1_1_4_3 + 0.00409090909090921*G0_0_1_1_4_4 + 0.00292207792207801*G0_0_1_1_4_5 - 0.0011688311688312*G0_0_1_1_5_0 + 0.000438311688311708*G0_0_1_1_5_2 + 0.00233766233766239*G0_0_1_1_5_3 + 0.00292207792207801*G0_0_1_1_5_4 + 0.00350649350649359*G0_0_1_1_5_5 + 0.000328733766233779*G0_0_1_2_0_0 - 0.000255681818181826*G0_0_1_2_0_1 + 0.000401785714285715*G0_0_1_2_0_2 - 0.00160714285714291*G0_0_1_2_0_3 - 0.00116883116883121*G0_0_1_2_0_4 - 0.00131493506493511*G0_0_1_2_0_5 - 0.000255681818181826*G0_0_1_2_1_0 + 0.000401785714285735*G0_0_1_2_1_1 + 0.00040178571428572*G0_0_1_2_1_2 + 0.00701298701298726*G0_0_1_2_1_3 + 0.000438311688311701*G0_0_1_2_1_4 + 0.000438311688311707*G0_0_1_2_1_5 + 0.000401785714285714*G0_0_1_2_2_0 + 0.00040178571428572*G0_0_1_2_2_1 + 0.00328733766233792*G0_0_1_2_2_2 - 0.0102272727272731*G0_0_1_2_2_3 - 0.00189935064935071*G0_0_1_2_2_5 - 0.00160714285714291*G0_0_1_2_3_0 + 0.00701298701298726*G0_0_1_2_3_1 - 0.0102272727272731*G0_0_1_2_3_2 + 0.00350649350649361*G0_0_1_2_3_3 + 0.00233766233766242*G0_0_1_2_3_4 + 0.00701298701298725*G0_0_1_2_3_5 - 0.00116883116883121*G0_0_1_2_4_0 + 0.000438311688311701*G0_0_1_2_4_1 + 0.00233766233766242*G0_0_1_2_4_3 + 0.00350649350649366*G0_0_1_2_4_4 + 0.00292207792207802*G0_0_1_2_4_5 - 0.00131493506493511*G0_0_1_2_5_0 + 0.000438311688311708*G0_0_1_2_5_1 - 0.00189935064935071*G0_0_1_2_5_2 + 0.00701298701298724*G0_0_1_2_5_3 + 0.00292207792207802*G0_0_1_2_5_4 + 0.00409090909090923*G0_0_1_2_5_5 - 0.00423701298701311*G0_0_1_3_0_0 - 0.0016071428571429*G0_0_1_3_0_1 - 0.00160714285714291*G0_0_1_3_0_2 + 0.0350649350649361*G0_0_1_3_0_3 + 0.0111038961038964*G0_0_1_3_0_4 + 0.0111038961038965*G0_0_1_3_0_5 - 0.0016071428571429*G0_0_1_3_1_0 - 0.0102272727272731*G0_0_1_3_1_1 + 0.00701298701298726*G0_0_1_3_1_2 + 0.00350649350649354*G0_0_1_3_1_3 + 0.00701298701298723*G0_0_1_3_1_4 + 0.00233766233766239*G0_0_1_3_1_5 - 0.00160714285714291*G0_0_1_3_2_0 + 0.00701298701298726*G0_0_1_3_2_1 - 0.0102272727272731*G0_0_1_3_2_2 + 0.0035064935064936*G0_0_1_3_2_3 + 0.00233766233766242*G0_0_1_3_2_4 + 0.00701298701298724*G0_0_1_3_2_5 + 0.0350649350649361*G0_0_1_3_3_0 + 0.00350649350649354*G0_0_1_3_3_1 + 0.0035064935064936*G0_0_1_3_3_2 - 0.490909090909108*G0_0_1_3_3_3 - 0.0841558441558469*G0_0_1_3_3_4 - 0.084155844155847*G0_0_1_3_3_5 + 0.0111038961038964*G0_0_1_3_4_0 + 0.00701298701298723*G0_0_1_3_4_1 + 0.00233766233766242*G0_0_1_3_4_2 - 0.0841558441558469*G0_0_1_3_4_3 - 0.0303896103896113*G0_0_1_3_4_4 - 0.028051948051949*G0_0_1_3_4_5 + 0.0111038961038965*G0_0_1_3_5_0 + 0.00233766233766239*G0_0_1_3_5_1 + 0.00701298701298725*G0_0_1_3_5_2 - 0.084155844155847*G0_0_1_3_5_3 - 0.028051948051949*G0_0_1_3_5_4 - 0.0303896103896114*G0_0_1_3_5_5 - 0.001461038961039*G0_0_1_4_0_0 - 0.0013149350649351*G0_0_1_4_0_1 - 0.00116883116883121*G0_0_1_4_0_2 + 0.0111038961038964*G0_0_1_4_0_3 + 0.00525974025974041*G0_0_1_4_0_4 + 0.00525974025974042*G0_0_1_4_0_5 - 0.0013149350649351*G0_0_1_4_1_0 - 0.00189935064935071*G0_0_1_4_1_1 + 0.000438311688311701*G0_0_1_4_1_2 + 0.00701298701298723*G0_0_1_4_1_3 + 0.00409090909090921*G0_0_1_4_1_4 + 0.00292207792207801*G0_0_1_4_1_5 - 0.00116883116883121*G0_0_1_4_2_0 + 0.000438311688311701*G0_0_1_4_2_1 + 0.00233766233766242*G0_0_1_4_2_3 + 0.00350649350649366*G0_0_1_4_2_4 + 0.00292207792207802*G0_0_1_4_2_5 + 0.0111038961038964*G0_0_1_4_3_0 + 0.00701298701298723*G0_0_1_4_3_1 + 0.00233766233766242*G0_0_1_4_3_2 - 0.0841558441558469*G0_0_1_4_3_3 - 0.0303896103896113*G0_0_1_4_3_4 - 0.028051948051949*G0_0_1_4_3_5 + 0.00525974025974041*G0_0_1_4_4_0 + 0.00409090909090921*G0_0_1_4_4_1 + 0.00350649350649366*G0_0_1_4_4_2 - 0.0303896103896113*G0_0_1_4_4_3 - 0.00701298701298718*G0_0_1_4_4_4 - 0.0140259740259745*G0_0_1_4_4_5 + 0.00525974025974042*G0_0_1_4_5_0 + 0.00292207792207801*G0_0_1_4_5_1 + 0.00292207792207802*G0_0_1_4_5_2 - 0.028051948051949*G0_0_1_4_5_3 - 0.0140259740259745*G0_0_1_4_5_4 - 0.0140259740259745*G0_0_1_4_5_5 - 0.00146103896103901*G0_0_1_5_0_0 - 0.0011688311688312*G0_0_1_5_0_1 - 0.00131493506493511*G0_0_1_5_0_2 + 0.0111038961038965*G0_0_1_5_0_3 + 0.00525974025974042*G0_0_1_5_0_4 + 0.00525974025974044*G0_0_1_5_0_5 - 0.0011688311688312*G0_0_1_5_1_0 + 0.000438311688311708*G0_0_1_5_1_2 + 0.00233766233766239*G0_0_1_5_1_3 + 0.00292207792207801*G0_0_1_5_1_4 + 0.00350649350649359*G0_0_1_5_1_5 - 0.00131493506493511*G0_0_1_5_2_0 + 0.000438311688311707*G0_0_1_5_2_1 - 0.00189935064935071*G0_0_1_5_2_2 + 0.00701298701298724*G0_0_1_5_2_3 + 0.00292207792207802*G0_0_1_5_2_4 + 0.00409090909090923*G0_0_1_5_2_5 + 0.0111038961038965*G0_0_1_5_3_0 + 0.00233766233766239*G0_0_1_5_3_1 + 0.00701298701298725*G0_0_1_5_3_2 - 0.084155844155847*G0_0_1_5_3_3 - 0.028051948051949*G0_0_1_5_3_4 - 0.0303896103896114*G0_0_1_5_3_5 + 0.00525974025974042*G0_0_1_5_4_0 + 0.00292207792207801*G0_0_1_5_4_1 + 0.00292207792207802*G0_0_1_5_4_2 - 0.028051948051949*G0_0_1_5_4_3 - 0.0140259740259745*G0_0_1_5_4_4 - 0.0140259740259745*G0_0_1_5_4_5 + 0.00525974025974044*G0_0_1_5_5_0 + 0.00350649350649359*G0_0_1_5_5_1 + 0.00409090909090923*G0_0_1_5_5_2 - 0.0303896103896114*G0_0_1_5_5_3 - 0.0140259740259745*G0_0_1_5_5_4 - 0.00701298701298728*G0_0_1_5_5_5 - 0.000876623376623397*G0_1_0_0_0_0 - 0.000328733766233774*G0_1_0_0_0_1 - 0.000328733766233779*G0_1_0_0_0_2 + 0.00423701298701311*G0_1_0_0_0_3 + 0.001461038961039*G0_1_0_0_0_4 + 0.00146103896103901*G0_1_0_0_0_5 - 0.000328733766233774*G0_1_0_0_1_0 - 0.000401785714285733*G0_1_0_0_1_1 + 0.000255681818181826*G0_1_0_0_1_2 + 0.0016071428571429*G0_1_0_0_1_3 + 0.0013149350649351*G0_1_0_0_1_4 + 0.0011688311688312*G0_1_0_0_1_5 - 0.000328733766233779*G0_1_0_0_2_0 + 0.000255681818181826*G0_1_0_0_2_1 - 0.000401785714285715*G0_1_0_0_2_2 + 0.00160714285714291*G0_1_0_0_2_3 + 0.00116883116883121*G0_1_0_0_2_4 + 0.00131493506493511*G0_1_0_0_2_5 + 0.00423701298701311*G0_1_0_0_3_0 + 0.0016071428571429*G0_1_0_0_3_1 + 0.00160714285714291*G0_1_0_0_3_2 - 0.0350649350649361*G0_1_0_0_3_3 - 0.0111038961038964*G0_1_0_0_3_4 - 0.0111038961038965*G0_1_0_0_3_5 + 0.001461038961039*G0_1_0_0_4_0 + 0.0013149350649351*G0_1_0_0_4_1 + 0.00116883116883121*G0_1_0_0_4_2 - 0.0111038961038964*G0_1_0_0_4_3 - 0.00525974025974041*G0_1_0_0_4_4 - 0.00525974025974042*G0_1_0_0_4_5 + 0.00146103896103901*G0_1_0_0_5_0 + 0.0011688311688312*G0_1_0_0_5_1 + 0.00131493506493511*G0_1_0_0_5_2 - 0.0111038961038965*G0_1_0_0_5_3 - 0.00525974025974042*G0_1_0_0_5_4 - 0.00525974025974044*G0_1_0_0_5_5 - 0.000328733766233774*G0_1_0_1_0_0 - 0.000401785714285732*G0_1_0_1_0_1 + 0.000255681818181826*G0_1_0_1_0_2 + 0.0016071428571429*G0_1_0_1_0_3 + 0.0013149350649351*G0_1_0_1_0_4 + 0.0011688311688312*G0_1_0_1_0_5 - 0.000401785714285733*G0_1_0_1_1_0 - 0.00328733766233767*G0_1_0_1_1_1 - 0.000401785714285735*G0_1_0_1_1_2 + 0.0102272727272731*G0_1_0_1_1_3 + 0.00189935064935071*G0_1_0_1_1_4 + 0.000255681818181826*G0_1_0_1_2_0 - 0.000401785714285734*G0_1_0_1_2_1 - 0.00040178571428572*G0_1_0_1_2_2 - 0.00701298701298726*G0_1_0_1_2_3 - 0.000438311688311701*G0_1_0_1_2_4 - 0.000438311688311707*G0_1_0_1_2_5 + 0.0016071428571429*G0_1_0_1_3_0 + 0.0102272727272731*G0_1_0_1_3_1 - 0.00701298701298726*G0_1_0_1_3_2 - 0.00350649350649355*G0_1_0_1_3_3 - 0.00701298701298722*G0_1_0_1_3_4 - 0.00233766233766239*G0_1_0_1_3_5 + 0.0013149350649351*G0_1_0_1_4_0 + 0.00189935064935071*G0_1_0_1_4_1 - 0.000438311688311701*G0_1_0_1_4_2 - 0.00701298701298722*G0_1_0_1_4_3 - 0.00409090909090921*G0_1_0_1_4_4 - 0.00292207792207801*G0_1_0_1_4_5 + 0.0011688311688312*G0_1_0_1_5_0 - 0.000438311688311707*G0_1_0_1_5_2 - 0.00233766233766239*G0_1_0_1_5_3 - 0.00292207792207801*G0_1_0_1_5_4 - 0.00350649350649359*G0_1_0_1_5_5 - 0.000328733766233779*G0_1_0_2_0_0 + 0.000255681818181826*G0_1_0_2_0_1 - 0.000401785714285714*G0_1_0_2_0_2 + 0.00160714285714291*G0_1_0_2_0_3 + 0.00116883116883121*G0_1_0_2_0_4 + 0.00131493506493511*G0_1_0_2_0_5 + 0.000255681818181826*G0_1_0_2_1_0 - 0.000401785714285735*G0_1_0_2_1_1 - 0.00040178571428572*G0_1_0_2_1_2 - 0.00701298701298726*G0_1_0_2_1_3 - 0.000438311688311701*G0_1_0_2_1_4 - 0.000438311688311708*G0_1_0_2_1_5 - 0.000401785714285714*G0_1_0_2_2_0 - 0.00040178571428572*G0_1_0_2_2_1 - 0.00328733766233792*G0_1_0_2_2_2 + 0.0102272727272731*G0_1_0_2_2_3 + 0.00189935064935071*G0_1_0_2_2_5 + 0.00160714285714291*G0_1_0_2_3_0 - 0.00701298701298726*G0_1_0_2_3_1 + 0.0102272727272731*G0_1_0_2_3_2 - 0.00350649350649361*G0_1_0_2_3_3 - 0.00233766233766242*G0_1_0_2_3_4 - 0.00701298701298725*G0_1_0_2_3_5 + 0.00116883116883121*G0_1_0_2_4_0 - 0.000438311688311701*G0_1_0_2_4_1 - 0.00233766233766242*G0_1_0_2_4_3 - 0.00350649350649366*G0_1_0_2_4_4 - 0.00292207792207802*G0_1_0_2_4_5 + 0.00131493506493511*G0_1_0_2_5_0 - 0.000438311688311708*G0_1_0_2_5_1 + 0.00189935064935071*G0_1_0_2_5_2 - 0.00701298701298725*G0_1_0_2_5_3 - 0.00292207792207802*G0_1_0_2_5_4 - 0.00409090909090923*G0_1_0_2_5_5 + 0.00423701298701311*G0_1_0_3_0_0 + 0.0016071428571429*G0_1_0_3_0_1 + 0.00160714285714291*G0_1_0_3_0_2 - 0.0350649350649361*G0_1_0_3_0_3 - 0.0111038961038964*G0_1_0_3_0_4 - 0.0111038961038965*G0_1_0_3_0_5 + 0.0016071428571429*G0_1_0_3_1_0 + 0.0102272727272731*G0_1_0_3_1_1 - 0.00701298701298726*G0_1_0_3_1_2 - 0.00350649350649354*G0_1_0_3_1_3 - 0.00701298701298722*G0_1_0_3_1_4 - 0.00233766233766239*G0_1_0_3_1_5 + 0.00160714285714291*G0_1_0_3_2_0 - 0.00701298701298726*G0_1_0_3_2_1 + 0.0102272727272731*G0_1_0_3_2_2 - 0.00350649350649361*G0_1_0_3_2_3 - 0.00233766233766242*G0_1_0_3_2_4 - 0.00701298701298725*G0_1_0_3_2_5 - 0.0350649350649361*G0_1_0_3_3_0 - 0.00350649350649354*G0_1_0_3_3_1 - 0.00350649350649361*G0_1_0_3_3_2 + 0.490909090909108*G0_1_0_3_3_3 + 0.0841558441558469*G0_1_0_3_3_4 + 0.084155844155847*G0_1_0_3_3_5 - 0.0111038961038964*G0_1_0_3_4_0 - 0.00701298701298722*G0_1_0_3_4_1 - 0.00233766233766242*G0_1_0_3_4_2 + 0.0841558441558469*G0_1_0_3_4_3 + 0.0303896103896113*G0_1_0_3_4_4 + 0.028051948051949*G0_1_0_3_4_5 - 0.0111038961038965*G0_1_0_3_5_0 - 0.00233766233766239*G0_1_0_3_5_1 - 0.00701298701298725*G0_1_0_3_5_2 + 0.084155844155847*G0_1_0_3_5_3 + 0.028051948051949*G0_1_0_3_5_4 + 0.0303896103896114*G0_1_0_3_5_5 + 0.001461038961039*G0_1_0_4_0_0 + 0.0013149350649351*G0_1_0_4_0_1 + 0.00116883116883121*G0_1_0_4_0_2 - 0.0111038961038964*G0_1_0_4_0_3 - 0.00525974025974041*G0_1_0_4_0_4 - 0.00525974025974042*G0_1_0_4_0_5 + 0.0013149350649351*G0_1_0_4_1_0 + 0.00189935064935071*G0_1_0_4_1_1 - 0.000438311688311701*G0_1_0_4_1_2 - 0.00701298701298722*G0_1_0_4_1_3 - 0.00409090909090921*G0_1_0_4_1_4 - 0.00292207792207801*G0_1_0_4_1_5 + 0.00116883116883121*G0_1_0_4_2_0 - 0.000438311688311701*G0_1_0_4_2_1 - 0.00233766233766242*G0_1_0_4_2_3 - 0.00350649350649366*G0_1_0_4_2_4 - 0.00292207792207802*G0_1_0_4_2_5 - 0.0111038961038964*G0_1_0_4_3_0 - 0.00701298701298722*G0_1_0_4_3_1 - 0.00233766233766242*G0_1_0_4_3_2 + 0.0841558441558469*G0_1_0_4_3_3 + 0.0303896103896113*G0_1_0_4_3_4 + 0.028051948051949*G0_1_0_4_3_5 - 0.00525974025974041*G0_1_0_4_4_0 - 0.00409090909090921*G0_1_0_4_4_1 - 0.00350649350649366*G0_1_0_4_4_2 + 0.0303896103896113*G0_1_0_4_4_3 + 0.00701298701298718*G0_1_0_4_4_4 + 0.0140259740259745*G0_1_0_4_4_5 - 0.00525974025974042*G0_1_0_4_5_0 - 0.00292207792207801*G0_1_0_4_5_1 - 0.00292207792207802*G0_1_0_4_5_2 + 0.028051948051949*G0_1_0_4_5_3 + 0.0140259740259745*G0_1_0_4_5_4 + 0.0140259740259745*G0_1_0_4_5_5 + 0.00146103896103901*G0_1_0_5_0_0 + 0.0011688311688312*G0_1_0_5_0_1 + 0.00131493506493511*G0_1_0_5_0_2 - 0.0111038961038965*G0_1_0_5_0_3 - 0.00525974025974042*G0_1_0_5_0_4 - 0.00525974025974044*G0_1_0_5_0_5 + 0.0011688311688312*G0_1_0_5_1_0 - 0.000438311688311708*G0_1_0_5_1_2 - 0.00233766233766239*G0_1_0_5_1_3 - 0.00292207792207801*G0_1_0_5_1_4 - 0.00350649350649359*G0_1_0_5_1_5 + 0.00131493506493511*G0_1_0_5_2_0 - 0.000438311688311708*G0_1_0_5_2_1 + 0.00189935064935071*G0_1_0_5_2_2 - 0.00701298701298725*G0_1_0_5_2_3 - 0.00292207792207802*G0_1_0_5_2_4 - 0.00409090909090923*G0_1_0_5_2_5 - 0.0111038961038965*G0_1_0_5_3_0 - 0.00233766233766239*G0_1_0_5_3_1 - 0.00701298701298725*G0_1_0_5_3_2 + 0.084155844155847*G0_1_0_5_3_3 + 0.028051948051949*G0_1_0_5_3_4 + 0.0303896103896114*G0_1_0_5_3_5 - 0.00525974025974042*G0_1_0_5_4_0 - 0.00292207792207801*G0_1_0_5_4_1 - 0.00292207792207802*G0_1_0_5_4_2 + 0.028051948051949*G0_1_0_5_4_3 + 0.0140259740259745*G0_1_0_5_4_4 + 0.0140259740259745*G0_1_0_5_4_5 - 0.00525974025974044*G0_1_0_5_5_0 - 0.00350649350649359*G0_1_0_5_5_1 - 0.00409090909090923*G0_1_0_5_5_2 + 0.0303896103896114*G0_1_0_5_5_3 + 0.0140259740259745*G0_1_0_5_5_4 + 0.00701298701298728*G0_1_0_5_5_5; + A[48] = -A[43] + 0.00398133116883133*G0_0_0_0_0_0 - 0.000206980519480526*G0_0_0_0_0_1 - 0.00209415584415592*G0_0_0_0_0_2 + 0.000487012987013001*G0_0_0_0_0_3 + 0.000243506493506505*G0_0_0_0_0_5 - 0.000206980519480526*G0_0_0_0_1_0 - 0.000365259740259755*G0_0_0_0_1_1 - 0.000438311688311704*G0_0_0_0_1_2 + 0.0012175324675325*G0_0_0_0_1_3 - 0.000292207792207803*G0_0_0_0_1_4 + 0.000487012987013003*G0_0_0_0_1_5 - 0.00209415584415592*G0_0_0_0_2_0 - 0.000438311688311703*G0_0_0_0_2_1 + 0.0099959415584419*G0_0_0_0_2_2 + 0.00102272727272732*G0_0_0_0_2_3 + 0.00808441558441586*G0_0_0_0_2_4 + 0.000487012987013001*G0_0_0_0_3_0 + 0.0012175324675325*G0_0_0_0_3_1 + 0.00102272727272732*G0_0_0_0_3_2 - 0.00798701298701324*G0_0_0_0_3_3 - 0.000389610389610396*G0_0_0_0_3_4 - 0.000779220779220811*G0_0_0_0_3_5 - 0.000292207792207803*G0_0_0_0_4_1 + 0.00808441558441586*G0_0_0_0_4_2 - 0.000389610389610396*G0_0_0_0_4_3 + 0.0175324675324681*G0_0_0_0_4_4 + 0.000779220779220805*G0_0_0_0_4_5 + 0.000243506493506505*G0_0_0_0_5_0 + 0.000487012987013003*G0_0_0_0_5_1 - 0.000779220779220811*G0_0_0_0_5_3 + 0.000779220779220805*G0_0_0_0_5_4 + 0.000974025974025987*G0_0_0_0_5_5 - 0.000206980519480526*G0_0_0_1_0_0 - 0.000365259740259755*G0_0_0_1_0_1 - 0.000438311688311704*G0_0_0_1_0_2 + 0.0012175324675325*G0_0_0_1_0_3 - 0.000292207792207803*G0_0_0_1_0_4 + 0.000487012987013003*G0_0_0_1_0_5 - 0.000365259740259755*G0_0_0_1_1_0 + 0.00401785714285734*G0_0_0_1_1_1 - 0.000243506493506504*G0_0_0_1_1_2 + 0.00365259740259753*G0_0_0_1_1_3 + 0.0002435064935065*G0_0_0_1_1_4 + 0.000730519480519521*G0_0_0_1_1_5 - 0.000438311688311703*G0_0_0_1_2_0 - 0.000243506493506505*G0_0_0_1_2_1 + 0.00451704545454561*G0_0_0_1_2_2 - 0.00146103896103901*G0_0_0_1_2_3 + 0.00228896103896112*G0_0_0_1_2_4 - 0.000243506493506501*G0_0_0_1_2_5 + 0.0012175324675325*G0_0_0_1_3_0 + 0.00365259740259753*G0_0_0_1_3_1 - 0.00146103896103901*G0_0_0_1_3_2 - 0.0146103896103901*G0_0_0_1_3_3 - 0.00292207792207801*G0_0_0_1_3_4 - 0.00194805194805201*G0_0_0_1_3_5 - 0.000292207792207803*G0_0_0_1_4_0 + 0.000243506493506501*G0_0_0_1_4_1 + 0.00228896103896112*G0_0_0_1_4_2 - 0.00292207792207801*G0_0_0_1_4_3 + 0.00389610389610403*G0_0_0_1_4_4 + 0.000487012987013003*G0_0_0_1_5_0 + 0.000730519480519521*G0_0_0_1_5_1 - 0.000243506493506501*G0_0_0_1_5_2 - 0.00194805194805201*G0_0_0_1_5_3 + 0.000974025974026018*G0_0_0_1_5_5 - 0.00209415584415592*G0_0_0_2_0_0 - 0.000438311688311703*G0_0_0_2_0_1 + 0.0099959415584419*G0_0_0_2_0_2 + 0.00102272727272732*G0_0_0_2_0_3 + 0.00808441558441586*G0_0_0_2_0_4 - 0.000438311688311703*G0_0_0_2_1_0 - 0.000243506493506505*G0_0_0_2_1_1 + 0.00451704545454561*G0_0_0_2_1_2 - 0.00146103896103901*G0_0_0_2_1_3 + 0.00228896103896112*G0_0_0_2_1_4 - 0.000243506493506501*G0_0_0_2_1_5 + 0.0099959415584419*G0_0_0_2_2_0 + 0.00451704545454561*G0_0_0_2_2_1 - 0.119805194805199*G0_0_0_2_2_2 - 0.0155844155844162*G0_0_0_2_2_3 - 0.0457792207792224*G0_0_0_2_2_4 - 0.00209415584415594*G0_0_0_2_2_5 + 0.00102272727272732*G0_0_0_2_3_0 - 0.00146103896103901*G0_0_0_2_3_1 - 0.0155844155844162*G0_0_0_2_3_2 + 0.0124675324675329*G0_0_0_2_3_3 - 0.00662337662337687*G0_0_0_2_3_4 + 0.0021428571428572*G0_0_0_2_3_5 + 0.00808441558441586*G0_0_0_2_4_0 + 0.00228896103896112*G0_0_0_2_4_1 - 0.0457792207792224*G0_0_0_2_4_2 - 0.00662337662337687*G0_0_0_2_4_3 - 0.0459740259740276*G0_0_0_2_4_4 - 0.000389610389610419*G0_0_0_2_4_5 - 0.000243506493506501*G0_0_0_2_5_1 - 0.00209415584415594*G0_0_0_2_5_2 + 0.0021428571428572*G0_0_0_2_5_3 - 0.000389610389610419*G0_0_0_2_5_4 + 0.00389610389610402*G0_0_0_2_5_5 + 0.000487012987013001*G0_0_0_3_0_0 + 0.0012175324675325*G0_0_0_3_0_1 + 0.00102272727272732*G0_0_0_3_0_2 - 0.00798701298701324*G0_0_0_3_0_3 - 0.000389610389610396*G0_0_0_3_0_4 - 0.00077922077922081*G0_0_0_3_0_5 + 0.0012175324675325*G0_0_0_3_1_0 + 0.00365259740259753*G0_0_0_3_1_1 - 0.00146103896103901*G0_0_0_3_1_2 - 0.0146103896103901*G0_0_0_3_1_3 - 0.00292207792207801*G0_0_0_3_1_4 - 0.00194805194805201*G0_0_0_3_1_5 + 0.00102272727272732*G0_0_0_3_2_0 - 0.00146103896103901*G0_0_0_3_2_1 - 0.0155844155844162*G0_0_0_3_2_2 + 0.0124675324675329*G0_0_0_3_2_3 - 0.00662337662337687*G0_0_0_3_2_4 + 0.0021428571428572*G0_0_0_3_2_5 - 0.00798701298701324*G0_0_0_3_3_0 - 0.0146103896103901*G0_0_0_3_3_1 + 0.0124675324675329*G0_0_0_3_3_2 + 0.130909090909096*G0_0_0_3_3_3 + 0.0218181818181825*G0_0_0_3_3_4 + 0.0116883116883121*G0_0_0_3_3_5 - 0.000389610389610396*G0_0_0_3_4_0 - 0.00292207792207801*G0_0_0_3_4_1 - 0.00662337662337687*G0_0_0_3_4_2 + 0.0218181818181825*G0_0_0_3_4_3 - 0.00701298701298726*G0_0_0_3_4_4 + 0.00155844155844162*G0_0_0_3_4_5 - 0.000779220779220811*G0_0_0_3_5_0 - 0.00194805194805201*G0_0_0_3_5_1 + 0.0021428571428572*G0_0_0_3_5_2 + 0.0116883116883121*G0_0_0_3_5_3 + 0.00155844155844162*G0_0_0_3_5_4 - 0.00623376623376642*G0_0_0_3_5_5 - 0.000292207792207803*G0_0_0_4_0_1 + 0.00808441558441586*G0_0_0_4_0_2 - 0.000389610389610396*G0_0_0_4_0_3 + 0.0175324675324681*G0_0_0_4_0_4 + 0.000779220779220805*G0_0_0_4_0_5 - 0.000292207792207803*G0_0_0_4_1_0 + 0.000243506493506501*G0_0_0_4_1_1 + 0.00228896103896112*G0_0_0_4_1_2 - 0.00292207792207801*G0_0_0_4_1_3 + 0.00389610389610403*G0_0_0_4_1_4 + 0.00808441558441586*G0_0_0_4_2_0 + 0.00228896103896112*G0_0_0_4_2_1 - 0.0457792207792224*G0_0_0_4_2_2 - 0.00662337662337687*G0_0_0_4_2_3 - 0.0459740259740276*G0_0_0_4_2_4 - 0.000389610389610419*G0_0_0_4_2_5 - 0.000389610389610396*G0_0_0_4_3_0 - 0.00292207792207801*G0_0_0_4_3_1 - 0.00662337662337687*G0_0_0_4_3_2 + 0.0218181818181825*G0_0_0_4_3_3 - 0.00701298701298726*G0_0_0_4_3_4 + 0.00155844155844162*G0_0_0_4_3_5 + 0.0175324675324681*G0_0_0_4_4_0 + 0.00389610389610403*G0_0_0_4_4_1 - 0.0459740259740276*G0_0_0_4_4_2 - 0.00701298701298726*G0_0_0_4_4_3 - 0.128571428571433*G0_0_0_4_4_4 - 0.00701298701298726*G0_0_0_4_4_5 + 0.000779220779220805*G0_0_0_4_5_0 - 0.000389610389610419*G0_0_0_4_5_2 + 0.00155844155844162*G0_0_0_4_5_3 - 0.00701298701298726*G0_0_0_4_5_4 - 0.00779220779220805*G0_0_0_4_5_5 + 0.000243506493506505*G0_0_0_5_0_0 + 0.000487012987013003*G0_0_0_5_0_1 - 0.00077922077922081*G0_0_0_5_0_3 + 0.000779220779220805*G0_0_0_5_0_4 + 0.000974025974025987*G0_0_0_5_0_5 + 0.000487012987013003*G0_0_0_5_1_0 + 0.000730519480519522*G0_0_0_5_1_1 - 0.000243506493506501*G0_0_0_5_1_2 - 0.00194805194805201*G0_0_0_5_1_3 + 0.000974025974026017*G0_0_0_5_1_5 - 0.000243506493506501*G0_0_0_5_2_1 - 0.00209415584415594*G0_0_0_5_2_2 + 0.0021428571428572*G0_0_0_5_2_3 - 0.000389610389610419*G0_0_0_5_2_4 + 0.00389610389610402*G0_0_0_5_2_5 - 0.00077922077922081*G0_0_0_5_3_0 - 0.00194805194805201*G0_0_0_5_3_1 + 0.0021428571428572*G0_0_0_5_3_2 + 0.0116883116883121*G0_0_0_5_3_3 + 0.00155844155844162*G0_0_0_5_3_4 - 0.00623376623376642*G0_0_0_5_3_5 + 0.000779220779220805*G0_0_0_5_4_0 - 0.000389610389610419*G0_0_0_5_4_2 + 0.00155844155844162*G0_0_0_5_4_3 - 0.00701298701298726*G0_0_0_5_4_4 - 0.00779220779220805*G0_0_0_5_4_5 + 0.000974025974025987*G0_0_0_5_5_0 + 0.000974025974026018*G0_0_0_5_5_1 + 0.00389610389610402*G0_0_0_5_5_2 - 0.00623376623376642*G0_0_0_5_5_3 - 0.00779220779220805*G0_0_0_5_5_4 - 0.0303896103896115*G0_0_0_5_5_5 + 0.000255681818181895*G0_1_0_0_0_0 - 0.000572240259740283*G0_1_0_0_0_2 + 0.00487012987013001*G0_1_0_0_0_3 + 0.00199675324675332*G0_1_0_0_0_4 + 0.000681818181818196*G0_1_0_0_0_5 - 0.00547889610389628*G0_1_0_0_1_1 + 0.00012175324675325*G0_1_0_0_1_2 + 0.002435064935065*G0_1_0_0_1_3 + 0.00194805194805201*G0_1_0_0_1_4 + 0.000974025974026004*G0_1_0_0_1_5 - 0.000572240259740282*G0_1_0_0_2_0 + 0.00012175324675325*G0_1_0_0_2_1 + 0.000231331168831183*G0_1_0_0_2_2 + 0.00194805194805201*G0_1_0_0_2_3 + 0.00224025974025981*G0_1_0_0_2_4 + 0.00165584415584421*G0_1_0_0_2_5 + 0.00487012987013001*G0_1_0_0_3_0 + 0.002435064935065*G0_1_0_0_3_1 + 0.00194805194805201*G0_1_0_0_3_2 - 0.0372077922077933*G0_1_0_0_3_3 - 0.013636363636364*G0_1_0_0_3_4 - 0.0130519480519485*G0_1_0_0_3_5 + 0.00199675324675332*G0_1_0_0_4_0 + 0.00194805194805201*G0_1_0_0_4_1 + 0.00224025974025981*G0_1_0_0_4_2 - 0.013636363636364*G0_1_0_0_4_3 - 0.0062337662337664*G0_1_0_0_4_4 - 0.00720779220779243*G0_1_0_0_4_5 + 0.000681818181818196*G0_1_0_0_5_0 + 0.000974025974026004*G0_1_0_0_5_1 + 0.00165584415584421*G0_1_0_0_5_2 - 0.0130519480519485*G0_1_0_0_5_3 - 0.00720779220779243*G0_1_0_0_5_4 - 0.00876623376623409*G0_1_0_0_5_5 - 0.00547889610389628*G0_1_0_1_0_1 + 0.00012175324675325*G0_1_0_1_0_2 + 0.002435064935065*G0_1_0_1_0_3 + 0.00194805194805201*G0_1_0_1_0_4 + 0.000974025974026004*G0_1_0_1_0_5 - 0.00547889610389629*G0_1_0_1_1_0 + 0.0854707792207821*G0_1_0_1_1_1 - 0.00328733766233777*G0_1_0_1_1_2 + 0.0204545454545461*G0_1_0_1_1_3 + 0.002922077922078*G0_1_0_1_1_4 + 0.0204545454545462*G0_1_0_1_1_5 + 0.00012175324675325*G0_1_0_1_2_0 - 0.00328733766233777*G0_1_0_1_2_1 - 0.00487012987013004*G0_1_0_1_2_3 + 0.000487012987013004*G0_1_0_1_2_4 - 0.00048701298701301*G0_1_0_1_2_5 + 0.002435064935065*G0_1_0_1_3_0 + 0.0204545454545461*G0_1_0_1_3_1 - 0.00487012987013004*G0_1_0_1_3_2 - 0.0194805194805201*G0_1_0_1_3_3 - 0.010714285714286*G0_1_0_1_3_4 - 0.00389610389610399*G0_1_0_1_3_5 + 0.00194805194805201*G0_1_0_1_4_0 + 0.002922077922078*G0_1_0_1_4_1 + 0.000487012987013004*G0_1_0_1_4_2 - 0.010714285714286*G0_1_0_1_4_3 - 0.00584415584415602*G0_1_0_1_4_4 - 0.00487012987013002*G0_1_0_1_4_5 + 0.000974025974026004*G0_1_0_1_5_0 + 0.0204545454545462*G0_1_0_1_5_1 - 0.00048701298701301*G0_1_0_1_5_2 - 0.00389610389610399*G0_1_0_1_5_3 - 0.00487012987013002*G0_1_0_1_5_4 + 0.00389610389610407*G0_1_0_1_5_5 - 0.000572240259740283*G0_1_0_2_0_0 + 0.00012175324675325*G0_1_0_2_0_1 + 0.000231331168831183*G0_1_0_2_0_2 + 0.00194805194805201*G0_1_0_2_0_3 + 0.00224025974025981*G0_1_0_2_0_4 + 0.00165584415584421*G0_1_0_2_0_5 + 0.00012175324675325*G0_1_0_2_1_0 - 0.00328733766233777*G0_1_0_2_1_1 - 0.00487012987013004*G0_1_0_2_1_3 + 0.000487012987013004*G0_1_0_2_1_4 - 0.00048701298701301*G0_1_0_2_1_5 + 0.000231331168831183*G0_1_0_2_2_0 - 0.0100446428571433*G0_1_0_2_2_2 + 0.00681818181818203*G0_1_0_2_2_3 - 0.00267857142857154*G0_1_0_2_2_4 + 0.00165584415584421*G0_1_0_2_2_5 + 0.00194805194805201*G0_1_0_2_3_0 - 0.00487012987013004*G0_1_0_2_3_1 + 0.00681818181818203*G0_1_0_2_3_2 + 0.00175324675324683*G0_1_0_2_3_3 - 0.00487012987013003*G0_1_0_2_3_4 - 0.00720779220779244*G0_1_0_2_3_5 + 0.00224025974025981*G0_1_0_2_4_0 + 0.000487012987013004*G0_1_0_2_4_1 - 0.00267857142857154*G0_1_0_2_4_2 - 0.00487012987013003*G0_1_0_2_4_3 - 0.00857142857142887*G0_1_0_2_4_4 - 0.00428571428571442*G0_1_0_2_4_5 + 0.00165584415584421*G0_1_0_2_5_0 - 0.00048701298701301*G0_1_0_2_5_1 + 0.00165584415584421*G0_1_0_2_5_2 - 0.00720779220779244*G0_1_0_2_5_3 - 0.00428571428571442*G0_1_0_2_5_4 - 0.00097402597402599*G0_1_0_2_5_5 + 0.00487012987013001*G0_1_0_3_0_0 + 0.002435064935065*G0_1_0_3_0_1 + 0.00194805194805201*G0_1_0_3_0_2 - 0.0372077922077933*G0_1_0_3_0_3 - 0.013636363636364*G0_1_0_3_0_4 - 0.0130519480519485*G0_1_0_3_0_5 + 0.002435064935065*G0_1_0_3_1_0 + 0.0204545454545461*G0_1_0_3_1_1 - 0.00487012987013004*G0_1_0_3_1_2 - 0.0194805194805201*G0_1_0_3_1_3 - 0.010714285714286*G0_1_0_3_1_4 - 0.00389610389610399*G0_1_0_3_1_5 + 0.00194805194805202*G0_1_0_3_2_0 - 0.00487012987013004*G0_1_0_3_2_1 + 0.00681818181818203*G0_1_0_3_2_2 + 0.00175324675324682*G0_1_0_3_2_3 - 0.00487012987013003*G0_1_0_3_2_4 - 0.00720779220779244*G0_1_0_3_2_5 - 0.0372077922077933*G0_1_0_3_3_0 - 0.0194805194805201*G0_1_0_3_3_1 + 0.00175324675324682*G0_1_0_3_3_2 + 0.448831168831184*G0_1_0_3_3_3 + 0.0958441558441589*G0_1_0_3_3_4 + 0.0888311688311718*G0_1_0_3_3_5 - 0.013636363636364*G0_1_0_3_4_0 - 0.010714285714286*G0_1_0_3_4_1 - 0.00487012987013003*G0_1_0_3_4_2 + 0.0958441558441589*G0_1_0_3_4_3 + 0.0389610389610402*G0_1_0_3_4_4 + 0.035844155844157*G0_1_0_3_4_5 - 0.0130519480519485*G0_1_0_3_5_0 - 0.00389610389610399*G0_1_0_3_5_1 - 0.00720779220779244*G0_1_0_3_5_2 + 0.0888311688311718*G0_1_0_3_5_3 + 0.035844155844157*G0_1_0_3_5_4 + 0.0280519480519489*G0_1_0_3_5_5 + 0.00199675324675332*G0_1_0_4_0_0 + 0.00194805194805201*G0_1_0_4_0_1 + 0.00224025974025981*G0_1_0_4_0_2 - 0.013636363636364*G0_1_0_4_0_3 - 0.0062337662337664*G0_1_0_4_0_4 - 0.00720779220779243*G0_1_0_4_0_5 + 0.00194805194805201*G0_1_0_4_1_0 + 0.002922077922078*G0_1_0_4_1_1 + 0.000487012987013004*G0_1_0_4_1_2 - 0.010714285714286*G0_1_0_4_1_3 - 0.00584415584415602*G0_1_0_4_1_4 - 0.00487012987013002*G0_1_0_4_1_5 + 0.00224025974025981*G0_1_0_4_2_0 + 0.000487012987013004*G0_1_0_4_2_1 - 0.00267857142857154*G0_1_0_4_2_2 - 0.00487012987013003*G0_1_0_4_2_3 - 0.00857142857142887*G0_1_0_4_2_4 - 0.00428571428571442*G0_1_0_4_2_5 - 0.013636363636364*G0_1_0_4_3_0 - 0.010714285714286*G0_1_0_4_3_1 - 0.00487012987013003*G0_1_0_4_3_2 + 0.0958441558441589*G0_1_0_4_3_3 + 0.0389610389610402*G0_1_0_4_3_4 + 0.035844155844157*G0_1_0_4_3_5 - 0.0062337662337664*G0_1_0_4_4_0 - 0.00584415584415602*G0_1_0_4_4_1 - 0.00857142857142887*G0_1_0_4_4_2 + 0.0389610389610402*G0_1_0_4_4_3 + 0.0202597402597409*G0_1_0_4_4_5 - 0.00720779220779243*G0_1_0_4_5_0 - 0.00487012987013002*G0_1_0_4_5_1 - 0.00428571428571442*G0_1_0_4_5_2 + 0.035844155844157*G0_1_0_4_5_3 + 0.0202597402597409*G0_1_0_4_5_4 + 0.011688311688312*G0_1_0_4_5_5 + 0.000681818181818196*G0_1_0_5_0_0 + 0.000974025974026004*G0_1_0_5_0_1 + 0.00165584415584421*G0_1_0_5_0_2 - 0.0130519480519485*G0_1_0_5_0_3 - 0.00720779220779243*G0_1_0_5_0_4 - 0.00876623376623409*G0_1_0_5_0_5 + 0.000974025974026004*G0_1_0_5_1_0 + 0.0204545454545462*G0_1_0_5_1_1 - 0.00048701298701301*G0_1_0_5_1_2 - 0.00389610389610399*G0_1_0_5_1_3 - 0.00487012987013002*G0_1_0_5_1_4 + 0.00389610389610407*G0_1_0_5_1_5 + 0.00165584415584421*G0_1_0_5_2_0 - 0.00048701298701301*G0_1_0_5_2_1 + 0.00165584415584421*G0_1_0_5_2_2 - 0.00720779220779244*G0_1_0_5_2_3 - 0.00428571428571442*G0_1_0_5_2_4 - 0.00097402597402599*G0_1_0_5_2_5 - 0.0130519480519485*G0_1_0_5_3_0 - 0.00389610389610399*G0_1_0_5_3_1 - 0.00720779220779244*G0_1_0_5_3_2 + 0.0888311688311718*G0_1_0_5_3_3 + 0.035844155844157*G0_1_0_5_3_4 + 0.0280519480519489*G0_1_0_5_3_5 - 0.00720779220779243*G0_1_0_5_4_0 - 0.00487012987013002*G0_1_0_5_4_1 - 0.00428571428571442*G0_1_0_5_4_2 + 0.035844155844157*G0_1_0_5_4_3 + 0.0202597402597409*G0_1_0_5_4_4 + 0.011688311688312*G0_1_0_5_4_5 - 0.00876623376623409*G0_1_0_5_5_0 + 0.00389610389610407*G0_1_0_5_5_1 - 0.000974025974025989*G0_1_0_5_5_2 + 0.0280519480519489*G0_1_0_5_5_3 + 0.011688311688312*G0_1_0_5_5_4 - 0.0981818181818218*G0_1_0_5_5_5; + A[68] = -A[48] + 0.0361972402597415*G0_1_0_0_0_0 - 0.00047483766233767*G0_1_0_0_0_1 - 0.00104707792207796*G0_1_0_0_0_2 + 0.0015097402597403*G0_1_0_0_0_3 + 0.00345779220779232*G0_1_0_0_0_4 + 0.00214285714285718*G0_1_0_0_0_5 - 0.000474837662337669*G0_1_0_0_1_0 - 0.00631899350649372*G0_1_0_0_1_1 - 0.000109577922077926*G0_1_0_0_1_2 + 0.0012175324675325*G0_1_0_0_1_3 + 0.00170454545454551*G0_1_0_0_1_4 + 0.00116883116883122*G0_1_0_0_1_5 - 0.00104707792207796*G0_1_0_0_2_0 - 0.000109577922077926*G0_1_0_0_2_1 - 0.000608766233766259*G0_1_0_0_2_2 + 0.000730519480519502*G0_1_0_0_2_3 + 0.00243506493506501*G0_1_0_0_2_4 + 0.00141233766233771*G0_1_0_0_2_5 + 0.0015097402597403*G0_1_0_0_3_0 + 0.0012175324675325*G0_1_0_0_3_1 + 0.000730519480519502*G0_1_0_0_3_2 - 0.00564935064935081*G0_1_0_0_3_3 - 0.00642857142857162*G0_1_0_0_3_4 - 0.00584415584415603*G0_1_0_0_3_5 + 0.00345779220779232*G0_1_0_0_4_0 + 0.00170454545454551*G0_1_0_0_4_1 + 0.00243506493506501*G0_1_0_0_4_2 - 0.00642857142857162*G0_1_0_0_4_3 - 0.0142207792207797*G0_1_0_0_4_4 - 0.00623376623376644*G0_1_0_0_4_5 + 0.00214285714285718*G0_1_0_0_5_0 + 0.00116883116883122*G0_1_0_0_5_1 + 0.00141233766233771*G0_1_0_0_5_2 - 0.00584415584415603*G0_1_0_0_5_3 - 0.00623376623376644*G0_1_0_0_5_4 - 0.0167532467532474*G0_1_0_0_5_5 - 0.00047483766233767*G0_1_0_1_0_0 - 0.00631899350649372*G0_1_0_1_0_1 - 0.000109577922077926*G0_1_0_1_0_2 + 0.0012175324675325*G0_1_0_1_0_3 + 0.00170454545454551*G0_1_0_1_0_4 + 0.00116883116883122*G0_1_0_1_0_5 - 0.00631899350649372*G0_1_0_1_1_0 + 0.0955154220779253*G0_1_0_1_1_1 - 0.00340909090909102*G0_1_0_1_1_2 + 0.0129058441558446*G0_1_0_1_1_3 + 0.0019967532467533*G0_1_0_1_1_4 + 0.0238636363636372*G0_1_0_1_1_5 - 0.000109577922077926*G0_1_0_1_2_0 - 0.00340909090909102*G0_1_0_1_2_1 - 0.000121753246753256*G0_1_0_1_2_2 + 0.00194805194805202*G0_1_0_1_2_3 + 0.000730519480519504*G0_1_0_1_2_4 - 0.000243506493506505*G0_1_0_1_2_5 + 0.0012175324675325*G0_1_0_1_3_0 + 0.0129058441558446*G0_1_0_1_3_1 + 0.00194805194805202*G0_1_0_1_3_2 - 0.017337662337663*G0_1_0_1_3_3 - 0.00642857142857163*G0_1_0_1_3_4 - 0.001948051948052*G0_1_0_1_3_5 + 0.00170454545454551*G0_1_0_1_4_0 + 0.0019967532467533*G0_1_0_1_4_1 + 0.000730519480519504*G0_1_0_1_4_2 - 0.00642857142857164*G0_1_0_1_4_3 - 0.00253246753246761*G0_1_0_1_4_4 - 0.00350649350649362*G0_1_0_1_4_5 + 0.00116883116883122*G0_1_0_1_5_0 + 0.0238636363636372*G0_1_0_1_5_1 - 0.000243506493506505*G0_1_0_1_5_2 - 0.001948051948052*G0_1_0_1_5_3 - 0.00350649350649362*G0_1_0_1_5_4 + 0.0144155844155849*G0_1_0_1_5_5 - 0.00104707792207796*G0_1_0_2_0_0 - 0.000109577922077926*G0_1_0_2_0_1 - 0.000608766233766259*G0_1_0_2_0_2 + 0.000730519480519502*G0_1_0_2_0_3 + 0.00243506493506501*G0_1_0_2_0_4 + 0.00141233766233771*G0_1_0_2_0_5 - 0.000109577922077926*G0_1_0_2_1_0 - 0.00340909090909102*G0_1_0_2_1_1 - 0.000121753246753256*G0_1_0_2_1_2 + 0.00194805194805202*G0_1_0_2_1_3 + 0.000730519480519504*G0_1_0_2_1_4 - 0.000243506493506505*G0_1_0_2_1_5 - 0.000608766233766259*G0_1_0_2_2_0 - 0.000121753246753256*G0_1_0_2_2_1 - 0.000730519480519493*G0_1_0_2_2_3 + 0.000730519480519529*G0_1_0_2_2_4 + 0.000730519480519503*G0_1_0_2_2_5 + 0.000730519480519502*G0_1_0_2_3_0 + 0.00194805194805202*G0_1_0_2_3_1 - 0.000730519480519493*G0_1_0_2_3_2 + 0.00389610389610406*G0_1_0_2_3_3 - 0.00292207792207801*G0_1_0_2_3_4 - 0.00292207792207801*G0_1_0_2_3_5 + 0.00243506493506501*G0_1_0_2_4_0 + 0.000730519480519504*G0_1_0_2_4_1 + 0.000730519480519529*G0_1_0_2_4_2 - 0.00292207792207801*G0_1_0_2_4_3 + 0.00194805194805202*G0_1_0_2_4_4 - 0.00292207792207801*G0_1_0_2_4_5 + 0.00141233766233771*G0_1_0_2_5_0 - 0.000243506493506505*G0_1_0_2_5_1 + 0.000730519480519503*G0_1_0_2_5_2 - 0.00292207792207801*G0_1_0_2_5_3 - 0.00292207792207801*G0_1_0_2_5_4 + 0.00233766233766244*G0_1_0_2_5_5 + 0.0015097402597403*G0_1_0_3_0_0 + 0.0012175324675325*G0_1_0_3_0_1 + 0.000730519480519502*G0_1_0_3_0_2 - 0.00564935064935081*G0_1_0_3_0_3 - 0.00642857142857162*G0_1_0_3_0_4 - 0.00584415584415603*G0_1_0_3_0_5 + 0.0012175324675325*G0_1_0_3_1_0 + 0.0129058441558446*G0_1_0_3_1_1 + 0.00194805194805202*G0_1_0_3_1_2 - 0.017337662337663*G0_1_0_3_1_3 - 0.00642857142857164*G0_1_0_3_1_4 - 0.001948051948052*G0_1_0_3_1_5 + 0.000730519480519502*G0_1_0_3_2_0 + 0.00194805194805202*G0_1_0_3_2_1 - 0.000730519480519493*G0_1_0_3_2_2 + 0.00389610389610406*G0_1_0_3_2_3 - 0.00292207792207801*G0_1_0_3_2_4 - 0.00292207792207801*G0_1_0_3_2_5 - 0.00564935064935081*G0_1_0_3_3_0 - 0.017337662337663*G0_1_0_3_3_1 + 0.00389610389610407*G0_1_0_3_3_2 - 0.0350649350649366*G0_1_0_3_3_3 + 0.0241558441558449*G0_1_0_3_3_4 + 0.0171428571428576*G0_1_0_3_3_5 - 0.00642857142857162*G0_1_0_3_4_0 - 0.00642857142857164*G0_1_0_3_4_1 - 0.00292207792207801*G0_1_0_3_4_2 + 0.0241558441558449*G0_1_0_3_4_3 + 0.0179220779220785*G0_1_0_3_4_4 + 0.0187012987012993*G0_1_0_3_4_5 - 0.00584415584415603*G0_1_0_3_5_0 - 0.001948051948052*G0_1_0_3_5_1 - 0.00292207792207801*G0_1_0_3_5_2 + 0.0171428571428576*G0_1_0_3_5_3 + 0.0187012987012993*G0_1_0_3_5_4 + 0.0070129870129872*G0_1_0_3_5_5 + 0.00345779220779232*G0_1_0_4_0_0 + 0.00170454545454551*G0_1_0_4_0_1 + 0.00243506493506501*G0_1_0_4_0_2 - 0.00642857142857162*G0_1_0_4_0_3 - 0.0142207792207797*G0_1_0_4_0_4 - 0.00623376623376644*G0_1_0_4_0_5 + 0.00170454545454551*G0_1_0_4_1_0 + 0.0019967532467533*G0_1_0_4_1_1 + 0.000730519480519504*G0_1_0_4_1_2 - 0.00642857142857164*G0_1_0_4_1_3 - 0.00253246753246761*G0_1_0_4_1_4 - 0.00350649350649362*G0_1_0_4_1_5 + 0.00243506493506501*G0_1_0_4_2_0 + 0.000730519480519504*G0_1_0_4_2_1 + 0.000730519480519529*G0_1_0_4_2_2 - 0.00292207792207801*G0_1_0_4_2_3 + 0.00194805194805202*G0_1_0_4_2_4 - 0.00292207792207801*G0_1_0_4_2_5 - 0.00642857142857162*G0_1_0_4_3_0 - 0.00642857142857164*G0_1_0_4_3_1 - 0.00292207792207801*G0_1_0_4_3_2 + 0.0241558441558449*G0_1_0_4_3_3 + 0.0179220779220785*G0_1_0_4_3_4 + 0.0187012987012993*G0_1_0_4_3_5 - 0.0142207792207797*G0_1_0_4_4_0 - 0.00253246753246761*G0_1_0_4_4_1 + 0.00194805194805202*G0_1_0_4_4_2 + 0.0179220779220785*G0_1_0_4_4_3 - 0.0911688311688342*G0_1_0_4_4_4 + 0.0109090909090912*G0_1_0_4_4_5 - 0.00623376623376644*G0_1_0_4_5_0 - 0.00350649350649362*G0_1_0_4_5_1 - 0.00292207792207801*G0_1_0_4_5_2 + 0.0187012987012993*G0_1_0_4_5_3 + 0.0109090909090912*G0_1_0_4_5_4 + 0.00233766233766237*G0_1_0_4_5_5 + 0.00214285714285718*G0_1_0_5_0_0 + 0.00116883116883122*G0_1_0_5_0_1 + 0.00141233766233771*G0_1_0_5_0_2 - 0.00584415584415603*G0_1_0_5_0_3 - 0.00623376623376644*G0_1_0_5_0_4 - 0.0167532467532474*G0_1_0_5_0_5 + 0.00116883116883122*G0_1_0_5_1_0 + 0.0238636363636372*G0_1_0_5_1_1 - 0.000243506493506505*G0_1_0_5_1_2 - 0.001948051948052*G0_1_0_5_1_3 - 0.00350649350649362*G0_1_0_5_1_4 + 0.0144155844155849*G0_1_0_5_1_5 + 0.00141233766233771*G0_1_0_5_2_0 - 0.000243506493506505*G0_1_0_5_2_1 + 0.000730519480519503*G0_1_0_5_2_2 - 0.00292207792207801*G0_1_0_5_2_3 - 0.00292207792207801*G0_1_0_5_2_4 + 0.00233766233766244*G0_1_0_5_2_5 - 0.00584415584415603*G0_1_0_5_3_0 - 0.001948051948052*G0_1_0_5_3_1 - 0.00292207792207801*G0_1_0_5_3_2 + 0.0171428571428576*G0_1_0_5_3_3 + 0.0187012987012993*G0_1_0_5_3_4 + 0.0070129870129872*G0_1_0_5_3_5 - 0.00623376623376644*G0_1_0_5_4_0 - 0.00350649350649362*G0_1_0_5_4_1 - 0.00292207792207801*G0_1_0_5_4_2 + 0.0187012987012993*G0_1_0_5_4_3 + 0.0109090909090912*G0_1_0_5_4_4 + 0.00233766233766237*G0_1_0_5_4_5 - 0.0167532467532474*G0_1_0_5_5_0 + 0.0144155844155849*G0_1_0_5_5_1 + 0.00233766233766244*G0_1_0_5_5_2 + 0.0070129870129872*G0_1_0_5_5_3 + 0.00233766233766237*G0_1_0_5_5_4 - 0.189350649350656*G0_1_0_5_5_5 - 0.00398133116883126*G0_1_1_0_0_0 + 0.00209415584415591*G0_1_1_0_0_1 + 0.000206980519480525*G0_1_1_0_0_2 - 0.000487012987013002*G0_1_1_0_0_3 - 0.000243506493506496*G0_1_1_0_0_4 + 0.00209415584415591*G0_1_1_0_1_0 - 0.0099959415584419*G0_1_1_0_1_1 + 0.000438311688311703*G0_1_1_0_1_2 - 0.00102272727272731*G0_1_1_0_1_3 - 0.00808441558441586*G0_1_1_0_1_5 + 0.000206980519480525*G0_1_1_0_2_0 + 0.000438311688311703*G0_1_1_0_2_1 + 0.000365259740259748*G0_1_1_0_2_2 - 0.00121753246753251*G0_1_1_0_2_3 - 0.000487012987013007*G0_1_1_0_2_4 + 0.0002922077922078*G0_1_1_0_2_5 - 0.000487012987013002*G0_1_1_0_3_0 - 0.00102272727272731*G0_1_1_0_3_1 - 0.00121753246753251*G0_1_1_0_3_2 + 0.00798701298701324*G0_1_1_0_3_3 + 0.000779220779220808*G0_1_1_0_3_4 + 0.000389610389610407*G0_1_1_0_3_5 - 0.000243506493506496*G0_1_1_0_4_0 - 0.000487012987013006*G0_1_1_0_4_2 + 0.000779220779220808*G0_1_1_0_4_3 - 0.00097402597402599*G0_1_1_0_4_4 - 0.000779220779220796*G0_1_1_0_4_5 - 0.00808441558441586*G0_1_1_0_5_1 + 0.0002922077922078*G0_1_1_0_5_2 + 0.000389610389610406*G0_1_1_0_5_3 - 0.000779220779220796*G0_1_1_0_5_4 - 0.0175324675324681*G0_1_1_0_5_5 + 0.00209415584415591*G0_1_1_1_0_0 - 0.0099959415584419*G0_1_1_1_0_1 + 0.000438311688311703*G0_1_1_1_0_2 - 0.00102272727272731*G0_1_1_1_0_3 - 0.00808441558441586*G0_1_1_1_0_5 - 0.0099959415584419*G0_1_1_1_1_0 + 0.119805194805199*G0_1_1_1_1_1 - 0.00451704545454561*G0_1_1_1_1_2 + 0.0155844155844161*G0_1_1_1_1_3 + 0.0020941558441559*G0_1_1_1_1_4 + 0.0457792207792225*G0_1_1_1_1_5 + 0.000438311688311703*G0_1_1_1_2_0 - 0.00451704545454561*G0_1_1_1_2_1 + 0.000243506493506497*G0_1_1_1_2_2 + 0.00146103896103902*G0_1_1_1_2_3 + 0.000243506493506503*G0_1_1_1_2_4 - 0.00228896103896112*G0_1_1_1_2_5 - 0.00102272727272731*G0_1_1_1_3_0 + 0.0155844155844161*G0_1_1_1_3_1 + 0.00146103896103902*G0_1_1_1_3_2 - 0.012467532467533*G0_1_1_1_3_3 - 0.00214285714285722*G0_1_1_1_3_4 + 0.00662337662337686*G0_1_1_1_3_5 + 0.0020941558441559*G0_1_1_1_4_1 + 0.000243506493506503*G0_1_1_1_4_2 - 0.00214285714285722*G0_1_1_1_4_3 - 0.00389610389610403*G0_1_1_1_4_4 + 0.000389610389610393*G0_1_1_1_4_5 - 0.00808441558441586*G0_1_1_1_5_0 + 0.0457792207792225*G0_1_1_1_5_1 - 0.00228896103896112*G0_1_1_1_5_2 + 0.00662337662337685*G0_1_1_1_5_3 + 0.000389610389610393*G0_1_1_1_5_4 + 0.0459740259740276*G0_1_1_1_5_5 + 0.000206980519480525*G0_1_1_2_0_0 + 0.000438311688311703*G0_1_1_2_0_1 + 0.000365259740259748*G0_1_1_2_0_2 - 0.00121753246753251*G0_1_1_2_0_3 - 0.000487012987013006*G0_1_1_2_0_4 + 0.0002922077922078*G0_1_1_2_0_5 + 0.000438311688311703*G0_1_1_2_1_0 - 0.00451704545454561*G0_1_1_2_1_1 + 0.000243506493506497*G0_1_1_2_1_2 + 0.00146103896103902*G0_1_1_2_1_3 + 0.000243506493506503*G0_1_1_2_1_4 - 0.00228896103896112*G0_1_1_2_1_5 + 0.000365259740259748*G0_1_1_2_2_0 + 0.000243506493506497*G0_1_1_2_2_1 - 0.00401785714285719*G0_1_1_2_2_2 - 0.00365259740259752*G0_1_1_2_2_3 - 0.000730519480519487*G0_1_1_2_2_4 - 0.000243506493506503*G0_1_1_2_2_5 - 0.00121753246753251*G0_1_1_2_3_0 + 0.00146103896103902*G0_1_1_2_3_1 - 0.00365259740259752*G0_1_1_2_3_2 + 0.0146103896103901*G0_1_1_2_3_3 + 0.00194805194805202*G0_1_1_2_3_4 + 0.00292207792207803*G0_1_1_2_3_5 - 0.000487012987013006*G0_1_1_2_4_0 + 0.000243506493506503*G0_1_1_2_4_1 - 0.000730519480519487*G0_1_1_2_4_2 + 0.00194805194805202*G0_1_1_2_4_3 - 0.000974025974026007*G0_1_1_2_4_4 + 0.0002922077922078*G0_1_1_2_5_0 - 0.00228896103896112*G0_1_1_2_5_1 - 0.000243506493506503*G0_1_1_2_5_2 + 0.00292207792207803*G0_1_1_2_5_3 - 0.00389610389610403*G0_1_1_2_5_5 - 0.000487012987013002*G0_1_1_3_0_0 - 0.00102272727272731*G0_1_1_3_0_1 - 0.00121753246753251*G0_1_1_3_0_2 + 0.00798701298701324*G0_1_1_3_0_3 + 0.000779220779220808*G0_1_1_3_0_4 + 0.000389610389610406*G0_1_1_3_0_5 - 0.00102272727272731*G0_1_1_3_1_0 + 0.0155844155844161*G0_1_1_3_1_1 + 0.00146103896103902*G0_1_1_3_1_2 - 0.012467532467533*G0_1_1_3_1_3 - 0.00214285714285722*G0_1_1_3_1_4 + 0.00662337662337686*G0_1_1_3_1_5 - 0.00121753246753251*G0_1_1_3_2_0 + 0.00146103896103902*G0_1_1_3_2_1 - 0.00365259740259752*G0_1_1_3_2_2 + 0.0146103896103901*G0_1_1_3_2_3 + 0.00194805194805202*G0_1_1_3_2_4 + 0.00292207792207803*G0_1_1_3_2_5 + 0.00798701298701324*G0_1_1_3_3_0 - 0.012467532467533*G0_1_1_3_3_1 + 0.0146103896103901*G0_1_1_3_3_2 - 0.130909090909096*G0_1_1_3_3_3 - 0.0116883116883121*G0_1_1_3_3_4 - 0.0218181818181826*G0_1_1_3_3_5 + 0.000779220779220808*G0_1_1_3_4_0 - 0.00214285714285722*G0_1_1_3_4_1 + 0.00194805194805202*G0_1_1_3_4_2 - 0.0116883116883121*G0_1_1_3_4_3 + 0.00623376623376644*G0_1_1_3_4_4 - 0.00155844155844162*G0_1_1_3_4_5 + 0.000389610389610406*G0_1_1_3_5_0 + 0.00662337662337685*G0_1_1_3_5_1 + 0.00292207792207803*G0_1_1_3_5_2 - 0.0218181818181826*G0_1_1_3_5_3 - 0.00155844155844162*G0_1_1_3_5_4 + 0.00701298701298724*G0_1_1_3_5_5 - 0.000243506493506496*G0_1_1_4_0_0 - 0.000487012987013006*G0_1_1_4_0_2 + 0.000779220779220808*G0_1_1_4_0_3 - 0.00097402597402599*G0_1_1_4_0_4 - 0.000779220779220796*G0_1_1_4_0_5 + 0.0020941558441559*G0_1_1_4_1_1 + 0.000243506493506503*G0_1_1_4_1_2 - 0.00214285714285722*G0_1_1_4_1_3 - 0.00389610389610403*G0_1_1_4_1_4 + 0.000389610389610393*G0_1_1_4_1_5 - 0.000487012987013007*G0_1_1_4_2_0 + 0.000243506493506503*G0_1_1_4_2_1 - 0.000730519480519487*G0_1_1_4_2_2 + 0.00194805194805202*G0_1_1_4_2_3 - 0.000974025974026008*G0_1_1_4_2_4 + 0.000779220779220808*G0_1_1_4_3_0 - 0.00214285714285722*G0_1_1_4_3_1 + 0.00194805194805202*G0_1_1_4_3_2 - 0.0116883116883121*G0_1_1_4_3_3 + 0.00623376623376644*G0_1_1_4_3_4 - 0.00155844155844162*G0_1_1_4_3_5 - 0.00097402597402599*G0_1_1_4_4_0 - 0.00389610389610403*G0_1_1_4_4_1 - 0.000974025974026008*G0_1_1_4_4_2 + 0.00623376623376643*G0_1_1_4_4_3 + 0.0303896103896114*G0_1_1_4_4_4 + 0.00779220779220806*G0_1_1_4_4_5 - 0.000779220779220796*G0_1_1_4_5_0 + 0.000389610389610393*G0_1_1_4_5_1 - 0.00155844155844162*G0_1_1_4_5_3 + 0.00779220779220806*G0_1_1_4_5_4 + 0.00701298701298724*G0_1_1_4_5_5 - 0.00808441558441586*G0_1_1_5_0_1 + 0.0002922077922078*G0_1_1_5_0_2 + 0.000389610389610406*G0_1_1_5_0_3 - 0.000779220779220795*G0_1_1_5_0_4 - 0.0175324675324681*G0_1_1_5_0_5 - 0.00808441558441586*G0_1_1_5_1_0 + 0.0457792207792225*G0_1_1_5_1_1 - 0.00228896103896112*G0_1_1_5_1_2 + 0.00662337662337685*G0_1_1_5_1_3 + 0.000389610389610393*G0_1_1_5_1_4 + 0.0459740259740276*G0_1_1_5_1_5 + 0.0002922077922078*G0_1_1_5_2_0 - 0.00228896103896112*G0_1_1_5_2_1 - 0.000243506493506503*G0_1_1_5_2_2 + 0.00292207792207803*G0_1_1_5_2_3 - 0.00389610389610403*G0_1_1_5_2_5 + 0.000389610389610406*G0_1_1_5_3_0 + 0.00662337662337685*G0_1_1_5_3_1 + 0.00292207792207803*G0_1_1_5_3_2 - 0.0218181818181826*G0_1_1_5_3_3 - 0.00155844155844162*G0_1_1_5_3_4 + 0.00701298701298724*G0_1_1_5_3_5 - 0.000779220779220796*G0_1_1_5_4_0 + 0.000389610389610393*G0_1_1_5_4_1 - 0.00155844155844162*G0_1_1_5_4_3 + 0.00779220779220806*G0_1_1_5_4_4 + 0.00701298701298724*G0_1_1_5_4_5 - 0.0175324675324681*G0_1_1_5_5_0 + 0.0459740259740276*G0_1_1_5_5_1 - 0.00389610389610403*G0_1_1_5_5_2 + 0.00701298701298724*G0_1_1_5_5_3 + 0.00701298701298724*G0_1_1_5_5_4 + 0.128571428571433*G0_1_1_5_5_5; + A[63] = -A[43] + 0.000255681818181874*G0_1_0_0_0_0 - 0.000572240259740278*G0_1_0_0_0_1 + 0.00487012987013001*G0_1_0_0_0_3 + 0.000681818181818204*G0_1_0_0_0_4 + 0.00199675324675332*G0_1_0_0_0_5 - 0.000572240259740278*G0_1_0_0_1_0 + 0.000231331168831177*G0_1_0_0_1_1 + 0.000121753246753251*G0_1_0_0_1_2 + 0.001948051948052*G0_1_0_0_1_3 + 0.00165584415584421*G0_1_0_0_1_4 + 0.00224025974025981*G0_1_0_0_1_5 + 0.000121753246753251*G0_1_0_0_2_1 - 0.00547889610389629*G0_1_0_0_2_2 + 0.00243506493506501*G0_1_0_0_2_3 + 0.000974025974026*G0_1_0_0_2_4 + 0.00194805194805201*G0_1_0_0_2_5 + 0.00487012987013001*G0_1_0_0_3_0 + 0.001948051948052*G0_1_0_0_3_1 + 0.00243506493506501*G0_1_0_0_3_2 - 0.0372077922077934*G0_1_0_0_3_3 - 0.0130519480519485*G0_1_0_0_3_4 - 0.0136363636363641*G0_1_0_0_3_5 + 0.000681818181818204*G0_1_0_0_4_0 + 0.00165584415584421*G0_1_0_0_4_1 + 0.000974025974026*G0_1_0_0_4_2 - 0.0130519480519485*G0_1_0_0_4_3 - 0.00876623376623406*G0_1_0_0_4_4 - 0.00720779220779243*G0_1_0_0_4_5 + 0.00199675324675332*G0_1_0_0_5_0 + 0.00224025974025981*G0_1_0_0_5_1 + 0.00194805194805201*G0_1_0_0_5_2 - 0.0136363636363641*G0_1_0_0_5_3 - 0.00720779220779243*G0_1_0_0_5_4 - 0.00623376623376644*G0_1_0_0_5_5 - 0.000572240259740278*G0_1_0_1_0_0 + 0.000231331168831177*G0_1_0_1_0_1 + 0.000121753246753251*G0_1_0_1_0_2 + 0.001948051948052*G0_1_0_1_0_3 + 0.00165584415584421*G0_1_0_1_0_4 + 0.00224025974025981*G0_1_0_1_0_5 + 0.000231331168831177*G0_1_0_1_1_0 - 0.0100446428571432*G0_1_0_1_1_1 + 0.00681818181818207*G0_1_0_1_1_3 + 0.00165584415584421*G0_1_0_1_1_4 - 0.00267857142857152*G0_1_0_1_1_5 + 0.000121753246753251*G0_1_0_1_2_0 - 0.00328733766233777*G0_1_0_1_2_2 - 0.00487012987013005*G0_1_0_1_2_3 - 0.000487012987013006*G0_1_0_1_2_4 + 0.000487012987012999*G0_1_0_1_2_5 + 0.001948051948052*G0_1_0_1_3_0 + 0.00681818181818207*G0_1_0_1_3_1 - 0.00487012987013005*G0_1_0_1_3_2 + 0.00175324675324692*G0_1_0_1_3_3 - 0.00720779220779242*G0_1_0_1_3_4 - 0.00487012987013001*G0_1_0_1_3_5 + 0.00165584415584421*G0_1_0_1_4_0 + 0.00165584415584421*G0_1_0_1_4_1 - 0.000487012987013006*G0_1_0_1_4_2 - 0.00720779220779242*G0_1_0_1_4_3 - 0.000974025974025996*G0_1_0_1_4_4 - 0.00428571428571442*G0_1_0_1_4_5 + 0.00224025974025981*G0_1_0_1_5_0 - 0.00267857142857152*G0_1_0_1_5_1 + 0.000487012987012999*G0_1_0_1_5_2 - 0.00487012987013001*G0_1_0_1_5_3 - 0.00428571428571442*G0_1_0_1_5_4 - 0.00857142857142885*G0_1_0_1_5_5 + 0.000121753246753251*G0_1_0_2_0_1 - 0.00547889610389629*G0_1_0_2_0_2 + 0.00243506493506501*G0_1_0_2_0_3 + 0.000974025974026*G0_1_0_2_0_4 + 0.00194805194805201*G0_1_0_2_0_5 + 0.000121753246753251*G0_1_0_2_1_0 - 0.00328733766233777*G0_1_0_2_1_2 - 0.00487012987013005*G0_1_0_2_1_3 - 0.000487012987013007*G0_1_0_2_1_4 + 0.000487012987012999*G0_1_0_2_1_5 - 0.00547889610389629*G0_1_0_2_2_0 - 0.00328733766233777*G0_1_0_2_2_1 + 0.0854707792207821*G0_1_0_2_2_2 + 0.0204545454545462*G0_1_0_2_2_3 + 0.0204545454545462*G0_1_0_2_2_4 + 0.00292207792207804*G0_1_0_2_2_5 + 0.00243506493506501*G0_1_0_2_3_0 - 0.00487012987013005*G0_1_0_2_3_1 + 0.0204545454545462*G0_1_0_2_3_2 - 0.0194805194805201*G0_1_0_2_3_3 - 0.00389610389610401*G0_1_0_2_3_4 - 0.0107142857142861*G0_1_0_2_3_5 + 0.000974025974026*G0_1_0_2_4_0 - 0.000487012987013007*G0_1_0_2_4_1 + 0.0204545454545462*G0_1_0_2_4_2 - 0.00389610389610401*G0_1_0_2_4_3 + 0.00389610389610406*G0_1_0_2_4_4 - 0.00487012987013003*G0_1_0_2_4_5 + 0.00194805194805201*G0_1_0_2_5_0 + 0.000487012987012999*G0_1_0_2_5_1 + 0.00292207792207804*G0_1_0_2_5_2 - 0.0107142857142861*G0_1_0_2_5_3 - 0.00487012987013003*G0_1_0_2_5_4 - 0.00584415584415604*G0_1_0_2_5_5 + 0.00487012987013001*G0_1_0_3_0_0 + 0.001948051948052*G0_1_0_3_0_1 + 0.00243506493506501*G0_1_0_3_0_2 - 0.0372077922077934*G0_1_0_3_0_3 - 0.0130519480519485*G0_1_0_3_0_4 - 0.0136363636363641*G0_1_0_3_0_5 + 0.001948051948052*G0_1_0_3_1_0 + 0.00681818181818207*G0_1_0_3_1_1 - 0.00487012987013005*G0_1_0_3_1_2 + 0.00175324675324692*G0_1_0_3_1_3 - 0.00720779220779242*G0_1_0_3_1_4 - 0.00487012987013001*G0_1_0_3_1_5 + 0.00243506493506501*G0_1_0_3_2_0 - 0.00487012987013005*G0_1_0_3_2_1 + 0.0204545454545462*G0_1_0_3_2_2 - 0.0194805194805201*G0_1_0_3_2_3 - 0.00389610389610401*G0_1_0_3_2_4 - 0.0107142857142861*G0_1_0_3_2_5 - 0.0372077922077934*G0_1_0_3_3_0 + 0.00175324675324692*G0_1_0_3_3_1 - 0.0194805194805201*G0_1_0_3_3_2 + 0.448831168831184*G0_1_0_3_3_3 + 0.0888311688311717*G0_1_0_3_3_4 + 0.0958441558441591*G0_1_0_3_3_5 - 0.0130519480519485*G0_1_0_3_4_0 - 0.00720779220779242*G0_1_0_3_4_1 - 0.00389610389610401*G0_1_0_3_4_2 + 0.0888311688311717*G0_1_0_3_4_3 + 0.0280519480519489*G0_1_0_3_4_4 + 0.035844155844157*G0_1_0_3_4_5 - 0.0136363636363641*G0_1_0_3_5_0 - 0.00487012987013001*G0_1_0_3_5_1 - 0.0107142857142861*G0_1_0_3_5_2 + 0.0958441558441591*G0_1_0_3_5_3 + 0.035844155844157*G0_1_0_3_5_4 + 0.0389610389610403*G0_1_0_3_5_5 + 0.000681818181818204*G0_1_0_4_0_0 + 0.00165584415584421*G0_1_0_4_0_1 + 0.000974025974026*G0_1_0_4_0_2 - 0.0130519480519485*G0_1_0_4_0_3 - 0.00876623376623406*G0_1_0_4_0_4 - 0.00720779220779243*G0_1_0_4_0_5 + 0.00165584415584421*G0_1_0_4_1_0 + 0.00165584415584421*G0_1_0_4_1_1 - 0.000487012987013006*G0_1_0_4_1_2 - 0.00720779220779242*G0_1_0_4_1_3 - 0.000974025974025997*G0_1_0_4_1_4 - 0.00428571428571442*G0_1_0_4_1_5 + 0.000974025974026*G0_1_0_4_2_0 - 0.000487012987013007*G0_1_0_4_2_1 + 0.0204545454545462*G0_1_0_4_2_2 - 0.00389610389610401*G0_1_0_4_2_3 + 0.00389610389610406*G0_1_0_4_2_4 - 0.00487012987013003*G0_1_0_4_2_5 - 0.0130519480519485*G0_1_0_4_3_0 - 0.00720779220779242*G0_1_0_4_3_1 - 0.00389610389610401*G0_1_0_4_3_2 + 0.0888311688311717*G0_1_0_4_3_3 + 0.0280519480519489*G0_1_0_4_3_4 + 0.035844155844157*G0_1_0_4_3_5 - 0.00876623376623406*G0_1_0_4_4_0 - 0.000974025974025998*G0_1_0_4_4_1 + 0.00389610389610406*G0_1_0_4_4_2 + 0.0280519480519489*G0_1_0_4_4_3 - 0.0981818181818213*G0_1_0_4_4_4 + 0.011688311688312*G0_1_0_4_4_5 - 0.00720779220779243*G0_1_0_4_5_0 - 0.00428571428571442*G0_1_0_4_5_1 - 0.00487012987013002*G0_1_0_4_5_2 + 0.035844155844157*G0_1_0_4_5_3 + 0.011688311688312*G0_1_0_4_5_4 + 0.0202597402597409*G0_1_0_4_5_5 + 0.00199675324675332*G0_1_0_5_0_0 + 0.00224025974025981*G0_1_0_5_0_1 + 0.00194805194805201*G0_1_0_5_0_2 - 0.0136363636363641*G0_1_0_5_0_3 - 0.00720779220779243*G0_1_0_5_0_4 - 0.00623376623376644*G0_1_0_5_0_5 + 0.00224025974025981*G0_1_0_5_1_0 - 0.00267857142857152*G0_1_0_5_1_1 + 0.000487012987012999*G0_1_0_5_1_2 - 0.00487012987013001*G0_1_0_5_1_3 - 0.00428571428571442*G0_1_0_5_1_4 - 0.00857142857142885*G0_1_0_5_1_5 + 0.00194805194805201*G0_1_0_5_2_0 + 0.000487012987012999*G0_1_0_5_2_1 + 0.00292207792207804*G0_1_0_5_2_2 - 0.0107142857142861*G0_1_0_5_2_3 - 0.00487012987013003*G0_1_0_5_2_4 - 0.00584415584415604*G0_1_0_5_2_5 - 0.0136363636363641*G0_1_0_5_3_0 - 0.00487012987013001*G0_1_0_5_3_1 - 0.0107142857142861*G0_1_0_5_3_2 + 0.0958441558441591*G0_1_0_5_3_3 + 0.035844155844157*G0_1_0_5_3_4 + 0.0389610389610403*G0_1_0_5_3_5 - 0.00720779220779243*G0_1_0_5_4_0 - 0.00428571428571442*G0_1_0_5_4_1 - 0.00487012987013003*G0_1_0_5_4_2 + 0.035844155844157*G0_1_0_5_4_3 + 0.011688311688312*G0_1_0_5_4_4 + 0.0202597402597409*G0_1_0_5_4_5 - 0.00623376623376644*G0_1_0_5_5_0 - 0.00857142857142885*G0_1_0_5_5_1 - 0.00584415584415604*G0_1_0_5_5_2 + 0.0389610389610403*G0_1_0_5_5_3 + 0.0202597402597409*G0_1_0_5_5_4 + 0.00398133116883126*G0_1_1_0_0_0 - 0.00209415584415591*G0_1_1_0_0_1 - 0.000206980519480525*G0_1_1_0_0_2 + 0.000487012987013003*G0_1_1_0_0_3 + 0.000243506493506497*G0_1_1_0_0_4 - 0.00209415584415591*G0_1_1_0_1_0 + 0.00999594155844189*G0_1_1_0_1_1 - 0.000438311688311703*G0_1_1_0_1_2 + 0.00102272727272731*G0_1_1_0_1_3 + 0.00808441558441586*G0_1_1_0_1_5 - 0.000206980519480525*G0_1_1_0_2_0 - 0.000438311688311703*G0_1_1_0_2_1 - 0.000365259740259749*G0_1_1_0_2_2 + 0.00121753246753251*G0_1_1_0_2_3 + 0.000487012987013006*G0_1_1_0_2_4 - 0.000292207792207799*G0_1_1_0_2_5 + 0.000487012987013003*G0_1_1_0_3_0 + 0.00102272727272731*G0_1_1_0_3_1 + 0.00121753246753251*G0_1_1_0_3_2 - 0.00798701298701325*G0_1_1_0_3_3 - 0.000779220779220812*G0_1_1_0_3_4 - 0.00038961038961041*G0_1_1_0_3_5 + 0.000243506493506497*G0_1_1_0_4_0 + 0.000487012987013006*G0_1_1_0_4_2 - 0.000779220779220811*G0_1_1_0_4_3 + 0.000974025974025991*G0_1_1_0_4_4 + 0.000779220779220793*G0_1_1_0_4_5 + 0.00808441558441586*G0_1_1_0_5_1 - 0.000292207792207799*G0_1_1_0_5_2 - 0.00038961038961041*G0_1_1_0_5_3 + 0.000779220779220793*G0_1_1_0_5_4 + 0.0175324675324681*G0_1_1_0_5_5 - 0.00209415584415591*G0_1_1_1_0_0 + 0.00999594155844189*G0_1_1_1_0_1 - 0.000438311688311703*G0_1_1_1_0_2 + 0.00102272727272731*G0_1_1_1_0_3 + 0.00808441558441586*G0_1_1_1_0_5 + 0.0099959415584419*G0_1_1_1_1_0 - 0.119805194805199*G0_1_1_1_1_1 + 0.00451704545454561*G0_1_1_1_1_2 - 0.0155844155844161*G0_1_1_1_1_3 - 0.0020941558441559*G0_1_1_1_1_4 - 0.0457792207792224*G0_1_1_1_1_5 - 0.000438311688311703*G0_1_1_1_2_0 + 0.00451704545454561*G0_1_1_1_2_1 - 0.000243506493506497*G0_1_1_1_2_2 - 0.00146103896103902*G0_1_1_1_2_3 - 0.000243506493506502*G0_1_1_1_2_4 + 0.00228896103896112*G0_1_1_1_2_5 + 0.00102272727272731*G0_1_1_1_3_0 - 0.0155844155844161*G0_1_1_1_3_1 - 0.00146103896103902*G0_1_1_1_3_2 + 0.012467532467533*G0_1_1_1_3_3 + 0.00214285714285722*G0_1_1_1_3_4 - 0.00662337662337686*G0_1_1_1_3_5 - 0.0020941558441559*G0_1_1_1_4_1 - 0.000243506493506502*G0_1_1_1_4_2 + 0.00214285714285722*G0_1_1_1_4_3 + 0.00389610389610402*G0_1_1_1_4_4 - 0.000389610389610397*G0_1_1_1_4_5 + 0.00808441558441586*G0_1_1_1_5_0 - 0.0457792207792224*G0_1_1_1_5_1 + 0.00228896103896112*G0_1_1_1_5_2 - 0.00662337662337686*G0_1_1_1_5_3 - 0.000389610389610397*G0_1_1_1_5_4 - 0.0459740259740276*G0_1_1_1_5_5 - 0.000206980519480525*G0_1_1_2_0_0 - 0.000438311688311703*G0_1_1_2_0_1 - 0.000365259740259749*G0_1_1_2_0_2 + 0.00121753246753251*G0_1_1_2_0_3 + 0.000487012987013006*G0_1_1_2_0_4 - 0.000292207792207799*G0_1_1_2_0_5 - 0.000438311688311703*G0_1_1_2_1_0 + 0.00451704545454561*G0_1_1_2_1_1 - 0.000243506493506497*G0_1_1_2_1_2 - 0.00146103896103902*G0_1_1_2_1_3 - 0.000243506493506502*G0_1_1_2_1_4 + 0.00228896103896112*G0_1_1_2_1_5 - 0.000365259740259749*G0_1_1_2_2_0 - 0.000243506493506497*G0_1_1_2_2_1 + 0.0040178571428572*G0_1_1_2_2_2 + 0.00365259740259752*G0_1_1_2_2_3 + 0.000730519480519491*G0_1_1_2_2_4 + 0.000243506493506504*G0_1_1_2_2_5 + 0.00121753246753251*G0_1_1_2_3_0 - 0.00146103896103902*G0_1_1_2_3_1 + 0.00365259740259752*G0_1_1_2_3_2 - 0.0146103896103901*G0_1_1_2_3_3 - 0.00194805194805202*G0_1_1_2_3_4 - 0.00292207792207803*G0_1_1_2_3_5 + 0.000487012987013006*G0_1_1_2_4_0 - 0.000243506493506502*G0_1_1_2_4_1 + 0.00073051948051949*G0_1_1_2_4_2 - 0.00194805194805202*G0_1_1_2_4_3 + 0.000974025974025999*G0_1_1_2_4_4 - 0.000292207792207799*G0_1_1_2_5_0 + 0.00228896103896112*G0_1_1_2_5_1 + 0.000243506493506504*G0_1_1_2_5_2 - 0.00292207792207803*G0_1_1_2_5_3 + 0.00389610389610403*G0_1_1_2_5_5 + 0.000487012987013003*G0_1_1_3_0_0 + 0.00102272727272731*G0_1_1_3_0_1 + 0.00121753246753251*G0_1_1_3_0_2 - 0.00798701298701325*G0_1_1_3_0_3 - 0.000779220779220811*G0_1_1_3_0_4 - 0.00038961038961041*G0_1_1_3_0_5 + 0.00102272727272731*G0_1_1_3_1_0 - 0.0155844155844161*G0_1_1_3_1_1 - 0.00146103896103902*G0_1_1_3_1_2 + 0.012467532467533*G0_1_1_3_1_3 + 0.00214285714285722*G0_1_1_3_1_4 - 0.00662337662337686*G0_1_1_3_1_5 + 0.00121753246753251*G0_1_1_3_2_0 - 0.00146103896103902*G0_1_1_3_2_1 + 0.00365259740259752*G0_1_1_3_2_2 - 0.0146103896103901*G0_1_1_3_2_3 - 0.00194805194805202*G0_1_1_3_2_4 - 0.00292207792207803*G0_1_1_3_2_5 - 0.00798701298701325*G0_1_1_3_3_0 + 0.0124675324675329*G0_1_1_3_3_1 - 0.0146103896103901*G0_1_1_3_3_2 + 0.130909090909096*G0_1_1_3_3_3 + 0.0116883116883121*G0_1_1_3_3_4 + 0.0218181818181826*G0_1_1_3_3_5 - 0.000779220779220811*G0_1_1_3_4_0 + 0.00214285714285722*G0_1_1_3_4_1 - 0.00194805194805202*G0_1_1_3_4_2 + 0.0116883116883121*G0_1_1_3_4_3 - 0.00623376623376641*G0_1_1_3_4_4 + 0.00155844155844164*G0_1_1_3_4_5 - 0.00038961038961041*G0_1_1_3_5_0 - 0.00662337662337686*G0_1_1_3_5_1 - 0.00292207792207803*G0_1_1_3_5_2 + 0.0218181818181826*G0_1_1_3_5_3 + 0.00155844155844164*G0_1_1_3_5_4 - 0.00701298701298723*G0_1_1_3_5_5 + 0.000243506493506497*G0_1_1_4_0_0 + 0.000487012987013006*G0_1_1_4_0_2 - 0.000779220779220812*G0_1_1_4_0_3 + 0.000974025974025991*G0_1_1_4_0_4 + 0.000779220779220793*G0_1_1_4_0_5 - 0.0020941558441559*G0_1_1_4_1_1 - 0.000243506493506502*G0_1_1_4_1_2 + 0.00214285714285722*G0_1_1_4_1_3 + 0.00389610389610402*G0_1_1_4_1_4 - 0.000389610389610397*G0_1_1_4_1_5 + 0.000487012987013006*G0_1_1_4_2_0 - 0.000243506493506502*G0_1_1_4_2_1 + 0.000730519480519491*G0_1_1_4_2_2 - 0.00194805194805202*G0_1_1_4_2_3 + 0.000974025974025999*G0_1_1_4_2_4 - 0.000779220779220811*G0_1_1_4_3_0 + 0.00214285714285722*G0_1_1_4_3_1 - 0.00194805194805202*G0_1_1_4_3_2 + 0.0116883116883121*G0_1_1_4_3_3 - 0.00623376623376641*G0_1_1_4_3_4 + 0.00155844155844164*G0_1_1_4_3_5 + 0.000974025974025991*G0_1_1_4_4_0 + 0.00389610389610402*G0_1_1_4_4_1 + 0.000974025974025999*G0_1_1_4_4_2 - 0.00623376623376641*G0_1_1_4_4_3 - 0.0303896103896113*G0_1_1_4_4_4 - 0.00779220779220803*G0_1_1_4_4_5 + 0.000779220779220793*G0_1_1_4_5_0 - 0.000389610389610397*G0_1_1_4_5_1 + 0.00155844155844164*G0_1_1_4_5_3 - 0.00779220779220803*G0_1_1_4_5_4 - 0.00701298701298722*G0_1_1_4_5_5 + 0.00808441558441586*G0_1_1_5_0_1 - 0.000292207792207799*G0_1_1_5_0_2 - 0.000389610389610409*G0_1_1_5_0_3 + 0.000779220779220793*G0_1_1_5_0_4 + 0.0175324675324681*G0_1_1_5_0_5 + 0.00808441558441586*G0_1_1_5_1_0 - 0.0457792207792224*G0_1_1_5_1_1 + 0.00228896103896112*G0_1_1_5_1_2 - 0.00662337662337686*G0_1_1_5_1_3 - 0.000389610389610397*G0_1_1_5_1_4 - 0.0459740259740276*G0_1_1_5_1_5 - 0.000292207792207799*G0_1_1_5_2_0 + 0.00228896103896112*G0_1_1_5_2_1 + 0.000243506493506504*G0_1_1_5_2_2 - 0.00292207792207803*G0_1_1_5_2_3 + 0.00389610389610403*G0_1_1_5_2_5 - 0.00038961038961041*G0_1_1_5_3_0 - 0.00662337662337686*G0_1_1_5_3_1 - 0.00292207792207803*G0_1_1_5_3_2 + 0.0218181818181826*G0_1_1_5_3_3 + 0.00155844155844164*G0_1_1_5_3_4 - 0.00701298701298723*G0_1_1_5_3_5 + 0.000779220779220793*G0_1_1_5_4_0 - 0.000389610389610397*G0_1_1_5_4_1 + 0.00155844155844164*G0_1_1_5_4_3 - 0.00779220779220803*G0_1_1_5_4_4 - 0.00701298701298722*G0_1_1_5_4_5 + 0.0175324675324681*G0_1_1_5_5_0 - 0.0459740259740276*G0_1_1_5_5_1 + 0.00389610389610403*G0_1_1_5_5_2 - 0.00701298701298723*G0_1_1_5_5_3 - 0.00701298701298722*G0_1_1_5_5_4 - 0.128571428571433*G0_1_1_5_5_5; + A[95] = A[59] + 0.0482142857142875*G0_0_1_0_0_0 - 0.00431006493506509*G0_0_1_0_0_1 - 0.00650162337662361*G0_0_1_0_0_2 + 0.00204545454545461*G0_0_1_0_0_3 + 0.0204545454545462*G0_0_1_0_0_4 + 0.0204545454545462*G0_0_1_0_0_5 - 0.00431006493506509*G0_0_1_0_1_0 + 0.00102272727272731*G0_0_1_0_1_1 + 0.000876623376623408*G0_0_1_0_1_2 - 0.00146103896103901*G0_0_1_0_1_3 - 0.00555194805194824*G0_0_1_0_1_4 - 0.00584415584415606*G0_0_1_0_1_5 - 0.00650162337662361*G0_0_1_0_2_0 + 0.000876623376623408*G0_0_1_0_2_1 + 0.0010227272727273*G0_0_1_0_2_2 - 0.00262987012987023*G0_0_1_0_2_5 + 0.00204545454545461*G0_0_1_0_3_0 - 0.00146103896103901*G0_0_1_0_3_1 - 0.0023376623376624*G0_0_1_0_3_3 + 0.00701298701298725*G0_0_1_0_3_4 + 0.00116883116883122*G0_0_1_0_3_5 + 0.0204545454545462*G0_0_1_0_4_0 - 0.00555194805194824*G0_0_1_0_4_1 + 0.00701298701298725*G0_0_1_0_4_3 + 0.0420779220779234*G0_0_1_0_4_4 + 0.0163636363636369*G0_0_1_0_4_5 + 0.0204545454545462*G0_0_1_0_5_0 - 0.00584415584415606*G0_0_1_0_5_1 - 0.00262987012987023*G0_0_1_0_5_2 + 0.00116883116883122*G0_0_1_0_5_3 + 0.0163636363636369*G0_0_1_0_5_4 + 0.0187012987012994*G0_0_1_0_5_5 - 0.00431006493506509*G0_0_1_1_0_0 + 0.00102272727272731*G0_0_1_1_0_1 + 0.000876623376623408*G0_0_1_1_0_2 - 0.00146103896103901*G0_0_1_1_0_3 - 0.00555194805194824*G0_0_1_1_0_4 - 0.00584415584415606*G0_0_1_1_0_5 + 0.00102272727272731*G0_0_1_1_1_0 + 0.000657467532467563*G0_0_1_1_1_1 - 0.000365259740259753*G0_0_1_1_1_2 + 0.00116883116883121*G0_0_1_1_1_3 - 0.000876623376623404*G0_0_1_1_1_4 + 0.00321428571428584*G0_0_1_1_1_5 + 0.000876623376623408*G0_0_1_1_2_0 - 0.000365259740259753*G0_0_1_1_2_1 - 0.00116883116883121*G0_0_1_1_2_2 - 0.00116883116883122*G0_0_1_1_2_3 + 0.00116883116883121*G0_0_1_1_2_4 + 0.00146103896103901*G0_0_1_1_2_5 - 0.00146103896103901*G0_0_1_1_3_0 + 0.00116883116883121*G0_0_1_1_3_1 - 0.00116883116883122*G0_0_1_1_3_2 + 0.00467532467532483*G0_0_1_1_3_4 - 0.00555194805194824*G0_0_1_1_4_0 - 0.000876623376623403*G0_0_1_1_4_1 + 0.00116883116883121*G0_0_1_1_4_2 + 0.00467532467532483*G0_0_1_1_4_3 + 0.0210389610389617*G0_0_1_1_4_4 - 0.00116883116883121*G0_0_1_1_4_5 - 0.00584415584415606*G0_0_1_1_5_0 + 0.00321428571428584*G0_0_1_1_5_1 + 0.00146103896103901*G0_0_1_1_5_2 - 0.00116883116883121*G0_0_1_1_5_4 - 0.0105194805194809*G0_0_1_1_5_5 - 0.00650162337662361*G0_0_1_2_0_0 + 0.000876623376623408*G0_0_1_2_0_1 + 0.0010227272727273*G0_0_1_2_0_2 - 0.00262987012987023*G0_0_1_2_0_5 + 0.000876623376623408*G0_0_1_2_1_0 - 0.000365259740259753*G0_0_1_2_1_1 - 0.00116883116883121*G0_0_1_2_1_2 - 0.00116883116883122*G0_0_1_2_1_3 + 0.00116883116883121*G0_0_1_2_1_4 + 0.00146103896103901*G0_0_1_2_1_5 + 0.0010227272727273*G0_0_1_2_2_0 - 0.00116883116883122*G0_0_1_2_2_1 + 0.0109577922077927*G0_0_1_2_2_2 + 0.00584415584415607*G0_0_1_2_2_3 - 0.00292207792207799*G0_0_1_2_2_4 + 0.00233766233766242*G0_0_1_2_2_5 - 0.00116883116883122*G0_0_1_2_3_1 + 0.00584415584415606*G0_0_1_2_3_2 + 0.00233766233766243*G0_0_1_2_3_3 - 0.00233766233766241*G0_0_1_2_3_4 - 0.00467532467532483*G0_0_1_2_3_5 + 0.00116883116883121*G0_0_1_2_4_1 - 0.00292207792207798*G0_0_1_2_4_2 - 0.00233766233766241*G0_0_1_2_4_3 - 0.0210389610389617*G0_0_1_2_4_4 - 0.00701298701298726*G0_0_1_2_4_5 - 0.00262987012987023*G0_0_1_2_5_0 + 0.00146103896103901*G0_0_1_2_5_1 + 0.00233766233766242*G0_0_1_2_5_2 - 0.00467532467532483*G0_0_1_2_5_3 - 0.00701298701298726*G0_0_1_2_5_4 - 0.0151948051948057*G0_0_1_2_5_5 + 0.00204545454545461*G0_0_1_3_0_0 - 0.00146103896103901*G0_0_1_3_0_1 - 0.00233766233766241*G0_0_1_3_0_3 + 0.00701298701298725*G0_0_1_3_0_4 + 0.00116883116883122*G0_0_1_3_0_5 - 0.00146103896103901*G0_0_1_3_1_0 + 0.00116883116883121*G0_0_1_3_1_1 - 0.00116883116883121*G0_0_1_3_1_2 + 0.00467532467532482*G0_0_1_3_1_4 - 0.00116883116883121*G0_0_1_3_2_1 + 0.00584415584415606*G0_0_1_3_2_2 + 0.00233766233766242*G0_0_1_3_2_3 - 0.00233766233766241*G0_0_1_3_2_4 - 0.00467532467532483*G0_0_1_3_2_5 - 0.00233766233766241*G0_0_1_3_3_0 + 0.00233766233766243*G0_0_1_3_3_2 + 0.0420779220779236*G0_0_1_3_3_3 - 0.00467532467532483*G0_0_1_3_3_4 + 0.0140259740259745*G0_0_1_3_3_5 + 0.00701298701298725*G0_0_1_3_4_0 + 0.00467532467532483*G0_0_1_3_4_1 - 0.00233766233766241*G0_0_1_3_4_2 - 0.00467532467532483*G0_0_1_3_4_3 - 0.0561038961038979*G0_0_1_3_4_4 + 0.00116883116883122*G0_0_1_3_5_0 - 0.00467532467532483*G0_0_1_3_5_2 + 0.0140259740259745*G0_0_1_3_5_3 + 0.028051948051949*G0_0_1_3_5_5 + 0.0204545454545462*G0_0_1_4_0_0 - 0.00555194805194824*G0_0_1_4_0_1 + 0.00701298701298724*G0_0_1_4_0_3 + 0.0420779220779234*G0_0_1_4_0_4 + 0.0163636363636369*G0_0_1_4_0_5 - 0.00555194805194824*G0_0_1_4_1_0 - 0.000876623376623403*G0_0_1_4_1_1 + 0.00116883116883121*G0_0_1_4_1_2 + 0.00467532467532483*G0_0_1_4_1_3 + 0.0210389610389617*G0_0_1_4_1_4 - 0.00116883116883121*G0_0_1_4_1_5 + 0.00116883116883121*G0_0_1_4_2_1 - 0.00292207792207799*G0_0_1_4_2_2 - 0.00233766233766241*G0_0_1_4_2_3 - 0.0210389610389617*G0_0_1_4_2_4 - 0.00701298701298726*G0_0_1_4_2_5 + 0.00701298701298724*G0_0_1_4_3_0 + 0.00467532467532483*G0_0_1_4_3_1 - 0.00233766233766241*G0_0_1_4_3_2 - 0.00467532467532484*G0_0_1_4_3_3 - 0.0561038961038979*G0_0_1_4_3_4 + 0.0420779220779234*G0_0_1_4_4_0 + 0.0210389610389617*G0_0_1_4_4_1 - 0.0210389610389617*G0_0_1_4_4_2 - 0.0561038961038979*G0_0_1_4_4_3 - 0.420779220779234*G0_0_1_4_4_4 - 0.0280519480519489*G0_0_1_4_4_5 + 0.0163636363636369*G0_0_1_4_5_0 - 0.00116883116883121*G0_0_1_4_5_1 - 0.00701298701298726*G0_0_1_4_5_2 - 0.0280519480519489*G0_0_1_4_5_4 + 0.0327272727272739*G0_0_1_4_5_5 + 0.0204545454545462*G0_0_1_5_0_0 - 0.00584415584415606*G0_0_1_5_0_1 - 0.00262987012987023*G0_0_1_5_0_2 + 0.00116883116883122*G0_0_1_5_0_3 + 0.0163636363636369*G0_0_1_5_0_4 + 0.0187012987012994*G0_0_1_5_0_5 - 0.00584415584415606*G0_0_1_5_1_0 + 0.00321428571428584*G0_0_1_5_1_1 + 0.00146103896103901*G0_0_1_5_1_2 - 0.00116883116883121*G0_0_1_5_1_4 - 0.0105194805194809*G0_0_1_5_1_5 - 0.00262987012987023*G0_0_1_5_2_0 + 0.00146103896103901*G0_0_1_5_2_1 + 0.00233766233766242*G0_0_1_5_2_2 - 0.00467532467532483*G0_0_1_5_2_3 - 0.00701298701298726*G0_0_1_5_2_4 - 0.0151948051948057*G0_0_1_5_2_5 + 0.00116883116883122*G0_0_1_5_3_0 - 0.00467532467532483*G0_0_1_5_3_2 + 0.0140259740259745*G0_0_1_5_3_3 + 0.028051948051949*G0_0_1_5_3_5 + 0.0163636363636369*G0_0_1_5_4_0 - 0.00116883116883121*G0_0_1_5_4_1 - 0.00701298701298726*G0_0_1_5_4_2 - 0.0280519480519489*G0_0_1_5_4_4 + 0.0327272727272739*G0_0_1_5_4_5 + 0.0187012987012994*G0_0_1_5_5_0 - 0.0105194805194809*G0_0_1_5_5_1 - 0.0151948051948057*G0_0_1_5_5_2 + 0.028051948051949*G0_0_1_5_5_3 + 0.0327272727272739*G0_0_1_5_5_4 + 0.126233766233771*G0_0_1_5_5_5 - 0.0482142857142875*G0_1_0_0_0_0 + 0.00431006493506509*G0_1_0_0_0_1 + 0.00650162337662361*G0_1_0_0_0_2 - 0.00204545454545461*G0_1_0_0_0_3 - 0.0204545454545462*G0_1_0_0_0_4 - 0.0204545454545462*G0_1_0_0_0_5 + 0.00431006493506509*G0_1_0_0_1_0 - 0.00102272727272731*G0_1_0_0_1_1 - 0.000876623376623408*G0_1_0_0_1_2 + 0.00146103896103901*G0_1_0_0_1_3 + 0.00555194805194824*G0_1_0_0_1_4 + 0.00584415584415606*G0_1_0_0_1_5 + 0.00650162337662361*G0_1_0_0_2_0 - 0.000876623376623408*G0_1_0_0_2_1 - 0.0010227272727273*G0_1_0_0_2_2 + 0.00262987012987023*G0_1_0_0_2_5 - 0.00204545454545461*G0_1_0_0_3_0 + 0.00146103896103901*G0_1_0_0_3_1 + 0.0023376623376624*G0_1_0_0_3_3 - 0.00701298701298725*G0_1_0_0_3_4 - 0.00116883116883122*G0_1_0_0_3_5 - 0.0204545454545462*G0_1_0_0_4_0 + 0.00555194805194824*G0_1_0_0_4_1 - 0.00701298701298725*G0_1_0_0_4_3 - 0.0420779220779234*G0_1_0_0_4_4 - 0.016363636363637*G0_1_0_0_4_5 - 0.0204545454545462*G0_1_0_0_5_0 + 0.00584415584415606*G0_1_0_0_5_1 + 0.00262987012987023*G0_1_0_0_5_2 - 0.00116883116883122*G0_1_0_0_5_3 - 0.016363636363637*G0_1_0_0_5_4 - 0.0187012987012994*G0_1_0_0_5_5 + 0.00431006493506509*G0_1_0_1_0_0 - 0.00102272727272731*G0_1_0_1_0_1 - 0.000876623376623408*G0_1_0_1_0_2 + 0.00146103896103901*G0_1_0_1_0_3 + 0.00555194805194824*G0_1_0_1_0_4 + 0.00584415584415606*G0_1_0_1_0_5 - 0.00102272727272731*G0_1_0_1_1_0 - 0.000657467532467563*G0_1_0_1_1_1 + 0.000365259740259753*G0_1_0_1_1_2 - 0.00116883116883122*G0_1_0_1_1_3 + 0.000876623376623403*G0_1_0_1_1_4 - 0.00321428571428584*G0_1_0_1_1_5 - 0.000876623376623408*G0_1_0_1_2_0 + 0.000365259740259753*G0_1_0_1_2_1 + 0.00116883116883121*G0_1_0_1_2_2 + 0.00116883116883122*G0_1_0_1_2_3 - 0.00116883116883121*G0_1_0_1_2_4 - 0.00146103896103901*G0_1_0_1_2_5 + 0.00146103896103901*G0_1_0_1_3_0 - 0.00116883116883121*G0_1_0_1_3_1 + 0.00116883116883122*G0_1_0_1_3_2 - 0.00467532467532483*G0_1_0_1_3_4 + 0.00555194805194824*G0_1_0_1_4_0 + 0.000876623376623403*G0_1_0_1_4_1 - 0.00116883116883121*G0_1_0_1_4_2 - 0.00467532467532483*G0_1_0_1_4_3 - 0.0210389610389617*G0_1_0_1_4_4 + 0.00116883116883121*G0_1_0_1_4_5 + 0.00584415584415606*G0_1_0_1_5_0 - 0.00321428571428584*G0_1_0_1_5_1 - 0.00146103896103901*G0_1_0_1_5_2 + 0.00116883116883121*G0_1_0_1_5_4 + 0.0105194805194809*G0_1_0_1_5_5 + 0.00650162337662361*G0_1_0_2_0_0 - 0.000876623376623409*G0_1_0_2_0_1 - 0.0010227272727273*G0_1_0_2_0_2 + 0.00262987012987023*G0_1_0_2_0_5 - 0.000876623376623408*G0_1_0_2_1_0 + 0.000365259740259753*G0_1_0_2_1_1 + 0.00116883116883121*G0_1_0_2_1_2 + 0.00116883116883121*G0_1_0_2_1_3 - 0.00116883116883121*G0_1_0_2_1_4 - 0.00146103896103901*G0_1_0_2_1_5 - 0.0010227272727273*G0_1_0_2_2_0 + 0.00116883116883121*G0_1_0_2_2_1 - 0.0109577922077927*G0_1_0_2_2_2 - 0.00584415584415606*G0_1_0_2_2_3 + 0.00292207792207799*G0_1_0_2_2_4 - 0.00233766233766242*G0_1_0_2_2_5 + 0.00116883116883121*G0_1_0_2_3_1 - 0.00584415584415606*G0_1_0_2_3_2 - 0.00233766233766243*G0_1_0_2_3_3 + 0.00233766233766241*G0_1_0_2_3_4 + 0.00467532467532483*G0_1_0_2_3_5 - 0.00116883116883121*G0_1_0_2_4_1 + 0.00292207792207799*G0_1_0_2_4_2 + 0.00233766233766241*G0_1_0_2_4_3 + 0.0210389610389617*G0_1_0_2_4_4 + 0.00701298701298726*G0_1_0_2_4_5 + 0.00262987012987023*G0_1_0_2_5_0 - 0.00146103896103901*G0_1_0_2_5_1 - 0.00233766233766242*G0_1_0_2_5_2 + 0.00467532467532483*G0_1_0_2_5_3 + 0.00701298701298726*G0_1_0_2_5_4 + 0.0151948051948057*G0_1_0_2_5_5 - 0.00204545454545461*G0_1_0_3_0_0 + 0.00146103896103901*G0_1_0_3_0_1 + 0.00233766233766241*G0_1_0_3_0_3 - 0.00701298701298725*G0_1_0_3_0_4 - 0.00116883116883122*G0_1_0_3_0_5 + 0.00146103896103901*G0_1_0_3_1_0 - 0.00116883116883121*G0_1_0_3_1_1 + 0.00116883116883121*G0_1_0_3_1_2 - 0.00467532467532483*G0_1_0_3_1_4 + 0.00116883116883121*G0_1_0_3_2_1 - 0.00584415584415606*G0_1_0_3_2_2 - 0.00233766233766242*G0_1_0_3_2_3 + 0.00233766233766241*G0_1_0_3_2_4 + 0.00467532467532483*G0_1_0_3_2_5 + 0.0023376623376624*G0_1_0_3_3_0 - 0.00233766233766243*G0_1_0_3_3_2 - 0.0420779220779236*G0_1_0_3_3_3 + 0.00467532467532484*G0_1_0_3_3_4 - 0.0140259740259745*G0_1_0_3_3_5 - 0.00701298701298725*G0_1_0_3_4_0 - 0.00467532467532483*G0_1_0_3_4_1 + 0.00233766233766241*G0_1_0_3_4_2 + 0.00467532467532484*G0_1_0_3_4_3 + 0.0561038961038979*G0_1_0_3_4_4 - 0.00116883116883122*G0_1_0_3_5_0 + 0.00467532467532483*G0_1_0_3_5_2 - 0.0140259740259745*G0_1_0_3_5_3 - 0.028051948051949*G0_1_0_3_5_5 - 0.0204545454545462*G0_1_0_4_0_0 + 0.00555194805194824*G0_1_0_4_0_1 - 0.00701298701298724*G0_1_0_4_0_3 - 0.0420779220779234*G0_1_0_4_0_4 - 0.016363636363637*G0_1_0_4_0_5 + 0.00555194805194824*G0_1_0_4_1_0 + 0.000876623376623403*G0_1_0_4_1_1 - 0.00116883116883121*G0_1_0_4_1_2 - 0.00467532467532483*G0_1_0_4_1_3 - 0.0210389610389617*G0_1_0_4_1_4 + 0.00116883116883121*G0_1_0_4_1_5 - 0.00116883116883121*G0_1_0_4_2_1 + 0.00292207792207799*G0_1_0_4_2_2 + 0.00233766233766241*G0_1_0_4_2_3 + 0.0210389610389617*G0_1_0_4_2_4 + 0.00701298701298726*G0_1_0_4_2_5 - 0.00701298701298725*G0_1_0_4_3_0 - 0.00467532467532483*G0_1_0_4_3_1 + 0.00233766233766241*G0_1_0_4_3_2 + 0.00467532467532484*G0_1_0_4_3_3 + 0.0561038961038979*G0_1_0_4_3_4 - 0.0420779220779234*G0_1_0_4_4_0 - 0.0210389610389617*G0_1_0_4_4_1 + 0.0210389610389617*G0_1_0_4_4_2 + 0.0561038961038979*G0_1_0_4_4_3 + 0.420779220779234*G0_1_0_4_4_4 + 0.0280519480519489*G0_1_0_4_4_5 - 0.016363636363637*G0_1_0_4_5_0 + 0.00116883116883121*G0_1_0_4_5_1 + 0.00701298701298726*G0_1_0_4_5_2 + 0.0280519480519489*G0_1_0_4_5_4 - 0.0327272727272739*G0_1_0_4_5_5 - 0.0204545454545462*G0_1_0_5_0_0 + 0.00584415584415606*G0_1_0_5_0_1 + 0.00262987012987023*G0_1_0_5_0_2 - 0.00116883116883122*G0_1_0_5_0_3 - 0.0163636363636369*G0_1_0_5_0_4 - 0.0187012987012994*G0_1_0_5_0_5 + 0.00584415584415606*G0_1_0_5_1_0 - 0.00321428571428584*G0_1_0_5_1_1 - 0.00146103896103901*G0_1_0_5_1_2 + 0.00116883116883121*G0_1_0_5_1_4 + 0.0105194805194809*G0_1_0_5_1_5 + 0.00262987012987023*G0_1_0_5_2_0 - 0.00146103896103901*G0_1_0_5_2_1 - 0.00233766233766242*G0_1_0_5_2_2 + 0.00467532467532483*G0_1_0_5_2_3 + 0.00701298701298726*G0_1_0_5_2_4 + 0.0151948051948057*G0_1_0_5_2_5 - 0.00116883116883122*G0_1_0_5_3_0 + 0.00467532467532483*G0_1_0_5_3_2 - 0.0140259740259745*G0_1_0_5_3_3 - 0.028051948051949*G0_1_0_5_3_5 - 0.0163636363636369*G0_1_0_5_4_0 + 0.00116883116883121*G0_1_0_5_4_1 + 0.00701298701298726*G0_1_0_5_4_2 + 0.0280519480519489*G0_1_0_5_4_4 - 0.0327272727272739*G0_1_0_5_4_5 - 0.0187012987012994*G0_1_0_5_5_0 + 0.0105194805194809*G0_1_0_5_5_1 + 0.0151948051948057*G0_1_0_5_5_2 - 0.028051948051949*G0_1_0_5_5_3 - 0.0327272727272739*G0_1_0_5_5_4 - 0.126233766233771*G0_1_0_5_5_5; + A[52] = -A[32] - 0.00172889610389617*G0_0_1_0_0_0 + 0.000186688311688318*G0_0_1_0_0_1 - 0.000616883116883137*G0_0_1_0_0_2 - 0.000454545454545468*G0_0_1_0_0_3 - 0.000194805194805198*G0_0_1_0_0_4 - 0.000941558441558476*G0_0_1_0_0_5 + 0.000186688311688318*G0_0_1_0_1_0 - 0.000186688311688316*G0_0_1_0_1_1 + 0.000454545454545468*G0_0_1_0_1_3 - 0.00045454545454547*G0_0_1_0_1_4 - 0.000616883116883137*G0_0_1_0_2_0 + 0.00219155844155851*G0_0_1_0_2_2 - 0.000909090909090935*G0_0_1_0_2_3 + 0.00220779220779228*G0_0_1_0_2_4 - 0.000194805194805201*G0_0_1_0_2_5 - 0.000454545454545468*G0_0_1_0_3_0 + 0.000454545454545468*G0_0_1_0_3_1 - 0.000909090909090935*G0_0_1_0_3_2 + 0.00207792207792215*G0_0_1_0_3_3 + 0.00181818181818188*G0_0_1_0_3_4 + 0.00129870129870134*G0_0_1_0_3_5 - 0.000194805194805198*G0_0_1_0_4_0 - 0.00045454545454547*G0_0_1_0_4_1 + 0.00220779220779228*G0_0_1_0_4_2 + 0.00181818181818188*G0_0_1_0_4_3 + 0.0124675324675329*G0_0_1_0_4_4 + 0.00129870129870134*G0_0_1_0_4_5 - 0.000941558441558476*G0_0_1_0_5_0 - 0.000194805194805201*G0_0_1_0_5_2 + 0.00129870129870134*G0_0_1_0_5_3 + 0.00129870129870134*G0_0_1_0_5_4 - 0.000389610389610403*G0_0_1_0_5_5 + 0.000186688311688318*G0_0_1_1_0_0 - 0.000186688311688316*G0_0_1_1_0_1 + 0.000454545454545468*G0_0_1_1_0_3 - 0.00045454545454547*G0_0_1_1_0_4 - 0.000186688311688316*G0_0_1_1_1_0 + 0.00172889610389614*G0_0_1_1_1_1 + 0.000616883116883139*G0_0_1_1_1_2 + 0.000194805194805194*G0_0_1_1_1_3 + 0.00045454545454547*G0_0_1_1_1_4 + 0.000941558441558469*G0_0_1_1_1_5 + 0.000616883116883139*G0_0_1_1_2_1 - 0.00219155844155852*G0_0_1_1_2_2 - 0.00220779220779228*G0_0_1_1_2_3 + 0.00090909090909094*G0_0_1_1_2_4 + 0.000194805194805202*G0_0_1_1_2_5 + 0.000454545454545468*G0_0_1_1_3_0 + 0.000194805194805194*G0_0_1_1_3_1 - 0.00220779220779228*G0_0_1_1_3_2 - 0.0124675324675329*G0_0_1_1_3_3 - 0.00181818181818188*G0_0_1_1_3_4 - 0.00129870129870135*G0_0_1_1_3_5 - 0.00045454545454547*G0_0_1_1_4_0 + 0.000454545454545469*G0_0_1_1_4_1 + 0.000909090909090939*G0_0_1_1_4_2 - 0.00181818181818188*G0_0_1_1_4_3 - 0.00207792207792215*G0_0_1_1_4_4 - 0.00129870129870135*G0_0_1_1_4_5 + 0.000941558441558469*G0_0_1_1_5_1 + 0.000194805194805202*G0_0_1_1_5_2 - 0.00129870129870135*G0_0_1_1_5_3 - 0.00129870129870135*G0_0_1_1_5_4 + 0.000389610389610396*G0_0_1_1_5_5 - 0.000616883116883137*G0_0_1_2_0_0 + 0.00219155844155851*G0_0_1_2_0_2 - 0.000909090909090935*G0_0_1_2_0_3 + 0.00220779220779228*G0_0_1_2_0_4 - 0.000194805194805201*G0_0_1_2_0_5 + 0.000616883116883139*G0_0_1_2_1_1 - 0.00219155844155852*G0_0_1_2_1_2 - 0.00220779220779228*G0_0_1_2_1_3 + 0.000909090909090939*G0_0_1_2_1_4 + 0.000194805194805202*G0_0_1_2_1_5 + 0.00219155844155851*G0_0_1_2_2_0 - 0.00219155844155852*G0_0_1_2_2_1 + 0.0100649350649354*G0_0_1_2_2_3 - 0.0100649350649354*G0_0_1_2_2_4 - 0.000909090909090935*G0_0_1_2_3_0 - 0.00220779220779228*G0_0_1_2_3_1 + 0.0100649350649354*G0_0_1_2_3_2 + 0.0233766233766242*G0_0_1_2_3_3 + 0.00181818181818188*G0_0_1_2_3_5 + 0.00220779220779228*G0_0_1_2_4_0 + 0.000909090909090939*G0_0_1_2_4_1 - 0.0100649350649354*G0_0_1_2_4_2 - 0.0233766233766241*G0_0_1_2_4_4 - 0.00181818181818188*G0_0_1_2_4_5 - 0.000194805194805201*G0_0_1_2_5_0 + 0.000194805194805202*G0_0_1_2_5_1 + 0.00181818181818188*G0_0_1_2_5_3 - 0.00181818181818188*G0_0_1_2_5_4 - 0.000454545454545468*G0_0_1_3_0_0 + 0.000454545454545468*G0_0_1_3_0_1 - 0.000909090909090935*G0_0_1_3_0_2 + 0.00207792207792215*G0_0_1_3_0_3 + 0.00181818181818188*G0_0_1_3_0_4 + 0.00129870129870134*G0_0_1_3_0_5 + 0.000454545454545468*G0_0_1_3_1_0 + 0.000194805194805194*G0_0_1_3_1_1 - 0.00220779220779228*G0_0_1_3_1_2 - 0.0124675324675329*G0_0_1_3_1_3 - 0.00181818181818188*G0_0_1_3_1_4 - 0.00129870129870135*G0_0_1_3_1_5 - 0.000909090909090935*G0_0_1_3_2_0 - 0.00220779220779228*G0_0_1_3_2_1 + 0.0100649350649354*G0_0_1_3_2_2 + 0.0233766233766242*G0_0_1_3_2_3 + 0.00181818181818188*G0_0_1_3_2_5 + 0.00207792207792215*G0_0_1_3_3_0 - 0.0124675324675329*G0_0_1_3_3_1 + 0.0233766233766242*G0_0_1_3_3_2 - 0.00467532467532479*G0_0_1_3_3_3 - 0.000519480519480532*G0_0_1_3_3_4 - 0.00779220779220805*G0_0_1_3_3_5 + 0.00181818181818188*G0_0_1_3_4_0 - 0.00181818181818188*G0_0_1_3_4_1 - 0.000519480519480531*G0_0_1_3_4_3 + 0.000519480519480539*G0_0_1_3_4_4 + 0.00129870129870134*G0_0_1_3_5_0 - 0.00129870129870135*G0_0_1_3_5_1 + 0.00181818181818188*G0_0_1_3_5_2 - 0.00779220779220805*G0_0_1_3_5_3 - 0.00259740259740269*G0_0_1_3_5_5 - 0.000194805194805198*G0_0_1_4_0_0 - 0.00045454545454547*G0_0_1_4_0_1 + 0.00220779220779228*G0_0_1_4_0_2 + 0.00181818181818188*G0_0_1_4_0_3 + 0.0124675324675329*G0_0_1_4_0_4 + 0.00129870129870134*G0_0_1_4_0_5 - 0.00045454545454547*G0_0_1_4_1_0 + 0.00045454545454547*G0_0_1_4_1_1 + 0.000909090909090939*G0_0_1_4_1_2 - 0.00181818181818188*G0_0_1_4_1_3 - 0.00207792207792215*G0_0_1_4_1_4 - 0.00129870129870135*G0_0_1_4_1_5 + 0.00220779220779228*G0_0_1_4_2_0 + 0.000909090909090939*G0_0_1_4_2_1 - 0.0100649350649354*G0_0_1_4_2_2 - 0.0233766233766241*G0_0_1_4_2_4 - 0.00181818181818188*G0_0_1_4_2_5 + 0.00181818181818188*G0_0_1_4_3_0 - 0.00181818181818188*G0_0_1_4_3_1 - 0.000519480519480531*G0_0_1_4_3_3 + 0.000519480519480539*G0_0_1_4_3_4 + 0.0124675324675329*G0_0_1_4_4_0 - 0.00207792207792215*G0_0_1_4_4_1 - 0.0233766233766241*G0_0_1_4_4_2 + 0.000519480519480538*G0_0_1_4_4_3 + 0.00467532467532487*G0_0_1_4_4_4 + 0.00779220779220806*G0_0_1_4_4_5 + 0.00129870129870134*G0_0_1_4_5_0 - 0.00129870129870135*G0_0_1_4_5_1 - 0.00181818181818188*G0_0_1_4_5_2 + 0.00779220779220806*G0_0_1_4_5_4 + 0.00259740259740269*G0_0_1_4_5_5 - 0.000941558441558476*G0_0_1_5_0_0 - 0.000194805194805201*G0_0_1_5_0_2 + 0.00129870129870134*G0_0_1_5_0_3 + 0.00129870129870134*G0_0_1_5_0_4 - 0.000389610389610403*G0_0_1_5_0_5 + 0.000941558441558469*G0_0_1_5_1_1 + 0.000194805194805202*G0_0_1_5_1_2 - 0.00129870129870135*G0_0_1_5_1_3 - 0.00129870129870135*G0_0_1_5_1_4 + 0.000389610389610396*G0_0_1_5_1_5 - 0.000194805194805201*G0_0_1_5_2_0 + 0.000194805194805202*G0_0_1_5_2_1 + 0.00181818181818188*G0_0_1_5_2_3 - 0.00181818181818188*G0_0_1_5_2_4 + 0.00129870129870134*G0_0_1_5_3_0 - 0.00129870129870135*G0_0_1_5_3_1 + 0.00181818181818188*G0_0_1_5_3_2 - 0.00779220779220805*G0_0_1_5_3_3 - 0.00259740259740269*G0_0_1_5_3_5 + 0.00129870129870134*G0_0_1_5_4_0 - 0.00129870129870135*G0_0_1_5_4_1 - 0.00181818181818188*G0_0_1_5_4_2 + 0.00779220779220806*G0_0_1_5_4_4 + 0.00259740259740269*G0_0_1_5_4_5 - 0.000389610389610403*G0_0_1_5_5_0 + 0.000389610389610396*G0_0_1_5_5_1 - 0.00259740259740269*G0_0_1_5_5_3 + 0.00259740259740269*G0_0_1_5_5_4 + 0.0226379870129878*G0_1_1_0_0_0 - 0.00151515151515157*G0_1_1_0_0_1 - 0.000965909090909122*G0_1_1_0_0_2 + 0.000346320346320354*G0_1_1_0_0_3 + 0.00325757575757587*G0_1_1_0_0_4 + 0.00891774891774922*G0_1_1_0_0_5 - 0.00151515151515157*G0_1_1_0_1_0 - 0.00170183982683988*G0_1_1_0_1_1 + 0.000273268398268407*G0_1_1_0_1_2 - 0.000411255411255424*G0_1_1_0_1_4 - 0.00311688311688322*G0_1_1_0_1_5 - 0.000965909090909122*G0_1_1_0_2_0 + 0.000273268398268407*G0_1_1_0_2_1 - 0.00184523809523816*G0_1_1_0_2_2 - 0.000790043290043316*G0_1_1_0_2_3 + 0.000194805194805194*G0_1_1_0_2_4 - 0.00025974025974027*G0_1_1_0_2_5 + 0.000346320346320354*G0_1_1_0_3_0 - 0.000790043290043316*G0_1_1_0_3_2 + 0.000129870129870134*G0_1_1_0_3_4 - 0.000173160173160177*G0_1_1_0_3_5 + 0.00325757575757587*G0_1_1_0_4_0 - 0.000411255411255424*G0_1_1_0_4_1 + 0.000194805194805194*G0_1_1_0_4_2 + 0.000129870129870134*G0_1_1_0_4_3 + 0.00441558441558455*G0_1_1_0_4_4 + 0.00134199134199139*G0_1_1_0_4_5 + 0.00891774891774922*G0_1_1_0_5_0 - 0.00311688311688322*G0_1_1_0_5_1 - 0.00025974025974027*G0_1_1_0_5_2 - 0.000173160173160177*G0_1_1_0_5_3 + 0.00134199134199139*G0_1_1_0_5_4 + 0.0047186147186149*G0_1_1_0_5_5 - 0.00151515151515157*G0_1_1_1_0_0 - 0.00170183982683988*G0_1_1_1_0_1 + 0.000273268398268407*G0_1_1_1_0_2 - 0.000411255411255424*G0_1_1_1_0_4 - 0.00311688311688322*G0_1_1_1_0_5 - 0.00170183982683988*G0_1_1_1_1_0 + 0.0243668831168839*G0_1_1_1_1_1 - 0.000349025974025985*G0_1_1_1_1_2 + 0.00345238095238106*G0_1_1_1_1_3 + 0.000800865800865824*G0_1_1_1_1_4 + 0.00985930735930771*G0_1_1_1_1_5 + 0.000273268398268407*G0_1_1_1_2_0 - 0.000349025974025985*G0_1_1_1_2_1 - 0.00403679653679668*G0_1_1_1_2_2 - 0.00201298701298708*G0_1_1_1_2_3 + 0.00011904761904762*G0_1_1_1_2_4 + 0.00345238095238106*G0_1_1_1_3_1 - 0.00201298701298708*G0_1_1_1_3_2 - 0.00805194805194834*G0_1_1_1_3_3 - 0.00168831168831175*G0_1_1_1_3_4 - 0.000411255411255424*G0_1_1_1_4_0 + 0.000800865800865824*G0_1_1_1_4_1 + 0.000119047619047621*G0_1_1_1_4_2 - 0.00168831168831175*G0_1_1_1_4_3 - 0.00199134199134206*G0_1_1_1_4_4 - 0.00147186147186152*G0_1_1_1_4_5 - 0.00311688311688322*G0_1_1_1_5_0 + 0.00985930735930771*G0_1_1_1_5_1 - 0.00147186147186152*G0_1_1_1_5_4 + 0.00510822510822529*G0_1_1_1_5_5 - 0.000965909090909122*G0_1_1_2_0_0 + 0.000273268398268407*G0_1_1_2_0_1 - 0.00184523809523816*G0_1_1_2_0_2 - 0.000790043290043316*G0_1_1_2_0_3 + 0.000194805194805194*G0_1_1_2_0_4 - 0.00025974025974027*G0_1_1_2_0_5 + 0.000273268398268407*G0_1_1_2_1_0 - 0.000349025974025985*G0_1_1_2_1_1 - 0.00403679653679668*G0_1_1_2_1_2 - 0.00201298701298708*G0_1_1_2_1_3 + 0.00011904761904762*G0_1_1_2_1_4 - 0.00184523809523816*G0_1_1_2_2_0 - 0.00403679653679668*G0_1_1_2_2_1 + 0.0581168831168852*G0_1_1_2_2_2 + 0.0173701298701305*G0_1_1_2_2_3 + 0.0073051948051951*G0_1_1_2_2_4 + 0.000768398268398305*G0_1_1_2_2_5 - 0.000790043290043316*G0_1_1_2_3_0 - 0.00201298701298708*G0_1_1_2_3_1 + 0.0173701298701305*G0_1_1_2_3_2 + 0.0161904761904768*G0_1_1_2_3_3 + 0.0013419913419914*G0_1_1_2_3_4 + 0.000194805194805194*G0_1_1_2_4_0 + 0.00011904761904762*G0_1_1_2_4_1 + 0.0073051948051951*G0_1_1_2_4_2 + 0.0013419913419914*G0_1_1_2_4_3 - 0.00718614718614739*G0_1_1_2_4_4 - 0.00177489177489183*G0_1_1_2_4_5 - 0.00025974025974027*G0_1_1_2_5_0 + 0.000768398268398305*G0_1_1_2_5_2 - 0.00177489177489183*G0_1_1_2_5_4 - 0.00264069264069273*G0_1_1_2_5_5 + 0.000346320346320354*G0_1_1_3_0_0 - 0.000790043290043316*G0_1_1_3_0_2 + 0.000129870129870134*G0_1_1_3_0_4 - 0.000173160173160177*G0_1_1_3_0_5 + 0.00345238095238106*G0_1_1_3_1_1 - 0.00201298701298708*G0_1_1_3_1_2 - 0.00805194805194834*G0_1_1_3_1_3 - 0.00168831168831175*G0_1_1_3_1_4 - 0.000790043290043316*G0_1_1_3_2_0 - 0.00201298701298708*G0_1_1_3_2_1 + 0.0173701298701305*G0_1_1_3_2_2 + 0.0161904761904768*G0_1_1_3_2_3 + 0.0013419913419914*G0_1_1_3_2_4 - 0.00805194805194834*G0_1_1_3_3_1 + 0.0161904761904768*G0_1_1_3_3_2 + 0.000259740259740279*G0_1_1_3_3_3 + 0.00320346320346331*G0_1_1_3_3_4 - 0.000259740259740277*G0_1_1_3_3_5 + 0.000129870129870134*G0_1_1_3_4_0 - 0.00168831168831175*G0_1_1_3_4_1 + 0.0013419913419914*G0_1_1_3_4_2 + 0.00320346320346331*G0_1_1_3_4_3 + 0.00372294372294385*G0_1_1_3_4_4 + 0.00329004329004339*G0_1_1_3_4_5 - 0.000173160173160177*G0_1_1_3_5_0 - 0.000259740259740276*G0_1_1_3_5_3 + 0.00329004329004339*G0_1_1_3_5_4 + 0.00562770562770581*G0_1_1_3_5_5 + 0.00325757575757587*G0_1_1_4_0_0 - 0.000411255411255424*G0_1_1_4_0_1 + 0.000194805194805194*G0_1_1_4_0_2 + 0.000129870129870134*G0_1_1_4_0_3 + 0.00441558441558455*G0_1_1_4_0_4 + 0.00134199134199139*G0_1_1_4_0_5 - 0.000411255411255424*G0_1_1_4_1_0 + 0.000800865800865824*G0_1_1_4_1_1 + 0.000119047619047621*G0_1_1_4_1_2 - 0.00168831168831175*G0_1_1_4_1_3 - 0.00199134199134206*G0_1_1_4_1_4 - 0.00147186147186152*G0_1_1_4_1_5 + 0.000194805194805194*G0_1_1_4_2_0 + 0.00011904761904762*G0_1_1_4_2_1 + 0.0073051948051951*G0_1_1_4_2_2 + 0.0013419913419914*G0_1_1_4_2_3 - 0.00718614718614739*G0_1_1_4_2_4 - 0.00177489177489183*G0_1_1_4_2_5 + 0.000129870129870134*G0_1_1_4_3_0 - 0.00168831168831175*G0_1_1_4_3_1 + 0.0013419913419914*G0_1_1_4_3_2 + 0.00320346320346331*G0_1_1_4_3_3 + 0.00372294372294385*G0_1_1_4_3_4 + 0.00329004329004339*G0_1_1_4_3_5 + 0.00441558441558455*G0_1_1_4_4_0 - 0.00199134199134206*G0_1_1_4_4_1 - 0.00718614718614739*G0_1_1_4_4_2 + 0.00372294372294385*G0_1_1_4_4_3 + 0.00493506493506513*G0_1_1_4_4_4 + 0.00753246753246778*G0_1_1_4_4_5 + 0.00134199134199139*G0_1_1_4_5_0 - 0.00147186147186152*G0_1_1_4_5_1 - 0.00177489177489183*G0_1_1_4_5_2 + 0.00329004329004339*G0_1_1_4_5_3 + 0.00753246753246778*G0_1_1_4_5_4 + 0.00822510822510849*G0_1_1_4_5_5 + 0.00891774891774922*G0_1_1_5_0_0 - 0.00311688311688322*G0_1_1_5_0_1 - 0.00025974025974027*G0_1_1_5_0_2 - 0.000173160173160177*G0_1_1_5_0_3 + 0.00134199134199139*G0_1_1_5_0_4 + 0.0047186147186149*G0_1_1_5_0_5 - 0.00311688311688322*G0_1_1_5_1_0 + 0.00985930735930771*G0_1_1_5_1_1 - 0.00147186147186152*G0_1_1_5_1_4 + 0.00510822510822529*G0_1_1_5_1_5 - 0.00025974025974027*G0_1_1_5_2_0 + 0.000768398268398305*G0_1_1_5_2_2 - 0.00177489177489183*G0_1_1_5_2_4 - 0.00264069264069273*G0_1_1_5_2_5 - 0.000173160173160177*G0_1_1_5_3_0 - 0.000259740259740277*G0_1_1_5_3_3 + 0.00329004329004339*G0_1_1_5_3_4 + 0.00562770562770581*G0_1_1_5_3_5 + 0.00134199134199139*G0_1_1_5_4_0 - 0.00147186147186152*G0_1_1_5_4_1 - 0.00177489177489183*G0_1_1_5_4_2 + 0.00329004329004339*G0_1_1_5_4_3 + 0.00753246753246778*G0_1_1_5_4_4 + 0.00822510822510849*G0_1_1_5_4_5 + 0.0047186147186149*G0_1_1_5_5_0 + 0.00510822510822529*G0_1_1_5_5_1 - 0.00264069264069273*G0_1_1_5_5_2 + 0.00562770562770581*G0_1_1_5_5_3 + 0.00822510822510849*G0_1_1_5_5_4 + 0.053246753246755*G0_1_1_5_5_5; + } + + /// Tabulate the tensor for the contribution from a local cell + /// using the specified reference cell quadrature points/weights + virtual void tabulate_tensor(double* A, + const double * const * w, + const ufc::cell& c, + unsigned int num_quadrature_points, + const double * const * quadrature_points, + const double* quadrature_weights) const + { + throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation."); + } + +}; + +/// This class defines the interface for the assembly of the global +/// tensor corresponding to a form with r + n arguments, that is, a +/// mapping +/// +/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R +/// +/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r +/// global tensor A is defined by +/// +/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn), +/// +/// where each argument Vj represents the application to the +/// sequence of basis functions of Vj and w1, w2, ..., wn are given +/// fixed functions (coefficients). + +class laplacian_f3_p2_q3_tensor_form_0: public ufc::form +{ +public: + + /// Constructor + laplacian_f3_p2_q3_tensor_form_0() : ufc::form() + { + // Do nothing + } + + /// Destructor + virtual ~laplacian_f3_p2_q3_tensor_form_0() + { + // Do nothing + } + + /// Return a string identifying the form + virtual const char* signature() const + { + return "Form([Integral(Product(IndexSum(Product(Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 0), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(0),), {Index(0): 2})), MultiIndex((Index(1),), {Index(1): 2})), Indexed(ComponentTensor(SpatialDerivative(Argument(FiniteElement('Lagrange', Cell('triangle', Space(2)), 3, None), 1), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(2),), {Index(2): 2})), MultiIndex((Index(1),), {Index(1): 2}))), MultiIndex((Index(1),), {Index(1): 2})), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 2), Product(Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 0), Coefficient(FiniteElement('Lagrange', Cell('triangle', Space(2)), 2, None), 1)))), Measure('cell', 0, None))])"; + } + + /// Return the rank of the global tensor (r) + virtual unsigned int rank() const + { + return 2; + } + + /// Return the number of coefficients (n) + virtual unsigned int num_coefficients() const + { + return 3; + } + + /// Return the number of cell domains + virtual unsigned int num_cell_domains() const + { + return 1; + } + + /// Return the number of exterior facet domains + virtual unsigned int num_exterior_facet_domains() const + { + return 0; + } + + /// Return the number of interior facet domains + virtual unsigned int num_interior_facet_domains() const + { + return 0; + } + + /// Create a new finite element for argument function i + virtual ufc::finite_element* create_finite_element(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q3_tensor_finite_element_1(); + break; + } + case 1: + { + return new laplacian_f3_p2_q3_tensor_finite_element_1(); + break; + } + case 2: + { + return new laplacian_f3_p2_q3_tensor_finite_element_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q3_tensor_finite_element_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q3_tensor_finite_element_0(); + break; + } + } + + return 0; + } + + /// Create a new dofmap for argument function i + virtual ufc::dofmap* create_dofmap(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q3_tensor_dofmap_1(); + break; + } + case 1: + { + return new laplacian_f3_p2_q3_tensor_dofmap_1(); + break; + } + case 2: + { + return new laplacian_f3_p2_q3_tensor_dofmap_0(); + break; + } + case 3: + { + return new laplacian_f3_p2_q3_tensor_dofmap_0(); + break; + } + case 4: + { + return new laplacian_f3_p2_q3_tensor_dofmap_0(); + break; + } + } + + return 0; + } + + /// Create a new cell integral on sub domain i + virtual ufc::cell_integral* create_cell_integral(unsigned int i) const + { + switch (i) + { + case 0: + { + return new laplacian_f3_p2_q3_tensor_cell_integral_0_0(); + break; + } + } + + return 0; + } + + /// Create a new exterior facet integral on sub domain i + virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const + { + return 0; + } + + /// Create a new interior facet integral on sub domain i + virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const + { + return 0; + } + +}; + +#endif -- 2.47.3